-
Notifications
You must be signed in to change notification settings - Fork 0
/
UseR2017.html
568 lines (559 loc) · 205 KB
/
UseR2017.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
<?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" />
<title>Updates to the R Documentation System</title>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
div.sourceCode { overflow-x: auto; }
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
margin: 0; padding: 0; vertical-align: baseline; border: none; }
table.sourceCode { width: 100%; line-height: 100%; }
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
td.sourceCode { padding-left: 5px; }
code > span.kw { color: #007020; font-weight: bold; } /* Keyword */
code > span.dt { color: #902000; } /* DataType */
code > span.dv { color: #40a070; } /* DecVal */
code > span.bn { color: #40a070; } /* BaseN */
code > span.fl { color: #40a070; } /* Float */
code > span.ch { color: #4070a0; } /* Char */
code > span.st { color: #4070a0; } /* String */
code > span.co { color: #60a0b0; font-style: italic; } /* Comment */
code > span.ot { color: #007020; } /* Other */
code > span.al { color: #ff0000; font-weight: bold; } /* Alert */
code > span.fu { color: #06287e; } /* Function */
code > span.er { color: #ff0000; font-weight: bold; } /* Error */
code > span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
code > span.cn { color: #880000; } /* Constant */
code > span.sc { color: #4070a0; } /* SpecialChar */
code > span.vs { color: #4070a0; } /* VerbatimString */
code > span.ss { color: #bb6688; } /* SpecialString */
code > span.im { } /* Import */
code > span.va { color: #19177c; } /* Variable */
code > span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code > span.op { color: #666666; } /* Operator */
code > span.bu { } /* BuiltIn */
code > span.ex { } /* Extension */
code > span.pp { color: #bc7a00; } /* Preprocessor */
code > span.at { color: #7d9029; } /* Attribute */
code > span.do { color: #ba2121; font-style: italic; } /* Documentation */
code > span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code > span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
</style>
<link href="data:text/css;charset=utf-8,%0Abody%0A%7B%0Amargin%3A%200%200%200%200%3B%0Apadding%3A%200%200%200%200%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Acolor%3A%20black%3B%0Abackground%2Dcolor%3A%20white%3B%0Afont%2Dfamily%3A%20%22Gill%20Sans%20MT%22%2C%20%22Gill%20Sans%22%2C%20GillSans%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0Adiv%2Etoolbar%20%7B%0Aposition%3A%20fixed%3B%20z%2Dindex%3A%20200%3B%0Atop%3A%20auto%3B%20bottom%3A%200%3B%20left%3A%200%3B%20right%3A%200%3B%0Aheight%3A%201%2E2em%3B%20text%2Dalign%3A%20right%3B%0Apadding%2Dleft%3A%201em%3B%0Apadding%2Dright%3A%201em%3B%20font%2Dsize%3A%2060%25%3B%0Acolor%3A%20DimGray%3B%0Abackground%2Dcolor%3A%20rgb%28240%2C240%2C240%29%3B%0Aborder%2Dtop%3A%20solid%201px%20rgb%28180%2C180%2C180%29%3B%0A%7D%0Adiv%2Etoolbar%20span%2Ecopyright%20%7B%0Acolor%3A%20DimGray%3B%0Amargin%2Dleft%3A%200%2E5em%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%201000%3B%0Abottom%3A%201%2E2em%3B%0Awidth%3A%20100%25%3B%0Abackground%2Dcolor%3A%20rgb%28200%2C200%2C200%29%3B%0Aopacity%3A%200%2E35%3B%0Abackground%2Dcolor%3A%20rgb%28200%2C200%2C200%2C%200%2E35%29%3B%0Acursor%3A%20pointer%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20p%2Ehelp%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Adiv%2Einitial%5Fprompt%20p%2Eclose%20%7B%0Atext%2Dalign%3A%20right%3B%0Afont%2Dstyle%3A%20italic%3B%0A%7D%0Adiv%2Eslidy%5Ftoc%20%7B%0Aposition%3A%20absolute%3B%0Az%2Dindex%3A%20300%3B%0Awidth%3A%2060%25%3B%0Amax%2Dwidth%3A%2030em%3B%0Aheight%3A%2030em%3B%0Aoverflow%3A%20auto%3B%0Atop%3A%20auto%3B%0Aright%3A%20auto%3B%0Aleft%3A%204em%3B%0Abottom%3A%204em%3B%0Apadding%3A%201em%3B%0Abackground%3A%20rgb%28240%2C240%2C240%29%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dwidth%3A%202px%3B%0Afont%2Dsize%3A%2060%25%3B%0A%7D%0Adiv%2Eslidy%5Ftoc%20%2Etoc%5Fheading%20%7B%0Atext%2Dalign%3A%20center%3B%0Awidth%3A%20100%25%3B%0Amargin%3A%200%3B%0Amargin%2Dbottom%3A%201em%3B%0Aborder%2Dbottom%2Dstyle%3A%20solid%3B%0Aborder%2Dbottom%2Dcolor%3A%20rgb%28180%2C180%2C180%29%3B%0Aborder%2Dbottom%2Dwidth%3A%201px%3B%0A%7D%0Adiv%2Eslide%20%7B%0Az%2Dindex%3A%2020%3B%0Amargin%3A%200%200%200%200%3B%0Apadding%2Dtop%3A%200%3B%0Apadding%2Dbottom%3A%200%3B%0Apadding%2Dleft%3A%2020px%3B%0Apadding%2Dright%3A%2020px%3B%0Aborder%2Dwidth%3A%200%3B%0Aclear%3A%20both%3B%0Atop%3A%200%3B%0Abottom%3A%200%3B%0Aleft%3A%200%3B%0Aright%3A%200%3B%0Aline%2Dheight%3A%20120%25%3B%0Abackground%2Dcolor%3A%20transparent%3B%0A%7D%0Adiv%2Ebackground%20%7B%0Adisplay%3A%20none%3B%0A%7D%0Adiv%2Ehandout%20%7B%0Amargin%2Dleft%3A%2020px%3B%0Amargin%2Dright%3A%2020px%3B%0A%7D%0Adiv%2Eslide%2Etitlepage%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Adiv%2Eslide%2Etitlepage%20h1%20%7B%0Apadding%2Dtop%3A%2010%25%3B%0Amargin%2Dright%3A%200%3B%0A%7D%0Adiv%2Eslide%20h1%20%7B%0Apadding%2Dleft%3A%200%3B%0Apadding%2Dright%3A%2020pt%3B%0Apadding%2Dtop%3A%204pt%3B%0Apadding%2Dbottom%3A%204pt%3B%0Amargin%2Dtop%3A%200%3B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dright%3A%2060pt%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0Adisplay%3A%20block%3B%20font%2Dsize%3A%20160%25%3B%0Aline%2Dheight%3A%201%2E2em%3B%0Abackground%3A%20transparent%3B%0A%7D%0A%40media%20screen%20and%20%28max%2Ddevice%2Dwidth%3A%201024px%29%0A%7B%0Adiv%2Eslide%20%7B%20font%2Dsize%3A%20100%25%3B%20%7D%0A%7D%0A%40media%20screen%20and%20%28max%2Ddevice%2Dwidth%3A%20800px%29%0A%7B%0Adiv%2Eslide%20%7B%20font%2Dsize%3A%20200%25%3B%20%7D%0Adiv%2Eslidy%5Ftoc%20%7B%0Atop%3A%201em%3B%0Aleft%3A%201em%3B%0Aright%3A%20auto%3B%0Awidth%3A%2080%25%3B%0Afont%2Dsize%3A%20180%25%3B%0A%7D%0A%7D%0Adiv%2Etoc%2Dheading%20%7B%0Awidth%3A%20100%25%3B%0Aborder%2Dbottom%3A%20solid%201px%20rgb%28180%2C180%2C180%29%3B%0Amargin%2Dbottom%3A%201em%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Aimg%20%7B%0Aimage%2Drendering%3A%20optimize%2Dquality%3B%0A%7D%0Apre%20%7B%0Afont%2Dsize%3A%2080%25%3B%0Afont%2Dweight%3A%20bold%3B%0Aline%2Dheight%3A%20120%25%3B%0Apadding%2Dtop%3A%200%2E2em%3B%0Apadding%2Dbottom%3A%200%2E2em%3B%0Apadding%2Dleft%3A%201em%3B%0Apadding%2Dright%3A%201em%3B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%2Dleft%2Dwidth%3A%201em%3B%0Aborder%2Dtop%2Dwidth%3A%20thin%3B%0Aborder%2Dright%2Dwidth%3A%20thin%3B%0Aborder%2Dbottom%2Dwidth%3A%20thin%3B%0Aborder%2Dcolor%3A%20%2395ABD0%3B%0Acolor%3A%20%2300428C%3B%0Abackground%2Dcolor%3A%20%23E4E5E7%3B%0A%7D%0Ali%20pre%20%7B%20margin%2Dleft%3A%200%3B%20%7D%0Ablockquote%20%7B%20font%2Dstyle%3A%20italic%20%7D%0Aimg%20%7B%20background%2Dcolor%3A%20transparent%20%7D%0Ap%2Ecopyright%20%7B%20font%2Dsize%3A%20smaller%20%7D%0A%2Ecenter%20%7B%20text%2Dalign%3A%20center%20%7D%0A%2Efootnote%20%7B%20font%2Dsize%3A%20smaller%3B%20margin%2Dleft%3A%202em%3B%20%7D%0Aa%20img%20%7B%20border%2Dwidth%3A%200%3B%20border%2Dstyle%3A%20none%20%7D%0Aa%3Avisited%20%7B%20color%3A%20navy%20%7D%0Aa%3Alink%20%7B%20color%3A%20navy%20%7D%0Aa%3Ahover%20%7B%20color%3A%20red%3B%20text%2Ddecoration%3A%20underline%20%7D%0Aa%3Aactive%20%7B%20color%3A%20red%3B%20text%2Ddecoration%3A%20underline%20%7D%0Aa%20%7Btext%2Ddecoration%3A%20none%7D%0A%2Etoolbar%20a%3Alink%20%7Bcolor%3A%20blue%7D%0A%2Etoolbar%20a%3Avisited%20%7Bcolor%3A%20blue%7D%0A%2Etoolbar%20a%3Aactive%20%7Bcolor%3A%20red%7D%0A%2Etoolbar%20a%3Ahover%20%7Bcolor%3A%20red%7D%0Aul%20%7B%20list%2Dstyle%2Dtype%3A%20square%3B%20%7D%0Aul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20circle%3B%20%7D%0Aul%20ul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Ali%20%7B%20margin%2Dleft%3A%200%2E5em%3B%20margin%2Dtop%3A%200%2E5em%3B%20%7D%0Ali%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20italic%20%7D%0Ali%20li%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20normal%20%7D%0Adiv%20dt%0A%7B%0Amargin%2Dleft%3A%200%3B%0Amargin%2Dtop%3A%201em%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Adiv%20dd%0A%7B%0Amargin%2Dleft%3A%202em%3B%0Amargin%2Dbottom%3A%200%2E5em%3B%0A%7D%0Ap%2Cpre%2Cul%2Col%2Cblockquote%2Ch2%2Ch3%2Ch4%2Ch5%2Ch6%2Cdl%2Ctable%20%7B%0Amargin%2Dleft%3A%201em%3B%0Amargin%2Dright%3A%201em%3B%0A%7D%0Ap%2Esubhead%20%7B%20font%2Dweight%3A%20bold%3B%20margin%2Dtop%3A%202em%3B%20%7D%0A%2Esmaller%20%7B%20font%2Dsize%3A%20smaller%20%7D%0A%2Ebigger%20%7B%20font%2Dsize%3A%20130%25%20%7D%0Atd%2Cth%20%7B%20padding%3A%200%2E2em%20%7D%0Aul%20%7B%0Amargin%3A%200%2E5em%201%2E5em%200%2E5em%201%2E5em%3B%0Apadding%3A%200%3B%0A%7D%0Aol%20%7B%0Amargin%3A%200%2E5em%201%2E5em%200%2E5em%201%2E5em%3B%0Apadding%3A%200%3B%0A%7D%0Aul%20%7B%20list%2Dstyle%2Dtype%3A%20square%3B%20%7D%0Aul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20circle%3B%20%7D%0Aul%20ul%20ul%20ul%20%7B%20list%2Dstyle%2Dtype%3A%20disc%3B%20%7D%0Aul%20li%20%7B%20list%2Dstyle%3A%20square%3B%0Amargin%3A%200%2E1em%200em%200%2E6em%200%3B%0Apadding%3A%200%200%200%200%3B%0Aline%2Dheight%3A%20140%25%3B%0A%7D%0Aol%20li%20%7B%20margin%3A%200%2E1em%200em%200%2E6em%201%2E5em%3B%0Apadding%3A%200%200%200%200px%3B%0Aline%2Dheight%3A%20140%25%3B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0Ali%20ul%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20italic%3B%0Alist%2Dstyle%2Dtype%3A%20disc%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20li%20ul%20li%20%7B%20font%2Dsize%3A%2085%25%3B%20font%2Dstyle%3A%20normal%3B%0Alist%2Dstyle%2Dtype%3A%20circle%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20li%20li%20ul%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20disc%3B%0Abackground%3A%20transparent%3B%0Apadding%3A%200%200%200%200%3B%0A%7D%0Ali%20ol%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0Ali%20li%20ol%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20decimal%3B%0A%7D%0A%0Aol%2Eoutline%20li%3Ahover%20%7B%20cursor%3A%20pointer%20%7D%0Aol%2Eoutline%20li%2Enofold%3Ahover%20%7B%20cursor%3A%20default%20%7D%0Aul%2Eoutline%20li%3Ahover%20%7B%20cursor%3A%20pointer%20%7D%0Aul%2Eoutline%20li%2Enofold%3Ahover%20%7B%20cursor%3A%20default%20%7D%0Aol%2Eoutline%20%7B%20list%2Dstyle%3Adecimal%3B%20%7D%0Aol%2Eoutline%20ol%20%7B%20list%2Dstyle%2Dtype%3Alower%2Dalpha%20%7D%0Aol%2Eoutline%20li%2Enofold%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAIACAMzMzOvr%2FywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Eunfolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Efolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Eunfolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aol%2Eoutline%20li%2Efolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Enofold%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAIACAMzMzOvr%2FywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Eunfolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Efolded%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAMPD%2F8zMzOvr%2F%2F%2F%2F%2FywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Eunfolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0Aul%2Eoutline%20li%2Efolded%3Ahover%20%7B%0Apadding%3A%200%200%200%2020px%3B%0Abackground%3A%20transparent%20url%28data%3Aimage%2Fgif%3Bbase64%2CR0lGODdhCQAJAKEDAAAAAAAA%2F8PD%2F%2F%2F%2F%2FywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs%3D%29%20no%2Drepeat%200px%200%2E5em%3B%0A%7D%0A%0Aa%2Etitleslide%20%7B%20font%2Dweight%3A%20bold%3B%20font%2Dstyle%3A%20italic%20%7D%0A%0Aimg%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Adiv%2Einitial%5Fprompt%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Adiv%2Eslide%20%7B%0Avisibility%3A%20visible%3B%0Aposition%3A%20inherit%3B%0A%7D%0Adiv%2Ehandout%20%7B%0Aborder%2Dtop%2Dstyle%3A%20solid%3B%0Aborder%2Dtop%2Dwidth%3A%20thin%3B%0Aborder%2Dtop%2Dcolor%3A%20black%3B%0A%7D%0A%40media%20screen%20%7B%0A%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20visible%20%7D%0Adiv%2Eslide%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Ehandout%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Ebackground%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20div%2Einitial%5Fprompt%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Abody%2Esingle%5Fslide%20div%2Ebackground%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Abody%2Esingle%5Fslide%20div%2Ebackground%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20%2Einvisible%20%7B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20%2Ehidden%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0Abody%2Esingle%5Fslide%20div%2Eslide%20%7B%20position%3A%20absolute%20%7D%0Abody%2Esingle%5Fslide%20div%2Ehandout%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%20%7D%0A%7D%0A%40media%20print%20%7B%0A%2Ehidden%20%7B%20display%3A%20block%3B%20visibility%3A%20visible%20%7D%0Adiv%2Eslide%20pre%20%7B%20font%2Dsize%3A%2060%25%3B%20padding%2Dleft%3A%200%2E5em%3B%20%7D%0Adiv%2Etoolbar%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Eslidy%5Ftoc%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Ebackground%20%7B%20display%3A%20none%3B%20visibility%3A%20hidden%3B%20%7D%0Adiv%2Eslide%20%7B%20page%2Dbreak%2Dbefore%3A%20always%20%7D%0A%0Adiv%2Eslide%2Efirst%2Dslide%20%7B%20page%2Dbreak%2Dbefore%3A%20avoid%20%7D%0A%7D%0A%0A%0A%2Ejslider%20table%20%7B%0Amargin%2Dleft%3A%200em%3B%0Amargin%2Dright%3A%200em%3B%0A%7D%0A%0Atable%2EdataTable%2C%20%2Eshiny%2Ddatatable%2Doutput%20div%20%7B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0A%0A%2EdataTables%5Finfo%2C%20%2EdataTables%5Fpaginate%20%7B%0Afont%2Dsize%3A%2019px%3B%0A%7D%0A%0Apre%2EsourceCode%2C%20code%2EsourceCode%20%7B%0Afont%2Dsize%3A%2080%25%3B%0A%7D%0A%0Alabel%2C%20button%2C%20input%2C%20select%2C%20textarea%20%7B%0Afont%2Dsize%3A%2014pt%3B%0A%7D%0A%0Aul%2Enav%2C%20ul%2Enav%20li%20%7B%0Alist%2Dstyle%2Dtype%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-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>
</head>
<body>
<div class="slide titlepage">
<h1 class="title">Updates to the R Documentation System</h1>
<p class="author">
<p>Andrew Redd, R documentation Task Force</p>
</p>
<p class="date">UseR!2017</p>
</div>
<div id="history" class="slide section level2">
<h1>History</h1>
<ul>
<li>UseR!2016</li>
<li>July 2016, R Consortium Funding</li>
<li>September-December 2016</li>
<li>January 2017 - Now</li>
</ul>
</div>
<div id="design-principles" class="slide section level2">
<h1>Design Principles</h1>
<ul>
<li>Full class system for documentation</li>
<li>Can document anything</li>
<li>stored in <code>attr(., 'documentation')</code> for traditional objects;
<ul>
<li>functions, data.frames, etc.</li>
</ul></li>
<li>Stored as a meta object similar to class definitions for S4 and reference classes.</li>
<li>Everything can be accessed or set from the <code>documentation</code> and <code>documentation<-</code> generics.</li>
<li>Formats for input and output support decided</li>
<li>Independent of but supports the package system</li>
</ul>
</div>
<div id="many-in---many-out" class="slide section level2">
<h1>Many in - Many Out</h1>
<div class="figure">
<img src="data:image/png;base64,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" alt="Many in - Many out approach." />
<p class="caption">Many in - Many out approach.</p>
</div>
</div>
<div id="current-state" class="slide section level2">
<h1>Current State</h1>
<ul>
<li><code>parsetools</code></li>
<li><code>documentation</code></li>
<li><code>documentation-md</code></li>
<li><code>documentation-yaml</code></li>
</ul>
</div>
<div id="parsetools" class="slide section level2">
<h1><code>parsetools</code></h1>
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="kw">library</span>(parsetools)
<span class="kw">options</span>(<span class="dt">keep.source=</span><span class="ot">TRUE</span>)
pd <-<span class="st"> </span><span class="kw">get_parse_data</span>(<span class="kw">parse</span>(<span class="dt">text=</span><span class="st">"x <- rnorm(100)"</span>))
<span class="kw">kable</span>(pd[<span class="kw">c</span>(-<span class="dv">1</span>,-<span class="dv">3</span>)])</code></pre></div>
<table>
<thead>
<tr class="header">
<th></th>
<th align="right">col1</th>
<th align="right">col2</th>
<th align="right">id</th>
<th align="right">parent</th>
<th align="left">token</th>
<th align="left">terminal</th>
<th align="left">text</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>1</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">3</td>
<td align="left">SYMBOL</td>
<td align="left">TRUE</td>
<td align="left">x</td>
</tr>
<tr class="even">
<td>3</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">3</td>
<td align="right">14</td>
<td align="left">expr</td>
<td align="left">FALSE</td>
<td align="left"></td>
</tr>
<tr class="odd">
<td>14</td>
<td align="right">1</td>
<td align="right">15</td>
<td align="right">14</td>
<td align="right">0</td>
<td align="left">expr</td>
<td align="left">FALSE</td>
<td align="left"></td>
</tr>
<tr class="even">
<td>2</td>
<td align="right">3</td>
<td align="right">4</td>
<td align="right">2</td>
<td align="right">14</td>
<td align="left">LEFT_ASSIGN</td>
<td align="left">TRUE</td>
<td align="left"><-</td>
</tr>
<tr class="odd">
<td>4</td>
<td align="right">6</td>
<td align="right">10</td>
<td align="right">4</td>
<td align="right">6</td>
<td align="left">SYMBOL_FUNCTION_CALL</td>
<td align="left">TRUE</td>
<td align="left">rnorm</td>
</tr>
<tr class="even">
<td>6</td>
<td align="right">6</td>
<td align="right">10</td>
<td align="right">6</td>
<td align="right">12</td>
<td align="left">expr</td>
<td align="left">FALSE</td>
<td align="left"></td>
</tr>
<tr class="odd">
<td>12</td>
<td align="right">6</td>
<td align="right">15</td>
<td align="right">12</td>
<td align="right">14</td>
<td align="left">expr</td>
<td align="left">FALSE</td>
<td align="left"></td>
</tr>
<tr class="even">
<td>5</td>
<td align="right">11</td>
<td align="right">11</td>
<td align="right">5</td>
<td align="right">12</td>
<td align="left">‘(’</td>
<td align="left">TRUE</td>
<td align="left">(</td>
</tr>
<tr class="odd">
<td>7</td>
<td align="right">12</td>
<td align="right">14</td>
<td align="right">7</td>
<td align="right">8</td>
<td align="left">NUM_CONST</td>
<td align="left">TRUE</td>
<td align="left">100</td>
</tr>
<tr class="even">
<td>8</td>
<td align="right">12</td>
<td align="right">14</td>
<td align="right">8</td>
<td align="right">12</td>
<td align="left">expr</td>
<td align="left">FALSE</td>
<td align="left"></td>
</tr>
<tr class="odd">
<td>9</td>
<td align="right">15</td>
<td align="right">15</td>
<td align="right">9</td>
<td align="right">12</td>
<td align="left">‘)’</td>
<td align="left">TRUE</td>
<td align="left">)</td>
</tr>
</tbody>
</table>
</div>
<div class="slide section level2">
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="kw">get_pd_assign_value</span>(pd) %>%<span class="st"> </span><span class="kw">select</span>(-<span class="kw">starts_with</span>(<span class="st">'line'</span>)) %>%<span class="st"> </span>kable</code></pre></div>
<table>
<thead>
<tr class="header">
<th></th>
<th align="right">col1</th>
<th align="right">col2</th>
<th align="right">id</th>
<th align="right">parent</th>
<th align="left">token</th>
<th align="left">terminal</th>
<th align="left">text</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>4</td>
<td align="right">6</td>
<td align="right">10</td>
<td align="right">4</td>
<td align="right">6</td>
<td align="left">SYMBOL_FUNCTION_CALL</td>
<td align="left">TRUE</td>
<td align="left">rnorm</td>
</tr>
<tr class="even">
<td>6</td>
<td align="right">6</td>
<td align="right">10</td>
<td align="right">6</td>
<td align="right">12</td>
<td align="left">expr</td>
<td align="left">FALSE</td>
<td align="left"></td>
</tr>
<tr class="odd">
<td>12</td>
<td align="right">6</td>
<td align="right">15</td>
<td align="right">12</td>
<td align="right">14</td>
<td align="left">expr</td>
<td align="left">FALSE</td>
<td align="left"></td>
</tr>
<tr class="even">
<td>5</td>
<td align="right">11</td>
<td align="right">11</td>
<td align="right">5</td>
<td align="right">12</td>
<td align="left">‘(’</td>
<td align="left">TRUE</td>
<td align="left">(</td>
</tr>
<tr class="odd">
<td>7</td>
<td align="right">12</td>
<td align="right">14</td>
<td align="right">7</td>
<td align="right">8</td>
<td align="left">NUM_CONST</td>
<td align="left">TRUE</td>
<td align="left">100</td>
</tr>
<tr class="even">
<td>8</td>
<td align="right">12</td>
<td align="right">14</td>
<td align="right">8</td>
<td align="right">12</td>
<td align="left">expr</td>
<td align="left">FALSE</td>
<td align="left"></td>
</tr>
<tr class="odd">
<td>9</td>
<td align="right">15</td>
<td align="right">15</td>
<td align="right">9</td>
<td align="right">12</td>
<td align="left">‘)’</td>
<td align="left">TRUE</td>
<td align="left">)</td>
</tr>
</tbody>
</table>
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="kw">get_pd_assign_variable</span>(pd) %>%<span class="st"> </span><span class="kw">select</span>(-<span class="kw">starts_with</span>(<span class="st">'line'</span>)) %>%<span class="st"> </span>kable </code></pre></div>
<table>
<thead>
<tr class="header">
<th></th>
<th align="right">col1</th>
<th align="right">col2</th>
<th align="right">id</th>
<th align="right">parent</th>
<th align="left">token</th>
<th align="left">terminal</th>
<th align="left">text</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>1</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">3</td>
<td align="left">SYMBOL</td>
<td align="left">TRUE</td>
<td align="left">x</td>
</tr>
<tr class="even">
<td>3</td>
<td align="right">1</td>
<td align="right">1</td>
<td align="right">3</td>
<td align="right">14</td>
<td align="left">expr</td>
<td align="left">FALSE</td>
<td align="left"></td>
</tr>
</tbody>
</table>
</div>
<div id="documentation" class="slide section level2">
<h1><code>documentation</code></h1>
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="kw">library</span>(documentation)
x <-<span class="st"> </span><span class="kw">new</span>(<span class="st">'Documentation'</span>
, <span class="dt">title =</span> <span class="st">"Example documentation"</span>
, <span class="dt">author =</span> <span class="kw">person</span>(<span class="st">'Andrew'</span>, <span class="st">'Redd'</span>)
, <span class="dt">description =</span> <span class="st">"This is used to demonstrate the class"</span> %\%
<span class="st"> "system for the documentation package in R"</span>
, <span class="dt">keywords =</span> <span class="st">"documentation"</span>
)</code></pre></div>
</div>
<div class="slide section level2">
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="kw">str</span>(x)</code></pre></div>
<pre><code>## Formal class 'Documentation' [package "documentation"] with 10 slots
## ..@ author :Class 'person' hidden list of 1
## .. ..$ :List of 5
## .. .. ..$ given : chr "Andrew"
## .. .. ..$ family : chr "Redd"
## .. .. ..$ role : NULL
## .. .. ..$ email : NULL
## .. .. ..$ comment: NULL
## ..@ title : chr "Example documentation"
## ..@ description:Formal class 'FormattedText' [package "documentation"] with 1 slot
## .. .. ..@ .Data: chr "This is used to demonstrate the class system for the documentation package in R"
## ..@ references : list()
## .. ..- attr(*, "class")= chr "bibentry"
## ..@ seealso :Formal class 'FormattedText' [package "documentation"] with 1 slot
## .. .. ..@ .Data: chr(0)
## ..@ examples :Formal class 'Prose' [package "documentation"] with 1 slot
## .. .. ..@ .Data: list()
## ..@ keywords :Formal class 'Documentation-Keyword' [package "documentation"] with 1 slot
## .. .. ..@ .Data: chr "documentation"
## ..@ aliases : chr(0)
## ..@ concepts : chr(0)
## ..@ sections :Formal class 'SectionList' [package "documentation"] with 1 slot
## .. .. ..@ .Data: list()</code></pre>
</div>
<div class="slide section level2">
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="kw">toRd</span>(x) %>%<span class="st"> </span><span class="kw">cat</span>(<span class="dt">sep=</span><span class="st">'</span><span class="ch">\n</span><span class="st">'</span>)</code></pre></div>
<pre><code>## \author{Andrew Redd}
## \title{Example documentation}
## \description{This is used to demonstrate the class system for the documentation package in R}
## \keyword{documentation}</code></pre>
</div>
<div id="something-a-bit-more-interesting" class="slide section level2">
<h1>Something a bit more interesting</h1>
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r">hw <-<span class="st"> </span>function(){<span class="kw">print</span>(<span class="st">"hello world"</span>)}
<span class="kw">documentation</span>(hw) <-<span class="st"> </span><span class="kw">function_documentation</span>(<span class="st">'hw'</span>, <span class="dt">title =</span> <span class="st">"the standard Hello world"</span>)
<span class="kw">documentation</span>(hw) %>%<span class="st"> </span>toRd %>%<span class="st"> </span>unlist %>%<span class="st"> </span><span class="kw">cat</span>(<span class="dt">sep=</span><span class="st">'</span><span class="ch">\n</span><span class="st">'</span>)</code></pre></div>
<pre><code>## \name{hw}
## \usage{hw()}
## \value{NA}
## \title{the standard Hello world}</code></pre>
</div>
<div id="can-your-documentation-do-this" class="slide section level2">
<h1>Can your documentation do this?</h1>
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r">make_hello <-<span class="st"> </span>function(<span class="dt">what =</span> <span class="st">'world'</span>){
<span class="kw">documented</span>(function(){
<span class="kw">print</span>(<span class="kw">paste</span>(<span class="st">"hello"</span>, what))
}, <span class="dt">name =</span> <span class="kw">paste0</span>(<span class="st">"hello_"</span>, what)
, <span class="dt">title =</span> <span class="kw">sprintf</span>(<span class="st">"the dynamic hello_%s example"</span>, what)
, <span class="dt">description =</span> <span class="st">"Prints hello"</span> %\%<span class="st"> </span>what %\%<span class="st">"to the console."</span> %\n%
<span class="st"> "Used to show the power of dynamic documentation."</span>
)
}
hello_world <-<span class="st"> </span><span class="kw">make_hello</span>()
hello_belgium <-<span class="st"> </span><span class="kw">make_hello</span>(<span class="st">'Belgium'</span>)
<span class="kw">hello_belgium</span>()</code></pre></div>
<pre><code>## [1] "hello Belgium"</code></pre>
</div>
<div class="slide section level2">
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="kw">documentation</span>(hello_belgium) %>%<span class="st"> </span>toRd %>%<span class="st"> </span>unlist %>%<span class="st"> </span><span class="kw">cat</span>(<span class="dt">sep=</span><span class="st">"</span><span class="ch">\n</span><span class="st">"</span>)</code></pre></div>
<pre><code>## \name{hello_Belgium}
## \usage{hello_Belgium()}
## \value{NA}
## \title{the dynamic hello_Belgium example}
## \description{Prints hello Belgium to the console.
## Used to show the power of dynamic documentation.}</code></pre>
</div>
<div id="test-extraction" class="slide section level2">
<h1>Test extraction</h1>
<p>Example R code in “./R/hello.R”</p>
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r">hello_belgium <-<span class="st"> </span><span class="kw">make_hello</span>(<span class="st">'Belgium'</span>)
if(<span class="ot">FALSE</span>){<span class="co">#@testing</span>
<span class="kw">expect_output</span>(<span class="kw">hello_belgium</span>(), <span class="st">"hello Belgium"</span>)
}</code></pre></div>
</div>
<div class="slide section level2">
<p>We run <code>extract_tests()</code> then …</p>
</div>
<div class="slide section level2">
<p>in “./tests/testthat/test-hello.R” we will have</p>
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r"><span class="co">#! This file was automatically produced by documentation on 2017-07-05 11:00:00</span>
<span class="co">#! changes will be overwritten.</span>
<span class="kw">context</span>(<span class="st">'tests extracted from file `./R/hello.R`'</span>)
<span class="kw">test_that</span>(<span class="st">"hello_belgium"</span>, {<span class="co">#@testing</span>
<span class="kw">expect_output</span>(<span class="kw">hello_belgium</span>(), <span class="st">"hello Belgium"</span>)
})
</code></pre></div>
</div>
<div id="something-still-to-finish" class="slide section level2">
<h1>Something still to finish</h1>
<p><strong>Relational Tags</strong></p>
<div class="sourceCode"><pre class="sourceCode r"><code class="sourceCode r">hw <-<span class="st"> </span>
function( <span class="dt">greet =</span> <span class="st">"Hello"</span> <span class="co">#< A greeting </span>
, <span class="dt">who =</span> <span class="st">"World"</span> <span class="co">#< who to greet.</span>
){
<span class="co">#! A more complicated hello world</span>
<span class="kw">print</span>(<span class="kw">paste</span>(greet, who))
<span class="co">#< Called for the side effect of printing, </span>
<span class="co">#^ but returns the pasted arguments invisibly.</span>
}</code></pre></div>
</div>
<div id="state-in-summary" class="slide section level2">
<h1>State in summary</h1>
<table>
<tbody>
<tr class="odd">
<td align="left">Documentation Classes</td>
<td align="right">done..<em>ish</em></td>
</tr>
<tr class="even">
<td align="left"><code>parsetools</code></td>
<td align="right">functionally Complete</td>
</tr>
<tr class="odd">
<td align="left">test extraction</td>
<td align="right">done</td>
</tr>
<tr class="even">
<td align="left">Relational Tags</td>
<td align="right">Infrastructure in place</td>
</tr>
<tr class="odd">
<td align="left"></td>
<td align="right">Needs to integrate with Roxygen</td>
</tr>
<tr class="even">
<td align="left"><strong>Input Forms</strong></td>
<td align="right">Lots to do</td>
</tr>
<tr class="odd">
<td align="left"><strong>Output Forms</strong></td>
<td align="right"></td>
</tr>
<tr class="even">
<td align="left"><em>Rd</em></td>
<td align="right">in place, could use improvement</td>
</tr>
<tr class="odd">
<td align="left"><em>markdown</em></td>
<td align="right">lots to do</td>
</tr>
<tr class="even">
<td align="left"><em>Others</em></td>
<td align="right">not started</td>
</tr>
</tbody>
</table>
</div>
<div id="how-people-can-help-and-get-involved." class="slide section level2">
<h1>how people can help and get involved.</h1>
<ul>
<li>Make a github request for a feature.</li>
<li>Code one of the missing functionalities
<ul>
<li>code it up</li>
<li>test the heck out of it</li>
<li>make a pull request showing</li>
</ul></li>
</ul>
<p><a href="https://github.com/RDocTaskForce/" class="uri">https://github.com/RDocTaskForce/</a></p>
<ul>
<li>Join the mailing list</li>
</ul>
<p><a href="https://lists.r-consortium.org/mailman/listinfo/rconsortium-wg-dtf" class="uri">https://lists.r-consortium.org/mailman/listinfo/rconsortium-wg-dtf</a></p>
</div>
<div id="acknowledgements" class="slide section level2">
<h1>Acknowledgements</h1>
<ul>
<li>Special Thanks to the R Consortium for the funding for this project</li>
<li>Thanks to the members and participants of the RDTF.
<ul>
<li>Richard Calaway</li>
<li>Sarah Goslee</li>
<li>Michael Lawrence</li>
<li>Martin Maechler</li>
<li>Duncan Murdoch</li>
<li>Kirill Muller</li>
</ul></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>