-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathBIO720_VersionControl_reproducibleResearch.html
More file actions
776 lines (761 loc) · 232 KB
/
BIO720_VersionControl_reproducibleResearch.html
File metadata and controls
776 lines (761 loc) · 232 KB
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
<?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 />
<meta name="date" content="2024-09-03" />
<title>Reproducibel research, part I</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 { 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
{ background-color: #f8f8f8; }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ef2929; }
code span.an { color: #8f5902; font-weight: bold; font-style: italic; }
code span.at { color: #204a87; }
code span.bn { color: #0000cf; }
code span.cf { color: #204a87; font-weight: bold; }
code span.ch { color: #4e9a06; }
code span.cn { color: #8f5902; }
code span.co { color: #8f5902; font-style: italic; }
code span.cv { color: #8f5902; font-weight: bold; font-style: italic; }
code span.do { color: #8f5902; font-weight: bold; font-style: italic; }
code span.dt { color: #204a87; }
code span.dv { color: #0000cf; }
code span.er { color: #a40000; font-weight: bold; }
code span.ex { }
code span.fl { color: #0000cf; }
code span.fu { color: #204a87; font-weight: bold; }
code span.im { }
code span.in { color: #8f5902; font-weight: bold; font-style: italic; }
code span.kw { color: #204a87; font-weight: bold; }
code span.op { color: #ce5c00; font-weight: bold; }
code span.ot { color: #8f5902; }
code span.pp { color: #8f5902; font-style: italic; }
code span.sc { color: #ce5c00; font-weight: bold; }
code span.ss { color: #4e9a06; }
code span.st { color: #4e9a06; }
code span.va { color: #000000; }
code span.vs { color: #4e9a06; }
code span.wa { color: #8f5902; font-weight: bold; font-style: italic; }
</style>
<style type="text/css">
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { 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
{ background-color: #f8f8f8; }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ef2929; }
code span.an { color: #8f5902; font-weight: bold; font-style: italic; }
code span.at { color: #204a87; }
code span.bn { color: #0000cf; }
code span.cf { color: #204a87; font-weight: bold; }
code span.ch { color: #4e9a06; }
code span.cn { color: #8f5902; }
code span.co { color: #8f5902; font-style: italic; }
code span.cv { color: #8f5902; font-weight: bold; font-style: italic; }
code span.do { color: #8f5902; font-weight: bold; font-style: italic; }
code span.dt { color: #204a87; }
code span.dv { color: #0000cf; }
code span.er { color: #a40000; font-weight: bold; }
code span.ex { }
code span.fl { color: #0000cf; }
code span.fu { color: #204a87; font-weight: bold; }
code span.im { }
code span.in { color: #8f5902; font-weight: bold; font-style: italic; }
code span.kw { color: #204a87; font-weight: bold; }
code span.op { color: #ce5c00; font-weight: bold; }
code span.ot { color: #8f5902; }
code span.pp { color: #8f5902; font-style: italic; }
code span.sc { color: #ce5c00; font-weight: bold; }
code span.ss { color: #4e9a06; }
code span.st { color: #4e9a06; }
code span.va { color: #000000; }
code span.vs { color: #4e9a06; }
code span.wa { color: #8f5902; 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">Reproducibel research, part I</h1>
<p class="author">
</p>
<p class="date">03 Sep 2024</p>
</div>
<div id="reproducible-research-is-key-to-better-science" class="title-slide slide section level1">
<h1>Reproducible research is key to better science!</h1>
</div>
<div id="link-to-github-page-for-the-class-on-this" class="slide section level2">
<h1>link to github page for the class on this</h1>
<p><a href="https://github.com/DworkinLab/Bio720/blob/master/IntroductionMarkdownAndVersionControl/Bio720_IntroductionMarkdown.md">go
here</a></p>
</div>
<div id="learning-objectives-for-this-week" class="slide section level2">
<h1>Learning Objectives for this week</h1>
</div>
<div id="readings-and-datacamp" class="slide section level2">
<h1>Readings and DataCamp</h1>
<ul>
<li><p>DataCamp, I will assign the courses on RMarkdown and git. ON
DataCamp</p></li>
<li><p>Read <a href="https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005510">Good
enough practices in scientific computing</a> by Wilson et al. </p></li>
<li><p>Read chapters 1 and 2 in <a href="https://mcmaster.primo.exlibrisgroup.com/permalink/01OCUL_MU/deno1h/alma991030055129707371">Bioinformatics
Data Skills</a></p></li>
<li><p>An alternative reading on version control and using git and
github is [chapter 2 in the CSB] book(<a href="https://doi-org.libaccess.lib.mcmaster.ca/10.1515/9780691183961-006" class="uri">https://doi-org.libaccess.lib.mcmaster.ca/10.1515/9780691183961-006</a>).
Pick which one you prefer.</p></li>
</ul>
</div>
<div id="whats-wrong-with-this" class="slide section level2">
<h1>What’s wrong with this?</h1>
<div class="float">
<img src="data:image/gif;base64,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" title="PhD Comics 1323, Copyright Jorge Cham" alt="alt text" />
<div class="figcaption">alt text</div>
</div>
</div>
<div id="how-do-we-make-science-more-reproducible" class="slide section level2">
<h1>How do we make science more reproducible?</h1>
<ul>
<li>Is publishing your paper enough?</li>
</ul>
</div>
<div id="how-do-we-make-science-a-more-open-and-reproducible-endeavor" class="slide section level2">
<h1>How do we make science a more open and reproducible endeavor?</h1>
<ul>
<li>Data?<br />
</li>
<li>Meta-data?<br />
</li>
<li>Analysis scripts/code?</li>
</ul>
<p>What easy steps can make science more reproducible & helpful for
future scientists?</p>
</div>
<div id="how-do-we-make-science-a-more-open-and-reproducible-endeavor-1" class="slide section level2">
<h1>How do we make science a more open and reproducible endeavor?</h1>
<ul>
<li>You want to make this process as easy as possible for yourself first
and foremost.</li>
<li>In the process of organizing your data and analysis pipelines to
share, you will make yourself a better scientist.</li>
<li>Future you (6 months after you finish data collecting), will thank
you too!</li>
</ul>
</div>
<div id="tri-council-nserc-cihr-and-sshrc-guidelines-are-in-place" class="slide section level2">
<h1>Tri-council (NSERC, CIHR and SSHRC) guidelines are in place</h1>
<p>“Grant recipients are required to deposit into a recognized digital
repository all digital research data, metadata and code that directly
support the research… The repository will ensure safe storage,
preservation, and curation of the data. The agencies encourage
researchers to provide access to the data … Whenever possible, these
data, metadata and code should be linked to the publication with a
persistent” <a href="https://www.ic.gc.ca/eic/site/063.nsf/eng/h_97610.html">See links
here</a></p>
</div>
<div id="so-how-do-you-make-this-easy-on-yourself" class="slide section level2">
<h1>So how do you make this easy on yourself?</h1>
<ul>
<li><p>At the onset of your research, organize your workflow with the
goal of making it as easy as possible to share.</p></li>
<li><p>With a few simple guidelines, you will save yourself an enormous
amount of time while making your data and your analysis scripts
available.</p></li>
</ul>
</div>
<div id="rule-1organize-your-project-in-a-simple-and-clear-manner" class="slide section level2">
<h1>Rule 1:Organize your project in a simple and clear manner</h1>
<div class="sourceCode" id="cb1"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" tabindex="-1"></a><span class="ex">/ProjectName</span></span>
<span id="cb1-2"><a href="#cb1-2" tabindex="-1"></a> <span class="ex">./data</span></span>
<span id="cb1-3"><a href="#cb1-3" tabindex="-1"></a> <span class="ex">./scripts</span></span>
<span id="cb1-4"><a href="#cb1-4" tabindex="-1"></a> <span class="ex">./outputs</span></span>
<span id="cb1-5"><a href="#cb1-5" tabindex="-1"></a> <span class="ex">./misc</span></span>
<span id="cb1-6"><a href="#cb1-6" tabindex="-1"></a> <span class="ex">./manuscript</span></span>
<span id="cb1-7"><a href="#cb1-7" tabindex="-1"></a> <span class="ex">README</span></span></code></pre></div>
</div>
<div id="rule-1organize-your-project-in-a-simple-and-clear-manner-1" class="slide section level2">
<h1>Rule 1:Organize your project in a simple and clear manner</h1>
<p>All projects should have very similar organizational formats:</p>
<ul>
<li><p>Informative project name.<br />
</p></li>
<li><p><code>data</code> folder contains raw data as a flat file
(tabular data, comma seperated), database or if necessary a proprietary
spreadsheet.</p></li>
<li><p><code>scripts</code> folder contains scripts/code you use to
analyse your data.</p></li>
<li><p><code>outputs</code> for automated outputs (tables and figures
from the scripts + data)</p></li>
<li><p><code>misc</code> for miscellaneous. Additional meta-data for
files, experimental design information, readme of overall project.
Figures that can not easily be generated.</p></li>
</ul>
</div>
<div id="rule-2-strive-to-store-raw-data-as-plain-text-files" class="slide section level2">
<h1>Rule 2: strive to store raw data as plain text files</h1>
<ul>
<li><p>File formats for many commercial programs (SAS, JMP, Excel,) can
not be easily read by other programs.</p></li>
<li><p>Worse still. As new versions of software emerge, no guarantee of
being able to open older file formats (Excel). – It is fine to use
Excel. But when sharing data (and scripts) use formats like .txt (such
as tab delimited or .tsv) or .csv (comma seperated) which can be easily
read.</p></li>
</ul>
</div>
<div id="rule-2.5-consistent-file-naming-of-raw-data" class="slide section level2">
<h1>Rule 2.5: Consistent file naming of raw data</h1>
<ul>
<li>Many projects generate hundreds or thousands of files. For instance
digital microscopy, automated measuring tools, sequencing, etc.</li>
<li>Spend a few minutes thinking about how to name your files. This will
save you hours or days down the road!</li>
</ul>
</div>
<div id="rule-2.5-consistent-file-naming-of-raw-data-1" class="slide section level2">
<h1>Rule 2.5: Consistent file naming of raw data</h1>
<p>Some “do’s” and “do not”</p>
<p><strong>DO</strong>: Use the same naming conventions for every file.
i.e.</p>
<p>ID_Dmel_M_HN_01.tif<br />
ID_Dmel_M_HN_02.tif<br />
ID_Dmel_M_HN_03.tif<br />
ID_Dmel_F_HN_01.tif<br />
ID_Dmel_F_HN_02.tif<br />
ID_Dmel_F_HN_03.tif</p>
</div>
<div id="rule-2.5-consistent-file-naming-of-raw-data-2" class="slide section level2">
<h1>Rule 2.5: Consistent file naming of raw data</h1>
<p><strong>DO NOT</strong>:Use spaces in file names. Use consistent
delimiters, and limit it to one type of delimiter if you can.
i.e. underscores!</p>
<p>ID_Dmel_M_HN_01.tif</p>
<p><strong>Not</strong> ID Dmel_M_HN 01.tif</p>
<p><strong>Not</strong> ID_Dmel-M_HN.01.tif</p>
</div>
<div id="rule-2.5-consistent-file-naming-of-raw-data-3" class="slide section level2">
<h1>Rule 2.5: Consistent file naming of raw data</h1>
<p><strong>DO</strong>: Use consistent delimiters! Underscore
<code>_</code> and dash <code>-</code> are good choices.</p>
</div>
<div id="rule-2.5-consistent-file-naming-of-raw-data-4" class="slide section level2">
<h1>Rule 2.5: Consistent file naming of raw data</h1>
<p><strong>DO</strong>: Try to have as much of the experimental
information in the file name (like below)</p>
<p>ID_Dmel_M_HN_01.tif</p>
<p>ID = initials<br />
Dmel = species name<br />
M = sex (M/F)<br />
HN = High Nutrition<br />
01 = specimen number</p>
</div>
<div id="rule-2.5-consistent-file-naming-of-raw-data-5" class="slide section level2">
<h1>Rule 2.5: Consistent file naming of raw data</h1>
<p>Why is this important?</p>
<p>It allows for all of the experimental variables to be extracted in an
automated way (even in Excel).</p>
<p>But having inconsistencies in naming can make a 1 minute activity or
one line of code into something not fun.</p>
<p>At least 40% of my coding time is spent parsing and cleaning badly
organized data, in particular due to naming conventions.</p>
</div>
<div id="rule-3-version-control-analysis-and-if-possible-data" class="slide section level2">
<h1>Rule 3: version control analysis (and if possible, data)</h1>
<ul>
<li><p>Version control is about how to manage and keep track of editing
and revisions on any kind of document. This can be code for software,
your analysis pipeline, or manuscript editing.</p></li>
<li><p>The basic idea is that without keeping track of edits and
revisions you make can be problematic.</p></li>
</ul>
</div>
<div id="version-control-analysis-and-if-possible-data" class="slide section level2">
<h1>version control analysis (and if possible, data)</h1>
<ul>
<li><p>version control keeps track of changes you make to files
(differences), when you made them. It also forces you to make a small
comment associated with each change to help you find when you made a
particular change.</p></li>
<li><p>This also enables collaborations with other people (with respect
to revising code or documents), as you can see what changes they made,
and can choose to accept them (or not).</p></li>
<li><p>There are many version control systems out there.</p></li>
</ul>
</div>
<div id="rule-4-or-rule-1-write-a-readme-file-right-at-the-beginning-of-your-analysis" class="slide section level2">
<h1>Rule 4 (or rule 1!) Write a readme file right at the beginning of
your analysis</h1>
<ul>
<li><p>Don’t assume that any collaborators or future users (or future
you) will know what variables are in your data set.</p></li>
<li><p>Write a short readme file containing basic meta-data for the
project including: explanations of the variables, how and where they
were collected (and why), file naming conventions etc.</p></li>
<li><p>If you do this while organizing everything it takes just a few
minutes, but it will save future you and collaborators so much
time.</p></li>
</ul>
</div>
<div id="sharing-data-and-code" class="slide section level2">
<h1>Sharing data (and code)</h1>
<p>In addition to backing up data for yourself, getting it out there as
soon as possible (in conjunction with manuscript submission or
acceptance) is crucial.</p>
</div>
<div id="where-to-share-data" class="slide section level2">
<h1>Where to share data</h1>
<ul>
<li><p>There are often both institutional resources for long term data
archiving, and broader initiatives.</p></li>
<li><p>Some of the Data sharing portals are fairly general purpose
(DRYAD, zenodo, figshare, dataverse, FRDR in Canada).</p></li>
<li><p>Some are highly specialized for certain data types (Morphobank,
tree of life, NCBI GEO,NCBI SRA, morphosource, DigiMorph</p></li>
<li><p><a href="https://evodify.com/free-research-repository/">A useful
short blog post about this</a></p></li>
</ul>
</div>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>