/var/www/(Del)hsihk.com/wp-content/uploads/backupbuddy_temp/asfg1870ze/importbuddy.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
<?php
/* ImportBuddy Restore & Migration Tool - iThemes.com
 * @author Dustin Bolton
 *
 * ATTENTION: IF YOU ARE READING THIS WHILE TRYING TO LOAD IMPORTBUDDY TO RESTORE YOUR SITE:
 * Your server is not properly handling PHP files. Contact your hosting provider to fix this.
 * Notify them that PHP files are not executing and instead are outputting their code contents.
 *
 */

$php_minimum '5.1'// User's PHP must be equal or newer to this version.
//error_reporting( E_ALL );

if ( version_comparePHP_VERSION$php_minimum ) < ) {
    die( 
'ERROR #9013. See <a href="http://ithemes.com/codex/page/BackupBuddy:_Error_Codes#9013">this codex page for details</a>. Sorry! PHP version ' $php_minimum ' or newer is required for BackupBuddy to properly run. You are running PHP version ' PHP_VERSION '.' );
}

global 
$importbuddy_file;
$importbuddy_file basename__FILE__ ); // filename of importbuddy.php (or whatever it is named).

$abspath rtrimdirname__FILE__ ), '\\/' ) . '/';
define'ABSPATH'$abspath );
define'PB_BB_VERSION''5.1.0.9 (downloaded 2015-01-13T06:25:48+00:00)' );
define'PB_PASSWORD''0604048b16eccaa32e7412cdf35fcd49' );

// Used by wpdb class.
define('DB_CHARSET''utf8');
define('DB_COLLATE''');

@
date_default_timezone_set( @date_default_timezone_get() ); // Prevents date() from throwing a warning if the default timezone has not been set. Run prior to any file_exists()!


// Try to put an index.htm file in place during import to help prevent against file browsing. Only do if not a defined step OR a non-numeric defined step OR a defined numeric step < 5.
if (
    ( ! isset( 
$_GET['step'] ) )
    ||
    ( isset( 
$_GET['step'] ) && !is_numeric$_GET['step'] ) )
    ||
    ( isset( 
$_GET['step'] ) && is_numeric$_GET['step'] ) && ( $_GET['step'] < ) )
    )
{
    if ( ( ! 
file_existsABSPATH 'index.htm' ) ) && ( ! file_existsABSPATH 'index.php' ) ) ) {
        @
file_put_contentsABSPATH 'index.htm''<html></html>' );
    }
}


// Unpack importbuddy files into importbuddy directory.
if ( !file_existsABSPATH 'importbuddy' ) || ( ( count$_GET ) == ) && ( count$_POST ) == ) ) ) {
    
$unpack_importbuddy true;
    if ( 
file_existsABSPATH 'importbuddy' ) ) { // ImportBuddy directory already exists. We may need to re-unpack it if this file has been updated since.
        
$signature = @file_get_contentsABSPATH 'importbuddy/_signature.php' );
        
$signature trimstr_replace'<?php die(); ?>'''$signature ) );
        if ( 
md5PB_BB_VERSION PB_PASSWORD ) != $signature ) { // Signature mismatch. We will need to delete and unpack again to update.
            
echo '<!-- unlinking existing importbuddy directory. -->';
            
recursive_unlinkABSPATH 'importbuddy' );
        } else {
            
$unpack_importbuddy false;
        }
    }
    if ( 
true === $unpack_importbuddy ) {
        
unpack_importbuddy();
        @
file_put_contentsABSPATH 'importbuddy/_signature.php''<?php die(); ?>' md5PB_BB_VERSION PB_PASSWORD ) ); // Create a hash of this ImportBuddy version & password. On accessing importbuddy.php's authentication page all importbuddy files will be freshly unpacked if the importbuddy.php version and/or password mismatches to allow users to just replace importbuddy.php to upgrade ImportBuddy or password.
    
}
}



// Database wrapper.
require_once( ABSPATH 'importbuddy/classes/wp-db.php' );
global 
$wpdb;
//$wpdb = new wpdb();



if ( isset( $_GET['api'] ) && ( $_GET['api'] != '' ) ) { // API ACCESS
    
if ( $_GET['api'] == 'ping' ) {
        die( 
'pong' );
    } else {
        die( 
'Unknown API access action.' );
    }
} else { 
// NORMAL ACCESS.
    
if ( !file_existsABSPATH 'importbuddy/init.php' ) ) {
        die( 
'Error: Unable to find file `' ABSPATH 'importbuddy/init.php`. Make sure that you downloaded this script from within BackupBuddy. Copying importbuddy files from inside the plugin directory is not sufficient as many file additions are made on demand.' );
    } else {
        require_once( 
ABSPATH 'importbuddy/init.php' );
    }
}



function 
recursive_unlink$path ) {
  return 
is_file($path)?
    @
unlink($path):
array_map('recursive_unlink',glob($path.'/*'))==@rmdir($path);
}


/**
*    unpack_importbuddy()
*
*    Unpacks required files encoded in importbuddy.php into stand-alone files.
*
*    @return        null
*/
function unpack_importbuddy() {
    if ( !
is_writableABSPATH ) ) {
        echo 
'Error #224834. This directory, `' ABSPATH '`, is not write enabled according to the server. Please verify proper write permissions to continue. If this persists, contact your web hosting provider and tell them that is_writable("' ABSPATH '") returns FALSE in PHP.';
        die();
    } else {
        
$unpack_file '';
        
        
// Make sure the file is complete and contains all the packed data to the end.
        
if ( false === strposfile_get_contents__FILE__ ), '###PACKDATA' ',END' ) ) { // Concat here so we don't false positive on this line when searching.
            
die( 'ERROR: It appears your `' __FILE__ '` file is incomplete.  It may have not finished downloading or uploading completely.  Please try re-downloading the script from within BackupBuddy in WordPress (do not just copy the file from the plugin directory) and re-uploading it.' );
        }
        
        
$handle = @fopen__FILE__'r' );
        if ( 
$handle ) {
            while ( ( 
$buffer fgets$handle ) ) !== false ) {
                if ( 
substr$buffer011 ) == '###PACKDATA' ) {
                    
$packdata_commands explode','trim$buffer ) );
                    
array_shift$packdata_commands );
                    
                    if ( 
$packdata_commands[0] == 'BEGIN' ) {
                        
// Start packed data.
                    
} elseif ( $packdata_commands[0] == 'FILE_START' ) {
                        
$unpack_file $packdata_commands[2];
                    } elseif ( 
$packdata_commands[0] == 'FILE_END' ) {
                        
$unpack_file '';
                    } elseif ( 
$packdata_commands[0] == 'END' ) {
                        return;
                    }
                } else {
                    if ( 
$unpack_file != '' ) {
                        if ( !
is_dirdirnameABSPATH $unpack_file ) ) ) {
                            
$mkdir_result mkdirdirnameABSPATH $unpack_file ), 0777true ); // second param makes recursive.
                            
if ( $mkdir_result === false ) {
                                echo 
'Error #54455. Unable to mkdir `' dirnameABSPATH $unpack_file ) . '`<br>';
                            }
                        }
                        
$fileput_result file_put_contentsABSPATH $unpack_filebase64_decode$buffer ) );
                        if ( 
$fileput_result === false ) {
                            echo 
'Error #65656. Unable to put file contents to `' ABSPATH $unpack_file '`.<br>';
                        }
                    }
                }
            }
            if ( !
feof$handle ) ) {
                echo 
"Error: unexpected fgets() fail.<br>";
            }
            
fclose$handle );
        } else {
            echo 
'ERROR #54455: Unable to open `' __FILE__ '` file for reading in packaged data.<br>';
        }
    }
}
die();
?>
<?php 
/*
###PACKDATA,BEGIN
###PACKDATA,FILE_START,/_importbuddy/importbuddy/index.htm,importbuddy/index.htm
PGh0bWw+PC9odG1sPg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/index.htm,importbuddy/index.htm
###PACKDATA,FILE_START,/_importbuddy/importbuddy/index.html,importbuddy/index.html
PGh0bWw+PC9odG1sPg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/index.html,importbuddy/index.html
###PACKDATA,FILE_START,/_importbuddy/importbuddy/index.php,importbuddy/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/_importbuddy/importbuddy/index.php,importbuddy/index.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/init.php,importbuddy/init.php
PD9waHAKLyoqCiAqCiAqCVBsdWdpbiBOYW1lOiBJbXBvcnRCdWRkeQogKglQbHVnaW4gVVJJOiBodHRwOi8vcGx1Z2luYnVkZHkuY29tLwogKglEZXNjcmlwdGlvbjogQmFja3VwQnVkZHkgSW1wb3J0ZXIKICoJVmVyc2lvbjogMS4wLjIKICoJQXV0aG9yOiBEdXN0aW4gQm9sdG9uCiAqCUF1dGhvciBVUkk6IGh0dHA6Ly9kdXN0aW5ib2x0b24uY29tLwogKgogKglJbnN0YWxsYXRpb246CiAqIAogKgkxLiBEb3dubG9hZCBhbmQgdW56aXAgdGhlIGxhdGVzdCByZWxlYXNlIHppcCBmaWxlLgogKgkyLiBJZiB5b3UgdXNlIHRoZSBXb3JkUHJlc3MgcGx1Z2luIHVwbG9hZGVyIHRvIGluc3RhbGwgdGhpcyBwbHVnaW4gc2tpcCB0byBzdGVwIDQuCiAqCTMuIFVwbG9hZCB0aGUgZW50aXJlIHBsdWdpbiBkaXJlY3RvcnkgdG8geW91ciBgL3dwLWNvbnRlbnQvcGx1Z2lucy9gIGRpcmVjdG9yeS4KICoJNC4gQWN0aXZhdGUgdGhlIHBsdWdpbiB0aHJvdWdoIHRoZSAnUGx1Z2lucycgbWVudSBpbiBXb3JkUHJlc3MgQWRtaW5pc3RyYXRpb24uCiAqIAogKglVc2FnZToKICogCiAqCTEuIE5hdmlnYXRlIHRvIHRoZSBuZXcgcGx1Z2luIG1lbnUgaW4gdGhlIFdvcmRwcmVzcyBBZG1pbmlzdHJhdGlvbiBQYW5lbC4KICoKICoJTk9URTogRE8gTk9UIEVESVQgVEhJUyBPUiBBTlkgT1RIRVIgUExVR0lOIEZJTEVTLiBOTyBVU0VSLUNPTkZJR1VSQUJMRSBPUFRJT05TIFdJVEhJTi4KICovCgplcnJvcl9yZXBvcnRpbmcoIEVfRVJST1IgfCBFX1dBUk5JTkcgfCBFX1BBUlNFIHwgRV9OT1RJQ0UgKTsgLy8gSElHSApkZWZpbmUoICdQQl9TVEFOREFMT05FJywgdHJ1ZSApOwpkZWZpbmUoICdQQl9JTVBPUlRCVUREWScsIHRydWUgKTsKCiRwbHVnaW5idWRkeV9zZXR0aW5ncyA9IGFycmF5KAoJCQkJJ3NsdWcnCQkJCQkJPT4JCSdiYWNrdXBidWRkeScsCgkJCQkncGhwX21pbmltdW0nCQkJCT0+CQknNS4yJywKCQkJCSdzZXJpZXMnCQkJCQk9PgkJJycsCgkJCQkncmVtb3RlX2FwaScJCQkJPT4JCScwJywgLy8gU2V0IHRvIDEgYnkgc3RhdGUgZm9yIGRlcGxveW1lbnRzLgoJCQkJJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJwk9PgkJYXJyYXkoKSwgLy8gRGVmYXVsdCBzdGF0ZSB0byBvdmVycmlkZSB0aGUgbWFpbiBkZWZhdWx0cy4gR29vZCBmb3IgYXV0b21hdGluZyBpbXBvcnRzLiBBcHBsaWVkIG92ZXIgZGVmYXVsdHMgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiByZXN0b3JlIGNsYXNzLgoJCQkJJ2RlZmF1bHRfb3B0aW9ucycJCQk9PgkJYXJyYXkoCgkJCQkJCQkJCQkJCQkJJ2JiX3ZlcnNpb24nCQkJCT0+CVBCX0JCX1ZFUlNJT04sCS8vIEJCIHZlcnNpb24gdG8gYmUgZmlsbGVkIGluIG9uIGRvd25sb2FkLgoJCQkJCQkJCQkJCQkJCSdsb2dfbGV2ZWwnCQkJCQk9PgknMycsCQkJCQkJLy8gTGV2ZWwgb2YgZXJyb3IgbG9nZ2luZy4gSW1wb3J0QnVkZHkgQUxXQVlTIGxvZ3MgYXQgbGV2ZWwgMyAoZXZlcnl0aGluZykuCgkJCQkJCQkJCQkJCQkJJ2JhY2t1cF9kaXJlY3RvcnknCQkJPT4JJycsCgkJCQkJCQkJCQkJCQkpLAoJCQkJJ21vZHVsZXMnCQkJCQk9PgkJYXJyYXkoCgkJCQkJCQkJCQkJCQkJJ3VwZGF0ZXInCQkJCT0+CWZhbHNlLAkJCQkJCS8vIExvYWQgUGx1Z2luQnVkZHkgYXV0b21hdGljIHVwZ3JhZGVzLgoJCQkJCQkJCQkJCQkJCSdmaWxlc3lzdGVtJwkJCT0+CXRydWUsCQkJCQkJLy8gRmlsZSBzeXN0ZW0gaGVscGVyIG1ldGhvZHMuCgkJCQkJCQkJCQkJCQkJJ2Zvcm1hdCcJCQkJPT4JdHJ1ZSwJCQkJCQkvLyBUZXh0IC8gZGF0YSBmb3JtYXR0aW5nIGhlbHBlciBtZXRob2RzLgoJCQkJCQkJCQkJCQkJKQoJCQkpOwoKCgovLyAkc2V0dGluZ3MgaXMgZXhwZWN0ZWQgdG8gYmUgcG9wdWxhdGVkIHByaW9yIHRvIGluY2x1ZGluZyBQbHVnaW5CdWRkeSBmcmFtZXdvcmsuIERvIG5vdCBlZGl0IGJlbG93LgpyZXF1aXJlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9wbHVnaW5idWRkeS9fcGx1Z2luYnVkZHkucGhwJyApOwo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/init.php,importbuddy/init.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/init_admin.php,importbuddy/init_admin.php
PD9waHAKcGJfYmFja3VwYnVkZHk6OmxvYWQoKTsKCi8vICoqKioqKioqKiogQUNUSU9OUyAoYWRtaW4pICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBBSkFYIChhZG1pbikgKioqKioqKioqKgoKCgovLyAqKioqKioqKioqIERBU0hCT0FSRCAoYWRtaW4pICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBGSUxURVJTIChhZG1pbikgKioqKioqKioqKgoKCgovLyAqKioqKioqKioqIFBBR0VTIChhZG1pbikgKioqKioqKioqKgoKCgovLyAqKioqKioqKioqIExJQlJBUklFUyAmIENMQVNTRVMgKGFkbWluKSAqKioqKioqKioqCnJlcXVpcmVfb25jZSggJ2NsYXNzZXMvY29yZS5waHAnICk7CgpyZXF1aXJlX29uY2UoICdjbGFzc2VzL2ltcG9ydC5waHAnICk7CnBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snaW1wb3J0J10gPSBuZXcgcGJfYmFja3VwYnVkZHlfaW1wb3J0KCk7CgoKLy8gKioqKioqKioqKiBPVEhFUiAoYWRtaW4pICoqKioqKioqKioKCgoKPz4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/init_admin.php,importbuddy/init_admin.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/init_global.php,importbuddy/init_global.php
PD9waHAKaWYgKCAhIGNsYXNzX2V4aXN0cyggJ2JhY2t1cGJ1ZGR5X2NvcmUnICkgKSB7CglyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2NvcmUucGhwJyApOwp9CnJlcXVpcmVfb25jZSggQUJTUEFUSCAuICdpbXBvcnRidWRkeS9jbGFzc2VzL2F1dGgucGhwJyApOwoKLy8gSWYgdmVyaWZpY2F0aW9uIGNvZGUgcGFzc2VkIHRoZW4gYXV0aGVudGljYXRlIGVhcmx5LgppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGlzcGxheV9tb2RlJyApID09ICdlbWJlZCcgKSB7CglBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7Cn0KCmdsb2JhbCAkaW1wb3J0YnVkZHlfZmlsZTsKJGltcG9ydF9zZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKaWYgKCAnJyAhPSAkaW1wb3J0X3NlcmlhbCApIHsgLy8gaW1wb3J0YnVkZHkgaGFzIGEgc2VyaWFsLiBMb29rIGZvciBhIGRlZmF1bHQgc3RhdGUgZmlsZSB0aGF0IG1hdGNoZXMuCglwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSA9ICRpbXBvcnRfc2VyaWFsOwoJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQoJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdpbXBvcnRidWRkeS0nIC4gJGltcG9ydF9zZXJpYWwgLiAnLXN0YXRlLnBocCcgKSApIHsgLy8gRGVmYXVsdCBzdGF0ZSBleGlzdHMuCgkJCgkJLy8gSWYgYW4gb3ZlcnJpZGluZyBzdGF0ZSBmaWxlIGV4aXN0cyB0aGVuIGxvYWQgaXQgb3ZlciB0aGUgY3VycmVudCBzdGF0ZS4KCQkkb3ZlcnJpZGVfc3RhdGVfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRfc2VyaWFsIC4gJy1zdGF0ZS5waHAnOwoJCWlmICggZmlsZV9leGlzdHMoICRvdmVycmlkZV9zdGF0ZV9maWxlICkgKSB7CgkJCSRzdGF0ZWRhdGEgPSBmaWxlX2dldF9jb250ZW50cyggJG92ZXJyaWRlX3N0YXRlX2ZpbGUgKTsKCQkJLy8gVW5zZXJpYWxpemUgZGF0YTsgSWYgaXQgZmFpbHMgaXQgdGhlbiBkZWNvZGVzIHRoZSBvYnNjdWZhdGVkIGRhdGEgdGhlbiB1bnNlcmlhbGl6ZXMgaXQuLgoJCQlpZiAoICFpc19zZXJpYWxpemVkKCAkc3RhdGVkYXRhICkgfHwgKCBmYWxzZSA9PT0gKCAkcmV0dXJuID0gdW5zZXJpYWxpemUoICRzdGF0ZWRhdGEgKSApICkgKSB7CgkJCQkvLyBTa2lwIGZpcnN0IGxpbmUuCgkJCQkkc2Vjb25kX2xpbmVfcG9zID0gc3RycG9zKCAkc3RhdGVkYXRhLCAiXG4iICkgKyAxOwoJCQkJJHN0YXRlZGF0YSA9IHN1YnN0ciggJHN0YXRlZGF0YSwgJHNlY29uZF9saW5lX3BvcyApOwoJCQkJLy8gRGVjb2RlIGJhY2sgaW50byBhbiBhcnJheS4KCQkJCSRzdGF0ZWRhdGEgPSB1bnNlcmlhbGl6ZSggYmFzZTY0X2RlY29kZSggJHN0YXRlZGF0YSApICk7CgkJCX0KCQkJaWYgKCBpc19hcnJheSggJHN0YXRlZGF0YSApICkgeyAvLyBWYWxpZCBjb250ZW50LgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGVkIGRlZmF1bHQgc3RhdGUgb3ZlcndyaXRlIGZpbGUgZGF0YSBhbmQgZ2F2ZSBpdCBwcmlvcml0eSBvdmVyIGN1cnJlbnQgc3RhdGUuIEZpbGU6IGAnIC4gJG92ZXJyaWRlX3N0YXRlX2ZpbGUgLiAnYC4nICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gPSAkc3RhdGVkYXRhOwoJCQkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ0RlZmF1bHQgc3RhdGUgb3ZlcndyaXRlIGZpbGUgZm91bmQgYnV0IHVuYWJsZSB0byBhY2Nlc3MgaXQuJyApOwoJCQl9CgkJfQoJCQoJfQp9CgovLyBIYW5kbGUgQVBJIGNhbGxzIGlmIGJhY2t1cGJ1ZGR5X2FwaV9rZXkgaXMgcG9zdGVkLiBJZiBhbnl0aGluZyBmYWlscyBzZWN1cml0eSBjaGVja3MgcHJldGVuZCBub3RoaW5nIGF0IGFsbCBoYXBwZW5lZC4KaWYgKCAnJyAhPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdiYWNrdXBidWRkeV9hcGlfa2V5JyApICkgeyAvLyBSZW1vdGUgQVBJIGFjY2Vzcy4KCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncmVtb3RlX2FwaSddWydrZXlzJ10gKSAmJiAoIGNvdW50KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9hcGknXVsna2V5cyddICkgPiAwICkgKSB7IC8vIFJlbW90ZSBBUEkgZW5hYmxlZCBhbmQgMSBvciBtb3JlIGtleXMgZGVmaW5lZC4KCQlpbmNsdWRlKCAnY2xhc3Nlcy9yZW1vdGVfYXBpLnBocCcgKTsKCQliYWNrdXBidWRkeV9yZW1vdGVfYXBpOjpsb2NhbENhbGwoICRzZWN1cmUgPSB0cnVlLCAkaW1wb3J0YnVkZHkgPSB0cnVlICk7CgkJZGllKCk7Cgl9Cn0KCmlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkaXNwbGF5X21vZGUnICkgPT0gJ2VtYmVkJyApIHsKCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGlzcGxheV9tb2RlJ10gPSAnZW1iZWQnOwoJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKfQoKLy8gKioqKioqKioqKiBBQ1RJT05TIChnbG9iYWwpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBBSkFYIChnbG9iYWwpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBDUk9OIChnbG9iYWwpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBGSUxURVJTIChnbG9iYWwpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBXSURHRVRTIChnbG9iYWwpICoqKioqKioqKioKCgoKPz4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/init_global.php,importbuddy/init_global.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/init_public.php,importbuddy/init_public.php
PD9waHAKCgoKLy8gKioqKioqKioqKiBBQ1RJT05TIChwdWJsaWMpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBBSkFYIChwdWJsaWMpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBGSUxURVJTIChwdWJsaWMpICoqKioqKioqKioKCgoKLy8gKioqKioqKioqKiBTSE9SVENPREVTIChwdWJsaWMpICoqKioqKioqKioKCgoKPz4K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/init_public.php,importbuddy/init_public.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/license.txt,importbuddy/license.txt
CQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKCiBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAogICAgICAgICAgICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCgogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCiBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KCgkJCSAgICBQcmVhbWJsZQoKICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCmZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwp1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5CnRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwp5b3VyIHByb2dyYW1zLCB0b28uCgogIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQpoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCnRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAppZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAppbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCgogIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgpUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQpkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCgogIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0CnlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCnNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKcmlnaHRzLgoKICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCigyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCmRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCgogIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCnRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCnNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQp3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwp0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAphdXRob3JzJyByZXB1dGF0aW9ucy4KCiAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQpwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCnByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQpwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgoKICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAptb2RpZmljYXRpb24gZm9sbG93LgoKCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCgogIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LApyZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgp0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KCkFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90CmNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQppcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgpXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KCiAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCnNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQpjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCmNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwphbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCmFsb25nIHdpdGggdGhlIFByb2dyYW0uCgpZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KCiAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgpvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCmRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQphYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgoKICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwogICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KCiAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQogICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KCiAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CiAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCiAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCiAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQogICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgogICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CiAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCiAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKClRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCnRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CmRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZApvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgpUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKeW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCmV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgpjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgoKSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQp3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KCiAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCnVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgpTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CgogICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQogICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCiAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKCiAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQogICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCiAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCgogICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCiAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQogICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAogICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCgpUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCm1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCmNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55CmFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwpjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCnNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQphbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQpmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQpvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAppdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCgpJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCmFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCmRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdApjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgoKICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdApvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgpIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgp0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaApwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCgogIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdApzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgpkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQptb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwp0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KCiAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQpvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCnRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCnJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KdGhpcyBMaWNlbnNlLgoKICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CmluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCmNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdApleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdApkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCkxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudApsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CmFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgp0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCnJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCgpJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwphcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgpjaXJjdW1zdGFuY2VzLgoKSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQpwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQpzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCmludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwppbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAp0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdApzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCnRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAppbXBvc2UgdGhhdCBjaG9pY2UuCgpUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCgogIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCmNlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQpvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCm1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwp0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCmNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwp0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KCiAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCmJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bwphZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCkVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0Kc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwplaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQpTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCnRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbi4KCiAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQpwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCnRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQpTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZApvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KCgkJCSAgICBOTyBXQVJSQU5UWQoKICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCk9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwpUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFClBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLApSRVBBSVIgT1IgQ09SUkVDVElPTi4KCiAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwpXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SClJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCklOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwpPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEClRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQpZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgpQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgoKCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwoK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/license.txt,importbuddy/license.txt
###PACKDATA,FILE_START,/_importbuddy/importbuddy/readme.txt,importbuddy/readme.txt
ICogV2Vic2l0ZTogaHR0cDovL2l0aGVtZXMuY29tCiAqCiAqIEluc3RhbGxhdGlvbjoKICogCiAqIDEuIERvd25sb2FkIGFuZCB1bnppcCB0aGUgbGF0ZXN0IHJlbGVhc2UgemlwIGZpbGUKICogMi4gSWYgeW91IHVzZSB0aGUgV29yZFByZXNzIHBsdWdpbiB1cGxvYWRlciB0byBpbnN0YWxsIHRoaXMgcGx1Z2luIHNraXAgdG8gc3RlcCA0LgogKiAzLiBVcGxvYWQgdGhlIGVudGlyZSBwbHVnaW4gZGlyZWN0b3J5IHRvIHlvdXIgYC93cC1jb250ZW50L3BsdWdpbnMvYCBkaXJlY3RvcnkKICogNC4gQWN0aXZhdGUgdGhlIHBsdWdpbiB0aHJvdWdoIHRoZSAnUGx1Z2lucycgbWVudSBpbiBXb3JkUHJlc3MgQWRtaW5pc3RyYXRpb24KICogCiAqIFVzYWdlOgogKiAKICogMS4gTmF2aWdhdGUgdG8gdGhlIG5ldyBtZW51IGZvciB0aGlzIHBsdWdpbiBpbiB0aGUgV29yZHByZXNzIEFkbWluaXN0cmF0aW9uIFBhbmVsCiAqIDIuIFNlbGVjdCAnR2V0dGluZyBTdGFydGVkJyBmb3IgaW5zdHJ1Y3Rpb25zIGFuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgogKg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/readme.txt,importbuddy/readme.txt
###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/auth.php,importbuddy/classes/auth.php
PD9waHAKY2xhc3MgQXV0aCB7CgkKCWNvbnN0IE1BWF9MT0dJTl9BVFRFTVBUU19BTExPV0VEID0gNDsgLy8gTWF4aW11bSBudW1iZXIgb2YgaW52YWxpZCBsb2dpbiBhdHRlbXB0cyBiZWZvcmUgbG9ja2luZyBpbXBvcnRidWRkeS4KCWNvbnN0IFJFU0VUX0RFRkFVTFRTX09OX0lOVkFMSURfTE9HSU4gPSBmYWxzZTsgLy8gV2hldGhlciBvciBub3QgcmVzZXQgYWxsIHNldHRpbmdzL29wdGlvbnMgYmFjayB0byBkZWZhdWx0cyBvbiBsb2dpbiBmYWlsdXJlLgoJY29uc3QgQ09PS0lFX0VYUElSQVRJT04gPSAzNjAwOyAvLyBOdW1iZXIgb2Ygc2Vjb25kcyBhbiBpbXBvcnRidWRkeSBjb29raWUgaXMgdmFsaWQgZm9yLgoJcHJpdmF0ZSBzdGF0aWMgJF9hdXRoZW50aWNhdGVkID0gZmFsc2U7IC8vIFdoZXRoZXIgdXNlciBpcyB2YWxpZGx5IGF1dGhlbnRpY2F0ZWQgb3Igbm90LgoJcHJpdmF0ZSBzdGF0aWMgJF9jaGVja2VkID0gZmFsc2U7IC8vIFdoZXRoZXIgY2hlY2soKSBoYXMgYmVlbiBydW4geWV0LgoJCgkKCQoJLyogY2hlY2soKQoJICoKCSAqIENoZWNrIGF1dGhlbnRpY2F0aW9uIGJhc2VkIG9uIGZvcm0gZGF0YSBzdWJtaXR0ZWQuIFRoaXMgb25seSBuZWVkcyB0byBiZSBydW4gb25jZS4gVXNlIGlzX2F1dGhlbnRpY2F0ZWQoKSB0byBkZXRlcm1pbmUgYXV0aCBzdGF0dXMuCgkgKgoJICogQHBhcmFtCWZvcmNlX2NoZWNrCQlib29sCUlmIHRydWUgdGhlbiB3aWxsIHJlLWNoZWNrIGV2ZW4gaWYgY2hlY2soKSBoYXMgYWxyZWFkeSBiZWVuIHJ1biB0aGlzIHNlc3Npb24uCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrKCAkZm9yY2VfY2hlY2sgPSBmYWxzZSApIHsKCQkKCQlpZiAoICggdHJ1ZSA9PT0gc2VsZjo6JF9jaGVja2VkICkgJiYgKCAkZm9yY2VfY2hlY2sgPT09IGZhbHNlICkgKSB7IC8vIFNraXAgY2hlY2tpbmcgaWYgYWxyZWFkeSBza2lwcGVkIHVubGVzcyBmb3JjaW5nLgoJCQlyZXR1cm4gc2VsZjo6aXNfYXV0aGVudGljYXRlZCgpOwoJCX0KCQkKCQkkbG9naW5fYXR0ZW1wdF9maWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS9fbG9naW5fYXR0ZW1wdHMucGhwJzsKCQkkbG9naW5fYXR0ZW1wdHMgPSAxOwoJCWlmICggZmlsZV9leGlzdHMoICRsb2dpbl9hdHRlbXB0X2ZpbGUgKSApIHsKCQkJJGxvZ2luX2F0dGVtcHRzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCAkbG9naW5fYXR0ZW1wdF9maWxlICk7CgkJfQoJCWlmICggZmFsc2UgIT09ICRsb2dpbl9hdHRlbXB0cyApIHsKCQkJJGxvZ2luX2F0dGVtcHRzID0gdHJpbSggc3RyX3JlcGxhY2UoICc8P3BocCBkaWUoKTsgPz4nLCAnJywgJGxvZ2luX2F0dGVtcHRzICkgKTsKCQkJaWYgKCAkbG9naW5fYXR0ZW1wdHMgPiBzZWxmOjpNQVhfTE9HSU5fQVRURU1QVFNfQUxMT1dFRCApIHsKCQkJCWRpZSggJ0FjY2VzcyBEZW5pZWQuIE1heGltdW0gbG9naW4gYXR0ZW1wdHMgZXhjZWVkZWQuIFlvdSBtdXN0IGRlbGV0ZSB0aGUgZmlsZSAiX2xvZ2luX2F0dGVtcHRzLnBocCIgaW4gdGhlIGltcG9ydGJ1ZGR5IGRpcmVjdG9yeSBvbiB5b3VyIHNlcnZlciB0byB1bmxvY2sgdGhpcyBJbXBvcnRCdWRkeSB0byBhbGxvdyBpdCB0byBjb250aW51ZS4nICk7CgkJCX0KCQl9CgkJCgkJJGFjdHVhbF9wYXNzX2hhc2ggPSBQQl9QQVNTV09SRDsKCQlpZiAoICggJyNQQVNTV09SRCMnID09ICRhY3R1YWxfcGFzc19oYXNoICkgfHwgKCAnJyA9PSAkYWN0dWFsX3Bhc3NfaGFzaCApICkgeyBkaWUoICdFcnJvciAjODQ1Nzg0NTk3NDUuIEEgcGFzc3dvcmQgbXVzdCBiZSBzZXQuJyApOyB9CgkJCgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwYXNzd29yZCcgKSAhPSAnJyApIHsKCQkJJHN1cHBsaWVkX3Bhc3NfaGFzaCA9IG1kNSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncGFzc3dvcmQnICkgKTsKCQl9IGVsc2VpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncGFzc3dvcmQnICkgIT0gJycgKSB7CgkJCSRzdXBwbGllZF9wYXNzX2hhc2ggPSBtZDUoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncGFzc3dvcmQnICkgKTsKCQl9IGVsc2UgewoJCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAndicgKSAhPSAnJyApIHsgLy8gSGFzaCBzdWJtaXR0ZWQgYnkgbWFnaWMgbWlncmF0aW9uLgoJCQkJJHN1cHBsaWVkX3Bhc3NfaGFzaCA9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAndicgKTsKCQkJfSBlbHNlIHsgLy8gTm9ybWFsIGZvcm0gc3VibWl0dGVkIGhhc2guCgkJCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3NfaGFzaCcgKSAhPSAnJyApIHsKCQkJCQkkc3VwcGxpZWRfcGFzc19oYXNoID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncGFzc19oYXNoJyApOwoJCQkJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwYl9iYWNrdXBidWRkeV9wYXNzX2hhc2gnICkgIT0gJycgKSB7CgkJCQkJJHN1cHBsaWVkX3Bhc3NfaGFzaCA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3BiX2JhY2t1cGJ1ZGR5X3Bhc3NfaGFzaCcgKTsKCQkJCX0gZWxzZSB7CgkJCQkJJHN1cHBsaWVkX3Bhc3NfaGFzaCA9ICcnOwoJCQkJfQoJCQl9CgkJfQoJCQoJCWlmICggJHN1cHBsaWVkX3Bhc3NfaGFzaCA9PSAkYWN0dWFsX3Bhc3NfaGFzaCApIHsKCQkJc2VsZjo6JF9hdXRoZW50aWNhdGVkID0gdHJ1ZTsKCQkJc2V0Y29va2llKCAnaW1wb3J0YnVkZHlfbG9naW4nLCBtZDUoIFBCX1BBU1NXT1JEIC4gJ2JhZGdlcnMnICksICggdGltZSgpKyBzZWxmOjpDT09LSUVfRVhQSVJBVElPTiApICk7CgkJfSBlbHNlaWYgKCBpc3NldCggJF9DT09LSUVbJ2ltcG9ydGJ1ZGR5X2xvZ2luJ10gKSAmJiAoICRfQ09PS0lFWydpbXBvcnRidWRkeV9sb2dpbiddICE9ICcnICkgJiYgKCAkX0NPT0tJRVsnaW1wb3J0YnVkZHlfbG9naW4nXSA9PSBtZDUoIFBCX1BBU1NXT1JEIC4gJ2JhZGdlcnMnICkgKSApIHsKCQkJc2VsZjo6JF9hdXRoZW50aWNhdGVkID0gdHJ1ZTsKCQkJc2V0Y29va2llKCAnaW1wb3J0YnVkZHlfbG9naW4nLCBtZDUoIFBCX1BBU1NXT1JEIC4gJ2JhZGdlcnMnICksICggdGltZSgpICsgc2VsZjo6Q09PS0lFX0VYUElSQVRJT04gKSApOwoJCX0gZWxzZSB7IC8vIEluY29ycmVjdCBoYXNoLiBSZXNldCBzZXR0aW5ncyAmIHRyYWNrIGF0dGVtcHRzLgoJCQlpZiAoICcnICE9ICRzdXBwbGllZF9wYXNzX2hhc2ggKSB7IC8vIERvbnQgY291bnQgYmxhbmsgaGFzaCBhcyBhbiBhdHRlbXB0LgoJCQkJaWYgKCB0cnVlID09PSBzZWxmOjpSRVNFVF9ERUZBVUxUU19PTl9JTlZBTElEX0xPR0lOICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpyZXNldF9kZWZhdWx0cygpOwoJCQkJfQoJCQkJaWYgKCBmYWxzZSAhPT0gJGxvZ2luX2F0dGVtcHRzICkgewoJCQkJCWdsb2JhbCAkcGJfbG9naW5fYXR0ZW1wdHM7CgkJCQkJJHBiX2xvZ2luX2F0dGVtcHRzID0gJGxvZ2luX2F0dGVtcHRzOwoJCQkJCUBmaWxlX3B1dF9jb250ZW50cyggJGxvZ2luX2F0dGVtcHRfZmlsZSwgJzw/cGhwIGRpZSgpOyA/PicgLiAoICRsb2dpbl9hdHRlbXB0cyArIDEgKSApOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXNlbGY6OiRfY2hlY2tlZCA9IHRydWU7CgkJCgkJcmV0dXJuIHNlbGY6OiRfYXV0aGVudGljYXRlZDsKCQkKCX0gLy8gRW5kIGNoZWNrKCkuCgkKCQoJCgkvKiBpc19hdXRoZW50aWNhdGVkKCkKCSAqCgkgKiBEZXRlcm1pbmUgd2hldGhlciB1c2VyIGlzIGZ1bGx5IGF1dGhlbnRpY2F0ZWQgb3Igbm90LgoJICoKCSAqIEByZXR1cm4JCWJvb2wJCVRydWUgaWYgZnVsbHkgYXV0aGVudGljYXRlZCwgb3RoZXJ3aXNlIGZhbHNlLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc19hdXRoZW50aWNhdGVkKCkgewoJCQoJCXJldHVybiBzZWxmOjokX2F1dGhlbnRpY2F0ZWQ7CgkJCgl9IC8vIEVuZCBhdXRoZW50aWNhdGVkKCkuCgkKCQoJCgkvKiByZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCkKCSAqCgkgKiBSZXF1aXJlcyB2YWxpZCBhdXRoZW50aWNhdGlvbiB0byBhbGxvdyBwcm9jZWVkaW5nLiBkaWUoKSBpZiBub3QgbG9nZ2VkIGluLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCkgewoJCQoJCS8vIENoZWNrIGlmIHByZXZpb3VzbHkgYXV0aGVkIGFscmVhZHkgdGhpcyBzZXNzaW9uLgoJCWlmICggdHJ1ZSA9PT0gc2VsZjo6aXNfYXV0aGVudGljYXRlZCgpICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJCgkJc2VsZjo6Y2hlY2soKTsKCQlpZiAoIHRydWUgPT09IHNlbGY6OmlzX2F1dGhlbnRpY2F0ZWQoKSApIHsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsKCQkJZGllKCAnQWNjZXNzIERlbmllZC4gWW91IG11c3QgbG9nIGluIGZpcnN0LiBQbGVhc2UgcmV0dXJuIHRvIHRoZSA8YSBocmVmPSJpbXBvcnRidWRkeS5waHAiPmltcG9ydGJ1ZGR5LnBocCBob21lcGFnZTwvYT4gYXV0aGVudGljYXRlLicgKTsKCQl9CgkJCgl9IC8vIEVuZCByZXF1aXJlX2F1dGhvcml6YXRpb24oKTsKCQp9IC8vIEVuZCBjbGFzcy4KCgo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/auth.php,importbuddy/classes/auth.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/classes/wp-db.php,importbuddy/classes/wp-db.php
PD9waHAKLyoqCiAqIFdvcmRQcmVzcyBEQiBDbGFzcwogKgogKiBPcmlnaW5hbCBjb2RlIGZyb20ge0BsaW5rIGh0dHA6Ly9waHAuanVzdGludmluY2VudC5jb20gSnVzdGluIFZpbmNlbnQgKGp1c3RpbkB2aXN1bmV0LmllKX0KICoKICogQHBhY2thZ2UgV29yZFByZXNzCiAqIEBzdWJwYWNrYWdlIERhdGFiYXNlCiAqIEBzaW5jZSAwLjcxCiAqLwoKLyoqCiAqIEBzaW5jZSAwLjcxCiAqLwpkZWZpbmUoICdFWlNRTF9WRVJTSU9OJywgJ1dQMS4yNScgKTsKCi8qKgogKiBAc2luY2UgMC43MQogKi8KZGVmaW5lKCAnT0JKRUNUJywgJ09CSkVDVCcsIHRydWUgKTsKCi8qKgogKiBAc2luY2UgMi41LjAKICovCmRlZmluZSggJ09CSkVDVF9LJywgJ09CSkVDVF9LJyApOwoKLyoqCiAqIEBzaW5jZSAwLjcxCiAqLwpkZWZpbmUoICdBUlJBWV9BJywgJ0FSUkFZX0EnICk7CgovKioKICogQHNpbmNlIDAuNzEKICovCmRlZmluZSggJ0FSUkFZX04nLCAnQVJSQVlfTicgKTsKCi8qKgogKiBXb3JkUHJlc3MgRGF0YWJhc2UgQWNjZXNzIEFic3RyYWN0aW9uIE9iamVjdAogKgogKiBJdCBpcyBwb3NzaWJsZSB0byByZXBsYWNlIHRoaXMgY2xhc3Mgd2l0aCB5b3VyIG93bgogKiBieSBzZXR0aW5nIHRoZSAkd3BkYiBnbG9iYWwgdmFyaWFibGUgaW4gd3AtY29udGVudC9kYi5waHAKICogZmlsZSB0byB5b3VyIGNsYXNzLiBUaGUgd3BkYiBjbGFzcyB3aWxsIHN0aWxsIGJlIGluY2x1ZGVkLAogKiBzbyB5b3UgY2FuIGV4dGVuZCBpdCBvciBzaW1wbHkgdXNlIHlvdXIgb3duLgogKgogKiBAbGluayBodHRwOi8vY29kZXgud29yZHByZXNzLm9yZy9GdW5jdGlvbl9SZWZlcmVuY2Uvd3BkYl9DbGFzcwogKgogKiBAcGFja2FnZSBXb3JkUHJlc3MKICogQHN1YnBhY2thZ2UgRGF0YWJhc2UKICogQHNpbmNlIDAuNzEKICovCmNsYXNzIHdwZGIgewoKCS8qKgoJICogV2hldGhlciB0byBzaG93IFNRTC9EQiBlcnJvcnMKCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGJvb2wKCSAqLwoJdmFyICRzaG93X2Vycm9ycyA9IGZhbHNlOwoKCS8qKgoJICogV2hldGhlciB0byBzdXBwcmVzcyBlcnJvcnMgZHVyaW5nIHRoZSBEQiBib290c3RyYXBwaW5nLgoJICoKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNpbmNlIDIuNS4wCgkgKiBAdmFyIGJvb2wKCSAqLwoJdmFyICRzdXBwcmVzc19lcnJvcnMgPSBmYWxzZTsKCgkvKioKCSAqIFRoZSBsYXN0IGVycm9yIGR1cmluZyBxdWVyeS4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkbGFzdF9lcnJvciA9ICcnOwoKCS8qKgoJICogQW1vdW50IG9mIHF1ZXJpZXMgbWFkZQoJICoKCSAqIEBzaW5jZSAxLjIuMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGludAoJICovCgl2YXIgJG51bV9xdWVyaWVzID0gMDsKCgkvKioKCSAqIENvdW50IG9mIHJvd3MgcmV0dXJuZWQgYnkgcHJldmlvdXMgcXVlcnkKCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGludAoJICovCgl2YXIgJG51bV9yb3dzID0gMDsKCgkvKioKCSAqIENvdW50IG9mIGFmZmVjdGVkIHJvd3MgYnkgcHJldmlvdXMgcXVlcnkKCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGludAoJICovCgl2YXIgJHJvd3NfYWZmZWN0ZWQgPSAwOwoKCS8qKgoJICogVGhlIElEIGdlbmVyYXRlZCBmb3IgYW4gQVVUT19JTkNSRU1FTlQgY29sdW1uIGJ5IHRoZSBwcmV2aW91cyBxdWVyeSAodXN1YWxseSBJTlNFUlQpLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJdmFyICRpbnNlcnRfaWQgPSAwOwoKCS8qKgoJICogTGFzdCBxdWVyeSBtYWRlCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGxhc3RfcXVlcnk7CgoJLyoqCgkgKiBSZXN1bHRzIG9mIHRoZSBsYXN0IHF1ZXJ5IG1hZGUKCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAdmFyIGFycmF5fG51bGwKCSAqLwoJdmFyICRsYXN0X3Jlc3VsdDsKCgkvKioKCSAqIE15U1FMIHJlc3VsdCwgd2hpY2ggaXMgZWl0aGVyIGEgcmVzb3VyY2Ugb3IgYm9vbGVhbi4KCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgbWl4ZWQKCSAqLwoJcHJvdGVjdGVkICRyZXN1bHQ7CgoJLyoqCgkgKiBTYXZlZCBpbmZvIG9uIHRoZSB0YWJsZSBjb2x1bW4KCSAqCgkgKiBAc2luY2UgMC43MQoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgYXJyYXkKCSAqLwoJcHJvdGVjdGVkICRjb2xfaW5mbzsKCgkvKioKCSAqIFNhdmVkIHF1ZXJpZXMgdGhhdCB3ZXJlIGV4ZWN1dGVkCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICRxdWVyaWVzOwoKCS8qKgoJICogV29yZFByZXNzIHRhYmxlIHByZWZpeAoJICoKCSAqIFlvdSBjYW4gc2V0IHRoaXMgdG8gaGF2ZSBtdWx0aXBsZSBXb3JkUHJlc3MgaW5zdGFsbGF0aW9ucwoJICogaW4gYSBzaW5nbGUgZGF0YWJhc2UuIFRoZSBzZWNvbmQgcmVhc29uIGlzIGZvciBwb3NzaWJsZQoJICogc2VjdXJpdHkgcHJlY2F1dGlvbnMuCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkcHJlZml4ID0gJyc7CgoJLyoqCgkgKiBXaGV0aGVyIHRoZSBkYXRhYmFzZSBxdWVyaWVzIGFyZSByZWFkeSB0byBzdGFydCBleGVjdXRpbmcuCgkgKgoJICogQHNpbmNlIDIuMy4yCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEB2YXIgYm9vbAoJICovCgl2YXIgJHJlYWR5ID0gZmFsc2U7CgoJLyoqCgkgKiB7QGludGVybmFsIE1pc3NpbmcgRGVzY3JpcHRpb259fQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgaW50CgkgKi8KCXZhciAkYmxvZ2lkID0gMDsKCgkvKioKCSAqIHtAaW50ZXJuYWwgTWlzc2luZyBEZXNjcmlwdGlvbn19CgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBpbnQKCSAqLwoJdmFyICRzaXRlaWQgPSAwOwoKCS8qKgoJICogTGlzdCBvZiBXb3JkUHJlc3MgcGVyLWJsb2cgdGFibGVzCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzZWUgd3BkYjo6dGFibGVzKCkKCSAqIEB2YXIgYXJyYXkKCSAqLwoJdmFyICR0YWJsZXMgPSBhcnJheSggJ3Bvc3RzJywgJ2NvbW1lbnRzJywgJ2xpbmtzJywgJ29wdGlvbnMnLCAncG9zdG1ldGEnLAoJCSd0ZXJtcycsICd0ZXJtX3RheG9ub215JywgJ3Rlcm1fcmVsYXRpb25zaGlwcycsICdjb21tZW50bWV0YScgKTsKCgkvKioKCSAqIExpc3Qgb2YgZGVwcmVjYXRlZCBXb3JkUHJlc3MgdGFibGVzCgkgKgoJICogY2F0ZWdvcmllcywgcG9zdDJjYXQsIGFuZCBsaW5rMmNhdCB3ZXJlIGRlcHJlY2F0ZWQgaW4gMi4zLjAsIGRiIHZlcnNpb24gNTUzOQoJICoKCSAqIEBzaW5jZSAyLjkuMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIHdwZGI6OnRhYmxlcygpCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkb2xkX3RhYmxlcyA9IGFycmF5KCAnY2F0ZWdvcmllcycsICdwb3N0MmNhdCcsICdsaW5rMmNhdCcgKTsKCgkvKioKCSAqIExpc3Qgb2YgV29yZFByZXNzIGdsb2JhbCB0YWJsZXMKCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICogQHNlZSB3cGRiOjp0YWJsZXMoKQoJICogQHZhciBhcnJheQoJICovCgl2YXIgJGdsb2JhbF90YWJsZXMgPSBhcnJheSggJ3VzZXJzJywgJ3VzZXJtZXRhJyApOwoKCS8qKgoJICogTGlzdCBvZiBNdWx0aXNpdGUgZ2xvYmFsIHRhYmxlcwoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKiBAc2VlIHdwZGI6OnRhYmxlcygpCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkbXNfZ2xvYmFsX3RhYmxlcyA9IGFycmF5KCAnYmxvZ3MnLCAnc2lnbnVwcycsICdzaXRlJywgJ3NpdGVtZXRhJywKCQknc2l0ZWNhdGVnb3JpZXMnLCAncmVnaXN0cmF0aW9uX2xvZycsICdibG9nX3ZlcnNpb25zJyApOwoKCS8qKgoJICogV29yZFByZXNzIENvbW1lbnRzIHRhYmxlCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRjb21tZW50czsKCgkvKioKCSAqIFdvcmRQcmVzcyBDb21tZW50IE1ldGFkYXRhIHRhYmxlCgkgKgoJICogQHNpbmNlIDIuOS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRjb21tZW50bWV0YTsKCgkvKioKCSAqIFdvcmRQcmVzcyBMaW5rcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkbGlua3M7CgoJLyoqCgkgKiBXb3JkUHJlc3MgT3B0aW9ucyB0YWJsZQoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkb3B0aW9uczsKCgkvKioKCSAqIFdvcmRQcmVzcyBQb3N0IE1ldGFkYXRhIHRhYmxlCgkgKgoJICogQHNpbmNlIDEuNS4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRwb3N0bWV0YTsKCgkvKioKCSAqIFdvcmRQcmVzcyBQb3N0cyB0YWJsZQoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkcG9zdHM7CgoJLyoqCgkgKiBXb3JkUHJlc3MgVGVybXMgdGFibGUKCSAqCgkgKiBAc2luY2UgMi4zLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJHRlcm1zOwoKCS8qKgoJICogV29yZFByZXNzIFRlcm0gUmVsYXRpb25zaGlwcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAyLjMuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkdGVybV9yZWxhdGlvbnNoaXBzOwoKCS8qKgoJICogV29yZFByZXNzIFRlcm0gVGF4b25vbXkgdGFibGUKCSAqCgkgKiBAc2luY2UgMi4zLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJHRlcm1fdGF4b25vbXk7CgoJLyoKCSAqIEdsb2JhbCBhbmQgTXVsdGlzaXRlIHRhYmxlcwoJICovCgoJLyoqCgkgKiBXb3JkUHJlc3MgVXNlciBNZXRhZGF0YSB0YWJsZQoJICoKCSAqIEBzaW5jZSAyLjMuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkdXNlcm1ldGE7CgoJLyoqCgkgKiBXb3JkUHJlc3MgVXNlcnMgdGFibGUKCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJHVzZXJzOwoKCS8qKgoJICogTXVsdGlzaXRlIEJsb2dzIHRhYmxlCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRibG9nczsKCgkvKioKCSAqIE11bHRpc2l0ZSBCbG9nIFZlcnNpb25zIHRhYmxlCgkgKgoJICogQHNpbmNlIDMuMC4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRibG9nX3ZlcnNpb25zOwoKCS8qKgoJICogTXVsdGlzaXRlIFJlZ2lzdHJhdGlvbiBMb2cgdGFibGUKCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIHN0cmluZwoJICovCgl2YXIgJHJlZ2lzdHJhdGlvbl9sb2c7CgoJLyoqCgkgKiBNdWx0aXNpdGUgU2lnbnVwcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkc2lnbnVwczsKCgkvKioKCSAqIE11bHRpc2l0ZSBTaXRlcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkc2l0ZTsKCgkvKioKCSAqIE11bHRpc2l0ZSBTaXRld2lkZSBUZXJtcyB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkc2l0ZWNhdGVnb3JpZXM7CgoJLyoqCgkgKiBNdWx0aXNpdGUgU2l0ZSBNZXRhZGF0YSB0YWJsZQoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkc2l0ZW1ldGE7CgoJLyoqCgkgKiBGb3JtYXQgc3BlY2lmaWVycyBmb3IgREIgY29sdW1ucy4gQ29sdW1ucyBub3QgbGlzdGVkIGhlcmUgZGVmYXVsdCB0byAlcy4gSW5pdGlhbGl6ZWQgZHVyaW5nIFdQIGxvYWQuCgkgKgoJICogS2V5cyBhcmUgY29sdW1uIG5hbWVzLCB2YWx1ZXMgYXJlIGZvcm1hdCB0eXBlczogJ0lEJyA9PiAnJWQnCgkgKgoJICogQHNpbmNlIDIuOC4wCgkgKiBAc2VlIHdwZGI6OnByZXBhcmUoKQoJICogQHNlZSB3cGRiOjppbnNlcnQoKQoJICogQHNlZSB3cGRiOjp1cGRhdGUoKQoJICogQHNlZSB3cGRiOjpkZWxldGUoKQoJICogQHNlZSB3cF9zZXRfd3BkYl92YXJzKCkKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGFycmF5CgkgKi8KCXZhciAkZmllbGRfdHlwZXMgPSBhcnJheSgpOwoKCS8qKgoJICogRGF0YWJhc2UgdGFibGUgY29sdW1ucyBjaGFyc2V0CgkgKgoJICogQHNpbmNlIDIuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRjaGFyc2V0OwoKCS8qKgoJICogRGF0YWJhc2UgdGFibGUgY29sdW1ucyBjb2xsYXRlCgkgKgoJICogQHNpbmNlIDIuMi4wCgkgKiBAYWNjZXNzIHB1YmxpYwoJICogQHZhciBzdHJpbmcKCSAqLwoJdmFyICRjb2xsYXRlOwoKCS8qKgoJICogRGF0YWJhc2UgVXNlcm5hbWUKCSAqCgkgKiBAc2luY2UgMi45LjAKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGRidXNlcjsKCgkvKioKCSAqIERhdGFiYXNlIFBhc3N3b3JkCgkgKgoJICogQHNpbmNlIDMuMS4wCgkgKiBAYWNjZXNzIHByb3RlY3RlZAoJICogQHZhciBzdHJpbmcKCSAqLwoJcHJvdGVjdGVkICRkYnBhc3N3b3JkOwoKCS8qKgoJICogRGF0YWJhc2UgTmFtZQoJICoKCSAqIEBzaW5jZSAzLjEuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkZGJuYW1lOwoKCS8qKgoJICogRGF0YWJhc2UgSG9zdAoJICoKCSAqIEBzaW5jZSAzLjEuMAoJICogQGFjY2VzcyBwcm90ZWN0ZWQKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXByb3RlY3RlZCAkZGJob3N0OwoKCS8qKgoJICogRGF0YWJhc2UgSGFuZGxlCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKiBAdmFyIHN0cmluZwoJICovCglwcm90ZWN0ZWQgJGRiaDsKCgkvKioKCSAqIEEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBxdWVyeS9nZXRfcm93L2dldF92YXIgY2FsbAoJICoKCSAqIEBzaW5jZSAzLjAuMAoJICogQGFjY2VzcyBwdWJsaWMKCSAqIEB2YXIgc3RyaW5nCgkgKi8KCXZhciAkZnVuY19jYWxsOwoKCS8qKgoJICogV2hldGhlciBNeVNRTCBpcyB1c2VkIGFzIHRoZSBkYXRhYmFzZSBlbmdpbmUuCgkgKgoJICogU2V0IGluIFdQREI6OmRiX2Nvbm5lY3QoKSB0byB0cnVlLCBieSBkZWZhdWx0LiBUaGlzIGlzIHVzZWQgd2hlbiBjaGVja2luZwoJICogYWdhaW5zdCB0aGUgcmVxdWlyZWQgTXlTUUwgdmVyc2lvbiBmb3IgV29yZFByZXNzLiBOb3JtYWxseSwgYSByZXBsYWNlbWVudAoJICogZGF0YWJhc2UgZHJvcC1pbiAoZGIucGhwKSB3aWxsIHNraXAgdGhlc2UgY2hlY2tzLCBidXQgc2V0dGluZyB0aGlzIHRvIHRydWUKCSAqIHdpbGwgZm9yY2UgdGhlIGNoZWNrcyB0byBvY2N1ci4KCSAqCgkgKiBAc2luY2UgMy4zLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAdmFyIGJvb2wKCSAqLwoJcHVibGljICRpc19teXNxbCA9IG51bGw7CgoJLyoqCgkgKiBDb25uZWN0cyB0byB0aGUgZGF0YWJhc2Ugc2VydmVyIGFuZCBzZWxlY3RzIGEgZGF0YWJhc2UKCSAqCgkgKiBQSFA1IHN0eWxlIGNvbnN0cnVjdG9yIGZvciBjb21wYXRpYmlsaXR5IHdpdGggUEhQNS4gRG9lcwoJICogdGhlIGFjdHVhbCBzZXR0aW5nIHVwIG9mIHRoZSBjbGFzcyBwcm9wZXJ0aWVzIGFuZCBjb25uZWN0aW9uCgkgKiB0byB0aGUgZGF0YWJhc2UuCgkgKgoJICogQGxpbmsgaHR0cDovL2NvcmUudHJhYy53b3JkcHJlc3Mub3JnL3RpY2tldC8zMzU0CgkgKiBAc2luY2UgMi4wLjgKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRkYnVzZXIgTXlTUUwgZGF0YWJhc2UgdXNlcgoJICogQHBhcmFtIHN0cmluZyAkZGJwYXNzd29yZCBNeVNRTCBkYXRhYmFzZSBwYXNzd29yZAoJICogQHBhcmFtIHN0cmluZyAkZGJuYW1lIE15U1FMIGRhdGFiYXNlIG5hbWUKCSAqIEBwYXJhbSBzdHJpbmcgJGRiaG9zdCBNeVNRTCBkYXRhYmFzZSBob3N0CgkgKi8KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCAkZGJ1c2VyLCAkZGJwYXNzd29yZCwgJGRibmFtZSwgJGRiaG9zdCApIHsKCQlyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbiggYXJyYXkoICR0aGlzLCAnX19kZXN0cnVjdCcgKSApOwoKCQlpZiAoIFdQX0RFQlVHICYmIFdQX0RFQlVHX0RJU1BMQVkgKQoJCQkkdGhpcy0+c2hvd19lcnJvcnMoKTsKCgkJJHRoaXMtPmluaXRfY2hhcnNldCgpOwoKCQkkdGhpcy0+ZGJ1c2VyID0gJGRidXNlcjsKCQkkdGhpcy0+ZGJwYXNzd29yZCA9ICRkYnBhc3N3b3JkOwoJCSR0aGlzLT5kYm5hbWUgPSAkZGJuYW1lOwoJCSR0aGlzLT5kYmhvc3QgPSAkZGJob3N0OwoKCQkkdGhpcy0+ZGJfY29ubmVjdCgpOwoJfQoKCS8qKgoJICogUEhQNSBzdHlsZSBkZXN0cnVjdG9yIGFuZCB3aWxsIHJ1biB3aGVuIGRhdGFiYXNlIG9iamVjdCBpcyBkZXN0cm95ZWQuCgkgKgoJICogQHNlZSB3cGRiOjpfX2NvbnN0cnVjdCgpCgkgKiBAc2luY2UgMi4wLjgKCSAqIEByZXR1cm4gYm9vbCB0cnVlCgkgKi8KCWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLyoqCgkgKiBQSFA1IHN0eWxlIG1hZ2ljIGdldHRlciwgdXNlZCB0byBsYXp5LWxvYWQgZXhwZW5zaXZlIGRhdGEuCgkgKgoJICogQHNpbmNlIDMuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSBUaGUgcHJpdmF0ZSBtZW1iZXIgdG8gZ2V0LCBhbmQgb3B0aW9uYWxseSBwcm9jZXNzCgkgKiBAcmV0dXJuIG1peGVkIFRoZSBwcml2YXRlIG1lbWJlcgoJICovCglmdW5jdGlvbiBfX2dldCggJG5hbWUgKSB7CgkJaWYgKCAnY29sX2luZm8nID09ICRuYW1lICkKCQkJJHRoaXMtPmxvYWRfY29sX2luZm8oKTsKCgkJcmV0dXJuICR0aGlzLT4kbmFtZTsKCX0KCgkvKioKCSAqIE1hZ2ljIGZ1bmN0aW9uLCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCSAqCgkgKiBAc2luY2UgMy41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBUaGUgcHJpdmF0ZSBtZW1iZXIgdG8gc2V0CgkgKiBAcGFyYW0gbWl4ZWQgICR2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CgkgKi8KCWZ1bmN0aW9uIF9fc2V0KCAkbmFtZSwgJHZhbHVlICkgewoJCSR0aGlzLT4kbmFtZSA9ICR2YWx1ZTsKCX0KCgkvKioKCSAqIE1hZ2ljIGZ1bmN0aW9uLCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCSAqCgkgKiBAc2luY2UgMy41LjAKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBUaGUgcHJpdmF0ZSBtZW1iZXIgdG8gY2hlY2sKCSAqCgkgKiBAcmV0dXJuIGJvb2wgSWYgdGhlIG1lbWJlciBpcyBzZXQgb3Igbm90CgkgKi8KCWZ1bmN0aW9uIF9faXNzZXQoICRuYW1lICkgewoJCXJldHVybiBpc3NldCggJHRoaXMtPiRuYW1lICk7Cgl9CgoJLyoqCgkgKiBNYWdpYyBmdW5jdGlvbiwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgkgKgoJICogQHNpbmNlIDMuNS4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbmFtZSAgVGhlIHByaXZhdGUgbWVtYmVyIHRvIHVuc2V0CgkgKi8KCWZ1bmN0aW9uIF9fdW5zZXQoICRuYW1lICkgewoJCXVuc2V0KCAkdGhpcy0+JG5hbWUgKTsKCX0KCgkvKioKCSAqIFNldCAkdGhpcy0+Y2hhcnNldCBhbmQgJHRoaXMtPmNvbGxhdGUKCSAqCgkgKiBAc2luY2UgMy4xLjAKCSAqLwoJZnVuY3Rpb24gaW5pdF9jaGFyc2V0KCkgewoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCdpc19tdWx0aXNpdGUnKSAmJiBpc19tdWx0aXNpdGUoKSApIHsKCQkJJHRoaXMtPmNoYXJzZXQgPSAndXRmOCc7CgkJCWlmICggZGVmaW5lZCggJ0RCX0NPTExBVEUnICkgJiYgREJfQ09MTEFURSApCgkJCQkkdGhpcy0+Y29sbGF0ZSA9IERCX0NPTExBVEU7CgkJCWVsc2UKCQkJCSR0aGlzLT5jb2xsYXRlID0gJ3V0ZjhfZ2VuZXJhbF9jaSc7CgkJfSBlbHNlaWYgKCBkZWZpbmVkKCAnREJfQ09MTEFURScgKSApIHsKCQkJJHRoaXMtPmNvbGxhdGUgPSBEQl9DT0xMQVRFOwoJCX0KCgkJaWYgKCBkZWZpbmVkKCAnREJfQ0hBUlNFVCcgKSApCgkJCSR0aGlzLT5jaGFyc2V0ID0gREJfQ0hBUlNFVDsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGNvbm5lY3Rpb24ncyBjaGFyYWN0ZXIgc2V0LgoJICoKCSAqIEBzaW5jZSAzLjEuMAoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkZGJoICAgICBUaGUgcmVzb3VyY2UgZ2l2ZW4gYnkgbXlzcWxfY29ubmVjdAoJICogQHBhcmFtIHN0cmluZyAgICRjaGFyc2V0IFRoZSBjaGFyYWN0ZXIgc2V0IChvcHRpb25hbCkKCSAqIEBwYXJhbSBzdHJpbmcgICAkY29sbGF0ZSBUaGUgY29sbGF0aW9uIChvcHRpb25hbCkKCSAqLwoJZnVuY3Rpb24gc2V0X2NoYXJzZXQoICRkYmgsICRjaGFyc2V0ID0gbnVsbCwgJGNvbGxhdGUgPSBudWxsICkgewoJCWlmICggISBpc3NldCggJGNoYXJzZXQgKSApCgkJCSRjaGFyc2V0ID0gJHRoaXMtPmNoYXJzZXQ7CgkJaWYgKCAhIGlzc2V0KCAkY29sbGF0ZSApICkKCQkJJGNvbGxhdGUgPSAkdGhpcy0+Y29sbGF0ZTsKCQlpZiAoICR0aGlzLT5oYXNfY2FwKCAnY29sbGF0aW9uJyApICYmICEgZW1wdHkoICRjaGFyc2V0ICkgKSB7CgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnbXlzcWxfc2V0X2NoYXJzZXQnICkgJiYgJHRoaXMtPmhhc19jYXAoICdzZXRfY2hhcnNldCcgKSApIHsKCQkJCW15c3FsX3NldF9jaGFyc2V0KCAkY2hhcnNldCwgJGRiaCApOwoJCQl9IGVsc2UgewoJCQkJJHF1ZXJ5ID0gJHRoaXMtPnByZXBhcmUoICdTRVQgTkFNRVMgJXMnLCAkY2hhcnNldCApOwoJCQkJaWYgKCAhIGVtcHR5KCAkY29sbGF0ZSApICkKCQkJCQkkcXVlcnkgLj0gJHRoaXMtPnByZXBhcmUoICcgQ09MTEFURSAlcycsICRjb2xsYXRlICk7CgkJCQlteXNxbF9xdWVyeSggJHF1ZXJ5LCAkZGJoICk7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSB0YWJsZSBwcmVmaXggZm9yIHRoZSBXb3JkUHJlc3MgdGFibGVzLgoJICoKCSAqIEBzaW5jZSAyLjUuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHByZWZpeCBBbHBoYW51bWVyaWMgbmFtZSBmb3IgdGhlIG5ldyBwcmVmaXguCgkgKiBAcGFyYW0gYm9vbCAkc2V0X3RhYmxlX25hbWVzIE9wdGlvbmFsLiBXaGV0aGVyIHRoZSB0YWJsZSBuYW1lcywgZS5nLiB3cGRiOjokcG9zdHMsIHNob3VsZCBiZSB1cGRhdGVkIG9yIG5vdC4KCSAqIEByZXR1cm4gc3RyaW5nfFdQX0Vycm9yIE9sZCBwcmVmaXggb3IgV1BfRXJyb3Igb24gZXJyb3IKCSAqLwoJZnVuY3Rpb24gc2V0X3ByZWZpeCggJHByZWZpeCwgJHNldF90YWJsZV9uYW1lcyA9IHRydWUgKSB7CgoJCWlmICggcHJlZ19tYXRjaCggJ3xbXmEtejAtOV9dfGknLCAkcHJlZml4ICkgKQoJCQlyZXR1cm4gbmV3IFdQX0Vycm9yKCdpbnZhbGlkX2RiX3ByZWZpeCcsICdJbnZhbGlkIGRhdGFiYXNlIHByZWZpeCcgKTsKCgkJJG9sZF9wcmVmaXggPSBpc19tdWx0aXNpdGUoKSA/ICcnIDogJHByZWZpeDsKCgkJaWYgKCBpc3NldCggJHRoaXMtPmJhc2VfcHJlZml4ICkgKQoJCQkkb2xkX3ByZWZpeCA9ICR0aGlzLT5iYXNlX3ByZWZpeDsKCgkJJHRoaXMtPmJhc2VfcHJlZml4ID0gJHByZWZpeDsKCgkJaWYgKCAkc2V0X3RhYmxlX25hbWVzICkgewoJCQlmb3JlYWNoICggJHRoaXMtPnRhYmxlcyggJ2dsb2JhbCcgKSBhcyAkdGFibGUgPT4gJHByZWZpeGVkX3RhYmxlICkKCQkJCSR0aGlzLT4kdGFibGUgPSAkcHJlZml4ZWRfdGFibGU7CgoJCQlpZiAoIGlzX211bHRpc2l0ZSgpICYmIGVtcHR5KCAkdGhpcy0+YmxvZ2lkICkgKQoJCQkJcmV0dXJuICRvbGRfcHJlZml4OwoKCQkJJHRoaXMtPnByZWZpeCA9ICR0aGlzLT5nZXRfYmxvZ19wcmVmaXgoKTsKCgkJCWZvcmVhY2ggKCAkdGhpcy0+dGFibGVzKCAnYmxvZycgKSBhcyAkdGFibGUgPT4gJHByZWZpeGVkX3RhYmxlICkKCQkJCSR0aGlzLT4kdGFibGUgPSAkcHJlZml4ZWRfdGFibGU7CgoJCQlmb3JlYWNoICggJHRoaXMtPnRhYmxlcyggJ29sZCcgKSBhcyAkdGFibGUgPT4gJHByZWZpeGVkX3RhYmxlICkKCQkJCSR0aGlzLT4kdGFibGUgPSAkcHJlZml4ZWRfdGFibGU7CgkJfQoJCXJldHVybiAkb2xkX3ByZWZpeDsKCX0KCgkvKioKCSAqIFNldHMgYmxvZyBpZC4KCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBhY2Nlc3MgcHVibGljCgkgKiBAcGFyYW0gaW50ICRibG9nX2lkCgkgKiBAcGFyYW0gaW50ICRzaXRlX2lkIE9wdGlvbmFsLgoJICogQHJldHVybiBzdHJpbmcgcHJldmlvdXMgYmxvZyBpZAoJICovCglmdW5jdGlvbiBzZXRfYmxvZ19pZCggJGJsb2dfaWQsICRzaXRlX2lkID0gMCApIHsKCQlpZiAoICEgZW1wdHkoICRzaXRlX2lkICkgKQoJCQkkdGhpcy0+c2l0ZWlkID0gJHNpdGVfaWQ7CgoJCSRvbGRfYmxvZ19pZCAgPSAkdGhpcy0+YmxvZ2lkOwoJCSR0aGlzLT5ibG9naWQgPSAkYmxvZ19pZDsKCgkJJHRoaXMtPnByZWZpeCA9ICR0aGlzLT5nZXRfYmxvZ19wcmVmaXgoKTsKCgkJZm9yZWFjaCAoICR0aGlzLT50YWJsZXMoICdibG9nJyApIGFzICR0YWJsZSA9PiAkcHJlZml4ZWRfdGFibGUgKQoJCQkkdGhpcy0+JHRhYmxlID0gJHByZWZpeGVkX3RhYmxlOwoKCQlmb3JlYWNoICggJHRoaXMtPnRhYmxlcyggJ29sZCcgKSBhcyAkdGFibGUgPT4gJHByZWZpeGVkX3RhYmxlICkKCQkJJHRoaXMtPiR0YWJsZSA9ICRwcmVmaXhlZF90YWJsZTsKCgkJcmV0dXJuICRvbGRfYmxvZ19pZDsKCX0KCgkvKioKCSAqIEdldHMgYmxvZyBwcmVmaXguCgkgKgoJICogQHVzZXMgaXNfbXVsdGlzaXRlKCkKCSAqIEBzaW5jZSAzLjAuMAoJICogQHBhcmFtIGludCAkYmxvZ19pZCBPcHRpb25hbC4KCSAqIEByZXR1cm4gc3RyaW5nIEJsb2cgcHJlZml4LgoJICovCglmdW5jdGlvbiBnZXRfYmxvZ19wcmVmaXgoICRibG9nX2lkID0gbnVsbCApIHsKCQlpZiAoIGlzX211bHRpc2l0ZSgpICkgewoJCQlpZiAoIG51bGwgPT09ICRibG9nX2lkICkKCQkJCSRibG9nX2lkID0gJHRoaXMtPmJsb2dpZDsKCQkJJGJsb2dfaWQgPSAoaW50KSAkYmxvZ19pZDsKCQkJaWYgKCBkZWZpbmVkKCAnTVVMVElTSVRFJyApICYmICggMCA9PSAkYmxvZ19pZCB8fCAxID09ICRibG9nX2lkICkgKQoJCQkJcmV0dXJuICR0aGlzLT5iYXNlX3ByZWZpeDsKCQkJZWxzZQoJCQkJcmV0dXJuICR0aGlzLT5iYXNlX3ByZWZpeCAuICRibG9nX2lkIC4gJ18nOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkdGhpcy0+YmFzZV9wcmVmaXg7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyBhbiBhcnJheSBvZiBXb3JkUHJlc3MgdGFibGVzLgoJICoKCSAqIEFsc28gYWxsb3dzIGZvciB0aGUgQ1VTVE9NX1VTRVJfVEFCTEUgYW5kIENVU1RPTV9VU0VSX01FVEFfVEFCTEUgdG8KCSAqIG92ZXJyaWRlIHRoZSBXb3JkUHJlc3MgdXNlcnMgYW5kIHVzZXJtZXRhIHRhYmxlcyB0aGF0IHdvdWxkIG90aGVyd2lzZQoJICogYmUgZGV0ZXJtaW5lZCBieSB0aGUgcHJlZml4LgoJICoKCSAqIFRoZSBzY29wZSBhcmd1bWVudCBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKCSAqCgkgKiAnYWxsJyAtIHJldHVybnMgJ2FsbCcgYW5kICdnbG9iYWwnIHRhYmxlcy4gTm8gb2xkIHRhYmxlcyBhcmUgcmV0dXJuZWQuCgkgKiAnYmxvZycgLSByZXR1cm5zIHRoZSBibG9nLWxldmVsIHRhYmxlcyBmb3IgdGhlIHF1ZXJpZWQgYmxvZy4KCSAqICdnbG9iYWwnIC0gcmV0dXJucyB0aGUgZ2xvYmFsIHRhYmxlcyBmb3IgdGhlIGluc3RhbGxhdGlvbiwgcmV0dXJuaW5nIG11bHRpc2l0ZSB0YWJsZXMgb25seSBpZiBydW5uaW5nIG11bHRpc2l0ZS4KCSAqICdtc19nbG9iYWwnIC0gcmV0dXJucyB0aGUgbXVsdGlzaXRlIGdsb2JhbCB0YWJsZXMsIHJlZ2FyZGxlc3MgaWYgY3VycmVudCBpbnN0YWxsYXRpb24gaXMgbXVsdGlzaXRlLgoJICogJ29sZCcgLSByZXR1cm5zIHRhYmxlcyB3aGljaCBhcmUgZGVwcmVjYXRlZC4KCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEB1c2VzIHdwZGI6OiR0YWJsZXMKCSAqIEB1c2VzIHdwZGI6OiRvbGRfdGFibGVzCgkgKiBAdXNlcyB3cGRiOjokZ2xvYmFsX3RhYmxlcwoJICogQHVzZXMgd3BkYjo6JG1zX2dsb2JhbF90YWJsZXMKCSAqIEB1c2VzIGlzX211bHRpc2l0ZSgpCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc2NvcGUgT3B0aW9uYWwuIENhbiBiZSBhbGwsIGdsb2JhbCwgbXNfZ2xvYmFsLCBibG9nLCBvciBvbGQgdGFibGVzLiBEZWZhdWx0cyB0byBhbGwuCgkgKiBAcGFyYW0gYm9vbCAkcHJlZml4IE9wdGlvbmFsLiBXaGV0aGVyIHRvIGluY2x1ZGUgdGFibGUgcHJlZml4ZXMuIERlZmF1bHQgdHJ1ZS4gSWYgYmxvZwoJICogCXByZWZpeCBpcyByZXF1ZXN0ZWQsIHRoZW4gdGhlIGN1c3RvbSB1c2VycyBhbmQgdXNlcm1ldGEgdGFibGVzIHdpbGwgYmUgbWFwcGVkLgoJICogQHBhcmFtIGludCAkYmxvZ19pZCBPcHRpb25hbC4gVGhlIGJsb2dfaWQgdG8gcHJlZml4LiBEZWZhdWx0cyB0byB3cGRiOjokYmxvZ2lkLiBVc2VkIG9ubHkgd2hlbiBwcmVmaXggaXMgcmVxdWVzdGVkLgoJICogQHJldHVybiBhcnJheSBUYWJsZSBuYW1lcy4gV2hlbiBhIHByZWZpeCBpcyByZXF1ZXN0ZWQsIHRoZSBrZXkgaXMgdGhlIHVucHJlZml4ZWQgdGFibGUgbmFtZS4KCSAqLwoJZnVuY3Rpb24gdGFibGVzKCAkc2NvcGUgPSAnYWxsJywgJHByZWZpeCA9IHRydWUsICRibG9nX2lkID0gMCApIHsKCQlzd2l0Y2ggKCAkc2NvcGUgKSB7CgkJCWNhc2UgJ2FsbCcgOgoJCQkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGhpcy0+Z2xvYmFsX3RhYmxlcywgJHRoaXMtPnRhYmxlcyApOwoJCQkJaWYgKCBpc19tdWx0aXNpdGUoKSApCgkJCQkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGFibGVzLCAkdGhpcy0+bXNfZ2xvYmFsX3RhYmxlcyApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2Jsb2cnIDoKCQkJCSR0YWJsZXMgPSAkdGhpcy0+dGFibGVzOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2dsb2JhbCcgOgoJCQkJJHRhYmxlcyA9ICR0aGlzLT5nbG9iYWxfdGFibGVzOwoJCQkJaWYgKCBpc19tdWx0aXNpdGUoKSApCgkJCQkJJHRhYmxlcyA9IGFycmF5X21lcmdlKCAkdGFibGVzLCAkdGhpcy0+bXNfZ2xvYmFsX3RhYmxlcyApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ21zX2dsb2JhbCcgOgoJCQkJJHRhYmxlcyA9ICR0aGlzLT5tc19nbG9iYWxfdGFibGVzOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ29sZCcgOgoJCQkJJHRhYmxlcyA9ICR0aGlzLT5vbGRfdGFibGVzOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQgOgoJCQkJcmV0dXJuIGFycmF5KCk7CgkJCQlicmVhazsKCQl9CgoJCWlmICggJHByZWZpeCApIHsKCQkJaWYgKCAhICRibG9nX2lkICkKCQkJCSRibG9nX2lkID0gJHRoaXMtPmJsb2dpZDsKCQkJJGJsb2dfcHJlZml4ID0gJHRoaXMtPmdldF9ibG9nX3ByZWZpeCggJGJsb2dfaWQgKTsKCQkJJGJhc2VfcHJlZml4ID0gJHRoaXMtPmJhc2VfcHJlZml4OwoJCQkkZ2xvYmFsX3RhYmxlcyA9IGFycmF5X21lcmdlKCAkdGhpcy0+Z2xvYmFsX3RhYmxlcywgJHRoaXMtPm1zX2dsb2JhbF90YWJsZXMgKTsKCQkJZm9yZWFjaCAoICR0YWJsZXMgYXMgJGsgPT4gJHRhYmxlICkgewoJCQkJaWYgKCBpbl9hcnJheSggJHRhYmxlLCAkZ2xvYmFsX3RhYmxlcyApICkKCQkJCQkkdGFibGVzWyAkdGFibGUgXSA9ICRiYXNlX3ByZWZpeCAuICR0YWJsZTsKCQkJCWVsc2UKCQkJCQkkdGFibGVzWyAkdGFibGUgXSA9ICRibG9nX3ByZWZpeCAuICR0YWJsZTsKCQkJCXVuc2V0KCAkdGFibGVzWyAkayBdICk7CgkJCX0KCgkJCWlmICggaXNzZXQoICR0YWJsZXNbJ3VzZXJzJ10gKSAmJiBkZWZpbmVkKCAnQ1VTVE9NX1VTRVJfVEFCTEUnICkgKQoJCQkJJHRhYmxlc1sndXNlcnMnXSA9IENVU1RPTV9VU0VSX1RBQkxFOwoKCQkJaWYgKCBpc3NldCggJHRhYmxlc1sndXNlcm1ldGEnXSApICYmIGRlZmluZWQoICdDVVNUT01fVVNFUl9NRVRBX1RBQkxFJyApICkKCQkJCSR0YWJsZXNbJ3VzZXJtZXRhJ10gPSBDVVNUT01fVVNFUl9NRVRBX1RBQkxFOwoJCX0KCgkJcmV0dXJuICR0YWJsZXM7Cgl9CgoJLyoqCgkgKiBTZWxlY3RzIGEgZGF0YWJhc2UgdXNpbmcgdGhlIGN1cnJlbnQgZGF0YWJhc2UgY29ubmVjdGlvbi4KCSAqCgkgKiBUaGUgZGF0YWJhc2UgbmFtZSB3aWxsIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgZGF0YWJhc2UKCSAqIGNvbm5lY3Rpb24uIE9uIGZhaWx1cmUsIHRoZSBleGVjdXRpb24gd2lsbCBiYWlsIGFuZCBkaXNwbGF5IGFuIERCIGVycm9yLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGIgTXlTUUwgZGF0YWJhc2UgbmFtZQoJICogQHBhcmFtIHJlc291cmNlICRkYmggT3B0aW9uYWwgbGluayBpZGVudGlmaWVyLgoJICogQHJldHVybiBudWxsIEFsd2F5cyBudWxsLgoJICovCglmdW5jdGlvbiBzZWxlY3QoICRkYiwgJGRiaCA9IG51bGwgKSB7CgkJaWYgKCBpc19udWxsKCRkYmgpICkKCQkJJGRiaCA9ICR0aGlzLT5kYmg7CgoJCWlmICggIUBteXNxbF9zZWxlY3RfZGIoICRkYiwgJGRiaCApICkgewoJCQkkdGhpcy0+cmVhZHkgPSBmYWxzZTsKCQkJd3BfbG9hZF90cmFuc2xhdGlvbnNfZWFybHkoKTsKCQkJJHRoaXMtPmJhaWwoIHNwcmludGYoIF9fKCAnPGgxPkNhbiYjODIxNzt0IHNlbGVjdCBkYXRhYmFzZTwvaDE+CjxwPldlIHdlcmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgKHdoaWNoIG1lYW5zIHlvdXIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGlzIG9rYXkpIGJ1dCBub3QgYWJsZSB0byBzZWxlY3QgdGhlIDxjb2RlPiUxJHM8L2NvZGU+IGRhdGFiYXNlLjwvcD4KPHVsPgo8bGk+QXJlIHlvdSBzdXJlIGl0IGV4aXN0cz88L2xpPgo8bGk+RG9lcyB0aGUgdXNlciA8Y29kZT4lMiRzPC9jb2RlPiBoYXZlIHBlcm1pc3Npb24gdG8gdXNlIHRoZSA8Y29kZT4lMSRzPC9jb2RlPiBkYXRhYmFzZT88L2xpPgo8bGk+T24gc29tZSBzeXN0ZW1zIHRoZSBuYW1lIG9mIHlvdXIgZGF0YWJhc2UgaXMgcHJlZml4ZWQgd2l0aCB5b3VyIHVzZXJuYW1lLCBzbyBpdCB3b3VsZCBiZSBsaWtlIDxjb2RlPnVzZXJuYW1lXyUxJHM8L2NvZGU+LiBDb3VsZCB0aGF0IGJlIHRoZSBwcm9ibGVtPzwvbGk+CjwvdWw+CjxwPklmIHlvdSBkb25cJ3Qga25vdyBob3cgdG8gc2V0IHVwIGEgZGF0YWJhc2UgeW91IHNob3VsZCA8c3Ryb25nPmNvbnRhY3QgeW91ciBob3N0PC9zdHJvbmc+LiBJZiBhbGwgZWxzZSBmYWlscyB5b3UgbWF5IGZpbmQgaGVscCBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3dvcmRwcmVzcy5vcmcvc3VwcG9ydC8iPldvcmRQcmVzcyBTdXBwb3J0IEZvcnVtczwvYT4uPC9wPicgKSwgaHRtbHNwZWNpYWxjaGFycyggJGRiLCBFTlRfUVVPVEVTICksIGh0bWxzcGVjaWFsY2hhcnMoICR0aGlzLT5kYnVzZXIsIEVOVF9RVU9URVMgKSApLCAnZGJfc2VsZWN0X2ZhaWwnICk7CgkJCXJldHVybjsKCQl9Cgl9CgoJLyoqCgkgKiBEbyBub3QgdXNlLCBkZXByZWNhdGVkLgoJICoKCSAqIFVzZSBlc2Nfc3FsKCkgb3Igd3BkYjo6cHJlcGFyZSgpIGluc3RlYWQuCgkgKgoJICogQHNpbmNlIDIuOC4wCgkgKiBAZGVwcmVjYXRlZCAzLjYuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlCgkgKiBAc2VlIGVzY19zcWwoKQoJICogQGFjY2VzcyBwcml2YXRlCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3RyaW5nCgkgKiBAcmV0dXJuIHN0cmluZwoJICovCglmdW5jdGlvbiBfd2Vha19lc2NhcGUoICRzdHJpbmcgKSB7CgkJaWYgKCBmdW5jX251bV9hcmdzKCkgPT09IDEgJiYgZnVuY3Rpb25fZXhpc3RzKCAnX2RlcHJlY2F0ZWRfZnVuY3Rpb24nICkgKQoJCQlfZGVwcmVjYXRlZF9mdW5jdGlvbiggX19NRVRIT0RfXywgJzMuNicsICd3cGRiOjpwcmVwYXJlKCkgb3IgZXNjX3NxbCgpJyApOwoJCXJldHVybiBhZGRzbGFzaGVzKCAkc3RyaW5nICk7Cgl9CgoJLyoqCgkgKiBSZWFsIGVzY2FwZSwgdXNpbmcgbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCkKCSAqCgkgKiBAc2VlIG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZygpCgkgKiBAc2luY2UgMi44LjAKCSAqIEBhY2Nlc3MgcHJpdmF0ZQoJICoKCSAqIEBwYXJhbSAgc3RyaW5nICRzdHJpbmcgdG8gZXNjYXBlCgkgKiBAcmV0dXJuIHN0cmluZyBlc2NhcGVkCgkgKi8KCWZ1bmN0aW9uIF9yZWFsX2VzY2FwZSggJHN0cmluZyApIHsKCQlpZiAoICR0aGlzLT5kYmggKQoJCQlyZXR1cm4gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCAkc3RyaW5nLCAkdGhpcy0+ZGJoICk7CgoJCSRjbGFzcyA9IGdldF9jbGFzcyggJHRoaXMgKTsKCQlfZG9pbmdfaXRfd3JvbmcoICRjbGFzcywgIiRjbGFzcyBtdXN0IHNldCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gZm9yIHVzZSB3aXRoIGVzY2FwaW5nLiIsIEVfVVNFUl9OT1RJQ0UgKTsKCQlyZXR1cm4gYWRkc2xhc2hlcyggJHN0cmluZyApOwoJfQoKCS8qKgoJICogRXNjYXBlIGRhdGEuIFdvcmtzIG9uIGFycmF5cy4KCSAqCgkgKiBAdXNlcyB3cGRiOjpfcmVhbF9lc2NhcGUoKQoJICogQHNpbmNlICAyLjguMAoJICogQGFjY2VzcyBwcml2YXRlCgkgKgoJICogQHBhcmFtICBzdHJpbmd8YXJyYXkgJGRhdGEKCSAqIEByZXR1cm4gc3RyaW5nfGFycmF5IGVzY2FwZWQKCSAqLwoJZnVuY3Rpb24gX2VzY2FwZSggJGRhdGEgKSB7CgkJaWYgKCBpc19hcnJheSggJGRhdGEgKSApIHsKCQkJZm9yZWFjaCAoICRkYXRhIGFzICRrID0+ICR2ICkgewoJCQkJaWYgKCBpc19hcnJheSgkdikgKQoJCQkJCSRkYXRhWyRrXSA9ICR0aGlzLT5fZXNjYXBlKCAkdiApOwoJCQkJZWxzZQoJCQkJCSRkYXRhWyRrXSA9ICR0aGlzLT5fcmVhbF9lc2NhcGUoICR2ICk7CgkJCX0KCQl9IGVsc2UgewoJCQkkZGF0YSA9ICR0aGlzLT5fcmVhbF9lc2NhcGUoICRkYXRhICk7CgkJfQoKCQlyZXR1cm4gJGRhdGE7Cgl9CgoJLyoqCgkgKiBEbyBub3QgdXNlLCBkZXByZWNhdGVkLgoJICoKCSAqIFVzZSBlc2Nfc3FsKCkgb3Igd3BkYjo6cHJlcGFyZSgpIGluc3RlYWQuCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBkZXByZWNhdGVkIDMuNi4wCgkgKiBAc2VlIHdwZGI6OnByZXBhcmUoKQoJICogQHNlZSBlc2Nfc3FsKCkKCSAqCgkgKiBAcGFyYW0gbWl4ZWQgJGRhdGEKCSAqIEByZXR1cm4gbWl4ZWQKCSAqLwoJZnVuY3Rpb24gZXNjYXBlKCAkZGF0YSApIHsKCQlpZiAoIGZ1bmNfbnVtX2FyZ3MoKSA9PT0gMSAmJiBmdW5jdGlvbl9leGlzdHMoICdfZGVwcmVjYXRlZF9mdW5jdGlvbicgKSApCgkJCV9kZXByZWNhdGVkX2Z1bmN0aW9uKCBfX01FVEhPRF9fLCAnMy42JywgJ3dwZGI6OnByZXBhcmUoKSBvciBlc2Nfc3FsKCknICk7CgkJaWYgKCBpc19hcnJheSggJGRhdGEgKSApIHsKCQkJZm9yZWFjaCAoICRkYXRhIGFzICRrID0+ICR2ICkgewoJCQkJaWYgKCBpc19hcnJheSggJHYgKSApCgkJCQkJJGRhdGFbJGtdID0gJHRoaXMtPmVzY2FwZSggJHYsICdyZWN1cnNpdmUnICk7CgkJCQllbHNlCgkJCQkJJGRhdGFbJGtdID0gJHRoaXMtPl93ZWFrX2VzY2FwZSggJHYsICdpbnRlcm5hbCcgKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRkYXRhID0gJHRoaXMtPl93ZWFrX2VzY2FwZSggJGRhdGEsICdpbnRlcm5hbCcgKTsKCQl9CgoJCXJldHVybiAkZGF0YTsKCX0KCgkvKioKCSAqIEVzY2FwZXMgY29udGVudCBieSByZWZlcmVuY2UgZm9yIGluc2VydGlvbiBpbnRvIHRoZSBkYXRhYmFzZSwgZm9yIHNlY3VyaXR5CgkgKgoJICogQHVzZXMgd3BkYjo6X3JlYWxfZXNjYXBlKCkKCSAqIEBzaW5jZSAyLjMuMAoJICogQHBhcmFtIHN0cmluZyAkc3RyaW5nIHRvIGVzY2FwZQoJICogQHJldHVybiB2b2lkCgkgKi8KCWZ1bmN0aW9uIGVzY2FwZV9ieV9yZWYoICYkc3RyaW5nICkgewoJCWlmICggISBpc19mbG9hdCggJHN0cmluZyApICkKCQkJJHN0cmluZyA9ICR0aGlzLT5fcmVhbF9lc2NhcGUoICRzdHJpbmcgKTsKCX0KCgkvKioKCSAqIFByZXBhcmVzIGEgU1FMIHF1ZXJ5IGZvciBzYWZlIGV4ZWN1dGlvbi4gVXNlcyBzcHJpbnRmKCktbGlrZSBzeW50YXguCgkgKgoJICogVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIGluIHRoZSBxdWVyeSBmb3JtYXQgc3RyaW5nOgoJICogICAlZCAoaW50ZWdlcikKCSAqICAgJWYgKGZsb2F0KQoJICogICAlcyAoc3RyaW5nKQoJICogICAlJSAobGl0ZXJhbCBwZXJjZW50YWdlIHNpZ24gLSBubyBhcmd1bWVudCBuZWVkZWQpCgkgKgoJICogQWxsIG9mICVkLCAlZiwgYW5kICVzIGFyZSB0byBiZSBsZWZ0IHVucXVvdGVkIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZXkgbmVlZCBhbiBhcmd1bWVudCBwYXNzZWQgZm9yIHRoZW0uCgkgKiBMaXRlcmFscyAoJSkgYXMgcGFydHMgb2YgdGhlIHF1ZXJ5IG11c3QgYmUgcHJvcGVybHkgd3JpdHRlbiBhcyAlJS4KCSAqCgkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgYSBzbWFsbCBzdWJzZXQgb2YgdGhlIHNwcmludGYgc3ludGF4OyBpdCBvbmx5IHN1cHBvcnRzICVkIChpbnRlZ2VyKSwgJWYgKGZsb2F0KSwgYW5kICVzIChzdHJpbmcpLgoJICogRG9lcyBub3Qgc3VwcG9ydCBzaWduLCBwYWRkaW5nLCBhbGlnbm1lbnQsIHdpZHRoIG9yIHByZWNpc2lvbiBzcGVjaWZpZXJzLgoJICogRG9lcyBub3Qgc3VwcG9ydCBhcmd1bWVudCBudW1iZXJpbmcvc3dhcHBpbmcuCgkgKgoJICogTWF5IGJlIGNhbGxlZCBsaWtlIHtAbGluayBodHRwOi8vcGhwLm5ldC9zcHJpbnRmIHNwcmludGYoKX0gb3IgbGlrZSB7QGxpbmsgaHR0cDovL3BocC5uZXQvdnNwcmludGYgdnNwcmludGYoKX0uCgkgKgoJICogQm90aCAlZCBhbmQgJXMgc2hvdWxkIGJlIGxlZnQgdW5xdW90ZWQgaW4gdGhlIHF1ZXJ5IHN0cmluZy4KCSAqCgkgKiA8Y29kZT4KCSAqIHdwZGI6OnByZXBhcmUoICJTRUxFQ1QgKiBGUk9NIGB0YWJsZWAgV0hFUkUgYGNvbHVtbmAgPSAlcyBBTkQgYGZpZWxkYCA9ICVkIiwgJ2ZvbycsIDEzMzcgKQoJICogd3BkYjo6cHJlcGFyZSggIlNFTEVDVCBEQVRFX0ZPUk1BVChgZmllbGRgLCAnJSVjJykgRlJPTSBgdGFibGVgIFdIRVJFIGBjb2x1bW5gID0gJXMiLCAnZm9vJyApOwoJICogPC9jb2RlPgoJICoKCSAqIEBsaW5rIGh0dHA6Ly9waHAubmV0L3NwcmludGYgRGVzY3JpcHRpb24gb2Ygc3ludGF4LgoJICogQHNpbmNlIDIuMy4wCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgUXVlcnkgc3RhdGVtZW50IHdpdGggc3ByaW50ZigpLWxpa2UgcGxhY2Vob2xkZXJzCgkgKiBAcGFyYW0gYXJyYXl8bWl4ZWQgJGFyZ3MgVGhlIGFycmF5IG9mIHZhcmlhYmxlcyB0byBzdWJzdGl0dXRlIGludG8gdGhlIHF1ZXJ5J3MgcGxhY2Vob2xkZXJzIGlmIGJlaW5nIGNhbGxlZCBsaWtlCgkgKiAJe0BsaW5rIGh0dHA6Ly9waHAubmV0L3ZzcHJpbnRmIHZzcHJpbnRmKCl9LCBvciB0aGUgZmlyc3QgdmFyaWFibGUgdG8gc3Vic3RpdHV0ZSBpbnRvIHRoZSBxdWVyeSdzIHBsYWNlaG9sZGVycyBpZgoJICogCWJlaW5nIGNhbGxlZCBsaWtlIHtAbGluayBodHRwOi8vcGhwLm5ldC9zcHJpbnRmIHNwcmludGYoKX0uCgkgKiBAcGFyYW0gbWl4ZWQgJGFyZ3MsLi4uIGZ1cnRoZXIgdmFyaWFibGVzIHRvIHN1YnN0aXR1dGUgaW50byB0aGUgcXVlcnkncyBwbGFjZWhvbGRlcnMgaWYgYmVpbmcgY2FsbGVkIGxpa2UKCSAqIAl7QGxpbmsgaHR0cDovL3BocC5uZXQvc3ByaW50ZiBzcHJpbnRmKCl9LgoJICogQHJldHVybiBudWxsfGZhbHNlfHN0cmluZyBTYW5pdGl6ZWQgcXVlcnkgc3RyaW5nLCBudWxsIGlmIHRoZXJlIGlzIG5vIHF1ZXJ5LCBmYWxzZSBpZiB0aGVyZSBpcyBhbiBlcnJvciBhbmQgc3RyaW5nCgkgKiAJaWYgdGhlcmUgd2FzIHNvbWV0aGluZyB0byBwcmVwYXJlCgkgKi8KCWZ1bmN0aW9uIHByZXBhcmUoICRxdWVyeSwgJGFyZ3MgKSB7CgkJaWYgKCBpc19udWxsKCAkcXVlcnkgKSApCgkJCXJldHVybjsKCgkJJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJYXJyYXlfc2hpZnQoICRhcmdzICk7CgkJLy8gSWYgYXJncyB3ZXJlIHBhc3NlZCBhcyBhbiBhcnJheSAoYXMgaW4gdnNwcmludGYpLCBtb3ZlIHRoZW0gdXAKCQlpZiAoIGlzc2V0KCAkYXJnc1swXSApICYmIGlzX2FycmF5KCRhcmdzWzBdKSApCgkJCSRhcmdzID0gJGFyZ3NbMF07CgkJJHF1ZXJ5ID0gc3RyX3JlcGxhY2UoICInJXMnIiwgJyVzJywgJHF1ZXJ5ICk7IC8vIGluIGNhc2Ugc29tZW9uZSBtaXN0YWtlbmx5IGFscmVhZHkgc2luZ2xlcXVvdGVkIGl0CgkJJHF1ZXJ5ID0gc3RyX3JlcGxhY2UoICciJXMiJywgJyVzJywgJHF1ZXJ5ICk7IC8vIGRvdWJsZXF1b3RlIHVucXVvdGluZwoJCSRxdWVyeSA9IHByZWdfcmVwbGFjZSggJ3woPzwhJSklZnwnICwgJyVGJywgJHF1ZXJ5ICk7IC8vIEZvcmNlIGZsb2F0cyB0byBiZSBsb2NhbGUgdW5hd2FyZQoJCSRxdWVyeSA9IHByZWdfcmVwbGFjZSggJ3woPzwhJSklc3wnLCAiJyVzJyIsICRxdWVyeSApOyAvLyBxdW90ZSB0aGUgc3RyaW5ncywgYXZvaWRpbmcgZXNjYXBlZCBzdHJpbmdzIGxpa2UgJSVzCgkJYXJyYXlfd2FsayggJGFyZ3MsIGFycmF5KCAkdGhpcywgJ2VzY2FwZV9ieV9yZWYnICkgKTsKCQlyZXR1cm4gQHZzcHJpbnRmKCAkcXVlcnksICRhcmdzICk7Cgl9CgoJLyoqCgkgKiBQcmludCBTUUwvREIgZXJyb3IuCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEBnbG9iYWwgYXJyYXkgJEVaU1FMX0VSUk9SIFN0b3JlcyBlcnJvciBpbmZvcm1hdGlvbiBvZiBxdWVyeSBhbmQgZXJyb3Igc3RyaW5nCgkgKgoJICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSBlcnJvciB0byBkaXNwbGF5CgkgKiBAcmV0dXJuIGJvb2wgRmFsc2UgaWYgdGhlIHNob3dpbmcgb2YgZXJyb3JzIGlzIGRpc2FibGVkLgoJICovCglmdW5jdGlvbiBwcmludF9lcnJvciggJHN0ciA9ICcnICkgewoJCWdsb2JhbCAkRVpTUUxfRVJST1I7CgoJCWlmICggISRzdHIgKQoJCQkkc3RyID0gbXlzcWxfZXJyb3IoICR0aGlzLT5kYmggKTsKCQkkRVpTUUxfRVJST1JbXSA9IGFycmF5KCAncXVlcnknID0+ICR0aGlzLT5sYXN0X3F1ZXJ5LCAnZXJyb3Jfc3RyJyA9PiAkc3RyICk7CgoJCWlmICggJHRoaXMtPnN1cHByZXNzX2Vycm9ycyApCgkJCXJldHVybiBmYWxzZTsKCgkJd3BfbG9hZF90cmFuc2xhdGlvbnNfZWFybHkoKTsKCgkJaWYgKCAkY2FsbGVyID0gJHRoaXMtPmdldF9jYWxsZXIoKSApCgkJCSRlcnJvcl9zdHIgPSBzcHJpbnRmKCBfXyggJ1dvcmRQcmVzcyBkYXRhYmFzZSBlcnJvciAlMSRzIGZvciBxdWVyeSAlMiRzIG1hZGUgYnkgJTMkcycgKSwgJHN0ciwgJHRoaXMtPmxhc3RfcXVlcnksICRjYWxsZXIgKTsKCQllbHNlCgkJCSRlcnJvcl9zdHIgPSBzcHJpbnRmKCBfXyggJ1dvcmRQcmVzcyBkYXRhYmFzZSBlcnJvciAlMSRzIGZvciBxdWVyeSAlMiRzJyApLCAkc3RyLCAkdGhpcy0+bGFzdF9xdWVyeSApOwoKCQllcnJvcl9sb2coICRlcnJvcl9zdHIgKTsKCgkJLy8gQXJlIHdlIHNob3dpbmcgZXJyb3JzPwoJCWlmICggISAkdGhpcy0+c2hvd19lcnJvcnMgKQoJCQlyZXR1cm4gZmFsc2U7CgoJCS8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHRoZW4gdGFrZSBub3RlIG9mIGl0CgkJaWYgKCBpc19tdWx0aXNpdGUoKSApIHsKCQkJJG1zZyA9ICJXb3JkUHJlc3MgZGF0YWJhc2UgZXJyb3I6IFskc3RyXVxueyR0aGlzLT5sYXN0X3F1ZXJ5fVxuIjsKCQkJaWYgKCBkZWZpbmVkKCAnRVJST1JMT0dGSUxFJyApICkKCQkJCWVycm9yX2xvZyggJG1zZywgMywgRVJST1JMT0dGSUxFICk7CgkJCWlmICggZGVmaW5lZCggJ0RJRU9OREJFUlJPUicgKSApCgkJCQl3cF9kaWUoICRtc2cgKTsKCQl9IGVsc2UgewoJCQkkc3RyICAgPSBodG1sc3BlY2lhbGNoYXJzKCAkc3RyLCBFTlRfUVVPVEVTICk7CgkJCSRxdWVyeSA9IGh0bWxzcGVjaWFsY2hhcnMoICR0aGlzLT5sYXN0X3F1ZXJ5LCBFTlRfUVVPVEVTICk7CgoJCQlwcmludCAiPGRpdiBpZD0nZXJyb3InPgoJCQk8cCBjbGFzcz0nd3BkYmVycm9yJz48c3Ryb25nPldvcmRQcmVzcyBkYXRhYmFzZSBlcnJvcjo8L3N0cm9uZz4gWyRzdHJdPGJyIC8+CgkJCTxjb2RlPiRxdWVyeTwvY29kZT48L3A+CgkJCTwvZGl2PiI7CgkJfQoJfQoKCS8qKgoJICogRW5hYmxlcyBzaG93aW5nIG9mIGRhdGFiYXNlIGVycm9ycy4KCSAqCgkgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgdG8gZW5hYmxlIHNob3dpbmcgb2YgZXJyb3JzLgoJICogd3BkYjo6aGlkZV9lcnJvcnMoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIGZvciBoaWRpbmcgb2YgZXJyb3JzLiBIb3dldmVyLAoJICogdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBlbmFibGUgYW5kIGRpc2FibGUgc2hvd2luZyBvZiBkYXRhYmFzZQoJICogZXJyb3JzLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKiBAc2VlIHdwZGI6OmhpZGVfZXJyb3JzKCkKCSAqCgkgKiBAcGFyYW0gYm9vbCAkc2hvdyBXaGV0aGVyIHRvIHNob3cgb3IgaGlkZSBlcnJvcnMKCSAqIEByZXR1cm4gYm9vbCBPbGQgdmFsdWUgZm9yIHNob3dpbmcgZXJyb3JzLgoJICovCglmdW5jdGlvbiBzaG93X2Vycm9ycyggJHNob3cgPSB0cnVlICkgewoJCSRlcnJvcnMgPSAkdGhpcy0+c2hvd19lcnJvcnM7CgkJJHRoaXMtPnNob3dfZXJyb3JzID0gJHNob3c7CgkJcmV0dXJuICRlcnJvcnM7Cgl9CgoJLyoqCgkgKiBEaXNhYmxlcyBzaG93aW5nIG9mIGRhdGFiYXNlIGVycm9ycy4KCSAqCgkgKiBCeSBkZWZhdWx0IGRhdGFiYXNlIGVycm9ycyBhcmUgbm90IHNob3duLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKiBAc2VlIHdwZGI6OnNob3dfZXJyb3JzKCkKCSAqCgkgKiBAcmV0dXJuIGJvb2wgV2hldGhlciBzaG93aW5nIG9mIGVycm9ycyB3YXMgYWN0aXZlCgkgKi8KCWZ1bmN0aW9uIGhpZGVfZXJyb3JzKCkgewoJCSRzaG93ID0gJHRoaXMtPnNob3dfZXJyb3JzOwoJCSR0aGlzLT5zaG93X2Vycm9ycyA9IGZhbHNlOwoJCXJldHVybiAkc2hvdzsKCX0KCgkvKioKCSAqIFdoZXRoZXIgdG8gc3VwcHJlc3MgZGF0YWJhc2UgZXJyb3JzLgoJICoKCSAqIEJ5IGRlZmF1bHQgZGF0YWJhc2UgZXJyb3JzIGFyZSBzdXBwcmVzc2VkLCB3aXRoIGEgc2ltcGxlCgkgKiBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gdGhleSBjYW4gYmUgZW5hYmxlZC4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqIEBzZWUgd3BkYjo6aGlkZV9lcnJvcnMoKQoJICogQHBhcmFtIGJvb2wgJHN1cHByZXNzIE9wdGlvbmFsLiBOZXcgdmFsdWUuIERlZmF1bHRzIHRvIHRydWUuCgkgKiBAcmV0dXJuIGJvb2wgT2xkIHZhbHVlCgkgKi8KCWZ1bmN0aW9uIHN1cHByZXNzX2Vycm9ycyggJHN1cHByZXNzID0gdHJ1ZSApIHsKCQkkZXJyb3JzID0gJHRoaXMtPnN1cHByZXNzX2Vycm9yczsKCQkkdGhpcy0+c3VwcHJlc3NfZXJyb3JzID0gKGJvb2wpICRzdXBwcmVzczsKCQlyZXR1cm4gJGVycm9yczsKCX0KCgkvKioKCSAqIEtpbGwgY2FjaGVkIHF1ZXJ5IHJlc3VsdHMuCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqIEByZXR1cm4gdm9pZAoJICovCglmdW5jdGlvbiBmbHVzaCgpIHsKCQkkdGhpcy0+bGFzdF9yZXN1bHQgPSBhcnJheSgpOwoJCSR0aGlzLT5jb2xfaW5mbyAgICA9IG51bGw7CgkJJHRoaXMtPmxhc3RfcXVlcnkgID0gbnVsbDsKCQkkdGhpcy0+cm93c19hZmZlY3RlZCA9ICR0aGlzLT5udW1fcm93cyA9IDA7CgkJJHRoaXMtPmxhc3RfZXJyb3IgID0gJyc7CgoJCWlmICggaXNfcmVzb3VyY2UoICR0aGlzLT5yZXN1bHQgKSApCgkJCW15c3FsX2ZyZWVfcmVzdWx0KCAkdGhpcy0+cmVzdWx0ICk7Cgl9CgoJLyoqCgkgKiBDb25uZWN0IHRvIGFuZCBzZWxlY3QgZGF0YWJhc2UKCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqLwoJZnVuY3Rpb24gZGJfY29ubmVjdCgpIHsKCgkJJHRoaXMtPmlzX215c3FsID0gdHJ1ZTsKCgkJJG5ld19saW5rID0gZGVmaW5lZCggJ01ZU1FMX05FV19MSU5LJyApID8gTVlTUUxfTkVXX0xJTksgOiB0cnVlOwoJCSRjbGllbnRfZmxhZ3MgPSBkZWZpbmVkKCAnTVlTUUxfQ0xJRU5UX0ZMQUdTJyApID8gTVlTUUxfQ0xJRU5UX0ZMQUdTIDogMDsKCgkJaWYgKCBXUF9ERUJVRyApIHsKCQkJJHRoaXMtPmRiaCA9IG15c3FsX2Nvbm5lY3QoICR0aGlzLT5kYmhvc3QsICR0aGlzLT5kYnVzZXIsICR0aGlzLT5kYnBhc3N3b3JkLCAkbmV3X2xpbmssICRjbGllbnRfZmxhZ3MgKTsKCQl9IGVsc2UgewoJCQkkdGhpcy0+ZGJoID0gQG15c3FsX2Nvbm5lY3QoICR0aGlzLT5kYmhvc3QsICR0aGlzLT5kYnVzZXIsICR0aGlzLT5kYnBhc3N3b3JkLCAkbmV3X2xpbmssICRjbGllbnRfZmxhZ3MgKTsKCQl9CgoJCWlmICggISR0aGlzLT5kYmggKSB7CgkJCXdwX2xvYWRfdHJhbnNsYXRpb25zX2Vhcmx5KCk7CgkJCSR0aGlzLT5iYWlsKCBzcHJpbnRmKCBfXyggIgo8aDE+RXJyb3IgZXN0YWJsaXNoaW5nIGEgZGF0YWJhc2UgY29ubmVjdGlvbjwvaDE+CjxwPlRoaXMgZWl0aGVyIG1lYW5zIHRoYXQgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbmZvcm1hdGlvbiBpbiB5b3VyIDxjb2RlPndwLWNvbmZpZy5waHA8L2NvZGU+IGZpbGUgaXMgaW5jb3JyZWN0IG9yIHdlIGNhbid0IGNvbnRhY3QgdGhlIGRhdGFiYXNlIHNlcnZlciBhdCA8Y29kZT4lczwvY29kZT4uIFRoaXMgY291bGQgbWVhbiB5b3VyIGhvc3QncyBkYXRhYmFzZSBzZXJ2ZXIgaXMgZG93bi48L3A+Cjx1bD4KCTxsaT5BcmUgeW91IHN1cmUgeW91IGhhdmUgdGhlIGNvcnJlY3QgdXNlcm5hbWUgYW5kIHBhc3N3b3JkPzwvbGk+Cgk8bGk+QXJlIHlvdSBzdXJlIHRoYXQgeW91IGhhdmUgdHlwZWQgdGhlIGNvcnJlY3QgaG9zdG5hbWU/PC9saT4KCTxsaT5BcmUgeW91IHN1cmUgdGhhdCB0aGUgZGF0YWJhc2Ugc2VydmVyIGlzIHJ1bm5pbmc/PC9saT4KPC91bD4KPHA+SWYgeW91J3JlIHVuc3VyZSB3aGF0IHRoZXNlIHRlcm1zIG1lYW4geW91IHNob3VsZCBwcm9iYWJseSBjb250YWN0IHlvdXIgaG9zdC4gSWYgeW91IHN0aWxsIG5lZWQgaGVscCB5b3UgY2FuIGFsd2F5cyB2aXNpdCB0aGUgPGEgaHJlZj0naHR0cDovL3dvcmRwcmVzcy5vcmcvc3VwcG9ydC8nPldvcmRQcmVzcyBTdXBwb3J0IEZvcnVtczwvYT4uPC9wPgoiICksIGh0bWxzcGVjaWFsY2hhcnMoICR0aGlzLT5kYmhvc3QsIEVOVF9RVU9URVMgKSApLCAnZGJfY29ubmVjdF9mYWlsJyApOwoKCQkJcmV0dXJuOwoJCX0KCgkJJHRoaXMtPnNldF9jaGFyc2V0KCAkdGhpcy0+ZGJoICk7CgoJCSR0aGlzLT5yZWFkeSA9IHRydWU7CgoJCSR0aGlzLT5zZWxlY3QoICR0aGlzLT5kYm5hbWUsICR0aGlzLT5kYmggKTsKCX0KCgkvKioKCSAqIFBlcmZvcm0gYSBNeVNRTCBkYXRhYmFzZSBxdWVyeSwgdXNpbmcgY3VycmVudCBkYXRhYmFzZSBjb25uZWN0aW9uLgoJICoKCSAqIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIG9uIHRoZSBjb2RleCBwYWdlLgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZyAkcXVlcnkgRGF0YWJhc2UgcXVlcnkKCSAqIEByZXR1cm4gaW50fGZhbHNlIE51bWJlciBvZiByb3dzIGFmZmVjdGVkL3NlbGVjdGVkIG9yIGZhbHNlIG9uIGVycm9yCgkgKi8KCWZ1bmN0aW9uIHF1ZXJ5KCAkcXVlcnkgKSB7CgkJaWYgKCAhICR0aGlzLT5yZWFkeSApCgkJCXJldHVybiBmYWxzZTsKCQkvKioKCQkgKiBGaWx0ZXIgdGhlIGRhdGFiYXNlIHF1ZXJ5LgoJCSAqCgkJICogU29tZSBxdWVyaWVzIGFyZSBtYWRlIGJlZm9yZSB0aGUgcGx1Z2lucyBoYXZlIGJlZW4gbG9hZGVkLCBhbmQgdGh1cyBjYW5ub3QgYmUgZmlsdGVyZWQgd2l0aCB0aGlzIG1ldGhvZC4KCQkgKgoJCSAqIEBzaW5jZSAyLjEuMAoJCSAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IERhdGFiYXNlIHF1ZXJ5LgoJCSAqLwoJCSRxdWVyeSA9IGFwcGx5X2ZpbHRlcnMoICdxdWVyeScsICRxdWVyeSApOwoKCQkkcmV0dXJuX3ZhbCA9IDA7CgkJJHRoaXMtPmZsdXNoKCk7CgoJCS8vIExvZyBob3cgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQKCQkkdGhpcy0+ZnVuY19jYWxsID0gIlwkZGItPnF1ZXJ5KFwiJHF1ZXJ5XCIpIjsKCgkJLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCBxdWVyeSBmb3IgZGVidWcuLgoJCSR0aGlzLT5sYXN0X3F1ZXJ5ID0gJHF1ZXJ5OwoKCQlpZiAoIGRlZmluZWQoICdTQVZFUVVFUklFUycgKSAmJiBTQVZFUVVFUklFUyApCgkJCSR0aGlzLT50aW1lcl9zdGFydCgpOwoKCQkkdGhpcy0+cmVzdWx0ID0gQG15c3FsX3F1ZXJ5KCAkcXVlcnksICR0aGlzLT5kYmggKTsKCQkkdGhpcy0+bnVtX3F1ZXJpZXMrKzsKCgkJaWYgKCBkZWZpbmVkKCAnU0FWRVFVRVJJRVMnICkgJiYgU0FWRVFVRVJJRVMgKQoJCQkkdGhpcy0+cXVlcmllc1tdID0gYXJyYXkoICRxdWVyeSwgJHRoaXMtPnRpbWVyX3N0b3AoKSwgJHRoaXMtPmdldF9jYWxsZXIoKSApOwoKCQkvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciB0aGVuIHRha2Ugbm90ZSBvZiBpdC4uCgkJaWYgKCAkdGhpcy0+bGFzdF9lcnJvciA9IG15c3FsX2Vycm9yKCAkdGhpcy0+ZGJoICkgKSB7CgkJCS8vIENsZWFyIGluc2VydF9pZCBvbiBhIHN1YnNlcXVlbnQgZmFpbGVkIGluc2VydC4KCQkJaWYgKCAkdGhpcy0+aW5zZXJ0X2lkICYmIHByZWdfbWF0Y2goICcvXlxzKihpbnNlcnR8cmVwbGFjZSlccy9pJywgJHF1ZXJ5ICkgKQoJCQkJJHRoaXMtPmluc2VydF9pZCA9IDA7CgoJCQkkdGhpcy0+cHJpbnRfZXJyb3IoKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCBwcmVnX21hdGNoKCAnL15ccyooY3JlYXRlfGFsdGVyfHRydW5jYXRlfGRyb3ApXHMvaScsICRxdWVyeSApICkgewoJCQkkcmV0dXJuX3ZhbCA9ICR0aGlzLT5yZXN1bHQ7CgkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooaW5zZXJ0fGRlbGV0ZXx1cGRhdGV8cmVwbGFjZSlccy9pJywgJHF1ZXJ5ICkgKSB7CgkJCSR0aGlzLT5yb3dzX2FmZmVjdGVkID0gbXlzcWxfYWZmZWN0ZWRfcm93cyggJHRoaXMtPmRiaCApOwoJCQkvLyBUYWtlIG5vdGUgb2YgdGhlIGluc2VydF9pZAoJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKihpbnNlcnR8cmVwbGFjZSlccy9pJywgJHF1ZXJ5ICkgKSB7CgkJCQkkdGhpcy0+aW5zZXJ0X2lkID0gbXlzcWxfaW5zZXJ0X2lkKCR0aGlzLT5kYmgpOwoJCQl9CgkJCS8vIFJldHVybiBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZAoJCQkkcmV0dXJuX3ZhbCA9ICR0aGlzLT5yb3dzX2FmZmVjdGVkOwoJCX0gZWxzZSB7CgkJCSRudW1fcm93cyA9IDA7CgkJCXdoaWxlICggJHJvdyA9IEBteXNxbF9mZXRjaF9vYmplY3QoICR0aGlzLT5yZXN1bHQgKSApIHsKCQkJCSR0aGlzLT5sYXN0X3Jlc3VsdFskbnVtX3Jvd3NdID0gJHJvdzsKCQkJCSRudW1fcm93cysrOwoJCQl9CgoJCQkvLyBMb2cgbnVtYmVyIG9mIHJvd3MgdGhlIHF1ZXJ5IHJldHVybmVkCgkJCS8vIGFuZCByZXR1cm4gbnVtYmVyIG9mIHJvd3Mgc2VsZWN0ZWQKCQkJJHRoaXMtPm51bV9yb3dzID0gJG51bV9yb3dzOwoJCQkkcmV0dXJuX3ZhbCAgICAgPSAkbnVtX3Jvd3M7CgkJfQoKCQlyZXR1cm4gJHJldHVybl92YWw7Cgl9CgoJLyoqCgkgKiBJbnNlcnQgYSByb3cgaW50byBhIHRhYmxlLgoJICoKCSAqIDxjb2RlPgoJICogd3BkYjo6aW5zZXJ0KCAndGFibGUnLCBhcnJheSggJ2NvbHVtbicgPT4gJ2ZvbycsICdmaWVsZCcgPT4gJ2JhcicgKSApCgkgKiB3cGRiOjppbnNlcnQoICd0YWJsZScsIGFycmF5KCAnY29sdW1uJyA9PiAnZm9vJywgJ2ZpZWxkJyA9PiAxMzM3ICksIGFycmF5KCAnJXMnLCAnJWQnICkgKQoJICogPC9jb2RlPgoJICoKCSAqIEBzaW5jZSAyLjUuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgd3BkYjo6JGZpZWxkX3R5cGVzCgkgKiBAc2VlIHdwX3NldF93cGRiX3ZhcnMoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlIHRhYmxlIG5hbWUKCSAqIEBwYXJhbSBhcnJheSAkZGF0YSBEYXRhIHRvIGluc2VydCAoaW4gY29sdW1uID0+IHZhbHVlIHBhaXJzKS4gQm90aCAkZGF0YSBjb2x1bW5zIGFuZCAkZGF0YSB2YWx1ZXMgc2hvdWxkIGJlICJyYXciIChuZWl0aGVyIHNob3VsZCBiZSBTUUwgZXNjYXBlZCkuCgkgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICRmb3JtYXQgT3B0aW9uYWwuIEFuIGFycmF5IG9mIGZvcm1hdHMgdG8gYmUgbWFwcGVkIHRvIGVhY2ggb2YgdGhlIHZhbHVlIGluICRkYXRhLiBJZiBzdHJpbmcsIHRoYXQgZm9ybWF0IHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gJGRhdGEuCgkgKiAJQSBmb3JtYXQgaXMgb25lIG9mICclZCcsICclZicsICclcycgKGludGVnZXIsIGZsb2F0LCBzdHJpbmcpLiBJZiBvbWl0dGVkLCBhbGwgdmFsdWVzIGluICRkYXRhIHdpbGwgYmUgdHJlYXRlZCBhcyBzdHJpbmdzIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGluIHdwZGI6OiRmaWVsZF90eXBlcy4KCSAqIEByZXR1cm4gaW50fGZhbHNlIFRoZSBudW1iZXIgb2Ygcm93cyBpbnNlcnRlZCwgb3IgZmFsc2Ugb24gZXJyb3IuCgkgKi8KCWZ1bmN0aW9uIGluc2VydCggJHRhYmxlLCAkZGF0YSwgJGZvcm1hdCA9IG51bGwgKSB7CgkJcmV0dXJuICR0aGlzLT5faW5zZXJ0X3JlcGxhY2VfaGVscGVyKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0LCAnSU5TRVJUJyApOwoJfQoKCS8qKgoJICogUmVwbGFjZSBhIHJvdyBpbnRvIGEgdGFibGUuCgkgKgoJICogPGNvZGU+CgkgKiB3cGRiOjpyZXBsYWNlKCAndGFibGUnLCBhcnJheSggJ2NvbHVtbicgPT4gJ2ZvbycsICdmaWVsZCcgPT4gJ2JhcicgKSApCgkgKiB3cGRiOjpyZXBsYWNlKCAndGFibGUnLCBhcnJheSggJ2NvbHVtbicgPT4gJ2ZvbycsICdmaWVsZCcgPT4gMTMzNyApLCBhcnJheSggJyVzJywgJyVkJyApICkKCSAqIDwvY29kZT4KCSAqCgkgKiBAc2luY2UgMy4wLjAKCSAqIEBzZWUgd3BkYjo6cHJlcGFyZSgpCgkgKiBAc2VlIHdwZGI6OiRmaWVsZF90eXBlcwoJICogQHNlZSB3cF9zZXRfd3BkYl92YXJzKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0YWJsZSB0YWJsZSBuYW1lCgkgKiBAcGFyYW0gYXJyYXkgJGRhdGEgRGF0YSB0byBpbnNlcnQgKGluIGNvbHVtbiA9PiB2YWx1ZSBwYWlycykuIEJvdGggJGRhdGEgY29sdW1ucyBhbmQgJGRhdGEgdmFsdWVzIHNob3VsZCBiZSAicmF3IiAobmVpdGhlciBzaG91bGQgYmUgU1FMIGVzY2FwZWQpLgoJICogQHBhcmFtIGFycmF5fHN0cmluZyAkZm9ybWF0IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBmb3JtYXRzIHRvIGJlIG1hcHBlZCB0byBlYWNoIG9mIHRoZSB2YWx1ZSBpbiAkZGF0YS4gSWYgc3RyaW5nLCB0aGF0IGZvcm1hdCB3aWxsIGJlIHVzZWQgZm9yIGFsbCBvZiB0aGUgdmFsdWVzIGluICRkYXRhLgoJICogCUEgZm9ybWF0IGlzIG9uZSBvZiAnJWQnLCAnJWYnLCAnJXMnIChpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nKS4gSWYgb21pdHRlZCwgYWxsIHZhbHVlcyBpbiAkZGF0YSB3aWxsIGJlIHRyZWF0ZWQgYXMgc3RyaW5ncyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiB3cGRiOjokZmllbGRfdHlwZXMuCgkgKiBAcmV0dXJuIGludHxmYWxzZSBUaGUgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQsIG9yIGZhbHNlIG9uIGVycm9yLgoJICovCglmdW5jdGlvbiByZXBsYWNlKCAkdGFibGUsICRkYXRhLCAkZm9ybWF0ID0gbnVsbCApIHsKCQlyZXR1cm4gJHRoaXMtPl9pbnNlcnRfcmVwbGFjZV9oZWxwZXIoICR0YWJsZSwgJGRhdGEsICRmb3JtYXQsICdSRVBMQUNFJyApOwoJfQoKCS8qKgoJICogSGVscGVyIGZ1bmN0aW9uIGZvciBpbnNlcnQgYW5kIHJlcGxhY2UuCgkgKgoJICogUnVucyBhbiBpbnNlcnQgb3IgcmVwbGFjZSBxdWVyeSBiYXNlZCBvbiAkdHlwZSBhcmd1bWVudC4KCSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEBzaW5jZSAzLjAuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgd3BkYjo6JGZpZWxkX3R5cGVzCgkgKiBAc2VlIHdwX3NldF93cGRiX3ZhcnMoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlIHRhYmxlIG5hbWUKCSAqIEBwYXJhbSBhcnJheSAkZGF0YSBEYXRhIHRvIGluc2VydCAoaW4gY29sdW1uID0+IHZhbHVlIHBhaXJzKS4gQm90aCAkZGF0YSBjb2x1bW5zIGFuZCAkZGF0YSB2YWx1ZXMgc2hvdWxkIGJlICJyYXciIChuZWl0aGVyIHNob3VsZCBiZSBTUUwgZXNjYXBlZCkuCgkgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICRmb3JtYXQgT3B0aW9uYWwuIEFuIGFycmF5IG9mIGZvcm1hdHMgdG8gYmUgbWFwcGVkIHRvIGVhY2ggb2YgdGhlIHZhbHVlIGluICRkYXRhLiBJZiBzdHJpbmcsIHRoYXQgZm9ybWF0IHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gJGRhdGEuCgkgKiAJQSBmb3JtYXQgaXMgb25lIG9mICclZCcsICclZicsICclcycgKGludGVnZXIsIGZsb2F0LCBzdHJpbmcpLiBJZiBvbWl0dGVkLCBhbGwgdmFsdWVzIGluICRkYXRhIHdpbGwgYmUgdHJlYXRlZCBhcyBzdHJpbmdzIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGluIHdwZGI6OiRmaWVsZF90eXBlcy4KCSAqIEBwYXJhbSBzdHJpbmcgJHR5cGUgT3B0aW9uYWwuIFdoYXQgdHlwZSBvZiBvcGVyYXRpb24gaXMgdGhpcz8gSU5TRVJUIG9yIFJFUExBQ0UuIERlZmF1bHRzIHRvIElOU0VSVC4KCSAqIEByZXR1cm4gaW50fGZhbHNlIFRoZSBudW1iZXIgb2Ygcm93cyBhZmZlY3RlZCwgb3IgZmFsc2Ugb24gZXJyb3IuCgkgKi8KCWZ1bmN0aW9uIF9pbnNlcnRfcmVwbGFjZV9oZWxwZXIoICR0YWJsZSwgJGRhdGEsICRmb3JtYXQgPSBudWxsLCAkdHlwZSA9ICdJTlNFUlQnICkgewoJCWlmICggISBpbl9hcnJheSggc3RydG91cHBlciggJHR5cGUgKSwgYXJyYXkoICdSRVBMQUNFJywgJ0lOU0VSVCcgKSApICkKCQkJcmV0dXJuIGZhbHNlOwoJCSR0aGlzLT5pbnNlcnRfaWQgPSAwOwoJCSRmb3JtYXRzID0gJGZvcm1hdCA9IChhcnJheSkgJGZvcm1hdDsKCQkkZmllbGRzID0gYXJyYXlfa2V5cyggJGRhdGEgKTsKCQkkZm9ybWF0dGVkX2ZpZWxkcyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoICRmaWVsZHMgYXMgJGZpZWxkICkgewoJCQlpZiAoICFlbXB0eSggJGZvcm1hdCApICkKCQkJCSRmb3JtID0gKCAkZm9ybSA9IGFycmF5X3NoaWZ0KCAkZm9ybWF0cyApICkgPyAkZm9ybSA6ICRmb3JtYXRbMF07CgkJCWVsc2VpZiAoIGlzc2V0KCAkdGhpcy0+ZmllbGRfdHlwZXNbJGZpZWxkXSApICkKCQkJCSRmb3JtID0gJHRoaXMtPmZpZWxkX3R5cGVzWyRmaWVsZF07CgkJCWVsc2UKCQkJCSRmb3JtID0gJyVzJzsKCQkJJGZvcm1hdHRlZF9maWVsZHNbXSA9ICRmb3JtOwoJCX0KCQkkc3FsID0gInskdHlwZX0gSU5UTyBgJHRhYmxlYCAoYCIgLiBpbXBsb2RlKCAnYCxgJywgJGZpZWxkcyApIC4gImApIFZBTFVFUyAoIiAuIGltcGxvZGUoICIsIiwgJGZvcm1hdHRlZF9maWVsZHMgKSAuICIpIjsKCQlyZXR1cm4gJHRoaXMtPnF1ZXJ5KCAkdGhpcy0+cHJlcGFyZSggJHNxbCwgJGRhdGEgKSApOwoJfQoKCS8qKgoJICogVXBkYXRlIGEgcm93IGluIHRoZSB0YWJsZQoJICoKCSAqIDxjb2RlPgoJICogd3BkYjo6dXBkYXRlKCAndGFibGUnLCBhcnJheSggJ2NvbHVtbicgPT4gJ2ZvbycsICdmaWVsZCcgPT4gJ2JhcicgKSwgYXJyYXkoICdJRCcgPT4gMSApICkKCSAqIHdwZGI6OnVwZGF0ZSggJ3RhYmxlJywgYXJyYXkoICdjb2x1bW4nID0+ICdmb28nLCAnZmllbGQnID0+IDEzMzcgKSwgYXJyYXkoICdJRCcgPT4gMSApLCBhcnJheSggJyVzJywgJyVkJyApLCBhcnJheSggJyVkJyApICkKCSAqIDwvY29kZT4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqIEBzZWUgd3BkYjo6cHJlcGFyZSgpCgkgKiBAc2VlIHdwZGI6OiRmaWVsZF90eXBlcwoJICogQHNlZSB3cF9zZXRfd3BkYl92YXJzKCkKCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR0YWJsZSB0YWJsZSBuYW1lCgkgKiBAcGFyYW0gYXJyYXkgJGRhdGEgRGF0YSB0byB1cGRhdGUgKGluIGNvbHVtbiA9PiB2YWx1ZSBwYWlycykuIEJvdGggJGRhdGEgY29sdW1ucyBhbmQgJGRhdGEgdmFsdWVzIHNob3VsZCBiZSAicmF3IiAobmVpdGhlciBzaG91bGQgYmUgU1FMIGVzY2FwZWQpLgoJICogQHBhcmFtIGFycmF5ICR3aGVyZSBBIG5hbWVkIGFycmF5IG9mIFdIRVJFIGNsYXVzZXMgKGluIGNvbHVtbiA9PiB2YWx1ZSBwYWlycykuIE11bHRpcGxlIGNsYXVzZXMgd2lsbCBiZSBqb2luZWQgd2l0aCBBTkRzLiBCb3RoICR3aGVyZSBjb2x1bW5zIGFuZCAkd2hlcmUgdmFsdWVzIHNob3VsZCBiZSAicmF3Ii4KCSAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJGZvcm1hdCBPcHRpb25hbC4gQW4gYXJyYXkgb2YgZm9ybWF0cyB0byBiZSBtYXBwZWQgdG8gZWFjaCBvZiB0aGUgdmFsdWVzIGluICRkYXRhLiBJZiBzdHJpbmcsIHRoYXQgZm9ybWF0IHdpbGwgYmUgdXNlZCBmb3IgYWxsIG9mIHRoZSB2YWx1ZXMgaW4gJGRhdGEuCgkgKiAJQSBmb3JtYXQgaXMgb25lIG9mICclZCcsICclZicsICclcycgKGludGVnZXIsIGZsb2F0LCBzdHJpbmcpLiBJZiBvbWl0dGVkLCBhbGwgdmFsdWVzIGluICRkYXRhIHdpbGwgYmUgdHJlYXRlZCBhcyBzdHJpbmdzIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkIGluIHdwZGI6OiRmaWVsZF90eXBlcy4KCSAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHdoZXJlX2Zvcm1hdCBPcHRpb25hbC4gQW4gYXJyYXkgb2YgZm9ybWF0cyB0byBiZSBtYXBwZWQgdG8gZWFjaCBvZiB0aGUgdmFsdWVzIGluICR3aGVyZS4gSWYgc3RyaW5nLCB0aGF0IGZvcm1hdCB3aWxsIGJlIHVzZWQgZm9yIGFsbCBvZiB0aGUgaXRlbXMgaW4gJHdoZXJlLiBBIGZvcm1hdCBpcyBvbmUgb2YgJyVkJywgJyVmJywgJyVzJyAoaW50ZWdlciwgZmxvYXQsIHN0cmluZykuIElmIG9taXR0ZWQsIGFsbCB2YWx1ZXMgaW4gJHdoZXJlIHdpbGwgYmUgdHJlYXRlZCBhcyBzdHJpbmdzLgoJICogQHJldHVybiBpbnR8ZmFsc2UgVGhlIG51bWJlciBvZiByb3dzIHVwZGF0ZWQsIG9yIGZhbHNlIG9uIGVycm9yLgoJICovCglmdW5jdGlvbiB1cGRhdGUoICR0YWJsZSwgJGRhdGEsICR3aGVyZSwgJGZvcm1hdCA9IG51bGwsICR3aGVyZV9mb3JtYXQgPSBudWxsICkgewoJCWlmICggISBpc19hcnJheSggJGRhdGEgKSB8fCAhIGlzX2FycmF5KCAkd2hlcmUgKSApCgkJCXJldHVybiBmYWxzZTsKCgkJJGZvcm1hdHMgPSAkZm9ybWF0ID0gKGFycmF5KSAkZm9ybWF0OwoJCSRiaXRzID0gJHdoZXJlcyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoIChhcnJheSkgYXJyYXlfa2V5cyggJGRhdGEgKSBhcyAkZmllbGQgKSB7CgkJCWlmICggIWVtcHR5KCAkZm9ybWF0ICkgKQoJCQkJJGZvcm0gPSAoICRmb3JtID0gYXJyYXlfc2hpZnQoICRmb3JtYXRzICkgKSA/ICRmb3JtIDogJGZvcm1hdFswXTsKCQkJZWxzZWlmICggaXNzZXQoJHRoaXMtPmZpZWxkX3R5cGVzWyRmaWVsZF0pICkKCQkJCSRmb3JtID0gJHRoaXMtPmZpZWxkX3R5cGVzWyRmaWVsZF07CgkJCWVsc2UKCQkJCSRmb3JtID0gJyVzJzsKCQkJJGJpdHNbXSA9ICJgJGZpZWxkYCA9IHskZm9ybX0iOwoJCX0KCgkJJHdoZXJlX2Zvcm1hdHMgPSAkd2hlcmVfZm9ybWF0ID0gKGFycmF5KSAkd2hlcmVfZm9ybWF0OwoJCWZvcmVhY2ggKCAoYXJyYXkpIGFycmF5X2tleXMoICR3aGVyZSApIGFzICRmaWVsZCApIHsKCQkJaWYgKCAhZW1wdHkoICR3aGVyZV9mb3JtYXQgKSApCgkJCQkkZm9ybSA9ICggJGZvcm0gPSBhcnJheV9zaGlmdCggJHdoZXJlX2Zvcm1hdHMgKSApID8gJGZvcm0gOiAkd2hlcmVfZm9ybWF0WzBdOwoJCQllbHNlaWYgKCBpc3NldCggJHRoaXMtPmZpZWxkX3R5cGVzWyRmaWVsZF0gKSApCgkJCQkkZm9ybSA9ICR0aGlzLT5maWVsZF90eXBlc1skZmllbGRdOwoJCQllbHNlCgkJCQkkZm9ybSA9ICclcyc7CgkJCSR3aGVyZXNbXSA9ICJgJGZpZWxkYCA9IHskZm9ybX0iOwoJCX0KCgkJJHNxbCA9ICJVUERBVEUgYCR0YWJsZWAgU0VUICIgLiBpbXBsb2RlKCAnLCAnLCAkYml0cyApIC4gJyBXSEVSRSAnIC4gaW1wbG9kZSggJyBBTkQgJywgJHdoZXJlcyApOwoJCXJldHVybiAkdGhpcy0+cXVlcnkoICR0aGlzLT5wcmVwYXJlKCAkc3FsLCBhcnJheV9tZXJnZSggYXJyYXlfdmFsdWVzKCAkZGF0YSApLCBhcnJheV92YWx1ZXMoICR3aGVyZSApICkgKSApOwoJfQoKCS8qKgoJICogRGVsZXRlIGEgcm93IGluIHRoZSB0YWJsZQoJICoKCSAqIDxjb2RlPgoJICogd3BkYjo6ZGVsZXRlKCAndGFibGUnLCBhcnJheSggJ0lEJyA9PiAxICkgKQoJICogd3BkYjo6ZGVsZXRlKCAndGFibGUnLCBhcnJheSggJ0lEJyA9PiAxICksIGFycmF5KCAnJWQnICkgKQoJICogPC9jb2RlPgoJICoKCSAqIEBzaW5jZSAzLjQuMAoJICogQHNlZSB3cGRiOjpwcmVwYXJlKCkKCSAqIEBzZWUgd3BkYjo6JGZpZWxkX3R5cGVzCgkgKiBAc2VlIHdwX3NldF93cGRiX3ZhcnMoKQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHRhYmxlIHRhYmxlIG5hbWUKCSAqIEBwYXJhbSBhcnJheSAkd2hlcmUgQSBuYW1lZCBhcnJheSBvZiBXSEVSRSBjbGF1c2VzIChpbiBjb2x1bW4gPT4gdmFsdWUgcGFpcnMpLiBNdWx0aXBsZSBjbGF1c2VzIHdpbGwgYmUgam9pbmVkIHdpdGggQU5Ecy4gQm90aCAkd2hlcmUgY29sdW1ucyBhbmQgJHdoZXJlIHZhbHVlcyBzaG91bGQgYmUgInJhdyIuCgkgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICR3aGVyZV9mb3JtYXQgT3B0aW9uYWwuIEFuIGFycmF5IG9mIGZvcm1hdHMgdG8gYmUgbWFwcGVkIHRvIGVhY2ggb2YgdGhlIHZhbHVlcyBpbiAkd2hlcmUuIElmIHN0cmluZywgdGhhdCBmb3JtYXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgb2YgdGhlIGl0ZW1zIGluICR3aGVyZS4gQSBmb3JtYXQgaXMgb25lIG9mICclZCcsICclZicsICclcycgKGludGVnZXIsIGZsb2F0LCBzdHJpbmcpLiBJZiBvbWl0dGVkLCBhbGwgdmFsdWVzIGluICR3aGVyZSB3aWxsIGJlIHRyZWF0ZWQgYXMgc3RyaW5ncyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCBpbiB3cGRiOjokZmllbGRfdHlwZXMuCgkgKiBAcmV0dXJuIGludHxmYWxzZSBUaGUgbnVtYmVyIG9mIHJvd3MgdXBkYXRlZCwgb3IgZmFsc2Ugb24gZXJyb3IuCgkgKi8KCWZ1bmN0aW9uIGRlbGV0ZSggJHRhYmxlLCAkd2hlcmUsICR3aGVyZV9mb3JtYXQgPSBudWxsICkgewoJCWlmICggISBpc19hcnJheSggJHdoZXJlICkgKQoJCQlyZXR1cm4gZmFsc2U7CgoJCSRiaXRzID0gJHdoZXJlcyA9IGFycmF5KCk7CgoJCSR3aGVyZV9mb3JtYXRzID0gJHdoZXJlX2Zvcm1hdCA9IChhcnJheSkgJHdoZXJlX2Zvcm1hdDsKCgkJZm9yZWFjaCAoIGFycmF5X2tleXMoICR3aGVyZSApIGFzICRmaWVsZCApIHsKCQkJaWYgKCAhZW1wdHkoICR3aGVyZV9mb3JtYXQgKSApIHsKCQkJCSRmb3JtID0gKCAkZm9ybSA9IGFycmF5X3NoaWZ0KCAkd2hlcmVfZm9ybWF0cyApICkgPyAkZm9ybSA6ICR3aGVyZV9mb3JtYXRbMF07CgkJCX0gZWxzZWlmICggaXNzZXQoICR0aGlzLT5maWVsZF90eXBlc1sgJGZpZWxkIF0gKSApIHsKCQkJCSRmb3JtID0gJHRoaXMtPmZpZWxkX3R5cGVzWyAkZmllbGQgXTsKCQkJfSBlbHNlIHsKCQkJCSRmb3JtID0gJyVzJzsKCQkJfQoKCQkJJHdoZXJlc1tdID0gIiRmaWVsZCA9ICRmb3JtIjsKCQl9CgoJCSRzcWwgPSAiREVMRVRFIEZST00gJHRhYmxlIFdIRVJFICIgLiBpbXBsb2RlKCAnIEFORCAnLCAkd2hlcmVzICk7CgkJcmV0dXJuICR0aGlzLT5xdWVyeSggJHRoaXMtPnByZXBhcmUoICRzcWwsICR3aGVyZSApICk7Cgl9CgoKCS8qKgoJICogUmV0cmlldmUgb25lIHZhcmlhYmxlIGZyb20gdGhlIGRhdGFiYXNlLgoJICoKCSAqIEV4ZWN1dGVzIGEgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBmcm9tIHRoZSBTUUwgcmVzdWx0LgoJICogSWYgdGhlIFNRTCByZXN1bHQgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBjb2x1bW4gYW5kL29yIG1vcmUgdGhhbiBvbmUgcm93LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlIGluIHRoZSBjb2x1bW4gYW5kIHJvdyBzcGVjaWZpZWQuCgkgKiBJZiAkcXVlcnkgaXMgbnVsbCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgcm93IGZyb20gdGhlIHByZXZpb3VzIFNRTCByZXN1bHQuCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqCgkgKiBAcGFyYW0gc3RyaW5nfG51bGwgJHF1ZXJ5IE9wdGlvbmFsLiBTUUwgcXVlcnkuIERlZmF1bHRzIHRvIG51bGwsIHVzZSB0aGUgcmVzdWx0IGZyb20gdGhlIHByZXZpb3VzIHF1ZXJ5LgoJICogQHBhcmFtIGludCAkeCBPcHRpb25hbC4gQ29sdW1uIG9mIHZhbHVlIHRvIHJldHVybi4gSW5kZXhlZCBmcm9tIDAuCgkgKiBAcGFyYW0gaW50ICR5IE9wdGlvbmFsLiBSb3cgb2YgdmFsdWUgdG8gcmV0dXJuLiBJbmRleGVkIGZyb20gMC4KCSAqIEByZXR1cm4gc3RyaW5nfG51bGwgRGF0YWJhc2UgcXVlcnkgcmVzdWx0IChhcyBzdHJpbmcpLCBvciBudWxsIG9uIGZhaWx1cmUKCSAqLwoJZnVuY3Rpb24gZ2V0X3ZhciggJHF1ZXJ5ID0gbnVsbCwgJHggPSAwLCAkeSA9IDAgKSB7CgkJJHRoaXMtPmZ1bmNfY2FsbCA9ICJcJGRiLT5nZXRfdmFyKFwiJHF1ZXJ5XCIsICR4LCAkeSkiOwoJCWlmICggJHF1ZXJ5ICkKCQkJJHRoaXMtPnF1ZXJ5KCAkcXVlcnkgKTsKCgkJLy8gRXh0cmFjdCB2YXIgb3V0IG9mIGNhY2hlZCByZXN1bHRzIGJhc2VkIHgseSB2YWxzCgkJaWYgKCAhZW1wdHkoICR0aGlzLT5sYXN0X3Jlc3VsdFskeV0gKSApIHsKCQkJJHZhbHVlcyA9IGFycmF5X3ZhbHVlcyggZ2V0X29iamVjdF92YXJzKCAkdGhpcy0+bGFzdF9yZXN1bHRbJHldICkgKTsKCQl9CgoJCS8vIElmIHRoZXJlIGlzIGEgdmFsdWUgcmV0dXJuIGl0IGVsc2UgcmV0dXJuIG51bGwKCQlyZXR1cm4gKCBpc3NldCggJHZhbHVlc1skeF0gKSAmJiAkdmFsdWVzWyR4XSAhPT0gJycgKSA/ICR2YWx1ZXNbJHhdIDogbnVsbDsKCX0KCgkvKioKCSAqIFJldHJpZXZlIG9uZSByb3cgZnJvbSB0aGUgZGF0YWJhc2UuCgkgKgoJICogRXhlY3V0ZXMgYSBTUUwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJvdyBmcm9tIHRoZSBTUUwgcmVzdWx0LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZ3xudWxsICRxdWVyeSBTUUwgcXVlcnkuCgkgKiBAcGFyYW0gc3RyaW5nICRvdXRwdXQgT3B0aW9uYWwuIG9uZSBvZiBBUlJBWV9BIHwgQVJSQVlfTiB8IE9CSkVDVCBjb25zdGFudHMuIFJldHVybiBhbiBhc3NvY2lhdGl2ZSBhcnJheSAoY29sdW1uID0+IHZhbHVlLCAuLi4pLAoJICogCWEgbnVtZXJpY2FsbHkgaW5kZXhlZCBhcnJheSAoMCA9PiB2YWx1ZSwgLi4uKSBvciBhbiBvYmplY3QgKCAtPmNvbHVtbiA9IHZhbHVlICksIHJlc3BlY3RpdmVseS4KCSAqIEBwYXJhbSBpbnQgJHkgT3B0aW9uYWwuIFJvdyB0byByZXR1cm4uIEluZGV4ZWQgZnJvbSAwLgoJICogQHJldHVybiBtaXhlZCBEYXRhYmFzZSBxdWVyeSByZXN1bHQgaW4gZm9ybWF0IHNwZWNpZmllZCBieSAkb3V0cHV0IG9yIG51bGwgb24gZmFpbHVyZQoJICovCglmdW5jdGlvbiBnZXRfcm93KCAkcXVlcnkgPSBudWxsLCAkb3V0cHV0ID0gT0JKRUNULCAkeSA9IDAgKSB7CgkJJHRoaXMtPmZ1bmNfY2FsbCA9ICJcJGRiLT5nZXRfcm93KFwiJHF1ZXJ5XCIsJG91dHB1dCwkeSkiOwoJCWlmICggJHF1ZXJ5ICkKCQkJJHRoaXMtPnF1ZXJ5KCAkcXVlcnkgKTsKCQllbHNlCgkJCXJldHVybiBudWxsOwoKCQlpZiAoICFpc3NldCggJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSApICkKCQkJcmV0dXJuIG51bGw7CgoJCWlmICggJG91dHB1dCA9PSBPQkpFQ1QgKSB7CgkJCXJldHVybiAkdGhpcy0+bGFzdF9yZXN1bHRbJHldID8gJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSA6IG51bGw7CgkJfSBlbHNlaWYgKCAkb3V0cHV0ID09IEFSUkFZX0EgKSB7CgkJCXJldHVybiAkdGhpcy0+bGFzdF9yZXN1bHRbJHldID8gZ2V0X29iamVjdF92YXJzKCAkdGhpcy0+bGFzdF9yZXN1bHRbJHldICkgOiBudWxsOwoJCX0gZWxzZWlmICggJG91dHB1dCA9PSBBUlJBWV9OICkgewoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0WyR5XSA/IGFycmF5X3ZhbHVlcyggZ2V0X29iamVjdF92YXJzKCAkdGhpcy0+bGFzdF9yZXN1bHRbJHldICkgKSA6IG51bGw7CgkJfSBlbHNlIHsKCQkJJHRoaXMtPnByaW50X2Vycm9yKCAiIFwkZGItPmdldF9yb3coc3RyaW5nIHF1ZXJ5LCBvdXRwdXQgdHlwZSwgaW50IG9mZnNldCkgLS0gT3V0cHV0IHR5cGUgbXVzdCBiZSBvbmUgb2Y6IE9CSkVDVCwgQVJSQVlfQSwgQVJSQVlfTiIgKTsKCQl9Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZSBvbmUgY29sdW1uIGZyb20gdGhlIGRhdGFiYXNlLgoJICoKCSAqIEV4ZWN1dGVzIGEgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBjb2x1bW4gZnJvbSB0aGUgU1FMIHJlc3VsdC4KCSAqIElmIHRoZSBTUUwgcmVzdWx0IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY29sdW1uLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbHVtbiBzcGVjaWZpZWQuCgkgKiBJZiAkcXVlcnkgaXMgbnVsbCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzcGVjaWZpZWQgY29sdW1uIGZyb20gdGhlIHByZXZpb3VzIFNRTCByZXN1bHQuCgkgKgoJICogQHNpbmNlIDAuNzEKCSAqCgkgKiBAcGFyYW0gc3RyaW5nfG51bGwgJHF1ZXJ5IE9wdGlvbmFsLiBTUUwgcXVlcnkuIERlZmF1bHRzIHRvIHByZXZpb3VzIHF1ZXJ5LgoJICogQHBhcmFtIGludCAkeCBPcHRpb25hbC4gQ29sdW1uIHRvIHJldHVybi4gSW5kZXhlZCBmcm9tIDAuCgkgKiBAcmV0dXJuIGFycmF5IERhdGFiYXNlIHF1ZXJ5IHJlc3VsdC4gQXJyYXkgaW5kZXhlZCBmcm9tIDAgYnkgU1FMIHJlc3VsdCByb3cgbnVtYmVyLgoJICovCglmdW5jdGlvbiBnZXRfY29sKCAkcXVlcnkgPSBudWxsICwgJHggPSAwICkgewoJCWlmICggJHF1ZXJ5ICkKCQkJJHRoaXMtPnF1ZXJ5KCAkcXVlcnkgKTsKCgkJJG5ld19hcnJheSA9IGFycmF5KCk7CgkJLy8gRXh0cmFjdCB0aGUgY29sdW1uIHZhbHVlcwoJCWZvciAoICRpID0gMCwgJGogPSBjb3VudCggJHRoaXMtPmxhc3RfcmVzdWx0ICk7ICRpIDwgJGo7ICRpKysgKSB7CgkJCSRuZXdfYXJyYXlbJGldID0gJHRoaXMtPmdldF92YXIoIG51bGwsICR4LCAkaSApOwoJCX0KCQlyZXR1cm4gJG5ld19hcnJheTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIGFuIGVudGlyZSBTUUwgcmVzdWx0IHNldCBmcm9tIHRoZSBkYXRhYmFzZSAoaS5lLiwgbWFueSByb3dzKQoJICoKCSAqIEV4ZWN1dGVzIGEgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBlbnRpcmUgU1FMIHJlc3VsdC4KCSAqCgkgKiBAc2luY2UgMC43MQoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IFNRTCBxdWVyeS4KCSAqIEBwYXJhbSBzdHJpbmcgJG91dHB1dCBPcHRpb25hbC4gQW55IG9mIEFSUkFZX0EgfCBBUlJBWV9OIHwgT0JKRUNUIHwgT0JKRUNUX0sgY29uc3RhbnRzLiBXaXRoIG9uZSBvZiB0aGUgZmlyc3QgdGhyZWUsIHJldHVybiBhbiBhcnJheSBvZiByb3dzIGluZGV4ZWQgZnJvbSAwIGJ5IFNRTCByZXN1bHQgcm93IG51bWJlci4KCSAqIAlFYWNoIHJvdyBpcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSAoY29sdW1uID0+IHZhbHVlLCAuLi4pLCBhIG51bWVyaWNhbGx5IGluZGV4ZWQgYXJyYXkgKDAgPT4gdmFsdWUsIC4uLiksIG9yIGFuIG9iamVjdC4gKCAtPmNvbHVtbiA9IHZhbHVlICksIHJlc3BlY3RpdmVseS4KCSAqIAlXaXRoIE9CSkVDVF9LLCByZXR1cm4gYW4gYXNzb2NpYXRpdmUgYXJyYXkgb2Ygcm93IG9iamVjdHMga2V5ZWQgYnkgdGhlIHZhbHVlIG9mIGVhY2ggcm93J3MgZmlyc3QgY29sdW1uJ3MgdmFsdWUuIER1cGxpY2F0ZSBrZXlzIGFyZSBkaXNjYXJkZWQuCgkgKiBAcmV0dXJuIG1peGVkIERhdGFiYXNlIHF1ZXJ5IHJlc3VsdHMKCSAqLwoJZnVuY3Rpb24gZ2V0X3Jlc3VsdHMoICRxdWVyeSA9IG51bGwsICRvdXRwdXQgPSBPQkpFQ1QgKSB7CgkJJHRoaXMtPmZ1bmNfY2FsbCA9ICJcJGRiLT5nZXRfcmVzdWx0cyhcIiRxdWVyeVwiLCAkb3V0cHV0KSI7CgoJCWlmICggJHF1ZXJ5ICkKCQkJJHRoaXMtPnF1ZXJ5KCAkcXVlcnkgKTsKCQllbHNlCgkJCXJldHVybiBudWxsOwoKCQkkbmV3X2FycmF5ID0gYXJyYXkoKTsKCQlpZiAoICRvdXRwdXQgPT0gT0JKRUNUICkgewoJCQkvLyBSZXR1cm4gYW4gaW50ZWdlci1rZXllZCBhcnJheSBvZiByb3cgb2JqZWN0cwoJCQlyZXR1cm4gJHRoaXMtPmxhc3RfcmVzdWx0OwoJCX0gZWxzZWlmICggJG91dHB1dCA9PSBPQkpFQ1RfSyApIHsKCQkJLy8gUmV0dXJuIGFuIGFycmF5IG9mIHJvdyBvYmplY3RzIHdpdGgga2V5cyBmcm9tIGNvbHVtbiAxCgkJCS8vIChEdXBsaWNhdGVzIGFyZSBkaXNjYXJkZWQpCgkJCWZvcmVhY2ggKCAkdGhpcy0+bGFzdF9yZXN1bHQgYXMgJHJvdyApIHsKCQkJCSR2YXJfYnlfcmVmID0gZ2V0X29iamVjdF92YXJzKCAkcm93ICk7CgkJCQkka2V5ID0gYXJyYXlfc2hpZnQoICR2YXJfYnlfcmVmICk7CgkJCQlpZiAoICEgaXNzZXQoICRuZXdfYXJyYXlbICRrZXkgXSApICkKCQkJCQkkbmV3X2FycmF5WyAka2V5IF0gPSAkcm93OwoJCQl9CgkJCXJldHVybiAkbmV3X2FycmF5OwoJCX0gZWxzZWlmICggJG91dHB1dCA9PSBBUlJBWV9BIHx8ICRvdXRwdXQgPT0gQVJSQVlfTiApIHsKCQkJLy8gUmV0dXJuIGFuIGludGVnZXIta2V5ZWQgYXJyYXkgb2YuLi4KCQkJaWYgKCAkdGhpcy0+bGFzdF9yZXN1bHQgKSB7CgkJCQlmb3JlYWNoKCAoYXJyYXkpICR0aGlzLT5sYXN0X3Jlc3VsdCBhcyAkcm93ICkgewoJCQkJCWlmICggJG91dHB1dCA9PSBBUlJBWV9OICkgewoJCQkJCQkvLyAuLi5pbnRlZ2VyLWtleWVkIHJvdyBhcnJheXMKCQkJCQkJJG5ld19hcnJheVtdID0gYXJyYXlfdmFsdWVzKCBnZXRfb2JqZWN0X3ZhcnMoICRyb3cgKSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCS8vIC4uLmNvbHVtbiBuYW1lLWtleWVkIHJvdyBhcnJheXMKCQkJCQkJJG5ld19hcnJheVtdID0gZ2V0X29iamVjdF92YXJzKCAkcm93ICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCXJldHVybiAkbmV3X2FycmF5OwoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIExvYWQgdGhlIGNvbHVtbiBtZXRhZGF0YSBmcm9tIHRoZSBsYXN0IHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSAzLjUuMAoJICoKCSAqIEBhY2Nlc3MgcHJvdGVjdGVkCgkgKi8KCXByb3RlY3RlZCBmdW5jdGlvbiBsb2FkX2NvbF9pbmZvKCkgewoJCWlmICggJHRoaXMtPmNvbF9pbmZvICkKCQkJcmV0dXJuOwoKCQlmb3IgKCAkaSA9IDA7ICRpIDwgQG15c3FsX251bV9maWVsZHMoICR0aGlzLT5yZXN1bHQgKTsgJGkrKyApIHsKCQkJJHRoaXMtPmNvbF9pbmZvWyAkaSBdID0gQG15c3FsX2ZldGNoX2ZpZWxkKCAkdGhpcy0+cmVzdWx0LCAkaSApOwoJCX0KCX0KCgkvKioKCSAqIFJldHJpZXZlIGNvbHVtbiBtZXRhZGF0YSBmcm9tIHRoZSBsYXN0IHF1ZXJ5LgoJICoKCSAqIEBzaW5jZSAwLjcxCgkgKgoJICogQHBhcmFtIHN0cmluZyAkaW5mb190eXBlIE9wdGlvbmFsLiBUeXBlIG9uZSBvZiBuYW1lLCB0YWJsZSwgZGVmLCBtYXhfbGVuZ3RoLCBub3RfbnVsbCwgcHJpbWFyeV9rZXksIG11bHRpcGxlX2tleSwgdW5pcXVlX2tleSwgbnVtZXJpYywgYmxvYiwgdHlwZSwgdW5zaWduZWQsIHplcm9maWxsCgkgKiBAcGFyYW0gaW50ICRjb2xfb2Zmc2V0IE9wdGlvbmFsLiAwOiBjb2wgbmFtZS4gMTogd2hpY2ggdGFibGUgdGhlIGNvbCdzIGluLiAyOiBjb2wncyBtYXggbGVuZ3RoLiAzOiBpZiB0aGUgY29sIGlzIG51bWVyaWMuIDQ6IGNvbCdzIHR5cGUKCSAqIEByZXR1cm4gbWl4ZWQgQ29sdW1uIFJlc3VsdHMKCSAqLwoJZnVuY3Rpb24gZ2V0X2NvbF9pbmZvKCAkaW5mb190eXBlID0gJ25hbWUnLCAkY29sX29mZnNldCA9IC0xICkgewoJCSR0aGlzLT5sb2FkX2NvbF9pbmZvKCk7CgoJCWlmICggJHRoaXMtPmNvbF9pbmZvICkgewoJCQlpZiAoICRjb2xfb2Zmc2V0ID09IC0xICkgewoJCQkJJGkgPSAwOwoJCQkJJG5ld19hcnJheSA9IGFycmF5KCk7CgkJCQlmb3JlYWNoKCAoYXJyYXkpICR0aGlzLT5jb2xfaW5mbyBhcyAkY29sICkgewoJCQkJCSRuZXdfYXJyYXlbJGldID0gJGNvbC0+eyRpbmZvX3R5cGV9OwoJCQkJCSRpKys7CgkJCQl9CgkJCQlyZXR1cm4gJG5ld19hcnJheTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAkdGhpcy0+Y29sX2luZm9bJGNvbF9vZmZzZXRdLT57JGluZm9fdHlwZX07CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBTdGFydHMgdGhlIHRpbWVyLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEByZXR1cm4gdHJ1ZQoJICovCglmdW5jdGlvbiB0aW1lcl9zdGFydCgpIHsKCQkkdGhpcy0+dGltZV9zdGFydCA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJICogU3RvcHMgdGhlIGRlYnVnZ2luZyB0aW1lci4KCSAqCgkgKiBAc2luY2UgMS41LjAKCSAqCgkgKiBAcmV0dXJuIGZsb2F0IFRvdGFsIHRpbWUgc3BlbnQgb24gdGhlIHF1ZXJ5LCBpbiBzZWNvbmRzCgkgKi8KCWZ1bmN0aW9uIHRpbWVyX3N0b3AoKSB7CgkJcmV0dXJuICggbWljcm90aW1lKCB0cnVlICkgLSAkdGhpcy0+dGltZV9zdGFydCApOwoJfQoKCS8qKgoJICogV3JhcHMgZXJyb3JzIGluIGEgbmljZSBoZWFkZXIgYW5kIGZvb3RlciBhbmQgZGllcy4KCSAqCgkgKiBXaWxsIG5vdCBkaWUgaWYgd3BkYjo6JHNob3dfZXJyb3JzIGlzIGZhbHNlLgoJICoKCSAqIEBzaW5jZSAxLjUuMAoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UgVGhlIEVycm9yIG1lc3NhZ2UKCSAqIEBwYXJhbSBzdHJpbmcgJGVycm9yX2NvZGUgT3B0aW9uYWwuIEEgQ29tcHV0ZXIgcmVhZGFibGUgc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBlcnJvci4KCSAqIEByZXR1cm4gZmFsc2V8dm9pZAoJICovCglmdW5jdGlvbiBiYWlsKCAkbWVzc2FnZSwgJGVycm9yX2NvZGUgPSAnNTAwJyApIHsKCQlpZiAoICEkdGhpcy0+c2hvd19lcnJvcnMgKSB7CgkJCWlmICggY2xhc3NfZXhpc3RzKCAnV1BfRXJyb3InICkgKQoJCQkJJHRoaXMtPmVycm9yID0gbmV3IFdQX0Vycm9yKCRlcnJvcl9jb2RlLCAkbWVzc2FnZSk7CgkJCWVsc2UKCQkJCSR0aGlzLT5lcnJvciA9ICRtZXNzYWdlOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXdwX2RpZSgkbWVzc2FnZSk7Cgl9CgoJLyoqCgkgKiBXaGV0aGVyIE15U1FMIGRhdGFiYXNlIGlzIGF0IGxlYXN0IHRoZSByZXF1aXJlZCBtaW5pbXVtIHZlcnNpb24uCgkgKgoJICogQHNpbmNlIDIuNS4wCgkgKiBAdXNlcyAkd3BfdmVyc2lvbgoJICogQHVzZXMgJHJlcXVpcmVkX215c3FsX3ZlcnNpb24KCSAqCgkgKiBAcmV0dXJuIFdQX0Vycm9yCgkgKi8KCWZ1bmN0aW9uIGNoZWNrX2RhdGFiYXNlX3ZlcnNpb24oKSB7CgkJZ2xvYmFsICR3cF92ZXJzaW9uLCAkcmVxdWlyZWRfbXlzcWxfdmVyc2lvbjsKCQkvLyBNYWtlIHN1cmUgdGhlIHNlcnZlciBoYXMgdGhlIHJlcXVpcmVkIE15U1FMIHZlcnNpb24KCQlpZiAoIHZlcnNpb25fY29tcGFyZSgkdGhpcy0+ZGJfdmVyc2lvbigpLCAkcmVxdWlyZWRfbXlzcWxfdmVyc2lvbiwgJzwnKSApCgkJCXJldHVybiBuZXcgV1BfRXJyb3IoJ2RhdGFiYXNlX3ZlcnNpb24nLCBzcHJpbnRmKCBfXyggJzxzdHJvbmc+RVJST1I8L3N0cm9uZz46IFdvcmRQcmVzcyAlMSRzIHJlcXVpcmVzIE15U1FMICUyJHMgb3IgaGlnaGVyJyApLCAkd3BfdmVyc2lvbiwgJHJlcXVpcmVkX215c3FsX3ZlcnNpb24gKSk7Cgl9CgoJLyoqCgkgKiBXaGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBjb2xsYXRpb24uCgkgKgoJICogQ2FsbGVkIHdoZW4gV29yZFByZXNzIGlzIGdlbmVyYXRpbmcgdGhlIHRhYmxlIHNjaGVtZS4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqIEBkZXByZWNhdGVkIDMuNS4wCgkgKiBAZGVwcmVjYXRlZCBVc2Ugd3BkYjo6aGFzX2NhcCggJ2NvbGxhdGlvbicgKQoJICoKCSAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIGNvbGxhdGlvbiBpcyBzdXBwb3J0ZWQsIGZhbHNlIGlmIHZlcnNpb24gZG9lcyBub3QKCSAqLwoJZnVuY3Rpb24gc3VwcG9ydHNfY29sbGF0aW9uKCkgewoJCV9kZXByZWNhdGVkX2Z1bmN0aW9uKCBfX0ZVTkNUSU9OX18sICczLjUnLCAnd3BkYjo6aGFzX2NhcCggXCdjb2xsYXRpb25cJyApJyApOwoJCXJldHVybiAkdGhpcy0+aGFzX2NhcCggJ2NvbGxhdGlvbicgKTsKCX0KCgkvKioKCSAqIFRoZSBkYXRhYmFzZSBjaGFyYWN0ZXIgY29sbGF0ZS4KCSAqCgkgKiBAc2luY2UgMy41LjAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YWJhc2UgY2hhcmFjdGVyIGNvbGxhdGUuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfY2hhcnNldF9jb2xsYXRlKCkgewoJCSRjaGFyc2V0X2NvbGxhdGUgPSAnJzsKCgkJaWYgKCAhIGVtcHR5KCAkdGhpcy0+Y2hhcnNldCApICkKCQkJJGNoYXJzZXRfY29sbGF0ZSA9ICJERUZBVUxUIENIQVJBQ1RFUiBTRVQgJHRoaXMtPmNoYXJzZXQiOwoJCWlmICggISBlbXB0eSggJHRoaXMtPmNvbGxhdGUgKSApCgkJCSRjaGFyc2V0X2NvbGxhdGUgLj0gIiBDT0xMQVRFICR0aGlzLT5jb2xsYXRlIjsKCgkJcmV0dXJuICRjaGFyc2V0X2NvbGxhdGU7Cgl9CgoJLyoqCgkgKiBEZXRlcm1pbmUgaWYgYSBkYXRhYmFzZSBzdXBwb3J0cyBhIHBhcnRpY3VsYXIgZmVhdHVyZS4KCSAqCgkgKiBAc2luY2UgMi43LjAKCSAqIEBzZWUgd3BkYjo6ZGJfdmVyc2lvbigpCgkgKgoJICogQHBhcmFtIHN0cmluZyAkZGJfY2FwIFRoZSBmZWF0dXJlIHRvIGNoZWNrIGZvci4KCSAqIEByZXR1cm4gYm9vbAoJICovCglmdW5jdGlvbiBoYXNfY2FwKCAkZGJfY2FwICkgewoJCSR2ZXJzaW9uID0gJHRoaXMtPmRiX3ZlcnNpb24oKTsKCgkJc3dpdGNoICggc3RydG9sb3dlciggJGRiX2NhcCApICkgewoJCQljYXNlICdjb2xsYXRpb24nIDogICAgLy8gQHNpbmNlIDIuNS4wCgkJCWNhc2UgJ2dyb3VwX2NvbmNhdCcgOiAvLyBAc2luY2UgMi43LjAKCQkJY2FzZSAnc3VicXVlcmllcycgOiAgIC8vIEBzaW5jZSAyLjcuMAoJCQkJcmV0dXJuIHZlcnNpb25fY29tcGFyZSggJHZlcnNpb24sICc0LjEnLCAnPj0nICk7CgkJCWNhc2UgJ3NldF9jaGFyc2V0JyA6CgkJCQlyZXR1cm4gdmVyc2lvbl9jb21wYXJlKCAkdmVyc2lvbiwgJzUuMC43JywgJz49JyApOwoJCX07CgoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxlZCB3cGRiLgoJICoKCSAqIFNlYXJjaGVzIHVwIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB1bnRpbCBpdCByZWFjaGVzCgkgKiB0aGUgb25lIHRoYXQgd291bGQgbW9zdCBsb2dpY2FsbHkgaGFkIGNhbGxlZCB0aGlzIG1ldGhvZC4KCSAqCgkgKiBAc2luY2UgMi41LjAKCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBUaGUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbgoJICovCglmdW5jdGlvbiBnZXRfY2FsbGVyKCkgewoJCXJldHVybiB3cF9kZWJ1Z19iYWNrdHJhY2Vfc3VtbWFyeSggX19DTEFTU19fICk7Cgl9CgoJLyoqCgkgKiBUaGUgZGF0YWJhc2UgdmVyc2lvbiBudW1iZXIuCgkgKgoJICogQHNpbmNlIDIuNy4wCgkgKgoJICogQHJldHVybiBmYWxzZXxzdHJpbmcgZmFsc2Ugb24gZmFpbHVyZSwgdmVyc2lvbiBudW1iZXIgb24gc3VjY2VzcwoJICovCglmdW5jdGlvbiBkYl92ZXJzaW9uKCkgewoJCXJldHVybiBwcmVnX3JlcGxhY2UoICcvW14wLTkuXS4qLycsICcnLCBteXNxbF9nZXRfc2VydmVyX2luZm8oICR0aGlzLT5kYmggKSApOwoJfQp9Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/classes/wp-db.php,importbuddy/classes/wp-db.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax.php,importbuddy/controllers/ajax.php
PD9waHAKY2xhc3MgcGJfYmFja3VwYnVkZHlfYWpheCBleHRlbmRzIHBiX2JhY2t1cGJ1ZGR5X2FqYXhjb3JlIHsKfQo/Pg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax.php,importbuddy/controllers/ajax.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/css/nprogress.css,importbuddy/css/nprogress.css
LyogTWFrZSBjbGlja3MgcGFzcy10aHJvdWdoICovCiNucHJvZ3Jlc3MgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgojbnByb2dyZXNzIC5iYXIgewogIGJhY2tncm91bmQ6ICMyOWQ7CgogIHBvc2l0aW9uOiBmaXhlZDsKICB6LWluZGV4OiA3NTsKICB0b3A6IDQ4cHg7CiAgbGVmdDogMDsKCiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiA0cHg7Cn0KCi8qIEZhbmN5IGJsdXIgZWZmZWN0ICovCiNucHJvZ3Jlc3MgLnBlZyB7Cgp9CgovKiBSZW1vdmUgdGhlc2UgdG8gZ2V0IHJpZCBvZiB0aGUgc3Bpbm5lciAqLwojbnByb2dyZXNzIC5zcGlubmVyIHsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogZml4ZWQ7CiAgei1pbmRleDogMTAzMTsKICB0b3A6IDY1cHg7CiAgcmlnaHQ6IDE1cHg7Cn0KCiNucHJvZ3Jlc3MgLnNwaW5uZXItaWNvbiB7CiAgd2lkdGg6IDQwcHg7CiAgaGVpZ2h0OiA0MHB4OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CgogIGJvcmRlcjogc29saWQgNHB4IHRyYW5zcGFyZW50OwogIGJvcmRlci10b3AtY29sb3I6ICMyOWQ7CiAgYm9yZGVyLWxlZnQtY29sb3I6ICMyOWQ7CiAgYm9yZGVyLXJhZGl1czogNTAlOwoKICAtd2Via2l0LWFuaW1hdGlvbjogbnByb2dyZXNzLXNwaW5uZXIgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgICAgYW5pbWF0aW9uOiBucHJvZ3Jlc3Mtc3Bpbm5lciA0MDBtcyBsaW5lYXIgaW5maW5pdGU7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBucHJvZ3Jlc3Mtc3Bpbm5lciB7CiAgMCUgICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH0KICAxMDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9Cn0KQGtleWZyYW1lcyBucHJvZ3Jlc3Mtc3Bpbm5lciB7CiAgMCUgICB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CiAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KfQo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/css/nprogress.css,importbuddy/css/nprogress.css
###PACKDATA,FILE_START,/_importbuddy/importbuddy/css/style.css,importbuddy/css/style.css
QGltcG9ydCB1cmwoaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9T3BlbitTYW5zOjQwMGl0YWxpYyw0MDAsNzAwKTsKCgovKioqKioqKioqKioqKioqKioqKioqIAoJQmFzaWNzCioqKioqKioqKioqKioqKioqKioqKi8KCmEgewoJY29sb3I6ICMwMDg0Y2I7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KYTpob3ZlciB7Cgljb2xvcjogIzQ0NDsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9Cgoud2lkZWZhdCB7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsKCS1tb3otYm9yZGVyLXJhZGl1czogM3B4OwoJYm9yZGVyLXJhZGl1czogM3B4OwoJYm9yZGVyLXNwYWNpbmc6IDA7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHg7CgljbGVhcjogYm90aDsKCW1hcmdpbjogMDsKCXdpZHRoOiAxMDAlOwoJYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKCWJvcmRlci1jb2xvcjogI0RGREZERjsKfQoud2lkZWZhdCB0ZCwgCi53aWRlZmF0IHRoIHsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKCWJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOwoJYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4OwoJZm9udC1zaXplOiAxMXB4OwoJYm9yZGVyLWNvbG9yOiAjREZERkRGOwp9Ci53aWRlZmF0IHRoIHsKCWJhY2tncm91bmQ6ICNERkRGREY7Cgljb2xvcjogIzMzMzMzMzsKCWZvbnQtc2l6ZTogMTFweDsKCXRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKCWxpbmUtaGVpZ2h0OiAxLjNlbTsKCXBhZGRpbmc6IDdweCA3cHggOHB4OwoJdGV4dC1hbGlnbjogbGVmdDsKfQoud2lkZWZhdCB0ZCB7CglwYWRkaW5nOiAzcHggN3B4OwoJdmVydGljYWwtYWxpZ246IHRvcDsKfQpoMSB7Cgljb2xvcjogIzQ2NDY0NjsKCWZvbnQtc2l6ZTogMjRweDsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKCWZvbnQtc3R5bGU6IGl0YWxpYzsKCW1hcmdpbi10b3A6IDBweDsKfQpoMiB7Cgljb2xvcjogIzQ2NDY0NjsKCWZvbnQtc2l6ZTogMjBweDsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKCWZvbnQtc3R5bGU6IGl0YWxpYzsKCW1hcmdpbi10b3A6IC0xMHB4Owp9CmgzIHsKCWZvbnQtc2l6ZTogMS4yZW07Cglmb250LXdlaWdodDogMjAwOwp9CmltZyB7Cgl2ZXJ0aWNhbC1hbGlnbjogLTJweDsKCW1heC13aWR0aDogMTAwJTsKCWhlaWdodDogYXV0bzsKfQp0aCB7Cglmb250LXdlaWdodDogbm9ybWFsOwp9CgppbnB1dFt0eXBlPSJ0ZXh0Il0sIAppbnB1dFt0eXBlPSJwYXNzd29yZCJdLCAKdGV4dGFyZWEgewoJbWFyZ2luOiAzcHg7CglwYWRkaW5nOiA4cHg7CgktbW96LWJvcmRlci1yYWRpdXM6M3B4IDNweCAzcHggM3B4OwoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7Cglib3JkZXItcmFkaXVzOiAzcHg7Cglib3JkZXItc3R5bGU6c29saWQ7Cglib3JkZXItd2lkdGg6MXB4OwoJYm9yZGVyLWNvbG9yOiAjRDZENkQ2OwoJLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94OwoJLW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Cglib3gtc2l6aW5nOiBib3JkZXItYm94OwoJCglmb250LXNpemU6IDEuMmVtOwoJZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnICxzYW5zLXNlcmlmOwp9CgppbnB1dFt0eXBlPSJ0ZXh0Il06Zm9jdXMsIAppbnB1dFt0eXBlPSJwYXNzd29yZCJdOmZvY3VzLCAKdGV4dGFyZWE6Zm9jdXMgewoJb3V0bGluZTpub25lOwoJYm9yZGVyLWNvbG9yOiAjOTk5Owp9CnRleHRhcmVhIHsKCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwoJZm9udC1zaXplOiAxM3B4OwoJbGluZS1oZWlnaHQ6IDEuNGVtOwoJY29sb3I6ICM0NjQ2NDY7Cgl3aWR0aDogMTAwJTsKCW1pbi1oZWlnaHQ6IDIwMHB4Owp9CgpsYWJlbCB7Cgl3aWR0aDogMjAwcHg7CgltYXJnaW4tdG9wOiA3cHg7Cn0KCi8qIEJ1dHRvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgouaXQtYnV0dG9uLAouYnV0dG9uLAouYnV0dG9uLXByaW1hcnkgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJYm9yZGVyOm5vbmU7CglvdXRsaW5lOm5vbmU7Cglwb3NpdGlvbjogcmVsYXRpdmU7CgltYXJnaW46IDAuNWVtIDAuMjVlbTsKCXBhZGRpbmc6IC41ZW0gMWVtOwoJYmFja2dyb3VuZDogIzJFQTJDQzsKCWNvbG9yOiAjZmZmOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJZm9udC1zaXplOiAxLjEyNWVtOwoJYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMyNzc2OTM7Cglib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi5pdC1idXR0b246aG92ZXIsCi5idXR0b246aG92ZXIsCi5idXR0b24tcHJpbWFyeTpob3ZlciB7Cglib3JkZXItYm90dG9tLWNvbG9yOiAjMTM0NTVCOwoJY29sb3I6ICNGRkZGRkY7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgljdXJzb3I6cG9pbnRlcjsKfQoKLml0LWJ1dHRvbjpob3ZlciB7CgliYWNrZ3JvdW5kOiAjM2FiMWRiOwp9CgouYnV0dG9uLXNlY29uZGFyeSB7CgliYWNrZ3JvdW5kOiAjZjFmMWYxOwoJY29sb3I6ICM2NjY7Cglib3JkZXI6IDFweCBzb2xpZCAjZWJlYmViOwoJYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNjOWM5Yzk7Cn0KCi5idXR0b24tc2Vjb25kYXJ5OmhvdmVyIHsKCWNvbG9yOiAjNDQ0OwoJYm9yZGVyLWJvdHRvbS1jb2xvcjogIzk5OTsKfQoKLmJ1dHRvbi10ZXJ0aWFyeSB7CgliYWNrZ3JvdW5kOiAjZjFmMWYxOwoJY29sb3I6ICM2NjY7Cglib3JkZXI6IDFweCBzb2xpZCAjZWJlYmViOwoJYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNjOWM5Yzk7CglwYWRkaW5nOiAwIDFlbTsKCWZvbnQtc2l6ZTogLjg3NWVtOwp9CgouYnV0dG9uLXRlcnRpYXJ5OmhvdmVyIHsKCWNvbG9yOiAjNDQ0OwoJYm9yZGVyLWJvdHRvbS1jb2xvcjogIzk5OTsKfQoKLmJ1dHRvbl9kaXNhYmxlZCB7CglvcGFjaXR5OiAuNzsKfQoKCgovKiBFcnJvcnMgYW5kIE1lc3NhZ2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLnBiX2JhY2t1cGJ1ZGR5X2FsZXJ0IHsKCW1hcmdpbjogMCAwIDJlbSAwOwoJYmFja2dyb3VuZC1jb2xvcjojRkZGRkUwOwoJYm9yZGVyOiAxcHggc29saWQgI0U2REI1NTsKCXBhZGRpbmc6IDEwcHg7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsKCS1tb3otYm9yZGVyLXJhZGl1czogM3B4OwoJYm9yZGVyLXJhZGl1czogM3B4Owp9CgouZXJyb3IsIAoudXBkYXRlZCB7Cglmb250LXNpemU6IDAuOGVtOwp9Ci5lcnJvciBwLCAKLnVwZGF0ZWQgcCB7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwp9CgoKCgoKLyogUGFnZSBMYXlvdXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmJvZHkgewoJLy9iYWNrZ3JvdW5kOiAjRkZGRkZGOwoJZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnICxzYW5zLXNlcmlmOwoJZm9udC1zaXplOiAxZW07Cgljb2xvcjogIzQ2NDY0NjsKCWZvbnQtd2VpZ2h0OiAyMDA7CgltYXJnaW46IDA7Cn0KCi50b3BOYXYgewoJcG9zaXRpb246IGZpeGVkOwoJdG9wOiAwOwoJd2lkdGg6IDEwMCU7CgliYWNrZ3JvdW5kOiAjMmEyZjMzOwoJY29sb3I6ICNmZmY7Cglmb250LXNpemU6IDAuOWVtOwoJb3ZlcmZsb3c6aGlkZGVuOwp9Ci50b3BOYXYgYSB7CglkaXNwbGF5OiBibG9jazsKCWZsb2F0OmxlZnQ7CgltYXJnaW46IDAgYXV0bzsKCWNvbG9yOiAjZmZmOwoJY3Vyc29yOiBwb2ludGVyOwoJdGV4dC1hbGlnbjpjZW50ZXI7CglwYWRkaW5nOiAxZW07CgliYWNrZ3JvdW5kOiAjNDE0NzRkOwp9Ci50b3BOYXYgYTpob3ZlciwKLnRvcE5hdiAuYWN0aXZlUGFnZSB7CgliYWNrZ3JvdW5kOiAjMzIzNzNjOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJY29sb3I6ICNmZmY7Cn0KCi50b3BOYXYgLmFjdGl2ZVBhZ2UgewoJY29sb3I6ICMwMEI3RkY7Cn0KI21pbmlGcmFtZSB7CgltYXJnaW4tdG9wOiAycHg7Cn0KCi5tYWluX2JveF93cmFwewoJd2lkdGg6IDEwMCU7CgltYXgtd2lkdGg6IDg1MHB4OwoJbWFyZ2luOjJlbSBhdXRvOwoJcGFkZGluZzogMHB4OwoJYm9yZGVyOiAxcHggc29saWQgI0Q2RDZENjsKCWJhY2tncm91bmQ6ICNGRkZGRkY7Cn0KCi5tYWluX2JveCB7CglwYWRkaW5nOiAyZW07Cn0KCiNwYl9iYWNrdXBidWRkeV9zdGF0dXNfd3JhcCB7CglwYWRkaW5nOiAyZW0gMmVtIDAgMmVtCn0KCi5tYWluX2JveF9oZWFkIHsKCWJhY2tncm91bmQ6ICM0MTQ3NGQ7CglwYWRkaW5nOiAuNWVtIDFlbTsKCWZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJyAsc2Fucy1zZXJpZjsKCWZvbnQtd2VpZ2h0OiBub3JtYWw7Cglmb250LXNpemU6IDEuMjVlbTsKCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRDZENkQ2OwoJYmFja2dyb3VuZDogI2ZmZjsKCWJvcmRlci1sZWZ0OiAzcHggc29saWQgIzAwQjdGRjsKfQoKLnN0ZXBfbnVtYmVyIHsKCWNvbG9yOiAjMDBCN0ZGOwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi5tYWluX2JveF9mb290IHsKCXBhZGRpbmc6IDEwcHg7Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cgljb2xvcjogIzQ2NDY0NjsKCWJvcmRlci10b3A6IDFweCBzb2xpZCAjRDZENkQ2OwoJdGV4dC1hbGlnbjogY2VudGVyOwp9Cgoud3JhcCB7CgltYXJnaW4tdG9wOiAxMHB4OwoJcG9zaXRpb246IHJlbGF0aXZlOwoJdGV4dC1hbGlnbjogbGVmdDsKCW1hcmdpbi1sZWZ0OiBhdXRvOwoJbWFyZ2luLXJpZ2h0OiBhdXRvOwp9CgoKCgoKLmZvb3Rlcl90ZXh0IHsKCWZvbnQtc2l6ZTogMC43ZW07Cgljb2xvcjogIzc3NzsKfQouZm9vdGVyIHsKCWNsZWFyOiBib3RoOwoJbWFyZ2luLXRvcDogMjVweDsKCW1hcmdpbi1ib3R0b206IDUwcHg7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKfQoKLmJhY2t1cF9zZWxlY3RfYnV0dG9ucyB7CgltYXJnaW46IDAgMCAzZW0gMDsKfQoKLmJhY2t1cF9zZWxlY3RfdGV4dCBzcGFuIHsKCWRpc3BsYXk6aW5saW5lLWJsb2NrOwoJbWF4LXdpZHRoOiA1MDBweDsKCW92ZXJmbG93OnNjcm9sbDsKCXZlcnRpY2FsLWFsaWduOiBib3R0b207Cn0KCi5yb3VuZC13cmFwIHsKCW1hcmdpbjogMWVtIDA7CglwYWRkaW5nOiAwOwp9Cgoucm91bmQtd3JhcCBsaSB7CglsaXN0LXN0eWxlOiBub25lOwoJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZmRmZGY7CgltYXJnaW4tYm90dG9tOiAxZW07CglwYWRkaW5nLWJvdHRvbTogMWVtOwp9Cgoucm91bmQtd3JhcCBsaTpsYXN0LWNoaWxkIHsKCWJvcmRlcjpub25lOwp9Cgouc2V0dGluZ0NvcHkgewoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgoKCgoKCgojaW1wb3J0YnVkZHlfc3RhdHVzIHsKCWJvcmRlcjogMHB4OwoJbWFyZ2luOiAtMTVweDsKCW1hcmdpbi1ib3R0b206IDBweDsKCXdpZHRoOiAxMDAlOwoJbWF4LXdpZHRoOiA3NDBweDsKCWhlaWdodDogMjAwcHg7Cn0KCgouYmFja3VwX3NlbGVjdF90ZXh0IHsKCW1hcmdpbi1ib3R0b206IDEycHg7Cn0KCgoKCgoubWVudSB7CglwYWRkaW5nOiA4cHg7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CgliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50b2dnbGUgewoJY3Vyc29yOiBwb2ludGVyOwp9Ci50b2dnbGVkIHsKCWRpc3BsYXk6IG5vbmU7Cglib3JkZXI6IDFweCBzb2xpZCAjQ0NDQ0NDOwoJbWFyZ2luOiA0cHg7CglwYWRkaW5nOiA4cHg7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKCS1tb3otYm9yZGVyLXJhZGl1czogNHB4OwoJYm9yZGVyLXJhZGl1czogNHB4Owp9CgojdG9vbHRpcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl6LWluZGV4OiA5OTk5OTk7Cglib3JkZXI6IDFweCBzb2xpZCAjMTExOwoJYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKCXBhZGRpbmc6IDVweDsKCW1heC13aWR0aDogMzAwcHg7CglvcGFjaXR5OiAwLjg1OwoJYm9yZGVyLXJhZGl1czogNXB4OwoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDVweDsKfQojdG9vbHRpcCBoMywgI3Rvb2x0aXAgZGl2IHsgbWFyZ2luOiAwOyB9Ci5saWdodCB7Cgljb2xvcjogI0FGQUZBRjsKfQojcGJfaW1wb3J0YnVkZHlfd29ya2luZyB7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CglwYWRkaW5nLXRvcDogMjBweDsKfQoKCgpociB7Cglib3JkZXItdG9wOiAxcHggZG90dGVkICNENkQ2RDY7Cglib3JkZXItYm90dG9tOiAwOwoJbWFyZ2luLXRvcDogMzBweDsKCW1hcmdpbi1ib3R0b206IDMwcHg7Cn0KCgoKLyogVGFicwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXRhYnMgewoJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNERkRGREY7CgltYXJnaW4tdG9wOiAyMHB4OwoJZm9udC1zaXplOiAxLjNlbTsKfSAvKiBwYWRkaW5nOiAuMmVtOyB6b29tOiAxOyAqLwoudWktdGFicyAudWktdGFicy1uYXYgewoJei1pbmRleDogMTU7CglsaXN0LXN0eWxlOiBub25lOwoJcG9zaXRpb246IHJlbGF0aXZlOwoJcGFkZGluZzogMHB4IDBweCAwcHg7CgltYXJnaW4tdG9wOiAtMTVweDsKCW1hcmdpbi1sZWZ0OiAxMHB4Owp9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaSB7IAoJbWFyZ2luOiAtMjVweCAzcHggLTFweCAwcHg7IAoJcG9zaXRpb246IHJlbGF0aXZlOyAKCWZsb2F0OiBsZWZ0OyAKCXBhZGRpbmc6IDA7IAoJdGV4dC1hbGlnbjogY2VudGVyOyAKCQp9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaSBhIHsKCWNvbG9yOiAjNTM1NzVEOwoJaGVpZ2h0OiAzNHB4OwoJZmxvYXQ6IGxlZnQ7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7CglwYWRkaW5nLWxlZnQ6IDEycHg7CglwYWRkaW5nLXJpZ2h0OiAxMnB4OwoJLW1vei1ib3JkZXItcmFkaXVzOiA1cHggNXB4IDBweCAwcHg7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweCA1cHggMHB4IDBweDsKCWJvcmRlcjogMXB4IHNvbGlkICNERkRGREY7Cglib3JkZXItYm90dG9tOiAwcHggc29saWQgcmVkOwoJb3V0bGluZTogbm9uZTsKCXBhZGRpbmctdG9wOiA1cHg7Cn0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGE6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY1OyB9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLXNlbGVjdGVkIHsgIH0gLyogcGFkZGluZy1ib3R0b206IDBweDsgKi8KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgYSwgCi51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS1zdGF0ZS1kaXNhYmxlZCBhLCAKLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXN0YXRlLXByb2Nlc3NpbmcgYSB7CgloZWlnaHQ6IDM0cHg7CgljdXJzb3I6IHRleHQ7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwoJYm9yZGVyLWJvdHRvbTogMHB4Owp9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaSBhLCAKLnVpLXRhYnMudWktdGFicy1jb2xsYXBzaWJsZSAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCBhIHsgY3Vyc29yOiBwb2ludGVyOyB9IC8qIGZpcnN0IHNlbGVjdG9yIGluIGdyb3VwIHNlZW1zIG9ic29sZXRlLCBidXQgcmVxdWlyZWQgdG8gb3ZlcmNvbWUgYnVnIGluIE9wZXJhIGFwcGx5aW5nIGN1cnNvcjogdGV4dCBvdmVyYWxsIGlmIGRlZmluZWQgZWxzZXdoZXJlLi4uICovCi51aS10YWJzIC51aS10YWJzLXBhbmVsIHsgcGFkZGluZy10b3A6IDNweDsgZGlzcGxheTogYmxvY2s7IGJvcmRlci13aWR0aDogMDsgYmFja2dyb3VuZDogbm9uZTsgfQoudWktdGFicyAudWktdGFicy1oaWRlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9Ci50YWJzLWl0ZW0gewoJLy9wYWRkaW5nLWxlZnQ6IDE2cHg7CglwYWRkaW5nLXRvcDogMTZweDsKCS8vcGFkZGluZy10b3A6IDI4cHg7CgkvL3BhZGRpbmctYm90dG9tOiAyOHB4OwoJYmFja2dyb3VuZDogI0ZGRkZGRjsKCWZvbnQtc2l6ZTogMTZweDsKfQoKI3BsdWdpbmJ1ZGR5LXRhYnMgewoJbWFyZ2luLXRvcDogNGVtOwp9CgojcGx1Z2luYnVkZHktdGFicy51aS10YWJzIHsKCQp9CiNwbHVnaW5idWRkeS10YWJzLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpIGF7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7CgktbW96LWJvcmRlci1yYWRpdXM6IDA7Cglib3JkZXItcmFkaXVzOiAwOwp9Cgoud2lkZWZhdCB7Cglib3JkZXI6IDA7Cn0KLmRlc2NyaXB0aW9uIHsKCWNvbG9yOiAjNjY2NjY2OwoJbWFyZ2luOiAxZW07Cglmb250LXN0eWxlOiBub3JtYWw7IAoJbGluZS1oZWlnaHQ6IDI2cHg7Cn0KCgoubW9kYWwgewoJd2lkdGg6IDcwMHB4OwoJYmFja2dyb3VuZDogI0ZGRkZGRjsKCWJvcmRlci1yYWRpdXM6IDVweDsKCWJvcmRlcjogMXB4IHNvbGlkICNENkQ2RDY7CgktbW96LWJvcmRlci1yYWRpdXM6IDVweDsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4OwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXBhZGRpbmc6IDBweDsKCS8vaGVpZ2h0OiAxMDAlOwoJb3ZlcmZsb3c6IHNjcm9sbDsKfQoubW9kYWxfaGVhZGVyIHsKCWJhY2tncm91bmQ6ICM0MTQ3NGQ7CglwYWRkaW5nOiAxZW07Cglmb250LWZhbWlseTogJ09wZW4gU2FucycgLHNhbnMtc2VyaWY7Cglmb250LXdlaWdodDogbm9ybWFsOwoJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNENkQ2RDY7CgliYWNrZ3JvdW5kOiAjZmZmOwoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAjMDBCN0ZGOwp9Ci5tb2RhbF9oZWFkZXIgaDIgewoJZm9udC1mYW1pbHk6ICdPcGVuIFNhbnMnICxzYW5zLXNlcmlmOwoJY29sb3I6ICM0NjQ2NDY7Cglmb250LXNpemU6IDEuNDNlbTsKCWZvbnQtc3R5bGU6IG5vcm1hbDsKCWxpbmUtaGVpZ2h0OiAxOwoJbWFyZ2luOiAwIDAgNXB4Owp9Ci5tb2RhbF9jbG9zZSB7CglmbG9hdDogcmlnaHQ7Cgljb2xvcjogIzhmOGY4ZjsKCWZvbnQtc2l6ZTogMS41ZW07CgljdXJzb3I6IHBvaW50ZXI7CgkKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXJpZ2h0OiAxNXB4OwoJdG9wOiAxNXB4OwoJLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OwoJLW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OwoJYm94LXNpemluZzpjb250ZW50LWJveDsKCWRpc3BsYXk6aW5saW5lLWJsb2NrOwoJd2lkdGg6MjVweDsKCWhlaWdodDoyNXB4OwoJYm9yZGVyOjJweCBzb2xpZCB0cmFuc3BhcmVudDsKCWJvcmRlci1yYWRpdXM6NTAlOwoJbGluZS1oZWlnaHQ6MWVtOwoJdGV4dC1kZWNvcmF0aW9uOm5vbmU7Cgl0ZXh0LWFsaWduOmNlbnRlcjsKCS13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjJzIGxpbmVhcjsKCS1tb3otdHJhbnNpdGlvbjphbGwgLjJzIGxpbmVhcjsKCXRyYW5zaXRpb246YWxsIC4ycyBsaW5lYXI7Cn0KCi5tb2RhbF9jbG9zZTpob3ZlcnsKCWJvcmRlci1jb2xvcjojRTE3OTdBICFpbXBvcnRhbnQ7Cgljb2xvcjojRTE3OTdBOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgoubW9kYWxfY29udGVudCB7CglwYWRkaW5nOiAyMHB4OwoJCn0KI2xlYW5fb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB6LWluZGV4OjEwMDsKICAgIHRvcDogMHB4OwogICAgbGVmdDogMHB4OwogICAgaGVpZ2h0OjEwMCU7CiAgICB3aWR0aDoxMDAlOwogICAgYmFja2dyb3VuZDogIzAwMDsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCgojcGJfY3JlYXRlZGJfbW9kYWwgewoJaGVpZ2h0OiA4NSU7CglvdmVyZmxvdzogYXV0bzsKfQoKCgoucGJfbGFiZWwgewoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1yYWRpdXM6IDNweDsKfQoucGJfbGFiZWwgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJcGFkZGluZzogMnB4IDRweDsKCWZvbnQtc2l6ZTogMTEuODQ0cHg7Cglmb250LXdlaWdodDogYm9sZDsKCWxpbmUtaGVpZ2h0OiAxNHB4OwoJY29sb3I6IHdoaXRlOwoJdGV4dC1zaGFkb3c6IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwoJYmFja2dyb3VuZC1jb2xvcjogIzk5OTsKfQoucGJfbGFiZWwtc3VjY2VzcyB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNDY4ODQ3Owp9Ci5wYl9sYWJlbC13YXJuaW5nIHsKCWJhY2tncm91bmQtY29sb3I6ICNGODk0MDY7Cn0KLnBiX2xhYmVsLWltcG9ydGFudCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZGQ0NTQyOyAvLyNCOTRBNDg7Cn0KLnBiX2xhYmVsLWluZm8gewoJYmFja2dyb3VuZC1jb2xvcjogIzNBODdBRDsKfQoucGJfbGFiZWwtaW52ZXJzZSB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwp9CgouZXhwYW5kZXI6aG92ZXIgewoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9Ci5leHBhbmRlci1ib3ggewoJcGFkZGluZy1ib3R0b206IDZweDsKfQouZXhwYW5kZXItYm94IC5jb250ZW50IHsKCWRpc3BsYXk6IG5vbmU7CglwYWRkaW5nOiAxMHB4OwoJbWFyZ2luLWxlZnQ6IDRweDsKCWJvcmRlci1sZWZ0OiA2cHggc29saWQgI2Y1ZjVmNTsKCW1hcmdpbi1ib3R0b206IDEycHg7CgltYXJnaW4tdG9wOiAxMnB4OwoJbWFyZ2luLWJvdHRvbTogMTJweDsKfQouZXhwYW5kZXIuY29sbGFwc2VkIHsKCXBhZGRpbmctbGVmdDogMTNweDsKCWJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgY2VudGVyOwoJYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKCWJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvY29sbGFwc2VkLmdpZik7Cn0KLmV4cGFuZGVyLmV4cGFuZGVkIHsKCXBhZGRpbmctbGVmdDogMTNweDsKCWJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgY2VudGVyOwoJYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKCWJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWFnZXMvZXhwYW5kZWQuZ2lmKTsKfQoKCi5wYl9iYWNrdXBidWRkeV9iZWdpbnRvdXIgewoJZmxvYXQ6IHJpZ2h0OwoJbWFyZ2luLXRvcDogNnB4ICFpbXBvcnRhbnQ7Cglmb250LXNpemU6IDE0cHggIWltcG9ydGFudDsKfQoKI3BiX2JhY2t1cGJ1ZGR5X3N0YXR1c193cmFwIHsKCWRpc3BsYXk6IG5vbmU7Cn0KCi5lcnJvcl9hbGVydF9ib3ggewoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCByZWQ7CgliYWNrZ3JvdW5kOiByZ2IoMjU1LCAyMDAsIDIwMCk7Cn0KLmVycm9yX2FsZXJ0X3RpdGxlIHsKCWRpc3BsYXk6IGJsb2NrOwp9Ci5iYWNrdXBidWR5X2Vycm9yX2xpc3QgewoJZm9udC1zaXplOiAxNHB4Owp9Cgoud2FybmluZ19hbGVydF9ib3ggewoJYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCBvcmFuZ2U7CgliYWNrZ3JvdW5kOiByZ2IoMjU1LCAyNTUsIDIwMCk7CgltYXgtaGVpZ2h0OiAyMjBweDsKCW92ZXJmbG93OiBzY3JvbGw7Cn0KLndhcm5pbmdfYWxlcnRfdGl0bGUgewoJZGlzcGxheTogYmxvY2s7Cn0KLmJhY2t1cGJ1ZHlfd2FybmluZ19saXN0IHsKCWZvbnQtc2l6ZTogMTRweDsKfQoKLmRhdGFiYXNlX3Jlc3RvcmVfdGFibGVfc2VsZWN0IHsKCW1heC1oZWlnaHQ6IDIwMHB4OwoJb3ZlcmZsb3c6IHNjcm9sbDsKCWJvcmRlcjogMXB4IHNvbGlkICNlY2VjZWM7Cn0KLmRhdGFiYXNlX3Jlc3RvcmVfdGFibGVfc2VsZWN0Ojotd2Via2l0LXNjcm9sbGJhciB7Cgktd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7Cgl3aWR0aDogMTFweDsKCWhlaWdodDogMTFweDsKfQouZGF0YWJhc2VfcmVzdG9yZV90YWJsZV9zZWxlY3Q6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKCWJvcmRlci1yYWRpdXM6IDhweDsKCWJvcmRlcjogMnB4IHNvbGlkIHdoaXRlOyAvKiBzaG91bGQgbWF0Y2ggYmFja2dyb3VuZCwgY2FuJ3QgYmUgdHJhbnNwYXJlbnQgKi8KCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjEpOwp9
###PACKDATA,FILE_END,/_importbuddy/importbuddy/css/style.css,importbuddy/css/style.css
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/bb-logo.png,importbuddy/images/bb-logo.png
iVBORw0KGgoAAAANSUhEUgAAAGYAAAB5CAYAAADLX1QsAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAATgZJREFUeNqUvXm8XlV5L/591lp773c4U87JORkJJEwBQgIyqIAiiqLgPLbVarW29aptr53u7W2vtr1tvbW3aNt7vU51qLaixWqrtQqCoAgIhDAlQEggISFkHs55x733Ws/vjzXstd8T/PXC53wCOee8737X8Azf5/t8H7rpppvws/4RQqbj42O/v3z58l+SSrWYYQAGGACd5Bfct/z/EMj9v/9bqv0BBogA5up3GAAxwGzcNxe/l39dcq9V/Qgh/B9z9QPR35Hw3yMwM4io9vz+vcJzkPsrjh44+jRc/zgjj0r+d6goiu6B/fs/1e12P6G1Ln7Wuqt4GUf/McZgamrJfz/n3HP+IGs0SUoBAaA0BmVZQgix6NeZ2S0uuQf0j+ofMNoERm2RwsZwfZcNG7cV7qP6zRJUPw3xKrF7CiYw+acZWbba4aD6BvkjwosPUfwa9nfsMRldSSJASQkA0MZ+d3p65qPbHnlEnJg/8RdCiJ+1MT/ztqxdvmLFB5qtFhV5gQP7D+PQwYNYtXo1JicnURZlfCDCYjC4WjxmMKG+geTOOxPY8OLNDWvL0WsbGHd8wyLqaBMIIP9G7jXZvxcztAGI7CsLIhi3+/ZgVHtauwbxExGBTrKjHG2cAIUbSkRgNti7Zw/mFzpYu24tEpWi3W7LuRXL37fQWfg8gEPPufbM9sCe7AugtWmaLiEC5ufn8bUbvoq//9IXcf/mzUiSxL25vykGho29Mcww2sAYAwMeMW/x8gPEbiu5+oL/s/6jdiP9z8e/4xaIIjPnN88eaIIQBJCw5gvVDWFjwABM/J6jB4XImjRUh89uk4AQIrwfCG5NGEop7Nq1G1/60hfx91/6Inbv3o00TaCNRpZlK0C0mt1bnexL/azrJIQYk1LCaIMsyzA3N4c0S7FmzRoYY9wDeh9BoFGfQ9VC+asNAGz8b3L4LvtT6Qw710wFaqYMbF/DHlDnJwAYYu+haj/rLSmFja2ej2Fv1KiJqq1DcC9uS6hurGMT6NeBAIyPjWN2bhlWrT4FS6eXwmgNIkKiVErAZO3wjZqyJEl+1sZMSylRliXSNMFb3vo2aK0hpUSe58E5Gn/7mRfbZ2+mhbuFvNgv+g/HYHs63e2w/ojDzxIIEH7zonUnipy8faa6zwNgABZuj6jyCILCi8fOKXpPb5pOEnpQFBA4L+NDnbzIMbdsFr/8y+8FgyGEROnWTilFUohx+lnOn8RzfJsZQoqpJFHBZBERlFIhWqLYfoCjh6dFZsuaKIrCsPhEEpjI/gnnK0R1Qv0ChVNN0X2LN5pN+Bl/ouNNCH/UDpB7XWcSyb+Z8b/lDgp5f0IQfiPY3xpaHHUC0NqAhAAxoE0JAsGwgRACKkmWaK2fe2Okks+5MVLJpUTC+lLnzIKhYFMLQTnErZXzp/jEs7/4wv6dt/9uEZkj00QMIlEtGgCGAbN/32hBSSw64YaiBfMXTvibKQBjgimtTJS9Pd4s+pvJVN2y0cWvx51Uj8zdAWLWgKkiPmaGkBJCiCVsDBbbf2/K5HOZMoaQcil5H8QGJjIh4Y1Q2e7g0P2HrVYvsuFcM0XhY5HdHMPsoiZd/T5HUd7IbWMXSlt76s2TCE46+LbINFKIsOI4q/If8e2ypto+s3fsJ8tXDOxze/9JYLDhsKE+ehNMIBKQUi6l2PGObkyn03muC4MlS6baQhCMieN5G2r6hbani+1pDg4lSlZCQhd9Wp+7ONNl2IQTTsTh9b3f8oeAvNUIZpSqJNYtPoNdpOUDE3vjyS0uh+/EcbkLGciHDqJy8JH5ZTaI/bUBIKj63Iw4G/W+j+q+DAwlJZRKlhb8M3wMG/Mc94WhkmRaCuFO5egpofCBFkUXPJLOh0PtlsRQzfSIWtQmqs8mqkgH3rGSgEgSsBS1iEn4hYqja2OAvABpbT8RiXAYaCQTFKhbg9hdCoh61ujMrqj5stGAwf+3vS0ckBBACAIRjc0vzLuN/X9IMNmwUCqZZraxPlEEgxBbsxal8XH05J18CGOZI1+Byvewj8LYOUaESJ79arMzZUoCWQoCoPMC5f790IcOgU8cBwZ90DCHEQLIMohWC2J6GmJ2FnJ6GkJk9r37A/tZomiOqIqnKV5M5zXMSChJwvrb4DOpwhTgciIfhotgTimE9wBBCIEkTabFSdCGsDHmOWJpw9xWUk6Ea2yTB3fiRsJHIhCLsKBEbC8JRVAFjcbH9VAZcGFwzWwIiDQFKQk9v4DhT3+KcvN9KB/ZCjy7D7TQgViYB/pdoHSbrxR4rA0zPgFMTYJPWQO1aRPSSy5FevbZkM0GTFGCimIkMeUo8nX+CDYIoRE0R1Ad/+MQPVY5GRkDFtXCx6ANEaCUmgazAMH8v0Iyk0mSTMR3lIhisCScGH8z/Om3Vrq6z8KHN9EDEggkvE+wUZcLZGCYIJstGEEodu1G7zv/iuLmmyF27UaqNZpSIJESwjBo9SmQl14KShN7kufnoX/0I/DRIyiPHUP5xE7kt9yChXYbdM65aLzmOjReejWS6SXgooTJc5ex1+5FDdDjyET7kNf7NTYjuVvtJRyEJKqwyPu4JEkmmKhNJBZOujE/I/NvSyVTNqZCYp2d96GmZu8cXcQWo0hU5QzOv4Zw2DBXiZ43FS6iISEhW00Uz+7D/FdvQPGtbyHZvx/tZhNpowElyWaKuoRuNtD4H38CdeGFtQcffOUrKP/XXyFrZEiIkBmGNhr5/ZvRv/tOLKz/Csbe+U60r70Wqt2C7vYCrmaf0+VpPtKLIjz/6Q1GfUmFQvi/IBI2SImOs79BSqlxME+A+eQbI+XJ8xgimlRKqSg8Ci/MzBAgyHDlRQAs45C0Ck2pygQjhNYnaD7wESoBNTKc+P73sfDxj0M9/jja4+PIpqch3IczBjCsYYZD9FeuRPPMMwMS7tAK6PXr0U1TtIoCUAkAAyKB5tgYUm6hv307Fv7rf0Hne9/H9G9/CM3150D3B2A2boGFRQqogokonPgK3qHI/Dnj7fwPB7Ns2EQ5nItABUNKlRHQfq7sXwkhcXJsl6akTBLmKlS2JyL274zadfALD6r+jGB5HyB462hNmYvtGxmYgMMf/zh6n/kMWmWB1swMlCCw1ihdAGHYhp5alxhmGTjLoH0EBoCEgGm10BMENSxtxOWchC40hBBIx8YgigILN30f+7Y+gpmPfAQT11wTggO3K1WEKahCLYIP4loIFvIiGsmQiJxh53AQiRlSSiWVmnguiyWkFKh/Sf/fk1JQwjH6azyCXEUgIRijuKZB1U2JHL8QFo31J8++DkBJAgbjmQ9/BCeuvx4tAI2JSYAN8kKj0BqaDQpjoA2jZMawLFA2m0CS2LwlIM0AtVrIhUShNQwYhdbIS43CGBS6hC5LCCkxNrMUjYOHsP8//2ccvfFGqGbDQShUj6dj5DvGAD1K4JNpZme6OAJLY4RbhMBCJTIRgqaEsMj36Ndzgpha6xmpZEohuqIKL6rikXCoEKOtsEmiP13kkWdvsoRwpQUDmaagROLpP/1TLHz+85iemYZQCoXWIIcEAGxDT6NhDEMA6B89BjM2Zp+1LCNTwaDJSRRSYHD8OOTYGEACLKr3FVKCjS3mpGNttLo9PPtffx80Noa5V74SuTdrAUaph2WVl6UQqVYFzsj7uMUycSHQWRcllZJKTT7XjVF5UTwHTpa0hZDCRCexKq364hXbaypg0QFi1LICVwLxGXm9UsiQSQpWCk9e/wkc/7+fwpKxNhiEvLMAHgz9NQQpBUgJkgKUJNBSAeeehyVvfrO9xQ5OBwAzHEItWYLJt78Dw8//nb1NeQ7Oc1BZwpQloDXI2M8l222oRobGiRN4+nd/D9wcw9yVV6AcDEKuFZDtyI1XfhK1cLoCNRfn3CH6MwZCyExJNfNcPl7lw+FJS8rj48mElMptAKEKAuKchKLyK8PUKoEcHpw9xBJOoLGOPlF47KPX4+DHPorZyRZIKgwX5pGefz7aL385aHwc1GpBtFruzyZE1gSyFHJmBsmyZSgGg0UlB/T7WPorv4ziVdeAuz3wcAgeDGAGA5h+H9zrAUWBcvdudL5xI8zhI0jG2qBDB7DtPb8C/elPYcXVV6Lo9UOk5jAOC4IyRxtSq2XDxEXAKAZnV4fyaLeUQgAY73W7J00ynzOPUSqZEZKi/KSq5gUjG9BYWgRl1MpV4SY5TI0AkShs/5vPYs8f/ymWLGtBZQ0UnXnQutMx8zd/g2zduirzqlUz2dtalP1+gIUWH0+GXL26OqYx6OrxKwB81lk4+Jsfgur2kU1MQB45iK3vfR/UN27A7EWbUPT6LqF01oFj0I4rPCyYbVMZdX/hqMrzfFQqhIQQcjxwJ/4jZAxmA6XkFDmsPAaCSVgzWpFXaFEdohaXcIWwGntskLZa2Hf7nXj2w3+MxlgKqRIUgyHKwRDty69Asm4divn5EGktQmCZawDhSf8pSvAwX8yO8BvHDDE2hsZll6FYdxr0o48Cog01OYFi3zPY/v7fxtj3v4FGuw1dFNWpphE2T1Q2CMm1dz2CYry2ZuRIEFSilpIQoJNsjGBj4emRL6WkmvEJUx0H8yeuil7IAXrxbQlREvmIxv56kmXoHz2Gp3//j9Ccn4duJ0ChYYxGXwq0Lr0EEgBJCZmm9itJ6l9ZBigFo7XlFZzsixkyyyAbjeory6q/azYhADSXL4fasAGDfAhjNITWwPQ45L13YfuffxyUKJCUFUfAh8AuDI/ByRCwsc2BQnLpgiePi9j8SEBKOWniiDL6Us/hqBpSyjEhCFq7fMO9o0dwCVwL7atSosO8RFQwEnD1DAGhJHZ99UbIu+9COdayzhsChTEYlBr7H3oIctNGl/Dxc5QkGNn4ONrT0w5SodHkGEJKHNixA6XzQScjv4gkQdnt4vCOHUhJQBq7mKUEGtTAwpf+Hvt//k1YfuH5KHp9u8AetHWItCCbkHIUrVFVNqt8cAA3LVoihYBSaoaZFTOX/6EKJoNbUskGh8zVvXlUFa5qFRU5ITBkYnPG1cOpVKFz5CgO/eMNWA7GvlSBtIERFslTaYon/vZv8dPPfg4sRTBlHKHTBMdsaTRw9V//NdZcdRXKbrdmppJ2G3dffz22/PVfI0tUFT2Ncg8EkOYFVjKwtNWCceG5MRplI8P4of145h//CcsuOB8kJWC0SxhdHSmuBfmS+Ek2IwoHnLsTEESQUo6DOQNQ/oewMiHEmEqSdiiYhhpEvZLhF4w5xsQ4ovxU2S4DIClw8J4t4PsfgEILfS6RMFAWtpgmwZiVEmP9nuOJRYcAlQMmQTiybx/233471rziFdBaVwUppTAcDHD4e9/DKQsLaI+Ph1I2j9RrwIAiQiuxTCBDLuyXjIECpkhhzy03Y37f+zG+Yg5lXzu+QZ0IWKM+wEentJiIGErw9gAoKRtSypaUsvsfwsqYuS2laoacgwJlIiySLzMb7/jchzcECBauxFpBf0QEbRhH7/wJGsMOGLMo9BDKWDTZkvcIGQgNldhSLSoeWcDenBeVjQzNJEFZlhYn8zfGGBgAk2mKJE2RSllVQTmiSTmTZ1y2Xhpjo0cilJpRMJCgAb3tCRzb9igmVy23ldi4VMAUEWzc6xNHhqxKD0Ig5WEoIiRp2hJSjkkpD/2H6EuCaFwKGtPOuY6W5jhmqVDF7w1sRGEB2lplUQiYfIjOww9hHIAmRskGhSEkqErCUoiw0MT13IeZbWhpAF1Wjr/GeglQEUNrjVJrQBBYm4oBwxVSLEi4zBwQDGgwSsMYagNmBZUfx/y2x2BeflUoLVOUzVNEvKgAWg5ER2++KpfgzaCAINGUUrZPdjnUyUJRCNESKmkIQY6ZUr/+i8JiQSFsDMUiWYGZCgShFPKFDgb79mMcCgYMrR0PmhlC2DqH0W7TjXFMyRiBZmiLZUODalFY5YSsvzLGgLWBMBUgSVSh0P60G9aBlaONARMhZ4bSBEsu0ug/s8eddgkypsrwTVTij4BZOKASgiK2VkWWJ7I/J5UcU0pNKLU4nVTdhYVFEU+Spi2lVBaosnUj6qIu4YpEFbDnr7rx7BBCqOCAAV0U0L0ujLsBOtfoJ0AKV/tARU9yq7i4hUAzDAiatXudOp2WXfBRMkMQQ3snbSxpxBfgKS5yMcDQtmzNjKFhTJYKGgyGQdFdALSp+xObMdSMFhM7qMxEr+sYNhWhIJjRRCVNAC0dQUrPeWPYQtJLEimTKlaPYe4Iwnf21ASqYwV9Vz6BA2lbSAmjFArW0GSQGcLRsrQVSa5oSgYGggWMf82Io0ZMIMEwmv9/bwyMPSSeflQvPVQQE0cQ+ZAZ/ZKRGUZJ1tekUlZwPlVgrvfBJvCtUdlwrhg9CB0QUTJqDISUDWNMMx8OFyWZJ8n8DaSUU1KpGjGbfWnZJY0UhSTSF4iiN47ZIj5qU2kKmp7EkAq0wJgyAntyg7GUg3P0J01DVy8QIQDkbk0JBgsBSFn7BAyAlAJJAa0NdCC22/cwMBDkQ3EO4S/YQDMwzwzOCU0AQy4xYGBidi6iXFUHzRfIApNUAGwqmD9GDTn4TH/LDYQQSgix5GStRovY/sYAQogZIhGI44FwwNWtINRzmvi/AmLgiBtM9oWTZgONM85ABwYFGE0YNEuJo4ZRsA0GjKOmGma7qMaWsA1bymmpq5+Z37ULrDWS8XGoVguq2UQyMYHB0aPoHjwMTdaHacNVjuJf19UctbYoQcmEARhHC8YSIyCZMUSBIUlMnHmWTarJ8hRAZOs2ogJZhMfPolvIoWyBwDQNB4wkhFQQQk6enLtMi+EkKeW0dfwGrDmUWAP873m9vqUhbjZy9ppZQAifdAJGl1BZiulLL8Vjn/00pqmAgsQKQ3gkZzSVxpjwdf+qqs4h3KzCUWZAZRn2/fu/46YPfADpypXgsrQZv1I4cd+94J070UhSaMfotD5FB5pu8A/MKHSJEsARw+BSYBkLaAL6GKBcsQJLzlsfUHdyIWjcwcaOdRnaMAK3lkDGgGIiPNtNJABKCigllxLzohuzqLRsqbWqRcJdcREz6smzZWtRGGoka1T0Jg4dRSAISACrL78cj556GhZ2P40WTWCaCNOlwD6hcQoBKTGk9ox8E6hMIat2sAIJgdZwiP1f/Sr6I6ziSQBzWcNGcMb6LDIE9rE7GQhjF9QwowCjy8ARTTjHCCQwyAGcQIH2C16A6TPPhCnKqA2DqqJcRMcijqkqVTRYHVrPs7MotKvoTpuTmDKlRmJoAjKVqIlQeWNjK4DBwTrnHzaKI9NGi9iavk5PBBR5gaXrz8T0q67FkU99EopzEAinE+FYTnhaaawUQMOFFAIiQD+Gopq5C5UzKXCKyKBHOqOk7yJjy74MlFumwHXWLvrTROixwd5S4BSjMMdAnwwMFziuElz0lrei1cjQ7/YqdqcQdQ5zRPoLvj4urcfE88icCamglGoJQUIIYeq5pIOdqy/KhJATRCLqfRihvJ6kUTUOFARVJD7vowwb6CKHJIENv/LL6C6bQ48GKNz3zgeBS4FdJWMBjJKBgrVNFL1fiHwEB2YMQzBDEUGCIKkieRtm2Kq/hVqMC6WNsa1/JQPHtMFTBWGpFlgLRh8GGsBRDNF48ZU4+7XXIS/KUBi0HWSW5iqksHWVuHuNY74DRx1sEcEeFYVbymRSSplZrkX1JaRUiL+EUJlSakpK4eJvUe8/5OqEUM3RV/6Ea23EBOlAO0ECw/4Apz7veTjz/R/Es84F58SQADZBIDUCTxYGh41GbhhDXUKzgTH28npI3zttbWw2bhNVDW1sxm/8M7kNYQClNijYIGfGgBnPaI2nS2CVkVhPwh4SAvo8wJHxCVz6kQ8jazZRDPOqTO59rbFIBbGFgCq6qQ10fKmjip2xqHebiCCVGCdQ6okq/kupRI16/0xKORknbhRX6/z/EUY6d09W6o7aEEJrgkaR57j8d34bz95zD/b+23ewEk0MYaCIcAEIO1ji6VLjmACWAmgKA+lSJekaZf3ptG7MBMBTEAKhMPRyui4NQ0BpGB0mHGQbBKxngZUActYwIBiU2IMSGz/8YZzx4hdh2OtDCqp3QntrwhXX2ZtrX6kM3duMGmHF/5IxBkopSCGnVJI0pFInaj6m1+3WKJ4CpJJEtYhERYYgG5+HcjIqMoYxHAgXz9WaHkcwJCTKokTWbuGVn/4UbnzLW7DvrrswhxQ524rf6QCmSWCnYTwFYAwGkwAaABJjIAVBmMi3MQV8zHjwgzzkYjdkYBhdIsxDoG+AFRBYC5uv9MnmIiVyPMMaa3/9N3DFb30IRVHG6M2ifss4ZyDiKCAYaS+nKipjrgpsZGsyU1KpbBQvUyZqw2BmQIq2Usl4RfRjm9/FWx+zdqje+8JRPybXoO9629ew18PMqlV4w5e/gm++613Y9ZM7sIoUjCs6TYBwARiHQdhjJPbCQixNAC3DaDJBwt4kUXk6GBuDQTMjByOHQEcDA1ji+1IA54AwYYm9GDpWfgdD7BfAmb/+G3jVX/4liIGyKKp4x3UmCHAEU51MdiGAZvU0IgZ5o5K0VKo5HPTVqBCEWowsy0khxVi4ioYX+Rl2lFOuUXO4zggJtB9/4iiUB9jlD/1OD3Pr1uGtX7sB//5bv4Unv/51LAfQogRDB5VPM2OGCPPMOMSEEyAcgYEGuRDctemFooRAlRZLJADaIKwEYQaMJgiaGENfSSTGUS5wdGoSF//+f8OLf/u3wYaR9wa2ISt0IcDx3BzbnyLqUkRCr9pnqEKzwTXIT1AoRkMpNU5E7dFqrRoFAIkwpaSSFLEpKabw+FA5WvhAQxjpBqjYGyM4EVW/1e92MbVyJd78pS/hzssuw08/+udoHDiIGRAk29IeMaMJxloSFmQkiS4bDCGQwwOVNrROYAtuKRgtImRMaFBVFh+GbgRGHwUOMdC85BJc+2d/hg0vfzmGgyFMkVf1Ez5Z63vVDGyc5/cNSHGpIjRE+SJfLVK1uyqlHCcSk7457KQ3xtU7lvoaTTBLrpm0Iu3FLETftOMbUC00X2O/+wYlj7VVCg8AEQa9PpI0xUt+8zdx2lVX4Y7/+VE8/c/fRHs4xDiABAJMAgXbzD1hwhJ3g0M/EEzEVKkWR8OgiDq6DAxyBo4DMHPLcP4H348X/tp/wtTcLAa9PrTWFksLhPd6jhKosVH7Ydy5bHzlNgp+Aq5GVaTm904pJYloctQ/q9iu2VhcjFvaVhl1KYuq51KgfoV9L0zgbZnAjmce0X4Z0VvhqHG1LHKURYE1Gzfi577yFez48R3Y/NnPYu8Pfwjs24cGGzQApAAkqFZft8UuB056CMf3YzpMrA9gCGAgJbIzz8TZb34zLn7Xu7DsjDOgixL9btd+FikhEHXMkefCiajuwlUHA4vQ3h4auDzCHJUWqiiSAx5qjG03F0IsrbVoA1BJVKQxxiBJ1JS07c41xr6J1IpGOundw0dyIxFEE85wxC+LKaf29HEoRQ87XZAQOPvKK3HWlVdiz4MP4vGbbsKeH/0Yx7ZtRb5rF8gYKLDbJECytpVSV6MxcJVItxmi1ULzzDMxd/4GnPayq3H2Nddg6YoVKLXGoNOpShXgqEmXQpmh6rJz/XS11nJTw87Yh/JUpwp75yNE1IRuSywQQkxgpO1PURSmWRBQTgsPOYSSMVdmKBAuvC/x1NDIPIHqCkqgCK6pM2c8VOIpTt50DLtdCKWwdtMmrN20Cf3f+A0cfuopHHj8cRzctg1Hd+1Cb98+DA4fxmBhAVwW9vM3LMLcXrYMEytXYfr0dZjbsAHLzjgDU2vWIAVQGEa/061awBmRVoxZ1HsXOA220yYw+isb57qcnTk3GFX8cCAfj6h5INCYqssQyBgibsqDkEJO+XDXsFMyOolGl6U0C0sJZWfOBI3Qdqi2iTUWDWIGjQsyRBzcCZhSo1f27AdIFJavX4+V69eDX/c66LJEMRyiyHOUeQFTaouMp6lN3LIUSaNhEQcPw+Q5ekXpzIltvDJx378PaALJwgGwXGvNDLeKaTSNiEJh75tGolXH9Qu8ACEFhJRLqhaVQFFOYlMmpFJLIQTg5DSo2gWEY1GTX6HKn4wQEzwK7FHmGMjzyKzLgyMC+uLUlAgoihxUFBUjhcjCSM0E1KYqYnVwCYxxpHAEFJWCfkzcZBVBJUGZYzHBQXgz7nsrgyJTvc089P77elQEYdXMm99AISGlmJJSkBAivJwqyzLeGFJSThBRYK07JteIqQr09VpJN2pSgBcCDA/PHKHNlbN0jdfRDUKlwMFRr00ILdxzRUmviBBd9n7AgY3WBVA4U2IETgIJ1/YdU4ArH+lL63ErijW/7GRNqvcMAULETBWuCRhRqsdRdGeJf8msUqkUQoTNUMPBII6X00Qlk4IIJm4hcE4r7h6rAtMYfOZa5y/FmxXJXVEgLVTmriIK+p+nYBlr67hYS6eCYPxpjVmbMI7aGhf26qz/oH9m/DGs8jJmqh2q6sbWSSocdRnUCBvh/FIQxLOFIYTWRKXUZJ7nQojnyvyJmlLJKS8KV0N8TPRhjK1qGsPhAWp6Nf7Tm+hq10BPicCO8AJsTHFaWmdMxvkD4sgwUq/haud8NZHZ0pFImyBCFMuQsKg2jEY6vijquK4UpOK0omrrCJl8TaTCqxeaiLzoY1ldXVEmKCnGy7JQRJQ/FyTTVkkyBhJWKGdEYciHeMwVgTqAeIidHEe9Ib5uUldbqiK6SAEw7v6NTCAJrrrSIm0xrmNJIVzlsKhc06yJ0RFfr/esfOM+k6hpaI62mFQ4WdwGH5aG6lIutdSAo4TT+ztBQSJLELUA9J7rxkxLKceCIRAnwSDd33n9R1ODdFBXvhAe7JRASFajAMZEr02MkQgbwiV3BOEWEAFnExSJ9cRCdlwh33UxOQpEuyrIcD6E4KBT4dR4bGuYZ1WGjjhHbqz1Y7Mzl37xRXX4rKWoEtOqbYVqDVdSqjEG2gAOn3RjCJgUQqS22mccb81lt3XvUTMnoHp3cqWYYWrMkCqC43pncEyHqvGeqk4CqzBBITznGjDIlbidM09x6Mmx9BWNSL8FCQKqi95R3Y5yVLMHM0wsbhfLkkTt94vFj0ZEkNx7KaXGiGgJwLurcDnK/IloPFEJUdwMynV+lBcmqKkO2qp7cLea6863Vqtxp0XHPDGK8pw6Slcr1JmwobGGsgg3iUZU/Eb1kAO6HbV4GY61oePgIuIxjMg9khiReozWXMThNtXZmLU28yioEEIkRDQZ76OKZZmEEEuFFJEQabUI9QNUl+FYLPha6RxThKyOCpDyorbJSt0h9j9xlFUBqDHsE7cEx4kej0RzVBN+q/0UR71hhABE+tvKEUkc5MNoU9tUrj1jVc30QXQlQVwXE1JKCSHFeKxLo0jWQrcpoogB4nvshag9fO2MeNlCRKol3rFGuQ6DQpUv0F4DeTwuWSxm3HAkDlS7B94H1cq+qKkNoqbhZ2xpGlQ3waiYoD509+/PzHURPM/Kck6IRkrszAZ1llgkYWo4OlhRqiEJUqilBjoCMSPpRRJiVkpZy+hDuZIXiy74E9FsZBbhNQwhKWDxvoQ6GOa2uai+hWAGpJRI0xQAkA+Hrk9lJCt3r9doNiClgC7L8LtCCvT7A5SlFQNNkgTKNS95srZPENM0RaIU8iJHURRIkxRJktr3dYTBuIdFSYUsy1AWBQZ5DjAjzVI00ucQrTCMwXDoxB0srubxM0GIuzVD7wobhiAJKcWSeJOViG6MlHISPnQkrvennKStm4nQSFPcfNNN+Na/fgdsNLJmIzjBifExPP/5z8dVV70UWZpiOBwGeUMYIE0T9Ho9/OVf/RU6Cwv4vd/9XbTabbfI1XsqJaFUgnvuuQffv+n7eOaZfTCG0Wo1cdkLX4hrXnEN2u0WpFL4t3/7N9z6w1vxWx/6EFYuX4m8yMFgjI+PYcuWLfjMZz6Ht73trXjJlS/G7bf/CN/45jfx/ve9D6efcQaGw0Ho48/SFE/v2YNPfvJTuPZVr8SVL7kSALBj5w78+3f/HcPhsEbPWrJkCS7YtAkXXHgB0qyJXn/gkOQoE4rjmtD2R5BK+X7Myq10u110u110Oh2AaJykqy84c6DZsuo5bhBy5LEkSVAUOW697XZse+wxlMzoD4bo9Qfo9PrYvOVh/PGf/hk+9rGPYTAYQCVJFc0JuzG33nYbfnDrD3HXvffhRz/+MVrNRsTvJcuzShJ84YtfwO/83u/hnvvux9jEJJYtX4ZOt4e/vP7j+O8f+TDyokCSKGzfsRN3/fRe7Nv3LFSiwMwYHxvDriefwkf/4mN44JFHMBgOIYjw+BM7cMedd2PnzieRKGU5Yy7KklLi2f0HcPtP7sA9m+9zbRMS992/BTf80zdw+0/uxD2b78dPN2/GnT+9Bzf804349Q/9Z/zBH/whDh44iFazWe/e9lThmhp7BU8JIZcYx9U2hqvSMjMjSZJZKaSNqsgz+SMdr7gW4W5TXhQotMbc3Bw+8od/iJnpaTtggDV2P/00Pvv5L+C2O+7A1VdfjRe96Apr0hhQSuHYsWO46aabMDExAaUU7vjJT/DKa66BUhJG24PRbrdw8w9uxT989evYuOkCfPD978O609ZBKYmFhQXc/MMf4tDBQ9BlAWM0Ws0mpqamoKSC1gatVgsHDjyLP/3oR3Hg4CH85q9/EFe/7GXQ2mB8fByTUxNVpwIoSGMxAeNjY5hdOmtbO4wGpMDU5BQmpybxute8Gq+97jpoMIzWOH78OG659XZ8/Rs3Iv3b/40/+sh/h4CAYV3HdYUtGxjA0qLgmmUFjfd6vUrPLDKRUkg5FZo4HUNSuGiHR+stTmBuMBzixIkTYUGarSbKQkMIwsYNG/CCSy/F/fdvwYn5E1VXMzOyNMH3vncHtj2+Ha9/7Wuxb98+bHv0MWzdtg0XX/Q8zC90kaYJ+v0Bbrv9diRZil965y9i43nnoTcYQhuDyckpvOWNb4Rx0zm0ttGk75nJUoVjx47jo3/xv7D10cfwnve8G2964xvtsAilIKW0HQRlaU+yg5o8X00qBSEFer1euOnNRuZIhoxVq1ZCu8ax09aswenrTsf+A/txz+bNeGrXbpx55pkYDKxJqwG6cS7FDAhAKrU01pQQEe4zHjQwnVORrt1AuKEFQkpXCiWQo4fmwyE6nS4mJieRpalTV6KQ4B0+fARMhKmJJWHkiJISnW4X3/nud7Fkagne8JrX4IUvuBTdXhc/veeeEDVJIXD4yBHseeYZrF61CuvPOhvd/gBFUUJrjf6gj36/jzzPoUttF9YdqjTLUJYlPvG3f4O777kXb3vrW/DOt/8CyjxHUeYQUiBNE8v2d0JHlcqUjaWS1AYSg/4A2nWUNRoNKKlwYn4ehmHdQK+P/nCI8bE2TltzKpgNup1OVK2kClWOsjTtWkxcs9iUhUjslsU3ZlxKOe5tnK9XE5lIP8bdJqekKgSh1xtgMByimWU4euQw0jRFWZbo9XrYfP8W3HTzD3DpxRfhnHPOtpgZA61mA7fedjue2PkkXnbVS7F27akojMbE+DgeevgRHD5yBFNTUwARer0uet0uVq9ejSzLXEgcdw5XItpW6tDrohE+/bnP4aZbbsXP/9xb8avvfS/AQGl0MMeJstGV3xinIukKhJYpmSYJBsMh8rJEC0CWZVBKYjgYQhAwMdauRWbdXif071DtdlRKhhxVSgg2skySZBLMYyA6USNjEFFbqSQJvRywFUowR+0V7DLnIIiMTrcDpRS2P7EDv/6hD0EIiaIo0Ov2cGJhARds2oTf+vUPYmbpDBYWFqBUgsEwx80/uAVZmuKql7wYDOCUVauw/uyz8dDDj2D7E9tx+QtfaEXjNKPUJbIsgxCEQlttDiEwIi3s6h4CyNIUN3z9a9i8eQva7TE0m000shT9wdAJOFizJaUECUJR5A4msimj1UUWyNIUaZZiMBhYOS23MVmW4ciRw9i6bZtltxEwzAts3rIFt/3ox1g6N4vZ2aUo8sJWgolQBwsi0XlyMpZSjTHzODGfqEEyxpgpoWxSE9hQxBV3UHg4I1IJJ0Kn28Gg38eaNWuwatVKGGMgXFDw7LP7sWfvHnztxhvx3ve+F6lK0Ww08NDDD+Ohhx/B+Rs24NJLLkGeF2g1G7jisstw5913Y8uWB3HpxZdAKoWyyKG1GUlyRwTtnJ3282uYGZvvfwAXX3wJ+v0evvwP/4hls7N4/etei85CNwCJUgqACUVRhJp+JX0FJCpBmqQYuDzHb0y71cbOXbvxm7/9O+HQam3Q7/exavVq/Op73oPVq1Zh4DXXjIGm+iSAGPjUpCGlTEjKtu/FjG/MpJIqpWj6RG0wgV5cbiUCOvMLmJ+fx+UvfAF+8Rd+ATq0axscP3ECn/rs5/D1b3wTp69dhze+4fVgAHfffTcWOh1cuGkTjh87hk6vh0aaYvnyZZiamsTWbdtwYn4eszPTtUycaiEn6uVaIhhtkOc2eXzehRfiv/2X38WTTz2FXbufxqc/+zmcfvrpOO+889DpdgAiJCoFCYLW5UgYW9Xj00YDvWPHoo1JISSh3W7hmpe/3EaQxrJGV61YjgsvuBCnnLLa5WxUk1IhojD9IQaCLXtGpFKIKe+blXJaMsbQFBEl7KZchIEHkT5ZBUtVkcuJTgdEhHZ7DCDYuTLOAS+dmcFLr3opbvrBLdi9dy8A4NChw9jy4ENI0wT/8NV/xBe/9KXwHkJKJEmKAwcOYO/evZidmQ6ZfH/QD8UvrxYLf+qIakiB1hpveN1rMTExjk0bN+LtP/82/J//+2n8n09+Ev/zo3+OVrMFbTSEtIuTF6WD6Kmiu7KBShQamU2M8zwPN0YqhUaW4T3veifGx9o1qd+i1BgMBhHBsfqmiQZOEFfQk6tiJlJGGyOdA4TWSwRRWpmDxQpkwrdSe/vIjOPHjoGExNTUpBPRsVrDvoXwwIFnURYFJidtD+hDjzyMHTufxKZNG7H+7LNQFCWM0SiKAkol2LNnD+7bvBnbHn0UF27aiKmpKczOzmLXU0/h0OHDWL58BTqdLoQwSJMEWdZAaUprz6OorCgLDIsCutR47Wteje07duC73/0uvvzlL+P9/+k/gYgwM7MU42PjeOKJJ1CUBbIkQd8pHiZJgnL+BI4cPYpGo+ECD2veGmmGgyfmcezYMWSNDMPBMPDOJNWVZY3nq8UAqzfHvohoyxWpEKramOGg70QXspaUUlSEN2cencMnoto8MBBQao1jx48jTRSkEOh2uujnuUUMyhIPPfgQbvja1zE+MY5zzzkHDOAnd96FUpd40xtej8tf8HwUXnqEGc0sxR133oX7t2zBI488gv7w9Zibm8OFF2zCV796Az7z2c/hNz74AUxPz4CZcezoUXz+C1/AcJjjV977y0gajXCItLbMzH7eR7vdwi+98514fPt2/Mt3/g0XXvA8vOiKy7D2tFNx0UUX4uYf3IIv/v2X8e532htAAPqDAb72tX/Ck08+ieuuvQ5TU1MoSo0kTZBlGXRZYjAY2ADC1YFE1LBV00WKOaisaxFaNPEjkVJWG1NqDTYGjaw57U95aDMaqQJylPmTY26eOH4Chdb4y+s/HgbBgYGyLLDQ6WJsfBxvedObcfFFF2HP3mfw4zvuxLq1a3H2mWeiKHUYqeVBwFNPPQ2zs3N4eOtWHDp4GKtWr8LrXvMa7Ni5E7fcdju2PPAA1q1dCzaMp3bvwv79B/CKa14RIJyiKGxC6CB0IQj9fh+rV67Au9/1LnzkT/4HPvWZz+Css87EsrlZvP3nfg7P7j+AL/79l3Hb7T/C+rPOBAmBx7Y/jl1P7caGDRvwtje/CUolKHWJRCUQQmB+YQHdXrdGhQq6mUxBuT0WAKeRmZyxiIOSSjK43e/b7F95wp1UaoakjFvVg5/31NBAlY0I01e86HKkWQYlZRDLYQM0Ginm5max8fxN2Hj+BmuuyhLnnrsel192GSYnJzEY5mAnwgMAg+EQMzPTuOyFL8Du3bshE4V+v4+ZmVn8l9/5Hdx08w+w5cEHcfjQIRARztuwAe9593tw5YtfBKUUtNY44/S1OP+887Bs2Zx1yu749voDXPb85+PNr389Hn3sUQyGQwzyAmeecTr+6A//AN/7/k24/4EteGTbozDMWDozg3e8/e149auvxZrVq9HtDyCFQJqmWL/+bBw9dgytdht+nFW91kShN4aiUrTX1owHCZAzP1IpKKmmhty3kfDdd90FwwZLppd+9dTTTvu5uA26RkCI9cMiHnMjTWGMrpVqmAlSWDvNAPq9AbQpIYSNYKzuMWBMOdKlZQMAXWqXDSsYY01dmmbIshSdTgfDwQAgoNlso9VqYtAfoCgKCCUAwxjmOZqNRpAS8RYmUVZGqyxLNBoNl82zzeaVdLegBxhGq9XC1OSEVWLq96vJT0JA6xLdbheTE1O2BE9RJxeh1q4REo6Iq1arrAbuGrD7ySc/eeLE8Q9IIayWjEVJxJLK6VcSi/UeS/ahXcgfhnmO0KbG1YCCorTRjjHsupiFB0qDpFXQmYwm45nSIEkVCAJFUbhha4QiH0KXOdI0RZY1nJiQQafTtT2ZTrxBSYnxsfGQzcd8MF2WtsaSpBiWRUhQ+/0+hCBkaYZWsxUWrNvrB5ktCjCKRpqkaC1tYTAcVNXUoGcQaax5nDHmR6Aauhdzz4wb1ucYTQGSaQghWqGvkmM5Wl6snBvRG6QUaGapp55htGRvDGMwGKAsC5t4Gu3ULwSazRbAjN6gH+SwiIB8oEOilKUpGo0GhsMcw3xok0EAjWYTWZaikfGI1KEDWF3oTrUJihZFSNImJhrposmP8J3NRWlvYFRobDWbkILQGwxRlCWKUscTPO0NFxLtZgOa7WZ7ad+6mHg1Ky303hAgISClmnY6paUbeEGtJEmaJAjGUL3vkOGa50SdKuFaCPJhjp/ccQfmT8zDowjsQsEszbB61SqceeaZSDOLFHuHDBD+5V/+BVobXHPNy6Gc2Yo5YkmS4pm9e3Hb7bfjhS94IdauW4uyLCFVgscfewy7du2y4x+jBK7RbGBmehpr1pyKyckJdBY60Ibd5FhbQ3rqqaewd8/TNqJCxXvOGg0smZrEKaesweR4G52ei1iVwr333YcjRw7jqpe8BIlKUJSFAz2FE7iWMFrj+zfdjGXLluHss9dDm9LRr6rzWuOteUsrnGquUm0iNIjQUXaiEI8JIduINOyJFo/prg+ntqXaO+/8Cf7kz/4cWmt4OfoQAkqJ6clJXHLxRXjfr/0als7OYjAYIGtk2PfMs/jkpz6NZrOJSy55HtasXoNOt1vxttwi3nb77fjY9X+F9//q+/CBD3wAQggcP34Cf3n9x7Fjx06re6Z1INZJJTEx3sbaU9fi9a9/Pa666iprcrRBljWwsLCA6z/xCWzduhUggi4rlScpJSbHxrHu9NPx2tdch5e85CrkeQ5jDD77ub/Dgw8+CPojwrWveiVKXdZaHVuNDHfceSf+4MN/hAs3bcT11/8v2NqWCTSsmJBiIa5KaksQIJVqCKFaQsiOcr0wbUGiFYbEsbbcLYrHPvlusQoaZWYcOHQYJCUuft7z8PxLLg6BgSk19ux7Bvfeex9uvvWH0Mbgv/3+7wcUeGFhAe2xMUxPT1u+QI3jYUAkobWN5ObmliHJUi8lhV6/h6IoMLtsDs+/+GIsWbLESiyCMT+/gO3bt+PhRx/Do9s/huMnjuPNb3oTut0ehBDo9/sYDguMT0zhkosvwtTkJLSjA3e7XezcuRMPPPgQHtm6FYcPH8bb3man5V551Uvw+I6d+Odv/av9vekZDIfDkELkRYFbbr0NSZrgvPM3OK5ACUGuvSLqErDdCK5FIwjvAYLQFoLaQhC8KRsXUowFoQ3XCl1zzEwQTsHVJ5nMQK/bRZHnOGPdOvzC297qCmyV4vmtP7wNn/zUZ/Dw1q14+umncdqpp1oYpCygjc3ekzRzUHk1zjfObQBClmW1lghPGnn1dddi44bzMPQ9+cxY6Czghq//E775rX/BjTd+Axds3IR1p58OXRqkaYp2uwVmg+uufRUuveh5yAsdBsl1Oj3c+M1v4sZvfAP/cMPXsH79Obhw00Zc96pX4p577sX992/Bd77773j3u96JoXu/RpZh+xPbcc9992HFipW4+qUvhVIKeV7W9DADkZCr4ao+oSQpoaRqCSHaQggIG+ujqZRqQESTUt2/FgK33U5BRTVQhwwWFiwg2Gq1UGiDTqcHzyMwBjh/w3mYnl5iT39R+J5DDIdDGK2hksShvKbGCWbHNSijIpbnHQzzIUptNfHtfBiL7Pb7ffQHfbTbbfzi238B5517Lg4dOYotDzwQFAljZfB8OIRmQn8wwGA4QH8wRLPVxC/94jvwgksvxcJCB3fddRe0MZiZmsIb3/AGTExM4Fvf/jZ27NyJZiMDiKCkwPduuhnHT5zAhRdswunr1iIf5pbK5CRVQmTGUXe3i968GqGQckwlyXiSJBCDQR/a6JYQohGwJnYlWjZBuci/iXFq3gJ2Pub8/DykkhhzBaOQ/YKQKoFer4/5+Xk0Gk2MjY+5mjrZGocxSNMESqVOI1WEGS9w82VsFEZInJOvBqN6GXcRtFuIAEkSRV5gfGwc5517LvKiwL5n99thPmSFeaQjNYaoLRpBPxgMkSiJSy65BMzA03v3otvrozQGlz3/+XjxFZfj8OEj+MIX/x5aazSzFDt2PIkf/fgOzCxZgpe8+EVoNhoVHYqEa4St3iNIRmpTqeGygZDCSjHmuXW1QsppIYT0FcZRvq0xTjSHvOKQgJACWmvML8xDSYXZ2TkoKdBuNdFqttBopNi77xl8+Stfxv4D+3HBpk2Ym5tDWZYQkjCMNiZNVaQSCLd4EkTChqUEJ0Ak7M1xAj8xjcra6gqTMsag1WpCOJjG19oTlUBKFVoZvXJ4YOELQmkYS6YmkSQJOt0uBoMBdKmRpgne8IbX4ZQ1a/CTu+/GLbfcCiUlvvPd7+LI0aM4Z/16XHThhcjzsh6Kk2uKdR121XuJmnKVlLLBxrTzPLcsGUE0JZS0msccpZZcY+Q6um2VTQ/7A/T6A7RaLXzrW9/ELbf8IJyKEydO4Omn92JY5Lj2Va/Ce9/9bkghkZfaJXVDS8JLUgghqw5nrlqJtNbQpbsxiQqNqEVZwIxM9mbUG51i81GUZdTSXQWbeZ5HnXFVtTYI8Eib5JZF4YqCXaw/6yy8+lWvwuc+/3n8y7e/g/ZYG/c/8ACajQauvvplaLWamO90o+F5I701IzoElR8HpJBKKbXEGGMzfyHkjCARJqJyPLgGi2dxMTMUWwS21+0hTVPsfGqXzbbj+ceOGZlIARgd+hiNMegPemAG0jSzRS5jqk2JAv+iLEOe4AQHw6wv4ULcejOR6wwAB0leROZDSoFEJeE5MKJc4QfNpVkGKQXKvIR2VVkw0B/keM111+LezZvx+OOP46//9n9jMBzi/A0bcNkLXoD+MA/AJtcYzRyScEEUHRL7Pf+5iGjKboz9iylwJYlbNYFGQ+Gqti7bRqIU+oMhOt0OEqXwwV/7NaxevQqltrhZUeTYt28fbr71h7jxm9/C7t178Mcf/jDSRgaAMBjYUDPLUpucOQn3AOu4YXW6LEEOPPR3SbtFVlIhkYmLejhK/v2IlKizw4Xp3hwawyiKsurJDwq5dtZHlrq5NmVhTaH7maLIMTY+jne+4x3487/4nyjyAlIleN1rXo12q4mFThdCilqbEALzxnXOUXXIg2XS2iuTzPihC1JI0Q7TaKg+IRau98RwnSkjhUC310Gv18fs0hmcc+56rFy+HKWuXuPCTRuxYcMGDIdDbN7yIO7dfB9e9rKXQWuNXr9noZVGw0ZXxkdlVTJmiKD9nOdqRqNtHzcGUFFVMFIG9wuRpqlNIk11O4QUkEq69kRdWQRTNUxqrZEmCdI0wTDPMcxzJwNpn6PfH+CiCzbi5S99Gb5244249OKL8byLnodub2DfT3OEg1EQRQqJZYTheejfSzEKIafsc0qZKSknpTtRURtiKLXGDPy4o3xhfgFFUTjMCxgUJbo9Gy4vLCygNxhi+fJlWLl8OaQkLHQ6kNKSO8rCMkiUlFBCoppMX03HMVqj3+9DCmmhF9++N9ot6xuWQAEsVUqh0+3CsEHqaijsWg6Vy4F8LYhihVyrRwnNjLIoa8h3GATOdlLuKatXQ2sNlSgoIaNb6dIMiKgpi0d6Ohfjj3ZElmgLIYUgUEpCTiLosDhRH63DRCPbDItKctBlSCfmF1CWBVqtJrJGI+wYuQ/XyDIMBzkOHjwIpRTa7Ta0NpBSYmJyEgxg375nkZc5GlnqmgqsNR4ba+PggQN4es8ejI2PY9ncnI0OfdzP8UJxeDbDBu1WC91OFw8++CDSJMWKlcuRJM7kRVJARlc5hsXTLXKepQrbH9+OhYUFTE5OYnJiwjJwDEdNYZYQmCiFbqeDoZvZbNMBDq/JpuohIt8wHDjKBjHHggFIJaekFJmSSmZSiqkwScIVd2jRbC+uzBwzpCAsdBagtcb4+BjG2m0L11MllXb06BHc+M//jCd27sT09AzWrj0NRVEgUQobzjsPY+02Hnz4YXz729/GW970JjSzNARNBw4cwN994Ys4cuQIrrjiCqxbtw5aG6Spi5S0QVsmmJ6aQiNNINVE+OAHDxzAl77yFWx79HHMzc7ieRdcYEVPSztnRiUqJHeSgPGJ8VDiMIZx511346tf+xoAwrnrz8Hs0hmLA1JlNYSwSXWaJuh2e8jzHEmSVBFh3HZPVbMwonIARuBISQJCyEkiZKooilRJNRnLzka9w1WGyhz6RvwLHT50CGma4YkdO/E7v/d71VBr9+fBA/tx4OAhpI0mXvPqa3Haqac5elGJTRs34hUvvxrf+tdv41Of/Tvcfffd2LDhfDSbDTy7bx/uvvde7Nm7D2vXrsVb3vRGNJtNdLs9tFpVF1m328VffeITyNLUQjcEdDsL2LXraRw6cgTjExN4w+tei/Vnn43BcAjpojldlpBS4c4778Ize/cGLlxRlnj2wAE8sWMHhnmB9WefjVdf9yoQEUrtYX7jinyMRiODkBKdThf5MMfY2FgtfzG+vB31w5CfMDIiy0GwDFep5JRUSaYATqWULRoZw+tnpcRCA7HCktGMsdYY2u0m8uEQO3ftrkJTtlJV7VYLF1x4IV561VV4+UtfGpj+hjW0JrzrHe/A5OQkbrnlVjzw8Fbcde99YGOgVIKZ6Wm89Kqr8La3vhlnn3UW+v1B6BYbGx9Hu91Gp9PB/Q88GBy74wBjYmICl156Ca55xSvwossvxzC38A8BSNIUMzMzUEriyd27se2xx2qqR1mjgdmls9hw/gb83FvegjVrTkG/1w/kel8/Mcxot9qQQqLb66LUZU3QISa1hPFZI1IoHI0sCSoZQowTIaEHtjywafnKVT+enJwcL3VZJwqMKIyROwW+VXowHOLpPXsiySsLOpZFgSSRaLfHsWxuFmNjYzZ71ibgbUQ2OsrSDM88sw9P7noKx44eA7NBs9nCqpUrsG7d6UjTBIPBoDbtnBnYuXMHjh0/EXpg/LMmMsGS6SmsWrnK+ppeL7yfDwqOHTuORx9/LBD1KogDaLWaWLFiGU5ZvRoMwnA4CDpocROslAJlqXHrbT+E1gYvf9nVDvPjYDWqCirXOvBopN2xUvtTOHb08N79z+67kh548IEXrVx5ym3tdktoo4NuMtGIVCLXS5NuxhYajUYIWesdmuRAyBxFWdRQ6jBbxtXJG1mGJE0iGRN2lc8htC6tXIqfKeDC4najCaFkrZE2jA0xBoN8iDIv7DAe1GcdJ0mKRjMLih8mnlHpTN1gOKzK30C999P3bgmFVqsBAaDTHbigyOKII22YVRtL3Pfv4KWg4KkUFubn5/ft23uFItASIW0rlRUgdTwyL4PvkrGq6dSExSjKEvnCQk0GxLZHo6KCeuIzTNTC7Xm79un7Q4vueszKyrSTG0sowyDsWFqk5zRwKmktriG2flx8vCn+xpVlgYWFIlr0OBOv9NWklFEreKVPErhirNHt9hdRdWNOddWIYU2hifgAHtgM227zqjFBNKmIxLRS1TjMWAaLnHyRt4E0Mooj5oNw7T7ZkxBOBS8WvkE0Vh0cKYD7kMZU5EJ2Ov/e31Gs4BrxEgjRqEcGNGtIks77jkisnETrEotUe0dkSmNxH64mX9R1RqmaZUaosTLhFNvjlmWbXHu+g4SSSgC0RAlBE2EESCTyRiPXkEZUMGiE6EaxZguznWMZFI0iWIQJLN3fR/IUHHHXAq7otViiWxCpgiwST6jo1iIS94264KgukBBP+/PXoEoGUdOyBKwiB/zMM45azSMd5mq2MkUtIqhrvY1uOlUjxaUSIKIZJaWcYmaXbMX6FlwfGxWVkzEyRt7UGqXr4qfxFedI2McvCAkvwFbJ6LKpiHBElfwjTHRgoggITlGtLtBdkT54ka5MFdjEWFY8a7MuEcC1HIQjfI3jAILqpL/6a1IQdIjFXUU8LdE+NEiICSWlnPHsFsFUF4AeUbuoqgCRKqwfPxhxl9j30hjPfyY3DY+CME4Yd2KimQGxJIjPnN3PU6y8RNXgVIonpHuNqlHphRE9zsrEVEiG182pjScOVoBrmxhbDkte5OjSWM16JuOddE1Op8Yz8zL93se4Ql8i1YQCWTSz4onZsRu61NCsqxFPsSxWdIu82qwgU/cTiOfdj46DchskKsHoULeoifFI19peLYZXhAr016irjGE1/0dD26Ck7ilYXJ/rEuoxkX5M4NWFatSI5Fd4nUr6imoK7RWjTwiKJphHujOur5XZphhBgEiIGSWFnLLWSUMp27ff6/XRajZBQoSIKNaNtVNe6xvgHX5VCBIIgZeJ5mOCa1GMT2YRElzACECYkf6cWHsTXIt+fFk6ngYe9I5rZEA+6cBshAlKxpmxWKKLgXjiXjwt1m8O1WVcRlWXfGNtRaK0VmE4zNHv99But6GSBLoowLY0MaMsLZMhhcK+ffvwg5u+jyxrYM2pa7Bx4yZkjUYQcY4mB7i/E5W7NpX4qAhht39cEWr9RJFgTpgQuNj+h1vgZ5axLR0Lv9mReROE2lh34+aCVZNdsZgN6WWJeSQqo0iehaqh2zUJMK/UFwmkCoFIxpgjvf8RTTXYQaf9fg8PbtmMXbt2o9Qlrnv1a7B06awdXS/ltBJSTLBhyExhz5492LHjCUip8OijW7F8+QqsO/0M5PnQ+QW4OcvOgYtKOosc0yUWHeVI66g2cAVU4+6KuHLqnH88TdCUJth3TZWpsVw0y3XTLhmstDhtQEOjztVUNREOY+DJp13OFAkngFppT/t5cLGzJ8+740q3dVRpakSBB8xAkgg888we3HzzzeGnDu4/gGVzy1CWBZQUEypLs0w4BvtZZ56F3Rs24cDB/Zidm8PssmXQuqySNl8V5CpZ8g8RlFyj0ifFM8yoEuwhVEMcvI6+T+wE7DyyuoZ+FBR77QFUYgaxojrVbh5FuFXU0OUjTmMPVJDnFJ78PnLCY2MRC9S5HKsCVrg2GaMKFKpJVR7VWLFiJU4/4wwcP3YMq1afglNOXeMoWRJp1kho99N7ti5duvTcsiyhElux63Y6mJpaYiMqlyjGmiij0oEIJy/qpXEj2KkmjO2cpBhR6ItbkKOkMSiEC4omsPusXi4WnAv60LwIFYjNJAkRIqlQ4nDiEIuG93B1C4hOonQY8ZBDDhXRi0dbLjzpRCnL1T5x4gTGx8dtf09RgKTEsaNH71SPP7G9Pzc3B5Wm0GWBLEnRmp21NY/SBHCvitFFXVQubmTzN8hwRKa23C87aBqIZh5GDlmEFnWOIj/heKMcwecmOAtTMxI0sk0iyr0orjr7ZNZBK2xMiL5CBTI2fb4vJvy/CBGY7bGsPnMY92siRD6S0PfovWUAlRBSYW5uDkVRQGsNmSiUWmPb1m0Dte2Rrccnxidw3nnnWWyI2ZHVYGvj8ViREDqbaHZQNbwngl4rvlfUmOOdJbMYKbG6iROeghTlPAQCVKUyaGqNP1yNZIwhd+N0NmvKqBRNsIhVK6JxIyQqROIkGp8U3fjq0Pmpo9GBkKM1Ga7J/lY5ISMv8pCmlLrEww89hEe2PnJM5fnw0F133oknntiOsfZYLUysBgaMKNwhgjKAmm5XXLvxoWeY1bxImnF0dNaonCMvaiSNY+3w+m7hTMgNTaT8F/031WZ41Acg8KLsJ1iIWiPrc2hCV7Cfn5s2EppT5TNDf+tI/9HCwgIOHTqEUpf7FQnxLIhwYP9+7NO67g+I6mrgkW+jkWJPHGJixAGPMqzih6Vo4FpN3DPWqoz0jO1h8SSHermBI18XBk8bHlHArK+nIYJgRl2dOX72KGKLusG4thaoBTonoVuMTJqKAc9o+pIjnQgh9itjzAE22o3+UzWtkzBcANVcsdFDxWEWE9U7uyKfEQYWeG1/xHNZTg7Nj8qyx2ankpbisLH1SVCVpEqlQ8lRiVws6kBbNK0vVmOK65JsgsZOPAfnJM13IxFqfQJIbZ4ZVYfQGA2t9WGlS31EQMCQGYm9CaPvGOg3NGKMmGpIQECYqep6rpTJ6zMzvY4/1ab+VeZACji9TQ2tGUaMTIiCFbuzFCiD0klHxmAm2JIuvHCb1iV0NGvNCm6bSkHWxBgbgxbdgtKDgDV6U7wZtdB55DbF5pxGkAirpsgHlTHmkDHa8odjKgHV573UL0Oc07g3GZkoEbsljgevUURcC+HxiPw8DAQDKs2QG4nCEKQEEmVA+QClO3WCDVSawFCCBWP9QaoYVAygy9JVcQySRIFFhq620ZiSgCiHVvQUZA8lA8J1IBsegWxivzoyXrLSoaawsHWJWIoQ3vq0Jl+OjDu+jf3noNJsDkjmEmxULCQ9SvunSDuYXTTkaxEcFaiCfnKg7YzkEsFUBeg5Hv5noR4YLKRtPE6z2L5iNbpLx5Gd6GPt/mdxrjqAycEJOzZLpngSU3i4vRxH5uZA2mD28CFsxAGsKA9BmQKlzPCUmMbW9nIcXjYHlBqzhw5jIw5iZXEQwpTQYUK7AZlqulCoz4dggmuzLWvoBsUgJoVpgEQmOoRV6OB9S/3GEJj5uDb6qGLDx7TWx5h5thpuNZIzM8PE81+JoL0cUyAZcJRj1OcBGKq5rkDr8TNmqmkbDMEG/bSNLXkbP125Dgff+AIgs9Zj981bkd9/As/PcjT0ELt0Gz9W03jiisuBVVac8Ilt+9D58Y9wlWhjKXWwm1v4kVmCxy+/HFgxAQjgiUf3Yf72H+ElcgxzZh5kSjDbXMtAV2VyHglx3e3gUWuPkYQ7QqAD18FH6qyj3+dKqNtBXGVZHmfmjgKbvjE4QUSzFSzP1TWrTXpwN8FwJNPrpjrwYg175qhOEdtDqtdzwhwuMLSQONJeiiPdBMXB/RDHOqCxJjAooQ88iyMscaQ1jUbew2E5je6Ro2geOIQsbVpZrP37Md8f4tDsLFg3cBDj6Bw9jsb+g2gkTRgyKA4cxHy/j4PL5jA2P0Cz6AVSnhmJJMkNNaoqthRqNmSqabUni54R14pq34gj2niSLGCMOcaGc6W1GbDho7FCec3nj8TptclB3ldrQBPXelNGK221tDCyudUkH5tFD2SKAUtMzi7F0r37gb/9J5jpKYiFHiZNgYlTV2IhP46+ApJWG8tywHz3JvDYBFgbtMoBlq5ahUGmcXioIRtjmCslyu/fArTHQVqD8j7mTlkFrTS6MkNaDmy0FfAvjqePRDcANfYQk6lVO+2kqpi84VQHRwUFmEbU4F3KbqOyI8ZwXxljBhDiaNXAORL6cZ0lyxFBOgAVZoTx6eF2ro/3jY1zNYAtwqCZoJmQFl1M5fNYe9opmJjvYdjrIZmZxPTkOKb7xyGKPsgYtHrHccr0LLLJacwvLFh5rsk1WGr6yHrHIE2JZv84Vk4uRTY2ifmFBYAIU5OrMSsKtBeOgphRgiy4EJ7DuOIchcI5Fk/wRDxoFCfBDWvDFeIhTZ5m5cvsUd5lDB81xgxUmRcdIcVu1728OMNHvbmMawQDUx8ah4qgTVFPSC0Kq5hpbvBnvCCAKHM0hl2MG0AWQ0xk4zDtMZAxaHaeRaO/gETnkGygSglRFmi0ppBPNkAA0sFhtAbzyPQQwmgYoZCUBcaakyiWNKykYn4czeFxtPMuZDmwZHRjRrjEngAyYjGYUBvOFJ9KcJiJVjEkR+brEBYRXwLCYBVtdxmtc5WXhTGFuYHBb2k2W9OLauUxb6sGzXCYvYXa7K6owSkkj6Im1+GrubYWI2qMz4QYZHKkuUar6EH3j4GFHQyUGA3lNoVdRNcuhyjyDrRrqpWskeoCwumCERitoot8OA9NlvwnjEbDFBCmhGINwSZojIHrtzguWSAmaUUNXaGljymMHyMeKdOinhr4crfvDmdmdLvdp4siv1GQYGXZgHzbsaPHfq3f7P9hmman0iKHc9JbvKidDYsmtpzsv6v4/mT9IvZKSxQqgyEB44Ym+DFZJRsoXUBojVIl0CqxuYgXkGODIRsonUMYDS0zaKnC9z1AMzAGgkskZYEco9MzaFECPzL+ZmTNT+KIF1X4sSgf9H7fMHQ+HD5RlMUfkaDNAPD/DQBhv2mGi6VGCwAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/bb-logo.png,importbuddy/images/bb-logo.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/bluebutton.jpg,importbuddy/images/bluebutton.jpg
/9j/4QNwRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAgAAAAcgEyAAIAAAAUAAAAkodpAAQAAAABAAAAqAAAANQACvzaAAAnEAAK/NoAACcQQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaAAyMDEyOjAzOjE2IDE3OjI2OjA1AAAAAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAAGgAwAEAAAAAQAAADQAAAAAAAAABgEDAAMAAAABAAYAAAEaAAUAAAABAAABIgEbAAUAAAABAAABKgEoAAMAAAABAAIAAAIBAAQAAAABAAABMgICAAQAAAABAAACNgAAAAAAAABIAAAAAQAAAEgAAAAB/9j/7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIADQAAQMBIgACEQEDEQH/3QAEAAH/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/AMmUlGUltOC//9DElJQlJbTgP//R52UlGUltOC//0uZSXIJLacF//9n/7QrgUGhvdG9zaG9wIDMuMAA4QklNBCUAAAAAABAAAAAAAAAAAAAAAAAAAAAAOEJJTQQ6AAAAAADZAAAAEAAAAAEAAAAAAAtwcmludE91dHB1dAAAAAQAAAAAUHN0U2Jvb2wBAAAAAEludGVlbnVtAAAAAEludGUAAAAAQ2xybQAAAA9wcmludFNpeHRlZW5CaXRib29sAAAAAAtwcmludGVyTmFtZVRFWFQAAAAyAEMAYQBuAG8AbgAgAE0AUAAyADUAMAAgAHMAZQByAGkAZQBzACAAQAAgAEsAcgBpAHMAdABlAG4AIABXAHIAaQBnAGgAdCAZAHMAIABNAGEAYwBCAG8AbwBrACAAUAByAG8AAAA4QklNBDsAAAAAAbIAAAAQAAAAAQAAAAAAEnByaW50T3V0cHV0T3B0aW9ucwAAABIAAAAAQ3B0bmJvb2wAAAAAAENsYnJib29sAAAAAABSZ3NNYm9vbAAAAAAAQ3JuQ2Jvb2wAAAAAAENudENib29sAAAAAABMYmxzYm9vbAAAAAAATmd0dmJvb2wAAAAAAEVtbERib29sAAAAAABJbnRyYm9vbAAAAAAAQmNrZ09iamMAAAABAAAAAAAAUkdCQwAAAAMAAAAAUmQgIGRvdWJAb+AAAAAAAAAAAABHcm4gZG91YkBv4AAAAAAAAAAAAEJsICBkb3ViQG/gAAAAAAAAAAAAQnJkVFVudEYjUmx0AAAAAAAAAAAAAAAAQmxkIFVudEYjUmx0AAAAAAAAAAAAAAAAUnNsdFVudEYjUHhsQFIAk4AAAAAAAAAKdmVjdG9yRGF0YWJvb2wBAAAAAFBnUHNlbnVtAAAAAFBnUHMAAAAAUGdQQwAAAABMZWZ0VW50RiNSbHQAAAAAAAAAAAAAAABUb3AgVW50RiNSbHQAAAAAAAAAAAAAAABTY2wgVW50RiNQcmNAWQAAAAAAADhCSU0D7QAAAAAAEABIAk4AAQABAEgCTgABAAE4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAAAHg4QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAACgABAAAAAAAAAAE4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAAAAACAAA4QklNBAIAAAAAAAIAADhCSU0EMAAAAAAAAQEAOEJJTQQtAAAAAAAGAAEAAAACOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA0kAAAAGAAAAAAAAAAAAAAA0AAAAAQAAAAoAVQBuAHQAaQB0AGwAZQBkAC0AMQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAADQAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAADQAAAAAUmdodGxvbmcAAAABAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAA0AAAAAFJnaHRsb25nAAAAAQAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAI/8AAAAAAAADhCSU0EFAAAAAAABAAAAAM4QklNBAwAAAAAAlIAAAABAAAAAQAAADQAAAAEAAAA0AAAAjYAGAAB/9j/7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIADQAAQMBIgACEQEDEQH/3QAEAAH/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/AMmUlGUltOC//9DElJQlJbTgP//R52UlGUltOC//0uZSXIJLacF//9k4QklNBCEAAAAAAFkAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAAVAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADUALgAxAAAAAQA4QklNBAYAAAAAAAcACAEBAAEBAP/hDw1odHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wOkNyZWF0ZURhdGU9IjIwMTItMDMtMTZUMTc6MjY6MDUtMDU6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTItMDMtMTZUMTc6MjY6MDUtMDU6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDEyLTAzLTE2VDE3OjI2OjA1LTA1OjAwIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY3NDIwMTAyNDAyMDY4MTE5OTRDQUFBMUE3ODk1Q0FEIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjY2NDIwMTAyNDAyMDY4MTE5OTRDQUFBMUE3ODk1Q0FEIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6NjY0MjAxMDI0MDIwNjgxMTk5NENBQUExQTc4OTVDQUQiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo2NjQyMDEwMjQwMjA2ODExOTk0Q0FBQTFBNzg5NUNBRCIgc3RFdnQ6d2hlbj0iMjAxMi0wMy0xNlQxNzoyNjowNS0wNTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6Njc0MjAxMDI0MDIwNjgxMTk5NENBQUExQTc4OTVDQUQiIHN0RXZ0OndoZW49IjIwMTItMDMtMTZUMTc6MjY6MDUtMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUuMSBNYWNpbnRvc2giIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDxyZGY6QmFnPiA8cmRmOmxpPnV1aWQ6NkE1NzkyRTU4QTJDRTAxMThGOTA4REI3RkM1OUY2OEE8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkJERDEwQ0VFOEEyQ0UwMTE4RjkwOERCN0ZDNTlGNjhBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpFRjVCMEREQUQzRThERjExOUUwMzkzMzkwOUM5OTU0RTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDU4MDExNzQwNzIwNjgxMTk5NENBQUExQTc4OTVDQUQ8L3JkZjpsaT4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAABAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uACFBZG9iZQBkQAAAAAEDABADAgMGAAAAAAAAAAAAAAAA/9sAhAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgIDAwMDAwMDAwMDAQEBAQEBAQEBAQECAgECAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwP/wgARCAA0AAEDAREAAhEBAxEB/8QAewABAQEAAAAAAAAAAAAAAAAABQYJAQEBAQEAAAAAAAAAAAAAAAABAAkCEAEAAgEFAAAAAAAAAAAAAAAAERQhECABAiIRAAECBgMAAAAAAAAAAAAAAAABMvAxkaHhokGBAhIAAgEFAAAAAAAAAAAAAAAAADEQIPBBkfH/2gAMAwEBAhEDEQAAAM9tT8chCm0mhmKAovo//9oACAECAAEFAN2X/9oACAEDAAEFAJZ1hLD/2gAIAQEAAQUAsdVlbW1rlYen/9oACAECAgY/ABXqnh//2gAIAQMCBj8AzDEOOn//2gAIAQEBBj8Aclx2uSS18Dr4HLHRNKoc7H//2Q==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/bluebutton.jpg,importbuddy/images/bluebutton.jpg
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/bullet_error.png,importbuddy/images/bullet_error.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAhlJREFUeNrEk7tuE0EUhv/ZC7aBOJItItkoOGBjJSkR4REsFyBEkVQUEBcoDQ0SJQ15ApooRVJQJi+AoKFDSCCiiODEBmyMkIXiS3bjy3pn5gyzhgY2XQr+0ezsnjn7aeb8M0wphdPIwCllBQ/1pAQWoJiRBNGiMuxl2HZeKQk5HFao720S8e3RcNj2PR9Tz1/9DfijGXBa45OJIkulYQoPjOmoGV2gem1B/mzc1l8rutdP2kJCCVrnqemilcvBdA7BJpNg8SSsbhPR2TmwS/kiSVoPckMA8vmSP5EoWOkU8Ok95Oc94OY94NZ9+OUyxM47xKYzYMl0QXKxFAJI0ygZqYtA8zvE0RGUGfk9Gzik32WrDfGtjlgmC2kYpRBAmeasFbUhfjR0IW0QJx2kcYIcCZCO+bUaDDs6zg25IIWEkgTF9ah/VkIHR6PAFQ1Tek73oEntis4JAfhxb9/s+deNC2mISgWKWZDPVmFwoRkGRH+AM9mr4EMPfq+3H9qC7zgbg+oBWGoGiMYhXBfmo6dgj1fhtVzgXBxm5jK65R34x85GaAUE2hrUq3dwNlY4f+0GWO0LnIclXUNCZG4e9pUcOge76FZ2X+rlbYUAWh1J8kH3w9s177BVnMjOI5KYGpvAJUfzzWs41Y8vdLVWmGF1TgIEqhOJu25lb9FtfF1mlpVXROOj7PfdTQ3b1uVo/3sX2H+/jb8EGAB6SgK2ePksLgAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/bullet_error.png,importbuddy/images/bullet_error.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/button-grad.png,importbuddy/images/button-grad.png
iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACF0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgNC4w6iYndQAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMS8xNy8wONpsdXEAAABGSURBVHicY9Ts2fWfAQ2wMPzHEGNg+f//H6Ygwz9sgthU/sdmJlbtlFpEgpOwWoTszv+Dz0lUtOg/ukoSfATT+5+gSkxBAOqCS3dTeDKPAAAAAElFTkSuQmCC
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/button-grad.png,importbuddy/images/button-grad.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/collapsed.gif,importbuddy/images/collapsed.gif
R0lGODlhBgAHALMKAM7Ozr6+vq6urp6enoWFhaampt7e3u/v742NjX19ff///wAAAAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAGAAcAAAQVEAFFVUrD0HvF4RfCEYGVFAeFaFUEADs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/collapsed.gif,importbuddy/images/collapsed.gif
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/expanded.gif,importbuddy/images/expanded.gif
R0lGODlhBwAGALMKAM7Ozr6+vq6urp6enoWFhaampt7e3u/v742NjX19ff///wAAAAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAHAAYAAAQWEKU5kaETqEKHUgcxGZ8SJEL5IccXAQA7
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/expanded.gif,importbuddy/images/expanded.gif
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/gray-grad.png,importbuddy/images/gray-grad.png
iVBORw0KGgoAAAANSUhEUgAAAAUAAAAfCAIAAACgQJBPAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAsSAAALEgHS3X78AAAAIXRFWHRTb2Z0d2FyZQBNYWNyb21lZGlhIEZpcmV3b3JrcyA0LjDqJid1AAAAFnRFWHRDcmVhdGlvbiBUaW1lADEwLzI0LzA4KQ6r+wAAAClJREFUeJxjfPv2LQMSYPn//z8yn4kBFaDzqa0eXZ5U9QMtT6l5tFYPADsXLPcJwrwLAAAAAElFTkSuQmCC
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/gray-grad.png,importbuddy/images/gray-grad.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/icon_16x16.png,importbuddy/images/icon_16x16.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAk1JREFUeNqkkz1MU2EUhp97b6FGoSAMaoBYAimMxgSdHFCpa/1ZXIyToZMOhCgDgyFqjFGm1jhoTDT+JHo7oCYMxp/JgdiAaATibeUvESjtNdD29rscB+GKAeLgSc7ynfd87zk576uJCP8Tvq0KqYTPD0SBZDCi3myF0zabIJXwnQOigabz+5xcksL82zjQH4yosQ1gEfHSMo2QZRqx6df7pZhNylrkJvolPVArlml0r8eLCOubu9MDtZIdvyWu627I4s9vMvv+sFimEbNMI+R9YJnGLss0YjPv2iWfGxfHcWRizpaJOVuO3f0gXS9GZWgyI3P2sjiOI5mvNyU9UONNo1mmEato7olWNPd4a515PsrLsfm/Vu070kRnWz0Abj5N9uNpSvbwQR2Ibgt2o5RCKYW1sERluQ7AvUgrl9sbAfiezbOwVEAphZTV4a/vBIjqgNeslCK1uMSTTz9oCPjpCFZxqrUWgDtDM6Qyyx5O9AqAah1IOrmkV2jbvZ3eQw1M2kXCD0YIPxwG4PHxEC07yz1ccfYRwH0diOdHTlCYvO0Vs3mHky012EVFZblBR2MVi8sOSilKhQz5z2dRC6/iwYhKaCJCKuELARe06nDUaLwBRgAAcyxLXWUZB/bs+K2Z7CCu1QWufTUYUT0blJhK+K5gBC5pe69DVcefE7g2MtUHmWcJIB6MqMEtpZxK+MJAVAJHI9JwDS3/BW3qIjjTHus/veBNs2qmVdanm5oJMIAywA8Yuq4bq28aoANrDC7grqyslIAS4ADurwEAaepxmqgtIWwAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/icon_16x16.png,importbuddy/images/icon_16x16.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/icon_32x32.png,importbuddy/images/icon_32x32.png
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAIk0lEQVR42n1WWVCb1xU2dmKaTu2x04e2k7STtn5q8lYnkzw0T+lMJ3lo7ZlMM5lkYhu8PrSk8aSk8VKQDDYBaqABswnEYkDsNkLsSGwChI2QhA3CrDb7ItCKWPT1nMs//9ipRpr55t7733PO/c6555yrfQD+D0VFxYfa2/WfWaw285DVOjtksRCsMsxDFsLQrJm/C7woY7buwUKw2myMSUNHR2V5RcV7PzwrKIGu7u5zk1NTAy6Pd9vpdsPpehEbEpweD5xeH41ekJwMl9sDt4fhhcfng8frDcw8feYYePCgUqFUvBySgFKpDH/4cNDk8/u3SRFEAu4fYmcXbgAupwvOmadwrm+ItWd3d+9QIsXw+jZl+Le2A7bh4dmbN28eCUmABSw225JkRD6UvRJkAoBjyILVmFg4LlyEO1cFx6VLWL12DY5BMzwAeb1JEAT25t49EqP2MW9iYuKvQxIggV+OjIy6+HAXRUAmQGDjc3TgzG+PYf7IESxfuIBdAKtRUVg8+iqeHjuGucxMeAUJIu99Php+TExNBVJSUn8fksDtlJQ3xycnt5mxiIBEwgfgSZYKluNvY62kFI7mZmyMjYl95/g4HK1tWK2shPWddzD2fSbLs/4L10F5gIyMOx+EJJCenv7uNN0rK8jKOztYso5Af+Q1dL3/BwwUFaGfPB1tb4eDks6u16MvPR0mtRqdtN92+GdYHhyGd3dXSkICjXPz81CpVH8NSSArK+vDZ7NzcO/dv+y9/dZ/URf2EnQ/PYra8HBUkar+88+xFAjAcOYMqsP2ie/1R49AG3YQdsV/xFW4PB45iguLSygqKroYkoC6oOD0wuIiMZaugOAH8FiRiDISLz38E1QfPoTK/fvR8PHHsJNXTZ9+Ck1YGKoPHUIZoZTIDF+NxybA+jKWlleg0Wi+DUmgtLQsmgXlHCD4dgOY7jKiPOzHSN9/AHk/Ckdx+EHk02FZb7yB/MOHUXyQ1hSB9AMvE9FwTOo74RNl6ZPtrKytoab2XlJIAtU1NYkraw65fj0S+BqM0VeRTd4lkFrygZeQSuP3hLR9YUgiYt/RPJPQ/VU0vIGA5LlXvoJVxzrqdQ15IQmQgGptfYOT5oVr4Ll7ewd9t1OR/9rrSCLVeMINaeS16ue/QG9iMlxb21TCPqkjSgRovb7hRGtbe21IAiRQs+50ygQkL6Rk8olILFI5mUtK0BodDd3582j7ZzTMRcWYn54R+y5uzS4PEWAI74XuBnXOzq7ujpAESMBAff557+WKEIbZq00/HyTglSDq3u/nfQG5cxLEKOn2m0zm+Pj4/UEJxMXFhfX1mwZJWW4eWxR2n3+LjPC3PVJMUESDiLBx3pN0+CB5zvt+0ic7siODZvPErVu3XglKICEh4RV6iMbZACstr67B9OAhxp5MiCtZWlnF7PyC2JukZmV6OEjNZYHkVoUsdVCSWYGD7nqean6KrsRssWKF9liHydmGH60kJye/GpQAbRy1DA8vsVfbVEJthg7U3K9DXkERns3No6K6Blm5ecJgQfFd9PT2oZtQV9+AWpLjUd/RKcnWoqyiktZdKNGUy6/k6NgTX1pa2m+CEkhNTf3VyKjdzYI7VEbV9+4jv7AYd3JyMfx4hA4toXURWtoNaGptB/8mpqYRdflrIqDF41E7GptbRLmVV9XgbpkGFVXVPIrwe+lKJqenA3cyM48HJZCRkfHW+MTkDicgR4C97OjqQXFZGbJV+Si4W4IsVR7ukkeaymrYn4yj29iHqtr7RLYOWl2D8PrBoJkJMMR83emSK4ofpFyV6o9BCeTk5Lw3RXfr9u2xfWwfQ2u7nr3n0FGycR7QXZPXZosNrXoDJianKA8WsUjdc5zmtkcjFCE9rZc5B8ThWzvyHxXMzs3ze/BJUAJqtfqjp7NzLMz/YNDbb+IokLdVIqna6X65Ah6N2DFktaGBwp2br+b75xoX+aKmfmAgOUo+Js5eMyGppDfFg1Sm0VwKSqCkpPTM3MICKwnW2Xn5RGKAjfLhnA9cdmxQhD1XXYAZIlxcWoaWNj1yiMyzuQVOOpEThXRlTLKyphbbZI91OVLU7q8EJVBVXf3NwuKyaKObVPvpmdnCWHJqGoz9Jj6IciMgQn9PW09rjegTnT1G1NZpSbaC655J88FCJ/rKNXqE1jkHmIAoV229LjkoAW19fRLXOgsyklPSONzioDpKsJw8tcgFlboQ+s5u3MnOxdj4hIiUobuHE5X/96GQqoVJ8qOWkZ3DjYy7oETAgeaW1vygBJpbWvKYodRKOayU1VXQNTaDHyiLbZhKqpwTUyRXY0srR4hKso3/rotDS2hf19RM+06h02sa4INlcInqDYZ7QQnoDR011MWIgPjfz62U2YuK4O/ccqVyYuM8ym8G77McJy9DehPIhuw9wSfmPcberqAEjL19/RxCNs6C7CU/oQ7GOo8btCc8k0F7MlieweQlsB0ZvB6j3tE/MPAoKAFqrdP9Aw8kb7bIOz95xz1cfhX3XkSG5JX8XRo9UlQYXimCm1vbhB1RhiayT2fMBCXwXVJSTxNlbyPdoa6hUaCeoWvgkdAg5g1aLZrq6qCjeYuWRx2a6FtjvRZa1mM0NqGBwLZkkO2WtnakpKbaghL429+jymJiFVDeiJOhuHEDCqUSsYo9KGNjcSE1E5HpKnyrvInPMosRHZeAyLRcXLx9h/eFvJL0SP9FxMUhRqFA1Jf/aA1K4Nz58xlXrl6TDlMIMCHGv8lwTEwMrscocVylxe8Km/FJYi5eL+zAidsFeDO3Ce9m3CM5JcnFso4MthcjOXDt+nVcvHSpIiiBv5w48f4XX5wyRJ49a4yIfB6RxogIAo2nz54zfnhZafzT1/HGk1H/Mn7wTYLxxJdXxPqjywrjaZaPiDCeIfkzJC/py7ZOnTrVefLkyT9DOvN/1S/OiQQ06hAAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/icon_32x32.png,importbuddy/images/icon_32x32.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/loading.gif,importbuddy/images/loading.gif
R0lGODlhEAAQAPQAAObm5iV9ptvf4oy1x87Y3VmZt4GuxCV9pmeguz+LrqbD0LXL1TSFqpu9zSd+pk2SsnOnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAkKAAAALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQJCgAAACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQJCgAAACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkECQoAAAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkECQoAAAAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAkKAAAALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAkKAAAALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQJCgAAACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQJCgAAACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/loading.gif,importbuddy/images/loading.gif
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/loading_large.gif,importbuddy/images/loading_large.gif
R0lGODlhQgBCAPMAAP///wFmoUyTvHqvzdzp8aDF2/j6+xx2q8La6AAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9VBzMu/8VcRTWsVXFYYBsS4knZZYH4d6gYdpyLMErnBAwGFg0pF5lcBBYCMEhR3dAoJqVWWZUMRB4Uk5KEAUAlRMqGOCFhjsGjbFnnWgliLukXX5b8jUUTEkSWBNMc3tffVIEA4xyFAgCdRiTlWxfFl6MH0xkITthfF1fayxxTaeDo5oUbW44qaBpCJ0tBrmvprc5GgKnfqWLb7O9xQQIscUamMJpxC4pBYxezxi6w8ESKU3O1y5eyts/Gqrg4cnKx3jmj+gebevsaQXN8HDJyy3J9OCc+AKycCVQWLZfAwqQK5hPXR17v5oMWMhQEYKLFwmaQTDgl5OKHP8cQjlGQCHIKftOqlzJsqVLPwJiNokZ86UkjDg5emxyIJHNnDhtCh1KtGjFkt9WAgxZoGNMny0RFMC4DyJNASZtips6VZkEp1P9qZQ3VZFROGLPfiiZ1mDKHBApwisZFtWkmNSUIlXITifWtv+kTl0IcUBSlgYEk2tqa9PhZ2/Fyd3UcfIQAwXy+jHQ8R0+zHVHdQZ8A7RmIZwFeN7TWMpS1plJsxmNwnAYqc4Sx8Zhb/WPyqMynwL9eMrpQwlfTOxQco1gx7IvOPLNmEJmSbbrZf3c0VmRNUVeJZe0Gx9H35x9h6+HXjj35dgJfYXK8RTd6B7K1vZO/3qFi2MV0cccemkkhJ8w01lA4ARNHegHUgpCBYBUDgbkHzwRAAAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9VAjMu/8VIRTWcVjFYYBsSxFmeVYm4d6gYa5U/O64oGQwsAwOpN5skipWiEKPQXBAVJq0pYTqnCB8UU5KwJPAVEqK7mCbrLvhyxRZobYlYMD5CYxzvmwUR0lbGxNHcGtWfnoDZYd0EyKLGAgClABHhi8DmCxjj3o1YYB3Em84UxqmACmEQYghJmipVGRqCKE3BgWPa7RBqreMGGfAQnPDxGomymGqnsuAuh4FI7oG0csAuRYGBgTUrQca2ts5BAQIrC8aBwPs5xzg6eEf1lzi8qf06foVvMrtm7fO3g11/+R9SziwoZ54DoPx0CBgQAGIEefRWyehwACKGv/gZeywcV3BFwg+hhzJIV3Bbx0IXGSJARxDmjhz6tzJs4NKkBV7SkJAtOi6nyDh8FRnlChGoVCjSp0aRqY5ljZjplSpNKdRfxQ8Jp3ZE1xTjpkqFuhGteQicFQ1xmWEEGfWXWKfymPK9kO2jxZvLstW1GBLwI54EiaqzxoRvSPVrYWYsq8byFWxqcOs5vFApoKlEEm8L9va0DVHo06F4HQUA6pxrQZoGIBpyy1gEwlVuepagK1xg/BIWpLn1wV6ASfrgpcuj5hkPpVOIbi32lV3V+8U9pVVNck5ByPiyeMjiy+Sh3C9L6VyN9qZJEruq7X45seNe0Jfnfkp+u1F4xEjKx6tF006NPFS3BCv2AZgTwTwF1ZX4QnFSzQSSvLeXOrtEwEAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvVQIzLv/FSEU1nFYhWCAbEsRx1aZ5UG4OGgI9ny+plVuCBiQKoORr1I4DCyDJ7GzEyCYziVlcDhOELRpJ6WiGGJCSVhy7k3aXvGlGgfwbpM1ACabNMtyHGCAEk1xSRRNUmwmV4F7BXhbAot7ApIXCJdbMRYGA44uZGkSIptTMG5vJpUsVQOYAIZiihVtpzhVhAAGCKQ5vaQiQVOfGr+PZiYHyLlJu8mMaI/GodESg7EfKQXIBtrXvp61F2Sg10RgrBwEz7DoLcONH5oa3fBUXKzNc2TW+Fic8OtAQBzAfv8OKgwBbmEOBHiSRIHo0AWBFMuwPdNgpGFFAJr/li3D1KuAu48YRBIgMHAPRZSeDLSESbOmzZs4oVDaKTFnqZVAgUbhSamVzYJIIb70ybSp06eBkOb81rJklCg5k7IkheBq0UhTgSpdKeFqAYNOZa58+Q0qBpluAwWDSRWYyXcoe0Gc+abrRL7XviGAyNLDxSj3bArey+EuWJ+LG3ZF+8YjNW9Ac5m0LEYv4A8GTCaGp5fykNBGPhNZrHpcajOFi8VmM9i0K9G/EJwVI9VM7dYaR7Pp2Fn3L8GcLxREZtJaaMvLXwz2NFvOReG6Mel+sbvvUtKbmQgvECf0v4K2k+kWHnp8eeO+v0f79PhLdz91sts6C5yFfJD3FVIHHnoWkPVRe7+Qt196eSkongXw4fQcCnW41F9F0+ETAQAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9dAjMu/8VISCWcFiFYIBsS4lbJcSUSbg4aMxrfb68nFBSKFg0xhpNgjgMUM9hZye4URCC6MRUGRxI18NSesEOehIqGjCjUK1pU5KMMSBlVd9LXCmI13QWMGspcwADWgApiTtfgRIEBYCHAoYEA2AYWHCHThZ2nCyLgG9kIgehp4ksdlmAKZlCfoYAjSpCrWduCJMuBrxAf1K5vY9xwmTExp8mt4GtoctNzi0FmJMG0csAwBUGs5pZmNtDWAeeGJdZBdrk6SZisZoaA5LuU17n9jpm7feK53Th+FXs3zd//xJOyKbQGAIriOp1a9giErwYCCJGZEexQ8ZzIP8PGPplDRGtjj7OVUJI4CHKeQhfypxJs6bNDyU11rs5IaTPnBpP0oTncwzPo0iTKjXWMmbDjPK8IShikmfIlVeslSwwseZHn1G0sitY0yLINGSVEnC6lFVXigbi5iDJ8WW2tWkXTpWYd9tdvGkjFXlrdy1eDlOLsG34t9hUwgwTyvV2d6Big4efDe6LqylnDt+KfO6cGddmNwRGf5qcxrNp0SHqDmnqzbBqblxJwR7WklTvuYQf7yJL8IXL2rfT5c7KCUEs2gt/G5waauoa57vk/Ur9L1LXb12x6/0OnVxoQC3lcQ1xXC93d2stOK8ur3x0u9YriB+ffBl4+Sc5158LMdvJF1Vpbe1HTgQAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvXQMzLv/lTEUliBYxWCAbEsRwlaZpUC4OCgKK0W/pl5uWCBVCgLE7ERBxFDGYUc0UDYFUclvMkhWnExpB6ERAgwx8/Zsuk3Qh6z4srNybb4wAKYHIHlzHjAqFEh2ABqFWBRoXoESBAVmEkhZBANuGJeHXTKMmDkphC8amUN8pmxPOAaik4ZzSJ4ScIA5VKO0BJOsCGaNtkOtZY9TAgfBUri8xarJYsOpzQAIyMxjVbwG0tN72gVxGGSl3VJOB+GaogXc5ZoD6I7YGpLuU/DI9Trj7fbUyLlaGPDlD0OrfgUTnkGosAUCNymKEGzYIhI+JghE0dNH8QKZY+j/8jEikJFeRwwgD4xAOJChwowuT8qcSbOmzQ5FRugscnNCypD5IkYc0VML0JB9iipdyrQptIc9yRyysC1jETkzU2IxZfVqgYk2yRxNdxUB2KWRUtK65nSX02Lb2NoTETOE1brNwFljse2q25MiQnLUZPWsTBghp76QiLegXpXi2GlrnANqCHCz9g3uVu0AZYMZDU8zEFKuZtHdSKP7/Cb0r7/KDPwCaRr010kkWb8hkEq15xyRDA/czIr3JNWZdcCeYNbUQLlxX/CmCgquWTO5XxzKvnt5ueGprjc5tC0Vb+/TSJ4deNbsyPXG54rXHn4qyeMPa5+Sxp351JZU6SbMGXz+2YWeTOxZ4F4F9/UE4BeKRffWHgJ6EAEAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvXQMzLv/lTEglmYhgwGuLEWYlbBVg0C0OCim9DwZMlVuCECQKoVRzCdBCAqWApTY2d0oqOkENkkeJ04m9fIqCCW7M0BGEQnUbu34YvD2rhIugMDGBucdLzxgSltMWW0CAl9zBAhqEnYTBAV4ZAOWBU8WdZYrWZBWY3w2IYpyK3VSkCiMOU6uboM4dQNmbQSQtI+Jf0Sqt4Acsp45tcHCpr5zqsXJfLOfBbwhzsl7unWbFwhSlddUTqcclN664IE1iq5k3tTow5qn53Td3/AcCAdP9FXv+JwQWANIEFfBZAIjSRHY7yAGSuoESHDkbWFDhy8U7dsnxwBFbw7/O2iUgYxOrpDk7qFcybKly5cIK7qDSUHjgY37uumcNo3mBAE3gQaV6LOo0aNI4XkcGFJnFUc62bEUesCWJYpR/7nMeDPoFCNGTiatBZSogYtHCTBN2sIjWnAi1po08vaavqpy0UBlyFJE15L1wNaF9yKo1ImCjTq5KWYS3xCDh2gFUOcAqg8G6AK8G3lY2M4sgOzL+/QxQANBSQf+dxZ0m5KiD7jObBqx6gsDqlbgMzqHI7E/avu+6Yp3Y8zAHVty20ETo7IWXtz2l1zt1Uz72ty8fM2jVrVq1GK5ieSmaxC/4TgKv/zmcqDHAXmHZH23J6CoOONLPpG/eAoFZIdEHHz4LEWfJwSY55N30RVD3IL87VFMDdOh9B88EQAAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvbQUzLv/lVEg1jBYyGCAbEsRw1aZ5UC4OCiq80kZplVuCECQKprjhEZJyZpPIkZUuL1iPeRAKSEIfFIOQiOUAAtlANMc/Jm4YQsVXuAtwQAYvtiOcwhkTVsZUU5uAlZ+BghpEkkvaB2AiQB1UWZVOWORP3WNOAZflABAApc6m41jcDiGh3agqT8Eny4GtK+1LHO6fmxfvbsanL4hJrBhi5nFFV7IIJOfBsF+uCEIphiAI6PMLikC2VObjN62A+E2H9sj1OYi6cQetxrd5hXYpu5y1vfj9v4CXpgmkBkBK6sQ9CvYYke6LqtGGNknEEa4i+LMHBwxgqEHdOn/ynG4RTHgJI8oU6pcyXKlkZcwW5Y4gPGiEY4JZc6gyVPAgT06gwodStQjSaFjAGokEDOoz3iUmMJUWNKfxZ7iXh6sarTOUzNcZS4sqmgsQxFKRzI1WxDBgZ8Ub0llK7DUW3kD54YtBuOtAFYT9BLFdlfbVjl7W4jslHEX08Qf3AqAPItqwFA00+o4SLcYZkRSblmeMI2yiDSf98ode1hKgZ8hnmq+wLmRXMoE3o7CDPTD0WYHmxwAPAEblwE05ajzdZsCcjzJJ7zGY+AtceaPK+im8Fb4ASQ0KXdoHvhtmu6kt5P22VvR6CXRJ6Cf4POS2wPip3yqr/17hvjSnVKXGnry+VcefkjNV6AF1gmV2ykKOgIaWRT4FFAEACH5BAkKAAAALAAAAABCAEIAAAT/EMhJq720FMy7/5VREJZmIYUBriwlbpUZD2prf289FUM4pLeghIA4jWKwCWFQrCCaQo4BpRsWoBLZBDEgUZa9aIdwreYoPxfPzMOKLdNjBrhLAgxpCpf+xpy3cll2S1giXX0SU1UST4UIXhhkVXtwgSxECIt/Qng0IW03cZkVZJBBXG6dnqGNZgaLNgYEbD+wLKK2iIkDvLm3rbqVtYhxvm9gxhdEs3DJx7BTTJHAwUJgeRdT1NUrZLyHHpiPztWGvKMgsk/kwVzDsczcHVOm8vY47PfdXo0E8fo2iBQQwGuIuCf/AHLwRpAgtjvqGin0wItgmXkJJ1oopbGjx48g/0MCPNhPZIUBAlKqJLjskct6IlE2VBnGpM2bOHN6lJXPHgqYLmQtA+pRJsFHX1r6ywgSzEoBMJbO6jmRiMwwr3SGo6p1Xtadlla88sdVDIKUq/BJLRsFj0o+ftaaXKLSTVKyOc+mtONiaiWA6NRAjXXggF1detmSKnxAsQcDAg4IcHyHMeXHKhUTsKzGsQgzKok+5ozmQM0gA0/fyXxjQOFFmw2LiV0P8gG+ILjAKnz67OEtArDIrCTaBoLCplyfTpnBtIvIv4kV5oucQuEvkmNIvoyhwGvsja0fcFF9AuTB8gwUduNd9fXSfI9PtvdQQmTq45urBqBlovoD9bxn3hd3NsVmgYATRFZcVeiJV4IAC5rEnD0RAAAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9FCHMu/+VgRBWUVhEYYBsS4lbhZyy6t6gaFNFPBmmFW4IIJAqhFEN2bNoiB6YcJL0SUy1IxUL7VSnAGmGJgHuyiZt9wJTA2bg5k++Pa/ZGnBS/dxazW5QBgRgEnsvCIUhShMzVmWMLnuFYoJBISaPOV9IkUOOmJc4gyNgBqddg6YFA3Y3pIl3HWauo5OybCa1Q6SKuCm7s4mKqLgXhBY6moa3xkQpAwPLZVXIzi1A0QWByXvW1xwi2rGbSb7gVNHkLqfn6GHf7/Lh7vM31kZGxfbYM9ED1EaM0MfPi4l/rf6cGsit4JV/PeqpcojhEMWLGDNq3Agln0cjHP8nIBz50WPIhwIGpFRJ5qTLlzBjrkEgLaSGhoYKCDjA80DIaCl7qBnQs+cAnAWhpVwZo6eAbTJ1qARYBCnMeDI7DqgHDohVNkQPtOSHICjXH2EPbL0IRIDbdRjK8hTw9V3blNMApM1LkYDKpxiI1hIxDy6kVq948u1CIOVZEI0PCHjM6y/lcHMvV3bccSfdF8FYiDBlmVfmCoK76Bzrl/MNop8pEOBZl0Pj2GgB31tbYSdVCWX5lh2aEgVUWQh4gkk9wS2P4j/eyjOwc+xONTszOH8++V0ByXrAU+D5Yidp3dcMKK7w/beE7BRYynCruQWX+GIrSGYPncfYedQd4AYZeS+Ix9FsAliwX2+4adTYfwQ+VxtG/V0TAQAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9FCHMu/+VgRCWZhGIAa4sJW6VGRdqa39vPSFFWKS3oIRAqqCKO9gEpdwhhRgDSjccxZoAzRNAKPSgHRGBmqP8XDwybwsOHa9UmcRwpnSBbU55aU3aC090gHlzYyd9c3hRillyEyJUK0SGLlNggpGCWCBSI5GWUF1bmpErUkRkBqUtUmpeq6ZHsIQAgjRtp5S0Ll6MUJ2zuD/BF6ilqrvFxzybhZ7JQl29epO60DheXmwWudbX3Dy9xI+T48kEA8M3qua7rd/wks3x0TUH9wKD9DYiXukSBe4JPCBg3j4+BdINSNekiwCBAg52SJgOUDAEAwxKBCWxo8ePIP9DwhtIUmQFigtTFnhIkqBJMyljfnlJs6bNm/Qwajz4hoNDiDRlMgpIMiPNLjEXwoCoD2e/lEO24VzSbuqHLlUJiVk34N5MiRjztaMjcEDWPHRS+irBUoBUnisXvu1KcOfGhQUxdL0Vwi6YtSL+tSDw0G8QwmYJESZ4loWBAQISg1ksoDEryJIPP6zMy/IjRo8jW6YcaS+YlV9rYW7clbMdgm9BEHYbAnJq2QPYPBxgJy8HjE/icmvaBgFjCrYpCIg4Qfij5bFxPUz98Mny3sx3iIYX0PWQ4xMeulhOJvk1A9VPRq7gEnk+I+S/ebFgWnl2CQjWz/CI/kCk9kvE9xIUAQCGd4AF0NGE3m3XnZSZVfpdEwEAIfkECQoAAAAsAAAAAEIAQgAABP8QyEmrvZQQzLv/laFZCGIRiAGuLCVuFXqmbQ2KNFWGpWr/ANGJ4JvIMghYRgnEvIoSQ7KyQzKD1Sbn6dJAj9Geq3TVhryxnCSLNSHV5gt3Iv0yUUwpXIsYlDV5RB0iX2xRgjUDBwJXc0B6UFgFZR8GB5eRL1p4PAV7K5aXeQaRNaRQep8soQelcWOeri2ssnGptbMCB26vIbGJBwOlYL0hpSKTGIqXBcVNKAXJGAiXi5TOWwjRqhUF1QK42EEE24gfBMu84hfkk+EX2u/OhOv1K8T2Zojf0vmz0NEkFNBVLZg6f3K0RVt4Z+A3hB0WejLHbsBBiF3kYdzIsaPHjyz/CBZcBJKCxJMiCwooOSHagAIvXzZjSbOmzZvitF3kyIkDuWUkS8JkCGVASgF+WEKL+dINwZcaMeoZegjnlqhWO5DDamuKqXQ8B1jUaMDhgQJczUgRO9YDgqfXEJYV28+Ct0U7O/60iMHbJyn5KIbhm0tA3jjohL0yoAtcPQN008YQQFnyKraWgzRGxQ0UnLmKbRCg7JiC0ZlA+qCOgtmG0dJGKMcFgQ52FKo10JWiPCADYQzomMDs7SszlcomBawWm3w15KSPKa8GIJsCZRdIj4cWN9D2aNvX6RhFJfawFsaMtFcI39Lw5O3OAlYwepD9GuUkzGNDf8W+ZvgefWeBEn8AGDUbQuhcRGAfxtnD3DoRAAAh+QQJCgAAACwAAAAAQgBCAAAE/xDISau9lBDMu/8VcRSWZhmEAa4shRxHuVVI2t6gAc+TSaE2nBAwGFgEoxBPApQNPbokpXAQKEMI1a/29FAPWokInFkCwwDgsnuCkSgwREY+QdF7NTTb8joskUY9SxpmBFl7EggDawCAGQd3FyhohoyTOANVen2MLXZ6BghcNwZIZBSZgUOGoJV6KwSmaAYFr54Gs6KHQ6VVnYhMrmxRAraIoaLGpEiRwEx5N5m1J83OTK92v1+Q1ry6vwAIpgLg3dS6yhPbA+nmdqJBHwaZ3OYchtA3BNP2GJf9AD0YCggMlwRTAwqUIygJXwE6BUzBEDCgGsMtoh4+NFOAXpWLHP8y1oh3YZ9FkGlIolzJsqXLlzgkwpgIcwKCAjhzPhSApCcMVTBvCtV4sqbRo0iTshFak1WHfQN6WgmaM5+EiFWqUFxIMJROnDN4UuSX1E5OMVyPGlSKaF+7bqHenogqoKi9fQ/lponIk+zFUAkVthPHc9FLwGA58K17FO9DDBH9PguoMuXjFgSi2u2SWTKvwnpx0MIZ2h/ogLQSlq5QauuW1axJpvac4/QUAW+GKGo2G3ZEwxl4ws5QZE3qzSU9R80NIHO5fUsUMX82/II4drcjFXGR8EdxgPMYoyKHCmhmoM1V9/s9iyIait6x1+mIXEjrNeKmw59SMUSR6l5UE1EjM9txN1049RUUlR771fFfUw1OEJUF38E0TzURJkLbUR31EwEAOwAAAAAAAAAAAA==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/loading_large.gif,importbuddy/images/loading_large.gif
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/pb-logo.png,importbuddy/images/pb-logo.png
iVBORw0KGgoAAAANSUhEUgAAAKwAAAAoCAYAAABjEBEWAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAH9RJREFUeNrsnXm0XVWV7n9zn3Pb9A0hoAQCSCMirU9AhaAloAZ4oghvqK8EQaseNlDPpkCKUrHBEsV6KCWW8pBGLSkQCRQgKJYEERRBAiIm0sSENKS5ubndueec9b0/1tp7r7XPubEZ441RjsFxXO/NcTermWuub37zm0uTxPafHrov4sMY+yAMBBj+N+Hv+KPyu+plUvV6AzYDVwL/kdwb/u7PGvxydG9O+fUnkGqYuW5v6vpJWiowK7/P22LW+RwpXCx47oMH8cLnL+NTH15+6IEYP0LML2a9q6mou7nIymulLuZUfE4Czsbs66VR+3szc0y0+8D1YNZGzhuT5UZnXRZHdSnFTShuMZQ/IjFWsMwbq16wgb8sgwU+hJgf/r0eaIBN5S2pZSKjhWG0leFUiya96guD1aBdweoYFyF9C2wsN74MR0s1vrpuKXI1qLUKAxUg6/SvkXNMXmXR36osGVUM/w957hc+/0UNVrjDw9Q9BxwCDIELM527NNFnLerWZktrpjY1d2o6GTPq47WFvVtqGWLc9SCy1LuagWRgl4POBub5H43lVw1mE1y29i3855ZXomwCpMSQOny8SqON/3dJpXEXr44MO/yXRUafGPELn78QD6sC4Y2AtoC14r23L5ukZuLRkcVcvfENPLB9f9ZPzp7vsPqs2vj6Q6etbP/1wtt51czHqVuT8XZv6fkEZoZgQ7B7jyHMwIm+rMmKscVcvubNyBooGNQU4KOrEbvCj1uJZ3O7NW+UZqX7LTyugWFIsMuXHimMtwA47T6OnP1LvrPfZ5hwPeE+mwIeGcCZoP3APpLClzQOMKC/NsnpT1zA/dsOQzaRhAN0iRxUwebxIjUz3/aA1as7UPnMcE313upDpwhNina5KFYxm3JE4vghRovWBXCuO/fgP8HDWniUXIZZHaklg7ocg1mDx8b24Mtr38wdW19Jsz2wB7XWl1HrKDN6NrsZK+/ecsRH7t56+N1HzVzB+190I0fMeByRMaEeDOXtrifdCp3ttSZfW/dGGu1ZyEY7cGaww7SjLvWKVW+sLjFhjK1j9IzS35Ki2LHNpOrUaFG3jAY1rAOjMw34BuhW4H9hHIx0L8a7kC4AezIJRsPvulq0VCt2L1OJvtTRl7DgSmxT7CR536zwBZEhusrmYQHRKzLoeDdTGqxWoVhivPm1zqWOomPDUhFTFJMpFc5Bf56Hpdz+w2zXJCbo4bOrT+P6DW+g0RqE2sQc6uN3SOxbjl/7EJeNL0Nact/QwQ8sH34Zr5/9Cy5YdC2L+jfScvVKKF+ur35r8MjInty6+UicjSaYVJGhuuqqjDqaT3InhyFEN+xbehVNwX0U66nW5JHt+3DGbz/MJxddxfzeYVouS/2q2YRgD+BasE1Iq8FuQRoBO6+YYVdGhP1Zg8vXn8wjw/sga5Tv9ZtO4kkVr9io/8XuEnvJslG4KXYm0WlV6sb9TGGsqrAxKjx0MHCbYjc072j8xlq+P3YSf+wnkxOS85MsvyL6sgYPDO/LVWveRsPVoDaGcKfKad8A/vy1zoHUb3CRsnGgxd3PH8PVG46j3xrhea64tvhbUDPHN9YfT6M5I6z88sfyVZj/7fx98ffxtUV78jYBFt/rVHqTyn1xf/LnG/6+luAHzx/DE+OLGMgm8P+LhYmyzIklkjZJ/EbSwRL7C90gGAIdLrnZvu0gueAt4eZNRzDpBiB8V7SJsn+SwFXaGcah+HfUHyrjlD/Lor5aNAaq9F0uf0bl+8pYWzQ+VmmHVa4r26VkJ4vnzP5kD5v7sMjSTY7nmzMRk0Ar380OVBKGlduMg92Lh2QTtJ3h7UZVpImZ6LUWvxpZzM2bXo2ycYTmAtMDCVvP17gTk6BNYCM5vIgCJRPME9QiZ7xZhkOu3DatRHBJ4BZhjioOc/nuhYNsgivXLeWgaatY0DPEqBvAeSpvAPgO2HzQJaC1YZe6FjhVcCPodcCPQNRMDGajfG/TMawc2QOXTTDFpjjgpDmY1QOUqgU2x/wGpXFgg2Csg1O21L8lW2/kvvOdxiXekkpAWsKG8Iy5Bj3FP43NDrWr7jm2kfB7AJhZ0osaAUZ3RJbuGMN2oG5hJrY2pyFZCb3gKdG1QQg25hu+JLa0pnehZQNUllGvNXl4ZE+arWlQGwdxNfBasBqiHgbJgEmwzcBTTnzfjG+AbQvP7RP8wMQeYZvZanA4sDUGg9U2F60JGMQUb3V5EFNOoGyS+7YewsmPfZqzd1nGKTstp4cWbb+lLAH+AXgn2LeBTaD3A8+CvQ3sMcNhBqPtPu7cchgffeo9TCoD2mHddAC/U8C+gugBapJyg41hyEbBY8DXge/l/c37GbmH0nFkZYBlmEcpca6nY3wiiOFt4DrBEWGYxsLfa4hgmSpjHj5vk3RZ7jwcfM7gc38+rRUjZkQNx1BzkH/beCzQLFohuAG40GBuAv79gF9WDHnW4IdbX8HD2/fkZYNPM+H6qjRXwC0OcPm2MDMEMNVAaQB4seDFiKOV8R7EqcAKg8y8h50Trq8F/qEjIrVuOC2ySlWCHJQuSrJxnhlfyIW/ez8/HjqQq/a5FGFuzPWuAg4CexHwoF9gzAA1geG+rDXWVxvj6g1v4LLVb2dTexpyhmWtpI1yrsCmgn6DWZq63f3AIqRFwBsxuxz4oEoOpoO/UBR4mqpMQ2Rw0T2mDvw6G2lOwMyDBrXi3ui9pvS9BgMGcygDxGnd3vlHY9gibAy3DmQNbnj+1Tw1ujsumyxCGNAaoTc7uV8JhQZqnYz3SVoWUDCizXhrOldvOJ6MdniuC1kxFyJHBUjm8ue3y/uFQ+MOjYa//X9MSNoX9H1Jc4SaQi0QTsLJtZD/m4JDS56JC9+7fJis6Fv6u/K9f/8krradu7YcwZm//TAPjyxmMBur1a19R3828SbQQ6DevmzyNb1Z61+nZWOTz07M4+PPvJuLn3lXgFgOspbvk+JnU/TThyehnT62GBNaLfS0Q5uKfljRy/cLneJ56LLdrrw/GvN0DPKRKd4l13W8wvftvJ2glvNg1V8rV8Asp+jZvo/Ohe/Dc13xzqLPfzIkyK23zdb2NK7eeDzC9SIWClZHK/Inkh0meEXwfo/4LdjbSIBJ87Dxxs2bjxo5a+dl7DPwHI2cLQhPyflRAg9a4KSSVzwFsxXArsBbgQ8BWWjqYuAciU9VGU4pISI6KKJ4u3SV77smoyuewOQN9webjuJHWw/jb3e9ceyMne8877HRPThi5q/dtFpj9/uH918+p759+bItR/KNdUvZ3pyLbAyyyZItsCLMRxH3SzUK93263uC80ORpwLHAZYIXRQmQs8BuLEmJHGZYB5la3f497Is4aJfiWUfBVzuL2AkCdIoGx/ujTnahmbAv0Vz9mRi2vCUzMdwaYH1jNtDqR7oLWGlwD/BTYCViC/CzqFEzgN0NXmFwNOJ14JZOtrJHh1sD5GsyYZ1dJdJPRlIgrTVYC6wV/BzRY8Z5BU4zlgg+UxBx+YAbMlm/0AxTMe4jEuMJIS5mk9ETnJt8do92F9anbmKxYBeDXkkTmG0jG9vcUm3z5Wve0rjh+WNYN7Fg1mEzH793Vm30nv8cPmjeQNbYMtKc3o8x3WqjCjzrENAyZIh98AY3ivQEMGxViUbZmAnBaKCHxiVuMFgkuDRCWgvl+dxpYbuWzzCyLcCUEgKL2fKBHBJtjKGSMCWGQ/ORFmM2ExiyCLLlLEzZ1iSdOGBiT2CBQUNi90rM4wwGBdPyu+b/04PtTR/5b1urxjnvnx7MCggaLL2ugrULVi9Ro41QG2mu4E1IbworcDOwBTHm9y71YTYHWABkkfSgHfyDx6wkgC1417BtxPitDNx7/HZSrPTrnfcy+SAtBKY7yZWewSGz7aC3G3wxgmqfBP7Z7wDK33UTjoPC68aBVwueKTyI00Iz+ztgqYO9kHqLHcC3c1i0NpvZh9dN7HQj1vzWQ8MHHIEyyCa3b29P2x9aZxhc7BwYtIBXCA4ALpb0cjPrCQ38PfAljC8m2LtYv8ryeCHClc8RcZjC8sm+SHBWFDP+T8Ft0fP6BHeb544BnpHTq3wgZzl7fZzEeZION7P5qLAQdc0wlk3dQ9KHgDfgn59VckB5MDaBZ5XuDfNhgrF5n3vgVZs/+srVFeL8vYJPBWMxwe31KHTE4Y217Qy5zJG1HgeO8RG/Q2bzQqBTEsIq8VTY7dagbAz1lDyeUyXRVVJUysosTbwfV0juVqy4ErQFzm+bikZTAgYUBYZmNk10pGnmAXPDK1tALYrYX2nGDQ7tZklORRTvM2Z6qkYLZZMAc80a+fMGQvA36MTcMDYjwFkGH3NS5imlIg29G/AFxO+BGxJWw0910y+ywnDqBqcl6Vq56wP1NDP3SOE5fZYyWgbMd9LcMFkjebbWG6s+4+B8i/oc0WBW1fG50rD+Cvi2KERUMbSxSjq5T2ZPGAwJ7RWum2vGUuCKSgLoVMn3J5A6d2YKLl0OWs6YVx/ijJ3voIfmuJrTjpOrn+2kMcI1LoxEbodSyQvJ2RVqDh4slz193Nzl7NXn8WthnLmhRkabcCApUogwLicoeSfPIkYlshw7U/64mCiO4ozifidaUT+aPnciwPZC3OLEbtG7tks8gPiFxFZXPgPJL6ToN86pJUE+VCHW7Edc6EQmTymtk1OBjJy/7xxXxlrxGOwncbLEWxEflLhX4uScWpW4Tdi14fp2+bwoPxBxq060ctklokU5N38vcX7IT+TPXuXET8B+7UTLuXLOinlyHADc6Bzzo7nbhlgueNCJoeR6s5r8LnZtDiWCLbwjNtY5l/xsfyeOiuKJtYhldeUo27sz12jX+dCLv8trZz3EvdtePvmd55d8fc3ErpPKmt9UZS8oYYwwZdf1ZRPnvGPXO3jt7Id41czHaKpO22UBypeQIMlMRdmOaOWOFRyvdLqZfSxWOgruSJieqoagIgahGz1UTcX63eJzwIIoELgdeB/wVPAO58YUnujGfeYRaHSNCh71McHfGKwAlkr6pgLHavAyOdVktK1k10A6ATihKpU0s0ngCw4uiKmr3G/n+gMXE/qBVnQF9hRgk2bsIQ8nSlGL+DvBv0iaENQwWw4cEc2Xwo70BYmZEf79DwfnUEKsDzjxz5YMuiH4NtKFXjEIcu7Q2Z+9f7+h84/8TXj4GwV90dTdMnT+kUN1KVBb0APOhDHS7OXAwac4fObjHDP7EU7/9UXXjLYHPoC1DysHpZwtk43g6hd9dNG3ee+LbqbZ7mei3Ruuc4D1FzkJI6FTYkFJKcTQ5wVbzewlBkfkeegAC1YJvmnQk0TUVZFIRBPE0X4H9+fvmwD2lDgxEoM8DzoTs/WRlY8XWiGVHepIpriUDAirarvgf5g3Wgy+ZfAx4KVhYdbNrCffhyuwoOhb3leJmhlLDN4q8e8xsRoLW6y6Mjs0FGrLcYYZA5RsyLclLovkAW1JzQqb0QD2NOm10RgPAe82WK/yRWMlzV9y8WasFNwr6djgWfqQTgM+MeszP60ZvM1SyHxdrof9DWb7IRZ5JsCNgzHhakxMzuCQwSe/9fYFd15x5dpTb1fWOixEJUmgJNe76tCZK55+504/OHKkOeOStqxeuhkz0AGhqyOSbcU5nMvCvepWwrJUIpUb+pFaL7PTJUaFBqqcSMx4qCKyQCn6SAII5xpm9leC3siD3QKsJzFQMkdnqU2sxS2eH23FoX+35cYabVTDUTPlnLAsH5NCpPM08AtJdYNdJA4QzDBUkzhScAPSW8BuqioaHVPXjFjJamUGRzlXZvkwvlsRuSF5ZB591ZB4q6An4g7vJBirmYcWZmTFArZojjy6uBY41lSE5ScDn5C0H3B45PFXGNyfq7UuR5wUorpDS+LRt6DtsvHF/WuukNywwurNA7TSG1ljl95N9FrzmFFXPzoV8UV/G19DbJeMR0b2DEGXOkC8RSMa+toU3Amch1iVB3pTKSdUgHSl2odONBMRJNozTrkLPaGq947IuTiNSxcdb5zqDX142HVqSDM/lqX6Ln+/K0nN7wPnmWW5890buErwmoK3Ni42dJNyam6KdHSsolA5jbMdLI4CSwl+r0rK1X+veCwNtHelZm5F7MxVRnMdgx4YgtuAzU7MC088ZOanl79U8EbJj00Y22u2fezVAqjvesLKH629/SX/3efAbVHJ7hePflLeG2aVhpTYSJjzHvE5Sb/tXN9uCOxGxKU91mLVxEJ+sOVwZJPpKi5/32SeQxwFVjn4IfCYxf3v7HxHBGtdvIxnmXz0HBHmNWAnpbn1Rsm7FwmOwRICxOR3SQnGcr/8mrDlD1dxpU1R7lO+U+BhQizgWQWcbfCIsP7w5UuctMDMmlMYalRhwmDUThcSQDPydjifL5/IF5YPBGXg2ZYIvxpm05JgGRr5DER9Gkh2vcxincNGM24H3hHV3p0pOKoUCNsQcH1c04WkZcCyQkmscittuhr3bDvQc+ylrqDsDCAa/GpkMRsas6+ZVR+9pqUszIIra1UKZyzaLqOpWpEK7KL0uQB4shokuSkExQUl1V3rqUoWabcQZMQQQkCr4pkGTSkkxnhFjg27alHjdI6o6m7NxRiyjMs6ajdj/Gp0ZqgM1ghGJfqVxx+ZTfeYwjr12OVYHSBP6Ie0KWaeMmxE01STNDPNTDHfSXtRKreCXE6TlabPyl8bBDM4OCTJKIbEbL5gnbjO8AxBeNY5Ac/nDbpr+4Wv2VAY7O9v23P/IN4oE8/BL3lk5p7fub75sViSV7FBTBmza9sZqDVe3Bb7eCqp8BPBOysDxibbtQf27v99+5R5P+aatSdCvZHOsx+TafyBtGls5MReyqkqcB+oBEAfQExPRDaeFl1XwbavTOCJsUDidYmoxLlYzh9nKbtiZaOzKLKjmtcqOFNBwpeXwnh/clIuRAmfrWrrOTN6cnBoUeo9EoWfb3mWyz8/A7YZrJfTblEAuT/S/ZG08GRgVlrhQBvYkC4ovToR2MPO5qulq+AwVpfdA/wO2CvsoP0WSf0kvlHdIr4Leln3OiQwtW/bf3D1UsmpEEdnVgQG/qEZu/VuYFo2dtpou/fSeMaUzlQD2BtpzQGDT5VUTN64aBtKvGqB6ypbfyxncwVJPRF3Q8aJJq510oiZvUNwbmL83g3UBL+uLIwTBW8HbpPTzmZ2uaSdunnVPA2jqRT6XYKfXJtQ1TREnin/fiekvS3L2nJuFvB6wz7mtRVFRvXHiImcsbISF78T6X6wTOJcM052aSezMF4rhN89wpR8BONBg2ecdBRwiXWWc9Wd9BPSws+jnXNnmNm/45MIXymSON0qFvzXk8B3Bed3SFHhaYN7KyUyqkM35UWR5Wg02jWfIsxy43CRWMXXgzWV4ZyaqTi6EkmJNlBzgqbqhTKo7LM6Un+KJsBytVDKyRYxYsiRPxkLlE0cKlghY1JoVsBvLZeXB/lPP/Dj4DF2DgPbY55K2YAx28nrJKc6YsR1q9StTI66lMBUhTgeLqocRuN0jLcgJ6E+7/ESHD8kuCC8+9HiXX7yTjKzYx0yjOlhXJwsxCOlOvB6X0RZvHNf4OeC55H3vC6lUZEYMOM+0ErgJSF4zHxAqE8azJaYnmMbM7MikLMU3gFX4VPv/UqKK7l+7ONLxtISGV/CFWWYrKzc8A2cOT0bQ2JDkoVSOVGSbe+zJoZmJJksl2REkEIK1Ly0MP/eiSzPPIWsj48InJL3xe8N39dUZrpqiEE5/RzsHqWZrQGJWWG0H3Di+9HzaohexLAcfx8yRGVbxM4SfX5e7da8ioXomqJf4W9XVrzEEbMpTJSL3h21sxZSY1Zk4crKk97QhqRtEk84sVTiNz7o5XsSTxXaIp9Vm4GYHrJmtzqxnPT9fRI/kvhmnBVD9CN2C+9cj/heWa3hqyAk2k7873jMwv0vVoBdEjeBjUfapiyeT+dg7B+XrJK436UZypav2qjWdEnPxlmnsrbLKxcnXe3lBww+M1Cvjdwp5y035h/Di686esavkHRQXh+UpmOLny1yGscppA6Llo8jjSv8DkR1lMKN9ZuKNZ6j+T3O/20ycw7eKenWgDfymq5xJ10jaSnS75zTOGjcSSOSnNeY6mrQO5zTKueiWjS0WtJpTvq6JFOu78zbJo3JufHwzNHQ+aZzbjy8d1xOzXwFRJrVMed8v0NfkNQK9zSQmkjtQmfq1JC0zjl3B9JZTjpC0n2Rt9km6WRJ98Z1WU4aQvqipFNBm1wYa+fcaNEf597rnD4r54aJ+uek+510gqS7cRoP7R2R5ML4LAO9WdKTLs8HO+Gk9ZL+BulC5ySV89sI70uEUZKurGRAl098fMkjXeSF7q2Y7YPYBdgVsRR4UxH/t+sL9u5f885zX3TD1y599t1nOxr/YlkzpOIycNMuP3LOz65bOuen+461ek5QTCQZqxBXAGvwp8o8A9potNnYnA25FhPOJAqOBM9ZFCnnlQ2JdlSaADu+zHipjdkQTlhmayWdaOLlGLuar0d5KoB7BJ83+Gqkg15Dkaiw6w1uBl6ONBsYxelRwRDS25JkhK968FgR+oOLcUEB9k2DZRETsZlKUgFxOqgvj5+BhuDWEM3X5IUyGWXdWkNOG81sOIdl1smYPGa+dOfQgCMbSL/FbK0/oon3IfrD2Dbx6im8FFAXYHwVaX+DXqH1mD0U+vQscHtwUM6sDFLldLNl3AUcImmueUnno5I2mVkvcGAEv7Z28hcQHFXJ8Dr9W1debvHJq7c9/f1FP49g650YS1Cpfxxv915yzsKbV9Rof+tfnzv5J5sa809CNr23Z+SepTvd/vN/3OPq2Vmm/9tSNqPSkIuBa9LiIW+KLWXFPiJvzBGOoyOvKSXKoTxcWxNH1w4V5Ls3cB418WgXtmGTg03J4XGKVFkwKrifKMgLbVng0iTBtvDHOutUmm0DtnUrqY6w+XOFQLDs24hgJFGJxenlkFTIFVzVujCVmtNfJAaQr87AhsR1GcSsCqyWtLpYDAWNx5AZQ1iXYNKP+ajBcipFqqBJwdOqptkq3LNDZ0XJmM15tq1L1WxaNQw8jbjbp8mKSoA54+3eO/924S0fPmnOfdctHz7wiol2H4fOXMkBg0+/ftLVP990tYMqZ3FtRdyczpYVRH8JGToPzwjZ3ySIKRXulqheqpmVSOZYUsqams+lwrUmyQaLkgO+IafHFifpd0mKOmEDrPOAispidNHJLcLKAsgpTlXJDxGpcLLF7DvSWNe60YFl2yvaC9Iz0qLqDak7X5wU4xrJWBUn0lTPOLBIbxHe2PsPP9xL0rFF/2FZ8+LXbdmBwSYtORg4Mj0EwlcWjLT7vjq/vu3jp82/52EzNRrq3W+s1btfdzLHZoSt8itdTrTwQZjzyYN8gKrqquL0EtHVSNMdpRwky7LkjK5ESxuF+ZZWIWDGuYE7fFDwpMFQqF59qcF7kF4VvfcZg8flSm66W6a4O7eaFkNalFyvKvqrxxHlQUN8KEgH11s9NqfKUGjqE3G6HXP0B+tYlC5+KxYXsejdcwheHLi7wSxJ6zHbHekK82X+hHLiL+7gXIKkRTNDGmxB14YKmmQLm+2+N3SXVEQKJk+XfcGMh6SypAbEuKtz0rz7+O7GY3m+OReyya6HfIr0nNcdjV+8vSkJ0buXcXejxYCDBX8dZXxHAr010CV58RFgJPcsU50kU1A4VctVWju1AxuIqD8lh/TkcCGm1GKNRUIBRkmWPKAtt/3uW3XV23ereStOcyHdEVSpik1Keh3Hy7jSjK1Csysjc2Xz069fsYOq2cJD1QRfkXhp5VCUHfyIzoNILBcPI9HnHNdK7BrTZo12nZcOPMtle/0fBrMxnLPkAAcXPb+oGSprbykZhOj6fFVTESzn3ystfiNQKjFdVqGTMomZcgy4+BqnpnNcIHFD9QAWt4OxKrZZRwdV59R5f6D3kme7gl0pV3Mi0IZ47KsUYASbjFI8TeeY5e+JgG2urHP5T0Rr5rqHrn135TUR+G2HZ86JKqmQuF9ecskOPWwYmDrS/h1XGMOIB4CjSQW1VX93n7zqZr9KHnIRsJBQh5Sv0+2tPpbMepjj5v6U7208DrLxjvSlxRqBzCqpWXVgU0WzU3E2hYyxCudid23wK+C3nn8sRRuICc9w8DOkr5jxi2T7m+LUTksloKVGVunWbF2qe+mADFFeTZVsUaW6N8lCdhGsmzrzRJ1HnEYpXqVJEJIMpXlvWjlczipxQUUGOm5m7ZDocaGubZmMC9ufOm7bHzTYXN8InIJX8+eGuxLxrlAxewD+xI43VZ6xBjgT465wMPJVwImhk+PAqRi/RHRMS1sZ07KJwptaJaIuj8q0JC1bzYR1QANjylQpSiLiZHAFlxl8OZSX7yRpELMGYoOMNYhWJBeMPExnHVqc+nV0OYA5ST2nxyaJ5JyP7p8oVR1XB+aH5riq5mJKVVh30U1FRJNcoagM3SoHwKVBmLAsbUu47ybgYUkzzWxYsLr9meNG/6gy7wqwXx3KMW7BC4ffiz+GCOBx4KYuBrsCuCv0ZVPQ1l4EnIUvlbit60wFi2rLKM/NcimNFKvDLPWSFu9jHdFal//vg2rwFVl8+5Lj47ubgXN8lhc+/78+E8ATf86N9S5q/dWBJRjvcv3mjn07kPEV2uSTwJeA4R1FlnlWzeXepDigLD0WM6ZEOg/g7X6kWnqgREUSWd2HX/j8xXzqRQSXGuF4h4Yw3/479+GVJShLZn+4U4fIFHuSysOPq1rQuETFUsUG6sIsyOefclrFIqybYM4/gq154fNf1GA7XFnC0Sk1TtktwE7h323QvZ0oKOVwu4Emi8ooVTHivIhXHQQmaY1LZPCqHtVtU+O0ylp54fMX9Pl/AwDswZE2eaIjrwAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/pb-logo.png,importbuddy/images/pb-logo.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/images/white-grad.png,importbuddy/images/white-grad.png
iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAACF0RVh0U29mdHdhcmUATWFjcm9tZWRpYSBGaXJld29ya3MgNC4w6iYndQAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMS8xNy8wONpsdXEAAAAlSURBVHicY/z///9/BjTAhC7AwMDAwIJFIXbBoaJ9qLhz+IUSAIMMOibeSzRBAAAAAElFTkSuQmCC
###PACKDATA,FILE_END,/_importbuddy/importbuddy/images/white-grad.png,importbuddy/images/white-grad.png
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/ejs.js,importbuddy/js/ejs.js
KGZ1bmN0aW9uKCl7CiAgICAKCnZhciByc3BsaXQgPSBmdW5jdGlvbihzdHJpbmcsIHJlZ2V4KSB7Cgl2YXIgcmVzdWx0ID0gcmVnZXguZXhlYyhzdHJpbmcpLHJldEFyciA9IG5ldyBBcnJheSgpLCBmaXJzdF9pZHgsIGxhc3RfaWR4LCBmaXJzdF9iaXQ7Cgl3aGlsZSAocmVzdWx0ICE9IG51bGwpCgl7CgkJZmlyc3RfaWR4ID0gcmVzdWx0LmluZGV4OyBsYXN0X2lkeCA9IHJlZ2V4Lmxhc3RJbmRleDsKCQlpZiAoKGZpcnN0X2lkeCkgIT0gMCkKCQl7CgkJCWZpcnN0X2JpdCA9IHN0cmluZy5zdWJzdHJpbmcoMCxmaXJzdF9pZHgpOwoJCQlyZXRBcnIucHVzaChzdHJpbmcuc3Vic3RyaW5nKDAsZmlyc3RfaWR4KSk7CgkJCXN0cmluZyA9IHN0cmluZy5zbGljZShmaXJzdF9pZHgpOwoJCX0JCQoJCXJldEFyci5wdXNoKHJlc3VsdFswXSk7CgkJc3RyaW5nID0gc3RyaW5nLnNsaWNlKHJlc3VsdFswXS5sZW5ndGgpOwoJCXJlc3VsdCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKTsJCgl9CglpZiAoISBzdHJpbmcgPT0gJycpCgl7CgkJcmV0QXJyLnB1c2goc3RyaW5nKTsKCX0KCXJldHVybiByZXRBcnI7Cn0sCmNob3AgPSAgZnVuY3Rpb24oc3RyaW5nKXsKICAgIHJldHVybiBzdHJpbmcuc3Vic3RyKDAsIHN0cmluZy5sZW5ndGggLSAxKTsKfSwKZXh0ZW5kID0gZnVuY3Rpb24oZCwgcyl7CiAgICBmb3IodmFyIG4gaW4gcyl7CiAgICAgICAgaWYocy5oYXNPd25Qcm9wZXJ0eShuKSkgIGRbbl0gPSBzW25dCiAgICB9Cn0KCgpFSlMgPSBmdW5jdGlvbiggb3B0aW9ucyApewoJb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09ICJzdHJpbmciID8ge3ZpZXc6IG9wdGlvbnN9IDogb3B0aW9ucwogICAgdGhpcy5zZXRfb3B0aW9ucyhvcHRpb25zKTsKCWlmKG9wdGlvbnMucHJlY29tcGlsZWQpewoJCXRoaXMudGVtcGxhdGUgPSB7fTsKCQl0aGlzLnRlbXBsYXRlLnByb2Nlc3MgPSBvcHRpb25zLnByZWNvbXBpbGVkOwoJCUVKUy51cGRhdGUodGhpcy5uYW1lLCB0aGlzKTsKCQlyZXR1cm47Cgl9CiAgICBpZihvcHRpb25zLmVsZW1lbnQpCgl7CgkJaWYodHlwZW9mIG9wdGlvbnMuZWxlbWVudCA9PSAnc3RyaW5nJyl7CgkJCXZhciBuYW1lID0gb3B0aW9ucy5lbGVtZW50CgkJCW9wdGlvbnMuZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAgb3B0aW9ucy5lbGVtZW50ICkKCQkJaWYob3B0aW9ucy5lbGVtZW50ID09IG51bGwpIHRocm93IG5hbWUrJ2RvZXMgbm90IGV4aXN0IScKCQl9CgkJaWYob3B0aW9ucy5lbGVtZW50LnZhbHVlKXsKCQkJdGhpcy50ZXh0ID0gb3B0aW9ucy5lbGVtZW50LnZhbHVlCgkJfWVsc2V7CgkJCXRoaXMudGV4dCA9IG9wdGlvbnMuZWxlbWVudC5pbm5lckhUTUwKCQl9CgkJdGhpcy5uYW1lID0gb3B0aW9ucy5lbGVtZW50LmlkCgkJdGhpcy50eXBlID0gJ1snCgl9ZWxzZSBpZihvcHRpb25zLnVybCl7CiAgICAgICAgb3B0aW9ucy51cmwgPSBFSlMuZW5kRXh0KG9wdGlvbnMudXJsLCB0aGlzLmV4dE1hdGNoKTsKCQl0aGlzLm5hbWUgPSB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiBvcHRpb25zLnVybDsKICAgICAgICB2YXIgdXJsID0gb3B0aW9ucy51cmwKICAgICAgICAvL29wdGlvbnMudmlldyA9IG9wdGlvbnMuYWJzb2x1dGVfdXJsIHx8IG9wdGlvbnMudmlldyB8fCBvcHRpb25zLjsKCQl2YXIgdGVtcGxhdGUgPSBFSlMuZ2V0KHRoaXMubmFtZSAvKnVybCovLCB0aGlzLmNhY2hlKTsKCQlpZiAodGVtcGxhdGUpIHJldHVybiB0ZW1wbGF0ZTsKCSAgICBpZiAodGVtcGxhdGUgPT0gRUpTLklOVkFMSURfUEFUSCkgcmV0dXJuIG51bGw7CiAgICAgICAgdHJ5ewogICAgICAgICAgICB0aGlzLnRleHQgPSBFSlMucmVxdWVzdCggdXJsKyh0aGlzLmNhY2hlID8gJycgOiAnPycrTWF0aC5yYW5kb20oKSApKTsKICAgICAgICB9Y2F0Y2goZSl7fQoKCQlpZih0aGlzLnRleHQgPT0gbnVsbCl7CiAgICAgICAgICAgIHRocm93KCB7dHlwZTogJ0VKUycsIG1lc3NhZ2U6ICdUaGVyZSBpcyBubyB0ZW1wbGF0ZSBhdCAnK3VybH0gICk7CgkJfQoJCS8vdGhpcy5uYW1lID0gdXJsOwoJfQoJdmFyIHRlbXBsYXRlID0gbmV3IEVKUy5Db21waWxlcih0aGlzLnRleHQsIHRoaXMudHlwZSk7CgoJdGVtcGxhdGUuY29tcGlsZShvcHRpb25zLCB0aGlzLm5hbWUpOwoKCQoJRUpTLnVwZGF0ZSh0aGlzLm5hbWUsIHRoaXMpOwoJdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwp9OwovKiBAUHJvdG90eXBlKi8KRUpTLnByb3RvdHlwZSA9IHsKCS8qKgoJICogUmVuZGVycyBhbiBvYmplY3Qgd2l0aCBleHRyYSB2aWV3IGhlbHBlcnMgYXR0YWNoZWQgdG8gdGhlIHZpZXcuCgkgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IGRhdGEgdG8gYmUgcmVuZGVyZWQKCSAqIEBwYXJhbSB7T2JqZWN0fSBleHRyYV9oZWxwZXJzIGFuIG9iamVjdCB3aXRoIGFkZGl0b25hbCB2aWV3IGhlbHBlcnMKCSAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzdHJpbmcKCSAqLwogICAgcmVuZGVyIDogZnVuY3Rpb24ob2JqZWN0LCBleHRyYV9oZWxwZXJzKXsKICAgICAgICBvYmplY3QgPSBvYmplY3QgfHwge307CiAgICAgICAgdGhpcy5fZXh0cmFfaGVscGVycyA9IGV4dHJhX2hlbHBlcnM7CgkJdmFyIHYgPSBuZXcgRUpTLkhlbHBlcnMob2JqZWN0LCBleHRyYV9oZWxwZXJzIHx8IHt9KTsKCQlyZXR1cm4gdGhpcy50ZW1wbGF0ZS5wcm9jZXNzLmNhbGwob2JqZWN0LCBvYmplY3Qsdik7Cgl9LAogICAgdXBkYXRlIDogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucyl7CiAgICAgICAgaWYodHlwZW9mIGVsZW1lbnQgPT0gJ3N0cmluZycpewoJCQllbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCkKCQl9CgkJaWYob3B0aW9ucyA9PSBudWxsKXsKCQkJX3RlbXBsYXRlID0gdGhpczsKCQkJcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCl7CgkJCQlFSlMucHJvdG90eXBlLnVwZGF0ZS5jYWxsKF90ZW1wbGF0ZSwgZWxlbWVudCwgb2JqZWN0KQoJCQl9CgkJfQoJCWlmKHR5cGVvZiBvcHRpb25zID09ICdzdHJpbmcnKXsKCQkJcGFyYW1zID0ge30KCQkJcGFyYW1zLnVybCA9IG9wdGlvbnMKCQkJX3RlbXBsYXRlID0gdGhpczsKCQkJcGFyYW1zLm9uQ29tcGxldGUgPSBmdW5jdGlvbihyZXF1ZXN0KXsKCQkJCXZhciBvYmplY3QgPSBldmFsKCByZXF1ZXN0LnJlc3BvbnNlVGV4dCApCgkJCQlFSlMucHJvdG90eXBlLnVwZGF0ZS5jYWxsKF90ZW1wbGF0ZSwgZWxlbWVudCwgb2JqZWN0KQoJCQl9CgkJCUVKUy5hamF4X3JlcXVlc3QocGFyYW1zKQoJCX1lbHNlCgkJewoJCQllbGVtZW50LmlubmVySFRNTCA9IHRoaXMucmVuZGVyKG9wdGlvbnMpCgkJfQogICAgfSwKCW91dCA6IGZ1bmN0aW9uKCl7CgkJcmV0dXJuIHRoaXMudGVtcGxhdGUub3V0OwoJfSwKICAgIC8qKgogICAgICogU2V0cyBvcHRpb25zIG9uIHRoaXMgdmlldyB0byBiZSByZW5kZXJlZCB3aXRoLgogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgICAqLwoJc2V0X29wdGlvbnMgOiBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGUgfHwgRUpTLnR5cGU7CgkJdGhpcy5jYWNoZSA9IG9wdGlvbnMuY2FjaGUgIT0gbnVsbCA/IG9wdGlvbnMuY2FjaGUgOiBFSlMuY2FjaGU7CgkJdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0IHx8IG51bGw7CgkJdGhpcy5uYW1lID0gIG9wdGlvbnMubmFtZSB8fCBudWxsOwoJCXRoaXMuZXh0ID0gb3B0aW9ucy5leHQgfHwgRUpTLmV4dDsKCQl0aGlzLmV4dE1hdGNoID0gbmV3IFJlZ0V4cCh0aGlzLmV4dC5yZXBsYWNlKC9cLi8sICdcLicpKTsKCX0KfTsKRUpTLmVuZEV4dCA9IGZ1bmN0aW9uKHBhdGgsIG1hdGNoKXsKCWlmKCFwYXRoKSByZXR1cm4gbnVsbDsKCW1hdGNoLmxhc3RJbmRleCA9IDAKCXJldHVybiBwYXRoKyAobWF0Y2gudGVzdChwYXRoKSA/ICcnIDogdGhpcy5leHQgKQp9CgoKCgovKiBAU3RhdGljKi8KRUpTLlNjYW5uZXIgPSBmdW5jdGlvbihzb3VyY2UsIGxlZnQsIHJpZ2h0KSB7CgkKICAgIGV4dGVuZCh0aGlzLAogICAgICAgIHtsZWZ0X2RlbGltaXRlcjogCWxlZnQgKyclJywKICAgICAgICAgcmlnaHRfZGVsaW1pdGVyOiAJJyUnK3JpZ2h0LAogICAgICAgICBkb3VibGVfbGVmdDogCQlsZWZ0KyclJScsCiAgICAgICAgIGRvdWJsZV9yaWdodDogIAknJSUnK3JpZ2h0LAogICAgICAgICBsZWZ0X2VxdWFsOiAJCWxlZnQrJyU9JywKICAgICAgICAgbGVmdF9jb21tZW50OiAJbGVmdCsnJSMnfSkKCgl0aGlzLlNwbGl0UmVnZXhwID0gbGVmdD09J1snID8gLyhcWyUlKXwoJSVcXSl8KFxbJT0pfChcWyUjKXwoXFslKXwoJVxdXG4pfCglXF0pfChcbikvIDogbmV3IFJlZ0V4cCgnKCcrdGhpcy5kb3VibGVfbGVmdCsnKXwoJSUnK3RoaXMuZG91YmxlX3JpZ2h0KycpfCgnK3RoaXMubGVmdF9lcXVhbCsnKXwoJyt0aGlzLmxlZnRfY29tbWVudCsnKXwoJyt0aGlzLmxlZnRfZGVsaW1pdGVyKycpfCgnK3RoaXMucmlnaHRfZGVsaW1pdGVyKydcbil8KCcrdGhpcy5yaWdodF9kZWxpbWl0ZXIrJyl8KFxuKScpIDsKCQoJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Cgl0aGlzLnN0YWcgPSBudWxsOwoJdGhpcy5saW5lcyA9IDA7Cn07CgpFSlMuU2Nhbm5lci50b190ZXh0ID0gZnVuY3Rpb24oaW5wdXQpewoJaWYoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKQogICAgICAgIHJldHVybiAnJzsKICAgIGlmKGlucHV0IGluc3RhbmNlb2YgRGF0ZSkKCQlyZXR1cm4gaW5wdXQudG9EYXRlU3RyaW5nKCk7CglpZihpbnB1dC50b1N0cmluZykgCiAgICAgICAgcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7CglyZXR1cm4gJyc7Cn07CgpFSlMuU2Nhbm5lci5wcm90b3R5cGUgPSB7CiAgc2NhbjogZnVuY3Rpb24oYmxvY2spIHsKICAgICBzY2FubGluZSA9IHRoaXMuc2NhbmxpbmU7CgkgcmVnZXggPSB0aGlzLlNwbGl0UmVnZXhwOwoJIGlmICghIHRoaXMuc291cmNlID09ICcnKQoJIHsKCSAJIHZhciBzb3VyY2Vfc3BsaXQgPSByc3BsaXQodGhpcy5zb3VyY2UsIC9cbi8pOwoJIAkgZm9yKHZhciBpPTA7IGk8c291cmNlX3NwbGl0Lmxlbmd0aDsgaSsrKSB7CgkJIAkgdmFyIGl0ZW0gPSBzb3VyY2Vfc3BsaXRbaV07CgkJCSB0aGlzLnNjYW5saW5lKGl0ZW0sIHJlZ2V4LCBibG9jayk7CgkJIH0KCSB9CiAgfSwKICBzY2FubGluZTogZnVuY3Rpb24obGluZSwgcmVnZXgsIGJsb2NrKSB7CgkgdGhpcy5saW5lcysrOwoJIHZhciBsaW5lX3NwbGl0ID0gcnNwbGl0KGxpbmUsIHJlZ2V4KTsKIAkgZm9yKHZhciBpPTA7IGk8bGluZV9zcGxpdC5sZW5ndGg7IGkrKykgewoJICAgdmFyIHRva2VuID0gbGluZV9zcGxpdFtpXTsKICAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7CgkJICAgCXRyeXsKCSAgICAgICAgIAlibG9jayh0b2tlbiwgdGhpcyk7CgkJIAl9Y2F0Y2goZSl7CgkJCQl0aHJvdyB7dHlwZTogJ0VKUy5TY2FubmVyJywgbGluZTogdGhpcy5saW5lc307CgkJCX0KICAgICAgIH0KCSB9CiAgfQp9OwoKCkVKUy5CdWZmZXIgPSBmdW5jdGlvbihwcmVfY21kLCBwb3N0X2NtZCkgewoJdGhpcy5saW5lID0gbmV3IEFycmF5KCk7Cgl0aGlzLnNjcmlwdCA9ICIiOwoJdGhpcy5wcmVfY21kID0gcHJlX2NtZDsKCXRoaXMucG9zdF9jbWQgPSBwb3N0X2NtZDsKCWZvciAodmFyIGk9MDsgaTx0aGlzLnByZV9jbWQubGVuZ3RoOyBpKyspCgl7CgkJdGhpcy5wdXNoKHByZV9jbWRbaV0pOwoJfQp9OwpFSlMuQnVmZmVyLnByb3RvdHlwZSA9IHsKCQogIHB1c2g6IGZ1bmN0aW9uKGNtZCkgewoJdGhpcy5saW5lLnB1c2goY21kKTsKICB9LAoKICBjcjogZnVuY3Rpb24oKSB7Cgl0aGlzLnNjcmlwdCA9IHRoaXMuc2NyaXB0ICsgdGhpcy5saW5lLmpvaW4oJzsgJyk7Cgl0aGlzLmxpbmUgPSBuZXcgQXJyYXkoKTsKCXRoaXMuc2NyaXB0ID0gdGhpcy5zY3JpcHQgKyAiXG4iOwogIH0sCgogIGNsb3NlOiBmdW5jdGlvbigpIHsKCWlmICh0aGlzLmxpbmUubGVuZ3RoID4gMCkKCXsKCQlmb3IgKHZhciBpPTA7IGk8dGhpcy5wb3N0X2NtZC5sZW5ndGg7IGkrKyl7CgkJCXRoaXMucHVzaChwcmVfY21kW2ldKTsKCQl9CgkJdGhpcy5zY3JpcHQgPSB0aGlzLnNjcmlwdCArIHRoaXMubGluZS5qb2luKCc7ICcpOwoJCWxpbmUgPSBudWxsOwoJfQogIH0KIAkKfTsKCgpFSlMuQ29tcGlsZXIgPSBmdW5jdGlvbihzb3VyY2UsIGxlZnQpIHsKICAgIHRoaXMucHJlX2NtZCA9IFsndmFyIF9fX1ZpZXdPID0gW107J107Cgl0aGlzLnBvc3RfY21kID0gbmV3IEFycmF5KCk7Cgl0aGlzLnNvdXJjZSA9ICcgJzsJCglpZiAoc291cmNlICE9IG51bGwpCgl7CgkJaWYgKHR5cGVvZiBzb3VyY2UgPT0gJ3N0cmluZycpCgkJewoJCSAgICBzb3VyY2UgPSBzb3VyY2UucmVwbGFjZSgvXHJcbi9nLCAiXG4iKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnJlcGxhY2UoL1xyL2csICAgIlxuIik7CgkJCXRoaXMuc291cmNlID0gc291cmNlOwoJCX1lbHNlIGlmIChzb3VyY2UuaW5uZXJIVE1MKXsKCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2UuaW5uZXJIVE1MOwoJCX0gCgkJaWYgKHR5cGVvZiB0aGlzLnNvdXJjZSAhPSAnc3RyaW5nJyl7CgkJCXRoaXMuc291cmNlID0gIiI7CgkJfQoJfQoJbGVmdCA9IGxlZnQgfHwgJzwnOwoJdmFyIHJpZ2h0ID0gJz4nOwoJc3dpdGNoKGxlZnQpIHsKCQljYXNlICdbJzoKCQkJcmlnaHQgPSAnXSc7CgkJCWJyZWFrOwoJCWNhc2UgJzwnOgoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQl0aHJvdyBsZWZ0KycgaXMgbm90IGEgc3VwcG9ydGVkIGRlbGltaW5hdG9yJzsKCQkJYnJlYWs7Cgl9Cgl0aGlzLnNjYW5uZXIgPSBuZXcgRUpTLlNjYW5uZXIodGhpcy5zb3VyY2UsIGxlZnQsIHJpZ2h0KTsKCXRoaXMub3V0ID0gJyc7Cn07CkVKUy5Db21waWxlci5wcm90b3R5cGUgPSB7CiAgY29tcGlsZTogZnVuY3Rpb24ob3B0aW9ucywgbmFtZSkgewogIAlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCXRoaXMub3V0ID0gJyc7Cgl2YXIgcHV0X2NtZCA9ICJfX19WaWV3Ty5wdXNoKCI7Cgl2YXIgaW5zZXJ0X2NtZCA9IHB1dF9jbWQ7Cgl2YXIgYnVmZiA9IG5ldyBFSlMuQnVmZmVyKHRoaXMucHJlX2NtZCwgdGhpcy5wb3N0X2NtZCk7CQkKCXZhciBjb250ZW50ID0gJyc7Cgl2YXIgY2xlYW4gPSBmdW5jdGlvbihjb250ZW50KQoJewoJICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xcL2csICdcXFxcJyk7CiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXG4vZywgJ1xcbicpOwogICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoLyIvZywgICdcXCInKTsKICAgICAgICByZXR1cm4gY29udGVudDsKCX07Cgl0aGlzLnNjYW5uZXIuc2NhbihmdW5jdGlvbih0b2tlbiwgc2Nhbm5lcikgewoJCWlmIChzY2FubmVyLnN0YWcgPT0gbnVsbCkKCQl7CgkJCXN3aXRjaCh0b2tlbikgewoJCQkJY2FzZSAnXG4nOgoJCQkJCWNvbnRlbnQgPSBjb250ZW50ICsgIlxuIjsKCQkJCQlidWZmLnB1c2gocHV0X2NtZCArICciJyArIGNsZWFuKGNvbnRlbnQpICsgJyIpOycpOwoJCQkJCWJ1ZmYuY3IoKTsKCQkJCQljb250ZW50ID0gJyc7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNjYW5uZXIubGVmdF9kZWxpbWl0ZXI6CgkJCQljYXNlIHNjYW5uZXIubGVmdF9lcXVhbDoKCQkJCWNhc2Ugc2Nhbm5lci5sZWZ0X2NvbW1lbnQ6CgkJCQkJc2Nhbm5lci5zdGFnID0gdG9rZW47CgkJCQkJaWYgKGNvbnRlbnQubGVuZ3RoID4gMCkKCQkJCQl7CgkJCQkJCWJ1ZmYucHVzaChwdXRfY21kICsgJyInICsgY2xlYW4oY29udGVudCkgKyAnIiknKTsKCQkJCQl9CgkJCQkJY29udGVudCA9ICcnOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzY2FubmVyLmRvdWJsZV9sZWZ0OgoJCQkJCWNvbnRlbnQgPSBjb250ZW50ICsgc2Nhbm5lci5sZWZ0X2RlbGltaXRlcjsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJY29udGVudCA9IGNvbnRlbnQgKyB0b2tlbjsKCQkJCQlicmVhazsKCQkJfQoJCX0KCQllbHNlIHsKCQkJc3dpdGNoKHRva2VuKSB7CgkJCQljYXNlIHNjYW5uZXIucmlnaHRfZGVsaW1pdGVyOgoJCQkJCXN3aXRjaChzY2FubmVyLnN0YWcpIHsKCQkJCQkJY2FzZSBzY2FubmVyLmxlZnRfZGVsaW1pdGVyOgoJCQkJCQkJaWYgKGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXSA9PSAnXG4nKQoJCQkJCQkJewoJCQkJCQkJCWNvbnRlbnQgPSBjaG9wKGNvbnRlbnQpOwoJCQkJCQkJCWJ1ZmYucHVzaChjb250ZW50KTsKCQkJCQkJCQlidWZmLmNyKCk7CgkJCQkJCQl9CgkJCQkJCQllbHNlIHsKCQkJCQkJCQlidWZmLnB1c2goY29udGVudCk7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSBzY2FubmVyLmxlZnRfZXF1YWw6CgkJCQkJCQlidWZmLnB1c2goaW5zZXJ0X2NtZCArICIoRUpTLlNjYW5uZXIudG9fdGV4dCgiICsgY29udGVudCArICIpKSkiKTsKCQkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQlzY2FubmVyLnN0YWcgPSBudWxsOwoJCQkJCWNvbnRlbnQgPSAnJzsKCQkJCQlicmVhazsKCQkJCWNhc2Ugc2Nhbm5lci5kb3VibGVfcmlnaHQ6CgkJCQkJY29udGVudCA9IGNvbnRlbnQgKyBzY2FubmVyLnJpZ2h0X2RlbGltaXRlcjsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJY29udGVudCA9IGNvbnRlbnQgKyB0b2tlbjsKCQkJCQlicmVhazsKCQkJfQoJCX0KCX0pOwoJaWYgKGNvbnRlbnQubGVuZ3RoID4gMCkKCXsKCQkvLyBDaG91bGQgYmUgY29udGVudC5kdW1wIGluIFJ1YnkKCQlidWZmLnB1c2gocHV0X2NtZCArICciJyArIGNsZWFuKGNvbnRlbnQpICsgJyIpJyk7Cgl9CglidWZmLmNsb3NlKCk7Cgl0aGlzLm91dCA9IGJ1ZmYuc2NyaXB0ICsgIjsiOwoJdmFyIHRvX2JlX2V2YWxlZCA9ICcvKicrbmFtZSsnKi90aGlzLnByb2Nlc3MgPSBmdW5jdGlvbihfQ09OVEVYVCxfVklFVykgeyB0cnkgeyB3aXRoKF9WSUVXKSB7IHdpdGggKF9DT05URVhUKSB7Jyt0aGlzLm91dCsiIHJldHVybiBfX19WaWV3Ty5qb2luKCcnKTt9fX1jYXRjaChlKXtlLmxpbmVOdW1iZXI9bnVsbDt0aHJvdyBlO319OyI7CgkKCXRyeXsKCQlldmFsKHRvX2JlX2V2YWxlZCk7Cgl9Y2F0Y2goZSl7CgkJaWYodHlwZW9mIEpTTElOVCAhPSAndW5kZWZpbmVkJyl7CgkJCUpTTElOVCh0aGlzLm91dCk7CgkJCWZvcih2YXIgaSA9IDA7IGkgPCBKU0xJTlQuZXJyb3JzLmxlbmd0aDsgaSsrKXsKCQkJCXZhciBlcnJvciA9IEpTTElOVC5lcnJvcnNbaV07CgkJCQlpZihlcnJvci5yZWFzb24gIT0gIlVubmVjZXNzYXJ5IHNlbWljb2xvbi4iKXsKCQkJCQllcnJvci5saW5lKys7CgkJCQkJdmFyIGUgPSBuZXcgRXJyb3IoKTsKCQkJCQllLmxpbmVOdW1iZXIgPSBlcnJvci5saW5lOwoJCQkJCWUubWVzc2FnZSA9IGVycm9yLnJlYXNvbjsKCQkJCQlpZihvcHRpb25zLnZpZXcpCgkJCQkJCWUuZmlsZU5hbWUgPSBvcHRpb25zLnZpZXc7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCQkJfQoJCX1lbHNlewoJCQl0aHJvdyBlOwoJCX0KCX0KICB9Cn07CgoKLy90eXBlLCBjYWNoZSwgZm9sZGVyCi8qKgogKiBTZXRzIGRlZmF1bHQgb3B0aW9ucyBmb3IgYWxsIHZpZXdzCiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFNldCB2aWV3IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zCiAqIDx0YWJsZSBjbGFzcz0ib3B0aW9ucyI+CgkJCQk8dGJvZHk+PHRyPjx0aD5PcHRpb248L3RoPjx0aD5EZWZhdWx0PC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+CgkJCQk8dHI+CgkJCQkJPHRkPnR5cGU8L3RkPgoJCQkJCTx0ZD4nPCc8L3RkPgoJCQkJCTx0ZD50eXBlIG9mIG1hZ2ljIHRhZ3MuICBPcHRpb25zIGFyZSAnJmx0Oycgb3IgJ1snCgkJCQkJPC90ZD4KCQkJCTwvdHI+CgkJCQk8dHI+CgkJCQkJPHRkPmNhY2hlPC90ZD4KCQkJCQk8dGQ+dHJ1ZSBpbiBwcm9kdWN0aW9uIG1vZGUsIGZhbHNlIGluIG90aGVyIG1vZGVzPC90ZD4KCQkJCQk8dGQ+dHJ1ZSB0byBjYWNoZSB0ZW1wbGF0ZS4KCQkJCQk8L3RkPgoJCQkJPC90cj4KCTwvdGJvZHk+PC90YWJsZT4KICogCiAqLwpFSlMuY29uZmlnID0gZnVuY3Rpb24ob3B0aW9ucyl7CglFSlMuY2FjaGUgPSBvcHRpb25zLmNhY2hlICE9IG51bGwgPyBvcHRpb25zLmNhY2hlIDogRUpTLmNhY2hlOwoJRUpTLnR5cGUgPSBvcHRpb25zLnR5cGUgIT0gbnVsbCA/IG9wdGlvbnMudHlwZSA6IEVKUy50eXBlOwoJRUpTLmV4dCA9IG9wdGlvbnMuZXh0ICE9IG51bGwgPyBvcHRpb25zLmV4dCA6IEVKUy5leHQ7CgkKCXZhciB0ZW1wbGF0ZXNfZGlyZWN0b3J5ID0gRUpTLnRlbXBsYXRlc19kaXJlY3RvcnkgfHwge307IC8vbmljZSBhbmQgcHJpdmF0ZSBjb250YWluZXIKCUVKUy50ZW1wbGF0ZXNfZGlyZWN0b3J5ID0gdGVtcGxhdGVzX2RpcmVjdG9yeTsKCUVKUy5nZXQgPSBmdW5jdGlvbihwYXRoLCBjYWNoZSl7CgkJaWYoY2FjaGUgPT0gZmFsc2UpIHJldHVybiBudWxsOwoJCWlmKHRlbXBsYXRlc19kaXJlY3RvcnlbcGF0aF0pIHJldHVybiB0ZW1wbGF0ZXNfZGlyZWN0b3J5W3BhdGhdOwogIAkJcmV0dXJuIG51bGw7Cgl9OwoJCglFSlMudXBkYXRlID0gZnVuY3Rpb24ocGF0aCwgdGVtcGxhdGUpIHsgCgkJaWYocGF0aCA9PSBudWxsKSByZXR1cm47CgkJdGVtcGxhdGVzX2RpcmVjdG9yeVtwYXRoXSA9IHRlbXBsYXRlIDsKCX07CgkKCUVKUy5JTlZBTElEX1BBVEggPSAgLTE7Cn07CkVKUy5jb25maWcoIHtjYWNoZTogdHJ1ZSwgdHlwZTogJzwnLCBleHQ6ICcuZWpzJyB9ICk7CgoKCi8qKgogKiBAY29uc3RydWN0b3IKICogQnkgYWRkaW5nIGZ1bmN0aW9ucyB0byBFSlMuSGVscGVycy5wcm90b3R5cGUsIHRob3NlIGZ1bmN0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgCiAqIHZpZXdzLgogKiBAaW5pdCBDcmVhdGVzIGEgdmlldyBoZWxwZXIuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnRlcm5hbGx5LiAgWW91IHNob3VsZCBuZXZlciBjYWxsIGl0LgogKiBAcGFyYW0ge09iamVjdH0gZGF0YSBUaGUgZGF0YSBwYXNzZWQgdG8gdGhlIHZpZXcuICBIZWxwZXJzIGhhdmUgYWNjZXNzIHRvIGl0IHRocm91Z2ggdGhpcy5fZGF0YQogKi8KRUpTLkhlbHBlcnMgPSBmdW5jdGlvbihkYXRhLCBleHRyYXMpewoJdGhpcy5fZGF0YSA9IGRhdGE7CiAgICB0aGlzLl9leHRyYXMgPSBleHRyYXM7CiAgICBleHRlbmQodGhpcywgZXh0cmFzICk7Cn07Ci8qIEBwcm90b3R5cGUqLwpFSlMuSGVscGVycy5wcm90b3R5cGUgPSB7CiAgICAvKioKICAgICAqIFJlbmRlcnMgYSBuZXcgdmlldy4gIElmIGRhdGEgaXMgcGFzc2VkIGluLCB1c2VzIHRoYXQgdG8gcmVuZGVyIHRoZSB2aWV3LgogICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgc3RhbmRhcmQgb3B0aW9ucyBwYXNzZWQgdG8gYSBuZXcgdmlldy4KICAgICAqIEBwYXJhbSB7b3B0aW9uYWw6T2JqZWN0fSBkYXRhCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9CiAgICAgKi8KCXZpZXc6IGZ1bmN0aW9uKG9wdGlvbnMsIGRhdGEsIGhlbHBlcnMpewogICAgICAgIGlmKCFoZWxwZXJzKSBoZWxwZXJzID0gdGhpcy5fZXh0cmFzCgkJaWYoIWRhdGEpIGRhdGEgPSB0aGlzLl9kYXRhOwoJCXJldHVybiBuZXcgRUpTKG9wdGlvbnMpLnJlbmRlcihkYXRhLCBoZWxwZXJzKTsKCX0sCiAgICAvKioKICAgICAqIEZvciBhIGdpdmVuIHZhbHVlLCB0cmllcyB0byBjcmVhdGUgYSBodW1hbiByZXByZXNlbnRhdGlvbi4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dCB0aGUgdmFsdWUgYmVpbmcgY29udmVydGVkLgogICAgICogQHBhcmFtIHtPYmplY3R9IG51bGxfdGV4dCB3aGF0IHRleHQgc2hvdWxkIGJlIHByZXNlbnQgaWYgaW5wdXQgPT0gbnVsbCBvciB1bmRlZmluZWQsIGRlZmF1bHRzIHRvICcnCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IAogICAgICovCgl0b190ZXh0OiBmdW5jdGlvbihpbnB1dCwgbnVsbF90ZXh0KSB7CgkgICAgaWYoaW5wdXQgPT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbF90ZXh0IHx8ICcnOwoJICAgIGlmKGlucHV0IGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGlucHV0LnRvRGF0ZVN0cmluZygpOwoJCWlmKGlucHV0LnRvU3RyaW5nKSByZXR1cm4gaW5wdXQudG9TdHJpbmcoKS5yZXBsYWNlKC9cbi9nLCAnPGJyIC8+JykucmVwbGFjZSgvJycvZywgIiciKTsKCQlyZXR1cm4gJyc7Cgl9Cn07CiAgICBFSlMubmV3UmVxdWVzdCA9IGZ1bmN0aW9uKCl7CgkgICB2YXIgZmFjdG9yaWVzID0gW2Z1bmN0aW9uKCkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7IH0sZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgfSxmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOyB9XTsKCSAgIGZvcih2YXIgaSA9IDA7IGkgPCBmYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdHJ5IHsKCSAgICAgICAgICAgIHZhciByZXF1ZXN0ID0gZmFjdG9yaWVzW2ldKCk7CgkgICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSAgcmV0dXJuIHJlcXVlc3Q7CgkgICAgICAgIH0KCSAgICAgICAgY2F0Y2goZSkgeyBjb250aW51ZTt9CgkgICB9Cgl9CgkKCUVKUy5yZXF1ZXN0ID0gZnVuY3Rpb24ocGF0aCl7CgkgICB2YXIgcmVxdWVzdCA9IG5ldyBFSlMubmV3UmVxdWVzdCgpCgkgICByZXF1ZXN0Lm9wZW4oIkdFVCIsIHBhdGgsIGZhbHNlKTsKCSAgIAoJICAgdHJ5e3JlcXVlc3Quc2VuZChudWxsKTt9CgkgICBjYXRjaChlKXtyZXR1cm4gbnVsbDt9CgkgICAKCSAgIGlmICggcmVxdWVzdC5zdGF0dXMgPT0gNDA0IHx8IHJlcXVlc3Quc3RhdHVzID09IDIgfHwocmVxdWVzdC5zdGF0dXMgPT0gMCAmJiByZXF1ZXN0LnJlc3BvbnNlVGV4dCA9PSAnJykgKSByZXR1cm4gbnVsbDsKCSAgIAoJICAgcmV0dXJuIHJlcXVlc3QucmVzcG9uc2VUZXh0Cgl9CglFSlMuYWpheF9yZXF1ZXN0ID0gZnVuY3Rpb24ocGFyYW1zKXsKCQlwYXJhbXMubWV0aG9kID0gKCBwYXJhbXMubWV0aG9kID8gcGFyYW1zLm1ldGhvZCA6ICdHRVQnKQoJCQoJCXZhciByZXF1ZXN0ID0gbmV3IEVKUy5uZXdSZXF1ZXN0KCk7CgkJcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpewoJCQlpZihyZXF1ZXN0LnJlYWR5U3RhdGUgPT0gNCl7CgkJCQlpZihyZXF1ZXN0LnN0YXR1cyA9PSAyMDApewoJCQkJCXBhcmFtcy5vbkNvbXBsZXRlKHJlcXVlc3QpCgkJCQl9ZWxzZQoJCQkJewoJCQkJCXBhcmFtcy5vbkNvbXBsZXRlKHJlcXVlc3QpCgkJCQl9CgkJCX0KCQl9CgkJcmVxdWVzdC5vcGVuKHBhcmFtcy5tZXRob2QsIHBhcmFtcy51cmwpCgkJcmVxdWVzdC5zZW5kKG51bGwpCgl9CgoKfSkoKTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/ejs.js,importbuddy/js/ejs.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/importbuddy.js,importbuddy/js/importbuddy.js
alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCWpRdWVyeSh3aW5kb3cpLmxvYWQoZnVuY3Rpb24oKXsKCQlpZiAoIGpRdWVyeSgnI3BiX2ltcG9ydGJ1ZGR5X3dvcmtpbmcnKS5pcygnOnZpc2libGUnKSApIHsKCQkJalF1ZXJ5KCcjcGJfaW1wb3J0YnVkZHlfd29ya2luZycpLnJlcGxhY2VXaXRoKAoJCQkJalF1ZXJ5KCcjcGJfaW1wb3J0YnVkZHlfYmxhbmthbGVydCcpLmh0bWwoKS5yZXBsYWNlKCAnI1RJVExFIycsICdQSFAgVGltZW91dCBvciBGYXRhbCBFcnJvciBPY2N1cnJlZCcgKS5yZXBsYWNlKCAnI01FU1NBR0UjJywgJ1RoZSBwYWdlIGRpZCBub3QgZmluaXNoIGxvYWRpbmcgYXMgZXhwZWN0ZWQuICBUaGUgbW9zdCBjb21tb24gY2F1c2UgZm9yIHRoaXMgaXMgdGhlIFBIUCBwcm9jZXNzIHRha2luZyBtb3JlIHRpbWUgdGhhbiBpdCBoYXMgYmVlbiBhbGxvd2VkIGJ5IHlvdXIgaG9zdCAocGhwLmluaSBzZXR0aW5nIDxpPm1heF9leGVjdXRpb25fdGltZTwvaT4pLiBJZiBhIFBIUCBlcnJvciBpcyBkaXNwbGF5ZWQgYWJvdmUgdGhpcyBjYW4gYWxzbyBjYXVzZSB0aGlzIGVycm9yLicgKQoJCQkpOwoJCX0KCX0pOwp9KTsKCmZ1bmN0aW9uIGxvYWRUb29sdGlwcygpIHsKCWpRdWVyeSgnLnBsdWdpbmJ1ZGR5X3RpcCcpLnRvb2x0aXAoewoJCXRyYWNrOiB0cnVlLAoJCWRlbGF5OiAwLAoJCXNob3dVUkw6IGZhbHNlLAoJCXNob3dCb2R5OiAiIC0gIiwKCQlmYWRlOiAyNTAKCX0pOwp9CgpqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJbG9hZFRvb2x0aXBzKCk7CgkKCWpRdWVyeSgnLnRvZ2dsZScpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKCQlqUXVlcnkoICcjdG9nZ2xlLScgKyBqUXVlcnkodGhpcykuYXR0cignaWQnKSApLnNsaWRlVG9nZ2xlKCk7Cgl9KTsKCQoJalF1ZXJ5KCcub3B0aW9uX3RvZ2dsZScpLmNoYW5nZShmdW5jdGlvbihlKSB7CgkJaWYgKGpRdWVyeSh0aGlzKS5hdHRyKCdjaGVja2VkJykpIHsKCQkJalF1ZXJ5KCcuJyArIGpRdWVyeSh0aGlzKS5hdHRyKCdpZCcpICsgJ190b2dnbGUnICkuc2xpZGVUb2dnbGUoKTsKCQl9IGVsc2UgewoJCQlqUXVlcnkoJy4nICsgalF1ZXJ5KHRoaXMpLmF0dHIoJ2lkJykgKyAnX3RvZ2dsZScgKS5zbGlkZVRvZ2dsZSgpOwoJCX0KCX0pOwoJCgkKCWpRdWVyeSgnI3BsdWdpbmJ1ZGR5LXRhYnMnKS50YWJzKCk7Cn0pOw==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/importbuddy.js,importbuddy/js/importbuddy.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/jquery.js,importbuddy/js/jquery.js
LyohIGpRdWVyeSB2MS4xMS4wIHwgKGMpIDIwMDUsIDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPSIiLnRyaW0sbD17fSxtPSIxLjExLjAiLG49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IG4uZm4uaW5pdChhLGIpfSxvPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxwPS9eLW1zLS8scT0vLShbXGRhLXpdKS9naSxyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIudG9VcHBlckNhc2UoKX07bi5mbj1uLnByb3RvdHlwZT17anF1ZXJ5Om0sY29uc3RydWN0b3I6bixzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGQuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hPzA+YT90aGlzW2ErdGhpcy5sZW5ndGhdOnRoaXNbYV06ZC5jYWxsKHRoaXMpfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSl7dmFyIGI9bi5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksYSk7cmV0dXJuIGIucHJldk9iamVjdD10aGlzLGIuY29udGV4dD10aGlzLmNvbnRleHQsYn0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBuLmVhY2godGhpcyxhLGIpfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4ubWFwKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5jYWxsKGIsYyxiKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmxlbmd0aCxjPSthKygwPmE/YjowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYz49MCYmYj5jP1t0aGlzW2NdXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LG4uZXh0ZW5kPW4uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxuLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW2hdKSlmb3IoZCBpbiBlKWE9Z1tkXSxjPWVbZF0sZyE9PWMmJihqJiZjJiYobi5pc1BsYWluT2JqZWN0KGMpfHwoYj1uLmlzQXJyYXkoYykpKT8oYj8oYj0hMSxmPWEmJm4uaXNBcnJheShhKT9hOltdKTpmPWEmJm4uaXNQbGFpbk9iamVjdChhKT9hOnt9LGdbZF09bi5leHRlbmQoaixmLGMpKTp2b2lkIDAhPT1jJiYoZ1tkXT1jKSk7cmV0dXJuIGd9LG4uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhtK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PT1uLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuImFycmF5Ij09PW4udHlwZShhKX0saXNXaW5kb3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEmJmE9PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEtcGFyc2VGbG9hdChhKT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW4udHlwZShhKXx8YS5ub2RlVHlwZXx8bi5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYobC5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZuLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cyhhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTprJiYhay5jYWxsKCJcdWZlZmZceGEwIik/ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6ay5jYWxsKGEpfTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXMoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9Ziksbi5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omx9KSxuLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHMoYSl7dmFyIGI9YS5sZW5ndGgsYz1uLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzPSJzaXp6bGUiKy1uZXcgRGF0ZSx0PWEuZG9jdW1lbnQsdT0wLHY9MCx3PWViKCkseD1lYigpLHk9ZWIoKSx6PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT1iJiYoaj0hMCksMH0sQT0idW5kZWZpbmVkIixCPTE8PDMxLEM9e30uaGFzT3duUHJvcGVydHksRD1bXSxFPUQucG9wLEY9RC5wdXNoLEc9RC5wdXNoLEg9RC5zbGljZSxJPUQuaW5kZXhPZnx8ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz10aGlzLmxlbmd0aDtjPmI7YisrKWlmKHRoaXNbYl09PT1hKXJldHVybiBiO3JldHVybi0xfSxKPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsSz0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTD0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE09TC5yZXBsYWNlKCJ3IiwidyMiKSxOPSJcXFsiK0srIiooIitMKyIpIitLKyIqKD86KFsqXiR8IX5dPz0pIitLKyIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIitNKyIpfCl8KSIrSysiKlxcXSIsTz0iOigiK0wrIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiK04ucmVwbGFjZSgzLDgpKyIpKil8LiopXFwpfCkiLFA9bmV3IFJlZ0V4cCgiXiIrSysiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitLKyIrJCIsImciKSxRPW5ldyBSZWdFeHAoIl4iK0srIiosIitLKyIqIiksUj1uZXcgUmVnRXhwKCJeIitLKyIqKFs+K35dfCIrSysiKSIrSysiKiIpLFM9bmV3IFJlZ0V4cCgiPSIrSysiKihbXlxcXSdcIl0qPykiK0srIipcXF0iLCJnIiksVD1uZXcgUmVnRXhwKE8pLFU9bmV3IFJlZ0V4cCgiXiIrTSsiJCIpLFY9e0lEOm5ldyBSZWdFeHAoIl4jKCIrTCsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitMKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitMLnJlcGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpuZXcgUmVnRXhwKCJeIitOKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrTyksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitLKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitLKyIqKD86KFsrLV18KSIrSysiKihcXGQrKXwpKSIrSysiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrSisiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK0srIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrSysiKigoPzotXFxkKT9cXGQqKSIrSysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sVz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFg9L15oXGQkL2ksWT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLCQ9L1srfl0vLF89Lyd8XFwvZyxhYj1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0srIj98KCIrSysiKXwuKSIsImlnIiksYmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9O3RyeXtHLmFwcGx5KEQ9SC5jYWxsKHQuY2hpbGROb2RlcyksdC5jaGlsZE5vZGVzKSxEW3QuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGNiKXtHPXthcHBseTpELmxlbmd0aD9mdW5jdGlvbihhLGIpe0YuYXBwbHkoYSxILmNhbGwoYikpfTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGQ9MDt3aGlsZShhW2MrK109YltkKytdKTthLmxlbmd0aD1jLTF9fX1mdW5jdGlvbiBkYihhLGIsZCxlKXt2YXIgZixnLGgsaSxqLG0scCxxLHUsdjtpZigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dCkhPT1sJiZrKGIpLGI9Ynx8bCxkPWR8fFtdLCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGQ7aWYoMSE9PShpPWIubm9kZVR5cGUpJiY5IT09aSlyZXR1cm5bXTtpZihuJiYhZSl7aWYoZj1aLmV4ZWMoYSkpaWYoaD1mWzFdKXtpZig5PT09aSl7aWYoZz1iLmdldEVsZW1lbnRCeUlkKGgpLCFnfHwhZy5wYXJlbnROb2RlKXJldHVybiBkO2lmKGcuaWQ9PT1oKXJldHVybiBkLnB1c2goZyksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGc9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGgpKSYmcihiLGcpJiZnLmlkPT09aClyZXR1cm4gZC5wdXNoKGcpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBHLmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaD1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEcuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaCkpLGR9aWYoYy5xc2EmJighb3x8IW8udGVzdChhKSkpe2lmKHE9cD1zLHU9Yix2PTk9PT1pJiZhLDE9PT1pJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bT1vYihhKSwocD1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cT1wLnJlcGxhY2UoXywiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscSkscT0iW2lkPSciK3ErIiddICIsaj1tLmxlbmd0aDt3aGlsZShqLS0pbVtqXT1xK3BiKG1bal0pO3U9JC50ZXN0KGEpJiZtYihiLnBhcmVudE5vZGUpfHxiLHY9bS5qb2luKCIsIil9aWYodil0cnl7cmV0dXJuIEcuYXBwbHkoZCx1LnF1ZXJ5U2VsZWN0b3JBbGwodikpLGR9Y2F0Y2godyl7fWZpbmFsbHl7cHx8Yi5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4geGIoYS5yZXBsYWNlKFAsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGViKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBmYihhKXtyZXR1cm4gYVtzXT0hMCxhfWZ1bmN0aW9uIGdiKGEpe3ZhciBiPWwuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24gaGIoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gaWIoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEIpLSh+YS5zb3VyY2VJbmRleHx8Qik7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIGpiKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIGtiKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBsYihhKXtyZXR1cm4gZmIoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsZmIoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBtYihhKXtyZXR1cm4gYSYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1BJiZhfWM9ZGIuc3VwcG9ydD17fSxmPWRiLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxrPWRiLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGU9YT9hLm93bmVyRG9jdW1lbnR8fGE6dCxnPWUuZGVmYXVsdFZpZXc7cmV0dXJuIGUhPT1sJiY5PT09ZS5ub2RlVHlwZSYmZS5kb2N1bWVudEVsZW1lbnQ/KGw9ZSxtPWUuZG9jdW1lbnRFbGVtZW50LG49IWYoZSksZyYmZyE9PWcudG9wJiYoZy5hZGRFdmVudExpc3RlbmVyP2cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe2soKX0sITEpOmcuYXR0YWNoRXZlbnQmJmcuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2soKX0pKSxjLmF0dHJpYnV0ZXM9Z2IoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1nYihmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1ZLnRlc3QoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSYmZ2IoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiIsYS5maXJzdENoaWxkLmNsYXNzTmFtZT0iaSIsMj09PWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaSIpLmxlbmd0aH0pLGMuZ2V0QnlJZD1nYihmdW5jdGlvbihhKXtyZXR1cm4gbS5hcHBlbmRDaGlsZChhKS5pZD1zLCFlLmdldEVsZW1lbnRzQnlOYW1lfHwhZS5nZXRFbGVtZW50c0J5TmFtZShzKS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT09QSYmbil7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYyYmYy5wYXJlbnROb2RlP1tjXTpbXX19LGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShhYixiYik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9fSk6KGRlbGV0ZSBkLmZpbmQuSUQsZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGFiLGJiKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9PUEmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSksZC5maW5kLlRBRz1jLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGEsYil7cmV0dXJuIHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09QT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOnZvaWQgMH06ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9MCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoIioiPT09YSl7d2hpbGUoYz1mW2UrK10pMT09PWMubm9kZVR5cGUmJmQucHVzaChjKTtyZXR1cm4gZH1yZXR1cm4gZn0sZC5maW5kLkNMQVNTPWMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oYSxiKXtyZXR1cm4gdHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PUEmJm4/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scD1bXSxvPVtdLChjLnFzYT1ZLnRlc3QoZS5xdWVyeVNlbGVjdG9yQWxsKSkmJihnYihmdW5jdGlvbihhKXthLmlubmVySFRNTD0iPHNlbGVjdCB0PScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixhLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0Xj0nJ10iKS5sZW5ndGgmJm8ucHVzaCgiWypeJF09IitLKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fG8ucHVzaCgiXFxbIitLKyIqKD86dmFsdWV8IitKKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8by5wdXNoKCI6Y2hlY2tlZCIpfSksZ2IoZnVuY3Rpb24oYSl7dmFyIGI9ZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmby5wdXNoKCJuYW1lIitLKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fG8ucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxvLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9WS50ZXN0KHE9bS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG0ubW96TWF0Y2hlc1NlbGVjdG9yfHxtLm9NYXRjaGVzU2VsZWN0b3J8fG0ubXNNYXRjaGVzU2VsZWN0b3IpKSYmZ2IoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1xLmNhbGwoYSwiZGl2IikscS5jYWxsKGEsIltzIT0nJ106eCIpLHAucHVzaCgiIT0iLE8pfSksbz1vLmxlbmd0aCYmbmV3IFJlZ0V4cChvLmpvaW4oInwiKSkscD1wLmxlbmd0aCYmbmV3IFJlZ0V4cChwLmpvaW4oInwiKSksYj1ZLnRlc3QobS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikscj1ifHxZLnRlc3QobS5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSx6PWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gaj0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1lfHxhLm93bmVyRG9jdW1lbnQ9PT10JiZyKHQsYSk/LTE6Yj09PWV8fGIub3duZXJEb2N1bWVudD09PXQmJnIodCxiKT8xOmk/SS5jYWxsKGksYSktSS5jYWxsKGksYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGo9ITAsMDt2YXIgYyxkPTAsZj1hLnBhcmVudE5vZGUsZz1iLnBhcmVudE5vZGUsaD1bYV0saz1bYl07aWYoIWZ8fCFnKXJldHVybiBhPT09ZT8tMTpiPT09ZT8xOmY/LTE6Zz8xOmk/SS5jYWxsKGksYSktSS5jYWxsKGksYik6MDtpZihmPT09ZylyZXR1cm4gaWIoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlrLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWtbZF0pZCsrO3JldHVybiBkP2liKGhbZF0sa1tkXSk6aFtkXT09PXQ/LTE6a1tkXT09PXQ/MTowfSxlKTpsfSxkYi5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGRiKGEsbnVsbCxudWxsLGIpfSxkYi5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PWwmJmsoYSksYj1iLnJlcGxhY2UoUywiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFufHxwJiZwLnRlc3QoYil8fG8mJm8udGVzdChiKSkpdHJ5e3ZhciBkPXEuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGRiKGIsbCxudWxsLFthXSkubGVuZ3RoPjB9LGRiLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1sJiZrKGEpLHIoYSxiKX0sZGIuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09bCYmayhhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkMuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhbik6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhbj9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGRiLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZGIudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYoaj0hYy5kZXRlY3REdXBsaWNhdGVzLGk9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoeiksail7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGk9bnVsbCxhfSxlPWRiLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1kYi5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpmYixtYXRjaDpWLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoYWIsYmIpLGFbM109KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGFiLGJiKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8ZGIuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZGIuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNV0mJmFbMl07cmV0dXJuIFYuQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdJiZ2b2lkIDAhPT1hWzRdP2FbMl09YVs0XTpjJiZULnRlc3QoYykmJihiPW9iKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShhYixiYikudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9d1thKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrSysiKSIrYSsiKCIrSysifCQpIikpJiZ3KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8dHlwZW9mIGEuZ2V0QXR0cmlidXRlIT09QSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9ZGIuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHQ9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmdCl7az1xW3NdfHwocVtzXT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT11JiZqWzFdLG09alswXT09PXUmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3UsbixtXTticmVha319ZWxzZSBpZih0JiYoaj0oYltzXXx8KGJbc109e30pKVthXSkmJmpbMF09PT11KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJih0JiYoKGxbc118fChsW3NdPXt9KSlbYV09W3UsbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8ZGIuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVtzXT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9mYihmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SS5jYWxsKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmZiKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1nKGEucmVwbGFjZShQLCIkMSIpKTtyZXR1cm4gZFtzXT9mYihmdW5jdGlvbihhLGIsYyxlKXt2YXIgZixnPWQoYSxudWxsLGUsW10pLGg9YS5sZW5ndGg7d2hpbGUoaC0tKShmPWdbaF0pJiYoYVtoXT0hKGJbaF09ZikpfSk6ZnVuY3Rpb24oYSxlLGYpe3JldHVybiBiWzBdPWEsZChiLG51bGwsZixjKSwhYy5wb3AoKX19KSxoYXM6ZmIoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBkYihhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmZiKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzpmYihmdW5jdGlvbihhKXtyZXR1cm4gVS50ZXN0KGF8fCIiKXx8ZGIuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoYWIsYmIpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1uP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW19LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bC5hY3RpdmVFbGVtZW50JiYoIWwuaGFzRm9jdXN8fGwuaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBYLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBXLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0OmxiKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpsYihmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6bGIoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpsYihmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpsYihmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0OmxiKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6bGIoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPWpiKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPWtiKGIpO2Z1bmN0aW9uIG5iKCl7fW5iLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgbmI7ZnVuY3Rpb24gb2IoYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXhbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1RLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9Ui5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShQLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9VltnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2RiLmVycm9yKGEpOngoYSxpKS5zbGljZSgwKX1mdW5jdGlvbiBwYihhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHFiKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj12Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3UsZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbc118fChiW3NdPXt9KSwoaD1pW2RdKSYmaFswXT09PXUmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiByYihhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiBzYihhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHRiKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbc10mJihkPXRiKGQpKSxlJiYhZVtzXSYmKGU9dGIoZSxmKSksZmIoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8d2IoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6c2IocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXNiKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9JLmNhbGwoZixsKTptW2tdKT4tMSYmKGZbal09IShnW2pdPWwpKX19ZWxzZSByPXNiKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTpHLmFwcGx5KGcscil9KX1mdW5jdGlvbiB1YihhKXtmb3IodmFyIGIsYyxlLGY9YS5sZW5ndGgsZz1kLnJlbGF0aXZlW2FbMF0udHlwZV0saT1nfHxkLnJlbGF0aXZlWyIgIl0saj1nPzE6MCxrPXFiKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saSwhMCksbD1xYihmdW5jdGlvbihhKXtyZXR1cm4gSS5jYWxsKGIsYSk+LTF9LGksITApLG09W2Z1bmN0aW9uKGEsYyxkKXtyZXR1cm4hZyYmKGR8fGMhPT1oKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKX1dO2Y+ajtqKyspaWYoYz1kLnJlbGF0aXZlW2Fbal0udHlwZV0pbT1bcWIocmIobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2pdLnR5cGVdLmFwcGx5KG51bGwsYVtqXS5tYXRjaGVzKSxjW3NdKXtmb3IoZT0rK2o7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHRiKGo+MSYmcmIobSksaj4xJiZwYihhLnNsaWNlKDAsai0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbai0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFAsIiQxIiksYyxlPmomJnViKGEuc2xpY2UoaixlKSksZj5lJiZ1YihhPWEuc2xpY2UoZSkpLGY+ZSYmcGIoYSkpfW0ucHVzaChjKX1yZXR1cm4gcmIobSl9ZnVuY3Rpb24gdmIoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxpLGosayl7dmFyIG0sbixvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1oLHY9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdz11Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD12Lmxlbmd0aDtmb3IoayYmKGg9ZyE9PWwmJmcpO3EhPT14JiZudWxsIT0obT12W3FdKTtxKyspe2lmKGUmJm0pe249MDt3aGlsZShvPWFbbisrXSlpZihvKG0sZyxpKSl7ai5wdXNoKG0pO2JyZWFrfWsmJih1PXcpfWMmJigobT0hbyYmbSkmJnAtLSxmJiZyLnB1c2gobSkpfWlmKHArPXEsYyYmcSE9PXApe249MDt3aGlsZShvPWJbbisrXSlvKHIscyxnLGkpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09RS5jYWxsKGopKTtzPXNiKHMpfUcuYXBwbHkoaixzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZkYi51bmlxdWVTb3J0KGopfXJldHVybiBrJiYodT13LGg9dCkscn07cmV0dXJuIGM/ZmIoZik6Zn1nPWRiLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj15W2ErIiAiXTtpZighZil7Ynx8KGI9b2IoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9dWIoYltjXSksZltzXT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9eShhLHZiKGUsZCkpfXJldHVybiBmfTtmdW5jdGlvbiB3YihhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWRiKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB4YihhLGIsZSxmKXt2YXIgaCxpLGosayxsLG09b2IoYSk7aWYoIWYmJjE9PT1tLmxlbmd0aCl7aWYoaT1tWzBdPW1bMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShqPWlbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJm4mJmQucmVsYXRpdmVbaVsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGoubWF0Y2hlc1swXS5yZXBsYWNlKGFiLGJiKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO2E9YS5zbGljZShpLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1oPVYubmVlZHNDb250ZXh0LnRlc3QoYSk/MDppLmxlbmd0aDt3aGlsZShoLS0pe2lmKGo9aVtoXSxkLnJlbGF0aXZlW2s9ai50eXBlXSlicmVhaztpZigobD1kLmZpbmRba10pJiYoZj1sKGoubWF0Y2hlc1swXS5yZXBsYWNlKGFiLGJiKSwkLnRlc3QoaVswXS50eXBlKSYmbWIoYi5wYXJlbnROb2RlKXx8YikpKXtpZihpLnNwbGljZShoLDEpLGE9Zi5sZW5ndGgmJnBiKGkpLCFhKXJldHVybiBHLmFwcGx5KGUsZiksZTticmVha319fXJldHVybiBnKGEsbSkoZixiLCFuLGUsJC50ZXN0KGEpJiZtYihiLnBhcmVudE5vZGUpfHxiKSxlfXJldHVybiBjLnNvcnRTdGFibGU9cy5zcGxpdCgiIikuc29ydCh6KS5qb2luKCIiKT09PXMsYy5kZXRlY3REdXBsaWNhdGVzPSEhaixrKCksYy5zb3J0RGV0YWNoZWQ9Z2IoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihsLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGdiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGhiKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmdiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGhiKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGdiKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxoYihKLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxkYn0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwclsiOiJdPW4uZXhwci5wc2V1ZG9zLG4udW5pcXVlPXQudW5pcXVlU29ydCxuLnRleHQ9dC5nZXRUZXh0LG4uaXNYTUxEb2M9dC5pc1hNTCxuLmNvbnRhaW5zPXQuY29udGFpbnM7dmFyIHU9bi5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx2PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdz0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHgoYSxiLGMpe2lmKG4uaXNGdW5jdGlvbihiKSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYody50ZXN0KGIpKXJldHVybiBuLmZpbHRlcihiLGEsYyk7Yj1uLmZpbHRlcihiLGEpfXJldHVybiBuLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbi5pbkFycmF5KGEsYik+PTAhPT1jfSl9bi5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bi5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTpuLmZpbmQubWF0Y2hlcyhhLG4uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbi5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG4oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG4uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbi5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bi51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXgodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnUudGVzdChhKT9uKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHksej1hLmRvY3VtZW50LEE9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxCPW4uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWEuY2hhckF0KDApJiYiPiI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTpBLmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eSkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2Ygbj9iWzBdOmIsbi5tZXJnZSh0aGlzLG4ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6eiwhMCkpLHYudGVzdChjWzFdKSYmbi5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbi5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9aWYoZD16LmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSl7aWYoZC5pZCE9PWNbMl0pcmV0dXJuIHkuZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZH1yZXR1cm4gdGhpcy5jb250ZXh0PXosdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTpuLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB5LnJlYWR5P3kucmVhZHkoYSk6YShuKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxuLm1ha2VBcnJheShhLHRoaXMpKX07Qi5wcm90b3R5cGU9bi5mbix5PW4oeik7dmFyIEM9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sRD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtuLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWFbYl07d2hpbGUoZSYmOSE9PWUubm9kZVR5cGUmJih2b2lkIDA9PT1jfHwxIT09ZS5ub2RlVHlwZXx8IW4oZSkuaXMoYykpKTE9PT1lLm5vZGVUeXBlJiZkLnB1c2goZSksZT1lW2JdO3JldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG4uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1uKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobi5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXUudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP24oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm4uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9uLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP24uaW5BcnJheSh0aGlzWzBdLG4oYSkpOm4uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWUobi5tZXJnZSh0aGlzLmdldCgpLG4oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRShhLGIpe2RvIGE9YVtiXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBuLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBFKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEUoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBuLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihEW2FdfHwoZT1uLnVuaXF1ZShlKSksQy50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBGPS9cUysvZyxHPXt9O2Z1bmN0aW9uIEgoYSl7dmFyIGI9R1thXT17fTtyZXR1cm4gbi5lYWNoKGEubWF0Y2goRil8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/R1thXXx8SChhKTpuLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGM9YS5tZW1vcnkmJmwsZD0hMCxmPWd8fDAsZz0wLGU9aC5sZW5ndGgsYj0hMDtoJiZlPmY7ZisrKWlmKGhbZl0uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtjPSExO2JyZWFrfWI9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpjP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgZD1oLmxlbmd0aDshZnVuY3Rpb24gZihiKXtuLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW4udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZmKGMpfSl9KGFyZ3VtZW50cyksYj9lPWgubGVuZ3RoOmMmJihnPWQsaihjKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZuLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYyl7dmFyIGQ7d2hpbGUoKGQ9bi5pbkFycmF5KGMsaCxkKSk+LTEpaC5zcGxpY2UoZCwxKSxiJiYoZT49ZCYmZS0tLGY+PWQmJmYtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bi5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxlPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yz12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxjfHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4haHx8ZCYmIWl8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sYj9pLnB1c2goYyk6aihjKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBrfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITA/IS0tbi5yZWFkeVdhaXQ6IW4uaXNSZWFkeSl7aWYoIXouYm9keSlyZXR1cm4gc2V0VGltZW91dChuLnJlYWR5KTtuLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW4ucmVhZHlXYWl0PjB8fChJLnJlc29sdmVXaXRoKHosW25dKSxuLmZuLnRyaWdnZXImJm4oeikudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5IikpfX19KTtmdW5jdGlvbiBKKCl7ei5hZGRFdmVudExpc3RlbmVyPyh6LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEssITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSywhMSkpOih6LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEspLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSykpfWZ1bmN0aW9uIEsoKXsoei5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1ldmVudC50eXBlfHwiY29tcGxldGUiPT09ei5yZWFkeVN0YXRlKSYmKEooKSxuLnJlYWR5KCkpfW4ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighSSlpZihJPW4uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09ei5yZWFkeVN0YXRlKXNldFRpbWVvdXQobi5yZWFkeSk7ZWxzZSBpZih6LmFkZEV2ZW50TGlzdGVuZXIpei5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixLLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEssITEpO2Vsc2V7ei5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixLKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEspO3ZhciBjPSExO3RyeXtjPW51bGw9PWEuZnJhbWVFbGVtZW50JiZ6LmRvY3VtZW50RWxlbWVudH1jYXRjaChkKXt9YyYmYy5kb1Njcm9sbCYmIWZ1bmN0aW9uIGUoKXtpZighbi5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGUsNTApfUooKSxuLnJlYWR5KCl9fSgpfXJldHVybiBJLnByb21pc2UoYil9O3ZhciBMPSJ1bmRlZmluZWQiLE07Zm9yKE0gaW4gbihsKSlicmVhaztsLm93bkxhc3Q9IjAiIT09TSxsLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbihmdW5jdGlvbigpe3ZhciBhLGIsYz16LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07YyYmKGE9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxhLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4IixiPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYy5hcHBlbmRDaGlsZChhKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09TCYmKGIuc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7bWFyZ2luOjA7d2lkdGg6MXB4O3BhZGRpbmc6MXB4O2Rpc3BsYXk6aW5saW5lO3pvb206MSIsKGwuaW5saW5lQmxvY2tOZWVkc0xheW91dD0zPT09Yi5vZmZzZXRXaWR0aCkmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoYSksYT1iPW51bGwpfSksZnVuY3Rpb24oKXt2YXIgYT16LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG51bGw9PWwuZGVsZXRlRXhwYW5kbyl7bC5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2wuZGVsZXRlRXhwYW5kbz0hMX19YT1udWxsfSgpLG4uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXt2YXIgYj1uLm5vRGF0YVsoYS5ub2RlTmFtZSsiICIpLnRvTG93ZXJDYXNlKCldLGM9K2Eubm9kZVR5cGV8fDE7cmV0dXJuIDEhPT1jJiY5IT09Yz8hMTohYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn07dmFyIE49L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE8sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bi5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwfXJldHVybiBjfWZ1bmN0aW9uIFEoYSl7dmFyIGI7Zm9yKGIgaW4gYSlpZigoImRhdGEiIT09Ynx8IW4uaXNFbXB0eU9iamVjdChhW2JdKSkmJiJ0b0pTT04iIT09YilyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBSKGEsYixkLGUpe2lmKG4uYWNjZXB0RGF0YShhKSl7dmFyIGYsZyxoPW4uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP24uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoO2lmKGsmJmpba10mJihlfHxqW2tdLmRhdGEpfHx2b2lkIDAhPT1kfHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIGt8fChrPWk/YVtoXT1jLnBvcCgpfHxuLmd1aWQrKzpoKSxqW2tdfHwoaltrXT1pP3t9Ont0b0pTT046bi5ub29wfSksKCJvYmplY3QiPT10eXBlb2YgYnx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoZT9qW2tdPW4uZXh0ZW5kKGpba10sYik6altrXS5kYXRhPW4uZXh0ZW5kKGpba10uZGF0YSxiKSksZz1qW2tdLGV8fChnLmRhdGF8fChnLmRhdGE9e30pLGc9Zy5kYXRhKSx2b2lkIDAhPT1kJiYoZ1tuLmNhbWVsQ2FzZShiKV09ZCksInN0cmluZyI9PXR5cGVvZiBiPyhmPWdbYl0sbnVsbD09ZiYmKGY9Z1tuLmNhbWVsQ2FzZShiKV0pKTpmPWcsZgp9fWZ1bmN0aW9uIFMoYSxiLGMpe2lmKG4uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP24uY2FjaGU6YSxoPWY/YVtuLmV4cGFuZG9dOm4uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bi5pc0FycmF5KGIpP2I9Yi5jb25jYXQobi5tYXAoYixuLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1uLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFRKGQpOiFuLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxRKGdbaF0pKSkmJihmP24uY2xlYW5EYXRhKFthXSwhMCk6bC5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bi5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP24uY2FjaGVbYVtuLmV4cGFuZG9dXTphW24uZXhwYW5kb10sISFhJiYhUShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFIoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFMoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBSKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUyhhLGIsITApfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bi5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbi5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZD1nW2NdLm5hbWUsMD09PWQuaW5kZXhPZigiZGF0YS0iKSYmKGQ9bi5jYW1lbENhc2UoZC5zbGljZSg1KSksUChmLGQsZVtkXSkpO24uX2RhdGEoZiwicGFyc2VkQXR0cnMiLCEwKX1yZXR1cm4gZX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5kYXRhKHRoaXMsYSl9KTphcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5kYXRhKHRoaXMsYSxiKX0pOmY/UChmLGEsbi5kYXRhKGYsYSkpOnZvaWQgMH0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBhPyhiPShifHwiZngiKSsicXVldWUiLGQ9bi5fZGF0YShhLGIpLGMmJighZHx8bi5pc0FycmF5KGMpP2Q9bi5fZGF0YShhLGIsbi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W10pOnZvaWQgMH0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1uLnF1ZXVlKGEsYiksZD1jLmxlbmd0aCxlPWMuc2hpZnQoKSxmPW4uX3F1ZXVlSG9va3MoYSxiKSxnPWZ1bmN0aW9uKCl7bi5kZXF1ZXVlKGEsYil9OyJpbnByb2dyZXNzIj09PWUmJihlPWMuc2hpZnQoKSxkLS0pLGUmJigiZngiPT09YiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGYuc3RvcCxlLmNhbGwoYSxnLGYpKSwhZCYmZiYmZi5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YisicXVldWVIb29rcyI7cmV0dXJuIG4uX2RhdGEoYSxjKXx8bi5fZGF0YShhLGMse2VtcHR5Om4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe24uX3JlbW92ZURhdGEoYSxiKyJxdWV1ZSIpLG4uX3JlbW92ZURhdGEoYSxjKX0pfSl9fSksbi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT0iZngiLGMtLSksYXJndW1lbnRzLmxlbmd0aDxjP24ucXVldWUodGhpc1swXSxhKTp2b2lkIDA9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9bi5xdWV1ZSh0aGlzLGEsYik7bi5fcXVldWVIb29rcyh0aGlzLGEpLCJmeCI9PT1hJiYiaW5wcm9ncmVzcyIhPT1jWzBdJiZuLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRlcXVldWUodGhpcyxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0xLGU9bi5EZWZlcnJlZCgpLGY9dGhpcyxnPXRoaXMubGVuZ3RoLGg9ZnVuY3Rpb24oKXstLWR8fGUucmVzb2x2ZVdpdGgoZixbZl0pfTsic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGE9YXx8ImZ4Ijt3aGlsZShnLS0pYz1uLl9kYXRhKGZbZ10sYSsicXVldWVIb29rcyIpLGMmJmMuZW1wdHkmJihkKyssYy5lbXB0eS5hZGQoaCkpO3JldHVybiBoKCksZS5wcm9taXNlKGIpfX0pO3ZhciBUPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFU9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxWPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1uLmNzcyhhLCJkaXNwbGF5Iil8fCFuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX0sVz1uLmFjY2Vzcz1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09bi50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpbi5hY2Nlc3MoYSxiLGgsY1toXSwhMCxmLGcpfWVsc2UgaWYodm9pZCAwIT09ZCYmKGU9ITAsbi5pc0Z1bmN0aW9uKGQpfHwoZz0hMCksaiYmKGc/KGIuY2FsbChhLGQpLGI9bnVsbCk6KGo9YixiPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gai5jYWxsKG4oYSksYyl9KSksYikpZm9yKDtpPmg7aCsrKWIoYVtoXSxjLGc/ZDpkLmNhbGwoYVtoXSxoLGIoYVtoXSxjKSkpO3JldHVybiBlP2E6aj9iLmNhbGwoYSk6aT9iKGFbMF0sYyk6Zn0sWD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaTshZnVuY3Rpb24oKXt2YXIgYT16LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxiPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYz16LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7aWYoYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+IixsLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsbC50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsbC5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxsLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09ei5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxjLnR5cGU9ImNoZWNrYm94IixjLmNoZWNrZWQ9ITAsYS5hcHBlbmRDaGlsZChjKSxsLmFwcGVuZENoZWNrZWQ9Yy5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixsLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYS5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixsLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsbC5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7bC5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09bC5kZWxldGVFeHBhbmRvKXtsLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7bC5kZWxldGVFeHBhbmRvPSExfX1hPWI9Yz1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGIsYyxkPXouY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwobFtiKyJCdWJibGVzIl09YyBpbiBhKXx8KGQuc2V0QXR0cmlidXRlKGMsInQiKSxsW2IrIkJ1YmJsZXMiXT1kLmF0dHJpYnV0ZXNbY10uZXhwYW5kbz09PSExKTtkPW51bGx9KCk7dmFyIFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEpJC9pLFo9L15rZXkvLCQ9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLF89L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLGFiPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYmIoKXtyZXR1cm4hMH1mdW5jdGlvbiBjYigpe3JldHVybiExfWZ1bmN0aW9uIGRiKCl7dHJ5e3JldHVybiB6LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1uLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2Ygbj09PUx8fGEmJm4uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDpuLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEYpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9YWIuZXhlYyhiW2hdKXx8W10sbz1xPWZbMV0scD0oZlsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8mJihqPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZT9qLmRlbGVnYXRlVHlwZTpqLmJpbmRUeXBlKXx8byxqPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbD1uLmV4dGVuZCh7dHlwZTpvLG9yaWdUeXBlOnEsZGF0YTpkLGhhbmRsZXI6YyxndWlkOmMuZ3VpZCxzZWxlY3RvcjplLG5lZWRzQ29udGV4dDplJiZuLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoZSksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxpKSwobT1nW29dKXx8KG09Z1tvXT1bXSxtLmRlbGVnYXRlQ291bnQ9MCxqLnNldHVwJiZqLnNldHVwLmNhbGwoYSxkLHAsaykhPT0hMXx8KGEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobyxrLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbyxrKSkpLGouYWRkJiYoai5hZGQuY2FsbChhLGwpLGwuaGFuZGxlci5ndWlkfHwobC5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGwpOm0ucHVzaChsKSxuLmV2ZW50Lmdsb2JhbFtvXT0hMCk7YT1udWxsfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxvLHAscSxyPW4uaGFzRGF0YShhKSYmbi5fZGF0YShhKTtpZihyJiYoaz1yLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChGKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPWFiLmV4ZWMoYltqXSl8fFtdLG89cT1oWzFdLHA9KGhbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxvKXtsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZD9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8byxtPWtbb118fFtdLGg9aFsyXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIrcC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxpPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWc9bVtmXSwhZSYmcSE9PWcub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWcuZ3VpZHx8aCYmIWgudGVzdChnLm5hbWVzcGFjZSl8fGQmJmQhPT1nLnNlbGVjdG9yJiYoIioqIiE9PWR8fCFnLnNlbGVjdG9yKXx8KG0uc3BsaWNlKGYsMSksZy5zZWxlY3RvciYmbS5kZWxlZ2F0ZUNvdW50LS0sbC5yZW1vdmUmJmwucmVtb3ZlLmNhbGwoYSxnKSk7aSYmIW0ubGVuZ3RoJiYobC50ZWFyZG93biYmbC50ZWFyZG93bi5jYWxsKGEscCxyLmhhbmRsZSkhPT0hMXx8bi5yZW1vdmVFdmVudChhLG8sci5oYW5kbGUpLGRlbGV0ZSBrW29dKX1lbHNlIGZvcihvIGluIGspbi5ldmVudC5yZW1vdmUoYSxvK2Jbal0sYyxkLCEwKTtuLmlzRW1wdHlPYmplY3QoaykmJihkZWxldGUgci5oYW5kbGUsbi5fcmVtb3ZlRGF0YShhLCJldmVudHMiKSl9fSx0cmlnZ2VyOmZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmLGcsaCxpLGssbCxtLG89W2R8fHpdLHA9ai5jYWxsKGIsInR5cGUiKT9iLnR5cGU6YixxPWouY2FsbChiLCJuYW1lc3BhY2UiKT9iLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGg9bD1kPWR8fHosMyE9PWQubm9kZVR5cGUmJjghPT1kLm5vZGVUeXBlJiYhXy50ZXN0KHArbi5ldmVudC50cmlnZ2VyZWQpJiYocC5pbmRleE9mKCIuIik+PTAmJihxPXAuc3BsaXQoIi4iKSxwPXEuc2hpZnQoKSxxLnNvcnQoKSksZz1wLmluZGV4T2YoIjoiKTwwJiYib24iK3AsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChwLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9ZT8yOjMsYi5uYW1lc3BhY2U9cS5qb2luKCIuIiksYi5uYW1lc3BhY2VfcmU9Yi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrcS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGIucmVzdWx0PXZvaWQgMCxiLnRhcmdldHx8KGIudGFyZ2V0PWQpLGM9bnVsbD09Yz9bYl06bi5tYWtlQXJyYXkoYyxbYl0pLGs9bi5ldmVudC5zcGVjaWFsW3BdfHx7fSxlfHwhay50cmlnZ2VyfHxrLnRyaWdnZXIuYXBwbHkoZCxjKSE9PSExKSl7aWYoIWUmJiFrLm5vQnViYmxlJiYhbi5pc1dpbmRvdyhkKSl7Zm9yKGk9ay5kZWxlZ2F0ZVR5cGV8fHAsXy50ZXN0KGkrcCl8fChoPWgucGFyZW50Tm9kZSk7aDtoPWgucGFyZW50Tm9kZSlvLnB1c2goaCksbD1oO2w9PT0oZC5vd25lckRvY3VtZW50fHx6KSYmby5wdXNoKGwuZGVmYXVsdFZpZXd8fGwucGFyZW50V2luZG93fHxhKX1tPTA7d2hpbGUoKGg9b1ttKytdKSYmIWIuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSliLnR5cGU9bT4xP2k6ay5iaW5kVHlwZXx8cCxmPShuLl9kYXRhKGgsImV2ZW50cyIpfHx7fSlbYi50eXBlXSYmbi5fZGF0YShoLCJoYW5kbGUiKSxmJiZmLmFwcGx5KGgsYyksZj1nJiZoW2ddLGYmJmYuYXBwbHkmJm4uYWNjZXB0RGF0YShoKSYmKGIucmVzdWx0PWYuYXBwbHkoaCxjKSxiLnJlc3VsdD09PSExJiZiLnByZXZlbnREZWZhdWx0KCkpO2lmKGIudHlwZT1wLCFlJiYhYi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFrLl9kZWZhdWx0fHxrLl9kZWZhdWx0LmFwcGx5KG8ucG9wKCksYyk9PT0hMSkmJm4uYWNjZXB0RGF0YShkKSYmZyYmZFtwXSYmIW4uaXNXaW5kb3coZCkpe2w9ZFtnXSxsJiYoZFtnXT1udWxsKSxuLmV2ZW50LnRyaWdnZXJlZD1wO3RyeXtkW3BdKCl9Y2F0Y2gocil7fW4uZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxsJiYoZFtnXT1sKX1yZXR1cm4gYi5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihhKXthPW4uZXZlbnQuZml4KGEpO3ZhciBiLGMsZSxmLGcsaD1bXSxpPWQuY2FsbChhcmd1bWVudHMpLGo9KG4uX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVthLnR5cGVdfHxbXSxrPW4uZXZlbnQuc3BlY2lhbFthLnR5cGVdfHx7fTtpZihpWzBdPWEsYS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFrLnByZURpc3BhdGNofHxrLnByZURpc3BhdGNoLmNhbGwodGhpcyxhKSE9PSExKXtoPW4uZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGEsaiksYj0wO3doaWxlKChmPWhbYisrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2EuY3VycmVudFRhcmdldD1mLmVsZW0sZz0wO3doaWxlKChlPWYuaGFuZGxlcnNbZysrXSkmJiFhLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpKCFhLm5hbWVzcGFjZV9yZXx8YS5uYW1lc3BhY2VfcmUudGVzdChlLm5hbWVzcGFjZSkpJiYoYS5oYW5kbGVPYmo9ZSxhLmRhdGE9ZS5kYXRhLGM9KChuLmV2ZW50LnNwZWNpYWxbZS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGUuaGFuZGxlcikuYXBwbHkoZi5lbGVtLGkpLHZvaWQgMCE9PWMmJihhLnJlc3VsdD1jKT09PSExJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gay5wb3N0RGlzcGF0Y2gmJmsucG9zdERpc3BhdGNoLmNhbGwodGhpcyxhKSxhLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz1bXSxoPWIuZGVsZWdhdGVDb3VudCxpPWEudGFyZ2V0O2lmKGgmJmkubm9kZVR5cGUmJighYS5idXR0b258fCJjbGljayIhPT1hLnR5cGUpKWZvcig7aSE9dGhpcztpPWkucGFyZW50Tm9kZXx8dGhpcylpZigxPT09aS5ub2RlVHlwZSYmKGkuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWEudHlwZSkpe2ZvcihlPVtdLGY9MDtoPmY7ZisrKWQ9YltmXSxjPWQuc2VsZWN0b3IrIiAiLHZvaWQgMD09PWVbY10mJihlW2NdPWQubmVlZHNDb250ZXh0P24oYyx0aGlzKS5pbmRleChpKT49MDpuLmZpbmQoYyx0aGlzLG51bGwsW2ldKS5sZW5ndGgpLGVbY10mJmUucHVzaChkKTtlLmxlbmd0aCYmZy5wdXNoKHtlbGVtOmksaGFuZGxlcnM6ZX0pfXJldHVybiBoPGIubGVuZ3RoJiZnLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpiLnNsaWNlKGgpfSksZ30sZml4OmZ1bmN0aW9uKGEpe2lmKGFbbi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYixjLGQsZT1hLnR5cGUsZj1hLGc9dGhpcy5maXhIb29rc1tlXTtnfHwodGhpcy5maXhIb29rc1tlXT1nPSQudGVzdChlKT90aGlzLm1vdXNlSG9va3M6Wi50ZXN0KGUpP3RoaXMua2V5SG9va3M6e30pLGQ9Zy5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChnLnByb3BzKTp0aGlzLnByb3BzLGE9bmV3IG4uRXZlbnQoZiksYj1kLmxlbmd0aDt3aGlsZShiLS0pYz1kW2JdLGFbY109ZltjXTtyZXR1cm4gYS50YXJnZXR8fChhLnRhcmdldD1mLnNyY0VsZW1lbnR8fHopLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT0hIWEubWV0YUtleSxnLmZpbHRlcj9nLmZpbHRlcihhLGYpOmF9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT1hLndoaWNoJiYoYS53aGljaD1udWxsIT1iLmNoYXJDb2RlP2IuY2hhckNvZGU6Yi5rZXlDb2RlKSxhfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj1iLmJ1dHRvbixnPWIuZnJvbUVsZW1lbnQ7cmV0dXJuIG51bGw9PWEucGFnZVgmJm51bGwhPWIuY2xpZW50WCYmKGQ9YS50YXJnZXQub3duZXJEb2N1bWVudHx8eixlPWQuZG9jdW1lbnRFbGVtZW50LGM9ZC5ib2R5LGEucGFnZVg9Yi5jbGllbnRYKyhlJiZlLnNjcm9sbExlZnR8fGMmJmMuc2Nyb2xsTGVmdHx8MCktKGUmJmUuY2xpZW50TGVmdHx8YyYmYy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWIuY2xpZW50WSsoZSYmZS5zY3JvbGxUb3B8fGMmJmMuc2Nyb2xsVG9wfHwwKS0oZSYmZS5jbGllbnRUb3B8fGMmJmMuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmZyYmKGEucmVsYXRlZFRhcmdldD1nPT09YS50YXJnZXQ/Yi50b0VsZW1lbnQ6ZyksYS53aGljaHx8dm9pZCAwPT09Znx8KGEud2hpY2g9MSZmPzE6MiZmPzM6NCZmPzI6MCksYX19LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1kYigpJiZ0aGlzLmZvY3VzKXRyeXtyZXR1cm4gdGhpcy5mb2N1cygpLCExfWNhdGNoKGEpe319LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PWRiKCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG4ubm9kZU5hbWUodGhpcywiaW5wdXQiKSYmImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljaz8odGhpcy5jbGljaygpLCExKTp2b2lkIDB9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe3JldHVybiBuLm5vZGVOYW1lKGEudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihhKXt2b2lkIDAhPT1hLnJlc3VsdCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bi5leHRlbmQobmV3IG4uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP24uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bi5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbi5yZW1vdmVFdmVudD16LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09TCYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbi5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbi5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiYoYS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCkpP2JiOmNiKTp0aGlzLnR5cGU9YSxiJiZuLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxuLm5vdygpLHZvaWQodGhpc1tuLmV4cGFuZG9dPSEwKSk6bmV3IG4uRXZlbnQoYSxiKX0sbi5FdmVudC5wcm90b3R5cGU9e2lzRGVmYXVsdFByZXZlbnRlZDpjYixpc1Byb3BhZ2F0aW9uU3RvcHBlZDpjYixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpjYixwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1iYixhJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWJiLGEmJihhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YmIsdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG4uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7bi5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iajtyZXR1cm4oIWV8fGUhPT1kJiYhbi5jb250YWlucyhkLGUpKSYmKGEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YiksY319fSksbC5zdWJtaXRCdWJibGVzfHwobi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBuLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bi5ub2RlTmFtZShiLCJpbnB1dCIpfHxuLm5vZGVOYW1lKGIsImJ1dHRvbiIpP2IuZm9ybTp2b2lkIDA7YyYmIW4uX2RhdGEoYywic3VibWl0QnViYmxlcyIpJiYobi5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxuLl9kYXRhKGMsInN1Ym1pdEJ1YmJsZXMiLCEwKSl9KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGUmJihkZWxldGUgYS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFhLmlzVHJpZ2dlciYmbi5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsYSwhMCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBuLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG4uZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksbC5jaGFuZ2VCdWJibGVzfHwobi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gWS50ZXN0KHRoaXMubm9kZU5hbWUpPygoImNoZWNrYm94Ij09PXRoaXMudHlwZXx8InJhZGlvIj09PXRoaXMudHlwZSkmJihuLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLG4uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExKSxuLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCl9KSksITEpOnZvaWQgbi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7WS50ZXN0KGIubm9kZU5hbWUpJiYhbi5fZGF0YShiLCJjaGFuZ2VCdWJibGVzIikmJihuLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG4uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksbi5fZGF0YShiLCJjaGFuZ2VCdWJibGVzIiwhMCkpfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtyZXR1cm4gdGhpcyE9PWJ8fGEuaXNTaW11bGF0ZWR8fGEuaXNUcmlnZ2VyfHwicmFkaW8iIT09Yi50eXBlJiYiY2hlY2tib3giIT09Yi50eXBlP2EuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOnZvaWQgMH0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gbi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKSwhWS50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGwuZm9jdXNpbkJ1YmJsZXN8fG4uZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbihhKXtuLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsbi5ldmVudC5maXgoYSksITApfTtuLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9bi5fZGF0YShkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLG4uX2RhdGEoZCxiLChlfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1uLl9kYXRhKGQsYiktMTtlP24uX2RhdGEoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxuLl9yZW1vdmVEYXRhKGQsYikpfX19KSxuLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7InN0cmluZyIhPXR5cGVvZiBiJiYoYz1jfHxiLGI9dm9pZCAwKTtmb3IoZiBpbiBhKXRoaXMub24oZixiLGMsYVtmXSxlKTtyZXR1cm4gdGhpc31pZihudWxsPT1jJiZudWxsPT1kPyhkPWIsYz1iPXZvaWQgMCk6bnVsbD09ZCYmKCJzdHJpbmciPT10eXBlb2YgYj8oZD1jLGM9dm9pZCAwKTooZD1jLGM9YixiPXZvaWQgMCkpLGQ9PT0hMSlkPWNiO2Vsc2UgaWYoIWQpcmV0dXJuIHRoaXM7cmV0dXJuIDE9PT1lJiYoZz1kLGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4oKS5vZmYoYSksZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGQuZ3VpZD1nLmd1aWR8fChnLmd1aWQ9bi5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LmFkZCh0aGlzLGEsZCxjLGIpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmopcmV0dXJuIGQ9YS5oYW5kbGVPYmosbihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZC5uYW1lc3BhY2U/ZC5vcmlnVHlwZSsiLiIrZC5uYW1lc3BhY2U6ZC5vcmlnVHlwZSxkLnNlbGVjdG9yLGQuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGEpe2ZvcihlIGluIGEpdGhpcy5vZmYoZSxiLGFbZV0pO3JldHVybiB0aGlzfXJldHVybihiPT09ITF8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGM9YixiPXZvaWQgMCksYz09PSExJiYoYz1jYiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5yZW1vdmUodGhpcyxhLGMsYil9KX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtyZXR1cm4gYz9uLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApOnZvaWQgMH19KTtmdW5jdGlvbiBlYihhKXt2YXIgYj1mYi5zcGxpdCgifCIpLGM9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoYy5jcmVhdGVFbGVtZW50KXdoaWxlKGIubGVuZ3RoKWMuY3JlYXRlRWxlbWVudChiLnBvcCgpKTtyZXR1cm4gY312YXIgZmI9ImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8aGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLGdiPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csaGI9bmV3IFJlZ0V4cCgiPCg/OiIrZmIrIilbXFxzLz5dIiwiaSIpLGliPS9eXHMrLyxqYj0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGtiPS88KFtcdzpdKykvLGxiPS88dGJvZHkvaSxtYj0vPHwmIz9cdys7LyxuYj0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLG9iPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHBiPS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxxYj0vXnRydWVcLyguKikvLHJiPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZyxzYj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6bC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19LHRiPWViKHopLHViPXRiLmFwcGVuZENoaWxkKHouY3JlYXRlRWxlbWVudCgiZGl2IikpO3NiLm9wdGdyb3VwPXNiLm9wdGlvbixzYi50Ym9keT1zYi50Zm9vdD1zYi5jb2xncm91cD1zYi5jYXB0aW9uPXNiLnRoZWFkLHNiLnRoPXNiLnRkO2Z1bmN0aW9uIHZiKGEsYil7dmFyIGMsZCxlPTAsZj10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PUw/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOnR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGwhPT1MP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG4ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bi5tZXJnZShmLHZiKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZuLm5vZGVOYW1lKGEsYik/bi5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiB3YihhKXtYLnRlc3QoYS50eXBlKSYmKGEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkKX1mdW5jdGlvbiB4YihhLGIpe3JldHVybiBuLm5vZGVOYW1lKGEsInRhYmxlIikmJm4ubm9kZU5hbWUoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24geWIoYSl7cmV0dXJuIGEudHlwZT0obnVsbCE9PW4uZmluZC5hdHRyKGEsInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIHpiKGEpe3ZhciBiPXFiLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gQWIoYSxiKXtmb3IodmFyIGMsZD0wO251bGwhPShjPWFbZF0pO2QrKyluLl9kYXRhKGMsImdsb2JhbEV2YWwiLCFifHxuLl9kYXRhKGJbZF0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gQmIoYSxiKXtpZigxPT09Yi5ub2RlVHlwZSYmbi5oYXNEYXRhKGEpKXt2YXIgYyxkLGUsZj1uLl9kYXRhKGEpLGc9bi5fZGF0YShiLGYpLGg9Zi5ldmVudHM7aWYoaCl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihjIGluIGgpZm9yKGQ9MCxlPWhbY10ubGVuZ3RoO2U+ZDtkKyspbi5ldmVudC5hZGQoYixjLGhbY11bZF0pfWcuZGF0YSYmKGcuZGF0YT1uLmV4dGVuZCh7fSxnLmRhdGEpKX19ZnVuY3Rpb24gQ2IoYSxiKXt2YXIgYyxkLGU7aWYoMT09PWIubm9kZVR5cGUpe2lmKGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCFsLm5vQ2xvbmVFdmVudCYmYltuLmV4cGFuZG9dKXtlPW4uX2RhdGEoYik7Zm9yKGQgaW4gZS5ldmVudHMpbi5yZW1vdmVFdmVudChiLGQsZS5oYW5kbGUpO2IucmVtb3ZlQXR0cmlidXRlKG4uZXhwYW5kbyl9InNjcmlwdCI9PT1jJiZiLnRleHQhPT1hLnRleHQ/KHliKGIpLnRleHQ9YS50ZXh0LHpiKGIpKToib2JqZWN0Ij09PWM/KGIucGFyZW50Tm9kZSYmKGIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MKSxsLmh0bWw1Q2xvbmUmJmEuaW5uZXJIVE1MJiYhbi50cmltKGIuaW5uZXJIVE1MKSYmKGIuaW5uZXJIVE1MPWEuaW5uZXJIVE1MKSk6ImlucHV0Ij09PWMmJlgudGVzdChhLnR5cGUpPyhiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQsYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpKToib3B0aW9uIj09PWM/Yi5kZWZhdWx0U2VsZWN0ZWQ9Yi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDooImlucHV0Ij09PWN8fCJ0ZXh0YXJlYSI9PT1jKSYmKGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19bi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGk9bi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSk7aWYobC5odG1sNUNsb25lfHxuLmlzWE1MRG9jKGEpfHwhaGIudGVzdCgiPCIrYS5ub2RlTmFtZSsiPiIpP2Y9YS5jbG9uZU5vZGUoITApOih1Yi5pbm5lckhUTUw9YS5vdXRlckhUTUwsdWIucmVtb3ZlQ2hpbGQoZj11Yi5maXJzdENoaWxkKSksIShsLm5vQ2xvbmVFdmVudCYmbC5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8bi5pc1hNTERvYyhhKSkpZm9yKGQ9dmIoZiksaD12YihhKSxnPTA7bnVsbCE9KGU9aFtnXSk7KytnKWRbZ10mJkNiKGUsZFtnXSk7aWYoYilpZihjKWZvcihoPWh8fHZiKGEpLGQ9ZHx8dmIoZiksZz0wO251bGwhPShlPWhbZ10pO2crKylCYihlLGRbZ10pO2Vsc2UgQmIoYSxmKTtyZXR1cm4gZD12YihmLCJzY3JpcHQiKSxkLmxlbmd0aD4wJiZBYihkLCFpJiZ2YihhLCJzY3JpcHQiKSksZD1oPWU9bnVsbCxmfSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGEsYixjLGQpe2Zvcih2YXIgZSxmLGcsaCxpLGosayxtPWEubGVuZ3RoLG89ZWIoYikscD1bXSxxPTA7bT5xO3ErKylpZihmPWFbcV0sZnx8MD09PWYpaWYoIm9iamVjdCI9PT1uLnR5cGUoZikpbi5tZXJnZShwLGYubm9kZVR5cGU/W2ZdOmYpO2Vsc2UgaWYobWIudGVzdChmKSl7aD1ofHxvLmFwcGVuZENoaWxkKGIuY3JlYXRlRWxlbWVudCgiZGl2IikpLGk9KGtiLmV4ZWMoZil8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksaz1zYltpXXx8c2IuX2RlZmF1bHQsaC5pbm5lckhUTUw9a1sxXStmLnJlcGxhY2UoamIsIjwkMT48LyQyPiIpK2tbMl0sZT1rWzBdO3doaWxlKGUtLSloPWgubGFzdENoaWxkO2lmKCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZpYi50ZXN0KGYpJiZwLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShpYi5leGVjKGYpWzBdKSksIWwudGJvZHkpe2Y9InRhYmxlIiE9PWl8fGxiLnRlc3QoZik/Ijx0YWJsZT4iIT09a1sxXXx8bGIudGVzdChmKT8wOmg6aC5maXJzdENoaWxkLGU9ZiYmZi5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShlLS0pbi5ub2RlTmFtZShqPWYuY2hpbGROb2Rlc1tlXSwidGJvZHkiKSYmIWouY2hpbGROb2Rlcy5sZW5ndGgmJmYucmVtb3ZlQ2hpbGQoail9bi5tZXJnZShwLGguY2hpbGROb2RlcyksaC50ZXh0Q29udGVudD0iIjt3aGlsZShoLmZpcnN0Q2hpbGQpaC5yZW1vdmVDaGlsZChoLmZpcnN0Q2hpbGQpO2g9by5sYXN0Q2hpbGR9ZWxzZSBwLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7aCYmby5yZW1vdmVDaGlsZChoKSxsLmFwcGVuZENoZWNrZWR8fG4uZ3JlcCh2YihwLCJpbnB1dCIpLHdiKSxxPTA7d2hpbGUoZj1wW3ErK10paWYoKCFkfHwtMT09PW4uaW5BcnJheShmLGQpKSYmKGc9bi5jb250YWlucyhmLm93bmVyRG9jdW1lbnQsZiksaD12YihvLmFwcGVuZENoaWxkKGYpLCJzY3JpcHQiKSxnJiZBYihoKSxjKSl7ZT0wO3doaWxlKGY9aFtlKytdKXBiLnRlc3QoZi50eXBlfHwiIikmJmMucHVzaChmKX1yZXR1cm4gaD1udWxsLG99LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1uLmV4cGFuZG8saj1uLmNhY2hlLGs9bC5kZWxldGVFeHBhbmRvLG09bi5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8bi5hY2NlcHREYXRhKGQpKSYmKGY9ZFtpXSxnPWYmJmpbZl0pKXtpZihnLmV2ZW50cylmb3IoZSBpbiBnLmV2ZW50cyltW2VdP24uZXZlbnQucmVtb3ZlKGQsZSk6bi5yZW1vdmVFdmVudChkLGUsZy5oYW5kbGUpO2pbZl0mJihkZWxldGUgaltmXSxrP2RlbGV0ZSBkW2ldOnR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZSE9PUw/ZC5yZW1vdmVBdHRyaWJ1dGUoaSk6ZFtpXT1udWxsLGMucHVzaChmKSl9fX0pLG4uZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBXKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/bi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8eikuY3JlYXRlVGV4dE5vZGUoYSkpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9eGIodGhpcyxhKTtiLmFwcGVuZENoaWxkKGEpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj14Yih0aGlzLGEpO2IuaW5zZXJ0QmVmb3JlKGEsYi5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSl9LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPWE/bi5maWx0ZXIoYSx0aGlzKTp0aGlzLGU9MDtudWxsIT0oYz1kW2VdKTtlKyspYnx8MSE9PWMubm9kZVR5cGV8fG4uY2xlYW5EYXRhKHZiKGMpKSxjLnBhcmVudE5vZGUmJihiJiZuLmNvbnRhaW5zKGMub3duZXJEb2N1bWVudCxjKSYmQWIodmIoYywic2NyaXB0IikpLGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhLGI9MDtudWxsIT0oYT10aGlzW2JdKTtiKyspezE9PT1hLm5vZGVUeXBlJiZuLmNsZWFuRGF0YSh2YihhLCExKSk7d2hpbGUoYS5maXJzdENoaWxkKWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLm9wdGlvbnMmJm4ubm9kZU5hbWUoYSwic2VsZWN0IikmJihhLm9wdGlvbnMubGVuZ3RoPTApfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGw9PWE/ITE6YSxiPW51bGw9PWI/YTpiLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7cmV0dXJuIFcodGhpcyxmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdfHx7fSxjPTAsZD10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1hKXJldHVybiAxPT09Yi5ub2RlVHlwZT9iLmlubmVySFRNTC5yZXBsYWNlKGdiLCIiKTp2b2lkIDA7aWYoISgic3RyaW5nIiE9dHlwZW9mIGF8fG5iLnRlc3QoYSl8fCFsLmh0bWxTZXJpYWxpemUmJmhiLnRlc3QoYSl8fCFsLmxlYWRpbmdXaGl0ZXNwYWNlJiZpYi50ZXN0KGEpfHxzYlsoa2IuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pKXthPWEucmVwbGFjZShqYiwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEodmIoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGIpe2E9dGhpcy5wYXJlbnROb2RlLG4uY2xlYW5EYXRhKHZiKHRoaXMpKSxhJiZhLnJlcGxhY2VDaGlsZChiLHRoaXMpfSksYSYmKGEubGVuZ3RofHxhLm5vZGVUeXBlKT90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYil7YT1lLmFwcGx5KFtdLGEpO3ZhciBjLGQsZixnLGgsaSxqPTAsaz10aGlzLmxlbmd0aCxtPXRoaXMsbz1rLTEscD1hWzBdLHE9bi5pc0Z1bmN0aW9uKHApO2lmKHF8fGs+MSYmInN0cmluZyI9PXR5cGVvZiBwJiYhbC5jaGVja0Nsb25lJiZvYi50ZXN0KHApKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9bS5lcShjKTtxJiYoYVswXT1wLmNhbGwodGhpcyxjLGQuaHRtbCgpKSksZC5kb21NYW5pcChhLGIpfSk7aWYoayYmKGk9bi5idWlsZEZyYWdtZW50KGEsdGhpc1swXS5vd25lckRvY3VtZW50LCExLHRoaXMpLGM9aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1jKSxjKSl7Zm9yKGc9bi5tYXAodmIoaSwic2NyaXB0IikseWIpLGY9Zy5sZW5ndGg7az5qO2orKylkPWksaiE9PW8mJihkPW4uY2xvbmUoZCwhMCwhMCksZiYmbi5tZXJnZShnLHZiKGQsInNjcmlwdCIpKSksYi5jYWxsKHRoaXNbal0sZCxqKTtpZihmKWZvcihoPWdbZy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxuLm1hcChnLHpiKSxqPTA7Zj5qO2orKylkPWdbal0scGIudGVzdChkLnR5cGV8fCIiKSYmIW4uX2RhdGEoZCwiZ2xvYmFsRXZhbCIpJiZuLmNvbnRhaW5zKGgsZCkmJihkLnNyYz9uLl9ldmFsVXJsJiZuLl9ldmFsVXJsKGQuc3JjKTpuLmdsb2JhbEV2YWwoKGQudGV4dHx8ZC50ZXh0Q29udGVudHx8ZC5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKHJiLCIiKSkpO2k9Yz1udWxsfXJldHVybiB0aGlzfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZz1uKGEpLGg9Zy5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbihnW2RdKVtiXShjKSxmLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBEYixFYj17fTtmdW5jdGlvbiBGYihiLGMpe3ZhciBkPW4oYy5jcmVhdGVFbGVtZW50KGIpKS5hcHBlbmRUbyhjLmJvZHkpLGU9YS5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZT9hLmdldERlZmF1bHRDb21wdXRlZFN0eWxlKGRbMF0pLmRpc3BsYXk6bi5jc3MoZFswXSwiZGlzcGxheSIpO3JldHVybiBkLmRldGFjaCgpLGV9ZnVuY3Rpb24gR2IoYSl7dmFyIGI9eixjPUViW2FdO3JldHVybiBjfHwoYz1GYihhLGIpLCJub25lIiE9PWMmJmN8fChEYj0oRGJ8fG4oIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKSkuYXBwZW5kVG8oYi5kb2N1bWVudEVsZW1lbnQpLGI9KERiWzBdLmNvbnRlbnRXaW5kb3d8fERiWzBdLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsYi53cml0ZSgpLGIuY2xvc2UoKSxjPUZiKGEsYiksRGIuZGV0YWNoKCkpLEViW2FdPWMpLGN9IWZ1bmN0aW9uKCl7dmFyIGEsYixjPXouY3JlYXRlRWxlbWVudCgiZGl2IiksZD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowIjtjLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxhLnN0eWxlLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsbC5vcGFjaXR5PS9eMC41Ly50ZXN0KGEuc3R5bGUub3BhY2l0eSksbC5jc3NGbG9hdD0hIWEuc3R5bGUuY3NzRmxvYXQsYy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixsLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxhPWM9bnVsbCxsLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXt2YXIgYSxjLGUsZjtpZihudWxsPT1iKXtpZihhPXouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSwhYSlyZXR1cm47Zj0iYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi05OTk5cHgiLGM9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYS5hcHBlbmRDaGlsZChjKS5hcHBlbmRDaGlsZChlKSxiPSExLHR5cGVvZiBlLnN0eWxlLnpvb20hPT1MJiYoZS5zdHlsZS5jc3NUZXh0PWQrIjt3aWR0aDoxcHg7cGFkZGluZzoxcHg7em9vbToxIixlLmlubmVySFRNTD0iPGRpdj48L2Rpdj4iLGUuZmlyc3RDaGlsZC5zdHlsZS53aWR0aD0iNXB4IixiPTMhPT1lLm9mZnNldFdpZHRoKSxhLnJlbW92ZUNoaWxkKGMpLGE9Yz1lPW51bGx9cmV0dXJuIGJ9fSgpO3ZhciBIYj0vXm1hcmdpbi8sSWI9bmV3IFJlZ0V4cCgiXigiK1QrIikoPyFweClbYS16JV0rJCIsImkiKSxKYixLYixMYj0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhKYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYSxudWxsKX0sS2I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxKYihhKSxnPWM/Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdOnZvaWQgMCxjJiYoIiIhPT1nfHxuLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKXx8KGc9bi5zdHlsZShhLGIpKSxJYi50ZXN0KGcpJiZIYi50ZXN0KGIpJiYoZD1oLndpZHRoLGU9aC5taW5XaWR0aCxmPWgubWF4V2lkdGgsaC5taW5XaWR0aD1oLm1heFdpZHRoPWgud2lkdGg9ZyxnPWMud2lkdGgsaC53aWR0aD1kLGgubWluV2lkdGg9ZSxoLm1heFdpZHRoPWYpKSx2b2lkIDA9PT1nP2c6ZysiIn0pOnouZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKEpiPWZ1bmN0aW9uKGEpe3JldHVybiBhLmN1cnJlbnRTdHlsZX0sS2I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxKYihhKSxnPWM/Y1tiXTp2b2lkIDAsbnVsbD09ZyYmaCYmaFtiXSYmKGc9aFtiXSksSWIudGVzdChnKSYmIUxiLnRlc3QoYikmJihkPWgubGVmdCxlPWEucnVudGltZVN0eWxlLGY9ZSYmZS5sZWZ0LGYmJihlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksaC5sZWZ0PSJmb250U2l6ZSI9PT1iPyIxZW0iOmcsZz1oLnBpeGVsTGVmdCsicHgiLGgubGVmdD1kLGYmJihlLmxlZnQ9ZikpLHZvaWQgMD09PWc/ZzpnKyIifHwiYXV0byJ9KTtmdW5jdGlvbiBNYihhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXt2YXIgYz1hKCk7aWYobnVsbCE9YylyZXR1cm4gYz92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19IWZ1bmN0aW9uKCl7dmFyIGIsYyxkLGUsZixnLGg9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxpPSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTk5OTlweCIsaj0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowIjtoLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixiPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxiLnN0eWxlLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsbC5vcGFjaXR5PS9eMC41Ly50ZXN0KGIuc3R5bGUub3BhY2l0eSksbC5jc3NGbG9hdD0hIWIuc3R5bGUuY3NzRmxvYXQsaC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGguY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixsLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxiPWg9bnVsbCxuLmV4dGVuZChsLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtpZihudWxsIT1jKXJldHVybiBjO3ZhciBhLGIsZCxlPXouY3JlYXRlRWxlbWVudCgiZGl2IiksZj16LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07aWYoZilyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxlLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixhPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYS5zdHlsZS5jc3NUZXh0PWksZi5hcHBlbmRDaGlsZChhKS5hcHBlbmRDaGlsZChlKSxlLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsYj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLGJbMF0uc3R5bGUuY3NzVGV4dD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSIsZD0wPT09YlswXS5vZmZzZXRIZWlnaHQsYlswXS5zdHlsZS5kaXNwbGF5PSIiLGJbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kJiYwPT09YlswXS5vZmZzZXRIZWlnaHQsZi5yZW1vdmVDaGlsZChhKSxlPWY9bnVsbCxjfSxib3hTaXppbmc6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZCYmaygpLGR9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmsoKSxlfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmsoKSxmfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGIsYyxkLGU7aWYobnVsbD09ZyYmYS5nZXRDb21wdXRlZFN0eWxlKXtpZihiPXouZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSwhYilyZXR1cm47Yz16LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxjLnN0eWxlLmNzc1RleHQ9aSxiLmFwcGVuZENoaWxkKGMpLmFwcGVuZENoaWxkKGQpLGU9ZC5hcHBlbmRDaGlsZCh6LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxlLnN0eWxlLmNzc1RleHQ9ZC5zdHlsZS5jc3NUZXh0PWosZS5zdHlsZS5tYXJnaW5SaWdodD1lLnN0eWxlLndpZHRoPSIwIixkLnN0eWxlLndpZHRoPSIxcHgiLGc9IXBhcnNlRmxvYXQoKGEuZ2V0Q29tcHV0ZWRTdHlsZShlLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpLGIucmVtb3ZlQ2hpbGQoYyl9cmV0dXJuIGd9fSk7ZnVuY3Rpb24gaygpe3ZhciBiLGMsaD16LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07aCYmKGI9ei5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPXouY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zdHlsZS5jc3NUZXh0PWksaC5hcHBlbmRDaGlsZChiKS5hcHBlbmRDaGlsZChjKSxjLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7dG9wOjElIixuLnN3YXAoaCxudWxsIT1oLnN0eWxlLnpvb20/e3pvb206MX06e30sZnVuY3Rpb24oKXtkPTQ9PT1jLm9mZnNldFdpZHRofSksZT0hMCxmPSExLGc9ITAsYS5nZXRDb21wdXRlZFN0eWxlJiYoZj0iMSUiIT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShjLG51bGwpfHx7fSkudG9wLGU9IjRweCI9PT0oYS5nZXRDb21wdXRlZFN0eWxlKGMsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoKSxoLnJlbW92ZUNoaWxkKGIpLGM9aD1udWxsKX19KCksbi5zd2FwPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZz17fTtmb3IoZiBpbiBiKWdbZl09YS5zdHlsZVtmXSxhLnN0eWxlW2ZdPWJbZl07ZT1jLmFwcGx5KGEsZHx8W10pO2ZvcihmIGluIGIpYS5zdHlsZVtmXT1nW2ZdO3JldHVybiBlfTt2YXIgTmI9L2FscGhhXChbXildKlwpL2ksT2I9L29wYWNpdHlccyo9XHMqKFteKV0qKS8sUGI9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFFiPW5ldyBSZWdFeHAoIl4oIitUKyIpKC4qKSQiLCJpIiksUmI9bmV3IFJlZ0V4cCgiXihbKy1dKT0oIitUKyIpIiwiaSIpLFNiPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxUYj17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6NDAwfSxVYj1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFZiKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1VYi5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VWJbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gV2IoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bi5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlYoZCkmJihmW2ddPW4uX2RhdGEoZCwib2xkZGlzcGxheSIsR2IoZC5ub2RlTmFtZSkpKSk6ZltnXXx8KGU9VihkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZuLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFhiKGEsYixjKXt2YXIgZD1RYi5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFliKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1uLmNzcyhhLGMrVVtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW4uY3NzKGEsInBhZGRpbmciK1VbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW4uY3NzKGEsImJvcmRlciIrVVtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW4uY3NzKGEsInBhZGRpbmciK1VbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW4uY3NzKGEsImJvcmRlciIrVVtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWmIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUpiKGEpLGc9bC5ib3hTaXppbmcoKSYmImJvcmRlci1ib3giPT09bi5jc3MoYSwiYm94U2l6aW5nIiwhMSxmKTtpZigwPj1lfHxudWxsPT1lKXtpZihlPUtiKGEsYixmKSwoMD5lfHxudWxsPT1lKSYmKGU9YS5zdHlsZVtiXSksSWIudGVzdChlKSlyZXR1cm4gZTtkPWcmJihsLmJveFNpemluZ1JlbGlhYmxlKCl8fGU9PT1hLnN0eWxlW2JdKSxlPXBhcnNlRmxvYXQoZSl8fDB9cmV0dXJuIGUrWWIoYSxiLGN8fChnPyJib3JkZXIiOiJjb250ZW50IiksZCxmKSsicHgifW4uZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9S2IoYSwib3BhY2l0eSIpO3JldHVybiIiPT09Yz8iMSI6Y319fX0sY3NzTnVtYmVyOntjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6bC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1uLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1WYihpLGgpKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVJiLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobi5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG4uY3NzTnVtYmVyW2hdfHwoYys9InB4IiksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09IiIsaVtiXT1jfWNhdGNoKGope319fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9bi5jYW1lbENhc2UoYik7cmV0dXJuIGI9bi5jc3NQcm9wc1toXXx8KG4uY3NzUHJvcHNbaF09VmIoYS5zdHlsZSxoKSksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLGcmJiJnZXQiaW4gZyYmKGY9Zy5nZXQoYSwhMCxjKSksdm9pZCAwPT09ZiYmKGY9S2IoYSxiLGQpKSwibm9ybWFsIj09PWYmJmIgaW4gVGImJihmPVRiW2JdKSwiIj09PWN8fGM/KGU9cGFyc2VGbG9hdChmKSxjPT09ITB8fG4uaXNOdW1lcmljKGUpP2V8fDA6Zik6Zn19KSxuLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gYz8wPT09YS5vZmZzZXRXaWR0aCYmUGIudGVzdChuLmNzcyhhLCJkaXNwbGF5IikpP24uc3dhcChhLFNiLGZ1bmN0aW9uKCl7cmV0dXJuIFpiKGEsYixkKX0pOlpiKGEsYixkKTp2b2lkIDB9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9ZCYmSmIoYSk7cmV0dXJuIFhiKGEsYyxkP1liKGEsYixkLGwuYm94U2l6aW5nKCkmJiJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZSksZSk6MCl9fX0pLGwub3BhY2l0eXx8KG4uY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIE9iLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT8uMDEqcGFyc2VGbG9hdChSZWdFeHAuJDEpKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnN0eWxlLGQ9YS5jdXJyZW50U3R5bGUsZT1uLmlzTnVtZXJpYyhiKT8iYWxwaGEob3BhY2l0eT0iKzEwMCpiKyIpIjoiIixmPWQmJmQuZmlsdGVyfHxjLmZpbHRlcnx8IiI7Yy56b29tPTEsKGI+PTF8fCIiPT09YikmJiIiPT09bi50cmltKGYucmVwbGFjZShOYiwiIikpJiZjLnJlbW92ZUF0dHJpYnV0ZSYmKGMucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKSwiIj09PWJ8fGQmJiFkLmZpbHRlcil8fChjLmZpbHRlcj1OYi50ZXN0KGYpP2YucmVwbGFjZShOYixlKTpmKyIgIitlKX19KSxuLmNzc0hvb2tzLm1hcmdpblJpZ2h0PU1iKGwucmVsaWFibGVNYXJnaW5SaWdodCxmdW5jdGlvbihhLGIpe3JldHVybiBiP24uc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxLYixbYSwibWFyZ2luUmlnaHQiXSk6dm9pZCAwfSksbi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXtmb3IodmFyIGQ9MCxlPXt9LGY9InN0cmluZyI9PXR5cGVvZiBjP2Muc3BsaXQoIiAiKTpbY107ND5kO2QrKyllW2ErVVtkXStiXT1mW2RdfHxmW2QtMl18fGZbMF07cmV0dXJuIGV9fSxIYi50ZXN0KGEpfHwobi5jc3NIb29rc1thK2JdLnNldD1YYil9KSxuLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFcodGhpcyxmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPXt9LGc9MDtpZihuLmlzQXJyYXkoYikpe2ZvcihkPUpiKGEpLGU9Yi5sZW5ndGg7ZT5nO2crKylmW2JbZ11dPW4uY3NzKGEsYltnXSwhMSxkKTtyZXR1cm4gZn1yZXR1cm4gdm9pZCAwIT09Yz9uLnN0eWxlKGEsYixjKTpuLmNzcyhhLGIpCn0sYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gV2IodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gV2IodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Vih0aGlzKT9uKHRoaXMpLnNob3coKTpuKHRoaXMpLmhpZGUoKX0pfX0pO2Z1bmN0aW9uICRiKGEsYixjLGQsZSl7cmV0dXJuIG5ldyAkYi5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW4uVHdlZW49JGIsJGIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjokYixpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwobi5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPSRiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTokYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz0kYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9Yj10aGlzLm9wdGlvbnMuZHVyYXRpb24/bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTokYi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSwkYi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9JGIucHJvdG90eXBlLCRiLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbD09YS5lbGVtW2EucHJvcF18fGEuZWxlbS5zdHlsZSYmbnVsbCE9YS5lbGVtLnN0eWxlW2EucHJvcF0/KGI9bi5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApOmEuZWxlbVthLnByb3BdfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6YS5lbGVtLnN0eWxlJiYobnVsbCE9YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV18fG4uY3NzSG9va3NbYS5wcm9wXSk/bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sJGIucHJvcEhvb2tzLnNjcm9sbFRvcD0kYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9fSxuLmZ4PSRiLnByb3RvdHlwZS5pbml0LG4uZnguc3RlcD17fTt2YXIgX2IsYWMsYmM9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNjPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitUKyIpKFthLXolXSopJCIsImkiKSxkYz0vcXVldWVIb29rcyQvLGVjPVtqY10sZmM9eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYiksZD1jLmN1cigpLGU9Y2MuZXhlYyhiKSxmPWUmJmVbM118fChuLmNzc051bWJlclthXT8iIjoicHgiKSxnPShuLmNzc051bWJlclthXXx8InB4IiE9PWYmJitkKSYmY2MuZXhlYyhuLmNzcyhjLmVsZW0sYSkpLGg9MSxpPTIwO2lmKGcmJmdbM10hPT1mKXtmPWZ8fGdbM10sZT1lfHxbXSxnPStkfHwxO2RvIGg9aHx8Ii41IixnLz1oLG4uc3R5bGUoYy5lbGVtLGEsZytmKTt3aGlsZShoIT09KGg9Yy5jdXIoKS9kKSYmMSE9PWgmJi0taSl9cmV0dXJuIGUmJihnPWMuc3RhcnQ9K2d8fCtkfHwwLGMudW5pdD1mLGMuZW5kPWVbMV0/ZysoZVsxXSsxKSplWzJdOitlWzJdKSxjfV19O2Z1bmN0aW9uIGdjKCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtfYj12b2lkIDB9KSxfYj1uLm5vdygpfWZ1bmN0aW9uIGhjKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VVtlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIGljKGEsYixjKXtmb3IodmFyIGQsZT0oZmNbYl18fFtdKS5jb25jYXQoZmNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gamMoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbT10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVihhKSxyPW4uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bi5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG0uYWx3YXlzKGZ1bmN0aW9uKCl7bS5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1uLmNzcyhhLCJkaXNwbGF5Iiksaz1HYihhLm5vZGVOYW1lKSwibm9uZSI9PT1qJiYoaj1rKSwiaW5saW5lIj09PWomJiJub25lIj09PW4uY3NzKGEsImZsb2F0IikmJihsLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09az9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixsLnNocmlua1dyYXBCbG9ja3MoKXx8bS5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGJjLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG4uc3R5bGUoYSxkKX1pZighbi5pc0VtcHR5T2JqZWN0KG8pKXtyPyJoaWRkZW4iaW4gciYmKHE9ci5oaWRkZW4pOnI9bi5fZGF0YShhLCJmeHNob3ciLHt9KSxmJiYoci5oaWRkZW49IXEpLHE/bihhKS5zaG93KCk6bS5kb25lKGZ1bmN0aW9uKCl7bihhKS5oaWRlKCl9KSxtLmRvbmUoZnVuY3Rpb24oKXt2YXIgYjtuLl9yZW1vdmVEYXRhKGEsImZ4c2hvdyIpO2ZvcihiIGluIG8pbi5zdHlsZShhLGIsb1tiXSl9KTtmb3IoZCBpbiBvKWc9aWMocT9yW2RdOjAsZCxtKSxkIGluIHJ8fChyW2RdPWcuc3RhcnQscSYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD0id2lkdGgiPT09ZHx8ImhlaWdodCI9PT1kPzE6MCkpfX1mdW5jdGlvbiBrYyhhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPW4uY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sbi5pc0FycmF5KGYpJiYoZT1mWzFdLGY9YVtjXT1mWzBdKSxjIT09ZCYmKGFbZF09ZixkZWxldGUgYVtjXSksZz1uLmNzc0hvb2tzW2RdLGcmJiJleHBhbmQiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIGxjKGEsYixjKXt2YXIgZCxlLGY9MCxnPWVjLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPV9ifHxnYygpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6X2J8fGdjKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1uLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihrYyhrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9ZWNbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBuLm1hcChrLGljLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQobGMse3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEuc3BsaXQoIiAiKTtmb3IodmFyIGMsZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyljPWFbZF0sZmNbY109ZmNbY118fFtdLGZjW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/ZWMudW5zaGlmdChhKTplYy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPSJmeCIpLGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe24uaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmbi5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LG4uZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKFYpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW4uaXNFbXB0eU9iamVjdChhKSxmPW4uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1sYyh0aGlzLG4uZXh0ZW5kKHt9LGEpLGYpOyhlfHxuLl9kYXRhKHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9bi50aW1lcnMsZz1uLl9kYXRhKHRoaXMpO2lmKGUpZ1tlXSYmZ1tlXS5zdG9wJiZkKGdbZV0pO2Vsc2UgZm9yKGUgaW4gZylnW2VdJiZnW2VdLnN0b3AmJmRjLnRlc3QoZSkmJmQoZ1tlXSk7Zm9yKGU9Zi5sZW5ndGg7ZS0tOylmW2VdLmVsZW0hPT10aGlzfHxudWxsIT1hJiZmW2VdLnF1ZXVlIT09YXx8KGZbZV0uYW5pbS5zdG9wKGMpLGI9ITEsZi5zcGxpY2UoZSwxKSk7KGJ8fCFjKSYmbi5kZXF1ZXVlKHRoaXMsYSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiBhIT09ITEmJihhPWF8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiLGM9bi5fZGF0YSh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9bi50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG4ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbi5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW4uZm5bYl07bi5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGhjKGIsITApLGEsZCxlKX19KSxuLmVhY2goe3NsaWRlRG93bjpoYygic2hvdyIpLHNsaWRlVXA6aGMoImhpZGUiKSxzbGlkZVRvZ2dsZTpoYygidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksbi50aW1lcnM9W10sbi5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj1uLnRpbWVycyxjPTA7Zm9yKF9iPW4ubm93KCk7YzxiLmxlbmd0aDtjKyspYT1iW2NdLGEoKXx8YltjXSE9PWF8fGIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8bi5meC5zdG9wKCksX2I9dm9pZCAwfSxuLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe24udGltZXJzLnB1c2goYSksYSgpP24uZnguc3RhcnQoKTpuLnRpbWVycy5wb3AoKX0sbi5meC5pbnRlcnZhbD0xMyxuLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7YWN8fChhYz1zZXRJbnRlcnZhbChuLmZ4LnRpY2ssbi5meC5pbnRlcnZhbCkpfSxuLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGFjKSxhYz1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bi5meD9uLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU9ei5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLGUuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLGM9ei5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxkPWMuYXBwZW5kQ2hpbGQoei5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksYj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLGEuc3R5bGUuY3NzVGV4dD0idG9wOjFweCIsbC5nZXRTZXRBdHRyaWJ1dGU9InQiIT09ZS5jbGFzc05hbWUsbC5zdHlsZT0vdG9wLy50ZXN0KGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxsLmhyZWZOb3JtYWxpemVkPSIvYSI9PT1hLmdldEF0dHJpYnV0ZSgiaHJlZiIpLGwuY2hlY2tPbj0hIWIudmFsdWUsbC5vcHRTZWxlY3RlZD1kLnNlbGVjdGVkLGwuZW5jdHlwZT0hIXouY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsYy5kaXNhYmxlZD0hMCxsLm9wdERpc2FibGVkPSFkLmRpc2FibGVkLGI9ei5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGIuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLGwuaW5wdXQ9IiI9PT1iLmdldEF0dHJpYnV0ZSgidmFsdWUiKSxiLnZhbHVlPSJ0IixiLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksbC5yYWRpb1ZhbHVlPSJ0Ij09PWIudmFsdWUsYT1iPWM9ZD1lPW51bGx9KCk7dmFyIG1jPS9cci9nO24uZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1uLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMsbih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOm4uaXNBcnJheShlKSYmKGU9bi5tYXAoZSxmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjphKyIifSkpLGI9bi52YWxIb29rc1t0aGlzLnR5cGVdfHxuLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmInNldCJpbiBiJiZ2b2lkIDAhPT1iLnNldCh0aGlzLGUsInZhbHVlIil8fCh0aGlzLnZhbHVlPWUpKX0pO2lmKGUpcmV0dXJuIGI9bi52YWxIb29rc1tlLnR5cGVdfHxuLnZhbEhvb2tzW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmImdldCJpbiBiJiZ2b2lkIDAhPT0oYz1iLmdldChlLCJ2YWx1ZSIpKT9jOihjPWUudmFsdWUsInN0cmluZyI9PXR5cGVvZiBjP2MucmVwbGFjZShtYywiIik6bnVsbD09Yz8iIjpjKX19fSksbi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1uLmZpbmQuYXR0cihhLCJ2YWx1ZSIpO3JldHVybiBudWxsIT1iP2I6bi50ZXh0KGEpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChsLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZuLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bihjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW4ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxuLmluQXJyYXkobi52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bi52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uaXNBcnJheShiKT9hLmNoZWNrZWQ9bi5pbkFycmF5KG4oYSkudmFsKCksYik+PTA6dm9pZCAwfX0sbC5jaGVja09ufHwobi52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBuYyxvYyxwYz1uLmV4cHIuYXR0ckhhbmRsZSxxYz0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHJjPWwuZ2V0U2V0QXR0cmlidXRlLHNjPWwuaW5wdXQ7bi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVyh0aGlzLG4uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09TD9uLnByb3AoYSxiLGMpOigxPT09ZiYmbi5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bi5hdHRySG9va3NbYl18fChuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP29jOm5jKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBuLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRik7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1uLnByb3BGaXhbY118fGMsbi5leHByLm1hdGNoLmJvb2wudGVzdChjKT9zYyYmcmN8fCFxYy50ZXN0KGMpP2FbZF09ITE6YVtuLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm4uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHJjP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWwucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm4ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksb2M9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9uLnJlbW92ZUF0dHIoYSxjKTpzYyYmcmN8fCFxYy50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFyYyYmbi5wcm9wRml4W2NdfHxjLGMpOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbi5lYWNoKG4uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9cGNbYl18fG4uZmluZC5hdHRyO3BjW2JdPXNjJiZyY3x8IXFjLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPXBjW2JdLHBjW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxwY1tiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbi5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSksc2MmJnJjfHwobi5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm5jJiZuYy5zZXQoYSxiLGMpfX0pLHJjfHwobmM9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxwYy5pZD1wYy5uYW1lPXBjLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG4udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bmMuc2V0fSxuLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bmMuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxuLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bi5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGwuc3R5bGV8fChuLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciB0Yz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx1Yz0vXig/OmF8YXJlYSkkL2k7bi5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVyh0aGlzLG4ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1uLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxuLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW4uaXNYTUxEb2MoYSksZiYmKGI9bi5wcm9wRml4W2JdfHxiLGU9bi5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW4uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6dGMudGVzdChhLm5vZGVOYW1lKXx8dWMudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxsLmhyZWZOb3JtYWxpemVkfHxuLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXtuLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxuLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe24ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxsLmVuY3R5cGV8fChuLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdmM9L1tcdFxyXG5cZl0vZztuLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG4uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEYpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodmMsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW4udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihuLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtuKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChGKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHZjLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP24udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXtuKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1uKHRoaXMpLGY9YS5tYXRjaChGKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09THx8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpuLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodmMsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG4uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe24uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG4uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHdjPW4ubm93KCkseGM9L1w/Lyx5Yz0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO24ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bi50cmltKGIrIiIpO3JldHVybiBlJiYhbi50cmltKGUucmVwbGFjZSh5YyxmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTpuLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG4ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bi5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHpjLEFjLEJjPS8jLiokLyxDYz0vKFs/Jl0pXz1bXiZdKi8sRGM9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxFYz0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxGYz0vXig/OkdFVHxIRUFEKSQvLEdjPS9eXC9cLy8sSGM9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSWM9e30sSmM9e30sS2M9IiovIi5jb25jYXQoIioiKTt0cnl7QWM9bG9jYXRpb24uaHJlZn1jYXRjaChMYyl7QWM9ei5jcmVhdGVFbGVtZW50KCJhIiksQWMuaHJlZj0iIixBYz1BYy5ocmVmfXpjPUhjLmV4ZWMoQWMudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIE1jKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEYpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTmMoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SmM7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBPYyhhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZuLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gUGMoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUWMoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6QWMsdHlwZToiR0VUIixpc0xvY2FsOkVjLnRlc3QoemNbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6S2MsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpuLnBhcnNlSlNPTiwidGV4dCB4bWwiOm4ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP09jKE9jKGEsbi5hamF4U2V0dGluZ3MpLGIpOk9jKG4uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOk1jKEljKSxhamF4VHJhbnNwb3J0Ok1jKEpjKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1uLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxtPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9uKGwpOm4uZXZlbnQsbz1uLkRlZmVycmVkKCkscD1uLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPURjLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fEFjKSsiIikucmVwbGFjZShCYywiIikucmVwbGFjZShHYyx6Y1sxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1uLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEYpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUhjLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09emNbMV0mJmNbMl09PT16Y1syXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oemNbM118fCgiaHR0cDoiPT09emNbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1uLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTmMoSWMsayxiLHYpLDI9PT10KXJldHVybiB2O2g9ay5nbG9iYWwsaCYmMD09PW4uYWN0aXZlKysmJm4uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRmMudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHhjLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUNjLnRlc3QoZSk/ZS5yZXBsYWNlKENjLCIkMV89Iit3YysrKTplKyh4Yy50ZXN0KGUpPyImIjoiPyIpKyJfPSIrd2MrKykpLGsuaWZNb2RpZmllZCYmKG4ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixuLmxhc3RNb2RpZmllZFtlXSksbi5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG4uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0tjKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1OYyhKYyxrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm0udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PVBjKGssdixjKSksdT1RYyhrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobi5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG4uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZtLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihtLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG4uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe25bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG4uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG4uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG4uZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGEsYil7bi5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vbihiLGEpfX0pLG4uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbi5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW4oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG4uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXtuKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1uLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtuKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG4odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG4uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFsLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxuLmNzcyhhLCJkaXNwbGF5IikpfSxuLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFuLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBSYz0vJTIwL2csU2M9L1xbXF0kLyxUYz0vXHI/XG4vZyxVYz0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVmM9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFdjKGEsYixjLGQpe3ZhciBlO2lmKG4uaXNBcnJheShiKSluLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFNjLnRlc3QoYSk/ZChhLGUpOldjKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1uLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilXYyhhKyJbIitlKyJdIixiW2VdLGMsZCl9bi5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bi5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW4uYWpheFNldHRpbmdzJiZuLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW4uaXNQbGFpbk9iamVjdChhKSluLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVdjKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFJjLCIrIil9LG4uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW4ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP24ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW4odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZWYy50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVWMudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVgudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1uKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bi5pc0FycmF5KGMpP24ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShUYywiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoVGMsIlxyXG4iKX19KS5nZXQoKX19KSxuLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmJGMoKXx8X2MoKX06JGM7dmFyIFhjPTAsWWM9e30sWmM9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5BY3RpdmVYT2JqZWN0JiZuKGEpLm9uKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFljKVljW2FdKHZvaWQgMCwhMCl9KSxsLmNvcnM9ISFaYyYmIndpdGhDcmVkZW50aWFscyJpbiBaYyxaYz1sLmFqYXg9ISFaYyxaYyYmbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxsLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytYYztpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFljW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW4ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WWNbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gJGMoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gX2MoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1uLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXouaGVhZHx8bigiaGVhZCIpWzBdfHx6LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9ei5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgYWQ9W10sYmQ9Lyg9KVw/KD89JnwkKXxcP1w/LztuLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9YWQucG9wKCl8fG4uZXhwYW5kbysiXyIrd2MrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG4uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGJkLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYmQudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGJkLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh4Yy50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bi5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssYWQucHVzaChlKSksZyYmbi5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbi5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHo7dmFyIGQ9di5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW4uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbihlKS5yZW1vdmUoKSxuLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgY2Q9bi5mbi5sb2FkO24uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZjZClyZXR1cm4gY2QuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9YS5zbGljZShoLGEubGVuZ3RoKSxhPWEuc2xpY2UoMCxoKSksbi5pc0Z1bmN0aW9uKGIpPyhjPWIsYj12b2lkIDApOmImJiJvYmplY3QiPT10eXBlb2YgYiYmKGY9IlBPU1QiKSxnLmxlbmd0aD4wJiZuLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtlPWFyZ3VtZW50cyxnLmh0bWwoZD9uKCI8ZGl2PiIpLmFwcGVuZChuLnBhcnNlSFRNTChhKSkuZmluZChkKTphKX0pLmNvbXBsZXRlKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGMsZXx8W2EucmVzcG9uc2VUZXh0LGIsYV0pfSksdGhpc30sbi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ3JlcChuLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07dmFyIGRkPWEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Z1bmN0aW9uIGVkKGEpe3JldHVybiBuLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGU/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9bi5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1uLmNzcyhhLCJwb3NpdGlvbiIpLGw9bihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9bi5jc3MoYSwidG9wIiksaT1uLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmbi5pbkFycmF5KCJhdXRvIixbZixpXSk+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG4uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxtKTpsLmNzcyhtKX19LG4uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtuLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG4uY29udGFpbnMoYixlKT8odHlwZW9mIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09TCYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1lZChmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bi5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbi5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1uLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bi5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3Atbi5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW4uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8ZGQ7d2hpbGUoYSYmIW4ubm9kZU5hbWUoYSwiaHRtbCIpJiYic3RhdGljIj09PW4uY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8ZGR9KX19KSxuLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0vWS8udGVzdChiKTtuLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBXKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmPWVkKGEpO3JldHVybiB2b2lkIDA9PT1lP2Y/YiBpbiBmP2ZbYl06Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP24oZikuc2Nyb2xsTGVmdCgpOmUsYz9lOm4oZikuc2Nyb2xsVG9wKCkpOmFbZF09ZSl9LGEsZCxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLG4uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYl09TWIobC5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/KGM9S2IoYSxiKSxJYi50ZXN0KGMpP24oYSkucG9zaXRpb24oKVtiXSsicHgiOmMpOnZvaWQgMH0pfSksbi5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFcodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxuLmZuLmFuZFNlbGY9bi5mbi5hZGRCYWNrLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBufSk7dmFyIGZkPWEualF1ZXJ5LGdkPWEuJDtyZXR1cm4gbi5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1uJiYoYS4kPWdkKSxiJiZhLmpRdWVyeT09PW4mJihhLmpRdWVyeT1mZCksbn0sdHlwZW9mIGI9PT1MJiYoYS5qUXVlcnk9YS4kPW4pLG59KTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/jquery.js,importbuddy/js/jquery.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js
KGZ1bmN0aW9uKCQpewogCiAgICAkLmZuLmV4dGVuZCh7IAogICAgICAgICAKICAgICAgICBsZWFuTW9kYWw6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKIAkJCQogCQkJdmFyIHdpbiA9IHdpbmRvdy5kaWFsb2dBcmd1bWVudHMgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7CiAJCQkKICAgICAgICAgICAgdmFyIGRlZmF1bHRzID0gewogICAgICAgICAgICAgICAgdG9wOiAxMDAsCiAgICAgICAgICAgICAgICBvdmVybGF5OiAwLjUsCiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogbnVsbAogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG92ZXJsYXkgPSAkKCI8ZGl2IGlkPSdsZWFuX292ZXJsYXknPjwvZGl2PiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgJCgiYm9keSIpLmFwcGVuZChvdmVybGF5KTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgb3B0aW9ucyA9ICAkLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7CiAKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgCXZhciBtb2RhbF9pZCA9ICQodGhpcykuYXR0cigiaHJlZiIpOwoKCQkJCSQoIiNsZWFuX292ZXJsYXkiKS5jbGljayhmdW5jdGlvbigpIHsgCiAgICAgICAgICAgICAgICAgICAgIGNsb3NlX21vZGFsKG1vZGFsX2lkKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICQoby5jbG9zZUJ1dHRvbikuY2xpY2soZnVuY3Rpb24oKSB7IAogICAgICAgICAgICAgICAgICAgICBjbG9zZV9tb2RhbChtb2RhbF9pZCk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgIAl2YXIgbW9kYWxfaGVpZ2h0ID0gJChtb2RhbF9pZCkub3V0ZXJIZWlnaHQoZmFsc2UpOwogICAgICAgIAkgIAl2YXIgbW9kYWxfd2lkdGggPSAkKG1vZGFsX2lkKS5vdXRlcldpZHRoKGZhbHNlKTsKCiAgICAgICAgCQkkKCcjbGVhbl9vdmVybGF5JykuY3NzKHsgJ2Rpc3BsYXknIDogJ2Jsb2NrJywgb3BhY2l0eSA6IDAgfSk7CgogICAgICAgIAkJJCgnI2xlYW5fb3ZlcmxheScpLmZhZGVUbygyMDAsby5vdmVybGF5KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5jc3MoeyAKICAgICAgICAJCQogICAgICAgIAkJCSdkaXNwbGF5JyA6ICdibG9jaycsCiAgICAgICAgCQkJJ3Bvc2l0aW9uJyA6ICdmaXhlZCcsCiAgICAgICAgCQkJJ29wYWNpdHknIDogMCwKICAgICAgICAJCQknei1pbmRleCc6IDExMDAwLAogICAgICAgIAkJCSdsZWZ0JyA6IDUwICsgJyUnLAogICAgICAgIAkJCSdtYXJnaW4tbGVmdCcgOiAtKG1vZGFsX3dpZHRoLzIpICsgInB4IiwKICAgICAgICAJCQkndG9wJyA6IG8udG9wICsgInB4IgogICAgICAgIAkJCiAgICAgICAgCQl9KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5mYWRlVG8oMjAwLDEpOwoKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIAl9KTsKICAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCgkJCWZ1bmN0aW9uIGNsb3NlX21vZGFsKG1vZGFsX2lkKXsKCiAgICAgICAgCQkkKCIjbGVhbl9vdmVybGF5IikuZmFkZU91dCgyMDApOwoKICAgICAgICAJCSQobW9kYWxfaWQpLmNzcyh7ICdkaXNwbGF5JyA6ICdub25lJyB9KTsKCQkJCgkJCX0KICAgIAogICAgICAgIH0KICAgIH0pOwogICAgIAp9KShqUXVlcnkpOw==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/jquery.simple-expand.min.js,importbuddy/js/jquery.simple-expand.min.js
LyogQ29weXJpZ2h0IChDKSAyMDEyIFN5bHZhaW4gSGFtZWwKUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3JlZGhvdHNseS9zaW1wbGUtZXhwYW5kCk1JVCBMaWNlbmNlOiBodHRwczovL3Jhdy5naXRodWIuY29tL3JlZGhvdHNseS9zaW1wbGUtZXhwYW5kL21hc3Rlci9saWNlbmNlLW1pdC50eHQgKi8KKGZ1bmN0aW9uKCQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcztlLmRlZmF1bHRzPXtoaWRlTW9kZToiZmFkZVRvZ2dsZSIsZGVmYXVsdFNlYXJjaE1vZGU6InBhcmVudCIsZGVmYXVsdFRhcmdldDoiLmNvbnRlbnQiLHRocm93T25NaXNzaW5nVGFyZ2V0OiEwLGtlZXBTdGF0ZUluQ29va2llOiExLGNvb2tpZU5hbWU6InNpbXBsZS1leHBhbmQifSxlLnNldHRpbmdzPXt9LCQuZXh0ZW5kKGUuc2V0dGluZ3MsZS5kZWZhdWx0cyksZS5maW5kTGV2ZWxPbmVEZWVwPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5maW5kKHQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiEkKHRoaXMpLnBhcmVudHNVbnRpbChlLG4pLmxlbmd0aH0pfSxlLnNldEluaXRpYWxTdGF0ZT1mdW5jdGlvbih0LG4pe3ZhciByPWUucmVhZFN0YXRlKHQpO3I/KHQucmVtb3ZlQ2xhc3MoImNvbGxhcHNlZCIpLmFkZENsYXNzKCJleHBhbmRlZCIpLGUuc2hvdyhuKSk6KHQucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIikuYWRkQ2xhc3MoImNvbGxhcHNlZCIpLGUuaGlkZShuKSl9LGUuaGlkZT1mdW5jdGlvbih0KXtlLnNldHRpbmdzLmhpZGVNb2RlPT09ImZhZGVUb2dnbGUiP3QuaGlkZSgpOmUuc2V0dGluZ3MuaGlkZU1vZGU9PT0iYmFzaWMiJiZ0LmhpZGUoKX0sZS5zaG93PWZ1bmN0aW9uKHQpe2Uuc2V0dGluZ3MuaGlkZU1vZGU9PT0iZmFkZVRvZ2dsZSI/dC5zaG93KCk6ZS5zZXR0aW5ncy5oaWRlTW9kZT09PSJiYXNpYyImJnQuc2hvdygpfSxlLmNoZWNrS2VlcFN0YXRlSW5Db29raWVQcmVjb25kaXRpb25zPWZ1bmN0aW9uKCl7aWYoZS5zZXR0aW5ncy5rZWVwU3RhdGVJbkNvb2tpZSYmJC5jb29raWU9PT11bmRlZmluZWQpdGhyb3cgbmV3IEVycm9yKCJzaW1wbGUtZXhwYW5kOiBrZWVwU3RhdGVJbkNvb2tpZSBvcHRpb24gcmVxdWlyZXMgJC5jb29raWUgdG8gYmUgZGVmaW5lZC4iKX0sZS5yZWFkQ29va2llPWZ1bmN0aW9uKCl7dmFyIHQ9JC5jb29raWUoZS5zZXR0aW5ncy5jb29raWVOYW1lKTtyZXR1cm4gdD09PW51bGx8fHQ9PT0iIj97fTpKU09OLnBhcnNlKHQpfSxlLnJlYWRTdGF0ZT1mdW5jdGlvbih0KXtpZighZS5zZXR0aW5ncy5rZWVwU3RhdGVJbkNvb2tpZSlyZXR1cm4hMTt2YXIgbj10LmF0dHIoIklkIik7aWYobj09PXVuZGVmaW5lZClyZXR1cm47dmFyIHI9ZS5yZWFkQ29va2llKCksaT1yW25dPT09ITB8fCExO3JldHVybiBpfSxlLnNhdmVTdGF0ZT1mdW5jdGlvbih0LG4pe2lmKCFlLnNldHRpbmdzLmtlZXBTdGF0ZUluQ29va2llKXJldHVybjt2YXIgcj10LmF0dHIoIklkIik7aWYocj09PXVuZGVmaW5lZClyZXR1cm47dmFyIGk9ZS5yZWFkQ29va2llKCk7aVtyXT1uLCQuY29va2llKGUuc2V0dGluZ3MuY29va2llTmFtZSxKU09OLnN0cmluZ2lmeShpKSx7cmF3OiEwLHBhdGg6d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSl9LGUudG9nZ2xlPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS50b2dnbGVDc3ModCk7cmV0dXJuIGUuc2V0dGluZ3MuaGlkZU1vZGU9PT0iZmFkZVRvZ2dsZSI/bi5mYWRlVG9nZ2xlKDE1MCk6ZS5zZXR0aW5ncy5oaWRlTW9kZT09PSJiYXNpYyI/bi50b2dnbGUoKTokLmlzRnVuY3Rpb24oZS5zZXR0aW5ncy5oaWRlTW9kZSkmJmUuc2V0dGluZ3MuaGlkZU1vZGUodCxuLHIpLGUuc2F2ZVN0YXRlKHQsciksITF9LGUudG9nZ2xlQ3NzPWZ1bmN0aW9uKGUpe3JldHVybiBlLmhhc0NsYXNzKCJleHBhbmRlZCIpPyhlLnRvZ2dsZUNsYXNzKCJjb2xsYXBzZWQgZXhwYW5kZWQiKSwhMSk6KGUudG9nZ2xlQ2xhc3MoImV4cGFuZGVkIGNvbGxhcHNlZCIpLCEwKX0sZS5maW5kVGFyZ2V0cz1mdW5jdGlvbih0LG4scil7dmFyIGk9W107aWYobj09PSJhYnNvbHV0ZSIpaT0kKHIpO2Vsc2UgaWYobj09PSJyZWxhdGl2ZSIpaT1lLmZpbmRMZXZlbE9uZURlZXAodCxyLHIpO2Vsc2UgaWYobj09PSJwYXJlbnQiKXt2YXIgcz10LnBhcmVudCgpO2RvIGk9ZS5maW5kTGV2ZWxPbmVEZWVwKHMscixyKSxpLmxlbmd0aD09PTAmJihzPXMucGFyZW50KCkpO3doaWxlKGkubGVuZ3RoPT09MCYmcy5sZW5ndGghPT0wKX1yZXR1cm4gaX0sZS5hY3RpdmF0ZT1mdW5jdGlvbih0LG4peyQuZXh0ZW5kKGUuc2V0dGluZ3MsbiksZS5jaGVja0tlZXBTdGF0ZUluQ29va2llUHJlY29uZGl0aW9ucygpLHQuZWFjaChmdW5jdGlvbigpe3ZhciB0PSQodGhpcyksbj10LmF0dHIoImRhdGEtZXhwYW5kZXItdGFyZ2V0Iil8fGUuc2V0dGluZ3MuZGVmYXVsdFRhcmdldCxyPXQuYXR0cigiZGF0YS1leHBhbmRlci10YXJnZXQtc2VhcmNoIil8fGUuc2V0dGluZ3MuZGVmYXVsdFNlYXJjaE1vZGUsaT1lLmZpbmRUYXJnZXRzKHQscixuKTtpZihpLmxlbmd0aD09PTApe2lmKGUuc2V0dGluZ3MudGhyb3dPbk1pc3NpbmdUYXJnZXQpdGhyb3cic2ltcGxlLWV4cGFuZDogVGFyZ2V0cyBub3QgZm91bmQiO3JldHVybiB0aGlzfWUuc2V0SW5pdGlhbFN0YXRlKHQsaSksdC5jbGljayhmdW5jdGlvbigpe3JldHVybiBlLnRvZ2dsZSh0LGkpfSl9KX19d2luZG93LlNpbXBsZUV4cGFuZD1lLCQuZm4uc2ltcGxlZXhwYW5kPWZ1bmN0aW9uKHQpe3ZhciBuPW5ldyBlO3JldHVybiBuLmFjdGl2YXRlKHRoaXMsdCksdGhpc319KShqUXVlcnkpOw==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/jquery.simple-expand.min.js,importbuddy/js/jquery.simple-expand.min.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/main.js,importbuddy/js/main.js
alF1ZXJ5LmZuLnZpc2libGUgPSBmdW5jdGlvbigpIHsKCXJldHVybiB0aGlzLmNzcygndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7Cn07CgpqUXVlcnkuZm4uaW52aXNpYmxlID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gdGhpcy5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7Cn07CgpqUXVlcnkuZm4udmlzaWJpbGl0eVRvZ2dsZSA9IGZ1bmN0aW9uKCkgewoJcmV0dXJuIHRoaXMuY3NzKCd2aXNpYmlsaXR5JywgZnVuY3Rpb24oaSwgdmlzaWJpbGl0eSkgewoJCXJldHVybiAodmlzaWJpbGl0eSA9PSAndmlzaWJsZScpID8gJ2hpZGRlbicgOiAndmlzaWJsZSc7Cgl9KTsKfTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/main.js,importbuddy/js/main.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/nprogress.js,importbuddy/js/nprogress.js
LyohIE5Qcm9ncmVzcyAoYykgMjAxMywgUmljbyBTdGEuIENydXoKICogIGh0dHA6Ly9yaWNvc3RhY3J1ei5jb20vbnByb2dyZXNzICovCgo7KGZ1bmN0aW9uKGZhY3RvcnkpIHsKCiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdmdW5jdGlvbicpIHsKICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICBkZWZpbmUoZmFjdG9yeSk7CiAgfSBlbHNlIHsKICAgIHRoaXMuTlByb2dyZXNzID0gZmFjdG9yeSgpOwogIH0KCn0pKGZ1bmN0aW9uKCkgewogIHZhciBOUHJvZ3Jlc3MgPSB7fTsKCiAgTlByb2dyZXNzLnZlcnNpb24gPSAnMC4xLjMnOwoKICB2YXIgU2V0dGluZ3MgPSBOUHJvZ3Jlc3Muc2V0dGluZ3MgPSB7CiAgICBtaW5pbXVtOiAwLjA4LAogICAgZWFzaW5nOiAnZWFzZScsCiAgICBwb3NpdGlvblVzaW5nOiAnJywKICAgIHNwZWVkOiAyMDAsCiAgICB0cmlja2xlOiB0cnVlLAogICAgdHJpY2tsZVJhdGU6IDAuMDIsCiAgICB0cmlja2xlU3BlZWQ6IDgwMCwKICAgIHNob3dTcGlubmVyOiB0cnVlLAogICAgYmFyU2VsZWN0b3I6ICdbcm9sZT0iYmFyIl0nLAogICAgc3Bpbm5lclNlbGVjdG9yOiAnW3JvbGU9InNwaW5uZXIiXScsCiAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9ImJhciIgcm9sZT0iYmFyIj48ZGl2IGNsYXNzPSJwZWciPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InNwaW5uZXIiIHJvbGU9InNwaW5uZXIiPjxkaXYgY2xhc3M9InNwaW5uZXItaWNvbiI+PC9kaXY+PC9kaXY+JwogIH07CgogIC8qKgogICAqIFVwZGF0ZXMgY29uZmlndXJhdGlvbi4KICAgKgogICAqICAgICBOUHJvZ3Jlc3MuY29uZmlndXJlKHsKICAgKiAgICAgICBtaW5pbXVtOiAwLjEKICAgKiAgICAgfSk7CiAgICovCiAgTlByb2dyZXNzLmNvbmZpZ3VyZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIHZhciBrZXksIHZhbHVlOwogICAgZm9yIChrZXkgaW4gb3B0aW9ucykgewogICAgICB2YWx1ZSA9IG9wdGlvbnNba2V5XTsKICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBTZXR0aW5nc1trZXldID0gdmFsdWU7CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfTsKCiAgLyoqCiAgICogTGFzdCBudW1iZXIuCiAgICovCgogIE5Qcm9ncmVzcy5zdGF0dXMgPSBudWxsOwoKICAvKioKICAgKiBTZXRzIHRoZSBwcm9ncmVzcyBiYXIgc3RhdHVzLCB3aGVyZSBgbmAgaXMgYSBudW1iZXIgZnJvbSBgMC4wYCB0byBgMS4wYC4KICAgKgogICAqICAgICBOUHJvZ3Jlc3Muc2V0KDAuNCk7CiAgICogICAgIE5Qcm9ncmVzcy5zZXQoMS4wKTsKICAgKi8KCiAgTlByb2dyZXNzLnNldCA9IGZ1bmN0aW9uKG4pIHsKICAgIHZhciBzdGFydGVkID0gTlByb2dyZXNzLmlzU3RhcnRlZCgpOwoKICAgIG4gPSBjbGFtcChuLCBTZXR0aW5ncy5taW5pbXVtLCAxKTsKICAgIE5Qcm9ncmVzcy5zdGF0dXMgPSAobiA9PT0gMSA/IG51bGwgOiBuKTsKCiAgICB2YXIgcHJvZ3Jlc3MgPSBOUHJvZ3Jlc3MucmVuZGVyKCFzdGFydGVkKSwKICAgICAgICBiYXIgICAgICA9IHByb2dyZXNzLnF1ZXJ5U2VsZWN0b3IoU2V0dGluZ3MuYmFyU2VsZWN0b3IpLAogICAgICAgIHNwZWVkICAgID0gU2V0dGluZ3Muc3BlZWQsCiAgICAgICAgZWFzZSAgICAgPSBTZXR0aW5ncy5lYXNpbmc7CgogICAgcHJvZ3Jlc3Mub2Zmc2V0V2lkdGg7IC8qIFJlcGFpbnQgKi8KCiAgICBxdWV1ZShmdW5jdGlvbihuZXh0KSB7CiAgICAgIC8vIFNldCBwb3NpdGlvblVzaW5nIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gc2V0CiAgICAgIGlmIChTZXR0aW5ncy5wb3NpdGlvblVzaW5nID09PSAnJykgU2V0dGluZ3MucG9zaXRpb25Vc2luZyA9IE5Qcm9ncmVzcy5nZXRQb3NpdGlvbmluZ0NTUygpOwoKICAgICAgLy8gQWRkIHRyYW5zaXRpb24KICAgICAgY3NzKGJhciwgYmFyUG9zaXRpb25DU1Mobiwgc3BlZWQsIGVhc2UpKTsKCiAgICAgIGlmIChuID09PSAxKSB7CiAgICAgICAgLy8gRmFkZSBvdXQKICAgICAgICBjc3MocHJvZ3Jlc3MsIHsgCiAgICAgICAgICB0cmFuc2l0aW9uOiAnbm9uZScsIAogICAgICAgICAgb3BhY2l0eTogMSAKICAgICAgICB9KTsKICAgICAgICBwcm9ncmVzcy5vZmZzZXRXaWR0aDsgLyogUmVwYWludCAqLwoKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgY3NzKHByb2dyZXNzLCB7IAogICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsICcgKyBzcGVlZCArICdtcyBsaW5lYXInLCAKICAgICAgICAgICAgb3BhY2l0eTogMCAKICAgICAgICAgIH0pOwogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgTlByb2dyZXNzLnJlbW92ZSgpOwogICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICB9LCBzcGVlZCk7CiAgICAgICAgfSwgc3BlZWQpOwogICAgICB9IGVsc2UgewogICAgICAgIHNldFRpbWVvdXQobmV4dCwgc3BlZWQpOwogICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gdGhpczsKICB9OwoKICBOUHJvZ3Jlc3MuaXNTdGFydGVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdHlwZW9mIE5Qcm9ncmVzcy5zdGF0dXMgPT09ICdudW1iZXInOwogIH07CgogIC8qKgogICAqIFNob3dzIHRoZSBwcm9ncmVzcyBiYXIuCiAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBzZXR0aW5nIHRoZSBzdGF0dXMgdG8gMCUsIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgZ28gYmFja3dhcmRzLgogICAqCiAgICogICAgIE5Qcm9ncmVzcy5zdGFydCgpOwogICAqCiAgICovCiAgTlByb2dyZXNzLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoIU5Qcm9ncmVzcy5zdGF0dXMpIE5Qcm9ncmVzcy5zZXQoMCk7CgogICAgdmFyIHdvcmsgPSBmdW5jdGlvbigpIHsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIU5Qcm9ncmVzcy5zdGF0dXMpIHJldHVybjsKICAgICAgICBOUHJvZ3Jlc3MudHJpY2tsZSgpOwogICAgICAgIHdvcmsoKTsKICAgICAgfSwgU2V0dGluZ3MudHJpY2tsZVNwZWVkKTsKICAgIH07CgogICAgaWYgKFNldHRpbmdzLnRyaWNrbGUpIHdvcmsoKTsKCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAvKioKICAgKiBIaWRlcyB0aGUgcHJvZ3Jlc3MgYmFyLgogICAqIFRoaXMgaXMgdGhlICpzb3J0IG9mKiB0aGUgc2FtZSBhcyBzZXR0aW5nIHRoZSBzdGF0dXMgdG8gMTAwJSwgd2l0aCB0aGUKICAgKiBkaWZmZXJlbmNlIGJlaW5nIGBkb25lKClgIG1ha2VzIHNvbWUgcGxhY2VibyBlZmZlY3Qgb2Ygc29tZSByZWFsaXN0aWMgbW90aW9uLgogICAqCiAgICogICAgIE5Qcm9ncmVzcy5kb25lKCk7CiAgICoKICAgKiBJZiBgdHJ1ZWAgaXMgcGFzc2VkLCBpdCB3aWxsIHNob3cgdGhlIHByb2dyZXNzIGJhciBldmVuIGlmIGl0cyBoaWRkZW4uCiAgICoKICAgKiAgICAgTlByb2dyZXNzLmRvbmUodHJ1ZSk7CiAgICovCgogIE5Qcm9ncmVzcy5kb25lID0gZnVuY3Rpb24oZm9yY2UpIHsKICAgIGlmICghZm9yY2UgJiYgIU5Qcm9ncmVzcy5zdGF0dXMpIHJldHVybiB0aGlzOwoKICAgIHJldHVybiBOUHJvZ3Jlc3MuaW5jKDAuMyArIDAuNSAqIE1hdGgucmFuZG9tKCkpLnNldCgxKTsKICB9OwoKICAvKioKICAgKiBJbmNyZW1lbnRzIGJ5IGEgcmFuZG9tIGFtb3VudC4KICAgKi8KCiAgTlByb2dyZXNzLmluYyA9IGZ1bmN0aW9uKGFtb3VudCkgewogICAgdmFyIG4gPSBOUHJvZ3Jlc3Muc3RhdHVzOwoKICAgIGlmICghbikgewogICAgICByZXR1cm4gTlByb2dyZXNzLnN0YXJ0KCk7CiAgICB9IGVsc2UgewogICAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHsKICAgICAgICBhbW91bnQgPSAoMSAtIG4pICogY2xhbXAoTWF0aC5yYW5kb20oKSAqIG4sIDAuMSwgMC45NSk7CiAgICAgIH0KCiAgICAgIG4gPSBjbGFtcChuICsgYW1vdW50LCAwLCAwLjk5NCk7CiAgICAgIHJldHVybiBOUHJvZ3Jlc3Muc2V0KG4pOwogICAgfQogIH07CgogIE5Qcm9ncmVzcy50cmlja2xlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTlByb2dyZXNzLmluYyhNYXRoLnJhbmRvbSgpICogU2V0dGluZ3MudHJpY2tsZVJhdGUpOwogIH07CgogIC8qKgogICAqIFdhaXRzIGZvciBhbGwgc3VwcGxpZWQgalF1ZXJ5IHByb21pc2VzIGFuZAogICAqIGluY3JlYXNlcyB0aGUgcHJvZ3Jlc3MgYXMgdGhlIHByb21pc2VzIHJlc29sdmUuCiAgICogCiAgICogQHBhcmFtICRwcm9taXNlIGpRVWVyeSBQcm9taXNlCiAgICovCiAgKGZ1bmN0aW9uKCkgewogICAgdmFyIGluaXRpYWwgPSAwLCBjdXJyZW50ID0gMDsKICAgIAogICAgTlByb2dyZXNzLnByb21pc2UgPSBmdW5jdGlvbigkcHJvbWlzZSkgewogICAgICBpZiAoISRwcm9taXNlIHx8ICRwcm9taXNlLnN0YXRlKCkgPT0gInJlc29sdmVkIikgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICAgIAogICAgICBpZiAoY3VycmVudCA9PSAwKSB7CiAgICAgICAgTlByb2dyZXNzLnN0YXJ0KCk7CiAgICAgIH0KICAgICAgCiAgICAgIGluaXRpYWwrKzsKICAgICAgY3VycmVudCsrOwogICAgICAKICAgICAgJHByb21pc2UuYWx3YXlzKGZ1bmN0aW9uKCkgewogICAgICAgIGN1cnJlbnQtLTsKICAgICAgICBpZiAoY3VycmVudCA9PSAwKSB7CiAgICAgICAgICAgIGluaXRpYWwgPSAwOwogICAgICAgICAgICBOUHJvZ3Jlc3MuZG9uZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIE5Qcm9ncmVzcy5zZXQoKGluaXRpYWwgLSBjdXJyZW50KSAvIGluaXRpYWwpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIAogICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICAKICB9KSgpOwoKICAvKioKICAgKiAoSW50ZXJuYWwpIHJlbmRlcnMgdGhlIHByb2dyZXNzIGJhciBtYXJrdXAgYmFzZWQgb24gdGhlIGB0ZW1wbGF0ZWAKICAgKiBzZXR0aW5nLgogICAqLwoKICBOUHJvZ3Jlc3MucmVuZGVyID0gZnVuY3Rpb24oZnJvbVN0YXJ0KSB7CiAgICBpZiAoTlByb2dyZXNzLmlzUmVuZGVyZWQoKSkgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCducHJvZ3Jlc3MnKTsKCiAgICBhZGRDbGFzcyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICducHJvZ3Jlc3MtYnVzeScpOwogICAgCiAgICB2YXIgcHJvZ3Jlc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHByb2dyZXNzLmlkID0gJ25wcm9ncmVzcyc7CiAgICBwcm9ncmVzcy5pbm5lckhUTUwgPSBTZXR0aW5ncy50ZW1wbGF0ZTsKCiAgICB2YXIgYmFyICAgICAgPSBwcm9ncmVzcy5xdWVyeVNlbGVjdG9yKFNldHRpbmdzLmJhclNlbGVjdG9yKSwKICAgICAgICBwZXJjICAgICA9IGZyb21TdGFydCA/ICctMTAwJyA6IHRvQmFyUGVyYyhOUHJvZ3Jlc3Muc3RhdHVzIHx8IDApLAogICAgICAgIHNwaW5uZXI7CiAgICAKICAgIGNzcyhiYXIsIHsKICAgICAgdHJhbnNpdGlvbjogJ2FsbCAwIGxpbmVhcicsCiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCcgKyBwZXJjICsgJyUsMCwwKScKICAgIH0pOwoKICAgIGlmICghU2V0dGluZ3Muc2hvd1NwaW5uZXIpIHsKICAgICAgc3Bpbm5lciA9IHByb2dyZXNzLnF1ZXJ5U2VsZWN0b3IoU2V0dGluZ3Muc3Bpbm5lclNlbGVjdG9yKTsKICAgICAgc3Bpbm5lciAmJiByZW1vdmVFbGVtZW50KHNwaW5uZXIpOwogICAgfQoKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocHJvZ3Jlc3MpOwogICAgcmV0dXJuIHByb2dyZXNzOwogIH07CgogIC8qKgogICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQuIE9wcG9zaXRlIG9mIHJlbmRlcigpLgogICAqLwoKICBOUHJvZ3Jlc3MucmVtb3ZlID0gZnVuY3Rpb24oKSB7CiAgICByZW1vdmVDbGFzcyhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICducHJvZ3Jlc3MtYnVzeScpOwogICAgdmFyIHByb2dyZXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25wcm9ncmVzcycpOwogICAgcHJvZ3Jlc3MgJiYgcmVtb3ZlRWxlbWVudChwcm9ncmVzcyk7CiAgfTsKCiAgLyoqCiAgICogQ2hlY2tzIGlmIHRoZSBwcm9ncmVzcyBiYXIgaXMgcmVuZGVyZWQuCiAgICovCgogIE5Qcm9ncmVzcy5pc1JlbmRlcmVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gISFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnByb2dyZXNzJyk7CiAgfTsKCiAgLyoqCiAgICogRGV0ZXJtaW5lIHdoaWNoIHBvc2l0aW9uaW5nIENTUyBydWxlIHRvIHVzZS4KICAgKi8KCiAgTlByb2dyZXNzLmdldFBvc2l0aW9uaW5nQ1NTID0gZnVuY3Rpb24oKSB7CiAgICAvLyBTbmlmZiBvbiBkb2N1bWVudC5ib2R5LnN0eWxlCiAgICB2YXIgYm9keVN0eWxlID0gZG9jdW1lbnQuYm9keS5zdHlsZTsKCiAgICAvLyBTbmlmZiBwcmVmaXhlcwogICAgdmFyIHZlbmRvclByZWZpeCA9ICgnV2Via2l0VHJhbnNmb3JtJyBpbiBib2R5U3R5bGUpID8gJ1dlYmtpdCcgOgogICAgICAgICAgICAgICAgICAgICAgICgnTW96VHJhbnNmb3JtJyBpbiBib2R5U3R5bGUpID8gJ01veicgOgogICAgICAgICAgICAgICAgICAgICAgICgnbXNUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnbXMnIDoKICAgICAgICAgICAgICAgICAgICAgICAoJ09UcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgPyAnTycgOiAnJzsKCiAgICBpZiAodmVuZG9yUHJlZml4ICsgJ1BlcnNwZWN0aXZlJyBpbiBib2R5U3R5bGUpIHsKICAgICAgLy8gTW9kZXJuIGJyb3dzZXJzIHdpdGggM0Qgc3VwcG9ydCwgZS5nLiBXZWJraXQsIElFMTAKICAgICAgcmV0dXJuICd0cmFuc2xhdGUzZCc7CiAgICB9IGVsc2UgaWYgKHZlbmRvclByZWZpeCArICdUcmFuc2Zvcm0nIGluIGJvZHlTdHlsZSkgewogICAgICAvLyBCcm93c2VycyB3aXRob3V0IDNEIHN1cHBvcnQsIGUuZy4gSUU5CiAgICAgIHJldHVybiAndHJhbnNsYXRlJzsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEJyb3dzZXJzIHdpdGhvdXQgdHJhbnNsYXRlKCkgc3VwcG9ydCwgZS5nLiBJRTctOAogICAgICByZXR1cm4gJ21hcmdpbic7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogSGVscGVycwogICAqLwoKICBmdW5jdGlvbiBjbGFtcChuLCBtaW4sIG1heCkgewogICAgaWYgKG4gPCBtaW4pIHJldHVybiBtaW47CiAgICBpZiAobiA+IG1heCkgcmV0dXJuIG1heDsKICAgIHJldHVybiBuOwogIH0KCiAgLyoqCiAgICogKEludGVybmFsKSBjb252ZXJ0cyBhIHBlcmNlbnRhZ2UgKGAwLi4xYCkgdG8gYSBiYXIgdHJhbnNsYXRlWAogICAqIHBlcmNlbnRhZ2UgKGAtMTAwJS4uMCVgKS4KICAgKi8KCiAgZnVuY3Rpb24gdG9CYXJQZXJjKG4pIHsKICAgIHJldHVybiAoLTEgKyBuKSAqIDEwMDsKICB9CgoKICAvKioKICAgKiAoSW50ZXJuYWwpIHJldHVybnMgdGhlIGNvcnJlY3QgQ1NTIGZvciBjaGFuZ2luZyB0aGUgYmFyJ3MKICAgKiBwb3NpdGlvbiBnaXZlbiBhbiBuIHBlcmNlbnRhZ2UsIGFuZCBzcGVlZCBhbmQgZWFzZSBmcm9tIFNldHRpbmdzCiAgICovCgogIGZ1bmN0aW9uIGJhclBvc2l0aW9uQ1NTKG4sIHNwZWVkLCBlYXNlKSB7CiAgICB2YXIgYmFyQ1NTOwoKICAgIGlmIChTZXR0aW5ncy5wb3NpdGlvblVzaW5nID09PSAndHJhbnNsYXRlM2QnKSB7CiAgICAgIGJhckNTUyA9IHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoJyt0b0JhclBlcmMobikrJyUsMCwwKScgfTsKICAgIH0gZWxzZSBpZiAoU2V0dGluZ3MucG9zaXRpb25Vc2luZyA9PT0gJ3RyYW5zbGF0ZScpIHsKICAgICAgYmFyQ1NTID0geyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoJyt0b0JhclBlcmMobikrJyUsMCknIH07CiAgICB9IGVsc2UgewogICAgICBiYXJDU1MgPSB7ICdtYXJnaW4tbGVmdCc6IHRvQmFyUGVyYyhuKSsnJScgfTsKICAgIH0KCiAgICBiYXJDU1MudHJhbnNpdGlvbiA9ICdhbGwgJytzcGVlZCsnbXMgJytlYXNlOwoKICAgIHJldHVybiBiYXJDU1M7CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIFF1ZXVlcyBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLgogICAqLwoKICB2YXIgcXVldWUgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgcGVuZGluZyA9IFtdOwogICAgCiAgICBmdW5jdGlvbiBuZXh0KCkgewogICAgICB2YXIgZm4gPSBwZW5kaW5nLnNoaWZ0KCk7CiAgICAgIGlmIChmbikgewogICAgICAgIGZuKG5leHQpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uKGZuKSB7CiAgICAgIHBlbmRpbmcucHVzaChmbik7CiAgICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PSAxKSBuZXh0KCk7CiAgICB9OwogIH0pKCk7CgogIC8qKgogICAqIChJbnRlcm5hbCkgQXBwbGllcyBjc3MgcHJvcGVydGllcyB0byBhbiBlbGVtZW50LCBzaW1pbGFyIHRvIHRoZSBqUXVlcnkgCiAgICogY3NzIG1ldGhvZC4KICAgKgogICAqIFdoaWxlIHRoaXMgaGVscGVyIGRvZXMgYXNzaXN0IHdpdGggdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5IG5hbWVzLCBpdCAKICAgKiBkb2VzIG5vdCBwZXJmb3JtIGFueSBtYW5pcHVsYXRpb24gb2YgdmFsdWVzIHByaW9yIHRvIHNldHRpbmcgc3R5bGVzLgogICAqLwoKICB2YXIgY3NzID0gKGZ1bmN0aW9uKCkgewogICAgdmFyIGNzc1ByZWZpeGVzID0gWyAnV2Via2l0JywgJ08nLCAnTW96JywgJ21zJyBdLAogICAgICAgIGNzc1Byb3BzICAgID0ge307CgogICAgZnVuY3Rpb24gY2FtZWxDYXNlKHN0cmluZykgewogICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoL14tbXMtLywgJ21zLScpLnJlcGxhY2UoLy0oW1xkYS16XSkvZ2ksIGZ1bmN0aW9uKG1hdGNoLCBsZXR0ZXIpIHsKICAgICAgICByZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFZlbmRvclByb3AobmFtZSkgewogICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5ib2R5LnN0eWxlOwogICAgICBpZiAobmFtZSBpbiBzdHlsZSkgcmV0dXJuIG5hbWU7CgogICAgICB2YXIgaSA9IGNzc1ByZWZpeGVzLmxlbmd0aCwKICAgICAgICAgIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwKICAgICAgICAgIHZlbmRvck5hbWU7CiAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICB2ZW5kb3JOYW1lID0gY3NzUHJlZml4ZXNbaV0gKyBjYXBOYW1lOwogICAgICAgIGlmICh2ZW5kb3JOYW1lIGluIHN0eWxlKSByZXR1cm4gdmVuZG9yTmFtZTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U3R5bGVQcm9wKG5hbWUpIHsKICAgICAgbmFtZSA9IGNhbWVsQ2FzZShuYW1lKTsKICAgICAgcmV0dXJuIGNzc1Byb3BzW25hbWVdIHx8IChjc3NQcm9wc1tuYW1lXSA9IGdldFZlbmRvclByb3AobmFtZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5Q3NzKGVsZW1lbnQsIHByb3AsIHZhbHVlKSB7CiAgICAgIHByb3AgPSBnZXRTdHlsZVByb3AocHJvcCk7CiAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSB2YWx1ZTsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydGllcykgewogICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgIHByb3AsIAogICAgICAgICAgdmFsdWU7CgogICAgICBpZiAoYXJncy5sZW5ndGggPT0gMikgewogICAgICAgIGZvciAocHJvcCBpbiBwcm9wZXJ0aWVzKSB7CiAgICAgICAgICB2YWx1ZSA9IHByb3BlcnRpZXNbcHJvcF07CiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3ApKSBhcHBseUNzcyhlbGVtZW50LCBwcm9wLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGFwcGx5Q3NzKGVsZW1lbnQsIGFyZ3NbMV0sIGFyZ3NbMl0pOwogICAgICB9CiAgICB9CiAgfSkoKTsKCiAgLyoqCiAgICogKEludGVybmFsKSBEZXRlcm1pbmVzIGlmIGFuIGVsZW1lbnQgb3Igc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3MgbmFtZXMgY29udGFpbnMgYSBjbGFzcyBuYW1lLgogICAqLwoKICBmdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50LCBuYW1lKSB7CiAgICB2YXIgbGlzdCA9IHR5cGVvZiBlbGVtZW50ID09ICdzdHJpbmcnID8gZWxlbWVudCA6IGNsYXNzTGlzdChlbGVtZW50KTsKICAgIHJldHVybiBsaXN0LmluZGV4T2YoJyAnICsgbmFtZSArICcgJykgPj0gMDsKICB9CgogIC8qKgogICAqIChJbnRlcm5hbCkgQWRkcyBhIGNsYXNzIHRvIGFuIGVsZW1lbnQuCiAgICovCgogIGZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIG5hbWUpIHsKICAgIHZhciBvbGRMaXN0ID0gY2xhc3NMaXN0KGVsZW1lbnQpLAogICAgICAgIG5ld0xpc3QgPSBvbGRMaXN0ICsgbmFtZTsKCiAgICBpZiAoaGFzQ2xhc3Mob2xkTGlzdCwgbmFtZSkpIHJldHVybjsgCgogICAgLy8gVHJpbSB0aGUgb3BlbmluZyBzcGFjZS4KICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gbmV3TGlzdC5zdWJzdHJpbmcoMSk7CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIFJlbW92ZXMgYSBjbGFzcyBmcm9tIGFuIGVsZW1lbnQuCiAgICovCgogIGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIG5hbWUpIHsKICAgIHZhciBvbGRMaXN0ID0gY2xhc3NMaXN0KGVsZW1lbnQpLAogICAgICAgIG5ld0xpc3Q7CgogICAgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBuYW1lKSkgcmV0dXJuOwoKICAgIC8vIFJlcGxhY2UgdGhlIGNsYXNzIG5hbWUuCiAgICBuZXdMaXN0ID0gb2xkTGlzdC5yZXBsYWNlKCcgJyArIG5hbWUgKyAnICcsICcgJyk7CgogICAgLy8gVHJpbSB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBzcGFjZXMuCiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG5ld0xpc3Quc3Vic3RyaW5nKDEsIG5ld0xpc3QubGVuZ3RoIC0gMSk7CiAgfQoKICAvKioKICAgKiAoSW50ZXJuYWwpIEdldHMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0aGUgY2xhc3MgbmFtZXMgb24gdGhlIGVsZW1lbnQuIAogICAqIFRoZSBsaXN0IGlzIHdyYXBwZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBvbiBlYWNoIGVuZCB0byBmYWNpbGl0YXRlIGZpbmRpbmcgCiAgICogbWF0Y2hlcyB3aXRoaW4gdGhlIGxpc3QuCiAgICovCgogIGZ1bmN0aW9uIGNsYXNzTGlzdChlbGVtZW50KSB7CiAgICByZXR1cm4gKCcgJyArIChlbGVtZW50LmNsYXNzTmFtZSB8fCAnJykgKyAnICcpLnJlcGxhY2UoL1xzKy9naSwgJyAnKTsKICB9CgogIC8qKgogICAqIChJbnRlcm5hbCkgUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTS4KICAgKi8KCiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbGVtZW50KSB7CiAgICBlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSAmJiBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7CiAgfQoKICByZXR1cm4gTlByb2dyZXNzOwp9KTsK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/nprogress.js,importbuddy/js/nprogress.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/restoreEvents.js,importbuddy/js/restoreEvents.js
ZnVuY3Rpb24gaW1wb3J0YnVkZHlfbG9hZFJlc3RvcmVFdmVudHMoKSB7CgkKCQoJLy8gVXBkYXRlIHN0YXR1cyBsb2cgZGV0YWlscywgbWVzc2FnZXMsIG9yIGVycm9ycy4KCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykuYmluZCgnYmFja3VwYnVkZHlfZGV0YWlscyBiYWNrdXBidWRkeV9tZXNzYWdlIGJhY2t1cGJ1ZGR5X2Vycm9yIGJhY2t1cGJ1ZGR5X3dhcm5pbmcnLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJaWYgKCAnYmFja3VwYnVkZHlfZXJyb3InID09IGUudHlwZSApIHsKCQkJanNvbi5kYXRhID0gYmFja3VwYnVkZHlFcnJvcigganNvbi5kYXRhICk7CgkJfQoJCWlmICggJ2JhY2t1cGJ1ZGR5X3dhcm5pbmcnID09IGUudHlwZSApIHsKCQkJanNvbi5kYXRhID0gYmFja3VwYnVkZHlXYXJuaW5nKCBqc29uLmRhdGEgKTsKCQl9CgkKCQliYWNrdXBidWRkeV9sb2coIGpzb24gKTsKCX0pOwoJCgkKCQoJCgkvLyBBIGJhY2t1cCBmdW5jdGlvbiAoc3RlcCkgYmVnYW4uCglqUXVlcnkoJyNiYWNrdXBidWRkeV9tZXNzYWdlcycpLmJpbmQoICdiYWNrdXBidWRkeV9zdGFydEZ1bmN0aW9uJywgZnVuY3Rpb24oZSwganNvbikgewoJCWZ1bmN0aW9uSW5mbyA9IGpRdWVyeS5wYXJzZUpTT04oanNvbi5kYXRhICk7CgkJaHRtbCA9ICc8ZGl2IGNsYXNzPSJiYWNrdXAtc3RlcCBiYWNrdXAtc3RlcC1wcmltYXJ5IGJhY2t1cC1mdW5jdGlvbi0nICsgZnVuY3Rpb25JbmZvLmZ1bmN0aW9uICsgJyI+PHNwYW4gY2xhc3M9ImJhY2t1cC1zdGVwLXN0YXR1cyBiYWNrdXAtc3RlcC1zdGF0dXMtd29ya2luZyI+PC9zcGFuPjxzcGFuIGNsYXNzPSJiYWNrdXAtc3RlcC10aXRsZSI+JyArIGZ1bmN0aW9uSW5mby50aXRsZSArICc8L3NwYW4+PC9kaXY+JzsKCQlqUXVlcnkoICcuYmFja3VwLXN0ZXBzJyApLmFwcGVuZCggaHRtbCApOwoJCWlmICggJycgIT09IGJhY2t1cGJ1ZGR5X2N1cnJlbnRGdW5jdGlvbiApIHsKCQkJYmFja3VwYnVkZHlfbG9nKCAnV2FybmluZyAjMjM3ODMyYTogQSBmdW5jdGlvbiBgJyArIGZ1bmN0aW9uSW5mby5mdW5jdGlvbiArICdgIHN0YXJ0ZWQgYmVmb3JlIGEgcHJpb3IgZnVuY3Rpb24gYCcgKyBiYWNrdXBidWRkeV9jdXJyZW50RnVuY3Rpb24gKyAnYCB3YXMgY29tcGxldGVkLicgKTsKCQl9CgkJYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uID0gZnVuY3Rpb25JbmZvLmZ1bmN0aW9uOwoJfSk7CgkKCQoJLy8gQSBiYWNrdXAgZnVuY3Rpb24gKHN0ZXApIGZpbmlzaGVkLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfZmluaXNoRnVuY3Rpb24nLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJZnVuY3Rpb25JbmZvID0galF1ZXJ5LnBhcnNlSlNPTigganNvbi5kYXRhICk7CgkJalF1ZXJ5KCAnLmJhY2t1cC1mdW5jdGlvbi0nICsgZnVuY3Rpb25JbmZvLmZ1bmN0aW9uICkuZmluZCggJy5iYWNrdXAtc3RlcC1zdGF0dXMtd29ya2luZycgKS5yZW1vdmVDbGFzcyggJ2JhY2t1cC1zdGVwLXN0YXR1cy13b3JraW5nJyApLmFkZENsYXNzKCAnYmFja3VwLXN0ZXAtc3RhdHVzLWZpbmlzaGVkJyApOwoJCWlmICggZnVuY3Rpb25JbmZvLmZ1bmN0aW9uICE9PSBiYWNrdXBidWRkeV9jdXJyZW50RnVuY3Rpb24gKSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJ1dhcm5pbmcgIzIzNzgzMmI6IEEgZnVuY3Rpb24gYCcgKyBmdW5jdGlvbkluZm8uZnVuY3Rpb24gKyAnYCBjb21wbGV0ZWQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgZnVuY3Rpb24gd2hpY2ggd2FzIHRob3VnaHQgdG8gYmUgcnVubmluZyBgJyArIGJhY2t1cGJ1ZGR5X2N1cnJlbnRGdW5jdGlvbiArICdgLicgKTsKCQl9CgkJYmFja3VwYnVkZHlfY3VycmVudEZ1bmN0aW9uID0gJyc7Cgl9KTsKCQoJCgkvLyBUcmFjayBtaW5vciBldmVudHMgc28gd2UgY2FuIGRldGVjdCBjZXJ0YWluIHRoaW5ncyBub3QgZmluaXNoaW5nLCBzdWNoIGFzIGltcG9ydGJ1ZGR5IGdlbmVyYXRpb24uCglqUXVlcnkoJyNiYWNrdXBidWRkeV9tZXNzYWdlcycpLmJpbmQoICdiYWNrdXBidWRkeV9zdGFydEFjdGlvbicsIGZ1bmN0aW9uKGUsIGpzb24pIHsKCQljb25zb2xlLmxvZyggJ1N0YXJ0aW5nIGFjdGlvbjogJyArIGpzb24uZGF0YSApOwoJCWlmICggJycgIT09IGJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb24gKSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJ1dhcm5pbmcgIzMyNzgzNzRhOiBBbiBhY3Rpb24gYCcgKyBqc29uLmRhdGEgKyAnYCBzdGFydGVkIGJlZm9yZSBhIHByaW9yIGFjdGlvbiBgJyArIGJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb24gKyAnYCB3YXMgY29tcGxldGVkLicgKTsKCQl9CgkJYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbiA9IGpzb24uZGF0YTsKCQliYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uU3RhcnQgPSB1bml4X3RpbWVzdGFtcCgpOwoJCWJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb25MYXN0V2FybiA9IDA7Cgl9KTsKCQoJCglqUXVlcnkoJyNiYWNrdXBidWRkeV9tZXNzYWdlcycpLmJpbmQoICdiYWNrdXBidWRkeV9maW5pc2hBY3Rpb24nLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJY29uc29sZS5sb2coICdGaW5pc2hpbmcgYWN0aW9uOiAnICsganNvbi5kYXRhICk7CgkJaWYgKCBqc29uLmRhdGEgIT09IGJhY2t1cGJ1ZGR5X2N1cnJlbnRBY3Rpb24gKSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJ1dhcm5pbmcgIzMyNzgzNzRiOiBBbiBhY3Rpb24gYCcgKyBqc29uLmRhdGEgKyAnYCBjb21wbGV0ZWQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgYWN0aW9uIGAnICsgYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbiArICdgIHdoaWNoIHdhcyB0aG91Z2h0IHRvIGJlIHJ1bm5pbmcuJyApOwoJCX0KCQliYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uID0gJyc7CgkJYmFja3VwYnVkZHlfY3VycmVudEFjdGlvblN0YXJ0ID0gMDsKCQliYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uTGFzdFdhcm4gPSAwOwoJfSk7CgkKCQoJCgkKCS8vIEFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCBydW5uaW5nIGEgZnVuY3Rpb24uCglqUXVlcnkoJyNiYWNrdXBidWRkeV9tZXNzYWdlcycpLmJpbmQoICdiYWNrdXBidWRkeV9lcnJvckZ1bmN0aW9uJywgZnVuY3Rpb24oZSwganNvbikgewoJCWpRdWVyeSggJy5iYWNrdXAtZnVuY3Rpb24tJyArIGpzb24uZGF0YSApLmZpbmQoICcuYmFja3VwLXN0ZXAtc3RhdHVzLXdvcmtpbmcnICkucmVtb3ZlQ2xhc3MoICdiYWNrdXAtc3RlcC1zdGF0dXMtd29ya2luZycgKS5hZGRDbGFzcyggJ2JhY2t1cC1zdGVwLXN0YXR1cy1lcnJvcicgKTsKCX0pOwoJCgkKCS8vIFN0YXJ0IGEgc3ViZnVuY3Rpb24uIFRoZXNlIGFyZSB0eXBpY2FsbHkgbW9yZSBtaW5vciwgdGhvdWdoIHN0aWxsIG5vdGFibGUsIGV2ZW50cy4KCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykuYmluZCggJ2JhY2t1cGJ1ZGR5X3N0YXJ0U3ViRnVuY3Rpb24nLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJZnVuY3Rpb25JbmZvID0galF1ZXJ5LnBhcnNlSlNPTihqc29uLmRhdGEgKTsKCQlodG1sID0gJzxkaXYgY2xhc3M9ImJhY2t1cC1zdGVwIGJhY2t1cC1zdGVwLXNlY29uZGFyeSBiYWNrdXAtZnVuY3Rpb24tJyArIGZ1bmN0aW9uSW5mby5mdW5jdGlvbiArICciPjxzcGFuIGNsYXNzPSJiYWNrdXAtc3RlcC1zdGF0dXMiPjwvc3Bhbj48c3BhbiBjbGFzcz0iYmFja3VwLXN0ZXAtdGl0bGUiPicgKyBmdW5jdGlvbkluZm8udGl0bGUgKyAnPC9zcGFuPjwvZGl2Pic7CgkJalF1ZXJ5KCAnLmJhY2t1cC1zdGVwcycgKS5hcHBlbmQoIGh0bWwgKTsKCX0pOwoJCgkKCQoJLy8gQW4gZXJyb3IgbWVzc2FnZSB3YXMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIuCglqUXVlcnkoJyNiYWNrdXBidWRkeV9tZXNzYWdlcycpLmJpbmQoICdiYWNrdXBidWRkeV9lcnJvcicsIGZ1bmN0aW9uKGUsIGpzb24pIHsKCQljb25zb2xlLmxvZyggJ0JBQ0tVUEJVRERZIEVSUk9SOiAnICsganNvbi5kYXRhICk7Cgl9KTsKCQoJLy92YXIgYmFja3VwYnVkZHlfYWN0aW9ucyA9IFtdOwoJCgkKCQoJCgkKCS8vIEEgd2FybmluZyBtZXNzYWdlIHdhcyBzZW50IGZyb20gdGhlIHNlcnZlci4KCWpRdWVyeSgnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJykuYmluZCggJ2JhY2t1cGJ1ZGR5X3dhcm5pbmcnLCBmdW5jdGlvbihlLCBqc29uKSB7CgkJaHRtbCA9ICc8c3BhbiBjbGFzcz0iYmFja3VwLXN0ZXAtc3RhdHVzIGJhY2t1cC1zdGVwLXN0YXR1cy13YXJuaW5nIj48L3NwYW4+PGRpdiBjbGFzcz0iYmFja3VwLXN0ZXAgYmFja3VwLXN0ZXAtc2Vjb25kYXJ5Ij48c3BhbiBjbGFzcz0iYmFja3VwLXN0ZXAtdGl0bGUiPicgKyBqc29uLmRhdGEgKyAnPC9zcGFuPjwvZGl2Pic7CgkJalF1ZXJ5KCAnLmJhY2t1cC1zdGVwcycgKS5hcHBlbmQoIGh0bWwgKTsKCX0pOwoJCgkKCS8vIFRoZSBlbnRpcmUgYmFja3VwIHByb2Nlc3MgaGFzIGJlZW4gaGFsdGVkLCB3aGV0aGVyIGJ5IEJhY2t1cEJ1ZGR5IG9yIHRoZSB1c2VyLgoJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS5iaW5kKCAnYmFja3VwYnVkZHlfaGFsdFNjcmlwdCcsIGZ1bmN0aW9uKGUsIGpzb24pIHsKCQoJCWlmICggMCA9PT0ga2VlcF9wb2xsaW5nICkgeyAvLyBPbmx5IHNob3cgb25jZS4KCQkJcmV0dXJuOwoJCX0KCQoJCWtlZXBfcG9sbGluZyA9IDA7IC8vIFN0b3AgcG9sbGluZyBzZXJ2ZXIgZm9yIHN0YXR1cyB1cGRhdGVzLgoJCgkJalF1ZXJ5KCAnLmJhY2t1cC1zdGVwLXN0YXR1cy13b3JraW5nJyApLnJlbW92ZUNsYXNzKCAnYmFja3VwLXN0ZXAtc3RhdHVzLXdvcmtpbmcnICkuYWRkQ2xhc3MoICdiYWNrdXAtc3RlcC1zdGF0dXMtZXJyb3InICk7IC8vIEFueXRoaW5nIHRoYXQgd2FzIGN1cnJlbnRseSBydW5uaW5nIHR1cm5zIGludG8gYW4gZXJyb3IuCgkJalF1ZXJ5KCAnI3BiX2JhY2t1cGJ1ZGR5X3N0b3AnICkuY3NzKCAndmlzaWJpbGl0eScsICdoaWRkZW4nICk7CgkJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X2JsaW5reicgKS5jc3MoICdiYWNrZ3JvdW5kLXBvc2l0aW9uJywgJ3RvcCcgKTsgLy8gdHVybiBvZmYgbGVkCgkJalF1ZXJ5KCAnI3BiX2JhY2t1cGJ1ZGR5X3Nsb3QxX2xlZCcgKS5yZW1vdmVDbGFzcyggJ3BiX2JhY2t1cGJ1ZGR5X2JsaW5reicgKTsgLy8gZGlzYWJsZSBibGlua2luZwoJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zbG90Ml9sZWQnICkucmVtb3ZlQ2xhc3MoICdwYl9iYWNrdXBidWRkeV9ibGlua3onICk7IC8vIGRpc2FibGUgYmxpbmtpbmcKCQlqUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfc2xvdDNfbGVkJyApLnJlbW92ZUNsYXNzKCAncGJfYmFja3VwYnVkZHlfYmxpbmt6JyApOyAvLyBkaXNhYmxlIGJsaW5raW5nCgkJalF1ZXJ5KCAnI3BiX2JhY2t1cGJ1ZGR5X3Nsb3Q0X2xlZCcgKS5yZW1vdmVDbGFzcyggJ3BiX2JhY2t1cGJ1ZGR5X2VtcHR5JyApOyAvLyBSZW1vdmUgZW1wdHkgTEVEIGhvbGUuCgkJalF1ZXJ5KCAnI3BiX2JhY2t1cGJ1ZGR5X3Nsb3Q0X2xlZCcgKS5hZGRDbGFzcyggJ3BiX2JhY2t1cGJ1ZGR5X2NvZGVyZWQnICk7IC8vIHNldCBjaGVja21hcmsKCQoJCS8vIEJyaWVmbHkgd2FpdAoJCS8vc2V0VGltZW91dChmdW5jdGlvbigpewoJCWJhY2t1cGJ1ZGR5X2xvZyggJyoqKicgKTsKCQlpZiAoICcnICE9PSBiYWNrdXBidWRkeV9jdXJyZW50RnVuY3Rpb24gKSB7CgkJCWJhY2t1cGJ1ZGR5X2xvZyggJyogVW5maW5pc2hlZCBmdW5jdGlvbjogYCcgKyBiYWNrdXBidWRkeV9jdXJyZW50RnVuY3Rpb24gKyAnYC4nICk7CgkJfSBlbHNlIHsKCQkJYmFja3VwYnVkZHlfbG9nKCAnKiBObyBpbi1wcm9ncmVzcyBmdW5jdGlvbiBkZXRlY3RlZC4nICk7CgkJfQoJCgkJaWYgKCAnJyAhPT0gYmFja3VwYnVkZHlfY3VycmVudEFjdGlvbiApIHsKCQkJYmFja3VwYnVkZHlfbG9nKCAnKiBVbmZpbmlzaGVkIGFjdGlvbjogYCcgKyBiYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uICsgJ2AgKCcgKyAoIHVuaXhfdGltZXN0YW1wKCkgLSBiYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uU3RhcnQgKSArICcgc2Vjb25kcyBhZ28pLicgKTsKCQl9IGVsc2UgewoJCQliYWNrdXBidWRkeV9sb2coICcqIE5vIGluLXByb2dyZXNzIGFjdGlvbiBkZXRlY3RlZC4nICk7CgkJfQoJCWJhY2t1cGJ1ZGR5X2xvZyggJyoqKicgKTsKCQoJCS8vIENhbGN1bGF0ZSBzdWdnZXN0aW9ucy4KCQkvKgoJCSBpZiAoICdpbXBvcnRidWRkeUNyZWF0aW9uJyA9PSBiYWNrdXBidWRkeV9jdXJyZW50QWN0aW9uICkgewoJCSBzdWdnZXN0aW9ucy5wdXNoKCB7CgkJIGRlc2NyaXB0aW9uOiAnQmFja3VwQnVkZHkgYnkgZGVmYXVsdCBpbmNsdWRlcyBhIGNvcHkgb2YgdGhlIHJlc3RvcmUgdG9vbCwgaW1wb3J0YnVkZHkucGhwLCBpbnNpZGUgdGhlIGJhY2t1cCBaSVAgZmlsZSBmb3IgcmV0cmlldmFsIGlmIG5lZWRlZCBpbiB0aGUgZnV0dXJlLicsCgkJIHF1aWNrRml4OiAnVHVybiBvZmYgaW5jbHVzaW9uIG9mIEltcG9ydEJ1ZGR5LiBOYXZpZ2F0ZSB0byBTZXR0aW5nczogQWR2YW5jZWQgU2V0dGluZ3MgLyBUcm91Ymxlc2hvb3RpbmcgdGFiOiBVbmNoZWNrICJJbmNsdWRlIEltcG9ydEJ1ZGR5IGluIGZ1bGwgYmFja3VwIGFyY2hpdmUiLicsCgkJIHNvbHV0aW9uOiAnSW5jcmVhc2UgYXZhaWxhYmxlIFBIUCBtZW1vcnkuJwoJCSB9ICk7CgkJIH0KCQkgKi8KCQoJCWJhY2t1cGJ1ZGR5X3Nob3dTdWdnZXN0aW9ucyggc3VnZ2VzdGlvbnMgKTsKCQoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCQkJYmFja3VwYnVkZHlfbG9nKCAnKiBUaGUgYmFja3VwIGhhcyBoYWx0ZWQuJyApOwoJCX0sNTAwKTsKCQlhbGVydCggJ1RoZSBiYWNrdXAgaGFzIGhhbHRlZC4nICk7CgkJLy99LDEwMDApOwoJCgl9KTsKCn0gLy8gZW5kIGxvYWQ=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/restoreEvents.js,importbuddy/js/restoreEvents.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/tooltip.js,importbuddy/js/tooltip.js
LyoKICogalF1ZXJ5IFRvb2x0aXAgcGx1Z2luIDEuMwogKgogKiBodHRwOi8vYmFzc2lzdGFuY2UuZGUvanF1ZXJ5LXBsdWdpbnMvanF1ZXJ5LXBsdWdpbi10b29sdGlwLwogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvVG9vbHRpcAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4IErDtnJuIFphZWZmZXJlcgogKgogKiAkSWQ6IGpxdWVyeS50b29sdGlwLmpzIDU3NDEgMjAwOC0wNi0yMSAxNToyMjoxNlogam9lcm4uemFlZmZlcmVyICQKICogCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqLwogCjsoZnVuY3Rpb24oJCkgewoJCgkJLy8gdGhlIHRvb2x0aXAgZWxlbWVudAoJdmFyIGhlbHBlciA9IHt9LAoJCS8vIHRoZSBjdXJyZW50IHRvb2x0aXBwZWQgZWxlbWVudAoJCWN1cnJlbnQsCgkJLy8gdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQsIHVzZWQgZm9yIHJlc3RvcmluZwoJCXRpdGxlLAoJCS8vIHRpbWVvdXQgaWQgZm9yIGRlbGF5ZWQgdG9vbHRpcHMKCQl0SUQsCgkJLy8gSUUgNS41IG9yIDYKCQlJRSA9IGZhbHNlLAoJCS8vIGZsYWcgZm9yIG1vdXNlIHRyYWNraW5nCgkJdHJhY2sgPSBmYWxzZTsKCQoJJC50b29sdGlwID0gewoJCWJsb2NrZWQ6IGZhbHNlLAoJCWRlZmF1bHRzOiB7CgkJCWRlbGF5OiAyMDAsCgkJCWZhZGU6IGZhbHNlLAoJCQlzaG93VVJMOiB0cnVlLAoJCQlleHRyYUNsYXNzOiAiIiwKCQkJdG9wOiAxNSwKCQkJbGVmdDogMTUsCgkJCWlkOiAidG9vbHRpcCIKCQl9LAoJCWJsb2NrOiBmdW5jdGlvbigpIHsKCQkJJC50b29sdGlwLmJsb2NrZWQgPSAhJC50b29sdGlwLmJsb2NrZWQ7CgkJfQoJfTsKCQoJJC5mbi5leHRlbmQoewoJCXRvb2x0aXA6IGZ1bmN0aW9uKHNldHRpbmdzKSB7CgkJCXNldHRpbmdzID0gJC5leHRlbmQoe30sICQudG9vbHRpcC5kZWZhdWx0cywgc2V0dGluZ3MpOwoJCQljcmVhdGVIZWxwZXIoc2V0dGluZ3MpOwoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCSQuZGF0YSh0aGlzLCAidG9vbHRpcCIsIHNldHRpbmdzKTsKCQkJCQl0aGlzLnRPcGFjaXR5ID0gaGVscGVyLnBhcmVudC5jc3MoIm9wYWNpdHkiKTsKCQkJCQkvLyBjb3B5IHRvb2x0aXAgaW50byBpdHMgb3duIGV4cGFuZG8gYW5kIHJlbW92ZSB0aGUgdGl0bGUKCQkJCQl0aGlzLnRvb2x0aXBUZXh0ID0gdGhpcy50aXRsZTsKCQkJCQkkKHRoaXMpLnJlbW92ZUF0dHIoInRpdGxlIik7CgkJCQkJLy8gYWxzbyByZW1vdmUgYWx0IGF0dHJpYnV0ZSB0byBwcmV2ZW50IGRlZmF1bHQgdG9vbHRpcCBpbiBJRQoJCQkJCXRoaXMuYWx0ID0gIiI7CgkJCQl9KQoJCQkJLm1vdXNlb3ZlcihzYXZlKQoJCQkJLm1vdXNlb3V0KGhpZGUpCgkJCQkuY2xpY2soaGlkZSk7CgkJfSwKCQlmaXhQTkc6IElFID8gZnVuY3Rpb24oKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJdmFyIGltYWdlID0gJCh0aGlzKS5jc3MoJ2JhY2tncm91bmRJbWFnZScpOwoJCQkJaWYgKGltYWdlLm1hdGNoKC9edXJsXChbIiddPyguKlwucG5nKVsiJ10/XCkkL2kpKSB7CgkJCQkJaW1hZ2UgPSBSZWdFeHAuJDE7CgkJCQkJJCh0aGlzKS5jc3MoewoJCQkJCQknYmFja2dyb3VuZEltYWdlJzogJ25vbmUnLAoJCQkJCQknZmlsdGVyJzogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYUltYWdlTG9hZGVyKGVuYWJsZWQ9dHJ1ZSwgc2l6aW5nTWV0aG9kPWNyb3AsIHNyYz0nIiArIGltYWdlICsgIicpIgoJCQkJCX0pLmVhY2goZnVuY3Rpb24gKCkgewoJCQkJCQl2YXIgcG9zaXRpb24gPSAkKHRoaXMpLmNzcygncG9zaXRpb24nKTsKCQkJCQkJaWYgKHBvc2l0aW9uICE9ICdhYnNvbHV0ZScgJiYgcG9zaXRpb24gIT0gJ3JlbGF0aXZlJykKCQkJCQkJCSQodGhpcykuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpOwoJCQkJCX0pOwoJCQkJfQoJCQl9KTsKCQl9IDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9LAoJCXVuZml4UE5HOiBJRSA/IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKCQkJCSQodGhpcykuY3NzKHsnZmlsdGVyJzogJycsIGJhY2tncm91bmRJbWFnZTogJyd9KTsKCQkJfSk7CgkJfSA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSwKCQloaWRlV2hlbkVtcHR5OiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCSQodGhpcylbICQodGhpcykuaHRtbCgpID8gInNob3ciIDogImhpZGUiIF0oKTsKCQkJfSk7CgkJfSwKCQl1cmw6IGZ1bmN0aW9uKCkgewoJCQlyZXR1cm4gdGhpcy5hdHRyKCdocmVmJykgfHwgdGhpcy5hdHRyKCdzcmMnKTsKCQl9Cgl9KTsKCQoJZnVuY3Rpb24gY3JlYXRlSGVscGVyKHNldHRpbmdzKSB7CgkJLy8gdGhlcmUgY2FuIGJlIG9ubHkgb25lIHRvb2x0aXAgaGVscGVyCgkJaWYoIGhlbHBlci5wYXJlbnQgKQoJCQlyZXR1cm47CgkJLy8gY3JlYXRlIHRoZSBoZWxwZXIsIGgzIGZvciB0aXRsZSwgZGl2IGZvciB1cmwKCQloZWxwZXIucGFyZW50ID0gJCgnPGRpdiBpZD0iJyArIHNldHRpbmdzLmlkICsgJyI+PGgzPjwvaDM+PGRpdiBjbGFzcz0iYm9keSI+PC9kaXY+PGRpdiBjbGFzcz0idXJsIj48L2Rpdj48L2Rpdj4nKQoJCQkvLyBhZGQgdG8gZG9jdW1lbnQKCQkJLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpCgkJCS8vIGhpZGUgaXQgYXQgZmlyc3QKCQkJLmhpZGUoKTsKCQkJCgkJLy8gYXBwbHkgYmdpZnJhbWUgaWYgYXZhaWxhYmxlCgkJaWYgKCAkLmZuLmJnaWZyYW1lICkKCQkJaGVscGVyLnBhcmVudC5iZ2lmcmFtZSgpOwoJCQoJCS8vIHNhdmUgcmVmZXJlbmNlcyB0byB0aXRsZSBhbmQgdXJsIGVsZW1lbnRzCgkJaGVscGVyLnRpdGxlID0gJCgnaDMnLCBoZWxwZXIucGFyZW50KTsKCQloZWxwZXIuYm9keSA9ICQoJ2Rpdi5ib2R5JywgaGVscGVyLnBhcmVudCk7CgkJaGVscGVyLnVybCA9ICQoJ2Rpdi51cmwnLCBoZWxwZXIucGFyZW50KTsKCX0KCQoJZnVuY3Rpb24gc2V0dGluZ3MoZWxlbWVudCkgewoJCXJldHVybiAkLmRhdGEoZWxlbWVudCwgInRvb2x0aXAiKTsKCX0KCQoJLy8gbWFpbiBldmVudCBoYW5kbGVyIHRvIHN0YXJ0IHNob3dpbmcgdG9vbHRpcHMKCWZ1bmN0aW9uIGhhbmRsZShldmVudCkgewoJCS8vIHNob3cgaGVscGVyLCBlaXRoZXIgd2l0aCB0aW1lb3V0IG9yIG9uIGluc3RhbnQKCQlpZiggc2V0dGluZ3ModGhpcykuZGVsYXkgKQoJCQl0SUQgPSBzZXRUaW1lb3V0KHNob3csIHNldHRpbmdzKHRoaXMpLmRlbGF5KTsKCQllbHNlCgkJCXNob3coKTsKCQkKCQkvLyBpZiBzZWxlY3RlZCwgdXBkYXRlIHRoZSBoZWxwZXIgcG9zaXRpb24gd2hlbiB0aGUgbW91c2UgbW92ZXMKCQl0cmFjayA9ICEhc2V0dGluZ3ModGhpcykudHJhY2s7CgkJJChkb2N1bWVudC5ib2R5KS5iaW5kKCdtb3VzZW1vdmUnLCB1cGRhdGUpOwoJCQkKCQkvLyB1cGRhdGUgYXQgbGVhc3Qgb25jZQoJCXVwZGF0ZShldmVudCk7Cgl9CgkKCS8vIHNhdmUgZWxlbWVudHMgdGl0bGUgYmVmb3JlIHRoZSB0b29sdGlwIGlzIGRpc3BsYXllZAoJZnVuY3Rpb24gc2F2ZSgpIHsKCQkvLyBpZiB0aGlzIGlzIHRoZSBjdXJyZW50IHNvdXJjZSwgb3IgaXQgaGFzIG5vIHRpdGxlIChvY2N1cnMgd2l0aCBjbGljayBldmVudCksIHN0b3AKCQlpZiAoICQudG9vbHRpcC5ibG9ja2VkIHx8IHRoaXMgPT0gY3VycmVudCB8fCAoIXRoaXMudG9vbHRpcFRleHQgJiYgIXNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyKSApCgkJCXJldHVybjsKCgkJLy8gc2F2ZSBjdXJyZW50CgkJY3VycmVudCA9IHRoaXM7CgkJdGl0bGUgPSB0aGlzLnRvb2x0aXBUZXh0OwoJCQoJCWlmICggc2V0dGluZ3ModGhpcykuYm9keUhhbmRsZXIgKSB7CgkJCWhlbHBlci50aXRsZS5oaWRlKCk7CgkJCXZhciBib2R5Q29udGVudCA9IHNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyLmNhbGwodGhpcyk7CgkJCWlmIChib2R5Q29udGVudC5ub2RlVHlwZSB8fCBib2R5Q29udGVudC5qcXVlcnkpIHsKCQkJCWhlbHBlci5ib2R5LmVtcHR5KCkuYXBwZW5kKGJvZHlDb250ZW50KQoJCQl9IGVsc2UgewoJCQkJaGVscGVyLmJvZHkuaHRtbCggYm9keUNvbnRlbnQgKTsKCQkJfQoJCQloZWxwZXIuYm9keS5zaG93KCk7CgkJfSBlbHNlIGlmICggc2V0dGluZ3ModGhpcykuc2hvd0JvZHkgKSB7CgkJCXZhciBwYXJ0cyA9IHRpdGxlLnNwbGl0KHNldHRpbmdzKHRoaXMpLnNob3dCb2R5KTsKCQkJaGVscGVyLnRpdGxlLmh0bWwocGFydHMuc2hpZnQoKSkuc2hvdygpOwoJCQloZWxwZXIuYm9keS5lbXB0eSgpOwoJCQlmb3IodmFyIGkgPSAwLCBwYXJ0OyAocGFydCA9IHBhcnRzW2ldKTsgaSsrKSB7CgkJCQlpZihpID4gMCkKCQkJCQloZWxwZXIuYm9keS5hcHBlbmQoIjxici8+Iik7CgkJCQloZWxwZXIuYm9keS5hcHBlbmQocGFydCk7CgkJCX0KCQkJaGVscGVyLmJvZHkuaGlkZVdoZW5FbXB0eSgpOwoJCX0gZWxzZSB7CgkJCWhlbHBlci50aXRsZS5odG1sKHRpdGxlKS5zaG93KCk7CgkJCWhlbHBlci5ib2R5LmhpZGUoKTsKCQl9CgkJCgkJLy8gaWYgZWxlbWVudCBoYXMgaHJlZiBvciBzcmMsIGFkZCBhbmQgc2hvdyBpdCwgb3RoZXJ3aXNlIGhpZGUgaXQKCQlpZiggc2V0dGluZ3ModGhpcykuc2hvd1VSTCAmJiAkKHRoaXMpLnVybCgpICkKCQkJaGVscGVyLnVybC5odG1sKCAkKHRoaXMpLnVybCgpLnJlcGxhY2UoJ2h0dHA6Ly8nLCAnJykgKS5zaG93KCk7CgkJZWxzZSAKCQkJaGVscGVyLnVybC5oaWRlKCk7CgkJCgkJLy8gYWRkIGFuIG9wdGlvbmFsIGNsYXNzIGZvciB0aGlzIHRpcAoJCWhlbHBlci5wYXJlbnQuYWRkQ2xhc3Moc2V0dGluZ3ModGhpcykuZXh0cmFDbGFzcyk7CgoJCS8vIGZpeCBQTkcgYmFja2dyb3VuZCBmb3IgSUUKCQlpZiAoc2V0dGluZ3ModGhpcykuZml4UE5HICkKCQkJaGVscGVyLnBhcmVudC5maXhQTkcoKTsKCQkJCgkJaGFuZGxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cgl9CgkKCS8vIGRlbGV0ZSB0aW1lb3V0IGFuZCBzaG93IGhlbHBlcgoJZnVuY3Rpb24gc2hvdygpIHsKCQl0SUQgPSBudWxsOwoJCWlmICgoIUlFIHx8ICEkLmZuLmJnaWZyYW1lKSAmJiBzZXR0aW5ncyhjdXJyZW50KS5mYWRlKSB7CgkJCWlmIChoZWxwZXIucGFyZW50LmlzKCI6YW5pbWF0ZWQiKSkKCQkJCWhlbHBlci5wYXJlbnQuc3RvcCgpLnNob3coKS5mYWRlVG8oc2V0dGluZ3MoY3VycmVudCkuZmFkZSwgY3VycmVudC50T3BhY2l0eSk7CgkJCWVsc2UKCQkJCWhlbHBlci5wYXJlbnQuaXMoJzp2aXNpYmxlJykgPyBoZWxwZXIucGFyZW50LmZhZGVUbyhzZXR0aW5ncyhjdXJyZW50KS5mYWRlLCBjdXJyZW50LnRPcGFjaXR5KSA6IGhlbHBlci5wYXJlbnQuZmFkZUluKHNldHRpbmdzKGN1cnJlbnQpLmZhZGUpOwoJCX0gZWxzZSB7CgkJCWhlbHBlci5wYXJlbnQuc2hvdygpOwoJCX0KCQl1cGRhdGUoKTsKCX0KCQoJLyoqCgkgKiBjYWxsYmFjayBmb3IgbW91c2Vtb3ZlCgkgKiB1cGRhdGVzIHRoZSBoZWxwZXIgcG9zaXRpb24KCSAqIHJlbW92ZXMgaXRzZWxmIHdoZW4gbm8gY3VycmVudCBlbGVtZW50CgkgKi8KCWZ1bmN0aW9uIHVwZGF0ZShldmVudCkJewoJCWlmKCQudG9vbHRpcC5ibG9ja2VkKQoJCQlyZXR1cm47CgkJCgkJaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldC50YWdOYW1lID09ICJPUFRJT04iKSB7CgkJCXJldHVybjsKCQl9CgkJCgkJLy8gc3RvcCB1cGRhdGluZyB3aGVuIHRyYWNraW5nIGlzIGRpc2FibGVkIGFuZCB0aGUgdG9vbHRpcCBpcyB2aXNpYmxlCgkJaWYgKCAhdHJhY2sgJiYgaGVscGVyLnBhcmVudC5pcygiOnZpc2libGUiKSkgewoJCQkkKGRvY3VtZW50LmJvZHkpLnVuYmluZCgnbW91c2Vtb3ZlJywgdXBkYXRlKQoJCX0KCQkKCQkvLyBpZiBubyBjdXJyZW50IGVsZW1lbnQgaXMgYXZhaWxhYmxlLCByZW1vdmUgdGhpcyBsaXN0ZW5lcgoJCWlmKCBjdXJyZW50ID09IG51bGwgKSB7CgkJCSQoZG9jdW1lbnQuYm9keSkudW5iaW5kKCdtb3VzZW1vdmUnLCB1cGRhdGUpOwoJCQlyZXR1cm47CQoJCX0KCQkKCQkvLyByZW1vdmUgcG9zaXRpb24gaGVscGVyIGNsYXNzZXMKCQloZWxwZXIucGFyZW50LnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1yaWdodCIpLnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1ib3R0b20iKTsKCQkKCQl2YXIgbGVmdCA9IGhlbHBlci5wYXJlbnRbMF0ub2Zmc2V0TGVmdDsKCQl2YXIgdG9wID0gaGVscGVyLnBhcmVudFswXS5vZmZzZXRUb3A7CgkJaWYgKGV2ZW50KSB7CgkJCS8vIHBvc2l0aW9uIHRoZSBoZWxwZXIgMTUgcGl4ZWwgdG8gYm90dG9tIHJpZ2h0LCBzdGFydGluZyBmcm9tIG1vdXNlIHBvc2l0aW9uCgkJCWxlZnQgPSBldmVudC5wYWdlWCArIHNldHRpbmdzKGN1cnJlbnQpLmxlZnQ7CgkJCXRvcCA9IGV2ZW50LnBhZ2VZICsgc2V0dGluZ3MoY3VycmVudCkudG9wOwoJCQl2YXIgcmlnaHQ9J2F1dG8nOwoJCQlpZiAoc2V0dGluZ3MoY3VycmVudCkucG9zaXRpb25MZWZ0KSB7CgkJCQlyaWdodCA9ICQod2luZG93KS53aWR0aCgpIC0gbGVmdDsKCQkJCWxlZnQgPSAnYXV0byc7CgkJCX0KCQkJaGVscGVyLnBhcmVudC5jc3MoewoJCQkJbGVmdDogbGVmdCwKCQkJCXJpZ2h0OiByaWdodCwKCQkJCXRvcDogdG9wCgkJCX0pOwoJCX0KCQkKCQl2YXIgdiA9IHZpZXdwb3J0KCksCgkJCWggPSBoZWxwZXIucGFyZW50WzBdOwoJCS8vIGNoZWNrIGhvcml6b250YWwgcG9zaXRpb24KCQlpZiAodi54ICsgdi5jeCA8IGgub2Zmc2V0TGVmdCArIGgub2Zmc2V0V2lkdGgpIHsKCQkJbGVmdCAtPSBoLm9mZnNldFdpZHRoICsgMjAgKyBzZXR0aW5ncyhjdXJyZW50KS5sZWZ0OwoJCQloZWxwZXIucGFyZW50LmNzcyh7bGVmdDogbGVmdCArICdweCd9KS5hZGRDbGFzcygidmlld3BvcnQtcmlnaHQiKTsKCQl9CgkJLy8gY2hlY2sgdmVydGljYWwgcG9zaXRpb24KCQlpZiAodi55ICsgdi5jeSA8IGgub2Zmc2V0VG9wICsgaC5vZmZzZXRIZWlnaHQpIHsKCQkJdG9wIC09IGgub2Zmc2V0SGVpZ2h0ICsgMjAgKyBzZXR0aW5ncyhjdXJyZW50KS50b3A7CgkJCWhlbHBlci5wYXJlbnQuY3NzKHt0b3A6IHRvcCArICdweCd9KS5hZGRDbGFzcygidmlld3BvcnQtYm90dG9tIik7CgkJfQoJfQoJCglmdW5jdGlvbiB2aWV3cG9ydCgpIHsKCQlyZXR1cm4gewoJCQl4OiAkKHdpbmRvdykuc2Nyb2xsTGVmdCgpLAoJCQl5OiAkKHdpbmRvdykuc2Nyb2xsVG9wKCksCgkJCWN4OiAkKHdpbmRvdykud2lkdGgoKSwKCQkJY3k6ICQod2luZG93KS5oZWlnaHQoKQoJCX07Cgl9CgkKCS8vIGhpZGUgaGVscGVyIGFuZCByZXN0b3JlIGFkZGVkIGNsYXNzZXMgYW5kIHRoZSB0aXRsZQoJZnVuY3Rpb24gaGlkZShldmVudCkgewoJCWlmKCQudG9vbHRpcC5ibG9ja2VkKQoJCQlyZXR1cm47CgkJLy8gY2xlYXIgdGltZW91dCBpZiBwb3NzaWJsZQoJCWlmKHRJRCkKCQkJY2xlYXJUaW1lb3V0KHRJRCk7CgkJLy8gbm8gbW9yZSBjdXJyZW50IGVsZW1lbnQKCQljdXJyZW50ID0gbnVsbDsKCQkKCQl2YXIgdHNldHRpbmdzID0gc2V0dGluZ3ModGhpcyk7CgkJZnVuY3Rpb24gY29tcGxldGUoKSB7CgkJCWhlbHBlci5wYXJlbnQucmVtb3ZlQ2xhc3MoIHRzZXR0aW5ncy5leHRyYUNsYXNzICkuaGlkZSgpLmNzcygib3BhY2l0eSIsICIiKTsKCQl9CgkJaWYgKCghSUUgfHwgISQuZm4uYmdpZnJhbWUpICYmIHRzZXR0aW5ncy5mYWRlKSB7CgkJCWlmIChoZWxwZXIucGFyZW50LmlzKCc6YW5pbWF0ZWQnKSkKCQkJCWhlbHBlci5wYXJlbnQuc3RvcCgpLmZhZGVUbyh0c2V0dGluZ3MuZmFkZSwgMCwgY29tcGxldGUpOwoJCQllbHNlCgkJCQloZWxwZXIucGFyZW50LnN0b3AoKS5mYWRlT3V0KHRzZXR0aW5ncy5mYWRlLCBjb21wbGV0ZSk7CgkJfSBlbHNlCgkJCWNvbXBsZXRlKCk7CgkJCgkJaWYoIHNldHRpbmdzKHRoaXMpLmZpeFBORyApCgkJCWhlbHBlci5wYXJlbnQudW5maXhQTkcoKTsKCX0KCQp9KShqUXVlcnkpOwo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/tooltip.js,importbuddy/js/tooltip.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/ui.core.js,importbuddy/js/ui.core.js
LyohCiAqIGpRdWVyeSBVSSAxLjguMTIKICoKICogQ29weXJpZ2h0IDIwMTEsIEFVVEhPUlMudHh0IChodHRwOi8vanF1ZXJ5dWkuY29tL2Fib3V0KQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1VJCiAqLwooZnVuY3Rpb24oYyxqKXtmdW5jdGlvbiBrKGEpe3JldHVybiFjKGEpLnBhcmVudHMoKS5hbmRTZWxmKCkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIGMuY3VyQ1NTKHRoaXMsInZpc2liaWxpdHkiKT09PSJoaWRkZW4ifHxjLmV4cHIuZmlsdGVycy5oaWRkZW4odGhpcyl9KS5sZW5ndGh9Yy51aT1jLnVpfHx7fTtpZighYy51aS52ZXJzaW9uKXtjLmV4dGVuZChjLnVpLHt2ZXJzaW9uOiIxLjguMTIiLGtleUNvZGU6e0FMVDoxOCxCQUNLU1BBQ0U6OCxDQVBTX0xPQ0s6MjAsQ09NTUE6MTg4LENPTU1BTkQ6OTEsQ09NTUFORF9MRUZUOjkxLENPTU1BTkRfUklHSFQ6OTMsQ09OVFJPTDoxNyxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsSU5TRVJUOjQ1LExFRlQ6MzcsTUVOVTo5MyxOVU1QQURfQUREOjEwNyxOVU1QQURfREVDSU1BTDoxMTAsTlVNUEFEX0RJVklERToxMTEsTlVNUEFEX0VOVEVSOjEwOCxOVU1QQURfTVVMVElQTFk6MTA2LApOVU1QQURfU1VCVFJBQ1Q6MTA5LFBBR0VfRE9XTjozNCxQQUdFX1VQOjMzLFBFUklPRDoxOTAsUklHSFQ6MzksU0hJRlQ6MTYsU1BBQ0U6MzIsVEFCOjksVVA6MzgsV0lORE9XUzo5MX19KTtjLmZuLmV4dGVuZCh7X2ZvY3VzOmMuZm4uZm9jdXMsZm9jdXM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdHlwZW9mIGE9PT0ibnVtYmVyIj90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZD10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjKGQpLmZvY3VzKCk7YiYmYi5jYWxsKGQpfSxhKX0pOnRoaXMuX2ZvY3VzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sc2Nyb2xsUGFyZW50OmZ1bmN0aW9uKCl7dmFyIGE7YT1jLmJyb3dzZXIubXNpZSYmLyhzdGF0aWN8cmVsYXRpdmUpLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKXx8L2Fic29sdXRlLy50ZXN0KHRoaXMuY3NzKCJwb3NpdGlvbiIpKT90aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4vKHJlbGF0aXZlfGFic29sdXRlfGZpeGVkKS8udGVzdChjLmN1ckNTUyh0aGlzLAoicG9zaXRpb24iLDEpKSYmLyhhdXRvfHNjcm9sbCkvLnRlc3QoYy5jdXJDU1ModGhpcywib3ZlcmZsb3ciLDEpK2MuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXkiLDEpK2MuY3VyQ1NTKHRoaXMsIm92ZXJmbG93LXgiLDEpKX0pLmVxKDApOnRoaXMucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybi8oYXV0b3xzY3JvbGwpLy50ZXN0KGMuY3VyQ1NTKHRoaXMsIm92ZXJmbG93IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy15IiwxKStjLmN1ckNTUyh0aGlzLCJvdmVyZmxvdy14IiwxKSl9KS5lcSgwKTtyZXR1cm4vZml4ZWQvLnRlc3QodGhpcy5jc3MoInBvc2l0aW9uIikpfHwhYS5sZW5ndGg/Yyhkb2N1bWVudCk6YX0sekluZGV4OmZ1bmN0aW9uKGEpe2lmKGEhPT1qKXJldHVybiB0aGlzLmNzcygiekluZGV4IixhKTtpZih0aGlzLmxlbmd0aCl7YT1jKHRoaXNbMF0pO2Zvcih2YXIgYjthLmxlbmd0aCYmYVswXSE9PWRvY3VtZW50Oyl7Yj1hLmNzcygicG9zaXRpb24iKTsKaWYoYj09PSJhYnNvbHV0ZSJ8fGI9PT0icmVsYXRpdmUifHxiPT09ImZpeGVkIil7Yj1wYXJzZUludChhLmNzcygiekluZGV4IiksMTApO2lmKCFpc05hTihiKSYmYiE9PTApcmV0dXJuIGJ9YT1hLnBhcmVudCgpfX1yZXR1cm4gMH0sZGlzYWJsZVNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJpbmQoKGMuc3VwcG9ydC5zZWxlY3RzdGFydD8ic2VsZWN0c3RhcnQiOiJtb3VzZWRvd24iKSsiLnVpLWRpc2FibGVTZWxlY3Rpb24iLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKX0pfSxlbmFibGVTZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmQoIi51aS1kaXNhYmxlU2VsZWN0aW9uIil9fSk7Yy5lYWNoKFsiV2lkdGgiLCJIZWlnaHQiXSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoZixnLGwsbSl7Yy5lYWNoKGUsZnVuY3Rpb24oKXtnLT1wYXJzZUZsb2F0KGMuY3VyQ1NTKGYsInBhZGRpbmciK3RoaXMsdHJ1ZSkpfHwwO2lmKGwpZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLAoiYm9yZGVyIit0aGlzKyJXaWR0aCIsdHJ1ZSkpfHwwO2lmKG0pZy09cGFyc2VGbG9hdChjLmN1ckNTUyhmLCJtYXJnaW4iK3RoaXMsdHJ1ZSkpfHwwfSk7cmV0dXJuIGd9dmFyIGU9Yj09PSJXaWR0aCI/WyJMZWZ0IiwiUmlnaHQiXTpbIlRvcCIsIkJvdHRvbSJdLGg9Yi50b0xvd2VyQ2FzZSgpLGk9e2lubmVyV2lkdGg6Yy5mbi5pbm5lcldpZHRoLGlubmVySGVpZ2h0OmMuZm4uaW5uZXJIZWlnaHQsb3V0ZXJXaWR0aDpjLmZuLm91dGVyV2lkdGgsb3V0ZXJIZWlnaHQ6Yy5mbi5vdXRlckhlaWdodH07Yy5mblsiaW5uZXIiK2JdPWZ1bmN0aW9uKGYpe2lmKGY9PT1qKXJldHVybiBpWyJpbm5lciIrYl0uY2FsbCh0aGlzKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5jc3MoaCxkKHRoaXMsZikrInB4Iil9KX07Yy5mblsib3V0ZXIiK2JdPWZ1bmN0aW9uKGYsZyl7aWYodHlwZW9mIGYhPT0ibnVtYmVyIilyZXR1cm4gaVsib3V0ZXIiK2JdLmNhbGwodGhpcyxmKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5jc3MoaCwKZCh0aGlzLGYsdHJ1ZSxnKSsicHgiKX0pfX0pO2MuZXh0ZW5kKGMuZXhwclsiOiJdLHtkYXRhOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4hIWMuZGF0YShhLGRbM10pfSxmb2N1c2FibGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGQ9Yy5hdHRyKGEsInRhYmluZGV4Iik7aWYoImFyZWEiPT09Yil7Yj1hLnBhcmVudE5vZGU7ZD1iLm5hbWU7aWYoIWEuaHJlZnx8IWR8fGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJtYXAiKXJldHVybiBmYWxzZTthPWMoImltZ1t1c2VtYXA9IyIrZCsiXSIpWzBdO3JldHVybiEhYSYmayhhKX1yZXR1cm4oL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KGIpPyFhLmRpc2FibGVkOiJhIj09Yj9hLmhyZWZ8fCFpc05hTihkKTohaXNOYU4oZCkpJiZrKGEpfSx0YWJiYWJsZTpmdW5jdGlvbihhKXt2YXIgYj1jLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4oaXNOYU4oYil8fGI+PTApJiZjKGEpLmlzKCI6Zm9jdXNhYmxlIil9fSk7CmMoZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5ib2R5LGI9YS5hcHBlbmRDaGlsZChiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtjLmV4dGVuZChiLnN0eWxlLHttaW5IZWlnaHQ6IjEwMHB4IixoZWlnaHQ6ImF1dG8iLHBhZGRpbmc6MCxib3JkZXJXaWR0aDowfSk7Yy5zdXBwb3J0Lm1pbkhlaWdodD1iLm9mZnNldEhlaWdodD09PTEwMDtjLnN1cHBvcnQuc2VsZWN0c3RhcnQ9Im9uc2VsZWN0c3RhcnQiaW4gYjthLnJlbW92ZUNoaWxkKGIpLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7Yy5leHRlbmQoYy51aSx7cGx1Z2luOnthZGQ6ZnVuY3Rpb24oYSxiLGQpe2E9Yy51aVthXS5wcm90b3R5cGU7Zm9yKHZhciBlIGluIGQpe2EucGx1Z2luc1tlXT1hLnBsdWdpbnNbZV18fFtdO2EucGx1Z2luc1tlXS5wdXNoKFtiLGRbZV1dKX19LGNhbGw6ZnVuY3Rpb24oYSxiLGQpe2lmKChiPWEucGx1Z2luc1tiXSkmJmEuZWxlbWVudFswXS5wYXJlbnROb2RlKWZvcih2YXIgZT0wO2U8Yi5sZW5ndGg7ZSsrKWEub3B0aW9uc1tiW2VdWzBdXSYmCmJbZV1bMV0uYXBwbHkoYS5lbGVtZW50LGQpfX0sY29udGFpbnM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZG9jdW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNjphIT09YiYmYS5jb250YWlucyhiKX0saGFzU2Nyb2xsOmZ1bmN0aW9uKGEsYil7aWYoYyhhKS5jc3MoIm92ZXJmbG93Iik9PT0iaGlkZGVuIilyZXR1cm4gZmFsc2U7Yj1iJiZiPT09ImxlZnQiPyJzY3JvbGxMZWZ0Ijoic2Nyb2xsVG9wIjt2YXIgZD1mYWxzZTtpZihhW2JdPjApcmV0dXJuIHRydWU7YVtiXT0xO2Q9YVtiXT4wO2FbYl09MDtyZXR1cm4gZH0saXNPdmVyQXhpczpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGE+YiYmYTxiK2R9LGlzT3ZlcjpmdW5jdGlvbihhLGIsZCxlLGgsaSl7cmV0dXJuIGMudWkuaXNPdmVyQXhpcyhhLGQsaCkmJmMudWkuaXNPdmVyQXhpcyhiLGUsaSl9fSl9fSkoalF1ZXJ5KTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/ui.core.js,importbuddy/js/ui.core.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/ui.tabs.js,importbuddy/js/ui.tabs.js
LyoKICogalF1ZXJ5IFVJIFRhYnMgMS44LjEyCiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9UYWJzCiAqCiAqIERlcGVuZHM6CiAqCWpxdWVyeS51aS5jb3JlLmpzCiAqCWpxdWVyeS51aS53aWRnZXQuanMKICovCihmdW5jdGlvbihkLHApe2Z1bmN0aW9uIHUoKXtyZXR1cm4rK3Z9ZnVuY3Rpb24gdygpe3JldHVybisreH12YXIgdj0wLHg9MDtkLndpZGdldCgidWkudGFicyIse29wdGlvbnM6e2FkZDpudWxsLGFqYXhPcHRpb25zOm51bGwsY2FjaGU6ZmFsc2UsY29va2llOm51bGwsY29sbGFwc2libGU6ZmFsc2UsZGlzYWJsZTpudWxsLGRpc2FibGVkOltdLGVuYWJsZTpudWxsLGV2ZW50OiJjbGljayIsZng6bnVsbCxpZFByZWZpeDoidWktdGFicy0iLGxvYWQ6bnVsbCxwYW5lbFRlbXBsYXRlOiI8ZGl2PjwvZGl2PiIscmVtb3ZlOm51bGwsc2VsZWN0Om51bGwsc2hvdzpudWxsLHNwaW5uZXI6IjxlbT5Mb2FkaW5nJiM4MjMwOzwvZW0+Iix0YWJUZW1wbGF0ZToiPGxpPjxhIGhyZWY9JyN7aHJlZn0nPjxzcGFuPiN7bGFiZWx9PC9zcGFuPjwvYT48L2xpPiJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl90YWJpZnkodHJ1ZSl9LF9zZXRPcHRpb246ZnVuY3Rpb24oYixlKXtpZihiPT0ic2VsZWN0ZWQiKXRoaXMub3B0aW9ucy5jb2xsYXBzaWJsZSYmCmU9PXRoaXMub3B0aW9ucy5zZWxlY3RlZHx8dGhpcy5zZWxlY3QoZSk7ZWxzZXt0aGlzLm9wdGlvbnNbYl09ZTt0aGlzLl90YWJpZnkoKX19LF90YWJJZDpmdW5jdGlvbihiKXtyZXR1cm4gYi50aXRsZSYmYi50aXRsZS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZSgvW15cd1x1MDBjMC1cdUZGRkYtXS9nLCIiKXx8dGhpcy5vcHRpb25zLmlkUHJlZml4K3UoKX0sX3Nhbml0aXplU2VsZWN0b3I6ZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZSgvOi9nLCJcXDoiKX0sX2Nvb2tpZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuY29va2llfHwodGhpcy5jb29raWU9dGhpcy5vcHRpb25zLmNvb2tpZS5uYW1lfHwidWktdGFicy0iK3coKSk7cmV0dXJuIGQuY29va2llLmFwcGx5KG51bGwsW2JdLmNvbmNhdChkLm1ha2VBcnJheShhcmd1bWVudHMpKSl9LF91aTpmdW5jdGlvbihiLGUpe3JldHVybnt0YWI6YixwYW5lbDplLGluZGV4OnRoaXMuYW5jaG9ycy5pbmRleChiKX19LF9jbGVhbnVwOmZ1bmN0aW9uKCl7dGhpcy5saXMuZmlsdGVyKCIudWktc3RhdGUtcHJvY2Vzc2luZyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1wcm9jZXNzaW5nIikuZmluZCgic3BhbjpkYXRhKGxhYmVsLnRhYnMpIikuZWFjaChmdW5jdGlvbigpe3ZhciBiPQpkKHRoaXMpO2IuaHRtbChiLmRhdGEoImxhYmVsLnRhYnMiKSkucmVtb3ZlRGF0YSgibGFiZWwudGFicyIpfSl9LF90YWJpZnk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZShnLGYpe2cuY3NzKCJkaXNwbGF5IiwiIik7IWQuc3VwcG9ydC5vcGFjaXR5JiZmLm9wYWNpdHkmJmdbMF0uc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKX12YXIgYT10aGlzLGM9dGhpcy5vcHRpb25zLGg9L14jLisvO3RoaXMubGlzdD10aGlzLmVsZW1lbnQuZmluZCgib2wsdWwiKS5lcSgwKTt0aGlzLmxpcz1kKCIgPiBsaTpoYXMoYVtocmVmXSkiLHRoaXMubGlzdCk7dGhpcy5hbmNob3JzPXRoaXMubGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBkKCJhIix0aGlzKVswXX0pO3RoaXMucGFuZWxzPWQoW10pO3RoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKGcsZil7dmFyIGk9ZChmKS5hdHRyKCJocmVmIiksbD1pLnNwbGl0KCIjIilbMF0scTtpZihsJiYobD09PWxvY2F0aW9uLnRvU3RyaW5nKCkuc3BsaXQoIiMiKVswXXx8CihxPWQoImJhc2UiKVswXSkmJmw9PT1xLmhyZWYpKXtpPWYuaGFzaDtmLmhyZWY9aX1pZihoLnRlc3QoaSkpYS5wYW5lbHM9YS5wYW5lbHMuYWRkKGEuZWxlbWVudC5maW5kKGEuX3Nhbml0aXplU2VsZWN0b3IoaSkpKTtlbHNlIGlmKGkmJmkhPT0iIyIpe2QuZGF0YShmLCJocmVmLnRhYnMiLGkpO2QuZGF0YShmLCJsb2FkLnRhYnMiLGkucmVwbGFjZSgvIy4qJC8sIiIpKTtpPWEuX3RhYklkKGYpO2YuaHJlZj0iIyIraTtmPWEuZWxlbWVudC5maW5kKCIjIitpKTtpZighZi5sZW5ndGgpe2Y9ZChjLnBhbmVsVGVtcGxhdGUpLmF0dHIoImlkIixpKS5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIikuaW5zZXJ0QWZ0ZXIoYS5wYW5lbHNbZy0xXXx8YS5saXN0KTtmLmRhdGEoImRlc3Ryb3kudGFicyIsdHJ1ZSl9YS5wYW5lbHM9YS5wYW5lbHMuYWRkKGYpfWVsc2UgYy5kaXNhYmxlZC5wdXNoKGcpfSk7aWYoYil7dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIik7CnRoaXMubGlzdC5hZGRDbGFzcygidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKTt0aGlzLmxpcy5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItdG9wIik7dGhpcy5wYW5lbHMuYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpO2lmKGMuc2VsZWN0ZWQ9PT1wKXtsb2NhdGlvbi5oYXNoJiZ0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihnLGYpe2lmKGYuaGFzaD09bG9jYXRpb24uaGFzaCl7Yy5zZWxlY3RlZD1nO3JldHVybiBmYWxzZX19KTtpZih0eXBlb2YgYy5zZWxlY3RlZCE9PSJudW1iZXIiJiZjLmNvb2tpZSljLnNlbGVjdGVkPXBhcnNlSW50KGEuX2Nvb2tpZSgpLDEwKTtpZih0eXBlb2YgYy5zZWxlY3RlZCE9PSJudW1iZXIiJiZ0aGlzLmxpcy5maWx0ZXIoIi51aS10YWJzLXNlbGVjdGVkIikubGVuZ3RoKWMuc2VsZWN0ZWQ9CnRoaXMubGlzLmluZGV4KHRoaXMubGlzLmZpbHRlcigiLnVpLXRhYnMtc2VsZWN0ZWQiKSk7Yy5zZWxlY3RlZD1jLnNlbGVjdGVkfHwodGhpcy5saXMubGVuZ3RoPzA6LTEpfWVsc2UgaWYoYy5zZWxlY3RlZD09PW51bGwpYy5zZWxlY3RlZD0tMTtjLnNlbGVjdGVkPWMuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9yc1tjLnNlbGVjdGVkXXx8Yy5zZWxlY3RlZDwwP2Muc2VsZWN0ZWQ6MDtjLmRpc2FibGVkPWQudW5pcXVlKGMuZGlzYWJsZWQuY29uY2F0KGQubWFwKHRoaXMubGlzLmZpbHRlcigiLnVpLXN0YXRlLWRpc2FibGVkIiksZnVuY3Rpb24oZyl7cmV0dXJuIGEubGlzLmluZGV4KGcpfSkpKS5zb3J0KCk7ZC5pbkFycmF5KGMuc2VsZWN0ZWQsYy5kaXNhYmxlZCkhPS0xJiZjLmRpc2FibGVkLnNwbGljZShkLmluQXJyYXkoYy5zZWxlY3RlZCxjLmRpc2FibGVkKSwxKTt0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1oaWRlIik7dGhpcy5saXMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7CmlmKGMuc2VsZWN0ZWQ+PTAmJnRoaXMuYW5jaG9ycy5sZW5ndGgpe2EuZWxlbWVudC5maW5kKGEuX3Nhbml0aXplU2VsZWN0b3IoYS5hbmNob3JzW2Muc2VsZWN0ZWRdLmhhc2gpKS5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIik7dGhpcy5saXMuZXEoYy5zZWxlY3RlZCkuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7YS5lbGVtZW50LnF1ZXVlKCJ0YWJzIixmdW5jdGlvbigpe2EuX3RyaWdnZXIoInNob3ciLG51bGwsYS5fdWkoYS5hbmNob3JzW2Muc2VsZWN0ZWRdLGEuZWxlbWVudC5maW5kKGEuX3Nhbml0aXplU2VsZWN0b3IoYS5hbmNob3JzW2Muc2VsZWN0ZWRdLmhhc2gpKVswXSkpfSk7dGhpcy5sb2FkKGMuc2VsZWN0ZWQpfWQod2luZG93KS5iaW5kKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7YS5saXMuYWRkKGEuYW5jaG9ycykudW5iaW5kKCIudGFicyIpO2EubGlzPWEuYW5jaG9ycz1hLnBhbmVscz1udWxsfSl9ZWxzZSBjLnNlbGVjdGVkPXRoaXMubGlzLmluZGV4KHRoaXMubGlzLmZpbHRlcigiLnVpLXRhYnMtc2VsZWN0ZWQiKSk7CnRoaXMuZWxlbWVudFtjLmNvbGxhcHNpYmxlPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInVpLXRhYnMtY29sbGFwc2libGUiKTtjLmNvb2tpZSYmdGhpcy5fY29va2llKGMuc2VsZWN0ZWQsYy5jb29raWUpO2I9MDtmb3IodmFyIGo7aj10aGlzLmxpc1tiXTtiKyspZChqKVtkLmluQXJyYXkoYixjLmRpc2FibGVkKSE9LTEmJiFkKGopLmhhc0NsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIik/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgidWktc3RhdGUtZGlzYWJsZWQiKTtjLmNhY2hlPT09ZmFsc2UmJnRoaXMuYW5jaG9ycy5yZW1vdmVEYXRhKCJjYWNoZS50YWJzIik7dGhpcy5saXMuYWRkKHRoaXMuYW5jaG9ycykudW5iaW5kKCIudGFicyIpO2lmKGMuZXZlbnQhPT0ibW91c2VvdmVyIil7dmFyIGs9ZnVuY3Rpb24oZyxmKXtmLmlzKCI6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkiKSYmZi5hZGRDbGFzcygidWktc3RhdGUtIitnKX0sbj1mdW5jdGlvbihnLGYpe2YucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLSIrCmcpfTt0aGlzLmxpcy5iaW5kKCJtb3VzZW92ZXIudGFicyIsZnVuY3Rpb24oKXtrKCJob3ZlciIsZCh0aGlzKSl9KTt0aGlzLmxpcy5iaW5kKCJtb3VzZW91dC50YWJzIixmdW5jdGlvbigpe24oImhvdmVyIixkKHRoaXMpKX0pO3RoaXMuYW5jaG9ycy5iaW5kKCJmb2N1cy50YWJzIixmdW5jdGlvbigpe2soImZvY3VzIixkKHRoaXMpLmNsb3Nlc3QoImxpIikpfSk7dGhpcy5hbmNob3JzLmJpbmQoImJsdXIudGFicyIsZnVuY3Rpb24oKXtuKCJmb2N1cyIsZCh0aGlzKS5jbG9zZXN0KCJsaSIpKX0pfXZhciBtLG87aWYoYy5meClpZihkLmlzQXJyYXkoYy5meCkpe209Yy5meFswXTtvPWMuZnhbMV19ZWxzZSBtPW89Yy5meDt2YXIgcj1vP2Z1bmN0aW9uKGcsZil7ZChnKS5jbG9zZXN0KCJsaSIpLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO2YuaGlkZSgpLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWhpZGUiKS5hbmltYXRlKG8sby5kdXJhdGlvbnx8Im5vcm1hbCIsCmZ1bmN0aW9uKCl7ZShmLG8pO2EuX3RyaWdnZXIoInNob3ciLG51bGwsYS5fdWkoZyxmWzBdKSl9KX06ZnVuY3Rpb24oZyxmKXtkKGcpLmNsb3Nlc3QoImxpIikuYWRkQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIik7Zi5yZW1vdmVDbGFzcygidWktdGFicy1oaWRlIik7YS5fdHJpZ2dlcigic2hvdyIsbnVsbCxhLl91aShnLGZbMF0pKX0scz1tP2Z1bmN0aW9uKGcsZil7Zi5hbmltYXRlKG0sbS5kdXJhdGlvbnx8Im5vcm1hbCIsZnVuY3Rpb24oKXthLmxpcy5yZW1vdmVDbGFzcygidWktdGFicy1zZWxlY3RlZCB1aS1zdGF0ZS1hY3RpdmUiKTtmLmFkZENsYXNzKCJ1aS10YWJzLWhpZGUiKTtlKGYsbSk7YS5lbGVtZW50LmRlcXVldWUoInRhYnMiKX0pfTpmdW5jdGlvbihnLGYpe2EubGlzLnJlbW92ZUNsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO2YuYWRkQ2xhc3MoInVpLXRhYnMtaGlkZSIpO2EuZWxlbWVudC5kZXF1ZXVlKCJ0YWJzIil9Owp0aGlzLmFuY2hvcnMuYmluZChjLmV2ZW50KyIudGFicyIsZnVuY3Rpb24oKXt2YXIgZz10aGlzLGY9ZChnKS5jbG9zZXN0KCJsaSIpLGk9YS5wYW5lbHMuZmlsdGVyKCI6bm90KC51aS10YWJzLWhpZGUpIiksbD1hLmVsZW1lbnQuZmluZChhLl9zYW5pdGl6ZVNlbGVjdG9yKGcuaGFzaCkpO2lmKGYuaGFzQ2xhc3MoInVpLXRhYnMtc2VsZWN0ZWQiKSYmIWMuY29sbGFwc2libGV8fGYuaGFzQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIil8fGYuaGFzQ2xhc3MoInVpLXN0YXRlLXByb2Nlc3NpbmciKXx8YS5wYW5lbHMuZmlsdGVyKCI6YW5pbWF0ZWQiKS5sZW5ndGh8fGEuX3RyaWdnZXIoInNlbGVjdCIsbnVsbCxhLl91aSh0aGlzLGxbMF0pKT09PWZhbHNlKXt0aGlzLmJsdXIoKTtyZXR1cm4gZmFsc2V9Yy5zZWxlY3RlZD1hLmFuY2hvcnMuaW5kZXgodGhpcyk7YS5hYm9ydCgpO2lmKGMuY29sbGFwc2libGUpaWYoZi5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpKXtjLnNlbGVjdGVkPQotMTtjLmNvb2tpZSYmYS5fY29va2llKGMuc2VsZWN0ZWQsYy5jb29raWUpO2EuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtzKGcsaSl9KS5kZXF1ZXVlKCJ0YWJzIik7dGhpcy5ibHVyKCk7cmV0dXJuIGZhbHNlfWVsc2UgaWYoIWkubGVuZ3RoKXtjLmNvb2tpZSYmYS5fY29va2llKGMuc2VsZWN0ZWQsYy5jb29raWUpO2EuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtyKGcsbCl9KTthLmxvYWQoYS5hbmNob3JzLmluZGV4KHRoaXMpKTt0aGlzLmJsdXIoKTtyZXR1cm4gZmFsc2V9Yy5jb29raWUmJmEuX2Nvb2tpZShjLnNlbGVjdGVkLGMuY29va2llKTtpZihsLmxlbmd0aCl7aS5sZW5ndGgmJmEuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtzKGcsaSl9KTthLmVsZW1lbnQucXVldWUoInRhYnMiLGZ1bmN0aW9uKCl7cihnLGwpfSk7YS5sb2FkKGEuYW5jaG9ycy5pbmRleCh0aGlzKSl9ZWxzZSB0aHJvdyJqUXVlcnkgVUkgVGFiczogTWlzbWF0Y2hpbmcgZnJhZ21lbnQgaWRlbnRpZmllci4iOwpkLmJyb3dzZXIubXNpZSYmdGhpcy5ibHVyKCl9KTt0aGlzLmFuY2hvcnMuYmluZCgiY2xpY2sudGFicyIsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9KX0sX2dldEluZGV4OmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiPT0ic3RyaW5nIiliPXRoaXMuYW5jaG9ycy5pbmRleCh0aGlzLmFuY2hvcnMuZmlsdGVyKCJbaHJlZiQ9IitiKyJdIikpO3JldHVybiBifSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vcHRpb25zO3RoaXMuYWJvcnQoKTt0aGlzLmVsZW1lbnQudW5iaW5kKCIudGFicyIpLnJlbW92ZUNsYXNzKCJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIHVpLXRhYnMtY29sbGFwc2libGUiKS5yZW1vdmVEYXRhKCJ0YWJzIik7dGhpcy5saXN0LnJlbW92ZUNsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpO3RoaXMuYW5jaG9ycy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9CmQuZGF0YSh0aGlzLCJocmVmLnRhYnMiKTtpZihlKXRoaXMuaHJlZj1lO3ZhciBhPWQodGhpcykudW5iaW5kKCIudGFicyIpO2QuZWFjaChbImhyZWYiLCJsb2FkIiwiY2FjaGUiXSxmdW5jdGlvbihjLGgpe2EucmVtb3ZlRGF0YShoKyIudGFicyIpfSl9KTt0aGlzLmxpcy51bmJpbmQoIi50YWJzIikuYWRkKHRoaXMucGFuZWxzKS5lYWNoKGZ1bmN0aW9uKCl7ZC5kYXRhKHRoaXMsImRlc3Ryb3kudGFicyIpP2QodGhpcykucmVtb3ZlKCk6ZCh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItdG9wIHVpLXRhYnMtc2VsZWN0ZWQgdWktc3RhdGUtYWN0aXZlIHVpLXN0YXRlLWhvdmVyIHVpLXN0YXRlLWZvY3VzIHVpLXN0YXRlLWRpc2FibGVkIHVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS10YWJzLWhpZGUiKX0pO2IuY29va2llJiZ0aGlzLl9jb29raWUobnVsbCxiLmNvb2tpZSk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihiLAplLGEpe2lmKGE9PT1wKWE9dGhpcy5hbmNob3JzLmxlbmd0aDt2YXIgYz10aGlzLGg9dGhpcy5vcHRpb25zO2U9ZChoLnRhYlRlbXBsYXRlLnJlcGxhY2UoLyNce2hyZWZcfS9nLGIpLnJlcGxhY2UoLyNce2xhYmVsXH0vZyxlKSk7Yj0hYi5pbmRleE9mKCIjIik/Yi5yZXBsYWNlKCIjIiwiIik6dGhpcy5fdGFiSWQoZCgiYSIsZSlbMF0pO2UuYWRkQ2xhc3MoInVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLXRvcCIpLmRhdGEoImRlc3Ryb3kudGFicyIsdHJ1ZSk7dmFyIGo9Yy5lbGVtZW50LmZpbmQoIiMiK2IpO2oubGVuZ3RofHwoaj1kKGgucGFuZWxUZW1wbGF0ZSkuYXR0cigiaWQiLGIpLmRhdGEoImRlc3Ryb3kudGFicyIsdHJ1ZSkpO2ouYWRkQ2xhc3MoInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSB1aS10YWJzLWhpZGUiKTtpZihhPj10aGlzLmxpcy5sZW5ndGgpe2UuYXBwZW5kVG8odGhpcy5saXN0KTtqLmFwcGVuZFRvKHRoaXMubGlzdFswXS5wYXJlbnROb2RlKX1lbHNle2UuaW5zZXJ0QmVmb3JlKHRoaXMubGlzW2FdKTsKai5pbnNlcnRCZWZvcmUodGhpcy5wYW5lbHNbYV0pfWguZGlzYWJsZWQ9ZC5tYXAoaC5kaXNhYmxlZCxmdW5jdGlvbihrKXtyZXR1cm4gaz49YT8rK2s6a30pO3RoaXMuX3RhYmlmeSgpO2lmKHRoaXMuYW5jaG9ycy5sZW5ndGg9PTEpe2guc2VsZWN0ZWQ9MDtlLmFkZENsYXNzKCJ1aS10YWJzLXNlbGVjdGVkIHVpLXN0YXRlLWFjdGl2ZSIpO2oucmVtb3ZlQ2xhc3MoInVpLXRhYnMtaGlkZSIpO3RoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsZnVuY3Rpb24oKXtjLl90cmlnZ2VyKCJzaG93IixudWxsLGMuX3VpKGMuYW5jaG9yc1swXSxjLnBhbmVsc1swXSkpfSk7dGhpcy5sb2FkKDApfXRoaXMuX3RyaWdnZXIoImFkZCIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbYV0sdGhpcy5wYW5lbHNbYV0pKTtyZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKGIpe2I9dGhpcy5fZ2V0SW5kZXgoYik7dmFyIGU9dGhpcy5vcHRpb25zLGE9dGhpcy5saXMuZXEoYikucmVtb3ZlKCksYz10aGlzLnBhbmVscy5lcShiKS5yZW1vdmUoKTsKaWYoYS5oYXNDbGFzcygidWktdGFicy1zZWxlY3RlZCIpJiZ0aGlzLmFuY2hvcnMubGVuZ3RoPjEpdGhpcy5zZWxlY3QoYisoYisxPHRoaXMuYW5jaG9ycy5sZW5ndGg/MTotMSkpO2UuZGlzYWJsZWQ9ZC5tYXAoZC5ncmVwKGUuZGlzYWJsZWQsZnVuY3Rpb24oaCl7cmV0dXJuIGghPWJ9KSxmdW5jdGlvbihoKXtyZXR1cm4gaD49Yj8tLWg6aH0pO3RoaXMuX3RhYmlmeSgpO3RoaXMuX3RyaWdnZXIoInJlbW92ZSIsbnVsbCx0aGlzLl91aShhLmZpbmQoImEiKVswXSxjWzBdKSk7cmV0dXJuIHRoaXN9LGVuYWJsZTpmdW5jdGlvbihiKXtiPXRoaXMuX2dldEluZGV4KGIpO3ZhciBlPXRoaXMub3B0aW9ucztpZihkLmluQXJyYXkoYixlLmRpc2FibGVkKSE9LTEpe3RoaXMubGlzLmVxKGIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpO2UuZGlzYWJsZWQ9ZC5ncmVwKGUuZGlzYWJsZWQsZnVuY3Rpb24oYSl7cmV0dXJuIGEhPWJ9KTt0aGlzLl90cmlnZ2VyKCJlbmFibGUiLG51bGwsCnRoaXMuX3VpKHRoaXMuYW5jaG9yc1tiXSx0aGlzLnBhbmVsc1tiXSkpO3JldHVybiB0aGlzfX0sZGlzYWJsZTpmdW5jdGlvbihiKXtiPXRoaXMuX2dldEluZGV4KGIpO3ZhciBlPXRoaXMub3B0aW9ucztpZihiIT1lLnNlbGVjdGVkKXt0aGlzLmxpcy5lcShiKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKTtlLmRpc2FibGVkLnB1c2goYik7ZS5kaXNhYmxlZC5zb3J0KCk7dGhpcy5fdHJpZ2dlcigiZGlzYWJsZSIsbnVsbCx0aGlzLl91aSh0aGlzLmFuY2hvcnNbYl0sdGhpcy5wYW5lbHNbYl0pKX1yZXR1cm4gdGhpc30sc2VsZWN0OmZ1bmN0aW9uKGIpe2I9dGhpcy5fZ2V0SW5kZXgoYik7aWYoYj09LTEpaWYodGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlJiZ0aGlzLm9wdGlvbnMuc2VsZWN0ZWQhPS0xKWI9dGhpcy5vcHRpb25zLnNlbGVjdGVkO2Vsc2UgcmV0dXJuIHRoaXM7dGhpcy5hbmNob3JzLmVxKGIpLnRyaWdnZXIodGhpcy5vcHRpb25zLmV2ZW50KyIudGFicyIpO3JldHVybiB0aGlzfSwKbG9hZDpmdW5jdGlvbihiKXtiPXRoaXMuX2dldEluZGV4KGIpO3ZhciBlPXRoaXMsYT10aGlzLm9wdGlvbnMsYz10aGlzLmFuY2hvcnMuZXEoYilbMF0saD1kLmRhdGEoYywibG9hZC50YWJzIik7dGhpcy5hYm9ydCgpO2lmKCFofHx0aGlzLmVsZW1lbnQucXVldWUoInRhYnMiKS5sZW5ndGghPT0wJiZkLmRhdGEoYywiY2FjaGUudGFicyIpKXRoaXMuZWxlbWVudC5kZXF1ZXVlKCJ0YWJzIik7ZWxzZXt0aGlzLmxpcy5lcShiKS5hZGRDbGFzcygidWktc3RhdGUtcHJvY2Vzc2luZyIpO2lmKGEuc3Bpbm5lcil7dmFyIGo9ZCgic3BhbiIsYyk7ai5kYXRhKCJsYWJlbC50YWJzIixqLmh0bWwoKSkuaHRtbChhLnNwaW5uZXIpfXRoaXMueGhyPWQuYWpheChkLmV4dGVuZCh7fSxhLmFqYXhPcHRpb25zLHt1cmw6aCxzdWNjZXNzOmZ1bmN0aW9uKGssbil7ZS5lbGVtZW50LmZpbmQoZS5fc2FuaXRpemVTZWxlY3RvcihjLmhhc2gpKS5odG1sKGspO2UuX2NsZWFudXAoKTthLmNhY2hlJiZkLmRhdGEoYywKImNhY2hlLnRhYnMiLHRydWUpO2UuX3RyaWdnZXIoImxvYWQiLG51bGwsZS5fdWkoZS5hbmNob3JzW2JdLGUucGFuZWxzW2JdKSk7dHJ5e2EuYWpheE9wdGlvbnMuc3VjY2VzcyhrLG4pfWNhdGNoKG0pe319LGVycm9yOmZ1bmN0aW9uKGssbil7ZS5fY2xlYW51cCgpO2UuX3RyaWdnZXIoImxvYWQiLG51bGwsZS5fdWkoZS5hbmNob3JzW2JdLGUucGFuZWxzW2JdKSk7dHJ5e2EuYWpheE9wdGlvbnMuZXJyb3IoayxuLGIsYyl9Y2F0Y2gobSl7fX19KSk7ZS5lbGVtZW50LmRlcXVldWUoInRhYnMiKTtyZXR1cm4gdGhpc319LGFib3J0OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnF1ZXVlKFtdKTt0aGlzLnBhbmVscy5zdG9wKGZhbHNlLHRydWUpO3RoaXMuZWxlbWVudC5xdWV1ZSgidGFicyIsdGhpcy5lbGVtZW50LnF1ZXVlKCJ0YWJzIikuc3BsaWNlKC0yLDIpKTtpZih0aGlzLnhocil7dGhpcy54aHIuYWJvcnQoKTtkZWxldGUgdGhpcy54aHJ9dGhpcy5fY2xlYW51cCgpO3JldHVybiB0aGlzfSwKdXJsOmZ1bmN0aW9uKGIsZSl7dGhpcy5hbmNob3JzLmVxKGIpLnJlbW92ZURhdGEoImNhY2hlLnRhYnMiKS5kYXRhKCJsb2FkLnRhYnMiLGUpO3JldHVybiB0aGlzfSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmNob3JzLmxlbmd0aH19KTtkLmV4dGVuZChkLnVpLnRhYnMse3ZlcnNpb246IjEuOC4xMiJ9KTtkLmV4dGVuZChkLnVpLnRhYnMucHJvdG90eXBlLHtyb3RhdGlvbjpudWxsLHJvdGF0ZTpmdW5jdGlvbihiLGUpe3ZhciBhPXRoaXMsYz10aGlzLm9wdGlvbnMsaD1hLl9yb3RhdGV8fChhLl9yb3RhdGU9ZnVuY3Rpb24oail7Y2xlYXJUaW1lb3V0KGEucm90YXRpb24pO2Eucm90YXRpb249c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBrPWMuc2VsZWN0ZWQ7YS5zZWxlY3QoKytrPGEuYW5jaG9ycy5sZW5ndGg/azowKX0sYik7aiYmai5zdG9wUHJvcGFnYXRpb24oKX0pO2U9YS5fdW5yb3RhdGV8fChhLl91bnJvdGF0ZT0hZT9mdW5jdGlvbihqKXtqLmNsaWVudFgmJgphLnJvdGF0ZShudWxsKX06ZnVuY3Rpb24oKXt0PWMuc2VsZWN0ZWQ7aCgpfSk7aWYoYil7dGhpcy5lbGVtZW50LmJpbmQoInRhYnNzaG93IixoKTt0aGlzLmFuY2hvcnMuYmluZChjLmV2ZW50KyIudGFicyIsZSk7aCgpfWVsc2V7Y2xlYXJUaW1lb3V0KGEucm90YXRpb24pO3RoaXMuZWxlbWVudC51bmJpbmQoInRhYnNzaG93IixoKTt0aGlzLmFuY2hvcnMudW5iaW5kKGMuZXZlbnQrIi50YWJzIixlKTtkZWxldGUgdGhpcy5fcm90YXRlO2RlbGV0ZSB0aGlzLl91bnJvdGF0ZX1yZXR1cm4gdGhpc319KX0pKGpRdWVyeSk7
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/ui.tabs.js,importbuddy/js/ui.tabs.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/js/ui.widget.js,importbuddy/js/ui.widget.js
LyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS44LjEyCiAqCiAqIENvcHlyaWdodCAyMDExLCBBVVRIT1JTLnR4dCAoaHR0cDovL2pxdWVyeXVpLmNvbS9hYm91dCkKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VSS9XaWRnZXQKICovCihmdW5jdGlvbihiLGope2lmKGIuY2xlYW5EYXRhKXt2YXIgaz1iLmNsZWFuRGF0YTtiLmNsZWFuRGF0YT1mdW5jdGlvbihhKXtmb3IodmFyIGM9MCxkOyhkPWFbY10pIT1udWxsO2MrKyliKGQpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKTtrKGEpfX1lbHNle3ZhciBsPWIuZm4ucmVtb3ZlO2IuZm4ucmVtb3ZlPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCFjKWlmKCFhfHxiLmZpbHRlcihhLFt0aGlzXSkubGVuZ3RoKWIoIioiLHRoaXMpLmFkZChbdGhpc10pLmVhY2goZnVuY3Rpb24oKXtiKHRoaXMpLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX0pO3JldHVybiBsLmNhbGwoYih0aGlzKSxhLGMpfSl9fWIud2lkZ2V0PWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1hLnNwbGl0KCIuIilbMF0sZjthPWEuc3BsaXQoIi4iKVsxXTtmPWUrIi0iK2E7aWYoIWQpe2Q9YztjPWIuV2lkZ2V0fWIuZXhwclsiOiJdW2ZdPWZ1bmN0aW9uKGgpe3JldHVybiEhYi5kYXRhKGgsCmEpfTtiW2VdPWJbZV18fHt9O2JbZV1bYV09ZnVuY3Rpb24oaCxnKXthcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoaCxnKX07Yz1uZXcgYztjLm9wdGlvbnM9Yi5leHRlbmQodHJ1ZSx7fSxjLm9wdGlvbnMpO2JbZV1bYV0ucHJvdG90eXBlPWIuZXh0ZW5kKHRydWUsYyx7bmFtZXNwYWNlOmUsd2lkZ2V0TmFtZTphLHdpZGdldEV2ZW50UHJlZml4OmJbZV1bYV0ucHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4fHxhLHdpZGdldEJhc2VDbGFzczpmfSxkKTtiLndpZGdldC5icmlkZ2UoYSxiW2VdW2FdKX07Yi53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKGEsYyl7Yi5mblthXT1mdW5jdGlvbihkKXt2YXIgZT10eXBlb2YgZD09PSJzdHJpbmciLGY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGg9dGhpcztkPSFlJiZmLmxlbmd0aD9iLmV4dGVuZC5hcHBseShudWxsLFt0cnVlLGRdLmNvbmNhdChmKSk6ZDtpZihlJiZkLmNoYXJBdCgwKT09PSJfIilyZXR1cm4gaDsKZT90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZz1iLmRhdGEodGhpcyxhKSxpPWcmJmIuaXNGdW5jdGlvbihnW2RdKT9nW2RdLmFwcGx5KGcsZik6ZztpZihpIT09ZyYmaSE9PWope2g9aTtyZXR1cm4gZmFsc2V9fSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGc9Yi5kYXRhKHRoaXMsYSk7Zz9nLm9wdGlvbihkfHx7fSkuX2luaXQoKTpiLmRhdGEodGhpcyxhLG5ldyBjKGQsdGhpcykpfSk7cmV0dXJuIGh9fTtiLldpZGdldD1mdW5jdGlvbihhLGMpe2FyZ3VtZW50cy5sZW5ndGgmJnRoaXMuX2NyZWF0ZVdpZGdldChhLGMpfTtiLldpZGdldC5wcm90b3R5cGU9e3dpZGdldE5hbWU6IndpZGdldCIsd2lkZ2V0RXZlbnRQcmVmaXg6IiIsb3B0aW9uczp7ZGlzYWJsZWQ6ZmFsc2V9LF9jcmVhdGVXaWRnZXQ6ZnVuY3Rpb24oYSxjKXtiLmRhdGEoYyx0aGlzLndpZGdldE5hbWUsdGhpcyk7dGhpcy5lbGVtZW50PWIoYyk7dGhpcy5vcHRpb25zPWIuZXh0ZW5kKHRydWUse30sdGhpcy5vcHRpb25zLAp0aGlzLl9nZXRDcmVhdGVPcHRpb25zKCksYSk7dmFyIGQ9dGhpczt0aGlzLmVsZW1lbnQuYmluZCgicmVtb3ZlLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKCl7ZC5kZXN0cm95KCl9KTt0aGlzLl9jcmVhdGUoKTt0aGlzLl90cmlnZ2VyKCJjcmVhdGUiKTt0aGlzLl9pbml0KCl9LF9nZXRDcmVhdGVPcHRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIGIubWV0YWRhdGEmJmIubWV0YWRhdGEuZ2V0KHRoaXMuZWxlbWVudFswXSlbdGhpcy53aWRnZXROYW1lXX0sX2NyZWF0ZTpmdW5jdGlvbigpe30sX2luaXQ6ZnVuY3Rpb24oKXt9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpLnJlbW92ZURhdGEodGhpcy53aWRnZXROYW1lKTt0aGlzLndpZGdldCgpLnVuYmluZCgiLiIrdGhpcy53aWRnZXROYW1lKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIikucmVtb3ZlQ2xhc3ModGhpcy53aWRnZXRCYXNlQ2xhc3MrIi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIpfSwKd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudH0sb3B0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9YTtpZihhcmd1bWVudHMubGVuZ3RoPT09MClyZXR1cm4gYi5leHRlbmQoe30sdGhpcy5vcHRpb25zKTtpZih0eXBlb2YgYT09PSJzdHJpbmciKXtpZihjPT09ailyZXR1cm4gdGhpcy5vcHRpb25zW2FdO2Q9e307ZFthXT1jfXRoaXMuX3NldE9wdGlvbnMoZCk7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7Yi5lYWNoKGEsZnVuY3Rpb24oZCxlKXtjLl9zZXRPcHRpb24oZCxlKX0pO3JldHVybiB0aGlzfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGEsYyl7dGhpcy5vcHRpb25zW2FdPWM7aWYoYT09PSJkaXNhYmxlZCIpdGhpcy53aWRnZXQoKVtjPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0odGhpcy53aWRnZXRCYXNlQ2xhc3MrIi1kaXNhYmxlZCB1aS1zdGF0ZS1kaXNhYmxlZCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLGMpO3JldHVybiB0aGlzfSwKZW5hYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NldE9wdGlvbigiZGlzYWJsZWQiLGZhbHNlKX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIix0cnVlKX0sX3RyaWdnZXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPXRoaXMub3B0aW9uc1thXTtjPWIuRXZlbnQoYyk7Yy50eXBlPShhPT09dGhpcy53aWRnZXRFdmVudFByZWZpeD9hOnRoaXMud2lkZ2V0RXZlbnRQcmVmaXgrYSkudG9Mb3dlckNhc2UoKTtkPWR8fHt9O2lmKGMub3JpZ2luYWxFdmVudCl7YT1iLmV2ZW50LnByb3BzLmxlbmd0aDtmb3IodmFyIGY7YTspe2Y9Yi5ldmVudC5wcm9wc1stLWFdO2NbZl09Yy5vcmlnaW5hbEV2ZW50W2ZdfX10aGlzLmVsZW1lbnQudHJpZ2dlcihjLGQpO3JldHVybiEoYi5pc0Z1bmN0aW9uKGUpJiZlLmNhbGwodGhpcy5lbGVtZW50WzBdLGMsZCk9PT1mYWxzZXx8Yy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl9fX0pKGpRdWVyeSk7
###PACKDATA,FILE_END,/_importbuddy/importbuddy/js/ui.widget.js,importbuddy/js/ui.widget.js
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_assets.php,importbuddy/views/_assets.php
PD9waHAKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdzdHlsZS5jc3MnICk7CgpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdqcXVlcnkuanMnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ3VpLmNvcmUuanMnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ3VpLndpZGdldC5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAndWkudGFicy5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAndG9vbHRpcC5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnbnByb2dyZXNzLmpzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdpbXBvcnRidWRkeS5qcycgKTsKCi8vIFR1dG9yaWFsCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2pxdWVyeS5qb3lyaWRlLTIuMC4zLmpzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdtb2Rlcm5penIubXEuanMnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnam95cmlkZS5jc3MnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnbnByb2dyZXNzLmNzcycgKTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_assets.php,importbuddy/views/_assets.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_dbreplace.php,importbuddy/views/_dbreplace.php
PD9waHAKaWYgKCAhIGlzX2FkbWluKCkgKSB7IC8vIE5vdCBpbiBXb3JkUHJlc3MgKG9yIG5vdCBsb2dnZWQgaW4pLiBDaGVjayBpZiBpbiBJbXBvcnRCdWRkeS4KCWlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgfHwgKCB0cnVlICE9PSBQQl9JTVBPUlRCVUREWSApICkgeyAvLyBOb3QgaW4gSW1wb3J0QnVkZHkuCgkJZGllKCAnPGh0bWw+PC9odG1sPicgKTsKCX0KCS8vIEluIEltcG9ydEJ1ZGR5IHNvIGNoZWNrIGF1dGhlbnRpY2F0aW9uLgoJQXV0aDo6cmVxdWlyZV9hdXRoZW50aWNhdGlvbigpOyAvLyBEaWUgaWYgbm90IGxvZ2dlZCBpbi4KfQoKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhZG1pbi5jc3MnLCB0cnVlICk7Cmdsb2JhbCAkd3BkYjsKCgplY2hvICc8YSBuYW1lPSJkYXRhYmFzZV9yZXBsYWNlIj48L2E+JzsKZWNobyAnVGhpcyB0b29sIGFsbG93cyB5b3UgdG8gYXV0b21hdGljYWxseSByZXBsYWNlIHRleHQgY29udGFpbmVkIHRocm91Z2hvdXQgeW91ciBXb3JkUHJlc3MgZGF0YWJhc2UuPGJyPic7CmVjaG8gJzxicj48Yj5Ob3RlOjwvYj4gSW1wb3J0QnVkZHkgYXV0b21hdGljYWxseSBoYW5kbGVzIG1pZ3JhdGluZyAmIHJlcGxhY2luZyB5b3VyIHNpdGUgVVJMcyBhbmQgZmlsZSBwYXRocyBkdXJpbmcgcmVzdG9yZS9taWdyYXRpb247IHRoaXMgdG9vbCBpcyBub3QgbmVlZGVkIGZvciBub3JtYWwgYmFja3VwIC8gcmVzdG9yZSBvcGVyYXRpb25zLic7CmVjaG8gJzxwPjxiPlRpcDo8L2I+IFdoZW4gcmVwbGFjaW5nIGEgc2l0ZSBhZGRyZXNzIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIFVSTCBzbyBtdWx0aXBsZSBwYXNzZXMgYXQgcmVwbGFjZW1lbnRzIG1heSBuZWVkIHRvIGJlIG1hZGUuIEllLiBodHRwOi8vc2l0ZS5jb20sIGh0dHA6Ly88Yj53d3cuPC9iPnNpdGUuY29tLCBodHRwPGI+czwvYj46Ly9zaXRlLmNvbSwgZXRjLjwvcD4nOwplY2hvICc8cD48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9idWxsZXRfZXJyb3IucG5nIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7Ij4gQ2F1dGlvbjogVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlLiBVc2Ugd2l0aCBjYXJlOyBpbXByb3BlciB1c2UgbWF5IHJlc3VsdCBpbiBkYXRhIGxvc3MuPC9wPic7CmVjaG8gJzxicj4nOwoKCmlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkYXRhYmFzZV9yZXBsYWNlJyApID09ICcxJyApIHsKCQoJZ2xvYmFsICRwYl9iYWNrdXBidWRkeV9qc19zdGF0dXM7CgkkcGJfYmFja3VwYnVkZHlfanNfc3RhdHVzID0gdHJ1ZTsKCQoJCgllY2hvICc8ZGl2IGlkPSJwYl9pbXBvcnRidWRkeV93b3JraW5nIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nX2xhcmdlLmdpZiIgdGl0bGU9IldvcmtpbmcuLi4gUGxlYXNlIHdhaXQgYXMgdGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLiI+PC9kaXY+JzsKCWVjaG8gJzxzY3JpcHQ+alF1ZXJ5KCIjcGJfYmFja3VwYnVkZHlfc3RhdHVzX3dyYXAiKS5zaG93KCk7PC9zY3JpcHQ+JzsKCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJLy9lY2hvICc8ZGl2IGlkPSJwYl9iYWNrdXBidWRkeV9yZXBsYWNlX3dvcmtpbmciPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmdfbGFyZ2UuZ2lmIiB0aXRsZT0iV29ya2luZy4uLiBQbGVhc2Ugd2FpdCBhcyB0aGlzIG1heSB0YWtlIGEgbW9tZW50Li4uIj48L2Rpdj4nOwoJCgkvLyBJbnN0YW50aWF0ZSBkYXRhYmFzZSByZXBsYWNlbWVudCBjbGFzcy4KCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9kYnJlcGxhY2UvZGJyZXBsYWNlLnBocCcgKTsKCSRkYnJlcGxhY2UgPSBuZXcgcGx1Z2luYnVkZHlfZGJyZXBsYWNlKCAnJywgMSwgNjAqNjAqMjQgKTsKCQoJLy8gU2V0IHVwIHZhcmlhYmxlcyBieSBnZXR0aW5nIFBPU1QgZGF0YS4KCSRuZWVkbGUgPSBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ25lZWRsZScgKSApOwoJaWYgKCAkbmVlZGxlID09ICcnICkgewoJCWVjaG8gJzxiPkVycm9yICM0NDU2NTgyLiBNaXNzaW5nIG5lZWRsZS4gWW91IG11c3QgZW50ZXIgdGV4dCB0byBzZWFyY2ggZm9yLic7CgkJZWNobyAnPGJyPjxhIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmcGFyZW50X2NvbmZpZz0nIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhcmVudF9jb25maWcnICkgKSAuICciIGNsYXNzPSJidXR0b24gc2Vjb25kYXJ5LWJ1dHRvbiI+JmxhcnI7ICcgLiAgX18oICdiYWNrJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPic7CgkJcmV0dXJuOwoJfQoJJHJlcGxhY2VtZW50ID0gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXBsYWNlbWVudCcgKSApOwoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVwbGFjaW5nIGAnIC4gJG5lZWRsZSAuICdgIHdpdGggYCcgLiAkcmVwbGFjZW1lbnQgLiAnYC4nICk7CgkvKgoJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdtYXliZV9zZXJpYWxpemVkJyApID09ICd0cnVlJyApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdBY2NvdW50aW5nIGZvciBzZXJpYWxpemVkIGRhdGEgYmFzZWQgb24gc2V0dGluZ3MuJyApOwoJCSRtYXliZV9zZXJpYWxpemVkID0gdHJ1ZTsKCX0gZWxzZSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnTk9UIGFjY291bnRpbmcgZm9yIHNlcmlhbGl6ZWQgZGF0YSBiYXNlZCBvbiBzZXR0aW5ncy4gVXNlIHdpdGggY2F1dGlvbi4nICk7CgkJJG1heWJlX3NlcmlhbGl6ZWQgPSBmYWxzZTsKCX0KCSovCgkKCQoJLy8gUmVwbGFjZSBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0YWJsZSByZXBsYWNlbWVudCBzZWxlY3RlZC4KCWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAndGFibGVfc2VsZWN0aW9uJyApID09ICdhbGwnICkgeyAvLyBBbGwgdGFibGVzLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2luZyBpbiBhbGwgdGFibGVzIGJhc2VkIG9uIHNldHRpbmdzLicgKTsKCQkKCQkkdGFibGVzID0gYXJyYXkoKTsKCQkkcmVzdWx0ID0gbXlzcWxfcXVlcnkoICdTSE9XIFRBQkxFUycsICR3cGRiLT5kYmggKTsKCQl3aGlsZSggJHJzID0gbXlzcWxfZmV0Y2hfcm93KCAkcmVzdWx0ICkgKSB7CgkJCSR0YWJsZXNbXSA9ICRyc1swXTsKCQl9CgkJbXlzcWxfZnJlZV9yZXN1bHQoICRyZXN1bHQgKTsgLy8gRnJlZSBtZW1vcnkuCgkJZm9yZWFjaCggJHRhYmxlcyBhcyAkdGFibGUgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2luZyBpbiB0YWJsZSBgJyAuICR0YWJsZSAuICdgLicgKTsKCQkJJGRicmVwbGFjZS0+YnJ1dGVmb3JjZV90YWJsZSggJHRhYmxlLCBhcnJheSggJG5lZWRsZSApLCBhcnJheSggJHJlcGxhY2VtZW50ICkgKTsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVwbGFjZW1lbnQgZmluaXNoZWQuJyApOwoJfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd0YWJsZV9zZWxlY3Rpb24nICkgPT0gJ3NpbmdsZV90YWJsZScgKSB7CgkJJHRhYmxlID0gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd0YWJsZScgKSApOyAvLyBTaW5nbGUgc3BlY2lmaWVkIHRhYmxlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2luZyBpbiBzaW5nbGUgdGFibGUgYCcgLiAkdGFibGUgLiAnYCBiYXNlZCBvbiBzZXR0aW5ncy4nICk7CgkJJGRicmVwbGFjZS0+YnJ1dGVmb3JjZV90YWJsZSggJHRhYmxlLCBhcnJheSggJG5lZWRsZSApLCBhcnJheSggJHJlcGxhY2VtZW50ICkgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZXBsYWNlbWVudCBmaW5pc2hlZC4nICk7Cgl9IGVsc2VpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3RhYmxlX3NlbGVjdGlvbicgKSA9PSAncHJlZml4JyApIHsgLy8gTWF0Y2hpbmcgdGFibGUgcHJlZml4LgoJCSRwcmVmaXggPSBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3RhYmxlX3ByZWZpeCcgKSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2luZyBpbiBhbGwgdGFibGVzIG1hdGNoaW5nIHByZWZpeCBgJyAuICRwcmVmaXggLiAnYC4nICk7CgkJCgkJJHRhYmxlcyA9IGFycmF5KCk7CgkJJGVzY2FwZWRfcHJlZml4ID0gc3RyX3JlcGxhY2UoICdfJywgJ1xfJywgJHByZWZpeCApOwoJCSRyZXN1bHQgPSBteXNxbF9xdWVyeSggIlNIT1cgVEFCTEVTIExJS0UgJ3skZXNjYXBlZF9wcmVmaXh9JSciLCAkd3BkYi0+ZGJoICk7CgkJd2hpbGUoICRycyA9IG15c3FsX2ZldGNoX3JvdyggJHJlc3VsdCApICkgewoJCQkkdGFibGVzW10gPSAkcnNbMF07CgkJfQoJCW15c3FsX2ZyZWVfcmVzdWx0KCAkcmVzdWx0ICk7IC8vIEZyZWUgbWVtb3J5LgoJCWZvcmVhY2goICR0YWJsZXMgYXMgJHRhYmxlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdSZXBsYWNpbmcgaW4gdGFibGUgYCcgLiAkdGFibGUgLiAnYC4nICk7CgkJCSRkYnJlcGxhY2UtPmJydXRlZm9yY2VfdGFibGUoICR0YWJsZSwgYXJyYXkoICRuZWVkbGUgKSwgYXJyYXkoICRyZXBsYWNlbWVudCApICk7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1JlcGxhY2VtZW50IGZpbmlzaGVkLicgKTsKCX0gZWxzZSB7CgkJZWNobyAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPmpRdWVyeSgiI3BiX2ltcG9ydGJ1ZGR5X3dvcmtpbmciKS5oaWRlKCk7PC9zY3JpcHQ+JzsKCQlkaWUoICdFcnJvciAjNDQ1Njg5MzQ4OTM0OTgzNC4gVW5rbm93biBtZXRob2QuJyApOwoJfQoJCgllY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+alF1ZXJ5KCIjcGJfaW1wb3J0YnVkZHlfd29ya2luZyIpLmhpZGUoKTs8L3NjcmlwdD4nOwoJZWNobyAnPGJyPjxhIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmcGFyZW50X2NvbmZpZz0nIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhcmVudF9jb25maWcnICkgKSAuICciIGNsYXNzPSJidXR0b24gc2Vjb25kYXJ5LWJ1dHRvbiI+JmxhcnI7ICcgLiAgX18oICdiYWNrJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPic7CgkKCSRwYl9iYWNrdXBidWRkeV9qc19zdGF0dXMgPSBmYWxzZTsKCXJldHVybjsKfQoKCgoKCgoKCgoKCgokdGFibGVzID0gYXJyYXkoKTsKJHByZWZpeGVzID0gYXJyYXkoKTsKCi8vIE1ha2Ugc3VyZSB0aGlzIFdQJ3MgcHJlZml4IGlzIGluIHRoZXJlIGZvciBzdXJlICh1c2VmdWwgaWYgc29tZW9uZSB1c2VzIGEgcHJlZml4IHRoYXQgaGFzIGFuIHVuZGVyc2NvcmUgaW4gaXQ7IHRoZXkgc2hvdWxkbnQgYnV0IHRoZXkgZG8pLgpnbG9iYWwgJHRhYmxlX3ByZWZpeDsKJHByZWZpeGVzW10gPSAkdGFibGVfcHJlZml4OwoKLy8gQ2FsY3VsYXRlIHByZWZpeGVzIGZvdWRuIGluIHRoaXMgZGF0YWJhc2UuIERvZXMgbm90IGhhbmRsZSBtdWx0aXBsZS11bmRlcnNjb3JlCiRyZXN1bHQgPSBteXNxbF9xdWVyeSggJ1NIT1cgVEFCTEVTJywgJHdwZGItPmRiaCApOwp3aGlsZSggJHJzID0gbXlzcWxfZmV0Y2hfcm93KCAkcmVzdWx0ICkgKSB7CgkkdGFibGVzW10gPSAkcnNbMF07CgkKCWlmICggcHJlZ19tYXRjaCggJy9bYS16QS1aMC05XSpfKFswLTldK18pKi9pJywgJHJzWzBdLCAkbWF0Y2hlcyApICkgewoJCSRwcmVmaXhlc1tdID0gJG1hdGNoZXNbMF07Cgl9Cn0KbXlzcWxfZnJlZV9yZXN1bHQoICRyZXN1bHQgKTsgLy8gRnJlZSBtZW1vcnkuCgokcHJlZml4ZXMgPSBhcnJheV91bmlxdWUoICRwcmVmaXhlcyApOwpuYXRzb3J0KCAkcHJlZml4ZXMgKTsKPz4KPGRpdj4KCTxmb3JtIGFjdGlvbj0iPD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKTs/PiZkYXRhYmFzZV9yZXBsYWNlPTEmcGFyZW50X2NvbmZpZz08P3BocCBlY2hvIGh0bWxlbnRpdGllcyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwYXJlbnRfY29uZmlnJyApICk7ID8+IiBtZXRob2Q9InBvc3QiPgoJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9InJlcGxhY2UiPgoJCQoJCTxoND5SZXBsYWNlIDw/cGhwIHBiX2JhY2t1cGJ1ZGR5Ojp0aXAoICdUZXh0IHlvdSB3YW50IHRvIGJlIHNlYXJjaGVkIGZvciBhbmQgcmVwbGFjZWQuIEV2ZXJ5dGhpbmcgaW4gdGhlIGJveCBpcyBjb25zaWRlcmVkIG9uZSBtYXRjaCBhbmQgbWF5IHNwYW4gbXVsdGlwbGUgbGluZXMuJyApOyA/PjwvaDQ+CgkJPHRleHRhcmVhIG5hbWU9Im5lZWRsZSIgc3R5bGU9IndpZHRoOiAxMDAlOyI+PC90ZXh0YXJlYT4KCQk8YnI+CgkJCgkJPGg0PldpdGggPD9waHAgcGJfYmFja3VwYnVkZHk6OnRpcCggJ1RleHQgeW91IHdhbnQgdG8gcmVwbGFjZSB3aXRoLiBBbnkgdGV4dCBmb3VuZCBtYXRjaGluZyB0aGUgYm94IGFib3ZlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGlzIHRleHQuIEV2ZXJ5dGhpbmcgaW4gdGhlIGJveCBpcyBjb25zaWRlcmVkIG9uZSBtYXRjaCBhbmQgbWF5IHNwYW4gbXVsdGlwbGUgbGluZXMuJyApOyA/PjwvaDQ+CgkJPHRleHRhcmVhIG5hbWU9InJlcGxhY2VtZW50IiBzdHlsZT0id2lkdGg6IDEwMCU7Ij48L3RleHRhcmVhPgoJCQoJCTxoND5JbiB0YWJsZShzKTwvaDQ+CgkJPGxhYmVsIHN0eWxlPSJmbG9hdDogbm9uZTsiIGZvcj0idGFibGVfc2VsZWN0aW9uX2FsbCI+PGlucHV0IGlkPSJ0YWJsZV9zZWxlY3Rpb25fYWxsIiAgY2hlY2tlZD0nY2hlY2tlZCcgdHlwZT0icmFkaW8iIG5hbWU9InRhYmxlX3NlbGVjdGlvbiIgdmFsdWU9ImFsbCI+IGFsbCB0YWJsZXM8L2xhYmVsPgoJCTxsYWJlbCBzdHlsZT0iZmxvYXQ6IG5vbmU7IiBmb3I9InRhYmxlX3NlbGVjdGlvbl9wcmVmaXgiPjxpbnB1dCBpZD0idGFibGVfc2VsZWN0aW9uX3ByZWZpeCIgdHlwZT0icmFkaW8iIG5hbWU9InRhYmxlX3NlbGVjdGlvbiIgdmFsdWU9InByZWZpeCI+IHdpdGggcHJlZml4OjwvbGFiZWw+CgkJPHNlbGVjdCBuYW1lPSJ0YWJsZV9wcmVmaXgiIGlkPSJ0YWJsZV9zZWxlY3Rpb25fcHJlZml4IiBvbmNsaWNrPSJqUXVlcnkoJyN0YWJsZV9zZWxlY3Rpb25fcHJlZml4JykuY2xpY2soKTsiPgoJCQk8P3BocAoJCQlmb3JlYWNoKCAkcHJlZml4ZXMgYXMgJHByZWZpeCApIHsKCQkJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicgLiAkcHJlZml4IC4gJyI+JyAuICRwcmVmaXggLiAnPC9vcHRpb24+JzsKCQkJfQoJCQk/PgoJCTwvc2VsZWN0PgoJCTxsYWJlbCBzdHlsZT0iZmxvYXQ6IG5vbmU7IiBmb3I9InRhYmxlX3NlbGVjdGlvbl90YWJsZSI+PGlucHV0IGlkPSJ0YWJsZV9zZWxlY3Rpb25fdGFibGUiIHR5cGU9InJhZGlvIiBuYW1lPSJ0YWJsZV9zZWxlY3Rpb24iIHZhbHVlPSJzaW5nbGVfdGFibGUiPiBzaW5nbGU6PC9sYWJlbD4KCQk8c2VsZWN0IG5hbWU9InRhYmxlIiBpZD0idGFibGVfc2VsZWN0aW9uX3RhYmxlIiBvbmNsaWNrPSJqUXVlcnkoJyN0YWJsZV9zZWxlY3Rpb25fdGFibGUnKS5jbGljaygpOyI+CgkJCTw/cGhwCgkJCWZvcmVhY2goICR0YWJsZXMgYXMgJHRhYmxlICkgewoJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJyAuICR0YWJsZSAuICciPicgLiAkdGFibGUgLiAnPC9vcHRpb24+JzsKCQkJfQoJCQk/PgoJCTwvc2VsZWN0PgoJCTxoND5JbiBkYXRhYmFzZTwvaDQ+CgkJIjw/cGhwIGVjaG8gJGRhdGFiYXNlU2V0dGluZ3NbJ25hbWUnXTsgPz4iIG9uIGhvc3QgIjw/cGhwIGVjaG8gJGRhdGFiYXNlU2V0dGluZ3NbJ2hvc3QnXTsgPz4iIHdpdGggdXNlcm5hbWUgIjw/cGhwIGVjaG8gJGRhdGFiYXNlU2V0dGluZ3NbJ3VzZXJuYW1lJ107ID8+Ii4KCQk8P3BocAoJCWlmICggc3Vic3RyX2NvdW50KCAkdGFibGVfcHJlZml4LCAnXycgKSA+IDEgKSB7CgkJCWVjaG8gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIj5XYXJuaW5nPC9zcGFuPiAnOwoJCQlfZSggIlNpdGUgdGFibGUgcHJlZml4IGNvbnRhaW5zIG11bHRpcGxlIHVuZGVyc2NvcmVzLiBQcmVmaXggbGlzdCBtYXkgYmUgaW5hY2N1cmF0ZSBpZiB0aGVzZSBhcmUgbm90IE11bHRpc2l0ZSBzdWJzaXRlcy4iLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQl9CgkJLyoKCQk8aDQ+V2l0aCBhZHZhbmNlZCBvcHRpb25zPC9oND4KCQk8bGFiZWwgZm9yPSJtYXliZV9zZXJpYWxpemVkIj48aW5wdXQgaWQ9Im1heWJlX3NlcmlhbGl6ZWQiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJtYXliZV9zZXJpYWxpemVkIiB2YWx1ZT0idHJ1ZSIgY2hlY2tlZD0iY2hlY2tlZCI+IFRyZWF0IGZpZWxkcyBhcyBwb3NzaWJseSBjb250YWluaW5nIHNlcmlhbGl6ZWQgZGF0YSAodW5jaGVjayB3aXRoIGNhdXRpb247IHNsb3dlcikuPC9sYWJlbD4KCQkqLwoJCT8+PGJyPjxicj4KCQoJCTxwPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJCZWdpbiBSZXBsYWNlbWVudCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tcHJpbWFyeSIgLz4gPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj5DYXV0aW9uOyB0aGlzIGNhbm5vdCBiZSB1bmRvbmUuIFNlcmlhbGl6ZWQgZGF0YSBpcyBoYW5kbGVkIGJ5IHRoaXMgcmVwbGFjZW1lbnQuPC9zcGFuPgoJCTwvcD4KCTwvZm9ybT4KPC9kaXY+
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_dbreplace.php,importbuddy/views/_dbreplace.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_footer.php,importbuddy/views/_footer.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9Cj8+Cgo8L2Rpdj4KPC9kaXY+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_footer.php,importbuddy/views/_footer.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_header.php,importbuddy/views/_header.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9Cj8+CjwhRE9DVFlQRSBodG1sPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgIGRpcj0ibHRyIiBsYW5nPSJlbi1VUyI+Cgk8aGVhZD4KCQk8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CgkJPHRpdGxlPkltcG9ydEJ1ZGR5IHY8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddOyA/PiBSZXN0b3JlIC8gTWlncmF0aW9uIFRvb2wgLSBQb3dlcmVkIGJ5IEJhY2t1cEJ1ZGR5PC90aXRsZT4KCQk8bWV0YSBuYW1lPSJST0JPVFMiIGNvbnRlbnQ9Ik5PSU5ERVgsIE5PRk9MTE9XIj4KCQkKCQk8P3BocAoJCXJlcXVpcmUoICdfYXNzZXRzLnBocCcgKTsKCQk/PgoJCQoJCTxsaW5rIHJlbD0iaWNvbiIgdHlwZT0iaW1hZ2UvcG5nIiBocmVmPSJpbXBvcnRidWRkeS9pbWFnZXMvZmF2aWNvbi5wbmciPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQkJCgkJCXZhciBzdGF0dXNCb3g7IC8vIE1ha2UgZ2xvYmFsLgoJCQl2YXIgYmFja3VwYnVkZHlfZXJyb3JzX2VuY291bnRlcmVkID0gMDsgLy8gbnVtYmVyIG9mIGVycm9ycyBzZW50IHZpYSBsb2cuCgkJCQoJCQlmdW5jdGlvbiBwYl9zdGF0dXNfYXBwZW5kKCBqc29uICkgewoJCQkJaWYoICd1bmRlZmluZWQnID09PSB0eXBlb2Ygc3RhdHVzQm94ICkgeyAvLyBObyBzdGF0dXMgYm94IHlldCBzbyBtYXkgbmVlZCB0byBjcmVhdGUgaXQuCgkJCQkJc3RhdHVzQm94ID0galF1ZXJ5KCAnI2JhY2t1cGJ1ZGR5X21lc3NhZ2VzJyApOwoJCQkJCWlmKCBzdGF0dXNCb3gubGVuZ3RoID09IDAgKSB7IC8vIE5vIHN0YXR1cyBib3ggeWV0IHNvIHN1cHByZXNzLgoJCQkJCQlyZXR1cm47CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQlpZiAoICdzdHJpbmcnID09ICggdHlwZW9mIGpzb24gKSApIHsKCQkJCQliYWNrdXBidWRkeV9sb2coIGpzb24gKTsKCQkJCQljb25zb2xlLmxvZyggJ1N0YXR1cyBsb2cgcmVjZWl2ZWQgc3RyaW5nOiAnICsganNvbiApOwoJCQkJCXJldHVybjsKCQkJCX0KCQkJCQoJCQkJLy8gVXNlZCBpbiBCYWNrdXBCdWRkeSBfYmFja3VwLXBlcmZvcm0ucGhwIGFuZCBJbXBvcnRCdWRkeSBfaGVhZGVyLnBocAoJCQkJanNvbi5kYXRlID0gbmV3IERhdGUoKTsKCQkJCWpzb24uZGF0ZSA9IG5ldyBEYXRlKCAgKCBqc29uLnRpbWUgKiAxMDAwICkgKyBqc29uLmRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwICk7CgkJCQl2YXIgc2Vjb25kcyA9IGpzb24uZGF0ZS5nZXRTZWNvbmRzKCk7CgkJCQlpZiAoIHNlY29uZHMgPCAxMCApIHsKCQkJCQlzZWNvbmRzID0gJzAnICsgc2Vjb25kczsKCQkJCX0KCQkJCWpzb24uZGF0ZSA9IGJhY2t1cGJ1ZGR5X2hvdXJwYWQoIGpzb24uZGF0ZS5nZXRIb3VycygpICkgKyAnOicgKyBqc29uLmRhdGUuZ2V0TWludXRlcygpICsgJzonICsgc2Vjb25kczsKCQkJCQoJCQkJdHJpZ2dlckV2ZW50ID0gJ2JhY2t1cGJ1ZGR5XycgKyBqc29uLmV2ZW50OwoJCQkJCgkJCQkKCQkJCS8vIExvZyBub24tdGV4dCBldmVudHMuCgkJCQlpZiAoICggJ2RldGFpbHMnICE9PSBqc29uLmV2ZW50ICkgJiYgKCAnbWVzc2FnZScgIT09IGpzb24uZXZlbnQgKSAmJiAoICdlcnJvcicgIT09IGpzb24uZXZlbnQgKSApIHsKCQkJCQkvL2NvbnNvbGUubG9nKCAnTm9uLXRleHQgZXZlbnQgYCcgKyB0cmlnZ2VyRXZlbnQgKyAnYC4nICk7CgkJCQl9IGVsc2UgewoJCQkJCS8vY29uc29sZS5sb2coIGpzb24uZGF0YSApOwoJCQkJfQoJCQkJLy9jb25zb2xlLmxvZyggJ3RyaWdnZXI6ICcgKyB0cmlnZ2VyRXZlbnQgKTsKCQkJCQoJCQkJalF1ZXJ5KCcjYmFja3VwYnVkZHlfbWVzc2FnZXMnKS50cmlnZ2VyKCB0cmlnZ2VyRXZlbnQsIFtqc29uXSApOwoJCQkJCgkJCQkKCQkJfSAvLyBFbmQgZnVuY3Rpb24gcGJfc3RhdHVzX2FwcGVuZCgpLgoJCQkKCQkJCgkJCS8vIFVzZWQgaW4gQmFja3VwQnVkZHkgX2JhY2t1cC1wZXJmb3JtLnBocCBhbmQgSW1wb3J0QnVkZHkgX2hlYWRlci5waHAgYW5kIF9yb2xsYmFjay5waHAKCQkJZnVuY3Rpb24gYmFja3VwYnVkZHlfbG9nKCBqc29uICkgewoJCQkJCgkJCQltZXNzYWdlID0gJyc7CgkJCQkKCQkJCWlmICggJ3N0cmluZycgPT0gKCB0eXBlb2YganNvbiApICkgewoJCQkJCW1lc3NhZ2UgPSAiLS0tLS0tLS0tLS1cdFx0LS0tLS0tLVx0LS0tLS0tLVx0IiArIGpzb247CgkJCQl9IGVsc2UgewoJCQkJCW1lc3NhZ2UgPSBqc29uLmRhdGUgKyAnLicgKyBqc29uLnUgKyAiIFx0IiArIGpzb24ucnVuICsgInNlYyBcdCIgKyBqc29uLm1lbSArICJNQlx0IiArIGpzb24uZGF0YTsKCQkJCX0KCQkJCQoJCQkJc3RhdHVzQm94LmFwcGVuZCggIlxyXG4iICsgbWVzc2FnZSApOwoJCQkJc3RhdHVzQm94LnNjcm9sbFRvcCggc3RhdHVzQm94WzBdLnNjcm9sbEhlaWdodCAtIHN0YXR1c0JveC5oZWlnaHQoKSApOwoJCQkJCgkJCX0KCQkJCgkJCQoJCQkvLyBUcmlnZ2VyIGFuIGVycm9yIHRvIGJlIGxvZ2dlZCwgZGlzcGxheWVkLCBldGMuCgkJCS8vIFJldHVybnMgdXBkYXRlZCBtZXNzYWdlIHdpdGggdHJvdWJsZSBVUkwsIGV0Yy4KCQkJLy8gVXNlZCBpbiBCYWNrdXBCdWRkeSBfYmFja3VwLXBlcmZvcm0ucGhwIGFuZCBJbXBvcnRCdWRkeSBfaGVhZGVyLnBocAoJCQlmdW5jdGlvbiBiYWNrdXBidWRkeUVycm9yKCBtZXNzYWdlICkgewoKCQkJCS8vIEdldCBzdGFydCBvZiBhbnkgZXJyb3IgbnVtYmVycy4KCQkJCXRyb3VibGVVUkwgPSAnJzsKCQkJCWVycm9yX251bWJlcl9iZWdpbiA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCAnZXJyb3IgIycgKTsKCgkJCQlpZiAoIGVycm9yX251bWJlcl9iZWdpbiA+PSAwICkgewoJCQkJCWVycm9yX251bWJlcl9iZWdpbiArPSA3OyAvLyBTaGlmdCBvdmVyIGluZGV4IHRvIGFmdGVyICdlcnJvciAjJy4KCQkJCQllcnJvcl9udW1iZXJfZW5kID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoICc6JywgZXJyb3JfbnVtYmVyX2JlZ2luICk7CgkJCQkJaWYgKCBlcnJvcl9udW1iZXJfZW5kIDwgMCApIHsgLy8gRW5kIHN0aWxsIG5vdCBmb3VuZC4KCQkJCQkJZXJyb3JfbnVtYmVyX2VuZCA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCAnLicsIGVycm9yX251bWJlcl9iZWdpbiApOwoJCQkJCX0KCQkJCQlpZiAoIGVycm9yX251bWJlcl9lbmQgPCAwICkgeyAvLyBFbmQgc3RpbGwgbm90IGZvdW5kLgoJCQkJCQllcnJvcl9udW1iZXJfZW5kID0gbWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoICcgJywgZXJyb3JfbnVtYmVyX2JlZ2luICk7CgkJCQkJfQoJCQkJCWVycm9yX251bWJlciA9IG1lc3NhZ2Uuc2xpY2UoIGVycm9yX251bWJlcl9iZWdpbiwgZXJyb3JfbnVtYmVyX2VuZCApOwoJCQkJCXRyb3VibGVVUkwgPSAnaHR0cDovL2l0aGVtZXMuY29tL2NvZGV4L3BhZ2UvQmFja3VwQnVkZHk6X0Vycm9yX0NvZGVzIycgKyBlcnJvcl9udW1iZXI7CgkJCQl9CgoJCQkJaWYgKCAnJyAhPT0gdHJvdWJsZVVSTCApIHsKCQkJCQkvLyBEaXNwbGF5IGVycm9yIGluIGVycm9yIGRpdiB3aXRoIGNsYXNzIGVycm9yX2FsZXJ0X2JveC4KCQkJCQltZXNzYWdlID0gbWVzc2FnZSArICcgPGEgaHJlZj0iJyArIHRyb3VibGVVUkwgKyAnIiB0YXJnZXQ9Il9uZXciPkNsaWNrIHRvIDxiPnZpZXcgZXJyb3IgZGV0YWlsczwvYj4gaW4gdGhlIEtub3dsZWRnZSBCYXNlPC9hPic7CgkJCQl9CgkJCQlqUXVlcnkoICcuYmFja3VwYnVkZHlfZXJyb3JfbGlzdCcgKS5hcHBlbmQoICc8bGk+JyArICBtZXNzYWdlICsgJzwvbGk+JyApOwoJCQkJalF1ZXJ5KCAnLmVycm9yX2FsZXJ0X2JveCcgKS5zaG93KCk7CgoJCQkJLy8gRGlzcGxheSBlcnJvciBib3ggdG8gbWFrZSBpdCBjbGVhciBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZC4KCQkJCWJhY2t1cGJ1ZGR5X2Vycm9yc19lbmNvdW50ZXJlZCsrOwoJCQkJalF1ZXJ5KCAnI2JhY2t1cGJ1ZGR5X2Vycm9yc19ub3RpY2VfY291bnQnICkudGV4dCggYmFja3VwYnVkZHlfZXJyb3JzX2VuY291bnRlcmVkICk7CgkJCQlqUXVlcnkoICcjYmFja3VwYnVkZHlfZXJyb3JzX25vdGljZScgKS5zbGlkZURvd24oKTsKCgkJCQkvLyBJZiB0aGUgd29yZCBlcnJvciBpcyBub3doZXJlIGluIHRoZSBlcnJvciBtZXNzYWdlIHRoZW4gYWRkIGluIGVycm9yIHByZWZpeC4KCQkJCWlmICggbWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoICdlcnJvcicgKSA8IDAgKSB7CgkJCQkJbWVzc2FnZSA9ICdFUlJPUjogJyArIG1lc3NhZ2U7CgkJCQl9CgoKCQkJCXJldHVybiBtZXNzYWdlOyAvLyBSZXR1cm4gdXBkYXRlZCBlcnJvciBtZXNzYWdlIHdpdGggdHJvdWJsZSBVUkwuCgkJCX0gLy8gZW5kIGJhY2t1cGJ1ZGR5RXJyb3IoKS4KCgoJCQkvLyBVc2VkIGluIEJhY2t1cEJ1ZGR5IF9iYWNrdXAtcGVyZm9ybS5waHAgYW5kIEltcG9ydEJ1ZGR5IF9oZWFkZXIucGhwCgkJCWZ1bmN0aW9uIGJhY2t1cGJ1ZGR5V2FybmluZyggbWVzc2FnZSApIHsKCQkJCWpRdWVyeSggJy5iYWNrdXBidWRkeV93YXJuaW5nX2xpc3QnICkuYXBwZW5kKCAnPGxpPicgKyAgbWVzc2FnZSArICc8L2xpPicgKTsKCQkJCS8valF1ZXJ5KCAnLndhcm5pbmdfYWxlcnRfYm94JyApLnNob3coKTsKCQkJCXJldHVybiAnV2FybmluZzogJyArIG1lc3NhZ2U7CgkJCX0gLy8gZW5kIGJhY2t1cGJ1ZGR5V2FybmluZygpLgoJCQkKCQkJLy8gbGVmdCBob3VyIHBhZCB3aXRoIHplcm9zCgkJCWZ1bmN0aW9uIGJhY2t1cGJ1ZGR5X2hvdXJwYWQobikgeyByZXR1cm4gKCIwIiArIG4pLnNsaWNlKC0yKTsgfQoJCQkKCQkJZnVuY3Rpb24gcmFuZG9tU3RyaW5nKGxlbmd0aCwgY2hhcnMpIHsKCQkJCXZhciByZXN1bHQgPSAnJzsKCQkJCWZvciAodmFyIGkgPSBsZW5ndGg7IGkgPiAwOyAtLWkpIHJlc3VsdCArPSBjaGFyc1tNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAoY2hhcnMubGVuZ3RoIC0gMSkpXTsKCQkJCXJldHVybiByZXN1bHQ7CgkJCX0KCQkJCgkJCQoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImltcG9ydGJ1ZGR5L2pzL2pxdWVyeS5sZWFuTW9kYWwubWluLmpzIj48L3NjcmlwdD4KCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJpbXBvcnRidWRkeS9qcy9lanMuanMiPjwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImltcG9ydGJ1ZGR5L2pzL21haW4uanMiPjwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImltcG9ydGJ1ZGR5L2pzL3Jlc3RvcmVFdmVudHMuanMiPjwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQkJRUpTLmNvbmZpZyh7Y2FjaGU6IGZhbHNlfSk7CgkJCQoJCQl3aW5kb3cucmVzdG9yZURhdGEgPSB7fTsKCQkJCgkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJCQlqUXVlcnkoJy5sZWFuTW9kYWwnKS5sZWFuTW9kYWwoCgkJCQkJeyB0b3AgOiA0NSwgb3ZlcmxheSA6IDAuNCwgY2xvc2VCdXR0b246ICIubW9kYWxfY2xvc2UiIH0KCQkJCSk7CgkJCQkKCQkJCS8qIE1ENSBIYXNoIEJ1dHRvbiBDbGlja2VkICovCgkJCQlqUXVlcnkoICcudmlld19oYXNoX2NsaWNrJyApLmNsaWNrKCBmdW5jdGlvbigpIHsKCQkJCQlqUXVlcnkoJyNoYXNoX3ZpZXdfbG9hZGluZycpLnNob3coKTsKCQkJCQlqUXVlcnkoJyNoYXNoX3ZpZXdfcmVzcG9uc2UnKS5oaWRlKCk7CgkJCQkJCgkJCQkJdmFyIGJhY2t1cEZpbGUgPSBqUXVlcnkodGhpcykuYXR0ciggJ2RhdGEtZmlsZScgKTsKCQkJCQlqUXVlcnkuYWpheCh7CgkJCQkJCXR5cGU6ICdQT1NUJywKCQkJCQkJdXJsOiAnaW1wb3J0YnVkZHkucGhwJywKCQkJCQkJZGF0YTogewoJCQkJCQkJYWpheDogJ2ZpbGVfaGFzaCcsCgkJCQkJCQlmaWxlOiBiYWNrdXBGaWxlCgkJCQkJCX0sCgkJCQkJCWRhdGFUeXBlOiAnanNvbicKCQkJCQl9KS5kb25lKCBmdW5jdGlvbihkYXRhKSB7CgkJCQkJCWpRdWVyeSgnI2hhc2hfdmlld19yZXNwb25zZScpLmh0bWwoICc8Yj5DaGVja3N1bSAoTUQ1IGhhc2gpOjwvYj4gPGlucHV0IHR5cGU9InRleHQiIGRpc2FibGVkPSJkaXNhYmxlZCIgdmFsdWU9IicgKyBkYXRhLmhhc2ggKyAnIiBzdHlsZT0id2lkdGg6IDQwMHB4OyI+JyApOwoJCQkJCQlqUXVlcnkoJyNoYXNoX3ZpZXdfbG9hZGluZycpLmhpZGUoKTsKCQkJCQkJalF1ZXJ5KCcjaGFzaF92aWV3X3Jlc3BvbnNlJykuc2hvdygpOwoJCQkJCX0pLmZhaWwoIGZ1bmN0aW9uKCBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24gKXsKCQkJCQkJalF1ZXJ5KCcjaGFzaF92aWV3X3Jlc3BvbnNlJykuaHRtbCggJ0Vycm9yOiBgJyArIGpxWEhSLnJlc3BvbnNlVGV4dCArICdgLicgKTsKCQkJCQkJalF1ZXJ5KCcjaGFzaF92aWV3X2xvYWRpbmcnKS5oaWRlKCk7CgkJCQkJCWpRdWVyeSgnI2hhc2hfdmlld19yZXNwb25zZScpLnNob3coKTsKCQkJCQl9KTsKCQkJCX0pOwoJCQkJCgkJCQkKCQkJCQoJCQkJalF1ZXJ5KCAnLm1haW5fYm94JyApLm9uKCAnc3VibWl0JywgJ2Zvcm0nLCBmdW5jdGlvbihlKSB7CgkJCQkJaWYgKCAnbWluaUZyYW1lJyA9PSBqUXVlcnkodGhpcykuYXR0ciggJ3RhcmdldCcgKSApIHsKCQkJCQkJTlByb2dyZXNzLnN0YXJ0KCk7CgkJCQkJfQoJCQkJCXJldHVybiB0cnVlOwoJCQkJfSk7CgkJCQkKCQkJCS8vIFByZS1sb2FkIGZpbmFsIHN0ZXBzIHNvIGl0IGNhbiBiZSBkaXNwbGF5ZWQgZXZlbiB0aG91Z2ggZGVsZXRlZC4KCQkJCXdpbmRvdy5zdGVwVGVtcGxhdGVDbGVhbnVwU2V0dGluZ3MgPSBuZXcgRUpTKHt1cmw6ICdpbXBvcnRidWRkeS92aWV3cy9jbGVhbnVwU2V0dGluZ3MuZWpzJ30pOwoJCQkJd2luZG93LnN0ZXBUZW1wbGF0ZWZpbmFsQ2xlYW51cCA9IG5ldyBFSlMoe3VybDogJ2ltcG9ydGJ1ZGR5L3ZpZXdzL2ZpbmFsQ2xlYW51cC5lanMnfSk7CgkJCQkKCQkJfSk7CgkJCQoJCQkKCQkJZnVuY3Rpb24gYmJfYWN0aW9uKCBhY3Rpb24sIG5vdGUgKSB7CgkJCQljb25zb2xlLmxvZyggJ2JiX2FjdGlvbjogYCcgKyBhY3Rpb24gKyAnYC4nICk7CgkJCQlpZiAoICd1bnppcFN1Y2Nlc3MnID09IGFjdGlvbiApIHsKCQkJCX0gZWxzZSBpZiAoICdpZnJhbWVMb2FkZWQnID09IGFjdGlvbiApIHsgLy8gSGlkZSBpZnJhbWUgbG9hZGluZyBncmFwaGljLgoJCQkJCS8vTlByb2dyZXNzLmRvbmUoKTsKCQkJCX0gZWxzZSBpZiAoICdpbXBvcnRpbmdUYWJsZScgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI2ltcG9ydGluZ0RhdGFiYXNlLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdSZXN0b3JpbmcgJyArIG5vdGUgKyAnIC4uLicgKTsgLy8gbm90ZSBjb250YWlucyB0YWJsZSBuYW1lCgkJCQl9IGVsc2UgaWYgKCAnZGF0YWJhc2VSZXN0b3JlU3VjY2VzcycgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI2ltcG9ydGluZ0RhdGFiYXNlLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdEYXRhYmFzZSBSZXN0b3JlIFN1Y2Nlc3NmdWwnICk7CgkJCQl9IGVsc2UgaWYgKCAnZGF0YWJhc2VSZXN0b3JlU2tpcHBlZCcgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI2ltcG9ydGluZ0RhdGFiYXNlLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdEYXRhYmFzZSBSZXN0b3JlIFNraXBwZWQnICk7CgkJCQl9IGVsc2UgaWYgKCAnZGF0YWJhc2VSZXN0b3JlRmFpbGVkJyA9PSBhY3Rpb24gKSB7CgkJCQkJalF1ZXJ5KCcjaW1wb3J0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlJykudGV4dCggJ0RhdGFiYXNlIFJlc3RvcmUgRmFpbGVkJyApOwoJCQkJfSBlbHNlIGlmICggJ2RhdGFiYXNlTWlncmF0aW9uU3VjY2VzcycgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI21pZ3JhdGluZ0RhdGFiYXNlLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdEYXRhYmFzZSBNaWdyYXRpb24gU3VjY2Vzc2Z1bCcgKTsKCQkJCX0gZWxzZSBpZiAoICdkYXRhYmFzZU1pZ3JhdGlvblNraXBwZWQnID09IGFjdGlvbiApIHsKCQkJCQlqUXVlcnkoJyNtaWdyYXRpbmdEYXRhYmFzZS1wcm9ncmVzc01lc3NhZ2UnKS50ZXh0KCAnRGF0YWJhc2UgTWlncmF0aW9uIFNraXBwZWQnICk7CgkJCQl9IGVsc2UgaWYgKCAnZGF0YWJhc2VNaWdyYXRpb25GYWlsZWQnID09IGFjdGlvbiApIHsKCQkJCQlqUXVlcnkoJyNtaWdyYXRpbmdEYXRhYmFzZS1wcm9ncmVzc01lc3NhZ2UnKS50ZXh0KCAnRGF0YWJhc2UgTWlncmF0aW9uIEZhaWxlZCcgKTsKCQkJCX0gZWxzZSBpZiAoICdmaWxlc1Jlc3RvcmVTdWNjZXNzJyA9PSBhY3Rpb24gKSB7CgkJCQkJalF1ZXJ5KCcjdW56aXBwaW5nRmlsZXMtcHJvZ3Jlc3NNZXNzYWdlJykudGV4dCggJ0NvbXBsZXRlZCBSZXN0b3JpbmcgRmlsZXMnICk7CgkJCQl9IGVsc2UgaWYgKCAnZmlsZXNSZXN0b3JlU2tpcHBlZCcgPT0gYWN0aW9uICkgewoJCQkJCWpRdWVyeSgnI3VuemlwcGluZ0ZpbGVzLXByb2dyZXNzTWVzc2FnZScpLnRleHQoICdTa2lwcGVkIFJlc3RvcmluZyBGaWxlcycgKTsKCQkJCX0gZWxzZSB7CgkJCQkJY29uc29sZS5sb2coICdVbmtub3duIEpTIGJiX2FjdGlvbiBgJyArIGFjdGlvbiArICdgIHdpdGggbm90ZSBgJyArIG5vdGUgKyAnYC4nICk7CgkJCQl9CgkJCX0KCQkJCgkJCQoJCQlmdW5jdGlvbiBiYl9zaG93U3RlcCggc3RlcCwgZGF0YSApIHsKCQkJCXdpbmRvdy5yZXN0b3JlRGF0YSA9IGRhdGE7CgkJCQlqUXVlcnkoJy5zdGVwLXdyYXAnKS5oaWRlKCk7CgkJCQljb25zb2xlLmxvZyggJ1Nob3cgc3RlcDogYCcgKyBzdGVwICsgJ2AuJyApOwoJCQkJY29uc29sZS5kaXIoIHdpbmRvdy5yZXN0b3JlRGF0YSApOwoJCQkJLy9qUXVlcnkoJy5zdGVwLScgKyBzdGVwICsgJy13cmFwJykuc2hvdygpOwoJCQkJaWYgKCAnZmluaXNoZWQnID09IHN0ZXAgKSB7IC8vIEluIGNhc2Ugd2UgY2Fubm90IGxvYWQgZmluYWwgdGVtcGxhdGUsIGF0IGxlYXN0IHNheSBmaW5pc2hlZC4KCQkJCQlqUXVlcnkoJy5tYWluX2JveF9mb290JykuaHRtbCggJzxoMz5GaW5pc2hlZDwvaDM+JyApOwoJCQkJfQoJCQkJCgkJCQlpZiAoICdjbGVhbnVwU2V0dGluZ3MnID09IHN0ZXAgKSB7IC8vIFByZWxvYWRlZCB0ZW1wbGF0ZS4KCQkJCQlqUXVlcnkoJy5tYWluX2JveCcpLmh0bWwoIHdpbmRvdy5zdGVwVGVtcGxhdGVDbGVhbnVwU2V0dGluZ3MucmVuZGVyKGRhdGEpICk7CgkJCQl9IGVsc2UgaWYgKCAnZmluYWxDbGVhbnVwJyA9PSBzdGVwICkgewoJCQkJCWpRdWVyeSgnLm1haW5fYm94JykuaHRtbCggandpbmRvdy5zdGVwVGVtcGxhdGVmaW5hbENsZWFudXAucmVuZGVyKGRhdGEpICk7CgkJCQl9IGVsc2UgeyAvLyBOb3JtYWwgc3RlcC4KCQkJCQlqUXVlcnkoJy5tYWluX2JveCcpLmh0bWwoIG5ldyBFSlMoe3VybDogJ2ltcG9ydGJ1ZGR5L3ZpZXdzLycgKyBzdGVwICsgJy5lanMnfSkucmVuZGVyKGRhdGEpICk7CgkJCQl9CgkJCX0KCQkJCgkJCQoJCQlmdW5jdGlvbiB0aXAoIHRpcCApIHsKCQkJCXJldHVybiAnPGEgY2xhc3M9InBsdWdpbmJ1ZGR5X3RpcCIgdGl0bGU9IicgKyB0aXAgKyAnIj48aW1nIHNyYz0iaW1wb3J0YnVkZHkvcGx1Z2luYnVkZHkvaW1hZ2VzL3BsdWdpbmJ1ZGR5X3RpcC5wbmciIGFsdD0iKD8pIj48L2E+JzsKCQkJfQoJCQkKCQkJCgkJPC9zY3JpcHQ+Cgk8L2hlYWQ+CgkJPD9waHAKCQkvL2lmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkaXNwbGF5X21vZGUnXSA9PSAnbm9ybWFsJyApIHsKCQkJZWNobyAnPGJvZHknOwoJCQlpZiAoICdlbWJlZCcgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkaXNwbGF5X21vZGUnICkgKSB7IGVjaG8gJyBzdHlsZT0iYmFja2dyb3VuZDogI0ZGRjsiJzsgfQoJCQllY2hvICc+JzsKCQkJaWYgKCAnZW1iZWQnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGlzcGxheV9tb2RlJyApICkgewoJCQkJZWNobyAnPGRpdiBjbGFzcz0idG9wTmF2Ij4nOwoJCQkJCQoJCQkJCWlmICggdHJ1ZSA9PT0gQXV0aDo6aXNfYXV0aGVudGljYXRlZCgpICkgeyAvLyBPbmx5IGRpc3BsYXkgdGhlc2UgbGlua3MgaWYgbG9nZ2VkIGluLgoJCQkJCQllY2hvICc8YSAnOwoJCQkJCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnc3RlcCcgKSAhPSAnJyApIHsgZWNobyAnY2xhc3M9ImFjdGl2ZVBhZ2UiICc7IH0KCQkJCQkJZWNobyAnaHJlZj0iaW1wb3J0YnVkZHkucGhwIj5SZXN0b3JlIC8gTWlncmF0ZTwvYT4nOwoJCQkJCQkKCQkJCQkJZWNobyAnPGEgJzsKCQkJCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhZ2UnICkgPT0gJ3NlcnZlcmluZm8nICkgeyBlY2hvICdjbGFzcz0iYWN0aXZlUGFnZSIgJzsgfQoJCQkJCQllY2hvICdocmVmPSI/cGFnZT1zZXJ2ZXJpbmZvIj5TZXJ2ZXIgSW5mb3JtYXRpb248L2E+JzsKCQkJCQkJCgkJCQkJCWVjaG8gJzxhICc7CgkJCQkJCWlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwYWdlJyApID09ICdkYnJlcGxhY2UnICkgeyBlY2hvICdjbGFzcz0iYWN0aXZlUGFnZSIgJzsgfQoJCQkJCQllY2hvICdocmVmPSI/cGFnZT1kYnJlcGxhY2UiPkRhdGFiYXNlIFRleHQgUmVwbGFjZTwvYT4nOwoJCQkJCQkKCQkJCQkJZWNobyAnPGEgaHJlZj0iaHR0cDovL2l0aGVtZXMuY29tL2NvZGV4L3BhZ2UvQmFja3VwQnVkZHkiIHRhcmdldD0iX25ldyI+S25vd2xlZGdlIEJhc2U8L2E+JzsKCQkJCQkJZWNobyAnPGEgaHJlZj0iaHR0cDovL2l0aGVtZXMuY29tL3N1cHBvcnQvIiB0YXJnZXQ9Il9uZXciPlN1cHBvcnQgRm9ydW08L2E+JzsKCQkJCQl9CgkJCQkJCgkJCQkJJHNpbXBsZVZlcnNpb24gPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXTsKCQkJCQlpZiAoIHN0cnBvcyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10sICcgJyApID4gMCApIHsKCQkJCQkJJHNpbXBsZVZlcnNpb24gPSBzdWJzdHIoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddLCAwLCBzdHJwb3MoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddLCAnICcgKSApOwoJCQkJCX0KCQkJCQllY2hvICc8YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vcHVyY2hhc2UvYmFja3VwYnVkZHkvIiB0YXJnZXQ9Il9uZXciIHRpdGxlPSJWaXNpdCBCYWNrdXBCdWRkeSBXZWJzaXRlIGluIE5ldyBXaW5kb3ciIHN0eWxlPSJmbG9hdDogcmlnaHQ7Ij48aW1nIHNyYz0iaW1wb3J0YnVkZHkvaW1hZ2VzL2ljb25fbWVudV8zMngzMi5wbmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+Jm5ic3A7Jm5ic3A7SW1wb3J0QnVkZHkgdicgLiAkc2ltcGxlVmVyc2lvbiAuICcgZm9yIEJhY2t1cEJ1ZGR5PC9hPic7CgkJCQllY2hvICc8L2Rpdj4nOwoJCQl9CgkJPz4KCQkKCQk8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IGhlaWdodDogNzBweDsgbWFyZ2luLXRvcDogNTBweDsgd2lkdGg6IDEwMCU7IG92ZXJmbG93OiBoaWRkZW47Ij4KCQkJPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiAxMDAwcHg7IG1hcmdpbi1sZWZ0OiBhdXRvOyBtYXJnaW4tcmlnaHQ6IGF1dG87Ij4KCQkJCTwhLS0gPHNwYW4gaWQ9InJlc3RvcmVidWRkeV9pZnJhbWVfcGxhY2Vob2xkZXIiPldlbGNvbWUgc3RlcCAxPC9zcGFuPiAtLT4KCQkJCTxzY3JpcHQ+aWZyYW1lUG9zdEluaXQgPSBmYWxzZTs8L3NjcmlwdD4KCQkJCTxpZnJhbWUgb25Mb2FkPSJpZiAoIHRydWUgPT09IGlmcmFtZVBvc3RJbml0ICkgeyBOUHJvZ3Jlc3MuZG9uZSgpOyB9IiBuYW1lPSJtaW5pRnJhbWUiIGlkPSJtaW5pRnJhbWUiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjcwcHgiIGZyYW1lYm9yZGVyPSIwIiBwYWRkaW5nPSIwIiBtYXJnaW49IjAiPkVycm9yICM0NTg0NTk0NTc5LiBCcm93c2VyIG5vdCBjb21wYXRpYmxlIHdpdGggaWZyYW1lcy48L2lmcmFtZT4KCQkJCTxzY3JpcHQ+aWZyYW1lUG9zdEluaXQgPSB0cnVlOzwvc2NyaXB0PgoJCQk8L2Rpdj4KCQk8L2Rpdj4KCQkKCQk8ZGl2IHN0eWxlPSJkaXNwbGF5OiBub25lOyIgaWQ9InBiX2ltcG9ydGJ1ZGR5X2JsYW5rYWxlcnQiPjw/cGhwIHBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJyNUSVRMRSMgI01FU1NBR0UjJywgdHJ1ZSwgJzkwMjEnICk7ID8+PC9kaXY+CgkJCgkJPGRpdiBjbGFzcz0ibWFpbl9ib3hfd3JhcCI+CgkJCQoJCQkKCQkJPD9waHAgaWYgKCB0cnVlID09PSBBdXRoOjppc19hdXRoZW50aWNhdGVkKCkgKSB7IC8vIE9ubHkgcmVjb3JkIGxvZ2dpbmcgaWYgYXV0aGVudGljYXRlZC4gPz4KCQkJCTxkaXYgY2xhc3M9Im1haW5fYm94X2hlYWQiPgoJCQkJCTxzcGFuIGlkPSJwYWdlVGl0bGUiPiZuYnNwOzwvc3Bhbj4KCQkJCQk8YSBzdHlsZT0iZm9udC1zaXplOiAwLjZlbTsgZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tdG9wOiA2cHg7IiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uY2xpY2s9ImpRdWVyeSgnI3BiX2JhY2t1cGJ1ZGR5X3N0YXR1c193cmFwJykudG9nZ2xlKCk7Ij5EaXNwbGF5IFN0YXR1cyBMb2c8L2E+CgkJCQk8L2Rpdj4KCQkJCTw/cGhwCgkJCQllY2hvIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snaW1wb3J0J10tPnN0YXR1c19ib3goICdTdGF0dXMgTG9nIGZvciBmb3IgSW1wb3J0QnVkZHkgZnJvbSBCYWNrdXBCdWRkeSB2JyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddIC4gJy4uLicgKTsKCQkJCT8+CgkJCQk8c2NyaXB0PmltcG9ydGJ1ZGR5X2xvYWRSZXN0b3JlRXZlbnRzKCk7PC9zY3JpcHQ+CgkJCQk8P3BocAoJCQl9IGVsc2UgeyA/PgoJCQkJPGRpdiBjbGFzcz0ibWFpbl9ib3hfaGVhZCI+CgkJCQkJPHNwYW4gaWQ9InBhZ2VUaXRsZSI+Jm5ic3A7PC9zcGFuPgoJCQkJPC9kaXY+CgkJCQkKCQkJPD9waHAgfSA/PgoJCQk8ZGl2IGNsYXNzPSJtYWluX2JveF9oZWFkIGVycm9yX2FsZXJ0X2JveCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTxzcGFuIGNsYXNzPSJlcnJvcl9hbGVydF90aXRsZSI+RXJyb3Iocyk8L3NwYW4+CgkJCQk8dWwgY2xhc3M9ImJhY2t1cGJ1ZGR5X2Vycm9yX2xpc3QiPgoJCQkJCTwhLS0gPGxpPkVycm9yICMxMjNvbmx5QXRlc3Q6IEFuIGVycm9yIGhhcyBoYXBwZW5lZC4gVGhpcyBpcyBhIHRlc3QuPC9saT4gLS0+CgkJCQk8L3VsPgoJCQk8L2Rpdj4KCQkJPGRpdiBjbGFzcz0ibWFpbl9ib3hfaGVhZCB3YXJuaW5nX2FsZXJ0X2JveCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTxzcGFuIGNsYXNzPSJlcnJvcl93YXJuaW5nX3RpdGxlIj5BbGVydChzKTwvc3Bhbj4KCQkJCTx1bCBjbGFzcz0iYmFja3VwYnVkZHlfd2FybmluZ19saXN0Ij4KCQkJCQk8IS0tIDxsaT5FcnJvciAjMTIzb25seUF0ZXN0OiBBbiBlcnJvciBoYXMgaGFwcGVuZWQuIFRoaXMgaXMgYSB0ZXN0LjwvbGk+IC0tPgoJCQkJPC91bD4KCQkJPC9kaXY+CgkJCQoJCQkKCQkJPGRpdiBjbGFzcz0ibWFpbl9ib3giPgoJCQkKCQkJCgkJCQ==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_header.php,importbuddy/views/_header.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_html_1_stash.php,importbuddy/views/_html_1_stash.php
PD9waHAKJElUWEFQSV9LRVkgPSAnaXhobzdkazBwMjQ0bjBvYic7CiRJVFhBUElfVVJMID0gJ2h0dHA6Ly9hcGkuaXRoZW1lcy5jb20nOwoJCQkJCQoKCiRjcmVkZW50aWFsc19mb3JtID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X3NldHRpbmdzKCAncHJlX3NldHRpbmdzJywgZmFsc2UsICd1cGxvYWQ9c3Rhc2gjcGx1Z2luYnVkZHktdGFicy1zdGFzaCcgKTsgLy8gbmFtZSwgc2F2ZXBvaW50fGZhbHNlLCBhZGRpdGlvbmFsIHF1ZXJ5c3RyaW5nCi8qCiRjcmVkZW50aWFsc19mb3JtLT5hZGRfc2V0dGluZyggYXJyYXkoCgkndHlwZScJCT0+CQknaGlkZGVuJywKCSduYW1lJwkJPT4JCSdwYXNzX2hhc2gnLAoJJ2RlZmF1bHQnCT0+CQlQQl9QQVNTV09SRCwKKSApOwoKJGNyZWRlbnRpYWxzX2Zvcm0tPmFkZF9zZXR0aW5nKCBhcnJheSgKCSd0eXBlJwkJPT4JCSdoaWRkZW4nLAoJJ25hbWUnCQk9PgkJJ29wdGlvbnMnLAoJJ2RlZmF1bHQnCT0+CQlodG1sc3BlY2lhbGNoYXJzKCBzZXJpYWxpemUoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICksCikgKTsKKi8KCiRjcmVkZW50aWFsc19mb3JtLT5hZGRfc2V0dGluZyggYXJyYXkoCgkndHlwZScJCT0+CQkndGV4dCcsCgknbmFtZScJCT0+CQknaXR4YXBpX3VzZXJuYW1lJywKCSd0aXRsZScJCT0+CQlfXyggJ2lUaGVtZXMgdXNlcm5hbWUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSdydWxlcycJCT0+CQkncmVxdWlyZWR8c3RyaW5nWzEtNDVdJywKKSApOwokY3JlZGVudGlhbHNfZm9ybS0+YWRkX3NldHRpbmcoIGFycmF5KAoJJ3R5cGUnCQk9PgkJJ3Bhc3N3b3JkJywKCSduYW1lJwkJPT4JCSdpdHhhcGlfcGFzc3dvcmRfcmF3JywKCSd0aXRsZScJCT0+CQlfXyggJ2lUaGVtZXMgcGFzc3dvcmQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSdydWxlcycJCT0+CQkncmVxdWlyZWR8c3RyaW5nWzEtNDVdJywKKSApOwoKJHNldHRpbmdzX3Jlc3VsdCA9ICRjcmVkZW50aWFsc19mb3JtLT5wcm9jZXNzKCk7CiRsb2dpbl93ZWxjb21lID0gX18oICdDb25uZWN0IHRvIFN0YXNoIHdpdGggeW91ciBpVGhlbWVzLmNvbSBtZW1iZXIgYWNjb3VudCB0byBzZWxlY3QgYSBiYWNrdXAgdG8gcmVzdG9yZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8YnI+PGJyPic7CgppZiAoIGNvdW50KCAkc2V0dGluZ3NfcmVzdWx0ICkgPT0gMCApIHsgLy8gTm8gZm9ybSBzdWJtaXR0ZWQuCgkKCWVjaG8gJGxvZ2luX3dlbGNvbWU7CgkkY3JlZGVudGlhbHNfZm9ybS0+ZGlzcGxheV9zZXR0aW5ncyggJ0Nvbm5lY3QgdG8gU3Rhc2gnICk7CgkKfSBlbHNlIHsgLy8gRm9ybSBzdWJtaXR0ZWQuCglpZiAoIGNvdW50KCAkc2V0dGluZ3NfcmVzdWx0WydlcnJvcnMnXSApID4gMCApIHsgLy8gRm9ybSBlcnJvcnMuCgkJZWNobyAkbG9naW5fd2VsY29tZTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoIGltcGxvZGUoICc8YnI+JywgJHNldHRpbmdzX3Jlc3VsdFsnZXJyb3JzJ10gKSApOwoJCSRjcmVkZW50aWFsc19mb3JtLT5kaXNwbGF5X3NldHRpbmdzKCAnQ29ubmVjdCB0byBTdGFzaCcgKTsKCQkKCX0gZWxzZSB7IC8vIE5vIGZvcm0gZXJyb3JzOyBwcm9jZXNzIQoJCQoJCQoJCSRpdHhfaGVscGVyX2ZpbGUgPSBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgLiAnL2NsYXNzZXMvY2xhc3MuaXR4X2hlbHBlci5waHAnOwoJCXJlcXVpcmVfb25jZSggJGl0eF9oZWxwZXJfZmlsZSApOwoJCQoJCSRpdHhhcGlfdXNlcm5hbWUgPSAkc2V0dGluZ3NfcmVzdWx0WydkYXRhJ11bJ2l0eGFwaV91c2VybmFtZSddOwoJCSRpdHhhcGlfcGFzc3dvcmQgPSBJVFhBUElfSGVscGVyOjpnZXRfcGFzc3dvcmRfaGFzaCggJGl0eGFwaV91c2VybmFtZSwgJHNldHRpbmdzX3Jlc3VsdFsnZGF0YSddWydpdHhhcGlfcGFzc3dvcmRfcmF3J10gKTsgLy8gR2VuZXJhdGVzIGhhc2ggZm9yIHVzZSBhcyBwYXNzd29yZCBmb3IgQVBJLgoJCQoJCQoJCSRyZXF1ZXN0Y29yZV9maWxlID0gZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy9saWIvcmVxdWVzdGNvcmUvcmVxdWVzdGNvcmUuY2xhc3MucGhwJzsKCQlyZXF1aXJlX29uY2UoICRyZXF1ZXN0Y29yZV9maWxlICk7CgkJCgkJCgkJJHN0YXNoID0gbmV3IElUWEFQSV9IZWxwZXIoICRJVFhBUElfS0VZLCAkSVRYQVBJX1VSTCwgJGl0eGFwaV91c2VybmFtZSwgJGl0eGFwaV9wYXNzd29yZCApOwoJCQoJCSRmaWxlc191cmwgPSAkc3Rhc2gtPmdldF9maWxlc191cmwoKTsKCQkKCQkkcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q29yZSggJGZpbGVzX3VybCApOwoJCSRyZXNwb25zZSA9ICRyZXF1ZXN0LT5zZW5kX3JlcXVlc3QodHJ1ZSk7CgkJCgkJLy8gU2VlIGlmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsLgoJCWlmKCEkcmVzcG9uc2UtPmlzT0soKSkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1N0YXNoIHJlcXVlc3QgZm9yIGZpbGVzIGZhaWxlZC4nICk7CgkJCgkJLy8gU2VlIGlmIHdlIGdvdCBhIGpzb24gcmVzcG9uc2UuCgkJaWYoISRzdGFzaF9maWxlcyA9IGpzb25fZGVjb2RlKCRyZXNwb25zZS0+Ym9keSwgdHJ1ZSkpCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdTdGFzaCBkaWQgbm90IGdldCB2YWxpZCBqc29uIHJlc3BvbnNlLicgKTsKCQkKCQkvLyBGaW5hbGx5IHNlZSBpZiB0aGUgQVBJIHJldHVybmVkIGFuIGVycm9yLgoJCWlmKGlzc2V0KCRzdGFzaF9maWxlc1snZXJyb3InXSkpIHsgICAgICAgICAgICAKCQkJaWYgKCAkc3Rhc2hfZmlsZXNbJ2Vycm9yJ11bJ2NvZGUnXSA9PSAnMzAwMicgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdJbnZhbGlkIGlUaGVtZXMuY29tIE1lbWJlciBhY2NvdW50IHBhc3N3b3JkLiBQbGVhc2UgdmVyaWZ5IHlvdXIgcGFzc3dvcmQuIDxhIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9tZW1iZXIvbWVtYmVyLnBocCIgdGFyZ2V0PSJfbmV3Ij5Gb3JnZXQgeW91ciBwYXNzd29yZD88L2E+JyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBpbXBsb2RlKCAnIC0gJywgJHN0YXNoX2ZpbGVzWydlcnJvciddICkgKTsKCQkJfQoJCQkKCQkJJGNyZWRlbnRpYWxzX2Zvcm0tPmRpc3BsYXlfc2V0dGluZ3MoICdTdWJtaXQnICk7CgkJfSBlbHNlIHsgLy8gTk8gRVJST1JTCgkJCQoJCQkvKgoJCQllY2hvICc8cHJlPic7CgkJCXByaW50X3IoICRzdGFzaF9maWxlcyApOwoJCQllY2hvICc8L3ByZT4nOwoJCQkqLwoJCQkKCQkJJGJhY2t1cF9saXN0X3RlbXAgPSBhcnJheSgpOwoJCQlmb3JlYWNoKCAkc3Rhc2hfZmlsZXNbJ2ZpbGVzJ10gYXMgJHN0YXNoX2ZpbGUgKSB7CgkJCQkkZmlsZSA9ICRzdGFzaF9maWxlWydmaWxlbmFtZSddOwoJCQkJJHVybCA9ICRzdGFzaF9maWxlWydsaW5rJ107CgkJCQkkc2l6ZSA9ICRzdGFzaF9maWxlWydzaXplJ107CgkJCQkkbW9kaWZpZWQgPSAkc3Rhc2hfZmlsZVsnbGFzdF9tb2RpZmllZCddOwoJCQkJCgkJCQlpZiAoIHN1YnN0ciggJGZpbGUsIDAsIDMgKSA9PSAnZGIvJyApIHsKCQkJCQkkYmFja3VwX3R5cGUgPSAnRGF0YWJhc2UnOwoJCQkJfSBlbHNlaWYgKCBzdWJzdHIoICRmaWxlLCAwLCA1ICkgPT0gJ2Z1bGwvJyApIHsKCQkJCQkkYmFja3VwX3R5cGUgPSAnRnVsbCc7CgkJCQl9IGVsc2VpZiggJGZpbGUgPT0gJ2ltcG9ydGJ1ZGR5LnBocCcgKSB7CgkJCQkJJGJhY2t1cF90eXBlID0gJ0ltcG9ydEJ1ZGR5IFRvb2wnOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIHN0cmlzdHIoICRmaWxlLCAnL2RiLycgKSAhPT0gZmFsc2UgKSB7CgkJCQkJCSRiYWNrdXBfdHlwZSA9ICdEYXRhYmFzZSc7CgkJCQkJfSBlbHNlaWYoIHN0cmlzdHIoICRmaWxlLCAnL2Z1bGwvJyApICE9PSBmYWxzZSApIHsKCQkJCQkJJGJhY2t1cF90eXBlID0gJ0Z1bGwnOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRiYWNrdXBfdHlwZSA9ICdVbmtub3duJzsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCSRiYWNrdXBfbGlzdF90ZW1wWyAkbW9kaWZpZWQgXSA9IGFycmF5KAoJCQkJCSR1cmwsCgkJCQkJJGZpbGUsCgkJCQkJcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCAkbW9kaWZpZWQgKSApIC4gJzxiciAvPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+KCcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9hZ28oICRtb2RpZmllZCApIC4gJyBhZ28pPC9zcGFuPicsCgkJCQkJcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHNpemUgKSwKCQkJCQkkYmFja3VwX3R5cGUsCgkJCQkpOwoJCQl9CgkJCQoJCQlrcnNvcnQoICRiYWNrdXBfbGlzdF90ZW1wICk7CgkJCQoJCQkkYmFja3VwX2xpc3QgPSBhcnJheSgpOwoJCQlmb3JlYWNoKCAkYmFja3VwX2xpc3RfdGVtcCAgYXMgJGJhY2t1cF9pdGVtICkgewoJCQkJJGJhY2t1cF9saXN0WyAkYmFja3VwX2l0ZW1bMF0gXSA9IGFycmF5KAoJCQkJCSRiYWNrdXBfaXRlbVsxXSwKCQkJCQkkYmFja3VwX2l0ZW1bMl0sCgkJCQkJJGJhY2t1cF9pdGVtWzNdLAoJCQkJCSRiYWNrdXBfaXRlbVs0XSwKCQkJCQknPGZvcm0gYWN0aW9uPSI/I3BsdWdpbmJ1ZGR5LXRhYnMtc2VydmVyIiBtZXRob2Q9IlBPU1QiPgoJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYXNzX2hhc2giIHZhbHVlPSInIC4gUEJfUEFTU1dPUkQgLiAnIj4KCQkJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idXBsb2FkIiB2YWx1ZT0ic3Rhc2giPgoJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcHRpb25zIiB2YWx1ZT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoIHNlcmlhbGl6ZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKSAuICciPgoJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsaW5rIiB2YWx1ZT0iJyAuICRiYWNrdXBfaXRlbVswXSAuICciPgoJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpdHhhcGlfdXNlcm5hbWUiIHZhbHVlPSInIC4gJGl0eGFwaV91c2VybmFtZSAuICciPgoJCQkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpdHhhcGlfcGFzc3dvcmQiIHZhbHVlPSInIC4gJGl0eGFwaV9wYXNzd29yZCAuICciPgoJCQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJTZWxlY3QiIGNsYXNzPSJidXR0b24tcHJpbWFyeSI+CgkJCQkJPC9mb3JtPgoJCQkJCScKCQkJCSk7CgkJCX0KCQkJdW5zZXQoICRiYWNrdXBfbGlzdF90ZW1wICk7CgkJCQoJCQkKCQkJLy8gUmVuZGVyIHRhYmxlIGxpc3RpbmcgZmlsZXMuCgkJCWlmICggY291bnQoICRiYWNrdXBfbGlzdCApID09IDAgKSB7CgkJCQllY2hvICc8Yj4nOwoJCQkJX2UoICdZb3UgaGF2ZSBub3Qgc2VudCBhbnkgYmFja3VwcyB0byBTdGFzaCB5ZXQgKG9yIGZpbGVzIGFyZSBzdGlsbCB0cmFuc2ZlcnJpbmcpLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQkJZWNobyAnPC9iPic7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJCQkJCSRiYWNrdXBfbGlzdCwKCQkJCQlhcnJheSgKCQkJCQkJLy8nYWN0aW9uJwkJPT4JcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCkgLiAnJmN1c3RvbT1yZW1vdGVjbGllbnQmZGVzdGluYXRpb25faWQ9JyAuIGh0bWxlbnRpdGllcyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXN0aW5hdGlvbl9pZCcgKSApIC4gJyZyZW1vdGVfcGF0aD0nIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3JlbW90ZV9wYXRoJyApICksCgkJCQkJCSdjb2x1bW5zJwkJPT4JYXJyYXkoICdCYWNrdXAgRmlsZScsICdVcGxvYWRlZCA8aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9zb3J0X2Rvd24ucG5nIiBzdHlsZT0idmVydGljYWwtYWxpZ246IDBweDsiIHRpdGxlPSJTb3J0ZWQgbW9zdCByZWNlbnQgZmlyc3QiPicsICdGaWxlIFNpemUnLCAnVHlwZScsICcmbmJzcDsnICksCgkJCQkJCSdjc3MnCQkJPT4JCSd3aWR0aDogMTAwJTsnLAoJCQkJCSkKCQkJCSk7CgkJCX0KCQkJCgkJCQoJCQkKCQkJaWYgKCAkc3Rhc2hfZmlsZXMgPT09IGZhbHNlICkgewoJCQkJJGNyZWRlbnRpYWxzX2Zvcm0tPmRpc3BsYXlfc2V0dGluZ3MoICdTdWJtaXQnICk7CgkJCX0KCQl9IC8vIGVuZCBubyBlcnJvcnMgZ2V0dGluZyBmaWxlIGluZm8gZnJvbSBBUEkuCgkJCgl9CgkKfSAvLyBlbmQgZm9ybSBzdWJtaXR0ZWQuCgo/PgoKPGJyPjxicj4KPGk+WW91IGNhbiBtYW5hZ2UgeW91ciBTdGFzaCBiYWNrdXBzIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vbWVtYmVyL3BhbmVsL3N0YXNoLnBocCI+aVRoZW1lcyBTdGFzaCBQYW5lbDwvYT48L2k+Cgo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_html_1_stash.php,importbuddy/views/_html_1_stash.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_iframe_footer.php,importbuddy/views/_iframe_footer.php
CTxzY3JpcHQ+Ly9iYl9hY3Rpb24oICdpZnJhbWVMb2FkZWQnICk7PC9zY3JpcHQ+CjwvaHRtbD4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_iframe_footer.php,importbuddy/views/_iframe_footer.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/_iframe_header.php,importbuddy/views/_iframe_header.php
PGh0bWw+Cjw/cGhwCnJlcXVpcmUoICdfYXNzZXRzLnBocCcgKTsKCgoKaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIE5PUk1BTCwgTk9UIERFUExPWU1FTlQuCj8+Cgk8c2NyaXB0PgoJCXZhciB3aW4gPSB3aW5kb3cuZGlhbG9nQXJndW1lbnRzIHx8IG9wZW5lciB8fCBwYXJlbnQgfHwgdG9wOwoJCXdpbi53aW5kb3cuc2Nyb2xsVG8oMCwwKTsKCQkKCQlmdW5jdGlvbiBwYl9zdGF0dXNfYXBwZW5kKCBzdGF0dXNfc3RyaW5nICkgewoJCQkvL3ZhciB3aW4gPSB3aW5kb3cuZGlhbG9nQXJndW1lbnRzIHx8IG9wZW5lciB8fCBwYXJlbnQgfHwgdG9wOwoJCQl3aW4ucGJfc3RhdHVzX2FwcGVuZCggc3RhdHVzX3N0cmluZyApOwoJCX0KCQlmdW5jdGlvbiBwYl9zdGF0dXNfdW5kb3VybCggdW5kb191cmwgKSB7CgkJCS8vdmFyIHdpbiA9IHdpbmRvdy5kaWFsb2dBcmd1bWVudHMgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7CgkJCXdpbi5wYl9zdGF0dXNfdW5kb3VybCggdW5kb191cmwgKTsKCQl9CgkJCgkJCgkJCgkJZnVuY3Rpb24gcGFnZVRpdGxlKCB0aXRsZSApIHsKCQkJCgkJCXdpbi5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoIHRpdGxlICk7CgkJfQoJCQoJCWZ1bmN0aW9uIGJiX2FjdGlvbiggYWN0aW9uLCBub3RlICkgewoJCQl3aW4uYmJfYWN0aW9uKCBhY3Rpb24sIG5vdGUgKTsKCQl9CgkJCgkJZnVuY3Rpb24gYmJfcmVzdG9yZURhdGEoIGRhdGEgKSB7CgkJCXdpbi5iYl9yZXN0b3JlRGF0YSggZGF0YSApOwoJCX0KCQkKCQlmdW5jdGlvbiBiYl9zaG93U3RlcCggc3RlcCwgZGF0YSApIHsKCQkJd2luLmJiX3Nob3dTdGVwKCBzdGVwLCBkYXRhICk7CgkJfQoJCQoJPC9zY3JpcHQ+Cjw/cGhwIH0gZWxzZSB7IC8vIERFUExPWU1FTlQgPz4KCTxzY3JpcHQ+CgkJZnVuY3Rpb24gcGJfc3RhdHVzX2FwcGVuZCgpIHsKCQl9CgkJCgkJZnVuY3Rpb24gcGJfc3RhdHVzX3VuZG91cmwoIHVuZG9fdXJsICkgewoJCX0KCQkKCQlmdW5jdGlvbiBwYWdlVGl0bGUoIHRpdGxlICkgewoJCX0KCQkKCQlmdW5jdGlvbiBiYl9hY3Rpb24oIGFjdGlvbiwgbm90ZSApIHsKCQl9CgkJCgkJZnVuY3Rpb24gYmJfcmVzdG9yZURhdGEoIGRhdGEgKSB7CgkJfQoJCQoJCWZ1bmN0aW9uIGJiX3Nob3dTdGVwKCBzdGVwLCBkYXRhICkgewoJCX0KCTwvc2NyaXB0Pgo8P3BocCB9ID8+
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/_iframe_header.php,importbuddy/views/_iframe_header.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/cleanupSettings.ejs,importbuddy/views/cleanupSettings.ejs
PCUgaWYgKCBwb3RlbnRpYWxQcm9ibGVtcy5sZW5ndGggPiAwICkgeyAlPgoJPGRpdiBjbGFzcz0ibWFpbl9ib3hfaGVhZCB3YXJuaW5nX2FsZXJ0X2JveCI+CgkJPHNwYW4gY2xhc3M9ImVycm9yX3dhcm5pbmdfdGl0bGUiPk9uZSBvciBtb3JlIHBvdGVudGlhbCBwcm9ibGVtcyBtYXkgaGF2ZSBiZWVuIGZvdW5kOjwvc3Bhbj4KCQk8dWwgY2xhc3M9ImJhY2t1cGJ1ZGR5X3dhcm5pbmdfbGlzdCI+CgkJCTwlIGpRdWVyeS5lYWNoKCBwb3RlbnRpYWxQcm9ibGVtcywgZnVuY3Rpb24oIGtleSwgcG90ZW50aWFsUHJvYmxlbSApeyAlPgoJCQk8bGk+PCU9cG90ZW50aWFsUHJvYmxlbSU+PC9saT4KCQkJPCUgfSk7ICU+CgkJPC91bD4KCTwvZGl2Pjxicj4KPCUgfSAlPgoKCjxoMz5WZXJpZnkgaW1wb3J0ZWQgc2l0ZSBmdW5jdGlvbmFsaXR5IGJlZm9yZSBwcm9jZWVkaW5nIHRvIGNsZWFudXA6PGJyPjxicj4KPGEgaHJlZj0iPCU9aG9tZXVybCU+IiB0YXJnZXQ9Il9uZXciPjwlPWhvbWV1cmwlPjwvYT48L2gzPjxicj4KCgo8c2NyaXB0PgpqUXVlcnkoICcuZXhwYW5kZXInICkuY2xpY2soIGZ1bmN0aW9uKCl7CglqUXVlcnkodGhpcykubmV4dCgnLmNvbnRlbnQnKS5zbGlkZVRvZ2dsZSgpOwp9KTsKPC9zY3JpcHQ+Cgo8aDM+Q29tbW9uIElzc3VlcyAmIFRpcHM6PC9oMz4KPGRpdiBjbGFzcz0iZXhwYW5kZXItYm94Ij4KCTxhIGNsYXNzPSJleHBhbmRlciIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIj5DbGlja2luZyBvbiBhIHBvc3QgcmVzdWx0cyBpbiBhIDQwNCBOb3QgRm91bmQ8L2E+Cgk8ZGl2IGNsYXNzPSJjb250ZW50Ij4KCQlUeXBpY2FsbHkgY2F1c2VkIGJ5IGEgcHJvYmxlbSB3aXRoIHlvdXIgLmh0YWNjZXNzIGZpbGUsIHRoZXJlIGlzIGEgc2ltcGxlIGZpeDogTG9nIGludG8geW91ciB3cC1hZG1pbiwgbmF2aWdhdGUgdG8gU2V0dGluZ3M6IFBlcm1hbGlua3MgaW4gdGhlIFdvcmRQcmVzcyBtZW51IGFuZCBjbGljayB0aGUgIlNhdmUiIGJ1dHRvbiB0byB1cGRhdGUgcGVybWFsaW5rIHNldHRpbmdzIHRvIHlvdXIgLmh0YWNjZXNzIGZpbGUuIFRoaXMgdHlwaWNhbGx5IHJlc29sdmVzIHRoaXMgcHJvYmxlbS4KCTwvZGl2Pgo8L2Rpdj4KPGRpdiBjbGFzcz0iZXhwYW5kZXItYm94Ij4KCTxhIGNsYXNzPSJleHBhbmRlciIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIj5Mb2dnaW5nIGluIHJlZGlyZWN0cyBiYWNrIHRvIHRoZSBvbGQgc2l0ZTwvYT4KCTxkaXYgY2xhc3M9ImNvbnRlbnQiPgoJCVRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgZW50ZXJpbmcgdGhlIHNvdXJjZSBzaXRlIFVSTCBhcyB0aGUgZGVzdGluYXRpb24gVVJMIG9uIFN0ZXAgMy4gIFJlLXJlc3RvcmluZyB1c2luZyB0aGUgY29ycmVjdCBVUkwgc2hvdWxkIGZpeCB0aGlzIHByb2JsZW0uCgk8L2Rpdj4KPC9kaXY+CjxkaXYgY2xhc3M9ImV4cGFuZGVyLWJveCI+Cgk8YSBjbGFzcz0iZXhwYW5kZXIiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSI+U291cmNlIHNpdGUgaGFzIGNoYW5nZWQgdG8gdGhlIGRlc3RpbmF0aW9uIFVSTDwvYT4KCTxkaXYgY2xhc3M9ImNvbnRlbnQiPgoJCVRoaXMgaXMgY2F1c2VkIGlmIHlvdSByZXN0b3JlZCBvdmVyIHlvdXIgc291cmNlIHNpdGUgZGF0YWJhc2UgYnkgZW50ZXJpbmcgdGhlIHNvdXJjZSBzaXRlIGRhdGFiYXNlIHNldHRpbmdzIG9uIFN0ZXAgMy4gVGhpcyBtZWFucyB0aGF0IHlvdXIgbmV3IHNpdGUgQU5EIHlvdXIgb2xkIHNpdGUgYXJlIG5vdyB1c2luZyB0aGUgc2FtZSBkYXRhYmFzZSBidXQgdGhlIGRhdGFiYXNlIGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHdvcmsgd2l0aCB0aGUgbmV3IFVSTC4gWW91IG1heSByZS1yZXN0b3JlIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdXNpbmcgY29ycmVjdCBzZXR0aW5ncyBvciB1c2UgdGhlIG1hc3MgZGF0YWJhc2UgcmVwbGFjZW1lbnQgdG9vbC4gIFlvdSBtYXkgY29ycmVjdCB0aGUgbW9kaWZpZWQgVVJMIG9uIHRoZSBzb3VyY2Ugc2l0ZSBieSB1c2luZyB0aGUgU2VydmVyIFRvb2xzIHBhZ2UncyBNYXNzIFRleHQgUmVwbGFjZSB0b29sIHdpdGhpbiB0aGUgRGF0YWJhc2UgdGFiLgoJPC9kaXY+CjwvZGl2Pgo8YnI+PGJyPgoKCgo8Zm9ybSBvblN1Ym1pdD0ialF1ZXJ5KCcjY2xlYW51cFNldHRpbmdzLXJlc3RvcmVEYXRhJykudmFsKCB3aW5kb3cuYnRvYSggZW5jb2RlVVJJQ29tcG9uZW50KCBKU09OLnN0cmluZ2lmeSggd2luZG93LnJlc3RvcmVEYXRhICkgKSApICk7IiBhY3Rpb249Ij9hamF4PTYiIHRhcmdldD0ibWluaUZyYW1lIiBtZXRob2Q9InBvc3QiPjwhLS0gdGhpcyBmb3JtIGlzIG9ubHkgc3VibWl0dGVkIGFmdGVyIHJ1bm5pbmcgdGhyb3VnaCBqYXZhc2NyaXB0LiBzdWJtaXR0aW5nIGFjdHVhbCBmb3JtIGluc3RlYWQgb2YgdXNpbmcgalF1ZXJ5IHBvc3Qgc28gd2UgY2FuIHRhcmdldCBpZnJhbWUuIC0tPgoJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIGlkPSJjbGVhbnVwU2V0dGluZ3MtcmVzdG9yZURhdGEiIHZhbHVlPSIiPgoJCgkKCQoJPGRpdiBjbGFzcz0ibWFpbl9ib3hfZm9vdCI+CgkJCgkJPGgzPlNlbGVjdCBmaWxlcyB0byBkZWxldGUgZm9yIGNsZWFudXA6PC9oMz4KCQk8dGFibGUgc3R5bGU9Im1hcmdpbi1sZWZ0OiBhdXRvOyBtYXJnaW4tcmlnaHQ6IGF1dG87Ij48dHI+PHRkPgoJCQk8bGFiZWwgZm9yPSJkZWxldGVfYmFja3VwIiBzdHlsZT0id2lkdGg6IGF1dG87IGZvbnQtc2l6ZTogMTJweDsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iZGVsZXRlX2JhY2t1cCIgaWQ9ImRlbGV0ZV9iYWNrdXAiIHZhbHVlPSIxIiBjaGVja2VkPiBEZWxldGUgYmFja3VwIHppcCBhcmNoaXZlPC9sYWJlbD4KCQkJPGJyPgoJCQk8bGFiZWwgZm9yPSJkZWxldGVfdGVtcCIgc3R5bGU9IndpZHRoOiBhdXRvOyBmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRlbGV0ZV90ZW1wIiBpZD0iZGVsZXRlX3RlbXAiIHZhbHVlPSIxIiBjaGVja2VkPiBEZWxldGUgdGVtcG9yYXJ5IGltcG9ydCBmaWxlczwvbGFiZWw+CgkJPC90ZD48dGQ+CgkJCTxsYWJlbCBmb3I9ImRlbGV0ZV9pbXBvcnRidWRkeSIgc3R5bGU9IndpZHRoOiBhdXRvOyBmb250LXNpemU6IDEycHg7Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImRlbGV0ZV9pbXBvcnRidWRkeSIgaWQ9ImRlbGV0ZV9pbXBvcnRidWRkeSIgdmFsdWU9IjEiIGNoZWNrZWQ+IERlbGV0ZSBJbXBvcnRCdWRkeSB0b29sIGZpbGVzPC9sYWJlbD4KCQkJPGJyPgoJCQk8bGFiZWwgZm9yPSJkZWxldGVfaW1wb3J0YnVkZHlsb2ciIHN0eWxlPSJ3aWR0aDogYXV0bzsgZm9udC1zaXplOiAxMnB4OyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJkZWxldGVfaW1wb3J0YnVkZHlsb2ciIGlkPSJkZWxldGVfaW1wb3J0YnVkZHlsb2ciIHZhbHVlPSIxIiBjaGVja2VkPiBEZWxldGUgaW1wb3J0YnVkZHkudHh0IGxvZyBmaWxlPC9sYWJlbD4KCQk8L3RkPjwvdHI+PC90YWJsZT4KCQkKCQk8YnI+CgkJPGNlbnRlcj4KCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ibmV4dFN0ZXAiIHZhbHVlPSJGaW5pc2ggQ2xlYW51cCIgY2xhc3M9Iml0LWJ1dHRvbiBwYl9kYXRhYmFzZV9uZXh0X3Rlc3QiPgoJCTwvY2VudGVyPgoJCgk8L2Rpdj4KPC9mb3JtPg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/cleanupSettings.ejs,importbuddy/views/cleanupSettings.ejs
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/cpanelTutorial.ejs,importbuddy/views/cpanelTutorial.ejs
PG9iamVjdCBjbGFzc2lkPSJjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAiIGNvZGViYXNlPSJodHRwOi8vZnBkb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj03LDAsMCwwIiBpZD0iQ2FwdGl2YXRlMSI+Cgk8cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSJodHRwOi8vd3d3LmNwYW5lbC5uZXQvbWVkaWEvdHV0b3JpYWxzL215c3Fsd2l6YXJkLnN3ZiI+Cgk8cGFyYW0gbmFtZT0icXVhbGl0eSIgdmFsdWU9ImhpZ2giPjxwYXJhbSBuYW1lPSJsb29wIiB2YWx1ZT0iMCI+Cgk8ZW1iZWQgc3JjPSJodHRwOi8vd3d3LmNwYW5lbC5uZXQvbWVkaWEvdHV0b3JpYWxzL215c3Fsd2l6YXJkLnN3ZiIgd2lkdGg9IjEwMCUiIGhlaWdodD0iNTAwIiBsb29wPSIwIiBxdWFsaXR5PSJsb3ciIHBsdWdpbnNwYWdlPSJodHRwOi8vd3d3Lm1hY3JvbWVkaWEuY29tL2dvL2dldGZsYXNocGxheWVyIiB0eXBlPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIgbWVudT0iZmFsc2UiPgo8L29iamVjdD4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/cpanelTutorial.ejs,importbuddy/views/cpanelTutorial.ejs
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/databaseSettings.ejs,importbuddy/views/databaseSettings.ejs
PHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5kYl90ZXN0X2NvbnRhaW5lciB7CgkJY2xlYXI6IGJvdGg7CgkJZGlzcGxheTogbm9uZTsKCQliYWNrZ3JvdW5kLWNvbG9yOiAjRkFGQUZBOwoJCQoJCWJvcmRlci1yYWRpdXM6IDRweDsKCQktbW96LWJvcmRlci1yYWRpdXM6IDRweDsKCQktd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKCQlib3JkZXI6IDFweCBzb2xpZCAjREZERkRGOwoJCQoJCW1hcmdpbi1yaWdodDoxMHB4OwoJCXBhZGRpbmc6OHB4OwoJfQo8L3N0eWxlPgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaW1wb3J0YnVkZHkvanMvanF1ZXJ5LmxlYW5Nb2RhbC5taW4uanMiPjwvc2NyaXB0PgoKCgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cgl2YXIgZGF0YWJhc2VQYXNzZWQgPSBmYWxzZTsKCQoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkKCQlsb2FkVG9vbHRpcHMoKTsKCQkKCQlqUXVlcnkoICcjZGF0YWJhc2UtYm94IGlucHV0JyApLmNoYW5nZSggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS50ZXh0KCcnKS5oaWRlKCk7CgkJfSk7CgkJCgkJalF1ZXJ5KCcuc2V0dGluZ0NvcHkgYScgKS5jbGljayggZnVuY3Rpb24oZSl7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJaWYgKCBqUXVlcnkodGhpcykuaGFzQ2xhc3MoICdzZXR0aW5nQ29weUFsbCcgKSApIHsKCQkJCXJldHVybjsKCQkJfQoJCQlzb3VyY2VWYWwgPSBqUXVlcnkodGhpcykuY2xvc2VzdCgndGQnKS5wcmV2KCd0ZCcpLmZpbmQoJ2lucHV0W3R5cGU9InRleHQiXScpLnZhbCgpOwoJCQlkZXN0aW5hdGlvbiA9IGpRdWVyeSh0aGlzKS5jbG9zZXN0KCd0ZCcpLm5leHQoJ3RkJykuZmluZCgnaW5wdXRbdHlwZT0idGV4dCJdJyk7CgkJCWRlc3RpbmF0aW9uLnZhbCggc291cmNlVmFsICk7CgkJfSk7CgkJalF1ZXJ5KCcuc2V0dGluZ0NvcHlBbGwgYScgKS5jbGljayggZnVuY3Rpb24oZSl7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJcGFyZW50VGFibGUgPSBqUXVlcnkodGhpcykuY2xvc2VzdCgndGFibGUnKTsKCQkJcGFyZW50VGFibGUuZmluZCgndHInKS5lYWNoKCBmdW5jdGlvbigpewoJCQkJc2V0dGluZ0NvcHlJdGVtID0galF1ZXJ5KHRoaXMpLmZpbmQoJy5zZXR0aW5nQ29weScpOwoJCQkJaWYgKCAhIHNldHRpbmdDb3B5SXRlbS5oYXNDbGFzcyggJ3NldHRpbmdDb3B5QWxsJyApICkgewoJCQkJCXNldHRpbmdDb3B5SXRlbS5maW5kKCdhJykudHJpZ2dlcignY2xpY2snKTsKCQkJCX0KCQkJfSk7CgkJfSk7CgkJCgkJCgkJCgkJalF1ZXJ5KCcjcGJfYmFja3VwYnVkZHlfbWFsd2FyZXNjYW5sb2FkaW5nJykuc2xpZGVUb2dnbGUoKTsKCQkKCQlqUXVlcnkoICcuZGJfc2V0dGluZycgKS5jaGFuZ2UoIGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5yZW1vdmVDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQl9KTsKCQkKCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5jbGljayggZnVuY3Rpb24oZSkgewoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCQoJCQlqUXVlcnkoICcjZGJfdGVzdF9jb250YWluZXInICkudGV4dCgnJykuaGlkZSgpOwoJCQkKCQkJaWYgKCAoICcnID09IGpRdWVyeSgnI215c3FsX3NlcnZlcicpLnZhbCgpICkgfHwgKCAnJyA9PSBqUXVlcnkoJyNteXNxbF9kYXRhYmFzZScpLnZhbCgpICkgfHwgKCAnJyA9PSBqUXVlcnkoJyNteXNxbF91c2VybmFtZScpLnZhbCgpICkgfHwgKCAnJyA9PSBqUXVlcnkoJyNteXNxbF9wcmVmaXgnKS52YWwoKSApICkgewoJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyI+TWlzc2luZyBGaWVsZHM8L3NwYW4+IEFsbCBkYXRhYmFzZSBzZXR0aW5ncyAoZXhjZXB0IG9wdGlvbmFsIHBhc3N3b3JkKSBhcmUgcmVxdWlyZWQgYW5kIG11c3QgYmUgZW50ZXJlZCB0byBjb250aW51ZS4nICkuc2hvdygpOwoJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJCgkJCU5Qcm9ncmVzcy5zdGFydCgpOwoJCQkKCQkJalF1ZXJ5KCcuaW5wdXQtYXR0ZW50aW9uJyApLnJlbW92ZUNsYXNzKCAnaW5wdXQtYXR0ZW50aW9uJyApOwoJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5yZW1vdmVDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQkJCgkJCXZhciBzZXJ2ZXIgPSBqUXVlcnkoJyNteXNxbF9zZXJ2ZXInKS52YWwoKTsKCQkJdmFyIGRhdGFiYXNlID0galF1ZXJ5KCcjbXlzcWxfZGF0YWJhc2UnKS52YWwoKTsKCQkJdmFyIHVzZXJuYW1lID0galF1ZXJ5KCcjbXlzcWxfdXNlcm5hbWUnKS52YWwoKTsKCQkJdmFyIHBhc3N3b3JkID0galF1ZXJ5KCcjbXlzcWxfcGFzc3dvcmQnKS52YWwoKTsKCQkJdmFyIHByZWZpeCA9IGpRdWVyeSgnI215c3FsX3ByZWZpeCcpLnZhbCgpOwoJCQl2YXIgZGF0YWJhc2VNZXRob2RTdHJhdGVneSA9IGpRdWVyeSggJyNkYXRhYmFzZU1ldGhvZFN0cmF0ZWd5JykudmFsKCk7CgkJCQoJCQlqUXVlcnkucG9zdCgnaW1wb3J0YnVkZHkucGhwJywgewoJCQkJCWFqYXg6ICJteXNxbF90ZXN0IiwKCQkJCQkKCQkJCQlzZXJ2ZXI6IHNlcnZlciwKCQkJCQlkYXRhYmFzZTogZGF0YWJhc2UsCgkJCQkJdXNlcm5hbWU6IHVzZXJuYW1lLAoJCQkJCXBhc3N3b3JkOiBwYXNzd29yZCwKCQkJCQlwcmVmaXg6IHByZWZpeAoJCQkJfSwgZnVuY3Rpb24oZGF0YSkgewoJCQkJCU5Qcm9ncmVzcy5kb25lKCk7CgkJCQkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgkJCQkJYmFja3VwYnVkZHlfbG9nKCAnTXlTUUwgdGVzdCByZXN1bHRzOiBgJyArIGRhdGEgKyAnYC4nICk7CgkJCQkJaWYgKCBkYXRhLmluZGV4T2YoIm11c3QgbG9nIGluIikgIT0gLTEpIHsKCQkJCQkJYWxlcnQoICdZb3VyIHNlc3Npb24gaGFzIGV4cGlyZWQuIFBsZWFzZSByZXR1cm4gdG8gdGhlIHJlc3RvcmUgaG9tZXBhZ2UgYW5kIGxvZyBiYWNrIGluLicgKTsKCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgoJCQkJCS8vIFBhcnNlIGpzb24uCgkJCQkJdHJ5IHsKCQkJCQkJcmVzcG9uc2UgPSBKU09OLnBhcnNlKCBkYXRhICk7CgkJCQkJfSBjYXRjaChlKSB7CgkJCQkJCWFsZXJ0KCAnRXJyb3IgIzg5MjM4My4gUHJvYmxlbSBwYXJzaW5nIHNlcnZlciByZXNwb25zZS4gRGV0YWlsczogYCcgKyBlLm1lc3NhZ2UgKyAnYC4gUmVzcG9uc2UgZGF0YTogYCcgKyBkYXRhICsgJ2AuJyApOwoJCQkJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5hZGRDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQljb25zb2xlLmxvZyggcmVzcG9uc2UgKTsKCgoJCQkJCS8vIEVSUk9SUwoJCQkJCWlmICggZmFsc2UgPT09IHJlc3BvbnNlLmNvbm5lY3QgKSB7CgkJCQkJCWpRdWVyeSggJyNteXNxbF9zZXJ2ZXIsI215c3FsX3VzZXJuYW1lLCNteXNxbF9wYXNzd29yZCcgKS5hZGRDbGFzcyggJ2lucHV0LWF0dGVudGlvbicgKTsKCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyI+RGF0YWJhc2UgRXJyb3I8L3NwYW4+IFVuYWJsZSB0byBjb25uZWN0IC8gYXV0aGVudGljYXRlIHRvIE15U1FMIHNlcnZlci4gJyArIHJlc3BvbnNlLmNvbm5lY3RfZXJyb3IgKS5zaG93KCk7CgkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCQoJCQkJCWlmICggZmFsc2UgPT09IHJlc3BvbnNlLnNlbGVjdGRiICkgewoJCQkJCQlqUXVlcnkoICcjbXlzcWxfZGF0YWJhc2UnICkuYWRkQ2xhc3MoICdpbnB1dC1hdHRlbnRpb24nICk7CgkJCQkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS5odG1sKCAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciPkRhdGFiYXNlIEVycm9yPC9zcGFuPiBVbmFibGUgdG8gc2VsZWN0IGRhdGFiYXNlLiBWZXJpZnkgdGhlIGRhdGFiYXNlIGV4aXN0cyAmIHRoZSB1c2VyIHdhcyBncmFudGVkIEFMTCBwcml2aWxlZ2VzLiAnICsgcmVzcG9uc2Uuc2VsZWN0ZGJfZXJyb3IgKS5zaG93KCk7CgkJCQkJCWpRdWVyeSgnLnBiX2RhdGFiYXNlX25leHRfdGVzdCcpLmFkZENsYXNzKCAnaXQtYXR0ZW50aW9uJyApOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCQoJCQkJCWlmICggZmFsc2UgPT09IHJlc3BvbnNlLmNyZWF0ZWRyb3B0YWJsZSApIHsKCQkJCQkJalF1ZXJ5KCAnI2RiX3Rlc3RfY29udGFpbmVyJyApLmh0bWwoICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyI+RGF0YWJhc2UgRXJyb3I8L3NwYW4+IFVuYWJsZSB0byBjcmVhdGUgJiBkcm9wIHRlc3QgdGFibGUuIFZlcmlmeSB0aGUgZW50ZXJlZCB1c2VyIGhhcyBBTEwgcHJpdmlsZWdlcyBmb3IgdGhlIHNwZWNpZmllZCBkYXRhYmFzZS4gJyArIHJlc3BvbnNlLmNyZWF0ZWRyb3B0YWJsZV9lcnJvciApLnNob3coKTsKCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJaWYgKCBmYWxzZSA9PT0gcmVzcG9uc2UucHJlZml4ICkgewoJCQkJCQlqUXVlcnkoICcjZGJfdGVzdF9jb250YWluZXInICkuaHRtbCggJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIj5EYXRhYmFzZSBFcnJvcjwvc3Bhbj4gVGhlIHNwZWNpZmllZCBwcmVmaXggZG9lcyBub3QgdGhlIGJhcmUgbWluaW11bSBjcml0ZXJpYSBmb3IgV29yZFByZXNzLiBJdCBzaG91bGQgYmUgaW4gdGhlIGZvcm1hdCBvZiBsZXR0ZXJzIChvciBudW1iZXJzLCBidXQgbm90IGF0IHRoZSBiZWdpbm5pbmcpIGZvbGxvd2VkIGJ5IGFuIHVuZGVyc2NvcmUuIDxiPkVpdGhlciBjaGFuZ2UgdGhlIHByZWZpeCBvciBzZWxlY3QgdG8gaWdub3JlIHRoaXMgd2FybmluZyBiZWxvdyB0byBwcm9jZWVkLjwvYj4gRXhhbXBsZXM6IHdwXywgd3AyXywgbXl3b3JkcHJlc3NfLCBkdXN0aW5zMm5kYmxvZ18nICkuc2hvdygpOwoJCQkJCQlqUXVlcnkoICcjZGJfd2lwZV9vcHRpb25zJyApLnNob3coKTsKCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJLy8gUFJFRklYIFdBUk5JTkdTCgkJCQkJcHJlZml4X3dhcm5faWdub3JlID0galF1ZXJ5KCAnI2lnbm9yZV9wcmVmaXhfd2FybmluZ3NfY2hlY2tib3gnICkuaXMoIjpjaGVja2VkIik7CgkJCQkJCgkJCQkJaWYgKCAoIHRydWUgPT09IHJlc3BvbnNlLnByZWZpeF93YXJuICkgJiYgKCB0cnVlID09PSB3aW5kb3cucmVzdG9yZURhdGEucmVzdG9yZURhdGFiYXNlICkgKSB7CgkJCQkJCWlmICggIXByZWZpeF93YXJuX2lnbm9yZSApIHsKCQkJCQkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS5odG1sKCAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciPkRhdGFiYXNlIFdhcm5pbmc8L3NwYW4+IEEgcHJlZml4IGluIHRoZSBmb3JtYXQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgYW4gdW5kZXJzY29yZSBpcyA8Yj5oaWdobHkgcmVjb21tZW5kZWQ8L2I+IHRvIGNvbmZvcm0gdG8gV29yZFByZXNzICYgQmFja3VwQnVkZHkgY29udmVudGlvbnMgJiBleHBlY3RhdGlvbnMuIFRoaXMgbWF5IGFsc28gY2F1c2Ugd2FybmluZ3Mgb2YgdGFibGVzIGFscmVhZHkgZXhpc3RpbmcgdGhhdCBkbyBub3QuIDxiPkVpdGhlciBjaGFuZ2UgdGhlIHByZWZpeCBvciBzZWxlY3QgdG8gaWdub3JlIHRoaXMgd2FybmluZyBiZWxvdyB0byBwcm9jZWVkLjwvYj4gRXhhbXBsZXM6IHdwXywgd3AyXywgbXl3b3JkcHJlc3NfLCBkdXN0aW5zMm5kYmxvZ18nICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5KCAnI2RiX3dpcGVfb3B0aW9ucycgKS5zaG93KCk7CgkJCQkJCQlqUXVlcnkoICcjaWdub3JlX3ByZWZpeF93YXJuaW5ncycgKS5zaG93KCk7CgkJCQkJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5hZGRDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7IC8vIE5vIHByZWZpeCBmb3JtYXQgd2FybmluZyBzbyBoaWRlIG9wdGlvbiB0byBieXBhc3MuCgkJCQkJCWpRdWVyeSggJyNpZ25vcmVfcHJlZml4X3dhcm5pbmdzX2NoZWNrYm94JyApLmF0dHIoJ2NoZWNrZWQnLCBmYWxzZSk7CgkJCQkJCWpRdWVyeSggJyNpZ25vcmVfcHJlZml4X3dhcm5pbmdzJykuaGlkZSgpOwoJCQkJCX0KCQkJCQkKCQkJCQkvLyBQcmVmaXggZXhpc3RzLgoJCQkJCWlmKCAgKCB0cnVlID09PSByZXNwb25zZS5wcmVmaXhfZXhpc3RzICkgJiYgKCB0cnVlID09PSB3aW5kb3cucmVzdG9yZURhdGEucmVzdG9yZURhdGFiYXNlICkgKSB7CgkJCQkJCWlmICggKCAhIGpRdWVyeSggJyN3aXBlX3ByZWZpeCcpLmlzKCAnOmNoZWNrZWQnICkgKSAmJiAoICEgalF1ZXJ5KCAnI3dpcGVfZGF0YWJhc2UnKS5pcyggJzpjaGVja2VkJyApICkgKSB7CgkJCQkJCQlqUXVlcnkoICcjZGJfdGVzdF9jb250YWluZXInICkuaHRtbCggJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC13YXJuaW5nIj5EYXRhYmFzZSBXYXJuaW5nPC9zcGFuPiBUaGUgc3BlY2lmaWVkIHByZWZpeCBhcHBlYXJzIHRvIGFscmVhZHkgZXhpc3QgaW4gdGhpcyBkYXRhYmFzZS4gUmVzdG9yaW5nIG1heSBvdmVyd3JpdGUgZXhpc3RpbmcgV29yZFByZXNzIGRhdGEuIDxiPkNoYW5nZSB0aGUgcHJlZml4LCBzZWxlY3QgdG8gZGVsZXRlIGV4aXN0aW5nIHRhYmxlcyBiZWxvdywgb3IgdXNlIHRoZSBhZHZhbmNlZCBvcHRpb24gdG8gaWdub3JlIFNRTCBlcnJvcnMgdG8gcHJvY2VlZC48L2I+JyApLnNob3coKTsKCQkJCQkJCWpRdWVyeSggJyNkYl93aXBlX29wdGlvbnMnICkuc2hvdygpOwoJCQkJCQkJaWYgKCAgalF1ZXJ5KCcjaWdub3JlX3NxbF9lcnJvcnMnKS5pcyggJzpjaGVja2VkJyApICkgewoJCQkJCQkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS5odG1sKCAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciPkRhdGFiYXNlIFdhcm5pbmc8L3NwYW4+IFRoZSBzcGVjaWZpZWQgcHJlZml4IGFwcGVhcnMgdG8gYWxyZWFkeSBleGlzdCBpbiB0aGlzIGRhdGFiYXNlLiBIb3dldmVyLCB0aGUgYWR2YW5jZWQgb3B0aW9uIHRvIGlnbm9yZSBleGlzdGluZyB0YWJsZXMgJiBTUUwgZXJyb3JzIHdhcyBzZWxlY3RlZC4gVXNlIGV4dHJlbWUgY2F1dGlvbi4nICkuc2hvdygpOwoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQlqUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5hZGRDbGFzcyggJ2l0LWF0dGVudGlvbicgKTsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJCgkJCQkJCgkJCQkJLy8gT1ZFUkFMTCBFUlJPUgoJCQkJCWlmICggJycgIT09IHJlc3BvbnNlLm92ZXJhbGxfZXJyb3IgKSB7CgkJCQkJCWpRdWVyeSggJyNkYl90ZXN0X2NvbnRhaW5lcicgKS5odG1sKCAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciPkRhdGFiYXNlIEVycm9yPC9zcGFuPiAnIC4gcmVzcG9uc2Uub3ZlcmFsbF9lcnJvciApLnNob3coKTsKCQkJCQkJalF1ZXJ5KCcucGJfZGF0YWJhc2VfbmV4dF90ZXN0JykuYWRkQ2xhc3MoICdpdC1hdHRlbnRpb24nICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJCgkJCQkJCgkJCQkJLy8gU2V0IHVwIGRhdGFiYXNlIHNldHRpbmdzIGluIHJlc3RvcmVEYXRhLgoJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLnNlcnZlciA9IHNlcnZlcjsKCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy5kYXRhYmFzZSA9IGRhdGFiYXNlOwoJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLnVzZXJuYW1lID0gdXNlcm5hbWU7CgkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MucGFzc3dvcmQgPSBwYXNzd29yZDsKCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy5wcmVmaXggPSBwcmVmaXg7CgkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MuZGF0YWJhc2VNZXRob2RTdHJhdGVneSA9IGRhdGFiYXNlTWV0aG9kU3RyYXRlZ3k7CgkJCQkKCQkJCQlpZiAoIGpRdWVyeSggJyN3aXBlX3ByZWZpeCcpLmlzKCAnOmNoZWNrZWQnICkgKSB7CgkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLndpcGVQcmVmaXggPSB0cnVlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLndpcGVQcmVmaXggPSBmYWxzZTsKCQkJCQl9CgkJCQkJaWYgKCBqUXVlcnkoICcjd2lwZV9kYXRhYmFzZScpLmlzKCAnOmNoZWNrZWQnICkgKSB7CgkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLndpcGVEYXRhYmFzZSA9IHRydWU7CgkJCQkJfSBlbHNlIHsKCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3Mud2lwZURhdGFiYXNlID0gZmFsc2U7CgkJCQkJfQoJCQkJCWlmICggalF1ZXJ5KCAnI2lnbm9yZV9zcWxfZXJyb3JzJykuaXMoICc6Y2hlY2tlZCcgKSApIHsKCQkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3MuaWdub3JlU3FsRXJyb3JzID0gdHJ1ZTsKCQkJCQl9IGVsc2UgewoJCQkJCQl3aW5kb3cucmVzdG9yZURhdGEuZGF0YWJhc2VTZXR0aW5ncy5pZ25vcmVTcWxFcnJvcnMgPSBmYWxzZTsKCQkJCQl9CgkJCQkJCgkJCQkJLy8gRGV0ZXJtaW5lIFNRTCBmaWxlcyB0byByZXN0b3JlIGJhc2VkIG9uIGFkdmFuY2VkIGNoZWNrZWQgaXRlbXMuIE92ZXJ3cml0ZXMgcHJpb3IgdmFsdWUgb2YgdGhpcyB2YXIuCgkJCQkJd2luZG93LnJlc3RvcmVEYXRhLmRhdGFiYXNlU2V0dGluZ3Muc3FsRmlsZXMgPSBbXTsKCQkJCQlqUXVlcnkoJy5kYXRhYmFzZUZpbGU6Y2hlY2tlZCcpLmVhY2goIGZ1bmN0aW9uKCl7CgkJCQkJCXdpbmRvdy5yZXN0b3JlRGF0YS5kYXRhYmFzZVNldHRpbmdzLnNxbEZpbGVzLnB1c2goIGpRdWVyeSh0aGlzKS52YWwoKSApOwoJCQkJCX0pOwoJCQkJCQoJCQkJCS8vIFVwZGF0ZSBtYXggZXhlY3V0aW9uIHRpbWUuCgkJCQl3aW5kb3cucmVzdG9yZURhdGEubWF4RXhlY3V0aW9uVGltZSA9IGpRdWVyeSgnI21heF9leGVjdXRpb25fdGltZScpLnZhbCgpOwoJCQkJCQoJCQkJCS8vIE1hZGUgaXQgaGVyZSBzbyBtdXN0IGhhdmUgYmVlbiBzdWNjZXNzLgoJCQkJCWNvbnNvbGUuZGlyKCB3aW5kb3cucmVzdG9yZURhdGEgKTsKCQkJCQkKCQkJCQlqUXVlcnkoJyNiYWNrdXBidWRkeS1kYlNldHRpbmdzRm9ybS1yZXN0b3JlRGF0YScpLnZhbCggd2luZG93LmJ0b2EoIGVuY29kZVVSSUNvbXBvbmVudCggSlNPTi5zdHJpbmdpZnkoIHdpbmRvdy5yZXN0b3JlRGF0YSApICkgKSApOyAvLyB3aW5kb3cuYnRvYSgpIGJhc2U2NCBlbmNvZGVzIHRvIGdldCBhcm91bmQgdHJhbnNmZXIgaXNzdWVzICsgQ2hyb21lIFhTUyBhdWRpdG9yLiBlbmNvZGVVUklDb21wb25lbnQgbmVlZGVkIHRvIGtlZXAgVVRGOCBmcm9tIGdldHRpbmcgbXVja2VkIHVwIGdvaW5nIG92ZXIgdG8gUEhQJ3MganNvbl9kZWNvZGUoKS4gQmxlY2ghCgkJCQkJalF1ZXJ5KCcjZGF0YWJhc2UtYm94JykuaGlkZSgpOwkKCQkJCQlqUXVlcnkoJyNkYXRhYmFzZS1ib3gtd29ya2luZycpLmh0bWwoIG5ldyBFSlMoe3VybDogJ2ltcG9ydGJ1ZGR5L3ZpZXdzL2ltcG9ydGluZ0RhdGFiYXNlLmVqcyd9KS5yZW5kZXIoKSApOwoJCQkJCWpRdWVyeSggJyNiYWNrdXBidWRkeS1kYlNldHRpbmdzRm9ybScpLnN1Ym1pdCgpOwoJCQkJCQoJCQkJCXJldHVybjsKCQkJfSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfSk7CgkJCgkJCgkJalF1ZXJ5KCcuY3JlYXRlZGJfbW9kYWxfbGluaycpLmNsaWNrKCBmdW5jdGlvbigpIHsKCQkJdXJsID0galF1ZXJ5KCcjc2l0ZV91cmwnKS52YWwoKTsKCQkJdmFyIGhvc3RuYW1lID0galF1ZXJ5KCc8YT4nKS5wcm9wKCdocmVmJywgdXJsKS5wcm9wKCdob3N0bmFtZScpOwoJCQkvL2FsZXJ0KCBob3N0bmFtZSApOwoJCQlqUXVlcnkoICcjY3BhbmVsX3VybCcgKS52YWwoIGhvc3RuYW1lICk7CgkJCS8valF1ZXJ5KCAnLmNwYW5lbF91cmxfZnVsbCcgKS5odG1sKCAnaHR0cDovLycgKyBob3N0bmFtZSArICc6MjA4Mi8nICk7CgkJCQoJCX0pOwoJCWpRdWVyeSggJyNjcGFuZWxfdXJsJyApLmNoYW5nZSggZnVuY3Rpb24oKSB7CgkJCS8valF1ZXJ5KCAnLmNwYW5lbF91cmxfZnVsbCcgKS5odG1sKCAnaHR0cDovLycgKyBqUXVlcnkodGhpcykudmFsKCkgKyAnOjIwODIvJyApOwoJCX0pOwoJCWpRdWVyeSgnLmxlYW5Nb2RhbCcpLmxlYW5Nb2RhbCgKCQkJeyB0b3AgOiA0NSwgb3ZlcmxheSA6IDAuNCwgY2xvc2VCdXR0b246ICIubW9kYWxfY2xvc2UiIH0KCQkpOwoJCQoJCWpRdWVyeSggJy5jcGFuZWxfdXNlcicgKS5jaGFuZ2UoZnVuY3Rpb24oKXsKCQkJalF1ZXJ5KCAnLmNwYW5lbF91c2VyX21pcnJvcicgKS5odG1sKCBqUXVlcnkoICcjY3BhbmVsX3VzZXInICkudmFsKCkgKyAnXycgKTsKCQl9KTsKCQkKCQlqUXVlcnkoICcuY3BhbmVsX2NyZWF0ZWRiX2NyZWF0ZScgKS5jbGljayggZnVuY3Rpb24oKSB7CgkJCS8vIFZhbGlkYXRlIGRiIHN0dWZmIGlzIGFsbCBhbHBoYW51bWVyaWMuCgkJCWlmICgKCQkJCSggZmFsc2UgPT0gL15bYS16QS1aMC05XSskLy50ZXN0KCBqUXVlcnkoJyNjcGFuZWxfZGJuYW1lJykudmFsKCkgKSApCgkJCQl8fAoJCQkJKCBmYWxzZSA9PSAvXlthLXpBLVowLTldKyQvLnRlc3QoIGpRdWVyeSgnI2NwYW5lbF9kYnVzZXInKS52YWwoKSApICkKCQkJCSkgewoJCQkJYWxlcnQoICdEYXRhYmFzZSB2YWx1ZXMgKGV4Y2VwdCBwYXNzd29yZCkgbXVzdCBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9ubHkgYW5kIG5vIHNwYWNlcy4gQ29ycmVjdCB0aGlzIGFuZCB0cnkgYWdhaW4uJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQkvLyBWYWxpZGF0ZSBpbnB1dCBsZW5ndGhzLgoJCQlpZiAoIGpRdWVyeSgnI2NwYW5lbF9kYnBhc3MnKS52YWwoKS5sZW5ndGggPCA1ICkgewoJCQkJYWxlcnQoICdEYXRhYmFzZSBwYXNzd29yZHMgbXVzdCBiZSA1IG9yIG1vcmUgY2hhcmFjdGVycyBpbiBsZW5ndGguJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQlOUHJvZ3Jlc3Muc3RhcnQoKTsKCQkJCgkJCWpRdWVyeS5wb3N0KAoJCQkJJ2ltcG9ydGJ1ZGR5LnBocD9hamF4PWNwYW5lbF9jcmVhdGVkYicsCgkJCQlqUXVlcnkoICcjY3BhbmVsX2NyZWF0ZWRiX2Zvcm0nICkuc2VyaWFsaXplKCksIGZ1bmN0aW9uKGRhdGEpIHsKCQkJCQlOUHJvZ3Jlc3MuZG9uZSgpOwoJCQkJCQoJCQkJCWRhdGEgPSBqUXVlcnkudHJpbSggZGF0YSApOwoJCQkJCWpRdWVyeSgnI2l0aGVtZXNfbG9hZGluZycpLmh0bWwoIGRhdGEgKTsKCQkJCQlqUXVlcnkoICcuY3BhbmVsX2NyZWF0ZWRiX2xvYWRpbmcnICkuaGlkZSgpOwoJCQkJCQoJCQkJCS8vYWxlcnQoICdzbGljZTogJyArIGRhdGEuc2xpY2UoIC03ICkgKTsKCQkJCQlpZiAoIGRhdGEuc2xpY2UoIDAsNyApID09ICdTdWNjZXNzJyApIHsKCQkJCQkJCgkJCQkJCWpRdWVyeSggJyNteXNxbF9kYXRhYmFzZScgKS52YWwoIGpRdWVyeSggJyNjcGFuZWxfdXNlcicgKS52YWwoKSArICdfJyArIGpRdWVyeSgnI2NwYW5lbF9kYm5hbWUnKS52YWwoKSApOwoJCQkJCQlqUXVlcnkoICcjbXlzcWxfdXNlcm5hbWUnICkudmFsKCBqUXVlcnkoICcjY3BhbmVsX3VzZXInICkudmFsKCkgKyAnXycgKyBqUXVlcnkoJyNjcGFuZWxfZGJ1c2VyJykudmFsKCkgKTsKCQkJCQkJalF1ZXJ5KCAnI215c3FsX3Bhc3N3b3JkJyApLnZhbCggalF1ZXJ5KCcjY3BhbmVsX2RicGFzcycpLnZhbCgpICk7CgkJCQkJCQoJCQkJCQlhbGVydCggZGF0YSArICJcblxuIiArICdZb3VyIGRhdGFiYXNlIHNldHRpbmdzIHdpbGwgbm93IGJlIHNldC4nICk7CgkJCQkJCWpRdWVyeSgnLm1vZGFsX2Nsb3NlJykudHJpZ2dlcignY2xpY2snKTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkJYWxlcnQoIGRhdGEgKTsKCQkJCQkJLy9qUXVlcnkoJy5wYl9kYXRhYmFzZV9uZXh0X3Rlc3QnKS5hZGRDbGFzcyggJ2J1dHRvbl9kaXNhYmxlZCcgKTsKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCSk7CgkJCQoJCQlyZXR1cm4gZmFsc2U7CgkJfSk7CgkJCgl9KTsKPC9zY3JpcHQ+Cgo8ZGl2IGlkPSJkYXRhYmFzZS1ib3giPgoJPGRpdiBjbGFzcz0iZGF0YWJhc2UtZGVzY3JpcHRpb24iPgoJCTxwPk1hbnVhbGx5IGVudGVyIHlvdXIgZGF0YWJhc2Ugc2V0dGluZ3MgYmVsb3cgb3Igc2VsZWN0IG9uZSBvZiB0aGUgb3B0aW9ucyBiZWxvdyB0byBhc3Npc3QgeW91LiBUaGUgPGk+Y1BhbmVsIERhdGFiYXNlIFdpemFyZDwvaT4gYWxsb3dzIHlvdSB0byBlbnRlciB5b3VyIGNQYW5lbCBjcmVkZW50aWFscyB0byBjcmVhdGUgYSBkYXRhYmFzZSAmIGF1dG8tZmlsbCBpdHMgc2V0dGluZ3MgYmVsb3cuIFRoZSA8aT5jUGFuZWwgVHV0b3JpYWw8L2k+IGJ1dHRvbiBzaG93cyB5b3UgdGhlIHNpbXBsZXN0IHdheSB0byBtYW51YWxseSBjcmVhdGUgYSBkYXRhYmFzZS4gU2VlIHlvdXIgaG9zdCdzIGRvY3VtZW50YXRpb24gZm9yIG5vbi1jUGFuZWwgaG9zdGluZy4gSWYgeW91IGFyZSByZXN0b3JpbmcgYSBzaXRlIGJhY2sgdG8gaXRzIG9yaWdpbmFsIGxvY2F0aW9uIChmb3IgaW5zdGFuY2UgYWZ0ZXIgYmVpbmcgaGFja2VkKSB5b3UgbWF5IHJldGFpbiB0aGUgc2FtZSBkYXRhYmFzZSBzZXR0aW5ncyBieSBjbGlja2luZyB0aGUgYXBwcm9wcmlhdGUgImNvcHkiIGxpbmtzIGJldHdlZW4gc2V0dGluZ3MgYmVsb3cuPC9wPgoJCTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KCQkJPGJ1dHRvbiBocmVmPSIjcGJfY3JlYXRlZGJfbW9kYWwiIGNsYXNzPSJidXR0b24gYnV0dG9uLXNlY29uZGFyeSBsZWFuTW9kYWwgY3JlYXRlZGJfbW9kYWxfbGluayIgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsgbWFyZ2luLWJvdHRvbTogMTNweDsiPmNQYW5lbCBEYXRhYmFzZSBXaXphcmQ8L2J1dHRvbj4KCQkJPGJ1dHRvbiBocmVmPSIjcGJfY3BhbmVsdHV0b3JpYWxfbW9kYWwiIGNsYXNzPSJidXR0b24gYnV0dG9uLXNlY29uZGFyeSBsZWFuTW9kYWwgY3JlYXRlZGJfbW9kYWxfbGluayIgc3R5bGU9ImZvbnQtc2l6ZTogMTRweDsiPmNQYW5lbCBEYXRhYmFzZSBUdXRvcmlhbDwvYnV0dG9uPgoJCTwvZGl2PgoJCTxiciBzdHlsZT0iY2xlYXI6IGJvdGg7Ij4KCTwvZGl2PgoJCgkKCQoJPGhyPgoJCgkKCTxmb3JtIGFjdGlvbj0iP2FqYXg9NCIgdGFyZ2V0PSJtaW5pRnJhbWUiIG1ldGhvZD0icG9zdCIgY2xhc3M9ImRiX3NldHRpbmciICBpZD0iYmFja3VwYnVkZHktZGJTZXR0aW5nc0Zvcm0iPjwhLS0gdGhpcyBmb3JtIGlzIG9ubHkgc3VibWl0dGVkIGFmdGVyIHJ1bm5pbmcgdGhyb3VnaCBqYXZhc2NyaXB0LiBzdWJtaXR0aW5nIGFjdHVhbCBmb3JtIGluc3RlYWQgb2YgdXNpbmcgalF1ZXJ5IHBvc3Qgc28gd2UgY2FuIHRhcmdldCBpZnJhbWUuIC0tPgoJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc3RvcmVEYXRhIiB2YWx1ZT0iIiBpZD0iYmFja3VwYnVkZHktZGJTZXR0aW5nc0Zvcm0tcmVzdG9yZURhdGEiPjwhLS0gdGhpcyBpcyB0aGUgb25seSB0aGluZyB0aGF0IHdpbGwgbmVlZCBwYXJzZWQgYnkgUEhQIG9uIHRoZSByZWNlaXZpbmcgZW5kLiBwb3B1bGF0ZWQgb24gc3VibWl0IGFmdGVyIGRiIHRlc3QgcGFzc2VzLiAtLT4KCQkKCQkKCQk8dGFibGUgY2xhc3M9InNldHRpbmdzVGFibGUiPgoJCQkKCQkJPHRyPjx0aCBzdHlsZT0id2lkdGg6IDMwJTsiPiZuYnNwOzwvdGg+PHRoIHN0eWxlPSJ3aWR0aDogMzAlOyI+T2xkIERhdGFiYXNlPC90aD4KCQkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkgc2V0dGluZ0NvcHlBbGwiIHdpZHRoPSIxMCUiIHN0eWxlPSJwYWRkaW5nOiAxMHB4OyI+CgkJCQkJPGEgaHJlZj0iIyIgdGl0bGU9IkNsaWNrIHRvIGNvcHkgYWxsIG9sZCBkYXRhYmFzZSBzZXR0aW5ncyBvdmVyLiI+JnJhcnI7PC9hPgoJCQkJPC90ZD48dGggc3R5bGU9IndpZHRoOiAzMCU7Ij5OZXcgRGF0YWJhc2U8L3RoPjwvdHI+CgkJCQoJCQk8dHI+PCEtLSBNWVNRTCBTRVJWRVIgLS0+CgkJCQk8dGQ+CgkJCQkJRGF0YWJhc2UgU2VydmVyIDxzcGFuIGNsYXNzPSJsaWdodCI+KE15U1FMKTwvc3Bhbj4gPCU9IHRpcCggJ1RoaXMgaXMgdGhlIGFkZHJlc3MgdG8gdGhlIG15U1FMIHNlcnZlciB3aGVyZSB5b3VyIGRhdGFiYXNlIHdpbGwgYmUgc3RvcmVkLiA5OSUgb2YgdGhlIHRpbWUgdGhpcyBpcyBsb2NhbGhvc3QuICBUaGUgbG9jYXRpb24gb2YgeW91ciBteVNRTCBzZXJ2ZXIgd2lsbCBiZSBwcm92aWRlZCB0byB5b3UgYnkgeW91ciBob3N0IGlmIGl0IGRpZmZlcnMuJyApICU+CgkJCQk8L3RkPgoJCQkJPHRkPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyBvbGRfc2V0dGluZyIgdHlwZT0idGV4dCIgdmFsdWU9IjwlPSBkYXQuZGJfc2VydmVyICU+IiBESVNBQkxFRD4KCQkJCTwvdGQ+CgkJCQk8dGQgY2xhc3M9InNldHRpbmdDb3B5Ij4KCQkJCQk8YSBocmVmPSIjIiB0aXRsZT0iQ2xpY2sgdG8gY29weSBvbGQgc2V0dGluZyBvdmVyLiI+JnJhcnI7PC9hPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9InRleHQiIGlkPSJteXNxbF9zZXJ2ZXIiIHZhbHVlPSIiIHRhYmluZGV4PSIxIj4KCQkJCTwvdGQ+CgkJCTwvdHI+CgkJCQoJCQk8dHI+PCEtLSBEQVRBQkFTRSBOQU1FIC0tPgoJCQkJPHRkPgoJCQkJCURhdGFiYXNlIE5hbWUgPCU9IHRpcCggJ1RoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHlvdSB3YW50IHRvIGltcG9ydCB5b3VyIGJsb2cgaW50by4gVGhlIGRhdGFiYXNlIHVzZXIgbXVzdCBoYXZlIHBlcm1pc3Npb25zIHRvIGJlIGFibGUgdG8gYWNjZXNzIHRoaXMgZGF0YWJhc2UuICBJZiB5b3UgYXJlIG1pZ3JhdGluZyB0aGlzIGJsb2cgdG8gYSBuZXcgaG9zdCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSB0aGlzIGRhdGFiYXNlIChpZSB1c2luZyBDUGFuZWwgb3IgcGhwbXlhZG1pbikgYW5kIGNyZWF0ZSBhIG15c3FsIGRhdGFiYXNlIHVzZXIgd2l0aCBwZXJtaXNzaW9ucy4nICkgJT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIG9sZF9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9IGRhdC5kYl9uYW1lICU+IiBESVNBQkxFRD4KCQkJCTwvdGQ+CgkJCQk8dGQgY2xhc3M9InNldHRpbmdDb3B5Ij4KCQkJCQk8YSBocmVmPSIjIiB0aXRsZT0iQ2xpY2sgdG8gY29weSBvbGQgc2V0dGluZyBvdmVyLiI+JnJhcnI7PC9hPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9InRleHQiIGlkPSJteXNxbF9kYXRhYmFzZSIgdmFsdWU9IiIgdGFiaW5kZXg9IjIiPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJCgkJCTx0cj48IS0tIERBVEFCQVNFIFVTRVIgLS0+CgkJCQk8dGQ+CgkJCQkJRGF0YWJhc2UgVXNlciA8JT0gdGlwKCAnVGhpcyBpcyB0aGUgZGF0YWJhc2UgdXNlciBhY2NvdW50IHRoYXQgaGFzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBkYXRhYmFzZSBuYW1lIGluIHRoZSBpbnB1dCBhYm92ZS4gIFRoaXMgdXNlciBtdXN0IGJlIGdpdmVuIHBlcm1pc3Npb24gdG8gdGhpcyBkYXRhYmFzZSBmb3IgdGhlIGltcG9ydCB0byB3b3JrLicgKSAlPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmcgb2xkX3NldHRpbmciIHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGF0LmRiX3VzZXIgJT4iIERJU0FCTEVEPgoJCQkJPC90ZD4KCQkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiPgoJCQkJCTxhIGhyZWY9IiMiIHRpdGxlPSJDbGljayB0byBjb3B5IG9sZCBzZXR0aW5nIG92ZXIuIj4mcmFycjs8L2E+CgkJCQk8L3RkPgoJCQkJPHRkPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyIgdHlwZT0idGV4dCIgaWQ9Im15c3FsX3VzZXJuYW1lIiB2YWx1ZT0iIiB0YWJpbmRleD0iMyI+CgkJCQk8L3RkPgoJCQk8L3RyPgoJCQkKCQkJPHRyPjwhLS0gREFUQUJBU0UgUEFTUyAtLT4KCQkJCTx0ZD4KCQkJCQlEYXRhYmFzZSBQYXNzd29yZCA8JT0gdGlwKCAnVGhpcyBpcyB0aGUgcGFzc3dvcmQgZm9yIHRoZSBkYXRhYmFzZSB1c2VyLicgKSAlPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmcgb2xkX3NldHRpbmciIHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGF0LmRiX3Bhc3N3b3JkICU+IiBESVNBQkxFRD4KCQkJCTwvdGQ+CgkJCQk8dGQgY2xhc3M9InNldHRpbmdDb3B5Ij4KCQkJCQk8YSBocmVmPSIjIiB0aXRsZT0iQ2xpY2sgdG8gY29weSBvbGQgc2V0dGluZyBvdmVyLiI+JnJhcnI7PC9hPgoJCQkJPC90ZD4KCQkJCTx0ZD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9InRleHQiIGlkPSJteXNxbF9wYXNzd29yZCIgdmFsdWU9IiIgdGFiaW5kZXg9IjQiPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJCgkJCTx0cj48IS0tIERBVEFCQVNFIFBSRUZJWCAtLT4KCQkJCTx0ZD4KCQkJCQlEYXRhYmFzZSBQcmVmaXggPCU9IHRpcCggJ1RoaXMgaXMgdGhlIHByZWZpeCBnaXZlbiB0byBhbGwgdGFibGVzIGluIHRoZSBkYXRhYmFzZS4gIElmIHlvdSBhcmUgY2xvbmluZyB0aGUgc2l0ZSBvbiB0aGUgc2FtZSBzZXJ2ZXIgQU5EIHRoZSBzYW1lIGRhdGFiYXNlIG5hbWUgdGhlbiB5b3Ugd2lsbCB3YW50IHRvIGNoYW5nZSB0aGlzIG9yIGVsc2UgdGhlIGltcG9ydGVkIGRhdGFiYXNlIHdpbGwgb3ZlcndyaXRlIHRoZSBleGlzdGluZyB0YWJsZXMuIFRoaXMgc2hvdWxkIE5PVCBpbmNsdWRlIG1vcmUgdGhhbiBvbmUgdW5kZXJzY29yZS4gRXhhbXBsZSAxOiB3cF8sIEV4YW1wbGUgMjogd3A0XywgRXhhbXBsZSAzOiBkdXN0aW5zYmxvZ18nICkgJT4KCQkJCTwvdGQ+CgkJCQk8dGQ+CgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIG9sZF9zZXR0aW5nIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9IGRhdC5kYl9wcmVmaXggJT4iIERJU0FCTEVEPgoJCQkJPC90ZD4KCQkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiPgoJCQkJCTxhIGhyZWY9IiMiIHRpdGxlPSJDbGljayB0byBjb3B5IG9sZCBzZXR0aW5nIG92ZXIuIj4mcmFycjs8L2E+CgkJCQk8L3RkPgoJCQkJPHRkPgoJCQkJCTxpbnB1dCBjbGFzcz0iZGJfc2V0dGluZyIgdHlwZT0idGV4dCIgaWQ9Im15c3FsX3ByZWZpeCIgdmFsdWU9IiIgdGFiaW5kZXg9IjUiPgoJCQkJPC90ZD4KCQkJPC90cj4KCQkJCgkJPC90YWJsZT4KCQkKCQkKCQkKCQk8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAzNXB4OyBtYXJnaW4tYm90dG9tOiAzNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KCQkJPGRpdiBpZD0iZGJfdGVzdF9jb250YWluZXIiIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAyNXB4OyBwYWRkaW5nOiAyNXB4OyB0ZXh0LWFsaWduOiBsZWZ0OyIgY2xhc3M9InJvdW5kLXdyYXAiPgoJCQk8L2Rpdj4KCgoJCQk8JSBpZiAoIGZhbHNlID09PSByZXN0b3JlRGF0YWJhc2UgKSB7ICU+CgkJCQk8ZGl2PgoJCQkJCURhdGFiYXNlIHdpbGwgPGI+bm90PC9iPiBiZSByZXN0b3JlZCBmcm9tIHRoZSBiYWNrdXAgYmFzZWQgb24geW91ciBzZWxlY3Rpb24gb24gU3RlcCAxLgoJCQkJPC9kaXY+CgkJCTwlIH0gJT4KCQoJCQk8ZGl2IGlkPSJkYl93aXBlX29wdGlvbnMiIHN0eWxlPSI8JSBpZiAoIGZhbHNlID09PSByZXN0b3JlRGF0YWJhc2UgKSB7ICU+IGRpc3BsYXk6IG5vbmU7IDwlIH0gJT4iPgoJCQkJPGI+RGVsZXRlIGV4aXN0aW5nIGRhdGFiYXNlIHRhYmxlcz88L2I+CgkJCQkmbmJzcDsmbmJzcDsKCQkJCTxsYWJlbD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0id2lwZV9wcmVmaXgiIGlkPSJ3aXBlX3ByZWZpeCI+CgkJCQkJTWF0Y2hpbmcgUHJlZml4IDwlPSB0aXAoICdXaGVuIHNlbGVjdGVkIEltcG9ydEJ1ZGR5IHdpbGwgZmlyc3QgZGVsZXRlIGFueSBhbmQgYWxsIGRhdGFiYXNlcyB0YWJsZXMgb24gdGhlIG5ldyBzZXJ2ZXIgdGhhdCBiZWdpbiB3aXRoIHRoZSBuZXcgcHJlZml4LiBGb3IgZXhhbXBsZSwgaWYgeW91ciBuZXcgZGF0YWJhc2UgcHJlZml4IGFib3ZlIGlzIHdwXywgYW55IHRhYmxlIG9uIHRoZSBuZXcgc2VydmVyIHN0YXJ0aW5nIHdpdGggd3BfIGluIHRoZSBuYW1lIHN1Y2ggYXMgd3Bfb3B0aW9ucywgd3BfcG9zdHMsIHdwXy4qLCB3aWxsIGJlIGRyb3BwZWQgLyBkZWxldGVkLiBUaGUgb2xkIGRhdGFiYXNlIHNlcnZlciBpcyBuZXZlciBtb2RpZmllZCBldmVyICh1bmxlc3MgaXQgaXMgdGhlIHNhbWUgc2VydmVyIGFzIHRoZSBuZXcgc2VydmVyKS4nICkgJT4KCQkJCTwvbGFiZWw+CgkJCQkmbmJzcDsmbmJzcDsKCQkJCTxsYWJlbD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iMSIgbmFtZT0id2lwZV9kYXRhYmFzZSIgaWQ9IndpcGVfZGF0YWJhc2UiIG9uQ2xpY2s9ImpRdWVyeSh0aGlzKS5jbG9zZXN0KCdsYWJlbCcpLmZpbmQoJ3NwYW4nKS50b2dnbGUoKTsiPgoJCQkJCURlbGV0ZSBBbGwgPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+VXNlIENhdXRpb248L3NwYW4+CgkJCQk8L2xhYmVsPgoJCQk8L2Rpdj4KCQoJCQk8ZGl2IGlkPSJpZ25vcmVfcHJlZml4X3dhcm5pbmdzIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCQkJPGI+SWdub3JlIHByZWZpeCB3YXJuaW5ncz88L2I+CgkJCQkmbmJzcDsmbmJzcDsKCQkJCTxsYWJlbD4KCQkJCQk8aW5wdXQgY2xhc3M9ImRiX3NldHRpbmciIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJpZ25vcmVfZGJ0ZXN0X3dhcm5pbmdzIiBpZD0iaWdub3JlX3ByZWZpeF93YXJuaW5nc19jaGVja2JveCIgdmFsdWU9IjEiPgoJCQkJCVllcywgcHJvY2VlZCB3aXRoIHRoaXMgcHJlZml4LgoJCQkJPC9sYWJlbD4KCQkJPC9kaXY+CgkKCQoJCgkKCQoJCTwvZGl2PjwhLS0gL3dyYXAgLS0+CgkJCgkJPGRpdiBjbGFzcz0ibWFpbl9ib3hfZm9vdCI+CgkJCTxicj4KCQkJPGNlbnRlcj4KCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Im5leHRTdGVwIiB2YWx1ZT0iTmV4dCBTdGVwIiBjbGFzcz0iaXQtYnV0dG9uIHBiX2RhdGFiYXNlX25leHRfdGVzdCI+CgkJCQk8YnV0dG9uIGhyZWY9IiNwYl9hZHZhbmNlZF9tb2RhbCIgY2xhc3M9Iml0LWJ1dHRvbiBpdC1zZWNvbmRhcnkgbGVhbk1vZGFsIGNyZWF0ZWRiX21vZGFsX2xpbmsiPkFkdmFuY2VkIE9wdGlvbnM8L2J1dHRvbj4KCQkJPC9jZW50ZXI+CgkJCQoJCTwvZGl2PgoJCgkKCQoJCgkJPGRpdiBpZD0icGJfYWR2YW5jZWRfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQkJCTxkaXYgY2xhc3M9Im1vZGFsX2hlYWRlciI+CgkJCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQkJCTxoMj5BZHZhbmNlZCBPcHRpb25zPC9oMj4KCQkJCQlFeGVyY2lzZSBjYXV0aW9uIHVzaW5nIGFkdmFuY2VkIG9wdGlvbnMuIEFkZGl0aW9uYWwgb3B0aW9ucyBhdmFpbGFibGUgb24gc3Vic2VxdWVudCBzdGVwcy4KCQkJCTwvZGl2PgoJCQkJPGRpdiBjbGFzcz0ibW9kYWxfY29udGVudCI+CgkJCQkJCgkJCQkJPGxhYmVsPkRhdGFiYXNlIE1ldGhvZCBTdHJhdGVneTogPC9sYWJlbD4KCQkJCQk8c2VsZWN0IG5hbWU9ImRhdGFiYXNlTWV0aG9kU3RyYXRlZ3kiIGlkPSJkYXRhYmFzZU1ldGhvZFN0cmF0ZWd5Ij4KCQkJCQkJPG9wdGlvbiB2YWx1ZT0icGhwIiBTRUxFQ1RFRD5QSFAtYmFzZWQ6IFN1cHBvcnRzIGF1dG9tYXRlZCBjaHVua2VkIHJlc3VtaW5nIC0gZGVmYXVsdDwvb3B0aW9uPgoJCQkJCQk8b3B0aW9uIHZhbHVlPSJjb21tYW5kbGluZSI+Q29tbWFuZGxpbmU6IEZhc3QgYnV0IGRvZXMgbm90IHN1cHBvcnQgcmVzdW1pbmc8L29wdGlvbj4KCQkJCQkJPG9wdGlvbiB2YWx1ZT0iYWxsIj5BbGwgQXZhaWxhYmxlOiAoIFBIUCBbY2h1bmtpbmddID4gQ29tbWFuZGxpbmUgdmlhIGV4ZWMoKSAgKTwvb3B0aW9uPgoJCQkJCTwvc2VsZWN0PgoJCQkJCQkKCQkJCQk8YnI+CgkJCQkJCgkJCQkJPGlucHV0IGNsYXNzPSJkYl9zZXR0aW5nIiB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIGlkPSJpZ25vcmVfc3FsX2Vycm9ycyIgbmFtZT0iaWdub3JlX3NxbF9lcnJvcnMiPiBJZ25vcmUgU1FMIGVycm9ycyAmIGV4aXN0aW5nIFdvcmRQcmVzcyB0YWJsZXMuIDwlPSB0aXAoICdXaGVuIGNoZWNrZWQgSW1wb3J0QnVkZHkgd2lsbCBhbGxvdyBpbXBvcnRpbmcgZGF0YWJhc2UgdGFibGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIGV4aXN0aW5nIHRhYmxlcy4gVGhpcyByZXN1bHRzIGluIGEgbWVyZ2Ugb2YgdGhlIGV4aXN0aW5nIGRhdGEgd2l0aCB0aGUgaW1wb3J0ZWQgZGF0YWJhc2UgYmVpbmcgbWVyZ2VkLiBOb3RlIHRoYXQgdGhpcyBpcyBkb2VzIE5PVCB1cGRhdGUgZXhpc3RpbmcgZGF0YSBhbmQgb25seSBBRERTIG5ldyBkYXRhYmFzZSB0YWJsZSByb3dzLiBBbGwgb3RoZXIgU1FMIGNvbmZsaWN0IGVycm9ycyB3aWxsIGJlIHN1cHByZXNzZWQgYXMgd2VsbC4gVXNlIHRoaXMgZmVhdHVyZSB3aXRoIGNhdXRpb24uJyApICU+PGJyPgoJCQkJCU1heGltdW0gdGltZSBwZXIgY2h1bmsgd2hlbiBpbnRlcmFjdGluZyB3aXRoIGRhdGFiYXNlOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibWF4X2V4ZWN1dGlvbl90aW1lIiBpZD0ibWF4X2V4ZWN1dGlvbl90aW1lIiB2YWx1ZT0iPCU9IG1heEV4ZWN1dGlvblRpbWUgJT4iIHNpemU9IjUiPiBzZWNvbmRzLiA8JT0gdGlwKCAnVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgSW1wb3J0QnVkZHkgc2hvdWxkIGFsbG93IGEgZGF0YWJhc2UgaW1wb3J0IGNodW5rIHRvIHJ1bi4gSW1wb3J0QnVkZHkgYnkgZGVmYXVsdCBsaW1pdHMgZWFjaCBjaHVuayB0byB5b3VyIE1heGltdW0gUEhQIHJ1bnRpbWUuIElmIHlvdXIgZGF0YWJhc2UgaW1wb3J0IHN0ZXAgaXMgdGltaW5nIG91dCB0aGVuIGxvd2VyaW5nIHRoaXMgdmFsdWUgd2lsbCBpbnN0cnVjdCB0aGUgc2NyaXB0IHRvIGxpbWl0IGVhY2ggYGNodW5rYCB0byBhbGxvdyBpdCB0byBmaW5pc2ggd2l0aGluIHRoaXMgdGltZSBwZXJpb2QuIFJhaXNpbmcgdGhpcyB2YWx1ZSBhYm92ZSB5b3VyIHNlcnZlcnMgbGltaXRzIHdpbGwgbm90IGluY3JlYXNlIG9yIG92ZXJyaWRlIHNlcnZlciBzZXR0aW5ncy4nICkgJT4KCQkJCQkKCQkJCQk8YnI+CgkJCQkJCgkJCQkJPGxhYmVsPkRhdGFiYXNlIGZpbGVzIHRvIHJlc3RvcmU6IDwvbGFiZWw+CgkJCQkJPGRpdiBjbGFzcz0iZGF0YWJhc2VfcmVzdG9yZV90YWJsZV9zZWxlY3QiPgoJCQkJCQk8JQoJCQkJCQlkYXRhYmFzZVNldHRpbmdzLnNxbEZpbGVzLmZvckVhY2goZnVuY3Rpb24oZWwsIGluZGV4KSB7CgkJCQkJCQklPgoJCQkJCQkJPGxhYmVsPjxpbnB1dCBjbGFzcz0iZGF0YWJhc2VGaWxlIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iZGF0YWJhc2VGaWxlc1tdIiB2YWx1ZT0iPCU9IGVsICU+IiBDSEVDS0VEPiA8JT0gZWwgJT48L2xhYmVsPjxicj4KCQkJCQkJCTwlCgkJCQkJCX0pOwoJCQkJCQklPgoJCQkJCTwvZGl2PgoJCQkJCQoJCQkJPC9kaXY+CgkJCTwvZGl2PgoJCTwvZGl2PgoJCgkKCQoJPC9mb3JtPgoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgkKCQoJCgk8ZGl2IGlkPSJwYl9jcmVhdGVkYl9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJCTxkaXYgY2xhc3M9Im1vZGFsX2hlYWRlciI+CgkJCQk8YSBjbGFzcz0ibW9kYWxfY2xvc2UiPiZ0aW1lczs8L2E+CgkJCQk8aDI+Y1BhbmVsIERhdGFiYXNlIFdpemFyZDwvaDI+CgkJCQlRdWlja2x5IGNyZWF0ZSBhIG5ldyBjUGFuZWwgZGF0YWJhc2UgcmlnaHQgaGVyZS4KCQkJPC9kaXY+CgkJCTxkaXYgY2xhc3M9Im1vZGFsX2NvbnRlbnQiPgoJCQkJCgkJCQk8Zm9ybSBpZD0iY3BhbmVsX2NyZWF0ZWRiX2Zvcm0iPgoJCQkJCQoJCQkJCTx0YWJsZSB3aWR0aD0iMTAwJSI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD4KCQkJCQkJCQljUGFuZWwgTG9naW4gVVJMCgkJCQkJCQkJPCU9IHRpcCggJ1tFeDogbXlkb21haW4uY29tXSBFbnRlciB0aGUgY1BhbmVsIGRvbWFpbiB0byBjb21wbGV0ZSB0aGUgVVJMIHlvdSBnbyB0byB0byBhY2Nlc3MgY1BhbmVsLiAgRm9yIGluc3RhbmNlIGlmIHlvdXIgY1BhbmVsIGxvZ2luIGlzIGF0IGh0dHA6Ly9teWRvbWFpbi5jb206MjA4Mi8gdGhlbiB5b3VyIGRvbWFpbiBpcyBteWRvbWFpbi5jb20uJyApICU+CgkJCQkJCQk8L3RkPgoJCQkJCQkJPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPgoJCQkJCQkJCWh0dHA6Ly88aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY3BhbmVsX3VybCIgaWQ9ImNwYW5lbF91cmwiIHN0eWxlPSJ3aWR0aDogMTg2cHg7Ij46PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNwYW5lbF9wb3J0IiBpZD0iY3BhbmVsX3BvcnQiIHN0eWxlPSJ3aWR0aDogNjJweDsiIHZhbHVlPSIyMDgyIj4vCgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJY1BhbmVsIHVzZXJuYW1lCgkJCQkJCQkJPCU9IHRpcCggJ1tFeDogYnVkZHldIFRoaXMgaXMgdGhlIHVzZXJuYW1lIHlvdSB1c2UgdG8gbG9nIGludG8geW91ciBjUGFuZWwuJyApICU+CgkJCQkJCQk8L3RkPgoJCQkJCQkJPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodDsiPgoJCQkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjcGFuZWxfdXNlciIgY2xhc3M9ImNwYW5lbF91c2VyIiBpZD0iY3BhbmVsX3VzZXIiIHN0eWxlPSJ3aWR0aDogMjY1cHg7Ij4KCQkJCQkJCTwvdGQ+CgkJCQkJCTwvdHI+CgkJCQkJCTx0cj4KCQkJCQkJCTx0ZD4KCQkJCQkJCQljUGFuZWwgcGFzc3dvcmQKCQkJCQkJCQk8JT0gdGlwKCAnW0V4OiBpNDk4aERzaWZINDg3aHNTXSBUaGlzIGlzIHRoZSBwYXNzd29yZCB5b3UgdXNlIHRvIGxvZyBpbnRvIHlvdXIgY1BhbmVsLicgKSAlPgoJCQkJCQkJPC90ZD4KCQkJCQkJCTx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4KCQkJCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY3BhbmVsX3Bhc3MiIGlkPSJjcGFuZWxfcGFzcyIgc3R5bGU9IndpZHRoOiAyNjVweDsiIC8+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQgY29sc3Bhbj0iMiI+CgkJCQkJCQkJPGhyIHN0eWxlPSJtYXJnaW46IDhweDsiPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQkJPHRyPgoJCQkJCQkJPHRkPgoJCQkJCQkJCU5ldyBkYXRhYmFzZSBuYW1lCgkJCQkJCQkJPCU9IHRpcCggJ1tFeDogYm9ic2Jsb2ddIFRoZSBkYXRhYmFzZSBuYW1lIHlvdSB3YW50IHRvIGNyZWF0ZS4gTm90ZTogY1BhbmVsIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgZGF0YWJhc2VzIHdpdGggdGhlIGNQYW5lbCBhY2NvdW50IHVzZXJuYW1lIGFuZCBhbiB1bmRlcnNjb3JlLiBleCBpZiB5b3VyIGNQYW5lbCB1c2VybmFtZSBpcyAiYnVkZHkiOiBidWRkeV9ib2JzYmxvZycgKSAlPgoJCQkJCQkJPC90ZD4KCQkJCQkJCTx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4KCQkJCQkJCQk8c3BhbiBjbGFzcz0iY3BhbmVsX3VzZXJfbWlycm9yIj48L3NwYW4+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImNwYW5lbF9kYm5hbWUiIGlkPSJjcGFuZWxfZGJuYW1lIiBzdHlsZT0id2lkdGg6IDI2NXB4OyIgbWF4bGVuZ3RoPSI1NiI+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJTmV3IGRhdGFiYXNlIHVzZXJuYW1lCgkJCQkJCQkJPCU9IHRpcCggJ1tFeDogYm9iXSBUaGUgdXNlcm5hbWUgeW91IHdhbnQgdG8gYWRkIHRvIGdyYW50IGFjY2VzcyB0byB0aGlzIGRhdGFiYXNlIHlvdSB3YW50IHRvIGNyZWF0ZS4gTm90ZTogY1BhbmVsIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgZGF0YWJhc2UgdXNlcm5hbWVzIHdpdGggdGhlIGNQYW5lbCBhY2NvdW50IHVzZXJuYW1lIGFuZCBhbiB1bmRlcnNjb3JlLiBleCBpZiB5b3VyIGNQYW5lbCB1c2VybmFtZSBpcyAiYnVkZHkiOiBidWRkeV9ib2InICkgJT4KCQkJCQkJCTwvdGQ+CgkJCQkJCQk8dGQgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyI+CgkJCQkJCQkJPHNwYW4gY2xhc3M9ImNwYW5lbF91c2VyX21pcnJvciI+PC9zcGFuPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjcGFuZWxfZGJ1c2VyIiBpZD0iY3BhbmVsX2RidXNlciIgc3R5bGU9IndpZHRoOiAyNjVweDsiIG1heGxlbmd0aD0iNyI+CgkJCQkJCQk8L3RkPgoJCQkJCQk8L3RyPgoJCQkJCQk8dHI+CgkJCQkJCQk8dGQ+CgkJCQkJCQkJTmV3IGRhdGFiYXNlIHVzZXIgcGFzc3dvcmQKCQkJCQkJCQk8JT0gdGlwKCAnVGhlIHBhc3N3b3JkIHlvdSB3b3VsZCBsaWtlIHRvIGFzc2lnbiB0byB0aGUgZGF0YWJhc2UgdXNlciBjcmVhdGVkLicgKSAlPgoJCQkJCQkJPC90ZD4KCQkJCQkJCTx0ZCBzdHlsZT0idGV4dC1hbGlnbjogcmlnaHQ7Ij4KCQkJCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iY3BhbmVsX2RicGFzcyIgaWQ9ImNwYW5lbF9kYnBhc3MiIHN0eWxlPSJ3aWR0aDogMjY1cHg7IiB2YWx1ZT0iPCU9IHJhbmRvbVN0cmluZygxNiwgJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJykgJT4iPgoJCQkJCQkJPC90ZD4KCQkJCQkJPC90cj4KCQkJCQk8L3RhYmxlPgoJCQkJCTxicj48YnI+CgkJCQkJPGNlbnRlcj4KCQkJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0IiB2YWx1ZT0iQ3JlYXRlIERhdGFiYXNlIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IGNwYW5lbF9jcmVhdGVkYl9jcmVhdGUiPgoJCQkJCTwvY2VudGVyPgoJCgkJCQk8L2Zvcm0+CgkJCTwvZGl2PgoJCgkJPC9kaXY+Cgk8L2Rpdj4KCQoJCgk8ZGl2IGlkPSJwYl9jcGFuZWx0dXRvcmlhbF9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJCTxkaXYgY2xhc3M9Im1vZGFsX2hlYWRlciI+CgkJCQk8YSBjbGFzcz0ibW9kYWxfY2xvc2UiPiZ0aW1lczs8L2E+CgkJCQk8aDI+Y1BhbmVsIERhdGFiYXNlIFR1dG9yaWFsPC9oMj4KCQkJCUxlYXJuIGhvdyB0byBxdWlja2x5IGNyZWF0ZSB5b3VyIG93biBjUGFuZWwgZGF0YWJhc2UuCgkJCTwvZGl2PgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQoJCQkJPG9sPgoJCQkJCTxsaT5JbiBjUGFuZWwsIHNlbGVjdCA8Yj5NeVNRTCBEYXRhYmFzZSBXaXphcmQ8L2I+IGZyb20gdGhlIDxpPkRhdGFiYXNlczwvaT4gc2VjdGlvbi4gTmV4dCBzdGVwLjwvbGk+CgkJCQkJPGxpPkVudGVyIGEgPGk+bmFtZTwvaT4gZm9yIHRoZSBuZXcgZGF0YWJhc2UgeW91IHdpc2ggdG8gY3JlYXRlLiBOZXh0IHN0ZXAuPC9saT4KCQkJCQk8bGk+RW50ZXIgYSA8aT51c2VybmFtZTwvaT4gYW5kIDxpPnBhc3N3b3JkPC9pPiB0byBjcmVhdGUgdGhlIGRhdGFiYXNlIHVzZXIuIE5leHQgc3RlcC48L2xpPgoJCQkJCTxsaT5TZWxlY3QgPGI+QWxsIFByaXZpbGVnZXM8L2I+IHRvIHNldCBwZXJtaXNzaW9ucyB0aGUgdXNlciBoYXMgdG8gdGhlIGRhdGFiYXNlLiBEb25lLjwvbGk+CgkJCQkJPGxpPkJhY2sgaW4gSW1wb3J0QnVkZHksIGVudGVyIHRob3NlIHNhbWUgZGF0YWJhc2Ugc2V0dGluZ3MgZm9yIHRoZSA8aT5OZXcgRGF0YWJhc2U8L2k+LjwvbGk+CgkJCQk8L29sPgoJCQkJPGJyPgoJCgkJCQk8ZGl2IG9uQ2xpY2s9ImpRdWVyeSh0aGlzKS5odG1sKCBuZXcgRUpTKHt1cmw6ICdpbXBvcnRidWRkeS92aWV3cy9jcGFuZWxUdXRvcmlhbC5lanMnfSkucmVuZGVyKCkgKTsiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IGN1cnNvcjogcG9pbnRlcjsiPjxoMj5DbGljayB0byBkaXNwbGF5IDMwLXNlY29uZCB0dXRvcmlhbCB2aWRlby48L2gyPjwvZGl2PgoJCgkJCTwvZGl2PgoJCTwvZGl2PgoJPC9kaXY+Cgo8L2Rpdj4KCjwhLS0gLS0+CjxkaXYgaWQ9ImRhdGFiYXNlLWJveC13b3JraW5nIj4KPC9kaXY+
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/databaseSettings.ejs,importbuddy/views/databaseSettings.ejs
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/dbreplace.php,importbuddy/views/dbreplace.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgokcGFnZV90aXRsZSA9ICdEYXRhYmFzZSBUZXh0IFJlcGxhY2UgVG9vbCc7CnJlcXVpcmVfb25jZSggJ19oZWFkZXIucGhwJyApOwo/PgoKPGRpdiBjbGFzcz0id3JhcCI+Cjw/cGhwCiRjb25maWdGaWxlID0gJyc7CmlmICggISBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyApICkgeyAvLyBOb3JtYWwgY29uZmlnIGZpbGUgbm90IGZvdW5kIHNvIHdhcm4gb3Igc2VlIGlmIHBhcmVudCBjb25maWcgbWF5IGV4aXN0LgoJJHBhcmVudENvbmZpZ01lc3NhZ2UgPSAnJzsKCSRwYXJlbnRDb25maWcgPSAgZGlybmFtZSggQUJTUEFUSCApIC4gJy93cC1jb25maWcucGhwJzsKCWlmICggQGZpbGVfZXhpc3RzKCAkcGFyZW50Q29uZmlnICkgKSB7IC8vIFBhcmVudCBjb25maWcgZXhpc3RzIHNvIG9mZmVyIGl0IGFzIGFuIG9wdGlvbiBvciBwb3NzaWJseSB1c2UgaXQgaWYgdXNlciBoYXMgc2VsZWN0ZWQgdG8gZG8gc28uCgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3BhcmVudF9jb25maWcnICkgPT0gJ3RydWUnICkgeyAvLyBVc2VyIG9wdGVkIHRvIHVzZSBwYXJlbnQgY29uZmlnLgoJCQkkY29uZmlnRmlsZSA9ICRwYXJlbnRDb25maWc7CgkJfSBlbHNlIHsgLy8gVXNlciBoYXMgbm90IG9wdGVkIHRvIHVzZSBwYXJlbnQgY29uZmlnIHlldCBzbyBzZXQgbWVzc2FnZSB0byBvZmZlciBpdC4KCQkJJHBhcmVudENvbmZpZ01lc3NhZ2UgPSAnPGJyPjxicj48Yj5Ib3dldmVyPC9iPiwgYSB3cC1jb25maWcucGhwIGZpbGUgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGFzIGAnIC4gJHBhcmVudENvbmZpZyAuICdgLiA8YSBocmVmPSI/cGFnZT1kYnJlcGxhY2UmcGFyZW50X2NvbmZpZz10cnVlIj48Yj5DbGljayBoZXJlPC9iPjwvYT4gaWYgeW91IHdvdWxkIGxpa2UgdG8gcnVuIHRoaXMgdG9vbCB1c2luZyB0aGlzIHdwLWNvbmZpZy5waHAgZmlsZSBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4nOwoJCX0KCX0KCWlmICggJycgPT0gJGNvbmZpZ0ZpbGUgKSB7CgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnPGI+RXJyb3I6PC9iPiBUaGlzIHRvb2wgcmVxdWlyZXMgYW4gZXhpc3RpbmcgV29yZFByZXNzIGluc3RhbGxhdGlvbiB0byBwZXJmb3JtIGRhdGFiYXNlIHJlcGxhY2VtZW50cyBvbi4gTm8gV29yZFByZXNzIHdwLWNvbmZpZy5waHAgY29uZmlndXJhdGlvbiBmaWxlIHdhcyBmb3VuZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaW1wb3J0YnVkZHkucGhwLiAnIC4gJHBhcmVudENvbmZpZ01lc3NhZ2UgLiAnIDxicj48YnI+IDxiPk5vdGU6PC9iPiBJbXBvcnRCdWRkeSBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgbWlncmF0aW5nICYgcmVwbGFjaW5nIHlvdXIgc2l0ZSBVUkxzIGFuZCBmaWxlIHBhdGhzIGR1cmluZyByZXN0b3JlL21pZ3JhdGlvbjsgdGhpcyB0b29sIGlzIG5vdCBuZWVkZWQgZm9yIG5vcm1hbCBiYWNrdXAgLyByZXN0b3JlIG9wZXJhdGlvbnMuJywgdHJ1ZSApOwoJfQp9IGVsc2UgeyAvLyBVc2Ugbm9ybWFsIGNvbmZpZyBmaWxlLgoJJGNvbmZpZ0ZpbGUgPSBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnOwp9CgppZiAoICcnICE9ICRjb25maWdGaWxlICkgewoJCgkvLyBSZWFkIGluIHdwLWNvbmZpZy5waHAgZmlsZSBjb250ZW50cy4KCSRjb25maWdDb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCAkY29uZmlnRmlsZSApOwoJaWYgKCBmYWxzZSA9PT0gJGNvbmZpZ0NvbnRlbnRzICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yOiBVbmFibGUgdG8gcmVhZCB3cC1jb25maWcucGhwIGNvbmZpZ3VyYXRpb24gZmlsZS4nICk7CgkJcmV0dXJuOwoJfQoJCgkvLyBHcmFiIGRhdGFiYXNlIHNldHRpbmdzIGZyb20gd3AtY29uZmlnLnBocCBjb250ZW50cy4KCXByZWdfbWF0Y2goICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX05BTUUoXCd8IiksW1xzXSooXCd8IikoLiopKFwnfCIpW1xzXSpcKTsvaScsICRjb25maWdDb250ZW50cywgJG1hdGNoZXMgKTsKCSRkYXRhYmFzZVNldHRpbmdzWyduYW1lJ10gPSAkbWF0Y2hlc1s0XTsKCXByZWdfbWF0Y2goICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX1VTRVIoXCd8IiksW1xzXSooXCd8IikoLiopKFwnfCIpW1xzXSpcKTsvaScsICRjb25maWdDb250ZW50cywgJG1hdGNoZXMgKTsKCSRkYXRhYmFzZVNldHRpbmdzWyd1c2VybmFtZSddID0gJG1hdGNoZXNbNF07CglwcmVnX21hdGNoKCAnL2RlZmluZVwoW1xzXSooXCd8IilEQl9QQVNTV09SRChcJ3wiKSxbXHNdKihcJ3wiKSguKikoXCd8IilbXHNdKlwpOy9pJywgJGNvbmZpZ0NvbnRlbnRzLCAkbWF0Y2hlcyApOwoJJGRhdGFiYXNlU2V0dGluZ3NbJ3Bhc3N3b3JkJ10gPSAkbWF0Y2hlc1s0XTsKCXByZWdfbWF0Y2goICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX0hPU1QoXCd8IiksW1xzXSooXCd8IikoLiopKFwnfCIpW1xzXSpcKTsvaScsICRjb25maWdDb250ZW50cywgJG1hdGNoZXMgKTsKCSRkYXRhYmFzZVNldHRpbmdzWydob3N0J10gPSAkbWF0Y2hlc1s0XTsKCXByZWdfbWF0Y2goICcvXCR0YWJsZV9wcmVmaXhbXHNdKj1bXHNdKihcJ3wiKSguKikoXCd8Iik7L2knLCAkY29uZmlnQ29udGVudHMsICRtYXRjaGVzICk7CgkkZGF0YWJhc2VTZXR0aW5nc1sncHJlZml4J10gPSAkbWF0Y2hlc1syXTsKCQoJLy9wcmludF9yKCAkZGF0YWJhc2VTZXR0aW5ncyApOwoJCgkvLyBDb25uZWN0IHRvIGRhdGFiYXNlLgoJZ2xvYmFsICR3cGRiOwoJJHdwZGIgPSBuZXcgd3BkYiggJGRhdGFiYXNlU2V0dGluZ3NbJ3VzZXJuYW1lJ10sICRkYXRhYmFzZVNldHRpbmdzWydwYXNzd29yZCddLCAkZGF0YWJhc2VTZXR0aW5nc1snbmFtZSddLCAkZGF0YWJhc2VTZXR0aW5nc1snaG9zdCddICk7CglpZiAoIGZhbHNlID09PSAkd3BkYi0+ZGJoICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yICM4NTgzODM6IFVuYWJsZSB0byBjb25uZWN0IHRvIGRhdGFiYXNlIHVzaW5nIHNldHRpbmdzIGluIHdwLWNvbmZpZy5waHAuIFZlcmlmeSBjb25uZWN0aW9uIHNldHRpbmdzLicgKTsKCX0gZWxzZSB7CgkJcmVxdWlyZV9vbmNlKCAnX2RicmVwbGFjZS5waHAnICk7Cgl9Cn0KPz4KPC9kaXY+Cgo8P3BocApyZXF1aXJlX29uY2UoICdfZm9vdGVyLnBocCcgKTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/dbreplace.php,importbuddy/views/dbreplace.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/finalCleanup.ejs,importbuddy/views/finalCleanup.ejs
VGhpcyBzdGVwIGhhbmRsZXMgZGVsZXRpbmcgZmlsZXMuIEluIHJhcmUgaW5zdGFuY2VzIG9uIHNvbWUgc2VydmVycyB5b3UgbWF5IHJlY2VpdmUgZXJyb3JzIGxvYWRpbmcgZmlsZXMgb3IgYW4gdW5zdHlsZWQgcGFnZSBoZXJlIGR1ZSB0byBmaWxlcyBnZXR0aW5nIGRlbGV0aW5nIHByZW1hdHVyZWx5IGJlZm9yZSB0aGUgcGFnZSBjb21wbGV0ZXMgbG9hZGluZy4gVGhpcyBtYXkgc2FmZWx5IGJlIGlnbm9yZWQuIEl0IGlzIGNvbW1vbiB0byBub3QgYmUgYWJsZSB0byBkZWxldGUgc29tZSBmaWxlcyBkdWUgdG8gcGVybWlzc2lvbiBlcnJvcnMuIFlvdSBtYXkgbWFudWFsbHkgZGVsZXRlIHRoZW0uIDxiPmltcG9ydGJ1ZGR5LnBocDwvYj4gc2hvdWxkIGFsd2F5cyBiZSBkZWxldGVkIGFmdGVyIHJlc3RvcmUgZm9yIGJlc3Qgc2VjdXJpdHkuCgo8aDMgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPllvdXIgc2l0ZSBpcyByZWFkeSB0byBnbyBhdAo8YSBocmVmPSI8JT1ob21ldXJsJT4iIHRhcmdldD0iX25ldyI+PGI+PCU9aG9tZXVybCU+PC9iPjwvYT48YnI+PGJyPgpUaGFuayB5b3UgZm9yIGNob29zaW5nIEJhY2t1cEJ1ZGR5ITwvaDM+CgoKPC9kaXY+PC9kaXY+PGJyPjxicj48YnI+
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/finalCleanup.ejs,importbuddy/views/finalCleanup.ejs
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/finished.ejs,importbuddy/views/finished.ejs
PGgxPlJlc3RvcmUgRmluaXNoZWQuPC9oMT4KCjxoMz5Zb3VyIHNpdGUgc2hvdWxkIGJlIHJlYWR5IHRvIGdvIGF0Ojxicj48YnI+PGEgaHJlZj0iPCU9aG9tZXVybCU+IiB0YXJnZXQ9Il9uZXciPjwlPWhvbWV1cmwlPjwvYT48L2gzPjxicj4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/finished.ejs,importbuddy/views/finished.ejs
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/home.php,importbuddy/views/home.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9Cj8+CjxzY3JpcHQ+CglqUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoICdTdGVwIDE6IFNlbGVjdCBCYWNrdXAgdG8gUmVzdG9yZScgKTsKCQoJZnVuY3Rpb24gYmFja3VwUmVzdG9yZVN1Z2dlc3QoIGJhY2t1cFR5cGUgKSB7CgkJaWYgKCAnZGInID09IGJhY2t1cFR5cGUgKSB7IC8vIERCIGhhcyBubyBmaWxlcyAoZXhjZXB0IFNRTCBvZiBjb3Vyc2UpIHNvIHNraXAgcm9vdCBmaWxlIGV4dHJhY3Rpb24uCgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVGaWxlcyJdJyApLnByb3AoICdjaGVja2VkJywgZmFsc2UgKS5hdHRyKCAnZGlzYWJsZWQnLCB0cnVlICk7CgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVEYXRhYmFzZSJdJyApLnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmF0dHIoICdkaXNhYmxlZCcsIGZhbHNlICk7CgkJfSBlbHNlIGlmICggJ2ZpbGVzJyA9PSBiYWNrdXBUeXBlICkgeyAvLyBGaWxlcyBoYXMgbm8gREIgc28gZGlzYWJsZSBEQi4KCQkJalF1ZXJ5KCAnaW5wdXRbbmFtZT0icmVzdG9yZUZpbGVzIl0nICkucHJvcCggJ2NoZWNrZWQnLCB0cnVlICkuYXR0ciggJ2Rpc2FibGVkJywgZmFsc2UgKTsKCQkJalF1ZXJ5KCAnaW5wdXRbbmFtZT0icmVzdG9yZURhdGFiYXNlIl0nICkucHJvcCggJ2NoZWNrZWQnLCBmYWxzZSApLmF0dHIoICdkaXNhYmxlZCcsIHRydWUgKTsKCQl9IGVsc2UgeyAvLyBkZWZhdWx0IHJlc3RvcmUgYWxsCgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVGaWxlcyJdJyApLnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmF0dHIoICdkaXNhYmxlZCcsIGZhbHNlICk7CgkJCWpRdWVyeSggJ2lucHV0W25hbWU9InJlc3RvcmVEYXRhYmFzZSJdJyApLnByb3AoICdjaGVja2VkJywgdHJ1ZSApLmF0dHIoICdkaXNhYmxlZCcsIGZhbHNlICk7CgkJfQoJfQoJCglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCWpRdWVyeSggJy5zZWxlY3RhYmxlQmFja3VwQXJjaGl2ZScgKS5jbGljayggZnVuY3Rpb24oKXsKCQkJYmFja3VwVHlwZSA9IGpRdWVyeSh0aGlzKS5hdHRyKCAnZGF0YS10eXBlJyApOwoJCQliYWNrdXBSZXN0b3JlU3VnZ2VzdCggYmFja3VwVHlwZSApOwoJCX0pOwoJCQoJCXN0YXJ0aW5nQmFja3VwVHlwZSA9IGpRdWVyeSggJy5zZWxlY3RhYmxlQmFja3VwQXJjaGl2ZTpjaGVja2VkJyApLmF0dHIoICdkYXRhLXR5cGUnICk7CgkJYmFja3VwUmVzdG9yZVN1Z2dlc3QoIHN0YXJ0aW5nQmFja3VwVHlwZSApOwoJfSk7Cjwvc2NyaXB0PgoKCjw/cGhwCmVjaG8gJzxkaXYgY2xhc3M9InN0ZXAtd3JhcCBzdGVwLXNlbGVjdEJhY2t1cC13cmFwIj4nOwoKCgovLyBEaXNwbGF5IHByZS1mbGlnaHQgc2NhbiB3YXJuaW5ncyAmIGVycm9ycy4KJHByZWZsaWdodFJlc3VsdHMgPSBwcmVmbGlnaHRTY2FuKCk7CmlmICggY291bnQoICRwcmVmbGlnaHRSZXN1bHRzICkgPiAwICkgewoJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBpbXBsb2RlKCAnPGhyPicsICRwcmVmbGlnaHRSZXN1bHRzICkgKTsKfQp1bnNldCggJHByZWZsaWdodFJlc3VsdHMgKTsKCgoKLy8kc3RlcCA9ICcxJzsKLy9lY2hvICc8c2NyaXB0PnBhZ2VUaXRsZSggIlN0ZXAgPHNwYW4gY2xhc3M9XCJzdGVwX251bWJlclwiPicgLiAkc3RlcCAuICc8L3NwYW4+IG9mIDY6IENob29zZSB5b3VyIGJhY2t1cCBmaWxlIiApOzwvc2NyaXB0Pic7CgppZiAoICdzdGFzaCcgPT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd1cGxvYWQnICkgKSB7CglyZXF1aXJlKCAnX2h0bWxfMV9zdGFzaC5waHAnICk7CgllY2hvICc8L2Rpdj4nOwoJcmV0dXJuOwp9Cj8+CgoKCgoKCgoKCgo8ZGl2IGNsYXNzPSJ3cmFwIj4KCjw/cGhwCmlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdmaWxlJyApICE9ICcnICkgewoJJGJhY2t1cF9hcmNoaXZlcyA9IGFycmF5KCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2ZpbGUnICkgKTsKCWVjaG8gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDE1cHg7IGJhY2tncm91bmQ6ICNGRkZGRkY7Ij5SZXN0b3JpbmcgZnJvbSBiYWNrdXAgPGk+JyAuIGh0bWxlbnRpdGllcyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdmaWxlJyApICkgLiAnPC9pPjwvZGl2PgoJPGZvcm0gYWN0aW9uPSI/YWpheD0yIiBtZXRob2Q9InBvc3QiIHRhcmdldD0icmVzdG9yZWJ1ZGR5X2lmcmFtZSI+JzsKCWVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZpbGUiIHZhbHVlPSInIC4gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdmaWxlJyApIC4gJyI+JzsKfSBlbHNlIHsKCT8+CgkKCTxkaXYgY2xhc3M9ImJhY2t1cF9zZWxlY3RfYnV0dG9ucyI+CgkJPGJ1dHRvbiBocmVmPSIjcGJfdXBsb2FkX21vZGFsIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1zZWNvbmRhcnkgbGVhbk1vZGFsIGNyZWF0ZWRiX21vZGFsX2xpbmsiIHN0eWxlPSJmb250LXNpemU6IDE0cHg7Ij5VcGxvYWQgYSBCYWNrdXA8L2J1dHRvbj4KCQk8YnV0dG9uIGhyZWY9IiNwYl9zdGFzaF9tb2RhbCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGxlYW5Nb2RhbCBjcmVhdGVkYl9tb2RhbF9saW5rIiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyI+UmVzdG9yZSBmcm9tIFN0YXNoPC9idXR0b24+Cgk8L2Rpdj4KCQoJPD9waHAKCSRiYWNrdXBfYXJjaGl2ZXMgPSBnZXRfYXJjaGl2ZXNfbGlzdCgpOwoJaWYgKCAwID09IGNvdW50KCAkYmFja3VwX2FyY2hpdmVzICkgKSB7IC8vIE5vIGJhY2t1cHMgZm91bmQuCgkJCgkJLy8gTG9vayBmb3IgbWFudWFsbHkgdW56aXBwZWQKCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICc8Yj5ObyBCYWNrdXBCdWRkeSBaaXAgYmFja3VwIGZvdW5kIGluIHRoaXMgZGlyZWN0b3J5IGAnIC4gQUJTUEFUSCAuICdgPC9iPiAtIAoJCQlZb3UgbXVzdCB1cGxvYWQgYSBiYWNrdXAgZmlsZSBieSBGVFAgKGludG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgaW1wb3J0YnVkZHkucGhwIGZpbGUpLCB0aGUgdXBsb2FkIHRhYiwgb3IgaW1wb3J0IGZyb20gU3Rhc2ggdmlhIHRoZSBTdGFzaCB0YWIgYWJvdmUgdG8gY29udGludWUuCgkJCTxiPkRvIG5vdCByZW5hbWUgdGhlIGJhY2t1cCBmaWxlIGZyb20gaXRzIG9yaWdpbmFsIGZpbGVuYW1lLjwvYj4gSWYgeW91IG1hbnVhbGx5IGV4dHJhY3RlZC91bnppcHBlZCwgdXBsb2FkIHRoZSBiYWNrdXAgZmlsZSwKCQkJc2VsZWN0IGl0LCB0aGVuIHNlbGVjdCA8aT5BZHZhbmNlZCBUcm91Ymxlc2hvb3RpbmcgT3B0aW9uczwvaT4gJiBjbGljayA8aT5Ta2lwIFppcCBFeHRyYWN0aW9uPC9pPi4gUmVmcmVzaCB0aGlzIHBhZ2Ugb25jZSB5b3UgaGF2ZSB1cGxvYWRlZCB0aGUgYmFja3VwLicgKTsKCQkKCX0gZWxzZSB7IC8vIEZvdW5kIG9uZSBvciBtb3JlIGJhY2t1cHMuCgkJPz4KCQkJPGZvcm0gYWN0aW9uPSI/YWpheD0yIiBtZXRob2Q9InBvc3QiIHRhcmdldD0ibWluaUZyYW1lIj4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhc3NfaGFzaCIgdmFsdWU9Ijw/cGhwIGVjaG8gUEJfUEFTU1dPUkQ7ID8+Ij4KCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im9wdGlvbnMiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoIHNlcmlhbGl6ZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKTsgPz4nIiAvPgoJCTw/cGhwCgkJZWNobyAnPGRpdiBjbGFzcz0iYmFja3VwX3NlbGVjdF90ZXh0Ij5CYWNrdXBzIGluIDxzcGFuPicgLiBBQlNQQVRIIC4gJzwvc3Bhbj48L2Rpdj4nOwoJCWVjaG8gJzx1bCBjbGFzcz0icm91bmQtd3JhcCI+JzsKCQkkYmFja3VwX2NvdW50ID0gY291bnQoICRiYWNrdXBfYXJjaGl2ZXMgKTsKCQkkaSA9IDA7CgkJZm9yZWFjaCggJGJhY2t1cF9hcmNoaXZlcyBhcyAkYmFja3VwX2lkID0+ICRiYWNrdXBfYXJjaGl2ZSApIHsKCQkJJGkrKzsKCQkJCgkJCQoJCQkkYmFja3VwX3R5cGUgPSAnJzsKCQkJJGJhY2t1cF90eXBlX3RleHQgPSAnJzsKCQkJaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddID09ICcnICkgewoJCQkJaWYgKCBzdHJpc3RyKCAkYmFja3VwX2FyY2hpdmVbJ2ZpbGUnXSwgJy1kYi0nICkgIT09IGZhbHNlICkgewoJCQkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJ0RhdGFiYXNlIE9ubHkgQmFja3VwJzsKCQkJCQkkYmFja3VwX3R5cGUgPSAnZGInOwoJCQkJfSBlbHNlaWYgKCBzdHJpc3RyKCAkYmFja3VwX2FyY2hpdmVbJ2ZpbGUnXSwgJy1mdWxsLScgKSAhPT0gZmFsc2UgKSB7CgkJCQkJJGJhY2t1cF90eXBlX3RleHQgPSAnRnVsbCBCYWNrdXAnOwoJCQkJCSRiYWNrdXBfdHlwZSA9ICdmdWxsJzsKCQkJCX0gZWxzZWlmICggc3RyaXN0ciggJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10sICctZmlsZXMtJyApICE9PSBmYWxzZSApIHsKCQkJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICdGaWxlcyBPbmx5IEJhY2t1cCc7CgkJCQkJJGJhY2t1cF90eXBlID0gJ2ZpbGVzJzsKCQkJCX0gZWxzZWlmICggc3RyaXN0ciggJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10sICctZXhwb3J0LScgKSAhPT0gZmFsc2UgKSB7CgkJCQkJJGJhY2t1cF90eXBlX3RleHQgPSAnTXVsdGlzaXRlIFN1YnNpdGUgRXhwb3J0JzsKCQkJCQkkYmFja3VwX3R5cGUgPSAnZXhwb3J0JzsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3R5cGUnXSA9PSAnZGInICkgewoJCQkJCSRiYWNrdXBfdHlwZV90ZXh0ID0gJ0RhdGFiYXNlIE9ubHkgQmFja3VwJzsKCQkJCQkkYmFja3VwX3R5cGUgPSAnZGInOwoJCQkJfSBlbHNlaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddID09ICdmdWxsJyApIHsKCQkJCQkkYmFja3VwX3R5cGVfdGV4dCA9ICdGdWxsIEJhY2t1cCc7CgkJCQkJJGJhY2t1cF90eXBlID0gJ2Z1bGwnOwoJCQkJfSBlbHNlaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddID09ICdmaWxlcycgKSB7CgkJCQkJJGJhY2t1cF90eXBlX3RleHQgPSAnRmlsZXMgT25seSBCYWNrdXAnOwoJCQkJCSRiYWNrdXBfdHlwZSA9ICdmaWxlcyc7CgkJCQl9IGVsc2VpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWyd0eXBlJ10gPT0gJ2V4cG9ydCcgKSB7CgkJCQkJJGJhY2t1cF90eXBlX3RleHQgPSAnTXVsdGlzaXRlIFN1YnNpdGUgRXhwb3J0JzsKCQkJCQkkYmFja3VwX3R5cGUgPSAnZXhwb3J0JzsKCQkJCX0gZWxzZSB7CgkJCQkJJGJhY2t1cF90eXBlX3RleHQgPSAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddIC4gJyBCYWNrdXAnOwoJCQkJCSRiYWNrdXBfdHlwZSA9ICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWyd0eXBlJ107CgkJCQl9CgkJCX0KCQkJCgkJCQoJCQllY2hvICc8bGk+JzsKCQkJCgkJCWVjaG8gJzxpbnB1dCBjbGFzcz0ic2VsZWN0YWJsZUJhY2t1cEFyY2hpdmUiIHR5cGU9InJhZGlvIiAnOwoJCQlpZiAoICRiYWNrdXBfaWQgPT0gMCApIHsKCQkJCWVjaG8gJ2NoZWNrZWQ9ImNoZWNrZWQiICc7CgkJCX0KCQkJZWNobyAnbmFtZT0iZmlsZSIgdmFsdWU9IicgLiAkYmFja3VwX2FyY2hpdmVbJ2ZpbGUnXSAuICciIGRhdGEtdHlwZT0iJyAuICRiYWNrdXBfdHlwZSAuICciPiAnIC4gJGJhY2t1cF9hcmNoaXZlWydmaWxlJ107CgkJCWVjaG8gJzxzcGFuIHN0eWxlPSJmbG9hdDogcmlnaHQ7Ij4nIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggZmlsZXNpemUoIEFCU1BBVEggLiAkYmFja3VwX2FyY2hpdmVbJ2ZpbGUnXSApICkgLiAnPC9zcGFuPic7CgkJCQoJCQllY2hvICc8ZGl2IGNsYXNzPSJkZXNjcmlwdGlvbiIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyMnB4OyBtYXJnaW4tdG9wOiA2cHg7IGZvbnQtc3R5bGU6IG5vcm1hbDsgbGluZS1oZWlnaHQ6IDI2cHg7Ij4nOwoJCQkkbWV0YSA9IGFycmF5KCk7CgkJCQoJCQllY2hvICRiYWNrdXBfdHlwZV90ZXh0OwoJCQkKCQkJaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsnY3JlYXRlZCddICE9ICcnICkgewoJCQkJZWNobyAnIGZyb20gJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsnY3JlYXRlZCddICk7CgkJCX0KCQkJCgkJCWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3dwX3ZlcnNpb24nXSAhPSAnJyApIHsKCQkJCWVjaG8gJyBvbiBXb3JkUHJlc3MgdicgLiAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsnd3BfdmVyc2lvbiddOwoJCQl9CgkJCS8qCgkJCWlmICggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ2JiX3ZlcnNpb24nXSAhPSAnJyApIHsKCQkJCWVjaG8gJyAmIEJhY2t1cEJ1ZGR5IHYnIC4gJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ2JiX3ZlcnNpb24nXTsKCQkJfQoJCQkqLwoJCQkKCQkJaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsnc2l0ZXVybCddICE9ICcnICkgewoJCQkJZWNobyAnPGJyPlNpdGU6ICcgLiAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsnc2l0ZXVybCddOwoJCQl9CgkJCQoJCQlpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydwcm9maWxlJ10gIT0gJycgKSB7CgkJCQllY2hvICc8YnI+UHJvZmlsZTogJyAuIGh0bWxlbnRpdGllcyggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ3Byb2ZpbGUnXSApOwoJCQl9CgkJCQoJCQlpZiAoICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddWydub3RlJ10gIT0gJycgKSB7CgkJCQllY2hvICc8YnI+Tm90ZTogJyAuIGh0bWxlbnRpdGllcyggJGJhY2t1cF9hcmNoaXZlWydjb21tZW50J11bJ25vdGUnXSApIC4gJzxicj4nOwoJCQl9CgkJCQoJCQkKCQkJCgkJCS8vIFNob3cgbWV0YSBidXR0b24gaWYgbWV0YSBpbmZvIGF2YWlsYWJsZS4KCQkJaWYgKCAkYmFja3VwX2FyY2hpdmVbJ2NvbW1lbnQnXVsndHlwZSddICE9ICcnICkgewoJCQkJJGZpbGVfaGFzaCA9IG1kNSggJGJhY2t1cF9hcmNoaXZlWydmaWxlJ10gKTsKCQkJCWVjaG8gJzxhIGhyZWY9IiNoYXNoX3ZpZXciIGNsYXNzPSJidXR0b24gYnV0dG9uLXRlcnRpYXJ5IGxlYW5Nb2RhbCB2aWV3X2hhc2hfY2xpY2siIHN0eWxlPSIgZmxvYXQ6IHJpZ2h0OyIgaWQ9InZpZXdfaGFzaF8nIC4gJGkgLiAnIiBkYXRhLWZpbGU9IicgLiAkYmFja3VwX2FyY2hpdmVbJ2ZpbGUnXSAuICciPlZpZXcgQ2hlY2tzdW08L2E+JzsKCQkJCWVjaG8gJzxhIGhyZWY9IiNpbmZvXycgLiAkZmlsZV9oYXNoIC4gJyIgY2xhc3M9ImJ1dHRvbiBidXR0b24tdGVydGlhcnkgbGVhbk1vZGFsIiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyIgaWQ9InZpZXdfbWV0YV8nIC4gJGkgLiAnIj5WaWV3IE1ldGE8L2E+JzsKCQkJCT8+CgkJCQk8ZGl2IGlkPSJoYXNoX3ZpZXciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBoZWlnaHQ6IDMwJTsiPgoJCQkJCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQkJCQkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJCQkJCTxhIGNsYXNzPSJtb2RhbF9jbG9zZSI+JnRpbWVzOzwvYT4KCQkJCQkJCTxoMj5WaWV3IENoZWNrc3VtPC9oMj4KCQkJCQkJPC9kaXY+CgkJCQkJCTxkaXYgY2xhc3M9Im1vZGFsX2NvbnRlbnQiPgoJCQkJCQkJPHNwYW4gaWQ9Imhhc2hfdmlld19sb2FkaW5nIj48aW1nIHNyYz0iaW1wb3J0YnVkZHkvaW1hZ2VzL2xvYWRpbmcuZ2lmIj4gQ2FsY3VsYXRpbmcgYmFja3VwIGZpbGUgQ2hlY2tzdW0gKE1ENSBoYXNoKS4uLiBUaGlzIG1heSB0YWtlIGEgbW9tZW50Li4uPC9zcGFuPgoJCQkJCQkJPHNwYW4gaWQ9Imhhc2hfdmlld19yZXNwb25zZSI+PC9zcGFuPgoJCQkJCQk8L2Rpdj4KCQkJCQk8L2Rpdj4KCQkJCTwvZGl2PgoJCQkJPGRpdiBpZD0iPD9waHAgZWNobyAnaW5mb18nIC4gJGZpbGVfaGFzaDsgPz4iIHN0eWxlPSJkaXNwbGF5OiBub25lOyBoZWlnaHQ6IDkwJTsiPgoJCQkJCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQkJCQkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJCQkJCTxhIGNsYXNzPSJtb2RhbF9jbG9zZSI+JnRpbWVzOzwvYT4KCQkJCQkJCTxoMj5CYWNrdXAgTWV0YSBJbmZvcm1hdGlvbjwvaDI+CgkJCQkJCTwvZGl2PgoJCQkJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCQkJCTw/cGhwCgkJCQkJCQkkY29tbWVudF9tZXRhID0gYXJyYXkoKTsKCQkJCQkJCWZvcmVhY2goICRiYWNrdXBfYXJjaGl2ZVsnY29tbWVudCddIGFzICRjb21tZW50X2xpbmVfbmFtZSA9PiAkY29tbWVudF9saW5lX3ZhbHVlICkgeyAvLyBMb29wIHRocm91Z2ggYWxsIG1ldGEgZmllbGRzIGluIHRoZSBjb21tZW50IGFycmF5IHRvIGRpc3BsYXkuCgkJCQkJCQkJCgkJCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkcmVzcG9uc2UgPSBiYWNrdXBidWRkeV9jb3JlOjpwcmV0dHlfbWV0YV9pbmZvKCAkY29tbWVudF9saW5lX25hbWUsICRjb21tZW50X2xpbmVfdmFsdWUgKSApICkgewoJCQkJCQkJCQkkY29tbWVudF9tZXRhW10gPSAkcmVzcG9uc2U7CgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJfQoJCQkJCQkJaWYgKCBjb3VudCggJGNvbW1lbnRfbWV0YSApID4gMCApIHsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6JHVpLT5saXN0X3RhYmxlKAoJCQkJCQkJCQkkY29tbWVudF9tZXRhLAoJCQkJCQkJCQlhcnJheSgKCQkJCQkJCQkJCSdjb2x1bW5zJwkJPT4JYXJyYXkoICdNZXRhIEluZm9ybWF0aW9uJywgJ1ZhbHVlJyApLAoJCQkJCQkJCQkJJ2NzcycJCQk9Pgknd2lkdGg6IDEwMCU7IG1pbi13aWR0aDogMjAwcHg7JywKCQkJCQkJCQkJKQoJCQkJCQkJCSk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWVjaG8gJzxpPk5vIG1ldGEgZGF0YSBmb3VuZCBpbiB6aXAgY29tbWVudC4gU2tpcHBpbmcgbWV0YSBpbmZvcm1hdGlvbiBkaXNwbGF5LjwvaT4nOwoJCQkJCQkJfQoJCQkJCQkJPz4KCQkJCQkJPC9kaXY+CgkJCQkJPC9kaXY+CgkJCQk8L2Rpdj4KCQkJCTw/cGhwCgkJCX0gLy8gZW5kIGlmIHR5cGUgbm90IGJsYW5rLgoJCQkKCQkJCgkJCQoJCQkvL2VjaG8gaW1wbG9kZSggJyAtICcsICRtZXRhICk7CgkJCWVjaG8gJzwvZGl2Pic7CgkJCWVjaG8gJzwvbGk+JzsKCQl9CgkJZWNobyAnPC91bD4nOwoJfQoJPz4KCQo8P3BocAp9IC8vIEVuZCBmaWxlIG5vdCBnaXZlbiBpbiBxdWVyeXN0cmluZy4KCgoKCgovLyBJZiBvbmUgb3IgbW9yZSBiYWNrdXAgZmlsZXMgd2FzIGZvdW5kIHRoZW4gcHJvdmlkZSBhIGJ1dHRvbiB0byBjb250aW51ZS4KaWYgKCAoICFlbXB0eSggJGJhY2t1cF9hcmNoaXZlcyApICkgfHwgKCAnc3Rhc2gnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3VwbG9hZCcgKSApICkgewoJZWNobyAnPC9kaXY+PCEtLSAvd3JhcCAtLT4nOwoJPz4KCQoJCgk8ZGl2IGNsYXNzPSJtYWluX2JveF9mb290Ij4KCQk8Y2VudGVyPgoJCQkKCQkJPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMjBweDsgbWFyZ2luLWJvdHRvbTogMzBweDsiPgoJCQkJPGI+V2hhdCB3b3VsZCB5b3UgbGlrZSB0byByZXN0b3JlIGZyb20gdGhlIGJhY2t1cD88L2I+CgkJCQkmbmJzcDsmbmJzcDsKCQkJCTxsYWJlbCBzdHlsZT0iZmxvYXQ6IGluaGVyaXQ7Ij4KCQkJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InJlc3RvcmVGaWxlcyIgdmFsdWU9IjEiIENIRUNLRUQ+IEZpbGVzCgkJCQk8L2xhYmVsPgoJCQkJJm5ic3A7Jm5ic3A7CgkJCQk8bGFiZWwgc3R5bGU9ImZsb2F0OiBpbmhlcml0OyI+CgkJCQkJPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJyZXN0b3JlRGF0YWJhc2UiIHZhbHVlPSIxIiBDSEVDS0VEPiBEYXRhYmFzZQoJCQkJPC9sYWJlbD4KCQkJPC9kaXY+CgkJCQoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJSZXN0b3JlIEJhY2t1cCIgY2xhc3M9Iml0LWJ1dHRvbiI+CgkJCTxidXR0b24gaWQ9ImFkdmFuY2VkX29wdGlvbnNfYnV0dG9uIiBocmVmPSIjcGJfYWR2YW5jZWRfbW9kYWwiIGNsYXNzPSJpdC1idXR0b24gaXQtc2Vjb25kYXJ5IGxlYW5Nb2RhbCI+QWR2YW5jZWQgT3B0aW9uczwvYnV0dG9uPgoJCTwvY2VudGVyPgoJPC9kaXY+Cjw/cGhwCn0gZWxzZSB7CgkvL3BiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1VwbG9hZCBhIGJhY2t1cCBmaWxlIHRvIGNvbnRpbnVlLicgKTsKCWVjaG8gJzxiciAvPjxiciAvPjxiciAvPic7CgllY2hvICc8Yj5Zb3UgbXVzdCB1cGxvYWQgYSBiYWNrdXAgZmlsZSBieSBGVFAsIHRoZSB1cGxvYWQgdGFiLCBvciBpbXBvcnQgZnJvbSBTdGFzaCB0byBjb250aW51ZS48L2I+JzsKCWVjaG8gJzwvZGl2PjwhLS0gL3dyYXAgLS0+JzsKfQo/PgoKCgoKCgoKPGRpdiBpZD0icGJfYWR2YW5jZWRfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Cgk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQk8aDI+QWR2YW5jZWQgT3B0aW9uczwvaDI+CgkJCUV4ZXJjaXNlIGNhdXRpb24uIEFkZGl0aW9uYWwgb3B0aW9ucyBhdmFpbGFibGUgb24gc3Vic2VxdWVudCBzdGVwcy4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCgkJCQoJCQlVbnppcCBTdHJhdGVneToKCQkJPHNlbGVjdCBuYW1lPSJ6aXBNZXRob2RTdHJhdGVneSI+CgkJCQk8b3B0aW9uIHZhbHVlPSJhbGwiIFNFTEVDVEVEPkFsbCBBdmFpbGFibGUgKCB1bnppcCB2aWEgZXhlYygpICZndDsgWmlwQXJjaGl2ZSAmZ3Q7IFBjbFppcCApIC0gZGVmYXVsdDwvb3B0aW9uPgoJCQkJPG9wdGlvbiB2YWx1ZT0iemlwYXJjaGl2ZSI+Q29tcGF0aWJpbGl0eTogWmlwQXJjaGl2ZTwvb3B0aW9uPgoJCQkJPG9wdGlvbiB2YWx1ZT0icGNsemlwIj5Db21wYXRpYmlsaXR5OiBQY2xaaXA8L29wdGlvbj4KCQkJPC9zZWxlY3Q+CgkJCTxicj48YnI+CgkJCQoJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im1pZ3JhdGVIdGFjY2VzcyIgdmFsdWU9IjEiIENIRUNLRUQ+IE1pZ3JhdGUgLmh0YWNjZXNzIGZpbGUgVVJMcyAmIHBhdGhzIChpZiBVUkwgY2hhbmdlcykuPGJyPgoJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNraXBVbnppcCIgdmFsdWU9IjEiPiBTa2lwIHVuemlwcGluZyBvciBvcGVuaW5nIGFyY2hpdmUgKGZvciBtYW51YWwgZXh0cmFjdGlvbikuCgkJCTxicj48YnI+CgoJCQkKCQkJCgkJPC9kaXY+Cgk8L2Rpdj4KPC9kaXY+CgoKCgoKCjw/cGhwCmVjaG8gJzwvZm9ybT4nOwo/PgoKCgo8L2Rpdj48IS0tIGVuZCB3cmFwcGVyIGRpdiAtLT4KCgoKCjxkaXYgaWQ9InBiX3VwbG9hZF9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQk8ZGl2IGNsYXNzPSJtb2RhbF9oZWFkZXIiPgoJCQk8YSBjbGFzcz0ibW9kYWxfY2xvc2UiPiZ0aW1lczs8L2E+CgkJCTxoMj5VcGxvYWQgQmFja3VwPC9oMj4KCQkJU21hbGxlciBiYWNrdXBzIGNhbiBiZSB1cGxvYWRlZCBoZXJlIGRpcmVjdGx5IGZyb20geW91ciBjb21wdXRlci4gTGFyZ2VyIGJhY2t1cHMgd29yayBiZXN0IG92ZXIgRlRQIG9yIG90aGVyIG1ldGhvZHMuCgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0ibW9kYWxfY29udGVudCI+CgkJCQoJCQkKCQkJPGZvcm0gZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCI+CgkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYXNzX2hhc2giIHZhbHVlPSI8P3BocCBlY2hvIFBCX1BBU1NXT1JEOyA/PiI+CgkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ1cGxvYWQiIHZhbHVlPSJsb2NhbCI+CgkJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcHRpb25zIiB2YWx1ZT0iPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCBzZXJpYWxpemUoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9ucyApICk7ID8+JyI+CgkJCQlDaG9vc2UgYSBsb2NhbCBiYWNrdXAgdG8gdXBsb2FkOjxicj4KCQkJCTxwPgoJCQkJCTxpbnB1dCBuYW1lPSJmaWxlIiB0eXBlPSJmaWxlIiBzdHlsZT0id2lkdGg6IDEwMCU7Ij4KCQkJCTwvcD4KCQkJCTxicj4KCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJVcGxvYWQgQmFja3VwIiBjbGFzcz0idG9nZ2xlIGJ1dHRvbiI+CgkJCTwvZm9ybT4KCQkJCgkJCQoJCTwvZGl2PgoJPC9kaXY+CjwvZGl2PgoKCgoKPGRpdiBpZD0icGJfc3Rhc2hfbW9kYWwiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+Cgk8ZGl2IGNsYXNzPSJtb2RhbCI+CgkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQk8aDI+UmVzdG9yZSBCYWNrdXAgZnJvbSBTdGFzaDwvaDI+CgkJCUJhY2t1cHMgc3RvcmVkIGluIHlvdXIgaVRoZW1lcyBTdGFzaCBtYXkgYmUgcmV0cmlldmVkIGZvciByZXN0b3JpbmcgaGVyZS4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCgkJCQoJCQk8P3BocCByZXF1aXJlKCAnX2h0bWxfMV9zdGFzaC5waHAnICk7ID8+CgkJCQoJCQkKCQk8L2Rpdj4KCTwvZGl2Pgo8L2Rpdj4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/home.php,importbuddy/views/home.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/importingDatabase.ejs,importbuddy/views/importingDatabase.ejs
PGNlbnRlcj4KCTxoMz5SZXN0b3JpbmcgRGF0YWJhc2UgLi4uPC9oMz4KCTxoNCBpZD0iaW1wb3J0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlIj48L2g0Pgo8L2NlbnRlcj4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/importingDatabase.ejs,importbuddy/views/importingDatabase.ejs
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/login.php,importbuddy/views/login.php
PHNjcmlwdD5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoICdBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcgKTs8L3NjcmlwdD4KPD9waHAKCgppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApICE9ICcnICkgewoJZ2xvYmFsICRwYl9sb2dpbl9hdHRlbXB0czsKCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ludmFsaWQgcGFzc3dvcmQuIFBsZWFzZSBlbnRlciB0aGUgcGFzc3dvcmQgeW91IHByb3ZpZGVkIHdpdGhpbiBCYWNrdXBCdWRkeSBTZXR0aW5ncy4gQXR0ZW1wdCAjJyAuICRwYl9sb2dpbl9hdHRlbXB0cyAuICcuJyApOwoJZWNobyAnPGJyPic7Cn0KPz4KCjxwPkVudGVyIHlvdXIgSW1wb3J0QnVkZHkgcGFzc3dvcmQgYmVsb3cgdG8gYmVnaW4uPC9wPgoKPGZvcm0gbWV0aG9kPSJwb3N0Ij4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImxvZ2luIj4KCTxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0icGFzc3dvcmQiIHN0eWxlPSJ3aWR0aDogMjUwcHg7Ij4KCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdCIgdmFsdWU9IkF1dGhlbnRpY2F0ZSIgY2xhc3M9Iml0LWJ1dHRvbiI+CjwvZm9ybT4K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/login.php,importbuddy/views/login.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/migratingDatabase.ejs,importbuddy/views/migratingDatabase.ejs
PGNlbnRlcj4KCTxoMz5NaWdyYXRpbmcgRGF0YWJhc2UgLi4uPC9oMz4KCTxoNCBpZD0ibWlncmF0aW5nRGF0YWJhc2UtcHJvZ3Jlc3NNZXNzYWdlIj48L2g0Pgo8L2NlbnRlcj4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/migratingDatabase.ejs,importbuddy/views/migratingDatabase.ejs
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/unzippingFiles.ejs,importbuddy/views/unzippingFiles.ejs
PGNlbnRlcj4KCTxoMz5QbGVhc2Ugd2FpdCB3aGlsZSB5b3VyIGZpbGVzIGFyZSByZXN0b3JlZCAuLi48L2gzPgoJPGg0IGlkPSJ1bnppcHBpbmdGaWxlcy1wcm9ncmVzc01lc3NhZ2UiPlJlc3RvcmluZyBGaWxlczwvaDQ+CjwvY2VudGVyPg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/unzippingFiles.ejs,importbuddy/views/unzippingFiles.ejs
###PACKDATA,FILE_START,/_importbuddy/importbuddy/views/urlReplaceSettings.ejs,importbuddy/views/urlReplaceSettings.ejs
CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImltcG9ydGJ1ZGR5L2pzL2pxdWVyeS5sZWFuTW9kYWwubWluLmpzIj48L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQlqUXVlcnkoJy5sZWFuTW9kYWwnKS5sZWFuTW9kYWwoCgkJCQl7IHRvcCA6IDQ1LCBvdmVybGF5IDogMC40LCBjbG9zZUJ1dHRvbjogIi5tb2RhbF9jbG9zZSIgfQoJCSk7Cgl9KTsKPC9zY3JpcHQ+CgoKCjxmb3JtIG9uU3VibWl0PSJqUXVlcnkoJyN1cmxSZXBsYWNlLXJlc3RvcmVEYXRhJykudmFsKCB3aW5kb3cuYnRvYSggZW5jb2RlVVJJQ29tcG9uZW50KCBKU09OLnN0cmluZ2lmeSggd2luZG93LnJlc3RvcmVEYXRhICkgKSApICk7IiBhY3Rpb249Ij9hamF4PTUiIHRhcmdldD0ibWluaUZyYW1lIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJkYl9zZXR0aW5nIj48IS0tIHRoaXMgZm9ybSBpcyBvbmx5IHN1Ym1pdHRlZCBhZnRlciBydW5uaW5nIHRocm91Z2ggamF2YXNjcmlwdC4gc3VibWl0dGluZyBhY3R1YWwgZm9ybSBpbnN0ZWFkIG9mIHVzaW5nIGpRdWVyeSBwb3N0IHNvIHdlIGNhbiB0YXJnZXQgaWZyYW1lLiAtLT4KCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc3RvcmVEYXRhIiBpZD0idXJsUmVwbGFjZS1yZXN0b3JlRGF0YSIgdmFsdWU9IiI+PCEtLSB0aGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgd2lsbCBuZWVkIHBhcnNlZCBieSBQSFAgb24gdGhlIHJlY2VpdmluZyBlbmQuIHBvcHVsYXRlZCBvbiBzdWJtaXQgYWZ0ZXIgZGIgdGVzdCBwYXNzZXMuIC0tPgoKCgoKCgoKCgk8dGFibGUgY2xhc3M9InNldHRpbmdzVGFibGUiPgoJCTx0cj48dGggc3R5bGU9IndpZHRoOiAzMCU7Ij4mbmJzcDs8L3RoPjx0aCBzdHlsZT0id2lkdGg6IDMwJTsiPk9sZCBVUkw8L3RoPjx0aCBzdHlsZT0id2lkdGg6IDEwJTsiPiZuYnNwOzwvdGg+PHRoIHN0eWxlPSJ3aWR0aDogMzAlOyI+TmV3IFVSTDwvdGg+PC90cj4KCQoJCgkKCQk8dHI+PCEtLSBXT1JEUFJFU1MgQUREUkVTUyAoQUxMIFNJVEUgVFlQRVMpIC0tPgoJCQk8dGQ+CgkJCQlXb3JkUHJlc3MgQWRkcmVzcyA8c3BhbiBjbGFzcz0ibGlnaHQiPihTaXRlIFVSTCk8L3NwYW4+IDxhIGNsYXNzPSJwbHVnaW5idWRkeV90aXAiIHRpdGxlPSJUaGlzIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHlvdSB3YW50IHRoZSBmaW5hbCBXb3JkUHJlc3Mgc2l0ZSB5b3UgYXJlIHJlc3RvcmluZyAvIG1pZ3JhdGluZyB0byByZXNpZGUuIEV4OiBodHRwOi8vZm9vLmNvbS93cCI+PGltZyBzcmM9ImltcG9ydGJ1ZGR5L3BsdWdpbmJ1ZGR5L2ltYWdlcy9wbHVnaW5idWRkeV90aXAucG5nIiBhbHQ9Iig/KSI+PC9hPgoJCQk8L3RkPgoJCQk8dGQ+CgkJCQk8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Im9sZF9zZXR0aW5nIiB2YWx1ZT0iPCU9IGRhdC5zaXRldXJsICU+IiBESVNBQkxFRD4KCQkJPC90ZD4KCQkJPHRkIGNsYXNzPSJzZXR0aW5nQ29weSI+CgkJCQk8YSBocmVmPSIjIj4mcmFycjs8L2E+CgkJCTwvdGQ+CgkJCTx0ZD4KCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiB2YWx1ZT0iPCU9IGRlZmF1bHRVUkwgJT4iIG5hbWU9InNpdGV1cmwiPgoJCQk8L3RkPgoJCTwvdHI+CgkJPGJyIC8+PGJyIC8+CgkJPCUgaWYgKCBkYXQuaXNfbXVsdGlzaXRlID09PSB0cnVlICkgeyAvLyBtdWx0aXNpdGUgJT4KCQk8dHI+PCEtLSBNVUxUSVNJVEUgRE9NQUlOIC0tPgoJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4KCQkJCU11bHRpc2l0ZSBEb21haW4gPCU9IHRpcCggJ1RoaXMgaXMgdGhlIE11bHRpU2l0ZSBtYWluIGRvbWFpbi4gRXg6IGZvby5jb20uIFdBUk5JTkc6IENoYW5naW5nIHRoaXMgbWF5IHJlc3VsdCBpbiBVUkwgcHJvYmxlbXMuIFVzZSBjYXV0aW9uLicgKSAlPgoJCQkJPGJyPgoJCQkJPHNwYW4gY2xhc3M9ImxpZ2h0Ij4oSG9tZSBVUkwpPC9zcGFuPgoJCQk8L3RkPgoJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7Ij4KCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0ib2xkX3NldHRpbmciIHZhbHVlPSI8JT0gZGF0LmRvbWFpbiAlPiIgRElTQUJMRUQ+CgkJCTwvdGQ+CgkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+CgkJCQk8YSBocmVmPSIjIj4mcmFycjs8L2E+CgkJCTwvdGQ+CgkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGVmYXVsdERvbWFpbiAlPiIgbmFtZT0iaG9tZXVybCI+CgkJCQk8YnI+Tm90ZTogVGhpcyBVUkwgYWJvdmUgd2lsbCBhbHNvIGJlIHRoZSBuZXcgTXVsdGlzaXRlIE5ldHdvcmsgVVJMLgoJCQk8L3RkPgoJCTwvdHI+CgkKCQk8JSB9IGVsc2UgeyAlPgoJCQoJCTx0cj48IS0tIENVU1RPTSBIT01FIFVSTCAtLT4KCQkJPHRkPgoJCQkJPGxhYmVsIHN0eWxlPSJ3aWR0aDogMTAwJTsiIGZvcj0iY2hlY2tfY3VzdG9tX2hvbWUiPgoJCQkJCUN1c3RvbSBTaXRlIEFkZHJlc3MgPHNwYW4gY2xhc3M9ImxpZ2h0Ij4oSG9tZSBVUkwpPC9zcGFuPiA8JT0gdGlwKCAnT1BUSU9OQUwuIFRoaXMgaXMgYWxzbyBrbm93biBhcyB0aGUgc2l0ZSBhZGRyZXNzLiBUaGlzIGlzIHRoZSBob21lIGFkZHJlc3Mgd2hlcmUgeW91ciBtYWluIHNpdGUgcmVzaWRlcy4gVGhpcyBtYXkgZGlmZmVyIGZyb20geW91ciBXb3JkUHJlc3MgVVJMLiBGb3IgZXhhbXBsZTogaHR0cDovL2Zvby5jb20nICkgJT4KCQkJCTwvbGFiZWw+CgkJCTwvdGQ+CgkJCTx0ZD4KCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY3VzdG9tSG9tZUVuYWJsZWQiIHZhbHVlPSJvbiIgb25DbGljaz0ialF1ZXJ5KCcjY3VzdG9tX2hvbWUnKS50b2dnbGUoKTsiIHN0eWxlPSJ3aWR0aDogYXV0bzsiPiA8c3BhbiBjbGFzcz0ibGlnaHQiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTNweDsiPk9wdGlvbmFsLiBEaXNhYmxlZCBieSBkZWZhdWx0Ljwvc3Bhbj4KCQkJPC90ZD4KCQkJPHRkIGNvbHNwYW49IjIiPiZuYnNwOzwvdGQ+CgkJPC90cj4KCQk8dHIgaWQ9ImN1c3RvbV9ob21lIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPjwhLS0gU0lURSBBRERSRVNTIChTVEFOREFMT05FIE9OTFkpIC0tPgoJCQk8dGQ+CgkJCQkmbmJzcDsKCQkJPC90ZD4KCQkJPHRkPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJvbGRfc2V0dGluZyIgdmFsdWU9IjwlPSBkYXQuaG9tZXVybCAlPiIgRElTQUJMRUQ+CgkJCTwvdGQ+CgkJCTx0ZCBjbGFzcz0ic2V0dGluZ0NvcHkiPgoJCQkJPGEgaHJlZj0iIyIgdGl0bGU9IkNsaWNrIHRvIGNvcHkgb2xkIHNldHRpbmcgb3Zlci4iPiZyYXJyOzwvYT4KCQkJPC90ZD4KCQkJPHRkPgoJCQkJPGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8JT0gZGVmYXVsdFVSTCAlPiIgbmFtZT0iaG9tZXVybCI+CgkJCTwvdGQ+CgkJPC90cj4KCQoJCTwlIH0gLy8gZW5kIG5vbi1tdWx0aXNpdGUgJT4KCQoJCgk8L3RhYmxlPgoJPGJyPjxicj48YnI+CgkKCQoJCgkKCTxkaXYgY2xhc3M9Im1haW5fYm94X2Zvb3QiPgoJCTxicj4KCQk8Y2VudGVyPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJuZXh0U3RlcCIgdmFsdWU9Ik5leHQgU3RlcCIgY2xhc3M9Iml0LWJ1dHRvbiI+CgkJCTxidXR0b24gaHJlZj0iI3BiX2FkdmFuY2VkX21vZGFsIiBjbGFzcz0iaXQtYnV0dG9uIGl0LXNlY29uZGFyeSBsZWFuTW9kYWwiPkFkdmFuY2VkIE9wdGlvbnM8L2J1dHRvbj4KCQk8L2NlbnRlcj4KCgk8L2Rpdj4KCQoJCgkKCTxkaXYgaWQ9InBiX2FkdmFuY2VkX21vZGFsIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCTxkaXYgY2xhc3M9Im1vZGFsIj4KCQkJPGRpdiBjbGFzcz0ibW9kYWxfaGVhZGVyIj4KCQkJCTxhIGNsYXNzPSJtb2RhbF9jbG9zZSI+JnRpbWVzOzwvYT4KCQkJCTxoMj5BZHZhbmNlZCBPcHRpb25zPC9oMj4KCQkJCUV4ZXJjaXNlIGNhdXRpb24gdXNpbmcgYWR2YW5jZWQgb3B0aW9ucy4gQWRkaXRpb25hbCBvcHRpb25zIGF2YWlsYWJsZSBvbiBzdWJzZXF1ZW50IHN0ZXBzLgoJCQk8L2Rpdj4KCQkJPGRpdiBjbGFzcz0ibW9kYWxfY29udGVudCI+CgkJCQkKCQkJCTxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9Im1pZ3JhdGVEYXRhYmFzZSIKCQkJCQkgICBvbmNsaWNrPSIKCQkJCQlpZiAoIGpRdWVyeSh0aGlzKS5pcyggJzpjaGVja2VkJyApICkgeyAvLyBPbiBjaGVja2luZyB0aGlzIGJveCwgd2UgbmVlZCB0byBoaWRlIG9wdGlvbnM7IHVuY2hlY2tpbmcgc2hvdyBvcHRpb25zLgoJCQkJCQkJalF1ZXJ5KCAnI2RhdGFiYXNlX21pZ3JhdGVfb3B0aW9ucycgKS5zbGlkZURvd24oKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWpRdWVyeSggJyNkYXRhYmFzZV9taWdyYXRlX29wdGlvbnMnICkuc2xpZGVVcCgpOwoJCQkJCQl9CgkJCQkJCWpRdWVyeSggJyNkYXRhYmFzZV9taWdyYXRlX29wdGlvbnMgPiBpbnB1dCcgKS5yZW1vdmVBdHRyKCdjaGVja2VkJyk7IC8vIFVuY2hlY2sgYWxsIG9wdGlvbnMgd2l0aGluLgoJCQkJCSIgQ0hFQ0tFRD4gTWlncmF0ZSBVUkxzL3BhdGhzIGluIGRhdGFiYXNlIGZyb20gb2xkIGxvY2F0aW9uIHRvIG5ldy4gPGJyPgoJCQkJPGRpdiBpZD0iZGF0YWJhc2VfbWlncmF0ZV9vcHRpb25zIj4KCQkJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSIxIiBuYW1lPSJtaWdyYXRlRGF0YWJhc2VCcnV0ZUZvcmNlIiBDSEVDS0VEPiBNaWdyYXRlIFVSTFMvcGF0aHMgaW4gZGF0YWJhc2UgaW4gYWxsIGxvY2F0aW9ucyB1c2luZyBicnV0ZSBmb3JjZS4gPCU9IHRpcCggJ0J5IGRlZmF1bHQgQmFja3VwQnVkZHkgd2lsbCBleHRlbnNpdmVseSBleGFtaW5lIGFuZCBtaWdyYXRlIHVua25vd24gZGF0YWJhc2UgdGFibGVzLiAgU29tZXRpbWVzIGhvd2V2ZXIgdGhpcyBjYW4gY2F1c2UgdGltZW91dHMgb24gbGFyZ2VyIHNpdGVzLiAgWW91IG1heSBza2lwIHRoaXMgaW50ZW5zaXZlIHByb2NlZHVyZSB0byByZWR1Y2UgcmVxdWlyZWQgcnVudGltZSBmb3IgZGF0YWJhc2UgbWlncmF0aW9uIHN0ZXBzLiBOb3RlIHRoYXQgc29tZSBVUkxzIG9yIHBhdGhzIG1heSBub3QgYmUgdXBkYXRlZCBpZiBza2lwcGluZyB0aGlzIHN0ZXAuICBBbGwgbWFqb3IgV29yZFByZXNzIFVSTHMgYW5kIHBhdGhzIHdpbGwgc3RpbGwgYmUgdXBkYXRlZCBob3dldmVyLicgKSAlPjxicj4KCQkJCQlNYXhpbXVtIHRpbWUgcGVyIGNodW5rIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBkYXRhYmFzZTogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im1heF9leGVjdXRpb25fdGltZSIgaWQ9Im1heF9leGVjdXRpb25fdGltZSIgdmFsdWU9IjwlPSBtYXhFeGVjdXRpb25UaW1lICU+IiBzaXplPSI1Ij4gc2Vjb25kcy4gPCU9IHRpcCggJ1RoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIEltcG9ydEJ1ZGR5IHNob3VsZCBhbGxvdyBhIGRhdGFiYXNlIGltcG9ydCBjaHVuayB0byBydW4uIEltcG9ydEJ1ZGR5IGJ5IGRlZmF1bHQgbGltaXRzIGVhY2ggY2h1bmsgdG8geW91ciBNYXhpbXVtIFBIUCBydW50aW1lLiBJZiB5b3VyIGRhdGFiYXNlIGltcG9ydCBzdGVwIGlzIHRpbWluZyBvdXQgdGhlbiBsb3dlcmluZyB0aGlzIHZhbHVlIHdpbGwgaW5zdHJ1Y3QgdGhlIHNjcmlwdCB0byBsaW1pdCBlYWNoIGBjaHVua2AgdG8gYWxsb3cgaXQgdG8gZmluaXNoIHdpdGhpbiB0aGlzIHRpbWUgcGVyaW9kLiBSYWlzaW5nIHRoaXMgdmFsdWUgYWJvdmUgeW91ciBzZXJ2ZXJzIGxpbWl0cyB3aWxsIG5vdCBpbmNyZWFzZSBvciBvdmVycmlkZSBzZXJ2ZXIgc2V0dGluZ3MuJyApICU+CgkJCQk8L2Rpdj4KCQkJCTxicj4KCQkJCQoJCQk8L2Rpdj4KCQk8L2Rpdj4KCTwvZGl2PgoJCgkKPC9mb3JtPg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/views/urlReplaceSettings.ejs,importbuddy/views/urlReplaceSettings.ejs
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/2.php,importbuddy/controllers/ajax/2.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5OjpzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoIHRydWUgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ19pZnJhbWVfaGVhZGVyJyk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCAyOiBSZXN0b3JpbmcgRmlsZXMnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBzdGVwIDIuJyApOwplY2hvICI8c2NyaXB0PmJiX3Nob3dTdGVwKCAndW56aXBwaW5nRmlsZXMnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsgLy8gZGVwbG95bWVudCBtb2RlIHByZS1sb2FkcyBzdGF0ZSBkYXRhIGluIGEgZmlsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgdmlhIHBvc3QuCgkvLyBEZXRlcm1pbmUgc2VsZWN0ZWQgYXJjaGl2ZSBmaWxlLgoJJGFyY2hpdmVGaWxlID0gQUJTUEFUSCAuIHN0cl9yZXBsYWNlKCBhcnJheSggJ1xcJywgJy8nICksICcnLCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdmaWxlJyApICk7CgkkZXhpc3Rpbmdfc3RhdGUgPSBhcnJheSgpOwp9IGVsc2UgewoJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddICkgJiYgKCBjb3VudCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddICkgPiAwICkgKSB7IC8vIERlZmF1bHQgc3RhdGUgb3ZlcnJpZGVzIGV4aXN0LiBBcHBseSB0aGVtLgoJCSRhcmNoaXZlRmlsZSA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXVsnYXJjaGl2ZSddOwoJCSRleGlzdGluZ19zdGF0ZSA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXTsKCQkkZXhpc3Rpbmdfc3RhdGVbJ3RlbXBQYXRoJ10gPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L3RlbXBfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMiApIC4gJy8nOwoJfSBlbHNlIHsKCQlkaWUoICdFcnJvciAjODQzNzk3OTQ0OiBNaXNzaW5nIGV4cGVjdGVkIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGUuJyApOwoJfQp9CgppZiAoICEgZmlsZV9leGlzdHMoICRhcmNoaXZlRmlsZSApICkgewoJZGllKCAnRXJyb3IgIzgzNDk4NDogU3BlY2lmaWVkIGJhY2t1cCBhcmNoaXZlIGAnIC4gaHRtbGVudGl0aWVzKCAkYXJjaGl2ZUZpbGUgKSAuICdgIG5vdCBmb3VuZC4gRGlkIHlvdSBkZWxldGUgaXQ/IElmIHRoZSBmaWxlIGV4aXN0cywgdHJ5IGFnYWluIG9yIHZlcmlmeSBwcm9wZXIgcmVhZCBmaWxlIHBlcm1pc3Npb25zIGZvciBQSFAgdG8gYWNjZXNzIHRoZSBmaWxlLicgKTsKfQoKaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnc2tpcFVuemlwJyApICkgewoJJHNraXBVbnppcCA9IHRydWU7Cn0gZWxzZSB7Cgkkc2tpcFVuemlwID0gZmFsc2U7Cn0KCi8vIEluc3RhbnRpYXRlIHJlc3RvcmUgY2xhc3MuCnJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvcmVzdG9yZS5waHAnICk7CiRyZXN0b3JlID0gbmV3IGJhY2t1cGJ1ZGR5X3Jlc3RvcmUoICdyZXN0b3JlJywgJGV4aXN0aW5nX3N0YXRlICk7CiRzdGF0dXMgPSAkcmVzdG9yZS0+c3RhcnQoICRhcmNoaXZlRmlsZSwgJHNraXBVbnppcCApOwppZiAoIGZhbHNlID09PSAkc3RhdHVzICkgewoJJGVycm9ycyA9ICRyZXN0b3JlLT5nZXRFcnJvcnMoKTsKCWlmICggY291bnQoICRlcnJvcnMgKSA+IDAgKSB7CgkJJGVycm9yTXNnID0gJ0Vycm9ycyB3ZXJlIGVuY291bnRlcmVkOiAnIC4gaW1wbG9kZSggJywgJywgJGVycm9ycyApIC4gJyBJZiBzZWVraW5nIHN1cHBvcnQgcGxlYXNlIGNsaWNrIHRvIFNob3cgQWR2YW5jZWQgRGV0YWlscyBhYm92ZSBhbmQgcHJvdmlkZSBhIGNvcHkgb2YgdGhlIGxvZy4nOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvck1zZyApOwoJfSBlbHNlIHsKCQkkZXJyb3JNc2cgPSAnRXJyb3IgIzg5NDM4MzogVW5rbm93biBlcnJvciBzdGFydGluZyByZXN0b3JlLiBTZWUgYWR2YW5jZWQgc3RhdHVzIGxvZyBmb3IgZGV0YWlscy4nOwoJfQoJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAkZXJyb3JNc2cgKTsKCXJldHVybjsKfQoKJHJlc3RvcmUtPl9zdGF0ZVsnZGVmYXVsdFVSTCddID0gJHJlc3RvcmUtPmdldERlZmF1bHRVcmwoKTsKJHJlc3RvcmUtPl9zdGF0ZVsnZGVmYXVsdERvbWFpbiddID0gJHJlc3RvcmUtPmdldERlZmF1bHREb21haW4oKTsKaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIGRlcGxveW1lbnQgbW9kZSBwcmUtbG9hZHMgc3RhdGUgZGF0YSBpbiBhIGZpbGUgaW5zdGVhZCBvZiBwYXNzaW5nIHZpYSBwb3N0LgoJJHJlc3RvcmUtPl9zdGF0ZSA9IHBhcnNlX29wdGlvbnMoICRyZXN0b3JlLT5fc3RhdGUgKTsKfQokcmVzdG9yZS0+X3N0YXRlWydza2lwVW56aXAnXSA9ICRza2lwVW56aXA7CgovLyBTZXQgdXAgc3RhdGUgdmFyaWFibGVzLgppZiAoICggJ2RiJyA9PSAkcmVzdG9yZS0+X3N0YXRlWydkYXQnXVsnYmFja3VwX3R5cGUnXSApIHx8ICggZmFsc2UgPT0gJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZUZpbGVzJ10gKSApIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIGJhY2t1cCBPUiBub3QgcmVzdG9yaW5nIGZpbGVzLicgKTsKCSRyZXN0b3JlLT5fc3RhdGVbJ3RlbXBQYXRoJ10gPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L3RlbXBfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMiApIC4gJy8nOwoJJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10gPSAkcmVzdG9yZS0+X3N0YXRlWyd0ZW1wUGF0aCddOwoJcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCAkcmVzdG9yZS0+X3N0YXRlWydyZXN0b3JlRmlsZVJvb3QnXSwgJGRpZSA9IGZhbHNlICk7Cn0gZWxzZSB7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZXN0b3JpbmcgZmlsZXMuJyApOwoJJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10gPSBBQlNQQVRIOyAvLyBSZXN0b3JlIGZpbGVzIGludG8gY3VycmVudCByb290Lgp9CgovLyBQYXJzZSBzdWJtaXR0ZWQgb3B0aW9ucyBmb3Igc2F2aW5nIHRvIHN0YXRlLgpmdW5jdGlvbiBwYXJzZV9vcHRpb25zKCAkcmVzdG9yZURhdGEgKSB7CgkKCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVGaWxlcycgKSApIHsgJHJlc3RvcmVEYXRhWydyZXN0b3JlRmlsZXMnXSA9IHRydWU7IH0gZWxzZSB7ICRyZXN0b3JlRGF0YVsncmVzdG9yZUZpbGVzJ10gPSBmYWxzZTsgfQoJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAncmVzdG9yZURhdGFiYXNlJyApICkgeyAkcmVzdG9yZURhdGFbJ3Jlc3RvcmVEYXRhYmFzZSddID0gdHJ1ZTsgfSBlbHNlIHsgJHJlc3RvcmVEYXRhWydyZXN0b3JlRGF0YWJhc2UnXSA9IGZhbHNlOyB9CglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdtaWdyYXRlSHRhY2Nlc3MnICkgKSB7ICRyZXN0b3JlRGF0YVsnbWlncmF0ZUh0YWNjZXNzJ10gPSB0cnVlOyB9IGVsc2UgeyAkcmVzdG9yZURhdGFbJ21pZ3JhdGVIdGFjY2VzcyddID0gZmFsc2U7IH0KCQoJaWYgKCAoICdhbGwnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ppcE1ldGhvZFN0cmF0ZWd5JyApICkgfHwgKCAnemlwYXJjaGl2ZScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnemlwTWV0aG9kU3RyYXRlZ3knICkgKSB8fCAoICdwY2x6aXAnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ppcE1ldGhvZFN0cmF0ZWd5JyApICkgKSB7CgkJJHJlc3RvcmVEYXRhWyd6aXBNZXRob2RTdHJhdGVneSddID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnemlwTWV0aG9kU3RyYXRlZ3knICk7Cgl9CgkKCS8qCglpZiAoICggaXNzZXQoICRfUE9TVFsnbG9nX2xldmVsJ10gKSApICYmICggJF9QT1NUWydsb2dfbGV2ZWwnXSAhPSAnJyApICkgewoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX2xldmVsJ10gPSAkX1BPU1RbJ2xvZ19sZXZlbCddOwoJfSBlbHNlIHsKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddID0gJyc7Cgl9CgkqLwoJCglyZXR1cm4gJHJlc3RvcmVEYXRhOwoJCn0gLy8gRW5kIHBhcnNlX29wdGlvbnMoKS4KCgovLyBUdXJuIG9uIG1haW50ZW5hbmNlIG1vZGUgZm9yIFdvcmRQcmVzcyB0byBwcmV2ZW50IGJyb3dzaW5nIHRoZSBzaXRlIHVudGlsIGl0IGlzIGZ1bGx5IGltcG9ydGVkLgokcmVzdG9yZS0+bWFpbnRlbmFuY2VPbigpOwoKCmlmICggdHJ1ZSAhPT0gJHJlc3RvcmUtPl9zdGF0ZVsnc2tpcFVuemlwJ10gKSB7CgoJLy8gVW56aXAgYmFja3VwIGFyY2hpdmUuIEZvciBEQi1vbmx5IG9ubHkgcmVzdG9yZXMgU1FMIGZpbGVzIHRvIHRlbXAgZGlyZWN0b3J5LiBGb3IgZmlsZXMsIHVuemlwcyBhbGwgdG8gQUJTUEFUSC4KCSRyZXN1bHRzID0gJHJlc3RvcmUtPnJlc3RvcmVGaWxlcygpOwoJaWYgKCB0cnVlICE9PSAkcmVzdWx0cyApIHsgLy8gVW56aXAgZmFpbGVkLgoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ZpbGUgZXh0cmFjdGlvbiBwcm9jZXNzIGRpZCBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LiBVbmFibGUgdG8gY29udGludWUgdG8gbmV4dCBzdGVwLiBNYW51YWxseSBleHRyYWN0IHRoZSBiYWNrdXAgWklQIGZpbGUgYW5kIGNob29zZSB0byAiU2tpcCBGaWxlIEV4dHJhY3Rpb24iIGZyb20gdGhlIGFkdmFuY2VkIG9wdGlvbnMgb24gU3RlcCAxLiBEZXRhaWxzOiAnIC4gJHJlc3RvcmUtPmdldEVycm9ycygpLCB0cnVlLCAnOTAwNScgKTsKCQkKCX0gZWxzZSB7IC8vIFVuemlwIHN1Y2Nlc3MuCgkJCgkJZWNobyAiPHNjcmlwdD5iYl9hY3Rpb24oICd1bnppcFN1Y2Nlc3MnICk7PC9zY3JpcHQ+IjsKCQkKCQlpZiAoIGZhbHNlID09PSAkcmVzdG9yZS0+X3N0YXRlWydyZXN0b3JlRmlsZXMnXSApIHsgLy8gU2tpcCByZXN0b3JpbmcgZmlsZXMuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NLSVBQSU5HIHJlc3RvcmUgb2YgZmlsZXMgYmFzZWQgb24gc2V0dGluZ3MgZnJvbSBTdGVwIDEuJyApOwoJCQllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2ZpbGVzUmVzdG9yZVNraXBwZWQnICk7PC9zY3JpcHQ+IjsKCQl9IGVsc2UgeyAvLyBVbnppcCBhbGwgZmlsZXMgYW5kL29yIGRhdGFiYXNlIHNxbCBmaWxlcy4KCQkJZWNobyAiPHNjcmlwdD5iYl9hY3Rpb24oICdmaWxlc1Jlc3RvcmVTdWNjZXNzJyApOzwvc2NyaXB0PiI7CgkJfQoKCX0KCQp9IGVsc2UgewoJJHJlc3VsdHMgPSB0cnVlOwoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29tcGxldGVseSBza2lwcGluZyBBTEwgZmlsZSBleHRyYWN0aW9uIGJhc2VkIG9uIHNraXBVbnppcCBhZHZhbmNlZCBzZXR0aW5nLicgKTsKCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZmlsZXNSZXN0b3JlU2tpcHBlZCcgKTs8L3NjcmlwdD4iOwp9CgoKLy8gT24gdW56aXAgc3VjY2VzcyBPUiBza2lwcGluZyB1bnppcC4KcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoaW5nIHN0ZXAgMi4nICk7CmlmICggKCBmYWxzZSA9PT0gJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZUZpbGVzJ10gKSB8fCAoIHRydWUgPT09ICRyZXN1bHRzICkgKSB7CgkkcmVzdG9yZS0+cmVuYW1lSHRhY2Nlc3NUZW1wKCk7IC8vIFJlbmFtZSAuaHRhY2Nlc3MgdG8gLmh0YWNjZXNzLmJiX3RlbXAgdW50aWwgZW5kIG9mIG1pZ3JhdGlvbi4KCS8vc2xlZXAoMSk7IC8vIEdpdmUgdGltZSBmb3IgZmlsZSByZW5hbWU/CgkkcmVzdG9yZS0+ZGV0ZXJtaW5lRGF0YWJhc2VGaWxlcygpOwoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQWJvdXQgdG8gbG9hZCBTdGVwIDMuJyApOwoJPz4KCTxzY3JpcHQ+CgkJc2V0VGltZW91dCggZnVuY3Rpb24oKXsKCQkJcGFnZVRpdGxlKCAnU3RlcCAzOiBEYXRhYmFzZSBTZXR0aW5ncycgKTsKCQkJYmJfc2hvd1N0ZXAoICdkYXRhYmFzZVNldHRpbmdzJywgPD9waHAgZWNobyBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApOyA/PiApOwoJCX0sIDIwMDApOwoJPC9zY3JpcHQ+Cgk8P3BocAp9CgoKLy8gTG9hZCBmb290ZXIuCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2Zvb3RlcicpOwoKLy8gRGVwbG95bWVudCBwcm9jZWVkLgppZiAoICd0cnVlJyA9PSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCSRuZXh0U3RlcE51bSA9IDQ7CgllY2hvICc8IS0tIEFVVE9QUk9DRUVEIFRPIFNURVAgJyAuICRuZXh0U3RlcE51bSAuICcgLS0+JzsKCQoJCgkvL2VjaG8gJzxzY3JpcHQ+Y29uc29sZS5sb2coICInIC4gcHJpbnRfciggJHJlc3RvcmUtPl9zdGF0ZSwgdHJ1ZSApIC4gJyIgKTs8L3NjcmlwdD4nOwoJCgkKCS8vIFdyaXRlIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGVzLgoJZ2xvYmFsICRpbXBvcnRidWRkeV9maWxlOwoJJGltcG9ydEZpbGVTZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKCSRzdGF0ZV9maWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS0nIC4gJGltcG9ydEZpbGVTZXJpYWwgLiAnLXN0YXRlLnBocCc7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXcml0aW5nIHRvIHN0YXRlIGZpbGUgYCcgLiAkc3RhdGVfZmlsZSAuICdgLicgKTsKCWlmICggZmFsc2UgPT09ICggJGZpbGVfaGFuZGxlID0gQGZvcGVuKCAkc3RhdGVfZmlsZSwgJ3cnICkgKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzMyODkzNzogVGVtcCBzdGF0ZSBmaWxlIGlzIG5vdCBjcmVhdGFibGUvd3JpdGFibGUuIENoZWNrIHlvdXIgcGVybWlzc2lvbnMuICgnIC4gJHN0YXRlX2ZpbGUgLiAnKScgKTsKCQlyZXR1cm4gZmFsc2U7Cgl9CglpZiAoIGZhbHNlID09PSBmd3JpdGUoICRmaWxlX2hhbmRsZSwgIjw/cGhwIGRpZSgnQWNjZXNzIERlbmllZC4nKTsgLy8gPCEtLSA/PlxuIiAuIGJhc2U2NF9lbmNvZGUoIHNlcmlhbGl6ZSggJHJlc3RvcmUtPl9zdGF0ZSApICkgKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzIzODkzNzM6IFVuYWJsZSB0byB3cml0ZSB0byBzdGF0ZSBmaWxlLicgKTsKCX0gZWxzZSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnV3JvdGUgdG8gc3RhdGUgZmlsZS4nICk7Cgl9CglmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJPz4KCTxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSI/YWpheD08P3BocCBlY2hvICRuZXh0U3RlcE51bTsgPz4mdj08P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAndicgKTsgPz4mZGVwbG95PXRydWUmZGlzcGxheV9tb2RlPWVtYmVkIiBpZD0iZGVwbG95LWF1dG9Qcm9jZWVkIj4KCQk8IS0tIGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIHZhbHVlPSI8P3BocCAvL2VjaG8gYmFzZTY0X2VuY29kZSggdXJsZW5jb2RlKCBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApICkgKTsgPz4iIC0tPgoJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Im15LXN1Ym1pdCIgdmFsdWU9Ik5leHQgU3RlcCIgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiPgoJPC9mb3JtPgoJPHNjcmlwdD5qUXVlcnkoICcjZGVwbG95LWF1dG9Qcm9jZWVkJyApLnN1Ym1pdCgpOzwvc2NyaXB0PgoJPD9waHAKfQo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/2.php,importbuddy/controllers/ajax/2.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/4.php,importbuddy/controllers/ajax/4.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5OjpzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoIHRydWUgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ19pZnJhbWVfaGVhZGVyJyk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCA0OiBSZXN0b3JpbmcgRGF0YWJhc2UnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBzdGVwIDQuJyApOwpwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsgLy8gZGVwbG95bWVudCBtb2RlIHByZS1sb2FkcyBzdGF0ZSBkYXRhIGluIGEgZmlsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgdmlhIHBvc3QuCgkvLyBQYXJzZSBzdWJtaXR0ZWQgcmVzdG9yZURhdGEgcmVzdG9yZSBzdGF0ZSBmcm9tIHByZXZpb3VzIHN0ZXAuCgkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKTsKCWlmICggTlVMTCA9PT0gKCAkcmVzdG9yZURhdGEgPSBqc29uX2RlY29kZSggdXJsZGVjb2RlKCBiYXNlNjRfZGVjb2RlKCAkcmVzdG9yZURhdGEgKSApLCB0cnVlICkgKSApIHsgLy8gQWxsIHRoZSBlbmNvZGluZy9kZWNvZGluZyBkdWUgdG8gVVRGOCBnZXR0aW5nIG11Y2tlZCB1cCBhbG9uZyB0aGUgd2F5IHdpdGhvdXQgYWxsIHRoZXNlIGxheWVycy4gQmxlY2ghCgkJJG1lc3NhZ2UgPSAnRVJST1IgIzgzODkzYTogdW5hYmxlIHRvIGRlY29kZSBKU09OIHJlc3RvcmUgZGF0YSBgJyAuIGh0bWxlbnRpdGllcyggJHJlc3RvcmVEYXRhICkgLiAnYC4gUmVzdG9yZSBoYWx0ZWQuJzsKCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2pzb25fbGFzdF9lcnJvcicgKSApIHsKCSAJCSRtZXNzYWdlIC49ICcganNvbl9sYXN0X2Vycm9yOiBgJyAuIGpzb25fbGFzdF9lcnJvcigpIC4gJ2AuJzsKCSAJfQoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lc3NhZ2UgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCWRpZSgpOwoJfQoJCn0gZWxzZSB7CglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSAmJiAoIGNvdW50KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSA+IDAgKSApIHsgLy8gRGVmYXVsdCBzdGF0ZSBvdmVycmlkZXMgZXhpc3QuIEFwcGx5IHRoZW0uCgkJJHJlc3RvcmVEYXRhID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddOwoJfSBlbHNlIHsKCQlkaWUoICdFcnJvciAjNDY0MzIyNTogTWlzc2luZyBleHBlY3RlZCBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlLicgKTsKCX0KfQoKCgovLyBJbnN0YW50aWF0ZSByZXN0b3JlIGNsYXNzLgpyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL3Jlc3RvcmUucGhwJyApOwokcmVzdG9yZSA9IG5ldyBiYWNrdXBidWRkeV9yZXN0b3JlKCAncmVzdG9yZScsICRyZXN0b3JlRGF0YSApOwp1bnNldCggJHJlc3RvcmVEYXRhICk7IC8vIEFjY2VzcyB2aWEgJHJlc3RvcmUtPl9zdGF0ZSB0byBtYWtlIHN1cmUgaXQgaXMgYWx3YXlzIHVwIHRvIGRhdGUuCgoKaWYgKCBmYWxzZSA9PT0gJHJlc3RvcmUtPl9zdGF0ZVsncmVzdG9yZURhdGFiYXNlJ10gKSB7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSByZXN0b3JlIFNLSVBQRUQgYmFzZWQgb24gU3RlcCAxIHNldHRpbmdzLicgKTsKCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZGF0YWJhc2VSZXN0b3JlU2tpcHBlZCcgKTs8L3NjcmlwdD4iOwp9IGVsc2UgewoJCgkvLyBDb25uZWN0IEltcG9ydEJ1ZGR5IHRvIHRoZSBkYXRhYmFzZSB3aXRoIHRoZXNlIHNldHRpbmdzLgoJJHJlc3RvcmUtPmNvbm5lY3REYXRhYmFzZSgpOwoJCgkKCS8vIENBVVRJT046IFdpcGUgZGF0YWJhc2UgdGFibGVzIHdpdGggbWF0Y2hpbmcgcHJlZml4IGlmIG9wdGlvbiB3YXMgc2VsZWN0ZWQuCglpZiAoIFRSVUUgPT09ICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnd2lwZVByZWZpeCddICkgewoJCWlmICggKCAhIGlzc2V0KCAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZUZpbGVzJ10gKSApICYmICggJycgPT0gJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVQb2ludCddICkgKSB7IC8vIE9ubHkgZG8gdGhpcyBpZiBub3QgaW4gcHJvY2VzcyBvZiByZXN1bWluZy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnV2lwaW5nIGV4aXN0aW5nIGRhdGFiYXNlIHRhYmxlcyB3aXRoIHRoZSBwcmVmaXggYCcgLiAgJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXSAuICdgIGJhc2VkIG9uIHNldHRpbmdzLi4uJyApOwoJCQlpZiAoIFRSVUUgIT09IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snaW1wb3J0J10tPndpcGVQcmVmaXgoICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J10sIFRSVUUgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gd2lwZSBkYXRhYmFzZSB0YWJsZXMgbWF0Y2hpbmcgcHJlZml4LicgKTsKCQkJfQoJCX0KCX0KCQoJCgkvLyBEQU5HRVI6IFdpcGUgZGF0YWJhc2Ugb2YgQUxMIFRBQkxFUyBpZiBvcHRpb24gd2FzIHNlbGVjdGVkLgoJaWYgKCBUUlVFID09PSAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3dpcGVEYXRhYmFzZSddICkgewoJCWlmICggKCAhIGlzc2V0KCAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZUZpbGVzJ10gKSApICYmICggJycgPT0gJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVQb2ludCddICkgKSB7IC8vIE9ubHkgZG8gdGhpcyBpZiBub3QgaW4gcHJvY2VzcyBvZiByZXN1bWluZy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnV2lwaW5nIEFMTCBleGlzdGluZyBkYXRhYmFzZSB0YWJsZXMgYmFzZWQgb24gc2V0dGluZ3MgKHVzZSB3aXRoIGNhdXRpb24pLi4uJyApOwoJCQlpZiAoIFRSVUUgIT09IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snaW1wb3J0J10tPndpcGVEYXRhYmFzZSggVFJVRSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byB3aXBlIGVudGlyZSBkYXRhYmFzZSBhcyBjb25maWd1cmVkIGluIHRoZSBzZXR0aW5ncy4nICk7CgkJCX0KCQl9Cgl9CgoJLy8gUmVzdG9yZSB0aGUgZGF0YWJhc2UuCglpZiAoICd0cnVlJyA9PSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCQkvLyBEcm9wIGFueSBwcmV2aW91cyBpbmNvbXBsZXRlIGRlcGxveW1lbnQgLyByb2xsYmFjayB0YWJsZXMuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHJvcHBpbmcgYW55IGV4aXN0aW5nIHRlbXBvcmFyeSBkZXBsb3ltZW50IG9yIHJvbGxiYWNrIHRhYmxlcy4nICk7CgkJaWYgKCBmYWxzZSAhPT0gKCAkcmVzdWx0cyA9IG15c3FsX3F1ZXJ5KCAiU0VMRUNUIHRhYmxlX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFICggKCB0YWJsZV9uYW1lIExJS0UgJ0JCbmV3LVxfJScgKSBPUiAoIHRhYmxlX25hbWUgTElLRSAnQkJvbGQtXF8lJyApICkgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiICkgKSApIHsKCQkJd2hpbGUoICRyZXN1bHQgPSBteXNxbF9mZXRjaF9yb3coICRyZXN1bHRzICkgKSB7CgkJCQlpZiAoIGZhbHNlID09PSBteXNxbF9xdWVyeSggIkRST1AgVEFCTEUgYCIgLiBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoICRyZXN1bHRbMF0gKSAuICJgIikgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXJyb3IgIzg0OTM5ODQ6IFVuYWJsZSB0byBkcm9wIHRlbXAgcm9sbGJhY2svZGVwbG95IHRhYmxlIGAnIC4gJHJlc3VsdFsndGFibGVfbmFtZSddIC4gJ2AuJyApOwoJCQkJfQoJCQl9CgkJfQoJCQoJCSRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsndGVtcFByZWZpeCddID0gJ0JCbmV3LScgLiBzdWJzdHIoICRyZXN0b3JlLT5fc3RhdGVbJ3NlcmlhbCddLCAwLCA0ICkgLiAnXycgLiAkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddOwoJfQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Fib3V0IHRvIHJlc3RvcmUgZGF0YWJhc2UuJyApOwoJCgkKCSRyZXN0b3JlUmVzdWx0ID0gJHJlc3RvcmUtPnJlc3RvcmVEYXRhYmFzZSggJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd0ZW1wUHJlZml4J10gKTsKCQoJCgkKCWlmICggJ3RydWUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgewoJCQoJCWlmICggaXNfYXJyYXkoICRyZXN0b3JlUmVzdWx0ICkgKSB7IC8vIENodW5raW5nLiBSZXN1bWUgc2FtZSBzdGVwLgoJCQkkbmV4dFN0ZXBOdW0gPSA0OwoJCX0gZWxzZSB7IC8vIE5leHQgc3RlcC4KCQkJJG5leHRTdGVwTnVtID0gNTsKCQl9CgkJZWNobyAnPCEtLSBBVVRPUFJPQ0VFRCBUTyBTVEVQICcgLiAkbmV4dFN0ZXBOdW0gLiAnIC0tPic7CgkJCgkJCgkJLy9lY2hvICc8c2NyaXB0PmNvbnNvbGUubG9nKCAiJyAuIHByaW50X3IoICRyZXN0b3JlLT5fc3RhdGUsIHRydWUgKSAuICciICk7PC9zY3JpcHQ+JzsKCQkKCQkKCQkvLyBXcml0ZSBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlcy4KCQlnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CgkJJGltcG9ydEZpbGVTZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKCQkkc3RhdGVfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRGaWxlU2VyaWFsIC4gJy1zdGF0ZS5waHAnOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dyaXRpbmcgdG8gc3RhdGUgZmlsZSBgJyAuICRzdGF0ZV9maWxlIC4gJ2AuJyApOwoJCWlmICggZmFsc2UgPT09ICggJGZpbGVfaGFuZGxlID0gQGZvcGVuKCAkc3RhdGVfZmlsZSwgJ3cnICkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICMyODM0NjQ6IFRlbXAgc3RhdGUgZmlsZSBpcyBub3QgY3JlYXRhYmxlL3dyaXRhYmxlLiBDaGVjayB5b3VyIHBlcm1pc3Npb25zLiAoJyAuICRzdGF0ZV9maWxlIC4gJyknICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaWYgKCBmYWxzZSA9PT0gZndyaXRlKCAkZmlsZV9oYW5kbGUsICI8P3BocCBkaWUoJ0FjY2VzcyBEZW5pZWQuJyk7IC8vIDwhLS0gPz5cbiIgLiBiYXNlNjRfZW5jb2RlKCBzZXJpYWxpemUoICRyZXN0b3JlLT5fc3RhdGUgKSApICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjMjM4OTM3MzogVW5hYmxlIHRvIHdyaXRlIHRvIHN0YXRlIGZpbGUuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dyb3RlIHRvIHN0YXRlIGZpbGUuJyApOwoJCX0KCQlmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCT8+CgkJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9hamF4PTw/cGhwIGVjaG8gJG5leHRTdGVwTnVtOyA/PiZ2PTw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd2JyApOyA/PiZkZXBsb3k9dHJ1ZSZkaXNwbGF5X21vZGU9ZW1iZWQiIGlkPSJkZXBsb3ktYXV0b1Byb2NlZWQiPgoJCQk8IS0tIGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIHZhbHVlPSI8P3BocCAvL2VjaG8gYmFzZTY0X2VuY29kZSggdXJsZW5jb2RlKCBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApICkgKTsgPz4iIC0tPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJteS1zdWJtaXQiIHZhbHVlPSJOZXh0IFN0ZXAiIHN0eWxlPSJ2aXNpYmlsaXR5OiBoaWRkZW47Ij4KCQk8L2Zvcm0+CgkJPHNjcmlwdD5qUXVlcnkoICcjZGVwbG95LWF1dG9Qcm9jZWVkJyApLnN1Ym1pdCgpOzwvc2NyaXB0PgoJCTw/cGhwCgkJCgl9IGVsc2UgeyAvLyBOb3JtYWwgaW1wb3J0LgoJCQoJCWlmICggVFJVRSAhPT0gJHJlc3RvcmVSZXN1bHQgKSB7CgkJCWlmICggaXNfYXJyYXkoICRyZXN0b3JlUmVzdWx0ICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSByZXN0b3JlIGRpZCBub3QgZnVsbHkgY29tcGxldGUgaW4gZmlyc3QgcGFzcy4gQ2h1bmtpbmcgaW4gcHJvZ3Jlc3MuIFJlc3VtaW5nIHdoZXJlIGxlZnQgb2ZmLiBJZiB0aGUgcHJvY2VzcyBkb2VzIG5vdCBwcm9jZWVkIGNoZWNrIHlvdXIgYnJvd3NlciBlcnJvciBjb25zb2xlIG9yIFBIUCBlcnJvciBsb2cuJyApOwoJCQkJPz4KCgkJCQk8Zm9ybSBpZD0icmVzdG9yZUNodW5rRm9ybSIgbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9hamF4PTQiPgoJCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJlc3RvcmVEYXRhIiB2YWx1ZT0iPD9waHAgZWNobyBiYXNlNjRfZW5jb2RlKCB1cmxlbmNvZGUoIGpzb25fZW5jb2RlKCAkcmVzdG9yZS0+X3N0YXRlICkgKSApOyA/PiI+CgkJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0ic3VibWl0Rm9ybSIgY2xhc3M9ImJ1dHRvbiBidXR0b24tcHJpbWFyeSIgdmFsdWU9Ik5leHQgU3RlcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KCQkJCTwvZm9ybT4KCQkJCTxzY3JpcHQ+CgkJCQkJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkJCQkJalF1ZXJ5KCAnI3Jlc3RvcmVDaHVua0Zvcm0nICkuc3VibWl0KCk7CgkJCQkJfSk7CgkJCQk8L3NjcmlwdD4KCQkJPD9waHAKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciByZXN0b3JpbmcgZGF0YWJhc2UuIFNlZSBzdGF0dXMgbG9nIGZvciBkZXRhaWxzLicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIHJlc3RvcmUgZmFpbGVkLicgKTsKCQkJCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZGF0YWJhc2VSZXN0b3JlRmFpbGVkJyApOzwvc2NyaXB0PiI7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJCgkJCQoJCQlyZXR1cm47CgkJfSBlbHNlIHsgLy8gU3VjY2Vzcy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgcmVzdG9yZSBjb21wbGV0ZWQuJyApOwoJCQllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2RhdGFiYXNlUmVzdG9yZVN1Y2Nlc3MnICk7PC9zY3JpcHQ+IjsKCQl9CgkJCgl9Cn0KCgpwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hpbmcgc3RlcCA0LicgKTsKZWNobyAiPHNjcmlwdD4KCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7CgkJcGFnZVRpdGxlKCAnU3RlcCA1OiBTaXRlIFVSTCBTZXR0aW5ncycgKTsKCQliYl9zaG93U3RlcCggJ3VybFJlcGxhY2VTZXR0aW5ncycsICIgLiBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApIC4gIiApOwoJfSwgMjAwMCApOwoJPC9zY3JpcHQ+IjsKCgpwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnX2lmcmFtZV9mb290ZXInKTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/4.php,importbuddy/controllers/ajax/4.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/5.php,importbuddy/controllers/ajax/5.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5OjpzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoIHRydWUgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ19pZnJhbWVfaGVhZGVyJyk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCA1OiBNaWdyYXRpbmcgRGF0YWJhc2UnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBzdGVwIDUuJyApOwplY2hvICI8c2NyaXB0PmJiX3Nob3dTdGVwKCAnbWlncmF0aW5nRGF0YWJhc2UnICk7PC9zY3JpcHQ+IjsKcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoKCi8vIEZpbmFsIGZ1bmN0aW9ucyB0byBydW4gYWZ0ZXIgREIgbWlncmF0aW9uIGlzIGRvbmUuIEluIGZ1bmN0aW9uIHNpbmNlIHRoaXMgaXMgY2FsbGVkIGJvdGggaW4gc3RhbmRhcmQgYW5kIGF0IGVuZCBvZiBkZXBsb3ltZW50LgpmdW5jdGlvbiBmaW5hbEFjdGlvbnMoICRyZXN0b3JlICkgewoJCgkvLyBSZW5hbWUgLmh0YWNjZXNzLmJiX3RlbXAgYmFjayB0byAuaHRhY2Nlc3MuCgkkcmVzdG9yZS0+cmVuYW1lSHRhY2Nlc3NUZW1wQmFjaygpOwoJCgkvLyBSZW1vdmUgYW55IHRlbXBvcmFyeSAubWFpbnRlbmFuY2UgZmlsZSBjcmVhdGVkIGJ5IEltcG9ydEJ1ZGR5LgoJJHJlc3RvcmUtPm1haW50ZW5hbmNlT2ZmKCAkb25seU91ckNyZWF0ZWRGaWxlID0gdHJ1ZSApOwoJCgkvLyBSZW1vdmUgYW55IHRlbXBvcmFyeSBpbmRleC5odG0gZmlsZSBjcmVhdGVkIGJ5IEltcG9ydEJ1ZGR5LgoJJHJlc3RvcmUtPnNjcnViSW5kZXhGaWxlcygpOwoJCgkvLyBUT0RPOiBNYWtlIHRoZXNlIHRobmluZ3MgYmUgYWJsZSB0byBvdXRwdXQgc3R1ZmYgaW50byB0aGUgY2xlYW51cFNldHRpbmdzLmVqcyB0ZW1wbGF0ZS4gQWRkIGZ1bmN0aW9ucz8KCS8vIFVwZGF0ZSB3cGNvbmZpZyBpZiBuZWVkZWQuCgkkd3Bjb25maWdfcmVzdWx0ID0gJHJlc3RvcmUtPm1pZ3JhdGVXcENvbmZpZygpOwoJaWYgKCAkd3Bjb25maWdfcmVzdWx0ICE9PSB0cnVlICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yOiBVbmFibGUgdG8gdXBkYXRlIHdwLWNvbmZpZy5waHAgZmlsZS4gVmVyaWZ5IHdyaXRlIHBlcm1pc3Npb25zIGZvciB0aGUgd3AtY29uZmlnLnBocCBmaWxlIHRoZW4gcmVmcmVzaCB0aGlzIHBhZ2UuIFlvdSBtYXkgbWFudWFsbHkgdXBkYXRlIHlvdXIgd3AtY29uZmlnLnBocCBmaWxlIGJ5IGNoYW5naW5nIGl0IHRvIHRoZSBmb2xsb3dpbmc6PHRleHRhcmVhIHJlYWRvbmx5PSJyZWFkb25seSIgc3R5bGU9IndpZHRoOiA4MCU7Ij4nIC4gJHdwY29uZmlnX3Jlc3VsdCAuICc8L3RleHRhcmVhPicgKTsKCX0KCQoJLy8gU2NhbiBmb3IgJ3Ryb3VibGUnIHN1Y2ggYXMgYSByZW1haW5pbmcgLm1haW50ZW5hbmNlIGZpbGUsIGluZGV4Lmh0bSwgaW5kZXguaHRtbCwgbWlzc2luZyB3cC1jb25maWcucGhwLCBtaXNzaW5nIC5odGFjY2VzcywgZXRjIGV0Yy4KCSRwcm9ibGVtcyA9ICRyZXN0b3JlLT50cm91YmxlU2NhbigpOwoJaWYgKCBjb3VudCggJHByb2JsZW1zICkgPiAwICkgewoJCSRyZXN0b3JlLT5fc3RhdGVbJ3BvdGVudGlhbFByb2JsZW1zJ10gPSAkcHJvYmxlbXM7CgkJJHRyb3VibGVfdGV4dCA9ICcnOwoJCWZvcmVhY2goICRwcm9ibGVtcyBhcyAkcHJvYmxlbSApIHsKCQkJJHRyb3VibGVfdGV4dCAuPSAnPGxpPicgLiAkcHJvYmxlbSAuICc8L2xpPic7CgkJfQoJCSR0cm91YmxlX3RleHQgPSAnPHVsPicgLiAkdHJvdWJsZV90ZXh0IC4gJzwvdWw+JzsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdPbmUgb3IgbW9yZSBwb3RlbnRpYWwgaXNzdWVzIGRldGVjdGVkIHRoYXQgbWF5IHJlcXVpcmUgeW91ciBhdHRlbnRpb246ICcgLiAkdHJvdWJsZV90ZXh0ICk7Cgl9CgkKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIGZpbmFsIGFjdGlvbnMgZnVuY3Rpb24uJyApOwoJCn0gLy8gRW5kIGZpbmFsQWN0aW9ucygpLgoKCgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsgLy8gZGVwbG95bWVudCBtb2RlIHByZS1sb2FkcyBzdGF0ZSBkYXRhIGluIGEgZmlsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgdmlhIHBvc3QuCgkvLyBQYXJzZSBzdWJtaXR0ZWQgcmVzdG9yZURhdGEgcmVzdG9yZSBzdGF0ZSBmcm9tIHByZXZpb3VzIHN0ZXAuCgkkcmVzdG9yZURhdGEgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdyZXN0b3JlRGF0YScgKTsKCWlmICggTlVMTCA9PT0gKCAkcmVzdG9yZURhdGEgPSBqc29uX2RlY29kZSggdXJsZGVjb2RlKCBiYXNlNjRfZGVjb2RlKCAkcmVzdG9yZURhdGEgKSApLCB0cnVlICkgKSApIHsgLy8gQWxsIHRoZSBlbmNvZGluZy9kZWNvZGluZyBkdWUgdG8gVVRGOCBnZXR0aW5nIG11Y2tlZCB1cCBhbG9uZyB0aGUgd2F5IHdpdGhvdXQgYWxsIHRoZXNlIGxheWVycy4gQmxlY2ghCgkJJG1lc3NhZ2UgPSAnRVJST1IgIzgzODkzYjogdW5hYmxlIHRvIGRlY29kZSBKU09OIHJlc3RvcmUgZGF0YSBgJyAuIGh0bWxlbnRpdGllcyggJHJlc3RvcmVEYXRhICkgLiAnYC4gUmVzdG9yZSBoYWx0ZWQuJzsKCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2pzb25fbGFzdF9lcnJvcicgKSApIHsKCSAJCSRtZXNzYWdlIC49ICcganNvbl9sYXN0X2Vycm9yOiBgJyAuIGpzb25fbGFzdF9lcnJvcigpIC4gJ2AuJzsKCSAJfQoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lc3NhZ2UgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCWRpZSgpOwoJfQoJCn0gZWxzZSB7CglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSAmJiAoIGNvdW50KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSA+IDAgKSApIHsgLy8gRGVmYXVsdCBzdGF0ZSBvdmVycmlkZXMgZXhpc3QuIEFwcGx5IHRoZW0uCgkJJHJlc3RvcmVEYXRhID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddOwoJfSBlbHNlIHsKCQlkaWUoICdFcnJvciAjODQzNzk3OTQ0OiBNaXNzaW5nIGV4cGVjdGVkIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGUuJyApOwoJfQp9CgoKCgoKCi8vIEluc3RhbnRpYXRlIHJlc3RvcmUgY2xhc3MuCnJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvcmVzdG9yZS5waHAnICk7CiRyZXN0b3JlID0gbmV3IGJhY2t1cGJ1ZGR5X3Jlc3RvcmUoICdyZXN0b3JlJywgJHJlc3RvcmVEYXRhICk7CnVuc2V0KCAkcmVzdG9yZURhdGEgKTsgLy8gQWNjZXNzIHZpYSAkcmVzdG9yZS0+X3N0YXRlIHRvIG1ha2Ugc3VyZSBpdCBpcyBhbHdheXMgdXAgdG8gZGF0ZS4KaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIFdlIGRvbnQgYWNjZXB0IHN1Ym1pdHRlZCBmb3JtIG9wdGlvbnMgZHVyaW5nIGRlcGxveS4KCSRyZXN0b3JlLT5fc3RhdGUgPSBwYXJzZV9vcHRpb25zKCAkcmVzdG9yZS0+X3N0YXRlICk7Cn0KCi8qCmVjaG8gJzxwcmU+JzsKcHJpbnRfciggJHJlc3RvcmUtPl9zdGF0ZSApOwplY2hvICc8L3ByZT4nOwoqLwoKLy8gUGFyc2Ugc3VibWl0dGVkIG9wdGlvbnMvc2V0dGluZ3MuCmZ1bmN0aW9uIHBhcnNlX29wdGlvbnMoICRyZXN0b3JlRGF0YSApIHsKCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ21pZ3JhdGVEYXRhYmFzZScgKSApIHsgJHJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZSddID0gdHJ1ZTsgfSBlbHNlIHsgJHJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZSddID0gZmFsc2U7IH0KCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnICkgKSB7ICRyZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlRGF0YWJhc2VCcnV0ZUZvcmNlJ10gPSB0cnVlOyB9IGVsc2UgeyAkcmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZURhdGFiYXNlQnJ1dGVGb3JjZSddID0gZmFsc2U7IH0KCgkkcmVzdG9yZURhdGFbJ3NpdGV1cmwnXSA9IHByZWdfcmVwbGFjZSggJ3wvKiR8JywgJycsIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3NpdGV1cmwnICkgKTsgLy8gU3RyaXAgdHJhaWxpbmcgc2xhc2hlcy4KCSRyZXN0b3JlRGF0YVsnaG9tZXVybCddID0gcHJlZ19yZXBsYWNlKCAnfC8qJHwnLCAnJywgcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnaG9tZXVybCcgKSApOyAvLyBTdHJpcCB0cmFpbGluZyBzbGFzaGVzLgoJaWYgKCAnJyA9PSAkcmVzdG9yZURhdGFbJ2hvbWV1cmwnXSApIHsKCQkkcmVzdG9yZURhdGFbJ2hvbWV1cmwnXSA9ICRyZXN0b3JlRGF0YVsnc2l0ZXVybCddOwoJfQoJJHJlc3RvcmVEYXRhWydtYXhFeGVjdXRpb25UaW1lJ10gPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdtYXhfZXhlY3V0aW9uX3RpbWUnICk7CgkKCXJldHVybiAkcmVzdG9yZURhdGE7Cn0KCgovLyBNaWdyYXRlIGh0YWNjZXNzLgppZiAoIFRSVUUgIT09ICRyZXN0b3JlLT5fc3RhdGVbJ21pZ3JhdGVIdGFjY2VzcyddICkgewoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBpbmcgbWlncmF0aW9uIG9mIC5odGFjY2VzcyBmaWxlIGJhc2VkIG9uIHNldHRpbmdzLicgKTsKfSBlbHNlIHsKCSRyZXN0b3JlLT5taWdyYXRlSHRhY2Nlc3MoKTsKfQoKCmlmICggVFJVRSAhPT0gJHJlc3RvcmUtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlRGF0YWJhc2UnXSApIHsKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwaW5nIG1pZ3JhdGlvbiBvZiBkYXRhYmFzZSBiYXNlZCBvbiBhZHZhbmNlZCBzZXR0aW5ncy4nICk7CgllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2RhdGFiYXNlTWlncmF0aW9uU2tpcHBlZCcgKTs8L3NjcmlwdD4iOwoJJG1pZ3JhdGVSZXN1bHRzID0gdHJ1ZTsKfSBlbHNlIHsKCS8vIENvbm5lY3QgSW1wb3J0QnVkZHkgdG8gdGhlIGRhdGFiYXNlLgoJJHJlc3RvcmUtPmNvbm5lY3REYXRhYmFzZSgpOwoJCgkkb3ZlcnJpZGVQcmVmaXggPSAnJzsKCWlmICggJ3RydWUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgewoJCSRvdmVycmlkZVByZWZpeCA9ICRyZXN0b3JlLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsndGVtcFByZWZpeCddOwoJfQoJCglyZXF1aXJlX29uY2UoICdpbXBvcnRidWRkeS9jbGFzc2VzL19taWdyYXRlX2RhdGFiYXNlLnBocCcgKTsKCSRtaWdyYXRlID0gbmV3IGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQiggJ3N0YW5kYWxvbmUnLCAkcmVzdG9yZS0+X3N0YXRlLCAkbmV0d29ya1ByZWZpeCA9ICcnLCAkb3ZlcnJpZGVQcmVmaXggKTsKCSRtaWdyYXRlUmVzdWx0cyA9ICRtaWdyYXRlLT5taWdyYXRlKCk7CgkKCQoJCglpZiAoICd0cnVlJyA9PSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCQlpZiAoIGlzX2FycmF5KCAkbWlncmF0ZVJlc3VsdHMgKSApIHsgLy8gUmV0dXJuIHRvIHNhbWUgc3RlcCBmb3IgY29udGludWluZyBjaHVua2luZy4KCQkJJG5leHRTdGVwTnVtID0gNTsKCQl9IGVsc2UgewoJCQkKCQkJaWYgKCB0cnVlICE9PSAkcmVzdG9yZS0+c3dhcERhdGFiYXNlQkJTZXR0aW5ncygpICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICMzMjkyMzczOiBVbmFibGUgdG8gc3dhcCBvdXQgQmFja3VwQnVkZHkgc2V0dGluZ3MuLicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdoYWx0U2NyaXB0JywgJycgKTsgLy8gSGFsdCBKUyBvbiBwYWdlLgoJCQkJcmV0dXJuOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3dhcHBpbmcgQmFja3VwQnVkZHkgc2V0dGluZ3MuJyApOwoJCQl9CgkJCQoJCQkvLyBTd2FwIG91dCBuZXcgYW5kIG9sZCBkYXRhYmFzZSBwcmVmaXhlcy4KCQkJaWYgKCB0cnVlICE9PSAkcmVzdG9yZS0+c3dhcERhdGFiYXNlcygpICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4NDM3ODogVW5hYmxlIHRvIHN3YXAgb3V0IHRlbXBvcmFyeSBkYXRhYmFzZSBwcmVmaXhlcy4nICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnaGFsdFNjcmlwdCcsICcnICk7IC8vIEhhbHQgSlMgb24gcGFnZS4KCQkJCXJldHVybjsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIHN3YXBwaW5nIGRhdGFiYXNlIGJhc2VkIG9uIHRlbXBvcmFyeSBhbmQgbGl2ZSBwcmVmaXhlcy4nICk7CgkJCX0KCQkJCgkJCWZpbmFsQWN0aW9ucyggJHJlc3RvcmUgKTsKCQkJCgkJCSRuZXh0U3RlcE51bSA9IDY7CgkJfQoJCWVjaG8gJzwhLS0gQVVUT1BST0NFRUQgVE8gU1RFUCAnIC4gJG5leHRTdGVwTnVtIC4gJyAtLT4nOwoJCQoJCS8qCgkJZWNobyAnPHByZT4nOwoJCXByaW50X3IoICRyZXN0b3JlLT5fc3RhdGUgKTsKCQllY2hvICc8L3ByZT4nOwoJCSovCgkJCgkJLy8gV3JpdGUgZGVmYXVsdCBzdGF0ZSBvdmVycmlkZXMuCgkJZ2xvYmFsICRpbXBvcnRidWRkeV9maWxlOwoJCSRpbXBvcnRGaWxlU2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRpbXBvcnRidWRkeV9maWxlICk7CgkJJHN0YXRlX2ZpbGUgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0RmlsZVNlcmlhbCAuICctc3RhdGUucGhwJzsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXcml0aW5nIHRvIHN0YXRlIGZpbGUgYCcgLiAkc3RhdGVfZmlsZSAuICdgLicgKTsKCQlpZiAoIGZhbHNlID09PSAoICRmaWxlX2hhbmRsZSA9IEBmb3BlbiggJHN0YXRlX2ZpbGUsICd3JyApICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjMzI4OTM3OiBUZW1wIHN0YXRlIGZpbGUgaXMgbm90IGNyZWF0YWJsZS93cml0YWJsZS4gQ2hlY2sgeW91ciBwZXJtaXNzaW9ucy4gKCcgLiAkc3RhdGVfZmlsZSAuICcpJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmICggZmFsc2UgPT09IGZ3cml0ZSggJGZpbGVfaGFuZGxlLCAiPD9waHAgZGllKCdBY2Nlc3MgRGVuaWVkLicpOyAvLyA8IS0tID8+XG4iIC4gYmFzZTY0X2VuY29kZSggc2VyaWFsaXplKCAkcmVzdG9yZS0+X3N0YXRlICkgKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzIzODkzNzM6IFVuYWJsZSB0byB3cml0ZSB0byBzdGF0ZSBmaWxlLicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXcm90ZSB0byBzdGF0ZSBmaWxlLicgKTsKCQl9CgkJZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdEZXBsb3ltZW50IGZpbmlzaGVkLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGVwbG95RmluaXNoZWQnLCAnRmluaXNoZWQuJyApOwoJCT8+CgkJPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9hamF4PTw/cGhwIGVjaG8gJG5leHRTdGVwTnVtOyA/PiZ2PTw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd2JyApOyA/PiZkZXBsb3k9dHJ1ZSZkaXNwbGF5X21vZGU9ZW1iZWQiIGlkPSJkZXBsb3ktYXV0b1Byb2NlZWQiPgoJCQk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyZXN0b3JlRGF0YSIgdmFsdWU9Ijw/cGhwIGVjaG8gYmFzZTY0X2VuY29kZSggdXJsZW5jb2RlKCBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApICkgKTsgPz4iPgoJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJteS1zdWJtaXQiIHZhbHVlPSJOZXh0IFN0ZXAiIHN0eWxlPSJ2aXNpYmlsaXR5OiBoaWRkZW47Ij4KCQk8L2Zvcm0+CgkJPHNjcmlwdD5zZXRUaW1lb3V0KCBmdW5jdGlvbigpeyBqUXVlcnkoICcjZGVwbG95LWF1dG9Qcm9jZWVkJyApLnN1Ym1pdCgpOyB9LCAzMDAwICk7PC9zY3JpcHQ+CgkJPD9waHAKCQlyZXR1cm47Cgl9IGVsc2UgeyAvLyBTdGFuZCBpbXBvcnQKCQkKCQlpZiAoIFRSVUUgPT09ICRtaWdyYXRlUmVzdWx0cyApIHsgLy8gQ29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWlncmF0aW9uIGNvbXBsZXRlZC4nICk7CgkJCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnZGF0YWJhc2VNaWdyYXRpb25TdWNjZXNzJyApOzwvc2NyaXB0PiI7CgkJfSBlbHNlaWYgKCBpc19hcnJheSggJG1pZ3JhdGVSZXN1bHRzICkgKSB7IC8vIENodW5raW5nLgoJCQkkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVTdGVwcyddID0gJG1pZ3JhdGVSZXN1bHRzWzBdOwoJCQkkcmVzdG9yZS0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVQb2ludCddID0gJG1pZ3JhdGVSZXN1bHRzWzFdOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtaWdyYXRpb24gZGlkIG5vdCBmdWxseSBjb21wbGV0ZSBpbiBmaXJzdCBwYXNzLiBDaHVua2luZyBpbiBwcm9ncmVzcy4gUmVzdW1pbmcgd2hlcmUgbGVmdCBvZmYuJyApOwoJCQk/PgoJCQk8Zm9ybSBpZD0ibWlncmF0ZUNodW5rRm9ybSIgbWV0aG9kPSJwb3N0IiBhY3Rpb249Ij9hamF4PTQiPgoJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icmVzdG9yZURhdGEiIHZhbHVlPSI8P3BocCBlY2hvIGJhc2U2NF9lbmNvZGUoIHVybGVuY29kZSgganNvbl9lbmNvZGUoICRyZXN0b3JlLT5fc3RhdGUgKSApICk7ID8+Ij4KCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InN1Ym1pdEZvcm0iIGNsYXNzPSJidXR0b24gYnV0dG9uLXByaW1hcnkiIHZhbHVlPSJOZXh0IFN0ZXAiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJCTwvZm9ybT4KCQkJPHNjcmlwdD4KCQkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkJCQkJalF1ZXJ5KCAnI21pZ3JhdGVDaHVua0Zvcm0nICkuc3VibWl0KCk7CgkJCQl9KTsKCQkJPC9zY3JpcHQ+CgkJCTw/cGhwCgkJfSBlbHNlIHsgLy8gRmFpbGVkLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtaWdyYXRpb24gZmFpbGVkLiBSZXN1bHQ6IGAnIC4gJG1pZ3JhdGVSZXN1bHRzIC4gJ2AuJyApOwoJCQllY2hvICI8c2NyaXB0PmJiX2FjdGlvbiggJ2RhdGFiYXNlTWlncmF0aW9uRmFpbGVkJyApOzwvc2NyaXB0PiI7CgkJfQoJCQoJfQp9CgoKLy8gU3VjY2VzcyAob3IgbWlncmF0ZSB3YXMgc2tpcHBlZCkuCmlmICggdHJ1ZSA9PT0gJG1pZ3JhdGVSZXN1bHRzICkgewoJCglmaW5hbEFjdGlvbnMoICRyZXN0b3JlICk7CgkKCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGluZyBzdGVwIDUuJyApOwoJZWNobyAiPHNjcmlwdD4KCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7CgkJcGFnZVRpdGxlKCAnU3RlcCA2OiBWZXJpZnkgU2l0ZSAmIEZpbmlzaCcgKTsKCQliYl9zaG93U3RlcCggJ2NsZWFudXBTZXR0aW5ncycsICIgLiBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApIC4gIiApOwoJfSwgMjAwMCApOwoJPC9zY3JpcHQ+IjsKCQp9CgoKCgoKCnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdfaWZyYW1lX2Zvb3RlcicpOwo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/5.php,importbuddy/controllers/ajax/5.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/6.php,importbuddy/controllers/ajax/6.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCnBiX2JhY2t1cGJ1ZGR5OjpzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoIHRydWUgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ19pZnJhbWVfaGVhZGVyJyk7CmVjaG8gIjxzY3JpcHQ+cGFnZVRpdGxlKCAnU3RlcCA2OiBDbGVhbnVwICYgQ29tcGxldGlvbicgKTs8L3NjcmlwdD4iOwplY2hvICI8c2NyaXB0PmJiX3Nob3dTdGVwKCAnY2xlYW51cFNldHRpbmdzJyApOzwvc2NyaXB0PiI7CnBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoKCmlmICggJ3RydWUnICE9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgeyAvLyBkZXBsb3ltZW50IG1vZGUgcHJlLWxvYWRzIHN0YXRlIGRhdGEgaW4gYSBmaWxlIGluc3RlYWQgb2YgcGFzc2luZyB2aWEgcG9zdC4KCS8vIFBhcnNlIHN1Ym1pdHRlZCByZXN0b3JlRGF0YSByZXN0b3JlIHN0YXRlIGZyb20gcHJldmlvdXMgc3RlcC4KCSRyZXN0b3JlRGF0YSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc3RvcmVEYXRhJyApOwoJaWYgKCBOVUxMID09PSAoICRyZXN0b3JlRGF0YSA9IGpzb25fZGVjb2RlKCB1cmxkZWNvZGUoIGJhc2U2NF9kZWNvZGUoICRyZXN0b3JlRGF0YSApICksIHRydWUgKSApICkgeyAvLyBBbGwgdGhlIGVuY29kaW5nL2RlY29kaW5nIGR1ZSB0byBVVEY4IGdldHRpbmcgbXVja2VkIHVwIGFsb25nIHRoZSB3YXkgd2l0aG91dCBhbGwgdGhlc2UgbGF5ZXJzLiBCbGVjaCEKCQkkbWVzc2FnZSA9ICdFUlJPUiAjODM4OTNjOiB1bmFibGUgdG8gZGVjb2RlIEpTT04gcmVzdG9yZSBkYXRhIGAnIC4gaHRtbGVudGl0aWVzKCAkcmVzdG9yZURhdGEgKSAuICdgLiBSZXN0b3JlIGhhbHRlZC4nOwoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnanNvbl9sYXN0X2Vycm9yJyApICkgewoJIAkJJG1lc3NhZ2UgLj0gJyBqc29uX2xhc3RfZXJyb3I6IGAnIC4ganNvbl9sYXN0X2Vycm9yKCkgLiAnYC4nOwoJIAl9CgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAkbWVzc2FnZSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJZGllKCk7Cgl9Cn0gZWxzZSB7CglpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSAmJiAoIGNvdW50KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKSA+IDAgKSApIHsgLy8gRGVmYXVsdCBzdGF0ZSBvdmVycmlkZXMgZXhpc3QuIEFwcGx5IHRoZW0uCgkJJHJlc3RvcmVEYXRhID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkZWZhdWx0X3N0YXRlX292ZXJyaWRlcyddOwoJCQoJCS8qCgkJZWNobyAnPHByZT4nOwoJCXByaW50X3IoICRyZXN0b3JlRGF0YSApOwoJCWVjaG8gJzwvcHJlPic7CgkJKi8KCX0gZWxzZSB7CgkJZGllKCAnRXJyb3IgIzMyNzgzMjE6IE1pc3NpbmcgZXhwZWN0ZWQgZGVmYXVsdCBzdGF0ZSBvdmVycmlkZS4nICk7Cgl9Cn0KCi8vIEluc3RhbnRpYXRlIHJlc3RvcmUgY2xhc3MuCnJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvcmVzdG9yZS5waHAnICk7CiRyZXN0b3JlID0gbmV3IGJhY2t1cGJ1ZGR5X3Jlc3RvcmUoICdyZXN0b3JlJywgJHJlc3RvcmVEYXRhICk7CnVuc2V0KCAkcmVzdG9yZURhdGEgKTsgLy8gQWNjZXNzIHZpYSAkcmVzdG9yZS0+X3N0YXRlIHRvIG1ha2Ugc3VyZSBpdCBpcyBhbHdheXMgdXAgdG8gZGF0ZS4KaWYgKCAndHJ1ZScgIT0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdkZXBsb3knICkgKSB7IC8vIFdlIGRvbnQgYWNjZXB0IHN1Ym1pdHRlZCBmb3JtIG9wdGlvbnMgZHVyaW5nIGRlcGxveS4KCSRyZXN0b3JlLT5fc3RhdGUgPSBwYXJzZV9vcHRpb25zKCAkcmVzdG9yZS0+X3N0YXRlICk7Cn0gZWxzZSB7IC8vIERlcGxveW1lbnQgc2hvdWxkIHNsZWVwIHRvIGhlbHAgZ2l2ZSB0aW1lIGZvciB0aGUgc291cmNlIHNpdGUgdG8gZ3JhYiB0aGUgbGFzdCBzdGF0dXMgbG9nLgoJc2xlZXAoIDQgKTsKfQoKCiRmb290ZXIgPSBmaWxlX2dldF9jb250ZW50cyggcGJfYmFja3VwYnVkZHk6OiRfcGx1Z2luX3BhdGggLiAnL3ZpZXdzL19pZnJhbWVfZm9vdGVyLnBocCcgKTsKCmlmICggJ3RydWUnID09IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnZGVwbG95JyApICkgewoJZWNobyAnPGg1PkZpbmlzaGVkIGRlcGxveWluZyBwdXNoZWQgZGF0YSAmIHRlbXBvcmFyeSBmaWxlIGNsZWFudXAuPC9oNT4nOwp9CmVjaG8gIjxzY3JpcHQ+YmJfc2hvd1N0ZXAoICdmaW5pc2hlZCcsICIgLiBqc29uX2VuY29kZSggJHJlc3RvcmUtPl9zdGF0ZSApIC4gIiApOzwvc2NyaXB0PiI7CnNsZWVwKCAzICk7CgpjbGVhbnVwKCAkcmVzdG9yZS0+X3N0YXRlICk7CgplY2hvICRmb290ZXI7IC8vIFdlIG11c3QgcHJlbG9hZCB0aGUgZm9vdGVyIGZpbGUgY29udGVudHMgc2luY2Ugd2UgYXJlIGFib3V0IHRvIGRlbGV0ZSBpdC4KCgovLyBQYXJzZSBzdWJtaXR0ZWQgb3B0aW9ucy9zZXR0aW5ncy4KZnVuY3Rpb24gcGFyc2Vfb3B0aW9ucyggJHJlc3RvcmVEYXRhICkgewoJCglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdkZWxldGVfYmFja3VwJyApICkgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVBcmNoaXZlJ10gPSB0cnVlOwoJfSBlbHNlIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlQXJjaGl2ZSddID0gZmFsc2U7Cgl9CgkKCWlmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2RlbGV0ZV90ZW1wJyApICkgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVUZW1wRmlsZXMnXSA9IHRydWU7Cgl9IGVsc2UgewoJCSRyZXN0b3JlRGF0YVsnY2xlYW51cCddWydkZWxldGVUZW1wRmlsZXMnXSA9IGZhbHNlOwoJfQoJCglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdkZWxldGVfaW1wb3J0YnVkZHknICkgKSB7CgkJJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydEJ1ZGR5J10gPSB0cnVlOwoJfSBlbHNlIHsKCQkkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlSW1wb3J0QnVkZHknXSA9IGZhbHNlOwoJfQoJCglpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdkZWxldGVfaW1wb3J0YnVkZHlsb2cnICkgKSB7CgkJJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydExvZyddID0gdHJ1ZTsKCX0gZWxzZSB7CgkJJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydExvZyddID0gZmFsc2U7Cgl9CgkKCXJldHVybiAkcmVzdG9yZURhdGE7Cn0KCgoKLyoJY2xlYW51cCgpCiAqCQogKglDbGVhbnMgdXAgYW55IHRlbXBvcmFyeSBmaWxlcyBsZWZ0IGJ5IGltcG9ydGJ1ZGR5LgogKgkKICoJQHJldHVybgkJbnVsbAogKi8KZnVuY3Rpb24gY2xlYW51cCggJHJlc3RvcmVEYXRhICkgewoJaWYgKCB0cnVlICE9PSAkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlQXJjaGl2ZSddICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwZWQgZGVsZXRpbmcgYmFja3VwIGFyY2hpdmUuJyApOwoJfSBlbHNlIHsKCQlyZW1vdmVfZmlsZSggJHJlc3RvcmVEYXRhWydhcmNoaXZlJ10sICdiYWNrdXAgLlpJUCBmaWxlICgnIC4gJHJlc3RvcmVEYXRhWydhcmNoaXZlJ10gLiAnKScsIHRydWUgKTsKCX0KCQoJaWYgKCB0cnVlICE9PSAkcmVzdG9yZURhdGFbJ2NsZWFudXAnXVsnZGVsZXRlVGVtcEZpbGVzJ10gKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBlZCBkZWxldGluZyB0ZW1wb3JhcnkgZmlsZXMuJyApOwoJfSBlbHNlIHsKCQkvLyBGdWxsIGJhY2t1cCAuc3FsIGZpbGUKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvdGVtcF8nLiAkcmVzdG9yZURhdGFbJ3NlcmlhbCddIC4nL2RiLnNxbCcsICdkYi5zcWwgKGJhY2t1cCBkYXRhYmFzZSBkdW1wKScsIGZhbHNlICk7CgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL3RlbXBfJy4gJHJlc3RvcmVEYXRhWydzZXJpYWwnXSAuJy9kYl8xLnNxbCcsICdkYl8xLnNxbCAoYmFja3VwIGRhdGFiYXNlIGR1bXApJywgZmFsc2UgKTsKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nLiAkcmVzdG9yZURhdGFbJ3NlcmlhbCddIC4nL2RiXzEuc3FsJywgJ2RiXzEuc3FsIChiYWNrdXAgZGF0YWJhc2UgZHVtcCknLCBmYWxzZSApOwoJCS8vIERCIG9ubHkgc3FsIGZpbGUKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICdkYi5zcWwnLCAnZGIuc3FsIChiYWNrdXAgZGF0YWJhc2UgZHVtcCknLCBmYWxzZSApOwoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJ2RiXzEuc3FsJywgJ2RiXzEuc3FsIChiYWNrdXAgZGF0YWJhc2UgZHVtcCknLCBmYWxzZSApOwoJCQoJCS8vIEZ1bGwgYmFja3VwIGRhdCBmaWxlCgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL3RlbXBfJyAuICRyZXN0b3JlRGF0YVsnc2VyaWFsJ10gLiAnL2JhY2t1cGJ1ZGR5X2RhdC5waHAnLCAnYmFja3VwYnVkZHlfZGF0LnBocCAoYmFja3VwIGRhdGEgZmlsZSknLCBmYWxzZSApOwoJCXJlbW92ZV9maWxlKCBBQlNQQVRIIC4gJ3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wLycgLiAkcmVzdG9yZURhdGFbJ3NlcmlhbCddIC4gJy9iYWNrdXBidWRkeV9kYXQucGhwJywgJ2JhY2t1cGJ1ZGR5X2RhdC5waHAgKGJhY2t1cCBkYXRhIGZpbGUpJywgZmFsc2UgKTsKCQkvLyBEQiBvbmx5IGRhdCBmaWxlCgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnYmFja3VwYnVkZHlfZGF0LnBocCcsICdiYWNrdXBidWRkeV9kYXQucGhwIChiYWNrdXAgZGF0YSBmaWxlKScsIGZhbHNlICk7CgkJCgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICRyZXN0b3JlRGF0YVsnc2VyaWFsJ10gLiAnLycsICdUZW1wb3JhcnkgYmFja3VwIGRpcmVjdG9yeScsIGZhbHNlICk7CgkJCgkJLy8gVGVtcCByZXN0b3JlIGRpci4KCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICdpbXBvcnRidWRkeS90ZW1wXycuICRyZXN0b3JlRGF0YVsnc2VyaWFsJ10gLicvJywgJ1RlbXBvcmFyeSByZXN0b3JlIGRpcmVjdG9yeScsIGZhbHNlICk7CgkJCgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvJywgJ0ltcG9ydEJ1ZGR5IERpcmVjdG9yeScsIHRydWUgKTsKCQlyZW1vdmVfZmlsZSggQUJTUEFUSCAuICdpbXBvcnRidWRkeS9fc2V0dGluZ3NfZGF0LnBocCcsICdfc2V0dGluZ3NfZGF0LnBocCAodGVtcG9yYXJ5IHNldHRpbmdzIGZpbGUpJywgZmFsc2UgKTsKCQkKCQkvLyBSZW1vdmUgc3RhdGUgZmlsZSAoZGVwbG95bWVudC9kZWZhdWx0IHNldHRpbmdzKS4KCQlnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CgkJJGltcG9ydEZpbGVTZXJpYWwgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfc2VyaWFsX2Zyb21fZmlsZSggJGltcG9ydGJ1ZGR5X2ZpbGUgKTsKCQkkc3RhdGVfZmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHktJyAuICRpbXBvcnRGaWxlU2VyaWFsIC4gJy1zdGF0ZS5waHAnOwoJCXJlbW92ZV9maWxlKCAkc3RhdGVfZmlsZSwgJ0RlZmF1bHQgc3RhdGUgZGF0YSBmaWxlJywgZmFsc2UgKTsKCX0KCWlmICggdHJ1ZSAhPT0gJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydEJ1ZGR5J10gKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBlZCBkZWxldGluZyAnIC4gJGltcG9ydGJ1ZGR5X2ZpbGUgLiAnICh0aGlzIHNjcmlwdCkuJyApOwoJfSBlbHNlIHsKCQlnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CgkJcmVtb3ZlX2ZpbGUoIEFCU1BBVEggLiAkaW1wb3J0YnVkZHlfZmlsZSwgJGltcG9ydGJ1ZGR5X2ZpbGUgLiAnICh0aGlzIHNjcmlwdCknLCB0cnVlICk7Cgl9CgkvLyBEZWxldGUgbG9nIGZpbGUgbGFzdC4KCWlmICggdHJ1ZSAhPT0gJHJlc3RvcmVEYXRhWydjbGVhbnVwJ11bJ2RlbGV0ZUltcG9ydExvZyddICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NraXBwZWQgZGVsZXRpbmcgaW1wb3J0IGxvZy4nICk7Cgl9IGVsc2UgewoJCXJlbW92ZV9maWxlKCAnaW1wb3J0YnVkZHktJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnLCAnaW1wb3J0YnVkZHktJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQgbG9nIGZpbGUnLCB0cnVlICk7Cgl9Cn0KCgoKLy8gVXNlZCBieSBjbGVhbnVwKCkgYWJvdmUuCmZ1bmN0aW9uIHJlbW92ZV9maWxlKCAkZmlsZSwgJGRlc2NyaXB0aW9uLCAkZXJyb3Jfb25fbWlzc2luZyA9IGZhbHNlICkgewoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGVsZXRpbmcgYCcgLiAkZGVzY3JpcHRpb24gLiAnYC4uLicgKTsKCglAY2htb2QoICRmaWxlLCAwNzU1ICk7IC8vIEhpZ2ggcGVybWlzc2lvbnMgdG8gZGVsZXRlLgoJCglpZiAoIGlzX2RpciggJGZpbGUgKSApIHsgLy8gZGlyZWN0b3J5LgoJCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+dW5saW5rX3JlY3Vyc2l2ZSggJGZpbGUgKTsKCQlpZiAoIGZpbGVfZXhpc3RzKCAkZmlsZSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIGRlbGV0ZSBkaXJlY3Rvcnk6IGAnIC4gJGRlc2NyaXB0aW9uIC4gJ2AuIFlvdSBzaG91bGQgbWFudWFsbHkgZGVsZXRlIGl0LicgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdEZWxldGVkLicsIGZhbHNlICk7IC8vIE5vIGxvZ2dpbmcgb2YgdGhpcyBhY3Rpb24gdG8gcHJldmVudCByZWNyZWF0aW5nIGxvZy4KCQl9Cgl9IGVsc2UgeyAvLyBmaWxlCgkJaWYgKCBmaWxlX2V4aXN0cyggJGZpbGUgKSApIHsKCQkJaWYgKCB0cnVlICE9PSBAdW5saW5rKCAkZmlsZSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBkZWxldGUgZmlsZTogYCcgLiAkZGVzY3JpcHRpb24gLiAnYC4gWW91IHNob3VsZCBtYW51YWxseSBkZWxldGUgaXQuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGVsZXRlZC4nLCBmYWxzZSApOyAvLyBObyBsb2dnaW5nIG9mIHRoaXMgYWN0aW9uIHRvIHByZXZlbnQgcmVjcmVhdGluZyBsb2cuCgkJCX0KCQl9Cgl9Cn0gLy8gRW5kIHJlbW92ZV9maWxlKCkuCgoKCmRpZSgpOyAvLyBEb24ndCB3YW50IHRvIGFjY2lkZW50bHkgZ28gYmFjayB0byBhbnkgZmlsZXMgd2hpY2ggbWF5IGJlIGdvbmUuCg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/6.php,importbuddy/controllers/ajax/6.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/api.php,importbuddy/controllers/ajax/api.php

###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/api.php,importbuddy/controllers/ajax/api.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/cpanel_createdb.php,importbuddy/controllers/ajax/cpanel_createdb.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgpBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoKLy9wcmludF9yKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoKSApOwoKJGNwYW5lbF91c2VyID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX3VzZXInICk7CiRjcGFuZWxfcGFzc3dvcmQgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdjcGFuZWxfcGFzcycgKTsKJGNwYW5lbF9ob3N0ID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX3VybCcgKTsKJGNwYW5lbF9wb3J0ID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX3BvcnQnICk7CiRkYl9uYW1lID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnY3BhbmVsX2RibmFtZScgKTsKJGRiX3VzZXIgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdjcGFuZWxfZGJ1c2VyJyApOwokZGJfcGFzcyA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2NwYW5lbF9kYnBhc3MnICk7CgovLyBOZWVkZWQgZm9yIEhUVFAgcmVxdWVzdHMuCiRyZXF1ZXN0Y29yZV9maWxlID0gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9yZXF1ZXN0Y29yZS9yZXF1ZXN0Y29yZS5jbGFzcy5waHAnOwpyZXF1aXJlX29uY2UoICRyZXF1ZXN0Y29yZV9maWxlICk7CgpyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvY3BhbmVsL2NwYW5lbC5waHAnICk7CiRjcmVhdGVfZGJfcmVzdWx0ID0gcGJfYmFja3VwYnVkZHlfY3BhbmVsOjpjcmVhdGVfZGIoICRjcGFuZWxfdXNlciwgJGNwYW5lbF9wYXNzd29yZCwgJGNwYW5lbF9ob3N0LCAkZGJfbmFtZSwgJGRiX3VzZXIsICRkYl9wYXNzLCAkY3BhbmVsX3BvcnQgKTsKCmlmICggJGNyZWF0ZV9kYl9yZXN1bHQgPT09IHRydWUgKSB7CgllY2hvICdTdWNjZXNzISBDcmVhdGVkIGRhdGFiYXNlLCB1c2VyLCBhbmQgYXNzaWduZWQgdXNlciB0byBkYXRhYmFzZS4nOwp9IGVsc2UgewoJZWNobyAiVW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGRhdGFiYXNlIHdpdGggdGhlIHByb3ZpZGVkIHNldHRpbmdzLiBDaGVjayBzZXR0aW5ncyBvciBtYW51YWxseSBjcmVhdGUgdGhlIGRhdGFiYXNlIGZyb20geW91ciBob3N0J3MgY29udHJvbCBwYW5lbC4gU2VlIHR1dG9yaWFsIGF0OiAiOwoJZWNobyAiaHR0cDovL2l0aGVtZXMuY29tL3R1dG9yaWFsLWNyZWF0ZS1kYXRhYmFzZS1pbi1jcGFuZWwvXG5cbiI7CgllY2hvICJFcnJvciBkZXRhaWxzOlxuIiAuIGltcGxvZGUoICJcbiIsICRjcmVhdGVfZGJfcmVzdWx0KTsKfQoKZGllKCk7Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/cpanel_createdb.php,importbuddy/controllers/ajax/cpanel_createdb.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/create_admin.php,importbuddy/controllers/ajax/create_admin.php
PD9waHAKZGllKCAnPGh0bWw+PC9odG1sPicgKTsgLy8gRElTQUJMRUQuCgpBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgppZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3dwLWxvYWQucGhwJyApICkgewoJb2Jfc3RhcnQoICdvYl9lcnJvcl9oYW5kbGVyJyApOyAvL1N1cHByZXNzIGVycm9ycwoJcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ3dwLWxvYWQucGhwJyApOwoJb2JfZW5kX2NsZWFuKCk7Cn0gZWxzZSB7CglkaWUoICdVbmFibGUgdG8gZmluZCBXb3JkUHJlc3MgZmlsZXMgdG8gbG9hZCAod3AtbG9hZC5waHApLiBWZXJpZnkgeW91ciBXb3JkUHJlc3Mgc2l0ZSBpcyBmdW5jdGlvbmFsIGFuZCBhYmxlIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLicgKTsKfQoKJHVzZXIgPSBnZXRfdXNlcl9ieSggJ2xvZ2luJywgJHNlYXJjaF9zdHJpbmcgKTsKaWYgKCAkdXNlciApIGRpZSgganNvbl9lbmNvZGUoICR1c2VyICkgKTsK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/create_admin.php,importbuddy/controllers/ajax/create_admin.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/del-1.php,importbuddy/controllers/ajax/del-1.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgovLyBPbiBpbml0aWFsIGxvZ2luIHRvIFN0ZXAgMSAoY2hlY2tzIGZvciBwYXNzd29yZCBmaWVsZCBmcm9tIGF1dGggZm9ybSkgcmVzZXQgYW55IGRhbmdsaW5nIGRlZmF1bHRzIGZyb20gYSBwYXJ0aWFsIHJlc3RvcmUuCmlmICggKCB0cnVlID09PSBBdXRoOjppc19hdXRoZW50aWNhdGVkKCkgKSAmJiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Bhc3N3b3JkJyApICE9ICcnICkgKSB7CglwYl9iYWNrdXBidWRkeTo6cmVzZXRfZGVmYXVsdHMoKTsKfQoKCi8qKgogKgl1cGxvYWQoKQogKgogKglQcm9jZXNzZXMgdXBsb2FkZWQgYmFja3VwIGZpbGUuCiAqCiAqCUByZXR1cm4JCWFycmF5CQlUcnVlIG9uIHVwbG9hZCBzdWNjZXNzOyBmYWxzZSBvdGhlcndpc2UuCiAqLwpmdW5jdGlvbiB1cGxvYWQoKSB7CgkKCUF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsKCQoJaWYgKCBpc3NldCggJF9QT1NUWyd1cGxvYWQnXSApICYmICggJF9QT1NUWyd1cGxvYWQnXSA9PSAnbG9jYWwnICkgKSB7CgkJJHBhdGhfcGFydHMgPSBwYXRoaW5mbyggJF9GSUxFU1snZmlsZSddWyduYW1lJ10gKTsKCQlpZiAoICggc3RydG9sb3dlciggc3Vic3RyKCAkX0ZJTEVTWydmaWxlJ11bJ25hbWUnXSwgMCwgNiApICkgPT0gJ2JhY2t1cCcgKSAmJiAoIHN0cnRvbG93ZXIoICRwYXRoX3BhcnRzWydleHRlbnNpb24nXSApID09ICd6aXAnICkgKSB7CgkJCWlmICggbW92ZV91cGxvYWRlZF9maWxlKCAkX0ZJTEVTWydmaWxlJ11bJ3RtcF9uYW1lJ10sIGJhc2VuYW1lKCAkX0ZJTEVTWydmaWxlJ11bJ25hbWUnXSApICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdGaWxlIFVwbG9hZGVkLiBZb3VyIGJhY2t1cCB3YXMgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkLicgKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnU29ycnksIHRoZXJlIHdhcyBhIHByb2JsZW0gdXBsb2FkaW5nIHlvdXIgZmlsZS4nLCB0cnVlICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdPbmx5IHByb3Blcmx5IG5hbWVkIEJhY2t1cEJ1ZGR5IHppcCBhcmNoaXZlcyB3aXRoIGEgemlwIGV4dGVuc2lvbiBtYXkgYmUgdXBsb2FkZWQuJywgdHJ1ZSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoJCgkvLyBET1dOTE9BRCBGSUxFIEZST00gU1RBU0ggVE8gTE9DQUwuCglpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3VwbG9hZCcgKSA9PSAnc3Rhc2gnICkgewoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoIHRydWUgKTsKCQkKCQkkcmVxdWVzdGNvcmVfZmlsZSA9IGRpcm5hbWUoIGRpcm5hbWUoIGRpcm5hbWUoIF9fRklMRV9fICkgKSApIC4gJy9saWIvcmVxdWVzdGNvcmUvcmVxdWVzdGNvcmUuY2xhc3MucGhwJzsKCQlyZXF1aXJlX29uY2UoICRyZXF1ZXN0Y29yZV9maWxlICk7CgkJCgkJJGxpbmsgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdsaW5rJyApOwoJCSRkZXN0aW5hdGlvbl9maWxlID0gZGlybmFtZSggZGlybmFtZSggZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApICkgKSAuICcvJyAuIGJhc2VuYW1lKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdsaW5rJyApICk7CgkJJGRlc3RpbmF0aW9uX2ZpbGUgPSBzdWJzdHIoICRkZXN0aW5hdGlvbl9maWxlLCAwLCBzdHJpcG9zKCAkZGVzdGluYXRpb25fZmlsZSwgJy56aXAnICkgKyA0ICk7CgkJCgkJJF9HRVRbJ2ZpbGUnXSA9IGJhc2VuYW1lKCAkZGVzdGluYXRpb25fZmlsZSApOwoJCQoJCSRyZXF1ZXN0ID0gbmV3IFJlcXVlc3RDb3JlKCAkbGluayApOwoJCSRyZXF1ZXN0LT5zZXRfd3JpdGVfZmlsZSggJGRlc3RpbmF0aW9uX2ZpbGUgKTsKCQkKCQllY2hvICc8ZGl2IGlkPSJwYl9pbXBvcnRidWRkeV93b3JraW5nIiBzdHlsZT0icGFkZGluZzogMjBweDsiPkRvd25sb2FkaW5nIGJhY2t1cCBmcm9tIFN0YXNoIHRvIGAnIC4gJGRlc3RpbmF0aW9uX2ZpbGUgLiAnYC4uLjxicj48YnI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvbG9hZGluZ19sYXJnZS5naWYiIHRpdGxlPSJXb3JraW5nLi4uIFBsZWFzZSB3YWl0IGFzIHRoaXMgbWF5IHRha2UgYSBtb21lbnQuLi4iPjxicj48YnI+PC9kaXY+JzsKCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCQkKCQkkcmVzcG9uc2UgPSAkcmVxdWVzdC0+c2VuZF9yZXF1ZXN0KCBmYWxzZSApOwoJCWlmICggJHJlc3BvbnNlICE9PSB0cnVlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciAjODU0ODQ1OTU5OC4gVW5hYmxlIHRvIGRvd25sb2FkIGZpbGUgZnJvbSBTdGFzaC4gWW91IG1heSBtYW51YWxseSBkb3dubG9hZCBpdCBhbmQgdXBsb2FkIHRvIHRoZSBzZXJ2ZXIgdmlhIEZUUC4nICk7CgkJfSBlbHNlIHsgLy8gTm8gZXJyb3IuCgkJCWlmICggISBmaWxlX2V4aXN0cyggJGRlc3RpbmF0aW9uX2ZpbGUgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yICMzNDg0NTc0NTg3OC4gU3Rhc2ggcmV0dXJuZWQgYSBzdWNjZXNzIGJ1dCB0aGUgYmFja3VwIGZpbGUgd2FzIG5vdCBmb3VuZCBsb2NhbGx5LiBDaGVjayB0aGlzIHNlcnZlclwncyBkaXJlY3Rvcnkgd3JpdGUgcGVybWlzc2lvbnMuIFlvdSBtYXkgbWFudWFsbHkgZG93bmxvYWQgaXQgYW5kIHVwbG9hZCB0byB0aGUgc2VydmVyIHZpYSBGVFAuJyApOwoJCQl9CgkJfQoJCQoJCWVjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5qUXVlcnkoIiNwYl9pbXBvcnRidWRkeV93b3JraW5nIikuaGlkZSgpOzwvc2NyaXB0Pic7CgkJCgl9Cn0KCgovKioKICoJZ2V0X2FyY2hpdmVzX2xpc3QoKQogKgogKglSZXR1cm5zIGFuIGFycmF5IG9mIGJhY2t1cCBhcmNoaXZlIHppcCBmaWxlbmFtZXMgZm91bmQuCiAqCiAqCUByZXR1cm4JCWFycmF5CQlBcnJheSBvZiAuemlwIGZpbGVuYW1lczsgcGF0aCBOT1QgaW5jbHVkZWQuCiAqLwpmdW5jdGlvbiBnZXRfYXJjaGl2ZXNfbGlzdCgpIHsKCQoJQXV0aDo6cmVxdWlyZV9hdXRoZW50aWNhdGlvbigpOwoJCglpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddICkgKSB7CgkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10gPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoIEFCU1BBVEggKTsKCX0KCQoJLy8gTGlzdCBiYWNrdXAgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkuCgkkYmFja3VwX2FyY2hpdmVzID0gYXJyYXkoKTsKCSRiYWNrdXBfYXJjaGl2ZXNfZ2xvYiA9IGdsb2IoIEFCU1BBVEggLiAnYmFja3VwKi56aXAnICk7CglpZiAoICFpc19hcnJheSggJGJhY2t1cF9hcmNoaXZlc19nbG9iICkgfHwgZW1wdHkoICRiYWNrdXBfYXJjaGl2ZXNfZ2xvYiApICkgeyAvLyBPbiBmYWlsdXJlIGdsb2IoKSByZXR1cm5zIGZhbHNlIG9yIGFuIGVtcHR5IGFycmF5IGRlcGVuZGluZyBvbiBzZXJ2ZXIgc2V0dGluZ3Mgc28gbm9ybWFsaXplIGhlcmUuCgkJJGJhY2t1cF9hcmNoaXZlc19nbG9iID0gYXJyYXkoKTsKCX0KCWZvcmVhY2goICRiYWNrdXBfYXJjaGl2ZXNfZ2xvYiBhcyAkYmFja3VwX2FyY2hpdmUgKSB7CgkJJGNvbW1lbnQgPSBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPmdldF9jb21tZW50KCAkYmFja3VwX2FyY2hpdmUgKTsKCQkkY29tbWVudCA9IGJhY2t1cGJ1ZGR5X2NvcmU6Om5vcm1hbGl6ZV9jb21tZW50X2RhdGEoICRjb21tZW50ICk7CgkJCgkJJHRoaXNfYXJjaGl2ZSA9IGFycmF5KAoJCQknZmlsZScJCT0+CQliYXNlbmFtZSggJGJhY2t1cF9hcmNoaXZlICksCgkJCSdjb21tZW50Jwk9PgkJJGNvbW1lbnQsCgkJKTsKCQkkYmFja3VwX2FyY2hpdmVzW10gPSAkdGhpc19hcmNoaXZlOwoJfQoJdW5zZXQoICRiYWNrdXBfYXJjaGl2ZXNfZ2xvYiApOwoJCgkKCXJldHVybiAkYmFja3VwX2FyY2hpdmVzOwp9CgoKLyoqCiAqCXdvcmRwcmVzc19leGlzdHMoKQogKgogKglOb3RpZmllcyB0aGUgdXNlciB3aXRoIGFuIGFsZXJ0IGlmIFdvcmRQcmVzcyBhcHBlYXJzIHRvIGFscmVhZHkgZXhpc3QgaW4gdGhpcyBkaXJlY3RvcnkuCiAqCiAqCUByZXR1cm4JCWJvb2xlYW4JCVRydWUgaWYgV29yZFByZXNzIGFscmVhZHkgZXhpc3RzOyBmYWxzZSBvdGhlcndpc2UuCiAqLwpmdW5jdGlvbiB3b3JkcHJlc3NfZXhpc3RzKCkgewoJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd3cC1jb25maWcucGhwJyApICkgewoJCXJldHVybiB0cnVlOwoJfSBlbHNlIHsKCQlyZXR1cm4gZmFsc2U7Cgl9Cn0KCgpmdW5jdGlvbiBwaHBpbmlfZXhpc3RzKCkgewoJcmV0dXJuIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3BocC5pbmknICk7Cn0KCgpmdW5jdGlvbiBodGFjY2Vzc19leGlzdHMoKSB7CglyZXR1cm4gZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLmh0YWNjZXNzJyApOwp9CgoKZnVuY3Rpb24gaW5kZXhfZXhpc3RzKCkgewoJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdpbmRleC5odG0nICkgPT09IHRydWUgKSB7CgkJcmV0dXJuIHRydWU7Cgl9CglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ2luZGV4Lmh0bWwnICkgPT09IHRydWUgKSB7CgkJcmV0dXJuIHRydWU7Cgl9Cn0KCgpwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnaHRtbF8xJyApOwoKLy8gTE9HIElNUE9SVEJVRERZIFZFUlNJT04gSU5GT1JNQVRJT04uCnBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1J1bm5pbmcgSW1wb3J0QnVkZHkgdicgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JiX3ZlcnNpb24nXSAuICcuJyApOwoKPz4K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/del-1.php,importbuddy/controllers/ajax/del-1.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/file_hash.php,importbuddy/controllers/ajax/file_hash.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgokZmlsZSA9IEFCU1BBVEggLiBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdmaWxlJyApOwoKaWYgKCAnJyA9PSAkZmlsZSApIHsKCWRpZSggJ05vIGZpbGUgcGFzc2VkLicgKTsKfQppZiAoICEgZmlsZV9leGlzdHMoICRmaWxlICkgKSB7CglkaWUoICdGaWxlIG5vdCBmb3VuZC4nICk7Cn0KCiRmaWxlSGFzaCA9IEBtZDVfZmlsZSggJGZpbGUgKTsKCmlmICggZmFsc2UgPT09ICRmaWxlSGFzaCApIHsKCWRpZSggJ1VuYWJsZSB0byBjYWxjdWxhdGUgaGFzaC4gVmVyaWZ5IGZpbGUgcGVybWlzc2lvbnMuJyApOwp9IGVsc2UgewoJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdoYXNoJyA9PiAkZmlsZUhhc2ggKSApICk7Cn0=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/file_hash.php,importbuddy/controllers/ajax/file_hash.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/getDeployLog.php,importbuddy/controllers/ajax/getDeployLog.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgppZiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2RlcGxveScgKSApIHsKCWRpZSggJ0FjY2VzcyBkZW5pZWQuJyApOwp9CgovLyBPbmx5IGFsbG93IGFjY2VzcyB0byB0aGlzIGZpbGUgaWYgaXQgaGFzIGEgc2VyaWFsIGhpZGluZyBpdC4gVXNlZCBieSBkZXBsb3ltZW50LgpnbG9iYWwgJGltcG9ydGJ1ZGR5X2ZpbGU7CiRpbXBvcnRGaWxlU2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRpbXBvcnRidWRkeV9maWxlICk7CmlmICggJycgPT0gJGltcG9ydEZpbGVTZXJpYWwgKSB7CglkaWUoICdBY2Nlc3MgZGVuaWVkLicgKTsKfQoKcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnfn5+IEVuZCBJbXBvcnRCdWRkeSBMb2cgc2VjdGlvbicgKTsKJHN0YXR1c19saW5lcyA9IHBiX2JhY2t1cGJ1ZGR5OjpnZXRfc3RhdHVzKCAnJywgdHJ1ZSwgZmFsc2UsIHRydWUgKTsgLy8gQ2xlYXIgZmlsZSwgZG9udCB1bmxpbmsgZmlsZSwgc3VwcmVzcyBzdGF0dXMgcmV0cmlldmFsIG1zZy4KZWNobyBpbXBsb2RlKCAnJywgJHN0YXR1c19saW5lcyApOw==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/getDeployLog.php,importbuddy/controllers/ajax/getDeployLog.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/ajax/mysql_test.php,importbuddy/controllers/ajax/mysql_test.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgoKLy8gVGVzdHMgdmFyaWFibGVzIHRvIHBvcHVsYXRlIHdpdGggcmVzdWx0cy4KJHRlc3RzID0gYXJyYXkoCgknY29ubmVjdCcJCQkJPT4gZmFsc2UsCS8vIEFibGUgdG8gY29ubmVjdCAmIGxvZ2luIHRvIGRiIHNlcnZlcj8KCSdjb25uZWN0X2Vycm9yJwkJCT0+ICcnLAkJLy8gbXlzcWwgZXJyb3IgbWVzc2FnZSBpbiByZXNwb25zZSB0byBjb25uZWN0ICYgbG9naW4gKGlmIGFueSkuCgknc2VsZWN0ZGInCQkJCT0+IGZhbHNlLAkvLyBBYmxlIHRvIHNlbGVjdCB0aGUgZGF0YWJhc2U/Cgknc2VsZWN0ZGJfZXJyb3InCQk9PiAnJywJCS8vIG15c3FsIGVycm9yIG1lc3NhZ2UgaW4gcmVzcG9uc2UgdG8gc2VsZWN0aW5nIChpZiBhbnkpLgoJJ2NyZWF0ZWRyb3B0YWJsZScJCT0+IGZhbHNlLAkvLyBhYmlsaXR5IHRvIENSRUFURSBhIG5ldyB0YWJsZSAoYW5kIGRlbGV0ZSBpdCkuCgknY3JlYXRlZHJvcHRhYmxlX2Vycm9yJwk9PiAnJywJCS8vIGNyZWF0ZSB0YWJsZSBteXNxbCBlcnJvciAoaWYgYW55KS4KCSdwcmVmaXgnCQkJCT0+IGZhbHNlLAkvLyBXaGV0aGVyIG9yIG5vdCBwcmVmaXggbWVldHMgdGhlIGJhcmUgbWluaW11bSB0byBiZSBhY2NlcHRlZC4KCSdwcmVmaXhfZXhpc3RzJwkJCT0+IHRydWUsCS8vIFdvcmRQcmVzcyB0YWJsZXMgbWF0Y2hpbmcgcHJlZml4IGZvdW5kPwoJJ3ByZWZpeF93YXJuJwkJCT0+IHRydWUsCS8vIFdhcm4gaWYgcHJlZml4IG9mIGEgYmFkIGZvcm1hdC4KCSdvdmVyYWxsX2Vycm9yJwkJCT0+ICcnLAkJLy8gT3ZlcmFsbCBlcnJvciBvZiB0aGUgdGVzdC4gSWYgbWlzc2luZyBmaWVsZHMgdGhlbiB0aGlzIHdpbGwgYmUgd2hhdCBlcnJvcnMgYWJvdXQgbWlzc2luZyBmaWVsZChzKS4KKTsKCiRzZXJ2ZXIgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdzZXJ2ZXInICk7CiR1c2VybmFtZSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3VzZXJuYW1lJyApOwokcGFzc3dvcmQgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwYXNzd29yZCcgKTsKJGRhdGFiYXNlID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZGF0YWJhc2UnICk7CiRwcmVmaXggPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwcmVmaXgnICk7CgppZiAoICggJycgPT0gJHNlcnZlciApIHx8ICggJycgPT0gJHVzZXJuYW1lICkgfHwgKCAnJyA9PSAkZGF0YWJhc2UgKSB8fCAoICcnID09ICRwcmVmaXggKSApIHsKCSR0ZXN0c1snb3ZlcmFsbF9lcnJvciddID0gJ09uZSBvciBtb3JlIGRhdGFiYXNlIHNldHRpbmdzIHdhcyBsZWZ0IGJsYW5rLiBBbGwgZmllbGRzIGV4Y2VwdCBvcHRpb25hbCBwYXNzd29yZCBhcmUgcmVxdWlyZWQuJzsKCWRpZSgganNvbl9lbmNvZGUoICR0ZXN0cyApICk7Cn0KCgoKLyoqKioqIEJFR0lOIFRFU1RTICoqKioqLwoKaWYgKCBmYWxzZSA9PT0gQG15c3FsX2Nvbm5lY3QoICRzZXJ2ZXIsICR1c2VybmFtZSwgJHBhc3N3b3JkICkgKSB7IC8vIENPTk5FQ1QgZmFpbGVkLgoJCgkkdGVzdHNbJ2Nvbm5lY3RfZXJyb3InXSA9IG15c3FsX2Vycm9yKCk7CgkKfSBlbHNlIHsgLy8gQ09OTkVDVCBzdWNjZXNzLgoJCgkkdGVzdHNbJ2Nvbm5lY3QnXSA9IHRydWU7CgkKCWlmICggZmFsc2UgPT09IEBteXNxbF9zZWxlY3RfZGIoICRkYXRhYmFzZSApICkgeyAvLyBTRUxFQ1QgZmFpbGVkLgoJCQoJCSR0ZXN0c1snc2VsZWN0ZGJfZXJyb3InXSA9IG15c3FsX2Vycm9yKCk7CgkJCgl9IGVsc2UgeyAvLyBTRUxFQ1Qgc3VjY2Vzcy4KCQkKCQkkdGVzdHNbJ3NlbGVjdGRiJ10gPSB0cnVlOwoJCQoJCS8vIFRlc3QgYWJpbGl0eSB0byBjcmVhdGUgKGFuZCBkZWxldGUpIGEgdGFibGUgdG8gdmVyaWZ5IHBlcm1pc3Npb25zLgoJCUBteXNxbF9xdWVyeSgiRFJPUCBUQUJMRSBgIiAuIG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyggJHByZWZpeCApIC4gImJ1ZGR5X3Rlc3RgIik7IC8vIGRyb3AganVzdCBpbiBjYXNlIGEgcHJpb3IgYXR0ZW1wdCBmYWlsZWQuCgkJJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCAiQ1JFQVRFIFRBQkxFIGAiIC4gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCAkcHJlZml4ICkgLiAiYnVkZHlfdGVzdGAgKGlkIElOVCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCBQUklNQVJZIEtFWSkiICk7CgkJaWYgKCBmYWxzZSAhPT0gJHJlc3VsdCApIHsgLy8gY3JlYXRlIHN1Y2Nlc3MuCgkJCS8vIERyb3AgdGVtcCB0ZXN0IHRhYmxlIHdlIGNyZWF0ZWQgYmVmb3JlIHdlIGRlY2xhcmUgc3VjY2Vzcy4KCQkJJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCJEUk9QIFRBQkxFIGAiIC4gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCAkcHJlZml4ICkgLiAiYnVkZHlfdGVzdGAiKTsKCQkJaWYgKCBmYWxzZSAhPT0gJHJlc3VsdCApIHsgLy8gZHJvcCBzdWNjZXNzLgoJCQkJJHRlc3RzWydjcmVhdGVkcm9wdGFibGUnXSA9IHRydWU7CgkJCX0gZWxzZSB7IC8vIGRyb3AgZmFpbC4KCQkJCSR0ZXN0c1snY3JlYXRlZHJvcHRhYmxlX2Vycm9yJ10gPSAnVW5hYmxlIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgdGFibGUuICcgLiBteXNxbF9lcnJvcigpOwoJCQl9CgkJfSBlbHNlIHsgLy8gY3JlYXRlIGZhaWwuCgkJCSR0ZXN0c1snY3JlYXRlZHJvcHRhYmxlX2Vycm9yJ10gPSAnVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgdGFibGUuICcgLiBteXNxbF9lcnJvcigpOwoJCX0KCQkKCQkvLyBXb3JkUHJlc3MgdGFibGVzIGV4aXN0IG1hdGNoaW5nIHByZWZpeD8KCQkkcmVzdWx0ID0gbXlzcWxfcXVlcnkoICJTSE9XIFRBQkxFUyBMSUtFICciIC4gbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCBzdHJfcmVwbGFjZSggJ18nLCAnXF8nLCAkcHJlZml4ICkgLiAiJSIgKSAuICInIiApOwoJCWlmICggbXlzcWxfbnVtX3Jvd3MoICRyZXN1bHQgKSA9PSAwICkgeyAvLyBXb3JkUHJlc3MgRVhJU1RTIGFscmVhZHkuIENvbGxpc2lvbi4KCQkJJHRlc3RzWydwcmVmaXhfZXhpc3RzJ10gPSBmYWxzZTsKCQl9CgkJdW5zZXQoICRyZXN1bHQgKTsKCQkKCX0gLy8gZW5kIHNlbGVjdCBzdWNjZXNzLgoJCn0gLy8gZW5kIGNvbm5lY3Qgc3VjY2Vzcy4KCgoKCmlmICggISBwcmVnX21hdGNoKCd8W15hLXowLTlfXXxpJywgJHByZWZpeCApICkgeyAvLyBQcmVmaXggbWVldHMgV1AgbWluaW11bS4KCSR0ZXN0c1sncHJlZml4J10gPSB0cnVlOwoJIGlmICggcHJlZ19tYXRjaCgnL15bYS16MC05XStfJC9pJywgJHByZWZpeCApICkgeyAvLyBQcmVmaXggcGFzc2VzIHdpdGggbm8gd2FybmluZy4KCQkkdGVzdHNbJ3ByZWZpeF93YXJuJ10gPSBmYWxzZTsKCX0KfQoKCi8qKioqKiBFTkQgVEVTVFMgKioqKiovCgoKZGllKCBqc29uX2VuY29kZSggJHRlc3RzICkgKTsK
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/ajax/mysql_test.php,importbuddy/controllers/ajax/mysql_test.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/create_admin.php,importbuddy/controllers/pages/create_admin.php
PD9waHAKZGllKCk7CgppZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApIHx8ICggdHJ1ZSAhPT0gUEJfSU1QT1JUQlVERFkgKSApIHsKCWRpZSggJzxodG1sPjwvaHRtbD4nICk7Cn0KCkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgo/Pgo8ZGl2IGlkPSJwYl9jcmVhdGVhZG1pbl9tb2RhbCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGhlaWdodDogOTAlOyI+CgkJPGRpdiBjbGFzcz0ibW9kYWwiPgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9oZWFkZXIiPgoJCQkJPGEgY2xhc3M9Im1vZGFsX2Nsb3NlIj4mdGltZXM7PC9hPgoJCQkJPGgyPlNlcnZlciBJbmZvcm1hdGlvbjwvaDI+CgkJCTwvZGl2PgoJCQk8ZGl2IGNsYXNzPSJtb2RhbF9jb250ZW50Ij4KCQkJCQoJCQkJCgkJCQkKCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQkJCQlqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCQkJCQlqUXVlcnkoICcjY3JlYXRlYWRtaW5fZm9ybScgKS5zdWJtaXQoZnVuY3Rpb24oKXsKCQkJCQkJCQoJCQkJCQkJalF1ZXJ5KCAnLmNyZWF0ZWFkbWluX2xvYWRpbmcnICkuc2hvdygpOwoJCQkJCQkJalF1ZXJ5LnBvc3QoJ2ltcG9ydGJ1ZGR5LnBocD9hamF4PWNyZWF0ZV9hZG1pbicsCgkJCQkJCQkJalF1ZXJ5KCAnI2NyZWF0ZWFkbWluX2Zvcm0nICkuc2VyaWFsaXplKCksIGZ1bmN0aW9uKGRhdGEpIHsKCQkJCQkJCQkJCgkJCQkJCQkJCWRhdGEgPSBqUXVlcnkudHJpbSggZGF0YSApOwoJCQkJCQkJCQlqUXVlcnkoICcuY3JlYXRlYWRtaW5fbG9hZGluZycgKS5oaWRlKCk7CgkJCQkJCQkJCQoJCQkJCQkJCQlpZiAoIGRhdGEgPT0gJzEnICkgewoJCQkJCQkJCQkJYWxlcnQoICdTdWNjZXNzJyApOwoJCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQkJYWxlcnQoICdFcnJvcjogJyArIGRhdGEgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQl9CgkJCQkJCQkpOwoJCQkJCQkJCgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQkKCQkJCQkJfSk7CgkJCQkJfSk7CgkJCQk8L3NjcmlwdD4KCQkJCQoJCQkJPGZvcm0gaWQ9ImNyZWF0ZWFkbWluX2Zvcm0iPgoJCQkJCVVzZXJuYW1lOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idXNlcm5hbWUiPgoJCQkJCUVtYWlsOiA8aW5wdXQgdHlwZT0iZW1haWwiIG5hbWU9ImVtYWlsIj4KCQkJCQlQYXNzd29yZDogPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzd29yZCI+CgkJCQkJQ29uZmlybSBQYXNzd29yZDogPGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzd29yZF9jb25maXJtIj4KCQkJCQk8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSJDcmVhdGUgQWRtaW4gVXNlciIgY2xhc3M9ImJ1dHRvbiI+CgkJCQkJPHNwYW4gY2xhc3M9ImNyZWF0ZWFkbWluX2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSI8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCk7ID8+L2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyI+PC9zcGFuPgoJCQkJPC9mb3JtPgoJCQkJCgkJCQkKCQk8L2Rpdj4KCTwvZGl2Pgo8L2Rpdj4K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/create_admin.php,importbuddy/controllers/pages/create_admin.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/dbreplace.php,importbuddy/controllers/pages/dbreplace.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgoKJGRhdGEgPSBhcnJheSgpOwpwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnZGJyZXBsYWNlJywgJGRhdGEgKTsKPz48c2NyaXB0PmpRdWVyeSggJyNwYWdlVGl0bGUnICkuaHRtbCggJ0RhdGFiYXNlIFRleHQgUmVwbGFjZScgKTs8L3NjcmlwdD4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/dbreplace.php,importbuddy/controllers/pages/dbreplace.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/default.php,importbuddy/controllers/pages/default.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgoKCi8qKioqKiogQkVHSU4gQVVUSEVOVElDQVRJT04gKioqKiovCi8vcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvYXV0aC5waHAnICk7CkF1dGg6OmNoZWNrKCk7CmlmICggKCB0cnVlID09PSBBdXRoOjppc19hdXRoZW50aWNhdGVkKCkgKSAmJiAoICdsb2dpbicgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnYWN0aW9uJyApICkgKSB7IC8vIE9uIHN1Y2Nlc3NmdWwgbG9naW4gdG8gc3RlcCAwLCByZWRpcmVjdCB0byBzdGVwIDEuCgloZWFkZXIoICdMb2NhdGlvbjogJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpICk7Cn0KLyoqKioqKiBFTkQgQVVUSEVOVElDQVRJT04gKioqKiovCgoKCiRtb2RlID0gJ2h0bWwnOwoKCgovLyBSZWdpc3RlciBQSFAgc2h1dGRvd24gZnVuY3Rpb24gdG8gaGVscCBjYXRjaCBhbmQgbG9nIGZhdGFsIFBIUCBlcnJvcnMgZHVyaW5nIGJhY2t1cC4KcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oICdzaHV0ZG93bl9mdW5jdGlvbicgKTsKLy9lcnJvcl9yZXBvcnRpbmcoIEVfRVJST1IgfCBFX1dBUk5JTkcgfCBFX1BBUlNFIHwgRV9OT1RJQ0UgKTsgLy8gSElHSAoKLyoJc2h1dGRvd25fZnVuY3Rpb24oKQogKgkKICoJVXNlZCBmb3IgY2F0Y2hpbmcgZmF0YWwgUEhQIGVycm9ycyBkdXJpbmcgYmFja3VwIHRvIHdyaXRlIHRvIGxvZyBmb3IgZGVidWdnaW5nLgogKgkKICoJQHJldHVybgkJbnVsbAogKi8KZnVuY3Rpb24gc2h1dGRvd25fZnVuY3Rpb24oKSB7CgkKCQoJLy8gR2V0IGVycm9yIG1lc3NhZ2UuCgkvLyBFcnJvciB0eXBlczogaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Vycm9yZnVuYy5jb25zdGFudHMucGhwCgkkZSA9IGVycm9yX2dldF9sYXN0KCk7CglpZiAoICRlID09PSBOVUxMICkgeyAvLyBObyBlcnJvciBvZiBhbnkga2luZC4KCQlyZXR1cm47Cgl9IGVsc2UgeyAvLyBTb21lIHR5cGUgb2YgZXJyb3IuCgkJaWYgKCAhaXNfYXJyYXkoICRlICkgfHwgKCAkZVsndHlwZSddICE9IEVfRVJST1IgKSAmJiAoICRlWyd0eXBlJ10gIT0gRV9VU0VSX0VSUk9SICkgKSB7IC8vIFJldHVybiBpZiBub3QgYSBmYXRhbCBlcnJvci4KCQkJLy9lY2hvICc8IS0tICcgLiBwcmludF9yKCAkZSwgdHJ1ZSApIC4gJyAtLT4nIC4gIlxuIjsKCQkJcmV0dXJuOwoJCX0KCX0KCQoJCgkvLyBDYWxjdWxhdGUgbG9nIGRpcmVjdG9yeS4KCSRsb2dfZGlyZWN0b3J5ID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCk7IC8vIEFsc28gaGFuZGxlIHdoZW4gaW4gaW1wb3J0YnVkZHkuCgkkbWFpbl9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnbG9nLScgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JzsKCQoJCgkvLyBEZXRlcm1pbmUgaWYgd3JpdGluZyB0byBhIHNlcmlhbCBsb2cuCglpZiAoIHBiX2JhY2t1cGJ1ZGR5OjokX3N0YXR1c19zZXJpYWwgIT0gJycgKSB7CgkJJHNlcmlhbCA9IHBiX2JhY2t1cGJ1ZGR5OjokX3N0YXR1c19zZXJpYWw7CgkJJHNlcmlhbF9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnc3RhdHVzLScgLiAkc2VyaWFsIC4gJ18nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgkJJHdyaXRlX3NlcmlhbCA9IHRydWU7Cgl9IGVsc2UgewoJCSR3cml0ZV9zZXJpYWwgPSBmYWxzZTsKCX0KCQoJCgkvLyBGb3JtYXQgZXJyb3IgbWVzc2FnZS4KCSRlX3N0cmluZyA9ICctLS0tLSBGQVRBTCBFUlJPUiAtLS0tLSBBIGZhdGFsIFBIUCBlcnJvciB3YXMgZW5jb3VudGVyZWQ6ICc7Cglmb3JlYWNoKCAoYXJyYXkpJGUgYXMgJGVfbGluZV90aXRsZSA9PiAkZV9saW5lICkgewoJCSRlX3N0cmluZyAuPSAkZV9saW5lX3RpdGxlIC4gJyA9PiAnIC4gJGVfbGluZSAuICI7ICI7Cgl9CgkkZV9zdHJpbmcgPSBydHJpbSggJGVfc3RyaW5nLCAnOyAnICkgLiAnLic7CgkKCS8vIFdyaXRlIHRvIGxvZy4KCUBmaWxlX3B1dF9jb250ZW50cyggJG1haW5fZmlsZSwgJGVfc3RyaW5nLCBGSUxFX0FQUEVORCApOwoJCgkvLyBJTVBPUlRCVUREWQoJJHN0YXR1cyA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCB0aW1lKCkgKSAuICJcdCIgLgoJCQkJc3ByaW50ZiggIiUwMS4yZiIsIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtIHBiX2JhY2t1cGJ1ZGR5Ojokc3RhcnRfdGltZSwgMiApICkgLiAiXHQiIC4KCQkJCXNwcmludGYoICIlMDEuMmYiLCByb3VuZCggbWVtb3J5X2dldF9wZWFrX3VzYWdlKCkgLyAxMDQ4NTc2LCAyICkgKSAuICJcdCIgLgoJCQkJJ2Vycm9yJyAuICJcdFx0IiAuCgkJCQlzdHJfcmVwbGFjZSggY2hyKDkpLCAnICAgJywgJGVfc3RyaW5nICkKCQkJOwoJJHN0YXR1cyA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnLycsICRzdGF0dXMgKTsKCWVjaG8gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5wYl9zdGF0dXNfYXBwZW5kKCInIC4gc3RyX3JlcGxhY2UoICciJywgJyZxdW90OycsICRzdGF0dXMgKSAuICciKTs8L3NjcmlwdD4nOwoJCn0gLy8gRW5kIHNodXRkb3duX2Z1bmN0aW9uLgoKCgoKLy8gSGFuZGxlIEFKQVguCgokYWpheCA9ICcnOwppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2FqYXgnICkgIT0gJycgKSB7CgkkYWpheCA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2FqYXgnICk7Cn0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdhamF4JyApICE9ICcnICkgewoJJGFqYXggPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ2FqYXgnICk7Cn0KaWYgKCAkYWpheCAhPSAnJyApIHsgLy8gQUpBWAoJCglBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoJCgkkcGFnZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvY29udHJvbGxlcnMvYWpheC8nIC4gJGFqYXggLiAnLnBocCc7CglpZiAoIGZpbGVfZXhpc3RzKCAkcGFnZSApICkgewoJCXJlcXVpcmVfb25jZSggJHBhZ2UgKTsKCX0gZWxzZSB7CgkJZWNobyAne0Vycm9yOiBJbnZhbGlkIEFKQVggYWN0aW9uIGAnIC4gaHRtbGVudGl0aWVzKCAkYWpheCApIC4gJ2AgRmlsZSBub3QgZm91bmQ6IGAnIC4gJHBhZ2UgLiAnYC59JzsKCX0KCXJldHVybjsKCQp9CgoKLy8gRGV0ZXJtaW5lIHBhZ2UgdG8gbG9hZC4KCmlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwYWdlJyApICE9ICcnICkgeyAvLyBOYW1lZCBwYWdlLgoJCglBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7IC8vIERpZSBpZiBub3QgbG9nZ2VkIGluLgoJCgkkcGFnZVNsdWcgPSBzdHJfcmVwbGFjZSggYXJyYXkoICdcXCcsICcvJyApLCAnJywgcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwYWdlJyApICk7CglpZiAoICEgY3R5cGVfYWxudW0oIHN0cl9yZXBsYWNlKCBhcnJheSggJy0nLCAnXycgKSwgJycsICRwYWdlU2x1ZyApICkgKSB7IC8vIERpc2FsbG93IG5vbi1hbHBoYW51bWVyaWMgZXhjZXB0IGRhc2gsIHVuZGVyc2NvcmUuCgkJZGllKCAnRXJyb3IgIzg1NzQ3ODMzLiBQYWdlIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gT25seSBhbHBoYW51bWVyaWMsIGRhc2hlcywgYW5kIHVuZGVyc2NvcmVzIHBlcm1pdHRlZC4nICk7Cgl9IAoJCgkkcGFnZUZpbGUgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L2NvbnRyb2xsZXJzL3BhZ2VzLycgLiAkcGFnZVNsdWcgLiAnLnBocCc7CglpZiAoIGZpbGVfZXhpc3RzKCAkcGFnZUZpbGUgKSApIHsKCQllY2hvICc8IS0tIFN0YXJ0aW5nIHBhZ2UgJyAuICRwYWdlU2x1ZyAuICcuIC0tPic7CgkJcmVxdWlyZV9vbmNlKCAkcGFnZUZpbGUgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBwYWdlICcgLiAkcGFnZVNsdWcgLiAnLicgKTsKCX0gZWxzZSB7CgkJZWNobyAne0Vycm9yOiBJbnZhbGlkIHBhZ2UgYCcgLiBodG1sZW50aXRpZXMoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnc3RlcCcgKSApIC4gJy5waHAnIC4gJ2AufSc7Cgl9CglyZXR1cm47CgkKfSBlbHNlaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3N0ZXAnICkgIT0gJycgKSB7IC8vIE51bWVyaWNhbCBzdGVwLgoJCglpZiAoIHRydWUgIT09IEF1dGg6OmlzX2F1dGhlbnRpY2F0ZWQoKSApIHsgLy8gSWYgbm90IGxvZ2dlZCBpbiB0aGVuIHByb3ZpZGUgbG9naW4gcGFnZS4KCQkkc3RlcCA9ICdsb2dpbic7Cgl9IGVsc2UgewoJCSRzdGVwID0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdzdGVwJyApOwoJCUF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgl9CgkKfSBlbHNlIHsgLy8gVW5rbm93bi4gRGVmYXVsdCB0byBsb2dpbi4KCWlmICggdHJ1ZSAhPT0gQXV0aDo6aXNfYXV0aGVudGljYXRlZCgpICkgeyAvLyBJZiBub3QgbG9nZ2VkIGluIHRoZW4gcHJvdmlkZSBsb2dpbiBwYWdlLgoJCSRzdGVwID0gJ2xvZ2luJzsKCX0gZWxzZSB7CgkJJHN0ZXAgPSAnaG9tZUJhY2t1cFNlbGVjdCc7Cgl9Cn0KCiRzdGVwRmlsZSA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvY29udHJvbGxlcnMvcGFnZXMvJyAuICRzdGVwIC4gJy5waHAnOwokc3RlcCA9IHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAnc3RlcCcgKTsKcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L3ZpZXdzL19oZWFkZXIucGhwJyApOwplY2hvICc8IS0tIFN0YXJ0aW5nIHN0ZXAgZmlsZSBgJyAuIGJhc2VuYW1lKCAkc3RlcEZpbGUgKSAuICdgLiAtLT4nOwoKLyppZiAoICRzdGVwID4gMCApIHsgLy8gTG9hZCBzdGVwcyBhZnRlciAwIGluIGlmcmFtZS4KCWVjaG8gcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWydpbXBvcnQnXS0+c3RhdHVzX2JveCggJ0ltcG9ydEJ1ZGR5IHYnIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10gLiAnLi4uIFBvd2VyZWQgYnkgQmFja3VwQnVkZHkuJyApOwoJZWNobyAnPGlmcmFtZSBpZD0icGJfYmFja3VwYnVkZHlfbW9kYWxfaWZyYW1lIiBuYW1lPSJwYl9iYWNrdXBidWRkeV9tb2RhbF9pZnJhbWUiIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJ2ltcG9ydGJ1ZGR5LnBocD9hamF4PScgLiAkc3RlcCAuICciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjE4MDAiIGZyYW1lYm9yZGVyPSIwIiBwYWRkaW5nPSIwIiBtYXJnaW49IjAiPkVycm9yICM0NTg0NTk0NTc5LiBCcm93c2VyIG5vdCBjb21wYXRpYmxlIHdpdGggaWZyYW1lcy48L2lmcmFtZT4nOwp9IGVsc2UgewoJKi8KCWlmICggZmlsZV9leGlzdHMoICRzdGVwRmlsZSApICkgewoJCXJlcXVpcmVfb25jZSggJHN0ZXBGaWxlICk7Cgl9IGVsc2UgewoJCWVjaG8gJ3tFcnJvcjogSW52YWxpZCBzdGVwIGZpbGUgYCcgLiBodG1sZW50aXRpZXMoICRzdGVwICkgLiAnLnBocCcgLiAnYC59JzsKCX0KLy99CnBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIHN0ZXAuJyApOwpyZXF1aXJlX29uY2UoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvdmlld3MvX2Zvb3Rlci5waHAnICk7CgpyZXR1cm47Cgo=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/default.php,importbuddy/controllers/pages/default.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/homeBackupSelect.php,importbuddy/controllers/pages/homeBackupSelect.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CgoKLy8gT24gaW5pdGlhbCBsb2dpbiB0byBTdGVwIDEgKGNoZWNrcyBmb3IgcGFzc3dvcmQgZmllbGQgZnJvbSBhdXRoIGZvcm0pIHJlc2V0IGFueSBkYW5nbGluZyBkZWZhdWx0cyBmcm9tIGEgcGFydGlhbCByZXN0b3JlLgppZiAoICggdHJ1ZSA9PT0gQXV0aDo6aXNfYXV0aGVudGljYXRlZCgpICkgJiYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdwYXNzd29yZCcgKSAhPSAnJyApICkgewoJcGJfYmFja3VwYnVkZHk6OnJlc2V0X2RlZmF1bHRzKCk7Cn0KCgovLyBIYW5kbGUgc21hbGwgc2l6ZSBQSFAgdXBsb2FkIGxpbWl0IGtub2NraW5nIG9mZiBhdXRoZW50aWNhdGlvbiB3aGVuIHVwbG9hZGluZyBhIGJhY2t1cC4KaWYgKCBpc3NldCggJF9TRVJWRVJbJ0NPTlRFTlRfTEVOR1RIJ10gKSAmJiAoIGludHZhbCggJF9TRVJWRVJbJ0NPTlRFTlRfTEVOR1RIJ10gKSA+IDAgKSAmJiAoIGNvdW50KCAkX1BPU1QgKSA9PT0gMCApICkgewoJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzU0ODQ1NDg1OTUuIFVuYWJsZSB0byB1cGxvYWQuIFlvdXIgUEhQIHBvc3RfbWF4X3NpemUgc2V0dGluZyBpcyB0b28gc21hbGwgc28gaXQgZGlzY2FyZGVkIFBPU1QgZGF0YS4gWW91IG1heSBoYXZlIHRvIGxvZyBiYWNrIGluLicsIHRydWUgKTsKfQp1cGxvYWQoKTsgLy8gSGFuZGxlIGFueSB1cGxvYWRpbmcgb2YgYSBiYWNrdXAgZmlsZS4KCgokZGF0YSA9IGFycmF5KCk7CgovKioKICoJdXBsb2FkKCkKICoKICoJUHJvY2Vzc2VzIHVwbG9hZGVkIGJhY2t1cCBmaWxlLgogKgogKglAcmV0dXJuCQlhcnJheQkJVHJ1ZSBvbiB1cGxvYWQgc3VjY2VzczsgZmFsc2Ugb3RoZXJ3aXNlLgogKi8KZnVuY3Rpb24gdXBsb2FkKCkgewoJCglBdXRoOjpyZXF1aXJlX2F1dGhlbnRpY2F0aW9uKCk7CgkKCWlmICggaXNzZXQoICRfUE9TVFsndXBsb2FkJ10gKSAmJiAoICRfUE9TVFsndXBsb2FkJ10gPT0gJ2xvY2FsJyApICkgewoJCSRwYXRoX3BhcnRzID0gcGF0aGluZm8oICRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddICk7CgkJaWYgKCAoIHN0cnRvbG93ZXIoIHN1YnN0ciggJF9GSUxFU1snZmlsZSddWyduYW1lJ10sIDAsIDYgKSApID09ICdiYWNrdXAnICkgJiYgKCBzdHJ0b2xvd2VyKCAkcGF0aF9wYXJ0c1snZXh0ZW5zaW9uJ10gKSA9PSAnemlwJyApICkgewoJCQlpZiAoIG1vdmVfdXBsb2FkZWRfZmlsZSggJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddLCBiYXNlbmFtZSggJF9GSUxFU1snZmlsZSddWyduYW1lJ10gKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRmlsZSBVcGxvYWRlZC4gWW91ciBiYWNrdXAgd2FzIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZC4nICk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1NvcnJ5LCB0aGVyZSB3YXMgYSBwcm9ibGVtIHVwbG9hZGluZyB5b3VyIGZpbGUuJywgdHJ1ZSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnT25seSBwcm9wZXJseSBuYW1lZCBCYWNrdXBCdWRkeSB6aXAgYXJjaGl2ZXMgd2l0aCBhIHppcCBleHRlbnNpb24gbWF5IGJlIHVwbG9hZGVkLicsIHRydWUgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCQoJLy8gRE9XTkxPQUQgRklMRSBGUk9NIFNUQVNIIFRPIExPQ0FMLgoJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd1cGxvYWQnICkgPT0gJ3N0YXNoJyApIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCB0cnVlICk7CgkJCgkJJHJlcXVlc3Rjb3JlX2ZpbGUgPSBkaXJuYW1lKCBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgKSAuICcvbGliL3JlcXVlc3Rjb3JlL3JlcXVlc3Rjb3JlLmNsYXNzLnBocCc7CgkJcmVxdWlyZV9vbmNlKCAkcmVxdWVzdGNvcmVfZmlsZSApOwoJCQoJCSRsaW5rID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbGluaycgKTsKCQkkZGVzdGluYXRpb25fZmlsZSA9IGRpcm5hbWUoIGRpcm5hbWUoIGRpcm5hbWUoIGRpcm5hbWUoIF9fRklMRV9fICkgKSApICkgLiAnLycgLiBiYXNlbmFtZSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnbGluaycgKSApOwoJCSRkZXN0aW5hdGlvbl9maWxlID0gc3Vic3RyKCAkZGVzdGluYXRpb25fZmlsZSwgMCwgc3RyaXBvcyggJGRlc3RpbmF0aW9uX2ZpbGUsICcuemlwJyApICsgNCApOwoJCQoJCSRfR0VUWydmaWxlJ10gPSBiYXNlbmFtZSggJGRlc3RpbmF0aW9uX2ZpbGUgKTsKCQkKCQkkcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q29yZSggJGxpbmsgKTsKCQkkcmVxdWVzdC0+c2V0X3dyaXRlX2ZpbGUoICRkZXN0aW5hdGlvbl9maWxlICk7CgkJCgkJZWNobyAnPGRpdiBpZD0icGJfaW1wb3J0YnVkZHlfd29ya2luZyIgc3R5bGU9InBhZGRpbmc6IDIwcHg7Ij5Eb3dubG9hZGluZyBiYWNrdXAgZnJvbSBTdGFzaCB0byBgJyAuICRkZXN0aW5hdGlvbl9maWxlIC4gJ2AuLi48YnI+PGJyPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmdfbGFyZ2UuZ2lmIiB0aXRsZT0iV29ya2luZy4uLiBQbGVhc2Ugd2FpdCBhcyB0aGlzIG1heSB0YWtlIGEgbW9tZW50Li4uIj48YnI+PGJyPjwvZGl2Pic7CgkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgkJCgkJJHJlc3BvbnNlID0gJHJlcXVlc3QtPnNlbmRfcmVxdWVzdCggZmFsc2UgKTsKCQlpZiAoICRyZXNwb25zZSAhPT0gdHJ1ZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzg1NDg0NTk1OTguIFVuYWJsZSB0byBkb3dubG9hZCBmaWxlIGZyb20gU3Rhc2guIFlvdSBtYXkgbWFudWFsbHkgZG93bmxvYWQgaXQgYW5kIHVwbG9hZCB0byB0aGUgc2VydmVyIHZpYSBGVFAuJyApOwoJCX0gZWxzZSB7IC8vIE5vIGVycm9yLgoJCQlpZiAoICEgZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbl9maWxlICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciAjMzQ4NDU3NDU4NzguIFN0YXNoIHJldHVybmVkIGEgc3VjY2VzcyBidXQgdGhlIGJhY2t1cCBmaWxlIHdhcyBub3QgZm91bmQgbG9jYWxseS4gQ2hlY2sgdGhpcyBzZXJ2ZXJcJ3MgZGlyZWN0b3J5IHdyaXRlIHBlcm1pc3Npb25zLiBZb3UgbWF5IG1hbnVhbGx5IGRvd25sb2FkIGl0IGFuZCB1cGxvYWQgdG8gdGhlIHNlcnZlciB2aWEgRlRQLicgKTsKCQkJfQoJCX0KCQkKCQllY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+alF1ZXJ5KCIjcGJfaW1wb3J0YnVkZHlfd29ya2luZyIpLmhpZGUoKTs8L3NjcmlwdD4nOwoJCQoJfQp9CgoKLyoqCiAqCWdldF9hcmNoaXZlc19saXN0KCkKICoKICoJUmV0dXJucyBhbiBhcnJheSBvZiBiYWNrdXAgYXJjaGl2ZSB6aXAgZmlsZW5hbWVzIGZvdW5kLgogKgogKglAcmV0dXJuCQlhcnJheQkJQXJyYXkgb2YgLnppcCBmaWxlbmFtZXM7IHBhdGggTk9UIGluY2x1ZGVkLgogKi8KZnVuY3Rpb24gZ2V0X2FyY2hpdmVzX2xpc3QoKSB7CgkKCUF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsKCQoJaWYgKCAhaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSApICkgewoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnICk7CgkJcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBBQlNQQVRIICk7Cgl9CgkKCS8vIExpc3QgYmFja3VwIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LgoJJGJhY2t1cF9hcmNoaXZlcyA9IGFycmF5KCk7CgkkYmFja3VwX2FyY2hpdmVzX2dsb2IgPSBnbG9iKCBBQlNQQVRIIC4gJ2JhY2t1cCouemlwJyApOwoJaWYgKCAhaXNfYXJyYXkoICRiYWNrdXBfYXJjaGl2ZXNfZ2xvYiApIHx8IGVtcHR5KCAkYmFja3VwX2FyY2hpdmVzX2dsb2IgKSApIHsgLy8gT24gZmFpbHVyZSBnbG9iKCkgcmV0dXJucyBmYWxzZSBvciBhbiBlbXB0eSBhcnJheSBkZXBlbmRpbmcgb24gc2VydmVyIHNldHRpbmdzIHNvIG5vcm1hbGl6ZSBoZXJlLgoJCSRiYWNrdXBfYXJjaGl2ZXNfZ2xvYiA9IGFycmF5KCk7Cgl9Cglmb3JlYWNoKCAkYmFja3VwX2FyY2hpdmVzX2dsb2IgYXMgJGJhY2t1cF9hcmNoaXZlICkgewoJCSRjb21tZW50ID0gcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddLT5nZXRfY29tbWVudCggJGJhY2t1cF9hcmNoaXZlICk7CgkJJGNvbW1lbnQgPSBiYWNrdXBidWRkeV9jb3JlOjpub3JtYWxpemVfY29tbWVudF9kYXRhKCAkY29tbWVudCApOwoJCQoJCSR0aGlzX2FyY2hpdmUgPSBhcnJheSgKCQkJJ2ZpbGUnCQk9PgkJYmFzZW5hbWUoICRiYWNrdXBfYXJjaGl2ZSApLAoJCQknY29tbWVudCcJPT4JCSRjb21tZW50LAoJCSk7CgkJJGJhY2t1cF9hcmNoaXZlc1tdID0gJHRoaXNfYXJjaGl2ZTsKCX0KCXVuc2V0KCAkYmFja3VwX2FyY2hpdmVzX2dsb2IgKTsKCQoJCglyZXR1cm4gJGJhY2t1cF9hcmNoaXZlczsKfQoKCi8qIHByZWZsaWdodFNjYW4oKQogKgogKiBDaGVja3MgZm9yIHBvdGVudGlhbCBwcm9ibGVtcyBiZWZvcmUgZ2V0dGluZyBzdGFydGVkLgogKiBAcmV0dXJuIGFycmF5IG9mIHBvdGVudGlhbCBwcm9ibGVtcy4gS2V5IGlzIGEgdW5pcXVlIHNsdWcgdG8gdGhlIGlzc3VlLCB2YWx1ZSBpcyBhIGRlc2NyaXB0aXZlIHRleHQuCiAqLwpmdW5jdGlvbiBwcmVmbGlnaHRTY2FuKCkgewoJJGlzc3VlcyA9IGFycmF5KCk7CgkKCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcgKSApIHsKCQkkaXNzdWVzWyd3b3JkcHJlc3NfZXhpc3RzJ10gPSAnV0FSTklORzogRXhpc3RpbmcgV29yZFByZXNzIGluc3RhbGxhdGlvbiBmb3VuZC4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCBleGlzdGluZyBXb3JkUHJlc3MgZmlsZXMgYW5kIGRhdGFiYXNlIGJlIHJlbW92ZWQgcHJpb3IgdG8gbWlncmF0aW5nIG9yIHJlc3RvcmluZyB0byBhdm9pZCBjb25mbGljdHMuIFlvdSBzaG91bGQgbm90IGluc3RhbGwgV29yZFByZXNzIHByaW9yIHRvIG1pZ3JhdGluZy4nOwoJfQoJCglpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3BocC5pbmknICkgKSB7CgkJJGlzc3Vlc1sncGhwX2luaV9leGlzdHMnXSA9ICdXQVJOSU5HOiBFeGlzdGluZyBwaHAuaW5pIGZpbGUgZm91bmQuIElmIHlvdXIgYmFja3VwIGFsc28gY29udGFpbnMgYSBwaHAuaW5pIGZpbGUgaXQgbWF5IG92ZXJ3cml0ZSB0aGUgY3VycmVudCBvbmUsIHBvc3NpYmx5IHJlc3VsdGluZyBpbiBjaGFuZ2VzIGluIGNvZmlndXJhdGlvbiBvciBwcm9ibGVtcy4gTWFrZSBhIGJhY2t1cCBvZiB5b3VyIGV4aXN0aW5nIGZpbGUgaWYgeW91ciBhcmUgdW5zdXJlLic7Cgl9CgkKCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLmh0YWNjZXNzJyApICkgewoJCSRpc3N1ZXNbJ2h0YWNjZXNzX2V4aXN0cyddID0gJ1dBUk5JTkc6IEV4aXN0aW5nIC5odGFjY2VzcyBmaWxlIGZvdW5kLiBJZiB5b3VyIGJhY2t1cCBhbHNvIGNvbnRhaW5zIGEgLmh0YWNjZXNzIGZpbGUgaXQgbWF5IG92ZXJ3cml0ZSB0aGUgY3VycmVudCBvbmUsIHBvc3NpYmx5IHJlc3VsdGluZyBpbiBjaGFuZ2VkIGluIGNvbmZpZ3VyYXRpb24gb3IgcHJvYmxlbXMuIE1ha2UgYSBiYWNrdXAgb2YgeW91ciBleGlzdGluZyBmaWxlIGlmIHlvdSBhcmUgdW5zdXJlLic7Cgl9CgkKCS8qIFRPRE86IE1vdmUgdG8gcG9zdCBmbGlnaHQgc2Nhbi4KCWlmICggKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdpbmRleC5odG0nICkgPT09IHRydWUgKSB8fCAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ2luZGV4Lmh0bWwnICkgPT09IHRydWUgKSApIHsKCQkkaXNzdWVzWydpbmRleF9leGlzdHMnXSA9ICdBbiBpbmRleC5odG0obCkgZmlsZSBleGlzdHMgaW4gdGhpcyBzaXRlIHBhdGguIERlcGVuZGluZyBvbiB5b3VyIHNlcnZlciBzZXR1cCBpdCBtYXkgdGFrZSBwcmVjZWRlbmNlIGluIGxvYWRpbmcgaW5zdGVhZCBvZiBXb3JkUHJlc3MuIElmIGFmdGVyIHJlc3RvcmUgeW91ciBzaXRlIGxvYWRzIGFuIHVuZXhwZWN0ZWQgb3IgYmxhbmsgcGFnZSwgdHJ5IHJlbmFtaW5nIG9yIGRlbGV0aW5nIHRoZSBpbmRleC5odG0obCkgZmlsZShzKSBpbiB0aGUgc2l0ZSByb290LCBgJyAuIEFCU1BBVEggLiAnYC4nOwoJfQoJKi8KCQoJLy8gTG9vayBmb3IgZGlyZWN0b3JpZXMgbmFtZWQgYWZ0ZXIgYSBiYWNrdXAgZmlsZSB0aGF0IGNvbnRhaW4gV29yZFByZXNzLiAtLSBpbXByb3Blcmx5IHVuemlwcGVkIGluIHRoZSB3cm9uZyBsb2NhdGlvbi4KCSRiYWNrdXBfZGlycyA9IGdsb2IoIEFCU1BBVEggLiAnYmFja3VwLSovd3AtbG9naW4ucGhwJyApOwoJaWYgKCAhIGlzX2FycmF5KCAkYmFja3VwX2RpcnMgKSApIHsKCQkkYmFja3VwX2RpcnMgPSBhcnJheSgpOwoJfQoJaWYgKCBjb3VudCggKGFycmF5KSRiYWNrdXBfZGlycyApID4gMCApIHsKCQkkaXNzdWVzWydtYW51YWxfdW56aXBfd3JvbmdfbG9jYXRpb24nXSA9ICdBIG1hbnVhbGx5IHVuemlwcGVkIGJhY2t1cCBtYXkgaGF2ZSBiZWVuIGZvdW5kIGluIHRoZSBmb2xsb3dpbmcgbG9jYXRpb24ocykuIElmIHlvdSBtYW51YWxseSB1bnppcHBlZCBjb25maXJtIHRoZSBmaWxlcyB3ZXJlIG5vdCB1bnppcHBlZCBpbnRvIHRoaXMgc3ViZGlyZWN0b3J5IGVsc2UgdGhleSB3aWxsIG5lZWQgdG8gYmUgbW92ZWQgdXAgb3V0IG9mIHRoZSBzdWJkaXJlY3RvcnkgaW50byB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaW1wb3J0YnVkZHkucGhwLiBQb3NzaWJsZSBtYW51YWxseSB1bnppcHBlZCBiYWNrdXBzIGluIGEgc3ViZGlyZWN0b3J5OiAnIC4gaW1wbG9kZSggJywgJywgJGJhY2t1cF9kaXJzICk7Cgl9CgkKCXJldHVybiAkaXNzdWVzOwp9CgoKCgpwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnaG9tZScsICRkYXRhICk7CgovLyBMT0cgSU1QT1JUQlVERFkgVkVSU0lPTiBJTkZPUk1BVElPTgpwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSdW5uaW5nIEltcG9ydEJ1ZGR5IHYnIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYl92ZXJzaW9uJ10gLiAnLicgKTsKCj8+Cg==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/homeBackupSelect.php,importbuddy/controllers/pages/homeBackupSelect.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/login.php,importbuddy/controllers/pages/login.php
PD9waHAKJGRhdGEgPSBhcnJheSgpOwokZGF0YVsndGl0bGUnXSA9ICdBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCc7CgoKcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ2xvZ2luJywgJGRhdGEgKTs=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/login.php,importbuddy/controllers/pages/login.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php
PD9waHAKLy8gVHV0b3JpYWwKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnanF1ZXJ5LmpveXJpZGUtMi4wLjMuanMnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ21vZGVybml6ci5tcS5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdqb3lyaWRlLmNzcycgKTsKCgoKaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgeyAvLyBOT1QgSU4gSU1QT1JUQlVERFk6Cgl3cF9lbnF1ZXVlX3NjcmlwdCggJ3RoaWNrYm94JyApOwoJd3BfcHJpbnRfc2NyaXB0cyggJ3RoaWNrYm94JyApOwoJd3BfcHJpbnRfc3R5bGVzKCAndGhpY2tib3gnICk7Cgk/PgoJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCSNiYWNrdXBidWRkeS1tZXRhLWxpbmstd3JhcCBhLnNob3ctc2V0dGluZ3MgewoJCWZsb2F0OiByaWdodDsKCQltYXJnaW46IDAgMCAwIDZweDsKCX0KCSNzY3JlZW4tbWV0YS1saW5rcyAjYmFja3VwYnVkZHktbWV0YS1saW5rLXdyYXAgYSB7CgkJYmFja2dyb3VuZDogbm9uZTsKCX0KCSNzY3JlZW4tbWV0YS1saW5rcyAjYmFja3VwYnVkZHktbWV0YS1saW5rLXdyYXAgYTphZnRlciB7CgkJY29udGVudDogJyc7CgkJbWFyZ2luLXJpZ2h0OiA1cHg7Cgl9Cgk8L3N0eWxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJalF1ZXJ5KCcjc2NyZWVuLW1ldGEtbGlua3MnKS5hcHBlbmQoCgkJCSc8ZGl2IGlkPSJiYWNrdXBidWRkeS1tZXRhLWxpbmstd3JhcCIgY2xhc3M9ImhpZGUtaWYtbm8tanMgc2NyZWVuLW1ldGEtdG9nZ2xlIj4nICsKCQkJCSc8YSBocmVmPSIiIGNsYXNzPSJzaG93LXNldHRpbmdzIHBiX2JhY2t1cGJ1ZGR5X2JlZ2ludG91ciI+PD9waHAgX2UoICJUb3VyIFBhZ2UiLCAiaXQtbDEwbi1iYWNrdXBidWRkeSIgKTsgPz48L2E+JyArCgkJCSc8L2Rpdj4nCgkJKTsKCX0pOwoJPC9zY3JpcHQ+Cgk8b2wgaWQ9InBiX2JhY2t1cGJ1ZGR5X3RvdXIiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJPGxpIGRhdGEtY2xhc3M9Im5hdi10YWItMCI+VmlldyBzZXJ2ZXIgY29uZmlndXJhdGlvbiBkZXRhaWxzLCBzZWN1cml0eSBpbmZvcm1hdGlvbiwgc2VydmVyIHBhdGhzLCBldGMuPC9saT4KCQk8bGkgZGF0YS1jbGFzcz0ibmF2LXRhYi0xIj5WaWV3IGRhdGFiYXNlIGluZm9ybWF0aW9uIGFzIHdlbGwgYXMgdGFibGVzIGV4Y2x1ZGVkIGZyb20gYmFja3Vwcy48L2xpPgoJCTxsaSBkYXRhLWNsYXNzPSJuYXYtdGFiLTIiPlZpZXcgeW91ciBzaXRlJ3MgZmlsZXMgaW4gZWl0aGVyIGEgZ3JhcGhpY2FsIGZvcm1hdCBvciBhIGxpc3RpbmcuIFRoZSBsaXN0aW5nIGFsc28gbm90ZXMgZXhjbHVzaW9ucyBmcm9tIGJhY2t1cHMuPC9saT4KCQk8bGkgZGF0YS1jbGFzcz0ibmF2LXRhYi0zIiBkYXRhLWJ1dHRvbj0iRmluaXNoIj5BZGRpdGlvbmFsIHNpdGUgdG9vbHMgZm9yIG1hbmFnaW5nIENST04gc2NoZWR1bGVzIGFuZCBkYXRhYmFzZSB0ZXh0IHNlYXJjaCAmIHJlcGxhY2UuPC9saT4KCTwvb2w+Cgk8c2NyaXB0PgoJalF1ZXJ5KHdpbmRvdykubG9hZChmdW5jdGlvbigpIHsKCQlqUXVlcnkoZG9jdW1lbnQpLm9uKCAnY2xpY2snLCAnLnBiX2JhY2t1cGJ1ZGR5X2JlZ2ludG91cicsIGZ1bmN0aW9uKGUpIHsKCQkJalF1ZXJ5KCIjcGJfYmFja3VwYnVkZHlfdG91ciIpLmpveXJpZGUoewoJCQkJdGlwTG9jYXRpb246ICd0b3AnLAoJCQl9KTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0pOwoJfSk7Cgk8L3NjcmlwdD4KCgk8P3BocAoKCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2FkbWluLmpzJyApOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+dGl0bGUoIF9fKCAnU2VydmVyIFRvb2xzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCWJhY2t1cGJ1ZGR5X2NvcmU6OnZlcnNpb25zX2NvbmZpcm0oKTsKCQoJJGRlZmF1bHRfdGFiID0gMDsKCWlmICggaXNfbnVtZXJpYyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd0YWInICkgKSApIHsKCQkkZGVmYXVsdF90YWIgPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3RhYicgKTsKCX0KCQoJZWNobyAnJzsKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYnMoCgkJJ2dldHRpbmdfc3RhcnRlZCcsCgkJYXJyYXkoCgkJCWFycmF5KAoJCQkJJ3RpdGxlJwkJPT4JCV9fKCAnU2VydmVyJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknc2VydmVyJywKCQkJKSwKCQkJYXJyYXkoCgkJCQkndGl0bGUnCQk9PgkJX18oICdEYXRhYmFzZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJJ3NsdWcnCQk9PgkJJ2RhdGFiYXNlJywKCQkJKSwKCQkJYXJyYXkoCgkJCQkndGl0bGUnCQk9PgkJX18oICdTaXRlIFNpemUgTWFwcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJJ3NsdWcnCQk9PgkJJ2ZpbGVzJywKCQkJKSwKCQkJYXJyYXkoCgkJCQkndGl0bGUnCQk9PgkJX18oICdXb3JkUHJlc3MgU2NoZWR1bGVzIChDcm9uKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJJ3NsdWcnCQk9PgkJJ2Nyb24nLAoJCQkpLAoJCSksCgkJJ3dpZHRoOiAxMDAlOycsCgkJdHJ1ZSwKCQkkZGVmYXVsdF90YWIKCSk7CgkKCQoJCglwYl9iYWNrdXBidWRkeTo6JHVpLT5zdGFydF90YWIoICdzZXJ2ZXInICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vc2VydmVyLnBocCcgKTsKCQkKCQkKCQlyZXF1aXJlX29uY2UoICdzZXJ2ZXJfaW5mby9wZXJtaXNzaW9ucy5waHAnICk7CgkJCgkJCgkJJHdwX3VwbG9hZF9kaXIgPSB3cF91cGxvYWRfZGlyKCk7CgkJJHdwX3NldHRpbmdzID0gYXJyYXkoKTsKCQkKCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsncGF0aCddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgRmlsZSBQYXRoJywgJHdwX3VwbG9hZF9kaXJbJ3BhdGgnXSwgJ3dwX3VwbG9hZF9kaXIoKScgKTsKCQl9CgkJaWYgKCBpc3NldCggJHdwX3VwbG9hZF9kaXJbJ3VybCddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgVVJMJywgJHdwX3VwbG9hZF9kaXJbJ3VybCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2Rpclsnc3ViZGlyJ10gKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBTdWJkaXJlY3RvcnknLCAkd3BfdXBsb2FkX2Rpclsnc3ViZGlyJ10sICd3cF91cGxvYWRfZGlyKCknKTsKCQl9CgkJaWYgKCBpc3NldCggJHdwX3VwbG9hZF9kaXJbJ2Jhc2V1cmwnXSApICkgewoJCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnVXBsb2FkIEJhc2UgVVJMJywgJHdwX3VwbG9hZF9kaXJbJ2Jhc2V1cmwnXSwgJ3dwX3VwbG9hZF9kaXIoKScgKTsKCQl9CgkJaWYgKCBpc3NldCggJHdwX3VwbG9hZF9kaXJbJ2Jhc2VkaXInXSApICkgewoJCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnVXBsb2FkIEJhc2UgRGlyZWN0b3J5JywgJHdwX3VwbG9hZF9kaXJbJ2Jhc2VkaXInXSwgJ3dwX3VwbG9hZF9kaXIoKScgKTsKCQl9CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1NpdGUgVVJMJywgc2l0ZV91cmwoKSwgJ3NpdGVfdXJsKCknICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0hvbWUgVVJMJywgaG9tZV91cmwoKSwgJ2hvbWVfdXJsKCknICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1dvcmRQcmVzcyBSb290IFBhdGgnLCBBQlNQQVRILCAnQUJTUEFUSCcgKTsKCQkKCQkvLyBNdWx0aXNpdGUgZXh0cmFzOgoJCSR3cF9zZXR0aW5nc19tdWx0aXNpdGUgPSBhcnJheSgpOwoJCWlmICggaXNfbXVsdGlzaXRlKCkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdOZXR3b3JrIFNpdGUgVVJMJywgbmV0d29ya19zaXRlX3VybCgpLCAnbmV0d29ya19zaXRlX3VybCgpJyApOwoJCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnTmV0d29yayBIb21lIFVSTCcsIG5ldHdvcmtfaG9tZV91cmwoKSwgJ25ldHdvcmtfaG9tZV91cmwoKScgKTsKCQl9CgkJCgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IGxvY2FsIHN0b3JhZ2UnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSwgJ0JhY2t1cEJ1ZGR5IFNldHRpbmdzJyApOwoJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdCYWNrdXBCdWRkeSB0ZW1wb3JhcnkgZmlsZXMnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCksICdVcGxvYWQgQmFzZSArIEJhY2t1cEJ1ZGR5JyApOwoJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdCYWNrdXBCdWRkeSBsb2dzJywgYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCksICdVcGxvYWQgQmFzZSArIEJhY2t1cEJ1ZGR5JyApOwoJCQoJCS8vIERpc3BsYXkgV1Agc2V0dGluZ3MuLgoJCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmxpc3RfdGFibGUoCgkJCSR3cF9zZXR0aW5ncywKCQkJYXJyYXkoCgkJCQknYWN0aW9uJwkJCQkJPT4JcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCksCgkJCQknY29sdW1ucycJCQkJCT0+CWFycmF5KAoJCQkJCQkJCQkJCQkJX18oICdVUkxzICYgUGF0aHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkJCQkJCQkJCV9fKCAnVmFsdWUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkJCQkJCQkJCV9fKCAnT2J0YWluZWQgdmlhJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCQkJCQkJCSksCgkJCQknY3NzJwkJCQkJCT0+CQknd2lkdGg6IDEwMCU7JywKCQkJKQoJCSk7CgkJCgkJCglwYl9iYWNrdXBidWRkeTo6JHVpLT5lbmRfdGFiKCk7CgkKCQoJCgkvLyBUaGlzIHBhZ2UgY2FuIHRha2UgYSBiaXQgdG8gcnVuLgoJLy8gUnVucyBBRlRFUiBzZXJ2ZXIgaW5mb3JtYXRpb24gaXMgZGlzcGxheWVkIHNvIHdlIGNhbiB2aWV3IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgdGhlIHNlcnZlci4KCXBiX2JhY2t1cGJ1ZGR5OjpzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ2RhdGFiYXNlJyApOwoJCQoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL2RhdGFiYXNlLnBocCcgKTsKCQllY2hvICc8YnI+PGJyPjxhIG5hbWU9ImRhdGFiYXNlX3JlcGxhY2UiPjwvYT4nOwoJCWVjaG8gJzxkaXYgY2xhc3M9InBiX2h0aXRsZSI+JyAuICdBZHZhbmNlZDogJyAuIF9fKCAnRGF0YWJhc2UgTWFzcyBUZXh0IFJlcGxhY2VtZW50JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9kaXY+PGJyPic7CgkJcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ19zZXJ2ZXJfdG9vbHMtZGF0YWJhc2VfcmVwbGFjZScgKTsKCQkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ2ZpbGVzJyApOwoJCQoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL3NpdGVfc2l6ZS5waHAnICk7CgkJCglwYl9iYWNrdXBidWRkeTo6JHVpLT5lbmRfdGFiKCk7CgkKCQoJCglwYl9iYWNrdXBidWRkeTo6JHVpLT5zdGFydF90YWIoICdjcm9uJyApOwoJCQoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL2Nyb24ucGhwJyApOwoJCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+ZW5kX3RhYigpOwoJCgkKCWVjaG8gJzxiciBzdHlsZT0iY2xlYXI6IGJvdGg7Ij48YnI+PGJyPic7CglwYl9iYWNrdXBidWRkeTo6JHVpLT5lbmRfdGFicygpOwoJCgkKCQoJLy8gSGFuZGxlcyB0aGlja2JveCBhdXRvLXJlc2l6aW5nLiBLZWVwIGF0IGJvdHRvbSBvZiBwYWdlIHRvIGF2b2lkIGlzc3Vlcy4KCWlmICggIXdwX3NjcmlwdF9pcyggJ21lZGlhLXVwbG9hZCcgKSApIHsKCQl3cF9lbnF1ZXVlX3NjcmlwdCggJ21lZGlhLXVwbG9hZCcgKTsKCQl3cF9wcmludF9zY3JpcHRzKCAnbWVkaWEtdXBsb2FkJyApOwoJfQoJCn0gZWxzZSB7IC8vIElOU0lERSBJTVBPUlRCVUREWToKCWlmICggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdza2lwX3NlcnZlcmluZm8nICkgPT0gJycgKSB7IC8vIEdpdmUgYSB3b3JrYXJvdW5kIHRvIHNraXAgdGhpcy4KCQlyZXF1aXJlX29uY2UoICdzZXJ2ZXJfaW5mby9zZXJ2ZXIucGhwJyApOwoJfSBlbHNlIHsKCQllY2hvICd7U2tpcHBpbmcgU2VydmVyIEluZm8uIHNlY3Rpb24gYmFzZWQgb24gcXVlcnlzdHJpbmcufSc7Cgl9Cn0KPz4=
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/controllers/pages/serverinfo.php,importbuddy/controllers/pages/serverinfo.php
PD9waHAKaWYgKCAhIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSB8fCAoIHRydWUgIT09IFBCX0lNUE9SVEJVRERZICkgKSB7CglkaWUoICc8aHRtbD48L2h0bWw+JyApOwp9CkF1dGg6OnJlcXVpcmVfYXV0aGVudGljYXRpb24oKTsgLy8gRGllIGlmIG5vdCBsb2dnZWQgaW4uCgpyZXF1aXJlX29uY2UoIEFCU1BBVEggLidpbXBvcnRidWRkeS92aWV3cy9faGVhZGVyLnBocCcgKTsKPz4KPHNjcmlwdD5qUXVlcnkoICcjcGFnZVRpdGxlJyApLmh0bWwoICdTZXJ2ZXIgSW5mb3JtYXRpb24nICk7PC9zY3JpcHQ+Cgo8ZGl2IGNsYXNzPSJ3cmFwIj4KCTw/cGhwCglnbG9iYWwgJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZTsKCXJlcXVpcmVfb25jZSggJ3NlcnZlcl90b29scy5waHAnICk7Cgk/Pgo8L2Rpdj4KCjw/cGhwCnJlcXVpcmVfb25jZSggQUJTUEFUSCAuJ2ltcG9ydGJ1ZGR5L3ZpZXdzL19mb290ZXIucGhwJyApOw==
###PACKDATA,FILE_END,/_importbuddy/importbuddy/controllers/pages/serverinfo.php,importbuddy/controllers/pages/serverinfo.php
###PACKDATA,FILE_START,/_importbuddy/importbuddy/lib/pclzip/pclzip.php,importbuddy/lib/pclzip/pclzip.php
PD9waHAKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUGhwQ29uY2VwdCBMaWJyYXJ5IC0gWmlwIE1vZHVsZSAyLjguMgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBMaWNlbnNlIEdOVS9MR1BMIC0gVmluY2VudCBCbGF2ZXQgLSBBdWd1c3QgMjAwOQovLyBodHRwOi8vd3d3LnBocGNvbmNlcHQubmV0Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIFByZXNlbnRhdGlvbiA6Ci8vICAgUGNsWmlwIGlzIGEgUEhQIGxpYnJhcnkgdGhhdCBtYW5hZ2UgWklQIGFyY2hpdmVzLgovLyAgIFNvIGZhciB0ZXN0cyBzaG93IHRoYXQgYXJjaGl2ZXMgZ2VuZXJhdGVkIGJ5IFBjbFppcCBhcmUgcmVhZGFibGUgYnkKLy8gICBXaW5aaXAgYXBwbGljYXRpb24gYW5kIG90aGVyIHRvb2xzLgovLwovLyBEZXNjcmlwdGlvbiA6Ci8vICAgU2VlIHJlYWRtZS50eHQgYW5kIGh0dHA6Ly93d3cucGhwY29uY2VwdC5uZXQKLy8KLy8gV2FybmluZyA6Ci8vICAgVGhpcyBsaWJyYXJ5IGFuZCB0aGUgYXNzb2NpYXRlZCBmaWxlcyBhcmUgbm9uIGNvbW1lcmNpYWwsIG5vbiBwcm9mZXNzaW9uYWwKLy8gICB3b3JrLgovLyAgIEl0IHNob3VsZCBub3QgaGF2ZSB1bmV4cGVjdGVkIHJlc3VsdHMuIEhvd2V2ZXIgaWYgYW55IGRhbWFnZSBpcyBjYXVzZWQgYnkKLy8gICB0aGlzIHNvZnR3YXJlIHRoZSBhdXRob3IgY2FuIG5vdCBiZSByZXNwb25zaWJsZS4KLy8gICBUaGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgYXQgdGhlIHJpc2sgb2YgdGhlIHVzZXIuCi8vCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICRJZDogcGNsemlwLmxpYi5waHAsdiAxLjYwIDIwMDkvMDkvMzAgMjE6MDE6MDQgdmJsYXZldCBFeHAgJAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLSBDb25zdGFudHMKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9SRUFEX0JMT0NLX1NJWkUnKSkgewogICAgZGVmaW5lKCAnUENMWklQX1JFQURfQkxPQ0tfU0laRScsIDIwNDggKTsKICB9CgogIC8vIC0tLS0tIEZpbGUgbGlzdCBzZXBhcmF0b3IKICAvLyBJbiB2ZXJzaW9uIDEueCBvZiBQY2xaaXAsIHRoZSBzZXBhcmF0b3IgZm9yIGZpbGUgbGlzdCBpcyBhIHNwYWNlCiAgLy8gKHdoaWNoIGlzIG5vdCBhIHZlcnkgc21hcnQgY2hvaWNlLCBzcGVjaWZpY2FsbHkgZm9yIHdpbmRvd3MgcGF0aHMgISkuCiAgLy8gQSBiZXR0ZXIgc2VwYXJhdG9yIHNob3VsZCBiZSBhIGNvbW1hICgsKS4gVGhpcyBjb25zdGFudCBnaXZlcyB5b3UgdGhlCiAgLy8gYWJpbHR5IHRvIGNoYW5nZSB0aGF0LgogIC8vIEhvd2V2ZXIgbm90aWNlIHRoYXQgY2hhbmdpbmcgdGhpcyB2YWx1ZSwgbWF5IGhhdmUgaW1wYWN0IG9uIGV4aXN0aW5nCiAgLy8gc2NyaXB0cywgdXNpbmcgc3BhY2Ugc2VwYXJhdGVkIGZpbGVuYW1lcy4KICAvLyBSZWNvbW1hbmRlZCB2YWx1ZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyA6CiAgLy9kZWZpbmUoICdQQ0xaSVBfU0VQQVJBVE9SJywgJyAnICk7CiAgLy8gUmVjb21tYW5kZWQgdmFsdWVzIGZvciBzbWFydCBzZXBhcmF0aW9uIG9mIGZpbGVuYW1lcy4KICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9TRVBBUkFUT1InKSkgewogICAgZGVmaW5lKCAnUENMWklQX1NFUEFSQVRPUicsICcsJyApOwogIH0KCiAgLy8gLS0tLS0gRXJyb3IgY29uZmlndXJhdGlvbgogIC8vIDAgOiBQY2xaaXAgQ2xhc3MgaW50ZWdyYXRlZCBlcnJvciBoYW5kbGluZwogIC8vIDEgOiBQY2xFcnJvciBleHRlcm5hbCBsaWJyYXJ5IGVycm9yIGhhbmRsaW5nLiBCeSBlbmFibGluZyB0aGlzCiAgLy8gICAgIHlvdSBtdXN0IGVuc3VyZSB0aGF0IHlvdSBoYXZlIGluY2x1ZGVkIFBjbEVycm9yIGxpYnJhcnkuCiAgLy8gWzIsLi4uXSA6IHJlc2VydmVkIGZvciBmdXR1ciB1c2UKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9FUlJPUl9FWFRFUk5BTCcpKSB7CiAgICBkZWZpbmUoICdQQ0xaSVBfRVJST1JfRVhURVJOQUwnLCAwICk7CiAgfQoKICAvLyAtLS0tLSBPcHRpb25hbCBzdGF0aWMgdGVtcG9yYXJ5IGRpcmVjdG9yeQogIC8vICAgICAgIEJ5IGRlZmF1bHQgdGVtcG9yYXJ5IGZpbGVzIGFyZSBnZW5lcmF0ZWQgaW4gdGhlIHNjcmlwdCBjdXJyZW50CiAgLy8gICAgICAgcGF0aC4KICAvLyAgICAgICBJZiBkZWZpbmVkIDoKICAvLyAgICAgICAtIE1VU1QgQkUgdGVybWluYXRlZCBieSBhICcvJy4KICAvLyAgICAgICAtIE1VU1QgYmUgYSB2YWxpZCwgYWxyZWFkeSBjcmVhdGVkIGRpcmVjdG9yeQogIC8vICAgICAgIFNhbXBsZXMgOgogIC8vIGRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJy90ZW1wLycgKTsKICAvLyBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0RJUicsICdDOi9UZW1wLycgKTsKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9URU1QT1JBUllfRElSJykpIHsKICAgIGRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJycgKTsKICB9CgogIC8vIC0tLS0tIE9wdGlvbmFsIHRocmVzaG9sZCByYXRpbyBmb3IgdXNlIG9mIHRlbXBvcmFyeSBmaWxlcwogIC8vICAgICAgIFBjbHppcCBzZW5zZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSB0byBhZGQvZXh0cmFjdCBhbmQgZGVjaWRlIHRvCiAgLy8gICAgICAgdXNlIG9yIG5vdCB0ZW1wb3JhcnkgZmlsZS4gVGhlIGFsZ29yeXRobSBpcyBsb29raW5nIGZvcgogIC8vICAgICAgIG1lbW9yeV9saW1pdCBvZiBQSFAgYW5kIGFwcGx5IGEgcmF0aW8uCiAgLy8gICAgICAgdGhyZXNob2xkID0gbWVtb3J5X2xpbWl0ICogcmF0aW8uCiAgLy8gICAgICAgUmVjb21tZW5kZWQgdmFsdWVzIGFyZSB1bmRlciAwLjUuIERlZmF1bHQgMC40Ny4KICAvLyAgICAgICBTYW1wbGVzIDoKICAvLyBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8nLCAwLjUgKTsKICBpZiAoIWRlZmluZWQoJ1BDTFpJUF9URU1QT1JBUllfRklMRV9SQVRJTycpKSB7CiAgICBkZWZpbmUoICdQQ0xaSVBfVEVNUE9SQVJZX0ZJTEVfUkFUSU8nLCAwLjQ3ICk7CiAgfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gKioqKiogVU5ERVIgVEhJUyBMSU5FIE5PVEhJTkcgTkVFRFMgVE8gQkUgTU9ESUZJRUQgKioqKioKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0gR2xvYmFsIHZhcmlhYmxlcwogICRnX3BjbHppcF92ZXJzaW9uID0gIjIuOC4yIjsKCiAgLy8gLS0tLS0gRXJyb3IgY29kZXMKICAvLyAgIC0xIDogVW5hYmxlIHRvIG9wZW4gZmlsZSBpbiBiaW5hcnkgd3JpdGUgbW9kZQogIC8vICAgLTIgOiBVbmFibGUgdG8gb3BlbiBmaWxlIGluIGJpbmFyeSByZWFkIG1vZGUKICAvLyAgIC0zIDogSW52YWxpZCBwYXJhbWV0ZXJzCiAgLy8gICAtNCA6IEZpbGUgZG9lcyBub3QgZXhpc3QKICAvLyAgIC01IDogRmlsZW5hbWUgaXMgdG9vIGxvbmcgKG1heC4gMjU1KQogIC8vICAgLTYgOiBOb3QgYSB2YWxpZCB6aXAgZmlsZQogIC8vICAgLTcgOiBJbnZhbGlkIGV4dHJhY3RlZCBmaWxlIHNpemUKICAvLyAgIC04IDogVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkKICAvLyAgIC05IDogSW52YWxpZCBhcmNoaXZlIGV4dGVuc2lvbgogIC8vICAtMTAgOiBJbnZhbGlkIGFyY2hpdmUgZm9ybWF0CiAgLy8gIC0xMSA6IFVuYWJsZSB0byBkZWxldGUgZmlsZSAodW5saW5rKQogIC8vICAtMTIgOiBVbmFibGUgdG8gcmVuYW1lIGZpbGUgKHJlbmFtZSkKICAvLyAgLTEzIDogSW52YWxpZCBoZWFkZXIgY2hlY2tzdW0KICAvLyAgLTE0IDogSW52YWxpZCBhcmNoaXZlIHNpemUKICBkZWZpbmUoICdQQ0xaSVBfRVJSX1VTRVJfQUJPUlRFRCcsIDIgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX05PX0VSUk9SJywgMCApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMJywgLTEgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMJywgLTIgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSJywgLTMgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX01JU1NJTkdfRklMRScsIC00ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9GSUxFTkFNRV9UT09fTE9ORycsIC01ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX1pJUCcsIC02ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9CQURfRVhUUkFDVEVEX0ZJTEUnLCAtNyApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfRElSX0NSRUFURV9GQUlMJywgLTggKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX0JBRF9FWFRFTlNJT04nLCAtOSApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfQkFEX0ZPUk1BVCcsIC0xMCApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfREVMRVRFX0ZJTEVfRkFJTCcsIC0xMSApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfUkVOQU1FX0ZJTEVfRkFJTCcsIC0xMiApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfQkFEX0NIRUNLU1VNJywgLTEzICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQJywgLTE0ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRScsIC0xNSApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUnLCAtMTYgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX0FMUkVBRFlfQV9ESVJFQ1RPUlknLCAtMTcgKTsKICBkZWZpbmUoICdQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OJywgLTE4ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OJywgLTE5ICk7CiAgZGVmaW5lKCAnUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRScsIC0yMCApOwogIGRlZmluZSggJ1BDTFpJUF9FUlJfRElSRUNUT1JZX1JFU1RSSUNUSU9OJywgLTIxICk7CgogIC8vIC0tLS0tIE9wdGlvbnMgdmFsdWVzCiAgZGVmaW5lKCAnUENMWklQX09QVF9QQVRIJywgNzcwMDEgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX0FERF9QQVRIJywgNzcwMDIgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIJywgNzcwMDMgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCcsIDc3MDA0ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9TRVRfQ0hNT0QnLCA3NzAwNSApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcnLCA3NzAwNiApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfTk9fQ09NUFJFU1NJT04nLCA3NzAwNyApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfQllfTkFNRScsIDc3MDA4ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9CWV9JTkRFWCcsIDc3MDA5ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9CWV9FUkVHJywgNzcwMTAgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX0JZX1BSRUcnLCA3NzAxMSApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfQ09NTUVOVCcsIDc3MDEyICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9BRERfQ09NTUVOVCcsIDc3MDEzICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlQnLCA3NzAxNCApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfRVhUUkFDVF9JTl9PVVRQVVQnLCA3NzAxNSApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUicsIDc3MDE2ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9TVE9QX09OX0VSUk9SJywgNzcwMTcgKTsKICAvLyBIYXZpbmcgYmlnIHRyb3VibGUgd2l0aCBjcnlwdC4gTmVlZCB0byBtdWx0aXBseSAyIGxvbmcgaW50CiAgLy8gd2hpY2ggaXMgbm90IGNvcnJlY3RseSBzdXBwb3J0ZWQgYnkgUEhQIC4uLgogIC8vZGVmaW5lKCAnUENMWklQX09QVF9DUllQVCcsIDc3MDE4ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTicsIDc3MDE5ICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEJywgNzcwMjAgKTsKICBkZWZpbmUoICdQQ0xaSVBfT1BUX0FERF9URU1QX0ZJTEVfVEhSRVNIT0xEJywgNzcwMjAgKTsgLy8gYWxpYXMKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTicsIDc3MDIxICk7CiAgZGVmaW5lKCAnUENMWklQX09QVF9BRERfVEVNUF9GSUxFX09OJywgNzcwMjEgKTsgLy8gYWxpYXMKICBkZWZpbmUoICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkYnLCA3NzAyMiApOwogIGRlZmluZSggJ1BDTFpJUF9PUFRfQUREX1RFTVBfRklMRV9PRkYnLCA3NzAyMiApOyAvLyBhbGlhcwoKICAvLyAtLS0tLSBGaWxlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMKICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfTkFNRScsIDc5MDAxICk7CiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX05FV19TSE9SVF9OQU1FJywgNzkwMDIgKTsKICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfTkVXX0ZVTExfTkFNRScsIDc5MDAzICk7CiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX01USU1FJywgNzkwMDQgKTsKICBkZWZpbmUoICdQQ0xaSVBfQVRUX0ZJTEVfQ09OVEVOVCcsIDc5MDA1ICk7CiAgZGVmaW5lKCAnUENMWklQX0FUVF9GSUxFX0NPTU1FTlQnLCA3OTAwNiApOwoKICAvLyAtLS0tLSBDYWxsIGJhY2tzIHZhbHVlcwogIGRlZmluZSggJ1BDTFpJUF9DQl9QUkVfRVhUUkFDVCcsIDc4MDAxICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BPU1RfRVhUUkFDVCcsIDc4MDAyICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BSRV9BREQnLCA3ODAwMyApOwogIGRlZmluZSggJ1BDTFpJUF9DQl9QT1NUX0FERCcsIDc4MDA0ICk7CiAgLyogRm9yIGZ1dHVyIHVzZQogIGRlZmluZSggJ1BDTFpJUF9DQl9QUkVfTElTVCcsIDc4MDA1ICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BPU1RfTElTVCcsIDc4MDA2ICk7CiAgZGVmaW5lKCAnUENMWklQX0NCX1BSRV9ERUxFVEUnLCA3ODAwNyApOwogIGRlZmluZSggJ1BDTFpJUF9DQl9QT1NUX0RFTEVURScsIDc4MDA4ICk7CiAgKi8KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDbGFzcyA6IFBjbFppcAogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFBjbFppcCBpcyB0aGUgY2xhc3MgdGhhdCByZXByZXNlbnQgYSBaaXAgYXJjaGl2ZS4KICAvLyAgIFRoZSBwdWJsaWMgbWV0aG9kcyBhbGxvdyB0aGUgbWFuaXB1bGF0aW9uIG9mIHRoZSBhcmNoaXZlLgogIC8vIEF0dHJpYnV0ZXMgOgogIC8vICAgQXR0cmlidXRlcyBtdXN0IG5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseS4KICAvLyBNZXRob2RzIDoKICAvLyAgIFBjbFppcCgpIDogT2JqZWN0IGNyZWF0b3IKICAvLyAgIGNyZWF0ZSgpIDogQ3JlYXRlcyB0aGUgWmlwIGFyY2hpdmUKICAvLyAgIGxpc3RDb250ZW50KCkgOiBMaXN0IHRoZSBjb250ZW50IG9mIHRoZSBaaXAgYXJjaGl2ZQogIC8vICAgZXh0cmFjdCgpIDogRXh0cmFjdCB0aGUgY29udGVudCBvZiB0aGUgYXJjaGl2ZQogIC8vICAgcHJvcGVydGllcygpIDogTGlzdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXJjaGl2ZQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgY2xhc3MgUGNsWmlwCiAgewogICAgLy8gLS0tLS0gRmlsZW5hbWUgb2YgdGhlIHppcCBmaWxlCiAgICB2YXIgJHppcG5hbWUgPSAnJzsKCiAgICAvLyAtLS0tLSBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHppcCBmaWxlCiAgICB2YXIgJHppcF9mZCA9IDA7CgogICAgLy8gLS0tLS0gSW50ZXJuYWwgZXJyb3IgaGFuZGxpbmcKICAgIHZhciAkZXJyb3JfY29kZSA9IDE7CiAgICB2YXIgJGVycm9yX3N0cmluZyA9ICcnOwoKICAgIC8vIC0tLS0tIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtYWdpY19xdW90ZXNfcnVudGltZQogICAgLy8gVGhpcyB2YWx1ZSBzdG9yZSB0aGUgcGhwIGNvbmZpZ3VyYXRpb24gZm9yIG1hZ2ljX3F1b3RlcwogICAgLy8gVGhlIGNsYXNzIGNhbiB0aGVuIGRpc2FibGUgdGhlIG1hZ2ljX3F1b3RlcyBhbmQgcmVzZXQgaXQgYWZ0ZXIKICAgIHZhciAkbWFnaWNfcXVvdGVzX3N0YXR1czsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IFBjbFppcCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgQ3JlYXRlcyBhIFBjbFppcCBvYmplY3QgYW5kIHNldCB0aGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBaaXAgYXJjaGl2ZQogIC8vICAgZmlsZW5hbWUuCiAgLy8gICBOb3RlIHRoYXQgbm8gcmVhbCBhY3Rpb24gaXMgdGFrZW4sIGlmIHRoZSBhcmNoaXZlIGRvZXMgbm90IGV4aXN0IGl0IGlzIG5vdAogIC8vICAgY3JlYXRlZC4gVXNlIGNyZWF0ZSgpIGZvciB0aGF0LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gUGNsWmlwKCRwX3ppcG5hbWUpCiAgewoKICAgIC8vIC0tLS0tIFRlc3RzIHRoZSB6bGliCiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3pvcGVuJykpCiAgICB7CiAgICAgIGRpZSgnQWJvcnQgJy5iYXNlbmFtZShfX0ZJTEVfXykuJyA6IE1pc3NpbmcgemxpYiBleHRlbnNpb25zJyk7CiAgICB9CgogICAgLy8gLS0tLS0gU2V0IHRoZSBhdHRyaWJ1dGVzCiAgICAkdGhpcy0+emlwbmFtZSA9ICRwX3ppcG5hbWU7CiAgICAkdGhpcy0+emlwX2ZkID0gMDsKICAgICR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzID0gLTE7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm47CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOgogIC8vICAgY3JlYXRlKCRwX2ZpbGVsaXN0LCAkcF9hZGRfZGlyPSIiLCAkcF9yZW1vdmVfZGlyPSIiKQogIC8vICAgY3JlYXRlKCRwX2ZpbGVsaXN0LCAkcF9vcHRpb24sICRwX29wdGlvbl92YWx1ZSwgLi4uKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHR3byBkaWZmZXJlbnQgc3lub3BzaXMuIFRoZSBmaXJzdCBvbmUgaXMgaGlzdG9yaWNhbC4KICAvLyAgIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBaaXAgQXJjaGl2ZS4gVGhlIFppcCBmaWxlIGlzIGNyZWF0ZWQgaW4gdGhlCiAgLy8gICBmaWxlc3lzdGVtLiBUaGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluZGljYXRlZCBpbiAkcF9maWxlbGlzdAogIC8vICAgYXJlIGFkZGVkIGluIHRoZSBhcmNoaXZlLiBTZWUgdGhlIHBhcmFtZXRlcnMgZGVzY3JpcHRpb24gZm9yIHRoZQogIC8vICAgc3VwcG9ydGVkIGZvcm1hdCBvZiAkcF9maWxlbGlzdC4KICAvLyAgIFdoZW4gYSBkaXJlY3RvcnkgaXMgaW4gdGhlIGxpc3QsIHRoZSBkaXJlY3RvcnkgYW5kIGl0cyBjb250ZW50IGlzIGFkZGVkCiAgLy8gICBpbiB0aGUgYXJjaGl2ZS4KICAvLyAgIEluIHRoaXMgc3lub3BzaXMsIHRoZSBmdW5jdGlvbiB0YWtlcyBhbiBvcHRpb25hbCB2YXJpYWJsZSBsaXN0IG9mCiAgLy8gICBvcHRpb25zLiBTZWUgYmVsbG93IHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2ZpbGVsaXN0IDogQW4gYXJyYXkgY29udGFpbmluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lcywgb3IKICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgZmlsZW5hbWUgb3Igb25lIGRpcmVjdG9yeSBuYW1lLCBvcgogIC8vICAgICAgICAgICAgICAgICBhIHN0cmluZyBjb250YWluaW5nIGEgbGlzdCBvZiBmaWxlbmFtZXMgYW5kL29yIGRpcmVjdG9yeQogIC8vICAgICAgICAgICAgICAgICBuYW1lcyBzZXBhcmF0ZWQgYnkgc3BhY2VzLgogIC8vICAgJHBfYWRkX2RpciA6IEEgcGF0aCB0byBhZGQgYmVmb3JlIHRoZSByZWFsIHBhdGggb2YgdGhlIGFyY2hpdmVkIGZpbGUsCiAgLy8gICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gaGF2ZSBpdCBtZW1vcml6ZWQgaW4gdGhlIGFyY2hpdmUuCiAgLy8gICAkcF9yZW1vdmVfZGlyIDogQSBwYXRoIHRvIHJlbW92ZSBmcm9tIHRoZSByZWFsIHBhdGggb2YgdGhlIGZpbGUgdG8gYXJjaGl2ZSwKICAvLyAgICAgICAgICAgICAgICAgICBpbiBvcmRlciB0byBoYXZlIGEgc2hvcnRlciBwYXRoIG1lbW9yaXplZCBpbiB0aGUgYXJjaGl2ZS4KICAvLyAgICAgICAgICAgICAgICAgICBXaGVuICRwX2FkZF9kaXIgYW5kICRwX3JlbW92ZV9kaXIgYXJlIHNldCwgJHBfcmVtb3ZlX2RpcgogIC8vICAgICAgICAgICAgICAgICAgIGlzIHJlbW92ZWQgZmlyc3QsIGJlZm9yZSAkcF9hZGRfZGlyIGlzIGFkZGVkLgogIC8vIE9wdGlvbnMgOgogIC8vICAgUENMWklQX09QVF9BRERfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfQ09NTUVOVCA6CiAgLy8gICBQQ0xaSVBfQ0JfUFJFX0FERCA6CiAgLy8gICBQQ0xaSVBfQ0JfUE9TVF9BREQgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBvbiBmYWlsdXJlLAogIC8vICAgVGhlIGxpc3Qgb2YgdGhlIGFkZGVkIGZpbGVzLCB3aXRoIGEgc3RhdHVzIG9mIHRoZSBhZGQgYWN0aW9uLgogIC8vICAgKHNlZSBQY2xaaXA6Omxpc3RDb250ZW50KCkgZm9yIGxpc3QgZW50cnkgZm9ybWF0KQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gY3JlYXRlKCRwX2ZpbGVsaXN0KQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMKICAgICR2X29wdGlvbnMgPSBhcnJheSgpOwogICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OXSA9IEZBTFNFOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzCiAgICAkdl9zaXplID0gZnVuY19udW1fYXJncygpOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cwogICAgaWYgKCR2X3NpemUgPiAxKSB7CiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzCiAgICAgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOwoKICAgICAgLy8gLS0tLS0gUmVtb3ZlIGZyb20gdGhlIG9wdGlvbnMgbGlzdCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAgYXJyYXlfc2hpZnQoJHZfYXJnX2xpc3QpOwogICAgICAkdl9zaXplLS07CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBmaXJzdCBhcmcKICAgICAgaWYgKChpc19pbnRlZ2VyKCR2X2FyZ19saXN0WzBdKSkgJiYgKCR2X2FyZ19saXN0WzBdID4gNzcwMDApKSB7CgogICAgICAgIC8vIC0tLS0tIFBhcnNlIHRoZSBvcHRpb25zCiAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZQYXJzZU9wdGlvbnMoJHZfYXJnX2xpc3QsICR2X3NpemUsICR2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9BRERfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUFJFX0FERCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUE9TVF9BREQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09OID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfVEVNUF9GSUxFX09GRiA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLCBQQ0xaSVBfT1BUX0NSWVBUID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CiAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIDIgYXJncwogICAgICAvLyBIZXJlIHdlIG5lZWQgdG8gc3VwcG9ydCB0aGUgZmlyc3QgaGlzdG9yaWMgc3lub3BzaXMgb2YgdGhlCiAgICAgIC8vIG1ldGhvZC4KICAgICAgZWxzZSB7CgogICAgICAgIC8vIC0tLS0tIEdldCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdID0gJHZfYXJnX2xpc3RbMF07CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQKICAgICAgICBpZiAoJHZfc2l6ZSA9PSAyKSB7CiAgICAgICAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdID0gJHZfYXJnX2xpc3RbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR2X3NpemUgPiAyKSB7CiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLAoJCSAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIC8gdHlwZSBvZiBhcmd1bWVudHMiKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGRlZmF1bHQgb3B0aW9uIHZhbHVlcwogICAgJHRoaXMtPnByaXZPcHRpb25EZWZhdWx0VGhyZXNob2xkKCR2X29wdGlvbnMpOwoKICAgIC8vIC0tLS0tIEluaXQKICAgICR2X3N0cmluZ19saXN0ID0gYXJyYXkoKTsKICAgICR2X2F0dF9saXN0ID0gYXJyYXkoKTsKICAgICR2X2ZpbGVkZXNjcl9saXN0ID0gYXJyYXkoKTsKICAgICRwX3Jlc3VsdF9saXN0ID0gYXJyYXkoKTsKCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyByZWFsbHkgYW4gYXJyYXkKICAgIGlmIChpc19hcnJheSgkcF9maWxlbGlzdCkpIHsKCiAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpcnN0IGVsZW1lbnQgaXMgYWxzbyBhbiBhcnJheQogICAgICAvLyAgICAgICBUaGlzIHdpbGwgbWVhbiB0aGF0IHRoaXMgaXMgYSBmaWxlIGRlc2NyaXB0aW9uIGVudHJ5CiAgICAgIGlmIChpc3NldCgkcF9maWxlbGlzdFswXSkgJiYgaXNfYXJyYXkoJHBfZmlsZWxpc3RbMF0pKSB7CiAgICAgICAgJHZfYXR0X2xpc3QgPSAkcF9maWxlbGlzdDsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gVGhlIGxpc3QgaXMgYSBsaXN0IG9mIHN0cmluZyBuYW1lcwogICAgICBlbHNlIHsKICAgICAgICAkdl9zdHJpbmdfbGlzdCA9ICRwX2ZpbGVsaXN0OwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfZmlsZWxpc3QgaXMgYSBzdHJpbmcKICAgIGVsc2UgaWYgKGlzX3N0cmluZygkcF9maWxlbGlzdCkpIHsKICAgICAgLy8gLS0tLS0gQ3JlYXRlIGEgbGlzdCBmcm9tIHRoZSBzdHJpbmcKICAgICAgJHZfc3RyaW5nX2xpc3QgPSBleHBsb2RlKFBDTFpJUF9TRVBBUkFUT1IsICRwX2ZpbGVsaXN0KTsKICAgIH0KCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlIHR5cGUgZm9yICRwX2ZpbGVsaXN0CiAgICBlbHNlIHsKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgdmFyaWFibGUgdHlwZSBwX2ZpbGVsaXN0Iik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIC0tLS0tIFJlZm9ybWF0IHRoZSBzdHJpbmcgbGlzdAogICAgaWYgKHNpemVvZigkdl9zdHJpbmdfbGlzdCkgIT0gMCkgewogICAgICBmb3JlYWNoICgkdl9zdHJpbmdfbGlzdCBhcyAkdl9zdHJpbmcpIHsKICAgICAgICBpZiAoJHZfc3RyaW5nICE9ICcnKSB7CiAgICAgICAgICAkdl9hdHRfbGlzdFtdW1BDTFpJUF9BVFRfRklMRV9OQU1FXSA9ICR2X3N0cmluZzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gRm9yIGVhY2ggZmlsZSBpbiB0aGUgbGlzdCBjaGVjayB0aGUgYXR0cmlidXRlcwogICAgJHZfc3VwcG9ydGVkX2F0dHJpYnV0ZXMKICAgID0gYXJyYXkgKCBQQ0xaSVBfQVRUX0ZJTEVfTkFNRSA9PiAnbWFuZGF0b3J5JwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9ORVdfU0hPUlRfTkFNRSA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX05FV19GVUxMX05BTUUgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9NVElNRSA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAsUENMWklQX0FUVF9GSUxFX0NPTlRFTlQgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9DT01NRU5UID0+ICdvcHRpb25hbCcKCQkJCQkJKTsKICAgIGZvcmVhY2ggKCR2X2F0dF9saXN0IGFzICR2X2VudHJ5KSB7CiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RmlsZURlc2NyUGFyc2VBdHQoJHZfZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZfZmlsZWRlc2NyX2xpc3RbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X3N1cHBvcnRlZF9hdHRyaWJ1dGVzKTsKICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBFeHBhbmQgdGhlIGZpbGVsaXN0IChleHBhbmQgZGlyZWN0b3JpZXMpCiAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkZpbGVEZXNjckV4cGFuZCgkdl9maWxlZGVzY3JfbGlzdCwgJHZfb3B0aW9ucyk7CiAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8gLS0tLS0gQ2FsbCB0aGUgY3JlYXRlIGZjdAogICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZDcmVhdGUoJHZfZmlsZWRlc2NyX2xpc3QsICRwX3Jlc3VsdF9saXN0LCAkdl9vcHRpb25zKTsKICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkcF9yZXN1bHRfbGlzdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6CiAgLy8gICBhZGQoJHBfZmlsZWxpc3QsICRwX2FkZF9kaXI9IiIsICRwX3JlbW92ZV9kaXI9IiIpCiAgLy8gICBhZGQoJHBfZmlsZWxpc3QsICRwX29wdGlvbiwgJHBfb3B0aW9uX3ZhbHVlLCAuLi4pCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2Qgc3VwcG9ydHMgdHdvIHN5bm9wc2lzLiBUaGUgZmlyc3Qgb25lIGlzIGhpc3RvcmljYWwuCiAgLy8gICBUaGlzIG1ldGhvZHMgYWRkIHRoZSBsaXN0IG9mIGZpbGVzIGluIGFuIGV4aXN0aW5nIGFyY2hpdmUuCiAgLy8gICBJZiBhIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCBpdCBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZQogIC8vICAgYXJjaGl2ZSwgdGhlIGZpcnN0IG9uZSBpcyBzdGlsbCBwcmVzZW50LgogIC8vICAgSWYgdGhlIGFyY2hpdmUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9maWxlbGlzdCA6IEFuIGFycmF5IGNvbnRhaW5pbmcgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMsIG9yCiAgLy8gICAgICAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGZpbGVuYW1lIG9yIG9uZSBkaXJlY3RvcnkgbmFtZSwgb3IKICAvLyAgICAgICAgICAgICAgICAgYSBzdHJpbmcgY29udGFpbmluZyBhIGxpc3Qgb2YgZmlsZW5hbWVzIGFuZC9vciBkaXJlY3RvcnkKICAvLyAgICAgICAgICAgICAgICAgbmFtZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KICAvLyAgICRwX2FkZF9kaXIgOiBBIHBhdGggdG8gYWRkIGJlZm9yZSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBhcmNoaXZlZCBmaWxlLAogIC8vICAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIGhhdmUgaXQgbWVtb3JpemVkIGluIHRoZSBhcmNoaXZlLgogIC8vICAgJHBfcmVtb3ZlX2RpciA6IEEgcGF0aCB0byByZW1vdmUgZnJvbSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBmaWxlIHRvIGFyY2hpdmUsCiAgLy8gICAgICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gaGF2ZSBhIHNob3J0ZXIgcGF0aCBtZW1vcml6ZWQgaW4gdGhlIGFyY2hpdmUuCiAgLy8gICAgICAgICAgICAgICAgICAgV2hlbiAkcF9hZGRfZGlyIGFuZCAkcF9yZW1vdmVfZGlyIGFyZSBzZXQsICRwX3JlbW92ZV9kaXIKICAvLyAgICAgICAgICAgICAgICAgICBpcyByZW1vdmVkIGZpcnN0LCBiZWZvcmUgJHBfYWRkX2RpciBpcyBhZGRlZC4KICAvLyBPcHRpb25zIDoKICAvLyAgIFBDTFpJUF9PUFRfQUREX1BBVEggOgogIC8vICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX0NPTU1FTlQgOgogIC8vICAgUENMWklQX09QVF9BRERfQ09NTUVOVCA6CiAgLy8gICBQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVCA6CiAgLy8gICBQQ0xaSVBfQ0JfUFJFX0FERCA6CiAgLy8gICBQQ0xaSVBfQ0JfUE9TVF9BREQgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBvbiBmYWlsdXJlLAogIC8vICAgVGhlIGxpc3Qgb2YgdGhlIGFkZGVkIGZpbGVzLCB3aXRoIGEgc3RhdHVzIG9mIHRoZSBhZGQgYWN0aW9uLgogIC8vICAgKHNlZSBQY2xaaXA6Omxpc3RDb250ZW50KCkgZm9yIGxpc3QgZW50cnkgZm9ybWF0KQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gYWRkKCRwX2ZpbGVsaXN0KQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMKICAgICR2X29wdGlvbnMgPSBhcnJheSgpOwogICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OXSA9IEZBTFNFOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHZhcmlhYmxlIG9wdGlvbnMgYXJndW1lbnRzCiAgICAkdl9zaXplID0gZnVuY19udW1fYXJncygpOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cwogICAgaWYgKCR2X3NpemUgPiAxKSB7CiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzCiAgICAgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOwoKICAgICAgLy8gLS0tLS0gUmVtb3ZlIGZvcm0gdGhlIG9wdGlvbnMgbGlzdCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAgYXJyYXlfc2hpZnQoJHZfYXJnX2xpc3QpOwogICAgICAkdl9zaXplLS07CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBmaXJzdCBhcmcKICAgICAgaWYgKChpc19pbnRlZ2VyKCR2X2FyZ19saXN0WzBdKSkgJiYgKCR2X2FyZ19saXN0WzBdID4gNzcwMDApKSB7CgogICAgICAgIC8vIC0tLS0tIFBhcnNlIHRoZSBvcHRpb25zCiAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZQYXJzZU9wdGlvbnMoJHZfYXJnX2xpc3QsICR2X3NpemUsICR2X29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgKFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9BRERfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUFJFX0FERCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUE9TVF9BREQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0NPTU1FTlQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9BRERfQ09NTUVOVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8sIFBDTFpJUF9PUFRfQ1JZUFQgPT4gJ29wdGlvbmFsJwoJCQkJCQkJCQkJCQkgICApKTsKICAgICAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgMiBhcmdzCiAgICAgIC8vIEhlcmUgd2UgbmVlZCB0byBzdXBwb3J0IHRoZSBmaXJzdCBoaXN0b3JpYyBzeW5vcHNpcyBvZiB0aGUKICAgICAgLy8gbWV0aG9kLgogICAgICBlbHNlIHsKCiAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBmaXJzdCBhcmd1bWVudAogICAgICAgICR2X29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF0gPSAkdl9hZGRfcGF0aCA9ICR2X2FyZ19saXN0WzBdOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgaWYgKCR2X3NpemUgPT0gMikgewogICAgICAgICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXSA9ICR2X2FyZ19saXN0WzFdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkdl9zaXplID4gMikgewogICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBudW1iZXIgLyB0eXBlIG9mIGFyZ3VtZW50cyIpOwoKICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgZGVmYXVsdCBvcHRpb24gdmFsdWVzCiAgICAkdGhpcy0+cHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoJHZfb3B0aW9ucyk7CgogICAgLy8gLS0tLS0gSW5pdAogICAgJHZfc3RyaW5nX2xpc3QgPSBhcnJheSgpOwogICAgJHZfYXR0X2xpc3QgPSBhcnJheSgpOwogICAgJHZfZmlsZWRlc2NyX2xpc3QgPSBhcnJheSgpOwogICAgJHBfcmVzdWx0X2xpc3QgPSBhcnJheSgpOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2ZpbGVsaXN0IGlzIHJlYWxseSBhbiBhcnJheQogICAgaWYgKGlzX2FycmF5KCRwX2ZpbGVsaXN0KSkgewoKICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbHNvIGFuIGFycmF5CiAgICAgIC8vICAgICAgIFRoaXMgd2lsbCBtZWFuIHRoYXQgdGhpcyBpcyBhIGZpbGUgZGVzY3JpcHRpb24gZW50cnkKICAgICAgaWYgKGlzc2V0KCRwX2ZpbGVsaXN0WzBdKSAmJiBpc19hcnJheSgkcF9maWxlbGlzdFswXSkpIHsKICAgICAgICAkdl9hdHRfbGlzdCA9ICRwX2ZpbGVsaXN0OwogICAgICB9CgogICAgICAvLyAtLS0tLSBUaGUgbGlzdCBpcyBhIGxpc3Qgb2Ygc3RyaW5nIG5hbWVzCiAgICAgIGVsc2UgewogICAgICAgICR2X3N0cmluZ19saXN0ID0gJHBfZmlsZWxpc3Q7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9maWxlbGlzdCBpcyBhIHN0cmluZwogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2ZpbGVsaXN0KSkgewogICAgICAvLyAtLS0tLSBDcmVhdGUgYSBsaXN0IGZyb20gdGhlIHN0cmluZwogICAgICAkdl9zdHJpbmdfbGlzdCA9IGV4cGxvZGUoUENMWklQX1NFUEFSQVRPUiwgJHBfZmlsZWxpc3QpOwogICAgfQoKICAgIC8vIC0tLS0tIEludmFsaWQgdmFyaWFibGUgdHlwZSBmb3IgJHBfZmlsZWxpc3QKICAgIGVsc2UgewogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlICciLmdldHR5cGUoJHBfZmlsZWxpc3QpLiInIGZvciBwX2ZpbGVsaXN0Iik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIC0tLS0tIFJlZm9ybWF0IHRoZSBzdHJpbmcgbGlzdAogICAgaWYgKHNpemVvZigkdl9zdHJpbmdfbGlzdCkgIT0gMCkgewogICAgICBmb3JlYWNoICgkdl9zdHJpbmdfbGlzdCBhcyAkdl9zdHJpbmcpIHsKICAgICAgICAkdl9hdHRfbGlzdFtdW1BDTFpJUF9BVFRfRklMRV9OQU1FXSA9ICR2X3N0cmluZzsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIEZvciBlYWNoIGZpbGUgaW4gdGhlIGxpc3QgY2hlY2sgdGhlIGF0dHJpYnV0ZXMKICAgICR2X3N1cHBvcnRlZF9hdHRyaWJ1dGVzCiAgICA9IGFycmF5ICggUENMWklQX0FUVF9GSUxFX05BTUUgPT4gJ21hbmRhdG9yeScKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfTkVXX1NIT1JUX05BTUUgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9ORVdfRlVMTF9OQU1FID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfTVRJTUUgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgLFBDTFpJUF9BVFRfRklMRV9DT05URU5UID0+ICdvcHRpb25hbCcKICAgICAgICAgICAgICxQQ0xaSVBfQVRUX0ZJTEVfQ09NTUVOVCA9PiAnb3B0aW9uYWwnCgkJCQkJCSk7CiAgICBmb3JlYWNoICgkdl9hdHRfbGlzdCBhcyAkdl9lbnRyeSkgewogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkZpbGVEZXNjclBhcnNlQXR0KCR2X2VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X2ZpbGVkZXNjcl9saXN0W10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9zdXBwb3J0ZWRfYXR0cmlidXRlcyk7CiAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gRXhwYW5kIHRoZSBmaWxlbGlzdCAoZXhwYW5kIGRpcmVjdG9yaWVzKQogICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZGaWxlRGVzY3JFeHBhbmQoJHZfZmlsZWRlc2NyX2xpc3QsICR2X29wdGlvbnMpOwogICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIC0tLS0tIENhbGwgdGhlIGNyZWF0ZSBmY3QKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkKCR2X2ZpbGVkZXNjcl9saXN0LCAkcF9yZXN1bHRfbGlzdCwgJHZfb3B0aW9ucyk7CiAgICBpZiAoJHZfcmVzdWx0ICE9IDEpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHBfcmVzdWx0X2xpc3Q7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBsaXN0Q29udGVudCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBwdWJsaWMgbWV0aG9kLCBnaXZlcyB0aGUgbGlzdCBvZiB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCB3aXRoIHRoZWlyCiAgLy8gICBwcm9wZXJ0aWVzLgogIC8vICAgVGhlIHByb3BlcnRpZXMgb2YgZWFjaCBlbnRyaWVzIGluIHRoZSBsaXN0IGFyZSAodXNlZCBhbHNvIGluIG90aGVyIGZ1bmN0aW9ucykgOgogIC8vICAgICBmaWxlbmFtZSA6IE5hbWUgb2YgdGhlIGZpbGUuIEZvciBhIGNyZWF0ZSBvciBhZGQgYWN0aW9uIGl0IGlzIHRoZSBmaWxlbmFtZQogIC8vICAgICAgICAgICAgICAgIGdpdmVuIGJ5IHRoZSB1c2VyLiBGb3IgYW4gZXh0cmFjdCBmdW5jdGlvbiBpdCBpcyB0aGUgZmlsZW5hbWUKICAvLyAgICAgICAgICAgICAgICBvZiB0aGUgZXh0cmFjdGVkIGZpbGUuCiAgLy8gICAgIHN0b3JlZF9maWxlbmFtZSA6IE5hbWUgb2YgdGhlIGZpbGUgLyBkaXJlY3Rvcnkgc3RvcmVkIGluIHRoZSBhcmNoaXZlLgogIC8vICAgICBzaXplIDogU2l6ZSBvZiB0aGUgc3RvcmVkIGZpbGUuCiAgLy8gICAgIGNvbXByZXNzZWRfc2l6ZSA6IFNpemUgb2YgdGhlIGZpbGUncyBkYXRhIGNvbXByZXNzZWQgaW4gdGhlIGFyY2hpdmUKICAvLyAgICAgICAgICAgICAgICAgICAgICAgKHdpdGhvdXQgdGhlIGhlYWRlcnMgb3ZlcmhlYWQpCiAgLy8gICAgIG10aW1lIDogTGFzdCBrbm93biBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgZmlsZSAoVU5JWCB0aW1lc3RhbXApCiAgLy8gICAgIGNvbW1lbnQgOiBDb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQogIC8vICAgICBmb2xkZXIgOiB0cnVlIHwgZmFsc2UKICAvLyAgICAgaW5kZXggOiBpbmRleCBvZiB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZQogIC8vICAgICBzdGF0dXMgOiBzdGF0dXMgb2YgdGhlIGFjdGlvbiAoZGVwZW5kaW5nIG9mIHRoZSBhY3Rpb24pIDoKICAvLyAgICAgICAgICAgICAgVmFsdWVzIGFyZSA6CiAgLy8gICAgICAgICAgICAgICAgb2sgOiBPSyAhCiAgLy8gICAgICAgICAgICAgICAgZmlsdGVyZWQgOiB0aGUgZmlsZSAvIGRpciBpcyBub3QgZXh0cmFjdGVkIChmaWx0ZXJlZCBieSB1c2VyKQogIC8vICAgICAgICAgICAgICAgIGFscmVhZHlfYV9kaXJlY3RvcnkgOiB0aGUgZmlsZSBjYW4gbm90IGJlIGV4dHJhY3RlZCBiZWNhdXNlIGEKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IHdpdGggdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cwogIC8vICAgICAgICAgICAgICAgIHdyaXRlX3Byb3RlY3RlZCA6IHRoZSBmaWxlIGNhbiBub3QgYmUgZXh0cmFjdGVkIGJlY2F1c2UgYSBmaWxlCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGFuZCBpcwogIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHByb3RlY3RlZAogIC8vICAgICAgICAgICAgICAgIG5ld2VyX2V4aXN0IDogdGhlIGZpbGUgd2FzIG5vdCBleHRyYWN0ZWQgYmVjYXVzZSBhIG5ld2VyIGZpbGUgZXhpc3RzCiAgLy8gICAgICAgICAgICAgICAgcGF0aF9jcmVhdGlvbl9mYWlsIDogdGhlIGZpbGUgaXMgbm90IGV4dHJhY3RlZCBiZWNhdXNlIHRoZSBmb2xkZXIKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBleGlzdCBhbmQgY2FuIG5vdCBiZSBjcmVhdGVkCiAgLy8gICAgICAgICAgICAgICAgd3JpdGVfZXJyb3IgOiB0aGUgZmlsZSB3YXMgbm90IGV4dHJhY3RlZCBiZWNhdXNlIHRoZXJlIHdhcyBhCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciB3aGlsZSB3cml0aW5nIHRoZSBmaWxlCiAgLy8gICAgICAgICAgICAgICAgcmVhZF9lcnJvciA6IHRoZSBmaWxlIHdhcyBub3QgZXh0cmFjdGVkIGJlY2F1c2UgdGhlcmUgd2FzIGEgZXJyb3IKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgcmVhZGluZyB0aGUgZmlsZQogIC8vICAgICAgICAgICAgICAgIGludmFsaWRfaGVhZGVyIDogdGhlIGZpbGUgd2FzIG5vdCBleHRyYWN0ZWQgYmVjYXVzZSBvZiBhbiBhcmNoaXZlCiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgZXJyb3IgKGJhZCBmaWxlIGhlYWRlcikKICAvLyAgIE5vdGUgdGhhdCBlYWNoIHRpbWUgYSBtZXRob2QgY2FuIGNvbnRpbnVlIG9wZXJhdGluZyB3aGVuIHRoZXJlCiAgLy8gICBpcyBhbiBhY3Rpb24gZXJyb3Igb24gYSBmaWxlLCB0aGUgZXJyb3IgaXMgb25seSBsb2dnZWQgaW4gdGhlIGZpbGUgc3RhdHVzLgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBvbiBhbiB1bnJlY292ZXJhYmxlIGZhaWx1cmUsCiAgLy8gICBUaGUgbGlzdCBvZiB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBsaXN0Q29udGVudCgpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIENoZWNrIGFyY2hpdmUKICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBleHRyYWN0aW5nIGZjdAogICAgJHBfbGlzdCA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2TGlzdCgkcF9saXN0KSkgIT0gMSkKICAgIHsKICAgICAgdW5zZXQoJHBfbGlzdCk7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkcF9saXN0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDoKICAvLyAgIGV4dHJhY3QoJHBfcGF0aD0iLi8iLCAkcF9yZW1vdmVfcGF0aD0iIikKICAvLyAgIGV4dHJhY3QoWyRwX29wdGlvbiwgJHBfb3B0aW9uX3ZhbHVlLCAuLi5dKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHR3byBzeW5vcHNpcy4gVGhlIGZpcnN0IG9uZSBpcyBoaXN0b3JpY2FsLgogIC8vICAgVGhpcyBtZXRob2QgZXh0cmFjdCBhbGwgdGhlIGZpbGVzIC8gZGlyZWN0b3JpZXMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUKICAvLyAgIGZvbGRlciBpbmRpY2F0ZWQgaW4gJHBfcGF0aC4KICAvLyAgIElmIHlvdSB3YW50IHRvIGlnbm9yZSB0aGUgJ3Jvb3QnIHBhcnQgb2YgcGF0aCBvZiB0aGUgbWVtb3JpemVkIGZpbGVzCiAgLy8gICB5b3UgY2FuIGluZGljYXRlIHRoaXMgaW4gdGhlIG9wdGlvbmFsICRwX3JlbW92ZV9wYXRoIHBhcmFtZXRlci4KICAvLyAgIEJ5IGRlZmF1bHQsIGlmIGEgbmV3ZXIgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZQogIC8vICAgZmlsZSBpcyBub3QgZXh0cmFjdGVkLgogIC8vCiAgLy8gICBJZiBib3RoIFBDTFpJUF9PUFRfUEFUSCBhbmQgUENMWklQX09QVF9BRERfUEFUSCBhb3B0aW9ucwogIC8vICAgYXJlIHVzZWQsIHRoZSBwYXRoIGluZGljYXRlZCBpbiBQQ0xaSVBfT1BUX0FERF9QQVRIIGlzIGFwcGVuZAogIC8vICAgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCB2YWx1ZSBvZiBQQ0xaSVBfT1BUX1BBVEguCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9wYXRoIDogUGF0aCB3aGVyZSB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSB0byBiZSBleHRyYWN0ZWQKICAvLyAgICRwX3JlbW92ZV9wYXRoIDogRmlyc3QgcGFydCAoJ3Jvb3QnIHBhcnQpIG9mIHRoZSBtZW1vcml6ZWQgcGF0aAogIC8vICAgICAgICAgICAgICAgICAgICAoaWYgYW55IHNpbWlsYXIpIHRvIHJlbW92ZSB3aGlsZSBleHRyYWN0aW5nLgogIC8vIE9wdGlvbnMgOgogIC8vICAgUENMWklQX09QVF9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfQUREX1BBVEggOgogIC8vICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA6CiAgLy8gICBQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QgOgogIC8vICAgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAwIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZSwKICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBleHRyYWN0ZWQgZmlsZXMsIHdpdGggYSBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KICAvLyAgIChzZWUgUGNsWmlwOjpsaXN0Q29udGVudCgpIGZvciBsaXN0IGVudHJ5IGZvcm1hdCkKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGV4dHJhY3QoKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlCiAgICBpZiAoISR0aGlzLT5wcml2Q2hlY2tGb3JtYXQoKSkgewogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gU2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkdl9vcHRpb25zID0gYXJyYXkoKTsKLy8gICAgJHZfcGF0aCA9ICIuLyI7CiAgICAkdl9wYXRoID0gJyc7CiAgICAkdl9yZW1vdmVfcGF0aCA9ICIiOwogICAgJHZfcmVtb3ZlX2FsbF9wYXRoID0gZmFsc2U7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgdmFyaWFibGUgb3B0aW9ucyBhcmd1bWVudHMKICAgICR2X3NpemUgPSBmdW5jX251bV9hcmdzKCk7CgogICAgLy8gLS0tLS0gRGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbgogICAgJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HXSA9IEZBTFNFOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFyZ3VtZW50cwogICAgaWYgKCR2X3NpemUgPiAwKSB7CiAgICAgIC8vIC0tLS0tIEdldCB0aGUgYXJndW1lbnRzCiAgICAgICR2X2FyZ19saXN0ID0gZnVuY19nZXRfYXJncygpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZmlyc3QgYXJnCiAgICAgIGlmICgoaXNfaW50ZWdlcigkdl9hcmdfbGlzdFswXSkpICYmICgkdl9hcmdfbGlzdFswXSA+IDc3MDAwKSkgewoKICAgICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucwogICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UGFyc2VPcHRpb25zKCR2X2FyZ19saXN0LCAkdl9zaXplLCAkdl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IChQQ0xaSVBfT1BUX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0FERF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfU0VUX0NITU9EID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQllfTkFNRSA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX0VSRUcgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9CWV9QUkVHID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfQllfSU5ERVggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklORyA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0VYVFJBQ1RfSU5fT1VUUFVUID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTiA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGID0+ICdvcHRpb25hbCcKCQkJCQkJCQkJCQkJICAgICkpOwogICAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIGFyZ3VtZW50cwogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfUEFUSF0pKSB7CiAgICAgICAgICAkdl9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1BBVEhdOwogICAgICAgIH0KICAgICAgICBpZiAoaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXSkpIHsKICAgICAgICAgICR2X3JlbW92ZV9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIXTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdKSkgewogICAgICAgICAgJHZfcmVtb3ZlX2FsbF9wYXRoID0gJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF07CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdKSkgewogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgZm9yICcvJyBpbiBsYXN0IHBhdGggY2hhcgogICAgICAgICAgaWYgKChzdHJsZW4oJHZfcGF0aCkgPiAwKSAmJiAoc3Vic3RyKCR2X3BhdGgsIC0xKSAhPSAnLycpKSB7CiAgICAgICAgICAgICR2X3BhdGggLj0gJy8nOwogICAgICAgICAgfQogICAgICAgICAgJHZfcGF0aCAuPSAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQUREX1BBVEhdOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgMiBhcmdzCiAgICAgIC8vIEhlcmUgd2UgbmVlZCB0byBzdXBwb3J0IHRoZSBmaXJzdCBoaXN0b3JpYyBzeW5vcHNpcyBvZiB0aGUKICAgICAgLy8gbWV0aG9kLgogICAgICBlbHNlIHsKCiAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBmaXJzdCBhcmd1bWVudAogICAgICAgICR2X3BhdGggPSAkdl9hcmdfbGlzdFswXTsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudAogICAgICAgIGlmICgkdl9zaXplID09IDIpIHsKICAgICAgICAgICR2X3JlbW92ZV9wYXRoID0gJHZfYXJnX2xpc3RbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR2X3NpemUgPiAyKSB7CiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIG51bWJlciAvIHR5cGUgb2YgYXJndW1lbnRzIik7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBkZWZhdWx0IG9wdGlvbiB2YWx1ZXMKICAgICR0aGlzLT5wcml2T3B0aW9uRGVmYXVsdFRocmVzaG9sZCgkdl9vcHRpb25zKTsKCiAgICAvLyAtLS0tLSBUcmFjZQoKICAgIC8vIC0tLS0tIENhbGwgdGhlIGV4dHJhY3RpbmcgZmN0CiAgICAkcF9saXN0ID0gYXJyYXkoKTsKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RXh0cmFjdEJ5UnVsZSgkcF9saXN0LCAkdl9wYXRoLCAkdl9yZW1vdmVfcGF0aCwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdl9yZW1vdmVfYWxsX3BhdGgsICR2X29wdGlvbnMpOwogICAgaWYgKCR2X3Jlc3VsdCA8IDEpIHsKICAgICAgdW5zZXQoJHBfbGlzdCk7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkcF9saXN0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6CiAgLy8gICBleHRyYWN0QnlJbmRleCgkcF9pbmRleCwgJHBfcGF0aD0iLi8iLCAkcF9yZW1vdmVfcGF0aD0iIikKICAvLyAgIGV4dHJhY3RCeUluZGV4KCRwX2luZGV4LCBbJHBfb3B0aW9uLCAkcF9vcHRpb25fdmFsdWUsIC4uLl0pCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2Qgc3VwcG9ydHMgdHdvIHN5bm9wc2lzLiBUaGUgZmlyc3Qgb25lIGlzIGhpc3RvcmljYWwuCiAgLy8gICBUaGlzIG1ldGhvZCBpcyBkb2luZyBhIHBhcnRpYWwgZXh0cmFjdCBvZiB0aGUgYXJjaGl2ZS4KICAvLyAgIFRoZSBleHRyYWN0ZWQgZmlsZXMgb3IgZm9sZGVycyBhcmUgaWRlbnRpZmllZCBieSB0aGVpciBpbmRleCBpbiB0aGUKICAvLyAgIGFyY2hpdmUgKGZyb20gMCB0byBuKS4KICAvLyAgIE5vdGUgdGhhdCBpZiB0aGUgaW5kZXggaWRlbnRpZnkgYSBmb2xkZXIsIG9ubHkgdGhlIGZvbGRlciBlbnRyeSBpcwogIC8vICAgZXh0cmFjdGVkLCBub3QgYWxsIHRoZSBmaWxlcyBpbmNsdWRlZCBpbiB0aGUgYXJjaGl2ZS4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2luZGV4IDogQSBzaW5nbGUgaW5kZXggKGludGVnZXIpIG9yIGEgc3RyaW5nIG9mIGluZGV4ZXMgb2YgZmlsZXMgdG8KICAvLyAgICAgICAgICAgICAgZXh0cmFjdC4gVGhlIGZvcm0gb2YgdGhlIHN0cmluZyBpcyAiMCw0LTYsOC0xMiIgd2l0aCBvbmx5IG51bWJlcnMKICAvLyAgICAgICAgICAgICAgYW5kICctJyBmb3IgcmFuZ2Ugb3IgJywnIHRvIHNlcGFyYXRlIHJhbmdlcy4gTm8gc3BhY2VzIG9yICc7JwogIC8vICAgICAgICAgICAgICBhcmUgYWxsb3dlZC4KICAvLyAgICRwX3BhdGggOiBQYXRoIHdoZXJlIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXJlIHRvIGJlIGV4dHJhY3RlZAogIC8vICAgJHBfcmVtb3ZlX3BhdGggOiBGaXJzdCBwYXJ0ICgncm9vdCcgcGFydCkgb2YgdGhlIG1lbW9yaXplZCBwYXRoCiAgLy8gICAgICAgICAgICAgICAgICAgIChpZiBhbnkgc2ltaWxhcikgdG8gcmVtb3ZlIHdoaWxlIGV4dHJhY3RpbmcuCiAgLy8gT3B0aW9ucyA6CiAgLy8gICBQQ0xaSVBfT1BUX1BBVEggOgogIC8vICAgUENMWklQX09QVF9BRERfUEFUSCA6CiAgLy8gICBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIIDoKICAvLyAgIFBDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkcgOiBUaGUgZmlsZXMgYXJlIGV4dHJhY3RlZCBhcyBzdHJpbmdzIGFuZAogIC8vICAgICBub3QgYXMgZmlsZXMuCiAgLy8gICAgIFRoZSByZXN1bHRpbmcgY29udGVudCBpcyBpbiBhIG5ldyBmaWVsZCAnY29udGVudCcgaW4gdGhlIGZpbGUKICAvLyAgICAgc3RydWN0dXJlLgogIC8vICAgICBUaGlzIG9wdGlvbiBtdXN0IGJlIHVzZWQgYWxvbmUgKGFueSBvdGhlciBvcHRpb25zIGFyZSBpZ25vcmVkKS4KICAvLyAgIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA6CiAgLy8gICBQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDAgb24gZmFpbHVyZSwKICAvLyAgIFRoZSBsaXN0IG9mIHRoZSBleHRyYWN0ZWQgZmlsZXMsIHdpdGggYSBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KICAvLyAgIChzZWUgUGNsWmlwOjpsaXN0Q29udGVudCgpIGZvciBsaXN0IGVudHJ5IGZvcm1hdCkKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vZnVuY3Rpb24gZXh0cmFjdEJ5SW5kZXgoJHBfaW5kZXgsIG9wdGlvbnMuLi4pCiAgZnVuY3Rpb24gZXh0cmFjdEJ5SW5kZXgoJHBfaW5kZXgpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIENoZWNrIGFyY2hpdmUKICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7CiAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBTZXQgZGVmYXVsdCB2YWx1ZXMKICAgICR2X29wdGlvbnMgPSBhcnJheSgpOwovLyAgICAkdl9wYXRoID0gIi4vIjsKICAgICR2X3BhdGggPSAnJzsKICAgICR2X3JlbW92ZV9wYXRoID0gIiI7CiAgICAkdl9yZW1vdmVfYWxsX3BhdGggPSBmYWxzZTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciB2YXJpYWJsZSBvcHRpb25zIGFyZ3VtZW50cwogICAgJHZfc2l6ZSA9IGZ1bmNfbnVtX2FyZ3MoKTsKCiAgICAvLyAtLS0tLSBEZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9uCiAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfRVhUUkFDVF9BU19TVFJJTkddID0gRkFMU0U7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgYXJndW1lbnRzCiAgICBpZiAoJHZfc2l6ZSA+IDEpIHsKICAgICAgLy8gLS0tLS0gR2V0IHRoZSBhcmd1bWVudHMKICAgICAgJHZfYXJnX2xpc3QgPSBmdW5jX2dldF9hcmdzKCk7CgogICAgICAvLyAtLS0tLSBSZW1vdmUgZm9ybSB0aGUgb3B0aW9ucyBsaXN0IHRoZSBmaXJzdCBhcmd1bWVudAogICAgICBhcnJheV9zaGlmdCgkdl9hcmdfbGlzdCk7CiAgICAgICR2X3NpemUtLTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpcnN0IGFyZwogICAgICBpZiAoKGlzX2ludGVnZXIoJHZfYXJnX2xpc3RbMF0pKSAmJiAoJHZfYXJnX2xpc3RbMF0gPiA3NzAwMCkpIHsKCiAgICAgICAgLy8gLS0tLS0gUGFyc2UgdGhlIG9wdGlvbnMKICAgICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfbGlzdCwgJHZfc2l6ZSwgJHZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSAoUENMWklQX09QVF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVNT1ZFX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklORyA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0FERF9QQVRIID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9DQl9QUkVfRVhUUkFDVCA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfU0VUX0NITU9EID0+ICdvcHRpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiA9PiAnb3B0aW9uYWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IgPT4gJ29wdGlvbmFsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX09QVF9FWFRSQUNUX0RJUl9SRVNUUklDVElPTiA9PiAnb3B0aW9uYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT04gPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGID0+ICdvcHRpb25hbCcKCQkJCQkJCQkJCQkJICAgKSk7CiAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIFNldCB0aGUgYXJndW1lbnRzCiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9QQVRIXSkpIHsKICAgICAgICAgICR2X3BhdGggPSAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUEFUSF07CiAgICAgICAgfQogICAgICAgIGlmIChpc3NldCgkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdKSkgewogICAgICAgICAgJHZfcmVtb3ZlX3BhdGggPSAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdOwogICAgICAgIH0KICAgICAgICBpZiAoaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pKSB7CiAgICAgICAgICAkdl9yZW1vdmVfYWxsX3BhdGggPSAkdl9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzc2V0KCR2X29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF0pKSB7CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayBmb3IgJy8nIGluIGxhc3QgcGF0aCBjaGFyCiAgICAgICAgICBpZiAoKHN0cmxlbigkdl9wYXRoKSA+IDApICYmIChzdWJzdHIoJHZfcGF0aCwgLTEpICE9ICcvJykpIHsKICAgICAgICAgICAgJHZfcGF0aCAuPSAnLyc7CiAgICAgICAgICB9CiAgICAgICAgICAkdl9wYXRoIC49ICR2X29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF07CiAgICAgICAgfQogICAgICAgIGlmICghaXNzZXQoJHZfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HXSkpIHsKICAgICAgICAgICR2X29wdGlvbnNbUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklOR10gPSBGQUxTRTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciAyIGFyZ3MKICAgICAgLy8gSGVyZSB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhlIGZpcnN0IGhpc3RvcmljIHN5bm9wc2lzIG9mIHRoZQogICAgICAvLyBtZXRob2QuCiAgICAgIGVsc2UgewoKICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgJHZfcGF0aCA9ICR2X2FyZ19saXN0WzBdOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgaWYgKCR2X3NpemUgPT0gMikgewogICAgICAgICAgJHZfcmVtb3ZlX3BhdGggPSAkdl9hcmdfbGlzdFsxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoJHZfc2l6ZSA+IDIpIHsKICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIkludmFsaWQgbnVtYmVyIC8gdHlwZSBvZiBhcmd1bWVudHMiKTsKCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFRyYWNlCgogICAgLy8gLS0tLS0gVHJpY2sKICAgIC8vIEhlcmUgSSB3YW50IHRvIHJldXNlIGV4dHJhY3RCeVJ1bGUoKSwgc28gSSBuZWVkIHRvIHBhcnNlIHRoZSAkcF9pbmRleAogICAgLy8gd2l0aCBwcml2UGFyc2VPcHRpb25zKCkKICAgICR2X2FyZ190cmljayA9IGFycmF5IChQQ0xaSVBfT1BUX0JZX0lOREVYLCAkcF9pbmRleCk7CiAgICAkdl9vcHRpb25zX3RyaWNrID0gYXJyYXkoKTsKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UGFyc2VPcHRpb25zKCR2X2FyZ190cmljaywgc2l6ZW9mKCR2X2FyZ190cmljayksICR2X29wdGlvbnNfdHJpY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSAoUENMWklQX09QVF9CWV9JTkRFWCA9PiAnb3B0aW9uYWwnICkpOwogICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAkdl9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdID0gJHZfb3B0aW9uc190cmlja1tQQ0xaSVBfT1BUX0JZX0lOREVYXTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBkZWZhdWx0IG9wdGlvbiB2YWx1ZXMKICAgICR0aGlzLT5wcml2T3B0aW9uRGVmYXVsdFRocmVzaG9sZCgkdl9vcHRpb25zKTsKCiAgICAvLyAtLS0tLSBDYWxsIHRoZSBleHRyYWN0aW5nIGZjdAogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkV4dHJhY3RCeVJ1bGUoJHBfbGlzdCwgJHZfcGF0aCwgJHZfcmVtb3ZlX3BhdGgsICR2X3JlbW92ZV9hbGxfcGF0aCwgJHZfb3B0aW9ucykpIDwgMSkgewogICAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkcF9saXN0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDoKICAvLyAgIGRlbGV0ZShbJHBfb3B0aW9uLCAkcF9vcHRpb25fdmFsdWUsIC4uLl0pCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgcmVtb3ZlcyBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlLgogIC8vICAgSWYgbm8gcGFyYW1ldGVycyBhcmUgZ2l2ZW4sIHRoZW4gYWxsIHRoZSBhcmNoaXZlIGlzIGVtcHRpZWQuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICBOb25lIG9yIG9wdGlvbmFsIGFyZ3VtZW50cy4KICAvLyBPcHRpb25zIDoKICAvLyAgIFBDTFpJUF9PUFRfQllfSU5ERVggOgogIC8vICAgUENMWklQX09QVF9CWV9OQU1FIDoKICAvLyAgIFBDTFpJUF9PUFRfQllfRVJFRyA6CiAgLy8gICBQQ0xaSVBfT1BUX0JZX1BSRUcgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMCBvbiBmYWlsdXJlLAogIC8vICAgVGhlIGxpc3Qgb2YgdGhlIGZpbGVzIHdoaWNoIGFyZSBzdGlsbCBwcmVzZW50IGluIHRoZSBhcmNoaXZlLgogIC8vICAgKHNlZSBQY2xaaXA6Omxpc3RDb250ZW50KCkgZm9yIGxpc3QgZW50cnkgZm9ybWF0KQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gZGVsZXRlKCkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcgogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7CgogICAgLy8gLS0tLS0gQ2hlY2sgYXJjaGl2ZQogICAgaWYgKCEkdGhpcy0+cHJpdkNoZWNrRm9ybWF0KCkpIHsKICAgICAgcmV0dXJuKDApOwogICAgfQoKICAgIC8vIC0tLS0tIFNldCBkZWZhdWx0IHZhbHVlcwogICAgJHZfb3B0aW9ucyA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgdmFyaWFibGUgb3B0aW9ucyBhcmd1bWVudHMKICAgICR2X3NpemUgPSBmdW5jX251bV9hcmdzKCk7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgYXJndW1lbnRzCiAgICBpZiAoJHZfc2l6ZSA+IDApIHsKICAgICAgLy8gLS0tLS0gR2V0IHRoZSBhcmd1bWVudHMKICAgICAgJHZfYXJnX2xpc3QgPSBmdW5jX2dldF9hcmdzKCk7CgogICAgICAvLyAtLS0tLSBQYXJzZSB0aGUgb3B0aW9ucwogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlBhcnNlT3B0aW9ucygkdl9hcmdfbGlzdCwgJHZfc2l6ZSwgJHZfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IChQQ0xaSVBfT1BUX0JZX05BTUUgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX0VSRUcgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX1BSRUcgPT4gJ29wdGlvbmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfT1BUX0JZX0lOREVYID0+ICdvcHRpb25hbCcgKSk7CiAgICAgIGlmICgkdl9yZXN1bHQgIT0gMSkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gQ2FsbCB0aGUgZGVsZXRlIGZjdAogICAgJHZfbGlzdCA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RGVsZXRlQnlSdWxlKCR2X2xpc3QsICR2X29wdGlvbnMpKSAhPSAxKSB7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICB1bnNldCgkdl9saXN0KTsKICAgICAgcmV0dXJuKDApOwogICAgfQoKICAgIC8vIC0tLS0tIE1hZ2ljIHF1b3RlcyB0cmljawogICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfbGlzdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IGRlbGV0ZUJ5SW5kZXgoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgICoqKioqIERlcHJlY2F0ZWQgKioqKioKICAvLyAgIGRlbGV0ZShQQ0xaSVBfT1BUX0JZX0lOREVYLCAkcF9pbmRleCkgc2hvdWxkIGJlIHByZWZlcmVkLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gZGVsZXRlQnlJbmRleCgkcF9pbmRleCkKICB7CgogICAgJHBfbGlzdCA9ICR0aGlzLT5kZWxldGUoUENMWklQX09QVF9CWV9JTkRFWCwgJHBfaW5kZXgpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICRwX2xpc3Q7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcm9wZXJ0aWVzKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUaGlzIG1ldGhvZCBnaXZlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXJjaGl2ZS4KICAvLyAgIFRoZSBwcm9wZXJ0aWVzIGFyZSA6CiAgLy8gICAgIG5iIDogTnVtYmVyIG9mIGZpbGVzIGluIHRoZSBhcmNoaXZlCiAgLy8gICAgIGNvbW1lbnQgOiBDb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJjaGl2ZSBmaWxlCiAgLy8gICAgIHN0YXR1cyA6IG5vdF9leGlzdCwgb2sKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgIE5vbmUKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDAgb24gZmFpbHVyZSwKICAvLyAgIEFuIGFycmF5IHdpdGggdGhlIGFyY2hpdmUgcHJvcGVydGllcy4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByb3BlcnRpZXMoKQogIHsKCiAgICAvLyAtLS0tLSBSZXNldCB0aGUgZXJyb3IgaGFuZGxlcgogICAgJHRoaXMtPnByaXZFcnJvclJlc2V0KCk7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIENoZWNrIGFyY2hpdmUKICAgIGlmICghJHRoaXMtPnByaXZDaGVja0Zvcm1hdCgpKSB7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gRGVmYXVsdCBwcm9wZXJ0aWVzCiAgICAkdl9wcm9wID0gYXJyYXkoKTsKICAgICR2X3Byb3BbJ2NvbW1lbnQnXSA9ICcnOwogICAgJHZfcHJvcFsnbmInXSA9IDA7CiAgICAkdl9wcm9wWydzdGF0dXMnXSA9ICdub3RfZXhpc3QnOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgZmlsZSBleGlzdHMKICAgIGlmIChAaXNfZmlsZSgkdGhpcy0+emlwbmFtZSkpCiAgICB7CiAgICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICAgIGlmICgoJHRoaXMtPnppcF9mZCA9IEBmb3BlbigkdGhpcy0+emlwbmFtZSwgJ3JiJykpID09IDApCiAgICAgIHsKICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIGFyY2hpdmUgXCcnLiR0aGlzLT56aXBuYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7CgogICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMKICAgICAgJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwogICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXIpKSAhPSAxKQogICAgICB7CiAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgIC8vIC0tLS0tIFNldCB0aGUgdXNlciBhdHRyaWJ1dGVzCiAgICAgICR2X3Byb3BbJ2NvbW1lbnQnXSA9ICR2X2NlbnRyYWxfZGlyWydjb21tZW50J107CiAgICAgICR2X3Byb3BbJ25iJ10gPSAkdl9jZW50cmFsX2RpclsnZW50cmllcyddOwogICAgICAkdl9wcm9wWydzdGF0dXMnXSA9ICdvayc7CiAgICB9CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9wcm9wOwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogZHVwbGljYXRlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUaGlzIG1ldGhvZCBjcmVhdGVzIGFuIGFyY2hpdmUgYnkgY29weWluZyB0aGUgY29udGVudCBvZiBhbiBvdGhlciBvbmUuIElmCiAgLy8gICB0aGUgYXJjaGl2ZSBhbHJlYWR5IGV4aXN0LCBpdCBpcyByZXBsYWNlZCBieSB0aGUgbmV3IG9uZSB3aXRob3V0IGFueSB3YXJuaW5nLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfYXJjaGl2ZSA6IFRoZSBmaWxlbmFtZSBvZiBhIHZhbGlkIGFyY2hpdmUsIG9yCiAgLy8gICAgICAgICAgICAgICAgYSB2YWxpZCBQY2xaaXAgb2JqZWN0LgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLgogIC8vICAgMCBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yIChlcnJvciBjb2RlKS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGR1cGxpY2F0ZSgkcF9hcmNoaXZlKQogIHsKICAgICR2X3Jlc3VsdCA9IDE7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2FyY2hpdmUgaXMgYSBQY2xaaXAgb2JqZWN0CiAgICBpZiAoKGlzX29iamVjdCgkcF9hcmNoaXZlKSkgJiYgKGdldF9jbGFzcygkcF9hcmNoaXZlKSA9PSAncGNsemlwJykpCiAgICB7CgogICAgICAvLyAtLS0tLSBEdXBsaWNhdGUgdGhlIGFyY2hpdmUKICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZEdXBsaWNhdGUoJHBfYXJjaGl2ZS0+emlwbmFtZSk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfYXJjaGl2ZSBpcyBhIHN0cmluZyAoc28gYSBmaWxlbmFtZSkKICAgIGVsc2UgaWYgKGlzX3N0cmluZygkcF9hcmNoaXZlKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIENoZWNrIHRoYXQgJHBfYXJjaGl2ZSBpcyBhIHZhbGlkIHppcCBmaWxlCiAgICAgIC8vIFRCQyA6IFNob3VsZCBhbHNvIGNoZWNrIHRoZSBhcmNoaXZlIGZvcm1hdAogICAgICBpZiAoIWlzX2ZpbGUoJHBfYXJjaGl2ZSkpIHsKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSwgIk5vIGZpbGUgd2l0aCBmaWxlbmFtZSAnIi4kcF9hcmNoaXZlLiInIik7CiAgICAgICAgJHZfcmVzdWx0ID0gUENMWklQX0VSUl9NSVNTSU5HX0ZJTEU7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLy8gLS0tLS0gRHVwbGljYXRlIHRoZSBhcmNoaXZlCiAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZEdXBsaWNhdGUoJHBfYXJjaGl2ZSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlCiAgICBlbHNlCiAgICB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlIHBfYXJjaGl2ZV90b19hZGQiKTsKICAgICAgJHZfcmVzdWx0ID0gUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBtZXJnZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgbWVyZ2UgdGhlICRwX2FyY2hpdmVfdG9fYWRkIGFyY2hpdmUgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudAogIC8vICAgb25lICgkdGhpcykuCiAgLy8gICBJZiB0aGUgYXJjaGl2ZSAoJHRoaXMpIGRvZXMgbm90IGV4aXN0LCB0aGUgbWVyZ2UgYmVjb21lcyBhIGR1cGxpY2F0ZS4KICAvLyAgIElmIHRoZSAkcF9hcmNoaXZlX3RvX2FkZCBhcmNoaXZlIGRvZXMgbm90IGV4aXN0LCB0aGUgbWVyZ2UgaXMgYSBzdWNjZXNzLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfYXJjaGl2ZV90b19hZGQgOiBJdCBjYW4gYmUgZGlyZWN0bHkgdGhlIGZpbGVuYW1lIG9mIGEgdmFsaWQgemlwIGFyY2hpdmUsCiAgLy8gICAgICAgICAgICAgICAgICAgICAgIG9yIGEgUGNsWmlwIG9iamVjdCBhcmNoaXZlLgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLAogIC8vICAgMCBvciBuZWdhdGl2ZSB2YWx1ZXMgb24gZXJyb3IgKHNlZSBiZWxvdykuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBtZXJnZSgkcF9hcmNoaXZlX3RvX2FkZCkKICB7CiAgICAkdl9yZXN1bHQgPSAxOwoKICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBlcnJvciBoYW5kbGVyCiAgICAkdGhpcy0+cHJpdkVycm9yUmVzZXQoKTsKCiAgICAvLyAtLS0tLSBDaGVjayBhcmNoaXZlCiAgICBpZiAoISR0aGlzLT5wcml2Q2hlY2tGb3JtYXQoKSkgewogICAgICByZXR1cm4oMCk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgJHBfYXJjaGl2ZV90b19hZGQgaXMgYSBQY2xaaXAgb2JqZWN0CiAgICBpZiAoKGlzX29iamVjdCgkcF9hcmNoaXZlX3RvX2FkZCkpICYmIChnZXRfY2xhc3MoJHBfYXJjaGl2ZV90b19hZGQpID09ICdwY2x6aXAnKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIE1lcmdlIHRoZSBhcmNoaXZlCiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2TWVyZ2UoJHBfYXJjaGl2ZV90b19hZGQpOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlICRwX2FyY2hpdmVfdG9fYWRkIGlzIGEgc3RyaW5nIChzbyBhIGZpbGVuYW1lKQogICAgZWxzZSBpZiAoaXNfc3RyaW5nKCRwX2FyY2hpdmVfdG9fYWRkKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIENyZWF0ZSBhIHRlbXBvcmFyeSBhcmNoaXZlCiAgICAgICR2X29iamVjdF9hcmNoaXZlID0gbmV3IFBjbFppcCgkcF9hcmNoaXZlX3RvX2FkZCk7CgogICAgICAvLyAtLS0tLSBNZXJnZSB0aGUgYXJjaGl2ZQogICAgICAkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdk1lcmdlKCR2X29iamVjdF9hcmNoaXZlKTsKICAgIH0KCiAgICAvLyAtLS0tLSBJbnZhbGlkIHZhcmlhYmxlCiAgICBlbHNlCiAgICB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCB2YXJpYWJsZSB0eXBlIHBfYXJjaGl2ZV90b19hZGQiKTsKICAgICAgJHZfcmVzdWx0ID0gUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IGVycm9yQ29kZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gZXJyb3JDb2RlKCkKICB7CiAgICBpZiAoUENMWklQX0VSUk9SX0VYVEVSTkFMID09IDEpIHsKICAgICAgcmV0dXJuKFBjbEVycm9yQ29kZSgpKTsKICAgIH0KICAgIGVsc2UgewogICAgICByZXR1cm4oJHRoaXMtPmVycm9yX2NvZGUpOwogICAgfQogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogZXJyb3JOYW1lKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBlcnJvck5hbWUoJHBfd2l0aF9jb2RlPWZhbHNlKQogIHsKICAgICR2X25hbWUgPSBhcnJheSAoIFBDTFpJUF9FUlJfTk9fRVJST1IgPT4gJ1BDTFpJUF9FUlJfTk9fRVJST1InLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwgPT4gJ1BDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwgPT4gJ1BDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiA9PiAnUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUicsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSA9PiAnUENMWklQX0VSUl9NSVNTSU5HX0ZJTEUnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9GSUxFTkFNRV9UT09fTE9ORyA9PiAnUENMWklQX0VSUl9GSUxFTkFNRV9UT09fTE9ORycsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0lOVkFMSURfWklQID0+ICdQQ0xaSVBfRVJSX0lOVkFMSURfWklQJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfQkFEX0VYVFJBQ1RFRF9GSUxFID0+ICdQQ0xaSVBfRVJSX0JBRF9FWFRSQUNURURfRklMRScsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX0RJUl9DUkVBVEVfRkFJTCA9PiAnUENMWklQX0VSUl9ESVJfQ1JFQVRFX0ZBSUwnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9CQURfRVhURU5TSU9OID0+ICdQQ0xaSVBfRVJSX0JBRF9FWFRFTlNJT04nLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9CQURfRk9STUFUID0+ICdQQ0xaSVBfRVJSX0JBRF9GT1JNQVQnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9ERUxFVEVfRklMRV9GQUlMID0+ICdQQ0xaSVBfRVJSX0RFTEVURV9GSUxFX0ZBSUwnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9SRU5BTUVfRklMRV9GQUlMID0+ICdQQ0xaSVBfRVJSX1JFTkFNRV9GSUxFX0ZBSUwnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9CQURfQ0hFQ0tTVU0gPT4gJ1BDTFpJUF9FUlJfQkFEX0NIRUNLU1VNJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfSU5WQUxJRF9BUkNISVZFX1pJUCA9PiAnUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUgPT4gJ1BDTFpJUF9FUlJfTUlTU0lOR19PUFRJT05fVkFMVUUnLAogICAgICAgICAgICAgICAgICAgICAgUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRSA9PiAnUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRScsCiAgICAgICAgICAgICAgICAgICAgICBQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OID0+ICdQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OJywKICAgICAgICAgICAgICAgICAgICAgIFBDTFpJUF9FUlJfVU5TVVBQT1JURURfRU5DUllQVElPTiA9PiAnUENMWklQX0VSUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OJwogICAgICAgICAgICAgICAgICAgICAgLFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUgPT4gJ1BDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUnCiAgICAgICAgICAgICAgICAgICAgICAsUENMWklQX0VSUl9ESVJFQ1RPUllfUkVTVFJJQ1RJT04gPT4gJ1BDTFpJUF9FUlJfRElSRUNUT1JZX1JFU1RSSUNUSU9OJwogICAgICAgICAgICAgICAgICAgICk7CgogICAgaWYgKGlzc2V0KCR2X25hbWVbJHRoaXMtPmVycm9yX2NvZGVdKSkgewogICAgICAkdl92YWx1ZSA9ICR2X25hbWVbJHRoaXMtPmVycm9yX2NvZGVdOwogICAgfQogICAgZWxzZSB7CiAgICAgICR2X3ZhbHVlID0gJ05vTmFtZSc7CiAgICB9CgogICAgaWYgKCRwX3dpdGhfY29kZSkgewogICAgICByZXR1cm4oJHZfdmFsdWUuJyAoJy4kdGhpcy0+ZXJyb3JfY29kZS4nKScpOwogICAgfQogICAgZWxzZSB7CiAgICAgIHJldHVybigkdl92YWx1ZSk7CiAgICB9CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBlcnJvckluZm8oKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGVycm9ySW5mbygkcF9mdWxsPWZhbHNlKQogIHsKICAgIGlmIChQQ0xaSVBfRVJST1JfRVhURVJOQUwgPT0gMSkgewogICAgICByZXR1cm4oUGNsRXJyb3JTdHJpbmcoKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKCRwX2Z1bGwpIHsKICAgICAgICByZXR1cm4oJHRoaXMtPmVycm9yTmFtZSh0cnVlKS4iIDogIi4kdGhpcy0+ZXJyb3Jfc3RyaW5nKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICByZXR1cm4oJHRoaXMtPmVycm9yX3N0cmluZy4iIFtjb2RlICIuJHRoaXMtPmVycm9yX2NvZGUuIl0iKTsKICAgICAgfQogICAgfQogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICoqKioqIFVOREVSIFRISVMgTElORSBBUkUgREVGSU5FRCBQUklWQVRFIElOVEVSTkFMIEZVTkNUSU9OUyAqKioqKgovLyAqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioKLy8gKioqKiogICAgICAgVEhFU0VTIEZVTkNUSU9OUyBNVVNUIE5PVCBCRSBVU0VEIERJUkVDVExZICAgICAgICoqKioqCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZDaGVja0Zvcm1hdCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgY2hlY2sgdGhhdCB0aGUgYXJjaGl2ZSBleGlzdHMgYW5kIGlzIGEgdmFsaWQgemlwIGFyY2hpdmUuCiAgLy8gICBTZXZlcmFsIGxldmVsIG9mIGNoZWNrIGV4aXN0cy4gKGZ1dHVyKQogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfbGV2ZWwgOiBMZXZlbCBvZiBjaGVjay4gRGVmYXVsdCAwLgogIC8vICAgICAgICAgICAgICAwIDogQ2hlY2sgdGhlIGZpcnN0IGJ5dGVzIChtYWdpYyBjb2RlcykgKGRlZmF1bHQgdmFsdWUpKQogIC8vICAgICAgICAgICAgICAxIDogMCArIENoZWNrIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAoZnV0dXIpCiAgLy8gICAgICAgICAgICAgIDIgOiAxICsgQ2hlY2sgZWFjaCBmaWxlIGhlYWRlciAoZnV0dXIpCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICB0cnVlIG9uIHN1Y2Nlc3MsCiAgLy8gICBmYWxzZSBvbiBlcnJvciwgdGhlIGVycm9yIGNvZGUgaXMgc2V0LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkNoZWNrRm9ybWF0KCRwX2xldmVsPTApCiAgewogICAgJHZfcmVzdWx0ID0gdHJ1ZTsKCgkvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBzeXN0ZW0gY2FjaGUKICAgIGNsZWFyc3RhdGNhY2hlKCk7CgogICAgLy8gLS0tLS0gUmVzZXQgdGhlIGVycm9yIGhhbmRsZXIKICAgICR0aGlzLT5wcml2RXJyb3JSZXNldCgpOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpbGUgZXhpdHMKICAgIGlmICghaXNfZmlsZSgkdGhpcy0+emlwbmFtZSkpIHsKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19GSUxFLCAiTWlzc2luZyBhcmNoaXZlIGZpbGUgJyIuJHRoaXMtPnppcG5hbWUuIiciKTsKICAgICAgcmV0dXJuKGZhbHNlKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBmaWxlIGlzIHJlYWRlYWJsZQogICAgaWYgKCFpc19yZWFkYWJsZSgkdGhpcy0+emlwbmFtZSkpIHsKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICJVbmFibGUgdG8gcmVhZCBhcmNoaXZlICciLiR0aGlzLT56aXBuYW1lLiInIik7CiAgICAgIHJldHVybihmYWxzZSk7CiAgICB9CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIG1hZ2ljIGNvZGUKICAgIC8vIFRCQwoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBjZW50cmFsIGhlYWRlcgogICAgLy8gVEJDCgogICAgLy8gLS0tLS0gQ2hlY2sgZWFjaCBmaWxlIGhlYWRlcgogICAgLy8gVEJDCgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdlBhcnNlT3B0aW9ucygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBpbnRlcm5hbCBtZXRob2RzIHJlYWRzIHRoZSB2YXJpYWJsZSBsaXN0IG9mIGFyZ3VtZW50cyAoJHBfb3B0aW9uc19saXN0LAogIC8vICAgJHBfc2l6ZSkgYW5kIGdlbmVyYXRlIGFuIGFycmF5IHdpdGggdGhlIG9wdGlvbnMgYW5kIHZhbHVlcyAoJHZfcmVzdWx0X2xpc3QpLgogIC8vICAgJHZfcmVxdWVzdGVkX29wdGlvbnMgY29udGFpbnMgdGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgcHJlc2VudCBhbmQgdGhvc2UgdGhhdAogIC8vICAgbXVzdCBiZSBwcmVzZW50LgogIC8vICAgJHZfcmVxdWVzdGVkX29wdGlvbnMgaXMgYW4gYXJyYXksIHdpdGggdGhlIG9wdGlvbiB2YWx1ZSBhcyBrZXksIGFuZCAnb3B0aW9uYWwnLAogIC8vICAgb3IgJ21hbmRhdG9yeScgYXMgdmFsdWUuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICBTZWUgYWJvdmUuCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAxIG9uIHN1Y2Nlc3MuCiAgLy8gICAwIG9uIGZhaWx1cmUuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2UGFyc2VPcHRpb25zKCYkcF9vcHRpb25zX2xpc3QsICRwX3NpemUsICYkdl9yZXN1bHRfbGlzdCwgJHZfcmVxdWVzdGVkX29wdGlvbnM9ZmFsc2UpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgb3B0aW9ucwogICAgJGk9MDsKICAgIHdoaWxlICgkaTwkcF9zaXplKSB7CgogICAgICAvLyAtLS0tLSBDaGVjayBpZiB0aGUgb3B0aW9uIGlzIHN1cHBvcnRlZAogICAgICBpZiAoIWlzc2V0KCR2X3JlcXVlc3RlZF9vcHRpb25zWyRwX29wdGlvbnNfbGlzdFskaV1dKSkgewogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJJbnZhbGlkIG9wdGlvbmFsIHBhcmFtZXRlciAnIi4kcF9vcHRpb25zX2xpc3RbJGldLiInIGZvciB0aGlzIG1ldGhvZCIpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbmV4dCBvcHRpb24KICAgICAgc3dpdGNoICgkcF9vcHRpb25zX2xpc3RbJGldKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHJlcXVlc3QgYSBwYXRoIHZhbHVlCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1BBVEggOgogICAgICAgIGNhc2UgUENMWklQX09QVF9SRU1PVkVfUEFUSCA6CiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0FERF9QQVRIIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUKICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHBfb3B0aW9uc19saXN0WyRpKzFdLCBGQUxTRSk7CiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayBmb3IgaW5jb21wYXRpYmxlIG9wdGlvbnMKICAgICAgICAgIGlmIChpc3NldCgkdl9yZXN1bHRfbGlzdFtQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiT3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIGNhbiBub3QgYmUgdXNlZCB3aXRoIG9wdGlvbiAnUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgdmFsdWUKICAgICAgICAgICR2X3ZhbHVlID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgaWYgKCghaXNfaW50ZWdlcigkdl92YWx1ZSkpIHx8ICgkdl92YWx1ZTwwKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiSW50ZWdlciBleHBlY3RlZCBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUgKGFuZCBjb252ZXJ0IGl0IGluIGJ5dGVzKQogICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSAkdl92YWx1ZSoxMDQ4NTc2OwogICAgICAgICAgJGkrKzsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1RFTVBfRklMRV9PTiA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayBmb3IgaW5jb21wYXRpYmxlIG9wdGlvbnMKICAgICAgICAgIGlmIChpc3NldCgkdl9yZXN1bHRfbGlzdFtQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiT3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIGNhbiBub3QgYmUgdXNlZCB3aXRoIG9wdGlvbiAnUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9IHRydWU7CiAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIGZvciBpbmNvbXBhdGlibGUgb3B0aW9ucwogICAgICAgICAgaWYgKGlzc2V0KCR2X3Jlc3VsdF9saXN0W1BDTFpJUF9PUFRfVEVNUF9GSUxFX09OXSkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyBjYW4gbm90IGJlIHVzZWQgd2l0aCBvcHRpb24gJ1BDTFpJUF9PUFRfVEVNUF9GSUxFX09OJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIGZvciBpbmNvbXBhdGlibGUgb3B0aW9ucwogICAgICAgICAgaWYgKGlzc2V0KCR2X3Jlc3VsdF9saXN0W1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsICJPcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIicgY2FuIG5vdCBiZSB1c2VkIHdpdGggb3B0aW9uICdQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTEQnIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gdHJ1ZTsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUKICAgICAgICAgIGlmICggICBpc19zdHJpbmcoJHBfb3B0aW9uc19saXN0WyRpKzFdKQogICAgICAgICAgICAgICYmICgkcF9vcHRpb25zX2xpc3RbJGkrMV0gIT0gJycpKSB7CiAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHBfb3B0aW9uc19saXN0WyRpKzFdLCBGQUxTRSk7CiAgICAgICAgICAgICRpKys7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igb3B0aW9ucyB0aGF0IHJlcXVlc3QgYW4gYXJyYXkgb2Ygc3RyaW5nIGZvciB2YWx1ZQogICAgICAgIGNhc2UgUENMWklQX09QVF9CWV9OQU1FIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUKICAgICAgICAgIGlmIChpc19zdHJpbmcoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgewogICAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dWzBdID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoaXNfYXJyYXkoJHBfb3B0aW9uc19saXN0WyRpKzFdKSkgewogICAgICAgICAgICAgICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiV3JvbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KICAgICAgICAgICRpKys7CiAgICAgICAgYnJlYWs7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGFuIEVSRUcgb3IgUFJFRyBleHByZXNzaW9uCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0JZX0VSRUcgOgogICAgICAgICAgLy8gZXJlZygpIGlzIGRlcHJlY2F0ZWQgc3RhcnRpbmcgd2l0aCBQSFAgNS4zLiBNb3ZlIFBDTFpJUF9PUFRfQllfRVJFRwogICAgICAgICAgLy8gdG8gUENMWklQX09QVF9CWV9QUkVHCiAgICAgICAgICAkcF9vcHRpb25zX2xpc3RbJGldID0gUENMWklQX09QVF9CWV9QUkVHOwogICAgICAgIGNhc2UgUENMWklQX09QVF9CWV9QUkVHIDoKICAgICAgICAvL2Nhc2UgUENMWklQX09QVF9DUllQVCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRwX29wdGlvbnNfbGlzdFskaSsxXSkpIHsKICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX09QVElPTl9WQUxVRSwgIldyb25nIHBhcmFtZXRlciB2YWx1ZSBmb3Igb3B0aW9uICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbnNfbGlzdFskaV0pLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgdGFrZXMgYSBzdHJpbmcKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfQ09NTUVOVCA6CiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX0FERF9DT01NRU5UIDoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfUFJFUEVORF9DT01NRU5UIDoKICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLAoJCQkgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIgoJCQkJCQkJCSAuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkKCQkJCQkJCQkgLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSB2YWx1ZQogICAgICAgICAgaWYgKGlzX3N0cmluZygkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7CiAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSAkcF9vcHRpb25zX2xpc3RbJGkrMV07CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsCgkJCSAgICAgICAgICAgICAgICAgICAgICJXcm9uZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIgoJCQkJCQkJCSAuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkKCQkJCQkJCQkgLiInIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBhbiBhcnJheSBvZiBpbmRleAogICAgICAgIGNhc2UgUENMWklQX09QVF9CWV9JTkRFWCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICAkdl93b3JrX2xpc3QgPSBhcnJheSgpOwogICAgICAgICAgaWYgKGlzX3N0cmluZygkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7CgogICAgICAgICAgICAgIC8vIC0tLS0tIFJlbW92ZSBzcGFjZXMKICAgICAgICAgICAgICAkcF9vcHRpb25zX2xpc3RbJGkrMV0gPSBzdHJ0cigkcF9vcHRpb25zX2xpc3RbJGkrMV0sICcgJywgJycpOwoKICAgICAgICAgICAgICAvLyAtLS0tLSBQYXJzZSBpdGVtcwogICAgICAgICAgICAgICR2X3dvcmtfbGlzdCA9IGV4cGxvZGUoIiwiLCAkcF9vcHRpb25zX2xpc3RbJGkrMV0pOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoaXNfaW50ZWdlcigkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7CiAgICAgICAgICAgICAgJHZfd29ya19saXN0WzBdID0gJHBfb3B0aW9uc19saXN0WyRpKzFdLictJy4kcF9vcHRpb25zX2xpc3RbJGkrMV07CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmIChpc19hcnJheSgkcF9vcHRpb25zX2xpc3RbJGkrMV0pKSB7CiAgICAgICAgICAgICAgJHZfd29ya19saXN0ID0gJHBfb3B0aW9uc19saXN0WyRpKzFdOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfT1BUSU9OX1ZBTFVFLCAiVmFsdWUgbXVzdCBiZSBpbnRlZ2VyLCBzdHJpbmcgb3IgYXJyYXkgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIFJlZHVjZSB0aGUgaW5kZXggbGlzdAogICAgICAgICAgLy8gZWFjaCBpbmRleCBpdGVtIGluIHRoZSBsaXN0IG11c3QgYmUgYSBjb3VwbGUgd2l0aCBhIHN0YXJ0IGFuZAogICAgICAgICAgLy8gYW4gZW5kIHZhbHVlIDogWzAsM10sIFs1LTVdLCBbOC0xMF0sIC4uLgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGZvcm1hdCBvZiBlYWNoIGl0ZW0KICAgICAgICAgICR2X3NvcnRfZmxhZz1mYWxzZTsKICAgICAgICAgICR2X3NvcnRfdmFsdWU9MDsKICAgICAgICAgIGZvciAoJGo9MDsgJGo8c2l6ZW9mKCR2X3dvcmtfbGlzdCk7ICRqKyspIHsKICAgICAgICAgICAgICAvLyAtLS0tLSBFeHBsb2RlIHRoZSBpdGVtCiAgICAgICAgICAgICAgJHZfaXRlbV9saXN0ID0gZXhwbG9kZSgiLSIsICR2X3dvcmtfbGlzdFskal0pOwogICAgICAgICAgICAgICR2X3NpemVfaXRlbV9saXN0ID0gc2l6ZW9mKCR2X2l0ZW1fbGlzdCk7CgogICAgICAgICAgICAgIC8vIC0tLS0tIFRCQyA6IEhlcmUgd2UgbWlnaHQgY2hlY2sgdGhhdCBlYWNoIGl0ZW0gaXMgYQogICAgICAgICAgICAgIC8vIHJlYWwgaW50ZWdlciAuLi4KCiAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igc2luZ2xlIHZhbHVlCiAgICAgICAgICAgICAgaWYgKCR2X3NpemVfaXRlbV9saXN0ID09IDEpIHsKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gU2V0IHRoZSBvcHRpb24gdmFsdWUKICAgICAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV1bJGpdWydzdGFydCddID0gJHZfaXRlbV9saXN0WzBdOwogICAgICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ2VuZCddID0gJHZfaXRlbV9saXN0WzBdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlaWYgKCR2X3NpemVfaXRlbV9saXN0ID09IDIpIHsKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gU2V0IHRoZSBvcHRpb24gdmFsdWUKICAgICAgICAgICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV1bJGpdWydzdGFydCddID0gJHZfaXRlbV9saXN0WzBdOwogICAgICAgICAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ2VuZCddID0gJHZfaXRlbV9saXN0WzFdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJUb28gbWFueSB2YWx1ZXMgaW4gaW5kZXggcmFuZ2UgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGxpc3Qgc29ydAogICAgICAgICAgICAgIGlmICgkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXVskal1bJ3N0YXJ0J10gPCAkdl9zb3J0X3ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICR2X3NvcnRfZmxhZz10cnVlOwoKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gVEJDIDogQW4gYXV0b21hdGljIHNvcnQgc2hvdWxkIGJlIHdyaXRlbiAuLi4KICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJJbnZhbGlkIG9yZGVyIG9mIGluZGV4IHJhbmdlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJHZfc29ydF92YWx1ZSA9ICR2X3Jlc3VsdF9saXN0WyRwX29wdGlvbnNfbGlzdFskaV1dWyRqXVsnc3RhcnQnXTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBTb3J0IHRoZSBpdGVtcwogICAgICAgICAgaWYgKCR2X3NvcnRfZmxhZykgewogICAgICAgICAgICAgIC8vIFRCQyA6IFRvIEJlIENvbXBsZXRlZAogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIE5leHQgb3B0aW9uCiAgICAgICAgICAkaSsrOwogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgcmVxdWVzdCBubyB2YWx1ZQogICAgICAgIGNhc2UgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEggOgogICAgICAgIGNhc2UgUENMWklQX09QVF9FWFRSQUNUX0FTX1NUUklORyA6CiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OIDoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfRVhUUkFDVF9JTl9PVVRQVVQgOgogICAgICAgIGNhc2UgUENMWklQX09QVF9SRVBMQUNFX05FV0VSIDoKICAgICAgICBjYXNlIFBDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUiA6CiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9IHRydWU7CiAgICAgICAgYnJlYWs7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGFuIG9jdGFsIHZhbHVlCiAgICAgICAgY2FzZSBQQ0xaSVBfT1BUX1NFVF9DSE1PRCA6CiAgICAgICAgICAvLyAtLS0tLSBDaGVjayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICAgIGlmICgoJGkrMSkgPj0gJHBfc2l6ZSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9NSVNTSU5HX09QVElPTl9WQUxVRSwgIk1pc3NpbmcgcGFyYW1ldGVyIHZhbHVlIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIHZhbHVlCiAgICAgICAgICAkdl9yZXN1bHRfbGlzdFskcF9vcHRpb25zX2xpc3RbJGldXSA9ICRwX29wdGlvbnNfbGlzdFskaSsxXTsKICAgICAgICAgICRpKys7CiAgICAgICAgYnJlYWs7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG9wdGlvbnMgdGhhdCByZXF1ZXN0IGEgY2FsbC1iYWNrCiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QgOgogICAgICAgIGNhc2UgUENMWklQX0NCX1BPU1RfRVhUUkFDVCA6CiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUFJFX0FERCA6CiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUE9TVF9BREQgOgogICAgICAgIC8qIGZvciBmdXR1ciB1c2UKICAgICAgICBjYXNlIFBDTFpJUF9DQl9QUkVfREVMRVRFIDoKICAgICAgICBjYXNlIFBDTFpJUF9DQl9QT1NUX0RFTEVURSA6CiAgICAgICAgY2FzZSBQQ0xaSVBfQ0JfUFJFX0xJU1QgOgogICAgICAgIGNhc2UgUENMWklQX0NCX1BPU1RfTElTVCA6CiAgICAgICAgKi8KICAgICAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAgICAgaWYgKCgkaSsxKSA+PSAkcF9zaXplKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfT1BUSU9OX1ZBTFVFLCAiTWlzc2luZyBwYXJhbWV0ZXIgdmFsdWUgZm9yIG9wdGlvbiAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkcF9vcHRpb25zX2xpc3RbJGldKS4iJyIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgdmFsdWUKICAgICAgICAgICR2X2Z1bmN0aW9uX25hbWUgPSAkcF9vcHRpb25zX2xpc3RbJGkrMV07CgogICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCB0aGUgdmFsdWUgaXMgYSB2YWxpZCBleGlzdGluZyBmdW5jdGlvbgogICAgICAgICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJHZfZnVuY3Rpb25fbmFtZSkpIHsKICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9PUFRJT05fVkFMVUUsICJGdW5jdGlvbiAnIi4kdl9mdW5jdGlvbl9uYW1lLiIoKScgaXMgbm90IGFuIGV4aXN0aW5nIGZ1bmN0aW9uIGZvciBvcHRpb24gJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHBfb3B0aW9uc19saXN0WyRpXSkuIiciKTsKCiAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIGF0dHJpYnV0ZQogICAgICAgICAgJHZfcmVzdWx0X2xpc3RbJHBfb3B0aW9uc19saXN0WyRpXV0gPSAkdl9mdW5jdGlvbl9uYW1lOwogICAgICAgICAgJGkrKzsKICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdCA6CiAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9QQVJBTUVURVIsCgkJICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBwYXJhbWV0ZXIgJyIKCQkJCQkJCSAgIC4kcF9vcHRpb25zX2xpc3RbJGldLiInIik7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTmV4dCBvcHRpb25zCiAgICAgICRpKys7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbnMKICAgIGlmICgkdl9yZXF1ZXN0ZWRfb3B0aW9ucyAhPT0gZmFsc2UpIHsKICAgICAgZm9yICgka2V5PXJlc2V0KCR2X3JlcXVlc3RlZF9vcHRpb25zKTsgJGtleT1rZXkoJHZfcmVxdWVzdGVkX29wdGlvbnMpOyAka2V5PW5leHQoJHZfcmVxdWVzdGVkX29wdGlvbnMpKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbgogICAgICAgIGlmICgkdl9yZXF1ZXN0ZWRfb3B0aW9uc1ska2V5XSA9PSAnbWFuZGF0b3J5JykgewogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiBwcmVzZW50CiAgICAgICAgICBpZiAoIWlzc2V0KCR2X3Jlc3VsdF9saXN0WyRrZXldKSkgewogICAgICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwgIk1pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlciAiLlBjbFppcFV0aWxPcHRpb25UZXh0KCRrZXkpLiIoIi4ka2V5LiIpIik7CgogICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgZGVmYXVsdCB2YWx1ZXMKICAgIGlmICghaXNzZXQoJHZfcmVzdWx0X2xpc3RbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSkpIHsKCiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdk9wdGlvbkRlZmF1bHRUaHJlc2hvbGQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZPcHRpb25EZWZhdWx0VGhyZXNob2xkKCYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pCiAgICAgICAgfHwgaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkgewogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIEdldCAnbWVtb3J5X2xpbWl0JyBjb25maWd1cmF0aW9uIHZhbHVlCiAgICAkdl9tZW1vcnlfbGltaXQgPSBpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKTsKICAgICR2X21lbW9yeV9saW1pdCA9IHRyaW0oJHZfbWVtb3J5X2xpbWl0KTsKICAgICRsYXN0ID0gc3RydG9sb3dlcihzdWJzdHIoJHZfbWVtb3J5X2xpbWl0LCAtMSkpOwoKICAgIGlmKCRsYXN0ID09ICdnJykKICAgICAgICAvLyR2X21lbW9yeV9saW1pdCA9ICR2X21lbW9yeV9saW1pdCoxMDI0KjEwMjQqMTAyNDsKICAgICAgICAkdl9tZW1vcnlfbGltaXQgPSAkdl9tZW1vcnlfbGltaXQqMTA3Mzc0MTgyNDsKICAgIGlmKCRsYXN0ID09ICdtJykKICAgICAgICAvLyR2X21lbW9yeV9saW1pdCA9ICR2X21lbW9yeV9saW1pdCoxMDI0KjEwMjQ7CiAgICAgICAgJHZfbWVtb3J5X2xpbWl0ID0gJHZfbWVtb3J5X2xpbWl0KjEwNDg1NzY7CiAgICBpZigkbGFzdCA9PSAnaycpCiAgICAgICAgJHZfbWVtb3J5X2xpbWl0ID0gJHZfbWVtb3J5X2xpbWl0KjEwMjQ7CgogICAgJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdID0gZmxvb3IoJHZfbWVtb3J5X2xpbWl0KlBDTFpJUF9URU1QT1JBUllfRklMRV9SQVRJTyk7CgoKICAgIC8vIC0tLS0tIFNhbml0eSBjaGVjayA6IE5vIHRocmVzaG9sZCBpZiB2YWx1ZSBsb3dlciB0aGFuIDFNCiAgICBpZiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdIDwgMTA0ODU3NikgewogICAgICB1bnNldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRF0pOwogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZGaWxlRGVzY3JQYXJzZUF0dCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLgogIC8vICAgMCBvbiBmYWlsdXJlLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkZpbGVEZXNjclBhcnNlQXR0KCYkcF9maWxlX2xpc3QsICYkcF9maWxlZGVzY3IsICR2X29wdGlvbnMsICR2X3JlcXVlc3RlZF9vcHRpb25zPWZhbHNlKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIEZvciBlYWNoIGZpbGUgaW4gdGhlIGxpc3QgY2hlY2sgdGhlIGF0dHJpYnV0ZXMKICAgIGZvcmVhY2ggKCRwX2ZpbGVfbGlzdCBhcyAkdl9rZXkgPT4gJHZfdmFsdWUpIHsKCiAgICAgIC8vIC0tLS0tIENoZWNrIGlmIHRoZSBvcHRpb24gaXMgc3VwcG9ydGVkCiAgICAgIGlmICghaXNzZXQoJHZfcmVxdWVzdGVkX29wdGlvbnNbJHZfa2V5XSkpIHsKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBmaWxlIGF0dHJpYnV0ZSAnIi4kdl9rZXkuIicgZm9yIHRoaXMgZmlsZSIpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYXR0cmlidXRlCiAgICAgIHN3aXRjaCAoJHZfa2V5KSB7CiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfTkFNRSA6CiAgICAgICAgICBpZiAoIWlzX3N0cmluZygkdl92YWx1ZSkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgdHlwZSAiLmdldHR5cGUoJHZfdmFsdWUpLiIuIFN0cmluZyBleHBlY3RlZCBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgJHBfZmlsZWRlc2NyWydmaWxlbmFtZSddID0gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHZfdmFsdWUpOwoKICAgICAgICAgIGlmICgkcF9maWxlZGVzY3JbJ2ZpbGVuYW1lJ10gPT0gJycpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgZW1wdHkgZmlsZW5hbWUgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfTkVXX1NIT1JUX05BTUUgOgogICAgICAgICAgaWYgKCFpc19zdHJpbmcoJHZfdmFsdWUpKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIHR5cGUgIi5nZXR0eXBlKCR2X3ZhbHVlKS4iLiBTdHJpbmcgZXhwZWN0ZWQgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKICAgICAgICAgICRwX2ZpbGVkZXNjclsnbmV3X3Nob3J0X25hbWUnXSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X3ZhbHVlKTsKCiAgICAgICAgICBpZiAoJHBfZmlsZWRlc2NyWyduZXdfc2hvcnRfbmFtZSddID09ICcnKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIGVtcHR5IHNob3J0IGZpbGVuYW1lIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfTkVXX0ZVTExfTkFNRSA6CiAgICAgICAgICBpZiAoIWlzX3N0cmluZygkdl92YWx1ZSkpIHsKICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FUVFJJQlVURV9WQUxVRSwgIkludmFsaWQgdHlwZSAiLmdldHR5cGUoJHZfdmFsdWUpLiIuIFN0cmluZyBleHBlY3RlZCBmb3IgYXR0cmlidXRlICciLlBjbFppcFV0aWxPcHRpb25UZXh0KCR2X2tleSkuIiciKTsKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICB9CgogICAgICAgICAgJHBfZmlsZWRlc2NyWyduZXdfZnVsbF9uYW1lJ10gPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkdl92YWx1ZSk7CgogICAgICAgICAgaWYgKCRwX2ZpbGVkZXNjclsnbmV3X2Z1bGxfbmFtZSddID09ICcnKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIGVtcHR5IGZ1bGwgZmlsZW5hbWUgZm9yIGF0dHJpYnV0ZSAnIi5QY2xaaXBVdGlsT3B0aW9uVGV4dCgkdl9rZXkpLiInIik7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBvcHRpb25zIHRoYXQgdGFrZXMgYSBzdHJpbmcKICAgICAgICBjYXNlIFBDTFpJUF9BVFRfRklMRV9DT01NRU5UIDoKICAgICAgICAgIGlmICghaXNfc3RyaW5nKCR2X3ZhbHVlKSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVRUUklCVVRFX1ZBTFVFLCAiSW52YWxpZCB0eXBlICIuZ2V0dHlwZSgkdl92YWx1ZSkuIi4gU3RyaW5nIGV4cGVjdGVkIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAkcF9maWxlZGVzY3JbJ2NvbW1lbnQnXSA9ICR2X3ZhbHVlOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFBDTFpJUF9BVFRfRklMRV9NVElNRSA6CiAgICAgICAgICBpZiAoIWlzX2ludGVnZXIoJHZfdmFsdWUpKSB7CiAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BVFRSSUJVVEVfVkFMVUUsICJJbnZhbGlkIHR5cGUgIi5nZXR0eXBlKCR2X3ZhbHVlKS4iLiBJbnRlZ2VyIGV4cGVjdGVkIGZvciBhdHRyaWJ1dGUgJyIuUGNsWmlwVXRpbE9wdGlvblRleHQoJHZfa2V5KS4iJyIpOwogICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICAkcF9maWxlZGVzY3JbJ210aW1lJ10gPSAkdl92YWx1ZTsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBQQ0xaSVBfQVRUX0ZJTEVfQ09OVEVOVCA6CiAgICAgICAgICAkcF9maWxlZGVzY3JbJ2NvbnRlbnQnXSA9ICR2X3ZhbHVlOwogICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0IDoKICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX1BBUkFNRVRFUiwKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBwYXJhbWV0ZXIgJyIuJHZfa2V5LiInIik7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbnMKICAgICAgaWYgKCR2X3JlcXVlc3RlZF9vcHRpb25zICE9PSBmYWxzZSkgewogICAgICAgIGZvciAoJGtleT1yZXNldCgkdl9yZXF1ZXN0ZWRfb3B0aW9ucyk7ICRrZXk9a2V5KCR2X3JlcXVlc3RlZF9vcHRpb25zKTsgJGtleT1uZXh0KCR2X3JlcXVlc3RlZF9vcHRpb25zKSkgewogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgbWFuZGF0b3J5IG9wdGlvbgogICAgICAgICAgaWYgKCR2X3JlcXVlc3RlZF9vcHRpb25zWyRrZXldID09ICdtYW5kYXRvcnknKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgcHJlc2VudAogICAgICAgICAgICBpZiAoIWlzc2V0KCRwX2ZpbGVfbGlzdFska2V5XSkpIHsKICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiTWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVyICIuUGNsWmlwVXRpbE9wdGlvblRleHQoJGtleSkuIigiLiRrZXkuIikiKTsKICAgICAgICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgIC8vIGVuZCBmb3JlYWNoCiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkZpbGVEZXNjckV4cGFuZCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBtZXRob2QgbG9vayBmb3IgZWFjaCBpdGVtIG9mIHRoZSBsaXN0IHRvIHNlZSBpZiBpdHMgYSBmaWxlLCBhIGZvbGRlcgogIC8vICAgb3IgYSBzdHJpbmcgdG8gYmUgYWRkZWQgYXMgZmlsZS4gRm9yIGFueSBvdGhlciB0eXBlIG9mIGZpbGVzIChsaW5rLCBvdGhlcikKICAvLyAgIGp1c3QgaWdub3JlIHRoZSBpdGVtLgogIC8vICAgVGhlbiBwcmVwYXJlIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgc3RvcmVkIGZvciB0aGF0IGZpbGUuCiAgLy8gICBXaGVuIGl0cyBhIGZvbGRlciwgZXhwYW5kIHRoZSBmb2xkZXIgd2l0aCBhbGwgdGhlIGZpbGVzIHRoYXQgYXJlIGluIHRoYXQKICAvLyAgIGZvbGRlciAocmVjdXJzaXZlbHkpLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLgogIC8vICAgMCBvbiBmYWlsdXJlLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkZpbGVEZXNjckV4cGFuZCgmJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIENyZWF0ZSBhIHJlc3VsdCBsaXN0CiAgICAkdl9yZXN1bHRfbGlzdCA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gTG9vayBlYWNoIGVudHJ5CiAgICBmb3IgKCRpPTA7ICRpPHNpemVvZigkcF9maWxlZGVzY3JfbGlzdCk7ICRpKyspIHsKCiAgICAgIC8vIC0tLS0tIEdldCBmaWxlZGVzY3IKICAgICAgJHZfZGVzY3IgPSAkcF9maWxlZGVzY3JfbGlzdFskaV07CgogICAgICAvLyAtLS0tLSBSZWR1Y2UgdGhlIGZpbGVuYW1lCiAgICAgICR2X2Rlc2NyWydmaWxlbmFtZSddID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHZfZGVzY3JbJ2ZpbGVuYW1lJ10sIGZhbHNlKTsKICAgICAgJHZfZGVzY3JbJ2ZpbGVuYW1lJ10gPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkdl9kZXNjclsnZmlsZW5hbWUnXSk7CgogICAgICAvLyAtLS0tLSBMb29rIGZvciByZWFsIGZpbGUgb3IgZm9sZGVyCiAgICAgIGlmIChmaWxlX2V4aXN0cygkdl9kZXNjclsnZmlsZW5hbWUnXSkpIHsKICAgICAgICBpZiAoQGlzX2ZpbGUoJHZfZGVzY3JbJ2ZpbGVuYW1lJ10pKSB7CiAgICAgICAgICAkdl9kZXNjclsndHlwZSddID0gJ2ZpbGUnOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChAaXNfZGlyKCR2X2Rlc2NyWydmaWxlbmFtZSddKSkgewogICAgICAgICAgJHZfZGVzY3JbJ3R5cGUnXSA9ICdmb2xkZXInOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChAaXNfbGluaygkdl9kZXNjclsnZmlsZW5hbWUnXSkpIHsKICAgICAgICAgIC8vIHNraXAKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8vIHNraXAKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3Igc3RyaW5nIGFkZGVkIGFzIGZpbGUKICAgICAgZWxzZSBpZiAoaXNzZXQoJHZfZGVzY3JbJ2NvbnRlbnQnXSkpIHsKICAgICAgICAkdl9kZXNjclsndHlwZSddID0gJ3ZpcnR1YWxfZmlsZSc7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIE1pc3NpbmcgZmlsZQogICAgICBlbHNlIHsKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX01JU1NJTkdfRklMRSwgIkZpbGUgJyIuJHZfZGVzY3JbJ2ZpbGVuYW1lJ10uIicgZG9lcyBub3QgZXhpc3QiKTsKCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc3RvcmVkIGZpbGVuYW1lCiAgICAgICR0aGlzLT5wcml2Q2FsY3VsYXRlU3RvcmVkRmlsZW5hbWUoJHZfZGVzY3IsICRwX29wdGlvbnMpOwoKICAgICAgLy8gLS0tLS0gQWRkIHRoZSBkZXNjcmlwdG9yIGluIHJlc3VsdCBsaXN0CiAgICAgICR2X3Jlc3VsdF9saXN0W3NpemVvZigkdl9yZXN1bHRfbGlzdCldID0gJHZfZGVzY3I7CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBmb2xkZXIKICAgICAgaWYgKCR2X2Rlc2NyWyd0eXBlJ10gPT0gJ2ZvbGRlcicpIHsKICAgICAgICAvLyAtLS0tLSBMaXN0IG9mIGl0ZW1zIGluIGZvbGRlcgogICAgICAgICR2X2Rpcmxpc3RfZGVzY3IgPSBhcnJheSgpOwogICAgICAgICR2X2Rpcmxpc3RfbmIgPSAwOwogICAgICAgIGlmICgkdl9mb2xkZXJfaGFuZGxlciA9IEBvcGVuZGlyKCR2X2Rlc2NyWydmaWxlbmFtZSddKSkgewogICAgICAgICAgd2hpbGUgKCgkdl9pdGVtX2hhbmRsZXIgPSBAcmVhZGRpcigkdl9mb2xkZXJfaGFuZGxlcikpICE9PSBmYWxzZSkgewoKICAgICAgICAgICAgLy8gLS0tLS0gU2tpcCAnLicgYW5kICcuLicKICAgICAgICAgICAgaWYgKCgkdl9pdGVtX2hhbmRsZXIgPT0gJy4nKSB8fCAoJHZfaXRlbV9oYW5kbGVyID09ICcuLicpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gLS0tLS0gQ29tcG9zZSB0aGUgZnVsbCBmaWxlbmFtZQogICAgICAgICAgICAkdl9kaXJsaXN0X2Rlc2NyWyR2X2Rpcmxpc3RfbmJdWydmaWxlbmFtZSddID0gJHZfZGVzY3JbJ2ZpbGVuYW1lJ10uJy8nLiR2X2l0ZW1faGFuZGxlcjsKCiAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGRpZmZlcmVudCBzdG9yZWQgZmlsZW5hbWUKICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyIHdhcyBjaGFuZ2VkLCB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgLy8gZmlsZXMvc3ViLWZvbGRlcnMgYWxzbyBjaGFuZ2UKICAgICAgICAgICAgaWYgKCgkdl9kZXNjclsnc3RvcmVkX2ZpbGVuYW1lJ10gIT0gJHZfZGVzY3JbJ2ZpbGVuYW1lJ10pCiAgICAgICAgICAgICAgICAgJiYgKCFpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXSkpKSB7CiAgICAgICAgICAgICAgaWYgKCR2X2Rlc2NyWydzdG9yZWRfZmlsZW5hbWUnXSAhPSAnJykgewogICAgICAgICAgICAgICAgJHZfZGlybGlzdF9kZXNjclskdl9kaXJsaXN0X25iXVsnbmV3X2Z1bGxfbmFtZSddID0gJHZfZGVzY3JbJ3N0b3JlZF9maWxlbmFtZSddLicvJy4kdl9pdGVtX2hhbmRsZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJHZfZGlybGlzdF9kZXNjclskdl9kaXJsaXN0X25iXVsnbmV3X2Z1bGxfbmFtZSddID0gJHZfaXRlbV9oYW5kbGVyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHZfZGlybGlzdF9uYisrOwogICAgICAgICAgfQoKICAgICAgICAgIEBjbG9zZWRpcigkdl9mb2xkZXJfaGFuZGxlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gVEJDIDogdW5hYmxlIHRvIG9wZW4gZm9sZGVyIGluIHJlYWQgbW9kZQogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gRXhwYW5kIGVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdAogICAgICAgIGlmICgkdl9kaXJsaXN0X25iICE9IDApIHsKICAgICAgICAgIC8vIC0tLS0tIEV4cGFuZAogICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkZpbGVEZXNjckV4cGFuZCgkdl9kaXJsaXN0X2Rlc2NyLCAkcF9vcHRpb25zKSkgIT0gMSkgewogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIENvbmNhdCB0aGUgcmVzdWx0aW5nIGxpc3QKICAgICAgICAgICR2X3Jlc3VsdF9saXN0ID0gYXJyYXlfbWVyZ2UoJHZfcmVzdWx0X2xpc3QsICR2X2Rpcmxpc3RfZGVzY3IpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIEZyZWUgbG9jYWwgYXJyYXkKICAgICAgICB1bnNldCgkdl9kaXJsaXN0X2Rlc2NyKTsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIEdldCB0aGUgcmVzdWx0IGxpc3QKICAgICRwX2ZpbGVkZXNjcl9saXN0ID0gJHZfcmVzdWx0X2xpc3Q7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkNyZWF0ZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkNyZWF0ZSgkcF9maWxlZGVzY3JfbGlzdCwgJiRwX3Jlc3VsdF9saXN0LCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKICAgICR2X2xpc3RfZGV0YWlsID0gYXJyYXkoKTsKCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgZmlsZSBpbiB3cml0ZSBtb2RlCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2T3BlbkZkKCd3YicpKSAhPSAxKQogICAgewogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBBZGQgdGhlIGxpc3Qgb2YgZmlsZXMKICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkTGlzdCgkcF9maWxlZGVzY3JfbGlzdCwgJHBfcmVzdWx0X2xpc3QsICRwX29wdGlvbnMpOwoKICAgIC8vIC0tLS0tIENsb3NlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZBZGQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZBZGQoJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9yZXN1bHRfbGlzdCwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CiAgICAkdl9saXN0X2RldGFpbCA9IGFycmF5KCk7CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgYXJjaGl2ZSBleGlzdHMgb3IgaXMgZW1wdHkKICAgIGlmICgoIWlzX2ZpbGUoJHRoaXMtPnppcG5hbWUpKSB8fCAoZmlsZXNpemUoJHRoaXMtPnppcG5hbWUpID09IDApKQogICAgewoKICAgICAgLy8gLS0tLS0gRG8gYSBjcmVhdGUKICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZDcmVhdGUoJHBfZmlsZWRlc2NyX2xpc3QsICRwX3Jlc3VsdF9saXN0LCAkcF9vcHRpb25zKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICBpZiAoKCR2X3Jlc3VsdD0kdGhpcy0+cHJpdk9wZW5GZCgncmInKSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXIpKSAhPSAxKQogICAgewogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gR28gdG8gYmVnaW5uaW5nIG9mIEZpbGUKICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gQ3JlYXRlcyBhIHRlbXBvcmF5IGZpbGUKICAgICR2X3ppcF90ZW1wX25hbWUgPSBQQ0xaSVBfVEVNUE9SQVJZX0RJUi51bmlxaWQoJ3BjbHppcC0nKS4nLnRtcCc7CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgdGVtcG9yYXJ5IGZpbGUgaW4gd3JpdGUgbW9kZQogICAgaWYgKCgkdl96aXBfdGVtcF9mZCA9IEBmb3Blbigkdl96aXBfdGVtcF9uYW1lLCAnd2InKSkgPT0gMCkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIHRlbXBvcmFyeSBmaWxlIFwnJy4kdl96aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgd3JpdGUgbW9kZScpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCiAgICAvLyBUQkMgOiBIZXJlIEkgc2hvdWxkIGJldHRlciBhcHBlbmQgdGhlIGZpbGUgYW5kIGdvIGJhY2sgdG8gZXJhc2UgdGhlIGNlbnRyYWwgZGlyCiAgICAkdl9zaXplID0gJHZfY2VudHJhbF9kaXJbJ29mZnNldCddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOwogICAgICBAZndyaXRlKCR2X3ppcF90ZW1wX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIFN3YXAgdGhlIGZpbGUgZGVzY3JpcHRvcgogICAgLy8gSGVyZSBpcyBhIHRyaWNrIDogSSBzd2FwIHRoZSB0ZW1wb3JhcnkgZmQgd2l0aCB0aGUgemlwIGZkLCBpbiBvcmRlciB0byB1c2UKICAgIC8vIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbiB0aGUgdGVtcG9yYXJ5IGZpbCBhbmQgbm90IHRoZSByZWFsIGFyY2hpdmUKICAgICR2X3N3YXAgPSAkdGhpcy0+emlwX2ZkOwogICAgJHRoaXMtPnppcF9mZCA9ICR2X3ppcF90ZW1wX2ZkOwogICAgJHZfemlwX3RlbXBfZmQgPSAkdl9zd2FwOwoKICAgIC8vIC0tLS0tIEFkZCB0aGUgZmlsZXMKICAgICR2X2hlYWRlcl9saXN0ID0gYXJyYXkoKTsKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZBZGRGaWxlTGlzdCgkcF9maWxlZGVzY3JfbGlzdCwgJHZfaGVhZGVyX2xpc3QsICRwX29wdGlvbnMpKSAhPSAxKQogICAgewogICAgICBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgQHVubGluaygkdl96aXBfdGVtcF9uYW1lKTsKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBjZW50cmFsIGRpcgogICAgJHZfb2Zmc2V0ID0gQGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGJsb2NrIG9mIGZpbGUgaGVhZGVycyBmcm9tIHRoZSBvbGQgYXJjaGl2ZQogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyWydzaXplJ107CiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKQogICAgewogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7CiAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkdl96aXBfdGVtcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgQ2VudHJhbCBEaXIgZmlsZXMgaGVhZGVyCiAgICBmb3IgKCRpPTAsICR2X2NvdW50PTA7ICRpPHNpemVvZigkdl9oZWFkZXJfbGlzdCk7ICRpKyspCiAgICB7CiAgICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgZmlsZSBoZWFkZXIKICAgICAgaWYgKCR2X2hlYWRlcl9saXN0WyRpXVsnc3RhdHVzJ10gPT0gJ29rJykgewogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxGaWxlSGVhZGVyKCR2X2hlYWRlcl9saXN0WyRpXSkpICE9IDEpIHsKICAgICAgICAgIGZjbG9zZSgkdl96aXBfdGVtcF9mZCk7CiAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7CiAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQogICAgICAgICR2X2NvdW50Kys7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFRyYW5zZm9ybSB0aGUgaGVhZGVyIHRvIGEgJ3VzYWJsZScgaW5mbwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyX2xpc3RbJGldLCAkcF9yZXN1bHRfbGlzdFskaV0pOwogICAgfQoKICAgIC8vIC0tLS0tIFppcCBmaWxlIGNvbW1lbnQKICAgICR2X2NvbW1lbnQgPSAkdl9jZW50cmFsX2RpclsnY29tbWVudCddOwogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9DT01NRU5UXSkpIHsKICAgICAgJHZfY29tbWVudCA9ICRwX29wdGlvbnNbUENMWklQX09QVF9DT01NRU5UXTsKICAgIH0KICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQUREX0NPTU1FTlRdKSkgewogICAgICAkdl9jb21tZW50ID0gJHZfY29tbWVudC4kcF9vcHRpb25zW1BDTFpJUF9PUFRfQUREX0NPTU1FTlRdOwogICAgfQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9QUkVQRU5EX0NPTU1FTlRdKSkgewogICAgICAkdl9jb21tZW50ID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1BSRVBFTkRfQ09NTUVOVF0uJHZfY29tbWVudDsKICAgIH0KCiAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGNlbnRyYWwgaGVhZGVyCiAgICAkdl9zaXplID0gQGZ0ZWxsKCR0aGlzLT56aXBfZmQpLSR2X29mZnNldDsKCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGNlbnRyYWwgZGlyIGZvb3RlcgogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlQ2VudHJhbEhlYWRlcigkdl9jb3VudCskdl9jZW50cmFsX2RpclsnZW50cmllcyddLCAkdl9zaXplLCAkdl9vZmZzZXQsICR2X2NvbW1lbnQpKSAhPSAxKQogICAgewogICAgICAvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBsaXN0CiAgICAgIHVuc2V0KCR2X2hlYWRlcl9saXN0KTsKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBTd2FwIGJhY2sgdGhlIGZpbGUgZGVzY3JpcHRvcgogICAgJHZfc3dhcCA9ICR0aGlzLT56aXBfZmQ7CiAgICAkdGhpcy0+emlwX2ZkID0gJHZfemlwX3RlbXBfZmQ7CiAgICAkdl96aXBfdGVtcF9mZCA9ICR2X3N3YXA7CgogICAgLy8gLS0tLS0gQ2xvc2UKICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgIC8vIC0tLS0tIENsb3NlIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgQGZjbG9zZSgkdl96aXBfdGVtcF9mZCk7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAvLyAtLS0tLSBEZWxldGUgdGhlIHppcCBmaWxlCiAgICAvLyBUQkMgOiBJIHNob3VsZCB0ZXN0IHRoZSByZXN1bHQgLi4uCiAgICBAdW5saW5rKCR0aGlzLT56aXBuYW1lKTsKCiAgICAvLyAtLS0tLSBSZW5hbWUgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICAvLyBUQkMgOiBJIHNob3VsZCB0ZXN0IHRoZSByZXN1bHQgLi4uCiAgICAvL0ByZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOwogICAgUGNsWmlwVXRpbFJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdk9wZW5GZCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdk9wZW5GZCgkcF9tb2RlKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgYWxyZWFkeSBvcGVuCiAgICBpZiAoJHRoaXMtPnppcF9mZCAhPSAwKQogICAgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1ppcCBmaWxlIFwnJy4kdGhpcy0+emlwbmFtZS4nXCcgYWxyZWFkeSBvcGVuJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgemlwIGZpbGUKICAgIGlmICgoJHRoaXMtPnppcF9mZCA9IEBmb3BlbigkdGhpcy0+emlwbmFtZSwgJHBfbW9kZSkpID09IDApCiAgICB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gYXJjaGl2ZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnIGluICcuJHBfbW9kZS4nIG1vZGUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2Q2xvc2VGZCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkNsb3NlRmQoKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIGlmICgkdGhpcy0+emlwX2ZkICE9IDApCiAgICAgIEBmY2xvc2UoJHRoaXMtPnppcF9mZCk7CiAgICAkdGhpcy0+emlwX2ZkID0gMDsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2QWRkTGlzdCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgJHBfYWRkX2RpciBhbmQgJHBfcmVtb3ZlX2RpciB3aWxsIGdpdmUgdGhlIGFiaWxpdHkgdG8gbWVtb3JpemUgYSBwYXRoIHdoaWNoIGlzCiAgLy8gICBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBwYXRoIG9mIHRoZSBmaWxlLiBUaGlzIGlzIHVzZWZ1bGwgaWYgeW91IHdhbnQgdG8gaGF2ZSBQY2xUYXIKICAvLyAgIHJ1bm5pbmcgaW4gYW55IGRpcmVjdG9yeSwgYW5kIG1lbW9yaXplIHJlbGF0aXZlIHBhdGggZnJvbSBhbiBvdGhlciBkaXJlY3RvcnkuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9saXN0IDogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgZmlsZSBvciBkaXJlY3RvcnkgbmFtZXMgdG8gYWRkIGluIHRoZSB0YXIKICAvLyAgICRwX3Jlc3VsdF9saXN0IDogbGlzdCBvZiBhZGRlZCBmaWxlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKHNwZWNpYWxseSB0aGUgc3RhdHVzIGZpZWxkKQogIC8vICAgJHBfYWRkX2RpciA6IFBhdGggdG8gYWRkIGluIHRoZSBmaWxlbmFtZSBwYXRoIGFyY2hpdmVkCiAgLy8gICAkcF9yZW1vdmVfZGlyIDogUGF0aCB0byByZW1vdmUgaW4gdGhlIGZpbGVuYW1lIHBhdGggYXJjaGl2ZWQKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgZnVuY3Rpb24gcHJpdkFkZExpc3QoJHBfbGlzdCwgJiRwX3Jlc3VsdF9saXN0LCAkcF9hZGRfZGlyLCAkcF9yZW1vdmVfZGlyLCAkcF9yZW1vdmVfYWxsX2RpciwgJiRwX29wdGlvbnMpCiAgZnVuY3Rpb24gcHJpdkFkZExpc3QoJHBfZmlsZWRlc2NyX2xpc3QsICYkcF9yZXN1bHRfbGlzdCwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gQWRkIHRoZSBmaWxlcwogICAgJHZfaGVhZGVyX2xpc3QgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkFkZEZpbGVMaXN0KCRwX2ZpbGVkZXNjcl9saXN0LCAkdl9oZWFkZXJfbGlzdCwgJHBfb3B0aW9ucykpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGNlbnRyYWwgZGlyCiAgICAkdl9vZmZzZXQgPSBAZnRlbGwoJHRoaXMtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBDZW50cmFsIERpciBmaWxlcyBoZWFkZXIKICAgIGZvciAoJGk9MCwkdl9jb3VudD0wOyAkaTxzaXplb2YoJHZfaGVhZGVyX2xpc3QpOyAkaSsrKQogICAgewogICAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGZpbGUgaGVhZGVyCiAgICAgIGlmICgkdl9oZWFkZXJfbGlzdFskaV1bJ3N0YXR1cyddID09ICdvaycpIHsKICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVDZW50cmFsRmlsZUhlYWRlcigkdl9oZWFkZXJfbGlzdFskaV0pKSAhPSAxKSB7CiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQogICAgICAgICR2X2NvdW50Kys7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFRyYW5zZm9ybSB0aGUgaGVhZGVyIHRvIGEgJ3VzYWJsZScgaW5mbwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyX2xpc3RbJGldLCAkcF9yZXN1bHRfbGlzdFskaV0pOwogICAgfQoKICAgIC8vIC0tLS0tIFppcCBmaWxlIGNvbW1lbnQKICAgICR2X2NvbW1lbnQgPSAnJzsKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF0pKSB7CiAgICAgICR2X2NvbW1lbnQgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF07CiAgICB9CgogICAgLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBjZW50cmFsIGhlYWRlcgogICAgJHZfc2l6ZSA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKS0kdl9vZmZzZXQ7CgogICAgLy8gLS0tLS0gQ3JlYXRlIHRoZSBjZW50cmFsIGRpciBmb290ZXIKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoJHZfY291bnQsICR2X3NpemUsICR2X29mZnNldCwgJHZfY29tbWVudCkpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBmaWxlIGxpc3QKICAgICAgdW5zZXQoJHZfaGVhZGVyX2xpc3QpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkFkZEZpbGVMaXN0KCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9maWxlZGVzY3JfbGlzdCA6IEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZpbGUgZGVzY3JpcHRpb24KICAvLyAgICAgICAgICAgICAgICAgICAgICBvciBkaXJlY3RvcnkgbmFtZXMgdG8gYWRkIGluIHRoZSB6aXAKICAvLyAgICRwX3Jlc3VsdF9saXN0IDogbGlzdCBvZiBhZGRlZCBmaWxlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKHNwZWNpYWxseSB0aGUgc3RhdHVzIGZpZWxkKQogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkFkZEZpbGVMaXN0KCRwX2ZpbGVkZXNjcl9saXN0LCAmJHBfcmVzdWx0X2xpc3QsICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwogICAgJHZfaGVhZGVyID0gYXJyYXkoKTsKCiAgICAvLyAtLS0tLSBSZWN1cGVyYXRlIHRoZSBjdXJyZW50IG51bWJlciBvZiBlbHQgaW4gbGlzdAogICAgJHZfbmIgPSBzaXplb2YoJHBfcmVzdWx0X2xpc3QpOwoKICAgIC8vIC0tLS0tIExvb3Agb24gdGhlIGZpbGVzCiAgICBmb3IgKCRqPTA7ICgkajxzaXplb2YoJHBfZmlsZWRlc2NyX2xpc3QpKSAmJiAoJHZfcmVzdWx0PT0xKTsgJGorKykgewogICAgICAvLyAtLS0tLSBGb3JtYXQgdGhlIGZpbGVuYW1lCiAgICAgICRwX2ZpbGVkZXNjcl9saXN0WyRqXVsnZmlsZW5hbWUnXQogICAgICA9IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsnZmlsZW5hbWUnXSwgZmFsc2UpOwoKCiAgICAgIC8vIC0tLS0tIFNraXAgZW1wdHkgZmlsZSBuYW1lcwogICAgICAvLyBUQkMgOiBDYW4gdGhpcyBiZSBwb3NzaWJsZSA/IG5vdCBjaGVja2VkIGluIERlc2NyUGFyc2VBdHQgPwogICAgICBpZiAoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddID09ICIiKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIENoZWNrIHRoZSBmaWxlbmFtZQogICAgICBpZiAoICAgKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsndHlwZSddICE9ICd2aXJ0dWFsX2ZpbGUnKQogICAgICAgICAgJiYgKCFmaWxlX2V4aXN0cygkcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10pKSkgewogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfTUlTU0lOR19GSUxFLCAiRmlsZSAnIi4kcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10uIicgZG9lcyBub3QgZXhpc3QiKTsKICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBpZiBpdCBpcyBhIGZpbGUgb3IgYSBkaXIgd2l0aCBubyBhbGwgcGF0aCByZW1vdmUgb3B0aW9uCiAgICAgIC8vIG9yIGEgZGlyIHdpdGggYWxsIGl0cyBwYXRoIHJlbW92ZWQKLy8gICAgICBpZiAoICAgKGlzX2ZpbGUoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWydmaWxlbmFtZSddKSkKLy8gICAgICAgICAgfHwgKCAgIGlzX2RpcigkcF9maWxlZGVzY3JfbGlzdFskal1bJ2ZpbGVuYW1lJ10pCiAgICAgIGlmICggICAoJHBfZmlsZWRlc2NyX2xpc3RbJGpdWyd0eXBlJ10gPT0gJ2ZpbGUnKQogICAgICAgICAgfHwgKCRwX2ZpbGVkZXNjcl9saXN0WyRqXVsndHlwZSddID09ICd2aXJ0dWFsX2ZpbGUnKQogICAgICAgICAgfHwgKCAgICgkcF9maWxlZGVzY3JfbGlzdFskal1bJ3R5cGUnXSA9PSAnZm9sZGVyJykKICAgICAgICAgICAgICAmJiAoICAgIWlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEhdKQogICAgICAgICAgICAgICAgICB8fCAhJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFTU9WRV9BTExfUEFUSF0pKQogICAgICAgICAgKSB7CgogICAgICAgIC8vIC0tLS0tIEFkZCB0aGUgZmlsZQogICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkRmlsZSgkcF9maWxlZGVzY3JfbGlzdFskal0sICR2X2hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfb3B0aW9ucyk7CiAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gU3RvcmUgdGhlIGZpbGUgaW5mb3MKICAgICAgICAkcF9yZXN1bHRfbGlzdFskdl9uYisrXSA9ICR2X2hlYWRlcjsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZBZGRGaWxlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2QWRkRmlsZSgkcF9maWxlZGVzY3IsICYkcF9oZWFkZXIsICYkcF9vcHRpb25zKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIFdvcmtpbmcgdmFyaWFibGUKICAgICRwX2ZpbGVuYW1lID0gJHBfZmlsZWRlc2NyWydmaWxlbmFtZSddOwoKICAgIC8vIFRCQyA6IEFscmVhZHkgZG9uZSBpbiB0aGUgZmlsZUF0dCBjaGVjayAuLi4gPwogICAgaWYgKCRwX2ZpbGVuYW1lID09ICIiKSB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfUEFSQU1FVEVSLCAiSW52YWxpZCBmaWxlIGxpc3QgcGFyYW1ldGVyIChpbnZhbGlkIG9yIGVtcHR5IGxpc3QpIik7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgYSBzdG9yZWQgZGlmZmVyZW50IGZpbGVuYW1lCiAgICAvKiBUQkMgOiBSZW1vdmVkCiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXSkpIHsKICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXTsKICAgIH0KICAgIGVsc2UgewogICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSAkcF9maWxlZGVzY3JbJ3N0b3JlZF9maWxlbmFtZSddOwogICAgfQogICAgKi8KCiAgICAvLyAtLS0tLSBTZXQgdGhlIGZpbGUgcHJvcGVydGllcwogICAgY2xlYXJzdGF0Y2FjaGUoKTsKICAgICRwX2hlYWRlclsndmVyc2lvbiddID0gMjA7CiAgICAkcF9oZWFkZXJbJ3ZlcnNpb25fZXh0cmFjdGVkJ10gPSAxMDsKICAgICRwX2hlYWRlclsnZmxhZyddID0gMDsKICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9IDA7CiAgICAkcF9oZWFkZXJbJ2NyYyddID0gMDsKICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10gPSAwOwogICAgJHBfaGVhZGVyWydmaWxlbmFtZV9sZW4nXSA9IHN0cmxlbigkcF9maWxlbmFtZSk7CiAgICAkcF9oZWFkZXJbJ2V4dHJhX2xlbiddID0gMDsKICAgICRwX2hlYWRlclsnZGlzayddID0gMDsKICAgICRwX2hlYWRlclsnaW50ZXJuYWwnXSA9IDA7CiAgICAkcF9oZWFkZXJbJ29mZnNldCddID0gMDsKICAgICRwX2hlYWRlclsnZmlsZW5hbWUnXSA9ICRwX2ZpbGVuYW1lOwovLyBUQkMgOiBSZW1vdmVkICAgICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10gPSAkdl9zdG9yZWRfZmlsZW5hbWU7CiAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID0gJHBfZmlsZWRlc2NyWydzdG9yZWRfZmlsZW5hbWUnXTsKICAgICRwX2hlYWRlclsnZXh0cmEnXSA9ICcnOwogICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICdvayc7CiAgICAkcF9oZWFkZXJbJ2luZGV4J10gPSAtMTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciByZWd1bGFyIGZpbGUKICAgIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXT09J2ZpbGUnKSB7CiAgICAgICRwX2hlYWRlclsnZXh0ZXJuYWwnXSA9IDB4MDAwMDAwMDA7CiAgICAgICRwX2hlYWRlclsnc2l6ZSddID0gZmlsZXNpemUoJHBfZmlsZW5hbWUpOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHJlZ3VsYXIgZm9sZGVyCiAgICBlbHNlIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXT09J2ZvbGRlcicpIHsKICAgICAgJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHgwMDAwMDAxMDsKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gZmlsZW10aW1lKCRwX2ZpbGVuYW1lKTsKICAgICAgJHBfaGVhZGVyWydzaXplJ10gPSBmaWxlc2l6ZSgkcF9maWxlbmFtZSk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgdmlydHVhbCBmaWxlCiAgICBlbHNlIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXSA9PSAndmlydHVhbF9maWxlJykgewogICAgICAkcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDAwMDAwMDAwOwogICAgICAkcF9oZWFkZXJbJ3NpemUnXSA9IHN0cmxlbigkcF9maWxlZGVzY3JbJ2NvbnRlbnQnXSk7CiAgICB9CgoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGZpbGV0aW1lCiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWydtdGltZSddKSkgewogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSAkcF9maWxlZGVzY3JbJ210aW1lJ107CiAgICB9CiAgICBlbHNlIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXSA9PSAndmlydHVhbF9maWxlJykgewogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSB0aW1lKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gZmlsZW10aW1lKCRwX2ZpbGVuYW1lKTsKICAgIH0KCiAgICAvLyAtLS0tLS0gTG9vayBmb3IgZmlsZSBjb21tZW50CiAgICBpZiAoaXNzZXQoJHBfZmlsZWRlc2NyWydjb21tZW50J10pKSB7CiAgICAgICRwX2hlYWRlclsnY29tbWVudF9sZW4nXSA9IHN0cmxlbigkcF9maWxlZGVzY3JbJ2NvbW1lbnQnXSk7CiAgICAgICRwX2hlYWRlclsnY29tbWVudCddID0gJHBfZmlsZWRlc2NyWydjb21tZW50J107CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHBfaGVhZGVyWydjb21tZW50X2xlbiddID0gMDsKICAgICAgJHBfaGVhZGVyWydjb21tZW50J10gPSAnJzsKICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBwcmUtYWRkIGNhbGxiYWNrCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0FERF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9oZWFkZXIsICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0FERF0oUENMWklQX0NCX1BSRV9BREQsICR2X2xvY2FsX2hlYWRlcik7CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMCkgewogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAkcF9oZWFkZXJbJ3N0YXR1cyddID0gInNraXBwZWQiOwogICAgICAgICR2X3Jlc3VsdCA9IDE7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb25zCiAgICAgIC8vIE9ubHkgc29tZSBmaWVsZHMgY2FuIGJlIG1vZGlmaWVkCiAgICAgIGlmICgkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddICE9ICR2X2xvY2FsX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pIHsKICAgICAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID0gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHZfbG9jYWxfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBlbXB0eSBzdG9yZWQgZmlsZW5hbWUKICAgIGlmICgkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID09ICIiKSB7CiAgICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAiZmlsdGVyZWQiOwogICAgfQoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBwYXRoIGxlbmd0aAogICAgaWYgKHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSA+IDB4RkYpIHsKICAgICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICdmaWxlbmFtZV90b29fbG9uZyc7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiBubyBlcnJvciwgb3IgZmlsZSBub3Qgc2tpcHBlZAogICAgaWYgKCRwX2hlYWRlclsnc3RhdHVzJ10gPT0gJ29rJykgewoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSBmaWxlCiAgICAgIGlmICgkcF9maWxlZGVzY3JbJ3R5cGUnXSA9PSAnZmlsZScpIHsKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2luZyB0ZW1wb3JhcnkgZmlsZSB0byB6aXAKICAgICAgICBpZiAoICghaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9PRkZdKSkKICAgICAgICAgICAgJiYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT05dKQogICAgICAgICAgICAgICAgfHwgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSkKICAgICAgICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdIDw9ICRwX2hlYWRlclsnc2l6ZSddKSkgKSApIHsKICAgICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2QWRkRmlsZVVzaW5nVGVtcEZpbGUoJHBfZmlsZWRlc2NyLCAkcF9oZWFkZXIsICRwX29wdGlvbnMpOwogICAgICAgICAgaWYgKCR2X3Jlc3VsdCA8IFBDTFpJUF9FUlJfTk9fRVJST1IpIHsKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIFVzZSAiaW4gbWVtb3J5IiB6aXAgYWxnbwogICAgICAgIGVsc2UgewoKICAgICAgICAvLyAtLS0tLSBPcGVuIHRoZSBzb3VyY2UgZmlsZQogICAgICAgIGlmICgoJHZfZmlsZSA9IEBmb3BlbigkcF9maWxlbmFtZSwgInJiIikpID09IDApIHsKICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICJVbmFibGUgdG8gb3BlbiBmaWxlICckcF9maWxlbmFtZScgaW4gYmluYXJ5IHJlYWQgbW9kZSIpOwogICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGNvbnRlbnQKICAgICAgICAkdl9jb250ZW50ID0gQGZyZWFkKCR2X2ZpbGUsICRwX2hlYWRlclsnc2l6ZSddKTsKCiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUKICAgICAgICBAZmNsb3NlKCR2X2ZpbGUpOwoKICAgICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIENSQwogICAgICAgICRwX2hlYWRlclsnY3JjJ10gPSBAY3JjMzIoJHZfY29udGVudCk7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vIGNvbXByZXNzaW9uCiAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9OT19DT01QUkVTU0lPTl0pIHsKICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9ICRwX2hlYWRlclsnc2l6ZSddOwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gMDsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vcm1hbCBjb21wcmVzc2lvbgogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gLS0tLS0gQ29tcHJlc3MgdGhlIGNvbnRlbnQKICAgICAgICAgICR2X2NvbnRlbnQgPSBAZ3pkZWZsYXRlKCR2X2NvbnRlbnQpOwoKICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9IHN0cmxlbigkdl9jb250ZW50KTsKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9IDg7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBDYWxsIHRoZSBoZWFkZXIgZ2VuZXJhdGlvbgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUZpbGVIZWFkZXIoJHBfaGVhZGVyKSkgIT0gMSkgewogICAgICAgICAgQGZjbG9zZSgkdl9maWxlKTsKICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBXcml0ZSB0aGUgY29tcHJlc3NlZCAob3Igbm90KSBjb250ZW50CiAgICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9jb250ZW50LCAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddKTsKCiAgICAgICAgfQoKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSB2aXJ0dWFsIGZpbGUgKGEgZmlsZSBmcm9tIHN0cmluZykKICAgICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ3ZpcnR1YWxfZmlsZScpIHsKCiAgICAgICAgJHZfY29udGVudCA9ICRwX2ZpbGVkZXNjclsnY29udGVudCddOwoKICAgICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIENSQwogICAgICAgICRwX2hlYWRlclsnY3JjJ10gPSBAY3JjMzIoJHZfY29udGVudCk7CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vIGNvbXByZXNzaW9uCiAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9OT19DT01QUkVTU0lPTl0pIHsKICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9ICRwX2hlYWRlclsnc2l6ZSddOwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gMDsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vcm1hbCBjb21wcmVzc2lvbgogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gLS0tLS0gQ29tcHJlc3MgdGhlIGNvbnRlbnQKICAgICAgICAgICR2X2NvbnRlbnQgPSBAZ3pkZWZsYXRlKCR2X2NvbnRlbnQpOwoKICAgICAgICAgIC8vIC0tLS0tIFNldCBoZWFkZXIgcGFyYW1ldGVycwogICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9IHN0cmxlbigkdl9jb250ZW50KTsKICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3Npb24nXSA9IDg7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBDYWxsIHRoZSBoZWFkZXIgZ2VuZXJhdGlvbgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUZpbGVIZWFkZXIoJHBfaGVhZGVyKSkgIT0gMSkgewogICAgICAgICAgQGZjbG9zZSgkdl9maWxlKTsKICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBXcml0ZSB0aGUgY29tcHJlc3NlZCAob3Igbm90KSBjb250ZW50CiAgICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9jb250ZW50LCAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSBkaXJlY3RvcnkKICAgICAgZWxzZSBpZiAoJHBfZmlsZWRlc2NyWyd0eXBlJ10gPT0gJ2ZvbGRlcicpIHsKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBkaXJlY3RvcnkgbGFzdCAnLycKICAgICAgICBpZiAoQHN1YnN0cigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddLCAtMSkgIT0gJy8nKSB7CiAgICAgICAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddIC49ICcvJzsKICAgICAgICB9CgogICAgICAgIC8vIC0tLS0tIFNldCB0aGUgZmlsZSBwcm9wZXJ0aWVzCiAgICAgICAgJHBfaGVhZGVyWydzaXplJ10gPSAwOwogICAgICAgIC8vJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHg0MUZGMDAxMDsgICAvLyBWYWx1ZSBmb3IgYSBmb2xkZXIgOiB0byBiZSBjaGVja2VkCiAgICAgICAgJHBfaGVhZGVyWydleHRlcm5hbCddID0gMHgwMDAwMDAxMDsgICAvLyBWYWx1ZSBmb3IgYSBmb2xkZXIgOiB0byBiZSBjaGVja2VkCgogICAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGhlYWRlciBnZW5lcmF0aW9uCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlRmlsZUhlYWRlcigkcF9oZWFkZXIpKSAhPSAxKQogICAgICAgIHsKICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcG9zdC1hZGQgY2FsbGJhY2sKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0FERF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9oZWFkZXIsICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9BRERdKFBDTFpJUF9DQl9QT1NUX0FERCwgJHZfbG9jYWxfaGVhZGVyKTsKICAgICAgaWYgKCR2X3Jlc3VsdCA9PSAwKSB7CiAgICAgICAgLy8gLS0tLS0gSWdub3JlZAogICAgICAgICR2X3Jlc3VsdCA9IDE7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb25zCiAgICAgIC8vIE5vdGhpbmcgY2FuIGJlIG1vZGlmaWVkCiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkFkZEZpbGVVc2luZ1RlbXBGaWxlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2QWRkRmlsZVVzaW5nVGVtcEZpbGUoJHBfZmlsZWRlc2NyLCAmJHBfaGVhZGVyLCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9UENMWklQX0VSUl9OT19FUlJPUjsKCiAgICAvLyAtLS0tLSBXb3JraW5nIHZhcmlhYmxlCiAgICAkcF9maWxlbmFtZSA9ICRwX2ZpbGVkZXNjclsnZmlsZW5hbWUnXTsKCgogICAgLy8gLS0tLS0gT3BlbiB0aGUgc291cmNlIGZpbGUKICAgIGlmICgoJHZfZmlsZSA9IEBmb3BlbigkcF9maWxlbmFtZSwgInJiIikpID09IDApIHsKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgIlVuYWJsZSB0byBvcGVuIGZpbGUgJyRwX2ZpbGVuYW1lJyBpbiBiaW5hcnkgcmVhZCBtb2RlIik7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIENyZWF0ZXMgYSBjb21wcmVzc2VkIHRlbXBvcmFyeSBmaWxlCiAgICAkdl9nemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicuZ3onOwogICAgaWYgKCgkdl9maWxlX2NvbXByZXNzZWQgPSBAZ3pvcGVuKCR2X2d6aXBfdGVtcF9uYW1lLCAid2IiKSkgPT0gMCkgewogICAgICBmY2xvc2UoJHZfZmlsZSk7CiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfV1JJVEVfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgd3JpdGUgbW9kZScpOwogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGJ5IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgb2N0ZXRzIGJsb2NrcwogICAgJHZfc2l6ZSA9IGZpbGVzaXplKCRwX2ZpbGVuYW1lKTsKICAgIHdoaWxlICgkdl9zaXplICE9IDApIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHZfZmlsZSwgJHZfcmVhZF9zaXplKTsKICAgICAgLy8kdl9iaW5hcnlfZGF0YSA9IHBhY2soJ2EnLiR2X3JlYWRfc2l6ZSwgJHZfYnVmZmVyKTsKICAgICAgQGd6cHV0cygkdl9maWxlX2NvbXByZXNzZWQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUKICAgIEBmY2xvc2UoJHZfZmlsZSk7CiAgICBAZ3pjbG9zZSgkdl9maWxlX2NvbXByZXNzZWQpOwoKICAgIC8vIC0tLS0tIENoZWNrIHRoZSBtaW5pbXVtIGZpbGUgc2l6ZQogICAgaWYgKGZpbGVzaXplKCR2X2d6aXBfdGVtcF9uYW1lKSA8IDE4KSB7CiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ2d6aXAgdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBoYXMgaW52YWxpZCBmaWxlc2l6ZSAtIHNob3VsZCBiZSBtaW5pbXVtIDE4IGJ5dGVzJyk7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIGNvbXByZXNzZWQgYXR0cmlidXRlcwogICAgaWYgKCgkdl9maWxlX2NvbXByZXNzZWQgPSBAZm9wZW4oJHZfZ3ppcF90ZW1wX25hbWUsICJyYiIpKSA9PSAwKSB7CiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfZ3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSByZWFkIG1vZGUnKTsKICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZ3ppcCBmaWxlIGhlYWRlcgogICAgJHZfYmluYXJ5X2RhdGEgPSBAZnJlYWQoJHZfZmlsZV9jb21wcmVzc2VkLCAxMCk7CiAgICAkdl9kYXRhX2hlYWRlciA9IHVucGFjaygnYTFpZDEvYTFpZDIvYTFjbS9hMWZsYWcvVm10aW1lL2ExeGZsL2Exb3MnLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gQ2hlY2sgc29tZSBwYXJhbWV0ZXJzCiAgICAkdl9kYXRhX2hlYWRlclsnb3MnXSA9IGJpbjJoZXgoJHZfZGF0YV9oZWFkZXJbJ29zJ10pOwoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGd6aXAgZmlsZSBmb290ZXIKICAgIEBmc2Vlaygkdl9maWxlX2NvbXByZXNzZWQsIGZpbGVzaXplKCR2X2d6aXBfdGVtcF9uYW1lKS04KTsKICAgICR2X2JpbmFyeV9kYXRhID0gQGZyZWFkKCR2X2ZpbGVfY29tcHJlc3NlZCwgOCk7CiAgICAkdl9kYXRhX2Zvb3RlciA9IHVucGFjaygnVmNyYy9WY29tcHJlc3NlZF9zaXplJywgJHZfYmluYXJ5X2RhdGEpOwoKICAgIC8vIC0tLS0tIFNldCB0aGUgYXR0cmlidXRlcwogICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gb3JkKCR2X2RhdGFfaGVhZGVyWydjbSddKTsKICAgIC8vJHBfaGVhZGVyWydtdGltZSddID0gJHZfZGF0YV9oZWFkZXJbJ210aW1lJ107CiAgICAkcF9oZWFkZXJbJ2NyYyddID0gJHZfZGF0YV9mb290ZXJbJ2NyYyddOwogICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9IGZpbGVzaXplKCR2X2d6aXBfdGVtcF9uYW1lKS0xODsKCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgZmlsZQogICAgQGZjbG9zZSgkdl9maWxlX2NvbXByZXNzZWQpOwoKICAgIC8vIC0tLS0tIENhbGwgdGhlIGhlYWRlciBnZW5lcmF0aW9uCiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2V3JpdGVGaWxlSGVhZGVyKCRwX2hlYWRlcikpICE9IDEpIHsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBBZGQgdGhlIGNvbXByZXNzZWQgZGF0YQogICAgaWYgKCgkdl9maWxlX2NvbXByZXNzZWQgPSBAZm9wZW4oJHZfZ3ppcF90ZW1wX25hbWUsICJyYiIpKSA9PSAwKQogICAgewogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgYnkgUENMWklQX1JFQURfQkxPQ0tfU0laRSBvY3RldHMgYmxvY2tzCiAgICBmc2Vlaygkdl9maWxlX2NvbXByZXNzZWQsIDEwKTsKICAgICR2X3NpemUgPSAkcF9oZWFkZXJbJ2NvbXByZXNzZWRfc2l6ZSddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHZfZmlsZV9jb21wcmVzc2VkLCAkdl9yZWFkX3NpemUpOwogICAgICAvLyR2X2JpbmFyeV9kYXRhID0gcGFjaygnYScuJHZfcmVhZF9zaXplLCAkdl9idWZmZXIpOwogICAgICBAZndyaXRlKCR0aGlzLT56aXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIGZpbGUKICAgIEBmY2xvc2UoJHZfZmlsZV9jb21wcmVzc2VkKTsKCiAgICAvLyAtLS0tLSBVbmxpbmsgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICBAdW5saW5rKCR2X2d6aXBfdGVtcF9uYW1lKTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2Q2FsY3VsYXRlU3RvcmVkRmlsZW5hbWUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIEJhc2VkIG9uIGZpbGUgZGVzY3JpcHRvciBwcm9wZXJ0aWVzIGFuZCBnbG9iYWwgb3B0aW9ucywgdGhpcyBtZXRob2QKICAvLyAgIGNhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgYXJjaGl2ZS4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZDYWxjdWxhdGVTdG9yZWRGaWxlbmFtZSgmJHBfZmlsZWRlc2NyLCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBXb3JraW5nIHZhcmlhYmxlcwogICAgJHBfZmlsZW5hbWUgPSAkcF9maWxlZGVzY3JbJ2ZpbGVuYW1lJ107CiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0FERF9QQVRIXSkpIHsKICAgICAgJHBfYWRkX2RpciA9ICRwX29wdGlvbnNbUENMWklQX09QVF9BRERfUEFUSF07CiAgICB9CiAgICBlbHNlIHsKICAgICAgJHBfYWRkX2RpciA9ICcnOwogICAgfQogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9SRU1PVkVfUEFUSF0pKSB7CiAgICAgICRwX3JlbW92ZV9kaXIgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX1BBVEhdOwogICAgfQogICAgZWxzZSB7CiAgICAgICRwX3JlbW92ZV9kaXIgPSAnJzsKICAgIH0KICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXSkpIHsKICAgICAgJHBfcmVtb3ZlX2FsbF9kaXIgPSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfUkVNT1ZFX0FMTF9QQVRIXTsKICAgIH0KICAgIGVsc2UgewogICAgICAkcF9yZW1vdmVfYWxsX2RpciA9IDA7CiAgICB9CgoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGZ1bGwgbmFtZSBjaGFuZ2UKICAgIGlmIChpc3NldCgkcF9maWxlZGVzY3JbJ25ld19mdWxsX25hbWUnXSkpIHsKICAgICAgLy8gLS0tLS0gUmVtb3ZlIGRyaXZlIGxldHRlciBpZiBhbnkKICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHBfZmlsZWRlc2NyWyduZXdfZnVsbF9uYW1lJ10pOwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhdGggYW5kL29yIHNob3J0IG5hbWUgY2hhbmdlCiAgICBlbHNlIHsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHNob3J0IG5hbWUgY2hhbmdlCiAgICAgIC8vIEl0cyB3aGVuIHdlIGNhaG5nZSBqdXN0IHRoZSBmaWxlbmFtZSBidXQgbm90IHRoZSBwYXRoCiAgICAgIGlmIChpc3NldCgkcF9maWxlZGVzY3JbJ25ld19zaG9ydF9uYW1lJ10pKSB7CiAgICAgICAgJHZfcGF0aF9pbmZvID0gcGF0aGluZm8oJHBfZmlsZW5hbWUpOwogICAgICAgICR2X2RpciA9ICcnOwogICAgICAgIGlmICgkdl9wYXRoX2luZm9bJ2Rpcm5hbWUnXSAhPSAnJykgewogICAgICAgICAgJHZfZGlyID0gJHZfcGF0aF9pbmZvWydkaXJuYW1lJ10uJy8nOwogICAgICAgIH0KICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSAkdl9kaXIuJHBfZmlsZWRlc2NyWyduZXdfc2hvcnRfbmFtZSddOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc3RvcmVkIGZpbGVuYW1lCiAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfZmlsZW5hbWU7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFsbCBwYXRoIHRvIHJlbW92ZQogICAgICBpZiAoJHBfcmVtb3ZlX2FsbF9kaXIpIHsKICAgICAgICAkdl9zdG9yZWRfZmlsZW5hbWUgPSBiYXNlbmFtZSgkcF9maWxlbmFtZSk7CiAgICAgIH0KICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcGFydGlhbCBwYXRoIHJlbW92ZQogICAgICBlbHNlIGlmICgkcF9yZW1vdmVfZGlyICE9ICIiKSB7CiAgICAgICAgaWYgKHN1YnN0cigkcF9yZW1vdmVfZGlyLCAtMSkgIT0gJy8nKQogICAgICAgICAgJHBfcmVtb3ZlX2RpciAuPSAiLyI7CgogICAgICAgIGlmICggICAoc3Vic3RyKCRwX2ZpbGVuYW1lLCAwLCAyKSA9PSAiLi8iKQogICAgICAgICAgICB8fCAoc3Vic3RyKCRwX3JlbW92ZV9kaXIsIDAsIDIpID09ICIuLyIpKSB7CgogICAgICAgICAgaWYgKCAgIChzdWJzdHIoJHBfZmlsZW5hbWUsIDAsIDIpID09ICIuLyIpCiAgICAgICAgICAgICAgJiYgKHN1YnN0cigkcF9yZW1vdmVfZGlyLCAwLCAyKSAhPSAiLi8iKSkgewogICAgICAgICAgICAkcF9yZW1vdmVfZGlyID0gIi4vIi4kcF9yZW1vdmVfZGlyOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCAgIChzdWJzdHIoJHBfZmlsZW5hbWUsIDAsIDIpICE9ICIuLyIpCiAgICAgICAgICAgICAgJiYgKHN1YnN0cigkcF9yZW1vdmVfZGlyLCAwLCAyKSA9PSAiLi8iKSkgewogICAgICAgICAgICAkcF9yZW1vdmVfZGlyID0gc3Vic3RyKCRwX3JlbW92ZV9kaXIsIDIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHZfY29tcGFyZSA9IFBjbFppcFV0aWxQYXRoSW5jbHVzaW9uKCRwX3JlbW92ZV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSk7CiAgICAgICAgaWYgKCR2X2NvbXBhcmUgPiAwKSB7CiAgICAgICAgICBpZiAoJHZfY29tcGFyZSA9PSAyKSB7CiAgICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9ICIiOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICR2X3N0b3JlZF9maWxlbmFtZSA9IHN1YnN0cigkdl9zdG9yZWRfZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oJHBfcmVtb3ZlX2RpcikpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gUmVtb3ZlIGRyaXZlIGxldHRlciBpZiBhbnkKICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoJHZfc3RvcmVkX2ZpbGVuYW1lKTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHBhdGggdG8gYWRkCiAgICAgIGlmICgkcF9hZGRfZGlyICE9ICIiKSB7CiAgICAgICAgaWYgKHN1YnN0cigkcF9hZGRfZGlyLCAtMSkgPT0gIi8iKQogICAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfYWRkX2Rpci4kdl9zdG9yZWRfZmlsZW5hbWU7CiAgICAgICAgZWxzZQogICAgICAgICAgJHZfc3RvcmVkX2ZpbGVuYW1lID0gJHBfYWRkX2Rpci4iLyIuJHZfc3RvcmVkX2ZpbGVuYW1lOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gRmlsZW5hbWUgKHJlZHVjZSB0aGUgcGF0aCBvZiBzdG9yZWQgbmFtZSkKICAgICR2X3N0b3JlZF9maWxlbmFtZSA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCR2X3N0b3JlZF9maWxlbmFtZSk7CiAgICAkcF9maWxlZGVzY3JbJ3N0b3JlZF9maWxlbmFtZSddID0gJHZfc3RvcmVkX2ZpbGVuYW1lOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZXcml0ZUZpbGVIZWFkZXIoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZXcml0ZUZpbGVIZWFkZXIoJiRwX2hlYWRlcikKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBTdG9yZSB0aGUgb2Zmc2V0IHBvc2l0aW9uIG9mIHRoZSBmaWxlCiAgICAkcF9oZWFkZXJbJ29mZnNldCddID0gZnRlbGwoJHRoaXMtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gVHJhbnNmb3JtIFVOSVggbXRpbWUgdG8gRE9TIGZvcm1hdCBtZGF0ZS9tdGltZQogICAgJHZfZGF0ZSA9IGdldGRhdGUoJHBfaGVhZGVyWydtdGltZSddKTsKICAgICR2X210aW1lID0gKCR2X2RhdGVbJ2hvdXJzJ108PDExKSArICgkdl9kYXRlWydtaW51dGVzJ108PDUpICsgJHZfZGF0ZVsnc2Vjb25kcyddLzI7CiAgICAkdl9tZGF0ZSA9ICgoJHZfZGF0ZVsneWVhciddLTE5ODApPDw5KSArICgkdl9kYXRlWydtb24nXTw8NSkgKyAkdl9kYXRlWydtZGF5J107CgogICAgLy8gLS0tLS0gUGFja2VkIGRhdGEKICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygiVnZ2dnZ2VlZWdnYiLCAweDA0MDM0YjUwLAoJICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSwgJHBfaGVhZGVyWydmbGFnJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddLCAkdl9tdGltZSwgJHZfbWRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfaGVhZGVyWydjcmMnXSwgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSwKCQkJCQkJICAkcF9oZWFkZXJbJ3NpemUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSksCgkJCQkJCSAgJHBfaGVhZGVyWydleHRyYV9sZW4nXSk7CgogICAgLy8gLS0tLS0gV3JpdGUgdGhlIGZpcnN0IDE0OCBieXRlcyBvZiB0aGUgaGVhZGVyIGluIHRoZSBhcmNoaXZlCiAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkdl9iaW5hcnlfZGF0YSwgMzApOwoKICAgIC8vIC0tLS0tIFdyaXRlIHRoZSB2YXJpYWJsZSBmaWVsZHMKICAgIGlmIChzdHJsZW4oJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSkgIT0gMCkKICAgIHsKICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXSwgc3RybGVuKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pKTsKICAgIH0KICAgIGlmICgkcF9oZWFkZXJbJ2V4dHJhX2xlbiddICE9IDApCiAgICB7CiAgICAgIGZwdXRzKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnZXh0cmEnXSwgJHBfaGVhZGVyWydleHRyYV9sZW4nXSk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdldyaXRlQ2VudHJhbEZpbGVIZWFkZXIoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZXcml0ZUNlbnRyYWxGaWxlSGVhZGVyKCYkcF9oZWFkZXIpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gVEJDCiAgICAvL2ZvcihyZXNldCgkcF9oZWFkZXIpOyAka2V5ID0ga2V5KCRwX2hlYWRlcik7IG5leHQoJHBfaGVhZGVyKSkgewogICAgLy99CgogICAgLy8gLS0tLS0gVHJhbnNmb3JtIFVOSVggbXRpbWUgdG8gRE9TIGZvcm1hdCBtZGF0ZS9tdGltZQogICAgJHZfZGF0ZSA9IGdldGRhdGUoJHBfaGVhZGVyWydtdGltZSddKTsKICAgICR2X210aW1lID0gKCR2X2RhdGVbJ2hvdXJzJ108PDExKSArICgkdl9kYXRlWydtaW51dGVzJ108PDUpICsgJHZfZGF0ZVsnc2Vjb25kcyddLzI7CiAgICAkdl9tZGF0ZSA9ICgoJHZfZGF0ZVsneWVhciddLTE5ODApPDw5KSArICgkdl9kYXRlWydtb24nXTw8NSkgKyAkdl9kYXRlWydtZGF5J107CgoKICAgIC8vIC0tLS0tIFBhY2tlZCBkYXRhCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soIlZ2dnZ2dnZWVlZ2dnZ2dlZWIiwgMHgwMjAxNGI1MCwKCSAgICAgICAgICAgICAgICAgICAgICAkcF9oZWFkZXJbJ3ZlcnNpb24nXSwgJHBfaGVhZGVyWyd2ZXJzaW9uX2V4dHJhY3RlZCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsnZmxhZyddLCAkcF9oZWFkZXJbJ2NvbXByZXNzaW9uJ10sCgkJCQkJCSAgJHZfbXRpbWUsICR2X21kYXRlLCAkcF9oZWFkZXJbJ2NyYyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICRwX2hlYWRlclsnY29tcHJlc3NlZF9zaXplJ10sICRwX2hlYWRlclsnc2l6ZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSwKCQkJCQkJICAkcF9oZWFkZXJbJ2V4dHJhX2xlbiddLCAkcF9oZWFkZXJbJ2NvbW1lbnRfbGVuJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfaGVhZGVyWydkaXNrJ10sICRwX2hlYWRlclsnaW50ZXJuYWwnXSwKCQkJCQkJICAkcF9oZWFkZXJbJ2V4dGVybmFsJ10sICRwX2hlYWRlclsnb2Zmc2V0J10pOwoKICAgIC8vIC0tLS0tIFdyaXRlIHRoZSA0MiBieXRlcyBvZiB0aGUgaGVhZGVyIGluIHRoZSB6aXAgZmlsZQogICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHZfYmluYXJ5X2RhdGEsIDQ2KTsKCiAgICAvLyAtLS0tLSBXcml0ZSB0aGUgdmFyaWFibGUgZmllbGRzCiAgICBpZiAoc3RybGVuKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pICE9IDApCiAgICB7CiAgICAgIGZwdXRzKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10sIHN0cmxlbigkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSk7CiAgICB9CiAgICBpZiAoJHBfaGVhZGVyWydleHRyYV9sZW4nXSAhPSAwKQogICAgewogICAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2V4dHJhJ10sICRwX2hlYWRlclsnZXh0cmFfbGVuJ10pOwogICAgfQogICAgaWYgKCRwX2hlYWRlclsnY29tbWVudF9sZW4nXSAhPSAwKQogICAgewogICAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkcF9oZWFkZXJbJ2NvbW1lbnQnXSwgJHBfaGVhZGVyWydjb21tZW50X2xlbiddKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2V3JpdGVDZW50cmFsSGVhZGVyKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2V3JpdGVDZW50cmFsSGVhZGVyKCRwX25iX2VudHJpZXMsICRwX3NpemUsICRwX29mZnNldCwgJHBfY29tbWVudCkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBQYWNrZWQgZGF0YQogICAgJHZfYmluYXJ5X2RhdGEgPSBwYWNrKCJWdnZ2dlZWdiIsIDB4MDYwNTRiNTAsIDAsIDAsICRwX25iX2VudHJpZXMsCgkgICAgICAgICAgICAgICAgICAgICAgJHBfbmJfZW50cmllcywgJHBfc2l6ZSwKCQkJCQkJICAkcF9vZmZzZXQsIHN0cmxlbigkcF9jb21tZW50KSk7CgogICAgLy8gLS0tLS0gV3JpdGUgdGhlIDIyIGJ5dGVzIG9mIHRoZSBoZWFkZXIgaW4gdGhlIHppcCBmaWxlCiAgICBmcHV0cygkdGhpcy0+emlwX2ZkLCAkdl9iaW5hcnlfZGF0YSwgMjIpOwoKICAgIC8vIC0tLS0tIFdyaXRlIHRoZSB2YXJpYWJsZSBmaWVsZHMKICAgIGlmIChzdHJsZW4oJHBfY29tbWVudCkgIT0gMCkKICAgIHsKICAgICAgZnB1dHMoJHRoaXMtPnppcF9mZCwgJHBfY29tbWVudCwgc3RybGVuKCRwX2NvbW1lbnQpKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2TGlzdCgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkxpc3QoJiRwX2xpc3QpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gTWFnaWMgcXVvdGVzIHRyaWNrCiAgICAkdGhpcy0+cHJpdkRpc2FibGVNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICBpZiAoKCR0aGlzLT56aXBfZmQgPSBAZm9wZW4oJHRoaXMtPnppcG5hbWUsICdyYicpKSA9PSAwKQogICAgewogICAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIGFyY2hpdmUgXCcnLiR0aGlzLT56aXBuYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXIpKSAhPSAxKQogICAgewogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgQ2VudHJhbCBEaXIKICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CiAgICBpZiAoQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X2NlbnRyYWxfZGlyWydvZmZzZXQnXSkpCiAgICB7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfSU5WQUxJRF9BUkNISVZFX1pJUCwgJ0ludmFsaWQgYXJjaGl2ZSBzaXplJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCBlYWNoIGVudHJ5CiAgICBmb3IgKCRpPTA7ICRpPCR2X2NlbnRyYWxfZGlyWydlbnRyaWVzJ107ICRpKyspCiAgICB7CiAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyCiAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkQ2VudHJhbEZpbGVIZWFkZXIoJHZfaGVhZGVyKSkgIT0gMSkKICAgICAgewogICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgIH0KICAgICAgJHZfaGVhZGVyWydpbmRleCddID0gJGk7CgogICAgICAvLyAtLS0tLSBHZXQgdGhlIG9ubHkgaW50ZXJlc3RpbmcgYXR0cmlidXRlcwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyLCAkcF9saXN0WyRpXSk7CiAgICAgIHVuc2V0KCR2X2hlYWRlcik7CiAgICB9CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBmaWxlIGluZm9ybWF0aW9ucyBmcm9tIHRoZSBjZW50cmFsIGRpcmVjdG9yeQogIC8vICAgZW50cmllcyBhbmQgZXh0cmFjdCB0aGUgaW50ZXJlc3RpbmcgcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgZ2l2ZW4gYmFjay4KICAvLyAgIFRoZSByZXN1bHRpbmcgZmlsZSBpbmZvcyBhcmUgc2V0IGluIHRoZSBhcnJheSAkcF9pbmZvCiAgLy8gICAgICRwX2luZm9bJ2ZpbGVuYW1lJ10gOiBGaWxlbmFtZSB3aXRoIGZ1bGwgcGF0aC4gR2l2ZW4gYnkgdXNlciAoYWRkKSwKICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZCBpbiB0aGUgZmlsZXN5c3RlbSAoZXh0cmFjdCkuCiAgLy8gICAgICRwX2luZm9bJ3N0b3JlZF9maWxlbmFtZSddIDogU3RvcmVkIGZpbGVuYW1lIGluIHRoZSBhcmNoaXZlLgogIC8vICAgICAkcF9pbmZvWydzaXplJ10gPSBTaXplIG9mIHRoZSBmaWxlLgogIC8vICAgICAkcF9pbmZvWydjb21wcmVzc2VkX3NpemUnXSA9IENvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZmlsZS4KICAvLyAgICAgJHBfaW5mb1snbXRpbWUnXSA9IExhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGZpbGUuCiAgLy8gICAgICRwX2luZm9bJ2NvbW1lbnQnXSA9IENvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlLgogIC8vICAgICAkcF9pbmZvWydmb2xkZXInXSA9IHRydWUvZmFsc2UgOiBpbmRpY2F0ZXMgaWYgdGhlIGVudHJ5IGlzIGEgZm9sZGVyIG9yIG5vdC4KICAvLyAgICAgJHBfaW5mb1snc3RhdHVzJ10gPSBzdGF0dXMgb2YgdGhlIGFjdGlvbiBvbiB0aGUgZmlsZS4KICAvLyAgICAgJHBfaW5mb1snY3JjJ10gPSBDUkMgb2YgdGhlIGZpbGUgY29udGVudC4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2hlYWRlciwgJiRwX2luZm8pCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gR2V0IHRoZSBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzCiAgICAkdl90ZW1wX3BhdGggPSBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10pOwogICAgJHBfaW5mb1snZmlsZW5hbWUnXSA9ICR2X3RlbXBfcGF0aDsKICAgICR2X3RlbXBfcGF0aCA9IFBjbFppcFV0aWxQYXRoUmVkdWN0aW9uKCRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pOwogICAgJHBfaW5mb1snc3RvcmVkX2ZpbGVuYW1lJ10gPSAkdl90ZW1wX3BhdGg7CiAgICAkcF9pbmZvWydzaXplJ10gPSAkcF9oZWFkZXJbJ3NpemUnXTsKICAgICRwX2luZm9bJ2NvbXByZXNzZWRfc2l6ZSddID0gJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXTsKICAgICRwX2luZm9bJ210aW1lJ10gPSAkcF9oZWFkZXJbJ210aW1lJ107CiAgICAkcF9pbmZvWydjb21tZW50J10gPSAkcF9oZWFkZXJbJ2NvbW1lbnQnXTsKICAgICRwX2luZm9bJ2ZvbGRlciddID0gKCgkcF9oZWFkZXJbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApOwogICAgJHBfaW5mb1snaW5kZXgnXSA9ICRwX2hlYWRlclsnaW5kZXgnXTsKICAgICRwX2luZm9bJ3N0YXR1cyddID0gJHBfaGVhZGVyWydzdGF0dXMnXTsKICAgICRwX2luZm9bJ2NyYyddID0gJHBfaGVhZGVyWydjcmMnXTsKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RXh0cmFjdEJ5UnVsZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgRXh0cmFjdCBhIGZpbGUgb3IgZGlyZWN0b3J5IGRlcGVuZGluZyBvZiBydWxlcyAoYnkgaW5kZXgsIGJ5IG5hbWUsIC4uLikKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX2ZpbGVfbGlzdCA6IEFuIGFycmF5IHdoZXJlIHdpbGwgYmUgcGxhY2VkIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2gKICAvLyAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZCBmaWxlCiAgLy8gICAkcF9wYXRoIDogUGF0aCB0byBhZGQgd2hpbGUgd3JpdGluZyB0aGUgZXh0cmFjdGVkIGZpbGVzCiAgLy8gICAkcF9yZW1vdmVfcGF0aCA6IFBhdGggdG8gcmVtb3ZlIChmcm9tIHRoZSBmaWxlIG1lbW9yaXplZCBwYXRoKSB3aGlsZSB3cml0aW5nIHRoZQogIC8vICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWQgZmlsZXMuIElmIHRoZSBwYXRoIGRvZXMgbm90IG1hdGNoIHRoZSBmaWxlIHBhdGgsCiAgLy8gICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGlzIGV4dHJhY3RlZCB3aXRoIGl0cyBtZW1vcml6ZWQgcGF0aC4KICAvLyAgICAgICAgICAgICAgICAgICAgJHBfcmVtb3ZlX3BhdGggZG9lcyBub3QgYXBwbHkgdG8gJ2xpc3QnIG1vZGUuCiAgLy8gICAgICAgICAgICAgICAgICAgICRwX3BhdGggYW5kICRwX3JlbW92ZV9wYXRoIGFyZSBjb21tdWxhdGl2ZS4KICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIDEgb24gc3VjY2VzcywwIG9yIGxlc3Mgb24gZXJyb3IgKHNlZSBlcnJvciBjb2RlIGxpc3QpCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXh0cmFjdEJ5UnVsZSgmJHBfZmlsZV9saXN0LCAkcF9wYXRoLCAkcF9yZW1vdmVfcGF0aCwgJHBfcmVtb3ZlX2FsbF9wYXRoLCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBNYWdpYyBxdW90ZXMgdHJpY2sKICAgICR0aGlzLT5wcml2RGlzYWJsZU1hZ2ljUXVvdGVzKCk7CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIHBhdGgKICAgIGlmICggICAoJHBfcGF0aCA9PSAiIikKCSAgICB8fCAoICAgKHN1YnN0cigkcF9wYXRoLCAwLCAxKSAhPSAiLyIpCgkJICAgICYmIChzdWJzdHIoJHBfcGF0aCwgMCwgMykgIT0gIi4uLyIpCgkJCSYmIChzdWJzdHIoJHBfcGF0aCwxLDIpIT0iOi8iKSkpCiAgICAgICRwX3BhdGggPSAiLi8iLiRwX3BhdGg7CgogICAgLy8gLS0tLS0gUmVkdWNlIHRoZSBwYXRoIGxhc3QgKGFuZCBkdXBsaWNhdGVkKSAnLycKICAgIGlmICgoJHBfcGF0aCAhPSAiLi8iKSAmJiAoJHBfcGF0aCAhPSAiLyIpKQogICAgewogICAgICAvLyAtLS0tLSBMb29rIGZvciB0aGUgcGF0aCBlbmQgJy8nCiAgICAgIHdoaWxlIChzdWJzdHIoJHBfcGF0aCwgLTEpID09ICIvIikKICAgICAgewogICAgICAgICRwX3BhdGggPSBzdWJzdHIoJHBfcGF0aCwgMCwgc3RybGVuKCRwX3BhdGgpLTEpOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcGF0aCB0byByZW1vdmUgZm9ybWF0IChzaG91bGQgZW5kIGJ5IC8pCiAgICBpZiAoKCRwX3JlbW92ZV9wYXRoICE9ICIiKSAmJiAoc3Vic3RyKCRwX3JlbW92ZV9wYXRoLCAtMSkgIT0gJy8nKSkKICAgIHsKICAgICAgJHBfcmVtb3ZlX3BhdGggLj0gJy8nOwogICAgfQogICAgJHBfcmVtb3ZlX3BhdGhfc2l6ZSA9IHN0cmxlbigkcF9yZW1vdmVfcGF0aCk7CgogICAgLy8gLS0tLS0gT3BlbiB0aGUgemlwIGZpbGUKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZPcGVuRmQoJ3JiJykpICE9IDEpCiAgICB7CiAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGluZm9ybWF0aW9ucwogICAgJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gU3RhcnQgYXQgYmVnaW5uaW5nIG9mIENlbnRyYWwgRGlyCiAgICAkdl9wb3NfZW50cnkgPSAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J107CgogICAgLy8gLS0tLS0gUmVhZCBlYWNoIGVudHJ5CiAgICAkal9zdGFydCA9IDA7CiAgICBmb3IgKCRpPTAsICR2X25iX2V4dHJhY3RlZD0wOyAkaTwkdl9jZW50cmFsX2RpclsnZW50cmllcyddOyAkaSsrKQogICAgewoKICAgICAgLy8gLS0tLS0gUmVhZCBuZXh0IENlbnRyYWwgZGlyIGVudHJ5CiAgICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CiAgICAgIGlmIChAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfcG9zX2VudHJ5KSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAsICdJbnZhbGlkIGFyY2hpdmUgc2l6ZScpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBoZWFkZXIKICAgICAgJHZfaGVhZGVyID0gYXJyYXkoKTsKICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRDZW50cmFsRmlsZUhlYWRlcigkdl9oZWFkZXIpKSAhPSAxKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBpbmRleAogICAgICAkdl9oZWFkZXJbJ2luZGV4J10gPSAkaTsKCiAgICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBmaWxlIHBvc2l0aW9uCiAgICAgICR2X3Bvc19lbnRyeSA9IGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIHNwZWNpZmljIGV4dHJhY3QgcnVsZXMKICAgICAgJHZfZXh0cmFjdCA9IGZhbHNlOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdCBieSBuYW1lIHJ1bGUKICAgICAgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV0pKQogICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSAhPSAwKSkgewoKICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGZpbGVuYW1lIGlzIGluIHRoZSBsaXN0CiAgICAgICAgICBmb3IgKCRqPTA7ICgkajxzaXplb2YoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdKSkgJiYgKCEkdl9leHRyYWN0KTsgJGorKykgewoKICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBhIGRpcmVjdG9yeQogICAgICAgICAgICAgIGlmIChzdWJzdHIoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSwgLTEpID09ICIvIikgewoKICAgICAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZGlyZWN0b3J5IGlzIGluIHRoZSBmaWxlbmFtZSBwYXRoCiAgICAgICAgICAgICAgICAgIGlmICggICAoc3RybGVuKCR2X2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pID4gc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKQogICAgICAgICAgICAgICAgICAgICAgJiYgKHN1YnN0cigkdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddLCAwLCBzdHJsZW4oJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSkpID09ICRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAkdl9leHRyYWN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBhIGZpbGVuYW1lCiAgICAgICAgICAgICAgZWxzZWlmICgkdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID09ICRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pIHsKICAgICAgICAgICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGVyZWcgcnVsZQogICAgICAvLyBlcmVnKCkgaXMgZGVwcmVjYXRlZCB3aXRoIFBIUCA1LjMKICAgICAgLyoKICAgICAgZWxzZSBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9FUkVHXSkpCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfRVJFR10gIT0gIiIpKSB7CgogICAgICAgICAgaWYgKGVyZWcoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0VSRUddLCAkdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddKSkgewogICAgICAgICAgICAgICR2X2V4dHJhY3QgPSB0cnVlOwogICAgICAgICAgfQogICAgICB9CiAgICAgICovCgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IHByZWcgcnVsZQogICAgICBlbHNlIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX1BSRUddKSkKICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9QUkVHXSAhPSAiIikpIHsKCiAgICAgICAgICBpZiAocHJlZ19tYXRjaCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfUFJFR10sICR2X2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10pKSB7CiAgICAgICAgICAgICAgJHZfZXh0cmFjdCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgaW5kZXggcnVsZQogICAgICBlbHNlIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXSkpCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdICE9IDApKSB7CgogICAgICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgaW5kZXggaXMgaW4gdGhlIGxpc3QKICAgICAgICAgIGZvciAoJGo9JGpfc3RhcnQ7ICgkajxzaXplb2YoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXSkpICYmICghJHZfZXh0cmFjdCk7ICRqKyspIHsKCiAgICAgICAgICAgICAgaWYgKCgkaT49JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ3N0YXJ0J10pICYmICgkaTw9JHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXVskal1bJ2VuZCddKSkgewogICAgICAgICAgICAgICAgICAkdl9leHRyYWN0ID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCRpPj0kcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnZW5kJ10pIHsKICAgICAgICAgICAgICAgICAgJGpfc3RhcnQgPSAkaisxOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF1bJGpdWydzdGFydCddPiRpKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm8gcnVsZSwgd2hpY2ggbWVhbnMgZXh0cmFjdCBhbGwgdGhlIGFyY2hpdmUKICAgICAgZWxzZSB7CiAgICAgICAgICAkdl9leHRyYWN0ID0gdHJ1ZTsKICAgICAgfQoKCSAgLy8gLS0tLS0gQ2hlY2sgY29tcHJlc3Npb24gbWV0aG9kCgkgIGlmICggICAoJHZfZXh0cmFjdCkKCSAgICAgICYmICggICAoJHZfaGVhZGVyWydjb21wcmVzc2lvbiddICE9IDgpCgkJICAgICAgJiYgKCR2X2hlYWRlclsnY29tcHJlc3Npb24nXSAhPSAwKSkpIHsKICAgICAgICAgICR2X2hlYWRlclsnc3RhdHVzJ10gPSAndW5zdXBwb3J0ZWRfY29tcHJlc3Npb24nOwoKICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIFBDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUgogICAgICAgICAgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl0pKQoJCSAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl09PT10cnVlKSkgewoKICAgICAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKCiAgICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTiwKCQkJICAgICAgICAgICAgICAgICAgICAgICAiRmlsZW5hbWUgJyIuJHZfaGVhZGVyWydzdG9yZWRfZmlsZW5hbWUnXS4iJyBpcyAiCgkJCQkgIAkgICAgCSAgCSAgIC4iY29tcHJlc3NlZCBieSBhbiB1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiAiCgkJCQkgIAkgICAgCSAgCSAgIC4ibWV0aG9kICgiLiR2X2hlYWRlclsnY29tcHJlc3Npb24nXS4iKSAiKTsKCiAgICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CgkJICB9CgkgIH0KCgkgIC8vIC0tLS0tIENoZWNrIGVuY3J5cHRlZCBmaWxlcwoJICBpZiAoKCR2X2V4dHJhY3QpICYmICgoJHZfaGVhZGVyWydmbGFnJ10gJiAxKSA9PSAxKSkgewogICAgICAgICAgJHZfaGVhZGVyWydzdGF0dXMnXSA9ICd1bnN1cHBvcnRlZF9lbmNyeXB0aW9uJzsKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IKICAgICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkKCQkgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdPT09dHJ1ZSkpIHsKCiAgICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CgogICAgICAgICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfVU5TVVBQT1JURURfRU5DUllQVElPTiwKCQkJICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBmb3IgIgoJCQkJICAJICAgIAkgIAkgICAuIiBmaWxlbmFtZSAnIi4kdl9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddCgkJCQkJCQkJICAgLiInIik7CgogICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwoJCSAgfQogICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcmVhbCBleHRyYWN0aW9uCiAgICAgIGlmICgoJHZfZXh0cmFjdCkgJiYgKCR2X2hlYWRlclsnc3RhdHVzJ10gIT0gJ29rJykpIHsKICAgICAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXIsCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwX2ZpbGVfbGlzdFskdl9uYl9leHRyYWN0ZWQrK10pOwogICAgICAgICAgaWYgKCR2X3Jlc3VsdCAhPSAxKSB7CiAgICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgIH0KCiAgICAgICAgICAkdl9leHRyYWN0ID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIHJlYWwgZXh0cmFjdGlvbgogICAgICBpZiAoJHZfZXh0cmFjdCkKICAgICAgewoKICAgICAgICAvLyAtLS0tLSBHbyB0byB0aGUgZmlsZSBwb3NpdGlvbgogICAgICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CiAgICAgICAgaWYgKEBmc2VlaygkdGhpcy0+emlwX2ZkLCAkdl9oZWFkZXJbJ29mZnNldCddKSkKICAgICAgICB7CiAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9JTlZBTElEX0FSQ0hJVkVfWklQLCAnSW52YWxpZCBhcmNoaXZlIHNpemUnKTsKCiAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZXh0cmFjdGlvbiBhcyBzdHJpbmcKICAgICAgICBpZiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfQVNfU1RSSU5HXSkgewoKICAgICAgICAgICR2X3N0cmluZyA9ICcnOwoKICAgICAgICAgIC8vIC0tLS0tIEV4dHJhY3RpbmcgdGhlIGZpbGUKICAgICAgICAgICR2X3Jlc3VsdDEgPSAkdGhpcy0+cHJpdkV4dHJhY3RGaWxlQXNTdHJpbmcoJHZfaGVhZGVyLCAkdl9zdHJpbmcsICRwX29wdGlvbnMpOwogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPCAxKSB7CiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAkdGhpcy0+cHJpdlN3YXBCYWNrTWFnaWNRdW90ZXMoKTsKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDE7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gR2V0IHRoZSBvbmx5IGludGVyZXN0aW5nIGF0dHJpYnV0ZXMKICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlciwgJHBfZmlsZV9saXN0WyR2X25iX2V4dHJhY3RlZF0pKSAhPSAxKQogICAgICAgICAgewogICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBTZXQgdGhlIGZpbGUgY29udGVudAogICAgICAgICAgJHBfZmlsZV9saXN0WyR2X25iX2V4dHJhY3RlZF1bJ2NvbnRlbnQnXSA9ICR2X3N0cmluZzsKCiAgICAgICAgICAvLyAtLS0tLSBOZXh0IGV4dHJhY3RlZCBmaWxlCiAgICAgICAgICAkdl9uYl9leHRyYWN0ZWQrKzsKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2VyIGNhbGxiYWNrIGFib3J0CiAgICAgICAgICBpZiAoJHZfcmVzdWx0MSA9PSAyKSB7CiAgICAgICAgICAJYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3Rpb24gaW4gc3RhbmRhcmQgb3V0cHV0CiAgICAgICAgZWxzZWlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfSU5fT1VUUFVUXSkpCgkJICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfSU5fT1VUUFVUXSkpIHsKICAgICAgICAgIC8vIC0tLS0tIEV4dHJhY3RpbmcgdGhlIGZpbGUgaW4gc3RhbmRhcmQgb3V0cHV0CiAgICAgICAgICAkdl9yZXN1bHQxID0gJHRoaXMtPnByaXZFeHRyYWN0RmlsZUluT3V0cHV0KCR2X2hlYWRlciwgJHBfb3B0aW9ucyk7CiAgICAgICAgICBpZiAoJHZfcmVzdWx0MSA8IDEpIHsKICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwogICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0MTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIG9ubHkgaW50ZXJlc3RpbmcgYXR0cmlidXRlcwogICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHZfaGVhZGVyLCAkcF9maWxlX2xpc3RbJHZfbmJfZXh0cmFjdGVkKytdKSkgIT0gMSkgewogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdXNlciBjYWxsYmFjayBhYm9ydAogICAgICAgICAgaWYgKCR2X3Jlc3VsdDEgPT0gMikgewogICAgICAgICAgCWJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBub3JtYWwgZXh0cmFjdGlvbgogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gLS0tLS0gRXh0cmFjdGluZyB0aGUgZmlsZQogICAgICAgICAgJHZfcmVzdWx0MSA9ICR0aGlzLT5wcml2RXh0cmFjdEZpbGUoJHZfaGVhZGVyLAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBfcGF0aCwgJHBfcmVtb3ZlX3BhdGgsCgkJCQkJCQkJCQkJICAkcF9yZW1vdmVfYWxsX3BhdGgsCgkJCQkJCQkJCQkJICAkcF9vcHRpb25zKTsKICAgICAgICAgIGlmICgkdl9yZXN1bHQxIDwgMSkgewogICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgJHRoaXMtPnByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCk7CiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQxOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIEdldCB0aGUgb25seSBpbnRlcmVzdGluZyBhdHRyaWJ1dGVzCiAgICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkdl9oZWFkZXIsICRwX2ZpbGVfbGlzdFskdl9uYl9leHRyYWN0ZWQrK10pKSAhPSAxKQogICAgICAgICAgewogICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2VyIGNhbGxiYWNrIGFib3J0CiAgICAgICAgICBpZiAoJHZfcmVzdWx0MSA9PSAyKSB7CiAgICAgICAgICAJYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICR0aGlzLT5wcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZFeHRyYWN0RmlsZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vCiAgLy8gMSA6IC4uLiA/CiAgLy8gUENMWklQX0VSUl9VU0VSX0FCT1JURUQoMikgOiBVc2VyIGFzayBmb3IgZXh0cmFjdGlvbiBzdG9wIGluIGNhbGxiYWNrCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXh0cmFjdEZpbGUoJiRwX2VudHJ5LCAkcF9wYXRoLCAkcF9yZW1vdmVfcGF0aCwgJHBfcmVtb3ZlX2FsbF9wYXRoLCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGhlYWRlcgogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRGaWxlSGVhZGVyKCR2X2hlYWRlcikpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKCiAgICAvLyAtLS0tLSBDaGVjayB0aGF0IHRoZSBmaWxlIGhlYWRlciBpcyBjb2hlcmVudCB3aXRoICRwX2VudHJ5IGluZm8KICAgIGlmICgkdGhpcy0+cHJpdkNoZWNrRmlsZUhlYWRlcnMoJHZfaGVhZGVyLCAkcF9lbnRyeSkgIT0gMSkgewogICAgICAgIC8vIFRCQwogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGFsbCBwYXRoIHRvIHJlbW92ZQogICAgaWYgKCRwX3JlbW92ZV9hbGxfcGF0aCA9PSB0cnVlKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZm9sZGVyIGVudHJ5IHRoYXQgbm90IG5lZWQgdG8gYmUgZXh0cmFjdGVkCiAgICAgICAgaWYgKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkgewoKICAgICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gImZpbHRlcmVkIjsKCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBHZXQgdGhlIGJhc2VuYW1lIG9mIHRoZSBwYXRoCiAgICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSBiYXNlbmFtZSgkcF9lbnRyeVsnZmlsZW5hbWUnXSk7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcGF0aCB0byByZW1vdmUKICAgIGVsc2UgaWYgKCRwX3JlbW92ZV9wYXRoICE9ICIiKQogICAgewogICAgICBpZiAoUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oJHBfcmVtb3ZlX3BhdGgsICRwX2VudHJ5WydmaWxlbmFtZSddKSA9PSAyKQogICAgICB7CgogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAiZmlsdGVyZWQiOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICB9CgogICAgICAkcF9yZW1vdmVfcGF0aF9zaXplID0gc3RybGVuKCRwX3JlbW92ZV9wYXRoKTsKICAgICAgaWYgKHN1YnN0cigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgMCwgJHBfcmVtb3ZlX3BhdGhfc2l6ZSkgPT0gJHBfcmVtb3ZlX3BhdGgpCiAgICAgIHsKCiAgICAgICAgLy8gLS0tLS0gUmVtb3ZlIHRoZSBwYXRoCiAgICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSBzdWJzdHIoJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICRwX3JlbW92ZV9wYXRoX3NpemUpOwoKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIEFkZCB0aGUgcGF0aAogICAgaWYgKCRwX3BhdGggIT0gJycpIHsKICAgICAgJHBfZW50cnlbJ2ZpbGVuYW1lJ10gPSAkcF9wYXRoLiIvIi4kcF9lbnRyeVsnZmlsZW5hbWUnXTsKICAgIH0KCiAgICAvLyAtLS0tLSBDaGVjayBhIGJhc2VfZGlyX3Jlc3RyaWN0aW9uCiAgICBpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OXSkpIHsKICAgICAgJHZfaW5jbHVzaW9uCiAgICAgID0gUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0VYVFJBQ1RfRElSX1JFU1RSSUNUSU9OXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcF9lbnRyeVsnZmlsZW5hbWUnXSk7CiAgICAgIGlmICgkdl9pbmNsdXNpb24gPT0gMCkgewoKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0RJUkVDVE9SWV9SRVNUUklDVElPTiwKCQkJICAgICAgICAgICAgICAgICAgICAgIkZpbGVuYW1lICciLiRwX2VudHJ5WydmaWxlbmFtZSddLiInIGlzICIKCQkJCQkJCQkgLiJvdXRzaWRlIFBDTFpJUF9PUFRfRVhUUkFDVF9ESVJfUkVTVFJJQ1RJT04iKTsKCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBwcmUtZXh0cmFjdCBjYWxsYmFjawogICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9FWFRSQUNUXSkpIHsKCiAgICAgIC8vIC0tLS0tIEdlbmVyYXRlIGEgbG9jYWwgaW5mb3JtYXRpb24KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsKICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2VudHJ5LCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sKICAgICAgLy8gSGVyZSBJIGRvIG5vdCB1c2UgY2FsbF91c2VyX2Z1bmMoKSBiZWNhdXNlIEkgbmVlZCB0byBzZW5kIGEgcmVmZXJlbmNlIHRvIHRoZQogICAgICAvLyBoZWFkZXIuCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BSRV9FWFRSQUNUXShQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1QsICR2X2xvY2FsX2hlYWRlcik7CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMCkgewogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAic2tpcHBlZCI7CiAgICAgICAgJHZfcmVzdWx0ID0gMTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYWJvcnQgcmVzdWx0CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMikgewogICAgICAgIC8vIC0tLS0tIFRoaXMgc3RhdHVzIGlzIGludGVybmFsIGFuZCB3aWxsIGJlIGNoYW5nZWQgaW4gJ3NraXBwZWQnCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gImFib3J0ZWQiOwogICAgICAJJHZfcmVzdWx0ID0gUENMWklQX0VSUl9VU0VSX0FCT1JURUQ7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFVwZGF0ZSB0aGUgaW5mb3JtYXRpb25zCiAgICAgIC8vIE9ubHkgc29tZSBmaWVsZHMgY2FuIGJlIG1vZGlmaWVkCiAgICAgICRwX2VudHJ5WydmaWxlbmFtZSddID0gJHZfbG9jYWxfaGVhZGVyWydmaWxlbmFtZSddOwogICAgfQoKCiAgICAvLyAtLS0tLSBMb29rIGlmIGV4dHJhY3Rpb24gc2hvdWxkIGJlIGRvbmUKICAgIGlmICgkcF9lbnRyeVsnc3RhdHVzJ10gPT0gJ29rJykgewoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHNwZWNpZmljIGFjdGlvbnMgd2hpbGUgdGhlIGZpbGUgZXhpc3QKICAgIGlmIChmaWxlX2V4aXN0cygkcF9lbnRyeVsnZmlsZW5hbWUnXSkpCiAgICB7CgogICAgICAvLyAtLS0tLSBMb29rIGlmIGZpbGUgaXMgYSBkaXJlY3RvcnkKICAgICAgaWYgKGlzX2RpcigkcF9lbnRyeVsnZmlsZW5hbWUnXSkpCiAgICAgIHsKCiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJhbHJlYWR5X2FfZGlyZWN0b3J5IjsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgUENMWklQX09QVF9TVE9QX09OX0VSUk9SCiAgICAgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29uIGZpcnN0IFBjbFppcCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdG9wCiAgICAgICAgLy8gd2hlbiB0aGlzIGtpbmQgb2YgZXJyb3Igb2NjdXJzLgogICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkKCQkgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXT09PXRydWUpKSB7CgogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0FMUkVBRFlfQV9ESVJFQ1RPUlksCgkJCSAgICAgICAgICAgICAgICAgICAgICJGaWxlbmFtZSAnIi4kcF9lbnRyeVsnZmlsZW5hbWUnXS4iJyBpcyAiCgkJCQkJCQkJIC4iYWxyZWFkeSB1c2VkIGJ5IGFuIGV4aXN0aW5nIGRpcmVjdG9yeSIpOwoKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CgkJICAgIH0KICAgICAgfQogICAgICAvLyAtLS0tLSBMb29rIGlmIGZpbGUgaXMgd3JpdGUgcHJvdGVjdGVkCiAgICAgIGVsc2UgaWYgKCFpc193cml0ZWFibGUoJHBfZW50cnlbJ2ZpbGVuYW1lJ10pKQogICAgICB7CgogICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBzdGF0dXMKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAid3JpdGVfcHJvdGVjdGVkIjsKCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgUENMWklQX09QVF9TVE9QX09OX0VSUk9SCiAgICAgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29uIGZpcnN0IFBjbFppcCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdG9wCiAgICAgICAgLy8gd2hlbiB0aGlzIGtpbmQgb2YgZXJyb3Igb2NjdXJzLgogICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1JdKSkKCQkgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXT09PXRydWUpKSB7CgogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1dSSVRFX09QRU5fRkFJTCwKCQkJICAgICAgICAgICAgICAgICAgICAgIkZpbGVuYW1lICciLiRwX2VudHJ5WydmaWxlbmFtZSddLiInIGV4aXN0cyAiCgkJCQkJCQkJIC4iYW5kIGlzIHdyaXRlIHByb3RlY3RlZCIpOwoKICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CgkJICAgIH0KICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgZXh0cmFjdGVkIGZpbGUgaXMgb2xkZXIKICAgICAgZWxzZSBpZiAoZmlsZW10aW1lKCRwX2VudHJ5WydmaWxlbmFtZSddKSA+ICRwX2VudHJ5WydtdGltZSddKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1JFUExBQ0VfTkVXRVJdKSkKCQkgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9SRVBMQUNFX05FV0VSXT09PXRydWUpKSB7CgkgIAkgIH0KCQkgICAgZWxzZSB7CiAgICAgICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJuZXdlcl9leGlzdCI7CgogICAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBQQ0xaSVBfT1BUX1NUT1BfT05fRVJST1IKICAgICAgICAgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29uIGZpcnN0IFBjbFppcCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdG9wCiAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBraW5kIG9mIGVycm9yIG9jY3Vycy4KICAgICAgICAgICAgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfU1RPUF9PTl9FUlJPUl0pKQoJCSAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9TVE9QX09OX0VSUk9SXT09PXRydWUpKSB7CgogICAgICAgICAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwsCgkJCSAgICAgICAgICAgICAiTmV3ZXIgdmVyc2lvbiBvZiAnIi4kcF9lbnRyeVsnZmlsZW5hbWUnXS4iJyBleGlzdHMgIgoJCQkJCSAgICAuImFuZCBvcHRpb24gUENMWklQX09QVF9SRVBMQUNFX05FV0VSIGlzIG5vdCBzZWxlY3RlZCIpOwoKICAgICAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwoJCSAgICAgIH0KCQkgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGRpcmVjdG9yeSBhdmFpbGFiaWxpdHkgYW5kIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnkKICAgIGVsc2UgewogICAgICBpZiAoKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkgfHwgKHN1YnN0cigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgLTEpID09ICcvJykpCiAgICAgICAgJHZfZGlyX3RvX2NoZWNrID0gJHBfZW50cnlbJ2ZpbGVuYW1lJ107CiAgICAgIGVsc2UgaWYgKCFzdHJzdHIoJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICIvIikpCiAgICAgICAgJHZfZGlyX3RvX2NoZWNrID0gIiI7CiAgICAgIGVsc2UKICAgICAgICAkdl9kaXJfdG9fY2hlY2sgPSBkaXJuYW1lKCRwX2VudHJ5WydmaWxlbmFtZSddKTsKCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdkRpckNoZWNrKCR2X2Rpcl90b19jaGVjaywgKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkpKSAhPSAxKSB7CgogICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInBhdGhfY3JlYXRpb25fZmFpbCI7CgogICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAvL3JldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAkdl9yZXN1bHQgPSAxOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgZXh0cmFjdGlvbiBzaG91bGQgYmUgZG9uZQogICAgaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAnb2snKSB7CgogICAgICAvLyAtLS0tLSBEbyB0aGUgZXh0cmFjdGlvbiAoaWYgbm90IGEgZm9sZGVyKQogICAgICBpZiAoISgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm90IGNvbXByZXNzZWQgZmlsZQogICAgICAgIGlmICgkcF9lbnRyeVsnY29tcHJlc3Npb24nXSA9PSAwKSB7CgogICAgCQkgIC8vIC0tLS0tIE9wZW5pbmcgZGVzdGluYXRpb24gZmlsZQogICAgICAgICAgaWYgKCgkdl9kZXN0X2ZpbGUgPSBAZm9wZW4oJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICd3YicpKSA9PSAwKQogICAgICAgICAgewoKICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAid3JpdGVfZXJyb3IiOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICB9CgoKICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgYnkgUENMWklQX1JFQURfQkxPQ0tfU0laRSBvY3RldHMgYmxvY2tzCiAgICAgICAgICAkdl9zaXplID0gJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddOwogICAgICAgICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgICAgICAgIHsKICAgICAgICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgICAgICAgLyogVHJ5IHRvIHNwZWVkIHVwIHRoZSBjb2RlCiAgICAgICAgICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygnYScuJHZfcmVhZF9zaXplLCAkdl9idWZmZXIpOwogICAgICAgICAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfYmluYXJ5X2RhdGEsICR2X3JlYWRfc2l6ZSk7CiAgICAgICAgICAgICovCiAgICAgICAgICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIC0tLS0tIENsb3NpbmcgdGhlIGRlc3RpbmF0aW9uIGZpbGUKICAgICAgICAgIGZjbG9zZSgkdl9kZXN0X2ZpbGUpOwoKICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgZmlsZSBtdGltZQogICAgICAgICAgdG91Y2goJHBfZW50cnlbJ2ZpbGVuYW1lJ10sICRwX2VudHJ5WydtdGltZSddKTsKCgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8vIC0tLS0tIFRCQwogICAgICAgICAgLy8gTmVlZCB0byBiZSBmaW5pc2hlZAogICAgICAgICAgaWYgKCgkcF9lbnRyeVsnZmxhZyddICYgMSkgPT0gMSkgewogICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT04sICdGaWxlIFwnJy4kcF9lbnRyeVsnZmlsZW5hbWUnXS4nXCcgaXMgZW5jcnlwdGVkLiBFbmNyeXB0ZWQgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuJyk7CiAgICAgICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICAgICAgfQoKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciB1c2luZyB0ZW1wb3JhcnkgZmlsZSB0byB1bnppcAogICAgICAgICAgaWYgKCAoIWlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT0ZGXSkpCiAgICAgICAgICAgICAgJiYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfT05dKQogICAgICAgICAgICAgICAgICB8fCAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX1RFTVBfRklMRV9USFJFU0hPTERdKQogICAgICAgICAgICAgICAgICAgICAgJiYgKCRwX29wdGlvbnNbUENMWklQX09QVF9URU1QX0ZJTEVfVEhSRVNIT0xEXSA8PSAkcF9lbnRyeVsnc2l6ZSddKSkgKSApIHsKICAgICAgICAgICAgJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZFeHRyYWN0RmlsZVVzaW5nVGVtcEZpbGUoJHBfZW50cnksICRwX29wdGlvbnMpOwogICAgICAgICAgICBpZiAoJHZfcmVzdWx0IDwgUENMWklQX0VSUl9OT19FUlJPUikgewogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGluIG1lbW9yeQogICAgICAgICAgZWxzZSB7CgoKICAgICAgICAgICAgLy8gLS0tLS0gUmVhZCB0aGUgY29tcHJlc3NlZCBmaWxlIGluIGEgYnVmZmVyIChvbmUgc2hvdCkKICAgICAgICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXSk7CgogICAgICAgICAgICAvLyAtLS0tLSBEZWNvbXByZXNzIHRoZSBmaWxlCiAgICAgICAgICAgICR2X2ZpbGVfY29udGVudCA9IEBnemluZmxhdGUoJHZfYnVmZmVyKTsKICAgICAgICAgICAgdW5zZXQoJHZfYnVmZmVyKTsKICAgICAgICAgICAgaWYgKCR2X2ZpbGVfY29udGVudCA9PT0gRkFMU0UpIHsKCiAgICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICAgICAgIC8vIFRCQwogICAgICAgICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJlcnJvciI7CgogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIE9wZW5pbmcgZGVzdGluYXRpb24gZmlsZQogICAgICAgICAgICBpZiAoKCR2X2Rlc3RfZmlsZSA9IEBmb3BlbigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgJ3diJykpID09IDApIHsKCiAgICAgICAgICAgICAgLy8gLS0tLS0gQ2hhbmdlIHRoZSBmaWxlIHN0YXR1cwogICAgICAgICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJ3cml0ZV9lcnJvciI7CgogICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIFdyaXRlIHRoZSB1bmNvbXByZXNzZWQgZGF0YQogICAgICAgICAgICBAZndyaXRlKCR2X2Rlc3RfZmlsZSwgJHZfZmlsZV9jb250ZW50LCAkcF9lbnRyeVsnc2l6ZSddKTsKICAgICAgICAgICAgdW5zZXQoJHZfZmlsZV9jb250ZW50KTsKCiAgICAgICAgICAgIC8vIC0tLS0tIENsb3NpbmcgdGhlIGRlc3RpbmF0aW9uIGZpbGUKICAgICAgICAgICAgQGZjbG9zZSgkdl9kZXN0X2ZpbGUpOwoKICAgICAgICAgIH0KCiAgICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgbXRpbWUKICAgICAgICAgIEB0b3VjaCgkcF9lbnRyeVsnZmlsZW5hbWUnXSwgJHBfZW50cnlbJ210aW1lJ10pOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgY2htb2Qgb3B0aW9uCiAgICAgICAgaWYgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9TRVRfQ0hNT0RdKSkgewoKICAgICAgICAgIC8vIC0tLS0tIENoYW5nZSB0aGUgbW9kZSBvZiB0aGUgZmlsZQogICAgICAgICAgQGNobW9kKCRwX2VudHJ5WydmaWxlbmFtZSddLCAkcF9vcHRpb25zW1BDTFpJUF9PUFRfU0VUX0NITU9EXSk7CiAgICAgICAgfQoKICAgICAgfQogICAgfQoKICAJLy8gLS0tLS0gQ2hhbmdlIGFib3J0IHN0YXR1cwogIAlpZiAoJHBfZW50cnlbJ3N0YXR1cyddID09ICJhYm9ydGVkIikgewogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJza2lwcGVkIjsKICAJfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBvc3QtZXh0cmFjdCBjYWxsYmFjawogICAgZWxzZWlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0VYVFJBQ1RdKSkgewoKICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbgogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfZW50cnksICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXShQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYWJvcnQgcmVzdWx0CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMikgewogICAgICAJJHZfcmVzdWx0ID0gUENMWklQX0VSUl9VU0VSX0FCT1JURUQ7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2RXh0cmFjdEZpbGVVc2luZ1RlbXBGaWxlKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXh0cmFjdEZpbGVVc2luZ1RlbXBGaWxlKCYkcF9lbnRyeSwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gQ3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlCiAgICAkdl9nemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicuZ3onOwogICAgaWYgKCgkdl9kZXN0X2ZpbGUgPSBAZm9wZW4oJHZfZ3ppcF90ZW1wX25hbWUsICJ3YiIpKSA9PSAwKSB7CiAgICAgIGZjbG9zZSgkdl9maWxlKTsKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9XUklURV9PUEVOX0ZBSUwsICdVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgZmlsZSBcJycuJHZfZ3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSB3cml0ZSBtb2RlJyk7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKCiAgICAvLyAtLS0tLSBXcml0ZSBneiBmaWxlIGZvcm1hdCBoZWFkZXIKICAgICR2X2JpbmFyeV9kYXRhID0gcGFjaygndmExYTFWYTFhMScsIDB4OGIxZiwgQ2hyKCRwX2VudHJ5Wydjb21wcmVzc2lvbiddKSwgQ2hyKDB4MDApLCB0aW1lKCksIENocigweDAwKSwgQ2hyKDMpKTsKICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9iaW5hcnlfZGF0YSwgMTApOwoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgYnkgUENMWklQX1JFQURfQkxPQ0tfU0laRSBvY3RldHMgYmxvY2tzCiAgICAkdl9zaXplID0gJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgLy8kdl9iaW5hcnlfZGF0YSA9IHBhY2soJ2EnLiR2X3JlYWRfc2l6ZSwgJHZfYnVmZmVyKTsKICAgICAgQGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CgogICAgLy8gLS0tLS0gV3JpdGUgZ3ogZmlsZSBmb3JtYXQgZm9vdGVyCiAgICAkdl9iaW5hcnlfZGF0YSA9IHBhY2soJ1ZWJywgJHBfZW50cnlbJ2NyYyddLCAkcF9lbnRyeVsnc2l6ZSddKTsKICAgIEBmd3JpdGUoJHZfZGVzdF9maWxlLCAkdl9iaW5hcnlfZGF0YSwgOCk7CgogICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICBAZmNsb3NlKCR2X2Rlc3RfZmlsZSk7CgogICAgLy8gLS0tLS0gT3BlbmluZyBkZXN0aW5hdGlvbiBmaWxlCiAgICBpZiAoKCR2X2Rlc3RfZmlsZSA9IEBmb3BlbigkcF9lbnRyeVsnZmlsZW5hbWUnXSwgJ3diJykpID09IDApIHsKICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gIndyaXRlX2Vycm9yIjsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB0ZW1wb3JhcnkgZ3ogZmlsZQogICAgaWYgKCgkdl9zcmNfZmlsZSA9IEBnem9wZW4oJHZfZ3ppcF90ZW1wX25hbWUsICdyYicpKSA9PSAwKSB7CiAgICAgIEBmY2xvc2UoJHZfZGVzdF9maWxlKTsKICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInJlYWRfZXJyb3IiOwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X2d6aXBfdGVtcF9uYW1lLidcJyBpbiBiaW5hcnkgcmVhZCBtb2RlJyk7CiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaWxlIGJ5IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgb2N0ZXRzIGJsb2NrcwogICAgJHZfc2l6ZSA9ICRwX2VudHJ5WydzaXplJ107CiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKSB7CiAgICAgICR2X3JlYWRfc2l6ZSA9ICgkdl9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICR2X3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgJHZfYnVmZmVyID0gQGd6cmVhZCgkdl9zcmNfZmlsZSwgJHZfcmVhZF9zaXplKTsKICAgICAgLy8kdl9iaW5hcnlfZGF0YSA9IHBhY2soJ2EnLiR2X3JlYWRfc2l6ZSwgJHZfYnVmZmVyKTsKICAgICAgQGZ3cml0ZSgkdl9kZXN0X2ZpbGUsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CiAgICBAZmNsb3NlKCR2X2Rlc3RfZmlsZSk7CiAgICBAZ3pjbG9zZSgkdl9zcmNfZmlsZSk7CgogICAgLy8gLS0tLS0gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgQHVubGluaygkdl9nemlwX3RlbXBfbmFtZSk7CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkV4dHJhY3RGaWxlSW5PdXRwdXQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZFeHRyYWN0RmlsZUluT3V0cHV0KCYkcF9lbnRyeSwgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBoZWFkZXIKICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkRmlsZUhlYWRlcigkdl9oZWFkZXIpKSAhPSAxKSB7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgoKICAgIC8vIC0tLS0tIENoZWNrIHRoYXQgdGhlIGZpbGUgaGVhZGVyIGlzIGNvaGVyZW50IHdpdGggJHBfZW50cnkgaW5mbwogICAgaWYgKCR0aGlzLT5wcml2Q2hlY2tGaWxlSGVhZGVycygkdl9oZWFkZXIsICRwX2VudHJ5KSAhPSAxKSB7CiAgICAgICAgLy8gVEJDCiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcHJlLWV4dHJhY3QgY2FsbGJhY2sKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9lbnRyeSwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGNhbGxiYWNrCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUKICAgICAgLy8gaGVhZGVyLgovLyAgICAgIGV2YWwoJyR2X3Jlc3VsdCA9ICcuJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUFJFX0VYVFJBQ1RdLicoUENMWklQX0NCX1BSRV9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOycpOwogICAgICAkdl9yZXN1bHQgPSAkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0oUENMWklQX0NCX1BSRV9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOwogICAgICBpZiAoJHZfcmVzdWx0ID09IDApIHsKICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOwogICAgICAgICR2X3Jlc3VsdCA9IDE7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdAogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsKICAgICAgICAvLyAtLS0tLSBUaGlzIHN0YXR1cyBpcyBpbnRlcm5hbCBhbmQgd2lsbCBiZSBjaGFuZ2VkIGluICdza2lwcGVkJwogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJhYm9ydGVkIjsKICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOwogICAgICB9CgogICAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGluZm9ybWF0aW9ucwogICAgICAvLyBPbmx5IHNvbWUgZmllbGRzIGNhbiBiZSBtb2RpZmllZAogICAgICAkcF9lbnRyeVsnZmlsZW5hbWUnXSA9ICR2X2xvY2FsX2hlYWRlclsnZmlsZW5hbWUnXTsKICAgIH0KCiAgICAvLyAtLS0tLSBUcmFjZQoKICAgIC8vIC0tLS0tIExvb2sgaWYgZXh0cmFjdGlvbiBzaG91bGQgYmUgZG9uZQogICAgaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAnb2snKSB7CgogICAgICAvLyAtLS0tLSBEbyB0aGUgZXh0cmFjdGlvbiAoaWYgbm90IGEgZm9sZGVyKQogICAgICBpZiAoISgoJHBfZW50cnlbJ2V4dGVybmFsJ10mMHgwMDAwMDAxMCk9PTB4MDAwMDAwMTApKSB7CiAgICAgICAgLy8gLS0tLS0gTG9vayBmb3Igbm90IGNvbXByZXNzZWQgZmlsZQogICAgICAgIGlmICgkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10gPT0gJHBfZW50cnlbJ3NpemUnXSkgewoKICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaW4gYSBidWZmZXIgKG9uZSBzaG90KQogICAgICAgICAgJHZfYnVmZmVyID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2VudHJ5Wydjb21wcmVzc2VkX3NpemUnXSk7CgogICAgICAgICAgLy8gLS0tLS0gU2VuZCB0aGUgZmlsZSB0byB0aGUgb3V0cHV0CiAgICAgICAgICBlY2hvICR2X2J1ZmZlcjsKICAgICAgICAgIHVuc2V0KCR2X2J1ZmZlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNvbXByZXNzZWQgZmlsZSBpbiBhIGJ1ZmZlciAob25lIHNob3QpCiAgICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddKTsKCiAgICAgICAgICAvLyAtLS0tLSBEZWNvbXByZXNzIHRoZSBmaWxlCiAgICAgICAgICAkdl9maWxlX2NvbnRlbnQgPSBnemluZmxhdGUoJHZfYnVmZmVyKTsKICAgICAgICAgIHVuc2V0KCR2X2J1ZmZlcik7CgogICAgICAgICAgLy8gLS0tLS0gU2VuZCB0aGUgZmlsZSB0byB0aGUgb3V0cHV0CiAgICAgICAgICBlY2hvICR2X2ZpbGVfY29udGVudDsKICAgICAgICAgIHVuc2V0KCR2X2ZpbGVfY29udGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgoJLy8gLS0tLS0gQ2hhbmdlIGFib3J0IHN0YXR1cwoJaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAiYWJvcnRlZCIpIHsKICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOwoJfQoKICAgIC8vIC0tLS0tIExvb2sgZm9yIHBvc3QtZXh0cmFjdCBjYWxsYmFjawogICAgZWxzZWlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QT1NUX0VYVFJBQ1RdKSkgewoKICAgICAgLy8gLS0tLS0gR2VuZXJhdGUgYSBsb2NhbCBpbmZvcm1hdGlvbgogICAgICAkdl9sb2NhbF9oZWFkZXIgPSBhcnJheSgpOwogICAgICAkdGhpcy0+cHJpdkNvbnZlcnRIZWFkZXIyRmlsZUluZm8oJHBfZW50cnksICR2X2xvY2FsX2hlYWRlcik7CgogICAgICAvLyAtLS0tLSBDYWxsIHRoZSBjYWxsYmFjawogICAgICAvLyBIZXJlIEkgZG8gbm90IHVzZSBjYWxsX3VzZXJfZnVuYygpIGJlY2F1c2UgSSBuZWVkIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gdGhlCiAgICAgIC8vIGhlYWRlci4KICAgICAgJHZfcmVzdWx0ID0gJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXShQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYWJvcnQgcmVzdWx0CiAgICAgIGlmICgkdl9yZXN1bHQgPT0gMikgewogICAgICAJJHZfcmVzdWx0ID0gUENMWklQX0VSUl9VU0VSX0FCT1JURUQ7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkV4dHJhY3RGaWxlQXNTdHJpbmcoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZFeHRyYWN0RmlsZUFzU3RyaW5nKCYkcF9lbnRyeSwgJiRwX3N0cmluZywgJiRwX29wdGlvbnMpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgZmlsZSBoZWFkZXIKICAgICR2X2hlYWRlciA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEZpbGVIZWFkZXIoJHZfaGVhZGVyKSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgoKICAgIC8vIC0tLS0tIENoZWNrIHRoYXQgdGhlIGZpbGUgaGVhZGVyIGlzIGNvaGVyZW50IHdpdGggJHBfZW50cnkgaW5mbwogICAgaWYgKCR0aGlzLT5wcml2Q2hlY2tGaWxlSGVhZGVycygkdl9oZWFkZXIsICRwX2VudHJ5KSAhPSAxKSB7CiAgICAgICAgLy8gVEJDCiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcHJlLWV4dHJhY3QgY2FsbGJhY2sKICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0pKSB7CgogICAgICAvLyAtLS0tLSBHZW5lcmF0ZSBhIGxvY2FsIGluZm9ybWF0aW9uCiAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICR0aGlzLT5wcml2Q29udmVydEhlYWRlcjJGaWxlSW5mbygkcF9lbnRyeSwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIENhbGwgdGhlIGNhbGxiYWNrCiAgICAgIC8vIEhlcmUgSSBkbyBub3QgdXNlIGNhbGxfdXNlcl9mdW5jKCkgYmVjYXVzZSBJIG5lZWQgdG8gc2VuZCBhIHJlZmVyZW5jZSB0byB0aGUKICAgICAgLy8gaGVhZGVyLgogICAgICAkdl9yZXN1bHQgPSAkcF9vcHRpb25zW1BDTFpJUF9DQl9QUkVfRVhUUkFDVF0oUENMWklQX0NCX1BSRV9FWFRSQUNULCAkdl9sb2NhbF9oZWFkZXIpOwogICAgICBpZiAoJHZfcmVzdWx0ID09IDApIHsKICAgICAgICAvLyAtLS0tLSBDaGFuZ2UgdGhlIGZpbGUgc3RhdHVzCiAgICAgICAgJHBfZW50cnlbJ3N0YXR1cyddID0gInNraXBwZWQiOwogICAgICAgICR2X3Jlc3VsdCA9IDE7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdAogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsKICAgICAgICAvLyAtLS0tLSBUaGlzIHN0YXR1cyBpcyBpbnRlcm5hbCBhbmQgd2lsbCBiZSBjaGFuZ2VkIGluICdza2lwcGVkJwogICAgICAgICRwX2VudHJ5WydzdGF0dXMnXSA9ICJhYm9ydGVkIjsKICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOwogICAgICB9CgogICAgICAvLyAtLS0tLSBVcGRhdGUgdGhlIGluZm9ybWF0aW9ucwogICAgICAvLyBPbmx5IHNvbWUgZmllbGRzIGNhbiBiZSBtb2RpZmllZAogICAgICAkcF9lbnRyeVsnZmlsZW5hbWUnXSA9ICR2X2xvY2FsX2hlYWRlclsnZmlsZW5hbWUnXTsKICAgIH0KCgogICAgLy8gLS0tLS0gTG9vayBpZiBleHRyYWN0aW9uIHNob3VsZCBiZSBkb25lCiAgICBpZiAoJHBfZW50cnlbJ3N0YXR1cyddID09ICdvaycpIHsKCiAgICAgIC8vIC0tLS0tIERvIHRoZSBleHRyYWN0aW9uIChpZiBub3QgYSBmb2xkZXIpCiAgICAgIGlmICghKCgkcF9lbnRyeVsnZXh0ZXJuYWwnXSYweDAwMDAwMDEwKT09MHgwMDAwMDAxMCkpIHsKICAgICAgICAvLyAtLS0tLSBMb29rIGZvciBub3QgY29tcHJlc3NlZCBmaWxlCiAgLy8gICAgICBpZiAoJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddID09ICRwX2VudHJ5WydzaXplJ10pCiAgICAgICAgaWYgKCRwX2VudHJ5Wydjb21wcmVzc2lvbiddID09IDApIHsKCiAgICAgICAgICAvLyAtLS0tLSBSZWFkaW5nIHRoZSBmaWxlCiAgICAgICAgICAkcF9zdHJpbmcgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgJHBfZW50cnlbJ2NvbXByZXNzZWRfc2l6ZSddKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgLy8gLS0tLS0gUmVhZGluZyB0aGUgZmlsZQogICAgICAgICAgJHZfZGF0YSA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkcF9lbnRyeVsnY29tcHJlc3NlZF9zaXplJ10pOwoKICAgICAgICAgIC8vIC0tLS0tIERlY29tcHJlc3MgdGhlIGZpbGUKICAgICAgICAgIGlmICgoJHBfc3RyaW5nID0gQGd6aW5mbGF0ZSgkdl9kYXRhKSkgPT09IEZBTFNFKSB7CiAgICAgICAgICAgICAgLy8gVEJDCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBUcmFjZQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgICAgLy8gVEJDIDogZXJyb3IgOiBjYW4gbm90IGV4dHJhY3QgYSBmb2xkZXIgaW4gYSBzdHJpbmcKICAgICAgfQoKICAgIH0KCiAgCS8vIC0tLS0tIENoYW5nZSBhYm9ydCBzdGF0dXMKICAJaWYgKCRwX2VudHJ5WydzdGF0dXMnXSA9PSAiYWJvcnRlZCIpIHsKICAgICAgICAkcF9lbnRyeVsnc3RhdHVzJ10gPSAic2tpcHBlZCI7CiAgCX0KCiAgICAvLyAtLS0tLSBMb29rIGZvciBwb3N0LWV4dHJhY3QgY2FsbGJhY2sKICAgIGVsc2VpZiAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfQ0JfUE9TVF9FWFRSQUNUXSkpIHsKCiAgICAgIC8vIC0tLS0tIEdlbmVyYXRlIGEgbG9jYWwgaW5mb3JtYXRpb24KICAgICAgJHZfbG9jYWxfaGVhZGVyID0gYXJyYXkoKTsKICAgICAgJHRoaXMtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCRwX2VudHJ5LCAkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgLy8gLS0tLS0gU3dhcCB0aGUgY29udGVudCB0byBoZWFkZXIKICAgICAgJHZfbG9jYWxfaGVhZGVyWydjb250ZW50J10gPSAkcF9zdHJpbmc7CiAgICAgICRwX3N0cmluZyA9ICcnOwoKICAgICAgLy8gLS0tLS0gQ2FsbCB0aGUgY2FsbGJhY2sKICAgICAgLy8gSGVyZSBJIGRvIG5vdCB1c2UgY2FsbF91c2VyX2Z1bmMoKSBiZWNhdXNlIEkgbmVlZCB0byBzZW5kIGEgcmVmZXJlbmNlIHRvIHRoZQogICAgICAvLyBoZWFkZXIuCiAgICAgICR2X3Jlc3VsdCA9ICRwX29wdGlvbnNbUENMWklQX0NCX1BPU1RfRVhUUkFDVF0oUENMWklQX0NCX1BPU1RfRVhUUkFDVCwgJHZfbG9jYWxfaGVhZGVyKTsKCiAgICAgIC8vIC0tLS0tIFN3YXAgYmFjayB0aGUgY29udGVudCB0byBoZWFkZXIKICAgICAgJHBfc3RyaW5nID0gJHZfbG9jYWxfaGVhZGVyWydjb250ZW50J107CiAgICAgIHVuc2V0KCR2X2xvY2FsX2hlYWRlclsnY29udGVudCddKTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGFib3J0IHJlc3VsdAogICAgICBpZiAoJHZfcmVzdWx0ID09IDIpIHsKICAgICAgCSR2X3Jlc3VsdCA9IFBDTFpJUF9FUlJfVVNFUl9BQk9SVEVEOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdlJlYWRGaWxlSGVhZGVyKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2UmVhZEZpbGVIZWFkZXIoJiRwX2hlYWRlcikKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSA0IGJ5dGVzIHNpZ25hdHVyZQogICAgJHZfYmluYXJ5X2RhdGEgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgNCk7CiAgICAkdl9kYXRhID0gdW5wYWNrKCdWaWQnLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gQ2hlY2sgc2lnbmF0dXJlCiAgICBpZiAoJHZfZGF0YVsnaWQnXSAhPSAweDA0MDM0YjUwKQogICAgewoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ0ludmFsaWQgYXJjaGl2ZSBzdHJ1Y3R1cmUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaXJzdCA0MiBieXRlcyBvZiB0aGUgaGVhZGVyCiAgICAkdl9iaW5hcnlfZGF0YSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsIDI2KTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBpbnZhbGlkIGJsb2NrIHNpemUKICAgIGlmIChzdHJsZW4oJHZfYmluYXJ5X2RhdGEpICE9IDI2KQogICAgewogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSAiIjsKICAgICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICJpbnZhbGlkX2hlYWRlciI7CgogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAiSW52YWxpZCBibG9jayBzaXplIDogIi5zdHJsZW4oJHZfYmluYXJ5X2RhdGEpKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSB2YWx1ZXMKICAgICR2X2RhdGEgPSB1bnBhY2soJ3Z2ZXJzaW9uL3ZmbGFnL3Zjb21wcmVzc2lvbi92bXRpbWUvdm1kYXRlL1ZjcmMvVmNvbXByZXNzZWRfc2l6ZS9Wc2l6ZS92ZmlsZW5hbWVfbGVuL3ZleHRyYV9sZW4nLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gR2V0IGZpbGVuYW1lCiAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9kYXRhWydmaWxlbmFtZV9sZW4nXSk7CgogICAgLy8gLS0tLS0gR2V0IGV4dHJhX2ZpZWxkcwogICAgaWYgKCR2X2RhdGFbJ2V4dHJhX2xlbiddICE9IDApIHsKICAgICAgJHBfaGVhZGVyWydleHRyYSddID0gZnJlYWQoJHRoaXMtPnppcF9mZCwgJHZfZGF0YVsnZXh0cmFfbGVuJ10pOwogICAgfQogICAgZWxzZSB7CiAgICAgICRwX2hlYWRlclsnZXh0cmEnXSA9ICcnOwogICAgfQoKICAgIC8vIC0tLS0tIEV4dHJhY3QgcHJvcGVydGllcwogICAgJHBfaGVhZGVyWyd2ZXJzaW9uX2V4dHJhY3RlZCddID0gJHZfZGF0YVsndmVyc2lvbiddOwogICAgJHBfaGVhZGVyWydjb21wcmVzc2lvbiddID0gJHZfZGF0YVsnY29tcHJlc3Npb24nXTsKICAgICRwX2hlYWRlclsnc2l6ZSddID0gJHZfZGF0YVsnc2l6ZSddOwogICAgJHBfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9ICR2X2RhdGFbJ2NvbXByZXNzZWRfc2l6ZSddOwogICAgJHBfaGVhZGVyWydjcmMnXSA9ICR2X2RhdGFbJ2NyYyddOwogICAgJHBfaGVhZGVyWydmbGFnJ10gPSAkdl9kYXRhWydmbGFnJ107CiAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lX2xlbiddID0gJHZfZGF0YVsnZmlsZW5hbWVfbGVuJ107CgogICAgLy8gLS0tLS0gUmVjdXBlcmF0ZSBkYXRlIGluIFVOSVggZm9ybWF0CiAgICAkcF9oZWFkZXJbJ21kYXRlJ10gPSAkdl9kYXRhWydtZGF0ZSddOwogICAgJHBfaGVhZGVyWydtdGltZSddID0gJHZfZGF0YVsnbXRpbWUnXTsKICAgIGlmICgkcF9oZWFkZXJbJ21kYXRlJ10gJiYgJHBfaGVhZGVyWydtdGltZSddKQogICAgewogICAgICAvLyAtLS0tLSBFeHRyYWN0IHRpbWUKICAgICAgJHZfaG91ciA9ICgkcF9oZWFkZXJbJ210aW1lJ10gJiAweEY4MDApID4+IDExOwogICAgICAkdl9taW51dGUgPSAoJHBfaGVhZGVyWydtdGltZSddICYgMHgwN0UwKSA+PiA1OwogICAgICAkdl9zZWNvbmRlID0gKCRwX2hlYWRlclsnbXRpbWUnXSAmIDB4MDAxRikqMjsKCiAgICAgIC8vIC0tLS0tIEV4dHJhY3QgZGF0ZQogICAgICAkdl95ZWFyID0gKCgkcF9oZWFkZXJbJ21kYXRlJ10gJiAweEZFMDApID4+IDkpICsgMTk4MDsKICAgICAgJHZfbW9udGggPSAoJHBfaGVhZGVyWydtZGF0ZSddICYgMHgwMUUwKSA+PiA1OwogICAgICAkdl9kYXkgPSAkcF9oZWFkZXJbJ21kYXRlJ10gJiAweDAwMUY7CgogICAgICAvLyAtLS0tLSBHZXQgVU5JWCBkYXRlIGZvcm1hdAogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSBAbWt0aW1lKCR2X2hvdXIsICR2X21pbnV0ZSwgJHZfc2Vjb25kZSwgJHZfbW9udGgsICR2X2RheSwgJHZfeWVhcik7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAkcF9oZWFkZXJbJ210aW1lJ10gPSB0aW1lKCk7CiAgICB9CgogICAgLy8gVEJDCiAgICAvL2ZvcihyZXNldCgkdl9kYXRhKTsgJGtleSA9IGtleSgkdl9kYXRhKTsgbmV4dCgkdl9kYXRhKSkgewogICAgLy99CgogICAgLy8gLS0tLS0gU2V0IHRoZSBzdG9yZWQgZmlsZW5hbWUKICAgICRwX2hlYWRlclsnc3RvcmVkX2ZpbGVuYW1lJ10gPSAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ107CgogICAgLy8gLS0tLS0gU2V0IHRoZSBzdGF0dXMgZmllbGQKICAgICRwX2hlYWRlclsnc3RhdHVzJ10gPSAib2siOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZSZWFkQ2VudHJhbEZpbGVIZWFkZXIoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZSZWFkQ2VudHJhbEZpbGVIZWFkZXIoJiRwX2hlYWRlcikKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBSZWFkIHRoZSA0IGJ5dGVzIHNpZ25hdHVyZQogICAgJHZfYmluYXJ5X2RhdGEgPSBAZnJlYWQoJHRoaXMtPnppcF9mZCwgNCk7CiAgICAkdl9kYXRhID0gdW5wYWNrKCdWaWQnLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gQ2hlY2sgc2lnbmF0dXJlCiAgICBpZiAoJHZfZGF0YVsnaWQnXSAhPSAweDAyMDE0YjUwKQogICAgewoKICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ0ludmFsaWQgYXJjaGl2ZSBzdHJ1Y3R1cmUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBmaXJzdCA0MiBieXRlcyBvZiB0aGUgaGVhZGVyCiAgICAkdl9iaW5hcnlfZGF0YSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsIDQyKTsKCiAgICAvLyAtLS0tLSBMb29rIGZvciBpbnZhbGlkIGJsb2NrIHNpemUKICAgIGlmIChzdHJsZW4oJHZfYmluYXJ5X2RhdGEpICE9IDQyKQogICAgewogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSAiIjsKICAgICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICJpbnZhbGlkX2hlYWRlciI7CgogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAiSW52YWxpZCBibG9jayBzaXplIDogIi5zdHJsZW4oJHZfYmluYXJ5X2RhdGEpKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBFeHRyYWN0IHRoZSB2YWx1ZXMKICAgICRwX2hlYWRlciA9IHVucGFjaygndnZlcnNpb24vdnZlcnNpb25fZXh0cmFjdGVkL3ZmbGFnL3Zjb21wcmVzc2lvbi92bXRpbWUvdm1kYXRlL1ZjcmMvVmNvbXByZXNzZWRfc2l6ZS9Wc2l6ZS92ZmlsZW5hbWVfbGVuL3ZleHRyYV9sZW4vdmNvbW1lbnRfbGVuL3ZkaXNrL3ZpbnRlcm5hbC9WZXh0ZXJuYWwvVm9mZnNldCcsICR2X2JpbmFyeV9kYXRhKTsKCiAgICAvLyAtLS0tLSBHZXQgZmlsZW5hbWUKICAgIGlmICgkcF9oZWFkZXJbJ2ZpbGVuYW1lX2xlbiddICE9IDApCiAgICAgICRwX2hlYWRlclsnZmlsZW5hbWUnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnZmlsZW5hbWVfbGVuJ10pOwogICAgZWxzZQogICAgICAkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10gPSAnJzsKCiAgICAvLyAtLS0tLSBHZXQgZXh0cmEKICAgIGlmICgkcF9oZWFkZXJbJ2V4dHJhX2xlbiddICE9IDApCiAgICAgICRwX2hlYWRlclsnZXh0cmEnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnZXh0cmFfbGVuJ10pOwogICAgZWxzZQogICAgICAkcF9oZWFkZXJbJ2V4dHJhJ10gPSAnJzsKCiAgICAvLyAtLS0tLSBHZXQgY29tbWVudAogICAgaWYgKCRwX2hlYWRlclsnY29tbWVudF9sZW4nXSAhPSAwKQogICAgICAkcF9oZWFkZXJbJ2NvbW1lbnQnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICRwX2hlYWRlclsnY29tbWVudF9sZW4nXSk7CiAgICBlbHNlCiAgICAgICRwX2hlYWRlclsnY29tbWVudCddID0gJyc7CgogICAgLy8gLS0tLS0gRXh0cmFjdCBwcm9wZXJ0aWVzCgogICAgLy8gLS0tLS0gUmVjdXBlcmF0ZSBkYXRlIGluIFVOSVggZm9ybWF0CiAgICAvL2lmICgkcF9oZWFkZXJbJ21kYXRlJ10gJiYgJHBfaGVhZGVyWydtdGltZSddKQogICAgLy8gVEJDIDogYnVnIDogdGhpcyB3YXMgaWdub3JpbmcgdGltZSB3aXRoIDAvMC8wCiAgICBpZiAoMSkKICAgIHsKICAgICAgLy8gLS0tLS0gRXh0cmFjdCB0aW1lCiAgICAgICR2X2hvdXIgPSAoJHBfaGVhZGVyWydtdGltZSddICYgMHhGODAwKSA+PiAxMTsKICAgICAgJHZfbWludXRlID0gKCRwX2hlYWRlclsnbXRpbWUnXSAmIDB4MDdFMCkgPj4gNTsKICAgICAgJHZfc2Vjb25kZSA9ICgkcF9oZWFkZXJbJ210aW1lJ10gJiAweDAwMUYpKjI7CgogICAgICAvLyAtLS0tLSBFeHRyYWN0IGRhdGUKICAgICAgJHZfeWVhciA9ICgoJHBfaGVhZGVyWydtZGF0ZSddICYgMHhGRTAwKSA+PiA5KSArIDE5ODA7CiAgICAgICR2X21vbnRoID0gKCRwX2hlYWRlclsnbWRhdGUnXSAmIDB4MDFFMCkgPj4gNTsKICAgICAgJHZfZGF5ID0gJHBfaGVhZGVyWydtZGF0ZSddICYgMHgwMDFGOwoKICAgICAgLy8gLS0tLS0gR2V0IFVOSVggZGF0ZSBmb3JtYXQKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gQG1rdGltZSgkdl9ob3VyLCAkdl9taW51dGUsICR2X3NlY29uZGUsICR2X21vbnRoLCAkdl9kYXksICR2X3llYXIpOwoKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgJHBfaGVhZGVyWydtdGltZSddID0gdGltZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFNldCB0aGUgc3RvcmVkIGZpbGVuYW1lCiAgICAkcF9oZWFkZXJbJ3N0b3JlZF9maWxlbmFtZSddID0gJHBfaGVhZGVyWydmaWxlbmFtZSddOwoKICAgIC8vIC0tLS0tIFNldCBkZWZhdWx0IHN0YXR1cyB0byBvawogICAgJHBfaGVhZGVyWydzdGF0dXMnXSA9ICdvayc7CgogICAgLy8gLS0tLS0gTG9vayBpZiBpdCBpcyBhIGRpcmVjdG9yeQogICAgaWYgKHN1YnN0cigkcF9oZWFkZXJbJ2ZpbGVuYW1lJ10sIC0xKSA9PSAnLycpIHsKICAgICAgLy8kcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDQxRkYwMDEwOwogICAgICAkcF9oZWFkZXJbJ2V4dGVybmFsJ10gPSAweDAwMDAwMDEwOwogICAgfQoKCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2Q2hlY2tGaWxlSGVhZGVycygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLAogIC8vICAgMCBvbiBlcnJvcjsKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZDaGVja0ZpbGVIZWFkZXJzKCYkcF9sb2NhbF9oZWFkZXIsICYkcF9jZW50cmFsX2hlYWRlcikKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgCS8vIC0tLS0tIENoZWNrIHRoZSBzdGF0aWMgdmFsdWVzCiAgCS8vIFRCQwogIAlpZiAoJHBfbG9jYWxfaGVhZGVyWydmaWxlbmFtZSddICE9ICRwX2NlbnRyYWxfaGVhZGVyWydmaWxlbmFtZSddKSB7CiAgCX0KICAJaWYgKCRwX2xvY2FsX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSAhPSAkcF9jZW50cmFsX2hlYWRlclsndmVyc2lvbl9leHRyYWN0ZWQnXSkgewogIAl9CiAgCWlmICgkcF9sb2NhbF9oZWFkZXJbJ2ZsYWcnXSAhPSAkcF9jZW50cmFsX2hlYWRlclsnZmxhZyddKSB7CiAgCX0KICAJaWYgKCRwX2xvY2FsX2hlYWRlclsnY29tcHJlc3Npb24nXSAhPSAkcF9jZW50cmFsX2hlYWRlclsnY29tcHJlc3Npb24nXSkgewogIAl9CiAgCWlmICgkcF9sb2NhbF9oZWFkZXJbJ210aW1lJ10gIT0gJHBfY2VudHJhbF9oZWFkZXJbJ210aW1lJ10pIHsKICAJfQogIAlpZiAoJHBfbG9jYWxfaGVhZGVyWydmaWxlbmFtZV9sZW4nXSAhPSAkcF9jZW50cmFsX2hlYWRlclsnZmlsZW5hbWVfbGVuJ10pIHsKICAJfQoKICAJLy8gLS0tLS0gTG9vayBmb3IgZmxhZyBiaXQgMwogIAlpZiAoKCRwX2xvY2FsX2hlYWRlclsnZmxhZyddICYgOCkgPT0gOCkgewogICAgICAgICAgJHBfbG9jYWxfaGVhZGVyWydzaXplJ10gPSAkcF9jZW50cmFsX2hlYWRlclsnc2l6ZSddOwogICAgICAgICAgJHBfbG9jYWxfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXSA9ICRwX2NlbnRyYWxfaGVhZGVyWydjb21wcmVzc2VkX3NpemUnXTsKICAgICAgICAgICRwX2xvY2FsX2hlYWRlclsnY3JjJ10gPSAkcF9jZW50cmFsX2hlYWRlclsnY3JjJ107CiAgCX0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBwcml2UmVhZEVuZENlbnRyYWxEaXIoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZSZWFkRW5kQ2VudHJhbERpcigmJHBfY2VudHJhbF9kaXIpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gR28gdG8gdGhlIGVuZCBvZiB0aGUgemlwIGZpbGUKICAgICR2X3NpemUgPSBmaWxlc2l6ZSgkdGhpcy0+emlwbmFtZSk7CiAgICBAZnNlZWsoJHRoaXMtPnppcF9mZCwgJHZfc2l6ZSk7CiAgICBpZiAoQGZ0ZWxsKCR0aGlzLT56aXBfZmQpICE9ICR2X3NpemUpCiAgICB7CiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICdVbmFibGUgdG8gZ28gdG8gdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gRmlyc3QgdHJ5IDogbG9vayBpZiB0aGlzIGlzIGFuIGFyY2hpdmUgd2l0aCBubyBjb21tZW50YXJpZXMgKG1vc3Qgb2YgdGhlIHRpbWUpCiAgICAvLyBpbiB0aGlzIGNhc2UgdGhlIGVuZCBvZiBjZW50cmFsIGRpciBpcyBhdCAyMiBieXRlcyBvZiB0aGUgZmlsZSBlbmQKICAgICR2X2ZvdW5kID0gMDsKICAgIGlmICgkdl9zaXplID4gMjYpIHsKICAgICAgQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X3NpemUtMjIpOwogICAgICBpZiAoKCR2X3BvcyA9IEBmdGVsbCgkdGhpcy0+emlwX2ZkKSkgIT0gKCR2X3NpemUtMjIpKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAnVW5hYmxlIHRvIHNlZWsgYmFjayB0byB0aGUgbWlkZGxlIG9mIHRoZSBhcmNoaXZlIFwnJy4kdGhpcy0+emlwbmFtZS4nXCcnKTsKCiAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgIH0KCiAgICAgIC8vIC0tLS0tIFJlYWQgZm9yIGJ5dGVzCiAgICAgICR2X2JpbmFyeV9kYXRhID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsIDQpOwogICAgICAkdl9kYXRhID0gQHVucGFjaygnVmlkJywgJHZfYmluYXJ5X2RhdGEpOwoKICAgICAgLy8gLS0tLS0gQ2hlY2sgc2lnbmF0dXJlCiAgICAgIGlmICgkdl9kYXRhWydpZCddID09IDB4MDYwNTRiNTApIHsKICAgICAgICAkdl9mb3VuZCA9IDE7CiAgICAgIH0KCiAgICAgICR2X3BvcyA9IGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwogICAgfQoKICAgIC8vIC0tLS0tIEdvIGJhY2sgdG8gdGhlIG1heGltdW0gcG9zc2libGUgc2l6ZSBvZiB0aGUgQ2VudHJhbCBEaXIgRW5kIFJlY29yZAogICAgaWYgKCEkdl9mb3VuZCkgewogICAgICAkdl9tYXhpbXVtX3NpemUgPSA2NTU1NzsgLy8gMHhGRkZGICsgMjI7CiAgICAgIGlmICgkdl9tYXhpbXVtX3NpemUgPiAkdl9zaXplKQogICAgICAgICR2X21heGltdW1fc2l6ZSA9ICR2X3NpemU7CiAgICAgIEBmc2VlaygkdGhpcy0+emlwX2ZkLCAkdl9zaXplLSR2X21heGltdW1fc2l6ZSk7CiAgICAgIGlmIChAZnRlbGwoJHRoaXMtPnppcF9mZCkgIT0gKCR2X3NpemUtJHZfbWF4aW11bV9zaXplKSkKICAgICAgewogICAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICAgIFBjbFppcDo6cHJpdkVycm9yTG9nKFBDTFpJUF9FUlJfQkFEX0ZPUk1BVCwgJ1VuYWJsZSB0byBzZWVrIGJhY2sgdG8gdGhlIG1pZGRsZSBvZiB0aGUgYXJjaGl2ZSBcJycuJHRoaXMtPnppcG5hbWUuJ1wnJyk7CgogICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgICB9CgogICAgICAvLyAtLS0tLSBSZWFkIGJ5dGUgcGVyIGJ5dGUgaW4gb3JkZXIgdG8gZmluZCB0aGUgc2lnbmF0dXJlCiAgICAgICR2X3BvcyA9IGZ0ZWxsKCR0aGlzLT56aXBfZmQpOwogICAgICAkdl9ieXRlcyA9IDB4MDAwMDAwMDA7CiAgICAgIHdoaWxlICgkdl9wb3MgPCAkdl9zaXplKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gUmVhZCBhIGJ5dGUKICAgICAgICAkdl9ieXRlID0gQGZyZWFkKCR0aGlzLT56aXBfZmQsIDEpOwoKICAgICAgICAvLyAtLS0tLSAgQWRkIHRoZSBieXRlCiAgICAgICAgLy8kdl9ieXRlcyA9ICgkdl9ieXRlcyA8PCA4KSB8IE9yZCgkdl9ieXRlKTsKICAgICAgICAvLyBOb3RlIHdlIG1hc2sgdGhlIG9sZCB2YWx1ZSBkb3duIHN1Y2ggdGhhdCBvbmNlIHNoaWZ0ZWQgd2UgY2FuIG5ldmVyIGVuZCB1cCB3aXRoIG1vcmUgdGhhbiBhIDMyYml0IG51bWJlcgogICAgICAgIC8vIE90aGVyd2lzZSBvbiBzeXN0ZW1zIHdoZXJlIHdlIGhhdmUgNjRiaXQgaW50ZWdlcnMgdGhlIGNoZWNrIGJlbG93IGZvciB0aGUgbWFnaWMgbnVtYmVyIHdpbGwgZmFpbC4KICAgICAgICAkdl9ieXRlcyA9ICggKCR2X2J5dGVzICYgMHhGRkZGRkYpIDw8IDgpIHwgT3JkKCR2X2J5dGUpOwoKICAgICAgICAvLyAtLS0tLSBDb21wYXJlIHRoZSBieXRlcwogICAgICAgIGlmICgkdl9ieXRlcyA9PSAweDUwNGIwNTA2KQogICAgICAgIHsKICAgICAgICAgICR2X3BvcysrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICAkdl9wb3MrKzsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBpZiBub3QgZm91bmQgZW5kIG9mIGNlbnRyYWwgZGlyCiAgICAgIGlmICgkdl9wb3MgPT0gJHZfc2l6ZSkKICAgICAgewoKICAgICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0JBRF9GT1JNQVQsICJVbmFibGUgdG8gZmluZCBFbmQgb2YgQ2VudHJhbCBEaXIgUmVjb3JkIHNpZ25hdHVyZSIpOwoKICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpcnN0IDE4IGJ5dGVzIG9mIHRoZSBoZWFkZXIKICAgICR2X2JpbmFyeV9kYXRhID0gZnJlYWQoJHRoaXMtPnppcF9mZCwgMTgpOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIGludmFsaWQgYmxvY2sgc2l6ZQogICAgaWYgKHN0cmxlbigkdl9iaW5hcnlfZGF0YSkgIT0gMTgpCiAgICB7CgogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULCAiSW52YWxpZCBFbmQgb2YgQ2VudHJhbCBEaXIgUmVjb3JkIHNpemUgOiAiLnN0cmxlbigkdl9iaW5hcnlfZGF0YSkpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIEV4dHJhY3QgdGhlIHZhbHVlcwogICAgJHZfZGF0YSA9IHVucGFjaygndmRpc2svdmRpc2tfc3RhcnQvdmRpc2tfZW50cmllcy92ZW50cmllcy9Wc2l6ZS9Wb2Zmc2V0L3Zjb21tZW50X3NpemUnLCAkdl9iaW5hcnlfZGF0YSk7CgogICAgLy8gLS0tLS0gQ2hlY2sgdGhlIGdsb2JhbCBzaXplCiAgICBpZiAoKCR2X3BvcyArICR2X2RhdGFbJ2NvbW1lbnRfc2l6ZSddICsgMTgpICE9ICR2X3NpemUpIHsKCgkgIC8vIC0tLS0tIFJlbW92ZWQgaW4gcmVsZWFzZSAyLjIgc2VlIHJlYWRtZSBmaWxlCgkgIC8vIFRoZSBjaGVjayBvZiB0aGUgZmlsZSBzaXplIGlzIGEgbGl0dGxlIHRvbyBzdHJpY3QuCgkgIC8vIFNvbWUgYnVncyB3aGVyZSBmb3VuZCB3aGVuIGEgemlwIGlzIGVuY3J5cHRlZC9kZWNyeXB0ZWQgd2l0aCAnY3J5cHQnLgoJICAvLyBXaGlsZSBkZWNyeXB0ZWQsIHppcCBoYXMgdHJhaW5pbmcgMCBieXRlcwoJICBpZiAoMCkgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9CQURfRk9STUFULAoJICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGNlbnRyYWwgZGlyIGlzIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLicKCQkJCQkJICAgLicgU29tZSB0cmFpbGluZyBieXRlcyBleGlzdHMgYWZ0ZXIgdGhlIGFyY2hpdmUuJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CgkgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBHZXQgY29tbWVudAogICAgaWYgKCR2X2RhdGFbJ2NvbW1lbnRfc2l6ZSddICE9IDApIHsKICAgICAgJHBfY2VudHJhbF9kaXJbJ2NvbW1lbnQnXSA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X2RhdGFbJ2NvbW1lbnRfc2l6ZSddKTsKICAgIH0KICAgIGVsc2UKICAgICAgJHBfY2VudHJhbF9kaXJbJ2NvbW1lbnQnXSA9ICcnOwoKICAgICRwX2NlbnRyYWxfZGlyWydlbnRyaWVzJ10gPSAkdl9kYXRhWydlbnRyaWVzJ107CiAgICAkcF9jZW50cmFsX2RpclsnZGlza19lbnRyaWVzJ10gPSAkdl9kYXRhWydkaXNrX2VudHJpZXMnXTsKICAgICRwX2NlbnRyYWxfZGlyWydvZmZzZXQnXSA9ICR2X2RhdGFbJ29mZnNldCddOwogICAgJHBfY2VudHJhbF9kaXJbJ3NpemUnXSA9ICR2X2RhdGFbJ3NpemUnXTsKICAgICRwX2NlbnRyYWxfZGlyWydkaXNrJ10gPSAkdl9kYXRhWydkaXNrJ107CiAgICAkcF9jZW50cmFsX2RpclsnZGlza19zdGFydCddID0gJHZfZGF0YVsnZGlza19zdGFydCddOwoKICAgIC8vIFRCQwogICAgLy9mb3IocmVzZXQoJHBfY2VudHJhbF9kaXIpOyAka2V5ID0ga2V5KCRwX2NlbnRyYWxfZGlyKTsgbmV4dCgkcF9jZW50cmFsX2RpcikpIHsKICAgIC8vfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZEZWxldGVCeVJ1bGUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZEZWxldGVCeVJ1bGUoJiRwX3Jlc3VsdF9saXN0LCAmJHBfb3B0aW9ucykKICB7CiAgICAkdl9yZXN1bHQ9MTsKICAgICR2X2xpc3RfZGV0YWlsID0gYXJyYXkoKTsKCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQogICAgaWYgKCgkdl9yZXN1bHQ9JHRoaXMtPnByaXZPcGVuRmQoJ3JiJykpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGluZm9ybWF0aW9ucwogICAgJHZfY2VudHJhbF9kaXIgPSBhcnJheSgpOwogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdlJlYWRFbmRDZW50cmFsRGlyKCR2X2NlbnRyYWxfZGlyKSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gR28gdG8gYmVnaW5uaW5nIG9mIEZpbGUKICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CgogICAgLy8gLS0tLS0gU2NhbiBhbGwgdGhlIGZpbGVzCiAgICAvLyAtLS0tLSBTdGFydCBhdCBiZWdpbm5pbmcgb2YgQ2VudHJhbCBEaXIKICAgICR2X3Bvc19lbnRyeSA9ICR2X2NlbnRyYWxfZGlyWydvZmZzZXQnXTsKICAgIEByZXdpbmQoJHRoaXMtPnppcF9mZCk7CiAgICBpZiAoQGZzZWVrKCR0aGlzLT56aXBfZmQsICR2X3Bvc19lbnRyeSkpCiAgICB7CiAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgIC8vIC0tLS0tIEVycm9yIGxvZwogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAsICdJbnZhbGlkIGFyY2hpdmUgc2l6ZScpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJlYWQgZWFjaCBlbnRyeQogICAgJHZfaGVhZGVyX2xpc3QgPSBhcnJheSgpOwogICAgJGpfc3RhcnQgPSAwOwogICAgZm9yICgkaT0wLCAkdl9uYl9leHRyYWN0ZWQ9MDsgJGk8JHZfY2VudHJhbF9kaXJbJ2VudHJpZXMnXTsgJGkrKykKICAgIHsKCiAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyCiAgICAgICR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF0gPSBhcnJheSgpOwogICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZENlbnRyYWxGaWxlSGVhZGVyKCR2X2hlYWRlcl9saXN0WyR2X25iX2V4dHJhY3RlZF0pKSAhPSAxKQogICAgICB7CiAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgIH0KCgogICAgICAvLyAtLS0tLSBTdG9yZSB0aGUgaW5kZXgKICAgICAgJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnaW5kZXgnXSA9ICRpOwoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgdGhlIHNwZWNpZmljIGV4dHJhY3QgcnVsZXMKICAgICAgJHZfZm91bmQgPSBmYWxzZTsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgbmFtZSBydWxlCiAgICAgIGlmICggICAoaXNzZXQoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdKSkKICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV0gIT0gMCkpIHsKCiAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBmaWxlbmFtZSBpcyBpbiB0aGUgbGlzdAogICAgICAgICAgZm9yICgkaj0wOyAoJGo8c2l6ZW9mKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXSkpICYmICghJHZfZm91bmQpOyAkaisrKSB7CgogICAgICAgICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGEgZGlyZWN0b3J5CiAgICAgICAgICAgICAgaWYgKHN1YnN0cigkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdLCAtMSkgPT0gIi8iKSB7CgogICAgICAgICAgICAgICAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBkaXJlY3RvcnkgaXMgaW4gdGhlIGZpbGVuYW1lIHBhdGgKICAgICAgICAgICAgICAgICAgaWYgKCAgIChzdHJsZW4oJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10pID4gc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKQogICAgICAgICAgICAgICAgICAgICAgJiYgKHN1YnN0cigkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydzdG9yZWRfZmlsZW5hbWUnXSwgMCwgc3RybGVuKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKSA9PSAkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfTkFNRV1bJGpdKSkgewogICAgICAgICAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2VpZiAoICAgKCgkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydleHRlcm5hbCddJjB4MDAwMDAwMTApPT0weDAwMDAwMDEwKSAvKiBJbmRpY2F0ZXMgYSBmb2xkZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10uJy8nID09ICRwX29wdGlvbnNbUENMWklQX09QVF9CWV9OQU1FXVskal0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAkdl9mb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gLS0tLS0gTG9vayBmb3IgYSBmaWxlbmFtZQogICAgICAgICAgICAgIGVsc2VpZiAoJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10gPT0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX05BTUVdWyRqXSkgewogICAgICAgICAgICAgICAgICAkdl9mb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGVyZWcgcnVsZQogICAgICAvLyBlcmVnKCkgaXMgZGVwcmVjYXRlZCB3aXRoIFBIUCA1LjMKICAgICAgLyoKICAgICAgZWxzZSBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9FUkVHXSkpCiAgICAgICAgICAgICAgICYmICgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfRVJFR10gIT0gIiIpKSB7CgogICAgICAgICAgaWYgKGVyZWcoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0VSRUddLCAkdl9oZWFkZXJfbGlzdFskdl9uYl9leHRyYWN0ZWRdWydzdG9yZWRfZmlsZW5hbWUnXSkpIHsKICAgICAgICAgICAgICAkdl9mb3VuZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgKi8KCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGV4dHJhY3QgYnkgcHJlZyBydWxlCiAgICAgIGVsc2UgaWYgKCAgIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfUFJFR10pKQogICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX1BSRUddICE9ICIiKSkgewoKICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9QUkVHXSwgJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXVsnc3RvcmVkX2ZpbGVuYW1lJ10pKSB7CiAgICAgICAgICAgICAgJHZfZm91bmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBleHRyYWN0IGJ5IGluZGV4IHJ1bGUKICAgICAgZWxzZSBpZiAoICAgKGlzc2V0KCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF0pKQogICAgICAgICAgICAgICAmJiAoJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0JZX0lOREVYXSAhPSAwKSkgewoKICAgICAgICAgIC8vIC0tLS0tIExvb2sgaWYgdGhlIGluZGV4IGlzIGluIHRoZSBsaXN0CiAgICAgICAgICBmb3IgKCRqPSRqX3N0YXJ0OyAoJGo8c2l6ZW9mKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF0pKSAmJiAoISR2X2ZvdW5kKTsgJGorKykgewoKICAgICAgICAgICAgICBpZiAoKCRpPj0kcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnc3RhcnQnXSkgJiYgKCRpPD0kcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnZW5kJ10pKSB7CiAgICAgICAgICAgICAgICAgICR2X2ZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCRpPj0kcF9vcHRpb25zW1BDTFpJUF9PUFRfQllfSU5ERVhdWyRqXVsnZW5kJ10pIHsKICAgICAgICAgICAgICAgICAgJGpfc3RhcnQgPSAkaisxOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKCRwX29wdGlvbnNbUENMWklQX09QVF9CWV9JTkRFWF1bJGpdWydzdGFydCddPiRpKSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgCSR2X2ZvdW5kID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgZGVsZXRpb24KICAgICAgaWYgKCR2X2ZvdW5kKQogICAgICB7CiAgICAgICAgdW5zZXQoJHZfaGVhZGVyX2xpc3RbJHZfbmJfZXh0cmFjdGVkXSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgJHZfbmJfZXh0cmFjdGVkKys7CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGlmIHNvbWV0aGluZyBuZWVkIHRvIGJlIGRlbGV0ZWQKICAgIGlmICgkdl9uYl9leHRyYWN0ZWQgPiAwKSB7CgogICAgICAgIC8vIC0tLS0tIENyZWF0ZXMgYSB0ZW1wb3JheSBmaWxlCiAgICAgICAgJHZfemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicudG1wJzsKCiAgICAgICAgLy8gLS0tLS0gQ3JlYXRlcyBhIHRlbXBvcmFyeSB6aXAgYXJjaGl2ZQogICAgICAgICR2X3RlbXBfemlwID0gbmV3IFBjbFppcCgkdl96aXBfdGVtcF9uYW1lKTsKCiAgICAgICAgLy8gLS0tLS0gT3BlbiB0aGUgdGVtcG9yYXJ5IHppcCBmaWxlIGluIHdyaXRlIG1vZGUKICAgICAgICBpZiAoKCR2X3Jlc3VsdCA9ICR2X3RlbXBfemlwLT5wcml2T3BlbkZkKCd3YicpKSAhPSAxKSB7CiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBMb29rIHdoaWNoIGZpbGUgbmVlZCB0byBiZSBrZXB0CiAgICAgICAgZm9yICgkaT0wOyAkaTxzaXplb2YoJHZfaGVhZGVyX2xpc3QpOyAkaSsrKSB7CgogICAgICAgICAgICAvLyAtLS0tLSBDYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBoZWFkZXIKICAgICAgICAgICAgQHJld2luZCgkdGhpcy0+emlwX2ZkKTsKICAgICAgICAgICAgaWYgKEBmc2VlaygkdGhpcy0+emlwX2ZkLCAgJHZfaGVhZGVyX2xpc3RbJGldWydvZmZzZXQnXSkpIHsKICAgICAgICAgICAgICAgIC8vIC0tLS0tIENsb3NlIHRoZSB6aXAgZmlsZQogICAgICAgICAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICAkdl90ZW1wX3ppcC0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7CgogICAgICAgICAgICAgICAgLy8gLS0tLS0gRXJyb3IgbG9nCiAgICAgICAgICAgICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX0lOVkFMSURfQVJDSElWRV9aSVAsICdJbnZhbGlkIGFyY2hpdmUgc2l6ZScpOwoKICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIFJlYWQgdGhlIGZpbGUgaGVhZGVyCiAgICAgICAgICAgICR2X2xvY2FsX2hlYWRlciA9IGFycmF5KCk7CiAgICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZSZWFkRmlsZUhlYWRlcigkdl9sb2NhbF9oZWFkZXIpKSAhPSAxKSB7CiAgICAgICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoKICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gLS0tLS0gQ2hlY2sgdGhhdCBsb2NhbCBmaWxlIGhlYWRlciBpcyBzYW1lIGFzIGNlbnRyYWwgZmlsZSBoZWFkZXIKICAgICAgICAgICAgaWYgKCR0aGlzLT5wcml2Q2hlY2tGaWxlSGVhZGVycygkdl9sb2NhbF9oZWFkZXIsCgkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZfaGVhZGVyX2xpc3RbJGldKSAhPSAxKSB7CiAgICAgICAgICAgICAgICAvLyBUQkMKICAgICAgICAgICAgfQogICAgICAgICAgICB1bnNldCgkdl9sb2NhbF9oZWFkZXIpOwoKICAgICAgICAgICAgLy8gLS0tLS0gV3JpdGUgdGhlIGZpbGUgaGVhZGVyCiAgICAgICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHZfdGVtcF96aXAtPnByaXZXcml0ZUZpbGVIZWFkZXIoJHZfaGVhZGVyX2xpc3RbJGldKSkgIT0gMSkgewogICAgICAgICAgICAgICAgLy8gLS0tLS0gQ2xvc2UgdGhlIHppcCBmaWxlCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgQHVubGluaygkdl96aXBfdGVtcF9uYW1lKTsKCiAgICAgICAgICAgICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC0tLS0tIFJlYWQvd3JpdGUgdGhlIGRhdGEgYmxvY2sKICAgICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSBQY2xaaXBVdGlsQ29weUJsb2NrKCR0aGlzLT56aXBfZmQsICR2X3RlbXBfemlwLT56aXBfZmQsICR2X2hlYWRlcl9saXN0WyRpXVsnY29tcHJlc3NlZF9zaXplJ10pKSAhPSAxKSB7CiAgICAgICAgICAgICAgICAvLyAtLS0tLSBDbG9zZSB0aGUgemlwIGZpbGUKICAgICAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoKICAgICAgICAgICAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICAgICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gU3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgY2VudHJhbCBkaXIKICAgICAgICAkdl9vZmZzZXQgPSBAZnRlbGwoJHZfdGVtcF96aXAtPnppcF9mZCk7CgogICAgICAgIC8vIC0tLS0tIFJlLUNyZWF0ZSB0aGUgQ2VudHJhbCBEaXIgZmlsZXMgaGVhZGVyCiAgICAgICAgZm9yICgkaT0wOyAkaTxzaXplb2YoJHZfaGVhZGVyX2xpc3QpOyAkaSsrKSB7CiAgICAgICAgICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgZmlsZSBoZWFkZXIKICAgICAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdl90ZW1wX3ppcC0+cHJpdldyaXRlQ2VudHJhbEZpbGVIZWFkZXIoJHZfaGVhZGVyX2xpc3RbJGldKSkgIT0gMSkgewogICAgICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgICAgICAgICAgIEB1bmxpbmsoJHZfemlwX3RlbXBfbmFtZSk7CgogICAgICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAtLS0tLSBUcmFuc2Zvcm0gdGhlIGhlYWRlciB0byBhICd1c2FibGUnIGluZm8KICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDb252ZXJ0SGVhZGVyMkZpbGVJbmZvKCR2X2hlYWRlcl9saXN0WyRpXSwgJHBfcmVzdWx0X2xpc3RbJGldKTsKICAgICAgICB9CgoKICAgICAgICAvLyAtLS0tLSBaaXAgZmlsZSBjb21tZW50CiAgICAgICAgJHZfY29tbWVudCA9ICcnOwogICAgICAgIGlmIChpc3NldCgkcF9vcHRpb25zW1BDTFpJUF9PUFRfQ09NTUVOVF0pKSB7CiAgICAgICAgICAkdl9jb21tZW50ID0gJHBfb3B0aW9uc1tQQ0xaSVBfT1BUX0NPTU1FTlRdOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0tLS0gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBjZW50cmFsIGhlYWRlcgogICAgICAgICR2X3NpemUgPSBAZnRlbGwoJHZfdGVtcF96aXAtPnppcF9mZCktJHZfb2Zmc2V0OwoKICAgICAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGNlbnRyYWwgZGlyIGZvb3RlcgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHZfdGVtcF96aXAtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoc2l6ZW9mKCR2X2hlYWRlcl9saXN0KSwgJHZfc2l6ZSwgJHZfb2Zmc2V0LCAkdl9jb21tZW50KSkgIT0gMSkgewogICAgICAgICAgICAvLyAtLS0tLSBSZXNldCB0aGUgZmlsZSBsaXN0CiAgICAgICAgICAgIHVuc2V0KCR2X2hlYWRlcl9saXN0KTsKICAgICAgICAgICAgJHZfdGVtcF96aXAtPnByaXZDbG9zZUZkKCk7CiAgICAgICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICAgICBAdW5saW5rKCR2X3ppcF90ZW1wX25hbWUpOwoKICAgICAgICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgICAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0tLSBDbG9zZQogICAgICAgICR2X3RlbXBfemlwLT5wcml2Q2xvc2VGZCgpOwogICAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgICAvLyAtLS0tLSBEZWxldGUgdGhlIHppcCBmaWxlCiAgICAgICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgICAgIEB1bmxpbmsoJHRoaXMtPnppcG5hbWUpOwoKICAgICAgICAvLyAtLS0tLSBSZW5hbWUgdGhlIHRlbXBvcmFyeSBmaWxlCiAgICAgICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgICAgIC8vQHJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7CiAgICAgICAgUGNsWmlwVXRpbFJlbmFtZSgkdl96aXBfdGVtcF9uYW1lLCAkdGhpcy0+emlwbmFtZSk7CgogICAgICAgIC8vIC0tLS0tIERlc3Ryb3kgdGhlIHRlbXBvcmFyeSBhcmNoaXZlCiAgICAgICAgdW5zZXQoJHZfdGVtcF96aXApOwogICAgfQoKICAgIC8vIC0tLS0tIFJlbW92ZSBldmVyeSBmaWxlcyA6IHJlc2V0IHRoZSBmaWxlCiAgICBlbHNlIGlmICgkdl9jZW50cmFsX2RpclsnZW50cmllcyddICE9IDApIHsKICAgICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAgICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdk9wZW5GZCgnd2InKSkgIT0gMSkgewogICAgICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgICAgICB9CgogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZXcml0ZUNlbnRyYWxIZWFkZXIoMCwgMCwgMCwgJycpKSAhPSAxKSB7CiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogcHJpdkRpckNoZWNrKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBDaGVjayBpZiBhIGRpcmVjdG9yeSBleGlzdHMsIGlmIG5vdCBpdCBjcmVhdGVzIGl0IGFuZCBhbGwgdGhlIHBhcmVudHMgZGlyZWN0b3J5CiAgLy8gICB3aGljaCBtYXkgYmUgdXNlZnVsLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfZGlyIDogRGlyZWN0b3J5IHBhdGggdG8gY2hlY2suCiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAgMSA6IE9LCiAgLy8gICAtMSA6IFVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RGlyQ2hlY2soJHBfZGlyLCAkcF9pc19kaXI9ZmFsc2UpCiAgewogICAgJHZfcmVzdWx0ID0gMTsKCgogICAgLy8gLS0tLS0gUmVtb3ZlIHRoZSBmaW5hbCAnLycKICAgIGlmICgoJHBfaXNfZGlyKSAmJiAoc3Vic3RyKCRwX2RpciwgLTEpPT0nLycpKQogICAgewogICAgICAkcF9kaXIgPSBzdWJzdHIoJHBfZGlyLCAwLCBzdHJsZW4oJHBfZGlyKS0xKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDaGVjayB0aGUgZGlyZWN0b3J5IGF2YWlsYWJpbGl0eQogICAgaWYgKChpc19kaXIoJHBfZGlyKSkgfHwgKCRwX2RpciA9PSAiIikpCiAgICB7CiAgICAgIHJldHVybiAxOwogICAgfQoKICAgIC8vIC0tLS0tIEV4dHJhY3QgcGFyZW50IGRpcmVjdG9yeQogICAgJHBfcGFyZW50X2RpciA9IGRpcm5hbWUoJHBfZGlyKTsKCiAgICAvLyAtLS0tLSBKdXN0IGEgY2hlY2sKICAgIGlmICgkcF9wYXJlbnRfZGlyICE9ICRwX2RpcikKICAgIHsKICAgICAgLy8gLS0tLS0gTG9vayBmb3IgcGFyZW50IGRpcmVjdG9yeQogICAgICBpZiAoJHBfcGFyZW50X2RpciAhPSAiIikKICAgICAgewogICAgICAgIGlmICgoJHZfcmVzdWx0ID0gJHRoaXMtPnByaXZEaXJDaGVjaygkcF9wYXJlbnRfZGlyKSkgIT0gMSkKICAgICAgICB7CiAgICAgICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIENyZWF0ZSB0aGUgZGlyZWN0b3J5CiAgICBpZiAoIUBta2RpcigkcF9kaXIsIDA3NzcpKQogICAgewogICAgICAvLyAtLS0tLSBFcnJvciBsb2cKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9ESVJfQ1JFQVRFX0ZBSUwsICJVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeSAnJHBfZGlyJyIpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiBQY2xaaXA6OmVycm9yQ29kZSgpOwogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZNZXJnZSgpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgSWYgJHBfYXJjaGl2ZV90b19hZGQgZG9lcyBub3QgZXhpc3QsIHRoZSBmdW5jdGlvbiBleGl0IHdpdGggYSBzdWNjZXNzIHJlc3VsdC4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZNZXJnZSgmJHBfYXJjaGl2ZV90b19hZGQpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gTG9vayBpZiB0aGUgYXJjaGl2ZV90b19hZGQgZXhpc3RzCiAgICBpZiAoIWlzX2ZpbGUoJHBfYXJjaGl2ZV90b19hZGQtPnppcG5hbWUpKQogICAgewoKICAgICAgLy8gLS0tLS0gTm90aGluZyB0byBtZXJnZSwgc28gbWVyZ2UgaXMgYSBzdWNjZXNzCiAgICAgICR2X3Jlc3VsdCA9IDE7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSBhcmNoaXZlIGV4aXN0cwogICAgaWYgKCFpc19maWxlKCR0aGlzLT56aXBuYW1lKSkKICAgIHsKCiAgICAgIC8vIC0tLS0tIERvIGEgZHVwbGljYXRlCiAgICAgICR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2RHVwbGljYXRlKCRwX2FyY2hpdmVfdG9fYWRkLT56aXBuYW1lKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHppcCBmaWxlCiAgICBpZiAoKCR2X3Jlc3VsdD0kdGhpcy0+cHJpdk9wZW5GZCgncmInKSkgIT0gMSkKICAgIHsKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gUmVhZCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaW5mb3JtYXRpb25zCiAgICAkdl9jZW50cmFsX2RpciA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICR0aGlzLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXIpKSAhPSAxKQogICAgewogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgRmlsZQogICAgQHJld2luZCgkdGhpcy0+emlwX2ZkKTsKCiAgICAvLyAtLS0tLSBPcGVuIHRoZSBhcmNoaXZlX3RvX2FkZCBmaWxlCiAgICBpZiAoKCR2X3Jlc3VsdD0kcF9hcmNoaXZlX3RvX2FkZC0+cHJpdk9wZW5GZCgncmInKSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbnMKICAgICR2X2NlbnRyYWxfZGlyX3RvX2FkZCA9IGFycmF5KCk7CiAgICBpZiAoKCR2X3Jlc3VsdCA9ICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2UmVhZEVuZENlbnRyYWxEaXIoJHZfY2VudHJhbF9kaXJfdG9fYWRkKSkgIT0gMSkKICAgIHsKICAgICAgJHRoaXMtPnByaXZDbG9zZUZkKCk7CiAgICAgICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBHbyB0byBiZWdpbm5pbmcgb2YgRmlsZQogICAgQHJld2luZCgkcF9hcmNoaXZlX3RvX2FkZC0+emlwX2ZkKTsKCiAgICAvLyAtLS0tLSBDcmVhdGVzIGEgdGVtcG9yYXkgZmlsZQogICAgJHZfemlwX3RlbXBfbmFtZSA9IFBDTFpJUF9URU1QT1JBUllfRElSLnVuaXFpZCgncGNsemlwLScpLicudG1wJzsKCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB3cml0ZSBtb2RlCiAgICBpZiAoKCR2X3ppcF90ZW1wX2ZkID0gQGZvcGVuKCR2X3ppcF90ZW1wX25hbWUsICd3YicpKSA9PSAwKQogICAgewogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgJHBfYXJjaGl2ZV90b19hZGQtPnByaXZDbG9zZUZkKCk7CgogICAgICBQY2xaaXA6OnByaXZFcnJvckxvZyhQQ0xaSVBfRVJSX1JFQURfT1BFTl9GQUlMLCAnVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGZpbGUgXCcnLiR2X3ppcF90ZW1wX25hbWUuJ1wnIGluIGJpbmFyeSB3cml0ZSBtb2RlJyk7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuIFBjbFppcDo6ZXJyb3JDb2RlKCk7CiAgICB9CgogICAgLy8gLS0tLS0gQ29weSB0aGUgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIC8vIFRCQyA6IEhlcmUgSSBzaG91bGQgYmV0dGVyIGFwcGVuZCB0aGUgZmlsZSBhbmQgZ28gYmFjayB0byBlcmFzZSB0aGUgY2VudHJhbCBkaXIKICAgICR2X3NpemUgPSAkdl9jZW50cmFsX2Rpclsnb2Zmc2V0J107CiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKQogICAgewogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7CiAgICAgICR2X2J1ZmZlciA9IGZyZWFkKCR0aGlzLT56aXBfZmQsICR2X3JlYWRfc2l6ZSk7CiAgICAgIEBmd3JpdGUoJHZfemlwX3RlbXBfZmQsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgJHZfc2l6ZSAtPSAkdl9yZWFkX3NpemU7CiAgICB9CgogICAgLy8gLS0tLS0gQ29weSB0aGUgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZV90b19hZGQgaW50byB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgICR2X3NpemUgPSAkdl9jZW50cmFsX2Rpcl90b19hZGRbJ29mZnNldCddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBmcmVhZCgkcF9hcmNoaXZlX3RvX2FkZC0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOwogICAgICBAZndyaXRlKCR2X3ppcF90ZW1wX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIFN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGNlbnRyYWwgZGlyCiAgICAkdl9vZmZzZXQgPSBAZnRlbGwoJHZfemlwX3RlbXBfZmQpOwoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGJsb2NrIG9mIGZpbGUgaGVhZGVycyBmcm9tIHRoZSBvbGQgYXJjaGl2ZQogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyWydzaXplJ107CiAgICB3aGlsZSAoJHZfc2l6ZSAhPSAwKQogICAgewogICAgICAkdl9yZWFkX3NpemUgPSAoJHZfc2l6ZSA8IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUgPyAkdl9zaXplIDogUENMWklQX1JFQURfQkxPQ0tfU0laRSk7CiAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkdGhpcy0+emlwX2ZkLCAkdl9yZWFkX3NpemUpOwogICAgICBAZndyaXRlKCR2X3ppcF90ZW1wX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIENvcHkgdGhlIGJsb2NrIG9mIGZpbGUgaGVhZGVycyBmcm9tIHRoZSBhcmNoaXZlX3RvX2FkZAogICAgJHZfc2l6ZSA9ICR2X2NlbnRyYWxfZGlyX3RvX2FkZFsnc2l6ZSddOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHBfYXJjaGl2ZV90b19hZGQtPnppcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgQGZ3cml0ZSgkdl96aXBfdGVtcF9mZCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAkdl9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgIH0KCiAgICAvLyAtLS0tLSBNZXJnZSB0aGUgZmlsZSBjb21tZW50cwogICAgJHZfY29tbWVudCA9ICR2X2NlbnRyYWxfZGlyWydjb21tZW50J10uJyAnLiR2X2NlbnRyYWxfZGlyX3RvX2FkZFsnY29tbWVudCddOwoKICAgIC8vIC0tLS0tIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgKG5ldykgY2VudHJhbCBoZWFkZXIKICAgICR2X3NpemUgPSBAZnRlbGwoJHZfemlwX3RlbXBfZmQpLSR2X29mZnNldDsKCiAgICAvLyAtLS0tLSBTd2FwIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgIC8vIEhlcmUgaXMgYSB0cmljayA6IEkgc3dhcCB0aGUgdGVtcG9yYXJ5IGZkIHdpdGggdGhlIHppcCBmZCwgaW4gb3JkZXIgdG8gdXNlCiAgICAvLyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gdGhlIHRlbXBvcmFyeSBmaWwgYW5kIG5vdCB0aGUgcmVhbCBhcmNoaXZlIGZkCiAgICAkdl9zd2FwID0gJHRoaXMtPnppcF9mZDsKICAgICR0aGlzLT56aXBfZmQgPSAkdl96aXBfdGVtcF9mZDsKICAgICR2X3ppcF90ZW1wX2ZkID0gJHZfc3dhcDsKCiAgICAvLyAtLS0tLSBDcmVhdGUgdGhlIGNlbnRyYWwgZGlyIGZvb3RlcgogICAgaWYgKCgkdl9yZXN1bHQgPSAkdGhpcy0+cHJpdldyaXRlQ2VudHJhbEhlYWRlcigkdl9jZW50cmFsX2RpclsnZW50cmllcyddKyR2X2NlbnRyYWxfZGlyX3RvX2FkZFsnZW50cmllcyddLCAkdl9zaXplLCAkdl9vZmZzZXQsICR2X2NvbW1lbnQpKSAhPSAxKQogICAgewogICAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICAgJHBfYXJjaGl2ZV90b19hZGQtPnByaXZDbG9zZUZkKCk7CiAgICAgIEBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwogICAgICAkdGhpcy0+emlwX2ZkID0gbnVsbDsKCiAgICAgIC8vIC0tLS0tIFJlc2V0IHRoZSBmaWxlIGxpc3QKICAgICAgdW5zZXQoJHZfaGVhZGVyX2xpc3QpOwoKICAgICAgLy8gLS0tLS0gUmV0dXJuCiAgICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgICB9CgogICAgLy8gLS0tLS0gU3dhcCBiYWNrIHRoZSBmaWxlIGRlc2NyaXB0b3IKICAgICR2X3N3YXAgPSAkdGhpcy0+emlwX2ZkOwogICAgJHRoaXMtPnppcF9mZCA9ICR2X3ppcF90ZW1wX2ZkOwogICAgJHZfemlwX3RlbXBfZmQgPSAkdl9zd2FwOwoKICAgIC8vIC0tLS0tIENsb3NlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKICAgICRwX2FyY2hpdmVfdG9fYWRkLT5wcml2Q2xvc2VGZCgpOwoKICAgIC8vIC0tLS0tIENsb3NlIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgQGZjbG9zZSgkdl96aXBfdGVtcF9mZCk7CgogICAgLy8gLS0tLS0gRGVsZXRlIHRoZSB6aXAgZmlsZQogICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgQHVubGluaygkdGhpcy0+emlwbmFtZSk7CgogICAgLy8gLS0tLS0gUmVuYW1lIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgLy8gVEJDIDogSSBzaG91bGQgdGVzdCB0aGUgcmVzdWx0IC4uLgogICAgLy9AcmVuYW1lKCR2X3ppcF90ZW1wX25hbWUsICR0aGlzLT56aXBuYW1lKTsKICAgIFBjbFppcFV0aWxSZW5hbWUoJHZfemlwX3RlbXBfbmFtZSwgJHRoaXMtPnppcG5hbWUpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZEdXBsaWNhdGUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZEdXBsaWNhdGUoJHBfYXJjaGl2ZV9maWxlbmFtZSkKICB7CiAgICAkdl9yZXN1bHQ9MTsKCiAgICAvLyAtLS0tLSBMb29rIGlmIHRoZSAkcF9hcmNoaXZlX2ZpbGVuYW1lIGV4aXN0cwogICAgaWYgKCFpc19maWxlKCRwX2FyY2hpdmVfZmlsZW5hbWUpKQogICAgewoKICAgICAgLy8gLS0tLS0gTm90aGluZyB0byBkdXBsaWNhdGUsIHNvIGR1cGxpY2F0ZSBpcyBhIHN1Y2Nlc3MuCiAgICAgICR2X3Jlc3VsdCA9IDE7CgogICAgICAvLyAtLS0tLSBSZXR1cm4KICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKICAgIH0KCiAgICAvLyAtLS0tLSBPcGVuIHRoZSB6aXAgZmlsZQogICAgaWYgKCgkdl9yZXN1bHQ9JHRoaXMtPnByaXZPcGVuRmQoJ3diJykpICE9IDEpCiAgICB7CiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gJHZfcmVzdWx0OwogICAgfQoKICAgIC8vIC0tLS0tIE9wZW4gdGhlIHRlbXBvcmFyeSBmaWxlIGluIHdyaXRlIG1vZGUKICAgIGlmICgoJHZfemlwX3RlbXBfZmQgPSBAZm9wZW4oJHBfYXJjaGl2ZV9maWxlbmFtZSwgJ3JiJykpID09IDApCiAgICB7CiAgICAgICR0aGlzLT5wcml2Q2xvc2VGZCgpOwoKICAgICAgUGNsWmlwOjpwcml2RXJyb3JMb2coUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCwgJ1VuYWJsZSB0byBvcGVuIGFyY2hpdmUgZmlsZSBcJycuJHBfYXJjaGl2ZV9maWxlbmFtZS4nXCcgaW4gYmluYXJ5IHdyaXRlIG1vZGUnKTsKCiAgICAgIC8vIC0tLS0tIFJldHVybgogICAgICByZXR1cm4gUGNsWmlwOjplcnJvckNvZGUoKTsKICAgIH0KCiAgICAvLyAtLS0tLSBDb3B5IHRoZSBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgLy8gVEJDIDogSGVyZSBJIHNob3VsZCBiZXR0ZXIgYXBwZW5kIHRoZSBmaWxlIGFuZCBnbyBiYWNrIHRvIGVyYXNlIHRoZSBjZW50cmFsIGRpcgogICAgJHZfc2l6ZSA9IGZpbGVzaXplKCRwX2FyY2hpdmVfZmlsZW5hbWUpOwogICAgd2hpbGUgKCR2X3NpemUgIT0gMCkKICAgIHsKICAgICAgJHZfcmVhZF9zaXplID0gKCR2X3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHZfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAkdl9idWZmZXIgPSBmcmVhZCgkdl96aXBfdGVtcF9mZCwgJHZfcmVhZF9zaXplKTsKICAgICAgQGZ3cml0ZSgkdGhpcy0+emlwX2ZkLCAkdl9idWZmZXIsICR2X3JlYWRfc2l6ZSk7CiAgICAgICR2X3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgfQoKICAgIC8vIC0tLS0tIENsb3NlCiAgICAkdGhpcy0+cHJpdkNsb3NlRmQoKTsKCiAgICAvLyAtLS0tLSBDbG9zZSB0aGUgdGVtcG9yYXJ5IGZpbGUKICAgIEBmY2xvc2UoJHZfemlwX3RlbXBfZmQpOwoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZFcnJvckxvZygpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gcHJpdkVycm9yTG9nKCRwX2Vycm9yX2NvZGU9MCwgJHBfZXJyb3Jfc3RyaW5nPScnKQogIHsKICAgIGlmIChQQ0xaSVBfRVJST1JfRVhURVJOQUwgPT0gMSkgewogICAgICBQY2xFcnJvcigkcF9lcnJvcl9jb2RlLCAkcF9lcnJvcl9zdHJpbmcpOwogICAgfQogICAgZWxzZSB7CiAgICAgICR0aGlzLT5lcnJvcl9jb2RlID0gJHBfZXJyb3JfY29kZTsKICAgICAgJHRoaXMtPmVycm9yX3N0cmluZyA9ICRwX2Vycm9yX3N0cmluZzsKICAgIH0KICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZFcnJvclJlc2V0KCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2RXJyb3JSZXNldCgpCiAgewogICAgaWYgKFBDTFpJUF9FUlJPUl9FWFRFUk5BTCA9PSAxKSB7CiAgICAgIFBjbEVycm9yUmVzZXQoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAkdGhpcy0+ZXJyb3JfY29kZSA9IDA7CiAgICAgICR0aGlzLT5lcnJvcl9zdHJpbmcgPSAnJzsKICAgIH0KICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIHByaXZEaXNhYmxlTWFnaWNRdW90ZXMoKQogIHsKICAgICR2X3Jlc3VsdD0xOwoKICAgIC8vIC0tLS0tIExvb2sgaWYgZnVuY3Rpb24gZXhpc3RzCiAgICBpZiAoICAgKCFmdW5jdGlvbl9leGlzdHMoImdldF9tYWdpY19xdW90ZXNfcnVudGltZSIpKQoJICAgIHx8ICghZnVuY3Rpb25fZXhpc3RzKCJzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUiKSkpIHsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKCX0KCiAgICAvLyAtLS0tLSBMb29rIGlmIGFscmVhZHkgZG9uZQogICAgaWYgKCR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzICE9IC0xKSB7CiAgICAgIHJldHVybiAkdl9yZXN1bHQ7Cgl9CgoJLy8gLS0tLS0gR2V0IGFuZCBtZW1vcml6ZSB0aGUgbWFnaWNfcXVvdGUgdmFsdWUKCSR0aGlzLT5tYWdpY19xdW90ZXNfc3RhdHVzID0gQGdldF9tYWdpY19xdW90ZXNfcnVudGltZSgpOwoKCS8vIC0tLS0tIERpc2FibGUgbWFnaWNfcXVvdGVzCglpZiAoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMgPT0gMSkgewoJICBAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOwoJfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IHByaXZTd2FwQmFja01hZ2ljUXVvdGVzKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBwcml2U3dhcEJhY2tNYWdpY1F1b3RlcygpCiAgewogICAgJHZfcmVzdWx0PTE7CgogICAgLy8gLS0tLS0gTG9vayBpZiBmdW5jdGlvbiBleGlzdHMKICAgIGlmICggICAoIWZ1bmN0aW9uX2V4aXN0cygiZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIikpCgkgICAgfHwgKCFmdW5jdGlvbl9leGlzdHMoInNldF9tYWdpY19xdW90ZXNfcnVudGltZSIpKSkgewogICAgICByZXR1cm4gJHZfcmVzdWx0OwoJfQoKICAgIC8vIC0tLS0tIExvb2sgaWYgc29tZXRoaW5nIHRvIGRvCiAgICBpZiAoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMgIT0gLTEpIHsKICAgICAgcmV0dXJuICR2X3Jlc3VsdDsKCX0KCgkvLyAtLS0tLSBTd2FwIGJhY2sgbWFnaWNfcXVvdGVzCglpZiAoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMgPT0gMSkgewogIAkgIEBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoJHRoaXMtPm1hZ2ljX3F1b3Rlc19zdGF0dXMpOwoJfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgfQogIC8vIEVuZCBvZiBjbGFzcwogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBQY2xaaXBVdGlsUGF0aFJlZHVjdGlvbigpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vIFBhcmFtZXRlcnMgOgogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gUGNsWmlwVXRpbFBhdGhSZWR1Y3Rpb24oJHBfZGlyKQogIHsKICAgICR2X3Jlc3VsdCA9ICIiOwoKICAgIC8vIC0tLS0tIExvb2sgZm9yIG5vdCBlbXB0eSBwYXRoCiAgICBpZiAoJHBfZGlyICE9ICIiKSB7CiAgICAgIC8vIC0tLS0tIEV4cGxvZGUgcGF0aCBieSBkaXJlY3RvcnkgbmFtZXMKICAgICAgJHZfbGlzdCA9IGV4cGxvZGUoIi8iLCAkcF9kaXIpOwoKICAgICAgLy8gLS0tLS0gU3R1ZHkgZGlyZWN0b3JpZXMgZnJvbSBsYXN0IHRvIGZpcnN0CiAgICAgICR2X3NraXAgPSAwOwogICAgICBmb3IgKCRpPXNpemVvZigkdl9saXN0KS0xOyAkaT49MDsgJGktLSkgewogICAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGN1cnJlbnQgcGF0aAogICAgICAgIGlmICgkdl9saXN0WyRpXSA9PSAiLiIpIHsKICAgICAgICAgIC8vIC0tLS0tIElnbm9yZSB0aGlzIGRpcmVjdG9yeQogICAgICAgICAgLy8gU2hvdWxkIGJlIHRoZSBmaXJzdCAkaT0wLCBidXQgbm8gY2hlY2sgaXMgZG9uZQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgkdl9saXN0WyRpXSA9PSAiLi4iKSB7CgkJICAkdl9za2lwKys7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCR2X2xpc3RbJGldID09ICIiKSB7CgkJICAvLyAtLS0tLSBGaXJzdCAnLycgaS5lLiByb290IHNsYXNoCgkJICBpZiAoJGkgPT0gMCkgewogICAgICAgICAgICAkdl9yZXN1bHQgPSAiLyIuJHZfcmVzdWx0OwoJCSAgICBpZiAoJHZfc2tpcCA+IDApIHsKCQkgICAgICAgIC8vIC0tLS0tIEl0IGlzIGFuIGludmFsaWQgcGF0aCwgc28gdGhlIHBhdGggaXMgbm90IG1vZGlmaWVkCgkJICAgICAgICAvLyBUQkMKCQkgICAgICAgICR2X3Jlc3VsdCA9ICRwX2RpcjsKICAgICAgICAgICAgICAgICR2X3NraXAgPSAwOwoJCSAgICB9CgkJICB9CgkJICAvLyAtLS0tLSBMYXN0ICcvJyBpLmUuIGluZGljYXRlcyBhIGRpcmVjdG9yeQoJCSAgZWxzZSBpZiAoJGkgPT0gKHNpemVvZigkdl9saXN0KS0xKSkgewogICAgICAgICAgICAkdl9yZXN1bHQgPSAkdl9saXN0WyRpXTsKCQkgIH0KCQkgIC8vIC0tLS0tIERvdWJsZSAnLycgaW5zaWRlIHRoZSBwYXRoCgkJICBlbHNlIHsKICAgICAgICAgICAgLy8gLS0tLS0gSWdub3JlIG9ubHkgdGhlIGRvdWJsZSAnLy8nIGluIHBhdGgsCiAgICAgICAgICAgIC8vIGJ1dCBub3QgdGhlIGZpcnN0IGFuZCBsYXN0ICcvJwoJCSAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCQkgIC8vIC0tLS0tIExvb2sgZm9yIGl0ZW0gdG8gc2tpcAoJCSAgaWYgKCR2X3NraXAgPiAwKSB7CgkJICAgICR2X3NraXAtLTsKCQkgIH0KCQkgIGVsc2UgewogICAgICAgICAgICAkdl9yZXN1bHQgPSAkdl9saXN0WyRpXS4oJGkhPShzaXplb2YoJHZfbGlzdCktMSk/Ii8iLiR2X3Jlc3VsdDoiIik7CgkJICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyAtLS0tLSBMb29rIGZvciBza2lwCiAgICAgIGlmICgkdl9za2lwID4gMCkgewogICAgICAgIHdoaWxlICgkdl9za2lwID4gMCkgewogICAgICAgICAgICAkdl9yZXN1bHQgPSAnLi4vJy4kdl9yZXN1bHQ7CiAgICAgICAgICAgICR2X3NraXAtLTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyAtLS0tLSBSZXR1cm4KICAgIHJldHVybiAkdl9yZXN1bHQ7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gRnVuY3Rpb24gOiBQY2xaaXBVdGlsUGF0aEluY2x1c2lvbigpCiAgLy8gRGVzY3JpcHRpb24gOgogIC8vICAgVGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgaWYgdGhlIHBhdGggJHBfcGF0aCBpcyB1bmRlciB0aGUgJHBfZGlyIHRyZWUuIE9yLAogIC8vICAgc2FpZCBpbiBhbiBvdGhlciB3YXksIGlmIHRoZSBmaWxlIG9yIHN1Yi1kaXIgJHBfcGF0aCBpcyBpbnNpZGUgdGhlIGRpcgogIC8vICAgJHBfZGlyLgogIC8vICAgVGhlIGZ1bmN0aW9uIGluZGljYXRlcyBhbHNvIGlmIHRoZSBwYXRoIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGRpci4KICAvLyAgIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgcGF0aCB3aXRoIGR1cGxpY2F0ZWQgJy8nIGxpa2UgJy8vJywgYnV0IGRvZXMgbm90CiAgLy8gICBzdXBwb3J0ICcuJyBvciAnLi4nIHN0YXRlbWVudHMuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gUmV0dXJuIFZhbHVlcyA6CiAgLy8gICAwIGlmICRwX3BhdGggaXMgbm90IGluc2lkZSBkaXJlY3RvcnkgJHBfZGlyCiAgLy8gICAxIGlmICRwX3BhdGggaXMgaW5zaWRlIGRpcmVjdG9yeSAkcF9kaXIKICAvLyAgIDIgaWYgJHBfcGF0aCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzICRwX2RpcgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb24gUGNsWmlwVXRpbFBhdGhJbmNsdXNpb24oJHBfZGlyLCAkcF9wYXRoKQogIHsKICAgICR2X3Jlc3VsdCA9IDE7CgogICAgLy8gLS0tLS0gTG9vayBmb3IgcGF0aCBiZWdpbm5pbmcgYnkgLi8KICAgIGlmICggICAoJHBfZGlyID09ICcuJykKICAgICAgICB8fCAoKHN0cmxlbigkcF9kaXIpID49MikgJiYgKHN1YnN0cigkcF9kaXIsIDAsIDIpID09ICcuLycpKSkgewogICAgICAkcF9kaXIgPSBQY2xaaXBVdGlsVHJhbnNsYXRlV2luUGF0aChnZXRjd2QoKSwgRkFMU0UpLicvJy5zdWJzdHIoJHBfZGlyLCAxKTsKICAgIH0KICAgIGlmICggICAoJHBfcGF0aCA9PSAnLicpCiAgICAgICAgfHwgKChzdHJsZW4oJHBfcGF0aCkgPj0yKSAmJiAoc3Vic3RyKCRwX3BhdGgsIDAsIDIpID09ICcuLycpKSkgewogICAgICAkcF9wYXRoID0gUGNsWmlwVXRpbFRyYW5zbGF0ZVdpblBhdGgoZ2V0Y3dkKCksIEZBTFNFKS4nLycuc3Vic3RyKCRwX3BhdGgsIDEpOwogICAgfQoKICAgIC8vIC0tLS0tIEV4cGxvZGUgZGlyIGFuZCBwYXRoIGJ5IGRpcmVjdG9yeSBzZXBhcmF0b3IKICAgICR2X2xpc3RfZGlyID0gZXhwbG9kZSgiLyIsICRwX2Rpcik7CiAgICAkdl9saXN0X2Rpcl9zaXplID0gc2l6ZW9mKCR2X2xpc3RfZGlyKTsKICAgICR2X2xpc3RfcGF0aCA9IGV4cGxvZGUoIi8iLCAkcF9wYXRoKTsKICAgICR2X2xpc3RfcGF0aF9zaXplID0gc2l6ZW9mKCR2X2xpc3RfcGF0aCk7CgogICAgLy8gLS0tLS0gU3R1ZHkgZGlyZWN0b3JpZXMgcGF0aHMKICAgICRpID0gMDsKICAgICRqID0gMDsKICAgIHdoaWxlICgoJGkgPCAkdl9saXN0X2Rpcl9zaXplKSAmJiAoJGogPCAkdl9saXN0X3BhdGhfc2l6ZSkgJiYgKCR2X3Jlc3VsdCkpIHsKCiAgICAgIC8vIC0tLS0tIExvb2sgZm9yIGVtcHR5IGRpciAocGF0aCByZWR1Y3Rpb24pCiAgICAgIGlmICgkdl9saXN0X2RpclskaV0gPT0gJycpIHsKICAgICAgICAkaSsrOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICgkdl9saXN0X3BhdGhbJGpdID09ICcnKSB7CiAgICAgICAgJGorKzsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgLy8gLS0tLS0gQ29tcGFyZSB0aGUgaXRlbXMKICAgICAgaWYgKCgkdl9saXN0X2RpclskaV0gIT0gJHZfbGlzdF9wYXRoWyRqXSkgJiYgKCR2X2xpc3RfZGlyWyRpXSAhPSAnJykgJiYgKCAkdl9saXN0X3BhdGhbJGpdICE9ICcnKSkgIHsKICAgICAgICAkdl9yZXN1bHQgPSAwOwogICAgICB9CgogICAgICAvLyAtLS0tLSBOZXh0IGl0ZW1zCiAgICAgICRpKys7CiAgICAgICRqKys7CiAgICB9CgogICAgLy8gLS0tLS0gTG9vayBpZiBldmVyeXRoaW5nIHNlZW1zIHRvIGJlIHRoZSBzYW1lCiAgICBpZiAoJHZfcmVzdWx0KSB7CiAgICAgIC8vIC0tLS0tIFNraXAgYWxsIHRoZSBlbXB0eSBpdGVtcwogICAgICB3aGlsZSAoKCRqIDwgJHZfbGlzdF9wYXRoX3NpemUpICYmICgkdl9saXN0X3BhdGhbJGpdID09ICcnKSkgJGorKzsKICAgICAgd2hpbGUgKCgkaSA8ICR2X2xpc3RfZGlyX3NpemUpICYmICgkdl9saXN0X2RpclskaV0gPT0gJycpKSAkaSsrOwoKICAgICAgaWYgKCgkaSA+PSAkdl9saXN0X2Rpcl9zaXplKSAmJiAoJGogPj0gJHZfbGlzdF9wYXRoX3NpemUpKSB7CiAgICAgICAgLy8gLS0tLS0gVGhlcmUgYXJlIGV4YWN0bHkgdGhlIHNhbWUKICAgICAgICAkdl9yZXN1bHQgPSAyOwogICAgICB9CiAgICAgIGVsc2UgaWYgKCRpIDwgJHZfbGlzdF9kaXJfc2l6ZSkgewogICAgICAgIC8vIC0tLS0tIFRoZSBwYXRoIGlzIHNob3J0ZXIgdGhhbiB0aGUgZGlyCiAgICAgICAgJHZfcmVzdWx0ID0gMDsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IFBjbFppcFV0aWxDb3B5QmxvY2soKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX21vZGUgOiByZWFkL3dyaXRlIGNvbXByZXNzaW9uIG1vZGUKICAvLyAgICAgICAgICAgICAwIDogc3JjICYgZGVzdCBub3JtYWwKICAvLyAgICAgICAgICAgICAxIDogc3JjIGd6aXAsIGRlc3Qgbm9ybWFsCiAgLy8gICAgICAgICAgICAgMiA6IHNyYyBub3JtYWwsIGRlc3QgZ3ppcAogIC8vICAgICAgICAgICAgIDMgOiBzcmMgJiBkZXN0IGd6aXAKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIFBjbFppcFV0aWxDb3B5QmxvY2soJHBfc3JjLCAkcF9kZXN0LCAkcF9zaXplLCAkcF9tb2RlPTApCiAgewogICAgJHZfcmVzdWx0ID0gMTsKCiAgICBpZiAoJHBfbW9kZT09MCkKICAgIHsKICAgICAgd2hpbGUgKCRwX3NpemUgIT0gMCkKICAgICAgewogICAgICAgICR2X3JlYWRfc2l6ZSA9ICgkcF9zaXplIDwgUENMWklQX1JFQURfQkxPQ0tfU0laRSA/ICRwX3NpemUgOiBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFKTsKICAgICAgICAkdl9idWZmZXIgPSBAZnJlYWQoJHBfc3JjLCAkdl9yZWFkX3NpemUpOwogICAgICAgIEBmd3JpdGUoJHBfZGVzdCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAgICRwX3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgkcF9tb2RlPT0xKQogICAgewogICAgICB3aGlsZSAoJHBfc2l6ZSAhPSAwKQogICAgICB7CiAgICAgICAgJHZfcmVhZF9zaXplID0gKCRwX3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHBfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAgICR2X2J1ZmZlciA9IEBnenJlYWQoJHBfc3JjLCAkdl9yZWFkX3NpemUpOwogICAgICAgIEBmd3JpdGUoJHBfZGVzdCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAgICRwX3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgkcF9tb2RlPT0yKQogICAgewogICAgICB3aGlsZSAoJHBfc2l6ZSAhPSAwKQogICAgICB7CiAgICAgICAgJHZfcmVhZF9zaXplID0gKCRwX3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHBfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAgICR2X2J1ZmZlciA9IEBmcmVhZCgkcF9zcmMsICR2X3JlYWRfc2l6ZSk7CiAgICAgICAgQGd6d3JpdGUoJHBfZGVzdCwgJHZfYnVmZmVyLCAkdl9yZWFkX3NpemUpOwogICAgICAgICRwX3NpemUgLT0gJHZfcmVhZF9zaXplOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmICgkcF9tb2RlPT0zKQogICAgewogICAgICB3aGlsZSAoJHBfc2l6ZSAhPSAwKQogICAgICB7CiAgICAgICAgJHZfcmVhZF9zaXplID0gKCRwX3NpemUgPCBQQ0xaSVBfUkVBRF9CTE9DS19TSVpFID8gJHBfc2l6ZSA6IFBDTFpJUF9SRUFEX0JMT0NLX1NJWkUpOwogICAgICAgICR2X2J1ZmZlciA9IEBnenJlYWQoJHBfc3JjLCAkdl9yZWFkX3NpemUpOwogICAgICAgIEBnendyaXRlKCRwX2Rlc3QsICR2X2J1ZmZlciwgJHZfcmVhZF9zaXplKTsKICAgICAgICAkcF9zaXplIC09ICR2X3JlYWRfc2l6ZTsKICAgICAgfQogICAgfQoKICAgIC8vIC0tLS0tIFJldHVybgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IFBjbFppcFV0aWxSZW5hbWUoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZG8gYSBzaW1wbGUgcmVuYW1lKCkgZnVuY3Rpb24uIElmIGl0IGZhaWxzLCBpdAogIC8vICAgdHJpZXMgdG8gY29weSB0aGUgJHBfc3JjIGZpbGUgaW4gYSBuZXcgJHBfZGVzdCBmaWxlIGFuZCB0aGVuIHVubGluayB0aGUKICAvLyAgIGZpcnN0IG9uZS4KICAvLyBQYXJhbWV0ZXJzIDoKICAvLyAgICRwX3NyYyA6IE9sZCBmaWxlbmFtZQogIC8vICAgJHBfZGVzdCA6IE5ldyBmaWxlbmFtZQogIC8vIFJldHVybiBWYWx1ZXMgOgogIC8vICAgMSBvbiBzdWNjZXNzLCAwIG9uIGZhaWx1cmUuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBQY2xaaXBVdGlsUmVuYW1lKCRwX3NyYywgJHBfZGVzdCkKICB7CiAgICAkdl9yZXN1bHQgPSAxOwoKICAgIC8vIC0tLS0tIFRyeSB0byByZW5hbWUgdGhlIGZpbGVzCiAgICBpZiAoIUByZW5hbWUoJHBfc3JjLCAkcF9kZXN0KSkgewoKICAgICAgLy8gLS0tLS0gVHJ5IHRvIGNvcHkgJiB1bmxpbmsgdGhlIHNyYwogICAgICBpZiAoIUBjb3B5KCRwX3NyYywgJHBfZGVzdCkpIHsKICAgICAgICAkdl9yZXN1bHQgPSAwOwogICAgICB9CiAgICAgIGVsc2UgaWYgKCFAdW5saW5rKCRwX3NyYykpIHsKICAgICAgICAkdl9yZXN1bHQgPSAwOwogICAgICB9CiAgICB9CgogICAgLy8gLS0tLS0gUmV0dXJuCiAgICByZXR1cm4gJHZfcmVzdWx0OwogIH0KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEZ1bmN0aW9uIDogUGNsWmlwVXRpbE9wdGlvblRleHQoKQogIC8vIERlc2NyaXB0aW9uIDoKICAvLyAgIFRyYW5zbGF0ZSBvcHRpb24gdmFsdWUgaW4gdGV4dC4gTWFpbmx5IGZvciBkZWJ1ZyBwdXJwb3NlLgogIC8vIFBhcmFtZXRlcnMgOgogIC8vICAgJHBfb3B0aW9uIDogdGhlIG9wdGlvbiB2YWx1ZS4KICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIFRoZSBvcHRpb24gdGV4dCB2YWx1ZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIFBjbFppcFV0aWxPcHRpb25UZXh0KCRwX29wdGlvbikKICB7CgogICAgJHZfbGlzdCA9IGdldF9kZWZpbmVkX2NvbnN0YW50cygpOwogICAgZm9yIChyZXNldCgkdl9saXN0KTsgJHZfa2V5ID0ga2V5KCR2X2xpc3QpOyBuZXh0KCR2X2xpc3QpKSB7CgkgICAgJHZfcHJlZml4ID0gc3Vic3RyKCR2X2tleSwgMCwgMTApOwoJICAgIGlmICgoICAgKCR2X3ByZWZpeCA9PSAnUENMWklQX09QVCcpCiAgICAgICAgICAgfHwgKCR2X3ByZWZpeCA9PSAnUENMWklQX0NCXycpCiAgICAgICAgICAgfHwgKCR2X3ByZWZpeCA9PSAnUENMWklQX0FUVCcpKQoJICAgICAgICAmJiAoJHZfbGlzdFskdl9rZXldID09ICRwX29wdGlvbikpIHsKICAgICAgICByZXR1cm4gJHZfa2V5OwoJICAgIH0KICAgIH0KCiAgICAkdl9yZXN1bHQgPSAnVW5rbm93bic7CgogICAgcmV0dXJuICR2X3Jlc3VsdDsKICB9CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbiA6IFBjbFppcFV0aWxUcmFuc2xhdGVXaW5QYXRoKCkKICAvLyBEZXNjcmlwdGlvbiA6CiAgLy8gICBUcmFuc2xhdGUgd2luZG93cyBwYXRoIGJ5IHJlcGxhY2luZyAnXCcgYnkgJy8nIGFuZCBvcHRpb25hbGx5IHJlbW92aW5nCiAgLy8gICBkcml2ZSBsZXR0ZXIuCiAgLy8gUGFyYW1ldGVycyA6CiAgLy8gICAkcF9wYXRoIDogcGF0aCB0byB0cmFuc2xhdGUuCiAgLy8gICAkcF9yZW1vdmVfZGlza19sZXR0ZXIgOiB0cnVlIHwgZmFsc2UKICAvLyBSZXR1cm4gVmFsdWVzIDoKICAvLyAgIFRoZSBwYXRoIHRyYW5zbGF0ZWQuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBQY2xaaXBVdGlsVHJhbnNsYXRlV2luUGF0aCgkcF9wYXRoLCAkcF9yZW1vdmVfZGlza19sZXR0ZXI9dHJ1ZSkKICB7CiAgICBpZiAoc3RyaXN0cihwaHBfdW5hbWUoKSwgJ3dpbmRvd3MnKSkgewogICAgICAvLyAtLS0tLSBMb29rIGZvciBwb3RlbnRpYWwgZGlzayBsZXR0ZXIKICAgICAgaWYgKCgkcF9yZW1vdmVfZGlza19sZXR0ZXIpICYmICgoJHZfcG9zaXRpb24gPSBzdHJwb3MoJHBfcGF0aCwgJzonKSkgIT0gZmFsc2UpKSB7CiAgICAgICAgICAkcF9wYXRoID0gc3Vic3RyKCRwX3BhdGgsICR2X3Bvc2l0aW9uKzEpOwogICAgICB9CiAgICAgIC8vIC0tLS0tIENoYW5nZSBwb3RlbnRpYWwgd2luZG93cyBkaXJlY3Rvcnkgc2VwYXJhdG9yCiAgICAgIGlmICgoc3RycG9zKCRwX3BhdGgsICdcXCcpID4gMCkgfHwgKHN1YnN0cigkcF9wYXRoLCAwLDEpID09ICdcXCcpKSB7CiAgICAgICAgICAkcF9wYXRoID0gc3RydHIoJHBfcGF0aCwgJ1xcJywgJy8nKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICRwX3BhdGg7CiAgfQogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKPz4K
###PACKDATA,FILE_END,/_importbuddy/importbuddy/lib/pclzip/pclzip.php,importbuddy/lib/pclzip/pclzip.php
###PACKDATA,FILE_START,/classes/_migrate_database.php,importbuddy/classes/_migrate_database.php
PD9waHAKLyoqCiAqCV9taWdyYXRlX2RhdGFiYXNlLnBocAogKgogKglIYW5kbGVzIGFsbCBTUUwgZGF0YSBtaWdyYXRpb24gZm9yIGJvdGggaW1wb3J0YnVkZHkgYW5kIG11bHRpc2l0ZSBpbXBvcnRpbmcuCiAqCUhhbmRsZXMgdXBkYXRpbmcgcGF0aHMsIFVSTHMsIGV0Yy4KICoJCiAqCVZlcnNpb246IDEuMC4xCiAqCUF1dGhvcjogRHVzdGluIEJvbHRvbgogKglBdXRob3IgVVJJOiBodHRwOi8vZHVzdGluYm9sdG9uLmNvbS8KICoKICoJUkVRVUlSRU1FTlRTOgogKgogKgkxKSBTZXQgdXAgdGhlIHZhcmlhYmxlICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgdG8gdGhlIGRlc3RpbmF0aW9uIHR5cGUgaWYgbm9uLXN0YW5kYWxvbmUgKGRlZmF1bHQpIG9yIE11bHRpc2l0ZSBOZXR3b3JrIChhdXRvLWRldGVjdGVkKS4gVmFsaWQgdmFsdWVzOiBzdGFuZGFsb25lLCBtdWx0aXNpdGVfaW1wb3J0LCBtdWx0aXNpdGVfbmV0d29yawogKgkyKSBNeXNxbCBzaG91bGQgYWxyZWFkeSBiZSBjb25uZWN0ZWQuCiAqCTMpICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J10gc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIERBVCBmaWxlIGFycmF5LgogKgk0KSBJZiBtaWdyYXRpbmcgYSBuZXR3b3JrIC0+IG5ldHdvcmsgdGhlbiBzZXQgdXAgdGhlIHZhcmlhYmxlICR0aGlzLT5uZXR3b3JrUHJlZml4IHRvIGJlIHRoZSBkYXRhYmFzZSBwcmVmaXggb2YgdGhlIG5ldHdvcmsuIE5lZWRlZCB0byBhY2Nlc3MgdXNlcnMgdGFibGVzLgogKgk1KSBJZiBtdWx0aXNpdGVfaW1wb3J0IGlzIERFU1RJTkFUSU9OIHRoZW4gJHdwX3VwbG9hZF9kaXIgKHVwbG9hZF9wYXRoIG9wdGlvbiksICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddIChmaWxldXBsb2FkX3VybCBvcHRpb24pIG11c3QgYmUgc2V0LgogKgogKglVU0VEIEJZOgogKgogKgkxKSBJbXBvcnRCdWRkeQogKgkyKSBNdWx0aXNpdGUgSW1wb3J0IC8gUmVzdG9yZQogKgogKi8KCi8vIE5PVEVTOgovLwkJKiBFeGFtcGxlIGluc3RhbnRpYXRpb246ICRtaWdyYXRlID0gbmV3IGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQiggJ3N0YW5kYWxvbmUnLCAkdGhpcy0+X3N0YXRlICk7Ci8vCQkqIGRicmVwbGFjZSBjbGFzcyBpbnRlbGxpZ2VudGx5IGlnbm9yZXMgcmVwbGFjaW5nIHZhbHVlcyB3aXRoIGlkZW50aWNhbCB2YWx1ZXMgZm9yIHBlcmZvcm1hbmNlLgoKCmdsb2JhbCAkd3BkYjsKCmlmICggaXNzZXQoICRkZXN0aW5hdGlvbl90eXBlICkgJiYgKCAkZGVzdGluYXRpb25fdHlwZSA9PSAnbXVsdGlzaXRlX2ltcG9ydCcgKSApIHsgLy8gTVVMVElTSVRFIElNUE9SVAoJCgkkc3RhdGUgPSBhcnJheSgKCQknZGF0JyA9PiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RhdF9maWxlJ10sCgkJJ21heEV4ZWN1dGlvblRpbWUnID0+IDMwLAoJCSdzaXRldXJsJyA9PiAkZGVzdGluYXRpb25fc2l0ZXVybCwKCQknaG9tZXVybCcgPT4gJGRlc3RpbmF0aW9uX2hvbWUsCgkJJ3VwbG9hZF91cmwnID0+ICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddLCAvLyBNUyByZWxhdGVkIHN0dWZmLgoJCSdkYXRhYmFzZVNldHRpbmdzJyA9PiBhcnJheSgKCQkJCQkJCQkJJ3ByZWZpeCcgPT4gJG11bHRpc2l0ZV9uZXR3b3JrX2RiX3ByZWZpeCwKCQkJCQkJCQkJJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnID0+IHRydWUsCgkJCQkJCQkJKQoJKTsKCQoJJG1pZ3JhdGUgPSBuZXcgYmFja3VwYnVkZHlfbWlncmF0ZURCKCAkZGVzdGluYXRpb25fdHlwZSwgJHN0YXRlLCAkbXVsdGlzaXRlX25ldHdvcmtfZGJfcHJlZml4ICk7CgkKfQoKCgpjbGFzcyBiYWNrdXBidWRkeV9taWdyYXRlREIgewoKCWNvbnN0IFRJTUVfV0lHR0xFX1JPT00gPSAxOyAvLyBOdW1iZXIgb2Ygc2Vjb25kcyB0byBmdWRnZSB1cCB0aGUgdGltZSBlbGFwc2VkIHRvIGdpdmUgYSBsaXR0bGUgd2lnZ2xlIHJvb20gc28gd2UgZG9uJ3QgYWNjaWRlbnRseSBoaXQgdGhlIGVkZ2UgYW5kIHRpbWUgb3V0LgoJCgl2YXIgJHN0YXJ0VGltZTsgLy8gTWljcm90aW1lIG1pZ3JhdGlvbiBzdGFydGVkLgoJCgl2YXIgJHJlc3RvcmVEYXRhOwoJdmFyICRzb3VyY2VUeXBlOwoJdmFyICRkZXN0aW5hdGlvblR5cGU7Cgl2YXIgJG5ldHdvcmtQcmVmaXg7Cgl2YXIgJG92ZXJyaWRlUHJlZml4OyAvLyBQcmVmaXggdG8gdXNlLiBEZWZhdWx0cyB0byAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J10uIEFsbG93cyBvdmVycmlkaW5nLgoKCXZhciAkb2xkVVJMczsKCXZhciAkbmV3VVJMczsKCQoJdmFyICRvbGRGdWxsUmVwbGFjZTsKCXZhciAkbmV3RnVsbFJlcGxhY2U7CgkKCXZhciAkbmV0d29ya1VwbG9hZFVSTFJlYWw7Cgl2YXIgJGJydXRlZm9yY2VFeGNsdWRlZFRhYmxlczsKCgkKCS8vIERFU1RJTkFUSU9OIFRZUEUuIFZhbGlkIHZhbHVlczogc3RhbmRhbG9uZSwgbXVsdGlzaXRlX2ltcG9ydCwgbXVsdGlzaXRlX25ldHdvcmsKCS8vIFJFVFVSTlM6IHRydWUgb24gc3VjY2VzcyBmdWxseSBjb21wbGV0aW5nLCBhcnJheSggcmVzdW1lRnVuY3Rpb24sIHJlc3VtZVBvaW50ICkgb24gbmVlZGluZyBjaHVua2luZy4gZmFsc2Ugb24gZmFpbHVyZS4KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCAkZGVzdGluYXRpb25UeXBlLCAkcmVzdG9yZURhdGEsICRuZXR3b3JrUHJlZml4ID0gJycsICRvdmVycmlkZVByZWZpeCA9ICcnICkgewoKCQkkdGhpcy0+c3RhcnRUaW1lID0gbWljcm90aW1lKCB0cnVlICk7IC8vIFN0YXJ0IHRyYWNraW5nIGZvciBlbGFwc2VkIHRpbWUuCgkJCgkJJHRoaXMtPmRlc3RpbmF0aW9uVHlwZSA9ICRkZXN0aW5hdGlvblR5cGU7CgkJJHRoaXMtPnJlc3RvcmVEYXRhID0gJiRyZXN0b3JlRGF0YTsKCQkKCQlpZiAoICcnID09ICRvdmVycmlkZVByZWZpeCApIHsgLy8gTm90IG92ZXJyaWRpbmcgcHJlZml4LgoJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J107CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VzaW5nIG5vcm1hbCBtb2RlIGRhdGFiYXNlIHByZWZpeCBiYXNlZCBvbiBzZXR0aW5nczogYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnYC4nICk7CgkJfSBlbHNlIHsgLy8gT3ZlcnJpZGluZyBwcmVmaXguCgkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCA9ICRvdmVycmlkZVByZWZpeDsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgb3ZlcnJpZGUgZGF0YWJhc2UgcHJlZml4OiBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdgLicgKTsKCQl9CgkJCgkJJHRoaXMtPm5ldHdvcmtQcmVmaXggPSAkbmV0d29ya1ByZWZpeDsgCgkJaWYgKCAnJyA9PSAkbmV0d29ya1ByZWZpeCApIHsKCQkJJHRoaXMtPm5ldHdvcmtQcmVmaXggPSAkdGhpcy0+b3ZlcnJpZGVQcmVmaXg7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdNaWdyYXRpbmcgZGF0YWJhc2UgY29udGVudC4uLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXN0aW5hdGlvbiBzaXRlIHRhYmxlIHByZWZpeDogJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCApOwoKCQlpZiAoICcnID09ICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddICkgeyAvLyBJZiBubyBob21lIHRoZW4gd2Ugc2V0IGl0IGVxdWFsIHRvIHNpdGUgVVJMLgoJCQkkc2V0dGluZ3NbJ2hvbWV1cmwnXSA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddOwoJCX0KCQkKCQkvLyBTb3VyY2UgdHlwZS4gVmFsaWQgdmFsdWVzOiBuZXR3b3JrLCBtdWx0aXNpdGVfZXhwb3J0IChzaW5nbGUgc2l0ZSBleHBvcnRlZCBmcm9tIG11bHRpc2l0ZSBuZXR3b3JrKSwgc3RhbmRhbG9uZQoJCWlmICggaXNzZXQoICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICdpc19tdWx0aXNpdGUnIF0gKSAmJiAoICggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsgJ2lzX211bHRpc2l0ZScgXSA9PT0gdHJ1ZSApIHx8ICggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsgJ2lzX211bHRpc2l0ZScgXSA9PT0gJ3RydWUnICkgKSApIHsKCQkJJHRoaXMtPnNvdXJjZVR5cGUgPSAnbXVsdGlzaXRlX25ldHdvcmsnOwoJCQkkdGhpcy0+ZGVzdGluYXRpb25UeXBlID0gJ211bHRpc2l0ZV9uZXR3b3JrJzsKCQl9IGVsc2VpZiAoIGlzc2V0KCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAnaXNfbXVsdGlzaXRlX2V4cG9ydCcgXSApICYmICggKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAnaXNfbXVsdGlzaXRlX2V4cG9ydCcgXSA9PT0gdHJ1ZSApIHx8ICggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsgJ2lzX211bHRpc2l0ZV9leHBvcnQnIF0gPT09ICd0cnVlJyApICkgKSB7CgkJCSR0aGlzLT5zb3VyY2VUeXBlID0gJ211bHRpc2l0ZV9leHBvcnQnOwoJCX0gZWxzZSB7CgkJCSR0aGlzLT5zb3VyY2VUeXBlID0gJ3N0YW5kYWxvbmUnOwoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNaWdyYXRpb24gdHlwZTogYCcgLiAkdGhpcy0+c291cmNlVHlwZSAuICdgIHRvIGAnIC4gJHRoaXMtPmRlc3RpbmF0aW9uVHlwZSAuICdgLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZXN0aW5hdGlvbiBTaXRlIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGVzdGluYXRpb24gSG9tZSBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ2hvbWV1cmwnXSApOwoJCQoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCQoJCgkKCWZ1bmN0aW9uIG1pZ3JhdGUoKSB7CgkJaWYgKCBpc19hcnJheSggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVTdGVwcyddICkgKSB7IC8vIFJlc3VtaW5nIHNvIHVzZSBleGlzdGluZyBzdGVwcyBsaXN0LgoJCQkkc3RlcHMgPSAmJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVSZXN1bWVTdGVwcyddOwoJCX0gZWxzZSB7IC8vIE5vdCByZXN1bWluZyBzbyBidWlsZCBzdGVwcyBsaXN0LgoJCQkvLyBNaWdyYXRlIGFueXRoaW5nIGNvbW1vbiB0byBhbGwgdHlwZXMuCgkJCSRzdGVwcyA9IGFycmF5KCAnbWlncmF0ZUNvbW1vbicgKTsKCQkJLy8gTWlncmF0ZSBOZXR3b3JrIC0+IE5ldHdvcmsuCgkJCWlmICggKCAkdGhpcy0+c291cmNlVHlwZSA9PSAnbXVsdGlzaXRlX25ldHdvcmsnICkgJiYgKCAkdGhpcy0+ZGVzdGluYXRpb25UeXBlID09ICdtdWx0aXNpdGVfbmV0d29yaycgKSApIHsKCQkJCSRzdGVwc1tdID0gJ21pZ3JhdGVOZXR3b3JrVG9OZXR3b3JrJzsKCQkJfQoJCQkvLyBTdGFuZGFsb25lIC0+IE11bHRpc2l0ZSBJbXBvcnQuCgkJCWlmICggKCAkdGhpcy0+c291cmNlVHlwZSA9PSAnc3RhbmRhbG9uZScgKSAmJiAoICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgPT0gJ211bHRpc2l0ZV9pbXBvcnQnICkgKSB7CgkJCQkkc3RlcHNbXSA9ICdtaWdyYXRlU3RhbmRhbG9uZVRvTXVsdGlzaXRlSW1wb3J0JzsKCQkJfQoJCQkvLyBNdWx0aXNpdGUgRXhwb3J0IC0+IE11bHRpc2l0ZSBJbXBvcnQuCgkJCWlmICggKCAkdGhpcy0+c291cmNlVHlwZSA9PSAnbXVsdGlzaXRlX2V4cG9ydCcgKSAmJiAoICR0aGlzLT5kZXN0aW5hdGlvblR5cGUgPT0gJ211bHRpc2l0ZV9pbXBvcnQnICkgKSB7CgkJCQkkc3RlcHNbXSA9ICdtaWdyYXRlTXVsdGlzaXRlSW1wb3J0VG9NdWx0aXNpdGVFeHBvcnQnOwoJCQl9CgkJCS8vIE11bHRpc2l0ZSBFeHBvcnQgLT4gU3RhbmRhbG9uZS4KCQkJaWYgKCAoICR0aGlzLT5zb3VyY2VUeXBlID09ICdtdWx0aXNpdGVfZXhwb3J0JyApICYmICggJHRoaXMtPmRlc3RpbmF0aW9uVHlwZSA9PSAnc3RhbmRhbG9uZScgKSApIHsKCQkJCSRzdGVwc1tdID0gJ21pZ3JhdGVNdWx0aXNpdGVFeHBvcnRUb1N0YW5kYWxvbmUnOwoJCQl9CgkJCSRzdGVwc1tdID0gJ19jYWxjdWxhdGVOZXdPbGRVUkxzJzsKCQkJJHN0ZXBzW10gPSAnYnJ1dGVGb3JjZVRhYmxlcyc7CgkJCSRzdGVwc1tdID0gJ2ZpbmFsaXplJzsKCQkJJHN0ZXBzW10gPSAndmVyaWZ5RGF0YWJhc2UnOwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGVwcyB0byBydW46IGAnIC4gaW1wbG9kZSggJywnLCAkc3RlcHMgKSAuICdgLicgKTsKCQkKCQkKCQlmb3JlYWNoKCAkc3RlcHMgYXMgJHN0ZXAgKSB7CgkJCSR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlUmVzdW1lUG9pbnQnXSA9ICcnOyAvLyBDbGVhciBvdXQgbmVlZGluZyB0byByZXN1bWUgZm9yIG5vdy4KCQkJCgkJCS8vIFJ1biB0aGUgZnVuY3Rpb24uCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIHN0ZXAgYCcgLiAkc3RlcCAuICdgLicgKTsKCQkJJHJlc3VsdHMgPSBjYWxsX3VzZXJfZnVuYyggYXJyYXkoICR0aGlzLCAkc3RlcCApLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVBvaW50J10gKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3RlcCBgJyAuICRzdGVwIC4gJ2AuJyApOwoJCQkKCQkJaWYgKCBUUlVFID09PSAkcmVzdWx0cyApIHsgLy8gU3VjY2VzcyBzbyBtb3ZlIHRvIG5leHQgbG9vcC4KCQkJCWFycmF5X3NoaWZ0KCAkc3RlcHMgKTsgLy8gU2hpZnRzIHN0ZXAgb2ZmIHRoZSBmcm9udCBvZiB0aGUgYXJyYXkuCgkJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIG1pZ3JhdGlvbiBzdGVwIGAnIC4gJHN0ZXAgLiAnYCBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuJyApOwoKCQkJCWlmICggJHRoaXMtPm5lYXJUaW1lTGltaXQoKSApIHsKCQkJCQlyZXR1cm4gYXJyYXkoICRzdGVwcywgJycsICcnICk7IC8vIGFycmF5IG9mIHJlbWFpbmluZyBzdGVwcywgbm8gcmVzdW1lIHBvaW50IHNpbmNlIG5vdCB3aXRoaW4gYSBmdW5jdGlvbi4KCQkJCX0KCgkJCQkvLyBEbyBub3RoaW5nLi4uIHdpbGwganVzdCBjb250aW51ZSB0byBuZXh0IHN0ZXAuCgkJCX0gZWxzZWlmKCBpc19hcnJheSggJHJlc3VsdHMgKSApIHsgLy8gTkVFRFMgQ0hVTktJTkcuCgkJCQkkc3RlcHMgPSBhcnJheV91bnNoaWZ0KCAkc3RlcHMsICRzdGVwICk7IC8vIFRoaXMgc3RlcCBkaWQgbm90IGZpbmlzaCBzbyBwdXQgaXQgYmFjayBhdCB0aGUgYmVnaW5uaW5nIGZvciByZXN1bWluZy4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01pZ3JhdGluZyB0aGUgZGF0YWJhc2UgZGlkIG5vdCBjb21wbGV0ZSBpbiB0aGUgZmlyc3QgcGFzc3MuIENodW5raW5nIGludG8gbXVsdGlwbGUgcGFydHMuIFJlc3VtaW5nIHN0ZXAgYCcgLiAkc3RlcCAuICdgIHNob3J0bHkgYXQgcG9pbnQgYCcgLiAkcmVzdWx0c1swXSAuICdgLicgKTsKCQkJCXJldHVybiBhcnJheSggJHN0ZXBzLCAkcmVzdWx0c1swXSApOyAvLyBBcnJheSBvZiBzdGVwcyB0byBydW4sIHJlc3VtZSBwb2ludC4KCQkJfSBlbHNlIHsgLy8gRkFMU0Ugb3Igc29tZXRoaW5nIHdlaXJkLi4uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRGF0YWJhc2UgbWlncmF0aW9uIHN0ZXAgYCcgLiAkc3RlcCAuICdgIGZhaWxlZC4gU2VlIGxvZyBmb3IgZGV0YWlscy4gUmVzdWx0OiBgJyAuICRyZXN1bHRzIC4gJ2AuJyApOwoJCQkJcmV0dXJuIEZBTFNFOwoJCQl9CgkJfSAvLyBlbmQgZm9yZWFjaC4KCQkKCQkKCQkKCQkKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdUb29rICcgLiByb3VuZCggbWljcm90aW1lKCB0cnVlICkgLSBwYl9iYWNrdXBidWRkeTo6JHN0YXJ0X3RpbWUsIDMgKSAuICcgc2Vjb25kcy4gRG9uZS4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGF0YWJhc2UgY29udGVudCBtaWdyYXRlZC4nICk7CgkJCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpLgoJCglmdW5jdGlvbiBuZWFyVGltZUxpbWl0KCkgewoJCS8vIElmIHdlIGFyZSB3aXRoaW4gMSBzZWNvbmQgb2YgcmVhY2hpbmcgbWF4aW11bSBQSFAgcnVudGltZSB0aGVuIHN0b3AgaGVyZSBzbyB0aGF0IGl0IGNhbiBiZSBwaWNrZWQgdXAgaW4gYW5vdGhlciBQSFAgcHJvY2Vzcy4uLgoJCWlmICggKCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnN0YXJ0VGltZSApICsgc2VsZjo6VElNRV9XSUdHTEVfUk9PTSApID49ICR0aGlzLT5yZXN0b3JlRGF0YVsnbWF4RXhlY3V0aW9uVGltZSddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdBcHByb2FjaGluZyBsaW1pdCBvZiBhdmFpbGFibGUgUEhQIGNodW5raW5nIHRpbWUgb2YgYCcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ21heEV4ZWN1dGlvblRpbWUnXSAuICdgIHNlYy4gUmFuIGZvciAnIC4gcm91bmQoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnN0YXJ0VGltZSwgMyApIC4gJyBzZWMuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoJCglmdW5jdGlvbiBfY2FsY3VsYXRlTmV3T2xkVVJMcygpIHsKCQkvLyAqKioqKioqKioqIEJFR0lOIE1BS0lORyBPTEQgVVJMUyBVTklRVUUgQU5EIFRSSU1NSU5HIENPUlJFU1BPTkRJTkcgTkVXIFVSTFMgKioqKioqKioqKgoKCQkvLyBUaGlzIGVudGlyZSBzZWN0aW9uIGlzIGluIHBsYWNlIHRvIHByZXZlbnQgZHVwbGljYXRlIHJlcGxhY2VtZW50cy4KCQkkdW5pcXVlX3VybHMgPSAkdGhpcy0+X2FycmF5X3BhaXJzX3VuaXF1ZV9maXJzdCggJHRoaXMtPm9sZFVSTHMsICR0aGlzLT5uZXdVUkxzICk7CgkJJHRoaXMtPm9sZFVSTHMgPSAkdW5pcXVlX3VybHNbMF07CgkJJHRoaXMtPm5ld1VSTHMgPSAkdW5pcXVlX3VybHNbMV07CgoJCSR1bmlxdWVfdXJscyA9ICR0aGlzLT5fYXJyYXlfcGFpcnNfdW5pcXVlX2ZpcnN0KCAkdGhpcy0+b2xkRnVsbFJlcGxhY2UsICR0aGlzLT5uZXdGdWxsUmVwbGFjZSApOwoJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZSA9ICR1bmlxdWVfdXJsc1swXTsKCQkkdGhpcy0+bmV3RnVsbFJlcGxhY2UgPSAkdW5pcXVlX3VybHNbMV07CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09sZCBVUkxzOiAnIC4gaW1wbG9kZSggJywgJywgJHRoaXMtPm9sZFVSTHMgKSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05ldyBVUkxzOiAnIC4gaW1wbG9kZSggJywgJywgJHRoaXMtPm5ld1VSTHMgKSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09sZCBmdWxsIHJlcGxhY2U6ICcgLiBpbXBsb2RlKCAnLCAnLCAkdGhpcy0+b2xkRnVsbFJlcGxhY2UgKSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05ldyBmdWxsIHJlcGxhY2U6ICcgLiBpbXBsb2RlKCAnLCAnLCAkdGhpcy0+bmV3RnVsbFJlcGxhY2UgKSApOwoKCQlyZXR1cm4gdHJ1ZTsKCgkJLy8gKioqKioqKioqKiBFTkQgTUFLSU5HIE9MRCBVUkxTIFVOSVFVRSBBTkQgVFJJTU1JTkcgQ09SUkVTUE9ORElORyBORVcgVVJMUyAqKioqKioqKioqCgl9CgkKCWZ1bmN0aW9uIG1pZ3JhdGVDb21tb24oKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3RhcnRpbmcgbWlncmF0aW9uIHN0ZXBzIGZvciBgYWxsYCBzaXRlcy4nICk7CgoJCS8vIEFCU1BBVEgKCQkkb2xkX2Fic3BhdGggPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydhYnNwYXRoJ107CgkJLy8kb2xkX2Fic3BhdGggPSBwcmVnX3JlcGxhY2UoICd8LyskfCcsICcnLCAkb2xkX2Fic3BhdGggKTsgLy8gUmVtb3ZlIGVzY2FwaW5nIG9mIHdpbmRvd3MgcGF0aHMuIFRoaXMgaXMgd3JvbmcuIHN0cmlwcyB0cmFpbGluZyBzbGFzaGVzLiBXaHk/IEl0IHNob3VsZG50ISBSZW1vdmVkIE5vdiA0CgkJJG5ld19hYnNwYXRoID0gQUJTUEFUSDsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBQlNQQVRIIGNoYW5nZSBmb3IgZGF0YWJhc2UuIE9sZCBQYXRoOiAnIC4gJG9sZF9hYnNwYXRoIC4gJywgTmV3IFBhdGg6ICcgLiAkbmV3X2Fic3BhdGggLiAnLicgKTsKCgoKCQkkb2xkX3VybCA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3NpdGV1cmwnXTsgIC8vIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBzZWFyY2ggZm9yCQoKCQkvLyBTSVRFVVJMCgkJaWYgKCBzdHJpc3RyKCAkb2xkX3VybCwgJ2h0dHA6Ly93d3cuJyApIHx8IHN0cmlzdHIoICRvbGRfdXJsLCAnaHR0cHM6Ly93d3cuJyApICkgeyAvLyBJZiBodHRwOi8vd3d3LmJsYWguLi4uIHRoZW4gYWxzbyB3ZSB3aWxsIHJlcGxhY2UgaHR0cDovL2JsYWguLi4gYW5kIHZpY2UgdmVyc2EuCgkJCSRvbGRfdXJsX2FsdCA9IHN0cl9pcmVwbGFjZSggJ2h0dHA6Ly93d3cuJywgJ2h0dHA6Ly8nLCAkb2xkX3VybCApOwoJCQkkb2xkX3VybF9hbHQgPSBzdHJfaXJlcGxhY2UoICdodHRwczovL3d3dy4nLCAnaHR0cHM6Ly8nLCAkb2xkX3VybF9hbHQgKTsKCQl9IGVsc2UgewoJCQkkb2xkX3VybF9hbHQgPSBzdHJfaXJlcGxhY2UoICdodHRwOi8vJywgJ2h0dHA6Ly93d3cuJywgJG9sZF91cmwgKTsKCQkJJG9sZF91cmxfYWx0ID0gc3RyX2lyZXBsYWNlKCAnaHR0cHM6Ly8nLCAnaHR0cHM6Ly93d3cuJywgJG9sZF91cmxfYWx0ICk7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhbGN1bGF0ZWQgc2l0ZSBVUkwgdXBkYXRlLiBQcmV2aW91cyBVUkw6IGAnIC4gJG9sZF91cmwgLiAnYCwgTmV3IFVSTDogYCcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICdgLicgKTsKCQkkdGhpcy0+b2xkRnVsbFJlcGxhY2UgPSBhcnJheSggJG9sZF91cmwsICRvbGRfdXJsX2FsdCApOwoJCWlmICggJy8nICE9ICRvbGRfYWJzcGF0aCApIHsgLy8gT25seSBkbyByZXBsYWNlIG9uIGFic3BhdGggaWYgaXQgd2FzIG5vdCBwcmV2aW91c2x5IGF0IHRoZSByb290IGFzIHRoaXMgZWFzaWx5IGJyZWFrcyB0aGluZ3MuCgkJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZVtdID0gJG9sZF9hYnNwYXRoOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dBUk5JTkc6IFNraXBwaW5nIEFCU1BBVEggZGF0YWJhc2UgbWlncmF0aW9ucyBhcyB0aGUgcHJldmlvdXMgQUJTUEFUSCB3YXMgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LiBDYW5ub3Qgc2FmZWx5IHVwZGF0ZSBwYXRocyBhdCB0aGlzIGxvY2F0aW9uIGRvIGl0IG9ubHkgYmVpbmcgYSBzaW5nbGUgc2xhc2guJyApOwoJCX0KCQkkdGhpcy0+bmV3RnVsbFJlcGxhY2UgPSBhcnJheSggJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10sICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddICk7CgkJaWYgKCAnLycgIT0gJG9sZF9hYnNwYXRoICkgeyAvLyBPbmx5IGRvIHJlcGxhY2Ugb24gYWJzcGF0aCBpZiBpdCB3YXMgbm90IHByZXZpb3VzbHkgYXQgdGhlIHJvb3QgYXMgdGhpcyBlYXNpbHkgYnJlYWtzIHRoaW5ncy4KCQkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlW10gPSAkbmV3X2Fic3BhdGg7CgkJfQoKCQkvLyBIT01FVVJMLgoJCWlmICggJHRoaXMtPnJlc3RvcmVEYXRhWydob21ldXJsJ10gIT0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnc2l0ZXVybCddICkgeyAvLyBPbGQgYW5kIG5ldyBob21ldXJsIGRpZmZlciBzbyBuZWVkcyB1cGRhdGluZy4KCgkJCWlmICggZW1wdHkoICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2hvbWV1cmwnXSApICkgeyAvLyBvbGQgQmFja3VwQnVkZHkgdmVyc2lvbnMgZGlkIG5vdCBzdG9yZSB0aGUgcHJldmlvdXMgaG9tZXVybC4gSGFuZyBvbnRvIHRoaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBhIHdoaWxlLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1lvdXIgY3VycmVudCBiYWNrdXAgZG9lcyBub3QgaW5jbHVkZSBhIGhvbWUgVVJMLiBIb21lIFVSTHMgd2lsbCBOT1QgYmUgdXBkYXRlZDsgc2l0ZSBVUkwgd2lsbCBiZSB1cGRhdGVkIHRob3VnaC4gIE1ha2UgYSBuZXcgYmFja3VwIHdpdGggdGhlIGxhdGVzdCBCYWNrdXBCdWRkeSBiZWZvcmUgbWlncmF0aW5nIGlmIHlvdSB3aXNoIHRvIGZ1bGx5IHVwZGF0ZSBob21lIFVSTCBjb25maWd1cmF0aW9uLicgKTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5vbGRVUkxzID0gYXJyYXkoICRvbGRfdXJsLCAkb2xkX3VybF9hbHQsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2hvbWV1cmwnXSApOwoJCQkJJHRoaXMtPm5ld1VSTHMgPSBhcnJheSggJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10sICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2hvbWV1cmwnXSApOwoKCQkJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZVtdID0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnaG9tZXVybCddOwoJCQkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlW10gPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydob21ldXJsJ107CgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2FsY3VsYXRlZCBob21lIFVSTCB1cGRhdGUuIFByZXZpb3VzIFVSTDogYCcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydob21ldXJsJ10gLiAnYCwgTmV3IFVSTDogYCcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ2hvbWV1cmwnXSAuICdgJyApOwoJCQl9CgkJfSBlbHNlIHsgLy8gU2l0ZSBVUkwgdXBkYXRlcyBvbmx5LgoJCQkkdGhpcy0+b2xkVVJMcyA9IGFycmF5KCAkb2xkX3VybCwgJG9sZF91cmxfYWx0ICk7CgkJCSR0aGlzLT5uZXdVUkxzID0gYXJyYXkoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSApOwoJCX0KCgkJaWYgKCBpc3NldCggJHdwX3VwbG9hZF9kaXIgKSApIHsKCQkJJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsID0gJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnLycgLiBzdHJfcmVwbGFjZSggQUJTUEFUSCwgJycsICR3cF91cGxvYWRfZGlyICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJyR0aGlzLT5uZXR3b3JrVXBsb2FkVVJMUmVhbCA9IGAnIC4gJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsIC4gJ2AuJyApOwoJCX0KCQkKCQkKCQkkdGhpcy0+YnJ1dGVmb3JjZUV4Y2x1ZGVkVGFibGVzID0gYXJyYXkoCgkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdwb3N0cycsCgkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd1c2VycycsIC8vIEltcG9ydGVkIHVzZXJzIHRhYmxlIHdpbGwgdGVtcG9yYXJpbHkgYmUgaGVyZSBzbyB0aGlzIGlzIGZpbmUgZm9yIE1TIGltcG9ydHMuCgkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd1c2VybWV0YScsIC8vIEltcG9ydGVkIHVzZXJzIHRhYmxlIHdpbGwgdGVtcG9yYXJpbHkgYmUgaGVyZSBzbyB0aGlzIGlzIGZpbmUgZm9yIE1TIGltcG9ydHMuCgkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd0ZXJtcycsCgkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd0ZXJtX3RheG9ub215JywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3Rlcm1fcmVsYXRpb25zaGlwcycsCgkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdwb3N0bWV0YScsCgkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdvcHRpb25zJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2NvbW1lbnRzJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2NvbW1lbnRtZXRhJywKCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2xpbmtzJywKCQkpOwoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBtaWdyYXRpb24gc3RlcHMgZm9yIGBhbGxgIHNpdGVzLicgKTsKCQkKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIG1pZ3JhdGVDb21tb24oKS4KCQoJCgkKCWZ1bmN0aW9uIG1pZ3JhdGVOZXR3b3JrVG9OZXR3b3JrKCkgewoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBtaWdyYXRpb24gc3RlcHMgZm9yIGBOZXR3b3JrIC0+IE5ldHdvcmtgIHNpdGVzLicgKTsKCgkJLy8gTXVsdGlzaXRlIE5ldHdvcmsgZG9tYWluICYgcGF0aCBmcm9tIHNpdGUgdXJsOgoJCSR1cmxfcGFydHMgPSBwYXJzZV91cmwoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddICk7CgkJJG11bHRpc2l0ZV9kZXN0aW5hdGlvbl9kb21haW4gPSAgJHVybF9wYXJ0c1snaG9zdCddOwoJCWlmICggaXNzZXQoICR1cmxfcGFydHNbJ3BhdGgnXSApICkgewoJCQkkZGVzdGluYXRpb25fcGF0aCA9IHJ0cmltKCAkdXJsX3BhcnRzWydwYXRoJ10sICcvXFwnICkgLiAnLyc7CgkJfSBlbHNlIHsKCQkJJGRlc3RpbmF0aW9uX3BhdGggPSAnLyc7CgkJfQoJCQoJCS8vcGJfdXBkYXRlX2RvbWFpbl9wYXRoKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydkb21haW4nXSwgJG11bHRpc2l0ZV9kZXN0aW5hdGlvbl9kb21haW4sICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3BhdGgnXSwgJGRlc3RpbmF0aW9uX3BhdGggKTsgLy8gJG9sZF9kb21haW4sICRtdWx0aXNpdGVfZGVzdGluYXRpb25fZG9tYWluLCAkb2xkX3BhdGgsICRkZXN0aW5hdGlvbl9wYXRoCgkJJG9sZF9kb21haW4gPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydkb21haW4nXTsKCQkkb2xkX3BhdGggPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWydwYXRoJ107CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ011bHRpc2l0ZSBOZXR3b3JrIFVSTHM6IE9sZCBkb21haW46IGAnIC4gJG9sZF9kb21haW4gLiAnYDsgbmV3IGRvbWFpbjogYCcgLiAkbXVsdGlzaXRlX2Rlc3RpbmF0aW9uX2RvbWFpbiAuICdgOyBvbGQgcGF0aDogYCcgLiAkb2xkX3BhdGggLiAnYDsgbmV3IHBhdGg6IGAnIC4gJGRlc3RpbmF0aW9uX3BhdGggLiAnYC4nICk7CgoKCQkvLyBCTE9HUyBUQUJMRS0tLS0tCgoJCS8vIFVwZGF0ZSBibG9nIHBhdGggZm9yIGFsbCBzaXRlcyB0aGF0IGhhZCB0aGUgb2xkIGRvbWFpbiBhbmQgc3RhcnRlZCB3aXRoIHRoZSBvbGQgcGF0aCBpbiBCTE9HUyB0YWJsZS4KCQlpZiAoICRvbGRfcGF0aCAhPSAnLycgKSB7IC8vIFVzZWQgdG8gYmUgYSBzdWJkb21haW4gc28gd2UgY2FuIG1vcmUgc2FmZWx5IHJlcGxhY2UuCgkJCW15c3FsX3F1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gImJsb2dzYCBTRVQgcGF0aD1SRVBMQUNFKCBwYXRoLCAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX3BhdGggKSAuICInLCAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZGVzdGluYXRpb25fcGF0aCApIC4gIicpIFdIRVJFIGRvbWFpbj0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX2RvbWFpbiApIC4gIicgQU5EIHBhdGggTElLRSAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX3BhdGggKSAuICIlJyIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuIG15c3FsX2FmZmVjdGVkX3Jvd3MoKSAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIHBhdGhzIGluIGJsb2dzIHRhYmxlIHRvIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRkZXN0aW5hdGlvbl9wYXRoICkgLiAnYCAob2xkIHBhdGggd2FzIGEgc3ViZGlyZWN0b3J5KS4nICk7CgkJfSBlbHNlIHsgLy8gVXNlZCB0byBiZSBpbiByb290IHNvIG11Y2ggcHJlcGVuZCBuZXcgcGF0aC4KCQkJbXlzcWxfcXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAiYmxvZ3NgIFNFVCBwYXRoPWNvbmNhdCggJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggcnRyaW0oICRkZXN0aW5hdGlvbl9wYXRoLCAnL1xcJyApICkgLiAiJywgcGF0aCApIFdIRVJFIGRvbWFpbj0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX2RvbWFpbiApIC4gIiciICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiBteXNxbF9hZmZlY3RlZF9yb3dzKCkgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBwYXRocyBpbiBibG9ncyB0YWJsZSB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZGVzdGluYXRpb25fcGF0aCApIC4gJ2AgKG9sZCBwYXRoIHdhcyByb290KS4nICk7CgkJfQoJCWlmICggbXlzcWxfZXJyb3IoKSAhPSAnJyApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gbXlzcWxfZXJyb3IoKSApOyB9CgoJCS8vIFVwZGF0ZSBibG9nIGRvbWFpbiBmb3IgYWxsIG1hdGNoaW5nIHNpdGVzLgoJCW15c3FsX3F1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gImJsb2dzYCBTRVQgZG9tYWluPSciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRtdWx0aXNpdGVfZGVzdGluYXRpb25fZG9tYWluICkgLiAiJyBXSEVSRSBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9kb21haW4gKSAuICInIiApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiBteXNxbF9hZmZlY3RlZF9yb3dzKCkgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBkb21haW4gaW4gYmxvZ3MgdGFibGUgdG8gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG11bHRpc2l0ZV9kZXN0aW5hdGlvbl9kb21haW4gKSAuICdgLicgKTsKCQlpZiAoIG15c3FsX2Vycm9yKCkgIT0gJycgKSB7IHBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuIG15c3FsX2Vycm9yKCkgKTsgfQoKCQkvLyBTSVRFIFRBQkxFLS0tLS0KCgkJLy8gVXBkYXRlIGJsb2cgcGF0aCBmb3IgYWxsIG1hdGNoaW5nIHNpdGVzIGluIFNJVEUgdGFibGUuCgkJaWYgKCAkb2xkX3BhdGggIT0gJy8nICkgeyAvLyBVc2VkIHRvIGJlIGEgc3ViZG9tYWluIHNvIHdlIGNhbiBtb3JlIHNhZmVseSByZXBsYWNlLgoJCQlteXNxbF9xdWVyeSggIlVQREFURSBgIiAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJzaXRlYCBTRVQgcGF0aD1SRVBMQUNFKCBwYXRoLCAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX3BhdGggKSAuICInLCAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZGVzdGluYXRpb25fcGF0aCApIC4gIicpIFdIRVJFIGRvbWFpbj0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX2RvbWFpbiApIC4gIicgQU5EIHBhdGggTElLRSAnIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX3BhdGggKSAuICIlJyIgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuIG15c3FsX2FmZmVjdGVkX3Jvd3MoKSAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIHBhdGhzIGluIHNpdGUgdGFibGUgdG8gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJGRlc3RpbmF0aW9uX3BhdGggKSAuICdgIChvbGQgcGF0aCB3YXMgYSBzdWJkaXJlY3RvcnkpLicgKTsKCQl9IGVsc2UgeyAvLyBVc2VkIHRvIGJlIGluIHJvb3Qgc28gbXVjaCBwcmVwZW5kIG5ldyBwYXRoLgoJCQlteXNxbF9xdWVyeSggIlVQREFURSBgIiAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJzaXRlYCBTRVQgcGF0aD1jb25jYXQoICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoIHJ0cmltKCAkZGVzdGluYXRpb25fcGF0aCwgJy9cXCcgKSApIC4gIicsIHBhdGggKSBXSEVSRSBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG9sZF9kb21haW4gKSAuICInIiApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gbXlzcWxfYWZmZWN0ZWRfcm93cygpIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgcGF0aHMgaW4gc2l0ZSB0YWJsZSB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkZGVzdGluYXRpb25fcGF0aCApIC4gJ2AgKG9sZCBwYXRoIHdhcyByb290KS4nICk7CgkJfQoJCWlmICggbXlzcWxfZXJyb3IoKSAhPSAnJyApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gbXlzcWxfZXJyb3IoKSApOyB9CgoJCS8vIFVwZGF0ZSBibG9nIGRvbWFpbiBmb3IgYWxsIG1hdGNoaW5nIHNpdGVzLgoJCW15c3FsX3F1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gInNpdGVgIFNFVCBkb21haW49JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJG11bHRpc2l0ZV9kZXN0aW5hdGlvbl9kb21haW4gKSAuICInIFdIRVJFIGRvbWFpbj0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkX2RvbWFpbiApIC4gIiciICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuIG15c3FsX2FmZmVjdGVkX3Jvd3MoKSAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIGRvbWFpbiBpbiBzaXRlIHRhYmxlIHRvIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRtdWx0aXNpdGVfZGVzdGluYXRpb25fZG9tYWluICkgLiAnYC4nICk7CgkJaWYgKCBteXNxbF9lcnJvcigpICE9ICcnICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiBteXNxbF9lcnJvcigpICk7IH0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgbWlncmF0aW9uIHN0ZXBzIGZvciBgTmV0d29yayAtPiBOZXR3b3JrYCBzaXRlcy4nICk7CgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBtaWdyYXRlTmV0d29ya1RvTmV0d29yaygpLgoJCgkKCQoJZnVuY3Rpb24gbWlncmF0ZVN0YW5kYWxvbmVUb011bHRpc2l0ZUltcG9ydCgpIHsKCQoJCWdsb2JhbCAkd3BkYjsKCQlnbG9iYWwgJHdwX3ZlcnNpb247CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3RhcnRpbmcgbWlncmF0aW9uIHN0ZXBzIGZvciBgU3RhbmRhbG9uZSAtPiBNdWx0aXNpdGUgSW1wb3J0YCBzaXRlcy4nICk7CgkJCgkJLy8gTm90ZSBmb3IgYW55IGRlc3RpbmF0aW9uIG9mIG11bHRpc2l0ZV9pbXBvcnQ6IFVzZXJzIHRhYmxlcyBleGlzdCB0ZW1wb3JhcmlseSBpbiB0aGVpciBub3JtYWwgbG9jYXRpb24gc28gd2UgcmVwbGFjZSB0aGVtIGxpa2UgYSBub3JtYWwgc3RhbmRhbG9uZSBzaXRlLiBUaGUgbmV4dCBpbXBvcnQgc3RlcCB3aWxsIG1lcmdlIHRoZW0gaW50byB0aGUgbXVsdGlzaXRlIHRhYmxlcy4KCQkKCQkvLyBUT0RPOiBhZGQgY29kZSBmcm9tIG1zX2ltcG9ydGJ1ZGR5LnBocCBpbnRvIGhlcmUgZm9yIGFueSB1cGRhdGVzIGlmIG5lZWRlZC4KCQkKCQkvLyBUaGUgb2xkIHVwbG9hZHMgVVJMLiBTdGFuZGFsb25lIHNvdXJjZSBsaWtlOiBodHRwOi8vZ2V0YmFja3VwYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIEJCIGRvZXNudCBjdXJyZW50bHkgc3VwcG9ydCBtb3ZlZCB1cGxvYWRzLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT2xkIHVwbG9hZHMgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnc2l0ZXVybCddIC4gJy93cC1jb250ZW50L3VwbG9hZHMnICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZFVSTHMsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzJyApOwoJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRGdWxsUmVwbGFjZSwgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsnc2l0ZXVybCddIC4gJy93cC1jb250ZW50L3VwbG9hZHMnICk7CgkJCgkJLy8gVGhlIG5ldyBzdGFuZGFsb25lIHVwbG9hZCBVUkwuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOZXcgdmlydHVhbCB1cGxvYWQgVVJMIHRvIHJlcGxhY2Ugc3RhbmRhbG9uZSB1cGxvYWQgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3VVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3RnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICk7CgkJCgkJLy8gVXBkYXRlIHVwbG9hZF9wYXRoIGluIG9wdGlvbnMgdGFibGUuCgkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICR3cF92ZXJzaW9uLCAnMy41JywgJz49JykgKSB7IC8vIEFzIG9mIFdQIHYzLjUgc3Vic3RpZXMgc2hvdWxkIGhhdmUgdXBsb2FkX3BhdGggb3B0aW9uIHJlbW92ZWQuCgkJCW15c3FsX3F1ZXJ5KCAiREVMRVRFIEZST00gYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiwgJHdwZGItPmRiaCApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZWxldGVkICcgLiBteXNxbF9hZmZlY3RlZF9yb3dzKCAkd3BkYi0+ZGJoICkgLiAnIHJvdyhzKSBhcyB1cGxvYWRfcGF0aCBpcyBubyBsb25nZXIgbmVlZGVkIGJ5IE11bHRpc2l0ZS4nICk7CgkJfSBlbHNlIHsKCQkJbXlzcWxfcXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgU0VUIG9wdGlvbl92YWx1ZT0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCBzdHJfcmVwbGFjZSggJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnLycsICcnLCAkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgKSApIC4gIicgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiwgJHdwZGItPmRiaCApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gbXlzcWxfYWZmZWN0ZWRfcm93cyggJHdwZGItPmRiaCApIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgdXBsb2FkcyBVUkwgaW4gb3B0aW9ucyB0YWJsZS4gTmV3IHZhbHVlOiAnIC4gc3RyX3JlcGxhY2UoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy8nLCAnJywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICkgKTsKCQl9CgkJaWYgKCBteXNxbF9lcnJvciggJHdwZGItPmRiaCApICE9ICcnICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiBteXNxbF9lcnJvciggJHdwZGItPmRiaCApICk7IH0KCQkKCQkvLyBVcGRhdGUgdXNlciByb2xlcyBvcHRpb25fbmFtZSByb3cuCgkJbXlzcWxfcXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgU0VUIG9wdGlvbl9uYW1lPSciIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gInVzZXJfcm9sZXMnIFdIRVJFIG9wdGlvbl9uYW1lIExJS0UgJyVcX3VzZXJcX3JvbGVzJyBMSU1JVCAxIiwgJHdwZGItPmRiaCApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiBteXNxbF9hZmZlY3RlZF9yb3dzKCAkd3BkYi0+ZGJoICkgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyB1c2VyIHJvbGVzIG9wdGlvbl9uYW1lIHRvIGAnIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ3VzZXJfcm9sZXNgLicgKTsKCQlpZiAoIG15c3FsX2Vycm9yKCAkd3BkYi0+ZGJoICkgIT0gJycgKSB7IHBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuIG15c3FsX2Vycm9yKCAkd3BkYi0+ZGJoICkgKTsgfQoJCQoJCS8vIFVwZGF0ZSBmaWxldXBsb2FkX3VybCBpbiBvcHRpb25zIHRhYmxlLgoJCW15c3FsX3F1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSdmaWxldXBsb2FkX3VybCcgTElNSVQgMSIsICR3cGRiLT5kYmggKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gbXlzcWxfYWZmZWN0ZWRfcm93cyggJHdwZGItPmRiaCApIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgZmlsZXVwbG9hZF91cmwgaW4gb3B0aW9ucyB0YWJsZS4gTmV3IHZhbHVlOiBgJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddIC4gJ2AuJyApOwoJCWlmICggbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKSAhPSAnJyApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKSApOyB9CgkJCgkJCgkJLy8gVXBkYXRlIHVzZXIgbGV2ZWwgbWV0YV9rZXkgaW4gdXNlcl9tZXRhIHRhYmxlLgoJCS8vIFRPRE86IG1vdmVkIHRvIGJvdHRvbSBvZiB0aGlzIGZpbGUuCgkJLy9teXNxbF9xdWVyeSggIlVQREFURSBgIiAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJvcHRpb25zYCBTRVQgb3B0aW9uX25hbWU9JyIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAidXNlcl9yb2xlcycgV0hFUkUgb3B0aW9uX25hbWUgTElLRSAnJV91c2VyX3JvbGVzJyBMSU1JVCAxIiApOwoJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuIG15c3FsX2FmZmVjdGVkX3Jvd3MoKSAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIHVzZXIgcm9sZXMgb3B0aW9uX25hbWUgdG8gYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAndXNlcl9yb2xlc2AuJyApOwoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIG1pZ3JhdGlvbiBzdGVwcyBmb3IgYFN0YW5kYWxvbmUgLT4gTXVsdGlzaXRlIEltcG9ydGAgc2l0ZXMuJyApOwoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIG1pZ3JhdGVTdGFuZGFsb25lVG9NdWx0aXNpdGVJbXBvcnQoKS4KCQoJCgkKCWZ1bmN0aW9uIG1pZ3JhdGVNdWx0aXNpdGVFeHBvcnRUb011bHRpc2l0ZUltcG9ydCgpIHsKCQkKCQlnbG9iYWwgJHdwZGIsICR3cF92ZXJzaW9uOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIG1pZ3JhdGlvbiBzdGVwcyBmb3IgYE11bHRpc2l0ZSBFeHBvcnQgLT4gTXVsdGlzaXRlIEltcG9ydGAgc2l0ZXMuJyApOwoJCQoJCS8vIE5vdGUgZm9yIGFueSBkZXN0aW5hdGlvbiBvZiBtdWx0aXNpdGVfaW1wb3J0OiBVc2VycyB0YWJsZXMgZXhpc3QgdGVtcG9yYXJpbHkgaW4gdGhlaXIgbm9ybWFsIGxvY2F0aW9uIHNvIHdlIHJlcGxhY2UgdGhlbSBsaWtlIGEgbm9ybWFsIHN0YW5kYWxvbmUgc2l0ZS4gVGhlIG5leHQgaW1wb3J0IHN0ZXAgd2lsbCBtZXJnZSB0aGVtIGludG8gdGhlIG11bHRpc2l0ZSB0YWJsZXMuCgkJCgkJLy8gVGhlIG9sZCB2aXJ0dWFsIHVwbG9hZHMgVVJMLiBTdGFuZGFsb25lIHNvdXJjZSBsaWtlOiBodHRwOi8vZ2V0YmFja3VwYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIEJCIGRvZXNudCBjdXJyZW50bHkgc3VwcG9ydCBtb3ZlZCB1cGxvYWRzLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT2xkIHZpcnR1YWwgdXBsb2FkcyBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd1cGxvYWRfdXJsJ10gKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkVVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsndXBsb2FkX3VybCddICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZEZ1bGxSZXBsYWNlLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd1cGxvYWRfdXJsJ10gKTsKCQkKCQkvLyBUaGUgbmV3IHZpcnR1YWwgdXBsb2FkIFVSTC4gRXg6IGh0dHA6Ly9wbHVnaW5idWRkeS5jb20vd3AtY29udGVudC91cGxvYWRzLy4gVW5zaGlmdGVkIHRvIHBsYWNlIHRoZXNlIHJlcGxhY2VtZW50cyBGSVJTVCBpbiB0aGUgYXJyYXkgb2YgVVJMcyB0byByZXBsYWNlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05ldyB2aXJ0dWFsIHVwbG9hZCBVUkwgdG8gcmVwbGFjZSBvbGQgdmlydHVhbCB1cGxvYWRzIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld1VSTHMsICR0aGlzLT5yZXN0b3JlRGF0YVsndXBsb2FkX3VybCddICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3VwbG9hZF91cmwnXSApOwoJCQoJCS8vIFRoZSBvbGQgcmVhbCBkaXJlY3QgdXBsb2FkcyBVUkwuIFN0YW5kYWxvbmUgc291cmNlIGxpa2U6IGh0dHA6Ly9nZXRiYWNrdXBidWRkeS5jb20vd3AtY29udGVudC91cGxvYWRzLy4gQkIgZG9lc250IGN1cnJlbnRseSBzdXBwb3J0IG1vdmVkIHVwbG9hZHMuIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdPbGQgcmVhbCBkaXJlY3QgdXBsb2FkcyBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd1cGxvYWRfdXJsX3Jld3JpdGUnXSApOwoJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRVUkxzLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyd1cGxvYWRfdXJsX3Jld3JpdGUnXSApOwoJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRGdWxsUmVwbGFjZSwgJHRoaXMtPnJlc3RvcmVEYXRhWydkYXQnXVsndXBsb2FkX3VybF9yZXdyaXRlJ10gKTsKCQkKCQkvLyBUaGUgbmV3IHJlYWwgZGlyZWN0IHVwbG9hZCBVUkwuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8uIFVuc2hpZnRlZCB0byBwbGFjZSB0aGVzZSByZXBsYWNlbWVudHMgRklSU1QgaW4gdGhlIGFycmF5IG9mIFVSTHMgdG8gcmVwbGFjZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOZXcgcmVhbCBkaXJlY3QgdXBsb2FkIFVSTCB0byByZXBsYWNlIG9sZCB2aXJ0dWFsIHVwbG9hZHMgVVJMOiAnIC4gJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld1VSTHMsICR0aGlzLT5uZXR3b3JrVXBsb2FkVVJMUmVhbCApOwoJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5uZXdGdWxsUmVwbGFjZSwgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICk7CgkJCgkJLy8gVXBkYXRlIHVwbG9hZF9wYXRoIGluIG9wdGlvbnMgdGFibGUuCgkJLy8gVXBkYXRlIHVwbG9hZF9wYXRoIGluIG9wdGlvbnMgdGFibGUuCgkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICR3cF92ZXJzaW9uLCAnMy41JywgJz49JykgKSB7IC8vIEFzIG9mIFdQIHYzLjUgc3Vic3RpZXMgc2hvdWxkIGhhdmUgdXBsb2FkX3BhdGggb3B0aW9uIHJlbW92ZWQuCgkJCW15c3FsX3F1ZXJ5KCAiREVMRVRFIEZST00gYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiwgJHdwZGItPmRiaCApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEZWxldGVkICcgLiBteXNxbF9hZmZlY3RlZF9yb3dzKCAkd3BkYi0+ZGJoICkgLiAnIHJvdyhzKSBhcyB1cGxvYWRfcGF0aCBpcyBubyBsb25nZXIgbmVlZGVkIGJ5IE11bHRpc2l0ZS4nICk7CgkJCWlmICggbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKSAhPSAnJyApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKSApOyB9CgkJfSBlbHNlIHsKCQkJbXlzcWxfcXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgU0VUIG9wdGlvbl92YWx1ZT0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCBzdHJfcmVwbGFjZSggJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnLycsICcnLCAkdGhpcy0+bmV0d29ya1VwbG9hZFVSTFJlYWwgKSApIC4gIicgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiwgJHdwZGItPmRiaCApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gbXlzcWxfYWZmZWN0ZWRfcm93cyggJHdwZGItPmRiaCApIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgdXBsb2FkX3BhdGggaW4gb3B0aW9ucyB0YWJsZS4gTmV3IHZhbHVlOiAnIC4gc3RyX3JlcGxhY2UoICR0aGlzLT5yZXN0b3JlRGF0YVsnc2l0ZXVybCddIC4gJy8nLCAnJywgJHRoaXMtPm5ldHdvcmtVcGxvYWRVUkxSZWFsICkgKTsKCQkJaWYgKCBteXNxbF9lcnJvciggJHdwZGItPmRiaCApICE9ICcnICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiBteXNxbF9lcnJvciggJHdwZGItPmRiaCApICk7IH0KCQl9CgkJCgkJLy8gVXBkYXRlIGZpbGV1cGxvYWRfdXJsIGluIG9wdGlvbnMgdGFibGUuCgkJbXlzcWxfcXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgU0VUIG9wdGlvbl92YWx1ZT0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkdGhpcy0+cmVzdG9yZURhdGFbJ3VwbG9hZF91cmwnXSApIC4gIicgV0hFUkUgb3B0aW9uX25hbWU9J2ZpbGV1cGxvYWRfdXJsJyBMSU1JVCAxIiwgJHdwZGItPmRiaCApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiBteXNxbF9hZmZlY3RlZF9yb3dzKCAkd3BkYi0+ZGJoICkgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyBmaWxldXBsb2FkX3VybCBpbiBvcHRpb25zIHRhYmxlLiBOZXcgdmFsdWU6IGAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWyd1cGxvYWRfdXJsJ10gLiAnYC4nICk7CgkJaWYgKCBteXNxbF9lcnJvciggJHdwZGItPmRiaCApICE9ICcnICkgeyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnbXlzcWwgZXJyb3I6ICcgLiBteXNxbF9lcnJvciggJHdwZGItPmRiaCApICk7IH0KCQkKCQkvLyBVcGRhdGUgdXNlciByb2xlcyBvcHRpb25fbmFtZSByb3cuCgkJLy8gVE9ETzogbW92ZWQgdG8gYm90dG9tIG9mIHRoaXMgZmlsZS4KCQkvL215c3FsX3F1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fbmFtZT0nIiAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICJ1c2VyX3JvbGVzJyBXSEVSRSBvcHRpb25fbmFtZSBMSUtFICclX3VzZXJfcm9sZXMnIExJTUlUIDEiICk7CgkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gbXlzcWxfYWZmZWN0ZWRfcm93cygpIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgdXNlciByb2xlcyBvcHRpb25fbmFtZSB0byBgJyAuICR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd1c2VyX3JvbGVzYC4nICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgbWlncmF0aW9uIHN0ZXBzIGZvciBgTXVsdGlzaXRlIEV4cG9ydCAtPiBNdWx0aXNpdGUgSW1wb3J0YCBzaXRlcy4nICk7CgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBtaWdyYXRlTXVsdGlzaXRlRXhwb3J0VG9NdWx0aXNpdGVJbXBvcnQoKS4KCQoJCgkKCS8vICoqKioqKioqKiogQkVHSU4gTVVMVElTSVRFIEVYUE9SVCAtPiBTVEFOREFMT05FICAqKioqKioqKioqCglmdW5jdGlvbiBtaWdyYXRlTXVsdGlzaXRlRXhwb3J0VG9TdGFuZGFsb25lKCkgewoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N0YXJ0aW5nIG1pZ3JhdGlvbiBzdGVwcyBmb3IgYE11bHRpc2l0ZSBFeHBvcnQgLT4gU3RhbmRhbG9uZWAgc2l0ZXMuJyApOwoJCQoJCS8vIElNUE9SVEFOVDogVXBsb2FkIFVSTHMgX01VU1RfIGJlIHVwZGF0ZWQgYmVmb3JlIGRvaW5nIGEgZnVsbCBVUkwgcmVwbGFjZW1lbnQgb3IgZWxzZSB0aGUgZmlyc3QgcG9ydGlvbiBvZiB0aGUgVVJMIHdpbGwgYmUgbWlncmF0ZWQgc28gdGhlc2Ugd2lsbCBubyBsb25nZXIgbWF0Y2guIGFycmF5X3Vuc2hpZnQoKSBpcyB1c2VkIHRvIGJ1bXAgdGhlc2UgdG8gdGhlIHRvcCBvZiB0aGUgbGlzdCB0byB1cGRhdGUuCgkJLy8gVGhlc2Ugd2lsbCBoYW5kbGUgYm90aCB0aGUgUkVBTCB1cmwgaHR0cDovLy4uLi93cC1jb250ZW50L2Jsb2dzLmRpci8jIy9maWxlcy8gdGhhdCB0aGUgdmlydHVhbCBwYXRoIChodHRwOi8vLi4uLi93cC1jb250ZW50L3VwbG9hZHMvKS4KCQkKCQkvLyBUaGUgb2xkIHZpcnR1YWwgdXBsb2FkIFVSTC4gRXg6IGh0dHA6Ly9nZXRiYWNrdXBidWRkeS5jb20vZmlsZXMvLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT2xkIHZpcnR1YWwgdXBsb2FkIFVSTDogJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICd1cGxvYWRfdXJsJyBdICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZFVSTHMsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICd1cGxvYWRfdXJsJyBdICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm9sZEZ1bGxSZXBsYWNlLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAndXBsb2FkX3VybCcgXSApOwoJCQoJCS8vIFRoZSBuZXcgc3RhbmRhbG9uZSB1cGxvYWQgVVJMLiBFeDogaHR0cDovL3BsdWdpbmJ1ZGR5LmNvbS93cC1jb250ZW50L3VwbG9hZHMvLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTmV3IHVwbG9hZCBVUkwgdG8gcmVwbGFjZSB2aXJ0dWFsIHVwbG9hZCBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzLycgKTsKCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+bmV3VVJMcywgJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnL3dwLWNvbnRlbnQvdXBsb2Fkcy8nICk7CgkJYXJyYXlfdW5zaGlmdCggJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzLycgKTsKCQkKCQkvLyBPbmx5IHVwZGF0ZSBhbm90aGVyIFVSTCBpZiBpdCBkaWZmZXJzIC0tIHVzdWFsbHkgd2lsbC4gVGhleSB3aWxsIGJlIHRoZSBzYW1lIGlmIHRoZSB2aXJ0dWFsIHVybCBkb2Vzbid0IGV4aXN0IGZvciBzb21lIHJlYXNvbiAobm8gaHRhY2Nlc3MgYXZhaWxhYmlsaXR5IHNvIHRoZSB2aXJ0dWFsIHVybCB3b3VsZCBtYXRjaCB0aGUgcmVhbCB1cmwpCgkJaWYgKCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAndXBsb2FkX3VybCcgXSAhPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAndXBsb2FkX3VybF9yZXdyaXRlJyBdICkgewoJCQkvLyBUaGUgb2xkIHZpcnR1YWwgdXBsb2FkIFVSTC4gRXg6IGh0dHA6Ly9nZXRiYWNrdXBidWRkeS5jb20vZmlsZXMvLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09sZCByZWFsIHVwbG9hZCBVUkw6ICcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAndXBsb2FkX3VybF9yZXdyaXRlJyBdICk7CgkJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5vbGRVUkxzLCAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdCddWyAndXBsb2FkX3VybF9yZXdyaXRlJyBdICk7IC8vIFRoZSBvbGQgcmVhbCB1cGxvYWQgVVJMLgoJCQlhcnJheV91bnNoaWZ0KCAkdGhpcy0+b2xkRnVsbFJlcGxhY2UsICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bICd1cGxvYWRfdXJsX3Jld3JpdGUnIF0gKTsKCQkJCgkJCS8vIFRoZSBuZXcgc3RhbmRhbG9uZSB1cGxvYWQgVVJMLiBFeDogaHR0cDovL3BsdWdpbmJ1ZGR5LmNvbS93cC1jb250ZW50L3VwbG9hZHMvLiBVbnNoaWZ0ZWQgdG8gcGxhY2UgdGhlc2UgcmVwbGFjZW1lbnRzIEZJUlNUIGluIHRoZSBhcnJheSBvZiBVUkxzIHRvIHJlcGxhY2UuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05ldyB1cGxvYWQgVVJMIHRvIHJlcGxhY2UgcmVhbCB1cGxvYWQgVVJMOiAnIC4gJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnL3dwLWNvbnRlbnQvdXBsb2Fkcy8nICk7CgkJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5uZXdVUkxzLCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICcvd3AtY29udGVudC91cGxvYWRzLycgKTsgLy8gVGhlIG5ldyBzdGFuZGFsb25lIHVwbG9hZCBVUkwuCgkJCWFycmF5X3Vuc2hpZnQoICR0aGlzLT5uZXdGdWxsUmVwbGFjZSwgJHRoaXMtPnJlc3RvcmVEYXRhWydzaXRldXJsJ10gLiAnL3dwLWNvbnRlbnQvdXBsb2Fkcy8nICk7IC8vIFRoZSBuZXcgc3RhbmRhbG9uZSB1cGxvYWQgVVJMLgoJCX0KCQkKCQkvLyBVcGRhdGUgdXBsb2FkX3BhdGggaW4gb3B0aW9ucyB0YWJsZSB0byBiZSBkZWZhdWx0IGJsYW5rIHZhbHVlLgoJCW15c3FsX3F1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JycgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01vZGlmaWVkICcgLiBteXNxbF9hZmZlY3RlZF9yb3dzKCkgLiAnIHJvdyhzKSB3aGlsZSB1cGRhdGluZyB1cGxvYWRzIHBhdGggaW4gb3B0aW9ucyB0YWJsZS4gTmV3IHZhbHVlOiBgYCAoYmxhbmsgZGVmYXVsdCkuJyApOwoJCWlmICggbXlzcWxfZXJyb3IoKSAhPSAnJyApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gbXlzcWxfZXJyb3IoKSApOyB9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgbWlncmF0aW9uIHN0ZXBzIGZvciBgTXVsdGlzaXRlIEV4cG9ydCAtPiBTdGFuZGFsb25lYCBzaXRlcy4nICk7CgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBtaWdyYXRlTXVsdGlzaXRlRXhwb3J0VG9TdGFuZGFsb25lKCkuCgkvLyAqKioqKioqKioqIEVORCBNVUxUSVNJVEUgRVhQT1JUIC0+IFNUQU5EQUxPTkUgKioqKioqKioqKgoJCgkKCQoJCgkKCQoJCglmdW5jdGlvbiBicnV0ZWZvcmNlVGFibGVzKCkgewoJCQoJCWdsb2JhbCAkd3BkYjsKCQkvLyBMb29wIHRocm91Z2ggdGhlIHRhYmxlcyBtYXRjaGluZyB0aGlzIHByZWZpeC4gRG9lcyBOT1QgY2hhbmdlIGRhdGEgaW4gb3RoZXIgdGFibGVzLgoJCS8vIFRoaXMgY2hhbmdlcyBhY3R1YWwgZGF0YSBvbiBhIGNvbHVtbiBieSBjb2x1bW4gYmFzaXMgZm9yIHZlcnkgcm93IGluIGV2ZXJ5IHRhYmxlLgoJCSR0YWJsZXMgPSBhcnJheSgpOwoJCSRyb3dzID0gJHdwZGItPmdldF9yZXN1bHRzKCAiU0VMRUNUIHRhYmxlX25hbWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX25hbWUgTElLRSAnIiAuIHN0cl9yZXBsYWNlKCAnXycsICdcXycsICR0aGlzLT5vdmVycmlkZVByZWZpeCApIC4gIiUnIEFORCB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpIiwgQVJSQVlfQSApOwoJCWZvcmVhY2goICRyb3dzIGFzICRyb3cgKSB7CgkJCSR0YWJsZXNbXSA9ICRyb3dbJ3RhYmxlX25hbWUnXTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRm91bmQgJyAuIGNvdW50KCAkcm93cyApIC4gJyBXb3JkUHJlc3MgdGFibGVzLiAnICk7CgkJdW5zZXQoICRyb3dzICk7CgkJJGJydXRlZm9yY2VfdGFibGVzID0gcGJfYmFja3VwYnVkZHk6OmFycmF5X3JlbW92ZSggJHRhYmxlcywgJHRoaXMtPmJydXRlZm9yY2VFeGNsdWRlZFRhYmxlcyApOyAvLyBSZW1vdmVzIGFsbCB0YWJsZXMgbGlzdGVkIGluICRleGNsdWRlZF90YWJsZXMgZnJvbSAkdGFibGVzLgoJCXVuc2V0KCAkdGFibGVzICk7CgkJCgkJCgkJaWYgKCAkdGhpcy0+ZGVzdGluYXRpb25UeXBlID09ICdtdWx0aXNpdGVfaW1wb3J0JyApIHsKCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL2RicmVwbGFjZS9kYnJlcGxhY2UucGhwJyApOwoJCX0gZWxzZSB7CgkJCXJlcXVpcmVfb25jZSggJ2ltcG9ydGJ1ZGR5L2xpYi9kYnJlcGxhY2UvZGJyZXBsYWNlLnBocCcgKTsKCQl9CgkJCgkJLy8gSW5zdGFudGlhdGUgZGIgcmVwbGFjZSBjbGFzcy4KCQkkZGJyZXBsYWNlID0gbmV3IHBsdWdpbmJ1ZGR5X2RicmVwbGFjZSggJHRoaXMtPnN0YXJ0VGltZSwgc2VsZjo6VElNRV9XSUdHTEVfUk9PTSwgJHRoaXMtPnJlc3RvcmVEYXRhWydtYXhFeGVjdXRpb25UaW1lJ10gKTsKCgoJCWlmICggaXNfYXJyYXkoICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlUmVzdW1lUG9pbnQnXSApICkgewoJCQkkc3RlcHMgPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVBvaW50J11bMF07CgkJCSRzdGVwUmVzdW1lUG9pbnQgPSAkdGhpcy0+cmVzdG9yZURhdGFbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnbWlncmF0ZVJlc3VtZVBvaW50J11bMV07CgkJfSBlbHNlIHsKCQkJJHN0ZXBSZXN1bWVQb2ludCA9ICcnOwoJCQkKCQkJJHN0ZXBzID0gYXJyYXkoCgkJCQlhcnJheSgKCQkJCQknUG9zdHMgdGFibGUgc2l0ZSBVUkxzLicsCgkJCQkJJ3RleHQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdwb3N0cycsCgkJCQkJJHRoaXMtPm9sZFVSTHMsCgkJCQkJJHRoaXMtPm5ld1VSTHMsCgkJCQkJYXJyYXkoICdwb3N0X2NvbnRlbnQnLCAncG9zdF9leGNlcnB0JywgJ3Bvc3RfY29udGVudF9maWx0ZXJlZCcgKSwKCQkJCSksCgkJCQlhcnJheSgKCQkJCQknV29yZFByZXNzIGNvcmUgZGF0YWJhc2UgdGV4dCBkYXRhLicsCgkJCQkJJ3RleHQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICd1c2VycycsCgkJCQkJJHRoaXMtPm9sZFVSTHMsCgkJCQkJJHRoaXMtPm5ld1VSTHMsCgkJCQkJYXJyYXkoICd1c2VyX3VybCcgKQoJCQkJKSwKCQkJCWFycmF5KAoJCQkJCSdXb3JkUHJlc3MgY29yZSBkYXRhYmFzZSB0ZXh0IGRhdGEuJywKCQkJCQkndGV4dCcsCgkJCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2NvbW1lbnRzJywKCQkJCQkkdGhpcy0+b2xkVVJMcywKCQkJCQkkdGhpcy0+bmV3VVJMcywKCQkJCQlhcnJheSggJ2NvbW1lbnRfY29udGVudCcsICdjb21tZW50X2F1dGhvcl91cmwnICkKCQkJCSksCgkJCQlhcnJheSgKCQkJCQknV29yZFByZXNzIGNvcmUgZGF0YWJhc2UgdGV4dCBkYXRhLicsCgkJCQkJJ3RleHQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdsaW5rcycsCgkJCQkJJHRoaXMtPm9sZFVSTHMsCgkJCQkJJHRoaXMtPm5ld1VSTHMsCgkJCQkJYXJyYXkoICdsaW5rX3VybCcsICdsaW5rX2ltYWdlJywgJ2xpbmtfdGFyZ2V0JywgJ2xpbmtfZGVzY3JpcHRpb24nLCAnbGlua19ub3RlcycsICdsaW5rX3JzcycgKSwKCQkJCSksCgkJCQlhcnJheSgKCQkJCQknV29yZFByZXNzIGNvcmUgZGF0YWJhc2Ugc2VyaWFsaXplZCBkYXRhLicsCgkJCQkJJ3NlcmlhbGl6ZWQnLAoJCQkJCSR0aGlzLT5vdmVycmlkZVByZWZpeCAuICdvcHRpb25zJywKCQkJCQkkdGhpcy0+b2xkRnVsbFJlcGxhY2UsCgkJCQkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLAoJCQkJCWFycmF5KCAnb3B0aW9uX3ZhbHVlJyApCgkJCQkpLAoJCQkJYXJyYXkoCgkJCQkJJ1dvcmRQcmVzcyBjb3JlIGRhdGFiYXNlIHNlcmlhbGl6ZWQgZGF0YS4nLAoJCQkJCSdzZXJpYWxpemVkJywKCQkJCQkkdGhpcy0+bmV0d29ya1ByZWZpeCAuICd1c2VybWV0YScsCgkJCQkJJHRoaXMtPm9sZEZ1bGxSZXBsYWNlLAoJCQkJCSR0aGlzLT5uZXdGdWxsUmVwbGFjZSwKCQkJCQlhcnJheSggJ21ldGFfdmFsdWUnICksCgkJCQkpLAoJCQkJYXJyYXkoCgkJCQkJJ1dvcmRQcmVzcyBjb3JlIGRhdGFiYXNlIHNlcmlhbGl6ZWQgZGF0YS4nLAoJCQkJCSdzZXJpYWxpemVkJywKCQkJCQkkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAncG9zdG1ldGEnLAoJCQkJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZSwKCQkJCQkkdGhpcy0+bmV3RnVsbFJlcGxhY2UsCgkJCQkJYXJyYXkoICdtZXRhX3ZhbHVlJyApLAoJCQkJKSwKCQkJCWFycmF5KAoJCQkJCSdXb3JkUHJlc3MgY29yZSBkYXRhYmFzZSBzZXJpYWxpemVkIGRhdGEuJywKCQkJCQknc2VyaWFsaXplZCcsCgkJCQkJJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gJ2NvbW1lbnRtZXRhJywKCQkJCQkkdGhpcy0+b2xkRnVsbFJlcGxhY2UsCgkJCQkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlLAoJCQkJCWFycmF5KCAnbWV0YV92YWx1ZScgKSwKCQkJCSksCgkJCQkKCQkJKTsKCQkJCgkJCWlmICggISBpc3NldCggJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnXSApIHx8ICggdHJ1ZSAhPT0gJHRoaXMtPnJlc3RvcmVEYXRhWydkYXRhYmFzZVNldHRpbmdzJ11bJ21pZ3JhdGVEYXRhYmFzZUJydXRlRm9yY2UnXSApICkgeyAvLyBza2lwIGJydXRlZm9yY2UuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCcnV0ZSBmb3JjZSBkYXRhYmFzZSBtaWdyYXRpb24gc2tpcHBlZCBiYXNlZCBvbiBhZHZhbmNlZCBzZXR0aW5ncycgKTsKCQkJfSBlbHNlIHsgLy8gZG9udCBza2lwIGJydXRlZm9yY2UuCgkJCQkKCQkJCWZvcmVhY2ggKCAkYnJ1dGVmb3JjZV90YWJsZXMgYXMgJGJydXRlZm9yY2VfdGFibGUgKSB7CgkJCQkJJHN0ZXBzW10gPSBhcnJheSgKCQkJCQkJJ0JydXRlZm9yY2luZyBlbnRpcmUgdGFibGVzOiBgJyAuIGltcGxvZGUoICcsJywgJGJydXRlZm9yY2VfdGFibGVzICkgLidgLicsCgkJCQkJCSdicnV0ZWZvcmNlX3RhYmxlJywKCQkJCQkJJGJydXRlZm9yY2VfdGFibGUsCgkJCQkJCSR0aGlzLT5vbGRGdWxsUmVwbGFjZSwKCQkJCQkJJHRoaXMtPm5ld0Z1bGxSZXBsYWNlCgkJCQkJKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkKCQlmb3JlYWNoKCAkc3RlcHMgYXMgJHN0ZXAgKSB7CgkJCSR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0YWJhc2VTZXR0aW5ncyddWydtaWdyYXRlUmVzdW1lUG9pbnQnXVsxXSA9ICcnOyAvLyBDbGVhciBvdXQgbmVlZGluZyB0byByZXN1bWUgdGhpcyBzdWJzdGVwIGZvciBub3cuCgoJCQkvLyBSdW4gdGhlIGZ1bmN0aW9uLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdGFydGluZyBzdWJzdGVwIGAnIC4gJHN0ZXBbMF0gLiAnYC4nICk7CgkJCWlmICggJ2JydXRlZm9yY2VfdGFibGUnID09ICRzdGVwWzFdICkgeyAvLyBUYWJsZSBicnV0ZWZvcmNlIGhhcyBkaWZmZXJlbnQgcGFyYW0gY291bnQuCgkJCQkkcmVzdWx0cyA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJGRicmVwbGFjZSwgJHN0ZXBbMV0gKSwgJHN0ZXBbMl0sICRzdGVwWzNdLCAkc3RlcFs0XSwgJHN0ZXBSZXN1bWVQb2ludCApOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdHMgPSBjYWxsX3VzZXJfZnVuYyggYXJyYXkoICRkYnJlcGxhY2UsICRzdGVwWzFdICksICRzdGVwWzJdLCAkc3RlcFszXSwgJHN0ZXBbNF0sICRzdGVwWzVdLCAkc3RlcFJlc3VtZVBvaW50ICk7CgkJCX0KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3Vic3RlcCBgJyAuICRzdGVwWzBdIC4gJ2AuJyApOwoKCQkJaWYgKCBUUlVFID09PSAkcmVzdWx0cyApIHsgLy8gU3VjY2VzcyBzbyBtb3ZlIHRvIG5leHQgbG9vcC4KCQkJCWFycmF5X3NoaWZ0KCAkc3RlcHMgKTsgLy8gU2hpZnRzIHN0ZXAgb2ZmIHRoZSBmcm9udCBvZiB0aGUgYXJyYXkuCgkJCQkvLyBEbyBub3RoaW5nLi4uIHdpbGwganVzdCBjb250aW51ZSB0byBuZXh0IHN0ZXAuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBtaWdyYXRpb24gc3Vic3RlcCBgJyAuICRzdGVwWzBdIC4gJ2AgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LicgKTsKCgkJCQlpZiAoICR0aGlzLT5uZWFyVGltZUxpbWl0KCkgKSB7CgkJCQkJcmV0dXJuIGFycmF5KCAkc3RlcHMsICcnICk7IC8vIGFycmF5IG9mIHJlbWFpbmluZyBzdGVwcywgbm8gcmVzdW1lIHBvaW50IHNpbmNlIG5vdCB3aXRoaW4gYSBmdW5jdGlvbi4KCQkJCX0KCQkJfSBlbHNlaWYoIGlzX2FycmF5KCAkcmVzdWx0cyApICkgeyAvLyBORUVEUyBDSFVOS0lORy4KCQkJCSRzdGVwcyA9IGFycmF5X3Vuc2hpZnQoICRzdGVwcywgJHN0ZXAgKTsgLy8gVGhpcyBzdGVwIGRpZCBub3QgZmluaXNoIHNvIHB1dCBpdCBiYWNrIGF0IHRoZSBiZWdpbm5pbmcgZm9yIHJlc3VtaW5nLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3Vic3RlcCBtaWdyYXRpbmcgdGhlIGRhdGFiYXNlIGRpZCBub3QgY29tcGxldGUgaW4gdGhlIGZpcnN0IHBhc3MuIENodW5raW5nIGludG8gbXVsdGlwbGUgcGFydHMuIFJlc3VtaW5nIHN1YnN0ZXAgYCcgLiAkc3RlcCAuICdgIHNob3J0bHkgYXQgcG9pbnQgYCcgLiAkcmVzdWx0c1swXSAuICdgLicgKTsKCQkJCXJldHVybiBhcnJheSggJHN0ZXBzLCAkcmVzdWx0c1swXSApOyAvLyBBcnJheSBvZiBzdGVwcyB0byBydW4sIHJlc3VtZSBwb2ludC4KCQkJfSBlbHNlIHsgLy8gRkFMU0Ugb3Igc29tZXRoaW5nIHdlaXJkLi4uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRGF0YWJhc2UgbWlncmF0aW9uIHN1YnN0ZXAgYCcgLiAkc3RlcFswXSAuICdgIGZhaWxlZC4gU2VlIGxvZyBmb3IgZGV0YWlscy4gVGhpcyBtYXkgb25seSBiZSBhIG5vbi1mYXRhbCB3YXJuaW5nLicgKTsKCQkJCXJldHVybiBGQUxTRTsKCQkJfQoJCX0gLy8gZW5kIGZvcmVhY2guCgkJCgkJCgkJLy8gVXBkYXRlIHRhYmxlIHByZWZpeGVzIGluIHNvbWUgV29yZFByZXNzIG1ldGEgZGF0YS4gJHRoaXMtPm5ldHdvcmtQcmVmaXggaXMgc2V0IHRvIHRoZSBub3JtYWwgcHJlZml4IGluIG5vbi1tcyBlbnZpcm9ubWVudC4KCQkkb2xkX3ByZWZpeCA9ICR0aGlzLT5yZXN0b3JlRGF0YVsnZGF0J11bJ2RiX3ByZWZpeCddOwoJCSRuZXdfcHJlZml4ID0gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICR0aGlzLT5vdmVycmlkZVByZWZpeCApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09sZCBEQiBwcmVmaXg6IGAnIC4gJG9sZF9wcmVmaXggLiAnYDsgTmV3IERCIHByZWZpeDogYCcgLiAkbmV3X3ByZWZpeCAuICdgLiBOZXR3b3JrIHByZWZpeDogYCcgLiAkdGhpcy0+bmV0d29ya1ByZWZpeCAuICdgJyApOwoJCWlmICgkb2xkX3ByZWZpeCAhPSAkbmV3X3ByZWZpeCApIHsKCQkJbXlzcWxfcXVlcnkoIlVQREFURSBgIi4kbmV3X3ByZWZpeC4idXNlcm1ldGFgIFNFVCBtZXRhX2tleSA9IFJFUExBQ0UobWV0YV9rZXksICciLiRvbGRfcHJlZml4LiInLCAnIi4kbmV3X3ByZWZpeC4iJyApOyIpOyAvLyB1c2VybWV0YSB0YWJsZSB0ZW1wb3JhcmlseSBpcyBpbiB0aGUgbmV3IHN1YnNpdGUncyBwcmVmaXggdW50aWwgbmV4dCBzdGVwLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gbXlzcWxfYWZmZWN0ZWRfcm93cygpIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgbWV0YV9rZXlcJ3MgZm9yIERCIHByZWZpeCBpbiBzdWJzaXRlXCdzIFt0ZW1wb3JhcnkgaWYgbXVsdGlzaXRlXSB1c2VybWV0YSB0YWJsZSBmcm9tIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRvbGRfcHJlZml4ICkgLiAnYCB0byBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkbmV3X3ByZWZpeCApIC4gJ2AuJyApOwoJCQlpZiAoIG15c3FsX2Vycm9yKCkgIT0gJycgKSB7IHBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuIG15c3FsX2Vycm9yKCkgKTsgfQoKCQkJbXlzcWxfcXVlcnkoIlVQREFURSBgIi4kbmV3X3ByZWZpeC4ib3B0aW9uc2AgU0VUIG9wdGlvbl9uYW1lID0gJyIuJG5ld19wcmVmaXguInVzZXJfcm9sZXMnIFdIRVJFIG9wdGlvbl9uYW1lID0nIi4kb2xkX3ByZWZpeC4idXNlcl9yb2xlcycgTElNSVQgMSIpOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gbXlzcWxfYWZmZWN0ZWRfcm93cygpIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgb3B0aW9uX25hbWUgdXNlcl9yb2xlcyBEQiBwcmVmaXggaW4gW3N1YnNpdGUgaWYgbXVsdGlzaXRlXSBvcHRpb25zIHRhYmxlIHRvIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRuZXdfcHJlZml4ICkgLiAnYC4nICk7CgkJCWlmICggbXlzcWxfZXJyb3IoKSAhPSAnJyApIHsgcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsIGVycm9yOiAnIC4gbXlzcWxfZXJyb3IoKSApOyB9CgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdVcGRhdGVkIHByZWZpeCBNRVRBIGRhdGEuJyApOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnTWlncmF0ZWQgJyAuIGNvdW50KCAkYnJ1dGVmb3JjZV90YWJsZXMgKSAuICcgdGFibGVzIHZpYSBicnV0ZSBmb3JjZS4nICk7CgkJcmV0dXJuIHRydWU7CgoJfSAvLyBFbmQgYnJ1dGVmb3JjZVRhYmxlcygpLgoKCgoJZnVuY3Rpb24gZmluYWxpemUoKSB7CgkJLy8gTEFTVExZIFVQREFURSBTSVRFL0hPTUUgVVJMUyB0byBwcmV2ZW50IGRvdWJsZSByZXBsYWNlbWVudDsganVzdCBpbiBjYXNlIQoKCQkvLyBVcGRhdGUgU0lURVVSTCBpbiBvcHRpb25zIHRhYmxlLiBVc3VhbGx5IG1hc3MgcmVwbGFjZW1lbnQgd2lsbCBjb3ZlciB0aGlzIGJ1dCBzZXQgdGhlc2UgaGVyZSBqdXN0IGluIGNhc2UuCgkJbXlzcWxfcXVlcnkoICJVUERBVEUgYCIgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAib3B0aW9uc2AgU0VUIG9wdGlvbl92YWx1ZT0nIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSApIC4gIicgV0hFUkUgb3B0aW9uX25hbWU9J3NpdGV1cmwnIExJTUlUIDEiICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTW9kaWZpZWQgJyAuIG15c3FsX2FmZmVjdGVkX3Jvd3MoKSAuICcgcm93KHMpIHdoaWxlIHVwZGF0aW5nIFNpdGUgVVJMIGluIG9wdGlvbnMgdGFibGUgYCcgLiAkdGhpcy0+b3ZlcnJpZGVQcmVmaXggLiAnb3B0aW9uc2AgdG8gYCcgLiAkdGhpcy0+cmVzdG9yZURhdGFbJ3NpdGV1cmwnXSAuICdgLicgKTsKCQlpZiAoIG15c3FsX2Vycm9yKCkgIT0gJycgKSB7IHBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuIG15c3FsX2Vycm9yKCkgKTsgfQoKCQkvLyBVcGRhdGUgSE9NRSBVUkwgaW4gb3B0aW9ucyB0YWJsZS4gVXN1YWxseSBtYXNzIHJlcGxhY2VtZW50IHdpbGwgY292ZXIgdGhpcyBidXQgc2V0IHRoZXNlIGhlcmUganVzdCBpbiBjYXNlLgoJCWlmICggJHRoaXMtPnJlc3RvcmVEYXRhWydob21ldXJsJ10gIT0gJycgKSB7CgkJCW15c3FsX3F1ZXJ5KCAiVVBEQVRFIGAiIC4gJHRoaXMtPm92ZXJyaWRlUHJlZml4IC4gIm9wdGlvbnNgIFNFVCBvcHRpb25fdmFsdWU9JyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHRoaXMtPnJlc3RvcmVEYXRhWydob21ldXJsJ10gKSAuICInIFdIRVJFIG9wdGlvbl9uYW1lPSdob21lJyBMSU1JVCAxIiApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdNb2RpZmllZCAnIC4gbXlzcWxfYWZmZWN0ZWRfcm93cygpIC4gJyByb3cocykgd2hpbGUgdXBkYXRpbmcgSG9tZSBVUkwgaW4gb3B0aW9ucyB0YWJsZSB0byBgJyAuICR0aGlzLT5yZXN0b3JlRGF0YVsnaG9tZXVybCddIC4gJ2AuJyApOwoJCQlpZiAoIG15c3FsX2Vycm9yKCkgIT0gJycgKSB7IHBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbCBlcnJvcjogJyAuIG15c3FsX2Vycm9yKCkgKTsgfQoJCX0KCQkKCQlyZXR1cm4gdHJ1ZTsKCX0KCgoKCgkvKgl2ZXJpZnlfZGF0YWJhc2UoKQogKgkKICoJVmVyaWZ5IHZhcmlvdXMgY29udGVudHMgb2YgdGhlIGRhdGFiYXNlIGFmdGVyIGFsbCBtaWdyYXRpb24gaXMgY29tcGxldGUuCiAqCQogKglAcGFyYW0JCQogKglAcmV0dXJuCQkKICovCglmdW5jdGlvbiB2ZXJpZnlEYXRhYmFzZSgpIHsKCgkJLy9wYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ2ltcG9ydCddLT5jb25uZWN0X2RhdGFiYXNlKCk7CgkJJGRiX3ByZWZpeCA9ICR0aGlzLT5vdmVycmlkZVByZWZpeDsKCgkJLy8gQ2hlY2sgc2l0ZSBVUkwuCgkJJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGB7JGRiX3ByZWZpeH1vcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0nc2l0ZXVybCcgTElNSVQgMSIgKTsKCQlpZiAoICRyZXN1bHQgPT09IGZhbHNlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJldHJpZXZlIHNpdGV1cmwgZnJvbSBkYXRhYmFzZS4gQSBwb3J0aW9uIG9mIHRoZSBkYXRhYmFzZSBtYXkgbm90IGhhdmUgaW1wb3J0ZWQgKG9yIHdpdGggdGhlIHdyb25nIHByZWZpeCkuJyApOwoJCX0gZWxzZSB7CgkJCXdoaWxlKCAkcm93ID0gbXlzcWxfZmV0Y2hfcm93KCAkcmVzdWx0ICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5hbCBzaXRlIFVSTDogYCcgLiAkcm93WzBdIC4gJ2AuJyApOwoJCQl9CgkJCW15c3FsX2ZyZWVfcmVzdWx0KCAkcmVzdWx0ICk7IC8vIEZyZWUgbWVtb3J5LgoJCX0KCgkJLy8gQ2hlY2sgaG9tZSBVUkwuCgkJJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGB7JGRiX3ByZWZpeH1vcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0naG9tZScgTElNSVQgMSIgKTsKCQlpZiAoICRyZXN1bHQgPT09IGZhbHNlICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJldHJpZXZlIGhvbWUgW3VybF0gZnJvbSBkYXRhYmFzZS4gQSBwb3J0aW9uIG9mIHRoZSBkYXRhYmFzZSBtYXkgbm90IGhhdmUgaW1wb3J0ZWQgKG9yIHdpdGggdGhlIHdyb25nIHByZWZpeCkuJyApOwoJCX0gZWxzZSB7CgkJCXdoaWxlKCAkcm93ID0gbXlzcWxfZmV0Y2hfcm93KCAkcmVzdWx0ICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5hbCBob21lIFVSTDogYCcgLiAkcm93WzBdIC4gJ2AuJyApOwoJCQl9CgkJfQoJCUBteXNxbF9mcmVlX3Jlc3VsdCggJHJlc3VsdCApOyAvLyBGcmVlIG1lbW9yeS4KCgkJLy8gVmVyaWZ5IG1lZGlhIHVwbG9hZCBwYXRoLgoJCSRyZXN1bHQgPSBteXNxbF9xdWVyeSggIlNFTEVDVCBvcHRpb25fdmFsdWUgRlJPTSBgeyRkYl9wcmVmaXh9b3B0aW9uc2AgV0hFUkUgb3B0aW9uX25hbWU9J3VwbG9hZF9wYXRoJyBMSU1JVCAxIiApOwoJCWlmICggJHJlc3VsdCA9PT0gZmFsc2UgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gcmV0cmlldmUgdXBsb2FkX3BhdGggZnJvbSBkYXRhYmFzZSB0YWJsZSAnIC4gImB7JGRiX3ByZWZpeH1vcHRpb25zYCIgLiAnLiBBIHBvcnRpb24gb2YgdGhlIGRhdGFiYXNlIG1heSBub3QgaGF2ZSBpbXBvcnRlZCAob3Igd2l0aCB0aGUgd3JvbmcgcHJlZml4KS4nICk7CgkJCSRtZWRpYV91cGxvYWRfcGF0aCA9ICd7RVJSXzM0ODM0OTg0LVVOS05PV059JzsKCQl9IGVsc2UgewoJCQl3aGlsZSggJHJvdyA9IG15c3FsX2ZldGNoX3JvdyggJHJlc3VsdCApICkgewoJCQkJJG1lZGlhX3VwbG9hZF9wYXRoID0gJHJvd1swXTsKCQkJfQoJCX0KCQlAbXlzcWxfZnJlZV9yZXN1bHQoICRyZXN1bHQgKTsgLy8gRnJlZSBtZW1vcnkuCgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ01lZGlhIHVwbG9hZCBwYXRoIGluIGRhdGFiYXNlIG9wdGlvbnMgdGFibGU6IGAnIC4gJG1lZGlhX3VwbG9hZF9wYXRoIC4gJ2AuJyApOwoJCWlmICggc3Vic3RyKCAkbWVkaWFfdXBsb2FkX3BhdGgsIDAsIDEgKSA9PSAnLycgKSB7IC8vIEFic29sdXRlIHBhdGguCgkJCWlmICggIWZpbGVfZXhpc3RzKCAkbWVkaWFfdXBsb2FkX3BhdGggKSApIHsgLy8gTWVkaWEgcGF0aCBkb2VzIG5vdCBleGlzdC4KCQkJCSRtZWRpYV91cGxvYWRfbWVzc2FnZSA9ICdZb3VyIG1lZGlhIHVwbG9hZCBwYXRoIGlzIGFzc2lnbmVkIGEgZGlyZWN0b3J5IHdoaWNoIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCBvbiB0aGlzIHNlcnZlci4gUGxlYXNlIHZlcmlmeSBpdCBpcyBjb3JyZWN0IGluIHlvdXIgV29yZFByZXNzIHNldHRpbmdzLiBDdXJyZW50IHBhdGg6IGAnIC4gJG1lZGlhX3VwbG9hZF9wYXRoIC4gJ2AuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJG1lZGlhX3VwbG9hZF9tZXNzYWdlICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICRtZWRpYV91cGxvYWRfbWVzc2FnZSApOwoJCQl9IGVsc2UgeyAvLyBNZWRpYSBwYXRoIGRvZXMgZXhpc3QuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdZb3VyIG1lZGlhIHVwbG9hZCBwYXRoIGlzIGFzc2lnbmVkIGFuIGFic29sdXRlIHBhdGggd2hpY2ggYXBwZWFycyB0byBiZSBjb3JyZWN0LicgKTsKCQkJfQoJCX0gZWxzZSB7IC8vIFJlbGF0aXZlIHBhdGguCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1lvdXIgbWVkaWEgdXBsb2FkIHBhdGggaXMgYXNzaWduZWQgYSByZWxhdGl2ZSBwYXRoOyB2YWxpZGl0eSBub3QgdGVzdGVkLicgKTsKCQl9CgkJCgkJcmV0dXJuIHRydWU7CgoJfSAvLyBFbmQgdmVyaWZ5RGF0YWJhc2UoKS4KCQoJCgkKCQoKCgoJLyoJX2FycmF5X3BhaXJzX3VuaXF1ZV9maXJzdCgpCgkgKgkKCSAqCVRha2VzIHR3byBhcnJheXMuIExvb2tzIGZvciBhbnkgZHVwbGljYXRlIHZhbHVlcyBpbiB0aGUgZmlyc3QgYXJyYXkuIFRoYXQgaXRlbSBpcyByZW1vdmVkLiBUaGUgY29ycmVzcG9uZGluZyBpdGVtIGluIHRoZSBzZWNvbmQgYXJyYXkgaXMgcmVtb3ZlZCBhbHNvLgoJICoJUmVzZXRzIGluZGV4ZXMgYXMgYSBjb3VydGVzeSB3aGlsZSBtYWludGFpbmluZyBvcmRlci4KCSAqCQoJICoJQHBhcmFtCQlhcnJheQkJJGEJCUZpcnN0IGFycmF5IHRvIG1ha2UgdW5pcXVlLgoJICoJQHBhcmFtCQlhcnJheQkJJGIJCVNlY29uZCBhcnJheSB0aGF0IGhhcyBpdGVtcyByZW1vdmVkIHRoYXQgd2VyZSBpbiB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgcmVtb3ZlZCBkdXBsaWNhdGVzIGZvdW5kIGluICRhLgoJICoJQHJldHVybgkJCgkgKi8KCWZ1bmN0aW9uIF9hcnJheV9wYWlyc191bmlxdWVfZmlyc3QoICRhLCAkYiApIHsKCQkkYV91bmlxdWVzID0gYXJyYXlfdW5pcXVlKCAkYSApOyAvLyBHZXQgdW5pcXVlIHZhbHVlcyBpbiAkYS4gS2V5cyBhcmUgbWFpbnRhaW5lZC4KCQoJCSRyZXN1bHQgPSBhcnJheSgpOwoJCSRyZXN1bHRbMF0gPSAkYV91bmlxdWVzOwoJCSRyZXN1bHRbMV0gPSBhcnJheV9pbnRlcnNlY3Rfa2V5KCAkYiwgJGFfdW5pcXVlcyApOyAvLyBHZXQgdGhlIHBhcnQgb2YgdGhlICRiIGFycmF5IHRoYXQgaXMgbWlzc2luZyBmcm9tICRhLgoJCgkJJHJlc3VsdFswXSA9IGFycmF5X21lcmdlKCAkcmVzdWx0WzBdICk7CgkJJHJlc3VsdFsxXSA9IGFycmF5X21lcmdlKCAkcmVzdWx0WzFdICk7CgkJcmV0dXJuICRyZXN1bHQ7Cgl9IC8vIEVuZCBfYXJyYXlfcGFpcnNfdW5pcXVlX2ZpcnN0KCkuCn0gLy8gZW5kIGNsYXNzIGJhY2t1cGJ1ZGR5X21pZ3JhdGVEQi4K
###PACKDATA,FILE_END,/classes/_migrate_database.php,importbuddy/classes/_migrate_database.php
###PACKDATA,FILE_START,/classes/core.php,importbuddy/classes/core.php
PD9waHAKLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgQmFja3VwQnVkZHkuCi8vIFRPRE86IEV2ZW50dWFsbHkgYnJlYWsgb3V0IG9mIGEgbG90IG9mIHRoZXNlIGZyb20gQkIgY29yZS4gTWlncmF0aW5nIGZyb20gb2xkIGZyYW1ld29yayB0byBuZXcgcmVzdWx0ZWQgaW4gdGhpcyBtaWQtd2F5IHRyYW5zaXRpb24gYnV0IGl0J3MgYSBiaXQgbWVzc3kuLi4KCmNsYXNzIGJhY2t1cGJ1ZGR5X2NvcmUgewoKCWNvbnN0IE1BWF9TRUNPTkRTX1RPX0tFRVBfT1JQSEFORURfRklMRU9QVElPTlNfRklMRVMgPSAyNTkyMDAwOyAvLyAzMCBkYXlzIC0gT25jZSB0aGlzIHRpbWUgaGFzIHBhc3NlZCB0aGVuIHRoZSBob3VzZWtlZXBpbmcgY2xlYW51cCBmdW5jdGlvbiB3aWxsIGJlIGdpdmVuIHRoZSBnby1haGVhZCB0byBkZWxldGUgZmlsZW9wdGlvbnMgZmlsZXMgdGhhdCBoYXZlIG5vIGxvY2FsIGJhY2t1cCB6aXAgZmlsZSB0aGF0IG1hdGNoZXMgdGhlaXIgc2VyaWFsLiBXZSBrZWVwIHRoZXNlIGZvciBhIHdoaWxlIHNvIHRoZSBSZWNlbnQgQmFja3VwcyBwYWdlIHdpbGwga2VlcCB0aGVtIGluIGl0cyBsaXN0LgoJcHJpdmF0ZSBzdGF0aWMgJF9jYWNoZWRMb2dEaXJlY3RvcnkgPSAnJzsgLy8gQ2FjaGVkIGxvZyBkaXIgZm9yIGdldExvZ0RpcmVjdG9yeSgpIHRvIHByZXZlbnQgaGF2aW5nIHRvIGNhbGwgV1AgdG8gcmV0cmlldmUuCgkKCXB1YmxpYyBzdGF0aWMgJHdhcm5fcGx1Z2lucyA9IGFycmF5KAoJCSd3My10b3RhbC1jYWNoZS5waHAnID0+ICdXMyBUb3RhbCBDYWNoZScsCgkJJ3dwLWNhY2hlLnBocCcgPT4gJ1dQIFN1cGVyIENhY2hlJywKCSk7CgoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJldHR5RnVuY3Rpb25UaXRsZSggJGZ1bmN0aW9uLCAkYXJncyA9ICcnICkgewoKCQlpZiAoICRmdW5jdGlvbiA9PSAnYmFja3VwX2NyZWF0ZV9kYXRhYmFzZV9kdW1wJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnQmFja2luZyB1cCBkYXRhYmFzZSc7CgkJCWlmICggJycgIT0gJGFyZ3MgKSB7CgkJCQkkc3ViRnVuY3Rpb25UaXRsZSA9ICdUYWJsZXM6ICcgLiBpbXBsb2RlKCAnLCAnLCAkYXJnc1swXSApOwoJCQl9CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ2JhY2t1cF96aXBfZmlsZXMnICkgewoJCQkkZnVuY3Rpb25UaXRsZSA9ICdaaXBwaW5nIHVwIGZpbGVzJzsKCQl9IGVsc2VpZiAoICRmdW5jdGlvbiA9PSAnaW50ZWdyaXR5X2NoZWNrJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnVmVyaWZ5aW5nIGJhY2t1cCBmaWxlIGludGVncml0eSc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ3Bvc3RfYmFja3VwJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnQ2xlYW5pbmcgdXAnOwoJCX0gZWxzZWlmICggJGZ1bmN0aW9uID09ICdtc19kb3dubG9hZF9leHRyYWN0X3dvcmRwcmVzcycgKSB7CgkJCSRmdW5jdGlvblRpdGxlID0gJ0Rvd25sb2FkaW5nIFdvcmRQcmVzcyBjb3JlIGZpbGVzIGZyb20gd29yZHByZXNzLm9yZyc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ21zX2NyZWF0ZV93cF9jb25maWcnICkgewoJCQkkZnVuY3Rpb25UaXRsZSA9ICdHZW5lcmF0aW5nIHN0YW5kYXJkIHdwLWNvbmZpZy5waHAgZm9yIGV4cG9ydCc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ21zX2NvcHlfcGx1Z2lucycgKSB7CgkJCSRmdW5jdGlvblRpdGxlID0gJ0NvcHlpbmcgcGx1Z2lucyc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ21zX2NvcHlfdGhlbWVzJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnQ29weWluZyB0aGVtZXMnOwoJCX0gZWxzZWlmICggJGZ1bmN0aW9uID09ICdtc19jb3B5X21lZGlhJyApIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAnQ29weWluZyBtZWRpYSc7CgkJfSBlbHNlaWYgKCAkZnVuY3Rpb24gPT0gJ21zX2NvcHlfdXNlcnNfdGFibGUnICkgewoJCQkkZnVuY3Rpb25UaXRsZSA9ICdDb3B5aW5nIHVzZXJzJzsKCQl9IGVsc2VpZiAoICRmdW5jdGlvbiA9PSAnbXNfY2xlYW51cCcgKSB7CgkJCSRmdW5jdGlvblRpdGxlID0gJ0NsZWFuaW5nIHVwIE11bHRpc2l0ZS1zcGVjaWZpYyB0ZW1wb3JhcnkgZGF0YSc7CgkJfSBlbHNlIHsKCQkJJGZ1bmN0aW9uVGl0bGUgPSAkZnVuY3Rpb247CgkJfQoKCQlyZXR1cm4gJGZ1bmN0aW9uVGl0bGU7Cgl9IC8vIGVuZCBwcmV0dHlGdW5jdGlvblRpdGxlKCkuCgoJLyoJaXNfbmV0d29ya19hY3RpdmF0ZWQoKQoJICoJCgkgKglSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBwbHVnaW4gaXMgbmV0d29yayBhY3RpdmF0ZWQgb3Igbm90LgoJICoJCgkgKglAcmV0dXJuCQlib29sZWFuCQkJVHJ1ZSBpZiBwbHVnaW4gaXMgbmV0d29yayBhY3RpdmF0ZWQsIGVsc2UgZmFsc2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfbmV0d29ya19hY3RpdmF0ZWQoKSB7CgoJCWlmICggIWZ1bmN0aW9uX2V4aXN0cyggJ2lzX3BsdWdpbl9hY3RpdmVfZm9yX25ldHdvcmsnICkgKSB7IC8vIEZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIFdvcmRQcmVzcyBwYWdlcyBmb3Igc29tZSByZWFzb24gYWNjb3JkaW5nIHRvIGNvZGV4LgoJCQlyZXF1aXJlX29uY2UoIEFCU1BBVEggLiAnL3dwLWFkbWluL2luY2x1ZGVzL3BsdWdpbi5waHAnICk7CgkJfQoJCWlmICggaXNfcGx1Z2luX2FjdGl2ZV9mb3JfbmV0d29yayggYmFzZW5hbWUoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpICkgLiAnLycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdpbml0JyApICkgKSB7IC8vIFBhdGggcmVsYXRpdmUgdG8gd3AtY29udGVudFxwbHVnaW5zXCBkaXJlY3RvcnkuCgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJfSAvLyBFbmQgaXNfbmV0d29ya19hY3RpdmF0ZWQoKS4KCgoKCS8qCWJhY2t1cF9pbnRlZ3JpdHlfY2hlY2soKQoJICoJCgkgKglTY2FucyBhIGJhY2t1cCBmaWxlIGFuZCBzYXZlcyB0aGUgcmVzdWx0IGluIGRhdGEgc3RydWN0dXJlLiBDaGVja3MgZm9yIGtleSBmaWxlcyAmIHRoYXQgLnppcCBjYW4gYmUgcmVhZCBwcm9wZXJseS4gU3RvcmVzIHJlc3VsdHMgd2l0aCBkZXRhaWxzIGluIGRhdGEgc3RydWN0dXJlLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCQlGdWxsIHBhdGhuYW1lICYgZmlsZW5hbWUgdG8gYmFja3VwIGZpbGUgdG8gY2hlY2suCgkgKglAcGFyYW0JCW9iagkJCSRmaWxlb3B0aW9ucwlmaWxlb3B0aW9ucyBvYmplY3QgY3VycmVudGx5IGhvbGRpbmcgdGhlIGZpbGVvcHRpb25zIGZpbGUgb3BlbiwgaWYgYW55LgoJICoJQHBhcmFtCQlhcnJheSAJCSRvcHRpb25zCQlBcnJheSBvZiBvcHRpb25zLgoJICoJQHJldHVybgkJYXJyYXkJCQkJCQlSZXR1cm5zIGludGVncml0eSBkYXRhIGFycmF5LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJhY2t1cF9pbnRlZ3JpdHlfY2hlY2soICRmaWxlLCAkZmlsZW9wdGlvbnMgPSAnJywgJG9wdGlvbnMgPSBhcnJheSgpLCAkc2tpcExvZ1JlZGlyZWN0ID0gZmFsc2UgKSB7CgkJCgkJcmV0dXJuIGluY2x1ZGUoICdfaW50ZWdyaXR5Q2hlY2sucGhwJyk7CgkJCgl9IC8vIEVuZCBiYWNrdXBfaW50ZWdyaXR5X2NoZWNrKCkuCgoKCgkvKglnZXRfc2VyaWFsX2Zyb21fZmlsZSgpCgkgKgkKCSAqCVJldHVybnMgdGhlIGJhY2t1cCBzZXJpYWwgYmFzZWQgb24gdGhlIGZpbGVuYW1lLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCUZpbGVuYW1lIGNvbnRhaW5pbmcgYSBzZXJpYWwgdG8gZXh0cmFjdC4KCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJU2VyaWFsIGZvdW5kLiBFbXB0eSBzdHJpbmcgaWYgdW5hYmxlIHRvIGZpbmQgc2VyaWFsLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9zZXJpYWxfZnJvbV9maWxlKCAkZmlsZSApIHsKCQkKCQlpZiAoIGZhbHNlID09PSAoICRkYXNocG9zID0gc3RycnBvcyggJGZpbGUsICctJyApICkgKSB7CgkJCXJldHVybiAnJzsKCQl9CgkJJHNlcmlhbCA9ICRkYXNocG9zICsgMTsKCQkkc2VyaWFsID0gc3Vic3RyKCAkZmlsZSwgJHNlcmlhbCwgKCBzdHJsZW4oICRmaWxlICkgLSAkc2VyaWFsIC0gNCApICk7CgkJCgkJcmV0dXJuICRzZXJpYWw7CgkJCgl9IC8vIEVuZCBnZXRfc2VyaWFsX2Zyb21fZmlsZSgpLgoKCgoJLyoqCgkgKiB2ZXJzaW9uc19jb25maXJtKCkKCSAqCgkgKiBDaGVjayB0aGUgdmVyc2lvbiBvZiBhbiBpdGVtIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBCYWNrdXBCdWRkeSByZXF1aXJlcy4KCSAqCgkgKiBAcGFyYW0JCXN0cmluZwkJJHR5cGUJCU9wdGlvbmFsLiBJZiBsZWZ0IGJsYW5rICcnIHRoZW4gYWxsIHRlc3RzIHdpbGwgYmUgcGVyZm9ybWVkLiBWYWxpZCB2YWx1ZXM6IHdvcmRwcmVzcywgcGhwLCAnJy4KCSAqIEBwYXJhbQkJYm9vbGVhbgkJJG5vdGlmeQkJT3B0aW9uYWwuIFdoZXRoZXIgb3Igbm90IHRvIGFsZXJ0IHRvIHRoZSBzY3JlZW4gKGFuZCB0aHJvdyBlcnJvciB0byBsb2cpIG9mIGEgdmVyc2lvbiBpc3N1ZS5cCgkgKiBAcmV0dXJuCQlib29sZWFuCQkJCQlUcnVlIGlmIHRoZSBzZWxlY3RlZCB0eXBlIGlzIGEgYmFkIHZlcnNpb24KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2ZXJzaW9uc19jb25maXJtKCAkdHlwZSA9ICcnLCAkbm90aWZ5ID0gZmFsc2UgKSB7CgoJCSRiYWRfdmVyc2lvbiA9IGZhbHNlOwoKCQlpZiAoICggJHR5cGUgPT0gJ3dvcmRwcmVzcycgKSB8fCAoICR0eXBlID09ICcnICkgKSB7CgkJCWdsb2JhbCAkd3BfdmVyc2lvbjsKCQkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoICR3cF92ZXJzaW9uLCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd3cF9taW5pbXVtJyApLCAnPD0nICkgKSB7CgkJCQlpZiAoICRub3RpZnkgPT09IHRydWUgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBzcHJpbnRmKCBfXygnRVJST1I6IEJhY2t1cEJ1ZGR5IHJlcXVpcmVzIFdvcmRQcmVzcyB2ZXJzaW9uICUxJHMgb3IgaGlnaGVyLiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBiZWhhdmlvciBvciBjb21wbGV0ZSBmYWlsdXJlIGluIHRoaXMgZW52aXJvbm1lbnQuIFBsZWFzZSBjb25zaWRlciB1cGdyYWRpbmcgV29yZFByZXNzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCBzZWxmOjpfd3BfbWluaW11bSkgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6bG9nKCAnVW5zdXBwb3J0ZWQgV29yZFByZXNzIFZlcnNpb246ICcgLiAkd3BfdmVyc2lvbiAsICdlcnJvcicgKTsKCQkJCX0KCQkJCSRiYWRfdmVyc2lvbiA9IHRydWU7CgkJCX0KCQl9CgkJaWYgKCAoICR0eXBlID09ICdwaHAnICkgfHwgKCAkdHlwZSA9PSAnJyApICkgewoJCQlpZiAoIHZlcnNpb25fY29tcGFyZSggUEhQX1ZFUlNJT04sIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3BocF9taW5pbXVtJyApLCAnPD0nICkgKSB7CgkJCQlpZiAoICRub3RpZnkgPT09IHRydWUgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBzcHJpbnRmKCBfXygnRVJST1I6IEJhY2t1cEJ1ZGR5IHJlcXVpcmVzIFBIUCB2ZXJzaW9uICUxJHMgb3IgaGlnaGVyLiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBiZWhhdmlvciBvciBjb21wbGV0ZSBmYWlsdXJlIGluIHRoaXMgZW52aXJvbm1lbnQuIFBsZWFzZSBjb25zaWRlciB1cGdyYWRpbmcgUEhQLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCBQSFBfVkVSU0lPTiApICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OmxvZyggJ1Vuc3VwcG9ydGVkIFBIUCBWZXJzaW9uOiAnIC4gUEhQX1ZFUlNJT04gLCAnZXJyb3InICk7CgkJCQl9CgkJCQkkYmFkX3ZlcnNpb24gPSB0cnVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGJhZF92ZXJzaW9uOwoKCX0gLy8gRW5kIHZlcnNpb25zX2NvbmZpcm0oKS4KCgoKCS8qIGdldEJhY2t1cERpcmVjdG9yeSgpCQkJYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkKCSAqCgkgKiBSZXRyaWV2ZSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgYmFja3VwcyB3aXRoaW4uCgkgKgoJICogQHJldHVybglzdHJpbmcJCUZ1bGwgcGF0aCB0byBkaXJlY3RvcnksIGluY2x1ZGluZyB0cmFpbGluZyBzbGFzaC4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QmFja3VwRGlyZWN0b3J5KCkgewoJCWlmICggJycgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydiYWNrdXBfZGlyZWN0b3J5J10gKSB7CgkJCSRkaXIgPSBzZWxmOjpfZ2V0QmFja3VwRGlyZWN0b3J5RGVmYXVsdCgpOwoJCX0gZWxzZSB7CgkJCSRkaXIgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2JhY2t1cF9kaXJlY3RvcnknXTsKCQl9CgkJcmV0dXJuICRkaXI7Cgl9CgoKCgkvKiBnZXRMb2dEaXJlY3RvcnkoKQkJCWJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpCgkgKgoJICogUmV0cmlldmUgZGlyZWN0b3J5IGZvciBzdG9yaW5nIGxvZ3Mgd2l0aGluLiBDYWNoZXMgCgkgKgoJICogQHJldHVybglzdHJpbmcJCUZ1bGwgcGF0aCB0byBkaXJlY3RvcnksIGluY2x1ZGluZyB0cmFpbGluZyBzbGFzaC4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TG9nRGlyZWN0b3J5KCkgewoJCWlmICggJycgIT0gc2VsZjo6JF9jYWNoZWRMb2dEaXJlY3RvcnkgKSB7CgkJCXJldHVybiBzZWxmOjokX2NhY2hlZExvZ0RpcmVjdG9yeTsKCQl9CgkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiAoIHRydWUgPT09IFBCX1NUQU5EQUxPTkUgKSApIHsKCQkJcmV0dXJuIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvJzsKCQl9CgkJCgkJJHVwbG9hZHNfZGlycyA9IHdwX3VwbG9hZF9kaXIoKTsKCQlzZWxmOjokX2NhY2hlZExvZ0RpcmVjdG9yeSA9ICR1cGxvYWRzX2RpcnNbJ2Jhc2VkaXInXSAuICcvcGJfYmFja3VwYnVkZHkvJzsKCQlyZXR1cm4gc2VsZjo6JF9jYWNoZWRMb2dEaXJlY3Rvcnk7Cgl9IC8vIEVuZCBnZXRMb2dEaXJlY3RvcnkoKS4KCgoKCS8qIGdldFRlbXBEaXJlY3RvcnkoKQkJCWJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKQoJICoKCSAqIFJldHJpZXZlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGVtcG9yYXJ5IGZpbGVzIHdpdGhpbi4KCSAqCgkgKiBAcmV0dXJuCXN0cmluZwkJRnVsbCBwYXRoIHRvIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHRyYWlsaW5nIHNsYXNoLgoJICoKCSAqLwoJLy8gYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRlbXBEaXJlY3RvcnkoKSB7CgkJcmV0dXJuIEFCU1BBVEggLiAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJzsKCX0gLy8gRW5kIGdldFRlbXBEaXJlY3RvcnkoKS4KCgoKCS8qIF9nZXRCYWNrdXBEaXJlY3RvcnlEZWZhdWx0KCkKCSAqCgkgKiBEZWZhdWx0IGRpcmVjdG9yeSBiYWNrdXBzIHdpbGwgYmUgc3RvcmVkIGluLiBnZXRCYWNrdXBEaXJlY3RvcnkoKSB1c2VzIHRoaXMgYXMgdGhlIGRlZmF1bHQgaWYgbm8gcGF0aCBpcyBzcGVjaWZpY2FsbHkgc2V0LgoJICoKCSAqIEByZXR1cm4Jc3RyaW5nCQlGdWxsIHBhdGggdG8gZGlyZWN0b3J5LCBpbmNsdWRpbmcgdHJhaWxpbmcgc2xhc2guCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9nZXRCYWNrdXBEaXJlY3RvcnlEZWZhdWx0KCkgewoJCWlmICggZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICYmICggdHJ1ZSA9PT0gUEJfSU1QT1JUQlVERFkgKSApIHsKCQkJcmV0dXJuIEFCU1BBVEg7CgkJfQoJCSR1cGxvYWRzX2RpcnMgPSB3cF91cGxvYWRfZGlyKCk7CgkJcmV0dXJuICR1cGxvYWRzX2RpcnNbJ2Jhc2VkaXInXSAuICcvYmFja3VwYnVkZHlfYmFja3Vwcy8nOwoJfSAvLyBFbmQgX2dldEJhY2t1cERpcmVjdG9yeURlZmF1bHQoKS4KCgoKCS8qCWdldF9kaXJlY3RvcnlfZXhjbHVzaW9ucygpCgkgKgkKCSAqCUdldCBzYW5pdGl6ZWQgZGlyZWN0b3J5IGV4Y2x1c2lvbnMuIEV4Y2x1c2lvbnMgYXJlIHJlbGF0aXZlIHRvIHNpdGUgcm9vdCAoQUJTUEFUSCkuIFNlZSBpbXBvcnRhbnQgbm90ZSBiZWxvdyEKCSAqCUlNUE9SVEFOVCBOT1RFOiBDYW5ub3QgZXhjbHVkZSB0aGUgdGVtcCBkaXJlY3RvcnkgaGVyZSBhcyB0aGlzIGlzIHdoZXJlIFNRTCBhbmQgREFUIGZpbGVzIGFyZSBzdG9yZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgYmFja3VwIGFyY2hpdmUuCgkgKgkKCSAqCUBwYXJhbQkJYXJyYXkgCSRwcm9maWxlCQlQcm9maWxlIGFycmF5IG9mIGRhdGEuCgkgKglAcGFyYW0JCWJvb2wJJHRyaW1fc3VmZml4CVRydWUgKGRlZmF1bHQpIGlmIHRyYWlsaW5nIHNsYXNoIHNob3VsZCBiZSB0cmltbWVkIGZyb20gZGlyZWN0b3JpZXMKCSAqCUBwYXJhbQkJc3RyaW5nCSRzZXJpYWwJCQlPcHRpb25hbCBzZXJpYWwgb2YgY3VycmVudCBiYWNrdXAuIEJ5IGRlZmF1bHQgYWxsIHN1YmRpcmVjdG9yaWVzIHdpdGhpbiB0aGUgYmFja3VwYnVkZHlfdGVtcCBkaXIgYXJlIGV4cGxpY2l0bHkgZXhjbHVkZWQuIFNwZWNpZnlpbmcgYWxsb3dzIHRoaXMgc2VyaWFsIHN1YmRpcmVjdG9yeSB0byBub3QgYmUgZXhjbHVkZWQuCgkgKglAcmV0dXJuCQlhcnJheQkJCQkJQXJyYXkgb2YgZGlyZWN0b3JpZXMgdG8gZXhjbHVkZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfZGlyZWN0b3J5X2V4Y2x1c2lvbnMoICRwcm9maWxlLCAkdHJpbV9zdWZmaXggPSB0cnVlLCAkc2VyaWFsID0gJycgKSB7CgkJCgkJJHByb2ZpbGUgPSBhcnJheV9tZXJnZSggcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAncHJvZmlsZV9kZWZhdWx0cycgKSwgJHByb2ZpbGUgKTsKCQkKCQkvLyBHZXQgaW5pdGlhbCBhcnJheS4KCQkkZXhjbHVzaW9ucyA9IHRyaW0oICRwcm9maWxlWydleGNsdWRlcyddICk7IC8vIFRyaW0gc3RyaW5nLgoJCSRleGNsdXNpb25zID0gcHJlZ19zcGxpdCgnL1xufFxyfFxyXG4vJywgJGV4Y2x1c2lvbnMgKTsgLy8gQnJlYWsgaW50byBhcnJheSBvbiBhbnkgdHlwZSBvZiBsaW5lIGVuZGluZy4KCQkKCQkKCQkvLyBCYWNrdXAgZGlyIGNhbiBiZSBjdXN0b20gc2V0IGFuZCBldmVuIG1pZ3JhdGVkIG92ZXIgdG8gaGF2ZSB3ZWlyZCBzbGFzaCBtaXNtYXRjaCBpc3N1ZXMuIFNhbml0aXplIGl0LgoJCSRiYWNrdXBEaXIgPSAnLycgLiBsdHJpbSggc3RyX3JlcGxhY2UoIEFCU1BBVEgsICcnLCBzZWxmOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApLCAnXFwvJyApOyAvLyBCYWNrdXBCdWRkeSBiYWNrdXAgc3RvcmFnZSBkaXJlY3RvcnkuIE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIGFsbCBnb29kLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0luaXRpYWxseSBjYWxjdWxhdGVkIHJlbGF0aXZlIGJhY2t1cCBzdG9yYWdlIGRpcmVjdG9yeTogYCcgLiAkYmFja3VwRGlyIC4gJy4nICk7CgkJJG5vcm1lZEJhY2t1cERpciA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnLycsICRiYWNrdXBEaXIgKTsKCQkkbm9ybWVkQUJTUEFUSCA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnLycsIEFCU1BBVEggKTsKCQlpZiAoIEZBTFNFICE9PSAoIHN0cmlzdHIoICRub3JtZWRCYWNrdXBEaXIsICRub3JtZWRBQlNQQVRIICkgKSApIHsgLy8gQUJTUEFUSCBzdGlsbCBleGlzdHMgaW4gdGhlIHBhdGggZHVlIHRvIHNvbWUgd2VpcmQgc2xhc2ggZGlyZWN0aW9uIG1pc21hdGNoLiBUcnkgdG8geWFuayBpdCBvdXQuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0FCU1BBVEggYCcgLiBBQlNQQVRIIC4gJ2Agc3RpbGwgZm91bmQgYmFja3VwIGRpcmVjdG9yeSBwYXRoIGAnIC4gJG5vcm1lZEJhY2t1cERpciAuICdgIHNvIGl0IGlzIHN0aWxsIG5vdCByZWxhdGl2ZS4gVXNpbmcgbm9ybWFsaXplZCBBQlNQQVRIIGAnIC4gJG5vcm1lZEFCU1BBVEggIC4gJ2AgYW5kIG5vcm1hbGl6ZWQgYmFja3VwIGRpcmVjdG9yeSBgJyAuICRub3JtZWRCYWNrdXBEaXIgLiAnYCB0byBtYWtlIHJlbGF0aXZlLicgKTsKCQkJJGJhY2t1cERpciA9IHN0cl9yZXBsYWNlKCAkbm9ybWVkQUJTUEFUSCwgJG5vcm1lZEJhY2t1cERpciwgJGJhY2t1cERpciApOwoJCX0KCQkkZXhjbHVzaW9uc1tdID0gJGJhY2t1cERpcjsKCQkKCQkKCQkkZXhjbHVzaW9uc1tdID0gJy8nIC4gbHRyaW0oIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgc2VsZjo6Z2V0TG9nRGlyZWN0b3J5KCkgKSwgJ1xcLycgKTsgLy8gQmFja3VwQnVkZHkgbG9ncyAmIGZpbGVvcHRpb25zIGRhdGEuCgkJJGV4Y2x1c2lvbnNbXSA9ICcvaW1wb3J0YnVkZHkvJzsgLy8gRXhjbHVkZSBpbXBvcnRidWRkeSBkaXJlY3RvcnkgaW4gcm9vdC4KCQkkZXhjbHVzaW9uc1tdID0gJy9pbXBvcnRidWRkeS5waHAnOyAvLyBFeGNsdWRlIGltcG9ydGJ1ZGR5LnBocCBzY3JpcHQgaW4gcm9vdC4KCQkKCQkvLyBFeGNsdWRlIGFsbCB0ZW1wIGRpcmVjdG9yaWVzIHdpdGhpbiBiYWNrdXBidWRkeV90ZW1wLCBleGNlcHQgYW55IHN1YmRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdGhlIHNlcmlhbCBzcGVjaWZpZWQgKGlmIGFueSkuCgkJJHRlbXBEaXJzID0gZ2xvYiggc2VsZjo6Z2V0VGVtcERpcmVjdG9yeSgpIC4gJyonLCBHTE9CX09OTFlESVIgKTsKCQlpZiAoICEgaXNfYXJyYXkoICR0ZW1wRGlycyApICkgewoJCQkkdGVtcERpcnMgPSBhcnJheSgpOwoJCX0KCQlmb3JlYWNoKCAkdGVtcERpcnMgYXMgJHRlbXBEaXIgKSB7CgkJCWlmICggKCAnJyA9PSAkc2VyaWFsICkgfHwgKCBmYWxzZSA9PT0gc3Ryc3RyKCAkdGVtcERpciwgJHNlcmlhbCApICkgKSB7IC8vIElmIG5vIHNwZWNpZmljIHNlcmlhbCBzdXBwbGllZCBPUiB0aGlzIGRpciBkb2VzIG5vdCBjb250YWluIHRoZSBzZXJpYWwsIGV4Y2x1ZGUgaXQuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdWRpbmcgYWRkaXRpb25hbCB0ZW1wIGRpcmVjdG9yeSBzdWJkaXI6IGAnIC4gJHRlbXBEaXIgLiAnYC4nICk7CgkJCQkkZXhjbHVzaW9uc1tdID0gJy8nIC4gdHJpbSggc3RyX3JlcGxhY2UoIEFCU1BBVEgsICcnLCAkdGVtcERpciApLCAnXFwvJyApIC4gJy8nOwoJCQl9CgkJfQoJCQoJCS8vIENsZWFuIHVwICYgc2FuaXRpemUgYXJyYXkuCgkJaWYgKCAkdHJpbV9zdWZmaXggKSB7CgkJCWFycmF5X3dhbGsoICRleGNsdXNpb25zLCBjcmVhdGVfZnVuY3Rpb24oICcmJHZhbCcsICckdmFsID0gcnRyaW0oIHRyaW0oICR2YWwgKSwgXCcvXCcgKTsnICkgKTsgLy8gQXBwbHkgdHJpbSB0byBhbGwgaXRlbXMgd2l0aGluLgoJCX0gZWxzZSB7CgkJCWFycmF5X3dhbGsoICRleGNsdXNpb25zLCBjcmVhdGVfZnVuY3Rpb24oICcmJHZhbCcsICckdmFsID0gdHJpbSggJHZhbCApOycgKSApOyAvLyBBcHBseSAod2hpdGVzcGFjZS1vbmx5KSB0cmltIHRvIGFsbCBpdGVtcyB3aXRoaW4uCQkKCQl9CgkJJGV4Y2x1c2lvbnMgPSBhcnJheV9maWx0ZXIoICRleGNsdXNpb25zLCAnc3RybGVuJyApOyAvLyBSZW1vdmUgYW55IGVtcHR5IC8gYmxhbmsgbGluZXMuCgkJCgkJJGV4Y2x1c2lvbnMgPSBhcHBseV9maWx0ZXJzKCAnYmFja3VwYnVkZHlfemlwX2V4Y2x1c2lvbnMnLCAkZXhjbHVzaW9ucyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0luaXRpYWwgemlwIGV4Y2x1c2lvbnMgKGFmdGVyIGZpbHRlcik6IGAnIC4gaW1wbG9kZSggJzsgJywgJGV4Y2x1c2lvbnMgKSAuICdgLicgKTsKCQkKCQlyZXR1cm4gJGV4Y2x1c2lvbnM7CgkJCgl9IC8vIEVuZCBnZXRfZGlyZWN0b3J5X2V4Y2x1c2lvbnMoKS4KCgoKCS8qCW1haWxfZXJyb3IoKQoJICoJCgkgKglTZW5kcyBhbiBlcnJvciBlbWFpbCB0byB0aGUgZGVmaW5lZCBlbWFpbCBhZGRyZXNzKGVzKSBvbiBzZXR0aW5ncyBwYWdlLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJCSRtZXNzYWdlCU1lc3NhZ2UgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGVtYWlsLgoJICoJQHBhcmFtCQlzdHJpbmcJCQkkb3ZlcnJpZGVfcmVjaXBpZW50CUVtYWlsIGFkZHJlc3MoZXMpIHRvIHNlbmQgdG8gaW5zdGVhZCBvZiB0aGUgbm9ybWFsIHJlY2lwaWVudC4KCSAqCUBwYXJhbQkJc3RyaW5nfGFycmF5IAlTdHJpbmcgb3IgYXJyYXkgb2YgZmlsZW5hbWUocykgdG8gc2VuZCBhcyBlbWFpbCBhdHRhY2htZW50cy4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYWlsX2Vycm9yKCAkbWVzc2FnZSwgJG92ZXJyaWRlX3JlY2lwaWVudCA9ICcnLCAkYXR0YWNobWVudHMgPSBhcnJheSgpICkgewoKCQlpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkKCk7CgkJfQoKCQkkc3ViamVjdCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfbm90aWZ5X2Vycm9yX3N1YmplY3QnXTsKCQkkYm9keSA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfbm90aWZ5X2Vycm9yX2JvZHknXTsKCgkJJHJlcGxhY2VtZW50cyA9IGFycmF5KAoJCQkne3NpdGVfdXJsfScgPT4gc2l0ZV91cmwoKSwKCQkJJ3tiYWNrdXBidWRkeV92ZXJzaW9ufScgPT4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSwKCQkJJ3tjdXJyZW50X2RhdGV0aW1lfScgPT4gZGF0ZShEQVRFX1JGQzgyMiksCgkJCSd7bWVzc2FnZX0nID0+ICRtZXNzYWdlCgkJKTsKCgkJZm9yZWFjaCggJHJlcGxhY2VtZW50cyBhcyAkcmVwbGFjZV9rZXkgPT4gJHJlcGxhY2VtZW50ICkgewoJCQkkc3ViamVjdCA9IHN0cl9yZXBsYWNlKCAkcmVwbGFjZV9rZXksICRyZXBsYWNlbWVudCwgJHN1YmplY3QgKTsKCQkJJGJvZHkgPSBzdHJfcmVwbGFjZSggJHJlcGxhY2Vfa2V5LCAkcmVwbGFjZW1lbnQsICRib2R5ICk7CgkJfQoKCQkkZW1haWwgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9lcnJvciddOwoJCWlmICggJG92ZXJyaWRlX3JlY2lwaWVudCAhPSAnJyApIHsKCQkJJGVtYWlsID0gJG92ZXJyaWRlX3JlY2lwaWVudDsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT3ZlcnJpZGluZyBlbWFpbCByZWNpcGllbnQgdG86IGAnIC4gJG92ZXJyaWRlX3JlY2lwaWVudCAuICdgLicgKTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2VuZGluZyBlbWFpbCBlcnJvciBub3RpZmljYXRpb24gd2l0aCBzdWJqZWN0IGAnIC4gJHN1YmplY3QgLiAnYCB0byByZWNpcGllbnQocyk6IGAnIC4gJGVtYWlsIC4gJ2AuJyApOwoJCWlmICggIWVtcHR5KCAkZW1haWwgKSApIHsKCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX3JldHVybiddICE9ICcnICkgewoJCQkJJGVtYWlsX3JldHVybiA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfcmV0dXJuJ107CgkJCX0gZWxzZSB7CgkJCQkkZW1haWxfcmV0dXJuID0gZ2V0X29wdGlvbignYWRtaW5fZW1haWwnKTsKCQkJfQoKCQkJJHJlc3VsdCA9IHdwX21haWwoICRlbWFpbCwgJHN1YmplY3QsICRib2R5LCAnRnJvbTogQmFja3VwQnVkZHkgPCcgLiAkZW1haWxfcmV0dXJuIC4gIj5cclxuIi4nUmVwbHktVG86ICcuZ2V0X29wdGlvbignYWRtaW5fZW1haWwnKS4iXHJcbiIsICRhdHRhY2htZW50cyApOwoJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM0NTQ0MzU1NDogVW5hYmxlIHRvIHNlbmQgZXJyb3IgZW1haWwgd2l0aCBXb3JkUHJlc3Mgd3BfbWFpbCgpLiBWZXJpZnkgV29yZFByZXNzICYgU2VydmVyIHNldHRpbmdzLicgKTsKCQkJfQoJCX0KCgl9IC8vIEVuZCBtYWlsX2Vycm9yKCkuCgoKCgkvKgltYWlsX25vdGlmeV9zY2hlZHVsZWQoKQoJICoJCgkgKglTZW5kcyBhIG1lc3NhZ2UgZW1haWwgdG8gdGhlIGRlZmluZWQgZW1haWwgYWRkcmVzcyhlcykgb24gc2V0dGluZ3MgcGFnZS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRzdGFydF9vcl9jb21wbGV0ZQlXaGV0aGVyIHRoaXMgaXMgdGhlIG5vdGlmY2F0aW9uIGZvciBzdGFydGluZyBvciBjb21wbGV0aW5nLiBWYWxpZCB2YWx1ZXM6IHN0YXJ0LCBjb21wbGV0ZQoJICoJQHBhcmFtCQlzdHJpbmcJCSRtZXNzYWdlCQkJTWVzc2FnZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWwuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWFpbF9ub3RpZnlfc2NoZWR1bGVkKCAkc2VyaWFsLCAkc3RhcnRfb3JfY29tcGxldGUsICRtZXNzYWdlICkgewoKCQlpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkKCk7CgkJfQoKCQlpZiAoICRzdGFydF9vcl9jb21wbGV0ZSA9PSAnc3RhcnQnICkgewoJCQkkZW1haWwgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zY2hlZHVsZWRfc3RhcnQnXTsKCgkJCSRzdWJqZWN0ID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydlbWFpbF9ub3RpZnlfc2NoZWR1bGVkX3N0YXJ0X3N1YmplY3QnXTsKCQkJJGJvZHkgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zY2hlZHVsZWRfc3RhcnRfYm9keSddOwoKCQkJJHJlcGxhY2VtZW50cyA9IGFycmF5KAoJCQkJJ3tzaXRlX3VybH0nID0+IHNpdGVfdXJsKCksCgkJCQkne2JhY2t1cGJ1ZGR5X3ZlcnNpb259JyA9PiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApLAoJCQkJJ3tjdXJyZW50X2RhdGV0aW1lfScgPT4gZGF0ZShEQVRFX1JGQzgyMiksCgkJCQkne21lc3NhZ2V9JyA9PiAkbWVzc2FnZQoJCQkpOwoJCX0gZWxzZWlmICggJHN0YXJ0X29yX2NvbXBsZXRlID09ICdjb21wbGV0ZScgKSB7CgkJCSRlbWFpbCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfbm90aWZ5X3NjaGVkdWxlZF9jb21wbGV0ZSddOwoKCQkJJHN1YmplY3QgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX25vdGlmeV9zY2hlZHVsZWRfY29tcGxldGVfc3ViamVjdCddOwoJCQkkYm9keSA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfbm90aWZ5X3NjaGVkdWxlZF9jb21wbGV0ZV9ib2R5J107CgoJCQkkYXJjaGl2ZV9maWxlID0gJyc7CgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvZmlsZW9wdGlvbnMucGhwJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMzcuJyApOwoJCQkkYmFja3VwX29wdGlvbnMgPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiAkc2VyaWFsIC4gJy50eHQnLCAkcmVhZF9vbmx5ID0gdHJ1ZSwgJGlnbm9yZV9sb2NrID0gdHJ1ZSApOwoJCQlpZiAoIHRydWUgIT09ICggJHJlc3VsdCA9ICRiYWNrdXBfb3B0aW9ucy0+aXNfb2soKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yIHJldHJpZXZpbmcgZmlsZW9wdGlvbnMgZmlsZSBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiAkc2VyaWFsIC4gJy50eHQnIC4gJ2AuIEVyciAzNTU2NDMzMi4nICk7CgkJCQkkYXJjaGl2ZV9maWxlID0gJ1tmaWxlX3Vua25vd25dJzsKCQkJCSRiYWNrdXBfc2l6ZSA9ICdbc2l6ZV91bmtub3duXSc7CgkJCQkkYmFja3VwX3R5cGUgPSAnW3R5cGVfdW5rbm93bl0nOwoJCQl9IGVsc2UgewoJCQkJJGFyY2hpdmVfZmlsZSA9ICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1snYXJjaGl2ZV9maWxlJ107CgkJCQkkYmFja3VwX3NpemUgPSAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ2FyY2hpdmVfc2l6ZSddOwoJCQkJJGJhY2t1cF90eXBlID0gJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWyd0eXBlJ107CgkJCX0KCgkJCSRyZXBsYWNlbWVudHMgPSBhcnJheSgKCQkJCSd7c2l0ZV91cmx9JyA9PiBzaXRlX3VybCgpLAoJCQkJJ3tiYWNrdXBidWRkeV92ZXJzaW9ufScgPT4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSwKCQkJCSd7Y3VycmVudF9kYXRldGltZX0nID0+IGRhdGUoREFURV9SRkM4MjIpLAoJCQkJJ3ttZXNzYWdlfScgPT4gJG1lc3NhZ2UsCgoJCQkJJ3tiYWNrdXBfc2VyaWFsfScgPT4gJHNlcmlhbCwKCQkJCSd7ZG93bmxvYWRfbGlua30nID0+IHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ2Rvd25sb2FkX2FyY2hpdmUnICkgLiAnJmJhY2t1cGJ1ZGR5X2JhY2t1cD0nIC4gYmFzZW5hbWUoICRhcmNoaXZlX2ZpbGUgKSwKCQkJCSd7YmFja3VwX2ZpbGV9JyA9PiBiYXNlbmFtZSggJGFyY2hpdmVfZmlsZSApLAoJCQkJJ3tiYWNrdXBfc2l6ZX0nID0+ICRiYWNrdXBfc2l6ZSwKCQkJCSd7YmFja3VwX3R5cGV9JyA9PiAkYmFja3VwX3R5cGUsCgkJCSk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0VSUk9SICM1NDg1Nzg0NTc4NTogRmF0YWxseSBoYWx0ZWQuIEludmFsaWQgc2NoZWR1bGUgdHlwZS4gRXhwZWN0ZWQgYHN0YXJ0YCBvciBgY29tcGxldGVgLiBHb3QgYCcgLiAkc3RhcnRfb3JfY29tcGxldGUgLiAnYC4nICk7CgkJfQoKCgkJZm9yZWFjaCggJHJlcGxhY2VtZW50cyBhcyAkcmVwbGFjZV9rZXkgPT4gJHJlcGxhY2VtZW50ICkgewoJCQkkc3ViamVjdCA9IHN0cl9yZXBsYWNlKCAkcmVwbGFjZV9rZXksICRyZXBsYWNlbWVudCwgJHN1YmplY3QgKTsKCQkJJGJvZHkgPSBzdHJfcmVwbGFjZSggJHJlcGxhY2Vfa2V5LCAkcmVwbGFjZW1lbnQsICRib2R5ICk7CgkJfQoKCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZW1haWxfcmV0dXJuJ10gIT0gJycgKSB7CgkJCSRlbWFpbF9yZXR1cm4gPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2VtYWlsX3JldHVybiddOwoJCX0gZWxzZSB7CgkJCSRlbWFpbF9yZXR1cm4gPSBnZXRfb3B0aW9uKCdhZG1pbl9lbWFpbCcpOwoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTZW5kaW5nIGVtYWlsIHNjaGVkdWxlIG5vdGlmaWNhdGlvbi4gU3ViamVjdDogYCcgLiAkc3ViamVjdCAuICdgOyBib2R5OiBgJyAuICRib2R5IC4gJ2A7IHJlY2lwaWVudChzKTogYCcgLiAkZW1haWwgLiAnYC4nICk7CgkJaWYgKCAhZW1wdHkoICRlbWFpbCApICkgewoJCQl3cF9tYWlsKCAkZW1haWwsICRzdWJqZWN0LCAkYm9keSwgJ0Zyb206IEJhY2t1cEJ1ZGR5IDwnIC4gJGVtYWlsX3JldHVybiAuICI+XHJcbiIuJ1JlcGx5LVRvOiAnLmdldF9vcHRpb24oJ2FkbWluX2VtYWlsJykuIlxyXG4iKTsKCQl9Cgl9IC8vIEVuZCBtYWlsX25vdGlmeV9zY2hlZHVsZWQoKS4KCgoKCS8qCWJhY2t1cF9wcmVmaXgoKQoJICoJCgkgKglTdHJpcHMgYWxsIG5vbi1maWxlLWZyaWVuZGx5IGNoYXJhY3RlcnMgZnJvbSB0aGUgc2l0ZSBVUkwuIFVzZWQgaW4gbWFraW5nIGJhY2t1cCB6aXAgZmlsZW5hbWUuCgkgKgkKCSAqCUByZXR1cm4JCXN0cmluZwkJVGhlIGZpbGVuYW1lIGZyaWVuZGx5IGNvbnZlcnRlZCBzaXRlIFVSTC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBiYWNrdXBfcHJlZml4KCkgewoKCQkkc2l0ZXVybCA9IHNpdGVfdXJsKCk7CgkJJHNpdGV1cmwgPSBzdHJfcmVwbGFjZSggJ2h0dHA6Ly8nLCAnJywgJHNpdGV1cmwgKTsKCQkkc2l0ZXVybCA9IHN0cl9yZXBsYWNlKCAnaHR0cHM6Ly8nLCAnJywgJHNpdGV1cmwgKTsKCQkkc2l0ZXVybCA9IHN0cl9yZXBsYWNlKCAnLycsICdfJywgJHNpdGV1cmwgKTsKCQkkc2l0ZXVybCA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnXycsICRzaXRldXJsICk7CgkJJHNpdGV1cmwgPSBzdHJfcmVwbGFjZSggJy4nLCAnXycsICRzaXRldXJsICk7CgkJJHNpdGV1cmwgPSBzdHJfcmVwbGFjZSggJzonLCAnXycsICRzaXRldXJsICk7IC8vIEFsdGVybmF0aXZlIHBvcnQgZnJvbSA4MCBpcyBzdG9yZWQgaW4gdGhlIHNpdGUgdXJsLgoJCSRzaXRldXJsID0gc3RyX3JlcGxhY2UoICd+JywgJ18nLCAkc2l0ZXVybCApOyAvLyBTdHJpcCB+LgoJCXJldHVybiAkc2l0ZXVybDsKCgl9IC8vIEVuZCBiYWNrdXBfcHJlZml4KCkuCgoKCgkvKiBnZXRfcmVtb3RlX3NlbmRfZGVmYXVsdHMoKQoJICoKCSAqIEdldCBkZWZhdWx0IGFycmF5IHZhbHVlcyBmb3IgdGhlIHJlbW90ZV9zZW5kcyBmaWxlb3B0aW9ucyBmaWxlcy4KCSAqIEByZXR1cm4JCWFycmF5CgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9yZW1vdGVfc2VuZF9kZWZhdWx0cygpIHsKCQlyZXR1cm4gYXJyYXkoCgkJCSdkZXN0aW5hdGlvbicJCT0+CTAsCgkJCSdmaWxlJwkJCQk9PgknJywKCQkJJ2ZpbGVfc2l6ZScJCQk9PgkwLAoJCQkndHJpZ2dlcicJCQk9PgknJywJCQkJCQkvLyBXaGF0IHRyaWdnZXJlZCB0aGlzIGJhY2t1cC4gVmFsaWQgdmFsdWVzOiBzY2hlZHVsZWQsIG1hbnVhbC4KCQkJJ3NlbmRfaW1wb3J0YnVkZHknCT0+CWZhbHNlLAoJCQknc3RhcnRfdGltZScJCT0+CXRpbWUoKSwKCQkJJ2ZpbmlzaF90aW1lJwkJPT4JMCwKCQkJJ3N0YXR1cycJCQk9PgkndGltZW91dCcsICAvLyBzdWNjZXNzLCBmYWlsdXJlLCB0aW1lb3V0IChkZWZhdWx0IGFzc3VtcHRpb24gaWYgdGhpcyBpcyBub3QgdXBkYXRlZCBpbiB0aGlzIFBIUCBsb2FkKQoJCQknd3JpdGVfc3BlZWQnCQk9PgkwLAoJCSk7Cgl9IC8vIEVuZCBnZXRfcmVtb3RlX3NlbmRfZGVmYXVsdHMoKTsKCgoKCS8qCXNlbmRfcmVtb3RlX2Rlc3RpbmF0aW9uKCkKCSAqCQoJICoJZnVuY3Rpb24gZGVzY3JpcHRpb24KCSAqCQoJICoJQHBhcmFtCQlpbnQJCSRkZXN0aW5hdGlvbl9pZAkJSUQgbnVtYmVyIChpbmRleCBvZiB0aGUgZGVzdGluYXRpb25zIGFycmF5KSB0byBzZW5kIGl0LgoJICoJQHBhcmFtCQlzdHJpbmcJJGZpbGUJCQkJRnVsbCBmaWxlIHBhdGggb2YgZmlsZSB0byBzZW5kLgoJICoJQHBhcmFtCQlzdHJpbmcJJHRyaWdnZXIJCQlXaGF0IHRyaWdnZXJlZCB0aGlzIGJhY2t1cC4gVmFsaWQgdmFsdWVzOiBzY2hlZHVsZWQsIG1hbnVhbC4KCSAqCUBwYXJhbQkJYm9vbAkkc2VuZF9pbXBvcnRidWRkeQlXaGV0aGVyIG9yIG5vdCBpbXBvcnRidWRkeS5waHAgc2hvdWxkIGFsc28gYmUgc2VudCB3aXRoIHRoZSBmaWxlIHRvIGRlc3RpbmF0aW9uLgoJICoJQHBhcmFtCQlib29sCSRkZWxldGVfYWZ0ZXIJCVdoZXRoZXIgb3Igbm90IHRvIGRlbGV0ZSBhZnRlciBzZW5kIHN1Y2Nlc3MgYWZ0ZXIgVEhJUyBzZW5kLgoJICoJQHBhcmFtCQlhcnJheSAJJGRlc3RpbmF0aW9uX3NldHRpbmdzCUlmIHBhc3NlZCB0aGVuIHRoaXMgYXJyYXkgaXMgdXNlZCBpbnN0ZWFkIG9mIGdyYWJiaW5nIGZyb20gc2V0dGluZ3MuCgkgKglAcmV0dXJuCQlib29sCQkJCQkJU2VuZCBzdGF0dXMuIHRydWUgc3VjY2VzcywgZmFsc2UgZmFpbGVkLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlbmRfcmVtb3RlX2Rlc3RpbmF0aW9uKCAkZGVzdGluYXRpb25faWQsICRmaWxlLCAkdHJpZ2dlciA9ICcnLCAkc2VuZF9pbXBvcnRidWRkeSA9IGZhbHNlLCAkZGVsZXRlX2FmdGVyID0gZmFsc2UsICRpZGVudGlmaWVyID0gJycsICRkZXN0aW5hdGlvbl9zZXR0aW5ncyA9ICcnICkgewoKCQlpZiAoIGRlZmluZWQoICdQQl9ERU1PX01PREUnICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmICggISBmaWxlX2V4aXN0cyggJGZpbGUgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4NTgzNDg5NzM0OiBVbmFibGUgdG8gc2VuZCBmaWxlIGAnIC4gJGZpbGUgLiAnYCB0byByZW1vdGUgZGVzdGluYXRpb24gYXMgaXQgbm8gbG9uZ2VyIGV4aXN0cy4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIG9yIHBlcm1pc3Npb25zIGFyZSBpbnZhbGlkLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJJG1pZ3JhdGlvbmtleV90cmFuc2llbnRfdGltZSA9IDYwKjYwKjI0OwoKCQlpZiAoICcnID09ICRmaWxlICkgewoJCQkkYmFja3VwX2ZpbGVfc2l6ZSA9IDUwMDAwOyAvLyBub3Qgc3VyZSB3aHkgYW55dGhpbmcgY3VycmVudCB3b3VsZCBiZSBzZW5kaW5nIGltcG9ydGJ1ZGR5IGJ1dCBOT1Qgc2VuZGluZyBhIGJhY2t1cCBidXQganVzdCBpbiBjYXNlLi4uCgkJfSBlbHNlIHsKCQkJJGJhY2t1cF9maWxlX3NpemUgPSBmaWxlc2l6ZSggJGZpbGUgKTsKCQl9CgoJCS8vIEdlbmVyYXRlIHJlbW90ZSBzZW5kIElEIGZvciByZWZlcmVuY2UgYW5kIGFkZCBpdCBhcyBhIG5ldyBsb2dnaW5nIHNlcmlhbCBmb3IgYmV0dGVyIHJlY29yZGluZyBkZXRhaWxzLgoJCWlmICggJycgPT0gJGlkZW50aWZpZXIgKSB7CgkJCSRpZGVudGlmaWVyID0gcGJfYmFja3VwYnVkZHk6OnJhbmRvbV9zdHJpbmcoIDEyICk7CgkJfQoKCQkvLyBTZXQgbWlncmF0aW9uIGtleSBmb3IgbGF0ZXIgZGV0ZXJtaW5pbmcgbGFzdCBpbml0aWF0ZWQgbWlncmF0aW9uLgoJCWlmICggJ21pZ3JhdGlvbicgPT0gJHRyaWdnZXIgKSB7CgkJCXNldF90cmFuc2llbnQoICdwYl9iYWNrdXBidWRkeV9taWdyYXRpb25rZXknLCAkaWRlbnRpZmllciwgJG1pZ3JhdGlvbmtleV90cmFuc2llbnRfdGltZSApOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2VuZGluZyBmaWxlIGAnIC4gJGZpbGUgLiAnYCB0byByZW1vdGUgZGVzdGluYXRpb24gYCcgLiAkZGVzdGluYXRpb25faWQgLiAnYCB0cmlnZ2VyZWQgYnkgYCcgLiAkdHJpZ2dlciAuICdgLicgKTsKCgkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBYm91dCB0byBjcmVhdGUgaW5pdGlhbCBmaWxlb3B0aW9ucyBkYXRhLicgKTsKCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMzUuJyApOwoJCSRmaWxlb3B0aW9uc19vYmogPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zL3NlbmQtJyAuICRpZGVudGlmaWVyIC4gJy50eHQnLCAkcmVhZF9vbmx5ID0gZmFsc2UsICRpZ25vcmVfbG9jayA9IHRydWUsICRjcmVhdGVfZmlsZSA9IHRydWUgKTsKCQlpZiAoIHRydWUgIT09ICggJHJlc3VsdCA9ICRmaWxlb3B0aW9uc19vYmotPmlzX29rKCkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oJ0ZhdGFsIEVycm9yICM5MDM0IEEuIFVuYWJsZSB0byBhY2Nlc3MgZmlsZW9wdGlvbnMgZGF0YS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgRXJyb3I6ICcgLiAkcmVzdWx0ICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBkYXRhIGxvYWRlZC4nICk7CgkJJGZpbGVvcHRpb25zID0gJiRmaWxlb3B0aW9uc19vYmotPm9wdGlvbnM7IC8vIFNldCByZWZlcmVuY2UuCgoJCS8vIFJlY29yZCBzb21lIHN0YXRpc3RpY3MuCgkJJGZpbGVvcHRpb25zID0gYXJyYXlfbWVyZ2UoCgkJCXNlbGY6OmdldF9yZW1vdGVfc2VuZF9kZWZhdWx0cygpLAoJCQlhcnJheSgKCQkJCSdkZXN0aW5hdGlvbicJCT0+CSRkZXN0aW5hdGlvbl9pZCwKCQkJCSdmaWxlJwkJCQk9PgkkZmlsZSwKCQkJCSdmaWxlX3NpemUnCQkJPT4JJGJhY2t1cF9maWxlX3NpemUsCgkJCQkndHJpZ2dlcicJCQk9PgkkdHJpZ2dlciwJCQkJCQkvLyBXaGF0IHRyaWdnZXJlZCB0aGlzIGJhY2t1cC4gVmFsaWQgdmFsdWVzOiBzY2hlZHVsZWQsIG1hbnVhbC4KCQkJCSdzZW5kX2ltcG9ydGJ1ZGR5Jwk9Pgkkc2VuZF9pbXBvcnRidWRkeSwKCQkJCSdzdGFydF90aW1lJwkJPT4JdGltZSgpLAoJCQkJJ2ZpbmlzaF90aW1lJwkJPT4JMCwKCQkJCSdzdGF0dXMnCQkJPT4JJ3RpbWVvdXQnLCAgLy8gc3VjY2VzcywgZmFpbHVyZSwgdGltZW91dCAoZGVmYXVsdCBhc3N1bXB0aW9uIGlmIHRoaXMgaXMgbm90IHVwZGF0ZWQgaW4gdGhpcyBQSFAgbG9hZCkKCQkJCSd3cml0ZV9zcGVlZCcJCT0+CTAsCgkJCSkKCQkpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgoKCQkvLyBQcmVwYXJlIHZhcmlhYmxlcyB0byBwYXNzIHRvIHJlbW90ZSBkZXN0aW5hdGlvbiBoYW5kbGVyLgoJCWlmICggJycgPT0gJGZpbGUgKSB7IC8vIE5vIGZpbGUgdG8gc2VuZCAoYmxhbmsgc3RyaW5nIGZpbGUgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBqdXN0IHNlbmRpbmcgaW1wb3J0YnVkZHkpLgoJCQkkZmlsZXMgPSBhcnJheSgpOwoJCX0gZWxzZSB7CgkJCSRmaWxlcyA9IGFycmF5KCAkZmlsZSApOwoJCX0KCQkKCQkvLyBEZXN0aW5hdGlvbiBzZXR0aW5ncyB3ZXJlIG5vdCBwYXNzZWQgc28gZ2V0IHRoZW0gYmFzZWQgb24gdGhlIGRlc3RpbmF0aW9uIElEIHByb3ZpZGVkLgoJCWlmICggISBpc19hcnJheSggJGRlc3RpbmF0aW9uX3NldHRpbmdzICkgKSB7CgkJCSRkZXN0aW5hdGlvbl9zZXR0aW5ncyA9ICZwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9kZXN0aW5hdGlvbnMnXVskZGVzdGluYXRpb25faWRdOwoJCX0KCgoJCS8vIEZvciBTdGFzaCB3ZSB3aWxsIGNoZWNrIHRoZSBxdW90YSBwcmlvciB0byBpbml0aWF0aW5nIHNlbmQuCgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9kZXN0aW5hdGlvbnMnXVskZGVzdGluYXRpb25faWRdWyd0eXBlJ10gPT0gJ3N0YXNoJyApIHsKCQkJLy8gUGFzcyBvZmYgdG8gZGVzdGluYXRpb24gaGFuZGxlci4KCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvZGVzdGluYXRpb25zL2Jvb3RzdHJhcC5waHAnICk7CgkJCSRzZW5kX3Jlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5X2Rlc3RpbmF0aW9uczo6Z2V0X2luZm8oICdzdGFzaCcgKTsgLy8gVXNlZCB0byBraWNrIHRoZSBTdGFzaCBkZXN0aW5hdGlvbiBpbnRvIGxpZmUuCgkJCSRzdGFzaF9xdW90YSA9IHBiX2JhY2t1cGJ1ZGR5X2Rlc3RpbmF0aW9uX3N0YXNoOjpnZXRfcXVvdGEoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncmVtb3RlX2Rlc3RpbmF0aW9ucyddWyRkZXN0aW5hdGlvbl9pZF0sIHRydWUgKTsKCgkJCWlmICggJGZpbGUgIT0gJycgKSB7CgkJCQkkYmFja3VwX2ZpbGVfc2l6ZSA9IGZpbGVzaXplKCAkZmlsZSApOwoJCQl9IGVsc2UgewoJCQkJJGJhY2t1cF9maWxlX3NpemUgPSA1MDAwMDsKCQkJfQoJCQlpZiAoICggJGJhY2t1cF9maWxlX3NpemUgKyAkc3Rhc2hfcXVvdGFbJ3F1b3RhX3VzZWQnXSApID4gJHN0YXNoX3F1b3RhWydxdW90YV90b3RhbCddICkgewoJCQkJJG1lc3NhZ2UgPSAnJzsKCQkJCSRtZXNzYWdlIC49ICJZb3UgZG8gbm90IGhhdmUgZW5vdWdoIFN0YXNoIHN0b3JhZ2Ugc3BhY2UgdG8gc2VuZCB0aGlzIGZpbGUuIFBsZWFzZSB1cGdyYWRlIHlvdXIgU3Rhc2ggc3RvcmFnZSBhdCBodHRwOi8vaXRoZW1lcy5jb20vbWVtYmVyL3BhbmVsL3N0YXNoLnBocCBvciBkZWxldGUgZmlsZXMgdG8gbWFrZSBzcGFjZS5cblxuIjsKCgkJCQkkbWVzc2FnZSAuPSAnQXR0ZW1wdGluZyB0byBzZW5kIGZpbGUgb2Ygc2l6ZSAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJGJhY2t1cF9maWxlX3NpemUgKSAuICcgYnV0IHlvdSBvbmx5IGhhdmUgJyAuICRzdGFzaF9xdW90YVsncXVvdGFfYXZhaWxhYmxlX25pY2UnXSAuICcgYXZhaWxhYmxlLiAnOwoJCQkJJG1lc3NhZ2UgLj0gJ0N1cnJlbnRseSB1c2luZyAnIC4gJHN0YXNoX3F1b3RhWydxdW90YV91c2VkX25pY2UnXSAuICcgb2YgJyAuICRzdGFzaF9xdW90YVsncXVvdGFfdG90YWxfbmljZSddIC4gJyAoJyAuICRzdGFzaF9xdW90YVsncXVvdGFfdXNlZF9wZXJjZW50J10gLiAnJSkuJzsKCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQkJYmFja3VwYnVkZHlfY29yZTo6bWFpbF9lcnJvciggJG1lc3NhZ2UgKTsKCgkJCQkkZmlsZW9wdGlvbnNbJ3N0YXR1cyddID0gJ0ZhaWx1cmUuIEluc3VmZmljaWVudCBkZXN0aW5hdGlvbiBzcGFjZS4nOwoJCQkJJGZpbGVvcHRpb25zX29iai0+c2F2ZSgpOwoKCQkJCXJldHVybiBmYWxzZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggaXNzZXQoICRzdGFzaF9xdW90YVsncXVvdGFfd2FybmluZyddICkgJiYgKCAkc3Rhc2hfcXVvdGFbJ3F1b3RhX3dhcm5pbmcnXSAhPSAnJyApICkgewoKCQkJCQkvLyBXZSBsb2cgd2FybmluZyBvZiB1c2FnZSBidXQgZG9udCBzZW5kIGVycm9yIGVtYWlsLgoJCQkJCSRtZXNzYWdlID0gJyc7CgkJCQkJJG1lc3NhZ2UgLj0gJ1dBUk5JTkc6ICcgLiAkc3Rhc2hfcXVvdGFbJ3F1b3RhX3dhcm5pbmcnXSAuICJcblxuUGxlYXNlIHVwZ3JhZGUgeW91ciBTdGFzaCBzdG9yYWdlIGF0IGh0dHA6Ly9pdGhlbWVzLmNvbS9tZW1iZXIvcGFuZWwvc3Rhc2gucGhwIG9yIGRlbGV0ZSBmaWxlcyB0byBtYWtlIHNwYWNlLlxuXG4iOwoJCQkJCSRtZXNzYWdlIC49ICdDdXJyZW50bHkgdXNpbmcgJyAuICRzdGFzaF9xdW90YVsncXVvdGFfdXNlZF9uaWNlJ10gLiAnIG9mICcgLiAkc3Rhc2hfcXVvdGFbJ3F1b3RhX3RvdGFsX25pY2UnXSAuICcgKCcgLiAkc3Rhc2hfcXVvdGFbJ3F1b3RhX3VzZWRfcGVyY2VudCddIC4gJyUpLic7CgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJG1lc3NhZ2UgKTsKCQkJCQkvL2JhY2t1cGJ1ZGR5X2NvcmU6Om1haWxfZXJyb3IoICRtZXNzYWdlICk7CgoJCQkJfQoJCQl9CgoJCX0KCgoJCWlmICggJHNlbmRfaW1wb3J0YnVkZHkgPT09IHRydWUgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0dlbmVyYXRpbmcgdGVtcG9yYXJ5IGltcG9ydGJ1ZGR5LnBocCBmaWxlIGZvciByZW1vdGUgc2VuZC4nICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpLCAkZGllID0gZmFsc2UgKTsKCQkJJGltcG9ydGJ1ZGR5X3RlbXAgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCkgLiAnaW1wb3J0YnVkZHkucGhwJzsgLy8gRnVsbCBwYXRoICYgZmlsZW5hbWUgdG8gdGVtcG9yYXJ5IGltcG9ydGJ1ZGR5CgkJCXNlbGY6OmltcG9ydGJ1ZGR5KCAkaW1wb3J0YnVkZHlfdGVtcCApOyAvLyBDcmVhdGUgdGVtcG9yYXJ5IGltcG9ydGJ1ZGR5LgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdHZW5lcmF0ZWQgdGVtcG9yYXJ5IGltcG9ydGJ1ZGR5LicgKTsKCQkJJGZpbGVzW10gPSAkaW1wb3J0YnVkZHlfdGVtcDsgLy8gQWRkIGltcG9ydGJ1ZGR5IGZpbGUgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gc2VuZC4KCQkJJHNlbmRfaW1wb3J0YnVkZHkgPSB0cnVlOyAvLyBUcmFjayB0byBkZWxldGUgYWZ0ZXIgZmluaXNoZWQuCgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTm90IHNlbmRpbmcgaW1wb3J0YnVkZHkuJyApOwoJCX0KCgoJCS8vIENsZWFyIGZpbGVvcHRpb25zIHNvIG90aGVyIHN0dWZmIGNhbiBhY2Nlc3MgaXQgaWYgbmVlZGVkLgoJCSRmaWxlb3B0aW9uc19vYmotPnNhdmUoKTsKCQkkZmlsZW9wdGlvbnNfb2JqLT51bmxvY2soKTsKCQl1bnNldCggJGZpbGVvcHRpb25zX29iaiApOwoKCgkJLy8gUGFzcyBvZmYgdG8gZGVzdGluYXRpb24gaGFuZGxlci4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9kZXN0aW5hdGlvbnMvYm9vdHN0cmFwLnBocCcgKTsKCQkKCQkkc2VuZF9yZXN1bHQgPSBwYl9iYWNrdXBidWRkeV9kZXN0aW5hdGlvbnM6OnNlbmQoICRkZXN0aW5hdGlvbl9zZXR0aW5ncywgJGZpbGVzLCAkaWRlbnRpZmllciwgJGRlbGV0ZV9hZnRlciApOwoJCQoJCXNlbGY6OmtpY2tfZGIoKTsgLy8gS2ljayB0aGUgZGF0YWJhc2UgdG8gbWFrZSBzdXJlIGl0IGRpZG4ndCBnbyBhd2F5LCBwcmV2ZW50aW5nIG9wdGlvbnMgc2F2aW5nLgoKCQkvLyBSZWxvYWQgZmlsZW9wdGlvbnMuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQWJvdXQgdG8gbG9hZCBmaWxlb3B0aW9ucyBkYXRhIGZvciBzYXZpbmcgc2VuZCBzdGF0dXMuJyApOwoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvZmlsZW9wdGlvbnMucGhwJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGluc3RhbmNlICMzNC4nICk7CgkJJGZpbGVvcHRpb25zX29iaiA9IG5ldyBwYl9iYWNrdXBidWRkeV9maWxlb3B0aW9ucyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvc2VuZC0nIC4gJGlkZW50aWZpZXIgLiAnLnR4dCcsICRyZWFkX29ubHkgPSBmYWxzZSwgJGlnbm9yZV9sb2NrID0gZmFsc2UsICRjcmVhdGVfZmlsZSA9IGZhbHNlICk7CgkJaWYgKCB0cnVlICE9PSAoICRyZXN1bHQgPSAkZmlsZW9wdGlvbnNfb2JqLT5pc19vaygpICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsIF9fKCdGYXRhbCBFcnJvciAjOTAzNCBHLiBVbmFibGUgdG8gYWNjZXNzIGZpbGVvcHRpb25zIGRhdGEuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIEVycm9yOiAnIC4gJHJlc3VsdCApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGRhdGEgbG9hZGVkLicgKTsKCQkkZmlsZW9wdGlvbnMgPSAmJGZpbGVvcHRpb25zX29iai0+b3B0aW9uczsgLy8gU2V0IHJlZmVyZW5jZS4KCgoJCS8vIFVwZGF0ZSBzdGF0cy4KCQkkZmlsZW9wdGlvbnNbJGlkZW50aWZpZXJdWydmaW5pc2hfdGltZSddID0gdGltZSgpOwoJCWlmICggJHNlbmRfcmVzdWx0ID09PSB0cnVlICkgeyAvLyBzdWNjZWVkZWQuCgkJCSRmaWxlb3B0aW9uc1snc3RhdHVzJ10gPSAnc3VjY2Vzcyc7CgkJCSRmaWxlb3B0aW9uc1snZmluaXNoX3RpbWUnXSA9IHRpbWUoKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVtb3RlIHNlbmQgU1VDQ0VTUy4nICk7CgkJfSBlbHNlaWYgKCAkc2VuZF9yZXN1bHQgPT09IGZhbHNlICkgeyAvLyBmYWlsZWQuCgkJCSRmaWxlb3B0aW9uc1snc3RhdHVzJ10gPSAnZmFpbHVyZSc7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1JlbW90ZSBzZW5kIEZBSUxVUkUuJyApOwoJCX0gZWxzZWlmICggaXNfYXJyYXkoICRzZW5kX3Jlc3VsdCApICkgeyAvLyBBcnJheSBzbyBtdWx0aXBhcnQuCgkJCSRmaWxlb3B0aW9uc1snc3RhdHVzJ10gPSAnbXVsdGlwYXJ0JzsKCQkJJGZpbGVvcHRpb25zWydmaW5pc2hfdGltZSddID0gMDsKCQkJJGZpbGVvcHRpb25zWydfbXVsdGlwYXJ0X2lkJ10gPSAkc2VuZF9yZXN1bHRbMF07CgkJCSRmaWxlb3B0aW9uc1snX211bHRpcGFydF9zdGF0dXMnXSA9ICRzZW5kX3Jlc3VsdFsxXTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTXVsdGlwYXJ0IHNlbmQgaW4gcHJvZ3Jlc3MuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjNTQ4NTc4NTU3NjQ2My4gSW52YWxpZCBzdGF0dXMgc2VuZCByZXN1bHQ6IGAnIC4gJHNlbmRfcmVzdWx0IC4gJ2AuJyApOwoJCX0KCQkkZmlsZW9wdGlvbnNfb2JqLT5zYXZlKCk7CgoKCQkvLyBJZiB3ZSBzZW50IGltcG9ydGJ1ZGR5IHRoZW4gZGVsZXRlIHRoZSBsb2NhbCBjb3B5IHRvIGNsZWFuIHVwLgoJCWlmICggJHNlbmRfaW1wb3J0YnVkZHkgIT09IGZhbHNlICkgewoJCQlAdW5saW5rKCAkaW1wb3J0YnVkZHlfdGVtcCApOyAvLyBEZWxldGUgdGVtcG9yYXJ5IGltcG9ydGJ1ZGR5LgoJCX0KCQkKCQkvLyBBcyBvZiB2NS4wOiBQb3N0LXNlbmQgZGVsZXRpb24gbm93IGhhbmRsZWQgd2l0aGluIGRlc3RpbmF0aW9ucy9ib290c3RyYXAucGhwIHNlbmQoKSB0byBzdXBwb3J0IGNodW5rZWQgc2VuZHMuCgkJCgkJcmV0dXJuICRzZW5kX3Jlc3VsdDsKCgl9IC8vIEVuZCBzZW5kX3JlbW90ZV9kZXN0aW5hdGlvbigpLgoKCgoJLyoJZGVzdGluYXRpb25fc2VuZCgpCgkgKgkKCSAqCVNlbmQgZmlsZShzKSB0byBhIGRlc3RpbmF0aW9uLiBQYXNzIGZ1bGwgYXJyYXkgb2YgZGVzdGluYXRpb24gc2V0dGluZ3MuCgkgKgkKCSAqCUBwYXJhbQkJYXJyYXkJCSRkZXN0aW5hdGlvbl9zZXR0aW5ncwkJQWxsIHNldHRpbmdzIGZvciB0aGlzIGRlc3RpbmF0aW9uIGZvciB0aGlzIGFjdGlvbi4KCSAqCUBwYXJhbQkJYXJyYXkJCSRmaWxlcwkJCQkJCUFycmF5IG9mIGZpbGVzIHRvIHNlbmQgKGZ1bGwgcGF0aCkuCgkgKglAcmV0dXJuCQlib29sfGFycmF5CQkJCQkJCQlCb29sIHRydWUgPSBzdWNjZXNzLCBib29sIGZhbHNlID0gZmFpbCwgYXJyYXkgPSBtdWx0aXBhcnQgdHJhbnNmZXIuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVzdGluYXRpb25fc2VuZCggJGRlc3RpbmF0aW9uX3NldHRpbmdzLCAkZmlsZXMsICRzZW5kX2lkID0gJycsICRkZWxldGVfYWZ0ZXIgPSBmYWxzZSApIHsKCQkKCQkvLyBQYXNzIG9mZiB0byBkZXN0aW5hdGlvbiBoYW5kbGVyLgoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2Rlc3RpbmF0aW9ucy9ib290c3RyYXAucGhwJyApOwoJCSRzZW5kX3Jlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5X2Rlc3RpbmF0aW9uczo6c2VuZCggJGRlc3RpbmF0aW9uX3NldHRpbmdzLCAkZmlsZXMsICRzZW5kX2lkLCAkZGVsZXRlX2FmdGVyICk7CgkJCgkJcmV0dXJuICRzZW5kX3Jlc3VsdDsKCQkKCX0gLy8gRW5kIGRlc3RpbmF0aW9uX3NlbmQoKS4KCgoKCS8qCWJhY2t1cHNfbGlzdCgpCgkgKgkKCSAqCWZ1bmN0aW9uIGRlc2NyaXB0aW9uCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdHlwZQkJCVZhbGlkIG9wdGlvbnM6IGRlZmF1bHQsIG1pZ3JhdGUKCSAqCUBwYXJhbQkJYm9vbGVhbgkJJHN1YnNpdGVfbW9kZQlXaGVuIGluIHN1YnNpdGUgbW9kZSBvbmx5IGJhY2t1cHMgZm9yIHRoYXQgc3BlY2lmaWMgc3Vic2l0ZSB3aWxsIGJlIGxpc3RlZC4KCSAqCUByZXR1cm4JCQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJhY2t1cHNfbGlzdCggJHR5cGUgPSAnZGVmYXVsdCcsICRzdWJzaXRlX21vZGUgPSBmYWxzZSApIHsKCgkJaWYgKCAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2J1bGtfYWN0aW9uJyApID09ICdkZWxldGVfYmFja3VwJyApICYmICggaXNfYXJyYXkoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2l0ZW1zJyApICkgKSApIHsKCQkJJG5lZWRzX3NhdmUgPSBmYWxzZTsKCQkJcGJfYmFja3VwYnVkZHk6OnZlcmlmeV9ub25jZSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnX3dwbm9uY2UnICkgKTsgLy8gU2VjdXJpdHkgY2hlY2sgdG8gcHJldmVudCB1bmF1dGhvcml6ZWQgZGVsZXRpb25zIGJ5IHBvc3RpbmcgZnJvbSBhIHJlbW90ZSBwbGFjZS4KCQkJJGRlbGV0ZWRfZmlsZXMgPSBhcnJheSgpOwoJCQlmb3JlYWNoKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdpdGVtcycgKSBhcyAkaXRlbSApIHsKCQkJCWlmICggZmlsZV9leGlzdHMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJGl0ZW0gKSApIHsKCQkJCQlpZiAoIEB1bmxpbmsoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJGl0ZW0gKSA9PT0gdHJ1ZSApIHsKCQkJCQkJJGRlbGV0ZWRfZmlsZXNbXSA9ICRpdGVtOwoKCQkJCQkJLy8gQ2xlYW51cCBhbnkgcmVsYXRlZCBmaWxlb3B0aW9ucyBmaWxlcy4KCQkJCQkJJHNlcmlhbCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkaXRlbSApOwoKCQkJCQkJJGJhY2t1cF9maWxlcyA9IGdsb2IoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJyouemlwJyApOwoJCQkJCQlpZiAoICEgaXNfYXJyYXkoICRiYWNrdXBfZmlsZXMgKSApIHsKCQkJCQkJCSRiYWNrdXBfZmlsZXMgPSBhcnJheSgpOwoJCQkJCQl9CgkJCQkJCWlmICggY291bnQoICRiYWNrdXBfZmlsZXMgKSA+IDUgKSB7IC8vIEtlZXAgYSBtaW5pbXVtIG51bWJlciBvZiBiYWNrdXBzIGluIGFycmF5IGZvciBzdGF0cy4KCQkJCQkJCSR0aGlzX3NlcmlhbCA9IHNlbGY6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkaXRlbSApOwoJCQkJCQkJJGZpbGVvcHRpb25zX2ZpbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy8nIC4gJHRoaXNfc2VyaWFsIC4gJy50eHQnOwoJCQkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJGZpbGVvcHRpb25zX2ZpbGUgKSApIHsKCQkJCQkJCQlAdW5saW5rKCAkZmlsZW9wdGlvbnNfZmlsZSApOwoJCQkJCQkJfQoJCQkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJGZpbGVvcHRpb25zX2ZpbGUgLiAnLmxvY2snICkgKSB7CgkJCQkJCQkJQHVubGluayggJGZpbGVvcHRpb25zX2ZpbGUgLiAnLmxvY2snICk7CgkJCQkJCQl9CgkJCQkJCQkkbmVlZHNfc2F2ZSA9IHRydWU7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvcjogVW5hYmxlIHRvIGRlbGV0ZSBiYWNrdXAgZmlsZSBgJyAuICRpdGVtIC4gJ2AuIFBsZWFzZSB2ZXJpZnkgcGVybWlzc2lvbnMuJywgdHJ1ZSApOwoJCQkJCX0KCQkJCX0gLy8gRW5kIGlmIGZpbGUgZXhpc3RzLgoJCQl9IC8vIEVuZCBmb3JlYWNoLgoJCQlpZiAoICRuZWVkc19zYXZlID09PSB0cnVlICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkJfQoKCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCBfXyggJ0RlbGV0ZWQ6JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnICcgLiBpbXBsb2RlKCAnLCAnLCAkZGVsZXRlZF9maWxlcyApICk7CgkJfSAvLyBFbmQgaWYgZGVsZXRpbmcgYmFja3VwKHMpLgoKCgkJJGJhY2t1cHMgPSBhcnJheSgpOwoJCSRiYWNrdXBfc29ydF9kYXRlcyA9IGFycmF5KCk7CgkJJGZpbGVzID0gZ2xvYiggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgLiAnYmFja3VwKi56aXAnICk7CgkJaWYgKCBpc19hcnJheSggJGZpbGVzICkgJiYgIWVtcHR5KCAkZmlsZXMgKSApIHsgLy8gRm9yIHJvYnVzdG5lc3MuIFdpdGhvdXQgb3Blbl9iYXNlZGlyIHRoZSBnbG9iKCkgZnVuY3Rpb24gcmV0dXJucyBhbiBlbXB0eSBhcnJheSBmb3Igbm8gbWF0Y2guIFdpdGggb3Blbl9iYXNlZGlyIGluIGVmZmVjdCB0aGUgZ2xvYigpIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIGZhbHNlIGZvciBubyBtYXRjaC4KCgkJCSRiYWNrdXBfcHJlZml4ID0gc2VsZjo6YmFja3VwX3ByZWZpeCgpOyAvLyBCYWNrdXAgcHJlZml4IGZvciB0aGlzIHNpdGUuIFVzZWQgZm9yIE1TIGNoZWNraW5nIHRoYXQgdGhpcyB1c2VyIGNhbiBzZWUgdGhpcyBiYWNrdXAuCgkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZV9pZCA9PiAkZmlsZSApIHsKCgkJCQlpZiAoICggJHN1YnNpdGVfbW9kZSA9PT0gdHJ1ZSApICYmIGlzX211bHRpc2l0ZSgpICkgeyAvLyBJZiBhIE5ldHdvcmsgYW5kIE5PVCB0aGUgc3VwZXJhZG1pbiBtdXN0IG1ha2Ugc3VyZSB0aGV5IGNhbiBvbmx5IHNlZSB0aGUgc3BlY2lmaWMgc3Vic2l0ZSBiYWNrdXBzIGZvciBzZWN1cml0eSBwdXJwb3Nlcy4KCgkJCQkJLy8gT25seSBhbGxvdyB2aWV3aW5nIG9mIHRoZWlyIG93biBiYWNrdXBzLgoJCQkJCWlmICggIXN0cnN0ciggJGZpbGUsICRiYWNrdXBfcHJlZml4ICkgKSB7CgkJCQkJCXVuc2V0KCAkZmlsZXNbJGZpbGVfaWRdICk7IC8vIFJlbW92ZSB0aGlzIGJhY2t1cCBmcm9tIHRoZSBsaXN0LiBUaGlzIHVzZXIgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gaXQuCgkJCQkJCWNvbnRpbnVlOyAvLyBTa2lwIHByb2Nlc3NpbmcgdG8gbmV4dCBmaWxlLgoJCQkJCX0KCQkJCX0KCgkJCQkkc2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRmaWxlICk7CgkJCQkKCQkJCSRvcHRpb25zID0gYXJyYXkoKTsKCQkJCWlmICggZmlsZV9leGlzdHMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiAkc2VyaWFsIC4gJy50eHQnICkgKSB7CgkJCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9maWxlb3B0aW9ucy5waHAnICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmlsZW9wdGlvbnMgaW5zdGFuY2UgIzMzLicgKTsKCQkJCQkkYmFja3VwX29wdGlvbnMgPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiAkc2VyaWFsIC4gJy50eHQnLCAkcmVhZF9vbmx5ID0gZmFsc2UsICRpZ25vcmVfbG9jayA9IGZhbHNlLCAkY3JlYXRlX2ZpbGUgPSB0cnVlICk7IC8vIFdpbGwgY3JlYXRlIGZpbGUgdG8gaG9sZCBpbnRlZ3JpdHkgZGF0YSBpZiBub3RoaW5nIGV4aXN0cy4KCQkJCX0gZWxzZSB7CgkJCQkJJGJhY2t1cF9vcHRpb25zID0gJyc7CgkJCQl9CgkJCQkkYmFja3VwX2ludGVncml0eSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmJhY2t1cF9pbnRlZ3JpdHlfY2hlY2soICRmaWxlLCAkYmFja3VwX29wdGlvbnMsICRvcHRpb25zICk7CgoJCQkJLy8gQmFja3VwIHN0YXR1cy4KCQkJCSRwcmV0dHlfc3RhdHVzID0gYXJyYXkoCgkJCQkJdHJ1ZQk9PgknPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXN1Y2Nlc3MiPkdvb2Q8L3NwYW4+JywgLy8gdjQuMCsgR29vZC4KCQkJCQkncGFzcycJPT4JJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1zdWNjZXNzIj5Hb29kPC9zcGFuPicsIC8vIFByZS12NC4wIEdvb2QuCgkJCQkJZmFsc2UJPT4JJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1pbXBvcnRhbnQiPkJhZDwvc3Bhbj4nLCAgLy8gdjQuMCsgQmFkLgoJCQkJCSdmYWlsJwk9PgknPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWltcG9ydGFudCI+QmFkPC9zcGFuPicsICAvLyBQcmUtdjQuMCBCYWQuCgkJCQkpOwoKCQkJCS8vIEJhY2t1cCB0eXBlLgoJCQkJJHByZXR0eV90eXBlID0gYXJyYXkoCgkJCQkJJ2Z1bGwnCT0+CSdGdWxsJywKCQkJCQknZGInCT0+CSdEYXRhYmFzZScsCgkJCQkJJ2ZpbGVzJyA9PgknRmlsZXMnLAoJCQkJKTsKCgoJCQkJLy8gRGVmYXVsdHMuLi4KCQkJCSRkZXRlY3RlZF90eXBlID0gJyc7CgkJCQkkZmlsZV9zaXplID0gJyc7CgkJCQkkbW9kaWZpZWQgPSAnJzsKCQkJCSRtb2RpZmllZF90aW1lID0gMDsKCQkJCSRpbnRlZ3JpdHkgPSAnJzsKCgkJCQkkbWFpbl9zdHJpbmcgPSAnV2FybiMyODQuJzsKCQkJCWlmICggaXNfYXJyYXkoICRiYWNrdXBfaW50ZWdyaXR5ICkgKSB7IC8vIERhdGEgaW50YWN0Li4uIHB1dCBpdCBhbGwgdG9nZXRoZXIuCgkJCQkJLy8gQ2FsY3VsYXRlIHRpbWUgYWdvLgoJCQkJCSR0aW1lX2FnbyA9ICcnOwoJCQkJCWlmICggaXNzZXQoICRiYWNrdXBfaW50ZWdyaXR5Wydtb2RpZmllZCddICkgKSB7CgkJCQkJCSR0aW1lX2FnbyA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT50aW1lX2FnbyggJGJhY2t1cF9pbnRlZ3JpdHlbJ21vZGlmaWVkJ10gKSAuICcgYWdvJzsKCQkJCQl9CgoJCQkJCSRkZXRlY3RlZF90eXBlID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPnByZXR0aWZ5KCAkYmFja3VwX2ludGVncml0eVsnZGV0ZWN0ZWRfdHlwZSddLCAkcHJldHR5X3R5cGUgKTsKCQkJCQlpZiAoICRkZXRlY3RlZF90eXBlID09ICcnICkgewoJCQkJCQkkZGV0ZWN0ZWRfdHlwZSA9ICdVbmtub3duJzsKCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoIGlzc2V0KCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ3Byb2ZpbGUnXSApICkgewoJCQkJCQkJJGRldGVjdGVkX3R5cGUgPSAnCgkJCQkJCQk8ZGl2PgoJCQkJCQkJCTxzcGFuIHN0eWxlPSJjb2xvcjogI0FBQTsgZmxvYXQ6IGxlZnQ7Ij4nIC4gJGRldGVjdGVkX3R5cGUgLiAnPC9zcGFuPgoJCQkJCQkJCTxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZsb2F0OiBsZWZ0OyBoZWlnaHQ6IDE1cHg7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNFQkVCRUI7IG1hcmdpbi1sZWZ0OiA2cHg7IG1hcmdpbi1yaWdodDogNnB4OyI+PC9zcGFuPgoJCQkJCQkJCScgLiBodG1sZW50aXRpZXMoICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1sncHJvZmlsZSddWyd0aXRsZSddICkgLiAnCgkJCQkJCQk8L2Rpdj4KCQkJCQkJCScKCQkJCQkJCTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJJGZpbGVfc2l6ZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRiYWNrdXBfaW50ZWdyaXR5WydzaXplJ10gKTsKCQkJCQkkbW9kaWZpZWQgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoICRiYWNrdXBfaW50ZWdyaXR5Wydtb2RpZmllZCddICksICdsLCBGIGosIFkgLSBnOmk6cyBhJyApOwoJCQkJCSRtb2RpZmllZF90aW1lID0gJGJhY2t1cF9pbnRlZ3JpdHlbJ21vZGlmaWVkJ107CgkJCQkJaWYgKCBpc3NldCggJGJhY2t1cF9pbnRlZ3JpdHlbJ3N0YXR1cyddICkgKSB7IC8vIFByZS12NC4wLgoJCQkJCQkkc3RhdHVzID0gJGJhY2t1cF9pbnRlZ3JpdHlbJ3N0YXR1cyddOwoJCQkJCX0gZWxzZSB7IC8vIHY0LjArCgkJCQkJCSRzdGF0dXMgPSAkYmFja3VwX2ludGVncml0eVsnaXNfb2snXTsKCQkJCQl9CgoKCQkJCQkvLyBDYWxjdWxhdGUgbWFpbiByb3cgc3RyaW5nLgoJCQkJCWlmICggJHR5cGUgPT0gJ2RlZmF1bHQnICkgeyAvLyBEZWZhdWx0IGJhY2t1cCBsaXN0aW5nLgoJCQkJCQkkbWFpbl9zdHJpbmcgPSAnPGEgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ2Rvd25sb2FkX2FyY2hpdmUnICkgLiAnJmJhY2t1cGJ1ZGR5X2JhY2t1cD0nIC4gYmFzZW5hbWUoICRmaWxlICkgLiAnIiBjbGFzcz0iYmFja3VwYnVkZHlGaWxlVGl0bGUiIHRpdGxlPSInIC4gYmFzZW5hbWUoICRmaWxlICkgLiAnIj4nIC4gJG1vZGlmaWVkIC4gJyAoJyAuICR0aW1lX2FnbyAuICcpPC9hPic7CgkJCQkJfSBlbHNlaWYgKCAkdHlwZSA9PSAnbWlncmF0ZScgKSB7IC8vIE1pZ3JhdGlvbiBiYWNrdXAgbGlzdGluZy4KCQkJCQkJJG1haW5fc3RyaW5nID0gJzxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9ob3ZlcmFjdGlvbl9taWdyYXRlIGJhY2t1cGJ1ZGR5RmlsZVRpdGxlIiByZWw9IicgLiBiYXNlbmFtZSggJGZpbGUgKSAuICciIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmbWlncmF0ZT0nIC4gYmFzZW5hbWUoICRmaWxlICkgLiAnJnZhbHVlPScgLiBiYXNlbmFtZSggJGZpbGUgKSAuICciIHRpdGxlPSInIC4gYmFzZW5hbWUoICRmaWxlICkgLiAnIj4nIC4gJG1vZGlmaWVkIC4gJyAoJyAuICR0aW1lX2FnbyAuICcpPC9hPic7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJG1haW5fc3RyaW5nID0gJ3tVbmtub3duIHR5cGUufSc7CgkJCQkJfQoJCQkJCS8vIEFkZCBjb21tZW50IHRvIG1haW4gcm93IHN0cmluZyBpZiBhcHBsaWNhYmxlLgoJCQkJCWlmICggaXNzZXQoICRiYWNrdXBfaW50ZWdyaXR5Wydjb21tZW50J10gKSAmJiAoICRiYWNrdXBfaW50ZWdyaXR5Wydjb21tZW50J10gIT09IGZhbHNlICkgJiYgKCAkYmFja3VwX2ludGVncml0eVsnY29tbWVudCddICE9PSAnJyApICkgewoJCQkJCQkkbWFpbl9zdHJpbmcgLj0gJzxicj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPk5vdGU6IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9ub3RldGV4dCI+JyAuIGh0bWxlbnRpdGllcyggJGJhY2t1cF9pbnRlZ3JpdHlbJ2NvbW1lbnQnXSApIC4gJzwvc3Bhbj48L3NwYW4+JzsKCQkJCQl9CgoKCQkJCQkkaW50ZWdyaXR5ID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPnByZXR0aWZ5KCAkc3RhdHVzLCAkcHJldHR5X3N0YXR1cyApIC4gJyAnOwoJCQkJCWlmICggaXNzZXQoICRiYWNrdXBfaW50ZWdyaXR5WydzY2FuX25vdGVzJ10gKSAmJiBjb3VudCggKGFycmF5KSRiYWNrdXBfaW50ZWdyaXR5WydzY2FuX25vdGVzJ10gKSA+IDAgKSB7CgkJCQkJCWZvcmVhY2goIChhcnJheSkkYmFja3VwX2ludGVncml0eVsnc2Nhbl9ub3RlcyddIGFzICRzY2FuX25vdGUgKSB7CgkJCQkJCQkkaW50ZWdyaXR5IC49ICRzY2FuX25vdGUgLiAnICc7CgkJCQkJCX0KCQkJCQl9CgkJCQkJJGludGVncml0eSAuPSAnPGEgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJyZyZXNldF9pbnRlZ3JpdHk9JyAuICRzZXJpYWwgIC4gJyIgdGl0bGU9IlJlc2NhbiBpbnRlZ3JpdHkuIExhc3QgY2hlY2tlZCAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoICRiYWNrdXBfaW50ZWdyaXR5WydzY2FuX3RpbWUnXSApIC4gJy4iPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL3JlZnJlc2hfZ3JheS5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTFweDsiPjwvYT4nOwoJCQkJCSRpbnRlZ3JpdHkgLj0gJzxkaXYgY2xhc3M9InJvdy1hY3Rpb25zIj48YSB0aXRsZT0iJyAuIF9fKCAnQmFja3VwIFN0YXR1cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ2ludGVncml0eV9zdGF0dXMnICkgLiAnJnNlcmlhbD0nIC4gJHNlcmlhbCAuICcmIzAzODtUQl9pZnJhbWU9MSYjMDM4O3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAiIGNsYXNzPSJ0aGlja2JveCI+JyAuIF9fKCAnVmlldyBEZXRhaWxzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPjwvZGl2Pic7CgkJCQkJCgkJCQkJJHN1bUxvZ0ZpbGUgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdzdGF0dXMtJyAuICRzZXJpYWwgLiAnX3N1bV8nIC4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHN1bUxvZ0ZpbGUgKSApIHsKCQkJCQkJJGludGVncml0eSAuPSAnPGRpdiBjbGFzcz0icm93LWFjdGlvbnMiPjxhIHRpdGxlPSInIC4gX18oICdWaWV3IEJhY2t1cCBMb2cnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICd2aWV3X2xvZycgKSAuICcmc2VyaWFsPScgLiAkc2VyaWFsIC4gJyYjMDM4O1RCX2lmcmFtZT0xJiMwMzg7d2lkdGg9NjQwJiMwMzg7aGVpZ2h0PTYwMCIgY2xhc3M9InRoaWNrYm94Ij4nIC4gX18oICdWaWV3IExvZycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvYT48L2Rpdj4nOwoJCQkJCX0KCQkJCQkKCQkJCX0gLy8gZW5kIGlmIGlzX2FycmF5KCAkYmFja3VwX29wdGlvbnMgKS4KCgoJCQkJJGJhY2t1cHNbYmFzZW5hbWUoICRmaWxlICldID0gYXJyYXkoCgkJCQkJYXJyYXkoIGJhc2VuYW1lKCAkZmlsZSApLCAkbWFpbl9zdHJpbmcgLiAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiIgc3R5bGU9ImNvbG9yOiAjQUFBOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IDVweDsiPicgLiBiYXNlbmFtZSggJGZpbGUgKSAuICc8L3NwYW4+JyApLAoJCQkJCSRkZXRlY3RlZF90eXBlLAoJCQkJCSRmaWxlX3NpemUsCgkJCQkJJGludGVncml0eSwKCQkJCSk7CgoKCQkJCSRiYWNrdXBfc29ydF9kYXRlc1tiYXNlbmFtZSggJGZpbGUpXSA9ICRtb2RpZmllZF90aW1lOwoKCQkJfSAvLyBFbmQgZm9yZWFjaCgpLgoKCQl9IC8vIEVuZCBpZi4KCgkJLy8gU29ydCBiYWNrdXAgYnkgZGF0ZS4KCQlhcnNvcnQoICRiYWNrdXBfc29ydF9kYXRlcyApOwoJCS8vIFJlLWFycmFuZ2UgYmFja3VwcyBiYXNlZCBvbiBzb3J0IGRhdGVzLgoJCSRzb3J0ZWRfYmFja3VwcyA9IGFycmF5KCk7CgkJZm9yZWFjaCggJGJhY2t1cF9zb3J0X2RhdGVzIGFzICRiYWNrdXBfZmlsZSA9PiAkYmFja3VwX3NvcnRfZGF0ZSApIHsKCQkJJHNvcnRlZF9iYWNrdXBzWyRiYWNrdXBfZmlsZV0gPSAkYmFja3Vwc1skYmFja3VwX2ZpbGVdOwoJCQl1bnNldCggJGJhY2t1cHNbJGJhY2t1cF9maWxlXSApOwoJCX0KCQl1bnNldCggJGJhY2t1cHMgKTsKCgoJCXJldHVybiAkc29ydGVkX2JhY2t1cHM7CgoJfSAvLyBFbmQgYmFja3Vwc19saXN0KCkuCgoKCS8vIDExMjgKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGF0QXJyYXlGcm9tWmlwKCAkZmlsZSApIHsKCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvemlwYnVkZHkvemlwYnVkZHkucGhwJyApOwoJCSR6aXBidWRkeSA9IG5ldyBwbHVnaW5idWRkeV96aXBidWRkeSggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgKTsKCQkkc2VyaWFsID0gc2VsZjo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRmaWxlICk7CgkJCgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPmZpbGVfZXhpc3RzKCAkZmlsZSwgJGZpbmQgPSAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICRzZXJpYWwgLiAnL2JhY2t1cGJ1ZGR5X2RhdC5waHAnICkgPT09IHRydWUgKSB7IC8vIFBvc3QgMi4wIGZ1bGwgYmFja3VwCgkJCQoJCX0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddLT5maWxlX2V4aXN0cyggJGZpbGUsICRmaW5kID0gJ3dwLWNvbnRlbnQvdXBsb2Fkcy90ZW1wXycgLiAkc2VyaWFsIC4gJy9iYWNrdXBidWRkeV9kYXQucGhwJyApID09PSB0cnVlICkgeyAvLyBQcmUgMi4wIGZ1bGwgYmFja3VwCgkJCQoJCX0gZWxzZWlmICggcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddLT5maWxlX2V4aXN0cyggJGZpbGUsICRmaW5kID0gJ2JhY2t1cGJ1ZGR5X2RhdC5waHAnICkgPT09IHRydWUgKSB7IC8vIERCIGJhY2t1cAoJCQkKCQl9IGVsc2UgeyAvLyBDb3VsZCBub3QgZmluZCBEQXQgZmlsZS4KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkvLyBDYWxjdWxhdGUgdGVtcCBkaXJlY3RvcnkgJiBsb2NrIGl0IGRvd24uCgkJJHRlbXBfZGlyID0gZ2V0X3RlbXBfZGlyKCk7CgkJJGRlc3RpbmF0aW9uID0gJHRlbXBfZGlyOwoJCWlmICggKCAoICEgZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbiApICkgJiYgKCBmYWxzZSA9PT0gbWtkaXIoICRkZXN0aW5hdGlvbiApICkgKSApIHsKCQkJJGVycm9yID0gJ0Vycm9yICM0NTg0ODU5NDViOiBVbmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBsb2NhdGlvbi4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IgKTsKCQkJZGllKCAkZXJyb3IgKTsKCQl9CgoJCS8vIElmIHRlbXAgZGlyZWN0b3J5IGlzIHdpdGhpbiB3ZWJyb290IHRoZW4gbG9jayBpdCBkb3duLgoJCSR0ZW1wX2RpciA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnLycsICR0ZW1wX2RpciApOyAvLyBOb3JtYWxpemUgZm9yIFdpbmRvd3MuCgkJJHRlbXBfZGlyID0gcnRyaW0oICR0ZW1wX2RpciwgJy9cXCcgKSAuICcvJzsgLy8gRW5mb3JjZSBzaW5nbGUgdHJhaWxpbmcgc2xhc2guCgkJaWYgKCBGQUxTRSAhPT0gc3RyaXN0ciggJHRlbXBfZGlyLCBBQlNQQVRIICkgKSB7IC8vIFRlbXAgZGlyIGlzIHdpdGhpbiB3ZWJyb290LgoJCQlwYl9iYWNrdXBidWRkeTo6YW50aV9kaXJlY3RvcnlfYnJvd3NpbmcoICRkZXN0aW5hdGlvbiApOwoJCX0KCQl1bnNldCggJHRlbXBfZGlyICk7CgkJCgkJJGV4dHJhY3Rpb25zID0gYXJyYXkoICRmaW5kID0+ICd0ZW1wX2RhdF9yZWFkLScgLiAkc2VyaWFsIC4gJy5waHAnICk7CgkJJGV4dHJhY3RfcmVzdWx0ID0gJHppcGJ1ZGR5LT5leHRyYWN0KCAkZmlsZSwgJGRlc3RpbmF0aW9uLCAkZXh0cmFjdGlvbnMgKTsKCQlpZiAoIGZhbHNlID09PSAkZXh0cmFjdF9yZXN1bHQgKSB7IC8vIGZhaWxlZC4KCQkJcmV0dXJuIGFycmF5KCk7CgkJfSBlbHNlIHsKCQkJJGRhdEFycmF5ID0gc2VsZjo6Z2V0X2RhdF9maWxlX2FycmF5KCAkZGVzdGluYXRpb24gLiAndGVtcF9kYXRfcmVhZC0nIC4gJHNlcmlhbCAuICcucGhwJyApOwoJCQlpZiAoIGlzX2FycmF5KCAkZGF0QXJyYXkgKSApIHsKCQkJCXJldHVybiAkZGF0QXJyYXk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gYXJyYXkoKTsKCQkJfQoJCX0KCQkKCX0gLy8gRW5kIGdldERhdENvbnRlbnRzRnJvbVppcCgpLgoKCgkvLyBJZiBvdXRwdXQgZmlsZSBub3Qgc3BlY2lmaWVkIHRoZW4gb3V0cHV0cyB0byBicm93c2VyIGFzIGRvd25sb2FkLgoJLy8gSU1QT1JUQU5UOiBJZiBvdXRwdXR0aW5nIHRvIGJyb3dzZXIgKG5vIG91dHB1dCBmaWxlKSBtdXN0IGRpZSgpIGFmdGVyIG91dHB1dHRpbmcgY29udGVudCBpZiB1c2luZyBBSkFYLiBEbyBub3Qgb3V0cHV0IHRvIGJyb3dzZXIgYW55dGhpbmcgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpbiB0aGlzIGNhc2UuCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGltcG9ydGJ1ZGR5KCAkb3V0cHV0X2ZpbGUgPSAnJywgJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCA9ICcnLCAkcmV0dXJuX25vdF9lY2hvID0gZmFsc2UgKSB7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoKTsgLy8gU29tZSBwZW9wbGUgcnVuIG91dCBvZiBQSFAgbWVtb3J5LgoKCQlpZiAoICRpbXBvcnRidWRkeV9wYXNzX2hhc2ggPT0gJycgKSB7CgkJCWlmICggIWlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkKCk7CgkJCX0KCQkJJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snaW1wb3J0YnVkZHlfcGFzc19oYXNoJ107CgkJfQoKCQlpZiAoICRpbXBvcnRidWRkeV9wYXNzX2hhc2ggPT0gJycgKSB7CgkJCSRtZXNzYWdlID0gJ1dhcm5pbmcgIzkwMzIgLSBZb3UgaGF2ZSBub3Qgc2V0IGFuIEltcG9ydEJ1ZGR5IHBhc3N3b3JkIG9uIHRoZSBCYWNrdXBCdWRkeSBTZXR0aW5ncyBwYWdlLiBPbmNlIHRoaXMgcGFzc3dvcmQgaXMgc2V0IGEgY29weSBvZiB0aGUgaW1wb3J0YnVkZHkucGhwIGZpbGUgbmVlZGVkIHRvIHJlc3RvcmUgeW91ciBiYWNrdXAgd2lsbCBiZSBpbmNsdWRlZCBpbiBGdWxsIGJhY2t1cCB6aXAgZmlsZXMgZm9yIGNvbnZlbmllbmNlLiBJdCBtYXkgbWFudWFsbHkgYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBSZXN0b3JlIC8gTWlncmF0ZSBwYWdlLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJG1lc3NhZ2UgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBpbXBvcnRidWRkeSBjb3JlIGZpbGUgaW50byBtZW1vcnkuJyApOwoJCSRvdXRwdXQgPSBmaWxlX2dldF9jb250ZW50cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL19pbXBvcnRidWRkeS9faW1wb3J0YnVkZHkucGhwJyApOwoJCWlmICggJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCAhPSAnJyApIHsKCQkJJG91dHB1dCA9IHByZWdfcmVwbGFjZSgnLyNQQVNTV09SRCMvJywgJGltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCwgJG91dHB1dCwgMSApOyAvLyBPbmx5IHJlcGxhY2VzIGZpcnN0IGluc3RhbmNlLgoJCX0KCgkJJHZlcnNpb25fc3RyaW5nID0gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAndmVyc2lvbicgKSAuICcgKGRvd25sb2FkZWQgJyAuIGRhdGUoIERBVEVfVzNDICkgLiAnKSc7CgoJCS8vIElmIG9uIERFViBzeXN0ZW0gKC5naXQgZGlyIGV4aXN0cykgdGhlbiBhcHBlbmQgc29tZSBkZXRhaWxzIG9uIGN1cnJlbnQuCgkJaWYgKCBkZWZpbmVkKCAnQkFDS1VQQlVERFlfREVWJyApICYmICggdHJ1ZSA9PT0gQkFDS1VQQlVERFlfREVWICkgKSB7CgkJCWlmICggQGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvLmdpdC9sb2dzL0hFQUQnICkgKSB7CgkJCQkkY29tbWl0X2xvZyA9IGVzY2FwZXNoZWxsYXJnKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvLmdpdC9sb2dzL0hFQUQnICk7CgkJCQkkY29tbWl0X2xpbmUgPSBleGVjKCAidGFpbCAtbiAxIHskY29tbWl0X2xvZ30iICk7CgkJCQkkdmVyc2lvbl9zdHJpbmcgLj0gJyA8c3BhbiBzdHlsZT0iZm9udC1zaXplOiA4cHg7Ij5bREVWOiAnIC4gJGNvbW1pdF9saW5lIC4gJ108L3NwYW4+JzsKCQkJfQoJCX0KCgkJJG91dHB1dCA9IHByZWdfcmVwbGFjZSgnLyNWRVJTSU9OIy8nLCAkdmVyc2lvbl9zdHJpbmcsICRvdXRwdXQsIDEgKTsgLy8gT25seSByZXBsYWNlcyBmaXJzdCBpbnN0YW5jZS4KCgkJLy8gUEFDSyBJTVBPUlRCVUREWQoJCSRfcGFja2RhdGEgPSBhcnJheSggLy8gTk8gVFJBSUxJTkcgT1IgUFJFQ0VFRElORyBTTEFTSEVTIQoKCQkJJ19pbXBvcnRidWRkeS9pbXBvcnRidWRkeScJCQkJCQkJPT4JCSdpbXBvcnRidWRkeScsCgkJCSdjbGFzc2VzL19taWdyYXRlX2RhdGFiYXNlLnBocCcJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvX21pZ3JhdGVfZGF0YWJhc2UucGhwJywKCQkJJ2NsYXNzZXMvY29yZS5waHAnCQkJCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9jbGFzc2VzL2NvcmUucGhwJywKCQkJJ2NsYXNzZXMvaW1wb3J0LnBocCcJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvY2xhc3Nlcy9pbXBvcnQucGhwJywKCQkJJ2NsYXNzZXMvcmVzdG9yZS5waHAnCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2NsYXNzZXMvcmVzdG9yZS5waHAnLAoJCQknY2xhc3Nlcy9fcmVzdG9yZUZpbGVzLnBocCcJCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9jbGFzc2VzL19yZXN0b3JlRmlsZXMucGhwJywKCQkJJ2NsYXNzZXMvcmVtb3RlX2FwaS5waHAnCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvY2xhc3Nlcy9yZW1vdGVfYXBpLnBocCcsCgkJCQoJCQknanMvanF1ZXJ5LmxlYW5Nb2RhbC5taW4uanMnCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9qcy9qcXVlcnkubGVhbk1vZGFsLm1pbi5qcycsCgkJCSdqcy9qcXVlcnkuam95cmlkZS0yLjAuMy5qcycJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2pzL2pxdWVyeS5qb3lyaWRlLTIuMC4zLmpzJywKCQkJJ2pzL21vZGVybml6ci5tcS5qcycJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvanMvbW9kZXJuaXpyLm1xLmpzJywKCQkJJ2Nzcy9qb3lyaWRlLmNzcycJCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2Nzcy9qb3lyaWRlLmNzcycsCgoJCQknaW1hZ2VzL3dvcmtpbmcuZ2lmJwkJCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9pbWFnZXMvd29ya2luZy5naWYnLAoJCQknaW1hZ2VzL2J1bGxldF9nby5wbmcnCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2ltYWdlcy9idWxsZXRfZ28ucG5nJywKCQkJJ2ltYWdlcy9mYXZpY29uLnBuZycJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvaW1hZ2VzL2Zhdmljb24ucG5nJywKCQkJJ2ltYWdlcy9zb3J0X2Rvd24ucG5nJwkJCQkJCQkJPT4JCSdpbXBvcnRidWRkeS9pbWFnZXMvc29ydF9kb3duLnBuZycsCgkJCSdpbWFnZXMvaWNvbl9tZW51XzMyeDMyLnBuZycJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2ltYWdlcy9pY29uX21lbnVfMzJ4MzIucG5nJywKCgkJCSdsaWIvZGJyZXBsYWNlJwkJCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2xpYi9kYnJlcGxhY2UnLAoJCQknbGliL2RiaW1wb3J0JwkJCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2xpYi9kYmltcG9ydCcsCgkJCSdsaWIvY29tbWFuZGJ1ZGR5JwkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvbGliL2NvbW1hbmRidWRkeScsCgkJCSdsaWIvemlwYnVkZHknCQkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvbGliL3ppcGJ1ZGR5JywKCQkJJ2xpYi9teXNxbGJ1ZGR5JwkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvbGliL215c3FsYnVkZHknLAoJCQknbGliL3RleHRyZXBsYWNlYnVkZHknCQkJCQkJCQk9PgkJJ2ltcG9ydGJ1ZGR5L2xpYi90ZXh0cmVwbGFjZWJ1ZGR5JywKCQkJJ2xpYi9jcGFuZWwnCQkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvbGliL2NwYW5lbCcsCgoJCQkncGx1Z2luYnVkZHknCQkJCQkJCQkJCT0+CQknaW1wb3J0YnVkZHkvcGx1Z2luYnVkZHknLAoKCQkJJ2NvbnRyb2xsZXJzL3BhZ2VzL3NlcnZlcl9pbmZvJwkJCQkJCT0+CQknaW1wb3J0YnVkZHkvY29udHJvbGxlcnMvcGFnZXMvc2VydmVyX2luZm8nLAoJCQknY29udHJvbGxlcnMvcGFnZXMvc2VydmVyX3Rvb2xzLnBocCcJCQkJPT4JCSdpbXBvcnRidWRkeS9jb250cm9sbGVycy9wYWdlcy9zZXJ2ZXJfdG9vbHMucGhwJywKCgkJCS8vIFN0YXNoCgkJCSdkZXN0aW5hdGlvbnMvc3Rhc2gvbGliL2NsYXNzLml0eF9oZWxwZXIucGhwJwkJPT4JCSdpbXBvcnRidWRkeS9jbGFzc2VzL2NsYXNzLml0eF9oZWxwZXIucGhwJywKCQkJJ2Rlc3RpbmF0aW9ucy9fczNsaWIvYXdzLXNkay9saWIvcmVxdWVzdGNvcmUnCQk9PgkJJ2ltcG9ydGJ1ZGR5L2xpYi9yZXF1ZXN0Y29yZScsCgoJCSk7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRpbmcgZWFjaCBmaWxlIGludG8gbWVtb3J5IGZvciB3cml0aW5nIG1hc3RlciBpbXBvcnRidWRkeSBmaWxlLicgKTsKCgkJJG91dHB1dCAuPSAiXG48P3BocCAvKlxuIyMjUEFDS0RBVEEsQkVHSU5cbiI7CgkJZm9yZWFjaCggJF9wYWNrZGF0YSBhcyAkcGFja19zb3VyY2UgPT4gJHBhY2tfZGVzdGluYXRpb24gKSB7CgkJCSRwYWNrX3NvdXJjZSA9ICcvJyAuICRwYWNrX3NvdXJjZTsKCQkJaWYgKCBpc19kaXIoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJHBhY2tfc291cmNlICkgKSB7CgkJCQkkZmlsZXMgPSBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPmRlZXBnbG9iKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICRwYWNrX3NvdXJjZSApOwoJCQl9IGVsc2UgewoJCQkJJGZpbGVzID0gYXJyYXkoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJHBhY2tfc291cmNlICk7CgkJCX0KCQkJZm9yZWFjaCggJGZpbGVzIGFzICRmaWxlICkgewoJCQkJaWYgKCBpc19maWxlKCAkZmlsZSApICkgewoJCQkJCSRzb3VyY2UgPSBzdHJfcmVwbGFjZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCksICcnLCAkZmlsZSApOwoJCQkJCSRkZXN0aW5hdGlvbiA9ICRwYWNrX2Rlc3RpbmF0aW9uIC4gc3Vic3RyKCAkc291cmNlLCBzdHJsZW4oICRwYWNrX3NvdXJjZSApICk7CgkJCQkJJG91dHB1dCAuPSAiIyMjUEFDS0RBVEEsRklMRV9TVEFSVCx7JHNvdXJjZX0seyRkZXN0aW5hdGlvbn1cbiI7CgkJCQkJJG91dHB1dCAuPSBiYXNlNjRfZW5jb2RlKCBmaWxlX2dldF9jb250ZW50cyggJGZpbGUgKSApOwoJCQkJCSRvdXRwdXQgLj0gIlxuIjsKCQkJCQkkb3V0cHV0IC49ICIjIyNQQUNLREFUQSxGSUxFX0VORCx7JHNvdXJjZX0seyRkZXN0aW5hdGlvbn1cbiI7CgkJCQl9CgkJCX0KCQl9CgkJJG91dHB1dCAuPSAiIyMjUEFDS0RBVEEsRU5EXG4qLyI7CgkJJG91dHB1dCAuPSAiXG5cblxuXG5cblxuXG5cblxuXG4iOwoKCQlpZiAoIHRydWUgPT09ICRyZXR1cm5fbm90X2VjaG8gKSB7CgkJCXJldHVybiAkb3V0cHV0OwoJCX0KCgkJaWYgKCAkb3V0cHV0X2ZpbGUgPT0gJycgKSB7IC8vIE5vIGZpbGUgc28gb3V0cHV0IHRvIGJyb3dzZXIuCgkJCWhlYWRlciggJ0NvbnRlbnQtRGVzY3JpcHRpb246IEZpbGUgVHJhbnNmZXInICk7CgkJCWhlYWRlciggJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgbmFtZT1pbXBvcnRidWRkeS5waHAnICk7CgkJCWhlYWRlciggJ0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPWltcG9ydGJ1ZGR5LnBocCcgKTsKCQkJaGVhZGVyKCAnRXhwaXJlczogMCcgKTsKCQkJaGVhZGVyKCAnQ29udGVudC1MZW5ndGg6ICcgLiBzdHJsZW4oICRvdXRwdXQgKSApOwoKCQkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgkJCWVjaG8gJG91dHB1dDsKCQkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoJCQkvLyBCRSBTVVJFIFRPIGRpZSgpIEFGVEVSIFRISVMgQU5EIE5PVCBPVVRQVVQgVE8gQlJPV1NFUiEKCQl9IGVsc2UgeyAvLyBXcml0ZSB0byBmaWxlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXcml0aW5nIGltcG9ydGJ1ZGR5IG1hc3RlciBmaWxlIHRvIGRpc2suJyApOwoJCQlpZiAoIGZhbHNlID09PSBmaWxlX3B1dF9jb250ZW50cyggJG91dHB1dF9maWxlLCAkb3V0cHV0ICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzQ4Mzg5NDogVW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgYCcgLiAkb3V0cHV0X2ZpbGUgLiAnYC4nICk7CgkJCX0KCQl9CgoJfSAvLyBFbmQgaW1wb3J0YnVkZHkoKS4KCgoKCS8vIElmIG91dHB1dCBmaWxlIG5vdCBzcGVjaWZpZWQgdGhlbiBvdXRwdXRzIHRvIGJyb3dzZXIgYXMgZG93bmxvYWQuCgkvLyBJTVBPUlRBTlQ6IElmIG91dHB1dHRpbmcgdG8gYnJvd3NlciAobm8gb3V0cHV0IGZpbGUpIG11c3QgZGllKCkgYWZ0ZXIgb3V0cHV0dGluZyBjb250ZW50IGlmIHVzaW5nIEFKQVguIERvIG5vdCBvdXRwdXQgdG8gYnJvd3NlciBhbnl0aGluZyBhZnRlciB0aGlzIGZ1bmN0aW9uIGluIHRoaXMgY2FzZS4KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2VydmVyYnVkZHkoICRvdXRwdXRfZmlsZSA9ICcnLCAkc2VydmVyYnVkZHlfcGFzc19oYXNoID0gJycgKSB7CgkJaWYgKCBkZWZpbmVkKCAnUEJfREVNT19NT0RFJyApICkgewoJCQllY2hvICdBY2Nlc3MgZGVuaWVkIGluIGRlbW8gbW9kZS4nOwoJCQlyZXR1cm47CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7IC8vIFNvbWUgcGVvcGxlIHJ1biBvdXQgb2YgUEhQIG1lbW9yeS4KCgkJaWYgKCAkc2VydmVyYnVkZHlfcGFzc19oYXNoID09ICcnICkgewoJCQlpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6bG9hZCgpOwoJCQl9CgkJCSRzZXJ2ZXJidWRkeV9wYXNzX2hhc2ggPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2ltcG9ydGJ1ZGR5X3Bhc3NfaGFzaCddOwoJCX0KCgkJaWYgKCAkc2VydmVyYnVkZHlfcGFzc19oYXNoID09ICcnICkgewoJCQkkbWVzc2FnZSA9ICdFcnJvciAjOTAzMmM6IFdhcm5pbmcgb25seSAtIFlvdSBoYXZlIG5vdCBzZXQgYSBwYXNzd29yZCB0byBnZW5lcmF0ZSB0aGUgU2VydmVyQnVkZHkgc2NyaXB0IHlldCBvbiB0aGUgQmFja3VwQnVkZHkgU2V0dGluZ3MgcGFnZS4gSWYgeW91IHdlcmUgdHJ5aW5nIHRvIGRvd25sb2FkIFNlcnZlckJ1ZGR5IHRoZW4geW91IG1heSBoYXZlIGEgcGx1Z2luIGNvbmZpY3QgcHJldmVudGluZyB0aGUgcGFnZSBmcm9tIHByb21wdGluZyB5b3UgdG8gZW50ZXIgYSBwYXNzd29yZC4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICRtZXNzYWdlICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRvdXRwdXQgPSBmaWxlX2dldF9jb250ZW50cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL19zZXJ2ZXJidWRkeS9fc2VydmVyYnVkZHkucGhwJyApOwoJCWlmICggJHNlcnZlcmJ1ZGR5X3Bhc3NfaGFzaCAhPSAnJyApIHsKCQkJJG91dHB1dCA9IHByZWdfcmVwbGFjZSgnLyNQQVNTV09SRCMvJywgJHNlcnZlcmJ1ZGR5X3Bhc3NfaGFzaCwgJG91dHB1dCwgMSApOyAvLyBPbmx5IHJlcGxhY2VzIGZpcnN0IGluc3RhbmNlLgoJCX0KCQkkb3V0cHV0ID0gcHJlZ19yZXBsYWNlKCcvI1ZFUlNJT04jLycsIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICksICRvdXRwdXQsIDEgKTsgLy8gT25seSByZXBsYWNlcyBmaXJzdCBpbnN0YW5jZS4KCgkJLy8gUEFDSyBTRVJWRVJCVUREWQoJCSRfcGFja2RhdGEgPSBhcnJheSggLy8gTk8gVFJBSUxJTkcgT1IgUFJFQ0VFRElORyBTTEFTSEVTIQoKCQkJJ19zZXJ2ZXJidWRkeS9zZXJ2ZXJidWRkeScJCQkJCQkJPT4JCSdzZXJ2ZXJidWRkeScsCgkJCSdjbGFzc2VzL19taWdyYXRlX2RhdGFiYXNlLnBocCcJCQkJCQk9PgkJJ3NlcnZlcmJ1ZGR5L2NsYXNzZXMvX21pZ3JhdGVfZGF0YWJhc2UucGhwJywKCQkJJ2NsYXNzZXMvY29yZS5waHAnCQkJCQkJCQkJPT4JCSdzZXJ2ZXJidWRkeS9jbGFzc2VzL2NvcmUucGhwJywKCgkJCSdpbWFnZXMvd29ya2luZy5naWYnCQkJCQkJCQk9PgkJJ3NlcnZlcmJ1ZGR5L2ltYWdlcy93b3JraW5nLmdpZicsCgkJCSdpbWFnZXMvYnVsbGV0X2dvLnBuZycJCQkJCQkJCT0+CQknc2VydmVyYnVkZHkvaW1hZ2VzL2J1bGxldF9nby5wbmcnLAoJCQknaW1hZ2VzL2Zhdmljb24ucG5nJwkJCQkJCQkJPT4JCSdzZXJ2ZXJidWRkeS9pbWFnZXMvZmF2aWNvbi5wbmcnLAoJCQknaW1hZ2VzL3NvcnRfZG93bi5wbmcnCQkJCQkJCQk9PgkJJ3NlcnZlcmJ1ZGR5L2ltYWdlcy9zb3J0X2Rvd24ucG5nJywKCgoJCQknbGliL2RicmVwbGFjZScJCQkJCQkJCQkJPT4JCSdzZXJ2ZXJidWRkeS9saWIvZGJyZXBsYWNlJywKCQkJJ2xpYi9jb21tYW5kYnVkZHknCQkJCQkJCQkJPT4JCSdzZXJ2ZXJidWRkeS9saWIvY29tbWFuZGJ1ZGR5JywKCQkJJ2xpYi96aXBidWRkeScJCQkJCQkJCQkJPT4JCSdzZXJ2ZXJidWRkeS9saWIvemlwYnVkZHknLAoJCQknbGliL215c3FsYnVkZHknCQkJCQkJCQkJPT4JCSdzZXJ2ZXJidWRkeXkvbGliL215c3FsYnVkZHknLAoJCQknbGliL3RleHRyZXBsYWNlYnVkZHknCQkJCQkJCQk9PgkJJ3NlcnZlcmJ1ZGR5L2xpYi90ZXh0cmVwbGFjZWJ1ZGR5JywKCgkJCSdwbHVnaW5idWRkeScJCQkJCQkJCQkJPT4JCSdzZXJ2ZXJidWRkeS9wbHVnaW5idWRkeScsCgoJCQknY29udHJvbGxlcnMvcGFnZXMvc2VydmVyX2luZm8nCQkJCQkJPT4JCSdzZXJ2ZXJidWRkeS9jb250cm9sbGVycy9wYWdlcy9zZXJ2ZXJfaW5mbycsCgkJCSdjb250cm9sbGVycy9wYWdlcy9zZXJ2ZXJfdG9vbHMucGhwJwkJCQkJPT4JCSdzZXJ2ZXJidWRkeS9jb250cm9sbGVycy9wYWdlcy9zZXJ2ZXJfdG9vbHMucGhwJywKCgkJKTsKCgkJJG91dHB1dCAuPSAiXG48P3BocCAvKlxuIyMjUEFDS0RBVEEsQkVHSU5cbiI7CgkJZm9yZWFjaCggJF9wYWNrZGF0YSBhcyAkcGFja19zb3VyY2UgPT4gJHBhY2tfZGVzdGluYXRpb24gKSB7CgkJCSRwYWNrX3NvdXJjZSA9ICcvJyAuICRwYWNrX3NvdXJjZTsKCQkJaWYgKCBpc19kaXIoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJHBhY2tfc291cmNlICkgKSB7CgkJCQkkZmlsZXMgPSBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPmRlZXBnbG9iKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICRwYWNrX3NvdXJjZSApOwoJCQl9IGVsc2UgewoJCQkJJGZpbGVzID0gYXJyYXkoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJHBhY2tfc291cmNlICk7CgkJCX0KCQkJZm9yZWFjaCggJGZpbGVzIGFzICRmaWxlICkgewoJCQkJaWYgKCBpc19maWxlKCAkZmlsZSApICkgewoJCQkJCSRzb3VyY2UgPSBzdHJfcmVwbGFjZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCksICcnLCAkZmlsZSApOwoJCQkJCSRkZXN0aW5hdGlvbiA9ICRwYWNrX2Rlc3RpbmF0aW9uIC4gc3Vic3RyKCAkc291cmNlLCBzdHJsZW4oICRwYWNrX3NvdXJjZSApICk7CgkJCQkJJG91dHB1dCAuPSAiIyMjUEFDS0RBVEEsRklMRV9TVEFSVCx7JHNvdXJjZX0seyRkZXN0aW5hdGlvbn1cbiI7CgkJCQkJJG91dHB1dCAuPSBiYXNlNjRfZW5jb2RlKCBmaWxlX2dldF9jb250ZW50cyggJGZpbGUgKSApOwoJCQkJCSRvdXRwdXQgLj0gIlxuIjsKCQkJCQkkb3V0cHV0IC49ICIjIyNQQUNLREFUQSxGSUxFX0VORCx7JHNvdXJjZX0seyRkZXN0aW5hdGlvbn1cbiI7CgkJCQl9CgkJCX0KCQl9CgkJJG91dHB1dCAuPSAiIyMjUEFDS0RBVEEsRU5EXG4qLyI7CgkJJG91dHB1dCAuPSAiXG5cblxuXG5cblxuXG5cblxuXG4iOwoKCQlpZiAoICRvdXRwdXRfZmlsZSA9PSAnJyApIHsgLy8gTm8gZmlsZSBzbyBvdXRwdXQgdG8gYnJvd3Nlci4KCQkJaGVhZGVyKCAnQ29udGVudC1EZXNjcmlwdGlvbjogRmlsZSBUcmFuc2ZlcicgKTsKCQkJaGVhZGVyKCAnQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBuYW1lPWltcG9ydGJ1ZGR5LnBocCcgKTsKCQkJaGVhZGVyKCAnQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9aW1wb3J0YnVkZHkucGhwJyApOwoJCQloZWFkZXIoICdFeHBpcmVzOiAwJyApOwoJCQloZWFkZXIoICdDb250ZW50LUxlbmd0aDogJyAuIHN0cmxlbiggJG91dHB1dCApICk7CgoJCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCQkJZWNobyAkb3V0cHV0OwoJCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCgkJCS8vIEJFIFNVUkUgVE8gZGllKCkgQUZURVIgVEhJUyBBTkQgTk9UIE9VVFBVVCBUTyBCUk9XU0VSIQoJCX0gZWxzZSB7IC8vIFdyaXRlIHRvIGZpbGUuCgkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkb3V0cHV0X2ZpbGUsICRvdXRwdXQgKTsKCQl9CgoJfSAvLyBFbmQgc2VydmVyYnVkZHkoKS4KCgoKCS8vIFRPRE86IFJlcGFpckJ1ZGR5IGlzIG5vdCB5ZXQgY29udmVydGVkIGludG8gbmV3IGZyYW1ld29yayBzbyBqdXN0IHVzaW5nIHByZS1CQjMuMCB2ZXJzaW9uIGZvciBub3cuCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlcGFpcmJ1ZGR5KCAkb3V0cHV0X2ZpbGUgPSAnJyApIHsKCQlpZiAoIGRlZmluZWQoICdQQl9ERU1PX01PREUnICkgKSB7CgkJCWVjaG8gJ0FjY2VzcyBkZW5pZWQgaW4gZGVtbyBtb2RlLic7CgkJCXJldHVybjsKCQl9CgoJCWlmICggIWlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OmxvYWQoKTsKCQl9CgkJJG91dHB1dCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvX3JlcGFpcmJ1ZGR5LnBocCcgKTsKCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snaW1wb3J0YnVkZHlfcGFzc19oYXNoJ10gIT0gJycgKSB7CgkJCSRvdXRwdXQgPSBwcmVnX3JlcGxhY2UoJy8jUEFTU1dPUkQjLycsIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snaW1wb3J0YnVkZHlfcGFzc19oYXNoJ10sICRvdXRwdXQsIDEgKTsgLy8gT25seSByZXBsYWNlcyBmaXJzdCBpbnN0YW5jZS4KCQl9CgkJJG91dHB1dCA9IHByZWdfcmVwbGFjZSgnLyNWRVJTSU9OIy8nLCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApLCAkb3V0cHV0LCAxICk7IC8vIE9ubHkgcmVwbGFjZXMgZmlyc3QgaW5zdGFuY2UuCgoKCQlpZiAoICRvdXRwdXRfZmlsZSA9PSAnJyApIHsgLy8gTm8gZmlsZSBzbyBvdXRwdXQgdG8gYnJvd3Nlci4KCQkJaGVhZGVyKCAnQ29udGVudC1EZXNjcmlwdGlvbjogRmlsZSBUcmFuc2ZlcicgKTsKCQkJaGVhZGVyKCAnQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBuYW1lPXJlcGFpcmJ1ZGR5LnBocCcgKTsKCQkJaGVhZGVyKCAnQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9cmVwYWlyYnVkZHkucGhwJyApOwoJCQloZWFkZXIoICdFeHBpcmVzOiAwJyApOwoJCQloZWFkZXIoICdDb250ZW50LUxlbmd0aDogJyAuIHN0cmxlbiggJG91dHB1dCApICk7CgoJCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCQkJZWNobyAkb3V0cHV0OwoJCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCgkJCS8vIEJFIFNVUkUgVE8gZGllKCkgQUZURVIgVEhJUyBBTkQgTk9UIE9VVFBVVCBUTyBCUk9XU0VSIQoJCX0gZWxzZSB7IC8vIFdyaXRlIHRvIGZpbGUuCgkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkb3V0cHV0X2ZpbGUsICRvdXRwdXQgKTsKCQl9CgoJfSAvLyBFbmQgcmVwYWlyYnVkZHkoKS4KCgoKCS8qIHByZXR0eV9kZXN0aW5hdGlvbl90eXBlKCkKCSAqCgkgKiBUYWtlIGEgZGVzdGluYXRpb24gdHlwZSBzbHVnIGFuZCBjaGFuZ2UgaXQgaW50byBhIHVzZXItZnJpZW5kbHkgZGlzcGxheSBvZiB0aGUgZGVzdGluYXRpb24gdHlwZS4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCQlJbnRlcm5hbCBkZXN0aW5hdGlvbiBzbHVnLiBFZzogczMKCSAqIEByZXR1cm4Jc3RyaW5nCQlGcmllbmRseSBkZXN0aW5hdGlvbiB0aXRsZS4gRWc6IEFtYXpvbiBTMwoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcmV0dHlfZGVzdGluYXRpb25fdHlwZSggJHR5cGUgKSB7CgkJaWYgKCAkdHlwZSA9PSAncmFja3NwYWNlJyApIHsKCQkJcmV0dXJuICdSYWNrc3BhY2UnOwoJCX0gZWxzZWlmICggJHR5cGUgPT0gJ2VtYWlsJyApIHsKCQkJcmV0dXJuICdFbWFpbCc7CgkJfSBlbHNlaWYgKCAkdHlwZSA9PSAnczMnICkgewoJCQlyZXR1cm4gJ0FtYXpvbiBTMyc7CgkJfSBlbHNlaWYgKCAkdHlwZSA9PSAnZnRwJyApIHsKCQkJcmV0dXJuICdGVFAnOwoJCX0gZWxzZWlmICggJHR5cGUgPT0gJ2Ryb3Bib3gnICkgewoJCQlyZXR1cm4gJ0Ryb3Bib3gnOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkdHlwZTsKCQl9Cgl9IC8vIEVuZCBwcmV0dHlfZGVzdGluYXRpb25fdHlwZSgpLgoKCgoJLyogYnVpbGRfaWNpY2xlKCkKCSAqCgkgKiBCdWlsZCBkaXJlY3RvcnkgdHJlZSBmb3IgdXNlIHdpdGggdGhlICJpY2ljbGUiIGphdmFzY3JpcHQgbGlicmFyeSBmb3IgdGhlIGdyYXBoaWNhbCBkaXJlY3RvcnkgZGlzcGxheSBvbiBTZXJ2ZXIgVG9vbHMgcGFnZS4KCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSRkaXIJCQkKCSAqIEBwYXJhbQk/CQkkYmFzZQkJCQoJICogQHBhcmFtCT8JCSRpY2ljbGVfanNvbgkKCSAqIEBwYXJhbQlpbnQJCSRtYXhfZGVwdGgJCU1heGltdW0gZGVwdGggb2YgdHJlZSB0byBkaXNwbGF5LiAgTm90ZSB0aGF0IGRlZXBlciBkZXB0aHMgYXJlIHN0aWxsIHRyYXZlcnNlZCBmb3Igc2l6ZSBjYWxjdWxhdGlvbnMuIERlZmF1bHQ6IDEwCgkgKiBAcGFyYW0JaW50CQkkZGVwdGhfY291bnQJRGVmYXVsdDogMAoJICogQHBhcmFtCWJvb2wJJGlzX3Jvb3QJCURlZmF1bHQ6IHRydWUKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGRfaWNpY2xlKCAkZGlyLCAkYmFzZSwgJGljaWNsZV9qc29uLCAkbWF4X2RlcHRoID0gMTAsICRkZXB0aF9jb3VudCA9IDAsICRpc19yb290ID0gdHJ1ZSApIHsKCQkkYmdfY29sb3IgPSAnMDA1MjgyJzsKCgkJJGRlcHRoX2NvdW50Kys7CgkJJGJnX2NvbG9yID0gZGVjaGV4KCBoZXhkZWMoICRiZ19jb2xvciApIC0gKCAkZGVwdGhfY291bnQgKiAxNSApICk7CgoJCSRpY2ljbGVfanNvbiA9ICd7JyAuICJcbiI7CgoJCSRkaXJfbmFtZSA9ICRkaXI7CgkJJGRpcl9uYW1lID0gc3RyX3JlcGxhY2UoIEFCU1BBVEgsICcnLCAkZGlyICk7CgkJJGRpcl9uYW1lID0gc3RyX3JlcGxhY2UoICdcXCcsICcvJywgJGRpcl9uYW1lICk7CgoJCSRkaXJfc2l6ZSA9IDA7CgkJJHN1YiA9IG9wZW5kaXIoICRkaXIgKTsKCQkkaGFzX2NoaWxkcmVuID0gZmFsc2U7CgkJd2hpbGUoICRmaWxlID0gcmVhZGRpciggJHN1YiApICkgewoJCQlpZiAoICggJGZpbGUgPT0gJy4nICkgfHwgKCAkZmlsZSA9PSAnLi4nICkgKSB7CgkJCQljb250aW51ZTsgLy8gTmV4dCBsb29wLgoJCQl9IGVsc2VpZiAoIGlzX2RpciggJGRpciAuICcvJyAuICRmaWxlICkgKSB7CgoJCQkJJGRpcl9hcnJheSA9ICcnOwoJCQkJJHJlc3BvbnNlID0gc2VsZjo6YnVpbGRfaWNpY2xlKCAkZGlyIC4gJy8nIC4gJGZpbGUsICRiYXNlLCAkZGlyX2FycmF5LCAkbWF4X2RlcHRoLCAkZGVwdGhfY291bnQsIGZhbHNlICk7CgkJCQlpZiAoICggJG1heF9kZXB0aC0xID4gMCApIHx8ICggJG1heF9kZXB0aCA9PSAtMSApICkgeyAvLyBPbmx5IGFkZHMgdG8gdGhlIHZpc3VhbCB0cmVlIGlmIGRlcHRoIGlzbnQgZXhjZWVkZWQuCgkJCQkJaWYgKCAkbWF4X2RlcHRoID4gMCApIHsKCQkJCQkJJG1heF9kZXB0aCA9ICRtYXhfZGVwdGggLSAxOwoJCQkJCX0KCgkJCQkJaWYgKCAkaGFzX2NoaWxkcmVuID09PSBmYWxzZSApIHsgLy8gZmlyc3QgbG9vcCBhZGQgY2hpbGRyZW4gc2VjdGlvbgoJCQkJCQkkaWNpY2xlX2pzb24gLj0gJyJjaGlsZHJlbiI6IFsnIC4gIlxuIjsKCQkJCQl9IGVsc2UgewoJCQkJCQkkaWNpY2xlX2pzb24gLj0gJywnOwoJCQkJCX0KCQkJCQkkaWNpY2xlX2pzb24gLj0gJHJlc3BvbnNlWzBdOwoKCQkJCQkkaGFzX2NoaWxkcmVuID0gdHJ1ZTsKCQkJCX0KCQkJCSRkaXJfc2l6ZSArPSAkcmVzcG9uc2VbMV07CgkJCQl1bnNldCggJHJlc3BvbnNlICk7CgkJCQl1bnNldCggJGZpbGUgKTsKCgoJCQl9IGVsc2UgewoJCQkJJHN0YXRzID0gc3RhdCggJGRpciAuICcvJyAuICRmaWxlICk7CgkJCQkkZGlyX3NpemUgKz0gJHN0YXRzWydzaXplJ107CgkJCQl1bnNldCggJGZpbGUgKTsKCQkJfQoJCX0KCQljbG9zZWRpciggJHN1YiApOwoJCXVuc2V0KCAkc3ViICk7CgoJCWlmICggJGhhc19jaGlsZHJlbiA9PT0gdHJ1ZSApIHsKCQkJJGljaWNsZV9qc29uIC49ICcgXScgLiAiXG4iOwoJCX0KCgkJaWYgKCAkaGFzX2NoaWxkcmVuID09PSB0cnVlICkgewoJCQkkaWNpY2xlX2pzb24gLj0gJywnOwoJCX0KCgkJJGljaWNsZV9qc29uIC49ICciaWQiOiAibm9kZV8nIC4gc3RyX3JlcGxhY2UoICcvJywgJzonLCAkZGlyX25hbWUgKSAuICc6IF4nIC4gc3RyX3JlcGxhY2UoICcgJywgJ34nLCBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkZGlyX3NpemUgKSApIC4gJyInIC4gIlxuIjsKCgkJJGRpcl9uYW1lID0gc3RyX3JlcGxhY2UoICcvJywgJycsIHN0cnJjaHIoICRkaXJfbmFtZSwgJy8nICkgKTsKCQlpZiAoICRkaXJfbmFtZSA9PSAnJyApIHsgLy8gU2V0IHJvb3QgdG8gYmUgLy4KCQkJJGRpcl9uYW1lID0gJy8nOwoJCX0KCQkkaWNpY2xlX2pzb24gLj0gJywgIm5hbWUiOiAiJyAuICRkaXJfbmFtZSAuICcgKCcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkZGlyX3NpemUgKSAuICcpIicgLiAiXG4iOwoKCQkkaWNpY2xlX2pzb24gLj0gJywiZGF0YSI6IHsgIiRkaW0iOiAnIC4gKCAkZGlyX3NpemUgKyAxMCApIC4gJywgIiRjb2xvciI6ICIjJyAuIHN0cl9wYWQoICRiZ19jb2xvciwgNiwgJzAnLCBTVFJfUEFEX0xFRlQgKSAuICciIH0nIC4gIlxuIjsKCQkkaWNpY2xlX2pzb24gLj0gJ30nOwoKCQlpZiAoICRpc19yb290ICE9PSB0cnVlICkgewoJCQkvLyRpY2ljbGVfanNvbiAuPSAnLHgnOwoJCX0KCgkJcmV0dXJuIGFycmF5KCAkaWNpY2xlX2pzb24sICRkaXJfc2l6ZSApOwoJfSAvLyBFbmQgYnVpbGRfaWNpY2xlKCkuCgoKCgkvLyByZXR1cm4gYXJyYXkgb2YgdGVzdHMgYW5kIHRoZWlyIHJlc3VsdHMuCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByZWZsaWdodF9jaGVjaygpIHsKCQkkdGVzdHMgPSBhcnJheSgpOwoKCQkvLyBNVUxUSVNJVEUgQkVUQSBXQVJOSU5HLgoJCWlmICggaXNfbXVsdGlzaXRlKCkgJiYgYmFja3VwYnVkZHlfY29yZTo6aXNfbmV0d29ya19hY3RpdmF0ZWQoKSAmJiAhZGVmaW5lZCggJ1BCX0RFTU9fTU9ERScgKSApIHsgLy8gTXVsdGlzaXRlIGluc3RhbGxhdGlvbi4KCQkJJHRlc3RzW10gPSBhcnJheSgKCQkJCSd0ZXN0JwkJPT4JJ211bHRpc2l0ZV9iZXRhJywKCQkJCSdzdWNjZXNzJwk9PglmYWxzZSwKCQkJCSdtZXNzYWdlJwk9PgknV0FSTklORzogQmFja3VwQnVkZHkgTXVsdGlzaXRlIGZ1bmN0aW9uYWxpdHkgaXMgRVhQRVJJTUVOVEFMIGFuZCBOT1Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuIE11bHRpcGxlIGlzc3VlcyBhcmUga25vd24uIFVzYWdlIG9mIGl0IGlzIGF0IHlvdXIgb3duIHJpc2sgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIHVwb24uIFN0YW5kYWxvbmUgV29yZFByZXNzIHNpdGVzIGFyZSBzdWdnZXN0ZWQuIFlvdSBtYXkgdXNlIHRoZSAiRXhwb3J0IiBmZWF0dXJlIHRvIGV4cG9ydCB5b3VyIHN1YnNpdGVzIGludG8gc3RhbmRhbG9uZSBXb3JkUHJlc3Mgc2l0ZXMuIFRvIGVuYWJsZSBleHBlcmltZW50YWwgQmFja3VwQnVkZHkgTXVsdGlzaXRlIGZ1bmN0aW9uYWxpdHkgeW91IG11c3QgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB5b3VyIHdwLWNvbmZpZy5waHAgZmlsZTogPGI+ZGVmaW5lKCBcJ1BCX0JBQ0tVUEJVRERZX01VTFRJU0lURV9FWFBFUklNRU5UXCcsIHRydWUgKTs8L2I+CgkJCQkJCQkJJwoJCQkpOwoJCX0gLy8gZW5kIG5ldHdvcmstYWN0aXZhdGVkIG11bHRpc2l0ZS4KCgkJLy8gTE9PUEJBQ0tTIFRFU1QuCgkJaWYgKCAoICRsb29wYmFja19yZXNwb25zZSA9IHNlbGY6Omxvb3BiYWNrX3Rlc3QoKSApID09PSB0cnVlICkgewoJCQkkc3VjY2VzcyA9IHRydWU7CgkJCSRtZXNzYWdlID0gJyc7CgkJfSBlbHNlIHsgLy8gZmFpbGVkCgkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCWlmICggZGVmaW5lZCggJ0FMVEVSTkFURV9XUF9DUk9OJyApICYmICggQUxURVJOQVRFX1dQX0NST04gPT0gdHJ1ZSApICkgewoJCQkJJG1lc3NhZ2UgPSBfXygnUnVubmluZyBpbiBBbHRlcm5hdGUgV29yZFByZXNzIENyb24gbW9kZS4gSFRUUCBMb29wYmFjayBDb25uZWN0aW9ucyBhcmUgbm90IGVuYWJsZWQgb24gdGhpcyBzZXJ2ZXIgYnV0IHlvdSBoYXZlIG92ZXJyaWRkZW4gdGhpcyBpbiB0aGUgd3AtY29uZmlnLnBocCBmaWxlICh0aGlzIGlzIGEgZ29vZCB0aGluZykuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIDxhIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9jb2RleC9wYWdlL0JhY2t1cEJ1ZGR5Ol9GcmVxdWVudF9TdXBwb3J0X0lzc3VlcyNIVFRQX0xvb3BiYWNrX0Nvbm5lY3Rpb25zX0Rpc2FibGVkIiB0YXJnZXQ9Il9uZXciPicgLiBfXygnQWRkaXRpb25hbCBJbmZvcm1hdGlvbiBIZXJlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPi4nOwoJCQl9IGVsc2UgewoJCQkJJG1lc3NhZ2UgPSBfXygnSFRUUCBMb29wYmFjayBDb25uZWN0aW9ucyBhcmUgbm90IGVuYWJsZWQgb24gdGhpcyBzZXJ2ZXIgb3IgYXJlIG5vdCBmdW5jdGlvbmluZyBwcm9wZXJseS4gWW91IG1heSBlbmNvdW50ZXIgc3RhbGxlZCwgc2lnbmlmaWNhbnRseSBkZWxheWVkIGJhY2t1cHMsIG9yIG90aGVyIGRpZmZpY3VsdGllcy4gU2VlIGRldGFpbHMgaW4gdGhlIGJveCBiZWxvdy4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGEgY29uZmxpY3RpbmcgcGx1Z2luIHN1Y2ggYXMgYSBjYWNoaW5nIHBsdWdpbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgPGEgaHJlZj0iaHR0cDovL2l0aGVtZXMuY29tL2NvZGV4L3BhZ2UvQmFja3VwQnVkZHk6X0ZyZXF1ZW50X1N1cHBvcnRfSXNzdWVzI0hUVFBfTG9vcGJhY2tfQ29ubmVjdGlvbnNfRGlzYWJsZWQiIHRhcmdldD0iX25ldyI+JyAuIF9fKCdDbGljayBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byByZXNvbHZlIHRoaXMgaXNzdWUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPic7CgkJCQkkbWVzc2FnZSAuPSAnIDxiPkRldGFpbHM6PC9iPiA8dGV4dGFyZWEgc3R5bGU9ImhlaWdodDogNTBweDsgd2lkdGg6IDEwMCU7Ij4nIC4gJGxvb3BiYWNrX3Jlc3BvbnNlIC4gJzwvdGV4dGFyZWE+JzsKCQkJfQoJCX0KCQkkdGVzdHNbXSA9IGFycmF5KAoJCQkndGVzdCcJCT0+CSdsb29wYmFja3MnLAoJCQknc3VjY2VzcycJPT4JJHN1Y2Nlc3MsCgkJCSdtZXNzYWdlJwk9PgkkbWVzc2FnZSwKCQkpOwoKCQkvLyBQT1NTSUJMRSBDQUNISU5HIFBMVUdJTiBDT05GTElDVCBXQVJOSU5HLgoJCSRzdWNjZXNzID0gdHJ1ZTsKCQkkbWVzc2FnZSA9ICcnOwoJCSRmb3VuZF9wbHVnaW5zID0gYXJyYXkoKTsKCQlpZiAoICEgaXNfbXVsdGlzaXRlKCkgKSB7CgkJCSRhY3RpdmVfcGx1Z2lucyA9IHNlcmlhbGl6ZSggZ2V0X29wdGlvbiggJ2FjdGl2ZV9wbHVnaW5zJyApICk7CgkJCWZvcmVhY2goIHNlbGY6OiR3YXJuX3BsdWdpbnMgYXMgJHdhcm5fcGx1Z2luID0+ICR3YXJuX3BsdWdpbl90aXRsZSApIHsKCQkJCWlmICggRkFMU0UgIT09IHN0cnBvcyggJGFjdGl2ZV9wbHVnaW5zLCAkd2Fybl9wbHVnaW4gKSApIHsgLy8gUGx1Z2luIGFjdGl2ZS4KCQkJCQkkZm91bmRfcGx1Z2luc1tdID0gJHdhcm5fcGx1Z2luX3RpdGxlOwoJCQkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgkJaWYgKCBjb3VudCggJGZvdW5kX3BsdWdpbnMgKSA+IDAgKSB7CgkJCSRtZXNzYWdlID0gX18oICdPbmUgb3IgbW9yZSBjYWNoaW5nIHBsdWdpbnMgd2VyZSBkZXRlY3RlZCBhcyBhY3RpdmF0ZWQuIFNvbWUgY2FjaGluZyBwbHVnaW4gY29uZmlndXJhdGlvbnMgbWF5IHBvc3NpYmx5IGNhY2hlICYgaW50ZXJmZXJlIHdpdGggYmFja3VwIHByb2Nlc3NlcyBvciBXb3JkUHJlc3MgY3Jvbi4gSWYgeW91IGVuY291bnRlciBwcm9ibGVtcyBjbGVhciB0aGUgY2FjaGluZyBwbHVnaW5cJ3MgY2FjaGUgKGRlYWN0aXZhdGluZyB0aGUgcGx1Z2luIG1heSBoZWxwKSB0byB0cm91Ymxlc2hvb3QuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnICc7CgkJCSRtZXNzYWdlIC49IF9fKCAnQWN0aXZhdGVkIGNhY2hpbmcgcGx1Z2lucyBkZXRlY3RlZDonLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgJzsKCQkJJG1lc3NhZ2UgLj0gaW1wbG9kZSggJywgJywgJGZvdW5kX3BsdWdpbnMgKTsKCQkJJG1lc3NhZ2UgLj0gJy4nOwoJCX0KCQkkdGVzdHNbXSA9IGFycmF5KAoJCQkndGVzdCcJCT0+CSdsb29wYmFja3MnLAoJCQknc3VjY2VzcycJPT4JJHN1Y2Nlc3MsCgkJCSdtZXNzYWdlJwk9PgkkbWVzc2FnZSwKCQkpOwoKCQkvLyBXT1JEUFJFU1MgSU4gU1VCRElSRUNUT1JJRVMgVEVTVC4KCQkkd29yZHByZXNzX2xvY2F0aW9ucyA9IHNlbGY6OmdldF93b3JkcHJlc3NfbG9jYXRpb25zKCk7CgkJaWYgKCBjb3VudCggJHdvcmRwcmVzc19sb2NhdGlvbnMgKSA+IDAgKSB7CgkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCSRtZXNzYWdlID0gX18oICdXb3JkUHJlc3MgbWF5IGhhdmUgYmVlbiBkZXRlY3RlZCBpbiBvbmUgb3IgbW9yZSBzdWJkaXJlY3Rvcmllcy4gQmFja2luZyB1cCBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgV29yZFByZXNzIG1heSByZXN1bHQgaW4gc2VydmVyIHRpbWVvdXRzIGR1ZSB0byBpbmNyZWFzZWQgYmFja3VwIHRpbWUuIFlvdSBtYXkgZXhjbHVkZSBXb3JkUHJlc3MgZGlyZWN0b3JpZXMgdmlhIHRoZSBTZXR0aW5ncyBwYWdlLiBEZXRlY3RlZCBub24tZXhjbHVkZWQgbG9jYXRpb25zOicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gaW1wbG9kZSggJywgJywgJHdvcmRwcmVzc19sb2NhdGlvbnMgKTsKCQl9IGVsc2UgewoJCQkkc3VjY2VzcyA9IHRydWU7CgkJCSRtZXNzYWdlID0gJyc7CgkJfQoJCSR0ZXN0c1tdID0gYXJyYXkoCgkJCSd0ZXN0JwkJPT4JJ3dvcmRwcmVzc19zdWJkaXJlY3RvcmllcycsCgkJCSdzdWNjZXNzJwk9Pgkkc3VjY2VzcywKCQkJJ21lc3NhZ2UnCT0+CSRtZXNzYWdlLAoJCSk7CgoJCS8vIExvZyBmaWxlIGRpcmVjdG9yeSB3cml0YWJsZSBmb3Igc3RhdHVzIGxvZ2dpbmcuCgkJJHN0YXR1c19kaXJlY3RvcnkgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKTsKCQlpZiAoICEgZmlsZV9leGlzdHMoICRzdGF0dXNfZGlyZWN0b3J5ICkgKSB7CgkJCWlmICggZmFsc2UgPT09IHBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggJHN0YXR1c19kaXJlY3RvcnksICRkaWUgPSBmYWxzZSApICkgewoJCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQkJCSRtZXNzYWdlID0gJ1RoZSBzdGF0dXMgbG9nIGZpbGUgZGlyZWN0b3J5IGAnIC4gJHN0YXR1c19kaXJlY3RvcnkgLiAnYCBpcyBub3QgY3JlYXRhYmxlIG9yIHBlcm1pc3Npb25zIHByZXZlbnQgYWNjZXNzLiBWZXJpZnkgcGVybWlzc2lvbnMgb2YgaXQgYW5kL29yIGl0cyBwYXJlbnQgZGlyZWN0b3J5LiBCYWNrdXAgc3RhdHVzIGluZm9ybWF0aW9uIHdpbGwgYmUgdW5hdmFpbGFibGUgdW50aWwgdGhpcyBpcyByZXNvbHZlZC4nOwoJCQl9CgkJfQoJCWlmICggISBpc193cml0YWJsZSggJHN0YXR1c19kaXJlY3RvcnkgKSApIHsKCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQkJJG1lc3NhZ2UgPSAnVGhlIHN0YXR1cyBsb2cgZmlsZSBkaXJlY3RvcnkgYCcgLiAkc3RhdHVzX2RpcmVjdG9yeSAuICdgIGlzIG5vdCB3cml0YWJsZS4gUGxlYXNlIHZlcmlmeSBwZXJtaXNzaW9ucyBiZWZvcmUgY3JlYXRpbmcgYSBiYWNrdXAuIEJhY2t1cCBzdGF0dXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1bmF2YWlsYWJsZSB1bnRpbCB0aGlzIGlzIHJlc29sdmVkLic7CgkJfSBlbHNlIHsKCQkJJHN1Y2Nlc3MgPSB0cnVlOwoJCQkkbWVzc2FnZSA9ICcnOwoJCX0KCQkkdGVzdHNbXSA9IGFycmF5KAoJCQkndGVzdCcJCT0+CSdzdGF0dXNfZGlyZWN0b3J5X3dyaXRhYmxlJywKCQkJJ3N1Y2Nlc3MnCT0+CSRzdWNjZXNzLAoJCQknbWVzc2FnZScJPT4JJG1lc3NhZ2UsCgkJKTsKCgkJLy8gQ0hFQ0sgWklQIEFWQUlMQUJJTElUWS4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvemlwYnVkZHkvemlwYnVkZHkucGhwJyApOwoKCQlpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSA9IG5ldyBwbHVnaW5idWRkeV96aXBidWRkeSggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgKTsKCQl9CgoJCS8qKioqKiBCRUdJTiBMT09LSU5HIEZPUiBVTkZJTklTSEVEIFJFQ0VOVCBCQUNLVVBTICoqKioqLwoJCWlmICggJycgIT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydsYXN0X2JhY2t1cF9zZXJpYWwnXSApIHsKCQkJJGxhc3RCYWNrdXBGaWxlb3B0aW9ucyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfYmFja3VwX3NlcmlhbCddIC4gJy50eHQnOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkbGFzdEJhY2t1cEZpbGVvcHRpb25zICkgKSB7CgkJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCcgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGluc3RhbmNlICMzMi4nICk7CgkJCQkkYmFja3VwX29wdGlvbnMgPSBuZXcgcGJfYmFja3VwYnVkZHlfZmlsZW9wdGlvbnMoICRsYXN0QmFja3VwRmlsZW9wdGlvbnMsICRyZWFkX29ubHkgPSB0cnVlICk7CgkJCQlpZiAoIHRydWUgIT09ICggJHJlc3VsdCA9ICRiYWNrdXBfb3B0aW9ucy0+aXNfb2soKSApIHx8ICggISBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWyd1cGRhdGVkX3RpbWUnXSApICkgKSB7CgkJCQkJLy8gTk9URTogSWYgdGhpcyBmaWxlcyBkdXJpbmcgYSBiYWNrdXAgaXQgbWF5IHRyeSB0byByZWFkIHRoZSBmaWxlb3B0aW9ucyBmaWxlIHRvbyBlYXJseSBkdWUgdG8gdGhlIGxhc3RfYmFja3VwX3NlcmlhbCBiZWluZyBzZXQuIFN1cHByZXNzaW5nIGVycm9ycyBmb3Igbm93LgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VuYWJsZSB0byByZXRyaWV2ZSBmaWxlb3B0aW9ucyBmaWxlICh0aGlzIGlzIG5vcm1hbCBpZiBhIGJhY2t1cCBpcyBjdXJyZW50bHkgaW4gcHJvY2VzcyAmIG1heSBiZSBpZ25vcmVkKSBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zLycgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfYmFja3VwX3NlcmlhbCddIC4gJy50eHQnIC4gJ2AuIEVyciA1NDQ3ODIzNjc2NS4gRGV0YWlsczogYCcgLiAkcmVzdWx0IC4gJ2AuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1sndXBkYXRlZF90aW1lJ10gPCAxODAgKSB7IC8vIEJlZW4gbGVzcyB0aGFuIDNtaW4gc2luY2UgbGFzdCBiYWNrdXAuCgoJCQkJCQlpZiAoICFlbXB0eSggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydzdGVwcyddICkgKSB7IC8vIExvb2sgZm9yIGluY29tcGxldGUgc3RlcHMuCgkJCQkJCQkkZm91bmRfdW5maW5pc2hlZCA9IGZhbHNlOwoJCQkJCQkJZm9yZWFjaCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydzdGVwcyddIGFzICRzdGVwICkgewoJCQkJCQkJCWlmICggJHN0ZXBbJ2ZpbmlzaF90aW1lJ10gPT0gJzAnICkgeyAvLyBGb3VuZCBhbiB1bmZpbmlzaGVkIHN0ZXAuCgkJCQkJCQkJCSRmb3VuZF91bmZpbmlzaGVkID0gdHJ1ZTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfSAvLyBlbmQgZm9yZWFjaC4KCgkJCQkJCQlpZiAoICRmb3VuZF91bmZpbmlzaGVkID09PSB0cnVlICkgewoJCQkJCQkJCSR0ZXN0c1tdID0gYXJyYXkoCgkJCQkJCQkJCSd0ZXN0JwkJPT4JJ3JlY2VudF9iYWNrdXAnLAoJCQkJCQkJCQknc3VjY2VzcycJPT4JZmFsc2UsCgkJCQkJCQkJCSdtZXNzYWdlJwk9PglfXygnQSBiYWNrdXAgd2FzIHJlY2VudGx5IHN0YXJ0ZWQgYW5kIHJlcG9ydHMgdW5maW5pc2hlZCBzdGVwcy4gWW91IHNob3VsZCB3YWl0IHVubGVzcyB5b3UgYXJlIHN1cmUgdGhlIHByZXZpb3VzIGJhY2t1cCBoYXMgY29tcGxldGVkIG9yIGZhaWxlZCB0byBhdm9pZCBwbGFjaW5nIGEgaGVhdnkgbG9hZCBvbiB5b3VyIHNlcnZlci4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuCgkJCQkJCQkJCQknIExhc3QgdXBkYXRlZDogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ3VwZGF0ZWRfdGltZSddICkgLiAnOyAnLgoJCQkJCQkJCQkJJyBTZXJpYWw6ICcgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xhc3RfYmFja3VwX3NlcmlhbCddCgkJCQkJCQkJLAoJCQkJCQkJCSk7CgkJCQkJCQl9IC8vIGVuZCAkZm91bmRfdW5maW5pc2hlZCA9PT0gdHJ1ZS4KCgkJCQkJCX0gLy8gZW5kIGlmLgoKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJLyoqKioqIEVORCBMT09LSU5HIEZPUiBVTkZJTklTSEVEIFJFQ0VOVCBCQUNLVVBTICoqKioqLwoKCQkvKioqKiogQkVHSU4gTE9PS0lORyBGT1IgQkFDS1VQIEZJTEVTIElOIFNJVEUgUk9PVCAqKioqKi8KCQkkZmlsZXMgPSBnbG9iKCBBQlNQQVRIIC4gJ2JhY2t1cC0qLnppcCcgKTsKCQlpZiAoICFpc19hcnJheSggJGZpbGVzICkgfHwgZW1wdHkoICRmaWxlcyApICkgewoJCQkkZmlsZXMgPSBhcnJheSgpOwoJCX0KCQlmb3JlYWNoKCAkZmlsZXMgYXMgJiRmaWxlICkgewoJCQkkZmlsZSA9IGJhc2VuYW1lKCAkZmlsZSApOwoJCX0KCQlpZiAoIGNvdW50KCAkZmlsZXMgKSA+IDAgKSB7CgkJCSRmaWxlc19zdHJpbmcgPSBpbXBsb2RlKCAnLCAnLCAkZmlsZXMgKTsKCQkJJHRlc3RzW10gPSBhcnJheSgKCQkJCSd0ZXN0JwkJPT4JJ3Jvb3RfYmFja3Vwcy0nIC4gJGZpbGVzX3N0cmluZywKCQkJCSdzdWNjZXNzJwk9PglmYWxzZSwKCQkJCSdtZXNzYWdlJwk9PgknT25lIG9yIG1vcmUgYmFja3VwIGZpbGVzLCBgJyAuICRmaWxlc19zdHJpbmcgLiAnYCB3YXMgZm91bmQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc2l0ZS4gVGhpcyBtYXkgYmUgbGVmdG92ZXIgZnJvbSBhIHJlY2VudCByZXN0b3JlLiBZb3Ugc2hvdWxkIHVzdWFsbHkgcmVtb3ZlIGJhY2t1cCBmaWxlcyBmcm9tIHRoZSBzaXRlIHJvb3QgZm9yIHNlY3VyaXR5LicsCgkJCSk7CgkJfQoJCS8qKioqKiBFTkQgTE9PS0lORyBGT1IgQkFDS1VQIEZJTEVTIElOIFNJVEUgUk9PVCAqKioqKi8KCgkJcmV0dXJuICR0ZXN0czsKCgl9IC8vIEVuZCBwcmVmbGlnaHRfY2hlY2soKS4KCgoKCS8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KCS8qCWxvb3BiYWNrX3Rlc3QoKQoJICoJCgkgKglDb25uZWN0cyBiYWNrIHRvIHNhbWUgc2l0ZSB2aWEgQUpBWCBjYWxsIHRvIGFuIEFKQVggc2x1ZyB0aGF0IGhhcyBOT1QgYmVlbiByZWdpc3RlcmVkLgoJICoJV29yZFByZXNzIEFKQVggcmV0dXJucyBhIC0xIChvciAwIGluIG5ld2VyIHZlcnNpb24/KSBmb3IgdGhlc2UuIEFsc28gbm90IGxvZ2dlZCBpbnRvCgkgKglhZG1pbiB3aGVuIGNvbm5lY3RpbmcgYmFjay4gQ2hlY2tzIHRvIHNlZSBpZiBib2R5IGNvbnRhaW5zIC0xIC8gMC4gSWYgbG9vcGJhY2tzIGFyZSBub3QKCSAqCWVuYWJsZWQgdGhlbiB3aWxsIGZhaWwgY29ubmVjdGluZyBvciBkbyBzb21ldGhpbmcgZWxzZS4KCSAqCQoJICoJCgkgKglAcGFyYW0JCQoJICoJQHJldHVybgkJYm9vbGVhbgkJVHJ1ZSBvbiBzdWNjZXNzLCBzdHJpbmcgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9vcGJhY2tfdGVzdCgpIHsKCQkkbG9vcGJhY2tfdXJsID0gYWRtaW5fdXJsKCdhZG1pbi1hamF4LnBocCcpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1Rlc3RpbmcgbG9vcGJhY2sgY29ubmVjdGlvbnMgYnkgY29ubmVjdGluZyBiYWNrIHRvIHNpdGUgYXQgdGhlIFVSTDogYCcgLiAkbG9vcGJhY2tfdXJsIC4gJ2AuIEl0IHNob3VsZCBkaXNwbGF5IHNpbXBseSAiMCIgb3IgIi0xIiBpbiB0aGUgYm9keS4nICk7CgoJCSRyZXNwb25zZSA9IHdwX3JlbW90ZV9nZXQoCgkJCSRsb29wYmFja191cmwsCgkJCWFycmF5KAoJCQkJJ21ldGhvZCcgPT4gJ0dFVCcsCgkJCQkndGltZW91dCcgPT4gOCwgLy8gWCBzZWNvbmQgZGVsYXkuIEEgbG9vcGJhY2sgc2hvdWxkIGJlIHZlcnkgZmFzdC4KCQkJCSdyZWRpcmVjdGlvbicgPT4gNSwKCQkJCSdodHRwdmVyc2lvbicgPT4gJzEuMCcsCgkJCQknYmxvY2tpbmcnID0+IHRydWUsCgkJCQknaGVhZGVycycgPT4gYXJyYXkoKSwKCQkJCSdib2R5JyA9PiBudWxsLAoJCQkJJ2Nvb2tpZXMnID0+IGFycmF5KCkKCQkJKQoJCSk7CgoJCWlmKCBpc193cF9lcnJvciggJHJlc3BvbnNlICkgKSB7IC8vIExvb3BiYWNrIGZhaWxlZC4gU29tZSBraW5kIG9mIGVycm9yLgoJCQkkZXJyb3IgPSAkcmVzcG9uc2UtPmdldF9lcnJvcl9tZXNzYWdlKCk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdMb29wYmFjayB0ZXN0IGVycm9yOiBgJyAuICRlcnJvciAuICdgLiBVUkw6IGAnIC4gJGxvb3BiYWNrX3VybCAuICdgLicgKTsKCQkJcmV0dXJuICdFcnJvcjogJyAuICRlcnJvcjsKCQl9IGVsc2UgewoJCQlpZiAoICggJHJlc3BvbnNlWydib2R5J10gPT0gJy0xJyApIHx8ICggJHJlc3BvbnNlWydib2R5J10gPT0gJzAnICkgKSB7IC8vIExvb3BiYWNrIHN1Y2NlZWRlZC4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0hUVFAgTG9vcGJhY2sgdGVzdCBzdWNjZXNzLiBSZXR1cm5lZCBgJyAuICRyZXNwb25zZVsnYm9keSddIC4gJ2AuJyApOwoJCQkJcmV0dXJuIHRydWU7CgkJCX0gZWxzZSB7IC8vIExvb3BiYWNrIGZhaWxlZC4KCQkJCSRlcnJvciA9ICdDb25uZWN0ZWQgdG8gc2VydmVyIGJ1dCB1bmV4cGVjdGVkIG91dHB1dDogJyAuIGh0bWxlbnRpdGllcyggJHJlc3BvbnNlWydib2R5J10gKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQkJcmV0dXJuICRlcnJvcjsKCQkJfQoJCX0KCX0gLy8gRW5kIGxvb3BiYWNrX3Rlc3QoKS4KCgoKCS8qIGdldF93b3JkcHJlc3NfbG9jYXRpb25zKCkKCSAqCgkgKiBHZXQgYW4gYXJyYXkgb2Ygc3ViZGlyZWN0b3JpZXMgd2hlcmUgcG90ZW50aWFsIFdvcmRQcmVzcyBpbnN0YWxsYXRpb25zIGhhdmUgYmVlbiBkZXRlY3RlZC4KCSAqCgkgKiBAcmV0dXJuCWFycmF5CUFycmF5IG9mIGZ1bGwgcGF0aHMsIFdJVEhPVVQgdHJhaWxpbmcgc2xhc2hlcy4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X3dvcmRwcmVzc19sb2NhdGlvbnMoKSB7CgkJJHdvcmRwcmVzc19sb2NhdGlvbnMgPSBhcnJheSgpOwoKCQkkZmlsZXMgPSBnbG9iKCBBQlNQQVRIIC4gJyovJyApOwoJCWlmICggIWlzX2FycmF5KCAkZmlsZXMgKSB8fCBlbXB0eSggJGZpbGVzICkgKSB7CgkJCSRmaWxlcyA9IGFycmF5KCk7CgkJfQoKCQlmb3JlYWNoKCAkZmlsZXMgYXMgJGZpbGUgKSB7CgkJCWlmICggZmlsZV9leGlzdHMoICRmaWxlIC4gJ3dwLWNvbmZpZy5waHAnICkgKSB7CgkJCQkkd29yZHByZXNzX2xvY2F0aW9uc1tdICA9IHJ0cmltKCAnLycgLiBzdHJfcmVwbGFjZSggQUJTUEFUSCwgJycsICRmaWxlICksICcvXFwnICk7CgkJCX0KCQl9CgoJCS8vIFJlbW92ZSBhbnkgZXhjbHVkZWQgZGlyZWN0b3JpZXMgZnJvbSBzaG93aW5nIHVwIGluIHRoaXMuCgkJJGRpcmVjdG9yeV9leGNsdXNpb25zID0gc2VsZjo6Z2V0X2RpcmVjdG9yeV9leGNsdXNpb25zKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Byb2ZpbGVzJ11bMF0gKTsgLy8gZGVmYXVsdCBwcm9maWxlLgoJCSR3b3JkcHJlc3NfbG9jYXRpb25zID0gYXJyYXlfZGlmZiggJHdvcmRwcmVzc19sb2NhdGlvbnMsICRkaXJlY3RvcnlfZXhjbHVzaW9ucyApOwoKCQlyZXR1cm4gJHdvcmRwcmVzc19sb2NhdGlvbnM7Cgl9IC8vIEVuZCBnZXRfd29yZHByZXNzX2xvY2F0aW9ucygpLgoKCgoJLyogcGVyaW9kaWNfY2xlYW51cCgpCgkgKgoJICogUGVyaW9kaWMgaG91c2VrZWVwaW5nIGNsZWFudXAgZnVuY3Rpb24gdG8gY2xlYW4gdXAgYWZ0ZXIgQmFja3VwQnVkZHkuIENsZWFuIHVwIG9ycGhhbmVkIGZpbGVzLCBkYXRhIHN0cnVjdHVyZSwKCSAqIG9sZCBsb2cgZmlsZXMsIGV0Yy4gQWxzbyB2ZXJpZmllcyBhbnRpLWRpcmVjdG9yeSBicm93c2luZyBmaWxlcyBleGlzdCBpbiBleHBlY3RlZCBsb2NhdGlvbnMgYW5kIGFueSBwb3RlbnRpYWwKCSAqIHByb2JsZW1zIGFyZSBoYW5kbGVkLgoJICoKCSAqIEBwYXJhbQlpbnQJCSRiYWNrdXBfYWdlX2xpbWl0CQlNYXhpbXVtIGFnZSAoaW4gc2Vjb25kcykgdG8gYWxsb3cgbG9ncyBvciBvdGhlciB0cmFuc2llbnQgZmlsZXMvc3RydWN0dXJlcyB0byBleGlzdCBhZnRlciBubyBsb25nZXIgbmVlZGVkLiBEZWZhdWx0OiAxNzI4MDAgKDQ4IGhvdXJzKS4KCSAqIEBwYXJhbQlib29sCSRkaWVfb25fZmFpbAkJCVdoZXRoZXIgb3Igbm90IHRvIGRpZSBmYXRhbGx5IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIChzdWNoIGFzIHVuYWJsZSB0byBtYWtlIGFudGktZGlyZWN0b3J5IGJyb3dzaW5nIGZpbGVzKS4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGVyaW9kaWNfY2xlYW51cCggJGJhY2t1cF9hZ2VfbGltaXQgPSAxNzI4MDAsICRkaWVfb25fZmFpbCA9IHRydWUgKSB7CgoJCWluY2x1ZGUoICdfcGVyaW9kaWNDbGVhbnVwLnBocCcgKTsKCgl9IC8vIEVuZCBwZXJpb2RpY19jbGVhbnVwKCkuCgoKCgkvKiBmaW5hbF9jbGVhbnVwKCkKCSAqCgkgKiBGaW5hbCBjbGVhbnVwIHNjaGVkdWxlZCBieSBlYWNoIGJhY2t1cCBmb3IgY2xlYW5pbmcgdXAgaW4gdGhlIGZ1dHVyZS4gSGVscHMgY2F0Y2ggZmFpbGVkIGJhY2t1cHMuCgkgKgoJICogQHBhcmFtCXN0cmluZwkkc2VyaWFsCQlVbmlxdWUgYmFja3VwIHNlcmlhbCB3aGljaCB3ZSB3aWxsIGJlIGNsZWFuaW5nIHVwIGZvci4KCSAqIEByZXR1cm4JbnVsbAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaW5hbF9jbGVhbnVwKCAkc2VyaWFsICkgewoKCQlpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkKCk7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ2Nyb25fZmluYWxfY2xlYW51cCBzdGFydGVkJyApOwoKCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2ZpbGVvcHRpb25zLnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMzEuJyApOwoJCSRiYWNrdXBfb3B0aW9ucyA9IG5ldyBwYl9iYWNrdXBidWRkeV9maWxlb3B0aW9ucyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuICRzZXJpYWwgLiAnLnR4dCcsICRyZWFkX29ubHkgPSB0cnVlICk7CgkJaWYgKCB0cnVlICE9PSAoICRyZXN1bHQgPSAkYmFja3VwX29wdGlvbnMtPmlzX29rKCkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBvcGVuIGZpbGVvcHRpb25zIGZpbGUuJyApOwoJCX0KCgkJLy8gRGVsZXRlIHRlbXBvcmFyeSBkYXRhIGRpcmVjdG9yeS4KCQlpZiAoIGlzc2V0KCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ3RlbXBfZGlyZWN0b3J5J10gKSAmJiBmaWxlX2V4aXN0cyggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWyd0ZW1wX2RpcmVjdG9yeSddICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+dW5saW5rX3JlY3Vyc2l2ZSggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWyd0ZW1wX2RpcmVjdG9yeSddICk7CgkJfQoKCQkvLyBEZWxldGUgdGVtcG9yYXJ5IHppcCBkaXJlY3RvcnkuCgkJaWYgKCBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWyd0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSddICkgJiYgZmlsZV9leGlzdHMoICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1sndGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnknXSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPnVubGlua19yZWN1cnNpdmUoICRiYWNrdXBfb3B0aW9ucy0+b3B0aW9uc1sndGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnknXSApOwoJCX0KCgkJLy8gRGVsZXRlIHN0YXR1cyBsb2cgdGV4dCBmaWxlLgoJCWlmICggZmlsZV9leGlzdHMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJ3RlbXBfc3RhdHVzXycgLiAkc2VyaWFsIC4gJy50eHQnICkgKSB7CgkJCXVubGluayggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgLiAndGVtcF9zdGF0dXNfJyAuICRzZXJpYWwuICcudHh0JyApOwoJCX0KCgl9IC8vIEVuZCBmaW5hbF9jbGVhbnVwKCkuCgoKCgkvKgl0cmltX3JlbW90ZV9zZW5kX3N0YXRzKCkKCSAqCQoJICoJSGFuZGxlcyB0cmltbWluZyB0aGUgbnVtYmVyIG9mIHJlbW90ZSBzZW5kcyB0byB0aGUgbW9zdCByZWNlbnQgb25lcy4KCSAqCVJlY2VudCB0cmFuc2ZlciBsb2dzIGFyZSBrZXB0IGZvciBUUklQTEUgdGhlIG1heCBhZ2UgYXMgdGhleSBhcmUgaW1wb3J0YW50IGZvciB0cm91Ymxlc2hvb3RpbmcuCgkgKgkKCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmltX3JlbW90ZV9zZW5kX3N0YXRzKCkgewoKCQkkbGltaXQgPSAoaW50KXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbWF4X3NlbmRfc3RhdHNfY291bnQnXTsgLy8gTWF4aW11bSBudW1iZXIgb2YgcmVtb3RlIHNlbmRzIHRvIGtlZXAgdHJhY2sgb2YuCgkJJG1heF9hZ2UgPSAoaW50KXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbWF4X3NlbmRfc3RhdHNfZGF5cyddICogNjAgKiA2MCAqIDI0OwoKCQkkc2VuZF9maWxlb3B0aW9ucyA9IHBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+Z2xvYl9ieV9kYXRlKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdmaWxlb3B0aW9ucy9zZW5kLSoudHh0JyApOwoJCWlmICggISBpc19hcnJheSggJHNlbmRfZmlsZW9wdGlvbnMgKSApIHsKCQkJJHNlbmRfZmlsZW9wdGlvbnMgPSBhcnJheSgpOwoJCX0KCQkvLyBSZXR1cm4gaWYgbGltaXQgbm90IHlldCBtZXQuCgkJaWYgKCBjb3VudCggJHNlbmRfZmlsZW9wdGlvbnMgKSA8PSAkbGltaXQgKSB7CgkJCXJldHVybjsKCQl9CgoJCSRpID0gMDsKCQlmb3JlYWNoKCAkc2VuZF9maWxlb3B0aW9ucyBhcyAkc2VuZF9maWxlb3B0aW9uICkgewoJCQkkaSsrOwoJCQlpZiAoICRpID4gJGxpbWl0ICkgewoJCQkJJG1vZGlmaWVkID0gZmlsZW10aW1lKCAkc2VuZF9maWxlb3B0aW9uICk7CgkJCQlpZiAoICggdGltZSgpIC0gJG1vZGlmaWVkICkgPiAkbWF4X2FnZSApIHsKCQkJCQlpZiAoIGZhbHNlID09PSBAdW5saW5rKCAkc2VuZF9maWxlb3B0aW9uICkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gZGVsZXRlIG9sZCByZW1vdGUgc2VuZCBsb2cgZmlsZSBgJyAuICRzZW5kX2ZpbGVvcHRpb24gLiAnYC4gWW91IG1heSBtYW51YWxseSBkZWxldGUgaXQuIENoZWNrIGRpcmVjdG9yeSBwZXJtaXNzaW9ucyBmb3IgZnV0dXJlIGNsZWFudXAuJyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuOwoKCX0gLy8gRW5kIHRyaW1fcmVtb3RlX3NlbmRfc3RhdHMoKS4KCgoKCS8qCWdldF9zaXRlX3NpemUoKQoJICoJCgkgKglSZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIHNpdGUgc2l6ZSBhbmQgdGhlIHNpdGUgc2l6ZSBzYW5zIGV4Y2x1c2lvbnMuIFNhdmVzIHVwZGF0ZXMgc3RhdHMgaW4gb3B0aW9ucy4KCSAqCQoJICoJQHJldHVybgkJYXJyYXkJCUluZGV4IDA6IHNpdGUgc2l6ZTsgSW5kZXggMTogc2l0ZSBzaXplIHNhbnMgZXhjbHVkZWQgZmlsZXMvZGlycy47IEluZGV4IDI6IFRvdGFsIG51bWJlciBvZiBvYmplY3RzIChmaWxlcytmb2xkZXJzKTsgSW5kZXggMzogVG90YWwgb2JqZWN0cyBzYW5zIGV4Y2x1ZGVkIGZpbGVzL2ZvbGRlcnMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X3NpdGVfc2l6ZSgpIHsKCQkkZXhjbHVzaW9ucyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9kaXJlY3RvcnlfZXhjbHVzaW9ucyggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWzBdICk7CgkJJGRpcl9hcnJheSA9IGFycmF5KCk7CgkJJHJlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+ZGlyX3NpemVfbWFwKCBBQlNQQVRILCBBQlNQQVRILCAkZXhjbHVzaW9ucywgJGRpcl9hcnJheSApOwoJCXVuc2V0KCAkZGlyX2FycmF5ICk7IC8vIEZyZWUgdGhpcyBsYXJnZSBjaHVuayBvZiBtZW1vcnkuCgoJCSR0b3RhbF9zaXplID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX3NpemUnXSA9ICRyZXN1bHRbMF07CgkJJHRvdGFsX3NpemVfZXhjbHVkZWQgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfc2l6ZV9leGNsdWRlZCddID0gJHJlc3VsdFsxXTsKCQkkdG90YWxfb2JqZWN0cyA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzJ10gPSAkcmVzdWx0WzJdOwoJCSR0b3RhbF9vYmplY3RzX2V4Y2x1ZGVkID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX29iamVjdHNfZXhjbHVkZWQnXSA9ICRyZXN1bHRbM107CgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX3NpemVfdXBkYXRlZCddID0gdGltZSgpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgoJCXJldHVybiBhcnJheSggJHRvdGFsX3NpemUsICR0b3RhbF9zaXplX2V4Y2x1ZGVkLCAkdG90YWxfb2JqZWN0cywgJHRvdGFsX29iamVjdHNfZXhjbHVkZWQgKTsKCX0gLy8gRW5kIGdldF9zaXRlX3NpemUoKS4KCgoKCS8qCWdldF9kYXRhYmFzZV9zaXplKCkKCSAqCQoJICoJUmV0dXJuIGFycmF5IG9mIGRhdGFiYXNlIHNpemUsIGRhdGFiYXNlIHNhbnMgZXhjbHVzaW9ucy4KCSAqCQoJICoJQHJldHVybgkJYXJyYXkJCQlJbmRleCAwOiBkYiBzaXplLCBJbmRleCAxOiBkYiBzaXplIHNhbnMgZXhjbHVzaW9ucy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfZGF0YWJhc2Vfc2l6ZSggJHByb2ZpbGVfaWQgPSAwICkgewoJCWdsb2JhbCAkd3BkYjsKCQkkcHJlZml4ID0gJHdwZGItPnByZWZpeDsKCQkkcHJlZml4X2xlbmd0aCA9IHN0cmxlbiggJHdwZGItPnByZWZpeCApOwoKCQkkYWRkaXRpb25hbF9pbmNsdWRlcyA9IGV4cGxvZGUoICJcbiIsIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVskcHJvZmlsZV9pZF1bJ215c3FsZHVtcF9hZGRpdGlvbmFsX2luY2x1ZGVzJ10gKTsKCQlhcnJheV93YWxrKCAkYWRkaXRpb25hbF9pbmNsdWRlcywgY3JlYXRlX2Z1bmN0aW9uKCcmJHZhbCcsICckdmFsID0gdHJpbSgkdmFsKTsnKSk7CgkJJGFkZGl0aW9uYWxfZXhjbHVkZXMgPSBleHBsb2RlKCAiXG4iLCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Byb2ZpbGVzJ11bJHByb2ZpbGVfaWRdWydteXNxbGR1bXBfYWRkaXRpb25hbF9leGNsdWRlcyddICk7CgkJYXJyYXlfd2FsayggJGFkZGl0aW9uYWxfZXhjbHVkZXMsIGNyZWF0ZV9mdW5jdGlvbignJiR2YWwnLCAnJHZhbCA9IHRyaW0oJHZhbCk7JykpOwoKCQkkdG90YWxfc2l6ZSA9IDA7CgkJJHRvdGFsX3NpemVfd2l0aF9leGNsdXNpb25zID0gMDsKCQkkcm93cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNIT1cgVEFCTEUgU1RBVFVTIiwgQVJSQVlfQSApOwoJCWZvcmVhY2goICRyb3dzIGFzICRyb3cgKSB7CgkJCSRleGNsdWRlZCA9IHRydWU7IC8vIERlZmF1bHQuCgoJCQkvLyBUQUJMRSBTVEFUVVMuCgkJCSRyb3dzYiA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIkNIRUNLIFRBQkxFIGB7JHJvd1snTmFtZSddfWAiLCBBUlJBWV9BICk7CgkJCWZvcmVhY2goICRyb3dzYiBhcyAkcm93YiApIHsKCQkJCWlmICggJHJvd2JbJ01zZ190eXBlJ10gPT0gJ3N0YXR1cycgKSB7CgkJCQkJJHN0YXR1cyA9ICRyb3diWydNc2dfdGV4dCddOwoJCQkJfQoJCQl9CgkJCXVuc2V0KCAkcm93c2IgKTsKCgkJCS8vIFRBQkxFIFNJWkUuCgkJCSRzaXplID0gKCAkcm93WydEYXRhX2xlbmd0aCddICsgJHJvd1snSW5kZXhfbGVuZ3RoJ10gKTsKCQkJJHRvdGFsX3NpemUgKz0gJHNpemU7CgoKCQkJLy8gSEFORExFIEVYQ0xVU0lPTlMuCgkJCWlmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWyRwcm9maWxlX2lkXVsnYmFja3VwX25vbndwX3RhYmxlcyddID09IDAgKSB7IC8vIE9ubHkgbWF0Y2hpbmcgcHJlZml4LgoJCQkJaWYgKCAoIHN1YnN0ciggJHJvd1snTmFtZSddLCAwLCAkcHJlZml4X2xlbmd0aCApID09ICRwcmVmaXggKSBPUiAoIGluX2FycmF5KCAkcm93WydOYW1lJ10sICRhZGRpdGlvbmFsX2luY2x1ZGVzICkgKSApIHsKCQkJCQlpZiAoICFpbl9hcnJheSggJHJvd1snTmFtZSddLCAkYWRkaXRpb25hbF9leGNsdWRlcyApICkgewoJCQkJCQkkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKz0gJHNpemU7CgkJCQkJCSRleGNsdWRlZCA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsgLy8gQWxsIHRhYmxlcy4KCQkJCWlmICggIWluX2FycmF5KCAkcm93WydOYW1lJ10sICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICkgKSB7CgkJCQkJJHRvdGFsX3NpemVfd2l0aF9leGNsdXNpb25zICs9ICRzaXplOwoJCQkJCSRleGNsdWRlZCA9IGZhbHNlOwoJCQkJfQoJCQl9CgoJCX0KCgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydkYl9zaXplJ10gPSAkdG90YWxfc2l6ZTsKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ2RiX3NpemVfZXhjbHVkZWQnXSA9ICR0b3RhbF9zaXplX3dpdGhfZXhjbHVzaW9uczsKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ2RiX3NpemVfdXBkYXRlZCddID0gdGltZSgpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgoJCXVuc2V0KCAkcm93cyApOwoKCQlyZXR1cm4gYXJyYXkoICR0b3RhbF9zaXplLCAkdG90YWxfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgKTsKCX0gLy8gRW5kIGdldF9kYXRhYmFzZV9zaXplKCkuCgoKCgkvKiBraWNrX2RiKCkKCSAqCgkgKiBBdHRlbXB0IHRvIHZlcmlmeSB0aGUgZGF0YWJhc2Ugc2VydmVyIGlzIHN0aWxsIGFsaXZlIGFuZCBmdW5jdGlvbmluZy4gIElmIG5vdCwgdHJ5IHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBraWNrX2RiKCkgewoKCQkka2lja19kYiA9IHRydWU7IC8vIENoYW5nZSB0cnVlIHRvIGZhbHNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgdG8gZGlzYWJsZSBraWNrZXIuCgoJCS8vIE5lZWQgdG8gbWFrZSBzdXJlIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFjdGl2ZS4gU29tZXRpbWVzIGl0IGdvZXMgYXdheSBkdXJpbmcgbG9uZyBib3V0cyBkb2luZyBvdGhlciB0aGluZ3MgLS0gc2lnaC4KCQkvLyBUaGlzIGlzIG5vdCBlc3NlbnRpYWwgc28gdXNlIGluY2x1ZGUgYW5kIG5vdCByZXF1aXJlIChzdXBwcmVzcyBhbnkgd2FybmluZykKCQlpZiAoICRraWNrX2RiID09PSB0cnVlICkgewoJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3dwZGJ1dGlscy93cGRidXRpbHMucGhwJyApOwoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ3BsdWdpbmJ1ZGR5X3dwZGJ1dGlscycgKSApIHsKCQkJCS8vIFRoaXMgaXMgdGhlIGRhdGFiYXNlIG9iamVjdCB3ZSB3YW50IHRvIHVzZQoJCQkJZ2xvYmFsICR3cGRiOwoKCQkJCS8vIEdldCBvdXIgaGVscGVyIG9iamVjdCBhbmQgbGV0IGl0IHVzZSB1cyB0byBvdXRwdXQgc3RhdHVzIG1lc3NhZ2VzCgkJCQkkZGJoZWxwZXIgPSBuZXcgcGx1Z2luYnVkZHlfd3BkYnV0aWxzKCAkd3BkYiApOwoKCQkJCS8vIElmIHdlIGNhbm5vdCBraWNrIHRoZSBkYXRhYmFzZSBpbnRvIGxpZmUgdGhlbiBzaWduYWwgdGhlIGVycm9yIGFuZCByZXR1cm4gZmFsc2Ugd2hpY2ggd2lsbCBzdG9wIHRoZSBiYWNrdXAKCQkJCS8vIE90aGVyd2lzZSBhbGwgaXMgb2sgYW5kIHdlIGNhbiBqdXN0IGZhbGwgdGhyb3VnaCBhbmQgbGV0IHRoZSBmdW5jdGlvbiByZXR1cm4gdHJ1ZQoJCQkJaWYgKCAhJGRiaGVscGVyLT5raWNrKCkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oJ0RhdGFiYXNlIFNlcnZlciBoYXMgZ29uZSBhd2F5LCB1bmFibGUgdG8gdXBkYXRlIHJlbW90ZSBkZXN0aW5hdGlvbiB0cmFuc2ZlciBzdGF0dXMuIFRoaXMgaXMgbW9zdCBvZnRlbiBjYXVzZWQgYnkgbXlzcWwgcnVubmluZyBvdXQgb2YgbWVtb3J5IG9yIHRpbWluZyBvdXQgZmFyIHRvbyBlYXJseS4gUGxlYXNlIGNvbnRhY3QgeW91ciBob3N0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyBVdGlscyBub3QgYXZhaWxhYmxlIHNvIGNhbm5vdCB2ZXJpZnkgZGF0YWJhc2UgY29ubmVjdGlvbiBzdGF0dXMgLSBqdXN0IG5vdGlmeQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRGF0YWJhc2UgU2VydmVyIGNvbm5lY3Rpb24gc3RhdHVzIHVudmVyaWZpZWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJfQoJCX0KCgl9IC8vIEVuZCBraWNrX2RiKCkuCgoKCgkvKiB2ZXJpZnlfZGlyZWN0b3JpZXMoKQoJICoKCSAqIFZlcmlmeSBleGlzdGFuY2UgYW5kIHNlY3VyaXR5IG9mIGtleSBkaXJlY3Rvcmllcy4gUmVzdWx0IGF2YWlsYWJsZSB2aWEgZ2xvYmFsICRwYl9iYWNrdXBidWRkeV9kaXJlY3RvcnlfdmVyaWZpY2F0aW9uIHdpdGggcmV0dXJuIHZhbHVlLgoJICoKCSAqIEByZXR1cm4JCWJvb2wJCXRydWUgb24gc3VjY2VzcyBjcmVhdGluZyAvIHZlcmlmeWluZywgZWxzZSBmYWxzZS4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmVyaWZ5X2RpcmVjdG9yaWVzKCAkc2tpcFRlbXBHZW5lcmF0aW9uID0gZmFsc2UgKSB7CgkJCgkJJHN1Y2Nlc3MgPSB0cnVlOwoKCQkvLyBVcGRhdGUgYmFja3VwIGRpcmVjdG9yeSBpZiB1bmFibGUgdG8gd3JpdGUgdG8gdGhlIGRlZmluZWQgb25lLgoJCWlmICggISBAaXNfd3JpdGFibGUoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0JhY2t1cCBkaXJlY3RvcnkgaW52YWxpZC4gVXBkYXRpbmcgZnJvbSBgJyAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJ2AgdG8gZGVmYXVsdC4nICk7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmFja3VwX2RpcmVjdG9yeSddID0gJyc7IC8vIFJlc2V0IHRvIGRlZmF1bHQgKGJsYW5rKS4KCQkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQl9CgkJJHJlc3BvbnNlID0gcGJfYmFja3VwYnVkZHk6OmFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSwgJGRpZSA9IGZhbHNlICk7CgkJaWYgKCBmYWxzZSA9PT0gJHJlc3BvbnNlICkgewoJCQkkc3VjY2VzcyA9IGZhbHNlOwoJCX0KCgkJLy8gVXBkYXRlIGxvZyBkaXJlY3RvcnkgaWYgdW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZWZpbmVkIG9uZS4KCQlpZiAoICEgQGlzX3dyaXRhYmxlKCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb2cgZGlyZWN0b3J5IGludmFsaWQuIFVwZGF0aW5nIGZyb20gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSAuICdgIHRvIGRlZmF1bHQuJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19kaXJlY3RvcnknXSA9ICcnOyAvLyBSZXNldCB0byBkZWZhdWx0IChibGFuaykuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCksICRkaWUgPSBmYWxzZSApOwoJCWlmICggZmFsc2UgPT09ICRyZXNwb25zZSApIHsKCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQl9CgoJCS8vIFVwZGF0ZSB0ZW1wIGRpcmVjdG9yeSBpZiB1bmFibGUgdG8gd3JpdGUgdG8gdGhlIGRlZmluZWQgb25lLgoJCWlmICggdHJ1ZSAhPT0gJHNraXBUZW1wR2VuZXJhdGlvbiApIHsKCQkJaWYgKCAhIEBpc193cml0YWJsZSggYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUZW1wb3JhcnkgZGlyZWN0b3J5IGludmFsaWQuIFVwZGF0aW5nIGZyb20gYCcgLiBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCkgLiAnYCB0byBkZWZhdWx0LicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sndGVtcF9kaXJlY3RvcnknXSA9ICcnOwoJCQkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6YW50aV9kaXJlY3RvcnlfYnJvd3NpbmcoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSwgJGRpZSA9IGZhbHNlICk7CgkJCWlmICggZmFsc2UgPT09ICRyZXNwb25zZSApIHsKCQkJCSRzdWNjZXNzID0gZmFsc2U7CgkJCX0KCQl9CgoJCWdsb2JhbCAkcGJfYmFja3VwYnVkZHlfZGlyZWN0b3J5X3ZlcmlmaWNhdGlvbjsKCQkkcGJfYmFja3VwYnVkZHlfZGlyZWN0b3J5X3ZlcmlmaWNhdGlvbiA9ICRzdWNjZXNzOwoJCXJldHVybiAkc3VjY2VzczsKCgl9IC8vIEVuZCB2ZXJpZnlfZGlyZWN0b3JpZXMoKS4KCgoKCS8qIHNjaGVkdWxlX3NpbmdsZV9ldmVudCgpCgkgKgoJICogQVBJIHRvIHdwX3NjaGVkdWxlX3NpbmdsZV9ldmVudCgpIHRoYXQgYWxzbyB2ZXJpZmllcyB0aGF0IHRoZSBzY2hlZHVsZSBhY3R1YWxseSBnb3QgY3JlYXRlZCBpbiBXb3JkUFJlc3MuCgkgKiBTb21ldGltZXMgdGhlIGRhdGFiYXNlIHJlamVjdHMgdGhpcyB1cGRhdGUgc28gd2UgbmVlZCB0byBkbyBhY3R1YWwgdmVyaWZpY2F0aW9uLgoJICoKCSAqIEByZXR1cm4JYm9vbGVhbgkJCVRydWUgb24gdmVyaWZpZWQgc2NoZWR1bGUgc3VjY2VzcywgZWxzZSBmYWxzZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzY2hlZHVsZV9zaW5nbGVfZXZlbnQoICR0aW1lLCAkdGFnLCAkYXJncyApIHsKCQkkc2NoZWR1bGVfcmVzdWx0ID0gd3Bfc2NoZWR1bGVfc2luZ2xlX2V2ZW50KCAkdGltZSwgJHRhZywgJGFyZ3MgKTsgLy8gU2NoZWR1bGUuCgkJJG5leHRfc2NoZWR1bGVkID0gd3BfbmV4dF9zY2hlZHVsZWQoICR0YWcsICRhcmdzICk7IC8vIFJldHJpZXZlIHNjaGVkdWxlIHRvIHZlcmlmeSBpdCBzdHVjay4KCQlpZiAoIEZBTFNFID09PSAkc2NoZWR1bGVfcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIGNyZWF0ZSBzY2hlZHVsZSBhcyB3cF9zY2hlZHVsZV9zaW5nbGVfZXZlbnQoKSByZXR1cm5lZCBmYWxzZS4gQSBwbHVnaW4gbWF5IGhhdmUgcHJldmVudGVkIGl0LicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAoIEZBTFNFID09PSAkbmV4dF9zY2hlZHVsZWQgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdXb3JkUHJlc3MgcmVwb3J0ZWQgc3VjY2VzcyBzY2hlZHVsaW5nIEJVVCB3cF9uZXh0X3NjaGVkdWxlZCgpIGNvdWxkIE5PVCBjb25maXJtIHNjaGVkdWxlIGV4aXN0YW5jZS4gVGhlIGRhdGFiYXNlIG1heSBoYXZlIHJlamVjdGVkIHRoZSB1cGRhdGUuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHNjaGVkdWxlX3NpbmdsZV9ldmVudCgpLgoKCgoJLyogc2NoZWR1bGVfZXZlbnQoKQoJICoKCSAqIEFQSSB0byB3cF9zY2hlZHVsZV9ldmVudCgpIHRoYXQgYWxzbyB2ZXJpZmllcyB0aGF0IHRoZSBzY2hlZHVsZSBhY3R1YWxseSBnb3QgY3JlYXRlZCBpbiBXb3JkUFJlc3MuCgkgKiBTb21ldGltZXMgdGhlIGRhdGFiYXNlIHJlamVjdHMgdGhpcyB1cGRhdGUgc28gd2UgbmVlZCB0byBkbyBhY3R1YWwgdmVyaWZpY2F0aW9uLgoJICoKCSAqIEByZXR1cm4JYm9vbGVhbgkJCVRydWUgb24gdmVyaWZpZWQgc2NoZWR1bGUgc3VjY2VzcywgZWxzZSBmYWxzZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzY2hlZHVsZV9ldmVudCggJHRpbWUsICRwZXJpb2QsICR0YWcsICRhcmdzICkgewoJCSRzY2hlZHVsZV9yZXN1bHQgPSB3cF9zY2hlZHVsZV9ldmVudCggJHRpbWUsICRwZXJpb2QsICR0YWcsICRhcmdzICk7CgkJJG5leHRfc2NoZWR1bGVkID0gd3BfbmV4dF9zY2hlZHVsZWQoICR0YWcsICRhcmdzICk7CgkJaWYgKCBGQUxTRSA9PT0gJHNjaGVkdWxlX3Jlc3VsdCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBjcmVhdGUgc2NoZWR1bGUgYXMgd3Bfc2NoZWR1bGVfZXZlbnQoKSByZXR1cm5lZCBmYWxzZS4gQSBwbHVnaW4gbWF5IGhhdmUgcHJldmVudGVkIGl0LicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAoIEZBTFNFID09PSAkbmV4dF9zY2hlZHVsZWQgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdXb3JkUHJlc3MgcmVwb3J0ZWQgc3VjY2VzcyBzY2hlZHVsaW5nIEJVVCB3cF9uZXh0X3NjaGVkdWxlZCgpIGNvdWxkIE5PVCBjb25maXJtIHNjaGVkdWxlIGV4aXN0YW5jZS4gVGhlIGRhdGFiYXNlIG1heSBoYXZlIHJlamVjdGVkIHRoZSB1cGRhdGUuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHNjaGVkdWxlX2V2ZW50KCkuCgoKCgkvKiB1bnNjaGVkdWxlX2V2ZW50KCkKCSAqCgkgKiBBUEkgdG8gd3BfdW5zY2hlZHVsZV9ldmVudCgpIHRoYXQgYWxzbyB2ZXJpZmllcyB0aGF0IHRoZSBzY2hlZHVsZSBhY3R1YWxseSBnb3QgcmVtb3ZlZCBXb3JkUFJlc3MuCgkgKiBTb21ldGltZXMgdGhlIGRhdGFiYXNlIHJlamVjdHMgdGhpcyB1cGRhdGUgc28gd2UgbmVlZCB0byBkbyBhY3R1YWwgdmVyaWZpY2F0aW9uLgoJICoKCSAqIEByZXR1cm4JYm9vbGVhbgkJCVRydWUgb24gdmVyaWZpZWQgc2NoZWR1bGUgZGVsZXRpb24gc3VjY2VzcywgZWxzZSBmYWxzZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1bnNjaGVkdWxlX2V2ZW50KCAkdGltZSwgJHRhZywgJGFyZ3MgKSB7CgkJJHVuc2NoZWR1bGVfcmVzdWx0ID0gd3BfdW5zY2hlZHVsZV9ldmVudCggJHRpbWUsICR0YWcsICRhcmdzICk7CgkJJG5leHRfc2NoZWR1bGVkID0gd3BfbmV4dF9zY2hlZHVsZWQoICR0YWcsICRhcmdzICk7CgkJaWYgKCBGQUxTRSA9PT0gJHVuc2NoZWR1bGVfcmVzdWx0ICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVW5hYmxlIHRvIHJlbW92ZSBzY2hlZHVsZSBhcyB3cF91bnNjaGVkdWxlX2V2ZW50KCkgcmV0dXJuZWQgZmFsc2UuIEEgcGx1Z2luIG1heSBoYXZlIHByZXZlbnRlZCBpdC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaWYgKCBGQUxTRSAhPT0gJG5leHRfc2NoZWR1bGVkICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnV29yZFByZXNzIHJlcG9ydGVkIHN1Y2Nlc3MgdW5zY2hlZHVsaW5nIEJVVCB3cF9uZXh0X3NjaGVkdWxlZCgpIGNvbmZpcm1lZCBzY2hlZHVsZSBleGlzdGFuY2UuIFRoZSBkYXRhYmFzZSBtYXkgaGF2ZSByZWplY3RlZCB0aGUgcmVtb3ZhbC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgdW5zY2hlZHVsZV9ldmVudCgpLgoKCgoJLyogbm9ybWFsaXplX2NvbW1lbnRfZGF0YSgpCgkgKgoJICogSGFuZGxlIG5vcm1hbGl6aW5nIHppcCBjb21tZW50IGRhdGEsIGRlZmF1bHRzLCBldGMuCgkgKgoJICogQHBhcmFtCWFycmF5CSRjb21tZW50CUFycmF5IG9mIG1ldGEgZGF0YSB0byBub3JtYWxpemUgJiBhcHBseSBkZWZhdWx0cyB0by4KCSAqIEByZXR1cm4JYXJyYXkJCQkJTm9ybWFsaXplZCBhcnJheS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVfY29tbWVudF9kYXRhKCAkY29tbWVudCApIHsKCgkJJGRlZmF1bHRzID0gYXJyYXkoCgkJCSdzZXJpYWwnCQk9PgknJywKCQkJJ3NpdGV1cmwnCQk9PgknJywKCQkJJ3R5cGUnCQkJPT4JJycsCgkJCSdwcm9maWxlJwkJPT4JJycsCgkJCSdjcmVhdGVkJwkJPT4JJycsCgkJCSdkYl9wcmVmaXgnCQk9PgknJywKCQkJJ2JiX3ZlcnNpb24nCT0+CScnLAoJCQknd3BfdmVyc2lvbicJPT4JJycsCgkJCSdwb3N0cycJCQk9PgknJywKCQkJJ3BhZ2VzJwkJCT0+CScnLAoJCQknY29tbWVudHMnCQk9PgknJywKCQkJJ3VzZXJzJwkJCT0+CScnLAoJCQknZGF0X3BhdGgnCQk9PgknJywKCQkJJ25vdGUnCQkJPT4JJycsCgkJKTsKCgkJaWYgKCAhIGlzX2FycmF5KCAkY29tbWVudCApICkgeyAvLyBQbGFpbiB0ZXh0OyBwbGFjZSBpbiBub3RlIGZpZWxkLgoJCQlpZiAoIGlzX3N0cmluZyggJGNvbW1lbnQgKSApIHsKCQkJCSRkZWZhdWx0c1snbm90ZSddID0gJGNvbW1lbnQ7CgkJCX0KCQkJcmV0dXJuICRkZWZhdWx0czsKCQl9IGVsc2UgeyAvLyBBcnJheS4gTWVyZ2UgZGVmYXVsdHMgYW5kIHJldHVybi4KCQkJcmV0dXJuIGFycmF5X21lcmdlKCAkZGVmYXVsdHMsICRjb21tZW50ICk7CgkJfQoKCX0gLy8gRW5kIG5vcm1hbGl6ZV9jb21tZW50X2RhdGEoKS4KCQoJCgkKCS8qIGNsZWFuVGVtcERpcigpCgkgKgoJICogQ2xlYW5zIG91dCBhbnkgb2xkIHRlbXAgZmlsZXMuIENhbGxlZCBieSBwZXJpb2RpYyBjbGVhbnVwIGZ1bmN0aW9uIGFuZCBwb3N0X2JhY2t1cCBpbiBiYWNrdXAucGhwLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbGVhblRlbXBEaXIoICRiYWNrdXBfYWdlX2xpbWl0ID0gMTcyODAwICkgewoJCS8vIFJlbW92ZSBhbnkgb2xkIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiB3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8uIExvZ3MgYW55IGRpcmVjdG9yaWVzIGl0IGNhbm5vdCBkZWxldGUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2xlYW5pbmcgdXAgYW55IG9sZCB0ZW1wb3JhcnkgemlwIGRpcmVjdG9yaWVzIGluOiB3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8uIElmIG5vIHJlY2VudCBiYWNrdXBzIHRoZW4gdGhlIHRlbXAgZGlyZWN0b3J5IHdpbGwgYWxzbyBiZSBwdXJnZWQuJyApOwoJCSRyZWNlbnRCYWNrdXBGb3VuZCA9IGZhbHNlOwoJCSR0ZW1wX2RpcmVjdG9yeSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKTsKCQkkZmlsZXMgPSBnbG9iKCAkdGVtcF9kaXJlY3RvcnkgLiAnKicgKTsKCQlpZiAoIGlzX2FycmF5KCAkZmlsZXMgKSAmJiAhZW1wdHkoICRmaWxlcyApICkgeyAvLyBGb3Igcm9idXN0bmVzcy4gV2l0aG91dCBvcGVuX2Jhc2VkaXIgdGhlIGdsb2IoKSBmdW5jdGlvbiByZXR1cm5zIGFuIGVtcHR5IGFycmF5IGZvciBubyBtYXRjaC4gV2l0aCBvcGVuX2Jhc2VkaXIgaW4gZWZmZWN0IHRoZSBnbG9iKCkgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gZmFsc2UgZm9yIG5vIG1hdGNoLgoJCQlmb3JlYWNoKCAkZmlsZXMgYXMgJGZpbGUgKSB7CgkJCQlpZiAoICggc3RycG9zKCAkZmlsZSwgJ2luZGV4LicgKSAhPT0gZmFsc2UgKSB8fCAoIHN0cnBvcyggJGZpbGUsICcuaHRhY2Nlc3MnICkgIT09IGZhbHNlICkgKSB7IC8vIEluZGV4IGZpbGUgb3IgaHRhY2Nlc3MgZG9udCBnZXQgZGVsZXRlZCBzbyBnbyB0byBuZXh0IGZpbGUuCgkJCQkJY29udGludWU7CgkJCQl9CgkJCQkkZmlsZV9zdGF0cyA9IHN0YXQoICRmaWxlICk7CgkJCQlpZiAoICggMCA9PSAkYmFja3VwX2FnZV9saW1pdCApIHx8ICggKCB0aW1lKCkgLSAkZmlsZV9zdGF0c1snbXRpbWUnXSApID4gJGJhY2t1cF9hZ2VfbGltaXQgKSApIHsgLy8gSWYgb2xkZXIgdGhhbiAxMiBob3VycywgZGVsZXRlIHRoZSBsb2cuCgkJCQkJaWYgKCBAcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkZmlsZSApID09PSBmYWxzZSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBjbGVhbiB1cCAoZGVsZXRlKSB0ZW1wb3JhcnkgZGlyZWN0b3J5L2ZpbGU6IGAnIC4gJGZpbGUgLiAnYC4gWW91IHNob3VsZCBtYW51YWxseSBkZWxldGUgaXQgb3IgY2hlY2sgcGVybWlzc2lvbnMuJyApOwoJCQkJCX0KCQkJCX0gZWxzZSB7IC8vIE5vdCB2ZXJ5IG9sZC4KCQkJCQkkcmVjZW50QmFja3VwRm91bmQgPSB0cnVlOwoJCQkJfQoJCQl9CgkJCWlmICggZmFsc2UgPT09ICRyZWNlbnRCYWNrdXBGb3VuZCApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+dW5saW5rX3JlY3Vyc2l2ZSggJHRlbXBfZGlyZWN0b3J5ICk7IC8vIERlbGV0ZSB0ZW1wIGRpcmVjdG9yeSAoYXMgb2YgQkIgdjUuMCkuIFRoaXMgaXMgbm90IGNyaXRpY2FsIGJ1dCBuaWNlLiBUaGUgYmFja3VwIGNsZWFudXAgc3RlcCBzaG91bGQgcHVyZ2UgdGhlc2Ugc28gaWYgYWxsIGlzIGdvaW5nIHdlbGwgdGhpcyBwcm9iYWJseSB3aWxsIG5vdCBmaW5kIGFueXRoaW5nLgoJCQl9CgkJfQoJCXVuc2V0KCAkcmVjZW50QmFja3VwRm91bmQgKTsKCX0gLy8gRW5kIGNsZWFuVGVtcERpcigpLgoJCgkKCQoJLyogcHJldHR5X21ldGFfaW5mbygpCgkgKgoJICogVHJhbnNsYXRlcyBtZXRhIGluZm9ybWF0aW9uIGZpZWxkIG5hbWVzIGFuZCB2YWx1ZXMgaW50byBuaWNlIHJlYWRhYmxlIGZvcm1zLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJJGNvbW1lbnRfbGluZV9uYW1lCQlNZXRhIGZpZWxkIG5hbWUuCgkgKiBAcGFyYW0Jc3RyaW5nCSRjb21tZW50X2xpbmVfdmFsdWUJCVZhbHVlIG9mIG1ldGEgaXRlbS4KCSAqIEByZXR1cm4JYXJyYXl8ZmFsc2UgCQkJCQlBcnJheSB3aXRoIHR3byBlbnRyaWVzOiB0aGUgdXBkYXRlcyBjb21tZW50IGxpbmUgbmFtZSBhbmQgdXBkYXRlZCBjb21tZW50IGxpbmUgdmFsdWUuIGZhbHNlIGlmIGVtcHR5LgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcmV0dHlfbWV0YV9pbmZvKCAkY29tbWVudF9saW5lX25hbWUsICRjb21tZW50X2xpbmVfdmFsdWUgKSB7CgoJCWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICdzZXJpYWwnICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnVW5pcXVlIHNlcmlhbCBpZGVudGlmaWVyJzsKCQl9IGVsc2VpZiAoICRjb21tZW50X2xpbmVfbmFtZSA9PSAnc2l0ZXVybCcgKSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICdTaXRlIFVSTCc7CgkJfSBlbHNlaWYgKCAkY29tbWVudF9saW5lX25hbWUgPT0gJ3R5cGUnICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnQmFja3VwIFR5cGUnOwoJCQlpZiAoICRjb21tZW50X2xpbmVfdmFsdWUgPT0gJ2RiJyApIHsKCQkJCSRjb21tZW50X2xpbmVfdmFsdWUgPSAnRGF0YWJhc2UnOwoJCQl9IGVsc2VpZiAoICRjb21tZW50X2xpbmVfdmFsdWUgPT0gJ2Z1bGwnICkgewoJCQkJJGNvbW1lbnRfbGluZV92YWx1ZSA9ICdGdWxsJzsKCQkJfSBlbHNlaWYgKCAkY29tbWVudF9saW5lX3ZhbHVlID09ICdleHBvcnQnICkgewoJCQkJJGNvbW1lbnRfbGluZV92YWx1ZSA9ICdNdWx0aXNpdGUgU3Vic2l0ZSBFeHBvcnQnOwoJCQl9CgkJfSBlbHNlaWYgKCAkY29tbWVudF9saW5lX25hbWUgPT0gJ3Byb2ZpbGUnICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnQmFja3VwIFByb2ZpbGUnOwoJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICdjcmVhdGVkJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ0NyZWF0aW9uIERhdGUnOwoJCQlpZiAoICRjb21tZW50X2xpbmVfdmFsdWUgIT0gJycgKSB7CgkJCQkkY29tbWVudF9saW5lX3ZhbHVlID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCAkY29tbWVudF9saW5lX3ZhbHVlICkgKTsKCQkJfQoJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICdiYl92ZXJzaW9uJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ0JhY2t1cEJ1ZGR5IHZlcnNpb24gYXQgY3JlYXRpb24nOwoJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICd3cF92ZXJzaW9uJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1dvcmRQcmVzcyB2ZXJzaW9uIGF0IGNyZWF0aW9uJzsKCQl9IGVsc2VpZiAoICRjb21tZW50X2xpbmVfbmFtZSA9PSAnZGF0X3BhdGgnICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnQmFja3VwQnVkZHkgZGF0YSBmaWxlIChyZWxhdGl2ZSknOwoJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICdwb3N0cycgKSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICdUb3RhbCBQb3N0cyc7CgkJfSBlbHNlaWYgKCAkY29tbWVudF9saW5lX25hbWUgPT0gJ3BhZ2VzJyApIHsKCQkJJGNvbW1lbnRfbGluZV9uYW1lID0gJ1RvdGFsIFBhZ2VzJzsKCQl9IGVsc2VpZiAoICRjb21tZW50X2xpbmVfbmFtZSA9PSAnY29tbWVudHMnICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnVG90YWwgQ29tbWVudHMnOwoJCX0gZWxzZWlmICggJGNvbW1lbnRfbGluZV9uYW1lID09ICd1c2VycycgKSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICdUb3RhbCBVc2Vycyc7CgkJfSBlbHNlaWYgKCAkY29tbWVudF9saW5lX25hbWUgPT0gJ25vdGUnICkgewoJCQkkY29tbWVudF9saW5lX25hbWUgPSAnVXNlci1zcGVjaWZpZWQgbm90ZSc7CgkJCWlmICggJGNvbW1lbnRfbGluZV92YWx1ZSAhPSAnJyApIHsKCQkJCSRjb21tZW50X2xpbmVfdmFsdWUgPSAnIicgLiBodG1sZW50aXRpZXMoICRjb21tZW50X2xpbmVfdmFsdWUgKSAuICciJzsKCQkJfQoJCX0gZWxzZSB7CgkJCSRjb21tZW50X2xpbmVfbmFtZSA9ICRjb21tZW50X2xpbmVfbmFtZTsKCQl9CgoJCWlmICggJGNvbW1lbnRfbGluZV92YWx1ZSAhPSAnJyApIHsKCQkJcmV0dXJuIGFycmF5KCAkY29tbWVudF9saW5lX25hbWUsICRjb21tZW50X2xpbmVfdmFsdWUgKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gYXJyYXkoICRjb21tZW50X2xpbmVfbmFtZSwgJy1FbXB0eS0nICk7CgkJfQoKCX0gLy8gRW5kIHByZXR0eV9tZXRhX2luZm8oKS4KCgoKCS8qIGFsZXJ0X2NvcmVfdGFibGVfZXhjbHVkZXMoKQoJICoKCSAqIE91dHB1dHMgYW4gYWxlcnQgd2FybmluZyBpZiBhIGNvcmUgZGIgdGFibGUgaXMgZXhjbHVkZWQuCgkgKgoJICogQHBhcmFtCWFycmF5IAkJJGV4Y2x1ZGVzCUFycmF5IG9mIHRhYmxlcyBleGNsdWRlZCBmcm9tIHRoZSBiYWNrdXAuCgkgKiBAcmV0dXJuCWFycmF5IAkJCQkJQXJyYXkgb2YgbWVzc2FnZSB3YXJuaW5ncyBhYm91dCBwb3RlbnRpYWwgaXNzdWVzIGZvdW5kIHdpdGggdGhlc2UgZXhjbHVzaW9ucywgaWYgYW55LiBJbmRleCA9IHVuaXF1ZSBpZGVudGlmZXIsIFZhbHVlID0gbWVzc2FnZS4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWxlcnRfY29yZV90YWJsZV9leGNsdWRlcyggJGV4Y2x1ZGVzICkgewoJCWdsb2JhbCAkd3BkYjsKCQkkcHJlZml4ID0gJHdwZGItPnByZWZpeDsKCgkJLy8gSWYgdGhlc2UgdGFibGVzIGFyZSBmb3VuZCBleGNsdWRlZCB0aGVuIHdhcm4gdGhhdCBtYXkgYmUgYSBiYWQgaWRlYS4KCQkkd2Fybl90YWJsZXMgPSBhcnJheSgKCQkJJHByZWZpeCAuICdjb21tZW50cycsCgkJCSRwcmVmaXggLiAncG9zdHMnLAoJCQkkcHJlZml4IC4gJ3VzZXJzJywKCQkJJHByZWZpeCAuICdjb21tZW50bWV0YScsCgkJCSRwcmVmaXggLiAncG9zdG1ldGEnLAoJCQkkcHJlZml4IC4gJ3Rlcm1fcmVsYXRpb25zaGlwcycsCgkJCSRwcmVmaXggLiAnb3B0aW9ucycsCgkJCSRwcmVmaXggLiAndGVybV90YXhvbm9teScsCgkJCSRwcmVmaXggLiAnbGlua3MnLAoJCQkkcHJlZml4IC4gJ3Rlcm1zJywKCQkpOwoKCQkkcmV0dXJuX2FycmF5ID0gYXJyYXkoKTsKCQlmb3JlYWNoKCAkd2Fybl90YWJsZXMgYXMgJHdhcm5fdGFibGUgKSB7CgkJCWlmICggaW5fYXJyYXkoICR3YXJuX3RhYmxlLCAkZXhjbHVkZXMgKSApIHsKCQkJCSRyZXR1cm5fYXJyYXlbJ2V4Y2x1ZGluZ19jb3JldGFibGUtJyAuIG1kNSggJHdhcm5fdGFibGUgKV0gPSAnV2FybmluZzogWW91IGFyZSBleGNsdWRpbmcgb25lIG9yIG1vcmUgY29yZSBXb3JkUHJlc3MgdGFibGVzIGAnIC4gJHdhcm5fdGFibGUgLiAnYCB3aGljaCBtYXkgcmVzdWx0IGluIGFuIGluY29tcGxldGUgYmFja3VwLiBSZW1vdmUgZXhjbHVzaW9ucyBvciBiYWNrdXAgd2l0aCBhbm90aGVyIHByb2ZpbGUgb3IgbWV0aG9kLic7CgkJCX0KCQl9CgoJCXJldHVybiAkcmV0dXJuX2FycmF5OwoJfSAvLyBFbmQgYWxlcnRfY29yZV90YWJsZXNfZXhjbHVkZXMoKS4KCgoKCS8qIGFsZXJ0X2NvcmVfZmlsZV9leGNsdWRlcygpCgkgKgoJICogT3V0cHV0cyBhbiBhbGVydCB3YXJuaW5nIGlmIGEgY29yZSBkYiB0YWJsZSBpcyBleGNsdWRlZC4KCSAqCgkgKiBAcGFyYW0JYXJyYXkgCQkkZXhjbHVkZXMJCUFycmF5IG9mIHBhdGhzIGV4Y2x1ZGVkIGZyb20gdGhlIGJhY2t1cC4KCSAqIEByZXR1cm4JYXJyYXkgCQkJCQkJQXJyYXkgb2YgbWVzc2FnZSB3YXJuaW5ncyBhYm91dCBwb3RlbnRpYWwgaXNzdWVzIGZvdW5kIHdpdGggdGhlc2UgZXhjbHVzaW9ucywgaWYgYW55LiBJbmRleCA9IHVuaXF1ZSBpZGVudGlmZXIsIFZhbHVlID0gbWVzc2FnZS4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWxlcnRfY29yZV9maWxlX2V4Y2x1ZGVzKCAkZXhjbHVkZXMgKSB7CgoJCS8vIElmIHRoZXNlIHBhdGhzIGFyZSBmb3VuZCBleGNsdWRlZCB0aGVuIHdhcm4gdGhhdCBtYXkgYmUgYSBiYWQgaWRlYS4KCQkkd2Fybl9kaXJzID0gYXJyYXkoIC8vIE5vIHRyYWlsaW5nIHNsYXNoLgoJCQknL3dwLWNvbnRlbnQnLAoJCQknL3dwLWNvbnRlbnQvdXBsb2FkcycsCgkJCScvd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAnLAoJCQknLycgLiBsdHJpbSggc3RyX3JlcGxhY2UoIEFCU1BBVEgsICcnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApLCAnXFwvJyApLAoJCSk7CgoJCWZvcmVhY2goICRleGNsdWRlcyBhcyAmJGV4Y2x1ZGUgKSB7IC8vIFN0cmlwIHRyYWlsaW5nIHNsYXNoKGVzKS4KCQkJJGV4Y2x1ZGUgPSBydHJpbSggJGV4Y2x1ZGUsICdcXC8nICk7CgkJfQoKCQkkcmV0dXJuX2FycmF5ID0gYXJyYXkoKTsKCQlmb3JlYWNoKCAkd2Fybl9kaXJzIGFzICR3YXJuX2RpciApIHsKCQkJaWYgKCBpbl9hcnJheSggJHdhcm5fZGlyLCAkZXhjbHVkZXMgKSApIHsKCQkJCSRyZXR1cm5fYXJyYXlbJ2V4Y2x1ZGluZ19jb3JlZmlsZS0nIC4gbWQ1KCAkd2Fybl9kaXIgKV0gPSAnV2FybmluZzogWW91IGFyZSBleGNsdWRpbmcgb25lIG9yIG1vcmUgV29yZFByZXNzIGNvcmUgb3IgQmFja3VwQnVkZHkgZGlyZWN0b3JpZXMgYCcgLiAkd2Fybl9kaXIgLiAnYCB3aGljaCBtYXkgcmVzdWx0IGluIGFuIGluY29tcGxldGUgb3IgbWFsZnVuY3Rpb25pbmcgYmFja3VwLiBSZW1vdmUgZXhjbHVzaW9ucyBvciBiYWNrdXAgd2l0aCBhbm90aGVyIHByb2ZpbGUgb3IgbWV0aG9kIHRvIGF2b2lkIHByb2JsZW1zLic7CgkJCX0KCQl9CgoJCXJldHVybiAkcmV0dXJuX2FycmF5OwoJfSAvLyBFbmQgYWxlcnRfY29yZV9maWxlX2V4Y2x1ZGVzKCkuCgoKCgkvKiBnZXRaaXBNZXRhKCkKCSAqCgkgKiBPdXRwdXQgbWV0YSBpbmZvIGluIGEgdGFibGUuCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJGZpbGUJCQlCYWNrdXAgZmlsZSB0byBnZXQgY29tbWVudCBtZXRhIGRhdGEgZnJvbS4KCSAqIEByZXR1cm4JYXJyYXl8ZmFsc2UJCQkJCUFycmF5IG9mIG1ldGEgZGF0YSBvciBmYWxzZSBvbiBmYWlsdXJlIHRvIHJldHJpZXZlLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRaaXBNZXRhKCAkZmlsZSApIHsKCQlpZiAoICFpc3NldCggcGJfYmFja3VwYnVkZHk6OiRjbGFzc2VzWyd6aXBidWRkeSddICkgKSB7CgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSA9IG5ldyBwbHVnaW5idWRkeV96aXBidWRkeSggYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCkgKTsKCQl9CgkJJGNvbW1lbnRfbWV0YSA9IGFycmF5KCk7CgkJaWYgKCBpc3NldCggJGZpbGUgKSApIHsKCQkJJGNvbW1lbnQgPSBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPmdldF9jb21tZW50KCAkZmlsZSApOwoJCQkkY29tbWVudCA9IGJhY2t1cGJ1ZGR5X2NvcmU6Om5vcm1hbGl6ZV9jb21tZW50X2RhdGEoICRjb21tZW50ICk7CgoJCQkkY29tbWVudF9tZXRhID0gYXJyYXkoKTsKCQkJZm9yZWFjaCggJGNvbW1lbnQgYXMgJGNvbW1lbnRfbGluZV9uYW1lID0+ICRjb21tZW50X2xpbmVfdmFsdWUgKSB7IC8vIExvb3AgdGhyb3VnaCBhbGwgbWV0YSBmaWVsZHMgaW4gdGhlIGNvbW1lbnQgYXJyYXkgdG8gZGlzcGxheS4KCgkJCQlpZiAoIGZhbHNlICE9PSAoICRyZXNwb25zZSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OnByZXR0eV9tZXRhX2luZm8oICRjb21tZW50X2xpbmVfbmFtZSwgJGNvbW1lbnRfbGluZV92YWx1ZSApICkgKSB7CgkJCQkJJHJlc3BvbnNlWzBdID0gJzxzcGFuIHRpdGxlPSInIC4gJGNvbW1lbnRfbGluZV9uYW1lIC4gJyI+JyAuICRyZXNwb25zZVswXSAuICc8L3NwYW4+JzsKCQkJCQkkY29tbWVudF9tZXRhWyRjb21tZW50X2xpbmVfbmFtZV0gPSAkcmVzcG9uc2U7CgkJCQl9CgoJCQl9CgkJfQoKCQlpZiAoIGNvdW50KCAkY29tbWVudF9tZXRhICkgPiAwICkgewoJCQlyZXR1cm4gJGNvbW1lbnRfbWV0YTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfSAvLyBFbmQgZ2V0WmlwTWV0YSgpLgoKCgoJLyogZ2V0X2RhdF9maWxlX2FycmF5KCkKCSAqCgkgKiBHZXQgdGhlIERBVCBmaWxlIGNvbnRlbnRzIGFzIGFuIGFycmF5LgoJICoKCSAqIEBwYXJhbQkJc3RyaW5nCQkkZGF0X2ZpbGUJCUZ1bGwgcGF0aCB0byBEQVQgZmlsZSB0byBkZWNvZGUgYW5kIHBhcnNlLgoJICogQHJldHVybgkJYXJyYXl8ZmFsc2UJCQkJCUFycmF5IG9mIERBVCBjb250ZW50LiBCb29sIGZhbHNlIHdoZW4gdW5hYmxlIHRvIHJlYWQuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9kYXRfZmlsZV9hcnJheSggJGRhdF9maWxlICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRpbmcgYmFja3VwIGRhdCBmaWxlLicgKTsKCgkJaWYgKCBmaWxlX2V4aXN0cyggJGRhdF9maWxlICkgKSB7CgkJCSRiYWNrdXBkYXRhID0gZmlsZV9nZXRfY29udGVudHMoICRkYXRfZmlsZSApOwoJCX0gZWxzZSB7IC8vIE1pc3NpbmcuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAwMzogQmFja3VwQnVkZHkgZGF0YSBmaWxlIChiYWNrdXBidWRkeV9kYXQucGhwKSBtaXNzaW5nIG9yIHVucmVhZGFibGUuIFRoZXJlIG1heSBiZSBhIHByb2JsZW0gd2l0aCB0aGUgYmFja3VwIGZpbGUsIHRoZSBmaWxlcyBjb3VsZCBub3QgYmUgZXh0cmFjdGVkICh5b3UgbWF5IG1hbnVhbGx5IGV4dHJhY3QgdGhlIHppcCBmaWxlIGluIHRoaXMgZGlyZWN0b3J5IHRvIG1hbnVhbGx5IGRvIHRoaXMgcG9ydGlvbiBvZiByZXN0b3JlKSwgb3IgdGhlIGZpbGVzIHdlcmUgZGVsZXRlZCBiZWZvcmUgdGhpcyBwb3J0aW9uIG9mIHRoZSByZXN0b3JlIHdhcyByZWFjaGVkLiAgU3RhcnQgdGhlIGltcG9ydCBwcm9jZXNzIG92ZXIgb3IgdHJ5IG1hbnVhbGx5IGV4dHJhY3RpbmcgKHVuemlwcGluZykgdGhlIGZpbGVzIHRoZW4gc3RhcnRpbmcgb3Zlci4gUmVzdG9yZSB3aWxsIG5vdCBjb250aW51ZSB0byBwcm90ZWN0IGludGVncml0eSBvZiBhbnkgZXhpc3RpbmcgZGF0YS4nICk7CgkJCS8vZGllKCAnIEhhbHRlZC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFVuc2VyaWFsaXplIGRhdGE7IElmIGl0IGZhaWxzIGl0IHRoZW4gZGVjb2RlcyB0aGUgb2JzY3VmYXRlZCBkYXRhIHRoZW4gdW5zZXJpYWxpemVzIGl0LiAobmV3IGRhdCBmaWxlIG1ldGhvZCBzdGFydGluZyBhdCAyLjApLgoJCWlmICggIWlzX3NlcmlhbGl6ZWQoICRiYWNrdXBkYXRhICkgfHwgKCBmYWxzZSA9PT0gKCAkcmV0dXJuID0gdW5zZXJpYWxpemUoICRiYWNrdXBkYXRhICkgKSApICkgewoJCQkvLyBTa2lwIGZpcnN0IGxpbmUuCgkJCSRzZWNvbmRfbGluZV9wb3MgPSBzdHJwb3MoICRiYWNrdXBkYXRhLCAiXG4iICkgKyAxOwoJCQkkYmFja3VwZGF0YSA9IHN1YnN0ciggJGJhY2t1cGRhdGEsICRzZWNvbmRfbGluZV9wb3MgKTsKCgkJCS8vIERlY29kZSBiYWNrIGludG8gYW4gYXJyYXkuCgkJCSRyZXR1cm4gPSB1bnNlcmlhbGl6ZSggYmFzZTY0X2RlY29kZSggJGJhY2t1cGRhdGEgKSApOwoJCX0KCgkJaWYgKCAhIGlzX2FycmF5KCAkcmV0dXJuICkgKSB7IC8vIEludmFsaWQgREFUIGNvbnRlbnQuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjNTQ1NTQ1LiBVbmFibGUgdG8gcmVhZC9kZWNvZGUgREFUIGZpbGUuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTdWNjZXNzZnVsbHkgbG9hZGVkIGJhY2t1cCBkYXQgZmlsZSBgJyAuICRkYXRfZmlsZSAuICdgLicgKTsKCQkkcmV0dXJuX2NlbnNvcmVkID0gJHJldHVybjsKCQkkcmV0dXJuX2NlbnNvcmVkWydkYl9wYXNzd29yZCddID0gJypISURERU4qJzsKCQkkcmV0dXJuX2NlbnNvcmVkID0gcHJpbnRfciggJHJldHVybl9jZW5zb3JlZCwgdHJ1ZSApOwoJCSRyZXR1cm5fY2Vuc29yZWQgPSBzdHJfcmVwbGFjZSggYXJyYXkoICJcbiIsICJcciIgKSwgJzsgJywgJHJldHVybl9jZW5zb3JlZCApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RBVCBjb250ZW50czogJyAuICRyZXR1cm5fY2Vuc29yZWQgKTsKCQlyZXR1cm4gJHJldHVybjsKCX0gLy8gRW5kIGdldF9kYXRfZmlsZV9hcnJheSgpLgoKCgoJLyogZGV0ZXJtaW5lTGF0ZXN0VmVyc2lvbigpCgkgKgoJICogTGF0ZXN0IHZlcnNpb24gaW5mby4gQXJyYXkgb2YgbGF0ZXN0IG1ham9yLG1pbm9yLiBGYWxzZSBvbiBmYWlsIHRvIGdldC4KCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGV0ZXJtaW5lTGF0ZXN0VmVyc2lvbigpIHsKCQkkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb25fY2FjaGVfbWludXRlcyA9IDYwKjEyOyAvLyBEZWZpbmUgaG93IG1hbnkgbWludXRlcyB0byBjYWNoZSB0aGUgbGF0ZXN0IGJhY2t1cGJ1ZGR5IHZlcnNpb24gbnVtYmVyLgoKCQlmdW5jdGlvbiBwYl9iYWNrdXBidWRkeV9zcGxpdDIoICRzdHJpbmcsJG5lZWRsZSwkbnRoICkgewoJCQkkbWF4ID0gc3RybGVuKCRzdHJpbmcpOwoJCQkkbiA9IDA7CgkJCWZvcigkaT0wOyRpPCRtYXg7JGkrKyl7CgkJCQlpZiAoJHN0cmluZ1skaV09PSRuZWVkbGUpewoJCQkJCSRuKys7CgkJCQkJaWYoJG4+PSRudGgpewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJJGFycltdID0gc3Vic3RyKCRzdHJpbmcsMCwkaSk7CgkJCSRhcnJbXSA9IHN1YnN0cigkc3RyaW5nLCRpKzEsJG1heCk7CgkJCXJldHVybiAkYXJyOwoJCX0KCQkkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24gPSBnZXRfdHJhbnNpZW50KCAncGJfYmFja3VwYnVkZHlfbGF0ZXN0X3ZlcnNpb24nICk7CgkJaWYgKCAoIGZhbHNlID09PSAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24gKSB8fCAoICEgaXNfYXJyYXkoICRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiApICkgKSB7CgkJCSRyZXNwb25zZSA9IHdwX3JlbW90ZV9nZXQoICdodHRwOi8vYXBpLml0aGVtZXMuY29tL3Byb2R1Y3QvdmVyc2lvbj9hcGlrZXk9aXhobzdkazBwMjQ0bjBvYiZwYWNrYWdlPWJhY2t1cGJ1ZGR5JmNoYW5uZWw9c3RhYmxlJywgYXJyYXkoCgkJCQkJJ21ldGhvZCcgPT4gJ0dFVCcsCgkJCQkJJ3RpbWVvdXQnID0+IDcsCgkJCQkJJ3JlZGlyZWN0aW9uJyA9PiAzLAoJCQkJCSdodHRwdmVyc2lvbicgPT4gJzEuMCcsCgkJCQkJLy8nYmxvY2tpbmcnID0+IHRydWUsCgkJCQkJJ2hlYWRlcnMnID0+IGFycmF5KCksCgkJCQkJJ2JvZHknID0+IG51bGwsCgkJCQkJJ2Nvb2tpZXMnID0+IGFycmF5KCkKCQkJCSkKCQkJKTsKCQkJaWYoIGlzX3dwX2Vycm9yKCAkcmVzcG9uc2UgKSApIHsKCQkJCSRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiA9IGFycmF5KCAwLCAwICk7IC8vIFNldCB0byAwIGZvciB0cmFuc2llbnQgdG8gcHJldmVudCBoaXR0aW5nIHNlcnZlciBhZ2FpbiBmb3IgYSBiaXQgc2luY2Ugc29tZXRoaW5nIHdlbnQgd3JvbmcuCgkJCX0gZWxzZSB7CgkJCQkkbWlub3JWZXJzaW9uID0gJHJlc3BvbnNlWydib2R5J107CgkJCQkkbWFqb3JWZXJzaW9uID0gcGJfYmFja3VwYnVkZHlfc3BsaXQyKCAkbWlub3JWZXJzaW9uLCAnLicsIDMgKTsKCQkJCSRtYWpvclZlcnNpb24gPSAkbWFqb3JWZXJzaW9uWzBdOwoJCQkJJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uID0gYXJyYXkoICRtaW5vclZlcnNpb24sICRtYWpvclZlcnNpb24gKTsKCQkJfQoJCQlzZXRfdHJhbnNpZW50KCAncGJfYmFja3VwYnVkZHlfbGF0ZXN0X3ZlcnNpb24nLCAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24sIDYwKiAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb25fY2FjaGVfbWludXRlcyApOwoJCX0gLy8gZW5kIG5vdCBjYWNoZWQuCgoJCWlmICggKCAwID09ICRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvblswXSApICYmICggMCA9PSAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb25bMV0gKSApIHsgLy8gU2VydmVyIG5vdCByZXNwb25kaW5nLgoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uOwoKCX0gLy8gRW5kIGRldGVybWluZUxhdGVzdFZlcnNpb24oKS4KCgoKCS8qIGRldGVjdE1heEV4ZWN1dGlvblRpbWUoKQoJICoKCSAqIEF0dGVtcHQgdG8gZGV0ZWN0IHRoZSBtYXggZXhlY3V0aW9uIHRpbWUgYWxsb3dlZCBieSBQSFAuIERlZmF1bHRzIHRvIDMwIGlmIHVuYWJsZSB0byBkZXRlY3Qgb3IgYSBzdXNwaWNpb3VzIHZhbHVlIGlzIGRldGVjdGVkLgoJICogSU1QT1JUQU5UOiBUaGlzIGRvZXMgTk9UIHRha2UgaW50byBhY2NvdW50IHVzZXItc3BlY2lmaWVkIG92ZXJyaWRlIHZpYSBzZXR0aW5ncyBwYWdlLiBGb3IgdGhhdCwgdXNlIGFkanVzdGVkTWF4RXhlY3V0aW9uVGltZSgpLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRldGVjdE1heEV4ZWN1dGlvblRpbWUoKSB7CgkJJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSA9IHN0cl9pcmVwbGFjZSggJ3MnLCAnJywgaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKSApOwoJCWlmICggaXNfbnVtZXJpYyggJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSApICkgewoJCQkkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lID0gJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZTsKCQl9IGVsc2UgewoJCQkkZGV0ZWN0ZWRfbWF4X2V4ZWN1dGlvbl90aW1lID0gMzA7CgkJfQoJCWlmICggJGRldGVjdGVkX21heF9leGVjdXRpb25fdGltZSA9PSAnMCcgKSB7CgkJCSRkZXRlY3RlZF9tYXhfZXhlY3V0aW9uX3RpbWUgPSAzMDsKCQl9CgkJcmV0dXJuICRkZXRlY3RlZF9tYXhfZXhlY3V0aW9uX3RpbWU7Cgl9IC8vIEVuZCBkZXRlY3RNYXhFeGVjdXRpb25UaW1lKCkuCgkKCQoJCgkvLyBTYW1lIGFzIGRldGVjdGVkTWF4RXhlY3V0aW9uVGltZSBFWENFUFQgdGFrZXMgaW50byBhY2NvdW50IHVzZXIgb3ZlcnJpZGVkIHZhbHVlIGluIHNldHRpbmdzIChpZiBhbnkpLgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGp1c3RlZE1heEV4ZWN1dGlvblRpbWUoKSB7CgkJJGRldGVjdGVkID0gc2VsZjo6ZGV0ZWN0TWF4RXhlY3V0aW9uVGltZSgpOwoJCWlmICggKCAnJyAhPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ21heF9leGVjdXRpb25fdGltZSddICkgJiYgKCBpc19udW1lcmljKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ21heF9leGVjdXRpb25fdGltZSddICkgKSApIHsgLy8gSWYgc2V0IGFuZCBhIG51bWJlciwgdXNlIHVzZXItc3BlY2lmaWVkIHJ1bnRpbWUuCgkJCXJldHVybiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ21heF9leGVjdXRpb25fdGltZSddOwoJCX0gZWxzZSB7IC8vIE5vdGhpbmcgdXNlci1zcGVjaWZpZWQgc28gdXNlciBkZXRlY3RlZCB2YWx1ZS4KCQkJcmV0dXJuICRkZXRlY3RlZDsKCQl9Cgl9IC8vIEVuZCBhZGp1c3RlZE1heEV4ZWN1dGlvblRpbWUoKS4KCQoJCgkKCS8qIGRiRXNjYXBlKCkKCSAqCgkgKiBFc2NhcGUgU1FMIHVzaW5nIGVpdGhlciBteXNxbCBvciBteXNxbGkgYmFzZWQgb24gd2hpY2hldmVyIFdvcmRQcmVzcyBpcyB1c2luZy4KCSAqIFdQIDMuOSBpbnRyb2R1Y2luZyBteXNxbGkgc3VwcG9ydC4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkYkVzY2FwZSggJHNxbCApIHsKCQlnbG9iYWwgJHdwZGI7CgkJaWYgKCBpc3NldCggJHdwZGItPnVzZV9teXNxbGkgKSAmJiAoIHRydWUgPT09ICR3cGRiLT51c2VfbXlzcWxpICkgKSB7IC8vIFBvc3NpYmxlIHBvc3QgV1AgMy45CgkJCXJldHVybiBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nKCAkd3BkYi0+ZGJoLCAkc3FsICk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyggJHNxbCApOwoJCX0KCX0gLy8gRW5kIGRiRXNjYXBlKCkuCgkKCQoJCn0gLy8gRW5kIGNsYXNzIGJhY2t1cGJ1ZGR5X2NvcmUu
###PACKDATA,FILE_END,/classes/core.php,importbuddy/classes/core.php
###PACKDATA,FILE_START,/classes/import.php,importbuddy/classes/import.php
PD9waHAKY2xhc3MgcGJfYmFja3VwYnVkZHlfaW1wb3J0IHsKCQoJCgkKCQoJCgkKCQoJLyoqCgkgKgl3aXBlUHJlZml4KCkKCSAqCgkgKglDbGVhciBvdXQgdGFibGVzIG1hdGNoaW5nIHN1cHBsaWVkIHByZWZpeC4KCSAqCgkgKglAcmV0dXJuCQkJYm9vbGVhbgkJQ3VycmVudGx5IGFsd2F5cyB0cnVlLgoJICovCglmdW5jdGlvbiB3aXBlUHJlZml4KCAkcHJlZml4LCAkY29uZmlybSA9IGZhbHNlICkgewoJCWlmICggJGNvbmZpcm0gIT09IHRydWUgKSB7CgkJCWRpZSggJ0Vycm9yICM1NDY2NTY2YjogUGFyYW1ldGVyIDIgdG8gd2lwZVByZWZpeCgpIG11c3QgYmUgYm9vbGVhbiB0cnVlIHRvIHByb2NlZWQuJyApOwoJCX0KCQkKCQlpZiAoICRwcmVmaXggPT0gJycgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ05vIGRhdGFiYXNlIHByZWZpeCBzcGVjaWZpZWQgdG8gd2lwZS4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnQmVnaW5uaW5nIHdpcGUgb2YgZGF0YWJhc2UgdGFibGVzIG1hdGNoaW5nIHByZWZpeCBgJyAuICRwcmVmaXggLiAnYC4uLicgKTsKCQkKCQkvLyBDb25uZWN0IHRvIGRhdGFiYXNlLgoJCS8vJHRoaXMtPmNvbm5lY3RfZGF0YWJhc2UoKTsKCQkKCQlnbG9iYWwgJHdwZGI7CgkJJHJvd3MgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgdGFibGVfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfbmFtZSBMSUtFICciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoIHN0cl9yZXBsYWNlKCAnXycsICdcXycsICRwcmVmaXggKSApIC4gIiUnIEFORCB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpIiwgQVJSQVlfQSApOwoJCSR0YWJsZV93aXBlX2NvdW50ID0gY291bnQoICRyb3dzICk7CgkJZm9yZWFjaCggJHJvd3MgYXMgJHJvdyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHJvcHBpbmcgdGFibGUgYCcgLiAkcm93Wyd0YWJsZV9uYW1lJ10gLiAnYC4nICk7CgkJCSR3cGRiLT5xdWVyeSggJ0RST1AgVEFCTEUgYCcgLiAkcm93Wyd0YWJsZV9uYW1lJ10gLiAnYCcgKTsKCQl9CgkJdW5zZXQoICRyb3dzICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnV2lwZWQgZGF0YWJhc2Ugb2YgJyAuICR0YWJsZV93aXBlX2NvdW50IC4gJyB0YWJsZXMuJyApOwoJCQoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgd2lwZVByZWZpeCgpLgoJCgkKCQoJLyoqCgkgKgl3aXBlRGF0YWJhc2UoKQoJICoKCSAqCUNsZWFyIG91dCB0aGUgZXhpc3RpbmcgZGF0YWJhc2UgdG8gcHJlcGFyZSBmb3IgaW1wb3J0aW5nIG5ldyBkYXRhLgoJICoKCSAqCUByZXR1cm4JCQlib29sZWFuCQlDdXJyZW50bHkgYWx3YXlzIHRydWUuCgkgKi8KCWZ1bmN0aW9uIHdpcGVEYXRhYmFzZSggJGNvbmZpcm0gPSBmYWxzZSApIHsKCQlpZiAoICRjb25maXJtICE9PSB0cnVlICkgewoJCQlkaWUoICdFcnJvciAjNTQ2NjU2NmE6IFBhcmFtZXRlciAxIHRvIHdpcGVEZGF0YWJhc2UoKSBtdXN0IGJlIGJvb2xlYW4gdHJ1ZSB0byBwcm9jZWVkLicgKTsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnQmVnaW5uaW5nIHdpcGUgb2YgQUxMIGRhdGFiYXNlIHRhYmxlcy4uLicgKTsKCQkKCQkvLyBDb25uZWN0IHRvIGRhdGFiYXNlLgoJCS8vJHRoaXMtPmNvbm5lY3RfZGF0YWJhc2UoKTsKCQkKCQlnbG9iYWwgJHdwZGI7CgkJJHJvd3MgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTRUxFQ1QgdGFibGVfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSIsIEFSUkFZX0EgKTsKCQkkdGFibGVfd2lwZV9jb3VudCA9IGNvdW50KCAkcm93cyApOwoJCWZvcmVhY2goICRyb3dzIGFzICRyb3cgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Ryb3BwaW5nIHRhYmxlIGAnIC4gJHJvd1sndGFibGVfbmFtZSddIC4gJ2AuJyApOwoJCQkkd3BkYi0+cXVlcnkoICdEUk9QIFRBQkxFIGAnIC4gJHJvd1sndGFibGVfbmFtZSddIC4gJ2AnICk7CgkJfQoJCXVuc2V0KCAkcm93cyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1dpcGVkIGRhdGFiYXNlIG9mICcgLiAkdGFibGVfd2lwZV9jb3VudCAuICcgdGFibGVzLicgKTsKCQkKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHdpcGVEYXRhYmFzZSgpLgoJCgkKCQoJLyoJcHJlZ19lc2NhcGVfYmFjaygpCgkgKgkKCSAqCUVzY2FwZSBiYWNrcmVmZXJlbmNlcyBmcm9tIHN0cmluZyBmb3IgdXNlIHdpdGggcmVnZXguIFVzZWQgYnkgbWlncmF0ZV93cF9jb25maWcoKS4KCSAqCUBzZWUgbWlncmF0ZV93cF9jb25maWcoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHN0cmluZwkJU3RyaW5nIHRvIGVzY2FwZS4KCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJRXNjYXBlZCBzdHJpbmcuCgkgKi8KCWZ1bmN0aW9uIHByZWdfZXNjYXBlX2JhY2soJHN0cmluZykgewoJCS8vIFJlcGxhY2UgJCB3aXRoIFwkIGFuZCBcIHdpdGggXFwKCQkkc3RyaW5nID0gcHJlZ19yZXBsYWNlKCcjKD88IVxcXFwpKFxcJHxcXFxcKSMnLCAnXFxcXCQxJywgJHN0cmluZyk7CgkJcmV0dXJuICRzdHJpbmc7Cgl9IC8vIEVuZCBwcmVnX2VzY2FwZV9iYWNrKCkuCgkKCQoJCgkKCQoJCgkKCS8vIFRPRE86IHN3aXRjaCB0byB1c2luZyBwYl9iYWNrdXBidWRkeTo6c3RhdHVzX2JveCgpIGluc3RlYWQuCgkvKioKCSAqCXN0YXR1c19ib3goKQoJICoKCSAqCURpc3BsYXlzIGEgdGV4dGFyZWEgZm9yIHBsYWNpbmcgc3RhdHVzIHRleHQgaW50by4KCSAqCgkgKglAcGFyYW0JCQkkZGVmYXVsdF90ZXh0CXN0cmluZwkJRmlyc3QgbGluZSBvZiB0ZXh0IHRvIGRpc3BsYXkuCgkgKglAcGFyYW0JCQlib29sZWFuCQkJJGhpZGRlbgkJV2hldGhlciBvciBub3QgdG8gYXBwbHkgZGlzcGxheTogbm9uZTsgQ1NTLgoJICoJQHJldHVybgkJCQkJCQlzdHJpbmcJCUhUTUwgZm9yIHRleHRhcmVhLgoJICovCglmdW5jdGlvbiBzdGF0dXNfYm94KCAkZGVmYXVsdF90ZXh0ID0gJycsICRoaWRkZW4gPSBmYWxzZSApIHsKCQlkZWZpbmUoICdQQl9TVEFUVVMnLCB0cnVlICk7IC8vIFRlbGxzIGZyYW1ld29yayBzdGF0dXMoKSBmdW5jdGlvbiB0byBvdXRwdXQgZnV0dXJlIGxvZ2dpbmcgaW5mbyBpbnRvIHN0YXR1cyBib3ggdmlhIGphdmFzY3JpcHQuCgkJJHJldHVybiA9ICc8ZGl2IGlkPSJwYl9iYWNrdXBidWRkeV9zdGF0dXNfd3JhcCI+PHRleHRhcmVhIHJlYWRvbmx5PSJyZWFkb25seSIgaWQ9ImJhY2t1cGJ1ZGR5X21lc3NhZ2VzIiB3cmFwPSJvZmYiJzsKCQlpZiAoICRoaWRkZW4gPT09IHRydWUgKSB7CgkJCSRyZXR1cm4gLj0gJyBzdHlsZT0iZGlzcGxheTogbm9uZTsgIic7CgkJfQoJCSRyZXR1cm4gLj0gJz4nIC4gJGRlZmF1bHRfdGV4dCAuICc8L3RleHRhcmVhPjwvZGl2Pic7CgkJCgkJcmV0dXJuICRyZXR1cm47Cgl9CgkKCQoJCgkKCQoJCn0gLy8gRW5kIGNsYXNzLgo/Pgo=
###PACKDATA,FILE_END,/classes/import.php,importbuddy/classes/import.php
###PACKDATA,FILE_START,/classes/restore.php,importbuddy/classes/restore.php
PD9waHAKLy8gRHVzdGluIEJvbHRvbiAyMDE0LgpjbGFzcyBiYWNrdXBidWRkeV9yZXN0b3JlIHsKCQoJCglwdWJsaWMgJF9zdGF0ZSA9IGFycmF5KCk7CQkvLyBIb2xkcyBjdXJyZW50IHN0YXRlIGRhdGEuIFJldHJpZXZlIHdpdGggZ2V0U3RhdGUoKSBhbmQgcGFzcyBvbnRvIG5leHQgcnVuIGluIHRoZSBjb25zdHJ1Y3Rvci4KCXByaXZhdGUgJF9lcnJvcnMgPSBhcnJheSgpOwkJLy8gSG9sZCBlcnJvciBzdHJpbmdzIHRvIHJldHJpZXZlIHdpdGggZ2V0RXJyb3JzKCkuCgkKCQoJCgkvKiBfX2NvbnN0cnVjdCgpCgkgKgoJICogUk9MTEJBQ0ssIFJFU1RPUkUKCSAqCgkgKiBAcGFyYW0Jc3RyaW5nCSR0eXBlCQkJUmVzdG9yZSB0eXBlOiByb2xsYmFjayAocm9sbCBiYWNrIGZyb20gaW5zaWRlIFdvcmRQcmVzcyksIHJlc3RvcmUgKGltcG9ydGJ1ZGR5KQoJICogQHBhcmFtCWFycmF5IAkkZXhpc3RpbkRhdGEJU3RhdGUgZGF0YSBmcm9tIGEgcHJldmlvdXMgaW5zdGFudGlhdGlvbi4gUHJldmlvdXNseSByZXR1cm5lZCBmcm9tIGdldFN0YXRlKCkuCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICR0eXBlLCAkZXhpc3RpbmdTdGF0ZSA9ICcnICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NvbnN0cnVjdGluZyByb2xsYmFjayBjbGFzcy4nICk7CgkJCgkJaWYgKCAoICdyb2xsYmFjaycgIT0gJHR5cGUgKSAmJiAoICdyZXN0b3JlJyAhPSAkdHlwZSApICkgewoJCQkkdGhpcy0+X2Vycm9yKCAnSW52YWxpZCByZXN0b3JlIHR5cGUgYCcgLiBodG1sZW50aXRpZXMoICR0eXBlICkgLiAnYC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oIGFycmF5KCAmJHRoaXMsICdzaHV0ZG93bl9mdW5jdGlvbicgKSApOwoJCQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1NldHRpbmcgcmVzdG9yZSBzdGF0ZSBkZWZhdWx0cy4nICk7CgkJJHRoaXMtPl9zdGF0ZSA9IGFycmF5KAoJCQkndHlwZScgPT4gJHR5cGUsCgkJCSdhcmNoaXZlJyA9PiAnJywJCQkJCS8vIEZ1bGwgYXJjaGl2ZSBwYXRoICYgZmlsZW5hbWUuCgkJCSdzZXJpYWwnID0+ICcnLAkJCQkJCS8vIENhbGN1bGF0ZWQgYmFja3VwIHNlcmlhbC4KCQkJJ3RlbXBQYXRoJyA9PiAnJywJCQkJCS8vIFRlbXBvcmFyeSBwYXRoIHRvIGRvIGV4dHJhY3Rpb25zIGludG8uIFRyYWlsaW5nIHBhdGguCgkJCSdkYXRhJyA9PiBhcnJheSgpLAkJCQkJLy8gREFUIGZpbGUgYXJyYXkuCgkJCSd1bmRvVVJMJyA9PiAnJywJCQkJCS8vIFVSTCB0byB0aGUgdW5kbyBzY3JpcHQsIGVnIGh0dHA6Ly95b3VyLmNvbS9iYWNrdXBidWRkeV9yb2xsYmFja191bmRvLVhYWFhYWFhYLnBocAoJCQknZm9yY2VNeXNxbE1ldGhvZHMnID0+IGFycmF5KCksCQkvLyBteXNxbCBtZXRob2RzIHRvIGZvcmNlIGZvciBpbXBvcnRpbmcuIERlZmF1bHQgdG8gZW1wdHkgYXJyYXkgdG8gYXV0by1kZXRlY3QuCgkJCSdhdXRvQWR2YW5jZScgPT4gdHJ1ZSwJCQkJLy8gV2hldGhlciBvciBub3QgdG8gYXV0byBhZHZhbmNlIChpZSBmb3Igd2ViLWJhc2VkIHJvbGxiYWNrIGF1dG8tcmVmcmVzaCB0byBuZXh0IHN0ZXApLgoJCQknbWF4RXhlY3V0aW9uVGltZScgPT4gYmFja3VwYnVkZHlfY29yZTo6ZGV0ZWN0TWF4RXhlY3V0aW9uVGltZSgpLAkJCS8vIElmIHNldCB0aGVuIG92ZXJyaWRlIGRldGVjdGVkIG1heCBleGVjdXRpb24gdGltZS4KCQkJJ2RiSW1wb3J0UG9pbnQnID0+IDAsCQkJCS8vIEZvciBjb21wYXQgbW9kZSBteXNxbCwgbmV4dCByb3cgdG8gc3RhcnQgaW1wb3J0byBuLgoJCQknemlwTWV0aG9kU3RyYXRlZ3knID0+ICdhbGwnLAkJLy8JWmlwIG1ldGhvZHMgdG8gdXNlLiBWYWxpZDogYWxsLCB6aXBhcmNoaXZlLCBwY2x6aXAKCQkJJ3Jlc3RvcmVGaWxlcycgPT4gdHJ1ZSwKCQkJJ3Jlc3RvcmVEYXRhYmFzZScgPT4gdHJ1ZSwKCQkJJ21pZ3JhdGVIdGFjY2VzcycgPT4gdHJ1ZSwKCQkJJ2RhdGFiYXNlU2V0dGluZ3MnID0+IGFycmF5KAoJCQkJCQkJCQknc2VydmVyJyA9PiAnJywKCQkJCQkJCQkJJ2RhdGFiYXNlJyA9PiAnJywKCQkJCQkJCQkJJ3VzZXJuYW1lJyA9PiAnJywKCQkJCQkJCQkJJ3Bhc3N3b3JkJyA9PiAnJywKCQkJCQkJCQkJJ3ByZWZpeCcgPT4gJycsCgkJCQkJCQkJCSd0ZW1wUHJlZml4JyA9PiAnJywgLy8gVXNlZCBieSBkZXBsb3ltZW50IHRvIGltcG9ydCB0byBhIHRlbXBvcmFyeSBwcmVmaXguIE1pZ3JhdGlvbiB3aWxsIG1pZ3JhdGUgZGF0YSB0byB0aGUgcmVhbCBwcmVmaXggdGhvdWdoLiBUaGVuIHRoZSBkYiB3aWxsIGJlIHN3YXBwZWQgb3V0IGJldHdlZW4gZXhpc3RpbmcgYW5kIHRlbXBQcmVmaXguCgkJCQkJCQkJCSd3aXBlUHJlZml4JyA9PiBmYWxzZSwKCQkJCQkJCQkJJ3JlbmFtZVByZWZpeCcgPT4gZmFsc2UsIC8vIFRlbXBvcmFyaWx5IHJlbmFtZSBleGlzdGluZyB0YWJsZXMgdG8gYW5vdGhlciBwcmVmaXggZm9yIGFsbG93aW5nIHVuZG8gb2YgZGIgaW1wb3J0LgoJCQkJCQkJCQknd2lwZURhdGFiYXNlJyA9PiBmYWxzZSwKCQkJCQkJCQkJJ2lnbm9yZVNxbEVycm9ycycgPT4gZmFsc2UsCgkJCQkJCQkJCSdzcWxGaWxlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJJ3NxbEZpbGVzTG9jYXRpb24nID0+ICcnLAoJCQkJCQkJCQknZGF0YWJhc2VNZXRob2RTdHJhdGVneScgPT4gJ3BocCcsIC8vIERlZmF1bHRzIHRvIHBocCBkdWUgdG8gY2h1bmtpbmcgYWJpbGl0eS4KCQkJCQkJCQkJLy8naW1wb3J0UmVzdW1lRmlsZXMnPT4gYXJyYXkoKSwgLy8gSU1QT1JUQU5UOiBMZWF2ZSB1bnNldCBpbiBkZWZhdWx0LiBPbmNlIHNldCwgZW1wdHl5IGFycmF5IG1lYW5zIGZpbmlzaGVkIGFsbCBmaWxlcy4KCQkJCQkJCQkJJ2ltcG9ydFJlc3VtZVBvaW50Jz0+ICcnLCAvLyBDdXJyZW50IGZpbGUgcG9pbnRlciB2YWx1ZSAoZnJvbSBmdGVsbCgpKSBmb3IgY2h1bmtlZCByZXN1bWVkIFNRTCBmaWxlIGltcG9ydC4KCQkJCQkJCQkJJ2ltcG9ydGVkUmVzdW1lUm93cycgPT4gMCwgLy8gVG90YWwgbnVtYmVyIG9mIHJvd3MgaW1wb3J0ZWQgdGh1cyBmYXIgd2hlbiBjaHVua2luZy4gW0lORk9STUFUSU9OIE9OTFldCgkJCQkJCQkJCSdpbXBvcnRlZFJlc3VtZUZhaWxzJyA9PiAwLCAvLyBUb3RhbCBudW1iZXIgb2YgU1FMIHF1ZXJpZXMgdGhhdCBmYWlsZWQgZXhlY3V0aW9uZyB3aGVuIGNodW5raW5nLiBbSU5GT1JNQVRJT04gT05MWV0KCQkJCQkJCQkJJ2ltcG9ydGVkUmVzdW1lVGltZScgPT4gMCwgLy8gVG90YWwgdGltZSBvZiBhY3R1YWwgaW1wb3J0IHdoZW4gY2h1bmtpbmcuIFtJTkZPUk1BVElPTiBPTkxZXQoJCQkJCQkJCQknbWlncmF0ZURhdGFiYXNlJyA9PiB0cnVlLAoJCQkJCQkJCQknbWlncmF0ZURhdGFiYXNlQnJ1dGVGb3JjZScgPT4gdHJ1ZSwKCQkJCQkJCQkJJ21pZ3JhdGVSZXN1bWVTdGVwcycgPT4gJycsCgkJCQkJCQkJCSdtaWdyYXRlUmVzdW1lUG9pbnQnID0+ICcnLAoJCQkJCQkJCSksCgkJCSdjbGVhbnVwJyA9PiBhcnJheSgJCQkJCS8vIFN0ZXAgNiBjbGVhbnVwIG9wdGlvbnMuCgkJCQknZGVsZXRlQXJjaGl2ZScgPT4gdHJ1ZSwKCQkJCSdkZWxldGVUZW1wRmlsZXMnID0+IHRydWUsCgkJCQknZGVsZXRlSW1wb3J0QnVkZHknID0+IHRydWUsCgkJCQknZGVsZXRlSW1wb3J0TG9nJyA9PiB0cnVlLAoJCQkJCQkJCSksCgkJCSdwb3RlbnRpYWxQcm9ibGVtcycgPT4gYXJyYXkoKSwJCS8vIEFycmF5IG9mIHBvdGVudGlhbCBpc3N1ZXMgZW5jb3VudGVyZWQgdG8gc2hvdyB0aGUgdXNlciBBRlRFUiBpbXBvcnQgaXMgZG9uZS4KCQkJJ3N0ZXBIaXN0b3J5JyA9PiBhcnJheSgpLAkJCS8vIEFycmF5IG9mIGFycmF5cyBvZiB0aGUgc3RlcCBmdW5jdGlvbnMgcnVuIHRodXMgZmFyLiBUcmFjayBzdGFydCBhbmQgZmluaXNoIHRpbWVzLgoJCSk7CgoJCS8vIFJlc3RvcmUtc3BlY2lmaWMgZGVmYXVsdCBvcHRpb25zLgoJCWlmICggJ3Jlc3RvcmUnID09ICR0eXBlICkgewoJCQkkdGhpcy0+X3N0YXRlWydza2lwVW56aXAnXSA9IGZhbHNlOwoJCQkkdGhpcy0+X3N0YXRlWydyZXN0b3JlRmlsZXMnXSA9IHRydWU7CgkJCSR0aGlzLT5fc3RhdGVbJ3Jlc3RvcmVEYXRhYmFzZSddID0gdHJ1ZTsKCQkJJHRoaXMtPl9zdGF0ZVsnbWlncmF0ZUh0YWNjZXNzJ10gPSB0cnVlOwoJCQkkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS90ZW1wXycgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcvJzsKCQl9IGVsc2VpZiAoICdyb2xsYmFjaycgPT0gJHR5cGUgKSB7CgkJCSR0aGlzLT5fc3RhdGVbJ3RlbXBQYXRoJ10gPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCkgLiAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gLiAnXycgLiAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSAuICcvJzsKCQl9CgkJCgkJCgkJaWYgKCBpc19hcnJheSggJGV4aXN0aW5nU3RhdGUgKSApIHsgLy8gVXNlciBwYXNzZWQgYWxvbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdG8gcmVzdW1lLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdVc2luZyBwcm92aWRlZCByZXN0b3JlIHN0YXRlIGRhdGEuJyApOwoJCQkkdGhpcy0+X3N0YXRlID0gJHRoaXMtPl9hcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSggJHRoaXMtPl9zdGF0ZSwgJGV4aXN0aW5nU3RhdGUgKTsKCQl9CgkJCgkJLy8gQ2hlY2sgaWYgYSBkZWZhdWx0IHN0YXRlIG92ZXJyaWRlIGV4aXN0cy4gIFVzZWQgYnkgYXV0b21hdGVkIHJlc3RvcmluZy4KCQkvKgoJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApICYmICggY291bnQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snZGVmYXVsdF9zdGF0ZV9vdmVycmlkZXMnXSApID4gMCApICkgeyAvLyBEZWZhdWx0IHN0YXRlIG92ZXJyaWRlcyBleGlzdC4gQXBwbHkgdGhlbS4KCQkJJHRoaXMtPl9zdGF0ZSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X3N0YXRlLCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RlZmF1bHRfc3RhdGVfb3ZlcnJpZGVzJ10gKTsKCQl9CgkJKi8KCQkKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZXN0b3JlIGNsYXNzIGNvbnN0cnVjdGVkIGluIGAnIC4gJHR5cGUgLiAnYCBtb2RlLicgKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCk7IC8vIEp1c3QgYWx3YXlzIGFzc3VtZSB3ZSBuZWVkIHRoaXMgZHVyaW5nIHJlc3RvcmVzL3JvbGxiYWNrLi4uCgl9IC8vIEVuZCBfX2NvbnN0cnVjdCgpLgoJCgkKCQoJLyogc3RhcnQoKQoJICoKCSAqIFJPTExCQUNLLCBSRVNUT1JFCgkgKiBSZXR1cm5zIGZhbHNlIG9uIGZhaWx1cmUuIFVzZSBnZXRFcnJvcnMoKSB0byBnZXQgYW4gYXJyYXkgb2YgZXJyb3JzIGVuY291bnRlcmVkIGlmIGFueS4KCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgaW5mb3JtYXRpb24gb24gc3VjY2Vzcy4KCSAqIEdyYWIgdGhlIHJvbGxiYWNrIHN0YXRlIGRhdGEgd2l0aCBnZXRTdGF0ZSgpLgoJICoKCSAqIEByZXR1cm4JYm9vbAkJdHJ1ZSBvbiBzdWNjZXNzLCBlbHNlIGZhbHNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RhcnQoICRiYWNrdXBGaWxlLCAkc2tpcFVuemlwID0gZmFsc2UgKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCWlmICggISBmaWxlX2V4aXN0cyggJGJhY2t1cEZpbGUgKSApIHsKCQkJcmV0dXJuICR0aGlzLT5fZXJyb3IoICdVbmFibGUgdG8gYWNjZXNzIGJhY2t1cCBmaWxlIGAnIC4gJGJhY2t1cEZpbGUgLiAnYC4gVmVyaWZ5IGl0IHN0aWxsIGV4aXN0cyBhbmQgaGFzIHByb3BlciByZWFkIHBlcm1pc3Npb25zLicgKTsKCQl9CgkJCgkJJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddID0gJGJhY2t1cEZpbGU7CgkJJHNlcmlhbCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCBiYXNlbmFtZSggJGJhY2t1cEZpbGUgKSApOwoJCSR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddID0gJHNlcmlhbDsKCQl1bnNldCggJGJhY2t1cEZpbGUgKTsKCQl1bnNldCggJHNlcmlhbCApOwoJCQoJCWlmICggZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgJiYgKCB0cnVlID09PSBQQl9TVEFOREFMT05FICkgKSB7CgkJCSRteXNxbF85MDEwX2xvZyA9IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvbXlzcWxfOTAxMF9sb2ctJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkbXlzcWxfOTAxMF9sb2cgKSApIHsKCQkJCUB1bmxpbmsoICRteXNxbF85MDEwX2xvZyApOwoJCQl9CgkJfQoJCQoJCWlmICggdHJ1ZSAhPT0gJHNraXBVbnppcCApIHsKCQkJLy8gR2V0IHppcCBtZXRhIGluZm9ybWF0aW9uLgoJCQkkY3VzdG9tVGl0bGUgPSAnQmFja3VwIERldGFpbHMnOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBdHRlbXB0aW5nIHRvIHJldHJpZXZlIHppcCBtZXRhIGRhdGEgZnJvbSBjb21tZW50LicgKTsKCQkJaWYgKCBmYWxzZSAhPT0gKCAkbWV0YUluZm8gPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRaaXBNZXRhKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10gKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRm91bmQgemlwIG1ldGEgZGF0YS4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEaWQgbm90IGZpbmQgemlwIG1ldGEgZGF0YS4nICk7CgkJCX0KCQkJCgkJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb2FkaW5nIHppcGJ1ZGR5LicgKTsKCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCcgKTsKCQkJCgkJCSR6aXBidWRkeSA9IG5ldyBwbHVnaW5idWRkeV96aXBidWRkeSggZGlybmFtZSggJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddICkgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwYnVkZHkgbG9hZGVkLicgKTsKCQl9CgkJCgkJLy8gRmluZCBEQVQgZmlsZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDYWxjdWxhdGluZyBwb3NzaWJsZSBEQVQgZmlsZSBsb2NhdGlvbnMuJyApOwoJCSRkZXRlY3RlZERhdExvY2F0aW9uID0gJyc7CgkJJHBvc3NpYmxlRGF0TG9jYXRpb25zID0gYXJyYXkoKTsKCQlpZiAoIGlzc2V0KCAkbWV0YUluZm9bJ2RhdF9wYXRoJ10gKSApIHsKCQkJJHBvc3NpYmxlRGF0TG9jYXRpb25zW10gPSAkbWV0YUluZm9bJ2RhdF9wYXRoJ11bMV07IC8vIERBVCBmaWxlIGxvY2F0aW9uIGVuY29kZWQgaW4gbWV0YSBpbmZvLiBTaG91bGQgYWx3YXlzIGJlIHZhbGlkLgoJCX0KCQkkcG9zc2libGVEYXRMb2NhdGlvbnNbXSA9ICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnL2JhY2t1cGJ1ZGR5X2RhdC5waHAnOyAvLyBGdWxsIGJhY2t1cC4KCQkkcG9zc2libGVEYXRMb2NhdGlvbnNbXSA9ICdiYWNrdXBidWRkeV9kYXQucGhwJzsgLy8gREIgYmFja3VwLiAobG9vayBmb3IgdGhpcyBzZWNvbmQgaW4gY2FzZSB1c2VyIGxlZnQgYW4gb2xkIGRhdCBmaWxlIGluIHJvb3QpLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1Bvc3NpYmxlIERBVCBmaWxlIGxvY2F0aW9uczogYCcgLiBpbXBsb2RlKCAnOycsICRwb3NzaWJsZURhdExvY2F0aW9ucyApIC4gJ2AuJyApOwoJCSRwb3NzaWJsZURhdExvY2F0aW9ucyA9IGFycmF5X3VuaXF1ZSggJHBvc3NpYmxlRGF0TG9jYXRpb25zICk7CgkJaWYgKCB0cnVlID09PSAkc2tpcFVuemlwICkgeyAvLyBPbmx5IGxvb2sgZm9yIERBVCBmaWxlIGluIGZpbGVzeXN0ZW0uIFppcCBzaG91bGQgYmUgcHJlLWV4dHJhY3RlZCwgZWcgYnkgdGhlIHVzZXIgbWFudWFsbHkuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvb2tpbmcgZm9yIERBVCBmaWxlIGluIGxvY2FsIGZpbGVzeXN0ZW0gKGluc3RlYWQgb2YgaW4gemlwKSBzaW5jZSBhZHZhbmNlZCBza2lwIHVuemlwIG9wdGlvbiBzZXQuJyApOwoJCQlmb3JlYWNoKCAkcG9zc2libGVEYXRMb2NhdGlvbnMgYXMgJHBvc3NpYmxlRGF0TG9jYXRpb24gKSB7IC8vIExvb2sgZm9yIERBVCBmaWxlIGluIGZpbGVzeXN0ZW0uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEb2VzIGAnIC4gQUJTUEFUSCAuICRwb3NzaWJsZURhdExvY2F0aW9uIC4gJ2AgZXhpc3Q/JyApOwoJCQkJaWYgKCB0cnVlID09PSBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICRwb3NzaWJsZURhdExvY2F0aW9uICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWWVzLCBleGlzdHMuJyApOwoJCQkJCSRkZXRlY3RlZERhdExvY2F0aW9uID0gJHBvc3NpYmxlRGF0TG9jYXRpb247CgkJCQkJYnJlYWs7CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vLCBkb2VzIG5vdCBleGlzdC4nICk7CgkJCQl9CgkJCX0KCQkJaWYgKCAnJyA9PSAkZGV0ZWN0ZWREYXRMb2NhdGlvbiApIHsKCQkJCSRtZXNzYWdlID0gJ1VuYWJsZSB0byBmaW5kIHRoZSBEQVQgZmlsZSBmb3IgdGhpcyBiYWNrdXAgYXJjaGl2ZSBwcmUtZXh0cmFjdGVkIGluIHRoZSBmaWxlc3lzdGVtLiBNYWtlIHN1cmUgeW91IGhhdmUgYWxyZWFkeSB1bnppcHBlZCB0aGlzIGJhY2t1cCBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBpbXBvcnRidWRkeS5waHAuJzsKCQkJCXJldHVybiAkdGhpcy0+X2Vycm9yKCAkbWVzc2FnZSApOwoJCQl9CgkJfSBlbHNlIHsgLy8gTG9vayBmb3IgREFUIGZpbGUgaW5zaWRlIG9mIHppcCBhcmNoaXZlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb29raW5nIGZvciBEQVQgZmlsZSBpbiB6aXAgYXJjaGl2ZSBpdHNlbGYuJyApOwoJCQlmb3JlYWNoKCAkcG9zc2libGVEYXRMb2NhdGlvbnMgYXMgJHBvc3NpYmxlRGF0TG9jYXRpb24gKSB7IC8vIExvb2sgZm9yIERBVCBmaWxlIGluIHppcC4KCQkJCWlmICggdHJ1ZSA9PT0gJHppcGJ1ZGR5LT5maWxlX2V4aXN0cyggJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddLCAkcG9zc2libGVEYXRMb2NhdGlvbiwgJGxlYXZlX29wZW4gPSB0cnVlICkgKSB7CgkJCQkJJGRldGVjdGVkRGF0TG9jYXRpb24gPSAkcG9zc2libGVEYXRMb2NhdGlvbjsKCQkJCQlicmVhazsKCQkJCX0KCQkJfSAvLyBlbmQgZm9yZWFjaC4KCQl9CgkJaWYgKCAnJyA9PSAkZGV0ZWN0ZWREYXRMb2NhdGlvbiApIHsKCQkJcmV0dXJuICR0aGlzLT5fZXJyb3IoICdVbmFibGUgdG8gZGV0ZXJtaW5lIERBVCBmaWxlIGxvY2F0aW9uLiBJdCBtYXkgYmUgbWlzc2luZyBPUiB0aGUgYmFja3VwIHppcCBmaWxlIG1heSBiZSBpbmNvbXBsZXRlIG9yIGNvcnJ1cHRlZC4gVmVyaWZ5IHRoZSBiYWNrdXAgemlwIGhhcyBmdWxseSB1cGxvYWRlZCBvciByZS11cGxvYWQgaXQuIFlvdSBjYW4gdHJ5IG1hbnVhbGx5IHVuemlwcGluZyB0aGVuIHNlbGVjdGluZyB0aGUgYWR2YW5jZWQgb3B0aW9uIHRvIHNraXAgdW56aXAuJyApOwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb25maXJtZWQgREFUIGZpbGUgbG9jYXRpb246IGAnIC4gJGRldGVjdGVkRGF0TG9jYXRpb24gLiAnYC4nICk7CgkJJHRoaXMtPl9zdGF0ZVsnZGF0TG9jYXRpb24nXSA9ICRkZXRlY3RlZERhdExvY2F0aW9uOwoJCQoJCXVuc2V0KCAkbWV0YUluZm8gKTsgLy8gTm8gbG9uZ2VyIG5lZWQgYW55dGhpbmcgZnJvbSB0aGUgbWV0YSBpbmZvcm1hdGlvbi4KCQkKCQlpZiAoIHRydWUgIT09ICRza2lwVW56aXAgKSB7CgkJCWZ1bmN0aW9uIG1rZGlyX3JlY3Vyc2l2ZSggJHBhdGggKSB7CgkJCQlpZiAoIGVtcHR5KCAkcGF0aCApICkgeyAvLyBwcmV2ZW50IGluZmluaXRlIGxvb3Agb24gYmFkIHBhdGgKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlpc19kaXIoIGRpcm5hbWUoICRwYXRoICkgKSB8fCBta2Rpcl9yZWN1cnNpdmUoIGRpcm5hbWUoICRwYXRoICkgKTsKCQkJCXJldHVybiBpc19kaXIoICRwYXRoICkgfHwgbWtkaXIoICRwYXRoICk7CgkJCX0KCQkJCgkJCS8vIExvYWQgREFUIGZpbGUgY29udGVudHMuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NyZWF0aW5nIHRlbXBvcmFyeSBmaWxlIGRpcmVjdG9yeSBgJyAuICR0aGlzLT5fc3RhdGVbJ3RlbXBQYXRoJ10gLiAnYC4nICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+dW5saW5rX3JlY3Vyc2l2ZSggJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSApOyAvLyBSZW1vdmUgaWYgYWxyZWFkeSBleGlzdHMuCgkJCW1rZGlyX3JlY3Vyc2l2ZSggJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSApOyAvLyBNYWtlIGVtcHR5IGRpcmVjdG9yeS4KCQkJCgkJCS8vIFJlc3RvcmUgREFUIGZpbGUuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4dHJhY3RpbmcgREFUIGZpbGUuJyApOwoJCQkkZmlsZXMgPSBhcnJheSggJGRldGVjdGVkRGF0TG9jYXRpb24gPT4gJ2JhY2t1cGJ1ZGR5X2RhdC5waHAnICk7CgkJCXJlcXVpcmUoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL19yZXN0b3JlRmlsZXMucGhwJyApOwoJCQkkcmVzdWx0ID0gYmFja3VwYnVkZHlfcmVzdG9yZV9maWxlczo6cmVzdG9yZSggJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddLCAkZmlsZXMsICR0aGlzLT5fc3RhdGVbJ3RlbXBQYXRoJ10sICR6aXBidWRkeSApOwoJCQllY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+alF1ZXJ5KCIjcGJfYmFja3VwYnVkZHlfd29ya2luZyIpLmhpZGUoKTs8L3NjcmlwdD4nOwoJCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjODU0ODQ6IFVuYWJsZSB0byByZXRyaWV2ZSBEQVQgZmlsZS4gVGhpcyBpcyBhIGZhdGFsIGVycm9yLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJJGRhdEZpbGUgPSAkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddIC4gJ2JhY2t1cGJ1ZGR5X2RhdC5waHAnOwoJCX0gZWxzZSB7CgkJCSRkYXRGaWxlID0gJHRoaXMtPl9zdGF0ZVsnZGF0TG9jYXRpb24nXTsKCQl9CgkJCgkJaWYgKCBmYWxzZSA9PT0gKCAkZGF0RGF0YSA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9kYXRfZmlsZV9hcnJheSggJGRhdEZpbGUgKSApICkgewoJCQkkdGhpcy0+X2Vycm9yKCAnRXJyb3IgIzQ4Mzk0ODQ6IFVuYWJsZSB0byByZXRyaWV2ZSBEQVQgZmlsZS4gVGhlIGJhY2t1cCBtYXkgaGF2ZSBmYWlsZWQgb3BlbmluZyBkdWUgdG8gbGFjayBvZiBtZW1vcnksIHBlcm1pc3Npb25zIGlzc3Vlcywgb3Igb3RoZXIgcmVhc29uLiBVc2UgSW1wb3J0QnVkZHkgdG8gcmVzdG9yZSBvciBjaGVjayB0aGUgQWR2YW5jZWQgTG9nIGFib3ZlIGZvciBkZXRhaWxzLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkkdGhpcy0+X3N0YXRlWydkYXQnXSA9ICRkYXREYXRhOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RBVCBmaWxlIGV4dHJhY3RlZC4nICk7CgkJCgkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiAoIHRydWUgPT09IFBCX1NUQU5EQUxPTkUgKSApIHsKCQkJJHNpbXBsZVZlcnNpb24gPSBzdWJzdHIoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddLCAwLCBzdHJwb3MoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYmJfdmVyc2lvbiddLCAnICcgKSApOwoJCQlpZiAoIGlzc2V0KCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnYmFja3VwYnVkZHlfdmVyc2lvbiddICkgJiYgKCB2ZXJzaW9uX2NvbXBhcmUoICR0aGlzLT5fc3RhdGVbJ2RhdCddWydiYWNrdXBidWRkeV92ZXJzaW9uJ10sICRzaW1wbGVWZXJzaW9uLCAnPicgKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1dhcm5pbmc6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byByZXN0b3JlIGFuIGFyY2hpdmUgd2hpY2ggd2FzIGNyZWF0ZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgQmFja3VwQnVkZHkgKCcgLiAkdGhpcy0+X3N0YXRlWydkYXQnXVsnYmFja3VwYnVkZHlfdmVyc2lvbiddIC4gJykgdGhhbiB0aGlzIEltcG9ydEJ1ZGR5ICgnIC4gJHNpbXBsZVZlcnNpb24gLiAnKS4gRm9yIGJlc3QgcmVzdWx0cyB1c2UgYW4gSW1wb3J0QnVkZHkgdGhhdCBpcyBhcyBsZWFzdCBhcyB1cCB0byBkYXRlIGFzIHRoZSBCYWNrdXBCdWRkeSB3aGljaCBjcmVhdGVkIHRoZSBhcmNoaXZlLicgKTsKCQkJfQoJCX0KCQkKCQlpZiAoICdyb2xsYmFjaycgPT0gJHRoaXMtPl9zdGF0ZVsndHlwZSddICkgewoJCQlpZiAoIHNpdGVfdXJsKCkgIT0gJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3NpdGV1cmwnXSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoIF9fKCAnRXJyb3IgIzU4NDk4NDM6IFNpdGUgVVJMIGRvZXMgbm90IG1hdGNoLiBZb3UgY2Fubm90IHJvbGwgYmFjayB0aGUgZGF0YWJhc2UgaWYgdGhlIFVSTCBoYXMgY2hhbmdlZCBvciBmb3IgYmFja3VwcyBvciBhbm90aGVyIHNpdGUuIFVzZSBpbXBvcnRidWRkeS5waHAgdG8gcmVzdG9yZSBvciBtaWdyYXRlIGluc3RlYWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJZ2xvYmFsICR3cGRiOwoJCQlpZiAoICR0aGlzLT5fc3RhdGVbJ2RhdCddWydkYl9wcmVmaXgnXSAhPSAkd3BkYi0+cHJlZml4ICkgewoJCQkJJHRoaXMtPl9lcnJvciggX18oICdFcnJvciAjMjM4OTM5NDogRGF0YWJhc2UgcHJlZml4IGRvZXMgbm90IG1hdGNoLiBZb3UgY2Fubm90IHJvbGwgYmFjayB0aGUgZGF0YWJhc2UgaWYgdGhlIGRhdGFiYXNlIHByZWZpeCBoYXMgY2hhbmdlZCBvciBmb3IgYmFja3VwcyBvciBhbm90aGVyIHNpdGUuIFVzZSBpbXBvcnRidWRkeS5waHAgdG8gcmVzdG9yZSBvciBtaWdyYXRlIGluc3RlYWQuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyb2xsYmFja19jbGVhbnVwcyddWyAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSBdID0gdGltZSgpOwoJCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoJCQkKCQkJLy8gR2VuZXJhdGUgVU5ETyBzY3JpcHQuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0dlbmVyYXRpbmcgdW5kbyBzY3JpcHQuJyApOwoJCQkkdGhpcy0+X3N0YXRlWyd1bmRvRmlsZSddID0gJ2JhY2t1cGJ1ZGR5X3JvbGxiYWNrX3VuZG8tJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddIC4gJy5waHAnOwoJCQkkdW5kb1VSTCA9IHJ0cmltKCBzaXRlX3VybCgpLCAnL1xcJyApIC4gJy8nIC4gJHRoaXMtPl9zdGF0ZVsndW5kb0ZpbGUnXTsKCQkJaWYgKCBmYWxzZSA9PT0gY29weSggZGlybmFtZSggX19GSUxFX18gKSAuICcvX3JvbGxiYWNrX3VuZG8ucGhwJywgQUJTUEFUSCAuICR0aGlzLT5fc3RhdGVbJ3VuZG9GaWxlJ10gKSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoIF9fKCAnV2FybmluZzogVW5hYmxlIHRvIGNyZWF0ZSB1bmRvIHNjcmlwdCBpbiBzaXRlIHJvb3QuIFlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGF1dG9tYXRlZCB1bmRvaW5nIHRoZSByb2xsYmFjayBpZiBzb21ldGhpbmcgZmFpbHMgc28gQmFja3VwQnVkZHkgd2lsbCBub3QgY29udGludWUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQkkdGhpcy0+X3N0YXRlWyd1bmRvVVJMJ10gPSAkdW5kb1VSTDsKCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgc3RhcnRpbmcgZnVuY3Rpb24uJyApOwoJCXJldHVybiB0cnVlOwoJfSAvLyBFbmQgc3RhcnQoKS4KCQoJCgkKCS8qIGV4dHJhY3REYXRhYmFzZSgpCgkgKgoJICogUk9MTEJBQ0ssIFJFU1RPUkUKCSAqIEV4dHJhY3RzIGRhdGFiYXNlIGZpbGUocykgaW50byB0ZW1wIGRpci4KCSAqCgkgKiBAcGFyYW0JYm9vbAkJdHJ1ZSBvbiBzdWNjZXNzLCBlbHNlIGZhbHNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdERhdGFiYXNlKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQkKCQlkaWUoICcgRVJST1IgIzM0ODQzNzg0Mzc4NDogREVQUkVDQVRFRCBGVU5DVElPTiBDQUxMISAnICk7CgkJCgkJCgkJJHRoaXMtPl9wcmlvclJvbGxiYWNrQ2xlYW51cCgpOwoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xvYWRpbmcgemlwYnVkZHkuJyApOwoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi96aXBidWRkeS96aXBidWRkeS5waHAnICk7CgkJJHppcGJ1ZGR5ID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBkaXJuYW1lKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10gKSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ppcGJ1ZGR5IGxvYWRlZC4nICk7CgkJCgkJLy8gRmluZCBTUUwgZmlsZSBsb2NhdGlvbiBpbiBhcmNoaXZlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhbGN1bGF0aW5nIHBvc3NpYmxlIFNRTCBmaWxlIGxvY2F0aW9ucy4nICk7CgkJJGRldGVjdGVkU1FMTG9jYXRpb24gPSAnJzsKCQkkcG9zc2libGVTUUxMb2NhdGlvbnMgPSBhcnJheSgpOwoJCQoJCSRwb3NzaWJsZVNRTExvY2F0aW9uc1tdID0gdHJpbSggcnRyaW0oIHN0cl9yZXBsYWNlKCAnYmFja3VwYnVkZHlfZGF0LnBocCcsICcnLCAkdGhpcy0+X3N0YXRlWydkYXRMb2NhdGlvbiddICksICdcXC8nICkgLiAnL2RiXzEuc3FsJywgJ1xcLycgKTsgLy8gU1FMIGZpbGUgbW9zdCBsaWtlbHkgaXMgaW4gdGhlIHNhbWUgc3BvdCB0aGUgZGF0IGZpbGUgd2FzLgoJCSRwb3NzaWJsZVNRTExvY2F0aW9uc1tdID0gJ2RiXzEuc3FsJzsgLy8gREIgYmFja3VwLiB2Mi54KwoJCSRwb3NzaWJsZVNRTExvY2F0aW9uc1tdID0gJ3dwLWNvbnRlbnQvdXBsb2Fkcy9iYWNrdXBidWRkeV90ZW1wLycgLiAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSAuICcvZGJfMS5zcWwnOyAvLyBGdWxsIGJhY2t1cC4KCQkKCQkkcG9zc2libGVTUUxMb2NhdGlvbnNbXSA9ICdkYi5zcWwnOyAvLyBEQiBiYWNrdXAuIHYxLngKCQkkcG9zc2libGVTUUxMb2NhdGlvbnNbXSA9ICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnL2RiLnNxbCc7IC8vIEZ1bGwgYmFja3VwIHYxLnguCgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUG9zc2libGUgU1FMIGZpbGUgbG9jYXRpb25zOiBgJyAuIGltcGxvZGUoICc7JywgJHBvc3NpYmxlU1FMTG9jYXRpb25zICkgLiAnYC4nICk7CgkJJHBvc3NpYmxlU1FMTG9jYXRpb25zID0gYXJyYXlfdW5pcXVlKCAkcG9zc2libGVTUUxMb2NhdGlvbnMgKTsKCQlmb3JlYWNoKCAkcG9zc2libGVTUUxMb2NhdGlvbnMgYXMgJHBvc3NpYmxlU1FMTG9jYXRpb24gKSB7CgkJCWlmICggdHJ1ZSA9PT0gJHppcGJ1ZGR5LT5maWxlX2V4aXN0cyggJHRoaXMtPl9zdGF0ZVsnYXJjaGl2ZSddLCAkcG9zc2libGVTUUxMb2NhdGlvbiwgJGxlYXZlX29wZW4gPSB0cnVlICkgKSB7CgkJCQkkZGV0ZWN0ZWRTUUxMb2NhdGlvbiA9ICRwb3NzaWJsZVNRTExvY2F0aW9uOwoJCQkJYnJlYWs7CgkJCX0KCQl9IC8vIGVuZCBmb3JlYWNoLgoJCQoJCWlmICggJycgPT0gJGRldGVjdGVkU1FMTG9jYXRpb24gKSB7CgkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjODQ4Mzc4MzogVW5hYmxlIHRvIGZpbmQgU1FMIGZpbGUocykgbG9jYXRpb24uJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NvbmZpcm1lZCBTUUwgZmlsZSBsb2NhdGlvbjogYCcgLiAkZGV0ZWN0ZWRTUUxMb2NhdGlvbiAuICdgLicgKTsKCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGUnXSA9ICRkZXRlY3RlZFNRTExvY2F0aW9uOwoJCQoJCS8vIEdldCBTUUwgZmlsZS4KCQkkZmlsZXMgPSBhcnJheSggJGRldGVjdGVkU1FMTG9jYXRpb24gPT4gJ2RiXzEuc3FsJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+dW5saW5rX3JlY3Vyc2l2ZSggJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSApOyAvLyBSZW1vdmUgaWYgYWxyZWFkeSBleGlzdHMuCgkJbWtkaXIoICR0aGlzLT5fc3RhdGVbJ3RlbXBQYXRoJ10gKTsgLy8gTWFrZSBlbXB0eSBkaXJlY3RvcnkuCgkJcmVxdWlyZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvX3Jlc3RvcmVGaWxlcy5waHAnICk7CgkJCgkJLy8gRXh0cmFjdCBTUUwgZmlsZS4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeHRyYWN0aW5nIFNRTCBmaWxlKHMpLicgKTsKCQlpZiAoIGZhbHNlID09PSBiYWNrdXBidWRkeV9yZXN0b3JlX2ZpbGVzOjpyZXN0b3JlKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10sICRmaWxlcywgJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSwgJHppcGJ1ZGR5ICkgKSB7CgkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjODUzODQ6IFVuYWJsZSB0byByZXN0b3JlIG9uZSBvciBtb3JlIGRhdGFiYXNlIGZpbGVzLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBkYXRhYmFzZSBleHRyYWN0aW9uIGZ1bmN0aW9uLicgKTsKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIGV4dHJhY3REYXRhYmFzZSgpLgoJCgkKCQoJcHVibGljIGZ1bmN0aW9uIGRldGVybWluZURhdGFiYXNlRmlsZXMoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCS8vIFRyeSB0byBmaW5kIFNRTCBmaWxlIHNpbmNlIGl0IGhhcyBub3QgYmVlbiBmb3VuZCB5ZXQuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGV0ZXJtaW5pbmcgU1FMIGZpbGUgbG9jYXRpb24uLi4nICk7CgkJCgkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlc0xvY2F0aW9uJ10gPSAnJzsKCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzJ10gPSBhcnJheSgpOwoJCQoJCSRwb3NzaWJsZV9zcWxfZmlsZV9wYXRocyA9IGFycmF5KCAvLyBQb3NzaWJsZSBsb2NhdGlvbnMgb2YgLlNRTCBmaWxlLiBMb29rIGZvciBTUUwgZmlsZXMgaW4gcm9vdCBMQVNUIGluIGNhc2UgdXNlciBsZWZ0IGZpbGVzIHRoZXJlLgoJCQkkdGhpcy0+X3N0YXRlWydyZXN0b3JlRmlsZVJvb3QnXSAuICd3cC1jb250ZW50L3VwbG9hZHMvdGVtcF8nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnLycsCQkJCS8vIEZ1bGwgYmFja3VwIDwgdjIuMC4KCQkJJHRoaXMtPl9zdGF0ZVsncmVzdG9yZUZpbGVSb290J10gLiAnd3AtY29udGVudC91cGxvYWRzL2JhY2t1cGJ1ZGR5X3RlbXAvJyAuICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddIC4gJy8nLAkvLyBGdWxsIGJhY2t1cCA+PSB2Mi4wLgoJCQkkdGhpcy0+X3N0YXRlWyd0ZW1wUGF0aCddLAkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIERldGVybWluZWQgZnJvbSBkZXRlY3RpbmcgREFUIGZpbGUuIFNob3VsZCBhbHdheXMgYmUgdGhlIGxvY2F0aW9uIHJlYWxseS4uLiBBcyBvZiB2NC4xLgoJCQkkdGhpcy0+X3N0YXRlWydyZXN0b3JlRmlsZVJvb3QnXSwJCQkJCQkJCQkJCQkJCQkJCQkJLy8gRGF0YWJhc2UgYmFja3VwIDwgdjIuMC4KCQkpOwoJCSRmb3VuZFNRTCA9IGZhbHNlOwoJCQoJCWZvcmVhY2goICRwb3NzaWJsZV9zcWxfZmlsZV9wYXRocyBhcyAkcG9zc2libGVfc3FsX2ZpbGVfcGF0aCApIHsgLy8gQ2hlY2sgZWFjaCBmaWxlIGxvY2F0aW9uIHRvIHNlZSB3aGljaCBoaXRzLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb29raW5nIGZvciBTUUwgZmlsZXMgaW4gYCcgLiAkcG9zc2libGVfc3FsX2ZpbGVfcGF0aCAuICdgLicgKTsKCQkJJHBvc3NpYmxlX3NxbF9maWxlcyA9IGdsb2IoICRwb3NzaWJsZV9zcWxfZmlsZV9wYXRoIC4gJyouc3FsJyApOwoJCQlpZiAoIGlzX2FycmF5KCAkcG9zc2libGVfc3FsX2ZpbGVzICkgJiYgKCBjb3VudCggJHBvc3NpYmxlX3NxbF9maWxlcyApID4gMCApICkgeyAvLyBGb3VuZCBTUUwgZmlsZXMgaGVyZS4KCQkJCSR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXNMb2NhdGlvbiddID0gJHBvc3NpYmxlX3NxbF9maWxlX3BhdGg7CgkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzJ10gPSBhcnJheV9tYXAoICdiYXNlbmFtZScsICRwb3NzaWJsZV9zcWxfZmlsZXMgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvdW5kICcgLiBjb3VudCggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydzcWxGaWxlcyddICkgLiAnIFNRTCBmaWxlcyBpbiBgJyAuICRwb3NzaWJsZV9zcWxfZmlsZV9wYXRoIC4gJ2AuJyApOwoJCQkJYnJlYWs7CgkJCX0KCQl9IC8vIEVuZCBmb3JlYWNoKCkuCgkJdW5zZXQoICRwb3NzaWJsZV9zcWxfZmlsZV9wYXRocyApOwoJCQoJCWlmICggZmFsc2UgIT09ICR0aGlzLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlcyddICkgewoJCQlpZiAoIGNvdW50KCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzJ10gKSA9PSAwICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBmaW5kIGRiXzEuc3FsIG9yIG90aGVyIGV4cGVjdGVkIGRhdGFiYXNlIGZpbGUgaW4gdGhlIGV4dHJhY3RlZCBmaWxlcyBpbiB0aGUgZXhwZWN0ZWQgbG9jYXRpb24uIE1ha2Ugc3VyZSB5b3UgZGlkIG5vdCByZW5hbWUgeW91ciBiYWNrdXAgWklQIGZpbGUuIFlvdSBtYXkgbWFudWFsbHkgcmVzdG9yZSB5b3VyIFNRTCBmaWxlIGlmIHlvdSBjYW4gZmluZCBpdCB2aWEgcGhwbXlhZG1pbiBvciBzaW1pbGFyIHRvb2wgdGhlbiBvbiBTdGVwIDEgb2YgSW1wb3J0QnVkZHkgc2VsZWN0IHRoZSBhZHZhbmNlZCBvcHRpb24gdG8gc2tpcCBkYXRhYmFzZSBpbXBvcnQuIFRoaXMgd2lsbCBhbGxvdyB5b3UgdG8gcHJvY2VlZC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTUUwgZmlsZXMgZm91bmQuIEZpbmlzaGVkIGRldGVybWluaW5nIGRhdGFiYXNlIGZpbGVzLicgKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJfSAvLyBFbmQgZGV0ZXJtaW5lRGF0YWJhc2VGaWxlcygpLgoJCgkKCQoJLyogcmVzdG9yZURhdGFiYXNlKCkKCSAqCgkgKiBST0xMQkFDSywgUkVTVE9SRQoJICogUmVuYW1lcyBleGlzdGluZyB0YWJsZXMgdGhlbiBpbXBvcnRzIHRoZSBkYXRhYmFzZSBTUUwgZGF0YSBpbnRvIG15c3FsLiBUdXJucyBvbiBtYWludGVuYW5jZSBtb2RlIGR1cmluZyB0aGlzLgoJICoKCSA4IEBwYXJhbQlzdHJpbmcJCSRvdmVycmlkZVByZWZpeAkJSWYgbm90IGVtcHR5IHN0cmluZyB0aGVuIHVzZSB0aGlzIGRiIHByZWZpeCBpbnNlYWQgb2YgdGhlIG9uZSBzZXQgaW4gdGhlIHN0YXRlIGRhdGEuCgkgKiBAcmV0dXJuCWJvb2x8YXJyYXkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUsIE9SIGFycmF5IGlmIGNodW5raW5nIG5lZWRlZCBmb3IgREIgY29udGludWF0aW9uLiBjaHVua3MgbWlkLWRiIHRhYmxlIGltcG9ydCBhbmQvb3IgZm9yIGVhY2ggaW5kaXZpZHVhbCAuc3FsIGZpbGUuIGRlcGVuZHMgb24gbWV0aG9kLCBydW50aW1lIGxlZnQsIGV0Yy4gc2VlIG15c3FsYnVkZHkgZm9yIGNodW5raW5nIGRldGFpbHMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZXN0b3JlRGF0YWJhc2UoICRvdmVycmlkZVByZWZpeCA9ICcnICkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQlnbG9iYWwgJHdwZGI7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzdG9yaW5nIGRhdGFiYXNlIHRhYmxlcy4nICk7CgkJCgkJaWYgKCAhaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXNMb2NhdGlvbiddICkgfHwgKCAnJyA9PSAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzTG9jYXRpb24nXSApICkgewoJCQkkdGhpcy0+ZGV0ZXJtaW5lRGF0YWJhc2VGaWxlcygpOwoJCX0KCQkKCQlpZiAoICdyb2xsYmFjaycgPT0gJHRoaXMtPl9zdGF0ZVsndHlwZSddICkgewoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddID0gREJfSE9TVDsKCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydkYXRhYmFzZSddID0gREJfTkFNRTsKCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd1c2VybmFtZSddID0gREJfVVNFUjsKCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwYXNzd29yZCddID0gREJfUEFTU1dPUkQ7CgkJCQoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddID0gJ0JCbmV3LScgLiBzdWJzdHIoICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddLCAwLCA0ICkgLiAnXyc7CgkJCQoJCQkkZm9yY2VNeXNxbE1ldGhvZHMgPSBhcnJheSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkYXRhYmFzZV9tZXRob2Rfc3RyYXRlZ3knXSApOwoJCX0KCQkKCQkKCQkvLyBBbGxvdyBvdmVycmlkaW5nIHByZWZpeCBpbiBwYXJhbWV0ZXJzLgoJCWlmICggJycgPT0gJG92ZXJyaWRlUHJlZml4ICkgewoJCQkkaW1wb3J0UHJlZml4ID0gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsKCQl9IGVsc2UgewoJCQkkaW1wb3J0UHJlZml4ID0gJG92ZXJyaWRlUHJlZml4OwoJCX0KCQkKCQkKCQkKCQkvLyBEZXRlcm1pbmUgZGF0YWJhc2Ugc3RyYXRlZ3kuCgkJaWYgKCAncGhwJyA9PSAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RhdGFiYXNlTWV0aG9kU3RyYXRlZ3knXSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWV0aG9kIHNldCB0byBQSFAgb25seS4nICk7CgkJCSRmb3JjZU15c3FsTWV0aG9kcyA9IGFycmF5KCAncGhwJyApOwoJCX0gZWxzZWlmICggJ2NvbW1hbmRsaW5lJyA9PSAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RhdGFiYXNlTWV0aG9kU3RyYXRlZ3knXSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWV0aG9kIHNldCB0byBjb21tYW5kIGxpbmUgb25seS4nICk7CgkJCSRmb3JjZU15c3FsTWV0aG9kcyA9IGFycmF5KCAnY29tbWFuZGxpbmUnICk7CgkJfSBlbHNlaWYgKCAnYWxsJyA9PSAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RhdGFiYXNlTWV0aG9kU3RyYXRlZ3knXSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgbWV0aG9kIHNldCB0byBhbGwgLS0gdXNpbmcgaW4gcHJlZmVycmVkIG9yZGVyOiBwaHAsIGNvbW1hbmRsaW5lLicgKTsKCQkJJGZvcmNlTXlzcWxNZXRob2RzID0gYXJyYXkoICdwaHAnLCAnY29tbWFuZGxpbmUnICk7CgkJfSBlbHNlIHsgLy8gTm90IHBhc3NlZCBmb3Igc29tZSBvZGQgcmVhc29uPyBTZXQgZGVmYXVsdC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnRGF0YWJhc2UgbWV0aG9kIG5vdCBwYXNzZWQgdGhvdWdoIGV4cGVjdGVkLiBVc2luZyBkZWZhdWx0IG9mIFBIUCBvbmx5LicgKTsKCQkJJGZvcmNlTXlzcWxNZXRob2RzID0gYXJyYXkoICdwaHAnICk7CgkJfQoJCQoJCQoJCS8vIEluaXRpYWxpemUgbXlzcWxidWRkeS4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvbXlzcWxidWRkeS9teXNxbGJ1ZGR5LnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ215c3FsYnVkZHknXSA9IG5ldyBwYl9iYWNrdXBidWRkeV9teXNxbGJ1ZGR5KCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddLCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RhdGFiYXNlJ10sICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsndXNlcm5hbWUnXSwgJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwYXNzd29yZCddLCAkaW1wb3J0UHJlZml4LCAkZm9yY2VNeXNxbE1ldGhvZHMsICR0aGlzLT5fc3RhdGVbJ21heEV4ZWN1dGlvblRpbWUnXSApOyAvLyAkZGF0YWJhc2VfaG9zdCwgJGRhdGFiYXNlX25hbWUsICRkYXRhYmFzZV91c2VyLCAkZGF0YWJhc2VfcGFzcywgJG9sZF9wcmVmaXgsICRmb3JjZV9tZXRob2QgPSBhcnJheSgpCgkJCgkJCgkJLy8gUmVzdG9yZSBlYWNoIFNRTCBmaWxlIGFzIGl0cyBvd24gcGFnZSBsb2FkLgoJCWlmICggIWlzc2V0KCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZUZpbGVzJ10gKSApIHsgLy8gRmlyc3QgcGFzcyBzbyBwb3B1bGF0ZSBsaXN0IG9mIFNRTCBmaWxlcyBuZWVkaW5nIGltcG9ydGVkLgoJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZUZpbGVzJ10gPSAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NxbEZpbGVzJ107CgkJfQoJCSRmaWxlc1JlbWFpbmluZyA9ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lRmlsZXMnXTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTUUwgZmlsZXMgdG8gaW1wb3J0OiAnIC4gY291bnQoICRmaWxlc1JlbWFpbmluZyApICk7CgkJZm9yZWFjaCggJGZpbGVzUmVtYWluaW5nIGFzICRzcWxfZmlsZSApIHsKCQkJJGZ1bGxfZmlsZSA9ICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnc3FsRmlsZXNMb2NhdGlvbiddIC4gJHNxbF9maWxlOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdJbXBvcnRpbmcgU1FMIGZpbGUgYCcgLiBiYXNlbmFtZSggJHNxbF9maWxlICkgLiAnYCAoc2l6ZTogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoIEBmaWxlc2l6ZSggJGZ1bGxfZmlsZSApICkgLiAnKS4nICk7CgkJCS8vIFRlbGwgbXlzcWxidWRkeSB0byBJTVBPUlQgdGhlIFNRTCBmaWxlLgoJCQkkaW1wb3J0X3Jlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snbXlzcWxidWRkeSddLT5pbXBvcnQoICRmdWxsX2ZpbGUsICRvbGRQcmVmaXggPSAkdGhpcy0+X3N0YXRlWydkYXQnXVsnZGJfcHJlZml4J10sICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lUG9pbnQnXSwgJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpZ25vcmVTcWxFcnJvcnMnXSApOwoJCQkKCQkJaWYgKCBGQUxTRSA9PT0gJGltcG9ydF9yZXN1bHQgKSB7CgkJCQkkdGhpcy0+X2Vycm9yKCAnRXJyb3IgIzk1MzgzNDogUHJvYmxlbSBpbXBvcnRpbmcgZGF0YWJhc2UuIFNlZSBzdGF0dXMgbG9nIGFib3ZlIGZvciBkZXRhaWxzLicgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfSBlbHNlaWYgKCBUUlVFID09PSAkaW1wb3J0X3Jlc3VsdCApIHsgLy8gU3VjY2VzcyBvbiB0aGlzIFNRTCBmaWxlLgoJCQkJaWYgKCAnJyAhPSAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZVBvaW50J10gKSB7IC8vIENodW5raW5nIHdhcyB1c2VkLiBHaXZlIHNvbWUgc3RhdHMuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2h1bmtpbmcgaW1wb3J0ZWQgYCcgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lUm93cyddIC4gJ2Agcm93cyBpbiBgJyAuIHJvdW5kKCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lVGltZSddLCAzICkgLiAnYCBzZWNvbmRzLiBgJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVGYWlscyddIC4gJ2AgU1FMIHF1ZXJ5IGZhaWx1cmVzLicgKTsKCQkJCX0KCQkJCWFycmF5X3NoaWZ0KCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydFJlc3VtZUZpbGVzJ10gKTsgLy8gRmluaXNoZWQgdGhpcyB0YWJsZSBzbyB0YWtlIGl0IG9mZiB0aGUgc3RhY2suCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5pc2hlZCBpbXBvcnRpbmcgU1FMIGZpbGUgYCcgLiBiYXNlbmFtZSggJHNxbF9maWxlICkgLiAnYC4gRGF0YWJhc2UgZmlsZXMgcmVtYWluaW5nOiAnIC4gY291bnQoICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lRmlsZXMnXSApICk7CgkJCQlyZXR1cm4gYXJyYXkoKTsgLy8gQW55IGFycmF5IHJldHVybmVkIGhlcmUgcmVzdWx0cyBpbiByZXN1bWluZyB1c2luZyB0aGUgbGF0ZXN0IHN0YXRlIGRhdGEuIHNxbEZpbGVzUmVtYW5pbmcgaXMgd2hhdCB3ZSBjYXJlIGFib3V0IGtlZXBpbmcgdXAgdG8gZGF0ZSBvbiB3aGljaCBmaWxlIHRvIGRvLgoJCQl9IGVsc2UgeyAvLyBSZXN1bWVkIGNodW5raW5nIG5lZWRlZC4KCQkJCWlmICggISBpc19hcnJheSggJGltcG9ydF9yZXN1bHQgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzkzNDg0OiBFeHBlY3RlZCBhcnJheS4gR290OiBgJyAuICRpbXBvcnRfcmVzdWx0IC4gJ2AuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0gZWxzZSB7CgkJCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRSZXN1bWVQb2ludCddID0gJGltcG9ydF9yZXN1bHRbMF07CgkJCQkJJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydpbXBvcnRlZFJlc3VtZVJvd3MnXSArPSAkaW1wb3J0X3Jlc3VsdFsxXTsKCQkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lRmFpbHMnXSArPSAkaW1wb3J0X3Jlc3VsdFsyXTsKCQkJCQkkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lVGltZSddICs9ICRpbXBvcnRfcmVzdWx0WzNdOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIGltcG9ydCBub3QgeWV0IGZpbmlzaGVkLiBSZXN1bWUgbmV4dCBhdCBgJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0UmVzdW1lUG9pbnQnXSAuICdgLicgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTbyBmYXIgaW1wb3J0ZWQgYCcgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lUm93cyddIC4gJ2Agcm93cyBpbiBgJyAuIHJvdW5kKCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2ltcG9ydGVkUmVzdW1lVGltZSddLCAzICkgLiAnYCBzZWNvbmRzLiBgJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnaW1wb3J0ZWRSZXN1bWVGYWlscyddIC4gJ2AgU1FMIHF1ZXJ5IGZhaWx1cmVzLicgKTsKCQkJCQlyZXR1cm4gJGltcG9ydF9yZXN1bHQ7CgkJCQl9CgkJCX0KCQkJCgkJCQoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSByZXN0b3JlIGZpbmlzaGVkIGltcG9ydGluZyBhbGwgU1FMIGZpbGVzLicgKTsKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHJlc3RvcmVEYXRhYmFzZSgpLgoJCgkKCQoJcHVibGljIGZ1bmN0aW9uIHN3YXBEYXRhYmFzZUJCU2V0dGluZ3MoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCWlmICggJ2RlcGxveScgIT0gJHRoaXMtPl9zdGF0ZVsndHlwZSddICkgewoJCQlyZXR1cm4gJHRoaXMtPl9lcnJvciggJ1RoaXMgcmVzdG9yZSB0eXBlIGAnIC4gJHRoaXMtPl9zdGF0ZVsndHlwZSddIC4gJ2AgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbi4nICk7CgkJfQoJCQoJCS8vIENhbGN1bGF0ZSB0ZW1wb3JhcnkgdGFibGUgcHJlZml4ZXMuCgkJJG5ld1ByZWZpeCA9ICdCQm5ldy0nIC4gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSwgMCwgNCApIC4gJ18nIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsgLy8gSW5jb21pbmcgc2l0ZS4KCQkkb2xkUHJlZml4ID0gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwcmVmaXgnXTsgLy8gQ3VycmVudCBsaXZlIHNpdGUgcHJlZml4LgoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NvcHlpbmcgQmFja3VwQnVkZHkgc2V0dGluZ3MgZnJvbSBvcHRpb25zIHRhYmxlIHByZWZpeGVkIHdpdGggYCcgLiAkb2xkUHJlZml4IC4gJ2AgdG8gYCcgLiAkbmV3UHJlZml4IC4gJ2AuJyApOwoJCQoJCWdsb2JhbCAkd3BkYjsKCQkKCQkvLyBHZXQgY3VycmVudCBCYWNrdXBCdWRkeSBzZXR0aW5ncyBmb3IgY3VycmVudCBzaXRlLgoJCSRzcWwgPSAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NIGB7JG9sZFByZWZpeH1vcHRpb25zYCBXSEVSRSBvcHRpb25fbmFtZT0ncGJfYmFja3VwYnVkZHknOyI7CgkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICRzcWwsIEFSUkFZX0EgKTsKCQlpZiAoIDAgPT0gY291bnQoICRyZXN1bHRzICkgKSB7CgkJCXJldHVybiAkdGhpcy0+X2Vycm9yKCAnRXJyb3IgIzg0NDczNDc6IEVycm9yIGdldHRpbmcgY3VycmVudCBCYWNrdXBCdWRkeSBzZXR0aW5ncy4gU1FMIFF1ZXJ5OiAnIC4gaHRtbGVudGl0aWVzKCAkc3FsICkgKTsKCQl9CgkJCgkJLy8gT3ZlcndyaXRlIGluY29taW5nIHNpdGUgQmFja3VwQnVkZHkgc2V0dGluZ3MgaW4gaXRzIHRlbXAgdGFibGUuCgkJaWYgKCBmYWxzZSA9PT0gJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGB7JG5ld1ByZWZpeH1vcHRpb25zYCBTRVQgb3B0aW9uX3ZhbHVlPSciIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRyZXN1bHRzWzBdWydvcHRpb25fdmFsdWUnXSApIC4gIicgV0hFUkUgb3B0aW9uX25hbWU9J3BiX2JhY2t1cGJ1ZGR5JzsiICkgKSB7CgkJCXJldHVybiAkdGhpcy0+X2Vycm9yKCAnRXJyb3IgIzM3MjgzNzY4MzogVW5hYmxlIHRvIGNvcHkgb3ZlciBCYWNrdXBCdWRkeSBzZXR0aW5ncyBmcm9tIGxpdmUgc2l0ZSB0byBpbmNvbWluZyBkYXRhYmFzZSBpbiB0ZW1wIHRhYmxlLiBEZXRhaWxzOiBgJyAuICR3cGRiLT5sYXN0X2Vycm9yIC4gJ2AuJyApOwoJCX0KCQkKCQlyZXR1cm4gdHJ1ZTsKCQkKCX0gLy8gRW5kIHN3YXBEYXRhYmFzZUJCU2V0dGluZ3MoKS4KCQoJCgkvKiBzd2FwRGF0YWJhc2VzKCkKCSAqCgkgKiBST0xMQkFDSwoJICogU3dhcCBvdXQgdGhlIHJlY2VudGx5IGltcG9ydGVkIGRhdGFiYXNlIHRhYmxlcyB3aXRoIHRlbXAgcHJlZml4IGZvciB0aGUgbGl2ZSBkYXRhYmFzZS4KCSAqIFNldHMgbWFpbnRlbmFuY2UgbW9kZSBkdXJpbmcgdGhlIHN3YXAsIGFsdGhvdWdoIGl0IHNob3VsZCBiZSB2ZXJ5IGJyaWVmLgoJICoKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN3YXBEYXRhYmFzZXMoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCWlmICggKCAncm9sbGJhY2snICE9ICR0aGlzLT5fc3RhdGVbJ3R5cGUnXSApICYmICggJ2RlcGxveScgIT0gJHRoaXMtPl9zdGF0ZVsndHlwZSddICkgKSB7IC8vIFJlc3RvcmUgbW9kZSB1c2VkIGZvciByZXN0b3J5aW5nIGR1cmluZyBkZXBsb3ltZW50LgoJCQkkdGhpcy0+X2Vycm9yKCAnVGhpcyByZXN0b3JlIHR5cGUgYCcgLiAkdGhpcy0+X3N0YXRlWyd0eXBlJ10gLiAnYCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkvLyBUdXJuIG9uIG1haW50ZW5hbmNlIG1vZGUuCgkJaWYgKCBmYWxzZSA9PT0gJHRoaXMtPm1haW50ZW5hbmNlT24oKSApIHsKCQkJJHRoaXMtPl9lcnJvciggJ0NvdWxkIG5vdCBlbmFibGUgbWFpbnRlbmFuY2UgbW9kZS4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJZ2xvYmFsICR3cGRiOwoJCQoJCS8vIENhbGN1bGF0ZSB0ZW1wb3JhcnkgdGFibGUgcHJlZml4ZXMuCgkJJG5ld1ByZWZpeCA9ICdCQm5ldy0nIC4gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSwgMCwgNCApIC4gJ18nOyAvLyBUZW1wIHByZWZpeCBmb3IgaG9sZGluZyB0aGUgTkVXbHkgaW1wb3J0ZWQgZGF0YS4KCQkkb2xkUHJlZml4ID0gJ0JCb2xkLScgLiBzdWJzdHIoICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddLCAwLCA0ICkgLiAnXyc7IC8vIFRlbXAgcHJlZml4IGZvciBob2xkaW5nIHRoZSBPTEQgKGN1cnJlbnRseSBsaXZlKSBkYXRhLgoJCQoJCS8vIEdldCBuZXdseSBpbXBvcnRlZCB0YWJsZXMgd2l0aCB0aGUgdGVtcCBwcmVmaXguCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hlY2tpbmcgZm9yIG5ld2x5IGltcG9ydGVkIHJvbGxiYWNrIHRhYmxlcyB3aXRoIHRlbXAgcHJlZml4IGAnIC4gJG5ld1ByZWZpeCAuICdgLicgKTsKCQkkc3FsID0gIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9uYW1lIExJS0UgJyIgLiBzdHJfcmVwbGFjZSggJ18nLCAnXF8nLCAkbmV3UHJlZml4ICkgLiAiJScgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiOwoJCSRyZXN1bHRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAkc3FsLCBBUlJBWV9BICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRm91bmQgJyAuIGNvdW50KCAkcmVzdWx0cyApIC4gJyBtYXRjaGluZyB0YWJsZXMuJyApOwoJCWlmICggMCA9PSBjb3VudCggJHJlc3VsdHMgKSApIHsKCQkJJHRoaXMtPl9lcnJvciggJ0Vycm9yIGdldHRpbmcgdGFibGVzIG9yIG5vbmUgZm91bmQuIFNRTCBRdWVyeTogJyAuIGh0bWxlbnRpdGllcyggJHNxbCApICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gUmVuYW1lIG5ld2x5IGltcG9ydGVkIHRhYmxlcyB3aXRoIHRlbXAgcHJlZml4LCByZW5hbWluZyB0aGUgZXhpc3RpbmcgbGl2ZSB0YWJsZSBmaXJzdC4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW5hbWUgYWxsIGV4aXN0aW5nIHRhYmxlcyB3aXRoIHRoaXMgdGVtcCBwcmVmaXggdG8gcHJlZml4IGAnIC4gJHdwZGItPnByZWZpeCAuICdgLicgKTsKCQlmb3JlYWNoKCAkcmVzdWx0cyBhcyAkcmVzdWx0ICkgewoJCQkkbmV3VGFibGVOYW1lID0gc3RyX3JlcGxhY2UoICRuZXdQcmVmaXgsICcnLCAkd3BkYi0+cHJlZml4IC4gJHJlc3VsdFsndGFibGVfbmFtZSddICk7IC8vIHRoZSB0YXJnZXQgbmV3IHRhYmxlIG5hbWUgd2UgYXJlIGltcG9ydGluZy4KCQkJJG9sZFRhYmxlTmFtZSA9ICRvbGRQcmVmaXggLiAkbmV3VGFibGVOYW1lOyAvLyB0aGUgdGFyZ2V0IG5hbWUgZm9yIHRoZSBvbGQgdGFibGUgd2hlcmUgd2UgaG9sZCBpdCBpbiBjYXNlIGl0IG5lZWRzIHVuZG9pbmcuCgkJCQoJCQkvLyBSZW5hbWUgbGl2ZSBwcmVmaXggdG8gdGVtcCBvbGQgcHJlZml4IGZvciBwb3NzaWJsZSB1bmRvIChpZiBleGlzdHMpLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW5hbWluZyB0YWJsZSBgJyAuICRuZXdUYWJsZU5hbWUgLiAnYCAoaWYgZXhpc3RzKSB0byBgJyAuICRvbGRUYWJsZU5hbWUgLiAnYC4nICk7CgkJCWlmICggZmFsc2UgPT09ICR3cGRiLT5xdWVyeSggIlJFTkFNRSBUQUJMRSBgIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkbmV3VGFibGVOYW1lICkgLiAiYCBUTyBgIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkb2xkVGFibGVOYW1lICkgLiAiYDsiICkgKSB7CgkJCQkkdGhpcy0+X2Vycm9yKCAnRXJyb3IgIzg0NDM4OWE6IFVuYWJsZSB0byByZW5hbWUgdGFibGUgYCcgLiAkbmV3VGFibGVOYW1lIC4gJ2AgdG8gYCcgLiAkb2xkVGFibGVOYW1lIC4gJ2AuIERldGFpbHM6IGAnIC4gJHdwZGItPmxhc3RfZXJyb3IgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJCgkJCS8vIFJlbmFtZSBpbXBvcnRlZCB0YWJsZSB0byBsaXZlIHByZWZpeC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVuYW1pbmcgdGFibGUgYCcgLiAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gLiAnYCB0byBgJyAuICRuZXdUYWJsZU5hbWUgLiAnYC4nICk7CgkJCWlmICggZmFsc2UgPT09ICR3cGRiLT5xdWVyeSggIlJFTkFNRSBUQUJMRSBgIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gKSAuICJgIFRPIGAiIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRuZXdUYWJsZU5hbWUgKSAuICJgOyIgKSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdFcnJvciAjODQ0Mzg5YjogVW5hYmxlIHRvIHJlbmFtZSB0YWJsZSBgJyAuICRyZXN1bHRbJ3RhYmxlX25hbWUnXSAuICdgIHRvIGAnIC4gJG5ld1RhYmxlTmFtZSAuICdgLiBEZXRhaWxzOiBgJyAuICR3cGRiLT5sYXN0X2Vycm9yIC4gJ2AuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoJCQoJCS8vIFR1cm4gb2ZmIG1haW50ZW5hbmNlIG1vZGUuCgkJJHRoaXMtPm1haW50ZW5hbmNlT2ZmKCk7CgkJCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZAoJCgkKCQoJLyogZmluYWxpemVSb2xsYmFjaygpCgkgKgoJICogUk9MTEJBQ0sKCSAqIEZpbmFsaXplIHRoZSByb2xsYmFjaywgZGVsZXRpbmcgb3JpZ2luYWwgdGFibGVzICYgY2xlYW5pbmcgdXAgdGVtcCBmaWxlcy4KCSAqCgkgKiBAcmV0dXJuIHRydWUKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGZpbmFsaXplUm9sbGJhY2soKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCWdsb2JhbCAkd3BkYjsKCQkkc3FsID0gIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9uYW1lIExJS0UgJ0JCb2xkLSIgLiBzdWJzdHIoICR0aGlzLT5fc3RhdGVbJ3NlcmlhbCddLCAwLCA0ICkgLiAiXF8lJyBBTkQgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSI7CgkJLy9lY2hvICRzcWw7CgkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICRzcWwsIEFSUkFZX0EgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3VuZCAnIC4gY291bnQoICRyZXN1bHRzICkgLiAnIHRhYmxlcyB0byBkcm9wLicgKTsKCQlmb3JlYWNoKCAkcmVzdWx0cyBhcyAkcmVzdWx0ICkgewoJCQlpZiAoIGZhbHNlID09PSAkd3BkYi0+cXVlcnkoICJEUk9QIFRBQkxFIGAiIC4gYmFja3VwYnVkZHlfY29yZTo6ZGJFc2NhcGUoICRyZXN1bHRbJ3RhYmxlX25hbWUnXSApIC4gImAiICkgKSB7CgkJCQkkdGhpcy0+X2Vycm9yKCAnVW5hYmxlIHRvIGRlbGV0ZSBvbGQgdGFibGUgYCcgLiAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gLiAnYC4nICk7CgkJCX0KCQl9CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGVsZXRpbmcgdW5kbyBmaWxlLicgKTsKCQlAdW5saW5rKCBBQlNQQVRIIC4gJHRoaXMtPl9zdGF0ZVsndW5kb0ZpbGUnXSApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RlbGV0aW5nIHRlbXAgZmlsZXMuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+dW5saW5rX3JlY3Vyc2l2ZSggJHRoaXMtPl9zdGF0ZVsndGVtcFBhdGgnXSApOwoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIGZpbmFsaXplIGZ1bmN0aW9uLicgKTsKCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gZW5kIGZpbmFsaXplUm9sbGJhY2soKS4KCQoJCgkKCXB1YmxpYyBmdW5jdGlvbiByZXN0b3JlRmlsZXMoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCS8vIFppcCAmIFVuemlwIGxpYnJhcnkgc2V0dXAuCgkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10gPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoICR0aGlzLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlUm9vdCddLCBhcnJheSgpLCAndW56aXAnICk7CgkJCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10gKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBmaW5kIHNwZWNpZmllZCBiYWNrdXAgYXJjaGl2ZSBgJyAuICAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10gLiAnYCcgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdVbnppcHBpbmcgYXJjaGl2ZSBgJyAuICR0aGlzLT5fc3RhdGVbJ2FyY2hpdmUnXSAuICdgIGludG8gYCcgLiAkdGhpcy0+X3N0YXRlWydyZXN0b3JlRmlsZVJvb3QnXSAuICdgJyApOwoJCQoJCS8vIFNldCBjb21wYXRpYmlsaXR5IG1vZGUgaWYgZGVmaW5lZCBpbiBhZHZhbmNlZCBvcHRpb25zLgoJCWlmICggJ2FsbCcgPT0gJHRoaXMtPl9zdGF0ZVsnemlwTWV0aG9kU3RyYXRlZ3knXSApIHsKCQkJJGNvbXBhdGliaWxpdHlNb2RlID0gZmFsc2U7CgkJfSBlbHNlIHsKCQkJJGNvbXBhdGliaWxpdHlNb2RlID0gJHRoaXMtPl9zdGF0ZVsnemlwTWV0aG9kU3RyYXRlZ3knXTsKCQl9CgkJCgkJLy8gRXh0cmFjdCB6aXAgZmlsZSAmIHZlcmlmeSBpdCB3b3JrZWQuCgkJaWYgKCB0cnVlICE9PSAoICRyZXN1bHQgPSBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPnVuemlwKCAkdGhpcy0+X3N0YXRlWydhcmNoaXZlJ10sICR0aGlzLT5fc3RhdGVbJ3Jlc3RvcmVGaWxlUm9vdCddLCAkY29tcGF0aWJpbGl0eU1vZGUgKSApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRmFpbHVyZSBleHRyYWN0aW5nIGJhY2t1cCBhcmNoaXZlLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1N1Y2Nlc3MgZXh0cmFjdGluZyBiYWNrdXAgYXJjaGl2ZS4nICk7CgkJCXJldHVybiB0cnVlOwoJCX0KCQkKCX0gLy8gRW5kIHJlc3RvcmVGaWxlcygpLgoJCgkKCQoJLyogX3ByaW9yUm9sbGJhY2tDbGVhbnVwKCkKCSAqCgkgKiBST0xMQkFDSwoJICogQ2xlYW5zIHVwIGFueSBleGlzdGluZyB0ZW1wIGRhdGFiYXNlIHRhYmxlcyB0aGF0IGV4aXN0IGZyb20gYSBwcmlvciBmYWlsZWQvaW5jb21wbGV0ZSByb2xsYmFjayB0aGF0IG5lZWQgcmVtb3ZlZC4KCSAqCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX3ByaW9yUm9sbGJhY2tDbGVhbnVwKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaGVja2luZyBmb3IgYW55IHByaW9yIGZhaWxlZCByb2xsYmFjayBkYXRhIHRvIGNsZWFuIHVwLicgKTsKCQlnbG9iYWwgJHdwZGI7CgkJCgkJJHNob3J0U2VyaWFsID0gc3Vic3RyKCAkdGhpcy0+X3N0YXRlWydzZXJpYWwnXSwgMCwgNCApOwoJCQoJCS8vIE5FVyBwcmVmaXgKCQkkc3FsID0gIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9uYW1lIExJS0UgJ0JCbmV3LSIgLiAkc2hvcnRTZXJpYWwgLiAiXF8lJyBBTkQgdGFibGVfc2NoZW1hID0gREFUQUJBU0UoKSI7CgkJJHJlc3VsdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICRzcWwsIEFSUkFZX0EgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGb3VuZCAnIC4gY291bnQoICRyZXN1bHRzICkgLiAnIHRhYmxlcyB0byBkcm9wIHdpdGggdGhlIHByZWZpeCBgQkJuZXctJyAuICRzaG9ydFNlcmlhbCAuICdfYC4nICk7CgkJJGRyb3BDb3VudCA9IDA7CgkJZm9yZWFjaCggJHJlc3VsdHMgYXMgJHJlc3VsdCApIHsKCQkJaWYgKCBmYWxzZSA9PT0gJHdwZGItPnF1ZXJ5KCAiRFJPUCBUQUJMRSBgIiAuIGJhY2t1cGJ1ZGR5X2NvcmU6OmRiRXNjYXBlKCAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gKSAuICJgIiApICkgewoJCQkJJHRoaXMtPl9lcnJvciggJ1VuYWJsZSB0byBkZWxldGUgdGFibGUgYCcgLiAkcmVzdWx0Wyd0YWJsZV9uYW1lJ10gLiAnYC4nICk7CgkJCX0gZWxzZSB7CgkJCQkkZHJvcENvdW50Kys7CgkJCX0KCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHJvcHBlZCBgJyAuICRkcm9wQ291bnQgLiAnYCBuZXcgdGFibGVzLicgKTsKCQkKCQkvLyBPTEQgcHJlZml4CgkJJHNxbCA9ICJTRUxFQ1QgdGFibGVfbmFtZSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfbmFtZSBMSUtFICdCQm9sZC0iIC4gJHNob3J0U2VyaWFsIC4gIlxfJScgQU5EIHRhYmxlX3NjaGVtYSA9IERBVEFCQVNFKCkiOwoJCSRyZXN1bHRzID0gJHdwZGItPmdldF9yZXN1bHRzKCAkc3FsLCBBUlJBWV9BICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRm91bmQgJyAuIGNvdW50KCAkcmVzdWx0cyApIC4gJyB0YWJsZXMgdG8gZHJvcCB3aXRoIHRoZSBwcmVmaXggYEJCb2xkLScgLiAkc2hvcnRTZXJpYWwgLiAnX2AuJyApOwoJCSRkcm9wQ291bnQgPSAwOwoJCWZvcmVhY2goICRyZXN1bHRzIGFzICRyZXN1bHQgKSB7CgkJCWlmICggZmFsc2UgPT09ICR3cGRiLT5xdWVyeSggIkRST1AgVEFCTEUgYCIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJHJlc3VsdFsndGFibGVfbmFtZSddICkgLiAiYCIgKSApIHsKCQkJCSR0aGlzLT5fZXJyb3IoICdVbmFibGUgdG8gZGVsZXRlIHRhYmxlIGAnIC4gJHJlc3VsdFsndGFibGVfbmFtZSddIC4gJ2AuJyApOwoJCQl9IGVsc2UgewoJCQkJJGRyb3BDb3VudCsrOwoJCQl9CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Ryb3BwZWQgYCcgLiAkZHJvcENvdW50IC4gJ2Agb2xkIHRhYmxlcy4nICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluaXNoZWQgcHJpb3Igcm9sbGJhY2sgY2xlYW51cC4nICk7Cgl9IC8vIGVuZC4KCQoJCgkKCS8qIG1haW50ZW5hbmNlT24oKQoJICoKCSAqIFR1cm4gT04gV29yZFByZXNzIG1haW50ZW5hbmNlIG1vZGUuCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gbWFpbnRlbmFuY2VPbigpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJCgkJLy8gVHVybiBvbiBtYWludGVuYW5jZSBtb2RlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1R1cm5pbmcgb24gbWFpbnRlbmFuY2UgbW9kZSBvbi4nICk7CgkJaWYgKCAhIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5tYWludGVuYW5jZScgKSApIHsKCQkJJG1haW50ZW5hbmNlX3Jlc3VsdCA9IEBmaWxlX3B1dF9jb250ZW50cyggQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnLCAiPD9waHAgZGllKCAnU2l0ZSB1bmRlcmdvaW5nIG1haW50ZW5hbmNlLicgKTsgPz4iICk7CgkJCWlmICggZmFsc2UgPT09ICRtYWludGVuYW5jZV9yZXN1bHQgKSB7CgkJCQkkdGhpcy0+X2Vycm9yKCAnLm1haW50ZW5hbmNlIGZpbGUgdW5hYmxlIHRvIGJlIGdlbmVyYXRlZCB0byBwcmV2ZW50IHZpZXdpbmcuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnLm1haW50ZW5hbmNlIGZpbGUgZ2VuZXJhdGVkIHRvIHByZXZlbnQgdmlld2luZyBwYXJ0aWFsbHkgbWlncmF0ZWQgc2l0ZS4nICk7CgkJCX0KCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICcubWFpbnRlbmFuY2UgZmlsZSBhbHJlYWR5IGV4aXN0cy4gU2tpcHBpbmcgY3JlYXRpb24uJyApOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIG1haW50ZW5hbmNlT24oKS4KCQoJCgkKCS8qIG1haW50ZW5hbmNlT2ZmKCkKCSAqCgkgKiBUdXJuIE9GRiBXb3JkUHJlc3MgbWFpbnRlbmFuY2UgbW9kZS4KCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBtYWludGVuYW5jZU9mZiggJG9ubHlEZWxldGVPdXJGaWxlID0gZmFsc2UgKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1R1cm4gb2ZmIG1haW50ZW5hbmNlIG1vZGUgb2ZmIGlmIG9uLicgKTsKCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5tYWludGVuYW5jZScgKSApIHsKCQkJCgkJCWlmICggZmFsc2UgPT09ICRvbmx5RGVsZXRlT3VyRmlsZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIGV4aXN0cy4gRGVsZXRpbmcuLi4nICk7CgkJCQlpZiAoIGZhbHNlID09PSBAdW5saW5rKCBBQlNQQVRIIC4gJy5tYWludGVuYW5jZScgKSApIHsKCQkJCQkkdGhpcy0+X2Vycm9yKCAnVW5hYmxlIHRvIGRlbGV0ZSAubWFpbnRlbmFuY2UgZmlsZS4nICk7CgkJCQl9CgkJCX0gZWxzZSB7IC8vIFNlZSBpZiBJbXBvcnRCdWRkeSBjcmVhdGVkIGl0IGJlZm9yZSBkZWxldGluZy4KCgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnLm1haW50ZW5hbmNlIGZpbGUgZXhpc3RzLiBDaGVja2luZyB0byBzZWUgaWYgSW1wb3J0QnVkZHkgZ2VuZXJhdGVkIGl0LicgKTsKCQkJCSRtYWludGVuYW5jZV9jb250ZW50cyA9IEBmaWxlX2dldF9jb250ZW50cyggQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnICk7CgkJCQlpZiAoIGZhbHNlID09PSAkbWFpbnRlbmFuY2VfY29udGVudHMgKSB7IC8vIENhbm5vdCByZWFkLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICcubWFpbnRlbmFuY2UgZmlsZSB1bnJlYWRhYmxlLiBZb3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgZGVsZXRlIGl0IHRvIHZpZXcgeW91ciBzaXRlLicgKTsKCQkJCX0gZWxzZSB7IC8vIFJlYWQgZmlsZSBzdWNjZWVkZWQuCgkJCQkJaWYgKCB0cmltKCAkbWFpbnRlbmFuY2VfY29udGVudHMgKSA9PSAiPD9waHAgZGllKCAnU2l0ZSB1bmRlcmdvaW5nIG1haW50ZW5hbmNlLicgKTsgPz4iICkgeyAvLyBPdXIgZmlsZS4gRGVsZXRlIGl0IQoJCQkJCQkkbWFpbnRlbmFuY2VfdW5saW5rID0gQHVubGluayggQUJTUEFUSCAuICcubWFpbnRlbmFuY2UnICk7CgkJCQkJCWlmICggdHJ1ZSA9PT0gJG1haW50ZW5hbmNlX3VubGluayApIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RlbXBvcmFyeSAubWFpbnRlbmFuY2UgZmlsZSBjcmVhdGVkIGJ5IEltcG9ydEJ1ZGR5IHN1Y2Nlc3NmdWxseSBkZWxldGVkLicgKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gZGVsZXRlIHRlbXBvcmFyeSAubWFpbnRlbmFuY2UgZmlsZS4gIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBwZXJtaXNzaW9ucy4gWW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IGRlbGV0ZSBpdCB0byB2aWV3IHlvdXIgc2l0ZS4nICk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgeyAvLyBOb3Qgb3VyIGZpbGUuIExlYXZlIGFsb25lLiBXZSB3aWxsIHdhcm4gYWJvdXQgdGhpcyBsYXRlciB0aG91Z2guCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIG5vdCBnZW5lcmF0ZWQgYnkgSW1wb3J0QnVkZHkuIExlYXZpbmcgYXMgaXMuIFlvdSBtYXkgbmVlZCB0byBkZWxldGUgaXQgdG8gdmlldyB5b3VyIHNpdGUuJyApOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJCgkJCX0KCQkJCgkJCQoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJy5tYWludGVuYW5jZSBmaWxlIGRvZXMgbm90IGV4aXN0LicgKTsKCQl9Cgl9IC8vIEVuZCBtYWludGVuYW5jZU9mZigpLgoKCgoJLyoqCgkgKgltaWdyYXRlV3BDb25maWcoKQoJICoKCSAqCUByZXR1cm4JCXRydWUgb24gc3VjY2VzcywgbmV3IHdwIGNvbmZpZyBmaWxlIGNvbnRlbnQgb24gZmFpbHVyZS4KCSAqLwoJZnVuY3Rpb24gbWlncmF0ZVdwQ29uZmlnKCkgewoJCWlmICggaXNzZXQoICR0aGlzLT5fc3RhdGVbJ2RhdCddWyd3cC1jb25maWdfaW5fcGFyZW50J10gKSApIHsKCQkJaWYgKCAkdGhpcy0+X3N0YXRlWydkYXQnXVsnd3AtY29uZmlnX2luX3BhcmVudCddID09PSB0cnVlICkgeyAvLyB3cC1jb25maWcucGhwIHVzZWQgdG8gYmUgaW4gcGFyZW50LiBNdXN0IGNvcHkgZnJvbSB0ZW1wIGRpciB0byByb290LgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnREFUIGZpbGUgaW5kaWNhdGVzIHdwLWNvbmZpZy5waHAgd2FzIHByZXZpb3VzbHkgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuIENvcHlpbmcgaW50byBzaXRlIHJvb3QuJyApOwoKCQkJCSRjb25maWdfc291cmNlID0gQUJTUEFUSCAuICd3cC1jb250ZW50L3VwbG9hZHMvYmFja3VwYnVkZHlfdGVtcC8nIC4gJHRoaXMtPl9zdGF0ZVsnc2VyaWFsJ10gLiAnL3dwLWNvbmZpZy5waHAnOwoJCQkJJHJlc3VsdCA9IGNvcHkoICRjb25maWdfc291cmNlLCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnICk7CgkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnd3AtY29uZmlnLnBocCBmaWxlIHdhcyByZXN0b3JlZCB0byB0aGUgcm9vdCBvZiB0aGUgc2l0ZSBgJyAuIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocGAuIEl0IHdhcyBwcmV2aW91c2x5IGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBzb3VyY2Ugc2l0ZS4gWW91IG1heSBtb3ZlIGl0IG1hbnVhbGx5IHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5LicgKTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBtb3ZlIHdwLWNvbmZpZy5waHAgZmlsZSBmcm9tIHRlbXBvcmFyeSBsb2NhdGlvbiBgJyAuICRjb25maWdfc291cmNlIC4gJ2AgdG8gcm9vdC4nICk7CgkJCQl9CgoJCQl9IGVsc2UgeyAvLyB3cC1jb25maWcucGhwIHdhcyBpbiBub3JtYWwgbG9jYXRpb24gb24gc291cmNlIHNpdGUuIE5vdGhpbmcgdG8gZG8uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEQVQgZmlsZSBpbmRpY2F0ZXMgd3AtY29uZmlnLnBocCB3YXMgcHJldmlvdXNseSBpbiB0aGUgbm9ybWFsIGxvY2F0aW9uLicgKTsKCQkJfQoJCX0gZWxzZSB7IC8vIFByZSAzLjAgYmFja3VwCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0JhY2t1cCBwcmUtdjMuMCBzbyB3cC1jb25maWcucGhwIG11c3QgYmUgaW4gbm9ybWFsIGxvY2F0aW9uLicgKTsKCQl9CgoJCWlmICggJ2ZpbGVzJyA9PSAkdGhpcy0+X3N0YXRlWydkYXQnXVsnYmFja3VwX3R5cGUnXSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBpbmcgdXBkYXRlIG9mIERhdGFiYXNlIFNldHRpbmdzIGFuZCBVUkxzIGluIHdwLWNvbmZpZy5waHAgYXMgdGhpcyBpcyBhIEZpbGVzIE9ubHkgQmFja3VwLicgKTsKCQkJJG1pZ3JhdGVSZXN1bHQgPSB0cnVlOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VwZGF0aW5nIERhdGFiYXNlIFNldHRpbmdzIGFuZCBVUkxzIGluIHdwLWNvbmZpZy5waHAgYXMgdGhpcyBpcyBub3QgYSBGaWxlcyBPbmx5IEJhY2t1cC4nICk7CgkJCSRtaWdyYXRlUmVzdWx0ID0gJHRoaXMtPl9taWdyYXRlV3BDb25maWdHcnVudHdvcmsoKTsKCQl9CgkJcmV0dXJuICRtaWdyYXRlUmVzdWx0OwoJfSAvLyBFbmQgbWlncmF0ZVdwQ29uZmlnKCkuCgoKCgkvKioKCSAqCV9taWdyYXRlV3BDb25maWdHcnVudHdvcmsoKQoJICoKCSAqCU1pZ3JhdGVzIGFuZCB1cGRhdGVzIHRoZSB3cC1jb25maWcucGhwIGZpbGUgY29udGVudHMgYXMgbmVlZGVkLgoJICoKCSAqCUByZXR1cm4JCQl0cnVlfHN0cmluZwkJCVRydWUgb24gc3VjY2Vzcy4gT24gZmFsc2UgcmV0dXJucyB0aGUgbmV3IHdwLWNvbmZpZyBmaWxlIGNvbnRlbnQuCgkgKi8KCWZ1bmN0aW9uIF9taWdyYXRlV3BDb25maWdHcnVudHdvcmsoKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnU3RhcnRpbmcgbWlncmF0aW9uIG9mIHdwLWNvbmZpZy5waHAgZmlsZS4uLicgKTsKCgkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgoJCSRjb25maWdGaWxlID0gQUJTUEFUSCAuICd3cC1jb25maWcucGhwJzsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDb25maWcgZmlsZTogYCcgLiAkY29uZmlnRmlsZSAuICdgLicgKTsKCgkJaWYgKCBmaWxlX2V4aXN0cyggJGNvbmZpZ0ZpbGUgKSApIHsKCQkJLy8gVXNlZnVsIFJFR0VYIHNpdGU6IGh0dHA6Ly9nc2tpbm5lci5jb20vUmVnRXhyLwoKCQkJJHVwZGF0ZWRfaG9tZV91cmwgPSBmYWxzZTsKCQkJJHdwX2NvbmZpZyA9IGFycmF5KCk7CgkJCSRsaW5lcyA9IGZpbGUoICRjb25maWdGaWxlICk7CgoJCQkkcGF0dGVybnMgPSBhcnJheSgpOwoJCQkkcmVwbGFjZW1lbnRzID0gYXJyYXkoKTsKCgkJCS8qCgkJCVVwZGF0ZSBXUF9TSVRFVVJMLCBXUF9IT01FIGlmIHRoZXkgZXhpc3QuCgkJCVVwZGF0ZSBkYXRhYmFzZSBEQl9OQU1FLCBEQl9VU0VSLCBEQl9QQVNTV09SRCwgYW5kIERCX0hPU1QuCgkJCVJlZ0V4cDogL2RlZmluZVwoW1xzXSooJ3wiKVdQX1NJVEVVUkwoJ3wiKSxbXHNdKignfCIpKC4pKignfCIpW1xzXSpcKTsvZ2kKCQkJcGF0dGVybjogZGVmaW5lXChbXHNdKignfCIpV1BfU0lURVVSTCgnfCIpLFtcc10qKCd8IikoLikqKCd8IilbXHNdKlwpOwoJCQkqLwoJCQkkcGF0dGVyblswXSA9ICcvZGVmaW5lXChbXHNdKihcJ3wiKVdQX1NJVEVVUkwoXCd8IiksW1xzXSooXCd8IikoLikqKFwnfCIpW1xzXSpcKTsvaSc7CgkJCSRyZXBsYWNlWzBdID0gImRlZmluZSggJ1dQX1NJVEVVUkwnLCAnIiAuIHRyaW0oICR0aGlzLT5fc3RhdGVbJ3NpdGV1cmwnXSwgJy8nICkgLiAiJyApOyI7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3dwLWNvbmZpZy5waHA6IFNldHRpbmcgV1BfU0lURVVSTCAoaWYgYXBwbGljYWJsZSkgdG8gYCcgLiB0cmltKCAkdGhpcy0+X3N0YXRlWydzaXRldXJsJ10sICcvJyApIC4gJ2AuJyApOwoJCQkkcGF0dGVyblsxXSA9ICcvZGVmaW5lXChbXHNdKihcJ3wiKVdQX0hPTUUoXCd8IiksW1xzXSooXCd8IikoLikqKFwnfCIpW1xzXSpcKTsvaSc7CgkJCSRyZXBsYWNlWzFdID0gImRlZmluZSggJ1dQX0hPTUUnLCAnIiAuIHRyaW0oICR0aGlzLT5fc3RhdGVbJ2hvbWV1cmwnXSwgJy8nICkgLiAiJyApOyI7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3dwLWNvbmZpZy5waHA6IFNldHRpbmcgV1BfSE9NRSAoaWYgYXBwbGljYWJsZSkgdG8gYCcgLiB0cmltKCAkdGhpcy0+X3N0YXRlWydob21ldXJsJ10sICcvJyApIC4gJ2AuJyApOwoKCQkJJHBhdHRlcm5bMl0gPSAnL2RlZmluZVwoW1xzXSooXCd8IilEQl9OQU1FKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkkcmVwbGFjZVsyXSA9ICJkZWZpbmUoICdEQl9OQU1FJywgJyIgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ2RhdGFiYXNlJ10gLiAiJyApOyI7CgkJCSRwYXR0ZXJuWzNdID0gJy9kZWZpbmVcKFtcc10qKFwnfCIpREJfVVNFUihcJ3wiKSxbXHNdKihcJ3wiKSguKSooXCd8IilbXHNdKlwpOy9pJzsKCQkJJHJlcGxhY2VbM10gPSAiZGVmaW5lKCAnREJfVVNFUicsICciIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd1c2VybmFtZSddIC4gIicgKTsiOwoJCQkkcGF0dGVybls0XSA9ICcvZGVmaW5lXChbXHNdKihcJ3wiKURCX1BBU1NXT1JEKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkkcmVwbGFjZVs0XSA9ICJkZWZpbmUoICdEQl9QQVNTV09SRCcsICciIC4gJHRoaXMtPl9wcmVnX2VzY2FwZV9iYWNrKCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3Bhc3N3b3JkJ10gKSAuICInICk7IjsKCQkJJHBhdHRlcm5bNV0gPSAnL2RlZmluZVwoW1xzXSooXCd8IilEQl9IT1NUKFwnfCIpLFtcc10qKFwnfCIpKC4pKihcJ3wiKVtcc10qXCk7L2knOwoJCQkkcmVwbGFjZVs1XSA9ICJkZWZpbmUoICdEQl9IT1NUJywgJyIgLiAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddIC4gIicgKTsiOwoKCQkJLy8gSWYgbXVsdGlzaXRlLCB1cGRhdGUgZG9tYWluLgoJCQlpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RvbWFpbiddICkgJiYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2RvbWFpbiddICE9ICcnICkgKSB7CgkJCQkkcGF0dGVybls2XSA9ICcvZGVmaW5lXChbXHNdKihcJ3wiKURPTUFJTl9DVVJSRU5UX1NJVEUoXCd8IiksW1xzXSooXCd8IikoLikqKFwnfCIpW1xzXSpcKTsvaSc7CgkJCQkkcmVwbGFjZVs2XSA9ICJkZWZpbmUoICdET01BSU5fQ1VSUkVOVF9TSVRFJywgJyIgLiAkdGhpcy0+X3N0YXRlWydkZWZhdWx0RG9tYWluJ10gLiAiJyApOyI7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwOiBTZXR0aW5nIERPTUFJTl9DVVJSRU5UX1NJVEUgKGlmIGFwcGxpY2FibGUpIHRvIGAnIC4gJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydkZWZhdWx0RG9tYWluJ10gLiAnYC4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd3cC1jb25maWcucGhwIGRpZCBub3QgdXBkYXRlIERPTUFJTl9DVVJSRU5UX1NJVEUgYXMgaXQgd2FzIGJsYW5rLicgKTsKCQkJfQoJCQkvKgoJCQlVcGRhdGUgdGFibGUgcHJlZml4LgoJCQlSZWdFeHA6IC9cJHRhYmxlX3ByZWZpeFtcc10qPVtcc10qKCd8IikoLikqKCd8Iik7L2dpCgkJCXBhdHRlcm46IFwkdGFibGVfcHJlZml4W1xzXSo9W1xzXSooJ3wiKSguKSooJ3wiKTsKCQkJKi8KCQkJJHBhdHRlcm5bN10gPSAnL1wkdGFibGVfcHJlZml4W1xzXSo9W1xzXSooXCd8IikoLikqKFwnfCIpOy9pJzsKCQkJJHJlcGxhY2VbN10gPSAnJHRhYmxlX3ByZWZpeCA9IFwnJyAuICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncHJlZml4J10gLiAnXCc7JzsKCgoJCQkvLyBQZXJmb3JtIHRoZSBhY3R1YWwgcmVwbGFjZW1lbnQuCgkJCSRsaW5lcyA9IHByZWdfcmVwbGFjZSggJHBhdHRlcm4sICRyZXBsYWNlLCAkbGluZXMgKTsKCgkJCS8vIENoZWNrIHRoYXQgd2UgY2FuIHdyaXRlIHRvIHRoaXMgZmlsZS4KCQkJaWYgKCAhIGlzX3dyaXRhYmxlKCAkY29uZmlnRmlsZSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnV2FybmluZyAjMjg1NzI6IHdwLWNvbmZpZy5waHAgc2hvd3MgdG8gYmUgdW53cml0YWJsZS4gQXR0ZW1wdGluZyB0byBvdmVycmlkZSBwZXJtaXNzaW9ucyB0ZW1wb3JhcmlseS4nICk7CgkJCQkkb2xkUGVybXMgPSAoIGZpbGVwZXJtcyggJGNvbmZpZ0ZpbGUgKSAmIDA3NzcgKTsKCQkJCUBjaG1vZCggJGNvbmZpZ0ZpbGUsIDA2NDQgKTsgLy8gVHJ5IHRvIG1ha2Ugd3JpdGFibGUuCgkJCX0KCgkJCS8vIFdyaXRlIGNoYW5nZXMgdG8gY29uZmlnIGZpbGUuCgkJCWlmICggZmFsc2UgPT09ICggZmlsZV9wdXRfY29udGVudHMoICRjb25maWdGaWxlLCAkbGluZXMgKSApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRVJST1IgIzg0OTI4OiBVbmFibGUgdG8gc2F2ZSBjaGFuZ2VzIHRvIHdwLWNvbmZpZy5waHAuIFZlcmlmeSB0aGlzIGZpbGUgaGFzIHByb3BlciB3cml0ZSBwZXJtaXNzaW9ucy4gWW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IGVkaXQgaXQuJywgdHJ1ZSwgJzkwMjAnICk7CgkJCQlyZXR1cm4gaW1wbG9kZSggIlxuIiwgJGxpbmVzICk7CgkJCX0KCgkJCS8vIFJlc3RvcmUgcHJpb3IgcGVybWlzc2lvbnMgaWYgYXBwbGljYWJsZS4KCQkJaWYgKCBpc3NldCggJG9sZFBlcm1zICkgKSB7CgkJCQlAY2htb2QoICRjb25maWdGaWxlLCAkb2xkUGVybXMgKTsKCQkJfQoKCQkJdW5zZXQoICRsaW5lcyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1dhcm5pbmc6IHdwLWNvbmZpZy5waHAgZmlsZSBub3QgZm91bmQuJyApOwoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ05vdGU6IHdwLWNvbmZpZy5waHAgZmlsZSBub3QgZm91bmQuIFRoaXMgaXMgbm9ybWFsIGZvciBhIGRhdGFiYXNlIG9ubHkgYmFja3VwLicgKTsKCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ01pZ3JhdGlvbiBvZiB3cC1jb25maWcucGhwIGNvbXBsZXRlLicgKTsKCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBfbWlncmF0ZVdwQ29uZmlnR3J1bnR3b3JrKCkuCgkKCQoJCgkvKglfcHJlZ19lc2NhcGVfYmFjaygpCgkgKgkKCSAqCUVzY2FwZSBiYWNrcmVmZXJlbmNlcyBmcm9tIHN0cmluZyBmb3IgdXNlIHdpdGggcmVnZXguIFVzZWQgYnkgbWlncmF0ZV93cF9jb25maWcoKS4KCSAqCUBzZWUgbWlncmF0ZV93cF9jb25maWcoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHN0cmluZwkJU3RyaW5nIHRvIGVzY2FwZS4KCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJRXNjYXBlZCBzdHJpbmcuCgkgKi8KCWZ1bmN0aW9uIF9wcmVnX2VzY2FwZV9iYWNrKCRzdHJpbmcpIHsKCQkvLyBSZXBsYWNlICQgd2l0aCBcJCBhbmQgXCB3aXRoIFxcCgkJJHN0cmluZyA9IHByZWdfcmVwbGFjZSgnIyg/PCFcXFxcKShcXCR8XFxcXCkjJywgJ1xcXFwkMScsICRzdHJpbmcpOwoJCXJldHVybiAkc3RyaW5nOwoJfSAvLyBFbmQgX3ByZWdfZXNjYXBlX2JhY2soKS4KCQoJCgkKCS8qIHRyb3VibGVTY2FuKCkKCSAqCgkgKiBTY2FucyBmb3IgcG90ZW50aWFsIHByb2JsZW1zIGFuZCBwcm92aWRlZCBpbmZvcm1hdGl2ZSB3YXJuaW5ncy4KCSAqCgkgKiBAcmV0dXJuIGFycmF5IEFycmF5IG9mIHRleHQgd2FybmluZ3MgdG8gZGlzcGxheSB0byB1c2VyLgoJICoKCSAqLwoJZnVuY3Rpb24gdHJvdWJsZVNjYW4oKSB7CgkJJHRyb3VibGUgPSBhcnJheSgpOwoKCQkvLyAubWFpbnRlbmFuY2UKCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5tYWludGVuYW5jZScgKSApIHsKCQkJJHRyb3VibGVbXSA9ICcubWFpbnRlbmFuY2UgZmlsZSBmb3VuZCBpbiBXb3JkUHJlc3Mgcm9vdC4gVGhlIHNpdGUgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlIHVubGVzcyB0aGlzIGZpbGUgaXMgZGVsZXRlZC4nOwoJCX0KCgkJLy8gaW5kZXguaHRtCgkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICdpbmRleC5odG0nICkgKSB7CgkJCSR0cm91YmxlW10gPSAnaW5kZXguaHRtIGZpbGUgZm91bmQgaW4gV29yZFByZXNzIHJvb3QuIFRoaXMgbWF5IHByZXZlbnQgV29yZFByZXNzIGZyb20gbG9hZGluZyBvbiBzb21lIHNlcnZlcnMuIFNvbHV0aW9uOiBEZWxldGUgdGhlIGZpbGUuJzsKCQl9CgoJCS8vIGluZGV4Lmh0bWwKCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ2luZGV4Lmh0bWwnICkgKSB7CgkJCSR0cm91YmxlW10gPSAnaW5kZXguaHRtbCBmaWxlIGZvdW5kIGluIFdvcmRQcmVzcyByb290LiBUaGlzIG1heSBwcmV2ZW50IFdvcmRQcmVzcyBmcm9tIGxvYWRpbmcgb24gc29tZSBzZXJ2ZXJzLiBTb2x1dGlvbjogRGVsZXRlIHRoZSBmaWxlLic7CgkJfQoKCQkvLyB3cC1jb25maWcucGhwCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnICkgKSB7CgkJCSR0cm91YmxlW10gPSAnV2FybmluZyBvbmx5OiB3cC1jb25maWcucGhwIGZpbGUgbm90IGZvdW5kIFdvcmRQcmVzcyByb290LiA8aT5JZiB0aGlzIGlzIGEgZGF0YWJhc2Utb25seSByZXN0b3JlIHlvdSBzaG91bGQgcmVzdG9yZSBhIGZ1bGwgYmFja3VwLjwvaT4nOwoJCX0gZWxzZSB7IC8vIHdwLWNvbmZpZy5waHAgZXhpc3RzIHNvIGNoZWNrIGZvciB1bmNoYW5nZWQgVVJMcyBub3QgdXBkYXRlZCBkdWUgdG8gcHJvdmVuYW5jZSB1bmtub3duLgoKCQkJaWYgKCAnZmlsZXMnID09ICR0aGlzLT5fc3RhdGVbJ2RhdCddWydiYWNrdXBfdHlwZSddICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU2tpcHBpbmcgVVJMIHNjYW4gZm9yIHdwLWNvbmZpZy5waHAgYXMgdGhpcyBpcyBhIEZpbGVzIE9ubHkgcmVzdG9yZS4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaGVja2luZyB3cC1jb25maWcucGhwIGZpbGUgZm9yIHVuY2hhbmdlZCBVUkxzLicgKTsKCQkJCSRjb25maWdfY29udGVudHMgPSBAZmlsZV9nZXRfY29udGVudHMoIEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCcgKTsKCQkJCWlmICggZmFsc2UgPT09ICRjb25maWdfY29udGVudHMgKSB7IC8vIFVuYWJsZSB0byBvcGVuLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gb3BlbiB3cC1jb25maWcucGhwIGZvciBjaGVja2luZyB0aG91Z2ggaXQgZXhpc3RzLiBWZXJpZnkgcGVybWlzc2lvbnMuJyApOwoJCQkJfSBlbHNlIHsgLy8gQWJsZSB0byBvcGVuLgoKCQkJCQlwcmVnX21hdGNoX2FsbCggJyNcYmh0dHBzPzovL1teXHMoKTw+XSsoPzpcKFtcd1xkXStcKXwoW15bOnB1bmN0Ol1cc118LykpIycsICRjb25maWdfY29udGVudHMsICRtYXRjaGVzICk7CgkJCQkJJG1hdGNoZXMgPSAkbWF0Y2hlc1swXTsKCQkJCQlmb3JlYWNoKCAkbWF0Y2hlcyBhcyAkbWF0Y2ggKSB7CgkJCQkJCWlmICggZmFsc2UgIT09IHN0cmlzdHIoICRtYXRjaCwgJ2FwaS53b3JkcHJlc3Mub3JnJyApICkgewoJCQkJCQkJY29udGludWU7CgkJCQkJCX0KCQkJCQkJaWYgKCBmYWxzZSAhPT0gc3RyaXN0ciggJG1hdGNoLCAnY29kZXgud29yZHByZXNzLm9yZycgKSApIHsKCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQl9CgkJCQkJCSR0cm91YmxlW10gPSAnQSBVUkwgZm91bmQgaW4gb25lIG9yIG1vcmUgbG9jYXRpb25zIGluIHdwLWNvbmZpZy5waHAgd2FzIG5vdCBtaWdyYXRlZCBhcyBpdCB3YXMgZWl0aGVyIG5vdCByZWNvZ25pemVkIG9yIGluIGFuIHVucmVjb2duaXplZCBsb2NhdGlvbiBpbiB0aGUgZmlsZTogIicgLiBodG1sZW50aXRpZXMoICRtYXRjaCApIC4gJyIuJzsKCQkJCQl9CgoJCQkJCWlmICggZmFsc2UgIT09IHN0cmlzdHIoICRjb25maWdfY29udGVudHMsICdDT09LSUVfRE9NQUlOJyApICkgeyAvLyBGb3VuZCBjb29raWUgZG9tYWluLgoJCQkJCQkkdHJvdWJsZVtdID0gJ0Nvb2tpZSBkb21haW4gc2V0IGluIHdwLWNvbmZpZy5waHAgZmlsZSBhbmQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQuIFlvdSBtYXkgbmVlZCB0byBtYW51YWx5IHVwZGF0ZSB0aGlzLic7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQkvLyAuaHRhY2Nlc3MKCQlpZiAoICEgZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnLmh0YWNjZXNzJyApICkgewoJCQkkdHJvdWJsZVtdID0gJ1dhcm5pbmcgb25seTogLmh0YWNjZXNzIGZpbGUgbm90IGZvdW5kIGluIFdvcmRQcmVzcyByb290LiBUaGlzIGlzIHVzZWQgZm9yIHBlcm1hbGlua3Mgb24gc2VydmVycyB3aGljaCBzdXBwb3J0IGl0LiBJZiBuZWVkZWQgb3IgVVJMcyByZXN1bHQgaW4gYSA0MDQgeW91IG1heSByZWdlbmVyYXRlIHRoaXMgZmlsZSBieSBsb2dnaW5nIGludG8gdGhlIHdwLWFkbWluICYgbmF2aWdhdGluZyB0byBTZXR0aW5nczogUGVybWFsaW5rcyBhbmQgY2xpY2tpbmcgIlNhdmUiLic7CgkJfSBlbHNlIHsgLy8gRXhpc3RzLCBjaGVjayBpZiBBZGRIYW5kbGVyIGluc2lkZS4KCQkJJGNvbnRlbnRzID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKTsKCQkJaWYgKCBzdHJzdHIoICRjb250ZW50cywgJ0FkZEhhbmRsZXInICkgKSB7CgkJCQkkdHJvdWJsZVtdID0gJ1dhcm5pbmc6IEFuIEFkZEhhbmRsZXIgZGlyZWN0aXZlIGhhcyBiZWVuIGZvdW5kIGluIHlvdXIgLmh0YWNjZXNzIGZpbGUuIFRoaXMgY291bGQgcmVzdWx0IGluIFdvcmRQcmVzcyBhbmQgUEhQIG5vdCBydW5uaW5nIHByb3Blcmx5IGlmIGNvbmZpZ3VyZWQgaW1wcm9wZXJseSwgZXNwZWNpYWxseSB3aGVuIG1pZ3JhdGluZyB0byBhIG5ldyBzZXJ2ZXIuIElmIHlvdSBlbmNvdW50ZXIgcHJvYmxlbXMgc3VjaCBhcyBhbiBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3Igb3IgRXJyb3IgNTAwLCB0cnkgcmVtb3ZpbmcgdGhpcyBsaW5lIGZyb20geW91ciAuaHRhY2Nlc3MgZmlsZS4gU29sdXRpb246IERlbGV0ZSB0aGlzIEFkZEhhbmRsZXIgbGluZSBmcm9tIHRoZSAuaHRhY2Nlc3MgZmlsZS4gPGEgdGFyZ2V0PSJfbmV3IiBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vY29kZXgvcGFnZS9CYWNrdXBCdWRkeTpfRnJlcXVlbnRfU3VwcG9ydF9Jc3N1ZXMjLmh0YWNjZXNzXzQwNF8uMkZfQWRkaGFuZGxlcl9XYXJuaW5nIj5DbGljayBoZXJlIGZvciBtb3JlIGluZm9ybWF0aW9uICYgaGVscC48L2E+JzsKCQkJfQoJCX0KCgkJLy8gcGhwLmluaQoJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAncGhwLmluaScgKSApIHsKCQkJJHRyb3VibGVbXSA9ICdBIHBocC5pbmkgZmlsZSB3YXMgcmVzdG9yZWQgaW4gdGhlIGltcG9ydCBwcm9jZXNzIGluIHRoZSBzaXRlIHJvb3QuIFRoaXMgbWF5IGNhdXNlIHByb2JsZW1zIHdpdGggc2l0ZSBmdW5jdGlvbmFsaXR5IGlmIGltcG9ydGVkIHRvIGEgZGlmZmVyZW50IHNlcnZlciBhcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgb2Z0ZW4gZGlmZmVyIGJldHdlZW4gc2VydmVycywgcG9zc2libHkgcmVzdWx0aW5nIGluIGRlZ3JhZGVkIHBlcmZvcm1hbmNlIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3IuJzsKCQl9CgoJCWlmICggY291bnQoICR0cm91YmxlICkgPiAwICkgewoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1BvdGVudGlhbCBwcm9ibGVtcyB0aGF0IG1heSBuZWVkIHlvdXIgYXR0ZW50aW9uOiAnIC4gaW1wbG9kZSggJzsgJywgJHRyb3VibGUgKSApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vIHBvdGVudGlhbCBwcm9ibGVtcyBkZXRlY3RlZC4nICk7CgkJfQoKCQlyZXR1cm4gJHRyb3VibGU7CgoJfSAvLyBFbmQgdHJvdWJsZVNjYW4oKS4KCQoJCgkKCS8qIHNjcnViSW5kZXhGaWxlcygpCgkgKgoJICogRGVsZXRlcyBpbmRleC5odG0gZmlsZSBpZiBpdCBhcHBlYXJzIHRvIGhhdmUgdGhlIGNvbnRlbnRzIHRoYXQgSW1wb3J0QnVkZHkgY3JlYXRlZCBpdCB3aXRoLgoJICogTm9uLWltcG9ydGJ1ZGR5IGNyZWF0ZWQgaW5kZXguaHRtIGZpbGVzIGFyZSBsZWZ0IGluIHBsYWNlIHRvIGJlIHdhcm5lZCBhYm91dCBsYXRlciBhcyB0aGUgdXNlciBtYXkgd2FudCBpdCB0aGVyZS4KCSAqCgkgKi8KCWZ1bmN0aW9uIHNjcnViSW5kZXhGaWxlcygpIHsKCQkkdGhpcy0+X2JlZm9yZSggX19GVU5DVElPTl9fICk7CgkJCgkJJGluZGV4RmlsZXMgPSBhcnJheSggJ2luZGV4Lmh0bScsICdpbmRleC5odG1sJyApOwoJCWZvcmVhY2goICRpbmRleEZpbGVzIGFzICRpbmRleEZpbGUgKSB7CgkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAkaW5kZXhGaWxlICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICRpbmRleEZpbGUgLiAnIGZpbGUgZXhpc3RzLiBDaGVja2luZyB0byBzZWUgaWYgSW1wb3J0QnVkZHkgZ2VuZXJhdGVkIGl0IG9yIGl0IGlzIGVtcHR5LicgKTsKCQkJCSRpbmRleF9jb250ZW50cyA9IEBmaWxlX2dldF9jb250ZW50cyggQUJTUEFUSCAuICRpbmRleEZpbGUgKTsKCQkJCWlmICggZmFsc2UgPT09ICRpbmRleF9jb250ZW50cyApIHsgLy8gQ2Fubm90IHJlYWQuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGluZGV4RmlsZSAuICcgZmlsZSB1bnJlYWRhYmxlLiBZb3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgZGVsZXRlIGl0IHRvIHZpZXcgeW91ciBzaXRlLicgKTsKCQkJCX0gZWxzZSB7IC8vIFJlYWQgZmlsZSBzdWNjZWVkZWQuCgkJCQkJJGluZGV4X2NvbnRlbnRzID0gdHJpbSggJGluZGV4X2NvbnRlbnRzICk7CgkJCQkJaWYgKCAoICRpbmRleF9jb250ZW50cyA9PSAnPGh0bWw+PC9odG1sPicgKSB8fCAoICcnID09ICRpbmRleF9jb250ZW50cyApICkgeyAvLyBPdXIgZmlsZS4gRGVsZXRlIGl0IQoJCQkJCQkkaW5kZXhfdW5saW5rID0gQHVubGluayggQUJTUEFUSCAuICRpbmRleEZpbGUgKTsKCQkJCQkJaWYgKCB0cnVlID09PSAkaW5kZXhfdW5saW5rICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAkaW5kZXhGaWxlIC4gJyBmaWxlIHN1Y2Nlc3NmdWxseSBkZWxldGVkLicgKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdVbmFibGUgdG8gZGVsZXRlICcgLiAkaW5kZXhGaWxlIC4gJyBmaWxlLiAgVGhpcyBpcyBsaWtlbHkgZHVlIHRvIHBlcm1pc3Npb25zLiBZb3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgZGVsZXRlIGl0IHRvIHZpZXcgeW91ciBzaXRlLicgKTsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7IC8vIE5vdCBvdXIgZmlsZS4gTGVhdmUgYWxvbmUuIFdlIHdpbGwgd2FybiBhYm91dCB0aGlzIGxhdGVyIHRob3VnaC4KCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAkaW5kZXhGaWxlIC4gJyBmaWxlIG5vdCBnZW5lcmF0ZWQgYnkgSW1wb3J0QnVkZHkgYW5kIG5vdCBlbXB0eS4gTGVhdmluZyBhcyBpcy4gWW91IG1heSBuZWVkIHRvIGRlbGV0ZSBpdCB0byB2aWV3IHlvdXIgc2l0ZS4nICk7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgeyAvLyBObyBpbmRleC5odG0gZmlsZS4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJGluZGV4RmlsZSAuICcgZmlsZSBub3QgZm91bmQuIFNraXBwaW5nIGRlbGV0aW9uLicgKTsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0gLy8gRW5kIHNjcnViSW5kZXhGaWxlcygpLgoJCgkKCQoJLyoJcmVuYW1lSHRhY2Nlc3NUZW1wKCkKCSAqCQoJICoJUmVuYW1lcyAuaHRhY2Nlc3MgdG8gLmh0YWNjZXNzLmJiX3RlbXAgdW50aWwgbGFzdCBJbXBvcnRCdWRkeSBzdGVwIHRvIGF2b2lkIGNvbXBsaWNhdGlvbnMuCgkgKgkKCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gcmVuYW1lSHRhY2Nlc3NUZW1wKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQkKCQlpZiAoICFmaWxlX2V4aXN0cyggQUJTUEFUSCAuICcuaHRhY2Nlc3MnICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vIC5odGFjY2VzcyBmaWxlIGZvdW5kLiBTa2lwcGluZyB0ZW1wb3JhcnkgZmlsZSByZW5hbWUuJyApOwoJCX0KCQkKCQkkcmVzdWx0ID0gQHJlbmFtZSggQUJTUEFUSCAuICcuaHRhY2Nlc3MnLCBBQlNQQVRIIC4gJy5odGFjY2Vzcy5iYl90ZW1wJyApOwoJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsgLy8gUmVuYW1lIHN1Y2NlZWRlZC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVuYW1lZCBgLmh0YWNjZXNzYCBmaWxlIHRvIGAuaHRhY2Nlc3MuYmJfdGVtcGAgdW50aWwgZmluYWwgSW1wb3J0QnVkZHkgc3RlcC4nICk7CgkJfSBlbHNlIHsgLy8gUmVuYW1lIGZhaWxlZC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3dhcm5pbmcnLCAnVW5hYmxlIHRvIHJlbmFtZSBgLmh0YWNjZXNzYCBmaWxlIHRvIGAuaHRhY2Nlc3MuYmJfdGVtcGAuIFlvdXIgZmlsZSBwZXJtaXNzaW9ucyBtYXkgYmUgdG9vIHN0cmljdC4gWW91IG1heSB3aXNoIHRvIG1hbnVhbGx5IHJlbmFtZSB0aGlzIGZpbGUgYW5kL29yIGNoZWNrIHBlcm1pc3Npb25zIGJlZm9yZSBwcm9jZWVkaW5nLicgKTsKCQl9CgkJcmV0dXJuIHRydWU7CgkJCgl9IC8vIEVuZCByZW5hbWVIdGFjY2Vzc1RlbXAoKS4KCgoKCS8qCXJlbmFtZUh0YWNjZXNzVGVtcEJhY2soKQoJICoJCgkgKglSZW5hbWVzIC5odGFjY2VzcyB0byAuaHRhY2Nlc3MuYmJfdGVtcCB1bnRpbCBsYXN0IEltcG9ydEJ1ZGR5IHN0ZXAgdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4KCSAqCQoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiByZW5hbWVIdGFjY2Vzc1RlbXBCYWNrKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQkKCQkkdGVtcEZpbGUgPSBBQlNQQVRIIC4gJy5odGFjY2Vzcy5iYl90ZW1wJzsKCQkkZmluYWxGaWxlID0gQUJTUEFUSCAuICcuaHRhY2Nlc3MnOwoJCQoJCWlmICggISBmaWxlX2V4aXN0cyggJHRlbXBGaWxlICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ05vIGAuaHRhY2Nlc3MuYmJfdGVtcGAgZmlsZSBmb3VuZC4gU2tpcHBpbmcgdGVtcG9yYXJ5IGZpbGUgcmVuYW1lLicgKTsKCQkJcmV0dXJuOwoJCX0KCgkJJHJlc3VsdCA9IEByZW5hbWUoICR0ZW1wRmlsZSwgJGZpbmFsRmlsZSApOwoJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsgLy8gUmVuYW1lIHN1Y2NlZWRlZC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVuYW1lZCBgLmh0YWNjZXNzLmJiX3RlbXBgIGZpbGUgdG8gYC5odGFjY2Vzc2AgdW50aWwgZmluYWwgSW1wb3J0QnVkZHkgc3RlcC4nICk7CgkJfSBlbHNlIHsgLy8gUmVuYW1lIGZhaWxlZC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byByZW5hbWUgYC5odGFjY2Vzcy5iYl90ZW1wYCBmaWxlIHRvIGAuaHRhY2Nlc3NgLiBZb3VyIGZpbGUgcGVybWlzc2lvbnMgbWF5IGJlIHRvbyBzdHJpY3QuIFlvdSBtYXkgd2lzaCB0byBtYW51YWxseSByZW5hbWUgLmh0YWNjZXNzLmJiX3RlbXAgYXQgYCcgLiAkdGVtcEZpbGUgLiAnYCB0byAuaHRhY2Nlc3MuJyApOwoJCX0KCQkKCQlyZXR1cm47Cgl9IC8vIEVuZCByZW5hbWVIdGFjY2Vzc1RlbXBCYWNrKCkuCgkKCQoJCgkvKioKCSAqCW1pZ3JhdGVIdGFjY2VzcygpCgkgKgoJICoJTWlncmF0ZXMgLmh0YWNjZXNzLmJiX3RlbXAgZmlsZSBpZiBpdCBleGlzdHMuCgkgKgoJICoJQHJldHVybgkJYm9vbGVhbgkJRmFsc2Ugb25seSBpZiBmaWxlIGlzIHVud3JpdGFibGUuIFRydWUgaWYgd3JpdGUgc3VjY2VzczsgdHJ1ZSBpZiBmaWxlIGRvZXMgbm90IGV2ZW4gZXhpc3QuCgkgKgoJICovCglmdW5jdGlvbiBtaWdyYXRlSHRhY2Nlc3MoKSB7CgoJCSRodGFjY2Vzc0ZpbGUgPSBBQlNQQVRIIC4gJy5odGFjY2Vzcy5iYl90ZW1wJzsKCgkJLy8gSWYgbm8gLmh0YWNjZXNzLmJiX3RlbXAgZmlsZSBleGlzdHMgdGhlbiBjcmVhdGUgYSBiYXNpYyBkZWZhdWx0IG9uZSB0aGVuIG1pZ3JhdGUgdGhhdCBhcyBuZWVkZWQuIEBzaW5jZSAyLjIuMzIuCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkaHRhY2Nlc3NGaWxlICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ05vIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUgZm91bmQuIENyZWF0aW5nIGJhc2ljIGRlZmF1bHQgLmh0YWNjZXNzLmJiX3RlbXAgZmlsZSAodG8gYmUgbGF0ZXIgcmVuYW1lZCB0byAuaHRhY2Nlc3MpLicgKTsKCgkJCS8vIERlZmF1bHQgLmh0YWNjZXNzIGZpbGUuCgkJCSRodGFjY2Vzc19jb250ZW50cyA9CgkJCQkiIyBCRUdJTiBXb3JkUHJlc3NcbgoJCQkJPElmTW9kdWxlIG1vZF9yZXdyaXRlLmM+XG4KCQkJCVJld3JpdGVFbmdpbmUgT25cbgoJCQkJUmV3cml0ZUJhc2UgL1xuCgkJCQlSZXdyaXRlUnVsZSBeaW5kZXhcXC5waHAkIC0gW0xdXG4KCQkJCVJld3JpdGVDb25kICV7UkVRVUVTVF9GSUxFTkFNRX0gIS1mXG4KCQkJCVJld3JpdGVDb25kICV7UkVRVUVTVF9GSUxFTkFNRX0gIS1kXG4KCQkJCVJld3JpdGVSdWxlIC4gL2luZGV4LnBocCBbTF1cbgoJCQkJPC9JZk1vZHVsZT5cbgoJCQkJIyBFTkQgV29yZFByZXNzXG4iOwoJCQlmaWxlX3B1dF9jb250ZW50cyggJGh0YWNjZXNzRmlsZSwgJGh0YWNjZXNzX2NvbnRlbnRzICk7CgkJCXVuc2V0KCAkaHRhY2Nlc3NfY29udGVudHMgKTsKCQl9CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ01pZ3JhdGluZyBgJyAuIGJhc2VuYW1lKCAkaHRhY2Nlc3NGaWxlICkgLiAnYCBmaWxlLi4uJyApOwoKCQkkb2xkdXJsID0gc3RydG9sb3dlciggJHRoaXMtPl9zdGF0ZVsnZGF0J11bJ3NpdGV1cmwnXSApOwoJCSRvbGR1cmwgPSBzdHJfcmVwbGFjZSggJy8nLCAnXFwnLCAkb2xkdXJsICk7CgkJJG9sZHVybCA9IHN0cl9yZXBsYWNlKCAnaHR0cDpcXCcsICcnLCAkb2xkdXJsICk7CgkJJG9sZHVybCA9IHRyaW0oICRvbGR1cmwsICdcXCcgKTsKCQkkb2xkdXJsID0gZXhwbG9kZSggJ1xcJywgJG9sZHVybCApOwoJCSRvbGR1cmxbMF0gPSAnJzsKCgkJJG9sZF9wYXRoID0gaW1wbG9kZSggJy8nLCAkb2xkdXJsICk7CgoJCSRuZXd1cmwgPSBzdHJ0b2xvd2VyKCAkdGhpcy0+X3N0YXRlWydzaXRldXJsJ10gKTsKCQkkbmV3dXJsID0gc3RyX3JlcGxhY2UoICcvJywgJ1xcJywgJG5ld3VybCApOwoJCSRuZXd1cmwgPSBzdHJfcmVwbGFjZSggJ2h0dHA6XFwnLCAnJywgJG5ld3VybCApOwoJCSRuZXd1cmwgPSB0cmltKCAkbmV3dXJsLCAnXFwnICk7CgkJJG5ld3VybCA9IGV4cGxvZGUoICdcXCcsICRuZXd1cmwgKTsKCQkkbmV3dXJsWzBdID0gJyc7CgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0NoZWNraW5nIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUuJyApOwoJCWlmICggJG5ld3VybCAhPT0gJG9sZHVybCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnVVJMIGRpcmVjdG9yeSBoYXMgY2hhbmdlZC4gVXBkYXRpbmcgZnJvbSBgJyAuIGltcGxvZGUoICcvJywgJG9sZHVybCApIC4gJ2AgdG8gYCcgLiBpbXBsb2RlKCAnLycsICRuZXd1cmwgKSAuICdgLicgKTsKCQl9CgkJCgkJJHJld3JpdGVfbGluZXMgPSBhcnJheSgpOwoJCSRnb3RfcmV3cml0ZSA9IGZhbHNlOwoJCSRyZXdyaXRlX3BhdGggPSBpbXBsb2RlKCAnLycsICRuZXd1cmwgKTsKCQkkZmlsZV9hcnJheSA9IGZpbGUoICRodGFjY2Vzc0ZpbGUgKTsKCQkkaHRhY2Nlc3NOZWVkc1VwZGF0aW5nID0gZmFsc2U7CgkJCgkJLy8gTG9vcCB0aHJvdWdoIC5odGFjY2VzcyBsaW5lcywgdXBkYXRpbmcgYXMgbmVlZGVkLgoJCWZvcmVhY2ggKCAoYXJyYXkpJGZpbGVfYXJyYXkgYXMgJGxpbmVfbnVtYmVyID0+ICRsaW5lKSB7CgkJCWlmICggJGdvdF9yZXdyaXRlID09IHRydWUgKSB7IC8vIEluIGEgV29yZFByZXNzIHNlY3Rpb24uCgkJCQlpZiAoIHN0cnN0ciggJGxpbmUsICdFTkQgV29yZFByZXNzJyApICkgeyAvLyBFbmQgb2YgYSBXb3JkUHJlc3MgYmxvY2sgc28gc3RvcCByZXBsYWNpbmcuCgkJCQkJJGdvdF9yZXdyaXRlID0gZmFsc2U7CgkJCQkJJHJld3JpdGVfbGluZXNbXSA9ICAkbGluZTsgLy8gQ2FwdHVyZXMgZW5kIG9mIFdvcmRQcmVzcyBibG9jay4KCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJaWYgKCAkbmV3dXJsICE9PSAkb2xkdXJsICkgewoJCQkJCQlpZiAoIHN0cnN0ciggJGxpbmUsICdSZXdyaXRlQmFzZScgKSApIHsgLy8gUmV3cml0ZUJhc2UKCQkJCQkJCSRyZXdyaXRlX2xpbmVzW10gPSAnUmV3cml0ZUJhc2UgJyAuICRyZXdyaXRlX3BhdGggLiAnLycgLiAiXG4iOwoJCQkJCQkJJGh0YWNjZXNzTmVlZHNVcGRhdGluZyA9IHRydWU7CgkJCQkJCX0gZWxzZWlmICggc3Ryc3RyKCAkbGluZSwgJ1Jld3JpdGVSdWxlJyApICkgeyAvLyBSZXdyaXRlUnVsZQoJCQkJCQkJaWYgKCBzdHJzdHIoICRsaW5lLCAnXmluZGV4XC5waHAkJyApICkgeyAvLyBIYW5kbGUgbmV3IHN0cmFuZ2UgcmV3cml0ZXJ1bGUuIExlYXZlIGFzIGlzLgoJCQkJCQkJCSRyZXdyaXRlX2xpbmVzW10gPSAkbGluZTsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICcuaHRhY2Nlc3MgXmluZGV4XC5waHAkIGRldGVjdGVkLiBMZWF2aW5nIGFzIGlzLicgKTsKCQkJCQkJCX0gZWxzZWlmICggISBzdHJzdHIoICRsaW5lLCAnUmV3cml0ZVJ1bGUgLiAnKSApIHsKCQkJCQkJCQkvLyBIYW5kbGUgd2hhdCBpcyBwcm9iYWJseSBhIHVzZXIgZ2VuZXJhdGVkIHJ1bGUgLSBiZXR0ZXIgZGV0ZWN0aW9uIG5lZWRlZC4KCQkJCQkJCQkkbmV3X2xpbmUgPSBzdHJfcmVwbGFjZSggJG9sZF9wYXRoLCAkcmV3cml0ZV9wYXRoLCAkbGluZSApOwoJCQkJCQkJCSRyZXdyaXRlX2xpbmVzW10gPSAkbmV3X2xpbmU7CgkJCQkJCQkJJGh0YWNjZXNzTmVlZHNVcGRhdGluZyA9IHRydWU7CgkJCQkJCQkJaWYgKCAkbmV3X2xpbmUgIT0gJGxpbmUgKSB7CgkJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJy5odGFjY2VzcyBsaW5lIGNoYW5nZWQgZnJvbSBgJyAuIHRyaW0oICRsaW5lICkgLiAnYCB0byBgJyAuIHRyaW0oICRuZXdfbGluZSApIC4gJ2AuJyApOwoJCQkJCQkJCX0KCQkJCQkJCX0gZWxzZSB7IC8vIE5vcm1hbCBzcG90LgoJCQkJCQkJCSRyZXdyaXRlX2xpbmVzW10gPSAnUmV3cml0ZVJ1bGUgLiAnIC4gJHJld3JpdGVfcGF0aCAuICcvaW5kZXgucGhwJyAuICJcbiI7CgkJCQkJCQkJJGh0YWNjZXNzTmVlZHNVcGRhdGluZyA9IHRydWU7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7IC8vIFVzZXIgY3VzdG9tIHJld3JpdGVydWxlIHdlIGRpZCBub3QgdXBkYXRlLgoJCQkJCQkJCgkJCQkJCQkkcmV3cml0ZV9saW5lc1tdID0gICRsaW5lOyAvLyBDYXB0dXJlcyBldmVyeXRoaW5nIGluc2lkZSBXb3JkUHJlc3MgYmxvY2sgd2UgYXJlbnQgbW9kaWZ5aW5nLgoJCQkJCQkJaWYgKCBmYWxzZSAhPT0gc3Ryc3RyKCAkbGluZSwgJ1Jld3JpdGVSdWxlIC4gJykgKSB7IC8vIFJld3JpdGVSdWxlLCB3YXJuIHVzZXIgcG90ZW50aWFsbHkgaWYgcGF0aCBtYXkgbmVlZCBjaGFuZ2VkLgoJCQkJCQkJCWlmICggJG9sZF9wYXRoICE9PSAkcmV3cml0ZV9wYXRoICkgewoJCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdVc2VyLWRlZmluZWQgUmV3cml0ZVJ1bGUgZm91bmQgYW5kIFdvcmRQcmVzcyBwYXRoIGhhcyBjaGFuZ2VkIHNvIHRoaXMgcnVsZSBNQVkgbmVlZCBtYW51YWxseSB1cGRhdGVkIGJ5IHlvdSB0byBmdW5jdGlvbiBwcm9wZXJseS4gIExpbmU6ICInIC4gJGxpbmUgLiAnIi4nICk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCX0KCQkJCQl9CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQl9CgkJCX0gZWxzZSB7IC8vIE91dHNpZGUgYSBXb3JkUHJlc3Mgc2VjdGlvbi4KCQkJCWlmICggc3Ryc3RyKCAkbGluZSwgJ0JFR0lOIFdvcmRQcmVzcycgKSApIHsKCQkJCQkkZ290X3Jld3JpdGUgPSB0cnVlOyAvLyBCZWdpbm5pbmcgb2YgYSBXb3JkUHJlc3MgYmxvY2sgc28gc3RhcnQgcmVwbGFjaW5nLgoJCQkJfQoJCQkJaWYgKCBzdHJzdHIoICRsaW5lLCAnQWRkSGFuZGxlcicgKSApIHsgLy8gSGFzIEFkZEhhbmRsZXIuIFNraXAga2VlcGluZyB0aGlzIGxpbmUgLS0gaWYgaW1wb3J0YnVkZHkgaXMgcnVubmluZyBub3cgdGhlbiB3ZSBkbyBub3QgbmVlZCB0aGlzIG1vc3QgbGlrZWx5LgoJCQkJCSRtZXNzYWdlID0gJ0FuIEFkZEhhbmRsZXIgZGlyZWN0aXZlIGhhcyBiZWVuIGZvdW5kIGluIHlvdXIgLmh0YWNjZXNzIGZpbGUuIFRoaXMgY291bGQgcmVzdWx0IGluIFdvcmRQcmVzcyBhbmQgUEhQIG5vdCBydW5uaW5nIHByb3Blcmx5IGlmIGNvbmZpZ3VyZWQgaW1wcm9wZXJseSwgZXNwZWNpYWxseSB3aGVuIG1pZ3JhdGluZyB0byBhIG5ldyBzZXJ2ZXIuIElmIHlvdSBlbmNvdW50ZXIgcHJvYmxlbXMgc3VjaCBhcyBhbiBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3Igb3IgRXJyb3IgNTAwLCB0cnkgcmVtb3ZpbmcgdGhpcyBsaW5lIGZyb20geW91ciAuaHRhY2Nlc3MgZmlsZS4gIExpbmU6ICInIC4gJGxpbmUgLiAnIi4nOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJG1lc3NhZ2UgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICRtZXNzYWdlICk7CgkJCQl9IGVsc2UgewoJCQkJCSRyZXdyaXRlX2xpbmVzW10gPSAgJGxpbmU7IC8vIENhcHR1cmVzIGV2ZXJ5dGhpbmcgb3V0c2lkZSBvZiBXb3JkUHJlc3MgYmxvY2sgKGV4Y2VwdCBhZGRoYW5kbGVyIHN0dWZmKS4KCQkJCX0KCQkJfQoJCX0gLy8gZW5kIGZvcmVhY2guCgkJCgkJLy8gSWYgdGhlIFVSTCAoZG9tYWluIGFuZC9vciBVUkwgc3ViZGlyZWN0b3J5ICkgaGFzIGNoYW5nZWQsIHRoZW4gbmVlZCB0byB1cGRhdGUgLmh0YWNjZXNzLmJiX3RlbXAgZmlsZS4KCQkKCQkKCQkKCQlpZiAoIHRydWUgPT09ICRodGFjY2Vzc05lZWRzVXBkYXRpbmcgKSB7CgkJCS8vIENoZWNrIHRoYXQgd2UgY2FuIHdyaXRlIHRvIHRoaXMgZmlsZSAoaWYgaXQgYWxyZWFkeSBleGlzdHMpLgoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkaHRhY2Nlc3NGaWxlICkgJiYgKCAhIGlzX3dyaXRhYmxlKCAkaHRhY2Nlc3NGaWxlICkgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ1dhcm5pbmcgIzI4NTczOiBUZW1wIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUgc2hvd3MgdG8gYmUgdW53cml0YWJsZS4gQXR0ZW1wdGluZyB0byBvdmVycmlkZSBwZXJtaXNzaW9ucyB0ZW1wb3JhcmlseS4nICk7CgkJCQkkb2xkUGVybXMgPSAoIGZpbGVwZXJtcyggJGh0YWNjZXNzRmlsZSApICYgMDc3NyApOwoJCQkJQGNobW9kKCAkaHRhY2Nlc3NGaWxlLCAwNjQ0ICk7IC8vIFRyeSB0byBtYWtlIHdyaXRhYmxlLgoJCQkJLy8gQ2hlY2sgaWYgc3RpbGwgbm90IHdyaXRhYmxlLi4uCgkJCQlpZiAoICEgaXNfd3JpdGFibGUoICRodGFjY2Vzc0ZpbGUgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzkwMjA6IFVuYWJsZSB0byB3cml0ZSB0byBgJyAuIGJhc2VuYW1lKCAkaHRhY2Nlc3NGaWxlICkgLiAnYCBmaWxlLiBWZXJpZnkgcGVybWlzc2lvbnMuJyApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1dhcm5pbmc6IFVuYWJsZSB0byB3cml0ZSB0byB0ZW1wb3JhcnkgLmh0YWNjZXNzIGZpbGUuIFZlcmlmeSB0aGlzIGZpbGUgaGFzIHByb3BlciB3cml0ZSBwZXJtaXNzaW9ucy4gWW91IG1heSByZWNlaXZlIDQwNCBOb3QgRm91bmQgZXJyb3JzIG9uIHlvdXIgc2l0ZSBpZiB0aGlzIGlzIG5vdCBjb3JyZWN0ZWQuIFRvIGZpeCBhZnRlciBtaWdyYXRpb24gY29tcGxldGVzOiBMb2cgaW4gdG8geW91ciBXb3JkUHJlc3MgYWRtaW4gYW5kIHNlbGVjdCBTZXR0aW5nczogUGVybWFsaW5rcyBmcm9tIHRoZSBsZWZ0IG1lbnUgdGhlbiBzYXZlLiBUbyBtYW51YWxseSB1cGRhdGUsIGNvcHkvcGFzdGUgdGhlIGZvbGxvd2luZyBpbnRvIHlvdXIgLmh0YWNjZXNzIGZpbGU6IDx0ZXh0YXJlYT4nIC4gaW1wbG9kZSggJHJld3JpdGVfbGluZXMgKSAuICc8L3RleHRhcmVhPicsICc5MDIwJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoKCQkJJGhhbmRsaW5nID0gZm9wZW4oICRodGFjY2Vzc0ZpbGUsICd3Jyk7CgkJCWZ3cml0ZSggJGhhbmRsaW5nLCBpbXBsb2RlKCAkcmV3cml0ZV9saW5lcyApICk7CgkJCWZjbG9zZSggJGhhbmRsaW5nICk7CgkJCXVuc2V0KCAkaGFuZGxpbmcgKTsKCgkJCS8vIFJlc3RvcmUgcHJpb3IgcGVybWlzc2lvbnMgaWYgYXBwbGljYWJsZS4KCQkJaWYgKCBpc3NldCggJG9sZFBlcm1zICkgKSB7CgkJCQlAY2htb2QoICRodGFjY2Vzc0ZpbGUsICRvbGRQZXJtcyApOwoJCQl9CgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdNaWdyYXRlZCBgJyAuIGJhc2VuYW1lKCAkaHRhY2Nlc3NGaWxlICkgLiAnYCBmaWxlLiBJdCB3aWxsIGJlIHJlbmFtZWQgYmFjayB0byBgLmh0YWNjZXNzYCBvbiB0aGUgZmluYWwgc3RlcC4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnTm8gY2hhbmdlcyBuZWVkZWQgZm9yIGAnIC4gYmFzZW5hbWUoICRodGFjY2Vzc0ZpbGUgKSAuICdgIGZpbGUuJyApOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBtaWdyYXRlSHRhY2Nlc3MoKS4KCQoJCgkKCWZ1bmN0aW9uIGdldERlZmF1bHRVcmwoKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCS8vIEdldCB0aGUgY3VycmVudCBVUkwgb2Ygd2hlcmUgdGhlIGltcG9ydGJ1ZGR5IHRvb2wgaXMgcnVubmluZy4KCQkkdXJsID0gc3RyX3JlcGxhY2UoICRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSwgJycsICRfU0VSVkVSWydSRVFVRVNUX1VSSSddICk7CgkJJHVybCA9IHN0cl9yZXBsYWNlKCBiYXNlbmFtZSggJHVybCApICwgJycsICR1cmwgKTsKCQkkdXJsID0gcHJlZ19yZXBsYWNlKCAnfC8qJHwnLCAnJywgJHVybCApOyAgLy8gc3RyaXBzIHRyYWlsaW5nIHNsYXNoKGVzKS4KCQkkdXJsID0gJ2h0dHA6Ly8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gJHVybDsKCQkKCQlyZXR1cm4gJHVybDsKCX0gLy8gRW5kIGdldERlZmF1bHRVcmwoKS4KCQoJCgkKCWZ1bmN0aW9uIGdldERlZmF1bHREb21haW4oKSB7CgkJJHRoaXMtPl9iZWZvcmUoIF9fRlVOQ1RJT05fXyApOwoJCQoJCXByZWdfbWF0Y2goIi9eKGh0dHA6XC9cLyk/KFteXC9dKykvaSIsICR0aGlzLT5nZXREZWZhdWx0VXJsKCksICRkb21haW4gKTsKCQlyZXR1cm4gJGRvbWFpblsyXTsKCX0gLy8gRW5kIGdldERlZmF1bHREb21haW4oKS4KCQoJCgkKCS8qKgoJICoJY29ubmVjdERhdGFiYXNlKCkKCSAqCgkgKglJbml0aWFsaXplcyBhIGNvbm5lY3Rpb24gdG8gdGhlIG15c3FsIGRhdGFiYXNlLgoJICoJUkVRVUlSRVM6IGRhdGFiYXNlU2V0dGluZ3MgcG9ydGlvbiBvZiBzdGF0ZSB0byBiZSBzZXQuCgkgKgoJICoJQHJldHVybgkJYm9vbGVhbgkJVHJ1ZSBvbiBzdWNjZXNzOyBlbHNlIGZhbHNlLiBTdWNjZXNzIHRlc3RpbmcgaXMgdmVyeSBsb29zZS4KCSAqLwoJZnVuY3Rpb24gY29ubmVjdERhdGFiYXNlKCkgewoJCSR0aGlzLT5fYmVmb3JlKCBfX0ZVTkNUSU9OX18gKTsKCQkKCQlnbG9iYWwgJHdwZGI7CgkJJHdwZGIgPSBuZXcgd3BkYiggJHRoaXMtPl9zdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWyd1c2VybmFtZSddLCAkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3Bhc3N3b3JkJ10sICR0aGlzLT5fc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2UnXSwkdGhpcy0+X3N0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddICk7CgkJCgkJcmV0dXJuIHRydWU7Cgl9IC8vIEVuZCBjb25uZWN0RGF0YWJhc2UoKS4KCQoJCgkKCS8qIF9lcnJvcigpCgkgKgoJICogTG9ncyBlcnJvciBtZXNzYWdlcyBmb3IgcmV0cmlldmFsIHdpdGggZ2V0RXJyb3JzKCkuCgkgKgoJICogQHBhcmFtCXN0cmluZwkJJG1lc3NhZ2UJRXJyb3IgbWVzc2FnZSB0byBsb2cuCgkgKiBAcmV0dXJuCW51bGwKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfZXJyb3IoICRtZXNzYWdlICkgewoJCSR0aGlzLT5fZXJyb3JzW10gPSAkbWVzc2FnZTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCXJldHVybiBmYWxzZTsKCX0KCQoJCgkKCS8qIGdldEVycm9ycygpCgkgKgoJICogR2V0IGFueSBlcnJvcnMgd2hpY2ggbWF5IGhhdmUgb2NjdXJyZWQuCgkgKgoJICogQHJldHVybglhcnJheSAJCVJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5nIGVycm9yIG1lc3NhZ2VzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCkgewoJCXJldHVybiAkdGhpcy0+X2Vycm9yczsKCX0gLy8gRW5kIGdldEVycm9ycygpOwoJCgkKCQoJLyogZ2V0U3RhdGUoKQoJICoKCSAqIEdldCBzdGF0ZSBhcnJheSBkYXRhIGZvciBwYXNzaW5nIHRvIHRoZSBjb25zdHJ1Y3RvciBmb3Igc3Vic2VxdWVudCBjYWxscy4KCSAqCgkgKiBAcmV0dXJuCWFycmF5IAkJUmV0dXJucyBhbiBhcnJheSBvZiBzdGF0ZSBkYXRhLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdGUoKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnR2V0dGluZyByb2xsYmFjayBzdGF0ZS4nICk7CgkJcmV0dXJuICR0aGlzLT5fc3RhdGU7Cgl9IC8vIEVuZCBnZXRTdGF0ZSgpLgoJCgkKCQoJLyogc2V0U3RhdGUoKQoJICoKCSAqIFJlcGxhY2UgY3VycmVudCBzdGF0ZSBhcnJheSB3aXRoIHByb3ZpZGVkIG9uZS4KCSAqCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRTdGF0ZSggJHN0YXRlRGF0YSApIHsKCQkkdGhpcy0+X3N0YXRlID0gJHN0YXRlRGF0YTsKCX0gLy8gRW5kIHNldFN0YXRlKCkuCgkKCQoJCgkvKiBfYmVmb3JlKCkKCSAqCgkgKiBSdW5zIGJlZm9yZSBldmVyeSBmdW5jdGlvbiB0byBrZWVwIHRyYWNrIG9mIHJhbiBmdW5jdGlvbnMgaW4gdGhlIHN0YXRlIGRhdGEgZm9yIGRlYnVnZ2luZy4KCSAqCgkgKiBAcmV0dXJuCW51bGwKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfYmVmb3JlKCAkZnVuY3Rpb25OYW1lICkgewoJCSR0aGlzLT5fc3RhdGVbJ3N0ZXBIaXN0b3J5J11bXSA9IGFycmF5KCAnZnVuY3Rpb24nID0+ICRmdW5jdGlvbk5hbWUsICdzdGFydCcgPT4gdGltZSgpICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnU3RhcnRpbmcgZnVuY3Rpb24gYCcgLiAkZnVuY3Rpb25OYW1lIC4gJ2AuJyApOwoJCXJldHVybjsKCX0gLy8gRW5kIF9iZWZvcmUoKS4KCQoJCgkKCS8qCXNodXRkb3duX2Z1bmN0aW9uKCkKCSAqCQoJICoJVXNlZCBmb3IgY2F0Y2hpbmcgZmF0YWwgUEhQIGVycm9ycyBkdXJpbmcgYmFja3VwIHRvIHdyaXRlIHRvIGxvZyBmb3IgZGVidWdnaW5nLgoJICoJCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzaHV0ZG93bl9mdW5jdGlvbigpIHsKCQkKCQkvLyBHZXQgZXJyb3IgbWVzc2FnZS4KCQkvLyBFcnJvciB0eXBlczogaHR0cDovL3BocC5uZXQvbWFudWFsL2VuL2Vycm9yZnVuYy5jb25zdGFudHMucGhwCgkJJGUgPSBlcnJvcl9nZXRfbGFzdCgpOwoJCWlmICggJGUgPT09IE5VTEwgKSB7IC8vIE5vIGVycm9yIG9mIGFueSBraW5kLgoJCQlyZXR1cm47CgkJfSBlbHNlIHsgLy8gU29tZSB0eXBlIG9mIGVycm9yLgoJCQlpZiAoICFpc19hcnJheSggJGUgKSB8fCAoICRlWyd0eXBlJ10gIT0gRV9FUlJPUiApICYmICggJGVbJ3R5cGUnXSAhPSBFX1VTRVJfRVJST1IgKSApIHsgLy8gUmV0dXJuIGlmIG5vdCBhIGZhdGFsIGVycm9yLgoJCQkJcmV0dXJuOwoJCQl9CgkJfQoJCQoJCSRlX3N0cmluZyA9ICcnOwoJCWZvcmVhY2goIChhcnJheSkkZSBhcyAkZV9saW5lX3RpdGxlID0+ICRlX2xpbmUgKSB7CgkJCSRlX3N0cmluZyAuPSAkZV9saW5lX3RpdGxlIC4gJyA9PiAnIC4gJGVfbGluZSAuICJcbiI7CgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdGQVRBTCBQSFAgRVJST1I6ICcgLiAkZV9zdHJpbmcgKTsKCQkKCX0gLy8gRW5kIHNodXRkb3duX2Z1bmN0aW9uLgoJCgkKCQoJZnVuY3Rpb24gX2FycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCRhcnJheSwgJGFycmF5MSkgewoJCWZ1bmN0aW9uIHJlY3Vyc2UoJGFycmF5LCAkYXJyYXkxKQoJCXsKCQkgIGZvcmVhY2ggKCRhcnJheTEgYXMgJGtleSA9PiAkdmFsdWUpCgkJICB7CgkJICAgIC8vIGNyZWF0ZSBuZXcga2V5IGluICRhcnJheSwgaWYgaXQgaXMgZW1wdHkgb3Igbm90IGFuIGFycmF5CgkJICAgIGlmICghaXNzZXQoJGFycmF5WyRrZXldKSB8fCAoaXNzZXQoJGFycmF5WyRrZXldKSAmJiAhaXNfYXJyYXkoJGFycmF5WyRrZXldKSkpCgkJICAgIHsKCQkgICAgICAkYXJyYXlbJGtleV0gPSBhcnJheSgpOwoJCSAgICB9CgoJCSAgICAvLyBvdmVyd3JpdGUgdGhlIHZhbHVlIGluIHRoZSBiYXNlIGFycmF5CgkJICAgIGlmIChpc19hcnJheSgkdmFsdWUpKQoJCSAgICB7CgkJICAgICAgJHZhbHVlID0gcmVjdXJzZSgkYXJyYXlbJGtleV0sICR2YWx1ZSk7CgkJICAgIH0KCQkgICAgJGFycmF5WyRrZXldID0gJHZhbHVlOwoJCSAgfQoJCSAgcmV0dXJuICRhcnJheTsKCQl9CgoJCS8vIGhhbmRsZSB0aGUgYXJndW1lbnRzLCBtZXJnZSBvbmUgYnkgb25lCgkJJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJJGFycmF5ID0gJGFyZ3NbMF07CgkJaWYgKCFpc19hcnJheSgkYXJyYXkpKQoJCXsKCQkgIHJldHVybiAkYXJyYXk7CgkJfQoJCWZvciAoJGkgPSAxOyAkaSA8IGNvdW50KCRhcmdzKTsgJGkrKykKCQl7CgkJICBpZiAoaXNfYXJyYXkoJGFyZ3NbJGldKSkKCQkgIHsKCQkgICAgJGFycmF5ID0gcmVjdXJzZSgkYXJyYXksICRhcmdzWyRpXSk7CgkJICB9CgkJfQoJCXJldHVybiAkYXJyYXk7Cgl9CgkKCQoJCn0gLy8gZW5kIGNsYXNzLgoK
###PACKDATA,FILE_END,/classes/restore.php,importbuddy/classes/restore.php
###PACKDATA,FILE_START,/classes/_restoreFiles.php,importbuddy/classes/_restoreFiles.php
PD9waHAKY2xhc3MgYmFja3VwYnVkZHlfcmVzdG9yZV9maWxlcyB7CgoJLyogcmVzdG9yZSgpCgkgKgoJICogUmVzdG9yZSBvbmUgb3IgbW9yZSBmaWxlcyB0byBhIHBhdGguCgkgKgoJICogQHBhcmFtCSRhcmNoaXZlX2ZpbGUJQmFja3VwIHppcCBhcmNoaXZlIGZpbGUgdG8gcmVzdG9yZSBmaWxlcyBmcm9tLgoJICogQHBhcmFtCSRmaWxlcwkJCUFycmF5IG9mIGZpbGVzIHRvIHJlc3RvcmUuIEVhY2gga2V5IGFuZCB2YWx1ZSBtdXN0IGJlIHRoZSBzYW1lLiBGb3JtYXQ6IGFycmF5KCAnZmlsZW5hbWUudHh0JyA9PiAnZmlsZW5hbWUudHh0JyApOwoJICogQHBhcmFtCSRmaW5hbFBhdGgJCURlc3RpbmF0aW9uIHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJICogQHJldHVybglib29sCQkJVHJ1ZSBvbiBzdWNjZXNzLCBlbHNlIGZhbHNlLgoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0b3JlKCAkYXJjaGl2ZV9maWxlLCAkZmlsZXMsICRmaW5hbFBhdGgsICYkemlwYnVkZHkgPSBudWxsICkgewoJCWlmICggIWRlZmluZWQoICdQQl9TVEFOREFMT05FJyApIHx8IFBCX1NUQU5EQUxPTkUgPT09IGZhbHNlICkgewoJCQlpZiAoICEgY3VycmVudF91c2VyX2NhbiggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyb2xlX2FjY2VzcyddICkgKSB7CgkJCQlkaWUoICdFcnJvciAjNDczNjIzLiBBY2Nlc3MgRGVuaWVkLicgKTsKCQkJfQoJCX0KCQkKCQkkc2VyaWFsID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0X3NlcmlhbF9mcm9tX2ZpbGUoICRhcmNoaXZlX2ZpbGUgKTsgLy8gc2VyaWFsIG9mIGFyY2hpdmUuCgkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQkKCQlmb3JlYWNoKCAkZmlsZXMgYXMgJGZpbGUgKSB7CgkJCSRmaWxlID0gc3RyX3JlcGxhY2UoICcqJywgJycsICRmaWxlICk7IC8vIFJlbW92ZSBhbnkgd2lsZGNhcmQuCgkJCWlmICggZmlsZV9leGlzdHMoICRmaW5hbFBhdGggLiAkZmlsZSApICYmIGlzX2RpciggJGZpbmFsUGF0aCAuICRmaWxlICkgKSB7CgkJCQlpZiAoICggJGZpbGVfY291bnQgPSBAc2NhbmRpciggJGZpbmFsUGF0aCAuICRmaWxlICkgKSAmJiAoIGNvdW50KCAkZmlsZV9jb3VudCApID4gMiApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsIF9fKCAnRXJyb3IgIzkwMzYuIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYmVpbmcgcmVzdG9yZWQgYWxyZWFkeSBleGlzdHMgYW5kIGlzIE5PVCBlbXB0eS4gVGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSByZXN0b3JlZCB0byBwcmV2ZW50IGluYWR2ZXJ0ZW50bHkgbG9zaW5nIGZpbGVzIHdpdGhpbiB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5LiBEZWxldGUgZXhpc3RpbmcgZGlyZWN0b3J5IGZpcnN0IGlmIHlvdSB3aXNoIHRvIHByb2NlZWQgb3IgcmVzdG9yZSBpbmRpdmlkdWFsIGZpbGVzLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBFeGlzdGluZyBkaXJlY3Rvcnk6IGAnIC4gJGZpbmFsUGF0aCAuICRmaWxlIC4gJ2AuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkKCQlpZiAoIG51bGwgPT09ICR6aXBidWRkeSApIHsKCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCcgKTsKCQkJJHppcGJ1ZGR5ID0gbmV3IHBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5KCBiYWNrdXBidWRkeV9jb3JlOjpnZXRCYWNrdXBEaXJlY3RvcnkoKSApOwoJCX0KCQkKCQkKCQkvLyBDYWxjdWxhdGUgdGVtcCBkaXJlY3RvcnkgJiBsb2NrIGl0IGRvd24uCgkJJHRlbXBfZGlyID0gZ2V0X3RlbXBfZGlyKCk7CgkJJGRlc3RpbmF0aW9uID0gJHRlbXBfZGlyIC4gJ2JhY2t1cGJ1ZGR5LScgLiAkc2VyaWFsOwoJCWlmICggKCAoICEgZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbiApICkgJiYgKCBmYWxzZSA9PT0gbWtkaXIoICRkZXN0aW5hdGlvbiwgMDc3NywgdHJ1ZSApICkgKSApIHsKCQkJJGVycm9yID0gJ0Vycm9yICM0NTg0ODU5NDU6IFVuYWJsZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGxvY2F0aW9uIGAnIC4gJGRlc3RpbmF0aW9uIC4gJ2AuIENoZWNrIHBlcm1pc3Npb25zLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCS8vIElmIHRlbXAgZGlyZWN0b3J5IGlzIHdpdGhpbiB3ZWJyb290IHRoZW4gbG9jayBpdCBkb3duLgoJCSR0ZW1wX2RpciA9IHN0cl9yZXBsYWNlKCAnXFwnLCAnLycsICR0ZW1wX2RpciApOyAvLyBOb3JtYWxpemUgZm9yIFdpbmRvd3MuCgkJJHRlbXBfZGlyID0gcnRyaW0oICR0ZW1wX2RpciwgJy9cXCcgKSAuICcvJzsgLy8gRW5mb3JjZSBzaW5nbGUgdHJhaWxpbmcgc2xhc2guCgkJaWYgKCBGQUxTRSAhPT0gc3RyaXN0ciggJHRlbXBfZGlyLCBBQlNQQVRIICkgKSB7IC8vIFRlbXAgZGlyIGlzIHdpdGhpbiB3ZWJyb290LgoJCQlwYl9iYWNrdXBidWRkeTo6YW50aV9kaXJlY3RvcnlfYnJvd3NpbmcoICRkZXN0aW5hdGlvbiApOwoJCX0KCQl1bnNldCggJHRlbXBfZGlyICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXh0cmFjdGluZyBpbnRvIHRlbXBvcmFyeSBkaXJlY3RvcnkgIicgLiAkZGVzdGluYXRpb24gLiAnIi4nICk7CgkJCgkJJHByZXR0eUZpbGVzTGlzdCA9IGFycmF5KCk7CgkJZm9yZWFjaCggJGZpbGVzIGFzICRmaWxlU291cmNlID0+ICRmaWxlRGVzdGluYXRpb24gKSB7CgkJCSRwcmV0dHlGaWxlc0xpc3RbXSA9ICRmaWxlU291cmNlIC4gJyA9PiAnIC4gJGZpbGVEZXN0aW5hdGlvbjsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmlsZXMgdG8gZXh0cmFjdDogYCcgLiBodG1sZW50aXRpZXMoIGltcGxvZGUoICcsICcsICRwcmV0dHlGaWxlc0xpc3QgKSApIC4gJ2AuJyApOwoJCXVuc2V0KCAkcHJldHR5RmlsZXNMaXN0ICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OmZsdXNoKCk7CgkJCgkJLy8gRG8gdGhlIGFjdHVhbCBleHRyYWN0aW9uLgoJCSRleHRyYWN0X3N1Y2Nlc3MgPSB0cnVlOwoJCWlmICggZmFsc2UgPT09ICR6aXBidWRkeS0+ZXh0cmFjdCggJGFyY2hpdmVfZmlsZSwgJGRlc3RpbmF0aW9uLCAkZmlsZXMgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM1ODQ5ODQ0NThiLiBVbmFibGUgdG8gZXh0cmFjdC4nICk7CgkJCSRleHRyYWN0X3N1Y2Nlc3MgPSBmYWxzZTsKCQl9CgkJCgkJaWYgKCB0cnVlID09PSAkZXh0cmFjdF9zdWNjZXNzICkgewoJCQkKCQkJLy8gVmVyaWZ5IGFsbCBmaWxlcy9kaXJlY3RvcmllcyB0byBiZSBleHRyYWN0ZWQgZXhpc3QgaW4gdGVtcCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIElmIGFueSBtaXNzaW5nIHRoZW4gZGVsZXRlIGV2ZXJ5dGhpbmcgYW5kIGJhaWwgb3V0LgoJCQlmb3JlYWNoKCAkZmlsZXMgYXMgJiRmaWxlICkgewoJCQkJJGZpbGUgPSBzdHJfcmVwbGFjZSggJyonLCAnJywgJGZpbGUgKTsgLy8gUmVtb3ZlIGFueSB3aWxkY2FyZC4KCQkJCWlmICggISBmaWxlX2V4aXN0cyggJGRlc3RpbmF0aW9uIC4gJy8nIC4gJGZpbGUgKSApIHsKCQkJCQkvLyBDbGVhbnVwLgoJCQkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCQkJQHRyaWdnZXJfZXJyb3IoICcnICk7IC8vIENsZWFyIG91dCBsYXN0IGVycm9yLgoJCQkJCQlAdW5saW5rKCAkZGVzdGluYXRpb24gLiAnLycgLiAkZmlsZSk7CgkJCQkJCSRsYXN0X2Vycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKCQkJCQkJaWYgKCBpc19hcnJheSggJGxhc3RfZXJyb3IgKSApIHsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRsYXN0X2Vycm9yWydtZXNzYWdlJ10gLiAnIEZpbGU6IGAnIC4gJGxhc3RfZXJyb3JbJ2ZpbGUnXSAuICdgLiBMaW5lOiBgJyAuICRsYXN0X2Vycm9yWydsaW5lJ10gLiAnYC4nICk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM4NTQ3ODM0NzQuIE9uZSBvciBtb3JlIGV4cGVjdGVkIGZpbGVzIC8gZGlyZWN0b3JpZXMgbWlzc2luZy4nICk7CgkJCQkJCgkJCQkJJGV4dHJhY3Rfc3VjY2VzcyA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCXVuc2V0KCAkZmlsZSApOwoJCQkKCQkJLy8gTWFkZSBpdCB0aGlzIGZhciBzbyBmaWxlcyBhbGwgZXhpc3QuIE1vdmUgdGhlbSBhbGwuCgkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCUB0cmlnZ2VyX2Vycm9yKCAnJyApOyAvLyBDbGVhciBvdXQgbGFzdCBlcnJvci4KCQkJCWlmICggZmFsc2UgPT09IHBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+cmVjdXJzaXZlX2NvcHkoICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlLCAkZmluYWxQYXRoIC4gJGZpbGUgKSApIHsKCQkJCQkkbGFzdF9lcnJvciA9IGVycm9yX2dldF9sYXN0KCk7CgkJCQkJaWYgKCBpc19hcnJheSggJGxhc3RfZXJyb3IgKSApIHsKCQkJCQkJLy9wcmludF9yKCAkbGFzdF9lcnJvciApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbGFzdF9lcnJvclsnbWVzc2FnZSddIC4gJyBGaWxlOiBgJyAuICRsYXN0X2Vycm9yWydmaWxlJ10gLiAnYC4gTGluZTogYCcgLiAkbGFzdF9lcnJvclsnbGluZSddIC4gJ2AuJyApOwoJCQkJCX0KCQkJCQkkZXJyb3IgPSAnRXJyb3IgIzkwMzUuIFVuYWJsZSB0byBjb3B5cmVzdG9yZWQgZmlsZSBgJyAuICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlIC4gJ2AgdG8gYCcgLiAkZmluYWxQYXRoIC4gJGZpbGUgLiAnYC4gVmVyaWZ5IHBlcm1pc3Npb25zIG9uIGRlc3RpbmF0aW9uIGxvY2F0aW9uICYgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5L2ZpbGUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4nOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRlcnJvciApOwoJCQkJfSBlbHNlIHsKCQkJCQkkZGV0YWlscyA9ICdSZWN1cnNpdmVseSBtb3ZlZCBgJyAuICRkZXN0aW5hdGlvbiAuICcvJyAuICRmaWxlIC4gJ2AgdG8gYCcgLiAkZmluYWxQYXRoIC4gJGZpbGUgLiAnYC48YnI+JzsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICRkZXRhaWxzICk7CgkJCQkJJHN1Y2Nlc3MgPSB0cnVlOwoJCQkJfQoJCQl9CgkJCQoJCX0gLy8gZW5kIGV4dHJhY3Qgc3VjY2Vzcy4KCQkKCQkKCQkvLyBUcnkgdG8gY2xlYW51cC4KCQlpZiAoIGZpbGVfZXhpc3RzKCAkZGVzdGluYXRpb24gKSApIHsKCQkJaWYgKCBmYWxzZSA9PT0gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkZGVzdGluYXRpb24gKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VuYWJsZSB0byBkZWxldGUgdGVtcG9yYXJ5IGhvbGRpbmcgZGlyZWN0b3J5IGAnIC4gJGRlc3RpbmF0aW9uIC4gJ2AuJyApOwoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2xlYW5lZCB1cCB0ZW1wb3JhcnkgZmlsZXMuJyApOwoJCQl9CgkJfQoJCQoJCQoJCWlmICggdHJ1ZSA9PT0gJHN1Y2Nlc3MgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0ZpbGUgcmV0cmlldmFsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyApOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJfSAvLyBFbmQgZnVuY3Rpb24gcmVzdG9yZSgpLgoKfSAvLyBFbmQgY2xhc3Mu
###PACKDATA,FILE_END,/classes/_restoreFiles.php,importbuddy/classes/_restoreFiles.php
###PACKDATA,FILE_START,/classes/remote_api.php,importbuddy/classes/remote_api.php
PD9waHAKcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9jb3JlLnBocCcgKTsKCgpjbGFzcyBiYWNrdXBidWRkeV9yZW1vdGVfYXBpIHsKCQoJcHJpdmF0ZSBzdGF0aWMgJF9lcnJvcnMgPSBhcnJheSgpOwkJLy8gSG9sZCBlcnJvciBzdHJpbmdzIHRvIHJldHJpZXZlIHdpdGggZ2V0RXJyb3JzKCkuCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9jYWxDYWxsKCAkc2VjdXJlID0gZmFsc2UsICRpbXBvcnRidWRkeSA9IGZhbHNlICkgewoJCWlmICggdHJ1ZSAhPT0gJHNlY3VyZSApIHsKCQkJZGllKCAnPGh0bWw+NDAzIEFjY2VzcyBEZW5pZWQ8L2h0bWw+JyApOwoJCX0KCQkKCQlpZiAoIHRydWUgIT09IHNlbGY6OmlzX2NhbGxfdmFsaWQoKSApIHsKCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzg0ODM5NzQ6IEVycm9yIHZhbGlkYXRpbmcgQVBJIGNhbGwgYXV0aGVudGljaXR5Lic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJfQoJCQoJCS8vIElmIGhlcmUgdGhlbiB2YWxpZGF0aW9uIHdhcyBhbGwgZ29vZC4gQVBJIGNhbGwgaXMgYXV0aG9yaXplZC4KCQkKCQlpZiAoIHRydWUgIT09ICRpbXBvcnRidWRkeSApIHsKCQkJJGZ1bmN0aW9uTmFtZSA9ICdfdmVyYl8nIC4gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAndmVyYicgKTsKCQl9IGVsc2UgewoJCQkkZnVuY3Rpb25OYW1lID0gJ192ZXJiX2ltcG9ydGJ1ZGR5XycgLiBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICd2ZXJiJyApOwoJCX0KCQkKCQkvLyBEb2VzIHZlcmIgZXhpc3Q/CgkJaWYgKCBmYWxzZSA9PT0gbWV0aG9kX2V4aXN0cyggJ2JhY2t1cGJ1ZGR5X3JlbW90ZV9hcGknLCAkZnVuY3Rpb25OYW1lICkgKSB7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICM4NDM0ODk5NzQ6IFVua25vd24gdmVyYiBgJyAuIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3ZlcmInICkgLiAnYC4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCX0gZWxzZSB7CgkJCWNhbGxfdXNlcl9mdW5jX2FycmF5KCAnYmFja3VwYnVkZHlfcmVtb3RlX2FwaTo6JyAuICRmdW5jdGlvbk5hbWUsIGFycmF5KCkgKTsKCQl9CgkJCgkJLy8gZnVuY3Rpb246IHZlcmJfW1ZFUkJIRVJFXQoJfQoJCgkKCQoJLyogcmVtb3RlQ2FsbCgpCgkgKgoJICogU2VuZCBhbiBBUEkgY2FsbCB0byBhIHJlbW90ZSBzZXJ2ZXIuCgkgKgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbW90ZUNhbGwoICRyZW1vdGVBUEksICR2ZXJiLCAkbW9yZVBhcmFtcyA9IGFycmF5KCksICR0aW1lb3V0LCAkZmlsZSA9ICcnLCAkZmlsZURhdGEgPSAnJywgJHNlZWtUbyA9ICcnLCAkaXNGaWxlVGVzdCA9ICcnLCAkaXNGaWxlRG9uZSA9IGZhbHNlLCAkZmlsZVNpemUgPSAnJywgJGZpbGVQYXRoID0gJycgKSB7CgkJZXJyb3JfbG9nKCAncmVtb3RlQ2FsbCgpJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ByZXBhcmluZyByZW1vdGUgQVBJIGNhbGwuJyApOwoJCSRub3cgPSB0aW1lKCk7CgkJCgkJJGJvZHkgPSBhcnJheSgKCQkJJ2JhY2t1cGJ1ZGR5X2FwaV9rZXknID0+ICRyZW1vdGVBUElbJ2tleV9wdWJsaWMnXSwKCQkJJ2JhY2t1cGJ1ZGR5X3ZlcnNpb24nID0+IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICksCgkJCSd2ZXJiJyA9PiAkdmVyYiwKCQkJJ25vdycgPT4gJG5vdywKCQkpOwoJCQoJCWlmICggISBpc19udW1lcmljKCAkdGltZW91dCApICkgewoJCQkkdGltZW91dCA9IDMwOwoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdyZW1vdGVDYWxsKCkgSFRUUCB3YWl0IHRpbWVvdXQ6IGAnIC4gJHRpbWVvdXQgLiAnYCBzZWNvbmRzLicgKTsKCQkKCQkkZmlsZWNyYyA9ICcnOwoJCWlmICggJycgIT0gJGZpbGUgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1JlbW90ZSBBUEkgc2VuZGluZyBmaWxlIGAnIC4gJGZpbGUgLiAnYC4nICk7CgkJCSRmaWxlRGF0YSA9IGJhc2U2NF9lbmNvZGUoICRmaWxlRGF0YSApOyAvLyBTYWRseSB3ZSBjYW5ub3Qgc2FmZWx5IHRyYW5zbWl0IGJpbmFyeSBkYXRhIG92ZXIgY3VybCB3aXRob3V0IHVzaW5nIGFuIGFjdHVhbCBmaWxlLiBiYXNlNjQgZW5jb2RpbmcgYWRkcyAzNyUgc2l6ZSBvdmVyaGVhZC4KCQkJJGZpbGVjcmMgPSBzcHJpbnRmICggIiV1IiwgY3JjMzIoICRmaWxlRGF0YSApICk7CgkJCSRib2R5WydmaWxlbmFtZSddID0gYmFzZW5hbWUoICRmaWxlICk7CgkJCWlmICggJycgIT0gJGZpbGVQYXRoICkgewoJCQkJJGJvZHlbJ2ZpbGVwYXRoJ10gPSAkZmlsZVBhdGg7CgkJCX0KCQkJJGJvZHlbJ2ZpbGVkYXRhJ10gPSAkZmlsZURhdGE7CgkJCSRib2R5WydmaWxlZGF0YWxlbiddID0gc3RybGVuKCAkZmlsZURhdGEgKTsKCQkJJGJvZHlbJ2ZpbGVjcmMnXSA9ICRmaWxlY3JjOwoJCQlpZiAoIHRydWUgPT09ICRpc0ZpbGVUZXN0ICkgewoJCQkJJGJvZHlbJ2ZpbGV0ZXN0J10gPSAnMSc7CgkJCX0gZWxzZSB7CgkJCQkkYm9keVsnZmlsZXRlc3QnXSA9ICcwJzsKCQkJfQoJCQlpZiAoIHRydWUgPT09ICRpc0ZpbGVEb25lICkgewoJCQkJJGJvZHlbJ2ZpbGVkb25lJ10gPSAnMSc7CgkJCX0gZWxzZSB7CgkJCQkkYm9keVsnZmlsZWRvbmUnXSA9ICcwJzsKCQkJfQoJCQkkYm9keVsnc2Vla3RvJ10gPSAkc2Vla1RvOyAvLyBMb2NhdGlvbiB0byBzZWVrIHRvIGJlZm9yZSB3cml0aW5nIHRoaXMgcGFydC4KCQkJaWYgKCAnJyAhPSAkZmlsZVNpemUgKSB7CgkJCQkkYm9keVsnZmlsZXRvdGFsc2l6ZSddID0gJGZpbGVTaXplOwoJCQl9CgkJfQoJCSRib2R5ID0gYXJyYXlfbWVyZ2UoICRib2R5LCAkbW9yZVBhcmFtcyApOwoJCQoJCS8vcHJpbnRfciggJGFwaUtleSApOwoJCSRib2R5WydzaWduYXR1cmUnXSA9IG1kNSggJG5vdyAuICR2ZXJiIC4gJHJlbW90ZUFQSVsna2V5X3B1YmxpYyddIC4gJHJlbW90ZUFQSVsna2V5X3NlY3JldCddIC4gJGZpbGVjcmMgKTsKCQkKCQlpZiAoIGRlZmluZWQoICdCQUNLVVBCVUREWV9ERVYnICkgJiYgKCB0cnVlID09PSBCQUNLVVBCVUREWV9ERVYgKSApIHsKCQkJZXJyb3JfbG9nKCAnQkFDS1VQQlVERFlfREVWLXJlbW90ZSBhcGkgaHR0cCBib2R5IFNFTkQtICcgLiBwcmludF9yKCAkYm9keSwgdHJ1ZSApICk7CgkJfQoJCQoJCSRyZXNwb25zZSA9IHdwX3JlbW90ZV9wb3N0KCAkcmVtb3RlQVBJWydzaXRldXJsJ10sIGFycmF5KAoJCQkJJ21ldGhvZCcgPT4gJ1BPU1QnLAoJCQkJJ3RpbWVvdXQnID0+ICggJHRpbWVvdXQgLSAyICksCgkJCQkncmVkaXJlY3Rpb24nID0+IDUsCgkJCQknaHR0cHZlcnNpb24nID0+ICcxLjAnLAoJCQkJJ2Jsb2NraW5nJyA9PiB0cnVlLAoJCQkJJ2hlYWRlcnMnID0+IGFycmF5KCksCgkJCQknYm9keScgPT4gJGJvZHksCgkJCQknY29va2llcycgPT4gYXJyYXkoKQoJCQkpCgkJKTsKCQlpZiAoIGlzX3dwX2Vycm9yKCAkcmVzcG9uc2UgKSApIHsKCQkJcmV0dXJuIHNlbGY6Ol9lcnJvciggJ0Vycm9yICM4NDQ3NzU1OiAnIC4gJHJlc3BvbnNlLT5nZXRfZXJyb3JfbWVzc2FnZSgpIC4gJyAtIFVSTDogYCcgLiAkcmVtb3RlQVBJWydzaXRldXJsJ10gLiAnYC4nICk7CgkJfSBlbHNlIHsKCQkJaWYgKCBudWxsID09PSAoICRyZXR1cm4gPSBqc29uX2RlY29kZSggJHJlc3BvbnNlWydib2R5J10sIHRydWUgKSApICkgewoJCQkJcmV0dXJuIHNlbGY6Ol9lcnJvciggJ0Vycm9yICM0NTQzNjY0OiBVbmFibGUgdG8gZGVjb2RlIGpzb24gcmVzcG9uc2UuIFZlcmlmeSByZW1vdGUgc2l0ZSBBUEkgVVJMLCBBUEkga2V5LCBhbmQgdGhhdCB0aGUgcmVtb3RlIHNpdGUgaGFzIHRoZSBBUEkgZW5hYmxlZC4gUmV0dXJuIGRhdGE6IGAnIC4gaHRtbGVudGl0aWVzKCBzdHJpcHNsYXNoZXNfZGVlcCggJHJlc3BvbnNlWydib2R5J10gKSApIC4gJ2AuJyApOwoJCQl9IGVsc2UgewoJCQkJaWYgKCB0cnVlICE9PSAkcmV0dXJuWydzdWNjZXNzJ10gKSB7CgkJCQkJcmV0dXJuIHNlbGY6Ol9lcnJvciggJ0Vycm9yICMzMjg5Mzc5OiBBUEkgZGlkIG5vdCByZXBvcnQgc3VjY2Vzcy4gRGV0YWlsczogYCcgLiAkcmV0dXJuWydlcnJvciddIC4gJ2AuJyApOwoJCQkJfSBlbHNlIHsKCQkJCQlpZiAoIGlzc2V0KCAkcmV0dXJuWydtZXNzYWdlJ10gKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzcG9uc2UgbWVzc2FnZSBmcm9tIEFQSTogJyAuICRyZXR1cm5bJ21lc3NhZ2UnXSAuICciLicgKTsKCQkJCQl9CgkJCQkJcmV0dXJuICRyZXR1cm47CgkJCQl9CgkJCX0KCQl9Cgl9IC8vIEVuZCByZW1vdGVDYWxsKCkuCgkKCQoJCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9ydW5CYWNrdXAoKSB7CgkJJGJhY2t1cFNlcmlhbCA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMCApOwoJCQoJCWJhY2t1cGJ1ZGR5X2FwaTo6cnVuQmFja3VwKCAkcHJvZmlsZUFycmF5LCAkdHJpZ2dlclRpdGxlID0gJ2RlcGxveW1lbnQnLCAkYmFja3VwTW9kZSA9ICcnLCAkYmFja3VwU2VyaWFsICk7Cgl9IC8vIEVuZCBfdmVyYl9ydW5CYWNrdXAoKS4KCQoJCgkvLyBSZWNlaXZlIGJhY2t1cCBhcmNoaXZlLgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfc2VuZEZpbGVfYmFja3VwKCkgewoJCXNlbGY6Ol9zZW5kRmlsZSggJ2JhY2t1cCcgKTsKCX0gLy8gRW5kIF92ZXJiX3NlbmRGaWxlX2JhY2t1cCgpLgoJCgkKCS8vIFJlY2VpdmUgYmFja3VwIGFyY2hpdmUuCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9zZW5kRmlsZV90aGVtZSgpIHsKCQlzZWxmOjpfc2VuZEZpbGUoICd0aGVtZScgKTsKCX0gLy8gRW5kIF92ZXJiX3NlbmRGaWxlX2JhY2t1cCgpLgoJCgkvLyBSZWNlaXZlIGJhY2t1cCBhcmNoaXZlLgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfc2VuZEZpbGVfcGx1Z2luKCkgewoJCXNlbGY6Ol9zZW5kRmlsZSggJ3BsdWdpbicgKTsKCX0gLy8gRW5kIF92ZXJiX3NlbmRGaWxlX2JhY2t1cCgpLgoJCgkvLyBSZWNlaXZlIGJhY2t1cCBhcmNoaXZlLgoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3ZlcmJfc2VuZEZpbGVfbWVkaWEoKSB7CgkJc2VsZjo6X3NlbmRGaWxlKCAnbWVkaWEnICk7Cgl9IC8vIEVuZCBfdmVyYl9zZW5kRmlsZV9iYWNrdXAoKS4KCQoJLy8gQ2FsbGVkIGJ5IHZhcmlvdXMgdmVyYnMgdGhhdCBwYXNzIHRoZSBhcHByb3ByaWF0ZSAkdHlwZSB0aGF0IGRldGVybWluZXMgcm9vdCBwYXRoLiBWYWxpZCB0eXBlczogYmFja3VwLCB0aGVtZSwgcGx1Z2luLCBtZWRpYQoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NlbmRGaWxlKCAkdHlwZSA9ICcnICkgewoJCWlmICggJycgPT0gJHR5cGUgKSB7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICM4NDkzNDk4NC4gWW91IG11c3Qgc3BlY2lmeSBhIHNlbmRmaWxlIHR5cGUuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICkgKTsKCQl9CgkJCgkJaWYgKCAnYmFja3VwJyA9PSAkdHlwZSApIHsKCQkJJHJvb3REaXIgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCk7IC8vIEluY2x1ZGUgdHJhaWxpbmcgc2xhc2guCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZyggJHJvb3REaXIsICRkaWUgPSBmYWxzZSApOwoJCX0gZWxzZWlmICggJ21lZGlhJyA9PSAkdHlwZSApIHsKCQkJJHdwX3VwbG9hZF9kaXIgPSB3cF91cGxvYWRfZGlyKCk7CgkJCSRyb290RGlyID0gJHdwX3VwbG9hZF9kaXJbJ2Jhc2VkaXInXSAuICcvJzsKCQkJdW5zZXQoICR3cF91cGxvYWRfZGlyICk7CgkJfSBlbHNlaWYgKCAncGx1Z2luJyA9PSAkdHlwZSApIHsKCQkJJHJvb3REaXIgPSB3cF9ub3JtYWxpemVfcGF0aCggV1BfUExVR0lOX0RJUiApIC4gJy8nOwoJCX0gZWxzZWlmICggJ3RoZW1lJyA9PSAkdHlwZSApIHsKCQkJLy8kcm9vdERpciA9IFdQX0NPTlRFTlRfRElSIC4gJy90aGVtZXMvJzsKCQkJJHJvb3REaXIgPSBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5KCkgLiAnLyc7CgkJfQoJCQoJCWVycm9yX2xvZyggJ0FQSSBzYXZpbmcgZmlsZSB0byBkaXI6IGAnIC4gJHJvb3REaXIgLiAnYC4nICk7CgkJCgkJJGNsZWFuRmlsZSA9IHN0cl9yZXBsYWNlKCBhcnJheSggJ1xcJywgJy8nICksICcnLCBzdHJpcHNsYXNoZXNfZGVlcCggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZmlsZW5hbWUnICkgKSApOwoJCSRmaWxlUGF0aCA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGVwYXRoJyApOwoJCWlmICggJycgIT0gJGZpbGVQYXRoICkgeyAvLyBGaWxlcGF0aCBzcGVjaWZpZWQgc28gZ29lcyBpbiBhIHN1YmRpcmVjdG9yeSB1bmRlciB0aGUgcm9vdERpci4KCQkJaWYgKCAkY2xlYW5GaWxlICE9IGJhc2VuYW1lKCAkZmlsZVBhdGggKSApIHsKCQkJCSRtZXNzYWdlID0gJ0Vycm9yICM0OTM4NDQ6IFRoZSBzcGVjaWZpZWQgZmlsZW5hbWUgd2l0aGluIHRoZSBmaWxlcGF0aCBwYXJhbWV0ZXIgZG9lcyBub3QgbWF0Y2ggdGhlIHN1cHBsaWVkIGZpbGVuYW1lIHBhcmFtZXRlci4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJCX0gZWxzZSB7IC8vIEZpbGVuYW1lIHdpdGggcGF0aC4KCQkJCSRzdWJGaWxlUGF0aCA9ICRmaWxlUGF0aDsKCQkJfQoJCX0gZWxzZSB7IC8vIEp1c3QgdGhlIGZpbGVuYW1lLiBObyBwYXRoLgoJCQkkc3ViRmlsZVBhdGggPSAkY2xlYW5GaWxlOwoJCX0KCQkkc2F2ZUZpbGUgPSAkcm9vdERpciAuICRzdWJGaWxlUGF0aDsKCQkKCQkvLyBDaGVjayBpZiBkaXJlY3RvcnkgZXhpc3RzICYgY3JlYXRlIGlmIG5lZWRlZC4KCQkkc2F2ZURpciA9IGRpcm5hbWUoICRzYXZlRmlsZSApOwoJCQoJCS8vIERlbGV0ZSBleGlzdGluZyBkaXJlY3RvcnkgZm9yIHNvbWUgdGltZXMgb2YgdHJhbnNmZXJzLgoJCWlmICggJ3BsdWdpbicgPT0gJHR5cGUgKSB7CgkJCWlmICggdHJ1ZSAhPT0gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCAkc2F2ZURpciApICkgewoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzMyOTc4Mzc6IFVuYWJsZSB0byBkZWxldGUgZXhpc3RpbmcgcGx1Z2luIGRpcmVjdG9yeSBgJyAuICRzYXZlRGlyIC4gJ2AuJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCQl9CgkJfSBlbHNlaWYgKCAndGhlbWUnID09ICR0eXBlICkgewoJCQlpZiAoIHRydWUgIT09IHBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+dW5saW5rX3JlY3Vyc2l2ZSggJHNhdmVEaXIgKSApIHsKCQkJCSRtZXNzYWdlID0gJ0Vycm9yICMyMzczNjI6IFVuYWJsZSB0byBkZWxldGUgZXhpc3RpbmcgdGhlbWUgZGlyZWN0b3J5IGAnIC4gJHNhdmVEaXIgLiAnYC4nOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJCX0KCQl9CgkJCgkJaWYgKCAhIGlzX2RpciggJHNhdmVEaXIgKSApIHsKCQkJaWYgKCB0cnVlICE9PSBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPm1rZGlyKCAkc2F2ZURpciApICkgewoJCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzMyNzgzMjogVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgYCcgLiAkc2F2ZURpciAuICdgLiBDaGVjayBwZXJtaXNzaW9ucyBvciBtYW51YWxseSBjcmVhdGUuIEhhbHRpbmcgdG8gcHJlc2VydmUgZGVwbG95bWVudCBpbnRlZ3JpdHknOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJCX0KCQl9CgkJCgkJLy8gT3Blbi9jcmVhdGUgZmlsZSBmb3Igd3JpdGUvYXBwZW5kLgoJCWlmICggZmFsc2UgPT09ICggJGZzID0gZm9wZW4oICRzYXZlRmlsZSwgJ2MnICkgKSkgewoJCQkkbWVzc2FnZSA9ICdFcnJvciAjNDg5MzM5ODQ4OiBVbmFibGUgdG8gZm9wZW4gZmlsZSBgJyAuICRzYXZlRmlsZSAuICdgLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJfQoJCQoJCS8vIFNlZWsgdG8gcG9zaXRpb24gKGlmIGFwcGxpY2FibGUpLgoJCWlmICggMCAhPSBmc2VlayggJGZzLCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdzZWVrdG8nICkgKSApIHsKCQkJQGZjbG9zZSggJGZzICk7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICM4NTg0ODg0OiBVbmFibGUgdG8gZnNlZWsgZmlsZS4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCX0KCQkKCQkvLyBDaGVjayBkYXRhIGxlbmd0aC4KCQkkZ290TGVuZ3RoID0gc3RybGVuKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdmaWxlZGF0YScgKSApOwoJCWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZmlsZWRhdGFsZW4nICkgIT0gJGdvdExlbmd0aCApIHsKCQkJQGZjbG9zZSggJGZzICk7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICM0MzU1NDQ1OiBSZWNlaXZlZCBkYXRhIG9mIGxlbmd0aCBgJyAuICRnb3RMZW5ndGggLiAnYCBkaWQgbm90IG1hdGNoIHNlbnQgbGVuZ3RoIG9mIGAnIC4gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZmlsZWRhdGFsZW4nICkgLiAnYC4gRGF0YSBtYXkgaGF2ZSBiZWVuIHRydW5jYXRlZC4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkbWVzc2FnZSApOwoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCX0KCQkKCQkvLyBDaGVjayBoYXNoLgoJCWlmICggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZmlsZWNyYycgKSAhPSBzcHJpbnRmICggIiV1IiwgY3JjMzIoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGVkYXRhJyApICkgKSApIHsKCQkJQGZjbG9zZSggJGZzICk7CgkJCSRtZXNzYWdlID0gJ0Vycm9yICM0NzM0NzI6IENSQyBvZiByZWNlaXZlZCBkYXRhIGRpZCBub3QgbWF0Y2ggc291cmNlIENSQy4gRGF0YSBjb3JydXB0ZWQgaW4gdHJhbnNmZXI/IFNlbnQgbGVuZ3RoOiBgJyAuIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2ZpbGVkYXRhbGVuJyApIC4gJ2AuIFJlY2VpdmVkIGxlbmd0aDogYCcgLiAkZ290TGVuZ3RoIC4gJ2AuJzsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkbWVzc2FnZSApICkgKTsKCQl9CgkJCgkJLy8gV3JpdGUgdG8gZmlsZS4KCQlpZiAoIGZhbHNlID09PSAoICRieXRlc1dyaXR0ZW4gPSBmd3JpdGUoICRmcywgYmFzZTY0X2RlY29kZSggcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZmlsZWRhdGEnICkgKSApICkgKSB7CgkJCUBmY2xvc2UoICRmcyApOwoJCQlAdW5saW5rKCAkc2F2ZUZpbGUgKTsKCQkJJG1lc3NhZ2UgPSAnRXJyb3IgIzM5ODQzOTQ6IEVycm9yIHdyaXRpbmcgdG8gZmlsZSBgJyAuICRzYXZlRmlsZSAuICdgLic7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJG1lc3NhZ2UgKSApICk7CgkJfSBlbHNlIHsKCQkJQGZjbG9zZSggJGZzICk7CgkJCQoJCQkkbWVzc2FnZSA9ICdXcm90ZSBgJyAuICRieXRlc1dyaXR0ZW4gLiAnYCBieXRlcy4nOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICRtZXNzYWdlICk7CgkJCQoJCQlpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdmaWxldGVzdCcgKSApIHsKCQkJCUB1bmxpbmsoICRzYXZlRmlsZSApOwoJCQl9IGVsc2UgewoJCQkJaWYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnZmlsZWRvbmUnICkgKSB7CgkJCQkJJGRlc3RGaWxlID0gQUJTUEFUSCAuIGJhc2VuYW1lKCAkc2F2ZUZpbGUgKTsKCQkJCQkvKgoJCQkJCWlmICggZmFsc2UgPT09IEBjb3B5KCAkc2F2ZUZpbGUsICRkZXN0RmlsZSApICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzk0ODQ1NDogVW5hYmxlIHRvIGNvcHkgdGVtcG9yYXJ5IGZpbGUgYCcgLiAkc2F2ZUZpbGUgLiAnYCB0byBgJyAuICRkZXN0RmlsZSAuICdgLicgKTsKCQkJCQl9CgkJCQkJQHVubGluayggJHNhdmVGaWxlICk7CgkJCQkJKi8KCQkJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IHRydWUsICdtZXNzYWdlJyA9PiAkbWVzc2FnZSApICkgKTsKCQkJCX0KCQkJfQoJCQkKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiB0cnVlLCAnbWVzc2FnZScgPT4gJG1lc3NhZ2UgKSApICk7CgkJfQoJCQoJfSAvLyBFbmQgX3NlbmRGaWxlKCkuCgkKCQoJCgkKCQoJCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfdmVyYl9nZXRQcmVEZXBsb3lJbmZvKCkgewoJCWRpZSgganNvbl9lbmNvZGUoIGFycmF5KCAnc3VjY2VzcycgPT4gdHJ1ZSwgJ2RhdGEnID0+IGJhY2t1cGJ1ZGR5X2FwaTo6Z2V0UHJlRGVwbG95SW5mbygpICkgKSApOwoJfSAvLyBFbmQgX3ZlcmJfZ2V0UHJlRGVwbG95SW5mbygpLgoJCgkKCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF92ZXJiX3JlbmRlckltcG9ydEJ1ZGR5KCkgewoJCQoJCSR0ZW1wRGlyID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0VGVtcERpcmVjdG9yeSgpOwoJCSR0ZW1wRmlsZSA9ICR0ZW1wRGlyIC4gc3RyX3JlcGxhY2UoIGFycmF5KCAnXFwnLCAnLycgKSwgJycsIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2JhY2t1cEZpbGUnICkgKTsKCQlpZiAoICEgZmlsZV9leGlzdHMoICR0ZW1wRmlsZSApICkgewoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdFcnJvciAjNDM4NDgzNzg6IEJhY2t1cCBmaWxlIGAnIC4gJHRlbXBGaWxlIC4gJ2Agbm90IGZvdW5kIHVwbG9hZGVkLicgKSApICk7CgkJfQoJCQoJCSRpbXBvcnRGaWxlU2VyaWFsID0gcGJfYmFja3VwYnVkZHk6OnJhbmRvbV9zdHJpbmcoIDE1ICk7CgkJJGltcG9ydEZpbGVuYW1lID0gJ2ltcG9ydGJ1ZGR5LScgLiAkaW1wb3J0RmlsZVNlcmlhbCAuICcucGhwJzsKCQliYWNrdXBidWRkeV9jb3JlOjppbXBvcnRidWRkeSggQUJTUEFUSCAuICRpbXBvcnRGaWxlbmFtZSwgJHBhc3N3b3JkID0gbWQ1KCBtZDUoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2JhY2t1cGJ1ZGR5X2FwaV9rZXknICkgKSApICk7CgkJCgkJLy8gUmVuZGVyIGRlZmF1bHQgY29uZmlnIGZpbGUgb3ZlcnJpZGVzLiBPdmVycnJpZGVzIGRlZmF1bHQgcmVzdG9yZS5waHAgc3RhdGUgZGF0YS4KCQkkc3RhdGUgPSBhcnJheSgpOwoJCWdsb2JhbCAkd3BkYjsKCQkkc3RhdGVbJ3R5cGUnXSA9ICdkZXBsb3knOwoJCSRzdGF0ZVsnYXJjaGl2ZSddID0gJHRlbXBEaXIgLiBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICdiYWNrdXBGaWxlJyApOwoJCSRzdGF0ZVsnc2l0ZXVybCddID0gcHJlZ19yZXBsYWNlKCAnfC8qJHwnLCAnJywgc2l0ZV91cmwoKSApOyAvLyBTdHJpcCB0cmFpbGluZyBzbGFzaGVzLgoJCSRzdGF0ZVsnaG9tZXVybCddID0gcHJlZ19yZXBsYWNlKCAnfC8qJHwnLCAnJywgaG9tZV91cmwoKSApOyAvLyBTdHJpcCB0cmFpbGluZyBzbGFzaGVzLgoJCSRzdGF0ZVsncmVzdG9yZUZpbGVzJ10gPSBmYWxzZTsKCQkkc3RhdGVbJ21pZ3JhdGVIdGFjY2VzcyddID0gZmFsc2U7CgkJJHN0YXRlWydyZW1vdGVfYXBpJ10gPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9hcGknXTsgLy8gRm9yIHVzZSBieSBpbXBvcnRidWRkeSBhcGkgYXV0aC4gRW5hYmxlcyByZW1vdGUgYXBpIGluIHRoaXMgaW1wb3J0YnVkZHkuCgkJJHN0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3NlcnZlciddID0gREJfSE9TVDsKCQkkc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsnZGF0YWJhc2UnXSA9IERCX05BTUU7CgkJJHN0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3VzZXJuYW1lJ10gPSBEQl9VU0VSOwoJCSRzdGF0ZVsnZGF0YWJhc2VTZXR0aW5ncyddWydwYXNzd29yZCddID0gREJfUEFTU1dPUkQ7CgkJJHN0YXRlWydkYXRhYmFzZVNldHRpbmdzJ11bJ3ByZWZpeCddID0gJHdwZGItPnByZWZpeDsKCQkkc3RhdGVbJ2RhdGFiYXNlU2V0dGluZ3MnXVsncmVuYW1lUHJlZml4J10gPSB0cnVlOwoJCQoJCS8vIFdyaXRlIGRlZmF1bHQgc3RhdGUgb3ZlcnJpZGVzLgoJCSRzdGF0ZV9maWxlID0gQUJTUEFUSCAuICdpbXBvcnRidWRkeS0nIC4gJGltcG9ydEZpbGVTZXJpYWwgLiAnLXN0YXRlLnBocCc7CgkJaWYgKCBmYWxzZSA9PT0gKCAkZmlsZV9oYW5kbGUgPSBAZm9wZW4oICRzdGF0ZV9maWxlLCAndycgKSApICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzgzODQ3ODQ6IFRlbXAgc3RhdGUgZmlsZSBpcyBub3QgY3JlYXRhYmxlL3dyaXRhYmxlLiBDaGVjayB5b3VyIHBlcm1pc3Npb25zLiAoJyAuICRzdGF0ZV9maWxlIC4gJyknIDsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJGVycm9yKTsKCQkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAkZXJyb3IgKSApICk7CgkJfQoJCWZ3cml0ZSggJGZpbGVfaGFuZGxlLCAiPD9waHAgZGllKCdBY2Nlc3MgRGVuaWVkLicpOyAvLyA8IS0tID8+XG4iIC4gYmFzZTY0X2VuY29kZSggc2VyaWFsaXplKCAkc3RhdGUgKSApICk7CgkJZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkKCQkKCQkkdW5kb0ZpbGUgPSAnYmFja3VwYnVkZHlfZGVwbG95X3VuZG8tJyAuICRpbXBvcnRGaWxlU2VyaWFsIC4gJy5waHAnOwoJCS8vJHVuZG9VUkwgPSBydHJpbSggc2l0ZV91cmwoKSwgJy9cXCcgKSAuICcvJyAuICR1bmRvRmlsZTsKCQlpZiAoIGZhbHNlID09PSBjb3B5KCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9fcm9sbGJhY2tfdW5kby5waHAnLCBBQlNQQVRIIC4gJHVuZG9GaWxlICkgKSB7CgkJCSRlcnJvciA9ICdFcnJvciAjMzI4OTQ0NzogVW5hYmxlIHRvIHdyaXRlIHVuZG8gZmlsZSBgJyAuIEFCU1BBVEggLiAkdW5kb0ZpbGUgLiAnYC4gQ2hlY2sgcGVybWlzc2lvbnMgb24gZGlyZWN0b3J5LicgOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAkZXJyb3IpOwoJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRlcnJvciApICkgKTsKCQl9CgkJCgkJZGllKCBqc29uX2VuY29kZSggYXJyYXkoICdzdWNjZXNzJyA9PiB0cnVlLCAnaW1wb3J0RmlsZVNlcmlhbCcgPT4gJGltcG9ydEZpbGVTZXJpYWwgKSApICk7CgkJCgl9IC8vIEVuZCBfdmVyYl9yZW5kZXJJbXBvcnRCdWRkeSgpLgoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfY2FsbF92YWxpZCgpIHsKCQkka2V5X3B1YmxpYyA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCgnYmFja3VwYnVkZHlfYXBpX2tleScpOwoJCSR2ZXJiID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCd2ZXJiJyk7CgkJJHRpbWUgPSBwYl9iYWNrdXBidWRkeTo6X1BPU1QoJ25vdycpOwoJCSRmaWxlY3JjID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCdmaWxlY3JjJyk7CgkJJHNpZ25hdHVyZSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCgnc2lnbmF0dXJlJyk7CgkJCgkJJG1heEFnZSA9IDYwKjYwOyAvLyBUaW1lIGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggYSBzaWduZWQgcmVxdWVzdCBpcyBkZWVtZWQgdG9vIG9sZC4gSGVscCBwcmV2ZW50IHJlcGxheXMuIDFoci4KCQlmb3JlYWNoKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9hcGknXVsna2V5cyddIGFzICRrZXkgKSB7CgkJCSRrZXlBcnIgPSBzZWxmOjprZXlfdG9fYXJyYXkoICRrZXkgKTsKCQkJaWYgKCAka2V5X3B1YmxpYyA9PSAka2V5QXJyWydrZXlfcHVibGljJ10gKSB7IC8vIEluY29taW5nIHB1YmxpYyBrZXkgbWF0Y2hlcyBhIHN0b3JlZCBwdWJsaWMga2V5LgoJCQkJLy8gSGFzIGNhbGwgZXhwaXJlZD8KCQkJCWlmICggKCAhIGlzX251bWVyaWMoICR0aW1lICkgKSB8fCAoICggdGltZSgpIC0gJHRpbWUgKSA+ICRtYXhBZ2UgKSApIHsKCQkJCQkkbWVzc2FnZSA9ICdFcnJvciAjNDg0NTk4NTogQVBJIGNhbGwgdGltZXN0YW1wIGlzIHRvbyBvbGQuIFZlcmlmeSB0aGUgcmVhbHRpbWUgY2xvY2sgb24gZWFjaCBzZXJ2ZXIgaXMgcmVsYXRpdmVseSBpbiBzeW5jLic7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJG1lc3NhZ2UgKTsKCQkJCQlkaWUoIGpzb25fZW5jb2RlKCBhcnJheSggJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICRtZXNzYWdlICkgKSApOwoJCQkJfQoJCQkJLy8gVmVyaWZ5IHNpZ25hdHVyZS4KCQkJCSRjYWxjdWxhdGVkU2lnbmF0dXJlID0gbWQ1KCAkdGltZSAuICR2ZXJiIC4gJGtleV9wdWJsaWMgLiAka2V5QXJyWydrZXlfc2VjcmV0J10gLiAkZmlsZWNyYyApOwoJCQkJaWYgKCAkY2FsY3VsYXRlZFNpZ25hdHVyZSAhPSAkc2lnbmF0dXJlICkgeyAvLyBLZXkgbWF0Y2hlZCBidXQgc2lnbmF0dXJlIGZhaWxlZC4gRGF0YSBoYXMgYmVlbiB0ZW1wZXJlZCB3aXRoIG9yIGRhbWFnZWQgaW4gdHJhbnNpdC4KCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBrZXlfdG9fYXJyYXkoICRrZXkgKSB7CgkJJGtleSA9IHRyaW0oICRrZXkgKTsKCQkka2V5ID0gYmFzZTY0X2RlY29kZSggJGtleSApOwoJCSRrZXkgPSBqc29uX2RlY29kZSggJGtleSwgdHJ1ZSApOwoJCXJldHVybiAka2V5OwoJfQoJCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmFsaWRhdGVfYXBpX2tleSggJGtleSApIHsKCQlpZiAoICEgZGVmaW5lZCggJ0JBQ0tVUEJVRERZX0FQSV9FTkFCTEUnICkgfHwgKCBUUlVFICE9IEJBQ0tVUEJVRERZX0FQSV9FTkFCTEUgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkvKgoJCWlmICggISBkZWZpbmVkKCAnQkFDS1VQQlVERFlfQVBJX1NBTFQnICkgfHwgKCAnQ0hBTkdFTUUnID09IEJBQ0tVUEJVRERZX0FQSV9TQUxUICkgfHwgKCBzdHJsZW4oIEJBQ0tVUEJVRERZX0FQSV9TQUxUICkgPCA1ICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJKi8KCQlpZiAoICcnID09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYXBpX2tleSddICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCSRrZXkgPSBzZWxmOjprZXlfdG9fYXJyYXkoICRrZXkgKTsKCQlpZiAoICRrZXkgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydhcGlfa2V5J10gKSB7CgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgl9IC8vIEVuZCB2YWxpZGF0ZV9hcGlfa2V5KCkuCgkKCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZV9rZXkoKSB7CgkJaWYgKCAhIGRlZmluZWQoICdCQUNLVVBCVUREWV9BUElfRU5BQkxFJyApIHx8ICggVFJVRSAhPSBCQUNLVVBCVUREWV9BUElfRU5BQkxFICkgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJLyoKCQlpZiAoICEgZGVmaW5lZCggJ0JBQ0tVUEJVRERZX0FQSV9TQUxUJyApIHx8ICggJ0NIQU5HRU1FJyA9PSBCQUNLVVBCVUREWV9BUElfU0FMVCApIHx8ICggc3RybGVuKCBCQUNLVVBCVUREWV9BUElfU0FMVCApIDwgNSApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSovCgkJCgkJJHNpdGV1cmwgPSBzaXRlX3VybCgpOwoJCSRob21ldXJsID0gaG9tZV91cmwoKTsKCQkkcmFuZCA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMiApOwoJCSRyYW5kMiA9IHBiX2JhY2t1cGJ1ZGR5OjpyYW5kb21fc3RyaW5nKCAxMiApOwoJCQoJCSRrZXkgPSBhcnJheSgKCQkJJ2tleV92ZXJzaW9uJyA9PiAxLAoJCQkna2V5X3B1YmxpYycgPT4gbWQ1KCAkcmFuZCAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJHNpdGV1cmwgLiAkaG9tZXVybCAuIHRpbWUoKSApLAoJCQkna2V5X3NlY3JldCcgPT4gbWQ1KCAkcmFuZDIgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICRzaXRldXJsIC4gJGhvbWV1cmwgLiB0aW1lKCkgKSwKCQkJJ2tleV9jcmVhdGVkJyA9PiB0aW1lKCksCgkJCSdzaXRldXJsJyA9PiAkc2l0ZXVybCwKCQkJJ2hvbWV1cmwnID0+ICRob21ldXJsLAoJCSk7CgkJCgkJCgkJcmV0dXJuIGJhc2U2NF9lbmNvZGUoIGpzb25fZW5jb2RlKCAka2V5ICkgKTsKCQkKCX0gLy8gRW5kIGdlbmVyYXRlX2FwaV9rZXkoKS4KCQoJCgkvKiBfZXJyb3IoKQoJICoKCSAqIExvZ3MgZXJyb3IgbWVzc2FnZXMgZm9yIHJldHJpZXZhbCB3aXRoIGdldEVycm9ycygpLgoJICoKCSAqIEBwYXJhbQlzdHJpbmcJCSRtZXNzYWdlCUVycm9yIG1lc3NhZ2UgdG8gbG9nLgoJICogQHJldHVybgludWxsCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9lcnJvciggJG1lc3NhZ2UgKSB7CgkJLy9lcnJvcl9sb2coICRtZXNzYWdlICk7CgkJc2VsZjo6JF9lcnJvcnNbXSA9ICRtZXNzYWdlOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICRtZXNzYWdlICk7CgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkKCQoJLyogZ2V0RXJyb3JzKCkKCSAqCgkgKiBHZXQgYW55IGVycm9ycyB3aGljaCBtYXkgaGF2ZSBvY2N1cnJlZC4KCSAqCgkgKiBAcmV0dXJuCWFycmF5IAkJUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmcgZXJyb3IgbWVzc2FnZXMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCkgewoJCXJldHVybiBzZWxmOjokX2Vycm9yczsKCX0gLy8gRW5kIGdldEVycm9ycygpOwoJCgkKCQp9IC8vIEVuZCBjbGFzcy4K
###PACKDATA,FILE_END,/classes/remote_api.php,importbuddy/classes/remote_api.php
###PACKDATA,FILE_START,/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js
KGZ1bmN0aW9uKCQpewogCiAgICAkLmZuLmV4dGVuZCh7IAogICAgICAgICAKICAgICAgICBsZWFuTW9kYWw6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKIAkJCQogCQkJdmFyIHdpbiA9IHdpbmRvdy5kaWFsb2dBcmd1bWVudHMgfHwgb3BlbmVyIHx8IHBhcmVudCB8fCB0b3A7CiAJCQkKICAgICAgICAgICAgdmFyIGRlZmF1bHRzID0gewogICAgICAgICAgICAgICAgdG9wOiAxMDAsCiAgICAgICAgICAgICAgICBvdmVybGF5OiAwLjUsCiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogbnVsbAogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG92ZXJsYXkgPSAkKCI8ZGl2IGlkPSdsZWFuX292ZXJsYXknPjwvZGl2PiIpOwogICAgICAgICAgICAKICAgICAgICAgICAgJCgiYm9keSIpLmFwcGVuZChvdmVybGF5KTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgb3B0aW9ucyA9ICAkLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7CiAKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgJCh0aGlzKS5jbGljayhmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgCXZhciBtb2RhbF9pZCA9ICQodGhpcykuYXR0cigiaHJlZiIpOwoKCQkJCSQoIiNsZWFuX292ZXJsYXkiKS5jbGljayhmdW5jdGlvbigpIHsgCiAgICAgICAgICAgICAgICAgICAgIGNsb3NlX21vZGFsKG1vZGFsX2lkKTsgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICQoby5jbG9zZUJ1dHRvbikuY2xpY2soZnVuY3Rpb24oKSB7IAogICAgICAgICAgICAgICAgICAgICBjbG9zZV9tb2RhbChtb2RhbF9pZCk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgCQogICAgICAgICAgICAgIAl2YXIgbW9kYWxfaGVpZ2h0ID0gJChtb2RhbF9pZCkub3V0ZXJIZWlnaHQoZmFsc2UpOwogICAgICAgIAkgIAl2YXIgbW9kYWxfd2lkdGggPSAkKG1vZGFsX2lkKS5vdXRlcldpZHRoKGZhbHNlKTsKCiAgICAgICAgCQkkKCcjbGVhbl9vdmVybGF5JykuY3NzKHsgJ2Rpc3BsYXknIDogJ2Jsb2NrJywgb3BhY2l0eSA6IDAgfSk7CgogICAgICAgIAkJJCgnI2xlYW5fb3ZlcmxheScpLmZhZGVUbygyMDAsby5vdmVybGF5KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5jc3MoeyAKICAgICAgICAJCQogICAgICAgIAkJCSdkaXNwbGF5JyA6ICdibG9jaycsCiAgICAgICAgCQkJJ3Bvc2l0aW9uJyA6ICdmaXhlZCcsCiAgICAgICAgCQkJJ29wYWNpdHknIDogMCwKICAgICAgICAJCQknei1pbmRleCc6IDExMDAwLAogICAgICAgIAkJCSdsZWZ0JyA6IDUwICsgJyUnLAogICAgICAgIAkJCSdtYXJnaW4tbGVmdCcgOiAtKG1vZGFsX3dpZHRoLzIpICsgInB4IiwKICAgICAgICAJCQkndG9wJyA6IG8udG9wICsgInB4IgogICAgICAgIAkJCiAgICAgICAgCQl9KTsKCiAgICAgICAgCQkkKG1vZGFsX2lkKS5mYWRlVG8oMjAwLDEpOwoKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIAl9KTsKICAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCgkJCWZ1bmN0aW9uIGNsb3NlX21vZGFsKG1vZGFsX2lkKXsKCiAgICAgICAgCQkkKCIjbGVhbl9vdmVybGF5IikuZmFkZU91dCgyMDApOwoKICAgICAgICAJCSQobW9kYWxfaWQpLmNzcyh7ICdkaXNwbGF5JyA6ICdub25lJyB9KTsKCQkJCgkJCX0KICAgIAogICAgICAgIH0KICAgIH0pOwogICAgIAp9KShqUXVlcnkpOw==
###PACKDATA,FILE_END,/js/jquery.leanModal.min.js,importbuddy/js/jquery.leanModal.min.js
###PACKDATA,FILE_START,/js/jquery.joyride-2.0.3.js,importbuddy/js/jquery.joyride-2.0.3.js
LyoKICogalF1ZXJ5IEZvdW5kYXRpb24gSm95cmlkZSBQbHVnaW4gMi4wLjMKICogaHR0cDovL2ZvdW5kYXRpb24uenVyYi5jb20KICogQ29weXJpZ2h0IDIwMTIsIFpVUkIKICogRnJlZSB0byB1c2UgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAoqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSwgaW5kZW50OiAyICovCgo7KGZ1bmN0aW9uICgkLCB3aW5kb3csIHVuZGVmaW5lZCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIGRlZmF1bHRzID0gewogICAgICAndmVyc2lvbicgICAgICAgICAgICAgIDogJzIuMC4zJywKICAgICAgJ3RpcExvY2F0aW9uJyAgICAgICAgICA6ICdib3R0b20nLCAgLy8gJ3RvcCcgb3IgJ2JvdHRvbScgaW4gcmVsYXRpb24gdG8gcGFyZW50CiAgICAgICdudWJQb3NpdGlvbicgICAgICAgICAgOiAnYXV0bycsICAgIC8vIG92ZXJyaWRlIG9uIGEgcGVyIHRvb2x0aXAgYmFzZXMKICAgICAgJ3Njcm9sbFNwZWVkJyAgICAgICAgICA6IDMwMCwgICAgICAgLy8gUGFnZSBzY3JvbGxpbmcgc3BlZWQgaW4gbWlsbGlzZWNvbmRzCiAgICAgICd0aW1lcicgICAgICAgICAgICAgICAgOiAwLCAgICAgICAgIC8vIDAgPSBubyB0aW1lciAsIGFsbCBvdGhlciBudW1iZXJzID0gdGltZXIgaW4gbWlsbGlzZWNvbmRzCiAgICAgICdzdGFydFRpbWVyT25DbGljaycgICAgOiB0cnVlLCAgICAgIC8vIHRydWUgb3IgZmFsc2UgLSB0cnVlIHJlcXVpcmVzIGNsaWNraW5nIHRoZSBmaXJzdCBidXR0b24gc3RhcnQgdGhlIHRpbWVyCiAgICAgICdzdGFydE9mZnNldCcgICAgICAgICAgOiAwLCAgICAgICAgIC8vIHRoZSBpbmRleCBvZiB0aGUgdG9vbHRpcCB5b3Ugd2FudCB0byBzdGFydCBvbiAoaW5kZXggb2YgdGhlIGxpKQogICAgICAnbmV4dEJ1dHRvbicgICAgICAgICAgIDogdHJ1ZSwgICAgICAvLyB0cnVlIG9yIGZhbHNlIHRvIGNvbnRyb2wgd2hldGhlciBhIG5leHQgYnV0dG9uIGlzIHVzZWQKICAgICAgJ3RpcEFuaW1hdGlvbicgICAgICAgICA6ICdmYWRlJywgICAgLy8gJ3BvcCcgb3IgJ2ZhZGUnIGluIGVhY2ggdGlwCiAgICAgICdwYXVzZUFmdGVyJyAgICAgICAgICAgOiBbXSwgICAgICAgIC8vIGFycmF5IG9mIGluZGV4ZXMgd2hlcmUgdG8gcGF1c2UgdGhlIHRvdXIgYWZ0ZXIKICAgICAgJ3RpcEFuaW1hdGlvbkZhZGVTcGVlZCc6IDMwMCwgICAgICAgLy8gd2hlbiB0aXBBbmltYXRpb24gPSAnZmFkZScgdGhpcyBpcyBzcGVlZCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0cmFuc2l0aW9uCiAgICAgICdjb29raWVNb25zdGVyJyAgICAgICAgOiBmYWxzZSwgICAgIC8vIHRydWUgb3IgZmFsc2UgdG8gY29udHJvbCB3aGV0aGVyIGNvb2tpZXMgYXJlIHVzZWQKICAgICAgJ2Nvb2tpZU5hbWUnICAgICAgICAgICA6ICdqb3lyaWRlJywgLy8gTmFtZSB0aGUgY29va2llIHlvdSdsbCB1c2UKICAgICAgJ2Nvb2tpZURvbWFpbicgICAgICAgICA6IGZhbHNlLCAgICAgLy8gV2lsbCB0aGlzIGNvb2tpZSBiZSBhdHRhY2hlZCB0byBhIGRvbWFpbiwgaWUuICcubm90YWJsZWFwcC5jb20nCiAgICAgICd0aXBDb250YWluZXInICAgICAgICAgOiAnYm9keScsICAgIC8vIFdoZXJlIHdpbGwgdGhlIHRpcCBiZSBhdHRhY2hlZAogICAgICAncG9zdFJpZGVDYWxsYmFjaycgICAgIDogJC5ub29wLCAgICAvLyBBIG1ldGhvZCB0byBjYWxsIG9uY2UgdGhlIHRvdXIgY2xvc2VzIChjYW5jZWxlZCBvciBjb21wbGV0ZSkKICAgICAgJ3Bvc3RTdGVwQ2FsbGJhY2snICAgICA6ICQubm9vcCwgICAgLy8gQSBtZXRob2QgdG8gY2FsbCBhZnRlciBlYWNoIHN0ZXAKICAgICAgJ3RlbXBsYXRlJyA6IHsgLy8gSFRNTCBzZWdtZW50cyBmb3IgdGlwIGxheW91dAogICAgICAgICdsaW5rJyAgICA6ICc8YSBocmVmPSIjY2xvc2UiIGNsYXNzPSJqb3lyaWRlLWNsb3NlLXRpcCI+WDwvYT4nLAogICAgICAgICd0aW1lcicgICA6ICc8ZGl2IGNsYXNzPSJqb3lyaWRlLXRpbWVyLWluZGljYXRvci13cmFwIj48c3BhbiBjbGFzcz0iam95cmlkZS10aW1lci1pbmRpY2F0b3IiPjwvc3Bhbj48L2Rpdj4nLAogICAgICAgICd0aXAnICAgICA6ICc8ZGl2IGNsYXNzPSJqb3lyaWRlLXRpcC1ndWlkZSI+PHNwYW4gY2xhc3M9ImpveXJpZGUtbnViIj48L3NwYW4+PC9kaXY+JywKICAgICAgICAnd3JhcHBlcicgOiAnPGRpdiBjbGFzcz0iam95cmlkZS1jb250ZW50LXdyYXBwZXIiPjwvZGl2PicsCiAgICAgICAgJ2J1dHRvbicgIDogJzxhIGhyZWY9IiMiIGNsYXNzPSJqb3lyaWRlLW5leHQtdGlwIj48L2E+JwogICAgICB9CiAgICB9LAoKICAgIE1vZGVybml6ciA9IE1vZGVybml6ciB8fCBmYWxzZSwKCiAgICBzZXR0aW5ncyA9IHt9LAoKICAgIG1ldGhvZHMgPSB7CgogICAgICBpbml0IDogZnVuY3Rpb24gKG9wdHMpIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHNldHRpbmdzKSkgewogICAgICAgICAgICBzZXR0aW5ncyA9ICQuZXh0ZW5kKHRydWUsIGRlZmF1bHRzLCBvcHRzKTsKCiAgICAgICAgICAgIC8vIG5vbiBjb25maWd1cmFibGUgc2V0dGluZ3MKICAgICAgICAgICAgc2V0dGluZ3MuZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7CiAgICAgICAgICAgIHNldHRpbmdzLiRkb2N1bWVudCA9ICQoc2V0dGluZ3MuZG9jdW1lbnQpOwogICAgICAgICAgICBzZXR0aW5ncy4kd2luZG93ID0gJCh3aW5kb3cpOwogICAgICAgICAgICBzZXR0aW5ncy4kY29udGVudF9lbCA9ICQodGhpcyk7CiAgICAgICAgICAgIHNldHRpbmdzLmJvZHlfb2Zmc2V0ID0gJChzZXR0aW5ncy50aXBDb250YWluZXIpLnBvc2l0aW9uKCk7CiAgICAgICAgICAgIHNldHRpbmdzLiR0aXBfY29udGVudCA9ICQoJz4gbGknLCBzZXR0aW5ncy4kY29udGVudF9lbCk7CiAgICAgICAgICAgIHNldHRpbmdzLnBhdXNlZCA9IGZhbHNlOwogICAgICAgICAgICBzZXR0aW5ncy5hdHRlbXB0cyA9IDA7CgogICAgICAgICAgICBzZXR0aW5ncy50aXBMb2NhdGlvblBhdHRlcm5zID0gewogICAgICAgICAgICAgIHRvcDogWydib3R0b20nXSwKICAgICAgICAgICAgICBib3R0b206IFtdLCAvLyBib3R0b20gc2hvdWxkIG5vdCBuZWVkIHRvIGJlIHJlcG9zaXRpb25lZAogICAgICAgICAgICAgIGxlZnQ6IFsncmlnaHQnLCAndG9wJywgJ2JvdHRvbSddLAogICAgICAgICAgICAgIHJpZ2h0OiBbJ2xlZnQnLCAndG9wJywgJ2JvdHRvbSddCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBhcmUgd2UgdXNpbmcgalF1ZXJ5IDEuNysKICAgICAgICAgICAgbWV0aG9kcy5qcXVlcnlfY2hlY2soKTsKCiAgICAgICAgICAgIC8vIGNhbiB3ZSBjcmVhdGUgY29va2llcz8KICAgICAgICAgICAgaWYgKCEkLmlzRnVuY3Rpb24oJC5jb29raWUpKSB7CiAgICAgICAgICAgICAgc2V0dGluZ3MuY29va2llTW9uc3RlciA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgdGlwcyBhbmQgaW5zZXJ0IGludG8gZG9tLgogICAgICAgICAgICBpZiAoIXNldHRpbmdzLmNvb2tpZU1vbnN0ZXIgfHwgISQuY29va2llKHNldHRpbmdzLmNvb2tpZU5hbWUpKSB7CgogICAgICAgICAgICAgIHNldHRpbmdzLiR0aXBfY29udGVudC5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgbWV0aG9kcy5jcmVhdGUoeyRsaSA6ICQodGhpcyksIGluZGV4IDogaW5kZXh9KTsKICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgLy8gc2hvdyBmaXJzdCB0aXAKICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLnN0YXJ0VGltZXJPbkNsaWNrICYmIHNldHRpbmdzLnRpbWVyID4gMCkgewogICAgICAgICAgICAgICAgbWV0aG9kcy5zaG93KCdpbml0Jyk7CiAgICAgICAgICAgICAgICBtZXRob2RzLnN0YXJ0VGltZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWV0aG9kcy5zaG93KCdpbml0Jyk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2V0dGluZ3MuJGRvY3VtZW50Lm9uKCdjbGljay5qb3lyaWRlJywgJy5qb3lyaWRlLW5leHQtdGlwLCAuam95cmlkZS1tb2RhbC1iZycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuJGxpLm5leHQoKS5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgICAgICBtZXRob2RzLmVuZCgpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MudGltZXIgPiAwKSB7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc2V0dGluZ3MuYXV0b21hdGUpOwogICAgICAgICAgICAgICAgbWV0aG9kcy5oaWRlKCk7CiAgICAgICAgICAgICAgICBtZXRob2RzLnNob3coKTsKICAgICAgICAgICAgICAgIG1ldGhvZHMuc3RhcnRUaW1lcigpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtZXRob2RzLmhpZGUoKTsKICAgICAgICAgICAgICAgIG1ldGhvZHMuc2hvdygpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgc2V0dGluZ3MuJGRvY3VtZW50Lm9uKCdjbGljay5qb3lyaWRlJywgJy5qb3lyaWRlLWNsb3NlLXRpcCcsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgIG1ldGhvZHMuZW5kKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgc2V0dGluZ3MuJHdpbmRvdy5iaW5kKCdyZXNpemUuam95cmlkZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgaWYgKG1ldGhvZHMuaXNfcGhvbmUoKSkgewogICAgICAgICAgICAgICAgbWV0aG9kcy5wb3NfcGhvbmUoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWV0aG9kcy5wb3NfZGVmYXVsdCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXRob2RzLnJlc3RhcnQoKTsKICAgICAgICAgIH0KCiAgICAgICAgfSk7CiAgICAgIH0sCgogICAgICAvLyBjYWxsIHRoaXMgbWV0aG9kIHdoZW4geW91IHdhbnQgdG8gcmVzdW1lIHRoZSB0b3VyCiAgICAgIHJlc3VtZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICBtZXRob2RzLnNldF9saSgpOwogICAgICAgIG1ldGhvZHMuc2hvdygpOwogICAgICB9LAoKICAgICAgbmV4dFRpcDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgaWYgKHNldHRpbmdzLiRsaS5uZXh0KCkubGVuZ3RoIDwgMSkgewogICAgICAgICAgICBtZXRob2RzLmVuZCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLnRpbWVyID4gMCkgewogICAgICAgICAgICBjbGVhclRpbWVvdXQoc2V0dGluZ3MuYXV0b21hdGUpOwogICAgICAgICAgICBtZXRob2RzLmhpZGUoKTsKICAgICAgICAgICAgbWV0aG9kcy5zaG93KCk7CiAgICAgICAgICAgIG1ldGhvZHMuc3RhcnRUaW1lcigpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXRob2RzLmhpZGUoKTsKICAgICAgICAgICAgbWV0aG9kcy5zaG93KCk7CiAgICAgICAgICAgIH0KICAgICAgfSwgCgogICAgICB0aXBfdGVtcGxhdGUgOiBmdW5jdGlvbiAob3B0cykgewogICAgICAgIHZhciAkYmxhbmssIGNvbnRlbnQ7CgogICAgICAgIG9wdHMudGlwX2NsYXNzID0gb3B0cy50aXBfY2xhc3MgfHwgJyc7CgogICAgICAgICRibGFuayA9ICQoc2V0dGluZ3MudGVtcGxhdGUudGlwKS5hZGRDbGFzcyhvcHRzLnRpcF9jbGFzcyk7CiAgICAgICAgY29udGVudCA9ICQudHJpbSgkKG9wdHMubGkpLmh0bWwoKSkgKwogICAgICAgICAgbWV0aG9kcy5idXR0b25fdGV4dChvcHRzLmJ1dHRvbl90ZXh0KSArCiAgICAgICAgICBzZXR0aW5ncy50ZW1wbGF0ZS5saW5rICsKICAgICAgICAgIG1ldGhvZHMudGltZXJfaW5zdGFuY2Uob3B0cy5pbmRleCk7CgogICAgICAgICRibGFuay5hcHBlbmQoJChzZXR0aW5ncy50ZW1wbGF0ZS53cmFwcGVyKSk7CiAgICAgICAgJGJsYW5rLmZpcnN0KCkuYXR0cignZGF0YS1pbmRleCcsIG9wdHMuaW5kZXgpOwogICAgICAgICQoJy5qb3lyaWRlLWNvbnRlbnQtd3JhcHBlcicsICRibGFuaykuYXBwZW5kKGNvbnRlbnQpOwoKICAgICAgICByZXR1cm4gJGJsYW5rWzBdOwogICAgICB9LAoKICAgICAgdGltZXJfaW5zdGFuY2UgOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICB2YXIgdHh0OwoKICAgICAgICBpZiAoKGluZGV4ID09PSAwICYmIHNldHRpbmdzLnN0YXJ0VGltZXJPbkNsaWNrICYmIHNldHRpbmdzLnRpbWVyID4gMCkgfHwgc2V0dGluZ3MudGltZXIgPT09IDApIHsKICAgICAgICAgIHR4dCA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0eHQgPSBtZXRob2RzLm91dGVySFRNTCgkKHNldHRpbmdzLnRlbXBsYXRlLnRpbWVyKVswXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0eHQ7CiAgICAgIH0sCgogICAgICBidXR0b25fdGV4dCA6IGZ1bmN0aW9uICh0eHQpIHsKICAgICAgICBpZiAoc2V0dGluZ3MubmV4dEJ1dHRvbikgewogICAgICAgICAgdHh0ID0gJC50cmltKHR4dCkgfHwgJ05leHQnOwogICAgICAgICAgdHh0ID0gbWV0aG9kcy5vdXRlckhUTUwoJChzZXR0aW5ncy50ZW1wbGF0ZS5idXR0b24pLmFwcGVuZCh0eHQpWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHh0ID0gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0eHQ7CiAgICAgIH0sCgogICAgICBjcmVhdGUgOiBmdW5jdGlvbiAob3B0cykgewogICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZGF0YS10ZXh0IGF0dHJpYnV0ZQogICAgICAgIHZhciBidXR0b25UZXh0ID0gb3B0cy4kbGkuYXR0cignZGF0YS1idXR0b24nKSB8fCBvcHRzLiRsaS5hdHRyKCdkYXRhLXRleHQnKSwKICAgICAgICAgIHRpcENsYXNzID0gb3B0cy4kbGkuYXR0cignY2xhc3MnKSwKICAgICAgICAgICR0aXBfY29udGVudCA9ICQobWV0aG9kcy50aXBfdGVtcGxhdGUoewogICAgICAgICAgICB0aXBfY2xhc3MgOiB0aXBDbGFzcywKICAgICAgICAgICAgaW5kZXggOiBvcHRzLmluZGV4LAogICAgICAgICAgICBidXR0b25fdGV4dCA6IGJ1dHRvblRleHQsCiAgICAgICAgICAgIGxpIDogb3B0cy4kbGkKICAgICAgICAgIH0pKTsKCiAgICAgICAgJChzZXR0aW5ncy50aXBDb250YWluZXIpLmFwcGVuZCgkdGlwX2NvbnRlbnQpOwogICAgICB9LAoKICAgICAgc2hvdyA6IGZ1bmN0aW9uIChpbml0KSB7CiAgICAgICAgdmFyIG9wdHMgPSB7fSwgaWksIG9wdHNfYXJyID0gW10sIG9wdHNfbGVuID0gMCwgcCwKICAgICAgICAgICAgJHRpbWVyID0gbnVsbDsKCiAgICAgICAgLy8gYXJlIHdlIHBhdXNlZD8KICAgICAgICBpZiAoc2V0dGluZ3MuJGxpID09PSB1bmRlZmluZWQgfHwgKCQuaW5BcnJheShzZXR0aW5ncy4kbGkuaW5kZXgoKSwgc2V0dGluZ3MucGF1c2VBZnRlcikgPT09IC0xKSkgewoKICAgICAgICAgIC8vIGRvbid0IGdvIHRvIHRoZSBuZXh0IGxpIGlmIHRoZSB0b3VyIHdhcyBwYXVzZWQKICAgICAgICAgIGlmIChzZXR0aW5ncy5wYXVzZWQpIHsKICAgICAgICAgICAgc2V0dGluZ3MucGF1c2VkID0gZmFsc2U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXRob2RzLnNldF9saShpbml0KTsKICAgICAgICAgIH0KCiAgICAgICAgICBzZXR0aW5ncy5hdHRlbXB0cyA9IDA7CgogICAgICAgICAgaWYgKHNldHRpbmdzLiRsaS5sZW5ndGggJiYgc2V0dGluZ3MuJHRhcmdldC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIG9wdHNfYXJyID0gKHNldHRpbmdzLiRsaS5kYXRhKCdvcHRpb25zJykgfHwgJzonKS5zcGxpdCgnOycpOwogICAgICAgICAgICBvcHRzX2xlbiA9IG9wdHNfYXJyLmxlbmd0aDsKCiAgICAgICAgICAgIC8vIHBhcnNlIG9wdGlvbnMKICAgICAgICAgICAgZm9yIChpaSA9IG9wdHNfbGVuIC0gMTsgaWkgPj0gMDsgaWktLSkgewogICAgICAgICAgICAgIHAgPSBvcHRzX2FycltpaV0uc3BsaXQoJzonKTsKCiAgICAgICAgICAgICAgaWYgKHAubGVuZ3RoID09PSAyKSB7CiAgICAgICAgICAgICAgICBvcHRzWyQudHJpbShwWzBdKV0gPSAkLnRyaW0ocFsxXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXR0aW5ncy50aXBTZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LCBzZXR0aW5ncywgb3B0cyk7CgogICAgICAgICAgICBzZXR0aW5ncy50aXBTZXR0aW5ncy50aXBMb2NhdGlvblBhdHRlcm4gPSBzZXR0aW5ncy50aXBMb2NhdGlvblBhdHRlcm5zW3NldHRpbmdzLnRpcFNldHRpbmdzLnRpcExvY2F0aW9uXTsKCiAgICAgICAgICAgIC8vIHNjcm9sbCBpZiBub3QgbW9kYWwKICAgICAgICAgICAgaWYgKCEvYm9keS9pLnRlc3Qoc2V0dGluZ3MuJHRhcmdldC5zZWxlY3RvcikpIHsKICAgICAgICAgICAgICBtZXRob2RzLnNjcm9sbF90bygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAobWV0aG9kcy5pc19waG9uZSgpKSB7CiAgICAgICAgICAgICAgbWV0aG9kcy5wb3NfcGhvbmUodHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbWV0aG9kcy5wb3NfZGVmYXVsdCh0cnVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRpbWVyID0gJCgnLmpveXJpZGUtdGltZXItaW5kaWNhdG9yJywgc2V0dGluZ3MuJG5leHRfdGlwKTsKCiAgICAgICAgICAgIGlmICgvcG9wL2kudGVzdChzZXR0aW5ncy50aXBBbmltYXRpb24pKSB7CgogICAgICAgICAgICAgICR0aW1lci5vdXRlcldpZHRoKDApOwoKICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudGltZXIgPiAwKSB7CgogICAgICAgICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLnNob3coKTsKICAgICAgICAgICAgICAgICR0aW1lci5hbmltYXRlKHsKICAgICAgICAgICAgICAgICAgd2lkdGg6ICQoJy5qb3lyaWRlLXRpbWVyLWluZGljYXRvci13cmFwJywgc2V0dGluZ3MuJG5leHRfdGlwKS5vdXRlcldpZHRoKCkKICAgICAgICAgICAgICAgIH0sIHNldHRpbmdzLnRpbWVyKTsKCiAgICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuc2hvdygpOwoKICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgfSBlbHNlIGlmICgvZmFkZS9pLnRlc3Qoc2V0dGluZ3MudGlwQW5pbWF0aW9uKSkgewoKICAgICAgICAgICAgICAkdGltZXIub3V0ZXJXaWR0aCgwKTsKCiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLnRpbWVyID4gMCkgewoKICAgICAgICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5mYWRlSW4oc2V0dGluZ3MudGlwQW5pbWF0aW9uRmFkZVNwZWVkKTsKCiAgICAgICAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuc2hvdygpOwogICAgICAgICAgICAgICAgJHRpbWVyLmFuaW1hdGUoewogICAgICAgICAgICAgICAgICB3aWR0aDogJCgnLmpveXJpZGUtdGltZXItaW5kaWNhdG9yLXdyYXAnLCBzZXR0aW5ncy4kbmV4dF90aXApLm91dGVyV2lkdGgoKQogICAgICAgICAgICAgICAgfSwgc2V0dGluZ3MudGltZXIpOwoKICAgICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5mYWRlSW4oc2V0dGluZ3MudGlwQW5pbWF0aW9uRmFkZVNwZWVkKTsKCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXR0aW5ncy4kY3VycmVudF90aXAgPSBzZXR0aW5ncy4kbmV4dF90aXA7CgogICAgICAgICAgLy8gc2tpcCBub24tZXhpc3RlbnQgdGFyZ2V0cwogICAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5ncy4kbGkgJiYgc2V0dGluZ3MuJHRhcmdldC5sZW5ndGggPCAxKSB7CgogICAgICAgICAgICBtZXRob2RzLnNob3coKTsKCiAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgbWV0aG9kcy5lbmQoKTsKCiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICBzZXR0aW5ncy5wYXVzZWQgPSB0cnVlOwoKICAgICAgICB9CgogICAgICB9LAoKICAgICAgLy8gZGV0ZWN0IHBob25lcyB3aXRoIG1lZGlhIHF1ZXJpZXMgaWYgc3VwcG9ydGVkLgogICAgICBpc19waG9uZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoTW9kZXJuaXpyKSB7CiAgICAgICAgICByZXR1cm4gTW9kZXJuaXpyLm1xKCdvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKHNldHRpbmdzLiR3aW5kb3cud2lkdGgoKSA8IDc2NykgPyB0cnVlIDogZmFsc2U7CiAgICAgIH0sCgogICAgICBoaWRlIDogZnVuY3Rpb24gKCkgewogICAgICAgIHNldHRpbmdzLnBvc3RTdGVwQ2FsbGJhY2soc2V0dGluZ3MuJGxpLmluZGV4KCksIHNldHRpbmdzLiRjdXJyZW50X3RpcCk7CiAgICAgICAgJCgnLmpveXJpZGUtbW9kYWwtYmcnKS5oaWRlKCk7CiAgICAgICAgc2V0dGluZ3MuJGN1cnJlbnRfdGlwLmhpZGUoKTsKICAgICAgfSwKCiAgICAgIHNldF9saSA6IGZ1bmN0aW9uIChpbml0KSB7CiAgICAgICAgaWYgKGluaXQpIHsKICAgICAgICAgIHNldHRpbmdzLiRsaSA9IHNldHRpbmdzLiR0aXBfY29udGVudC5lcShzZXR0aW5ncy5zdGFydE9mZnNldCk7CiAgICAgICAgICBtZXRob2RzLnNldF9uZXh0X3RpcCgpOwogICAgICAgICAgc2V0dGluZ3MuJGN1cnJlbnRfdGlwID0gc2V0dGluZ3MuJG5leHRfdGlwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZXR0aW5ncy4kbGkgPSBzZXR0aW5ncy4kbGkubmV4dCgpOwogICAgICAgICAgbWV0aG9kcy5zZXRfbmV4dF90aXAoKTsKICAgICAgICB9CgogICAgICAgIG1ldGhvZHMuc2V0X3RhcmdldCgpOwogICAgICB9LAoKICAgICAgc2V0X25leHRfdGlwIDogZnVuY3Rpb24gKCkgewogICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcCA9ICQoJy5qb3lyaWRlLXRpcC1ndWlkZVtkYXRhLWluZGV4PScgKyBzZXR0aW5ncy4kbGkuaW5kZXgoKSArICddJyk7CiAgICAgIH0sCgogICAgICBzZXRfdGFyZ2V0IDogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjbCA9IHNldHRpbmdzLiRsaS5hdHRyKCdkYXRhLWNsYXNzJyksCiAgICAgICAgICAgIGlkID0gc2V0dGluZ3MuJGxpLmF0dHIoJ2RhdGEtaWQnKSwKICAgICAgICAgICAgJHNlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBpZiAoaWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKHNldHRpbmdzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICQoJy4nICsgY2wpLmZpcnN0KCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCdib2R5Jyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICBzZXR0aW5ncy4kdGFyZ2V0ID0gJHNlbCgpOwogICAgICB9LAoKICAgICAgc2Nyb2xsX3RvIDogZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB3aW5kb3dfaGFsZiwgdGlwT2Zmc2V0OwoKICAgICAgICB3aW5kb3dfaGFsZiA9IHNldHRpbmdzLiR3aW5kb3cuaGVpZ2h0KCkgLyAyOwogICAgICAgIHRpcE9mZnNldCA9IE1hdGguY2VpbChzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLnRvcCAtIHdpbmRvd19oYWxmICsgc2V0dGluZ3MuJG5leHRfdGlwLm91dGVySGVpZ2h0KCkpOwoKICAgICAgICAkKCJodG1sLCBib2R5Iikuc3RvcCgpLmFuaW1hdGUoewogICAgICAgICAgc2Nyb2xsVG9wOiB0aXBPZmZzZXQKICAgICAgICB9LCBzZXR0aW5ncy5zY3JvbGxTcGVlZCk7CiAgICAgIH0sCgogICAgICBwYXVzZWQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCgkLmluQXJyYXkoKHNldHRpbmdzLiRsaS5pbmRleCgpICsgMSksIHNldHRpbmdzLnBhdXNlQWZ0ZXIpID09PSAtMSkpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAoKICAgICAgZGVzdHJveSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICBzZXR0aW5ncy4kZG9jdW1lbnQub2ZmKCcuam95cmlkZScpOwogICAgICAgICQod2luZG93KS5vZmYoJy5qb3lyaWRlJyk7CiAgICAgICAgJCgnLmpveXJpZGUtY2xvc2UtdGlwLCAuam95cmlkZS1uZXh0LXRpcCwgLmpveXJpZGUtbW9kYWwtYmcnKS5vZmYoJy5qb3lyaWRlJyk7CiAgICAgICAgJCgnLmpveXJpZGUtdGlwLWd1aWRlLCAuam95cmlkZS1tb2RhbC1iZycpLnJlbW92ZSgpOwogICAgICAgIGNsZWFyVGltZW91dChzZXR0aW5ncy5hdXRvbWF0ZSk7CiAgICAgICAgc2V0dGluZ3MgPSB7fTsKICAgICAgfSwKCiAgICAgIHJlc3RhcnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgbWV0aG9kcy5oaWRlKCk7CiAgICAgICAgc2V0dGluZ3MuJGxpID0gdW5kZWZpbmVkOwogICAgICAgIG1ldGhvZHMuc2hvdygnaW5pdCcpOwogICAgICB9LAoKICAgICAgcG9zX2RlZmF1bHQgOiBmdW5jdGlvbiAoaW5pdCkgewogICAgICAgIHZhciBoYWxmX2ZvbGQgPSBNYXRoLmNlaWwoc2V0dGluZ3MuJHdpbmRvdy5oZWlnaHQoKSAvIDIpLAogICAgICAgICAgICB0aXBfcG9zaXRpb24gPSBzZXR0aW5ncy4kbmV4dF90aXAub2Zmc2V0KCksCiAgICAgICAgICAgICRudWIgPSAkKCcuam95cmlkZS1udWInLCBzZXR0aW5ncy4kbmV4dF90aXApLAogICAgICAgICAgICBudWJfaGVpZ2h0ID0gTWF0aC5jZWlsKCRudWIub3V0ZXJIZWlnaHQoKSAvIDIpLAogICAgICAgICAgICB0b2dnbGUgPSBpbml0IHx8IGZhbHNlOwoKICAgICAgICAvLyB0aXAgbXVzdCBub3QgYmUgImRpc3BsYXk6IG5vbmUiIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbgogICAgICAgIGlmICh0b2dnbGUpIHsKICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7CiAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuc2hvdygpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEvYm9keS9pLnRlc3Qoc2V0dGluZ3MuJHRhcmdldC5zZWxlY3RvcikpIHsKCiAgICAgICAgICAgIGlmIChtZXRob2RzLmJvdHRvbSgpKSB7CiAgICAgICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmNzcyh7CiAgICAgICAgICAgICAgICB0b3A6IChzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLnRvcCArIG51Yl9oZWlnaHQgKyBzZXR0aW5ncy4kdGFyZ2V0Lm91dGVySGVpZ2h0KCkpLAogICAgICAgICAgICAgICAgbGVmdDogc2V0dGluZ3MuJHRhcmdldC5vZmZzZXQoKS5sZWZ0fSk7CgogICAgICAgICAgICAgIG1ldGhvZHMubnViX3Bvc2l0aW9uKCRudWIsIHNldHRpbmdzLnRpcFNldHRpbmdzLm51YlBvc2l0aW9uLCAndG9wJyk7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZHMudG9wKCkpIHsKCiAgICAgICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmNzcyh7CiAgICAgICAgICAgICAgICB0b3A6IChzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLnRvcCAtIHNldHRpbmdzLiRuZXh0X3RpcC5vdXRlckhlaWdodCgpIC0gbnViX2hlaWdodCksCiAgICAgICAgICAgICAgICBsZWZ0OiBzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLmxlZnR9KTsKCiAgICAgICAgICAgICAgbWV0aG9kcy5udWJfcG9zaXRpb24oJG51Yiwgc2V0dGluZ3MudGlwU2V0dGluZ3MubnViUG9zaXRpb24sICdib3R0b20nKTsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kcy5yaWdodCgpKSB7CgogICAgICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5jc3MoewogICAgICAgICAgICAgICAgdG9wOiBzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLnRvcCwKICAgICAgICAgICAgICAgIGxlZnQ6IChzZXR0aW5ncy4kdGFyZ2V0Lm91dGVyV2lkdGgoKSArIHNldHRpbmdzLiR0YXJnZXQub2Zmc2V0KCkubGVmdCl9KTsKCiAgICAgICAgICAgICAgbWV0aG9kcy5udWJfcG9zaXRpb24oJG51Yiwgc2V0dGluZ3MudGlwU2V0dGluZ3MubnViUG9zaXRpb24sICdsZWZ0Jyk7CgogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZHMubGVmdCgpKSB7CgogICAgICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5jc3MoewogICAgICAgICAgICAgICAgdG9wOiBzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLnRvcCwKICAgICAgICAgICAgICAgIGxlZnQ6IChzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLmxlZnQgLSBzZXR0aW5ncy4kbmV4dF90aXAub3V0ZXJXaWR0aCgpIC0gbnViX2hlaWdodCl9KTsKCiAgICAgICAgICAgICAgbWV0aG9kcy5udWJfcG9zaXRpb24oJG51Yiwgc2V0dGluZ3MudGlwU2V0dGluZ3MubnViUG9zaXRpb24sICdyaWdodCcpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFtZXRob2RzLnZpc2libGUobWV0aG9kcy5jb3JuZXJzKHNldHRpbmdzLiRuZXh0X3RpcCkpICYmIHNldHRpbmdzLmF0dGVtcHRzIDwgc2V0dGluZ3MudGlwU2V0dGluZ3MudGlwTG9jYXRpb25QYXR0ZXJuLmxlbmd0aCkgewoKICAgICAgICAgICAgICAkbnViLnJlbW92ZUNsYXNzKCdib3R0b20nKQogICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCd0b3AnKQogICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdyaWdodCcpCiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2xlZnQnKTsKCiAgICAgICAgICAgICAgc2V0dGluZ3MudGlwU2V0dGluZ3MudGlwTG9jYXRpb24gPSBzZXR0aW5ncy50aXBTZXR0aW5ncy50aXBMb2NhdGlvblBhdHRlcm5bc2V0dGluZ3MuYXR0ZW1wdHNdOwoKICAgICAgICAgICAgICBzZXR0aW5ncy5hdHRlbXB0cysrOwoKICAgICAgICAgICAgICBtZXRob2RzLnBvc19kZWZhdWx0KHRydWUpOwoKICAgICAgICAgICAgfQoKICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLiRsaS5sZW5ndGgpIHsKCiAgICAgICAgICBtZXRob2RzLnBvc19tb2RhbCgkbnViKTsKCiAgICAgICAgfQoKICAgICAgICBpZiAodG9nZ2xlKSB7CiAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuaGlkZSgpOwogICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmNzcygndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7CiAgICAgICAgfQoKICAgICAgfSwKCiAgICAgIHBvc19waG9uZSA6IGZ1bmN0aW9uIChpbml0KSB7CiAgICAgICAgdmFyIHRpcF9oZWlnaHQgPSBzZXR0aW5ncy4kbmV4dF90aXAub3V0ZXJIZWlnaHQoKSwKICAgICAgICAgICAgdGlwX29mZnNldCA9IHNldHRpbmdzLiRuZXh0X3RpcC5vZmZzZXQoKSwKICAgICAgICAgICAgdGFyZ2V0X2hlaWdodCA9IHNldHRpbmdzLiR0YXJnZXQub3V0ZXJIZWlnaHQoKSwKICAgICAgICAgICAgJG51YiA9ICQoJy5qb3lyaWRlLW51YicsIHNldHRpbmdzLiRuZXh0X3RpcCksCiAgICAgICAgICAgIG51Yl9oZWlnaHQgPSBNYXRoLmNlaWwoJG51Yi5vdXRlckhlaWdodCgpIC8gMiksCiAgICAgICAgICAgIHRvZ2dsZSA9IGluaXQgfHwgZmFsc2U7CgogICAgICAgICRudWIucmVtb3ZlQ2xhc3MoJ2JvdHRvbScpCiAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3RvcCcpCiAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3JpZ2h0JykKICAgICAgICAgIC5yZW1vdmVDbGFzcygnbGVmdCcpOwoKICAgICAgICBpZiAodG9nZ2xlKSB7CiAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuY3NzKCd2aXNpYmlsaXR5JywgJ2hpZGRlbicpOwogICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLnNob3coKTsKICAgICAgICB9CgogICAgICAgIGlmICghL2JvZHkvaS50ZXN0KHNldHRpbmdzLiR0YXJnZXQuc2VsZWN0b3IpKSB7CgogICAgICAgICAgaWYgKG1ldGhvZHMudG9wKCkpIHsKCiAgICAgICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLm9mZnNldCh7dG9wOiBzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLnRvcCAtIHRpcF9oZWlnaHQgLSBudWJfaGVpZ2h0fSk7CiAgICAgICAgICAgICAgJG51Yi5hZGRDbGFzcygnYm90dG9tJyk7CgogICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5vZmZzZXQoe3RvcDogc2V0dGluZ3MuJHRhcmdldC5vZmZzZXQoKS50b3AgKyB0YXJnZXRfaGVpZ2h0ICsgbnViX2hlaWdodH0pOwogICAgICAgICAgICAkbnViLmFkZENsYXNzKCd0b3AnKTsKCiAgICAgICAgICB9CgogICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuJGxpLmxlbmd0aCkgewoKICAgICAgICAgIG1ldGhvZHMucG9zX21vZGFsKCRudWIpOwoKICAgICAgICB9CgogICAgICAgIGlmICh0b2dnbGUpIHsKICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5oaWRlKCk7CiAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBwb3NfbW9kYWwgOiBmdW5jdGlvbiAoJG51YikgewogICAgICAgIG1ldGhvZHMuY2VudGVyKCk7CiAgICAgICAgJG51Yi5oaWRlKCk7CgogICAgICAgIGlmICgkKCcuam95cmlkZS1tb2RhbC1iZycpLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImpveXJpZGUtbW9kYWwtYmciPicpLnNob3coKTsKICAgICAgICB9CgogICAgICAgIGlmICgvcG9wL2kudGVzdChzZXR0aW5ncy50aXBBbmltYXRpb24pKSB7CiAgICAgICAgICAkKCcuam95cmlkZS1tb2RhbC1iZycpLnNob3coKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJCgnLmpveXJpZGUtbW9kYWwtYmcnKS5mYWRlSW4oc2V0dGluZ3MudGlwQW5pbWF0aW9uRmFkZVNwZWVkKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBjZW50ZXIgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyICR3ID0gc2V0dGluZ3MuJHdpbmRvdzsKCiAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmNzcyh7CiAgICAgICAgICB0b3AgOiAoKCgkdy5oZWlnaHQoKSAtIHNldHRpbmdzLiRuZXh0X3RpcC5vdXRlckhlaWdodCgpKSAvIDIpICsgJHcuc2Nyb2xsVG9wKCkpLAogICAgICAgICAgbGVmdCA6ICgoKCR3LndpZHRoKCkgLSBzZXR0aW5ncy4kbmV4dF90aXAub3V0ZXJXaWR0aCgpKSAvIDIpICsgJHcuc2Nyb2xsTGVmdCgpKQogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKCiAgICAgIGJvdHRvbSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gL2JvdHRvbS9pLnRlc3Qoc2V0dGluZ3MudGlwU2V0dGluZ3MudGlwTG9jYXRpb24pOwogICAgICB9LAoKICAgICAgdG9wIDogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAvdG9wL2kudGVzdChzZXR0aW5ncy50aXBTZXR0aW5ncy50aXBMb2NhdGlvbik7CiAgICAgIH0sCgogICAgICByaWdodCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gL3JpZ2h0L2kudGVzdChzZXR0aW5ncy50aXBTZXR0aW5ncy50aXBMb2NhdGlvbik7CiAgICAgIH0sCgogICAgICBsZWZ0IDogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAvbGVmdC9pLnRlc3Qoc2V0dGluZ3MudGlwU2V0dGluZ3MudGlwTG9jYXRpb24pOwogICAgICB9LAoKICAgICAgY29ybmVycyA6IGZ1bmN0aW9uIChlbCkgewogICAgICAgIHZhciB3ID0gc2V0dGluZ3MuJHdpbmRvdywKICAgICAgICAgICAgcmlnaHQgPSB3LndpZHRoKCkgKyB3LnNjcm9sbExlZnQoKSwKICAgICAgICAgICAgYm90dG9tID0gdy53aWR0aCgpICsgdy5zY3JvbGxUb3AoKTsKCiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgIGVsLm9mZnNldCgpLnRvcCA8PSB3LnNjcm9sbFRvcCgpLAogICAgICAgICAgcmlnaHQgPD0gZWwub2Zmc2V0KCkubGVmdCArIGVsLm91dGVyV2lkdGgoKSwKICAgICAgICAgIGJvdHRvbSA8PSBlbC5vZmZzZXQoKS50b3AgKyBlbC5vdXRlckhlaWdodCgpLAogICAgICAgICAgdy5zY3JvbGxMZWZ0KCkgPj0gZWwub2Zmc2V0KCkubGVmdAogICAgICAgIF07CiAgICAgIH0sCgogICAgICB2aXNpYmxlIDogZnVuY3Rpb24gKGhpZGRlbl9jb3JuZXJzKSB7CiAgICAgICAgdmFyIGkgPSBoaWRkZW5fY29ybmVycy5sZW5ndGg7CgogICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgIGlmIChoaWRkZW5fY29ybmVyc1tpXSkgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0sCgogICAgICBudWJfcG9zaXRpb24gOiBmdW5jdGlvbiAobnViLCBwb3MsIGRlZikgewogICAgICAgIGlmIChwb3MgPT09ICdhdXRvJykgewogICAgICAgICAgbnViLmFkZENsYXNzKGRlZik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG51Yi5hZGRDbGFzcyhwb3MpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIHN0YXJ0VGltZXIgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHNldHRpbmdzLiRsaS5sZW5ndGgpIHsKICAgICAgICAgIHNldHRpbmdzLmF1dG9tYXRlID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG1ldGhvZHMuaGlkZSgpOwogICAgICAgICAgICBtZXRob2RzLnNob3coKTsKICAgICAgICAgICAgbWV0aG9kcy5zdGFydFRpbWVyKCk7CiAgICAgICAgICB9LCBzZXR0aW5ncy50aW1lcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNsZWFyVGltZW91dChzZXR0aW5ncy5hdXRvbWF0ZSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgZW5kIDogZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChzZXR0aW5ncy5jb29raWVNb25zdGVyKSB7CiAgICAgICAgICAkLmNvb2tpZShzZXR0aW5ncy5jb29raWVOYW1lLCAncmlkZGVuJywgeyBleHBpcmVzOiAzNjUsIGRvbWFpbjogc2V0dGluZ3MuY29va2llRG9tYWluIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNldHRpbmdzLnRpbWVyID4gMCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KHNldHRpbmdzLmF1dG9tYXRlKTsKICAgICAgICB9CgogICAgICAgICQoJy5qb3lyaWRlLW1vZGFsLWJnJykuaGlkZSgpOwogICAgICAgIHNldHRpbmdzLiRjdXJyZW50X3RpcC5oaWRlKCk7CiAgICAgICAgc2V0dGluZ3MucG9zdFN0ZXBDYWxsYmFjayhzZXR0aW5ncy4kbGkuaW5kZXgoKSwgc2V0dGluZ3MuJGN1cnJlbnRfdGlwKTsKICAgICAgICBzZXR0aW5ncy5wb3N0UmlkZUNhbGxiYWNrKHNldHRpbmdzLiRsaS5pbmRleCgpLCBzZXR0aW5ncy4kY3VycmVudF90aXApOwogICAgICB9LAoKICAgICAganF1ZXJ5X2NoZWNrIDogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIGRlZmluZSBvbigpIGFuZCBvZmYoKSBmb3Igb2xkZXIgalF1ZXJ5CiAgICAgICAgaWYgKCEkLmlzRnVuY3Rpb24oJC5mbi5vbikpIHsKCiAgICAgICAgICAkLmZuLm9uID0gZnVuY3Rpb24gKHR5cGVzLCBzZWwsIGZuKSB7CgogICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZShzZWwsIHR5cGVzLCBmbik7CgogICAgICAgICAgfTsKCiAgICAgICAgICAkLmZuLm9mZiA9IGZ1bmN0aW9uICh0eXBlcywgc2VsLCBmbikgewoKICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5kZWxlZ2F0ZShzZWwsIHR5cGVzLCBmbik7CgogICAgICAgICAgfTsKCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKCiAgICAgIG91dGVySFRNTCA6IGZ1bmN0aW9uIChlbCkgewogICAgICAgIC8vIHN1cHBvcnQgRmlyZUZveCA8IDExCiAgICAgICAgcmV0dXJuIGVsLm91dGVySFRNTCB8fCBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGVsKTsKICAgICAgfSwKCiAgICAgIHZlcnNpb24gOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHNldHRpbmdzLnZlcnNpb247CiAgICAgIH0KCiAgICB9OwoKICAkLmZuLmpveXJpZGUgPSBmdW5jdGlvbiAobWV0aG9kKSB7CiAgICBpZiAobWV0aG9kc1ttZXRob2RdKSB7CiAgICAgIHJldHVybiBtZXRob2RzW21ldGhvZF0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdvYmplY3QnIHx8ICFtZXRob2QpIHsKICAgICAgcmV0dXJuIG1ldGhvZHMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgJC5lcnJvcignTWV0aG9kICcgKyAgbWV0aG9kICsgJyBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuam95cmlkZScpOwogICAgfQogIH07Cgp9KGpRdWVyeSwgdGhpcykpOwo=
###PACKDATA,FILE_END,/js/jquery.joyride-2.0.3.js,importbuddy/js/jquery.joyride-2.0.3.js
###PACKDATA,FILE_START,/js/modernizr.mq.js,importbuddy/js/modernizr.mq.js
LyogTW9kZXJuaXpyIDIuNi4xIChDdXN0b20gQnVpbGQpIHwgTUlUICYgQlNECiAqIEJ1aWxkOiBodHRwOi8vbW9kZXJuaXpyLmNvbS9kb3dubG9hZC8jLW1xLXRlc3RzdHlsZXMKICovCjsKCgoKd2luZG93Lk1vZGVybml6ciA9IChmdW5jdGlvbiggd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkICkgewoKICAgIHZhciB2ZXJzaW9uID0gJzIuNi4xJywKCiAgICBNb2Rlcm5penIgPSB7fSwKCgogICAgZG9jRWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKCiAgICBtb2QgPSAnbW9kZXJuaXpyJywKICAgIG1vZEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG1vZCksCiAgICBtU3R5bGUgPSBtb2RFbGVtLnN0eWxlLAoKICAgIGlucHV0RWxlbSAgLAoKCiAgICB0b1N0cmluZyA9IHt9LnRvU3RyaW5nLCAgICB0ZXN0cyA9IHt9LAogICAgaW5wdXRzID0ge30sCiAgICBhdHRycyA9IHt9LAoKICAgIGNsYXNzZXMgPSBbXSwKCiAgICBzbGljZSA9IGNsYXNzZXMuc2xpY2UsCgogICAgZmVhdHVyZU5hbWUsIAoKCiAgICBpbmplY3RFbGVtZW50V2l0aFN0eWxlcyA9IGZ1bmN0aW9uKCBydWxlLCBjYWxsYmFjaywgbm9kZXMsIHRlc3RuYW1lcyApIHsKCiAgICAgIHZhciBzdHlsZSwgcmV0LCBub2RlLAogICAgICAgICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksCiAgICAgICAgICAgICAgICBib2R5ID0gZG9jdW1lbnQuYm9keSwKICAgICAgICAgICAgICAgIGZha2VCb2R5ID0gYm9keSA/IGJvZHkgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7CgogICAgICBpZiAoIHBhcnNlSW50KG5vZGVzLCAxMCkgKSB7CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIG5vZGVzLS0gKSB7CiAgICAgICAgICAgICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgIG5vZGUuaWQgPSB0ZXN0bmFtZXMgPyB0ZXN0bmFtZXNbbm9kZXNdIDogbW9kICsgKG5vZGVzICsgMSk7CiAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUpOwogICAgICAgICAgfQogICAgICB9CgogICAgICAgICAgICAgICAgc3R5bGUgPSBbJyYjMTczOycsJzxzdHlsZSBpZD0icycsIG1vZCwgJyI+JywgcnVsZSwgJzwvc3R5bGU+J10uam9pbignJyk7CiAgICAgIGRpdi5pZCA9IG1vZDsKICAgICAgICAgIChib2R5ID8gZGl2IDogZmFrZUJvZHkpLmlubmVySFRNTCArPSBzdHlsZTsKICAgICAgZmFrZUJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKICAgICAgaWYgKCAhYm9keSApIHsKICAgICAgICAgICAgICAgIGZha2VCb2R5LnN0eWxlLmJhY2tncm91bmQgPSAiIjsKICAgICAgICAgIGRvY0VsZW1lbnQuYXBwZW5kQ2hpbGQoZmFrZUJvZHkpOwogICAgICB9CgogICAgICByZXQgPSBjYWxsYmFjayhkaXYsIHJ1bGUpOwogICAgICAgICFib2R5ID8gZmFrZUJvZHkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmYWtlQm9keSkgOiBkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaXYpOwoKICAgICAgcmV0dXJuICEhcmV0OwoKICAgIH0sCgogICAgdGVzdE1lZGlhUXVlcnkgPSBmdW5jdGlvbiggbXEgKSB7CgogICAgICB2YXIgbWF0Y2hNZWRpYSA9IHdpbmRvdy5tYXRjaE1lZGlhIHx8IHdpbmRvdy5tc01hdGNoTWVkaWE7CiAgICAgIGlmICggbWF0Y2hNZWRpYSApIHsKICAgICAgICByZXR1cm4gbWF0Y2hNZWRpYShtcSkubWF0Y2hlczsKICAgICAgfQoKICAgICAgdmFyIGJvb2w7CgogICAgICBpbmplY3RFbGVtZW50V2l0aFN0eWxlcygnQG1lZGlhICcgKyBtcSArICcgeyAjJyArIG1vZCArICcgeyBwb3NpdGlvbjogYWJzb2x1dGU7IH0gfScsIGZ1bmN0aW9uKCBub2RlICkgewogICAgICAgIGJvb2wgPSAod2luZG93LmdldENvbXB1dGVkU3R5bGUgPwogICAgICAgICAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpIDoKICAgICAgICAgICAgICAgICAgbm9kZS5jdXJyZW50U3R5bGUpWydwb3NpdGlvbiddID09ICdhYnNvbHV0ZSc7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIGJvb2w7CgogICAgIH0sCiAgICBfaGFzT3duUHJvcGVydHkgPSAoe30pLmhhc093blByb3BlcnR5LCBoYXNPd25Qcm9wOwoKICAgIGlmICggIWlzKF9oYXNPd25Qcm9wZXJ0eSwgJ3VuZGVmaW5lZCcpICYmICFpcyhfaGFzT3duUHJvcGVydHkuY2FsbCwgJ3VuZGVmaW5lZCcpICkgewogICAgICBoYXNPd25Qcm9wID0gZnVuY3Rpb24gKG9iamVjdCwgcHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gX2hhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7CiAgICAgIH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgaGFzT3duUHJvcCA9IGZ1bmN0aW9uIChvYmplY3QsIHByb3BlcnR5KSB7IAogICAgICAgIHJldHVybiAoKHByb3BlcnR5IGluIG9iamVjdCkgJiYgaXMob2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZVtwcm9wZXJ0eV0sICd1bmRlZmluZWQnKSk7CiAgICAgIH07CiAgICB9CgoKICAgIGlmICghRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpIHsKICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHsKCiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXM7CgogICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSksCiAgICAgICAgICAgIGJvdW5kID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkgewoKICAgICAgICAgICAgICB2YXIgRiA9IGZ1bmN0aW9uKCl7fTsKICAgICAgICAgICAgICBGLnByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGU7CiAgICAgICAgICAgICAgdmFyIHNlbGYgPSBuZXcgRigpOwoKICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGFyZ2V0LmFwcGx5KAogICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpCiAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICBpZiAoT2JqZWN0KHJlc3VsdCkgPT09IHJlc3VsdCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gc2VsZjsKCiAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuYXBwbHkoCiAgICAgICAgICAgICAgICAgIHRoYXQsCiAgICAgICAgICAgICAgICAgIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkKICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQoKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gYm91bmQ7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2V0Q3NzKCBzdHIgKSB7CiAgICAgICAgbVN0eWxlLmNzc1RleHQgPSBzdHI7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0Q3NzQWxsKCBzdHIxLCBzdHIyICkgewogICAgICAgIHJldHVybiBzZXRDc3MocHJlZml4ZXMuam9pbihzdHIxICsgJzsnKSArICggc3RyMiB8fCAnJyApKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpcyggb2JqLCB0eXBlICkgewogICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSB0eXBlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRhaW5zKCBzdHIsIHN1YnN0ciApIHsKICAgICAgICByZXR1cm4gISF+KCcnICsgc3RyKS5pbmRleE9mKHN1YnN0cik7CiAgICB9CgoKICAgIGZ1bmN0aW9uIHRlc3RET01Qcm9wcyggcHJvcHMsIG9iaiwgZWxlbSApIHsKICAgICAgICBmb3IgKCB2YXIgaSBpbiBwcm9wcyApIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBvYmpbcHJvcHNbaV1dOwogICAgICAgICAgICBpZiAoIGl0ZW0gIT09IHVuZGVmaW5lZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtID09PSBmYWxzZSkgcmV0dXJuIHByb3BzW2ldOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcyhpdGVtLCAnZnVuY3Rpb24nKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYmluZChlbGVtIHx8IG9iaik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZm9yICggdmFyIGZlYXR1cmUgaW4gdGVzdHMgKSB7CiAgICAgICAgaWYgKCBoYXNPd25Qcm9wKHRlc3RzLCBmZWF0dXJlKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZU5hbWUgID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICBNb2Rlcm5penJbZmVhdHVyZU5hbWVdID0gdGVzdHNbZmVhdHVyZV0oKTsKCiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgoTW9kZXJuaXpyW2ZlYXR1cmVOYW1lXSA/ICcnIDogJ25vLScpICsgZmVhdHVyZU5hbWUpOwogICAgICAgIH0KICAgIH0KCgoKICAgICBNb2Rlcm5penIuYWRkVGVzdCA9IGZ1bmN0aW9uICggZmVhdHVyZSwgdGVzdCApIHsKICAgICAgIGlmICggdHlwZW9mIGZlYXR1cmUgPT0gJ29iamVjdCcgKSB7CiAgICAgICAgIGZvciAoIHZhciBrZXkgaW4gZmVhdHVyZSApIHsKICAgICAgICAgICBpZiAoIGhhc093blByb3AoIGZlYXR1cmUsIGtleSApICkgewogICAgICAgICAgICAgTW9kZXJuaXpyLmFkZFRlc3QoIGtleSwgZmVhdHVyZVsga2V5IF0gKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CgogICAgICAgICBmZWF0dXJlID0gZmVhdHVyZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgaWYgKCBNb2Rlcm5penJbZmVhdHVyZV0gIT09IHVuZGVmaW5lZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2Rlcm5penI7CiAgICAgICAgIH0KCiAgICAgICAgIHRlc3QgPSB0eXBlb2YgdGVzdCA9PSAnZnVuY3Rpb24nID8gdGVzdCgpIDogdGVzdDsKCiAgICAgICAgIGlmIChlbmFibGVDbGFzc2VzKSB7CiAgICAgICAgICAgZG9jRWxlbWVudC5jbGFzc05hbWUgKz0gJyAnICsgKHRlc3QgPyAnJyA6ICduby0nKSArIGZlYXR1cmU7CiAgICAgICAgIH0KICAgICAgICAgTW9kZXJuaXpyW2ZlYXR1cmVdID0gdGVzdDsKCiAgICAgICB9CgogICAgICAgcmV0dXJuIE1vZGVybml6cjsgCiAgICAgfTsKCgogICAgc2V0Q3NzKCcnKTsKICAgIG1vZEVsZW0gPSBpbnB1dEVsZW0gPSBudWxsOwoKCiAgICBNb2Rlcm5penIuX3ZlcnNpb24gICAgICA9IHZlcnNpb247CgoKICAgIE1vZGVybml6ci5tcSAgICAgICAgICAgID0gdGVzdE1lZGlhUXVlcnk7CiAgICBNb2Rlcm5penIudGVzdFN0eWxlcyAgICA9IGluamVjdEVsZW1lbnRXaXRoU3R5bGVzOwogICAgcmV0dXJuIE1vZGVybml6cjsKCn0pKHRoaXMsIHRoaXMuZG9jdW1lbnQpOwo7
###PACKDATA,FILE_END,/js/modernizr.mq.js,importbuddy/js/modernizr.mq.js
###PACKDATA,FILE_START,/css/joyride.css,importbuddy/css/joyride.css
LyogQXJ0ZnVsbHkgbWFzdGVybWluZGVkIGJ5IFpVUkIgKi8KCiNqb3lSaWRlVGlwQ29udGVudCB7IGRpc3BsYXk6IG5vbmU7IH0KCi5qb3lSaWRlVGlwQ29udGVudCB7IGRpc3BsYXk6IG5vbmU7IH0KCi8qIERlZmF1bHQgc3R5bGVzIGZvciB0aGUgY29udGFpbmVyICovCi5qb3lyaWRlLXRpcC1ndWlkZSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGJhY2tncm91bmQ6ICMwMDA7CiAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjgpOwogIGRpc3BsYXk6IG5vbmU7CiAgY29sb3I6ICNmZmY7CiAgd2lkdGg6IDMwMHB4OwogIHotaW5kZXg6IDEwMTsKICB0b3A6IDA7IC8qIGtlZXBzIHRoZSBwYWdlIGZyb20gc2Nyb2xsaW5nIHdoZW4gY2FsY3VsYXRpbmcgcG9zaXRpb24gKi8KICBsZWZ0OiAwOwogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhTmV1ZSIsICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBMdWNpZGEsIHNhbnMtc2VyaWY7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLmpveXJpZGUtY29udGVudC13cmFwcGVyIHsKICBwYWRkaW5nOiAxMnB4IDE4cHggMTVweCAxNXB4OwogIHRleHQtc2hhZG93OiAzcHggMCAwICMwMDAsIDAgLTFweCAwICMwMDAsIDAgM3B4IDAgIzAwMCwgLTFweCAwIDAgIzAwMDsKfQoKLyogTW9iaWxlICovCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsKICAuam95cmlkZS10aXAtZ3VpZGUgewogICAgd2lkdGg6IDk1JSAhaW1wb3J0YW50OwogICAgLW1vei1ib3JkZXItcmFkaXVzOiAwOwogICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGxlZnQ6IDIuNSUgIWltcG9ydGFudDsKICB9CiAgLmpveXJpZGUtdGlwLWd1aWRlLXdyYXBwZXIgewogICAgd2lkdGg6IDEwMCU7CiAgfQp9CgoKLyogQWRkIGEgbGl0dGxlIGNzcyB0cmlhbmdsZSBwaXAsIG9sZGVyIGJyb3dzZXIganVzdCBtaXNzIG91dCBvbiB0aGUgZmFuY2luZXNzIG9mIGl0ICovCi5qb3lyaWRlLXRpcC1ndWlkZSBzcGFuLmpveXJpZGUtbnViIHsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMjJweDsKICB3aWR0aDogMDsKICBoZWlnaHQ6IDA7CiAgYm9yZGVyOiBzb2xpZCAxNHB4OwogIGJvcmRlcjogc29saWQgMTRweDsKfQoKLmpveXJpZGUtdGlwLWd1aWRlIHNwYW4uam95cmlkZS1udWIudG9wIHsKICAvKgogIElFNy9JRTggRG9uJ3Qgc3VwcG9ydCByZ2JhIHNvIHdlIHNldCB0aGUgZmFsbGJhY2sKICBib3JkZXIgY29sb3IgaGVyZS4gSG93ZXZlciwgSUU3L0lFOCBhcmUgYWxzbyBidWdneQogIGluIHRoYXQgdGhlIGZhbGxiYWNrIGNvbG9yIGRvZXNuJ3Qgd29yayBmb3IKICBib3JkZXItYm90dG9tLWNvbG9yIHNvIGhlcmUgd2Ugc2V0IHRoZSBib3JkZXItY29sb3IKICBhbmQgb3ZlcnJpZGUgdGhlIHRvcCxsZWZ0LHJpZ2h0IGNvbG9ycyBiZWxvdy4KICAqLwogIGJvcmRlci1jb2xvcjogIzAwMDsKICBib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsMC44KTsKICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogIGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICB0b3A6IC0yN3B4OwogIGJvdHRvbTogbm9uZTsKfQoKLmpveXJpZGUtdGlwLWd1aWRlIHNwYW4uam95cmlkZS1udWIuYm90dG9tIHsKICAvKgogIElFNy9JRTggRG9uJ3Qgc3VwcG9ydCByZ2JhIHNvIHdlIHNldCB0aGUgZmFsbGJhY2sKICBib3JkZXIgY29sb3IgaGVyZS4gSG93ZXZlciwgSUU3L0lFOCBhcmUgYWxzbyBidWdneQogIGluIHRoYXQgdGhlIGZhbGxiYWNrIGNvbG9yIGRvZXNuJ3Qgd29yayBmb3IKICBib3JkZXItdG9wLWNvbG9yIHNvIGhlcmUgd2Ugc2V0IHRoZSBib3JkZXItY29sb3IKICBhbmQgb3ZlcnJpZGUgdGhlIGJvdHRvbSxsZWZ0LHJpZ2h0IGNvbG9ycyBiZWxvdy4KICAqLwogIGJvcmRlci1jb2xvcjogIzAwMDsKICBib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsMC44KSAhaW1wb3J0YW50OwogIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogIGJvdHRvbTogLTI3cHg7CiAgYm90dG9tOiBub25lOwp9Cgouam95cmlkZS10aXAtZ3VpZGUgc3Bhbi5qb3lyaWRlLW51Yi5yaWdodCB7CiAgYm9yZGVyLWNvbG9yOiAjMDAwOwogIGJvcmRlci1jb2xvcjogcmdiYSgwLDAsMCwwLjgpICFpbXBvcnRhbnQ7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICB0b3A6IDIycHg7CiAgYm90dG9tOiBub25lOwogIGxlZnQ6IGF1dG87CiAgcmlnaHQ6IC0yOHB4Owp9Cgouam95cmlkZS10aXAtZ3VpZGUgc3Bhbi5qb3lyaWRlLW51Yi5sZWZ0IHsKICBib3JkZXItY29sb3I6ICMwMDA7CiAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsMCwwLDAuOCkgIWltcG9ydGFudDsKICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgdG9wOiAyMnB4OwogIGxlZnQ6IC0yOHB4OwogIHJpZ2h0OiBhdXRvOwogIGJvdHRvbTogbm9uZTsKfQoKLmpveXJpZGUtdGlwLWd1aWRlIHNwYW4uam95cmlkZS1udWIudG9wLXJpZ2h0IHsKICBib3JkZXItY29sb3I6ICMwMDA7CiAgYm9yZGVyLWNvbG9yOiByZ2JhKDAsMCwwLDAuOCk7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgdG9wOiAtMjhweDsKICBib3R0b206IG5vbmU7CiAgbGVmdDogYXV0bzsKICByaWdodDogMjhweDsKfQoKLyogVHlwb2dyYXBoeSAqLwouam95cmlkZS10aXAtZ3VpZGUgaDEsLmpveXJpZGUtdGlwLWd1aWRlIGgyLC5qb3lyaWRlLXRpcC1ndWlkZSBoMywuam95cmlkZS10aXAtZ3VpZGUgaDQsLmpveXJpZGUtdGlwLWd1aWRlIGg1LC5qb3lyaWRlLXRpcC1ndWlkZSBoNiB7CiAgbGluZS1oZWlnaHQ6IDEuMjU7CiAgbWFyZ2luOiAwOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGNvbG9yOiAjZmZmOwp9Ci5qb3lyaWRlLXRpcC1ndWlkZSBoMSB7IGZvbnQtc2l6ZTogMzBweDsgfQouam95cmlkZS10aXAtZ3VpZGUgaDIgeyBmb250LXNpemU6IDI2cHg7IH0KLmpveXJpZGUtdGlwLWd1aWRlIGgzIHsgZm9udC1zaXplOiAyMnB4OyB9Ci5qb3lyaWRlLXRpcC1ndWlkZSBoNCB7IGZvbnQtc2l6ZTogMThweDsgfQouam95cmlkZS10aXAtZ3VpZGUgaDUgeyBmb250LXNpemU6IDE2cHg7IH0KLmpveXJpZGUtdGlwLWd1aWRlIGg2IHsgZm9udC1zaXplOiAxNHB4OyB9Ci5qb3lyaWRlLXRpcC1ndWlkZSBwIHsKICBtYXJnaW46IDAgMCAxOHB4IDA7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxOHB4Owp9Ci5qb3lyaWRlLXRpcC1ndWlkZSBhIHsKICBjb2xvcjogcmdiKDI1NSwyNTUsMjU1KTsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgYm9yZGVyLWJvdHRvbTogZG90dGVkIDFweCByZ2JhKDI1NSwyNTUsMjU1LDAuNik7Cn0KLmpveXJpZGUtdGlwLWd1aWRlIGE6aG92ZXIgewogIGNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuOCk7CiAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLyogQnV0dG9uIFN0eWxlICovCi5qb3lyaWRlLXRpcC1ndWlkZSAuam95cmlkZS1uZXh0LXRpcCB7CiAgd2lkdGg6IGF1dG87CiAgcGFkZGluZzogNnB4IDE4cHggNHB4OwogIGZvbnQtc2l6ZTogMTNweDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgY29sb3I6IHJnYigyNTUsMjU1LDI1NSk7CiAgYm9yZGVyOiBzb2xpZCAxcHggcmdiKDAsNjAsMTgwKTsKICBiYWNrZ3JvdW5kOiByZ2IoMCw5OSwyNTUpOwogIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDAsOTksMjU1KSAwJSwgcmdiKDAsODUsMjE0KSAxMDAlKTsKICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAlLHJnYigwLDk5LDI1NSkpLCBjb2xvci1zdG9wKDEwMCUscmdiKDAsODUsMjE0KSkpOwogIGJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDAsOTksMjU1KSAwJSxyZ2IoMCw4NSwyMTQpIDEwMCUpOwogIGJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYigwLDk5LDI1NSkgMCUscmdiKDAsODUsMjE0KSAxMDAlKTsKICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDAsOTksMjU1KSAwJSxyZ2IoMCw4NSwyMTQpIDEwMCUpOwogIGZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KCBzdGFydENvbG9yc3RyPScjMDA2M2ZmJywgZW5kQ29sb3JzdHI9JyMwMDU1ZDYnLEdyYWRpZW50VHlwZT0wICk7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDAsOTksMjU1KSAwJSxyZ2IoMCw4NSwyMTQpIDEwMCUpOwogIHRleHQtc2hhZG93OiAwIC0xcHggMCByZ2JhKDAsMCwwLDAuNSk7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7CiAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMXB4IDBweCByZ2JhKDI1NSwyNTUsMjU1LDAuMykgaW5zZXQ7CiAgICAgLW1vei1ib3gtc2hhZG93OiAwcHggMXB4IDBweCByZ2JhKDI1NSwyNTUsMjU1LDAuMykgaW5zZXQ7CiAgICAgICAgICBib3gtc2hhZG93OiAwcHggMXB4IDBweCByZ2JhKDI1NSwyNTUsMjU1LDAuMykgaW5zZXQ7Cn0KCi5qb3lyaWRlLW5leHQtdGlwOmhvdmVyIHsKICBjb2xvcjogcmdiKDI1NSwyNTUsMjU1KSAhaW1wb3J0YW50OwogIGJvcmRlcjogc29saWQgMXB4IHJnYigwLDYwLDE4MCkgIWltcG9ydGFudDsKICBiYWNrZ3JvdW5kOiByZ2IoNDMsMTI4LDI1NSk7CiAgYmFja2dyb3VuZDogLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCByZ2IoNDMsMTI4LDI1NSkgMCUsIHJnYigyOSwxMDIsMjExKSAxMDAlKTsKICBiYWNrZ3JvdW5kOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBjb2xvci1zdG9wKDAlLHJnYig0MywxMjgsMjU1KSksIGNvbG9yLXN0b3AoMTAwJSxyZ2IoMjksMTAyLDIxMSkpKTsKICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig0MywxMjgsMjU1KSAwJSxyZ2IoMjksMTAyLDIxMSkgMTAwJSk7CiAgYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDQzLDEyOCwyNTUpIDAlLHJnYigyOSwxMDIsMjExKSAxMDAlKTsKICBiYWNrZ3JvdW5kOiAtbXMtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDQzLDEyOCwyNTUpIDAlLHJnYigyOSwxMDIsMjExKSAxMDAlKTsKICBmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCggc3RhcnRDb2xvcnN0cj0nIzJiODBmZicsIGVuZENvbG9yc3RyPScjMWQ2NmQzJyxHcmFkaWVudFR5cGU9MCApOwogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig0MywxMjgsMjU1KSAwJSxyZ2IoMjksMTAyLDIxMSkgMTAwJSk7Cn0KCi5qb3lyaWRlLW5leHQtdGlwIHsKICBtYXJnaW4tdG9wOiA1cHg7CiAgZGlzcGxheTogYmxvY2s7CiAgbWF4LXdpZHRoOiAzNXB4OwogIG1hcmdpbi1sZWZ0OiBhdXRvOwogIG1hcmdpbi1yaWdodDogYXV0bzsKfQoKLmpveXJpZGUtdGltZXItaW5kaWNhdG9yLXdyYXAgewogIHdpZHRoOiA1MHB4OwogIGhlaWdodDogM3B4OwogIGJvcmRlcjogc29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsMC4xKTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDE3cHg7CiAgYm90dG9tOiAxNnB4Owp9Ci5qb3lyaWRlLXRpbWVyLWluZGljYXRvciB7CiAgZGlzcGxheTogYmxvY2s7CiAgd2lkdGg6IDA7CiAgaGVpZ2h0OiBpbmhlcml0OwogIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4yNSk7Cn0KCi5qb3lyaWRlLWNsb3NlLXRpcCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHJpZ2h0OiAxMHB4OwogIHRvcDogMTBweDsKICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjQpICFpbXBvcnRhbnQ7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBib3JkZXItYm90dG9tOiBub25lICFpbXBvcnRhbnQ7Cn0KCi5qb3lyaWRlLWNsb3NlLXRpcDpob3ZlciB7CiAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC45KSAhaW1wb3J0YW50Owp9Cgouam95cmlkZS1tb2RhbC1iZyB7CiAgcG9zaXRpb246IGZpeGVkOwogIGhlaWdodDogMTAwJTsKICB3aWR0aDogMTAwJTsKICBiYWNrZ3JvdW5kOiByZ2IoMCwwLDApOwogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsIDAuNSk7CiAgLW1zLWZpbHRlcjoicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9NTApIjsKICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApOwogIG9wYWNpdHk6IDAuNTsKICB6LWluZGV4OiAxMDA7CiAgZGlzcGxheTogbm9uZTsKICB0b3A6IDA7CiAgbGVmdDogMDsKICBjdXJzb3I6IHBvaW50ZXI7Cn0K
###PACKDATA,FILE_END,/css/joyride.css,importbuddy/css/joyride.css
###PACKDATA,FILE_START,/images/working.gif,importbuddy/images/working.gif
R0lGODlhKwALAPEAAPn5+SiKt5LC2CiKtyH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAKwALAAACMoSOCMuW2diD88UKG95W88uF4DaGWFmhZid93pq+pwxnLUnXh8ou+sSz+T64oCAyTBUAACH5BAkKAAAALAAAAAArAAsAAAI9xI4IyyAPYWOxmoTHrHzzmGHe94xkmJifyqFKQ0pwLLgHa82xrekkDrIBZRQab1jyfY7KTtPimixiUsevAAAh+QQJCgAAACwAAAAAKwALAAACPYSOCMswD2FjqZpqW9xv4g8KE7d54XmMpNSgqLoOpgvC60xjNonnyc7p+VKamKw1zDCMR8rp8pksYlKorgAAIfkECQoAAAAsAAAAACsACwAAAkCEjgjLltnYmJS6Bxt+sfq5ZUyoNJ9HHlEqdCfFrqn7DrE2m7Wdj/2y45FkQ13t5itKdshFExC8YCLOEBX6AhQAADs=
###PACKDATA,FILE_END,/images/working.gif,importbuddy/images/working.gif
###PACKDATA,FILE_START,/images/bullet_go.png,importbuddy/images/bullet_go.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEsSURBVDjLY/j//z8DJZhhmBuQvdj8a+p8w//xc3U5yTIgeb7h18bNUf/DZ2j8958qz0nQgPyltv9zF5v/TV9o/Ddxrv7fmvWh/1ednvi/ZLX/f9d+8b+23YI8eA0AOvn/hnPT/q89OwWsccXpCf8n7Cn5v/B41/+MpW7/TdvZ/+o2M/LjNADoZLDmvl35/zt3ZP9v3Zb2v2Fz4v+mren/Zxxq/h+zwOa/aj3DH5wGRM/W/L/y1IT/S0/0/l94rOv/vKMdQEOy/k8/1PQ/banHf8VahlfSlQwGOA0InK74z3Oi9D/nftF/1t38/+LmW/2fdrDhf9Jit//ytQzPJSsZtEiKBe1mxq/xC53/y1czPAFqVic5GoFO/ipXzfxftJJBkeyUKFzOwDm48wIAh5XH+g7drOwAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/images/bullet_go.png,importbuddy/images/bullet_go.png
###PACKDATA,FILE_START,/images/favicon.png,importbuddy/images/favicon.png
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACFdJREFUeNrkl21sleUZx3/383JeaE9L29Pa8iZ9se0E0SHoBDUUt+gkQxd0aqImW5aZuUzNsky36cZcBl+2D3OLLhr1wxKikQwN4CYdbBYNQoeg0hSspOXQck4tbc9L29Nz7ue+r304BwaCxg8mftidXHmS50nu+3dd93X9r+tRIsKXuRy+5PWlA3gHDhxARPA8j3g8TnV1NVVVVVgR1PQ0JpPBra5m6t1DhJsX1+R27Vo129fXWBwYCIVaWsLF48cDt7o68NvaZipvvLHfrYz1KtfBjcVQCxZgfZ+Q75PP5/F9n0KhwODgIFprlFJ4n0WnfB+3sjJeHBpaP/32W3ePP/N0hz09vojCLG4oRNDfjxuJYsfGmBkeJv+fgzNe4yWJ2E039UQvv3xLqLLyTRsEnx2Bi5+scB2nenZ4+JGxF164d7qnp410GtdxcJXCiUZpePJJIkuXAlAcGGD0sccIhhNzCsMnO6cPHOj0Wlp+MHfDhn9V33nnn5yKim2fG0CUwlHq66Nbt/7h46eeWmaTpwhFo7jhMK4CZ7aIN38B4dWrccPh0iZ1dah583AnJlCREFhBf/QRyU2butK793Qt+tUTf3VaWx9F6+SnJqGIoByHaCz22Knnn3998Bc/X6ZHR3Gjc1AolDEoY1EmoIBQPKd6rbUYgCBAjEVZixPyccJhMm/tpf+BB+4z/f3/9MPhlZ8se0cphYhgRaifP/93Ey+/vHngyd/6EhhsoUiQzZYsk0Gn0xTHx4nMm0ckFDq7Sdj38S9dzOzpcYLJNEE6U7JsDkSYPnqUvgcfvLyYSOzwIpFrrbUopUrW09NDJBKho7PzAWdk5C/7N9yByqSpbGigvmstflUML1ZJqC4OIvj1DUSXfxWvqek8T8zYGPlDh9BjY9hiEWsMs6lRdDbLx3t2kzkxRP3627jqueeGPjp+fM3kxMQJEYHdu3fz3gcfdIpI+uDDD8trNTWyq6FBUq+8Il/UOvXSS/J6bY281tQkqV27RES27ty5U7344os4+XyeS1taHi+MjlYPv/EG4ji49fXE16z5wsSmYe1avMYmZtNphl57FWBDY1PTN+bNm4fX3Nz8lao5c24f3bePqWSSynCY7GyBd/7+D2oWL+bCKoFLlyylsmbuee+nJic50deHKufYuak2fuxD0tkcbjjM2LuHCaam6Fyy5KF9e/fu8rTW6xRUJN9/n8BYAsDJZuj97vcomAAXVZKG8mZFLEt++CPWP/3n8wD+vfE3HHnqj/g4+I4i4jhYAQO4rsMl1VUEIZ/JE0Pkx8eJLlp0fVVV1WKvpqZmBcBYIoHWmqIJEXEcOupq8ABXKVQZQAE6l8MdGb4gMnNOnGDFnCh+rKqsZQojQoCgBWasJbBCvjBNoDWeUtVLly692ovFYs0AudkC2hq0tSixiFK4gKdUSQfK9auDgJjnXtjVXIcZYwmCAJTCIhjAiqABLRAg5ApF8vlZaoDDhw/P90SkAsDGKpk2hpA1JV+VwkUwSuEASkApCKzFXmSGMFYoGoNYiyAICoNgbBkAwQhkxWLKDuRyuUpvenp6pra2lrrOTg5YS8xaLGBR+ICrQFGGALQxWKUuALCKEoAxiKJ0/yIEQCCgFRQKBfQljVTW1gIwMzMz46RSqQRA5/U3kI5ESReKaGspWEPBWgrGUDxj1hAAmfEJ8oViGRQKgWEqk0FTikLB2PKzZEVrMNYwVCxSt/xq5tbXEwQBSqmUNzQ0dHjlypUb5l3WRuet6+j721aWOQ6eAiPglqPgUEpGLxImtf8Az6y+nlhtLQJMT0wS7j9CLByhUI6gQbBl70VBRhtOAXfdfx/KcchMTuYSicRhb3Bw8PXx8fFf1tXVRe544nHe697F0VyWtnAIT8qHC7hlAK0UYQlwDvaiy+GPAH4oRN5RWBGsFUQpAgQBckY4ojXL132LlbffBkBfX19vMpk86l5zzTVJpdS17e3tHXMbG6mqjfPmju3MGENUlbLfihCIYBECsQQi4LrgOOA6iOuikdJdi6BFMCJosYxb4WgQ0HRZO4+8/BIVc+cyNTXF9u3bf6q17ne7urpIpVLHFy1adG9NTY3fsuJqouEI+3fvYdxaRM4kIoiU7twIBOckWCClw40IRkqtOQuMGMugWBa2d/CzbdtovKwNgO7u7j3Hjh37te/7xu3q6kJrPTIyMkJnZ+faSCRCxw3Xs6C9naP73yGRzZKRUv8PynlhylJrKdW7BorAlEAGSFrLSRGywNe+eSsPbdlCU0c7AAcPHpzcs2fPXZ7nJZVSuGvWrMF1XbLZ7NsnT55c0NraujwajbLwiitYfed3cEU4nUgwnMsxKUJGhLQIk2WbEOF02UYRRsuR6Vixkvs3beaezZuorKuDkvDM7Nix4x5r7duOU5qF1MaNG8/WcrFYDDU0NPx+3bp1P25razv7fmJkhN5tr3J0bw8f7ttP9vQYpqgJjEah8PwQoUiYxtY22m9YzVW33MJVN9+MckuCEwQBPT09qZ6enu9ba3e67v+U9DwAAK01oVDovuuuu27zqlWr5ldUVJz3PZ/LMTY4SDqZIjs2RigSIdZQT3zhQmrmz8c7Z1ICGB4epru7u3tgYOAnvu8fOeP5pwKcmfGCIGiNx+OPXnnlld9etmxZPB6Pf+7+HwQBiUSC3t7e9wcGBp6dnZ191vd9fdEB/GIAZ/XdGLTWrdXV1Xc3NjauX7hwYUtzc3M8FovheR6+75+BRWtNKpUKBgcHR5LJ5OFUKrUlCIKdnudNf9Lrzw1wLogxBqVUq+M4y4GGSCRSF41G640xs/l8/rTWOiMix6y1h5RSac/zUBfpGRcA/N//Hf93AHiGrdXcwqWjAAAAAElFTkSuQmCC
###PACKDATA,FILE_END,/images/favicon.png,importbuddy/images/favicon.png
###PACKDATA,FILE_START,/images/sort_down.png,importbuddy/images/sort_down.png
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHBJREFUeNqMkD0OABEQRmcmVChIqN3/WBJHoLVYxK7GK4TvZwIMIcANrC0xxpJSOkzOOXjvASvUBOdcOxzBoXeDRhO11p+QlBKEEKtNc2OMAcbYKxL1aTsrWE201u4lPB4zUUphzrn8r9HA2+95BBgA3YASwqCieowAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/images/sort_down.png,importbuddy/images/sort_down.png
###PACKDATA,FILE_START,/images/icon_menu_32x32.png,importbuddy/images/icon_menu_32x32.png
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAABtNJREFUeNrsl39sVeUZxz/ve85pL9iWUmxHKdCCLrK6pZAZsWQQfiwWxcAYGT+WuWyJcygz/jGW4bKYGHEi8Q9nwhK2JTOybBQWt5g5QJNFMRFRQKqGoUDpLVDoD25vb2/Lveec93n2x72ttLBh/Id/fJM359z3nPN+v+/3eZ/n/V6jqtzMZrnJ7UsC/p9bW6/74Gvbt2MNGMAag6FwjzLLGHN3MGfO1621FkBEJDp58piqvgdcUGNo27z58xH4Xw+cCGrAKJStWPFonEw+5DqTd0p2qMQA0YkTABhjUFWUAkNTMSkXzJ7dtqCjY+c7DQ1/uhEBs2v37msGH1y/np6LF8uG33jjqYFXXtkYtbdPNBg8AygMO8e81w+QmDYNgHhwkPeaF1Dm+yggxQVMmNs0OGnNmh2l8+c/U1NbmwUYj3ddBVI9Pau7d+x4qW/P3grPgGcsRhWsRVU5mxmkuQgO4JeX0+P5JJxDVRFV1BgGjhwtTx/7YMvURzb+NNXT83BVTc3f/m8IWhYtKikpKXm5fevWdanXXsMD1FpEY6wxOAcOZc76tdeQnv29NQzu2oVnDBhDLIIag4sjki/+dnKuv39vuq+vNQzDHx44eDC8JgT3LlxYVVpa+veuvXsXnX7uOVSVu3buJJg0iep77vlCOzzKZOg7dIgjGzcCcOf27UxZuvRgPp9f/frbb6fGpKHv+3skl1v08fPPMxxFVK5axbSWli8MDhBUVFDb0oLMncuVOKJt61YMLPJ9f8+YENy3ePGWIAiWnWltJT+UxYnyn6PHGHjqaa5XqGc0NTHvOyvHjH3wj1c519ZGMRlGvzPA2VNnmBxG5Hu6ufTWW9QuXrzsvsWLt+x7881tpquzc2oikegMgiD459p15I8fQ1RJi5JWJS+CBTxjsCgO+MrdzTx2YN8YAi+2LKfn8Luj4FLsgTVMtpbJxmKNoer++1nywgtEURTlcrmZvog87nleANDX2Ulp7DDGMBGlVBU8D6taKEpqiExh0vFtgrVM8yyBfkbAGUAUXxSxSuwclz79FADP8wIRedwX2GBMYcJsmMcTKQIaAsAXwahiixUxJ4U0u6amqzJRlNKiAk4VMaZwBaIoQo0h79xoARPY4Jf4ft0IAZlaS763Fx/wDCiFCaw1eArGQCzKcCrFcDrNxMpKAIbTabKpFBOdK4TAGJzIaBjEGGIUJxDUN4wSKPH9Ot96nq+qGGNoWLiQj48e5VbP4hmwWli1rwYHGFUiYOCjD/n5rTXEV+3k2sAnKLBGriKvQFxUods5lixcCICqYj3PN+eTSS0vK8NaS6anh199o4nbEBLGFGQHbJGMMWAwDKuSBaIicQ+lDJiAKSoAMo7IENBdXsFvPvqQIJFARBjMZrEDmUwoIgBU1NTw7cd+xqkwZlAcsSqxKqETQhFCJ0QieCKUqVCpyiQRylXxR94VIRIlUiUSJXSOfudoz8esevJJgkSC4gnKQCYT2svpdHtcrOEAK5/YwrzvrqY9Ei7FjpxzhCpEKkRFgFgEdQJS6CpC7ITQOUIR8sVrzjkuOqEjFpZseoRvPfiDUflj57icTrd7yx94IFEzZcq9QRBgrcVayzdXrSTMh7Qdepe0gtNCKBTFqeLMSJ6bQrqpEpvC7xglB/SJ0iVwxfNZv+1ZVvxi82fgcUw2m+XkmTPbzK7du8uqq6ouzm1sLCstLcXzPEay4uzRY7Ru+SXtR44BkAAmoASABwTFehcWieQx5DDkUQyGxmVLWfvM09TecccouHOOfD7P8RMnsr2pVO3IYbTuq/X1uxtmzGA8CYD299/nnb/8leP/2kemp6e41QqKFMqtGb2vmj6du1atpPn7G6hrbByd42rwjnPnOJVMrgdaR09Da+0fbps586H6ujpKSkrwfZ+i4xrTetvP0vXJJwx0d48ZnzJjOnWNjVTW1l7zjYgQxzFhGJK8cIEznZ1/FJGfjPEDIrLpVEeHH4bhjxqmTyeRSOD7/qgaI4pUz55F9exZNzwJVbVgTpwjimNyuRwd58+T7Op6Cdh0PUMSAj9OdnVd6Ovvf+L2+npbVVlJEAR4njeGyNWExgOOdOcczjmiKCKVTnM6mZShK1eeBX59Q08IzAV+V1lR0VxbXU11VdWoGnaEyPgVF0lIETiOY3pTKS729pLOZA4BjwLHP68rPj6/qWnB4ba25elM5uHTyeTKivJyr+KWW6goK2NiMTwjKqgqLo4ZyuXIZLNkhobIDA66KI5fBX4P7L+hLdcR339Vm9/UtB/Yf7itrfpyf//Sy/39zUAzcDtQNd7LAqeBQ8X+b6D3hrb8yz+nN5vAfwcArs2hchpwFZgAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/images/icon_menu_32x32.png,importbuddy/images/icon_menu_32x32.png
###PACKDATA,FILE_START,/lib/dbreplace/dbreplace.php,importbuddy/lib/dbreplace/dbreplace.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X2RicmVwbGFjZSBDbGFzcwogKgogKglIYW5kbGVzIHJlcGxhY2VtZW50IG9mIGRhdGEgaW4gYSB0YWJsZS9kYXRhYmFzZSwgdGV4dCBvciBzZXJpYWxpemVkLiBBIGRhdGFiYXNlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGluaXRpYWxpemVkIGJlZm9yZSBpbnN0YW50aWF0aW9uLgogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOiBEdXN0aW4gQm9sdG9uCiAqCUF1dGhvciBVUkk6IGh0dHA6Ly9kdXN0aW5ib2x0b24uY29tLwogKgogKglAcGFyYW0JCSRzdGF0dXNfY2FsbGJhY2sJCW9iamVjdAkJT3B0aW9uYWwgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXR1cygpIGZ1bmN0aW9uIGZvciByZXBvcnRpbmcgYmFjayBpbmZvcm1hdGlvbi4KICoJQHJldHVybgkJbnVsbAogKgogKi8KaWYgKCFjbGFzc19leGlzdHMoInBsdWdpbmJ1ZGR5X2RicmVwbGFjZSIpKSB7CgljbGFzcyBwbHVnaW5idWRkeV9kYnJlcGxhY2UgewoJCXZhciAkX3ZlcnNpb24gPSAnMS4wJzsKCQkKCQl2YXIgJHN0YXJ0VGltZTsKCQl2YXIgJHRpbWVXaWdnbGVSb29tOwoJCXZhciAkbWF4RXhlY3V0aW9uVGltZTsKCQkKCQljb25zdCBNQVhfUk9XU19QRVJfU0VMRUNUID0gNTAwOwoJCQoJCQoJCS8qKgoJCSAqCV9fY29uc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGNvbnN0cnVjdG9yLiBTZXRzIHVwIG9wdGlvbmFsIHN0YXR1cygpIGZ1bmN0aW9uIGNsYXNzIGlmIGFwcGxpY2FibGUuCgkJICoJCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRzdGF0dXNfY2FsbGJhY2sJCVtvcHRpb25hbF0gUmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBjb250YWluaW5nIHRoZSBzdGF0dXMoKSBmdW5jdGlvbiBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRzdGFydFRpbWUgPSAnJywgJHRpbWVXaWdnbGVSb29tID0gMSwgJG1heEV4ZWN1dGlvblRpbWUgPSAzMCApIHsKCQkJaWYgKCAnJyA9PSAkc3RhcnRUaW1lICkgewoJCQkJJHRoaXMtPnN0YXJ0VGltZSA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPnN0YXJ0VGltZSA9ICRzdGFydFRpbWU7CgkJCX0KCQkJJHRoaXMtPnRpbWVXaWdnbGVSb29tID0gJHRpbWVXaWdnbGVSb29tOwoJCQkkdGhpcy0+bWF4RXhlY3V0aW9uVGltZSA9ICRtYXhFeGVjdXRpb25UaW1lOwoJCX0KCQkKCQkKCQkKCQkvKioKCQkgKgl0ZXh0KCkKCQkgKgkKCQkgKglSZXBsYWNlcyB0ZXh0IHdpdGhpbiBhIHRhYmxlIGJ5IHNwZWNpZnlpbmcgdGhlIHRhYmxlLCByb3dzIHRvIHJlcGxhY2Ugd2l0aGluIGFuZCB0aGUgb2xkIGFuZCBuZXcgdmFsdWUocykuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR0YWJsZQkJVGFibGUgdG8gcmVwbGFjZSB0ZXh0IGluLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRvbGRzCQlPbGQgdmFsdWUocykgdG8gZmluZCBmb3IgcmVwbGFjZW1lbnQuIE1heSBiZSBhIHN0cmluZyBvciBhcnJheSBvZiB2YWx1ZXMuCgkJICoJQHBhcmFtCQltaXhlZAkJJG5ld3MJCU5ldyB2YWx1ZShzKSB0byBiZSByZXBsYWNlZCB3aXRoLiBNYXkgYmUgYSBzdHJpbmcgb3IgYXJyYXkuIElmIGFycmF5IHRoZXJlIG11c3QgYmUgdGhlIHNhbWUgbnVtYmVyIG9mIHZhbHVlcyBhcyAkb2xkcy4KCQkgKglAcGFyYW0JCW1peGVkCQkkcm93cwkJVGFibGUgcm93KHMpIHRvIHJlcGxhY2Ugd2l0aGluLiBNYXkgYmUgYW4gYXJyYXkgb2YgdGFibGVzLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiB0ZXh0KCAkdGFibGUsICRvbGRzLCAkbmV3cywgJHJvd3MgKSB7CgkJCSRyb3dzX3NxbCA9IGFycmF5KCk7CgkJCQoJCQlpZiAoICFpc19hcnJheSggJG9sZHMgKSApIHsKCQkJCSRvbGRzID0gYXJyYXkoICRvbGRzICk7CgkJCX0KCQkJaWYgKCAhaXNfYXJyYXkoICRuZXdzICkgKSB7CgkJCQkkbmV3cyA9IGFycmF5KCAkbmV3cyApOwoJCQl9CgkJCWlmICggIWlzX2FycmF5KCAkcm93cyApICkgewoJCQkJJHJvd3MgPSBhcnJheSggJHJvd3MgKTsKCQkJfQoJCQkKCQkJLy8gUHJldmVudCB0cnlpbmcgdG8gcmVwbGFjZSBkYXRhIHdpdGggdGhlIHNhbWUgZGF0YSBmb3IgcGVyZm9ybWFuY2UuCgkJCSR0aGlzLT5yZW1vdmVfbWF0Y2hpbmdfYXJyYXlfZWxlbWVudHMoICRvbGRzLCAkbmV3cyApOwoJCQkKCQkJZm9yZWFjaCAoICRyb3dzIGFzICRyb3cgKSB7CgkJCQkkaSA9IDA7CgkJCQlmb3JlYWNoICggJG9sZHMgYXMgJG9sZCApIHsKCQkJCQkkcm93c19zcWxbXSA9ICRyb3cgLiAiID0gcmVwbGFjZSggeyRyb3d9LCAneyRvbGR9JywgJ3skbmV3c1skaV19JykiOwoJCQkJCSRpKys7CgkJCQl9CgkJCX0KCQkJCgkJCWdsb2JhbCAkd3BkYjsKCQkJJHdwZGItPnF1ZXJ5KCAiVVBEQVRFIGB7JHRhYmxlfWAgU0VUICIgLiBpbXBsb2RlKCAnLCcsICRyb3dzX3NxbCApIC4gIjsiICk7CgkJCQoJCQlyZXR1cm4gdHJ1ZTsKCQkJCgkJfSAvLyBFbmQgdGV4dCgpLgoJCQoJCQoJCS8qKgoJCSAqCXNlcmlhbGl6ZWQoKQoJCSAqCQoJCSAqCVJlcGxhY2VzIHNlcmlhbGl6ZWQgdGV4dCB3aXRoaW4gYSB0YWJsZSBieSBzcGVjaWZ5aW5nIHRoZSB0YWJsZSwgcm93cyB0byByZXBsYWNlIHdpdGhpbiBhbmQgdGhlIG9sZCBhbmQgbmV3IHZhbHVlKHMpLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFibGUJCVRhYmxlIHRvIHJlcGxhY2UgdGV4dCBpbi4KCQkgKglAcGFyYW0JCW1peGVkCQkkb2xkcwkJT2xkIHZhbHVlKHMpIHRvIGZpbmQgZm9yIHJlcGxhY2VtZW50LiBNYXkgYmUgYSBzdHJpbmcgb3IgYXJyYXkgb2YgdmFsdWVzLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRuZXdzCQlOZXcgdmFsdWUocykgdG8gYmUgcmVwbGFjZWQgd2l0aC4gTWF5IGJlIGEgc3RyaW5nIG9yIGFycmF5LiBJZiBhcnJheSB0aGVyZSBtdXN0IGJlIHRoZSBzYW1lIG51bWJlciBvZiB2YWx1ZXMgYXMgJG9sZHMuCgkJICoJQHBhcmFtCQltaXhlZAkJJHJvd3MJCVRhYmxlIHJvdyhzKSB0byByZXBsYWNlIHdpdGhpbi4gTWF5IGJlIGFuIGFycmF5IG9mIHRhYmxlcy4KCQkgKglAcGFyYW0JCWludAkJCSRyb3dzX3N0YXJ0CVJvdyB0byBzdGFydCBhdC4gVXNlZCBmb3IgcmVzdW1pbmcuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNlcmlhbGl6ZWQoICR0YWJsZSwgJG9sZHMsICRuZXdzLCAkcm93cywgJHJvd3Nfc3RhcnQgPSAnJyApIHsKCQkJaWYgKCAhaXNfYXJyYXkoICRvbGRzICkgKSB7CgkJCQkkb2xkcyA9IGFycmF5KCAkb2xkcyApOwoJCQl9CgkJCWlmICggIWlzX2FycmF5KCAkbmV3cyApICkgewoJCQkJJG5ld3MgPSBhcnJheSggJG5ld3MgKTsKCQkJfQoJCQlpZiAoICFpc19hcnJheSggJHJvd3MgKSApIHsKCQkJCSRyb3dzID0gYXJyYXkoICRyb3dzICk7CgkJCX0KCQkJCgkJCWdsb2JhbCAkd3BkYjsKCQkJCgkJCS8vIEdldCB0aGUgdG90YWwgcm93IGNvdW50IGZvciB0aGlzIHRhYmxlCgkJCSR0b3RhbF9yb3dzID0gMDsKCQkJJHRhYmxlc19zdGF0dXMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIFRBQkxFIFNUQVRVUyIsIEFSUkFZX0EgKTsKCQkJCgkJCWZvcmVhY2ggKCAkdGFibGVzX3N0YXR1cyBhcyAkdGFibGVfc3RhdHVzICkgewoJCQkKCQkJCWlmICggJHRhYmxlID09PSAkdGFibGVfc3RhdHVzWyAnTmFtZScgXSApIHsKCQkJCQoJCQkJCS8vIEZpeCB1cCByb3cgY291bnQgYW5kIGF2ZXJhZ2Ugcm93IGxlbmd0aCBmb3IgSW5ub0RCIGVuZ2luZSB3aGljaCByZXR1cm5zIGluYWNjdXJhdGUKCQkJCQkvLyAoYW5kIGNoYW5naW5nKSB2YWx1ZXMgZm9yIHRoZXNlCgkJCQkJaWYgKCAnSW5ub0RCJyA9PT0gJHRhYmxlX3N0YXR1c1sgJ0VuZ2luZScgXSApIHsKCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkY291bnQgPSAkd3BkYi0+Z2V0X3ZhciggIlNFTEVDVCBDT1VOVCgxKSBGUk9NIGB7JHRhYmxlX3N0YXR1c1snTmFtZSddfWAiICkgKSApIHsKCQkJCQkJCSR0YWJsZV9zdGF0dXNbICdSb3dzJyBdID0gJGNvdW50OwoJCQkJCQl9CgkJCQkJfQoJCQkKCQkJCQkkdG90YWxfcm93cyA9ICR0YWJsZV9zdGF0dXNbICdSb3dzJyBdOwoJCQkJCgkJCQl9CgkJCQoJCQl9CgkJCQoJCQkvLyBQcmV2ZW50IHRyeWluZyB0byByZXBsYWNlIGRhdGEgd2l0aCB0aGUgc2FtZSBkYXRhIGZvciBwZXJmb3JtYW5jZS4KCQkJJHRoaXMtPnJlbW92ZV9tYXRjaGluZ19hcnJheV9lbGVtZW50cyggJG9sZHMsICRuZXdzICk7CgkJCSRrZXlfcmVzdWx0cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggInNob3cga2V5cyBmcm9tIHskdGFibGV9IFdIRVJFIEtleV9uYW1lPSdQUklNQVJZJzsiLCBBUlJBWV9BICk7CgkJCWlmICggJGtleV9yZXN1bHRzID09PSBmYWxzZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RhYmxlIGAnIC4gJHRhYmxlIC4gJ2AgZG9lcyBub3QgZXhpc3Q7IHNraXBwaW5nIG1pZ3JhdGlvbiBvZiB0aGlzIHRhYmxlLicgKTsKCQkJCXJldHVybjsKCQkJfQoJCQkKCQkJLy8gTm8gcHJpbWFyeSBrZXkgZm91bmQ7IHVuc2FmZSB0byBlZGl0IHRoaXMgdGFibGUuIEBzaW5jZSAyLjIuMzIuCgkJCWlmICggY291bnQoICRrZXlfcmVzdWx0cyApID09IDAgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdFcnJvciAjOTAyOTogV2FybmluZyBvbmx5ISBUYWJsZSBgJy4gICR0YWJsZSAuJ2AgZG9lcyBub3QgY29udGFpbiBhIHByaW1hcnkga2V5OyBCYWNrdXBCdWRkeSBjYW5ub3Qgc2FmZWx5IG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhpcyB0YWJsZS4gU2tpcHBpbmcgbWlncmF0aW9uIG9mIHRoaXMgdGFibGUuIChzZXJpYWxpemVkKCkpLicgKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCQoJCQkkcHJpbWFyeV9rZXkgPSAka2V5X3Jlc3VsdHNbMF1bJ0NvbHVtbl9uYW1lJ107CgkJCXVuc2V0KCAka2V5X3Jlc3VsdCApOwoJCQkKCQkJJHVwZGF0ZWQgPSBmYWxzZTsgLy8gV2FzIHNvbWV0aGluZyBpbiBEQiB1cGRhdGVkPwoJCQkkcm93c19yZW1haW4gPSB0cnVlOyAvLyBNb3JlIHJvd3MgcmVtYWluaW5nIC8gYWthIGFub3RoZXIgcXVlcnkgZm9yIG1vcmUgcm93cyBuZWVkZWQuCgkJCWlmICggJycgPT0gJHJvd3Nfc3RhcnQgKSB7CgkJCQkkcm93c19zdGFydCA9IDA7CgkJCX0KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRmluZGluZyByb3dzIGluIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AgdG8gdXBkYXRlLicgKTsKCQkJd2hpbGUgKCB0cnVlID09PSAkcm93c19yZW1haW4gKSB7IC8vIEtlZXAgbG9vcGluZyB0aHJvdWdoIHJvd3MgdW50aWwgbm9uZSByZW1haW4uIExvb3BpbmcgdGhyb3VnaCBsaWtlIHRoaXMgdG8gbGltaXQgbWVtb3J5IHVzYWdlIGFzIHdwZGIgY2xhc3NlcyBsb2FkcyBhbGwgcmVzdWx0cyBpbnRvIG1lbW9yeS4KCQkJCSRyb3dzUmVzdWx0ID0gJHdwZGItPmdldF9yZXN1bHRzKCAiU0VMRUNUIGAiIC4gaW1wbG9kZSggJ2AsYCcsICRyb3dzICkgLiAiYCxgeyRwcmltYXJ5X2tleX1gIEZST00gYHskdGFibGV9YCBMSU1JVCAiIC4gJHJvd3Nfc3RhcnQgLiAnLCcgLiBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNUICk7CgkJCQkkcm93c0NvdW50ID0gY291bnQoICRyb3dzUmVzdWx0ICk7CgoJCQkJLy8gUHJvdmlkZSBhbiB1cGRhdGUgb24gcHJvZ3Jlc3MKCQkJCWlmICggMCA9PT0gJHJvd3NDb3VudCApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUYWJsZTogYCcuICR0YWJsZSAuICdgIC0gcHJvY2Vzc2luZyAnIC4gJHJvd3NDb3VudCAuICcgcm93cyAoIG9mICcgLiAkdG90YWxfcm93cyAuICcgKScgKTsJCQkJCgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RhYmxlOiBgJy4gJHRhYmxlIC4gJ2AgLSBwcm9jZXNzaW5nICcgLiAkcm93c0NvdW50IC4gJyByb3dzICggUm93cyAnIC4gJHJvd3Nfc3RhcnQgLiAnLScgLiAoICRyb3dzX3N0YXJ0ICsgJHJvd3NDb3VudCAtIDEgKSAuICcgb2YgJyAuICR0b3RhbF9yb3dzIC4gJyApJyApOwkKCQkJCX0KCQkJCQoJCQkJJHJvd3Nfc3RhcnQgKz0gc2VsZjo6TUFYX1JPV1NfUEVSX1NFTEVDVDsgLy8gTmV4dCBsb29wIHdlIHdpbGwgYmVnaW4gYXQgdGhpcyBvZmZzZXQuCgkJCQlpZiAoICggMCA9PSAkcm93c0NvdW50ICkgfHwgKCAkcm93c0NvdW50IDwgc2VsZjo6TUFYX1JPV1NfUEVSX1NFTEVDVCApICkgewoJCQkJCSRyb3dzX3JlbWFpbiA9IGZhbHNlOwoJCQkJfQoJCQkJCgkJCQlmb3JlYWNoKCAkcm93c1Jlc3VsdCBhcyAkcm93ICkgewoJCQkJCSRuZWVkc191cGRhdGUgPSBmYWxzZTsKCQkJCQkkc3FsX3VwZGF0ZSA9IGFycmF5KCk7CgkJCQkJCgkJCQkJZm9yZWFjaCggJHJvdyBhcyAkY29sdW1uID0+ICR2YWx1ZSApIHsKCQkJCQkJaWYgKCAkY29sdW1uICE9ICRwcmltYXJ5X2tleSApIHsKCQkJCQkJCWlmICggZmFsc2UgIT09ICggJGVkaXRlZF9kYXRhID0gJHRoaXMtPnJlcGxhY2VfbWF5YmVfc2VyaWFsaXplZCggJHZhbHVlLCAkb2xkcywgJG5ld3MgKSApICkgeyAvLyBEYXRhIGNoYW5nZWQuCgkJCQkJCQkJJG5lZWRzX3VwZGF0ZSA9IHRydWU7CgkJCQkJCQkJJHNxbF91cGRhdGVbXSA9ICRjb2x1bW4gLiAiPSAnIiAuIG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyggJGVkaXRlZF9kYXRhICkgLiAiJyI7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkcHJpbWFyeV9rZXlfdmFsdWUgPSAkdmFsdWU7CgkJCQkJCX0KCQkJCQl9CgkJCQkJCgkJCQkJaWYgKCAkbmVlZHNfdXBkYXRlID09PSB0cnVlICkgewoJCQkJCQkkdXBkYXRlZCA9IHRydWU7CgkJCQkJCSR3cGRiLT5xdWVyeSggIlVQREFURSBgeyR0YWJsZX1gIFNFVCAiIC4gaW1wbG9kZSggJywnLCAkc3FsX3VwZGF0ZSApIC4gIiBXSEVSRSBgeyRwcmltYXJ5X2tleX1gID0gJ3skcHJpbWFyeV9rZXlfdmFsdWV9JyBMSU1JVCAxIiApOwoJCQkJCX0KCQkJCX0KCQkJCXVuc2V0KCAkcm93c1Jlc3VsdCApOwoJCQkJCgkJCQkvLyBTZWUgaG93IHdlIGFyZSBkb2luZyBvbiB0aW1lLiBUcmlnZ2VyIGNodW5raW5nIGlmIG5lZWRlZC4KCQkJCWlmICggKCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnN0YXJ0VGltZSApICsgJHRoaXMtPnRpbWVXaWdnbGVSb29tICkgPj0gJHRoaXMtPm1heEV4ZWN1dGlvblRpbWUgKSB7CgkJCQkJcmV0dXJuIGFycmF5KCAkcm93c19zdGFydCApOwoJCQkJfQoJCQl9CgkJCQoJCQlpZiAoICR1cGRhdGVkID09PSB0cnVlICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXBkYXRlZCBzZXJpYWxpemVkIGRhdGEgaW4gdGFibGUgYCcgLiAkdGFibGUgLiAnYC4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdOb3RoaW5nIGZvdW5kIHRvIHVwZGF0ZSBpbiB0YWJsZSBgJyAuICR0YWJsZSAuICdgLicgKTsKCQkJfQoJCQlyZXR1cm4gdHJ1ZTsKCQl9IC8vIEVuZCBzZXJpYWxpemVkKCkuCgkJCgkJCgkJLyoqCgkJICoJcmVwbGFjZV9tYXliZV9zZXJpYWxpemVkKCkKCQkgKgkKCQkgKglSZXBsYWNlcyBwb3NzaWJseSBzZXJpYWxpemVkIChvciBub24tc2VyaWFsaXplZCkgdGV4dCBpZiBhIGNoYW5nZSBpcyBuZWVkZWQuIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgd2FzIG5vIGNoYW5nZS4KCQkgKiAgTm90ZTogQXMgb2YgQkIgdjMuMi54IHN1cHBvcnRzIGRvdWJsZSBzZXJpYWxpemVkIGRhdGEuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR0YWJsZQkJVGV4dCAocG9zc2libHkgc2VyaWFsaXplZCkgdG8gdXBkYXRlLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRvbGRzCQlUZXh0IHRvIHNlYXJjaCBmb3IgdG8gcmVwbGFjZS4gTWF5IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gc2VhcmNoIGZvci4KCQkgKglAcGFyYW0JCW1peGVkCQkkbmV3cwkJTmV3IHZhbHVlKHMpIHRvIGJlIHJlcGxhY2VkIHdpdGguIE1heSBiZSBhIHN0cmluZyBvciBhcnJheS4gSWYgYXJyYXkgdGhlcmUgbXVzdCBiZSB0aGUgc2FtZSBudW1iZXIgb2YgdmFsdWVzIGFzICRvbGRzLgoJCSAqCUByZXR1cm4JCW1peGVkCQkJCQlSZXR1cm5zIG1vZGlmaWVkIHN0cmluZyBkYXRhIGlmIHNlcmlhbGl6ZWQgZGF0YSB3YXMgcmVwbGFjZWQuIEZhbHNlIGlmIG5vIGNoYW5nZSB3YXMgbWFkZS4KCQkgKgoJCSAqLwoJCWZ1bmN0aW9uIHJlcGxhY2VfbWF5YmVfc2VyaWFsaXplZCggJGRhdGEsICRvbGRzLCAkbmV3cyApIHsKCQkJaWYgKCAhaXNfYXJyYXkoICRvbGRzICkgKSB7CgkJCQkkb2xkcyA9IGFycmF5KCAkb2xkcyApOwoJCQl9CgkJCWlmICggIWlzX2FycmF5KCAkbmV3cyApICkgewoJCQkJJG5ld3MgPSBhcnJheSggJG5ld3MgKTsKCQkJfQoJCQkKCQkJJHR5cGUgPSAnJzsKCQkJJHVuc2VyaWFsaXplZCA9IGZhbHNlOyAvLyBmaXJzdCBhc3N1bWUgbm90IHNlcmlhbGl6ZWQgZGF0YQoJCQlpZiAoIGlzX3NlcmlhbGl6ZWQoICRkYXRhICkgKSB7IC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VyaWFsaXplZCBkYXRhCgkJCQkkdW5zZXJpYWxpemVkID0gQHVuc2VyaWFsaXplKCAkZGF0YSApOyAvLyB1bnNlcmlhbGlzZSAtIGlmIGZhbHNlIGlzIHJldHVybmVkIHdlIHdvbid0IHRyeSB0byBwcm9jZXNzIGl0IGFzIHNlcmlhbGlzZWQuCgkJCX0KCQkJaWYgKCAkdW5zZXJpYWxpemVkICE9PSBmYWxzZSApIHsgLy8gU2VyaWFsaXplZCBkYXRhLgoJCQkJJHR5cGUgPSAnc2VyaWFsaXplZCc7CgkJCQkKCQkJCSRkb3VibGVfc2VyaWFsaXplZCA9IGZhbHNlOwoJCQkJaWYgKCBpc19zZXJpYWxpemVkKCAkdW5zZXJpYWxpemVkICkgKSB7IC8vIGRvdWJsZS1zZXJpYWxpemVkIGRhdGEgKG9wcG9zaXRlIG9mIGEgZG91YmxlIHJhaW5ib3cpLiBTb21lIHBsdWdpbnMgc2VlbSB0byBkb3VibGUtc2VyaWFsaXplIGZvciBzb21lIHVua25vd24gd2Fja3kgcmVhc29uLi4uCgkJCQkJJHVuc2VyaWFsaXplZCA9IEB1bnNlcmlhbGl6ZSggJHVuc2VyaWFsaXplZCApOyAvLyB1bnNlcmlhbGlzZSAtIGlmIGZhbHNlIGlzIHJldHVybmVkIHdlIHdvbid0IHRyeSB0byBwcm9jZXNzIGl0IGFzIHNlcmlhbGlzZWQuCgkJCQkJJGRvdWJsZV9zZXJpYWxpemVkID0gdHJ1ZTsKCQkJCX0KCQkJCQoJCQkJJGkgPSAwOwoJCQkJZm9yZWFjaCAoICRvbGRzIGFzICRvbGQgKSB7CgkJCQkJJHRoaXMtPnJlY3Vyc2l2ZV9hcnJheV9yZXBsYWNlKCAkb2xkLCAkbmV3c1skaV0sICR1bnNlcmlhbGl6ZWQgKTsKCQkJCQkkaSsrOwoJCQkJfQoJCQkJCgkJCQkkZWRpdGVkX2RhdGEgPSBzZXJpYWxpemUoICR1bnNlcmlhbGl6ZWQgKTsKCQkJCWlmICggdHJ1ZSA9PT0gJGRvdWJsZV9zZXJpYWxpemVkICkgewoJCQkJCSRlZGl0ZWRfZGF0YSA9IHNlcmlhbGl6ZSggJGVkaXRlZF9kYXRhICk7CgkJCQl9CgkJCQkKCQkJfQllbHNlIHsgLy8gTm9uLXNlcmlhbGl6ZWQgZGF0YS4KCQkJCSR0eXBlID0gJ3RleHQnOwoJCQkJJGVkaXRlZF9kYXRhID0gJGRhdGE7CgkJCQkkaSA9IDA7CgkJCQlmb3JlYWNoICggJG9sZHMgYXMgJG9sZCApIHsKCQkJCQkkZWRpdGVkX2RhdGEgPXN0cl9pcmVwbGFjZSggJG9sZCwgJG5ld3NbJGldLCAkZWRpdGVkX2RhdGEgKTsKCQkJCQkkaSsrOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBSZXR1cm4gdGhlIHJlc3VsdHMuCgkJCWlmICggJGRhdGEgIT0gJGVkaXRlZF9kYXRhICkgewoJCQkJcmV0dXJuICRlZGl0ZWRfZGF0YTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gLy8gRW5kIHJlcGxhY2VfbWF5YmVfc2VyaWFsaXplZCgpLgoJCQoJCQoJCS8qKgoJCSAqCWJydXRlZm9yY2VfdGFibGUoKQoJCSAqCgkJICoJISEhIEhBTkRMRVMgU0VSSUFMSVpFRCBEQVRBICEhISEKCQkgKglSZXBsYWNlcyB0ZXh0LCBzZXJpYWxpemVkIG9yIG5vdCwgd2l0aGluIHRoZSBlbnRpcmUgdGFibGUuIEJydXRlZm9yY2UgbWV0aG9kIGl0ZXJhdGVzIHRocm91Z2ggZXZlcnkgcm93ICYgY29sdW1uIGluIHRoZSBlbnRpcmUgdGFibGUgYW5kIHJlcGxhY2VzIGlmIG5lZWRlZC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHRhYmxlCQlUZXh0IChwb3NzaWJseSBzZXJpYWxpemVkKSB0byB1cGRhdGUuCgkJICoJQHBhcmFtCQltaXhlZAkJJG9sZHMJCVRleHQgdG8gc2VhcmNoIGZvciB0byByZXBsYWNlLiBNYXkgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBzZWFyY2ggZm9yLgoJCSAqCUBwYXJhbQkJbWl4ZWQJCSRuZXdzCQlOZXcgdmFsdWUocykgdG8gYmUgcmVwbGFjZWQgd2l0aC4gTWF5IGJlIGEgc3RyaW5nIG9yIGFycmF5LiBJZiBhcnJheSB0aGVyZSBtdXN0IGJlIHRoZSBzYW1lIG51bWJlciBvZiB2YWx1ZXMgYXMgJG9sZHMuCgkJICoJQHJldHVybgkJaW50CQkJCQkJTnVtYmVyIG9mIHJvd3MgY2hhbmdlZC4KCQkgKgoJCSAqLwoJCWZ1bmN0aW9uIGJydXRlZm9yY2VfdGFibGUoICR0YWJsZSwgJG9sZHMsICRuZXdzLCAkcm93c19zdGFydCA9ICcnICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdTdGFydGluZyBicnV0ZSBmb3JjZSBkYXRhIG1pZ3JhdGlvbiBmb3IgdGFibGUgYCcgLiAkdGFibGUgLiAnYC4uLicgKTsKCQkJaWYgKCAhaXNfYXJyYXkoICRvbGRzICkgKSB7CgkJCQkkb2xkcyA9IGFycmF5KCAkb2xkcyApOwoJCQl9CgkJCWlmICggIWlzX2FycmF5KCAkbmV3cyApICkgewoJCQkJJG5ld3MgPSBhcnJheSggJG5ld3MgKTsKCQkJfQoJCQkKCQkJJGNvdW50X2l0ZW1zX2NoZWNrZWQgPSAwOwoJCQkkY291bnRfaXRlbXNfY2hhbmdlZCA9IDA7CgkJCQoJCQlnbG9iYWwgJHdwZGI7CgkJCQoJCQkvLyBHZXQgdGhlIHRvdGFsIHJvdyBjb3VudCBmb3IgdGhpcyB0YWJsZQoJCQkkdG90YWxfcm93cyA9IDA7CgkJCSR0YWJsZXNfc3RhdHVzID0gJHdwZGItPmdldF9yZXN1bHRzKCAiU0hPVyBUQUJMRSBTVEFUVVMiLCBBUlJBWV9BICk7CgkJCQoJCQlmb3JlYWNoICggJHRhYmxlc19zdGF0dXMgYXMgJHRhYmxlX3N0YXR1cyApIHsKCQkJCgkJCQlpZiAoICR0YWJsZSA9PT0gJHRhYmxlX3N0YXR1c1sgJ05hbWUnIF0gKSB7CgkJCQkKCQkJCQkvLyBGaXggdXAgcm93IGNvdW50IGFuZCBhdmVyYWdlIHJvdyBsZW5ndGggZm9yIElubm9EQiBlbmdpbmUgd2hpY2ggcmV0dXJucyBpbmFjY3VyYXRlCgkJCQkJLy8gKGFuZCBjaGFuZ2luZykgdmFsdWVzIGZvciB0aGVzZQoJCQkJCWlmICggJ0lubm9EQicgPT09ICR0YWJsZV9zdGF0dXNbICdFbmdpbmUnIF0gKSB7CgkJCQkJCWlmICggZmFsc2UgIT09ICggJGNvdW50ID0gJHdwZGItPmdldF92YXIoICJTRUxFQ1QgQ09VTlQoMSkgRlJPTSBgeyR0YWJsZV9zdGF0dXNbJ05hbWUnXX1gIiApICkgKSB7CgkJCQkJCQkkdGFibGVfc3RhdHVzWyAnUm93cycgXSA9ICRjb3VudDsKCQkJCQkJfQoJCQkJCX0KCQkJCgkJCQkJJHRvdGFsX3Jvd3MgPSAkdGFibGVfc3RhdHVzWyAnUm93cycgXTsKCQkJCQoJCQkJfQoJCQkKCQkJfQoJCQkKCQkJJGZpZWxkcyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIkRFU0NSSUJFIGB7JHRhYmxlfWAiLCBBUlJBWV9BICk7CgkJCSRpbmRleF9maWVsZHMgPSAnJzsgIC8vIFJlc2V0IGZpZWxkcyBmb3IgZWFjaCB0YWJsZS4KCQkJJGNvbHVtbl9uYW1lID0gJyc7CgkJCSR0YWJsZV9pbmRleCA9ICcnOwoJCQkkaSA9IDA7CgkJCQoJCQkkZm91bmRfcHJpbWFyeV9rZXkgPSBmYWxzZTsKCQkJCgkJCWZvcmVhY2goICRmaWVsZHMgYXMgJGZpZWxkICkgewoJCQkJJGNvbHVtbl9uYW1lWyRpKytdID0gJGZpZWxkWydGaWVsZCddOwoJCQkJaWYgKCAkZmllbGRbJ0tleSddID09ICdQUkknICkgewoJCQkJCSR0YWJsZV9pbmRleFskaV0gPSB0cnVlOwoJCQkJCSRmb3VuZF9wcmltYXJ5X2tleSA9IHRydWU7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIFNraXBzIG1pZ3JhdGlvbiBvZiB0aGlzIHRhYmxlIGlmIHRoZXJlIGlzIG5vIHByaW1hcnkga2V5LiBNb2RpZnlpbmcgb24gYW55IG90aGVyIGtleSBpcyBub3Qgc2FmZS4gbXlzcWwgYXV0b21hdGljYWxseSByZXR1cm5zIGEgUFJJTUFSWSBpZiBhIFVOSVFVRSBub24tcHJpbWFyeSBpcyBmb3VuZCBhY2NvcmRpbmcgdG8gaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjEvZW4vY3JlYXRlLXRhYmxlLmh0bWwgIEBzaW5jZSAyLjIuMzIuCgkJCWlmICggJGZvdW5kX3ByaW1hcnlfa2V5ID09PSBmYWxzZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ0Vycm9yICM5MDI5YjogV2FybmluZyBvbmx5ISBUYWJsZSBgJyAuICR0YWJsZSAuICdgIGRvZXMgbm90IGNvbnRhaW4gYSBwcmltYXJ5IGtleTsgQmFja3VwQnVkZHkgY2Fubm90IHNhZmVseSBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdGFibGUuIFNraXBwaW5nIG1pZ3JhdGlvbiBvZiB0aGlzIHRhYmxlLiAoYnJ1dGVmb3JjZV90YWJsZSgpKS4nICk7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQkKCQkJJHJvd19sb29wID0gMDsKCgkJCSRyb3dzX3JlbWFpbiA9IHRydWU7IC8vIE1vcmUgcm93cyByZW1haW5pbmcgLyBha2EgYW5vdGhlciBxdWVyeSBmb3IgbW9yZSByb3dzIG5lZWRlZC4KCQkJaWYgKCAnJyA9PSAkcm93c19zdGFydCApIHsKCQkJCSRyb3dzX3N0YXJ0ID0gMDsKCQkJfQoKCQkJd2hpbGUgKCB0cnVlID09PSAkcm93c19yZW1haW4gKSB7IC8vIEtlZXAgbG9vcGluZyB0aHJvdWdoIHJvd3MgdW50aWwgbm9uZSByZW1haW4uIExvb3BpbmcgdGhyb3VnaCBsaWtlIHRoaXMgdG8gbGltaXQgbWVtb3J5IHVzYWdlIGFzIHdwZGIgY2xhc3NlcyBsb2FkcyBhbGwgcmVzdWx0cyBpbnRvIG1lbW9yeS4KCgkJCQkkZGF0YSA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNFTEVDVCAqIEZST00gYHskdGFibGV9YCBMSU1JVCB7JHJvd3Nfc3RhcnR9LCIgLiBzZWxmOjpNQVhfUk9XU19QRVJfU0VMRUNULCBBUlJBWV9BICk7CgkJCQlpZiAoIGZhbHNlID09PSAkZGF0YSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRVJST1IgIzQ0NTQ1MzQzIC4uLiBTUUwgRVJST1I6ICcgLiBteXNxbF9lcnJvcigpICk7CgkJCQl9CgkJCQkKCQkJCS8vIFByb3ZpZGUgYW4gdXBkYXRlIG9uIHByb2dyZXNzCgkJCQkkcm93c0NvdW50ID0gY291bnQoICRkYXRhICk7CgkJCQlpZiAoIDAgPT09ICRyb3dzQ291bnQgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVGFibGU6IGAnLiAkdGFibGUgLiAnYCAtIHByb2Nlc3NpbmcgJyAuICRyb3dzQ291bnQgLiAnIHJvd3MgKCBvZiAnIC4gJHRvdGFsX3Jvd3MgLiAnICknICk7CQkJCQoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdUYWJsZTogYCcuICR0YWJsZSAuICdgIC0gcHJvY2Vzc2luZyAnIC4gJHJvd3NDb3VudCAuICcgcm93cyAoIFJvd3MgJyAuICRyb3dzX3N0YXJ0IC4gJy0nIC4gKCAkcm93c19zdGFydCArICRyb3dzQ291bnQgLSAxICkgLiAnIG9mICcgLiAkdG90YWxfcm93cyAuICcgKScgKTsJCgkJCQl9CgkJCQkKCQkJCSRyb3dzX3N0YXJ0ICs9IHNlbGY6Ok1BWF9ST1dTX1BFUl9TRUxFQ1Q7IC8vIE5leHQgbG9vcCB3ZSB3aWxsIGJlZ2luIGF0IHRoaXMgb2Zmc2V0LgoJCQkJaWYgKCAoIDAgPT0gJHJvd3NDb3VudCApIHx8ICggJHJvd3NDb3VudCA8IHNlbGY6Ok1BWF9ST1dTX1BFUl9TRUxFQ1QgKSApIHsKCQkJCQkkcm93c19yZW1haW4gPSBmYWxzZTsKCQkJCX0KCQkKCQkJCWZvcmVhY2goICRkYXRhIGFzICRyb3cgKSB7CgkJCQkJJG5lZWRfdG9fdXBkYXRlID0gZmFsc2U7CgkJCQkJJFVQREFURV9TUUwgPSAnVVBEQVRFIGAnIC4gJHRhYmxlIC4gJ2AgU0VUICc7CgkJCQkJJFdIRVJFX1NRTCA9ICcgV0hFUkUgJzsKCQkJCQoJCQkJCSRqID0gMDsKCQkJCQlmb3JlYWNoICggJGNvbHVtbl9uYW1lIGFzICRjdXJyZW50X2NvbHVtbiApIHsKCQkJCQkJJGorKzsKCQkJCQkJJGNvdW50X2l0ZW1zX2NoZWNrZWQrKzsKCQkJCQkKCQkJCQkJJGRhdGFfdG9fZml4ID0gJHJvd1skY3VycmVudF9jb2x1bW5dOwoJCQkJCQlpZiAoIGZhbHNlICE9PSAoICRlZGl0ZWRfZGF0YSA9ICR0aGlzLT5yZXBsYWNlX21heWJlX3NlcmlhbGl6ZWQoICRkYXRhX3RvX2ZpeCwgJG9sZHMsICRuZXdzICkgKSApIHsgLy8gbm8gY2hhbmdlIG5lZWRlZAoJCQkJCQkJJGNvdW50X2l0ZW1zX2NoYW5nZWQrKzsKCQkJCQkJCWlmICggJG5lZWRfdG9fdXBkYXRlICE9IGZhbHNlICkgeyAvLyBJZiB0aGlzIGlzbid0IG91ciBmaXJzdCB0aW1lIGhlcmUsIHdlIG5lZWQgdG8gYWRkIGEgY29tbWEuCgkJCQkJCQkJJFVQREFURV9TUUwgPSAkVVBEQVRFX1NRTCAuICcsJzsKCQkJCQkJCX0KCQkJCQkJCSRVUERBVEVfU1FMID0gJFVQREFURV9TUUwgLiAnICcgLiAkY3VycmVudF9jb2x1bW4gLiAnID0gIicgLiBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcoICRlZGl0ZWRfZGF0YSApIC4gJyInOwoJCQkJCQkJJG5lZWRfdG9fdXBkYXRlID0gdHJ1ZTsgLy8gT25seSBzZXQgaWYgd2UgbmVlZCB0byB1cGRhdGUgLSBhdm9pZHMgd2FzdGVkIFVQREFURSBzdGF0ZW1lbnRzLgoJCQkJCQl9CgkJCQkJCgkJCQkJCWlmICggaXNzZXQoICR0YWJsZV9pbmRleFskal0gKSApIHsKCQkJCQkJCSRXSEVSRV9TUUwgPSAkV0hFUkVfU1FMIC4gJ2AnIC4gJGN1cnJlbnRfY29sdW1uIC4gJ2AgPSAiJyAuICRyb3dbJGN1cnJlbnRfY29sdW1uXSAuICciIEFORCAnOwoJCQkJCQl9CgkJCQkJfQoJCQkJCgkJCQkJaWYgKCAkbmVlZF90b191cGRhdGUgKSB7CgkJCQkJCSRXSEVSRV9TUUwgPSBzdWJzdHIoICRXSEVSRV9TUUwgLCAwLCAtNCApOyAvLyBTdHJpcCBvZmYgdGhlIGV4Y2VzcyBBTkQgLSB0aGUgZWFzaWVzdCB3YXkgdG8gY29kZSB0aGlzIHdpdGhvdXQgZXh0cmEgZmxhZ3MsIGV0Yy4KCQkJCQkJJFVQREFURV9TUUwgPSAkVVBEQVRFX1NRTCAuICRXSEVSRV9TUUw7CgkJCQkJCSRyZXN1bHQgPSAkd3BkYi0+cXVlcnkoICRVUERBVEVfU1FMICk7CgkJCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRVJST1I6IG15c3FsIGVycm9yIHVwZGF0aW5nIGRiOiAnIC4gbXlzcWxfZXJyb3IoKSAuICcuIFNRTCBRdWVyeTogJyAuIGh0bWxlbnRpdGllcyggJFVQREFURV9TUUwgKSApOwoJCQkJCQl9IAoJCQkJCX0KCQkJCQkKCQkJCX0KCgkJCQl1bnNldCggJGRhdGEgKTsKCgkJCQkvLyBTZWUgaG93IHdlIGFyZSBkb2luZyBvbiB0aW1lLiBUcmlnZ2VyIGNodW5raW5nIGlmIG5lZWRlZC4KCQkJCWlmICggKCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnN0YXJ0VGltZSApICsgJHRoaXMtPnRpbWVXaWdnbGVSb29tICkgPj0gJHRoaXMtPm1heEV4ZWN1dGlvblRpbWUgKSB7CgkJCQkJcmV0dXJuIGFycmF5KCAkcm93c19zdGFydCApOwoJCQkJfQoJCQl9CgkJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdCcnV0ZSBmb3JjZSBkYXRhIG1pZ3JhdGlvbiBmb3IgdGFibGUgYCcgLiAkdGFibGUgLiAnYCBjb21wbGV0ZS4gQ2hlY2tlZCAnIC4gJGNvdW50X2l0ZW1zX2NoZWNrZWQgLiAnIGl0ZW1zOyAnIC4gJGNvdW50X2l0ZW1zX2NoYW5nZWQgLiAnIGNoYW5nZWQuJyApOwoJCQkKCQkJcmV0dXJuIHRydWU7CgkJfSAvLyBFbmQgYnJ1dGVmb3JjZV90YWJsZSgpLgoJCQoJCQoJCS8qKgoJCSAqCXJlY3Vyc2l2ZV9hcnJheV9yZXBsYWNlKCkKCQkgKgkKCQkgKglSZWN1cnNpdmVseSByZXBsYWNlIHRleHQgaW4gYW4gYXJyYXksIHN0ZXBwaW5nIHRocm91Z2ggYXJyYXlzL29iamVjdHMgd2l0aGluIGFycmF5cy9vYmplY3RzIGFzIG5lZWRlZC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJGZpbmQJCVRleHQgdG8gZmluZC4KCQkgKglAcGFyYW0JCXN0cmluZwkJJHJlcGxhY2UJVGV4dCB0byByZXBsYWNlIGZvdW5kIHRleHQgd2l0aC4KCQkgKglAcGFyYW0JCXJlZmVyZW5jZQkmJGRhdGEJCVBhc3MgdGhlIHZhcmlhYmxlIHRvIGNoYW5nZSB0aGUgZGF0YSB3aXRoaW4uCgkJICoJQHJldHVybgkJYm9vbGVhbgkJCQkJQWx3YXlzIHRydWUgY3VycmVudGx5LgoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHJlY3Vyc2l2ZV9hcnJheV9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICYkZGF0YSApIHsKCQkJaWYgKCBpc19hcnJheSggJGRhdGEgKSApIHsKCQkJCWZvcmVhY2ggKCAkZGF0YSBhcyAka2V5ID0+ICR2YWx1ZSApIHsKCQkJCQkvLyBBUlJBWVMKCQkJCQlpZiAoIGlzX2FycmF5KCAkdmFsdWUgKSApIHsKCQkJCQkJJHRoaXMtPnJlY3Vyc2l2ZV9hcnJheV9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICRkYXRhWyRrZXldICk7CgkJCQkJCQoJCQkJCS8vIFNUUklOR1MKCQkJCQl9IGVsc2VpZiAoIGlzX3N0cmluZyggJHZhbHVlICkgKSB7CgkJCQkJCSRkYXRhWyRrZXldID0gc3RyX3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJHZhbHVlICk7CgkJCQkJCgkJCQkJLy8gT0JKRUNUUwoJCQkJCX0gZWxzZWlmICggaXNfb2JqZWN0KCAkdmFsdWUgKSApIHsKCQkJCQkJLy9lcnJvcl9sb2coIHZhcl9leHBvcnQoICRkYXRhWyRrZXldLCB0cnVlICkgKTsKCQkJCQkJJHRoaXMtPnJlY3Vyc2l2ZV9vYmplY3RfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkZGF0YVska2V5XSApOwoJCQkJCQkvL2Vycm9yX2xvZyggdmFyX2V4cG9ydCggJGRhdGFbJGtleV0sIHRydWUgKSApOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlaWYgKCBpc19zdHJpbmcoICRkYXRhICkgKSB7CgkJCQkkZGF0YSA9IHN0cl9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICRkYXRhICk7CgkJCX0gZWxzZWlmICggaXNfb2JqZWN0KCAkZGF0YSApICkgewoJCQkJJHRoaXMtPnJlY3Vyc2l2ZV9vYmplY3RfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkZGF0YSApOwoJCQl9CgkJfQoJCQoJCQoJCS8qKgoJCSAqCXJlY3Vyc2l2ZV9vYmplY3RfcmVwbGFjZSgpCgkJICoJCgkJICoJUmVjdXJzaXZlbHkgcmVwbGFjZSB0ZXh0IGluIGFuIG9iamVjdCwgc3RlcHBpbmcgdGhyb3VnaCBvYmplY3RzL2FycmF5cyB3aXRoaW4gb2JqZWN0cy9hcnJheXMgYXMgbmVlZGVkLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkZmluZAkJVGV4dCB0byBmaW5kLgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVwbGFjZQlUZXh0IHRvIHJlcGxhY2UgZm91bmQgdGV4dCB3aXRoLgoJCSAqCUBwYXJhbQkJcmVmZXJlbmNlCSYkZGF0YQkJUGFzcyB0aGUgdmFyaWFibGUgdG8gY2hhbmdlIHRoZSBkYXRhIHdpdGhpbi4KCQkgKglAcmV0dXJuCQlib29sZWFuCQkJCQlBbHdheXMgdHJ1ZSBjdXJyZW50bHkuCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gcmVjdXJzaXZlX29iamVjdF9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICYkZGF0YSApIHsKCQkJaWYgKCBpc19vYmplY3QoICRkYXRhICkgKSB7CgkJCQkkdmFycyA9IGdldF9vYmplY3RfdmFycyggJGRhdGEgKTsKCQkJCWZvcmVhY2goICR2YXJzIGFzICRrZXkgPT4gJHZhciApIHsKCQkJCQkvLyBBUlJBWVMKCQkJCQlpZiAoIGlzX2FycmF5KCAkZGF0YS0+eyRrZXl9ICkgKSB7CgkJCQkJCSR0aGlzLT5yZWN1cnNpdmVfYXJyYXlfcmVwbGFjZSggJGZpbmQsICRyZXBsYWNlLCAkZGF0YS0+eyRrZXl9ICk7CgkJCQkJLy8gT0JKRUNUUwoJCQkJCX0gZWxzZWlmICggaXNfb2JqZWN0KCAkZGF0YS0+eyRrZXl9ICkgKSB7CgkJCQkJCSR0aGlzLT5yZWN1cnNpdmVfb2JqZWN0X3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJGRhdGEtPnska2V5fSApOwoJCQkJCS8vIFNUUklOR1MKCQkJCQl9IGVsc2VpZiAoIGlzX3N0cmluZyggJGRhdGEtPnska2V5fSApICkgewoJCQkJCQkkZGF0YS0+eyRrZXl9ID0gc3RyX3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJGRhdGEtPnska2V5fSApOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlaWYgKCBpc19zdHJpbmcoICRkYXRhICkgKSB7CgkJCQkkZGF0YSA9IHN0cl9yZXBsYWNlKCAkZmluZCwgJHJlcGxhY2UsICRkYXRhICk7CgkJCX0gZWxzZWlmICggaXNfYXJyYXkoICRkYXRhICkgKSB7CgkJCQkkdGhpcy0+cmVjdXJzaXZlX2FycmF5X3JlcGxhY2UoICRmaW5kLCAkcmVwbGFjZSwgJGRhdGEgKTsKCQkJfQoJCX0gLy8gRW5kIHJlY3Vyc2l2ZV9vYmplY3RfcmVwbGFjZSgpLgoJCQoJCQoJCS8qKgoJCSAqIENoZWNrIHZhbHVlIHRvIGZpbmQgaWYgaXQgd2FzIHNlcmlhbGl6ZWQuCgkJICoKCQkgKiBJZiAkZGF0YSBpcyBub3QgYW4gc3RyaW5nLCB0aGVuIHJldHVybmVkIHZhbHVlIHdpbGwgYWx3YXlzIGJlIGZhbHNlLgoJCSAqIFNlcmlhbGl6ZWQgZGF0YSBpcyBhbHdheXMgYSBzdHJpbmcuCgkJICoKCQkgKiBDb3VydGVzeSBXb3JkUHJlc3M7IHNpbmNlIFdvcmRQcmVzcyAyLjAuNS4KCQkgKgoJCSAqIEBwYXJhbSBtaXhlZCAkZGF0YSBWYWx1ZSB0byBjaGVjayB0byBzZWUgaWYgd2FzIHNlcmlhbGl6ZWQuCgkJICogQHJldHVybiBib29sIEZhbHNlIGlmIG5vdCBzZXJpYWxpemVkIGFuZCB0cnVlIGlmIGl0IHdhcy4KCQkgKi8KCQlmdW5jdGlvbiBpc19zZXJpYWxpemVkKCAkZGF0YSApIHsKCQkJLy8gaWYgaXQgaXNuJ3QgYSBzdHJpbmcsIGl0IGlzbid0IHNlcmlhbGl6ZWQKCQkJaWYgKCAhIGlzX3N0cmluZyggJGRhdGEgKSApCgkJCQlyZXR1cm4gZmFsc2U7CgkJCSRkYXRhID0gdHJpbSggJGRhdGEgKTsKCQkgCWlmICggJ047JyA9PSAkZGF0YSApCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJJGxlbmd0aCA9IHN0cmxlbiggJGRhdGEgKTsKCQkJaWYgKCAkbGVuZ3RoIDwgNCApCgkJCQlyZXR1cm4gZmFsc2U7CgkJCWlmICggJzonICE9PSAkZGF0YVsxXSApCgkJCQlyZXR1cm4gZmFsc2U7CgkJCSRsYXN0YyA9ICRkYXRhWyRsZW5ndGgtMV07CgkJCWlmICggJzsnICE9PSAkbGFzdGMgJiYgJ30nICE9PSAkbGFzdGMgKQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkkdG9rZW4gPSAkZGF0YVswXTsKCQkJc3dpdGNoICggJHRva2VuICkgewoJCQkJY2FzZSAncycgOgoJCQkJCWlmICggJyInICE9PSAkZGF0YVskbGVuZ3RoLTJdICkKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJY2FzZSAnYScgOgoJCQkJY2FzZSAnTycgOgoJCQkJCXJldHVybiAoYm9vbCkgcHJlZ19tYXRjaCggIi9eeyR0b2tlbn06WzAtOV0rOi9zIiwgJGRhdGEgKTsKCQkJCWNhc2UgJ2InIDoKCQkJCWNhc2UgJ2knIDoKCQkJCWNhc2UgJ2QnIDoKCQkJCQlyZXR1cm4gKGJvb2wpIHByZWdfbWF0Y2goICIvXnskdG9rZW59OlswLTkuRS1dKztcJC8iLCAkZGF0YSApOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJCgkJLyoqCgkJICoJcmVtb3ZlX21hdGNoaW5nX2FycmF5X2VsZW1lbnRzKCkKCQkgKgkKCQkgKglSZW1vdmVzIGlkZW50aWNhbCBlbGVtZW50cyAoc2FtZSBpbmRleCBhbmQgdmFsdWUpIGZyb20gYm90aCBhcnJheXMgd2hlcmUgdGhleSBtYXRjaC4KCQkgKgoJCSAqCUV4OgoJCSAqCQkvLyBCZWZvcmU6CgkJICoJCSRhID0gYXJyYXkoICdhcHBsZScsICdiYW5hbmEnLCAnY2Fycm90JyApOwoJCSAqCQkkYiA9IGFycmF5KCAnYXBwbGUnLCAnYmVlZicsICdjdWN1bWJlcicgKTsKCQkgKgkJcmVtb3ZlX21hdGNoaW5nX2FycmF5X2VsZW1lbnRzKCAkYSwgJGIgKTsKCQkgKgkJLy8gQWZ0ZXI6CgkJICoJCSRhID0gYXJyYXkoICdiYW5hbmEnLCAnY2Fycm90JyApOwoJCSAqCQkkYiA9IGFycmF5KCAnYmVlZicsICdjdWN1bWJlcicgKTsKCQkgKgkKCQkgKglAcGFyYW0JCWFycmF5CQkmJGEJCUZpcnN0IGFycmF5IHRvIGNvbXBhcmUgd2l0aCBzZWNvbmQuIChyZWZlcmVuY2UpCgkJICoJQHBhcmFtCQlhcnJheQkJJiRiCQlTZWNvbmQgYXJyYXkgdG8gY29tcGFyZSB3aXRoIGZpcnN0LiAocmVmZXJlbmNlKQoJCSAqCUByZXR1cm4JCW51bGwJCQkJQXJyYXlzIHBhc3NlZCBhcmUgdXBkYXRlZCBhcyB0aGV5IGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgoJCSAqCgkJICovCgkJZnVuY3Rpb24gcmVtb3ZlX21hdGNoaW5nX2FycmF5X2VsZW1lbnRzKCAmJGEsICYkYiApIHsKCQkJJHNpemVvZiA9IHNpemVvZiggJGEgKTsKCQkJZm9yKCAkaT0wOyAkaSA8ICRzaXplb2Y7ICRpKysgKSB7CgkJCQlpZiAoICRhWyRpXSA9PSAkYlskaV0gKSB7CgkJCQkJdW5zZXQoICRhWyRpXSApOwoJCQkJCXVuc2V0KCAkYlskaV0gKTsKCQkJCX0KCQkJfQoJCQkKCQkJJGEgPSBhcnJheV9tZXJnZSggJGEgKTsgLy8gUmVzZXQgbnVtYmVyaW5nIG9mIGtleXMuCgkJCSRiID0gYXJyYXlfbWVyZ2UoICRiICk7IC8vIFJlc2V0IG51bWJlcmluZyBvZiBrZXlzLgoJCX0KCQkKCQkKCX0gLy8gZW5kIHBsdWdpbmJ1ZGR5X2RicmVwbGFjZSBjbGFzcy4KfQo/Pg==
###PACKDATA,FILE_END,/lib/dbreplace/dbreplace.php,importbuddy/lib/dbreplace/dbreplace.php
###PACKDATA,FILE_START,/lib/dbreplace/history.txt,importbuddy/lib/dbreplace/history.txt
MS4wLjAgLSAyMDExLTA4LTE4IC0gRHVzdGluIEJvbHRvbgoJQ3JlYXRlZCBkYnJlcGxhY2UgY2xhc3Mu
###PACKDATA,FILE_END,/lib/dbreplace/history.txt,importbuddy/lib/dbreplace/history.txt
###PACKDATA,FILE_START,/lib/dbreplace/index.htm,importbuddy/lib/dbreplace/index.htm
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/lib/dbreplace/index.htm,importbuddy/lib/dbreplace/index.htm
###PACKDATA,FILE_START,/lib/dbreplace/index.php,importbuddy/lib/dbreplace/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/lib/dbreplace/index.php,importbuddy/lib/dbreplace/index.php
###PACKDATA,FILE_START,/lib/commandbuddy/commandbuddy.php,importbuddy/lib/commandbuddy/commandbuddy.php
PD9waHAKLy8gVE9ETzogRXZlbnR1YWxseSBwdWxsIG91dCBhbGwgY29tbWFuZCBsaW5lIGV4ZWN1dGlvbiB0byBydW4gdGhyb3VnaCB0aGlzIGxpYnJhcnkuCi8vCQlDdXJyZW50bHkgY29kZSBpcyBkdWNwbGljYXRlZCBiZXR3ZWVuIHRoZSBsaWJyYXJpZXMgdGhhdCBydW4gY29tbWFuZCBsaW5lIGNvbW1hbmRzLgoKY2xhc3MgcGJfYmFja3VwYnVkZHlfY29tbWFuZGJ1ZGR5IHsKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJfQoJCgkvKglleGVjdXRlKCkKCSAqCQoJICoJRXhlY3V0ZSBhIGNvbW1hbmQgdmlhIHRoZSBjb21tYW5kIGxpbmUuCgkgKglFeGFtcGxlIHVzYWdlOgoJICoJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+ZXhlY3V0ZSggJ0NPTU1BTkRISEVSRScgKTsKCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRjb21tYW5kCQlDb21tYW5kIGxpbmUgdG8gcnVuLgoJICoJQHJldHVybgkJYXJyYXkJCQkJCQlBc3NvY2lhdGl2ZSBhcnJheSBvZiB0aGUgcmVzcG9uc2Ugb3V0cHV0IGFuZCBleGlzdCBjb2RlLiBVc2Ugd2l0aCBsaXN0IHRvIGFzc2lnbiB2YXJpYWJsZXMuCgkgKgkJCQkJCQkJCQkJRm9ybWF0OiBhcnJheSggRVhFQ19PVVRQVVQsIEVYSVRfQ09ERSApOwoJICovCglwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSggJGNvbW1hbmQgKSB7CgkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsKCQkJLy8gV2luZG93czsgZG8gbm90aGluZy4KCQl9IGVsc2UgeyAvLyBMaW51eC9NYWMKCQkJaWYgKCAoIGluaV9nZXQoICdleGVjX2RpcicgKSAhPT0gZmFsc2UgKSAmJiAoIGluaV9nZXQoICdleGVjX2RpcicgKSAhPSAnJyApICkgeyAvLyBleGVjX2RpciBQSFAgcGF0Y2ggaW4gcGxhY2U6IGh0dHA6Ly93d3cua3liZXJkaWdpLmN6L3Byb2plY3RzL2V4ZWNkaXIvCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdleGVjX2RpciBkZXRlY3RlZC4gU2tpcHBpbmcgcGF0aCBhc3NpZ25tZW50LicgKTsKCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ2V4ZWNfZGlyIG5vdCBkZXRlY3RlZC4gUHJvY2VlZGluZyBub3JtYWxseS4nICk7CgkJCQkkY29tbWFuZCA9ICdQQVRIPSRQQVRIOi91c3IvYmluLzovdXNyL2xvY2FsL2Jpbi86dXNyL2xvY2FsL2JpbjovdXNyL2xvY2FsL3NiaW4vOi91c3Ivc2Jpbi86L3NiaW4vOi91c3IvOi9iaW4vJyAuICc7ICcgLiAkY29tbWFuZDsKCQkJfQoJCX0KCQkKCQkvLyBPdXRwdXQgY29tbWFuZCAoc3RyaXBzIG15c3FsZHVtcCBwYXNzd29yZHMpLgoJCWlmICggc3Ryc3RyKCAkY29tbWFuZCwgJy0tcGFzc3dvcmQ9JyApICkgewoJCQkkcGFzc3dvcmRfcG9ydGlvbl9iZWdpbiA9IHN0cnBvcyggJGNvbW1hbmQsICctLXBhc3N3b3JkPScgKTsKCQkJJHBhc3N3b3JkX3BvcnRpb25fZW5kID0gc3RycG9zKCAkY29tbWFuZCwgJyAnLCAkcGFzc3dvcmRfcG9ydGlvbl9iZWdpbiApOwoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3Bhc3Mgc3RhcnQ6IGAnIC4gJHBhc3N3b3JkX3BvcnRpb25fYmVnaW4gLiAnYC4gcGFzcyBlbmQ6IGAnIC4gJHBhc3N3b3JkX3BvcnRpb25fZW5kIC4gJ2AnICk7CgkJCSRwYXNzd29yZF9wb3J0aW9uID0gc3Vic3RyKCAkY29tbWFuZCwgJHBhc3N3b3JkX3BvcnRpb25fYmVnaW4sICggJHBhc3N3b3JkX3BvcnRpb25fZW5kIC0gJHBhc3N3b3JkX3BvcnRpb25fYmVnaW4gKSApOwoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3Bhc3MgcG9ydGlvbjogYCcgLiAkcGFzc3dvcmRfcG9ydGlvbiAuICdgLicgKTsKCQkJJHVucGFzc3dvcmRlZF9jb21tYW5kID0gc3RyX3JlcGxhY2UoICRwYXNzd29yZF9wb3J0aW9uLCAnLS1wYXNzd29yZD0qSElEREVOKicsICRjb21tYW5kICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ2V4ZWMoKSBjb21tYW5kIChwYXNzd29yZCBoaWRkZW4pIGAnIC4gJHVucGFzc3dvcmRlZF9jb21tYW5kIC4gJ2AgKHdpdGggcGF0aCBkZWZpbml0aW9uKS4nICk7CgkJCXVuc2V0KCAkdW5wYXNzd29yZGVkX2NvbW1hbmQgKTsKCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdleGVjKCkgY29tbWFuZCBgJyAuICRjb21tYW5kIC4gJ2AgKHdpdGggcGF0aCBkZWZpbml0aW9uKS4nICk7CgkJfQoJCQoJCSRleGVjX291dHB1dCA9IGFycmF5KCk7CgkJQGV4ZWMoICRjb21tYW5kLCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnZXhlYygpIGNvbW1hbmQgb3V0cHV0OiBgJyAuIGltcGxvZGUoICcsJywgJGV4ZWNfb3V0cHV0ICkgLiAnYDsgRXhpdCBjb2RlOiBgJyAuICRleGVjX2V4aXRfY29kZSAuICdgOyBFeGl0IGNvZGUgZGVzY3JpcHRpb246IGAnIC4gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT5leGl0X2NvZGVfbG9va3VwKCAkZXhlY19leGl0X2NvZGUgKSAuICdgJyApOwoJCQoJCXJldHVybiBhcnJheSggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKTsKCX0gLy8gRW5kIGV4ZWN1dGUoKS4KfQ==
###PACKDATA,FILE_END,/lib/commandbuddy/commandbuddy.php,importbuddy/lib/commandbuddy/commandbuddy.php
###PACKDATA,FILE_START,/lib/commandbuddy/index.php,importbuddy/lib/commandbuddy/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/lib/commandbuddy/index.php,importbuddy/lib/commandbuddy/index.php
###PACKDATA,FILE_START,/lib/zipbuddy/history.txt,importbuddy/lib/zipbuddy/history.txt
Mi4wLjAgLSAyMDExLTEwLTA4IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgaGlzdG9yeS50eHQuCglBZGRlZCB1bnppcCBmdW5jdGlvbmFsaXR5Lg==
###PACKDATA,FILE_END,/lib/zipbuddy/history.txt,importbuddy/lib/zipbuddy/history.txt
###PACKDATA,FILE_START,/lib/zipbuddy/index.php,importbuddy/lib/zipbuddy/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/lib/zipbuddy/index.php,importbuddy/lib/zipbuddy/index.php
###PACKDATA,FILE_START,/lib/zipbuddy/legacy.zipbuddy.php,importbuddy/lib/zipbuddy/legacy.zipbuddy.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IENsYXNzCiAqCiAqCUhhbmRsZXMgemlwcGluZyBhbmQgdW56aXBwaW5nLCB1c2luZyB0aGUgYmVzdCBtZXRob2RzIGF2YWlsYWJsZSBhbmQgZmFsbGluZyBiYWNrIHRvIHdvcnNlIG1ldGhvZHMKICoJYXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5LiBBbGxvd3MgZm9yIGZvcmNpbmcgY29tcGF0aWJpbGl0eSBtb2Rlcy4KICoJCiAqCVZlcnNpb246IDMuMC4wCiAqCUF1dGhvcjogRHVzdGluIEJvbHRvbgogKglBdXRob3IgVVJJOiBodHRwOi8vZHVzdGluYm9sdG9uLmNvbS8KICoKICoJJHRlbXBfZGlyCQlzdHJpbmcJCVRlbXBvcmFyeSBkaXJlY3RvcnkgYWJzb2x1dGUgcGF0aCBmb3IgdGVtcG9yYXJ5IGZpbGUgc3RvcmFnZS4gTXVzdCBiZSB3cml0YWJsZSEKICoJJHppcF9tZXRob2RzCWFycmF5CQlPcHRpb25hbC4gQXJyYXkgb2YgYXZhaWxhYmxlIHppcCBtZXRob2RzIHRvIHVzZS4gVXNlZnVsIGZvciBub3QgaGF2aW5nIHRvIHJlLXRlc3QgZXZlcnkgdGltZS4KICoJCQkJCQkJCUlmIG9taXR0ZWQgdGhlbiBhIHRlc3Qgd2lsbCBiZSBwZXJmb3JtZWQgdG8gZmluZCB0aGUgbWV0aG9kcyB0aGF0IHdvcmsgb24gdGhpcyBob3N0LgogKgkkbW9kZQkJCXN0cmluZwkJRnV0dXJlIHVzZSB0byBhbGxvdyBmb3Igb3RoZXIgY29tcHJlc3Npb24gbWV0aG9kcyBvdGhlciB0aGFuIHppcC4gQ3VycmVudGx5IG5vdCBpbiB1c2UuCiAqCiAqLwoKCgovLyBUcnkgYW5kIGxvYWQgdGhlIGV4cGVyaW1lbnRhbCB2ZXJzaW9uIC0gaWYgc3VjY2Vzc2Z1bCB0aGVuIGNsYXNzIHdpbGwgZXhpc3QgYW5kIHJlbWFpbmluZyBjb2RlIHdpbGwgYmUgaWdub3JlZAppZiAoCgkJKCBkZWZpbmVkKCAnVVNFX0VYUEVSSU1FTlRBTF9aSVBCVUREWScgKSAmJiAoIHRydWUgPT09IFVTRV9FWFBFUklNRU5UQUxfWklQQlVERFkgKSApCgkJfHwKCQkoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2FsdGVybmF0aXZlX3ppcCddICkgJiYgKCAnMScgPT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydhbHRlcm5hdGl2ZV96aXAnXSApICkKCSkgewoJCXJlcXVpcmVfb25jZSggZGlybmFtZSggX19GSUxFX18gKSAuICcveC16aXBidWRkeS5waHAnICk7Cn0KCgoKaWYgKCAhY2xhc3NfZXhpc3RzKCAicGx1Z2luYnVkZHlfemlwYnVkZHkiICkgKSB7CgljbGFzcyBwbHVnaW5idWRkeV96aXBidWRkeSB7CgkJCgkJCgkJLyoqKioqKioqKiogUHJvcGVydGllcyAqKioqKioqKioqLwoJCQoJCQoJCWNvbnN0IFpJUF9NRVRIT0RTX1RSQU5TSUVOVCA9ICdwYl9iYWNrdXBidWRkeV9hdmFpbF96aXBfbWV0aG9kc19jbGFzc2ljJzsKCQljb25zdCBaSVBfRVhFQ1BBVEhfVFJBTlNJRU5UID0gJ3BiX2JhY2t1cGJ1ZGR5X2V4ZWNfcGF0aF9jbGFzc2ljJzsKCQljb25zdCBaSVBfVFJBTlNJRU5UX0xJRkUgPSA2MDsKCQljb25zdCBOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgPSAnLyc7CgkJY29uc3QgRElSRUNUT1JZX1NFUEFSQVRPUlMgPSAnL1xcJzsKCQkKCQlwcml2YXRlICRfY29tbWFuZGJ1ZGR5OwoJCXB1YmxpYyAkX3ppcF9tZXRob2RzOwkJLy8gQXJyYXkgb2YgYXZhaWxhYmxlIHppcCBtZXRob2RzLgoJCQoJCQoJCS8qKioqKioqKioqIE1ldGhvZHMgKioqKioqKioqKi8KCQkKCQkKCQlmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHRlbXBfZGlyLCAkemlwX21ldGhvZHMgPSBhcnJheSgpLCAkbW9kZSA9ICd6aXAnICkgewoJCQkvLyR0aGlzLT5fc3RhdHVzID0gYXJyYXkoKTsKCQkJJHRoaXMtPl90ZW1wZGlyID0gJHRlbXBfZGlyOwoJCQkkdGhpcy0+X2V4ZWNwYXRoID0gJyc7CgkJCQoJCQkvLyBIYW5kbGVzIGNvbW1hbmQgbGluZSBleGVjdXRpb24uCgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9jb21tYW5kYnVkZHkvY29tbWFuZGJ1ZGR5LnBocCcgKTsKCQkJJHRoaXMtPl9jb21tYW5kYnVkZHkgPSBuZXcgcGJfYmFja3VwYnVkZHlfY29tbWFuZGJ1ZGR5KCk7CgkJCQoJCQlpZiAoICFlbXB0eSggJHppcF9tZXRob2RzICkgJiYgKCBjb3VudCggJHppcF9tZXRob2RzICkgPiAwICkgKSB7CgkJCQkkdGhpcy0+X3ppcF9tZXRob2RzID0gJHppcF9tZXRob2RzOwoJCQl9IGVsc2UgewoJCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdnZXRfdHJhbnNpZW50JyApICkgeyAvLyBJbnNpZGUgV29yZFByZXNzCgkJCQkJCgkJCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc2FibGVfemlwbWV0aG9kX2NhY2hpbmcnXSA9PSAnMScgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ppcCBtZXRob2QgY2FjaGluZyBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nICk7CgkJCQkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGZhbHNlOwoJCQkJCQkkZXhlY19wYXRoID0gZmFsc2U7CgkJCQkJfSBlbHNlIHsgLy8gVXNlIGNhY2hpbmcuCgkJCQkJCSRhdmFpbGFibGVfbWV0aG9kcyA9IGdldF90cmFuc2llbnQoIHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCApOwoJCQkJCQkkZXhlY19wYXRoID0gZ2V0X3RyYW5zaWVudCggc2VsZjo6WklQX0VYRUNQQVRIX1RSQU5TSUVOVCApOwoJCQkJCX0KCQkJCQkKCQkJCQlpZiAoICggJGF2YWlsYWJsZV9tZXRob2RzID09PSBmYWxzZSApIHx8ICggJGV4ZWNfcGF0aCA9PT0gZmFsc2UgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwIG1ldGhvZHMgb3IgZXhlYyBwYXRoIHdlcmUgbm90IGNhY2hlZDsgZGV0ZWN0aW5nLi4uJyApOwoJCQkJCQkkdGhpcy0+X3ppcF9tZXRob2RzID0gJHRoaXMtPmF2YWlsYWJsZV96aXBfbWV0aG9kcyggZmFsc2UsICRtb2RlICk7CgkJCQkJCXNldF90cmFuc2llbnQoIHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVCwgJHRoaXMtPl96aXBfbWV0aG9kcywgc2VsZjo6WklQX1RSQU5TSUVOVF9MSUZFICk7CgkJCQkJCXNldF90cmFuc2llbnQoIHNlbGY6OlpJUF9FWEVDUEFUSF9UUkFOU0lFTlQsICR0aGlzLT5fZXhlY3BhdGgsIHNlbGY6OlpJUF9UUkFOU0lFTlRfTElGRSApOyAvLyBDYWxjdWxhdGVkIGFuZCBzZXQgaW4gYXZhaWxhYmxlX3ppcF9tZXRob2RzKCkuCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NhY2hpbmcgemlwYnVkZHkgY2xhc3NpYyBtZXRob2RzICYgZXhlYyBwYXRoIGZvciBgJyAuIHNlbGY6OlpJUF9UUkFOU0lFTlRfTElGRSAuICdgIHNlY29uZHMuJyApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1VzaW5nIGNhY2hlZCB6aXBidWRkeSBjbGFzc2ljIG1ldGhvZHM6IGAnIC4gaW1wbG9kZSggJywnLCAkYXZhaWxhYmxlX21ldGhvZHMgKSAuICdgLicgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVXNpbmcgY2FjaGVkIHppcGJ1ZGR5IGNsYXNzaWMgZXhlYyBwYXRoOiBgJyAuICRleGVjX3BhdGggLiAnYC4nICk7CgkJCQkJCSR0aGlzLT5femlwX21ldGhvZHMgPSAkYXZhaWxhYmxlX21ldGhvZHM7CgkJCQkJfQoJCQkJfSBlbHNlIHsgLy8gT3V0c2lkZSBXb3JkUHJlc3MKCQkJCQkkdGhpcy0+X3ppcF9tZXRob2RzID0gJHRoaXMtPmF2YWlsYWJsZV96aXBfbWV0aG9kcyggZmFsc2UsICRtb2RlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnWmlwYnVkZHkgY2xhc3NpYyBtZXRob2RzIG5vdCBjYWNoZWQgZHVlIHRvIGJlaW5nIG91dHNpZGUgV29yZFByZXNzLicgKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkKCQkvLyBGdW5jdGlvbiB0byB0cmFuc2xhdGUgYSBaaXBBcmNoaXZlIGVycm9yIGNvZGUgaW50byBhbiBpbmZvcm1hdGl2ZSBzdHJpbmcgZGVzY3JpcHRpb24KCQlmdW5jdGlvbiB6aXBhcmNoaXZlX2Vycm9yX2luZm8oICRlcnJvciwgJGZ1bGwgPSB0cnVlICkgewoJCQoJCQkvLyBGb3Igc2FmZXR5IGxldCdzIGNoZWNrIHRoYXQgdGhlIGNsYXNzIGFjdHVhbGx5IGV4aXN0cy4uLgoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1ppcEFyY2hpdmUnLCBmYWxzZSApICkgewoJCQkKCQkJCS8vIFdlIGNhbiBjaGVjayB0aGUgc3ltYm9saWMgdmFsdWVzCgkJCQlzd2l0Y2goIChpbnQpICRlcnJvciApIHsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX09LOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUlJfT0siOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTm8gZXJyb3IiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX09QRU46CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX09QRU4iOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ2FuJ3Qgb3BlbiBmaWxlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9NRU1PUlk6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX01FTU9SWSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9FWElTVFM6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSUl9FWElTVFMiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiRmlsZSBhbHJlYWR5IGV4aXN0cyI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfSU5DT05TOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9JTkNPTlMiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiWmlwIGFyY2hpdmUgaW5jb25zaXN0ZW50IjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9JTlZBTDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfSU5WQUwiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiSW52YWxpZCBhcmd1bWVudCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfTk9FTlQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX05PRU5UIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIk5vIHN1Y2ggZmlsZSI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfTk9aSVA6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX05PWklQIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIk5vdCBhIHppcCBhcmNoaXZlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9SRUFEOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9SRUFEIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIlJlYWQgZXJyb3IiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1NFRUs6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1NFRUsiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiU2VlayBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfTVVMVElESVNLOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9NVUxUSURJU0siOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfUkVOQU1FOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9SRU5BTUUiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiUmVuYW1pbmcgdGVtcG9yYXJ5IGZpbGUgZmFpbGVkIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DTE9TRToKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfQ0xPU0UiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ2xvc2luZyB6aXAgYXJjaGl2ZSBmYWlsZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1dSSVRFOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9XUklURSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJXcml0ZSBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfQ1JDOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DUkMiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ1JDIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9aSVBDTE9TRUQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1pJUENMT1NFRCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDb250YWluaW5nIHppcCBhcmNoaXZlIHdhcyBjbG9zZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1RNUE9QRU46CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1RNUE9QRU4iOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiRmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1pMSUI6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1pMSUIiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiWmxpYiBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfQ0hBTkdFRDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfQ0hBTkdFRCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJFbnRyeSBoYXMgYmVlbiBjaGFuZ2VkIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DT01QTk9UU1VQUDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfQ09NUE5PVFNVUFAiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ29tcHJlc3Npb24gbWV0aG9kIG5vdCBzdXBwb3J0ZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0VPRjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfRU9GIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIlByZW1hdHVyZSBFT0YiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0lOVEVSTkFMOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9JTlRFUk5BTCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJJbnRlcm5hbCBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfUkVNT1ZFOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9SRU1PVkUiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiQ2FuJ3QgcmVtb3ZlIGZpbGUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0RFTEVURUQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0RFTEVURUQiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiRW50cnkgaGFzIGJlZW4gZGVsZXRlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGRlZmF1bHQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSUl9VTktOT1dOIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIlVua21vd24gZXJyb3IiOwoJCQkJfQoJCQkJCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGVycm9yX25hbWUgLiAiKCIgLiAkZXJyb3IgLiAiKSA6ICIgLiAkZXJyb3JfZGVzY3JpcHRpb247CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIElmIHRoZSBaaXBBcmNoaXZlIGNsYXNzIGRvZXNuJ3QgZXhpc3RzIGp1c3QgcmV0dXJuIGEgZ2VuZXJpYwoJCQkJJGVycm9yX3N0cmluZyA9ICJaSVBBUkNISVZFOjpFUl9VTktOT1dOKCIgLiAkZXJyb3IgLiAiKSA6IFVua25vd24gZXJyb3IiOwoJCQkKCQkJfQoJCQkKCQkJLy8gT25lIHdheSBvciBhbm90aGVyIHdlIGhhdmUgYSBzdHJpbmcgdG8gcmV0dXJuCgkJCXJldHVybiAkZXJyb3Jfc3RyaW5nOwoJCQoJCX0KCQkKCQkvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgKHdpdGggcGF0aCkgZXhpc3RzIGluIHRoZSBaSVAuCgkJLy8gSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkvLyBOb3RlOiBsZWF2ZV9vcGVuIGZ1bmN0aW9uYWxpdHkgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZAoJCWZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCgkJCS8vIFVzZSBaaXBBcmNoaXZlIGlmIGF2YWlsYWJsZQoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIGRvdWJseSBzdXJlIGl0IGlzIGF2YWlsYWJsZSAtIGlmIG5vdCB3ZSdsbCBqdXN0IGRyb3AgdGhyb3VnaAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJywgZmFsc2UpICkgewoJCQkJCgkJCQkJJHphID0gbmV3IFppcEFyY2hpdmUoKTsKCQkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sKCQkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJCS8vIE5vdyB0cnkgYW5kIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaWxlCgkJCQkJCSRpbmRleCA9ICR6YS0+bG9jYXRlTmFtZSggJGxvY2F0ZV9maWxlICk7CgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhlIGFyY2hpdmUgKGxlYXZlX29wZW4gaWdub3JlZCBmb3Igbm93KQoJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQoJCQkJCQkvLyBJZiB3ZSBnb3QgYW4gaW5kZXggd2UgZm91bmQgaXQgb3RoZXJ3aXNlIG5vdCBmb3VuZAoJCQkJCQlpZiAoICRpbmRleCAhPT0gZmFsc2UgKSB7CgkJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmlsZSBmb3VuZCAoemlwYXJjaGl2ZSknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAoemlwYXJjaGl2ZSknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gZHJvcCB0aHJvdWdoIGFzIG1heWJlIG90aGVyIG1ldGhvZCB3aWxsIHN1Y2NlZWQ/CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkdGhpcy0+emlwYXJjaGl2ZV9lcnJvcl9pbmZvKCAkcmVzdWx0ICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBjaGVjayBpZiBmaWxlIGV4aXN0cyAobG9va2luZyBmb3IgJTEkcyBpbiAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlICwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJfQoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIERyb3BwZWQgdGhyb3VnaCBiZWNhdXNlIFppcEFyY2hpdmUgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgdG8gb3BlbiBmaWxlCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgaXQKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQvbG9hZCBpdCBmcm9tIHBvc3NpYmxlIGxvY2F0aW9ucwoJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyB1bmRlciBXb3JkUHJlc3MKCQkJCQkJQGluY2x1ZGVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIFN0YW5kYWxvbmUgKGltcG9ydGJ1ZGR5KQoJCQkJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBkaWQgbG9hZCBpdAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSApICkgewoJCQkJCgkJCQkJJHphID0gbmV3IFBjbFppcCggJHppcF9maWxlICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rIGFuZCBpdCBoYXMgY29udGVudAoJCQkJCWlmICggKCAkY29udGVudF9saXN0ID0gJHphLT5saXN0Q29udGVudCgpICkgIT09IDAgKSB7CgkJCQkJCgkJCQkJCS8vIEdldCBlYWNoIGZpbGUgaW4gc2VxdWVuY2UgYnkgaW5kZXggYW5kIGdldCB0aGUgcHJvcGVydGllcwoJCQkJCQlmb3IgKCAkaSA9IDA7ICRpIDwgc2l6ZW9mKCAkY29udGVudF9saXN0ICk7ICRpKysgKSB7CgkJCQkJCQoJCQkJCQkJJHN0YXQgPSAkY29udGVudF9saXN0WyAkaSBdOwoJCQkJCQkJCgkJCQkJCQkvLyBBc3N1bWUgdGhlIGtleSBleGlzdHMgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCQlpZiAoICRzdGF0WyAnZmlsZW5hbWUnIF0gPT0gJGxvY2F0ZV9maWxlICkgewoJCQkJCQkJCgkJCQkJCQkJLy8gRmlsZSBmb3VuZCBzbyB3ZSBjYW4ganVzdCByZXR1cm4KCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBPbmx5IGdldCBoZXJlIGlmIHRoZSBmaWxlIHdhc24ndCBmb3VuZAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAocGNsemlwKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gZHJvcCB0aHJvdWdoIGFzIG1heWJlIG90aGVyIG1ldGhvZCB3aWxsIHN1Y2NlZWQ/CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBjaGVjayBpZiBmaWxlIGV4aXN0cyAobG9va2luZyBmb3IgJTEkcyBpbiAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlICwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJfQoJCQkJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBjbGFzcyBQY2xaaXAgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBnb3QgdGhpcyBmYXIgdGhlbiBubyBtZXRob2QgdG8gY2hlY2sgYmFja3VwIGNvbnRlbnQgd2FzIGF2YWlsYWJsZSBvciB3b3JrZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGNoZWNrIGlmIGZpbGUgZXhpc3RzIChsb29raW5nIGZvciAlMSRzIGluICUyJHMpOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGxvY2F0ZV9maWxlLCAkemlwX2ZpbGUgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgoJCX0KCQkKCQkKCQkKCQkvKglzZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHNldCBjb21tZW50IG9uLgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJGNvbW1lbnQJCUNvbW1lbnQgdG8gYXBwbHkgdG8gYXJjaGl2ZS4KCQkgKglAcmV0dXJuCQlib29sZWFuL3N0cmluZwkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KCQkgKi8KCQlmdW5jdGlvbiBzZXRfY29tbWVudCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJLy9Vc2UgWmlwQXJjaGl2ZSBpZiBhdmFpbGFibGUKCQkJaWYgKCBpbl9hcnJheSggJ3ppcGFyY2hpdmUnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBkb3VibHkgc3VyZSBpdCBpcyBhdmFpbGFibGUKCQkJCWlmICggY2xhc3NfZXhpc3RzKCAnWmlwQXJjaGl2ZScsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgWmlwQXJjaGl2ZTsKCQkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgYXQgbGVhc3QgdGhlIHppcCBmaWxlIG9wZW5lZCBvawoJCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJCS8vIFNldCB0aGUgY29tbWVudCAtIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQoJCQkJCQkJJHJlc3VsdCA9ICR6YS0+c2V0QXJjaGl2ZUNvbW1lbnQoICRjb21tZW50ICk7CgkJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQkKCQkJCQkJCS8vIElmIHdlIGdvdCBiYWNrIHRydWUgdGhlbiBhbGwgaXMgd2VsbCB3aXRoIHRoZSB3b3JsZAoJCQkJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgewoJCQkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJCQoJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQoJCQkJCQkJCS8vIElmIHdlIGZhaWxlZCB0byBzZXQgdGhlIGNvbW1uZW50IHRoZW4gbG9nIGl0ICg/KSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCgkJCQkJCQl9CgkJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSB6aXAgZmlsZSB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHRoaXMtPnppcGFyY2hpdmVfZXJyb3JfaW5mbyggJHJlc3VsdCApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCQoJCQkJCX0KCQkJCQkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIERyb3BwZWQgdGhyb3VnaCBiZWNhdXNlIFppcEFyY2hpdmUgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgZm9yIHNvbWUgcmVhc29uCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgaXQKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQvbG9hZCBpdCBmcm9tIHBvc3NpYmxlIGxvY2F0aW9ucwoJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyB1bmRlciBXb3JkUHJlc3MKCQkJCQkJQGluY2x1ZGVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIFN0YW5kYWxvbmUgKGltcG9ydGJ1ZGR5KQoJCQkJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBkaWQgbG9hZCBpdAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIHdlIGFkZGVkIHRoZSBjb21tZW50IG9rCgkJCQkJLy8gTm90ZTogdXNpbmcgZW1wdHkgYXJyYXkgYXMgd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBhZGQgYW55IGZpbGVzCgkJCQkJaWYgKCAoICRsaXN0ID0gJHphLT5hZGQoIGFycmF5KCksIFBDTFpJUF9PUFRfQ09NTUVOVCwgJGNvbW1lbnQgKSApICE9PSAwICkgewoJCQkJCQoJCQkJCQkvLyBXZSBnb3QgYSBsaXN0IGJhY2sgc28gYWRkaW5nIGNvbW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBzdWNjZXNzZnVsCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gSWYgd2UgZmFpbGVkIHRvIHNldCB0aGUgY29tbW5lbnQgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBmYWlsZWQgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBjbGFzcyBQY2xaaXAgbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBXZSBjb3VsZG4ndCBzZXQgYSBjb21tZW50IGF0IGFsbCAtIGVpdGhlciBubyBhdmFpbGFibGUgbWV0aG9kIG9yIGFsbCBtZXRob2RzIGZhaWxlZAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQgb3IgYWxsIG1ldGhvZHMgZmFpbGVkIC0gbm90ZSBzdG9yZWQgaW50ZXJuYWxseSBvbmx5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgoJCQkvLyBSZXR1cm4gbWVzc2FnZSBmb3IgZGlzcGxheSAtIG1heWJlIHNob3VsZCByZXR1cm4gZmFsc2UgYW5kIGhhdmUgY2FsbGVyIGRpc3BsYXkgaXQncyBvd24gbWVzc2FnZT8KCQkJJG1lc3NhZ2UgPSAiXG5cblVuYWJsZSB0byBzZXQgbm90ZSBpbiBmaWxlLlxuVGhlIG5vdGUgd2lsbCBvbmx5IGJlIHN0b3JlZCBpbnRlcm5hbGx5IGluIHlvdXIgc2V0dGluZ3MgYW5kIG5vdCBpbiB0aGUgemlwIGZpbGUgaXRzZWxmLiI7CgkJCXJldHVybiAkbWVzc2FnZTsKCQkJCgkJfSAvLyBFbmQgc2V0X2NvbW1lbnQoKS4KCQkKCQkKCQkKCQkvKglnZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gcmV0cmlldmUgY29tbWVudCBmcm9tLgoJCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJCVppcCBjb21tZW50LgoJCSAqLwoJCWZ1bmN0aW9uIGdldF9jb21tZW50KCAkemlwX2ZpbGUgKSB7CgkJCgkJCS8vIFVzZSBaaXBBcmNoaXZlIGlmIGF2YWlsYWJsZQoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCgkJCQkvLyBNYWtlIGRvdWJseSBzdXJlIGl0IGlzIGF2YWlsYWJsZQoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdaaXBBcmNoaXZlJywgZmFsc2UgKSApIHsKCQkJCQoJCQkJCSR6YSA9IG5ldyBaaXBBcmNoaXZlKCk7CgkJCQkJJHJlc3VsdCA9ICR6YS0+b3BlbiggJHppcF9maWxlICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgYXQgbGVhc3QgdGhlIHppcCBmaWxlIG9wZW5lZCBvawoJCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJLy8gR2V0IHRoZSBjb21tZW50IG9yIGZhbHNlIG9uIGZhaWx1cmUgZm9yIHNvbWUgcmVhc29uCgkJCQkJCSRjb21tZW50ID0gJHphLT5nZXRBcmNoaXZlQ29tbWVudCgpOwoJCQkJCQkkemEtPmNsb3NlKCk7CgkJCQkJCQoJCQkJCQkvLyBJZiB3ZSBoYXZlIGEgY29tbWVudCAoZXZlbiBpZiBlbXB0eSkgdGhlbiByZXR1cm4gaXQKCQkJCQkJaWYgKCAkY29tbWVudCAhPT0gZmFsc2UgKSB7CgkJCQkJCQoJCQkJCQkJLy8gTm90ZTogbmV3IGFyY2hpdmVzIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGNvbW1lbnQgaWYgb25lIHdhcyBub3QgYWRkZWQgYXQgY3JlYXRpb24KCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgcmV0cmlldmVkIGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCgkJCQkJCQkvLyBGb3JtYXQgaGFzIGNoYW5nZWQgYW5kIG5vIGxvbmdlciBlbmNvZGluZyBhcyBodG1sZW10aXRpZXMgd2hlbiBzZXR0aW5nIGNvbW1lbnQKCQkJCQkJCS8vIEZvciBvbGRlciBiYWNrdXBzIG1heSBuZWVkIHRvIHJlbW92ZSBlbmNvZGluZyAtIGFjdGlvbiBfc2hvdWxkXyBiZSBudWxsIGlmIE4vQQoJCQkJCQkJLy8gT25seSBzcGFubmVyIHdvdWxkIGJlIGlmIHNvbWVvbmUgaGFkIHB1dCBhbiBlbnRpdHkgaW4gdGhlaXIgY29tbWVudCBidXQgdGhhdCBpcwoJCQkJCQkJLy8gcmVhbGx5IGFuIG91dHNpZGVyIGFuZCBpbiBhbnkgY2FzZSB0aGUgY29ycmVjdGlvbiBpcyBzaW1wbHkgdG8gZWRpdCBhbmQgcmVzYXZlCgkJCQkJCQkvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIG5ldyBmb3JtYXQgaGFzIGJlZW4gaW4gdXNlIGZvciBzb21lIHRpbWUKCQkJCQkJCSRjb21tZW50ID0gaHRtbF9lbnRpdHlfZGVjb2RlKCAkY29tbWVudCApOwkJCQkKCgkJCQkJCQlyZXR1cm4gJGNvbW1lbnQ7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gcmV0cmlldmUgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoKCQkJCQkJfQoKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSB6aXAgZmlsZSB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHRoaXMtPnppcGFyY2hpdmVfZXJyb3JfaW5mbyggJHJlc3VsdCApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gcmV0cmlldmUgY29tbWVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJfQoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIERyb3BwZWQgdGhyb3VnaCBiZWNhdXNlIFppcEFyY2hpdmUgbm90IGF2YWlsYWJsZSBvciBmYWlsZWQgZm9yIHNvbWUgcmVhc29uCgkJCWlmICggaW5fYXJyYXkoICdwY2x6aXAnLCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgaXQKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcsIGZhbHNlICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIG5vdCBhbHJlYWR5IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQvbG9hZCBpdCBmcm9tIHBvc3NpYmxlIGxvY2F0aW9ucwoJCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyB1bmRlciBXb3JkUHJlc3MKCQkJCQkJQGluY2x1ZGVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgewoJCQkJCQoJCQkJCQkvLyBSdW5uaW5nIFN0YW5kYWxvbmUgKGltcG9ydGJ1ZGR5KQoJCQkJCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBkaWQgbG9hZCBpdAoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBwcm9wZXJ0aWVzCgkJCQkJaWYgKCAoICRwcm9wZXJ0aWVzID0gJHphLT5wcm9wZXJ0aWVzKCkgKSAhPT0gMCApIHsKCQkJCQkKCQkJCQkJLy8gV2UgZ290IHByb3BlcnRpZXMgc28gc2hvdWxkIGhhdmUgYSBjb21tZW50IHRvIHJldHVybiwgZXZlbiBpZiBlbXB0eQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgcmV0cmlldmVkIGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkJJGNvbW1lbnQgPSAkcHJvcGVydGllc1sgJ2NvbW1lbnQnIF07CgoJCQkJCQkvLyBGb3JtYXQgaGFzIGNoYW5nZWQgYW5kIG5vIGxvbmdlciBlbmNvZGluZyBhcyBodG1sZW10aXRpZXMgd2hlbiBzZXR0aW5nIGNvbW1lbnQKCQkJCQkJLy8gRm9yIG9sZGVyIGJhY2t1cHMgbWF5IG5lZWQgdG8gcmVtb3ZlIGVuY29kaW5nIC0gYWN0aW9uIF9zaG91bGRfIGJlIG51bGwgaWYgTi9BCgkJCQkJCS8vIE9ubHkgc3Bhbm5lciB3b3VsZCBiZSBpZiBzb21lb25lIGhhZCBwdXQgYW4gZW50aXR5IGluIHRoZWlyIGNvbW1lbnQgYnV0IHRoYXQgaXMKCQkJCQkJLy8gcmVhbGx5IGFuIG91dHNpZGVyIGFuZCBpbiBhbnkgY2FzZSB0aGUgY29ycmVjdGlvbiBpcyBzaW1wbHkgdG8gZWRpdCBhbmQgcmVzYXZlCgkJCQkJCS8vIFRPRE86IFJlbW92ZSB0aGlzIHdoZW4gbmV3IGZvcm1hdCBoYXMgYmVlbiBpbiB1c2UgZm9yIHNvbWUgdGltZQoJCQkJCQkkY29tbWVudCA9IGh0bWxfZW50aXR5X2RlY29kZSggJGNvbW1lbnQgKTsKCQkJCQkKCQkJCQkJcmV0dXJuICRjb21tZW50OwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oIHRydWUgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUGNsWmlwIGZhaWxlZCB0byByZXRyaWV2ZSBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgcGNsemlwIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgY2xhc3MgUGNsWmlwIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gV2UgY291bGRuJ3QgZ2V0IGEgY29tbWVudCBhdCBhbGwgLSBlaXRoZXIgbm8gYXZhaWxhYmxlIG1ldGhvZCBvciBhbGwgbWV0aG9kcyBmYWlsZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVW5hYmxlIHRvIGdldCBjb21tZW50OiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0gLy8gRW5kIGdldF9jb21tZW50KCkuCgkJCgkJCgkJCgkJLy8gRk9SIEZVVFVSRSBVU0U7IE5PVCBZRVQgSU1QTEVNRU5URUQuIFVzZSB0byBjaGVjayAuc3FsIGZpbGUgaXMgbm9uLWVtcHR5LgoJCWZ1bmN0aW9uIGZpbGVfc3RhdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICkgewoJCQlpZiAoIGluX2FycmF5KCAnemlwYXJjaGl2ZScsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCSR0aGlzLT5femlwID0gbmV3IFppcEFyY2hpdmU7CgkJCQlpZiAoICR0aGlzLT5femlwLT5vcGVuKCAkemlwX2ZpbGUgKSA9PT0gdHJ1ZSApIHsKCQkJCQlpZiAoICggJHN0YXRzID0gJHRoaXMtPl96aXAtPnN0YXROYW1lKCAkbG9jYXRlX2ZpbGUgKSApID09PSBmYWxzZSApIHsgLy8gRmlsZSBub3QgZm91bmQgaW4gemlwLgoJCQkJCQkkdGhpcy0+X3ppcC0+Y2xvc2UoKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmlsZSBub3QgZm91bmQgKHppcGFyY2hpdmUpIGZvciBzdGF0cycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJHRoaXMtPl96aXAtPmNsb3NlKCk7CgkJCQkJcmV0dXJuICRzdGF0czsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGNoZWNrIHN0YXRzIChsb29raW5nIGluICUxJHMpLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyIHRoZW4gemlwYXJjaGl2ZSBub3QgYXZhaWxhYmxlL2ZhaWxlZC4KCQkJaWYgKCBpbl9hcnJheSggJ3BjbHppcCcsICR0aGlzLT5femlwX21ldGhvZHMgKSApIHsKCQkJCXJlcXVpcmVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJJHRoaXMtPl96aXAgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCWlmICggKCAkZmlsZV9saXN0ID0gJHRoaXMtPl96aXAtPmxpc3RDb250ZW50KCkgKSA9PSAwICkgeyAvLyBJZiB6ZXJvLCB6aXAgaXMgY29ycnVwdCBvciBlbXB0eS4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICR0aGlzLT5femlwLT5lcnJvckluZm8oIHRydWUgKSApOwoJCQkJfSBlbHNlIHsKCQkJCQlmb3JlYWNoKCAkZmlsZV9saXN0IGFzICRmaWxlICkgewoJCQkJCQlpZiAoICRmaWxlWydmaWxlbmFtZSddID09ICRsb2NhdGVfZmlsZSApIHsgLy8gRm91bmQgZmlsZS4KCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdVbmFibGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHM6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJCgkJCgkJCgkJLyoJZ2V0X3ppcF9tZXRob2RzKCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgdGhlIHppcCBtZXRob2RzLiBVc2VmdWwgZm9yIHRyYW5zaWVudCBjYWNoaW5nIGZvciBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQkJQXJyYXkgb2YgbWV0aG9kcy4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X3ppcF9tZXRob2RzKCkgewoJCQkkdGhpcy0+X3ppcF9tZXRob2RzOwoJCX0gLy8gRW5kIGdldF96aXBfbWV0aG9kcygpOwoJCQoJCQoJCQoJCS8qKgoJCSAqCWFkZF9kaXJlY3RvcnlfdG9femlwKCkKCQkgKgoJCSAqCUFkZHMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgb3IgZXhpc3RpbmcgKFRPRE86IG5vdCB5ZXQgYXZhaWxhYmxlKSBaSVAgZmlsZS4KCQkgKgoJCSAqCSR6aXBfZmlsZQkJCQkJc3RyaW5nCQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gY3JlYXRlLgoJCSAqCSRhZGRfZGlyZWN0b3J5CQkJCXN0cmluZwkJCQkJCUZ1bGwgZGlyZWN0b3J5IHRvIGFkZCB0byB6aXAgZmlsZS4KCQkgKgkkY29tcHJlc3Npb24JCQkJYm9vbGVhbgkJCQkJCVRydWUgdG8gZW5hYmxlIFpJUCBjb21wcmVzc2lvbiwKCQkgKgkJCQkJCQkJCQkJCQkJCShpZiBwb3NzaWJsZSB3aXRoIGF2YWlsYWJsZSB6aXAgbWV0aG9kcykKCQkgKgkkZXhjbHVkZXMJCQkJCWFycmF5KHN0cmluZ3MpCQkJCUFycmF5IG9mIHN0cmluZ3Mgb2YgcGF0aHMvZmlsZXMgdG8gZXhjbHVkZSBmcm9tIHppcHBpbmcsCgkJICoJCQkJCQkJCQkJCQkJCQkoaWYgcG9zc2libGUgd2l0aCBhdmFpbGFibGUgemlwIG1ldGhvZHMpLgoJCSAqCSR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeQlzdHJpbmcJCQkJCQlPcHRpb25hbC4gRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBkaXJlY3RvcnkgdG8gdGVtcG9yYXJpbHkgcGxhY2UgWklQCgkJICoJCQkJCQkJCQkJCQkJCQlmaWxlIHdoaWxlIGNyZWF0aW5nLiBVc2VzIHNhbWUgZGlyZWN0b3J5IGlmIG9taXR0ZWQuCgkJICoJJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZQlib29sZWFuCQkJCQkJVHJ1ZTogb25seSB1c2UgUENMWmlwLiBGYWxzZTogdHJ5IGV4ZWMgZmlyc3QgaWYgYXZhaWxhYmxlLAoJCSAqCQkJCQkJCQkJCQkJCQkJYW5kIGZhbGxiYWNrIHRvIGxlc3NlciBtZXRob2RzIGFzIHJlcXVpcmVkLgoJCSAqCgkJICoJQHJldHVybgkJCQkJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJZnVuY3Rpb24gYWRkX2RpcmVjdG9yeV90b196aXAoICR6aXBfZmlsZSwgJGFkZF9kaXJlY3RvcnksICRjb21wcmVzc2lvbiwgJGV4Y2x1ZGVzID0gYXJyYXkoKSwgJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ID0gJycsICRmb3JjZV9jb21wYXRpYmlsaXR5X21vZGUgPSBmYWxzZSApIHsKCQkJaWYgKCAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlID09PSB0cnVlICkgewoJCQkJJHppcF9tZXRob2RzID0gYXJyYXkoICdwY2x6aXAnICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdGb3JjZWQgY29tcGF0aWJpbGl0eSBtb2RlIChQQ0xaaXApIGJhc2VkIG9uIHNldHRpbmdzLiBUaGlzIGlzIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCX0gZWxzZSB7CgkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgYWxsIGF2YWlsYWJsZSB6aXAgbWV0aG9kcyBpbiBwcmVmZXJyZWQgb3JkZXIuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQl9CgkJCQoJCQkkYXBwZW5kID0gZmFsc2U7IC8vIFBvc3NpYmxlIGZ1dHVyZSBvcHRpb24gdG8gYWxsb3cgYXBwZW5kaW5nIGlmIGZpbGUgZXhpc3RzLgoJCQkKCQkJLy8gTm9ybWFsaXplICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSB0byBmb3JtYXQ6IC94eHgveXl5L3p6ei8uCgkJCSR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSA9IHJ0cmltKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnksICcvXFwnICkgLiAnLyc7CgkJCQoJCQlpZiAoICFlbXB0eSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQlpZiAoICFmaWxlX2V4aXN0cyggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7IC8vIENyZWF0ZSB0ZW1wIGRpciBpZiBpdCBkb2VzIG5vdCBleGlzdC4KCQkJCQlta2RpciggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICk7CgkJCQl9CgkJCX0KCQkJCgkJCWlmICggaXNfYXJyYXkoICRleGNsdWRlcyApICkgewoJCQkJJGV4Y2x1ZGVzX3RleHQgPSBpbXBsb2RlKCAnLCcsICRleGNsdWRlcyApOwoJCQl9IGVsc2UgewoJCQkJJGV4Y2x1ZGVzX3RleHQgPSAnKGluIGZpbGU6IGAnIC4gJGV4Y2x1ZGVzIC4gJ2ApJzsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdDcmVhdGluZyBaSVAgZmlsZScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJHppcF9maWxlIC4gJ2AuICcgLiBfXygnQWRkaW5nIGRpcmVjdG9yeScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJGFkZF9kaXJlY3RvcnkgLiAnYC4gJyAuIF9fKCdDb21wcmVzc2lvbicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbXByZXNzaW9uIC4gJzsgJyAuIF9fKCdFeGNsdWRlcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGV4Y2x1ZGVzX3RleHQgKTsKCQkJdW5zZXQoICRleGNsdWRlc190ZXh0ICk7CgkJCQoJCQlpZiAoIGluX2FycmF5KCAnZXhlYycsICR6aXBfbWV0aG9kcyApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgZXhlYygpIG1ldGhvZCBmb3IgWklQLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJJGNvbW1hbmQgPSAnemlwIC1xIC1yJzsKCQkJCQoJCQkJaWYgKCAkY29tcHJlc3Npb24gIT09IHRydWUgKSB7CgkJCQkJJGNvbW1hbmQgLj0gJyAtMCc7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyBjb21wcmVzc2lvbiBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQl9CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUgKSApIHsKCQkJCQlpZiAoICRhcHBlbmQgPT09IHRydWUgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1pJUCBmaWxlIGV4aXN0cy4gQXBwZW5kaW5nIGJhc2VkIG9uIG9wdGlvbnMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkY29tbWFuZCAuPSAnIC1nJzsKCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaSVAgZmlsZSBleGlzdHMuIERlbGV0aW5nICYgd3JpdGluZyBiYXNlZCBvbiBvcHRpb25zLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJdW5saW5rKCAkemlwX2ZpbGUgKTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCS8vJGNvbW1hbmQgLj0gIiAtciI7CgkJCQkKCQkJCS8vIFNldCB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHN0b3JlIFpJUCB3aGlsZSBpdCdzIGJlaW5nIGdlbmVyYXRlZC4KCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkkY29tbWFuZCAuPSAiIC1iICd7JHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5fSciOwoJCQkJfQoJCQkJCgkJCQkkY29tbWFuZCAuPSAiICd7JHppcF9maWxlfScgLiI7CgkJCQkvLyAtaSAnKiciOyAvLyBOb3QgbmVlZGVkLiBaaXAgZGVmYXVsdHMgdG8gZG9pbmcgdGhpcy4gUmVtb3ZlZCBKdWx5IDEwLCAyMDEyIGZvciB2My4wLjQxLgoJCQkJCgkJCQkJCQkJCgkJCQkvLyBIYW5kbGUgZXhjbHVzaW9ucyBieSBwbGFjaW5nIHRoZW0gaW4gYW4gZXhjbHVzaW9uIHRleHQgZmlsZS4KCQkJCSRleGNsdXNpb25fZmlsZSA9ICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSAuICdleGNsdXNpb25zLnR4dCc7CgkJCQkkdGhpcy0+X3JlbmRlcl9leGNsdXNpb25zX2ZpbGUoICRleGNsdXNpb25fZmlsZSwgJGV4Y2x1ZGVzICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdVc2luZyBleGNsdXNpb24gZmlsZSBgJyAuICRleGNsdXNpb25fZmlsZSAuICdgLicgKTsKCQkJCSRjb21tYW5kIC49ICcgLXhAJyAuICIneyRleGNsdXNpb25fZmlsZX0nIjsKCQkJCQoJCQkJCgkJCQkkY29tbWFuZCAuPSAnIDI+JjEnOyAvLyAgMj4mMSByZWRpcmVjdHMgU1RERVJSIHRvIFNURE9VVAoJCQkJCgkJCQkkd29ya2luZ19kaXIgPSBnZXRjd2QoKTsKCQkJCWNoZGlyKCAkYWRkX2RpcmVjdG9yeSApOyAvLyBDaGFuZ2UgZGlyZWN0b3J5IHRvIHRoZSBwYXRoIHdlIGFyZSBhZGRpbmcuCgkJCQkKCQkJCWlmICggJHRoaXMtPl9leGVjcGF0aCAhPSAnJyApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVXNpbmcgY3VzdG9tIGV4ZWMoKSBwYXRoOiAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5fZXhlY3BhdGggKTsKCQkJCX0KCQkJCQoJCQkJLy8gUnVuIFpJUCBjb21tYW5kLgoJCQkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsgLy8gUnVubmluZyBXaW5kb3dzLiAobm90IGRhcndpbikKCQkJCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3ppcC5leGUnICkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ0F0dGVtcHRpbmcgdG8gdXNlIHByb3ZpZGVkIFdpbmRvd3MgemlwLmV4ZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRjb21tYW5kID0gc3RyX3JlcGxhY2UoICdcJycsICciJywgJGNvbW1hbmQgKTsgLy8gV2luZG93cyB3YW50cyBkb3VibGUgcXVvdGVzCgkJCQkJCSRjb21tYW5kID0gQUJTUEFUSCAuICRjb21tYW5kOwoJCQkJCX0KCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIGNvbW1hbmQgKFdpbmRvd3MpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkY29tbWFuZCApOwoJCQkJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJHRoaXMtPl9leGVjcGF0aCAuICRjb21tYW5kICk7CgkJCQl9IGVsc2UgeyAvLyBBbGxvdyBleGVjIHdhcm5pbmdzIG5vdCBpbiBXaW5kb3dzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyBjb21tYW5kIChMaW51eCknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRjb21tYW5kICk7CgkJCQkJbGlzdCggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKSA9ICR0aGlzLT5fY29tbWFuZGJ1ZGR5LT5leGVjdXRlKCAkdGhpcy0+X2V4ZWNwYXRoIC4gJGNvbW1hbmQgKTsKCQkJCX0KCQkJCQoJCQkJCgkJCQkvLyBDbGVhbnVwIGV4Y2x1c2lvbnMgZmlsZSBpZiBpdCBleGlzdHMuCgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgLiAnZXhjbHVzaW9ucy50eHQnICkgKSB7CgkJCQkJQHVubGluayggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5IC4gJ2V4Y2x1c2lvbnMudHh0JyApOwoJCQkJfQoJCQkJCgkJCQkKCQkJCXNsZWVwKCAxICk7CgkJCQkKCQkJCS8vIFdlIG1heSBub3QgaGF2ZSBhIHppcCBmaWxlIG9yIHdlIG1heSBoYXZlIG9uZSBidXQgdGhlcmUgd2FzIGVycm9yL3dhcm5pbmcgd2hlbiBwcm9kdWNpbmcgaXQKCQkJCS8vIE5vdGU6IEluIGV2ZW50IG9mIHdhcm5pbmdzIHdlIGNvdWxkIHN0aWxsIGdldCBhIHppcCBmaWxlIGlmIHRoZSBzY3JpcHQgdGVybWluYXRlcyB3aGlsc3QgemlwIGNvbW1hbmQgc3RpbGwgcnVubmluZwoJCQkJCgkJCQlpZiAoICggISBmaWxlX2V4aXN0cyggJHppcF9maWxlICkgKSB8fCAoICRleGVjX2V4aXRfY29kZSAhPSAwICkgKSB7CgkJCQkJCgkJCQkJLy8gTG9nIHRoZSBmYWlsdXJlCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ0Z1bGwgc3BlZWQgbW9kZSBkaWQgbm90IGNvbXBsZXRlLiBUcnlpbmcgY29tcGF0aWJpbGl0eSBtb2RlIG5leHQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJCS8vIENoZWNrIHdoZXRoZXIgYSB6aXAgZmlsZSB3YXMgYWN0dWFsbHkgcHJvZHVjZWQgaW4gdGhlIGJhY2t1cHMgZGlyZWN0b3J5IChhcyBvcHBvc2VkIHRvIHRoZSB0ZW1wIHppcCBkaXJlY3RvcnkpCgkJCQkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0V4ZWMgY29tbWFuZCByYW4gYnV0IFpJUCBmaWxlIGRpZCBub3QgZXhpc3QuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gV2UgZGlkIGdldCBhIHppcCBmaWxlIGJ1dCBjYW5ub3QgdHJ1ZXN0IGl0IHNvIG11c3QgZGVsZXRlIGl0CgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHppcF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdDbGVhbmluZyB1cCBkYW1hZ2VkIFpJUCBmaWxlLiBJc3N1ZSAjMzQ4OTMyODk5OC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCXVubGluayggJHppcF9maWxlICk7CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBOZWVkIHRvIGNsZWFuIHVwIGFueSB0ZW1wb3JhcnkgemlwIGRpcmVjdG9yeQoJCQkJCWlmICggZmlsZV9leGlzdHMoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnQ2xlYW5pbmcgdXAgaW5jb21wbGV0ZSB0ZW1wb3JhcnkgWklQIGZpbGUuIElzc3VlICMzNDM4OTQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSApIHsKCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVW5hYmxlIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgemlwIGRpcmVjdG9yeScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFdlIGdvdCBhIHppcCBmaWxlIGFuZCBubyBlcnJvcnMvd2FybmluZ3Mgc28gZ29vZCB0byBnbwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oICdGdWxsIHNwZWVkIG1vZGUgY29tcGxldGVkICYgZ2VuZXJhdGVkIFpJUCBmaWxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VuYWJsZSB0byBkZWxldGUgdGVtcG9yYXJ5IHppcCBkaXJlY3RvcnknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCXJldHVybiB0cnVlOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQljaGRpciggJHdvcmtpbmdfZGlyICk7CgkJCQkKCQkJCXVuc2V0KCAkY29tbWFuZCApOwoJCQkJdW5zZXQoICRleGNsdWRlICk7CgkJCQl1bnNldCggJGV4Y2x1ZGluZ19hZGRpdGlvbmFsICk7CgkJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4ZWMgY29tbWFuZCBkaWQgbm90IHN1Y2NlZWQuIEZhbGxpbmcgYmFjay4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJfQoJCQkKCQkJaWYgKCBpbl9hcnJheSggJ3BjbHppcCcsICR6aXBfbWV0aG9kcyApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnVXNpbmcgQ29tcGF0aWJpbGl0eSBNb2RlIGZvciBaSVAuIFRoaXMgaXMgc2xvd2VyIGFuZCBsZXNzIHJlbGlhYmxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ0lmIHlvdXIgYmFja3VwIHRpbWVzIG91dCBpbiBjb21wYXRpYmlsaXR5IG1vZGUgdHJ5IGRpc2FibGVkIHppcCBjb21wcmVzc2lvbi4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdXQVJOSU5HOiBEaXJlY3RvcnkvZmlsZSBleGNsdXNpb24gdW5hdmFpbGFibGUgaW4gQ29tcGF0aWJpbGl0eSBNb2RlLiBFdmVuIGV4aXN0aW5nIG9sZCBiYWNrdXBzIHdpbGwgYmUgYmFja2VkIHVwLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL2NsYXNzLXBjbHppcC5waHAnICk7CgkJCQkKCQkJCS8vIERldGVybWluZSB6aXAgZmlsZSBuYW1lIC8gcGF0aC4KCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkkcGNsemlwX2ZpbGUgPSAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgLiBiYXNlbmFtZSggJHppcF9maWxlICk7CgkJCQl9IGVsc2UgewoJCQkJCSRwY2x6aXBfZmlsZSA9ICR6aXBfZmlsZTsKCQkJCX0KCQkJCQoJCQkJaWYgKCAhZmlsZV9leGlzdHMoIGRpcm5hbWUoICRwY2x6aXBfZmlsZSApICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ3JlYXRpbmcgUENMWmlwIGZpbGUgZGlyZWN0b3J5IGAnIC4gZGlybmFtZSggJHBjbHppcF9maWxlICkgLiAnYC4nICk7CgkJCQkJbWtkaXIoIGRpcm5hbWUoICRwY2x6aXBfZmlsZSApICk7CgkJCQl9CgkJCQkKCQkJCS8vIEluc3RhbnRpYXRlIFBjbFppcCBPYmplY3QuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdQY2xaaXAgemlwIGZpbGVuYW1lOiBgJyAuICRwY2x6aXBfZmlsZSAuICdgLicgKTsKCQkJCSRwY2x6aXAgPSBuZXcgUGNsWmlwKCAkcGNsemlwX2ZpbGUgKTsKCQkJCQoJCQkJaWYgKCAkY29tcHJlc3Npb24gIT09IHRydWUgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUENMWmlwIGNvbXByZXNzaW9uIGRpc2FibGVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkkYXJndW1lbnRzID0gYXJyYXkoICRhZGRfZGlyZWN0b3J5LCBQQ0xaSVBfT1BUX05PX0NPTVBSRVNTSU9OLCBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRILCAkYWRkX2RpcmVjdG9yeSApOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQQ0xaaXAgY29tcHJlc3Npb24gZW5hYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJJGFyZ3VtZW50cyA9IGFycmF5KCAkYWRkX2RpcmVjdG9yeSwgUENMWklQX09QVF9SRU1PVkVfUEFUSCwgJGFkZF9kaXJlY3RvcnkgKTsKCQkJCX0KCQkJCQoJCQkJJG1vZGUgPSAnY3JlYXRlJzsKCQkJCWlmICggZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICYmICggJGFwcGVuZCA9PT0gdHJ1ZSApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1pJUCBmaWxlIGV4aXN0cy4gQXBwZW5kaW5nIGJhc2VkIG9uIG9wdGlvbnMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRtb2RlID0gJ2FwcGVuZCc7CgkJCQl9CgkJCQkKCQkJCWlmICggJG1vZGUgPT0gJ2FwcGVuZCcgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnQXBwZW5kaW5nIHRvIFpJUCBmaWxlIHZpYSBQQ0xaaXAuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRyZXR2YWwgPSBjYWxsX3VzZXJfZnVuY19hcnJheSggYXJyYXkoICYkcGNsemlwLCAnYWRkJyApLCAkYXJndW1lbnRzICk7CgkJCQl9IGVsc2UgeyAvLyBjcmVhdGUKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnQ3JlYXRpbmcgWklQIGZpbGUgdmlhIFBDTFppcCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOicgLiBpbXBsb2RlKCAnOycsICRhcmd1bWVudHMgKSApOwoJCQkJCS8vZXJyb3JfbG9nKCAncGNsemlwIGFyZ3M6ICcgLiBwcmludF9yKCAkYXJndW1lbnRzLCB0cnVlICkgLiAiXG4iICk7CgkJCQkJJHJldHZhbCA9IGNhbGxfdXNlcl9mdW5jX2FycmF5KCBhcnJheSggJiRwY2x6aXAsICdjcmVhdGUnICksICRhcmd1bWVudHMgKTsKCQkJCX0KCQkJCQoJCQkJLy8gTW92ZSB0aGUgemlwIGZpbGUgaWYgd2Ugd2VyZSBjcmVhdGluZyBpdCBpbiBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgLiBiYXNlbmFtZSggJHppcF9maWxlICkgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVuYW1pbmcgUENMWmlwIEZpbGUuLi4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCXJlbmFtZSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5IC4gYmFzZW5hbWUoICR6aXBfZmlsZSApLCAkemlwX2ZpbGUgKTsKCQkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHppcF9maWxlICkgKSB7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdSZW5hbWluZyBQQ0xaaXAgc3VjY2Vzcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdSZW5hbWluZyBQQ0xaaXAgZmFpbHVyZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3JhcnkgUENMWmlwIGFyY2hpdmUgZmlsZSBleHBlY3RlZCBidXQgbm90IGZvdW5kLiBQbGVhc2UgdmVyaWZ5IHBlcm1pc3Npb25zIG9uIHRoZSBaSVAgYXJjaGl2ZSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJLy8gV29yayBvdXQgd2hldGhlciB3ZSBoYXZlIGEgcHJvYmxlbSBvciBub3QKCQkJCWlmICggaXNfYXJyYXkoICRyZXR2YWwgKSApIHsKCQkJCQoJCQkJCS8vIEl0J3MgYW4gYXJyYXkgc28gYSBnb29kIHJlc3VsdAoJCQkJCSRleGl0Y29kZSA9IDA7CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBOb3QgYW4gYXJyYXkgc28gYSBiYWQgZXJyb3IgY29kZQoJCQkJCSRleGl0Y29kZSA9ICRwY2x6aXAtPmVycm9yQ29kZSgpOwoJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIENvbnZlbmllbmNlIGZvciBoYW5kbGluZyBkaWZmZXJlbnQgc2NhbmFyaW9zCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCS8vIFNlZSBpZiB3ZSBjYW4gZmlndXJlIG91dCB3aGF0IGhhcHBlbmVkIC0gbm90ZSB0aGF0ICRleGl0Y29kZSBjb3VsZCBiZSBub24temVybyBmb3IgYSB3YXJuaW5nIG9yIGVycm9yCgkJCQkvLyBUaGVyZSBtYXkgYmUgbm8gemlwIGZpbGUgYXQgYWxsIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gY3JlYXRpbmcgaXQgb3IgaXQgbWF5IGJlIGxlZnQgaW4gdGhlIHRlbXAKCQkJCS8vIGRpcmVjdG9yeSBpZiBpdCBjb3VsZG4ndCBiZSBtb3ZlZAoJCQkJaWYgKCAoICEgZmlsZV9leGlzdHMoICR6aXBfZmlsZSApICkgfHwgKCAkZXhpdGNvZGUgIT0gMCApICkgewoJCQkJCgkJCQkJLy8gSWYgd2UgaGFkIGEgbm9uLXplcm8gZXhpdCBjb2RlIHRoZW4gc2hvdWxkIHJlcG9ydCBpdCAoZmlsZSBtYXkgb3IgbWF5IG5vdCBiZSBjcmVhdGVkKQoJCQkJCWlmICggJGV4aXRjb2RlICE9IDAgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBwcm9jZXNzIGV4aXQgY29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRleGl0Y29kZSApOwoJCQkJCQkKCQkJCQl9CgkKCQkJCQkvLyBSZXBvcnQgd2hldGhlciBvciBub3QgdGhlIHppcCBmaWxlIHdhcyBjcmVhdGVkCQkJCQoJCQkJCWlmICggISBmaWxlX2V4aXN0cyggJHppcF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgQXJjaGl2ZSBmaWxlIG5vdCBjcmVhdGVkIC0gY2hlY2sgcHJvY2VzcyBleGl0IGNvZGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgY3JlYXRlZCBidXQgd2lsbCBiZSByZW1vdmVkIC0gY2hlY2sgcHJvY2VzcyBleGl0IGNvZGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCgkJCQkJCUB1bmxpbmsoICR6aXBfZmlsZSApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gUHV0IHRoZSBlcnJvciBpbmZvcm1hdGlvbiBpbnRvIGFuIGFycmF5IGZvciBjb25zaXN0ZW5jeQoJCQkJCSR6aXBfb3V0cHV0W10gPSAkcGNsemlwLT5lcnJvckluZm8oIHRydWUgKTsKCQkJCQkKCQkJCQkvLyBOb3cgd2UgZG9uJ3QgbW92ZSBpdCAoYmVjYXVzZSBlaXRoZXIgaXQgZG9lc24ndCBleGlzdCBvciBtYXkgYmUgaW5jb21wbGV0ZSkgYnV0IHdlJ2xsIHNob3cgYW55IGVycm9yL3dhcnRuaW5nIG91dHB1dAoJCQkJCWlmICggIWVtcHR5KCAkemlwX291dHB1dCApICkgewoJCQkJCQoJCQkJCQkvLyBBc3N1bWUgd2UgZG9uJ3QgaGF2ZSBhIGxvdCBvZiBsaW5lcyBmb3Igbm93IC0gY291bGQgYmUgcmlza3kgYXNzdW1wdGlvbiEKCQkJCQkJZm9yZWFjaCAoICR6aXBfb3V0cHV0IGFzICRsaW5lICkgewoJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgcHJvY2VzcyByZXBvcnRlZDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRsaW5lICk7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCgkJCQkJCS8vIEV4dHJhIGRldGFpbHMgZm9yIHBhcnRpY3VsYXIgZXJyb3IKCQkJCQkJaWYgKCBmYWxzZSAhPT0gc3RycG9zKCAkcGNsemlwLT5lcnJvckluZm8oIHRydWUgKSwgJ1BDTFpJUF9FUlJfUkVBRF9PUEVOX0ZBSUwnICkgKSB7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnUENMWklQX0VSUl9SRUFEX09QRU5fRkFJTCBkZXRhaWxzOiBUaGlzIGVycm9yIGluZGljYXRlcyB0aGF0IGZvcGVuIGZhaWxlZCAocmV0dXJuZWQgZmFsc2UpIHdoZW4gdHJ5aW5nIHRvIG9wZW4gdGhlIGZpbGUgaW4gdGhlIG1vZGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgZHVlIHRvIHBlcm1pc3Npb25zLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCX0KCQkJCQkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBPbmUgd2F5IG9yIGFub3RoZXIgd2UgZmFpbGVkCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIEdvdCBmaWxlIHdpdGggbm8gZXJyb3Igb3Igd2FybmluZ3MgYXQgYWxsIHNvIGl0IHNob3VsZCBiZSBnb29kIHRvIGdvCgkJCQkJCgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHppcF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBBcmNoaXZlIGZpbGUgbW92ZWQgdG8gbG9jYWwgYXJjaGl2ZSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCB3aXRoIG5vIGVycm9ycyBvciB3YXJuaW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNvdWxkIG5vdCBiZSBtb3ZlZCB0byBsb2NhbCBhcmNoaXZlIGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQkJCQkKCQkJCX0JCQkKCQoJCQkJaWYgKCAhZW1wdHkoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgewoJCQkJCgkJCQkJLy8gQ2xlYW51cCB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdpbGwgaGF2ZSBhbGwgZGV0cml0dXMgYW5kIG1heWJlIGluY29tcGxldGUgemlwIGZpbGUJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdSZW1vdmluZyB0ZW1wb3JhcnkgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKTsKCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQkJaWYgKCAkcmVzdWx0ICkgcmV0dXJuICRyZXN1bHQ7CgkJCQkKCQkJfQoJCQkKCQkJLy8gSWYgd2UgbWFkZSBpdCB0aGlzIGZhciB0aGVuIHNvbWV0aGluZyBkaWRudCByZXN1bHQgaW4gYSBzdWNjZXNzLgoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCQoJCQoJCS8qKgoJCSAqCXVuemlwKCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKgkkemlwX2ZpbGUJCQkJCXN0cmluZwkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gY3JlYXRlLgoJCSAqCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCXN0cmluZwkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZQltaXhlZAkJZmFsc2UgKGRlZmF1bHQpOiB1c2UgYmVzdCBtZXRob2RzIGF2YWlsYWJsZSAoemlwIGV4ZWMgZmlyc3QpLCBmYWxsaW5nIGJhY2sgYXMgbmVlZGVkLgoJCSAqCQkJCQkJCQkJCQl6aXBhcmNoaXZlOiBmaXJzdCBmYWxsYmFjayBtZXRob2QuIChNZWRpdW0gcGVyZm9ybWFuY2UpCgkJICoJCQkJCQkJCQkJCXBjbHppcDogc2Vjb25kIGZhbGxiYWNrIG1ldGhvZC4gKFdvcnN0IHBlcmZvcm1hbmNlOyBidWdneSkKCQkgKgoJCSAqCUByZXR1cm5gYAkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlmdW5jdGlvbiB1bnppcCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlID0gZmFsc2UgKSB7CgkJCQoJCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gcnRyaW0oICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICdcXC8nICkgLiAnLyc7IC8vIE1ha2Ugc3VyZSB0cmFpbGluZyBzbGFzaCBleGlzdHMgdG8gbm9ybWFsaXplLgoJCQkKCQkJaWYgKCAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlID09ICd6aXBhcmNoaXZlJyApIHsKCQkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCAnemlwYXJjaGl2ZScgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ0ZvcmNlZCBjb21wYXRpYmlsaXR5IG1vZGUgKFppcEFyY2hpdmU7IG1lZGl1bSBzcGVlZCkgYmFzZWQgb24gc2V0dGluZ3MuIFRoaXMgaXMgc2xvd2VyIGFuZCBsZXNzIHJlbGlhYmxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJfSBlbHNlaWYgKCAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlID09ICdwY2x6aXAnICkgewoJCQkJJHppcF9tZXRob2RzID0gYXJyYXkoICdwY2x6aXAnICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdGb3JjZWQgY29tcGF0aWJpbGl0eSBtb2RlIChQQ0xaaXA7IHNsb3cgc3BlZWQpIGJhc2VkIG9uIHNldHRpbmdzLiBUaGlzIGlzIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCX0gZWxzZSB7CgkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVXNpbmcgYWxsIGF2YWlsYWJsZSB6aXAgbWV0aG9kcyBpbiBwcmVmZXJyZWQgb3JkZXIuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQl9CgkJCQoJCQlpZiAoIGluX2FycmF5KCAnZXhlYycsICR6aXBfbWV0aG9kcyApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgJ1N0YXJ0aW5nIGhpZ2hzcGVlZCBleHRyYWN0aW9uIChleGVjKS4uLiBUaGlzIG1heSB0YWtlIGEgbW9tZW50Li4uJyApOwoJCQkJCgkJCQkkY29tbWFuZCA9ICd1bnppcCAtcW8nOyAvLyBxID0gcXVpZXQsIG8gPSBvdmVyd3JpdGUgd2l0aG91dCBwcm9tcHQuCgkJCQkkY29tbWFuZCAuPSAiICckemlwX2ZpbGUnIC1kICckZGVzdGluYXRpb25fZGlyZWN0b3J5JyAteCAnaW1wb3J0YnVkZHkucGhwJyI7IC8vIHggZXhjbHVkZXMgaW1wb3J0YnVkZHkgc2NyaXB0IHRvIHByZXZlbnQgb3ZlcndyaXRpbmcgbmV3ZXIgaW1wb3J0YnVkZHkgb24gZXh0cmFjdCBzdGVwLgoJCQkKCQkJCS8vIEhhbmRsZSB3aW5kb3dzLgoJCQkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsgLy8gUnVubmluZyBXaW5kb3dzLiAobm90IGRhcndpbikKCQkJCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3VuemlwLmV4ZScgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgJ0F0dGVtcHRpbmcgdG8gdXNlIFdpbmRvd3MgdW56aXAuZXhlLicgKTsKCQkJCQkJJGNvbW1hbmQgPSBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApOyAvLyBXaW5kb3dzIHdhbnRzIGRvdWJsZSBxdW90ZXMKCQkJCQkJJGNvbW1hbmQgPSBBQlNQQVRIIC4gJGNvbW1hbmQ7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQkkY29tbWFuZCAuPSAnICAyPiYxJzsgLy8gUmVkaXJlY3QgU1RERVJSIHRvIFNURE9VVC4KCQkJCQoJCQkJaWYgKCAkdGhpcy0+X2V4ZWNwYXRoICE9ICcnICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdVc2luZyBjdXN0b20gZXhlYygpIHBhdGg6ICcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRoaXMtPl9leGVjcGF0aCApOwoJCQkJfQoJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSdW5uaW5nIFpJUCBjb21tYW5kLiBUaGlzIG1heSB0YWtlIGEgbW9tZW50LicgKTsKCQkJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJHRoaXMtPl9leGVjcGF0aCAuICRjb21tYW5kICk7CgkJCQkKCQkJCSRmYWlsZWQgPSBmYWxzZTsgLy8gRGVmYXVsdC4KCQkJCQoJCQkJaWYgKCAhZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiAnd3AtbG9naW4ucGhwJyApICYmICFmaWxlX2V4aXN0cyggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuICdkYl8xLnNxbCcgKSAmJiAhZmlsZV9leGlzdHMoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiAnd29yZHByZXNzL3dwLWxvZ2luLnBocCcgKSApIHsgLy8gd3AtbG9naW4ucGhwIGZvciBXb3JkUHJlc3MsIGRiXzEuc3FsIGZvciBEQiBiYWNrdXAsIHdvcmRwcmVzcy93cC1sb2dpbi5waHAgZm9yIGZyZXNoIFdvcmRQcmVzcyBkb3dubG9hZGVkIGZyb20gd3Aub3JnIGZvciBNUyBleHBvcnQKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnQm90aCB3cC1sb2dpbi5waHAgKGZ1bGwgYmFja3VwcykgYW5kIGRiXzEuc3FsIChkYXRhYmFzZSBvbmx5IGJhY2t1cHMpIGFyZSBtaXNzaW5nIGFmdGVyIGV4dHJhY3Rpb24uIFVuemlwIHByb2Nlc3MgYXBwZWFycyB0byBoYXZlIGZhaWxlZC4nICk7CgkJCQkJJGZhaWxlZCA9IHRydWU7CgkJCQl9CgkJCQkKCQkJCWlmICggJGV4ZWNfZXhpdF9jb2RlICE9ICcwJyApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAgJ0V4aXQgY29kZSBgJyAuICRleGVjX2V4aXRfY29kZSAuICdgIGluZGljYXRlcyBhIHByb2JsZW0gd2FzIGVuY291bnRlcmVkLicgKTsKCQkJCQkkZmFpbGVkID0gdHJ1ZTsKCQkJCX0KCQkJCQoJCQkJLy8gU29tZXRpbWVzIGV4ZWMgcmV0dXJucyBzdWNjZXNzIGNvZGVzIGJ1dCBuZXZlciBleHRyYWN0ZWQgYWN0dWFsIGZpbGVzLiBEbyBhIGNoZWNrIHRvIG1ha2Ugc3VyZSBrbm93biBmaWxlcyB3ZXJlIGV4dHJhY3RlZCB0byB2ZXJpZnkgYWdhaW5zdCB0aGF0LgoJCQkJaWYgKCAkZmFpbGVkID09PSBmYWxzZSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdGaWxlIGV4dHJhY3Rpb24gY29tcGxldGUuJyApOwoJCQkJCXJldHVybiB0cnVlOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICAnRmFsbGluZyBiYWNrIHRvIG5leHQgY29tcGF0aWJpbGl0eSBtb2RlLicgKTsKCQkJCX0KCQkJfQoJCQkKCQkJaWYgKCBpbl9hcnJheSggJ3ppcGFyY2hpdmUnLCAkemlwX21ldGhvZHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgICdTdGFydGluZyBtZWRpdW0gc3BlZWQgZXh0cmFjdGlvbiAoemlwYXJjaGl2ZSkuLi4gVGhpcyBtYXkgdGFrZSBhIG1vbWVudC4uLicgKTsKCQkJCQoJCQkJJHppcCA9IG5ldyBaaXBBcmNoaXZlOwoJCQkJaWYgKCAkemlwLT5vcGVuKCAkemlwX2ZpbGUgKSA9PT0gdHJ1ZSApIHsKCQkJCQlpZiAoIHRydWUgPT09ICR6aXAtPmV4dHJhY3RUbyggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICAnWmlwQXJjaGl2ZSBleHRyYWN0aW9uIHN1Y2Nlc3MuJyApOwoJCQkJCQkkemlwLT5jbG9zZSgpOwoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkemlwLT5jbG9zZSgpOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICAnRXJyb3I6IFppcEFyY2hpdmUgd2FzIGF2YWlsYWJsZSBidXQgZmFpbGVkIGV4dHJhY3RpbmcgZmlsZXMuICBGYWxsaW5nIGJhY2sgdG8gbmV4dCBjb21wYXRpYmlsaXR5IG1vZGUuJyApOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAgJ0Vycm9yOiBVbmFibGUgdG8gb3BlbiB6aXAgZmlsZSB2aWEgWmlwQXJjaGl2ZS4gRmFsbGluZyBiYWNrIHRvIG5leHQgY29tcGF0aWJpbGl0eSBtb2RlLicgKTsKCQkJCX0KCQkJfQoJCQkKCQkJaWYgKCBpbl9hcnJheSggJ3BjbHppcCcsICR6aXBfbWV0aG9kcyApICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgJ1N0YXJ0aW5nIGxvdyBzcGVlZCBleHRyYWN0aW9uIChwY2x6aXApLi4uIFRoaXMgbWF5IHRha2UgYSBtb21lbnQuLi4nICk7CgkJCQkKCQkJCWlmICggIWNsYXNzX2V4aXN0cyggJ1BjbFppcCcgKSApIHsKCQkJCQkkcGNsemlwX2ZpbGUgPSBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJzsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdQQ0xaaXAgY2xhc3Mgbm90IGZvdW5kLiBBdHRlbXB0aW5nIHRvIGxvYWQgZnJvbSBgJyAuICRwY2x6aXBfZmlsZSAuICdgLicgKTsKCQkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkcGNsemlwX2ZpbGUgKSApIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBgJyAuICRwY2x6aXBfZmlsZSAuICdgLicgKTsKCQkJCQkJcmVxdWlyZV9vbmNlKCAkcGNsemlwX2ZpbGUgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdQQ0xaaXAgZmlsZSBub3QgZm91bmQ6IGAnIC4gJHBjbHppcF9maWxlIC4gJ2AuJyApOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJJGFyY2hpdmUgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCSRyZXN1bHQgPSAkYXJjaGl2ZS0+ZXh0cmFjdCgpOyAvLyBFeHRyYWN0IHRvIGN1cnJlbnQgZGlyZWN0b3J5LiBFeHBsaWNpdHkgdXNpbmcgUENMWklQX09QVF9QQVRIIHJlc3VsdHMgaW4gZXh0cmFjdGlvbiB0byBhIFBDTFpJUF9PUFRfUEFUSCBzdWJmb2xkZXIuCgkJCQkKCQkJCWlmICggMCA9PSAkcmVzdWx0ICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgICdQQ0xaaXAgRmFpbHVyZTogJyAuICRhcmNoaXZlLT5lcnJvckluZm8oIHRydWUgKSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgICdMb3cgc3BlZWQgKFBDTFppcCkgZXh0cmFjdGlvbiBmYWlsZWQuJywgJGFyY2hpdmUtPmVycm9ySW5mbyggdHJ1ZSApICk7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBOb3RoaW5nIHN1Y2NlZWRlZCBpZiB3ZSBtYWRlIGl0IHRoaXMgZmFyLi4uCgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJCgkJCgkJLy8gVGVzdCBhdmFpbGFiaWxpdHkgb2YgWmlwQXJjaGl2ZSBhbmQgdGhhdCBpdCBhY3R1YWxseSB3b3Jrcy4KCQlmdW5jdGlvbiB0ZXN0X3ppcGFyY2hpdmUoKSB7CgkJCWlmICggY2xhc3NfZXhpc3RzKCAnWmlwQXJjaGl2ZScgKSApIHsKCQkJCSR0ZXN0X2ZpbGUgPSAkdGhpcy0+X3RlbXBkaXIgLiAndGVtcF90ZXN0XycgLiB1bmlxaWQoKSAuICcuemlwJzsKCQkJCQoJCQkJJHppcCA9IG5ldyBaaXBBcmNoaXZlOwoJCQkJaWYgKCAkemlwLT5vcGVuKCAkdGVzdF9maWxlLCBaSVBBUkNISVZFOjpDUkVBVEUgfCBaSVBBUkNISVZFOjpPVkVSV1JJVEUgKSA9PT0gdHJ1ZSApIHsKCQkJCQkkemlwLT5hZGRGaWxlKCBfX0ZJTEVfXywgJ3RoaXNfaXNfYV90ZXN0LnR4dCcpOwoJCQkJCSR6aXAtPmNsb3NlKCk7CgkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgewoJCQkJCQl1bmxpbmsoICR0ZXN0X2ZpbGUgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwQXJjaGl2ZSB0ZXN0IHBhc3NlZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcEFyY2hpdmUgdGVzdCBmYWlsZWQ6IFppcCBmaWxlIG5vdCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcEFyY2hpdmUgdGVzdCBGQUlMRUQ6IFVuYWJsZSB0byBjcmVhdGUvb3BlbiB6aXAgZmlsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoJCQoJCQoJCQoJCS8qCWdldF9maWxlX2xpc3QoKQoJCSAqCQoJCSAqCUdldCBhbiBhcnJheSBvZiBhbGwgZmlsZXMgaW4gYSB6aXAgZmlsZS4KCQkgKgkKCQkgKglAcGFyYW0JCQoJCSAqCUByZXR1cm4JCWFycmF5CQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfZmlsZV9saXN0KCAkemlwX2ZpbGUgKSB7CgkJCgkJCSRmaWxlX2xpc3QgPSBhcnJheSgpOwoJCQkKCQkJLy8gVXNlIFppcEFyY2hpdmUgaWYgYXZhaWxhYmxlCgkJCWlmICggaW5fYXJyYXkoICd6aXBhcmNoaXZlJywgJHRoaXMtPl96aXBfbWV0aG9kcyApICkgewoJCQkKCQkJCS8vIE1ha2UgZG91Ymx5IHN1cmUgaXQgaXMgYXZhaWxhYmxlCgkJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1ppcEFyY2hpdmUnLCBmYWxzZSkgKSB7CgkJCQkKCQkJCQkkemEgPSBuZXcgWmlwQXJjaGl2ZSgpOwoJCQkJCSRyZXN1bHQgPSAkemEtPm9wZW4oICR6aXBfZmlsZSApOwoJCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvayBhbmQgaXQgaGFzIGNvbnRlbnQKCQkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJCWlmICggKCAkZmlsZV9jb3VudCA9ICR6YS0+bnVtRmlsZXMgKSA+IDAgKSB7CgkJCQkJCgkJCQkJCQkvLyBHZXQgZWFjaCBmaWxlIGluIHNlcXVlbmNlIGJ5IGluZGV4IGFuZCBnZXQgdGhlIHByb3BlcnRpZXMKCQkJCQkJCWZvciggJGkgPSAwOyAkaSA8ICRmaWxlX2NvdW50OyAkaSsrICl7CgkJCQkJCQkKCQkJCQkJCQkkc3RhdCA9ICR6YS0+c3RhdEluZGV4KCAkaSApOwoJCQkJCQkJCQoJCQkJCQkJCS8vIEFzc3VtZSBhbGwgdGhlc2Uga2V5cyBkbyBleGlzdCAoY29uc2lkZXIgdGVzdGluZykKCQkJCQkJCQkkZmlsZV9saXN0W10gPSBhcnJheSgKCQkJCQkJCQkJJHN0YXRbJ25hbWUnXSwKCQkJCQkJCQkJJHN0YXRbJ3NpemUnXSwKCQkJCQkJCQkJJHN0YXRbJ2NvbXBfc2l6ZSddLAoJCQkJCQkJCQkkc3RhdFsnbXRpbWUnXSwKCQkJCQkJCQkpOwoJCQkJCQkJCQoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCSR6YS0+Y2xvc2UoKTsKCQkJCQkJCgkJCQkJCXJldHVybiAkZmlsZV9saXN0OwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBDb3VsZG4ndCBvcGVuIGFyY2hpdmUgLSBkcm9wIHRocm91Z2ggYXMgbWF5YmUgb3RoZXIgbWV0aG9kIHdpbGwgc3VjY2VlZD8KCQkJCQkJJGVycm9yX3N0cmluZyA9ICR0aGlzLT56aXBhcmNoaXZlX2Vycm9yX2luZm8oICRyZXN1bHQgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGxpc3QgY29udGVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBEcm9wcGVkIHRocm91Z2ggYmVjYXVzZSBaaXBBcmNoaXZlIG5vdCBhdmFpbGFibGUgb3IgZmFpbGVkIHRvIG9wZW4gZmlsZQoJCQlpZiAoIGluX2FycmF5KCAncGNsemlwJywgJHRoaXMtPl96aXBfbWV0aG9kcyApICkgewoJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGl0CgkJCQlpZiAoICFjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSApICkgewoJCQkJCgkJCQkJLy8gSXQncyBub3QgYWxyZWFkeSBsb2FkZWQgc28gdHJ5IGFuZCBmaW5kL2xvYWQgaXQgZnJvbSBwb3NzaWJsZSBsb2NhdGlvbnMKCQkJCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL2NsYXNzLXBjbHppcC5waHAnICkgKSB7CgkJCQkJCgkJCQkJCS8vIFJ1bm5pbmcgdW5kZXIgV29yZFByZXNzCgkJCQkJCUBpbmNsdWRlX29uY2UoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBmaWxlX2V4aXN0cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCcgKSApIHsKCQkJCQkKCQkJCQkJLy8gUnVubmluZyBTdGFuZGFsb25lIChpbXBvcnRidWRkeSkKCQkJCQkJQGluY2x1ZGVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCcgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2UgZGlkIGxvYWQgaXQKCQkJCWlmICggY2xhc3NfZXhpc3RzKCAnUGNsWmlwJywgZmFsc2UgKSApIHsKCQkJCQoJCQkJCSR6YSA9IG5ldyBQY2xaaXAoICR6aXBfZmlsZSApOwoJCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvayBhbmQgaXQgaGFzIGNvbnRlbnQKCQkJCQlpZiAoICggJGNvbnRlbnRfbGlzdCA9ICR6YS0+bGlzdENvbnRlbnQoKSApICE9PSAwICkgewoJCQkJCQoJCQkJCQkkZmlsZV9jb3VudCA9IHNpemVvZiggJGNvbnRlbnRfbGlzdCApOwoJCQkJCQkKCQkJCQkJLy8gR2V0IGVhY2ggZmlsZSBpbiBzZXF1ZW5jZSBieSBpbmRleCBhbmQgZ2V0IHRoZSBwcm9wZXJ0aWVzCgkJCQkJCWZvciAoICRpID0gMDsgJGkgPCAkZmlsZV9jb3VudDsgJGkrKyApIHsKCQkJCQkJCgkJCQkJCQkkc3RhdCA9ICRjb250ZW50X2xpc3RbICRpIF07CgkJCQkJCQkKCQkJCQkJCS8vIEFzc3VtZSBhbGwgdGhlc2Uga2V5cyBkbyBleGlzdCAoY29uc2lkZXIgdGVzdGluZykKCQkJCQkJCSRmaWxlX2xpc3RbXSA9IGFycmF5KAoJCQkJCQkJCSRzdGF0WyAnZmlsZW5hbWUnIF0sCgkJCQkJCQkJJHN0YXRbICdzaXplJyBdLAoJCQkJCQkJCSRzdGF0WyAnY29tcHJlc3NlZF9zaXplJyBdLAoJCQkJCQkJCSRzdGF0WyAnbXRpbWUnIF0KCQkJCQkJCSk7CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQkJcmV0dXJuICRmaWxlX2xpc3Q7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIGRyb3AgdGhyb3VnaCBhcyBtYXliZSBvdGhlciBtZXRob2Qgd2lsbCBzdWNjZWVkPwoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oIHRydWUgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUGNsWmlwIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gbGlzdCBjb250ZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHBjbHppcCBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdwY2x6aXAgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGNsYXNzIFBjbFppcCBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIG5vIG1ldGhvZCB0byBsaXN0IGJhY2t1cCBjb250ZW50IHdhcyBhdmFpbGFibGUgb3Igd29ya2VkCgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfSAvLyBFbmQgZ2V0X2ZpbGVfbGlzdCgpLgoJCQoJCQoJCQkJCQkJCQoJCS8qCWF2YWlsYWJsZV96aXBfbWV0aG9kcygpCgkJICoJCgkJICoJVGVzdCBhdmFpbGFiaWxpdHkgb2YgemlwIG1ldGhvZHMgdG8gZGV0ZXJtaW5lIHdoaWNoIGV4aXN0IGFuZCBhY3R1YWxseSB3b3JrLgoJCSAqCURldGVjdHMgdGhlIGF2YWlsYWJsZSB6aXBwaW5nIG1ldGhvZHMgb24gdGhpcyBzZXJ2ZXIuIFRlc3RzIGNvbW1hbmQgbGluZSB6aXAgdmlhIGV4ZWMoKSwgUEhQJ3MgWmlwQXJjaGl2ZSwgb3IgZW11bGF0ZWQgemlwIHZpYSB0aGUgUEhQIFBDTFppcCBsaWJyYXJ5LgoJCSAqCVRPRE86IEFjdHVhbGx5IHRlc3QgdW56aXBwaW5nIGluIHVuemlwIG1vZGUgbm90IGp1c3QgemlwcGluZyBhbmQgYXNzdW1pbmcgdGhlIG90aGVyIHdpbGwgd29yawoJCSAqCQoJCSAqCUBwYXJhbQkJYm9vbGVhbgkJJHJldHVybl9iZXN0CQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkbW9kZQkJCVBvc3NpYmxlIHZhbHVlczogemlwLCB1bnppcAoJCSAqCUByZXR1cm4JCWFycmF5CQkJCQkJUG9zc2libGUgcmV0dXJuIHZhbHVlczogZXhlYywgemlwYXJjaGl2ZSwgcGNsemlwCgkJICovCgkJZnVuY3Rpb24gYXZhaWxhYmxlX3ppcF9tZXRob2RzKCAkcmV0dXJuX2Jlc3QgPSB0cnVlLCAkbW9kZSA9ICd6aXAnICkgewoJCQkkcmV0dXJuID0gYXJyYXkoKTsKCQkJJHRlc3RfZmlsZSA9ICR0aGlzLT5fdGVtcGRpciAuICd0ZW1wXycgLiB1bmlxaWQoKSAuICcuemlwJzsKCQkJCgkJCS8vIFRlc3QgY29tbWFuZC1saW5lIFpJUC4KCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkJJGNvbW1hbmQgPSAnemlwJzsKCQkJCSRydW5fZXhlY196aXBfdGVzdCA9IHRydWU7CgkJCQkKCQkJCS8vIEhhbmRsZSB3aW5kb3dzLgoJCQkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsgLy8gUnVubmluZyBXaW5kb3dzLiAobm90IGRhcndpbikKCQkJCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJ3ppcC5leGUnICkgKSB7CgkJCQkJCSRjb21tYW5kID0gQUJTUEFUSCAuICRjb21tYW5kOwoJCQkJCX0KCQkJCQkvLyBJZiB1bnppcCBtb2RlIGFuZCB1bnppcC5leGUgaXMgZm91bmQgdGhlbiBhc3N1bWUgd2UgaGF2ZSB0aGF0IG9wdGlvbiBmb3IgdW56aXBwaW5nIHNpbmNlIHdlIGFyZW50IGFjdHVhbGx5IHRlc3RpbmcgdW56aXAuCgkJCQkJaWYgKCAkbW9kZSA9PSAndW56aXAnICkgewoJCQkJCQkkcnVuX2V4ZWNfemlwX3Rlc3QgPSBmYWxzZTsKCQkJCQkJaWYgKCBmaWxlX2V4aXN0cyggQUJTUEFUSCAuICd1bnppcC5leGUnICkgKSB7CgkJCQkJCQlhcnJheV9wdXNoKCAkcmV0dXJuLCAnZXhlYycgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQkKCQkJCQkkZXhlY19wYXRocyA9IGFycmF5KCAnJyApOwoJCQkJfSBlbHNlIHsgLy8gKk5JWCBzeXN0ZW0uCgkJCQkJJGV4ZWNfcGF0aHMgPSBhcnJheSggJycsICcvdXNyL2Jpbi8nLCAnL3Vzci9sb2NhbC9iaW4vJywgJy91c3IvbG9jYWwvc2Jpbi8nLCAnL3Vzci9zYmluLycsICcvc2Jpbi8nLCAnL2Jpbi8nICk7IC8vIEluY2x1ZGUgcHJlY2VlZGluZyAmIHRyYWlsaW5nIHNsYXNoLgoJCQkJfQoJCQkJCgkJCQlpZiAoICRydW5fZXhlY196aXBfdGVzdCA9PT0gdHJ1ZSApIHsKCQkJCQkvLyBQb3NzaWJsZSBsb2NhdGlvbnMgdG8gZmluZCB0aGUgWklQIGV4ZWN1dGFibGUuIFN0YXJ0IHdpdGggYSBibGFuayBzdHJpbmcgdG8gYXR0ZW1wdCB0byBydW4gaW4gY3VycmVudCBkaXJlY3RvcnkuCgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnVHJ5aW5nIGV4ZWMoKSBpbiB0aGUgZm9sbG93aW5nIHBhdGhzOiBgJyAuIGltcGxvZGUoICcsJywgJGV4ZWNfcGF0aHMgKSAuICdgJyApOwoJCQkJCQoJCQkJCSRleGVjX2NvbXBsZXRpb24gPSBmYWxzZTsgLy8gZGVmYXVsdCBzdGF0ZS4KCQkJCQl3aGlsZSggJGV4ZWNfY29tcGxldGlvbiA9PT0gZmFsc2UgKSB7IC8vIENoZWNrIGFsbCBwb3NzaWJsZSB6aXAgcGF0aCBsb2NhdGlvbnMgc3RhcnRpbmcgd2l0aCBjdXJyZW50IGRpci4gVXN1YWxseSB0aGUgcGF0aCBpcyBzZXQgdG8gbWFrZSB0aGlzIHdvcmsgd2l0aG91dCBodW50aW5nLgoJCQkJCQlpZiAoIGVtcHR5KCAkZXhlY19wYXRocyApICkgewoJCQkJCQkJJGV4ZWNfY29tcGxldGlvbiA9IHRydWU7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCBfXyggJ0V4aGF1c3RlZCBhbGwga25vd24gZXhlYygpIHBhdGggcG9zc2liaWxpdGllcyB3aXRoIG5vIHN1Y2Nlc3MuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCSRwYXRoID0gYXJyYXlfc2hpZnQoICRleGVjX3BhdGhzICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdUcnlpbmcgZXhlYygpIFpJUCBwYXRoOicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBgJyAuICRwYXRoIC4gJ2AuJyApOwoJCQkJCQkKCQkJCQkJJGV4ZWNfY29tbWFuZCA9ICRwYXRoIC4gJGNvbW1hbmQgLiAnICInIC4gJHRlc3RfZmlsZSAuICciICInIC4gX19GSUxFX18gLiAnIiAgMj4mMSc7IC8vICAyPiYxIHRvIHJlZGlyZWN0IFNUUkVSUiB0byBTVERPVVQuCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ppcCB0ZXN0IGV4ZWMoKSBjb21tYW5kOiBgJyAuICRleGVjX2NvbW1hbmQgLiAnYCcgKTsKCQkJCQkJbGlzdCggJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKSA9ICR0aGlzLT5fY29tbWFuZGJ1ZGR5LT5leGVjdXRlKCAkZXhlY19jb21tYW5kICk7CgkJCQkJCQoJCQkJCQlpZiAoICggIWZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB8fCAoICRleGVjX2V4aXRfY29kZSA9PSAnLTEnICkgKSB7IC8vIEZpbGUgbm90IG1hZGUgb3IgZXJyb3IgcmV0dXJuZWQuCgkJCQkJCQkkZXhlY19jb21wbGV0aW9uID0gZmFsc2U7CgkJCQkJCQkKCQkJCQkJCWlmICggJGV4ZWNfZXhpdF9jb2RlID09ICctMScgKSB7CgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0V4ZWMgY29tbWFuZCByZXR1cm5lZCAtMS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJfQoJCQkJCQkJaWYgKCAhZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnRXhlYyBjb21tYW5kIHJhbiBidXQgWklQIGZpbGUgZGlkIG5vdCBleGlzdC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJfQoJCQkJCQkJaWYgKCBmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgeyAvLyBJZiBmaWxlIHdhcyBzb21laG93IGNyZWF0ZWQsIGRvIGNsZWFudXAgb24gaXQuCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ0NsZWFuaW5nIHVwIGRhbWFnZWQgWklQIGZpbGUuIElzc3VlICMzNDg5MzI4OTk4LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkJdW5saW5rKCAkdGVzdF9maWxlICk7CgkJCQkJCQl9CgkJCQkJCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJCQkJCQkkZXhlY19jb21wbGV0aW9uID0gdHJ1ZTsKCQkJCQkJCQoJCQkJCQkJaWYgKCAhdW5saW5rKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCQkJZWNobyBzcHJpbnRmKCBfXyggJ0Vycm9yICM1NjQ2MzQuIFVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcykhJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0ZXN0X2ZpbGUgKTsKCQkJCQkJCX0KCQkJCQkJCWFycmF5X3B1c2goICRyZXR1cm4sICdleGVjJyApOwoJCQkJCQkJJHRoaXMtPl9leGVjcGF0aCA9ICRwYXRoOwoJCQkJCQkJCgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0gLy8gZW5kIHdoaWxlCgkJCQl9IC8vIEVuZCAkcnVuX2V4ZWNfdGVzdCA9PT0gdHJ1ZS4KCQkJfSAvLyBFbmQgZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKS4KCQkJCgkJCS8vIFRlc3QgWmlwQXJjaGl2ZQoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ1ppcEFyY2hpdmUnICkgKSB7CgkJCQlpZiAoICR0aGlzLT50ZXN0X3ppcGFyY2hpdmUoKSA9PT0gdHJ1ZSApIHsKCQkJCQlhcnJheV9wdXNoKCAkcmV0dXJuLCAnemlwYXJjaGl2ZScgKTsKCQkJCX0KCQkJfQoJCQkKCQkJLy8gVGVzdCBQQ0xaaXAKCQkJaWYgKCBjbGFzc19leGlzdHMoICdQY2xaaXAnICkgKSB7IC8vIENsYXNzIGFscmVhZHkgbG9hZGVkLgoJCQkJYXJyYXlfcHVzaCggJHJldHVybiwgJ3BjbHppcCcgKTsKCQkJfSBlbHNlIHsgLy8gQ2xhc3Mgbm90IGxvYWRlZC4gU2VlayBpdCBvdXQuCgkJCQkKCQkJCWlmICggZmlsZV9leGlzdHMoIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvY2xhc3MtcGNsemlwLnBocCcgKSApIHsgLy8gSW5zaWRlIFdQLgoJCQkJCXJlcXVpcmVfb25jZSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJyApOwoJCQkJCWFycmF5X3B1c2goICRyZXR1cm4sICdwY2x6aXAnICk7CgkJCQl9IGVsc2VpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3BjbHppcC9wY2x6aXAucGhwJyApICkgeyAvLyBJbXBvcnRCdWRkeS4KCQkJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvcGNsemlwL3BjbHppcC5waHAnICk7CgkJCQkJYXJyYXlfcHVzaCggJHJldHVybiwgJ3BjbHppcCcgKTsKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHJldHVybjsKCQl9IC8vIEVuZCBhdmFpbGFibGVfemlwX21ldGhvZHMoKS4KCQkKCQkKCQkKCQkvLyBSZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkgYW5kIGFsbCBjb250ZW50IHdpdGhpbi4KCQlmdW5jdGlvbiBkZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJGRpcmVjdG9yeSApIHsKCQkJJGRpcmVjdG9yeSA9IHByZWdfcmVwbGFjZSggJ3xbL1xcXFxdKyR8JywgJycsICRkaXJlY3RvcnkgKTsKCQkJCgkJCSRmaWxlcyA9IGdsb2IoICRkaXJlY3RvcnkgLiAnLyonLCBHTE9CX01BUksgKTsKCQkJaWYgKCBpc19hcnJheSggJGZpbGVzICkgJiYgIWVtcHR5KCAkZmlsZXMgKSApIHsKCQkJCWZvcmVhY2goICRmaWxlcyBhcyAkZmlsZSApIHsKCQkJCQlpZiggJy8nID09PSBzdWJzdHIoICRmaWxlLCAtMSApICkKCQkJCQkJJHRoaXMtPmRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZmlsZSApOwoJCQkJCWVsc2UKCQkJCQkJdW5saW5rKCAkZmlsZSApOwoJCQkJfQoJCQl9CgkJCQoJCQlpZiAoIGlzX2RpciggJGRpcmVjdG9yeSApICkgcm1kaXIoICRkaXJlY3RvcnkgKTsKCQkJCgkJCWlmICggaXNfZGlyKCAkZGlyZWN0b3J5ICkgKQoJCQkJcmV0dXJuIGZhbHNlOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IC8vIEVuZCBkZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSgpLgoJCQoJCQoJCQoJCWZ1bmN0aW9uIHNldF96aXBfbWV0aG9kcyggJG1ldGhvZHMgKSB7CgkJCSR0aGlzLT5femlwX21ldGhvZHMgPSAkbWV0aG9kczsKCQl9IC8vIEVuZCBzZXRfemlwX21ldGhvZHMoKS4KCQkKCQkKCQkKCQkvKglfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSgpCgkJICoJCgkJICoJZnVuY3Rpb24gZGVzY3JpcHRpb24KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJGZpbGUJCQlGaWxlIHRvIHdyaXRlIGV4Y2x1c2lvbnMgaW50by4KCQkgKglAcGFyYW0JCWFycmF5CQkkZXhjbHVzaW9ucwkJQXJyYXkgb2YgZGlyZWN0b3JpZXMvcGF0aHMgdG8gZXhjbHVkZS4gT25lIHBlciBsaW5lLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX3JlbmRlcl9leGNsdXNpb25zX2ZpbGUoICRmaWxlLCAkZXhjbHVzaW9ucyApIHsKCQkKCQkJLy8gQXJyYXkgZm9yIGNsZWFuZWQgdXAgZXhjbHVzaW9ucyBsaXN0CgkJCSRzYW5pdGl6ZWRfZXhjbHVzaW9ucyA9IGFycmF5KCk7CgkJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDcmVhdGluZyBiYWNrdXAgZXhjbHVzaW9ucyBmaWxlIGAnIC4gJGZpbGUgLiAnYC4nICk7CgkJCS8vJGV4Y2x1c2lvbnMgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRfZGlyZWN0b3J5X2V4Y2x1c2lvbnMoKTsKCQkJCgkJCS8vIFRlc3QgZWFjaCBleGNsdXNpb24gZm9yIHZhbGlkaXR5IChwcmVzZW5jZSkgYW5kIGRyb3AgdGhvc2Ugbm90IGFjdHVhbGx5IHByZXNlbnQKCQkJZm9yZWFjaCggJGV4Y2x1c2lvbnMgYXMgJGV4Y2x1c2lvbiApIHsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHBsYXRmb3JtIHNwZWNpZmljIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGFyZSB1c2VkIChjb3VsZCBoYXZlIG1pZ3JhdGVkIGZyb20gZGlmZmVyZW50IHBsYXRmb3JtKQoJCQkJJGV4Y2x1c2lvbiA9IHByZWdfcmVwbGFjZSggJ3xbJyAuIGFkZHNsYXNoZXMoIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgLiAnXSt8JywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJGV4Y2x1c2lvbiApOwoJCQkJCgkJCQkvLyBESVJFQ1RPUlkuCgkJCQlpZiAoIGlzX2RpciggQUJTUEFUSCAuIGx0cmltKCAkZXhjbHVzaW9uLCBESVJFQ1RPUllfU0VQQVJBVE9SICkgKSApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdWRpbmcgZGlyZWN0b3J5IGAnIC4gJGV4Y2x1c2lvbiAuICdgLicgKTsKCQkJCQkKCQkJCQkvLyBOZWVkIHRvIGFkZCB0aGUgd2lsZGNhcmQgc28gdGhhdCB6aXAgd2lsbCBleGNsdWRlIHRoZSBkaXJlY3RvcnkgYW5kIGNvbnRlbnQKCQkJCQkkZXhjbHVzaW9uID0gcnRyaW0oICRleGNsdXNpb24sIERJUkVDVE9SWV9TRVBBUkFUT1IgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnKic7CgkJCQkKCQkJCS8vIEZJTEUuCgkJCQl9IGVsc2VpZiAoIGlzX2ZpbGUoIEFCU1BBVEggLiBsdHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgKSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXhjbHVkaW5nIGZpbGUgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCgkJCQkvLyBTWU1CT0xJQyBMSU5LLgoJCQkJfSBlbHNlaWYgKCBpc19saW5rKCBBQlNQQVRIIC4gbHRyaW0oICRleGNsdXNpb24sIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApICkgewoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4Y2x1ZGluZyBzeW1ib2xpYyBsaW5rIGAnIC4gJGV4Y2x1c2lvbiAuICdgLicgKTsKCQkJCQoJCQkJLy8gRE9FUyBOT1QgRVhJU1QuCgkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ09taXR0aW5nIGV4Y2x1c2lvbiBhcyBmaWxlL2RpcmVjdG9yeSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3Q6IGAnIC4gJGV4Y2x1c2lvbiAuICdgLicgKTsKCQkJCQkKCQkJCQkvLyBTa2lwIHRvIG5leHQgZXhjbHVzaW9uCgkJCQkJY29udGludWU7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIFdlIGhhdmUgYSB2YWxpZCBleGNsdWRlIHNvIGFkZCBpdAoJCQkJJHNhbml0aXplZF9leGNsdXNpb25zW10gPSAkZXhjbHVzaW9uOwoJCQkJCgkJCX0KCQkJCgkJCS8vIFB1dCB0aGUgZXhjbHVzaW9ucyB0byBhIGZpbGUgYXMgYSBzdHJpbmcKCQkJZmlsZV9wdXRfY29udGVudHMoICRmaWxlLCBpbXBsb2RlKCBQSFBfRU9MLCAkc2FuaXRpemVkX2V4Y2x1c2lvbnMgKSAuIFBIUF9FT0wgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQmFja3VwIGV4Y2x1c2lvbnMgZmlsZSBjcmVhdGVkLicgKTsKCQkJCgkJfSAvLyBFbmQgcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSgpLgoJCQoJCQoJCQoJfSAvLyBFbmQgY2xhc3MKCQp9Cj8+
###PACKDATA,FILE_END,/lib/zipbuddy/legacy.zipbuddy.php,importbuddy/lib/zipbuddy/legacy.zipbuddy.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbdir.php,importbuddy/lib/zipbuddy/zbdir.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piZGlyIENsYXNzCiAqCiAqICBQcm92aWRlcyBhIGRpcmVjdG9yeSBjbGFzcyBmb3IgemlwYnVkZHkgZm9yIGJ1aWxkaW5nIGEgZGlyZWN0b3J5IHRyZWUgZm9yIGJhY2t1cAogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YmRpciIgKSApIHsKCgljbGFzcyBwbHVnaW5idWRkeV96YmRpciB7CgkKCQkvLyBzdGF0dXMgbWV0aG9kIHR5cGUgcGFyYW1ldGVyIHZhbHVlcyAtIHdvdWxkIGxpa2UgYSBjbGFzcyBmb3IgdGhpcwoJCWNvbnN0IFNUQVRVU19UWVBFX0RFVEFJTFMgPSAnZGV0YWlscyc7CgkJY29uc3QgTk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SID0gJy8nOwoJCWNvbnN0IERJUkVDVE9SWV9TRVBBUkFUT1JTID0gJy9cXCc7CgoJCXB1YmxpYyAkX3ZlcnNpb24gPSAnMS4wJzsKCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBwYXRoIG9mIHRoaXMgZGlyZWN0b3J5IG5vZGUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHBhdGggc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfcGF0aCA9ICIiOwogICAgICAgIAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBhYnNvbHV0ZSBwYXRocyB0byBiZSBleGNsdWRlZCwgbXVzdCBiZSAvIHRlcm1pbmF0ZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHBhdGhzX3RvX2V4Y2x1ZGUgYXJyYXkgb2Ygc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfcGF0aHNfdG9fZXhjbHVkZSA9IGFycmF5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkaXJlY3RvcnkgbGlzdGluZyBpdGVtcyB0byBiZSBpZ25vcmVkCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBpdGVtc190b19pZ25vcmUgYXJyYXkgb2Ygc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfaXRlbXNfdG9faWdub3JlID0gYXJyYXkoICIuIiwgIi4uIiwgIi5EU19TdG9yZSIgKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGl0ZW1zIHRoYXQgYXJlIHRlcm1pbmFscyBhbmQgd2UgY2FuIGFkZCBkaXJlY3RseSBmb3IgdGhpcyBkaXJlY3RvcnkgKGFic29sdXRlIHBhdGhzKQogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgdGVybWluYWxzIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3Rlcm1pbmFscyA9IGFycmF5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBicmFuY2ggbm9kZXMgb2Ygc3Vib3JkaW5hdGUgZGlyZWN0b3JpZXMgdGhhdCBhcmUgb24gYW4gZXhjbHVzaW9uIHBhdGgKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJyYW5jaGVzIGFycmF5IG9mIHN0cmluZyA9PiBwbHVnaW5idWRkeV96YmRpcgogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX2JyYW5jaGVzID0gYXJyYXkoKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBvciBub3Qgd2UgY2FuIGNhbGwgYSBzdGF0dXMgY2FsYmFjawogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaGF2ZV9zdGF0dXNfY2FsbGJhY2sgYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2hhdmVfc3RhdHVzX2NhbGxiYWNrID0gZmFsc2U7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogT2JqZWN0LT5tZXRob2QgYXJyYXkgZm9yIHN0YXR1cyBmdW5jdGlvbgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RhdHVzX2NhbGxiYWNrIGFycmF5CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfc3RhdHVzX2NhbGxiYWNrID0gYXJyYXkoKTsKCQkKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHBhdGgJCQlUaGUgcGF0aCB0byBmb3JtIGEgbm9kZSBmb3IKCQkgKglAcGFyYW0JCWFycmF5CQkkZXhjbHVkZXMJCVRoZSBsaXN0IG9mIGRpcnMvZmlsZXMgdG8gZXhjbHVkZSAoYWJzb2x1dGUgcGF0aHMgd2l0aCAvIHRlcm1pbmF0b3IgZm9yIGRpcnMpCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkcGF0aCwgJGV4Y2x1ZGVzID0gYXJyYXkoKSApIHsKCgkJCS8vIE5vcm1hbGl6ZSB0aGUgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBvbiB0aGUgcGF0aAoJCQkkcGF0aCA9IHJ0cmltKCAkcGF0aCwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCgkJCS8vIE5vcm1hbGl6ZSBwbGF0Zm9ybSBzcGVjaWZpYyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBpbiBwYXRoCgkJCSR0aGlzLT5fcGF0aCA9IHN0cl9yZXBsYWNlKCBESVJFQ1RPUllfU0VQQVJBVE9SLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IsICRwYXRoICk7CgkJCQoJCQkkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgPSAkZXhjbHVkZXM7CgkJCQoJCQkkY29udGVudCA9IHNjYW5kaXIoICR0aGlzLT5fcGF0aCApOyAvLyBHZXQgdGhlIGRpcmVjdG9yeSBjb250ZW50LCB3aWxsIGJlIHNpbXBsZSBuYW1lcwoJCQkKCQkJLy8gUHJvY2VzcyBlYWNoIGl0ZW0gZm9yIGlnbm9yaW5nLCB0cmVhdGluZyBhcyBhIHRlcm1pbmFsIG9yIGFzIGEgYnJhbmNoCgkJCWZvcmVhY2ggKCAkY29udGVudCBhcyAmJGl0ZW0gKSB7CgoJCQkJLy8gSW5pdGlhbGx5IGNoZWNrIHRoZSBzaW1wbGUgbmFtZQoJCQkJaWYgKCBpbl9hcnJheSggJGl0ZW0sICR0aGlzLT5faXRlbXNfdG9faWdub3JlICkgKSB7CgoJCQkJCS8vIFRoaXMgaXMganVzdCBmbHVmZiBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcKCQkJCQljb250aW51ZTsKCQkJCQkKCQkJCX0gZWxzZWlmICggaXNfZGlyKCAoICR0aGlzLT5fcGF0aCAuICRpdGVtICkgKSApIHsKCgkJCQkJLy8gSXQncyBhIGRpcmVjdG9yeSwgY2hlY2sgZm9yIG1hdGNoaW5nIGV4Y2x1c2lvbiBvciBiZWluZyBwcmVmaXggb2YgZXhjbHVzaW9uCgkJCQkJaWYgKCBpbl9hcnJheSggKCAkdGhpcy0+X3BhdGggLiAkaXRlbSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiApLCAkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgKSApIHsKCQkJCQkKCQkJCQkJLy8gRXhhY3QgbWF0Y2ggdG8gYW4gZXhjbHVzaW9uLCBleGNsdWRlIHRoaXMgZGlyZWN0b3J5IGNvbXBsZXRlbHkKCQkJCQkJY29udGludWU7CgkJCQkJCQoJCQkJCX0gZWxzZWlmICggJHRoaXMtPmluX2FycmF5X3ByZWZpeCggKCAkdGhpcy0+X3BhdGggLiAkaXRlbSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiApLCAkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgKSApIHsKCgkJCQkJCS8vIE5lZWQgYSBuZXcgbm9kZSwgYWRkIHRvIHRoZSBub2RlIGFycmF5IChhYnNvbHV0ZSBkaXIgcGF0aCBpcyBrZXkpCgkJCQkJCSR0aGlzLT5fYnJhbmNoZXNbICggJHRoaXMtPl9wYXRoIC4gJGl0ZW0gKSBdID0gbmV3IHBsdWdpbmJ1ZGR5X3piZGlyKCAoICR0aGlzLT5fcGF0aCAuICRpdGVtIC4gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SICksICR0aGlzLT5fcGF0aHNfdG9fZXhjbHVkZSwgJHRoaXMgKTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gTmVpdGhlciBleGNsdXNpb24gbm9yIGV4Y2x1c2lvbiBwcmVmaXggc28gd2VsbCB0cmVhdCBpdCBhcyBhIHRlcm1pbmFsCgkJCQkJCSR0aGlzLT5fdGVybWluYWxzW10gPSAoICR0aGlzLT5fcGF0aCAuICRpdGVtICk7CgkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfSBlbHNlIHsKCgkJCQkJLy8gQXNzdW1lIGl0J3MgYSBmaWxlLCBjaGVjayBmb3IgbWF0Y2hpbmcgZXhjbHVzaW9uCgkJCQkJaWYgKCBpbl9hcnJheSggKCAkdGhpcy0+X3BhdGggLiAkaXRlbSApLCAkdGhpcy0+X3BhdGhzX3RvX2V4Y2x1ZGUgKSApIHsKCQkJCQkKCQkJCQkJLy8gRXhhY3QgbWF0Y2ggdG8gYW4gZXhjbHVzaW9uLCBleGNsdWRlIHRoaXMgZmlsZSBjb21wbGV0ZWx5CgkJCQkJCWNvbnRpbnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBOb3QgYW4gZXhjbHVzaW9uIHNvIGl0J3MgYSB0ZXJtaW5hbAoJCQkJCQkkdGhpcy0+X3Rlcm1pbmFsc1tdID0gKCAkdGhpcy0+X3BhdGggLiAkaXRlbSApOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CQoJCQl9CgkJCQkJCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCApIHsKCgkJfQoJCQkJCgkJLyoqCgkJICoJc2V0X3N0YXR1c19jYWxsYmFjaygpCgkJICoKCQkgKglTZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHN0YXR1cyB1cGRhdGUuCgkJICogIEFyZ3VtZW50IG11c3QgYXQgbGVhc3QgYmUgYSBub24tZW1wdHkgYXJyYXkgd2l0aCAyIGVsZW1lbnRzCgkJICoKCQkgKglAcGFyYW0JCWFycmF5IAkkY2FsbGJhY2sJT2JqZWN0LT5tZXRob2QgdG8gY2FsbCBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9zdGF0dXNfY2FsbGJhY2soICRjYWxsYmFjayA9IGFycmF5KCkgKSB7CgkJCgkJCWlmICggaXNfYXJyYXkoICRjYWxsYmFjayApICYmICFlbXB0eSggJGNhbGxiYWNrICkgJiYgKCAyID09IGNvdW50KCAkY2FsbGJhY2sgKSApICkgewoJCQkKCQkJCSR0aGlzLT5fc3RhdHVzX2NhbGxiYWNrID0gJGNhbGxiYWNrOwoJCQkJJHRoaXMtPl9oYXZlX3N0YXR1c19jYWxsYmFjayA9IHRydWU7CgoJCQl9CgkJCQoJCX0KCQkKCQkvKioKCQkgKglzdGF0dXMoKQoJCSAqCQoJCSAqCUludm9rZSBzdGF0dXMgbWV0aG9kIG9mIHBhcmVudCBpZiBpdCBleGlzdHMKCQkgKiAgTXVzdCBiZSBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG90aGVyd2lzZSBpZ25vcmUgdGhlIGNhbGwKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHR5cGUJCShFeHBlY3RlZCkgU3RhdHVzIG1lc3NhZ2UgdHlwZS4KCQkgKglAcGFyYW0JCXN0cmluZwkJJG1lc3NhZ2UJKEV4cGVjdGVkKSBTdGF0dXMgbWVzc2FnZS4KCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc3RhdHVzKCkgewoJCQoJCQlpZiAoICR0aGlzLT5faGF2ZV9zdGF0dXNfY2FsbGJhY2sgJiYgKCBmdW5jX251bV9hcmdzKCkgPiAwICkgKSB7CgoJCQkJJGFyZ3MgPSBmdW5jX2dldF9hcmdzKCk7CgkJCQljYWxsX3VzZXJfZnVuY19hcnJheSggJHRoaXMtPl9zdGF0dXNfY2FsbGJhY2ssICRhcmdzICk7CgkJCQkKCQkJfQoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X3Rlcm1pbmFscygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgdGVybWluYWxzIGZyb20gdGhpcyBkaXIgcGx1cyBzdWJvcmRpbmF0ZXMKCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQlGbGF0IGFycmF5IG9mIHRlcm1pbmFsIGZpbGVuYW1lcyBhbmQgZGlyZWN0b3J5IG5hbWVzCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X3Rlcm1pbmFscyggKSB7CgkJCgkJCS8vIE1pbmltdW0gaXMgb3VyIHRlcm1pbmFscwoJCQkkYWxsX3Rlcm1pbmFscyA9ICR0aGlzLT5fdGVybWluYWxzOwoJCQkKCQkJLy8gTm93IGFkZCB0ZXJtaW5hbHMgZnJvbSBlYWNoIHN1Ym9yZGluYXRlCgkJCWZvcmVhY2ggKCAkdGhpcy0+X2JyYW5jaGVzIGFzICRicmFuY2ggKSB7CgkJCQoJCQkJJGFsbF90ZXJtaW5hbHMgPSBhcnJheV9tZXJnZSggJGFsbF90ZXJtaW5hbHMsICRicmFuY2gtPmdldF90ZXJtaW5hbHMoKSApOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkYWxsX3Rlcm1pbmFsczsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF9yZWxhdGl2ZV9leGNsdWRlcygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgZXhjbHVzaW9ucyB3aXRoIG9wdGlvbmFsIGRpcmVjdG9yeSBwcmVmaXggcmVtb3ZlZAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCVRoZSBiYXNlIGRpcmVjdG9yeSBwcmVmaXggdG8gYmUgcmVtb3ZlZAoJCSAqCUByZXR1cm4JCWFycmF5CUZsYXQgYXJyYXkgb2YgcmVsYXRpdmUgKHRvIHNpdGUgcm9vdCkgZXhjbHVkZWQgZmlsZW5hbWVzIGFuZCBkaXJlY3RvcnkgbmFtZXMKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmVsYXRpdmVfZXhjbHVkZXMoICRiYXNlID0gJycgKSB7CgkJCgkJCS8vIFRoZSBiYXNlZGlyIG11c3QgaGF2ZSBhIHRyYWlsaW5nIG5vcm1hbGl6ZWQgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkkYmFzZWRpciA9ICggcnRyaW0oIHRyaW0oICRiYXNlICksIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkKCQkJLy8gTm9ybWFsaXplIHBsYXRmb3JtIHNwZWNpZmljIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGluIHBhdGgKCQkJJGJhc2VkaXIgPSBzdHJfcmVwbGFjZSggRElSRUNUT1JZX1NFUEFSQVRPUiwgc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SLCAkYmFzZWRpciApOwoJCQkKCQkJJHJlbGF0aXZlX2V4Y2x1ZGVzID0gJHRoaXMtPl9wYXRoc190b19leGNsdWRlOwoJCQkKCQkJZm9yZWFjaCAoICRyZWxhdGl2ZV9leGNsdWRlcyBhcyAmJGV4Y2x1ZGUgKSB7CgkJCQoJCQkJLy8gUmVtb3ZlIGJhc2UgcHJlZml4IGJ1dCBsZWF2ZSBsZWFkaW5nIG5vcm1hbGl6ZWQgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkJJGV4Y2x1ZGUgPSBzdHJfcmVwbGFjZSggcnRyaW0oICRiYXNlZGlyLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgKSwgJycsICRleGNsdWRlICk7CgkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlbGF0aXZlX2V4Y2x1ZGVzOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJaW5fYXJyYXlfcHJlZml4KCkKCQkgKgkKCQkgKglDaGVjayBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgcHJlZml4IG9mIGFueSBzdHJpbmcgaW4gdGhlIGdpdmVuIGFycmF5CgkJICoJCgkJICogIEBwYXJhbQkJc3RyaW5nCSRwcmVmaXgJCVRoZSBwcmVmaXggc3RyaW5nCgkJICogIEBwYXJhbQkJYXJyYXkJJGNhbmRpZGF0ZXMJVGhlIGFycmF5IG9mIHN0cmluZ3MKCQkgKglAcmV0dXJuCQlib29sCXRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHByZWZpeCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gaW5fYXJyYXlfcHJlZml4KCAkcHJlZml4LCBhcnJheSAkY2FuZGlkYXRlcyApIHsKCgkJCWZvcmVhY2ggKCAkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlICkgewoJCQkKCQkJCWlmICggISggZmFsc2UgPT09IHN0cnBvcyggJGNhbmRpZGF0ZSwgJHByZWZpeCApICkgKSB7CgoJCQkJCS8vIFdlIGZvdW5kIHRoZSBwcmVmaXgKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBHb3QgdGhpcyBmYXIgc28gbm90IGEgcHJlZml4CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJkaXIgY2xhc3MuCQoJCn0KPz4=
###PACKDATA,FILE_END,/lib/zipbuddy/zbdir.php,importbuddy/lib/zipbuddy/zbdir.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzip.php,importbuddy/lib/zipbuddy/zbzip.php
UEsDBAoAAAAAAC8ELUHj5ZWwDAAAAAwAAAAIABwAdGVzdC50eHRVVAkAA8obUVDjG1FQdXgLAAEE+AEAAAQUAAAASGVsbG8gV29ybGQKUEsBAh4DCgAAAAAALwQtQePllbAMAAAADAAAAAgAGAAAAAAAAQAAAKSBAAAAAHRlc3QudHh0VVQFAAPKG1FQdXgLAAEE+AEAAAQUAAAAUEsFBgAAAAABAAEATgAAAE4AAAAAAA==
###PACKDATA,FILE_END,/lib/zipbuddy/zbzip.php,importbuddy/lib/zipbuddy/zbzip.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzipcore.php,importbuddy/lib/zipbuddy/zbzipcore.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwY29yZSBDbGFzcwogKgogKiAgUHJvdmlkZXMgYW4gYWJzdHJhY3QgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcwogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcGNvcmUiICkgKSB7CgoJLyoqCgkgKglwbHVnaW5idWRkeV9zdGF0IENsYXNzCgkgKgoJICoJQ29udmVuaWVuY2UgZm9yIGJlaW5nIGFibGUgdG8gYXVnbWVudCB0aGUgc3RhdCgpIGZ1bmN0aW9uIGVpdGhlciBpbiB0aGUgZXZlbnQKCSAqCW9mIGZhaWx1cmUgb3IgZm9yIGNhc2VzIHdoZXJlIHRoZSBhY3R1YWwgZmlsZSBzaXplIHJlcG9ydGVkIGlzIHRvbyBsYXJnZSBmb3IgdGhlCgkgKgkoc2lnbmVkKSBpbnRlZ2VyIHR5cGUgaW4gd2hpY2ggY2FzZSB3ZSBjcmVhdGUgYW4gYWRkaXRpb25hbCBhc3NvY2lhdGl2ZSBmaWVsZCBpbgoJICoJdGhlIGFycmF5IHdoaWNoIGlzIGEgZG91YmxlIGFuZCBjb250YWlucyB0aGUgZmlsZSBzaXplLgoJICoJRm9yIG5vdyBpdCdzIGp1c3Qgc29tZSBzdGF0aWMgbWV0aG9kcyBidXQgbWlnaHQgZXh0ZW5kIHRvIGJlIGEgdHJ1ZSBjbGFzcy4KCSAqCgkgKglAcGFyYW0Jc3RyaW5nCQkkZmlsZW5hbWUJVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gc3RhdAoJICoJQHJldHVybglhcnJheXxib29sCQkJCUZhbHNlIG9uIGZhaWx1cmUgb3RoZXJ3aXNlIGFycmF5CgkgKgoJICovCgljbGFzcyBwbHVnaW5idWRkeV9zdGF0IHsKCgkJY29uc3QgVEhJUlRZX1RXT19CSVQgPSAzMjsKCQljb25zdCBTSVhUWV9GT1VSX0JJVCA9IDY0OwoJCQoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNfcGhwKCAkYml0cyApIHsKCQkKCQkJJHJlc3VsdCA9ICggKCBQSFBfSU5UX1NJWkUgKiA4ICkgPT0gJGJpdHMgKSA/IHRydWUgOiBmYWxzZTsKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RhdCggJGZpbGVuYW1lICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQkvLyBJZiB0aGUgZmlsZSBpcyByZWFkYWJsZSB0aGVuIHdlIHNob3VsZCBiZSBhYmxlIHRvIHN0YXQgaXQgCgkJCWlmICggQGlzX3JlYWRhYmxlKCAkZmlsZW5hbWUgKSApIHsKCQkJCgkJCQkkc3RhdHMgPSBAc3RhdCggJGZpbGVuYW1lICk7CgkJCQkKCQkJCWlmICggZmFsc2UgIT09ICRzdGF0cyApIHsKCQkJCQoJCQkJCS8vIExvb2tzIGxpa2Ugd2UgZ290IHNvbWUgdmFsaWQgZGF0YSAtIGZvciBub3cganVzdCBwcm9jZXNzIHRoZSBzaXplCgkJCQkJaWYgKCBzZWxmOjppc19waHAoIHNlbGY6OlRISVJUWV9UV09fQklUICkgKSB7CgkJCQkJCgkJCQkJCS8vIFBIUCBpcyAzMiBiaXRzIHNvIHdlIG1heSBoYXZlIGEgZmlsZSBzaXplIHByb2JsZW0gb3ZlciAyR0IuCgkJCQkJCS8vIFRoaXMgaXMgb25lIHdheSB0byB0ZXN0IGZvciBhIGZpbGUgc2l6ZSBwcm9ibGVtIC0gdGhlcmUgYXJlIG90aGVycwoJCQkJCQlpZiAoIDAgPiAkc3RhdHNbICdzaXplJyBdICkgewoJCQkJCQkKCQkJCQkJCS8vIFVuc2lnbmVkIGxvbmcgaGFzIGJlZW4gaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgaW50IGFuZCBoYXMgc2lnbiBiaXQKCQkJCQkJCS8vIHNldCBzbyBpcyBhcHBlYXJpbmcgYXMgbmVnYXRpdmUgLSBtYWdpY2FsbHkgY29udmVydCBpdCB0byBhIGRvdWJsZQoJCQkJCQkJLy8gTm90ZTogdGhpcyBvbmx5IHdvcmtzIHRvIGdpdmUgdXMgYW4gZXh0ZW5zaW9uIGZyb20gMkdCIHRvIDRHQiBidXQgdGhhdAoJCQkJCQkJLy8gc2hvdWxkIGJlIGVub3VnaCBhcyB0aGUgdW5kZXJseWluZyBPUyBwcm9iYWJseSBjYW4ndCBzdXBwb3J0ID40R0Igb3IKCQkJCQkJCS8vIHppcCBjb21tYW5kIGNhbm5vdCBhbnl3YXkKCQkJCQkJCSRzdGF0c1sgJ2RzaXplJyBdID0gKCAoZG91YmxlKTB4ODAwMDAwMDAgKyAoICRzdGF0c1sgJ3NpemUnIF0gJiAweDdGRkZGRkZGICkgKTsKCQkJCQkJCgkJCQkJCX0gZWxzZSB7CgkJCQkJCQoJCQkJCQkJLy8gQXNzdW1lIGl0J3MgdmFsaWQKCQkJCQkJCSRzdGF0c1sgJ2RzaXplJyBdID0gKGRvdWJsZSkkc3RhdHNbICdzaXplJyBdOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQkJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBMb29rcyBsaWtlIDY0IGJpdCBQSFAgc28gZmlsZSBzaXplIHNob3VsZCBiZSBmaW5lCgkJCQkJCS8vIEZvcmNlIGFkZGVkIGl0ZW0gdG8gZG91YmxlIGZvciBjb25zaXN0ZW5jeQoJCQkJCQkkc3RhdHNbICdkc2l6ZScgXSA9IChkb3VibGUpJHN0YXRzWyAnc2l6ZScgXTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gQWRkIGFuIGFkZGl0aW9uYWwgaXRlbSBmb3Igc2hvcnQgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgbW9kZQoJCQkJCSRzdGF0c1sgJ21vZGVfb2N0YWxfZm91cicgXSA9IHN1YnN0ciggc3ByaW50ZiggJyVvJywgJHN0YXRzWyAnbW9kZScgXSApLCAtNCApOwoJCQkJCQoJCQkJCSRyZXN1bHQgPSAkc3RhdHM7CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBIbW0sIHN0YXQoKSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uIC0gY291bGQgYmUgYW4gTEZTIHByb2JsZW0gd2l0aCB0aGUKCQkJCQkvLyB3YXkgUEhQIGhhcyBiZWVuIGJ1aWx0IDotKAoJCQkJCS8vIFRPRE86IENvbnNpZGVyIGFsdGVybmF0aXZlcyAtIG1heSBiZSBhYmxlIHRvIHVzZSBleGVjIHRvIHJ1biB0aGUKCQkJCQkvLyBjb21tYW5kIGxpbmUgc3RhdCBmdW5jdGlvbiB3aGljaCBfc2hvdWxkXyBiZSBvayBhbmQgd2UgY2FuIG1hcCBvdXRwdXQKCQkJCQkvLyBpbnRvIHRoZSBzYW1lIGFycmF5IGZvcm1hdC4gVGhpcyBkb2VzIGRlcGVuZCBvbiBoYXZpbmcgZXhlYygpIGFuZCB0aGUKCQkJCQkvLyBzdGF0IGNvbW1hbmQgYXZhaWxhYmxlIGFuZCBpdCdzIGRlZmluaXRlbHkgbm90IGEgbmljZSBvcHRpb24KCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCX0KCQoJfQoKCWFic3RyYWN0IGNsYXNzIHBsdWdpbmJ1ZGR5X3piemlwY29yZSB7CgkKCQkvLyBzdGF0dXMgbWV0aG9kIHR5cGUgcGFyYW1ldGVyIHZhbHVlcyAtIHdvdWxkIGxpa2UgYSBjbGFzcyBmb3IgdGhpcwoJCWNvbnN0IFNUQVRVU19UWVBFX0RFVEFJTFMgICAgICAgPSAnZGV0YWlscyc7CgkJCgkJLy8gQ29uc3RhbnRzIGZvciBoYW5kbGluZyBwYXRocwoJCWNvbnN0IE5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiAgPSAnLyc7CgkJY29uc3QgRElSRUNUT1JZX1NFUEFSQVRPUlMgICAgICA9ICcvXFwnOwoKCQkvLyBDb25zdGFudHMgZm9yIHJlc3VsdCBoYW5kbGluZwoJCWNvbnN0IE1BWF9FUlJPUl9MSU5FU19UT19TSE9XICAgPSAyMDsKCQljb25zdCBNQVhfV0FSTklOR19MSU5FU19UT19TSE9XID0gMjA7CgkJY29uc3QgTUFYX09USEVSX0xJTkVTX1RPX1NIT1cgICA9IDIwOwoJCQoJCS8vIEVudW1lcmF0ZWQgdHlwZXMgdGhhdCB3ZSBuZWVkIGZvciBub3cKCQkvLyBOb3RlOiBWYWx1ZXMgbXVzdCBiZSBzZXF1ZW50aWFsCgkJY29uc3QgT1NfVFlQRV9VTktOT1dOIAk9CTA7CgkJY29uc3QgT1NfVFlQRV9OSVgJCT0JMTsKCQljb25zdCBPU19UWVBFX1dJTgkJPQkyOwoJCWNvbnN0IE9TX1RZUEVfTUFYCQk9CTI7CgoJCWNvbnN0IFpJUF9XQVJOSU5HX1VOS05PV04gIAkJCT0gMDsKCQljb25zdCBaSVBfV0FSTklOR19HRU5FUklDICAJCQk9IDE7CgkJY29uc3QgWklQX1dBUk5JTkdfU0tJUFBFRCAgCQkJPSAyOwoJCWNvbnN0IFpJUF9XQVJOSU5HX0ZJTFRFUkVEIAkJCT0gMzsKCQljb25zdCBaSVBfV0FSTklOR19MT05HUEFUSCAJCQk9IDQ7CgkJY29uc3QgWklQX1dBUk5JTkdfSUdOT1JFRF9TWU1MSU5LIAk9IDU7CgkJCgkJY29uc3QgWklQX09USEVSX1VOS05PV04gICAgICAgICA9IDA7CgkJY29uc3QgWklQX09USEVSX0dFTkVSSUMgICAgICAgICA9IDE7CgkJY29uc3QgWklQX09USEVSX1NLSVBQRUQgIAkJPSAyOwoJCWNvbnN0IFpJUF9PVEhFUl9GSUxURVJFRCAJCT0gMzsKCQljb25zdCBaSVBfT1RIRVJfTE9OR1BBVEggCQk9IDQ7CgkJY29uc3QgWklQX09USEVSX0lHTk9SRURfU1lNTElOSwk9IDU7CgkJCgkJY29uc3QgQ09NTUFORF9VTktOT1dOX1BBVEgJPSAwOwoJCWNvbnN0IENPTU1BTkRfWklQX1BBVEgJCT0gMTsKCQljb25zdCBDT01NQU5EX1VOWklQX1BBVEgJPSAyOwoKCQlwdWJsaWMgJF92ZXJzaW9uID0gJzEuMCc7CgoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcGx1Z2luIHBhdGggZm9yIHRoaXMgcGx1Z2luCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAkX3BsdWdpblBhdGggc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHVibGljICRfcGx1Z2luUGF0aCA9ICcnOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcGF0aCBvZiB0aGlzIGRpcmVjdG9yeSBub2RlCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBwYXRoIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3BhdGggPSAiIjsKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYWJzb2x1dGUgcGF0aHMgdG8gYmUgZXhjbHVkZWQsIG11c3QgYmUgLyB0ZXJtaW5hdGVkCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBwYXRoc190b19leGNsdWRlIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3BhdGhzX3RvX2V4Y2x1ZGUgPSBhcnJheSgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGV0YWlscyBvZiB0aGUgbWV0aG9kCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBtZXRob2RfZGV0YWlscyBhcnJheQogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX21ldGhvZF9kZXRhaWxzID0gYXJyYXkoKTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2V0IG9mIHBhdGhzIHdoZXJlIHRvIGxvb2sgZm9yIGV4ZWN1dGFibGVzCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAgZXhlY3V0YWJsZV9wYXRocwlhcnJheQogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2V4ZWN1dGFibGVfcGF0aHMgPSBhcnJheSgpOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIEFycmF5IG9mIHN0YXR1cyBpbmZvcm1hdGlvbgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RhdHVzIGFycmF5CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfc3RhdHVzID0gYXJyYXkoKTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBFbnVtZXJhdGVkIE9TIHR5cGUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIG9zX3R5cGUJaW50CiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfb3NfdHlwZSA9IHNlbGY6Ok9TX1RZUEVfVU5LTk9XTjsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZW5pZW5jZSBib29sZWFuIGluZGljYXRpbmcgaWYgUEhQIGhhcyBleGVjX2RpciBzZXQgb3Igbm90CiAgICAgICAgICogCiAgICAgICAgICogQHZhciBleGVjX2Rpcl9zZXQJYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2V4ZWNfZGlyX3NldCA9IGZhbHNlOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBXYXJuaW5ncyBzaG91bGQgYmUgaWdub3JlZCB3aGVuIGJ1aWxkaW5nIGFyY2hpdmVzCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBpZ25vcmVfd2FybmluZ3MJYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2lnbm9yZV93YXJuaW5ncyA9IGZhbHNlOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBzeW1saW5rcyBzaG91bGQgYmUgaWdub3JlZC9ub3QtZm9sbG93ZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgaWdub3JlX3N5bWxpbmtzCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9pZ25vcmVfc3ltbGlua3MgPSBmYWxzZTsKCQkKICAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVuaWVuY2UgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNvbXByZXNzaW9uIHNob3VsIGRiZSB1c2VkIHdoZW4gYnVpbGRpbmcgYXJjaGl2ZXMKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGNvbXByZXNzaW9uCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9jb21wcmVzc2lvbiA9IGZhbHNlOwoJCQogICAgICAgLyoqCiAgICAgICAgICogVXNlZCB0byB0cmFuc2xhdGUgb3VyIHdhcm5pbmdzIHJlYXNvbnMgaW50byBhIGxvbmdlciBkZXNjcmlwdGlvbgogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfd2FybmluZ19kZXNjID0gYXJyYXkoIHNlbGY6OlpJUF9XQVJOSU5HX1VOS05PV04gIAkJCT0+ICd3YXJuaW5nIHJlYXNvbiB1bmtub3duJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgIAkJCT0+ICdnZW5lcmFsIHByb2JsZW0gYXMgaW5kaWNhdGVkJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9XQVJOSU5HX1NLSVBQRUQgIAkJCT0+ICdmaWxlIHVucmVhZGFibGUgb3IgZG9lcyBub3QgZXhpc3QnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX1dBUk5JTkdfRklMVEVSRUQgCQkJPT4gJ2ZpbGUgZmlsdGVyZWQnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX1dBUk5JTkdfTE9OR1BBVEggCQkJPT4gJ2ZpbGVuYW1lIHBhdGggdG9vIGxvbmcnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX1dBUk5JTkdfSUdOT1JFRF9TWU1MSU5LICAJPT4gJ2ZpbGUgaXMgYSBzeW1saW5rIGFuZCBpcyBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzJywKCQkJCQkJCQkJCQkgKTsKCgkJcHVibGljIHN0YXRpYyAkX290aGVyX2Rlc2MgICA9IGFycmF5KCBzZWxmOjpaSVBfT1RIRVJfVU5LTk9XTiAJCQk9PiAnb3RoZXIgcmVhc29uIHVua25vd24nLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX09USEVSX0dFTkVSSUMgCQkJPT4gJ290aGVyIHByb2JsZW0gYXMgaW5kaWNhdGVkJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9PVEhFUl9TS0lQUEVEIAkJCT0+ICdmaWxlIHVucmVhZGFibGUgb3IgZG9lcyBub3QgZXhpc3QnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX09USEVSX0ZJTFRFUkVECQkJPT4gJ2ZpbGUgZmlsdGVyZWQnLAoJCQkJCQkJCQkJCSAgc2VsZjo6WklQX09USEVSX0xPTkdQQVRIIAkJCT0+ICdmaWxlbmFtZSBwYXRoIHRvbyBsb25nJywKCQkJCQkJCQkJCQkgIHNlbGY6OlpJUF9PVEhFUl9JR05PUkVEX1NZTUxJTksJPT4gJ2ZpbGUgaXMgYSBzeW1saW5rIGFuZCBpcyBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzJywKCQkJCQkJCQkJCQkgKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIFNlcnZlciBBUEkgdGhhdCBpcyBpbiB1c2UKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX3NhcGlfbmFtZSA9ICIiOwoKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CgkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgd2UgYXJlIHJ1bm5pbmcgb24gZm9yIGxhdGVyCgkJCSR0aGlzLT5zZXRfb3NfdHlwZSgpOwoJCQkKCQkJLy8gRGVyaXZlIHdoZXRoZXIgd2UgYXJlIGlnbm9yaW5nIFdhcm5pbmdzIG9yIG5vdCAoZXhwZWN0ZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyKQoJCQkkdGhpcy0+c2V0X2lnbm9yZV93YXJuaW5ncygpOwoJCQkKCQkJLy8gRGVyaXZlIHdoZXRoZXIgd2UgYXJlIGlnbm9yaW5nL25vdC1mb2xsb3dpbmcgc3ltbGlua3Mgb3Igbm90IChleHBlY3RlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHVzZXIpCgkJCSR0aGlzLT5zZXRfaWdub3JlX3N5bWxpbmtzKCk7CgkJCQoJCQkvLyBEZXJpdmUgd2hldGhlciBjb21wcmVzc2lvbiBzaG91bGQgYmUgdXNlZCAoZXhwZWN0ZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyKQoJCQkkdGhpcy0+c2V0X2NvbXByZXNzaW9uKCk7CgkJCQoJCQkvLyBTcGVjaWZpYyBtZXRob2QgY29uc3RydWN0b3Igd2lsbCBvdmVycmlkZSBzb21lIG9mIHRoZXNlIGFuZCB0aGUgdGVzdHMgbWF5IG92ZXJyaWRlIG90aGVycwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5KCAnbmFtZScgPT4gJ1Vua25vd24gTWV0aG9kJywKCQkJCQkJCQkJCQkJCSAgJ2NvbXBhdGliaWxpdHknID0+IGZhbHNlICwKCQkJCQkJCQkJCQkJCSAgJ2lzX2NoZWNrZXInID0+IGZhbHNlLAoJCQkJCQkJCQkJCQkJICAnaXNfbGlzdGVyJyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJCSAgJ2lzX2FyY2hpdmVyJyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJCSAgJ2lzX3VuYXJjaGl2ZXInID0+IGZhbHNlLAoJCQkJCQkJCQkJCQkJICAnaXNfY29tbWVudGVyJyA9PiBmYWxzZSwKCQkJCQkJCQkJCQkJCSAgJ2lzX3ppcHBlcicgPT4gZmFsc2UsCgkJCQkJCQkJCQkJCQkgICdpc191bnppcHBlcicgPT4gZmFsc2UsCgkJCQkJCQkJCQkJCQkgICdpc19leHRyYWN0b3InID0+IGZhbHNlCgkJCQkJCQkJCQkJCQkgKTsKCgkJCS8vIE11c3QgX25vdF8gZGVmYXVsdCAncGF0aCcgdmFsdWVzIGJlY2F1c2Ugd2UgdGVzdCB3aGV0aGVyIHNldCBvciBub3QgdG8gZGVjaWRlIHdoZXRoZXIgdG8gdXNlCgkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXSA9IGFycmF5KCAvLyAncGF0aCcgPT4gJycsCgkJCQkJCQkJCQkJCQkgICAnemlwJyA9PiBhcnJheSggLy8gJ3BhdGgnID0+ICcnLAoJCQkJCQkJCQkJCQkJICAgCQkndmVyc2lvbicgPT4gYXJyYXkoICdtYWpvcicgPT4gMCwgJ21pbm9yJyA9PiAwICksCgkJCQkJCQkJCQkJCQkgICAJCSdvcHRpb25zJyA9PiAnJywKCQkJCQkJCQkJCQkJCSAgIAkJJ2luZm8nID0+ICcnICksCgkJCQkJCQkJCQkJCQkgICAndW56aXAnID0+IGFycmF5KCAvLyAncGF0aCcgPT4gJycsCgkJCQkJCQkJCQkJCQkgICAJCSd2ZXJzaW9uJyA9PiBhcnJheSggJ21ham9yJyA9PiAwLCAnbWlub3InID0+IDAgKSwKCQkJCQkJCQkJCQkJCSAgIAkJJ29wdGlvbnMnID0+ICcnLAoJCQkJCQkJCQkJCQkJICAgCQknaW5mbycgPT4gJycgKQoJCQkJCQkJCQkJCQkJICk7CgoJCX0KCQkKCQkvKioKCQkgKglfX2Rlc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGRlc3RydWN0b3IuCgkJICoJCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoICkgewoKCQl9CgkJCQkKCQkvKioKCQkgKglzZXRfb3NfdHlwZSgpCgkJICoKCQkgKglTZXRzIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgT1MgdHlwZSB0aGF0IHdlIGFyZSBydW5uaW5nIG9uIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCBmb3IKCQkgKglPUyBzcGVjaWZpYyBwcm9jZXNzaW5nLiBJZiBubyBlbnVtZXJhdGVkIHR5cGUgdmFsdWUgaXMgcGFzc2VkIGluIHRoZW4gZGVkdWNlIHRoZQoJCSAqCXZhbHVlIHRvIHNldCBmcm9tIHN5c3RlbSBpbmZvcm1hdGlvbi4KCQkgKglOb3RlOiBDdXJyZW50bHkgdXNlcyBQSFBfT1Mgd2hpY2ggc3RyaWN0bHkgc3BlYWtpbmcgaXMgdGhlIE9TIHRoYXQgUEhQIHdhcyBidWlsdCBvbgoJCSAqCXdoZXJlYXMgcGhwX3VuYW1lKCkgY291bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBPUyBiZWluZyBydW4gb24gaWYgd2UgcmVhbGx5CgkJICoJbmVlZCB0aGF0IChhbmQgc29tZXRpbWVzIGl0IGhhcyB0byByZXZlcnQgYmFjayB0byBqdXN0IHJldHVybmluZyB0aGUgUEhQX09TIHZhbHVlIGlmCgkJICoJdGhlIE9TIHVuYW1lIGxpYnJhcnkgZG9lc24ndCBleGlzdCBvciBpc24ndCB3b3JraW5nIHByb3Blcmx5LgoJCSAqCgkJICoJQHBhcmFtCQkkb3NfdHlwZQlpbnQJCU9TIHR5cGUgdG8gc2V0IChjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBkZWR1Y2VkIHR5cGUpCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIHNldF9vc190eXBlKCAkb3NfdHlwZSA9IFBIUF9JTlRfTUFYICkgewoJCSAKCQkgCS8vIENoZWNrIGlmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbGlkIGVudW1lcmF0ZWQgdmFsdWUKCQkgCWlmICggKCBzZWxmOjpPU19UWVBFX1VOS05PV04gPCAkb3NfdHlwZSApICYmICggc2VsZjo6T1NfVFlQRV9NQVggPj0gJG9zX3R5cGUgKSApIHsKCQkgCQoJCSAJCSR0aGlzLT5fb3NfdHlwZSA9ICRvc190eXBlOwoJCSAJCQoJCSAJfSBlbHNlIHsKCQkgCQkKCQkgCQkvLyBVc2UgVUMgZm9yIGVhc2UgLSB0aGlzIF9zaG91bGQgbm90PyBjYXVzZSBhbnkgYW1iaWd1aXR5CgkJIAkJJG9zX25hbWUgPSBzdHJ0b3VwcGVyKCBQSFBfT1MgKTsKCQkgCgkJIAkJLy8gQ3VycmVudGx5IHdlJ2xsIGFzc3VtZSBhbnl0aGluZyB0aGF0IGRvZXNuJ3QgbG9vayBsaWtlIFdpbmRvd3MgaXMgKm5peCBiYXNlZAoJCSAJCWlmICggc3Vic3RyKCAkb3NfbmFtZSwgMCwgMyApID09PSAnV0lOJykgewoJCSAJCQoJCSAJCQkkdGhpcy0+X29zX3R5cGUgPSBzZWxmOjpPU19UWVBFX1dJTjsKCQkgCQkJCgkJIAkJfSBlbHNlIHsKCQkgCQkKCQkgCQkJJHRoaXMtPl9vc190eXBlID0gc2VsZjo6T1NfVFlQRV9OSVg7CgkJIAkJCQoJCSAJCX0KCQkgCQoJCSAJfQoJCSAJCgkJIAlyZXR1cm4gJHRoaXM7CgkJIAkKCQkgfQoKCQkvKioKCQkgKglnZXRfb3NfdHlwZSgpCgkJICoKCQkgKglHZXRzIHRoZSBlbnVtZXJhdGVkIGlkZW50aWZpZXIgZm9yIHRoZSBPUyB0eXBlIHRoYXQgd2UgYXJlIHJ1bm5pbmcgb24KCQkgKgoJCSAqCUByZXR1cm4JCWludAkJRW51bWVyYXRlZCBPUyB0eXBlIHZhbHVlCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIGdldF9vc190eXBlKCApIHsKCQkgCgkJCXJldHVybiAkdGhpcy0+X29zX3R5cGU7CgoJCSB9CgoJCS8qKgoJCSAqCXNldF9leGVjX2Rpcl9mbGFnKCkKCQkgKgoJCSAqCUNoZWNrcyB3aGV0aGVyIGV4ZWNfZGlyIGlzIHNldCBpbiBQSFAgZW52aXJvbm1lbnQgYW5kIHNldHMgaW50ZXJuYWwgZmxhZwoJCSAqCgkJICoJQHJldHVybgkJYm9vbAkJVHJ1ZSBpcyBleGVjX2RpciBpcyBzZXQgYW5kIG5vdC1lbXB0eQoJCSAqCgkJICovCgkJIHB1YmxpYyBmdW5jdGlvbiBzZXRfZXhlY19kaXJfZmxhZyggKSB7CgkJIAoJCSAJJGV4ZWNfZGlyID0gJyc7CgkJIAkkcmVzdWx0ID0gZmFsc2U7CgoJCSAJaWYgKCAoIGZhbHNlICE9PSAoICRleGVjX2RpciA9IGluaV9nZXQoICdleGVjX2RpcicgKSApICkgJiYgKCAnJyAhPSB0cmltKCAkZXhlY19kaXIgKSApICkgewoJCSAJCgkJIAkJJHJlc3VsdCA9IHRydWU7CgkJIAkKCQkgCX0gZWxzZSB7CgkJIAkKCQkgCQkkcmVzdWx0ID0gZmFsc2U7CgkJIAkJCgkJIAl9CgkJIAoJCSAJJHRoaXMtPl9leGVjX2Rpcl9zZXQgPSAkcmVzdWx0OwoKCQkJcmV0dXJuICR0aGlzOwoKCQkgfQoKCQkvKioKCQkgKglnZXRfZXhlY19kaXJfZmxhZygpCgkJICoKCQkgKglHZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgdGhlIHN0YXR1cyBvZiBleGVjX2RpciBzZXR0aW5nCgkJICoKCQkgKglAcmV0dXJuCQlib29sCQlWYWx1ZSBvZiAkX2V4ZWNfZGlyX3NldAoJCSAqCgkJICovCgkJIHB1YmxpYyBmdW5jdGlvbiBnZXRfZXhlY19kaXJfZmxhZygpIHsKCQkgCgkJCXJldHVybiAkdGhpcy0+X2V4ZWNfZGlyX3NldDsKCgkJIH0KCgkJLyoqCgkJICoJc2V0X2lnbm9yZV93YXJuaW5ncygpCgkJICoKCQkgKglDaGVja3MgY29uZGl0aW9ucyB0byBzZWUgaWYgd2FybmluZ3Mgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBhcmNoaXZlcyBhcmUKCQkgKgliZWluZyBidWlsdC4KCQkgKgoJCSAqCUBwYXJhbQkJYm9vbAkkaWdub3JlCUZhbHNlIHRvIG5vdCBpZ25vcmUgd2FybmluZ3MsIFRydWUgdG8gZm9yY2UgaWdub3JlCgkJICoJQHJldHVybgkJYm9vbAkJCVRydWUgaWYgY29uZGl0aW9ucyBpbmRpY2F0ZSB3YXJuaW5ncyBzaG91bGQgYmUgaWdub3JlZCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIHNldF9pZ25vcmVfd2FybmluZ3MoICRpZ25vcmUgPSBudWxsICkgewoJCSAKCQkgCSR0aGlzLT5faWdub3JlX3dhcm5pbmdzID0gKCBpc19ib29sKCAkaWdub3JlICkgKSA/ICRpZ25vcmUgOiBmYWxzZSA7CgoJCQlyZXR1cm4gJHRoaXM7CgoJCSB9CgoJCS8qKgoJCSAqCWdldF9pZ25vcmVfd2FybmluZ3MoKQoJCSAqCgkJICoJR2V0cyB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgd2FybmluZ3Mgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlcwoJCSAqCgkJICoJQHJldHVybgkJYm9vbAkJVmFsdWUgb2YgJF9pZ25vcmVfd2FybmluZ3MKCQkgKgoJCSAqLwoJCSBwdWJsaWMgZnVuY3Rpb24gZ2V0X2lnbm9yZV93YXJuaW5ncygpIHsKCQkgCgkJCXJldHVybiAkdGhpcy0+X2lnbm9yZV93YXJuaW5nczsKCgkJIH0KCgkJLyoqCgkJICoJc2V0X2lnbm9yZV9zeW5saW5rcygpCgkJICoKCQkgKglDaGVja3MgY29uZGl0aW9ucyB0byBzZWUgaWYgc3ltbGlua3Mgc2hvdWxkIGJlIGlnbm9yZWQvbm90LWZvbGxvd2VkIHdoZW4gYXJjaGl2ZXMgYXJlCgkJICoJYmVpbmcgYnVpbHQuCgkJICoKCQkgKglAcGFyYW0JCWJvb2wJJGlnbm9yZQlGYWxzZSB0byBub3QgaWdub3JlIHN5bWxpbmtzLCBUcnVlIHRvIGZvcmNlIGlnbm9yZQoJCSAqCUByZXR1cm4JCWJvb2wJCQlUcnVlIGlmIGNvbmRpdGlvbnMgaW5kaWNhdGUgc3ltbGlua3Mgc2hvdWxkIGJlIGlnbm9yZWQvbm90LWZvbGxvd2VkLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCSBwdWJsaWMgZnVuY3Rpb24gc2V0X2lnbm9yZV9zeW1saW5rcyggJGlnbm9yZSA9IG51bGwgKSB7CgkJIAoJCSAJJHRoaXMtPl9pZ25vcmVfc3ltbGlua3MgPSAgKCBpc19ib29sKCAkaWdub3JlICkgKSA/ICRpZ25vcmUgOiB0cnVlIDsKCgkJCXJldHVybiAkdGhpczsKCgkJIH0KCgkJLyoqCgkJICoJZ2V0X2lnbm9yZV9zeW1saW5rcygpCgkJICoJCgkJICoJVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIG9wdGlvbiB0byBpZ25vcmUgc3ltbGlua3MgaXMgc2V0LiBJbiB0aGlzIGNvbnRleHQgaWdub3JpbmcKCQkgKgltZWFucyBub3QgZm9sbG93aW5nIGJ1dCB0aGUgc3ltbGluayBpdHNlbGYgaXMgcmVjb3JkZWQgaW4gdGhlIGJhY2t1cAoJCSAqCQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVmFsdWUgb2YgJF9pZ25vcmVfc3ltbGlua3MKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRfaWdub3JlX3N5bWxpbmtzKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl9pZ25vcmVfc3ltbGlua3M7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCXNldF9jb21wcmVzc2lvbigpCgkJICoKCQkgKglDaGVja3MgY29uZGl0aW9ucyB0byBzZWUgaWYgY29tcHJlc3Npb24gc2hvdWxkIGJlIHVzZWQgd2hlbiBidWlsZGluZyBhcmNoaXZlLgoJCSAqCgkJICoJQHBhcmFtCQlib29sCSRjb21wcmVzc2lvbglGYWxzZSB0byBwcm9oaWJpdCBjb21wcmVzc2lvbiwgVHJ1ZSB0byBmb3JjZSBjb21wcmVzc2lvbgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgY29uZGl0aW9ucyBpbmRpY2F0ZSBjb21wcmVzc2lvbiBzaG91bGQgYmUgdXNlZCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQkgcHVibGljIGZ1bmN0aW9uIHNldF9jb21wcmVzc2lvbiggJGNvbXByZXNzaW9uID0gbnVsbCApIHsKCQkgCgkJIAkkdGhpcy0+X2NvbXByZXNzaW9uID0gICggaXNfYm9vbCggJGNvbXByZXNzaW9uICkgKSA/ICRjb21wcmVzc2lvbiA6IHRydWUgOwoKCQkJcmV0dXJuICR0aGlzOwoKCQkgfQoKCQkvKioKCQkgKglnZXRfY29tcHJlc3Npb24oKQoJCSAqCQoJCSAqCVRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBvcHRpb24gdG8gdXNlIGNvbXByZXNzaW9uIGlzIHNldC4KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCQkJCVZhbHVlIG9mICRfY29tcHJlc3Npb24KCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRfY29tcHJlc3Npb24oKSB7CgkJCgkJCXJldHVybiAkdGhpcy0+X2NvbXByZXNzaW9uOwoJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfc2FwaV9uYW1lKCkKCQkgKgoJCSAqCVNldHMgdGhlIHNhcGkgbmFtZSB0byB0aGF0IGdpdmVuIG9yIGxlYXZlIGVtcHR5CgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCSRuYW1lCUEgc2FwaSBuYW1lIHRvIHNldCAoZGVmYXVsdCBlbXB0eSkKCQkgKglAcmV0dXJuCW9iamVjdAkJCVRoaXMgb2JqZWN0CgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9zYXBpX25hbWUoICRzYXBpX25hbWUgPSAiIiApIHsKCQkKCQkJJHRoaXMtPl9zYXBpX25hbWUgPSAkc2FwaV9uYW1lOwoJCQkKCQkJcmV0dXJuICR0aGlzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCWdldF9zYXBpX25hbWUoKQoJCSAqCgkJICoJUmV0dXJucyB0aGUgcHJldmlvdXNseSBzZXQgc2FwaSBuYW1lCgkJICoKCQkgKglAcmV0dXJuCXN0cmluZwkJCVRoZSBzdG9yZWQgc2FwaSBuYW1lCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9zYXBpX25hbWUoKSB7CgkJCQoJCQlyZXR1cm4gJHRoaXMtPl9zYXBpX25hbWU7CgkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X3N0YXR1cygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgc3RhdHVzIGFycmF5CgkJICoJCgkJICoJQHJldHVybgkJYXJyYXkJVGhlIHN0YXR1cyBhcnJheQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9zdGF0dXMoKSB7CgkJCgkJCXJldHVybiAkdGhpcy0+X3N0YXR1czsKCQkKCQl9CgkJCgkJLyoqCgkJICoJbG9nX2FyY2hpdmVfZmlsZV9zdGF0cygpCgkJICoJCgkJICoJUHJvZHVjZWQgYSBzdGF0dXMgbG9nIGVudHJ5IGZvciB0aGUgYXJjaGl2ZSBmaWxlIHN0YXRzCgkJICoJCgkJICoJQHBhcmFtCXN0cmluZwkkZmlsZQlUaGUgZmlsZSB0byBzdGF0IGFuZCBhbmQgbG9nCgkJICoJQHJldHVybgkJCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gbG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJGZpbGUgKSB7CgkJCgkJCS8vIEdldCB0aGUgZmlsZSBzdGF0cyBzbyB3ZSBjYW4gbG9nIHNvbWUgaW5mb3JtYXRpb24KCQkJJGZpbGVfc3RhdHMgPSBwbHVnaW5idWRkeV9zdGF0OjpzdGF0KCAkZmlsZSApOwoJCQkKCQkJLy8gT25seSBsb2cgYW55dGhpbmcgaWYgd2UgZ290IHNvbWUgdmFsaWQgZmlsZSBzdGF0cwoJCQlpZiAoIGZhbHNlICE9PSAkZmlsZV9zdGF0cyApIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBzaXplOiAlMSRzIGJ5dGVzLCBvd25lZCBieSB1c2VyOmdyb3VwICUyJHM6JTMkcyB3aXRoIHBlcm1pc3Npb25zICU0JHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGZpbGVfc3RhdHNbICdkc2l6ZScgXSwgJGZpbGVfc3RhdHNbICd1aWQnIF0sICRmaWxlX3N0YXRzWyAnZ2lkJyBdLCAkZmlsZV9zdGF0c1sgJ21vZGVfb2N0YWxfZm91cicgXSApICk7CgoJCQl9CgkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X21ldGhvZF90YWcoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIG1ldGhvZCB0YWcKCQkgKgkKCQkgKglAcmV0dXJuCQlzdHJpbmcgVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCWFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX3RhZygpOwoKCQkvKioKCQkgKglnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIGlzX2NvbXBhdGliaWxpdHlfbWV0aG9kIGJvb2xlYW4KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCgkJICoKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCk7CgoJCS8qKgoJCSAqCWdldF9tZXRob2RfZGV0YWlscygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgZGV0YWlscyBhcnJheQoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5CgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZF9kZXRhaWxzKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl9tZXRob2RfZGV0YWlsczsKCQkJCgkJfQoKCQkvKioKCQkgKglzZXRfbWV0aG9kX2RldGFpbHMoKQoJCSAqCQoJCSAqCVNldHMgdGhlIGludGVybmFsIChzZXR0YWJsZSkgZGV0YWlscwoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X21ldGhvZF9kZXRhaWxzKCBhcnJheSAkZGV0YWlscywgJG1lcmdlID0gdHJ1ZSApIHsKCQkKCQkJaWYgKCB0cnVlID09PSAkbWVyZ2UgKSB7CgkJCQoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0gPSBhcnJheV9tZXJnZSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0sICRkZXRhaWxzWyAnYXR0cicgXSApOwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdID0gYXJyYXlfbWVyZ2UoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXSwgJGRldGFpbHNbICdwYXJhbScgXSApOwoJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzID0gJGRldGFpbHM7CgkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHRoaXM7CgkJCQkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X2V4ZWN1dGFibGVfcGF0aHMoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIGV4ZWN1dGFibGVfcGF0aHMgYXJyYXkKCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9leGVjdXRhYmxlX3BhdGhzKCkgewoJCQoJCQlyZXR1cm4gJHRoaXMtPl9leGVjdXRhYmxlX3BhdGhzOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNldF9leGVjdXRhYmxlX3BhdGhzKCkKCQkgKgkKCQkgKglTZXRzIHRoZSBleGVjdXRhYmxlX3BhdGhzIGFycmF5IHNvIGNhbiBiZSB1c2VkIHRvIGF1Z21lbnQgb3Igb3ZlcnJpZGUgdGhlIGRlZmF1bHQKCQkgKgkKCQkgKglAcGFyYW0JCSRwYXRocwlhcnJheQlQYXRocyB0byBzZXQgb3IgbWVyZ2UKCQkgKglAcGFyYW0JCSRtZXJnZQlib29sCVRydWUgKGRlZmF1bHQpIGlmIG1lcmdpbmcgcGF0aHMgd2l0aCBjdXJyZW50IHBhdGhzCgkJICoJQHBhcmFtCQkkYmVmb3JlCWJvb2wJVHJ1ZSAoZGVmYXVsdCkgaWYgcGF0aHMgdG8gYmUgcHJlcGVuZGVkCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9leGVjdXRhYmxlX3BhdGhzKCBhcnJheSAkcGF0aHMsICRtZXJnZSA9IHRydWUsICRiZWZvcmUgPSB0cnVlICkgewoJCQoJCQlpZiAoIHRydWUgPT09ICRtZXJnZSApIHsKCQkJCgkJCQlpZiAoIHRydWUgPT09ICRiZWZvcmUgKSB7CgkJCQkKCQkJCQkkdGhpcy0+X2V4ZWN1dGFibGVfcGF0aHMgPSBhcnJheV9tZXJnZSggJHBhdGhzLCAkdGhpcy0+X2V4ZWN1dGFibGVfcGF0aHMgKTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQoJCQkJCSR0aGlzLT5fZXhlY3V0YWJsZV9wYXRocyA9IGFycmF5X21lcmdlKCAkdGhpcy0+X2V4ZWN1dGFibGVfcGF0aHMsICRwYXRocyApOwoJCQkJCgkJCQl9CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSR0aGlzLT5fZXhlY3V0YWJsZV9wYXRocyA9ICRwYXRoczsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkdGhpczsKCQkJCQkJCgkJfQoKCQkvKioKCQkgKglkZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSgpCgkJICoJCgkJICoJUmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5IGFuZCBpdCdzIGNvbnRlbnQKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkZGlyZWN0b3J5CURpcmVjdG9yeSB0byBkZWxldGUKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgb3BlcmF0aW9uIGZ1bGx5IHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZGlyZWN0b3J5ICkgewoKCQkJLy8gUmVtb3ZlIGFueSB0cmFpbGluZyBkaXJlY3Rvcnkgc2VwYXJhdG9yIHNvIHdlIGtub3cgd2hlcmUgd2UgYXJlCgkJCSRkaXJlY3RvcnkgPSBydHJpbSggJGRpcmVjdG9yeSwgc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKTsKCQkJCgkJCS8vIE5vbi1leGlzdGVudCBkaXJlY3Rvcnkgc28gcHJldGVuZCB3ZSBkZWxldGVkIGl0IG9rCgkJCWlmICggIWZpbGVfZXhpc3RzKCAkZGlyZWN0b3J5ICkgKSB7CgkJCQoJCQkJcmV0dXJuIHRydWU7CgkJCQkKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIGl0IHdhc24ndCBqdXN0IGEgZmlsZSBvciBsaW5rIC0gaWYgc28ganVzdCBkZWxldGUgaXQgYW5kIHJldHVybgkJCQoJCQlpZiAoICFpc19kaXIoICRkaXJlY3RvcnkgKSB8fCBpc19saW5rKCAkZGlyZWN0b3J5ICkgKSB7CgkJCQoJCQkJcmV0dXJuIEB1bmxpbmsoICRkaXJlY3RvcnkgKTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBTbyBpdCBpcyBhIGRpcmVjdG9yeSBzbyBwcm9jZXNzIGNvbnRlbnQKCQkJZm9yZWFjaCAoIHNjYW5kaXIoICRkaXJlY3RvcnkgKSBhcyAkaXRlbSApIHsKCQkJCgkJCQkvLyBTa2lwIHRoZSB0aGlzIGFuZCBwYXJlbnQgZGlyZWN0b3JpZXMKCQkJCWlmICggJGl0ZW0gPT0gJy4nIHx8ICRpdGVtID09ICcuLicgKSB7CgkJCQkKCQkJCQljb250aW51ZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gRGVsZXRlIHRoZSBpdGVtIGlmIHdlIGNhbgkJCQoJCQkJaWYgKCAhJHRoaXMtPmRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZGlyZWN0b3J5IC4gIi8iIC4gJGl0ZW0gKSApIHsKCQkJCQoJCQkJCS8vIFRPRE86IFN1cHBvc2VkbHkgY2hhbmdlIHRoZSBwZXJtcyBvbiB0aGUgaXRlbSBzbyB3ZSBjYW4gZGVsZXRlIGl0PwoJCQkJCUBjaG1vZCggJGRpcmVjdG9yeSAuICIvIiAuICRpdGVtLCAwNzc3ICk7CgkJCQkJCgkJCQkJaWYgKCAhJHRoaXMtPmRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZGlyZWN0b3J5IC4gIi8iIC4gJGl0ZW0gKSApIHsKCQkJCQkKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuIEBybWRpciggJGRpcmVjdG9yeSApOwoJCQkJCgkJfQoJCQoJCS8qCV9yZW5kZXJfZXhjbHVzaW9uc19maWxlKCkKCQkgKgkKCQkgKglmdW5jdGlvbiBkZXNjcmlwdGlvbgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkZmlsZQkJCUZpbGUgdG8gd3JpdGUgZXhjbHVzaW9ucyBpbnRvLgoJCSAqCUBwYXJhbQkJYXJyYXkJCSRleGNsdXNpb25zCQlBcnJheSBvZiBkaXJlY3Rvcmllcy9wYXRocyB0byBleGNsdWRlLiBPbmUgcGVyIGxpbmUuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBfcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSggJGZpbGUsICRleGNsdXNpb25zICkgewoJCQoJCQkvLyBBcnJheSBmb3IgY2xlYW5lZCB1cCBleGNsdXNpb25zIGxpc3QKCQkJJHNhbml0aXplZF9leGNsdXNpb25zID0gYXJyYXkoKTsKCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0NyZWF0aW5nIGJhY2t1cCBleGNsdXNpb25zIGZpbGUgYCcgLiAkZmlsZSAuICdgLicgKTsKCQkJLy8kZXhjbHVzaW9ucyA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9kaXJlY3RvcnlfZXhjbHVzaW9ucygpOwoJCQkKCQkJLy8gVGVzdCBlYWNoIGV4Y2x1c2lvbiBmb3IgdmFsaWRpdHkgKHByZXNlbmNlKSBhbmQgZHJvcCB0aG9zZSBub3QgYWN0dWFsbHkgcHJlc2VudAoJCQlmb3JlYWNoKCAkZXhjbHVzaW9ucyBhcyAkZXhjbHVzaW9uICkgewoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgcGxhdGZvcm0gc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvcnMgYXJlIHVzZWQgKGNvdWxkIGhhdmUgbWlncmF0ZWQgZnJvbSBkaWZmZXJlbnQgcGxhdGZvcm0pCgkJCQkkZXhjbHVzaW9uID0gcHJlZ19yZXBsYWNlKCAnfFsnIC4gYWRkc2xhc2hlcyggc2VsZjo6RElSRUNUT1JZX1NFUEFSQVRPUlMgKSAuICddK3wnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkZXhjbHVzaW9uICk7CgkJCQkKCQkJCS8vIERJUkVDVE9SWS4KCQkJCWlmICggaXNfZGlyKCBBQlNQQVRIIC4gbHRyaW0oICRleGNsdXNpb24sIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApICkgewoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0V4Y2x1ZGluZyBkaXJlY3RvcnkgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCQoJCQkJCS8vIE5lZWQgdG8gYWRkIHRoZSB3aWxkY2FyZCBzbyB0aGF0IHppcCB3aWxsIGV4Y2x1ZGUgdGhlIGRpcmVjdG9yeSBhbmQgY29udGVudAoJCQkJCSRleGNsdXNpb24gPSBydHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICcqJzsKCQkJCQoJCQkJLy8gRklMRS4KCQkJCX0gZWxzZWlmICggaXNfZmlsZSggQUJTUEFUSCAuIGx0cmltKCAkZXhjbHVzaW9uLCBESVJFQ1RPUllfU0VQQVJBVE9SICkgKSApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdFeGNsdWRpbmcgZmlsZSBgJyAuICRleGNsdXNpb24gLiAnYC4nICk7CgkJCQkKCQkJCS8vIFNZTUJPTElDIExJTksuCgkJCQl9IGVsc2VpZiAoIGlzX2xpbmsoIEFCU1BBVEggLiBsdHJpbSggJGV4Y2x1c2lvbiwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgKSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRXhjbHVkaW5nIHN5bWJvbGljIGxpbmsgYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCgkJCQkvLyBET0VTIE5PVCBFWElTVC4KCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnT21pdHRpbmcgZXhjbHVzaW9uIGFzIGZpbGUvZGlyZWN0b3J5IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdDogYCcgLiAkZXhjbHVzaW9uIC4gJ2AuJyApOwoJCQkJCQoJCQkJCS8vIFNraXAgdG8gbmV4dCBleGNsdXNpb24KCQkJCQljb250aW51ZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gV2UgaGF2ZSBhIHZhbGlkIGV4Y2x1ZGUgc28gYWRkIGl0CgkJCQkkc2FuaXRpemVkX2V4Y2x1c2lvbnNbXSA9ICRleGNsdXNpb247CgkJCQkKCQkJfQoJCQkKCQkJLy8gUHV0IHRoZSBleGNsdXNpb25zIHRvIGEgZmlsZSBhcyBhIHN0cmluZwoJCQlmaWxlX3B1dF9jb250ZW50cyggJGZpbGUsIGltcGxvZGUoIFBIUF9FT0wsICRzYW5pdGl6ZWRfZXhjbHVzaW9ucyApIC4gUEhQX0VPTCApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdCYWNrdXAgZXhjbHVzaW9ucyBmaWxlIGNyZWF0ZWQuJyApOwoJCQkKCQl9IC8vIEVuZCByZW5kZXJfZXhjbHVzaW9uc19maWxlKCkuCgkJCgkJLyoqCgkJICoJc2xhc2hpZnkoKQoJCSAqCgkJICoJQSBmdW5jdGlvbiB0byBhZGQgYSBzbGFzaCB0byB0aGUgZW5kIG9mIGEgcGF0aC4gSXQgaXMgbXVjaCBsaWtlIHRoZSBXb3JkUHJlc3MgdHJhaWxpbmdzbGFzaGl0KCkKCQkgKglidXQgYWxsb3dzIGZvciBub3QgYWRkaW5nIGEgc2xhc2ggdG8gYW4gZW1wdHkgcGF0aC4gV2lsbCBhZGQgYSBub3JtYWxpemVkIHNsYXNoIHVubGVzcyBvdmVycmlkZGVuCgkJICoJTm90ZTogV2lsbCBub3QgcHJvY2VzcyBhbnkgZW1iZWRkZWQgZGlyZWN0b3J5IHNlcGFyYXRvcnMKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJJHBhdGgJCQkJCVRoZSBwYXRoIHRvIGFkZCBhIHRyYWlsaW5nIHNsYXNoIHRvCgkJICoJQHBhcmFtCWJvb2wJJGlnbm9yZV9lbXB0eQkJCVRydWUgKGRlZmF1bHQpIGlmIHNob3VsZCBfbm90XyBhZGQgYSB0cmFpbGluZyBzbGFzaCB0byBhbiBlbXB0eSBwYXRoCgkJICoJQHBhcmFtCWJvb2wJJHVzZV9ub3JtYWxpemVkX3NsYXNoCVRydWUgKGRlZmF1bHQpIHRvIGFkZCBhIG5vcm1hbGl6ZWQgc2xhc2gsIG90aGVyd2lzZSBhZGQgcGxhdGZvcm0gc2VwYXJhdG9yCgkJICoJQHJldHVybglzdHJpbmcJCQkJCQkJVGhlIHBhdGggd2l0aCB0cmFpbGluZyBzbGFzaCBvcHRpb25hbGx5IGFkZGVkCgkJICoKCQkgKi8KCQkgCgkJIHByb3RlY3RlZCBmdW5jdGlvbiBzbGFzaGlmeSggJHBhdGgsICRpZ25vcmVfZW1wdHkgPSB0cnVlLCAkdXNlX25vcm1hbGl6ZWRfc2xhc2ggPSB0cnVlICkgewoJCSAKCQkgCS8vIENoZWNrIGlmIGl0IGlzIGVtcHR5IG5vdyBiZWZvcmUgd2UgbWF5IHJlbW92ZSBhIHNpbmdsZSBzbGFzaAoJCSAJaWYgKCAhICggZW1wdHkoICRwYXRoICkgJiYgKCB0cnVlID09PSAkaWdub3JlX2VtcHR5ICkgKSApIHsKCQkgCQoJCQkJLy8gRmlyc3QgcmVtb3ZlIGFueSB0cmFpbGluZyBzbGFzaCB0aGF0IG1heSBiZSBwcmVzZW50CgkJCQkkcGF0aCA9ICR0aGlzLT51bnNsYXNoaWZ5KCAkcGF0aCApOwoJCQkJCgkJCQlpZiAoIHRydWUgPT09ICR1c2Vfbm9ybWFsaXplZF9zbGFzaCApIHsKCQkJCQoJCQkJCSRwYXRoID0gJHBhdGggLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkkcGF0aCA9ICRwYXRoIC4gRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCQoJCQkJfQoJCQkJCgkJIAl9CgkJIAkKCQkgCXJldHVybiAkcGF0aDsKCQkgCgkJIH0KCQkKCQkvKioKCQkgKgl1bnNsYXNoaWZ5KCkKCQkgKgoJCSAqCUEgZnVuY3Rpb24gdG8gcmVtb3ZlIGEgc2xhc2ggdG8gdGhlIGVuZCBvZiBhIHBhdGguIEl0IGlzIG11Y2ggbGlrZSB0aGUgV29yZFByZXNzIHVudHJhaWxpbmdzbGFzaGl0KCkKCQkgKglidXQgY29wZXMgd2l0aCBlaXRoZXIgZm9ybSBvZiB0cmFpbGluZyBzbGFzaC4KCQkgKglOb3RlOiBXaWxsIG5vdCBwcm9jZXNzIGFueSBlbWJlZGRlZCBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBhbmQgbWF5IHByb2R1Y2UgYW4gZW1wdHkgcGF0aC4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJJHBhdGgJCQkJCVRoZSBwYXRoIHRvIHJlbW92ZSBhIHRyYWlsaW5nIHNsYXNoIGZyb20KCQkgKglAcGFyYW0JYm9vbAkkaWdub3JlX2VtcHR5CQkJVHJ1ZSAoZGVmYXVsdCkgaWYgc2hvdWxkIHByb2NlZWQgZXZlbiBpZiB3aWxsIHByb2R1Y2UgYW4gZW1wdHkgcGF0aAoJCSAqCUByZXR1cm4Jc3RyaW5nCQkJCQkJCVRoZSBwYXRoIHdpdGggdHJhaWxpbmcgc2xhc2ggcmVtb3ZlZAoJCSAqCgkJICovCgkJIAoJCSBwcm90ZWN0ZWQgZnVuY3Rpb24gdW5zbGFzaGlmeSggJHBhdGgsICRpZ25vcmVfZW1wdHkgPSB0cnVlICkgewoJCSAKCQkgCS8vIENyZWF0ZSBhIGNhbmRpZGF0ZSBwYXRoIHRvIG9wdGlvbmFsbHkgcmV0dXJuCgkJIAkkY2FuZGlkYXRlX3BhdGggPSBydHJpbSggJHBhdGgsIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICk7CgkJIAoJCSAJLy8gSWYgY2FuZGlkYXRlIGlzbid0IGVtcHR5IG9yIHdlJ3JlIGlnbm9yaW5nIGl0IGJlaW5nIGVtcHR5IGFueXdheQoJCSAJaWYgKCAhZW1wdHkoICRjYW5kaWRhdGVfcGF0aCApIHx8ICggdHJ1ZSA9PT0gJGlnbm9yZV9lbXB0eSApICkgewoJCSAJCgkJCQkkcGF0aCA9ICRjYW5kaWRhdGVfcGF0aDsKCQkJCQoJCSAJfQoJCSAJCgkJIAlyZXR1cm4gJHBhdGg7CgkJIAoJCSB9CgkJCgkJLyoqCgkJICoJbG9nX3ppcF9yZXBvcnRzKCkKCQkgKgoJCSAqCUEgZnVuY3Rpb24gdG8gcHJvY2VzcyByZXBvcnRzIHBhcnNlZCBmcm9tIHRoZSB6aXAgcHJvY2VzcyBvdXRwdXQgYW5kIGxvZyB0aGVtIGFuZCBvcHRpb25hbGx5CgkJICoJc2VuZCB0byBhIGZpbGUgaWYgdGhlcmUgYXJlIGEgbG90IG9mIHJlcG9ydHMuIElmIHRoZSBudW1iZXIgb2YgcmVwb3J0cyBpcyBzdWNoIHRoYXQgdGhleSByZXF1aXJlCgkJICoJdG8gYmUgd3JpdHRlbiB0byBhIGZpbGUgdGhlbiBhbGwgdGhlIHJlcG9ydHMgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBmaWxlLCBub3QganVzdCB0aGUgb3ZlcmZsb3cuCi4JCSAqCgkJICoJQHBhcmFtCWFycmF5CSRyZXBvcnRzX2xvZwkJCWFycmF5IGNvbnRhaW5pbmcgdGhlIHR5cGUgb2YgcmVwb3J0cyB0byBsb2cKCQkgKglAcGFyYW0JYXJyYXkJJHJlcG9ydHNfZGVzYwkJCWFycmF5IGNvbnRhaW5pbmcgdGV4dCBkZXNjcmlwdGlvbiBvZiByZXBvcnQgcmVhc29uCgkJICoJQHBhcmFtCXN0cmluZwkkcmVwb3J0X3ByZWZpeAkJCWEgcHJlZml4IHN0cmluZyB0byBnbyBiZWZvcmUgdGhlIHJlcG9ydCB0ZXh0CgkJICoJQHBhcmFtCWludGVnZXIJJHJlcG9ydF9saW5lc190b19zaG93CXRoZSBudW1iZXIgb2YgcmVwb3J0cyB0byBzaG93IGluIGxvZyBiZWZvcmUgb3ZlcmZsb3dpbmcgdG8gYSBmaWxlCgkJICoJQHBhcmFtCXN0cmluZwkkcmVwb3J0X2ZpbGUJCQlvdmVyZmxvdyBmaWxlIGlmIHRvbyBtYW55IHJlcG9ydHMgdG8gc2hvdyBkaXJlY3RseSBpbiBsb2cKCQkgKglAcmV0dXJuCU4vQQkJCQkJCQkJQ3VycmVudGx5IG5vIHJldHVybiBwYXJhbWV0ZXIKCQkgKgoJCSAqLwoJCSAKCQlwcm90ZWN0ZWQgZnVuY3Rpb24gbG9nX3ppcF9yZXBvcnRzKCAkcmVwb3J0c19sb2csICRyZXBvcnRfZGVzYywgJHJlcG9ydF9wcmVmaXgsICRyZXBvcnRfbGluZXNfdG9fc2hvdywgJHJlcG9ydHNfZmlsZSApIHsKCgkJCSRyZXBvcnRzID0gYXJyYXkoKTsKCQkJJHJlcG9ydHNfY291bnQgPSAwOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQkvLyBNYWtlIHN1cmUgd2UgY2xlYXIgdXAgYW50IHByZXZpb3VzIHJlcG9ydHMgZmlsZSB0aGF0IG1heSBzdGlsbCBiZSBwcmVzZW50CgkJCWlmICggQGZpbGVfZXhpc3RzKCAkcmVwb3J0c19maWxlICkgKSB7CgkKCQkJCUB1bmxpbmsoICRyZXBvcnRzX2ZpbGUgKTsKCQkKCQkJfQoKCQkJLy8gUGFyc2UgdGhlIHJlcG9ydHMgYXJyYXkgaW50byBhbiBvcmRlcmVkIGFycmF5IGJhc2VkIG9uIGlkIChsb2cgbGluZSBudW1iZXIpIGFzIHNvcnQga2V5CgkJCWZvcmVhY2ggKCAkcmVwb3J0c19sb2cgYXMgJHJlYXNvbiA9PiAkcmVwb3J0ICkgewoJCgkJCQlmb3JlYWNoICggJHJlcG9ydCBhcyAkaWQgPT4gJGZpbGVuYW1lICkgewoKCQkJCQkkcmVwb3J0c1sgJGlkIF0gPSBzcHJpbnRmKCBfXyggJyUxJHM6ICglMiRzKTogJTMkcycgLiBQSFBfRU9MLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkcmVwb3J0X3ByZWZpeCwgJHJlcG9ydF9kZXNjWyAkcmVhc29uIF0sICRmaWxlbmFtZSApOwoKCQkJCX0KCQoJCQl9CgkKCQkJLy8gTWFrZSBzdXJlIGFycmF5IGlzIG5vdyBvcmRlcmVkIGJ5IHRoZSBudW1lcmljIGxvZyBsaW5lIG51bWJlciBrZXkKCQkJJHJlc3VsdCA9IGtzb3J0KCAkcmVwb3J0cywgU09SVF9OVU1FUklDICk7CgoJCQkvLyBBbHdheXMgc2hvdyB0aGUgZmlyc3QgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBsb2cKCQkJJHNob3dfbGluZXMgPSBhcnJheV9zbGljZSggJHJlcG9ydHMsIDAsICRyZXBvcnRfbGluZXNfdG9fc2hvdywgdHJ1ZSApOwoKCQkJZm9yZWFjaCAoICRzaG93X2xpbmVzIGFzICRsaW5lICkgewoKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgcHJvY2VzcyByZXBvcnRlZDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRsaW5lICk7CgoJCQl9CgkJCgkJCS8vIElmIHRoZXJlIHdlcmUgbW9yZSBsaW5lcyB0aGVuIG91dHB1dCB0aGUgd2hvbGUgdG8gdGhlIHJlcG9ydCBmaWxlCgkJCSRyZXBvcnRzX2NvdW50ID0gc2l6ZW9mKCAkcmVwb3J0cyApOwoJCQlpZiAoICRyZXBvcnRzX2NvdW50ICA+ICRyZXBvcnRfbGluZXNfdG9fc2hvdyApIHsKCQoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCAkcmVwb3J0c19maWxlLCAkcmVwb3J0cyApOwoJCQoJCQkJaWYgKCBAZmlsZV9leGlzdHMoICRyZXBvcnRzX2ZpbGUgKSApIHsKCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQgJTEkcyBtb3JlICUyJHMgcmVwb3J0JTMkcyAtIHBsZWFzZSByZXZpZXcgaW46ICU0JHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAoICRyZXBvcnRzX2NvdW50IC0gJHJlcG9ydF9saW5lc190b19zaG93ICksICRyZXBvcnRfcHJlZml4LCAoICggMSA9PSAkcmVwb3J0c19jb3VudCApID8gJycgOiAncycgKSwgJHJlcG9ydHNfZmlsZSApICk7CgkJCQoJCQkJfQoJCQoJCQl9CgkJCQoJCX0KCQkKCQkvKioKCQkgKglpc19hdmFpbGFibGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCB0ZXN0cyBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgc3BlY2lmaWMgbWV0aG9kIGFuZCBpdHMgYXZhaWxhYmxlIG1vZGVzLiBXaWxsIHRlc3QgZm9yCgkJICogIG11bHRpcGxlIG1vZGVzICh6aXAgJiB1bnppcCkgYW5kIG9ubHkgcmV0dXJuIGZhbHNlIGlmIG5laXRoZXIgaXMgYXZhaWxhYmxlLiBBY3R1YWwgYXZhaWxhYmxlIG1vZGVzIHdpbGwKCQkgKiAgYmUgaW5kaWNhdGVkIGluIHRoZSBtZXRob2QgYXR0cmlidXRlcy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcglUZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSBmb3IgYW55IHRlc3QgZmlsZXMgKG11c3QgYmUgd3JpdGVhYmxlKQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3Qgb25lIG1vZGUsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGlzX2F2YWlsYWJsZSggJHRlbXBkaXIgKTsKCQkKCQkvKioKCQkgKgljcmVhdGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZQoJCSAqCQoJCSAqCVRoZSAkZXhjbHVkZXMgd2lsbCBiZSBhIGxpc3Qgb3IgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBpZiB0aGUgJGxpc3RtYWtlciBvYmplY3QgaXMgTlVMTCBvdGhlcndpc2UKCQkgKgl3aWxsIGJlIGFic29sdXRlIHBhdGggZXhjbHVkZXMgYW5kIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgY2FuIGJlIGhhZCBmcm9tIHRoZSAkbGlzdG1ha2VyIG9iamVjdAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXAJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgQXJjaGl2ZSBmaWxlIHRvIGNyZWF0ZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRkaXIJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtZQkJYXJyYXkJJGV4Y2x1ZGVzCQlMaXN0IG9mIGVpdGhlciBhYnNvbHV0ZSBwYXRoIGV4Y2x1c2lvbnMgb3IgcmVsYXRpdmUgZXhjbHVzaW9ucwoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcGFyYW0JCW9iamVjdAkkbGlzdG1ha2VyCQlUaGUgb2JqZWN0IGZyb20gd2hpY2ggd2UgY2FuIGdldCBhbiBpbmNsdXNpb25zIGxpc3QKCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY3JlYXRlKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyID0gTlVMTCApOwoJCQoJCS8qKgoJCSAqCWV4dHJhY3QoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgPSBhcnJheSgpICk7CgoJCS8qKgoJCSAqCWZpbGVfZXhpc3RzKCkKCQkgKgkKCQkgKglUZXN0cyB3aGV0aGVyIGEgZmlsZSAod2l0aCBwYXRoKSBleGlzdHMgaW4gdGhlIGdpdmVuIHppcCBmaWxlCgkJICoJSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUBwYXJhbQkJYm9vbAkkbGVhdmVfb3BlbgkJT3B0aW9uYWw6IFRydWUgaWYgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBsZWZ0IG9wZW4KCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBmaWxlIGlzIGZvdW5kIGluIHRoZSB6aXAgb3RoZXJ3aXNlIGZhbHNlCgkJICoKCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZmlsZV9leGlzdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICk7CgkJCgkJLyoJZ2V0X2ZpbGVfbGlzdCgpCgkJICoJCgkJICoJR2V0IGFuIGFycmF5IG9mIGFsbCBmaWxlcyBpbiBhIHppcCBmaWxlIHdpdGggc29tZSBmaWxlIHByb3BlcnRpZXMuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQlUaGUgZmlsZSB0byBsaXN0IHRoZSBjb250ZW50IG9mCgkJICoJQHJldHVybgkJYm9vbHxhcnJheQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBvdGhlcndpc2UgYXJyYXkgb2YgZmlsZSBwcm9wZXJ0aWVzIChtYXkgYmUgZW1wdHkpCgkJICovCgkJYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGdldF9maWxlX2xpc3QoICR6aXBfZmlsZSApOwoJCQoJCS8qCXNldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gc2V0IGNvbW1lbnQgb24uCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkY29tbWVudAkJQ29tbWVudCB0byBhcHBseSB0byBhcmNoaXZlLgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCgkJICovCgkJYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHNldF9jb21tZW50KCAkemlwX2ZpbGUsICRjb21tZW50ICk7CgoJCS8qCWdldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byByZXRyaWV2ZSBjb21tZW50IGZyb20uCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCWZhbHNlIG9uIGZhaWx1cmUsIFppcCBjb21tZW50IG90aGVyd2lzZS4KCQkgKi8KCQlhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbW1lbnQoICR6aXBfZmlsZSApOwoJCQoKCX0gLy8gZW5kIHBsdWdpbmJ1ZGR5X3piemlwY29yZSBjbGFzcy4JCgkKfQo/Pgo=
###PACKDATA,FILE_END,/lib/zipbuddy/zbzipcore.php,importbuddy/lib/zipbuddy/zbzipcore.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzipexec.php,importbuddy/lib/zipbuddy/zbzipexec.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwZXhlYyBDbGFzcwogKgogKiAgRXh0ZW5kcyB0aGUgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcyB3aXRoIHByb2Mgc3BlY2lmaWMgY2FwYWJpbGl0eQogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcGV4ZWMiICkgKSB7CgoJY2xhc3MgcGx1Z2luYnVkZHlfemJ6aXBleGVjIGV4dGVuZHMgcGx1Z2luYnVkZHlfemJ6aXBjb3JlIHsKCQoJCS8vIENvbnN0YW50cyBmb3IgZmlsZSBoYW5kbGluZwoJCWNvbnN0IFpJUF9MT0dfRklMRV9OQU1FICAgICAgICA9ICd0ZW1wX3ppcF9leGVjX2xvZy50eHQnOwoJCWNvbnN0IFpJUF9FUlJPUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X2V4ZWNfZXJyb3JzLnR4dCc7CgkJY29uc3QgWklQX1dBUk5JTkdTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfZXhlY193YXJuaW5ncy50eHQnOwoJCWNvbnN0IFpJUF9PVEhFUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X2V4ZWNfb3RoZXJzLnR4dCc7CgkJY29uc3QgWklQX0VYQ0xVU0lPTlNfRklMRV9OQU1FID0gJ2V4Y2x1c2lvbnMudHh0JzsKCQljb25zdCBaSVBfSU5DTFVTSU9OU19GSUxFX05BTUUgPSAnaW5jbHVzaW9ucy50eHQnOwoJCWNvbnN0IFpJUF9URVNUX0ZJTEUgICAgICAgICAgICA9ICcvemJ6aXAucGhwJzsgLy8gQ29udGFpbnMgZmlsZSB0ZXN0LnR4dCB3aXRoIGNvbnRlbnQgIkhlbGxvIFdvcmxkIgoJCWNvbnN0IFpJUF9URVNUX0ZJTEVfU0lHICAgICAgICA9ICIwYTBmOWIyOGM1ZmY4OWRmYjRmMmEwNDcyYmUwZWE4ZiI7CgkJCgkJLy8gUG9zc2libGUgZXhlY3V0YWJsZSBwYXRoIHNldHMKCQljb25zdCBERUZBVUxUX0VYRUNVVEFCTEVfUEFUSFMgPSAnL3Vzci9sb2NhbC9iaW46Oi91c3IvYmluOi91c3IvbG9jYWwvc2JpbjovdXNyL3NiaW46L3NiaW46L2Jpbic7CgkJY29uc3QgV0lORE9XU19FWEVDVVRBQkxFX1BBVEhTID0gJyc7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogbWV0aG9kIHRhZyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBtZXRob2QgYW5kIGVudGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdCBzdWNoIGFzIGNsYXNzIG5hbWUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyICRfbWV0aG9kX3RhZyAJc3RyaW5nCiAgICAgICAgICovCgkJcHVibGljIHN0YXRpYyAkX21ldGhvZF90YWcgPSAnZXhlYyc7CgkJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyByZWdhcmRlZCBhcyBhICJjb21wYXRpYmlsaXR5IiBtZXRob2QKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgPSBmYWxzZTsKCQkJCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyB0ZWxscyB1cyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoaXMgbWV0aG9kIHNvIHRoZXkgY2FuIGJlIGNoZWNrIHRvIHNlZSBpZiB0aGUgbWV0aG9kIGNhbiBiZSBzdXBwb3J0ZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5CiAgICAgICAgICovCgkJcHVibGljIHN0YXRpYyAkX21ldGhvZF9kZXBlbmRlbmNpZXMgPSBhcnJheSggJ2NsYXNzZXMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnZnVuY3Rpb25zJyA9PiBhcnJheSggJ2V4ZWMnICksCgkJCQkJCQkJCQkJICAJCSAnZXh0ZW5zaW9ucycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdmaWxlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdjaGVja19mdW5jJyA9PiAnY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMnCgkJCQkJCQkJCQkJCQkpOwoJCQkKICAgICAgICAvKioKICAgICAgICAgKiBCb29sZWFuIHRvIGluZGljYXRlIGlmIHdlIGNhbiBzdXBwb3J0IGNvbW1lbnQgaGFuZGxpbmcgYmFzZWQgb24gZGVwZW5kZW5jeSBjaGVjawogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgJF9hbGxvd19pc19jb21tZW50ZXIgYm9vbAogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCBzdGF0aWMgJF9hbGxvd19pc19jb21tZW50ZXIgPSB0cnVlOwogICAgICAgIAoJCS8qKgoJCSAqIAoJCSAqIGdldF9tZXRob2RfdGFnX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIHN0YXRpYyBtZXRob2QgdGFnIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCXN0cmluZwlUaGUgbWV0aG9kIHRhZwoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX21ldGhvZF90YWc7CgkJCQoJCX0KCgkJLyoqCgkJICogCgkJICogZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIGNvbXBhdGliaWxpdHkgbWV0aG9kIGluZGljYXRvciBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlib29sCVRydWUgaWYgaXMgYSBjb21wYXRpYmlsaXR5IG1ldGhvZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Rfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9pc19jb21wYXRpYmlsaXR5X21ldGhvZDsKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIG1ldGhvZCBkZXBlbmRlbmNpZXMgYXJyYXkgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYXJyYXkJVGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVxdWlyZXMgdG8gYmUgYSBzdXBwb3J0ZWQgbWV0aG9kCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfbWV0aG9kX2RlcGVuZGVuY2llczsKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljKCkKCQkgKgoJCSAqIEFsbG93cyBhZGRpdGlvbmFsIG1ldGhvZCBkZXBlbmRlbmN5IGNoZWNrcyBiZXlvbmQgdGhlIHN0YW5kYXJkIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgY2hlY2tzIHBhc3NlZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJJHJlc3VsdCA9IHRydWU7CgkJCQoJCQkvLyBOZWVkIHRvIGNoZWNrIGlmIGZ1bmN0aW9uIGVzY2FwZXNoZWxsYXJnIG9zIGF2YWlsYWJsZSAtIGlmIG5vdCB0aGVuIGV4ZWMgY2Fubm90CgkJCS8vIGJlIHVzZWQgZm9yIGNvbW1lbnQgaGFuZGxpbmcuIFRoaXMgaXNuJ3QgYSBzaG93IHN0b3BwZXIgc28gd2UnbGwgcmV0dXJuIHRydWUKCQkJLy8gYnV0IHNldCBhbiBpbnRlcm5hbCBmbGFnIHRvIGRpc2FibGUgY29tbWVudGluZyBjYXBhYmlsaXR5LgoJCQkKCQkJJGZ1bmN0aW9ucyA9IGFycmF5KCAnZXNjYXBlc2hlbGxhcmcnICk7CgkJCQoJCQkkZGlzYWJsZWRfZnVuY3Rpb25zID0gYXJyYXlfbWFwKCAidHJpbSIsIGV4cGxvZGUoICcsJywgaW5pX2dldCggJ2Rpc2FibGVfZnVuY3Rpb25zJyApICkgKTsKCQkJCgkJCS8vIENoZWNrIGVhY2ggZnVuY3Rpb24gZGVwZW5kZW5jeSBhbmQgYmFpbCBvdXQgb24gZmlyc3QgZmFpbHVyZQoJCQlmb3JlYWNoICggJGZ1bmN0aW9ucyBhcyAkZnVuY3Rpb24gKSB7CgkJCQoJCQkJJGZ1bmN0aW9uID0gdHJpbSggJGZ1bmN0aW9uICk7CgkJCQkKCQkJCWlmICggISggKCBmdW5jdGlvbl9leGlzdHMoICRmdW5jdGlvbiApICkgJiYgKCAhaW5fYXJyYXkoICRmdW5jdGlvbiwgJGRpc2FibGVkX2Z1bmN0aW9ucyApICkgKSApIHsKCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCWJyZWFrOwoJCQkJCQoJCQkJfQoJCQkKCQkJfQoJCQkKCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCgkJCQkvLyBGb3VuZCB0aGF0IGVzY2FwZXNoZWxsYXJnIG5vdCBhdmFpbGFibGUgc28gZXhlYyBjYW5ub3QgYmUgdXNlZCBmb3IgY29tbWVudCBoYW5kbGluZwoJCQkJc2VsZjo6JF9hbGxvd19pc19jb21tZW50ZXIgPSBmYWxzZTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiB0cnVlOwoJCQoJCX0KCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRwYXJlbnQJCVtvcHRpb25hbF0gUmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdHVzKCkgZnVuY3Rpb24gZm9yIHN0YXR1cyB1cGRhdGVzLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJiRwYXJlbnQgPSBOVUxMICkgewoKCQkJcGFyZW50OjpfX2NvbnN0cnVjdCggJHBhcmVudCApOwoJCQkKCQkJLy8gU2V0IHRoZSBpbnRlcm5hbCBmbGFnIGluZGljYXRpbmcgaWYgZXhlY19kaXIgaXMgc2V0IGluIHRoZSBQSFAgZW52aXJvbm1lbnQKCQkJJHRoaXMtPnNldF9leGVjX2Rpcl9mbGFnKCk7CgkJCQoJCQkvLyBPdmVycmlkZSBzb21lIG9mIHBhcmVudCBkZWZhdWx0cwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSwKCQkJCQkJCQkJCQkJCQkJYXJyYXkoICduYW1lJyA9PiAnRXhlYyBNZXRob2QnLAoJCQkJCQkJCQkJCQkJICAJCQkgICAnY29tcGF0aWJpbGl0eScgPT4gcGx1Z2luYnVkZHlfemJ6aXBleGVjOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kICkKCQkJCQkJCQkJCQkJCSAgCSAgICk7CgkJCQkJCQkJCQkJCQkgIAkgICAKCQkJLy8gTm93IHNldCB1cCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlIHBhdGhzIChub3QgbWVyZ2luZyBidXQgc2V0dGluZykKCQkJLy8gTm90ZTogUGFyZW50IGNvbnN0cnVjdG9yIHNldCB0aGUgb3MgdHlwZSB2YWx1ZQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCgkJCQkJJHRoaXMtPnNldF9leGVjdXRhYmxlX3BhdGhzKCBleHBsb2RlKCBQQVRIX1NFUEFSQVRPUiwgc2VsZjo6REVGQVVMVF9FWEVDVVRBQkxFX1BBVEhTICksIGZhbHNlKTsKCQkJCQlicmVhazsKCQkJCQkKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJCgkJCQkJJHRoaXMtPnNldF9leGVjdXRhYmxlX3BhdGhzKCBleHBsb2RlKCBQQVRIX1NFUEFSQVRPUiwgc2VsZjo6V0lORE9XU19FWEVDVVRBQkxFX1BBVEhTICksIGZhbHNlKTsKCQkJCQkKCQkJCQkvLyBOZWVkIHRvIG1lcmdlIGluIEFCU1BBVEggaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBzZXQgdGhhdCBpbiB0aGUgZGVmYXVsdHMgLSBpdCBpcyBwcmVwZW5kZWQKCQkJCQkkdGhpcy0+c2V0X2V4ZWN1dGFibGVfcGF0aHMoIGFycmF5KCBydHJpbSggQUJTUEFUSCwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgKTsKCQkJCQlicmVhazsKCQkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkJLy8gTG9nIGVycm9yIGFuZCBsZWF2ZSBwYXRocyBlbXB0eQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1Vua25vd24gT1MgdHlwZSAoJTEkcykgY291bGQgbm90IHNldCBleGVjdXRhYmxlIHBhdGhzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHRoaXMtPmdldF9vc190eXBlKCkgKSApOwoJCQkJCQoJCQl9CgkJCQoJCX0KCQkKCQkvKioKCQkgKglfX2Rlc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGRlc3RydWN0b3IuCgkJICoJCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoICkgewoJCQoJCQlwYXJlbnQ6Ol9fZGVzdHJ1Y3QoKTsKCgkJfQoJCQoJCS8qKgoJCSAqCWdldF9tZXRob2RfdGFnKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSAoc3RhdGljKSBtZXRob2QgdGFnCgkJICoJCgkJICoJQHJldHVybgkJc3RyaW5nIFRoZSBtZXRob2QgdGFnCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZF90YWcoKSB7CgkJCgkJCXJldHVybiBwbHVnaW5idWRkeV96YnppcGV4ZWM6OiRfbWV0aG9kX3RhZzsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgKHN0YXRpYykgaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgYm9vbGVhbgoJCSAqCQoJCSAqCUByZXR1cm4JCWJvb2wKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QoKSB7CgkJCgkJCXJldHVybiBwbHVnaW5idWRkeV96YnppcGV4ZWM6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfY29tbWFuZF9wYXRoKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdGhlIHBhdGggZm9yIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCBmcm9tIHRoZSBtZXRob2QgZGV0YWlscwoJCSAqCUlmIG5vdCBmb3VuZCB0aGVuIHdpbGwgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGljaCBpcyB0aGUgc2FtZSBhcyBpZiB0aGUKCQkgKgljb21tYW5kIGlzIGJlaW5nIGFjY2Vzc2VkIHRocm91Z2ggUEFUSAoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZwkJCQlQYXRoIGZvciBjb21tYW5kLCB0cmltbWVkIC0gbWF5IGJlIGVtcHR5CgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2NvbW1hbmRfcGF0aCggJGNvbW1hbmQgPSBzZWxmOjpDT01NQU5EX1VOS05PV05fUEFUSCApIHsKCQkKCQkJJHJlc3VsdCA9ICcnOwoJCQkKCQkJc3dpdGNoKCAkY29tbWFuZCApIHsKCQkJCgkJCQljYXNlIHNlbGY6OkNPTU1BTkRfWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApICkgewoJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJpbSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApOwoJCQkJCX0KCQkJCQkKCQkJCQlicmVhazsKCQkJCQoJCQkJY2FzZSBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdwYXRoJyBdICkgKSB7CgkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cmltKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3BhdGgnIF0gKTsKCQkJCQl9CgkJCQkJCgkJCQkJYnJlYWs7CgkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkKCQkJCQkvLyBSZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBkZWZhdWx0IGZvciBub3cKCQkJCgkJCX0KCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgc2V0cyB0aGUgemlwIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIG1ldGhvZCBkZXRhaWxzCgkJICoJVXNlICJ6aXAgLWgiIHRvIGdldCBhIHN0YW5kYXJkaXplZCBoZWxwIG91dHB1dCB0aGF0IGNvbnRhaW5zIHRoZSB6aXAgdmVyc2lvbi4KCQkgKglUaGVvcmV0aWNhbGx5IHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSAiemlwIC12IiB0byBnZXQgemlwIHZlcnNpb24gYW5kIGJ1aWxkCgkJICoJZGV0YWlscyBidXQgcHJlLXYzIHppcCBydW5uaW5nICJ6aXAgLXYiIHdpbGwgbm90IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dCBiZWNhdXNlCgkJICoJdGhlcmUgaXMgbm8gdHR5IGF0dGFjaGVkICh3aGVuIHJ1bm5pbmcgdGhyb3VnaCBleGVjKCkgb3IgZXF1aXZhbGVudCksIGluc3RlYWQKCQkgKglpdCB3aWxsIChvciBzaG91bGQpIHByb2R1Y2UgYSB6aXAgZmlsZS4gSG93ZXZlciwgaXQgaGFzIGJlZW4gZm91bmQgdGhhdCBldmVuIHRoaXMKCQkgKglpcyBub3QgcmVsaWFibGUgYW5kIHNvbWUgaW5zdGFsbGF0aW9ucyBqdXN0IHNlZW0gdG8gZnJlZXplIHdoZW4gInppcCAtdiIgaXMgcnVuCgkJICoJd2hpY2ggYm9ya3MgdGhlIHdob2xlIHByb2Nlc3MuCgkJICoJU28gd2UgdXNlICJ6aXAgLWgiIGZpcnN0IHRvIGdldCB0aGUgYmFzaWMgemlwIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGFzIGEgZnV0dXJlCgkJICoJZXh0ZW5zaW9uIGlmIGl0IGlzIHZlcnNpb24gMy4wKyAoMy4wIGlzIGN1cnJlbnQgYW5kIDMuMSBoYXNuJ3QgYmVlbiBvZmZpY2lhbGx5CgkJICoJcmVsZWFzZWQpIHdlIG1heSB0aGVuIHJ1biAiemlwIC12IiB0byBnZXQgdGhlIGV4dGVuZGVkIHZlcnNpb24gYW5kIGJ1aWxkIGluZm9ybWF0aW9uLgoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfemlwX3ZlcnNpb24oICRtYWpvciA9IDAsICRtaW5vciA9IDAsICRvdmVycmlkZSA9IGZhbHNlICkgewoJCQoJCQkkZXhpdGNvZGUgPSAxMjc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRpbmZvID0gJyc7CgkJCgkJCS8vIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbHVlIHRvIHVzZSB3aXRoIG92ZXJyaWRlIHRoZW4ganVzdCB1c2UgaXQKCQkJaWYgKCAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSAmJiAoIHRydWUgPT09ICRvdmVycmlkZSApICkgewoJCQkKCQkJCS8vIFNldCB0aGUgZ2l2ZW4gdmVyc2lvbiByZWdhcmRsZXNzCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdID0gYXJyYXkoICdtYWpvcicgPT4gJG1ham9yLCAnbWlub3InID0+ICRtaW5vciApOwoJCQkJcmV0dXJuICR0aGlzOyAKCQkJCgkJCX0KCQkJCgkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9aSVBfUEFUSCApOwoJCQkKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAgLWgnOwoJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwoJCQkKCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7CgkJCQoJCQkJLy8gRXhwZWN0IGZvcm1hdCBsaWtlOiBaaXAgMy4wIChKdWx5IDV0aCAyMDA4KS4uLgoJCQkJLy8gICAgICAgICAgICAgICAgICAgICBaaXAgMy4xYyBCRVRBIChKdW5lIDIybmQgMjAxMCkuLi4KCQkJCS8vIFRoZSBtYXRjaCBzaG91bGQgdGFrZSBvbmx5IHRoZSBtYWpvci9taW5vciBkaWdpdHMgYW5kIGlnbm9yZSBhbnkgZm9sbG93aW5nIGFscGhhCgkJCQkvLyBNYXkgZXh0ZW5kIHRvIGNhcHR1cmUgdGhlIGFscGhhIGFuZCBhbHNvIHdoZXRoZXIgQkVUQSBpbmRpY2F0ZWQgYnV0IG5vdCBjdXJyZW50bHkKCQkJCS8vIHJlcXVpcmVkLgoJCQkJZm9yZWFjaCAoICRvdXRwdXQgYXMgJGxpbmUgKSB7CgoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcClccysoP1A8bWFqb3I+XGQpXC4oP1A8bWlub3I+XGQrKS9pJywgJGxpbmUsICRtYXRjaGVzICkgKSB7CgkJCQkJCgkJCQkJCSRtYWpvciA9IChpbnQpJG1hdGNoZXNbICdtYWpvcicgXTsKCQkJCQkJJG1pbm9yID0gKGludCkkbWF0Y2hlc1sgJ21pbm9yJyBdOwoJCQkJCQlicmVhazsKCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gSWYgd2UgZGlkbid0IG1hdGNoIGEgdmVyc2lvbiB0aGVuIHN1c3BlY3QgdGhpcyBpcyBzdGlsbCBub3QgdmFsaWQgdmVyc2lvbiBpbmZvCi8vIAkJCQlpZiAoICFlbXB0eSggJG1hdGNoZXMgKSApIHsKLy8gCQkJCQovLyAJCQkJCS8vIFdlIGRpZCBtYXRjaCBhIHZlcnNpb24gc28gY2hlY2sgaWYgd2UgaGF2ZSBhIGNoYW5jZSBvZiBnZXR0aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLy8gCQkJCQlpZiAoIDMgPT09ICRtYWpvciApIHsKLy8gCQkJCQkKLy8gCQkJCQkJJGV4aXRjb2RlID0gMTI3OwovLyAJCQkJCQkkb3V0cHV0ID0gYXJyYXkoKTsKLy8gCQkJCQkKLy8gCQkJCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAovLyAJCQkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAgLXYnOwovLyAJCQkJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwovLyAJCQkJCQkKLy8gCQkJCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7Ci8vIAkJCQkKLy8gCQkJCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGluZm8gc3RyaW5nCi8vIAkJCQkJCQkvLyBOb3RlOiBub3Qgd29ydGggY29tcHJlc3NpbmcgYXMgdGhhdCBnaXZlcyBhIGxhcmdlciBzdHJpbmcgYWZ0ZXIgY29udmVydGluZwovLyAJCQkJCQkJLy8gZnJvbSBiaW5hcnkgdG8gaGV4IGZvcm1hdCBmb3Igc2F2aW5nCi8vIAkJCQkJCQkkaW5mbyA9IGltcGxvZGUoIFBIUF9FT0wsICRvdXRwdXQgKTsKLy8gCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ2luZm8nIF0gPSAkaW5mbzsKLy8gCQkJCQkJCi8vIAkJCQkJCX0KLy8gCQkJCQkKLy8gCQkJCQl9Ci8vIAkJCQkKLy8gCQkJCX0KCQkJCgkJCX0KCgkJCS8vIE5vdyB1c2UgZWl0aGVyIHdoYXQgd2UgZ290IG9yIHdoYXQgd2Ugd2VyZSBnaXZlbi4uLgoJCQlpZiAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSB7CgkJCQoJCQkJLy8gU2V0IHRoZSBnaXZlbiB2ZXJzaW9uIHJlZ2FyZGxlc3MKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3ZlcnNpb24nIF0gPSBhcnJheSggJ21ham9yJyA9PiAkbWFqb3IsICdtaW5vcicgPT4gJG1pbm9yICk7CgkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHRoaXM7IAoJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgZ2V0cyB0aGUgemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfdmVyc2lvbigpIHsKCQkKCQkJJHJlc3VsdCA9ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3ZlcnNpb24nIF07CgkJCQoJCQlpZiAoIDAgPT09ICRyZXN1bHRbICdtYWpvcicgXSApIHsKCQkJCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfdW56aXBfdmVyc2lvbigpCgkJICoJCgkJICoJVGhpcyBzZXRzIHRoZSB1bnppcCB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBtZXRob2QgZGV0YWlscwoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfdW56aXBfdmVyc2lvbiggJG1ham9yID0gMCwgJG1pbm9yID0gMCwgJG92ZXJyaWRlID0gZmFsc2UgKSB7CgkJCgkJCSRleGl0Y29kZSA9IDA7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCgkJCS8vIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbHVlIHRvIHVzZSB3aXRoIG92ZXJyaWRlIHRoZW4ganVzdCB1c2UgaXQKCQkJaWYgKCAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSAmJiAoIHRydWUgPT09ICRvdmVycmlkZSApICkgewoJCQkKCQkJCS8vIFNldCB0aGUgZ2l2ZW4gdmVyc2lvbiByZWdhcmRsZXNzCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3ZlcnNpb24nIF0gPSBhcnJheSggJ21ham9yJyA9PiAkbWFqb3IsICdtaW5vcicgPT4gJG1pbm9yICk7CgkJCQlyZXR1cm4gJHRoaXM7IAoJCQkKCQkJfQoJCQkKCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB1bnppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCSR6aXBwYXRoID0gJHRoaXMtPmdldF9jb21tYW5kX3BhdGgoIHNlbGY6OkNPTU1BTkRfVU5aSVBfUEFUSCApOwoJCQkKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCAtdic7CQoJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwoJCQkKCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7CgkJCQoJCQkJLy8gU2hvdWxkIGJlIGdvb2Qgb3V0cHV0IHRvIHRyeSBhdCBsZWFzdAoJCQkJZm9yZWFjaCAoICRvdXRwdXQgYXMgJGxpbmUgKSB7CgoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHVuemlwKVxzKyg/UDxtYWpvcj5cZClcLig/UDxtaW5vcj5cZCspL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkKCQkJCQkJJG1ham9yID0gKGludCkkbWF0Y2hlc1sgJ21ham9yJyBdOwoJCQkJCQkkbWlub3IgPSAoaW50KSRtYXRjaGVzWyAnbWlub3InIF07CgkJCQkJCWJyZWFrOwoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkKCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGluZm8gc3RyaW5nCgkJCQkvLyBOb3RlOiBub3Qgd29ydGggY29tcHJlc3NpbmcgYXMgdGhhdCBnaXZlcyBhIGxhcmdlciBzdHJpbmcgYWZ0ZXIgY29udmVydGluZwoJCQkJLy8gZnJvbSBiaW5hcnkgdG8gaGV4IGZvcm1hdCBmb3Igc2F2aW5nCgkJCQkkaW5mbyA9IGltcGxvZGUoIFBIUF9FT0wsICRvdXRwdXQgKTsKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAnaW5mbycgXSA9ICRpbmZvOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE5vdyB1c2UgZWl0aGVyIHdoYXQgd2UgZ290IG9yIHdoYXQgd2Ugd2VyZSBnaXZlbi4uLgoJCQlpZiAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSB7CgkJCQoJCQkJLy8gU2V0IHRoZSBnaXZlbiB2ZXJzaW9uIHJlZ2FyZGxlc3MKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAndmVyc2lvbicgXSA9IGFycmF5KCAnbWFqb3InID0+ICRtYWpvciwgJ21pbm9yJyA9PiAkbWlub3IgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkdGhpczsgCgkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF91bnppcF92ZXJzaW9uKCkKCQkgKgkKCQkgKglUaGlzIGdldHMgdGhlIHVuemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF91bnppcF92ZXJzaW9uKCkgewoJCQoJCQkkcmVzdWx0ID0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICd2ZXJzaW9uJyBdOwoJCQkKCQkJaWYgKCAwID09PSAkcmVzdWx0WyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X3ppcF9zdXBwb3J0c19sb2dmaWxlKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgemlwIGluIHVzZSBpcyBhYmxlIHRvIHN1cHBvcnQgbG9nZmlsZSB1c2FnZSBmb3IKCQkgKglsb2dnaW5nIHByb2dyZXNzIG9mIHppcCBvcGVyYXRpb24KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgbG9nZmlsZSBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfc3VwcG9ydHNfbG9nX2ZpbGUoKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCS8vIEN1cnJlbnRseSBjaGVjayBiYXNlZCBqdXN0IG9uIHRoZSB6aXAgbWFqb3IgdmVyc2lvbgoJCQkvLyBUT0RPOiBkZWNpZGUgaWYgYmV0dGVyIHRvIHJlc3BvbmQgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zCgkJCWlmICggMyA8PSAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdWyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCgkJICogIE5vdGU6IGluIHRoaXMgY2FzZSBhcyB0aGUgemlwIGFuZCB1bnppcCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzIHdlIG5lZWQgdG8gdGVzdAoJCSAqICBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBib3RoIG9mIHRoZW0gYW5kIHNldCBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJVGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIGFueSB0ZXN0IGZpbGVzIChtdXN0IGJlIHdyaXRlYWJsZSkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IG9uZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBpc19hdmFpbGFibGUoICR0ZW1wZGlyICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCS8vIFRoaXMgaXMganVzdCBhIG5pY2V0eSBmb3Igbm93IHVudGlsIHBsYXRmb3JtIGhhbmRsaW5nIGlzIGZ1bGx5IHJlc29sdmVkCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmlzX2F2YWlsYWJsZV9nZW5lcmljKCAkdGVtcGRpciApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmlzX2F2YWlsYWJsZV9nZW5lcmljKCAkdGVtcGRpciApOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCSAgCQoJCX0KCQkKCQkvKioKCQkgKglpc19hdmFpbGFibGVfZ2VuZXJpYygpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCgkJICogIE5vdGU6IGluIHRoaXMgY2FzZSBhcyB0aGUgemlwIGFuZCB1bnppcCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzIHdlIG5lZWQgdG8gdGVzdAoJCSAqICBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBib3RoIG9mIHRoZW0gYW5kIHNldCBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJVGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIGFueSB0ZXN0IGZpbGVzIChtdXN0IGJlIHdyaXRlYWJsZSkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IG9uZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBpc19hdmFpbGFibGVfZ2VuZXJpYyggJHRlbXBkaXIgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHBlbmRpbmdfcmVzdWx0ID0gZmFsc2U7CgkJCSRmb3VuZF96aXAgPSBmYWxzZTsKCQkJCgkJCS8vIFRoaXMgaXMgYSBzYWZldHkgdmFsdWUgaW4gY2FzZSBleGVjKCkgZmFpbHMgLSBob3BlZnVsbHkgaXQgd2lsbCBub3QgdXBkYXRlIHRoaXMKCQkJJGV4ZWNfZXhpdF9jb2RlID0gMTI3OwoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkKCQkJCSRjYW5kaWRhdGVfcGF0aHMgPSAkdGhpcy0+Z2V0X2V4ZWN1dGFibGVfcGF0aHMoKTsKCQkJCQoJCQkJLy8gV2UgYXJlIHNlYXJjaGluZyBmb3IgemlwIHVzaW5nIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHBhdGhzCgkJCQl3aGlsZSAoICggZmFsc2UgPT0gJGZvdW5kX3ppcCApICYmICggIWVtcHR5KCAkY2FuZGlkYXRlX3BhdGhzICkgKSApIHsKCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSBpdCBpcyBjbGVhbiBvZiBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UKCQkJCQkkcGF0aCA9IHRyaW0oIGFycmF5X3NoaWZ0KCAkY2FuZGlkYXRlX3BhdGhzICkgKTsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnRXhlYyB0ZXN0ICh6aXApIHRyeWluZyBleGVjdXRhYmxlIHBhdGg6JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgYCcgLiAkcGF0aCAuICdgLicgKTsKCgkJCQkJJHRlc3RfZmlsZSA9ICR0ZW1wZGlyIC4gJ3RlbXBfdGVzdF8nIC4gdW5pcWlkKCkgLiAnLnppcCc7CgkJCQkJCgkJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICRwYXRoICkgLiAnemlwJyAuICIgJ3skdGVzdF9maWxlfSciIC4gIiAnIiAuIF9fRklMRV9fIC4gICInIjsKCQkJCQkKCQkJCQkkY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApIDogJGNvbW1hbmQ7CgkJCQkJCQkJCQoJCQkJCUBleGVjKCAkY29tbWFuZCwgJGV4ZWNfb3V0cHV0LCAkZXhlY19leGl0X2NvZGUgKTsKCQkJCgkJCQkJLy8gTXVzdCBoYXZlIGJvdGggYSBmaWxlIGFuZCBhIHN1Y2Nlc3MgZXhpdCBjb2RlIHRvIGNvbnNpZGVyIHRoaXMgc3VjY2Vzc2Z1bAoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgJiYgKCAwID09PSAkZXhlY19leGl0X2NvZGUgKSApIHsKCQkJCgkJCQkJCS8vIFNldCB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlbWVtYmVyZWQgKG5vdGU6IHBhdGggd2l0aG91dCB0cmFpbGluZyBzbGFzaCkKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSA9ICRwYXRoOwoJCQkJCQkKCQkJCQkJLy8gUGxhdGZvcm0gaW5kZXBlbmRlbnQgY2FwYWJpbGl0aWVzCgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfemlwcGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19hcmNoaXZlcicgXSA9IHRydWU7CgkJCQkJCQoJCQkJCQkvLyBQbGF0Zm9ybSBzcGVjaWZpYyBjYXBhYmlsaXRpZXMKCQkJCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID0gdHJ1ZTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJCQkJLy8gTm9uZSBBcHBsaWNhYmxlCgkJCQkJCQkJYnJlYWs7CgkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCS8vIFRoZXJlIGlzIG5vIGRlZmF1bHQKCQkJCQkJfQoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh6aXApIFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCQkJCS8vIFRPRE86IENvbnNpZGVyIHBhcnNpbmcgemlwIGZpbGUgdG8gZ2V0IHZlcnNpb24gb2YgemlwIHRoYXQgY3JlYXRlZCBpdC4gVGhpcyBtYXkgc2VlbSBvZGQKCQkJCQkJLy8gYnV0IHByZS12MyB6aXAgaXQncyBub3QgcG9zc2libGUgdG8gcnVuICJ6aXAgLXYiIHRocm91Z2ggZXhlYygpIG9yIGVxdWl2YWxlbnQgYXMgaXQgb25seQoJCQkJCQkvLyBwcm92aWRlcyB0aGUgcmVxdWlyZWQgb3V0cHV0IGlmIGEgdHR5IGlzIGF0dGFjaGVkLCBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIHppcCBmaWxlLiBXZQoJCQkJCQkvLyBtaWdodCBjb25zaWRlciBwYXJzaW5nIHRoZSBjcmVhdGVkIHppcCBmaWxlIGJ1dCBhcyB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBvbmUgaGVyZSB3ZQoJCQkJCQkvLyBtaWdodCBhcyB3ZWxsIHVzZSBpdAoJCQkJCQkKCQkJCQkJLy8gVGhpcyB3aWxsIGJyZWFrIHVzIG91dCBvZiB0aGUgbG9vcAoJCQkJCQkkZm91bmRfemlwID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCQkvLyBEZWFsIHdpdGggdGhlIHBvc3NpYmxlIGZhaWx1cmUgY2F1c2VzCgkJCQkJCWlmICggIUBmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgewoJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4ZWMgdGVzdCAoemlwKSBGQUlMRUQ6IFRlc3QgemlwIGZpbGUgbm90IGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCWlmICggMCAhPT0gJGV4ZWNfZXhpdF9jb2RlICkgewoJCQkJCQkKCQkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXhlY19leGl0X2NvZGU7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHppcCkgRkFJTEVEOiBleGVjIEV4aXQgQ29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gUmVtb3ZlIHRoZSB0ZXN0IHppcCBmaWxlIGlmIGl0IHdhcyBjcmVhdGVkCgkJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJaWYgKCAhQHVubGluayggJHRlc3RfZmlsZSApICkgewoJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdFeGVjIHRlc3QgKHppcCkgdW5hYmxlIHRvIGRlbGV0ZSB0ZXN0IGZpbGUgKCVzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0ZXN0X2ZpbGUgKSApOwoJCQkJCQoJCQkJCQl9CgkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCQoJCQkJLy8gSWYgd2UgZGlkbid0IGZpbmQgemlwIGFueXdoZXJlIChvciBtYXliZSBmb3VuZCBpdCBidXQgaXQgZmFpbGVkKSB0aGVuIGxvZyBpdAoJCQkJaWYgKCBmYWxzZSA9PT0gJGZvdW5kX3ppcCApIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHppcCkgRkFJTEVEOiBVbmFibGUgdG8gZmluZCB6aXAgZXhlY3V0YWJsZSBvbiBhbnkgc3BlY2lmaWVkIHBhdGguJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gUmVtZW1iZXIgemlwIHJlc3VsdCBhbmQgcmVzZXQgZm9yIHVuemlwIHRlc3QKCQkJCSRwZW5kaW5nX3Jlc3VsdCA9ICRyZXN1bHQ7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCS8vIFNlZSBpZiB3ZSBjYW4gZGV0ZXJtaW5lIHppcCB2ZXJzaW9uIGFuZCBwb3NzaWJseSBhdmFpbGFibGUgb3B0aW9ucy4gVGhpcyBjYW4gaGVscCB1cwoJCQkJLy8gZGV0ZXJtaW5lIGhvdyB0byBleGVjdXRlIG9wZXJhdGlvbnMgc3VjaCBhcyBjcmVhdGluZyBhIHppcCBmaWxlCgkJCQlpZiAoIHRydWUgPT09ICRmb3VuZF96aXAgKSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ2hlY2tpbmcgemlwIHZlcnNpb24uLi4nICk7CgoJCQkJCSR0aGlzLT5zZXRfemlwX3ZlcnNpb24oKTsKCQkJCQkKCQkJCQkkdmVyc2lvbiA9ICR0aGlzLT5nZXRfemlwX3ZlcnNpb24oKTsKCQkJCQlpZiAoIHRydWUgPT09IGlzX2FycmF5KCAkdmVyc2lvbiApICkgewoJCQkKCQkJCQkJKCAoIDIgPT0gJHZlcnNpb25bICdtYWpvcicgXSApICYmICggMCA9PSAkdmVyc2lvblsgJ21pbm9yJyBdICkgKSA/ICR2ZXJzaW9uWyAnbWlub3InIF0gPSAnWCcgOiB0cnVlIDsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ0ZvdW5kIHppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgkJCQkKCQkJCQl9IGVsc2UgewoJCQkKCQkJCQkJJHZlcnNpb24gPSBhcnJheSggIm1ham9yIiA9PiAiWCIsICJtaW5vciIgPT4gIlkiICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdGb3VuZCB6aXAgdmVyc2lvbjogJTEkcy4lMiRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR2ZXJzaW9uWyAnbWFqb3InIF0sICR2ZXJzaW9uWyAnbWlub3InIF0gKSApOwoKCQkJCQl9CgoJCQkJfQoJCQkJCgkJCQkvLyBSZXNldCB0aGUgY2FuZGlkYXRlIHBhdGhzIGZvciBhIGZ1bGwgc2VhcmNoIGZvciB1bnppcAoJCQkJJGNhbmRpZGF0ZV9wYXRocyA9ICR0aGlzLT5fZXhlY3V0YWJsZV9wYXRoczsKCQkJCQkJICAKCQkJCS8vIFJlc2V0IHRoZSBzYWZldHkgdmFsdWUgaW4gY2FzZQoJCQkJJGV4ZWNfZXhpdF9jb2RlID0gMTI3OwoJCQkJCgkJCQkvLyBOZXcgc2VhcmNoCgkJCQkkZm91bmRfemlwID0gZmFsc2U7CgkJCQkKCQkJCS8vIFVzaW5nIGEgdGVzdCBmaWxlCgkJCQkkdGVzdF9maWxlID0gZGlybmFtZSggX19GSUxFX18gKSAuIHNlbGY6OlpJUF9URVNUX0ZJTEU7CgkJCQkKCQkJCS8vIEl0IGhhcyB0byBleGlzdCBhbmQgYmUgcmVhZGFibGUgb3RlaHJ3aXNlIHdlIGp1c3QgaGF2ZSB0byBiYWlsIG9uIHRlc3RpbmcgZm9yIHVuemlwCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnRXhlYyB0ZXN0ICh1bnppcCkgY2hlY2tpbmcgdGVzdCBmaWxlIHJlYWRhYmxlOiAlMSRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0ZXN0X2ZpbGUgKSApOwoJCQkJaWYgKCBpc19yZWFkYWJsZSggJHRlc3RfZmlsZSApICkgewoJCQkJCgkJCQkJLy8gT25seSBwcm9jZWVkIGlmIHRoZSBmaWxlIGxvb2tzIGFzIGV4cGVjdGVkCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ0V4ZWMgdGVzdCAodW56aXApIGNoZWNraW5nIHRlc3QgZmlsZSBpbnRhY3Q6ICUxJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgc2VsZjo6WklQX1RFU1RfRklMRV9TSUcgKSApOwoJCQkJCWlmICggc2VsZjo6WklQX1RFU1RfRklMRV9TSUcgPT09IG1kNV9maWxlKCAkdGVzdF9maWxlICkgKSB7CgkJCQkKCQkJCQkJLy8gV2UgYXJlIHNlYXJjaGluZyBmb3IgdW56aXAgdXNpbmcgdGhlIGxpc3Qgb2YgcG9zc2libGUgcGF0aHMKCQkJCQkJd2hpbGUgKCAoIGZhbHNlID09PSAkZm91bmRfemlwICkgJiYgKCAhZW1wdHkoICRjYW5kaWRhdGVfcGF0aHMgKSApICkgewoJCQkJCgkJCQkJCQkvLyBNYWtlIHN1cmUgaXQgaXMgY2xlYW4gb2YgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlCgkJCQkJCQkkcGF0aCA9IHRyaW0oIGFycmF5X3NoaWZ0KCAkY2FuZGlkYXRlX3BhdGhzICkgKTsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdFeGVjIHRlc3QgKHVuemlwKSB0cnlpbmcgZXhlY3V0YWJsZSBwYXRoOicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJHBhdGggLiAnYC4nICk7CgoJCQkJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICRwYXRoICkgLiAndW56aXAgLXF0JyAuICIgJ3skdGVzdF9maWxlfSciIC4gIiAndGVzdC50eHQnIjsKCQkJCQkJCQkJCgkJCQkJCQkkY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApIDogJGNvbW1hbmQ7CgkJCQkJCgkJCQkJCQlAZXhlYyggJGNvbW1hbmQsICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICk7CgkJCQkJCgkJCQkJCQlpZiAoICRleGVjX2V4aXRfY29kZSA9PT0gMCApIHsKCQkJCQkJCQoJCQkJCQkJCS8vIFNldCB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlbWVtYmVyZWQgKG5vdGU6IHBhdGggd2l0aG91dCB0cmFpbGluZyBzbGFzaCkKCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3BhdGgnIF0gPSAkcGF0aDsKCQkJCQkJCgkJCQkJCQkJLy8gUGxhdGZvcm0gaW5kZXBlbmRlbnQgY2FwYWJpbGl0aWVzCgkJCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bnppcHBlcicgXSA9IHRydWU7CgkJCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19jaGVja2VyJyBdID0gdHJ1ZTsKCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX3VuYXJjaGl2ZXInIF0gPSB0cnVlOwoJCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfbGlzdGVyJyBdID0gdHJ1ZTsKCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2V4dHJhY3RvcicgXSA9IHRydWU7CgkJCQkJCQoJCQkJCQkJCS8vIFBsYXRmb3JtIHNwZWNpZmljIGNhcGFiaWxpdGllcwoJCQkJCQkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJCQkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCQkJCQoJCQkJCQkJCQkJLy8gVGhpcyBpcyBzcGVjaWFsIC0gd2UgbXVzdCBoYXZlIHppcCBhbHNvIHNvIHRoaXMgd2lsbCBvbmx5IGVuZCB1cCB0cnVlIGlmIHdlIHByZXZpb3VzbHkgZm91bmQgemlwCgkJCQkJCQkJCQkvLyBhbmQgc3BlY3VsYXRpdmVseSBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gYmUgdHJ1ZS4gQWxzbyB3ZSBuZWVkIGZvciBleGVjX2RpciB0byBub3QgYmUgYWN0aXZlIC0gaWYKCQkJCQkJCQkJCS8vIGl0IGlzIHRoZSBjb21tYW5kIGxpbmUgaXMgZXNjYXBlZCBhbmQgdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcGlwaW5nIHdlIGhhdmUgdG8gdXNlIHdoZW4KCQkJCQkJCQkJCS8vIHNldHRpbmcgYSBjb21tZW50LiBBbHNvIHdlIG5lZWQgdGhlIGVzY2FwZXNoZWxsYXJnIGZ1bmN0aW9uIHRvIGJlIGF2YWlsYWJsZSBhbmQgdGhhdCB3YXMgY2hlY2tlZAoJCQkJCQkJCQkJLy8gd2hlbiBkZXBlbmRlbmNpZXMgd2VyZSBjaGVja2VkCgkJCQkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NvbW1lbnRlcicgXSA9ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdICYmIHRydWUgJiYgISR0aGlzLT5nZXRfZXhlY19kaXJfZmxhZygpICYmIHNlbGY6OiRfYWxsb3dfaXNfY29tbWVudGVyOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJCQkJCQkvLyBOb25lIEFwcGxpY2FibGUKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkJLy8gVGhlcmUgaXMgbm8gZGVmYXVsdAoJCQkJCQkJCX0KCQkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh1bnppcCkgUEFTU0VELicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQkJCQkJCS8vIFRoaXMgd2lsbCBicmVhayB1cyBvdXQgb2YgdGhlIGxvb3AKCQkJCQkJCQkkZm91bmRfemlwID0gdHJ1ZTsKCQkJCQkJCgkJCQkJCQl9IGVsc2UgewoJCQkJCgkJCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGVjX2V4aXRfY29kZTsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHVuemlwKSBGQUlMRUQ6IFRlc3QgdW56aXAgZmlsZSB0ZXN0IGZhaWxlZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh1bnppcCkgRkFJTEVEOiBleGVjIEV4aXQgQ29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJCQkJCX0KCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkJLy8gVGhlIHRlc3QgZmlsZSBsb29rZWQgY29ycnVwdGVkIHNvIHdhcm4gYW5kIGJhaWwgb3V0CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ0V4ZWMgdGVzdCAodW56aXApIEZBSUxFRDogVGVzdCBmaWxlIGFwcGVhcnMgdG8gYmUgY29ycnVwdGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgbWQ1X2ZpbGUoICR0ZXN0X2ZpbGUgKSApICk7CgoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFRoZSB0ZXN0IGZpbGUgZG9lc24ndCBzZWVtIHRvIGV4aXN0IG9yIGJlIHJlYWRhYmxlIHNvIHdhcm4gYW5kIGJhaWwgb3V0CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhlYyB0ZXN0ICh1bnppcCkgRkFJTEVEOiBUZXN0IGZpbGUgYXBwZWFycyB0byBlaXRoZXIgbm90IGV4aXN0IG9yIG5vdCBiZSByZWFkYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCX0KCQkJCgkJCQkvLyBJZiB3ZSBkaWRuJ3QgZmluZCB1bnppcCBhbnl3aGVyZSAob3IgbWF5YmUgZm91bmQgaXQgYnV0IGl0IGZhaWxlZCkgdGhlbiBsb2cgaXQKCQkJCWlmICggZmFsc2UgPT09ICRmb3VuZF96aXAgKSB7CgkJCQkJCgkJCQkJLy8gV2Ugc3BlY3VsYXRpdmVseSBzZXQgdGhpcyB0cnVlIHdoZW4gd2UgZm91bmQgemlwIGJ1dCB3ZSBuZWVkIGJvdGggemlwIGFuZCB1bnppcCBzbyBzZXQgaWYgZmFsc2UKCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NvbW1lbnRlcicgXSA9IGZhbHNlOwoKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHVuemlwKSBGQUlMRUQ6IFVuYWJsZSB0byBmaW5kIHVuemlwIGV4ZWN1dGFibGUgb24gYW55IHNwZWNpZmllZCBwYXRoLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgdW56aXAgdmVyc2lvbiBhbmQgcG9zc2libHkgYXZhaWxhYmxlIG9wdGlvbnMuIFRoaXMgY2FuIGhlbHAgdXMKCQkJCQkvLyBkZXRlcm1pbmUgaG93IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBzdWNoIGFzIHVuemlwcGluZyBhIGZpbGUKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDaGVja2luZyB1bnppcCB2ZXJzaW9uLi4uJyApOwoKCQkJCQkkdGhpcy0+c2V0X3VuemlwX3ZlcnNpb24oKTsKCQkJCQoJCQkJCSR2ZXJzaW9uID0gJHRoaXMtPmdldF91bnppcF92ZXJzaW9uKCk7CgkJCQkJaWYgKCB0cnVlID09PSBpc19hcnJheSggJHZlcnNpb24gKSApIHsKCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdGb3VuZCB1bnppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgkJCQkKCQkJCQl9IGVsc2UgewoJCQkKCQkJCQkJJHZlcnNpb24gPSBhcnJheSggIm1ham9yIiA9PiAiWCIsICJtaW5vciIgPT4gIlkiICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdGb3VuZCB1bnppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgoJCQkJCX0KCgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGVjIHRlc3QgKHppcC91bnppcCkgRkFJTEVEOiBPbmUgb3IgbW9yZSByZXF1aXJlZCBmdW5jdGlvbiBkbyBub3QgZXhpc3QuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCSAgCgkJICAJfQoJCSAgCQoJCSAgCS8vIElmIHdlIGZvdW5kIGJvdGggemlwIGFuZCB1bnppcCB0aGVuIGNvbXBhcmUgdGhlIHBhdGhzIGFuZCBpZiB0aGUgc2FtZSB0aGVuIHNldCB0aGUgY29tbW9uIHBhdGgKCQkgIAlpZiAoICRwZW5kaW5nX3Jlc3VsdCAmJiAkcmVzdWx0ICkgewoJCSAgCQoJCSAgCQlpZiAoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3BhdGgnIF0gPT09ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAncGF0aCcgXSApIHsKCQkgIAkJCgkJICAJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICdwYXRoJyBdID0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXTsKCQkgIAkJCQoJCSAgCQl9CgkJICAJCQoJCSAgCX0KCQkgIAkKCQkgIAkvLyBPdXIgcmVzdWx0IHdpbGwgYmUgdHJ1ZSBpZiB3ZSBmb3VuZCBlaXRoZXIgb3IgYm90aCBvZiB6aXAgYW5kIHVuemlwCgkJICAJLy8gVGhlIG1ldGhvZCBhdHRyaWJ1dGVzIHdpbGwgdGVsbCB3aGljaCBpcyBhdmFpbGFibGUKCQkgIAkkcmVzdWx0ID0gKCAkcGVuZGluZ19yZXN1bHQgfHwgJHJlc3VsdCApOwoJCSAgCQoJCSAgCXJldHVybiAkcmVzdWx0OwoJCSAgCQoJCX0KCQkKCQkvKioKCQkgKgljcmVhdGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZQoJCSAqCUFsd2F5cyBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmCgkJICoJCgkJICoJVGhlICRleGNsdWRlcyB3aWxsIGJlIGEgbGlzdCBvciByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGlmIHRoZSAkbGlzdG1ha2VyIG9iamVjdCBpcyBOVUxMIG90ZWhyd2lzZQoJCSAqCXdpbGwgYmUgYWJzb2x1dGUgcGF0aCBleGNsdWRlcyBhbmQgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBjYW4gYmUgaGFkIGZyb20gdGhlICRsaXN0bWFrZXIgb2JqZWN0CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gY3JlYXRlCgkJICoJQHBhcmFtCQlzdHJpbmcJJGRpcgkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgdG8gYWRkIHRvIFpJUCBBcmNoaXZlIGZpbGUKCQkgKglAcGFyYW1lCQlhcnJheQkkZXhjbHVkZXMJCUxpc3Qgb2YgZWl0aGVyIGFic29sdXRlIHBhdGggZXhjbHVzaW9ucyBvciByZWxhdGl2ZSBleGNsdXNpb25zCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUBwYXJhbQkJb2JqZWN0CSRsaXN0bWFrZXIJCVRoZSBvYmplY3QgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuIGluY2x1c2lvbnMgbGlzdAoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGUoICR6aXAsICRkaXIsICRleGNsdWRlcywgJHRlbXBkaXIsICRsaXN0bWFrZXIgPSBOVUxMICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZV9nZW5lcmljKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+Y3JlYXRlX2dlbmVyaWMoICR6aXAsICRkaXIsICRleGNsdWRlcywgJHRlbXBkaXIsICRsaXN0bWFrZXIgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoJCQkKCQkvKioKCQkgKgljcmVhdGVfZ2VuZXJpYygpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJCgkJICoJVGhlICRleGNsdWRlcyB3aWxsIGJlIGEgbGlzdCBvciByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGlmIHRoZSAkbGlzdG1ha2VyIG9iamVjdCBpcyBOVUxMIG90ZWhyd2lzZQoJCSAqCXdpbGwgYmUgYWJzb2x1dGUgcGF0aCBleGNsdWRlcyBhbmQgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBjYW4gYmUgaGFkIGZyb20gdGhlICRsaXN0bWFrZXIgb2JqZWN0CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gY3JlYXRlCgkJICoJQHBhcmFtCQlzdHJpbmcJJGRpcgkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgdG8gYWRkIHRvIFpJUCBBcmNoaXZlIGZpbGUKCQkgKglAcGFyYW1lCQlhcnJheQkkZXhjbHVkZXMJCUxpc3Qgb2YgZWl0aGVyIGFic29sdXRlIHBhdGggZXhjbHVzaW9ucyBvciByZWxhdGl2ZSBleGNsdXNpb25zCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCVtPcHRpb25hbF0gRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IHVzYWdlCgkJICoJQHBhcmFtCQlvYmplY3QJJGxpc3RtYWtlcgkJVGhlIG9iamVjdCBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW4gaW5jbHVzaW9ucyBsaXN0CgkJICoJQHJldHVybgkJYm9vbAkJCQkJVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZV9nZW5lcmljKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICkgewoJCQoJCQkkZXhpdGNvZGUgPSAwOwoJCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJJHRlbXBfemlwID0gJyc7CgkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IGZhbHNlOwoJCQkkZXhjbHVkZV9jb3VudCA9IDA7CgkJCSRleGNsdXNpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2Vycm9ycyA9IGZhbHNlOwoJCQkkemlwX2Vycm9yc19jb3VudCA9IDA7CgkJCSR6aXBfZXJyb3JzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX3dhcm5pbmdzID0gZmFsc2U7CgkJCSR6aXBfd2FybmluZ3NfY291bnQgPSAwOwoJCQkkemlwX3dhcm5pbmdzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2FkZGl0aW9ucyA9IGZhbHNlOwoJCQkkemlwX2FkZGl0aW9uc19jb3VudCA9IDA7CgkJCSR6aXBfYWRkaXRpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2RlYnVnID0gZmFsc2U7CgkJCSR6aXBfZGVidWdfY291bnQgPSAwOwoJCQkkemlwX2RlYnVnID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX290aGVyID0gZmFsc2U7CgkJCSR6aXBfb3RoZXJfY291bnQgPSAwOwoJCQkkemlwX290aGVyID0gYXJyYXkoKTsKCQkJJHppcF91c2luZ19sb2dfZmlsZSA9IGZhbHNlOwoJCQkkbG9nZmlsZV9uYW1lID0gJyc7CgkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSBmYWxzZTsKCQkKCQkJLy8gVGhlIGJhc2VkaXIgbXVzdCBoYXZlIGEgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkkYmFzZWRpciA9ICggcnRyaW0oIHRyaW0oICRkaXIgKSwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkKCQkJaWYgKCBlbXB0eSggJHRlbXBkaXIgKSB8fCAhQGZpbGVfZXhpc3RzKCAkdGVtcGRpciApICkgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBtdXN0IGJlIGF2YWlsYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIFRlbGwgd2hpY2ggemlwIHZlcnNpb24gaXMgYmVpbmcgdXNlZAoJCQkkdmVyc2lvbiA9ICR0aGlzLT5nZXRfemlwX3ZlcnNpb24oKTsKCQkJCgkJCWlmICggdHJ1ZSA9PT0gaXNfYXJyYXkoICR2ZXJzaW9uICkgKSB7CgkJCQoJCQkJKCAoIDIgPT0gJHZlcnNpb25bICdtYWpvcicgXSApICYmICggMCA9PSAkdmVyc2lvblsgJ21pbm9yJyBdICkgKSA/ICR2ZXJzaW9uWyAnbWlub3InIF0gPSAnWCcgOiB0cnVlIDsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdVc2luZyB6aXAgdmVyc2lvbjogJTEkcy4lMiRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR2ZXJzaW9uWyAnbWFqb3InIF0sICR2ZXJzaW9uWyAnbWlub3InIF0gKSApOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJJHZlcnNpb24gPSBhcnJheSggIm1ham9yIiA9PiAiWCIsICJtaW5vciIgPT4gIlkiICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnVXNpbmcgemlwIHZlcnNpb246ICUxJHMuJTIkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdmVyc2lvblsgJ21ham9yJyBdLCAkdmVyc2lvblsgJ21pbm9yJyBdICkgKTsKCgkJCX0KCQkJCQkKCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB6aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1pJUF9QQVRIICk7CgkJCQoJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJaWYgKCAhZW1wdHkoICR6aXBwYXRoICkgKSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQoJCQl9CgoJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3ppcCc7CQoKCQkJLy8gQWx3YXlzIGRvIHJlY3Vyc2l2ZSBvcGVyYXRpb24KCQkJJGNvbW1hbmQgLj0gJyAtcic7CgkJCQoJCQkvLyBDaGVjayBpZiB0aGUgdmVyc2lvbiBvZiB6aXAgaW4gdXNlIHN1cHBvcnRzIGxvZyBmaWxlICh3aGljaCB3aWxsIGhlbHAgd2l0aCBtZW1vcnkgdXNhZ2UgZm9yIGxhcmdlIHNpdGVzKQoJCQlpZiAoIHRydWUgPT09ICR0aGlzLT5nZXRfemlwX3N1cHBvcnRzX2xvZ19maWxlKCkgKSB7CgkJCQoJCQkJLy8gQ2hvb3NlIHRvIHVzZSBsb2cgZmlsZSBzbyBxdWlldGVuIHN0ZG91dCAtIHdlJ2xsIHNldCB1cCB0aGUgbG9nIGZpbGUgbGF0ZXIKCQkJCSRjb21tYW5kIC49ICcgLXEnOwoJCQkJJHppcF91c2luZ19sb2dfZmlsZSA9IHRydWU7CgkJCQoJCQl9CgkJCQoJCQkvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHR1cm4gb2ZmIGNvbXByZXNzaW9uIGJ5IHNldHRpbmdzIChmYXN0ZXIgYnV0IGxhcmdlciBiYWNrdXApCgkJCWlmICggdHJ1ZSAhPT0gJHRoaXMtPmdldF9jb21wcmVzc2lvbigpICkgewoJCQkKCQkJCSRjb21tYW5kIC49ICcgLTAnOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gY29tcHJlc3Npb24gZGlzYWJsZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gY29tcHJlc3Npb24gZW5hYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQl9CgkJCQoJCQkvLyBDaGVjayBpZiBpZ25vcmluZyAobm90IGZvbGxvd2luZykgc3ltbGlua3MKCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV9zeW1saW5rcygpICkgewoJCQkKCQkJCS8vIE5vdCBhbGwgT1Mgc3VwcG9ydCB0aGlzIGZvciBjb21tYW5kIGxpbmUgemlwIGJ1dCBiZXN0IHRvIGhhbmRsZSBpdCBsYXRlIGFuZCBqdXN0CgkJCQkvLyBpbmRpY2F0ZSBoZXJlIGl0IGlzIHJlcXVlc3RlZCBidXQgbm90IHN1cHBvcnRlZCBieSBPUwoJCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkJLy8gV2FudCB0byBub3QgZm9sbG93IHN5bWxpbmtzIHNvIHNldCBjb21tYW5kIG9wdGlvbiBhbmQgc2V0IGZsYWcgZm9yIGxhdGVyIHVzZQoJCQkJCQkkY29tbWFuZCAuPSAnIC15JzsKCQkJCQkJJHppcF9pZ25vcmluZ19zeW1saW5rcyA9IHRydWU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHN5bWJvbGljIGxpbmtzIHdpbGwgbm90IGJlIGZvbGxvd2VkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gc3ltYm9saWMgbGlua3MgcmVxdWVzdGVkIHRvIG5vdCBiZSBmb2xsb3dlZCBiYXNlZCBvbiBzZXR0aW5ncyBidXQgdGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIG9wZXJhdGluZyBzeXN0ZW0uJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyByZXF1ZXN0ZWQgdG8gbm90IGJlIGZvbGxvd2VkIGJhc2VkIG9uIHNldHRpbmdzIGJ1dCB0aGlzIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgb3BlcmF0aW5nIHN5c3RlbS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyB3aWxsIGJlIGZvbGxvd2VkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCX0KCQkJCgkJCS8vIENoZWNrIGlmIHdlIGFyZSBpZ25vcmluZyB3YXJuaW5ncyAtIG1lYW5pbmcgY2FuIHN0aWxsIGdldCBhIGJhY2t1cCBldmVuCgkJCS8vIGlmLCBlLmcuLCBzb21lIGZpbGVzIGNhbm5vdCBiZSByZWFkCgkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfd2FybmluZ3MoKSApIHsKCQkJCgkJCQkvLyBOb3RlOiB3YXJuaW5ncyBhcmUgYmVpbmcgaWdub3JlZCBidXQgd2lsbCBzdGlsbCBiZSBnYXRoZXJlZCBhbmQgbG9nZ2VkCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBhY3Rpb25hYmxlIHdhcm5pbmdzIHdpbGwgYmUgaWdub3JlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBhY3Rpb25hYmxlIHdhcm5pbmdzIHdpbGwgbm90IGJlIGlnbm9yZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJfQoJCQkKCQkJLy8gRGVsZXRlIGFueSBleGlzdGluZyB6aXAgZmlsZSBvZiBzYW1lIG5hbWUgLSByZWFsbHkgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCgkJCWlmICggQGZpbGVfZXhpc3RzKCAkemlwICkgKSB7CgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhpc3RpbmcgWklQIEFyY2hpdmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCUB1bmxpbmsoICR6aXAgKTsKCgkJCX0KCQkJCgkJCS8vIE5vdyB3ZSdsbCBzZXQgdXAgdGhlIGxvZ2dpbmcgdG8gZmlsZSBpZiByZXF1aXJlZCAtIHVzZSBmdWxsIGxvZ2dpbmcKCQkJaWYgKCB0cnVlID09PSAkemlwX3VzaW5nX2xvZ19maWxlICkgewoJCQkKCQkJCSRsb2dmaWxlX25hbWUgPSAkdGVtcGRpciAuIHNlbGY6OlpJUF9MT0dfRklMRV9OQU1FOwoJCQkJJGNvbW1hbmQgLj0gIiAtbGYgJ3skbG9nZmlsZV9uYW1lfScgLWxpIjsKCQkJCgkJCX0KCQkJCQkJCgkJCS8vIFNldCB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHN0b3JlIFpJUCB3aGlsZSBpdCdzIGJlaW5nIGdlbmVyYXRlZC4JCQkKCQkJJGNvbW1hbmQgLj0gIiAtYiAneyR0ZW1wZGlyfSciOwoKCQkJLy8gU3BlY2lmeSB3aGVyZSB0byBwbGFjZSB0aGUgZmluYWxpemVkIHppcCBhcmNoaXZlIGZpbGUKCQkJLy8gSWYgd2FybmluZ3MgYXJlIGJlaW5nIGlnbm9yZWQgd2UgY2FuIHRlbGwgemlwIHRvIGNyZWF0ZSB0aGUgemlwIGFyY2hpdmUgaW4gdGhlIGZpbmFsCgkJCS8vIGxvY2F0aW9uIC0gb3RoZXJ3aXNlIHdlIG11c3QgcHV0IGl0IGluIGEgdGVtcG9yYXJ5IGxvY2F0aW9uIGFuZCBtb3ZlIGl0IGxhdGVyIG9ubHkKCQkJLy8gaWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzLiBUaGlzIGNvcGVzIHdpdGggdGhlIGNhc2Ugd2hlcmUgKHRoaXMpIGNvbnRyb2xsaW5nIHNjcmlwdAoJCQkvLyBnZXRzIHRpbWVkIG91dCBieSB0aGUgc2VydmVyIGFuZCBpZiB0aGUgZmlsZSB3ZXJlIGNyZWF0ZWQgaW4gdGhlIGZpbmFsIGxvY2F0aW9uIHdpdGgKCQkJLy8gd2FybmluZ3MgdGhhdCBzaG91bGQgbm90IGJlIGlnbm9yZWQgd2UgY2Fubm90IHByZXZlbnQgaXQgYmVpbmcgY3JlYXRlZC4gVGhlIC1NTSBvcHRpb24KCQkJLy8gY291bGQgYmUgdXNlZCBidXQgdGhpcyBwcmV2ZW50cyB1cyBjYXRjaGluZyBzdWNoIHdhcm5pbmdzIGFuZCBiZWluZyBhYmxlIHRvIHJlcG9ydAoJCQkvLyB0aGVtIHRvIHRoZSB1c2VyIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBzY3JpcHQgaGFzbid0IGJlZW4gdGVybWluYXRlZC4gQWRkaXRpb25hbGx5IHRoZQoJCQkvLyAtTU0gb3B0aW9uIHdvdWxkIGJhaWwgb3V0IG9uIHRoZSBmaXJzdCBlbmNvdW50ZXJlZCBwcm9ibGVtIGFuZCBzbyBpZiB0aGVyZSB3ZXJlIGEgZmV3CgkJCS8vIHByb2JsZW1zIHRoZXkgd291bGQgZWFjaCBub3QgYmUgZm91bmQgdW50aWwgdGhlIGN1cnJlbnQgb25lIGlzIGZpeGVkIGFuZCB0cnkgYWdhaW4uCgkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfd2FybmluZ3MoKSApIHsKCQkJCgkJCQkkdGVtcF96aXAgPSAkemlwOwoJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkdGVtcF96aXAgPSAkdGVtcGRpciAuIGJhc2VuYW1lKCAkemlwICk7CgkJCQkKCQkJfQkJCgoJCQkkY29tbWFuZCAuPSAiICd7JHRlbXBfemlwfScgLiI7CgkJCQoJCQkvLyBOb3cgd29yayBvdXQgZXhjbHVzaW9ucyBkZXBlbmRlbnQgb24gd2hhdCB3ZSBoYXZlIGJlZW4gZ2l2ZW4KCQkJaWYgKCBpc19vYmplY3QoICRsaXN0bWFrZXIgKSAmJiAoIGRlZmluZWQoICdVU0VfRVhQRVJJTUVOVEFMX1pJUEJVRERZX0lOQ0xVU0lPTicgKSAmJiAoIHRydWUgPT09IFVTRV9FWFBFUklNRU5UQUxfWklQQlVERFlfSU5DTFVTSU9OICkgKSApIHsKCQkJCgkJCQkvLyBXZSdyZSBkb2luZyBhbiBpbmNsdXNpb24gb3BlcmF0aW9uLCBidXQgZmlyc3Qgd2UnbGwganVzdCBzaG93IHRoZSBleGNsdXNpb3NuCgkJCQkKCQkJCS8vIEZvciB6aXAgd2UgbmVlZCByZWxhdGl2ZSByYXRoZXIgdGhhbiBhYnNvbHV0ZSBleGNsdXNpb24gc3BhdGhzCgkJCQkkZXhjbHVzaW9ucyA9ICRsaXN0bWFrZXItPmdldF9yZWxhdGl2ZV9leGNsdWRlcyggJGJhc2VkaXIgKTsKCQkJCQoJCQkJaWYgKCBjb3VudCggJGV4Y2x1c2lvbnMgKSA+IDAgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdDYWxjdWxhdGluZyBkaXJlY3RvcmllcyB0byBleGNsdWRlIGZyb20gYmFja3VwLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkkZXhjbHVkaW5nX2FkZGl0aW9uYWwgPSBmYWxzZTsKCQkJCQkkZXhjbHVkZV9jb3VudCA9IDA7CgkJCQkJZm9yZWFjaCAoICRleGNsdXNpb25zIGFzICRleGNsdWRlICkgewoJCQkJCQoJCQkJCQlpZiAoICFzdHJzdHIoICRleGNsdWRlLCAnYmFja3VwYnVkZHlfYmFja3VwcycgKSApIHsgLy8gU2V0IHZhcmlhYmxlIHRvIHNob3cgd2UgYXJlIGV4Y2x1ZGluZyBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIGJlc2lkZXMgYmFja3VwIGRpci4KCQoJCQkJCQkJJGV4Y2x1ZGluZ19hZGRpdGlvbmFsID0gdHJ1ZTsKCQkJCQkJCQkKCQkJCQkJfQoJCQkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0V4Y2x1ZGluZycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGV4Y2x1ZGUgKTsKCQkJCQkJCQkJCQkJCQoJCQkJCQkkZXhjbHVkZV9jb3VudCsrOwoJCQkJCQkJCgkJCQkJfQoJCQkJCQkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIEdldCB0aGUgbGlzdCBvZiBpbmNsdXNpb25zIHRvIHByb2Nlc3MKCQkJCSRpbmNsdXNpb25zID0gJGxpc3RtYWtlci0+Z2V0X3Rlcm1pbmFscygpOwoJCQkJCgkJCQkvLyBGb3IgZWFjaCBkaXJlY3Rvcnkgd2UgbmVlZCB0byBwdXQgdGhlICJ3aWxkY2FyZCIgb24gdGhlIGVuZAoJCQkJZm9yZWFjaCAoICRpbmNsdXNpb25zIGFzICYkaW5jbHVzaW9uICkgewoJCQkJCgkJCQkJaWYgKCBpc19kaXIoICRpbmNsdXNpb24gKSApIHsKCQkJCQkKCQkJCQkJJGluY2x1c2lvbiAuPSBESVJFQ1RPUllfU0VQQVJBVE9SIC4gIioiOwoJCQkJCX0KCQkJCQoJCQkJCS8vIFJlbW92ZSBkaXJlY3RvcnkgcGF0aCBwcmVmaXggZXhjbHVkaW5nIGxlYWRpbmcgc2xhc2ggdG8gbWFrZSByZWxhdGl2ZSAobmVlZGVkIGZvciB6aXApCgkJCQkJJGluY2x1c2lvbiA9IHN0cl9yZXBsYWNlKCBydHJpbSggJGJhc2VkaXIsIERJUkVDVE9SWV9TRVBBUkFUT1IgKSwgJycsICRpbmNsdXNpb24gKTsKCQkJCQkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIE5vdyBjcmVhdGUgdGhlIGluY2x1c2lvbnMgZmlsZSBpbiB0aGUgdGVtcGRpcgoJCQkJCgkJCQkvLyBBbmQgdXBkYXRlIHRoZSBjb21tYW5kIG9wdGlvbnMKCQkJCSRpZmlsZSA9ICR0ZW1wZGlyIC4gc2VsZjo6WklQX0lOQ0xVU0lPTlNfRklMRV9OQU1FOwoJCQkJaWYgKCBmaWxlX2V4aXN0cyggJGlmaWxlICkgKSB7CgkJCQkKCQkJCQlAdW5saW5rKCAkaWZpbGUgKTsKCQkJCQoJCQkJfQoJCQkJCgkJCQlmaWxlX3B1dF9jb250ZW50cyggJGlmaWxlLCBpbXBsb2RlKCBQSFBfRU9MLCAkaW5jbHVzaW9ucyApIC4gUEhQX0VPTCAuIFBIUF9FT0wgKTsKCQkJCQoJCQkJJGNvbW1hbmQgLj0gIiAtaUAiIC4gIid7JGlmaWxlfSciOwoJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBXZSdyZSBkb2luZyBhbiBleGNsdXNpb24gb3BlcmF0aW9uCgkJCQoJCQkJLy8kY29tbWFuZCAuPSAiLWkgJyonICI7IC8vIE5vdCBuZWVkZWQuIFppcCBkZWZhdWx0cyB0byBkb2luZyB0aGlzLiBSZW1vdmVkIEp1bHkgMTAsIDIwMTIgZm9yIHYzLjAuNDEuCgkJCQkKCQkJCS8vIFNpbmNlIHdlIGhhZCBubyAkbGlzdG1ha2VyIG9iamVjdCBvciBub3QgdXNpbmcgaXQgZ2V0IHRoZSBzdGFuZGFyZCByZWxhdGl2ZSBleGNsdWRlcyB0byBwcm9jZXNzCgkJCQkkZXhjbHVzaW9ucyA9ICRleGNsdWRlczsKCQkJCQoJCQkJaWYgKCBjb3VudCggJGV4Y2x1c2lvbnMgKSA+IDAgKSB7CgkJCQkKCQkJCQkvLyBIYW5kbGUgZXhjbHVzaW9ucyBieSBwbGFjaW5nIHRoZW0gaW4gYW4gZXhjbHVzaW9uIHRleHQgZmlsZS4KCQkJCQkkZXhjbHVzaW9uX2ZpbGUgPSAkdGVtcGRpciAuIHNlbGY6OlpJUF9FWENMVVNJT05TX0ZJTEVfTkFNRTsKCQkJCQkkdGhpcy0+X3JlbmRlcl9leGNsdXNpb25zX2ZpbGUoICRleGNsdXNpb25fZmlsZSwgJGV4Y2x1c2lvbnMgKTsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnVXNpbmcgZXhjbHVzaW9uIGZpbGUgYCUxJHNgJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRleGNsdXNpb25fZmlsZSApICk7CgkJCQkJJGNvbW1hbmQgLj0gJyAteEAnIC4gIid7JGV4Y2x1c2lvbl9maWxlfSciOwoJCQkJCQkJCQkJCgkJCQl9CgkJCQoJCQl9CgkJCQoJCQkvLyBJZiB3ZSBjYW4ndCB1c2UgYSBsb2cgZmlsZSBidXQgZXhlY19kaXIgaXNuJ3QgaW4gdXNlIHdlIGNhbiByZWRpcmVjdCBzdGRlcnIgdG8gc3Rkb3V0CgkJCS8vIElmIGV4ZWNfZGlyIGlzIGluIHVzZSB3ZSBjYW5ub3QgcmVkaXJlY3QgYmVjYXVzZSBvZiBjb21tYW5kIGxpbmUgZXNjYXBpbmcgc28gY2Fubm90IGxvZyBlcnJvcnMvd2FybmluZ3MKCQkJaWYgKCBmYWxzZSA9PT0gJHppcF91c2luZ19sb2dfZmlsZSApIHsKCQkJCgkJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+Z2V0X2V4ZWNfZGlyX2ZsYWcoKSApIHsKCQkJCgkJCQkJJGNvbW1hbmQgLj0gJyAyPiYxJzsKCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdaaXAgRXJyb3JzL1dhcm5pbmdzIGNhbm5vdCBub3QgYmUgbG9nZ2VkIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHppcCBhbmQgZXhlY19kaXIgYWN0aXZlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksIHRydWUgKSApOwoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gUmVtZW1iZXIgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBjaGFuZ2UgdG8gdGhlIGRpcmVjdG9yeSBiZWluZyBhZGRlZCBzbyB0aGF0ICIuIiBpcyB2YWxpZCBpbiBjb21tYW5kCgkJCSR3b3JraW5nX2RpciA9IGdldGN3ZCgpOwoJCQljaGRpciggJGRpciApOwoJCQkKCQkJJGNvbW1hbmQgPSAoIHNlbGY6Ok9TX1RZUEVfV0lOID09PSAkdGhpcy0+Z2V0X29zX3R5cGUoKSApID8gc3RyX3JlcGxhY2UoICdcJycsICciJywgJGNvbW1hbmQgKSA6ICRjb21tYW5kOwoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgY29tbWFuZCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbW1hbmQgKTsKCQkJQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdGNvZGUgKTsKCQkJCQkJCgkJCS8vIFNldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGJhY2sgdG8gd2hlcmUgd2Ugd2VyZQoJCQljaGRpciggJHdvcmtpbmdfZGlyICk7CgkJCQoJCQkvLyBDb252ZW5pZW5jZSBmb3IgaGFuZGxpbmcgZGlmZmVyZW50IHNjYW5hcmlvcwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQoJCQkvLyBJZiB3ZSB1c2VkIGEgbG9nIGZpbGUgdGhlbiBwcm9jZXNzIHRoZSBsb2cgZmlsZSAtIGVsc2UgcHJvY2VzcyBvdXRwdXQKCQkJLy8gQWx3YXlzIHNjYW4gdGhlIG91dHB1dC9sb2dmaWxlIGZvciB3YXJuaW5ncywgZXRjLiBhbmQgc2hvdyB3YXJuaW5ncyBldmVuIGlmIHVzZXIgaGFzIGNob3NlbiB0byBpZ25vcmUgdGhlbQoJCQlpZiAoIHRydWUgPT09ICR6aXBfdXNpbmdfbG9nX2ZpbGUgKSB7CgkJCQoJCQkJdHJ5IHsKCQkJCQoJCQkJCSRsb2dmaWxlID0gbmV3IFNwbEZpbGVPYmplY3QoICRsb2dmaWxlX25hbWUsICJyYiIgKTsKCQkJCQkKCQkJCQl3aGlsZSggISRsb2dmaWxlLT5lb2YoKSApIHsKCQkJCQkKCQkJCQkJJGxpbmUgPSAkbG9nZmlsZS0+Y3VycmVudCgpOwoJCQkJCQkkaWQgPSAkbG9nZmlsZS0+a2V5KCk7IC8vIFVzZSB0aGUgbGluZSBudW1iZXIgYXMgdW5pcXVlIGtleSBmb3IgbGF0ZXIgc29ydGluZwoJCQkJCQkkbG9nZmlsZS0+bmV4dCgpOwoJCQkJCQkKCQkJCQkJaWYgKCBwcmVnX21hdGNoKCAnL15ccyooemlwIHdhcm5pbmc6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkJCgkJCQkJCQkvLyBMb29raW5nIGZvciBzcGVjaWZpYyB0eXBlcyBvZiB3YXJuaW5nIC0gaW4gcGFydGljdWxhciB3YW50IHRoZSB3YXJuaW5nIHRoYXQKCQkJCQkJCS8vIGluZGljYXRlcyBhIGZpbGUgY291bGRuJ3QgYmUgcmVhZCBhcyB3ZSB3YW50IHRvIHRyZWF0IHRoYXQgYXMgYSAic2tpcHBlZCIKCQkJCQkJCS8vIHdhcm5pbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB6aXAgZmxhZ2dlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHByb2JsZW0gYnV0CgkJCQkJCQkvLyBjcmVhdGVkIHRoZSB6aXAgZmlsZSBhbnl3YXkgLSBidXQgaXQgd291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhlIG5vbi16ZXJvIGV4aXQKCQkJCQkJCS8vIGNvZGUgb2YgMTggYW5kIHdlIGtleSBvZmYgdGhhdCBsYXRlci4gQWxsIG90aGVyIHdhcm5pbmdzIGFyZSBub3QgY29uc2lkZXJlZAoJCQkJCQkJLy8gcmVhc29ucyB0byByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hpbHN0IHN0aWxsIGNyZWF0aW5nIGEgemlwIGZpbGUgc28KCQkJCQkJCS8vIHdlJ2xsIGZvbGxvdyB0aGUgbGVhZCBvbiB0aGF0IGFuZCBub3QgaGF2ZSBvdGhlciB3YXJuaW5nIHR5cGVzIGhhbHQgdGhlIGJhY2t1cC4KCQkJCQkJCS8vIFNvIHdlJ2xsIHRyeSBhbmQgbG9vayBmb3IgYSB3YXJuaW5nIG91dHB1dCB0aGF0IGxvb2tzIGxpa2UgaXQgaXMgZmlsZSByZWxhdGVkLi4uCgkJCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgd2FybmluZzopXHMqKFteOl0qOilccyooLiopL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkJCQoJCQkJCQkJCS8vIE1hdGNoZWQgdG8gd2hhdCBsb29rcyBsaWtlIGEgZmlsZSByZWxhdGVkIHdhcm5pbmcgc28gY2hlY2sgcGFydGljdWxhciBjYXNlcwoJCQkJCQkJCXN3aXRjaCAoIHN0cnRvbG93ZXIoICRtYXRjaGVzWyAyIF0gKSApIHsKCQkJCQkJCQkJY2FzZSAiY291bGQgbm90IG9wZW4gZm9yIHJlYWRpbmc6IjoJCQkJCQkJCQkJCgkJCQkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfV0FSTklOR19TS0lQUEVEIF1bICRpZCBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQljYXNlICJuYW1lIG5vdCBtYXRjaGVkOiI6CQkJCQkJCQkJCQoJCQkJCQkJCQkJJHppcF9vdGhlclsgc2VsZjo6WklQX09USEVSX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkJJHppcF9vdGhlcl9jb3VudCsrOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfV0FSTklOR19HRU5FUklDIF1bICRpZCBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkKCQkJCQkJCQkvLyBEaWRuJ3QgbWF0Y2ggdG8gd2hhdCB3b3VsZCBsb29rIGxpa2UgYSBmaWxlIHJlbGF0ZWQgd2FybmluZyBzbyBjb3VudCBpdCByZWdhcmRsZXNzCgkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfR0VORVJJQyBdWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCQoJCQkJCQkJfQoJCQkJCQkJCgkJCQkJCX0gZWxzZWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcCBlcnJvcjopL2knLCAkbGluZSApICkgewoJCQkJCQkKCQkJCQkJCSR6aXBfZXJyb3JzWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkkemlwX2Vycm9yc19jb3VudCsrOwoJCQkJCQkKCQkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooYWRkaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCQoJCQkJCQkJLy8gQ3VycmVudGx5IG5vdCBwcm9jZXNzaW5nIGFkZGl0aW9ucyBlbnRyaWVkCgkJCQkJCQkvLyR6aXBfYWRkaXRpb25zW10gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJLy8kemlwX2FkZGl0aW9uc19jb3VudCsrOwoJCQkJCQkKCQkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooc2Q6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkJCgkJCQkJCQkkemlwX2RlYnVnWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkkemlwX2RlYnVnX2NvdW50Kys7CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIEN1cnJlbnRseSBub3QgcHJvY2Vzc2luZyBvdGhlciBlbnRyaWVzCgkJCQkJCQkvLyR6aXBfb3RoZXJbXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkvLyR6aXBfb3RoZXJfY291bnQrKzsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCXVuc2V0KCAkbG9nZmlsZSApOwoJCQkJCQoJCQkJCUB1bmxpbmsoICRsb2dmaWxlX25hbWUgKTsKCQkJCQkKCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQkKCQkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB3ZSBzaG91bGQgaGF2ZSBiZWVuIGFibGUgdG8gb3BlbiB0aGUgbG9nIGZpbGUuLi4KCQkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdMb2cgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIC0gZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gVE9ETzogJG91dHB1dCBjb3VsZCBiZSBsYXJnZSBzbyBpZiB3ZSBwYXJzZSBpdCBhbGwgaW50byBzZXBhcmF0ZSBhcnJheXMgdGhlbiBtYXkgd2FudCB0byBzaGlmdAoJCQkJLy8gb3V0IGVhY2ggbGluZSBhbmQgdGhlbiBkaXNjYXJkIGl0IGFmdGVyIGNvcGllZCB0byBhbm90aGVyIGFycmF5CgkJCQkkaWQgPSAwOyAvLyBDcmVhdGUgYSB1bmlxdWUga2V5IChsaWtlIGEgbGluZSBudW1iZXIpIGZvciBsYXRlciBzb3J0aW5nCgkJCQlmb3JlYWNoICggJG91dHB1dCBhcyAkbGluZSApIHsKCQkJCQoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcCB3YXJuaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCS8vIExvb2tpbmcgZm9yIHNwZWNpZmljIHR5cGVzIG9mIHdhcm5pbmcgLSBpbiBwYXJ0aWN1bGFyIHdhbnQgdGhlIHdhcm5pbmcgdGhhdAoJCQkJCQkvLyBpbmRpY2F0ZXMgYSBmaWxlIGNvdWxkbid0IGJlIHJlYWQgYXMgd2Ugd2FudCB0byB0cmVhdCB0aGF0IGFzIGEgInNraXBwZWQiCgkJCQkJCS8vIHdhcm5pbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB6aXAgZmxhZ2dlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHByb2JsZW0gYnV0CgkJCQkJCS8vIGNyZWF0ZWQgdGhlIHppcCBmaWxlIGFueXdheSAtIGJ1dCBpdCB3b3VsZCBoYXZlIGdlbmVyYXRlZCB0aGUgbm9uLXplcm8gZXhpdAoJCQkJCQkvLyBjb2RlIG9mIDE4IGFuZCB3ZSBrZXkgb2ZmIHRoYXQgbGF0ZXIuIEFsbCBvdGhlciB3YXJuaW5ncyBhcmUgbm90IGNvbnNpZGVyZWQKCQkJCQkJLy8gcmVhc29ucyB0byByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hpbHN0IHN0aWxsIGNyZWF0aW5nIGEgemlwIGZpbGUgc28KCQkJCQkJLy8gd2UnbGwgZm9sbG93IHRoZSBsZWFkIG9uIHRoYXQgYW5kIG5vdCBoYXZlIG90aGVyIHdhcm5pbmcgdHlwZXMgaGFsdCB0aGUgYmFja3VwLgoJCQkJCQkvLyBTbyB3ZSdsbCB0cnkgYW5kIGxvb2sgZm9yIGEgd2FybmluZyBvdXRwdXQgdGhhdCBsb29rcyBsaWtlIGl0IGlzIGZpbGUgcmVsYXRlZC4uLgoJCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgd2FybmluZzopXHMqKFteOl0qOilccyooLiopL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkJCgkJCQkJCQkvLyBNYXRjaGVkIHRvIHdoYXQgbG9va3MgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNoZWNrIHBhcnRpY3VsYXIgY2FzZXMKCQkJCQkJCXN3aXRjaCAoIHN0cnRvbG93ZXIoICRtYXRjaGVzWyAyIF0gKSApIHsKCQkJCQkJCQljYXNlICJjb3VsZCBub3Qgb3BlbiBmb3IgcmVhZGluZzoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfU0tJUFBFRCBdWyAkaWQrKyBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQljYXNlICJuYW1lIG5vdCBtYXRjaGVkOiI6CQkJCQkJCQkJCQoJCQkJCQkJCQkkemlwX290aGVyWyBzZWxmOjpaSVBfT1RIRVJfR0VORVJJQyBdWyAkaWQrKyBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJCQkJJHppcF9vdGhlcl9jb3VudCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQlkZWZhdWx0OgoJCQkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfV0FSTklOR19HRU5FUklDIF1bICRpZCsrIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkkemlwX3dhcm5pbmdzX2NvdW50Kys7CgkJCQkJCQl9CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIERpZG4ndCBtYXRjaCB0byB3aGF0IHdvdWxkIGxvb2sgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNvdW50IGl0IHJlZ2FyZGxlc3MKCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgXVsgJGlkKysgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkkemlwX3dhcm5pbmdzX2NvdW50Kys7CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQl9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgZXJyb3I6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkKCQkJCQkJJHppcF9lcnJvcnNbICRpZCsrIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkkemlwX2Vycm9yc19jb3VudCsrOwoJCQkJCQoJCQkJCX0gZWxzZWlmICggcHJlZ19tYXRjaCggJy9eXHMqKGFkZGluZzopL2knLCAkbGluZSApICkgewoJCQkJCQoJCQkJCQkvLyBDdXJyZW50bHkgbm90IHByb2Nlc3NpbmcgYWRkaXRpb25zIGVudHJpZWQKCQkJCQkJLy8kemlwX2FkZGl0aW9uc1tdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJLy8kemlwX2FkZGl0aW9uc19jb3VudCsrOwoJCQkJCQkkaWQrKzsKCQkJCQkKCQkJCQl9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvXlxzKihzZDopL2knLCAkbGluZSApICkgewoJCQkJCQoJCQkJCQkkemlwX2RlYnVnWyAkaWQrKyBdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJJHppcF9kZWJ1Z19jb3VudCsrOwoJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIEN1cnJlbnRseSBub3QgcHJvY2Vzc2luZyBvdGhlciBlbnRyaWVzCgkJCQkJCS8vJHppcF9vdGhlcltdID0gdHJpbSggJGxpbmUgKTsKCQkJCQkJLy8kemlwX290aGVyX2NvdW50Kys7CgkJCQkJCSRpZCsrOwoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0KCQoJCQkJLy8gTm93IGZyZWUgdXAgdGhlIG1lbW9yeS4uLgoJCQkJdW5zZXQoICRvdXRwdXQgKTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBTZXQgY29udmVuaWVuY2UgZmxhZ3MJCQkKCQkJJGhhdmVfemlwX3dhcm5pbmdzID0gKCAwIDwgJHppcF93YXJuaW5nc19jb3VudCApOwoJCQkkaGF2ZV96aXBfZXJyb3JzID0gKCAwIDwgJHppcF9lcnJvcnNfY291bnQgKTsKCQkJJGhhdmVfemlwX2FkZGl0aW9ucyA9ICggMCA8ICR6aXBfYWRkaXRpb25zX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9kZWJ1ZyA9ICggMCA8ICR6aXBfZGVidWdfY291bnQgKTsKCQkJJGhhdmVfemlwX290aGVyID0gKCAwIDwgJHppcF9vdGhlcl9jb3VudCApOwoJCQkKCQkJLy8gQWx3YXlzIHJlcG9ydCB0aGUgZXhpdCBjb2RlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBtaWdodCBpZ25vcmUgaXQgb3Igbm90CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBwcm9jZXNzIGV4aXQgY29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRleGl0Y29kZSApOwoJCQkKCQkJLy8gQWx3YXlzIHJlcG9ydCB0aGUgbnVtYmVyIG9mIHdhcm5pbmdzIC0gZXZlbiBqdXN0IHRvIGNvbmZpcm0gdGhhdCB3ZSBkaWRuJ3QgaGF2ZSBhbnkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICUxJHMgd2FybmluZyUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX3dhcm5pbmdzX2NvdW50LCAoICggMSA9PSAkemlwX3dhcm5pbmdzX2NvdW50ICkgPyAnJyA6ICdzJyApICkgKTsKCgkJCS8vIEFsd2F5cyByZXBvcnQgd2FybmluZ3MgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVzZXIgaGFzIHNlbGVjdGVkIHRvIGlnbm9yZSB0aGVtCgkJCWlmICggdHJ1ZSA9PT0gJGhhdmVfemlwX3dhcm5pbmdzICkgewoJCQkKCQkJCSR0aGlzLT5sb2dfemlwX3JlcG9ydHMoICR6aXBfd2FybmluZ3MsIHNlbGY6OiRfd2FybmluZ19kZXNjLCAiV0FSTklORyIsIHNlbGY6Ok1BWF9XQVJOSU5HX0xJTkVTX1RPX1NIT1csIGRpcm5hbWUoIGRpcm5hbWUoICR0ZW1wZGlyICkgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAncGJfYmFja3VwYnVkZHknIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHNlbGY6OlpJUF9XQVJOSU5HU19GSUxFX05BTUUgKTsKCgkJCX0KCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgb3RoZXIgcmVwb3J0cyByZWdhcmRsZXNzCgkJCWlmICggdHJ1ZSA9PT0gJGhhdmVfemlwX290aGVyICkgewoJCQkKCQkJCS8vIE9ubHkgcmVwb3J0IG51bWJlciBvZiBpbmZvcm1hdGlvbmFscyBpZiB3ZSBoYXZlIGFueSBhcyB0aGV5IGFyZSBub3QgdGhhdCBpbXBvcnRhbnQKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIGluZm9ybWF0aW9uJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfb3RoZXJfY291bnQsICggKCAxID09ICR6aXBfb3RoZXJfY291bnQgKSA/ICdhbCcgOiAnYWxzJyApICkgKTsKCgkJCQkkdGhpcy0+bG9nX3ppcF9yZXBvcnRzKCAkemlwX290aGVyLCBzZWxmOjokX290aGVyX2Rlc2MsICJJTkZPUk1BVElPTiIsIHNlbGY6Ok1BWF9PVEhFUl9MSU5FU19UT19TSE9XLCBkaXJuYW1lKCBkaXJuYW1lKCAkdGVtcGRpciApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3BiX2JhY2t1cGJ1ZGR5JyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzZWxmOjpaSVBfT1RIRVJTX0ZJTEVfTkFNRSApOwoKCQkJfQoJCQkKCQkJLy8gU2VlIGlmIHdlIGNhbiBmaWd1cmUgb3V0IHdoYXQgaGFwcGVuZWQgLSBub3RlIHRoYXQgJGV4aXRjb2RlIGNvdWxkIGJlIG5vbi16ZXJvIGZvciBhY3Rpb25hYmxlIHdhcm5pbmcocykgb3IgZXJyb3IKCQkJLy8gaWYgKCAobm8gemlwIGZpbGUpIG9yIChmYXRhbCBleGl0IGNvZGUpIG9yIChub3QgaWdub3Jpbmcgd2FybmFibGUgZXhpdCBjb2RlKSApCgkJCS8vIFRPRE86IEhhbmRsZSBjb25kaXRpb24gdGVzdGluZyB3aXRoIGZ1bmN0aW9uIGNhbGxzIGJhc2VkIG9uIG1hcHBpbmcgZXhpdCBjb2RlcyB0byBleGl0IHR5cGUgKGZhdGFsIHZzIG5vbi1mYXRhbCkKCQkJaWYgKCAoICEgQGZpbGVfZXhpc3RzKCAkdGVtcF96aXAgKSApIHx8CgkJCQkgKCAoIDAgIT0gJGV4aXRjb2RlICkgJiYgKCAxOCAhPSAkZXhpdGNvZGUgKSApIHx8CgkJCQkgKCAoIDE4ID09ICRleGl0Y29kZSApICYmICEkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgKSB7CgkJCQoJCQkJLy8gSWYgd2UgaGF2ZSBhbnkgemlwIGVycm9ycyByZXBvcnRlZCBzaG93IHRoZW0gcmVnYXJkbGVzcwoJCQkJaWYgKCB0cnVlID09PSAkaGF2ZV96aXBfZXJyb3JzICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICUxJHMgZXJyb3IlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9lcnJvcnNfY291bnQsICggKCAxID09ICR6aXBfZXJyb3JzX2NvdW50ICkgPyAnJyA6ICdzJyApICApICk7CgkJCQkJCgkJCQkJZm9yZWFjaCAoICR6aXBfZXJyb3JzIGFzICRsaW5lICkgewoJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgcHJvY2VzcyByZXBvcnRlZDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRsaW5lICk7CgkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgoJCQkJLy8gUmVwb3J0IHdoZXRoZXIgb3Igbm90IHRoZSB6aXAgZmlsZSB3YXMgY3JlYXRlZCAod2hldGhlciB0aGF0IGJlIGluIHRoZSBmaW5hbCBvciB0ZW1wb3JhcnkgbG9jYXRpb24pCQkJCgkJCQlpZiAoICEgQGZpbGVfZXhpc3RzKCAkdGVtcF96aXAgKSApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgQXJjaGl2ZSBmaWxlIG5vdCBjcmVhdGVkIC0gY2hlY2sgcHJvY2VzcyBleGl0IGNvZGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBjcmVhdGVkIGJ1dCB3aXRoIGVycm9ycy9hY3Rpb25hYmxlLXdhcm5pbmdzIHNvIHdpbGwgYmUgZGVsZXRlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlIGFuZCB3YXJuaW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCQkvLyBUaGUgb3BlcmF0aW9uIGhhcyBmYWlsZWQgb25lIHdheSBvciBhbm90aGVyLiBOb3RlIHRoYXQgYXMgdGhlIHVzZXIgZGlkbid0IGNob29zZSB0byBpZ25vcmUgZXJyb3JzIHRoZSB6aXAgZmlsZQoJCQkJLy8gaXMgYWx3YXlzIGNyZWF0ZWQgaW4gYSB0ZW1wb3JhcnkgbG9jYXRpb24gYW5kIHRoZW4gb25seSBtb3ZlZCB0byBmaW5hbCBsb2NhdGlvbiBvbiBzdWNjZXNzIHdpdGhvdXQgZXJyb3Igb3Igd2FybmluZ3MuCgkJCQkvLyBUaGVyZWZvcmUgaWYgdGhlcmUgaXMgYSB6aXAgZmlsZSAocHJvZHVjZWQgYnV0IHdpdGggd2FybmluZ3MpIGl0IHdpbGwgbm90IGJlIHZpc2libGUgYW5kIHdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZQoJCQkJLy8gdGVtcG9yYXJ5IGRpcmVjdG9yeSBpcyBkZWxldGVkIGJlbG93LgoJCQkJCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBHb3QgZmlsZSB3aXRoIG5vIGVycm9yIG9yIHdhcm5pbmdzIF9vcl8gd2l0aCB3YXJuaW5ncyB0aGF0IHRoZSB1c2VyIGhhcyBjaG9zZW4gdG8gaWdub3JlCgkJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgewoJCQkJCgkJCQkJLy8gQmVjYXVzZSBub3QgaWdub3Jpbmcgd2FybmluZ3MgdGhlIHppcCBhcmNoaXZlIHdhcyBidWlsdCBpbiB0ZW1wb3JhcnkgbG9jYXRpb24gc28gd2UgbmVlZCB0byBtb3ZlIGl0CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnTW92aW5nIFppcCBBcmNoaXZlIGZpbGUgdG8gbG9jYWwgYXJjaGl2ZSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIG5vIHN0YWxlIGZpbGUgaW5mb3JtYXRpb24KCQkJCQljbGVhcnN0YXRjYWNoZSgpOwoJCQkJCQoJCQkJCUByZW5hbWUoICR0ZW1wX3ppcCwgJHppcCApOwoJCQkJCQoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkemlwICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBBcmNoaXZlIGZpbGUgbW92ZWQgdG8gbG9jYWwgYXJjaGl2ZSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCB3aXRoIG5vIGVycm9ycyBvciBhY3Rpb25hYmxlIHdhcm5pbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJCgkJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwICk7CgkJCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBBcmNoaXZlIGZpbGUgY291bGQgbm90IGJlIG1vdmVkIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkKCQkJCQl9CgkJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFdhcm5pbmdzIHdlcmUgYmVpbmcgaWdub3JlZCBzbyBidWlsdCBpbiBmaW5hbCBsb2NhdGlvbiBzbyBubyBuZWVkIHRvIG1vdmUgaXQKCQkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCB3aXRoIG5vIGVycm9ycyAoYW55IGFjdGlvbmFibGUgd2FybmluZ3MgaWdub3JlZCBieSB1c2VyIHNldHRpbmdzKS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQoJCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcCApOwoJCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBPZGQgY29uZGl0aW9uIC0gZmlsZSBzaG91bGQgYmUgcHJlc2VudCBidXQgYXBwYXJlbnRseSBub3Q/CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBBcmNoaXZlIGZpbGUgY291bGQgbm90IGJlIGZvdW5kIGluIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQl9CQkJCgoJCQkvLyBDbGVhbnVwIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgd2lsbCBoYXZlIGFsbCBkZXRyaXR1cyBhbmQgbWF5YmUgaW5jb21wbGV0ZSB6aXAgZmlsZQkJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdSZW1vdmluZyB0ZW1wb3JhcnkgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCgkJCWlmICggISggJHRoaXMtPmRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkdGVtcGRpciApICkgKSB7CgkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGVtcGRpciApOwoJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQkJCQkJCQoJCX0KCQkKCQkvKioKCQkgKglleHRyYWN0KCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoJSWYgbm8gc3BlY2lmaWMgaXRlbXMgZ2l2ZW4gdG8gZXh0cmFjdCB0aGVuIGl0J3MgYSBjb21wbGV0ZSB1bnppcAoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHBhcmFtCWFycmF5CQkkaXRlbXMJCQkJCQlNYXBwaW5nIG9mIHdoYXQgdG8gZXh0cmFjdCBhbmQgdG8gd2hhdAoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYWxsIGV4dHJhY3Rpb25zIHN1Y2Nlc3NmdWwpLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyA9IGFycmF5KCkgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkKCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfTklYOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJaWYgKCBlbXB0eSggJGl0ZW1zICkgKSB7CgkJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZXh0cmFjdF9nZW5lcmljX2Z1bGwoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRpdGVtcyApOwkJCQkJCgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgoJCS8qKgoJCSAqCWV4dHJhY3RfZ2VuZXJpY19mdWxsKCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycgKSB7CgkJCgkJCSRzdW1tYXJ5ID0gJyc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkZXhpdF9jb2RlID0gMTI3OwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsKCQkJCgkJCQkvLyBHZXQgdGhlIGNvbW1hbmQgcGF0aCBmb3IgdGhlIHVuemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJCSR6aXBwYXRoID0gJHRoaXMtPmdldF9jb21tYW5kX3BhdGgoIHNlbGY6OkNPTU1BTkRfVU5aSVBfUEFUSCApOwoJCQkJCgkJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJCWlmICggIWVtcHR5ICggJHppcHBhdGggKSApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdVc2luZyBhYnNvbHV0ZSB1bnppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICR6aXBwYXRoICkgLiAndW56aXAnOwkKCQoJCQkJLy8gV2UnbGwgdHJ5IGFuZCBleHRyYWN0IGZyb20gdGhlIGJhY2t1cCBmaWxlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnksIHZlcnkgcXVpZXRseSB3aXRoIG92ZXJ3cml0ZQoJCQkJLy8gSWYgd2UganVzdCBkaWQgLW8gd2UgY291bGQgdHJ5IGFuZCBnZXQgZmlsZSBjb3VudCBmcm9tIHByb2Nlc3NpbmcgJG91dHB1dCBidXQgaXQgd291bGQgYmUgYSBiaXQgdGltZS1jb25zdW1pbmcKCQkJCSR1bnppcF9jb21tYW5kID0gJGNvbW1hbmQgLiAiIC1xcW8gJ3skemlwX2ZpbGV9JyAtZCAneyRkZXN0aW5hdGlvbl9kaXJlY3Rvcnl9JyAteCAnaW1wb3J0YnVkZHkucGhwJyI7CgkJCQkKCQkJCSR1bnppcF9jb21tYW5kID0gKCBzZWxmOjpPU19UWVBFX1dJTiA9PT0gJHRoaXMtPmdldF9vc190eXBlKCkgKSA/IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICR1bnppcF9jb21tYW5kICkgOiAkdW56aXBfY29tbWFuZDsKCQkJCQoJCQkJQGV4ZWMoICR1bnppcF9jb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQoJCQkJLy8gTm90ZTogd2UgZG9uJ3Qgb3BlbiB0aGUgZmlsZSBhbmQgdGhlbiBkbyBzdHVmZiBidXQgaXQncyBhbGwgZG9uZSBpbiBvbmUgYWN0aW9uCgkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gZG8KCQkJCXN3aXRjaCAoIChpbnQpICRleGl0X2NvZGUgKSB7CgkJCQkJY2FzZSAwOgoJCQkJCQkvLyBIYW5kbGVkIGFyY2hpdmUgYW5kIGFwcGFyZW50bHkgbm8gZXh0cmFjdGlvbiBwcm9ibGVtcwoJCQkJCQkKCQkJCQkJLy8gTm93IHdlIGhhdmUgdG8gZG8gYSBzZWNvbmQgcnVuIHRvIGZpbmQgb3V0IHRoZSBmaWxlIGNvdW50IChjcmF6eSkKCQkJCQkJJGxpc3RfY29tbWFuZCA9ICRjb21tYW5kIC4gIiAtcWwgJ3skemlwX2ZpbGV9JyI7CgkJCQkJCQoJCQkJCQkkbGlzdF9jb21tYW5kID0gKCBzZWxmOjpPU19UWVBFX1dJTiA9PT0gJHRoaXMtPmdldF9vc190eXBlKCkgKSA/IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICRsaXN0X2NvbW1hbmQgKSA6ICRsaXN0X2NvbW1hbmQ7CgkJCQkJCQoJCQkJCQkvLyRzdW1tYXJ5ID0gQGV4ZWMoICRsaXN0X2NvbW1hbmQsICRvdXRwdXQsICRleGl0X2NvZGUpOwoJCQkJCQkkc3VtbWFyeSA9IEBleGVjKCAkbGlzdF9jb21tYW5kICk7CgoJCQkJCQkvLyBDdXJyZW50bHkgZG9uJ3QgYm90aGVyIHRvIGNoZWNrIGV4aXQgY29kZSwgaWYgd2UgZmFpbGVkIHRoZW4gd2hhdGV2ZXIgd2UgZ290IGJhY2sgaW4KCQkJCQkJLy8gTGFzdCBvdXRwdXQgbGluZSBfc2hvdWxkXyBoYXZlIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIChhbmQgdGhhdCBpcyByZXR1cm5lZCBieSBleGVjKQoJCQkJCQkvLyAkc3VtbWFyeSBpcyB1bmxpa2VseSB0byBtYXRjaCB0aGUgcGF0dGVybiBzbyBmaWxlIGNvdW50IHdpbGwganVzdCBkZWZhdWx0IHRvIDAKCQkJCQkJaWYgKCBwcmVnX21hdGNoKCJ8W1s6XmRpZ2l0Ol1dKyg/UDxieXRlX2NvdW50PltbOmRpZ2l0Ol1dKylbWzpeZGlnaXQ6XV0rKD9QPGZpbGVfY291bnQ+W1s6ZGlnaXQ6XV0rKVtbOnNwYWNlOl1dKyhmaWxlcyl8IiwgJHN1bW1hcnksICRtYXRjaGVzICkgKSB7CgkJCQkJCQoJCQkJCQkJLy8gU2hvdWxkIGJlIGFibGUgdG8gcHVsbCB0aGlzIHN0cmFpZ2h0IG91dCBwcm92aWRlZCB0aGUgdW56aXAgdmVyc2lvbiBzdHVjayB0byB0aGUgcnVsZXMKCQkJCQkJCSRmaWxlX2NvdW50ID0gJG1hdGNoZXNbICdmaWxlX2NvdW50JyBdOwoJCQkJCQkJCgkJCQkJCX0gZWxzZSB7CgkJCQkJCQoJCQkJCQkJLy8gU29tZSByZWFzb24gd2UgZGlkbid0IGdldCBnb29kIG91dHB1dCBvciB0aGUgZm9ybWF0IGlzIG9kZAoJCQkJCQkJJGZpbGVfY291bnQgPSAwOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh1bnppcCkgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgdG8gJTIkcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoJCgkJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwX2ZpbGUgKTsKCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUgdG8gZXh0cmFjdCBjb250ZW50cyAoJTEkcyB0byAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIGV4ZWMgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGZ1bmN0aW9uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdleGVjIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBleGVjIGZ1bmN0aW9uIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIkNsYXNzIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQoJCX0KCgkJLyoqCgkJICoJZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcGFyYW0JYXJyYXkJCSRpdGVtcwkJCQkJCU1hcHBpbmcgb2Ygd2hhdCB0byBleHRyYWN0IGFuZCB0byB3aGF0CgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzIChhbGwgZXh0cmFjdGlvbnMgc3VjY2Vzc2Z1bCksIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgKSB7CgkJCgkJCSRzdW1tYXJ5ID0gJyc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkZXhpdF9jb2RlID0gMTI3OwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJJHJlbmFtZV9yZXF1aXJlZCA9IGZhbHNlOwoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkKCQkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgdW56aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9VTlpJUF9QQVRIICk7CgkJCQkKCQkJCS8vIERldGVybWluZSBpZiB3ZSBhcmUgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aAoJCQkJaWYgKCAhZW1wdHkgKCAkemlwcGF0aCApICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHVuemlwIHBhdGg6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkemlwcGF0aCApOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCc7CQoJCgkJCQkvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGVhY2ggaXRlbSBhbmQgcnVuIGFuIHVuemlwIGZvciBpdCAtIHVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gZWFzeSB3YXkgb2YgY29tYmluaW5nCgkJCQkvLyBhcmJpdHJhcnkgZXh0cmFjdGlvbnMgaW50byBhIHNpbmdsZSBjb21tYW5kIGlmIHNvbWUgbWlnaHQgYmUgdG8gYSAKCQkJCWZvcmVhY2ggKCAkaXRlbXMgYXMgJHdoYXQgPT4gJHdoZXJlICkgewoJCQkJCgkJCQkJJHJlbmFtZV9yZXF1aXJlZCA9IGZhbHNlOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJCS8vIERlY2lkZSBob3cgdG8gZXh0cmFjdCBiYXNlZCBvbiB3aGVyZQoJCQkJCWlmICggZW1wdHkoICR3aGVyZSkgKSB7CgkJCQkJCgkJCQkJCS8vIEV4dHJhY3QgZGlyZWN0IHRvIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aXRoIGp1bmtlZCBwYXRoCgkJCQkJCSR1bnppcF9jb21tYW5kID0gJGNvbW1hbmQgLiAiIC1xcW9qICd7JHppcF9maWxlfScgJ3skd2hhdH0nIC1kICd7JGRlc3RpbmF0aW9uX2RpcmVjdG9yeX0nICI7CgkJCQkJCgkJCQkJfSBlbHNlaWYgKCAhZW1wdHkoICR3aGVyZSApICkgewoJCQkJCQoJCQkJCQlpZiAoICR3aGF0ID09PSAkd2hlcmUgKSB7CgkJCQkJCQoJCQkJCQkJLy8gRXh0cmFjdCB0byBzYW1lIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgLSBkb24ndCBqdW5rIHBhdGgsIG5vIG5lZWQgdG8gYWRkIHdoZXJlIHRvIGRlc3RuYXRpb24gYXMgYXV0b21hdGljCgkJCQkJCQkkdW56aXBfY29tbWFuZCA9ICRjb21tYW5kIC4gIiAtcXFvICd7JHppcF9maWxlfScgJ3skd2hhdH0nIC1kICd7JGRlc3RpbmF0aW9uX2RpcmVjdG9yeX0nICI7CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIEZpcnQgd2UnbGwgZXh0cmFjdCBhbmQganVuayB0aGUgcGF0aAoJCQkJCQkJJHVuemlwX2NvbW1hbmQgPSAkY29tbWFuZCAuICIgLXFxb2ogJ3skemlwX2ZpbGV9JyAneyR3aGF0fScgLWQgJ3skZGVzdGluYXRpb25fZGlyZWN0b3J5fScgIjsKCQkJCQkJCQoJCQkJCQkJLy8gV2lsbCBuZWVkIHRvIHJlbmFtZSBpZiB0aGUgZXh0cmFjdCBpcyBvawoJCQkJCQkJJHJlbmFtZV9yZXF1aXJlZCA9IHRydWU7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQkJJHVuemlwX2NvbW1hbmQgPSAoIHNlbGY6Ok9TX1RZUEVfV0lOID09PSAkdGhpcy0+Z2V0X29zX3R5cGUoKSApID8gc3RyX3JlcGxhY2UoICdcJycsICciJywgJHVuemlwX2NvbW1hbmQgKSA6ICR1bnppcF9jb21tYW5kOwoJCQkJCgkJCQkJQGV4ZWMoICR1bnppcF9jb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQoJCQkJCS8vIE5vdGU6IHdlIGRvbid0IG9wZW4gdGhlIGZpbGUgYW5kIHRoZW4gZG8gc3R1ZmYgYnV0IGl0J3MgYWxsIGRvbmUgaW4gb25lIGFjdGlvbgoJCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJCXN3aXRjaCAoIChpbnQpICRleGl0X2NvZGUgKSB7CgkJCQkJCWNhc2UgMDoKCQkJCQkJCS8vIEhhbmRsZWQgYXJjaGl2ZSBhbmQgYXBwYXJlbnRseSBubyBleHRyYWN0aW9uIHByb2JsZW1zCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdleGVjICh1bnppcCkgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR3aGF0LCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICR3aGVyZSApICk7CgkJCQkJCQoJCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQkKCQkJCQkJCS8vIFJlbmFtZSBpZiB3ZSBoYXZlIHRvCgkJCQkJCQlpZiAoIHRydWUgPT09ICRyZW5hbWVfcmVxdWlyZWQpIHsKCQkJCQkJCQoJCQkJCQkJCS8vIE5vdGU6IHdlIGp1bmtlZCB0aGUgcGF0aCBvbiB0aGUgZXh0cmFjdGlvbiBzbyBqdXN0IHRoZSBmaWxlbmFtZSBvZiAkd2hhdCBpcyB0aGUgc291cmNlIGJ1dAoJCQkJCQkJCS8vICR3aGVyZSBjb3VsZCBiZSBhIHNpbXBsZSBmaWxlIG5hbWUgb3IgYSBmaWxlIHBhdGggCgkJCQkJCQkJJHJlc3VsdCA9ICRyZXN1bHQgJiYgcmVuYW1lKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGJhc2VuYW1lKCAkd2hhdCApLAoJCQkJCQkJCQkJCQkJCQkgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkd2hlcmUgKTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCS8vIEZvciBub3cgbGV0J3MganVzdCBwcmludCB0aGUgZXJyb3IgY29kZSBhbmQgZHJvcCB0aHJvdWdoCgkJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJGV4aXRfY29kZTsKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUgdG8gZXh0cmFjdCBjb250ZW50cyAoJTEkcyBmcm9tICUyJHMgdG8gJTMkcyU0JHMpIC0gRXJyb3IgSW5mbzogJTUkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkd2hhdCwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkd2hlcmUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCX0KCQkJCQkKCQkJCQkvLyBJZiB0aGUgZXh0cmFjdGlvbiBmYWlsZWQgKG9yIHJlbmFtZSBhZnRlciBleHRyYWN0aW9uKSB0aGVuIGJyZWFrIG91dCBvZiB0aGUgZm9yZWFjaCBhbmQgc2ltcGx5IHJldHVybiBmYWxzZQoJCQkJCWlmICggZmFsc2UgPT09ICRyZXN1bHQgKSB7CgkJCQkJCgkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgZXhlYyBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgZnVuY3Rpb24KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ2V4ZWMgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGV4ZWMgZnVuY3Rpb24gbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiQ2xhc3Mgbm90IGF2YWlsYWJsZSB0byBtYXRjaCBtZXRob2QiICk7CgkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCgkJfQoKCQkvKioKCQkgKglmaWxlX2V4aXN0cygpCgkJICoJCgkJICoJVGVzdHMgd2hldGhlciBhIGZpbGUgKHdpdGggcGF0aCkgZXhpc3RzIGluIHRoZSBnaXZlbiB6aXAgZmlsZQoJCSAqCUlmIGxlYXZlX29wZW4gaXMgdHJ1ZSB0aGVuIHRoZSB6aXAgb2JqZWN0IHdpbGwgYmUgbGVmdCBvcGVuIGZvciBmYXN0ZXIgY2hlY2tpbmcgZm9yIHN1YnNlcXVlbnQgZmlsZXMgd2l0aGluIHRoaXMgemlwCgkJICogIE5vdGU6IHRoaXMgaXMgaWdub3JlZCBoZXJlIGJlY2F1c2UgaXQgaGFzIG5vIG1lYW5pbmcgaW4gdGhlIHVzZSBvZiB0aGUgdW56aXAgY29tbWFuZAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXBfZmlsZQkJVGhlIHppcCBmaWxlIHRvIGNoZWNrCgkJICoJQHBhcmFtCQlzdHJpbmcJJGxvY2F0ZV9maWxlCVRoZSBmaWxlIHRvIHRlc3QgZm9yCgkJICoJQHBhcmFtCQlib29sCSRsZWF2ZV9vcGVuCQlPcHRpb25hbDogVHJ1ZSBpZiB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGxlZnQgb3BlbgoJCSAqCUByZXR1cm4JCWJvb2wvYXJyYXkJCQkJVHJ1ZSBpZiB0aGUgZmlsZSBpcyBmb3VuZCBpbiB0aGUgemlwIGFuZCBmYWxzZSBpZiBub3QsIGFycmF5IGZvciBvdGhlciBwcm9ibGVtCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZmlsZV9leGlzdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmZpbGVfZXhpc3RzX2dlbmVyaWMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+ZmlsZV9leGlzdHNfZ2VuZXJpYyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCQkgIAkKCQl9CgoJCS8qKgoJCSAqCWZpbGVfZXhpc3RzX2dlbmVyaWMoKQoJCSAqCQoJCSAqCVRlc3RzIHdoZXRoZXIgYSBmaWxlICh3aXRoIHBhdGgpIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gemlwIGZpbGUKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUByZXR1cm4JCWJvb2wvYXJyYXkJCQkJVHJ1ZSBpZiB0aGUgZmlsZSBpcyBmb3VuZCBpbiB0aGUgemlwIGFuZCBmYWxzZSBpZiBub3QsIGFycmF5IGZvciBvdGhlciBwcm9ibGVtCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZmlsZV9leGlzdHNfZ2VuZXJpYyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUgKSB7CgkJCgkJCSRyZXN1bHQgPSBhcnJheSggMSwgIkdlbmVyaWMgZmFpbHVyZSBpbmRpY2F0aW9uIiApOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkKCQkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgewoJCQkKCQkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgdW56aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9VTlpJUF9QQVRIICk7CgkJCQkKCQkJCS8vIERldGVybWluZSBpZiB3ZSBhcmUgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aAoJCQkJaWYgKCAhZW1wdHkgKCAkemlwcGF0aCApICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHVuemlwIHBhdGg6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkemlwcGF0aCApOwoJCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd1bnppcCc7CQoJCgkJCQkvLyBUcnkgYW4gYXJjaGl2ZSB0ZXN0IG9uIHRoZSBmaWxlIGFuZCB3ZSdsbCBqdXN0IGxvb2sgYXQgdGhlIHJldHVybiBjb2RlCgkJCQkkY29tbWFuZCAuPSAiIC1xdCAneyR6aXBfZmlsZX0nICd7JGxvY2F0ZV9maWxlfSciOwoJCQkJCgkJCQkkY29tbWFuZCA9ICggc2VsZjo6T1NfVFlQRV9XSU4gPT09ICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgPyBzdHJfcmVwbGFjZSggJ1wnJywgJyInLCAkY29tbWFuZCApIDogJGNvbW1hbmQ7CgoJCQkJQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdF9jb2RlKTsKCQkJCQoJCQkJLy8gTm90ZTogd2UgZG9uJ3Qgb3BlbiB0aGUgZmlsZSBhbmQgdGhlbiBkbyBzdHVmZiBidXQgaXQncyBhbGwgZG9uZSBpbiBvbmUgYWN0aW9uCgkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gaW5kaWNhdGUKCQkJCXN3aXRjaCAoIChpbnQpICRleGl0X2NvZGUgKSB7CgkJCQkJY2FzZSAwOgoJCQkJCQkvLyBIYW5kbGVkIGFyY2hpdmUgYW5kIGZpbGUgZm91bmQgYW5kIGNoZWNrZWQgb3V0IG9rIHNvIHJldHVybiBzdWNjZXNzCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgZm91bmQgKGV4ZWMpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTE6CgkJCQkJCS8vIE5vIHByb2JsZW0gaGFuZGxpbmcgYXJjaGl2ZSBidXQgZmlsZSBzaW1wbHkgbm90IGZvdW5kIHNvIHJldHVybiBmYWlsdXJlCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kIChleGVjKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHMgKGxvb2tpbmcgZm9yICUxJHMgaW4gJTIkcykgLSBFcnJvciBJbmZvOiAlMyRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRsb2NhdGVfZmlsZSAsICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJCSRyZXN1bHQgPSBhcnJheSggMSwgIkZhaWxlZCB0byBvcGVuL3Byb2Nlc3MgZmlsZSIgKTsKCgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgZXhlYyBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgZnVuY3Rpb24KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ2V4ZWMgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGV4ZWMgZnVuY3Rpb24gbm9uLWV4aXN0ZW50JywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCSRyZXN1bHQgPSBhcnJheSggMSwgIkZ1bmN0aW9uIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgoJCX0KCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUgd2l0aCBzb21lIGZpbGUgcHJvcGVydGllcy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCVRoZSBmaWxlIHRvIGxpc3QgdGhlIGNvbnRlbnQgb2YKCQkgKglAcmV0dXJuCQlib29sfGFycmF5CQkJCWZhbHNlIG9uIGZhaWx1cmUsIG90aGVyd2lzZSBhcnJheSBvZiBmaWxlIHByb3BlcnRpZXMgKG1heSBiZSBlbXB0eSkKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmdldF9maWxlX2xpc3RfZ2VuZXJpYyggJHppcF9maWxlICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+Z2V0X2ZpbGVfbGlzdF9nZW5lcmljKCAkemlwX2ZpbGUgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoJCQoJCS8qCWdldF9maWxlX2xpc3RfZ2VuZXJpYygpCgkJICoJCgkJICoJR2V0IGFuIGFycmF5IG9mIGFsbCBmaWxlcyBpbiBhIHppcCBmaWxlIHdpdGggc29tZSBmaWxlIHByb3BlcnRpZXMuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQlUaGUgZmlsZSB0byBsaXN0IHRoZSBjb250ZW50IG9mCgkJICoJQHJldHVybgkJYm9vbHxhcnJheQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBvdGhlcndpc2UgYXJyYXkgb2YgZmlsZSBwcm9wZXJ0aWVzIChtYXkgYmUgZW1wdHkpCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9maWxlX2xpc3RfZ2VuZXJpYyggJHppcF9maWxlICkgewoJCQoJCQkkZmlsZV9saXN0ID0gYXJyYXkoKTsKCQkJJHN0YXRfa2V5cyA9IGFycmF5KCAncGVybWlzc2lvbnMnLCAnemlwX3ZlcnNpb24nLCAnemlwX29zJywgJ3NpemUnLCAndHlwZV9hdHRyJywgJ2NvbXByZXNzZWRfc2l6ZScsICdjb21wcmVzc2lvbl9tZXRob2QnLCAnbWRhdGUnLCAnZmlsZW5hbWUnICk7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCQoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2V4ZWMnICkgKSB7CgkJCQoJCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB1bnppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEggKTsKCQkJCQoJCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoCgkJCQlpZiAoICFlbXB0eSAoICR6aXBwYXRoICkgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVXNpbmcgYWJzb2x1dGUgdW56aXAgcGF0aDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR6aXBwYXRoICk7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIEFkZCB0aGUgdHJhaWxpbmcgc2xhc2ggaWYgcmVxdWlyZWQKCQkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3VuemlwJzsJCgoJCQkJLy8gV2UnbGwgdHJ5IGFuZCBnZXQgYSAqbml4IHN0eWxlIGRpcmVjdG9yeSBsaXN0aW5nIG91dHB1dCBhbmQgcHJvY2VzcyBpdAoJCQkJLy8gTm90ZTogd2UnbGwgaWdub3JlIHN0ZGVyciBvdXRwdXQgZm9yIG5vdyBhcyBpdCBtaWdodCBpbnRlcmZlcmUKCQkJCS8vIE5vdGU6IHRoZSBmaWxlIGRhdGUgZ2l2ZW4gaXMgdGhlIHN0b3JlZCBsb2NhbCB0aW1lIChub3QgVVRDIHdoaWNoIG1heSBiZSBzdG9yZWQgYXMgd2VsbCkKCQkJCQoJCQkJLy8gT3V0cHV0IGZvcm1hdCBzaG91bGQgYmUgbGlrZToKCQkJCS8vIC1yd3hyLXhyLXggIDIuMyB1bnggICAgIDI3MjkgdHggICAgMTA5OSBkZWZOIDIwMTIwMjIwLjIzMTk1NiBmaWxlL3BhdGgvbmFtZS5leHQKCQkJCSRjb21tYW5kIC49ICIgLVogLS1oIC0tdCAtbFQgJ3skemlwX2ZpbGV9JyI7CgkJCQkKCQkJCSRjb21tYW5kID0gKCBzZWxmOjpPU19UWVBFX1dJTiA9PT0gJHRoaXMtPmdldF9vc190eXBlKCkgKSA/IHN0cl9yZXBsYWNlKCAnXCcnLCAnIicsICRjb21tYW5kICkgOiAkY29tbWFuZDsKCgkJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0X2NvZGUpOwoJCQkJCgkJCQkvLyBOb3RlOiB3ZSBkb24ndCBvcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGRvIHN0dWZmIGJ1dCBpdCdzIGFsbCBkb25lIGluIG9uZSBhY3Rpb24KCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJc3dpdGNoICggKGludCkgJGV4aXRfY29kZSApIHsKCQkJCQljYXNlIDA6CgkJCQkJCS8vIEhhbmRsZWQgYXJjaGl2ZSBhbmQgYXBwYXJlbnRseSBnb3QgYSBsaXN0IHNvIHRyeSBhbmQgcHJvY2VzcyBpdAoJCQkJCQkKCQkJCQkJLy8gU2hvdWxkIGJlIG9uZSBmaWxlIHBlciBsaW5lLCBubyBtb3JlIG5vIGxlc3MKCQkJCQkJJGZpbGVfY291bnQgPSBzaXplb2YoICRvdXRwdXQgKTsKCQkJCQkJCgkJCQkJCWZvcmVhY2ggKCAkb3V0cHV0IGFzICRsaW5lICkgewoJCQkJCQkKCQkJCQkJCS8vIEJyZWFrIHVwIHRoZSBvdXRwdXQgYmFzZWQgb24gd2hpdGVzcGFjZSBmb3IgbWF4IG9mIDkgZmllbGRzIChsYXN0IHdpbGwgYmUgZmlsZW5hbWUpCgkJCQkJCQkkc3RhdCA9IGFycmF5X2NvbWJpbmUoICAkc3RhdF9rZXlzICwgcHJlZ19zcGxpdCggIi9bXHMsXSsvIiwgJGxpbmUsIDkgKSApOwoJCQkJCQkJCgkJCQkJCQkvLyBDb252ZXJ0IHNjcmV3eSBkYXRlIGZvcm1hdCB0byBhIGNvbW1vbiBub3RhdGlvbiAoY2hvb3NlIE15U1FMIGZvcm1hdCkKCQkJCQkJCSR0cmFuc2xhdGVkX21kYXRlID0gcHJlZ19yZXBsYWNlKCAnLyhcZHs0fSkoXGR7Mn0pKFxkezJ9KS4oXGR7Mn0pKFxkezJ9KShcZHsyfSkvJywnJDEtJDItJDMgJDQ6JDU6JDYnICwgJHN0YXRbICdtZGF0ZScgXSApOwoKCQkJCQkJCS8vIE11c3QgY29udmVydCB0byBhIHRpbWVzdGFtcCAodXNpbmcgY3VycmVudCB0aW1lem9uZSkKCQkJCQkJCSRzdGF0WyAnbXRpbWUnIF0gPSBzdHJ0b3RpbWUoICR0cmFuc2xhdGVkX21kYXRlICk7CgkJCQkJCQkKCQkJCQkJCSRmaWxlX2xpc3RbXSA9IGFycmF5KAoJCQkJCQkJCSRzdGF0WyAnZmlsZW5hbWUnIF0sCgkJCQkJCQkJJHN0YXRbICdzaXplJyBdLAoJCQkJCQkJCSRzdGF0WyAnY29tcHJlc3NlZF9zaXplJyBdLAoJCQkJCQkJCSRzdGF0WyAnbXRpbWUnIF0KCQkJCQkJCSk7CgkJCQkJCQkKCQkJCQkJfQoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnZXhlYyAodW56aXApIGxpc3RlZCBmaWxlIGNvbnRlbnRzICglMSRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkKCQkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR6aXBfZmlsZSApOwoJCQkJCQkKCQkJCQkJJHJlc3VsdCA9ICYkZmlsZV9saXN0OwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUgdG8gbGlzdCBjb250ZW50cyAoJTEkcykgLSBFcnJvciBJbmZvOiAlMiRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCQkvLyBDdXJyZW50bHkgYXMgd2UgYXJlIHJldHVybmluZyBhbiBhcnJheSBhcyBhIHZhbGlkIHJlc3VsdCB3ZSBqdXN0IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCX0KCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBleGVjIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBmdW5jdGlvbgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnZXhlYyBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXhlYyBmdW5jdGlvbiBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJDbGFzcyBub3QgYXZhaWxhYmxlIHRvIG1hdGNoIG1ldGhvZCIgKTsKCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCX0KCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkJICAJCgkJfQoJCQoJCS8qCXNldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gc2V0IGNvbW1lbnQgb24uCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkY29tbWVudAkJQ29tbWVudCB0byBhcHBseSB0byBhcmNoaXZlLgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9jb21tZW50KCAkemlwX2ZpbGUsICRjb21tZW50ICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPnNldF9jb21tZW50X2xpbnV4KCAkemlwX2ZpbGUsICRjb21tZW50ICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+c2V0X2NvbW1lbnRfd2luZG93cyggJHppcF9maWxlLCAkY29tbWVudCApOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgoJCS8qCXNldF9jb21tZW50X3dpbmRvd3MoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbAkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbW1lbnRfd2luZG93cyggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoKCQkvKglzZXRfY29tbWVudF9saW51eCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHNldCBjb21tZW50IG9uLgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJGNvbW1lbnQJCUNvbW1lbnQgdG8gYXBwbHkgdG8gYXJjaGl2ZS4KCQkgKglAcmV0dXJuCQlib29sCQkJCQkJCXRydWUgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29tbWVudF9saW51eCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJJG91dHB1dCA9IGFycmF5KCk7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZXhlYycgKSApIHsKCQkJCgkJCQkvLyBHZXQgdGhlIGNvbW1hbmQgcGF0aCBmb3IgdGhlIHppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1pJUF9QQVRIICk7CgkJCQkKCQkJCS8vIERldGVybWluZSBpZiB3ZSBhcmUgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aAoJCQkJaWYgKCAhZW1wdHkgKCAkemlwcGF0aCApICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkJJGNvbW1hbmQgPSAkdGhpcy0+c2xhc2hpZnkoICR6aXBwYXRoICkgLiAnemlwJzsJCgoJCQkJLy8gV2UgaGF2ZSB0byBmZWVkIHRoZSBjb21tZW50IGluIC0gdHJ5aW5nIGJ5IHBpcGUgaGVyZQoJCQkJLy8gV2UgbmVlZCB0byBwcmVwZW5kIHRoZSBjb21tZW50IGlucHV0CgkJCQkkY29tbWFuZCAuPSAiIC16ICd7JHppcF9maWxlfSciOwoJCQkJCgkJCQkvLyBOb3RlIHRoYXQgd2UgZXNjYXBlIHRoZSBjb21tZW50IGFyZyBmb3IgdGhlIHNoZWxsLi4uCgkJCQkkY29tbWFuZCAgPSAnZWNobyAnIC4gZXNjYXBlc2hlbGxhcmcoICRjb21tZW50ICkgLiAnIHwgJyAuICRjb21tYW5kOwoJCQkJCgkJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0X2NvZGUpOwoJCQkJCgkJCQkvLyBOb3RlOiB3ZSBkb24ndCBvcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGRvIHN0dWZmIGJ1dCBpdCdzIGFsbCBkb25lIGluIG9uZSBhY3Rpb24KCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJc3dpdGNoICggKGludCkgJGV4aXRfY29kZSApIHsKCQkJCQljYXNlIDA6CgkJCQkJCS8vIEhhbmRsZWQgYXJjaGl2ZSBhbmQgYXBwYXJlbnRseSBzZXQgdGhlIGNvbW1lbnQgLSBubyBmdXJ0aGVyIGFjdGlvbiByZXF1aXJlZAoJCQkJCQkJCQkJCQkJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnZXhlYyAoemlwKSBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHppcCkgZmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIHRvIHNldCBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGEgc3RyaW5nIGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIGV4ZWMgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGZ1bmN0aW9uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdleGVjIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBleGVjIGZ1bmN0aW9uIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIkNsYXNzIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYSBzdHJpbmcgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCQoJCX0KCgkJLyoJZ2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudCggJHppcF9maWxlICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmdldF9jb21tZW50X2xpbnV4KCAkemlwX2ZpbGUgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9XSU46CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5nZXRfY29tbWVudF93aW5kb3dzKCAkemlwX2ZpbGUgKTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoJCQoJCS8qCWdldF9jb21tZW50X3dpbmRvd3MoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudF93aW5kb3dzKCAkemlwX2ZpbGUgKSB7CgkJCgkJCS8vIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBidXQganVzdCBpbiBjYXNlIHJldHVybiBmYWxzZSBzaWxlbnRseQoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0KCQoJCS8qCWdldF9jb21tZW50X2xpbnV4KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byByZXRyaWV2ZSBjb21tZW50IGZyb20uCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCWZhbHNlIG9uIGZhaWx1cmUsIFppcCBjb21tZW50IG90aGVyd2lzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbW1lbnRfbGludXgoICR6aXBfZmlsZSApIHsKCgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSRjb21tZW50ID0gIiI7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCQoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2V4ZWMnICkgKSB7CgkJCQoJCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB1bnppcCBjb21tYW5kIC0gc2hvdWxkIHJldHVybiBhIHRyaW1tZWQgc3RyaW5nCgkJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEggKTsKCQkJCQoJCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoCgkJCQlpZiAoICFlbXB0eSAoICR6aXBwYXRoICkgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnVXNpbmcgYWJzb2x1dGUgdW56aXAgcGF0aDogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR6aXBwYXRoICk7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIEFkZCB0aGUgdHJhaWxpbmcgc2xhc2ggaWYgcmVxdWlyZWQKCQkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3VuemlwJzsJCgoJCQkJLy8gV2UgZXhwZWN0IHR3byBsaW5lcyBvZiBvdXRwdXQgLSB0aGUgZmlyc3Qgc2hwdWxkIGJlIHRoZSBhcmNoaXZlIG5hbWUgYW5kIHRoZSBzZWNvbmQgY29tbWVudCBpZiBwcmVzZW50CgkJCQkkY29tbWFuZCAuPSAiIC16ICd7JHppcF9maWxlfSciOwoJCQkJCgkJCQlAZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0X2NvZGUpOwoJCQkJCgkJCQkvLyBOb3RlOiB3ZSBkb24ndCBvcGVuIHRoZSBmaWxlIGFuZCB0aGVuIGRvIHN0dWZmIGJ1dCBpdCdzIGFsbCBkb25lIGluIG9uZSBhY3Rpb24KCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJc3dpdGNoICggKGludCkgJGV4aXRfY29kZSApIHsKCQkJCQljYXNlIDA6CgkJCQkJCS8vIEhhbmRsZWQgYXJjaGl2ZSBhbmQgYXBwYXJlbnRseSBnb3QgYSBjb21tZW50IHNvIHRyeSBhbmQgcHJvY2VzcyBpdAoJCQkJCQkKCQkJCQkJLy8gU2hvdWxkIGJlIG9uZSBmaWxlIHBlciBsaW5lLCBubyBtb3JlIG5vIGxlc3MKCQkJCQkJJGxpbmVfY291bnQgPSBzaXplb2YoICRvdXRwdXQgKTsKCQkJCQkJCgkJCQkJCS8vIE11c3QgaGF2ZSBhdCBsZWFzdCAyIGxpbmVzIGZvciB0aGVyZSB0byBiZSBhIG5vbi1lbXB0eSBjb21tZW50CgkJCQkJCWlmICggJGxpbmVfY291bnQgPiAxICkgewoJCQkJCQkKCQkJCQkJCS8vIFNpbXBsZSBjcml0ZXJpYSBmb3Igbm93IC0ganVzdCB0YWtlIHRoZSBmaW5hbCBsaW5lCgkJCQkJCQkvLyBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgbm8gY29tbWVudCB0aGlzIGlzIHN0aWxsIHZhbGlkIGFzIGFuIGVtcHR5IGNvbW1lbnQKCQkJCQkJCS8vIHNvIHdlIGRvbid0IHRyZWF0IHRoaXMgYXMgYW4gZXJyb3IKCQkJCQkJCS8vJGNvbW1lbnQgPSAkb3V0cHV0WyAkbGluZV9jb3VudCAtIDFdOwoJCQkJCQkJdW5zZXQoICRvdXRwdXRbMF0gKTsKCQkJCQkJCSRjb21tZW50ID0gaW1wbG9kZSggJycsICRvdXRwdXQgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnZXhlYyAodW56aXApIHJldHJpZXZlZCBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCQkKCQkJCQkJJHJlc3VsdCA9ICRjb21tZW50OwoJCQkJCQlicmVhazsKCgkJCQkJZGVmYXVsdDoKCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGl0X2NvZGU7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ2V4ZWMgKHVuemlwKSBmYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGdldCBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGEgc3RyaW5nIGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIGV4ZWMgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGZ1bmN0aW9uCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdleGVjIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBleGVjIGZ1bmN0aW9uIG5vbi1leGlzdGVudCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkvLyRyZXN1bHQgPSBhcnJheSggMSwgIkNsYXNzIG5vdCBhdmFpbGFibGUgdG8gbWF0Y2ggbWV0aG9kIiApOwoJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYSBzdHJpbmcgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCX0gLy8gZW5kIHBsdWdpbmJ1ZGR5X3piemlwZXhlYyBjbGFzcy4JCgkKfQ==
###PACKDATA,FILE_END,/lib/zipbuddy/zbzipexec.php,importbuddy/lib/zipbuddy/zbzipexec.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzippclzip.php,importbuddy/lib/zipbuddy/zbzippclzip.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwcGNsemlwIENsYXNzCiAqCiAqICBFeHRlbmRzIHRoZSB6aXAgY2FwYWJpbGl0eSBjb3JlIGNsYXNzIHdpdGggcGNsemlwIHNwZWNpZmljIGNhcGFiaWxpdHkKICoJCiAqCVZlcnNpb246IDEuMC4wCiAqCUF1dGhvcjoKICoJQXV0aG9yIFVSSToKICoKICoJQHBhcmFtCQkkcGFyZW50CQlvYmplY3QJCU9wdGlvbmFsIHBhcmVudCBvYmplY3Qgd2hpY2ggY2FuIHByb3ZpZGUgZnVuY3Rpb25zIGZvciByZXBvcnRpbmcsIGV0Yy4KICoJQHJldHVybgkJbnVsbAogKgogKi8KaWYgKCAhY2xhc3NfZXhpc3RzKCAicGx1Z2luYnVkZHlfemJ6aXBwY2x6aXAiICkgKSB7CgoJLyoqCgkgKglwbHVnaW5idWRkeV9QY2xaaXAgQ2xhc3MKCSAqCgkgKglXcmFwcGVyIGZvciBQY2xaaXAgdG8gZW5jYXBzdWxhdGUgdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyB0aGUgUGNsWmlwIGxpYnJhcnkgKGlmIG5vdAoJICoJYWxyZWFkeSBsb2FkZWQsIHdoaWNoIGl0IHNob3VsZG4ndCBiZSBnZW5lcmFsbHkpIGFuZCBhbHNvIHN1cnJvdW5kaW5nIG1ldGhvZCBjYWxscwoJICoJd2l0aCB0aGUgdW5wbGVhc2FudCB3b3JrYXJvdW5kIGZvciB0aGUgbWJzdHJpbmcgaXNzdWUgd2hlcmUgdGhpbmdzIG1heSBmYWlsIGJlY2F1c2UKCSAqCVBjbFppcCBpcyB1c2luZyBzdHJpbmcgZnVuY3Rpb25zIHRvIHByb2Nlc3MgYmluYXJ5IGRhdGEgYW5kIGlmIHRoZSBzdHJpbmcgZnVuY3Rpb25zCgkgKglhcmUgb3ZlcmxvYWRlZCB3aXRoIHRoZSBtdWx0aS1ieXRlIHZlcnNpb25zIHRoZSBwcm9jZXNzaW5nIGNhbiAocHJvYmFibHkgd2lsbCkgZmFpbC4KCSAqCgkgKglAcGFyYW0Jc3RyaW5nCSR6aXBfZmlsZW5hbWUJVGhlIG5hbWUgb2YgdGhlIHppcCBmaWxlIHRoYXQgd2lsbCBiZSBtYW5hZ2VkCgkgKglAcmV0dXJuCW51bGwKCSAqCgkgKi8KCWNsYXNzIHBsdWdpbmJ1ZGR5X1BjbFppcCB7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjcmVhdGVkIFBjbFppcCBvYmplY3QgaWYgaXQgY2FuIGJlIGNyZWF0ZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyICRfemEgCW9iamVjdAogICAgICAgICAqLwoJCXByaXZhdGUgJF96YSA9IE5VTEw7CgkJCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJVGhpcyBpcyB1c2VkIHRvIHRyeSBhbmQgbG9hZCB0aGUgUGNsWmlwIGxpYnJhcnkgYW5kIHRoZW4gY3JlYXRlIGFuIGluc3RhbmNlIG9mCgkJICoJYW4gYXJjaGl2ZSB3aXRoIHRoYXQuIElmIHRoZSBsaWJyYXJ5IGNhbm5vdCBiZSBtYWRlIGF2YWlsYWJsZSB0aGVuIGFuIGV4Y2VwdGlvbgoJCSAqCWlzIHRocm93biBhbmQgdGhhdCBpcyBoYW5kbGVkIGJ5IHRoZSBjYWxsZXIuCgkJICoJVE9ETzogQ29uc2lkZXIgaGF2aW5nIGEgInN1cHByZXNzIHdhcm5pbmdzIiBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgbWV0aG9kcwoJCSAqCXNob3VsZCBiZSBpbnZva2VkIHdpdGggd2FybmluZ3Mgc3VwcHJlc3NlZCBvciBub3QuIEZvciBpc19hdmFpbGFibGUoKSB1c2FnZSB3ZSB3b3VsZAoJCSAqCXdhbnQgdG8gc28gYXMgbm90IHRvIHBvdGVudGlhbGx5IGZsb29kIHRoZSBQSFAgZXJyb3IgbG9nLiBGb3Igb3RoZXIgZnVuY3Rpb25zIHRoYXQKCQkgKglhcmUgbm90IGNhbGxlZCBmcmVxdWVudGx5IHdlIG1pZ2h0IG5vdCB3YW50IHRvIHN1cHByZXNzIHRoZSB3YXJuaW5ncy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGVuYW1lCVRoZSBuYW1lIG9mIHRoZSB6aXAgZmlsZSB0aGF0IHdpbGwgYmUgbWFuYWdlZAoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJHppcF9maWxlbmFtZSApIHsKCQkKCQkJLy8gVGhlIFBjbFppcCBjbGFzcyBoYXMgdG8gYmUgYXZhaWxhYmxlIGZvciB1cyBzbyBsZXQncyBoYXZlIGEgZ28KCQkJLy8gTm90ZTogaXQgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2Ugbm90aGluZyB3aWxsIGJyZWFrIHdpdGhvdXQgaXQgYnV0IHRoZSBtZXRob2Qgd2lsbCAKCQkJLy8gc2ltcGx5IG5vdCBiZSBhdmFpbGFibGUKCQkJLy8gVGhpcyBtYXkgc2VlbSBsYWJvcmlvdXMgYnV0IGl0J3Mgcm9idXN0IGFnYWluc3QgaW5jbHVkZV9vbmNlIG5vdCBwbGF5aW5nIG5pY2UgaWYgdGhlCgkJCS8vIGNsYXNzIGlzIGFscmVhZHkgaW5jbHVkZWQgYW5kIHRyeWluZyB0byBpbmNsdWRlIGl0IGFnYWluCgkJCWlmICggIUBjbGFzc19leGlzdHMoICdQY2xaaXAnLCBmYWxzZSApICkgewoJCQkKCQkJCSRwb3NzaWJsZXMgPSBhcnJheSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJywgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCcgKTsKCQkJCQoJCQkJZm9yZWFjaCAoICRwb3NzaWJsZXMgYXMgJHBvc3NpYmxlKSB7CgkJCQkKCQkJCQlpZiAoIEBpc19yZWFkYWJsZSggJHBvc3NpYmxlICkgKSB7CgkJCQkJCgkJCQkJCS8vIEZvdW5kIG9uZSB0aGF0IHNob3VsZCBiZSBsb2FkYWJsZSBzbyB0cnkgaXQgYW5kIHRoZW4gYnJlYWsgb3V0CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1BDTFppcCBjbGFzcyBub3QgZm91bmQuIEF0dGVtcHRpbmcgdG8gbG9hZCBmcm9tIGAnIC4gJHBvc3NpYmxlIC4gJ2AuJyApOwoJCQkJCQlAaW5jbHVkZV9vbmNlKCAkcG9zc2libGUgKTsKCQkJCQkJYnJlYWs7CgkJCQkJCQkJCQkKCQkJCQl9IAoJCQkJCgkJCQl9CgoJCQl9CgkJCQoJCQkvLyBCeSBub3cgUGNsWmlwIF9zaG91bGRfIGJlIGF2YWlsYWJsZSBzbyBsZXQncyBzZWUuLi4KCQkJaWYgKCBAY2xhc3NfZXhpc3RzKCAnUGNsWmlwJywgZmFsc2UgKSApIHsKCQkJCgkJCQkvLyBJdCdzIGF2YWlsYWJsZSBzbyBjcmVhdGUgdGhlIHByaXZhdGUgaW5zdGFuY2UKCQkJCSR0aGlzLT5femEgPSBuZXcgUGNsWmlwKCAkemlwX2ZpbGVuYW1lICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBOb3QgYXZhaWxhYmxlIHNvIHRocm93IHRoZSBleGNlcHRpb24gZm9yIHRoZSBjYWxsZXIgdG8gaGFuZGxlCgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCAnUGNsWmlwIGNsYXNzIGRvZXMgbm90IGV4aXN0LicgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgewoJCQoJCQlpZiAoIE5VTEwgIT0gJHRoaXMtPl96YSApIHsgdW5zZXQgKCAkdGhpcy0+X3phICk7IH0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19jYWxsKCkKCQkgKgkKCQkgKglNYWdpYyBtZXRob2QgaW50ZXJjZXB0aW5nIGNhbGxzIHRvIHVua25vd24gbWV0aG9kcy4gVGhpcyBhbGxvd3MgdXMgdG8gaW50ZXJjZXB0CgkJICoJYWxsIG1ldGhvZCBjYWxscyBhbmQgYWRkIGFkZGl0aW9uYWwgcHJvY2Vzc2luZwoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRtZXRob2QJCVRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QKCQkgKglAcGFyYW0JCWFycmF5CSRhcmd1bWVudHMJQXJyYXkgb2YgdGhlIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZCBjYWxsCgkJICoJQHJldHVybgkJbWl4ZWQJJHJlc3VsdAkJV2hhdGV2ZXIgdGhlIGludm9rZWQgd3JhcHBlciBtZXRob2QgY2FsbCByZXR1cm5zCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19jYWxsKCAkbWV0aG9kLCAkYXJndW1lbnRzICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCS8vIFNlZSAjMTU3ODkgLSBQY2xaaXAgdXNlcyBzdHJpbmcgZnVuY3Rpb25zIG9uIGJpbmFyeSBkYXRhCgkJCS8vIElmIGl0J3Mgb3ZlcmxvYWRlZCB3aXRoIE11bHRpYnl0ZSBzYWZlIGZ1bmN0aW9ucyB0aGUgcmVzdWx0cyBhcmUgaW5jb3JyZWN0LgoJCQlpZiAoIEBpbmlfZ2V0KCAnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcgKSAmJiBAZnVuY3Rpb25fZXhpc3RzKCAnbWJfaW50ZXJuYWxfZW5jb2RpbmcnICkgKSB7CgkJCQoJCQkJJHByZXZpb3VzX2VuY29kaW5nID0gQG1iX2ludGVybmFsX2VuY29kaW5nKCk7CgkJCQlAbWJfaW50ZXJuYWxfZW5jb2RpbmcoICdJU08tODg1OS0xJyApOwoJCQkJCgkJCX0KCQkKCQkJJHJlc3VsdCA9IEBjYWxsX3VzZXJfZnVuY19hcnJheSggYXJyYXkoICR0aGlzLT5femEsICRtZXRob2QgKSwgJGFyZ3VtZW50cyApOwoJCQkKCQkJLy8gTm93IHVuZG8gYW55IGNoYW5nZSB3ZSBtYXkgaGF2ZSBtYWRlIHRvIHRoZSBlbmNvZGluZwoJCQlpZiAoIGlzc2V0KCAkcHJldmlvdXNfZW5jb2RpbmcgKSApIHsKCQkJCgkJCQlAbWJfaW50ZXJuYWxfZW5jb2RpbmcoICRwcmV2aW91c19lbmNvZGluZyApOwoJCQkJdW5zZXQoICRwcmV2aW91c19lbmNvZGluZyApOwoKCQkJfQoJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkKCQl9CgkKCX0KCgljbGFzcyBwbHVnaW5idWRkeV96YnppcHBjbHppcCBleHRlbmRzIHBsdWdpbmJ1ZGR5X3piemlwY29yZSB7CgkKCQkvLyBDb25zdGFudHMgZm9yIGZpbGUgaGFuZGxpbmcKCQljb25zdCBaSVBfRVJST1JTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfcGNsemlwX2Vycm9ycy50eHQnOwoJCWNvbnN0IFpJUF9XQVJOSU5HU19GSUxFX05BTUUgPSAnbGFzdF9wY2x6aXBfd2FybmluZ3MudHh0JzsKCQljb25zdCBaSVBfT1RIRVJTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfcGNsemlwX290aGVycy50eHQnOwoJCWNvbnN0IFpJUF9DT05URU5UX0ZJTEVfTkFNRSAgPSAnbGFzdF9wY2x6aXBfbGlzdC50eHQnOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIG1ldGhvZCB0YWcgdXNlZCB0byByZWZlciB0byB0aGUgbWV0aG9kIGFuZCBlbnRpdGllcyBhc3NvY2lhdGVkIHdpdGggaXQgc3VjaCBhcyBjbGFzcyBuYW1lCiAgICAgICAgICogCiAgICAgICAgICogQHZhciAkX21ldGhvZF90YWcgCXN0cmluZwogICAgICAgICAqLwoJCXB1YmxpYyBzdGF0aWMgJF9tZXRob2RfdGFnID0gJ3BjbHppcCc7CgkJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyByZWdhcmRlZCBhcyBhICJjb21wYXRpYmlsaXR5IiBtZXRob2QKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgPSB0cnVlOwoJCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHRlbGxzIHVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtZXRob2Qgc28gdGhleSBjYW4gYmUgY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXRob2QgY2FuIGJlIHN1cHBvcnRlZAogICAgICAgICAqIE5vdGU6IFBjbFppcCBjb25zdHJ1Y3RvciBjaGVja3MgZm9yIGd6b3BlbiBmdW5jdGlvbiBhbmQgZGllcyBvbiBmYWlsdXJlIHNvIHdlIG1heSBhcyB3ZWxsIHByZS1lbXB0IHRoYXQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5CiAgICAgICAgICovCgkJcHVibGljIHN0YXRpYyAkX21ldGhvZF9kZXBlbmRlbmNpZXMgPSBhcnJheSggJ2NsYXNzZXMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnZnVuY3Rpb25zJyA9PiBhcnJheSggJ2d6b3BlbicgKSwKCQkJCQkJCQkJCQkgIAkJICdleHRlbnNpb25zJyA9PiBhcnJheSggKSwKCQkJCQkJCQkJCQkgIAkJICdmaWxlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdjaGVja19mdW5jJyA9PiAnY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMnCgkJCQkJCQkJCQkJCQkpOwoJCQkKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBzdGF0aWMgbWV0aG9kIHRhZyBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlzdHJpbmcJVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X21ldGhvZF90YWdfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9tZXRob2RfdGFnOwoJCQkKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZF9zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBjb21wYXRpYmlsaXR5IG1ldGhvZCBpbmRpY2F0b3IgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYm9vbAlUcnVlIGlmIGlzIGEgY29tcGF0aWJpbGl0eSBtZXRob2QKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJfQoKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBtZXRob2QgZGVwZW5kZW5jaWVzIGFycmF5IGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWFycmF5CVRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlcXVpcmVzIHRvIGJlIGEgc3VwcG9ydGVkIG1ldGhvZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX21ldGhvZF9kZXBlbmRlbmNpZXM7CgkJfQoKCQkvKioKCQkgKiAKCQkgKiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpCgkJICoKCQkgKiBBbGxvd3MgYWRkaXRpb25hbCBtZXRob2QgZGVwZW5kZW5jeSBjaGVja3MgYmV5b25kIHRoZSBzdGFuZGFyZCBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlib29sCVRydWUgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmN5IGNoZWNrcyBwYXNzZWQKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCS8vIE5lZWQgdG8gdmVyaWZ5IHRoYXQgYXQgbGVhc3QgUGNsWmlwIHNob3VsZCBiZSBhdmFpbGFibGUgdG8gYmUgbG9hZGVkIChidXQgd2UKCQkJLy8gZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBsb2FkIGl0IGhlcmUpCgkJCSRwb3NzaWJsZXMgPSBhcnJheSggQUJTUEFUSCAuICd3cC1hZG1pbi9pbmNsdWRlcy9jbGFzcy1wY2x6aXAucGhwJywgcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9wY2x6aXAvcGNsemlwLnBocCcgKTsKCQkJCgkJCWZvcmVhY2ggKCAkcG9zc2libGVzIGFzICRwb3NzaWJsZSkgewoJCQkKCQkJCWlmICggQGlzX3JlYWRhYmxlKCAkcG9zc2libGUgKSApIHsKCQkJCQoJCQkJCS8vIEZvdW5kIG9uZSB0aGF0IHNob3VsZCBiZSBsb2FkYWJsZSBzbyBicmVhayBvdXQKCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCQkJCQkJCgkJCQl9IAoJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcGFyYW0JCXJlZmVyZW5jZQkmJHBhcmVudAkJW29wdGlvbmFsXSBSZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0dXMoKSBmdW5jdGlvbiBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAmJHBhcmVudCA9IE5VTEwgKSB7CgoJCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAkcGFyZW50ICk7CgkJCQoJCQkvLyBPdmVycmlkZSBzb21lIG9mIHBhcmVudCBkZWZhdWx0cwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSwKCQkJCQkJCQkJCQkJCQkJYXJyYXkoICduYW1lJyA9PiAnUGNsWmlwIE1ldGhvZCcsCgkJCQkJCQkJCQkJCQkgIAkJCSAgICdjb21wYXRpYmlsaXR5JyA9PiBwbHVnaW5idWRkeV96YnppcHBjbHppcDo6JF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCApCgkJCQkJCQkJCQkJCQkgIAkgICApOwoKCQkJLy8gTm8gcmVsZXZhbnQgcGFyYW1ldGVycyBmb3IgdGhpcyBtZXRob2QKCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdID0gYXJyYXkoKTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCV9fZGVzdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgZGVzdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCggKSB7CgkJCgkJCXBhcmVudDo6X19kZXN0cnVjdCgpOwoKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X21ldGhvZF90YWcoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIG1ldGhvZCB0YWcKCQkgKgkKCQkgKglAcmV0dXJuCQlzdHJpbmcgVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX3RhZygpIHsKCQkKCQkJcmV0dXJuIHBsdWdpbmJ1ZGR5X3piemlwcGNsemlwOjokX21ldGhvZF90YWc7CgkJCQoJCX0KCQkKCQkJLyoqCgkJICoJZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSAoc3RhdGljKSBpc19jb21wYXRpYmlsaXR5X21ldGhvZCBib29sZWFuCgkJICoJCgkJICoJQHJldHVybgkJYm9vbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpIHsKCQkKCQkJcmV0dXJuIHBsdWdpbmJ1ZGR5X3piemlwcGNsemlwOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJaXNfYXZhaWxhYmxlKCkKCQkgKgkKCQkgKglBIGZ1bmN0aW9uIHRoYXQgdGVzdHMgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHNwZWNpZmljIG1ldGhvZCBhbmQgaXRzIGF2YWlsYWJsZSBtb2Rlcy4gV2lsbCB0ZXN0IGZvcgoJCSAqICBtdWx0aXBsZSBtb2RlcyAoemlwICYgdW56aXApIGFuZCBvbmx5IHJldHVybiBmYWxzZSBpZiBuZWl0aGVyIGlzIGF2YWlsYWJsZS4gQWN0dWFsIGF2YWlsYWJsZSBtb2RlcyB3aWxsCgkJICogIGJlIGluZGljYXRlZCBpbiB0aGUgbWV0aG9kIGF0dHJpYnV0ZXMuCgkJICoKCQkgKiAgTm90ZTogaW4gdGhpcyBjYXNlIGFzIHRoZSB6aXAgYW5kIHVuemlwIGNhcGFiaWxpdGllcyBhcmUgYWxsIHdyYXBwZWQgdXAgaW4gdGhlIHNhbWUgY2xhc3MgdGhlbiBpZiB3ZQoJCSAqICBjYW4gemlwIHRoZW4gd2UnbGwgYXNzdW1lIChmb3Igbm93KSB0aGF0IHdlIGNhbiB1bnppcCBhcyB3ZWxsIHNvIGF0dHJpYnV0ZXMgYXJlIHNldCBhY2NvcmRpbmdseS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcglUZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSBmb3IgYW55IHRlc3QgZmlsZXMgKG11c3QgYmUgd3JpdGVhYmxlKQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3Qgb25lIG1vZGUsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGlzX2F2YWlsYWJsZSggJHRlbXBkaXIgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCgkJCSR0ZXN0X2ZpbGUgPSAkdGVtcGRpciAuICd0ZW1wX3Rlc3RfJyAuIHVuaXFpZCgpIC4gJy56aXAnOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9QY2xaaXAoICR0ZXN0X2ZpbGUgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgdGVzdCBGQUlMRUQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJaWYgKCAkemEtPmNyZWF0ZSggX19GSUxFX18gLCBQQ0xaSVBfT1BUX1JFTU9WRV9QQVRILCBkaXJuYW1lKCBfX0ZJTEVfXykgICkgIT09IDAgKSB7CgkJCQkJCQoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCWlmICggIUB1bmxpbmsoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ0Vycm9yICM1NjQ2MzQuIFVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcykhJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHRlc3RfZmlsZSApICk7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBUaGUgemlwIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAtIGltcGxpZXMgY2FuIHppcCBhbmQgdW56aXAgYW5kIGhlbmNlIGFyY2hpdmUsIGNoZWNrIGFuZCBsaXN0CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfemlwcGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bnppcHBlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfYXJjaGl2ZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NoZWNrZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2xpc3RlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bmFyY2hpdmVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19leHRyYWN0b3InIF0gPSB0cnVlOwoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUGNsWmlwIHRlc3QgUEFTU0VELicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BjbFppcCB0ZXN0IEZBSUxFRDogWmlwIGZpbGUgbm90IGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUGNsWmlwIHRlc3QgRkFJTEVEOiBVbmFibGUgdG8gY3JlYXRlL29wZW4gemlwIGZpbGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1BjbFppcCBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCSAgCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQoJCSAgCQoJCSAgCXJldHVybiAkcmVzdWx0OwoJCSAgCQoJCX0KCQkKCQkvKioKCQkgKgljcmVhdGUoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZQoJCSAqCQoJCSAqCVRoZSAkZXhjbHVkZXMgd2lsbCBiZSBhIGxpc3Qgb3IgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBpZiB0aGUgJGxpc3RtYWtlciBvYmplY3QgaXMgTlVMTCBvdGVocndpc2UKCQkgKgl3aWxsIGJlIGFic29sdXRlIHBhdGggZXhjbHVkZXMgYW5kIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgY2FuIGJlIGhhZCBmcm9tIHRoZSAkbGlzdG1ha2VyIG9iamVjdAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXAJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgQXJjaGl2ZSBmaWxlIHRvIGNyZWF0ZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRkaXIJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtZQkJYXJyYXkJJGV4Y2x1ZGVzCQlMaXN0IG9mIGVpdGhlciBhYnNvbHV0ZSBwYXRoIGV4Y2x1c2lvbnMgb3IgcmVsYXRpdmUgZXhjbHVzaW9ucwoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcGFyYW0JCW9iamVjdAkkbGlzdG1ha2VyCQlUaGUgb2JqZWN0IGZyb20gd2hpY2ggd2UgY2FuIGdldCBhbiBpbmNsdXNpb25zIGxpc3QKCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gY3JlYXRlKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyID0gTlVMTCApIHsKCQkKCQkJJHphID0gTlVMTDsKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkZXhpdGNvZGUgPSAwOwoJCQkkemlwX291dHB1dCA9IGFycmF5KCk7CgkJCSR0ZW1wX3ppcCA9ICcnOwoJCQkkZXhjbHVkaW5nX2FkZGl0aW9uYWwgPSBmYWxzZTsKCQkJJGV4Y2x1ZGVfY291bnQgPSAwOwoJCQkkZXhjbHVzaW9ucyA9IGFycmF5KCk7CgkJCSR0ZW1wX2ZpbGVfY29tcHJlc3Npb25fdGhyZXNob2xkID0gNTsKCQkJJHByZV9hZGRfZnVuYyA9ICcnOwoJCQkkaGF2ZV96aXBfZXJyb3JzID0gZmFsc2U7CgkJCSR6aXBfZXJyb3JzX2NvdW50ID0gMDsKCQkJJHppcF9lcnJvcnMgPSBhcnJheSgpOwoJCQkkaGF2ZV96aXBfd2FybmluZ3MgPSBmYWxzZTsKCQkJJHppcF93YXJuaW5nc19jb3VudCA9IDA7CgkJCSR6aXBfd2FybmluZ3MgPSBhcnJheSgpOwoJCQkkaGF2ZV96aXBfYWRkaXRpb25zID0gZmFsc2U7CgkJCSR6aXBfYWRkaXRpb25zX2NvdW50ID0gMDsKCQkJJHppcF9hZGRpdGlvbnMgPSBhcnJheSgpOwoJCQkkaGF2ZV96aXBfZGVidWcgPSBmYWxzZTsKCQkJJHppcF9kZWJ1Z19jb3VudCA9IDA7CgkJCSR6aXBfZGVidWcgPSBhcnJheSgpOwoJCQkkaGF2ZV96aXBfb3RoZXIgPSBmYWxzZTsKCQkJJHppcF9vdGhlcl9jb3VudCA9IDA7CgkJCSR6aXBfb3RoZXIgPSBhcnJheSgpOwoJCQkkemlwX2lnbm9yaW5nX3N5bWxpbmtzID0gZmFsc2U7CgkJCSRzeW1saW5rc19mb3VuZCA9IGFycmF5KCk7CgkJCQoJCQkvLyBUaGUgYmFzZWRpciBtdXN0IGhhdmUgYSB0cmFpbGluZyBub3JtYWxpemVkIGRpcmVjdG9yeSBzZXBhcmF0b3IKCQkJJGJhc2VkaXIgPSAoIHJ0cmltKCB0cmltKCAkZGlyICksIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgKSAuIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkKCQkJLy8gTm9ybWFsaXplIHBsYXRmb3JtIHNwZWNpZmljIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGluIHBhdGgKCQkJJGJhc2VkaXIgPSBzdHJfcmVwbGFjZSggRElSRUNUT1JZX1NFUEFSQVRPUiwgc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SLCAkYmFzZWRpciApOwoJCQkKCQkJLy8gRW5zdXJlIG5vIHN0YWxlIGZpbGUgaW5mb3JtYXRpb24KCQkJY2xlYXJzdGF0Y2FjaGUoKTsKCQkJCgkJCS8vIE5vdGU6IGNvdWxkIGVuZm9yY2UgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBmb3Igcm9idXN0bmVzcwoJCQlpZiAoIGVtcHR5KCAkdGVtcGRpciApIHx8ICFmaWxlX2V4aXN0cyggJHRlbXBkaXIgKSApIHsKCQkJCgkJCQkvLyBUaGlzIGJyZWFrcyB0aGUgcnVsZSBvZiBzaW5nbGUgcG9pbnQgb2YgZXhpdCAoYXQgZW5kKSBidXQgaXQncyBlYXJseSBlbm91Z2ggdG8gbm90IGJlIGEgcHJvYmxlbQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5IG11c3QgYmUgYXZhaWxhYmxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnVXNpbmcgQ29tcGF0aWJpbGl0eSBNb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnSWYgeW91ciBiYWNrdXAgdGltZXMgb3V0IGluIENvbXBhdGliaWxpdHkgTW9kZSB0cnkgZGlzYWJsaW5nIHppcCBjb21wcmVzc2lvbiBpbiBTZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQkvLyBVcGRhdGUgdGhlIGRlZmluaXRpb24gYmVmb3JlIGl0IGlzIHVzZWQgYnkgbG9hZGluZyB0aGUgbGlicmFyeQoJCQkvLyBUaGlzIHdpbGwgbm90IHdvayBpZiBwZXJjaGFuY2UgdGhlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgOi0oCgkJCWRlZmluZSggJ1BDTFpJUF9URU1QT1JBUllfRElSJywgJHRlbXBkaXIgKTsKCQkJCgkJCS8vIERlY2lkZSB3aGV0aGVyIHdlIGFyZSBvZmZlcmluZyBleGNsdXNpb25zIG9yIG5vdAoJCQkvLyBOb3RlIHRoYXQgdW5saWtlIHByb2MgYW5kIHppcCB3ZSBhbHdheXMgdXNlIGluY2x1c2lvbiBpZiBhdmFpbGFibGUgdG8gb2ZmZXIgZXhjbHVzaW9uIGNhcGFiaWxpdHkgZm9yIHBjbHppcAoJCQlpZiAoIGlzX29iamVjdCggJGxpc3RtYWtlciApICkgewoJCQkJCgkJCQkvLyBOZWVkIHRvIGdldCB0aGUgcmVsYXRpdmUgZXhjbHVzaW9ucyBzbyB3ZSBjYW4gbG9nIHdoYXQgaXMgYmVpbmcgZXhjbHVkZWQuLi4KCQkJCSRleGNsdXNpb25zID0gJGxpc3RtYWtlci0+Z2V0X3JlbGF0aXZlX2V4Y2x1ZGVzKCAkYmFzZWRpciApOwoJCQkJCgkJCQkvLyBCdWlsZCB0aGUgZXhjbHVzaW9uIGxpc3QgLSBmaXJzdCB0aGUgcmVsYXRpdmUgZGlyZWN0b3JpZXMKCQkJCWlmICggY291bnQoICRleGNsdXNpb25zICkgPiAwICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnQ2FsY3VsYXRpbmcgZGlyZWN0b3JpZXMvZmlsZXMgdG8gZXhjbHVkZSBmcm9tIGJhY2t1cCAocmVsYXRpdmUgdG8gc2l0ZSByb290KS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCgkJCQkJZm9yZWFjaCAoICRleGNsdXNpb25zIGFzICRleGNsdWRlICkgewoJCQkJCQoJCQkJCQlpZiAoICFzdHJzdHIoICRleGNsdWRlLCAnYmFja3VwYnVkZHlfYmFja3VwcycgKSApIHsKCQoJCQkJCQkJLy8gU2V0IHZhcmlhYmxlIHRvIHNob3cgd2UgYXJlIGV4Y2x1ZGluZyBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIGJlc2lkZXMgYmFja3VwIGRpci4KCQkJCQkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IHRydWU7CgkJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGNsdWRpbmcnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRleGNsdWRlICk7CgkJCQkJCQoJCQkJCQkkZXhjbHVkZV9jb3VudCsrOwoJCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoJCQkJCgkJCQkKCQkJCWlmICggdHJ1ZSA9PT0gJGV4Y2x1ZGluZ19hZGRpdGlvbmFsICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ0V4Y2x1ZGluZyBhcmNoaXZlcyBkaXJlY3RvcnkgYW5kIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgZGVmaW5lZCBpbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyAnIC4gJGV4Y2x1ZGVfY291bnQgLiAnICcgLiBfXyggJ3RvdGFsJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcuJyApOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oICdPbmx5IGV4Y2x1ZGluZyBhcmNoaXZlcyBkaXJlY3RvcnkgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgJyAuICRleGNsdWRlX2NvdW50IC4gJyAnIC4gX18oICd0b3RhbCcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnLicgKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGdldCB0aGUgbGlzdCBmcm9tIHRoZSB0b3Agbm9kZQoJCQkJJHRoZV9saXN0ID0gJGxpc3RtYWtlci0+Z2V0X3Rlcm1pbmFscygpOwoJCQkJCgkJCQkvLyBSZXRhaW4gdGhpcyBmb3IgcmVmZXJlbmNlIGZvciBub3cKCQkJCS8vZmlsZV9wdXRfY29udGVudHMoICggZGlybmFtZSggJHRlbXBkaXIgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzZWxmOjpaSVBfQ09OVEVOVF9GSUxFX05BTUUgKSwgcHJpbnRfciggJHRoZV9saXN0LCB0cnVlICkgKTsKCQkJCgkJCX0gZWxzZSB7CgkJCgkJCQkvLyBXZSBkb24ndCBoYXZlIHRoZSBpbmNsdXNpb24gbGlzdCBzbyB3ZSBhcmUgbm90IG9mZmVyaW5nIGV4Y2x1c2lvbnMKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ1dBUk5JTkc6IERpcmVjdG9yeS9maWxlIGV4Y2x1c2lvbiB1bmF2YWlsYWJsZSBpbiBDb21wYXRpYmlsaXR5IE1vZGUuIEV2ZW4gZXhpc3Rpbmcgb2xkIGJhY2t1cHMgd2lsbCBiZSBiYWNrZWQgdXAuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJJHRoZV9saXN0ID0gYXJyYXkoICRkaXIgKTsKCQkJCgkJCX0KCQkKCQkJLy8gR2V0IHN0YXJ0ZWQgd2l0aCBvdXQgemlwIG9iamVjdAoJCQkvLyBQdXQgb3VyIGZpbmFsIHppcCBmaWxlIGluIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IC0gaXQgd2lsbCBiZSBtb3ZlZCBsYXRlcgoJCQkkdGVtcF96aXAgPSAkdGVtcGRpciAuIGJhc2VuYW1lKCAkemlwICk7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfUGNsWmlwKCAkdGVtcF96aXAgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHBjbHppcCBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCgkJCQkvLyBCYXNpYyBhcmd1bWVudCBsaXN0CgkJCQkkYXJndW1lbnRzID0gYXJyYXkoKTsKCQkJCWFycmF5X3B1c2goICRhcmd1bWVudHMsICR0aGVfbGlzdCApOwoJCQkJYXJyYXlfcHVzaCggJGFyZ3VtZW50cywgUENMWklQX09QVF9SRU1PVkVfUEFUSCwgJGRpciApOwkJCQkKCgkJCQlpZiAoIHRydWUgIT09ICR0aGlzLT5nZXRfY29tcHJlc3Npb24oKSApIHsKCQkJCQoJCQkJCS8vIE5vdGU6IGRvbid0IG5lZWQgdG8gZm9yY2UgdXNlIG9mIHRlbXBvcmFyeSBmaWxlcyBmb3IgY29tcHJlc3Npb24KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBjb21wcmVzc2lvbiBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJYXJyYXlfcHVzaCggJGFyZ3VtZW50cywgUENMWklQX09QVF9OT19DT01QUkVTU0lPTiApOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQoJCQkJCS8vIE5vdGU6IGZvcmNlIHRoZSB1c2Ugb2YgdGVtcG9yYXJ5IGZpbGVzIGZvciBjb21wcmVzc2lvbiB3aGVuIGZpbGUgc2l6ZSBleGNlZWRzIGdpdmVuIHZhbHVlLgoJCQkJCS8vIFRoaXMgb3Zlci1yaWRlcyB0aGUgImF1dG8tc2Vuc2UiIHdoaWNoIGlzIGJhc2VkIG9uIG1lbW9yeV9saW1pdCBhbmQgdGhpcyBfbWF5XyBpbmRpY2F0ZSBhCgkJCQkJLy8gbWVtb3J5IGF2YWlsYWJpbGl0eSB0aGF0IGlzIGhpZ2hlciB0aGFuIHJlYWxpdHkgbGVhZGluZyB0byBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIGlmCgkJCQkJLy8gdHJ5aW5nIHRvIGNvbXByZXNzIGxhcmdlIGZpbGVzLiBTZXQgdGhlIHRocmVzaG9sZCBsb3cgZW5vdWdoIChzcGVjaWZ5IGluIE1CKSBzbyB0aGF0IGV4Y2VwdCBpbgoJCQkJCS8vIFRoZSB0aWdodGVzdCBtZW1vcnkgc2l0dWF0aW9ucyB3ZSBzaG91bGQgYmUgb2suIENvdWxkIGhhdmUgb3B0aW9uIHRvIGZvcmNlIHVzZSBvZiB0ZW1wb3JhcnkKCQkJCQkvLyBmaWxlcyByZWdhcmRsZXNzLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGNvbXByZXNzaW9uIGVuYWJsZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCWFycmF5X3B1c2goICRhcmd1bWVudHMsIFBDTFpJUF9PUFRfVEVNUF9GSUxFX1RIUkVTSE9MRCwgJHRlbXBfZmlsZV9jb21wcmVzc2lvbl90aHJlc2hvbGQgKTsKCQkJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIENoZWNrIGlmIGlnbm9yaW5nIChub3QgZm9sbG93aW5nKSBzeW1saW5rcwoJCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV9zeW1saW5rcygpICkgewoJCQkKCQkJCQkvLyBXYW50IHRvIG5vdCBmb2xsb3cgc3ltbGlua3Mgc28gc2V0IGZsYWcgZm9yIGxhdGVyIHVzZQoJCQkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSB0cnVlOwoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gc3ltYm9saWMgbGlua3Mgd2lsbCBiZSBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQl9IGVsc2UgewoJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyB3aWxsIG5vdCBiZSBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCQl9CgkJCQoJCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIGlnbm9yaW5nIHdhcm5pbmdzIC0gbWVhbmluZyBjYW4gc3RpbGwgZ2V0IGEgYmFja3VwIGV2ZW4KCQkJCS8vIGlmLCBlLmcuLCBzb21lIGZpbGVzIGNhbm5vdCBiZSByZWFkCgkJCQlpZiAoIHRydWUgPT09ICR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKSB7CgkJCQkKCQkJCQkvLyBOb3RlOiB3YXJuaW5ncyBhcmUgYmVpbmcgaWdub3JlZCBidXQgd2lsbCBzdGlsbCBiZSBnYXRoZXJlZCBhbmQgbG9nZ2VkCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwIGFyY2hpdmUgY3JlYXRpb24gYWN0aW9uYWJsZSB3YXJuaW5ncyB3aWxsIGJlIGlnbm9yZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGFjdGlvbmFibGUgd2FybmluZ3Mgd2lsbCBub3QgYmUgaWdub3JlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQkJfQoJCQkJCgkJCQkvLyBVc2UgYW5vbnltb3VzIGZ1bmN0aW9uIHRvIHdlZWQgb3V0IHRoZSB1bnJlYWRhYmxlIGFuZCBub24tZXhpc3RlbnQgZmlsZXMgKGNvbW1vbiByZWFzb24gZm9yIGZhaWx1cmUpCgkJCQkvLyBhbmQgcG9zc2libHkgc3ltbGlua3MgYmFzZWQgb24gdXNlciBzZXR0aW5ncy4KCQkJCS8vIFBjbFppcCB3aWxsIHJlY29yZCB0aGVzZSBmaWxlcyBhcyAnc2tpcHBlZCcgaW4gdGhlIGZpbGUgc3RhdHVzIGFuZCB3ZSBjYW4gcG9zdC1wcm9jZXNzIHRvIGRldGVybWluZQoJCQkJLy8gaWYgd2UgaGFkIGFueSBvZiB0aGVzZSBhbmQgaGVuY2UgZWl0aGVyIHN0b3AgdGhlIGJhY2t1cCBvciBjb250aW51ZSBkZXBlbmRlbnQgb24gd2hldGhlciB0aGUgdXNlcgoJCQkJLy8gaGFzIGNob3NlbiB0byBpZ25vcmUgd2FybmluZ3Mgb3Igbm90IGFuZC9vciBpZ25vcmUgc3ltbGlua3Mgb3Igbm90LgoJCQkJLy8gVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgZGlyZWN0bHkgdGFnIHRoZSBmaWxlIHdpdGggdGhlIHJlYXNvbiB3aHkgaXQgaGFzIGJlZW4gc2tpcHBlZCBzbyB3aGVuIHdlCgkJCQkvLyBoYXZlIHRvIHByb2Nlc3MgdGhlIHNraXBwZWQgaXRlbXMgd2UgaGF2ZSB0byB0cnkgYW5kIHdvcmsgb3V0IHdoeSBpdCB3YXMgc2tpcHBlZCAtIGJ1dCBzaG91bGRuJ3QKCQkJCS8vIGJlIHRvbyBoYXJkLgoJCQkJLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHRoaXMgaW50byB0aGUgUGNsWmlwIHdyYXBwZXIgYW5kIGhhdmUgYSBtZXRob2QgdG8gc2V0IHRoZSB2YXJpb3VzIHByZS9wb3N0CgkJCQkvLyBmdW5jdGlvbnMgb3Igc2VsZWN0IHByZWRlZmluZWQgZnVuY3Rpb25zIChzdWNoIGFzIHRoaXMpLgoJCQkJaWYgKCB0cnVlICkgewoJCQkJCgkJCQkJLy8gTm90ZTogVGhpcyBjb3VsZCBiZSBzaW1wbGlmaWVkIC0gaXQncyB3cml0dGVuIHRvIGJlIGV4dGVuc2libGUgYnV0IG1heSBub3QgbmVlZCB0byBiZQoJCQkJCSRhcmdzID0gJyRldmVudCwgJiRoZWFkZXInOwoJCQkJCSRjb2RlID0gJyc7CgkJCQkJJGNvZGUgLj0gJ3N0YXRpYyAkc3ltbGlua3MgPSBhcnJheSgpOyAnOwoJCQkJCSRjb2RlIC49ICckcmVzdWx0ID0gdHJ1ZTsgJzsKCQkJCQkKCQkJCQkvLyBIYW5kbGUgc3ltbGlua3MgLSBrZWVwIHRoZSB0d28gY2FzZXMgb2YgaWdub3Jpbmcvbm90LWlnbm9yaW5nIHNlcGFyYXRlIGZvciBub3cgdG8gbWFrZSBsb2dpYyBtb3JlCgkJCQkJLy8gYXBwYXJlbnQgLSBidXQgY291bGQgYmUgbWVyZ2VkIHdpdGggZGlmZmVyZW50IGNvbmRpdGlvbmFsIGhhbmRsaW5nCgkJCQkJLy8gRm9yIGEgdmFsaWQgc3ltbGluazogaXNfbGluaygpIC0+IHRydWU7IGlzX2ZpbGUoKS9pc19kaXIoKSAtPiB0cnVlOyBmaWxlX2V4aXN0cygpIC0+IHRydWUKCQkJCQkvLyBGb3IgYSBicm9rZW4gc3ltbGluazogaXNfbGluaygpIC0+IHRydWU7IGlzX2ZpbGUoKS9pc19kaXIoKSAtPiBmYWxzZTsgZmlsZV9leGlzdHMoKSAtPiBmYWxzZQoJCQkJCS8vIE5vdGU6IHBjbHppcCBmaXJzdCB0ZXN0cyBldmVyeSBmaWxlIHVzaW5nIGZpbGVfZXhpc3RzKCkgYmVmb3JlIGV2ZXIgdHJ5aW5nIHRvIGFkZCB0aGUgZmlsZSBzbwoJCQkJCS8vIGZvciBhIGJyb2tlbiBzeW1saW5rIGl0IHdpbGwgX2Fsd2F5c18gZXJyb3Igb3V0IGltbWVkaWF0ZWx5IGl0IGRpc2NvdmVycyBhIGJyb2tlbiBzeW1saW5rIHNvCgkJCQkJLy8gd2UgbmV2ZXIgaGF2ZSBhIGNoYW5jZSB0byBmaWx0ZXIgdGhlc2Ugb3V0IGF0IHRoaXMgc3RhZ2UuCgkJCQkJaWYgKCB0cnVlID09PSAkemlwX2lnbm9yaW5nX3N5bWxpbmtzICkgewoJCQkJCQoJCQkJCQkvLyBJZiBpdCdzIGEgc3ltbGluayBvciBpdCdzIG5laXRoZXIgYSBmaWxlIG5vciBhIGRpcmVjdG9yeSB0aGVuIGlnbm9yZSBpdC4gQSBicm9rZW4gc3ltbGluawoJCQkJCQkvLyB3aWxsIG5ldmVyIGdldCB0aGlzIGZhciBiZWNhdXNlIHBjbHppcCB3aWxsIGhhdmUgY2hva2VkIG9uIGl0CgkJCQkJCSRjb2RlIC49ICdpZiAoICggdHJ1ZSA9PT0gJHJlc3VsdCApICYmICEoIEBpc19saW5rKCAkaGVhZGVyW1wnZmlsZW5hbWVcJ10gKSApICkgeyAnOwoJCQkJCQkkY29kZSAuPSAnICAgIGlmICggQGlzX2ZpbGUoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApIHx8IEBpc19kaXIoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApICkgeyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICAgICAkcmVzdWx0ID0gdHJ1ZTsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAgICAgZm9yZWFjaCAoICRzeW1saW5rcyBhcyAkcHJlZml4ICkgeyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICAgICAgICAgaWYgKCAhKCBmYWxzZSA9PT0gc3RycG9zKCAkaGVhZGVyW1wnZmlsZW5hbWVcJ10sICRwcmVmaXggKSApICkgeyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICAgICAgICAgICAgICRyZXN1bHQgPSBmYWxzZTsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAgICAgICAgICAgICBicmVhazsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAgICAgICAgICB9ICc7CgkJCQkJCSRjb2RlIC49ICcgICAgICAgIH0gJzsKCQkJCQkJJGNvZGUgLj0gJyAgICB9IGVsc2UgeyAnOwovLwkJCQkJCSRjb2RlIC49ICcgICAgICAgIGVycm9yX2xvZyggIk5laXRoZXIgYSBmaWxlIG5vciBhIGRpcmVjdG9yeSAoaWdub3JpbmcpOiBcJyIgLiAkaGVhZGVyW1wnZmlsZW5hbWVcJ10gLiAiXCciICk7ICc7CgkJCQkJCSRjb2RlIC49ICcgICAgICAgICRyZXN1bHQgPSBmYWxzZTsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICB9ICc7CgkJCQkJCSRjb2RlIC49ICd9IGVsc2UgeyAnOwovLwkJCQkJCSRjb2RlIC49ICcgICAgZXJyb3JfbG9nKCAiRmlsZSBpcyBhIHN5bWxpbmsgKGlnbm9yaW5nKTogXCciIC4gJGhlYWRlcltcJ2ZpbGVuYW1lXCddIC4gIlwnIiApOyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICRzeW1saW5rc1tdID0gJGhlYWRlcltcJ2ZpbGVuYW1lXCddOyAnOwovLwkJCQkJCSRjb2RlIC49ICcgICAgZXJyb3JfbG9nKCAiU3ltbGlua3MgQXJyYXk6IFwnIiAuIHByaW50X3IoICRzeW1saW5rcywgdHJ1ZSApIC4gIlwnIiApOyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICRyZXN1bHQgPSBmYWxzZTsgJzsKCQkJCQkJJGNvZGUgLj0gJ30gJzsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gSWYgaXQncyBuZWl0aGVyIGEgZmlsZSBub3IgZGlyZWN0b3J5IHRoZW4gaWdub3JlIGl0IC0gYSB2YWxpZCBzeW1saW5rIHdpbGwgcmVnaXN0ZXIgYXMgYSBmaWxlCgkJCQkJCS8vIG9yIGRpcmVjdG9yeSBkZXBlbmRlbnQgb24gd2hhdCBpdCBpcyBwb2ludGluZyBhdC4gQSBicm9rZW4gc3ltbGluayB3aWxsIG5ldmVyIGdldCB0aGlzIGZhci4KCQkJCQkJJGNvZGUgLj0gJ2lmICggKCB0cnVlID09PSAkcmVzdWx0ICkgJiYgKCBAaXNfZmlsZSggJGhlYWRlcltcJ2ZpbGVuYW1lXCddICkgfHwgQGlzX2RpciggJGhlYWRlcltcJ2ZpbGVuYW1lXCddICkgKSApIHsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAkcmVzdWx0ID0gdHJ1ZTsgJzsKCQkJCQkJJGNvZGUgLj0gJ30gZWxzZSB7ICc7Ci8vCQkJCQkJJGNvZGUgLj0gJyAgICBlcnJvcl9sb2coICJOZWl0aGVyIGEgZmlsZSBub3IgYSBkaXJlY3RvcnkgKGlnbm9yaW5nKTogXCciIC4gJGhlYWRlcltcJ2ZpbGVuYW1lXCddIC4gIlwnIiApOyAnOwoJCQkJCQkkY29kZSAuPSAnICAgICRyZXN1bHQgPSBmYWxzZTsgJzsKCQkJCQkJJGNvZGUgLj0gJ30gJzsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIEFkZCB0aGUgY29kZSBibG9jayBmb3IgaWdub3JpbmcgdW5yZWFkYWJsZSBmaWxlcwoJCQkJCWlmICggdHJ1ZSApIHsKCQkJCQkKCQkJCQkJJGNvZGUgLj0gJ2lmICggKCB0cnVlID09PSAkcmVzdWx0ICkgJiYgKCBAaXNfcmVhZGFibGUoICRoZWFkZXJbXCdmaWxlbmFtZVwnXSApICkgKSB7ICc7CgkJCQkJCSRjb2RlIC49ICcgICAgJHJlc3VsdCA9IHRydWU7ICc7CgkJCQkJCSRjb2RlIC49ICd9IGVsc2UgeyAnOwovLwkJCQkJCSRjb2RlIC49ICcgICAgZXJyb3JfbG9nKCAiRmlsZSBub3QgcmVhZGFibGU6IFwnIiAuICRoZWFkZXJbXCdmaWxlbmFtZVwnXSAuICJcJyIgKTsgJzsKCQkJCQkJJGNvZGUgLj0gJyAgICAkcmVzdWx0ID0gZmFsc2U7ICc7CgkJCQkJCSRjb2RlIC49ICd9ICc7CgkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIFJldHVybiB0cnVlICh0byBpbmNsdWRlIGZpbGUpIGlmIGZpbGUgcGFzc2VzIGNvbmRpdGlvbnMgb3RoZXJ3aXNlIGZhbHNlICh0byBza2lwIGZpbGUpIGlmIG5vdAoJCQkJCSRjb2RlIC49ICdyZXR1cm4gKCAoIHRydWUgPT09ICRyZXN1bHQgKSA/IDEgOiAwICk7ICc7CgoJCQkJCSRwcmVfYWRkX2Z1bmMgPSBjcmVhdGVfZnVuY3Rpb24oICRhcmdzLCAkY29kZSApOwoJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIElmIHdlIGhhZCBjYXVzZSB0byBjcmVhdGUgYSBwcmUgYWRkIGZ1bmN0aW9uIHRoZW4gYWRkIGl0IHRvIHRoZSBhcmd1bWVudCBsaXN0IGhlcmUKCQkJCWlmICggIWVtcHR5KCAkcHJlX2FkZF9mdW5jICkgKSB7CgkJCQkKCQkJCQlhcnJheV9wdXNoKCAkYXJndW1lbnRzLCBQQ0xaSVBfQ0JfUFJFX0FERCwgJHByZV9hZGRfZnVuYyApOwoJCQoJCQkJfQoJCQkJCgkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhpc3RpbmcgWklQIEFyY2hpdmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQlAdW5saW5rKCAkemlwICk7CgkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGFjdHVhbGx5IGNyZWF0ZSB0aGUgemlwIGFyY2hpdmUgZmlsZQoJCQkJLy8gRmlyc3QgaW1wbG9kZSBhbnkgZW1iZWRkZWQgYXJyYXkgaW4gdGhlIGFyZ3VtZW50IGxpc3QgYW5kIHRydW5jYXRlIHRoZSByZXN1bHQgaWYgdG9vIGxvbmcKCQkJCS8vIEFzc3VtZSBubyBhcnJheXMgZW1iZWRkZWQgaW4gYXJyYXlzIC0gY3VycmVudGx5IG5vIHJlYXNvbiBmb3IgdGhhdAoJCQkJLy8gVE9ETzogTWFrZSB0aGUgc3VtbWFyeSBsZW5ndGggY29uZmlndXJhYmxlIHNvIHRoYXQgY2FuIHNlZSBtb3JlIGlmIHJlcXVpcmVkCgkJCQkvLyBUT0RPOiBDb25zaWRlciBtYXBwaW5nIHBjbHppcCBhcmd1bWVudCBpZGVudGlmaWVycyB0byBzdHJpbmcgcmVwcmVzZW50YXRpb25zIGZvciBjbGFyaXR5CgkJCQkkYXJncyA9ICckaXRlbSc7CgkJCQkkY29kZSA9ICdpZiAoIGlzX2FycmF5KCAkaXRlbSApICkgeyAkc3RyaW5nX2l0ZW0gPSBpbXBsb2RlKCAiLCIsICRpdGVtKTsgcmV0dXJuICggKCBzdHJsZW4oICRzdHJpbmdfaXRlbSApIDw9IDUwICkgPyAkc3RyaW5nX2l0ZW0gOiAiTGlzdDogIiAuIHN1YnN0ciggJHN0cmluZ19pdGVtLCAwLCA1MCApIC4gIi4uLiIgKTsgfSBlbHNlIHsgcmV0dXJuICRpdGVtOyB9OyAnOwoJCQkJJGltcGxvZGVyX2Z1bmMgPSBjcmVhdGVfZnVuY3Rpb24oICRhcmdzLCAkY29kZSApOwoJCQkJJGltcGxvZGVkX2FyZ3VtZW50cyA9IGFycmF5X21hcCggJGltcGxvZGVyX2Z1bmMsICRhcmd1bWVudHMgKTsKCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCAnIGNvbW1hbmQgYXJndW1lbnRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiBpbXBsb2RlKCAnOycsICRpbXBsb2RlZF9hcmd1bWVudHMgKSApOwoJCQkJCgkJCQkkb3V0cHV0ID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoIGFycmF5KCAmJHphLCAnY3JlYXRlJyApLCAkYXJndW1lbnRzICk7CgkJCQkKCQkJCS8vIFdvcmsgb3V0IHdoZXRoZXIgd2UgaGF2ZSBhIHByb2JsZW0gb3Igbm90CgkJCQlpZiAoIGlzX2FycmF5KCAkb3V0cHV0ICkgKSB7CgkJCQkKCQkJCQkvLyBJdCdzIGFuIGFycmF5IHNvIGF0IGxlYXN0IHdlIHByb2R1Y2VkIGEgemlwIGFyY2hpdmUgCgkJCQkJJGV4aXRjb2RlID0gMDsKCQkJCQkKCQkJCQkvLyBQcm9jZXNzIHRoZSBhcnJheSBmb3IgYW55ICJ3YXJuaW5ncyIgb3Igb3RoZXIgcmVwb3J0YWJsZSBjb25kaXRpb25zCgkJCQkJJGlkID0gMDsgLy8gQ3JlYXRlIGEgdW5pcXVlIGtleSAobGlrZSBhIGxpbmUgbnVtYmVyKSBmb3IgbGF0ZXIgc29ydGluZwoJCQkJCWZvcmVhY2goICRvdXRwdXQgYXMgJGZpbGUgKSB7CgkJCQkJCgkJCQkJCXN3aXRjaCAoICRmaWxlWyAnc3RhdHVzJyBdICkgewoJCQkJCQkJY2FzZSAic2tpcHBlZCI6CgkJCQkJCQkKCQkJCQkJCQkvLyBGaXJzdCBuZWVkIHRvIGZpbHRlciBvdXQgYW55IGZpbGVzIHNraXBwZWQgYmVjYXVzZSB1bmRlciBhIHN5bWxpbmsgZGlyCgkJCQkJCQkJZm9yZWFjaCAoICRzeW1saW5rc19mb3VuZCBhcyAkcHJlZml4ICkgewoJCQkJCQkJCQoJCQkJCQkJCQlpZiAoICEoIGZhbHNlID09PSBzdHJwb3MoICRmaWxlWyAnZmlsZW5hbWUnIF0sICRwcmVmaXggKSApICkgewoJCQkJCQkJCQkKCQkJCQkJCQkJCSRpZCsrOwoJCQkJCQkJCQkJLy8gYnJlYWsgb3V0IG9mIHRoZSBmb3JlYWNoIGFuZCB0aGUgc3dpdGNoCgkJCQkJCQkJCQlicmVhayAyOwoJCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCS8vIEZvciBza2lwcGVkIGZpbGVzIG5lZWQgdG8gZGV0ZXJtaW5lIHdoeSBpdCB3YXMgc2tpcHBlZAoJCQkJCQkJCWlmICggKCB0cnVlID09PSAkemlwX2lnbm9yaW5nX3N5bWxpbmtzICkgJiYgQGlzX2xpbmsoICRmaWxlWyAnZmlsZW5hbWUnIF0gKSApIHsKCQkJCQkJCQkKCQkJCQkJCQkJLy8gUmVtZW1iZXIgdGhpcyBmb3IgZmlsdGVyaW5nIG90aGVyIGZpbGVzIHNraXBwZWQgYmVjYXVzZSBpbiBzeW1saW5rIGRpcmVjdG9yeQoJCQkJCQkJCQkkc3ltbGlua3NfZm91bmRbXSA9ICRmaWxlWyAnZmlsZW5hbWUnIF07CgkJCQkJCQkJCQoJCQkJCQkJCQkvLyBTa2lwcGVkIGJlY2F1c2Ugd2UgYXJlIGlnbm9yaW5nIHN5bWxpbmtzIGFuZCB0aGlzIGlzIGEgc3ltbGluawoJCQkJCQkJCQkkemlwX290aGVyWyBzZWxmOjpaSVBfT1RIRVJfSUdOT1JFRF9TWU1MSU5LIF1bICRpZCsrIF0gPSAkZmlsZVsgJ2ZpbGVuYW1lJyBdOwoJCQkJCQkJCQkkemlwX290aGVyX2NvdW50Kys7CgkJCQkJCQkJCQoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCgkJCQkJCQkJCS8vU2tpcHBlZCBiZWNhdXNlIHByb2JhYmx5IHVucmVhZGFibGUgb3Igbm9uLWV4aXN0ZW50IChjYXRjaC1hbGwgZm9yIG5vdykKCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfU0tJUFBFRCBdWyAkaWQrKyBdID0gJGZpbGVbICdmaWxlbmFtZScgXTsKCQkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCQkKCQkJCQkJCQl9CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICJmaWx0ZXJlZCI6CgkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX09USEVSX0ZJTFRFUkVEIF1bICRpZCsrIF0gPSAkZmlsZVsgJ2ZpbGVuYW1lJyBdOwoJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgImZpbGVuYW1lX3Rvb19sb25nIjoKCQkJCQkJCQkkemlwX3dhcm5pbmdzWyBzZWxmOjpaSVBfT1RIRVJfTE9OR1BBVEggXVsgJGlkKysgXSA9ICRmaWxlWyAnZmlsZW5hbWUnIF07CgkJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJZGVmYXVsdDoKCQkJCQkJCQkvLyBDdXJyZW50bHkgbm90IHByb2Nlc3NpbmcgIm9rIiBlbnRyaWVzCgkJCQkJCQkJJGlkKys7CgkJCQkJCX0KCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gTm93IGZyZWUgdXAgdGhlIG1lbW9yeS4uLgoJCQkJCXVuc2V0KCAkb3V0cHV0ICk7CgkJCQkJCgkJCQkJLy8gU2V0IGNvbnZlbmllbmNlIGZsYWdzCQkJCgkJCQkJJGhhdmVfemlwX3dhcm5pbmdzID0gKCAwIDwgJHppcF93YXJuaW5nc19jb3VudCApOwoJCQkJCSRoYXZlX3ppcF9vdGhlciA9ICggMCA8ICR6aXBfb3RoZXJfY291bnQgKTsKCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIE5vdCBhbiBhcnJheSBzbyBhIGJhZCBlcnJvciBjb2RlLCBzb21ldGhpbmcgd2UgZGlkbid0IG9yIGNvdWxkbid0IGNhdGNoCgkJCQkJJGV4aXRjb2RlID0gJHphLT5lcnJvckNvZGUoKTsKCQkJCQkKCQkJCQkvLyBQdXQgdGhlIGVycm9yIGluZm9ybWF0aW9uIGludG8gYW4gYXJyYXkgZm9yIGNvbnNpc3RlbmN5CgkJCQkJJHppcF9lcnJvcnNbXSA9ICR6YS0+ZXJyb3JJbmZvKCB0cnVlICk7CgkJCQkJJHppcF9lcnJvcnNfY291bnQgPSBzaXplb2YoICR6aXBfZXJyb3JzICk7CgkJCQkJJGhhdmVfemlwX2Vycm9ycyA9ICggMCA8ICR6aXBfZXJyb3JzX2NvdW50ICk7CgkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gQ29udmVuaWVuY2UgZm9yIGhhbmRsaW5nIGRpZmZlcmVudCBzY2FuYXJpb3MKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJLy8gQWx3YXlzIHJlcG9ydCB0aGUgZXhpdCBjb2RlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBtaWdodCBpZ25vcmUgaXQgb3Igbm90CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgcHJvY2VzcyBleGl0IGNvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXhpdGNvZGUgKTsKCQoJCQkJLy8gQWx3YXlzIHJlcG9ydCB0aGUgbnVtYmVyIG9mIHdhcm5pbmdzIC0gZXZlbiBqdXN0IHRvIGNvbmZpcm0gdGhhdCB3ZSBkaWRuJ3QgaGF2ZSBhbnkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIHdhcm5pbmclMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF93YXJuaW5nc19jb3VudCwgKCAoIDEgPT0gJHppcF93YXJuaW5nc19jb3VudCApID8gJycgOiAncycgKSApICk7CgkJCQkKCQkJCS8vIEFsd2F5cyByZXBvcnQgd2FybmluZ3MgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHVzZXIgaGFzIHNlbGVjdGVkIHRvIGlnbm9yZSB0aGVtCgkJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF93YXJuaW5ncyApIHsKCQkJCgkJCQkJJHRoaXMtPmxvZ196aXBfcmVwb3J0cyggJHppcF93YXJuaW5ncywgc2VsZjo6JF93YXJuaW5nX2Rlc2MsICJXQVJOSU5HIiwgc2VsZjo6TUFYX1dBUk5JTkdfTElORVNfVE9fU0hPVywgZGlybmFtZSggZGlybmFtZSggJHRlbXBkaXIgKSApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdwYl9iYWNrdXBidWRkeScgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gc2VsZjo6WklQX1dBUk5JTkdTX0ZJTEVfTkFNRSApOwoKCQkJCX0KCQkJCgkJCQkvLyBBbHdheXMgcmVwb3J0IG90aGVyIHJlcG9ydHMgcmVnYXJkbGVzcwoJCQkJaWYgKCB0cnVlID09PSAkaGF2ZV96aXBfb3RoZXIgKSB7CgkJCQoJCQkJCS8vIE9ubHkgcmVwb3J0IG51bWJlciBvZiBpbmZvcm1hdGlvbmFscyBpZiB3ZSBoYXZlIGFueSBhcyB0aGV5IGFyZSBub3QgdGhhdCBpbXBvcnRhbnQKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogJTEkcyBpbmZvcm1hdGlvbiUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX290aGVyX2NvdW50LCAoICggMSA9PSAkemlwX290aGVyX2NvdW50ICkgPyAnYWwnIDogJ2FscycgKSApICk7CgoJCQkJCSR0aGlzLT5sb2dfemlwX3JlcG9ydHMoICR6aXBfb3RoZXIsIHNlbGY6OiRfb3RoZXJfZGVzYywgIklORk9STUFUSU9OIiwgc2VsZjo6TUFYX09USEVSX0xJTkVTX1RPX1NIT1csIGRpcm5hbWUoIGRpcm5hbWUoICR0ZW1wZGlyICkgKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAncGJfYmFja3VwYnVkZHknIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHNlbGY6OlpJUF9PVEhFUlNfRklMRV9OQU1FICk7CgoJCQkJfQoJCQkKCQkJCS8vIFNlZSBpZiB3ZSBjYW4gZmlndXJlIG91dCB3aGF0IGhhcHBlbmVkCgkJCQkvLyBOb3RlOiBvbmx5IGV4cGVjdCBleGl0Y29kZSB0byBiZSBub24temVybyBmb3IgYW4gZXJyb3Igd2UgY291bGRuJ3QgcHJlLWVtcHQKCQkJCS8vIE5vdGU6IHdhcm5pbmdzIHdpbGwgY2F1c2UgdGhlIG9wZXJhdGlvbiB0byBiZSBzdG9wcGVkIGlmIHVzZXIgaGFzbid0IGNob3NlbiB0byBpZ25vcmUgcmVnYXJkbGVzcwoJCQkJLy8gb2Ygd2hldGhlciB3ZSBnb3QgYSB6aXAgZmlsZSAod2hpY2ggd2UgbW9zdCBsaWtlbHkgZGlkKS4KCQkJCS8vIE5vdGU6IGEgbm9uLXplcm8gZXhpdGNvZGUgYW5kIHByZXNlbmNlIG9mIHdhcm5pbmdzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUKCQkJCWlmICggKCAhIEBmaWxlX2V4aXN0cyggJHRlbXBfemlwICkgKSB8fAoJCQkJCSAoIDAgIT0gJGV4aXRjb2RlICkgfHwKCQkJCQkgKCAoIHRydWUgPT0gJGhhdmVfemlwX3dhcm5pbmdzICkgJiYgISR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKSApIHsKCQkJCQoJCQkJCS8vIElmIHdlIGhhdmUgYW55IHppcCBlcnJvcnMgcmVwb3J0ZWQgc2hvdyB0aGVtIHJlZ2FyZGxlc3MKCQkJCQlpZiAoIHRydWUgPT0gJGhhdmVfemlwX2Vycm9ycyApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICUxJHMgZXJyb3IlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9lcnJvcnNfY291bnQsICggKCAxID09ICR6aXBfZXJyb3JzX2NvdW50ICkgPyAnJyA6ICdzJyApICApICk7CgkJCQkJCgkJCQkJCWZvcmVhY2ggKCAkemlwX2Vycm9ycyBhcyAkbGluZSApIHsKCQkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbGluZSApOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBSZXBvcnQgd2hldGhlciBvciBub3QgdGhlIHppcCBmaWxlIHdhcyBjcmVhdGVkICh0aGlzIHdpbGwgYWx3YXlzIGJlIGluIHRoZSB0ZW1wb3JhcnkgbG9jYXRpb24pCQkJCgkJCQkJaWYgKCAhIEBmaWxlX2V4aXN0cyggJHRlbXBfemlwICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdaaXAgQXJjaGl2ZSBmaWxlIG5vdCBjcmVhdGVkIC0gY2hlY2sgcHJvY2VzcyBleGl0IGNvZGUuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgY3JlYXRlZCBidXQgd2l0aCBlcnJvcnMvYWN0aW9uYWJsZS13YXJuaW5ncyBzbyB3aWxsIGJlIGRlbGV0ZWQgLSBjaGVjayBwcm9jZXNzIGV4aXQgY29kZSBhbmQgd2FybmluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIFRoZSBvcGVyYXRpb24gaGFzIGZhaWxlZCBvbmUgd2F5IG9yIGFub3RoZXIuIE5vdGUgdGhhdCBmb3IgcGNsemlwIHRoZSB6aXAgZmlsZSBpcyBhbHdheXMgY3JlYXRlZCBpbiB0aGUgdGVtcG9yYXJ5CgkJCQkJLy8gbG9jYXRpb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB1c2VyIHNlbGVjdGVkIHRvIGlnbm9yZSBlcnJvcnMgb3Igbm90ICh3ZSBjYW4gbmV2ZXIgZ3VhcmFudGVlIHRvIGNyZWF0ZSBhIHZhbGlkCgkJCQkJLy8gemlwIGZpbGUgYmVjYXVzZSB0aGUgc2NyaXB0IG1pZ2h0IGJlIHRlcm1pbmF0ZWQgYnkgdGhlIHNlcnZlciBzbyB3ZSBtdXN0IHdhaXQgdG8gcHJvZHVjZSBhIHZhbGlkIGZpbGUgYW5kIHRoZW4KCQkJCQkvLyBtb3ZlIGl0IHRvIHRoZSBmaW5hbCBsb2NhdGlvbiBpZiBpdCBpcyB2YWxpZCkuCgkJCQkJLy8gVGhlcmVmb3JlIGlmIHRoZXJlIGlzIGEgemlwIGZpbGUgKHByb2R1Y2VkIGJ1dCB3aXRoIHdhcm5pbmdzKSBpdCB3aWxsIG5vdCBiZSB2aXNpYmxlIGFuZCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUKCQkJCQkvLyB0ZW1wb3JhcnkgZGlyZWN0b3J5IGlzIGRlbGV0ZWQgYmVsb3cuCgkJCQkJCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIEdvdCBmaWxlIHdpdGggbm8gZXJyb3Igb3Igd2FybmluZ3MgX29yXyB3aXRoIHdhcm5pbmdzIHRoYXQgdGhlIHVzZXIgaGFzIGNob3NlbiB0byBpZ25vcmUKCQkJCQkvLyBGaWxlIGFsd2F5cyBidWlsdCBpbiB0ZW1wb3JhcnkgbG9jYXRpb24gc28gYWx3YXlzIG5lZWQgdG8gbW92ZSBpdAoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ01vdmluZyBaaXAgQXJjaGl2ZSBmaWxlIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgbm8gc3RhbGUgZmlsZSBpbmZvcm1hdGlvbgoJCQkJCWNsZWFyc3RhdGNhY2hlKCk7CgkJCQkJCgkJCQkJLy8gUmVsb2NhdGUgdGhlIHRlbXBvcmFyeSB6aXAgZmlsZSB0byBmaW5hbCBsb2NhdGlvbgoJCQkJCUByZW5hbWUoICR0ZW1wX3ppcCwgJHppcCApOwoJCQkJCQoJCQkJCS8vIENoZWNrIHRoYXQgd2UgbW92ZWQgdGhlIGZpbGUgb2sKCQkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIG1vdmVkIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgKGFueSBhY3Rpb25hYmxlIHdhcm5pbmdzIGlnbm9yZWQgYnkgdXNlciBzZXR0aW5ncykuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR6aXAgKTsKCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNvdWxkIG5vdCBiZSBtb3ZlZCB0byBsb2NhbCBhcmNoaXZlIGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQkJCQkKCQkJCX0KCgkJCX0KCQkJCgkJCS8vIENsZWFudXAgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3aWxsIGhhdmUgYWxsIGRldHJpdHVzIGFuZCBtYXliZSBpbmNvbXBsZXRlIHppcCBmaWxlCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVtb3ZpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBkaXIgKSApICkgewoJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3JhcnkgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRlbXBkaXIgKTsKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CgkJICAJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkJCQkJCQkJCQkKCQl9CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCUlmIG5vIHNwZWNpZmljIGl0ZW1zIGdpdmVuIHRvIGV4dHJhY3QgdGhlbiBpdCdzIGEgY29tcGxldGUgdW56aXAKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgPSBhcnJheSgpICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQlpZiAoIGVtcHR5KCAkaXRlbXMgKSApIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CQkJCQkKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfZnVsbCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdF9nZW5lcmljX2Z1bGwoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQkJCQkJCgkJCS8vIFVwZGF0ZSB0aGUgZGVmaW5pdGlvbiBiZWZvcmUgaXQgaXMgdXNlZCBieSBsb2FkaW5nIHRoZSBsaWJyYXJ5CgkJCS8vIFRoaXMgd2lsbCBub3Qgd29rIGlmIHBlcmNoYW5jZSB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCA6LSgKCQkJLy8gVE9ETzogTmVlZCBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3ZSBjYW4gdXNlIGZvciB0aGlzCgkJCS8vZGVmaW5lKCAnUENMWklQX1RFTVBPUkFSWV9ESVInLCAkdGVtcGRpciApOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgaWYgbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1BjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCSAJCgkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBjb250ZW50CgkJCQlpZiAoICggJGNvbnRlbnRfbGlzdCA9ICR6YS0+ZXh0cmFjdCggUENMWklQX09QVF9QQVRILCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgKSAhPT0gMCApIHsKCQkJCQoJCQkJCS8vIEhvdyBtYW55IGZpbGVzIC0gbXVzdCBiZSA+MCB0byBoYXZlIGdvdCBoZXJlCgkJCQkJJGZpbGVfY291bnQgPSBzaXplb2YoICRjb250ZW50X2xpc3QgKTsKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgdG8gJTIkcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoKCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcF9maWxlICk7CQoJCQkJCQoJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIHdpbGwgcmV0dXJuIGZvciBtYXliZSBhbm90aGVyIG1ldGhvZCB0byB0cnkKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oIHRydWUgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBleHRyYWN0IGNvbnRlbnRzICglMSRzIHRvICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCgkJLyoqCgkJICoJZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcGFyYW0JYXJyYXkJCSRpdGVtcwkJCQkJCU1hcHBpbmcgb2Ygd2hhdCB0byBleHRyYWN0IGFuZCB0byB3aGF0CgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzIChhbGwgZXh0cmFjdGlvbnMgc3VjY2Vzc2Z1bCksIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJJHN0YXQgPSBhcnJheSgpOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgaWYgbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9QY2xaaXAoICR6aXBfZmlsZSApOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgemlwYXJjaGl2ZSBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rIGFuZCBpdCBoYXMgY29udGVudAoJCQkJaWYgKCAoICRjb250ZW50X2xpc3QgPSAkemEtPmxpc3RDb250ZW50KCkgKSAhPT0gMCApIHsKCQkJCQoJCQkJCS8vIE5vdyB3ZSBuZWVkIHRvIHRha2UgZWFjaCBpdGVtIGFuZCBydW4gYW4gdW56aXAgZm9yIGl0IC0gdW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyBlYXN5IHdheSBvZiBjb21iaW5pbmcKCQkJCQkvLyBhcmJpdHJhcnkgZXh0cmFjdGlvbnMgaW50byBhIHNpbmdsZSBjb21tYW5kIGlmIHNvbWUgbWlnaHQgYmUgdG8gYSAKCQkJCQlmb3JlYWNoICggJGl0ZW1zIGFzICR3aGF0ID0+ICR3aGVyZSApIHsKCQkJCgkJCQkJCSRyZW5hbWVfcmVxdWlyZWQgPSBmYWxzZTsKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCQkJCS8vIERlY2lkZSBob3cgdG8gZXh0cmFjdCBiYXNlZCBvbiB3aGVyZQoJCQkJCQlpZiAoIGVtcHR5KCAkd2hlcmUpICkgewoJCQkJCQoJCQkJCQkJLy8gRmlyc3Qgd2UnbGwgZXh0cmFjdCBhbmQganVuayB0aGUgcGF0aAoJCQkJCQkJLy8gTm90ZTogRm9yIHNvbWUgb2RkIHJlYXNvbiB3aGVuIHdlIGhhdmUgYSAkd2hhdCBmaWxlIHRoYXQgaXMgYSBoaWRkZW4gKGRvdCkgZmlsZQoJCQkJCQkJLy8gdGhlIGZpbGVfZXhpc3RzKCkgdGVzdCBpbiBwY2x6aXAgZm9yIHRoZSBmaWxlcGF0aCB0byBleHRyYWN0IHRvIHJldHVybnMgdHJ1ZSBldmVuCgkJCQkJCQkvLyB0aG91Z2ggb25seSB0aGUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgYW5kIG5vdCB0aGUgZmlsZSBpdHNlbGYuIE5vIGlkZWEgd2h5IGF0CgkJCQkJCQkvLyBwcmVzZW50LiBCZWNhdXNlIG9mIHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIFBDTF9aSVBfT1BUX1JFUExBQ0VfTkVXRVIgb3B0aW9uCgkJCQkJCQkvLyBzbyB0aGUgZmFjdCB0aGUgdGVzdCByZXR1cm5zIHRydWUgaXMgaWdub3JlZC4KCQkJCQkJCSRleHRyYWN0X2xpc3QgPSAkemEtPmV4dHJhY3QoIFBDTFpJUF9PUFRfUEFUSCwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgUENMWklQX09QVF9CWV9OQU1FLCAkd2hhdCwgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEgsIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiApOwoJCQkJCQkJCQoJCQkJCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBzdWNjZWVkZWQgb3Igbm90ICh3b3VsZCBvbmx5IGJlIG5vIGxpc3QgYXJyYXkgZm9yIGEgemlwIGZpbGUgcHJvYmxlbSkKCQkJCQkJCS8vIGJ1dCBleHRyYWN0aW9uIG9mIHRoZSBmaWxlIGl0c2VsZiBtYXkgc3RpbGwgaGF2ZSBmYWlsZWQKCQkJCQkJCSRyZXN1bHQgPSAoICRleHRyYWN0X2xpc3QgIT09IDAgICYmICggJGV4dHJhY3RfbGlzdFsgMCBdWyAnc3RhdHVzJyBdID09ICdvaycgKSApOwoJCQkJCQkJCQkJCQkJCQkKCQkJCQkJfSBlbHNlaWYgKCAhZW1wdHkoICR3aGVyZSApICkgewoJCQkJCQoJCQkJCQkJaWYgKCAkd2hhdCA9PT0gJHdoZXJlICkgewoJCQkJCQkJCgkJCQkJCQkJLy8gQ2hlY2sgZm9yIHdpbGRjYXJkIGRpcmVjdG9yeSBleHRyYWN0aW9uIGxpa2UgZGlyLyogPT4gZGlyLyoKCQkJCQkJCQlpZiAoICIqIiA9PSBzdWJzdHIoIHRyaW0oICR3aGF0ICksIC0xICkgKSB7CgoJCQkJCQkJCQkvLyBUdXJuIHRoaXMgaW50byBhIHByZWdfbWF0Y2ggcGF0dGVybgoJCQkJCQkJCQkkd2hhdG1hdGNoID0gInxeIiAuICR3aGF0IC4gInwiOwkJCQkJCQkJCQoKCQkJCQkJCQkJLy8gRmlyc3Qgd2UnbGwgZXh0cmFjdCBidXQgd2UncmUgbm90IGp1bmtpbmcgdGhlIHBhdGhzCgkJCQkJCQkJCS8vIE5vdGU6IEZvciBzb21lIG9kZCByZWFzb24gd2hlbiB3ZSBoYXZlIGEgJHdoYXQgZmlsZSB0aGF0IGlzIGEgaGlkZGVuIChkb3QpIGZpbGUKCQkJCQkJCQkJLy8gdGhlIGZpbGVfZXhpc3RzKCkgdGVzdCBpbiBwY2x6aXAgZm9yIHRoZSBmaWxlcGF0aCB0byBleHRyYWN0IHRvIHJldHVybnMgdHJ1ZSBldmVuCgkJCQkJCQkJCS8vIHRob3VnaCBvbmx5IHRoZSBwYXJlbnQgZGlyZWN0b3J5IGV4aXN0cyBhbmQgbm90IHRoZSBmaWxlIGl0c2VsZi4gTm8gaWRlYSB3aHkgYXQKCQkJCQkJCQkJLy8gcHJlc2VudC4gQmVjYXVzZSBvZiB0aGF0IHdlIGhhdmUgdG8gdXNlIHRoZSBQQ0xfWklQX09QVF9SRVBMQUNFX05FV0VSIG9wdGlvbgoJCQkJCQkJCQkvLyBzbyB0aGUgZmFjdCB0aGUgdGVzdCByZXR1cm5zIHRydWUgaXMgaWdub3JlZC4KCQkJCQkJCQkJJGV4dHJhY3RfbGlzdCA9ICR6YS0+ZXh0cmFjdCggUENMWklQX09QVF9QQVRILCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCBQQ0xaSVBfT1BUX0JZX1BSRUcsICR3aGF0bWF0Y2gsIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiApOwoKCQkJCQkJCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBzdWNjZWVkZWQgb3Igbm90ICh3b3VsZCBvbmx5IGJlIG5vIGxpc3QgYXJyYXkgZm9yIGEgemlwIGZpbGUgcHJvYmxlbSkKCQkJCQkJCQkJLy8gYnV0IGV4dHJhY3Rpb24gb2YgaW5kaXZpZHVhbCBmaWxlcyB0aGVtc2VsdmVzIG1heSBzdGlsbCBoYXZlIGZhaWxlZAoJCQkJCQkJCQlpZiAoIDAgIT09ICRleHRyYWN0X2xpc3QgKSB7CgkJCQkJCQkJCQoJCQkJCQkJCQkJLy8gU28gZmFyIHNvIGdvb2QgLSBhc3N1bWUgZXZlcnl0aGluZyB3aWxsIGJlIG9rCgkJCQkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQoJCQkJCQkJCQkJLy8gQXQgbGVhc3Qgd2UgZ290IG5vIG1ham9yIGZhaWx1cmUgc28gY2hlY2sgdGhlIGV4dHJhY3RlZCBmaWxlcwoJCQkJCQkJCQkJZm9yZWFjaCAoICRleHRyYWN0X2xpc3QgYXMgJGZpbGUgKSB7CgkJCQkJCQkJCQkKCQkJCQkJCQkJCQlpZiAoICdvaycgIT09ICRmaWxlWyAnc3RhdHVzJyBdICkgewoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCQkvLyBPb3BzIC0gd2UgZm91bmQgYSBmaWxlIHRoYXQgZGlkbid0IGV4dHJhY3Qgb2sgc28gYmFpbCBvdXQgd2l0aCBmYWxzZQoJCQkJCQkJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCQoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQoJCQkJCQkJCQkJfQoJCQkJCQkJCQkKCQkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCgkJCQkJCQkJCS8vIEl0J3MganVzdCBhIHNpbmdsZSBmaWxlIGV4dHJhY3Rpb24gLSBicmVhdGggYSBzaWduIG9mIHJlbGllZgoJCQkJCQkJCQkvLyBFeHRyYWN0IHRvIHNhbWUgZGlyZWN0b3J5IHN0cnVjdHVyZSAtIGRvbid0IGp1bmsgcGF0aCwgbm8gbmVlZCB0byBhZGQgd2hlcmUgdG8gZGVzdG5hdGlvbiBhcyBhdXRvbWF0aWMKCQkJCQkJCQkJLy8gTm90ZTogRm9yIHNvbWUgb2RkIHJlYXNvbiB3aGVuIHdlIGhhdmUgYSAkd2hhdCBmaWxlIHRoYXQgaXMgYSBoaWRkZW4gKGRvdCkgZmlsZQoJCQkJCQkJCQkvLyB0aGUgZmlsZV9leGlzdHMoKSB0ZXN0IGluIHBjbHppcCBmb3IgdGhlIGZpbGVwYXRoIHRvIGV4dHJhY3QgdG8gcmV0dXJucyB0cnVlIGV2ZW4KCQkJCQkJCQkJLy8gdGhvdWdoIG9ubHkgdGhlIHBhcmVudCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBub3QgdGhlIGZpbGUgaXRzZWxmLiBObyBpZGVhIHdoeSBhdAoJCQkJCQkJCQkvLyBwcmVzZW50LiBCZWNhdXNlIG9mIHRoYXQgd2UgaGF2ZSB0byB1c2UgdGhlIFBDTF9aSVBfT1BUX1JFUExBQ0VfTkVXRVIgb3B0aW9uCgkJCQkJCQkJCS8vIHNvIHRoZSBmYWN0IHRoZSB0ZXN0IHJldHVybnMgdHJ1ZSBpcyBpZ25vcmVkLgoJCQkJCQkJCQkkZXh0cmFjdF9saXN0ID0gJHphLT5leHRyYWN0KCBQQ0xaSVBfT1BUX1BBVEgsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksIFBDTFpJUF9PUFRfQllfTkFNRSwgJHdoYXQsIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiApOwoJCQkJCQkJCQkKCQkJCQkJCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBzdWNjZWVkZWQgb3Igbm90ICh3b3VsZCBvbmx5IGJlIG5vIGxpc3QgYXJyYXkgZm9yIGEgemlwIGZpbGUgcHJvYmxlbSkKCQkJCQkJCQkJLy8gYnV0IGV4dHJhY3Rpb24gb2YgdGhlIGZpbGUgaXRzZWxmIG1heSBzdGlsbCBoYXZlIGZhaWxlZAoJCQkJCQkJCQkkcmVzdWx0ID0gKCAkZXh0cmFjdF9saXN0ICE9PSAwICAmJiAoIGlzc2V0KCAkZXh0cmFjdF9saXN0WyAwIF0gKSApICYmICggJGV4dHJhY3RfbGlzdFsgMCBdWyAnc3RhdHVzJyBdID09ICdvaycgKSApOwoKCQkJCQkJCQl9CgkJCQkJCQoJCQkJCQkJfSBlbHNlIHsKCgkJCQkJCQkJLy8gRmlyc3Qgd2UnbGwgZXh0cmFjdCBhbmQganVuayB0aGUgcGF0aAoJCQkJCQkJCS8vIE5vdGU6IEZvciBzb21lIG9kZCByZWFzb24gd2hlbiB3ZSBoYXZlIGEgJHdoYXQgZmlsZSB0aGF0IGlzIGEgaGlkZGVuIChkb3QpIGZpbGUKCQkJCQkJCQkvLyB0aGUgZmlsZV9leGlzdHMoKSB0ZXN0IGluIHBjbHppcCBmb3IgdGhlIGZpbGVwYXRoIHRvIGV4dHJhY3QgdG8gcmV0dXJucyB0cnVlIGV2ZW4KCQkJCQkJCQkvLyB0aG91Z2ggb25seSB0aGUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgYW5kIG5vdCB0aGUgZmlsZSBpdHNlbGYuIE5vIGlkZWEgd2h5IGF0CgkJCQkJCQkJLy8gcHJlc2VudC4gQmVjYXVzZSBvZiB0aGF0IHdlIGhhdmUgdG8gdXNlIHRoZSBQQ0xfWklQX09QVF9SRVBMQUNFX05FV0VSIG9wdGlvbgoJCQkJCQkJCS8vIHNvIHRoZSBmYWN0IHRoZSB0ZXN0IHJldHVybnMgdHJ1ZSBpcyBpZ25vcmVkLgoJCQkJCQkJCSRleHRyYWN0X2xpc3QgPSAkemEtPmV4dHJhY3QoIFBDTFpJUF9PUFRfUEFUSCwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgUENMWklQX09QVF9CWV9OQU1FLCAkd2hhdCwgUENMWklQX09QVF9SRU1PVkVfQUxMX1BBVEgsIFBDTFpJUF9PUFRfUkVQTEFDRV9ORVdFUiApOwoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQoJCQkJCQkJCS8vIENoZWNrIHdoZXRoZXIgd2Ugc3VjY2VlZGVkIG9yIG5vdCAod291bGQgb25seSBiZSBubyBsaXN0IGFycmF5IGZvciBhIHppcCBmaWxlIHByb2JsZW0pCgkJCQkJCQkJLy8gYnV0IGV4dHJhY3Rpb24gb2YgdGhlIGZpbGUgaXRzZWxmIG1heSBzdGlsbCBoYXZlIGZhaWxlZAoJCQkJCQkJCSRyZXN1bHQgPSAoICRleHRyYWN0X2xpc3QgIT09IDAgICYmICggJGV4dHJhY3RfbGlzdFsgMCBdWyAnc3RhdHVzJyBdID09ICdvaycgKSApOwoKCQkJCQkJCQkvLyBXaWxsIG5lZWQgdG8gcmVuYW1lIGlmIHRoZSBleHRyYWN0IGlzIG9rCgkJCQkJCQkJJHJlbmFtZV9yZXF1aXJlZCA9IHRydWU7CgkJCQkJCQoJCQkJCQkJfQoJCQkJCQoJCQkJCQl9CgkJCQkKCQkJCQkJLy8gTm90ZTogd2UgZG9uJ3Qgb3BlbiB0aGUgZmlsZSBhbmQgdGhlbiBkbyBzdHVmZiBidXQgaXQncyBhbGwgZG9uZSBpbiBvbmUgYWN0aW9uCgkJCQkJCS8vIHNvIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm4gY29kZSB0byBkZWRpZGUgd2hhdCB0byBkbwoJCQkJCQkvLyBDdXJyZW50bHkgd2UgY2FuIG9ubHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBzdWNjZXNzIGFuZCBmYWlsdXJlIGJ1dCBubyBmaW5lciBncmFpbgoJCQkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkJCgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR3aGF0LCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICR3aGVyZSApICk7CgoJCQkJCQkJLy8gUmVuYW1lIGlmIHdlIGhhdmUgdG8KCQkJCQkJCWlmICggdHJ1ZSA9PT0gJHJlbmFtZV9yZXF1aXJlZCkgewoJCQkJCQkJCgkJCQkJCQkJLy8gTm90ZTogd2UganVua2VkIHRoZSBwYXRoIG9uIHRoZSBleHRyYWN0aW9uIHNvIGp1c3QgdGhlIGZpbGVuYW1lIG9mICR3aGF0IGlzIHRoZSBzb3VyY2UgYnV0CgkJCQkJCQkJLy8gJHdoZXJlIGNvdWxkIGJlIGEgc2ltcGxlIGZpbGUgbmFtZSBvciBhIGZpbGUgcGF0aCAKCQkJCQkJCQkkcmVzdWx0ID0gJHJlc3VsdCAmJiByZW5hbWUoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gYmFzZW5hbWUoICR3aGF0ICksCgkJCQkJCQkJCQkJCQkJCSAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR3aGVyZSApOwoJCQkJCQkJCgkJCQkJCQl9CgoJCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkJLy8gRm9yIG5vdyBsZXQncyBqdXN0IHByaW50IHRoZSBlcnJvciBjb2RlIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbygpOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGZhaWxlZCB0byBvcGVuL3Byb2Nlc3MgZmlsZSB0byBleHRyYWN0IGZpbGUgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKSAtIEVycm9yIEluZm86ICU1JHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHdoYXQsICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoZXJlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkKCQkJCQkJCS8vIE1heSBzZWVtIHJlZHVuZGFudCBidXQgYmVsdCduJ2JyYWNlcwoJCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkKCQkJCQkJLy8gSWYgdGhlIGV4dHJhY3Rpb24gZmFpbGVkIChvciByZW5hbWUgYWZ0ZXIgZXh0cmFjdGlvbikgdGhlbiBicmVhayBvdXQgb2YgdGhlIGZvcmVhY2ggYW5kIHNpbXBseSByZXR1cm4gZmFsc2UKCQkJCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCQkKCQkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIHdpbGwgcmV0dXJuIGZvciBtYXliZSBhbm90aGVyIG1ldGhvZCB0byB0cnkKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBleHRyYWN0IGNvbnRlbnRzICglMSRzIHRvICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkKCQkJCSR6YS0+Y2xvc2UoKTsKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZmlsZV9leGlzdHMoKQoJCSAqCQoJCSAqCVRlc3RzIHdoZXRoZXIgYSBmaWxlICh3aXRoIHBhdGgpIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gemlwIGZpbGUKCQkgKglJZiBsZWF2ZV9vcGVuIGlzIHRydWUgdGhlbiB0aGUgemlwIG9iamVjdCB3aWxsIGJlIGxlZnQgb3BlbiBmb3IgZmFzdGVyIGNoZWNraW5nIGZvciBzdWJzZXF1ZW50IGZpbGVzIHdpdGhpbiB0aGlzIHppcAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXBfZmlsZQkJVGhlIHppcCBmaWxlIHRvIGNoZWNrCgkJICoJQHBhcmFtCQlzdHJpbmcJJGxvY2F0ZV9maWxlCVRoZSBmaWxlIHRvIHRlc3QgZm9yCgkJICoJQHBhcmFtCQlib29sCSRsZWF2ZV9vcGVuCQlPcHRpb25hbDogVHJ1ZSBpZiB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGxlZnQgb3BlbgoJCSAqCUByZXR1cm4JCWJvb2wvYXJyYXkJCQkJVHJ1ZSBpZiB0aGUgZmlsZSBpcyBmb3VuZCBpbiB0aGUgemlwIGFuZCBmYWxzZSBpZiBub3QsIGFycmF5IGZvciBvdGhlciBwcm9ibGVtCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZmlsZV9leGlzdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiA9IGZhbHNlICkgewoJCQoJCQkkcmVzdWx0ID0gYXJyYXkoIDEsICJHZW5lcmljIGZhaWx1cmUgaW5kaWNhdGlvbiIgKTsKCQkJJHphID0gTlVMTDsKCQkJJHN0YXQgPSBhcnJheSgpOwoJCQkJCQkJCQoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9QY2xaaXAoICR6aXBfZmlsZSApOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgcGNsemlwIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdwY2x6aXAgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJJHJlc3VsdCA9IGFycmF5KCAxLCAiQ2xhc3Mgbm90IGF2YWlsYWJsZSB0byBtYXRjaCBtZXRob2QiICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sgYW5kIGl0IGhhcyBjb250ZW50CgkJCQlpZiAoICggJGNvbnRlbnRfbGlzdCA9ICR6YS0+bGlzdENvbnRlbnQoKSApICE9PSAwICkgewoJCQkJCgkJCQkJLy8gQXNzdW1lIGZhaWx1cmUKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQkJLy8gR2V0IGVhY2ggZmlsZSBpbiBzZXF1ZW5jZSBieSBpbmRleCBhbmQgZ2V0IHRoZSBwcm9wZXJ0aWVzCgkJCQkJZm9yICggJGkgPSAwOyAkaSA8IHNpemVvZiggJGNvbnRlbnRfbGlzdCApOyAkaSsrICkgewoJCQkJCQoJCQkJCQkkc3RhdCA9ICRjb250ZW50X2xpc3RbICRpIF07CgkJCQkJCQoJCQkJCQkvLyBBc3N1bWUgdGhlIGtleSBleGlzdHMgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCWlmICggJHN0YXRbICdmaWxlbmFtZScgXSA9PSAkbG9jYXRlX2ZpbGUgKSB7CgkJCQkJCQoJCQkJCQkJLy8gRmlsZSBmb3VuZCBzbyB3ZSBjYW4gbm90ZSB0aGF0CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIGZvdW5kIChwY2x6aXApJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkJCgkJCQkJCQkvLyBOZWVkIHRvIGV4aXQgdGhlIGZvciBsb29wCgkJCQkJCQlicmVhazsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0ICkgewoJCQkJCQoJCQkJCQkvLyBPbmx5IGdldCBoZXJlIGlmIHRoZSBmaWxlIHdhc24ndCBmb3VuZAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAocGNsemlwKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCQoJCQkJCX0KCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gd2lsbCByZXR1cm4gZm9yIG1heWJlIGFub3RoZXIgbWV0aG9kIHRvIHRyeQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGNoZWNrIGlmIGZpbGUgZXhpc3RzIChsb29raW5nIGZvciAlMSRzIGluICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkbG9jYXRlX2ZpbGUgLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJJHJlc3VsdCA9IGFycmF5KCAxLCAiRmFpbGVkIHRvIG9wZW4vcHJvY2VzcyBmaWxlIiApOwoKCQkJCX0KCQkJCQkJCQoJCQl9CgkJCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQkJCgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQoJCX0KCQkJCQoJCS8qCWdldF9maWxlX2xpc3QoKQoJCSAqCQoJCSAqCUdldCBhbiBhcnJheSBvZiBhbGwgZmlsZXMgaW4gYSB6aXAgZmlsZSB3aXRoIHNvbWUgZmlsZSBwcm9wZXJ0aWVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJVGhlIGZpbGUgdG8gbGlzdCB0aGUgY29udGVudCBvZgoJCSAqCUByZXR1cm4JCWJvb2x8YXJyYXkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgb3RoZXJ3aXNlIGFycmF5IG9mIGZpbGUgcHJvcGVydGllcyAobWF5IGJlIGVtcHR5KQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfZmlsZV9saXN0KCAkemlwX2ZpbGUgKSB7CgkJCgkJCSRmaWxlX2xpc3QgPSBhcnJheSgpOwoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCSRzdGF0ID0gYXJyYXkoKTsKCQkJCQkJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1BjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvayBhbmQgaXQgaGFzIGNvbnRlbnQKCQkJCWlmICggMCAhPT0gKCAkY29udGVudF9saXN0ID0gJHphLT5saXN0Q29udGVudCgpICkgKSB7CgkJCQkKCQkJCQkvLyBIb3cgbWFueSBmaWxlcyAtIG11c3QgYmUgPjAgdG8gaGF2ZSBnb3QgaGVyZQoJCQkJCSRmaWxlX2NvdW50ID0gc2l6ZW9mKCAkY29udGVudF9saXN0ICk7CgkJCQkJCgkJCQkJLy8gR2V0IGVhY2ggZmlsZSBpbiBzZXF1ZW5jZSBieSBpbmRleCBhbmQgZ2V0IHRoZSBwcm9wZXJ0aWVzCgkJCQkJZm9yICggJGkgPSAwOyAkaSA8ICRmaWxlX2NvdW50OyAkaSsrICkgewoJCQkJCQoJCQkJCQkkc3RhdCA9ICRjb250ZW50X2xpc3RbICRpIF07CgkJCQkJCQoJCQkJCQkvLyBBc3N1bWUgYWxsIHRoZXNlIGtleXMgZG8gZXhpc3QgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCSRmaWxlX2xpc3RbXSA9IGFycmF5KAoJCQkJCQkJJHN0YXRbICdmaWxlbmFtZScgXSwKCQkJCQkJCSRzdGF0WyAnc2l6ZScgXSwKCQkJCQkJCSRzdGF0WyAnY29tcHJlc3NlZF9zaXplJyBdLAoJCQkJCQkJJHN0YXRbICdtdGltZScgXQoJCQkJCQkpOwoJCQkJCQkJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGxpc3RlZCBmaWxlIGNvbnRlbnRzICglMSRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgoJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwX2ZpbGUgKTsKCQkJCQkKCQkJCQkkcmVzdWx0ID0gJiRmaWxlX2xpc3Q7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gd2lsbCByZXR1cm4gZm9yIG1heWJlIGFub3RoZXIgbWV0aG9kIHRvIHRyeQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGxpc3QgY29udGVudHMgKCUxJHMpIC0gRXJyb3IgSW5mbzogJTIkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkJCQkKCQkJfSAKCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCgkJfQoJCQoJCS8qCXNldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gc2V0IGNvbW1lbnQgb24uCgkJICoJQHBhcmFtCQlzdHJpbmcJCQkkY29tbWVudAkJQ29tbWVudCB0byBhcHBseSB0byBhcmNoaXZlLgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIHNldF9jb21tZW50KCAkemlwX2ZpbGUsICRjb21tZW50ICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfUGNsWmlwKCAkemlwX2ZpbGUgKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHBjbHppcCBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygncGNsemlwIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rIGFuZCB3ZSBhZGRlZCB0aGUgY29tbWVudCBvawoJCQkJLy8gTm90ZTogdXNpbmcgZW1wdHkgYXJyYXkgYXMgd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBhZGQgYW55IGZpbGVzCgkJCQlpZiAoIDAgIT09ICggJGxpc3QgPSAkemEtPmFkZCggYXJyYXkoKSwgUENMWklQX09QVF9DT01NRU5ULCAkY29tbWVudCApICkgKSB7CgkJCQkKCQkJCQkvLyBXZSBnb3QgYSBsaXN0IGJhY2sgc28gYWRkaW5nIGNvbW1lbnQgc2hvdWxkIGhhdmUgYmVlbiBzdWNjZXNzZnVsCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUGNsWmlwIHNldCBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gSWYgd2UgZmFpbGVkIHRvIHNldCB0aGUgY29tbW5lbnQgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oIHRydWUgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdQY2xaaXAgZmFpbGVkIHRvIHNldCBjb21tZW50IGluIGZpbGUgJTEkcyAtIEVycm9yIEluZm86ICUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCQkJCQoJCQkJfQoJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkKCQl9CgoJCS8qCWdldF9jb21tZW50KCkKCQkgKgkKCQkgKglSZXRyaWV2ZSBhcmNoaXZlIGNvbW1lbnQuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byByZXRyaWV2ZSBjb21tZW50IGZyb20uCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCWZhbHNlIG9uIGZhaWx1cmUsIFppcCBjb21tZW50IG90aGVyd2lzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2NvbW1lbnQoICR6aXBfZmlsZSApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkemEgPSBOVUxMOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1BjbFppcCggJHppcF9maWxlICk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCBwY2x6aXAgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3BjbHppcCBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvayBhbmQgaXQgaGFzIHByb3BlcnRpZXMKCQkJCWlmICggMCAhPT0gKCAkcHJvcGVydGllcyA9ICR6YS0+cHJvcGVydGllcygpICkgKSB7CgkJCQkKCQkJCQkvLyBXZSBnb3QgcHJvcGVydGllcyBzbyBzaG91bGQgaGF2ZSBhIGNvbW1lbnQgdG8gcmV0dXJuLCBldmVuIGlmIGVtcHR5CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUGNsWmlwIHJldHJpZXZlZCBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJJHJlc3VsdCA9ICRwcm9wZXJ0aWVzWyAnY29tbWVudCcgXTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggdHJ1ZSApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1BjbFppcCBmYWlsZWQgdG8gcmV0cmlldmUgY29tbWVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCgkJfQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJ6aXBwY2x6aXAgY2xhc3MuCQoJCn0KPz4K
###PACKDATA,FILE_END,/lib/zipbuddy/zbzippclzip.php,importbuddy/lib/zipbuddy/zbzippclzip.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzipproc.php,importbuddy/lib/zipbuddy/zbzipproc.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwcHJvYyBDbGFzcwogKgogKiAgRXh0ZW5kcyB0aGUgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcyB3aXRoIHByb2Mgc3BlY2lmaWMgY2FwYWJpbGl0eQogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcHByb2MiICkgKSB7CgoJY2xhc3MgcGx1Z2luYnVkZHlfemJ6aXBwcm9jIGV4dGVuZHMgcGx1Z2luYnVkZHlfemJ6aXBjb3JlIHsKCQoJCS8vIENvbnN0YW50cyBmb3IgZmlsZSBoYW5kbGluZwoJCWNvbnN0IFpJUF9MT0dfRklMRV9OQU1FICAgICAgICA9ICd0ZW1wX3ppcF9wcm9jX2xvZy50eHQnOwoJCWNvbnN0IFpJUF9FUlJPUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X3Byb2NfZXJyb3JzLnR4dCc7CgkJY29uc3QgWklQX1dBUk5JTkdTX0ZJTEVfTkFNRSAgID0gJ2xhc3RfcHJvY193YXJuaW5ncy50eHQnOwoJCWNvbnN0IFpJUF9PVEhFUlNfRklMRV9OQU1FICAgICA9ICdsYXN0X3Byb2Nfb3RoZXJzLnR4dCc7CgkJY29uc3QgWklQX0VYQ0xVU0lPTlNfRklMRV9OQU1FID0gJ2V4Y2x1c2lvbnMudHh0JzsKCQljb25zdCBaSVBfSU5DTFVTSU9OU19GSUxFX05BTUUgPSAnaW5jbHVzaW9ucy50eHQnOwoJCgkJLy8gUG9zc2libGUgZXhlY3V0YWJsZSBwYXRoIHNldHMKCQljb25zdCBERUZBVUxUX0VYRUNVVEFCTEVfUEFUSFMgPSAnL3Vzci9sb2NhbC9iaW46Oi91c3IvYmluOi91c3IvbG9jYWwvc2JpbjovdXNyL3NiaW46L3NiaW46L2Jpbic7CgkJY29uc3QgV0lORE9XU19FWEVDVVRBQkxFX1BBVEhTID0gJyc7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogbWV0aG9kIHRhZyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBtZXRob2QgYW5kIGVudGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdCBzdWNoIGFzIGNsYXNzIG5hbWUKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwoJCXB1YmxpYyBzdGF0aWMgJF9tZXRob2RfdGFnID0gJ3Byb2MnOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgdGVsbHMgdXMgd2hldGhlciB0aGlzIG1ldGhvZCBpcyByZWdhcmRlZCBhcyBhICJjb21wYXRpYmlsaXR5IiBtZXRob2QKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGJvb2wKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgPSBmYWxzZTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHRlbGxzIHVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtZXRob2Qgc28gdGhleSBjYW4gYmUgY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXRob2QgY2FuIGJlIHN1cHBvcnRlZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfbWV0aG9kX2RlcGVuZGVuY2llcyA9IGFycmF5KCAnY2xhc3NlcycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdmdW5jdGlvbnMnID0+IGFycmF5KCAncHJvY19vcGVuJywgJ3Byb2NfY2xvc2UnLCAncHJvY19nZXRfc3RhdHVzJywgJ3Byb2NfdGVybWluYXRlJyApLAoJCQkJCQkJCQkJCSAgCQkgJ2V4dGVuc2lvbnMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnZmlsZXMnID0+IGFycmF5KCksCgkJCQkJCQkJCQkJICAJCSAnY2hlY2tfZnVuYycgPT4gJ2NoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljJwoJCQkJCQkJCQkJCQkJKTsKCQkJCgkJLyoqCgkJICogCgkJICogZ2V0X21ldGhvZF90YWdfc3RhdGljKCkKCQkgKgoJCSAqIEdldCB0aGUgc3RhdGljIG1ldGhvZCB0YWcgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJc3RyaW5nCVRoZSBtZXRob2QgdGFnCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZXRob2RfdGFnX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfbWV0aG9kX3RhZzsKCQkJCgkJfQoKCQkvKioKCQkgKiAKCQkgKiBnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Rfc3RhdGljKCkKCQkgKgoJCSAqIEdldCB0aGUgY29tcGF0aWJpbGl0eSBtZXRob2QgaW5kaWNhdG9yIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBpcyBhIGNvbXBhdGliaWxpdHkgbWV0aG9kCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZF9zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kOwoJCQkKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpCgkJICoKCQkgKiBHZXQgdGhlIG1ldGhvZCBkZXBlbmRlbmNpZXMgYXJyYXkgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYXJyYXkJVGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kIHRoYXQgaXMgcmVxdWlyZXMgdG8gYmUgYSBzdXBwb3J0ZWQgbWV0aG9kCgkJICoKCQkgKi8KCQlwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfbWV0aG9kX2RlcGVuZGVuY2llczsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqIAoJCSAqIGNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljKCkKCQkgKgoJCSAqIEFsbG93cyBhZGRpdGlvbmFsIG1ldGhvZCBkZXBlbmRlbmN5IGNoZWNrcyBiZXlvbmQgdGhlIHN0YW5kYXJkIGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWJvb2wJVHJ1ZSBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY3kgY2hlY2tzIHBhc3NlZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYygpIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkKCQkJLy8gTmVlZCB0byBhZGRpdGlvbmFsbHkgY2hlY2sgdGhlIE9TIC0gbmVlZCAqbml4IHR5cGUgYXQgbGVhc3QKCQkJCQoJCQkvLyBVc2UgVUMgZm9yIGVhc2UgLSB0aGlzIF9zaG91bGQgbm90PyBjYXVzZSBhbnkgYW1iaWd1aXR5CgkJCSRvc19uYW1lID0gc3RydG91cHBlciggUEhQX09TICk7CgkgCgkJCS8vIEN1cnJlbnRseSB3ZSdsbCBhc3N1bWUgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGxvb2sgbGlrZSBXaW5kb3dzIGlzICpuaXggYmFzZWQKCQkJaWYgKCAhKCBzdWJzdHIoICRvc19uYW1lLCAwLCAzICkgPT09ICdXSU4nKSApIHsKCQkJCgkJCQkvLyBXZSdyZSBvayBhcyBtZWV0IGRlcGVuZGVuY3kgdGhhdCB0aGlzIGlzbid0IFdpbmRvd3MgYmFzZWQgT1MKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkKCQkJfQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCgkJLyoqCgkJICoJX19jb25zdHJ1Y3QoKQoJCSAqCQoJCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkJICoJCgkJICoJQHBhcmFtCQlyZWZlcmVuY2UJJiRwYXJlbnQJCVtvcHRpb25hbF0gUmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdHVzKCkgZnVuY3Rpb24gZm9yIHN0YXR1cyB1cGRhdGVzLgoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJiRwYXJlbnQgPSBOVUxMICkgewoKCQkJcGFyZW50OjpfX2NvbnN0cnVjdCggJHBhcmVudCApOwoJCQkKCQkJLy8gT3ZlcnJpZGUgc29tZSBvZiBwYXJlbnQgZGVmYXVsdHMKCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0gPSBhcnJheV9tZXJnZSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF0sCgkJCQkJCQkJCQkJCQkJCWFycmF5KCAnbmFtZScgPT4gJ1Byb2MgTWV0aG9kJywKCQkJCQkJCQkJCQkJCSAgCQkJICAgJ2NvbXBhdGliaWxpdHknID0+IHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QgKQoJCQkJCQkJCQkJCQkJICAJICAgKTsKCgkJCS8vIE5vdyBzZXQgdXAgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSBwYXRocyAobm90IG1lcmdpbmcgYnV0IHNldHRpbmcpCgkJCS8vIE5vdGU6IFBhcmVudCBjb25zdHJ1Y3RvciBzZXQgdGhlIG9zIHR5cGUgdmFsdWUKCQkJc3dpdGNoICggJHRoaXMtPmdldF9vc190eXBlKCkgKSB7CgkJCQoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQoJCQkJCSR0aGlzLT5zZXRfZXhlY3V0YWJsZV9wYXRocyggZXhwbG9kZSggUEFUSF9TRVBBUkFUT1IsIHNlbGY6OkRFRkFVTFRfRVhFQ1VUQUJMRV9QQVRIUyApLCBmYWxzZSk7CgkJCQkJYnJlYWs7CgkJCQkJCgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCQoJCQkJCSR0aGlzLT5zZXRfZXhlY3V0YWJsZV9wYXRocyggZXhwbG9kZSggUEFUSF9TRVBBUkFUT1IsIHNlbGY6OldJTkRPV1NfRVhFQ1VUQUJMRV9QQVRIUyApLCBmYWxzZSk7CgkJCQkJCgkJCQkJLy8gTmVlZCB0byBtZXJnZSBpbiBBQlNQQVRIIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3Qgc2V0IHRoYXQgaW4gdGhlIGRlZmF1bHRzIC0gaXQgaXMgcHJlcGVuZGVkCgkJCQkJJHRoaXMtPnNldF9leGVjdXRhYmxlX3BhdGhzKCBhcnJheSggcnRyaW0oIEFCU1BBVEgsIERJUkVDVE9SWV9TRVBBUkFUT1IgKSApICk7CgkJCQkJYnJlYWs7CgkJCQkJCgkJCQlkZWZhdWx0OgoJCQkJCS8vIExvZyBlcnJvciBhbmQgbGVhdmUgcGF0aHMgZW1wdHkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmtub3duIE9TIHR5cGUgKCUxJHMpIGNvdWxkIG5vdCBzZXQgZXhlY3V0YWJsZSBwYXRocycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgKTsKCQkJCQkKCQkJfQoJCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCApIHsKCQkKCQkJcGFyZW50OjpfX2Rlc3RydWN0KCk7CgoJCX0KCQkKCQkvKioKCQkgKglnZXRfbWV0aG9kX3RhZygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgKHN0YXRpYykgbWV0aG9kIHRhZwoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZyBUaGUgbWV0aG9kIHRhZwoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9tZXRob2RfdGFnKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9tZXRob2RfdGFnOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSAoc3RhdGljKSBpc19jb21wYXRpYmlsaXR5X21ldGhvZCBib29sZWFuCgkJICoJCgkJICoJQHJldHVybgkJYm9vbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfY29tbWFuZF9wYXRoKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdGhlIHBhdGggZm9yIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCBmcm9tIHRoZSBtZXRob2QgZGV0YWlscwoJCSAqCUlmIG5vdCBmb3VuZCB0aGVuIHdpbGwgcmV0dXJuIGVtcHR5IHN0cmluZyB3aGljaCBpcyB0aGUgc2FtZSBhcyBpZiB0aGUKCQkgKgljb21tYW5kIGlzIGJlaW5nIGFjY2Vzc2VkIHRocm91Z2ggUEFUSAoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZwkJCQlQYXRoIGZvciBjb21tYW5kLCB0cmltbWVkIC0gbWF5IGJlIGVtcHR5CgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0X2NvbW1hbmRfcGF0aCggJGNvbW1hbmQgPSBzZWxmOjpDT01NQU5EX1VOS05PV05fUEFUSCApIHsKCQkKCQkJJHJlc3VsdCA9ICcnOwoJCQkKCQkJc3dpdGNoKCAkY29tbWFuZCApIHsKCQkJCgkJCQljYXNlIHNlbGY6OkNPTU1BTkRfWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApICkgewoJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJpbSggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSApOwoJCQkJCX0KCQkJCQkKCQkJCQlicmVhazsKCQkJCQoJCQkJY2FzZSBzZWxmOjpDT01NQU5EX1VOWklQX1BBVEg6CgkJCQkKCQkJCQkvLyBJZiB0aGVyZSBpcyBhIGNvbW1vbiBwYXRoIHVzZSBpdCBvdGhlcndpc2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgc3BlY2lmaWMgcGF0aAoJCQkJCWlmICggaXNzZXQoICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKSApIHsKCQkJCQkKCQkJCQkJJHJlc3VsdCA9IHRyaW0oICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gKTsKCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBpc3NldCggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdwYXRoJyBdICkgKSB7CgkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cmltKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd1bnppcCcgXVsgJ3BhdGgnIF0gKTsKCQkJCQl9CgkJCQkJCgkJCQkJYnJlYWs7CgkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkKCQkJCQkvLyBSZXR1cm4gdGhlIGVtcHR5IHN0cmluZyBkZWZhdWx0IGZvciBub3cKCQkJCgkJCX0KCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgc2V0cyB0aGUgemlwIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIG1ldGhvZCBkZXRhaWxzCgkJICoJTm90ZTogcHJlLXYzIHppcCBydW5uaW5nICJ6aXAgLXYiIHdpbGwgbm90IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dCBiZWNhdXNlCgkJICoJdGhlcmUgaXMgbm8gdHR5IGF0dGFjaGVkICh3aGVuIHJ1bm5pbmcgdGhyb3VnaCBleGVjKCkgb3IgZXF1aXZhbGVudCksIGluc3RlYWQKCQkgKglpdCB3aWxsIHByb2R1Y2UgYSB6aXAgZmlsZS5DdXJyZW50bHkgd2UnbGwganVzdCBkZXRlY3QgdGhhdCBhbmQgc2V0IHRoZSB2ZXJzaW9uCgkJICoJYXMgMi4wIGFuZCBub3Qgc2V0IHRoZSBpbmZvLgoJCSAqCVRPRE86IFdlIGNvdWxkIHBhcnNlIHRoZSB6aXAgZmlsZSB0byBnZXQgdGhlIHZlcnNpb24gYnV0IGFsc28gY29uc2lkZXJpbmcgZG9pbmcKCQkgKgl0aGF0IGluIHRoZSBpc19hdmFpbGFibGUoKSB0ZXN0IHdoZXJlIHdlIGFscmVhZHkgY3JlYXRlZCBhIHppcCBmaWxlLgoJCSAqCVRPRE86IENvbnNpZGVyIHRlc3RpbmcgaWYgbWV0aG9kIGNhbiB6aXAgYW5kIG9ubHkgdGhlbiBydW4gdGhlIHRlc3QKCQkgKglUT0RPOiBUaGlzIG5lZWRzIHJlZmFjdG9yaW5nIHRvIG1ha2UgaXQgY2xlYW5lcgoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfemlwX3ZlcnNpb24oICRtYWpvciA9IDAsICRtaW5vciA9IDAsICRvdmVycmlkZSA9IGZhbHNlICkgewoJCQoJCQkkZXhpdGNvZGUgPSAxMjc7CgkJCSRvdXRwdXQgPSBhcnJheSgpOwoJCQkkemlwcGF0aCA9ICcnOwoJCQkkY29tbWFuZCA9ICcnOwoJCQkkbWF0Y2hlcyA9IGFycmF5KCk7CgkJCSRpbmZvID0gJyc7CgkJCgkJCS8vIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhIHZhbHVlIHRvIHVzZSB3aXRoIG92ZXJyaWRlIHRoZW4ganVzdCB1c2UgaXQKCQkJaWYgKCAoICggaXNfaW50KCAkbWFqb3IpICkgJiYgKCAwIDwgJG1ham9yICkgJiYgKCBpc19pbnQoICRtaW5vciApICkgKSAmJiAoIHRydWUgPT09ICRvdmVycmlkZSApICkgewoJCQkKCQkJCS8vIFNldCB0aGUgZ2l2ZW4gdmVyc2lvbiByZWdhcmRsZXNzCgkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdID0gYXJyYXkoICdtYWpvcicgPT4gJG1ham9yLCAnbWlub3InID0+ICRtaW5vciApOwoJCQkJcmV0dXJuICR0aGlzOyAKCQkJCgkJCX0KCQkJCgkJCS8vIEdldCB0aGUgY29tbWFuZCBwYXRoIGZvciB0aGUgemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9aSVBfUEFUSCApOwoJCQkKCQkJLy8gQWRkIHRoZSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAoJCQkkY29tbWFuZCA9ICR0aGlzLT5zbGFzaGlmeSggJHppcHBhdGggKSAuICd6aXAgLXYnOwoJCQkKCQkJLy9AZXhlYyggJGNvbW1hbmQsICRvdXRwdXQsICRleGl0Y29kZSApOwoJCQkKCQkJLy8gR2V0IGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlIGZvciBjb21tYW5kIG91dHB1dAoJCQkkb3V0ZmlsZV9uYW1lID0gdGVtcG5hbSggc3lzX2dldF90ZW1wX2RpcigpLCB1bmlxaWQoICdwYl8nICkgKTsKCQkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoaXMgaWYgd2UgaGF2ZSBhIGZpbGUgd2UgY2FuIHdyaXRlIHRvCgkJCWlmICggaXNfc3RyaW5nKCAkb3V0ZmlsZV9uYW1lICkgJiYgaXNfd3JpdGFibGUoICRvdXRmaWxlX25hbWUgKSApIHsgCgkJCQoJCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoCgkJCQkJMCA9PiBhcnJheSggInBpcGUiLCAiciIgKSwKCQkJCQkxID0+IGFycmF5KCAiZmlsZSIsICRvdXRmaWxlX25hbWUsICJ3IiApLAoJCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgIi9kZXYvbnVsbCIsICJhIiApCQoJCQkJKTsKCQkJCQoJCQkJJHByb2Nlc3MgPSBOVUxMOyAvLyBNYXliZSBpdCBkb2Vzbid0IHdvcmsKCQkJCQoJCQkJJHByb2Nlc3MgPSBAcHJvY19vcGVuKCAkY29tbWFuZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMgKTsKCQkJCQoJCQkJaWYgKCBpc19yZXNvdXJjZSggJHByb2Nlc3MgKSApIHsKCQkJCQoJCQkJCWZjbG9zZSggJHBpcGVzWzBdICk7IC8vIE5ldmVyIHdhbnQgdG8gc2VuZCBpbnB1dCBzbyBqdXN0IGNsb3NlIGl0CgkJCQkJCgkJCQkJJHBzdGF0dXMgPSBwcm9jX2dldF9zdGF0dXMoICRwcm9jZXNzICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHdlIG9ubHkgZG8gNCBsb29wIG1heAoJCQkJCSRjb3VudCA9IDA7CgkJCQkJCgkJCQkJd2hpbGUgKCB0cnVlID09ICRwc3RhdHVzWyAncnVubmluZyddICYmICggJGNvdW50KysgPCA0ICkgKSB7CgkJCQkJCXVzbGVlcCggNTAwMDAwICk7CgkJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCX0KCQkJCQkKCQkJCQlpZiAoIHRydWUgPT09ICRwc3RhdHVzWyAncnVubmluZycgXSApIHsKCQkJCQkJLy8gSG1tLCBzaG91bGRuJ3Qgc3RpbGwgYmUgcnVubmluZywgdHJ5IHRvIGtpbGwgaXQgYW5kIG1vdmUgb24KCQkJCQkJQHByb2NfdGVybWluYXRlKCAkcHJvY2VzcyApOwoJCQkJCQkKCQkJCQkJLy8gR2V0IHN0YXR1cyBhZ2FpbiBhbmQgc2VlIGlmIG5vdyBub3QgcnVubmluZywgaWYgc28gZ2V0IGV4aXQgY29kZQoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBQcm9jZXNzIGZpbmlzaGVkIG5vcm1hbGx5IHNvIGdldCBleGl0IGNvZGUgZm9yIHBvc3NpYmxlIHVzZQoJCQkJCQkkZXhpdGNvZGUgPSAkcHN0YXR1c1sgJ2V4aXRjb2RlJyBdOwoJCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gSWdub3JlIGFueSBjbG9zZSBpc3N1ZSwgc2hvdWxkbid0IGdldCBzdHVjayBoZXJlIGJ1dCBpdCBpcyBwb3NzaWJsZSBpZgoJCQkJCS8vIHdlIHByb2Nlc3Mgd2FzIHN0aWxsIHJ1bm5pbmcgYW5kIHdlIGZhaWxlZCB0byB0ZXJtaW5hdGUgaXQgLSB0cmlja3kgb25lCgkJCQkJLy8gdG8gb3ZlcmNvbWUgYnV0IF9zaG91bGRfIGJlIHJhcmUKCQkJCQlAcHJvY19jbG9zZSggJHByb2Nlc3MgKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJCQoJCQkvLyBOb3RlOiBpZiB3ZSBjb3VsZG4ndCBjcmVhdGUgYSBwcm9jZXNzIGp1c3QgZmFsbCB0aHJvdWdoIHNpbGVudGx5CgkJCQoJCQlpZiAoIDAgPT09ICRleGl0Y29kZSApIHsKCQkJCgkJCQkvLyBQdXQgdGhlIGZpbGUgY29udGVudCBpbnRvIGFuIGFycmF5CgkJCQl0cnkgewoJCQkJCgkJCQkJJG91dGZpbGUgPSBuZXcgU3BsRmlsZU9iamVjdCggJG91dGZpbGVfbmFtZSwgInJiIiApOwoJCQkJCQoJCQkJCXdoaWxlKCAhJG91dGZpbGUtPmVvZigpICkgewoJCQkJCQoJCQkJCQkvLyBOZWVkIHRvIHRyaW0gbGluZSBlbmRpbmdzIGJlY2F1c2Ugb2YgaW1wbG9kaW5nIHdpdGggUEhQX0VPTCBsYXRlcgoJCQkJCQkkb3V0cHV0W10gPSBydHJpbSggJG91dGZpbGUtPmN1cnJlbnQoKSApOwoJCQkJCQkkb3V0ZmlsZS0+bmV4dCgpOwoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQl1bnNldCggJG91dGZpbGUgKTsKCQkJCQkKCQkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQkKCQkJCQkvLyBNYXliZSB0aGUgZmlsZSBkaWRuJ3QgZXhpc3QgZm9yIHNvbWUgcmVhc29uPwoJCQkJCS8vIEluIGFueSBjYXNlIGp1c3QgZmFsbCB0aHJvdWdoIHNpbGVudGx5CgkJCQkJCgkJCQl9CgkJCQoJCQkJLy8gU2hvdWxkIGJlIGdvb2Qgb3V0cHV0IHRvIHRyeSBhdCBsZWFzdAoJCQkJLy8gSWYgdGhpcyBoYXMgYSB6aXAgZmlsZSBzaWduYXR1cmUgdGhlbiBpdCBtdXN0IGJlIHByZS12MyB6aXAKCQkJCSR6X2RhdGEgPSB1bnBhY2soICdWc2lnJywgJG91dHB1dFswXSApOwoJCQkKCQkJCWlmICggMHgwNDAzNGI1MCA9PSAkel9kYXRhWyAnc2lnJyBdICkgewoJCQkJCgkJCQkJLy8gVE9ETzogQ29uc2lkZXIgdGhhdCB3ZSBjb3VsZCB1c2UgdW56aXAgLVogLXYgb24gdGhpcyBmaWxlIGFuZCBwYXJzZSB0aGUKCQkJCQkvLyBvdXRwdXQgZm9yIHRoZSBDZW50cmFsIERpciBpbmZvIG9uIHdoYXQgdmVyc2lvbiBvZiB6aXAgY3JlYXRlZCB0aGUgZmlsZS4KCQkJCQkvLyBDdXJyZW50bHksIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB3ZSBkb24ndCBrbm93IGlmIHdlIGhhdmUgdW56aXAKCQkJCQkvLyBzbyB3ZSBjYW4ndCBhc3N1bWUgLSB3aXRoIGEgcmVqaWcgd2UgY291bGQgY2FsbCB0aGlzIGxhdGVyIGFuZCB1c2UgdW56aXAKCQkJCQkvLyBpZiBhdmFpbGFibGUuCgkJCQkJLy8gQ2FuJ3QgdGVsbCB3aGljaCAyLlggdmVyc2lvbiwgY2Fubm90IHBvcHVsYXRlICRpbmZvCgkJCQkJJG1ham9yID0gMjsKCQkJCQkkbWlub3IgPSAwOwoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIERvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgemlwIGZpbGUgc28gc2hvdWxkIGJlIHZlcnNpb24gaW5mbwoJCQkJCS8vIEV4cGVjdCBmb3JtYXQgbGlrZTogVGhpcyBpcyBaaXAgMy4wIChKdWx5IDV0aCAyMDA4KS4uLgoJCQkJCS8vICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBaaXAgMy4xYyBCRVRBIChKdW5lIDIybmQgMjAxMCkuLi4KCQkJCQkvLyBUaGUgbWF0Y2ggc2hvdWxkIHRha2Ugb25seSB0aGUgbWFqb3IvbWlub3IgZGlnaXRzIGFuZCBpZ25vcmUgYW55IGZvbGxvd2luZyBhbHBoYQoJCQkJCS8vIE1heSBleHRlbmQgdG8gY2FwdHVyZSB0aGUgYWxwaGEgYW5kIGFsc28gd2hldGhlciBCRVRBIGluZGljYXRlZCBidXQgbm90IGN1cnJlbnRseQoJCQkJCS8vIHJlcXVpcmVkLgoJCQkJCWZvcmVhY2ggKCAkb3V0cHV0IGFzICRsaW5lICkgewoJCgkJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHRoaXMpXHMrKGlzKVxzKyh6aXApXHMrKD9QPG1ham9yPlxkKVwuKD9QPG1pbm9yPlxkKykvaScsICRsaW5lLCAkbWF0Y2hlcyApICkgewoJCQkJCQkKCQkJCQkJCSRtYWpvciA9IChpbnQpJG1hdGNoZXNbICdtYWpvcicgXTsKCQkJCQkJCSRtaW5vciA9IChpbnQpJG1hdGNoZXNbICdtaW5vcicgXTsKCQkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkvLyBJZiB3ZSBkaWRuJ3QgbWF0Y2ggYSB2ZXJzaW9uIHRoZW4gc3VzcGVjdCB0aGlzIGlzIHN0aWxsIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm8KCQkJCQlpZiAoICFlbXB0eSggJG1hdGNoZXMgKSApIHsKCQkJCQkKCQkJCQkJLy8gTm93IGNyZWF0ZSB0aGUgaW5mbyBzdHJpbmcKCQkJCQkJLy8gTm90ZTogbm90IHdvcnRoIGNvbXByZXNzaW5nIGFzIHRoYXQgZ2l2ZXMgYSBsYXJnZXIgc3RyaW5nIGFmdGVyIGNvbnZlcnRpbmcKCQkJCQkJLy8gZnJvbSBiaW5hcnkgdG8gaGV4IGZvcm1hdCBmb3Igc2F2aW5nCgkJCQkJCSRpbmZvID0gaW1wbG9kZSggUEhQX0VPTCwgJG91dHB1dCApOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICdpbmZvJyBdID0gJGluZm87CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gTm93IHVzZSBlaXRoZXIgd2hhdCB3ZSBnb3Qgb3Igd2hhdCB3ZSB3ZXJlIGdpdmVuLi4uCgkJCWlmICggKCBpc19pbnQoICRtYWpvcikgKSAmJiAoIDAgPCAkbWFqb3IgKSAmJiAoIGlzX2ludCggJG1pbm9yICkgKSApIHsKCQkJCgkJCQkvLyBTZXQgdGhlIGdpdmVuIHZlcnNpb24gcmVnYXJkbGVzcwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAndmVyc2lvbicgXSA9IGFycmF5KCAnbWFqb3InID0+ICRtYWpvciwgJ21pbm9yJyA9PiAkbWlub3IgKTsKCQkJCgkJCX0KCQkJCgkJCS8vIENhdGNoLWFsbCBjbGVhbnVwIG9mIHRoZSBvdXRwdXQgZmlsZQoJCQlpZiAoIEBmaWxlX2V4aXN0cyggJG91dGZpbGVfbmFtZSApICkgewoJCQkKCQkJCUB1bmxpbmsoICRvdXRmaWxlX25hbWUgKTsKCQkJCQoJCQl9CgkJCQoJCQlyZXR1cm4gJHRoaXM7IAoJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfemlwX3ZlcnNpb24oKQoJCSAqCQoJCSAqCVRoaXMgZ2V0cyB0aGUgemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfdmVyc2lvbigpIHsKCQkKCQkJJHJlc3VsdCA9ICR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3ppcCcgXVsgJ3ZlcnNpb24nIF07CgkJCQoJCQlpZiAoIDAgPT09ICRyZXN1bHRbICdtYWpvcicgXSApIHsKCQkJCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglzZXRfdW56aXBfdmVyc2lvbigpCgkJICoJCgkJICoJVGhpcyBzZXRzIHRoZSB6aXAgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgbWV0aG9kIGRldGFpbHMKCQkgKglUT0RPOiBUaGlzIG5lZWRzIHJlZmFjdG9yaW5nIHRvIG1ha2UgaXQgY2xlYW5lcgoJCSAqCQoJCSAqCUBwYXJhbQkJaW50CQkkbWFqb3IJCVZhbHVlIHRvIHVzZSBpZiBub25lIGZvdW5kIG9yIG92ZXJyaWRlIHRydWUKCQkgKglAcGFyYW0JCWludAkJJG1pbm9yCQlWYWx1ZSB0byB1c2UgaWYgbm9uZSBmb3VuZCBvciBvdmVycmlkZSB0cnVlCgkJICoJQHBhcmFtCQlib29sCSRvdmVycmlkZQlUcnVlIHRvIHVzZSBwYXNzZWQgaW4gdmFsdWUocykgcmVnYXJkbGVzcwoJCSAqCUByZXR1cm4JCW9iamVjdAkJCQlUaGlzIG9iamVjdCByZWZlcmVuY2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfdW56aXBfdmVyc2lvbiggJG1ham9yID0gMCwgJG1pbm9yID0gMCwgJG92ZXJyaWRlID0gZmFsc2UgKSB7CgkJCgkJCSRleGl0Y29kZSA9IDEyNzsKCQkJJG91dHB1dCA9IGFycmF5KCk7CgkJCSR6aXBwYXRoID0gJyc7CgkJCSRjb21tYW5kID0gJyc7CgkJCSRtYXRjaGVzID0gYXJyYXkoKTsKCQkJJGluZm8gPSAnJzsKCQkKCQkJLy8gSWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgdmFsdWUgdG8gdXNlIHdpdGggb3ZlcnJpZGUgdGhlbiBqdXN0IHVzZSBpdAoJCQlpZiAoICggKCBpc19pbnQoICRtYWpvcikgKSAmJiAoIDAgPCAkbWFqb3IgKSAmJiAoIGlzX2ludCggJG1pbm9yICkgKSApICYmICggdHJ1ZSA9PT0gJG92ZXJyaWRlICkgKSB7CgkJCQoJCQkJLy8gU2V0IHRoZSBnaXZlbiB2ZXJzaW9uIHJlZ2FyZGxlc3MKCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAndmVyc2lvbicgXSA9IGFycmF5KCAnbWFqb3InID0+ICRtYWpvciwgJ21pbm9yJyA9PiAkbWlub3IgKTsKCQkJCXJldHVybiAkdGhpczsgCgkJCQoJCQl9CgkJCQoJCQkvLyBHZXQgdGhlIGNvbW1hbmQgcGF0aCBmb3IgdGhlIHVuemlwIGNvbW1hbmQgLSBzaG91bGQgcmV0dXJuIGEgdHJpbW1lZCBzdHJpbmcKCQkJJHppcHBhdGggPSAkdGhpcy0+Z2V0X2NvbW1hbmRfcGF0aCggc2VsZjo6Q09NTUFORF9VTlpJUF9QQVRIICk7CgkJCQoJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3VuemlwIC12JzsKCQkJCgkJCS8vQGV4ZWMoICRjb21tYW5kLCAkb3V0cHV0LCAkZXhpdGNvZGUgKTsKCQkJCgkJCS8vIEdldCBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZSBmb3IgY29tbWFuZCBvdXRwdXQKCQkJJG91dGZpbGVfbmFtZSA9IHRlbXBuYW0oIHN5c19nZXRfdGVtcF9kaXIoKSwgdW5pcWlkKCAncGJfJyApICk7CgkJCQoJCQkvLyBNYWtlIHN1cmUgd2Ugb25seSBkbyB0aGlzIGlmIHdlIGhhdmUgYSBmaWxlIHdlIGNhbiB3cml0ZSB0bwoJCQlpZiAoIGlzX3N0cmluZyggJG91dGZpbGVfbmFtZSApICYmIGlzX3dyaXRhYmxlKCAkb3V0ZmlsZV9uYW1lICkgKSB7IAoJCQkKCQkJCSRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KAoJCQkJCTAgPT4gYXJyYXkoICJwaXBlIiwgInIiICksCgkJCQkJMSA9PiBhcnJheSggImZpbGUiLCAkb3V0ZmlsZV9uYW1lLCAidyIgKSwKCQkJCQkyID0+IGFycmF5KCAiZmlsZSIsICIvZGV2L251bGwiLCAiYSIgKQkKCQkJCSk7CgkJCQkKCQkJCSRwcm9jZXNzID0gTlVMTDsgLy8gTWF5YmUgaXQgZG9lc24ndCB3b3JrCgkJCQkKCQkJCSRwcm9jZXNzID0gQHByb2Nfb3BlbiggJGNvbW1hbmQsICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzICk7CgkJCQkKCQkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQkKCQkJCQlmY2xvc2UoICRwaXBlc1swXSApOyAvLyBOZXZlciB3YW50IHRvIHNlbmQgaW5wdXQgc28ganVzdCBjbG9zZSBpdAoJCQkJCQoJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIDQgbG9vcCBtYXgKCQkJCQkkY291bnQgPSAwOwoJCQkJCQoJCQkJCXdoaWxlICggdHJ1ZSA9PSAkcHN0YXR1c1sgJ3J1bm5pbmcnXSAmJiAoICRjb3VudCsrIDwgNCApICkgewoJCQkJCQl1c2xlZXAoIDUwMDAwMCApOwoJCQkJCQkkcHN0YXR1cyA9IHByb2NfZ2V0X3N0YXR1cyggJHByb2Nlc3MgKTsKCQkJCQl9CgkJCQkJCgkJCQkJaWYgKCB0cnVlID09PSAkcHN0YXR1c1sgJ3J1bm5pbmcnIF0gKSB7CgkJCQkJCS8vIEhtbSwgc2hvdWxkbid0IHN0aWxsIGJlIHJ1bm5pbmcsIHRyeSB0byBraWxsIGl0IGFuZCBtb3ZlIG9uCgkJCQkJCUBwcm9jX3Rlcm1pbmF0ZSggJHByb2Nlc3MgKTsKCQkJCQkJCgkJCQkJCS8vIEdldCBzdGF0dXMgYWdhaW4gYW5kIHNlZSBpZiBub3cgbm90IHJ1bm5pbmcsIGlmIHNvIGdldCBleGl0IGNvZGUKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gUHJvY2VzcyBmaW5pc2hlZCBub3JtYWxseSBzbyBnZXQgZXhpdCBjb2RlIGZvciBwb3NzaWJsZSB1c2UKCQkJCQkJJGV4aXRjb2RlID0gJHBzdGF0dXNbICdleGl0Y29kZScgXTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgaXNzdWUsIHNob3VsZG4ndCBnZXQgc3R1Y2sgaGVyZSBidXQgaXQgaXMgcG9zc2libGUgaWYKCQkJCQkvLyB3ZSBwcm9jZXNzIHdhcyBzdGlsbCBydW5uaW5nIGFuZCB3ZSBmYWlsZWQgdG8gdGVybWluYXRlIGl0IC0gdHJpY2t5IG9uZQoJCQkJCS8vIHRvIG92ZXJjb21lIGJ1dCBfc2hvdWxkXyBiZSByYXJlCgkJCQkJQHByb2NfY2xvc2UoICRwcm9jZXNzICk7CgkJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gTm90ZTogaWYgd2UgY291bGRuJ3QgY3JlYXRlIGEgcHJvY2VzcyBqdXN0IGZhbGwgdGhyb3VnaCBzaWxlbnRseQoJCQkKCQkJaWYgKCAwID09PSAkZXhpdGNvZGUgKSB7CgkJCQoJCQkJLy8gUHV0IHRoZSBmaWxlIGNvbnRlbnQgaW50byBhbiBhcnJheQoJCQkJdHJ5IHsKCQkJCQoJCQkJCSRvdXRmaWxlID0gbmV3IFNwbEZpbGVPYmplY3QoICRvdXRmaWxlX25hbWUsICJyYiIgKTsKCQkJCQkKCQkJCQl3aGlsZSggISRvdXRmaWxlLT5lb2YoKSApIHsKCQkJCQkKCQkJCQkJLy8gTmVlZCB0byB0cmltIGxpbmUgZW5kaW5ncyBiZWNhdXNlIG9mIGltcGxvZGluZyB3aXRoIFBIUF9FT0wgbGF0ZXIKCQkJCQkJJG91dHB1dFtdID0gcnRyaW0oICRvdXRmaWxlLT5jdXJyZW50KCkgKTsKCQkJCQkJJG91dGZpbGUtPm5leHQoKTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJdW5zZXQoICRvdXRmaWxlICk7CgkJCQkJCgkJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkJCgkJCQkJLy8gTWF5YmUgdGhlIGZpbGUgZGlkbid0IGV4aXN0IGZvciBzb21lIHJlYXNvbj8KCQkJCQkvLyBJbiBhbnkgY2FzZSBqdXN0IGZhbGwgdGhyb3VnaCBzaWxlbnRseQoJCQkJCQoJCQkJfQoJCQkKCQkJCS8vIFNob3VsZCBiZSBnb29kIG91dHB1dCB0byB0cnkgYXQgbGVhc3QKCQkJCWZvcmVhY2ggKCAkb3V0cHV0IGFzICRsaW5lICkgewoKCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih1bnppcClccysoP1A8bWFqb3I+XGQpXC4oP1A8bWlub3I+XGQrKS9pJywgJGxpbmUsICRtYXRjaGVzICkgKSB7CgkJCQkJCgkJCQkJCSRtYWpvciA9IChpbnQpJG1hdGNoZXNbICdtYWpvcicgXTsKCQkJCQkJJG1pbm9yID0gKGludCkkbWF0Y2hlc1sgJ21pbm9yJyBdOwoJCQkJCQlicmVhazsKCQkJCQkKCQkJCQl9CgkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGNyZWF0ZSB0aGUgaW5mbyBzdHJpbmcKCQkJCS8vIE5vdGU6IG5vdCB3b3J0aCBjb21wcmVzc2luZyBhcyB0aGF0IGdpdmVzIGEgbGFyZ2VyIHN0cmluZyBhZnRlciBjb252ZXJ0aW5nCgkJCQkvLyBmcm9tIGJpbmFyeSB0byBoZXggZm9ybWF0IGZvciBzYXZpbmcKCQkJCSRpbmZvID0gaW1wbG9kZSggUEhQX0VPTCwgJG91dHB1dCApOwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdpbmZvJyBdID0gJGluZm87CgkJCQkKCQkJfQoJCQkKCQkJLy8gTm93IHVzZSBlaXRoZXIgd2hhdCB3ZSBnb3Qgb3Igd2hhdCB3ZSB3ZXJlIGdpdmVuLi4uCgkJCWlmICggKCBpc19pbnQoICRtYWpvcikgKSAmJiAoIDAgPCAkbWFqb3IgKSAmJiAoIGlzX2ludCggJG1pbm9yICkgKSApIHsKCQkJCgkJCQkvLyBTZXQgdGhlIGdpdmVuIHZlcnNpb24gcmVnYXJkbGVzcwoJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICd2ZXJzaW9uJyBdID0gYXJyYXkoICdtYWpvcicgPT4gJG1ham9yLCAnbWlub3InID0+ICRtaW5vciApOwoJCQkKCQkJfQoJCQkKCQkJLy8gQ2F0Y2gtYWxsIGNsZWFudXAgb2YgdGhlIG91dHB1dCBmaWxlCgkJCWlmICggQGZpbGVfZXhpc3RzKCAkb3V0ZmlsZV9uYW1lICkgKSB7CgkJCQoJCQkJQHVubGluayggJG91dGZpbGVfbmFtZSApOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkdGhpczsgCgkJCgkJfQoJCQoJCS8qKgoJCSAqCWdldF91bnppcF92ZXJzaW9uKCkKCQkgKgkKCQkgKglUaGlzIGdldHMgdGhlIHVuemlwIHZlcnNpb24gYXMgYW4gYXJyYXkgb2YgbWFqb3IvbWlub3Igb3IgcmV0dXJucyBmYWxzZSBpZiBub3Qga25vd24KCQkgKglUT0RPOiBQYXNzIHBhcmFtZXRlciB0byBzcGVjaWZ5IHdoYXQgZm9ybWF0IHRvIHJldHVybiBpbgoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5fGJvb2wJCQkJUmV0dXJucyBhcnJheShtYWpvciwgbWlub3IpIG9yIGZhbHNlIGlmIG5vdCBrbm93bgoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF91bnppcF92ZXJzaW9uKCkgewoJCQoJCQkkcmVzdWx0ID0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICd2ZXJzaW9uJyBdOwoJCQkKCQkJaWYgKCAwID09PSAkcmVzdWx0WyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X3ppcF9zdXBwb3J0c19sb2dmaWxlKCkKCQkgKgkKCQkgKglUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgemlwIGluIHVzZSBpcyBhYmxlIHRvIHN1cHBvcnQgbG9nZmlsZSB1c2FnZSBmb3IKCQkgKglsb2dnaW5nIHByb2dyZXNzIG9mIHppcCBvcGVyYXRpb24KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgbG9nZmlsZSBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF96aXBfc3VwcG9ydHNfbG9nX2ZpbGUoKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCS8vIEN1cnJlbnRseSBjaGVjayBiYXNlZCBqdXN0IG9uIHRoZSB6aXAgbWFqb3IgdmVyc2lvbgoJCQkvLyBUT0RPOiBkZWNpZGUgaWYgYmV0dGVyIHRvIHJlc3BvbmQgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zCgkJCWlmICggMyA8PSAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICd2ZXJzaW9uJyBdWyAnbWFqb3InIF0gKSB7CgkJCQoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCgkJICogIE5vdGU6IGluIHRoaXMgY2FzZSBhcyB0aGUgemlwIGFuZCB1bnppcCBjYXBhYmlsaXRpZXMgYXJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNvbW1hbmRzIHdlIG5lZWQgdG8gdGVzdAoJCSAqICBmb3IgdGhlIGF2YWlsYWJpbGl0eSBvZiBib3RoIG9mIHRoZW0gYW5kIHNldCBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJVGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIGFueSB0ZXN0IGZpbGVzIChtdXN0IGJlIHdyaXRlYWJsZSkKCQkgKglAcmV0dXJuCQlib29sCQkJCVRydWUgaWYgdGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IG9uZSBtb2RlLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBpc19hdmFpbGFibGUoICR0ZW1wZGlyICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQoJCQlzd2l0Y2ggKCAkdGhpcy0+Z2V0X29zX3R5cGUoKSApIHsKCQkJCWNhc2Ugc2VsZjo6T1NfVFlQRV9OSVg6CgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5pc19hdmFpbGFibGVfbGludXgoICR0ZW1wZGlyICk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+aXNfYXZhaWxhYmxlX3dpbmRvd3MoICR0ZW1wZGlyICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJICAJCgkJfQoKCQkvKioKCQkgKglpc19hdmFpbGFibGVfd2luZG93cygpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCVRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGZvciBhbnkgdGVzdCBmaWxlcyAobXVzdCBiZSB3cml0ZWFibGUpCgkJICoJQHJldHVybgkJYm9vbAkJCQlUcnVlIGlmIHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBhdCBsZWFzdCBvbmUgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gaXNfYXZhaWxhYmxlX3dpbmRvd3MoICR0ZW1wZGlyICkgewoJCQoJCQkvLyBKdXN0IHJldHVybiBmYWxzZSBzaWxlbnRseSBvdGhlcndpc2Ugd2UnZCBiZSBsb2dnaW5nIHJlcGVhdGVkbHkuLi4KCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICR0aGlzLT5fbWV0aG9kX3RhZyAuIF9fKCcgbWV0aG9kIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWlzX2F2YWlsYWJsZV9saW51eCgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IHRlc3RzIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBzcGVjaWZpYyBtZXRob2QgYW5kIGl0cyBhdmFpbGFibGUgbW9kZXMuIFdpbGwgdGVzdCBmb3IKCQkgKiAgbXVsdGlwbGUgbW9kZXMgKHppcCAmIHVuemlwKSBhbmQgb25seSByZXR1cm4gZmFsc2UgaWYgbmVpdGhlciBpcyBhdmFpbGFibGUuIEFjdHVhbCBhdmFpbGFibGUgbW9kZXMgd2lsbAoJCSAqICBiZSBpbmRpY2F0ZWQgaW4gdGhlIG1ldGhvZCBhdHRyaWJ1dGVzLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCVRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gdXNlIGZvciBhbnkgdGVzdCBmaWxlcyAobXVzdCBiZSB3cml0ZWFibGUpCgkJICoJQHJldHVybgkJYm9vbAkJCQlUcnVlIGlmIHRoZSBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBhdCBsZWFzdCBvbmUgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gaXNfYXZhaWxhYmxlX2xpbnV4KCAkdGVtcGRpciApIHsKCQkKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkkcGVuZGluZ19yZXN1bHQgPSBmYWxzZTsKCQkJJGZvdW5kX3ppcCA9IGZhbHNlOwoJCQkkcHN0YXR1cyA9IGFycmF5KCk7CgkJCQoJCQkvLyBUaGlzIGlzIGEgc2FmZXR5IHZhbHVlIGluIGNhc2Ugc29tZXRoaW5nIG9kZCBoYXBwZW5zCgkJCSRleGVjX2V4aXRfY29kZSA9IDEyNzsKCQkJCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAncHJvY19vcGVuJyApICYmIGZ1bmN0aW9uX2V4aXN0cyggJ3Byb2NfY2xvc2UnICkgJiYKCQkJCSBmdW5jdGlvbl9leGlzdHMoICdwcm9jX2dldF9zdGF0dXMnICkgJiYgZnVuY3Rpb25fZXhpc3RzKCAncHJvY190ZXJtaW5hdGUnICkgKSB7CgkJCQkgCgkJCQkkY2FuZGlkYXRlX3BhdGhzID0gJHRoaXMtPl9leGVjdXRhYmxlX3BhdGhzOwoJCQkJCgkJCQkvLyBXZSBhcmUgc2VhcmNoaW5nIGZvciB6aXAgdXNpbmcgdGhlIGxpc3Qgb2YgcG9zc2libGUgcGF0aHMKCQkJCXdoaWxlICggKCBmYWxzZSA9PSAkZm91bmRfemlwICkgJiYgKCAhZW1wdHkoICRjYW5kaWRhdGVfcGF0aHMgKSApICkgewoJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIGl0IGlzIGNsZWFuIG9mIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZQoJCQkJCSRwYXRoID0gdHJpbSggYXJyYXlfc2hpZnQoICRjYW5kaWRhdGVfcGF0aHMgKSApOwoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdUcnlpbmcgZXhlY3V0YWJsZSBwYXRoIGZvciB6aXAgcHJvYzonLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBgJyAuICRwYXRoIC4gJ2AuJyApOwoKCQkJCQkkdGVzdF9maWxlID0gJHRlbXBkaXIgLiAndGVtcF90ZXN0XycgLiB1bmlxaWQoKSAuICcuemlwJzsKCQkJCQkKCQkJCQkkY29tbWFuZCA9ICdleGVjICcgLiAkdGhpcy0+c2xhc2hpZnkoICRwYXRoICkgLiAnemlwICInIC4gJHRlc3RfZmlsZSAuICciICInIC4gX19GSUxFX18gLiAnIic7CgkKCQkJCQkkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgKCQkJCQkJMCA9PiBhcnJheSggInBpcGUiLCAiciIgKSwKCQkJCQkJMSA9PiBhcnJheSggImZpbGUiLCAiL2Rldi9udWxsIiwgImEiICksCgkJCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgIi9kZXYvbnVsbCIsICJhIiApCQoJCQkJCSk7CgkJCQkJCgkJCQkJJHByb2Nlc3MgPSBOVUxMOyAvLyBNYXliZSBpdCBkb2Vzbid0IHdvcmsKCQkJCQkKCQkJCQkkcHJvY2VzcyA9IEBwcm9jX29wZW4oICRjb21tYW5kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyApOwoJCQkJCQoJCQkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQkJCgkJCQkJCWZjbG9zZSggJHBpcGVzWzBdICk7IC8vIE5ldmVyIHdhbnQgdG8gc2VuZCBpbnB1dCBzbyBqdXN0IGNsb3NlIGl0CgkJCQkJCQoJCQkJCQkkcHN0YXR1cyA9IHByb2NfZ2V0X3N0YXR1cyggJHByb2Nlc3MgKTsKCQkJCQkJCgkJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIDQgbG9vcCBtYXgKCQkJCQkJJGNvdW50ID0gMDsKCQkJCQkJCgkJCQkJCXdoaWxlICggdHJ1ZSA9PSAkcHN0YXR1c1sgJ3J1bm5pbmcnXSAmJiAoICRjb3VudCsrIDwgNCApICkgewoJCQkJCQkJdXNsZWVwKCA1MDAwMDAgKTsKCQkJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoIHRydWUgPT09ICRwc3RhdHVzWyAncnVubmluZycgXSApIHsKCQkJCQkJCS8vIEhtbSwgc2hvdWxkbid0IHN0aWxsIGJlIHJ1bm5pbmcsIHRyeSB0byBraWxsIGl0IGFuZCBtb3ZlIG9uCgkJCQkJCQlAcHJvY190ZXJtaW5hdGUoICRwcm9jZXNzICk7CgkJCQkJCQkKCQkJCQkJCS8vIEdldCBzdGF0dXMgYWdhaW4gYW5kIHNlZSBpZiBub3cgbm90IHJ1bm5pbmcsIGlmIHNvIGdldCBleGl0IGNvZGUKCQkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIFByb2Nlc3MgZmluaXNoZWQgbm9ybWFsbHkgc28gZ2V0IGV4aXQgY29kZSBmb3IgcG9zc2libGUgdXNlCgkJCQkJCQkkZXhlY19leGl0X2NvZGUgPSAkcHN0YXR1c1sgJ2V4aXRjb2RlJyBdOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgaXNzdWUsIHNob3VsZG4ndCBnZXQgc3R1Y2sgaGVyZSBidXQgaXQgaXMgcG9zc2libGUgaWYKCQkJCQkJLy8gd2UgcHJvY2VzcyB3YXMgc3RpbGwgcnVubmluZyBhbmQgd2UgZmFpbGVkIHRvIHRlcm1pbmF0ZSBpdCAtIHRyaWNreSBvbmUKCQkJCQkJLy8gdG8gb3ZlcmNvbWUgYnV0IF9zaG91bGRfIGJlIHJhcmUKCQkJCQkJQHByb2NfY2xvc2UoICRwcm9jZXNzICk7CgkJCQkJCQoJCQkJCQkvLyBNdXN0IGhhdmUgYm90aCBhIGZpbGUgYW5kIGEgc3VjY2VzcyBleGl0IGNvZGUgdG8gY29uc2lkZXIgdGhpcyBzdWNjZXNzZnVsCgkJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgJiYgKCAwID09PSAkZXhlY19leGl0X2NvZGUgKSApIHsKCQkJCQoJCQkJCQkJLy8gU2V0IHRoZSBwYXJhbWV0ZXIgdG8gYmUgcmVtZW1iZXJlZCAobm90ZTogcGF0aCB3aXRob3V0IHRyYWlsaW5nIHNsYXNoKQoJCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSA9ICRwYXRoOwoJCQkJCQkJCgkJCQkJCQkvLyBUaGUgemlwIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBzbyB3ZSBjYW4gYXQgbGVhc3QgemlwIGFuZCBhcmNoaXZlCgkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX3ppcHBlcicgXSA9IHRydWU7CgkJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2FyY2hpdmVyJyBdID0gdHJ1ZTsKCQkJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0ICh6aXApIFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkKCQkJCQkJCS8vIFRPRE86IENvbnNpZGVyIHBhcnNpbmcgemlwIGZpbGUgdG8gZ2V0IHZlcnNpb24gb2YgemlwIHRoYXQgY3JlYXRlZCBpdC4gVGhpcyBtYXkgc2VlbSBvZGQKCQkJCQkJCS8vIGJ1dCBwcmUtdjMgemlwIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHJ1biAiemlwIC12IiB0aHJvdWdoIGV4ZWMoKSBvciBlcXVpdmFsZW50IGFzIGl0IG9ubHkKCQkJCQkJCS8vIHByb3ZpZGVzIHRoZSByZXF1aXJlZCBvdXRwdXQgaWYgYSB0dHkgaXMgYXR0YWNoZWQsIG90aGVyd2lzZSBpdCBjcmVhdGVzIGEgemlwIGZpbGUuIFdlCgkJCQkJCQkvLyBtaWdodCBjb25zaWRlciBwYXJzaW5nIHRoZSBjcmVhdGVkIHppcCBmaWxlIGJ1dCBhcyB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBvbmUgaGVyZSB3ZQoJCQkJCQkJLy8gbWlnaHQgYXMgd2VsbCB1c2UgaXQKCQkJCQkJCQoJCQkJCQkJLy8gVGhpcyB3aWxsIGJyZWFrIHVzIG91dCBvZiB0aGUgbG9vcAoJCQkJCQkJJGZvdW5kX3ppcCA9IHRydWU7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJCS8vIERlYWwgd2l0aCB0aGUgcG9zc2libGUgZmFpbHVyZSBjYXVzZXMKCQkJCQkJCWlmICggIUBmaWxlX2V4aXN0cyggJHRlc3RfZmlsZSApICkgewoJCQkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0ICh6aXApIEZBSUxFRDogVGVzdCB6aXAgZmlsZSBub3QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJCgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJCWlmICggMCA9PT0gJGV4ZWNfZXhpdF9jb2RlICkgewoJCQkJCQkJCgkJCQkJCQkJJGVycm9yX3N0cmluZyA9ICRleGVjX2V4aXRfY29kZTsKCQkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQcm9jIHRlc3QgKHppcCkgRkFJTEVEOiBwcm9jIEV4aXQgQ29kZTogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCQkKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBSZW1vdmUgdGhlIHRlc3QgemlwIGZpbGUgaWYgaXQgd2FzIGNyZWF0ZWQKCQkJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkJCgkJCQkJCQlpZiAoICFAdW5saW5rKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnUHJvYyB0ZXN0ICh6aXApIHVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdGVzdF9maWxlICkgKTsKCQkJCQkJCgkJCQkJCQl9CgkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0IEZBSUxFRDogVW5hYmxlIHRvIGNyZWF0ZSB0ZXN0IHppcCBmaWxlIHByb2Nlc3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJCWlmICggZmFsc2UgPT0gJGZvdW5kX3ppcCApIHsKCQkJCQoJCQkJCS8vIE5ldmVyIGZvdW5kIHppcCBvbiBhbnkgY2FuZGlkYXRlIHBhdGgKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQcm9jIHRlc3QgRmFpbGVkOiBVbmFibGUgdG8gZmluZCB6aXAgZXhlY3V0YWJsZSBvbiBhbnkgc3BlY2lmaWVkIHBhdGguJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCQkJCQoJCQkJfQoJCQkJCSAgCgkJCQkvLyBSZW1lbWJlciB6aXAgcmVzdWx0IGFuZCByZXNldCBmb3IgdW56aXAgdGVzdAoJCQkJJHBlbmRpbmdfcmVzdWx0ID0gJHJlc3VsdDsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJLy8gU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgemlwIHZlcnNpb24gYW5kIHBvc3NpYmx5IGF2YWlsYWJsZSBvcHRpb25zLiBUaGlzIGNhbiBoZWxwIHVzCgkJCQkvLyBkZXRlcm1pbmUgaG93IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBzdWNoIGFzIGNyZWF0aW5nIGEgemlwIGZpbGUKCQkJCWlmICggdHJ1ZSA9PT0gJGZvdW5kX3ppcCApIHsKCQkJCQoJCQkJCSR0aGlzLT5zZXRfemlwX3ZlcnNpb24oKTsKCQkJCQoJCQkJfQoJCQkJCgkJCQkvLyBSZXNldCB0aGUgY2FuZGlkYXRlIHBhdGhzIGZvciBhIGZ1bGwgc2VhcmNoIGZvciB1bnppcAoJCQkJJGNhbmRpZGF0ZV9wYXRocyA9ICR0aGlzLT5fZXhlY3V0YWJsZV9wYXRoczsKCQkJCQkJICAKCQkJCS8vIFJlc2V0IHRoZSBzYWZldHkgdmFsdWUgaW4gY2FzZQoJCQkJJGV4ZWNfZXhpdF9jb2RlID0gMTI3OwoJCQkJCgkJCQkvLyBOZXcgc2VhcmNoCgkJCQkkZm91bmRfemlwID0gZmFsc2U7CgkJCQkKCQkJCS8vIE5lZWQgdG8gY3JlYXRlIGEgdGVzdCB6aXAgZmlsZSAtIGhlcmUncyBvbmUgSSBwcmVwYXJlZCBlYXJsaWVyCgkJCQkvLyBjb250YWluaW5nIHRoZSBvbmUgZmlsZSB0ZXN0LnR4dCAod2l0aCBjb250ZW50ICJIZWxsbyBXb3JsZCIpCgkJCQkvLyBDYW4gdXNlIHRoaXMgZm9yIGFsbCBjYXNlIHRlc3RzIGFuZCBkZWxldGUgYXQgZW5kCgkJCQkkdGVzdF9maWxlID0gJHRlbXBkaXIgLiAndGVtcF90ZXN0XycgLiB1bmlxaWQoKSAuICcuemlwJzsKCQkJCUBmaWxlX3B1dF9jb250ZW50cyggJHRlc3RfZmlsZSwgYmFzZTY0X2RlY29kZSggIlVFc0RCQW9BQUFBQUFDOEVMVUhqNVpXd0RBQUFBQXdBQUFBSUFCd0FkR1Z6ZEM1MGVIUlZWQWtBQThvYlVWRGpHMUZRZFhnTEFBRUUrQUVBQUFRVUFBQUFTR1ZzYkc4Z1YyOXliR1FLVUVzQkFoNERDZ0FBQUFBQUx3UXRRZVBsbGJBTUFBQUFEQUFBQUFnQUdBQUFBQUFBQVFBQUFLU0JBQUFBQUhSbGMzUXVkSGgwVlZRRkFBUEtHMUZRZFhnTEFBRUUrQUVBQUFRVUFBQUFVRXNGQmdBQUFBQUJBQUVBVGdBQUFFNEFBQUFBQUE9PSIgKSApOwoKCQkJCS8vIFdlIGFyZSBzZWFyY2hpbmcgZm9yIHppcCB1c2luZyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBwYXRocwoJCQkJd2hpbGUgKCAoIGZhbHNlID09ICRmb3VuZF96aXAgKSAmJiAoICFlbXB0eSggJGNhbmRpZGF0ZV9wYXRocyApICkgKSB7CgkJCQkKCQkJCQkvLyBNYWtlIHN1cmUgaXQgaXMgY2xlYW4gb2YgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlCgkJCQkJJHBhdGggPSB0cmltKCBhcnJheV9zaGlmdCggJGNhbmRpZGF0ZV9wYXRocyApICk7CgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oICdUcnlpbmcgZXhlY3V0YWJsZSBwYXRoIGZvciB1bnppcDonLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyBgJyAuICRwYXRoIC4gJ2AuJyApOwoJCQkJCQoJCQkJCSRjb21tYW5kID0gJ2V4ZWMgJyAuICR0aGlzLT5zbGFzaGlmeSggJHBhdGggKSAuICd1bnppcCAtcXQgJyAuICcgIicgLiAkdGVzdF9maWxlIC4gJyIgInRlc3QudHh0Iic7CgkKCQkJCQkkZGVzY3JpcHRvcnNwZWMgPSBhcnJheSgKCQkJCQkJMCA9PiBhcnJheSggInBpcGUiLCAiciIgKSwKCQkJCQkJMSA9PiBhcnJheSggImZpbGUiLCAiL2Rldi9udWxsIiwgImEiICksCgkJCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgIi9kZXYvbnVsbCIsICJhIiApCQoJCQkJCSk7CgkJCQkJCgkJCQkJJHByb2Nlc3MgPSBOVUxMOyAvLyBNYXliZSBpdCBkb2Vzbid0IHdvcmsKCQkJCQkKCQkJCQkkcHJvY2VzcyA9IEBwcm9jX29wZW4oICRjb21tYW5kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyApOwoJCQkJCQoJCQkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQkJCgkJCQkJCWZjbG9zZSggJHBpcGVzWzBdICk7IC8vIE5ldmVyIHdhbnQgdG8gc2VuZCBpbnB1dCBzbyBqdXN0IGNsb3NlIGl0CgkJCQkJCQoJCQkJCQkkcHN0YXR1cyA9IHByb2NfZ2V0X3N0YXR1cyggJHByb2Nlc3MgKTsKCQkJCQkJCgkJCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvbmx5IGRvIDQgbG9vcCBtYXgKCQkJCQkJJGNvdW50ID0gMDsKCQkJCQkJCgkJCQkJCXdoaWxlICggdHJ1ZSA9PSAkcHN0YXR1c1sgJ3J1bm5pbmcnXSAmJiAoICRjb3VudCsrIDwgNCApICkgewoJCQkJCQkJdXNsZWVwKCA1MDAwMDAgKTsKCQkJCQkJCSRwc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoIHRydWUgPT09ICRwc3RhdHVzWyAncnVubmluZycgXSApIHsKCQkJCQkJCS8vIEhtbSwgc2hvdWxkbid0IHN0aWxsIGJlIHJ1bm5pbmcsIHRyeSB0byBraWxsIGl0IGFuZCBtb3ZlIG9uCgkJCQkJCQlAcHJvY190ZXJtaW5hdGUoICRwcm9jZXNzICk7CgkJCQkJCQkKCQkJCQkJCS8vIEdldCBzdGF0dXMgYWdhaW4gYW5kIHNlZSBpZiBub3cgbm90IHJ1bm5pbmcsIGlmIHNvIGdldCBleGl0IGNvZGUKCQkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIFByb2Nlc3MgZmluaXNoZWQgbm9ybWFsbHkgc28gZ2V0IGV4aXQgY29kZSBmb3IgcG9zc2libGUgdXNlCgkJCQkJCQkkZXhlY19leGl0X2NvZGUgPSAkcHN0YXR1c1sgJ2V4aXRjb2RlJyBdOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIElnbm9yZSBhbnkgY2xvc2UgaXNzdWUsIHNob3VsZG4ndCBnZXQgc3R1Y2sgaGVyZSBidXQgaXQgaXMgcG9zc2libGUgaWYKCQkJCQkJLy8gd2UgcHJvY2VzcyB3YXMgc3RpbGwgcnVubmluZyBhbmQgd2UgZmFpbGVkIHRvIHRlcm1pbmF0ZSBpdCAtIHRyaWNreSBvbmUKCQkJCQkJLy8gdG8gb3ZlcmNvbWUgYnV0IF9zaG91bGRfIGJlIHJhcmUKCQkJCQkJQHByb2NfY2xvc2UoICRwcm9jZXNzICk7CgkJCQkJCQoJCQkJCQlpZiAoICRleGVjX2V4aXRfY29kZSA9PSAwICkgewoJCQkJCQkKCQkJCQkJCS8vIFNldCB0aGUgcGFyYW1ldGVyIHRvIGJlIHJlbWVtYmVyZWQgKG5vdGU6IHBhdGggd2l0aG91dCB0cmFpbGluZyBzbGFzaCkKCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3VuemlwJyBdWyAncGF0aCcgXSA9ICRwYXRoOwoJCQkJCQkJCgkJCQkJCQkvLyBUaGUgdW56aXAgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIHNvIHdlIGNhbiBhdCBsZWFzdCB1bnppcAoJCQkJCQkJLy8gTm90ZTogd2UgZG8gbm90IHdhbnQgdG8gdXNlIHRoaXMgZm9yIGNoZWNraW5nIHlldAkKCQkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfdW56aXBwZXInIF0gPSB0cnVlOwoJCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1Byb2MgdGVzdCAodW56aXApIFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCQoJCQkJCQkJLy8gVGhpcyB3aWxsIGJyZWFrIHVzIG91dCBvZiB0aGUgbG9vcAoJCQkJCQkJJGZvdW5kX3ppcCA9IHRydWU7CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCgkJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJGV4ZWNfZXhpdF9jb2RlOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0ICh1bnppcCkgRkFJTEVEOiBUZXN0IHVuemlwIGZpbGUgdGVzdCBmYWlsZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyBFeGl0IENvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXJyb3Jfc3RyaW5nICk7CgkJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1Byb2MgdGVzdCBGQUlMRUQ6IFVuYWJsZSB0byBjcmVhdGUgdGVzdCB1bnppcCBmaWxlIHByb2Nlc3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJCS8vIFJlbW92ZSB0aGUgdGVzdCB6aXAgZmlsZSBpZiBpdCB3YXMgY3JlYXRlZAoJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQoJCQkJCWlmICggIUB1bmxpbmsoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1Byb2MgdGVzdCAodW56aXApIHVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlICglcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkdGVzdF9maWxlICkgKTsKCQkJCQoJCQkJCX0KCQkJCgkJCQl9CgkJCQoJCQkJLy8gSWYgd2UgZGlkbid0IGZpbmQgdW56aXAgYW55d2hlcmUgKG9yIG1heWJlIGZvdW5kIGl0IGJ1dCBpdCBmYWlsZWQpIHRoZW4gbG9nIGl0CgkJCQlpZiAoIGZhbHNlID09ICRmb3VuZF96aXAgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdQcm9jIHRlc3QgRmFpbGVkOiBVbmFibGUgdG8gZmluZCB1bnppcCBleGVjdXRhYmxlIG9uIGFueSBzcGVjaWZpZWQgcGF0aC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gU2VlIGlmIHdlIGNhbiBkZXRlcm1pbmUgdW56aXAgdmVyc2lvbiBhbmQgcG9zc2libHkgYXZhaWxhYmxlIG9wdGlvbnMuIFRoaXMgY2FuIGhlbHAgdXMKCQkJCQkvLyBkZXRlcm1pbmUgaG93IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBzdWNoIGFzIHVuemlwcGluZyBhIGZpbGUKCQkJCQkKCQkJCQkkdGhpcy0+c2V0X3VuemlwX3ZlcnNpb24oKTsKCQkJCQoJCQkJfQoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUHJvYyB0ZXN0IEZBSUxFRDogT25lIG9yIG1vcmUgcmVxdWlyZWQgZnVuY3Rpb24gZG8gbm90IGV4aXN0LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkgIAoJCQl9CgkJICAJCgkJICAJLy8gSWYgd2UgZm91bmQgYm90aCB6aXAgYW5kIHVuemlwIHRoZW4gY29tcGFyZSB0aGUgcGF0aHMgYW5kIGlmIHRoZSBzYW1lIHRoZW4gc2V0IHRoZSBjb21tb24gcGF0aAoJCSAgCWlmICggJHBlbmRpbmdfcmVzdWx0ICYmICRyZXN1bHQgKSB7CgkJICAJCgkJICAJCWlmICggJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAnemlwJyBdWyAncGF0aCcgXSA9PT0gJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ3BhcmFtJyBdWyAndW56aXAnIF1bICdwYXRoJyBdICkgewoJCSAgCQkKCQkgIAkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdwYXJhbScgXVsgJ3BhdGgnIF0gPSAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF1bICd6aXAnIF1bICdwYXRoJyBdOwoJCSAgCQkJCgkJICAJCX0KCQkgIAkJCgkJICAJfQoJCSAgCQoJCSAgCS8vIE91ciByZXN1bHQgd2lsbCBiZSB0cnVlIGlmIHdlIGZvdW5kIGVpdGhlciBvciBib3RoIG9mIHppcCBhbmQgdW56aXAKCQkgIAkvLyBUaGUgbWV0aG9kIGF0dHJpYnV0ZXMgd2lsbCB0ZWxsIHdoaWNoIGlzIGF2YWlsYWJsZQoJCSAgCSRyZXN1bHQgPSAoICRwZW5kaW5nX3Jlc3VsdCB8fCAkcmVzdWx0ICk7CgkJICAJCgkJICAJcmV0dXJuICRyZXN1bHQ7CgkJICAJCgkJfQoJCQoJCS8qKgoJCSAqCWNyZWF0ZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJQWx3YXlzIGNsZWFucyB1cCBhZnRlciBpdHNlbGYKCQkgKgkKCQkgKglUaGUgJGV4Y2x1ZGVzIHdpbGwgYmUgYSBsaXN0IG9yIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgaWYgdGhlICRsaXN0bWFrZXIgb2JqZWN0IGlzIE5VTEwgb3RlaHJ3aXNlCgkJICoJd2lsbCBiZSBhYnNvbHV0ZSBwYXRoIGV4Y2x1ZGVzIGFuZCByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGNhbiBiZSBoYWQgZnJvbSB0aGUgJGxpc3RtYWtlciBvYmplY3QKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBjcmVhdGUKCQkgKglAcGFyYW0JCXN0cmluZwkkZGlyCQkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSB0byBhZGQgdG8gWklQIEFyY2hpdmUgZmlsZQoJCSAqCUBwYXJhbWUJCWFycmF5CSRleGNsdWRlcwkJTGlzdCBvZiBlaXRoZXIgYWJzb2x1dGUgcGF0aCBleGNsdXNpb25zIG9yIHJlbGF0aXZlIGV4Y2x1c2lvbnMKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcgkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IHVzYWdlCgkJICoJQHBhcmFtCQlvYmplY3QJJGxpc3RtYWtlcgkJVGhlIG9iamVjdCBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW4gaW5jbHVzaW9ucyBsaXN0CgkJICoJQHJldHVybgkJYm9vbAkJCQkJVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGNyZWF0ZSggJHppcCwgJGRpciwgJGV4Y2x1ZGVzLCAkdGVtcGRpciwgJGxpc3RtYWtlciA9IE5VTEwgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZV9saW51eCggJHppcCwgJGRpciwgJGV4Y2x1ZGVzLCAkdGVtcGRpciwgJGxpc3RtYWtlciApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX1dJTjoKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmNyZWF0ZV93aW5kb3dzKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkJCgkJLyoqCgkJICoJY3JlYXRlX3dpbmRvd3MoKQoJCSAqCQoJCSAqCUEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFyY2hpdmUgZmlsZSBvbiBMaW51eAoJCSAqCUFsd2F5cyBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmCgkJICoKCQkgKglUaGUgJGV4Y2x1ZGVzIHdpbGwgYmUgYSBsaXN0IG9yIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgaWYgdGhlICRsaXN0bWFrZXIgb2JqZWN0IGlzIE5VTEwgb3RlaHJ3aXNlCgkJICoJd2lsbCBiZSBhYnNvbHV0ZSBwYXRoIGV4Y2x1ZGVzIGFuZCByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGNhbiBiZSBoYWQgZnJvbSB0aGUgJGxpc3RtYWtlciBvYmplY3QKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIEFyY2hpdmUgZmlsZSB0byBjcmVhdGUKCQkgKglAcGFyYW0JCXN0cmluZwkkZGlyCQkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSB0byBhZGQgdG8gWklQIEFyY2hpdmUgZmlsZQoJCSAqCUBwYXJhbWUJCWFycmF5CSRleGNsdWRlcwkJTGlzdCBvZiBlaXRoZXIgYWJzb2x1dGUgcGF0aCBleGNsdXNpb25zIG9yIHJlbGF0aXZlIGV4Y2x1c2lvbnMKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcgkJRnVsbCBwYXRoIG9mIGRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IHVzYWdlCgkJICoJQHBhcmFtCQlvYmplY3QJJGxpc3RtYWtlcgkJVGhlIG9iamVjdCBmcm9tIHdoaWNoIHdlIGNhbiBnZXQgYW4gaW5jbHVzaW9ucyBsaXN0CgkJICoJQHJldHVybgkJYm9vbAkJCQkJVHJ1ZSBpZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZV93aW5kb3dzKCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICkgewoJCQoJCQkvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnV0IGp1c3QgaW4gY2FzZSByZXR1cm4gZmFsc2Ugc2lsZW50bHkKCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5nZXRfbWV0aG9kX3RhZygpIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGFyY2hpdmluZy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCgkJfQkJCQoJCQoJCS8qKgoJCSAqCWNyZWF0ZV9saW51eCgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlIG9uIExpbnV4CgkJICoJQWx3YXlzIGNsZWFucyB1cCBhZnRlciBpdHNlbGYKCQkgKgoJCSAqCVRoZSAkZXhjbHVkZXMgd2lsbCBiZSBhIGxpc3Qgb3IgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBpZiB0aGUgJGxpc3RtYWtlciBvYmplY3QgaXMgTlVMTCBvdGVocndpc2UKCQkgKgl3aWxsIGJlIGFic29sdXRlIHBhdGggZXhjbHVkZXMgYW5kIHJlbGF0aXZlIHBhdGggZXhjbHVkZXMgY2FuIGJlIGhhZCBmcm9tIHRoZSAkbGlzdG1ha2VyIG9iamVjdAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXAJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgQXJjaGl2ZSBmaWxlIHRvIGNyZWF0ZQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRkaXIJCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IHRvIGFkZCB0byBaSVAgQXJjaGl2ZSBmaWxlCgkJICoJQHBhcmFtZQkJYXJyYXkJJGV4Y2x1ZGVzCQlMaXN0IG9mIGVpdGhlciBhYnNvbHV0ZSBwYXRoIGV4Y2x1c2lvbnMgb3IgcmVsYXRpdmUgZXhjbHVzaW9ucwoJCSAqCUBwYXJhbQkJc3RyaW5nCSR0ZW1wZGlyCQlGdWxsIHBhdGggb2YgZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgdXNhZ2UKCQkgKglAcGFyYW0JCW9iamVjdAkkbGlzdG1ha2VyCQlUaGUgb2JqZWN0IGZyb20gd2hpY2ggd2UgY2FuIGdldCBhbiBpbmNsdXNpb25zIGxpc3QKCQkgKglAcmV0dXJuCQlib29sCQkJCQlUcnVlIGlmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlX2xpbnV4KCAkemlwLCAkZGlyLCAkZXhjbHVkZXMsICR0ZW1wZGlyLCAkbGlzdG1ha2VyICkgewoJCQoJCQkkZXhpdGNvZGUgPSAwOwoJCQkkb3V0cHV0ID0gYXJyYXkoKTsKCQkJJHppcHBhdGggPSAnJzsKCQkJJGNvbW1hbmQgPSAnJzsKCQkJJHRlbXBfemlwID0gJyc7CgkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IGZhbHNlOwoJCQkkZXhjbHVkZV9jb3VudCA9IDA7CgkJCSRleGNsdXNpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2Vycm9ycyA9IGZhbHNlOwoJCQkkemlwX2Vycm9yc19jb3VudCA9IDA7CgkJCSR6aXBfZXJyb3JzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX3dhcm5pbmdzID0gZmFsc2U7CgkJCSR6aXBfd2FybmluZ3NfY291bnQgPSAwOwoJCQkkemlwX3dhcm5pbmdzID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2FkZGl0aW9ucyA9IGZhbHNlOwoJCQkkemlwX2FkZGl0aW9uc19jb3VudCA9IDA7CgkJCSR6aXBfYWRkaXRpb25zID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX2RlYnVnID0gZmFsc2U7CgkJCSR6aXBfZGVidWdfY291bnQgPSAwOwoJCQkkemlwX2RlYnVnID0gYXJyYXkoKTsKCQkJJGhhdmVfemlwX290aGVyID0gZmFsc2U7CgkJCSR6aXBfb3RoZXJfY291bnQgPSAwOwoJCQkkemlwX290aGVyID0gYXJyYXkoKTsKCQkJJHppcF91c2luZ19sb2dfZmlsZSA9IGZhbHNlOwoJCQkkbG9nZmlsZV9uYW1lID0gJyc7CgkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSBmYWxzZTsKCQkKCQkJLy8gVGhlIGJhc2VkaXIgbXVzdCBoYXZlIGEgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvcgoJCQkkYmFzZWRpciA9ICggcnRyaW0oIHRyaW0oICRkaXIgKSwgRElSRUNUT1JZX1NFUEFSQVRPUiApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkKCQkJaWYgKCBlbXB0eSggJHRlbXBkaXIgKSB8fCAhQGZpbGVfZXhpc3RzKCAkdGVtcGRpciApICkgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSBtdXN0IGJlIGF2YWlsYWJsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCQkKCQkJLy8gVGVsbCB3aGljaCB6aXAgdmVyc2lvbiBpcyBiZWluZyB1c2VkCgkJCSR2ZXJzaW9uID0gJHRoaXMtPmdldF96aXBfdmVyc2lvbigpOwoJCQkKCQkJaWYgKCB0cnVlID09PSBpc19hcnJheSggJHZlcnNpb24gKSApIHsKCQkJCgkJCQkoICggMiA9PSAkdmVyc2lvblsgJ21ham9yJyBdICkgJiYgKCAwID09ICR2ZXJzaW9uWyAnbWlub3InIF0gKSApID8gJHZlcnNpb25bICdtaW5vcicgXSA9ICdYJyA6IHRydWUgOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1VzaW5nIHppcCB2ZXJzaW9uOiAlMSRzLiUyJHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHZlcnNpb25bICdtYWpvcicgXSwgJHZlcnNpb25bICdtaW5vcicgXSApICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkkdmVyc2lvbiA9IGFycmF5KCAibWFqb3IiID0+ICJYIiwgIm1pbm9yIiA9PiAiWSIgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdVc2luZyB6aXAgdmVyc2lvbjogJTEkcy4lMiRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR2ZXJzaW9uWyAnbWFqb3InIF0sICR2ZXJzaW9uWyAnbWlub3InIF0gKSApOwoKCQkJfQoJCQkKCQkJLy8gR2V0IHRoZSBjb21tYW5kIHBhdGggZm9yIHRoZSB6aXAgY29tbWFuZCAtIHNob3VsZCByZXR1cm4gYSB0cmltbWVkIHN0cmluZwoJCQkkemlwcGF0aCA9ICR0aGlzLT5nZXRfY29tbWFuZF9wYXRoKCBzZWxmOjpDT01NQU5EX1pJUF9QQVRIICk7CgkJCQoJCQkvLyBEZXRlcm1pbmUgaWYgd2UgYXJlIHVzaW5nIGFuIGFic29sdXRlIHBhdGgKCQkJaWYgKCAhZW1wdHkoICR6aXBwYXRoICkgKSB7CgkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1VzaW5nIGFic29sdXRlIHppcCBwYXRoOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHppcHBhdGggKTsKCQkJCQoJCQl9CgoJCQkvLyBBZGQgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIHJlcXVpcmVkCgkJCSRjb21tYW5kID0gJHRoaXMtPnNsYXNoaWZ5KCAkemlwcGF0aCApIC4gJ3ppcCc7CQoKCQkJLy8gSGFyZGNvZGluZyBzb21lIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3Igbm93CgkJCS8vJGNvbW1hbmQgLj0gJyAtcSAtcic7CgkJCS8vIE5vdGU6IG5vIGxvbmdlciB1c2luZyBxdWlldCBfYnV0XyBtYXkgdXNlIGl0IGlmIG91dHB1dCBpcyBiZWluZyBzZW50IHRvIGxvZyBmaWxlCgkJCSRjb21tYW5kIC49ICcgLXInOwoJCQkKCQkJLy8gQ2hlY2sgaWYgdGhlIHZlcnNpb24gb2YgemlwIGluIHVzZSBzdXBwb3J0cyBsb2cgZmlsZSAod2hpY2ggd2lsbCBoZWxwIHdpdGggbWVtb3J5IHVzYWdlIGZvciBsYXJnZSBzaXRlcykKCQkJaWYgKCAkdGhpcy0+Z2V0X3ppcF9zdXBwb3J0c19sb2dfZmlsZSgpICkgewoJCQkKCQkJCS8vIENob29zZSB0byB1c2UgbG9nIGZpbGUgc28gcXVpZXRlbiBzdGRvdXQgLSB3ZSdsbCBzZXQgdXAgdGhlIGxvZyBmaWxlIGxhdGVyCgkJCQkkY29tbWFuZCAuPSAnIC1xJzsKCQkJCSR6aXBfdXNpbmdfbG9nX2ZpbGUgPSB0cnVlOwoJCQkKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB0dXJuIG9mZiBjb21wcmVzc2lvbiBieSBzZXR0aW5ncyAoZmFzdGVyIGJ1dCBsYXJnZXIgYmFja3VwKQoJCQlpZiAoIHRydWUgIT09ICR0aGlzLT5nZXRfY29tcHJlc3Npb24oKSApIHsKCQkJCgkJCQkkY29tbWFuZCAuPSAnIC0wJzsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGNvbXByZXNzaW9uIGRpc2FibGVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIGNvbXByZXNzaW9uIGVuYWJsZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgaWdub3JpbmcgKG5vdCBmb2xsb3dpbmcpIHN5bWxpbmtzCgkJCWlmICggdHJ1ZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfc3ltbGlua3MoKSApIHsKCQkJCgkJCQkvLyBXYW50IHRvIG5vdCBmb2xsb3cgc3ltbGlua3Mgc28gc2V0IGNvbW1hbmQgb3B0aW9uIGFuZCBzZXQgZmxhZyBmb3IgbGF0ZXIgdXNlCgkJCQlpZiAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICE9IHNlbGY6Ok9TX1RZUEVfV0lOICkgewoJCQkJCSRjb21tYW5kIC49ICcgLXknOwoJCQkJCSR6aXBfaWdub3Jpbmdfc3ltbGlua3MgPSB0cnVlOwoJCQkJfQoJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiBzeW1ib2xpYyBsaW5rcyB3aWxsIG5vdCBiZSBmb2xsb3dlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgoJCQl9IGVsc2UgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHN5bWJvbGljIGxpbmtzIHdpbGwgYmUgZm9sbG93ZWQgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJfQoJCQkKCQkJLy8gQ2hlY2sgaWYgd2UgYXJlIGlnbm9yaW5nIHdhcm5pbmdzIC0gbWVhbmluZyBjYW4gc3RpbGwgZ2V0IGEgYmFja3VwIGV2ZW4KCQkJLy8gaWYsIGUuZy4sIHNvbWUgZmlsZXMgY2Fubm90IGJlIHJlYWQKCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgewoJCQkKCQkJCS8vIE5vdGU6IHdhcm5pbmdzIGFyZSBiZWluZyBpZ25vcmVkIGJ1dCB3aWxsIHN0aWxsIGJlIGdhdGhlcmVkIGFuZCBsb2dnZWQKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1ppcCBhcmNoaXZlIGNyZWF0aW9uIHdhcm5pbmdzIHdpbGwgYmUgaWdub3JlZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgYXJjaGl2ZSBjcmVhdGlvbiB3YXJuaW5ncyB3aWxsIG5vdCBiZSBpZ25vcmVkIGJhc2VkIG9uIHNldHRpbmdzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCgkJCX0KCQkJCQoJCQkvLyBEZWxldGUgYW55IGV4aXN0aW5nIHppcCBmaWxlIG9mIHNhbWUgbmFtZSAtIHJlYWxseSB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KCQkJaWYgKCBAZmlsZV9leGlzdHMoICR6aXAgKSApIHsKCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdFeGlzdGluZyBaSVAgQXJjaGl2ZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJQHVubGluayggJHppcCApOwoKCQkJfQoJCQkJCQkKCQkJLy8gTm93IHdlJ2xsIHNldCB1cCB0aGUgbG9nZ2luZyB0byBmaWxlIGlmIHJlcXVpcmVkIC0gdXNlIGZ1bGwgbG9nZ2luZwoJCQkvLyBOb3RlOiB3ZSBhbHdheXMgdXNlIHRoaXMgZmlsZSBlaXRoZXIgZm9yIGNvbW1hbmQgbGluZSBsb2cgb3B0aW9uIG9yIGNhcHR1cmVkIG91dHB1dAoJCQkvLyBzbyBhbHdheXMgc2V0IGl0CgkJCSRsb2dmaWxlX25hbWUgPSAkdGVtcGRpciAuIHNlbGY6OlpJUF9MT0dfRklMRV9OQU1FOwoJCQlpZiAoIHRydWUgPT09ICR6aXBfdXNpbmdfbG9nX2ZpbGUgKSB7CgkJCQoJCQkJLy8gVXNpbmcgdGhlIGNvbW1hbmQgbGluZSBsb2dmaWxlIG9wdGlvbgoJCQkJJGNvbW1hbmQgLj0gIiAtbGYgJ3skbG9nZmlsZV9uYW1lfScgLWxpIjsKCQkJCQoJCQkJLy8gQWN0dWFsIGNvbW1hbmQgb3V0cHV0IHdpbGwgYmUgc2VudCB0byB0aGUgYml0LWJ1Y2tldCBpbiB0aGUgc2t5CgkJCQkvLyBUT0RPOiBpZiB3ZSB3YW50IHRvIGNhcHR1cmUgZGVidWcgb3V0cHV0IHdlJ2xsIG5lZWQgYSByZWFsIGZpbGUKCQkJCS8vIGlzIGl0IHNhZmUgdG8gdXNlIHRoZSBzYW1lIGZpbGVuYW1lIChwcm9iYWJseSBub3QpCgkJCQkkb3V0cHV0ID0gJy9kZXYvbnVsbCc7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIE9sZCBzdHlsZWUgemlwIG5vdCBzdXBwb3J0aW5nIGxvZ2ZpbGUgc28gcmVkaXJlY3Qgb3V0cHV0IHRvIHRoZSBmaWxlIGluc3RlYWQKCQkJCSRvdXRwdXQgPSAkbG9nZmlsZV9uYW1lOwoJCQkKCQkJfQoJCQkJCQkKCQkJLy8gU2V0IHRlbXBvcmFyeSBkaXJlY3RvcnkgdG8gc3RvcmUgWklQIHdoaWxlIGl0J3MgYmVpbmcgZ2VuZXJhdGVkLgkJCQoJCQkkY29tbWFuZCAuPSAiIC1iICd7JHRlbXBkaXJ9JyI7CgoJCQkvLyBJZiB3YXJuaW5ncyBhcmUgYmVpbmcgaWdub3JlZCB3ZSBjYW4gdGVsbCB6aXAgdG8gY3JlYXRlIHRoZSB6aXAgYXJjaGl2ZSBpbiB0aGUgZmluYWwKCQkJLy8gbG9jYXRpb24gLSBvdGhlcndpc2Ugd2UgbXVzdCBwdXQgaXQgaW4gYSB0ZW1wb3JhcnkgbG9jYXRpb24gYW5kIG1vdmUgaXQgbGF0ZXIgb25seQoJCQkvLyBpZiB0aGVyZSBhcmUgbm8gd2FybmluZ3MuIFRoaXMgY29wZXMgd2l0aCB0aGUgY2FzZSB3aGVyZSAodGhpcykgY29udHJvbGxpbmcgc2NyaXB0CgkJCS8vIGdldHMgdGltZWQgb3V0IGJ5IHRoZSBzZXJ2ZXIgYW5kIGlmIHRoZSBmaWxlIHdlcmUgY3JlYXRlZCBpbiB0aGUgZmluYWwgbG9jYXRpb24gd2l0aAoJCQkvLyB3YXJuaW5ncyB0aGF0IHNob3VsZCBub3QgYmUgaWdub3JlZCB3ZSBjYW5ub3QgcHJldmVudCBpdCBiZWluZyBjcmVhdGVkLiBUaGUgLU1NIG9wdGlvbgoJCQkvLyBjb3VsZCBiZSB1c2VkIGJ1dCB0aGlzIHByZXZlbnRzIHVzIGNhdGNoaW5nIHN1Y2ggd2FybmluZ3MgYW5kIGJlaW5nIGFibGUgdG8gcmVwb3J0CgkJCS8vIHRoZW0gdG8gdGhlIHVzZXIgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHNjcmlwdCBoYXNuJ3QgYmVlbiB0ZXJtaW5hdGVkLiBBZGRpdGlvbmFsbHkgdGhlCgkJCS8vIC1NTSBvcHRpb24gd291bGQgYmFpbCBvdXQgb24gdGhlIGZpcnN0IGVuY291bnRlcmVkIHByb2JsZW0gYW5kIHNvIGlmIHRoZXJlIHdlcmUgYSBmZXcKCQkJLy8gcHJvYmxlbXMgdGhleSB3b3VsZCBlYWNoIG5vdCBiZSBmb3VuZCB1bnRpbCB0aGUgY3VycmVudCBvbmUgaXMgZml4ZWQgYW5kIHRyeSBhZ2Fpbi4KCQkJaWYgKCB0cnVlID09PSAkdGhpcy0+Z2V0X2lnbm9yZV93YXJuaW5ncygpICkgewoJCQkKCQkJCSR0ZW1wX3ppcCA9ICR6aXA7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSR0ZW1wX3ppcCA9ICR0ZW1wZGlyIC4gYmFzZW5hbWUoICR6aXAgKTsKCQkJCQoJCQl9CQkKCgkJCSRjb21tYW5kIC49ICIgJ3skdGVtcF96aXB9JyAuIjsKCQkJCgkJCS8vIE5vdyB3b3JrIG91dCBleGNsdXNpb25zIGRlcGVuZGVudCBvbiB3aGF0IHdlIGhhdmUgYmVlbiBnaXZlbgoJCQlpZiAoIGlzX29iamVjdCggJGxpc3RtYWtlciApICYmICggZGVmaW5lZCggJ1VTRV9FWFBFUklNRU5UQUxfWklQQlVERFlfSU5DTFVTSU9OJyApICYmICggdHJ1ZSA9PT0gVVNFX0VYUEVSSU1FTlRBTF9aSVBCVUREWV9JTkNMVVNJT04gKSApICkgewoJCQkKCQkJCS8vIFdlJ3JlIGRvaW5nIGFuIGluY2x1c2lvbiBvcGVyYXRpb24sIGJ1dCBmaXJzdCB3ZSdsbCBqdXN0IHNob3cgdGhlIGV4Y2x1c2lvc24KCQkJCQoJCQkJLy8gRm9yIHppcCB3ZSBuZWVkIHJlbGF0aXZlIHJhdGhlciB0aGFuIGFic29sdXRlIGV4Y2x1c2lvbiBzcGF0aHMKCQkJCSRleGNsdXNpb25zID0gJGxpc3RtYWtlci0+Z2V0X3JlbGF0aXZlX2V4Y2x1ZGVzKCAkYmFzZWRpciApOwoJCQkJCgkJCQlpZiAoIGNvdW50KCAkZXhjbHVzaW9ucyApID4gMCApIHsKCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0NhbGN1bGF0aW5nIGRpcmVjdG9yaWVzIHRvIGV4Y2x1ZGUgZnJvbSBiYWNrdXAuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQoJCQkJCSRleGNsdWRpbmdfYWRkaXRpb25hbCA9IGZhbHNlOwoJCQkJCSRleGNsdWRlX2NvdW50ID0gMDsKCQkJCQlmb3JlYWNoICggJGV4Y2x1c2lvbnMgYXMgJGV4Y2x1ZGUgKSB7CgkJCQkJCgkJCQkJCWlmICggIXN0cnN0ciggJGV4Y2x1ZGUsICdiYWNrdXBidWRkeV9iYWNrdXBzJyApICkgeyAvLyBTZXQgdmFyaWFibGUgdG8gc2hvdyB3ZSBhcmUgZXhjbHVkaW5nIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgYmVzaWRlcyBiYWNrdXAgZGlyLgoJCgkJCQkJCQkkZXhjbHVkaW5nX2FkZGl0aW9uYWwgPSB0cnVlOwoJCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRXhjbHVkaW5nJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkZXhjbHVkZSApOwoJCQkJCQkJCQkJCQkJCgkJCQkJCSRleGNsdWRlX2NvdW50Kys7CgkJCQkJCQkKCQkJCQl9CgkJCQkJCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gR2V0IHRoZSBsaXN0IG9mIGluY2x1c2lvbnMgdG8gcHJvY2VzcwoJCQkJJGluY2x1c2lvbnMgPSAkbGlzdG1ha2VyLT5nZXRfdGVybWluYWxzKCk7CgkJCQkKCQkJCS8vIEZvciBlYWNoIGRpcmVjdG9yeSB3ZSBuZWVkIHRvIHB1dCB0aGUgIndpbGRjYXJkIiBvbiB0aGUgZW5kCgkJCQlmb3JlYWNoICggJGluY2x1c2lvbnMgYXMgJiRpbmNsdXNpb24gKSB7CgkJCQkKCQkJCQlpZiAoIGlzX2RpciggJGluY2x1c2lvbiApICkgewoJCQkJCQoJCQkJCQkkaW5jbHVzaW9uIC49IERJUkVDVE9SWV9TRVBBUkFUT1IgLiAiKiI7CgkJCQkJfQoJCQkJCgkJCQkJLy8gUmVtb3ZlIGRpcmVjdG9yeSBwYXRoIHByZWZpeCBleGNsdWRpbmcgbGVhZGluZyBzbGFzaCB0byBtYWtlIHJlbGF0aXZlIChuZWVkZWQgZm9yIHppcCkKCQkJCQkkaW5jbHVzaW9uID0gc3RyX3JlcGxhY2UoIHJ0cmltKCAkYmFzZWRpciwgRElSRUNUT1JZX1NFUEFSQVRPUiApLCAnJywgJGluY2x1c2lvbiApOwoJCQkJCQkJCQkKCQkJCX0KCQkJCQoJCQkJLy8gTm93IGNyZWF0ZSB0aGUgaW5jbHVzaW9ucyBmaWxlIGluIHRoZSB0ZW1wZGlyCgkJCQkKCQkJCS8vIEFuZCB1cGRhdGUgdGhlIGNvbW1hbmQgb3B0aW9ucwoJCQkJJGlmaWxlID0gJHRlbXBkaXIgLiBzZWxmOjpaSVBfSU5DTFVTSU9OU19GSUxFX05BTUU7CgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkaWZpbGUgKSApIHsKCQkJCQoJCQkJCUB1bmxpbmsoICRpZmlsZSApOwoJCQkJCgkJCQl9CgkJCQkKCQkJCWZpbGVfcHV0X2NvbnRlbnRzKCAkaWZpbGUsIGltcGxvZGUoIFBIUF9FT0wsICRpbmNsdXNpb25zICkgLiBQSFBfRU9MIC4gUEhQX0VPTCApOwoJCQkJCgkJCQkkY29tbWFuZCAuPSAiIC1pQCIgLiAiJ3skaWZpbGV9JyI7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFdlJ3JlIGRvaW5nIGFuIGV4Y2x1c2lvbiBvcGVyYXRpb24KCQkJCgkJCQkvLyRjb21tYW5kIC49ICItaSAnKicgIjsgLy8gTm90IG5lZWRlZC4gWmlwIGRlZmF1bHRzIHRvIGRvaW5nIHRoaXMuIFJlbW92ZWQgSnVseSAxMCwgMjAxMiBmb3IgdjMuMC40MS4KCQkJCQoJCQkJLy8gU2luY2Ugd2UgaGFkIG5vICRsaXN0bWFrZXIgb2JqZWN0IG9yIG5vdCB1c2luZyBpdCBnZXQgdGhlIHN0YW5kYXJkIHJlbGF0aXZlIGV4Y2x1ZGVzIHRvIHByb2Nlc3MKCQkJCSRleGNsdXNpb25zID0gJGV4Y2x1ZGVzOwoJCQkJCgkJCQlpZiAoIGNvdW50KCAkZXhjbHVzaW9ucyApID4gMCApIHsKCQkJCQoJCQkJCS8vIEhhbmRsZSBleGNsdXNpb25zIGJ5IHBsYWNpbmcgdGhlbSBpbiBhbiBleGNsdXNpb24gdGV4dCBmaWxlLgoJCQkJCSRleGNsdXNpb25fZmlsZSA9ICR0ZW1wZGlyIC4gc2VsZjo6WklQX0VYQ0xVU0lPTlNfRklMRV9OQU1FOwoJCQkJCSR0aGlzLT5fcmVuZGVyX2V4Y2x1c2lvbnNfZmlsZSggJGV4Y2x1c2lvbl9maWxlLCAkZXhjbHVzaW9ucyApOwoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdVc2luZyBleGNsdXNpb24gZmlsZSBgJTEkc2AnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGV4Y2x1c2lvbl9maWxlICkgKTsKCQkJCQkkY29tbWFuZCAuPSAnIC14QCcgLiAiJ3skZXhjbHVzaW9uX2ZpbGV9JyI7CgkJCQkJCQkJCQkKCQkJCX0KCQkJCgkJCX0KCQkJCgkJCS8vIFJlbWVtYmVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgY2hhbmdlIHRvIHRoZSBkaXJlY3RvcnkgYmVpbmcgYWRkZWQgc28gdGhhdCAiLiIgaXMgdmFsaWQgaW4gY29tbWFuZAoJCQkkd29ya2luZ19kaXIgPSBnZXRjd2QoKTsKCQkJY2hkaXIoICRkaXIgKTsKCQkJCgkJCS8vIEV4ZWN1dGUgWklQIGNvbW1hbmQgLSB3ZSBkb24ndCBjYXJlIGEgYWJvdXQgV2luZG93cyBoZXJlIGJlY2F1c2UgdGhpcyBtZXRob2QgaXNuJ3Qgc3VwcG9ydGVkIHlldAoJCQkvLyBQcmVwZW5kICJleGVjIiBzbyB0aGF0IHNwYXduZWQgcHJvY2VzcyBiZWNvbWVzIHRoZSBhY3R1YWwgemlwIHByb2Nlc3MKCQkJJGNvbW1hbmQgPSAnZXhlYyAnIC4gJGNvbW1hbmQ7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJHRoaXMtPmdldF9tZXRob2RfdGFnKCkgLiBfXygnIGNvbW1hbmQgKExpbnV4KScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGNvbW1hbmQgKTsKCQkJCgkJCS8vIFNldCBzdGRpbiB0byBiZSBhIHBpcGUgdGhhdCB3ZSdsbCBjbG9zZSBpbW1lZGlhdGVseSBhbnl3YXkKCQkJLy8gU2VuZCBzdGRvdXQgdG8gYSBmaWxlIG9yIGR1bXAgaXQgZGVwZW5kZW50IG9uIHRoZSB6aXAgdmVyc2lvbiAodGhlIGRlc3RpbmF0aW9uIGlzIHNldCBhYm92ZSkKCQkJLy8gU2VuZCBzdGRlcnIgdG8gd2hlcmV2ZXIgc3Rkb3V0IGlzIGdvaW5nIChvbiBwcmUtdjMgemlwIHdlIG5lZWQgc3RkZXJyIGZvciB3YXJuaW5ncykKCQkJJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoCgkJCQkwID0+IGFycmF5KCAicGlwZSIsICJyIiApLAoJCQkJMSA9PiBhcnJheSggImZpbGUiLCAkb3V0cHV0LCAidyIgKSwKCQkJCTIgPT4gYXJyYXkoICJmaWxlIiwgJG91dHB1dCwgInciICkKCQkJKTsKCQkJCgkJCSRwcm9jZXNzID0gcHJvY19vcGVuKCAkY29tbWFuZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMgKTsKCQkJCgkJCWlmICggaXNfcmVzb3VyY2UoICRwcm9jZXNzICkgKSB7CgkJCQoJCQkJZmNsb3NlKCAkcGlwZXNbIDAgXSApOyAvLyBOZXZlciB3YW50IHRvIHNlbmQgaW5wdXQgc28ganVzdCBjbG9zZSBpdAoJCQkJCgkJCQkkc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCgkJCQl3aGlsZSAoIHRydWUgPT0gJHN0YXR1c1sgJ3J1bm5pbmcnXSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNyZWF0aW9uIGluIHByb2dyZXNzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQlzbGVlcCg1KTsKCQkJCQkkc3RhdHVzID0gcHJvY19nZXRfc3RhdHVzKCAkcHJvY2VzcyApOwoJCQkJCQoJCQkJCS8vIENvdWxkIGFsc28gY2hlY2sgZm9yIHBlcnNpc3RlbnQgZmluYWwgemlwIGZpbGUgKGkuZS4sIHByZXNlbnQgb3ZlciB0d28gbG9vcHMpCgkJCQkJLy8gd2hpY2ggbWlnaHQgbWVhbiB3ZSBhcmUgc29tZWhvdyBub3Qgc2VlaW5nIHRoZSBwcm9jZXNzIGFzIGZpbmlzaGVkIHNvIHdlIHNob3VsZAoJCQkJCS8vIHRlcm1pbmF0ZSBpdCBhbmQgY2xvc2UgaXQgLSBhbmQgaW5kaWNhdGUgc29tZSBmYWlsdXJlCgkJCQl9CgkJCQkKCQkJCSRleGl0Y29kZSA9ICRzdGF0dXNbICdleGl0Y29kZScgXTsKCQkJCQoJCQkJcHJvY19jbG9zZSggJHByb2Nlc3MgKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIE11c3QgY2xlYW4gdXAgdGVtcG9yYXJ5IGRpcmVjdG9yeQoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBjcmVhdGUgWmlwIHByb2Nlc3M6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1JlbW92aW5nIHRlbXBvcmFyeSBkaXJlY3RvcnkuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBkaXIgKSApICkgewoJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGVtcGRpciApOwoJCQkJCgkJCQl9CgkJCQkKCQkJCWNoZGlyKCAkd29ya2luZ19kaXIgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBTZXQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBiYWNrIHRvIHdoZXJlIHdlIHdlcmUKCQkJY2hkaXIoICR3b3JraW5nX2RpciApOwoJCQkKCQkJLy8gQ29udmVuaWVuY2UgZm9yIGhhbmRsaW5nIGRpZmZlcmVudCBzY2FuYXJpb3MKCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkKCQkJLy8gTG9nIGZpbGUgaXMgYWx3YXlzIHByZXNlbnQgLSBlaXRoZXIgY2FwdHVyaW5nIG91dHB1dCBvciBhcyBjb21tYW5kIGxpbmUgb3B0aW9uCgkJCS8vIEFsd2F5cyBzY2FuIHRoZSBsb2dmaWxlIGZvciB3YXJuaW5ncywgZXRjLiBhbmQgc2hvdyB3YXJuaW5ncyBldmVuIGlmIHVzZXIgaGFzIGNob3NlbiB0byBpZ25vcmUgdGhlbQoJCQl0cnkgewoJCQkKCQkJCSRsb2dmaWxlID0gbmV3IFNwbEZpbGVPYmplY3QoICRsb2dmaWxlX25hbWUsICJyYiIgKTsKCQkJCQoJCQkJd2hpbGUoICEkbG9nZmlsZS0+ZW9mKCkgKSB7CgkJCQkKCQkJCQkkbGluZSA9ICRsb2dmaWxlLT5jdXJyZW50KCk7CgkJCQkJJGlkID0gJGxvZ2ZpbGUtPmtleSgpOyAvLyBVc2UgdGhlIGxpbmUgbnVtYmVyIGFzIHVuaXF1ZSBrZXkgZm9yIGxhdGVyIHNvcnRpbmcKCQkJCQkkbG9nZmlsZS0+bmV4dCgpOwoJCQkJCQoJCQkJCWlmICggcHJlZ19tYXRjaCggJy9eXHMqKHppcCB3YXJuaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCS8vIExvb2tpbmcgZm9yIHNwZWNpZmljIHR5cGVzIG9mIHdhcm5pbmcgLSBpbiBwYXJ0aWN1bGFyIHdhbnQgdGhlIHdhcm5pbmcgdGhhdAoJCQkJCQkvLyBpbmRpY2F0ZXMgYSBmaWxlIGNvdWxkbid0IGJlIHJlYWQgYXMgd2Ugd2FudCB0byB0cmVhdCB0aGF0IGFzIGEgInNraXBwZWQiCgkJCQkJCS8vIHdhcm5pbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB6aXAgZmxhZ2dlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHByb2JsZW0gYnV0CgkJCQkJCS8vIGNyZWF0ZWQgdGhlIHppcCBmaWxlIGFueXdheSAtIGJ1dCBpdCB3b3VsZCBoYXZlIGdlbmVyYXRlZCB0aGUgbm9uLXplcm8gZXhpdAoJCQkJCQkvLyBjb2RlIG9mIDE4IGFuZCB3ZSBrZXkgb2ZmIHRoYXQgbGF0ZXIuIEFsbCBvdGhlciB3YXJuaW5ncyBhcmUgbm90IGNvbnNpZGVyZWQKCQkJCQkJLy8gcmVhc29ucyB0byByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hpbHN0IHN0aWxsIGNyZWF0aW5nIGEgemlwIGZpbGUgc28KCQkJCQkJLy8gd2UnbGwgZm9sbG93IHRoZSBsZWFkIG9uIHRoYXQgYW5kIG5vdCBoYXZlIG90aGVyIHdhcm5pbmcgdHlwZXMgaGFsdCB0aGUgYmFja3VwLgoJCQkJCQkvLyBTbyB3ZSdsbCB0cnkgYW5kIGxvb2sgZm9yIGEgd2FybmluZyBvdXRwdXQgdGhhdCBsb29rcyBsaWtlIGl0IGlzIGZpbGUgcmVsYXRlZC4uLgoJCQkJCQlpZiAoIHByZWdfbWF0Y2goICcvXlxzKih6aXAgd2FybmluZzopXHMqKFteOl0qOilccyooLiopL2knLCAkbGluZSwgJG1hdGNoZXMgKSApIHsKCQkJCQkJCgkJCQkJCQkvLyBNYXRjaGVkIHRvIHdoYXQgbG9va3MgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNoZWNrIHBhcnRpY3VsYXIgY2FzZXMKCQkJCQkJCXN3aXRjaCAoIHN0cnRvbG93ZXIoICRtYXRjaGVzWyAyIF0gKSApIHsKCQkJCQkJCQljYXNlICJjb3VsZCBub3Qgb3BlbiBmb3IgcmVhZGluZzoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJJHppcF93YXJuaW5nc1sgc2VsZjo6WklQX1dBUk5JTkdfU0tJUFBFRCBdWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCQkJCSR6aXBfd2FybmluZ3NfY291bnQrKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJY2FzZSAibmFtZSBub3QgbWF0Y2hlZDoiOgkJCQkJCQkJCQkKCQkJCQkJCQkJJHppcF9vdGhlclsgc2VsZjo6WklQX09USEVSX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkkemlwX290aGVyX2NvdW50Kys7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCWRlZmF1bHQ6CgkJCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJCQkkemlwX3dhcm5pbmdzX2NvdW50Kys7CgkJCQkJCQl9CgkJCQkJCQoJCQkJCQl9IGVsc2UgewoJCQkJCQkKCQkJCQkJCS8vIERpZG4ndCBtYXRjaCB0byB3aGF0IHdvdWxkIGxvb2sgbGlrZSBhIGZpbGUgcmVsYXRlZCB3YXJuaW5nIHNvIGNvdW50IGl0IHJlZ2FyZGxlc3MKCQkJCQkJCSR6aXBfd2FybmluZ3NbIHNlbGY6OlpJUF9XQVJOSU5HX0dFTkVSSUMgXVsgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkJJHppcF93YXJuaW5nc19jb3VudCsrOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooemlwIGVycm9yOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCSR6aXBfZXJyb3JzWyAkaWQgXSA9IHRyaW0oICRsaW5lICk7CgkJCQkJCSR6aXBfZXJyb3JzX2NvdW50Kys7CgkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooYWRkaW5nOikvaScsICRsaW5lICkgKSB7CgkJCQkJCgkJCQkJCS8vIEN1cnJlbnRseSBub3QgcHJvY2Vzc2luZyBhZGRpdGlvbnMgZW50cmllZAoJCQkJCQkvLyR6aXBfYWRkaXRpb25zW10gPSB0cmltKCAkbGluZSApOwoJCQkJCQkvLyR6aXBfYWRkaXRpb25zX2NvdW50Kys7CgkJCQkJCgkJCQkJfSBlbHNlaWYgKCBwcmVnX21hdGNoKCAnL15ccyooc2Q6KS9pJywgJGxpbmUgKSApIHsKCQkJCQkKCQkJCQkJJHppcF9kZWJ1Z1sgJGlkIF0gPSB0cmltKCAkbGluZSApOwoJCQkJCQkkemlwX2RlYnVnX2NvdW50Kys7CgkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gQ3VycmVudGx5IG5vdCBwcm9jZXNzaW5nIG90aGVyIGVudHJpZXMKCQkJCQkJLy8kemlwX290aGVyW10gPSB0cmltKCAkbGluZSApOwoJCQkJCQkvLyR6aXBfb3RoZXJfY291bnQrKzsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQl9CgkJCQkKCQkJCXVuc2V0KCAkbG9nZmlsZSApOwoJCQkJCgkJCQlAdW5saW5rKCAkbG9nZmlsZV9uYW1lICk7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB3ZSBzaG91bGQgaGF2ZSBiZWVuIGFibGUgdG8gb3BlbiB0aGUgbG9nIGZpbGUuLi4KCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnTG9nIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCAtIGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gU2V0IGNvbnZlbmllbmNlIGZsYWdzCQkJCgkJCSRoYXZlX3ppcF93YXJuaW5ncyA9ICggMCA8ICR6aXBfd2FybmluZ3NfY291bnQgKTsKCQkJJGhhdmVfemlwX2Vycm9ycyA9ICggMCA8ICR6aXBfZXJyb3JzX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9hZGRpdGlvbnMgPSAoIDAgPCAkemlwX2FkZGl0aW9uc19jb3VudCApOwoJCQkkaGF2ZV96aXBfZGVidWcgPSAoIDAgPCAkemlwX2RlYnVnX2NvdW50ICk7CgkJCSRoYXZlX3ppcF9vdGhlciA9ICggMCA8ICR6aXBfb3RoZXJfY291bnQgKTsKCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgdGhlIGV4aXQgY29kZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgbWlnaHQgaWdub3JlIGl0IG9yIG5vdAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgcHJvY2VzcyBleGl0IGNvZGU6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkZXhpdGNvZGUgKTsKCQkJCgkJCS8vIEFsd2F5cyByZXBvcnQgdGhlIG51bWJlciBvZiB3YXJuaW5ncyAtIGV2ZW4ganVzdCB0byBjb25maXJtIHRoYXQgd2UgZGlkbid0IGhhdmUgYW55CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcCBwcm9jZXNzIHJlcG9ydGVkOiAlMSRzIHdhcm5pbmclMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF93YXJuaW5nc19jb3VudCwgKCAoIDEgPT0gJHppcF93YXJuaW5nc19jb3VudCApID8gJycgOiAncycgKSApICk7CgoJCQkvLyBBbHdheXMgcmVwb3J0IHdhcm5pbmdzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB1c2VyIGhhcyBzZWxlY3RlZCB0byBpZ25vcmUgdGhlbQoJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF93YXJuaW5ncyApIHsKCQkJCgkJCQkkdGhpcy0+bG9nX3ppcF9yZXBvcnRzKCAkemlwX3dhcm5pbmdzLCBzZWxmOjokX3dhcm5pbmdfZGVzYywgIldBUk5JTkciLCBzZWxmOjpNQVhfV0FSTklOR19MSU5FU19UT19TSE9XLCBkaXJuYW1lKCBkaXJuYW1lKCAkdGVtcGRpciApICkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3BiX2JhY2t1cGJ1ZGR5JyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzZWxmOjpaSVBfV0FSTklOR1NfRklMRV9OQU1FICk7CgoJCQl9CgkJCQoJCQkvLyBBbHdheXMgcmVwb3J0IG90aGVyIHJlcG9ydHMgcmVnYXJkbGVzcwoJCQlpZiAoIHRydWUgPT09ICRoYXZlX3ppcF9vdGhlciApIHsKCQkJCgkJCQkvLyBPbmx5IHJlcG9ydCBudW1iZXIgb2YgaW5mb3JtYXRpb25hbHMgaWYgd2UgaGF2ZSBhbnkgYXMgdGhleSBhcmUgbm90IHRoYXQgaW1wb3J0YW50CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXAgcHJvY2VzcyByZXBvcnRlZDogJTEkcyBpbmZvcm1hdGlvbiUyJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX290aGVyX2NvdW50LCAoICggMSA9PSAkemlwX290aGVyX2NvdW50ICkgPyAnYWwnIDogJ2FscycgKSApICk7CgoJCQkJJHRoaXMtPmxvZ196aXBfcmVwb3J0cyggJHppcF9vdGhlciwgc2VsZjo6JF9vdGhlcl9kZXNjLCAiSU5GT1JNQVRJT04iLCBzZWxmOjpNQVhfT1RIRVJfTElORVNfVE9fU0hPVywgZGlybmFtZSggZGlybmFtZSggJHRlbXBkaXIgKSApIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdwYl9iYWNrdXBidWRkeScgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gc2VsZjo6WklQX09USEVSU19GSUxFX05BTUUgKTsKCgkJCX0KCQkJCgkJCQkvLyBTZWUgaWYgd2UgY2FuIGZpZ3VyZSBvdXQgd2hhdCBoYXBwZW5lZCAtIG5vdGUgdGhhdCAkZXhpdGNvZGUgY291bGQgYmUgbm9uLXplcm8gZm9yIGFjdGlvbmFibGUgd2FybmluZyhzKSBvciBlcnJvcgoJCQkJLy8gaWYgKCAobm8gemlwIGZpbGUpIG9yIChmYXRhbCBleGl0IGNvZGUpIG9yIChub3QgaWdub3Jpbmcgd2FybmFibGUgZXhpdCBjb2RlKSApCgkJCQlpZiAoICggISBAZmlsZV9leGlzdHMoICR0ZW1wX3ppcCApICkgfHwKCQkJCSAoICggMCAhPSAkZXhpdGNvZGUgKSAmJiAoIDE4ICE9ICRleGl0Y29kZSApICkgfHwKCQkJCSAoICggMTggPT0gJGV4aXRjb2RlICkgJiYgISR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKSApIHsKCQkJCQoJCQkJLy8gSWYgd2UgaGF2ZSBhbnkgemlwIGVycm9ycyByZXBvcnRlZCBzaG93IHRoZW0gcmVnYXJkbGVzcwoJCQkJaWYgKCB0cnVlID09PSAkaGF2ZV96aXBfZXJyb3JzICkgewoJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICUxJHMgZXJyb3JzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9lcnJvcnNfY291bnQgKSApOwoJCQkJCQoJCQkJCWZvcmVhY2ggKCAkemlwX2Vycm9ycyBhcyAkbGluZSApIHsKCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIHByb2Nlc3MgcmVwb3J0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbGluZSApOwoJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfQoKCQkJCS8vIFJlcG9ydCB3aGV0aGVyIG9yIG5vdCB0aGUgemlwIGZpbGUgd2FzIGNyZWF0ZWQgKHdoZXRoZXIgdGhhdCBiZSBpbiB0aGUgZmluYWwgb3IgdGVtcG9yYXJ5IGxvY2F0aW9uKQkJCQoJCQkJaWYgKCAhIEBmaWxlX2V4aXN0cyggJHRlbXBfemlwICkgKSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnWmlwIEFyY2hpdmUgZmlsZSBub3QgY3JlYXRlZCAtIGNoZWNrIHByb2Nlc3MgZXhpdCBjb2RlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgY3JlYXRlZCBidXQgd2l0aCBlcnJvcnMvYWN0aW9uYWJsZS13YXJuaW5ncyBzbyB3aWxsIGJlIGRlbGV0ZWQgLSBjaGVjayBwcm9jZXNzIGV4aXQgY29kZSBhbmQgd2FybmluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoKCQkJCX0KCQkJCQoJCQkJLy8gVGhlIG9wZXJhdGlvbiBoYXMgZmFpbGVkIG9uZSB3YXkgb3IgYW5vdGhlci4gTm90ZSB0aGF0IGFzIHRoZSB1c2VyIGRpZG4ndCBjaG9vc2UgdG8gaWdub3JlIGVycm9ycyB0aGUgemlwIGZpbGUKCQkJCS8vIGlzIGFsd2F5cyBjcmVhdGVkIGluIGEgdGVtcG9yYXJ5IGxvY2F0aW9uIGFuZCB0aGVuIG9ubHkgbW92ZWQgdG8gZmluYWwgbG9jYXRpb24gb24gc3VjY2VzcyB3aXRob3V0IGVycm9yIG9yIHdhcm5pbmdzLgoJCQkJLy8gVGhlcmVmb3JlIGlmIHRoZXJlIGlzIGEgemlwIGZpbGUgKHByb2R1Y2VkIGJ1dCB3aXRoIHdhcm5pbmdzKSBpdCB3aWxsIG5vdCBiZSB2aXNpYmxlIGFuZCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUKCQkJCS8vIHRlbXBvcmFyeSBkaXJlY3RvcnkgaXMgZGVsZXRlZCBiZWxvdy4KCQkJCQoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0gZWxzZSB7CgkJCQoJCQkJLy8gR290IGZpbGUgd2l0aCBubyBlcnJvciBvciB3YXJuaW5ncyBfb3JfIHdpdGggd2FybmluZ3MgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuIHRvIGlnbm9yZQoJCQkJaWYgKCBmYWxzZSA9PT0gJHRoaXMtPmdldF9pZ25vcmVfd2FybmluZ3MoKSApIHsKCQkJCQoJCQkJCS8vIEJlY2F1c2Ugbm90IGlnbm9yaW5nIHdhcm5pbmdzIHRoZSB6aXAgYXJjaGl2ZSB3YXMgYnVpbHQgaW4gdGVtcG9yYXJ5IGxvY2F0aW9uIHNvIHdlIG5lZWQgdG8gbW92ZSBpdAoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ01vdmluZyBaaXAgQXJjaGl2ZSBmaWxlIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJCS8vIE1ha2Ugc3VyZSBubyBzdGFsZSBmaWxlIGluZm9ybWF0aW9uCgkJCQkJY2xlYXJzdGF0Y2FjaGUoKTsKCQkJCQkKCQkJCQlAcmVuYW1lKCAkdGVtcF96aXAsICR6aXAgKTsKCQkJCQkKCQkJCQlpZiAoIEBmaWxlX2V4aXN0cyggJHppcCApICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIG1vdmVkIHRvIGxvY2FsIGFyY2hpdmUgZGlyZWN0b3J5LicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgb3IgYWN0aW9uYWJsZSB3YXJuaW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCQoJCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcCApOwoJCQkJCQkJCgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNvdWxkIG5vdCBiZSBtb3ZlZCB0byBsb2NhbCBhcmNoaXZlIGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBXYXJuaW5ncyB3ZXJlIGJlaW5nIGlnbm9yZWQgc28gYnVpbHQgaW4gZmluYWwgbG9jYXRpb24gc28gbm8gbmVlZCB0byBtb3ZlIGl0CgkJCQkJaWYgKCBAZmlsZV9leGlzdHMoICR6aXAgKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXyggJ1ppcCBBcmNoaXZlIGZpbGUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgd2l0aCBubyBlcnJvcnMgKGFueSBhY3Rpb25hYmxlIHdhcm5pbmdzIGlnbm9yZWQgYnkgdXNlciBzZXR0aW5ncykuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkKCQkJCQkJJHRoaXMtPmxvZ19hcmNoaXZlX2ZpbGVfc3RhdHMoICR6aXAgKTsKCQkJCQkJCQoJCQkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gT2RkIGNvbmRpdGlvbiAtIGZpbGUgc2hvdWxkIGJlIHByZXNlbnQgYnV0IGFwcGFyZW50bHkgbm90PwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXAgQXJjaGl2ZSBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBsb2NhbCBhcmNoaXZlIGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQkJCQoKCQkJLy8gQ2xlYW51cCB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdpbGwgaGF2ZSBhbGwgZGV0cml0dXMgYW5kIG1heWJlIGluY29tcGxldGUgemlwIGZpbGUJCQkKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnUmVtb3ZpbmcgdGVtcG9yYXJ5IGRpcmVjdG9yeS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQoJCQlpZiAoICEoICR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJHRlbXBkaXIgKSApICkgewoJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUZW1wb3JhcnkgZGlyZWN0b3J5IGNvdWxkIG5vdCBiZSBkZWxldGVkOiAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRlbXBkaXIgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkJCQkJCQkKCQl9CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCUlmIG5vIHNwZWNpZmljIGl0ZW1zIGdpdmVuIHRvIGV4dHJhY3QgdGhlbiBpdCdzIGEgY29tcGxldGUgdW56aXAKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgPSBhcnJheSgpICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQlpZiAoIGVtcHR5KCAkaXRlbXMgKSApIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CQkJCQkKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0KCkKCQkgKgoJCSAqCUV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhIHppcCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHVzaW5nIHRoZSBiZXN0IHVuemlwIG1ldGhvZHMgcG9zc2libGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkemlwX2ZpbGUJCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGV4dHJhY3QgZnJvbS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5CQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGV4dHJhY3QgaW50by4KCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycpIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciB1bmFyY2hpdmluZy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoKQoJCSAqCgkJICoJRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdXNpbmcgdGhlIGJlc3QgdW56aXAgbWV0aG9kcyBwb3NzaWJsZS4KCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gJycsICRpdGVtcyApIHsKCQkKCQkJLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlCgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWZpbGVfZXhpc3RzKCkKCQkgKgkKCQkgKglUZXN0cyB3aGV0aGVyIGEgZmlsZSAod2l0aCBwYXRoKSBleGlzdHMgaW4gdGhlIGdpdmVuIHppcCBmaWxlCgkJICoJSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUBwYXJhbQkJYm9vbAkkbGVhdmVfb3BlbgkJT3B0aW9uYWw6IFRydWUgaWYgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBsZWZ0IG9wZW4KCQkgKglAcmV0dXJuCQlib29sL2FycmF5CQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBhbmQgZmFsc2UgaWYgbm90LCBhcnJheSBmb3Igb3RoZXIgcHJvYmxlbQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBhcmNoaXZlIGZpbGUgY2hlY2tpbmcuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQlyZXR1cm4gYXJyYXkoIDEsICJNZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBhY3Rpb24iICk7CgoJCX0KCQkKCQkvKglnZXRfZmlsZV9saXN0KCkKCQkgKgkKCQkgKglHZXQgYW4gYXJyYXkgb2YgYWxsIGZpbGVzIGluIGEgemlwIGZpbGUgd2l0aCBzb21lIGZpbGUgcHJvcGVydGllcy4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCVRoZSBmaWxlIHRvIGxpc3QgdGhlIGNvbnRlbnQgb2YKCQkgKglAcmV0dXJuCQlib29sfGFycmF5CQkJCWZhbHNlIG9uIGZhaWx1cmUsIG90aGVyd2lzZSBhcnJheSBvZiBmaWxlIHByb3BlcnRpZXMgKG1heSBiZSBlbXB0eSkKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZpbGVfbGlzdCggJHppcF9maWxlICkgewoJCQoJCQkvLyBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnV0IGp1c3QgaW4gY2FzZSByZXR1cm4gZmFsc2Ugc2lsZW50bHkKCQkJLy9wYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5nZXRfbWV0aG9kX3RhZygpIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGFyY2hpdmUgZmlsZSBsaXN0aW5nLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJcmV0dXJuIGZhbHNlOwoKCQl9CgkJCgkJLyoJc2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbHxzdHJpbmcJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfY29tbWVudCggJHppcF9maWxlLCAkY29tbWVudCApIHsKCQkKCQkJLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ1dCBqdXN0IGluIGNhc2UgcmV0dXJuIGZhbHNlIHNpbGVudGx5CgkJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGhpcy0+Z2V0X21ldGhvZF90YWcoKSAuIF9fKCcgbWV0aG9kIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBhcmNoaXZlIGNvbW1lbnQgc2V0dGluZy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiAiTWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgYWN0aW9uIjsKCgkJfQoKCQkvKglnZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkemlwX2ZpbGUJCUZpbGVuYW1lIG9mIGFyY2hpdmUgdG8gcmV0cmlldmUgY29tbWVudCBmcm9tLgoJCSAqCUByZXR1cm4JCWJvb2x8c3RyaW5nCQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBaaXAgY29tbWVudCBvdGhlcndpc2UuCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9jb21tZW50KCAkemlwX2ZpbGUgKSB7CgkJCgkJCS8vIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBidXQganVzdCBpbiBjYXNlIHJldHVybiBmYWxzZSBzaWxlbnRseQoJCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RoZSAnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJHRoaXMtPmdldF9tZXRob2RfdGFnKCkgLiBfXygnIG1ldGhvZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgYXJjaGl2ZSBjb21tZW50IHJldHJpZXZhbC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCgkJfQoJCQoJfSAvLyBlbmQgcGx1Z2luYnVkZHlfemJ6aXBwcm9jIGNsYXNzLgkKCQp9Cj8+Cg==
###PACKDATA,FILE_END,/lib/zipbuddy/zbzipproc.php,importbuddy/lib/zipbuddy/zbzipproc.php
###PACKDATA,FILE_START,/lib/zipbuddy/zbzipziparchive.php,importbuddy/lib/zipbuddy/zbzipziparchive.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZSBDbGFzcwogKgogKiAgRXh0ZW5kcyB0aGUgemlwIGNhcGFiaWxpdHkgY29yZSBjbGFzcyB3aXRoIHByb2Mgc3BlY2lmaWMgY2FwYWJpbGl0eQogKgkKICoJVmVyc2lvbjogMS4wLjAKICoJQXV0aG9yOgogKglBdXRob3IgVVJJOgogKgogKglAcGFyYW0JCSRwYXJlbnQJCW9iamVjdAkJT3B0aW9uYWwgcGFyZW50IG9iamVjdCB3aGljaCBjYW4gcHJvdmlkZSBmdW5jdGlvbnMgZm9yIHJlcG9ydGluZywgZXRjLgogKglAcmV0dXJuCQludWxsCiAqCiAqLwppZiAoICFjbGFzc19leGlzdHMoICJwbHVnaW5idWRkeV96YnppcHppcGFyY2hpdmUiICkgKSB7CgoJLyoqCgkgKglwbHVnaW5idWRkeV9aaXBBcmNoaXZlIENsYXNzCgkgKgoJICoJV3JhcHBlciBmb3IgWmlwQXJjaGl2ZSB0byBoYW5kbGUgZXJyb3Igc2l0dWF0aW9ucyBhbmQgcHJvdmlkZSBhZGRpdGlvbmFsIGZ1bmN0aW9ucwoJICoKCSAqCUBwYXJhbQlub25lCgkgKglAcmV0dXJuCW51bGwKCSAqCgkgKi8KCWNsYXNzIHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUgewoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY3JlYXRlZCBaaXBBcmNoaXZlIG9iamVjdCBpZiBpdCBjYW4gYmUgY3JlYXRlZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgJF96YSAJb2JqZWN0CiAgICAgICAgICovCgkJcHJpdmF0ZSAkX3phID0gTlVMTDsKCQkKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKglUT0RPOiBDb25zaWRlciBoYXZpbmcgYSAic3VwcHJlc3Mgd2FybmluZ3MiIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgd2hldGhlciBtZXRob2RzCgkJICoJc2hvdWxkIGJlIGludm9rZWQgd2l0aCB3YXJuaW5ncyBzdXBwcmVzc2VkIG9yIG5vdC4gRm9yIGlzX2F2YWlsYWJsZSgpIHVzYWdlIHdlIHdvdWxkCgkJICoJd2FudCB0byBzbyBhcyBub3QgdG8gcG90ZW50aWFsbHkgZmxvb2QgdGhlIFBIUCBlcnJvciBsb2cuIEZvciBvdGhlciBmdW5jdGlvbnMgdGhhdAoJCSAqCWFyZSBub3QgY2FsbGVkIGZyZXF1ZW50bHkgd2UgbWlnaHQgbm90IHdhbnQgdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmdzLgoJCSAqCQoJCSAqCUBwYXJhbQkJbm9uZQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCQkJCgkJCWlmICggY2xhc3NfZXhpc3RzKCAnWmlwQXJjaGl2ZScsIGZhbHNlICkgKSB7CgkJCQoJCQkJLy8gSXQncyBhdmFpbGFibGUgc28gY3JlYXRlIHRoZSBwcml2YXRlIGluc3RhbmNlCgkJCQkkdGhpcy0+X3phID0gbmV3IFppcEFyY2hpdmUoKTsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIE5vdCBhdmFpbGFibGUgc28gdGhyb3cgdGhlIGV4Y2VwdGlvbiBmb3IgdGhlIGNhbGxlciB0byBoYW5kbGUKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oICdaaXBBcmNoaXZlIGNsYXNzIGRvZXMgbm90IGV4aXN0LicgKTsKCQkJCgkJCX0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkgewoJCQoJCQlpZiAoIE5VTEwgIT0gJHRoaXMtPl96YSApIHsgdW5zZXQgKCAkdGhpcy0+X3phICk7IH0KCQkJCgkJCXJldHVybjsKCQkKCQl9CgkJCgkJLyoqCgkJICoJX19jYWxsKCkKCQkgKgkKCQkgKglNYWdpYyBtZXRob2QgaW50ZXJjZXB0aW5nIGNhbGxzIHRvIHVua25vd24gbWV0aG9kcy4gVGhpcyBhbGxvd3MgdXMgdG8gaW50ZXJjZXB0CgkJICoJYWxsIG1ldGhvZCBjYWxscyBhbmQgYWRkIGFkZGl0aW9uYWwgcHJvY2Vzc2luZwoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSRtZXRob2QJCVRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QKCQkgKglAcGFyYW0JCWFycmF5CSRhcmd1bWVudHMJQXJyYXkgb2YgdGhlIGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZCBjYWxsCgkJICoJQHJldHVybgkJbWl4ZWQJJHJlc3VsdAkJV2hhdGV2ZXIgdGhlIGludm9rZWQgd3JhcHBlciBtZXRob2QgY2FsbCByZXR1cm5zCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19jYWxsKCAkbWV0aG9kLCAkYXJndW1lbnRzICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCSRyZXN1bHQgPSBAY2FsbF91c2VyX2Z1bmNfYXJyYXkoIGFycmF5KCAkdGhpcy0+X3phLCAkbWV0aG9kICksICRhcmd1bWVudHMgKTsKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQkKCQkvKioKCQkgKglfX2dldCgpCgkJICoJCgkJICoJTWFnaWMgbWV0aG9kIGludGVyY2VwdGluZyBjYWxscyB0byB1bmtub3duIHByb3BlcnRpZXMuIFRoaXMgbWVhbnMgd2UgaGF2ZSB0bwoJCSAqCXByb3ZpZGUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHdyYXBwZWQgb2JqZWN0IGJ1dCB0aGF0J3Mgb2sgYXMgdGhlcmUgYXJlbid0IG1hbnkuCgkJICoJTm90ZTogTWF5YmUgd2UgY2FuIGdldCB0aGUgb2JqZWN0IHByb3BlcnRpZXMgYW5kIGF1dG9tYXRlIHRoaXM/CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJG5hbWUJCVRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQoJCSAqCUByZXR1cm4JCW1peGVkCSRyZXN1bHQJCVdoYXRldmVyIHRoZSB3cmFwcGVkIG9iamVjdCBwcm9wZXJ0eSByZXR1cm5zCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19nZXQoICRuYW1lICkgewoJCQoJCQlzd2l0Y2ggKCAkbmFtZSApIHsKCQkJCgkJCQljYXNlICJjb21tZW50IjoKCQkJCQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+X3phLT5jb21tZW50OwoJCQkJCWJyZWFrOwoJCQkJCgkJCQljYXNlICJudW1GaWxlcyI6CgkJCQkKCQkJCQkkcmVzdWx0ID0gJHRoaXMtPl96YS0+bnVtRmlsZXM7CgkJCQkJYnJlYWs7CgkJCQkKCQkJCWNhc2UgImZpbGVuYW1lIjoKCQkJCQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+X3phLT5maWxlbmFtZTsKCQkJCQlicmVhazsKCQkJCQoJCQkJY2FzZSAic3RhdHVzIjoKCQkJCQoJCQkJCSRyZXN1bHQgPSAkdGhpcy0+X3phLT5zdGF0dXM7CgkJCQkJYnJlYWs7CgkJCQkJCgkJCQljYXNlICJzdGF0dXNTeXMiOgoJCQkJCgkJCQkJJHJlc3VsdCA9ICR0aGlzLT5femEtPnN0YXR1c1N5czsKCQkJCQlicmVhazsKCQkJCQkKCQkJCWRlZmF1bHQ6CgkJCQkKCQkJCQkvLyBIbW0sIG5vdCBxdWl0ZSBzdXJlIHdoYXQgd2Ugc2hvdWxkIHJldHVybiBoZXJlLi4uCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCgkJCX0KCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQoJCX0KCQoJCS8qKgoJCSAqCWVycm9ySW5mbygpCgkJICoJCgkJICoJVHJhbnNsYXRlIGEgWmlwQXJjaGl2ZSBlcnJvciBjb2RlIGludG8gYW4gaW5mb3JtYXRpdmUgc3RyaW5nIGRlc2NyaXB0aW9uCgkJICoJYW5kIHJldHVybnMgdGhlIHN0cmluZy4gQW4gZXJyb3IgbnVtYmVyIGNhbiBiZSBwYXNzZWQgaW4sIG90aGVyd2lzZSB3aWxsCgkJICoJZ2V0IHRoZSBzdGF0dXMgcHJvcGVydHkgYW5kIHVzZSB0aGF0IChpZiBub3QgaW5kaWNhdGluZyBubyBlcnJvcikgb3IgdGhlCgkJICoJc3RhdHVzU3lzIHByb3BlcnR5IGFuZCB1c2UgdGhhdCAoaWYgbm90IGluZGljYXRpbmcgbm8gZXJyb3IpLiBJbiB0aGUgY2FzZQoJCSAqCW9mIHRoZSBzdGF0dXNTeXMgcHJvcGVydHkgd2lsbCBnZXQgdGhlIGVycm9yIHN0cmluZyBmcm9tIHRoZSBnZXRTdGF0dXNTdHJpbmcoKQoJCSAqCW1ldGhvZCwgb3RoZXJ3aXNlIGZvciBzdGF0dXMgcHJvcGVydHkgb3IgcGFzc2VkIGluIHZhbHVlIHVzZSB0aGUgbWFwcGluZ3MKCQkgKgliZWxvdy4KCQkgKglOb3RlOiBUaGlzIGRvZXMgbWVhbiB0aGF0IGEgc3RhdHVzU3lzIGVycm9yIG5vIHNob3VsZCBub3QgYmUgcGFzc2VkIGluCgkJICoJcHJlc2VudGx5LiBJbiBmdXR1cmUgbWF5IGNob29zZSB0byB1c2UgYW4gb2Zmc2V0IG1hcHBpbmcgdG8gaGFuZGxlIHRoYXQuCgkJICoJCgkJICoJQHBhcmFtCQlpbnRlZ2VyCSRlcnJvcglPcHRpb25hbDogVGhlIGVycm9yIGNvZGUKCQkgKglAcGFyYW0JCWJvb2wJJGZ1bGwJT3B0aW9uYWw6IFRydWUgdG8gcHJvdmlkZSBhIG5hbWUvdmFsdWUvZGVzY3JpcHRpb24gc3RyaW5nCgkJICoJQHJldHVybgkJc3RyaW5nCQkJSW5mb3JtYXRpdmUgZXJyb3Igc3RyaW5nCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZXJyb3JJbmZvKCAkZXJyb3IgPSBQSFBfSU5UX01BWCwgJGZ1bGwgPSB0cnVlICkgewoJCQoJCQkvLyBHZXQgc3RhdHVzU3lzIHByb3BlcnR5IHZhbHVlIGluIGNhc2Ugd2UgbmVlZCBpdAoJCQkkZXJyb3Jfc3lzID0gJHRoaXMtPl96YS0+c3RhdHVzU3lzOwoJCQkKCQkJLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGJlZW4gZ2l2ZW4gb3IgbmVlZCB0byBnZXQgYSBzdGF0dXMgdmFsdWUKCQkJaWYgKCBQSFBfSU5UX01BWCA9PSAkZXJyb3IpIHsKCQkJCgkJCQkvLyBObyBlcnJvciBudW1iZXIgcGFzc2VkIGluLCBsZXRzIGdldCBvbmUKCQkJCSRlcnJvciA9ICR0aGlzLT5femEtPnN0YXR1czsKCQkJCgkJCX0KCQkJCgkJCWlmICggKCBaSVBBUkNISVZFOjpFUl9PSyA9PSAkZXJyb3IgKSAmJiAoIDAgPCAkZXJyb3Jfc3lzICkgKSB7CgkJCQoJCQkJLy8gTm8gYmFzaWMgZXJyb3IgQU5EIHdlIGhhdmUgYSBzeXN0ZW0gZXJyb3IKCQkJCSRlcnJvcl9zdHJpbmcgPSAiWkxJQiIgLiAiKCIgLiAkZXJyb3Jfc3lzIC4gIikgOiAiIC4gJHRoaXMtPl96YS0+Z2V0U3RhdHVzU3RyaW5nKCk7CgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSRlcnJvcl9uYW1lID0gJyc7CgkJCQkkZXJyb3JfZGVzY3JpcHRpb24gPSAnJzsKCQkJCgkJCQkvLyBJdCdzIGVpdGhlciBhIGJhc2ljIGVycm9yIE9SIG5vIHN5c3RlbSBlcnJvcgoJCQkJLy8gV2UgY2FuIGNoZWNrIHRoZSBzeW1ib2xpYyB2YWx1ZXMKCQkJCXN3aXRjaCggKGludCkgJGVycm9yICkgewoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfT0s6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSUl9PSyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJObyBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfT1BFTjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfT1BFTiI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDYW4ndCBvcGVuIGZpbGUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX01FTU9SWToKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfTUVNT1JZIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0VYSVNUUzoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJSX0VYSVNUUyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJGaWxlIGFscmVhZHkgZXhpc3RzIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9JTkNPTlM6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0lOQ09OUyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJaaXAgYXJjaGl2ZSBpbmNvbnNpc3RlbnQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0lOVkFMOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9JTlZBTCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJJbnZhbGlkIGFyZ3VtZW50IjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9OT0VOVDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfTk9FTlQiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTm8gc3VjaCBmaWxlIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9OT1pJUDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfTk9aSVAiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiTm90IGEgemlwIGFyY2hpdmUiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1JFQUQ6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1JFQUQiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiUmVhZCBlcnJvciI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfU0VFSzoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfU0VFSyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJTZWVrIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9NVUxUSURJU0s6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX01VTFRJRElTSyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJNdWx0aS1kaXNrIHppcCBhcmNoaXZlcyBub3Qgc3VwcG9ydGVkIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9SRU5BTUU6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1JFTkFNRSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0NMT1NFOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DTE9TRSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfV1JJVEU6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1dSSVRFIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIldyaXRlIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DUkM6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0NSQyI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDUkMgZXJyb3IiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX1pJUENMT1NFRDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfWklQQ0xPU0VEIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIkNvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfVE1QT1BFTjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfVE1QT1BFTiI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfWkxJQjoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfWkxJQiI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJabGliIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9DSEFOR0VEOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DSEFOR0VEIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIkVudHJ5IGhhcyBiZWVuIGNoYW5nZWQiOwoJCQkJIAlicmVhazsKCQkJCSBjYXNlIFpJUEFSQ0hJVkU6OkVSX0NPTVBOT1RTVVBQOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9DT01QTk9UU1VQUCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZCI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfRU9GOgoJCQkJIAkkZXJyb3JfbmFtZSA9ICJaSVBBUkNISVZFOjpFUl9FT0YiOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiUHJlbWF0dXJlIEVPRiI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfSU5URVJOQUw6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX0lOVEVSTkFMIjsKCQkJCSAJJGVycm9yX2Rlc2NyaXB0aW9uID0gIkludGVybmFsIGVycm9yIjsKCQkJCSAJYnJlYWs7CgkJCQkgY2FzZSBaSVBBUkNISVZFOjpFUl9SRU1PVkU6CgkJCQkgCSRlcnJvcl9uYW1lID0gIlpJUEFSQ0hJVkU6OkVSX1JFTU9WRSI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJDYW4ndCByZW1vdmUgZmlsZSI7CgkJCQkgCWJyZWFrOwoJCQkJIGNhc2UgWklQQVJDSElWRTo6RVJfREVMRVRFRDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJfREVMRVRFRCI7CgkJCQkgCSRlcnJvcl9kZXNjcmlwdGlvbiA9ICJFbnRyeSBoYXMgYmVlbiBkZWxldGVkIjsKCQkJCSAJYnJlYWs7CgkJCQkgZGVmYXVsdDoKCQkJCSAJJGVycm9yX25hbWUgPSAiWklQQVJDSElWRTo6RVJSX1VOS05PV04iOwoJCQkJIAkkZXJyb3JfZGVzY3JpcHRpb24gPSAiVW5rbW93biBlcnJvciI7CgkJCQl9CgkJCQkKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZXJyb3JfbmFtZSAuICIoIiAuICRlcnJvciAuICIpIDogIiAuICRlcnJvcl9kZXNjcmlwdGlvbjsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmUgd2F5IG9yIGFub3RoZXIgd2UgaGF2ZSBhIHN0cmluZyB0byByZXR1cm4KCQkJcmV0dXJuICRlcnJvcl9zdHJpbmc7CgkJCgkJfQoJCQoJfQoKCWNsYXNzIHBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZSBleHRlbmRzIHBsdWdpbmJ1ZGR5X3piemlwY29yZSB7CgkKICAgICAgICAvKioKICAgICAgICAgKiBtZXRob2QgdGFnIHVzZWQgdG8gcmVmZXIgdG8gdGhlIG1ldGhvZCBhbmQgZW50aXRpZXMgYXNzb2NpYXRlZCB3aXRoIGl0IHN1Y2ggYXMgY2xhc3MgbmFtZQogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgJF9tZXRob2RfdGFnIAlzdHJpbmcKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfbWV0aG9kX3RhZyA9ICd6aXBhcmNoaXZlJzsKCQkJCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyB0ZWxscyB1cyB3aGV0aGVyIHRoaXMgbWV0aG9kIGlzIHJlZ2FyZGVkIGFzIGEgImNvbXBhdGliaWxpdHkiIG1ldGhvZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYm9vbAogICAgICAgICAqLwoJCXB1YmxpYyBzdGF0aWMgJF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCA9IGZhbHNlOwoJCQkKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHRlbGxzIHVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBtZXRob2Qgc28gdGhleSBjYW4gYmUgY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXRob2QgY2FuIGJlIHN1cHBvcnRlZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkKICAgICAgICAgKi8KCQlwdWJsaWMgc3RhdGljICRfbWV0aG9kX2RlcGVuZGVuY2llcyA9IGFycmF5KCAnY2xhc3NlcycgPT4gYXJyYXkoICdaaXBBcmNoaXZlJyApLAoJCQkJCQkJCQkJCSAgCQkgJ2Z1bmN0aW9ucycgPT4gYXJyYXkoKSwKCQkJCQkJCQkJCQkgIAkJICdleHRlbnNpb25zJyA9PiBhcnJheSgpLAoJCQkJCQkJCQkJCSAgCQkgJ2ZpbGVzJyA9PiBhcnJheSgpCgkJCQkJCQkJCQkJCQkpOwoJCQkKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBzdGF0aWMgbWV0aG9kIHRhZyBpbiBhIHN0YXRpYyBjb250ZXh0CgkJICoKCQkgKiBAcmV0dXJuCQlzdHJpbmcJVGhlIG1ldGhvZCB0YWcKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X21ldGhvZF90YWdfc3RhdGljKCkgewoJCQoJCQlyZXR1cm4gc2VsZjo6JF9tZXRob2RfdGFnOwoJCQkKCQl9CgoJCS8qKgoJCSAqIAoJCSAqIGdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZF9zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBjb21wYXRpYmlsaXR5IG1ldGhvZCBpbmRpY2F0b3IgaW4gYSBzdGF0aWMgY29udGV4dAoJCSAqCgkJICogQHJldHVybgkJYm9vbAlUcnVlIGlmIGlzIGEgY29tcGF0aWJpbGl0eSBtZXRob2QKCQkgKgoJCSAqLwoJCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIHNlbGY6OiRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2Q7CgkJfQoKCQkvKioKCQkgKiAKCQkgKiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSBtZXRob2QgZGVwZW5kZW5jaWVzIGFycmF5IGluIGEgc3RhdGljIGNvbnRleHQKCQkgKgoJCSAqIEByZXR1cm4JCWFycmF5CVRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIG1ldGhvZCB0aGF0IGlzIHJlcXVpcmVzIHRvIGJlIGEgc3VwcG9ydGVkIG1ldGhvZAoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWV0aG9kX2RlcGVuZGVuY2llc19zdGF0aWMoKSB7CgkJCgkJCXJldHVybiBzZWxmOjokX21ldGhvZF9kZXBlbmRlbmNpZXM7CgkJfQoKCQkvKioKCQkgKglfX2NvbnN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCQkgKgkKCQkgKglAcGFyYW0JCXJlZmVyZW5jZQkmJHBhcmVudAkJW29wdGlvbmFsXSBSZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0dXMoKSBmdW5jdGlvbiBmb3Igc3RhdHVzIHVwZGF0ZXMuCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAmJHBhcmVudCA9IE5VTEwgKSB7CgoJCQlwYXJlbnQ6Ol9fY29uc3RydWN0KCAkcGFyZW50ICk7CgkJCQoJCQkvLyBPdmVycmlkZSBzb21lIG9mIHBhcmVudCBkZWZhdWx0cwoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSA9IGFycmF5X21lcmdlKCAkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXSwKCQkJCQkJCQkJCQkJCQkJYXJyYXkoICduYW1lJyA9PiAnWmlwQXJjaGl2ZSBNZXRob2QnLAoJCQkJCQkJCQkJCQkJICAJCQkgICAnY29tcGF0aWJpbGl0eScgPT4gcGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kICkKCQkJCQkJCQkJCQkJCSAgCSAgICk7CgoJCQkvLyBObyByZWxldmFudCBwYXJhbWV0ZXJzIGZvciB0aGlzIG1ldGhvZAoJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAncGFyYW0nIF0gPSBhcnJheSgpOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJX19kZXN0cnVjdCgpCgkJICoJCgkJICoJRGVmYXVsdCBkZXN0cnVjdG9yLgoJCSAqCQoJCSAqCUByZXR1cm4JCW51bGwKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCApIHsKCQkKCQkJcGFyZW50OjpfX2Rlc3RydWN0KCk7CgoJCX0KCQkKCQkvKioKCQkgKglnZXRfbWV0aG9kX3RhZygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgKHN0YXRpYykgbWV0aG9kIHRhZwoJCSAqCQoJCSAqCUByZXR1cm4JCXN0cmluZyBUaGUgbWV0aG9kIHRhZwoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9tZXRob2RfdGFnKCkgewoJCQoJCQlyZXR1cm4gcGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlOjokX21ldGhvZF90YWc7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglnZXRfaXNfY29tcGF0aWJpbGl0eV9tZXRob2QoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIChzdGF0aWMpIGlzX2NvbXBhdGliaWxpdHlfbWV0aG9kIGJvb2xlYW4KCQkgKgkKCQkgKglAcmV0dXJuCQlib29sCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kKCkgewoJCQoJCQlyZXR1cm4gcGx1Z2luYnVkZHlfemJ6aXB6aXBhcmNoaXZlOjokX2lzX2NvbXBhdGliaWxpdHlfbWV0aG9kOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJaXNfYXZhaWxhYmxlKCkKCQkgKgkKCQkgKglBIGZ1bmN0aW9uIHRoYXQgdGVzdHMgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHNwZWNpZmljIG1ldGhvZCBhbmQgaXRzIGF2YWlsYWJsZSBtb2Rlcy4gV2lsbCB0ZXN0IGZvcgoJCSAqICBtdWx0aXBsZSBtb2RlcyAoemlwICYgdW56aXApIGFuZCBvbmx5IHJldHVybiBmYWxzZSBpZiBuZWl0aGVyIGlzIGF2YWlsYWJsZS4gQWN0dWFsIGF2YWlsYWJsZSBtb2RlcyB3aWxsCgkJICogIGJlIGluZGljYXRlZCBpbiB0aGUgbWV0aG9kIGF0dHJpYnV0ZXMuCgkJICoKCQkgKiAgTm90ZTogaW4gdGhpcyBjYXNlIGFzIHRoZSB6aXAgYW5kIHVuemlwIGNhcGFiaWxpdGllcyBhcmUgYWxsIHdyYXBwZWQgdXAgaW4gdGhlIHNhbWUgY2xhc3MgdGhlbiBpZiB3ZQoJCSAqICBjYW4gemlwIHRoZW4gd2UnbGwgYXNzdW1lIChmb3Igbm93KSB0aGF0IHdlIGNhbiB1bnppcCBhcyB3ZWxsIHNvIGF0dHJpYnV0ZXMgYXJlIHNldCBhY2NvcmRpbmdseS4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkdGVtcGRpcglUZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZSBmb3IgYW55IHRlc3QgZmlsZXMgKG11c3QgYmUgd3JpdGVhYmxlKQoJCSAqCUByZXR1cm4JCWJvb2wJCQkJVHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIGF2YWlsYWJsZSBmb3IgYXQgbGVhc3Qgb25lIG1vZGUsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGlzX2F2YWlsYWJsZSggJHRlbXBkaXIgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCgkJCSR0ZXN0X2ZpbGUgPSAkdGVtcGRpciAuICd0ZW1wX3Rlc3RfJyAuIHVuaXFpZCgpIC4gJy56aXAnOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9aaXBBcmNoaXZlKCk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSB0ZXN0IEZBSUxFRDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkvLyBUaGlzIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBmb3Igc29tZSBlcnJvciBzY2VuYXJpb3Mgb3IgYW4gZXJyb3IgY29kZQoJCQkJLy8gSWYgaXQgcmV0dXJuIGZhbHNlIHdlIGRvbid0IHJlYWxseSBrbm93IHdoeSAtIHRoZXJlIG1heSBoYXZlIGJlZW4gYSBXYXJuaW5nIGdlbmVyYXRlZAoJCQkJLy8gYnV0IHdlIG5lZWQgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYmVjYXVzZSBvZiB0aGUgZnJlcXVlbmN5IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCgkJCQkvLyBzbyB3ZSBjYW4gb25seSBpbmRpY2F0ZSBhIGdlbmVyYWwgZmFpbHVyZQoJCQkJJHJlcyA9ICR6YS0+b3BlbiggJHRlc3RfZmlsZSwgWklQQVJDSElWRTo6Q1JFQVRFIHwgWklQQVJDSElWRTo6T1ZFUldSSVRFICk7CgkJCQkKCQkJCWlmICggdHJ1ZSA9PT0gJHJlcyApIHsKCQkJCQoJCQkJCWlmICggISR6YS0+YWRkRmlsZSggX19GSUxFX18sICd0aGlzX2lzX2FfdGVzdC50eHQnKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgX18oJ1ppcEFyY2hpdmUgdGVzdCBGQUlMRUQ6IFVuYWJsZSB0byBhZGQgZmlsZSB0byB6aXAgZmlsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbygpOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCWlmICggISR6YS0+Y2xvc2UoKSApIHsKCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAgX18oJ1ppcEFyY2hpdmUgdGVzdCBGQUlMRUQ6IFByb2JsZW0gY3JlYXRpbmcvY2xvc2luZyB6aXAgZmlsZS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbygpOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCWlmICggQGZpbGVfZXhpc3RzKCAkdGVzdF9maWxlICkgKSB7CgkJCQkJCgkJCQkJCWlmICggIUB1bmxpbmsoICR0ZXN0X2ZpbGUgKSApIHsKCQkJCQkKCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0Vycm9yICM1NjQ2MzQuIFVuYWJsZSB0byBkZWxldGUgdGVzdCBmaWxlIGAnIC4gJHRlc3RfZmlsZSAuICdgLicgKTsKCQkJCQkJCgkJCQkJCX0KCQkJCQkKCQkJCQkJLy8gVGhlIHppcCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgLSBpbXBsaWVzIGNhbiB6aXAgYW5kIHVuemlwIGFuZCBoZW5jZSBjaGVjayBhbmQgbGlzdAoJCQkJCQkvLyBOb3RlOiB3ZSBhY3R1YWxseSBkb24ndCB3YW50IHRvIGRvIGFyY2hpdmluZyB3aXRoIHRoaXMgbWV0aG9kIHlldAoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX3ppcHBlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfdW56aXBwZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2NoZWNrZXInIF0gPSB0cnVlOwoJCQkJCQkkdGhpcy0+X21ldGhvZF9kZXRhaWxzWyAnYXR0cicgXVsgJ2lzX2xpc3RlcicgXSA9IHRydWU7CgkJCQkJCSR0aGlzLT5fbWV0aG9kX2RldGFpbHNbICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc191bmFyY2hpdmVyJyBdID0gdHJ1ZTsKCQkJCQkJJHRoaXMtPl9tZXRob2RfZGV0YWlsc1sgJ2F0dHInIF1bICdpc19leHRyYWN0b3InIF0gPSB0cnVlOwoJCQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnWmlwQXJjaGl2ZSB0ZXN0IFBBU1NFRC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdaaXBBcmNoaXZlIHRlc3QgRkFJTEVEOiBaaXAgZmlsZSBub3QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSB0ZXN0IEZBSUxFRDogVW5hYmxlIHRvIGNyZWF0ZS9vcGVuIHppcCBmaWxlLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQkKCQkJCQkvLyBJZiB3ZSBnb3QgYW4gZXJyb3IgY29kZSAocmF0aGVyIHRoYW4gc2ltcGx5IGEgZmFsc2UgZmFpbHVyZSBpbmRpY2F0aW9uKSB0aGVuIHRyYW5zbGF0ZSBpdAoJCQkJCS8vIEl0IHNlZW1zIHRoYXQgaW4gdGhlc2UgY2FzZXMgdGhlIGludGVybmFsIHN0YXR1cyBkb2Vzbid0IGluZGljYXRlIGFueXRoaW5nIHNvIHdlIGNhbm5vdCB1c2UgdGhhdAoJCQkJCWlmICggZmFsc2UgIT09ICRyZXMgKSB7CgkJCQkJCgkJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggJHJlcyApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICBfXygnWmlwQXJjaGl2ZSBFcnJvcjogJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRlcnJvcl9zdHJpbmcgKTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJJHphLT5jbG9zZSgpOwoJCQkJCQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkKCQkJCX0KCQkJCQoJCQl9CgkJICAJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CgkJICAJCgkJICAJcmV0dXJuICRyZXN1bHQ7CgkJICAJCgkJfQoJCQoJCS8qKgoJCSAqCWNyZWF0ZSgpCgkJICoJCgkJICoJQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJjaGl2ZSBmaWxlCgkJICoJCgkJICoJVGhlICRleGNsdWRlcyB3aWxsIGJlIGEgbGlzdCBvciByZWxhdGl2ZSBwYXRoIGV4Y2x1ZGVzIGlmIHRoZSAkbGlzdG1ha2VyIG9iamVjdCBpcyBOVUxMIG90ZWhyd2lzZQoJCSAqCXdpbGwgYmUgYWJzb2x1dGUgcGF0aCBleGNsdWRlcyBhbmQgcmVsYXRpdmUgcGF0aCBleGNsdWRlcyBjYW4gYmUgaGFkIGZyb20gdGhlICRsaXN0bWFrZXIgb2JqZWN0CgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJJHppcAkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBBcmNoaXZlIGZpbGUgdG8gY3JlYXRlCgkJICoJQHBhcmFtCQlzdHJpbmcJJGRpcgkJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgdG8gYWRkIHRvIFpJUCBBcmNoaXZlIGZpbGUKCQkgKglAcGFyYW1lCQlhcnJheQkkZXhjbHVkZXMJCUxpc3Qgb2YgZWl0aGVyIGFic29sdXRlIHBhdGggZXhjbHVzaW9ucyBvciByZWxhdGl2ZSBleGNsdXNpb25zCgkJICoJQHBhcmFtCQlzdHJpbmcJJHRlbXBkaXIJCUZ1bGwgcGF0aCBvZiBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSB1c2FnZQoJCSAqCUBwYXJhbQkJb2JqZWN0CSRsaXN0bWFrZXIJCVRoZSBvYmplY3QgZnJvbSB3aGljaCB3ZSBjYW4gZ2V0IGFuIGluY2x1c2lvbnMgbGlzdAoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGUoICR6aXAsICRkaXIsICRleGNsdWRlcywgJHRlbXBkaXIsICRsaXN0bWFrZXIgPSBOVUxMICkgewoJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICR0aGlzLT5nZXRfbWV0aG9kX3RhZygpIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGJhY2t1cC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCXJldHVybiBmYWxzZTsKCQkKCQl9CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCUlmIG5vIHNwZWNpZmljIGl0ZW1zIGdpdmVuIHRvIGV4dHJhY3QgdGhlbiBpdCdzIGEgY29tcGxldGUgdW56aXAKCQkgKgoJCSAqCUBwYXJhbQlzdHJpbmcJCSR6aXBfZmlsZQkJCQkJRnVsbCBwYXRoICYgZmlsZW5hbWUgb2YgWklQIGZpbGUgdG8gZXh0cmFjdCBmcm9tLgoJCSAqCUBwYXJhbQlzdHJpbmcJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkJCUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCBpbnRvLgoJCSAqCUBwYXJhbQlhcnJheQkJJGl0ZW1zCQkJCQkJTWFwcGluZyBvZiB3aGF0IHRvIGV4dHJhY3QgYW5kIHRvIHdoYXQKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MgKGFsbCBleHRyYWN0aW9ucyBzdWNjZXNzZnVsKSwgZmFsc2Ugb3RoZXJ3aXNlCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnLCAkaXRlbXMgPSBhcnJheSgpICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCgkJCXN3aXRjaCAoICR0aGlzLT5nZXRfb3NfdHlwZSgpICkgewoJCQkJY2FzZSBzZWxmOjpPU19UWVBFX05JWDoKCQkJCQlpZiAoIGVtcHR5KCAkaXRlbXMgKSApIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfZnVsbCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJHJlc3VsdCA9ICR0aGlzLT5leHRyYWN0X2dlbmVyaWNfc2VsZWN0ZWQoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CQkJCQkKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIHNlbGY6Ok9TX1RZUEVfV0lOOgoJCQkJCWlmICggZW1wdHkoICRpdGVtcyApICkgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19mdWxsKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkaXRlbXMgKTsJCQkJCQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCgkJfQoKCQkvKioKCQkgKglleHRyYWN0X2dlbmVyaWNfZnVsbCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdF9nZW5lcmljX2Z1bGwoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSA9ICcnICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCSRzdGF0ID0gYXJyYXkoKTsKCQkJCgkJCS8vIFRoaXMgc2hvdWxkIGdpdmUgdXMgYSBuZXcgYXJjaGl2ZSBvYmplY3QsIGlmIG5vdCBjYXRjaCBpdCBhbmQgYmFpbCBvdXQKCQkJdHJ5IHsKCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfWmlwQXJjaGl2ZSgpOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgemlwYXJjaGl2ZSBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCSRyZXN1bHQgPSAkemEtPm9wZW4oICR6aXBfZmlsZSApOwoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgd2Ugb3BlbmVkIHRoZSB6aXAgb2sKCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJCS8vIEhvdyBtYW55IGZpbGVzIC0gY291bGQgYmUgMCBpZiB3ZSBoYWQgYW4gZW1wdHkgemlwIGZpbGUKCQkJCQkkZmlsZV9jb3VudCA9ICR6YS0+bnVtRmlsZXM7CgkJCQkJCgkJCQkJLy8gT25seSByZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3Mgb3IgZmFsc2UgZm9yIGZhaWx1cmUgLSBubyBpbmRpY2F0aW9uIG9mIHdoeSBmYWlsZWQKCQkJCQkkcmVzdWx0ID0gJHphLT5leHRyYWN0VG8oICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKTsKCQkJCQkJCQkJCgkJCQkJLy8gQ3VycmVudGx5IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gc3VjY2VzcyBhbmQgZmFpbHVyZSBidXQgbm8gZmluZXIgZ3JhaW4KCQkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgZXh0cmFjdGVkIGZpbGUgY29udGVudHMgKCUxJHMgdG8gJTIkcyknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oKTsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBmYWlsZWQgdG8gZXh0cmFjdCBmaWxlIGNvbnRlbnRzICglMSRzIHRvICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJCQoJCQkJCQkvLyBNYXkgc2VlbSByZWR1bmRhbnQgYnV0IGJlbHQnbidicmFjZXMKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCX0KCQkJCQkKCQkJCQkkdGhpcy0+bG9nX2FyY2hpdmVfZmlsZV9zdGF0cyggJHppcF9maWxlICk7CgkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gQ291bGRuJ3Qgb3BlbiBhcmNoaXZlIC0gd2lsbCByZXR1cm4gZm9yIG1heWJlIGFub3RoZXIgbWV0aG9kIHRvIHRyeQoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggJHJlc3VsdCApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBleHRyYWN0IGNvbnRlbnRzICglMSRzIHRvICUyJHMpIC0gRXJyb3IgSW5mbzogJTMkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkKCQkJCSR6YS0+Y2xvc2UoKTsKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkKCQl9CgoJCS8qKgoJCSAqCWV4dHJhY3RfZ2VuZXJpY19zZWxlY3RlZCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHBhcmFtCWFycmF5CQkkaXRlbXMJCQkJCQlNYXBwaW5nIG9mIHdoYXQgdG8gZXh0cmFjdCBhbmQgdG8gd2hhdAoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYWxsIGV4dHJhY3Rpb25zIHN1Y2Nlc3NmdWwpLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdF9nZW5lcmljX3NlbGVjdGVkKCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgPSAnJywgJGl0ZW1zICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBpZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUoKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rCgkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCQkvLyBOb3cgd2UgbmVlZCB0byB0YWtlIGVhY2ggaXRlbSBhbmQgcnVuIGFuIHVuemlwIGZvciBpdCAtIHVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gZWFzeSB3YXkgb2YgY29tYmluaW5nCgkJCQkJLy8gYXJiaXRyYXJ5IGV4dHJhY3Rpb25zIGludG8gYSBzaW5nbGUgY29tbWFuZCBpZiBzb21lIG1pZ2h0IGJlIHRvIGEgCgkJCQkJZm9yZWFjaCAoICRpdGVtcyBhcyAkd2hhdCA9PiAkd2hlcmUgKSB7CgkJCQoJCQkJCQkkcmVuYW1lX3JlcXVpcmVkID0gZmFsc2U7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQkJCQkvLyBEZWNpZGUgaG93IHRvIGV4dHJhY3QgYmFzZWQgb24gd2hlcmUKCQkJCQkJaWYgKCBlbXB0eSggJHdoZXJlKSApIHsKCQkJCQkKCQkJCQkJCS8vIEZpcnN0IHdlJ2xsIGV4dHJhY3QgYW5kIHRoZW4ganVuayB0aGUgcGF0aAoJCQkJCQkJJHJlc3VsdCA9ICR6YS0+ZXh0cmFjdFRvKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkd2hhdCApOwoJCQkJCQkJCQoJCQkJCQkJLy8gVW5saWtlIGV4ZWMgemlwIHdlIGhhdmUgdG8gZWZmZWN0aXZlbHkganVuayB0aGUgcGF0aCBhZnRlciB0aGUgZXh0cmFjdGlvbgoJCQkJCQkJLy8gRG8gdGhpcyBieSByZW5hbWluZyB0aGUgZmlsZSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZCB0aGVuIGdldHRpbmcgcmlkIG9mIGFueSBkaXJlY3RvcnkKCQkJCQkJCS8vIHN0cnVjdHVyZSBpdCB3YXMgdW5kZXIuIElmIGRpcm5hbWUgaXMgbm90IC4gdGhlbiB3ZSBrbm93IHRoZXJlIGlzIGEgZGlyZWN0cnkgcGF0aCBhbmQgbm90CgkJCQkJCQkvLyBqdXN0IGEgc2ltcGxlIGZpbGUgbmFtZSAocmVtZW1iZXIgdGhhdCAkd2hhdCBzaG91bGQgX25vdF8gaGF2ZSBhbnkgbGVhZGluZyBzbGFzaCB3aGV0aGVyCgkJCQkJCQkvLyBpdCBpcyBhIGZpbGVwYXRoIG9yIGEgc2ltcGxlIGZpbGVuYW1lKQoJCQkJCQkJaWYgKCAiLiIgIT0gZGlybmFtZSggJHdoYXQgKSApIHsKCQkJCQkJCQoJCQkJCQkJCXJlbmFtZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkd2hhdCwKCQkJCQkJCQkJCSRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gYmFzZW5hbWUoICR3aGF0KSApOwoJCQkJCQkJCQkJCgkJCQkJCQkJLy8gR2V0IHRoZSBwYXRoIGNvbXBvbmVudCBvZiAkd2hhdCAtIG5vdGUgdGhhdCBkaXJuYW1lKCkgYWRkcyBhIGxlYWRpbmcgc2xhc2gKCQkJCQkJCQkvLyBldmVuIGlmIG5vbmUgd2FzIHByZXNlbnQgb3JpZ2luYWxseS4gV2UgbXVzdCBnZXQgdGhlIGZpcnN0IGRpcmVjdG9yeSBjb21wb25lbnQgb25seQoJCQkJCQkJCS8vIHNvIHdlIGNhbiBkbyBhIHJlY3Vyc2l2ZSBkZWxldGUgb24gaXQuIFRoaXMgaXMgYSBiaXQga2x1bmt5IGJ1dCBmdW5jdGlvbmFsLgoJCQkJCQkJCSR3aGF0cGF0aCA9ICR3aGF0OwoJCQkJCQkJCWRvIHsKCQkJCQkJCQkJJHdoYXRwYXRoID0gZGlybmFtZSggJHdoYXRwYXRoICk7CgkJCQkJCQkJfSB3aGlsZSAoIDEgPCBzdHJsZW4oIGRpcm5hbWUoICR3aGF0cGF0aCApICkgKTsKCgkJCQkJCQkJLy8gTm93IHdlIGNhbiBkbyB0aGUgcmVjdXJzaXZlIGRlbGV0ZSBmcm9tIHRoYXQgdG9wIGxldmVsIGNvbXBvbmVudAoJCQkJCQkJCSR0aGlzLT5kZWxldGVfZGlyZWN0b3J5X3JlY3Vyc2l2ZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuICR3aGF0cGF0aCApOwoKCQkJCQkJCX0KCQkJCQkJCQkJCQkJCQkJCgkJCQkJCgkJCQkJCX0gZWxzZWlmICggIWVtcHR5KCAkd2hlcmUgKSApIHsKCQkJCQkKCQkJCQkJCWlmICggJHdoYXQgPT09ICR3aGVyZSApIHsKCQkJCQkJCQoJCQkJCQkJCS8vIENoZWNrIGZvciB3aWxkY2FyZCBkaXJlY3RvcnkgZXh0cmFjdGlvbiBsaWtlIGRpci8qID0+IGRpci8qCgkJCQkJCQkJaWYgKCAiKiIgPT0gc3Vic3RyKCB0cmltKCAkd2hhdCApLCAtMSApICkgewoJCQkJCQkJCQoJCQkJCQkJCQkvLyBHZXQgb3VyIHBhdGggbWF0Y2ggc3RyaW5nIChqdXN0IGNsaXAgb2ZmIHRoZSB3aWxkY2FyZCkKCQkJCQkJCQkJJHdoYXRyb290ID0gc3Vic3RyKCB0cmltKCAkd2hhdCApLCAwLCAtMSApOwoJCQkJCQkJCQkkZmlsZV9jb3VudCA9ICR6YS0+bnVtRmlsZXM7CgkJCQkJCQkJCgkJCQkJCQkJCS8vIENyaWtleSwgaXQncyBhIGRpcmVjdG9yeSB0cmVlIGV4dHJhY3Rpb24gLSBkb24ndCBwYW5pYwoJCQkJCQkJCQkvLyBXZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHppcCBhbmQgZXh0cmFjdCBlYWNoIGZpbGUgdGhhdCBtYXRjaGVzCgkJCQkJCQkJCWZvciAoICRpID0gMDsgJGkgPCAkZmlsZV9jb3VudDsgJGkrKyApIHsKCQkJCQkJCQkJCgkJCQkJCQkJCQkvLyBHZXQgdGhlIGZpbGVuYW1lIGJ5IGluZGV4IGFuZCBzZWUgaWYgaXQncyBpbiB0aGUgdHJlZQoJCQkJCQkJCQkJJGZpbGVuYW1lID0gJHphLT5nZXROYW1lSW5kZXgoICRpICk7CgkJCQkJCQkJCQlpZiAoIDAgPT09IHN0cnBvcyggJGZpbGVuYW1lLCAkd2hhdHJvb3QgKSApIHsKCQkJCQkJCQkJCQoJCQkJCQkJCQkJCS8vICR3aGF0IG1hdGNoZWQgdGhlIHJvb3Qgb2YgdGhpcyBmaWxlbmFtZSBzbyBleHRyYWN0IGl0CgkJCQkJCQkJCQkJJHJlc3VsdCA9ICR6YS0+ZXh0cmFjdFRvKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZmlsZW5hbWUgKTsKCgkJCQkJCQkJCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCQkJCQkJCQkJCgkJCQkJCQkJCQkJCS8vIEFuIGV4dHJhY3Rpb24gZmFpbGVkIHNvIGJhaWwgb3V0IGhlcmUgLSB0aGlzIHNob3VsZCBqdXN0CgkJCQkJCQkJCQkJCS8vIGRyb3AgdXMgdGhyb3VnaCB0byB0aGUgcG9zdC1wcm9jZXNzaW5nIG9mICRyZXN1bHQgd2hpY2ggb24KCQkJCQkJCQkJCQkJLy8gYSBmYWxzZSBzaG91bGQgdGhlbiBkcm9wIHVzIG91dCBvZiB0aGUgZm9yZWFjaCBsb29wCgkJCQkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCgkJCQkJCQkJCX0KCQkJCQkJCQkKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQoJCQkJCQkJCQkvLyBJdCdzIGp1c3QgYSBzaW5nbGUgZmlsZSBleHRyYWN0aW9uIC0gYnJlYXRoIGEgc2lnbiBvZiByZWxpZWYKCQkJCQkJCQkJLy8gRXh0cmFjdCB0byBzYW1lIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgLSBkb24ndCBqdW5rIHBhdGgsIG5vIG5lZWQgdG8gYWRkIHdoZXJlIHRvIGRlc3RuYXRpb24gYXMgYXV0b21hdGljCgkJCQkJCQkJCSRyZXN1bHQgPSAkemEtPmV4dHJhY3RUbyggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoYXQgKTsKCgkJCQkJCQkJfQoJCQkJCQkKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQoJCQkJCQkJCS8vIEZpcnN0IHdlJ2xsIGV4dHJhY3QgYW5kIHRoZW4ganVuayB0aGUgcGF0aAoJCQkJCQkJCSRyZXN1bHQgPSAkemEtPmV4dHJhY3RUbyggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoYXQgKTsKCQkJCQkJCQkKCQkJCQkJCQkvLyBVbmxpa2UgZXhlYyB6aXAgd2UgaGF2ZSB0byBlZmZlY3RpdmVseSBqdW5rIHRoZSBwYXRoIGFmdGVyIHRoZSBleHRyYWN0aW9uCgkJCQkJCQkJLy8gRG8gdGhpcyBieSByZW5hbWluZyB0aGUgZmlsZSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZCB0aGVuIGdldHRpbmcgcmlkIG9mIGFueSBkaXJlY3RvcnkKCQkJCQkJCQkvLyBzdHJ1Y3R1cmUgaXQgd2FzIHVuZGVyLiBJZiBkaXJuYW1lIGlzIG5vdCAuIHRoZW4gd2Uga25vdyB0aGVyZSBpcyBhIGRpcmVjdHJ5IHBhdGggYW5kIG5vdAoJCQkJCQkJCS8vIGp1c3QgYSBzaW1wbGUgZmlsZSBuYW1lIChyZW1lbWJlciB0aGF0ICR3aGF0IHNob3VsZCBfbm90XyBoYXZlIGFueSBsZWFkaW5nIHNsYXNoIHdoZXRoZXIKCQkJCQkJCQkvLyBpdCBpcyBhIGZpbGVwYXRoIG9yIGEgc2ltcGxlIGZpbGVuYW1lKQoJCQkJCQkJCWlmICggIi4iICE9IGRpcm5hbWUoICR3aGF0ICkgKSB7CgkJCQkJCQkJCgkJCQkJCQkJCXJlbmFtZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkd2hhdCwKCQkJCQkJCQkJCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuIGJhc2VuYW1lKCAkd2hhdCkgKTsKCQkJCQkJCQkJCQkKCQkJCQkJCQkJLy8gR2V0IHRoZSBwYXRoIGNvbXBvbmVudCBvZiAkd2hhdCAtIG5vdGUgdGhhdCBkaXJuYW1lKCkgYWRkcyBhIGxlYWRpbmcgc2xhc2gKCQkJCQkJCQkJLy8gZXZlbiBpZiBub25lIHdhcyBwcmVzZW50IG9yaWdpbmFsbHkuIFdlIG11c3QgZ2V0IHRoZSBmaXJzdCBkaXJlY3RvcnkgY29tcG9uZW50IG9ubHkKCQkJCQkJCQkJLy8gc28gd2UgY2FuIGRvIGEgcmVjdXJzaXZlIGRlbGV0ZSBvbiBpdC4gVGhpcyBpcyBhIGJpdCBrbHVua3kgYnV0IGZ1bmN0aW9uYWwuCgkJCQkJCQkJCSR3aGF0cGF0aCA9ICR3aGF0OwoJCQkJCQkJCQlkbyB7CgkJCQkJCQkJCQkkd2hhdHBhdGggPSBkaXJuYW1lKCAkd2hhdHBhdGggKTsKCQkJCQkJCQkJfSB3aGlsZSAoIDEgPCBzdHJsZW4oIGRpcm5hbWUoICR3aGF0cGF0aCApICkgKTsKCgkJCQkJCQkJCS8vIE5vdyB3ZSBjYW4gZG8gdGhlIHJlY3Vyc2l2ZSBkZWxldGUgZnJvbSB0aGF0IHRvcCBsZXZlbCBjb21wb25lbnQKCQkJCQkJCQkJJHRoaXMtPmRlbGV0ZV9kaXJlY3RvcnlfcmVjdXJzaXZlKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5IC4gJHdoYXRwYXRoICk7CgoJCQkJCQkJCX0KCQkJCQkJCQkJCQkJCQkJCgkJCQkJCQkJLy8gV2lsbCBuZWVkIHRvIHJlbmFtZSBpZiB0aGUgZXh0cmFjdCBpcyBvawoJCQkJCQkJCSRyZW5hbWVfcmVxdWlyZWQgPSB0cnVlOwoJCQkJCQkKCQkJCQkJCX0KCQkJCQkKCQkJCQkJfQoJCQkJCgkJCQkJCS8vIE5vdGU6IHdlIGRvbid0IG9wZW4gdGhlIGZpbGUgYW5kIHRoZW4gZG8gc3R1ZmYgYnV0IGl0J3MgYWxsIGRvbmUgaW4gb25lIGFjdGlvbgoJCQkJCQkvLyBzbyB3ZSBuZWVkIHRvIGludGVycHJldCB0aGUgcmV0dXJuIGNvZGUgdG8gZGVkaWRlIHdoYXQgdG8gZG8KCQkJCQkJLy8gQ3VycmVudGx5IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gc3VjY2VzcyBhbmQgZmFpbHVyZSBidXQgbm8gZmluZXIgZ3JhaW4KCQkJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBleHRyYWN0ZWQgZmlsZSBjb250ZW50cyAoJTEkcyBmcm9tICUyJHMgdG8gJTMkcyU0JHMpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHdoYXQsICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoZXJlICkgKTsKCgkJCQkJCQkvLyBSZW5hbWUgaWYgd2UgaGF2ZSB0bwoJCQkJCQkJaWYgKCB0cnVlID09PSAkcmVuYW1lX3JlcXVpcmVkKSB7CgkJCQkJCQkKCQkJCQkJCQkvLyBOb3RlOiB3ZSBqdW5rZWQgdGhlIHBhdGggb24gdGhlIGV4dHJhY3Rpb24gc28ganVzdCB0aGUgZmlsZW5hbWUgb2YgJHdoYXQgaXMgdGhlIHNvdXJjZSBidXQKCQkJCQkJCQkvLyAkd2hlcmUgY291bGQgYmUgYSBzaW1wbGUgZmlsZSBuYW1lIG9yIGEgZmlsZSBwYXRoIAoJCQkJCQkJCSRyZXN1bHQgPSAkcmVzdWx0ICYmIHJlbmFtZSggJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBiYXNlbmFtZSggJHdoYXQgKSwKCQkJCQkJCQkJCQkJCQkJICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHdoZXJlICk7CgkJCQkJCQkKCQkJCQkJCX0KCgkJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCQkvLyBGb3Igbm93IGxldCdzIGp1c3QgcHJpbnQgdGhlIGVycm9yIGNvZGUgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCk7CgkJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGZhaWxlZCB0byBvcGVuL3Byb2Nlc3MgZmlsZSB0byBleHRyYWN0IGZpbGUgY29udGVudHMgKCUxJHMgZnJvbSAlMiRzIHRvICUzJHMlNCRzKSAtIEVycm9yIEluZm86ICU1JHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHdoYXQsICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJHdoZXJlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkKCQkJCQkJCS8vIE1heSBzZWVtIHJlZHVuZGFudCBidXQgYmVsdCduJ2JyYWNlcwoJCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkKCQkJCQkJLy8gSWYgdGhlIGV4dHJhY3Rpb24gZmFpbGVkIChvciByZW5hbWUgYWZ0ZXIgZXh0cmFjdGlvbikgdGhlbiBicmVhayBvdXQgb2YgdGhlIGZvcmVhY2ggYW5kIHNpbXBseSByZXR1cm4gZmFsc2UKCQkJCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdCApIHsKCQkJCQkKCQkJCQkJCWJyZWFrOwoJCQkJCQkKCQkJCQkJfQoJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIHdpbGwgcmV0dXJuIGZvciBtYXliZSBhbm90aGVyIG1ldGhvZCB0byB0cnkKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gZXh0cmFjdCBjb250ZW50cyAoJTEkcyB0byAlMiRzKSAtIEVycm9yIEluZm86ICUzJHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5LCAkZXJyb3Jfc3RyaW5nICkgKTsKCgkJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJCS8vJHJlc3VsdCA9IGFycmF5KCAxLCAiVW5hYmxlIHRvIGdldCBhcmNoaXZlIGNvbnRlbnRzIiApOwoJCQkJCS8vIEN1cnJlbnRseSBhcyB3ZSBhcmUgcmV0dXJuaW5nIGFuIGFycmF5IGFzIGEgdmFsaWQgcmVzdWx0IHdlIGp1c3QgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgoJCQkJfQoJCQkJCgkJCQkkemEtPmNsb3NlKCk7CgkJCQoJCQl9CgkJCQoJCSAgCWlmICggTlVMTCAhPSAkemEgKSB7IHVuc2V0KCAkemEgKTsgfQkJCgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCgkJfQoJCQoJCS8qKgoJCSAqCWZpbGVfZXhpc3RzKCkKCQkgKgkKCQkgKglUZXN0cyB3aGV0aGVyIGEgZmlsZSAod2l0aCBwYXRoKSBleGlzdHMgaW4gdGhlIGdpdmVuIHppcCBmaWxlCgkJICoJSWYgbGVhdmVfb3BlbiBpcyB0cnVlIHRoZW4gdGhlIHppcCBvYmplY3Qgd2lsbCBiZSBsZWZ0IG9wZW4gZm9yIGZhc3RlciBjaGVja2luZyBmb3Igc3Vic2VxdWVudCBmaWxlcyB3aXRoaW4gdGhpcyB6aXAKCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkkemlwX2ZpbGUJCVRoZSB6aXAgZmlsZSB0byBjaGVjawoJCSAqCUBwYXJhbQkJc3RyaW5nCSRsb2NhdGVfZmlsZQlUaGUgZmlsZSB0byB0ZXN0IGZvcgoJCSAqCUBwYXJhbQkJYm9vbAkkbGVhdmVfb3BlbgkJT3B0aW9uYWw6IFRydWUgaWYgdGhlIHppcCBmaWxlIHNob3VsZCBiZSBsZWZ0IG9wZW4KCQkgKglAcmV0dXJuCQlib29sL2FycmF5CQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBhbmQgZmFsc2UgaWYgbm90LCBhcnJheSBmb3Igb3RoZXIgcHJvYmxlbQoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGZpbGVfZXhpc3RzKCAkemlwX2ZpbGUsICRsb2NhdGVfZmlsZSwgJGxlYXZlX29wZW4gPSBmYWxzZSApIHsKCQkKCQkJJHJlc3VsdCA9IGFycmF5KCAxLCAiR2VuZXJpYyBmYWlsdXJlIGluZGljYXRpb24iICk7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUoKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJLy8gUmV0dXJuIGFuIGVycm9yIGNvZGUgYW5kIGEgZGVzY3JpcHRpb24gLSB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQgbW9yZSBnZW5lcmljYWxseQoJCQkJJHJlc3VsdCA9IGFycmF5KCAxLCAiQ2xhc3Mgbm90IGF2YWlsYWJsZSB0byBtYXRjaCBtZXRob2QiICk7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIHdlIG9wZW5lZCB0aGUgemlwIG9rCgkJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCQkvLyBOb3cgdHJ5IGFuZCBmaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlsZQoJCQkJCSRpbmRleCA9ICR6YS0+bG9jYXRlTmFtZSggJGxvY2F0ZV9maWxlICk7CgkJCQkJCgkJCQkJLy8gSWYgd2UgZ290IGFuIGluZGV4IHdlIGZvdW5kIGl0IG90aGVyd2lzZSBub3QgZm91bmQKCQkJCQlpZiAoIGZhbHNlICE9PSAkaW5kZXggKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgZm91bmQgKHppcGFyY2hpdmUpJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkJCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbGUgbm90IGZvdW5kICh6aXBhcmNoaXZlKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gJGxvY2F0ZV9maWxlICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIENvdWxkbid0IG9wZW4gYXJjaGl2ZSAtIHdpbGwgcmV0dXJuIGZvciBtYXliZSBhbm90aGVyIG1ldGhvZCB0byB0cnkKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHMgKGxvb2tpbmcgZm9yICUxJHMgaW4gJTIkcykgLSBFcnJvciBJbmZvOiAlMyRzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRsb2NhdGVfZmlsZSAsICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgoJCQkJCS8vIFJldHVybiBhbiBlcnJvciBjb2RlIGFuZCBhIGRlc2NyaXB0aW9uIC0gdGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIG1vcmUgZ2VuZXJpY2FsbHkKCQkJCQkkcmVzdWx0ID0gYXJyYXkoIDEsICJGYWlsZWQgdG8gb3Blbi9wcm9jZXNzIGZpbGUiICk7CgoJCQkJfQoJCQkKCQkJCS8vIFdlIGhhdmUgZmluaXNoZWQgd2l0aCB0aGUgYXJjaGl2ZSAobGVhdmVfb3BlbiBpZ25vcmVkIGZvciBub3cpCgkJCQkkemEtPmNsb3NlKCk7CgkJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkKCQl9CgkJCgkJLyoJZ2V0X2ZpbGVfbGlzdCgpCgkJICoJCgkJICoJR2V0IGFuIGFycmF5IG9mIGFsbCBmaWxlcyBpbiBhIHppcCBmaWxlIHdpdGggc29tZSBmaWxlIHByb3BlcnRpZXMuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQlUaGUgZmlsZSB0byBsaXN0IHRoZSBjb250ZW50IG9mCgkJICoJQHJldHVybgkJYm9vbHxhcnJheQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBvdGhlcndpc2UgYXJyYXkgb2YgZmlsZSBwcm9wZXJ0aWVzIChtYXkgYmUgZW1wdHkpCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9maWxlX2xpc3QoICR6aXBfZmlsZSApIHsKCQkKCQkJJGZpbGVfbGlzdCA9IGFycmF5KCk7CgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJJHN0YXQgPSBhcnJheSgpOwoJCQkKCQkJLy8gVGhpcyBzaG91bGQgZ2l2ZSB1cyBhIG5ldyBhcmNoaXZlIG9iamVjdCwgb2Ygbm90IGNhdGNoIGl0IGFuZCBiYWlsIG91dAoJCQl0cnkgewoJCQkKCQkJCSR6YSA9IG5ldyBwbHVnaW5idWRkeV9aaXBBcmNoaXZlKCk7CgkJCQkkcmVzdWx0ID0gdHJ1ZTsKCQkJCQoJCQl9IGNhdGNoICggRXhjZXB0aW9uICRlICkgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJJGVycm9yX3N0cmluZyA9ICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGluZGljYXRlZCBhcyBhdmFpbGFibGUgbWV0aG9kIGJ1dCBlcnJvciByZXBvcnRlZDogJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRlcnJvcl9zdHJpbmcgKSApOwoJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIE9ubHkgY29udGludWUgaWYgd2UgaGF2ZSBhIHZhbGlkIGFyY2hpdmUgb2JqZWN0CgkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJJHJlc3VsdCA9ICR6YS0+b3BlbiggJHppcF9maWxlICk7CgkJCQkKCQkJCS8vIE1ha2Ugc3VyZSB3ZSBvcGVuZWQgdGhlIHppcCBvawoJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkJaWYgKCAoICRmaWxlX2NvdW50ID0gJHphLT5udW1GaWxlcyApID4gMCApIHsKCQkJCQoJCQkJCQkvLyBHZXQgZWFjaCBmaWxlIGluIHNlcXVlbmNlIGJ5IGluZGV4IGFuZCBnZXQgdGhlIHByb3BlcnRpZXMKCQkJCQkJZm9yKCAkaSA9IDA7ICRpIDwgJGZpbGVfY291bnQ7ICRpKysgKXsKCQkJCQkJCgkJCQkJCQkkc3RhdCA9ICR6YS0+c3RhdEluZGV4KCAkaSApOwoJCQkJCQkJCgkJCQkJCQkvLyBBc3N1bWUgYWxsIHRoZXNlIGtleXMgZG8gZXhpc3QgKGNvbnNpZGVyIHRlc3RpbmcpCgkJCQkJCQkkZmlsZV9saXN0W10gPSBhcnJheSgKCQkJCQkJCQkkc3RhdFsnbmFtZSddLAoJCQkJCQkJCSRzdGF0WydzaXplJ10sCgkJCQkJCQkJJHN0YXRbJ2NvbXBfc2l6ZSddLAoJCQkJCQkJCSRzdGF0WydtdGltZSddLAoJCQkJCQkJKTsKCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCX0KCQkJCQkKCQkJCQkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCd6aXBhcmNoaXZlIGxpc3RlZCBmaWxlIGNvbnRlbnRzICglMSRzKScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgoJCQkJCSR0aGlzLT5sb2dfYXJjaGl2ZV9maWxlX3N0YXRzKCAkemlwX2ZpbGUgKTsJCgoJCQkJCSRyZXN1bHQgPSAmJGZpbGVfbGlzdDsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBDb3VsZG4ndCBvcGVuIGFyY2hpdmUgLSB3aWxsIHJldHVybiBmb3IgbWF5YmUgYW5vdGhlciBtZXRob2QgdG8gdHJ5CgkJCQkJJGVycm9yX3N0cmluZyA9ICR6YS0+ZXJyb3JJbmZvKCAkcmVzdWx0ICk7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnWmlwQXJjaGl2ZSBmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGxpc3QgY29udGVudHMgKCUxJHMpIC0gRXJyb3IgSW5mbzogJTIkcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRlcnJvcl9zdHJpbmcgKSApOwoKCQkJCQkvLyBSZXR1cm4gYW4gZXJyb3IgY29kZSBhbmQgYSBkZXNjcmlwdGlvbiAtIHRoaXMgbmVlZHMgdG8gYmUgaGFuZGxlZCBtb3JlIGdlbmVyaWNhbGx5CgkJCQkJLy8kcmVzdWx0ID0gYXJyYXkoIDEsICJVbmFibGUgdG8gZ2V0IGFyY2hpdmUgY29udGVudHMiICk7CgkJCQkJLy8gQ3VycmVudGx5IGFzIHdlIGFyZSByZXR1cm5pbmcgYW4gYXJyYXkgYXMgYSB2YWxpZCByZXN1bHQgd2UganVzdCByZXR1cm4gZmFsc2Ugb24gZmFpbHVyZQoJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCgkJCQl9CgkJCQkKCQkJCSR6YS0+Y2xvc2UoKTsKCQkJCgkJCX0KCQkJCgkJICAJaWYgKCBOVUxMICE9ICR6YSApIHsgdW5zZXQoICR6YSApOyB9CQkKCQkJCgkJCXJldHVybiAkcmVzdWx0OwoJCQkKCQl9CgkJCgkJLyoJc2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byBzZXQgY29tbWVudCBvbi4KCQkgKglAcGFyYW0JCXN0cmluZwkJCSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuCgkJICoJQHJldHVybgkJYm9vbAkJCQkJCQl0cnVlIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbW1lbnQoICR6aXBfZmlsZSwgJGNvbW1lbnQgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJJHphID0gTlVMTDsKCQkJCgkJCS8vIFRoaXMgc2hvdWxkIGdpdmUgdXMgYSBuZXcgYXJjaGl2ZSBvYmplY3QsIG9mIG5vdCBjYXRjaCBpdCBhbmQgYmFpbCBvdXQKCQkJdHJ5IHsKCQkJCgkJCQkkemEgPSBuZXcgcGx1Z2luYnVkZHlfWmlwQXJjaGl2ZSgpOwoJCQkJJHJlc3VsdCA9IHRydWU7CgkJCQkKCQkJfSBjYXRjaCAoIEV4Y2VwdGlvbiAkZSApIHsKCQkJCgkJCQkvLyBTb21ldGhpbmcgZmlzaHkgLSB0aGUgbWV0aG9kcyBpbmRpY2F0ZWQgemlwYXJjaGl2ZSBidXQgd2UgY291bGRuJ3QgZmluZCB0aGUgY2xhc3MKCQkJCSRlcnJvcl9zdHJpbmcgPSAkZS0+Z2V0TWVzc2FnZSgpOwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgZXJyb3IgcmVwb3J0ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBPbmx5IGNvbnRpbnVlIGlmIHdlIGhhdmUgYSB2YWxpZCBhcmNoaXZlIG9iamVjdAoJCQlpZiAoIHRydWUgPT09ICRyZXN1bHQgKSB7CgkJCQkKCQkJCSRyZXN1bHQgPSAkemEtPm9wZW4oICR6aXBfZmlsZSApOwoJCQkJCgkJCQkvLyBNYWtlIHN1cmUgYXQgbGVhc3QgdGhlIHppcCBmaWxlIG9wZW5lZCBvawoJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkJLy8gU2V0IHRoZSBjb21tZW50IC0gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlCgkJCQkJJHJlc3VsdCA9ICR6YS0+c2V0QXJjaGl2ZUNvbW1lbnQoICRjb21tZW50ICk7CgkJCQkJCgkJCQkJLy8gSWYgd2UgZ290IGJhY2sgdHJ1ZSB0aGVuIGFsbCBpcyB3ZWxsIHdpdGggdGhlIHdvcmxkCgkJCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIHNldCBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gc2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBzZXQgY29tbWVudCBpbiBmaWxlICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQoJCQkJCX0KCQkJCQkJCgkJCQl9IGVsc2UgewoJCQkJCgkJCQkJLy8gSWYgd2UgY291bGRuJ3Qgb3BlbiB0aGUgemlwIGZpbGUgdGhlbiBsb2cgaXQgKD8pIGFuZCBkcm9wIHRocm91Z2gKCQkJCQkkZXJyb3Jfc3RyaW5nID0gJHphLT5lcnJvckluZm8oICRyZXN1bHQgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gc2V0IGNvbW1lbnQgaW4gZmlsZSAlMSRzIC0gRXJyb3IgSW5mbzogJTIkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQkJCQkJCgkJCQl9CgkJCQkJCQkJCgkJCQkkemEtPmNsb3NlKCk7CgkJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCgkJLyoJZ2V0X2NvbW1lbnQoKQoJCSAqCQoJCSAqCVJldHJpZXZlIGFyY2hpdmUgY29tbWVudC4KCQkgKgkKCQkgKglAcGFyYW0JCXN0cmluZwkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHJldHJpZXZlIGNvbW1lbnQgZnJvbS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZwkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudCggJHppcF9maWxlICkgewoJCQoJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCSR6YSA9IE5VTEw7CgkJCQoJCQkvLyBUaGlzIHNob3VsZCBnaXZlIHVzIGEgbmV3IGFyY2hpdmUgb2JqZWN0LCBvZiBub3QgY2F0Y2ggaXQgYW5kIGJhaWwgb3V0CgkJCXRyeSB7CgkJCQoJCQkJJHphID0gbmV3IHBsdWdpbmJ1ZGR5X1ppcEFyY2hpdmUoKTsKCQkJCSRyZXN1bHQgPSB0cnVlOwoJCQkJCgkJCX0gY2F0Y2ggKCBFeGNlcHRpb24gJGUgKSB7CgkJCQoJCQkJLy8gU29tZXRoaW5nIGZpc2h5IC0gdGhlIG1ldGhvZHMgaW5kaWNhdGVkIHppcGFyY2hpdmUgYnV0IHdlIGNvdWxkbid0IGZpbmQgdGhlIGNsYXNzCgkJCQkkZXJyb3Jfc3RyaW5nID0gJGUtPmdldE1lc3NhZ2UoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ3ppcGFyY2hpdmUgaW5kaWNhdGVkIGFzIGF2YWlsYWJsZSBtZXRob2QgYnV0IGVycm9yIHJlcG9ydGVkOiAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJGVycm9yX3N0cmluZyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gT25seSBjb250aW51ZSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJjaGl2ZSBvYmplY3QKCQkJaWYgKCB0cnVlID09PSAkcmVzdWx0ICkgewoJCQkJCgkJCQkkcmVzdWx0ID0gJHphLT5vcGVuKCAkemlwX2ZpbGUgKTsKCQkJCQoJCQkJLy8gTWFrZSBzdXJlIGF0IGxlYXN0IHRoZSB6aXAgZmlsZSBvcGVuZWQgb2sKCQkJCWlmICggdHJ1ZSA9PT0gJHJlc3VsdCApIHsKCQkJCQoJCQkJCS8vIEdldCB0aGUgY29tbWVudCBvciBmYWxzZSBvbiBmYWlsdXJlIGZvciBzb21lIHJlYXNvbgoJCQkJCS8vIE5vdGU6IEN1cnJlbnRseSwgZHVlIHRvIGEgYnVnIGluIFppcEFyY2hpdmUsIGdldEFyY2hpdmVDb21tZW50KCkKCQkJCQkvLyByZXR1cm5zIGZhbHNlIGZvciBhbiBlbXB0eSBjb21tZW50IHdoZXJlYXMgaXQgc2hvdWxkIGp1c3QgcmV0dXJuIGFuCgkJCQkJLy8gZW1wdHkgc3RyaW5nLiBXZSdsbCBsaXZlIHdpdGggdGhpcyBmb3Igbm93IGFzIGl0IHNob3VsZCBvbmx5IGhhcHBlbgoJCQkJCS8vIHdoZW4gYW4gYXJjaGl2ZSBpcyBmcmVzaCBhbmQgaGFzIHRoZSBJbnRlZ3JpdHkgQ2hlY2sgcnVuIChvciB3aGVuIHRoZQoJCQkJCS8vIGNoZWNrIGlzIHJlcnVuKS4gT25jZSBhIGNvbW1lbnQgaXMgYWRkZWQgdGhlIGZ1bmN0aW9uIGJlaGF2ZXMuCgkJCQkJLy8gSWYgYW55IHByb2JsZW1zIGFyZSB0aHJvd24gdXAgdGhlbiB0aGVyZSBpcyB0aGUgb3B0aW9uIHRvIHVzZSB0aGUKCQkJCQkvLyBhcmNoaXZlIHByb3BlcnR5IGJ1dCB0aGF0IGhhcyBhIGRvd25zaWRlIGluIHRoYXQgaXQgY2FuIG9ubHkgZXZlcgoJCQkJCS8vIHJldHVybiBhIHN0cmluZyBzbyBpZiB0aGVyZSByZWFsbHkgaXMgYW4gZXJyb3IgaW4gcmVhZGluZyB0aGUgY29tbWVudAoJCQkJCS8vIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBrbm93IChBRkFJSykuIFBlcmhhcHMgYW4gZXJyb3Igc3RhdHVzIHZhbHVlIG1pZ2h0CgkJCQkJLy8gYmUgc2V0IHNvbWV3aGVyZT8KCQkJCQkvLyBUaGUgYnVnIHdpbGwgYmUgcmVwb3J0ZWQgdG8gUEhQIGRldmVsb3BlcnMgYnV0IHdlIHdpbGwgc3RpbGwgaGF2ZSB0bwoJCQkJCS8vIGxpdmUgd2l0aCB0aGlzIGZvciBhIHdoaWxlIGJlY2F1c2UgaXQgdGFrZXMgaG9zdHMgYWdlcyB0byBjYXRjaCB1cCB0bwoJCQkJCS8vIHVwZGF0ZWQgUEhQIHZlcnNpb25zLgoJCQkJCSRjb21tZW50ID0gJHphLT5nZXRBcmNoaXZlQ29tbWVudCggWklQQVJDSElWRTo6RkxfVU5DSEFOR0VEICk7CgkJCQkJLy8kY29tbWVudCA9ICR6YS0+Y29tbWVudDsKCQkJCQkKCQkJCQkvLyBJZiB3ZSBoYXZlIGEgY29tbWVudCAoZXZlbiBpZiBlbXB0eSkgdGhlbiByZXR1cm4gaXQKCQkJCQlpZiAoIGZhbHNlICE9PSAkY29tbWVudCApIHsKCgkJCQkJCS8vIE5vdGU6IG5ldyBhcmNoaXZlcyB3aWxsIHJldHVybiBhbiBlbXB0eSBjb21tZW50IGlmIG9uZSB3YXMgbm90IGFkZGVkIGF0IGNyZWF0aW9uCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgcmV0cmlldmVkIGNvbW1lbnQgaW4gZmlsZSAlMSRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkJJHJlc3VsdCA9ICRjb21tZW50OwoJCQkJCQkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBJZiB3ZSBmYWlsZWQgdG8gZ2V0IHRoZSBjb21tbmVudCB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byByZXRyaWV2ZSBjb21tZW50IGluIGZpbGUgJTEkcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR6aXBfZmlsZSApICk7CgkJCQkJCSRyZXN1bHQgPSBmYWxzZTsKCQkJCQkJCgkJCQkJfQoKCQkJCX0gZWxzZSB7CgkJCQkKCQkJCQkvLyBJZiB3ZSBjb3VsZG4ndCBvcGVuIHRoZSB6aXAgZmlsZSB0aGVuIGxvZyBpdCAoPykgYW5kIGRyb3AgdGhyb3VnaAoJCQkJCSRlcnJvcl9zdHJpbmcgPSAkemEtPmVycm9ySW5mbyggJHJlc3VsdCApOwoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1ppcEFyY2hpdmUgZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBnZXQgY29tbWVudCBpbiBmaWxlICUxJHMgLSBFcnJvciBJbmZvOiAlMiRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZXJyb3Jfc3RyaW5nICkgKTsKCQkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkJCQkJCQkKCQkJCX0KCQkJCQoJCQkJJHphLT5jbG9zZSgpOwoJCQkJCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIFNvbWV0aGluZyBmaXNoeSAtIHRoZSBtZXRob2RzIGluZGljYXRlZCB6aXBhcmNoaXZlIGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBjbGFzcwoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnemlwYXJjaGl2ZSBpbmRpY2F0ZWQgYXMgYXZhaWxhYmxlIG1ldGhvZCBidXQgWmlwQXJjaGl2ZSBjbGFzcyBub24tZXhpc3RlbnQnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkgIAlpZiAoIE5VTEwgIT0gJHphICkgeyB1bnNldCggJHphICk7IH0JCQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQoJCX0KCQkKCX0gLy8gZW5kIHBsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZSBjbGFzcy4JCgkKfQo/Pgo=
###PACKDATA,FILE_END,/lib/zipbuddy/zbzipziparchive.php,importbuddy/lib/zipbuddy/zbzipziparchive.php
###PACKDATA,FILE_START,/lib/zipbuddy/zipbuddy.php,importbuddy/lib/zipbuddy/zipbuddy.php
PD9waHAKLyoqCiAqCXBsdWdpbmJ1ZGR5X3ppcGJ1ZGR5IENsYXNzIChFeHBlcmltZW50YWwpCiAqCiAqCUhhbmRsZXMgemlwcGluZyBhbmQgdW56aXBwaW5nLCB1c2luZyB0aGUgYmVzdCBtZXRob2RzIGF2YWlsYWJsZSBhbmQgZmFsbGluZyBiYWNrIHRvIHdvcnNlIG1ldGhvZHMKICoJYXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5LiBBbGxvd3MgZm9yIGZvcmNpbmcgY29tcGF0aWJpbGl0eSBtb2Rlcy4KICoJCiAqCVZlcnNpb246IDEuMC4wCiAqCUF1dGhvcjogCiAqCUF1dGhvciBVUkk6IAogKgogKgogKi8KCi8vIFRlc3QgaWYgd2UgYXJlIGxvYWRpbmcgYXMgc3RhbmRhcmQgb3IgZXhwZXJpbWVudGFsIC0gaWYgZXhwZXJpbWVudGFsIGp1c3QgZHJvcCB0aHJvdWdoCmlmICggMCA9PT0gc3RyY21wKCBiYXNlbmFtZSggZGlybmFtZSggX19GSUxFX18gKSApLCAnemlwYnVkZHknICkgKSB7CgoJLy8gQ3VycmVudGx5IGxvYWRpbmcgYXMgc3RhbmRhcmQgc28gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gbG9hZCBleHBlcmltZW50YWwKCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYWx0ZXJuYXRpdmVfemlwXzInXSApICYmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snYWx0ZXJuYXRpdmVfemlwXzInXSApICkgewoJCgkJLy8gVXNlciBlbmFibGVkIGV4cGVyaW1lbnRhbCBzbyBsb29rIGZvciBpdCBhbmQgbG9hZCBpdCBpcyBmb3VuZCwgb3RoZXJ3aXNlIGxvZwoJCSRleHBlcmltZW50YWxfemlwYnVkZHkgPSBkaXJuYW1lKCBkaXJuYW1lKCBfX0ZJTEVfXyApICkgLiAnL3h6aXBidWRkeS96aXBidWRkeS5waHAnOwoJCWlmICggQGlzX3JlYWRhYmxlKCAkZXhwZXJpbWVudGFsX3ppcGJ1ZGR5ICkgKSB7CgkJCgkJCXJlcXVpcmVfb25jZSggJGV4cGVyaW1lbnRhbF96aXBidWRkeSApOwoJCQkKCQl9IGVsc2UgewoJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdBbHRlcm5hdGUgWmlwIFN5c3RlbSBlbmFibGVkIGJ1dCBub3QgZm91bmQvcmVhZGFibGUgYXQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkZXhwZXJpbWVudGFsX3ppcGJ1ZGR5ICkgKTsKCgkJCgkJfQoJCgl9Cgp9IAoKaWYgKCAhY2xhc3NfZXhpc3RzKCAicGx1Z2luYnVkZHlfemlwYnVkZHkiICkgKSB7CgoJY2xhc3MgcGx1Z2luYnVkZHlfemlwYnVkZHkgewoJCgkJY29uc3QgWklQX01FVEhPRFNfVFJBTlNJRU5UID0gJ3BiX2JhY2t1cGJ1ZGR5X2F2YWlsX3ppcF9tZXRob2RzJzsKCQljb25zdCBaSVBfTUVUSE9EU19UUkFOU0lFTlRfRVhQRVJJTUVOVEFMID0gJ3BiX2JhY2t1cGJ1ZGR5X2F2YWlsX3h6aXBfbWV0aG9kcyc7CgkJY29uc3QgWklQX01FVEhPRFNfVFJBTlNJRU5UX0xJRkUgPSA0MzIwMDsgLy8gMTIgSG91cnMgLSByZWFsbHkgc2hvdWxkbid0IGNoYW5nZSB1bmxlc3Mgc2VydmVyIHByb2JsZW0KCQljb25zdCBOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgPSAnLyc7CgkJY29uc3QgRElSRUNUT1JZX1NFUEFSQVRPUlMgPSAnL1xcJzsKCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBwbHVnaW4gcGF0aCBmb3IgdGhpcyBwbHVnaW4KICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHB1YmxpYyAkX3BsdWdpblBhdGggPSAnJzsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHBhdGggb2YgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBmb3IgY3JlYXRpbmcgZmlsZXMgYW5kIHN0dWZmCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KICAgICAgICBwcm90ZWN0ZWQgJF90ZW1wZGlyID0gIiI7CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGxpc3Qgb2YgemlwIG1ldGhvZHMgdGhhdCBhcmUgcmVxdWVzdGVkIHRvIGJlIHVzZWQKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX3JlcXVlc3RlZF96aXBfbWV0aG9kcyA9IGFycmF5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBtb2RlIHdoaWNoIHRoZSBvYmplY3QgaXMgYmVpbmcgY3JlYXRlZCBmb3IKICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIG5vdyBpZ25vcmVkIGFzIGFuIG9iamVjdCBpcyBpbnN0YW50aWF0ZWQgZm9yIGJvdGggemlwICYgdW56aXAgc2VydmljZXMKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHByb3RlY3RlZCAkX21vZGUgPSAiIjsKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RhdHVzIG1lc3NhZ2UgYXJyYXkgdXNlZCB3aGVuIGNhbGxpbmcgb3RoZXIgbWV0aG9kcyB0byBnZXQgc3RhdHVzIGluZm9ybWF0aW9uIGJhY2sKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHB1YmxpYyAkX3N0YXR1cyA9IGFycmF5KCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsaXN0IG9mIHppcCBtZXRob2RzIHRoYXQgYXJlIHRvIGJlIHVzZWQgb3IgYXJlIGF2YWlsYWJsZQogICAgICAgICAqIEhhZCB0byBtYWtlIHRoaXMgcHVibGljIGZvciBub3cgYmVjYXVzZSBzb21ldGhpbmcgYWNjZXNzZXMgaXQgZGlyZWN0bHkgLSBiYWQga2FybWEKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5IG9mIHN0cmluZwogICAgICAgICAqLwogICAgICAgIHB1YmxpYyAkX3ppcF9tZXRob2RzID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGV0YWlscyBvZiB0aGUgdmFyaW91cyB6aXAgbWV0aG9kcyB0aGF0IGFyZSBhdmFpbGFibGUKICAgICAgICAgKiBIYXZlIHRvIG1ha2UgdGhpcyBhIHNlcGFyYXRlIGFycmF5IGluZGV4ZWQgYnkgdGhlIG1ldGhvZCB0YWcuIElkZWFsbHkgd291bGQgYmUgY29tYmluZWQKICAgICAgICAgKiB3aXRoIHRoZSB6aXAgbWV0aG9kcyBhcnJheSBidXQgdGhhdCB3b3VsZCBpbnZvbHZlIG1vcmUgZ2VuZXJhbCBjaGFuZ2VzIGVsc2V3aGVyZSBzbyB0aGF0CiAgICAgICAgICogcmVmYWN0b3JpbmcgY2FuIGJlIGRvbmUgbGF0ZXIgLSBtYWluIHByb2JsZW0gaXMgdGhlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHppcCBtZXRob2RzCiAgICAgICAgICogYXJyYXkgdGhhdCBpcyBtYWRlIHJhdGhlciB0aGFuIHRocm91Z2ggYSBmdW5jdGlvbi4KICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGFycmF5IG9mIGFycmF5IG9mIGFycmF5CiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfemlwX21ldGhvZHNfZGV0YWlscyA9IGFycmF5KCk7CiAgICAgICAgCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGxpc3Qgb2YgemlwIG1ldGhvZHMgdGhhdCBhcmUgc3VwcG9ydGVkLCBpLmUuLCB0aGVyZSBpcyBhIHN1cHBvcnRpbmcgY2xhc3MgZGVmaW5lZAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYXJyYXkgb2Ygc3RyaW5nCiAgICAgICAgICovCiAgICAgICAgcHJvdGVjdGVkICRfc3VwcG9ydGVkX3ppcF9tZXRob2RzID0gYXJyYXkoKTsKICAgICAgICAKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB3ZSBjYW4gY2FsbCBhIHN0YXR1cyBjYWxiYWNrCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBib29sCiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfaGF2ZV9zdGF0dXNfY2FsbGJhY2sgPSBmYWxzZTsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBPYmplY3QtPm1ldGhvZCBhcnJheSBmb3Igc3RhdHVzIGZ1bmN0aW9uCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBhcnJheQogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX3N0YXR1c19jYWxsYmFjayA9IGFycmF5KCk7CgkJCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRpcmVjdG9yeSBuYW1lIHRoYXQgd2UgYXJlIGxvYWRlZCBmcm9tIChub3Q6IG5vdCBwYXRoKQogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RyaW5nCiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfd2hlcmVhbWkgPSAiIjsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHdlIGFyZSBsb2FkZWQgYXMgdGhlIGV4cGVyaW1lbnRhbCB6aXBidWRkeQogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgYm9vbAogICAgICAgICAqLwoJCXByb3RlY3RlZCAkX2lzX2V4cGVyaW1lbnRhbCA9IGZhbHNlOwoJCQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB6aXAgbWV0aG9kcyB0cmFuc2llbnQgd2lsbCBiZSBkZXBlbmRlbnQgb24gaWYgd2UgYXJlIHN0YW5kYXJkIG9yIGV4cGVyaW1lbnRhbAogICAgICAgICAqIAogICAgICAgICAqIEB2YXIgc3RyaW5nCiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfemlwX21ldGhvZHNfdHJhbnNpZW50ID0gIiI7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBTZXJ2ZXIgQVBJIHRoYXQgaXMgaW4gdXNlCiAgICAgICAgICogCiAgICAgICAgICogQHZhciBzdHJpbmcKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9zYXBpX25hbWUgPSAiIjsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVuaWVuY2UgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIFdhcm5pbmdzIHNob3VsZCBiZSBpZ25vcmVkIHdoZW4gYnVpbGRpbmcgYXJjaGl2ZXMKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGlnbm9yZV93YXJuaW5ncwlib29sCiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfaWdub3JlX3dhcm5pbmdzID0gbnVsbDsKCQkKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZW5pZW5jZSBib29sZWFuIGluZGljYXRpbmcgaWYgc3ltbGlua3Mgc2hvdWxkIGJlIGlnbm9yZWQvbm90LWZvbGxvd2VkIHdoZW4gYnVpbGRpbmcgYXJjaGl2ZXMKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGlnbm9yZV9zeW1saW5rcwlib29sCiAgICAgICAgICovCgkJcHJvdGVjdGVkICRfaWdub3JlX3N5bWxpbmtzID0gbnVsbDsKCQkKICAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVuaWVuY2UgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNvbXByZXNzaW9uIHNob3VsIGRiZSB1c2VkIHdoZW4gYnVpbGRpbmcgYXJjaGl2ZXMKICAgICAgICAgKiAKICAgICAgICAgKiBAdmFyIGNvbXByZXNzaW9uCWJvb2wKICAgICAgICAgKi8KCQlwcm90ZWN0ZWQgJF9jb21wcmVzc2lvbiA9IG51bGw7CgkJCgkJLyoqCgkJICogCgkJICogZ2V0X3RyYW5zaWVudF9uYW1lc19zdGF0aWMoKQoJCSAqCgkJICogR2V0IHRoZSB0cmFuc2llbnQgbmFtZShzKSB0aGF0IG1heSBiZSBpbiB1c2UKCQkgKgoJCSAqIEByZXR1cm4JCWFycmF5CVRoZSB0cmFuc2llbnQgbmFtZShzKQoJCSAqCgkJICovCgkJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfdHJhbnNpZW50X25hbWVzX3N0YXRpYygpIHsKCQkKCQkJcmV0dXJuIGFycmF5KCBzZWxmOjpaSVBfTUVUSE9EU19UUkFOU0lFTlQsCgkJCQkJCSAgc2VsZjo6WklQX01FVEhPRFNfVFJBTlNJRU5UX0VYUEVSSU1FTlRBTCApOwoJCQkKCQl9CgoJCS8qKgoJCSAqCV9fY29uc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGNvbnN0cnVjdG9yLgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGVtcF9kaXIJCVRoZSBwYXRoIG9mIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHVzZQoJCSAqCUBwYXJhbQkJYXJyYXkJCSR6aXBfbWV0aG9kcwlPcHRpb25hbDogVGhlIHNldCBvZiB6aXAgbWV0aG9kcyByZXF1ZXN0ZWQgdG8gdXNlCgkJICoJQHBhcmFtCQlzdHJpbmcJCSRtb2RlCQkJT3B0aW9uYWw6IFRoZSB6aXAgbW9kZSBmb3IgdGhlIG9iamVjdCAoaWdub3JlZCBjdXJyZW50bHkgLSBtYXkgYmUgcmV1c2VkPykKCQkgKglAcmV0dXJuCQludWxsCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoICR0ZW1wX2RpciwgJHppcF9tZXRob2RzID0gYXJyYXkoKSwgJG1vZGUgPSAnemlwJyApIHsKCgkJCS8vIE5vcm1hbGl6ZSB0aGUgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvciBvbiB0aGUgcGF0aAoJCQkkdGVtcF9kaXIgPSBydHJpbSggJHRlbXBfZGlyLCBzZWxmOjpESVJFQ1RPUllfU0VQQVJBVE9SUyApIC4gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkKCQkJLy8gTm9ybWFsaXplIHBsYXRmb3JtIHNwZWNpZmljIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGluIHBhdGgKCQkJJHRoaXMtPl90ZW1wZGlyID0gc3RyX3JlcGxhY2UoIERJUkVDVE9SWV9TRVBBUkFUT1IsIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiwgJHRlbXBfZGlyICk7CgkJCQoJCQkvLyBOb3RlOiB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBhbmQgc2hvdWxkIG5vIGxvbmdlciBiZSB1c2VkIC0gYW4gb2JqZWN0IGlzIGluc3RhbnRpYXRlZCBmb3IKCQkJLy8gYm90aCB6aXAgJiB1bnppcCBzZXJ2aWNlcwoJCQkkdGhpcy0+X21vZGUgPSAkbW9kZTsKCQkJCgkJCS8vIFJlY29yZCB3aGVyZSB3ZSBhcmUgbG9jYXRlZCAodGhlIGRpcmVjdG9yeSBuYW1lKQoJCQkkdGhpcy0+X3doZXJlYW1pID0gYmFzZW5hbWUoIGRpcm5hbWUoIF9fRklMRV9fICkgKTsKCQkJCgkJCS8vIFVzZSBvdXIgbG9jYXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIHppcCBtZXRob2RzIHRyYW5zaWVudCB3ZSBzaG91bGQgYmUgdXNpbmcKCQkJJHRoaXMtPl96aXBfbWV0aG9kc190cmFuc2llbnQgPSAoIDAgPT09IHN0cmNtcCggJHRoaXMtPl93aGVyZWFtaSwgJ3ppcGJ1ZGR5JyApICkgPyBzZWxmOjpaSVBfTUVUSE9EU19UUkFOU0lFTlQgOiBzZWxmOjpaSVBfTUVUSE9EU19UUkFOU0lFTlRfRVhQRVJJTUVOVEFMIDsKCgkJCS8vIFNldCBhIGZsYWcgZm9yIGVhc3kgY29uZGl0aW9uYWwgdGVzdGluZwoJCQkkdGhpcy0+X2lzX2V4cGVyaW1lbnRhbCA9ICggMCA9PT0gc3RyY21wKCAkdGhpcy0+X3doZXJlYW1pLCAnemlwYnVkZHknICkgKSA/IGZhbHNlIDogdHJ1ZSA7CgoJCQkvLyBTZXQgdGhlIHNhcGkgbmFtZSBzbyB3ZSBjYW4gdXNlIGl0IGxhdGVyCQkJCgkJCSR0aGlzLT5zZXRfc2FwaV9uYW1lKCk7CgkJCQoJCQkvLyBEZXJpdmUgd2hldGhlciB3ZSBhcmUgaWdub3JpbmcgV2FybmluZ3Mgb3Igbm90IChjYW4gYmUgb3ZlcnJpZGRlbiBieSBtZXRob2QgY2FsbCkKCQkJJHRoaXMtPnNldF9pZ25vcmVfd2FybmluZ3MoKTsKCQkJCgkJCS8vIERlcml2ZSB3aGV0aGVyIHdlIGFyZSBpZ25vcmluZy9ub3QtZm9sbG93aW5nIHN5bWxpbmtzIG9yIG5vdCAoY2FuIGJlIG92ZXJyaWRkZW4gYnkgbWV0aG9kIGNhbGwpCgkJCSR0aGlzLT5zZXRfaWdub3JlX3N5bWxpbmtzKCk7CgkJCQoJCQkvLyBEZXJpdmUgd2hldGhlciBjb21wcmVzc2lvbiBzaG91bGQgYmUgdXNlZCAoY2FuIGJlIG92ZXJyaWRkZW4gYnkgbWV0aG9kIGNhbGwpCgkJCSR0aGlzLT5zZXRfY29tcHJlc3Npb24oKTsKCQkJCQkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSBsb2FkIHRoZSBjb3JlIGFic3RyYWN0IGNsYXNzIGFzIHRoaXMgd2lsbCBhbHdheXMgYmUgbmVlZGVkCgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi8nIC4gJHRoaXMtPl93aGVyZWFtaSAuICcvemJ6aXBjb3JlLnBocCcgKTsKCQkJCgkJCS8vIElmIHdlIGxvYWRlZCB0aGF0IG9rIHRoZW4gdHJ5IHRoZSBtZXRob2Qgc3BlY2lmaWMgY2xhc3NlcwoJCQkvLyBDb3VsZCBtYWtlIHRoaXMgbW9yZSBnZW5lcmljIGJhc2VkIG9uIGNvbmZpZyBvciBzb21lc3VjaAoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ3BsdWdpbmJ1ZGR5X3piemlwY29yZScgKSApIHsKLy8gCQkJCi8vIAkJCQkvLyBPbmx5IHByb3ZpZGUgcHJvYyBtb2RlIHdoZW4gZXhwZXJpbWVudGFsIHppcCBlbmFibGVkCi8vIAkJCQlpZiAoIHRydWUgPT09ICR0aGlzLT5faXNfZXhwZXJpbWVudGFsICkgewovLyAJCQkJCi8vIAkJCQkJaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliLycgLiAkdGhpcy0+X3doZXJlYW1pIC4gJy96YnppcHByb2MucGhwJyApOwovLyAJCQkJCQovLyAJCQkJCWlmICggY2xhc3NfZXhpc3RzKCAncGx1Z2luYnVkZHlfemJ6aXBwcm9jJyApICkgewovLyAJCQkJCQovLyAJCQkJCQlpZiAoICR0aGlzLT5jaGVja19tZXRob2RfZGVwZW5kZW5jaWVzKCAncGx1Z2luYnVkZHlfemJ6aXBwcm9jJyApICkgewovLyAJCQkJCQkKLy8gCQkJCQkJCSR0aGlzLT5zZXRfc3VwcG9ydGVkX3ppcF9tZXRob2RzKCBwbHVnaW5idWRkeV96YnppcHByb2M6OmdldF9tZXRob2RfdGFnX3N0YXRpYygpICk7Ci8vIAkJCQkJCQkKLy8gCQkJCQkJfQovLyAJCQkJCQkKLy8gCQkJCQl9Ci8vIAkJCQkKLy8gCQkJCX0KLy8gCQkJCQoJCQkJaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliLycgLiAkdGhpcy0+X3doZXJlYW1pIC4gJy96YnppcGV4ZWMucGhwJyApOwoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV96YnppcGV4ZWMnICkgKSB7CgkJCQkKCQkJCQlpZiAoICR0aGlzLT5jaGVja19tZXRob2RfZGVwZW5kZW5jaWVzKCAncGx1Z2luYnVkZHlfemJ6aXBleGVjJyApICkgewoJCQkJCQoJCQkJCQkkdGhpcy0+c2V0X3N1cHBvcnRlZF96aXBfbWV0aG9kcyggcGx1Z2luYnVkZHlfemJ6aXBleGVjOjpnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKSApOwoJCQkJCQkKCQkJCQl9CgoJCQkJfQoJCQkJCgkJCQlpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvJyAuICR0aGlzLT5fd2hlcmVhbWkgLiAnL3piemlwemlwYXJjaGl2ZS5waHAnICk7CgkJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ3BsdWdpbmJ1ZGR5X3piemlwemlwYXJjaGl2ZScgKSApIHsKCQkJCQoJCQkJCWlmICggJHRoaXMtPmNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXMoICdwbHVnaW5idWRkeV96YnppcHppcGFyY2hpdmUnICkgKSB7CgkJCQkJCgkJCQkJCSR0aGlzLT5zZXRfc3VwcG9ydGVkX3ppcF9tZXRob2RzKCBwbHVnaW5idWRkeV96YnppcHppcGFyY2hpdmU6OmdldF9tZXRob2RfdGFnX3N0YXRpYygpICk7CgkJCQkJCQoJCQkJCX0KCgkJCQl9CgkJCQkKCQkJCWluY2x1ZGVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi8nIC4gJHRoaXMtPl93aGVyZWFtaSAuICcvemJ6aXBwY2x6aXAucGhwJyApOwoJCQkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV96YnppcHBjbHppcCcgKSApIHsKCQkJCQoJCQkJCWlmICggJHRoaXMtPmNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXMoICdwbHVnaW5idWRkeV96YnppcHBjbHppcCcgKSApIHsKCQkJCQkKCQkJCQkJJHRoaXMtPnNldF9zdXBwb3J0ZWRfemlwX21ldGhvZHMoIHBsdWdpbmJ1ZGR5X3piemlwcGNsemlwOjpnZXRfbWV0aG9kX3RhZ19zdGF0aWMoKSApOwoJCQkJCQkKCQkJCQl9CgoJCQkJfQoJCQkJCgkJCX0KCQkJCiAJCQkvLyBXb3JrIG91dCB0aGUgbGlzdCBvZiB6aXAgbWV0aG9kcyBmcm9tIHRoZSByZXF1ZXN0ZWQgYW5kIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZWlyIGRldGFpbHMKCQkJJHRoaXMtPnNldF96aXBfbWV0aG9kcyggJHppcF9tZXRob2RzICk7CgkJCQoJCX0KCQkKCQkKCQkvKioKCQkgKglfX2Rlc3RydWN0KCkKCQkgKgkKCQkgKglEZWZhdWx0IGRlc3RydWN0b3IuCgkJICoJCgkJICoJQHJldHVybgkJbnVsbAoJCSAqCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoICkgewoKCQl9CgkJCgkJLyoqCgkJICoJc2V0X3NhcGlfbmFtZSgpCgkJICoKCQkgKglTZXRzIHRoZSBzYXBpIG5hbWUgdG8gdGhhdCBnaXZlbiBvciByZXRyaWV2ZXMgZnJvbSBQSFAKCQkgKglUT0RPOiBFeHRlbmQgdG8gYWxzbyBzZXQgYSBzYXBpIGlkIGNvbnN0YW50IGJhc2VkIG9uIHRoZSBuYW1lPwoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkkbmFtZQlBIHNhcGkgbmFtZSB0byBzZXQgKGRlZmF1bHQgZW1wdHkpCgkJICoJQHJldHVybglvYmplY3QJCQlUaGlzIG9iamVjdAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfc2FwaV9uYW1lKCAkc2FwaV9uYW1lID0gIiIgKSB7CgkJCgkJCWlmICggZW1wdHkoICRzYXBpX25hbWUgKSApIHsKCQkJCQoJCQkJJHNhcGlfbmFtZSA9IHBocF9zYXBpX25hbWUoKTsKCQkJCQoJCQl9CgkJCQoJCQkkdGhpcy0+X3NhcGlfbmFtZSA9ICRzYXBpX25hbWU7CgkJCQoJCQlyZXR1cm4gJHRoaXM7CgkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X3NhcGlfbmFtZSgpCgkJICoKCQkgKglSZXR1cm5zIHRoZSBwcmV2aW91c2x5IHNldCBzYXBpIG5hbWUKCQkgKgoJCSAqCUByZXR1cm4Jc3RyaW5nCQkJVGhlIHN0b3JlZCBzYXBpIG5hbWUKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X3NhcGlfbmFtZSgpIHsKCQkJCgkJCXJldHVybiAkdGhpcy0+X3NhcGlfbmFtZTsKCQkJCgkJfQoKCQkvKioKCQkgKglkZXJpdmVfb3B0aW9uYWxfYm9vbCgpCgkJICoKCQkgKglVdGlsaXR5IGZ1bmN0aW9uIHRvIGRlcml2ZSB0aGUgdmFsdWUgb2YgYW4gb3B0aW9uYWwgYm9vbGVhbiBmbGFnIGJhc2VkIG9uIGVpdGhlcgoJCSAqCWEgc3BlY2lmYyB2YWx1ZSBiZWluZyBnaXZlbiBvciB0aGUgcmVsYXRlZCBnbG9iYWwgb3B0aW9uIGJlaW5nIHNldCBvciBhIGdpdmVuCgkJICoJZGVmYXV0bCB2YWx1ZSBvdGhlcmlzZS4gSWYgdGhlIHByb3ZpZGVkICR2YWx1ZSBpcyBudWxsIHRoZW4gdGhpcyBmb3JjZXMgdGhlIHVzZQoJCSAqCW9mIHRoZSBnbG9iYWwgb3B0aW9uIGlmIGl0IGlzIHNldCBvciBvdGhlcndpc2UgdGhlIGRlZmF1bHQgdmFsdWUgZ2l2ZW4KCQkgKgoJCSAqCUBwYXJhbQkJc3RyaW5nCQkkb3B0aW9uCQlUaGUgb3B0aW9uIG5hbWUgaW4gdGhlIGdsb2JhbCBvcHRpb25zIGFycmF5CgkJICoJQHBhcmFtCQlib29sCQkkdmFsdWUJCVNob3VsZCBiZSBib29sIHRydWV8ZmFsc2UgYnV0IGNvdWxkIGJlIG51bGwKCQkgKglAcmV0dXJuCQlib29sCQlWYWx1ZSBvZiAkX2lnbm9yZV93YXJuaW5ncwoJCSAqCgkJICovCgkJIHByb3RlY3RlZCBmdW5jdGlvbiBkZXJpdmVfb3B0aW9uYWxfYm9vbCggJG9wdGlvbiwgJHZhbHVlLCAkZGVmYXVsdCApIHsKCQkgCSRyZXN1bHQgPSBmYWxzZTsKCQkgCWlmICggaXNfYm9vbCggJHZhbHVlICkpIHsKCQkgCQkkcmVzdWx0ID0gJHZhbHVlOwoJCSAJfSBlbHNlaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyAkb3B0aW9uIF0gKSApIHsKCQkgCQkoICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWyAkb3B0aW9uIF0gPT0gJzEnICkgfHwgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbICRvcHRpb24gXSA9PSB0cnVlICkgKSA/ICRyZXN1bHQgPSB0cnVlIDogJHJlc3VsdCA9IGZhbHNlIDsKCQkgCX0gZWxzZSB7CgkJIAkJJHJlc3VsdCA9ICRkZWZhdWx0OwoJCSAJfQoJCSAJcmV0dXJuICRyZXN1bHQ7CgkJIH0KCQkgCgkJLyoqCgkJICoJc2V0X2lnbm9yZV93YXJuaW5ncygpCgkJICoKCQkgKglAcGFyYW0JbWl4ZWQJJGlnbm9yZQkJdHJ1ZXxmYWxzZSBmb3Igc3BlY2lmaWMgc2V0dGluZyBvciBudWxsIGZvciBjaG9pY2UJCgkJICoJQHJldHVybglvYmplY3QJCQkJVGhpcyBvYmplY3QKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X2lnbm9yZV93YXJuaW5ncyggJGlnbm9yZSA9IG51bGwgKSB7CgkJCgkJIAkkdGhpcy0+X2lnbm9yZV93YXJuaW5ncyA9ICR0aGlzLT5kZXJpdmVfb3B0aW9uYWxfYm9vbCggJ2lnbm9yZV96aXBfd2FybmluZ3MnLCAkaWdub3JlLCBmYWxzZSApOwoJCSAJCgkJCXJldHVybiAkdGhpczsKCQkJCgkJfQoKCQkvKioKCQkgKglnZXRfaWdub3JlX3dhcm5pbmdzKCkKCQkgKgoJCSAqCVJldHVybnMgdGhlIHByZXZpb3VzbHkgc2V0IGlnbm9yZSB3YXJuaW5ncyBmbGFnCgkJICoKCQkgKglAcmV0dXJuCW1peGVkCQkJVGhlIHN0b3JlZCBpZ25vcmUgd2FybmluZ3MgZmxhZyB0cnVlfGZhbHNlfG51bGwKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2lnbm9yZV93YXJuaW5ncygpIHsKCQkJCgkJCXJldHVybiAkdGhpcy0+X2lnbm9yZV93YXJuaW5nczsKCQkJCgkJfQoKCQkvKioKCQkgKglzZXRfaWdub3JlX3N5bWxpbmtzKCkKCQkgKgoJCSAqCUBwYXJhbQltaXhlZAkkaWdub3JlCQl0cnVlfGZhbHNlIGZvciBzcGVjaWZpYyBzZXR0aW5nIG9yIG51bGwgZm9yIGNob2ljZQkKCQkgKglAcmV0dXJuCW9iamVjdAkJCQlUaGlzIG9iamVjdAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfaWdub3JlX3N5bWxpbmtzKCAkaWdub3JlID0gbnVsbCApIHsKCQkKCQkgCSR0aGlzLT5faWdub3JlX3N5bWxpbmtzID0gJHRoaXMtPmRlcml2ZV9vcHRpb25hbF9ib29sKCAnaWdub3JlX3ppcF9zeW1saW5rcycsICRpZ25vcmUsIHRydWUgKTsKCQkJCgkJCXJldHVybiAkdGhpczsKCQkJCgkJfQoKCQkvKioKCQkgKglnZXRfaWdub3JlX3N5bWxpbmtzKCkKCQkgKgoJCSAqCVJldHVybnMgdGhlIHByZXZpb3VzbHkgc2V0IGlnbm9yZSBzeW1saW5rcyBmbGFnCgkJICoKCQkgKglAcmV0dXJuCW1peGVkCQkJVGhlIHN0b3JlZCBpZ25vcmUgc3ltbGlua3MgZmxhZyB0cnVlfGZhbHNlfG51bGwKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gZ2V0X2lnbm9yZV9zeW1saW5rcygpIHsKCQkJCgkJCXJldHVybiAkdGhpcy0+X2lnbm9yZV9zeW1saW5rczsKCQkJCgkJfQoKCQkvKioKCQkgKglzZXRfY29tcHJlc3Npb24oKQoJCSAqCgkJICoJQHBhcmFtCW1peGVkCSRjb21wcmVzc2lvbgl0cnVlfGZhbHNlIGZvciBzcGVjaWZpYyBzZXR0aW5nIG9yIG51bGwgZm9yIGNob2ljZQkKCQkgKglAcmV0dXJuCW9iamVjdAkJCQkJVGhpcyBvYmplY3QKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbXByZXNzaW9uKCAkY29tcHJlc3Npb24gPSBudWxsICkgewoJCQoJCSAJJHRoaXMtPl9jb21wcmVzc2lvbiA9ICR0aGlzLT5kZXJpdmVfb3B0aW9uYWxfYm9vbCggJ2NvbXByZXNzaW9uJywgJGNvbXByZXNzaW9uLCB0cnVlICk7CgkJCQoJCQlyZXR1cm4gJHRoaXM7CgkJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X2NvbXByZXNzaW9uKCkKCQkgKgoJCSAqCVJldHVybnMgdGhlIHByZXZpb3VzbHkgc2V0IGNvbXByZXNzaW9uIGZsYWcKCQkgKgoJCSAqCUByZXR1cm4JbWl4ZWQJCQlUaGUgc3RvcmVkIGNvbXByZXNzaW9uIGZsYWcgdHJ1ZXxmYWxzZXxudWxsCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9jb21wcmVzc2lvbigpIHsKCQkJCgkJCXJldHVybiAkdGhpcy0+X2NvbXByZXNzaW9uOwoJCQkKCQl9CgoJCS8qKgoJCSAqCXNldF9zdXBwb3J0ZWRfemlwX21ldGhvZHMoKQoJCSAqCgkJICoJQXBwZW5kcyBvciBwcmVwZW5kcyB0aGUgbWV0aG9kIG9yIG1ldGhvZHMgcGFzc2VkIHRvIHRoZSBleGlzdGluZyBzdXBwb3J0ZWQgbWV0aG9kcyBhcnJheQoJCSAqCgkJICoJQHBhcmFtCXN0cmluZy9hcnJheQkkbWV0aG9kcwlFaXRoZXIgYSAoY29tbWEgc2VwYXJhdGVkKSBzdHJpbmcgb2YgbWV0aG9kcyBvciBhbiBhcnJheQoJCSAqCUBwYXJhbQlib29sCQkJJGFwcGVuZAkJVHJ1ZSBpZiAkbWV0aG9kcyBzaG91bGQgYmUgYXBwZW5kZWQgdG8gZXhpc3Rpbmcgc3VwcG9ydGVkIG1ldGhvZHMKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQlUcnVlIGlmIHNldCBzdWNjZWVkZWQsIG90aGVyd2lzZSBmYWxzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBzZXRfc3VwcG9ydGVkX3ppcF9tZXRob2RzKCAkbWV0aG9kcywgJGFwcGVuZCA9IHRydWUgKSB7CgkJCgkJCSRyZXN1bHQgPSBmYWxzZTsKCQkKCQkJLy8gSWYgJG1ldGhvZHMgaXMgYSBzdHJpbmcgd2UgbmVlZCB0byB0dXJuIGl0IGludG8gYW4gYXJyYXkgKG9mIG9uZSBvciBtb3JlIGVsZW1lbnRzKSBvcgoJCQkvLyBvdGhlcndpc2UgYXNzdW1lIGl0IGlzIGFuIGFycmF5IGFscmVhZHkgKGJ1dCB3ZSBkb3VibGUgY2hlY2sgaW4gYSBtbykKCQkJKCBpc19zdHJpbmcoICRtZXRob2RzICkgKSA/ICRtZXRob2RzX3RvX2FkZCA9IGV4cGxvZGUoICIsIiwgJG1ldGhvZHMgKSA6ICRtZXRob2RzX3RvX2FkZCA9ICRtZXRob2RzOwoKCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgYW4gYXJyYXkgYW5kIGlmIHNvIHRoZW4gZWl0aGVyIGFwcGVuZCBvciBwcmVwZW5kIHRvIGV4aXN0aW5nIHN1cHBvcnRlZCBtZXRob2RzCgkJCWlmICggaXNfYXJyYXkoICRtZXRob2RzX3RvX2FkZCApICkgewoJCQkKCQkJCSggJGFwcGVuZCApID8gJHRoaXMtPl9zdXBwb3J0ZWRfemlwX21ldGhvZHMgPSBhcnJheV9tZXJnZSggJHRoaXMtPl9zdXBwb3J0ZWRfemlwX21ldGhvZHMsICRtZXRob2RzX3RvX2FkZCApIDoKCQkJCQkJCSAgJHRoaXMtPl9zdXBwb3J0ZWRfemlwX21ldGhvZHMgPSBhcnJheV9tZXJnZSggJG1ldGhvZHNfdG9fYWRkLCAkdGhpcy0+X3N1cHBvcnRlZF96aXBfbWV0aG9kcyApOwoJCQkKCQkJCSRyZXN1bHQgPSB0cnVlOwkJCQoJCQkKCQkJfQoJCQkKCQkJLy8gV2lsbCByZXR1cm4gZmFsc2UgaWYgd2Ugc29tZWhvdyBkaWRuJ3QgZW5kIHVwIHdpdGggYW4gYXJyYXkgdG8gbWVyZ2UKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCWNoZWNrX21ldGhvZF9kZXBlbmRlbmNpZXMoKQoJCSAqCgkJICoJQ2hlY2tzIHRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhIG1ldGhvZCBkZWZpbmVzIGZvciBpdHNlbGYgLSB0aGlzIG1heSBvcHRpb25hbGx5IGFsc28gbWVhbgoJCSAqCWNhbGxpbmcgYSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFsbG93cyB0aGUgbWV0aG9kIHRvIGFkZCBpdCdzIG93biB2ZXJ5IHNwZWNpZmljIGNoZWNrcwoJCSAqCWJleW9uZCB0aG9zZSB0aGF0IGFyZSBydW4gYXMgc3RhbmRhcmQuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkkY2xhc3NfbmFtZQkJVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNoZWNrLCBuZWVkZWQgYmVjYXVzZSB0aGlzIGlzIHN0YXRpYyBjaGVja2luZwoJCSAqCUByZXR1cm4JYm9vbAkJCQkJCVRydWUgaWYgZGVwZW5kZW5jeSBjaGVjayBzdWNjZWVkZWQsIG90aGVyd2lzZSBmYWxzZQoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBjaGVja19tZXRob2RfZGVwZW5kZW5jaWVzKCAkY2xhc3NfbmFtZSApIHsKCQkKCQkJLy8gQXNzdW1lIGRlcGVuZGVuY3kgY2hlY2tzIHdpbGwgcGFzcyAtIHdpbGwgYmUgc2V0IGZhbHNlIGlmIGEgY2hlY2sgZmFpbHMKCQkJJHJlc3VsdCA9IHRydWU7CgkJCQoJCQlpZiAoICFtZXRob2RfZXhpc3RzKCAkY2xhc3NfbmFtZSwgJ2dldF9tZXRob2RfZGVwZW5kZW5jaWVzX3N0YXRpYycgKSApIHsKCQkJCgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQoJCQl9IGVsc2UgewoJCQoJCQkJJG1ldGhvZF9kZXBlbmRlbmNpZXMgPSBjYWxsX3VzZXJfZnVuYyggYXJyYXkoICRjbGFzc19uYW1lLCAnZ2V0X21ldGhvZF9kZXBlbmRlbmNpZXNfc3RhdGljJyApICk7CgkJCQkKCQkJfQoJCQkKCQkJaWYgKCAoICRyZXN1bHQgKSAmJiBpc3NldCggJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdjbGFzc2VzJyBdICkgJiYgIWVtcHR5KCAkbWV0aG9kX2RlcGVuZGVuY2llc1sgJ2NsYXNzZXMnIF0gKSApIHsKCQkJCgkJCQkkY2xhc3NlcyA9ICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnY2xhc3NlcycgXTsKCQkJCgkJCQkkZGlzYWJsZWRfY2xhc3NlcyA9IGFycmF5X21hcCggInRyaW0iLCBleHBsb2RlKCAnLCcsIGluaV9nZXQoICdkaXNhYmxlX2NsYXNzZXMnICkgKSApOwoJCQkJCgkJCQkvLyBDaGVjayBlYWNoIGZ1bmN0aW9uIGRlcGVuZGVuY3kgYW5kIGJhaWwgb3V0IG9uIGZpcnN0IGZhaWx1cmUKCQkJCWZvcmVhY2ggKCAkY2xhc3NlcyBhcyAkY2xhc3MgKSB7CgkJCQkKCQkJCQkkY2xhc3MgPSB0cmltKCAkY2xhc3MgKTsKCQkJCQkKCQkJCQlpZiAoICEoICggY2xhc3NfZXhpc3RzKCAkY2xhc3MgKSApICYmICggIWluX2FycmF5KCAkY2xhc3MsICRkaXNhYmxlZF9jbGFzc2VzICkgKSApICkgewoKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQlicmVhazsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCX0KCQkJCgkJCWlmICggKCAkcmVzdWx0ICkgJiYgaXNzZXQoICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnZnVuY3Rpb25zJyBdICkgJiYgIWVtcHR5KCAkbWV0aG9kX2RlcGVuZGVuY2llc1sgJ2Z1bmN0aW9ucycgXSApICkgewoJCQkKCQkJCSRmdW5jdGlvbnMgPSAkbWV0aG9kX2RlcGVuZGVuY2llc1sgJ2Z1bmN0aW9ucycgXTsKCQkJCQoJCQkJJGRpc2FibGVkX2Z1bmN0aW9ucyA9IGFycmF5X21hcCggInRyaW0iLCBleHBsb2RlKCAnLCcsIGluaV9nZXQoICdkaXNhYmxlX2Z1bmN0aW9ucycgKSApICk7CgkJCQkKCQkJCS8vIENoZWNrIGVhY2ggZnVuY3Rpb24gZGVwZW5kZW5jeSBhbmQgYmFpbCBvdXQgb24gZmlyc3QgZmFpbHVyZQoJCQkJZm9yZWFjaCAoICRmdW5jdGlvbnMgYXMgJGZ1bmN0aW9uICkgewoJCQkJCgkJCQkJJGZ1bmN0aW9uID0gdHJpbSggJGZ1bmN0aW9uICk7CgkJCQkJCgkJCQkJaWYgKCAhKCAoIGZ1bmN0aW9uX2V4aXN0cyggJGZ1bmN0aW9uICkgKSAmJiAoICFpbl9hcnJheSggJGZ1bmN0aW9uLCAkZGlzYWJsZWRfZnVuY3Rpb25zICkgKSApICkgewoKCQkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQkJCQlicmVhazsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQoJCQl9CgkJCQoJCQkvLyBObyBleHRlbnNpb24gY2hlY2tzIHlldAoJCQkKCQkJLy8gTm8gZmlsZSBjaGVja3MgeWV0IChuZWVkIHRvIGRldGVybWluZSBob3cgdGhpcyBtaWdodCB3b3JrIGEgYml0IGJldHRlcikKCQkJCgkJCWlmICggKCAkcmVzdWx0ICkgJiYgaXNzZXQoICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnY2hlY2tfZnVuYycgXSApICYmICFlbXB0eSggJG1ldGhvZF9kZXBlbmRlbmNpZXNbICdjaGVja19mdW5jJyBdICkgKSB7CgkJCQoJCQkJJHJlc3VsdCA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJGNsYXNzX25hbWUsICRtZXRob2RfZGVwZW5kZW5jaWVzWyAnY2hlY2tfZnVuYycgXSApICk7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoJCQoJCS8qKgoJCSAqCWRlZHVjZV96aXBfbWV0aG9kcygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgemlwIG1ldGhvZHMgdGhhdCBhcmUgYXZhaWxhYmxlIChvciBqdXN0IHRoZSBiZXN0KSBmaWx0ZXJlZCBieSByZXF1ZXN0ZWQgbWV0aG9kcy4KCQkgKglCZWNhdXNlIHRoZSBhdmFpbGFibGUgbWV0aG9kcyBkb24ndCByZWFsbHkgY2hhbmdlIG9mdGVuIChyYXJlbHkgb25jZSBzdGFibGUpIHdlIHVzZSBhIHRyYW5zaWVudAoJCSAqCXdoaWNoIGhhcyBzb21lIGRlZmluZWQgbGlmZXRpbWUgc28gd2UgZG9uJ3Qgd2FzdGUgdGltZSByZXBlYXRpbmcgdGhlIHRlc3Rpbmcgd2hpY2ggaW52b2x2ZXMgY3JlYXRpbmcKCQkgKglvYmplY3RzIGFuZCBwcm9jZXNzZXMgYW5kIGZpbGVzIHdoaWNoIGNhbiBiZSB0aW1lIGNvbnN1bWluZy4KCQkgKglUaGUgdXNpbmcgc2NyaXB0IGNhbiBkZWNpZGUgdG8gaGF2ZSB0aGUgdHJhbnNpZW50IHJlZnJlc2hlZCBieSBkZWxldGluZyBpdCBhbmQgdGhlbiBpdCB3aWxsIGJlIHJlZ2VuZXJhdGVkLgoJCSAqCU5vdGU6IFRoZXJlIGlzIGFuIGluY2x1ZGVkICJzaWduYXR1cmUiIHNvIHRoYXQgd2UgY2FuIGRldGVjdCBzZXJ2ZXIgb3Igb3RoZXIgbW92ZXMgYW5kIHJlZ2VuZXJhdGUuCgkJICoJTm90ZTogZmlsZW10aW1lKCkgaXMgdXNlZCBiZWNhdXNlIHRoaXMgd2lsbCAoc2hvdWxkKSBmb3JjZSB0aGUgdHJhbnNpZW50IHRvIHVwZGF0ZSBpZiB0aGUgcGx1Z2luIGlzCgkJICoJdXBkYXRlZCBiZWNhdXNlIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBmaWxlIHdpbGwgY2hhbmdlIGJlY2F1c2UgdGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQgaW4gYQoJCSAqCWRpZmZlcmVudCBkaXNrIGxvY2F0aW9uIHdpdGggbmV3bHkgd3JpdHRlbiBmaWxlcyAtIHRoZSBzYW1lIHNob3VsZCBhcHBseSBpZiB0aGUgc2l0ZSBpcyByZXN0b3JlZC9taWdyYXRlZC4KCQkgKgkKCQkgKglAcGFyYW0JCWFycmF5CUFycmF5IHJlZmVyZW5jZSBmb3IgdGhlIGRlZHVjZWQgemlwIG1ldGhvZHMKCQkgKglAcGFyYW0JCWFycmF5CUFycnkgcmVmZXJlbmNlIGZvciB0aGUgZGV0YWlscyBvZiB0aGUgZGVkdWNlZCBtZXRob2RzCgkJICoJQHBhcmFtCQlhcnJheQlGbGF0IGFycmF5IG9mIHJlcXVlc3RlZCAocHJlZmVycmVkKSB6aXAgbWV0aG9kcwoJCSAqCUBwYXJhbQkJYm9vbAlUcnVlIGlmIG9ubHkgdGhlIGJlc3QgYXZhaWxhYmxlIG1ldGhvZCB3YW50ZWQKCQkgKglAcGFyYW0JCXN0cmluZwlXaGljaCB6aXAgbW9kZSBiZWluZyB0ZXN0ZWQKCQkgKglAcmV0dXJuCQlib29sCVRydWUgaWYgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLCBGYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBkZWR1Y2VfemlwX21ldGhvZHMoIGFycmF5ICYkbWV0aG9kcywgYXJyYXkgJiRtZXRob2RzX2RldGFpbHMsIGFycmF5ICRyZXF1ZXN0ZWQsICRiZXN0X29ubHkgKSB7CgkJCQoJCQkkYXZhaWxhYmxlX21ldGhvZHMgPSBhcnJheSgpOwoJCQkkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlscyA9IGFycmF5KCk7CgkJCSRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHMgPSBhcnJheSgpOwoJCQkkc2VydmVyX3NpZ25hdHVyZV9zdHJpbmcgPSAiIjsKCQkJJHNlcnZlcl9zaWduYXR1cmUgPSAiIjsKCgkJCS8vIERlY2lkZSBpZiB3ZSBzaG91bGQgdHJ5IGZvciBjYWNoZWQgbWV0aG9kcyBvciBub3QJCQkKCQkJaWYgKCAkdGhpcy0+dXNlX2NhY2hlZF9tZXRob2RzKCkgKSB7CgoJCQkJJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kcyA9IGdldF90cmFuc2llbnQoICR0aGlzLT5femlwX21ldGhvZHNfdHJhbnNpZW50ICk7CgkJCQkKCQkJCS8vIERyb3AgdGhyb3VnaCBpZiB3ZSBkaWRuJ3QgZ2V0IGEgdHJhbnNpZW50IG90aGVyd2lzZSB3ZSdsbCB0ZXN0IGl0IGZvciB2YWxpZGl0eQoJCQkJaWYgKCBmYWxzZSAhPT0gJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kcyApIHsKCQkJCQoJCQkJCS8vIEdlbmVyYXRlIHNlcnZlciBzaWduYXR1cmUgYW5kIGNoZWNrIGl0IG1hdGNoZXMgdGhlIGNhY2hlZCBzaWduYXR1cmUKCQkJCQkkc2VydmVyX3NpZ25hdHVyZV9zdHJpbmcgPSBAcGhwX3VuYW1lKCkgLiAiIDogIiAuICggKCAkZmlsZW1vZHRpbWUgPSBmaWxlbXRpbWUoIF9fRklMRV9fICkgKSA/IChzdHJpbmcpICRmaWxlbW9kdGltZSA6ICcxJyApOwoJCQkJCSRzZXJ2ZXJfc2lnbmF0dXJlID0gbWQ1KCAkc2VydmVyX3NpZ25hdHVyZV9zdHJpbmcgKTsKCQkJCQkKCQkJCQlpZiAoICggZmFsc2UgPT09IGlzc2V0KCAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnY29udHJvbCcgXVsgJ3NpZ25hdHVyZScgXSApICkgfHwKCQkJCQkJICggJHNlcnZlcl9zaWduYXR1cmUgIT09ICRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHNbICdjb250cm9sJyBdWyAnc2lnbmF0dXJlJyBdICkgKSB7CgoJCQkJCQkvLyBFaXRoZXIgbm8gc2lnbmF0dXJlIHByZXZpb3VzbHkgc2V0IG9yIGl0IGhhcyBjaGFuZ2VkIC0gZWl0aGVyIHdheSB3ZSBuZWVkIHRvIHJlZXZhbHVhdGUgYXZhaWxhYmxlIG1ldGhvZHMKCQkJCQkJJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kcyA9IGZhbHNlOwoJCQkJCQkgCgkJCQkJfQoJCQkJCgkJCQl9CgoJCQl9IGVsc2UgewoJCQkKCQkJCSRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHMgPSBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBDcmVhdGUgbmV3IHRyYW5zaWVudCBpZiB3ZSBkaWRuJ3QgaGF2ZSBvbmUsIGl0IHdhcyBleHBpcmVkIG9yIHdlIG51a2VkIGl0IGJlY2F1c2UgaW52YWxpZAoJCQlpZiAoIGZhbHNlID09PSAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzICkgewoKCQkJCS8vIEdldCBhbGwgYXZhaWxhYmxlIG1ldGhvZHMgaW4gJGF2YWlsYWJsZV9tZXRob2RzIC0gbXVzdCByZXR1cm4gdGhlbSBpbiBvcmRlciBiZXN0IC0+IHdvcnN0CgkJCQkvLyBBbHNvIGdldHRpbmcgdGhlIG1ldGhvZCBkZXRhaWxzIGFycmF5IHdoaWNoIGlzIGtleWVkIGJ5IG1ldGhvZCB0YWcKCQkJCSR0aGlzLT5nZXRfYXZhaWxhYmxlX3ppcF9tZXRob2RzKCAkdGhpcy0+X3N1cHBvcnRlZF96aXBfbWV0aG9kcywgJGF2YWlsYWJsZV9tZXRob2RzLCAkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlscyApOwoJCQkJCgkJCQkvLyBOb3cgd2UgaGF2ZSB0byBjb21iaW5lIHRoZSB0d28gYXJyYXlzIGludG8gYW4gYWdncmVnYXRlIHRvIHNhdmUKCQkJCSRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHNbICdtZXRob2RzJyBdID0gJGF2YWlsYWJsZV9tZXRob2RzOwoJCQkJJGFnZ3JlZ2F0ZV9hdmFpbGFibGVfbWV0aG9kc1sgJ2RldGFpbHMnIF0gPSAkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlsczsKCQkJCQoJCQkJLy8gT25seSBzYXZlIGlmIHdlIGFyZSB1c2luZyBjYWNoaW5nCgkJCQlpZiAoICR0aGlzLT51c2VfY2FjaGVkX21ldGhvZHMoKSApIHsKCQkJCQoJCQkJCS8vIEFkZCB0aGUgc2VydmVyIHNpZ25hdHVyZSBmb3IgZGV0ZWN0aW5nIGludmFsaWRhdGVkIG1ldGhvZHMgZGV0YWlscyBvbiBhIG1pZ3JhdGlvbiBvciBzb21lIG90aGVyIGNoYW5nZQoJCQkJCS8vIE5vdGU6IFNlZSBkaXNjdXNzaW9uIGFib3ZlIG9uIGRlcml2YXRpb24gb2Ygc2lnbmF0dXJlCgkJCQkJLy8gVE9ETzogQ2hlY2ssIHByb2JhYmx5IGNhbiB1c2UgdGhlIHNlcnZlciBzaWduYXR1cmUgY2FsY3VsYXRlZCBhYm92ZQoJCQkJCSRzZXJ2ZXJfc2lnbmF0dXJlX3N0cmluZyA9IEBwaHBfdW5hbWUoKSAuICIgOiAiIC4gKCAoICRmaWxlbW9kdGltZSA9IGZpbGVtdGltZSggX19GSUxFX18gKSApID8gKHN0cmluZykgJGZpbGVtb2R0aW1lIDogJzEnICk7CgkJCQkJJHNlcnZlcl9zaWduYXR1cmUgPSBtZDUoICRzZXJ2ZXJfc2lnbmF0dXJlX3N0cmluZyApOwoJCQkJCSRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHNbICdjb250cm9sJyBdWyAnc2lnbmF0dXJlJyBdID0gJHNlcnZlcl9zaWduYXR1cmU7CgkJCQkJCgkJCQkJc2V0X3RyYW5zaWVudCggJHRoaXMtPl96aXBfbWV0aG9kc190cmFuc2llbnQsICRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHMsIHNlbGY6OlpJUF9NRVRIT0RTX1RSQU5TSUVOVF9MSUZFICk7CgkJCQkJCgkJCQl9CgkJCQkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBXZSBnb3QgYSB2YWxpZCB0cmFuc2llbnQgdmFsdWUgc28gbm93IHNlcGFyYXRlIHRoZSBhZ2dyZWdhdGUgaW50byB0d28KCQkJCSRhdmFpbGFibGVfbWV0aG9kcyA9ICRhZ2dyZWdhdGVfYXZhaWxhYmxlX21ldGhvZHNbICdtZXRob2RzJyBdOwoJCQkJJGF2YWlsYWJsZV9tZXRob2RzX2RldGFpbHMgPSAkYWdncmVnYXRlX2F2YWlsYWJsZV9tZXRob2RzWyAnZGV0YWlscycgXTsKCQkJCgkJCX0KCQkJCgkJCS8vIENoZWNrIHdoZXRoZXIgdGhlc2UgbmVlZCB0byBiZSBmaWx0ZXJlZCBieSByZXF1ZXN0ZWQgbWV0aG9kcwoJCQlpZiAoICFlbXB0eSggJHJlcXVlc3RlZCApICkgewoJCQkKCQkJCS8vIEZpbHRlciB0aGUgYXZhaWxhYmxlIG1ldGhvZHMgLSByZXN1bHQgY291bGQgYmUgZW1wdHkKCQkJCS8vIE9yZGVyIHdpbGwgYmUgcmV0YWluZWQgcmVnYXJkbGVzcyBvZiBvcmRlciBvZiByZXF1ZXN0ZWQgbWV0aG9kcwoJCQkJJGF2YWlsYWJsZV9tZXRob2RzID0gYXJyYXlfaW50ZXJzZWN0KCAkYXZhaWxhYmxlX21ldGhvZHMsICRyZXF1ZXN0ZWQgKTsKCQkJCQoJCQl9CgoJCQkvLyBJZiBqdXN0IHRoZSBiZXN0IGF2YWlsYWJsZSByZXF1ZXN0ZWQgdGhlbiBzbGljZSBpdCBvZmYKCQkJaWYgKCAoIHRydWUgPT09ICRiZXN0X29ubHkgKSAmJiAoICFlbXB0eSggJGF2YWlsYWJsZV9tZXRob2RzICkgKSApIHsKCQkJCgkJCQkkbWV0aG9kcyA9IGFycmF5X3NsaWNlKCAkYXZhaWxhYmxlX21ldGhvZHMsIDAsIDEgKTsKCQkJCSRtZXRob2RzX2RldGFpbHMgPSAkYXZhaWxhYmxlX21ldGhvZHNfZGV0YWlsczsKCQkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSRtZXRob2RzID0gJGF2YWlsYWJsZV9tZXRob2RzOwoJCQkJJG1ldGhvZHNfZGV0YWlscyA9ICRhdmFpbGFibGVfbWV0aG9kc19kZXRhaWxzOwoJCQkKCQkJfQoJCQkKCQkJaWYgKCAhZW1wdHkoICRtZXRob2RzICkgKSB7CgkJCQoJCQkJcmV0dXJuIHRydWU7CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQoJCX0KCQkJCQoJCS8qKgoJCSAqCXVzZV9jYWNoZWRfbWV0aG9kcygpCgkJICoJCgkJICoJUmV0dXJucyB3aGV0aGVyIGNvbmRpdGlvbnMvY29uZmlndXJhdGlvbiBpbmRpY2F0ZSBjYWNoZWQgbWV0aG9kcyBzaG91bGQgYmUgdXNlZAoJCSAqCU5vdGU6IFRlbXBvcmFyaWx5IGFkZCB0aGUgY29uZGl0aW9uIGZvciB3aGV0aGVyIGdldF8vc2V0X3RyYW5zaWVudCBmdW5jdGlvbnMKCQkgKglleGlzdCAtIGlmIG5vdCAobWVhbmluZyB3ZSBhcmUgcHJvYmFibHkgcnVubmluZyB1bmRlciBpbXBvcnRidWRkeSkgdGhlbiB3ZSBhbHNvCgkJICoJc2tpcCBjYWNoaW5nLiBUaGlzIGFkZHMgYSBsaXR0bGUgdGltZSB3aGVuIGluc3RhbnRpYXRpbmcgYmVjYXVzZSB3ZSBoYXZlIHRvIHRlc3QKCQkgKglldmVyeSB0aW1lIGJ1dCBpdCdzIGFjY2VwdGFibGUgZm9yIG5vdy4gSW4gdGhlIGxvbmdlciB0ZXJtIHdlIHdpbGwgaGF2ZSBhbgoJCSAqCWFsdGVybmF0aXZlIHdheSB0byBoYW5kbGUgdGhlIHRyYW5zaWVudCBkYXRhIG91dHNpZGUgb2YgV29yZFByZXNzLgoJCSAqCQoJCSAqCUByZXR1cm4JCWJvb2wJdHJ1ZSBpZiB1c2UgY2FjaGVkIG1ldGhvZHMsIGZhbHNlIG90aGVyd2lzZQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIHVzZV9jYWNoZWRfbWV0aG9kcygpIHsKCQkKCQkJLy8gQnkgZGVmYXVsdCB3ZSdsbCBiZSB1c2luZyBjYWNoaW5nCgkJCSRyZXN1bHQgPSB0cnVlOwoJCQkKCQkJLy8gSGFzIGNhY2hpbmcgYmVlbiBleHBsaWNpdGx5IGRpc2FibGVkCgkJCSRjYWNoaW5nX2Rpc2FibGVkID0gKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydkaXNhYmxlX3ppcG1ldGhvZF9jYWNoaW5nJ10gKSAmJgoJCQkJCQkJCSAgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc2FibGVfemlwbWV0aG9kX2NhY2hpbmcnXSA9PSAnMScpICk7CgoJCQkvLyBEbyB3ZSBoYXZlIHRoZSBtZWFucyB0byBjYWNoZQoJCQkkY2FjaGluZ191bmF2YWlsYWJsZSA9ICggISggZnVuY3Rpb25fZXhpc3RzKCAnZ2V0X3RyYW5zaWVudCcgKSAmJiBmdW5jdGlvbl9leGlzdHMoICdzZXRfdHJhbnNpZW50JyApICkgKTsJCgoJCQlpZiAoICRjYWNoaW5nX2Rpc2FibGVkIHx8ICRjYWNoaW5nX3VuYXZhaWxhYmxlICkgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ppcCBtZXRob2QgY2FjaGluZyBkaXNhYmxlZCBiYXNlZCBvbiBzZXR0aW5ncyBvciB1bmF2YWlsYWJsZS4nICk7CgkJCQkkcmVzdWx0ID0gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJcmV0dXJuICRyZXN1bHQ7CgkJCgkJfQoJCQkJCgkJLyoqCgkJICoJZ2V0X3ppcF9tZXRob2RzKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSBhcnJheSBvZiB6aXAgbWV0aG9kcyBwcmV2aW91c2x5IGRlZHVjZWQKCQkgKgkKCQkgKglAcmV0dXJuCQlhcnJheQlGbGF0IGFycmF5IG9mIHppcCBtZXRob2RzIChjb3VsZCBiZSBlbXB0eSkKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfemlwX21ldGhvZHMoKSB7CgkJCQoJCQlyZXR1cm4gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkKCQl9CgkJCQkKCQkvKioKCQkgKglzZXRfemlwX21ldGhvZHMoKQoJCSAqCQoJCSAqCVJlc2V0cyB0aGUgemlwIG1ldGhvZHMgYmFzZWQgb24gbmV3IGNyaXRlcmlhIGFuZCByZXR1cm5zIHRoZSBhcnJheSBvZiB6aXAgbWV0aG9kcwoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkJJHJlcXVlc3RlZAlGbGF0IGFycmF5IG9mIHJlcXVlc3RlZCAocHJlZmVycmVkKSB6aXAgbWV0aG9kcwoJCSAqCUBwYXJhbQkJYm9vbAkkYmVzdF9vbmx5CU9wdGlvbmFsOiBUcnVlIGlmIG9ubHkgdGhlIGJlc3QgYXZhaWxhYmxlIG1ldGhvZCB3YW50ZWQKCQkgKglAcmV0dXJuCQlvYmplY3QJCQkJVGhpcyBvYmplY3QKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBzZXRfemlwX21ldGhvZHMoIGFycmF5ICRyZXF1ZXN0ZWQsICRiZXN0X29ubHkgPSBmYWxzZSApIHsKCQkJCgkJCS8vIFVwZGF0ZSB0aGUgbWVtb3J5IG9mIHdoYXQgemlwIG1ldGhvZHMgd2VyZSByZXF1ZXN0ZWQgLSBtYWtlIGl0IGNsZWFuCgkJCSR0aGlzLT5fcmVxdWVzdGVkX3ppcF9tZXRob2RzID0gYXJyYXlfbWFwKCAndHJpbScsICRyZXF1ZXN0ZWQgKTsKCQkJCgkJCS8vIFdvcmsgb3V0IHRoZSBsaXN0IG9mIHppcCBtZXRob2RzIGZyb20gdGhlIHJlcXVlc3RlZCBhbmQgYXZhaWxhYmxlCgkJCSR0aGlzLT5kZWR1Y2VfemlwX21ldGhvZHMoICR0aGlzLT5femlwX21ldGhvZHMsICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlscywgJHRoaXMtPl9yZXF1ZXN0ZWRfemlwX21ldGhvZHMsICRiZXN0X29ubHkgKTsKCQkJCgkJCXJldHVybiAkdGhpczsKCQkKCQl9CgkJCQkJCQkJCgkJLyoqCgkJICoJcmVmcmVzaF96aXBfbWV0aG9kcygpCgkJICoKCQkgKglSZWZyZXNoIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgYXZhaWxhYmxlIHppcCBtZXRob2RzCgkJICoJVE9ETzogUGVyaGFwcyB0aGUgdHJhbnNpZW50IGNvdWxkIGJlIGRlbGV0ZWQgaGVyZSByYXRoZXIgdGhhbiBieSB0aGUgY2FsbGVyPwoJCSAqCgkJICoJQHBhcmFtCQlhcnJheQkJJHppcF9tZXRob2RzCU9wdGlvbmFsOiBUaGUgc2V0IG9mIHppcCBtZXRob2RzIHJlcXVlc3RlZCB0byB1c2UKCQkgKglAcmV0dXJuCQlvYmplY3QJCQkJCQlUaGlzIG9iamVjdAoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiByZWZyZXNoX3ppcF9tZXRob2RzKCAkemlwX21ldGhvZHMgPSBhcnJheSgpICkgewoJCQoJCQkkdGhpcy0+c2V0X3ppcF9tZXRob2RzKCAkemlwX21ldGhvZHMgKTsKCQkJCgkJCXJldHVybiAkdGhpczsKCQkJCgkJfQoKCQkvKioKCQkgKglzYW5pdGl6ZV9leGNsdWRlcygpCgkJICoKCQkgKglUYWtlIGFuIGV4Y2x1c2lvbiBsaXN0IG9mIGRpcmVjdG9yaWVzIGFuZC9vciBmaWxlcyBhbmQgcHJvZHVjZSBhIHNhbml0aXplZCBleGNsdXNpb24gbGlzdAoJCSAqCURpcmVjdG9yaWVzIHdpbGwgYmUgcmVjb2duaXplZCBieSBoYXZpbmcgYSB0cmFpbGluZyBkaXJlY3Rvcnkgc2VwYXJhdG9yIG90aGVyd2lzZSB3aWxsIGJlCgkJICoJdHJlYXRlZCBhcyBhIGZpbGUgKG5vdGUgdGhhdCBoZXJlIHdlIGFyZSB3b3JraW5nIHdpdGggcGF0dGVybnMgYW5kIG5vdCB0ZXN0aW5nIHRvIHNlZQoJCSAqCXdoZXRoZXIgc29tZXRoaW5nIF9pc18gYSBkaXJlY3Rvcnkgb3Igbm90IGJlY2F1c2Ugd2UgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0aGUgZnVsbAoJCSAqCWRpcmVjdG9yeSBwYXRoKS4KCQkgKglOb3RlOiBBbnl0aGluZyB0aGF0IGNvbnRhaW5zIGEgd2lsZGNhcmQgY2hhcmFjdGVyICgqIG9yID8pIGlzIGlnbm9yZWQgYXMgdGhlc2UgYXJlIG5vdAoJCSAqCWN1cnJlbnRseSBzdXBwb3J0ZWQgKGFuZCBtYXliZSBuZXZlciB3aWxsIGFjcm9zcyB0aGUgYm9hcmQpLiBGb3IgY29tbWFuZCB6aXAgemlwIHdlIGNhbgoJCSAqCWNvbnNpZGVyIGFuIG9wdGlvbiB0byBoYXZlIHRoZXNlIGFzIHNlcGFyYXRlIGV4Y2x1c2lvbnMgKGFuZCBjdXJyZW50bHkgd2UgY2FuIGFjY29tb2RhdGUKCQkgKgl0aGVuIHRocm91Z2ggc3BlY2lmeWluZyBlbnZpcm9ubWVudCBaSVBPUFRTLgoJCSAqCgkJICoJQHBhcmFtCWFycmF5CQlMaXN0IG9mIHByaW1hcnkgZXhjbHVzaW9ucyAtIG1heSBiZSBlbXB0eQoJCSAqCUBwYXJhbQlhcnJheQkJTGlzdCBvZiBzZWNvbmRhcnkgZXhjbHVzaW9ucyAtIG1heSBiZSBlbXB0eQoJCSAqCUBwYXJhbQlzdHJpbmcJCVRoZSBiYXNlIGRpcmVjdG9yeSB0byBiZSB1c2VkIGlmIG5vcm1hbGl6aW5nCgkJICoKCQkgKglAcmV0dXJuCW1peGVkCQlhcnJheSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwcm90ZWN0ZWQgZnVuY3Rpb24gc2FuaXRpemVfZXhjbHVkZXMoICRwcmltYXJ5LCAkc2Vjb25kYXJ5LCAkYmFzZSA9ICcnICkgewoKCQkJJHNhbml0aXplZCA9IGFycmF5KCk7CgkJCQoJCQkkYmFzZWRpciA9IHRyaW0oICRiYXNlICk7CgkJCSRub3JtYWxpemUgPSAhZW1wdHkoICRiYXNlZGlyICk7CgkJCQoJCQkvLyBOb3JtYWxpemUgdGhlIHRyYWlsaW5nIGRpcmVjdG9yeSBzZXBhcmF0b3Igb24gdGhlIHBhdGgKCQkJJGJhc2VkaXIgPSBydHJpbSggJGJhc2VkaXIsIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1I7CgkJCQoJCQkvLyBOb3JtYWxpemUgcGxhdGZvcm0gc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvcnMgaW4gcGF0aAoJCQkkYmFzZWRpciA9IHN0cl9yZXBsYWNlKCBESVJFQ1RPUllfU0VQQVJBVE9SLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IsICRiYXNlZGlyICk7CgkJCgkJCS8vICRwcmltYXJ5IGlzIGNvbnNpZGVyZWQgdG8gYmUgdW5jbGVhbgoJCQlmb3JlYWNoICggJHByaW1hcnkgYXMgJGV4Y2x1ZGUgKSB7CgkJCQoJCQkJLy8gUmVzZXQgZmxhZyBmb3Igd2hldGhlciB0aGlzIGV4Y2x1ZGUgaXMgYSBkaXJlY3RvcnktbGlrZSBleGNsdWRlCgkJCQkkaXNfZGlyZWN0b3J5X3BhdGggPSBmYWxzZTsKCQkJCQoJCQkJLy8gR2V0IHJpZCBvZiBzdGFuZGFyZCBwcmVmaXgvc3VmZml4IGRldHJpdHVzCgkJCQkkZXhjbHVkZSA9IHRyaW0oICRleGNsdWRlICk7CgkJCQkKCQkJCS8vIFBvc3NpYmxlIHRoYXQgd2UgY291bGQgZW5kIHVwIHdpdGggYW4gZW1wdHkgZW50cnkKCQkJCS8vIEFsc28gaWdub3JlIGlmIGFueSB3aWxkY2FyZCBjaGFyYWN0ZXJzIHByZXNlbnQKCQkJCWlmICggIWVtcHR5KCAkZXhjbHVkZSApICYmICggIXByZWdfbWF0Y2goICd8Wz8qXXwnLCAkZXhjbHVkZSApICkgKSB7CgkJCQkKCQkJCQkvLyBSZW1lbWJlciBpZiBpdCBoYXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIHN1ZmZpeAoJCQkJCWlmICggcHJlZ19tYXRjaCggJ3xbJyAuIGFkZHNsYXNoZXMoIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgLiAnXSR8JywgJGV4Y2x1ZGUgKSApIHsKCQkJCQkKCQkJCQkJJGlzX2RpcmVjdG9yeV9wYXRoID0gdHJ1ZTsKCQkJCQkKCQkJCQl9CgkJCQkJCgkJCQkJLy8gUmVtb3ZlIHdoYXQgY291bGQgYmUgbXVsdGlwbGUgcHJlZml4IG9yIHN1ZmZpeCBkaXJlY3Rvcnkgc2VwYXJhdG9ycwoJCQkJCSRleGNsdWRlID0gdHJpbSggJGV4Y2x1ZGUsIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICk7CgkJCQkJCgkJCQkJLy8gTWFrZSBzdXJlIHBsYXRmb3JtIHNwZWNpZmljIGRpcmVjdG9yeSBzZXBhcmF0b3JzIGluIHBhdGggYmVjb21lIG5vcm1hbGl6ZWQKCQkJCQkkZXhjbHVkZSA9IHN0cl9yZXBsYWNlKCBESVJFQ1RPUllfU0VQQVJBVE9SLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IsICRleGNsdWRlICk7CgkJCQkJCgkJCQkJLy8gQW5kIGFkZCBiYWNrIGEgc2luZ2xlIGluc3RhbmNlIHByZWZpeAoJCQkJCSRleGNsdWRlID0gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGV4Y2x1ZGU7CgkJCQkJCgkJCQkJLy8gQW5kIG9wdGlvbmFsbHkgYSBzaW5nbGUgaW5zdGFuY2Ugc3VmZml4CgkJCQkJaWYgKCAkaXNfZGlyZWN0b3J5X3BhdGggKSB7CgkJCQkJCgkJCQkJCSRleGNsdWRlIC49IHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUjsKCQkJCQkJCgkJCQkJfQoJCQkJCQkJCQkJCgkJCQkJJHNhbml0aXplZFtdID0gJGV4Y2x1ZGU7CgkJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gJHNlY29uZGFyeSBpcyBjb25zaWRlcmVkIHRvIGJlIGNsZWFuCgkJCWlmICggIWVtcHR5KCAkc2Vjb25kYXJ5ICkgKSB7CgkJCQoJCQkJJHNhbml0aXplZCA9IGFycmF5X21lcmdlKCAkc2FuaXRpemVkLCAkc2Vjb25kYXJ5ICk7IAoJCQkKCQkJfQoJCQkKCQkJLy8gR2V0IHVuaXF1ZSBlbnRyaWVzIGFuZCByZW51bWJlciBudW1lcmljIGtleXMKCQkJJHNhbml0aXplZCA9IGFycmF5X21lcmdlKCBhcnJheV91bmlxdWUoICRzYW5pdGl6ZWQgKSApOwoJCQkKCQkJaWYgKCB0cnVlID09ICRub3JtYWxpemUgKSB7CgkJCQoJCQkJLy8gTWFrZSBzdXJlIHRoZSBub3JtYWxpemUgYmFzZSBoYXMgYSB0cmFpbGluZyBkaXJlY3Rvcnkgc2VwYXJhdG9yCgkJCQkkYmFzZWRpciA9ICggcnRyaW0oICRiYXNlZGlyLCBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgKSApIC4gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SOwoJCQkKCQkJCWZvcmVhY2ggKCAkc2FuaXRpemVkIGFzICYkZXhjbHVzaW9uICkgewoJCQkJCgkJCQkJLy8gTXVzdCByZW1vdmUgYW55IGxlYWRpbmcgRElSRUNUT1JZX1NFUEFSQVRPUiBiZWNhdXNlICRiYXNlZGlyIGFsd2F5cyBoYXMgdHJhaWxpbmcKCQkJCQkkZXhjbHVzaW9uID0gbHRyaW0oICRleGNsdXNpb24sIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiApOwoJCQkJCSRleGNsdXNpb24gPSAoICRiYXNlZGlyIC4gJGV4Y2x1c2lvbiApOwoJCQkJCQoJCQkJfQoJCQkJCQkJCQoJCQl9CgkJCQkJCgkJCXJldHVybiAkc2FuaXRpemVkOwoJCQoJCX0KCgkJLyoqCgkJICoJZ2V0X2F2YWlsYWJsZV96aXBfbWV0aG9kcygpCgkJICoJCgkJICoJUmV0dXJucyB0aGUgYXJyYXkgb2YgemlwIG1ldGhvZHMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGUgbW9kZSBvZiB0aGlzIG9iamVjdAoJCSAqCUxpYnJhcmllcyBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgYWxyZWFkeQoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkJVGhlIHN1cHBvcnRlZCB6aXAgbWV0aG9kcwoJCSAqCUBwYXJhbQkJYXJyYXkJVGhlIGFycmF5IHdoaWNoIHdpbGwgaG9sZCB0aGUgYXZhaWxhYmxlIG1ldGhvZHMKCQkgKglAcGFyYW0JCWFycmF5CVRoZSBhcnJheSB0aGF0IHdpbGwgaG9sZCB0aGUgYXZhaWxhYmxlIG1ldGhvZHMgYXR0cmlidXRlcyAobWV0aG9kIHRhZyBpcyBrZXkpCgkJICoJQHJldHVybgkJYm9vbAlUcnVlIGlmIG1ldGhvZHMgYXZhaWxhYmxlLCBGYWxzZSBvdGhlcndpc2UKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRfYXZhaWxhYmxlX3ppcF9tZXRob2RzKCBhcnJheSAkc3VwcG9ydGVkX3ppcF9tZXRob2RzLCAmJGF2YWlsYWJsZV9tZXRob2RzLCAmJGF2YWlsYWJsZV9tZXRob2RzX2RldGFpbHMgKSB7CgkJCgkJCS8vIE1ha2Ugc3VyZSB0aGVzZSBhcmUgY2xlYXJlZCBhcyB0aGUgY2FsbGVyIG1pZ2h0IG5vdCBoYXZlIGRvbmUgc28KCQkJJGF2YWlsYWJsZV9tZXRob2RzID0gYXJyYXkoKTsKCQkJJGF2YWlsYWJsZV9tZXRob2RzX2RldGFpbHMgPSBhcnJheSgpOwoJCQkKCQkJLy8gVHJ5IGVhY2ggc3VwcG9ydGVkIHppcCBtZXRob2QgdG8gc2VlIHdoYXQgaXQgY2FuIGRvIG9uIHRoaXMgc3lzdGVtCQkKCQkJZm9yZWFjaCAoICRzdXBwb3J0ZWRfemlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgoJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkKCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkKCQkJCWlmICggdHJ1ZSA9PT0gJHppcHBlci0+aXNfYXZhaWxhYmxlKCAkdGhpcy0+X3RlbXBkaXIgKSApIHsKCQkJCQoJCQkJCSRhdmFpbGFibGVfbWV0aG9kc1tdID0gJG1ldGhvZF90YWc7CgkJCQkJJGF2YWlsYWJsZV9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF0gPSAkemlwcGVyLT5nZXRfbWV0aG9kX2RldGFpbHMoKTsKCQkJCQkKCQkJCX0KCQkJCQoJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJfQoJCQkJCQkKCQkJcmV0dXJuICggIWVtcHR5KCAkYXZhaWxhYmxlX21ldGhvZHMgKSApOwoKCQl9CgkJCQkJCQoJCS8qKgoJCSAqCWdldF9jb21wYXRpYmlsaXR5X3ppcF9tZXRob2RzKCkKCQkgKgkKCQkgKglSZXR1cm5zIHRoZSBhcnJheSBvZiB6aXAgbWV0aG9kcyB0aGF0IGFyZSByZWdhcmRlZCBhcyAiY29tcGF0aWJpbGl0eSIgbWV0aG9kcwoJCSAqCUxpYnJhcmllcyBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgYWxyZWFkeQoJCSAqCQoJCSAqCUByZXR1cm4JCWFycmF5CUZsYXQgYXJyYXkgb2YgemlwIG1ldGhvZHMgKGNvdWxkIGJlIGVtcHR5KQoJCSAqCgkJICovCgkJcHJvdGVjdGVkIGZ1bmN0aW9uIGdldF9jb21wYXRpYmlsaXR5X3ppcF9tZXRob2RzKCkgewoJCQoJCQkkY29tcGF0aWJpbGl0eV9tZXRob2RzID0gYXJyYXkoKTsKCQkJCgkJCWZvcmVhY2ggKCAkdGhpcy0+X3ppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoKCQkJCSRjbGFzc19uYW1lID0gJ3BsdWdpbmJ1ZGR5X3piemlwJyAuICRtZXRob2RfdGFnOwoJCgkJCQkkemlwcGVyID0gbmV3ICRjbGFzc19uYW1lKCAkdGhpcyApOwoJCQkJCgkJCQlpZiAoICR6aXBwZXItPmdldF9pc19jb21wYXRpYmlsaXR5X21ldGhvZCgpID09PSB0cnVlICkgewoJCQkJCgkJCQkJJGNvbXBhdGliaWxpdHlfbWV0aG9kc1tdID0gJG1ldGhvZF90YWc7CgkJCQkJCgkJCQl9CgkJCQkKCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCX0KCQkJCgkJCXJldHVybiAkY29tcGF0aWJpbGl0eV9tZXRob2RzOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZ2V0X2Jlc3RfemlwX21ldGhvZHMoKQoJCSAqCQoJCSAqCVJldHVybnMgdGhlIGFycmF5IG9mIGJlc3QgemlwIG1ldGhvZChzKQoJCSAqCUZvciBub3cgd2UgYXNzdW1lIG9ubHkgb25lICJiZXN0IiBtZXRob2QgYXMgYmVpbmcgdGhlIGZpcnN0IG1ldGhvZCBpbiB0aGUgbGlzdAoJCSAqCXRoYXQgaGFzIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlKHMpLgoJCSAqCUxpYnJhcmllcyBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgYWxyZWFkeQoJCSAqCQoJCSAqCUBwYXJhbQkJYXJyYXkJJGF0dHJpYnV0ZXMJQXJyYXkgb2YgYXR0cmlidXRlcyB0byBjaGVjayBtZXRob2Qgc3VwcG9ydHMKCQkgKglAcmV0dXJuCQlhcnJheQkJCQlGbGF0IGFycmF5IG9mIHppcCBtZXRob2RzIChjb3VsZCBiZSBlbXB0eSkKCQkgKgoJCSAqLwoJCXByb3RlY3RlZCBmdW5jdGlvbiBnZXRfYmVzdF96aXBfbWV0aG9kcyggJGF0dHJpYnV0ZXMgPSBhcnJheSgpICkgewoJCQoJCQkkYmVzdF9tZXRob2RzID0gYXJyYXkoKTsKCQkJCgkJCWlmICggIWVtcHR5KCAkdGhpcy0+X3ppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJaWYgKCBlbXB0eSggJGF0dHJpYnV0ZXMgKSApIHsKCQkJCQoJCQkJCS8vIE5vIGF0dHJpYnV0ZXMgdG8gdGVzdCBmb3Igc28ganVzdCB0YWtlIHRoZSBmaXJzdCBpbiB0aGUgbGlzdAoJCQkJCSRiZXN0X21ldGhvZHNbXSA9ICR0aGlzLT5femlwX21ldGhvZHNbIDAgXTsKCQkJCQkKCQkJCX0gZWxzZSB7CgkJCQoJCQkJCS8vIEhhdmUgc29tZSBhdHRyaWJ1dGVzIHRvIHRlc3Qgc28gd29yayBhbG9uZyB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2ggb3IgZW5kIG9mIGxpc3QKCQkJCQlmb3JlYWNoICggJHRoaXMtPl96aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCQkJCQoJCQkJCQkvLyBTdGFydCBhZnJlc2ggZWFjaCB0aW1lIC0gYXNzdW1lIHN1Y2Nlc3MKCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJZm9yZWFjaCAoICRhdHRyaWJ1dGVzIGFzICRhdHRyaWJ1dGUgKSB7CgkJCQkJCQoJCQkJCQkJLy8gQ2hlY2sgZWFjaCBhdHRyaWJ1dGUgaW4gdHVybiAocHJlY29uZGl0aW9uIHRoYXQgYWxsIGF0dHJpYnV0ZXMgc2V0IHRydWUvZmFsc2UpCgkJCQkJCQkkbWF0Y2ggPSAoICRtYXRjaCAmJiAoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXVsgJ2F0dHInIF1bICRhdHRyaWJ1dGUgXSA9PT0gdHJ1ZSApICk7CgkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQlpZiAoIHRydWUgPT09ICRtYXRjaCApIHsKCQkJCQkJCgkJCQkJCQkvLyBGb3VuZCBvdXIgbWF0Y2hpbmcgbWV0aG9kIHNvIGJyZWFrIG91dCBvZiB0aGUgdGVzdCBsb29wIHRvIHJldHVybgoJCQkJCQkJJGJlc3RfbWV0aG9kc1tdID0gJG1ldGhvZF90YWc7CgkJCQkJCQlicmVhazsKCQkJCQkJCgkJCQkJCX0JCQkJCQkKCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQoJCQkKCQkJfQoJCQkJCQkKCQkJcmV0dXJuICRiZXN0X21ldGhvZHM7CgkJCQoJCX0KCQkKCQkvKioKCQkgKglhZGRfZGlyZWN0b3J5X3RvX3ppcCgpCgkJICoKCQkgKglBZGRzIGEgZGlyZWN0b3J5IHRvIGEgbmV3IG9yIGV4aXN0aW5nIChUT0RPOiBub3QgeWV0IGF2YWlsYWJsZSkgWklQIGZpbGUuCgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCQkJCUZ1bGwgcGF0aCAmIGZpbGVuYW1lIG9mIFpJUCBmaWxlIHRvIGNyZWF0ZS4KCQkgKglAcGFyYW0Jc3RyaW5nCQkJCUZ1bGwgZGlyZWN0b3J5IHRvIGFkZCB0byB6aXAgZmlsZS4KCQkgKglAcGFyYW0JYXJyYXkoIHN0cmluZyApCQlBcnJheSBvZiBzdHJpbmdzIG9mIHBhdGhzL2ZpbGVzIHRvIGV4Y2x1ZGUgZnJvbSB6aXBwaW5nCgkJICoJQHBhcmFtCXN0cmluZwkJCQlGdWxsIGRpcmVjdG9yeSBwYXRoIHRvIGRpcmVjdG9yeSB0byB0ZW1wb3JhcmlseSBwbGFjZSBaSVAKCQkgKglAcGFyYW0JYm9vbGVhbgkJCQlUcnVlOiBvbmx5IHVzZSBQQ0xaaXAuIEZhbHNlOiB0cnkgYWxsIGF2YWlsYWJsZQoJCSAqCgkJICoJQHJldHVybgkJCQkJCXRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCgkJICoKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gYWRkX2RpcmVjdG9yeV90b196aXAoICR6aXBfZmlsZSwgJGFkZF9kaXJlY3RvcnksICRleGNsdWRlcyA9IGFycmF5KCksICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSA9ICcnICkgewoJCQlpZiAoIHRydWUgPT09ICR0aGlzLT5faXNfZXhwZXJpbWVudGFsICkgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ1J1bm5pbmcgYWx0ZXJuYXRpdmUgWklQIHN5c3RlbSAoQkVUQSkgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdSdW5uaW5nIHN0YW5kYXJkIFpJUCBzeXN0ZW0gYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkKCQkJfQoJCQkKCQkJLy8gTGV0J3MganVzdCBsb2cgaWYgdGhpcyBpcyBhIDMyIG9yIDY0IGJpdCBzeXN0ZW0KCQkJJHBocF9zaXplID0gKCBwbHVnaW5idWRkeV9zdGF0Ojppc19waHAoIHBsdWdpbmJ1ZGR5X3N0YXQ6OlRISVJUWV9UV09fQklUICkgKSA/ICIzMiIgOiAiNjQiIDsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1J1bm5pbmcgdW5kZXIgJTEkcy1iaXQgUEhQJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRwaHBfc2l6ZSApICk7CgkJCQoJCQkvLyBNYWtlIHN1cmUgd2UgdGVsbCB3aGF0IHRoZSBzYXBpIGlzCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdTZXJ2ZXIgQVBJOiAlMSRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICR0aGlzLT5nZXRfc2FwaV9uYW1lKCkgKSApOwkJCQoJCQkJCQoJCQkkemlwX21ldGhvZHMgPSBhcnJheSgpOwoJCQkkc2FuaXRpemVkX2V4Y2x1ZGVzID0gYXJyYXkoKTsKCQkJJGxpc3RtYWtlciA9IE5VTEw7CgkJCQoJCQkvLyBTZXQgc29tZSBhZGRpdGlvbmFsIHN5c3RlbSBleGNsdWRlcyBoZXJlIGZvciBub3cgLSB0aGVzZSBhcmUgYWxsIGZyb20gdGhlIHNpdGUgaW5zdGFsbCByb290CgkJCSRhZGRpdGlvbmFsX2V4Y2x1ZGVzID0gYXJyYXkoIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiAuICdpbXBvcnRidWRkeScgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IsCgkJCQkJCQkJCQkgIHNlbGY6Ok5PUk1fRElSRUNUT1JZX1NFUEFSQVRPUiAuICdpbXBvcnRidWRkeS5waHAnLAoJCQkJCQkJCQkJICBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgLiAnd3AtY29udGVudCcgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgLiAndXBsb2FkcycgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1IgLiAncGJfYmFja3VwYnVkZHknIC4gc2VsZjo6Tk9STV9ESVJFQ1RPUllfU0VQQVJBVE9SLAoJCQkJCQkJCQkJKTsKCQkJCgkJCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgemlwIG1ldGhvZCBzdHJhdGVneSBzZXR0aW5nIHRvIHVzZSBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIGVtZXJnZW5jeSBjb21wYXRpYmlsaXR5CgkJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sgJ3ppcF9tZXRob2Rfc3RyYXRlZ3knIF0gKSAmJiAJKCAnMCcgIT09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sgJ3ppcF9tZXRob2Rfc3RyYXRlZ3knIF0gKSApIHsKCQkJCgkJCQkkemlwX21ldGhvZF9zdHJhdGVneSA9IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sgJ3ppcF9tZXRob2Rfc3RyYXRlZ3knIF07CgkJCQlzd2l0Y2ggKCAkemlwX21ldGhvZF9zdHJhdGVneSApIHsKCQkJCQljYXNlICIxIjoKCQkJCQkJLy8gQmVzdCBBdmFpbGFibGUKCQkJCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPmdldF9iZXN0X3ppcF9tZXRob2RzKCBhcnJheSggJ2lzX2FyY2hpdmVyJyApICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1VzaW5nIEJlc3QgQXZhaWxhYmxlIHppcCBtZXRob2QgYmFzZWQgb24gc2V0dGluZ3MuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICIyIjoKCQkJCQkJLy8gQWxsIEF2YWlsYWJsZQoJCQkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdVc2luZyBBbGwgQXZhaWxhYmxlIHppcCBtZXRob2RzIGluIHByZWZlcnJlZCBvcmRlciBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIjMiOgoJCQkJCQkvLyBGb3JjZSBDb21wYXRpYmlsaXR5CgkJCQkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5nZXRfY29tcGF0aWJpbGl0eV96aXBfbWV0aG9kcygpOwkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBfXygnVXNpbmcgRm9yY2VkIENvbXBhdGliaWxpdHkgemlwIG1ldGhvZCBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCS8vIEhtbS4uLnVucmVjb2duaXplZCB2YWx1ZSAtIGVtZXJnZW5jeSBjb21wYXRpYmlsaXR5CgkJCQkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5nZXRfY29tcGF0aWJpbGl0eV96aXBfbWV0aG9kcygpOwkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCBzcHJpbnRmKCBfXygnRm9yY2VkIENvbXBhdGliaWxpdHkgTW9kZSBhcyBaaXAgTWV0aG9kIFN0cmF0ZWd5IHNldHRpbmcgbm90IHJlY29nbml6ZWQ6ICUxJHMnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX21ldGhvZF9zdHJhdGVneSApICk7CgkJCQl9CgkJCQkKCQkJfSBlbHNlIHsKCQkJCgkJCQkvLyBXZSBnb3Qgbm8gb3IgYW4gaW52YWxpZCB6aXAgbWV0aG9kIHN0cmF0ZWd5IHdoaWNoIGlzIGEgYmFkIHNpdHVhdGlvbiAtIGVtZXJnZW5jeSBjb21wYXRpYmlsaXR5IGlzIHRoZSBvcmRlciBvZiB0aGUgZGF5CgkJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+Z2V0X2NvbXBhdGliaWxpdHlfemlwX21ldGhvZHMoKTsJCQkJCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsIF9fKCdGb3JjZWQgQ29tcGF0aWJpbGl0eSBNb2RlIGFzIFppcCBNZXRob2QgU3RyYXRlZ3kgbm90IHNldCBvciBzZXR0aW5nIG5vdCByZWNvZ25pemVkLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCgkJCX0KCQkJCgkJCS8vIEJldHRlciBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGF2YWlsYWJsZSBtZXRob2RzCgkJCWlmICggZW1wdHkoICR6aXBfbWV0aG9kcyApICkgewoJCQkKCQkJCS8vIEhtbSwgd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFueSBhdmFpbGFibGUgbWV0aG9kcywgb29wcywgYmVzdCBnbyBubyBmdXJ0aGVyCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGYWlsZWQgdG8gY3JlYXRlIGEgWmlwIEFyY2hpdmUgZmlsZSAtIG5vIGF2YWlsYWJsZSBtZXRob2RzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJLy8gV2Ugc2hvdWxkIGhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBtdXN0IGdldCByaWQgb2YgaXQsIGNhbiBzaW1wbHkgcm1kaXIgaXQgYXMgaXQgd2lsbCAoc2hvdWxkKSBiZSBlbXB0eQoJCQkJaWYgKCAhZW1wdHkoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICYmIGZpbGVfZXhpc3RzKCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkKCQkJCQlpZiAoICFybWRpciggJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5ICkgKSB7CgkJCQkJCgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RlbXBvcmFyeSBkaXJlY3RvcnkgY291bGQgbm90IGJlIGRlbGV0ZWQ6ICcsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKTsKCQkJCQkKCQkJCQl9CgkJCQkJCQoJCQkJfQoKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdDcmVhdGluZyBaSVAgZmlsZScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJHppcF9maWxlIC4gJ2AuICcgLiBfXygnQWRkaW5nIGRpcmVjdG9yeScsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIGAnIC4gJGFkZF9kaXJlY3RvcnkgLiAnYC4gJyAuIF9fKCdFeGNsdWRlcycsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnOiAnIC4gaW1wbG9kZSggJywnLCAkZXhjbHVkZXMgKSApOwoJCQkKCQkJLy8gV2UnbGwgdHJ5IGFuZCBhbGxvdyBleGNsdXNpb25zIGZvciBwY2x6aXAgaWYgd2UgY2FuCgkJCWluY2x1ZGVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi8nIC4gJHRoaXMtPl93aGVyZWFtaSAuICcvemJkaXIucGhwJyApOwoJCQlpZiAoIGNsYXNzX2V4aXN0cyggJ3BsdWdpbmJ1ZGR5X3piZGlyJyApICkgewoJCQkKCQkJCS8vIEdlbmVyYXRlIG91ciBzYW5pdGl6ZWQgbGlzdCBvZiBkaXJlY3Rvcmllcy9maWxlcyB0byBleGNsdWRlIGFzIGFic29sdXRlIHBhdGhzIChub3JtYWxpemVkKSBmb3IgemJkaXIKCQkJCSRzYW5pdGl6ZWRfZXhjbHVkZXMgPSAkdGhpcy0+c2FuaXRpemVfZXhjbHVkZXMoICRleGNsdWRlcywgJGFkZGl0aW9uYWxfZXhjbHVkZXMsICRhZGRfZGlyZWN0b3J5ICk7CgoJCQkJLy8gTm93IGxldCdzIGNyZWF0ZSB0aGUgbGlzdCBvZiBpdGVtcyB0byBhZGQgdG8gdGhlIHppcCAtIGZpcnN0IGJ1aWxkIHRoZSB0cmVlCgkJCQkkbGlzdG1ha2VyID0gbmV3IHBsdWdpbmJ1ZGR5X3piZGlyKCAkYWRkX2RpcmVjdG9yeSwgJHNhbml0aXplZF9leGNsdWRlcyApOwoJCQkJCgkJCQkvLyBSZS1nZW5lcmF0ZSBvdXIgc2FuaXRpemVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMvZmlsZXMgdG8gZXhjbHVkZSBhcyByZWxhdGl2ZSBwYXRocwoJCQkJLy8gU2xpZ2h0IGtsdWRnZSB0byBkZWFsIHdpdGggYmVpbmcgYWJsZSB0byBlbmFibGUvZGlzYWJsZSB0aGUgaW5jbHVzaW9uIHByb2Nlc3NpbmcKCQkJCS8vIChjdXJyZW50bHkgY29uZmlndXJlZCBpbiB3cC1jb25maWcucGhwKSBzbyBhbHdheXMgbmVlZCB0byBwcm92aWRlIHRoZSBleGNsdWRlcyBhcwoJCQkJLy8gcmVsYXRpdmUgcGF0aCBmb3Igbm93LiBUaGlzIG5lZWRzIHRvIGJlIHRpZGllZCB1cCBpbiBmdXR1cmUgaWYvd2hlbiB0aGUgY2FwYWJpbGl0eQoJCQkJLy8gaXMgZXN0YWJsaXNoZWQgYXMgc3RhbmRhcmQKCQkJCSRzYW5pdGl6ZWRfZXhjbHVkZXMgPSAkdGhpcy0+c2FuaXRpemVfZXhjbHVkZXMoICRleGNsdWRlcywgJGFkZGl0aW9uYWxfZXhjbHVkZXMgKTsJCQkJCgoJCQl9IGVsc2UgewoJCQkKCQkJCS8vIEdlbmVyYXRlIG91ciBzYW5pdGl6ZWQgbGlzdCBvZiBkaXJlY3Rvcmllcy9maWxlcyB0byBleGNsdWRlIGFzIHJlbGF0aXZlIHBhdGhzCgkJCQkkc2FuaXRpemVkX2V4Y2x1ZGVzID0gJHRoaXMtPnNhbml0aXplX2V4Y2x1ZGVzKCAkZXhjbHVkZXMsICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICk7CgkJCQoJCQl9CgkJCQoJCQkvLyBJdGVyYXRlIG92ZXIgdGhlIG1ldGhvZHMgLSBvbmNlIHdlIHN1Y2NlZWQganVzdCByZXR1cm4gZGlyZWN0bHkgb3RoZXJ3aXNlIGRyb3AgdGhyb3VnaAoJCQlmb3JlYWNoICggJHppcF9tZXRob2RzIGFzICRtZXRob2RfdGFnICkgewoJCQkKCQkJCS8vIEZpcnN0IG1ha2Ugc3VyZSB3ZSBjYW4gYXJjaGl2ZSB3aXRoIHRoaXMgbWV0aG9kCgkJCQlpZiAoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXVsgJ2F0dHInIF1bICdpc19hcmNoaXZlcicgXSA9PT0gdHJ1ZSApIHsKCgkJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkJCgkJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQkKCQkJCQkvLyBTZXQgdGhlc2Ugb24gc3BlY2lmaWMgemlwcGVyIGJhc2VkIG9uIHRoZSB2YWx1ZXMgd2UgZGVyaXZlZCBhdCBjb25zdHJ1bmN0aW9uIG9yCgkJCQkJLy8gb3ZlcnJpZGRlbiBieSBzdWJzZXF1ZW50IG1ldGhvZCBjYWxscwoJCQkJCSR6aXBwZXItPnNldF9jb21wcmVzc2lvbiggJHRoaXMtPmdldF9jb21wcmVzc2lvbigpICk7CgkJCQkJJHppcHBlci0+c2V0X2lnbm9yZV9zeW1saW5rcyggJHRoaXMtPmdldF9pZ25vcmVfc3ltbGlua3MoKSApOwoJCQkJCSR6aXBwZXItPnNldF9pZ25vcmVfd2FybmluZ3MoICR0aGlzLT5nZXRfaWdub3JlX3dhcm5pbmdzKCkgKTsKCQkJCQkKCQkJCQkvLyBXZSBuZWVkIHRvIHRlbGwgdGhlIG1ldGhvZCB3aGF0IGRldGFpbHMgYmVsb25nIHRvIGl0CgkJCQkJJHppcHBlci0+c2V0X21ldGhvZF9kZXRhaWxzKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF0gKTsKCQkJCQkKCQkJCQkvLyBUZWxsIHRoZSBtZXRob2QgdGhlIHNlcnZlciBhcGkgaW4gdXNlCgkJCQkJJHppcHBlci0+c2V0X3NhcGlfbmFtZSggJHRoaXMtPmdldF9zYXBpX25hbWUoKSApOwoJCQkJCQoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1RyeWluZyAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRtZXRob2RfdGFnIC4gX18oJyBtZXRob2QgZm9yIFpJUC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkJCgkJCQkJLy8gQXMgd2UgYXJlIGxvb3BpbmcgbWFrZSBzdXJlIHdlIGhhdmUgbm8gc3RhbGUgZmlsZSBpbmZvcm1hdGlvbgoJCQkJCWNsZWFyc3RhdGNhY2hlKCk7CgkJCQkJCgkJCQkJLy8gVGhlIHRlbXBvcmFyeSB6aXAgZGlyZWN0b3J5IF9tdXN0XyBleGlzdAoJCQkJCWlmICggIWVtcHR5KCAkdGVtcG9yYXJ5X3ppcF9kaXJlY3RvcnkgKSApIHsKCQkJCQkKCQkJCQkJaWYgKCAhZmlsZV9leGlzdHMoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApICkgeyAvLyBDcmVhdGUgdGVtcCBkaXIgaWYgaXQgZG9lcyBub3QgZXhpc3QuCgkJCQkJCQoJCQkJCQkJbWtkaXIoICR0ZW1wb3JhcnlfemlwX2RpcmVjdG9yeSApOwoJCQkJCQkJCgkJCQkJCX0KCQkJCQkJCgkJCQkJfQoJCQkJCQoJCQkJCS8vIE5vdyB3ZSBhcmUgcmVhZHkgdG8gdHJ5IGFuZCBwcm9kdWNlIHRoZSBiYWNrdXAKCQkJCQlpZiAoICR6aXBwZXItPmNyZWF0ZSggJHppcF9maWxlLCAkYWRkX2RpcmVjdG9yeSwgJHNhbml0aXplZF9leGNsdWRlcywgJHRlbXBvcmFyeV96aXBfZGlyZWN0b3J5LCAkbGlzdG1ha2VyICkgPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJCS8vIEdvdCBhIHZhbGlkIHppcCBmaWxlIHNvIHdlIGNhbiBqdXN0IHJldHVybiAtIG1ldGhvZCB3aWxsIGhhdmUgY2xlYW5lZCB1cCB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeQoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAkbWV0aG9kX3RhZyAuIF9fKCcgbWV0aG9kIGZvciBaSVAgd2FzIHN1Y2Nlc3NmdWwuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQkJLy8gV2UgaGF2ZSB0byByZXR1cm4gaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBicmVhayBvdXQgb2YgZm9yZWFjaAoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQoJCQkJCX0gZWxzZSB7CgkJCQkJCgkJCQkJCS8vIE1ldGhvZCB3aWxsIGhhdmUgY2xlYW5lZCB1cCB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeQkJCQkKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnVGhlICcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJG1ldGhvZF90YWcgLiBfXygnIG1ldGhvZCBmb3IgWklQIHdhcyB1bnN1Y2Nlc3NmdWwuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCQkJCQkJCQkJCQkJCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfSBlbHNlIHsKCQkJCQoJCQkJCS8vIFRoaXMgbWV0aG9kIGlzIG5vdCBjb25zaWRlcmVkIHN1aXRhYmxlIChyZWxpYWJsZSBlbm91Z2gpIGZvciBjcmVhdGluZyBhcmNoaXZlcyBvciBsYWNrZWQgemlwIGNhcGFiaWxpdHkKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdUaGUgJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICRtZXRob2RfdGFnIC4gX18oJyBtZXRob2QgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGJhY2t1cC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CQkJCQkKCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIGdldCBoZXJlIHRoZW4gaGF2ZSBmYWlsZWQgaW4gYWxsIGF0dGVtcHRzCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBjcmVhdGUgYSBaaXAgQXJjaGl2ZSBmaWxlIHdpdGggYW55IG5vbWluYXRlZCBtZXRob2QuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkKCQkJcmV0dXJuIGZhbHNlOwoJCgkJfQoKCQkvKioKCQkgKgl1bnppcCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgYSB6aXAgZmlsZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCgkJICoJQHBhcmFtCXN0cmluZwkJJHppcF9maWxlCQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkJJGRlc3RpbmF0aW9uX2RpcmVjdG9yeQkJRnVsbCBkaXJlY3RvcnkgcGF0aCB0byBleHRyYWN0IGludG8uCgkJICoJQHBhcmFtCWJvb2x8c3RyaW5nICRmb3JjZV9jb21wYXRpYmlsaXR5X21vZGUJRmFsc2U6IHVzZSBhbGwgYXZhaWxhYmxlLCBTdHJpbmc6IHVzZSB0aGF0IG1ldGhvZAoJCSAqCgkJICoJQHJldHVybglib29sCQkJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UKCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gdW56aXAoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZSA9IGZhbHNlICkgewoKCQkJJHppcF9tZXRob2RzID0gYXJyYXkoKTsKCQkJCgkJCS8vIFRoZSBmb2xsb3dpbmcgaXMganVzdCB0byBtYXRjaCBjdXJyZW50IGZ1bmN0aW9uYWxpdHkgZm9yIGltcG9ydGJ1ZGR5IC0gaWRlYWxseSB3b3VsZCByYXRoZXIKCQkJLy8gZG8gaXQgYnkgc2VsZWN0aW5nIGF2YWlsYWJsZSBjb21wYXRpYmlsaXR5IG1ldGhvZHMgYmFzZWQgb24gbWV0aG9kIGF0dHJpYnV0ZXMgLSBtYXkgZG8gdGhhdCBsYXRlcgoJCQkvLyAod291bGQgYWxzbyBuZWVkIGdldF9jb21wYXRpYmlsaXR5X3ppcF9tZXRob2RzKCkgdG8gYmUgdXBkYXRlZCB0byB0YWtlIHBhcmFtZXRlciB0byBjaGVjawoJCQkvLyB3aGV0aGVyIGNvbXBhdGliaWxpdHkgbWV0aG9kIGZvciB0aGF0IHBhcnRpY3VsYXIgZnVuY3Rpb24uCgkJCQkJCQoJCQkvLyBEZWNpZGUgd2hpY2ggbWV0aG9kcyB3ZSBhcmUgZ29pbmcgdG8gdHJ5CgkJCWlmICggJGZvcmNlX2NvbXBhdGliaWxpdHlfbW9kZSA9PSAnemlwYXJjaGl2ZScgKSB7CgoJCQkJJHppcF9tZXRob2RzID0gYXJyYXkoICd6aXBhcmNoaXZlJyApOwkJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ0ZvcmNlZCBjb21wYXRpYmlsaXR5IHVuemlwIG1ldGhvZCAoWmlwQXJjaGl2ZTsgbWVkaXVtIHNwZWVkKSBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJfSBlbHNlaWYgKCAkZm9yY2VfY29tcGF0aWJpbGl0eV9tb2RlID09ICdwY2x6aXAnICkgewoJCQkKCQkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCAncGNsemlwJyApOwkJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgX18oJ0ZvcmNlZCBjb21wYXRpYmlsaXR5IHVuemlwIG1ldGhvZCAoUENMWmlwOyBzbG93IHNwZWVkKSBiYXNlZCBvbiBzZXR0aW5ncy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CQkJCgkJCQoJCQl9IGVsc2UgewoJCQkKCQkJCSR6aXBfbWV0aG9kcyA9ICR0aGlzLT5femlwX21ldGhvZHM7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdVc2luZyBhbGwgYXZhaWxhYmxlIHVuemlwIG1ldGhvZHMgaW4gcHJlZmVycmVkIG9yZGVyLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJfQoJCQkJCQkKCQkJLy8gQmV0dGVyIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWUgYXZhaWxhYmxlIG1ldGhvZHMKCQkJaWYgKCBlbXB0eSggJHppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gSG1tLCB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgYW55IGF2YWlsYWJsZSBtZXRob2RzLCBvb3BzLCBiZXN0IGdvIG5vIGZ1cnRoZXIKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1VuYWJsZSB0byBleHRyYWN0IGJhY2t1cCBmaWxlIGNvbnRlbnRzICglMSRzIHRvICUyJHMpOiBObyBhdmFpbGFibGUgdW56aXAgbWV0aG9kcyBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApOwoJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBub3JtYWxpemVkIGRpcmVjdG9yeSBzZXBhcmF0b3Igc3VmZml4CQoJCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gcnRyaW0oICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1I7CQkKCgkJCS8vIEl0ZXJhdGUgb3ZlciB0aGUgbWV0aG9kcyAtIG9uY2Ugd2Ugc3VjY2VlZCBqdXN0IHJldHVybiBkaXJlY3RseSBvdGhlcndpc2UgZHJvcCB0aHJvdWdoCgkJCWZvcmVhY2ggKCAkemlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgkJCQoJCQkJLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGNhbiBjaGVjayBmaWxlIGV4aXN0ZW5jZSB3aXRoIHRoaXMgbWV0aG9kIChpZ25vcmUgc2lsZW50bHkgaWYgbm90KQoJCQkJLy8gTm90ZTogaGFzIHRvIGJlIGFibGUgdG8gdW56aXAgYXMgd2VsbCBidXQgaWYgdGhhdCBmdW5jdGlvbmFsaXR5IHdhc24ndCBhdmFpbGFibGUgaW4KCQkJCS8vIHRoZSBtZXRob2QgdGhlIGlzX2NoZWNrZXIgYXR0cmlidXRlIHdpbGwgaGF2ZSBiZWVuIHNldCBmYWxzZQoJCQkJaWYgKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF1bICdhdHRyJyBdWyAnaXNfdW5hcmNoaXZlcicgXSA9PT0gdHJ1ZSApIHsKCgkJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkJCgkJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQkKCQkJCQkvLyBXZSBuZWVkIHRvIHRlbGwgdGhlIG1ldGhvZCB3aGF0IGRldGFpbHMgYmVsb25nIHRvIGl0CgkJCQkJJHppcHBlci0+c2V0X21ldGhvZF9kZXRhaWxzKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF0gKTsKCQkJCQkJCQkJCQoJCQkJCS8vIE5vdyB3ZSBhcmUgcmVhZHkgdG8gdHJ5IGFuZCBleHRyYWN0IHRoZSBiYWNrdXAKCQkJCQkkcmVzdWx0ID0gJHppcHBlci0+ZXh0cmFjdCggJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICk7CgkJCQkJCgkJCQkJLy8gV2lsbCBiZSBmYWxzZSBpZiB3ZSBjb3VsZG4ndCBleHRyYWN0IHRoZSBiYWNrdXAKCQkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJCS8vIE11c3QgYXNzdW1lIHRoYXQgd2UgZXh0cmFjdGVkIG9rCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIHRvIHJldHVybiBoZXJlIGJlY2F1c2Ugd2UgY2Fubm90IGJyZWFrIG91dCBvZiBmb3JlYWNoCgkJCQkJCXJldHVybiB0cnVlOwoJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gVGhlIHppcHBlciBlbmNvdW50ZXJlZCBhbiBlcnJvciBzbyB3ZSBuZWVkIHRvIGRyb3AgdGhyb3VnaCBhbmQgbG9vcCByb3VuZCB0byB0cnkgYW5vdGhlcgoJCQkJCQkvLyBXZSdsbCBub3QgcHJvY2VzcyB0aGUgcmVzdWx0IGhlcmUsIGp1c3QgZHJvcCB0aHJvdWdoIHNpbGVudGx5ICh0aGUgbWV0aG9kIHdpbGwgaGF2ZSBsb2dnZWQgaXQpCQkJCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIG5vIG1ldGhvZCB0byBleHRyYWN0IGJhY2t1cCBjb250ZW50IHdhcyBhdmFpbGFibGUgb3Igd29ya2VkCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1VuYWJsZSB0byBleHRyYWN0IGJhY2t1cCBmaWxlIGNvbnRlbnRzICglMSRzIHRvICUyJHMpOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZXh0cmFjdCgpCgkJICoKCQkgKglFeHRyYWN0cyB0aGUgc3BlY2lmaWVkIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiB1c2luZyB0aGUgYmVzdCB1bnppcCBtZXRob2RzIHBvc3NpYmxlLgoJCSAqCVRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgX211c3RfIGFscmVhZHkgZXhpc3QgYW5kIGJlIHdyaXRhYmxlIC0gdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjcmVhdGUgaXQKCQkgKglUaGUgaXRlbXMgYXJlIGFuIGFycmF5IG9mIG1hcHBpbmcgb2Ygd2hhdCA9PiB3aGVyZSwgZS5nLgoJCSAqCWFycmF5KCAiZGlyL215ZmlsZS50eHQiID0+ICIiLCAiZGlyL215ZmlsZS50eHQiID0+ICJ0bXBmaWxlbmFtZSIsICJkaXIvbXlmaWxlLnR4dCIgPT4gImRpci9teWZpbGUudHh0IiApCgkJICoJSW4gdGhlIGZpcnN0IGNhc2UgdGhlIGZpbGUgaXMgZXh0cmFjdGVkIHRvICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkvbXlmaWxlLnR4dAoJCSAqCUluIHRoZSBzZWNvbmQgY2FzZSB0aGUgZmlsZSBpcyBleHRyYWN0ZWQgdG8gJGRlc3RpbmF0aW9uX2RpcmVjdG9yeS90bXBmaWxlbmFtZQoJCSAqCUluIHRoZSB0aGlyZCBjYXNlIHRoZSBmaWxlIGlzIGV4dHJhY3RlZCB0byAkZGVzdGluYXRpb25fZGlyZWN0b3J5L2Rpci9teWZpbGUudHh0CgkJICoJTm90ZTogaW4gdGhlIHNlY29uZCBjYXNlIHRoZSBmaWxlIGlzIGluaXRpYWxseSBleHRyY2F0ZWQgYXMgbXlmaWxlLnR4dCBhbmQgdGhlbiByZW5hbWUgdG8gdG1wZmlsZW5hbWUKCQkgKglBbm90aGVyIGV4YW1wbGUgaXMgZm9yIGRpcmVjdG9yeSBleHRyYWN0aW9uOgoJCSAqCWFycmF5KCAiZGlyLyoiID0+ICJkaXIvKiIgKQoJCSAqCVdoZXJlYnkgdGhlIGRpcmVjdG9yeSBkaXIgYW5kIGFsbCBpdCdzIGNvbnRlbnQgKHJlY3Vyc2l2ZWx5KSBpcyBleHRyYWN0ZWQgdG8gJGRlc3RpbmF0aW9uL2RpcgoJCSAqCU5vdGU6IHRoZSAqIGlzIHJlcXVpcmVkIG90aGVyd2lzZSB5b3UganVzdCBnZXQgYW4gZW1wdHkgZGlyZWN0b3J5CgkJICoKCQkgKglAcGFyYW0Jc3RyaW5nCSR6aXBfZmlsZQkJCQlGdWxsIHBhdGggJiBmaWxlbmFtZSBvZiBaSVAgZmlsZSB0byBleHRyYWN0IGZyb20uCgkJICoJQHBhcmFtCXN0cmluZwkkZGVzdGluYXRpb25fZGlyZWN0b3J5CUZ1bGwgZGlyZWN0b3J5IHBhdGggdG8gZXh0cmFjdCB0bwoJCSAqCUBwYXJhbQlhcnJheQkkaXRlbXMJCQkJCU1hcHBpbmcgb2Ygd2hhdCB0byBleHRyYWN0IGFuZCB0byB3aGF0CgkJICoKCQkgKglAcmV0dXJuCWJvb2wJCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzIChhbGwgZXh0cmFjdGlvbnMgc3VjY2Vzc2Z1bCksIGZhbHNlIG90aGVyd2lzZQoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBleHRyYWN0KCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksICRpdGVtcyApIHsKCgkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCk7CgkJCQoJCQkvLyBUaGUgZm9sbG93aW5nIGlzIGp1c3QgdG8gbWF0Y2ggY3VycmVudCBmdW5jdGlvbmFsaXR5IGZvciBpbXBvcnRidWRkeSAtIGlkZWFsbHkgd291bGQgcmF0aGVyCgkJCS8vIGRvIGl0IGJ5IHNlbGVjdGluZyBhdmFpbGFibGUgY29tcGF0aWJpbGl0eSBtZXRob2RzIGJhc2VkIG9uIG1ldGhvZCBhdHRyaWJ1dGVzIC0gbWF5IGRvIHRoYXQgbGF0ZXIKCQkJLy8gKHdvdWxkIGFsc28gbmVlZCBnZXRfY29tcGF0aWJpbGl0eV96aXBfbWV0aG9kcygpIHRvIGJlIHVwZGF0ZWQgdG8gdGFrZSBwYXJhbWV0ZXIgdG8gY2hlY2sKCQkJLy8gd2hldGhlciBjb21wYXRpYmlsaXR5IG1ldGhvZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgoJCQkJCQkKCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkJCQkJCgkJCS8vIEJldHRlciBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGF2YWlsYWJsZSBtZXRob2RzCgkJCWlmICggZW1wdHkoICR6aXBfbWV0aG9kcyApICkgewoJCQkKCQkJCS8vIEhtbSwgd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFueSBhdmFpbGFibGUgbWV0aG9kcywgb29wcywgYmVzdCBnbyBubyBmdXJ0aGVyCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gZXh0cmFjdCBmcm9tIGJhY2t1cCBmaWxlICglMSRzIHRvICUyJHMpOiBObyBhdmFpbGFibGUgdW56aXAgbWV0aG9kcyBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUsICRkZXN0aW5hdGlvbiApICk7CgkJCQkKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQlpZiAoICEoIGZpbGVfZXhpc3RzKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgJiYgaXNfZGlyKCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgJiYgaXNfd3JpdGFibGUoICRkZXN0aW5hdGlvbl9kaXJlY3RvcnkgKSApICkgewoJCQkKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oJ1VuYWJsZSB0byBleHRyYWN0IGZyb20gYmFja3VwIGZpbGUgKCUxJHMgdG8gJTIkcyk6ICUyJHMgZG9lcyBub3QgZXhpc3QsIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBpcyBub3Qgd3JpdGVhYmxlJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgKTsKCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkKCQkJLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBub3JtYWxpemVkIGRpcmVjdG9yeSBzZXBhcmF0b3Igc3VmZml4CQoJCQkkZGVzdGluYXRpb25fZGlyZWN0b3J5ID0gcnRyaW0oICRkZXN0aW5hdGlvbl9kaXJlY3RvcnksIHNlbGY6OkRJUkVDVE9SWV9TRVBBUkFUT1JTICkgLiBzZWxmOjpOT1JNX0RJUkVDVE9SWV9TRVBBUkFUT1I7CQkKCgkJCS8vIEl0ZXJhdGUgb3ZlciB0aGUgbWV0aG9kcyAtIG9uY2Ugd2Ugc3VjY2VlZCBqdXN0IHJldHVybiBkaXJlY3RseSBvdGhlcndpc2UgZHJvcCB0aHJvdWdoCgkJCWZvcmVhY2ggKCAkemlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgkJCQoJCQkJLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGNhbiBjaGVjayBmaWxlIGV4aXN0ZW5jZSB3aXRoIHRoaXMgbWV0aG9kIChpZ25vcmUgc2lsZW50bHkgaWYgbm90KQoJCQkJLy8gTm90ZTogaGFzIHRvIGJlIGFibGUgdG8gdW56aXAgYXMgd2VsbCBidXQgaWYgdGhhdCBmdW5jdGlvbmFsaXR5IHdhc24ndCBhdmFpbGFibGUgaW4KCQkJCS8vIHRoZSBtZXRob2QgdGhlIGlzX2NoZWNrZXIgYXR0cmlidXRlIHdpbGwgaGF2ZSBiZWVuIHNldCBmYWxzZQoJCQkJaWYgKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF1bICdhdHRyJyBdWyAnaXNfZXh0cmFjdG9yJyBdID09PSB0cnVlICkgewoKCQkJCQkkY2xhc3NfbmFtZSA9ICdwbHVnaW5idWRkeV96YnppcCcgLiAkbWV0aG9kX3RhZzsKCQkKCQkJCQkkemlwcGVyID0gbmV3ICRjbGFzc19uYW1lKCAkdGhpcyApOwoJCQkJCQoJCQkJCS8vIFdlIG5lZWQgdG8gdGVsbCB0aGUgbWV0aG9kIHdoYXQgZGV0YWlscyBiZWxvbmcgdG8gaXQKCQkJCQkkemlwcGVyLT5zZXRfbWV0aG9kX2RldGFpbHMoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXSApOwoJCQkJCQkJCQkJCgkJCQkJLy8gTm93IHdlIGFyZSByZWFkeSB0byB0cnkgYW5kIGV4dHJhY3QgZnJvbSB0aGUgYmFja3VwCgkJCQkJJHJlc3VsdCA9ICR6aXBwZXItPmV4dHJhY3QoICR6aXBfZmlsZSwgJGRlc3RpbmF0aW9uX2RpcmVjdG9yeSwgJGl0ZW1zICk7CgkJCQkJCgkJCQkJLy8gV2lsbCBiZSBmYWxzZSBpZiB3ZSBjb3VsZG4ndCBleHRyYWN0IGZyb20gdGhlIGJhY2t1cAoJCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkJLy8gTXVzdCBhc3N1bWUgdGhhdCB3ZSBleHRyYWN0ZWQgb2sKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJCS8vIFdlIGhhdmUgdG8gcmV0dXJuIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgYnJlYWsgb3V0IG9mIGZvcmVhY2gKCQkJCQkJcmV0dXJuIHRydWU7CgkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBUaGUgemlwcGVyIGVuY291bnRlcmVkIGFuIGVycm9yIHNvIHdlIG5lZWQgdG8gZHJvcCB0aHJvdWdoIGFuZCBsb29wIHJvdW5kIHRvIHRyeSBhbm90aGVyCgkJCQkJCS8vIFdlJ2xsIG5vdCBwcm9jZXNzIHRoZSByZXN1bHQgaGVyZSwganVzdCBkcm9wIHRocm91Z2ggc2lsZW50bHkgKHRoZSBtZXRob2Qgd2lsbCBoYXZlIGxvZ2dlZCBpdCkJCQkKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gbm8gbWV0aG9kIHRvIGV4dHJhY3QgZnJvbSBiYWNrdXAgY29udGVudCB3YXMgYXZhaWxhYmxlIG9yIHdvcmtlZAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gZXh0cmFjdCBmcm9tIGJhY2t1cCBmaWxlICglMSRzIHRvICUyJHMpOiBObyBjb21wYXRpYmxlIHppcCBtZXRob2QgZm91bmQuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlLCAkZGVzdGluYXRpb25fZGlyZWN0b3J5ICkgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQl9CgkJCgkJLyoqCgkJICoJZmlsZV9leGlzdHMoKQoJCSAqCQoJCSAqCVRlc3RzIHdoZXRoZXIgYSBmaWxlICh3aXRoIHBhdGgpIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gemlwIGZpbGUKCQkgKglJZiBsZWF2ZV9vcGVuIGlzIHRydWUgdGhlbiB0aGUgemlwIG9iamVjdCB3aWxsIGJlIGxlZnQgb3BlbiBmb3IgZmFzdGVyIGNoZWNraW5nIGZvciBzdWJzZXF1ZW50IGZpbGVzIHdpdGhpbiB0aGlzIHppcAoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCSR6aXBfZmlsZQkJVGhlIHppcCBmaWxlIHRvIGNoZWNrCgkJICoJQHBhcmFtCQlzdHJpbmcJJGxvY2F0ZV9maWxlCVRoZSBmaWxlIHRvIHRlc3QgZm9yCgkJICoJQHBhcmFtCQlib29sCSRsZWF2ZV9vcGVuCQlPcHRpb25hbDogVHJ1ZSBpZiB0aGUgemlwIGZpbGUgc2hvdWxkIGJlIGxlZnQgb3BlbgoJCSAqCUByZXR1cm4JCWJvb2wJCQkJCVRydWUgaWYgdGhlIGZpbGUgaXMgZm91bmQgaW4gdGhlIHppcCBvdGhlcndpc2UgZmFsc2UKCQkgKgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBmaWxlX2V4aXN0cyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUsICRsZWF2ZV9vcGVuID0gZmFsc2UgKSB7CgkJCQkJCgkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCk7CgkJCQkJCQoJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkKCQkJLy8gQmV0dGVyIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWUgYXZhaWxhYmxlIG1ldGhvZHMKCQkJaWYgKCBlbXB0eSggJHppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gSG1tLCB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgYW55IGF2YWlsYWJsZSBtZXRob2RzLCBvb3BzLCBiZXN0IGdvIG5vIGZ1cnRoZXIKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBjaGVjayBmaWxlIGV4aXN0cyAtIG5vIGF2YWlsYWJsZSBtZXRob2RzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCQkJCgkJCS8vIEl0ZXJhdGUgb3ZlciB0aGUgbWV0aG9kcyAtIG9uY2Ugd2Ugc3VjY2VlZCBqdXN0IHJldHVybiBkaXJlY3RseSBvdGhlcndpc2UgZHJvcCB0aHJvdWdoCgkJCWZvcmVhY2ggKCAkemlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgkJCQoJCQkJLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGNhbiBjaGVjayBmaWxlIGV4aXN0ZW5jZSB3aXRoIHRoaXMgbWV0aG9kIChpZ25vcmUgc2lsZW50bHkgaWYgbm90KQoJCQkJLy8gTm90ZTogaGFzIHRvIGJlIGFibGUgdG8gdW56aXAgYXMgd2VsbCBidXQgaWYgdGhhdCBmdW5jdGlvbmFsaXR5IHdhc24ndCBhdmFpbGFibGUgaW4KCQkJCS8vIHRoZSBtZXRob2QgdGhlIGlzX2NoZWNrZXIgYXR0cmlidXRlIHdpbGwgaGF2ZSBiZWVuIHNldCBmYWxzZQoJCQkJaWYgKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF1bICdhdHRyJyBdWyAnaXNfY2hlY2tlcicgXSA9PT0gdHJ1ZSApIHsKCgkJCQkJJGNsYXNzX25hbWUgPSAncGx1Z2luYnVkZHlfemJ6aXAnIC4gJG1ldGhvZF90YWc7CgkJCgkJCQkJJHppcHBlciA9IG5ldyAkY2xhc3NfbmFtZSggJHRoaXMgKTsKCQkJCQkKCQkJCQkvLyBXZSBuZWVkIHRvIHRlbGwgdGhlIG1ldGhvZCB3aGF0IGRldGFpbHMgYmVsb25nIHRvIGl0CgkJCQkJJHppcHBlci0+c2V0X21ldGhvZF9kZXRhaWxzKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF0gKTsKCQkJCQkJCQkJCQoJCQkJCS8vIE5vdyB3ZSBhcmUgcmVhZHkgdG8gdHJ5IGFuZCB0ZXN0IGZvciB0aGUgZmlsZSBleGlzdGVuY2UKCQkJCQkkcmVzdWx0ID0gJHppcHBlci0+ZmlsZV9leGlzdHMoICR6aXBfZmlsZSwgJGxvY2F0ZV9maWxlLCAkbGVhdmVfb3BlbiApOwoJCQkJCQoJCQkJCS8vIFdpbGwgYmUgdHJ1ZS9mYWxzZSBpZiBmaWxlIGZvdW5kL25vdC1mb3VuZCBvdGhlcndpc2UgZXJyb3IgaW5mb3JtYXRpb24gYXJyYXkKCQkJCQlpZiAoICFpc19hcnJheSggJHJlc3VsdCApICkgewoJCQkJCQoJCQkJCQkvLyBFaXRoZXIgd2UgZm91bmQgdGhlIGZpbGUgb3Igd2UgZGlkbid0IGJ1dCB3ZSBoYXZlIGEgdmFsaWQgcmVzdWx0CgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIHRvIHJldHVybiBoZXJlIGJlY2F1c2Ugd2UgY2Fubm90IGJyZWFrIG91dCBvZiBmb3JlYWNoCgkJCQkJCXJldHVybiAkcmVzdWx0OwoJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gVGhlIHppcHBlciBlbmNvdW50ZXJlZCBhbiBlcnJvciBzbyB3ZSBuZWVkIHRvIGRyb3AgdGhyb3VnaCBhbmQgbG9vcCByb3VuZCB0byB0cnkgYW5vdGhlcgoJCQkJCQkvLyBXZSdsbCBub3QgcHJvY2VzcyB0aGUgcmVzdWx0IGhlcmUsIGp1c3QgZHJvcCB0aHJvdWdoIHNpbGVudGx5ICh0aGUgbWV0aG9kIHdpbGwgaGF2ZSBsb2dnZWQgaXQpCQkJCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIG5vIG1ldGhvZCB0byBjaGVjayBiYWNrdXAgY29udGVudCB3YXMgYXZhaWxhYmxlIG9yIHdvcmtlZAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gY2hlY2sgaWYgZmlsZSBleGlzdHMgKGxvb2tpbmcgZm9yICUxJHMgaW4gJTIkcyk6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkbG9jYXRlX2ZpbGUsICR6aXBfZmlsZSApICk7CgkJCXJldHVybiBmYWxzZTsKCQkJCgkJfQoJCQkJCgkJLyoJZ2V0X2ZpbGVfbGlzdCgpCgkJICoJCgkJICoJR2V0IGFuIGFycmF5IG9mIGFsbCBmaWxlcyBpbiBhIHppcCBmaWxlIHdpdGggc29tZSBmaWxlIHByb3BlcnRpZXMuCgkJICoJCgkJICoJQHBhcmFtCQlzdHJpbmcJCSR6aXBfZmlsZQlUaGUgZmlsZSB0byBsaXN0IHRoZSBjb250ZW50IG9mCgkJICoJQHJldHVybgkJYm9vbHxhcnJheQkJCQlmYWxzZSBvbiBmYWlsdXJlLCBvdGhlcndpc2UgYXJyYXkgb2YgZmlsZSBwcm9wZXJ0aWVzIChtYXkgYmUgZW1wdHkpCgkJICovCgkJcHVibGljIGZ1bmN0aW9uIGdldF9maWxlX2xpc3QoICR6aXBfZmlsZSApIHsKCgkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCk7CgkJCQkJCQoJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkKCQkJLy8gQmV0dGVyIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWUgYXZhaWxhYmxlIG1ldGhvZHMKCQkJaWYgKCBlbXB0eSggJHppcF9tZXRob2RzICkgKSB7CgkJCQoJCQkJLy8gSG1tLCB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgYW55IGF2YWlsYWJsZSBtZXRob2RzLCBvb3BzLCBiZXN0IGdvIG5vIGZ1cnRoZXIKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZhaWxlZCB0byBsaXN0IGJhY2t1cCBmaWxlIGNvbnRlbnRzIC0gbm8gYXZhaWxhYmxlIG1ldGhvZHMuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCQkJCgkJCQlyZXR1cm4gZmFsc2U7CgkJCQkKCQkJfQoJCQkJCQkKCQkJLy8gSXRlcmF0ZSBvdmVyIHRoZSBtZXRob2RzIC0gb25jZSB3ZSBzdWNjZWVkIGp1c3QgcmV0dXJuIGRpcmVjdGx5IG90aGVyd2lzZSBkcm9wIHRocm91Z2gKCQkJZm9yZWFjaCAoICR6aXBfbWV0aG9kcyBhcyAkbWV0aG9kX3RhZyApIHsKCQkJCgkJCQkvLyBGaXJzdCBtYWtlIHN1cmUgd2UgY2FuIGxpc3QgYmFja3VwIGZpbGUgY29udGVudCB3aXRoIHRoaXMgbWV0aG9kIChpZ25vcmUgc2lsZW50bHkgaWYgbm90KQoJCQkJLy8gTm90ZTogaGFzIHRvIGJlIGFibGUgdG8gdW56aXAgYXMgd2VsbCBidXQgaWYgdGhhdCBmdW5jdGlvbmFsaXR5IHdhc24ndCBhdmFpbGFibGUgaW4KCQkJCS8vIHRoZSBtZXRob2QgdGhlIGlzX2xpc3RlciBhdHRyaWJ1dGUgd2lsbCBoYXZlIGJlZW4gc2V0IGZhbHNlCgkJCQlpZiAoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXVsgJ2F0dHInIF1bICdpc19saXN0ZXInIF0gPT09IHRydWUgKSB7CgoJCQkJCSRjbGFzc19uYW1lID0gJ3BsdWdpbmJ1ZGR5X3piemlwJyAuICRtZXRob2RfdGFnOwoJCQoJCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkJCgkJCQkJLy8gV2UgbmVlZCB0byB0ZWxsIHRoZSBtZXRob2Qgd2hhdCBkZXRhaWxzIGJlbG9uZyB0byBpdAoJCQkJCSR6aXBwZXItPnNldF9tZXRob2RfZGV0YWlscyggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdICk7CgkJCQkJCQkJCQkKCQkJCQkvLyBOb3cgd2UgYXJlIHJlYWR5IHRvIHRyeSBhbmQgdGVzdCBmb3IgdGhlIGZpbGUgZXhpc3RlbmNlCgkJCQkJJHJlc3VsdCA9ICR6aXBwZXItPmdldF9maWxlX2xpc3QoICR6aXBfZmlsZSApOwoJCQkJCQoJCQkJCS8vIFdpbGwgYmUgZmFsc2UgaWYgd2UgY291bGRuJ3QgbGlzdCBjb250ZW50cyBvciBmaWxlIGxpc3QgYXJyYXkgb3RoZXJ3aXNlCgkJCQkJaWYgKCBpc19hcnJheSggJHJlc3VsdCApICkgewoJCQkJCQoJCQkJCQkvLyBXZSBnb3QgYSBsaXN0IHNvIGJldHRlciBhc3N1bWUgaXQgaXMgb2sKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJCS8vIFdlIGhhdmUgdG8gcmV0dXJuIGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgYnJlYWsgb3V0IG9mIGZvcmVhY2gKCQkJCQkJcmV0dXJuICRyZXN1bHQ7CgkKCQkJCQl9IGVsc2UgewoJCQkJCQoJCQkJCQkvLyBUaGUgemlwcGVyIGVuY291bnRlcmVkIGFuIGVycm9yIHNvIHdlIG5lZWQgdG8gZHJvcCB0aHJvdWdoIGFuZCBsb29wIHJvdW5kIHRvIHRyeSBhbm90aGVyCgkJCQkJCS8vIFdlJ2xsIG5vdCBwcm9jZXNzIHRoZSByZXN1bHQgaGVyZSwganVzdCBkcm9wIHRocm91Z2ggc2lsZW50bHkgKHRoZSBtZXRob2Qgd2lsbCBoYXZlIGxvZ2dlZCBpdCkJCQkKCQkJCQkJdW5zZXQoICR6aXBwZXIgKTsKCQkJCQkJCgkJCQkJfQoJCQkJCgkJCQl9CgkJCQkKCQkJfQoJCQkKCQkJLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gbm8gbWV0aG9kIHRvIGxpc3QgYmFja3VwIGZpbGUgY29udGVudCB3YXMgYXZhaWxhYmxlIG9yIHdvcmtlZAoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdVbmFibGUgdG8gY2hlY2sgZmlsZSBjb250ZW50IG9mIGJhY2t1cCAoJTEkcyk6IE5vIGNvbXBhdGlibGUgemlwIG1ldGhvZCBmb3VuZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoJCQlyZXR1cm4gZmFsc2U7CgkJCQoJCX0KCQkKCQkvKglzZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHppcF9maWxlCQlGaWxlbmFtZSBvZiBhcmNoaXZlIHRvIHNldCBjb21tZW50IG9uLgoJCSAqCUBwYXJhbQkJc3RyaW5nfGFycmF5CSRjb21tZW50CQlDb21tZW50IHRvIGFwcGx5IHRvIGFyY2hpdmUuIElmIGFycmF5LCBqc29uIGVuY29kZWQuIERlbGltaW5hdGVkIHdpdGggTWV0YURhdGE6IGFuZCBNZXRhRGF0YS1FbmQ6LgoJCSAqCUByZXR1cm4JCWJvb2x8c3RyaW5nCQkJCQkJdHJ1ZSBvbiBzdWNjZXNzLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KCQkgKi8KCQlwdWJsaWMgZnVuY3Rpb24gc2V0X2NvbW1lbnQoICR6aXBfZmlsZSwgJGNvbW1lbnQgKSB7CgkJCQoJCQkkemlwX21ldGhvZHMgPSBhcnJheSgpOwoJCQkJCQkKCQkJJHppcF9tZXRob2RzID0gJHRoaXMtPl96aXBfbWV0aG9kczsKCQkJCgkJCS8vIEJldHRlciBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGF2YWlsYWJsZSBtZXRob2RzCgkJCWlmICggZW1wdHkoICR6aXBfbWV0aG9kcyApICkgewoJCQkKCQkJCS8vIEhtbSwgd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFueSBhdmFpbGFibGUgbWV0aG9kcywgb29wcywgYmVzdCBnbyBubyBmdXJ0aGVyCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGYWlsZWQgdG8gc2V0IGNvbW1lbnQgaW4gYmFja3VwIGZpbGUgLSBubyBhdmFpbGFibGUgbWV0aG9kcy4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCXJldHVybiBmYWxzZTsKCQkJCQoJCQl9CgkJCQoJCQkvLyBFbmNvZGUgJGNvbW1lbnQgaWYgYW4gYXJyYXkuIEhhbmRsZSBkZWxpbWluYXRpb24uCgkJCWlmICggaXNfYXJyYXkoICRjb21tZW50ICkgKSB7CgkJCQkkY29tbWVudCA9IGpzb25fZW5jb2RlKCAkY29tbWVudCApOwoJCQl9CgkJCSRjb21tZW50ID0gJ01ldGFEYXRhOicgLiAkY29tbWVudCAuICdNZXRhRGF0YS1FbmQ6JzsKCQkJCgkJCS8vIEl0ZXJhdGUgb3ZlciB0aGUgbWV0aG9kcyAtIG9uY2Ugd2Ugc3VjY2VlZCBqdXN0IHJldHVybiBkaXJlY3RseSBvdGhlcndpc2UgZHJvcCB0aHJvdWdoCgkJCWZvcmVhY2ggKCAkemlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgkJCQkJCgkJCQkvLyBGaXJzdCBtYWtlIHN1cmUgd2UgY2FuIG1hbmFnZSBjb21tZW50cyB3aXRoIHRoaXMgbWV0aG9kIChpZ25vcmUgc2lsZW50bHkgaWYgbm90KQoJCQkJaWYgKCAkdGhpcy0+X3ppcF9tZXRob2RzX2RldGFpbHNbICRtZXRob2RfdGFnIF1bICdhdHRyJyBdWyAnaXNfY29tbWVudGVyJyBdID09PSB0cnVlICkgewoJCQkJCQoJCQkJCSRjbGFzc19uYW1lID0gJ3BsdWdpbmJ1ZGR5X3piemlwJyAuICRtZXRob2RfdGFnOwoJCQkJCQoJCQkJCSR6aXBwZXIgPSBuZXcgJGNsYXNzX25hbWUoICR0aGlzICk7CgkJCQkJCgkJCQkJLy8gV2UgbmVlZCB0byB0ZWxsIHRoZSBtZXRob2Qgd2hhdCBkZXRhaWxzIGJlbG9uZyB0byBpdAoJCQkJCSR6aXBwZXItPnNldF9tZXRob2RfZGV0YWlscyggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdICk7CgkJCQkJCQkJCQkKCQkJCQkvLyBOb3cgd2UgYXJlIHJlYWR5IHRvIHRyeSBhbmQgdGVzdCBmb3IgdGhlIGZpbGUgZXhpc3RlbmNlCgkJCQkJJHJlc3VsdCA9ICR6aXBwZXItPnNldF9jb21tZW50KCAkemlwX2ZpbGUsICRjb21tZW50ICk7CgkJCQkJCgkJCQkJLy8gV2lsbCBiZSBmYWxzZSBpZiB3ZSBjb3VsZG4ndCBzZXQgdGhlIGNvbW1lbnQKCQkJCQlpZiAoICRyZXN1bHQgPT09IHRydWUgKSB7CgkJCQkJCgkJCQkJCS8vIE11c3QgYXNzdW1lIHRoYXQgY29tbWVudCB3YXMgc2V0IG9rCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCQkvLyBXZSBoYXZlIHRvIHJldHVybiBoZXJlIGJlY2F1c2Ugd2UgY2Fubm90IGJyZWFrIG91dCBvZiBmb3JlYWNoCgkJCQkJCXJldHVybiB0cnVlOwoJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gVGhlIHppcHBlciBlbmNvdW50ZXJlZCBhbiBlcnJvciBzbyB3ZSBuZWVkIHRvIGRyb3AgdGhyb3VnaCBhbmQgbG9vcCByb3VuZCB0byB0cnkgYW5vdGhlcgoJCQkJCQkvLyBXZSdsbCBub3QgcHJvY2VzcyB0aGUgcmVzdWx0IGhlcmUsIGp1c3QgZHJvcCB0aHJvdWdoIHNpbGVudGx5ICh0aGUgbWV0aG9kIHdpbGwgaGF2ZSBsb2dnZWQgaXQpCQkJCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIGNvdWxkbid0IHNldCBhIGNvbW1lbnQgYXQgYWxsIC0gZWl0aGVyIG5vIGF2YWlsYWJsZSBtZXRob2Qgb3IgYWxsIG1ldGhvZCBmYWlsZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIHNldCBjb21tZW50IGluIGZpbGUgJTEkczogTm8gY29tcGF0aWJsZSB6aXAgbWV0aG9kIGZvdW5kIG9yIGFsbCBtZXRob2RzIGZhaWxlZCAtIG5vdGUgc3RvcmVkIGludGVybmFsbHkgb25seS4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoKCQkJLy8gUmV0dXJuIG1lc3NhZ2UgZm9yIGRpc3BsYXkgLSBtYXliZSBzaG91bGQgcmV0dXJuIGZhbHNlIGFuZCBoYXZlIGNhbGxlciBkaXNwbGF5IGl0J3Mgb3duIG1lc3NhZ2U/CgkJCSRtZXNzYWdlID0gIlxuXG5VbmFibGUgdG8gc2V0IG5vdGUgaW4gZmlsZS5cblRoZSBub3RlIHdpbGwgb25seSBiZSBzdG9yZWQgaW50ZXJuYWxseSBpbiB5b3VyIHNldHRpbmdzIGFuZCBub3QgaW4gdGhlIHppcCBmaWxlIGl0c2VsZi4iOwoJCQlyZXR1cm4gJG1lc3NhZ2U7CgkJCQoJCX0KCQkKCQkvKglnZXRfY29tbWVudCgpCgkJICoJCgkJICoJUmV0cmlldmUgYXJjaGl2ZSBjb21tZW50LgoJCSAqCQoJCSAqCUBwYXJhbQkJc3RyaW5nCQkJCSR6aXBfZmlsZQkJRmlsZW5hbWUgb2YgYXJjaGl2ZSB0byByZXRyaWV2ZSBjb21tZW50IGZyb20uCgkJICoJQHBhcmFtCQlib29sCQkJCSRyYXdfY29tbWVudAlJZiB0cnVlIHRoZW4gcmF3IGNvbW1lbnQgZmllbGQgZGF0YSByZXR1cm5lZCB3aXRob3V0IHByb2Nlc3NpbmcgZGVsaW1pbmF0b3JzIG5vciBqc29uLiBEZWZhdWx0cyBmYWxzZS4KCQkgKglAcmV0dXJuCQlib29sfHN0cmluZ3xhcnJheQkJCQkJZmFsc2Ugb24gZmFpbHVyZSwgWmlwIGNvbW1lbnQgb3RoZXJ3aXNlLiBJZiBjb21tZW50IGlzIGpzb24gZW5jb2RlZCBhcnJheSByZXR1cm5zIGFycmF5LgoJCSAqLwoJCXB1YmxpYyBmdW5jdGlvbiBnZXRfY29tbWVudCggJHppcF9maWxlLCAkcmF3X2NvbW1lbnQgPSBmYWxzZSApIHsKCQkJCgkJCSR6aXBfbWV0aG9kcyA9IGFycmF5KCk7CgkJCQkJCQoJCQkkemlwX21ldGhvZHMgPSAkdGhpcy0+X3ppcF9tZXRob2RzOwoJCQkKCQkJLy8gQmV0dGVyIG1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWUgYXZhaWxhYmxlIG1ldGhvZHMKCQkJaWYgKCBlbXB0eSggJHppcF9tZXRob2RzICkgKSB7CgkJCQkKCQkJCS8vIEhtbSwgd2UgZG9uJ3Qgc2VlbSB0byBoYXZlIGFueSBhdmFpbGFibGUgbWV0aG9kcywgb29wcywgYmVzdCBnbyBubyBmdXJ0aGVyCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGYWlsZWQgdG8gZ2V0IGNvbW1lbnQgZnJvbSBiYWNrdXAgZmlsZSAtIG5vIGF2YWlsYWJsZSBtZXRob2RzLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCgkJCX0KCQkJCgkJCS8vIEl0ZXJhdGUgb3ZlciB0aGUgbWV0aG9kcyAtIG9uY2Ugd2Ugc3VjY2VlZCBqdXN0IHJldHVybiBkaXJlY3RseSBvdGhlcndpc2UgZHJvcCB0aHJvdWdoCgkJCWZvcmVhY2ggKCAkemlwX21ldGhvZHMgYXMgJG1ldGhvZF90YWcgKSB7CgkJCQoJCQkJLy8gRmlyc3QgbWFrZSBzdXJlIHdlIGNhbiBtYW5hZ2UgY29tbWVudHMgd2l0aCB0aGlzIG1ldGhvZCAoaWdub3JlIHNpbGVudGx5IGlmIG5vdCkKCQkJCWlmICggJHRoaXMtPl96aXBfbWV0aG9kc19kZXRhaWxzWyAkbWV0aG9kX3RhZyBdWyAnYXR0cicgXVsgJ2lzX2NvbW1lbnRlcicgXSA9PT0gdHJ1ZSApIHsKCQkJCQkKCQkJCQkkY2xhc3NfbmFtZSA9ICdwbHVnaW5idWRkeV96YnppcCcgLiAkbWV0aG9kX3RhZzsKCQkJCQkKCQkJCQkkemlwcGVyID0gbmV3ICRjbGFzc19uYW1lKCAkdGhpcyApOwoJCQkJCQoJCQkJCS8vIFdlIG5lZWQgdG8gdGVsbCB0aGUgbWV0aG9kIHdoYXQgZGV0YWlscyBiZWxvbmcgdG8gaXQKCQkJCQkkemlwcGVyLT5zZXRfbWV0aG9kX2RldGFpbHMoICR0aGlzLT5femlwX21ldGhvZHNfZGV0YWlsc1sgJG1ldGhvZF90YWcgXSApOwoJCQkJCQkJCQkJCgkJCQkJLy8gTm93IHdlIGFyZSByZWFkeSB0byB0cnkgYW5kIHRlc3QgZm9yIHRoZSBmaWxlIGV4aXN0ZW5jZQoJCQkJCSRyZXN1bHQgPSAkemlwcGVyLT5nZXRfY29tbWVudCggJHppcF9maWxlICk7CgkJCQkJCgkJCQkJLy8gV2lsbCBiZSBmYWxzZSBpZiB3ZSBjb3VsZG4ndCBzZXQgdGhlIGNvbW1lbnQKCQkJCQlpZiAoIGlzX3N0cmluZyAoICRyZXN1bHQgKSApIHsKCQkJCQkKCQkJCQkJLy8gRm9ybWF0IGhhcyBjaGFuZ2VkIGFuZCBubyBsb25nZXIgZW5jb2RpbmcgYXMgaHRtbGVtdGl0aWVzIHdoZW4gc2V0dGluZyBjb21tZW50CgkJCQkJCS8vIEZvciBvbGRlciBiYWNrdXBzIG1heSBuZWVkIHRvIHJlbW92ZSBlbmNvZGluZyAtIGFjdGlvbiBfc2hvdWxkXyBiZSBudWxsIGlmIE4vQQoJCQkJCQkvLyBPbmx5IHNwYW5uZXIgd291bGQgYmUgaWYgc29tZW9uZSBoYWQgcHV0IGFuIGVudGl0eSBpbiB0aGVpciBjb21tZW50IGJ1dCB0aGF0IGlzCgkJCQkJCS8vIHJlYWxseSBhbiBvdXRzaWRlciBhbmQgaW4gYW55IGNhc2UgdGhlIGNvcnJlY3Rpb24gaXMgc2ltcGx5IHRvIGVkaXQgYW5kIHJlc2F2ZQoJCQkJCQkvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIG5ldyBmb3JtYXQgaGFzIGJlZW4gaW4gdXNlIGZvciBzb21lIHRpbWUKCQkJCQkJJHJlc3VsdCA9IGh0bWxfZW50aXR5X2RlY29kZSggJHJlc3VsdCApOwoJCQkJCQoJCQkJCQkvLyBNdXN0IGFzc3VtZSB0aGF0IGNvbW1lbnQgd2FzIHJldHJpZXZlZCBvawoJCQkJCQl1bnNldCggJHppcHBlciApOwoJCQkJCQkKCQkJCQkJLy8gUmV0dXJuIHJhdyBjb21tZW50IGFzLWlzIHdpdGggbm8gcHJvY2Vzc2luZyBpZiBzcGVjaWZpZWQuCgkJCQkJCWlmICggdHJ1ZSA9PT0gJHJhd19jb21tZW50ICkgewoJCQkJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQkJCX0KCQkJCQkJCgkJCQkJCS8vIEhhbmRsZSBkZWxpbWluYXRpb24uIERlY29kZSAkcmVzdWx0IGlmIGpzb24gZGVjb2RlZCAoYXNzb2NpYXRpdmUgYXJyYXkgbW9kZSkuCgkJCQkJCSRzdGFydF9kZWxpbWluYXRvciA9IHN0cnBvcyggJHJlc3VsdCwgJ01ldGFEYXRhOicgKTsKCQkJCQkJJGVuZF9kZWxpbWluYXRvciA9IHN0cnBvcyggJHJlc3VsdCwgJ01ldGFEYXRhLUVuZDonICk7CgkJCQkJCWlmICggKCBmYWxzZSAhPT0gJHN0YXJ0X2RlbGltaW5hdG9yICkgJiYgKCBmYWxzZSAhPT0gJGVuZF9kZWxpbWluYXRvciApICkgeyAvLyBGb3VuZCBib3RoIGRlbGltaW5hdG9ycy4KCQkJCQkJCSRyZXN1bHQgPSBzdWJzdHIoICRyZXN1bHQsICRzdGFydF9kZWxpbWluYXRvcis5LCAkZW5kX2RlbGltaW5hdG9yLTkgKTsKCQkJCQkJCWlmICggTlVMTCA9PT0gKCAkZGVjb2RlZF9yZXN1bHQgPSBqc29uX2RlY29kZSggJHJlc3VsdCwgdHJ1ZSApICkgKSB7IC8vIEpzb24gZGVjb2RlIGZhaWxlZCBzbyByZXR1cm4gc3RyaW5nLgoJCQkJCQkJCXJldHVybiAkcmVzdWx0OwoJCQkJCQkJfSBlbHNlIHsgLy8gSnNvbiBkZWNvZGUgc3VjY2VzcyBzbyByZXR1cm5pbmcgdmFyaWFibGUgKHNob3VsZCBiZSBhbiBhcnJheSBtb3N0IGxpa2VseSkuCgkJCQkJCQkJcmV0dXJuICRkZWNvZGVkX3Jlc3VsdDsKCQkJCQkJCX0KCQkJCQkJCQoJCQkJCQl9CgkJCQkJCQoJCQkJCQkvLyBObyBkZWxpbWluYXRvcnMgZm91bmQgaWYgbWFkZSBpdCB0byB0aGlzIHBvaW50IHNvIGFzc3VtaW5nIHBsYWluIHRleHQgbGVnYWN5IGNvbW1lbnQgKG9yIGRlbGltaW5hdG9ycyBtaXNzaW5nL2NvcnJ1cHQpLgoJCQkJCQkKCQkJCQkJLy8gV2UgaGF2ZSB0byByZXR1cm4gaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBicmVhayBvdXQgb2YgZm9yZWFjaAoJCQkJCQlyZXR1cm4gJHJlc3VsdDsKCQkJCQkJCgkJCQkJfSBlbHNlIHsKCQkJCQkKCQkJCQkJLy8gVGhlIHppcHBlciBlbmNvdW50ZXJlZCBhbiBlcnJvciBzbyB3ZSBuZWVkIHRvIGRyb3AgdGhyb3VnaCBhbmQgbG9vcCByb3VuZCB0byB0cnkgYW5vdGhlcgoJCQkJCQkvLyBXZSdsbCBub3QgcHJvY2VzcyB0aGUgcmVzdWx0IGhlcmUsIGp1c3QgZHJvcCB0aHJvdWdoIHNpbGVudGx5ICh0aGUgbWV0aG9kIHdpbGwgaGF2ZSBsb2dnZWQgaXQpCQkJCgkJCQkJCXVuc2V0KCAkemlwcGVyICk7CgkJCQkJCQoJCQkJCX0KCQkJCQoJCQkJfQoJCQkJCgkJCX0KCQkJCgkJCS8vIElmIHdlIGdvdCB0aGlzIGZhciB0aGVuIGNvdWxkbid0IGdldCBhIGNvbW1lbnQgYXQgYWxsIC0gZWl0aGVyIG5vIGF2YWlsYWJsZSBtZXRob2Qgb3IgYWxsIG1ldGhvZCBmYWlsZWQKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXygnVW5hYmxlIHRvIGdldCBjb21tZW50IGluIGZpbGUgJTEkczogTm8gY29tcGF0aWJsZSB6aXAgbWV0aG9kIGZvdW5kIG9yIGFsbCBtZXRob2RzIGZhaWxlZC4nLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkemlwX2ZpbGUgKSApOwoKCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQl9CgkJCQkKCQkvLyBGT1IgRlVUVVJFIFVTRTsgTk9UIFlFVCBJTVBMRU1FTlRFRC4gVXNlIHRvIGNoZWNrIC5zcWwgZmlsZSBpcyBub24tZW1wdHkuCgkJZnVuY3Rpb24gZmlsZV9zdGF0cyggJHppcF9maWxlLCAkbG9jYXRlX2ZpbGUsICRsZWF2ZV9vcGVuID0gZmFsc2UgKSB7CgkJCWlmICggaW5fYXJyYXkoICd6aXBhcmNoaXZlJywgJHRoaXMtPl96aXBfbWV0aG9kcyApICkgewoJCQkJJHRoaXMtPl96aXAgPSBuZXcgWmlwQXJjaGl2ZTsKCQkJCWlmICggJHRoaXMtPl96aXAtPm9wZW4oICR6aXBfZmlsZSApID09PSB0cnVlICkgewoJCQkJCWlmICggKCAkc3RhdHMgPSAkdGhpcy0+X3ppcC0+c3RhdE5hbWUoICRsb2NhdGVfZmlsZSApICkgPT09IGZhbHNlICkgeyAvLyBGaWxlIG5vdCBmb3VuZCBpbiB6aXAuCgkJCQkJCSR0aGlzLT5femlwLT5jbG9zZSgpOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCdGaWxlIG5vdCBmb3VuZCAoemlwYXJjaGl2ZSkgZm9yIHN0YXRzJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc6ICcgLiAkbG9jYXRlX2ZpbGUgKTsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQkkdGhpcy0+X3ppcC0+Y2xvc2UoKTsKCQkJCQlyZXR1cm4gJHN0YXRzOwoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCdaaXBBcmNoaXZlIGZhaWxlZCB0byBvcGVuIGZpbGUgdG8gY2hlY2sgc3RhdHMgKGxvb2tpbmcgaW4gJTEkcykuJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJHppcF9maWxlICkgKTsKCQkJCQkKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQkJCgkJCS8vIElmIHdlIG1hZGUgaXQgdGhpcyBmYXIgdGhlbiB6aXBhcmNoaXZlIG5vdCBhdmFpbGFibGUvZmFpbGVkLgoJCQlpZiAoIGluX2FycmF5KCAncGNsemlwJywgJHRoaXMtPl96aXBfbWV0aG9kcyApICkgewoJCQkJcmVxdWlyZV9vbmNlKCBBQlNQQVRIIC4gJ3dwLWFkbWluL2luY2x1ZGVzL2NsYXNzLXBjbHppcC5waHAnICk7CgkJCQkkdGhpcy0+X3ppcCA9IG5ldyBQY2xaaXAoICR6aXBfZmlsZSApOwoJCQkJaWYgKCAoICRmaWxlX2xpc3QgPSAkdGhpcy0+X3ppcC0+bGlzdENvbnRlbnQoKSApID09IDAgKSB7IC8vIElmIHplcm8sIHppcCBpcyBjb3JydXB0IG9yIGVtcHR5LgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJHRoaXMtPl96aXAtPmVycm9ySW5mbyggdHJ1ZSApICk7CgkJCQl9IGVsc2UgewoJCQkJCWZvcmVhY2goICRmaWxlX2xpc3QgYXMgJGZpbGUgKSB7CgkJCQkJCWlmICggJGZpbGVbJ2ZpbGVuYW1lJ10gPT0gJGxvY2F0ZV9maWxlICkgeyAvLyBGb3VuZCBmaWxlLgoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCX0KCQkJCQl9CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRmlsZSBub3QgZm91bmQgKHBjbHppcCknLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuICRsb2NhdGVfZmlsZSApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ1VuYWJsZSB0byBjaGVjayBpZiBmaWxlIGV4aXN0czogTm8gY29tcGF0aWJsZSB6aXAgbWV0aG9kIGZvdW5kLicsJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQkJCgl9IC8vIEVuZCBjbGFzcwoJCgkvLyRwbHVnaW5idWRkeV96aXBidWRkeSA9IG5ldyBwbHVnaW5idWRkeV96aXBidWRkeSggJHRoaXMtPl9vcHRpb25zWydiYWNrdXBfZGlyZWN0b3J5J10gKTsKCn0K
###PACKDATA,FILE_END,/lib/zipbuddy/zipbuddy.php,importbuddy/lib/zipbuddy/zipbuddy.php
###PACKDATA,FILE_START,/lib/mysqlbuddy/index.php,importbuddy/lib/mysqlbuddy/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/lib/mysqlbuddy/index.php,importbuddy/lib/mysqlbuddy/index.php
###PACKDATA,FILE_START,/lib/mysqlbuddy/mysqlbuddy.php,importbuddy/lib/mysqlbuddy/mysqlbuddy.php
PD9waHAKLyoJcGJfYmFja3VwYnVkZHlfbXlzcWxidWRkeSBjbGFzcwogKgkKICoJQHNpbmNlIDMuMC4wCiAqCiAqCUhlbHBzIGJhY2t1cCBhbmQgcmVzdG9yZSBkYXRhYmFzZSB0YWJsZXMuCiAqCUR1bXBzIGEgbXlzcWwgZGF0YWJhc2UgKGFsbCB0YWJsZXMsIHRhYmxlcyB3aXRoIGEgY2VydGFpbiBwcmVmaXgsIG9yIG5vbmUpIHdpdGggYWRkaXRpb25hbCBpbmNsdXNpb25zL2V4Y2x1c2lvbnMgb2YgdGFibGVzIHBvc3NpYmxlLgogKglBdXRvbWF0aWNhbGx5IGRldGVybWluZXMgYXZhaWxhYmxlIGR1bXAgbWV0aG9kcyAodW5sZXNzIG1ldGhvZCBpcyBmb3JjZWQpLiBSdW5zIG1ldGhvZHMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gRmFsbHMgYmFjayBhdXRvbWF0aWNhbGx5CiAqCXRvIGFueSBgbGVzc2VyYCBtZXRob2RzIGlmIGFueSBmYWlsLgogKgogKglSZXF1aXJlbWVudHM6CiAqCiAqCQlFeHBlY3RzIG15c3FsIHRvIGFscmVhZHkgYmUgc2V0IHVwIGFuZCBjb25uZWN0ZWQuCiAqCiAqCUdlbmVyYWwgcHJvY2VzcyBvcmRlcjoKICoKICoJCUNvbnN0cnVjdGlvbjogX19jb25zdHJ1Y3QoKSAtPiBbYXZhaWxhYmxlX3ppcF9tZXRob2RzKCldCiAqCQlEdW1wOiBkdW1wKCkgLT4gX2NhbGN1bGF0ZV90YWJsZXMoKSAtPiBbX215c3FsIGFuZC9vciBfcGhwXQogKgogKgkJTWV0aG9kIHByb2Nlc3M6CiAqCQkJX215c3FsIG1ldGhvZCAoRkFTVCk6CiAqCQkJCUJ1aWxkcyB0aGUgY29tbWFuZCBsaW5lIC0+IHJ1bnMgY29tbWFuZCB2aWEgZXhlYygpIC0+IGNoZWNrcyBleGl0IGNvZGUgLT4gdmVyaWZpZXMgLnNxbCBmaWxlIHdhcyBjcmVhdGVkOyBmYWxscyB0byBuZXh0IG1ldGhvZCBpZiBleGl0IGNvZGUgaXMgYmFkIG9yIC5zcWwgZmlsZSBpcyBtaXNzaW5nLgogKgkJCV9waHAgbWV0aG9kIChTTE9XOyBjb21wYXRpYmlsaXR5IG1vZGU7IG9ubHkgbW9kZSBwcmUtMy4wKToKICoJCQkJSXRlcmF0ZXMgdGhyb3VnaCBhbGwgdGFibGVzIGlzc3VpbmcgU1FMIGNvbW1hbmRzIHRvIHNlcnZlciB0byBnZXQgY3JlYXRlIHN0YXRlbWVudHMgYW5kIGFsbCBkYXRhYmFzZSBjb250ZW50LiBWZXJ5IGJydXRlIGZvcmNlIG1ldGhvZC4KICoKICoJQGF1dGhvciBEdXN0aW4gQm9sdG9uIDwgaHR0cDovL2R1c3RpbmJvbHRvbi5jb20gPgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfbXlzcWxidWRkeSB7CgkKCQoJY29uc3QgQ09NTUFORF9MSU5FX0xFTkdUSF9DSEVDS19USFJFU0hPTEQgPSAyNTA7CQkJCQkJCQkJCQkJCS8vIElmIGNvbW1hbmQgbGluZSBpcyBsb25nZXIgdGhhbiB0aGlzIHRoZW4gd2Ugd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIG1heCBjb21tYW5kIGxpbmUgbGVuZ3RoLgoJY29uc3QgVElNRV9XSUdHTEVfUk9PTSA9IDM7CQkJCQkJCQkJCQkJCQkJCQkJCS8vIE51bWJlciBvZiBzZWNvbmRzIHRvIGZ1ZGdlIHVwIHRoZSB0aW1lIGVsYXBzZWQgdG8gZ2l2ZSBhIGxpdHRsZSB3aWdnbGUgcm9vbSBzbyB3ZSBkb24ndCBhY2NpZGVudGx5IGhpdCB0aGUgZWRnZSBhbmQgdGltZSBvdXQuCgljb25zdCBIRUFSVEJFQVRfQ09VTlRfTElNSVQgPSAyMDAwOwkJCQkJCQkJCQkJCQkJCQkJLy8gTnVtYmVyIG9mIHJvd3MvcXVlcmllcyB0byBoZWFydGJlYXQgYWZ0ZXIsIGxvZ2dpbmcgbnVtYmVyIG9mIHJvd3MgaGFuZGxlZC4KCQoJLyoqKioqKioqKiogUHJvcGVydGllcyAqKioqKioqKioqLwoJCgkKCXByaXZhdGUgJF92ZXJzaW9uID0gJzAuMC4xJzsJCQkJCQkJCQkJCQkJCQkJCQkvLyBJbnRlcm5hbCB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyBsaWJyYXJ5LgoJCglwcml2YXRlICRfZGF0YWJhc2VfaG9zdCA9ICcnOwkJCQkJCQkJCQkJCQkJCQkJCS8vIERhdGFiYXNlIGhvc3Qvc2VydmVyLiBAc2VlIF9fY29uc3RydWN0KCkuCglwcml2YXRlICRfZGF0YWJhc2Vfc29ja2V0ID0gJyc7CQkJCQkJCQkJCQkJCQkJCQkJLy8gSWYgdXNpbmcgc29ja2V0cywgcG9pbnRzIHRvIHNvY2tldCBmaWxlLiBMZWZ0IGJsYW5rIGlmIHNvY2tldHMgbm90IGluIHVzZS4gQHNlZSBfX2NvbnN0cnVjdCgpLgoJcHJpdmF0ZSAkX2RhdGFiYXNlX25hbWUgPSAnJzsJCQkJCQkJCQkJCQkJCQkJCQkvLyBEYXRhYmFzZSBuYW1lLiBAc2VlIF9fY29uc3RydWN0KCkuCglwcml2YXRlICRfZGF0YWJhc2VfdXNlciA9ICcnOwkJCQkJCQkJCQkJCQkJCQkJCS8vIERhdGFiYXNlIHVzZXJuYW1lLiBAc2VlIF9fY29uc3RydWN0KCkuCglwcml2YXRlICRfZGF0YWJhc2VfcGFzcyA9ICcnOwkJCQkJCQkJCQkJCQkJCQkJCS8vIERhdGFiYXNlIHBhc3N3b3JkLiBAc2VlIF9fY29uc3RydWN0KCkuCglwcml2YXRlICRfZGF0YWJhc2VfcHJlZml4ID0gJyc7CQkJCQkJCQkJCQkJCQkJCQkJLy8gRGF0YWJhc2UgdGFibGUgcHJlZml4IHRvIGJhY2t1cCB3aGVuIGluIHByZWZpeCBtb2RlLiBAc2VlIF9fY29uc3RydWN0KCkuCgkKCXByaXZhdGUgJF9iYXNlX2R1bXBfbW9kZSA9ICcnOwkJCQkJCQkJCQkJCQkJCQkJCS8vIERldGVybWluZXMgYmFzZSB0YWJsZXMgdG8gaW5jbHVkZSBpbiBiYWNrdXAuIEV4OiBub25lLCBhbGwsIG9yIGJ5IHByZWZpeC4gQHNlZSBfX2NvbnN0cnVjdCgpLgoJcHJpdmF0ZSAkX2FkZGl0aW9uYWxfaW5jbHVkZXMgPSBhcnJheSgpOwkJCQkJCQkJCQkJCQkJCS8vIEFkZGl0aW9uYWwgdGFibGVzIHRvIGJhY2t1cCBpbiBhZGRpdGlvbiB0byB0aG9zZSBkZXRlcm1pbmVkIGJ5IGJhc2UgbW9kZS4KCXByaXZhdGUgJF9hZGRpdGlvbmFsX2V4Y2x1ZGVzID0gYXJyYXkoKTsJCQkJCQkJCQkJCQkJCQkvLyBUYWJsZXMgdG8gZXhjbHVkZSBmcm9tICggJF9hZGRpdGlvbmFsX2luY2x1ZGVzICsgdGhvc2UgZGV0ZXJtaW5lZCBieSBiYXNlIG1vZGUgKS4KCXByaXZhdGUgJF9tZXRob2RzID0gYXJyYXkoKTsJCQkJCQkJCQkJCQkJCQkJCQkvLyBBdmFpbGFibGUgbWVjaGFuaXNtcyBmb3IgZHVtcGluZyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgoJcHJpdmF0ZSAkX215c3FsX2RpcmVjdG9yaWVzID0gYXJyYXkoKTsJCQkJCQkJCQkJCQkJCQkJLy8gUG9wdWxhdGVkIGJ5IF9jYWxjdWxhdGVfbXlzcWxfZGlyZWN0b3J5KCkuCglwcml2YXRlICRfZGVmYXVsdF9teXNxbF9kaXJlY3RvcmllcyA9IGFycmF5KCAnL3Vzci9iaW4vJywgJy91c3IvYmluL215c3FsLycsICcvdXNyL2xvY2FsL2Jpbi8nICk7CS8vIElmIG15c3FsIHRlbGxzIHVzIHdoZXJlIGl0cyBpbnN0YWxsZWQgd2UgcHJlcGVuZCB0byB0aGlzLiBCZWdpbm5pbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMuCglwcml2YXRlICRfbXlzcWxfZGlyZWN0b3J5ID0gJyc7CQkJCQkJCQkJCQkJCQkJCQkJLy8gVGVzdGVkIHdvcmtpbmcgbXlzcWwgZGlyZWN0b3J5IHRvIHVzZSBmb3IgYWN0dWFsIGR1bXAuCglwcml2YXRlICRfY29tbWFuZGJ1ZGR5OwoJCglwcml2YXRlICRfbWF4RXhlY3V0aW9uVGltZSA9ICcnOwoJcHJpdmF0ZSAkX21heF9yb3dzX3Blcl9zZWxlY3QgPSAxMDAwOwoJcHJpdmF0ZSAkXzkwMTBzX2VuY291bnRlcmVkID0gMDsKCXByaXZhdGUgJF9tYXhfOTAxMHNfYWxsb3dlZCA9IDk7IC8vIEFmdGVyIHRoaXMgcG9pbnQgYW4gZXJyb3Igd2lsbCBiZSBzaG93biBpbmRpY2F0aW5nIHN1YnNlcXVlbnQgZXJyb3JzIHdpbGwgYmUgaGlkZGVuLiBBbGwgOTAxMCBsb2cgdG86IEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvbXlzcWxfOTAxMF9sb2ctJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnCgkKCXByaXZhdGUgJF9mb3JjZV9zaW5nbGVfZGJfZmlsZSA9IGZhbHNlOyAvLyBXaGVuIGVuYWJsZWQsIEJhY2t1cEJ1ZGR5IHdpbGwgZHVtcCBpbmRpdmlkdWFsIHRhYmxlcyB0byB0aGVpciBvd24gZGF0YWJhc2UgZmlsZSAoZWcgd3Bfb3B0aW9ucy5zcWwsIHdwX3Bvc3RzLnNxbCwgZXRjKSB3aGVuIHBvc3NpYmxlIGJhc2VkIG9uIG90aGVyIGNyaXRlcmlhIHN1Y2ggYXMgdGhlIGR1bXAgbWV0aG9kIGFuZCB3aGV0aGVyIGJyZWFraW5nIG91dCBiaWcgdGFibGVzIGlzIGVuYWJsZWQuCgkKCS8qKioqKioqKioqIE1ldGhvZHMgKioqKioqKioqKi8KCQoJCgkvKglfX2NvbnN0cnVjdCgpCgkgKgkKCSAqCURlZmF1bHQgcm93cyBwZXIgc2VsZWN0IGlzIGRldGVybWluZWQgYnkgZGVmYXVsdCBwcml2YXRlIHZhciBhYm92ZSBpZiBub25lIHBhc3NlZC4gT3ZlcnJpZGVuIGJ5IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncGhwbXlzcWxkdW1wX21heHJvd3MnXSBpZiBub3QgYmxhbmsgYW5kIGlzIG51bWVyaWMgYW5kIG92ZXJyaWRlbiBieSBwYXNzZWQgcGFyYW1ldGVyIGlmIGRlZmluZWQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkZGF0YWJhc2VfaG9zdAkJCUhvc3QgLyBzZXJ2ZXIgb2YgZGF0YWJhc2UgdG8gcHVsbCBmcm9tLiBNYXkgYmUgaW4gdGhlIGZvcm1hdDogYGxvY2FsaG9zdGAgZm9yIG5vcm1hbDsgYGxvY2FsaG9zdDovcGF0aC90by9teXNxbC5zb2NrYCBmb3Igc29ja2V0cy4gSWYgc29ja2V0cyB0aGVuIHBhcmFzZWQgYW5kIGludGVybmFsIGNsYXNzIHZhcmlhYmxlcyBzZXQgYXBwcm9wcmlhdGVseS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkZGF0YWJhc2VfbmFtZQkJCU5hbWUgb2YgZGF0YWJhc2UgdG8gcHVsbCBmcm9tLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRkYXRhYmFzZV91c2VyCQkJVXNlciBvZiBkYXRhYmFzZSB0byBwdWxsIGZyb20uCgkgKglAcGFyYW0JCXN0cmluZwkJJGRhdGFiYXNlX3Bhc3MJCQlQYXNzIG9mIGRhdGFiYXNlIHRvIHB1bGwgZnJvbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkZGF0YWJhc2VfcHJlZml4CQlQcmVmaXggb2YgdGFibGVzIGluIGRhdGFiYXNlIHRvIHB1bGwgZnJvbSAvIGluc2VydCBpbnRvIChvbmx5IHVzZWQgaWYgYmFzZSBtb2RlIGlzIGBwcmVmaXhgKS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRmb3JjZV9tZXRob2RzCQkJT3B0aW9uYWwuIE92ZXJyaWRlIGF1dG9tYXRpYyBtZXRob2QgZGV0ZWN0aW9uLiBTa2lwcyB0ZXN0IGFuZCBydW5zIGZpcnN0IG1ldGhvZCBmaXJzdC4gIEZhbGxzIGJhY2sgdG8gb3RoZXIgbWV0aG9kcyBpZiBhbnkgZmFpbHVyZS4gUG9zc2libGUgbWV0aG9kczogIGNvbW1hbmRsaW5lLCBwaHAKCSAqCUBwYXJhbQkJaW50CQkJJG1heEV4ZWN1dGlvbgkJCU9wdGlvbmFsLiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIHRvIHJ1biBmb3IgYmVmb3JlIHN0b3BwaW5nIHRvIGFsbG93IGZvciBjb250aW51aW5nIHRoZSBuZXh0IGltcG9ydCBwaWNraW5nIHVwIHdoZXJlIHdlIGxlZnQgb2ZmLgoJICoJQHBhcmFtCQlpbnQJCQkkbWF4X3Jvd3NfcGVyX3NlbGVjdAlPcHRpb25hbC4gRm9yIFBIUC1iYXNlZCBteXNxbCBkdW1wLCBtYXggbnVtYmVyIG9mIHJvd3MgcGVyIHNlbGVjdCB0byBncmFiLgoJICoJQHJldHVybgkJCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGRhdGFiYXNlX2hvc3QsICRkYXRhYmFzZV9uYW1lLCAkZGF0YWJhc2VfdXNlciwgJGRhdGFiYXNlX3Bhc3MsICRkYXRhYmFzZV9wcmVmaXgsICRmb3JjZV9tZXRob2RzID0gYXJyYXkoKSwgJG1heEV4ZWN1dGlvbiA9ICcnLCAkbWF4X3Jvd3NfcGVyX3NlbGVjdCA9ICcnICkgewoJCQoJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncGhwbXlzcWxkdW1wX21heHJvd3MnXSApICYmICggJycgIT0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwaHBteXNxbGR1bXBfbWF4cm93cyddICkgJiYgKCBpc19udW1lcmljKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3BocG15c3FsZHVtcF9tYXhyb3dzJ10gKSApICkgewoJCQkkdGhpcy0+X21heF9yb3dzX3Blcl9zZWxlY3QgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3BocG15c3FsZHVtcF9tYXhyb3dzJ107CgkJfQoJCWlmICggKCAnJyAhPSAkbWF4X3Jvd3NfcGVyX3NlbGVjdCApICYmICggaXNfbnVtZXJpYyggJG1heF9yb3dzX3Blcl9zZWxlY3QgKSApICkgewoJCQkkdGhpcy0+X21heF9yb3dzX3Blcl9zZWxlY3QgPSAkbWF4X3Jvd3NfcGVyX3NlbGVjdDsKCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29tcGF0aWJpbGl0eSBteXNxbGR1bXAgKGlmIGFwcGxpY2FibGUpIG1heCByb3dzIHBlciBzZWxlY3Qgc2V0IHRvICcgLiAkdGhpcy0+X21heF9yb3dzX3Blcl9zZWxlY3QgLiAnLicgKTsKCQkKCQkvLyBIYW5kbGVzIGNvbW1hbmQgbGluZSBleGVjdXRpb24uCgkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL2NvbW1hbmRidWRkeS9jb21tYW5kYnVkZHkucGhwJyApOwoJCSR0aGlzLT5fY29tbWFuZGJ1ZGR5ID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X2NvbW1hbmRidWRkeSgpOwoJCQoJCS8vIENoZWNrIGZvciB1c2Ugb2Ygc29ja2V0cyBpbiBob3N0LiBIYW5kbGUgaWYgdXNpbmcgc29ja2V0cy4KCQkvLyRkYXRhYmFzZV9ob3N0ID0gJ2xvY2FsaG9zdDovQXBwbGljYXRpb25zL1hBTVBQL3hhbXBwZmlsZXMvdmFyL215c3FsL215c3FsLnNvY2snOwoJCWlmICggc3RycG9zKCAkZGF0YWJhc2VfaG9zdCwgJzonICkgPT09IGZhbHNlICkgeyAvLyBOb3JtYWwgaG9zdC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRGF0YWJhc2UgaG9zdCBmb3IgZHVtcGluZzogYCcgLiAkZGF0YWJhc2VfaG9zdCAuICdgJyApOwoJCQkkdGhpcy0+X2RhdGFiYXNlX2hvc3QgPSAkZGF0YWJhc2VfaG9zdDsKCQl9IGVsc2UgeyAvLyBOb24tbm9ybWFsIGhvc3Qgc3BlY2lmaWNhdGlvbi4KCQkJJGhvc3Rfc3BsaXQgPSBleHBsb2RlKCAnOicsICRkYXRhYmFzZV9ob3N0ICk7CgkJCWlmICggIWlzX251bWVyaWMoICRob3N0X3NwbGl0WzFdICkgKSB7IC8vIFN0cmluZyBzbyBhc3N1bWUgYSBzb2NrZXQuCgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdEYXRhYmFzZSBob3N0IChzb2NrZXQpIGZvciBkdW1waW5nLiBIb3N0OiBgJyAuICRob3N0X3NwbGl0WzBdIC4gJ2A7IFNvY2tldDogYCcgLiAkaG9zdF9zcGxpdFsxXSAuICdgLicgKTsKCQkJCSR0aGlzLT5fZGF0YWJhc2VfaG9zdCA9ICRob3N0X3NwbGl0WzBdOwoJCQkJJHRoaXMtPl9kYXRhYmFzZV9zb2NrZXQgPSAkaG9zdF9zcGxpdFsxXTsKCQkJfSBlbHNlIHsgLy8gTnVtZXJpYywgdHJlYXQgYXMgcG9ydCBhbmQgbGVhdmUgYXMgb25lIHBpZWNlLgoJCQkJJHRoaXMtPl9kYXRhYmFzZV9ob3N0ID0gJGRhdGFiYXNlX2hvc3Q7CgkJCX0KCQl9CgkJdW5zZXQoICRob3N0X3NwbGl0ICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnTG9hZGluZyBteXNxbGJ1ZGR5IGxpYnJhcnkuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ015c3FsIHNlcnZlciBkZWZhdWx0IGRpcmVjdG9yaWVzOiBgJyAuIGltcGxvZGUoICcsJywgJHRoaXMtPl9kZWZhdWx0X215c3FsX2RpcmVjdG9yaWVzICkgLiAnYCcgKTsKCQkKCQkkdGhpcy0+X2RhdGFiYXNlX25hbWUgPSAkZGF0YWJhc2VfbmFtZTsKCQkkdGhpcy0+X2RhdGFiYXNlX3VzZXIgPSAkZGF0YWJhc2VfdXNlcjsKCQkkdGhpcy0+X2RhdGFiYXNlX3Bhc3MgPSAkZGF0YWJhc2VfcGFzczsKCQkkdGhpcy0+X2RhdGFiYXNlX3ByZWZpeCA9ICRkYXRhYmFzZV9wcmVmaXg7CgkJCgkJaWYgKCBpc19hcnJheSggJGZvcmNlX21ldGhvZHMgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogRm9yY2UgbWV0aG9kIG9mIGAnIC4gY291bnQoICRmb3JjZV9tZXRob2RzICkgLiAnYCBwYXNzZWQuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IEZvcmNlIG1ldGhvZCBub3QgYW4gYXJyYXkuJyApOwoJCX0KCQkKCQkvLyBTZXQgbWVjaGFuaXNtIGZvciBkdW1waW5nIC8gcmVzdG9yaW5nLgoJCWlmICggY291bnQoICRmb3JjZV9tZXRob2RzICkgPiAwICkgeyAvLyBNZWNoYW5pc20gZm9yY2VkLiBPdmVycmlkaW5nIGF1dG9tYXRpYyBjaGVjay4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnbXlzcWxidWRkeTogU2V0dGluZ3Mgb3ZlcnJpZGluZyBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIGF2YWlsYWJsZSBkYXRhYmFzZSBkdW1wIG1ldGhvZHMuIFVzaW5nIGZvcmNlZCBvdmVycmlkZSBtZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJGZvcmNlX21ldGhvZHMgKSAuICdgLicgKTsKCQkJaWYgKCBpbl9hcnJheSggJ2NvbW1hbmRsaW5lJywgJGZvcmNlX21ldGhvZHMgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZvcmNlZCBtZXRob2RzIGluY2x1ZGUgY29tbWFuZGxpbmUgc28gY2FsY3VsYXRpbmcgbXlzcWwgZGlyZWN0b3J5LicgKTsKCQkJCSR0aGlzLT5fbXlzcWxfZGlyZWN0b3JpZXMgPSAkdGhpcy0+X2NhbGN1bGF0ZV9teXNxbF9kaXIoKTsgLy8gVHJ5IHRvIGRldGVybWluZSBteXNxbCBsb2NhdGlvbiAvIHBvc3NpYmxlIGxvY2F0aW9ucy4KCQkJCSR0aGlzLT5fbWV0aG9kcyA9ICR0aGlzLT5hdmFpbGFibGVfZHVtcF9tZXRob2RzKCk7IC8vIFJ1biBhZnRlciBfY2FsY3VsYXRlX215c3FsX2RpcigpLgoJCQl9CgkJCSR0aGlzLT5fbWV0aG9kcyA9ICRmb3JjZV9tZXRob2RzOwoJCX0gZWxzZSB7IC8vIE5vIG1ldGhvZCBkZWZpbmVkOyBhdXRvLWRldGVjdCB0aGUgYmVzdC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnbXlzcWxidWRkeTogTWV0aG9kIG5vdCBmb3JjZWQuIEFib3V0IHRvIGRldGVjdCBkaXJlY3RvcnkgYW5kIGF2YWlsYWJsZSBtZXRob2RzLicgKTsKCQkJCgkJCSR0aGlzLT5fbXlzcWxfZGlyZWN0b3JpZXMgPSAkdGhpcy0+X2NhbGN1bGF0ZV9teXNxbF9kaXIoKTsgLy8gVHJ5IHRvIGRldGVybWluZSBteXNxbCBsb2NhdGlvbiAvIHBvc3NpYmxlIGxvY2F0aW9ucy4KCQkJJHRoaXMtPl9tZXRob2RzID0gJHRoaXMtPmF2YWlsYWJsZV9kdW1wX21ldGhvZHMoKTsgLy8gUnVuIGFmdGVyIF9jYWxjdWxhdGVfbXlzcWxfZGlyKCkuCgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ215c3FsYnVkZHk6IERldGVjdGVkIGRhdGFiYXNlIGR1bXAgbWV0aG9kczogYCcgLiBpbXBsb2RlKCAnLCcsICR0aGlzLT5fbWV0aG9kcyApIC4gJ2AuJyApOwoJCQoJCS8vIEZpZ3VyZSBvdXQgbWF4IGV4ZWN1dGlvbiB0aW1lIGFsbG93ZWQuCgkJaWYgKCAoICcnICE9ICRtYXhFeGVjdXRpb24gKSAmJiAoIGlzX251bWVyaWMoICRtYXhFeGVjdXRpb24gKSApICkgewoJCQkkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgPSAkbWF4RXhlY3V0aW9uOwoJCX0gZWxzZSB7IC8vIE5vdCBwYXNzZWQuIERlZHVjZS4KCQkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydtYXhfZXhlY3V0aW9uX3RpbWUnXSApICkgewoJCQkJJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydtYXhfZXhlY3V0aW9uX3RpbWUnXTsKCQkJfSBlbHNlIHsKCQkJCS8vIERldGVjdCBtYXggZXhlY3V0aW9uIHRpbWUuCgkJCQkkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgPSBiYWNrdXBidWRkeV9jb3JlOjpkZXRlY3RNYXhFeGVjdXRpb25UaW1lKCk7CgkJCX0KCQl9CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnSWYgYXBwbGljYWJsZSwgYnJlYWtpbmcgdXAgd2l0aCBtYXggZXhlY3V0aW9uIHRpbWUgYCcgLiAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgLiAnYCBzZWNvbmRzLicgKTsKCQkKCX0gLy8gRW5kIF9fY29uc3RydWN0KCkuCgkKCQoJCgkvKiBmb3JjZV9zaW5nbGVfZGJfZmlsZSgpCgkgKgoJICogV2hlbiBlbmFibGVkIGJ5IHBhc3NpbmcgdHJ1ZSwgQmFja3VwQnVkZHkgd2lsbCBkdW1wIGluZGl2aWR1YWwgdGFibGVzIHRvIHRoZWlyIG93biBkYXRhYmFzZSBmaWxlIChlZyB3cF9vcHRpb25zLnNxbCwgd3BfcG9zdHMuc3FsLCBldGMpIHdoZW4gcG9zc2libGUgYmFzZWQgb24gb3RoZXIgY3JpdGVyaWEgc3VjaCBhcyB0aGUgZHVtcCBtZXRob2QgYW5kIHdoZXRoZXIgYnJlYWtpbmcgb3V0IGJpZyB0YWJsZXMgaXMgZW5hYmxlZC4KCSAqCgkgKiBAcGFyYW0JYm9vbAkkZm9yY2UJCVdoZXRoZXIgb3Igbm90IHRvIGZvcmNlIHRvIHNpbmdsZSBmaWxlLiBEZWZhdWx0cyB0byBUUlVFIGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgoJICogQHJldHVybgludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBmb3JjZV9zaW5nbGVfZGJfZmlsZSggJGZvcmNlID0gdHJ1ZSApIHsKCQlpZiAoIHRydWUgPT09ICRmb3JjZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRm9yY2luZyBkYXRhYmFzZSBiYWNrdXBzIHRvIGdvIGludG8gYSBzaW5nbGUgZGJfMS5zcWwgZmlsZSBkZXNwaXRlIG90aGVyIHNldHRpbmdzLicgKTsKCQkJJHRoaXMtPl9mb3JjZV9zaW5nbGVfZGJfZmlsZSA9IHRydWU7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRW5hYmxpbmcgZGF0YWJhc2UgYmFja3VwcyB0byBnbyBpbnRvIGluZGl2aWR1YWwgdGFibGVuYW1lLnNxbCBmaWxlcyBhcyBwb3NzaWJsZS4nICk7CgkJCSR0aGlzLT5fZm9yY2Vfc2luZ2xlX2RiX2ZpbGUgPSBmYWxzZTsKCQl9CgkJcmV0dXJuOwoJfSAvLyBFbmQgZm9yY2Vfc2luZ2xlX2RiX2ZpbGUoKS4KCQoJCgkvKglhdmFpbGFibGVfZHVtcF9tZXRob2RzKCkKCSAqCQoJICoJZnVuY3Rpb24gZGVzY3JpcHRpb24KCSAqCQoJICoJQHBhcmFtCQkKCSAqCUByZXR1cm4JCXN0cmluZwkJCQlQb3NzaWJsZSByZXR1cm5zOiAgbXlzcWxkdW1wLCBwaHAKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZV9kdW1wX21ldGhvZHMoKSB7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxkdW1wIHRlc3Q6IFRlc3RpbmcgYXZhaWxhYmxlIG15c3FsIGRhdGFiYXNlIGR1bXAgbWV0aG9kcy4nICk7CgkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdleGVjJyApICkgeyAvLyBFeGVjIGlzIGF2YWlsYWJsZSBzbyB0ZXN0IG15c3FsZHVtcCBmcm9tIGhlcmUuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsZHVtcCB0ZXN0OiBleGVjKCkgZnVuY3Rpb24gZXhpc3RzLiBUZXN0aW5nIHJ1bm5pbmcgbXlzcWxkdW1wIHZpYSBleGVjKCkuJyApOwoJCQkKCQkJCgkJCS8qKioqKioqKioqIEJlZ2luIHByZXBhcmluZyBjb21tYW5kICoqKioqKioqKiovCgkJCS8vIEhhbmRsZSBXaW5kb3dzIHdhbnRpbmcgLmV4ZS4KCQkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsgLy8gUnVubmluZyBXaW5kb3dzLiAobm90IGRhcndpbikKCQkJCSRjb21tYW5kID0gJ21zcWxkdW1wLmV4ZSc7CgkJCX0gZWxzZSB7CgkJCQkkY29tbWFuZCA9ICdteXNxbGR1bXAnOwoJCQl9CgkJCQoJCQkkY29tbWFuZCAuPSAiIC0tdmVyc2lvbiI7CgkJCQoJCQkvLyBSZWRpcmVjdCBTVERFUlIgdG8gU1RET1VULgoJCQkkY29tbWFuZCAuPSAnICAyPiYxJzsKCQkJCgkJCS8qKioqKioqKioqIEVuZCBwcmVwYXJpbmcgY29tbWFuZCAqKioqKioqKioqLwoJCQkKCQkJLy8gTG9vcCB0aHJvdWdoIGFsbCBwb3NzaWJsZSBkaXJlY3RvcmllcyB0byBydW4gY29tbWFuZCB0aHJvdWdoLgoJCQlmb3JlYWNoKCAkdGhpcy0+X215c3FsX2RpcmVjdG9yaWVzIGFzICRteXNxbF9kaXJlY3RvcnkgKSB7IC8vIFRyeSBlYWNoIHBvc3NpYmxlIGRpcmVjdG9yeS4gbXlzcWwgZGlyZWN0b3J5IGluY2x1ZGVkIHRyYWlsaW5nIHNsYXNoLgoJCQkJCgkJCQkvLyBSdW4gY29tbWFuZC4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsZHVtcCB0ZXN0IHJ1bm5pbmcgbmV4dC4nICk7CgkJCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICRteXNxbF9kaXJlY3RvcnkgLiAkY29tbWFuZCApOwoJCQkJCgkJCQlpZiAoIHN0cmlzdHIoIGltcGxvZGUoICcgJywgJGV4ZWNfb3V0cHV0ICksICdWZXInICkgIT09IGZhbHNlICkgeyAvLyBTdHJpbmcgVmVyIGFwcGVhcmVkIGluIHJlc3BvbnNlIChleHBlY3RlZCByZXNwb25zZSB0byBteXNxbGR1bXAgLS12ZXJzaW9uCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxkdW1wIHRlc3Q6IENvbW1hbmQgYXBwZWFycyB0byBiZSBhY2Nlc3NpYmxlIGFuZCByZXR1cm5zIGV4cGVjdGVkIHJlc3BvbnNlLicgKTsKCQkJCQkkdGhpcy0+X215c3FsX2RpcmVjdG9yeSA9ICRteXNxbF9kaXJlY3Rvcnk7IC8vIFNldCB0byB1c2UgdGhpcyBkaXJlY3RvcnkgZm9yIHRoZSByZWFsIGR1bXAuCgkJCQkJcmV0dXJuIGFycmF5KCAncGhwJywgJ2NvbW1hbmRsaW5lJyApOyAvLyBteXNxbGR1bXAgYmVzdCwgcGhwIG5leHQuCgkJCQl9CgkJCX0KCQkJCgkJCQoJCX0gZWxzZSB7IC8vIE5vIGV4ZWMoKSBzbyBtdXN0IGZhbGwgYmFjayB0byBQSFAgbWV0aG9kIG9ubHkuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsZHVtcCB0ZXN0OiBleGVjKCkgdW5hdmFpbGFibGUgc28gc2tpcHBpbmcgY29tbWFuZCBsaW5lIG15c3FsZHVtcCBjaGVjay4nICk7CgkJCXJldHVybiBhcnJheSggJ3BocCcgKTsKCQl9CgkJCgkJcmV0dXJuIGFycmF5KCAncGhwJyApOwoJCQoJfSAvLyBFbmQgYXZhaWxhYmxlX2R1bXBfbWV0aG9kKCkuCgkKCQoJCgkvKglfY2FsY3VsYXRlX215c3FsX2RpcigpCgkgKgkKCSAqCVRyaWVzIHRvIGRldGVybWluZSB0aGUgcGF0aCB0byB3aGVyZSBteXNxbCBpcyBpbnN0YWxsZWQuICBOZWVkZWQgZm9yIHJ1bm5pbmcgYnkgY29tbWFuZCBsaW5lLiAgUHJlcGVuZHMgZm91bmQgbG9jYXRpb24gdG8gbGlzdCBvZiBwb3NzaWJsZSBkZWZhdWx0IG15c3FsIGRpcmVjdG9yaWVzLgoJICoJCgkgKglAcmV0dXJuCQlhcnJheQkJCUFycmF5IG9mIGRpcmVjdG9yaWVzIGluIHByZWZlcnJlZCBvcmRlci4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfY2FsY3VsYXRlX215c3FsX2RpcigpIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBBdHRlbXB0aW5nIHRvIGNhbGN1bGF0ZSBleGFjdCBteXNxbCBkaXJlY3RvcnkuJyApOwoJCSRmYWlsZWQgPSB0cnVlOwoJCSRteXNxbF9kaXJlY3RvcmllcyA9ICR0aGlzLT5fZGVmYXVsdF9teXNxbF9kaXJlY3RvcmllczsKCQkKCQlnbG9iYWwgJHdwZGI7CgkJJGJhc2VkaXIgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoICJTSE9XIFZBUklBQkxFUyBMSUtFICdiYXNlZGlyJyIsIEFSUkFZX04gKTsKCQlpZiAoICRiYXNlZGlyICE9PSBmYWxzZSApIHsKCQkJJGJhc2VkaXJ0cmltID0gcnRyaW0oICRiYXNlZGlyWzBdWzFdLCAnL1xcJyApOyAvLyBUcmltIHRyYWlsaW5nIHNsYXNoZXMuCgkJCSRteXNxbGRpciA9ICRiYXNlZGlydHJpbSAuICcvYmluLyc7CgkJCWFycmF5X3Vuc2hpZnQoICRteXNxbF9kaXJlY3RvcmllcywgJG15c3FsZGlyICk7IC8vIFByZXBlbmRzIHRoZSBqdXN0IGZvdW5kIGRpcmVjdG9yeSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBNeXNxbCByZXBvcnRlZCBpdHMgZGlyZWN0b3J5LiBSZXBvcnRlZDogYCcgLiAkYmFzZWRpclswXVsxXSAuICdgOyBBZGRpbmcgYmluYXJ5IGxvY2F0aW9uIHRvIGJlZ2lubmluZyBvZiBteXNxbCBkaXJlY3RvcnkgbGlzdDogYCcgLiAkbXlzcWxkaXIgLiAnYCcgKTsKCQkJJGZhaWxlZCA9IGZhbHNlOwoJCX0KCQkKCQlpZiAoICRmYWlsZWQgPT09IHRydWUgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IE15c3FsIHdvdWxkIG5vdCByZXBvcnQgaXRzIGRpcmVjdG9yeS4nICk7CgkJfQoJCQoJCXJldHVybiAkbXlzcWxfZGlyZWN0b3JpZXM7CgkJCgl9IC8vIEVuZCBfY2FsY3VsYXRlX215c3FsX2RpcigpLgoJCgkKCQoJLyoJZHVtcCgpCgkgKgkKCSAqCWZ1bmN0aW9uIGRlc2NyaXB0aW9uCgkgKgoJICoJQHNlZSBfbXlzcWxkdW1wKCkuCgkgKglAc2VlIF9waHBkdW1wKCkuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkb3V0cHV0X2RpcmVjdG9yeQkJRGlyZWN0b3J5IHRvIG91dHB1dCB0by4gTWF5IGFsc28gYmUgdXNlZCBhcyBhIHRlbXBvcmFyeSBmaWxlIGxvY2F0aW9uLiBUcmFpbGluZyBzbGFzaCBhdXRvLWFkZGVkIGlmIG1pc3NpbmcuCgkgKglAcGFyYW0JCWFycmF5CQkkdGFibGVzCQkJCQlBcnJheSBvZiB0YWJsZXMgdG8gZHVtcC4KCSAqCUBwYXJhbQkJaW50CQkJJHJvd3Nfc3RhcnQJCQkJU3RhcnRpbmcgcm93LCBpZiBhbnkuIE9ubHkgd29ya3Mgd2l0aCBQSFAgbW9kZS4gVXNlZCB3aXRoIGNodW5raW5nLgoJICoJQHJldHVybgoJICovCglwdWJsaWMgZnVuY3Rpb24gZHVtcCggJG91dHB1dF9kaXJlY3RvcnksICR0YWJsZXMgPSBhcnJheSgpLCAkcm93c19zdGFydCA9IDAgKSB7IC8vLCAkYmFzZV9kdW1wX21vZGUsICRhZGRpdGlvbmFsX2luY2x1ZGVzID0gYXJyYXkoKSwgJGFkZGl0aW9uYWxfZXhjbHVkZXMgPSBhcnJheSgpICkgewoJCQoJCSRvdXRwdXRfZGlyZWN0b3J5ID0gcnRyaW0oICRvdXRwdXRfZGlyZWN0b3J5LCAnLycgKSAuICcvJzsgLy8gTWFrZSBzdXJlIHdlIGhhdmUgdHJhaWxpbmcgc2xhc2guCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21pbGVzdG9uZScsICdzdGFydF9kYXRhYmFzZScgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdTdGFydGluZyBkYXRhYmFzZSBkdW1wIHByb2NlZHVyZS4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAibXlzcWxidWRkeTogT3V0cHV0IGRpcmVjdG9yeTogYHskb3V0cHV0X2RpcmVjdG9yeX1gLiIgKTsKCQlpZiAoIGNvdW50KCAkdGFibGVzICkgPT0gMSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHVtcGluZyBzaW5nbGUgdGFibGUgYCcgLiAkdGFibGVzWzBdIC4gJ2AuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1RhYmxlIGR1bXAgY291bnQ6IGAnIC4gY291bnQoICR0YWJsZXMgKSAuICdgLicgKTsKCQl9CgkJaWYgKCBmaWxlX2V4aXN0cyggJG91dHB1dF9kaXJlY3RvcnkgLiAnZGJfMS5zcWwnICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIFNRTCBmaWxlIGV4aXN0cy4gSXQgd2lsbCBiZSBhcHBlbmRlZCB0by4nICk7CgkJfQoJCQoJCS8vIEF0dGVtcHQgZWFjaCBtZXRob2QgaW4gb3JkZXIuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUHJlcGFyaW5nIHRvIGR1bXAgdXNpbmcgYXZhaWxhYmxlIG1ldGhvZChzKSBieSBwcmlvcml0eS4gTWV0aG9kczogYCcgLiBpbXBsb2RlKCAnLCcsICR0aGlzLT5fbWV0aG9kcyApIC4gJ2AnICk7CgkJZm9yZWFjaCggJHRoaXMtPl9tZXRob2RzIGFzICRtZXRob2QgKSB7CgkJCWlmICggbWV0aG9kX2V4aXN0cyggJHRoaXMsICJfZHVtcF97JG1ldGhvZH0iICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBBdHRlbXB0aW5nIGR1bXAgbWV0aG9kIGAnIC4gJG1ldGhvZCAuICdgLicgKTsKCQkJCSRyZXN1bHQgPSBjYWxsX3VzZXJfZnVuYyggYXJyYXkoICR0aGlzLCAiX2R1bXBfeyRtZXRob2R9IiApLCAkb3V0cHV0X2RpcmVjdG9yeSwgJHRhYmxlcywgJHJvd3Nfc3RhcnQgKTsKCQkJCQoJCQkJaWYgKCAkcmVzdWx0ID09PSB0cnVlICkgeyAvLyBEdW1wIGNvbXBsZXRlZCBzdWNjZXNmdWxseSB3aXRoIHRoaXMgbWV0aG9kLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IER1bXAgbWV0aG9kIGAnIC4gJG1ldGhvZCAuICdgIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyApOwoJCQkJCSRyZXR1cm4gPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJfSBlbHNlaWYgKCAkcmVzdWx0ID09PSBmYWxzZSApIHsgLy8gRHVtcCBmYWlsZWQgdGhpcyBtZXRob2QuIFdpbGwgdHJ5IGNvbXBhdGliaWxpdHkgZmFsbGJhY2sgdG8gbmV4dCBtb2RlIGlmIGFibGUuCgkJCQkJLy8gRG8gbm90aGluZy4gV2lsbCB0cnkgbmV4dCBtb2RlIG5leHQgbG9vcC4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEdW1wIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYCBmYWlsZWQuIFRyeWluZyBhbm90aGVyIGNvbXBhdGliaWxpdHkgbW9kZSBuZXh0IGlmIGFibGUuJyApOwoJCQkJfSBlbHNlaWYgKCBpc19hcnJheSggJHJlc3VsdCApICkgeyAvLyBDaHVua2luZy4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEdW1wIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYCBpcyB1c2luZyBjaHVua2luZy4nICk7CgkJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCQl9IGVsc2UgeyAvLyBTb21ldGhpbmcgZWxzZSByZXR1cm5lZDsgbmVlZCB0byByZXN1bWU/IFRPRE86IHRoaXMgaXMgZm9yIGZ1dHVyZSB1c2UgZm9yIHJlc3VtaW5nIGR1bXAuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVW5leGVwZWN0ZWQgcmVzcG9uc2U6IGAnIC4gaW1wbG9kZSggJywnLCAkcmVzdWx0ICkgLiAnYCcgKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQkvL3BiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdzdGF0dXMnLCAnZGF0YWJhc2VfZW5kJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtaWxlc3RvbmUnLCAnZmluaXNoX2RhdGFiYXNlJyApOwoJCQoJCWlmICggJHJldHVybiA9PT0gdHJ1ZSApIHsgLy8gU3VjY2Vzcy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGF0YWJhc2UgZHVtcCBwcm9jZWR1cmUgc3VjY2VlZGVkLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsgLy8gT3ZlcmFsbCBmYWlsdXJlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRGF0YWJhc2UgZHVtcCBwcm9jZWR1cmUgZmFpbGVkLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCX0gLy8gRW5kIGR1bXAoKS4KCQoJCgkKCS8qCV9kdW1wX2NvbW1hbmRsaW5lKCkKCSAqCQoJICoJZnVuY3Rpb24gZGVzY3JpcHRpb24KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRvdXRwdXRfZGlyZWN0b3J5CQlEaXJlY3RvcnkgdG8gb3V0cHV0IHRvLiBNYXkgYWxzbyBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5IGZpbGUgbG9jYXRpb24uIFRyYWlsaW5nIHNsYXNoIHJlcXVpcmVkLiBkdW1wKCkgYXV0by1hZGRzIHRyYWlsaW5nIHNsYXNoIGJlZm9yZSBwYXNzaW5nLgoJICoJQHBhcmFtCQlhcnJheQkJJHRhYmxlcwkJCQkJQXJyYXkgb2YgdGFibGVzIHRvIGR1bXAuIElmIG9ubHkgb25lIHRhYmxlIGluIGFycmF5IHRoZW4gd2lsbCB1c2UgVEFCTEVOQU1FLnNxbCBpbnN0ZWFkIG9mIGRiXzEuc3FsLgoJICoJQHBhcmFtCQlpbnQJCQkkcm93c19zdGFydAkJCQlOL0EuIE5vdCB1c2VkIGJ5IHRoaXMgbWV0aG9kLgoJICoJQHJldHVybgkJCgkgKi8KCXByaXZhdGUgZnVuY3Rpb24gX2R1bXBfY29tbWFuZGxpbmUoICRvdXRwdXRfZGlyZWN0b3J5LCAkdGFibGVzLCAkcm93c19zdGFydCA9IDAgKSB7IC8vLCAkYmFzZV9kdW1wX21vZGUsICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICkgewoJCQoJCWlmICggKCBjb3VudCggJHRhYmxlcyApID09IDEgKSAmJiAoIGZhbHNlID09PSAkdGhpcy0+X2ZvcmNlX3NpbmdsZV9kYl9maWxlICkgKSB7IC8vIElmIG9ubHkgb25lIHRhYmxlIHRoZW4gbmFtZSAuc3FsIGZpbGUgYWZ0ZXIgaXQuCgkJCSRvdXRwdXRfZmlsZSA9ICRvdXRwdXRfZGlyZWN0b3J5IC4gJHRhYmxlc1swXSAuICcuc3FsJzsKCQl9IGVsc2UgeyAvLyBNdWx0aXBsZSB0YWJsZXMgc28gdXNlIGdlbmVyYWljIGRiXzEuc3FsIGZpbGUgdG8gZHVtcCBpbnRvLgoJCQkkb3V0cHV0X2ZpbGUgPSAkb3V0cHV0X2RpcmVjdG9yeSAuICdkYl8xLnNxbCc7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdzcWxGaWxlJywgYmFzZW5hbWUoICRvdXRwdXRfZmlsZSApICk7IC8vIFRlbGxzIHN0YXR1cyBjaGVja2VyIHdoaWNoIGZpbGUgdG8gcmVxdWVzdCBzaXplIGRhdGEgZm9yIHdoZW4gcG9sbGluZyBzZXJ2ZXIuCgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogUHJlcGFyaW5nIHRvIHJ1biBjb21tYW5kIGxpbmUgbXlzcWxkdW1wIHZpYSBleGVjKCkuJyApOwoJCSRleGNsdWRlX2NvbW1hbmQgPSAnJzsKCQkKCQkvKgoJCWlmICggKCAkYmFzZV9kdW1wX21vZGUgPT0gJ2FsbCcgKSAmJiAoIGNvdW50KCAkYWRkaXRpb25hbF9leGNsdWRlcyApID09IDAgKSApIHsgLy8gRHVtcGluZyBBTEwgdGFibGVzIGluIHRoZSBkYXRhYmFzZSBzbyBkbyBub3Qgc3BlY2lmeSB0YWJsZXMgaW4gY29tbWFuZCBsaW5lLgoJCQkvLyBEbyBub3RoaW5nLiBKdXN0IGR1bXAgZnVsbCBkYXRhYmFzZS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogRHVtcGluZyBlbnRpcmUgZGF0YWJhc2Ugd2l0aCBubyBleGNsdXNpb25zLicgKTsKCQl9IGVsc2VpZiAoICggJGJhc2VfZHVtcF9tb2RlID09ICdhbGwnICkgJiYgKCBjb3VudCggJGFkZGl0aW9uYWxfZXhjbHVkZXMgKSA+IDAgKSApIHsgLy8gRHVtcGluZyBhbGwgdGFibGVzIGJ5IGRlZmF1bHQgQlVUIGFsc28gZXhjbHVkaW5nIGNlcnRhaW4gb25lcy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogRHVtcGluZyBlbnRpcmUgZGF0YWJhc2Ugd2l0aCBhZGRpdGlvbmFsIGV4Y2x1c2lvbnMuJyApOwoJCQkvLyBIYW5kbGUgYWRkaXRpb25hbCBleGNsdXNpb25zLgoJCQkkYWRkaXRpb25hbF9leGNsdWRlcyA9IGFycmF5X2ZpbHRlciggJGFkZGl0aW9uYWxfZXhjbHVkZXMgKTsgLy8gaWdub3JlIGFueSBwaGFudG9tIGV4Y2x1ZGVzLgoJCQlmb3JlYWNoKCAkYWRkaXRpb25hbF9leGNsdWRlcyBhcyAkYWRkaXRpb25hbF9leGNsdWRlICkgewoJCQkJJGV4Y2x1ZGVfY29tbWFuZCAuPSAiIC0taWdub3JlLXRhYmxlPXskdGhpcy0+X2RhdGFiYXNlX25hbWV9LnskYWRkaXRpb25hbF9leGNsdWRlfSI7CgkJCX0KCQl9IGVsc2UgeyAvLyBPbmx5IGR1bXBpbmcgY2VydGFpbiAKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogRHVtcGluZyBzcGVjaWZpYyB0YWJsZXMuJyApOwoJCQkkdGFibGVzX3N0cmluZyA9IGltcGxvZGUoICcgJywgJHRhYmxlcyApOyAvLyBTcGVjaWZpYyB0YWJsZXMgbGlzdGVkIHRvIGR1bXAuCgkJfQoJCSovCgkJCgkJJHRhYmxlc19zdHJpbmcgPSBpbXBsb2RlKCAnICcsICR0YWJsZXMgKTsgLy8gU3BlY2lmaWMgdGFibGVzIGxpc3RlZCB0byBkdW1wLgoJCQoJCQoJCS8qKioqKioqKioqIEJlZ2luIHByZXBhcmluZyBjb21tYW5kICoqKioqKioqKiovCgkJLy8gSGFuZGxlIFdpbmRvd3Mgd2FudGluZyAuZXhlLgoJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCSRjb21tYW5kID0gJHRoaXMtPl9teXNxbF9kaXJlY3RvcnkgLiAnbXNxbGR1bXAuZXhlJzsKCQl9IGVsc2UgewoJCQkkY29tbWFuZCA9ICR0aGlzLT5fbXlzcWxfZGlyZWN0b3J5IC4gJ215c3FsZHVtcCc7CgkJfQoJCQoJCS8vIEhhbmRsZSBwb3NzaWJsZSBzb2NrZXRzLgoJCWlmICggJHRoaXMtPl9kYXRhYmFzZV9zb2NrZXQgIT0gJycgKSB7CgkJCSRjb21tYW5kIC49ICIgLS1zb2NrZXQ9eyR0aGlzLT5fZGF0YWJhc2Vfc29ja2V0fSI7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IFVzaW5nIHNvY2tldHMgaW4gY29tbWFuZC4nICk7CgkJfQoJCQoJCS8vIFRPRE8gV0lORE9XUyBOT1RFOiBpbmZvcm1hdGlvbiBpbiB0aGUgTXlTUUwgZG9jdW1lbnRhdGlvbiBhYm91dCBteXNxbGR1bXAgbmVlZGluZyB0byB1c2UgLS1yZXN1bHQtZmlsZT0gb24gV2luZG93cyB0byBhdm9pZCBzb21lIGlzc3VlIHdpdGggbGluZSBlbmRpbmdzLgoJCS8qCgkJTm90ZXM6CgkJCS0tc2tpcC1vcHQJCQkJU2tpcHMgc29tZSBkZWZhdWx0IG9wdGlvbnMuIE1VU1QgYWRkIGJhY2sgaW4gY3JlYXRlLW9wdGlvbnMgZWxzZSBhdXRvaW5jcmVtZW50IHdpbGwgYmUgbG9zdCEgU2VlIGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS41L2VuL215c3FsZHVtcC5odG1sI29wdGlvbl9teXNxbGR1bXBfb3B0CgkJCS0tcXVpY2sKCQkJLS1za2lwLWNvbW1lbnRzCQkJRG9udCBib3RoZXIgd2l0aCBleHRyYSBjb21tZW50cy4KCQkJLS1jcmVhdGUtb3B0aW9ucwkJUmVxdWlyZWQgdG8gYWRkIGluIGF1dG8gaW5jcmVtZW50IG9wdGlvbi4KCQkJLS1kaXNhYmxlLWtleXMJCQlQcmV2ZW50IHJlLWluZGV4aW5nIHRoZSBkYXRhYmFzZSBhZnRlciBlYWNoIGFuZCBldmVyeSBpbnNlcnQgdW50aWwgdGhlIGVudGlyZSB0YWJsZSBpcyBpbnNlcnRlZC4gUHJldmVudHMgdGltZW91dHMgd2hlbiBhIGRiIHRhYmxlIGhhcyBmdWxsdGV4dCBrZXlzIGVzcGVjaWFsbHkuCgkJKi8KCQkkY29tbWFuZCAuPSAiIC0taG9zdD0iIC4gZXNjYXBlc2hlbGxhcmcoICR0aGlzLT5fZGF0YWJhc2VfaG9zdCApIC4gIiAtLXVzZXI9IiAuIGVzY2FwZXNoZWxsYXJnKCAkdGhpcy0+X2RhdGFiYXNlX3VzZXIgKSAuICIgLS1wYXNzd29yZD0iIC4gZXNjYXBlc2hlbGxhcmcoICR0aGlzLT5fZGF0YWJhc2VfcGFzcyApIC4gIiAtLXNraXAtb3B0IC0tcXVpY2sgLS1kaXNhYmxlLWtleXMgLS1za2lwLWNvbW1lbnRzIC0tY3JlYXRlLW9wdGlvbnMgeyRleGNsdWRlX2NvbW1hbmR9ICIgLiBlc2NhcGVzaGVsbGFyZyggJHRoaXMtPl9kYXRhYmFzZV9uYW1lICkgLiAiIHskdGFibGVzX3N0cmluZ30gMj4mMSA+PiB7JG91dHB1dF9maWxlfSI7IC8vIDI+JjEgcmVkaXJlY3QgU1RERVJSIHRvIFNURE9VVC4KCQkvKioqKioqKioqKiBFbmQgcHJlcGFyaW5nIGNvbW1hbmQgKioqKioqKioqKi8KCQkKCQkKCQkvKioqKioqKioqKiBCZWdpbiBjb21tYW5kIGxpbmUgbGVuZ3RoIGNoZWNrICoqKioqKioqKiovCgkJLy8gU2ltcGxlIGNoZWNrIGNvbW1hbmQgbGluZSBsZW5ndGguIElmIGl0IGFwcGVhcnMgbG9uZyB0aGVuIGRvIGFkdmFuY2VkIGNoZWNrIHZpYSBjb21tYW5kIGxpbmUgdG8gc2VlIHdoYXQgYWN0dWFsIGxpbWl0IGlzLiBGYWxscyBiYWNrIGlmIHRvbyBsb25nIHRvIGV4ZWN1dGUgb3VyIHByb2Nlc3MgaW4gb25lIGdvLgoJCS8vIFRPRE86IEluIHRoZSBmdXR1cmUgaGFuZGxlIGZhbGxiYWNrIGJldHRlciBieSBwb3NzaWJseSBicmVha2luZyB0aGUgY29tbWFuZCB1cCBpZiBwb3NzaWJsZSByYXRoZXIgdGhhbiBzdHJpY3QgZmFsbGJhY2sgdG8gUEhQIGR1bXBpbmcuCgkJJGNvbW1hbmRfbGVuZ3RoID0gc3RybGVuKCAkY29tbWFuZCApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IENvbW1hbmQgbGVuZ3RoOiBgJyAuICRjb21tYW5kX2xlbmd0aCAuICdgLicgKTsKCQlpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2lnbm9yZV9jb21tYW5kX2xlbmd0aF9jaGVjayddICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBBZHZhbmNlZCBvcHRpb24gdG8gc2tpcCBjb21tYW5kIGxpbmUgbGVuZ3RoIGNoZWNrIHJlc3VsdHMgaW4gZW5hYmxlZC4gU2tpcHBpbmcuJyApOwoJCX0gZWxzZSB7CgkJCWlmICggJGNvbW1hbmRfbGVuZ3RoID4gc2VsZjo6Q09NTUFORF9MSU5FX0xFTkdUSF9DSEVDS19USFJFU0hPTEQgKSB7IC8vIEFyYml0cmFyeSBsZW5ndGguIFNlZW1zIHN0YW5kYXJkIG1heCBsZW5ndGhzIGFyZSA+IDIwMDAwMCBvbiBMaW51eC4gfjg2MDAgb24gV2luZG93cz8KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IENvbW1hbmQgbGluZSBsZW5ndGggb2YgYCcgLiAkY29tbWFuZF9sZW5ndGggLiAnYCAoYnl0ZXMpIGlzIGxhcmdlIGVub3VnaCAoID4nIC4gc2VsZjo6Q09NTUFORF9MSU5FX0xFTkdUSF9DSEVDS19USFJFU0hPTEQgLiAnICkgdG8gdmVyaWZ5IGNvbXBhdGliaWxpdHkuIENoZWNraW5nIG1heGltdW0gYWxsb3dlZCBjb21tYW5kIGxpbmUgbGVuZ3RoIGZvciB0aGlzIHN5dGVtLicgKTsKCQkJCQoJCQkJLy8gQ2hlY2sgbWF4IGNvbW1hbmQgbGVuZ3RoIHN1cHBvcnRlZCBieSBzZXJ2ZXIuCgkJCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICdlY2hvICQoKCAkKGdldGNvbmYgQVJHX01BWCkgLSAkKGVudiB8IHdjIC1jKSApKScgKTsgLy8gVmFsdWUgd2lsbCBiZSBhIG51bWJlci4gVGhpcyBpcyB0aGUgbWF4aW11bSBieXRlIHNpemUgb2YgdGhlIGNvbW1hbmQgbGluZS4KCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBvdXRwdXQ6IGAnIC4gaW1wbG9kZSggJywnLCAkZXhlY19vdXRwdXQgKSAuICdgOyBFeGl0IGNvZGU6IGAnIC4gJGV4ZWNfZXhpdF9jb2RlIC4gJ2A7IEV4aXQgY29kZSBkZXNjcmlwdGlvbjogYCcgLiBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0tPmV4aXRfY29kZV9sb29rdXAoICRleGVjX2V4aXRfY29kZSApIC4gJ2AnICk7CgkJCQlpZiAoIGlzX2FycmF5KCAkZXhlY19vdXRwdXQgKSAmJiBpc19udW1lcmljKCAkZXhlY19vdXRwdXRbMF0gKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBEZXRlY3RlZCBtYXhpbXVtIGNvbW1hbmQgbGluZSBsZW5ndGggZm9yIHRoaXMgc3lzdGVtOiBgJyAuICRleGVjX291dHB1dFswXSAuICdgLicgKTsKCQkJCQlpZiAoICRjb21tYW5kX2xlbmd0aCA+ICggJGV4ZWNfb3V0cHV0WzBdIC0gMTAwICkgKSB7IC8vIENoZWNrIGlmIHdlIGV4Y2VlZCBtYXhpbXVtIGxlbmd0aC4gU3VidHJhY3QgMTAwIHRvIG1ha2Ugcm9vbSBmb3IgcGF0aCBkZWZpbml0aW9uLgoJCQkJCQlpZiAoICcxJyA9PSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2lnbm9yZV9jb21tYW5kX2xlbmd0aF9jaGVjayddICkgewoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVGhpcyBzeXN0ZW1cJ3MgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoIG9mIGAnIC4gJGV4ZWNfb3V0cHV0WzBdIC4gJ2AgaXMgc2hvcnRlciB0aGFuIGNvbW1hbmQgbGVuZ3RoIG9mIGAnIC4gJGNvbW1hbmRfbGVuZ3RoIC4gJ2AuIEhvd2V2ZXIsIHRoZSBvcHRpb24gdG8gaWdub3JlIGNvbW1hbmQgbGluZSBsZW5ndGggY2hlY2sgaXMgZW5hYmxlZCBiYXNlZCBvbiBzZXR0aW5ncyBzbyBjb250aW51aW5nIGFueXdheXMuJyApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJaWYgKCAkZXhlY19vdXRwdXRbMF0gPCAwICkgewoJCQkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICd3YXJuaW5nJywgJ215c3FsYnVkZHk6IFRoaXMgc3lzdGVtIHJlcG9ydGVkIGEgbmVnYXRpdmUgbnVtYmVyIGZvciB0aGUgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoLiBUaGlzIG1lYW5zIHRoYXQgQmFja3VwQnVkZHkgY2Fubm90IHNhZmVseSBkZXRlY3QgdGhpcyBzeXN0ZW1cJ3MgbGltaXQuICBUaGlzIGNoZWNrIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGVuYWJsaW5nIHRoZSAiU2tpcCBjb21tYW5kIGxpbmUgbGVuZ3RoIGNoZWNrIiBhZHZhbmNlZCBvcHRpb24gb24gdGhlIFNldHRpbmdzIHBhZ2UgaW4gQmFja3VwQnVkZHkgYXMgYSB3b3JrYXJvdW5kLiBnZXRfY29uZiBBUkdfTUFYIGxpa2VseSBmYWlsZWQuJyApOwoJCQkJCQkJfQoJCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVGhpcyBzeXN0ZW1cJ3MgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoIG9mIGAnIC4gJGV4ZWNfb3V0cHV0WzBdIC4gJ2AgaXMgc2hvcnRlciB0aGFuIGNvbW1hbmQgbGVuZ3RoIG9mIGAnIC4gJGNvbW1hbmRfbGVuZ3RoIC4gJ2AuIEZhbGxpbmcgYmFjayBpbnRvIGNvbXBhdGliaWxpdHkgbW9kZSB0byBpbnN1cmUgZGF0YWJhc2UgZHVtcCBpbnRlZ3JpdHkuJyApOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogVGhpcyBzeXN0ZW1cJ3MgbWF4aW11bSBjb21tYW5kIGxpbmUgbGVuZ3RoIG9mIGAnIC4gJGV4ZWNfb3V0cHV0WzBdIC4gJ2AgaXMgbG9uZ2VyIHRoYW4gY29tbWFuZCBsZW5ndGggb2YgYCcgLiAkY29tbWFuZF9sZW5ndGggLiAnYC4gQ29udGludWluZy4nICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBVbmFibGUgdG8gZGV0ZXJtaW5lIG1heGltdW0gY29tbWFuZCBsaW5lIGxlbmd0aC4gRmFsbGluZyBiYWNrIGludG8gY29tcGF0aWJpbGl0eSBtb2RlIHRvIGluc3VyZSBkYXRhYmFzZSBkdW1wIGludGVncml0eS4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOyAvLyBGYWxsIGJhY2sgdG8gY29tcGF0aWJpbHR5IG1vZGUganVzdCBpbiBjYXNlLgoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBsaW5lIGxlbmd0aCBsZW5ndGggY2hlY2sgc2tpcHBlZCBzaW5jZSBpdCBpcyBsZXNzIHRoYW4gY2hlY2sgdGhyZXNob2xkIGAnIC4gc2VsZjo6Q09NTUFORF9MSU5FX0xFTkdUSF9DSEVDS19USFJFU0hPTEQgLiAnYC4nICk7CgkJCX0KCQl9CgkJLyoqKioqKioqKiogRW5kIGNvbW1hbmQgbGluZSBsZW5ndGggY2hlY2sgKioqKioqKioqKi8KCQkKCQkKCQkvLyBSdW4gY29tbWFuZC4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBSdW5uaW5nIGR1bXAgdmlhIGNvbW1hbmRsaW5lIG5leHQuJyApOwoJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJGNvbW1hbmQgKTsKCQkKCQkvLyBDaGVjayBmb3IgdW5leHBlY3RlZCBteXNxbCBjb21tYW5kIGxpbmUgcmVzcG9uc2UgdGV4dC4uLgoJCWlmICggaXNfYXJyYXkoICRleGVjX291dHB1dCApICkgewoJCQlmb3JlYWNoKCAkZXhlY19vdXRwdXQgYXMgJGV4ZWNfb3V0cHV0X2xpbmUgKSB7CgkJCQlpZiAoIGZhbHNlICE9PSBzdHJpc3RyKCAkZXhlY19vdXRwdXRfbGluZSwgJ3VucmVjb2duaXplZCBvcHRpb24nICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsZHVtcCBkaWQgbm90IHJlY29nbml6ZSBvbmUgb3IgbW9yZSBvcHRpb25zLiBWZXJpZnkgbXlzcWxkdW1wIHZlcnNpb24gaXMgdXAgdG8gZGF0ZS4gRmFsbGluZyBiYWNrIHRvIGNvbXBhdGliaWxpdHkgbW9kZS4gRXJyb3I6IGAnIC4gJGV4ZWNfb3V0cHV0X2xpbmUgLiAnYC4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJfQoJCQoJCUBpbmNsdWRlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvd3BkYnV0aWxzL3dwZGJ1dGlscy5waHAnICk7CgkJaWYgKCBjbGFzc19leGlzdHMoICdwbHVnaW5idWRkeV93cGRidXRpbHMnICkgKSB7CgkJCWdsb2JhbCAkd3BkYjsKCQkJJGRiaGVscGVyID0gbmV3IHBsdWdpbmJ1ZGR5X3dwZGJ1dGlscyggJHdwZGIgKTsKCQkJaWYgKCAhICRkYmhlbHBlci0+a2ljaygpICkgewoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oJ0RhdGFiYXNlIFNlcnZlciBoYXMgZ29uZSBhd2F5LCB1bmFibGUgdG8gc2NoZWR1bGUgbmV4dCBiYWNrdXAgc3RlcC4gVGhlIGJhY2t1cCBjYW5ub3QgY29udGludWUuIFRoaXMgaXMgbW9zdCBvZnRlbiBjYXVzZWQgYnkgbXlzcWwgcnVubmluZyBvdXQgb2YgbWVtb3J5IG9yIHRpbWluZyBvdXQgZmFyIHRvbyBlYXJseS4gUGxlYXNlIGNvbnRhY3QgeW91ciBob3N0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnaGFsdFNjcmlwdCcsICcnICk7IC8vIEhhbHQgSlMgb24gcGFnZS4KCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0RhdGFiYXNlIFNlcnZlciBjb25uZWN0aW9uIHN0YXR1cyB1bnZlcmlmaWVkLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJfQoJCQoJCS8vIENoZWNrIHRoZSByZXN1bHQgb2YgdGhlIAoJCWlmICggJGV4ZWNfZXhpdF9jb2RlID09ICcwJyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBhcHBlYXJzIHRvIHN1Y2NlZWRlZCBhbmQgcmV0dXJuZWQgcHJvcGVyIHJlc3BvbnNlLicgKTsKCQkJaWYgKCBmaWxlX2V4aXN0cyggJG91dHB1dF9maWxlICkgKSB7IC8vIFNRTCBmaWxlIGZvdW5kLiBTVUNDRVNTIQoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnbXlzcWxidWRkeTogRGF0YWJhc2UgZHVtcCBTUUwgZmlsZSBleGlzdHMuJyApOwoJCQkJCgkJCQkvLyBEaXNwbGF5IGZpbmFsIFNRTCBmaWxlIHNpemUuCgkJCQkkc3FsX2ZpbGVzaXplID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggZmlsZXNpemUoICRvdXRwdXRfZmlsZSApICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaW5hbCBTUUwgZGF0YWJhc2UgZHVtcCBmaWxlIHNpemUgb2YgYCcgLiBiYXNlbmFtZSggJG91dHB1dF9maWxlICkgLiAnYDogJyAuICRzcWxfZmlsZXNpemUgLiAnLicgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdmaW5pc2hUYWJsZUR1bXAnLCAnJyApOwoJCQkJCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsgLy8gU1FMIGZpbGUgTUlTU0lORy4gRkFJTFVSRSEKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbGJ1ZGR5OiBUaG91Z2ggY29tbWFuZCByZXBvcnRlZCBzdWNjZXNzIGRhdGFiYXNlIGR1bXAgU1FMIGZpbGUgaXMgbWlzc2luZzogYCcgLiAkb3V0cHV0X2ZpbGUgLiAnYC4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGVsc2UgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBXYXJuaW5nICM5MDMwLiBDb21tYW5kIGRpZCBub3QgZXhpdCBub3JtYWxseS4gVGhpcyBpcyBub3JtYWwgaXMgeW91ciBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kIGxpbmUgbXlzcWwgZnVuY3Rpb25hbGl0eS4gRmFsbGluZyBiYWNrIHRvIGRhdGFiYXNlIGR1bXAgY29tcGF0aWJpbGl0eSBtb2Rlcy4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJCgkJLy8gU2hvdWxkIG5ldmVyIGdldCB0byBoZXJlLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdteXNxbGJ1ZGR5OiBVbmNhdWdodCBleGNlcHRpb24gIzQ1Mzg5MC4nICk7CgkJcmV0dXJuIGZhbHNlOwoJCQoJfSAvLyBFbmQgX2R1bXBfY29tbWFuZGxpbmUoKS4KCQoJCgkKCS8qCV9waHBkdW1wKCkKCSAqCQoJICoJUEhQLWJhc2VkIGR1bXBpbmcgb2YgU1FMIGRhdGEuIENvbXBhdGliaWxpdHkgbW9kZS4gV2FzIG9ubHkgbW9kZSBwcmUtMy4wLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG91dHB1dF9kaXJlY3RvcnkJCURpcmVjdG9yeSB0byBvdXRwdXQgdG8uIE1heSBhbHNvIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkgZmlsZSBsb2NhdGlvbi4gVHJhaWxpbmcgc2xhc2ggcmVxdWlyZWQuIGR1bXAoKSBhdXRvLWFkZHMgdHJhaWxpbmcgc2xhc2ggYmVmb3JlIHBhc3NpbmcuCgkgKglAcGFyYW0JCWFycmF5CQkkdGFibGVzCQkJCQlBcnJheSBvZiB0YWJsZXMgdG8gZHVtcC4KCSAqCVJFTU9WRUQ6IEBwYXJhbQkJc3RyaW5nCQkkYmFzZV9kdW1wX21vZGUJCQlCYXNlIGR1bXAgbW9kZS4gTk9UIFVTRUQuIENvbnNpc3RlbnQgd2l0aCBvdGhlciBkdW1wIG1vZGUuCgkgKglSRU1PVkVEOiBAcGFyYW0JCWFycmF5CQkkYWRkaXRpb25hbF9leGNsdWRlcwlBZGRpdGlvbmFsIGV4Y2x1ZGVzLiBOT1QgVVNFRC4gQ29uc2lzdGVudCB3aXRoIG90aGVyIGR1bXAgbW9kZS4KCSAqCUByZXR1cm4JCW1peGVkCQkJCQkJCQkJCXRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbCwgYXJyYXkgb24gcmVzdW1pbmcKCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfZHVtcF9waHAoICRvdXRwdXRfZGlyZWN0b3J5LCAkdGFibGVzLCAkcmVzdW1lX3N0YXJ0aW5nX3JvdyA9IDAgKSB7IC8vLCAkYmFzZV9kdW1wX21vZGUsICRhZGRpdGlvbmFsX2V4Y2x1ZGVzICkgewoJCQoJCSR0aGlzLT50aW1lX3N0YXJ0ID0gbWljcm90aW1lKCB0cnVlICk7CgkJJGxhc3RfZmlsZV9zaXplX291dHB1dCA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCSRvdXRwdXRfZmlsZV9zaXplX2V2ZXJ5X21heCA9IDU7IC8vIE91dHB1dCBjdXJyZW50IFNRTCBmaWxlIHNpemUgbm8gbW9yZSBvZnRlbiB0aGFuIHRoaXMuIE9ubHkgY2hlY2tzIGlmIGl0IGhhcyBiZWVuIGVub3VnaCB0aW1lIG9uY2UgZWFjaCBidXJzdCBvZiBtYXggcm93cyBwZXIgc2VsZWN0IGlzIHByb2Nlc3NlZC4KCQkKCQkkbWF4X3Jvd3NfcGVyX3NlbGVjdCA9ICR0aGlzLT5fbWF4X3Jvd3NfcGVyX3NlbGVjdDsKCQkKCQlpZiAoICRyZXN1bWVfc3RhcnRpbmdfcm93ID4gMCApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnUmVzdW1pbmcgY2h1bmtlZCBkdW1wIGF0IHJvdyBgJyAuICRyZXN1bWVfc3RhcnRpbmdfcm93IC4gJ2AuJyApOwoJCX0KCQkKCQlnbG9iYWwgJHdwZGI7CgkJaWYgKCAhaXNfb2JqZWN0KCAkd3BkYiApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnV29yZFByZXNzIGRhdGFiYXNlIG9iamVjdCAkd3BkYiBkaWQgbm90IGV4aXN0LiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLicgKTsKCQkJZXJyb3JfbG9nKCAnV29yZFByZXNzIGRhdGFiYXNlIG9iamVjdCAkd3BkYiBkaWQgbm90IGV4aXN0LiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiBCYWNrdXBCdWRkeSBFcnJvciAjODk0NTU4Nzk3My4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gQ29ubmVjdCBpZiBub3QgY29ubmVjdGVkIGZvciBpbXBvcnRidWRkeS4KCQlpZiAoIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCQkJaWYgKCAhbXlzcWxfcGluZyggJHdwZGItPmRiaCApICkgewoJCQkJJHdwZGItPmRiaCA9IG15c3FsX2Nvbm5lY3QoICR0aGlzLT5fZGF0YWJhc2VfaG9zdCwgJHRoaXMtPl9kYXRhYmFzZV91c2VyLCAkdGhpcy0+X2RhdGFiYXNlX3Bhc3MgKTsKCQkJCW15c3FsX3NlbGVjdF9kYiggJHRoaXMtPl9kYXRhYmFzZV9uYW1lLCAkd3BkYi0+ZGJoICk7CgkJCX0KCQl9CgkJCgkJJGluc2VydF9zcWwgPSAnJzsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdMb2FkaW5nIERCIGtpY2tlciBmb3IgdXNlIGxldGVyIGluIGNhc2UgZGF0YWJhc2UgZ29lcyBhd2F5LicgKTsKCQlAaW5jbHVkZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3dwZGJ1dGlscy93cGRidXRpbHMucGhwJyApOwoJCWlmICggY2xhc3NfZXhpc3RzKCAncGx1Z2luYnVkZHlfd3BkYnV0aWxzJyApICkgewoJCQlnbG9iYWwgJHdwZGI7CgkJCSRkYmhlbHBlciA9IG5ldyBwbHVnaW5idWRkeV93cGRidXRpbHMoICR3cGRiICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCBfXygnRGF0YWJhc2UgU2VydmVyIGNvbm5lY3Rpb24gc3RhdHVzIHdpbGwgbm90IGJlIHZlcmlmaWVkIGFzIGtpY2tlciBpcyBub3QgYXZhaWxhYmxlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJfQoJCQoJCWdsb2JhbCAkd3BkYjsgLy8gVXNlZCBsYXRlciBmb3IgY2hlY2tpbmcgdGhhdCB3ZSBhcmUgc3RpbGwgY29ubmVjdGVkIHRvIERCLgoJCQoJCS8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHRhYmxlcyB0byBiYWNrdXAuCgkJLy8gVE9ETzogRnV0dXJlIGFiaWxpdHkgdG8gYnJlYWsgdXAgREIgZXhwb3J0aW5nIHRvIG11bHRpcGxlIHBhZ2UgbG9hZHMgaWYgbmVlZGVkLgoJCSRyZW1haW5pbmdUYWJsZXMgPSAkdGFibGVzOwoJCWZvcmVhY2goICR0YWJsZXMgYXMgJHRhYmxlX2tleSA9PiAkdGFibGUgKSB7CgkJCSRfY291bnQgPSAwOwoJCQkkaW5zZXJ0X3NxbCA9ICcnOwoJCQkKCQkJaWYgKCAkcmVzdW1lX3N0YXJ0aW5nX3JvdyA+IDAgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCdkZXRhaWxzJywgJ0NodW5rZWQgcmVzdW1lIG9uIGR1bXBpbmcgYCcgLiAkdGFibGUgLiAnYC4gUmVzdW1pbmcgd2hlcmUgbGVmdCBvZmYuJyApOwoJCQkJJHJvd3Nfc3RhcnQgPSAkcmVzdW1lX3N0YXJ0aW5nX3JvdzsKCQkJCSRyZXN1bWVfc3RhcnRpbmdfcm93ID0gMDsgLy8gRG9uJ3Qgd2FudCB0byBza2lwIGFueXRoaW5nIG9uIG5leHQgdGFibGUuCgkJCX0gZWxzZSB7CgkJCQkkcm93c19zdGFydCA9IDA7CgkJCX0KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHVtcGluZyBkYXRhYmFzZSB0YWJsZSBgJyAuICR0YWJsZSAuICdgLiBNYXggcm93cyBwZXIgc2VsZWN0OiAnIC4gJG1heF9yb3dzX3Blcl9zZWxlY3QgLiAnLiBTdGFydGluZyBhdCByb3cgYCcgLiAkcmVzdW1lX3N0YXJ0aW5nX3JvdyAuICdgLicgKTsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ3N0YXJ0VGFibGVEdW1wJywgJHRhYmxlICk7CgkJCQoJCQlpZiAoIGZhbHNlID09PSAkdGhpcy0+X2ZvcmNlX3NpbmdsZV9kYl9maWxlICkgewoJCQkJJG91dHB1dF9maWxlID0gJG91dHB1dF9kaXJlY3RvcnkgLiAkdGFibGUgLiAnLnNxbCc7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBZHZhbmNlZCBvcHRpb24gdG8gZm9yY2UgdG8gc2luZ2xlIC5zcWwgZmlsZSBlbmFibGVkLicgKTsKCQkJCSRvdXRwdXRfZmlsZSA9ICRvdXRwdXRfZGlyZWN0b3J5IC4gJ2RiXzEuc3FsJzsKCQkJfQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdTUUwgZHVtcCBmaWxlIGAnIC4gJG91dHB1dF9maWxlIC4gJ2AuJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBQSFAtYmFzZWQgZGF0YWJhc2UgZHVtcCB3aXRoIG1heCBleGVjdXRpb24gdGltZSBmb3IgdGhpcyBydW46ICcgLiAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgLiAnIHNlY29uZHMuJyApOwoJCQlpZiAoIGZhbHNlID09PSAoICRmaWxlX2hhbmRsZSA9IGZvcGVuKCAkb3V0cHV0X2ZpbGUsICdhJyApICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzkwMTg6IERhdGFiYXNlIGZpbGUgaXMgbm90IGNyZWF0YWJsZS93cml0YWJsZS4gQ2hlY2sgeW91ciBwZXJtaXNzaW9ucyBmb3IgZmlsZSBgJyAuICRvdXRwdXRfZmlsZSAuICdgIGluIGRpcmVjdG9yeSBgJyAuICRvdXRwdXRfZGlyZWN0b3J5IC4gJ2AuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnc3FsRmlsZScsIGJhc2VuYW1lKCAkb3V0cHV0X2ZpbGUgKSApOyAvLyBUZWxscyBzdGF0dXMgY2hlY2tlciB3aGljaCBmaWxlIHRvIHJlcXVlc3Qgc2l6ZSBkYXRhIGZvciB3aGVuIHBvbGxpbmcgc2VydmVyLgoJCQkKCQkJaWYgKCAwID09ICRyb3dzX3N0YXJ0ICkgewoJCQkJCgkJCQkkY3JlYXRlX3RhYmxlID0gJHdwZGItPmdldF9yZXN1bHRzKCAiU0hPVyBDUkVBVEUgVEFCTEUgYHskdGFibGV9YCIsIEFSUkFZX04gKTsKCQkJCWlmICggJGNyZWF0ZV90YWJsZSA9PT0gZmFsc2UgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ1VuYWJsZSB0byBhY2Nlc3MgYW5kIGR1bXAgZGF0YWJhc2UgdGFibGUgYCcgLiAkdGFibGUgLiAnYC4gVGFibGUgbWF5IG5vdCBleGlzdC4gU2tpcHBpbmcgYmFja3VwIG9mIHRoaXMgdGFibGUuJyApOwoJCQkJCS8vYmFja3VwYnVkZHlfY29yZTo6bWFpbF9lcnJvciggJ0Vycm9yICM0NTM3Mzg0OiBVbmFibGUgdG8gYWNjZXNzIGFuZCBkdW1wIGRhdGFiYXNlIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuIFRhYmxlIG1heSBub3QgZXhpc3QuIFNraXBwaW5nIGJhY2t1cCBvZiB0aGlzIHRhYmxlLicgKTsKCQkJCQljb250aW51ZTsgLy8gU2tpcCB0aGlzIGl0ZXJhdGlvbiBhcyBhY2Nlc3NpbmcgdGhpcyB0YWJsZSBmYWlsZWQuCgkJCQl9CgkJCQkvLyBUYWJsZSBjcmVhdGlvbiB0ZXh0CgkJCQlpZiAoICEgaXNzZXQoICRjcmVhdGVfdGFibGVbMF0gKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzg1NzgzNTogVW5hYmxlIHRvIGdldCB0YWJsZSBjcmVhdGlvbiBTUUwgZm9yIHRhYmxlIGAnIC4gJHRhYmxlIC4gJ2AuIFJlc3VsdDogYCcgLiBwcmludF9yKCAkY3JlYXRlX3RhYmxlICkgLiAnYC4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJJGNyZWF0ZV90YWJsZV9hcnJheSA9ICRjcmVhdGVfdGFibGVbMF07CgkJCQl1bnNldCggJGNyZWF0ZV90YWJsZSApOwoJCQkJJGluc2VydF9zcWwgLj0gc3RyX3JlcGxhY2UoICJcbiIsICcnLCAkY3JlYXRlX3RhYmxlX2FycmF5WzFdICkgLiAiO1xuIjsgLy8gUmVtb3ZlIGludGVybmFsIGxpbmVicmVha3M7IG9ubHkgcHV0IG9uZSBhdCBlbmQuCgkJCQl1bnNldCggJGNyZWF0ZV90YWJsZV9hcnJheSApOwoJCQkJCgkJCQkvLyBEaXNhYmxlIGtleXMgZm9yIHRoaXMgdGFibGUuCgkJCQkkaW5zZXJ0X3NxbCAuPSAiLyohNDAwMDAgQUxURVIgVEFCTEUgYHskdGFibGV9YCBESVNBQkxFIEtFWVMgKi87XG4iOwoJCQkJCgkJCX0KCgkJCSRxdWVyeUNvdW50ID0gMDsKCQkJJHJvd3NfcmVtYWluID0gdHJ1ZTsKCQkJd2hpbGUgKCB0cnVlID09PSAkcm93c19yZW1haW4gKSB7CgkJCQkvLyBSb3cgY3JlYXRpb24gdGV4dCBmb3IgYWxsIHJvd3Mgd2l0aGluIHRoaXMgdGFibGUuCgkJCQkkcXVlcnkgPSAiU0VMRUNUICogRlJPTSBgJHRhYmxlYCBMSU1JVCAiIC4gJHJvd3Nfc3RhcnQgLiAnLCcgLiAkbWF4X3Jvd3NfcGVyX3NlbGVjdDsKCQkJCSR0YWJsZV9xdWVyeSA9ICR3cGRiLT5nZXRfcmVzdWx0cyggJHF1ZXJ5LCBBUlJBWV9OICk7CgkJCQkkcm93c19zdGFydCArPSAkbWF4X3Jvd3NfcGVyX3NlbGVjdDsgLy8gTmV4dCBsb29wIHdlIHdpbGwgYmVnaW4gYXQgdGhpcyBvZmZzZXQuCgkJCQlpZiAoICR0YWJsZV9xdWVyeSA9PT0gZmFsc2UgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0VSUk9SICM4NTQ0OTc0NS4gVW5hYmxlIHRvIHJldHJpZXZlIGRhdGEgZnJvbSB0YWJsZSBgJyAuICR0YWJsZSAuICdgLiBUaGlzIHRhYmxlIG1heSBiZSBjb3JydXB0ICh0cnkgcmVwYWlyaW5nIHRoZSBkYXRhYmFzZSkgb3IgdG9vIGxhcmdlIHRvIGhvbGQgaW4gbWVtb3J5IChpbmNyZWFzZSBteXNxbCBhbmQvb3IgUEhQIG1lbW9yeSkuIENoZWNrIHlvdXIgUEhQIGVycm9yIGxvZyBmb3IgZnVydGhlciBlcnJvcnMgd2hpY2ggbWF5IHByb3ZpZGUgZnVydGhlciBpbmZvcm1hdGlvbi4gTm90IGNvbnRpbnVpbmcgZGF0YWJhc2UgZHVtcCB0byBpbnN1cmUgYmFja3VwIGludGVncml0eS4nICk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJJHRhYmxlQ291bnQgPSBjb3VudCggJHRhYmxlX3F1ZXJ5ICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdHb3QgYCcgLiAkdGFibGVDb3VudCAuICdgIHJvd3MgZnJvbSBgJyAuICR0YWJsZSAuICdgIG9mIGAnIC4gJG1heF9yb3dzX3Blcl9zZWxlY3QgLiAnYCBtYXguJyApOwoJCQkJaWYgKCAoIDAgPT0gJHRhYmxlQ291bnQgKSB8fCAoICR0YWJsZUNvdW50IDwgJG1heF9yb3dzX3Blcl9zZWxlY3QgKSApIHsKCQkJCQkkcm93c19yZW1haW4gPSBmYWxzZTsKCQkJCX0KCQkJCQoJCQkJJGNvbHVtbnMgPSAkd3BkYi0+Z2V0X2NvbF9pbmZvKCk7CgkJCQkkbnVtX2ZpZWxkcyA9IGNvdW50KCAkY29sdW1ucyApOwoJCQkJZm9yZWFjaCggJHRhYmxlX3F1ZXJ5IGFzICRmZXRjaF9yb3cgKSB7CgkJCQkJJGluc2VydF9zcWwgLj0gIklOU0VSVCBJTlRPIGAkdGFibGVgIFZBTFVFUygiOwoJCQkJCWZvciAoICRuPTE7ICRuPD0kbnVtX2ZpZWxkczsgJG4rKyApIHsKCQkJCQkJJG0gPSAkbiAtIDE7CgkJCQkJCQoJCQkJCQlpZiAoICRmZXRjaF9yb3dbJG1dID09PSBOVUxMICkgewoJCQkJCQkJJGluc2VydF9zcWwgLj0gIk5VTEwsICI7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQkkaW5zZXJ0X3NxbCAuPSAiJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggJGZldGNoX3Jvd1skbV0gKSAuICInLCAiOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSRpbnNlcnRfc3FsID0gc3Vic3RyKCAkaW5zZXJ0X3NxbCwgMCwgLTIgKTsKCQkJCQkkaW5zZXJ0X3NxbCAuPSAiKTtcbiI7CgkJCQkJCgkJCQkJJHdyaXRlUmV0dXJuID0gZndyaXRlKCAkZmlsZV9oYW5kbGUsICRpbnNlcnRfc3FsICk7CgkJCQkJaWYgKCAoIGZhbHNlID09PSAkd3JpdGVSZXR1cm4gKSB8fCAoIDAgPT0gJHdyaXRlUmV0dXJuICkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODQzOTQ4OiBVbmFibGUgdG8gd3JpdGUgdG8gU1FMIGZpbGUuIFJldHVybiBlcnJvci9ieXRlcyB3cml0dGVuOiBgJyAuICR3cml0ZVJldHVybiAuICdgLicgKTsKCQkJCQkJQGZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQkJJGluc2VydF9zcWwgPSAnJzsKCQkJCQkKCQkJCQkkX2NvdW50Kys7CgkJCQkJCgkJCQkJLy8gU2hvdyBhIGhlYXJ0YmVhdCB0byBrZWVwIHVzZXIgdXAgdG8gZGF0ZSBbYW5kIGVudGVydGFpbmVkIDspXS4KCQkJCQlpZiAoICggMCA9PT0gKCAkX2NvdW50ICUgc2VsZjo6SEVBUlRCRUFUX0NPVU5UX0xJTUlUICkgKSB8fCAoIDAgPT09ICggJF9jb3VudCAlIGNlaWwoICRtYXhfcm93c19wZXJfc2VsZWN0IC8gMiApICkgKSApIHsgLy8gRGlzcGxheSBldmVyeSBYIHF1ZXJpZXMgYmFzZWQgb24gaGVhcnRiZWF0IE9SIGF0IGxlYXN0IGRpc3BsYXkgZXZlcnkgaGFsZiBtYXggcm93cyBwZXIgc2VsZWN0LgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdXb3JraW5nLi4uIER1bXBlZCBgJyAuICRfY291bnQgLiAnYCByb3dzIGZyb20gYCcgLiAkdGFibGUgLiAnYCBzbyBmYXIuJyApOwoJCQkJCX0KCQkJCX0gLy8gZW5kIGZvcmVhY2ggdGFibGUgcm93LgoJCQkJCgkJCQlpZiAoIGZhbHNlID09PSAkcm93c19yZW1haW4gKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnRHVtcGVkIGAnIC4gJF9jb3VudCAuICdgIHJvd3MgdG90YWwgZnJvbSBgJyAuICR0YWJsZSAuICdgLiBObyByb3dzIHJlbWFpbi4nICk7CgkJCQl9IGVsc2UgewoJCQkJCWlmICggKCBtaWNyb3RpbWUoIHRydWUgKSAtICRsYXN0X2ZpbGVfc2l6ZV9vdXRwdXQgKSA+ICRvdXRwdXRfZmlsZV9zaXplX2V2ZXJ5X21heCApIHsgLy8gSXQncyBiZWVuIGxvbmcgZW5vdWdoIHRvIGdldCB0aGUgY3VycmVudCBmaWxlIHNpemUgb2YgU1FMIGZpbGUuCgkJCQkJCS8vIERpc3BsYXkgZmluYWwgU1FMIGZpbGUgc2l6ZS4KCQkJCQkJJHNxbF9maWxlc2l6ZSA9IHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoIGZpbGVzaXplKCAkb3V0cHV0X2ZpbGUgKSApOwoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDdXJyZW50IGRhdGFiYXNlIGR1bXAgZmlsZSBgJyAuIGJhc2VuYW1lKCAkb3V0cHV0X2ZpbGUgKSAuICdgIHNpemU6ICcgLiAkc3FsX2ZpbGVzaXplIC4gJy4nICk7CgkJCQkJCSRsYXN0X2ZpbGVfc2l6ZV9vdXRwdXQgPSBtaWNyb3RpbWUoIHRydWUgKTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCS8vIElmIHdlIGFyZSB3aXRoaW4gWCBzZWNvbmRzIChzZWxmOjpUSU1FX1dJR0dMRV9ST09NKSBvZiByZWFjaGluZyBtYXhpbXVtIFBIUCBydW50aW1lIHRoZW4gc3RvcCBoZXJlIHNvIHRoYXQgaXQgY2FuIGJlIHBpY2tlZCB1cCBpbiBhbm90aGVyIFBIUCBwcm9jZXNzLi4uCgkJCQlpZiAoICggKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0ICkgKyBzZWxmOjpUSU1FX1dJR0dMRV9ST09NICkgPj0gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0FwcHJvYWNoaW5nIGxpbWl0IG9mIGF2YWlsYWJsZSBQSFAgY2h1bmtpbmcgdGltZSBvZiBgJyAuICR0aGlzLT5fbWF4RXhlY3V0aW9uVGltZSAuICdgIHNlYy4gUmFuIGZvciAnIC4gcm91bmQoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnRpbWVfc3RhcnQsIDMgKSAuICcgc2VjIGhhdmluZyBkdW1wZWQgYCcgLiAkX2NvdW50IC4gJ2Agcm93cy4gUHJvY2VlZGluZyB0byB1c2UgY2h1bmtpbmcgb24gcmVtYWluaW5nIHRhYmxlczogJyAuIGltcGxvZGUoICcsJywgJHJlbWFpbmluZ1RhYmxlcyApICk7CgkJCQkJQGZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkJCQkJcmV0dXJuIGFycmF5KCAkcmVtYWluaW5nVGFibGVzLCAkcm93c19zdGFydCApOwoJCQkJfSAvLyBFbmQgaWYuCgkJCQkKCQkJCS8vIFZlcmlmeSBkYXRhYmFzZSBpcyBzdGlsbCBjb25uZWN0ZWQgYW5kIHdvcmtpbmcgcHJvcGVybHkuIFNvbWV0aW1lcyBteXNxbCBydW5zIG91dCBvZiBtZW1vcnkgYW5kIGRpZXMgaW4gdGhlIGFib3ZlIGZvcmVhY2guCgkJCQkvLyBObyBwb2ludCBpbiByZWNvbm5lY3RpbmcgYXMgd2UgY2FuIE5PVCB0cnVzdCB0aGF0IG91ciBkdW1wIHdhcyBzdWNjZXNmdWwgYW55bW9yZSAoaXQgbW9zdCBsaWtlbHkgd2FzIG5vdCkuCgkJCQlpZiAoIGlzc2V0KCAkZGJoZWxwZXIgKSApIHsKCQkJCQlpZiAoICEgJGRiaGVscGVyLT5raWNrKCkgKSB7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsIF9fKCAnRVJST1IgIzkwMjY6IFRoZSBteVNRTCBzZXJ2ZXIgd2VudCBhd2F5IHVuZXhwZWN0ZWRseSBkdXJpbmcgZGF0YWJhc2UgZHVtcCBvZiB0YWJsZSBgJyAuICR0YWJsZSAuICdgLiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgY2F1c2VkIGJ5IG15U1FMIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeS4gVGhlIGJhY2t1cCBpbnRlZ3JpdHkgY2FuIG5vIGxvbmdlciBiZSBndWFyYW50ZWVkIHNvIHRoZSBiYWNrdXAgaGFzIGJlZW4gaGFsdGVkLicgKSAuICcgJyAuIF9fKCAnTGFzdCB0YWJsZSBkdW1wZWQgYmVmb3JlIGRhdGFiYXNlIHNlcnZlciB3ZW50IGF3YXk6ICcgKSAuICdgJyAuICR0YWJsZSAuICdgLicgKTsKCQkJCQkJQGZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIGtpY2tlciB1bmF2YWlsYWJsZSBzbyBjb25uZWN0aW9uIHN0YXR1cyB1bnZlcmlmaWVkLicgKTsKCQkJCX0KCQkJCQoJCQl9IC8vIEVuZCB3aGlsZSByb3dzIHJlbWFpbi4KCQkJCgkJCS8vIFJlbW92ZSB0aGUgY3VycmVudCB0YWJsZSBmcm9tIHRoZSBsaXN0IG9mIHRhYmxlcyB0byBkdW1wIGFzIGl0IGlzIGRvbmUuCgkJCXVuc2V0KCAkcmVtYWluaW5nVGFibGVzWyAkdGFibGVfa2V5IF0gKTsKCQkJCgkJCS8vIFJlLWVuYWJsZSBrZXlzIGZvciB0aGlzIHRhYmxlLgoJCQkkaW5zZXJ0X3NxbCAuPSAiLyohNDAwMDAgQUxURVIgVEFCTEUgYHskdGFibGV9YCBFTkFCTEUgS0VZUyAqLztcbiI7CgkJCSR3cml0ZVJldHVybiA9IGZ3cml0ZSggJGZpbGVfaGFuZGxlLCAkaW5zZXJ0X3NxbCApOwoJCQlpZiAoICggZmFsc2UgPT09ICR3cml0ZVJldHVybiApIHx8ICggMCA9PSAkd3JpdGVSZXR1cm4gKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODQzOTQ4OiBVbmFibGUgdG8gd3JpdGUgdG8gU1FMIGZpbGUuIFJldHVybiBlcnJvci9ieXRlcyB3cml0dGVuOiBgJyAuICR3cml0ZVJldHVybiAuICdgLicgKTsKCQkJCUBmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCSRpbnNlcnRfc3FsID0gJyc7CgkJCQoJCQlAZmNsb3NlKCAkZmlsZV9oYW5kbGUgKTsKCQkJCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbmlzaGVkIGR1bXBpbmcgZGF0YWJhc2UgdGFibGUgYCcgLiAkdGFibGUgLiAnYC4nICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdmaW5pc2hUYWJsZUR1bXAnLCAkdGFibGUgKTsKCQkJaWYgKCBpc3NldCggJG91dHB1dF9maWxlICkgKSB7CgkJCQkkc3RhdHMgPSBzdGF0KCAkb3V0cHV0X2ZpbGUgKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0RhdGFiYXNlIFNRTCBkdW1wIGZpbGUgKCcgLiBiYXNlbmFtZSggJG91dHB1dF9maWxlICkgLicpIHNpemU6ICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkc3RhdHNbJ3NpemUnXSApICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnc3FsU2l6ZScsICRzdGF0c1snc2l6ZSddICk7CgkJCX0KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQWJvdXQgdG8gZmx1c2guLi4nICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpmbHVzaCgpOwoJCQkKCQkJLy91bnNldCggJHRhYmxlc1skdGFibGVfa2V5XSApOwoJCX0gLy8gZW5kIGZvcmVhY2ggdGFibGUuCgkJCgkJQGZjbG9zZSggJGZpbGVfaGFuZGxlICk7CgkJdW5zZXQoICRmaWxlX2hhbmRsZSApOwoJCQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgX18oJ0ZpbmlzaGVkIFBIUCBiYXNlZCBTUUwgZHVtcCBtZXRob2QuIFJhbiBmb3IgJyAuIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0LCAzICkgLiAnIHNlYy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApOwoJCXJldHVybiB0cnVlOwoJCQoJfSAvLyBFbmQgX3BocGR1bXAoKS4KCQoJCgkKCS8qCWdldF9tZXRob2RzKCkKCSAqCQoJICoJR2V0IGFuIGFycmF5IG9mIG1ldGhvZHMuIE5vdGU6IElmIGZvcmNlIG92ZXJyaWRpbmcgbWV0aG9kcyB0aGVuIGRldGVjdGVkIG1ldGhvZHMgd2lsbCBub3QgYmUgYWJsZSB0byBkaXNwbGF5LgoJICoJCgkgKglAcmV0dXJuCQlhcnJheQkJCQlBcnJheSBvZiBtZXRob2RzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZHMoKSB7CgkJcmV0dXJuICR0aGlzLT5fbWV0aG9kczsKCX0KCQoJCgkKCS8qCWltcG9ydCgpCgkgKgkKCSAqCUltcG9ydCBTUUwgY29udGVudHMgb2YgYSAuc3FsIGZpbGUgaW50byB0aGUgZGF0YWJhc2UuIE9ubHkgbW9kaWZpY2F0aW9uIGlzIHRvIHRhYmxlIHByZWZpeCBpZiBuZWVkZWQuIFByZWZpeGVzIChuZXcgYW5kIG9sZCkgcHJvdmlkZWQgaW4gY29uc3RydWN0b3IuCgkgKglBdXRvbWF0aWNhbGx5IGhhbmRsZXMgZmFsbGJhY2sgYmFzZWQgb24gYmVzdCBhdmFpbGFibGUgbWV0aG9kcy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRzcWxfZmlsZQkJCQlGdWxsIGFic29sdXRlIHBhdGggdG8gLnNxbCBmaWxlIHRvIGltcG9ydCBmcm9tLgogCSAqCUBwYXJhbQkJc3RyaW5nCQkkb2xkX3ByZWZpeAkJCQlPbGQgZGF0YWJhc2UgcHJlZml4LiBOZXcgcHJlZml4IHByb3ZpZGVkIGluIGNvbnN0cnVjdG9yLgogCSAqCUBwYXJhbQkJaW50CQkJJHF1ZXJ5X3N0YXJ0CQkJUXVlcnkgbnVtYmVyIChha2EgbGluZSBudW1iZXIpIHRvIHJlc3VtZSBpbXBvcnQgYXQuCiAJICoJQHBhcmFtCQlib29sZWFuCQkkaWdub3JlX2V4aXN0aW5nCQlXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBpbXBvcnQgaWYgdGFibGVzIGV4aXN0IGFscmVhZHkuIERlZmF1bHQ6IGZhbHNlLgoJICoJQHJldHVybgkJbWl4ZWQJCQkJCQkJCXRydWUgb24gc3VjY2VzcyAoYm9vbGVhbikKCSAqCQkJCQkJCQkJCQkJCWZhbHNlIG9uIGZhaWx1cmUgKGJvb2xlYW4pCgkgKgkJCQkJCQkJCQkJCQlpbnRlZ2VyIChpbnQpIG9uIG5lZWRpbmcgYSByZXN1bXNlIChpbnRlZ2VyIGlzIHJlc3VtZSBudW1iZXIgZm9yIG5leHQgcGFnZSBsb2FkcyAkcXVlcnlfc3RhcnQpCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpbXBvcnQoICRzcWxfZmlsZSwgJG9sZF9wcmVmaXgsICRxdWVyeV9zdGFydCA9IDAsICRpZ25vcmVfZXhpc3RpbmcgPSBmYWxzZSApIHsKCQkkcmV0dXJuID0gZmFsc2U7CgkJCgkJLy8gUmVxdWlyZSBhIG5ldyB0YWJsZSBwcmVmaXguCgkJaWYgKCAkdGhpcy0+X2RhdGFiYXNlX3ByZWZpeCA9PSAnJyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0VSUk9SIDkwMDg6IEEgZGF0YWJhc2UgcHJlZml4IGlzIHJlcXVpcmVkIGZvciBpbXBvcnRpbmcuJyApOwoJCX0KCQkKCQlpZiAoICRxdWVyeV9zdGFydCA+IDAgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ0NvbnRpbnVpbmcgdG8gcmVzdG9yZSBkYXRhYmFzZSBkdW1wIHN0YXJ0aW5nIGF0IGZpbGUgbG9jYXRpb24gYCcgLiAkcXVlcnlfc3RhcnQgLiAnYC4nICk7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnUmVzdG9yaW5nIGRhdGFiYXNlIGR1bXAuIFRoaXMgbWF5IHRha2UgYSBtb21lbnQuLi4nICk7CgkJfQoJCQoJCWdsb2JhbCAkd3BkYjsKCQkKCQkvLyBDaGVjayB3aGV0aGVyIG9yIG5vdCB0YWJsZXMgYWxyZWFkeSBleGlzdCB0aGF0IG1pZ2h0IGNvbGxpZGUuCgkJLyoKCQlpZiAoICRpZ25vcmVfZXhpc3RpbmcgPT09IGZhbHNlICkgewoJCQlpZiAoICRxdWVyeV9zdGFydCA9PSAwICkgeyAvLyBDaGVjayBudW1iZXIgb2YgdGFibGVzIGFscmVhZHkgZXhpc3Rpbmcgd2l0aCB0aGlzIHByZWZpeC4gU2tpcHMgdGhpcyBjaGVjayBvbiBzdWJzdGVwcyBvZiBEQiBpbXBvcnQuCgkJCQkkcm93cyA9ICR3cGRiLT5nZXRfcmVzdWx0cyggIlNFTEVDVCB0YWJsZV9uYW1lIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9uYW1lIExJS0UgJyIgLiBiYWNrdXBidWRkeV9jb3JlOjpkYkVzY2FwZSggc3RyX3JlcGxhY2UoICdfJywgJ1xfJywgJHRoaXMtPl9kYXRhYmFzZV9wcmVmaXggKSApIC4gIiUnIEFORCB0YWJsZV9zY2hlbWEgPSBEQVRBQkFTRSgpIiwgQVJSQVlfQSApOwoJCQkJaWYgKCBjb3VudCggJHJvd3MgKSA+IDAgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM5MDE0OiBEYXRhYmFzZSBpbXBvcnQgaGFsdGVkIHRvIHByZXZlbnQgb3ZlcndyaXRpbmcgZXhpc3RpbmcgV29yZFByZXNzIGRhdGEuJywgJ1RoZSBkYXRhYmFzZSBhbHJlYWR5IGNvbnRhaW5zIGEgV29yZFByZXNzIGluc3RhbGxhdGlvbiB3aXRoIHRoaXMgcHJlZml4ICgnIC4gY291bnQoICRyb3dzICkgLiAnIHRhYmxlcykuIFJlc3RvcmUgaGFzIGJlZW4gc3RvcHBlZCB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIGV4aXN0aW5nIGRhdGEuICoqKiBQbGVhc2UgZ28gYmFjayBhbmQgZW50ZXIgYSBuZXcgZGF0YWJhc2UgbmFtZSBhbmQvb3IgcHJlZml4IE9SIHNlbGVjdCB0aGUgb3B0aW9uIHRvIHdpcGUgdGhlIGRhdGFiYXNlIHByaW9yIHRvIGltcG9ydCBmcm9tIHRoZSBhZHZhbmNlZCBzZXR0aW5ncyBvbiB0aGUgZmlyc3QgaW1wb3J0IHN0ZXAuICoqKicgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQl1bnNldCggJHJvd3MgKTsKCQkJfQoJCX0KCQkqLwoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1N0YXJ0aW5nIGRhdGFiYXNlIGltcG9ydCBwcm9jZWR1cmUuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IE1heGltdW0gZXhlY3V0aW9uIHRpbWUgZm9yIHRoaXMgcnVuOiAnIC4gJHRoaXMtPl9tYXhFeGVjdXRpb25UaW1lIC4gJyBzZWNvbmRzLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBPbGQgcHJlZml4OiBgJyAuICRvbGRfcHJlZml4IC4gJ2A7IE5ldyBwcmVmaXg6IGAnIC4gJHRoaXMtPl9kYXRhYmFzZV9wcmVmaXggLiAnYC4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAibXlzcWxidWRkeTogSW1wb3J0aW5nIFNRTCBmaWxlOiBgeyRzcWxfZmlsZX1gLiBPbGQgcHJlZml4OiBgeyRvbGRfcHJlZml4fWAuIFF1ZXJ5IHN0YXJ0OiBgeyRxdWVyeV9zdGFydH1gLiIgKTsKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBYm91dCB0byBmbHVzaC4uLicgKTsKCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCQkKCQkvLyBBdHRlbXB0IGVhY2ggbWV0aG9kIGluIG9yZGVyLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ByZXBhcmluZyB0byBpbXBvcnQgdXNpbmcgYXZhaWxhYmxlIG1ldGhvZChzKSBieSBwcmlvcml0eS4gQmFzaW5nIGltcG9ydCBtZXRob2RzIG9mZiBkdW1wIG1ldGhvZHM6IGAnIC4gaW1wbG9kZSggJywnLCAkdGhpcy0+X21ldGhvZHMgKSAuICdgJyApOwoJCWZvcmVhY2goICR0aGlzLT5fbWV0aG9kcyBhcyAkbWV0aG9kICkgewoJCQlpZiAoIG1ldGhvZF9leGlzdHMoICR0aGlzLCAiX2ltcG9ydF97JG1ldGhvZH0iICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBBdHRlbXB0aW5nIGltcG9ydCBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AuJyApOwoJCQkJJHJlc3VsdCA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJHRoaXMsICJfaW1wb3J0X3skbWV0aG9kfSIgKSwgJHNxbF9maWxlLCAkb2xkX3ByZWZpeCwgJHF1ZXJ5X3N0YXJ0LCAkaWdub3JlX2V4aXN0aW5nICk7CgkJCQkKCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsgLy8gRHVtcCBjb21wbGV0ZWQgc3VjY2VzZnVsbHkgd2l0aCB0aGlzIG1ldGhvZC4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBJbXBvcnQgbWV0aG9kIGAnIC4gJG1ldGhvZCAuICdgIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJyApOwoJCQkJCSRyZXR1cm4gPSB0cnVlOwoJCQkJCWJyZWFrOwoJCQkJfSBlbHNlaWYgKCAkcmVzdWx0ID09PSBmYWxzZSApIHsgLy8gRHVtcCBmYWlsZWQgdGhpcyBtZXRob2QuIFdpbGwgdHJ5IGNvbXBhdGliaWxpdHkgZmFsbGJhY2sgdG8gbmV4dCBtb2RlIGlmIGFibGUuCgkJCQkJLy8gRG8gbm90aGluZy4gV2lsbCB0cnkgbmV4dCBtb2RlIG5leHQgbG9vcC4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBJbXBvcnQgbWV0aG9kIGAnIC4gJG1ldGhvZCAuICdgIGZhaWxlZC4gVHJ5aW5nIGFub3RoZXIgY29tcGF0aWJpbGl0eSBtb2RlIG5leHQgaWYgYWJsZS4nICk7CgkJCQl9IGVsc2UgeyAvLyBTb21ldGhpbmcgZWxzZSByZXR1cm5lZDsgdXNlZCBmb3IgcmVzdW1pbmcgKGludGVnZXIpIG9yIGEgbWVzc2FnZSAoc3RyaW5nKS4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdteXNxbGJ1ZGR5OiBOb24tYm9vbGVhbiByZXNwb25zZSAodXN1YWxseSBtZWFucyByZXN1bWUgaXMgbmVlZGVkKTogYCcgLiBpbXBsb2RlKCAnLCcsICRyZXN1bHQgKSAuICdgJyApOwoJCQkJCXJldHVybiAkcmVzdWx0OyAvLyBEb250IGZhbGxiYWNrIGlmIHRoaXMgaGFwcGVucy4gVXN1YWxseSBtZWFucyByZXN1bWUgaXMgbmVlZGVkIHRvIGZpbmlzaC4KCQkJCX0KCQkJfQoJCX0KCQkJCQoJCWlmICggJHJldHVybiA9PT0gdHJ1ZSApIHsgLy8gU3VjY2Vzcy4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnRGF0YWJhc2UgaW1wb3J0IG9mIGAnIC4gYmFzZW5hbWUoICRzcWxfZmlsZSApIC4gJ2Agc3VjY2VlZGVkLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsgLy8gT3ZlcmFsbCBmYWlsdXJlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRGF0YWJhc2UgaW1wb3J0IHByb2NlZHVyZSBkaWQgbm90IGNvbXBsZXRlIG9yIGZhaWxlZC4nICk7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgl9IC8vIEVuZCBpbXBvcnQoKS4KCQoJCgkKCXB1YmxpYyBmdW5jdGlvbiBfaW1wb3J0X2NvbW1hbmRsaW5lKCAkc3FsX2ZpbGUsICRvbGRfcHJlZml4LCAkcXVlcnlfc3RhcnQgPSAwLCAkaWdub3JlX2V4aXN0aW5nID0gZmFsc2UgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogUHJlcGFyaW5nIHRvIHJ1biBjb21tYW5kIGxpbmUgbXlzcWwgaW1wb3J0IHZpYSBleGVjKCkuJyApOwoJCQoJCQoJCS8vIElmIHByZWZpeCBoYXMgY2hhbmdlZCB0aGVuIG5lZWQgdG8gdXBkYXRlIHRoZSBmaWxlLgoJCWlmICggJG9sZF9wcmVmaXggIT0gJHRoaXMtPl9kYXRhYmFzZV9wcmVmaXggKSB7CgkJCWlmICggIWlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3RleHRyZXBsYWNlYnVkZHknXSApICkgewoJCQkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3RleHRyZXBsYWNlYnVkZHkvdGV4dHJlcGxhY2VidWRkeS5waHAnICk7CgkJCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3RleHRyZXBsYWNlYnVkZHknXSA9IG5ldyBwYl9iYWNrdXBidWRkeV90ZXh0cmVwbGFjZWJ1ZGR5KCk7CgkJCX07CgkJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1sndGV4dHJlcGxhY2VidWRkeSddLT5zZXRfbWV0aG9kcyggYXJyYXkoICdjb21tYW5kbGluZScgKSApOyAvLyBkb250IGZhbGxiYWNrIGludG8gdGV4dCB2ZXJzaW9uIGhlcmUuCgkJCQoJCQkkcmVnZXhfY29uZGl0aW9uID0gIihJTlNFUlQgSU5UT3xDUkVBVEUgVEFCTEV8UkVGRVJFTkNFU3xDT05TVFJBSU5UfEFMVEVSIFRBQkxFKSAoYD8peyRvbGRfcHJlZml4fShgPykiOwoJCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3RleHRyZXBsYWNlYnVkZHknXS0+c3RyaW5nX3JlcGxhY2UoICRzcWxfZmlsZSwgJG9sZF9wcmVmaXgsICR0aGlzLT5fZGF0YWJhc2VfcHJlZml4LCAkcmVnZXhfY29uZGl0aW9uICk7CgkJCQoJCQkkc3FsX2ZpbGUgPSAkc3FsX2ZpbGUgLiAnLnRtcCc7IC8vIE5ldyBTUUwgZmlsZSBjcmVhdGVkIGJ5IHRleHRyZXBsYWNlYnVkZHkuCgkJfQoJCQoJCQoJCS8qKioqKioqKioqIEJlZ2luIHByZXBhcmluZyBjb21tYW5kICoqKioqKioqKiovCgkJLy8gSGFuZGxlIFdpbmRvd3Mgd2FudGluZyAuZXhlLiBOb3RlOiBleGVjdXRhYmxlIGRpcmVjdG9yeSBwYXRoIGlzIHByZXBlbmRlZCBvbiBleGVjKCkgbGluZSBvZiBjb2RlLgoJCWlmICggc3RyaXN0ciggUEhQX09TLCAnV0lOJyApICYmICFzdHJpc3RyKCBQSFBfT1MsICdEQVJXSU4nICkgKSB7IC8vIFJ1bm5pbmcgV2luZG93cy4gKG5vdCBkYXJ3aW4pCgkJCSRjb21tYW5kID0gJ21zcWwuZXhlJzsKCQl9IGVsc2UgewoJCQkkY29tbWFuZCA9ICdteXNxbCc7CgkJfQoJCQoJCS8vIEhhbmRsZSBwb3NzaWJsZSBzb2NrZXRzLgoJCWlmICggJHRoaXMtPl9kYXRhYmFzZV9zb2NrZXQgIT0gJycgKSB7CgkJCSRjb21tYW5kIC49ICIgLS1zb2NrZXQ9eyR0aGlzLT5fZGF0YWJhc2Vfc29ja2V0fSI7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ215c3FsYnVkZHk6IFVzaW5nIHNvY2tldHMgaW4gY29tbWFuZC4nICk7CgkJfQoJCQoJCS8vJGNvbW1hbmQgLj0gIiAtLWhvc3Q9eyR0aGlzLT5fZGF0YWJhc2VfaG9zdH0gLS11c2VyPXskdGhpcy0+X2RhdGFiYXNlX3VzZXJ9IC0tcGFzc3dvcmQ9eyR0aGlzLT5fZGF0YWJhc2VfcGFzc30gLS1kZWZhdWx0X2NoYXJhY3Rlcl9zZXQgdXRmOCB7JHRoaXMtPl9kYXRhYmFzZV9uYW1lfSA8IHskc3FsX2ZpbGV9IjsKCQkkY29tbWFuZCAuPSAiIC0taG9zdD0iIC4gZXNjYXBlc2hlbGxhcmcoJHRoaXMtPl9kYXRhYmFzZV9ob3N0KSAuICIgLS11c2VyPSIgLiBlc2NhcGVzaGVsbGFyZygkdGhpcy0+X2RhdGFiYXNlX3VzZXIpIC4gIiAtLXBhc3N3b3JkPSIgLiBlc2NhcGVzaGVsbGFyZygkdGhpcy0+X2RhdGFiYXNlX3Bhc3MpIC4gIiAtLWRlZmF1bHRfY2hhcmFjdGVyX3NldCB1dGY4ICIgLiBlc2NhcGVzaGVsbGFyZygkdGhpcy0+X2RhdGFiYXNlX25hbWUpIC4gIiAyPiYxIDwgeyRzcWxfZmlsZX0iOyAvLyAyPiYxIHJlZGlyZWN0IFNUREVSUiB0byBTVERPVVQuCgkJLyoqKioqKioqKiogRW5kIHByZXBhcmluZyBjb21tYW5kICoqKioqKioqKiovCgkJCgkJLy8gUnVuIGNvbW1hbmQuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogUnVubmluZyBpbXBvcnQgdmlhIGNvbW1hbmQgbGluZSBuZXh0LicgKTsKCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICR0aGlzLT5fbXlzcWxfZGlyZWN0b3J5IC4gJGNvbW1hbmQgKTsKCQkKCQkKCQkvLyBUT0RPOiBSZW1vdmVkIG15c3FsIHBpbmdpbmcgaGVyZS4gRG8gd2UgbmVlZCAob3IgZXZlbiB3YW50KSB0aGF0IGhlcmU/CgkJCgkJCgkJLy8gQ2hlY2sgdGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uLgoJCWlmICggJGV4ZWNfZXhpdF9jb2RlID09ICcwJyApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnbXlzcWxidWRkeTogQ29tbWFuZCBhcHBlYXJzIHRvIHN1Y2NlZWRlZCBhbmQgcmV0dXJuZWQgcHJvcGVyIHJlc3BvbnNlLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsYnVkZHk6IENvbW1hbmQgZGlkIG5vdCBleGl0IG5vcm1hbGx5LiBGYWxsaW5nIGJhY2sgdG8gZGF0YWJhc2UgZHVtcCBjb21wYXRpYmlsaXR5IG1vZGVzLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkKCQkvLyBTaG91bGQgbmV2ZXIgZ2V0IHRvIGhlcmUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ215c3FsYnVkZHk6IFVuY2F1Z2h0IGV4Y2VwdGlvbiAjNDMzMDUzODkwLicgKTsKCQlyZXR1cm4gZmFsc2U7Cgl9IC8vIEVuZCBfaW1wb3J0X2NvbW1hbmRsaW5lKCkuCgkKCQoJCglmdW5jdGlvbiBzdHJpbmdfYmVnaW5zX3dpdGgoICRzdHJpbmcsICRzZWFyY2ggKSB7CgkJcmV0dXJuICggc3RybmNtcCggJHN0cmluZywgJHNlYXJjaCwgc3RybGVuKCRzZWFyY2gpICkgPT0gMCApOwoJfQoJCgkKCQoJLyoJX2ltcG9ydF9waHAoKQoJICoJCgkgKglJbXBvcnQgZnJvbSAuU1FMIGZpbGUgaW50byBkYXRhYmFzZSB2aWEgUEhQIGJ5IHJlYWRpbmcgaW4gZmlsZSBsaW5lIGJ5IGxpbmUuCgkgKglVc2luZyBjb2RlYmFzZSBmcm9tIEJhY2t1cEJ1ZGR5IC8gaW1wb3J0YnVkZHkgMi54LgoJICoJQHNlZSBpbXBvcnQoKS4KCSAqCUBzaW5jZSAyLnguCgkgKgkKCSAqCUBwYXJhbQkJU0VFIGltcG9ydCgpIFBBUkFNRVRFUlMhIQoJICoJQHJldHVybgkJbWl4ZWQJCQlUcnVlIG9uIHN1Y2Nlc3MgKGFuZCBjb21wbGV0aW9uKSwgaW5jb21wbGV0ZS9jaHVua2luZyByZXF1aXJlZD0gYXJyYXkoIGZpbGUgcG9pbnRlcltmb3IgcmVzdW1pbmddLCBxdWVyaWVzIHNvIGZhcltpbmZvcm1hdGl2ZSBvbmx5XSApLCBmYWxzZSBvbiBmYWlsdXJlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX2ltcG9ydF9waHAoICRzcWxfZmlsZSwgJG9sZF9wcmVmaXgsICRyZXN1bWVQb2ludCA9ICcnLCAkaWdub3JlX2V4aXN0aW5nID0gZmFsc2UgKSB7CgoJCSR0aGlzLT50aW1lX3N0YXJ0ID0gbWljcm90aW1lKCB0cnVlICk7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnU3RhcnRpbmcgaW1wb3J0IG9mIFNRTCBkYXRhLi4uIFRoaXMgbWF5IHRha2UgYSBtb21lbnQuLi4nICk7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyAoJ2RldGFpbHMnLCAnTG9hZGluZyBTUUwgZnJvbSBmaWxlIGAnIC4gJHNxbF9maWxlIC4gJ2AuJyApOwoJCQoJCQoJCS8vIE9wZW4gU1FMIGZpbGUgZm9yIHJlYWRpbmcuCgkJaWYgKCBGQUxTRSA9PT0gKCAkZnMgPSBAZm9wZW4oICRzcWxfZmlsZSwgJ3InICkgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM5MDA5OiBVbmFibGUgdG8gZmluZCBhbnkgZGF0YWJhc2UgYmFja3VwIGRhdGEgaW4gdGhlIHNlbGVjdGVkIGJhY2t1cCBvciBjb3VsZCBub3Qgb3BlbiBmaWxlIChwb3NzaWJseSBkdWUgdG8gcGVybWlzc2lvbnMpLiBUcmllZCBvcGVuaW5nIGZpbGUgYCcgLiAkc3FsX2ZpbGUgLiAnYC4gRXJyb3IgIzkwMDkuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCS8vIElmIGNodW5rZWQgcmVzdW1pbmcgdGhlbiBzZWVrIHRvIHRoZSBjb3JyZWN0IHBsYWNlIGluIHRoZSBmaWxlLgoJCWlmICggKCAnJyAhPSAkcmVzdW1lUG9pbnQgKSAmJiAoICRyZXN1bWVQb2ludCA+IDAgKSApIHsgCgkJCWlmICggMCAhPT0gZnNlZWsoICRmcywgJHJlc3VtZVBvaW50ICkgKSB7IC8vIFJldHVybnMgMCBvbiBzdWNjZXNzLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICM5NDgzNDUzOiBGYWlsZWQgdG8gc2VlayBTUUwgZmlsZSB0byByZXN1bWUgcG9pbnQgYCcgLiAkcmVzdW1lUG9pbnQgLiAnYCB2aWEgZnNlZWsoKS4nICk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJCgkJLy8gTG9vcCB0aHJvdWdoIGZpbGUgbGluZS1ieS1saW5lLCBleGVjdXRpbmcgdGhlIFNRTCBhcyB3ZSBnby4gUHJlZml4IHdpbGwgYmUgY2hhbmdlZCBsaW5lIGJ5IGxpbmUgYXMgbmVlZGVkLgoJCSRxdWVyeUNvdW50ID0gMDsKCQkkZmFpbGVkUXVlcmllcyA9IDA7CgkJJHByZXZRdWVyeURhdGEgPSAnJzsKCQl3aGlsZSAoIEZBTFNFICE9PSAoICRxdWVyeSA9IGZnZXRzKCAkZnMgKSApICkgeyAvLyBHcmFiIGxpbmUgYnkgbGluZSBhcyBsb25nIGFzIGZnZXRzIGRvZXNuJ3QgcmV0dXJuIEZBTFNFLgoJCQkKCQkJLy8gQ2xlYW4gdXAgU1FMIGFuZCBpZ25vcmUgYW55IGNvbW1lbnQgbGluZXMuCgkJCS8vJHF1ZXJ5ID0gdHJpbSggJHF1ZXJ5ICk7CgkJCWlmICggZW1wdHkoICRxdWVyeSApIHx8ICggJHRoaXMtPnN0cmluZ19iZWdpbnNfd2l0aCggJHF1ZXJ5LCAnLyohNDAxMDMnICkgKSApIHsgLy8gSWYgYmxhbmsgbGluZSBvciBzdGFydHMgd2l0aCAvKiE0MDEwMyAobXlzcWxkdW1wIGZpbGUgaGFzIHRoaXMganVuayBpbiBpdCkuCgkJCQljb250aW51ZTsKCQkJfQoJCQkKCQkJaWYgKCBGQUxTRSA9PT0gc3RycG9zKCAkcXVlcnksICc7JyApICkgeyAvLyBEb24ndCBoYXZlIHRoZSBmdWxsIHF1ZXJ5IHlldC4gTmVlZCB0byBncmFiIG1vcmUgbGluZXMuCgkJCQkkcHJldlF1ZXJ5RGF0YSAuPSAkcXVlcnk7CgkJCQljb250aW51ZTsgLy8gR28gZ3JhYiBtb3JlLgoJCQl9CgkJCQoJCQkvLyBFeGVjdXRlIHRoZSBTUUwgbGluZS4KCQkJaWYgKCBGQUxTRSA9PT0gKCAkcmVzdWx0ID0gJHRoaXMtPl9pbXBvcnRfc3FsX2R1bXBfbGluZSggdHJpbSggJHByZXZRdWVyeURhdGEgLiAkcXVlcnkgKSwgJG9sZF9wcmVmaXgsICRpZ25vcmVfZXhpc3RpbmcgKSApICkgeyAvLyBBZGRlZCB0cmltKCkgYXMgb2YgQkIgdjUgdG8gcmlwIG9mZiBzb21ldGltZXMtbGVhZGluZyBuZXdsaW5lIGNoYXIuCgkJCQkvLyBHb3QgRkFMU0UgYXMgcmVzcG9uc2UuLi4gU2tpcHBlZCBxdWVyeSBzbyBjb250aW51ZSB0byB0aGUgbmV4dC4KCQkJCSRmYWlsZWRRdWVyaWVzKys7CgkJCQljb250aW51ZTsKCQkJfQoJCQkkcHJldlF1ZXJ5RGF0YSA9ICcnOyAvLyBDbGVhciBvdXQgYW55IHByZXZpb3VzIHF1ZXJ5IGRhdGEgdGhhdCB3YXMgbm90IHVzZWQgZHVlIHRvIG5vdCBoYXZpbmcgdGhlIGZ1bGwgc3RhdGVtZW50LgoJCQkkcXVlcnlDb3VudCsrOwoJCQkKCQkJLy8gU2hvdyBhIGhlYXJ0YmVhdCB0byBrZWVwIHVzZXIgdXAgdG8gZGF0ZSBbYW5kIGVudGVydGFpbmVkIDspXS4KCQkJaWYgKCAwID09PSAoICRxdWVyeUNvdW50ICUgc2VsZjo6SEVBUlRCRUFUX0NPVU5UX0xJTUlUICkgKSB7IC8vIERpc3BsYXkgZXZlcnkgWCBxdWVyaWVzLgoJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnV29ya2luZy4uLiBJbXBvcnRlZCAnIC4gJHF1ZXJ5Q291bnQgLiAnIHF1ZXJpZXMgc28gZmFyLicgKTsKCQkJfQoJCQkKCQkJLy8gSWYgd2UgYXJlIHdpdGhpbiAxIHNlY29uZCBvZiByZWFjaGluZyBtYXhpbXVtIFBIUCBydW50aW1lIHRoZW4gc3RvcCBoZXJlIHNvIHRoYXQgaXQgY2FuIGJlIHBpY2tlZCB1cCBpbiBhbm90aGVyIFBIUCBwcm9jZXNzLi4uCgkJCWlmICggKCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnRpbWVfc3RhcnQgKSArIHNlbGY6OlRJTUVfV0lHR0xFX1JPT00gKSA+PSAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdBcHByb2FjaGluZyBsaW1pdCBvZiBhdmFpbGFibGUgUEhQIGNodW5raW5nIHRpbWUgb2YgYCcgLiAkdGhpcy0+X21heEV4ZWN1dGlvblRpbWUgLiAnYCBzZWMuIFJhbiBmb3IgJyAuIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0LCAzICkgLiAnIHNlYy4gUHJvY2VlZGluZyB0byB1c2UgY2h1bmtpbmcuJyApOwoJCQkJaWYgKCBGQUxTRSA9PT0gKCAkZnNQb2ludGVyID0gZnRlbGwoICRmcyApICkgKSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ0Vycm9yICMzMjg5MjM4OiBVbmFibGUgdG8gZ2V0IGZ0ZWxsIHBvaW50ZXIgb2YgU1FMIGZpbGUgaGFuZGxlLicgKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQlAZmNsb3NlKCAkZnMgKTsKCQkJCXJldHVybiBhcnJheSggJGZzUG9pbnRlciwgJHF1ZXJ5Q291bnQsICRmYWlsZWRRdWVyaWVzLCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gJHRoaXMtPnRpbWVfc3RhcnQgKSApOyAvLyBmaWxlcG9pbnRlciBsb2NhdGlvbiwgbnVtYmVyIG9mIHF1ZXJpZXMgZG9uZSB0aGlzIHBhc3MsIG51bWJlciBvZiBzcWwgcWV1cmllcyB0aGF0IGZhaWxlZCwgZWxhcHNlZCB0aW1lIGR1cmluZyB0aGUgaW1wb3J0CgkJCX0gLy8gRW5kIGlmLgoJCQkKCQl9IC8vIGVuZCB3aGlsZS4KCQkKCQlpZiAoICEgZmVvZiggJGZzICkgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjODk0NDM6IGZnZXRzIGZhaWxlZCBwcmVtYXR1cmVseS4gTm90IGF0IEVPRi4nICk7CgkJCXJldHVybiBGQUxTRTsKCQl9CgkJZmNsb3NlKCAkZnMgKTsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICdJbXBvcnQgb2YgU1FMIGRhdGEgaW4gUEhQIG1vZGUgY29tcGxldGUuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1Rvb2sgJyAuIHJvdW5kKCBtaWNyb3RpbWUoIHRydWUgKSAtICR0aGlzLT50aW1lX3N0YXJ0LCAzICkgLiAnIHNlY29uZHMgb24gJyAuICRxdWVyeUNvdW50IC4gJyBxdWVyaWVzLiAnICk7CgkJCgkJcmV0dXJuIHRydWU7CgkJCgl9IC8vIEVuZCBfaW1wb3J0X3BocCgpLgoJCgkKCQoJLyoqCgkgKglfaW1wb3J0X3NxbF9kdW1wX2xpbmUoKQoJICoKCSAqCUltcG9ydHMgYSBsaW5lL3F1ZXJ5IGludG8gdGhlIGRhdGFiYXNlLgoJICoJSGFuZGxlcyB1c2luZyB0aGUgc3BlY2lmaWVkIHRhYmxlIHByZWZpeC4KCSAqCUBzaW5jZSAyLnguCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSRxdWVyeQkJCVF1ZXJ5IHN0cmluZyB0byBydW4gZm9yIGltcG9ydGluZy4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkb2xkX3ByZWZpeAkJT2xkIHByZWZpeC4gKG5ldyBwcmVmaXggd2FzIHBhc3NlZCBpbiBjb25zdHJ1Y3RvcikuCgkgKglAcmV0dXJuCQlib29sZWFuCQkJCQkJVHJ1ZT1zdWNjZXNzLCBGYWxzZT1mYWlsZWQuCgkgKgoJICovCglmdW5jdGlvbiBfaW1wb3J0X3NxbF9kdW1wX2xpbmUoICRxdWVyeSwgJG9sZF9wcmVmaXgsICRpZ25vcmVfZXhpc3RpbmcgKSB7CgkJJG5ld19wcmVmaXggPSAkdGhpcy0+X2RhdGFiYXNlX3ByZWZpeDsKCQkKCQkkcXVlcnlfb3BlcmF0b3JzID0gJ0lOU0VSVCBJTlRPfENSRUFURSBUQUJMRXxSRUZFUkVOQ0VTfENPTlNUUkFJTlR8QUxURVIgVEFCTEV8XC9cKiFcZCtccytBTFRFUiBUQUJMRSc7CgkJCgkJLy8gUmVwbGFjZSBkYXRhYmFzZSBwcmVmaXggaW4gcXVlcnkuCgkJaWYgKCAkb2xkX3ByZWZpeCAhPT0gJG5ld19wcmVmaXggKSB7CgkJCSRxdWVyeSA9IHByZWdfcmVwbGFjZSggIi9eKCRxdWVyeV9vcGVyYXRvcnMpKFxzK2A/KSRvbGRfcHJlZml4L2kiLCAiXCR7MX1cJHsyfSRuZXdfcHJlZml4IiwgJHF1ZXJ5ICk7IC8vIDQtMjktMTEKCQl9CgkJCgkJLy8gT3V0cHV0IHdoaWNoIHRhYmxlIHdlIGFyZSBhYmxlIHRvIGNyZWF0ZSB0byBoZWxwIGdldCBhbiBpZGVhIHdoZXJlIHdlIGFyZSBpbiB0aGUgaW1wb3J0LgoJCWlmICggMSA9PSBwcmVnX21hdGNoKCAiL15DUkVBVEUgVEFCTEUgYD8oKFx3fC0pKylgPy9pIiwgJHF1ZXJ5LCAkbWF0Y2hlcyApICkgewoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdDcmVhdGluZyB0YWJsZSBgJyAuICRtYXRjaGVzWzFdIC4gJ2AuJyApOwoJCQlpZiAoIGRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCQkJCWVjaG8gIjxzY3JpcHQ+YmJfYWN0aW9uKCAnaW1wb3J0aW5nVGFibGUnLCAnIiAuICRtYXRjaGVzWzFdIC4gIicgKTs8L3NjcmlwdD4iOwoJCQl9CgkJfQoJCQoJCWdsb2JhbCAkd3BkYjsKCQkKCQkvLyBSdW4gdGhlIHF1ZXJ5CgkJJHJlc3VsdHMgPSAkd3BkYi0+cXVlcnkoICRxdWVyeSApOwoJCQoJCWlmICggZmFsc2UgPT09ICRyZXN1bHRzICkgewoJCQlpZiAoICRpZ25vcmVfZXhpc3RpbmcgIT09IHRydWUgKSB7CgkJCQkkbXlzcWxfZXJyb3IgPSBAbXlzcWxfZXJyb3IoICR3cGRiLT5kYmggKTsKCQkJCWlmICggJycgPT0gJG15c3FsX2Vycm9yICkgewoJCQkJCSRteXNxbF9lcnJvciA9ICR3cGRiLT5sYXN0X2Vycm9yOwoJCQkJfQoJCQkJCgkJCQkkbXlzcWxfOTAxMF9sb2cgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L215c3FsXzkwMTBfbG9nLScgLiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JzsKCQkJCWlmICggMCA9PSAkdGhpcy0+XzkwMTBzX2VuY291bnRlcmVkICkgeyAvLyBQbGFjZSBhIGhlYWRlciBhdCB0aGUgdG9wIG9mIHRoaXMgbG9nIHdpdGggc29tZSBkZWJ1Z2dpbmcgaW5mby4KCQkJCQkvL0B1bmxpbmsoICRteXNxbF85MDEwX2xvZyApOyAvLyBEZWxldGUgaWYgYWxyZWFkeSBleGlzdHMgdG8gYXZvaWQgbXVsdGlwbGUgbG9nZ2luZyBvZiBlbnRpcmUgcHJvY2Vzcy4gTk8gTE9OR0VSIERFTEVURUQgc2luY2UgdGhpcyBtYXkgYmUgbXVsdGlwYXJ0IGNodW5rZWQuCgkJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCAkbXlzcWxfOTAxMF9sb2csCgkJCQkJCSIjIyMjI1xuIyBUaGlzIGxvZyBjb250YWlucyBhbGwgOTAxMCBlcnJvcnMgZW5jb3VudGVyZWQuXG4jIE9sZCBwcmVmaXg6IGB7JG9sZF9wcmVmaXh9YC5cbiMgTmV3IHByZWZpeDogYHskbmV3X3ByZWZpeH1gLlxuIyBUaW1lOiBgIiAuIHRpbWUoKSAuICJgLlxuIyMjIyNcbnskdGVzdH1cbiIsCgkJCQkJCUZJTEVfQVBQRU5ECgkJCQkJKTsKCQkJCX0KCQkJCQoJCQkJQGZpbGVfcHV0X2NvbnRlbnRzKCAkbXlzcWxfOTAxMF9sb2csCgkJCQkJIlFVRVJZOlxuIiAuICRxdWVyeSAuCgkJCQkJIkVSUk9SOlxuIiAuICRteXNxbF9lcnJvciAuICJcblxuIiwKCQkJCQlGSUxFX0FQUEVORAoJCQkJKTsKCQkJCQoJCQkJJHRoaXMtPl85MDEwc19lbmNvdW50ZXJlZCsrOwoJCQkJaWYgKCAkdGhpcy0+XzkwMTBzX2VuY291bnRlcmVkID4gJHRoaXMtPl9tYXhfOTAxMHNfYWxsb3dlZCApIHsgLy8gVG9vIG1hbnksIGRvbid0IHNob3cgbW9yZS4KCQkJCQlpZiAoICR0aGlzLT5fOTAxMHNfZW5jb3VudGVyZWQgPT0gKCAkdGhpcy0+X21heF85MDEwc19hbGxvd2VkICsgMSApICkgewoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnQWRkaXRpb25hbCA5MDEwIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkIGJ1dCBoYXZlIG5vdCBiZWVuIGRpc3BsYXllZCB0byBhdm9pZCBmbG9vZGluZyB0aGUgc2NyZWVuLiBBbGwgOTAxMCBlcnJvcnMgYXJlIGxvZ2dlZCB0byBgJyAuICRteXNxbF85MDEwX2xvZyAuICdgIGlmIHBvc3NpYmxlLicgKTsKCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBTaG93IGVycm9yLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICdFcnJvciAjOTAxMDogVW5hYmxlIHRvIGltcG9ydCBTUUwgcXVlcnkuIEVycm9yOiBgJyAuICRteXNxbF9lcnJvciAuICdgLicgKTsKCQkJCQlpZiAoIGZhbHNlICE9PSBzdHJpc3RyKCAkbXlzcWxfZXJyb3IsICdzZXJ2ZXIgaGFzIGdvbmUgYXdheScgKSApIHsgLy8gaWYgc3RyaW5nIGRlbm90ZXMgdGhhdCBteXNxbCBzZXJ2ZXIgaGFzIGdvbmUgYXdheSBiYWlsIHNpbmNlIGl0IHdpbGwgbGlrZWx5IGp1c3QgZmxvb2QgdXNlciB3aXRoIGVycm9ycy4uLgoJCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnRXJyb3IgIzkwMTBiOiBIYWx0aW5nIGJhY2t1cCBwcm9jZXNzIGFzIG15c3FsIHNlcnZlciBoYXMgZ29uZSBhd2F5IGFuZCBkYXRhYmFzZSBkYXRhIGNvdWxkIG5vdCBiZSBpbXBvcnRlZC4gVHlwaWNhbGx5IHRoZSByZXN0b3JlIGNhbm5vdCBjb250aW51ZSBzbyB0aGUgcHJvY2VzcyBoYXMgYmVlbiBoYWx0ZWQuIFRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBwcm9ibGVtYXRpYyBteXNxbCBzZXJ2ZXIgYXQgeW91ciBob3N0aW5nIHByb3ZpZGVyLCBsb3cgbXlzcWwgdGltZW91dHMsIGV0Yy4gQ29udGFjdCB5b3VyIGhvc3RpbmcgY29tcGFueSBmb3Igc3VwcG9ydC4nICk7CgkJCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0xhc3QgcXVlcnkgYXR0ZW1wdGVkOiBgJyAuICRxdWVyeSAuICdgLicgKTsKCQkJCQkJZGllKCAnRXJyb3IgIzk0ODM0MzogRkFUQUwgRVJST1IgLSBJTVBPUlQgSEFMVEVEJyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCQoJfSAvLyBFbmQgX2ltcG9ydF9zcWxfZHVtcF9saW5lKCkuCgkKCQoJCn0gLy8gRW5kIHBiX2JhY2t1cGJ1ZGR5X215c3FsYnVkZHkgY2xhc3MuCg==
###PACKDATA,FILE_END,/lib/mysqlbuddy/mysqlbuddy.php,importbuddy/lib/mysqlbuddy/mysqlbuddy.php
###PACKDATA,FILE_START,/lib/textreplacebuddy/index.php,importbuddy/lib/textreplacebuddy/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/lib/textreplacebuddy/index.php,importbuddy/lib/textreplacebuddy/index.php
###PACKDATA,FILE_START,/lib/textreplacebuddy/textreplacebuddy.php,importbuddy/lib/textreplacebuddy/textreplacebuddy.php
PD9waHAKLyoJcGJfYmFja3VwYnVkZHlfdGV4dHJlcGxhY2VidWRkeSBjbGFzcwogKgkKICoJQGF1dGhvciBEdXN0aW4gQm9sdG9uIDwgaHR0cDovL2R1c3RpbmJvbHRvbi5jb20gPgogKglAc2luY2UgMy4wLjAKICoKICoJVGV4dCByZXBsYWNlbWVudHMgdXNpbmcgY29tbWFuZCBsaW5lIGlmIGF2YWlsYWJsZS4gVGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gZG8gdGV4dCByZXBsYWNlbWVudHMKICoJb24gYSBsYXJnZSBzY2FsZSBpbiBQSFAgZWZmaWNpZW50bHkuCiAqCiAqCVJlc3VsdGluZyBmaWxlIHN0b3JlZCBhdCAkZmlsZSAuICcudG1wJy4gT3JpZ2luYWwgZmlsZSBpcyBOT1QgcmVwbGFjZWQuCiAqCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV90ZXh0cmVwbGFjZWJ1ZGR5IHsKCQoJCgkvKioqKioqKioqKiBQcm9wZXJ0aWVzICoqKioqKioqKiovCgkKCQoJcHJpdmF0ZSAkX3ZlcnNpb24gPSAnMC4wLjInOwkJCQkJCQkJCQkJCQkJCQkJCS8vIEludGVybmFsIHZlcnNpb24gbnVtYmVyIGZvciB0aGlzIGxpYnJhcnkuCgkKCXByaXZhdGUgJF9tZXRob2RzID0gYXJyYXkoKTsJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIEF2YWlsYWJsZSBtZWNoYW5pc21zIGZvciBkdW1waW5nIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuCglwcml2YXRlICRfY29tbWFuZGJ1ZGR5OwoJCgkvKioqKioqKioqKiBNZXRob2RzICoqKioqKioqKiovCgkKCQoJLyoJX19jb25zdHJ1Y3QoKQoJICoJCgkgKglEZWZhdWx0IGNvbnN0cnVjdG9yLgoJICoJCgkgKglAcGFyYW0JCWFycmF5CQkkZm9yY2VfbWV0aG9kcwkJCU9wdGlvbmFsIHBhcmFtZXRlciB0byBvdmVycmlkZSBhdXRvbWF0aWMgbWV0aG9kIGRldGVjdGlvbi4gU2tpcHMgdGVzdCBhbmQgcnVucyBmaXJzdCBtZXRob2QgZmlyc3QuICBGYWxscyBiYWNrIHRvIG90aGVyIG1ldGhvZHMgaWYgYW55IGZhaWx1cmUuCgkgKglAcmV0dXJuCQkKCSAqLwoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkZm9yY2VfbWV0aG9kcyA9IGFycmF5KCkgKSB7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogTG9hZGluZyB0ZXh0cmVwbGFjZWJ1ZGR5IGxpYnJhcnkuJyApOwoJCQoJCS8vIEhhbmRsZXMgY29tbWFuZCBsaW5lIGV4ZWN1dGlvbi4KCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvY29tbWFuZGJ1ZGR5L2NvbW1hbmRidWRkeS5waHAnICk7CgkJJHRoaXMtPl9jb21tYW5kYnVkZHkgPSBuZXcgcGJfYmFja3VwYnVkZHlfY29tbWFuZGJ1ZGR5KCk7CgkJCgkJLy8gU2V0IG1lY2hhbmlzbSBmb3IgZHVtcGluZyAvIHJlc3RvcmluZy4KCQlpZiAoIGNvdW50KCAkZm9yY2VfbWV0aG9kcyApID4gMCApIHsgLy8gTWVjaGFuaXNtIGZvcmNlZC4gT3ZlcnJpZGluZyBhdXRvbWF0aWMgY2hlY2suCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ3RleHRyZXBsYWNlYnVkZHk6IFNldHRpbmdzIG92ZXJyaWRpbmcgYXV0b21hdGljIGRldGVjdGlvbiBvZiBhdmFpbGFibGUgZGF0YWJhc2UgZHVtcCBtZXRob2RzLiBVc2luZyBmb3JjZWQgb3ZlcnJpZGUgbWV0aG9kczogYCcgLiBpbXBsb2RlKCAnLCcsICRmb3JjZV9tZXRob2RzICkgLiAnYC4nICk7CgkJCSR0aGlzLT5fbWV0aG9kcyA9ICRmb3JjZV9tZXRob2RzOwoJCX0gZWxzZSB7IC8vIE5vIG1ldGhvZCBkZWZpbmVkOyBhdXRvLWRldGVjdCB0aGUgYmVzdC4KCQkJJHRoaXMtPl9tZXRob2RzID0gJHRoaXMtPmF2YWlsYWJsZV90ZXh0cmVwbGFjZV9tZXRob2RzKCk7CgkJfQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ3RleHRyZXBsYWNlYnVkZHk6IERldGVjdGVkIHRleHQgcmVwbGFjZW1lbnQgbWV0aG9kczogYCcgLiBpbXBsb2RlKCAnLCcsICR0aGlzLT5fbWV0aG9kcyApIC4gJ2AuJyApOwoJCQoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCQoJCgkKCS8qCWF2YWlsYWJsZV9kdW1wX21ldGhvZHMoKQoJICoJCgkgKglmdW5jdGlvbiBkZXNjcmlwdGlvbgoJICoJCgkgKglAcGFyYW0JCQoJICoJQHJldHVybgkJc3RyaW5nCQkJCVBvc3NpYmxlIHJldHVybnM6ICBteXNxbGR1bXAsIHBocAoJICovCglwdWJsaWMgZnVuY3Rpb24gYXZhaWxhYmxlX3RleHRyZXBsYWNlX21ldGhvZHMoKSB7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2UgdGVzdDogVGVzdGluZyBhdmFpbGFibGUgdGV4dCByZXBsYWNlbWVudCBtZXRob2RzLicgKTsKCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2V4ZWMnICkgKSB7IC8vIEV4ZWMgaXMgYXZhaWxhYmxlIHNvIHRlc3QgbXlzcWxkdW1wIGZyb20gaGVyZS4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2UgdGVzdDogZXhlYygpIGZ1bmN0aW9uIGV4aXN0cy4gVGVzdGluZyBydW5uaW5nIHNlZCAodGV4dCByZXBsYWNlIGNvbW1hbmQpIHZpYSBleGVjKCkuJyApOwoJCQkKCQkJCgkJCS8qKioqKioqKioqIEJlZ2luIHByZXBhcmluZyBjb21tYW5kICoqKioqKioqKiovCgkJCS8vIEhhbmRsZSBXaW5kb3dzIHdhbnRpbmcgLmV4ZS4KCQkJaWYgKCBzdHJpc3RyKCBQSFBfT1MsICdXSU4nICkgJiYgIXN0cmlzdHIoIFBIUF9PUywgJ0RBUldJTicgKSApIHsgLy8gUnVubmluZyBXaW5kb3dzLiAobm90IGRhcndpbikKCQkJCXJldHVybiBhcnJheSggJ3BocCcgKTsgLy8gTm90aGluZyBnb29kIGluIFdpbmRvd3MgYXZhaWxhYmxlIHRvIHRleHQgcmVwbGFjZS4KCQkJfSBlbHNlIHsKCQkJCSRjb21tYW5kID0gImVjaG8gYmFja3VwIHwgc2VkICdzL2JhY2t1cC9idWRkeS8nIjsgLy8gV2lsbCBhdHRlbXB0IHRvIHJlcGxhY2UgYmFja3VwIHdpdGggYnVkZHkKCQkJfQoJCQkKCQkJLy8gUmVkaXJlY3QgU1RERVJSIHRvIFNURE9VVC4KCQkJJGNvbW1hbmQgLj0gJyAgMj4mMSc7CgkJCQoJCQkvKioqKioqKioqKiBFbmQgcHJlcGFyaW5nIGNvbW1hbmQgKioqKioqKioqKi8KCQkJCgkJCQoJCQkvLyBSdW4gY29tbWFuZC4KCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2UgdGVzdDogUnVubmluZyB0ZXN0IGNvbW1hbmQgbmV4dC4nICk7CgkJCWxpc3QoICRleGVjX291dHB1dCwgJGV4ZWNfZXhpdF9jb2RlICkgPSAkdGhpcy0+X2NvbW1hbmRidWRkeS0+ZXhlY3V0ZSggJGNvbW1hbmQgKTsKCQkJCgkJCWlmICggc3RyaXN0ciggaW1wbG9kZSggJyAnLCAkZXhlY19vdXRwdXQgKSwgJ2J1ZGR5JyApICE9PSBmYWxzZSApIHsgLy8gU3RyaW5nIFZlciBhcHBlYXJlZCBpbiByZXNwb25zZSBvciB1c2FnZSBleHBsYW5hdGlvbnMuIFNvbWUgdmVyc2lvbiBkb250IGdpdmUgdmVyc2lvbi4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlIHRlc3Q6IENvbW1hbmQgYXBwZWFycyB0byBiZSBhY2Nlc3NpYmxlIGFuZCByZXR1cm5zIGV4cGVjdGVkIHJlc3BvbnNlLicgKTsKCQkJCXJldHVybiBhcnJheSggJ2NvbW1hbmRsaW5lJywgJ3BocCcgKTsgLy8gbXlzcWxkdW1wIGJlc3QsIHBocCBuZXh0LgoJCQl9CgkJCQoJCQkKCQl9IGVsc2UgeyAvLyBObyBleGVjKCkgc28gbXVzdCBmYWxsIGJhY2sgdG8gUEhQIG1ldGhvZCBvbmx5LgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICd0ZXh0cmVwbGFjZSB0ZXN0OiBGYWxsaW5nIGJhY2sgdG8gdGV4dHJlcGxhY2UgY29tcGF0aWJpbGl0eSBtb2RlIChQSFAgcmVwbGFjZSkuIFRoaXMgaXMgc2xvd2VyIGFuZCBtb3JlIG1lbW9yeSBpbnRlbnNpdmUuJyApOwoJCQlyZXR1cm4gYXJyYXkoICdwaHAnICk7CgkJfQoJCQoJCXJldHVybiBhcnJheSggJ3BocCcgKTsKCQkKCX0gLy8gRW5kIGF2YWlsYWJsZV9kdW1wX21ldGhvZCgpLgoJCgkKCQoJLyoJcmVwbGFjZSgpCgkgKgkKCSAqCVJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiBhIHN0cmluZyB3aXRoaW4gYSBmaWxlLiBBdXRvbWF0aWNhbGx5IGZhbGxzIGJhY2suCgkgKglSZXN1bHRpbmcgZmlsZSBzdG9yZWQgaW4gJGZpbGUgLiAndG1wJy4gT3JpZ2luYWwgZmlsZSBpcyBOT1QgcmVwbGFjZWQuCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSRmaWxlCQkJCUZ1bGwgZmlsZSBwYXRoIHRvIGZpbGUgdG8gc2VhcmNoLiBBIC50bXAgdmVyc2lvbiBpcyBtYWRlIHdpdGggdGhlIGZpbmFsIHJlc3VsdHMuIE9yaWdpbmFsIGZpbGUgaXMgTk9UIHJlcGxhY2VkLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRzZWFyY2gJCQkJU3RyaW5nIHRvIHNlYXJjaCBmb3IuCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlcGxhY2VtZW50CQlTdHJpbmcgdG8gcmVwbGFjZSB3aXRoLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRyZWdleF9jb25kaXRpb24JQ29uZGl0aW9uIHdoZW4gcmVwbGFjZW1lbnRzIG1heSBoYXBwZW4uIE9wdGlvbmFsLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRyZWdleF9yZXBsYWNlCQlJZiBmYWxsZW4gYmFjayBpbnRvIFBIUCBtb2RlIHRoZW4gdGhpcyBpcyBuZWVkZWQgSUYgJHJlZ2V4X2NvbmRpdGlvbiBpcyBwYXNzZWQuIE9wdGlvbmFsLgoJICoJQHJldHVybgoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RyaW5nX3JlcGxhY2UoICRmaWxlLCAkc2VhcmNoLCAkcmVwbGFjZW1lbnQsICRyZWdleF9jb25kaXRpb24gPSAnJywgJHJlZ2V4X3JlcGxhY2UgPSAnJyApIHsKCQkkcmV0dXJuID0gZmFsc2U7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ21lc3NhZ2UnLCAnU3RhcnRpbmcgdGV4dCByZXBsYWNlbWVudCBwcm9jZWR1cmUuJyApOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgInRleHRyZXBsYWNlIGJlaW5nIHBlcmZvcm1lZCBvbiBmaWxlIGB7JGZpbGV9YCByZXBsYWNpbmcgYHskc2VhcmNofWAgd2l0aCBgeyRyZXBsYWNlbWVudH1gLiIgKTsKCQkKCQkvLyBBdHRlbXB0IGVhY2ggbWV0aG9kIGluIG9yZGVyLgoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ1ByZXBhcmluZyB0byB0ZXh0cmVwbGFjZSB1c2luZyBhdmFpbGFibGUgbWV0aG9kKHMpIGJ5IHByaW9yaXR5LiBNZXRob2RzOiBgJyAuIGltcGxvZGUoICcsJywgJHRoaXMtPl9tZXRob2RzICkgLiAnYCcgKTsKCQlmb3JlYWNoKCAkdGhpcy0+X21ldGhvZHMgYXMgJG1ldGhvZCApIHsKCQkJaWYgKCBtZXRob2RfZXhpc3RzKCAkdGhpcywgIl9zdHJpbmdyZXBsYWNlX3skbWV0aG9kfSIgKSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IEF0dGVtcHRpbmcgcmVwbGFjZSBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AuJyApOwoJCQkJJHJlc3VsdCA9IGNhbGxfdXNlcl9mdW5jKCBhcnJheSggJHRoaXMsICJfc3RyaW5ncmVwbGFjZV97JG1ldGhvZH0iICksICRmaWxlLCAkc2VhcmNoLCAkcmVwbGFjZW1lbnQsICRyZWdleF9jb25kaXRpb24sICRyZWdleF9yZXBsYWNlICk7CgkJCQkKCQkJCWlmICggJHJlc3VsdCA9PT0gdHJ1ZSApIHsgLy8gRHVtcCBjb21wbGV0ZWQgc3VjY2VzZnVsbHkgd2l0aCB0aGlzIG1ldGhvZC4KCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBSZXBsYWNlIG1ldGhvZCBgJyAuICRtZXRob2QgLiAnYCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LicgKTsKCQkJCQkkcmV0dXJuID0gdHJ1ZTsKCQkJCQlicmVhazsKCQkJCX0gZWxzZWlmICggJHJlc3VsdCA9PT0gZmFsc2UgKSB7IC8vIER1bXAgZmFpbGVkIHRoaXMgbWV0aG9kLiBXaWxsIHRyeSBjb21wYXRpYmlsaXR5IGZhbGxiYWNrIHRvIG5leHQgbW9kZSBpZiBhYmxlLgoJCQkJCS8vIERvIG5vdGhpbmcuIFdpbGwgdHJ5IG5leHQgbW9kZSBuZXh0IGxvb3AuCgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogUmVwbGFjZSBtZXRob2QgYCcgLiAkbWV0aG9kIC4gJ2AgZmFpbGVkLiBUcnlpbmcgYW5vdGhlciBjb21wYXRpYmlsaXR5IG1vZGUgbmV4dCBpZiBhYmxlLicgKTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogVW5leGVwZWN0ZWQgcmVzcG9uc2U6IGAnIC4gaW1wbG9kZSggJywnLCAkcmVzdWx0ICkgLiAnYCcgKTsKCQkJCX0KCQkJfQoJCX0KCQkKCQlpZiAoICRyZXR1cm4gPT09IHRydWUgKSB7IC8vIFN1Y2Nlc3MuCgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ1RleHQgcmVwbGFjZSBwcm9jZWR1cmUgc3VjY2VlZGVkLicgKTsKCQkJcmV0dXJuIHRydWU7CgkJfSBlbHNlIHsgLy8gT3ZlcmFsbCBmYWlsdXJlLgoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZXJyb3InLCAnVGV4dCByZXBsYWNlIHByb2NlZHVyZSBmYWlsZWQuJyApOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJfSAvLyBFbmQgZHVtcCgpLgoJCgkKCQoJLyoJX3N0cmluZ3JlcGxhY2VfY29tbWFuZGxpbmUoKQoJICoJCgkgKglQZXJmb3JtcyBhY3R1YWwgY29tbWFuZCBsaW5lIHN0cmluZyByZXBsYWNlbWVudC4gVklBIHNlZCAoY29tbWFuZCBsaW5lIHJlcGxhY2UpLgoJICoJQ2FzZSBzZW5zaXRpdmUuCgkgKglSZXN1bHRpbmcgZmlsZSBzdG9yZWQgaW4gJGZpbGUgLiAndG1wJy4gT3JpZ2luYWwgZmlsZSBpcyBOT1QgcmVwbGFjZWQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkZmlsZQkJCQlGdWxsIGZpbGUgcGF0aCB0byBmaWxlIHRvIHJlcGxhY2UgaW4uIGEgLnRtcCB2ZXJzaW9uIGlzIHRlbXBvcmFyaWx5IG1hZGUuCgkgKglAcGFyYW0JCXN0cmluZwkJJHNlYXJjaAkJCQlTdHJpbmcgdG8gc2VhcmNoIGZvci4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVwbGFjZW1lbnQJCVN0cmluZyB0byByZXBsYWNlIHdpdGguCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlZ2V4X2NvbmRpdGlvbglDb25kaXRpb24gd2hlbiByZXBsYWNlbWVudHMgbWF5IGhhcHBlbi4gT3B0aW9uYWwuCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlZ2V4X3JlcGxhY2UJCU5PVCB1c2VkIGluIGNvbW1hbmRsaW5lIG1vZGUuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRnbG9iYWwJCQkJV2hldGhlciBvciBub3QgdG8gZ2xvYmFsbHkgcmVwbGFjZSBpbiByZWdleC4gRGVmYXVsdDogZmFsc2UgKG9ubHkgcmVwbGFjZSBmaXJzdCBpbnN0YW5jZSBwZXIgbGluZSkuCgkgKglAcmV0dXJuCQlib29sZWFuCQkJCQkJCVRydWUgb24gc3VjY2VzczsgZWxzZSBmYWxzZS4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfc3RyaW5ncmVwbGFjZV9jb21tYW5kbGluZSggJGZpbGUsICRzZWFyY2gsICRyZXBsYWNlbWVudCwgJHJlZ2V4X2NvbmRpdGlvbiA9ICcnLCAkcmVnZXhfcmVwbGFjZSA9ICcnLCAkZ2xvYmFsID0gZmFsc2UgKSB7CgkJCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAndGV4dHJlcGxhY2VidWRkeTogUHJlcGFyaW5nIHRvIHJ1biBjb21tYW5kIGxpbmUgc2VkIChyZXBsYWNlbWVudCBjb21tZW50KSB2aWEgZXhlYygpLicgKTsKCQkKCQkvLyBIYW5kbGUgb3B0aW9uYWwgZ2xvYmFsIHJlcGxhY2VtZW50LgoJCWlmICggJGdsb2JhbCA9PT0gdHJ1ZSApIHsKCQkJJGdsb2JhbF9mbGFnID0gJ2cnOwoJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBVc2luZyBnbG9iYWwgcmVwbGFjZSBwZXIgbGluZS4nICk7CgkJfSBlbHNlIHsKCQkJJGdsb2JhbF9mbGFnID0gJyc7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IFVzaW5nIGZpcnN0IGluc3RhbmNlIHJlcGxhY2UgcGVyIGxpbmUuJyApOwoJCX0KCQkKCQkvKioqKioqKioqKiBCZWdpbiBwcmVwYXJpbmcgY29tbWFuZCAqKioqKioqKioqLwoJCS8vIEhhbmRsZSBXaW5kb3dzIHdhbnRpbmcgLmV4ZS4KCQlpZiAoIHN0cmlzdHIoIFBIUF9PUywgJ1dJTicgKSAmJiAhc3RyaXN0ciggUEhQX09TLCAnREFSV0lOJyApICkgeyAvLyBSdW5uaW5nIFdpbmRvd3MuIChub3QgZGFyd2luKQoJCQlyZXR1cm4gZmFsc2U7CgkJfSBlbHNlIHsKCQkJaWYgKCAkcmVnZXhfY29uZGl0aW9uID09ICcnICkgeyAvLyBOb3JtYWwgc3RyaW5nIHJlcGxhY2UuCgkJCQkkY29tbWFuZCA9ICJzZWQgcy97JHNlYXJjaH0veyRyZXBsYWNlbWVudH0veyRnbG9iYWxfZmxhZ30geyRmaWxlfSA+IHskZmlsZX0udG1wIjsKCQkJfSBlbHNlIHsgLy8gQ3VzdG9tIHJlZ2V4IGNvbmRpdGlvbnMuCgkJCQkkY29tbWFuZCA9ICJzZWQgLUUgJy97JHJlZ2V4X2NvbmRpdGlvbn0vcy97JHNlYXJjaH0veyRyZXBsYWNlbWVudH0veyRnbG9iYWxfZmxhZ30nIHskZmlsZX0gPiB7JGZpbGV9LnRtcCI7CgkJCX0KCQl9CgkJCgkJLy8gUmVkaXJlY3QgU1RERVJSIHRvIFNURE9VVC4KCQkkY29tbWFuZCAuPSAnICAyPiYxJzsKCQkKCQkvKioqKioqKioqKiBFbmQgcHJlcGFyaW5nIGNvbW1hbmQgKioqKioqKioqKi8KCQkKCQkvLyBSdW4gY29tbWFuZC4KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBSdW5uaW5nIHJlcGxhY2UgY29tbWFuZCB2aWEgZXhlYyBuZXh0LicgKTsKCQlsaXN0KCAkZXhlY19vdXRwdXQsICRleGVjX2V4aXRfY29kZSApID0gJHRoaXMtPl9jb21tYW5kYnVkZHktPmV4ZWN1dGUoICRjb21tYW5kICk7CgkJCgkJLy8gQ2hlY2sgdGhlIHJlc3VsdC4KCQlpZiAoICRleGVjX2V4aXRfY29kZSA9PSAnMCcgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IENvbW1hbmQgYXBwZWFycyB0byBzdWNjZWVkZWQgYW5kIHJldHVybmVkIHByb3BlciByZXNwb25zZS4nICk7CgkJCWlmICggZmlsZV9leGlzdHMoICRmaWxlIC4gJy50bXAnICkgKSB7IC8vIFRlbXAgcmVwbGFjZW1lbnQgZmlsZSBmb3VuZC4gU1VDQ0VTUyEKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdtZXNzYWdlJywgJ3RleHRyZXBsYWNlYnVkZHk6IFRlbXBvcmFyeSB0ZXh0IHJlcGxhY2VtZW50IGZpbGUgY3JlYXRpb24gdmVyaWZpZWQuJyApOwoJCQkJLyoKCQkJCWlmICggdHJ1ZSA9PT0gcmVuYW1lKCAkZmlsZSAuICcudG1wJywgJGZpbGUgKSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnbWVzc2FnZScsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBUZW1wb3JhcnkgbW92ZWQgYmFjayB0byBvcmlnaW5hbCBmaWxlLiBTdWNjZXNzLicgKTsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0gZWxzZSB7CgkJCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3RleHRyZXBsYWNlYnVkZHk6IFRlbXBvcmFyeSBjb3VsZCBub3QgYmUgbW92ZWQgYmFjayB0byBvcmlnaW5hbCBmaWxlLiBGYWlsdXJlLiBWZXJpZnkgcGVybWlzc2lvbnMuJyApOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCSovCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfSBlbHNlIHsgLy8gU1FMIGZpbGUgTUlTU0lORy4gRkFJTFVSRSEKCQkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBUaG91Z2ggY29tbWFuZCByZXBvcnRlZCBzdWNjZXNzIHRlbXBvcmFyeSByZXBsYWNlbWVudCBmaWxlIGlzIG1pc3Npbmc6IGAnIC4gJG91dHB1dF9maWxlIC4gJ2AuJyApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSBlbHNlIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3RleHRyZXBsYWNlYnVkZHk6IENvbW1hbmQgZGlkIG5vdCBleGl0IG5vcm1hbGx5LiBGYWxsaW5nIGJhY2sgdG8gdGV4dCByZXBsYWNlbWVudCBjb21wYXRpYmlsaXR5IG1vZGVzLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQkKCQkvLyBTaG91bGQgbmV2ZXIgZ2V0IHRvIGhlcmUuCgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3RleHRyZXBsYWNlYnVkZHk6IFVuY2F1Z2h0IGV4Y2VwdGlvbiAjNDUzMjM4OTAuJyApOwoJCXJldHVybiBmYWxzZTsKCQkKCX0gLy8gRW5kIF9zdHJpbmdyZXBsYWNlX2NvbW1hbmRsaW5lKCkuCgkKCQoJCgkvKglfc3RyaW5ncmVwbGFjZV9waHAoKQoJICoJCgkgKglQZXJmb3JtcyBhY3R1YWwgY29tbWFuZCBsaW5lIHN0cmluZyByZXBsYWNlbWVudC4gVklBIFBIUC4KCSAqCUNhc2Ugc2Vuc2l0aXZlLgoJICoJUmVzdWx0aW5nIGZpbGUgc3RvcmVkIGluICRmaWxlIC4gJ3RtcCcuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkZmlsZQkJCQlGdWxsIGZpbGUgcGF0aCB0byBmaWxlIHRvIHJlcGxhY2UgaW4uIGEgLnRtcCB2ZXJzaW9uIGlzIHRlbXBvcmFyaWx5IG1hZGUuCgkgKglAcGFyYW0JCXN0cmluZwkJJHNlYXJjaAkJCQlTdHJpbmcgdG8gc2VhcmNoIGZvci4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVwbGFjZW1lbnQJCVN0cmluZyB0byByZXBsYWNlIHdpdGguCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlZ2V4X2NvbmRpdGlvbglDb25kaXRpb24gd2hlbiByZXBsYWNlbWVudHMgbWF5IGhhcHBlbi4gT3B0aW9uYWwuCgkgKglAcGFyYW0JCXN0cmluZwkJJHJlZ2V4X3JlcGxhY2UJCUlmIGZhbGxlbiBiYWNrIGludG8gUEhQIG1vZGUgdGhlbiB0aGlzIGlzIG5lZWRlZCBJRiAkcmVnZXhfY29uZGl0aW9uIGlzIHBhc3NlZC4gT3B0aW9uYWwuCgkgKglAcmV0dXJuCQlib29sZWFuCQkJCQkJCVRydWUgb24gc3VjY2VzczsgZWxzZSBmYWxzZS4KCSAqLwoJcHJpdmF0ZSBmdW5jdGlvbiBfc3RyaW5ncmVwbGFjZV9waHAoICRmaWxlLCAkc2VhcmNoLCAkcmVwbGFjZW1lbnQsICRyZWdleF9jb25kaXRpb24gPSAnJywgJHJlZ2V4X3JlcGxhY2UgPSAnJyApIHsKCQkKCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBTdGFydGluZyBjb21wdGliaWxpdHkgbW9kZSBQSFAgdGV4dCByZXBsYWNlbWVudC4nICk7CgkJCgkJCgkJJGZpbGVfbyA9IGZvcGVuKCAkZmlsZSwgJ3InICk7CgkJJHRlbXAgPSAkZmlsZSAuICcudG1wJzsKCQkKCQlpZiAoICFpc193cml0YWJsZSggJHRlbXAgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3RleHRyZXBsYWNlYnVkZHk6IFBlcm1pc3Npb24gZGVuaWVkIHdyaXRpbmcgdGVtcG9yYXJ5IGZpbGUgYCcgLiAkdGVtcCAuICdgLicgKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQlpZiAoIGlzX3Jlc291cmNlKCAkZmlsZV9vICkgPT09IHRydWUgKSB7CgkJCXdoaWxlICggZmVvZiggJGZpbGVfbyApID09PSBmYWxzZSApIHsKCQkJCgkJCQlpZiAoICRyZWdleF9jb25kaXRpb24gIT0gJycgKSB7IC8vIHJlZ2V4CgkJCQkJJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoICIvXnskcmVnZXhfY29uZGl0aW9ufS9pIiwgJHJlZ2V4X3JlcGxhY2UsIGZnZXRzKCAkZmlsZV9vICkgKTsKCQkJCX0gZWxzZSB7IC8vIHN0YW5kYXJkIHN0cmluZwoJCQkJCSRjb250ZW50ID0gc3RyX3JlcGxhY2UoICRzZWFyY2gsICRyZXBsYWNlbWVudCwgZmdldHMoICRmaWxlX28gKSApOwoJCQkJfQoJCQkJZmlsZV9wdXRfY29udGVudHMoICR0ZW1wLCAkY29udGVudCwgRklMRV9BUFBFTkQgKTsKCQkJfQoJCQkKCQkJZmNsb3NlKCAkZmlsZV9vICk7CgkJfQoJCQoJCS8vdW5saW5rKCRmaWxlKTsKCQkKCQkvKgoJCSRyZXN1bHQgPSByZW5hbWUoICR0ZW1wLCAkZmlsZSApOwoJCWlmICggJHJlc3VsdCA9PT0gZmFsc2UgKSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdlcnJvcicsICd0ZXh0cmVwbGFjZWJ1ZGR5OiBVbmFibGUgdG8gbW92ZSB0ZW1wb3JhcnkgZmlsZSBiYWNrIHRvIG9yaWdpbmFsIGZpbGUuIEZhaWx1cmUuJyApOwoJCX0gZWxzZSB7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ3RleHRyZXBsYWNlYnVkZHk6IE1vdmVkIHRlbXBvcmFyeSBmaWxlIGJhY2sgdG8gb3JpZ2luYWwgZmlsZS4gU3VjY2Vzcy4nICk7CgkJfQoJCSovCgkJCgkJcmV0dXJuICRyZXN1bHQ7CgkJCgl9IC8vIEVuZCBfc3RyaW5ncmVwbGFjZV9waHAoKS4KCQoJCgkKCS8qCWdldF9tZXRob2RzKCkKCSAqCQoJICoJR2V0IGFuIGFycmF5IG9mIG1ldGhvZHMuIE5vdGU6IElmIGZvcmNlIG92ZXJyaWRpbmcgbWV0aG9kcyB0aGVuIGRldGVjdGVkIG1ldGhvZHMgd2lsbCBub3QgYmUgYWJsZSB0byBkaXNwbGF5LgoJICoJCgkgKglAcmV0dXJuCQlhcnJheQkJCQlBcnJheSBvZiBtZXRob2RzLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X21ldGhvZHMoKSB7CgkJcmV0dXJuICR0aGlzLT5fbWV0aG9kczsKCX0gLy8gRW5kIGdldF9tZXRob2RzKCkuCgkKCQoJCgkvKglzZXRfbWV0aG9kcygpCgkgKgkKCSAqCVNldCBtZXRob2RzLiBPdmVycmlkZXMgZGV0ZWN0ZWQuCgkgKgkKCSAqCUBwYXJhbQkJYXJyYXkJCSRtZXRob2RzCQlBcnJheSBvZiBtZXRob2RzIHRvIHNldC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9tZXRob2RzKCAkbWV0aG9kcyA9IGFycmF5KCkgKSB7CgkJJHRoaXMtPl9tZXRob2RzID0gJG1ldGhvZHM7Cgl9IC8vIEVuZCBzZXRfbWV0aG9kcygpLgoJCgkKCQp9IC8vIEVuZCBwYl9iYWNrdXBidWRkeV9teXNxbGJ1ZGR5IGNsYXNzLgo/Pg==
###PACKDATA,FILE_END,/lib/textreplacebuddy/textreplacebuddy.php,importbuddy/lib/textreplacebuddy/textreplacebuddy.php
###PACKDATA,FILE_START,/lib/cpanel/cpanel.php,importbuddy/lib/cpanel/cpanel.php
PD9waHAKLyoKRVhBTVBMRToKCnJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2xpYi9jcGFuZWwvY3BhbmVsLnBocCcgKTsKIAokY3BhbmVsX3VzZXIgPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3VzZXInICk7CiRjcGFuZWxfcGFzc3dvcmQgPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Bhc3MnICk7CiRjcGFuZWxfaG9zdCA9ICJmb28uY29tIjsKJGRiX25hbWUgPSAnYXBwbGVzJzsKJGRiX3VzZXIgPSAnb3Jhbmdlcyc7CiRkYl9wYXNzID0gJ2JhbmFuYXMnOwokY3JlYXRlX2RiX3Jlc3VsdCA9IHBiX2JhY2t1cGJ1ZGR5X2NwYW5lbDo6Y3JlYXRlX2RiKCAkY3BhbmVsX3VzZXIsICRjcGFuZWxfcGFzc3dvcmQsICRjcGFuZWxfaG9zdCwgJGRiX25hbWUsICRkYl91c2VyLCAkZGJfcGFzcyApOwoKaWYgKCAkY3JlYXRlX2RiX3Jlc3VsdCA9PT0gdHJ1ZSApIHsKCWVjaG8gJ1N1Y2Nlc3MhIENyZWF0ZWQgZGF0YWJhc2UsIHVzZXIsIGFuZCBhc3NpZ25lZCB1c2VkIHRvIGRhdGFiYXNlLic7Cn0gZWxzZSB7CgllY2hvICdFcnJvcihzKTo8YnI+PHByZT4nIC4gcHJpbnRfciggJGNyZWF0ZV9kYl9yZXN1bHQsIHRydWUgKSAuICc8L3ByZT4nOwp9CgoqLwoKCgovKglwYl9iYWNrdXBidWRkeV9jcGFuZWwgQ2xhc3MKICoJCiAqCU1hbmFnZSBzb21lIGNwYW5lbCBzZXR0aW5ncy4KICoJCiAqCUBhdXRob3IJCUR1c3RpbiBCb2x0b24gPGh0dHA6Ly9kdXN0aW5ib2x0b24uY29tPiBTZXB0IDIwMTIuIFVwZGF0ZWQgZm9yIGFwaTIgYnkgSmVyZW15LgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfY3BhbmVsIHsKCgoJLy8gVE9ETzogVXNlIG1vcmUgcm9idXN0IHRoYW4gZmlsZV9nZXRfY29udGVudHMoKS4KCgkKCS8qCWNyZWF0ZV9kYigpCgkgKgkKCSAqCUNyZWF0ZSBhIGRhdGFiYXNlIGFuZCBhc3NpZ24gYSB1c2VyIHRvIGl0IHdpdGggYWxsIHByaXZpbGFnZXMuCgkgKgkKCSAqCUBwYXJhbQkJCgkgKglAcmV0dXJuCQl0cnVlfGFycmF5CQlCb29sZWFuIHRydWUgb24gc3VjY2VzcywgZWxzZSBhbiBhcnJheSBvZiBlcnJvcnMuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlX2RiKCAkY3BhbmVsX3VzZXIsICRjcGFuZWxfcGFzc3dvcmQsICRjcGFuZWxfaG9zdCwgJGRiX25hbWUsICRkYl91c2VyLCAkZGJfdXNlcnBhc3MsICRjcGFuZWxfcG9ydCA9ICcyMDgyJyApIHsKCQkkY3BhbmVsX3NraW4gPSAieDMiOwoJCSRlcnJvcnMgPSBhcnJheSgpOwoJCQoJCSRjcGFuZWxfcGFzc3dvcmQgPSB1cmxlbmNvZGUoICRjcGFuZWxfcGFzc3dvcmQgKTsgLy8gUGFzcyBvZnRlbiBoYXMgc3BlY2lhbCBjaGFycyBzbyBlbmNvZGUuCgkJCgkJLy8gQ2FsY3VsYXRlIGJhc2UgVVJMLgovLyAJCSRiYXNlX3VybCA9ICJodHRwOi8veyRjcGFuZWxfdXNlcn06eyRjcGFuZWxfcGFzc3dvcmR9QHskY3BhbmVsX2hvc3R9OnskY3BhbmVsX3BvcnR9L2Zyb250ZW5kL3skY3BhbmVsX3NraW59IjsKCQkkYmFzZV91cmwgPSAiaHR0cDovL3skY3BhbmVsX3VzZXJ9OnskY3BhbmVsX3Bhc3N3b3JkfUB7JGNwYW5lbF9ob3N0fTp7JGNwYW5lbF9wb3J0fS9leGVjdXRlL015c3FsIjsKCQkKCQkvLyBHZW5lcmF0ZSBjcmVhdGUgZGF0YWJhc2UgVVJMLgovLyAJCSRjcmVhdGVfZGF0YWJhc2VfdXJsID0gJGJhc2VfdXJsIC4gIi9zcWwvYWRkYi5odG1sP2RiPXskZGJfbmFtZX0iOwoJCSRjcmVhdGVfZGF0YWJhc2VfdXJsID0gJGJhc2VfdXJsIC4gIi9jcmVhdGVfZGF0YWJhc2U/bmFtZT17JGNwYW5lbF91c2VyfV97JGRiX25hbWV9IjsKCQkvL2VjaG8gJGNyZWF0ZV9kYXRhYmFzZV91cmwgLiAnPGJyPic7CgkJCgkJCgkJLy8gQ3JlYXRlIHJlcXVlc3QgY29yZSBvYmogZm9yIGNvbm5lY3RpbmcgdG8gSFRUUC4KCQkkcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q29yZSggJGNyZWF0ZV9kYXRhYmFzZV91cmwgKTsKCQl0cnkgewoJCQkkcmVzdWx0ID0gJHJlcXVlc3QtPnNlbmRfcmVxdWVzdCggdHJ1ZSApOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCQlpZiAoIHN0cmlzdHIoICRlLT5nZXRNZXNzYWdlKCksICdjb3VsZG5cJ3QgY29ubmVjdCB0byBob3N0JyApICE9PSBmYWxzZSApIHsKCQkJCSRlcnJvcnNbXSA9ICdVbmFibGUgdG8gY29ubmVjdCB0byBob3N0IGAnIC4gJGNwYW5lbF9ob3N0IC4gJ2Agb24gcG9ydCBgJyAuICRjcGFuZWxfcG9ydCAuICdgLiBWZXJpZnkgdGhlIGNQYW5lbCBkb21haW4vVVJMIGFuZCBtYWtlIHN1cmUgdGhlIHNlcnZlciBpcyBhYmxlIHRvIGluaXRpYXRlIG91dGdvaW5nIGh0dHAgY29ubmVjdGlvbnMgb24gcG9ydCAnIC4gJGNwYW5lbF9wb3J0IC4gJy4gU29tZSBob3N0cyBibG9jayB0aGlzLic7CgkJCQlyZXR1cm4gJGVycm9yczsKCQkJfQoJCQkkZXJyb3JzW10gPSAnQ2F1Z2h0IGV4Y2VwdGlvbjogJyAuICRlLT5nZXRNZXNzYWdlKCk7CgkJCXJldHVybiAkZXJyb3JzOwoJCX0KCQkKCQkKCQkvLyBHZW5lcmF0ZSBjcmVhdGUgZGF0YWJhc2UgdXNlciBVUkwuCi8vIAkJJGNyZWF0ZV91c2VyX3VybCA9ICRiYXNlX3VybCAuICIvc3FsL2FkZHVzZXIuaHRtbD91c2VyPXskZGJfdXNlcn0mcGFzcz17JGRiX3VzZXJwYXNzfSI7CgkJJGNyZWF0ZV91c2VyX3VybCA9ICRiYXNlX3VybCAuICIvY3JlYXRlX3VzZXI/bmFtZT17JGNwYW5lbF91c2VyfV97JGRiX3VzZXJ9JnBhc3N3b3JkPXskZGJfdXNlcnBhc3N9IjsKCQkvL2VjaG8gJGNyZWF0ZV91c2VyX3VybCAuICc8YnI+JzsKCQkKCQkvLyBHZW5lcmF0ZSBhc3NpZ24gdXNlciBkYXRhYmFzZSBhY2Nlc3MgVVJMLgovLyAJCSRhc3NpZ25fdXNlcl91cmwgPSAkYmFzZV91cmwgLiAiL3NxbC9hZGR1c2VydG9kYi5odG1sP3VzZXI9eyRjcGFuZWxfdXNlcn1feyRkYl91c2VyfSZkYj17JGNwYW5lbF91c2VyfV97JGRiX25hbWV9JkFMTD1BTEwiOwoJCSRhc3NpZ25fdXNlcl91cmwgPSAkYmFzZV91cmwgLiAiL3NldF9wcml2aWxlZ2VzX29uX2RhdGFiYXNlP3VzZXI9eyRjcGFuZWxfdXNlcn1feyRkYl91c2VyfSZkYXRhYmFzZT17JGNwYW5lbF91c2VyfV97JGRiX25hbWV9JnByaXZpbGVnZXM9QUxMIjsKCQkvL2VjaG8gJGFzc2lnbl91c2VyX3VybCAuICc8YnI+JzsKCQkKCQlpZiAoIGZhbHNlID09PSAkcmVzdWx0LT5pc09LKCkgKSB7CgkJCSRlcnJvcnNbXSA9ICdVbmFibGUgdG8gY3JlYXRlIGRhdGFiYXNlIC0gcmVzcG9uc2Ugc3RhdHVzIGNvZGU6ICcgLiAgJHJlc3VsdC0+c3RhdHVzOwoJCX0gZWxzZSB7CQoJCQkkcmVzdWx0X2FycmF5ID0ganNvbl9kZWNvZGUoICRyZXN1bHQtPmJvZHksIHRydWUgKTsKCQkJaWYgKCBpc3NldCggJHJlc3VsdF9hcnJheVsgJ3N0YXR1cycgXSApICYmICggMCA9PSAkcmVzdWx0X2FycmF5WyAnc3RhdHVzJyBdICkgKSB7CgkJCQkvLyBzdGF0dXMgPSAwIG1lYW5zIGEgZmFpbHVyZQoJCQkJJGVycm9yc1tdID0gJ1VuYWJsZSB0byBjcmVhdGUgZGF0YWJhc2U6JzsKCQkJCWlmICggaXNzZXQoICRyZXN1bHRfYXJyYXlbICdlcnJvcnMnIF0gKSAmJiAoIGlzX2FycmF5KCAkcmVzdWx0X2FycmF5WyAnZXJyb3JzJyBdICkgKSApIHsKCQkJCQlmb3JlYWNoICggJHJlc3VsdF9hcnJheVsgJ2Vycm9ycycgXSBhcyAkZXJyb3IgKSB7CgkJCQkJCSRlcnJvcnNbXSA9ICRlcnJvcjsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJCi8vIAkJaWYgKCBzdHJpc3RyKCAkcmVzdWx0LCAnTG9nIGluJyApICE9PSBmYWxzZSApIHsgLy8gTm8gc3VjZXNzIGFkZGluZyBEQi4KLy8gCQkJJGVycm9yc1tdID0gJ1VuYWJsZSB0byBsb2cgaW50byBjUGFuZWwgd2l0aCBnaXZlbiB1c2VybmFtZS9wYXNzd29yZC4gVmVyaWZ5IHRoZSBjcmVkZW50aWFscyBhcmUgY29ycmVjdCBmb3IgdGhpcyBjUGFuZWwgZG9tYWluLic7Ci8vIAkJfQovLyAJCWlmICggc3RyaXN0ciggJHJlc3VsdCwgJ0FkZGVkIHRoZSBEYXRhYmFzZScgKSA9PT0gZmFsc2UgKSB7IC8vIE5vIHN1Y2VzcyBhZGRpbmcgREIuCi8vIAkJCSRlcnJvcnNbXSA9ICdFcnJvciBlbmNvdW50ZXJlZCBhZGRpbmcgZGF0YWJhc2UuJzsKLy8gCQl9Ci8vIAkJaWYgKCBzdHJpc3RyKCAkcmVzdWx0LCAncHJvYmxlbSBjcmVhdGluZyB0aGUgZGF0YWJhc2UnICkgIT09IGZhbHNlICkgeyAvLyBTb21ldGhpbmcgZmFpbGVkLgovLyAJCQkkZXJyb3JzW10gPSAnVW5hYmxlIHRvIGNyZWF0ZSBkYXRhYmFzZS4nOwovLyAJCX0KLy8gCQlpZiAoIHN0cmlzdHIoICRyZXN1bHQsICdkYXRhYmFzZSBuYW1lIGFscmVhZHkgZXhpc3RzJyApICE9PSBmYWxzZSApIHsgLy8gREIgYWxyZWFkeSBleGlzdHMuCi8vIAkJCSRlcnJvcnNbXSA9ICdUaGUgZGF0YWJhc2UgbmFtZSBhbHJlYWR5IGV4aXN0cy4nOwovLyAJCX0KCQkKCQkKCQkvLyBSdW4gY3JlYXRlIGRhdGFiYXNlIHVzZXIuCgkJaWYgKCBjb3VudCggJGVycm9ycyApID09PSAwICkgewoJCQkkcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q29yZSggJGNyZWF0ZV91c2VyX3VybCApOwoJCQl0cnkgewoJCQkJJHJlc3VsdCA9ICRyZXF1ZXN0LT5zZW5kX3JlcXVlc3QoIHRydWUgKTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CgkJCQkkZXJyb3JzW10gPSAnQ2F1Z2h0IGV4Y2VwdGlvbjogJyAuICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlyZXR1cm4gJGVycm9yczsKCQkJfQoJCQkKCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdC0+aXNPSygpICkgewoJCQkJJGVycm9yc1tdID0gJ1VuYWJsZSB0byBjcmVhZXQgdXNlciAtIHJlc3BvbnNlIHN0YXR1cyBjb2RlOiAnIC4gICRyZXN1bHQtPnN0YXR1czsKCQkJfSBlbHNlIHsJCgkJCQkkcmVzdWx0X2FycmF5ID0ganNvbl9kZWNvZGUoICRyZXN1bHQtPmJvZHksIHRydWUgKTsKCQkJCWlmICggaXNzZXQoICRyZXN1bHRfYXJyYXlbICdzdGF0dXMnIF0gKSAmJiAoIDAgPT0gJHJlc3VsdF9hcnJheVsgJ3N0YXR1cycgXSApICkgewoJCQkJCS8vIHN0YXR1cyA9IDAgbWVhbnMgYSBmYWlsdXJlCgkJCQkJJGVycm9yc1tdID0gJ1VuYWJsZSB0byBjcmVhdGUgdXNlcjonOwoJCQkJCWlmICggaXNzZXQoICRyZXN1bHRfYXJyYXlbICdlcnJvcnMnIF0gKSAmJiAoIGlzX2FycmF5KCAkcmVzdWx0X2FycmF5WyAnZXJyb3JzJyBdICkgKSApIHsKCQkJCQkJZm9yZWFjaCAoICRyZXN1bHRfYXJyYXlbICdlcnJvcnMnIF0gYXMgJGVycm9yICkgewoJCQkJCQkJJGVycm9yc1tdID0gJGVycm9yOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCi8vIAkJCWlmICggc3RyaXN0ciggJHJlc3VsdCwgJ0FkZGVkIHVzZXInICkgPT09IGZhbHNlICkgeyAvLyBObyBzdWNjZXNzIGFkZGluZyB1c2VyLgovLyAJCQkJJGVycm9yc1tdID0gJ0Vycm9yIGVuY291bnRlcmVkIGFkZGluZyB1c2VyLic7Ci8vIAkJCX0KLy8gCQkJaWYgKCBzdHJpc3RyKCAkcmVzdWx0LCAnWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYSBNeVNRTCB1c2VyJyApID09PSBmYWxzZSApIHsgLy8gTm8gc3VjY2VzcyBhZGRpbmcgdXNlci4KLy8gCQkJCSRlcnJvcnNbXSA9ICdFcnJvciBlbmNvdW50ZXJlZCBhZGRpbmcgdXNlci4nOwovLyAJCQl9Ci8vIAkJCWlmICggc3RyaXN0ciggJHJlc3VsdCwgJ05vIHBhc3N3b3JkIGdpdmVuJyApICE9PSBmYWxzZSApIHsgLy8gQWxyZWFkeSBleGlzdHMuCi8vIAkJCQkkZXJyb3JzW10gPSAnTm8gcGFzc3dvcmQgZ2l2ZW4uJzsKLy8gCQkJfQovLyAJCQlpZiAoIHN0cmlzdHIoICRyZXN1bHQsICdleGlzdHMgaW4gdGhlIGRhdGFiYXNlJyApICE9PSBmYWxzZSApIHsgLy8gQWxyZWFkeSBleGlzdHMuCi8vIAkJCQkkZXJyb3JzW10gPSAnVXNlcm5hbWUgYWxyZWFkeSBleGlzdHMuJzsKLy8gCQkJfQoJCX0KCQkKCQkvLyBSdW4gYXNzaWduIHVzZXIgdG8gZGF0YWJhc2UuCgkJaWYgKCBjb3VudCggJGVycm9ycyApID09PSAwICkgewoJCQkkcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q29yZSggJGFzc2lnbl91c2VyX3VybCApOwoJCQl0cnkgewoJCQkJJHJlc3VsdCA9ICRyZXF1ZXN0LT5zZW5kX3JlcXVlc3QoIHRydWUgKTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CgkJCQkkZXJyb3JzW10gPSAnQ2F1Z2h0IGV4Y2VwdGlvbjogJyAuICRlLT5nZXRNZXNzYWdlKCk7CgkJCQlyZXR1cm4gJGVycm9yczsKCQkJfQoJCQkKCQkJaWYgKCBmYWxzZSA9PT0gJHJlc3VsdC0+aXNPSygpICkgewoJCQkJJGVycm9yc1tdID0gJ1VuYWJsZSB0byBzZXQgcHJpdmlsZWdlcyBmb3IgdXNlciAtIHJlc3BvbnNlIHN0YXR1cyBjb2RlOiAnIC4gICRyZXN1bHQtPnN0YXR1czsKCQkJfSBlbHNlIHsJCgkJCQkkcmVzdWx0X2FycmF5ID0ganNvbl9kZWNvZGUoICRyZXN1bHQtPmJvZHksIHRydWUgKTsKCQkJCWlmICggaXNzZXQoICRyZXN1bHRfYXJyYXlbICdzdGF0dXMnIF0gKSAmJiAoIDAgPT0gJHJlc3VsdF9hcnJheVsgJ3N0YXR1cycgXSApICkgewoJCQkJCS8vIHN0YXR1cyA9IDAgbWVhbnMgYSBmYWlsdXJlCgkJCQkJJGVycm9yc1tdID0gJ1VuYWJsZSB0byBzZXQgcHJpdmlsZWdlcyBmb3IgdXNlcjonOwoJCQkJCWlmICggaXNzZXQoICRyZXN1bHRfYXJyYXlbICdlcnJvcnMnIF0gKSAmJiAoIGlzX2FycmF5KCAkcmVzdWx0X2FycmF5WyAnZXJyb3JzJyBdICkgKSApIHsKCQkJCQkJZm9yZWFjaCAoICRyZXN1bHRfYXJyYXlbICdlcnJvcnMnIF0gYXMgJGVycm9yICkgewoJCQkJCQkJJGVycm9yc1tdID0gJGVycm9yOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCi8vIAkJCWlmICggc3RyaXN0ciggJHJlc3VsdCwgJ3dhcyBhZGRlZCB0byB0aGUgZGF0YWJhc2UnICkgPT09IGZhbHNlICkgeyAvLyBObyBzdWNjZXNzIGFkZGluZyB1c2VyLgovLyAJCQkJJGVycm9yc1tdID0gJ0Vycm9yIGVuY291bnRlcmVkIGFzc2lnbmluZyB1c2VyIHRvIGRhdGFiYXNlLic7Ci8vIAkJCX0KCQl9CgkJCgkJaWYgKCBjb3VudCggJGVycm9ycyApID4gMCApIHsgLy8gT25lIG9yIG1vcmUgZXJyb3JzLgoJCQlyZXR1cm4gJGVycm9yczsKCQl9IGVsc2UgewoJCQlyZXR1cm4gdHJ1ZTsgLy8gU3VjY2VzcyEKCQl9CgkJCgl9Cgp9IC8vIGVuZCBjbGFzcy4=
###PACKDATA,FILE_END,/lib/cpanel/cpanel.php,importbuddy/lib/cpanel/cpanel.php
###PACKDATA,FILE_START,/pluginbuddy/_getting_started.php,importbuddy/pluginbuddy/_getting_started.php
PD9waHAKCgovLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBsb2FkZWQgZm9yIHRoZSBnZXR0aW5nIHN0YXJ0ZWQgcGFnZSBhcyBhIGB0ZW1wbGF0ZWAgb2Ygc29ydHMuCi8vIFRoZSBpbmRpdmlkdWFsIHBsdWdpbiBnZXR0aW5nIHN0YXJ0ZWQgcGFnZSBpcyBpbmNsdWRlZCBmcm9tIHRoaXMuCgoKLy8gU2V0IHVwIHN1cHBvcnRpbmcgc2NyaXB0cyBhbmQgc3R5bGVzLgpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdkYXNoYm9hcmQnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnZGFzaGJvYXJkJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdqcXVlcnktdWktdGFicycgKTsKCgovL2VjaG8gJzxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgd2lkdGg6IDIwJTsgbWFyZ2luLXJpZ2h0OiAzMHB4OyBtYXJnaW4tbGVmdDogMTBweDsgbWFyZ2luLXRvcDogNjBweDsiPjxicj48YnI+JzsKZWNobyAnPHRhYmxlIHdpZHRoPSIxMDAlIj48dHI+PHRkIHZhbGlnbj0idG9wIiBzdHlsZT0id2lkdGg6IDgwJTsiPic7CgoKaWYgKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzZXJpZXMnICkgIT0gJycgKSB7IC8vIFNFUklFUwoJcGJfYmFja3VwYnVkZHk6OiR1aS0+dGl0bGUoICdHZXR0aW5nIFN0YXJ0ZWQgd2l0aCAnIC4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnc2VyaWVzJyApICk7Cgk/PgoJPGRpdiBpZD0icGx1Z2luYnVkZHktdGFicyIgc3R5bGU9IndpZHRoOiA3MCU7Ij4KCQk8dWw+CgkJCTw/cGhwCgkJCWdsb2JhbCAkcGx1Z2luYnVkZHlfc2VyaWVzOwoJCQkKCQkJJGkgPSAwOwoJCQlmb3JlYWNoKCAkcGx1Z2luYnVkZHlfc2VyaWVzWyBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzZXJpZXMnICkgXSBhcyAkc2x1ZyA9PiAkZGF0YSApIHsKCQkJCSRpKys7CgkJCQllY2hvICc8bGkgdHlwZT0iZGlzYyI+PGEgaHJlZj0iI3BsdWdpbmJ1ZGR5LXRhYnMtJyAuICRpIC4gJyI+PHNwYW4+JyAuICRkYXRhWyduYW1lJ10gLiAnPC9zcGFuPjwvYT48L2xpPic7CgkJCX0KCQkJPz4KCQk8L3VsPgoJCTxkaXYgY2xhc3M9InRhYnMtYm9yZGVyd3JhcCI+CgkJCTw/cGhwCgkJCSRpID0gMDsKCQkJZm9yZWFjaCggJHBsdWdpbmJ1ZGR5X3Nlcmllc1sgcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnc2VyaWVzJyApIF0gYXMgJHNsdWcgPT4gJGRhdGEgKSB7CgkJCQkkaSsrOwoJCQkJZWNobyAnPGRpdiBpZD0icGx1Z2luYnVkZHktdGFicy0nIC4gJGkgLiAnIj4nOwoJCQkJCgkJCQlpZiAoIGZpbGVfZXhpc3RzKCAkZGF0YVsncGF0aCddIC4gJy92aWV3cy9nZXR0aW5nX3N0YXJ0ZWQucGhwJyApICkgewoJCQkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3ZpZXcoICdnZXR0aW5nX3N0YXJ0ZWQnICk7CgkJCQl9IGVsc2UgewoJCQkJCWVjaG8gJ3t2aWV3cy9nZXR0aW5nX3N0YXJ0ZWQucGhwIG5vdCBmb3VuZC59JzsKCQkJCX0KCQkJCQoJCQkJZWNobyAnPC9kaXY+JzsKCQkJCQoJCQkJcGx1Z2luX2luZm9ybWF0aW9uKCAkc2x1ZywgJGRhdGEgKTsKCQkJfQoJCQk/PgoJCTwvZGl2PgoJPC9kaXY+Cgk8P3BocAp9IGVsc2UgeyAvLyBTVEFOREFMT05FCglwYl9iYWNrdXBidWRkeTo6JHVpLT50aXRsZSggJ0dldHRpbmcgU3RhcnRlZCB3aXRoICcgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICduYW1lJyApIC4gJyB2JyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICkgKTsKCQoJaWYgKCBmaWxlX2V4aXN0cyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL3ZpZXdzL2dldHRpbmdfc3RhcnRlZC5waHAnICkgKSB7CgkJcGJfYmFja3VwYnVkZHk6OmxvYWRfdmlldyggJ2dldHRpbmdfc3RhcnRlZCcsIGFycmF5KCAncGx1Z2luX3NsdWcnID0+IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3NsdWcnICkgKSApOwoJfSBlbHNlIHsKCQllY2hvICd7dmlld3MvZ2V0dGluZ19zdGFydGVkLnBocCBub3QgZm91bmQufSc7Cgl9CgkKCS8vcGx1Z2luX2luZm9ybWF0aW9uKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzbHVnJyApLCBhcnJheSggJ25hbWUnID0+IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ25hbWUnICksICdwYXRoJyA9PiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSApICk7Cn0KCgoKZWNobyAnPC90ZD48dGQ+Jm5ic3A7Jm5ic3A7PC90ZD48dGQgdmFsaWduPSJ0b3AiIHN0eWxlPSJwYWRkaW5nLXRvcDogNDBweDsiPic7CgoKCnBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X21ldGFib3goICdUdXRvcmlhbHMgJiBTdXBwb3J0JywgdHJ1ZSwgdHJ1ZSApOwo/PgotIDxhIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9wdWJsaXNoaW5nL2dldHRpbmctc3RhcnRlZC13aXRoLWJhY2t1cGJ1ZGR5LyIgdGFyZ2V0PSJfbmV3IiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyI+R2V0dGluZyBTdGFydGVkIGVCb29rPC9hPjxicj4KLSA8YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vYmFja3VwYnVkZHktdHJhaW5pbmcvIiB0YXJnZXQ9Il9uZXciIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij5UdXRvcmlhbCAmIFdhbGt0aHJvdWdoIFZpZGVvczwvYT48YnI+Ci0gPGEgaHJlZj0iaHR0cDovL2l0aGVtZXMudHYvY2F0ZWdvcnkvYmFja3VwYnVkZHkvIiB0YXJnZXQ9Il9uZXciIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij5HZXR0aW5nIFN0YXJ0ZWQgVmlkZW9zPC9hPjxicj4KLSA8YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vY29kZXgvIiB0YXJnZXQ9Il9uZXciIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij5Lbm93bGVkZ2UgQmFzZSBDb2RleDwvYT48YnI+Ci0gPGEgaHJlZj0iaHR0cDovL2l0aGVtZXMuY29tL3N1cHBvcnQvIiB0YXJnZXQ9Il9uZXciIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7Ij5TdXBwb3J0IEZvcnVtPC9hPgo8P3BocApwYl9iYWNrdXBidWRkeTo6JHVpLT5lbmRfbWV0YWJveCgpOwoKcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfbWV0YWJveCggJ2lUaGVtZXMnLCB0cnVlLCB0cnVlICk7CgplY2hvICc8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGxlZnQ6IC0xMHB4OyI+PGEgaHJlZj0iaHR0cDovL2l0aGVtZXMuY29tLyIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL3BsdWdpbmJ1ZGR5LnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyI+IFRoaW5ncyB0byBkbyAuIC4gLjwvYT48L3A+JzsKZWNobyAnPG9sIGNsYXNzPSJwbHVnaW5idWRkeS1ub2RlY29yIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwcHg7Ij4nOwplY2hvICcJPGxpIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ij48YSBocmVmPSJodHRwOi8vdHdpdHRlci5jb20vaG9tZT9zdGF0dXM9JyAuIHVybGVuY29kZSgnQ2hlY2sgb3V0IHRoaXMgYXdlc29tZSBwbHVnaW4sICcgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICduYW1lJyApIC4gJyEgaHR0cDovL2dldGJhY2t1cGJ1ZGR5LmNvbSBAYmFja3VwX2J1ZGR5JykgLiAnIiB0aXRsZT0iU2hhcmUgb24gVHdpdHRlciIgb25DbGljaz0id2luZG93Lm9wZW4oalF1ZXJ5KHRoaXMpLmF0dHIoXCdocmVmXCcpLFwnaXRoZW1lc19wb3B1cFwnLFwndG9vbGJhcj0wLHN0YXR1cz0wLHdpZHRoPTgyMCxoZWlnaHQ9NTAwLHNjcm9sbGJhcnM9MVwnKTsgcmV0dXJuIGZhbHNlOyI+VHdlZXQgYWJvdXQgdGhpcyBwbHVnaW48L2E+PC9saT4nOwplY2hvICcJPGxpIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ij48YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vZmluZC9wbHVnaW5zLyIgdGFyZ2V0PSJfbmV3Ij5QbHVnaW5zIGJ5IGlUaGVtZXM8L2E+PC9saT4nOwplY2hvICcJPGxpIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ij48YSBocmVmPSJodHRwOi8vaXRoZW1lcy5jb20vZmluZC90aGVtZXMvIiB0YXJnZXQ9Il9uZXciPlRoZW1lcyBieSBpVGhlbWVzPC9hPjwvbGk+JzsKZWNobyAnCTxsaSBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBub25lOyI+PGEgaHJlZj0iaHR0cDovL3BsdWdpbmJ1ZGR5LmNvbS9zdWJzY3JpYmUvIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyI+U3Vic2NyaWJlIHRvIEVtYWlsIE5ld3NsZXR0ZXI8L2E+PC9saT4nOwplY2hvICc8L29sPic7CgplY2hvICc8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IGxlZnQ6IC0xMHB4OyI+PGEgaHJlZj0iaHR0cDovL3R3aXR0ZXIuY29tL2l0aGVtZXMvIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9wbHVnaW5idWRkeS9pbWFnZXMvcGx1Z2luYnVkZHkucG5nIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7Ij4gaVRoZW1lcy5jb20gTmV3czwvYT48L3A+JzsKZWNobyBwYl9iYWNrdXBidWRkeTo6JHVpLT5nZXRfZmVlZCggJ2h0dHA6Ly9pdGhlbWVzLmNvbS9mZWVkLycsIDUgKTsKCnBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF9tZXRhYm94KCk7CgoKCmVjaG8gJzwvdGQ+PC90cj48L3RhYmxlPic7CgoKZnVuY3Rpb24gcGx1Z2luX2luZm9ybWF0aW9uKCAkcGx1Z2luX3NsdWcsICRkYXRhICkgewoJJHBsdWdpbl9wYXRoID0gJGRhdGFbJ3BhdGgnXTsKCT8+CgkKCTw/cGhwIHBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X21ldGFib3goICdWZXJzaW9uIEhpc3RvcnknLCB0cnVlLCAnd2lkdGg6IDEwMCU7JyApOyA/PgoJCTx0ZXh0YXJlYSByZWFkb25seT0icmVhZG9ubHkiIHJvd3M9IjciIGNvbHM9IjY1IiB3cmFwPSJvZmYiIHN0eWxlPSJ3aWR0aDogMTAwJTsiPjw/cGhwCgkJCS8vZWNobyAiVmVyc2lvbiBIaXN0b3J5OlxuXG4iOwoJCQlyZWFkZmlsZSggJHBsdWdpbl9wYXRoIC4gJy9oaXN0b3J5LnR4dCcgKTsKCQk/PjwvdGV4dGFyZWE+CgkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCQlqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5KCIjcGx1Z2luYnVkZHlfPD9waHAgZWNobyAkcGx1Z2luX3NsdWc7ID8+X2RlYnVndG9nZ2xlIikuY2xpY2soZnVuY3Rpb24oKSB7CgkJCQkJalF1ZXJ5KCIjcGx1Z2luYnVkZHlfPD9waHAgZWNobyAkcGx1Z2luX3NsdWc7ID8+X2RlYnVndG9nZ2xlX2RpdiIpLnNsaWRlVG9nZ2xlKCk7CgkJCQl9KTsKCQkJfSk7CgkJPC9zY3JpcHQ+CgkJPD9waHAKCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ3Jlc2V0X2RlZmF1bHRzJyApID09ICRwbHVnaW5fc2x1ZyApIHsKCQkJaWYgKCBjYWxsX3VzZXJfZnVuYyggICdwYl8nIC4gJHBsdWdpbl9zbHVnIC4gJzo6cmVzZXRfb3B0aW9ucycsIHRydWUgKSA9PT0gdHJ1ZSApIHsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ1BsdWdpbiBzZXR0aW5ncyBoYXZlIGJlZW4gcmVzZXQgdG8gZGVmYXVsdHMgZm9yIHBsdWdpbiBgJyAuICRkYXRhWyduYW1lJ10gLiAnYC4nICk7CgkJCX0gZWxzZSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdVbmFibGUgdG8gcmVzZXQgcGx1Z2luIHNldHRpbmdzLiBWZXJpZnkgeW91IGFyZSBydW5uaW5nIHRoZSBsYXRlc3QgdmVyc2lvbi4nICk7CgkJCX0KCQl9CgkJPz4KCTw/cGhwIHBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF9tZXRhYm94KCk7ID8+CgkKCTw/cGhwCn0=
###PACKDATA,FILE_END,/pluginbuddy/_getting_started.php,importbuddy/pluginbuddy/_getting_started.php
###PACKDATA,FILE_START,/pluginbuddy/_pluginbuddy.php,importbuddy/pluginbuddy/_pluginbuddy.php
PD9waHAKCgoKLyoJcGx1Z2luYnVkZHkgY2xhc3MKICoJCiAqCVBsdWdpbkJ1ZGR5LmNvbSBmcmFtZXdvcmsgZm9yIGhhbmRsaW5nIGFsbCBwbHVnaW4gZnVuY3Rpb2FsaXR5LCBhcmNoaXRlY3R1cmUsIGV0Yy4KICoJJHNldHRpbmdzIHZhcmlhYmxlIGlzIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBzYW1lIHNjb3BlIG9mIHRoaXMgZmlsZSBhbmQgcHJldmlvdXNseSBwb3B1bGF0ZWQgd2l0aCBhbGwgcGx1Z2luIHNldHRpbmdzLgogKgkKICoJQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeSB7Cglwcml2YXRlIHN0YXRpYyAkcGJmcmFtZXdvcmtfdmVyc2lvbiA9ICcxLjAuMjgnOwoJCgkKCS8vICoqKioqKioqKiogUFVCTElDIFBST1BFUlRJRVMgKioqKioqKioqKgoJcHVibGljIHN0YXRpYyAkc3RhcnRfdGltZTsJCQkJCS8vIG1pY3JvdGltZSB3aGVuIGluaXQoKSB3YXMgZmlyc3QgcnVuLgoJCgkKCXB1YmxpYyBzdGF0aWMgJG9wdGlvbnM7CQkJCQkJLy8gU3RvcmVzIGFsbCBvcHRpb25zIGZvciBwbHVnaW4gdGhhdCB3aWxsIGNoYW5nZSBzdWNoIGFzIHVzZXIgZGVmaW5lZCBzZXR0aW5ncy4KCXB1YmxpYyBzdGF0aWMgJHVpOwkJCQkJCQkvLyBVc2VyIGludGVyZmFjZSBjbGFzcyBmb3IgcmFwaWRseSBjb25zdHJ1Y3RpbmcgV1Atc3R5bGVkIEdVSXMuIFJFTU9WRUQuIE5vdyBhZGRlZCBhdCBydW50aW1lIHdoZW4gaW5pdF9jbGFzc19jb250cm9sbGVyKCkgY2FsbGVkCglwdWJsaWMgc3RhdGljICRmaWxlc3lzdGVtOwkJCQkJLy8gQ2xhc3MgZm9yIG1hbmlwdWxhdGluZyAmIGludGVyZmFjaW5nIGZpbGUgc3lzdGVtLgoJcHVibGljIHN0YXRpYyAkZm9ybWF0OwkJCQkJCS8vIENsYXNzIGZvciBmb3JtYXR0aW5nIGRhdGEgb3IgdGV4dCBpbiBodW1hbiBmcmllbmRseSBmb3Jtcy4KCXB1YmxpYyBzdGF0aWMgJGNsYXNzZXMgPSBhcnJheSgpOwkJCS8vIEFycmF5IGhvbGRlciBmb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgbmVlZGVkIGdsb2JhbGx5IGJ5IHBsdWdpbi4gU2V0L2dldCB3aXRoICRjbGFzc1snY2xhc3Nfc2x1ZyddLgoJcHVibGljIHN0YXRpYyAkdmFyaWFibGVzID0gYXJyYXkoKTsJCQkvLyBBcnJheSBob2xkZXIgZm9yIHVzZXItZGVmaW5lZCB2YXJpYWJsZXMgbmVlZGVkIGdsb2JhbGx5IGJ5IHBsdWdpbi4gU2V0L2dldCB3aXRoICR2YXJpYWJsZXNbJ3Zhcl9uYW1lJ10uIFVzZWZ1bCBmb3IgdGhpbmdzIHN1Y2ggYXMgYW4gaW5zdGFuY2UgY291bnRlciB0aGF0IGluY3JlbWVudHMuCgkKCQoJLy8gKioqKioqKioqKiBQUklWQVRFIFBST1BFUlRJRVMgKioqKioqKioqKgoJCgkKCQoJcHJpdmF0ZSBzdGF0aWMgJF9zZXR0aW5ncyA9IGFycmF5ICgJCQkvLyBEZWZhdWx0IGZyYW1ld29yayBzZXR0aW5ncyBmb3IgdGhpcyBwbHVnaW4uIE5PVCB0aGUgc2FtZSBhcyBvcHRpb25zLiBBY2Nlc3MgdmlhIHNlbGY6OnNldHRpbmdzKCkuCgkJJ3NsdWcnCQkJCT0+CQknJywKCQknc2VyaWVzJwkJCT0+CQknJywKCQknZGVmYXVsdF9vcHRpb25zJwk9PgkJJycsCgkJJ2xvZ19zZXJpYWwnIAkJPT4gIAknJywKCQknaW5pdCcJCQkJPT4JCScnLAoJKTsKCXByaXZhdGUgc3RhdGljICRfcGFnZV9zZXR0aW5nczsJCQkJLy8gSG9sZHMgYWRtaW4gcGFnZSBzZXR0aW5ncyBmb3IgYWRkaW5nIHRvIHRoZSBhZG1pbiBtZW51IG9uIGEgaG9vayBsYXRlci4KCXB1YmxpYyBzdGF0aWMgJF9zdGF0dXNfc2VyaWFsID0gJyc7CQkvLyBTZXJpYWwgZm9yIHdyaXRpbmcgdGhlIHN0YXR1cyBmb3IgdGhpcyBwYWdlIGxvYWQuIE1heSBiZSBzdHJpbmcgT1IgYXJyYXkgb2YgbXVsdGlwbGUgc2VyaWFscyB0byB3cml0ZSB0by4KCXByaXZhdGUgc3RhdGljICRfaGFzX2ZsdXNoZWQgPSBmYWxzZTsJCS8vLyBXaGV0aGVyIG9yIG5vdCBmbHVzaCgpIGhhcyBiZWVuIGNhbGxlZCB5ZXQgb3Igbm90LgoKCS8vIENvbnRyb2xsZXIgb2JqZWN0cy4gU2VlOiAvY29udHJvbGxlcnMvIGRpcmVjdG9yeS4KCXByaXZhdGUgc3RhdGljICRfYWN0aW9uczsJCQkJCS8vIENvbnRyb2xsZXIgZm9yIFdvcmRQcmVzcyBhY3Rpb25zLgoJcHVibGljIHN0YXRpYyAkX2FqYXg7CQkJCQkJLy8gQ29udHJvbGxlciBmb3IgV29yZFByZXNzIEFKQVggYWN0aW9ucy4KCXByaXZhdGUgc3RhdGljICRfY3JvbjsJCQkJCQkvLyBDb250cm9sbGVyIGZvciBXb3JkUHJlc3Mgc2NoZWR1bGVkIGNyb25zLgoJcHJpdmF0ZSBzdGF0aWMgJF9kYXNoYm9hcmQ7CQkJCQkvLyBDb250cm9sbGVyIGZvciBXb3JkUHJlc3MgYWRtaW4gZGFzaGJvYXJkIGl0ZW1zLgoJcHJpdmF0ZSBzdGF0aWMgJF9maWx0ZXJzOwkJCQkJLy8gQ29udHJvbGxlciBmb3IgV29yZFByZXNzIGZpbHRlcnMuCglwcml2YXRlIHN0YXRpYyAkX3Nob3J0Y29kZXM7CQkJCS8vIENvbnRyb2xsZXIgZm9yIFdvcmRQcmVzcyBzaG9ydGNvZGVzLgoJLy9wcml2YXRlIHN0YXRpYyAkX3dpZGdldHM7CQkJCQkvLyBDb250cm9sbGVyIGZvciBXb3JkUHJlc3Mgd2lkZ2V0cy4KCXByaXZhdGUgc3RhdGljICRfcGFnZXM7CQkJCQkJLy8gQ29udHJvbGxlciBmb3IgV29yZFByZXNzIHBhZ2VzLiBTZWUgL2NvbnRyb2xsZXJzL3BhZ2VzLyBkaXJlY3RvcnkuCgkKCS8vIE1pc2MgdmFyaWFibGVzLgoJcHJpdmF0ZSBzdGF0aWMgJF9wbHVnaW5fcGF0aDsJCQkJLy8gTG9jYWwgcGF0aCB0byBwbHVnaW4uIEV4OiAvdXNlcnMvcGIvd3d3L3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4gKG5vIHRyYWlsaW5nIHNsYXNoKSBAc2VlIHBsdWdpbmJ1ZGR5OnBsdWdpbl9wYXRoKCkKCXByaXZhdGUgc3RhdGljICRfcGx1Z2luX3VybDsJCQkJLy8gVVJMIHRvIHBsdWdpbiBkaXJlY3RvcnkuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4vICh3aXRoIHRyYWlsaW5nIHNsYXNoKSBAc2VlIHNlbGY6OnBsdWdpbl91cmwoKQoJcHJpdmF0ZSBzdGF0aWMgJF9zZWxmX2xpbms7CQkJCQkvLyBSZXR1cm5zIFVSTCB0byB0aGUgY3VycmVudCBhZG1pbiBwYWdlIGlmIG9uIGEgcGx1Z2luIHBhZ2UuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWFkbWluL2luZGV4LnBocD9wYWdlPXBiX215cGx1Z2luIEBzZWUgc2VsZjo6cGFnZV9saW5rKCkKCS8vcHJpdmF0ZSBzdGF0aWMgJF9jYWxsYmFja3M7CQkJCS8vIERJU0FCTEVELiBVc2luZyBjcmVhdGVfZnVuY3Rpb24oKSB0byBieXBhc3MgbmVlZCBmb3IgdGhpcy4gQ3VycmVudGx5IG9ubHkgaG9sZGluZyBjYWxsYmFjayBmb3IgdGhlIGFkbWluIG1lbnUgLiBAc2VlIHBsdWdpbmJ1ZGR5X2NhbGxiYWNrcyBjbGFzcwoJcHVibGljIHN0YXRpYyAkX2Rhc2hib2FyZF93aWRnZXRzOyAgIAkJLy8gSG9sZHMgdGFnIGFuZCB0aXRsZSBmb3IgdW5jb25zdHJ1Y3RlZCBkYXNoYm9hcmQgd2lkZ2V0cyB0ZW1wb3JhcmlseS4KCXB1YmxpYyBzdGF0aWMgJF91cGRhdGVyOwkJCQkJLy8gQ29udGFpbnMgdXBkYXRlciBvYmplY3QgKGlmIGVuYWJsZWQpIG9mIHRoZSBtb3N0IHVwIHRvIGRhdGUgdXBkYXRlciBmb3VuZC4gUG9wdWxhdGVkIG9uIGluaXQgaG9vay4KCXByaXZhdGUgc3RhdGljICRfc2tpcGxvZzsJCQkJCS8vIGlmIHVuYWJsZSB0byB3cml0ZSB0byBsb2cgdGhlbiBza2lwIGFsbCBmdXR1cmUgYXR0ZW1wdHMuCgkKCQoJLy8gKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKgoJCgkKCQoJLyoJc2VsZjo6aW5pdCgpCgkgKgkKCSAqCUNvbnN0cnVjdG9yIGZvciB0aGlzIHN0YXRpYyBjbGFzcy4gQ2FsbGVkIGZyb20gdGhlIHBsdWdpbidzIGluaXQgKG9yIG90aGVyIGRlZmluZWQgaW4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSkgZmlsZS4KCSAqCQoJICoJQHBhcmFtCQlhcnJheQkJJHBsdWdpbmJ1ZGR5X3NldHRpbmdzCQlBcnJheSBvZiBwbHVnaW4gc2V0dGluZ3Mgc3VjaCBhcyBzbHVnLCBkZWZhdWx0IG9wdGlvbnMsCgkgKgkJCQkJCQkJCQkJCQkJcGx1Z2luLXNwZWNpZmljIG9wdGlvbnMsIGV0Yy4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbml0KCAkcGx1Z2luYnVkZHlfc2V0dGluZ3MsICRwbHVnaW5idWRkeV9pbml0ID0gJ2luaXQucGhwJyApIHsKCQlzZWxmOjokc3RhcnRfdGltZSA9IG1pY3JvdGltZSggdHJ1ZSApOwoJCXNlbGY6OiRfc2V0dGluZ3MgPSBhcnJheV9tZXJnZSggKGFycmF5KXNlbGY6OiRfc2V0dGluZ3MsIChhcnJheSkkcGx1Z2luYnVkZHlfc2V0dGluZ3MgKTsgLy8gTWVyZ2Ugc2V0dGluZ3Mgb3ZlciBmcmFtZXdvcmsgZGVmYXVsdHMuCgkJCgkJaWYgKCBmdW5jdGlvbl9leGlzdHMoICdwbHVnaW5fZGlyX3VybCcgKSApIHsgLy8gVVJMIGFuZCBwYXRoIGZ1bmN0aW9ucyBhdmFpbGFibGUgKG5vdCBpbiBJbXBvcnRCdWRkeSBidXQgaW5zaWRlIFdvcmRQcmVzcykuCgkJCXNlbGY6OiRfcGx1Z2luX3BhdGggPSBydHJpbSggcGx1Z2luX2Rpcl9wYXRoKCBkaXJuYW1lKCBfX0ZJTEVfXyApICksICcvXFwnICk7CgkJCXNlbGY6OiRfcGx1Z2luX3VybCA9IHJ0cmltKCBwbHVnaW5fZGlyX3VybCggZGlybmFtZSggX19GSUxFX18gKSApLCAnL1xcJyApOwoJCX0gZWxzZSB7IC8vIEdlbmVyYXRlIFVSTCBhbmQgcGF0aHMgb2xkIHdheSAob2xkIFdvcmRQcmVzcyB2ZXJzaW9ucyBvciBpbnNpZGUgSW1wb3J0QnVkZHkpLgoJCQlzZWxmOjokX3BsdWdpbl9wYXRoID0gZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApOwoJCQkkcmVsYXRpdmVfcGF0aCA9IGx0cmltKCBzdHJfcmVwbGFjZSggJ1xcJywgJy8nLCBzdHJfcmVwbGFjZSggcnRyaW0oIEFCU1BBVEgsICdcXFwvJyApLCAnJywgc2VsZjo6JF9wbHVnaW5fcGF0aCApICksICdcXFwvJyApOwoJCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSB7CgkJCQlzZWxmOjokX3BsdWdpbl91cmwgPSAnaW1wb3J0YnVkZHknOyAvLyBSZWxhdGl2ZSBpbXBvcnRidWRkeSBwYXRoLgoJCQl9IGVsc2UgeyAvLyBOb3JtYWwgZnVsbCBwYXRoLgoJCQkJc2VsZjo6JF9wbHVnaW5fdXJsID0gc2l0ZV91cmwoKSAuICcvJyAuIGx0cmltKCAkcmVsYXRpdmVfcGF0aCwgJy8nICk7CgkJCQlpZiAoIGlzc2V0KCAkX1NFUlZFUlsnSFRUUFMnXSApICYmICRfU0VSVkVSWydIVFRQUyddID09ICdvbicgKSB7IC8vIEhhbmRsZSBodHRwcyBVUkxzIHByb3Blcmx5LgoJCQkJCXNlbGY6OiRfcGx1Z2luX3VybCA9IHN0cl9yZXBsYWNlKCAnaHR0cDovLycsICdodHRwczovLycsIHNlbGY6OiRfcGx1Z2luX3VybCApOwoJCQkJfQoJCQl9CgkJfQoJCQoJCWlmICggaXNzZXQoICRfR0VUWydwYWdlJ10gKSApIHsgLy8gSWYgaW4gYW4gYWRtaW4gcGFnZSB0aGVuIGFwcGVuZCBwYWdlIHF1ZXJ5c3RyaW5nLgoJCQkkYXJyID0gZXhwbG9kZSggJz8nLCAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSApOyAvLyBhdm9pZCByZWZlcmVuY2UgZXJyb3IgYnkgc2V0dGluZyBoZXJlLgoJCQlzZWxmOjokX3NlbGZfbGluayA9IGFycmF5X3NoaWZ0KCAkYXJyICkgLiAnP3BhZ2U9JyAuIGh0bWxlbnRpdGllcyggJF9HRVRbJ3BhZ2UnXSApOwoJCQl1bnNldCggJGFyciApOwoJCX0KCQkKCQkvLyBTZXQgdGhlIGluaXQgZmlsZS4KCQlzZWxmOjokX3NldHRpbmdzWydpbml0J10gPSAkcGx1Z2luYnVkZHlfaW5pdDsKCQkKCQkvLyBmaWxlc3lzdGVtIGNsYXNzIGNvbnRyb2xsZXIuCgkJaWYgKCBpc3NldCggc2VsZjo6JF9zZXR0aW5nc1snbW9kdWxlcyddWydmaWxlc3lzdGVtJ10gKSAmJiAoIHNlbGY6OiRfc2V0dGluZ3NbJ21vZHVsZXMnXVsnZmlsZXN5c3RlbSddID09PSB0cnVlICkgKSB7CgkJCXNlbGY6OmluaXRfY2xhc3NfY29udHJvbGxlciggJ2ZpbGVzeXN0ZW0nICk7CgkJfQoJCS8vIGZvcm1hdCBjbGFzcyBjb250cm9sbGVyLgoJCWlmICggaXNzZXQoIHNlbGY6OiRfc2V0dGluZ3NbJ21vZHVsZXMnXVsnZm9ybWF0J10gKSAmJiAoIHNlbGY6OiRfc2V0dGluZ3NbJ21vZHVsZXMnXVsnZm9ybWF0J10gPT09IHRydWUgKSApIHsKCQkJc2VsZjo6aW5pdF9jbGFzc19jb250cm9sbGVyKCAnZm9ybWF0JyApOwoJCX0KCQkKCQlpZiAoIGlzX2FkbWluKCkgKSB7CgkJCQoJCQkvLyBMb2FkIFVJIHN5c3RlbS4KCQkJc2VsZjo6aW5pdF9jbGFzc19jb250cm9sbGVyKCAndWknICk7CgkJCQoJCQkvLyBMb2FkIGFjdGl2YXRpb24gaG9vayBpZiBpbiBhZG1pbiBhbmQgYWN0aXZhdGlvbiBmaWxlIGV4aXN0cy4KCQkJaWYgKCBmaWxlX2V4aXN0cyggc2VsZjo6JF9wbHVnaW5fcGF0aCAuICcvY29udHJvbGxlcnMvYWN0aXZhdGlvbi5waHAnICkgKSB7CgkJCQkkZXNjYXBlZF9wbHVnaW5fcGF0aCA9IHByZWdfcmVwbGFjZSggJyNeXFxcXFxcXFwjJywgJ1xcXFxcXFxcXFxcXFxcXFwnLCBzZWxmOjokX3BsdWdpbl9wYXRoICk7IC8vIFJlcGxhY2UgYSBwYXRoIHN0YXJ0aW5nIHdpdGggXFwgdG8gYmUgXFxcXCBzbyB0aGF0IHdoZW4gY3JlYXRlX2Z1bmN0aW9uIHBhcnNlcyB0aGUgYmFja3NsYXNoIGl0IHdpbGwgcmV0dXJuIGJhY2sgdG8gXFwuCgkJCQlyZWdpc3Rlcl9hY3RpdmF0aW9uX2hvb2soIHNlbGY6OiRfcGx1Z2luX3BhdGggLiAnLycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdpbml0JyApLCBjcmVhdGVfZnVuY3Rpb24oICcnLCAicmVxdWlyZV9vbmNlKCciIC4gJGVzY2FwZWRfcGx1Z2luX3BhdGggLiAiL2NvbnRyb2xsZXJzL2FjdGl2YXRpb24ucGhwJyk7IiApICk7IC8vIFJ1biBzb21lIGNvZGUgd2hlbiBwbHVnaW4gaXMgYWN0aXZhdGVkIGluIGRhc2hib2FyZC4KCQkJfQoJCX0gZWxzZSB7IC8vIFB1YmxpYyBzaWRlLgoJCQkvLyBEbyBub3RoaW5nLgoJCX0KCQkKCX0gLy8gRW5kIGluaXQoKS4KCQoJCgkKCS8qCXNlbGY6OnBsdWdpbl9wYXRoKCkKCSAqCQoJICoJUmV0dXJucyBsb2NhbCBwYXRoIHRvIHBsdWdpbi4gRXg6IC91c2Vycy9wYi93d3cvd3AtY29udGVudC9wbHVnaW5zL215X3BsdWdpbiAobm8gdHJhaWxpbmcgc2xhc2gpCgkgKgkKCSAqCUByZXR1cm4JCXN0cmluZwkJUGx1Z2luIHBhdGggZGlyZWN0b3J5IChubyB0cmFpbGluZyBzbGFzaCkuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGx1Z2luX3BhdGgoKSB7CgkJcmV0dXJuIHNlbGY6OiRfcGx1Z2luX3BhdGg7Cgl9IC8vIEVuZCBwbHVnaW5fcGF0aCgpLgoJCgkKCQoJLyoJc2VsZjo6cGx1Z2luX3VybCgpCgkgKgkKCSAqCVJldHVybnMgVVJMIHRvIHBsdWdpbiBkaXJlY3RvcnkuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4vICh3aXRoIHRyYWlsaW5nIHNsYXNoKQoJICoJCgkgKglAcmV0dXJuCQlzdHJpbmcJCVBsdWdpbiBwYXRoIFVSTCAod2l0aCB0cmFpbGluZyBzbGFzaCkuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGx1Z2luX3VybCgpIHsKCQlyZXR1cm4gc2VsZjo6JF9wbHVnaW5fdXJsOwoJfSAvLyBFbmQgcGx1Z2luX3VybCgpLgoJCgkKCQoJLyoJc2VsZjo6cGFnZV91cmwoKQoJICoJCgkgKglSZXR1cm5zIFVSTCB0byB0aGUgY3VycmVudCBhZG1pbiBwYWdlIGlmIG9uIGEgcGx1Z2luIHBhZ2UuIEV4OiBodHRwOi8vcGx1Z2luYnVkZHkuY29tL3dwLWFkbWluL2luZGV4LnBocD9wYWdlPXBiX215cGx1Z2luCgkgKgkKCSAqCUByZXR1cm4JCXN0cmluZwkJUGx1Z2luIHBhZ2UgVVJMICh3aXRoIHRyYWlsaW5nIHNsYXNoKS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYWdlX3VybCgpIHsKCQlyZXR1cm4gc2VsZjo6JF9zZWxmX2xpbms7Cgl9IC8vIEVuZCBwYWdlX3VybCgpLgoJCgkKCQoJLyoJc2VsZjo6YWpheF91cmwoKQoJICoJCgkgKglSZXR1cm5zIHRoZSBhZG1pbi1zaWRlIEFKQVggVVJMLiBQcm9wZXJseSBoYW5kbGVzIHByZWZpeGluZyBhbmQgZXZlcnl0aGluZyBmb3IgUEIgZnJhbWV3b3JrLgoJICoJVG9kbzogcHJvdmlkZSBub24tYWRtaW4tc2lkZSBmdW5jdGlvbmFsaXR5PwoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHRhZwkJVGFnIC8gc2x1ZyBvZiBBSkFYLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQlVUkwgZm9yIEFKQVguCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWpheF91cmwoICR0YWcgKSB7CgkJcmV0dXJuIGFkbWluX3VybCgnYWRtaW4tYWpheC5waHAnKSAuICc/YWN0aW9uPXBiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnX2JhY2t1cGJ1ZGR5JmZ1bmN0aW9uPScgLiAkdGFnOwoJfSAvLyBFbmQgYWpheF91cmwoKS4KCQoJCgkKCS8qCXNlbGY6OnNldHRpbmdzKCkKCSAqCQoJICoJUmV0cmlldmVzIG1pc2MgcGx1Z2luIHNldHRpbmdzIGJvdGggcGFzc2VkIGZyb20gdGhlIGluaXQgZmlsZSAoIGRlZmluZWQgaW4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSApIGludG8gc2VsZjo6JF9zZXR0aW5ncwoJICoJYW5kIGFsc28gcGx1Z2luIHNldHRpbmdzIGRlZmluZWQgaW4gdGhlIGluaXQgZmlsZSAoIGRlZmluZWQgaW4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnaW5pdCcgKSApIGhlYWRlciBpbmNsdWRpbmc6CgkgKgluYW1lLCB0aXRsZSwgZGVzY3JpcHRpb24sIGF1dGhvciwgYXV0aG9ydXJpLCB2ZXJzaW9uLCBwbHVnaW51cmkgT1IgdXJsLCB0ZXh0ZG9tYWluLCBkb21haW5wYXRoLCBuZXR3b3JrLgoJICoJQHNlZSBzZWxmOjppbml0KCkKCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSR0eXBlCQlUeXBlIG9mIHNldHRpbmcgdG8gcmV0cmlldmUuCgkgKglAcmV0dXJuCQltaXhlZAkJCQkJVmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgc2V0dGluZ3MuIE51bGwgaWYgbm90IGZvdW5kLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldHRpbmdzKCAkdHlwZSApIHsKCQkvL2lmICggIXNlbGY6OmJsYW5rKCBAc2VsZjo6JF9zZXR0aW5nc1skdHlwZV0gKSApIHsgLy8gUmV0dXJuIHZhbHVlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgoJCWlmICggaXNzZXQoIHNlbGY6OiRfc2V0dGluZ3NbJHR5cGVdICkgKSB7CgkJCXJldHVybiBzZWxmOjokX3NldHRpbmdzWyR0eXBlXTsKCQl9CgkJCgkJLy8gVGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0IHNvIGNoZWNrIHRvIHNlZSBpZiBpdCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gdGhlIHBsdWdpbidzIGhlYWRlci4KCQkvL2lmICggc2VsZjo6YmxhbmsoIEBzZWxmOjokX3NldHRpbmdzWyduYW1lJ10gKSApIHsKCQlpZiAoICFpc3NldCggc2VsZjo6JF9zZXR0aW5nc1snbmFtZSddICkgfHwgKCBzZWxmOjokX3NldHRpbmdzWyduYW1lJ10gPT0gJycgKSApIHsKCQkJaWYgKCAhZnVuY3Rpb25fZXhpc3RzKCAnZ2V0X3BsdWdpbl9kYXRhJyApICkgewoJCQkJcmVxdWlyZV9vbmNlIEFCU1BBVEggLiAnd3AtYWRtaW4vaW5jbHVkZXMvcGx1Z2luLnBocCc7CgkJCX0KCQkJJGluZm8gPSBhcnJheV9jaGFuZ2Vfa2V5X2Nhc2UoIGdldF9wbHVnaW5fZGF0YSggc2VsZjo6JF9wbHVnaW5fcGF0aCAuICcvJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ2luaXQnICksIGZhbHNlLCBmYWxzZSApLCBDQVNFX0xPV0VSICk7CgkJCSRpbmZvWyd1cmwnXSA9ICRpbmZvWydwbHVnaW51cmknXTsKCQkJdW5zZXQoICRpbmZvWydwbHVnaW51cmknXSApOwoJCQlzZWxmOjokX3NldHRpbmdzID0gYXJyYXlfbWVyZ2UoIHNlbGY6OiRfc2V0dGluZ3MsICRpbmZvICk7CgkJfQoKCQkvLyBUcnkgdG8gcmV0dXJuIHNldHRpbmcgb3RoZXJ3aXNlIHRocm93IGFuIGVycm9yLgoJCWlmICggaXNzZXQoIHNlbGY6OiRfc2V0dGluZ3NbJHR5cGVdICkgKSB7CgkJCXJldHVybiBzZWxmOjokX3NldHRpbmdzWyR0eXBlXTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJ3tVbmtub3duIHNldHRpbmdzKCkgdmFyaWFibGUgYCcgLiAkdHlwZSAuICdgfSc7CgkJfQoJfSAvLyBFbmQgc2V0dGluZ3MoKS4KCQoJCgkKCS8qCXNlbGY6OmJsYW5rKCkKCSAqCQoJICoJUmV0dXJucyB3aGV0aGVyIGEgbm90IGEgdmFyaWFibGUgaXMgYmxhbmsgKGVtcHR5IHN0cmluZywgbnVsbCwgdW5kZWZpbmVkKSBvciBub3QuCgkgKglCZSBzdXJlIHRvIHN1cHByZXNzIGVycm9ycyBpZiB1c2luZyB0aGlzIGZ1bmN0aW9uIHdoZXJlIGluZGV4ZXMgbWF5IGJlIG5vbi1leGlzdGFudCB3aXRoIEAgc2lnbi4KCSAqCQoJICoJQHBhcmFtCQltaXhlZAkJVmFyaWFibGUgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGJsYW5rIG9yIG5vdC4KCSAqCUByZXR1cm4JCWJvb2xlYW4JCVRydWUgaWYgdmFyaWFibGUgaXMgc2V0IGFuZCBpcyBub3QgYW4gZW1wdHkgc3RyaW5nLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJsYW5rKCAkdmFsdWUgKSB7CgkJcmV0dXJuIGVtcHR5KCAkdmFsdWUgKSAmJiAhaXNfbnVtZXJpYyggJHZhbHVlICk7Cgl9IC8vIEVuZCBibGFuaygpLgoJCgkKCQoJLyoJc2VsZjo6X1BPU1QoKQoJICoJCgkgKglSZXR1cm5zICRfUE9TVCB2YWx1ZSBpZiBhdmFpbGFibGUsIGVsc2UgcmV0dXJucyBhIGJsYW5rLiBQcmV2ZW50cyBoYXZpbmcgdG8gY2hlY2sgaXNzZXQgZmlyc3QuIFN0cmlwcyBXUCdzIGFkZGVkIHNsYXNoZXMuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQlLZXkgb2YgUE9TVCB2YXJpYWJsZSB0byBjaGVjay4KCSAqCUByZXR1cm4JCW1peGVkCQlWYWx1ZSBvZiBQT1NUIHZhcmlhYmxlIGlmIHNldC4gSWYgbm90IHNldCByZXR1cm5zIGEgYmxhbmsgc3RyaW5nICcnLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9QT1NUKCAkdmFsdWUgPSBudWxsICkgewoJCWlmICggKCAkdmFsdWUgPT0gJycgKSB8fCAoIG51bGwgPT0gJHZhbHVlICkgKSB7IC8vIFJlcXVlc3RpbmcgJF9QT1NUIHZhcmlhYmxlLgoJCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmICggUEJfU1RBTkRBTE9ORSA9PT0gdHJ1ZSApICYmICFnZXRfbWFnaWNfcXVvdGVzX2dwYygpICkgeyAvLyBJZiBpbiBJbXBvcnRCdWRkeSBtb2RlIEFORCBtYWdpYyBxdW90ZXMgaXMgbm90IG9uLCBkb250IHN0cmlwLiBXUCBlc2NhcGVzIGZvciB1cyBpZiBtYWdpYyBxdW90ZXMgYXJlIG9mZi4KCQkJCXJldHVybiAkX1BPU1Q7CgkJCX0KCQkJcmV0dXJuIHN0cmlwc2xhc2hlc19kZWVwKCAkX1BPU1QgKTsKCQl9IGVsc2UgewoJCQkkcG9zdFZhbHVlID0gJyc7CgkJCWlmICggaXNzZXQoICRfUE9TVFskdmFsdWVdICkgKSB7CgkJCQkkcG9zdFZhbHVlID0gJF9QT1NUWyR2YWx1ZV07CgkJCX0KCQkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiAoIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSAmJiAhZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsgLy8gSWYgaW4gSW1wb3J0QnVkZHkgbW9kZSBBTkQgbWFnaWMgcXVvdGVzIGlzIG5vdCBvbiwgZG9udCBzdHJpcC4gV1AgZXNjYXBlcyBmb3IgdXMgaWYgbWFnaWMgcXVvdGVzIGFyZSBvZmYuCgkJCQlyZXR1cm4gJHBvc3RWYWx1ZTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBzdHJpcHNsYXNoZXNfZGVlcCggJHBvc3RWYWx1ZSApOyAvLyBSZW1vdmUgV29yZFByZXNzJyBtYWdpYy1xdW90ZXMtc3R5bGUgZXNjYXBpbmcgb2YgZGF0YS4KCQkJfQoJCX0KCX0gLy8gRW5kIF9QT1NUKCkuCgkKCQoJCgkvKglzZWxmOjpfR0VUKCkKCSAqCQoJICoJUmV0dXJucyAkX1BPU1QgdmFsdWUgaWYgYXZhaWxhYmxlLCBlbHNlIHJldHVybnMgYSBibGFuay4gUHJldmVudHMgaGF2aW5nIHRvIGNoZWNrIGlzc2V0IGZpcnN0LgoJICoJVE9ETzogRG8gd2UgbmVlZCB0byBzdHJpcHNsYXNoZXNfZGVlcCgpIG9uIEdFVCB2YXJzIGFsc28gbGlrZSBQT1NUcz8KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCUtleSBvZiBQT1NUIHZhcmlhYmxlIHRvIGNoZWNrLgoJICoJQHJldHVybgkJbWl4ZWQJCVZhbHVlIG9mIFBPU1QgdmFyaWFibGUgaWYgc2V0LiBJZiBub3Qgc2V0IHJldHVybnMgYSBibGFuayBzdHJpbmcgJycuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX0dFVCggJHZhbHVlID0gJycgKSB7CgkJaWYgKCAoICR2YWx1ZSA9PSAnJyApIHx8ICggbnVsbCA9PSAkdmFsdWUgKSApIHsgLy8gUmVxdWVzdGluZyAkX0dFVCB2YXJpYWJsZS4KCQkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiAoIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSAmJiAhZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSApIHsgLy8gSWYgaW4gSW1wb3J0QnVkZHkgbW9kZSBBTkQgbWFnaWMgcXVvdGVzIGlzIG5vdCBvbiwgZG9udCBzdHJpcC4gV1AgZXNjYXBlcyBmb3IgdXMgaWYgbWFnaWMgcXVvdGVzIGFyZSBvZmYuCgkJCQlyZXR1cm4gJF9HRVQ7CgkJCX0KCQkJcmV0dXJuIHN0cmlwc2xhc2hlc19kZWVwKCAkX0dFVCApOwoJCX0gZWxzZSB7CgkJCSRnZXRWYWx1ZSA9ICcnOwoJCQlpZiAoIGlzc2V0KCAkX0dFVFskdmFsdWVdICkgKSB7CgkJCQkkZ2V0VmFsdWUgPSAkX0dFVFskdmFsdWVdOwoJCQl9CgkJCWlmICggZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgJiYgKCBQQl9TVEFOREFMT05FID09PSB0cnVlICkgJiYgIWdldF9tYWdpY19xdW90ZXNfZ3BjKCkgKSB7IC8vIElmIGluIEltcG9ydEJ1ZGR5IG1vZGUgQU5EIG1hZ2ljIHF1b3RlcyBpcyBub3Qgb24sIGRvbnQgc3RyaXAuIFdQIGVzY2FwZXMgZm9yIHVzIGlmIG1hZ2ljIHF1b3RlcyBhcmUgb2ZmLgoJCQkJcmV0dXJuICRnZXRWYWx1ZTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBzdHJpcHNsYXNoZXNfZGVlcCggJGdldFZhbHVlICk7IC8vIFJlbW92ZSBXb3JkUHJlc3MnIG1hZ2ljLXF1b3Rlcy1zdHlsZSBlc2NhcGluZyBvZiBkYXRhLgoJCQl9CgkJfQoJfSAvLyBFbmQgX0dFVCgpLgoJCgkKCQoJLyoJc2VsZjo6Z2V0X2dyb3VwKCkKCSAqCgkgKglHcmFicyAmIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBzcGVjaWZpZWQgcG9pbnQgaW4gdGhlIG9wdGlvbnMgYXJyYXkuCgkgKglFeCB1c2FnZTogJGdyb3VwID0gJnNlbGY6OmdldF9ncm91cCggJ2dyb3VwcyMnIC4gJF9HRVRbJ2VkaXQnXSApOwoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkkc2F2ZXBvaW50X3Jvb3QJCVBhdGggaW4gdGhlIGFycmF5IHRvIHJldHVybiBhIHJlZmVyZW5jZSB0by4KCSAqCQkJCQkJCQkJCQlFeDogZ3JvdXBzIzUgd2lsbCBncmFiIHNlbGY6OiRvcHRpb25zWydncm91cHMnXVs1XQoJICoJQHJldHVybgkJbWl4ZWQJCQkJCQlWYWx1ZSB3aXRoaW4gdGhlIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgcG9pbnQuCgkgKgkJCQkJCQkJCQkJQ2FuIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UuIFNlZSBleGFtcGxlIGluIGRlc2NyaXB0aW9uLgoJICoJCQkJCQkJCQkJCU5PVEU6IFJldHVybnMgZmFsc2UgaWYgbm90IGZvdW5kLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uICZnZXRfZ3JvdXAoICRzYXZlcG9pbnRfcm9vdCApIHsKCQlpZiAoICRzYXZlcG9pbnRfcm9vdCA9PSAnJyApIHsgLy8gUm9vdCB3YXMgcmVxdWVzdGVkLgoJCQkkcmV0dXJuID0gJnNlbGY6OiRvcHRpb25zOwoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJCgkJJHNhdmVwb2ludF9zdWJzZWN0aW9uID0gJnNlbGY6OiRvcHRpb25zOwoJCSRzYXZlcG9pbnRfbGV2ZWxzID0gZXhwbG9kZSggJyMnLCAkc2F2ZXBvaW50X3Jvb3QgKTsKCQlmb3JlYWNoICggJHNhdmVwb2ludF9sZXZlbHMgYXMgJHNhdmVwb2ludF9sZXZlbCApIHsKCQkJaWYgKCBpc3NldCggJHNhdmVwb2ludF9zdWJzZWN0aW9ueyRzYXZlcG9pbnRfbGV2ZWx9ICkgKSB7CgkJCQkkc2F2ZXBvaW50X3N1YnNlY3Rpb24gPSAmJHNhdmVwb2ludF9zdWJzZWN0aW9ueyRzYXZlcG9pbnRfbGV2ZWx9OwoJCQl9IGVsc2UgewoJCQkJZWNobyAne0Vycm9yICM0NDg5MDQ1OiBJbnZhbGlkIGFycmF5IGluIHBhdGg6IGAnIC4gJHNhdmVwb2ludF9yb290IC4gJ2B9JzsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gJHNhdmVwb2ludF9zdWJzZWN0aW9uOwoJfSAvLyBFbmQgZ2V0X2dyb3VwKCkuCgkKCQoJCgkvKglzZWxmOjpsb2FkKCkKCSAqCQoJICoJTG9hZHMgdGhlIHBsdWdpbiBvcHRpb25zIGFycmF5IGNvbnRhaW5pbmcgYWxsIHVzZXItY29uZmlndXJhYmxlIG9wdGlvbnMsIGV0Yy4KCSAqCUFjY2VzcyBvcHRpb25zIHZpYSBzZWxmOjokb3B0aW9ucy4gQnlwYXNzZXMgV1Agb3B0aW9ucyBjYWNoaW5nIGZvciByZWxpYWJpbGl0eS4KCSAqCQoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvYWQoKSB7CgkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiBQQl9TVEFOREFMT05FID09PSB0cnVlICkgeyAvLyBTdGFuZGFsb25lIGZyYW1ld29yayBtb2RlIChvdXRzaWRlIFdvcmRQcmVzcykuCgkJCS8vIExvYWQgb3B0aW9ucyBmcm9tIGZpbGUgaWYgaXQgZXhpc3RzLgoJCQkkZGF0X2ZpbGUgPSBBQlNQQVRIIC4gJ2ltcG9ydGJ1ZGR5L19zZXR0aW5nc19kYXQucGhwJzsKCQkJaWYgKCBmaWxlX2V4aXN0cyggJGRhdF9maWxlICkgKSB7CgkJCQkkb3B0aW9ucyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCAkZGF0X2ZpbGUgKTsKCQkJCQoJCQkJLy8gVW5zZXJpYWxpemUgZGF0YTsgSWYgaXQgZmFpbHMgaXQgdGhlbiBkZWNvZGVzIHRoZSBvYnNjdWZhdGVkIGRhdGEgdGhlbiB1bnNlcmlhbGl6ZXMgaXQuIChuZXcgZGF0IGZpbGUgbWV0aG9kIHN0YXJ0aW5nIGF0IDIuMCkuCgkJCQlpZiAoICFpc19zZXJpYWxpemVkKCAkb3B0aW9ucyApIHx8ICggZmFsc2UgPT09ICggJHJldHVybiA9IHVuc2VyaWFsaXplKCAkb3B0aW9ucyApICkgKSApIHsKCQkJCQkvLyBTa2lwIGZpcnN0IGxpbmUuCgkJCQkJJHNlY29uZF9saW5lX3BvcyA9IHN0cnBvcyggJG9wdGlvbnMsICJcbiIgKSArIDE7CgkJCQkJJG9wdGlvbnMgPSBzdWJzdHIoICRvcHRpb25zLCAkc2Vjb25kX2xpbmVfcG9zICk7CgkJCQkJCgkJCQkJLy8gRGVjb2RlIGJhY2sgaW50byBhbiBhcnJheS4KCQkJCQkkb3B0aW9ucyA9IHVuc2VyaWFsaXplKCBiYXNlNjRfZGVjb2RlKCAkb3B0aW9ucyApICk7CgkJCQl9CgkJCX0gZWxzZSB7IC8vIE5vIGV4aXN0aW5nIG9wdGlvbnMuIEVtcHR5IG9wdGlvbnMuCgkJCQkkb3B0aW9ucyA9IGFycmF5KCk7CgkJCX0KCQkJCgkJCS8vIE1lcmdlIGRlZmF1bHRzLgoJCQkkb3B0aW9ucyA9IGFycmF5X21lcmdlKCAoYXJyYXkpc2VsZjo6c2V0dGluZ3MoICdkZWZhdWx0X29wdGlvbnMnICksICRvcHRpb25zICk7CgkJCQoJCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgPSAkb3B0aW9uczsKCQkJcmV0dXJuOwoJCX0KCQkKCQlzZWxmOjokb3B0aW9ucyA9IHNlbGY6Ol9nZXRfb3B0aW9uKCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSApOwoJCQoJCS8vIE1lcmdlIGRlZmF1bHRzIGludG8gdGVtcG9yYXJ5ICRvcHRpb25zIHZhcmlhYmxlIGFuZCBzYXZlIGlmIGl0IGRpZmZlcnMgd2l0aCB0aGUgcHJlLW1lcmdlIG9wdGlvbnMuCgkJaWYgKCBlbXB0eSggc2VsZjo6JG9wdGlvbnMgKSApIHsKCQkJJG9wdGlvbnMgPSAoYXJyYXkpc2VsZjo6c2V0dGluZ3MoICdkZWZhdWx0X29wdGlvbnMnICk7CgkJfSBlbHNlIHsKCQkJJG9wdGlvbnMgPSBhcnJheV9tZXJnZSggKGFycmF5KXNlbGY6OnNldHRpbmdzKCAnZGVmYXVsdF9vcHRpb25zJyApLCAoYXJyYXkpc2VsZjo6JG9wdGlvbnMgKTsKCQl9CgkJaWYgKCBzZWxmOjokb3B0aW9ucyAhPT0gJG9wdGlvbnMgKSB7CgkJCXNlbGY6OiRvcHRpb25zID0gJG9wdGlvbnM7CgkJCXNlbGY6OnNhdmUoKTsKCQl9Cgl9IC8vIEVuZCBsb2FkKCkuCgkKCQoJCgkvKglzZWxmOjpfZ2V0X29wdGlvbigpCgkgKgkKCSAqCUJ5cGFzc2VzIFdvcmRQcmVzcyBvcHRpb25zIGNhY2hlLiBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFwcGVhcnMgdG8gYmUgcmFjZSBjb25kaXRpb24gaXNzdWVzIHdpdGggdGhlIGJ1aWx0LWluIFdQIG9wdGlvbnMgc3lzdGVtLgoJICoJVXNlZCBieSBsb2FkKCkgZnVuY3Rpb24gaW50ZXJuYWxseS4gVGFrZW4gYW5kIG1vZGlmaWVkIGZyb20gV29yZFByZXNzIGNvcmUuCgkgKglAc2VlIGxvYWQoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG9wdGlvbgkJT3B0aW9uIG5hbWUuCgkgKglAcGFyYW0JCW1peGVkCQkkZGVmYXVsdAlkZWZhdWx0ID0gZmFsc2U7IHdlIGRvIG5vdCB1c2UgdGhpcy4KCSAqCUByZXR1cm4JCW1peGVkCQkJCQlTYXZlZCBvcHRpb24gdmFsdWUuCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9nZXRfb3B0aW9uKCAkb3B0aW9uLCAkZGVmYXVsdCA9IGZhbHNlICkgewoJCWdsb2JhbCAkd3BkYjsKCgkJJG9wdGlvbiA9IHRyaW0oJG9wdGlvbik7CgkJaWYgKCBlbXB0eSgkb3B0aW9uKSApCgkJCXJldHVybiBmYWxzZTsKCgkJaWYgKCBkZWZpbmVkKCAnV1BfU0VUVVBfQ09ORklHJyApICkKCQkJcmV0dXJuIGZhbHNlOwoKCQkkcm93ID0gJHdwZGItPmdldF9yb3coICR3cGRiLT5wcmVwYXJlKCAiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NICR3cGRiLT5vcHRpb25zIFdIRVJFIG9wdGlvbl9uYW1lID0gJXMgTElNSVQgMSIsICRvcHRpb24gKSApOwoKCQkvLyBIYXMgdG8gYmUgZ2V0X3JvdyBpbnN0ZWFkIG9mIGdldF92YXIgYmVjYXVzZSBvZiBmdW5raW5lc3Mgd2l0aCAwLCBmYWxzZSwgbnVsbCB2YWx1ZXMKCQlpZiAoIGlzX29iamVjdCggJHJvdyApICkgewoJCQkkdmFsdWUgPSAkcm93LT5vcHRpb25fdmFsdWU7CgkJfSBlbHNlIHsKCQkJJHZhbHVlID0gJGRlZmF1bHQ7CgkJfQoKCQkvLyBJZiBob21lIGlzIG5vdCBzZXQgdXNlIHNpdGV1cmwuCgkJaWYgKCAnaG9tZScgPT0gJG9wdGlvbiAmJiAnJyA9PSAkdmFsdWUgKQoJCQlyZXR1cm4gZ2V0X29wdGlvbiggJ3NpdGV1cmwnICk7CgoJCWlmICggaW5fYXJyYXkoICRvcHRpb24sIGFycmF5KCdzaXRldXJsJywgJ2hvbWUnLCAnY2F0ZWdvcnlfYmFzZScsICd0YWdfYmFzZScpICkgKQoJCQkkdmFsdWUgPSB1bnRyYWlsaW5nc2xhc2hpdCggJHZhbHVlICk7CgoJCSR2YWx1ZSA9IG1heWJlX3Vuc2VyaWFsaXplKCAkdmFsdWUgKTsKCgkJcmV0dXJuICR2YWx1ZTsKCX0gLy8gRW5kIGdldF9vcHRpb24oKS4KCQoJCgkKCS8qCXNlbGY6OnNhdmUoKQoJICoJCgkgKglTYXZlIHBsdWdpbiBvcHRpb25zIHRvIGRhdGFiYXNlLgoJICoJCgkgKglAcmV0dXJuCQlib29sZWFuCQkJVHJ1ZSBpZiBzYXZlIHN1Y2NlZWRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhdmUoKSB7CgkJaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiBQQl9TVEFOREFMT05FID09PSB0cnVlICkgewoJCQkkb3B0aW9uc19jb250ZW50ID0gYmFzZTY0X2VuY29kZSggc2VyaWFsaXplKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnMgKSApOwoJCQkkcmVzdWx0ID0gZmlsZV9wdXRfY29udGVudHMoIEFCU1BBVEggLiAnaW1wb3J0YnVkZHkvX3NldHRpbmdzX2RhdC5waHAnLCAiPD9waHAgZGllKCc8IS0tIC8vIFNpbGVuY2UgaXMgZ29sZGVuLiAtLT4nKTsgPz5cbiIgLiAkb3B0aW9uc19jb250ZW50ICk7CgkJCWlmICggJHJlc3VsdCA9PT0gZmFsc2UgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQoJCWFkZF9zaXRlX29wdGlvbiggJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICksIHNlbGY6OiRvcHRpb25zLCAnJywgJ25vJyk7IC8vICdObycgcHJldmVudHMgYXV0b2xvYWQgaWYgd2Ugd29udCBhbHdheXMgbmVlZCB0aGUgZGF0YSBsb2FkZWQuCgkJcmV0dXJuIHNlbGY6Ol91cGRhdGVfb3B0aW9uKCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSwgc2VsZjo6JG9wdGlvbnMgKTsKCX0gLy8gRW5kIHNhdmUoKS4KCQoJCgkKCS8qCXNlbGY6Ol91cGRhdGVfb3B0aW9uKCkKCSAqCQoJICoJQnlwYXNzZXMgV29yZFByZXNzIGJ1aWx0IGluIHVwZGF0ZSBvcHRpb24gY2FjaGUuIFRha2VuIGZyb20gV29yZFByZXNzIGNvcmUgYW5kIG1vZGlmaWVkLgoJICoJQHNlZSBzZWxmOjpfZ2V0X29wdGlvbigpCgkgKglAc2VlIHNlbGY6OnNhdmUoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkkb3B0aW9uCQkJT3B0aW9uIG5hbWUuCgkgKglAcGFyYW0JCW1peGVkCSRuZXd2YWx1ZQkJTmV3IHZhbHVlIHRvIHNhdmUgaW50byBvcHRpb24uCgkgKglAcmV0dXJuCQlib29sZWFuCQkJCQlUcnVlIG9uIHN1Y2Nlc3M7IGZhbHNlIG90aGVyd2lzZS4KCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3VwZGF0ZV9vcHRpb24oICRvcHRpb24sICRuZXd2YWx1ZSApIHsKCQlnbG9iYWwgJHdwZGI7CgoJCSRvcHRpb24gPSB0cmltKCRvcHRpb24pOwoJCWlmICggZW1wdHkoJG9wdGlvbikgKQoJCQlyZXR1cm4gZmFsc2U7CgoJCSRvbGR2YWx1ZSA9IGdldF9vcHRpb24oICRvcHRpb24gKTsKCQlpZiAoIGZhbHNlID09PSAkb2xkdmFsdWUgKSB7CgkJCXJldHVybiBhZGRfb3B0aW9uKCAkb3B0aW9uLCAkbmV3dmFsdWUgKTsKCQl9IGVsc2UgewoJCQkkbmV3dmFsdWUgPSBzYW5pdGl6ZV9vcHRpb24oICRvcHRpb24sICRuZXd2YWx1ZSApOwoJCQkkbmV3dmFsdWUgPSBtYXliZV9zZXJpYWxpemUoICRuZXd2YWx1ZSApOwoJCQkkcmVzdWx0ID0gJHdwZGItPnVwZGF0ZSggJHdwZGItPm9wdGlvbnMsIGFycmF5KCAnb3B0aW9uX3ZhbHVlJyA9PiAkbmV3dmFsdWUgKSwgYXJyYXkoICdvcHRpb25fbmFtZScgPT4gJG9wdGlvbiApICk7CgkJCQoJCQlpZiAoICRyZXN1bHQgKSByZXR1cm4gdHJ1ZTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0gLy8gRW5kIF91cGRhdGVfb3B0aW9uKCkuCgkKCQoJCgkvKglzZWxmOjpyZXNldF9vcHRpb25zKCkKCSAqCQoJICoJUmVzZXQgcGx1Z2luIG9wdGlvbnMgdG8gZGVmYXVsdHMgcGFzc2VkIGluICRzZXR0aW5ncyBpbiB0aGUgaW5pdCBmaWxlJ3MgKCBkZWZpbmVkIGluIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ2luaXQnICkgKSBkZWZhdWx0X29wdGlvbnMgc2VjdGlvbiAoICRzZXR0aW5nc1snZGVmYXVsdF9vcHRpb25zJ10gKS4gVXNlIHdpdGggY2F1dGlvbi4KCSAqCQoJICoJQHBhcmFtCQlib29sZWFuCQkkdmVyaWZ5CQlNdXN0IHBhc3MgYm9vbGVhbiB2YWx1ZSBvZiB0cnVlIHRvIGJlIGFibGUgdG8gcmVzZXQuIFNhZmV0eSBtZWNoYW5pc20uCgkgKglAcmV0dXJuCQlib29sZWFuCQkJCQl0cnVlIG9uIHJlc2V0LCBmYWxzZSBvdGhlcndpc2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzZXRfb3B0aW9ucyggJHZlcmlmeSA9IGZhbHNlICkgewoJCWlmICggJHZlcmlmeSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9IGVsc2UgewoJCQlzZWxmOjokb3B0aW9ucyA9IChhcnJheSlzZWxmOjpzZXR0aW5ncyggJ2RlZmF1bHRfb3B0aW9ucycgKTsKCQkJc2VsZjo6c2F2ZSgpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9IC8vIEVuZCByZXNldF9vcHRpb25zKCkuCgkKCQoJCgkvKioKCSAqCWFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCkKCSAqCgkgKglIZWxwcyBzZWN1cml0eSBieSBhdHRlbXB0aW5nIHRvIGJsb2NrIGRpcmVjdG9yeSBicm93c2luZyBieSBjcmVhdGluZwoJICoJYm90aCBpbmRleC5odG0gZmlsZXMgYW5kIC5odGFjY2VzcyBmaWxlcyB0dXJuaW5nIGJyb3dzaW5nIG9mZi4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJGRpcmVjdG9yeQkJRnVsbCBhYnNvbHV0ZSBwYXNzIHRvIGluc2VydCBhbnRpLWRpcmVjdG9yeS1icm93c2luZyBmaWxlcyBpbnRvLiBObyB0cmFpbGluZyBzbGFzaC4KCSAqCUBwYXJhbQkJYm9vbAkJJGRlbnlfYWxsCQlXaGVuIHRydWUgYWxzbyBlbmZvcmNlIGRlbnlpbmcgQUxMIHdlYi1iYXNlZCBhY2Nlc3MgdG8gZGlyZWN0b3J5LiBkZWZhdWx0IGZhbHNlCgkgKglAcmV0dXJuCQlib29sZWFuCQkJCQkJVHJ1ZSBvbiBzdWNjZXNzIHNlY3VyaW5nIGRpcmVjdG9yeSwgZmFsc2Ugb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCAkZGlyZWN0b3J5ID0gJycsICRkaWVfb25fZmFpbCA9IHRydWUsICRkZW55X2FsbCA9IGZhbHNlLCAkc3VwcHJlc3NfYWxlcnQgPSBmYWxzZSApIHsKCQkKCQkvLyBDaGVjayBkaXJlY3RvcnkgZXhpc3RzICYgY3JlYXRlIGlmIGl0IGRvZXNuJ3QuCgkJaWYgKCAhZmlsZV9leGlzdHMoICRkaXJlY3RvcnkgKSApIHsKCQkJaWYgKCBzZWxmOjokZmlsZXN5c3RlbS0+bWtkaXIoICRkaXJlY3RvcnkgKSA9PT0gZmFsc2UgKSB7CgkJCQkkZXJyb3IgPSAnRXJyb3IgIzkwMDI6IEJhY2t1cEJ1ZGR5IHVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5IGAnIC4gJGRpcmVjdG9yeSAuICdgLiBQbGVhc2UgdmVyaWZ5IHdyaXRlIHBlcm1pc3Npb25zIGZvciB0aGUgcGFyZW50IGRpcmVjdG9yeSBgJyAuIGRpcm5hbWUoICRkaXJlY3RvcnkgKSAuICdgIG9yIG1hbnVhbGx5IGNyZWF0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAmIHNldCBwZXJtaXNzaW9ucy4nOwoJCQkJaWYgKCAkc3VwcHJlc3NfYWxlcnQgIT09IHRydWUgKSB7CgkJCQkJc2VsZjo6YWxlcnQoICRlcnJvciwgdHJ1ZSwgJzkwMDInICk7CgkJCQl9CgkJCQlpZiAoICRkaWVfb25fZmFpbCA9PT0gdHJ1ZSApIHsKCQkJCQlkaWUoICRlcnJvciApOwoJCQkJfQoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoJCQoJCS8vIENoZWNrIHdyaXRhYmxlLgoJCWlmICggISBpc193cml0YWJsZSggJGRpcmVjdG9yeSApICkgewoJCQkkZXJyb3IgPSAnRXJyb3IgIzkwMDJkOiBCYWNrdXBCdWRkeSBkaXJlY3RvcnkgYCcgLiAkZGlyZWN0b3J5IC4gJ2AgaXMgaW5kaWNhdGVkIGFzIE5PVCBiZWluZyB3cml0YWJsZS4gUGxlYXNlIHZlcmlmeSB3cml0ZSBwZXJtaXNzaW9ucyBmb3IgaXQgYW5kIHBhcmVudCBkaXJlY3RvcmllcyBhcyBhcHBsaWNhYmxlLic7CgkJCWlmICggJHN1cHByZXNzX2FsZXJ0ICE9PSB0cnVlICkgewoJCQkJc2VsZjo6YWxlcnQoICRlcnJvciwgdHJ1ZSwgJzkwMDInICk7CgkJCX0KCQkJaWYgKCAkZGllX29uX2ZhaWwgPT09IHRydWUgKSB7CgkJCQlkaWUoICRlcnJvciApOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJLy8gLmh0YWNjZXNzIGNvbnRlbnRzIGZvciBkZW55aW5nLgoJCWlmICggdHJ1ZSA9PT0gJGRlbnlfYWxsICkgewoJCQkkZGVueV9hbGwgPSAiXG5kZW55IGZyb20gYWxsIjsKCQl9IGVsc2UgewoJCQkkZGVueV9hbGwgPSAnJzsKCQl9CgkJCgkJJGVycm9yID0gJyc7CgkJCgkJLy8gaW5kZXgucGhwCgkJaWYgKCAhIGZpbGVfZXhpc3RzKCAkZGlyZWN0b3J5IC4gJy9pbmRleC5waHAnICkgKSB7CgkJCWlmICggZmFsc2UgPT09IEBmaWxlX3B1dF9jb250ZW50cyggJGRpcmVjdG9yeSAuICcvaW5kZXgucGhwJywgJzxodG1sPjwvaHRtbD4nICkgKSB7CgkJCQkkZXJyb3IgLj0gJ1VuYWJsZSB0byB3cml0ZSBpbmRleC5waHAgZmlsZS4gJzsKCQkJfQoJCX0KCQkKCQkvLyBpbmRleC5odG0KCQlpZiAoICEgZmlsZV9leGlzdHMoICRkaXJlY3RvcnkgLiAnL2luZGV4Lmh0bScgKSApIHsKCQkJaWYgKCBmYWxzZSA9PT0gQGZpbGVfcHV0X2NvbnRlbnRzKCAkZGlyZWN0b3J5IC4gJy9pbmRleC5odG0nLCAnPGh0bWw+PC9odG1sPicgKSApIHsKCQkJCSRlcnJvciAuPSAnVW5hYmxlIHRvIHdyaXRlIGluZGV4Lmh0bSBmaWxlLiAnOwoJCQl9CgkJfQoJCQoJCS8vIGluZGV4Lmh0bWwKCQlpZiAoICEgZmlsZV9leGlzdHMoICRkaXJlY3RvcnkgLiAnL2luZGV4Lmh0bWwnICkgKSB7CgkJCWlmICggZmFsc2UgPT09IEBmaWxlX3B1dF9jb250ZW50cyggJGRpcmVjdG9yeSAuICcvaW5kZXguaHRtbCcsICc8aHRtbD48L2h0bWw+JyApICkgewoJCQkJJGVycm9yIC49ICdVbmFibGUgdG8gd3JpdGUgaW5kZXguaHRtbCBmaWxlLiAnOwoJCQl9CgkJfQoJCQoJCS8vIC5odGFjY2VzcwoJCWlmICggISBmaWxlX2V4aXN0cyggJGRpcmVjdG9yeSAuICcvLmh0YWNjZXNzJyApICkgewoJCQlpZiAoIGZhbHNlID09PSBAZmlsZV9wdXRfY29udGVudHMoICRkaXJlY3RvcnkgLiAnLy5odGFjY2VzcycsICdPcHRpb25zIC1JbmRleGVzJyAuICRkZW55X2FsbCApICkgewoJCQkJJGVycm9yIC49ICdVbmFibGUgdG8gd3JpdGUgLmh0YWNjZXNzIGZpbGUuICc7CgkJCX0KCQl9CgkJCgkJaWYgKCAkZXJyb3IgIT0gJycgKSB7IC8vIEZhaWx1cmUuCgkJCWlmICggdHJ1ZSAhPT0gJHN1cHByZXNzX2FsZXJ0ICkgewoJCQkJc2VsZjo6YWxlcnQoICdFcnJvciBjcmVhdGluZyBhbnRpIGRpcmVjdG9yeSBicm93c2luZyBzZWN1cml0eSBmaWxlcyBpbiBkaXJlY3RvcnkgYCcgLiAkZGlyZWN0b3J5IC4gJ2AuIFBsZWFzZSB2ZXJpZnkgdGhpcyBkaXJlY3RvcnlcJ3MgcGVybWlzc2lvbnMgYWxsb3cgd3JpdGluZyAmIHJlYWRpbmcuIEVycm9yczogYCcgLiAkZXJyb3IgLiAnYC4nICk7CgkJCX0KCQkJaWYgKCAkZGllX29uX2ZhaWwgPT09IHRydWUgKSB7CgkJCQlkaWUoICdTY3JpcHQgaGFsdGVkIGZvciBzZWN1cml0eS4gUGxlYXNlIHZlcmlmeSBwZXJtaXNzaW9ucyBhbmQgdHJ5IGFnYWluLicgKTsKCQkJfQoJCX0gZWxzZSB7IC8vIFN1Y2Nlc3MuCgkJCXJldHVybiB0cnVlOwoJCX0KCX0gLy8gRW5kIGFudGlfZGlyZWN0b3J5X2Jyb3dzaW5nKCkuCgkKCQoJCgkvKglzZXRfc3RhdHVzX3NlcmlhbCgpCgkgKgkKCSAqCURlZmluZSBhIGRlZmF1bHQgc2VyaWFsIGZvciBhbGwgc3Vic2VxdWVudCBzdGF0dXMoKSBjYWxscy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRzZXJpYWwJCVVuaXF1ZSBpZGVudGlmaWVyIHRvIHVzZSBhcyBkZWZhdWx0IHNlcmlhbC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRfc3RhdHVzX3NlcmlhbCggJHNlcmlhbCApIHsKCQkKCQlzZWxmOjokX3N0YXR1c19zZXJpYWwgPSAkc2VyaWFsOwoJCQoJCXJldHVybjsKCQkKCX0gLy8gRW5kIHNldF9zdGF0dXNfc2VyaWFsKCkuCgkKCQoJCgkvKglhZGRfc3RhdHVzX3NlcmlhbCgpCgkgKgkKCSAqCUFkZCBhIHNlcmlhbCBmb3IgYWxsIHN1YnNlcXVlbnQgc3RhdHVzKCkgY2FsbHMgdG8gbG9nIHRvIGluIGFkZGl0aW9uIHRvIGFueSBjdXJyZW50bHkgbG9nZ2luZyBzZXJpYWxzLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHNlcmlhbAkJVW5pcXVlIGlkZW50aWZpZXIgdG8gYWRkIHRvIHNlcmlhbHMgdG8gbG9nIHRvLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZF9zdGF0dXNfc2VyaWFsKCAkc2VyaWFsICkgewoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0FkZGluZyBzdGF0dXMgc2VyaWFsIGAnIC4gJHNlcmlhbCAuICdgLicgKTsKCQlpZiAoIGlzX2FycmF5KCBzZWxmOjokX3N0YXR1c19zZXJpYWwgKSApIHsKCQkJc2VsZjo6JF9zdGF0dXNfc2VyaWFsW10gPSAkc2VyaWFsOwoJCX0gZWxzZSB7CgkJCXNlbGY6OiRfc3RhdHVzX3NlcmlhbCA9IGFycmF5KCBzZWxmOjokX3N0YXR1c19zZXJpYWwsICRzZXJpYWwgKTsKCQl9CgkJCgkJcmV0dXJuOwoJCQoJfSAvLyBFbmQgYWRkX3N0YXR1c19zZXJpYWwoKS4KCQoJCgkKCS8qCXJlbW92ZV9zdGF0dXNfc2VyaWFsKCkKCSAqCQoJICoJUmVtb3ZlIGEgc2VyaWFsIGZvciBhbGwgc3Vic2VxdWVudCBzdGF0dXMoKSBjYWxscyB0byBsb2cgdG8gaW4gYWRkaXRpb24gdG8gYW55IGN1cnJlbnRseSBsb2dnaW5nIHNlcmlhbHMuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkc2VyaWFsCQlVbmlxdWUgaWRlbnRpZmllciB0byByZW1vdmUgZnJvbSBzZXJpYWxzIHRvIGxvZyB0by4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZW1vdmVfc3RhdHVzX3NlcmlhbCggJHNlcmlhbCApIHsKCQkKCQlpZiAoIGlzX2FycmF5KCBzZWxmOjokX3N0YXR1c19zZXJpYWwgKSApIHsgLy8gYXJyYXkKCQkJZm9yZWFjaCggc2VsZjo6JF9zdGF0dXNfc2VyaWFsIGFzICRpID0+ICR0aGlzX3NlcmlhbCApIHsKCQkJCWlmICggJHRoaXNfc2VyaWFsID09ICRzZXJpYWwgKSB7CgkJCQkJdW5zZXQoIHNlbGY6OiRfc3RhdHVzX3NlcmlhbFskaV0gKTsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCX0KCQl9IGVsc2UgeyAvLyBzdHJpbmcKCQkJaWYgKCBzZWxmOjokX3N0YXR1c19zZXJpYWwgPT0gJHNlcmlhbCApIHsKCQkJCXNlbGY6OiRfc3RhdHVzX3NlcmlhbCA9PSAnJzsKCQkJfQoJCX0KCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdSZW1vdmVkIHN0YXR1cyBzZXJpYWwgYCcgLiAkc2VyaWFsIC4gJ2AuJyApOwoJCQoJCXJldHVybjsKCQkKCX0gLy8gRW5kIHJlbW92ZV9zdGF0dXNfc2VyaWFsKCkuCgkKCQoJCgkvKglnZXRfc3RhdHVzX3NlcmlhbCgpCgkgKgkKCSAqCUdldCBjdXJyZW50IHNlcmlhbCBzdGF0dXMgbG9ncyBhcmUgZ29pbmcgdG8uCgkgKgkKCSAqCUByZXR1cm4JCXN0cmluZwkJJHNlcmlhbAkJQ3VycmVudCBzZXJpYWwgc2V0LgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9zdGF0dXNfc2VyaWFsKCkgewoJCQoJCXJldHVybiBzZWxmOjokX3N0YXR1c19zZXJpYWw7CgkJCgl9IC8vIEVuZCBnZXRfc3RhdHVzX3NlcmlhbCgpLgoJCgkKCQoJLyoqCgkgKglzZWxmOjpzdGF0dXMoKQoJICoKCSAqCUxvZ3MgZGF0YSB0byBhIENTViBmaWxlLiBPcHRpb25hbCB1bmlxdWUgc2VyaWFsIGlkZW50aWZpZXIuCgkgKglJZiBhIHNlcmlhbCBpcyBwYXNzZWQgdGhlbiBFVkVSWVRISU5HIHdpbGwgYmUgbG9nZ2VkIHRvIHRoZSBzcGVjaWZpZWQgc2VyaWFsIGZpbGUgaW4gYWRkaXRpb24gdG8gd2hhdGV2ZXIgKGlmIGFueXRoaW5nKSBpcyBsb2dnZWQgdG8gbWFpbiBzdGF0dXMgZmlsZS4KCSAqCUFsd2F5cyBsb2dzIHRvIG1haW4gc3RhdHVzIGZpbGUgYmFzZWQgb24gbG9nZ2luZyBzZXR0aW5ncyB3aGV0aGVyIHNlcmlhbCBpcyBwYXNzZWQgb3Igbm90LgoJICoJTk9URTogV2hlbiBmdWxsIGxvZ2dpbmcgaXMgb24gQU5EIGEgc2VyaWFsIGlzIHBhc3NlZCwgaXQgd2lsbCBiZSB3cml0dGVuIHRvIGEgX3N1bV8gdGV4dCBmaWxlIGluc3RlYWQgb2YgdGhlIG1haW4gbG9nIGZpbGUuCgkgKgoJICoJQHNlZSBzZWxmOjpnZXRfc3RhdHVzKCkuCgkgKgoJICoJQHBhcmFtCXN0cmluZwkJCSR0eXBlCQlWYWxpZCB0eXBlczogZXJyb3IsIHdhcm5pbmcsIGRldGFpbHMsIG1lc3NhZ2UKCSAqCUBwYXJhbQlzdHJpbmcJCQkkdGV4dAkJVGV4dCBtZXNzYWdlIHRvIGxvZy4KCSAqCUBwYXJhbQlzdHJpbmd8YXJyYXkJJHNlcmlhbAkJT3B0aW9uYWwuIE9wdGlvbmFsIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBsdWdpbidzIG1lc3NhZ2UuIFN0YXR1cyBtZXNzYWdlcyBhcmUgdW5pcXVlIHBlciBwbHVnaW4gc28gdGhpcyBhZGRzIGFuIGFkZGl0aW9uYWwgdW5pcXVlIGxheWVyIGZvciByZXRyaWV2YWwuCgkgKgkJCQkJCQkJCQlJZiBzZWxmOjokX3N0YXR1c19zZXJpYWwgaGFzIGJlZW4gc2V0IGJ5IHNldF9zdGF0dXNfc2VyaWFsKCkgdGhlbiBpdCB3aWxsIG92ZXJyaWRlIGlmICRzZXJpYWwgaXMgYmxhbmsuCgkgKglAcmV0dXJuCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdGF0dXMoICR0eXBlLCAkbWVzc2FnZSwgJHNlcmlhbHMgPSAnJywgJGpzX21vZGUgPSBmYWxzZSwgJGVjaG9Ob3RXcml0ZSA9IGZhbHNlICkgewoJCQoJCWlmICggISBjbGFzc19leGlzdHMoICdiYWNrdXBidWRkeV9jb3JlJyApICkgewoJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jbGFzc2VzL2NvcmUucGhwJyApOwoJCX0KCQkKCQlpZiAoICggc2VsZjo6JF9zdGF0dXNfc2VyaWFsICE9ICcnICkgJiYgKCAkc2VyaWFscyA9PSAnJyApICkgewoJCQkkc2VyaWFscyA9IHNlbGY6OiRfc3RhdHVzX3NlcmlhbDsKCQl9CgkJaWYgKCAhIGlzX2FycmF5KCAkc2VyaWFscyApICkgewoJCQkkc2VyaWFscyA9IGFycmF5KCAkc2VyaWFscyApOwoJCX0KCQkKCQkKCQkKCQlpZiAoIGRlZmluZWQoICdCQUNLVVBCVUREWV9XUF9DTEknICkgJiYgKCB0cnVlID09PSBCQUNLVVBCVUREWV9XUF9DTEkgKSApIHsKCQkJaWYgKCBjbGFzc19leGlzdHMoICdXUF9DTEknICkgKSB7CgkJCQlXUF9DTEk6OmxpbmUoICR0eXBlIC4gJyAtICcgLiAkbWVzc2FnZSApOwoJCQl9CgkJfQoJCQoJCS8vJGRlbGltaXRlciA9ICd8fnwnOwoJCQoJCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdW5pcXVlIGxvZyBzZXJpYWwgZm9yIGFsbCBsb2dzIGZvciBzZWN1cml0eS4KCQlpZiAoICFpc3NldCggc2VsZjo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSApIHx8ICggc2VsZjo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSA9PSAnJyApICkgewoJCQlzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddID0gc2VsZjo6cmFuZG9tX3N0cmluZyggMTUgKTsKCQkJc2VsZjo6c2F2ZSgpOwoJCX0KCQkKCQlmb3JlYWNoKCAkc2VyaWFscyBhcyAkc2VyaWFsICkgewoJCQkvLyBDYWxjdWxhdGUgbG9nIGRpcmVjdG9yeS4KCQkJJGxvZ19kaXJlY3RvcnkgPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKTsgLy8gQWxzbyBoYW5kbGVzIHdoZW4gd2l0aGluIGltcG9ydGJ1ZGR5LgoJCQkKCQkJLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd3JpdGluZyB0byBtYWluIGZpbGUuCgkJCSR3cml0ZV9tYWluID0gZmFsc2U7CgkJCWlmICggc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddID09IDAgKSB7IC8vIE5vIGxvZ2dpbmcuCgkJCQkJJHdyaXRlX21haW4gPSBmYWxzZTsKCQkJfSBlbHNlaWYgKCBzZWxmOjokb3B0aW9uc1snbG9nX2xldmVsJ10gPT0gMSApIHsgLy8gRXJyb3JzIG9ubHkuCgkJCQlpZiAoICR0eXBlID09ICdlcnJvcicgKSB7CgkJCQkJJHdyaXRlX21haW4gPSB0cnVlOwoJCQkJCXNlbGY6OmxvZyggJ1snIC4gJHNlcmlhbCAuICddICcgLiAkbWVzc2FnZSwgJ2Vycm9yJyApOwoJCQkJfQoJCQl9IGVsc2UgeyAvLyBFdmVyeXRoaW5nIGVsc2UuCgkJCQkkd3JpdGVfbWFpbiA9IHRydWU7CgkJCQlzZWxmOjpsb2coICdbJyAuICRzZXJpYWwgLiAnXSAnIC4gJG1lc3NhZ2UsICR0eXBlICk7CgkJCX0KCQkJCgkJCWlmICggKCAnJyAhPSAkc2VyaWFsICkgKSB7IC8vIEhhcyBhIHNlcmlhbCBzbyByZWRpcmVjdCBsb2cgdG8gdGhpcyBzcGVjaWZpYyBpdGVtIGluc3RlYWQgb2YgY29yZSBsb2cuCgkJCQkkbWFpbl9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnc3RhdHVzLScgLiAkc2VyaWFsIC4gJ19zdW1fJyAuIHNlbGY6OiRvcHRpb25zWydsb2dfc2VyaWFsJ10gLiAnLnR4dCc7CgkJCX0gZWxzZSB7IC8vIE5vcm1hbCBtYWluIGZpbGUuCgkJCQkkbWFpbl9maWxlID0gJGxvZ19kaXJlY3RvcnkgLiAnc3RhdHVzLScgLiBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQl9CgkJCQoJCQkvLyBEZXRlcm1pbmUgd2hldGhlciB3cml0aW5nIHRvIHNlcmlhbCBmaWxlLiBJZ25vcmVzIGxvZyBsZXZlbC4KCQkJaWYgKCAkc2VyaWFsICE9ICcnICkgewoJCQkJJHdyaXRlX3NlcmlhbCA9IHRydWU7CgkJCX0gZWxzZSB7CgkJCQkkd3JpdGVfc2VyaWFsID0gZmFsc2U7CgkJCX0KCQkJCgkJCS8vIFJldHVybiBpZiBub3Qgd3JpdGluZyB0byBhbnkgZmlsZS4KCQkJaWYgKCAoICR3cml0ZV9tYWluICE9PSB0cnVlICkgICYmICggJHdyaXRlX3NlcmlhbCAhPT0gdHJ1ZSApICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCQoJCQkvLyBQcmVwYXJlIGRpcmVjdG9yeSBmb3IgbG9nIGZpbGVzLiBSZXR1cm4gaWYgdW5hYmxlIHRvIGRvIHNvLgoJCQlpZiAoIHRydWUgPT09IHNlbGY6OiRfc2tpcGxvZyApIHsgLy8gYm9vbCB0cnVlIHNvIHNraXAuCgkJCQlyZXR1cm47CgkJCX0gZWxzZWlmKCBmYWxzZSAhPT0gc2VsZjo6JF9za2lwbG9nICkgeyAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBib29sIGZhbHNlIHNvIGNoZWNrIGRpcmVjdG9yeSBiZWZvcmUgcHJvY2VlZGluZy4KCQkJCWlmICggdHJ1ZSAhPT0gc2VsZjo6YW50aV9kaXJlY3RvcnlfYnJvd3NpbmcoICRsb2dfZGlyZWN0b3J5LCAkZGllX29uX2ZhaWwgPSBmYWxzZSwgJGRlbnlfYWxsID0gZmFsc2UsICRzdXBwcmVzc19hbGVydCA9IHRydWUgKSApIHsgLy8gVW5hYmxlIHRvIHNlY3VyZSBkaXJlY3RvcnkuIEZhaWwuCgkJCQkJc2VsZjo6JF9za2lwbG9nID0gdHJ1ZTsKCQkJCQlyZXR1cm47CgkJCQl9IGVsc2UgewoJCQkJCXNlbGY6OiRfc2tpcGxvZyA9IGZhbHNlOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBGdW5jdGlvbiBmb3Igd3JpdGluZyBhY3R1YWwgbG9nIENTViBkYXRhLiBVc2VkIGxhdGVyLgoJCQlpZiAoICFmdW5jdGlvbl9leGlzdHMoICd3cml0ZV9zdGF0dXNfbGluZScgKSApIHsKCQkJCWZ1bmN0aW9uIHdyaXRlX3N0YXR1c19saW5lKCAkZmlsZSwgJGNvbnRlbnRfYXJyYXksICRlY2hvTm90V3JpdGUgKSB7CgkJCQkJJHdyaXRlRGF0YSA9IGpzb25fZW5jb2RlKCAkY29udGVudF9hcnJheSApIC4gUEhQX0VPTDsKCQkJCQlpZiAoIHRydWUgPT09ICRlY2hvTm90V3JpdGUgKSB7IC8vIGVjaG8gZGF0YSBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gZmlsZS4gdXNlZCBieSBhamF4IHdoZW4gY2hlY2tpbmcgc3RhdHVzIGxvZyBhbmQgbmVlZGluZyB0byBwcmVwZW5kIGJlZm9yZSBsb2cuCgkJCQkJCWVjaG8gJHdyaXRlRGF0YTsKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyRkZWxpbWl0ZXIgPSAnfH58JzsKCQkJCQkJaWYgKCBmYWxzZSAhPT0gKCAkZmlsZV9oYW5kbGUgPSBAZm9wZW4oICRmaWxlLCAnYScpICkgKSB7IC8vIEFwcGVuZCBtb2RlLgoJCQkJCQkJLy9mcHV0Y3N2ICggJGZpbGVfaGFuZGxlICwgJGNvbnRlbnRfYXJyYXkgKTsKCQkJCQkJCS8vQGZ3cml0ZSggJGZpbGVfaGFuZGxlLCB0cmltKCBpbXBsb2RlKCAkZGVsaW1pdGVyLCAkY29udGVudF9hcnJheSApICkgLiBQSFBfRU9MICk7CgkJCQkJCQlAZndyaXRlKCAkZmlsZV9oYW5kbGUsICR3cml0ZURhdGEgKTsKCQkJCQkJCUBmY2xvc2UoICRmaWxlX2hhbmRsZSApOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy9wYl9iYWNrdXBidWRkeTo6YWxlcnQoICdVbmFibGUgdG8gb3BlbiBmaWxlIGhhbmRsZXIgZm9yIHN0YXR1cyBmaWxlIGAnIC4gJGZpbGUgLiAnYC4gVW5hYmxlIHRvIHdyaXRlIHN0YXR1cyBsb2cuJyApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQkvKgoJCQkkY29udGVudF9hcnJheSA9IGFycmF5KAoJCQkJcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoIHRpbWUoKSApLCAvL3RpbWUoKSwKCQkJCXNwcmludGYoICIlMDEuMmYiLCByb3VuZCAoIG1pY3JvdGltZSggdHJ1ZSApIC0gc2VsZjo6JHN0YXJ0X3RpbWUsIDIgKSApLAoJCQkJc3ByaW50ZiggIiUwMS4yZiIsIHJvdW5kKCBtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UoKSAvIDEwNDg1NzYsIDIgKSApLAoJCQkJJHR5cGUsCgkJCQlzdHJfcmVwbGFjZSggY2hyKDkpLCAnICAgJywgJG1lc3NhZ2UgKSwKCQkJKTsKCQkJKi8KCQkJCgkJCSRjb250ZW50X2FycmF5ID0gYXJyYXkoCgkJCQknZXZlbnQnCQk9PiAkdHlwZSwKCQkJCSd0aW1lJwkJPT4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoIHRpbWUoKSApLCAvLyBUaW1lIHRoaXMgaGFwcGVuZWQuCgkJCQkndScJCQk9PiBzdWJzdHIoKHN0cmluZyltaWNyb3RpbWUoKSwgMiwgMiksCgkJCQkncnVuJwkJPT4gc3ByaW50ZiggIiUwMS4yZiIsIHJvdW5kICggbWljcm90aW1lKCB0cnVlICkgLSBzZWxmOjokc3RhcnRfdGltZSwgMiApICksIC8vIEVsYXBzZWQgUEhQIHRpbWUuCgkJCQknbWVtJwkJPT4gc3ByaW50ZiggIiUwMS4yZiIsIHJvdW5kKCBtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UoKSAvIDEwNDg1NzYsIDIgKSApLCAvLyBNZW1vcnkgdXNlZC4JCgkJCQknZGF0YScJCT0+IHN0cl9yZXBsYWNlKCBjaHIoOSksICcgICAnLCAkbWVzc2FnZSApLCAvLyBCb2R5IG9mIHRoZSBtZXNzYWdlLgoJCQkpOwoJCQkKCQkJZ2xvYmFsICRwYl9iYWNrdXBidWRkeV9qc19zdGF0dXM7CgkJCWlmICggKCBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgfHwgKCBpc3NldCggJHBiX2JhY2t1cGJ1ZGR5X2pzX3N0YXR1cyApICYmICggJHBiX2JhY2t1cGJ1ZGR5X2pzX3N0YXR1cyA9PT0gdHJ1ZSApICkgKSAmJiAoICd0cnVlJyAhPSBwYl9iYWNrdXBidWRkeTo6X0dFVCgnZGVwbG95JykgKSApIHsgLy8gSWYgaW1wb3J0YnVkZHksIGpzIG1vZGUsIGFuZCBub3QgYSBkZXBsb3ltZW50LgoJCQkJZWNobyAnPHNjcmlwdD5wYl9zdGF0dXNfYXBwZW5kKCAnIC4ganNvbl9lbmNvZGUoICRjb250ZW50X2FycmF5ICkgLiAnICk7PC9zY3JpcHQ+JyAuICJcbiI7CgkJCQlwYl9iYWNrdXBidWRkeTo6Zmx1c2goKTsKCQkJfQoJCQkKCQkJLyoqKioqKioqKiogTUFJTiBMT0cgRklMRSAqKioqKioqKioqLwoJCQlpZiAoICR3cml0ZV9tYWluID09PSB0cnVlICkgeyAvLyBXUklURSBUTyBNQUlOIExPRyBGSUxFLgoJCQkJd3JpdGVfc3RhdHVzX2xpbmUoICRtYWluX2ZpbGUsICRjb250ZW50X2FycmF5LCAkZWNob05vdFdyaXRlICk7CgkJCX0KCQkJCgkJCS8qKioqKioqKioqIFNFUklBTCBMT0cgRklMRSAqKioqKioqKioqLwoJCQlpZiAoICR3cml0ZV9zZXJpYWwgPT09IHRydWUgKSB7CgkJCQkkc2VyaWFsX2ZpbGUgPSAkbG9nX2RpcmVjdG9yeSAuICdzdGF0dXMtJyAuICRzZXJpYWwgLiAnXycgLiBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQkJd3JpdGVfc3RhdHVzX2xpbmUoICRzZXJpYWxfZmlsZSwgJGNvbnRlbnRfYXJyYXksICRlY2hvTm90V3JpdGUgKTsKCQkJfQoJCX0gLy8gZW5kIGZvcmVhY2ggJHNlcmlhbHMuCgkJCgl9IC8vIEVuZCBzdGF0dXMoKS4KCQkKCQoJCgkvKglzZWxmOjpnZXRfc3RhdHVzKCkKCSAqCQoJICoJR2V0cyBhbGwgc3RhdHVzIGluZm9ybWF0aW9uIGxvZ2dlZCB2aWEgc3RhdHVzKCkuIFJldHVybnMgYW4gYXJyYXkgb2YgYXJyYXlzIHdpdGggbG9nZ2VkIGRhdGEuCgkgKglSZXR1cm4gZm9ybWF0OiBhcnJheSgKCSAqCQkJCQlhcnJheSggVElNRVNUQU1QLCBUSU1FX0lOLCBQRUFLX01FTU9SWSwgVFlQRSwgTUVTU0FHRSApLAoJICoJCQkJCWFycmF5KCBUSU1FU1RBTVAsIFRZUEUsIE1FU1NBR0UgKSwKCSAqCQkJCSkKCSAqCgkgKglAc2VlIHNlbGY6OnN0YXR1cygpLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHNlcmlhbAkJCQkJVW5pcXVlIGlkZW50aWZpZXIuIFJldHJpZXZlcyBhIHN1YnNldCBvZiBsb2dnZWQgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhpcyB1bmlxdWUgSUQgdGhhdCB3YXMgcGFzc2VkIHRvIHN0YXR1cygpIHdoZW4gbG9nZ2luZy4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGNsZWFyX3JldHJpZXZlZAkJRGVmYXVsdDogdHJ1ZS4gT24gdHJ1ZSBzdGF0dXMgaW5mb3JtYXRpb24gd2lsbCBiZSBwdXJnZWQgYWZ0ZXIgcmV0cmlldmFsLgoJICoJQHBhcmFtCQlib29sZWFuCQkkZXJhc2VfcmV0cmlldmVkCQlEZWZhdWx0OiB0cnVlLiBXaGV0aGVyIG9yIG5vdCB0byBkZWxldGUgbG9nIGZpbGUgb24gcmV0cmlldmFsLiBOT1RFOiBQQ0xaaXAgY2FuIE5PVCBsb3NlIGZpbGVzIG1pZC1iYWNrdXAgc28gbG9nIGZpbGVzIGNhbm5vdCBkZWxldGUgbWlkLXppcC4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGhpZGVfZ2V0dGluZ19zdGF0dXMJRGVmYXVsdDogZmFsc2UuIFdoZXRoZXIgb3Igbm90IHRvIG91dHB1dCBzdGF0dXMgcmV0cmlldmFsIG1lc3NhZ2UuCgkgKglAcmV0dXJuCQlhcnJheQkJCQkJCQkJQXJyYXkgb2YgYXJyYXlzLiAgRWFjaCBzdWItYXJyYXkgY29udGFpbnMgdGhyZWUgdmFsdWVzOiB0aW1lc3RhbXAsIHR5cGUgb2YgbWVzc2FnZSwgYW5kIHRoZSBtZXNzYWdlIGl0c2VsZi4gU2VlIGZ1bmN0aW9uIGRlc2NyaXB0aW9uIGZvciBkZXRhaWxzLiBFbXB0eSBhcnJheSBpZiBub24tZXhpc3RpbmcgbG9nLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9zdGF0dXMoICRzZXJpYWwgPSAnJywgJGNsZWFyX3JldHJpZXZlZCA9IHRydWUsICRlcmFzZV9yZXRyaWV2ZWQgPSB0cnVlLCAkaGlkZV9nZXR0aW5nX3N0YXR1cyA9IGZhbHNlICkgewoJCS8vJGRlbGltaXRlciA9ICd8fnwnOwoJCQoJCS8vIENhbGN1bGF0ZSBsb2cgZGlyZWN0b3J5LgoJCSRsb2dfZGlyZWN0b3J5ID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCk7IC8vIEFsc28gaGFuZGxlcyB3aGVuIGltcG9ydGJ1ZGR5LgoJCQoJCSRzdGF0dXNfZmlsZSA9ICRsb2dfZGlyZWN0b3J5IC4gJ3N0YXR1cy0nOwoJCWlmICggJHNlcmlhbCAhPSAnJyApIHsKCQkJJHN0YXR1c19maWxlIC49ICRzZXJpYWwgLiAnXyc7CgkJfQoJCSRzdGF0dXNfZmlsZSAuPSBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJCQoJCWlmICggIWZpbGVfZXhpc3RzKCAkc3RhdHVzX2ZpbGUgKSApIHsKCQkJcmV0dXJuIGFycmF5KCk7IC8vIE5vIGxvZy4KCQl9CgkJCgkJaWYgKCAkaGlkZV9nZXR0aW5nX3N0YXR1cyA9PT0gZmFsc2UgKSB7CgkJCXNlbGY6OnN0YXR1cyggJ2RldGFpbHMnLCAnR2V0dGluZyBzdGF0dXMgZm9yIHNlcmlhbCBgJyAuICRzZXJpYWwgLiAnYC4gQ2xlYXI6IGAnIC4gKCAkY2xlYXJfcmV0cmlldmVkID8gJ3RydWUnIDogJ2ZhbHNlJyApIC4gJ2AnLCAkc2VyaWFsICk7CgkJfQoJCQoJCWlmICggZmFsc2UgIT09ICggJGZoID0gQGZvcGVuKCAkc3RhdHVzX2ZpbGUsICdyJykgKSApIHsgLy8gUmVhZCB3cml0ZSBtb2RlLgoJCQkkc3RhdHVzX2xpbmVzID0gYXJyYXkoKTsKCQkJd2hpbGUgKCBmYWxzZSAhPT0gKCAkc3RhdHVzX2xpbmUgPSBmZ2V0cyggJGZoICkgKSApIHsKCQkJCS8qCgkJCQlpZiAoIHN0cmlzdHIoICRzdGF0dXNfbGluZSwgJGRlbGltaXRlciApICkgeyAvLyBEZWxpbWluYXRvciBpbiBsaW5lLgoJCQkJCSRzdGF0dXNfbGluZXNbXSA9IGV4cGxvZGUoICRkZWxpbWl0ZXIsIHRyaW0oICRzdGF0dXNfbGluZSApICk7CgkJCQl9IGVsc2UgeyAvLyBObyBkZWxpbWluYXRvci4gSnVzdCBwcmludCBsaW5lIHdpdGggYmxhbmsgdmFsdWVzLgoJCQkJCSRzdGF0dXNfbGluZXNbXSA9IGFycmF5KCAwLDAsMCwndW5rbm93bicsIHRyaW0oICRzdGF0dXNfbGluZSApICk7CgkJCQl9CgkJCQkqLwoJCQkJJHN0YXR1c19saW5lc1tdID0gJHN0YXR1c19saW5lOwoJCQl9CgkJCWZjbG9zZSggJGZoICk7CgkJCQoJCQlpZiAoICRjbGVhcl9yZXRyaWV2ZWQgPT09IHRydWUgKSB7CgkJCQlmaWxlX3B1dF9jb250ZW50cyggJHN0YXR1c19maWxlLCAnJyApOwoJCQl9CgkJCQoJCQlpZiAoICRlcmFzZV9yZXRyaWV2ZWQgPT09IHRydWUgKSB7CgkJCQlAdW5saW5rKCAkc3RhdHVzX2ZpbGUgKTsgLy8gdG9kbzogY2F0Y2ggZXJyb3JzIG9uIHRoaXM/IHN1cHJlc3M/CgkJCX0KCQkJCgkJCXJldHVybiAkc3RhdHVzX2xpbmVzOwoJCX0gZWxzZSB7CgkJCS8vc2VsZjo6YWxlcnQoICdVbmFibGUgdG8gb3BlbiBmaWxlIGhhbmRsZXIgZm9yIHN0YXR1cyBmaWxlIGAnIC4gJHN0YXR1c19maWxlIC4gJ2AuIFVuYWJsZSB0byB3cml0ZSBzdGF0dXMgbG9nLicgKTsKCQl9Cgl9IC8vIEVuZCBnZXRfc3RhdHVzKCkuCgkKCQoJCgkvKioKCSAqCXN0YXR1c19ib3goKQoJICoKCSAqCURpc3BsYXlzIGEgdGV4dGFyZWEgZm9yIHBsYWNpbmcgc3RhdHVzIHRleHQgaW50by4KCSAqCgkgKglAcGFyYW0JCQkkZGVmYXVsdF90ZXh0CXN0cmluZwkJRmlyc3QgbGluZSBvZiB0ZXh0IHRvIGRpc3BsYXkuCgkgKglAcGFyYW0JCQlib29sZWFuCQkJJGhpZGRlbgkJV2hldGhlciBvciBub3QgdG8gYXBwbHkgZGlzcGxheTogbm9uZTsgQ1NTLgoJICoJQHJldHVybgkJCQkJCQlzdHJpbmcJCUhUTUwgZm9yIHRleHRhcmVhLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0YXR1c19ib3goICRkZWZhdWx0X3RleHQgPSAnJywgJGhpZGRlbiA9IGZhbHNlICkgewoJCWRlZmluZSggJ1BCX1NUQVRVUycsIHRydWUgKTsgLy8gVGVsbHMgZnJhbWV3b3JrIHN0YXR1cygpIGZ1bmN0aW9uIHRvIG91dHB1dCBmdXR1cmUgbG9nZ2luZyBpbmZvIGludG8gc3RhdHVzIGJveCB2aWEgamF2YXNjcmlwdC4KCQkkcmV0dXJuID0gJzx0ZXh0YXJlYSByZWFkb25seT0icmVhZG9ubHkiIGlkPSJwYl9iYWNrdXBidWRkeV9zdGF0dXMiIHdyYXA9Im9mZiInOwoJCWlmICggJGhpZGRlbiA9PT0gdHJ1ZSApIHsKCQkJJHJldHVybiAuPSAnIHN0eWxlPSJkaXNwbGF5OiBub25lOyAiJzsKCQl9CgkJJHJldHVybiAuPSAnPicgLiAkZGVmYXVsdF90ZXh0IC4gJzwvdGV4dGFyZWE+JzsKCQkKCQlyZXR1cm4gJHJldHVybjsKCX0gLy8gRW5kIHN0YXR1c19ib3goKS4KCQoJCgkKCS8qKgoJICoJc2V0X2dyZWVkeV9zY3JpcHRfbGltaXRzKCkKCSAqCgkgKglTZXRzIGdyZWVkeSBzY3JpcHQgbGltaXRzIHRvIGhlbHAgcHJldmVudCB0aW1lb3V0cywgcnVubmluZyBvdXQgb2YgbWVtb3J5LCBldGMuCgkgKgoJICoJQHJldHVybgkJbnVsbAoJICoKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRfZ3JlZWR5X3NjcmlwdF9saW1pdHMoICRzdXByZXNzX3N0YXR1cyA9IGZhbHNlICkgIHsKCQoJCSRyZXF1ZXN0ZWRfc29ja2V0X3RpbWVvdXQgPSA2MCAqIDYwICogMjsKCQkkcmVxdWVzdGVkX2V4ZWN1dGlvbl90aW1lID0gNjAgKiA2MCAqIDI7CgkJCgkJLy8gRG9uJ3QgYWJvcnQgc2NyaXB0IGlmIHRoZSBjbGllbnQgY29ubmVjdGlvbiBpcyBsb3N0L2Nsb3NlZAoJCUBpZ25vcmVfdXNlcl9hYm9ydCggdHJ1ZSApOwoJCQoJCS8vIFNldCBzb2NrZXQgdGltZW91dCB0byByZXF1ZXN0ZWQgcGVyaW9kLgoJCUBpbmlfc2V0KCAnZGVmYXVsdF9zb2NrZXRfdGltZW91dCcsICRyZXF1ZXN0ZWRfc29ja2V0X3RpbWVvdXQgKTsKCQkKCQkvLyBTZXQgbWF4aW11bSBleGVjdXRpb24gdGltZSB0byByZXF1ZXN0ZWQgcGVyaW9kIGlmIG5vdCBhbHJlYWR5IGJldHRlciB0aGFuIHRoYXQKCQkvLyBTZWUgaWYgd2UgY2FuIGdldCBhIGN1cnJlbnQgdmFsdWUgKG9mIGFueSBzb3J0KQoJCWlmICggZmFsc2UgPT09ICggJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lID0gQGluaV9nZXQoICdtYXhfZXhlY3V0aW9uX3RpbWUnICkgKSApIHsKCQkJJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lID0gJ1Vua25vd24nOwoJCX0KCQkKCQkvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHRyeSBhbmQgc2V0L2luY3JlYXNlCgkJaWYgKCBpc19udW1lcmljKCAkb3JpZ2luYWxfZXhlY3V0aW9uX3RpbWUgKSAmJiAoICggMCA9PSAkb3JpZ2luYWxfZXhlY3V0aW9uX3RpbWUgKSB8fCAoICRyZXF1ZXN0ZWRfZXhlY3V0aW9uX3RpbWUgPD0gJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lICkgKSApIHsKCQkJLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgbWF4X2V4ZWN1dGlvbl90aW1lCgkJCWlmICggZmFsc2UgPT09ICRzdXByZXNzX3N0YXR1cyApIHsKCQkJCWlmICggZmFsc2UgPT09ICggJGNvbmZpZ3VyZWRfZXhlY3V0aW9uX3RpbWUgPSBAZ2V0X2NmZ192YXIoICdtYXhfZXhlY3V0aW9uX3RpbWUnICkgKSApIHsKCQkJCQkkY29uZmlndXJlZF9leGVjdXRpb25fdGltZSA9ICdVbmtub3duJzsKCQkJCX0KCQkJCWlmICggZmFsc2UgPT09ICggJGN1cnJlbnRfZXhlY3V0aW9uX3RpbWUgPSBAaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKSApICkgewoJCQkJCSRjdXJyZW50X2V4ZWN1dGlvbl90aW1lID0gJ1Vua25vd24nOwoJCQkJfQoJCQkJc2VsZjo6c3RhdHVzKCAnZGV0YWlscycsIF9fKCAnTWF4aW11bSBQSFAgZXhlY3V0aW9uIHRpbWUgd2FzIG5vdCBtb2RpZmllZCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdSZXBvcnRlZCBQSFAgZXhlY3V0aW9uIHRpbWUgLSBDb25maWd1cmVkOiAlMSRzOyBPcmlnaW5hbDogJTIkczsgQ3VycmVudDogJTMkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkY29uZmlndXJlZF9leGVjdXRpb25fdGltZSwgJG9yaWdpbmFsX2V4ZWN1dGlvbl90aW1lLCAkY3VycmVudF9leGVjdXRpb25fdGltZSApICk7CgkJCX0KCQl9IGVsc2UgewoJCQkvLyBFaXRoZXIgbm90IGEgbnVtZXJpYyB2YWx1ZSBvciB3ZSBuZWVkIHRvIHRyeSBhbmQgaW5jcmVhc2UKCQkJQHNldF90aW1lX2xpbWl0KCAkcmVxdWVzdGVkX2V4ZWN1dGlvbl90aW1lICk7CgkJCWlmICggZmFsc2UgPT09ICRzdXByZXNzX3N0YXR1cyApIHsKCQkJCWlmICggZmFsc2UgPT09ICggJGNvbmZpZ3VyZWRfZXhlY3V0aW9uX3RpbWUgPSBAZ2V0X2NmZ192YXIoICdtYXhfZXhlY3V0aW9uX3RpbWUnICkgKSApIHsKCQkJCQkkY29uZmlndXJlZF9leGVjdXRpb25fdGltZSA9ICdVbmtub3duJzsKCQkJCX0KCQkJCWlmICggZmFsc2UgPT09ICggJGN1cnJlbnRfZXhlY3V0aW9uX3RpbWUgPSBAaW5pX2dldCggJ21heF9leGVjdXRpb25fdGltZScgKSApICkgewoJCQkJCSRjdXJyZW50X2V4ZWN1dGlvbl90aW1lID0gJ1Vua25vd24nOwoJCQkJfQoJCQkJc2VsZjo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnQXR0ZW1wdGVkIHRvIHNldCBQSFAgZXhlY3V0aW9uIHRpbWUgdG8gJTEkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkcmVxdWVzdGVkX2V4ZWN1dGlvbl90aW1lICkgKTsKCQkJCXNlbGY6OnN0YXR1cyggJ2RldGFpbHMnLCBzcHJpbnRmKCBfXyggJ1JlcG9ydGVkIFBIUCBleGVjdXRpb24gdGltZSAtIENvbmZpZ3VyZWQ6ICUxJHM7IE9yaWdpbmFsOiAlMiRzOyBDdXJyZW50OiAlMyRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICRjb25maWd1cmVkX2V4ZWN1dGlvbl90aW1lLCAkb3JpZ2luYWxfZXhlY3V0aW9uX3RpbWUsICRjdXJyZW50X2V4ZWN1dGlvbl90aW1lICkgKTsKCQkJfQoJCX0KCQkKCQkKCQkvLyBTZXQgbWVtb3J5X2xpbWl0IHRvIGVpdGhlciB0aGUgdXNlciBkZWZpbmVkIChXb3JkUHJlc3MgZGVmYXVsdGVkKSBvciBvdmVyLXJpZGRlbiB2YWx1ZQoJCS8vIE5lZWQgdG8gZ2V0IHRoZSBvcmlnaW5hbCB2YWx1ZSBoZXJlIGFzIHdlIHdpbGwgYmUgdXBkYXRpbmcgaXQKCQlpZiAoIGZhbHNlID09PSAoICRvcmlnaW5hbF9tZW1vcnlfbGltaXQgPSBAaW5pX2dldCggJ21lbW9yeV9saW1pdCcgKSApICkgewoJCQkkb3JpZ2luYWxfbWVtb3J5X2xpbWl0ID0gJ1Vua25vd24nOwoJCX0KCgkJLy8gTmVlZCB0byBjaGVjayBpZiB3ZSBhcmUgcnVubmluZyBvdXRzaWRlIG9mIFdvcmRQcmVzcyBpbiB3aGljaCBjYXNlIHdlIGRvbid0IHRyeSBhbmQgY2hhbmdlIGFueXRoaW5nCgkJLy8gYnV0IGp1c3QgcmVwb3J0IHRoZSBtZW1vcnlfbGltaXQgdmFsdWVzLiBUaGUgdXNlciB3aWxsIGhhdmUgdG8gdXBkYXRlIGNvbmZpZyBpZiBuZWNlc3NhcnkgYmVjYXVzZQoJCS8vIHRoZXJlIGlzIG5vIG90aGVyIG1lY2hhbmlzbSB0byBzZXQgdGhlIHZhbGlkIG1lbW9yeV9saW1pdC4KCQkvLyBJZiB3ZSBhcmUgcnVubmluZyB1bmRlciBXb3JkUHJlc3MgdGhlbiBuZWVkIGEgbGl0dGxlIGZha2VyeSBmb3IgZWFybGllciB2ZXJzaW9ucy4KCQlpZiAoICEgZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgfHwgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiAoIGZhbHNlID09PSBQQl9TVEFOREFMT05FICkgKSApIHsJCgkJCS8vIE5vdGU6IFdQX01BWF9NRU1PUllfTElNSVQgd2FzIGludHJvZHVjZWQgV1AzLjIgc28gd2UgbmVlZCB0byBmYWtlIGl0IGlmIGNvbnN0YW50IG5vdCBhbHJlYWR5IGRlZmluZWQKCQkJLy8gVXNlIHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgV29yZFByZXNzIHVzZXMgaWYgdGhlIHVzZXIgaGFzbid0IGRlZmluZWQgaXQKCQkJaWYgKCAhIGRlZmluZWQoICdXUF9NQVhfTUVNT1JZX0xJTUlUJyApICkgewoJCQkJZGVmaW5lKCAnV1BfTUFYX01FTU9SWV9MSU1JVCcsICcyNTZNJyApOwoJCQl9CgkJCUBpbmlfc2V0KCAnbWVtb3J5X2xpbWl0JywgYXBwbHlfZmlsdGVycyggJ2FkbWluX21lbW9yeV9saW1pdCcsIFdQX01BWF9NRU1PUllfTElNSVQgKSApOwoJCQlpZiAoIGZhbHNlID09PSAkc3VwcmVzc19zdGF0dXMgKSB7CgkJCQlzZWxmOjpzdGF0dXMoICdkZXRhaWxzJywgc3ByaW50ZiggX18oICdBdHRlbXB0ZWQgdG8gc2V0IFBIUCBtZW1vcnkgbGltaXQgdG8gdXNlciBkZWZpbmVkIFdQX01BWF9NRU1PUllfTElNSVQgKCUxJHMpIG9yIG92ZXItcmlkZGVuIHZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksIFdQX01BWF9NRU1PUllfTElNSVQgKSApOwoJCQl9CgkJfQoJCWlmICggZmFsc2UgPT09ICRzdXByZXNzX3N0YXR1cyApIHsKCQkJaWYgKCBmYWxzZSA9PT0gKCAkY29uZmlndXJlZF9tZW1vcnlfbGltaXQgPSBAZ2V0X2NmZ192YXIoICdtZW1vcnlfbGltaXQnICkgKSApIHsKCQkJCSRjb25maWd1cmVkX21lbW9yeV9saW1pdCA9ICdVbmtub3duJzsKCQkJfQoJCQlpZiAoIGZhbHNlID09PSAoICRjdXJyZW50X21lbW9yeV9saW1pdCA9IEBpbmlfZ2V0KCAnbWVtb3J5X2xpbWl0JyApICkgKSB7CgkJCQkkY3VycmVudF9tZW1vcnlfbGltaXQgPSAnVW5rbm93bic7CgkJCX0KCQkJc2VsZjo6c3RhdHVzKCAnZGV0YWlscycsIHNwcmludGYoIF9fKCAnUmVwb3J0ZWQgUEhQIG1lbW9yeSBsaW1pdHMgLSBDb25maWd1cmVkOiAlMSRzOyBPcmlnaW5hbDogJTIkczsgQ3VycmVudDogJTMkcycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAkY29uZmlndXJlZF9tZW1vcnlfbGltaXQsICRvcmlnaW5hbF9tZW1vcnlfbGltaXQsICRjdXJyZW50X21lbW9yeV9saW1pdCApICk7CgkJfQoKCX0gLy8gRW5kIHNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpLgoJCgkKCQoJLyoqCgkgKglzZWxmOjpsb2coKQoJICoKCSAqCUxvZ3MgdG8gYSB0ZXh0IGZpbGUgZGVwZW5kaW5nIG9uIHNldHRpbmdzLgoJICoJMCA9IG5vbmUsIDEgPSBlcnJvcnMgb25seSwgMiA9IGVycm9ycyArIHdhcm5pbmdzLCAzID0gZGVidWdnaW5nIChhbGwga2luZHMgb2YgYWN0aW9ucykKCSAqCgkgKglAcGFyYW0Jc3RyaW5nCSR0ZXh0CQlUZXh0IHRvIGxvZy4KCSAqCUBwYXJhbQlzdHJpbmcJJGxvZ190eXBlCVZhbGlkIG9wdGlvbnM6IGVycm9yLCB3YXJuaW5nLCBhbGwgKGRlZmF1bHQgc28gbWF5IGJlIG9taXR0ZWQpLgoJICoJQHJldHVybgludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9nKCAkdGV4dCwgJGxvZ190eXBlID0gJ2FsbCcgKSB7CgkJaWYgKCBkZWZpbmVkKCAnUEJfREVNT19NT0RFJyApIHx8ICFpc3NldCggc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddICkgfHwgKCBzZWxmOjokb3B0aW9uc1snbG9nX2xldmVsJ10gPT0gMCApICkgeyAvLyBObyBsb2dnaW5nIGluIHRoaXMgcGx1Z2luIG9yIGRpc2FibGVkLgoJCQlyZXR1cm47CgkJfQoJCQoJCSR3cml0ZSA9IGZhbHNlOwoJCWlmICggc2VsZjo6JG9wdGlvbnNbJ2xvZ19sZXZlbCddID09IDEgKSB7IC8vIEVycm9ycyBvbmx5LgoJCQlpZiAoICRsb2dfdHlwZSA9PSAnZXJyb3InICkgewoJCQkJJHdyaXRlID0gdHJ1ZTsKCQkJfQoJCX0gZWxzZSB7IC8vIEFsbCBsb2dnaW5nIChkZWJ1ZyBtb2RlKS4KCQkJJHdyaXRlID0gdHJ1ZTsKCQl9CgkJCgkJaWYgKCAkd3JpdGUgPT09IHRydWUgKSB7CgkJCWlmICggIWlzc2V0KCBzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddICkgKSB7CgkJCQlzZWxmOjokb3B0aW9uc1snbG9nX3NlcmlhbCddID0gc2VsZjo6cmFuZG9tX3N0cmluZyggMTUgKTsKCQkJCXNlbGY6OnNhdmUoKTsKCQkJfQoJCQkkZmggPSBAZm9wZW4oIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2xvZy0nIC4gc2VsZjo6JG9wdGlvbnNbJ2xvZ19zZXJpYWwnXSAuICcudHh0JywgJ2EnKTsKCQkJaWYgKCAkZmggKSB7CgkJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cyggJ2dldF9vcHRpb24nICkgKSB7CgkJCQkJJGdtdF9vZmZzZXQgPSBnZXRfb3B0aW9uKCAnZ210X29mZnNldCcgKTsKCQkJCX0gZWxzZSB7CgkJCQkJJGdtdF9vZmZzZXQgPSAwOwoJCQkJfQoJCQkJZndyaXRlKCAkZmgsICdbJyAuIGRhdGUoICdNIGosIFkgSDppOnMgJyAuICRnbXRfb2Zmc2V0LCB0aW1lKCkgKyAoICRnbXRfb2Zmc2V0ICogMzYwMCkgKSAuICctJyAuICRsb2dfdHlwZSAuICddICcgLiAkdGV4dCAuICJcbiIgKTsKCQkJCWZjbG9zZSggJGZoICk7CgkJCX0KCQl9Cgl9IC8vIEVuZCBsb2coKS4KCQoJCgkKCS8qCXNlbGY6OnJhbmRvbV9zdHJpbmcoKQoJICoJCgkgKglHZW5lcmF0ZSBhIHJhbmRvbSBzdHJpbmcgb2YgY2hhcmFjdGVycy4KCSAqCQoJICoJQHBhcmFtCQkKCSAqCUByZXR1cm4JCQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJhbmRvbV9zdHJpbmcoICRsZW5ndGggPSAzMiwgJGNoYXJzID0gJ2FiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwJyApIHsKCQkkY2hhcnNfbGVuZ3RoID0gKCBzdHJsZW4oICRjaGFycyApIC0gMSApOwoJCSRzdHJpbmcgPSAkY2hhcnN7cmFuZCgwLCAkY2hhcnNfbGVuZ3RoKX07CgkJZm9yICggJGkgPSAxOyAkaSA8ICRsZW5ndGg7ICRpID0gc3RybGVuKCAkc3RyaW5nICkgKSB7CgkJCSRyID0gJGNoYXJze3JhbmQoMCwgJGNoYXJzX2xlbmd0aCl9OwoJCQlpZiAoICRyICE9ICRzdHJpbmd7JGkgLSAxfSApICRzdHJpbmcgLj0gICRyOwoJCX0KCQlyZXR1cm4gJHN0cmluZzsKCX0gLy8gRW5kIHJhbmRvbV9zdHJpbmcoKS4KCQoJCgkKCS8qKgoJICoJc2VsZjo6dmlkZW8oKQoJICoKCSAqCURpc3BsYXlzIGEgbWVzc2FnZSB0byB0aGUgdXNlciB3aGVuIHRoZXkgaG92ZXIgb3ZlciB0aGUgcXVlc3Rpb24gbWFyay4gR3JhY2VmdWxseSBmYWxscyBiYWNrIHRvIG5vcm1hbCB0b29sdGlwLgoJICoJSFRNTCBpcyBzdXBwb3NlZCB3aXRoaW4gdG9vbHRpcHMuCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSR2aWRlb19rZXkJCVlvdVR1YmUgdmlkZW8ga2V5IGZyb20gdGhlIFVSTCA/dj1WSURFT19LRVlfSEVSRQoJICoJQHBhcmFtCQlzdHJpbmcJCSR0aXRsZQkJCVRpdGxlIG9mIG1lc3NhZ2UgdG8gc2hvdyB0byB1c2VyLiBUaGlzIGlzIGRpc3BsYXllZCBhdCB0b3Agb2YgdGlwIGluIGJpZ2dlciBsZXR0ZXJzLiBEZWZhdWx0IGlzIGJsYW5rLiAob3B0aW9uYWwpCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvX3RpcAkJV2hldGhlciB0byBlY2hvIHRoZSB0aXAgKGRlZmF1bHQ7IHRydWUpLCBvciByZXR1cm4gdGhlIHRpcCAoZmFsc2UpLiAob3B0aW9uYWwpCgkgKglAcmV0dXJuCQlzdHJpbmcvbnVsbAkJCQkJSWYgbm90IGVjaG9pbmcgdGlwIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGVjaG9pbmcgdGhlcmUgaXMgbm8gcmV0dXJuLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZpZGVvKCAkdmlkZW9fa2V5LCAkdGl0bGUgPSAnJywgJGVjaG9fdGlwID0gdHJ1ZSApIHsKCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICd1aScgKTsgLy8gJHVpIGNsYXNzIHJlcXVpcmVkIHBhZ2VzIGNvbnRyb2xsZXIgYW5kIG1heSBub3QgYmUgc2V0IHVwIGlmIG5vdCBpbiBvdXIgb3duIHBhZ2VzLgoJCXJldHVybiBzZWxmOjokdWktPnZpZGVvKCAkdmlkZW9fa2V5LCAkdGl0bGUsICRlY2hvX3RpcCApOwoJfSAvLyBFbmQgdmlkZW8oKS4KCQoJCgkKCS8qKgoJICoJc2VsZjo6YWxlcnQoKQoJICoKCSAqCURpc3BsYXlzIGEgbWVzc2FnZSB0byB0aGUgdXNlciBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHdoZW4gaW4gdGhlIGRhc2hib2FyZC4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJG1lc3NhZ2UJCU1lc3NhZ2UgeW91IHdhbnQgdG8gZGlzcGxheSB0byB0aGUgdXNlci4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGVycm9yCQkJT1BUSU9OQUwhIHRydWUgaW5kaWNhdGVzIHRoaXMgYWxlcnQgaXMgYW4gZXJyb3IgYW5kIGRpc3BsYXlzIGFzIHJlZC4gRGVmYXVsdDogZmFsc2UKCSAqCUBwYXJhbQkJaW50CQkJJGVycm9yX2NvZGUJCU9QVElPTkFMISBFcnJvciBjb2RlIG51bWJlciB0byB1c2UgaW4gbGlua2luZyBpbiB0aGUgd2lraSBmb3IgZWFzeSByZWZlcmVuY2UuCgkgKglAcmV0dXJuCQlzdHJpbmcvbnVsbAkJCQkJSWYgbm90IGVjaG9pbmcgYWxlcnQgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gZWNob2luZyB0aGVyZSBpcyBubyByZXR1cm4uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWxlcnQoICRtZXNzYWdlLCAkZXJyb3IgPSBmYWxzZSwgJGVycm9yX2NvZGUgPSAnJyApIHsKCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICd1aScgKTsgLy8gJHVpIGNsYXNzIHJlcXVpcmVkIHBhZ2VzIGNvbnRyb2xsZXIgYW5kIG1heSBub3QgYmUgc2V0IHVwIGlmIG5vdCBpbiBvdXIgb3duIHBhZ2VzLgoJCXNlbGY6OiR1aS0+YWxlcnQoICRtZXNzYWdlLCAkZXJyb3IsICRlcnJvcl9jb2RlICk7Cgl9IC8vIEVuZCBhbGVydCgpLgoJCgkKCQoJLy8gRGlzbWlzc2FibGUgYWxlcnQgc3lzdGVtLiBVc2VzIGFsZXJ0KCkuCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRpc2FsZXJ0KCAkdW5pcXVlX2lkLCAkbWVzc2FnZSApIHsKCQlzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoICd1aScgKTsgLy8gJHVpIGNsYXNzIHJlcXVpcmVkIHBhZ2VzIGNvbnRyb2xsZXIgYW5kIG1heSBub3QgYmUgc2V0IHVwIGlmIG5vdCBpbiBvdXIgb3duIHBhZ2VzLgoJCXNlbGY6OiR1aS0+ZGlzYWxlcnQoICR1bmlxdWVfaWQsICRtZXNzYWdlICk7Cgl9IC8vIEVuZCBkaXNhbGVydCgpLgoJCgkKCQoJLyoqCgkgKglzZWxmOjp0aXAoKQoJICoKCSAqCURpc3BsYXlzIGEgbWVzc2FnZSB0byB0aGUgdXNlciB3aGVuIHRoZXkgaG92ZXIgb3ZlciB0aGUgcXVlc3Rpb24gbWFyay4gR3JhY2VmdWxseSBmYWxscyBiYWNrIHRvIG5vcm1hbCB0b29sdGlwLgoJICoJSFRNTCBpcyBzdXBwb3NlZCB3aXRoaW4gdG9vbHRpcHMuCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSRtZXNzYWdlCQlBY3R1YWwgbWVzc2FnZSB0byBzaG93IHRvIHVzZXIuCgkgKglAcGFyYW0JCXN0cmluZwkJJHRpdGxlCQkJVGl0bGUgb2YgbWVzc2FnZSB0byBzaG93IHRvIHVzZXIuIFRoaXMgaXMgZGlzcGxheWVkIGF0IHRvcCBvZiB0aXAgaW4gYmlnZ2VyIGxldHRlcnMuIERlZmF1bHQgaXMgYmxhbmsuIChvcHRpb25hbCkKCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGVjaG9fdGlwCQlXaGV0aGVyIHRvIGVjaG8gdGhlIHRpcCAoZGVmYXVsdDsgdHJ1ZSksIG9yIHJldHVybiB0aGUgdGlwIChmYWxzZSkuIChvcHRpb25hbCkKCSAqCUByZXR1cm4JCXN0cmluZy9udWxsCQkJCQlJZiBub3QgZWNob2luZyB0aXAgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gZWNob2luZyB0aGVyZSBpcyBubyByZXR1cm4uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdGlwKCAkbWVzc2FnZSwgJHRpdGxlID0gJycsICRlY2hvX3RpcCA9IHRydWUgKSB7CgkJc2VsZjo6aW5pdF9jbGFzc19jb250cm9sbGVyKCAndWknICk7IC8vICR1aSBjbGFzcyByZXF1aXJlZCBwYWdlcyBjb250cm9sbGVyIGFuZCBtYXkgbm90IGJlIHNldCB1cCBpZiBub3QgaW4gb3VyIG93biBwYWdlcy4KCQlyZXR1cm4gc2VsZjo6JHVpLT50aXAoICRtZXNzYWdlLCAkdGl0bGUsICRlY2hvX3RpcCApOwoJfSAvLyBFbmQgdGlwKCkuCgkKCQoJCgkvKglzZWxmOjphZGRfcGFnZSgpCgkgKgkKCSAqCUFkZHMgYSBwYWdlIGludG8gdGhlIGFkbWluLiBTdG9yZXMgbWVudSBpdGVtcyB0byBhZGQgaW4gc2VsZjo6JF9wYWdlX3NldHRpbmdzIGFycmF5LiBSZWdpc3RlcnMgY2FsbGJhY2sgdG8gcmVnaXN0ZXJfYWRtaW5fbWVudSgpIHdpdGggV29yZFByZXNzIHRvIGFjdHVhbGx5IHNldCB1cCB0aGUgcGFnZXMuCgkgKglAc2VlIHNlbGY6OnJlZ2lzdGVyX2FkbWluX21lbnUoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHBhcmVudF9zbHVnCQlTbHVnIG9mIHRoZSBwYXJlbnQgbWVudSBpdGVtIHRvIGdvIHVuZGVyLiBJZiBhIHNlcmllcyB1c2UgYFNFUklFU2AgZm9yIHRoZSB2YWx1ZSB0byBhdXRvbWF0aWNhbGx5IGhhbmRsZSB0aGUgc2VyaWVzLiBQQiBwcmVmaXggYXV0b21hdGljYWxseSBhcHBsaWVkIHVubGVzcyAkc2x1Z19wcmVmaXggb3ZlcnJpZGVzLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRwYWdlX3NsdWcJCQlTbHVnIGZvciB0aGlzIHBhZ2UuIFBCIHByZWZpeCBhdXRvbWF0aWNhbGx5IGFwcGxpZWQgdW5sZXNzICRzbHVnX3ByZWZpeCBvdmVycmlkZXMuCgkgKglAcGFyYW0JCXN0cmluZwkJJHBhZ2VfdGl0bGUJCQlUaXRsZSBvZiB0aGUgcGFnZS4gSWYgdGhpcyBtZW51IGl0ZW0gaGFzIG5vIHBhcmVudCB0aGlzIGNhbiBiZSBhbiBhcnJheSBvZiBUV08gdGl0bGVzLiBUaGUgcm9vdCBtZW51IGFuZCB0aGUgZmlyc3Qgc3VibWVudSBpdGVtIHRoYXQgbGlua3MgdG8gdGhlIHNhbWUgcGxhY2UuCiAJICoJQHBhcmFtCQlzdHJpbmcJCSRjYXBhYmlsaXR5CQkJQ2FwYWJpbGl0eSByZXF1aXJlZCB0byBhY2Nlc3MgcGFnZS4gRGVmYXVsdDogYWN0aXZhdGVfcGx1Z2lucy4KIAkgKglAcGFyYW0JCXN0cmluZwkJJGljb24JCQkJTWVudSBpY29uIGdyYXBoaWMuIEF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgdGhpcyB2YWx1ZSB3aXRoIHRoZSBmdWxsIFVSTCB0byBwbHVnaW4ncyBpbWFnZXMgZGlyZWN0b3J5LiBEZWZhdWx0OiBpY29uXzE2eDE2LnBuZy4KIAkgKglAcGFyYW0JCXN0cmluZwkJJHNsdWdfcHJlZml4CQlQcmVmaXggdG8gdXNlIHdpdGggdGhpcyBtZW51LiBPdmVycmlkZSBpZiBuZWVkaW5nIHRvIGFkZCBtZW51IHVuZGVyIGFub3RoZXIgcGx1Z2luIG9yIGNvcmUgbWVudXMuIERlZmF1bHQ6IERFRkFVTFQuCiAJICoJQHBhcmFtCQlpbnQJCQkkcG9zaXRpb24JCQlQcmlvcml0eSBvbiB3aGVyZSBpbiB0aGUgbWVudSB0byBhZGQgdGhpcy4gQnkgZGVmYXVsdCBpdCBpcyBhZGRlZCB0byB0aGUgYm90dG9tIG9mIHRoZSBtZW51LiBJdCdzIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSBhbm90aGVyIG1lbnUgaXRlbSBpZiB0aGlzIG51bWJlciBtYXRjaGVzLiBVc2UgY2F1dGlvbi4gRGVmYXVsdDogbnVsbC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfcGFnZSggJHBhcmVudF9zbHVnLCAkcGFnZV9zbHVnLCAkcGFnZV90aXRsZSwgJGNhcGFiaWxpdHkgPSAnYWN0aXZhdGVfcGx1Z2lucycsICRpY29uID0gJ2ljb25fbWVudV8xNngxNi5wbmcnLCAkc2x1Z19wcmVmaXggPSAnREVGQVVMVCcsICRwb3NpdGlvbiA9IE5VTEwgKSB7CgkJaWYgKCAkc2x1Z19wcmVmaXggPT0gJ0RFRkFVTFQnICkgewoJCQkkc2x1Z19wcmVmaXggPSAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJzsKCQl9CgkJCgkJaWYgKCAhaXNfb2JqZWN0KCBzZWxmOjokX3BhZ2VzICkgKSB7CgkJCXNlbGY6Ol9pbml0X2NvcmVfY29udHJvbGxlciggJ3BhZ2VzJyApOwoJCQkKCQkJaWYgKCBpc19uZXR3b3JrX2FkbWluKCkgKSB7IC8vIE11bHRpc2l0ZSBpbnN0YWxsYXRpb24gYWRtaW47IHVzZXMgZGlmZmVyZW50IGhvb2suCgkJCQlhZGRfYWN0aW9uKCAnbmV0d29ya19hZG1pbl9tZW51JywgY3JlYXRlX2Z1bmN0aW9uKCAnJywgJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnOjpyZWdpc3Rlcl9hZG1pbl9tZW51KCk7JyApICk7CgkJCX0gZWxzZSB7IC8vIFN0YW5kYWxvbmUgYWRtaW4uCgkJCQlhZGRfYWN0aW9uKCAnYWRtaW5fbWVudScsIGNyZWF0ZV9mdW5jdGlvbiggJycsICdwYl8nIC4gc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApIC4gJzo6cmVnaXN0ZXJfYWRtaW5fbWVudSgpOycgKSApOwoJCQl9CgkJfQoJCQoJCXNlbGY6OiRfcGFnZV9zZXR0aW5nc1tdID0gYXJyYXkoCgkJCSdwYXJlbnQnICA9PiAgJHBhcmVudF9zbHVnLAoJCQknc2x1ZycgICA9PiAgJHBhZ2Vfc2x1ZywKCQkJJ3RpdGxlJyAgID0+ICAkcGFnZV90aXRsZSwKCQkJJ2NhcGFiaWxpdHknID0+ICAkY2FwYWJpbGl0eSwKCQkJJ2ljb24nICAgPT4gICRpY29uLAoJCQknc2x1Z19wcmVmaXgnID0+ICAkc2x1Z19wcmVmaXgsCgkJCSdwb3NpdGlvbicgID0+ICAkcG9zaXRpb24sCgkJKTsKCX0gLy8gRW5kIGFkZF9wYWdlKCkuCQoJCgkKCS8qCXJlZ2lzdGVyX2FkbWluX21lbnUoKQoJICoJCgkgKglJbnRlcm5hbCBjYWxsYmFjayBmb3IgYWN0dWFsbHkgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgaXRlbXMgaW50byBXb3JkUHJlc3MuIFJlZ2lzdGVycyBwYWdlcyBkZWZpbmVkIGJ5IHNlbGY6OmFkZF9wYWdlKCkuCgkgKglAc2VlIHNlbGY6OmFkZF9wYWdlKCkKCSAqCQoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlZ2lzdGVyX2FkbWluX21lbnUoKSB7CgkJaWYgKCAhc2VsZjo6YmxhbmsoIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddICkgKSB7IC8vIFNFUklFUwoJCQkkc2VyaWVzX3NsdWcgPSAncGJfJyAuIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddOwoJCQkvLyBXZSBuZWVkIHRvIHNlZSBmaXJzdCBpZiB0aGlzIHNlcmllcycgcm9vdCBtZW51IGhhcyBiZWVuIGNyZWF0ZWQgYnkgYSBwbHVnaW4geWV0LgoJCQlnbG9iYWwgJG1lbnU7CgkJCSRmb3VuZF9zZXJpZXMgPSBmYWxzZTsKCQkJZm9yZWFjaCAoICRtZW51IGFzICRtZW51cyA9PiAkaXRlbSApIHsgLy8gTG9vcCB0aHJvdWdoIGV4aXN0aW5nIG1lbnUgaXRlbXMgbG9va2luZyBmb3Igb3VyIHNlcmllcy4KCQkJCWlmICggJGl0ZW1bMF0gPT0gJHNlcmllc19zbHVnICkgewoJCQkJCSRmb3VuZF9zZXJpZXMgPSB0cnVlOwoJCQkJfQoJCQl9CgkJCWlmICggJGZvdW5kX3NlcmllcyA9PT0gZmFsc2UgKSB7IC8vIFNlcmllcyByb290IG1lbnUgZG9lcyBub3QgZXhpc3Q7IGNyZWF0ZSBpdC4KCQkJCWFkZF9tZW51X3BhZ2UoIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddIC4gJyBHZXR0aW5nIFN0YXJ0ZWQnLCBzZWxmOjokX3NldHRpbmdzWydzZXJpZXMnXSwgJ2FjdGl2YXRlX3BsdWdpbnMnLCAkc2VyaWVzX3NsdWcsIGFycmF5KCAmc2VsZjo6JF9wYWdlcywgJ2dldHRpbmdfc3RhcnRlZCcgKSwgc2VsZjo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvc2VyaWVzX2ljb25fMTZ4MTYucG5nJyApOyAvLyAsICRwYWdlWydwb3NpdGlvbiddCgkJCQlhZGRfc3VibWVudV9wYWdlKCAkc2VyaWVzX3NsdWcsIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddIC4gJyBHZXR0aW5nIFN0YXJ0ZWQnLCAnR2V0dGluZyBTdGFydGVkJywgJ2FjdGl2YXRlX3BsdWdpbnMnLCAkc2VyaWVzX3NsdWcsIGFycmF5KCAmc2VsZjo6JF9wYWdlcywgJ2dldHRpbmdfc3RhcnRlZCcgKSApOwoJCQl9CgkJCQoJCQkvLyBSZWdpc3RlciBmb3IgZ2V0dGluZyBzdGFydGVkIHBhZ2UuCgkJCWdsb2JhbCAkcGx1Z2luYnVkZHlfc2VyaWVzOwoJCQlpZiAoICFpc3NldCggJHBsdWdpbmJ1ZGR5X3Nlcmllc1sgc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ10gXSApICkgewoJCQkJJHBsdWdpbmJ1ZGR5X3Nlcmllc1sgc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ10gXSA9IGFycmF5KCk7CgkJCX0KCQkJCgkJCS8vIEFkZCB0aGlzIHBsdWdpbiBpbnRvIGdsb2JhbCBzZXJpZXMgdmFyaWFibGUuCgkJCSRwbHVnaW5idWRkeV9zZXJpZXNbIHNlbGY6OiRfc2V0dGluZ3NbJ3NlcmllcyddIF1bIHNlbGY6OiRfc2V0dGluZ3NbJ3NsdWcnXSBdID0gYXJyYXkoCgkJCQkncGF0aCcJCT0+CXNlbGY6OnBsdWdpbl9wYXRoKCksCgkJCQknbmFtZScJCT0+CXNlbGY6OnNldHRpbmdzKCAnbmFtZScgKSwKCQkJCSdzbHVnJwkJPT4Jc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApLAoJCQkpOwoJCX0KCQkKCQkvLyBBZGQgYWxsIHJlZ2lzdGVyZWQgcGFnZXMgZm9yIHRoaXMgcGx1Z2luLgoJCWZvcmVhY2ggKCBzZWxmOjokX3BhZ2Vfc2V0dGluZ3MgYXMgJHBhZ2UgKSB7CgkJCSRtZW51X3NsdWcgPSAkcGFnZVsnc2x1Z19wcmVmaXgnXSAuICRwYWdlWydzbHVnJ107CgkJCWlmICggJHBhZ2VbJ3BhcmVudCddID09ICdTRVJJRVMnICkgeyAvLyBBZGRpbmcgcGFnZSBpbnRvIHNlcmllcy4KCQkJCSRwYXJlbnRfc2x1ZyA9ICdwYl8nIC4gc2VsZjo6JF9zZXR0aW5nc1snc2VyaWVzJ107CgkJCQlpZiAoIHNlbGY6OmJsYW5rKCBzZWxmOjokX3NldHRpbmdzWydzZXJpZXMnXSApICkgeyAvLyBObyBzZXJpZXMgc2V0IGJ1dCBtZW51IGlzIHJlZ2lzdGVyZWQgaW50byBhIHNlcmllcy4KCQkJCQllY2hvICd7V0FSTklORzogTWVudSBpdGVtIHJlZ2lzdGVyZWQgaW50byBhIHNlcmllcyBidXQgbm8gcGx1Z2luIHNlcmllcyBpcyBkZWZpbmVkLn0nOwoJCQkJfQoJCQl9IGVsc2UgeyAvLyBOb24tc2VyaWVzIHBhZ2UuCgkJCQkkcGFyZW50X3NsdWcgPSAkcGFnZVsnc2x1Z19wcmVmaXgnXSAuICRwYWdlWydwYXJlbnQnXTsKCQkJfQoKCQkJaWYgKCBpc19hcnJheSggJHBhZ2VbJ3RpdGxlJ10gKSApIHsKCQkJCSRwYWdlX3RpdGxlID0gJHBhZ2VbJ3RpdGxlJ11bMF07CgkJCQkkcGFnZV90aXRsZV9hbHQgPSAkcGFnZVsndGl0bGUnXVsxXTsKCQkJfSBlbHNlIHsgLy8gTm90IGFuIGFycmF5IHNvIG9ubHkgb25lIHBhZ2UgdGl0bGUuCgkJCQkkcGFnZV90aXRsZSA9ICRwYWdlWyd0aXRsZSddOwoJCQkJJHBhZ2VfdGl0bGVfYWx0ID0gJHBhZ2VbJ3RpdGxlJ107CgkJCX0KCQkJCgkJCS8vIENhbGN1bGF0ZSBpY29uLgoJCQlpZiAoICcnICE9ICRwYWdlWydpY29uJ10gKSB7IC8vIElmIGljb24gc3BlY2lmaWVkIHRoZW4gZmlndXJlIG91dCB1cmwuCgkJCQkkaWNvbiA9ICRwYWdlWydpY29uJ107IC8vc2VsZjo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvJyAuICRwYWdlWydpY29uJ107CgkJCX0gZWxzZSB7IC8vIE5vIGljb24uIFVzdWFsbHkgdXNlZCB3aGVuIG1hbnVhbGx5IGRvaW5nIENTUyBmb3IgcmV0aW5hIGljb24uCgkJCQkkaWNvbiA9ICcnOwoJCQl9CgkJCQoJCQlpZiAoIHNlbGY6OmJsYW5rKCAkcGFnZVsncGFyZW50J10gKSApIHsgLy8gVG9wLWxldmVsIG1lbnUuCgkJCQlhZGRfbWVudV9wYWdlKCAkcGFnZV90aXRsZSwgJHBhZ2VfdGl0bGUsICRwYWdlWydjYXBhYmlsaXR5J10sICRtZW51X3NsdWcsIGFycmF5KCAmc2VsZjo6JF9wYWdlcywgJHBhZ2VbJ3NsdWcnXSApLCAkaWNvbiwgJHBhZ2VbJ3Bvc2l0aW9uJ10gKTsKCQkJCWFkZF9zdWJtZW51X3BhZ2UoICRtZW51X3NsdWcsIHNlbGY6OnNldHRpbmdzKCAnbmFtZScgKSAuICcgJmxzYXF1bzsgJyAuICRwYWdlX3RpdGxlX2FsdCwgJHBhZ2VfdGl0bGVfYWx0LCAkcGFnZVsnY2FwYWJpbGl0eSddLCAkbWVudV9zbHVnLCBhcnJheSggJnNlbGY6OiRfcGFnZXMsICRwYWdlWydzbHVnJ10gKSApOyAvLyBBbGxvd3MgbmFtaW5nIG9mIGZpcnN0IHN1Ym1lbnUgaXRlbSBkaWZmZXJlbnRseSBmcm9tIHRoZSBwYXJlbnQuIEVsc2UgaXRzIGF1dG8gY3JlYXRlZCB3aXRoIHNhbWUgbmFtZS4KCQkJfSBlbHNlIHsgLy8gU3ViLW1lbnUuCgkJCQlhZGRfc3VibWVudV9wYWdlKCAkcGFyZW50X3NsdWcsIHNlbGY6OnNldHRpbmdzKCAnbmFtZScgKSAuICcgJmxzYXF1bzsgJyAuICRwYWdlX3RpdGxlLCAkcGFnZV90aXRsZSwgJHBhZ2VbJ2NhcGFiaWxpdHknXSwgJG1lbnVfc2x1ZywgYXJyYXkoICZzZWxmOjokX3BhZ2VzLCAkcGFnZVsnc2x1ZyddICkgKTsKCQkJfQoJCX0KCX0gLy8gRW5kIHJlZ2lzdGVyX2FkbWluX21lbnUoKS4KCQoJCgkKCS8qCXNlbGY6OmFkZF9hY3Rpb24oKQoJICoJCgkgKglSZWdpc3RlcnMgYSBXb3JkUHJlc3MgYWN0aW9uLiBBY3Rpb24gb2YgdGhlIG5hbWUgJHRhZyB3aWxsIGNhbGwgdGhlIG1ldGhvZCBpbiAvY29udHJvbGxlcnMvYWN0aW9ucy5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcvYXJyYXkJJHRhZwkJCQlUYWcgLyBzbHVnIGZvciB0aGUgYWN0aW9uLiBJZiBhbiBhcnJheSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgdGFnLCB0aGUgc2Vjb25kIGlzIGFuIG9wdGlvbmFsIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCSAqCUBwYXJhbQkJaW50CQkJCSRwcmlvcml0eQkJCUludGVnZXIgcHJpb3JpdHkgbnVtYmVyIGZvciB0aGUgYWN0aW9uLgoJICoJQHBhcmFtCQlpbnQJCQkJJGFjY2VwdGVkX2FyZ3MJCU51bWJlciBvZiBhcmd1bWVudHMgdGhpcyBhY3Rpb24gbWF5IGFjY2VwdCBpbiBpdHMgbWV0aG9kLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZF9hY3Rpb24oICR0YWcsICRwcmlvcml0eSA9IDEwLCAkYWNjZXB0ZWRfYXJncyA9IDEgKSB7CgkJaWYgKCAhaXNfb2JqZWN0KCBzZWxmOjokX2FjdGlvbnMgKSApIHsgc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAnYWN0aW9ucycgKTsgfQoJCWlmICggaXNfYXJyYXkoICR0YWcgKSApIHsgLy8gSWYgYXJyYXkgdGhlbiBmaXJzdCBwYXJhbSBpcyB0YWcsIHNlY29uZCBwYXJhbSBpcyBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnWzFdOwoJCQkkdGFnID0gJHRhZ1swXTsKCQl9IGVsc2UgeyAvLyBObyBjdXN0b20gbWV0aG9kIG5hbWUgc28gdGFnIGFuZCBjYWxsYmFjayBtZXRob2QgbmFtZSBhcmUgdGhlIHNhbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnOwoJCQlpZiAoIHN0cnBvcyggJHRhZywgJy4nICkgIT09IGZhbHNlICkgewoJCQkJZWNobyAne1dhcm5pbmc6IFlvdXIgdGFnIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gVGFnIG5hbWVzIGFyZSBlcXVhbCB0byB0aGUgUEhQIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBiYWNrIHNvIHRoZXkgbXVzdCBjb25mb3JtIHRvIFBIUCBtZXRob2QgbmFtZSBzdGFuZGFyZHMuIEZvciBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWVzIHVzZSBhbiBhcnJheSBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgaW4gdGhlIGZvcm06IGFycmF5KCBcJ3RhZ1wnLCBcJ2NhbGxiYWNrX25hbWVcJyApLn0nOwoJCQl9CgkJfQoJCWFkZF9hY3Rpb24oICR0YWcsIGFycmF5KCAmc2VsZjo6JF9hY3Rpb25zLCAkY2FsbGJhY2tfbWV0aG9kICksICRwcmlvcml0eSwgJGFjY2VwdGVkX2FyZ3MgKTsKCX0gLy8gRW5kIGFkZF9hY3Rpb24oKS4KCQoJCgkKCS8qCXNlbGY6OmFkZF9hamF4KCkKCSAqCQoJICoJUmVnaXN0ZXJzIGEgV29yZFByZXNzIGFqYXggYWN0aW9uLiBBamF4IGFjdGlvbiBvZiB0aGUgbmFtZSAkdGFnIHdpbGwgY2FsbCB0aGUgbWV0aG9kIGluIC9jb250cm9sbGVycy9hamF4LnBocCB3aXRoIHRoZSBtYXRjaGluZyBuYW1lLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZy9hcnJheQkJJHRhZwkJCQlUYWcgLyBzbHVnIGZvciB0aGUgYWN0aW9uLiBJZiBhbiBhcnJheSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgdGFnLCB0aGUgc2Vjb25kIGlzIGFuIG9wdGlvbmFsIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfYWpheCggJHRhZyApIHsKCQlpZiAoICFpc19vYmplY3QoIHNlbGY6OiRfYWpheCApICkgeyBzZWxmOjpfaW5pdF9jb3JlX2NvbnRyb2xsZXIoICdhamF4JyApOyB9CgkJaWYgKCBpc19hcnJheSggJHRhZyApICkgeyAvLyBJZiBhcnJheSB0aGVuIGZpcnN0IHBhcmFtIGlzIHRhZywgc2Vjb25kIHBhcmFtIGlzIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCQkJJGNhbGxiYWNrX21ldGhvZCA9ICR0YWdbMV07CgkJCSR0YWcgPSAkdGFnWzBdOwoJCX0gZWxzZSB7IC8vIE5vIGN1c3RvbSBtZXRob2QgbmFtZSBzbyB0YWcgYW5kIGNhbGxiYWNrIG1ldGhvZCBuYW1lIGFyZSB0aGUgc2FtZS4KCQkJJGNhbGxiYWNrX21ldGhvZCA9ICR0YWc7CgkJCWlmICggc3RycG9zKCAkdGFnLCAnLicgKSAhPT0gZmFsc2UgKSB7CgkJCQllY2hvICd7V2FybmluZzogWW91ciB0YWcgY29udGFpbnMgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzLiBUYWcgbmFtZXMgYXJlIGVxdWFsIHRvIHRoZSBQSFAgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGJhY2sgc28gdGhleSBtdXN0IGNvbmZvcm0gdG8gUEhQIG1ldGhvZCBuYW1lIHN0YW5kYXJkcy4gRm9yIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZXMgdXNlIGFuIGFycmF5IGZvciB0aGUgdGFnIHBhcmFtZXRlciBpbiB0aGUgZm9ybTogYXJyYXkoIFwndGFnXCcsIFwnY2FsbGJhY2tfbmFtZVwnICkufSc7CgkJCX0KCQl9CgkJYWRkX2FjdGlvbiggJ3dwX2FqYXhfcGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICR0YWcsIGFycmF5KCAmc2VsZjo6JF9hamF4LCAkY2FsbGJhY2tfbWV0aG9kICkgKTsKCX0gLy8gRW5kIGFkZF9hamF4KCkuCgkKCQoJCgkvKglzZWxmOjphZGRfY3JvbigpCgkgKgkKCSAqCVJlZ2lzdGVycyBhIFdvcmRQcmVzcyBjcm9uIGNhbGxiYWNrICh0ZWNobmljYWxseSBhbiBhY3Rpb24pLiBDcm9uIGFjdGlvbiBvZiB0aGUgbmFtZSAkdGFnIHdpbGwgY2FsbCB0aGUgbWV0aG9kIGluIC9jb250cm9sbGVycy9jcm9uLnBocCB3aXRoIHRoZSBtYXRjaGluZyBuYW1lLgoJICoJQHNlZSBjcm9uX3RhZygpLgkKCSAqCgkgKglAcGFyYW0JCXN0cmluZy9hcnJheQkkdGFnCQkJCVRhZyAvIHNsdWcgZm9yIHRoZSBjcm9uIGFjdGlvbi4gSWYgYW4gYXJyYXkgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHRhZywgdGhlIHNlY29uZCBpcyBhbiBvcHRpb25hbCBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkgKglAcGFyYW0JCWludAkJCQkkcHJpb3JpdHkJCQlJbnRlZ2VyIHByaW9yaXR5IG51bWJlciBmb3IgdGhlIGNyb24gYWN0aW9uLgoJICoJQHBhcmFtCQlpbnQJCQkJJGFjY2VwdGVkX2FyZ3MJCU51bWJlciBvZiBhcmd1bWVudHMgdGhpcyBhY3Rpb24gbWF5IGFjY2VwdCBpbiBpdHMgbWV0aG9kLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZF9jcm9uKCAkdGFnLCAkcHJpb3JpdHkgPSAxMCwgJGFjY2VwdGVkX2FyZ3MgPSAxICkgewoJCWlmICggIWlzX29iamVjdCggc2VsZjo6JF9jcm9uICkgKSB7IHNlbGY6Ol9pbml0X2NvcmVfY29udHJvbGxlciggJ2Nyb24nICk7IH0KCQlpZiAoIGlzX2FycmF5KCAkdGFnICkgKSB7IC8vIElmIGFycmF5IHRoZW4gZmlyc3QgcGFyYW0gaXMgdGFnLCBzZWNvbmQgcGFyYW0gaXMgY3VzdG9tIGNhbGxiYWNrIG1ldGhvZCBuYW1lLgoJCQkkY2FsbGJhY2tfbWV0aG9kID0gJHRhZ1sxXTsKCQkJJHRhZyA9ICR0YWdbMF07CgkJfSBlbHNlIHsgLy8gTm8gY3VzdG9tIG1ldGhvZCBuYW1lIHNvIHRhZyBhbmQgY2FsbGJhY2sgbWV0aG9kIG5hbWUgYXJlIHRoZSBzYW1lLgoJCQkkY2FsbGJhY2tfbWV0aG9kID0gJHRhZzsKCQkJaWYgKCBzdHJwb3MoICR0YWcsICcuJyApICE9PSBmYWxzZSApIHsKCQkJCWVjaG8gJ3tXYXJuaW5nOiBZb3VyIHRhZyBjb250YWlucyBkaXNhbGxvd2VkIGNoYXJhY3RlcnMuIFRhZyBuYW1lcyBhcmUgZXF1YWwgdG8gdGhlIFBIUCBtZXRob2QgdGhhdCBpcyBjYWxsZWQgYmFjayBzbyB0aGV5IG11c3QgY29uZm9ybSB0byBQSFAgbWV0aG9kIG5hbWUgc3RhbmRhcmRzLiBGb3IgY3VzdG9tIGNhbGxiYWNrIG1ldGhvZCBuYW1lcyB1c2UgYW4gYXJyYXkgZm9yIHRoZSB0YWcgcGFyYW1ldGVyIGluIHRoZSBmb3JtOiBhcnJheSggXCd0YWdcJywgXCdjYWxsYmFja19uYW1lXCcgKS59JzsKCQkJfQoJCX0KCQlhZGRfYWN0aW9uKCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICR0YWcsIGFycmF5KCAmc2VsZjo6JF9jcm9uLCAkY2FsbGJhY2tfbWV0aG9kICksICRwcmlvcml0eSwgJGFjY2VwdGVkX2FyZ3MgKTsKCX0gLy8gRW5kIGFkZF9jcm9uKCkuCgkKCQoJCgkvKgljcm9uX3RhZygpCgkgKgkKCSAqCVJldHVybnMgdGhlIGNyb24gdGFnIHRvIHVzZSB3aGVuIHNjaGVkdWxpbmcgYW4gZXZlbnQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFnCQlJbnRlcm5hbCB0YWcgbmFtZSB0byBiZSB0cmFuc2xhdGVkIChwcmVmaXhlcyBhbmQgc3VjaCBhZGRlZCkuCgkgKglAcmV0dXJuCQlzdHJpbmcKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcm9uX3RhZyggJHRhZyApIHsKCQlyZXR1cm4gJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXycgLiAkdGFnOwoJfSAvLyBFbmQgY3Jvbl90YWcoKS4KCQoJCgkvKglzZWxmOjphZGRfZGFzaGJvYXJkX3dpZGdldCgpCgkgKgkKCSAqCVJlZ2lzdGVycyBhIFdvcmRQcmVzcyBhY3Rpb24uIEFjdGlvbiBvZiB0aGUgbmFtZSAkdGFnIHdpbGwgY2FsbCB0aGUgbWV0aG9kIGluIC9jb250cm9sbGVycy9kYXNoYm9hcmQucGhwIHdpdGggdGhlIG1hdGNoaW5nIG5hbWUuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nL2FycmF5CSR0YWcJCQkJVGFnIC8gc2x1ZyBmb3IgdGhlIGFjdGlvbi4KCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHRpdGxlCQkJCURhc2hib2FyZCB3aWRnZXQgdGl0bGUuCgkgKglAcGFyYW0JCXN0cmluZwkJCSRjYXBhYmlsaXR5CQkJUmVxdWlyZWQgY2FwYWJpbGl0eSB0byBkaXNwbGF5LiBBbHNvIGFjY2VwdHMgYGdvZG1vZGVgIHRvIG9ubHkgYWxsb3cgc3VwZXJhZG1pbnMgaW4gbXVsdGlzaXRlIGFuZCBhZG1pbnMgaW4gc3RhbmRhbG9uZS4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJCSRhY2NlcHRlZF9hcmdzCQlOdW1iZXIgb2YgYXJndW1lbnRzIHRoaXMgYWN0aW9uIG1heSBhY2NlcHQgaW4gaXRzIG1ldGhvZC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfZGFzaGJvYXJkX3dpZGdldCggJHRhZywgJHRpdGxlLCAkY2FwYWJpbGl0eSwgJGZvcmNlX3RvcCA9IGZhbHNlICkgewoJCWlmICggIWlzX29iamVjdCggc2VsZjo6JF9kYXNoYm9hcmQgKSApIHsKCQkJc2VsZjo6JF9kYXNoYm9hcmRfd2lkZ2V0cyA9IGFycmF5KCk7IC8vIEluaXQgdmFyaWFibGUuCgoJCQlzZWxmOjpfaW5pdF9jb3JlX2NvbnRyb2xsZXIoICdkYXNoYm9hcmQnICk7CgkJCQoJCQlpZiAoIGlzX25ldHdvcmtfYWRtaW4oKSApIHsgLy8gTmV0d29yayBhZG1pbi4KCQkJCWFkZF9hY3Rpb24oICd3cF9uZXR3b3JrX2Rhc2hib2FyZF9zZXR1cCcsIGFycmF5KCAmc2VsZjo6JF9kYXNoYm9hcmQsICdyZWdpc3Rlcl93aWRnZXRzJyApICk7CgkJCX0gZWxzZSB7IC8vIE5vcm1hbCBhZG1pbi4KCQkJCWFkZF9hY3Rpb24oICd3cF9kYXNoYm9hcmRfc2V0dXAnLCBhcnJheSggJnNlbGY6OiRfZGFzaGJvYXJkLCAncmVnaXN0ZXJfd2lkZ2V0cycgKSApOwoJCQl9CgkJfQoJCXNlbGY6OiRfZGFzaGJvYXJkX3dpZGdldHNbXSA9IGFycmF5KCAndGFnJyA9PiAkdGFnLCAndGl0bGUnID0+ICR0aXRsZSwgJ2NhcGFiaWxpdHknID0+ICRjYXBhYmlsaXR5LCAnZm9yY2VfdG9wJyA9PiAkZm9yY2VfdG9wICk7IC8vIFB1c2ggaW50byBhcnJheSB0byBiZSBsYXRlciByZWdpc3RlcmVkIHZpYSBkYXNoYm9hcmQgY29udHJvbGxlcidzIHJlZ2lzdGVyX3dpZGdldHMgZnVuY3Rpb24uCgl9IC8vIEVuZCBhZGRfZGFzaGJvYXJkX3dpZGdldCgpLgoJCgkKCQoJLyoJc2VsZjo6YWRkX2ZpbHRlcigpCgkgKgkKCSAqCVJlZ2lzdGVycyBhIFdvcmRQcmVzcyBmaWx0ZXIuIEZpbHRlciBvZiB0aGUgbmFtZSAkdGFnIHdpbGwgY2FsbCB0aGUgbWV0aG9kIGluIC9jb250cm9sbGVycy9maWx0ZXJzLnBocCB3aXRoIHRoZSBtYXRjaGluZyBuYW1lLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZy9hcnJheQkJJHRhZwkJCQlUYWcgLyBzbHVnIGZvciB0aGUgYWN0aW9uLiBJZiBhbiBhcnJheSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgdGFnLCB0aGUgc2Vjb25kIGlzIGFuIG9wdGlvbmFsIGN1c3RvbSBjYWxsYmFjayBtZXRob2QgbmFtZS4KCSAqCUBwYXJhbQkJaW50CQkJCSRwcmlvcml0eQkJCUludGVnZXIgcHJpb3JpdHkgbnVtYmVyIGZvciB0aGUgZmlsdGVyLgoJICoJQHBhcmFtCQlpbnQJCQkJJGFjY2VwdGVkX2FyZ3MJCU51bWJlciBvZiBhcmd1bWVudHMgdGhpcyBmaWx0ZXIgbWF5IGFjY2VwdCBpbiBpdHMgbWV0aG9kLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZF9maWx0ZXIoICR0YWcsICRwcmlvcml0eSA9IDEwLCAkYWNjZXB0ZWRfYXJncyA9IDEgKSB7CgkJaWYgKCAhaXNfb2JqZWN0KCBzZWxmOjokX2ZpbHRlcnMgKSApIHsgc2VsZjo6X2luaXRfY29yZV9jb250cm9sbGVyKCAnZmlsdGVycycgKTsgfQoJCWlmICggaXNfYXJyYXkoICR0YWcgKSApIHsgLy8gSWYgYXJyYXkgdGhlbiBmaXJzdCBwYXJhbSBpcyB0YWcsIHNlY29uZCBwYXJhbSBpcyBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnWzFdOwoJCQkkdGFnID0gJHRhZ1swXTsKCQl9IGVsc2UgeyAvLyBObyBjdXN0b20gbWV0aG9kIG5hbWUgc28gdGFnIGFuZCBjYWxsYmFjayBtZXRob2QgbmFtZSBhcmUgdGhlIHNhbWUuCgkJCSRjYWxsYmFja19tZXRob2QgPSAkdGFnOwoJCQlpZiAoIHN0cnBvcyggJHRhZywgJy4nICkgIT09IGZhbHNlICkgewoJCQkJZWNobyAne1dhcm5pbmc6IFlvdXIgdGFnIGNvbnRhaW5zIGRpc2FsbG93ZWQgY2hhcmFjdGVycy4gVGFnIG5hbWVzIGFyZSBlcXVhbCB0byB0aGUgUEhQIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCBiYWNrIHNvIHRoZXkgbXVzdCBjb25mb3JtIHRvIFBIUCBtZXRob2QgbmFtZSBzdGFuZGFyZHMuIEZvciBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWVzIHVzZSBhbiBhcnJheSBmb3IgdGhlIHRhZyBwYXJhbWV0ZXIgaW4gdGhlIGZvcm06IGFycmF5KCBcJ3RhZ1wnLCBcJ2NhbGxiYWNrX25hbWVcJyApLn0nOwoJCQl9CgkJfQoJCWFkZF9maWx0ZXIoICR0YWcsIGFycmF5KCAmc2VsZjo6JF9maWx0ZXJzLCAkY2FsbGJhY2tfbWV0aG9kICksICRwcmlvcml0eSwgJGFjY2VwdGVkX2FyZ3MgKTsKCX0gLy8gRW5kIGFkZF9maWx0ZXIoKS4KCQoJCgkKCS8qCXNlbGY6OmFkZF9zaG9ydGNvZGUoKQoJICoJCgkgKglSZWdpc3RlcnMgYSBXb3JkUHJlc3Mgc2hvcnRjb2RlLiBTaG9ydGNvZGUgb2YgdGhlIG5hbWUgJHRhZyB3aWxsIGNhbGwgdGhlIG1ldGhvZCBpbiAvY29udHJvbGxlcnMvc2hvcnRjb2Rlcy5waHAgd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcvYXJyYXkJCSR0YWcJCQkJVGFnIC8gc2x1ZyBmb3IgdGhlIHNob3J0Y29kZS4gSWYgYW4gYXJyYXkgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIHRhZywgdGhlIHNlY29uZCBpcyBhbiBvcHRpb25hbCBjdXN0b20gY2FsbGJhY2sgbWV0aG9kIG5hbWUuCgkgKglAcmV0dXJuCQkKCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRfc2hvcnRjb2RlKCAkdGFnICkgewoJCWlmICggIWlzX29iamVjdCggc2VsZjo6JF9zaG9ydGNvZGVzICkgKSB7IHNlbGY6Ol9pbml0X2NvcmVfY29udHJvbGxlciggJ3Nob3J0Y29kZXMnICk7IH0KCQlpZiAoIGlzX2FycmF5KCAkdGFnICkgKSB7IC8vIElmIGFycmF5IHRoZW4gZmlyc3QgcGFyYW0gaXMgdGFnLCBzZWNvbmQgcGFyYW0gaXMgY3VzdG9tIGNhbGxiYWNrIG1ldGhvZCBuYW1lLgoJCQkkY2FsbGJhY2tfbWV0aG9kID0gJHRhZ1sxXTsKCQkJJHRhZyA9ICR0YWdbMF07CgkJfSBlbHNlIHsgLy8gTm8gY3VzdG9tIG1ldGhvZCBuYW1lIHNvIHRhZyBhbmQgY2FsbGJhY2sgbWV0aG9kIG5hbWUgYXJlIHRoZSBzYW1lLgoJCQkkY2FsbGJhY2tfbWV0aG9kID0gJHRhZzsKCQkJaWYgKCBzdHJwb3MoICR0YWcsICcuJyApICE9PSBmYWxzZSApIHsKCQkJCWVjaG8gJ3tXYXJuaW5nOiBZb3VyIHRhZyBjb250YWlucyBkaXNhbGxvd2VkIGNoYXJhY3RlcnMuIFRhZyBuYW1lcyBhcmUgZXF1YWwgdG8gdGhlIFBIUCBtZXRob2QgdGhhdCBpcyBjYWxsZWQgYmFjayBzbyB0aGV5IG11c3QgY29uZm9ybSB0byBQSFAgbWV0aG9kIG5hbWUgc3RhbmRhcmRzLiBGb3IgY3VzdG9tIGNhbGxiYWNrIG1ldGhvZCBuYW1lcyB1c2UgYW4gYXJyYXkgZm9yIHRoZSB0YWcgcGFyYW1ldGVyIGluIHRoZSBmb3JtOiBhcnJheSggXCd0YWdcJywgXCdjYWxsYmFja19uYW1lXCcgKS59JzsKCQkJfQoJCX0KCQlhZGRfc2hvcnRjb2RlKCAkdGFnLCBhcnJheSggJnNlbGY6OiRfc2hvcnRjb2RlcywgJGNhbGxiYWNrX21ldGhvZCApICk7Cgl9IC8vIEVuZCBhZGRfc2hvcnRjb2RlKCkuCgkKCQoJCgkvKglzZWxmOjppbml0X2NsYXNzX2NvbnRyb2xsZXIoKQoJICoJCgkgKglSZWdpc3RlcnMgdGhlIFVJIGNsYXNzIGludG8gdGhlIHBsdWdpbmJ1ZGR5IGZyYW1ld29yayBmb3IgcGFnZXMuIFJlZ2lzdGVyZWQgb24gZGVtYW5kIGJ5IHBhZ2VzIGNvbnRyb2xsZXIuCgkgKglAc2VlIHBhZ2VzIGNvbnRyb2xsZXIKCSAqCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5pdF9jbGFzc19jb250cm9sbGVyKCAkY2xhc3Nfc2x1ZyApIHsKCQlpZiAoICFpc19vYmplY3QoIHNlbGY6OiQkY2xhc3Nfc2x1ZyApICkgewoJCQkkY2xhc3NfZmlsZSA9IHNlbGY6OnBsdWdpbl9wYXRoKCkgLiAnL3BsdWdpbmJ1ZGR5L2NsYXNzZXMvJyAuICRjbGFzc19zbHVnIC4gJy5waHAnOwoJCQlpZiAoIGZpbGVfZXhpc3RzKCAkY2xhc3NfZmlsZSApICkgewoJCQkJcmVxdWlyZV9vbmNlKCAkY2xhc3NfZmlsZSApOwoJCQkJJGNsYXNzX25hbWUgPSAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICRjbGFzc19zbHVnOwoJCQkJc2VsZjo6JCRjbGFzc19zbHVnID0gbmV3ICRjbGFzc19uYW1lKCk7CgkJCX0gZWxzZSB7CgkJCQllY2hvICd7RXJyb3I6IE1pc3NpbmcgY2xhc3MgY29udHJvbGxlciBmaWxlIGAnIC4gJGNsYXNzX2ZpbGUgLiAnYC59JzsKCQkJfQoJCX0KCX0KCQoJCgkKCS8qCXNlbGY6Ol9pbml0X2NvcmVfY29udHJvbGxlcigpCgkgKgkKCSAqCUluaXRpYWxpemUgYSBjb3JlIGNvbnRyb2xsZXIgY2xhc3MgKGV4OiBwYWdlcywgYWpheCwgZmlsdGVycywgZXRjKSBmb3IgcGx1Z2luYnVkZHkgZnJhbWV3b3JrIHVzYWdlLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCU5hbWUgb2YgdGhlIGNvbnRyb2xsZXIgdG8gcmVnaXN0ZXIuIFZhbGlkIGNvbnRyb2xsZXJzOiBhY3Rpb25zLCBhamF4LCBjcm9uLCBkYXNoYm9hcmQsIGZpbHRlcnMsIHNob3J0Y29kZXMsIHBhZ2VzLgoJICoJQHJldHVybgkJCgkgKi8KCXByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9pbml0X2NvcmVfY29udHJvbGxlciggJG5hbWUgKSB7CgkJaWYgKCAhaXNfYXJyYXkoIHNlbGY6OiRvcHRpb25zICkgKSB7IHNlbGY6OmxvYWQoKTsgfSAvLyBBc3N1bWUgd2UgbmVlZCBwbHVnaW4gb3B0aW9ucyBuZWVkIGxvYWRlZCBpZiBjb250cm9sbGVycyBhcmUgbG9hZGVkIGZvciB0aGlzIHNlc3Npb24uCgkJCgkJcmVxdWlyZV9vbmNlKCBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy9jb250cm9sbGVycy8nIC4gJG5hbWUgLiAnLnBocCcgKTsKCQkkY2xhc3NuYW1lID0gJ3BiX2JhY2t1cGJ1ZGR5XycgLiAkbmFtZTsKCQkkaW50ZXJuYWxfY2xhc3NuYW1lID0gJ18nIC4gJG5hbWU7CgkJc2VsZjo6JCRpbnRlcm5hbF9jbGFzc25hbWUgPSBuZXcgJGNsYXNzbmFtZSgpOwoJfSAvLyBFbmQgX2luaXRfY29yZV9jb250cm9sbGVyKCkuCgkKCQoJCgkvKglzZWxmOjpub25jZSgpCgkgKgkKCSAqCUVjaG9zIG9yIHJldHVybnMgYSBXb3JkUHJlc3Mgbm9uY2UgZm9yIHRoZSBmcmFtZXdvcmsuIEhhbmRsZXMgcHJlZml4aW5nLiBVc2Ugd2l0aCBmb3JtcyBmb3Igc2VjdXJpdHkuIFZlcmlmaWVzIHRoZSB1c2VyIGNhbWUgZnJvbSBhIFdQIGdlbmVyYXRlZCBwYWdlLgoJICoJCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQlUcnVlOiBlY2hvcyB0aGUgbm9uZTsgZmFsc2U6IHJldHVybnMgbm9uY2UuCgkgKglAcmV0dXJuCQludWxsL3N0cmluZwkJCQlSZXR1cm5zIG51bGwgb3Igc3RyaW5nIGJhc2VkIG9uICRlY2hvIHZhbHVlLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vbmNlKCAkZWNobyA9IHRydWUgKSB7CgkJcmV0dXJuIHdwX25vbmNlX2ZpZWxkKCAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnbmFtZScgKSAuICctbm9uY2UnLCAnX3dwbm9uY2UnLCB0cnVlLCAkZWNobyApOwoJfSAvLyBFbmQgbm9uY2UoKS4KCQoJCgkKCS8qCXNlbGY6OnZlcmlmeV9ub25jZSgpCgkgKgkKCSAqCVZlcmlmaWVzIHRoZSBub25jZSBzdWJtaXR0ZWQgaW4gZm9ybS4KCSAqCQoJICoJQHJldHVybgkJbnVsbC90cnVlCQlTY3JpcHQgZGllKCkncyBvbiBmYWlsdXJlLCByZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2ZXJpZnlfbm9uY2UoKSB7CgkJY2hlY2tfYWRtaW5fcmVmZXJlciggJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ25hbWUnICkgLiAnLW5vbmNlJyApOwoJfSAvLyBFbmQgdmVyaWZ5X25vbmNlKCkuCgkKCQoJCgkvKglzZWxmOjpsb2FkX3NjcmlwdCgpCgkgKgkKCSAqCUxvYWQgYSBKYXZhU2NyaXB0IGZpbGUgaW50byB0aGUgcGFnZS4gSGFuZGxlcyBwcmVmaXhlZCwgZW5xdWV1aW5nLCBldGMuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkc2NyaXB0CQkJSWYgYSAuanMgZmlsZSBpcyBpbmNsdWRlZCB0aGVuIGEgZmlsZSBpbiB0aGUganMgZGlyZWN0b3J5IGlzIGxvYWRlZDsgZWxzZSBsb2FkcyBhIGJ1aWx0LWluIG5hbWVkIGxpYnJhcnkgc2NyaXB0LgoJICoJCQkJCQkJCQkJCUV4OiBsb2FkX3NjcmlwdCggJ3NvcnQuanMnICkgd2lsbCBsb2FkIC93cC1jb250ZW50L3BsdWdpbnMvbXlfcGx1Z2luL2pzL3NvcnQuanM7IGxvYWRfc2NyaXB0KCAnanF1ZXJ5JyApIHdpbGwgbG9hZCBpbnRlcm5hbCBqcXVlcnkgbGlicmFyeSBpbiBXb3JkUHJlc3MgaWYgaXQgZXhpc3RzLgoJICoJQHBhcmFtCQlib29sZWFuCQkkY29yZV9zY3JpcHQJSWYgdHJ1ZSBzY3JpcHRzIGFyZSBsb2FkZWQgZnJvbSAvcGx1Z2luYnVkZHkvanMvU0NSSVBULmpzLiBFbHNlIHNjcmlwdHMgbG9hZGVkIGZyb20gcGx1Z2luJ3MganMgZGlyZWN0b3J5LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvYWRfc2NyaXB0KCAkc2NyaXB0LCAkY29yZV9zY3JpcHQgPSBmYWxzZSApIHsKCQlpZiAoIHN0cnN0ciggJHNjcmlwdCwgJy5qcycgKSApIHsgLy8gTG9hZGluZyBhIGZpbGUgc3BlY2lmaWNhbGx5LgoJCQlpZiAoICRjb3JlX3NjcmlwdCA9PT0gdHJ1ZSApIHsKCQkJCWlmICggZGVmaW5lZCggJ1BCX1NUQU5EQUxPTkUnICkgJiYgUEJfU1RBTkRBTE9ORSA9PT0gdHJ1ZSApIHsKCQkJCQkkdXJsX3BhdGggPSAnaW1wb3J0YnVkZHkvcGx1Z2luYnVkZHkvanMvJzsKCQkJCX0gZWxzZSB7CgkJCQkJJHVybF9wYXRoID0gc2VsZjo6JF9wbHVnaW5fdXJsIC4gJy9wbHVnaW5idWRkeS9qcy8nOwoJCQkJfQoJCQkJJGxvY2FsX3BhdGggPSBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy9wbHVnaW5idWRkeS9qcy8nOwoJCQkJJHNjcmlwdF9uYW1lID0gJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnX2NvcmVfJyAuICRzY3JpcHQ7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSB7CgkJCQkJJHVybF9wYXRoID0gJ2ltcG9ydGJ1ZGR5L2pzLyc7CgkJCQl9IGVsc2UgewoJCQkJCSR1cmxfcGF0aCA9IHNlbGY6OiRfcGx1Z2luX3VybCAuICcvanMvJzsKCQkJCX0KCQkJCSRsb2NhbF9wYXRoID0gc2VsZjo6JF9wbHVnaW5fcGF0aCAuICcvanMvJzsKCQkJCSRzY3JpcHRfbmFtZSA9ICdwYl8nIC4gc2VsZjo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nIC4gJHNjcmlwdDsKCQkJfQoJCQkKCQkJaWYgKCAhd3Bfc2NyaXB0X2lzKCAkc2NyaXB0X25hbWUgKSApIHsgLy8gT25seSBsb2FkIHNjcmlwdCBvbmNlLgoJCQkJaWYgKCBmaWxlX2V4aXN0cyggJGxvY2FsX3BhdGggLiAkc2NyaXB0ICkgKSB7IC8vIExvYWQgb3VyIGxvY2FsIHNjcmlwdCBpZiBmaWxlIGV4aXN0cy4KCQkJCQl3cF9lbnF1ZXVlX3NjcmlwdCggJHNjcmlwdF9uYW1lLCAkdXJsX3BhdGggLiAkc2NyaXB0LCBhcnJheSgpLCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApICk7CgkJCQkJd3BfcHJpbnRfc2NyaXB0cyggJHNjcmlwdF9uYW1lICk7CgkJCQl9IGVsc2UgewoJCQkJCWVjaG8gJ3tFcnJvcjogSmF2YXNjcmlwdCBmaWxlIHdhcyBzZXQgdG8gbG9hZCB0aGF0IGRpZCBub3QgZXhpc3Q6IGAnIC4gJHVybF9wYXRoIC4gJHNjcmlwdCAuICdgfSc7CgkJCQl9CgkJCX0KCQl9IGVsc2UgeyAvLyBOb3QgYSBzcGVjaWZpYyBmaWxlLgoJCQlpZiAoICF3cF9zY3JpcHRfaXMoICRzY3JpcHQsICdkb25lJyApICkgeyAvLyBPbmx5IFBSSU5UIHNjcmlwdCBvbmNlLiBDaGVja3MgdGhlIGRvbmUgd3BzY3JpcHQgbGlzdCB0byBzZWUgaWYgaXQncyBiZWVuIHByaW50ZWQgeWV0IG9yIG5vdC4KCQkJCXdwX2VucXVldWVfc2NyaXB0KCAkc2NyaXB0ICk7CgkJCQl3cF9wcmludF9zY3JpcHRzKCAkc2NyaXB0ICk7CgkJCX0KCQl9Cgl9IC8vIEVuZCBsb2FkX3NjcmlwdCgpLgoJCgkKCQoJLyoJc2VsZjo6bG9hZF9zdHlsZSgpCgkgKgkKCSAqCUxvYWQgYSBDU1MgZmlsZSBpbnRvIHRoZSBwYWdlLiBIYW5kbGVzIHByZWZpeGVkLCBlbnF1ZXVpbmcsIGV0Yy4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRzdHlsZQkJCUlmIGEgLmNzcyBmaWxlIGlzIGluY2x1ZGVkIHRoZW4gYSBmaWxlIGluIHRoZSBjc3MgZGlyZWN0b3J5IGlzIGxvYWRlZDsgZWxzZSBsb2FkcyBhIGJ1aWx0LWluIG5hbWVkIGxpYnJhcnkgc3R5bGUuCgkgKgkJCQkJCQkJCQkJRXg6IGxvYWRfc3R5bGUoICdzb3J0LmNzcycgKSB3aWxsIGxvYWQgL3dwLWNvbnRlbnQvcGx1Z2lucy9teV9wbHVnaW4vY3NzL3NvcnQuY3NzOyBsb2FkX3N0eWxlKCAnZGFzaGJvYXJkJyApIHdpbGwgbG9hZCBpbnRlcm5hbCBkYXNoYm9hcmQgY3NzIGluIFdvcmRQcmVzcyBpZiBpdCBleGlzdHMuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRjb3JlX3N0eWxlCQlJZiB0cnVlIHN0eWxlcyBhcmUgbG9hZGVkIGZyb20gL3BsdWdpbmJ1ZGR5L2Nzcy9TVFlMRS5jc3MuIEVsc2Ugc3R5bGVzIGxvYWRlZCBmcm9tIHBsdWdpbidzIGNzcyBkaXJlY3RvcnkuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZF9zdHlsZSggJHN0eWxlLCAkY29yZV9zdHlsZSA9IGZhbHNlICkgewoJCWlmICggc3Ryc3RyKCAkc3R5bGUsICcuY3NzJyApICkgeyAvLyBMb2FkaW5nIGEgZmlsZSBzcGVjaWZpY2FsbHkuCgkJCWlmICggJGNvcmVfc3R5bGUgPT09IHRydWUgKSB7CgkJCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSB7CgkJCQkJJHVybF9wYXRoID0gJ2ltcG9ydGJ1ZGR5L3BsdWdpbmJ1ZGR5L2Nzcy8nOwoJCQkJfSBlbHNlIHsKCQkJCQkkdXJsX3BhdGggPSBzZWxmOjokX3BsdWdpbl91cmwgLiAnL3BsdWdpbmJ1ZGR5L2Nzcy8nOwoJCQkJfQoJCQkJJGxvY2FsX3BhdGggPSBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy9wbHVnaW5idWRkeS9jc3MvJzsKCQkJCSRjb3JlX3R5cGUgPSAnY29yZSc7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIGRlZmluZWQoICdQQl9TVEFOREFMT05FJyApICYmIFBCX1NUQU5EQUxPTkUgPT09IHRydWUgKSB7CgkJCQkJJHVybF9wYXRoID0gJ2ltcG9ydGJ1ZGR5L2Nzcy8nOwoJCQkJfSBlbHNlIHsKCQkJCQkkdXJsX3BhdGggPSBzZWxmOjokX3BsdWdpbl91cmwgLiAnL2Nzcy8nOwoJCQkJfQoJCQkJJGxvY2FsX3BhdGggPSBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy9jc3MvJzsKCQkJCSRjb3JlX3R5cGUgPSAnbm9uY29yZSc7CgkJCX0KCQkJJHN0eWxlX25hbWUgPSAncGJfJyAuIHNlbGY6OnNldHRpbmdzKCAnc2x1ZycgKSAuICdfJyAuICRjb3JlX3R5cGUgLiAnXycgLiAkc3R5bGU7CgkJCWlmICggIXdwX3N0eWxlX2lzKCAkc3R5bGVfbmFtZSApICkgeyAvLyBPbmx5IGxvYWQgc3R5bGUgb25jZS4KCQkJCWlmICggZmlsZV9leGlzdHMoICRsb2NhbF9wYXRoIC4gJHN0eWxlICkgKSB7IC8vIExvYWQgb3VyIGxvY2FsIHN0eWxlIGlmIGZpbGUgZXhpc3RzLgoJCQkJCXdwX2VucXVldWVfc3R5bGUoICRzdHlsZV9uYW1lLCAkdXJsX3BhdGggLiAkc3R5bGUsIGFycmF5KCksIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICkgKTsKCQkJCQl3cF9wcmludF9zdHlsZXMoICRzdHlsZV9uYW1lICk7CgkJCQl9IGVsc2UgewoJCQkJCWVjaG8gJ3tFcnJvcjogQ1NTIGZpbGUgd2FzIHNldCB0byBsb2FkIHRoYXQgZGlkIG5vdCBleGlzdDogYCcgLiAkdXJsX3BhdGggLiAkc3R5bGUgLiAnYH0nOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsgLy8gTm90IGEgc3BlY2lmaWMgZmlsZS4KCQkJaWYgKCAhd3Bfc3R5bGVfaXMoICRzdHlsZSApICkgeyAvLyBPbmx5IGxvYWQgc3R5bGUgb25jZS4KCQkJCXdwX2VucXVldWVfc3R5bGUoICRzdHlsZSApOwoJCQkJd3BfcHJpbnRfc3R5bGVzKCAkc3R5bGUgKTsKCQkJfQoJCX0KCX0gLy8gRW5kIGxvYWRfc3R5bGUoKS4KCQoJCgkKCS8qCXNlbGY6OmxvYWRfdmlldygpCgkgKgkKCSAqCUxvYWRzIGEgdmlldy4gVHlwaWNhbGx5IGNhbGxlZCBmcm9tIHdpdGhpbiBhIGNvbnRyb2xsZXIuIERhdGEgcGFzc2VkIGFzIHNlY29uZCBhcmd1bWVudCB3aWxsIGhhcyBleHRyYWN0KCkgcmFuIG9uIGl0IHdpdGhpbiB0aGUgdmlldyBmb3IgZWFzeSB2YXJpYWJsZSBhY2Nlc3MuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmlld19uYW1lCQkJCU5hbWUgb2Ygdmlldy4gQ29ycmVzcG9uZHMgdG8gdGhlIHZpZXcgZmlsZW5hbWU6IC92aWV3cy92aWV3X25hbWUucGhwCgkgKglAcGFyYW0JCWFycmF5CQkkcGx1Z2luYnVkZHlfZGF0YQkJQXJyYXkgb2YgdmFyaWFibGVzIHRvIGJlIGV4dHJhY3RlZCBmb3IgdXNlIGJ5IHRoZSB2aWV3LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvYWRfdmlldyggJHZpZXdfbmFtZSwgJHBsdWdpbmJ1ZGR5X2RhdGEgPSBhcnJheSgpICkgewoJCSRwbHVnaW5idWRkeV92aWV3X2ZpbGUgPSBzZWxmOjokX3BsdWdpbl9wYXRoIC4gJy92aWV3cy8nIC4gJHZpZXdfbmFtZSAuICcucGhwJzsgLy8gVmFyaWFibGUgbmFtZWQgdGhpcyB3YXkgYXMgdGhlIGluY2x1ZGVkIGZpbGUgaW5oZXJpdHMgdGhpcyB2YXJpYWJsZSBhbmQgd2UgZG9uJ3Qgd2FudCBhbiBhY2NpZGVudGFsIGNvbGxpc2lvbi4KCQlpZiAoIGZpbGVfZXhpc3RzKCAkcGx1Z2luYnVkZHlfdmlld19maWxlICkgKSB7CgkJCXVuc2V0KCAkdmlld19uYW1lICk7CgkJCWlmICggaXNfYXJyYXkoICRwbHVnaW5idWRkeV9kYXRhICkgKSB7CgkJCQlleHRyYWN0KCAkcGx1Z2luYnVkZHlfZGF0YSApOwoJCQl9IGVsc2UgewoJCQkJZWNobyAne1dhcm5pbmc6IERhdGEgcGFyYW1ldGVyIHBhc3NlZCB0byB2aWV3IHdhcyBub3QgYW4gYXJyYXkufSc7CgkJCX0KCQkJLy9nbG9iYWwgJGRpb255c3VzX2NvbnRyb2xsZXI7IC8vIEdpdmVzIHRoZSB2aWV3IHRoZSBhYmlsaXR5IHRvIGFjY2VzcyBmdW5jdGlvbnMgd2l0aGluIHRoZSBjb250cm9sbGVyIGlmIG5lZWRlZC4KCQkJcmVxdWlyZSAkcGx1Z2luYnVkZHlfdmlld19maWxlOwoJCX0gZWxzZSB7CgkJCWVjaG8gJ3tJTlZBTElEIFZJRVc6IGAnIC4gJHZpZXdfbmFtZSAuICdgOyBmaWxlIG5vdCBmb3VuZC59JzsKCQl9Cgl9IC8vIEVuZCBsb2FkX3ZpZXcoKS4KCQoJCgkKCS8qCXNlbGY6OmxvYWRfY29udHJvbGxlcigpCgkgKgkKCSAqCUxvYWRzIGEgY29udHJvbGxlci4gQ29udHJvbGxlcnMgbWF5IGxvYWQgY29udHJvbGxlcnMuIENvbnRyb2xsZXIgdXNlcyByZXF1aXJlX29uY2UgdG8gYXZvaWQgcHJvYmxlbXMuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkY29udHJvbGxlcgkJCQlOYW1lIG9mIGNvbnRyb2xsZXIuIENvcnJlc3BvbmRzIHRvIHRoZSBjb250cm9sbGVyIGZpbGVuYW1lOiAvY29udHJvbGxlcnMvY29udHJvbGxlcl9uYW1lLnBocAoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvYWRfY29udHJvbGxlciggJGNvbnRyb2xsZXIgKSB7CgkJLy8gVXNpbmcgdGhpcyBtZXRob2Qgc28gbG9hZF9jb250cm9sbGVyKCkgbWF5IGJlIHVzZWQgYW55d2hlcmUuCgkJaWYgKCBmaWxlX2V4aXN0cyggc2VsZjo6cGx1Z2luX3BhdGgoKSAuICcvY29udHJvbGxlcnMvJyAuICRjb250cm9sbGVyIC4gJy5waHAnICkgKSB7CgkJCXJlcXVpcmVfb25jZSggc2VsZjo6cGx1Z2luX3BhdGgoKSAuICcvY29udHJvbGxlcnMvJyAuICRjb250cm9sbGVyIC4gJy5waHAnICk7CgkJfSBlbHNlIHsKCQkJZWNobyAne0Vycm9yOiBVbmFibGUgdG8gbG9hZCBwYWdlIGNvbnRyb2xsZXIgYCcgLiAkY29udHJvbGxlciAuICdgOyBmaWxlIG5vdCBmb3VuZC59JzsKCQl9Cgl9IC8vIEVuZCBsb2FkX2NvbnRyb2xsZXIoKS4KCQoJCgkKCS8qCXNlbGY6OnJlZ2lzdGVyX3dpZGdldCgpCgkgKgkKCSAqCVJlZ2lzdGVycyBhIHdpZGdldC4gV2lsbCByZWdpc3RlciB3aWRnZXQgY2xhc3MgaW4gL2NvbnRyb2xsZXJzL3dpZGdldC9zbHVnLnBocC4gV2lkZ2V0IGNsYXNzIGV4dGVuZCBXUF9XaWRnZXRzLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHNsdWcJCU5hbWUgLyBzbHVnIGZvciB3aWRnZXQuIE11c3QgbWF0Y2ggZmlsZW5hbWUgaW4gY29udHJvbGxlcnNcd2lkZ2V0c1wgZGlyZWN0b3J5LiBDbGFzcyBuYW1lIGluIHRoZSBmb3JtYXQ6IHBiX3tQTFVHSU5TTFVHfV93aWRnZXRfe1dJREdFVFNMVUd9CgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVnaXN0ZXJfd2lkZ2V0KCAkc2x1ZyApIHsKCQlpZiAoIGZpbGVfZXhpc3RzKCBzZWxmOjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy93aWRnZXRzLycgLiAkc2x1ZyAuICcucGhwJyApICkgewoJCQlyZXF1aXJlKCBzZWxmOjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy93aWRnZXRzLycgLiAkc2x1ZyAuICcucGhwJyApOwoJCQlhZGRfYWN0aW9uKCAnd2lkZ2V0c19pbml0JywgY3JlYXRlX2Z1bmN0aW9uKCAnJywgJ3JlZ2lzdGVyX3dpZGdldChcJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnX3dpZGdldF8nIC4gJHNsdWcgLiAnXCcpOycgKSApOwoJCX0gZWxzZSB7CgkJCWVjaG8gJ3tFcnJvciAjMzQ0NDU0ODkyMjogVW5hYmxlIHRvIGxvYWQgd2lkZ2V0IGZpbGUgYGNvbnRyb2xsZXJzL3dpZGdldHMvJyAuICRzbHVnIC4gJy5waHBgLn0nOwoJCX0KCX0gLy8gRW5kIHJlZ2lzdGVyX3dpZGdldCgpLgoJCgkKCQoJLyoqCgkgKglhcnJheV9yZW1vdmUoKQoJICoKCSAqCVJlbW92ZXMgYXJyYXkgdmFsdWVzIGluICRyZW1vdmUgZnJvbSAkYXJyYXkuCgkgKgoJICoJQHBhcmFtCQkJJGFycmF5CQlhcnJheQkJU291cmNlIGFycmF5LiBUaGlzIHdpbGwgaGF2ZSB2YWx1ZXMgcmVtb3ZlZCBhbmQgYmUgcmV0dXJuZWQuCgkgKglAcGFyYW0JCQkkcmVtb3ZlCQlhcnJheQkJQXJyYXkgb2YgdmFsdWVzIHRvIHNlYXJjaCBmb3IgaW4gJGFycmF5IGFuZCByZW1vdmUuCgkgKglAcmV0dXJuCQkJCQkJYXJyYXkJCVJldHVybnMgYXJyYXkgJGFycmF5IHN0cmlwcGVkIG9mIGFsbCB2YWx1ZXMgZm91bmQgaW4gJHJlbW92ZQoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5X3JlbW92ZSggJGFycmF5LCAkcmVtb3ZlICkgewoJCWlmICggIWlzX2FycmF5KCAkcmVtb3ZlICkgKSB7CgkJCSRyZW1vdmUgPSBhcnJheSggJHJlbW92ZSApOwoJCX0KCQlyZXR1cm4gYXJyYXlfdmFsdWVzKCBhcnJheV9kaWZmKCAkYXJyYXksICRyZW1vdmUgKSApOwoJfSAvLyBFbmQgYXJyYXlfcmVtb3ZlKCkuCgkKCQoJCgkvKiBmbHVzaCgpCgkgKgoJICogQXR0ZW1wdCB0byBzdHJvbmdhcm0gYSBmbHVzaCB0byBhY3R1YWxseSB3b3JrLgoJICogUHJldmVudCBmbHVzaGluZyBieSBhZGRpbmcgdGhpcyB0byB3cC1jb25maWcucGhwOgoJICoJCWRlZmluZSggJ0JBQ0tVUEJVRERZX05PRkxVU0gnLCB0cnVlICk7CgkgKiAgT1IKCSAqCQlzZXQgYWR2YW5jZWQgb3B0aW9uIHRvIHByZXZlbnQgZmx1c2gKCSAqCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmx1c2goKSB7CgkJaWYgKCBkZWZpbmVkKCAnQkFDS1VQQlVERFlfTk9GTFVTSCcgKSAmJiAoIEJBQ0tVUEJVRERZX05PRkxVU0ggPT09IHRydWUgKSApIHsgLy8gU29tZSBzZXJ2ZXJzIHNlZW0gdG8gZGllIG9uIG11bHRpcGxlIGZsdXNoZXMgaW4gdGhlIHNhbWUgcGFnZWxvYWQuIERlZmluZSB0aGlzIHRvIHByZXZlbnQgZmx1c2hpbmcuCgkJCXJldHVybjsKCQl9CgkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zICkgJiYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcmV2ZW50X2ZsdXNoJ10gKSApICYmICggJzEnID09IHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJldmVudF9mbHVzaCddICkgKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0cnVlICE9PSBzZWxmOjokX2hhc19mbHVzaGVkICkgeyAvLyBPbmx5IHJ1biB0aGlzIG9uY2UuCgkJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnYXBhY2hlX3NldGVudicgKSApIHsKCQkJCUBhcGFjaGVfc2V0ZW52KCduby1nemlwJywgMSk7IC8vIENvbXByZXNzaW9uIGNvdWxkIGNhdXNlIHNlcnZlciB0byB3YWl0IGZvciBwYWdlIHRvIGZpbmlzaCBiZWZvcmUgcHJvY2VlZGluZy4gVHVybiBvZmYgY29tcHJlc3Npb24uCgkJCX0KCQkJQGluaV9zZXQoJ3psaWIub3V0cHV0X2NvbXByZXNzaW9uJywgMCk7IC8vIENvbXByZXNzaW9uIGNvdWxkIGNhdXNlIHNlcnZlciB0byB3YWl0IGZvciBwYWdlIHRvIGZpbmlzaCBiZWZvcmUgcHJvY2VlZGluZy4gVHVybiBvZmYgY29tcHJlc3Npb24uCgkJCXNlbGY6OiRfaGFzX2ZsdXNoZWQgPSB0cnVlOwoJCX0KCQlAb2JfZmx1c2goKTsKCQlmbHVzaCgpOwoJfSAvLyBFbmQgZmx1c2goKS4KCQoJCgkvKglyZXNldF9kZWZhdWx0cygpCgkgKgkKCSAqCVJlc2V0IHBsdWdpbiBvcHRpb25zIHRvIGRlZmF1bHRzLiBHZXR0aW5nIHN0YXJ0ZWQgcGFnZSB1c2VzIHRoaXMuCgkgKgkKCSAqCUByZXR1cm4JCWJvb2xlYW4JCQlUcnVlIG9uIHN1Y2Nlc3M7IGZhbHNlIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXNldF9kZWZhdWx0cygpIHsKCQlpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JF9zZXR0aW5nc1snZGVmYXVsdF9vcHRpb25zJ10gKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zID0gcGJfYmFja3VwYnVkZHk6OiRfc2V0dGluZ3NbJ2RlZmF1bHRfb3B0aW9ucyddOwoJCQlwYl9iYWNrdXBidWRkeTo6c2F2ZSgpOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfSAvLyBFbmQgcmVzZXRfZGVmYXVsdHMoKS4KCQoJCgkKfSAvLyBFbmQgY2xhc3MgcGx1Z2luYnVkZHkuCgoKaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiBQQl9TVEFOREFMT05FID09PSB0cnVlICkgewoJcmVxdWlyZV9vbmNlKCAnc3RhbmRhbG9uZV9wcmVsb2FkZXIucGhwJyApOwp9CgovLyAqKioqKioqKioqIExvYWQgY29yZSBjbGFzc2VzICoqKioqKioqKioKCnJlcXVpcmVfb25jZSggZGlybmFtZSggX19GSUxFX18gKSAuICcvY2xhc3Nlcy9jb3JlX2NvbnRyb2xsZXJzLnBocCcgKTsKaWYgKCBpc19hZG1pbigpICkgewoJcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9jbGFzc2VzL2Zvcm0ucGhwJyApOwoJcmVxdWlyZV9vbmNlKCBkaXJuYW1lKCBfX0ZJTEVfXyApIC4gJy9jbGFzc2VzL3NldHRpbmdzLnBocCcgKTsKfQoKCi8vICoqKioqKioqKiogSW5pdGlhbGl6ZSBQbHVnaW5CdWRkeSBmcmFtZXdvcmsgKioqKioqKioqKgoKaWYgKCAhaXNzZXQoICRwbHVnaW5idWRkeV9pbml0ICkgKSB7CgkkcGx1Z2luYnVkZHlfaW5pdCA9ICdpbml0LnBocCc7IC8vIGRlZmF1bHQgaW5pdCBmaWxlLgp9CnBiX2JhY2t1cGJ1ZGR5Ojppbml0KCAkcGx1Z2luYnVkZHlfc2V0dGluZ3MsICRwbHVnaW5idWRkeV9pbml0ICk7CnVuc2V0KCAkcGx1Z2luYnVkZHlfc2V0dGluZ3MgKTsKdW5zZXQoICRwbHVnaW5idWRkeV9pbml0ICk7CgpwYl9iYWNrdXBidWRkeTo6bG9hZCgpOwoKLy8gKioqKioqKioqKiBMb2FkIGluaXRpYWxpemF0aW9uIGZpbGVzICoqKioqKioqKioKCnJlcXVpcmVfb25jZSggZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy9pbml0X2dsb2JhbC5waHAnICk7CmlmICggaXNfYWRtaW4oKSApIHsKCXJlcXVpcmVfb25jZSggZGlybmFtZSggZGlybmFtZSggX19GSUxFX18gKSApIC4gJy9pbml0X2FkbWluLnBocCcgKTsKfQoKaWYgKCBkZWZpbmVkKCAnUEJfU1RBTkRBTE9ORScgKSAmJiBQQl9TVEFOREFMT05FID09PSB0cnVlICkgewoJcGJfYmFja3VwYnVkZHk6OmxvYWRfY29udHJvbGxlciggJ3BhZ2VzL2RlZmF1bHQnICk7Cn0K
###PACKDATA,FILE_END,/pluginbuddy/_pluginbuddy.php,importbuddy/pluginbuddy/_pluginbuddy.php
###PACKDATA,FILE_START,/pluginbuddy/history.txt,importbuddy/pluginbuddy/history.txt
MS4wLjAgLSAyMDExLTEyLTEzIC0gRHVzdGluIEJvbHRvbgoJSW5pdGlhbCBwdXNoLgoxLjAuMSAtIDIwMTEtMTItMTMgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBVSSB0aXRsZSgpIG5vdCBzaG93aW5nIGltYWdlLgoJRml4ZWQgbm9uLXNlcmllcyBHZXR0aW5nIFN0YXJ0ZWQgcGFnZSB1bmRlZmluZWQgaW5kZXguCglwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoKSByZXR1cm5zIGJsYW5rIGZvciBzZXJpZXMgdGFnIGlmIG5vdCBmb3VuZC4KMS4wLjIgLSAyMDExLTAyLTEyIC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgdXBkYXRlci4KMS4wLjMgLSAyMDEyLTAxLTA0IC0gRHVzdGluIEJvbHRvbgoJRml4ZWQgdmFyaW91cyB3aWRnZXQgdGhpbmdzLgoJVXNpbmcgVUkgZWxlbWVudHMgb24gcGFnZXMgdGhhdCBhcmVuJ3Qgb3VyIG93bi4KMS4wLjQgLSAyMDEyLTAxLTA1IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgb3B0aW9uYWwgYWJpbGl0eSB0byBzcGVjaWZpYyB0aGUgZmlyc3QgcGFyYW1ldGVyICgkdGFnKSBmb3IgYWRkX3Nob3J0Y3V0LCBhZGRfZmlsdGVyLCBhZGRfYWN0aW9uLCBldGMgdGhhdCBhbGxvd3MgcGFzc2luZyBhIGN1c3RvbSBtZXRob2QgY2FsbGJhY2sgbmFtZSB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgdGFnLiBTb21lIGFjdGlvbnMgaGF2ZSBjaGFyYWN0ZXJzIGRpc2FsbG93ZWQgaW4gUEhQIG1ldGhvZCBuYW1lcyBzbyB0aGV5IG5lZWQgdG8gZGlmZmVyLgoxLjAuNSAtIDIwMTItMDEtMDUgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBmb3JtIHZhbGlkYXRpb24gZm9yIGVtcHR5IGZvcm0gZWxlbWVudHMuCglGaXhlZCBtaXNzaW5nIHRvb2x0aXBzIGluIHNldHRpbmdzIGZvcm1zLgoxLjAuNiAtIDIwMTItMDEtMDUgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIG9uIGZvcm0gdmFsaWRhdGlvbiBmYWlsdXJlLgoJTm93IGFsbG93aW5nIHBhcnRpYWwgZm9ybSBzYXZpbmcgb24gdmFsaWR0aW9uIGZhaWx1cmUuCglBZGRlZCByZWQgYm9yZGVyIGFyb3VuZCBmb3JtIGl0ZW1zIHRoYXQgZmFpbCB2YWxpZGF0aW9uIGZvciBlYXNpZXIgcmVjb2duaXRpb24uCjEuMC43IC0gMjAxMi0wMS0wNiAtIER1c3RpbiBCb2x0b24KCUZvcm0gdmFsaWRhdGlvbiBmdW5jdGlvbiBudW1iZXIgcnVsZSB3YXMgaW5wcm9wZXJseSBuYW1lZCBudW0uCjEuMC44IC0gMjAxMi0wMS0xMyAtIER1c3RpbiBCb2x0b24KCUFkZGVkIGVycm9yIG1lc3NhZ2UgaWYgdXBkYXRlciBzZXR0aW5ncyBwYXJhbWV0ZXIgbWlzc2luZy4KCUZpeGVkIHZlcnNpb24gbnVtYmVyLgoxLjAuOSAtIDIwMTItMDEtMTMgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBwbHVnaW5idWRkeV9zZXR0aW5ncyBmb3JtIHNldHRpbmcgZm9ybSBuYW1lIHN0YXRpY2FsbHkuCglDdXN0b20gcHJvY2Vzc2luZyBhZGRlZCBpbnRvIHBsdWdpbmJ1ZGR5X3NldHRpbmdzIGNsYXNzIHZpYSBwcm9jZXNzKCk7IGp1c3Qgc2V0IHNhdmVwb2ludCBpbiBjb25zdHJ1Y3RvciB0byBmYWxzZSB0byBhY3RpdmF0ZSB0aGlzIG1vZGUuCjEuMC4xMSAtIDIwMTItMDEtMTggLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBpbml0aWFsIHN0YXJ0aW5ncyBmb3IgbmV3IG1lZGlhIGxpYnJhcnkgc3lzdGVtLgoJVHdlYWtlZCBkb3duc2l6ZXIgbG9hZGVyIHN5c3RlbS4KCVJlbmFtZWQgcGx1Z2luYnVkZHkgY2xhc3MgdG8gcGIgY2xhc3MuIEFsbCByZWZlcmVuY2VzIHRvIHBiX2JhY2t1cGJ1ZGR5Ojogc2hvdWxkIGNoYW5nZSB0byBwYl9iYWNrdXBidWRkeTo6CjEuMC4xMiAtIDIwMTItMDEtMTggLSBEdXN0aW4gQm9sdG9uCQoJX2luaXRfY29yZV9jb250cm9sbGVyKCkgY2xlYW51cC4KMS4wLjEzIC0gMjAxMi0wMS0xOSAtIER1c3RpbiBCb2x0b24JCglGaXhlZCBsYWNrIG9mIHJldHVybiBpbiBwYl9iYWNrdXBidWRkeTo6dGlwKCkgYW5kIHBiX2JhY2t1cGJ1ZGR5Ojp2aWRlbygpLgoxLjAuMTQgLSAyMDEyLTAxLTE5IC0gRHVzdGluIEJvbHRvbgoJTW92ZWQgYWxsIGZyYW1ld29yay1yZXF1aXJlZCBKUyBhbmQgQ1NTIGludG8gcGx1Z2luYnVkZHkgZGlyZWN0b3J5LgoxLjAuMTUgLSAyMDEyLTAxLTI1IC0gRHVzdGluIEJvbHRvbgoJRml4ZWQgY29yZSBjb250cm9sbGVyIGZvciBkYXNoYm9hcmQgd2lkZ2V0IGJlaW5nIGFibGUgdG8gYWNjZXNzIHByaXZhdGUgc3RhdGljIHZhci4KCUFkZGVkIHBiX2JhY2t1cGJ1ZGR5OjphbnRpX2RpcmVjdG9yeV9icm93c2luZygpLgoJQWRkZWQgcGJfYmFja3VwYnVkZHk6Om1rZGlyKCkuCglBZGRlZCBwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCkuCglBZGRlZCBwYl9iYWNrdXBidWRkeTo6Z2V0X3N0YXR1cygpLgoJQWRkZWQgcGJfYmFja3VwYnVkZHk6OmRlYnVnKCkuCjEuMC4xNiAtIDIwMTItMDEtMjYgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBwYl9iYWNrdXBidWRkeTo6JGZpbGVzeXN0ZW0gY2xhc3MgY29udHJvbGxlciBmb3IgaW50ZXJmYWNpbmcgd2l0aCBmaWxlIHN5c3RlbS4KCUFkZGVkIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0IGNsYXNzIGNvbnRyb2xsZXIgZm9yIGZvcm1hdHRpbmcgZGF0YSAvIHRleHQgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0cy4KCWRvd25zaXplciwgdXBkYXRlciwgZmlsZXN5c3RlbSwgYW5kIGZvcm1hdCAnbW9kdWxlcycgbm93IGNvbnRyb2xsZWQgdmlhIG1vZHVsZXMga2V5IGluIHRoZSAkc2V0dGluZ3MgYXJyYXkuICBTZWUgbmV3IGluaXQucGhwLgoxLjAuMTkgLSAyMDEyLTAxLTMxIC0gRHVzdGluIEJvbHRvbgoJRm9ybSBmaXguCglTZXR0aW5ncyBmaXguCglBZGRlZCBDU1Mgb3B0aW9ucyBmb3IgZ3JvdXAgbGlzdCBpbiBVSSBjbGFzcy4KCUFkZGVkIHRpdGxlIHR5cGUgZm9yIGZvcm0vc2V0dGluZ3MgY2xhc3Nlcy4KCVVwZGF0ZWQgYWRtaW4uY3NzIGZvciB0aXRsZSBzZXR0aW5ncyBmb3JtIHR5cGUuCjEuMC4yMCAtIDIwMTItMDEtMDEgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCBlcnJvciBjb2RlIGxvb2t1cCBmdW5jdGlvbiB0byBmaWxlc3lzdGVtIGNsYXNzLiBGb3IgZXhpdCBjb2RlcyBmcm9tIGV4ZWMoKSBhbmQgc3VjaC4KCUZpeGVkIHN0YXR1cygpIGJ1Z3Mgd2l0aCBuZXdsaW5lcywgYXJyYXlzIChjaGFuZ2VkIGRlbGltaXRlcikuCjEuMC4yMSAtIDIwMTItMDEtMDEgLSBEdXN0aW4gQm9sdG9uCglBZGRlZCB3eXNpd3lnIG9iamVjdCB5b3UgZm9ybSAmIHNldHRpbmdzIHN5c3RlbS4KCVRvdWNodXAgdG8gZmlsZXN5c3RlbSBjbGFzcy4KCUFkZGVkIGhpZGRlbiBmb3JtIG9iamVjdC4KCVNldHRpbmcgdGhlIHRpdGxlIG9mIGFueSBmb3JtL3NldHRpbmdzIG9iamVjdCB0byAnJyB3aWxsIGhpZGUgaXRzIGxlZnQgY29sdW1uIChjb2xsYXBzZXMgbGVmdCkuCglBZGRlZCB0aXRsZSBmb3JtIG9iamVjdCB0eXBlIGZvciBmb3JtYXR0aW5nLgoxLjAuMjIgLSAyMDEyLTAxLTAzIC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgcGI6OiRzdGFydF90aW1lIHRvIHVzZSB0byBjb21wYXJlIHBhc3NhZ2Ugb2YgdGltZS4KMS4wLjIzIC0gMjAxMi0wMi0wOCAtIER1c3RpbiBCb2x0b24KCVVwZGF0ZWQgdXBkYXRlci4KMS4wLjI0IC0gMjAxMi0wMi0wOCAtIER1c3RpbiBCb2x0b24KCUZpeGVkIGNoZWNrYm94ICJZRVMhIiBkZWJ1ZyBvdXRwdXQuCglGaXhlZCByYWRpbyBpbnB1dCBkZWZhdWx0IGNoZWNrZWQgc2VsZWN0aW9uIG5vdCBiZWluZyBhcHBsaWVkLgoxLjAuMjUgLSAyMDEyLTAyLTA5IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgb3JpZW50YXRpb24gb3B0aW9uIHRvIHJhZGlvIGJ1dHRvbnMuICBQb3NzaWJsZSB2YWxzOiBob3Jpem9udGFsLCB2ZXJ0aWNhbAoxLjAuMjYgLSAyMDEyLTAyLTA5IC0gRHVzdGluIEJvbHRvbgoJQWRkZWQgdGFiYmVkIGludGVyZmFjZXMgaW50byAkdWkgY2xhc3MuCjEuMC4yNyAtIDIwMTItMDItMTAgLSBEdXN0aW4gQm9sdG9uCglGaXhlZCBHZXR0aW5nIFN0YXJ0ZWQgcGFnZSB3aXRoIG9sZGVyIHNlcmllcyBjb25mbGljdGluZy4KMS4wLjI4IC0gMjAxMi0wMi0xNyAtIER1c3RpbiBCb2x0b24KCXN0cnN0cigpIHVzZWQgM3JkIHBhcmFtIHdoaWNoIHJlcXVpcmVkIFBIUCA+PSA1LjMgaW4gZm9ybTo6dGVzdF9ydWxlKCkuCglDbGVhbmVkIHVwIGluaXQucGhwIGEgYml0LgoJQ29sb3IgcGlja2VyOiBBZGRlZCBjb2xvciB0eXBlIHRvIGZvcm0vc2V0dGluZ3MuCgkKCUFkZGVkIHNldHRpbmdzIGNsYXNzIG1ldGhvZDogc2V0X3ZhbHVlKCkgdG8gb3ZlcndyaXRlIHZhbHVlcy4=
###PACKDATA,FILE_END,/pluginbuddy/history.txt,importbuddy/pluginbuddy/history.txt
###PACKDATA,FILE_START,/pluginbuddy/index.php,importbuddy/pluginbuddy/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/pluginbuddy/index.php,importbuddy/pluginbuddy/index.php
###PACKDATA,FILE_START,/pluginbuddy/standalone_preloader.php,importbuddy/pluginbuddy/standalone_preloader.php
PD9waHAKJHBiX3N0eWxlcyA9IGFycmF5KCk7CiRwYl9zY3JpcHRzID0gYXJyYXkoKTsKJHBiX2FjdGlvbnMgPSBhcnJheSgpOwokd3Bfc2NyaXB0cyA9IGFycmF5KCk7CgovLyBOT1RFOiBNb2RpZmllZCBmcm9tIFdQIHRvIHJ0cmltIG9uIGRpcm5hbWUoKSBkdWUgdG8gV2luZG93cyBpc3N1ZXMuCmZ1bmN0aW9uIHNpdGVfdXJsKCkgewoJJHBhZ2VVUkwgPSAnaHR0cCc7CglpZiAoIGlzc2V0KCAkX1NFUlZFUlsiSFRUUFMiXSApICYmICggJF9TRVJWRVJbIkhUVFBTIl0gPT0gIm9uIiApICkgeyRwYWdlVVJMIC49ICJzIjt9CgkkcGFnZVVSTCAuPSAiOi8vIjsKCWlmICgkX1NFUlZFUlsiU0VSVkVSX1BPUlQiXSAhPSAiODAiKSB7CgkJJHBhZ2VVUkwgLj0gJF9TRVJWRVJbIlNFUlZFUl9OQU1FIl0uIjoiLiRfU0VSVkVSWyJTRVJWRVJfUE9SVCJdIC4gcnRyaW0oIGRpcm5hbWUoJF9TRVJWRVJbJ1BIUF9TRUxGJ10pLCAnL1xcJyApOwoJfSBlbHNlIHsKCQkkcGFnZVVSTCAuPSAkX1NFUlZFUlsiU0VSVkVSX05BTUUiXSAuIHJ0cmltKCBkaXJuYW1lKCRfU0VSVkVSWydQSFBfU0VMRiddKSwgJy9cXCcgKTsKCX0KCQoJcmV0dXJuICRwYWdlVVJMOwp9CgovKioKICogTmF2aWdhdGVzIHRocm91Z2ggYW4gYXJyYXkgYW5kIHJlbW92ZXMgc2xhc2hlcyBmcm9tIHRoZSB2YWx1ZXMuCiAqCiAqIElmIGFuIGFycmF5IGlzIHBhc3NlZCwgdGhlIGFycmF5X21hcCgpIGZ1bmN0aW9uIGNhdXNlcyBhIGNhbGxiYWNrIHRvIHBhc3MgdGhlCiAqIHZhbHVlIGJhY2sgdG8gdGhlIGZ1bmN0aW9uLiBUaGUgc2xhc2hlcyBmcm9tIHRoaXMgdmFsdWUgd2lsbCByZW1vdmVkLgogKgogKiBAc2luY2UgMi4wLjAKICoKICogQHBhcmFtIGFycmF5fHN0cmluZyAkdmFsdWUgVGhlIGFycmF5IG9yIHN0cmluZyB0byBiZSBzdHJpcHBlZC4KICogQHJldHVybiBhcnJheXxzdHJpbmcgU3RyaXBwZWQgYXJyYXkgKG9yIHN0cmluZyBpbiB0aGUgY2FsbGJhY2spLgogKi8KZnVuY3Rpb24gc3RyaXBzbGFzaGVzX2RlZXAoJHZhbHVlKSB7CglpZiAoIGlzX2FycmF5KCR2YWx1ZSkgKSB7CgkJJHZhbHVlID0gYXJyYXlfbWFwKCdzdHJpcHNsYXNoZXNfZGVlcCcsICR2YWx1ZSk7Cgl9IGVsc2VpZiAoIGlzX29iamVjdCgkdmFsdWUpICkgewoJCSR2YXJzID0gZ2V0X29iamVjdF92YXJzKCAkdmFsdWUgKTsKCQlmb3JlYWNoICgkdmFycyBhcyAka2V5PT4kZGF0YSkgewoJCQkkdmFsdWUtPnska2V5fSA9IHN0cmlwc2xhc2hlc19kZWVwKCAkZGF0YSApOwoJCX0KCX0gZWxzZSB7CgkJJHZhbHVlID0gc3RyaXBzbGFzaGVzKCR2YWx1ZSk7Cgl9CgoJcmV0dXJuICR2YWx1ZTsKfQoKCi8qKgogKiBDaGVjayB2YWx1ZSB0byBmaW5kIGlmIGl0IHdhcyBzZXJpYWxpemVkLgogKgogKiBJZiAkZGF0YSBpcyBub3QgYW4gc3RyaW5nLCB0aGVuIHJldHVybmVkIHZhbHVlIHdpbGwgYWx3YXlzIGJlIGZhbHNlLgogKiBTZXJpYWxpemVkIGRhdGEgaXMgYWx3YXlzIGEgc3RyaW5nLgogKiBDb3VydGVzeSBXb3JkUHJlc3M7IHNpbmNlIFdvcmRQcmVzcyAyLjAuNS4KICoKICogQHBhcmFtIG1peGVkICRkYXRhIFZhbHVlIHRvIGNoZWNrIHRvIHNlZSBpZiB3YXMgc2VyaWFsaXplZC4KICogQHJldHVybiBib29sIEZhbHNlIGlmIG5vdCBzZXJpYWxpemVkIGFuZCB0cnVlIGlmIGl0IHdhcy4KICovCmZ1bmN0aW9uIGlzX3NlcmlhbGl6ZWQoICRkYXRhICkgewoJLy8gaWYgaXQgaXNuJ3QgYSBzdHJpbmcsIGl0IGlzbid0IHNlcmlhbGl6ZWQKCWlmICggISBpc19zdHJpbmcoICRkYXRhICkgKQoJCXJldHVybiBmYWxzZTsKCSRkYXRhID0gdHJpbSggJGRhdGEgKTsKIAlpZiAoICdOOycgPT0gJGRhdGEgKQoJCXJldHVybiB0cnVlOwoJJGxlbmd0aCA9IHN0cmxlbiggJGRhdGEgKTsKCWlmICggJGxlbmd0aCA8IDQgKQoJCXJldHVybiBmYWxzZTsKCWlmICggJzonICE9PSAkZGF0YVsxXSApCgkJcmV0dXJuIGZhbHNlOwoJJGxhc3RjID0gJGRhdGFbJGxlbmd0aC0xXTsKCWlmICggJzsnICE9PSAkbGFzdGMgJiYgJ30nICE9PSAkbGFzdGMgKQoJCXJldHVybiBmYWxzZTsKCSR0b2tlbiA9ICRkYXRhWzBdOwoJc3dpdGNoICggJHRva2VuICkgewoJCWNhc2UgJ3MnIDoKCQkJaWYgKCAnIicgIT09ICRkYXRhWyRsZW5ndGgtMl0gKQoJCQkJcmV0dXJuIGZhbHNlOwoJCWNhc2UgJ2EnIDoKCQljYXNlICdPJyA6CgkJCXJldHVybiAoYm9vbCkgcHJlZ19tYXRjaCggIi9eeyR0b2tlbn06WzAtOV0rOi9zIiwgJGRhdGEgKTsKCQljYXNlICdiJyA6CgkJY2FzZSAnaScgOgoJCWNhc2UgJ2QnIDoKCQkJcmV0dXJuIChib29sKSBwcmVnX21hdGNoKCAiL157JHRva2VufTpbMC05LkUtXSs7XCQvIiwgJGRhdGEgKTsKCX0KCXJldHVybiBmYWxzZTsKfSAvLyBFbmQgaXNfc2VyaWFsaXplZCgpLgoKZnVuY3Rpb24gX18oICR0ZXh0LCAkZG9tYWluID0gJycgKSB7CglyZXR1cm4gJHRleHQ7Cn0KZnVuY3Rpb24gX2UoICR0ZXh0LCAkZG9tYWluID0gJycgKSB7CgllY2hvICR0ZXh0Owp9CgpmdW5jdGlvbiB3cF9zdHlsZV9pcyggJG5hbWUgKSB7CglnbG9iYWwgJHBiX3N0eWxlczsKCXJldHVybiBhcnJheV9rZXlfZXhpc3RzKCAkbmFtZSwgJHBiX3N0eWxlcyApOwp9CmZ1bmN0aW9uIHdwX2VucXVldWVfc3R5bGUoICRuYW1lLCAkZmlsZSwgJGRlcHMgPSBhcnJheSgpLCAkdmVyID0gJycgKSB7CglnbG9iYWwgJHBiX3N0eWxlczsKCSRwYl9zdHlsZXNbJG5hbWVdWydmaWxlJ10gPSAkZmlsZTsKCSRwYl9zdHlsZXNbJG5hbWVdWyd2ZXJzaW9uJ10gPSAkdmVyOwoJJHBiX3N0eWxlc1skbmFtZV1bJ3ByaW50ZWQnXSA9IGZhbHNlOwp9CmZ1bmN0aW9uIHdwX3ByaW50X3N0eWxlcyggJG5hbWUgKSB7CglnbG9iYWwgJHBiX3N0eWxlczsKCWlmICggJHBiX3N0eWxlc1skbmFtZV1bJ3ByaW50ZWQnXSA9PT0gZmFsc2UgKSB7CgkJJHBiX3N0eWxlc1skbmFtZV1bJ3ByaW50ZWQnXSA9IHRydWU7CgkJCgkJZWNobyAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJyAuICRwYl9zdHlsZXNbJG5hbWVdWydmaWxlJ10gLiAnP3Zlcj0nIC4gJHBiX3N0eWxlc1skbmFtZV1bJ3ZlcnNpb24nXSAuICciPic7Cgl9Cn0KCmZ1bmN0aW9uIHdwX3NjcmlwdF9pcyggJG5hbWUgKSB7CglnbG9iYWwgJHBiX3NjcmlwdHM7CglyZXR1cm4gYXJyYXlfa2V5X2V4aXN0cyggJG5hbWUsICRwYl9zY3JpcHRzICk7Cn0KZnVuY3Rpb24gd3BfZW5xdWV1ZV9zY3JpcHQoICRuYW1lLCAkZmlsZSwgJGRlcHMgPSBhcnJheSgpLCAkdmVyID0gJycgKSB7CglnbG9iYWwgJHBiX3NjcmlwdHM7CgkkcGJfc2NyaXB0c1skbmFtZV1bJ2ZpbGUnXSA9ICRmaWxlOwoJJHBiX3NjcmlwdHNbJG5hbWVdWyd2ZXJzaW9uJ10gPSAkdmVyOwoJJHBiX3NjcmlwdHNbJG5hbWVdWydwcmludGVkJ10gPSBmYWxzZTsKfQpmdW5jdGlvbiB3cF9wcmludF9zY3JpcHRzKCAkbmFtZSApIHsKCWdsb2JhbCAkcGJfc2NyaXB0czsKCWlmICggJHBiX3NjcmlwdHNbJG5hbWVdWydwcmludGVkJ10gPT09IGZhbHNlICkgewoJCSRwYl9zY3JpcHRzWyRuYW1lXVsncHJpbnRlZCddID0gdHJ1ZTsKCQkKCQllY2hvICc8c2NyaXB0IHNyYz0iJyAuICRwYl9zY3JpcHRzWyRuYW1lXVsnZmlsZSddIC4gJz92ZXI9JyAuICRwYl9zY3JpcHRzWyRuYW1lXVsndmVyc2lvbiddIC4gJyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4nOwoJfQp9CgpmdW5jdGlvbiBhZGRfYWN0aW9uKCAkdGFnLCAkY2FsbGJhY2sgKSB7CglnbG9iYWwgJHBiX2FjdGlvbnM7CgkkcGJfYWN0aW9uc1skdGFnXVsnY2FsbGJhY2snXSA9ICRjYWxsYmFjazsKfQoKCmZ1bmN0aW9uIGlzX2FkbWluKCkgewoJcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIGFwcGx5X2ZpbHRlcnMoICRmaWx0ZXIsICR2YWx1ZSApIHsKCXJldHVybiAkdmFsdWU7Cn0KCmZ1bmN0aW9uIF9jbGVhbnVwX2hlYWRlcl9jb21tZW50KCRzdHIpIHsKCXJldHVybiB0cmltKHByZWdfcmVwbGFjZSgiL1xzKig/OlwqXC98XD8+KS4qLyIsICcnLCAkc3RyKSk7Cn0KCmZ1bmN0aW9uIGdldF9wbHVnaW5fZGF0YSggJHBsdWdpbl9maWxlLCAkbWFya3VwID0gdHJ1ZSwgJHRyYW5zbGF0ZSA9IHRydWUgKSB7CgoJJGRlZmF1bHRfaGVhZGVycyA9IGFycmF5KAoJCSdOYW1lJyA9PiAnUGx1Z2luIE5hbWUnLAoJCSdQbHVnaW5VUkknID0+ICdQbHVnaW4gVVJJJywKCQknVmVyc2lvbicgPT4gJ1ZlcnNpb24nLAoJCSdEZXNjcmlwdGlvbicgPT4gJ0Rlc2NyaXB0aW9uJywKCQknQXV0aG9yJyA9PiAnQXV0aG9yJywKCQknQXV0aG9yVVJJJyA9PiAnQXV0aG9yIFVSSScsCgkJJ1RleHREb21haW4nID0+ICdUZXh0IERvbWFpbicsCgkJJ0RvbWFpblBhdGgnID0+ICdEb21haW4gUGF0aCcsCgkJJ05ldHdvcmsnID0+ICdOZXR3b3JrJywKCQkvLyBTaXRlIFdpZGUgT25seSBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIE5ldHdvcmsuCgkJJ19zaXRld2lkZScgPT4gJ1NpdGUgV2lkZSBPbmx5JywKCSk7CgoJJHBsdWdpbl9kYXRhID0gZ2V0X2ZpbGVfZGF0YSggJHBsdWdpbl9maWxlLCAkZGVmYXVsdF9oZWFkZXJzLCAncGx1Z2luJyApOwoKCS8vIFNpdGUgV2lkZSBPbmx5IGlzIHRoZSBvbGQgaGVhZGVyIGZvciBOZXR3b3JrCglpZiAoIGVtcHR5KCAkcGx1Z2luX2RhdGFbJ05ldHdvcmsnXSApICYmICEgZW1wdHkoICRwbHVnaW5fZGF0YVsnX3NpdGV3aWRlJ10gKSApIHsKCQlfZGVwcmVjYXRlZF9hcmd1bWVudCggX19GVU5DVElPTl9fLCAnMy4wJywgc3ByaW50ZiggX18oICdUaGUgPGNvZGU+JTEkczwvY29kZT4gcGx1Z2luIGhlYWRlciBpcyBkZXByZWNhdGVkLiBVc2UgPGNvZGU+JTIkczwvY29kZT4gaW5zdGVhZC4nICksICdTaXRlIFdpZGUgT25seTogdHJ1ZScsICdOZXR3b3JrOiB0cnVlJyApICk7CgkJJHBsdWdpbl9kYXRhWydOZXR3b3JrJ10gPSAkcGx1Z2luX2RhdGFbJ19zaXRld2lkZSddOwoJfQoJJHBsdWdpbl9kYXRhWydOZXR3b3JrJ10gPSAoICd0cnVlJyA9PSBzdHJ0b2xvd2VyKCAkcGx1Z2luX2RhdGFbJ05ldHdvcmsnXSApICk7Cgl1bnNldCggJHBsdWdpbl9kYXRhWydfc2l0ZXdpZGUnXSApOwoKCS8vRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnkgZGVmYXVsdCBUaXRsZSBpcyB0aGUgc2FtZSBhcyBOYW1lLgoJJHBsdWdpbl9kYXRhWydUaXRsZSddID0gJHBsdWdpbl9kYXRhWydOYW1lJ107CgoJaWYgKCAkbWFya3VwIHx8ICR0cmFuc2xhdGUgKQoJCSRwbHVnaW5fZGF0YSA9IF9nZXRfcGx1Z2luX2RhdGFfbWFya3VwX3RyYW5zbGF0ZSggJHBsdWdpbl9maWxlLCAkcGx1Z2luX2RhdGEsICRtYXJrdXAsICR0cmFuc2xhdGUgKTsKCWVsc2UKCQkkcGx1Z2luX2RhdGFbJ0F1dGhvck5hbWUnXSA9ICRwbHVnaW5fZGF0YVsnQXV0aG9yJ107CgoJcmV0dXJuICRwbHVnaW5fZGF0YTsKfQoKCmZ1bmN0aW9uIGdldF9maWxlX2RhdGEoICRmaWxlLCAkZGVmYXVsdF9oZWFkZXJzLCAkY29udGV4dCA9ICcnICkgewoJLy8gV2UgZG9uJ3QgbmVlZCB0byB3cml0ZSB0byB0aGUgZmlsZSwgc28ganVzdCBvcGVuIGZvciByZWFkaW5nLgoJJGZwID0gZm9wZW4oICRmaWxlLCAncicgKTsKCgkvLyBQdWxsIG9ubHkgdGhlIGZpcnN0IDhraUIgb2YgdGhlIGZpbGUgaW4uCgkkZmlsZV9kYXRhID0gZnJlYWQoICRmcCwgODE5MiApOwoKCS8vIFBIUCB3aWxsIGNsb3NlIGZpbGUgaGFuZGxlLCBidXQgd2UgYXJlIGdvb2QgY2l0aXplbnMuCglmY2xvc2UoICRmcCApOwoKCWlmICggJGNvbnRleHQgIT0gJycgKSB7CgkJJGV4dHJhX2hlYWRlcnMgPSBhcHBseV9maWx0ZXJzKCAiZXh0cmFfeyRjb250ZXh0fV9oZWFkZXJzIiwgYXJyYXkoKSApOwoKCQkkZXh0cmFfaGVhZGVycyA9IGFycmF5X2ZsaXAoICRleHRyYV9oZWFkZXJzICk7CgkJZm9yZWFjaCggJGV4dHJhX2hlYWRlcnMgYXMgJGtleT0+JHZhbHVlICkgewoJCQkkZXh0cmFfaGVhZGVyc1ska2V5XSA9ICRrZXk7CgkJfQoJCSRhbGxfaGVhZGVycyA9IGFycmF5X21lcmdlKCAkZXh0cmFfaGVhZGVycywgKGFycmF5KSAkZGVmYXVsdF9oZWFkZXJzICk7Cgl9IGVsc2UgewoJCSRhbGxfaGVhZGVycyA9ICRkZWZhdWx0X2hlYWRlcnM7Cgl9CgoJZm9yZWFjaCAoICRhbGxfaGVhZGVycyBhcyAkZmllbGQgPT4gJHJlZ2V4ICkgewoJCXByZWdfbWF0Y2goICcvXlsgXHRcLyojQF0qJyAuIHByZWdfcXVvdGUoICRyZWdleCwgJy8nICkgLiAnOiguKikkL21pJywgJGZpbGVfZGF0YSwgJHskZmllbGR9KTsKCQlpZiAoICFlbXB0eSggJHskZmllbGR9ICkgKQoJCQkkeyRmaWVsZH0gPSBfY2xlYW51cF9oZWFkZXJfY29tbWVudCggJHskZmllbGR9WzFdICk7CgkJZWxzZQoJCQkkeyRmaWVsZH0gPSAnJzsKCX0KCgkkZmlsZV9kYXRhID0gY29tcGFjdCggYXJyYXlfa2V5cyggJGFsbF9oZWFkZXJzICkgKTsKCglyZXR1cm4gJGZpbGVfZGF0YTsKfQoKCmZ1bmN0aW9uIHdwX25vbmNlX2ZpZWxkKCkgewoJcmV0dXJuOwp9CgoKCi8vIFNvbWUgUEhQIGluc3RhbGxzIGRvbid0IGhhdmUgbmdldHRleHQuIE5lZWRlZCBieSBodW1hbl90aW1lX2RpZmYoKS4KaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ25nZXR0ZXh0JyApICkgewoJZnVuY3Rpb24gbmdldHRleHQoICRzaW5ndWxhciwgJHBsdXJhbCwgJG51bSApIHsKCQlpZiAoICRudW0gPiAxICkgewoJCQlyZXR1cm4gJHBsdXJhbDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHNpbmd1bGFyOwoJCX0KCX0KfSAvLyBFbmQgbmdldHRleHQoKS4KCgoKLyoqCiAqIERldGVybWluZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gdGltZXN0YW1wcy4KICoKICogVGhlIGRpZmZlcmVuY2UgaXMgcmV0dXJuZWQgaW4gYSBodW1hbiByZWFkYWJsZSBmb3JtYXQgc3VjaCBhcyAiMSBob3VyIiwKICogIjUgbWlucyIsICIyIGRheXMiLgogKgogKiBAc2luY2UgMS41LjAKICoKICogQHBhcmFtIGludCAkZnJvbSBVbml4IHRpbWVzdGFtcCBmcm9tIHdoaWNoIHRoZSBkaWZmZXJlbmNlIGJlZ2lucy4KICogQHBhcmFtIGludCAkdG8gT3B0aW9uYWwuIFVuaXggdGltZXN0YW1wIHRvIGVuZCB0aGUgdGltZSBkaWZmZXJlbmNlLiBEZWZhdWx0IGJlY29tZXMgdGltZSgpIGlmIG5vdCBzZXQuCiAqIEByZXR1cm4gc3RyaW5nIEh1bWFuIHJlYWRhYmxlIHRpbWUgZGlmZmVyZW5jZS4KICovCmZ1bmN0aW9uIGh1bWFuX3RpbWVfZGlmZiggJGZyb20sICR0byA9ICcnICkgewoJaWYgKCBlbXB0eSgkdG8pICkKCQkkdG8gPSB0aW1lKCk7CgkkZGlmZiA9IChpbnQpIGFicygkdG8gLSAkZnJvbSk7CglpZiAoJGRpZmYgPD0gMzYwMCkgewoJCSRtaW5zID0gcm91bmQoJGRpZmYgLyA2MCk7CgkJaWYgKCRtaW5zIDw9IDEpIHsKCQkJJG1pbnMgPSAxOwoJCX0KCQkvKiB0cmFuc2xhdG9yczogbWluPW1pbnV0ZSAqLwoJCSRzaW5jZSA9IHNwcmludGYoIG5nZXR0ZXh0KCAnJXMgbWluJywgJyVzIG1pbnMnLCAkbWlucyApLCAkbWlucyk7Cgl9IGVsc2UgaWYgKCgkZGlmZiA8PSA4NjQwMCkgJiYgKCRkaWZmID4gMzYwMCkpIHsKCQkkaG91cnMgPSByb3VuZCgkZGlmZiAvIDM2MDApOwoJCWlmICgkaG91cnMgPD0gMSkgewoJCQkkaG91cnMgPSAxOwoJCX0KCQkkc2luY2UgPSBzcHJpbnRmKCBuZ2V0dGV4dCgnJXMgaG91cicsICclcyBob3VycycsICRob3VycyApLCAkaG91cnMpOwoJfSBlbHNlaWYgKCRkaWZmID49IDg2NDAwKSB7CgkJJGRheXMgPSByb3VuZCgkZGlmZiAvIDg2NDAwKTsKCQlpZiAoJGRheXMgPD0gMSkgewoJCQkkZGF5cyA9IDE7CgkJfQoJCSRzaW5jZSA9IHNwcmludGYoIG5nZXR0ZXh0KCclcyBkYXknLCAnJXMgZGF5cycsICRkYXlzICksICRkYXlzKTsKCX0KCXJldHVybiAkc2luY2U7Cn0KCgoKLyoqCiAqIFVuc2VyaWFsaXplIHZhbHVlIG9ubHkgaWYgaXQgd2FzIHNlcmlhbGl6ZWQuCiAqCiAqIEBzaW5jZSAyLjAuMAogKgogKiBAcGFyYW0gc3RyaW5nICRvcmlnaW5hbCBNYXliZSB1bnNlcmlhbGl6ZWQgb3JpZ2luYWwsIGlmIGlzIG5lZWRlZC4KICogQHJldHVybiBtaXhlZCBVbnNlcmlhbGl6ZWQgZGF0YSBjYW4gYmUgYW55IHR5cGUuCiAqLwpmdW5jdGlvbiBtYXliZV91bnNlcmlhbGl6ZSggJG9yaWdpbmFsICkgewoJaWYgKCBpc19zZXJpYWxpemVkKCAkb3JpZ2luYWwgKSApIC8vIGRvbid0IGF0dGVtcHQgdG8gdW5zZXJpYWxpemUgZGF0YSB0aGF0IHdhc24ndCBzZXJpYWxpemVkIGdvaW5nIGluCgkJcmV0dXJuIEB1bnNlcmlhbGl6ZSggJG9yaWdpbmFsICk7CglyZXR1cm4gJG9yaWdpbmFsOwp9CgoKCgoKCi8vIE5PVCBJTVBMRU1FTlRFRCBCVVQgTk9OLUJMT0NLSU5HLgoKZnVuY3Rpb24gcmVnaXN0ZXJfYWN0aXZhdGlvbl9ob29rKCkgewp9CmZ1bmN0aW9uIGxvYWRfcGx1Z2luX3RleHRkb21haW4oKSB7Cn0KZnVuY3Rpb24gY3VycmVudF91c2VyX2NhbiggJHJvbGUgKSB7CglyZXR1cm4gdHJ1ZTsKfQpmdW5jdGlvbiBnZXRfdGVtcF9kaXIoKSB7CgkKCWlmICggZnVuY3Rpb25fZXhpc3RzKCdzeXNfZ2V0X3RlbXBfZGlyJykgKSB7CgkJJHRlbXAgPSBzeXNfZ2V0X3RlbXBfZGlyKCk7CgkJaWYgKCBAaXNfZGlyKCAkdGVtcCApICYmIGlzX3dyaXRhYmxlKCAkdGVtcCApICkKCQkJcmV0dXJuIHJ0cmltKCAkdGVtcCwgJy9cXCcgKSAuICcvJzsKCX0KCQoJJHRlbXAgPSBBQlNQQVRIIC4gJ3RlbXAvJzsKCUBta2RpciggJHRlbXAgKTsKCWlmICggaXNfZGlyKCAkdGVtcCApICYmIGlzX3dyaXRhYmxlKCAkdGVtcCApICkgewoJCXJldHVybiAkdGVtcDsKCX0KCQoJJHRlbXAgPSAnL3RtcC8nOwoJQG1rZGlyKCAkdGVtcCApOwoJcmV0dXJuICR0ZW1wOwp9CgoKZnVuY3Rpb24gd3BfdXBsb2FkX2RpcigpIHsKCXJldHVybiBhcnJheSggJ2Jhc2VkaXInID0+IEFCU1BBVEggKTsKfQoKCgpmdW5jdGlvbiB3cF9kaWUoICRtZXNzYWdlICkgewoJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgJ3dwX2RpZSgpIGNhbGxlZCB3aXRoIG1lc3NhZ2U6ICcgLiAkbWVzc2FnZSApOwoJZWNobyAkbWVzc2FnZTsKCWRpZSgpOwp9CgpmdW5jdGlvbiB3cF9sb2FkX3RyYW5zbGF0aW9uc19lYXJseSgpIHsKfQoKZnVuY3Rpb24gd3BfZGVidWdfYmFja3RyYWNlX3N1bW1hcnkoKSB7Cn0KCmlmICggIWRlZmluZWQoJ1dQX0RFQlVHJykgKQoJZGVmaW5lKCAnV1BfREVCVUcnLCBmYWxzZSApOwppZiAoICFkZWZpbmVkKCdXUF9ERUJVR19ESVNQTEFZJykgKQoJZGVmaW5lKCAnV1BfREVCVUdfRElTUExBWScsIHRydWUgKTsKaWYgKCAhZGVmaW5lZCgnV1BfREVCVUdfTE9HJykgKQoJZGVmaW5lKCdXUF9ERUJVR19MT0cnLCBmYWxzZSk7CmlmICggIWRlZmluZWQoJ1dQX0NBQ0hFJykgKQoJZGVmaW5lKCdXUF9DQUNIRScsIGZhbHNlKTsKCmZ1bmN0aW9uIGFkbWluX3VybCggJHZhbCApIHsKCXJldHVybiAnPycgLiAkdmFsOwp9CgoKPz4=
###PACKDATA,FILE_END,/pluginbuddy/standalone_preloader.php,importbuddy/pluginbuddy/standalone_preloader.php
###PACKDATA,FILE_START,/pluginbuddy/classes/core_controllers.php,importbuddy/pluginbuddy/classes/core_controllers.php
PD9waHAKCgoKCi8qCWNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2FjdGlvbnMKICoJCiAqCUhhbmRsZXMgYWN0aW9ucy4gQ3VycmVudGx5IGp1c3QgcmVwb3J0cyBpZiBhY3Rpb25zIHdlcmUgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9hY3Rpb25zY29yZSB7CgkKCQoJLyoJcGx1Z2luYnVkZHlfYWN0aW9uc2NvcmUtPl9fY2FsbCgpCgkgKgkKCSAqCU1hZ2ljIG1ldGhvZCBpZiBhIG1ldGhvZCBpcyBjYWxsZWQgdGhhdCBkb2VzIG5vdCBleGlzdC4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCQkJRnVuY3Rpb24gbmFtZS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRhcmd1bWVudHMJCUFycmF5IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gZnVuY3Rpb24uCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIF9fY2FsbCggJG5hbWUsICRhcmd1bWVudHMgKSB7CgkJZWNobyAne01pc3NpbmcgYWN0aW9ucyBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nOwoJfSAvLyBFbmQgX19jYWxsKCkuCgkKCQoJCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2FjdGlvbnMuCgoKCi8qCWNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2FqYXhjb3JlCiAqCQogKglIYW5kbGVzIGFqYXguIEN1cnJlbnRseSBqdXN0IHJlcG9ydHMgaWYgYWpheCB3YXMgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9hamF4Y29yZSB7CgkKCQoJLyoJcGx1Z2luYnVkZHlfc2hvcnRjb2Rlcy0+X19jYWxsKCkKCSAqCQoJICoJTWFnaWMgbWV0aG9kIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlGdW5jdGlvbiBuYW1lLgoJICoJQHBhcmFtCQlhcnJheQkJJGFyZ3VtZW50cwkJQXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbi4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gX19jYWxsKCAkbmFtZSwgJGFyZ3VtZW50cyApIHsKCQlkaWUoICd7TWlzc2luZyBhamF4IG1ldGhvZCBgJyAuICRuYW1lIC4gJ2AufScgKTsKCX0gLy8gRW5kIF9fY2FsbCgpLgoJCgkKfSAvLyBFbmQgY2xhc3MgcGJfYmFja3VwYnVkZHlfYWpheC4KCgoKLyoJY2xhc3MgcGJfYmFja3VwYnVkZHlfY3JvbmNvcmUKICoJCiAqCUhhbmRsZXMgY3JvbnMuIEN1cnJlbnRseSBqdXN0IHJlcG9ydHMgaWYgY3JvbnMgd2VyZSByZWdpc3RlcmVkIGFuZCBjYWxsZWQgYnV0IHRoZSBjYWxsYmFjayB3YXMgbWlzc2luZy4KICoJCiAqCUByZXR1cm4JCW51bGwKICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2Nyb25jb3JlIHsKCQoJCgkvKglwbHVnaW5idWRkeV9zaG9ydGNvZGVzLT5fX2NhbGwoKQoJICoJCgkgKglNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCUZ1bmN0aW9uIG5hbWUuCgkgKglAcGFyYW0JCWFycmF5CQkkYXJndW1lbnRzCQlBcnJheSBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGZ1bmN0aW9uLgoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiBfX2NhbGwoICRuYW1lLCAkYXJndW1lbnRzICkgewoJCWRpZSggJ3tNaXNzaW5nIGNyb24gbWV0aG9kIGAnIC4gJG5hbWUgLiAnYC59JyApOwoJfSAvLyBFbmQgX19jYWxsKCkuCgkKCQp9IC8vIEVuZCBjbGFzcyBwYl9iYWNrdXBidWRkeV9jcm9uLgoKCgovKgljbGFzcyBwYl9iYWNrdXBidWRkeV9kYXNoYm9hcmRjb3JlCiAqCQogKglIYW5kbGVzIGRhc2hib2FyZCB3aWRnZXRzIChvbiBtYWluIGFkbWluIHNjcmVlbikuIFJlcG9ydHMgaWYgYWRtaW4gZGFzaGJvYXJkIHdpZGdldHMgd2VyZSByZWdpc3RlcmVkIGFuZCBjYWxsZWQgYnV0IHRoZSBjYWxsYmFjayB3YXMgbWlzc2luZy4KICoJQWxzbyBoYW5kbGVzIHRoZSBhY3R1YWwgcmVnaXN0ZXJpbmcgb2YgdGhlIHdpZGdldHMuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9kYXNoYm9hcmRjb3JlIHsKCQoJCgkvKglwbHVnaW5idWRkeV9zaG9ydGNvZGVzLT5fX2NhbGwoKQoJICoJCgkgKglNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCUZ1bmN0aW9uIG5hbWUuCgkgKglAcGFyYW0JCWFycmF5CQkkYXJndW1lbnRzCQlBcnJheSBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIGZ1bmN0aW9uLgoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiBfX2NhbGwoICRuYW1lLCAkYXJndW1lbnRzICkgewoJCWRpZSggJ3tNaXNzaW5nIGRhc2hib2FyZCBtZXRob2QgYCcgLiAkbmFtZSAuICdgLn0nICk7Cgl9IC8vIEVuZCBfX2NhbGwoKS4KCQoJCgkvKglwbHVnaW5idWRkeV9kYXNoYm9hcmQtPnJlZ2lzdGVyX3dpZGdldHMoKQoJICoJCgkgKglDYWxsZWQgYmFjayBieSBXb3JkUHJlc3MgdG8gYWN0dWFsbHkgcmVnaXN0ZXIgdGhlIGRhc2hib2FyZCB3aWRnZXQgaW4gdGhlIGFkbWluLgoJICoJCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIHJlZ2lzdGVyX3dpZGdldHMoKSB7CgkJLy93cF9hZGRfZGFzaGJvYXJkX3dpZGdldCggJ3BiXycgLiBzZWxmOjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXycgLiAkdGFnLCAkdGl0bGUsICBhcnJheSggJnNlbGY6OiRfZGFzaGJvYXJkLCAkdGFnICkgKTsKCQlmb3JlYWNoICggcGJfYmFja3VwYnVkZHk6OiRfZGFzaGJvYXJkX3dpZGdldHMgYXMgJHdpZGdldCApIHsKCQkJCgkJCWlmICggJHdpZGdldFsnY2FwYWJpbGl0eSddID09ICdnb2Rtb2RlJyApIHsgLy8gZ29kbW9kZSBjYXBhYmlsdGl5LgoJCQkJaWYgKCBpc19tdWx0aXNpdGUoKSAmJiBiYWNrdXBidWRkeV9jb3JlOjppc19uZXR3b3JrX2FjdGl2YXRlZCgpICkgeyAvLyBJbiBhIG5ldHdvcmsgaW5zdGFsbGF0aW9uLgoJCQkJCWlmICggIWN1cnJlbnRfdXNlcl9jYW4oICdtYW5hZ2VfbmV0d29yaycgKSApIHsKCQkJCQkJY29udGludWU7IC8vIFNraXAgdGhpcyB3aWRnZXQuIEFjY2VzcyBkZW5pZWQgdG8gaXQuCgkJCQkJfQoJCQkJfSBlbHNlIHsgLy8gU3RhbmRhbG9uZQoJCQkJCWlmICggIWN1cnJlbnRfdXNlcl9jYW4oICdhY3RpdmF0ZV9wbHVnaW5zJyApICkgewoJCQkJCQljb250aW51ZTsgLy8gU2tpcCB0aGlzIHdpZGdldC4gQWNjZXNzIGRlbmllZCB0byBpdC4KCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7IC8vIFdQIGNhcGFiaWxpdHkuCgkJCQlpZiAoICFjdXJyZW50X3VzZXJfY2FuKCAkd2lkZ2V0WydjYXBhYmlsaXR5J10gKSApIHsKCQkJCQljb250aW51ZTsgLy8gU2tpcCB0aGlzIHdpZGdldC4gQWNjZXNzIGRlbmllZCB0byBpdC4KCQkJCX0KCQkJfQoJCQkKCQkJJHdpZGdldF9zbHVnID0gJ3BiXycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nIC4gJHdpZGdldFsndGFnJ107CgkJCXdwX2FkZF9kYXNoYm9hcmRfd2lkZ2V0KCAkd2lkZ2V0X3NsdWcsICR3aWRnZXRbJ3RpdGxlJ10sICBhcnJheSggJiR0aGlzLCAkd2lkZ2V0Wyd0YWcnXSApICk7CgoJCQkvLyBJZiBmb3JjZSB0b3AgaXMgZW5hYmxlZCB0aGVuIHdlIHdpbGwgYXR0ZW1wdCB0byBmb3JjZSB0aGUgd2lkZ2V0IHRvIHRoZSB0b3AgaWYgcG9zc2libGUuCgkJCWlmICggaXNzZXQoICR3aWRnZXRbJ2ZvcmNlX3RvcCddICkgJiYgKCAkd2lkZ2V0Wydmb3JjZV90b3AnXSA9PT0gdHJ1ZSApICkgewoJCQkJLy8gTm90ZTogT25seSB3b3JrcyBpZiB1c2VycyBoYXZlIG5ldmVyIHJlLWFycmFuZ2VkIHRoZWlyIGRhc2hib2FyZCB3aWRnZXRzLgoJCQkJZ2xvYmFsICR3cF9tZXRhX2JveGVzOwoJCQkJJG5vcm1hbF9kYXNoYm9hcmQgPSAkd3BfbWV0YV9ib3hlc1snZGFzaGJvYXJkJ11bJ25vcm1hbCddWydjb3JlJ107CgkJCQkkd2lkZ2V0X2JhY2t1cCA9IGFycmF5KCAkd2lkZ2V0X3NsdWcgPT4gJG5vcm1hbF9kYXNoYm9hcmRbJHdpZGdldF9zbHVnXSApOyAvLyBTYXZlIGNvcHkgb2Ygb3VyIHdpZGdldC4KCQkJCXVuc2V0KCAkbm9ybWFsX2Rhc2hib2FyZFskd2lkZ2V0X3NsdWddICk7IC8vIERlbGV0ZSBvdXIgd2lkZ2V0LgoJCQkJJHdwX21ldGFfYm94ZXNbJ2Rhc2hib2FyZCddWydub3JtYWwnXVsnY29yZSddID0gYXJyYXlfbWVyZ2UoICR3aWRnZXRfYmFja3VwLCAkbm9ybWFsX2Rhc2hib2FyZCApOyAvLyBNZXJnZSBvdXIgd2lkZ2V0IGludG8gdGhlIHRvcC4KCQkJfQoJCX0KCX0gLy8gRW5kIHJlZ2lzdGVyX3dpZGdldHMoKS4KCQoJCn0gLy8gRW5kIGNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2Rhc2hib2FyZC4KCgoKLyoJY2xhc3MgcGJfYmFja3VwYnVkZHlfZmlsdGVyc2NvcmUKICoJCiAqCUhhbmRsZXMgZmlsdGVycy4gQ3VycmVudGx5IGp1c3QgcmVwb3J0cyBpZiBmaWx0ZXJzIHdlcmUgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9maWx0ZXJzY29yZSB7CgkKCQoJLyoJcGx1Z2luYnVkZHlfc2hvcnRjb2Rlcy0+X19jYWxsKCkKCSAqCQoJICoJTWFnaWMgbWV0aG9kIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlGdW5jdGlvbiBuYW1lLgoJICoJQHBhcmFtCQlhcnJheQkJJGFyZ3VtZW50cwkJQXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbi4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gX19jYWxsKCAkbmFtZSwgJGFyZ3VtZW50cyApIHsKCQlyZXR1cm4gJ3tNaXNzaW5nIGZpbHRlcnMgbWV0aG9kIGAnIC4gJG5hbWUgLiAnYC59JzsKCX0gLy8gRW5kIF9fY2FsbCgpLgoJCgkKfSAvLyBFbmQgY2xhc3MgcGJfYmFja3VwYnVkZHlfZmlsdGVycy4KCgoKLyoJY2xhc3MgcGJfYmFja3VwYnVkZHlfcGFnZXNjb3JlCiAqCQogKglIYW5kbGVzIGFkbWluIHBhZ2VzLiBSZXBvcnRzIGlmIHBhZ2VzIHdlcmUgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqCUFsc28gcHJvdmlkZXMgbG9hZF9jb250cm9sbGVyKCkgZnVuY3Rpb24gZm9yIHBhZ2VzIHRvIGNhbGwgdG8gbG9hZCBhIGNvbnRyb2xsZXIgd2hpbGUgaW4gdGhlIGNvbnRyb2xsZXIuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9wYWdlc2NvcmUgewoJCgkKCS8qCXBsdWdpbmJ1ZGR5X3BhZ2VzLT5fX2NhbGwoKQoJICoJCgkgKglNYWdpYyBtZXRob2QgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHRoYXQgZG9lcyBub3QgZXhpc3QuCgkgKglBdHRlbXB0cyB0byBsb2FkIGEgY29udHJvbGxlciBwYWdlIG1hdGNoaW5nIHRoZSBtZXRob2QgbmFtZSBpZiBwb3NzaWJsZS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCQkJRnVuY3Rpb24gbmFtZS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRhcmd1bWVudHMJCUFycmF5IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gZnVuY3Rpb24uCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIF9fY2FsbCggJG5hbWUsICRhcmd1bWVudHMgKSB7CgkJJHBhZ2VfZmlsZSA9IHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9jb250cm9sbGVycy9wYWdlcy8nIC4gJG5hbWUgLiAnLnBocCc7CgkJaWYgKCAkbmFtZSA9PSAnZ2V0dGluZ19zdGFydGVkJyApIHsKCQkJJHBhZ2VfZmlsZSA9IHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9wbHVnaW5idWRkeS9fJyAuICRuYW1lIC4gJy5waHAnOwoJCX0KCQkKCQlpZiAoIGZpbGVfZXhpc3RzKCAkcGFnZV9maWxlICkgKSB7IC8vIExvYWQgZnJvbSAvY29udHJvbGxlcnMvcGFnZXMvUEFHRS5waHAgaWYgaXQgZXhpc3RzLgoJCQkKCQkJLy8gRGlzcGxheSBwYWdlLgoJCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdhZG1pbi5qcycsIHRydWUgKTsKCQkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhZG1pbi5jc3MnLCB0cnVlICk7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ3Rvb2x0aXAuanMnLCB0cnVlICk7CgkJCWVjaG8gJzxkaXYgY2xhc3M9IndyYXAiPic7CiAJCQlyZXF1aXJlX29uY2UoICRwYWdlX2ZpbGUgKTsKCQkJZWNobyAnPC9kaXY+JzsKCQkJCgkJCS8vZWNobyAnPGRpdiBpZD0iZm9vdGVyLXRoYW5reW91IiBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBjb2xvcjogIzc3NzsgbWFyZ2luLXJpZ2h0OiAyMXB4OyBtYXJnaW4tdG9wOiAyMHB4OyBtYXJnaW4tYm90dG9tOiAtMzRweDsiPlJ1bm5pbmcgQmFja3VwQnVkZHkgdicgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApIC4gJy48L2Rpdj4nOwoJCQkKCQl9IGVsc2UgeyAvLyBOb3QgZm91bmQKCQkJZWNobyAne01pc3NpbmcgcGFnZXMgbWV0aG9kIGAnIC4gJG5hbWUgLiAnYC59JzsKCQl9Cgl9IC8vIEVuZCBfX2NhbGwoKS4KCQoJCgkvKglwbHVnaW5idWRkeV9wYWdlcy0+bG9hZF9jb250cm9sbGVyKCkKCSAqCQoJICoJTG9hZCBhIGNvbnRyb2xsZXIgZnJvbSB3aXRoaW4gYSBwYWdlICh3aGljaCBpcyBsb2FkZWQgYnkgYSBjb250cm9sbGVyIGl0c2VsZikuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkcGFnZQkJTmFtZSBvZiB0aGUgcGFnZS4gTG9hZHMgcGFnZSBmcm9tIC9jb250cm9sbGVycy9wYWdlcy9OQU1FLnBocC4KCSAqCUByZXR1cm4JCQoJICovCglwdWJsaWMgZnVuY3Rpb24gbG9hZF9jb250cm9sbGVyKCAkcGFnZSApIHsKCQlpZiAoIGZpbGVfZXhpc3RzKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY29udHJvbGxlcnMvcGFnZXMvJyAuICRwYWdlIC4gJy5waHAnICkgKSB7CgkJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NvbnRyb2xsZXJzL3BhZ2VzLycgLiAkcGFnZSAuICcucGhwJyApOwoJCX0gZWxzZSB7CgkJCWVjaG8gJ3tFcnJvcjogVW5hYmxlIHRvIGxvYWQgcGFnZSBjb250cm9sbGVyIGAnIC4gJHBhZ2UgLiAnYDsgZmlsZSBub3QgZm91bmQufSc7CgkJfQoJfQoJCgkKCQp9IC8vIEVuZCBjbGFzcyBwYl9iYWNrdXBidWRkeV9wYWdlcy4KCgoKLyoJY2xhc3MgcGJfYmFja3VwYnVkZHlfc2hvcnRjb2Rlc2NvcmUKICoJCiAqCUhhbmRsZXMgc2hvcnRjb2Rlcy4gQ3VycmVudGx5IGp1c3QgcmVwb3J0cyBpZiBzaG9ydGNvZGVzIHdlcmUgcmVnaXN0ZXJlZCBhbmQgY2FsbGVkIGJ1dCB0aGUgY2FsbGJhY2sgd2FzIG1pc3NpbmcuCiAqCQogKglAcmV0dXJuCQludWxsCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9zaG9ydGNvZGVzY29yZSB7CgkKCQoJLyoJcGx1Z2luYnVkZHlfc2hvcnRjb2Rlcy0+X19jYWxsKCkKCSAqCQoJICoJTWFnaWMgbWV0aG9kIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB0aGF0IGRvZXMgbm90IGV4aXN0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlGdW5jdGlvbiBuYW1lLgoJICoJQHBhcmFtCQlhcnJheQkJJGFyZ3VtZW50cwkJQXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmdW5jdGlvbi4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gX19jYWxsKCAkbmFtZSwgJGFyZ3VtZW50cyApIHsKCQlyZXR1cm4gJ3tNaXNzaW5nIHNob3J0Y29kZXMgbWV0aG9kIGAnIC4gJG5hbWUgLiAnYC59JzsKCX0gLy8gRW5kIF9fY2FsbCgpLgoJCgkKfSAvLyBFbmQgY2xhc3MgcGJfYmFja3VwYnVkZHlfc2hvcnRjb2Rlcy4KCgo/Pgo=
###PACKDATA,FILE_END,/pluginbuddy/classes/core_controllers.php,importbuddy/pluginbuddy/classes/core_controllers.php
###PACKDATA,FILE_START,/pluginbuddy/classes/filesystem.php,importbuddy/pluginbuddy/classes/filesystem.php
PD9waHAKCgoKLyoJY2xhc3MgcGx1Z2luYnVkZHlfZmlsZXN5c3RlbQogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICoJCiAqCUhhbmRsZXMgaW50ZXJmYWNpbmcgd2l0aCB0aGUgZmlsZSBzeXN0ZW0uCiAqLwpjbGFzcyBwYl9iYWNrdXBidWRkeV9maWxlc3lzdGVtIHsKCQoJCgkKCS8vICoqKioqKioqKiogUFVCTElDIFBST1BFUlRJRVMgKioqKioqKioqKgoJCgkKCQoJLy8gKioqKioqKioqKiBQUklWQVRFIFBST1BFUlRJRVMgKioqKioqKioqKgoJCgkKCQoJLy8gKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZmlsZXN5c3RlbS0+X19jb25zdHJ1Y3QoKQoJICoJCgkgKglEZWZhdWx0IGNvbnN0cnVjdG9yLgoJICoJCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCWZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoJCQoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCQoJCgkKCS8qCXBiX2JhY2t1cGJ1ZGR5OjokZmlsZXN5c3RlbS0+bWtkaXIoKQoJICoJCgkgKglta2RpciB0aGF0IGRlZmF1bHRzIHRvIHJlY3Vyc2l2ZSBiZWhhdmlvdXIuIDk5JSBvZiB0aGUgdGltZSB0aGlzIGlzIHdoYXQgd2Ugd2FudC4KCSAqCQoJICoJQHBhcmFtCQkkcGF0aG5hbWUJCXN0cmluZwkJUGF0aCB0byBjcmVhdGUuCgkgKglAcGFyYW0JCSRtb2RlCQkJaW50CQkJRGVmYXVsdDogMDc3Ny4gU2VlIFBIUCdzIG1rZGlyKCkgZnVuY3Rpb24gZm9yIGRldGFpbHMuCgkgKglAcGFyYW0JCSRyZWN1cnNpdmUJCWJvb2xlYW4JCURlZmF1bHQ6IHRydWUuIFNlZSBQSFAncyBta2RpcigpIGZ1bmN0aW9uIGZvciBkZXRhaWxzLgoJICoJQHJldHVybgkJCQkJCWJvb2xlYW4JCVJldHVybnMgVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGZhaWx1cmUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWtkaXIoICRwYXRobmFtZSwgJG1vZGUgPSAwNzU1LCAkcmVjdXJzaXZlID0gdHJ1ZSkgewoJCXJldHVybiBAbWtkaXIoICRwYXRobmFtZSwgJG1vZGUsICRyZWN1cnNpdmUgKTsKCX0gLy8gRW5kIG1rZGlyKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9maWxlc3lzdGVtLT51bmxpbmtfcmVjdXJzaXZlKCkKCSAqCQoJICoJVW5saW5rIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LiBGaWxlcyBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGhpbi4gVVNFIFdJVEggQ0FVVElPTi4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRkaXIJCURpcmVjdG9yeSB0byBkZWxldGUgLS0gYWxsIGNvbnRlbnRzIHdpdGhpbiwgc3ViZGlyZWN0b3JpZXMsIGZpbGVzLCBldGMgd2lsbCBiZSBwZXJtYW5lbnRseSBkZWxldGVkLgoJICoJQHJldHVybgkJYm9vbGVhbgkJCQkJVHJ1ZSBvbiBzdWNjZXNzOyBlbHNlIGZhbHNlLgoJICovCglmdW5jdGlvbiB1bmxpbmtfcmVjdXJzaXZlKCAkZGlyICkgewoJCWlmICggZGVmaW5lZCggJ1BCX0RFTU9fTU9ERScgKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQkKCQlpZiAoICFmaWxlX2V4aXN0cyggJGRpciApICkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYgKCAhaXNfZGlyKCAkZGlyICkgfHwgaXNfbGluayggJGRpciApICkgewoJCQlyZXR1cm4gdW5saW5rKCRkaXIpOwoJCX0KCQlmb3JlYWNoICggc2NhbmRpciggJGRpciApIGFzICRpdGVtICkgewoJCQlpZiAoICRpdGVtID09ICcuJyB8fCAkaXRlbSA9PSAnLi4nICkgewoJCQkJY29udGludWU7CgkJCX0KCQkJaWYgKCAhJHRoaXMtPnVubGlua19yZWN1cnNpdmUoICRkaXIgLiAiLyIgLiAkaXRlbSApICkgewoJCQkJQGNobW9kKCAkZGlyIC4gIi8iIC4gJGl0ZW0sIDA3NzcgKTsKCQkJCWlmICggISR0aGlzLT51bmxpbmtfcmVjdXJzaXZlKCAkZGlyIC4gIi8iIC4gJGl0ZW0gKSApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIEBybWRpcigkZGlyKTsKCX0gLy8gRW5kIHVubGlua19yZWN1cnNpdmUoKS4KCQoJCgkKCS8qKgoJICoJcGx1Z2luYnVkZHlfZmlsZXN5c3RlbS0+ZGVlcGdsb2IoKQoJICoKCSAqCUxpa2UgdGhlIGdsb2IoKSBmdW5jdGlvbiBleGNlcHQgd2Fsa3MgZG93biBpbnRvIHBhdGhzIHRvIGNyZWF0ZSBhIGZ1bGwgbGlzdGluZyBvZiBhbGwgcmVzdWx0cyBpbiB0aGUgZGlyZWN0b3J5IGFuZCBhbGwgc3ViZGlyZWN0b3JpZXMuCgkgKglUaGlzIGlzIGVzc2VudGlhbGx5IGEgcmVjdXJzaXZlIGdsb2IoKSBhbHRob3VnaCBpdCBkb2VzIG5vdCB1c2UgcmVjdXJzaW9uIHRvIHBlcmZvcm0gdGhpcy4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJGRpcgkJUGF0aCB0byBwYXNzIHRvIGdsb2IgYW5kIHdhbGsgdGhyb3VnaC4KCSAqCUByZXR1cm4JCWFycmF5CQkJCQlSZXR1cm5zIGFycmF5IG9mIGFsbCBtYXRjaGVzIGZvdW5kLgoJICovCglmdW5jdGlvbiBkZWVwZ2xvYiggJGRpciApIHsKCQkkaXRlbXMgPSBnbG9iKCAkZGlyIC4gJy8qJyApOwoJCQoJCWZvciAoICRpID0gMDsgJGkgPCBjb3VudCggJGl0ZW1zICk7ICRpKysgKSB7CgkJCWlmICggaXNfZGlyKCAkaXRlbXNbJGldICkgKSB7CgkJCQkkYWRkID0gZ2xvYiggJGl0ZW1zWyRpXSAuICcvKicgKTsKCQkJCSRpdGVtcyA9IGFycmF5X21lcmdlKCAkaXRlbXMsICRhZGQgKTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gJGl0ZW1zOwoJfSAvLyBFbmQgZGVlcGdsb2IoKS4KCQoJCgkKCWZ1bmN0aW9uIHJlY3Vyc2l2ZV9jb3B5KCAkc3JjLCAkZHN0ICkgewoJCS8vcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29weWluZyBgJyAuICRzcmMgLiAnYCB0byBgJyAuICRkc3QgLiAnYC4nICk7CgkJaWYgKCBpc19kaXIoICRzcmMgKSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2RldGFpbHMnLCAnQ29weWluZyBkaXJlY3RvcnkgYCcgLiAkc3JjIC4gJ2AgdG8gYCcgLiAkZHN0IC4gJ2AgcmVjdXJzaXZlbHkuJyApOwoJCQlAJHRoaXMtPm1rZGlyKCAkZHN0LCAwNzc3ICk7CgkJCSRmaWxlcyA9IHNjYW5kaXIoJHNyYyk7CgkJCWZvcmVhY2ggKCAkZmlsZXMgYXMgJGZpbGUgKSB7CgkJCQlpZiAoJGZpbGUgIT0gIi4iICYmICRmaWxlICE9ICIuLiIpIHsKCQkJCQkkdGhpcy0+cmVjdXJzaXZlX2NvcHkoIiRzcmMvJGZpbGUiLCAiJGRzdC8kZmlsZSIpOwoJCQkJfQoJCQl9CgkJfSBlbHNlaWYgKCBmaWxlX2V4aXN0cyggJHNyYyApICkgewoJCQlAY29weSggJHNyYywgJGRzdCApOyAvLyBUb2RvOiBzaG91bGQgdGhpcyBuZWVkIHN1cHByZXNzaW9uPyBNZWRpYSBjb3B5aW5nIHdhcyB0aHJvd2luZyAkZHN0IGlzIGRpcmVjdG9yeSBlcnJvcnMuCgkJfQoJfQoJCgkKCS8vIFJIIGFkZGVkOyBmcm9tIENocmlzPwoJLyoKCQoJcHVibGljIGZ1bmN0aW9uIGN1c3RvbV9jb3B5KCAkc291cmNlLCAkZGVzdGluYXRpb24sICRhcmdzID0gYXJyYXkoKSApIHsKCQkkZGVmYXVsdF9hcmdzID0gYXJyYXkoCgkJCSdtYXhfZGVwdGgnICAgID0+IDEwMCwKCQkJJ2ZvbGRlcl9tb2RlJyAgPT4gMDc1NSwKCQkJJ2ZpbGVfbW9kZScgICAgPT4gMDc0NCwKCQkJJ2lnbm9yZV9maWxlcycgPT4gYXJyYXkoKSwKCQkpOwoJCSRhcmdzID0gYXJyYXlfbWVyZ2UoICRkZWZhdWx0X2FyZ3MsICRhcmdzICk7CgkJCgkJcmV0dXJuICR0aGlzLT5fY3VzdG9tX2NvcHkoICRzb3VyY2UsICRkZXN0aW5hdGlvbiwgJGFyZ3MgKTsKCX0gLy8gRW5kIGN1c3RvbV9jb3B5KCkuCgkKCQoJCglwcml2YXRlIGZ1bmN0aW9uIF9jdXN0b21fY29weSggJHNvdXJjZSwgJGRlc3RpbmF0aW9uLCAkYXJncywgJGRlcHRoID0gMCApIHsKCQlpZiAoICRkZXB0aCA+ICRhcmdzWydtYXhfZGVwdGgnXSApCgkJCXJldHVybiB0cnVlOwoJCQkKCQlpZiAoIGluX2FycmF5KCBiYXNlbmFtZSggJHNvdXJjZSApLCAkYXJnc1sgJ2lnbm9yZV9maWxlcycgXSApICkgcmV0dXJuIHRydWU7CgkJCgkJaWYgKCBpc19maWxlKCAkc291cmNlICkgKSB7CgkJCWlmICggaXNfZGlyKCAkZGVzdGluYXRpb24gKSB8fCBwcmVnX21hdGNoKCAnfC8kfCcsICRkZXN0aW5hdGlvbiApICkgewoJCQkJJGRlc3RpbmF0aW9uID0gcHJlZ19yZXBsYWNlKCAnfC8rJHwnLCAnJywgJGRlc3RpbmF0aW9uICk7CgkJCQkKCQkJCSRkZXN0aW5hdGlvbiA9ICIkZGVzdGluYXRpb24vIiAuIGJhc2VuYW1lKCAkc291cmNlICk7CgkJCX0KCQkJCgkJCWlmICggZmFsc2UgPT09ICR0aGlzLT5ta2RpciggZGlybmFtZSggJGRlc3RpbmF0aW9uICksICRhcmdzWydmb2xkZXJfbW9kZSddICkgKQoJCQkJcmV0dXJuIGZhbHNlOwoJCQkKCQkJaWYgKCBmYWxzZSA9PT0gQGNvcHkoICRzb3VyY2UsICRkZXN0aW5hdGlvbiApICkKCQkJCXJldHVybiBmYWxzZTsKCQkJCgkJCUBjaG1vZCggJGRlc3RpbmF0aW9uLCAkYXJnc1snZmlsZV9tb2RlJ10gKTsKCQkJCgkJCXJldHVybiB0cnVlOwoJCX0KCQllbHNlIGlmICggaXNfZGlyKCAkc291cmNlICkgfHwgcHJlZ19tYXRjaCggJ3wvXCokfCcsICRzb3VyY2UgKSApIHsKCQkJaWYgKCBwcmVnX21hdGNoKCAnfC9cKiR8JywgJHNvdXJjZSApICkKCQkJCSRzb3VyY2UgPSBwcmVnX3JlcGxhY2UoICd8L1wqJHwnLCAnJywgJHNvdXJjZSApOwoJCQllbHNlIGlmICggcHJlZ19tYXRjaCggJ3wvJHwnLCAkZGVzdGluYXRpb24gKSApCgkJCQkkZGVzdGluYXRpb24gPSAkZGVzdGluYXRpb24gLiBiYXNlbmFtZSggJHNvdXJjZSApOwoJCQkKCQkJJGRlc3RpbmF0aW9uID0gcHJlZ19yZXBsYWNlKCAnfC8kfCcsICcnLCAkZGVzdGluYXRpb24gKTsKCQkJCgkJCSRmaWxlcyA9IGFycmF5X2RpZmYoIGFycmF5X21lcmdlKCBnbG9iKCAkc291cmNlIC4gJy8uKicgKSwgZ2xvYiggJHNvdXJjZSAuICcvKicgKSApLCBhcnJheSggJHNvdXJjZSAuICcvLicsICRzb3VyY2UgLiAnLy4uJyApICk7CgkJCQoJCQlpZiAoIGZhbHNlID09PSBAbWtkaXIoICRkZXN0aW5hdGlvbiApICkKCQkJCXJldHVybiBmYWxzZTsKCQkJCgkJCSRyZXN1bHQgPSB0cnVlOwoJCQkKCQkJZm9yZWFjaCAoIChhcnJheSkgJGZpbGVzIGFzICRmaWxlICkgewoJCQkJaWYgKCBmYWxzZSA9PT0gJHRoaXMtPl9jdXN0b21fY29weSggJGZpbGUsICIkZGVzdGluYXRpb24vIiwgJGFyZ3MsICRkZXB0aCArIDEgKSApCgkJCQkJJHJlc3VsdCA9IGZhbHNlOwoJCQl9CgkJCQoJCQlyZXR1cm4gJHJlc3VsdDsKCQl9CgkJCgkJcmV0dXJuIGZhbHNlOwoJfSAvLyBFbmQgX2NvcHkoKS4KCQoJCgkqLwoKCQoJLy8gdG9kbzogZG9jdW1lbnQKCS8vICRleGNsdXNpb25zIGlzIG5ldmVyIG1vZGlmaWVkIHNvIGp1c3QgdXNlIFBIUCdzIGNvcHkgb24gbW9kaWZ5IGRlZmF1bHQgYmVoYXZpb3VyIGZvciBtZW1vcnkgbWFuYWdlbWVudC4KCS8qCWZ1bmN0aW9uX25hbWUoKQoJICoJCgkgKglmdW5jdGlvbiBkZXNjcmlwdGlvbgoJICoJQHBhcmFtCQlhcnJheS9ib29sCQlBcnJheSBvZiBkaXJlY3RvcnkgcGF0aHMgdG8gZXhjbHVkZS4gIElmIHRydWUgdGhlbiB0aGlzIGRpcmVjdG9yeSBpcyBleGNsdWRlZCBzbyBubyBuZWVkIHRvIGNoZWNrIHdpdGggZXhjbHVzaW9uIGRpcmVjdG9yeS4KCSAqCUByZXR1cm4JCWFycmF5CQkJYXJyYXkoIFRPVEFMX0RJUkVDVE9SWV9TSVpFLCBUT1RBTF9TSVpFX1dJVEhfRVhDTFVTSU9OU19UQUtFTl9JTlRPX0FDQ09VTlQsIE9CSkVDVFNfRk9VTkQsIE9CSkVDVFNfRk9VTkRfV0lUSF9FWENMVVNJT05TICkKCSAqLwoJZnVuY3Rpb24gZGlyX3NpemVfbWFwKCAkZGlyLCAkYmFzZSwgJGV4Y2x1c2lvbnMsICYkZGlyX2FycmF5ICkgewoJCSRkaXIgPSBydHJpbSggJGRpciwgJy9cXCcgKTsgLy8gRm9yY2Ugbm8gdHJhaWxpbmcgc2xhc2guCgkJCgkJaWYoICFpc19kaXIoICRkaXIgKSApIHsKCQkJcmV0dXJuIDA7CgkJfQoJCQoJCSRyZXQgPSAwOwoJCSRyZXRfd2l0aF9leGNsdXNpb25zID0gMDsKCQkkcmV0X29iamVjdHMgPSAwOwoJCSRyZXRfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnMgPSAwOwoJCSRleGNsdXNpb25zX3Jlc3VsdCA9ICRleGNsdXNpb25zOwoJCSRzdWIgPSBAb3BlbmRpciggJGRpciApOwoJCWlmICggZmFsc2UgPT09ICRzdWIgKSB7IC8vIENhbm5vdCBhY2Nlc3MuCgkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0Vycm9yICM1NjgzODU6IFVuYWJsZSB0byBhY2Nlc3MgZGlyZWN0b3J5OiBgJyAuICRkaXIgLiAnYC4gVmVyaWZ5IHByb3BlciBwZXJtaXNzaW9ucy4nLCB0cnVlICk7CgkJCXJldHVybiAwOwoJCX0gZWxzZSB7CgkJCXdoaWxlKCAkZmlsZSA9IHJlYWRkaXIoICRzdWIgKSApIHsKCQkJCSRleGNsdXNpb25zX3Jlc3VsdCA9ICRleGNsdXNpb25zOwoJCQkJCgkJCQkkZGlyX3BhdGggPSAnLycgLiBzdHJfcmVwbGFjZSggJGJhc2UsICcnLCAkZGlyIC4gJy8nIC4gJGZpbGUgKSAuICcvJzsgLy9zdHJfcmVwbGFjZSggJGJhc2UsICcnLCAkZGlyIC4gJGZpbGUgLiAnLycgKTsKCQkJCQoJCQkJaWYgKCAoICRmaWxlID09ICcuJyApIHx8ICggJGZpbGUgPT0gJy4uJyApICkgewoJCQkJCQoJCQkJCS8vIERvIG5vdGhpbmcuCgkJCQkJCgkJCQl9IGVsc2VpZiAoIGlzX2RpciggJGRpciAuICcvJyAuICRmaWxlICkgKSB7IC8vIERJUkVDVE9SWS4KCQkJCQkKCQkJCQlpZiAoICggJGV4Y2x1c2lvbnMgPT09IHRydWUgKSB8fCBzZWxmOjppbl9hcnJheV9zdWJzdHIoICRleGNsdXNpb25zLCAkZGlyX3BhdGgsICcvJyApICkgewoJCQkJCQkkZXhjbHVzaW9uc19yZXN1bHQgPSB0cnVlOwoJCQkJCX0KCQkJCQkkcmVzdWx0ID0gJHRoaXMtPmRpcl9zaXplX21hcCggJGRpciAuICcvJyAuICRmaWxlIC4gJy8nLCAkYmFzZSwgJGV4Y2x1c2lvbnMsICRkaXJfYXJyYXkgKTsKCQkJCQkkdGhpc19zaXplID0gJHJlc3VsdFswXTsKCQkJCQkkdGhpc19vYmplY3RzID0gJHJlc3VsdFsyXTsKCQkJCQkKCQkJCQlpZiAoICRleGNsdXNpb25zX3Jlc3VsdCA9PT0gdHJ1ZSApIHsgLy8gSWYgZXhjbHVkaW5nIHRoZW4gd2lwZSBleGNsdWRlZCB2YWx1ZS4KCQkJCQkJJHRoaXNfc2l6ZV93aXRoX2V4Y2x1c2lvbnMgPSBmYWxzZTsKCQkJCQkJJHRoaXNfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnMgPSAwOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSR0aGlzX3NpemVfd2l0aF9leGNsdXNpb25zID0gJHJlc3VsdFsxXTsgLy8gLyAxMDQ4NTc2ICk7CgkJCQkJCSR0aGlzX29iamVjdHNfd2l0aF9leGNsdXNpb25zID0gJHJlc3VsdFszXTsgLy8gLyAxMDQ4NTc2ICk7CgkJCQkJfQoJCQkJCQoJCQkJCSRkaXJfYXJyYXlbICRkaXJfcGF0aCBdID0gYXJyYXkoICR0aGlzX3NpemUsICR0aGlzX3NpemVfd2l0aF9leGNsdXNpb25zLCAkdGhpc19vYmplY3RzLCAkdGhpc19vYmplY3RzX3dpdGhfZXhjbHVzaW9ucyApOyAvLyAkZGlyX2FycmF5WyBESVJFQ1RPUllfUEFUSCBdID0gRElSRUNUT1JZX1NJWkU7CgkJCQkJCgkJCQkJJHJldCArPSAkdGhpc19zaXplOwoJCQkJCSRyZXRfb2JqZWN0cyArPSAkdGhpc19vYmplY3RzOwoJCQkJCSRyZXRfd2l0aF9leGNsdXNpb25zICs9ICR0aGlzX3NpemVfd2l0aF9leGNsdXNpb25zOwoJCQkJCSRyZXRfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnMgKz0gJHRoaXNfb2JqZWN0c193aXRoX2V4Y2x1c2lvbnM7CgkJCQkJCgkJCQkJdW5zZXQoICRmaWxlICk7CgkJCQkJCgkJCQl9IGVsc2UgeyAvLyBGSUxFLgoJCQkJCQoJCQkJCSRzdGF0cyA9IEBzdGF0KCAkZGlyIC4gJy8nIC4gJGZpbGUgKTsKCQkJCQlpZiAoIGlzX2FycmF5KCAkc3RhdHMgKSApIHsKCQkJCQkJJHJldCArPSAkc3RhdHNbJ3NpemUnXTsKCQkJCQkJJHJldF9vYmplY3RzKys7CgkJCQkJCWlmICggKCAkZXhjbHVzaW9ucyAhPT0gdHJ1ZSApICYmICFpbl9hcnJheSggJGRpcl9wYXRoLCAkZXhjbHVzaW9ucyApICkgeyAvLyBOb3QgZXhjbHVkaW5nLgoJCQkJCQkJJHJldF93aXRoX2V4Y2x1c2lvbnMgKz0gJHN0YXRzWydzaXplJ107CgkJCQkJCQkkcmV0X29iamVjdHNfd2l0aF9leGNsdXNpb25zKys7CgkJCQkJCX0KCQkJCQl9CgkJCQkJdW5zZXQoICRmaWxlICk7CgkJCQkJCgkJCQl9CgkJCX0KCQkJY2xvc2VkaXIoICRzdWIgKTsKCQkJdW5zZXQoICRzdWIgKTsKCQkJcmV0dXJuIGFycmF5KCAkcmV0LCAkcmV0X3dpdGhfZXhjbHVzaW9ucywgJHJldF9vYmplY3RzLCAkcmV0X29iamVjdHNfd2l0aF9leGNsdXNpb25zICk7CgkJfQoJfSAvLyBFbmQgZGlyX3NpemVfbWFwKCkuCgkKCQoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGluX2FycmF5X3N1YnN0ciggJGhheXN0YWNrLCAkbmVlZGxlLCAkdHJhaWxpbmcgPSAnJyApIHsKCQlmb3JlYWNoKCAkaGF5c3RhY2sgYXMgJGhheSApIHsKCQkJaWYgKCAoICRoYXkgLiAkdHJhaWxpbmcgKSA9PSBzdWJzdHIoICRuZWVkbGUgLiAkdHJhaWxpbmcsIDAsIHN0cmxlbiggJGhheSAuICR0cmFpbGluZyApICkgKSB7CgkJCQkvL2VjaG8gJG5lZWRsZSAuICd+JyAuICRoYXkgLiAnPGJyPic7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCQoJcHVibGljIGZ1bmN0aW9uIGV4aXRfY29kZV9sb29rdXAoICRjb2RlICkgewoJCXN3aXRjaCggKHN0cmluZykkY29kZSApIHsKCQkJY2FzZSAnMCc6CgkJCQlyZXR1cm4gJ0NvbW1hbmQgY29tcGxldGVkICYgcmV0dXJuZWQgbm9ybWFsbHkuJzsKCQkJCWJyZWFrOwoJCQljYXNlICcxMjYnOgoJCQkJcmV0dXJuICdDb21tYW5kIGludm9rZWQgY2Fubm90IGV4ZWN1dGUuIENoZWNrIGNvbW1hbmQgaGFzIHZhbGlkIHBlcm1pc2lvbnMgYW5kIGV4ZWN1dGUgY2FwYWJpbGl0eS4nOwoJCQkJYnJlYWs7CgkJCWNhc2UgJzEyNyc6CgkJCQlyZXR1cm4gJ0NvbW1hbmQgbm90IGZvdW5kLic7CgkJCQlicmVhazsKCQkJY2FzZSAnMTUyJzoKCQkJCXJldHVybiAnU0lHWENQVSAxNTI7IENQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkLic7CgkJCQlicmVhazsKCQkJY2FzZSAnMTUzJzoKCQkJCXJldHVybiAnU0lHWEZTWiAxNTM7IEZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZC4gVmVyaWZ5IGVub3VnaCBmcmVlIHNwYWNlIGV4aXN0cyAmIGZpbGVzeXN0ZW0gbWF4IHNpemUgbm90IGV4Y2VlZGVkLic7CgkJCQlicmVhazsKCQkJY2FzZSAnMTU4JzoKCQkJCXJldHVybiAnU0lHWENQVSAxNTg7IENQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkLic7CgkJCQlicmVhazsKCQkJY2FzZSAnMTU5JzoKCQkJCXJldHVybiAnU0lHWEZTWiAxNTk7IEZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZC4gVmVyaWZ5IGVub3VnaCBmcmVlIHNwYWNlIGV4aXN0cyAmIGZpbGVzeXN0ZW0gbWF4IHNpemUgbm90IGV4Y2VlZGVkLic7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiAnLU5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmb3IgdGhpcyBleGl0IGNvZGUtIFNlZTogaHR0cHM6Ly93aWtpLm5jc2EuaWxsaW5vaXMuZWR1L2Rpc3BsYXkvTVJEUFVCL0JhdGNoK0V4aXQrQ29kZXMgJzsKCQkJCWJyZWFrOwoJCX0KCX0KCQoJLy8gTmV3ZXN0IHRvIG9sZGVzdC4KCWZ1bmN0aW9uIGdsb2JfYnlfZGF0ZSggJHBhdHRlcm4gKSB7CgkJJGZpbGVfYXJyYXkgPSBhcnJheSgpOwoJCSRnbG9iX3Jlc3VsdCA9IGdsb2IoICRwYXR0ZXJuICk7CgkJaWYgKCAhIGlzX2FycmF5KCAkZ2xvYl9yZXN1bHQgKSApIHsKCQkJJGdsb2JfcmVzdWx0ID0gYXJyYXkoKTsKCQl9CgkJZm9yZWFjaCAoICRnbG9iX3Jlc3VsdCBhcyAkZmlsZW5hbWUgKSB7CgkJCSRjdGltZSA9IGZpbGVjdGltZSggJGZpbGVuYW1lICk7CgkJCXdoaWxlKCBpc3NldCggJGZpbGVfYXJyYXlbJGN0aW1lXSApICkgeyAvLyBBdm9pZCBjb2xsaXNpb25zLgoJCQkJJGN0aW1lID0gJGN0aW1lICsgMC4xOwoJCQl9CgkJCSRmaWxlX2FycmF5WyRjdGltZV0gPSAkZmlsZW5hbWU7IC8vIG9yIGp1c3QgJGZpbGVuYW1lCgkJfQoJCWtyc29ydCggJGZpbGVfYXJyYXkgKTsKCQlyZXR1cm4gJGZpbGVfYXJyYXk7CgkJCgl9IC8vIEVuZCBnbG9iX2J5X2RhdGUoKS4KCQoJCn0gLy8gRW5kIGNsYXNzIHBsdWdpbmJ1ZGR5X3NldHRpbmdzLgoKCgo/Pg==
###PACKDATA,FILE_END,/pluginbuddy/classes/filesystem.php,importbuddy/pluginbuddy/classes/filesystem.php
###PACKDATA,FILE_START,/pluginbuddy/classes/form.php,importbuddy/pluginbuddy/classes/form.php
PD9waHAKCgovKglwbHVnaW5idWRkeSBjbGFzcwogKgkKICoJRm9ybSBmcmFtZXdvcmsgZm9yIGhhbmRsaW5nIGFsbCBmb3JtcywgdmFsaWRhdGlvbiwgYW5kIHRoZWlyIGRpc3BsYXkuCiAqCQogKglAYXV0aG9yIER1c3RpbiBCb2x0b24KICovCmNsYXNzIHBiX2JhY2t1cGJ1ZGR5X2Zvcm0gewoJCgkKCQoJLy8gKioqKioqKioqKiBQVUJMSUMgUFJPUEVSVElFUyAqKioqKioqKioqCgkKCQoJCgkvLyAqKioqKioqKioqIFBSSVZBVEUgUFJPUEVSVElFUyAqKioqKioqKioqCgkKCQoJCglwcml2YXRlICRfZm9ybV9uYW1lID0gJyc7Cglwcml2YXRlICRfc2F2ZV9wb2ludCA9ICcnOwoJcHJpdmF0ZSAkX2lucHV0cyA9IGFycmF5KCk7Cglwcml2YXRlICRfcHJlZml4ID0gJ0RFRkFVTFQnOwoJcHJpdmF0ZSAkX3N0YXJ0ZWQgPSBmYWxzZTsKCXByaXZhdGUgJF9lbmRlZCA9IGZhbHNlOwoJcHJpdmF0ZSAkX2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nID0gJyc7Cglwcml2YXRlICRfbG9hZGVkX2NvbG9yID0gZmFsc2U7CgkKCQoJCgkvLyAqKioqKioqKioqIEZVTkNUSU9OUyAqKioqKioqKioqCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5fY29uc3RydWN0KCkKCSAqCQoJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU2V0cyB1cCB0aGUgZm9ybS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRmb3JtX25hbWUJCQkJCU5hbWUgLyBzbHVnIG9mIHRoZSBmb3JtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRzYXZlX3BvaW50CQkJCQlTYXZlIHBvaW50IHRvIHNhdmUgZm9ybTsgQ3VycmVudGx5IG9ubHkgdXNlZCBmb3Igc2V0dGluZ3MgZm9ybS4gQHNlZSBwbHVnaW5idWRkeV9zZXR0aW5ncy0+X19jb25zdHJ1Y3QoKS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkYWRkaXRpb25hbF9xdWVyeV9zdHJpbmcJQWRkaXRpb25hbCBxdWVyeXN0cmluZyB0byBhcHBlbmQgdG8gZW5kIG9mIGZvcm0gYWN0aW9uIFVSTC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoICRmb3JtX25hbWUsICRzYXZlX3BvaW50ID0gJycsICRhZGRpdGlvbmFsX3F1ZXJ5X3N0cmluZyA9ICcnICkgewoJCSR0aGlzLT5fZm9ybV9uYW1lID0gJGZvcm1fbmFtZTsKCQkkdGhpcy0+X3NhdmVfcG9pbnQgPSAkc2F2ZV9wb2ludDsKCQkkdGhpcy0+X2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nID0gJGFkZGl0aW9uYWxfcXVlcnlfc3RyaW5nOwoJCSR0aGlzLT5fcHJlZml4ID0gJ3BiXycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nOwoJfSAvLyBFbmQgX19jb25zdHJ1Y3QoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnRleHQoKQoJICoJCgkgKglBZGQgYSB0ZXh0IGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRleHQoICRuYW1lLCAkdmFsdWUsICRydWxlcyA9ICcnICkgewoJCSR0aGlzLT5faW5wdXRzWyRuYW1lXSA9IGFycmF5KAoJCQkndHlwZScgID0+IF9fRlVOQ1RJT05fXywKCQkJJ3ZhbHVlJyAgPT4gJHZhbHVlLAoJCQkncnVsZXMnICA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIHRleHQoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnBsYWludGV4dCgpCgkgKgkKCSAqCUFkZCBhIHRleHQgaW5wdXQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwbGFpbnRleHQoICRuYW1lLCAkdmFsdWUgKSB7CgkJJHRoaXMtPl9pbnB1dHNbJG5hbWVdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQkndmFsdWUnICA9PiAkdmFsdWUsCgkJKTsKCX0gLy8gRW5kIHRleHQoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPmNvbG9yKCkKCSAqCQoJICoJQWRkIGEgY29sb3IgaW5wdXQ7IHRoaXMgaXMgYSB0ZXh0IGlucHV0IHRoYXQgaGFzIGEgY29sb3Igc2VsZWN0b3IuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gY29sb3IoICRuYW1lLCAkdmFsdWUsICRydWxlcyA9ICcnICkgewoJCSR0aGlzLT5faW5wdXRzWyRuYW1lXSA9IGFycmF5KAoJCQkndHlwZScgID0+IF9fRlVOQ1RJT05fXywKCQkJJ3ZhbHVlJyAgPT4gJHZhbHVlLAoJCQkncnVsZXMnICA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIGNvbG9yKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5oaWRkZW4oKQoJICoJCgkgKglBZGQgYSBoaWRkZW4gaW5wdXQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gaGlkZGVuKCAkbmFtZSwgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCBoaWRkZW4oKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnd5c2l3eWcoKQoJICoJCgkgKglBZGRzIGEgdGV4dCBib3ggd3lzaXd5Zy4KCSAqCUBzZWUgd3BfZWRpdG9yKCkgaW4gV29yZFByZXNzIGNvcmUuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHBhcmFtCQlhcnJheQkJJHNldHRpbmdzCQlXb3JkUHJlc3Mgc2V0dGluZ3MgYXJyYXkgdG8gcGFzcyB0byB3cF9lZGl0b3IoKS4gQHNlZSB3cF9lZGl0b3IoKS4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHd5c2l3eWcoICRuYW1lLCAkdmFsdWUsICRydWxlcyA9ICcnLCAkc2V0dGluZ3MgKSB7CgkJJHRoaXMtPl9pbnB1dHNbJG5hbWVdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQkndmFsdWUnICA9PiAkdmFsdWUsCgkJCSdydWxlcycgID0+ICRydWxlcywKCQkJJ3NldHRpbmdzJyAgPT4gJHNldHRpbmdzLAoJCSk7Cgl9IC8vIEVuZCB3eXNpd3lnKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT50ZXh0YXJlYSgpCgkgKgkKCSAqCUFkZCBhIHRleHRhcmVhIGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRleHRhcmVhKCAkbmFtZSwgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCB0ZXh0YXJlYSgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybS0+c2VsZWN0KCkKCSAqCQoJICoJQWRkIGEgc2VsZWN0IGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCWFycmF5CQkkb3B0aW9ucwkJQXJyYXkgb2Ygb3B0aW9ucyBmb3IgdGhlIGRyb3Bkb3duLiAgVGhlIGtleSBpcyB0aGUgc2x1ZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBwcmV0dHkgdXNlci1kaXNwbGF5ZWQgcGFydC4gPG9wdGlvbiB2YWx1ZT0iYXJyYXlfa2V5Ij5hcnJheV92YWx1ZTwvb3B0aW9uPi4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2VsZWN0KCAkbmFtZSwgJG9wdGlvbnMsICR2YWx1ZSwgJHJ1bGVzID0gJycgKSB7CgkJJHRoaXMtPl9pbnB1dHNbJG5hbWVdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQknb3B0aW9ucycgPT4gJG9wdGlvbnMsCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCBzZWxlY3QoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnJhZGlvKCkKCSAqCQoJICoJQWRkIGEgcmFkaW8gaW5wdXQuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRvcHRpb25zCQlBcnJheSBvZiBvcHRpb25zIGZvciB0aGUgcmFkaW8gaW5wdXRzLiAgVGhlIGtleSBpcyB0aGUgc2x1ZyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBwcmV0dHkgdXNlci1kaXNwbGF5ZWQgcGFydC4gPGlucHV0IHR5cGU9InJhZGlvIiB2YWx1ZT0iYXJyYXlfa2V5Ij5hcnJheV92YWx1ZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gcmFkaW8oICRuYW1lLCAkb3B0aW9ucywgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSdvcHRpb25zJyA9PiAkb3B0aW9ucywKCQkJJ3ZhbHVlJyAgPT4gJHZhbHVlLAoJCQkncnVsZXMnICA9PiAkcnVsZXMsCgkJKTsKCX0gLy8gRW5kIHJhZGlvKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT50aXRsZSgpCgkgKgkKCSAqCUFkZCBhIHJhZGlvIGlucHV0LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHRpdGxlKCAkbmFtZSwgJHZhbHVlLCAkcnVsZXMgPSAnJyApIHsKCQkkdGhpcy0+X2lucHV0c1skbmFtZV0gPSBhcnJheSgKCQkJJ3R5cGUnICA9PiBfX0ZVTkNUSU9OX18sCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCByYWRpbygpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybS0+Y2hlY2tib3goKQoJICoJCgkgKglBZGQgYSBjaGVja2JveCBpbnB1dC4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCQkJTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlhcnJheQkJJG9wdGlvbnMJCUFycmF5IGZvcm1hdDogYXJyYXkoICd1bmNoZWNrZWQnID0+ICd1bmNoZWNrZWRfdmFsdWUnLCAnY2hlY2tlZCcgPT4gJ2NoZWNrZWRfdmFsdWUnICk7CgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGNoZWNrYm94KCAkbmFtZSwgJG9wdGlvbnMsICR2YWx1ZSwgJHJ1bGVzID0gJycgKSB7CgkJJHRoaXMtPl9pbnB1dHNbJG5hbWVdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQknb3B0aW9ucycgPT4gJG9wdGlvbnMsCgkJCSd2YWx1ZScgID0+ICR2YWx1ZSwKCQkJJ3J1bGVzJyAgPT4gJHJ1bGVzLAoJCSk7Cgl9IC8vIEVuZCBjaGVja2JveCgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybS0+cGFzc3dvcmQoKQoJICoJCgkgKglBZGQgYSBwYXNzd29yZCBpbnB1dC4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCQkJTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSR2YWx1ZQkJCVZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcnVsZXMJCQkob3B0aW9uYWwpIFJ1bGVzIHRvIHZhbGlkYXRlIHRoaXMgZm9ybSBpdGVtIGFnYWluc3QuCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwYXNzd29yZCggJG5hbWUsICR2YWx1ZSwgJHJ1bGVzID0gJycgKSB7CgkJJHRoaXMtPl9pbnB1dHNbJG5hbWVdID0gYXJyYXkoCgkJCSd0eXBlJyAgPT4gX19GVU5DVElPTl9fLAoJCQkndmFsdWUnICA9PiAkdmFsdWUsCgkJCSdydWxlcycgID0+ICRydWxlcywKCQkpOwoJfSAvLyBFbmQgcGFzc3dvcmQoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPnN1Ym1pdCgpCgkgKgkKCSAqCUFkZCBhIHN1Ym1pdCBpbnB1dC4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCQkJTmFtZSAvIHNsdWcgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSR2YWx1ZQkJCVZhbHVlIGZvciB0aGlzIGZvcm0gaXRlbS4gVGhpcyBpcyB0aGUgdGV4dCBpbiB0aGUgZGlzcGxheWVkIGJ1dHRvbi4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN1Ym1pdCggJG5hbWUsICR2YWx1ZSA9ICcnICkgewoJCSR0aGlzLT5faW5wdXRzWyRuYW1lXSA9IGFycmF5KAoJCQkndHlwZScJPT4JX19GVU5DVElPTl9fLAoJCQkndmFsdWUnCT0+CSR2YWx1ZSwKCQkpOwoJfSAvLyBFbmQgc3VibWl0KCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5zdGFydCgpCgkgKgkKCSAqCVN0YXJ0cyB0aGUgZm9ybSBvdXRwdXQuICBBdXRvbWF0aWNhbGx5IHJ1bnMgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMgc28gdXN1YWxseSBzaG91bGQgbm90IG5lZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0YXJ0KCkgewoJCSR0aGlzLT5fc3RhcnRlZCA9IHRydWU7CgkJCgkJaWYgKCBmYWxzZSAhPT0gc3RyaXN0ciggJHRoaXMtPl9hZGRpdGlvbmFsX3F1ZXJ5X3N0cmluZywgJ2h0dHAnICkgKSB7CgkJCSRhY3Rpb25fdXJsID0gJHRoaXMtPl9hZGRpdGlvbmFsX3F1ZXJ5X3N0cmluZzsKCQl9IGVsc2UgewoJCQkKCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAhPSAnJyApIHsKCQkJCSRhY3Rpb25fdXJsID0gcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCkgLiAnJicgLiAkdGhpcy0+X2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nOwoJCQl9IGVsc2UgewoJCQkJJGFjdGlvbl91cmwgPSAnPycgLiAkdGhpcy0+X2FkZGl0aW9uYWxfcXVlcnlfc3RyaW5nOwoJCQl9CgkJCQoJCX0KCQkKCQkkcmV0dXJuID0gJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSInIC4gJGFjdGlvbl91cmwgLiAnIiBjbGFzcz0icGJfZm9ybSIgaWQ9IicgLiAkdGhpcy0+X3ByZWZpeCAuICR0aGlzLT5fZm9ybV9uYW1lIC4gJ19mb3JtIj4nOwoJCSRyZXR1cm4gLj0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicgLiAkdGhpcy0+X3ByZWZpeCAuICciIHZhbHVlPSInIC4gJHRoaXMtPl9mb3JtX25hbWUgLiAnIj4nOwoJCXJldHVybiAkcmV0dXJuOwoJfSAvLyBFbmQgc3RhcnQoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm0tPmVuZCgpCgkgKgkKCSAqCUVuZHMgdGhlIGZvcm0gc2V0dGluZyBub25jZSBhbmQgY2xvc2luZyA8L2Zvcm0+LiBOT1QgYXV0b21hdGljYWxseSBydW4gZXhjZXB0IGluIHBsdWdpbmJ1ZGR5X3NldHRpbmdzIGNsYXNzLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVuZCggJGVjaG8gPSBmYWxzZSApIHsKCQkkdGhpcy0+X2VuZGVkID0gdHJ1ZTsKCgkJLy8gVE9ETzogZmllbGRzIG1heWJlPwoJCS8vJHJldHVybiA9IHBiX2JhY2t1cGJ1ZGR5Ojpub25jZSggJHRoaXMtPl9mb3JtX25hbWUgKTsKCQkkcmV0dXJuID0gcGJfYmFja3VwYnVkZHk6Om5vbmNlKCBmYWxzZSApOyAvLyBEbyBub3QgZWNoby4KCQkkcmV0dXJuIC49ICc8L2Zvcm0+JzsKCQkKCQlpZiAoICRlY2hvID09PSB0cnVlICkgewoJCQllY2hvICRyZXR1cm47CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXR1cm47CgkJfQoJfSAvLyBFbmQgZW5kKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5kaXNwbGF5KCkKCSAqCQoJICoJRGlzcGxheXMgKGVjaG9zKSBhIGZvcm0gaXRlbSBhbmQgYWxsIGl0cyBjb2RlL0hUTUwuCgkgKglAc2VlIHBsdWdpbmJ1ZGR5X2Zvcm0tPmdldCgpLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJG5hbWUJCQlOYW1lIC8gc2x1ZyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgZm9yIHRoaXMgZm9ybSBpdGVtLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRydWxlcwkJCShvcHRpb25hbCkgUnVsZXMgdG8gdmFsaWRhdGUgdGhpcyBmb3JtIGl0ZW0gYWdhaW5zdC4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRpc3BsYXkoICRuYW1lLCAkY3NzID0gJycgKSB7CgkJZWNobyAkdGhpcy0+Z2V0KCAkbmFtZSwgJGNzcyApOwoJfSAvLyBFbmQgZGlzcGxheSgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybS0+Z2V0KCkKCSAqCQoJICoJUmV0dXJucyBhIGZvcm0gaXRlbSBhbmQgYWxsIGl0cyBjb2RlL0hUTUwuCgkgKglMZWZ0IGNvbHVtbiBpcyBoaWRkZW4gaWYgYW4gb2JqZWN0J3MgdGl0bGUgPSAnJy4KCSAqCXRpdGxlIG9iamVjdCB0eXBlIGNvbHNwYW5zIDIuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkY3NzCQkJQWRkaXRpb25hbCBDU1MgdG8gYXBwbHkgdG8gZm9ybSBpdGVtLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQkJQWxsIEhUTUwsIGV0YyBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXQoICRuYW1lLCAkY3NzID0gJycsICRjbGFzc2VzID0gJycsICRvcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJyApIHsKCQlpZiAoICR0aGlzLT5fZW5kZWQgPT09IHRydWUgKSB7IC8vIEZvcm0gYWxyZWFkeSBjbG9zZWQgYW5kIGVuZGVkLiBGYXRhbCBwcm9ibGVtLgoJCQlyZXR1cm4gJ3tFcnJvcjogRm9ybSBhbHJlYWR5IGNsb3NlZCB3aXRoIGVuZCBmdW5jdGlvbiBzbyBjYW5ub3QgYWRkIG1vcmUgZmllbGRzLiBPbmx5IGVuZCBpbiB2aWV3IGFmdGVyIGFsbCBkaXNwbGF5cyBhcmUgZG9uZS59JzsKCQl9CgkJCgkJaWYgKCBpc3NldCggJHRoaXMtPl9pbnB1dHNbJG5hbWVdICkgKSB7CgkJCSRwcmVmaXggPSAkdGhpcy0+X3ByZWZpeDsKCQkJCgkJCWlmICggJHRoaXMtPl9zdGFydGVkID09PSBmYWxzZSApIHsgLy8gRm9ybSBvdXRwdXQgaGFzIG5vdCBzdGFydGVkLiBTdGFydCBpdC4KCQkJCSRyZXR1cm4gPSAkdGhpcy0+c3RhcnQoKTsKCQkJfSBlbHNlIHsKCQkJCSRyZXR1cm4gPSAnJzsKCQkJfQoJCQkKCQkJJGlucHV0ID0gJiR0aGlzLT5faW5wdXRzWyRuYW1lXTsKCQkJCgkJCWlmICggJGNzcyAhPSAnJyApIHsKCQkJCSRjc3MgPSAnIHN0eWxlPSInIC4gJGNzcyAuICciJzsKCQkJfQoJCQkKCQkJCgkJCS8qKioqKioqKioqIFRFWFQgKioqKioqKioqKi8KCQkJaWYgKCAkaW5wdXRbJ3R5cGUnXSA9PSAndGV4dCcgKSB7CgkJCQkKCQkJCQoJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSInIC4gJGNsYXNzZXMgLiAnIiBuYW1lPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyIgdmFsdWU9IicgLiAkaW5wdXRbJ3ZhbHVlJ10gLiAnIiBpZD0iJyAuICRwcmVmaXggLiBzdHJfcmVwbGFjZSggJyMnLCAnX18nLCAkbmFtZSApIC4gJyInIC4gJGNzcyAuICc+JzsKCQkJCQoJCQkJCgkJCS8qKioqKioqKioqIFBMQUlOVEVYVCAqKioqKioqKioqLwoJCQl9IGVsc2VpZiAoICRpbnB1dFsndHlwZSddID09ICdwbGFpbnRleHQnICkgewoJCQkJCgkJCQkKCQkJCSRyZXR1cm4gLj0gJzxzcGFuIGNsYXNzPSInIC4gJGNsYXNzZXMgLiAnIiAnIC4gJGNzcyAuICc+JyAuICRpbnB1dFsndmFsdWUnXSAuICc8L3NwYW4+JzsKCQkJCQoJCQkJCgkJCS8qKioqKioqKioqIENPTE9SICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ2NvbG9yJyApIHsKCQkJCQoJCQkJLy8gVE9ETzogdGhpcyBhY3R1YWxseSBzaG91bGQgb25seSBydW4gb25jZSBwZXIgUEFHRSBsb2FkLiBhZGQgYSBmdW5jdGlvbiBpc19zY3JpcHQgYW5kIGlzX3N0eWxlIGludG8gZnJhbWV3b3JrIHRvIHNlZSBpZiBsb2FkZWQgaW50byBmcmFtZXdvcmsgeWV0IG9yIG5vdC4KCQkJCWlmICggJHRoaXMtPl9sb2FkZWRfY29sb3IgPT09IGZhbHNlICkgeyAvLyBPbmx5IGxvYWQgdGhlIGphdmFzY3JpcHQsIENTUywgZXRjIG9uY2UgcGVyIGluc3RhbmNlLgoJCQkJCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2pxdWVyeS5taW5pQ29sb3JzLm1pbi5qcycsIHRydWUgKTsKCQkJCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ2pxdWVyeS5taW5pQ29sb3JzLmNzcycsIHRydWUgKTsKCQkJCQllY2hvICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJCQkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoIGZ1bmN0aW9uKCkgewoJCQkJCQlqUXVlcnkoICIucGJfY29sb3JwaWNrZXIiICkubWluaUNvbG9ycyh7IGxldHRlckNhc2U6ICJ1cHBlcmNhc2UiIH0pOwoJCQkJCQl9KTsKCQkJCQk8L3NjcmlwdD4KCQkJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJCQkJCQkubWluaUNvbG9ycy10cmlnZ2VyIHsKCQkJCQkJCWJhY2tncm91bmQ6IHVybCggJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9taW5pY29sb3JzL3RyaWdnZXIucG5nICkgY2VudGVyIG5vLXJlcGVhdDsKCQkJCQkJfQoJCQkJCQkubWluaUNvbG9ycy1jb2xvcnMgewoJCQkJCQkJYmFja2dyb3VuZDogdXJsKCAnIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvcGx1Z2luYnVkZHkvaW1hZ2VzL21pbmljb2xvcnMvZ3JhZGllbnQucG5nICkgY2VudGVyIG5vLXJlcGVhdDsKCQkJCQkJfQoJCQkJCQkubWluaUNvbG9ycy1odWVzIHsKCQkJCQkJCWJhY2tncm91bmQ6IHVybCggJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL3BsdWdpbmJ1ZGR5L2ltYWdlcy9taW5pY29sb3JzL3JhaW5ib3cucG5nICkgY2VudGVyIG5vLXJlcGVhdDsKCQkJCQkJfQoJCQkJCQkubWluaUNvbG9ycy1jb2xvclBpY2tlciB7CgkJCQkJCQliYWNrZ3JvdW5kOiB1cmwoICcgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9wbHVnaW5idWRkeS9pbWFnZXMvbWluaWNvbG9ycy9jaXJjbGUuZ2lmICkgY2VudGVyIG5vLXJlcGVhdDsKCQkJCQkJfQoJCQkJCQkubWluaUNvbG9ycy1odWVQaWNrZXIgewoJCQkJCQkJYmFja2dyb3VuZDogdXJsKCAnIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvcGx1Z2luYnVkZHkvaW1hZ2VzL21pbmljb2xvcnMvbGluZS5naWYgKSBjZW50ZXIgbm8tcmVwZWF0OwoJCQkJCQl9CgkJCQkJPC9zdHlsZT4nOwoJCQkJCSR0aGlzLT5fbG9hZGVkX2NvbG9yID0gdHJ1ZTsKCQkJCX0KCQkJCQoJCQkJaWYgKCAkY3NzID09ICcnICkgeyAvLyBkZWZhdWx0IHdpZHRoLgoJCQkJCSRjc3MgPSAnIHN0eWxlPSJ3aWR0aDogNjBweDsiJzsKCQkJCX0KCQkJCQoJCQkJJHJldHVybiAuPSAnPGlucHV0IGNsYXNzPSJwYl9jb2xvcnBpY2tlciAnIC4gJGNsYXNzZXMgLiAnIiB0eXBlPSJ0ZXh0IiBuYW1lPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyIgdmFsdWU9IicgLiAkaW5wdXRbJ3ZhbHVlJ10gLiAnIiBpZD0iJyAuICRwcmVmaXggLiBzdHJfcmVwbGFjZSggJyMnLCAnX18nLCAkbmFtZSApIC4gJyInIC4gJGNzcyAuICc+JzsKCQkJCQoJCQkJCgkJCS8qKioqKioqKioqIEhJRERFTiAqKioqKioqKioqLwoJCQl9IGVsc2VpZiAoICRpbnB1dFsndHlwZSddID09ICdoaWRkZW4nICkgewoJCQkJCgkJCQkKCQkJCSRyZXR1cm4gLj0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicgLiAkcHJlZml4IC4gJG5hbWUgLiAnIiB2YWx1ZT0iJyAuICRpbnB1dFsndmFsdWUnXSAuICciIGNsYXNzPSInIC4gJGNsYXNzZXMgLiAnIiBpZD0iJyAuICRwcmVmaXggLiBzdHJfcmVwbGFjZSggJyMnLCAnX18nLCAkbmFtZSApIC4gJyInIC4gJGNzcyAuICc+JzsKCQkJCQoJCQkJCgkJCS8qKioqKioqKioqIFdZU0lXWUcgKioqKioqKioqKi8KCQkJfSBlbHNlaWYgKCAkaW5wdXRbJ3R5cGUnXSA9PSAnd3lzaXd5ZycgKSB7CgkJCQkKCQkJCQoJCQkJJHd5c2l3eWdfc2V0dGluZ3MgPSBhcnJheV9tZXJnZSggJGlucHV0WydzZXR0aW5ncyddLCBhcnJheSggJ3RleHRhcmVhX25hbWUnID0+ICRwcmVmaXggLiAkbmFtZSApICk7CgkJCQkKCQkJCS8vJHJldHVybiAuPSAnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IicgLiAgLiAnIiB2YWx1ZT0iJyAuICAuICciIGlkPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyInIC4gJGNzcyAuICc+JzsKCQkJCW9iX3N0YXJ0KCk7CgkJCQl3cF9lZGl0b3IoICRpbnB1dFsndmFsdWUnXSwgJHByZWZpeCAuICRuYW1lLCAkd3lzaXd5Z19zZXR0aW5ncyApOwoJCQkJJHJldHVybiAuPSBvYl9nZXRfY29udGVudHMoKTsKCQkJCW9iX2VuZF9jbGVhbigpOwoJCQkJCgkJCQkKCQkJLyoqKioqKioqKiogVElUTEUgKioqKioqKioqKi8KCQkJfSBlbHNlaWYgKCAkaW5wdXRbJ3R5cGUnXSA9PSAndGl0bGUnICkgewoJCQkJCgkJCQkKCQkJCS8vIEFsbCBoYW5kbGVkIGJ5IHNldHRpbmdzIGNsYXNzIGN1cnJlbnRseS4gU2hvd2luZyBpbiB0aGUgdGggbm90IHRoZSB0ZC4KCQkJCS8vJHJldHVybiAuPSAnPGg0IGlkPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyInIC4gJGNzcyAuICc+JyAuICRpbnB1dFsndmFsdWUnXSAuICc8L2g0Pic7CgkJCQkKCQkJCQoJCQkvKioqKioqKioqKiBURVhUQVJFQSAqKioqKioqKioqLwoJCQl9IGVsc2VpZiAoICRpbnB1dFsndHlwZSddID09ICd0ZXh0YXJlYScgKSB7CgkJCQkKCQkJCQoJCQkJJHJldHVybiAuPSAnPHRleHRhcmVhIG5hbWU9IicgLiAkcHJlZml4IC4gJG5hbWUgLiAnIiBjbGFzcz0iJyAuICRjbGFzc2VzIC4gJyIgaWQ9IicgLiAkcHJlZml4IC4gc3RyX3JlcGxhY2UoICcjJywgJ19fJywgJG5hbWUgKSAuICciJyAuICRjc3MgLiAnPicgLiAkaW5wdXRbJ3ZhbHVlJ10gLiAnPC90ZXh0YXJlYT4nOwoJCQkJCgkJCQkKCQkJLyoqKioqKioqKiogUEFTU1dPUkQgKioqKioqKioqKi8KCQkJfSBlbHNlaWYgKCAkaW5wdXRbJ3R5cGUnXSA9PSAncGFzc3dvcmQnICkgewoJCQkJCgkJCQkKCQkJCSRyZXR1cm4gLj0gJzxpbnB1dCB0eXBlPSJwYXNzd29yZCIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSInIC4gJGlucHV0Wyd2YWx1ZSddIC4gJyIgY2xhc3M9IicgLiAkY2xhc3NlcyAuICciIGlkPSInIC4gJHByZWZpeCAuIHN0cl9yZXBsYWNlKCAnIycsICdfXycsICRuYW1lICkgLiAnIicgLiAkY3NzIC4gJz4nOwoJCQkJCgkJCQkKCQkJLyoqKioqKioqKiogU0VMRUNUICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3NlbGVjdCcgKSB7CgkJCQkKCQkJCQoJCQkJJHJldHVybiAuPSAnPHNlbGVjdCBuYW1lPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyIgY2xhc3M9IicgLiAkY2xhc3NlcyAuICciIGlkPSInIC4gJHByZWZpeCAuIHN0cl9yZXBsYWNlKCAnIycsICdfXycsICRuYW1lICkgLiAnIicgLiAkY3NzIC4gJz4nOwoJCQkJZm9yZWFjaCAoICRpbnB1dFsnb3B0aW9ucyddIGFzICRvcHRpb25fdmFsdWUgPT4gJG9wdGlvbl90aXRsZSApIHsKCQkJCQkkcmV0dXJuIC49ICc8b3B0aW9uIHZhbHVlPSInIC4gJG9wdGlvbl92YWx1ZSAuICciJzsKCQkJCQlpZiAoICRvcHRpb25fdmFsdWUgPT0gJGlucHV0Wyd2YWx1ZSddICkgeyAkcmV0dXJuIC49ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIic7IH0KCQkJCQkkcmV0dXJuIC49ICc+JyAuICRvcHRpb25fdGl0bGUgLiAnPC9vcHRpb24+JzsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJzwvc2VsZWN0Pic7CgkJCQkKCQkJCgkJCS8qKioqKioqKioqIFJBRElPICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3JhZGlvJyApIHsKCQkJCQoJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSIiPic7IC8vIGRlZmF1bHQgaWYgbm8gcmFkaW8gY2hlY2tlZAoJCQkJCgkJCQkkaSA9IDA7CgkJCQlmb3JlYWNoICggJGlucHV0WydvcHRpb25zJ10gYXMgJG9wdGlvbl92YWx1ZSA9PiAkb3B0aW9uX3RpdGxlICkgewoJCQkJCSRpKys7CgkJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSInIC4gJHByZWZpeCAuICRuYW1lIC4gJyIgY2xhc3M9IicgLiAkY2xhc3NlcyAuICciIGlkPSInIC4gJHByZWZpeCAuIHN0cl9yZXBsYWNlKCAnIycsICdfXycsICRuYW1lICkgLiAnIiB2YWx1ZT0iJyAuICRvcHRpb25fdmFsdWUgLiAnIicgLiAkY3NzOwoJCQkJCQoJCQkJCWlmICggJG9wdGlvbl92YWx1ZSA9PSAkaW5wdXRbJ3ZhbHVlJ10gKSB7IC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBzZWxlY3RlZC4KCQkJCQkJJHJldHVybiAuPSAnIGNoZWNrZWQ9ImNoZWNrZWQiJzsKCQkJCQl9CgkJCQkJJHJldHVybiAuPSAnPiAnIC4gJG9wdGlvbl90aXRsZTsKCQkJCQlpZiAoICRpIDwgY291bnQoICRpbnB1dFsnb3B0aW9ucyddICkgKSB7IC8vIHNwYWNlciBiZXR3ZWVuIGVhY2ggb25lLgoJCQkJCQlpZiAoICRvcmllbnRhdGlvbiA9PSAnaG9yaXpvbnRhbCcgKSB7IC8vIEhvcml6b25hbCBkaXNwbGF5LgoJCQkJCQkJJHJldHVybiAuPSAnICZuYnNwOyZuYnNwOyZuYnNwOyAnOwoJCQkJCQl9IGVsc2UgeyAvLyBWZXJ0aWNhbCBkaXNwbGF5LgoJCQkJCQkJJHJldHVybiAuPSAnPGJyPic7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkKCQkJCQoJCQkvKioqKioqKioqKiBDSEVDS0JPWCAqKioqKioqKioqLwoJCQl9IGVsc2VpZiAoICRpbnB1dFsndHlwZSddID09ICdjaGVja2JveCcgKSB7CgkJCQkKCQkJCQoJCQkJJHJldHVybiAuPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIHZhbHVlPSInIC4gJGlucHV0WydvcHRpb25zJ11bJ3VuY2hlY2tlZCddIC4gJyI+JzsKCQkJCSRyZXR1cm4gLj0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJyAuICRwcmVmaXggLiAkbmFtZSAuICciIGNsYXNzPSInIC4gJGNsYXNzZXMgLiAnIiBpZD0iJyAuICRwcmVmaXggLiBzdHJfcmVwbGFjZSggJyMnLCAnX18nLCAkbmFtZSApIC4gJyIgdmFsdWU9IicgLiAkaW5wdXRbJ29wdGlvbnMnXVsnY2hlY2tlZCddIC4gJyInIC4gJGNzczsKCQkJCWlmICggJGlucHV0WydvcHRpb25zJ11bJ2NoZWNrZWQnXSA9PSAkaW5wdXRbJ3ZhbHVlJ10gKSB7CgkJCQkJJHJldHVybiAuPSAnIGNoZWNrZWQnOwoJCQkJfQoJCQkJJHJldHVybiAuPSAnPic7CgkJCQkvLyBUT0RPOiBjb25kaXRpb25hbCB0byBzZWUgaWYgdGhpcyBuZWVkZXMgdG8gYmUgZGVmYXVsdCBzZWxlY3RlZCBiYXNlZCBvbiBvcHRpb25zLgoJCQkJCgkJCQkKCQkJLyoqKioqKioqKiogU1VCTUlUICoqKioqKioqKiovCgkJCX0gZWxzZWlmICggJGlucHV0Wyd0eXBlJ10gPT0gJ3N1Ym1pdCcgKSB7CgkJCQkKCQkJCQoJCQkJJHJldHVybiAuPSAnPGlucHV0IGNsYXNzPSJidXR0b24tcHJpbWFyeSAnIC4gJGNsYXNzZXMgLiAnIiB0eXBlPSJzdWJtaXQiIG5hbWU9IicgLiAkcHJlZml4IC4gJG5hbWUgLiAnIiB2YWx1ZT0iJyAuICRpbnB1dFsndmFsdWUnXSAuICciIGlkPSInIC4gJHByZWZpeCAuIHN0cl9yZXBsYWNlKCAnIycsICdfXycsICRuYW1lICkgLiAnIicgLiAkY3NzIC4gJz4nOwoJCQkJCgkJCQkKCQkJLyoqKioqKioqKiogflVOS05PV04gVFlQRX4gKioqKioqKioqKi8KCQkJfSBlbHNlIHsKCQkJCQoJCQkJCgkJCQkkcmV0dXJuIC49ICd7VW5rbm93biBmb3JtIGl0ZW0gdHlwZTogYCcgLiAkaW5wdXRbJ3R5cGUnXSAuICdgLn0nOwoJCQkJCgkJCQkKCQkJfQoKCQkJcmV0dXJuICRyZXR1cm47CgkJfSBlbHNlIHsKCQkJcmV0dXJuICd7SW52YWxpZCBmb3JtIGZpZWxkOiBgJyAuICRuYW1lIC4gJ2AufSc7CgkJfQoJCQoJfSAvLyBFbmQgZ2V0KCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT5zZXRfdmFsdWUoKQoJICoJCgkgKglVcGRhdGVzIHRoZSB2YWx1ZSBvZiBhbiBleGlzdGluZyBmb3JtIGl0ZW0uCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJTmFtZSBvZiB0aGUgaXRlbSBpbiB0aGUgZm9ybSB0byB1cGRhdGUuIEV4OiB0ZXh0CgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQlWYWx1ZSB0byBhcHBseSB0byB0aGUgZm9ybSBpdGVtLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3ZhbHVlKCAkbmFtZSwgJHZhbHVlICkgewoJCSR0aGlzLT5faW5wdXRzWyRuYW1lXVsndmFsdWUnXSA9ICR2YWx1ZTsKCX0gLy8gRW5kIHNldF92YWx1ZSgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybS0+Z2V0X3ZhbHVlKCkKCSAqCQoJICoJR2V0IHRoZSBzdWJtaXR0ZWQgKFBPU1RlZCkgdmFsdWUgb2YgdGhpcyBmb3JtIGl0ZW0uCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbmFtZQkJCU5hbWUgLyBzbHVnIGZvciB0aGlzIGZvcm0gaXRlbS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSBmb3IgdGhpcyBmb3JtIGl0ZW0uCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGVzCQkJKG9wdGlvbmFsKSBSdWxlcyB0byB2YWxpZGF0ZSB0aGlzIGZvcm0gaXRlbSBhZ2FpbnN0LgoJICoJQHJldHVybgkJbnVsbAoJICovCgkvLyBHZXQgdGhlIHN1Ym1pdHRlZCB2YWx1ZSBvZiBhIGZvcm0gaXRlbS4gZmFsc2UgaWYgbm90IGZvdW5kLiBTdHJpcHMgV1Agc2xhc2hlcy4KCWZ1bmN0aW9uIGdldF92YWx1ZSggJG5hbWUgKSB7CgkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICR0aGlzLT5fcHJlZml4IC4gJG5hbWUgKSAhPSAnJyApIHsgLy8gU3VibWl0dGVkIHZhbHVlIGV4aXN0cywgdXNlIGl0LgoJCQlyZXR1cm4gc3RyaXBzbGFzaGVzX2RlZXAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJHRoaXMtPl9wcmVmaXggLiAkbmFtZSApICk7CgkJfSBlbHNlIHsgLy8gTm90aGluZyBzdWJtaXR0ZWQsIGZhaWwuCgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9IC8vIEVuZCBnZXRfdmFsdWUoKS4KCQoJCgkKCS8qCXBiX2JhY2t1cGJ1ZGR5Ojp0ZXN0KCkKCSAqCQoJICoJVGVzdHMgd2hldGhlciBhIGZvcm0gaXRlbSdzIHJ1bGVzIG9uIGEgcHJvdmlkZWQgdmFsdWUuIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkIHRoZW4gd2lsbCB0cnkgdG8gZ2V0IHRoZSBQT1NUJ2VkIHZhbHVlLgoJICoJQHNlZSBwYl9iYWNrdXBidWRkeTo6dGVzdF9ydWxlKCkKCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRuYW1lCgkgKglAcGFyYW0JCW1peGVkCQkkdmFsdWUJCU9wdGlvbmFsOiBUaGlzIHdpbGwgYmUgdGVzdGVkIHdpdGggdGhlIHJ1bGUgYXNzaWduZWQgdG8gdGhlIGZvcm0gaXRlbSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lLgoJICoJCQkJCQkJCQkJSWYgZW1wdHkgd2Ugd2lsbCB0cnkgdG8gdGVzdCBiYXNlZCBvbiBhIHN1Ym1pdHRlZCBwb3N0IHZhbHVlIGlmIGl0IGV4aXN0cy4KCSAqCUByZXR1cm4JCXRydWUvYXJyYXkJCQkJdHJ1ZSBpZiB0aGUgdmFsdWUgcGFzc2VzOyBhcnJheSBvZiBlcnJvciBtZXNzYWdlcyBvbiBmYWlsdXJlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gdGVzdCggJG5hbWUsICR2YWx1ZSA9ICcnICkgewoJCWlmICggJHZhbHVlID09ICcnICkgeyAvLyBObyB2YWx1ZSwgdHJ5IHRvIGdldCBpdC4KCQkJaWYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICR0aGlzLT5fcHJlZml4IC4gJG5hbWUgKSAhPSAnJyApIHsgLy8gU3VibWl0dGVkIHZhbHVlIGV4aXN0cywgdXNlIGl0LgoJCQkJJHZhbHVlID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAkdGhpcy0+X3ByZWZpeCAuICRuYW1lICk7CgkJCS8vfSBlbHNlIHsgLy8gTm90aGluZyBzdWJtaXR0ZWQsIGZhaWwuCgkJCS8vCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQkKCQlpZiAoIGlzc2V0KCAkdGhpcy0+X2lucHV0c1skbmFtZV1bJ3J1bGVzJ10gKSApIHsKCQkJcmV0dXJuIHNlbGY6OnRlc3RfcnVsZSggJHRoaXMtPl9pbnB1dHNbJG5hbWVdWydydWxlcyddLCAkdmFsdWUgKTsKCQl9IGVsc2UgeyAvLyBObyB0ZXN0cy4gUGFzc2VkLgoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9IC8vIEVuZCB0ZXN0KCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtLT50ZXN0X3J1bGUoKQoJICoJCgkgKglUZXN0cyBhIHByb3ZpZGVkIHJ1bGVzZXQgYWdhaW5zdCBhIHZhbHVlIHRvIHZlcmlmeSB3aGV0aGVyIGl0IGNvbXBsaWVzIG9yIG5vdC4KCSAqCUBhdXRob3IgRGFuIEhhcnpoZWltCgkgKglAc2VlIHBsdWdpbmJ1ZGR5X2Zvcm0tPnRlc3QoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHJ1bGUJCQlSdWxlKHMpIHRvIHZhbGlkYXRlIGFnYWluc3QuIFNlZSBjb2RleCBmb3IgZGV0YWlscy4gVE9ETzogZG9jdW1lbnQgcnVsZXNldHMgaGVyZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkdmFsdWUJCQlWYWx1ZSB0byB2YWxpZGF0ZS4KCSAqCUBwYXJhbQkJYXJyYXkJCSRjYWxsYmFja3MJCU5PVCBZRVQgSU1QTEVNRU5URUQuIEFycmF5IG9mIGNhbGxiYWNrcyBmb3IgY3VzdG9tCgkgKgkJCQkJCQkJCQkJdmVyaWZpY2F0aW9uIG1ldGhvZHMuIEVhY2ggaXRlbSBpbiBhcnJheSBpcyBhCgkgKgkJCQkJCQkJCQkJcnVsZV9uYW1lID0+IGNhbGxiYWNrX2FycmF5IHBhaXIuCgkgKgkJCQkJCQkJCQkJRXg6ICRjYWxsYmFja3MgPSBhcnJheSggJ3Bob25lJyA9PiBhcnJheSggJHRoaXMsICdteV9waG9uZV92YWxpZGF0b3InICkgKTsKCSAqCUByZXR1cm4JCXRydWUvYXJyYXkJCQkJCXRydWUgb24gc3VjY2VzczsgYXJyYXkgb2YgZXJyb3IocykgZW5jb3VudGVyZWQgb24gZmFpbHVyZS4KCSAqLwoJZnVuY3Rpb24gdGVzdF9ydWxlKCAkcnVsZXNldCwgJHZhbHVlICkgewoJCSRlcnJvcnMgPSBhcnJheSgpOwoJCWlmICggJHJ1bGVzZXQgPT0gJycgKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQkKCQkkcnVsZXMgPSBleHBsb2RlKCAnfCcsICRydWxlc2V0ICk7IC8vIENyZWF0ZSBhcnJheSBvZiBydWxlcy4KCQlmb3JlYWNoKCAkcnVsZXMgYXMgJHJ1bGUgKSB7IC8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHJ1bGUuCgkJCQoJCQkvLyAqKioqKiBHRVQgUlVMRSBUWVBFICoqKioqCgkJCS8vIEdyYWIgdGhlIHR5cGUgb2YgdGhlIHJ1bGU7IGV4OiBzdHJpbmcsIGludCwgc2V0LCBldGMgdmlhIHJlZ2V4LgoJCQkkcnVsZV90eXBlX3BvcyA9IHN0cnBvcyggJHJ1bGUsICdbJyApOwoJCQkKCQkJaWYgKCAkcnVsZV90eXBlX3BvcyA9PT0gZmFsc2UgKSB7CgkJCQkkcnVsZV90eXBlID0gJHJ1bGU7CgkJCX0gZWxzZSB7CgkJCQkkcnVsZV90eXBlID0gc3Vic3RyKCAkcnVsZSwgMCwgJHJ1bGVfdHlwZV9wb3MgKTsKCQkJfQoJCQkKCQkJCgkJCS8qICoqKioqIFJFUVVJUkVEICoqKioqCgkJCSAqIFJ1bGUgaXMgcmVxdWlyZWQuCgkJCSAqIEZhaWwgaWYgJHZhbHVlIGlzIGVtcHR5LgoJCQkgKiBpZiBmYWlsczogICRlcnJvcnNbXSA9ICdWYWx1ZSBpcyBub3QgYSBzdHJpbmcuJzsKCQkJICogKi8KCQkJaWYgKCAkcnVsZV90eXBlID09ICdyZXF1aXJlZCcgKSB7IC8vIFJlcXVpcmVkIHJ1bGUuCgkJCQlpZiggJHZhbHVlID09ICcnICkgewoJCQkJCSRlcnJvcnNbXSA9ICdUaGlzIHZhbHVlIGlzIHJlcXVpcmVkLic7CgkJCQkJcmV0dXJuICRlcnJvcnM7IC8vIE5vIG1vcmUgY2hlY2tpbmcgaWYgbGVmdCBibGFuay4KCQkJCX0KCQkJCgkJCQoJCQkvKiAqKioqKiBTVFJJTkcgKioqKioKCQkJICogY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHN0cmluZyBpcyB0aGUgYXBwcm9wcmlhdGUgbGVuZ3RoLgoJCQkgKiAqLwoJCQl9IGVsc2VpZiAoICRydWxlX3R5cGUgPT0gJ3N0cmluZycgKSB7IC8vIFN0cmluZyBydWxlLgoJCQkJJHN1YnJ1bGUgPSBzdHJzdHIoICRydWxlLCAnWycgKTsKCQkJCSRoeXBoZW5fcG9zID0gc3RycG9zKCAkc3VicnVsZSwgJy0nICk7CgkJCQlpZiggJGh5cGhlbl9wb3MgIT0gJycgKSB7CgkJCQkJJGZpcnN0X251bWJlciA9IHN1YnN0ciggJHN1YnJ1bGUsIDEsICRoeXBoZW5fcG9zIC0gMSApOwoJCQkJCSRzZWNvbmRfbnVtYmVyID0gc3Vic3RyKCAkc3VicnVsZSwgJGh5cGhlbl9wb3MgKyAxLCAtMSApOwoJCQkJCSR2YWxfbGVuZ3RoID0gc3RybGVuKCAkdmFsdWUgKTsKCQkJCQlpZiggJHZhbF9sZW5ndGggPCAkZmlyc3RfbnVtYmVyIHx8ICR2YWxfbGVuZ3RoID4gJHNlY29uZF9udW1iZXIgKXsKCQkJCQkJJGVycm9yc1tdID0gJ0xlbmd0aCBvZiB2YWx1ZSBgJyAuIGh0bWxlbnRpdGllcyggJHZhbHVlICkgLiAnYCBpcyBpbnZhbGlkLic7CgkJCQkJfQoJCQkJfQoJCQkKCQkJLyogKioqKiogSU5UIFRZUEUgKioqKioKCQkJICogbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlIGZpdHMgaW5zaWRlIG9mIGJvdW5kcwoJCQkgKiBtYWtlIHN1cmUgaXQgZG9lc24ndCBpbmNsdWRlIGEgZGVjaW1hbAoJCQkgKiBhY2NlcHRzIGJsYW5rIHZhbHVlCgkJCSAqICovCgkJCX0gZWxzZWlmICggJHJ1bGVfdHlwZSA9PSAnaW50JyApIHsKCQkJCWlmICggJycgIT0gJHZhbHVlICkgewoJCQkJCWlmKCAhaXNfbnVtZXJpYyggJHZhbHVlICkgfHwgc3RycG9zKCR2YWx1ZSwgJy4nKSAhPT0gZmFsc2UgKSB7CgkJCQkJCSRlcnJvcnNbXSA9ICdgJyAuIGh0bWxlbnRpdGllcyggJHZhbHVlICkgLiAnYCBpcyBub3QgYSB2YWxpZCBudW1iZXIuJzsKCQkJCQl9IGVsc2UgewoJCQkJCQkJJHN1YnJ1bGUgPSBzdHJzdHIoICRydWxlLCAnWycgKTsKCQkJCQkJCSRoeXBoZW5fcG9zID0gc3RycG9zKCAkc3VicnVsZSwgJy0nICk7CgkJCQkJCQlpZiggJGh5cGhlbl9wb3MgIT0gJycgKSB7CgkJCQkJCQkJJGZpcnN0X251bWJlciA9IHN1YnN0ciggJHN1YnJ1bGUsIDEsICRoeXBoZW5fcG9zIC0gMSApOwoJCQkJCQkJCSRzZWNvbmRfbnVtYmVyID0gc3Vic3RyKCAkc3VicnVsZSwgJGh5cGhlbl9wb3MgKyAxLCAtMSApOwoJCQkJCQkJCWlmKCAkdmFsdWUgPCAkZmlyc3RfbnVtYmVyIHx8ICR2YWx1ZSA+ICRzZWNvbmRfbnVtYmVyICkgewoJCQkJCQkJCQkkZXJyb3JzW10gPSAnVmFsdWUgYCcgLiBodG1sZW50aXRpZXMoICR2YWx1ZSApIC4gJ2AgaXMgb3V0c2lkZSBvZiB0aGUgc2V0IGJvdW5kcy4nOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQoJCQkKCQkJLyogKioqKiogRU1BSUwgVFlQRSAqKioqKgoJCQkgKiB2YWxpZGF0ZSB0byBtYWtlIHN1cmUgdGhlIGUtbWFpbCBhZGRyZXNzIGlzIGFjdHVhbGx5IGFuIGUtbWFpbCBhZGRyZXNzLgoJCQkgKiAqLwoJCQl9IGVsc2VpZiAoICRydWxlX3R5cGUgPT0gJ2VtYWlsJyApIHsKCQkJCWlmICggJycgIT0gJHZhbHVlICkgewoJCQkJCS8vIFRPRE86IEFkZCBjdXN0b20gY2FsbGJhY2sgZnVuY3Rpb25hbGl0eSBoZXJlLgoJCQkJCWlmKCAhZmlsdGVyX3ZhciggJHZhbHVlLCBGSUxURVJfVkFMSURBVEVfRU1BSUwgKSApIHsKCQkJCQkJJGVycm9yc1tdID0gJ1ZhbHVlIGAnIC4gaHRtbGVudGl0aWVzKCAkdmFsdWUgKSAuICdgIGlzIG5vdCBhIHZhbGlkIGUtbWFpbCBhZGRyZXNzLic7CgkJCQkJfQoJCQkJfQoJCQkKCQkJCgkJCS8qICoqKioqIFNFVCBUWVBFICoqKioqCgkJCSAqIG1ha2Ugc3VyZSB0aGF0ICR2YWx1ZSBmYWxscyBpbnRvIG9uZSBvZiB0aGUgdHlwZXMuCgkJCSAqICovCgkJCX0gZWxzZWlmICggJHJ1bGVfdHlwZSA9PSAnc2V0JyApIHsKCQkJCS8vc2V0W3N0cmluZyxzdHJpbmcsc3RyaW5nLF0KCQkJCSRpc190aGVyZSA9IGZhbHNlOwoJCQkJJHN1YnN0cmluZyA9IHN0cnN0ciggJHJ1bGUsICdbJyApOwoJCQkJJHN1YnN0cmluZyA9IHN1YnN0ciggJHN1YnN0cmluZywgJHN1YnN0cmluZyArIDEsICRzdWJzdHJpbmcgLSAxICk7CgkJCQkkcGFydHMgPSBleHBsb2RlKCAnLCcsICRzdWJzdHJpbmcgKTsKCQkJCWZvcmVhY2goICRwYXJ0cyBhcyAkcGFydCApIHsKCQkJCQlpZiggJHZhbHVlID09ICRwYXJ0ICkgewoJCQkJCQkkaXNfdGhlcmUgPSB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJCWlmKCAkaXNfdGhlcmUgPT0gZmFsc2UgKSB7CgkJCQkJJGVycm9yc1tdID0gJ1ZhbHVlIGAnIC4gaHRtbGVudGl0aWVzKCAkdmFsdWUgKSAuICdgIGlzIG5vdCBhIHZhbGlkIHZhbHVlLic7CgkJCQl9CQoJCQkKCQkJCgkJCS8qICoqKioqIE5VTSBUWVBFICoqKioqCQoJCQkgKiBtYWtlIHN1cmUgdGhhdCAkdmFsdWUgaXMgbnVtZXJpYywgaWYgc28sIG1ha2Ugc3VyZSBpdCBmaXRzIGluc2lkZSBvZiBib3VuZHMKCQkJICogKi8KCQkJfSBlbHNlaWYgKCAkcnVsZV90eXBlID09ICdudW1iZXInICkgewoJCQkJaWYoICFpc19udW1lcmljKCAkdmFsdWUgKSApIHsKCQkJCQkkZXJyb3JzW10gPSAkdmFsdWUgLiAnIGlzIG5vdCBhIG51bWJlci4nOwoJCQkJfQoJCQkJJHN1YnJ1bGUgPSBzdHJzdHIoICRydWxlLCAnWycgKTsKCQkJCSRoeXBoZW5fcG9zID0gc3RycG9zKCAkc3VicnVsZSwgJy0nICk7CgkJCQlpZiggJGh5cGhlbl9wb3MgIT0gJycgKSB7CgkJCQkJJGZpcnN0X251bWJlciA9IHN1YnN0ciggJHN1YnJ1bGUsIDEsICRoeXBoZW5fcG9zIC0gMSApOwoJCQkJCSRzZWNvbmRfbnVtYmVyID0gc3Vic3RyKCAkc3VicnVsZSwgJGh5cGhlbl9wb3MgKyAxLCAtMSApOwoJCQkJCWlmKCAkdmFsdWUgPCAkZmlyc3RfbnVtYmVyIHx8ICR2YWx1ZSA+ICRzZWNvbmRfbnVtYmVyICkgewoJCQkJCQkkZXJyb3JzW10gPSAnVmFsdWUgYCcgLiBodG1sZW50aXRpZXMoICR2YWx1ZSApIC4gJ2AgaXMgb3V0c2lkZSBvZiB0aGUgc2V0IGJvdW5kcy4nOwoJCQkJCX0KCQkJCX0KCQkJCgkJCX0gZWxzZSB7CgkJCQkvLyBUT0RPOiBBZGQgY3VzdG9tIGNhbGxiYWNrIGZ1bmN0aW9uYWxpdHkgaGVyZS4KCQkJCQoJCQkJLy8gVW5rbm93biBydWxlIHNvIG5vdGlmeSB0aGUgZGV2ZWxvcGVyLgoJCQkJJGVycm9yc1tdID0gJ3tFcnJvciAjNTQ1ODkuIFVua25vd24gcnVsZSBgJyAuICRydWxlX3R5cGUgLiAnYC59JzsKCQkJfQoJCQkKCQl9CgkJCgkJaWYgKCBjb3VudCggJGVycm9ycyApID09PSAwICkgeyAvLyBObyBlcnJvcnM7IHN1Y2Nlc3MhCgkJCXJldHVybiB0cnVlOwoJCX0gZWxzZSB7IC8vIE9uZSBvciBtb3JlIGVycm9ycyBlbmNvdW50ZXJlZDsgcmV0dXJuIGFycmF5IG9mIGVycm9ycy4KCQkJcmV0dXJuICRlcnJvcnM7CgkJfQoJfSAvLyBFbmQgdGVzdF9ydWxlKCkuCgkKCQoJCgkvKgljbGVhcl92YWx1ZXMoKQoJICoJCgkgKglDbGVhcnMgdGhlIHZhbHVlIG9mIGFsbCBmb3JtIGl0ZW1zIHNldHRpbmcgdGhlIHZhbHVlIHRvIGFuIGVtcHR5IHN0cmluZyAnJy4KCSAqCQoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gY2xlYXJfdmFsdWVzKCkgewoJCWZvcmVhY2goICR0aGlzLT5faW5wdXRzIGFzICYkaW5wdXQgKSB7CgkJCSRpbnB1dFsndmFsdWUnXSA9ICcnOzsKCQl9CgkJCgkJcmV0dXJuOwoJfSAvLyBFbmQgY2xlYXJfdmFsdWVzKCkuCgkKCQoJCn0gLy8gRW5kIGNsYXNzIHBsdWdpbmJ1ZGR5X2Zvcm0KCgoKPz4=
###PACKDATA,FILE_END,/pluginbuddy/classes/form.php,importbuddy/pluginbuddy/classes/form.php
###PACKDATA,FILE_START,/pluginbuddy/classes/format.php,importbuddy/pluginbuddy/classes/format.php
PD9waHAKCgoKLyoJY2xhc3MgcGx1Z2luYnVkZHlfZm9ybWF0CiAqCUBhdXRob3IgRHVzdGluIEJvbHRvbgogKgkKICoJSGVscHMgZm9ybWF0IGNvbnRlbnQgb3IgZGF0YSBzdWNoIGFzIHRpbWUsIGRhdGUsIGZpbGUgc2l6ZSwgZXRjLgogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfZm9ybWF0IHsKCQoJCgkKCS8vICoqKioqKioqKiogUFVCTElDIFBST1BFUlRJRVMgKioqKioqKioqKgoJCgkKCQoJLy8gKioqKioqKioqKiBQUklWQVRFIFBST1BFUlRJRVMgKioqKioqKioqKgoJcHJpdmF0ZSAkX3RpbWVzdGFtcCA9ICdNIGosIFkgZzppOnMgYSc7CgkKCQoJLy8gKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybWF0LT5fX2NvbnN0cnVjdCgpCgkgKgkKCSAqCURlZmF1bHQgY29uc3RydWN0b3IuCgkgKgkKCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7Cgl9IC8vIEVuZCBfX2NvbnN0cnVjdCgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfZm9ybWF0LT5maWxlX3NpemUoKQoJICoJCgkgKglUYWtlcyBhIGZpbGUgc2l6ZSBpbiBieXRlcyBhbmQgdHJhbnNmb3JtcyBpdCBpbnRvIGEgaHVtYW4gcmVhZGFibGUgZm9ybWF0IHdpdGggbW9yZSBmcmllbmRseSB1bml0cy4gRGVjaWRlcyBvbiB1bml0IGJhc2VkIG9uIHRoZSBzaXplLgoJICoJCgkgKglAcGFyYW0JCWludAkJJHNpemUJRmlsZSBzaXplLgoJICoJQHJldHVybgkJc3RyaW5nCQkJSHVtYW4gZm9ybWF0dGVkIGZyaWVuZGx5IHJlYWRhYmxlIGZvcm1hdC4KCSAqLwoJZnVuY3Rpb24gZmlsZV9zaXplKCAkc2l6ZSApIHsKCQkkc2l6ZXMgPSBhcnJheSggJyBCeXRlcycsICcgS0InLCAnIE1CJywgJyBHQicsICcgVEInLCAnIFBCJywgJyBFQicsICcgWkInLCAnIFlCJyk7CgkJaWYgKCAkc2l6ZSA9PSAwICkgewoJCQlyZXR1cm4oICcwIE1CJyApOwoJCX0gZWxzZSB7CgkJCXJldHVybiAoIHJvdW5kKCAkc2l6ZSAvIHBvdyggMTAyNCwgKCAkaSA9IGZsb29yKCBsb2coICRzaXplLCAxMDI0ICkgKSApICksICRpID4gMSA/IDIgOiAwKSAuICRzaXplc1skaV0gKTsKCQl9Cgl9IC8vIEVuZCBmaWxlX3NpemUoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+ZGF0ZSgpCgkgKgkKCSAqCUZvcm1hdHMgYSB0aW1lc3RhbXAgaW50byBhIG5pY2UgaHVtYW4gZGF0ZSBmb3JtYXQuCgkgKgkKCSAqCUBwYXJhbQkJaW50CQkkdGltZXN0YW1wCQlUaW1lc3RhbXAgdG8gbWFrZSBwcmV0dHkuCgkgKglAcGFyYW0JCXN0cmluZwkkY3VzdG9tRm9ybWF0CUN1c3RvbSB0aW1lc3RhbXAgZm9ybWF0LiBFbHNlIHVzZXMgJHRoaXMtPl90aW1lc3RhbXAgZGVmaW5lZCBhdCB0b3Agb2YgdGhpcyBmaWxlLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQlQcmV0dHkgaHVtYW4gdGltZXN0YW1wLgoJICovCglmdW5jdGlvbiBkYXRlKCAkdGltZXN0YW1wLCAkY3VzdG9tRm9ybWF0ID0gJycgKSB7CgkJaWYgKCAnJyA9PSAkY3VzdG9tRm9ybWF0ICkgewoJCQlyZXR1cm4gZGF0ZSggJHRoaXMtPl90aW1lc3RhbXAsICR0aW1lc3RhbXAgKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZGF0ZSggJGN1c3RvbUZvcm1hdCwgJHRpbWVzdGFtcCApOwoJCX0KCX0gLy8gRW5kIGRhdGUoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+dW5sb2NhbGl6ZV90aW1lKCkKCSAqCQoJICoJUmVtb3ZlcyB0aGUgdGltZXpvbmUgb2Zmc2V0IG9mIGEgbG9jYWxpemVkIHRpbWUgZGlzcGxheSBmb3IgYSB1c2VyLgoJICoJCgkgKglAcGFyYW0JCWludAkJJHRpbWVzdGFtcAkJVGltZXN0YW1wIHRvIHJlbW92ZSB0aW1lIG9mZnNldCBmb3IuCgkgKglAcmV0dXJuCQlpbnQJCQkJCQlDb3JyZWN0ZWQgdGltZXN0YW1wLgoJICovCglmdW5jdGlvbiBsb2NhbGl6ZV90aW1lKCAkdGltZXN0YW1wICkgewoJCWlmICggZnVuY3Rpb25fZXhpc3RzKCAnZ2V0X29wdGlvbicgKSApIHsKCQkJJGdtdF9vZmZzZXQgPSBnZXRfb3B0aW9uKCAnZ210X29mZnNldCcgKTsKCQl9IGVsc2UgewoJCQkkZ210X29mZnNldCA9IDA7CgkJfQoJCXJldHVybiAkdGltZXN0YW1wICsgKCAkZ210X29mZnNldCAqIDM2MDAgKTsKCX0gLy8gRW5kIGxvY2FsaXplX3RpbWUoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+dW5sb2NhbGl6ZV90aW1lKCkKCSAqCQoJICoJUmVtb3ZlcyB0aGUgdGltZXpvbmUgb2Zmc2V0IG9mIGEgbG9jYWxpemVkIHRpbWUgZGlzcGxheSBmb3IgYSB1c2VyLgoJICoJCgkgKglAcGFyYW0JCWludAkJJHRpbWVzdGFtcAkJVGltZXN0YW1wIHRvIHJlbW92ZSB0aW1lIG9mZnNldCBmb3IuCgkgKglAcmV0dXJuCQlpbnQJCQkJCQlDb3JyZWN0ZWQgdGltZXN0YW1wLgoJICovCglmdW5jdGlvbiB1bmxvY2FsaXplX3RpbWUoICR0aW1lc3RhbXAgKSB7CgkJcmV0dXJuICR0aW1lc3RhbXAgLSAoIGdldF9vcHRpb24oICdnbXRfb2Zmc2V0JyApICogMzYwMCApOwoJfSAvLyBFbmQgdW5sb2NhbGl6ZV90aW1lKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9mb3JtYXQtPnRpbWVfYWdvKCkKCSAqCQoJICoJQWNjZXB0cyBOT04tbG9jYWxpemVkIHRpbWVzdGFtcHMuCgkgKglAc2VlIHRpbWVfZHVyYXRpb24KCSAqCQoJICoJQHBhcmFtCQkKCSAqCUByZXR1cm4JCQoJICovCgkgLy8gVE9ETzogZGVwcmVjYXRlZD8KCWZ1bmN0aW9uIHRpbWVfYWdvKCAkdGltZXN0YW1wICkgewoJCXJldHVybiBodW1hbl90aW1lX2RpZmYoICR0aW1lc3RhbXAsIHRpbWUoKSApOwoJfSAvLyBFbmQgdGltZV9hZ28oKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X2Zvcm1hdC0+ZHVyYXRpb24oKQoJICoJCgkgKglSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgZHVyYXRpb24uIFVzZWZ1bCBmb3IgdGltZSBhZ28gb3IgY291bnRkb3ducy4KCSAqCUV4OiA1IGhvdXJzLCA0IG1pbnV0ZXMsIDQzIHNlY29uZHMuCgkgKgkKCSAqCUBwYXJhbQkJaW50CQkkc2Vjb25kcwkJTnVtYmVyIG9mIHNlY29uZHMgdG8gdHVybiBpbnRvIGEgaHVtYW4gZnJpZW5kbHkgcmVhZGFibGUgZm9ybWF0LgoJICoJQHJldHVybgkJCQlzdHJpbmcJCQlIdW1hbiByZWFkYWJsZSBzdHJpbmcgZHVyYXRpb24uCgkgKi8KCWZ1bmN0aW9uIHRpbWVfZHVyYXRpb24oICRzZWNvbmRzICkgewoJCSR0aW1lID0gdGltZSgpIC0gJHNlY29uZHM7CgkJCgkJJHBlcmlvZHMgPSBhcnJheShfXygnc2Vjb25kJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnbWludXRlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnaG91cicsICAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnZGF5JywgCSAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnd2VlaycsICAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnbW9udGgnLCAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygneWVhcicsICAgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCSBfXygnZGVjYWRlJy4gJ0xJT04nICkKCQkJCQkJICk7CgkJJGxlbmd0aHMgPSBhcnJheSgnNjAnLCc2MCcsJzI0JywnNycsJzQuMzUnLCcxMicsJzEwJyk7CgkJCgkJJG5vdyA9IHRpbWUoKTsKCQkKCQkkZGlmZmVyZW5jZSA9ICRub3cgLSAkdGltZTsKCQkkdGVuc2UgPSBfXygnYWdvJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCgkJCgkJZm9yKCRqID0gMDsgJGRpZmZlcmVuY2UgPj0gJGxlbmd0aHNbJGpdICYmICRqIDwgY291bnQoJGxlbmd0aHMpLTE7ICRqKyspIHsKCQkJJGRpZmZlcmVuY2UgLz0gJGxlbmd0aHNbJGpdOwoJCX0KCQkKCQkkZGlmZmVyZW5jZSA9IHJvdW5kKCRkaWZmZXJlbmNlKTsKCQkKCQlpZigkZGlmZmVyZW5jZSAhPSAxKSB7CgkJCSRwZXJpb2RzWyRqXS49ICJzIjsKCQl9CgkJCgkJcmV0dXJuICIkZGlmZmVyZW5jZSAkcGVyaW9kc1skal0iOwoJfSAvLyBFbmQgZHVyYXRpb24oKS4KCQoJCgkKCS8qCXByZXR0aWZ5KCkKCSAqCQoJICoJVGFrZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBtb3JlIHByZXR0eSB2ZXJzaW9uLiBMb29rcyBpbiBhbiBhcnJheSBmb3IgYSBrZXkgbWF0Y2hpbmcgdGhlIHN0cmluZy4KCSAqCVJldHVybnMgdGhlIGFzc29jaWF0ZWQgdmFsdWUuIFJldHVybnMgb3JpZ2luYWwgdmFsdWUgaWYgbm8gcHJldHR5IHJlcGxhY2VyIGlzIGZvdW5kLgoJICoJRXg6CgkgKgkJcHJldHRpZnkoICdkb2cnLCBhcnJheSggJ2NhdHMnID0+ICdDYXRzJywgJ2RvZycgPT4gJ0RvZycgKSApOwoJICoJCVJldHVybnM6IERvZwoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHZhbHVlCQkJVmFsdWUgdG8gYmUgcmVwbGFjZWQgd2l0aCBhIHByZXR0eSB2ZXJzaW9uLgoJICoJQHBhcmFtCQlhcnJheQkJJHJlcGxhY2VtZW50cwlBcnJheSBvZjogdmFsdWUgdG8gbG9vayBmb3IgPT4gdmFsdWUgdG8gcmVwbGFjZSB3aXRoLgoJICoJQHJldHVybgkJc3RyaW5nCQkJCQkJUHJldHR5IHZlcnNpb24gdGhhdCByZXBsYWNlZCAkdmFsdWUuIFJldHVybnMgb3JpZ2luYWwgJHZhbHVlIGlmIG5vdCBmb3VuZCBpbiAkcmVwbGFjZW1lbnRzIGtleXMuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmV0dGlmeSggJHZhbHVlLCAkcmVwbGFjZW1lbnRzICkgewoJCQoJCWlmICggaXNzZXQoICRyZXBsYWNlbWVudHNbJHZhbHVlXSApICkgeyAvLyBGb3VuZCByZXBsYWNlbWVudC4KCQkJcmV0dXJuICRyZXBsYWNlbWVudHNbJHZhbHVlXTsKCQl9IGVsc2UgeyAvLyBObyByZXBsYWNlbWVudDsgcmV0dXJuIG9yaWdpbmFsIHZhbHVlLgoJCQlyZXR1cm4gJHZhbHVlOwoJCX0KCQkKCX0gLy8gRW5kIHByZXR0aWZ5KCk7CgkKCQoJCgkvKiBtdWx0aV9pbXBsb2RlKCkKCSAqCgkgKiBEZWVwIHJlY3Vyc2l2ZSBpbXBsb3Npb24uCgkgKgoJICovCglwdWJsaWMgZnVuY3Rpb24gbXVsdGlfaW1wbG9kZSgkYXJyYXksICRnbHVlKSB7CgkgICAgJHJldCA9ICcnOwoKCSAgICBmb3JlYWNoICgkYXJyYXkgYXMgJGl0ZW0pIHsKCSAgICAgICAgaWYgKGlzX2FycmF5KCRpdGVtKSkgewoJICAgICAgICAgICAgJHJldCAuPSAkdGhpcy0+bXVsdGlfaW1wbG9kZSgkaXRlbSwgJGdsdWUpIC4gJGdsdWU7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAkcmV0IC49ICRpdGVtIC4gJGdsdWU7CgkgICAgICAgIH0KCSAgICB9CgoJICAgICRyZXQgPSBzdWJzdHIoJHJldCwgMCwgMC1zdHJsZW4oJGdsdWUpKTsKCgkgICAgcmV0dXJuICRyZXQ7Cgl9IC8vIEVuZCBtdWx0aV9pbXBsb2RlKCkuCgkKCQoJCn0gLy8gRW5kIGNsYXNzIHBsdWdpbmJ1ZGR5X3NldHRpbmdzLgoKCgo/Pg==
###PACKDATA,FILE_END,/pluginbuddy/classes/format.php,importbuddy/pluginbuddy/classes/format.php
###PACKDATA,FILE_START,/pluginbuddy/classes/index.php,importbuddy/pluginbuddy/classes/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/pluginbuddy/classes/index.php,importbuddy/pluginbuddy/classes/index.php
###PACKDATA,FILE_START,/pluginbuddy/classes/settings.php,importbuddy/pluginbuddy/classes/settings.php
PD9waHAKCgoKLyoJY2xhc3MgcGx1Z2luYnVkZHlfc2V0dGluZ3MKICoJQGF1dGhvciBEdXN0aW4gQm9sdG9uCiAqCQogKglIYW5kbGVzIHNldHRpbmcgdXAgYW5kIHBhcnNpbmcgc3VibWl0dGVkIGRhdGEgZm9yIHNldHRpbmdzIHBhZ2VzLiBVc2VzIGZvcm0gY2xhc3MgZm9yIGhhbmRsaW5nIGZvcm1zLgogKglJZiBhIHNhdmVwb2ludCBpcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHRoZW4gc2V0dGluZ3Mgd2lsbCBiZSBhdXRvLXNhdmVkIG9uIHNhdmUuCiAqCUlmIGZhbHNlIGlzIHBhc3NlZCB0byB0aGUgc2F2ZXBvaW50IHRoZW4gdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhbmQgZ3JhYiBzdWJtaXR0ZWQgZm9ybSBkYXRhIGZvciBjdXN0b20gcHJvY2Vzc2luZy4KICoJQHNlZSBwbHVnaW5idWRkeV9mb3JtCiAqCQogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfc2V0dGluZ3MgewoJCgkKCQoJLy8gKioqKioqKioqKiBQVUJMSUMgUFJPUEVSVElFUyAqKioqKioqKioqCgkKCQoJCgkvLyAqKioqKioqKioqIFBSSVZBVEUgUFJPUEVSVElFUyAqKioqKioqKioqCglwcml2YXRlICRfZm9ybTsKCXByaXZhdGUgJF9mb3JtX25hbWUgPSAnJzsKCXByaXZhdGUgJF9wcmVmaXggPSAnJzsKCXByaXZhdGUgJF9zYXZlcG9pbnQ7Cglwcml2YXRlICRfc2V0dGluZ3MgPSBhcnJheSgpOwoJcHJpdmF0ZSAkX2N1c3RvbV90aXRsZV93aWR0aCA9ICcnOwoJCgkKCQoJLy8gKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfc2V0dGluZ3MtPl9fY29uc3RydWN0KCkKCSAqCQoJICoJRGVmYXVsdCBjb25zdHJ1Y3Rvci4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCQkkZm9ybV9uYW1lCQkJCQlOYW1lIC8gc2x1ZyBvZiB0aGUgZm9ybS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkJJHNhdmVfcG9pbnRfb3JfY3VzdG9tX21vZGUJTG9jYXRpb24gaW4gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zIGFycmF5IHRvIHNhdmUgdG8uIEV4OiBncm91cHMjNSBzYXZlcyBpbnRvOiBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2dyb3VwcyddWzVdLgoJICoJCQkJZmFsc2UJCQkJCQkJCQkJSWYgZmFsc2UgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiB3aWxsIG5vdCBzYXZlIGJ1dCB3aWxsIHJldHVybiByZXN1bHRzIGluc3RlYWQgaW5jbHVkaW5nIGZvcm0gbmFtZSA9PiB2YWx1ZSBwYWlycyBpbiBhbiBhcnJheSBmb3IgcHJvY2Vzc2luZy4KCSAqCQkJCWFycmF5CQkJCQkJCQkJCUlmIGFycmF5IHRoZW4gdGhlc2Ugd2lsbCBiZSB0cmVhdGVkIGFzIHRoZSBkZWZhdWx0cy4gV29ya3MgdGhlIHNhbWUgYXMgYmVpbmcgZmFsc2Ugb3RoZXIgdGhhbiB0aGlzLgoJICoJQHBhcmFtCQlzdHJpbmcJCQkkYWRkaXRpb25hbF9xdWVyeV9zdHJpbmcJQWRkaXRpb25hbCBxdWVyeXN0cmluZyB2YXJpYWJsZXMgdG8gcGFzcyBpbiB0aGUgZm9ybSBhY3Rpb24gVVJMLgoJICoJQHBhcmFtCQlpbnQJCQkJJGN1c3RvbV90aXRsZV93aWR0aAkJCUN1c3RvbSB0aXRsZSB3aWR0aCBpbiBwaXhlbHMuIEZvcm1hdHMgdGFibGUgc2l6aW5nLgoJICoJQHJldHVybgkJbnVsbAoJICovCglmdW5jdGlvbiBfX2NvbnN0cnVjdCggJGZvcm1fbmFtZSwgJHNhdmVfcG9pbnRfb3JfY3VzdG9tX21vZGUsICRhZGRpdGlvbmFsX3F1ZXJ5X3N0cmluZyA9ICcnLCAkY3VzdG9tX3RpdGxlX3dpZHRoID0gJycgKSB7CgkJJHRoaXMtPl9mb3JtX25hbWUgPSAkZm9ybV9uYW1lOwoJCSR0aGlzLT5fcHJlZml4ID0gJ3BiXycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nOwoJCSR0aGlzLT5fc2F2ZXBvaW50ID0gJHNhdmVfcG9pbnRfb3JfY3VzdG9tX21vZGU7CgkJJHRoaXMtPl9jdXN0b21fdGl0bGVfd2lkdGggPSAkY3VzdG9tX3RpdGxlX3dpZHRoOwoJCQoJCS8vIFRPRE86IG5vIG5lZWQgdG8gcGFzcyBzYXZlcG9pbnQgaGVyZT8gYmVsb3c6CgkJJHRoaXMtPl9mb3JtID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X2Zvcm0oICRmb3JtX25hbWUsICRzYXZlX3BvaW50X29yX2N1c3RvbV9tb2RlLCAkYWRkaXRpb25hbF9xdWVyeV9zdHJpbmcgKTsKCX0gLy8gRW5kIF9fY29uc3RydWN0KCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9zZXR0aW5ncy0+YWRkX3NldHRpbmcoKQoJICoJCgkgKglSZWdpc3RlciBhbmQgYWRkIGEgc2V0dGluZyB0byB0aGUgc2V0dGluZ3MgZm9ybSBzeXN0ZW0uCgkgKgkKCSAqCUBwYXJhbQkJYXJyYXkJCSRzZXR0aW5ncwkJQXJyYXkgb2Ygc2V0dGluZ3MgZm9yIHRoaXMgYWRkZWQgc2V0dGluZy4gU2VlICRkZWZhdWx0X3NldHRpbmdzIGZvciBsaXN0IG9mIG9wdGlvbnMgdGhhdCBjYW4gYmUgZGVmaW5lZC4KCSAqCUByZXR1cm4JCQoJICovCglmdW5jdGlvbiBhZGRfc2V0dGluZyggJHNldHRpbmdzICkgewoJCSRkZWZhdWx0X3NldHRpbmdzID0gYXJyYXkgKAoJCQkndHlwZScJCQkJPT4JCScnLAoJCQknbmFtZScJCQkJPT4JCScnLAoJCQkndGl0bGUnCQkJCT0+CQknJywKCQkJJ3RpcCcJCQkJPT4JCScnLAoJCQknY3NzJwkJCQk9PgkJJycsCgkJCSdiZWZvcmUnCQkJPT4JCScnLAoJCQknYWZ0ZXInCQkJCT0+CQknJywKCQkJJ3J1bGVzJwkJCQk9PgkJJycsCgkJCSdkZWZhdWx0JwkJCT0+CQknJywJCQkJCS8vIElNUE9SVEFOVDogT3ZlcnJpZGVzIGRlZmF1bHQgYXJyYXkuIEFsc28gdXNlZnVsIGlmIHNhdmVwb2ludCBpcyA9PT0gZmFsc2UgdG8gb3ZlcnJpZGUuCgkJCSdvcHRpb25zJwkJCT0+CQlhcnJheSgpLAoJCQknb3JpZW50YXRpb24nCQk9PgkJJ2hvcml6b250YWwnLAkJLy8gVXNlZCBieSByYWRpbyBhbmQgY2hlY2tib3hlcy4gVE9ETzogc3RpbGwgbmVlZCB0byBhZGQgdG8gY2hlY2tib3hlcy4KCQkJJ2NsYXNzZXMnCQkJPT4JCScnLAkJCQkJLy8gU3RyaW5nIG9mIGFkZGl0aW9uYWwgY2xhc3Nlcy4KCQkJJ3Jvd19jbGFzcycJCQk9PgkJJycsCQkJCQkvLyBDbGFzcyB0byBhcHBseSB0byByb3cgdGQncyBpbiByb3cuCgkJKTsKCQkkc2V0dGluZ3MgPSBhcnJheV9tZXJnZSggJGRlZmF1bHRfc2V0dGluZ3MsICRzZXR0aW5ncyApOwoJCSR0aGlzLT5fc2V0dGluZ3NbXSA9ICRzZXR0aW5nczsKCQkKCQkKCQkvLyBGaWd1cmUgb3V0IGRlZmF1bHRzLgoJCWlmICggJHNldHRpbmdzWydkZWZhdWx0J10gIT0gJycgKSB7IC8vIERlZmF1bHQgd2FzIHBhc3NlZCB0byBhZGRfc2V0dGluZygpLgoJCQkkZGVmYXVsdF92YWx1ZSA9ICRzZXR0aW5nc1snZGVmYXVsdCddOwoJCX0gZWxzZSB7IC8vIE5vIGRlZmF1bHQgZXhwbGljdGx5IHNldC4KCQkJJHNhdmVwb2ludCA9ICR0aGlzLT5fc2F2ZXBvaW50OwoJCQkkcmF3X25hbWUgPSAkc2V0dGluZ3NbJ25hbWUnXTsKCQkJCgkJCWlmICggc3RyaXN0ciggJHNldHRpbmdzWyduYW1lJ10sICcjJyApICk7CgkJCWlmICggZmFsc2UgIT09ICggJGxhc3RfaGFzaHBvaW50ID0gc3RycnBvcyggJHNldHRpbmdzWyduYW1lJ10sICcjJyApICkgKSB7CgkJCQkkdGVtcF9zYXZlcG9pbnQgPSBzdWJzdHIoICRzZXR0aW5nc1snbmFtZSddLCAwLCAkbGFzdF9oYXNocG9pbnQgKTsKCQkJCWlmICggKCAkc2F2ZXBvaW50ID09PSBmYWxzZSApIHx8ICggJHNhdmVwb2ludCA9PSAnJyApICkgewoJCQkJCSRzYXZlcG9pbnQgPSAkdGVtcF9zYXZlcG9pbnQ7CgkJCQl9IGVsc2UgewoJCQkJCSRzYXZlcG9pbnQgPSAkc2F2ZXBvaW50IC4gJyMnIC4gJHRlbXBfc2F2ZXBvaW50OwoJCQkJfQoJCQkJJHJhd19uYW1lID0gc3Vic3RyKCAkc2V0dGluZ3NbJ25hbWUnXSwgJGxhc3RfaGFzaHBvaW50ICsgMSApOyAvLyBJdGVtIG5hbWUgd2l0aCBzYXZlcG9pbnQgcG9ydGlvbiBzdHJpcHBlZCBvdXQuCgkJCX0KCQkJaWYgKCAkc2F2ZXBvaW50ICE9PSBmYWxzZSApIHsKCQkJCQoJCQkJaWYgKCBpc19hcnJheSggJHNhdmVwb2ludCApICkgeyAvLyBBcnJheSBvZiBkZWZhdWx0cyB3YXMgcGFzc2VkIGluc3RlYWQgb2Ygc2F2ZXBvaW50LgoJCQkJCSRkZWZhdWx0X3ZhbHVlID0gJHNhdmVwb2ludFsgJHJhd19uYW1lIF07CgkJCQkJCgkJCQl9IGVsc2UgeyAvLyBObyBkZWZhdWx0cyBwcm92aWRlZCwgc2VlayB0aGVtIG91dCBpbiBwbHVnaW5zIG9wdGlvbnMgYXJyYXkuCgkJCQkJCgkJCQkJLy8gRGVmYXVsdCB2YWx1ZXMgYXJlIG92ZXJ3cml0dGVuIGFmdGVyIGEgcHJvY2VzcygpIHJ1biB3aXRoIHRoZSBsYXRlc3QgZGF0YSBpZiBhIGZvcm0gd2FzIHN1Ym1pdHRlZC4KCQkJCQkkZ3JvdXAgPSBwYl9iYWNrdXBidWRkeTo6Z2V0X2dyb3VwKCAkc2F2ZXBvaW50ICk7CgkJCQkJaWYgKCAkZ3JvdXAgPT09IGZhbHNlICkgewoJCQkJCQkkZGVmYXVsdF92YWx1ZSA9ICcnOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWlmICggaXNzZXQoICRncm91cFsgJHJhd19uYW1lIF0gKSApIHsgLy8gRGVmYXVsdCBpcyBkZWZpbmVkLgoJCQkJCQkJJGRlZmF1bHRfdmFsdWUgPSAkZ3JvdXBbICRyYXdfbmFtZSBdOwoJCQkJCQl9IGVsc2UgeyAvLyBEZWZhdWx0IG5vdCBkZWZpbmVkLgoJCQkJCQkJJGRlZmF1bHRfdmFsdWUgPSAnJzsKCQkJCQkJfQoJCQkJCX0KCQkJCQkKCQkJCX0gLy8gZW5kIGZpbmRpbmcgZGVmYXVsdHMgaW4gcGx1Z2luIG9wdGlvbnMuCgkJCX0gZWxzZSB7IC8vIEN1c3RvbSBtb2RlIHdpdGhvdXQgYSBzYXZlcG9pbnQgcHJvdmlkZWQgc28gbm8gZGVmYXVsdCBzZXQgdW5sZXNzIHBhc3NlZCB0byBhZGRfc2V0dGluZygpLgoJCQkJJGRlZmF1bHRfdmFsdWUgPSAnJzsKCQkJfQoJCX0KCQkKCQkKCQkvLyBQcm9jZXNzIGFkZGluZyBmb3JtIGl0ZW0gZm9yIHRoZSBzZXR0aW5nIGJhc2VkIG9uIHR5cGUuCgkJc3dpdGNoKCAkc2V0dGluZ3NbJ3R5cGUnXSApIHsKCQkJY2FzZSAndGV4dCc6CgkJCQkkdGhpcy0+X2Zvcm0tPnRleHQoICRzZXR0aW5nc1snbmFtZSddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzWydydWxlcyddICk7CgkJCQlicmVhazsKCQkJY2FzZSAncGxhaW50ZXh0JzoKCQkJCSR0aGlzLT5fZm9ybS0+cGxhaW50ZXh0KCAkc2V0dGluZ3NbJ25hbWUnXSwgJGRlZmF1bHRfdmFsdWUgKTsKCQkJCWJyZWFrOwoJCQljYXNlICdjb2xvcic6CgkJCQkkdGhpcy0+X2Zvcm0tPmNvbG9yKCAkc2V0dGluZ3NbJ25hbWUnXSwgJGRlZmF1bHRfdmFsdWUsICRzZXR0aW5nc1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2hpZGRlbic6CgkJCQkkdGhpcy0+X2Zvcm0tPmhpZGRlbiggJHNldHRpbmdzWyduYW1lJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NbJ3J1bGVzJ10gKTsKCQkJCWJyZWFrOwoJCQljYXNlICd3eXNpd3lnJzoKCQkJCSR0aGlzLT5fZm9ybS0+d3lzaXd5ZyggJHNldHRpbmdzWyduYW1lJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NbJ3J1bGVzJ10sICRzZXR0aW5nc1snc2V0dGluZ3MnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3RleHRhcmVhJzoKCQkJCSR0aGlzLT5fZm9ybS0+dGV4dGFyZWEoICRzZXR0aW5nc1snbmFtZSddLCAkZGVmYXVsdF92YWx1ZSwgJHNldHRpbmdzWydydWxlcyddICk7CgkJCQlicmVhazsKCQkJY2FzZSAnc2VsZWN0JzoKCQkJCSR0aGlzLT5fZm9ybS0+c2VsZWN0KCAkc2V0dGluZ3NbJ25hbWUnXSwgJHNldHRpbmdzWydvcHRpb25zJ10sICRkZWZhdWx0X3ZhbHVlLCAkc2V0dGluZ3NbJ3J1bGVzJ10gKTsKCQkJCWJyZWFrOwoJCQljYXNlICdwYXNzd29yZCc6CgkJCQkkdGhpcy0+X2Zvcm0tPnBhc3N3b3JkKCAkc2V0dGluZ3NbJ25hbWUnXSwgJGRlZmF1bHRfdmFsdWUsICRzZXR0aW5nc1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3JhZGlvJzoKCQkJCSR0aGlzLT5fZm9ybS0+cmFkaW8oICRzZXR0aW5nc1snbmFtZSddLCAkc2V0dGluZ3NbJ29wdGlvbnMnXSwgJGRlZmF1bHRfdmFsdWUsICRzZXR0aW5nc1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2NoZWNrYm94JzoKCQkJCSR0aGlzLT5fZm9ybS0+Y2hlY2tib3goICRzZXR0aW5nc1snbmFtZSddLCAkc2V0dGluZ3NbJ29wdGlvbnMnXSwgJGRlZmF1bHRfdmFsdWUsICRzZXR0aW5nc1sncnVsZXMnXSApOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3N1Ym1pdCc6CgkJCQkkdGhpcy0+X2Zvcm0tPnN1Ym1pdCggJHNldHRpbmdzWyduYW1lJ10sICdERUZBVUxUJyApOyAvLyBTdWJtaXQgYnV0dG9uIHRleHQgaXMgc2V0IGluIGRpc3BsYXlfc2V0dGluZ3MoKSBwYXJhbS4KCQkJCWJyZWFrOwoJCQljYXNlICd0aXRsZSc6CgkJCQkkdGhpcy0+X2Zvcm0tPnRpdGxlKCAkc2V0dGluZ3NbJ25hbWUnXSwgJGRlZmF1bHRfdmFsdWUsICRzZXR0aW5nc1sncnVsZXMnXSApOyAvLyBTdWJtaXQgYnV0dG9uIHRleHQgaXMgc2V0IGluIGRpc3BsYXlfc2V0dGluZ3MoKSBwYXJhbS4KCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJZWNobyAne0Vycm9yOiBVbmtub3duIHNldHRpbmdzIHR5cGUufSc7CgkJCQlicmVhazsKCQl9IC8vIEVuZCBzd2l0Y2goKS4KCQkKCX0gLy8gRW5kIGFkZF9zZXR0aW5nKCkuCgkKCQoJCgkvKglwbHVnaW5idWRkeV9zZXR0aW5ncy0+cHJvY2VzcygpCgkgKgkKCSAqCVByb2Nlc3NlcyB0aGUgZm9ybSBpZiBhcHBsaWNhYmxlIChpZiBpdCB3YXMgc3VibWl0dGVkKS4KCSAqCVRPRE86IFBlcmhhcHMgYWRkIGNhbGxiYWNrIGFiaWxpdHkgdG8gdGhpcz8KCSAqCVRoaXMgbXVzdCBjb21lIGFmdGVyIGFsbCBmb3JtIGVsZW1lbnRzIGhhdmUgYmVlbiBhZGRlZC4KCSAqCVRoaXMgc2hvdWxkIHVzdWFsbHkgaGFwcGVuIGluIHRoZSBjb250cm9sbGVyIHByaW9yIHRvIGxvYWRpbmcgYSB2aWV3LgoJICoJSU1QT1JUQU5UOiBBcHBsaWVzIHRyaW0oKSB0byBhbGwgc3VibWl0dGVkIGZvcm0gdmFsdWVzIQoJICoJCgkgKglAcmV0dXJuCQludWxsL2FycmF5CQkJCVdoZW4gYSBzYXZlcG9pbnQgd2FzIGRlZmluZWQgaW4gY2xhc3MgY29uc3RydWN0b3Igbm90aGluZyBpcyByZXR1cm5lZC4gKG5vcm1hbCBvcGVyYXRpb24pCgkgKgkJCQkJCQkJCQlXaGVuIHNhdmVwb2ludCA9PT0gZmFsc2UgYW4gYXJyYXkgaXMgcmV0dXJuZWQgZm9yIGN1c3RvbSBmb3JtIHByb2Nlc3NpbmcuCgkgKgkJCQkJCQkJCQlGb3JtYXQ6IGFycmF5KCAnZXJyb3JzJyA9PiBmYWxzZS9hcnJheSwgJ2RhdGEnID0+IGFycmF5KCAnZm9ybV9rZXlzJyA9PiAnZm9ybV92YWx1ZXMnICkgKS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoKSB7CgkJaWYgKCAoICcnICE9ICggJGZvcm1fbmFtZSA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJHRoaXMtPl9wcmVmaXggKSApICkgJiYgKCBwYl9iYWNrdXBidWRkeTo6X1BPU1QoICR0aGlzLT5fcHJlZml4ICkgPT0gJHRoaXMtPl9mb3JtX25hbWUgKSApIHsgLy8gVGhpcyBmb3JtIHdhcyBpbmRlZWQgc3VibWl0dGVkLiBQUk9DRVNTIElUIQoJCQkvLyBUT0RPOgoJCQkkZXJyb3JzID0gYXJyYXkoKTsKCQkJJF9wb3N0cyA9IHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCgpOwoJCQkKCQkJLy8gQ2xlYW51cAoJCQlmb3JlYWNoKCAkX3Bvc3RzIGFzICYkcG9zdF92YWx1ZSApIHsKCQkJCSRwb3N0X3ZhbHVlID0gdHJpbSggJHBvc3RfdmFsdWUgKTsKCQkJfQoJCQkKCQkJLy8gbG9vcCB0aHJvdWdoIGFsbCBwb3N0ZWQgdmFyaWFibGVzLCBpZiBpdHMgcHJlZml4IG1hdGNoZXMgdGhpcyBmb3JtJ3MgbmFtZSB0aGVuCgkJCWZvcmVhY2goICRfcG9zdHMgYXMgJHBvc3RfbmFtZSA9PiAkcG9zdF92YWx1ZSApIHsKCQkJCWlmICggc3Vic3RyKCAkcG9zdF9uYW1lLCAwLCBzdHJsZW4oICR0aGlzLT5fcHJlZml4ICkgKSA9PSAkdGhpcy0+X3ByZWZpeCApIHsgLy8gVGhpcyBzZXR0aW5ncyBmb3JtLgoJCQkJCSRpdGVtX25hbWUgPSBzdWJzdHIoICRwb3N0X25hbWUsIHN0cmxlbiggJHRoaXMtPl9wcmVmaXggKSApOwoJCQkJCWlmICggKCAkaXRlbV9uYW1lICE9ICcnICkgJiYgKCAkaXRlbV9uYW1lICE9ICdzZXR0aW5nc19zdWJtaXQnICkgKSB7IC8vIFNraXAgdGhlIGZvcm0gbmFtZSBpbnB1dDsgYWxzbyBzZXR0aW5ncyBzdWJtaXQgYnV0dG9uIHNpbmNlIGl0IGlzIG5vdCByZWdpc3RlcmVkIHVudGlsIHZpZXcuCgkJCQkJCWlmICggdHJ1ZSAhPT0gKCAkdGVzdF9yZXN1bHQgPSAkdGhpcy0+X2Zvcm0tPnRlc3QoICRpdGVtX25hbWUsICRwb3N0X3ZhbHVlICkgKSApIHsKCQkJCQkJCWZvcmVhY2goICR0aGlzLT5fc2V0dGluZ3MgYXMgJHNldHRpbmdfaW5kZXggPT4gJHNldHRpbmcgKSB7CgkJCQkJCQkJaWYgKCAkc2V0dGluZ1sndHlwZSddID09ICd0aXRsZScgKSB7CgkJCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQkJCX0KCQkJCQkJCQlpZiAoICRzZXR0aW5nWyduYW1lJ10gPT0gJGl0ZW1fbmFtZSApIHsKCQkJCQkJCQkJJHRoaXMtPl9zZXR0aW5nc1skc2V0dGluZ19pbmRleF1bJ2Vycm9yJ10gPSB0cnVlOwoJCQkJCQkJCQkkaXRlbV90aXRsZSA9ICR0aGlzLT5fc2V0dGluZ3NbJHNldHRpbmdfaW5kZXhdWyd0aXRsZSddOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCSRlcnJvcnNbXSA9ICdWYWxpZGF0aW9uIGZhaWx1cmUgb24gYCcgLiAkaXRlbV90aXRsZSAuICdgOiAnIC4gaW1wbG9kZSggJyAnLCAkdGVzdF9yZXN1bHQgKTsKCQkJCQkJCXVuc2V0KCAkX3Bvc3RzWyRwb3N0X25hbWVdICk7IC8vIFJlbW92ZXMgdGhpcyBmb3JtIGl0ZW0gc28gaXQgd2lsbCBub3QgYmUgdXBkYXRlZCBkdXJpbmcgc2F2ZSBsYXRlci4KCQkJCQkJfSBlbHNlIHsgLy8gSXRlbSB2YWxpZGF0ZWQuIFJlbW92ZSBwcmVmaXggZm9yIGxhdGVyIHByb2Nlc3NpbmcuCgkJCQkJCQkkX3Bvc3RzWyRpdGVtX25hbWVdID0gJF9wb3N0c1skcG9zdF9uYW1lXTsKCQkJCQkJCSR0aGlzLT5fZm9ybS0+c2V0X3ZhbHVlKCAkaXRlbV9uYW1lLCAkcG9zdF92YWx1ZSApOyAvLyBTZXQgdmFsdWUgdG8gYmUgZXF1YWwgdG8gc3VibWl0dGVkIHZhbHVlIHNvIGlmIG9uZSBvciBtb3JlIGl0ZW0gZmFpbGVkIHZhbGlkYXRpb24gdGhlIGVudGlyZSBmb3JtIGlzIG5vdCB3aXBlZCBvdXQuIERvbid0IHdhbnQgdXNlciB0byBoYXZlIHRvIHJlLWVudGVyIHZhbGlkIGRhdGEuCgkJCQkJCQl1bnNldCggJF9wb3N0c1skcG9zdF9uYW1lXSApOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsgLy8gU3VibWl0IGJ1dHRvbi4gQ2FuIHVuc2V0IGl0IHRvIGNsZWFuIHVwIGFycmF5IGZvciBsYXRlci4KCQkJCQkJdW5zZXQoICRfcG9zdHNbJHBvc3RfbmFtZV0gKTsKCQkJCQl9CgkJCQl9IGVsc2UgeyAvLyBOb3QgZm9yIHRoaXMgZm9ybS4gQ2FuIHVuc2V0IGl0IHRvIGNsZWFuIHVwIGFycmF5IGZvciBsYXRlci4KCQkJCQl1bnNldCggJF9wb3N0c1skcG9zdF9uYW1lXSApOwoJCQkJfQoJCQl9CgkJCQoJCQkvLyBQcm9jZXNzIQoJCQkKCQkJCgkJCS8vIE9ubHkgc2F2ZSBpZiBpbiBub3JtYWwgc2V0dGluZ3MgbW9kZTsgaWYgc2F2ZXBvaW50ID09PSBmYWxzZSBubyBzYXZpbmcgaGVyZS4KCQkJaWYgKCAoICR0aGlzLT5fc2F2ZXBvaW50ID09PSBmYWxzZSApIHx8IGlzX2FycmF5KCAkdGhpcy0+X3NhdmVwb2ludCApICkgewoJCQkJLy9mb3JlYWNoKCAkX3Bvc3RzIGFzICRwb3N0X25hbWUgPT4gJHBvc3RfdmFsdWUgKSB7IC8vIFZhbGlkYXRpb24gYWJvdmUgc2hvdWxkIGhhdmVvIG9ubHkgbGVmdCBpdGVtcyBmb3IgdGhpcyBmb3JtLiBTdHJpcCBwcmVmaXhlcyBiZWZvcmUgcGFzc2luZyBvbi4KCQkJCS8vCSRwb3N0X25hbWUgPSBzdWJzdHIoICRwb3N0X25hbWUsIHN0cmxlbiggJHRoaXMtPl9wcmVmaXggKSApOwoJCQkJLy99CgkJCQkkcmV0dXJuID0gYXJyYXkoCgkJCQkJCQkJJ2Vycm9ycycJPT4JCSRlcnJvcnMsCgkJCQkJCQkJJ2RhdGEnCQk9PgkJJF9wb3N0cywKCQkJCQkJCSk7CgkJCQlyZXR1cm4gJHJldHVybjsKCQkJfSBlbHNlIHsgLy8gTm9ybWFsIHNldHRpbmdzIHNpbmNlIHNhdmVwb2ludCAhPT0gZmFsc2UuIFNhdmUgaW50byBzYXZlcG9pbnQhCgkJCQkKCQkJCWlmICggY291bnQoICRlcnJvcnMgKSA+IDAgKSB7IC8vIEVycm9ycy4KCQkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciB2YWxpZGF0aW5nIG9uZSBvciBtb3JlIGZpZWxkcyBhcyBpbmRpY2F0ZWQgYmVsb3cuIEVycm9yKHMpOjxicj4nIC4gaW1wbG9kZSggJzxicj4nLCAkZXJyb3JzICksIHRydWUgKTsKCQkJCX0KCQkJCS8vIFByZXBhcmUgc2F2ZXBvaW50LgoJCQkJaWYgKCAkdGhpcy0+X3NhdmVwb2ludCAhPSAnJyApIHsKCQkJCQkkc2F2ZXBvaW50X3Jvb3QgPSAkdGhpcy0+X3NhdmVwb2ludCAuICcjJzsKCQkJCX0gZWxzZSB7CgkJCQkJJHNhdmVwb2ludF9yb290ID0gJyc7CgkJCQl9CgkJCQkKCQkJCS8vIFRoZSBoYXJkIHdvcmsuCgkJCQlmb3JlYWNoKCAkX3Bvc3RzIGFzICRwb3N0X25hbWUgPT4gJHBvc3RfdmFsdWUgKSB7IC8vIExvb3AgdGhyb3VnaCBhbGwgcG9zdCBpdGVtcyAobm90IGFsbCBtYXkgYmUgb3VyIGZvcm0pLiBAc2VlIDgzNDI5NTk0ODM3NTM0OTg3LgoJCQkJCS8vaWYgKCBzdWJzdHIoICRwb3N0X25hbWUsIDAsIHN0cmxlbiggJHRoaXMtPl9wcmVmaXggKSApID09ICR0aGlzLT5fcHJlZml4ICkgeyAvLyBJZiBwcmVmaXggbWF0Y2hlcywgaXRzIHRoaXMgZm9ybS4KCQkJCQkJLy8kcG9zdF9uYW1lID0gc3Vic3RyKCAkcG9zdF9uYW1lLCBzdHJsZW4oICR0aGlzLT5fcHJlZml4ICkgKTsgLy8gU2V0IHN0cmlwcGVkIHByZWZpeC4KCQkJCQkJLy9pZiAoICRwb3N0X25hbWUgIT0gJycgKSB7IC8vIFNraXBzIHRoZSBlbXB0eSBwcmVmaXggbmFtZSB3ZSB1c2VkIGZvciB2ZXJpZnlpbmcgZm9ybS4gQHNlZSA4MzQyOTU5NDgzNzUzNDk4Ny4KCQkJCQkJCQoJCQkJCQkJLy8gVXBkYXRlIGZvcm0gaXRlbSB2YWx1ZS4KCQkJCQkJCSR0aGlzLT5fZm9ybS0+c2V0X3ZhbHVlKCAkcG9zdF9uYW1lLCAkcG9zdF92YWx1ZSApOwoJCQkJCQkJCgkJCQkJCQkvLyBGcm9tIG9sZCBzYXZlX3NldHRpbmdzKCk6CgkJCQkJCQkkc2F2ZXBvaW50X3N1YnNlY3Rpb24gPSAmcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zOwoJCQkJCQkJJHNhdmVwb2ludF9sZXZlbHMgPSBleHBsb2RlKCAnIycsICRzYXZlcG9pbnRfcm9vdCAuICRwb3N0X25hbWUgKTsKCQkJCQkJCWZvcmVhY2ggKCAkc2F2ZXBvaW50X2xldmVscyBhcyAkc2F2ZXBvaW50X2xldmVsICkgewoJCQkJCQkJCSRzYXZlcG9pbnRfc3Vic2VjdGlvbiA9ICYkc2F2ZXBvaW50X3N1YnNlY3Rpb257JHNhdmVwb2ludF9sZXZlbH07CgkJCQkJCQl9CgkJCQkJCQkvLyBBcHBseSBzZXR0aW5ncy4KCQkJCQkJCSRzYXZlcG9pbnRfc3Vic2VjdGlvbiA9IHN0cmlwc2xhc2hlc19kZWVwKCAkcG9zdF92YWx1ZSApOyAvLyBSZW1vdmUgV29yZFByZXNzJyBtYWdpYy1xdW90ZXMtbm9uc2Vuc2UuCgkJCQkJCS8vfQoJCQkJCS8vfQoJCQkJfQoJCQkJCgkJCQkvLyBBZGQgYSBub3RlIHRvIHRoZSBzYXZlIGFsZXJ0IHRoYXQgc29tZSB2YWx1ZXMgYXJlIHNraXBwZWQgZHVlIHRvIGVycm9ycy4KCQkJCSRlcnJvcl9ub3RlID0gJyc7CgkJCQlpZiAoIGNvdW50KCAkZXJyb3JzICkgPiAwICkgewoJCQkJCSRlcnJvcl9ub3RlID0gJyBPbmUgb3IgbW9yZSBmaWVsZHMgc2tpcHBlZCBkdWUgdG8gZXJyb3IuJzsKCQkJCX0KCQkJCQoJCQkJcGJfYmFja3VwYnVkZHk6OnNhdmUoKTsKCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggX18oICdTZXR0aW5ncyBzYXZlZC4nIC4gJGVycm9yX25vdGUsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICk7CgkJCQkKCQkJCSRyZXR1cm4gPSBhcnJheSgKCQkJCQkJCQknZXJyb3JzJwk9PgkJJGVycm9ycywKCQkJCQkJCQknZGF0YScJCT0+CQkkX3Bvc3RzLAoJCQkJCQkJKTsKCQkJCXJldHVybiAkcmV0dXJuOwoJCQkJLy99IC8vIGVuZCBubyBlcnJvcnMuCgkJCX0gLy8gRW5kIGlmIHNhdmVwb2ludCAhPT09IGZhbHNlLgoJCX0gLy8gZW5kIHN1Ym1pdHRlZCBmb3JtLgoJCQoJCQoJfSAvLyBFbmQgcHJvY2VzcygpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfc2V0dGluZ3MtPmRpc3BsYXlfc2V0dGluZ3MoKQoJICoJCgkgKglEaXNwbGF5cyBhbGwgdGhlIHJlZ2lzdGVyZWQgc2V0dGluZ3MgaW4gdGhpcyBvYmplY3QuIEVudGlyZSBmb3JtIGFuZCBIVE1MIGlzIGVjaG8nZCBvdXQuCgkgKglAc2VlIHBsdWdpbmJ1ZGR5X3NldHRpbmdzLT5nZXRfc2V0dGluZ3MoKQoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHN1Ym1pdF9idXR0b25fdGl0bGUJCVRleHQgdG8gZGlzcGxheSBpbiB0aGUgc3VibWl0IGJ1dHRvbi4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkYmVmb3JlCQkJCQkJQ29udGVudCBiZWZvcmUgc3VibWl0IGFmdGVyLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRhZnRlcgkJCQkJCUNvbnRlbnQgYWZ0ZXIgc3VibWl0IGJ1dHRvbi4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRpc3BsYXlfc2V0dGluZ3MoICRzdWJtaXRfYnV0dG9uX3RpdGxlLCAkYmVmb3JlID0gJycsICRhZnRlciA9ICcnLCAkc2F2ZV9idXR0b25fY2xhc3MgPSAnJyApIHsKCQllY2hvICR0aGlzLT5nZXRfc2V0dGluZ3MoICRzdWJtaXRfYnV0dG9uX3RpdGxlLCAkYmVmb3JlLCAkYWZ0ZXIsICRzYXZlX2J1dHRvbl9jbGFzcyApOwoJfSAvLyBFbmQgZGlzcGxheV9zZXR0aW5ncygpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfc2V0dGluZ3MtPmdldF9zZXR0aW5ncygpCgkgKgkKCSAqCVJldHVybnMgYWxsIHRoZSByZWdpc3RlcmVkIHNldHRpbmdzIGluIHRoaXMgb2JqZWN0LiBFbnRpcmUgZm9ybSBhbmQgSFRNTCBpcyByZXR1cm5lZC4KCSAqCUBzZWUgcGx1Z2luYnVkZHlfc2V0dGluZ3MtPmRpc3BsYXlfc2V0dGluZ3MoKQoJICoJcmFkaW8gYnV0dG9uIGFkZGl0aW9uYWwgb3B0aW9uczogIG9yaWVudGF0aW9uIFsgdmVydGljYWwgLyBob3Jpem9udGFsIF0KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSRzdWJtaXRfYnV0dG9uX3RpdGxlCQlUZXh0IHRvIGRpc3BsYXkgaW4gdGhlIHN1Ym1pdCBidXR0b24uCgkgKglAcGFyYW0JCXN0cmluZwkJJGJlZm9yZQkJCQkJCUNvbnRlbnQgYmVmb3JlIHN1Ym1pdCBhZnRlci4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkYWZ0ZXIJCQkJCQlDb250ZW50IGFmdGVyIHN1Ym1pdCBidXR0b24uCgkgKglAcmV0dXJuCQlzdHJpbmcJCQkJCQkJCQlSZXR1cm5zIGVudGlyZSBzdHJpbmcgd2l0aCBldmVyeXRoaW5nIGluIGl0IHRvIGRpc3BsYXkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfc2V0dGluZ3MoICRzdWJtaXRfYnV0dG9uX3RpdGxlLCAkYmVmb3JlID0gJycsICRhZnRlciA9ICcnLCAkc2F2ZV9idXR0b25fY2xhc3MgPSAnJyApIHsKCQkkZmlyc3RfdGl0bGUgPSB0cnVlOyAvLyBmaXJzdCB0aXRsZSdzIENTUyB0b3AgcGFkZGluZyBkaWZmZXJzIHNvIG11c3QgdHJhY2suCgkJCgkJJHJldHVybiA9ICR0aGlzLT5fZm9ybS0+c3RhcnQoKTsKCQkkcmV0dXJuIC49ICc8dGFibGUgY2xhc3M9ImZvcm0tdGFibGUiPic7IC8vIHN0eWxlPSJtYXgtd2lkdGg6IDY3NXB4OyI+JzsKCQlmb3JlYWNoICggJHRoaXMtPl9zZXR0aW5ncyBhcyAkc2V0dGluZ3MgKSB7CgkJCSR0aF9jc3MgPSAnJzsKCQkJCgkJCWlmICggJHNldHRpbmdzWyd0aXRsZSddID09ICcnICkgeyAvLyBibGFuayB0aXRsZSBzbyBoaWRlIGxlZnQgY29sdW1uLgoJCQkJJHRoX2NzcyAuPSAnIGRpc3BsYXk6IG5vbmU7JzsKCQkJfQoJCQkKCQkJaWYgKCAkc2V0dGluZ3NbJ3R5cGUnXSA9PSAndGl0bGUnICkgeyAvLyBUaXRsZSBpdGVtLgoJCQkJaWYgKCAkZmlyc3RfdGl0bGUgPT09IHRydWUgKSB7IC8vIEZpcnN0IHRpdGxlIGluIGxpc3QuCgkJCQkJJHJldHVybiAuPSAnPHRyIHN0eWxlPSJib3JkZXI6IDA7Ij48dGggY29sc3Bhbj0iMiIgc3R5bGU9ImJvcmRlcjogMDsgcGFkZGluZy10b3A6IDA7IHBhZGRpbmctYm90dG9tOiAwOyIgY2xhc3M9IicgLiAkc2V0dGluZ3NbJ3Jvd19jbGFzcyddIC4gJyI+PGgzIGNsYXNzPSJ0aXRsZSInOwoJCQkJCSRyZXR1cm4gLj0gJyBzdHlsZT0ibWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMC41ZW07Iic7CgkJCQkJJGZpcnN0X3RpdGxlID0gZmFsc2U7CgkJCQl9IGVsc2UgeyAvLyBTdWJzZXF1ZW50IHRpdGxlcy4KCQkJCQkkcmV0dXJuIC49ICc8dHIgc3R5bGU9ImJvcmRlcjogMDsiPjx0aCBjb2xzcGFuPSIyIiBzdHlsZT0iYm9yZGVyOiAwOyIgY2xhc3M9IicgLiAkc2V0dGluZ3NbJ3Jvd19jbGFzcyddIC4gJyI+PGgzIGNsYXNzPSJ0aXRsZSInOwoJCQkJCSRyZXR1cm4gLj0gJyBzdHlsZT0ibWFyZ2luOiAwLjVlbSAwOyInOwoJCQkJfQoJCQkJCgkJCQkkcmV0dXJuIC49ICc+JyAuICRzZXR0aW5nc1sndGl0bGUnXSAuICc8L2gzPjwvdGg+JzsKCQkJfSBlbHNlaWYgKCAkc2V0dGluZ3NbJ3R5cGUnXSA9PSAnaGlkZGVuJyApIHsgLy8gaGlkZGVuIGZvcm0gaXRlbS4gbm8gdGl0bGUuCgkJCQkkcmV0dXJuIC49ICR0aGlzLT5fZm9ybS0+Z2V0KCAkc2V0dGluZ3NbJ25hbWUnXSwgJHNldHRpbmdzWydjc3MnXSwgJHNldHRpbmdzWydjbGFzc2VzJ10gKTsKCQkJfSBlbHNlIHsgLy8gTm9ybWFsIGl0ZW0uCgkJCQkkcmV0dXJuIC49ICc8dHIgY2xhc3M9IicgLiAkc2V0dGluZ3NbJ3Jvd19jbGFzcyddIC4gJyI+JzsKCQkJCSRyZXR1cm4gLj0gJzx0aCBzY29wZT0icm93IiBjbGFzcz0iJyAuICRzZXR0aW5nc1sncm93X2NsYXNzJ10gLiAnIic7CgkJCQlpZiAoICR0aGlzLT5fY3VzdG9tX3RpdGxlX3dpZHRoICE9ICcnICkgewoJCQkJCSRyZXR1cm4gLj0gJyBzdHlsZT0id2lkdGg6ICcgLiAkdGhpcy0+X2N1c3RvbV90aXRsZV93aWR0aCAuICdweDsgJyAuICR0aF9jc3MgLiAnIic7CgkJCQl9IGVsc2UgewoJCQkJCSRyZXR1cm4gLj0gJyBzdHlsZT0iJyAuICR0aF9jc3MgLiAnIic7CgkJCQl9CgkJCQkkcmV0dXJuIC49ICc+JzsKCQkJCSRyZXR1cm4gLj0gJHNldHRpbmdzWyd0aXRsZSddOwoJCQkJaWYgKCBpc3NldCggJHNldHRpbmdzWyd0aXAnXSApICYmICggJHNldHRpbmdzWyd0aXAnXSAhPSAnJyApICkgewoJCQkJCSRyZXR1cm4gLj0gcGJfYmFja3VwYnVkZHk6OiR1aS0+dGlwKCAkc2V0dGluZ3NbJ3RpcCddLCAnJywgZmFsc2UgKTsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJzwvdGg+JzsKCQkJCWlmICggJHNldHRpbmdzWyd0eXBlJ10gPT0gJ3RpdGxlJyApIHsgLy8gRXh0ZW5kIHdpZHRoIGZ1bGwgbGVuZ3RoIGZvciB0aXRsZSBpdGVtLgoJCQkJCSRyZXR1cm4gLj0gJyBjb2xzcGFuPSIyIic7CgkJCQl9CgkJCQkKCQkJCSRyZXR1cm4gLj0gJzx0ZCBjbGFzcz0iJyAuICRzZXR0aW5nc1sncm93X2NsYXNzJ10gLiAnIic7CgkJCQlpZiAoICRzZXR0aW5nc1sndGl0bGUnXSA9PSAnJyApIHsgLy8gTm8gdGl0bGUgc28gaGlkZSBsZWZ0IGNvbHVtbi4KCQkJCQkkcmV0dXJuIC49ICcgY29sc3Bhbj0iMiInOwoJCQkJfQoJCQkJJHJldHVybiAuPSAnPic7CgkJCQkkcmV0dXJuIC49ICRzZXR0aW5nc1snYmVmb3JlJ107CgkJCQlpZiAoIGlzc2V0KCAkc2V0dGluZ3NbJ2Vycm9yJ10gKSAmJiAoICRzZXR0aW5nc1snZXJyb3InXSA9PT0gdHJ1ZSApICkgewoJCQkJCSRzZXR0aW5nc1snY3NzJ10gLj0gJ2JvcmRlcjogMXB4IGRhc2hlZCByZWQ7JzsKCQkJCX0KCQkJCSRyZXR1cm4gLj0gJHRoaXMtPl9mb3JtLT5nZXQoICRzZXR0aW5nc1snbmFtZSddLCAkc2V0dGluZ3NbJ2NzcyddLCAkc2V0dGluZ3NbJ2NsYXNzZXMnXSwgJHNldHRpbmdzWydvcmllbnRhdGlvbiddICk7CgkJCQkkcmV0dXJuIC49ICRzZXR0aW5nc1snYWZ0ZXInXTsKCQkJCSRyZXR1cm4gLj0gJzwvdGQ+JzsKCQkJCSRyZXR1cm4gLj0gJzwvdHI+JzsKCQkJfQoJCQkKCQkJCgkJCQoJCQkvKgoJCQkkZm9ybS0+YWRkX3NldHRpbmcoIGFycmF5KAoJCQkJJ3R5cGUnCQk9PgkJJ3RleHQnLAoJCQkJJ25hbWUnCQk9PgkJJ2ltYWdlX3dpZHRoJywKCQkJCSd0aXRsZScJCT0+CQknSW1hZ2UgV2lkdGgnLAoJCQkJJ3RpcCcJCT0+CQknVGhpcyBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VzIGluIHRoZSBDYXJvdXNlbC4gSW1hZ2VzIHdpbGwgYmUgZ2VuZXJhdGVkIGZyb20gdGhlIG9yaWdpbmFsIGltYWdlcyB1cGxvYWRlZC4gSW1hZ2VzIHdpbGwgbm90IGJlIHVwc2NhbGVkIGxhcmdlciB0aGFuIHRoZSBvcmlnaW5hbHMuIFlvdSBtYXkgY2hhbmdlIHRoaXMgYXQgYW55IHRpbWUuJywKCQkJCSdjc3MnCQk9PgkJJ3RleHQtYWxpZ246IHJpZ2h0OycsCgkJCQknYWZ0ZXInCQk9PgkJJ3B4JywKCQkJCSdydWxlcycJCT0+CQkncmVxdWlyZWQnLAoJCQkpICk7CgkJCSovCgkJfQoJCSRyZXR1cm4gLj0gJzwvdGFibGU+PGJyPic7CgoJCS8vIFN1Ym1pdCBidXR0b24KCQkkcmV0dXJuIC49ICRiZWZvcmU7CgkJJHJldHVybiAuPSAkdGhpcy0+X2Zvcm0tPnN1Ym1pdCggJ3NldHRpbmdzX3N1Ym1pdCcsICRzdWJtaXRfYnV0dG9uX3RpdGxlLCAkc2F2ZV9idXR0b25fY2xhc3MgKTsKCQkkcmV0dXJuIC49ICR0aGlzLT5fZm9ybS0+Z2V0KCAnc2V0dGluZ3Nfc3VibWl0JywgJycsICRzYXZlX2J1dHRvbl9jbGFzcyApOyAvLywgJHNldHRpbmdzWyduYW1lJ10sICRzZXR0aW5nc1snY2xhc3NlcyddICk7CgkJJHJldHVybiAuPSAkYWZ0ZXI7CgoJCSRyZXR1cm4gLj0gJHRoaXMtPl9mb3JtLT5lbmQoKTsKCgkJcmV0dXJuICRyZXR1cm47Cgl9IC8vIEVuZCBnZXRfc2V0dGluZ3MoKS4KCQoJCgkKCS8qCWNsZWFyX3ZhbHVlcygpCgkgKgkKCSAqCUNsZWFycyB0aGUgdmFsdWUgb2YgYWxsIGZvcm0gaXRlbXMgc2V0dGluZyB0aGUgdmFsdWUgdG8gYW4gZW1wdHkgc3RyaW5nICcnLgoJICoJCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBjbGVhcl92YWx1ZXMoKSB7CgkJJHRoaXMtPl9mb3JtLT5jbGVhcl92YWx1ZXMoKTsKCQkKCQlyZXR1cm47Cgl9IC8vIEVuZCBjbGVhcl92YWx1ZXMoKS4KCQoJCgkKCS8qCXNldF92YWx1ZSgpCgkgKgkKCSAqCVJlcGxhY2UgdGhlIHZhbHVlIG9mIGEgZm9ybSBpdGVtLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkkaXRlbV9uYW1lCQlOYW1lIG9mIHRoZSBmb3JtIHNldHRpbmcgaXRlbSB0byB1cGRhdGUuCgkgKglAcGFyYW0JCXN0cmluZwkkdmFsdWUJCQlWYWx1ZSB0byBzZXQgdGhlIGl0ZW0gdG8uCgkgKglAcmV0dXJuCQludWxsCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfdmFsdWUoICRpdGVtX25hbWUsICR2YWx1ZSApIHsKCQkkdGhpcy0+X2Zvcm0tPnNldF92YWx1ZSggJGl0ZW1fbmFtZSwgJHZhbHVlICk7CgkJcmV0dXJuOwoJfSAvLyBFbmQgc2V0X3ZhbHVlKCkuCgkKCQp9IC8vIEVuZCBjbGFzcyBwbHVnaW5idWRkeV9zZXR0aW5ncy4KCgoKPz4=
###PACKDATA,FILE_END,/pluginbuddy/classes/settings.php,importbuddy/pluginbuddy/classes/settings.php
###PACKDATA,FILE_START,/pluginbuddy/classes/ui.php,importbuddy/pluginbuddy/classes/ui.php
PD9waHAKCgoKLyoJcGx1Z2luYnVkZHlfdWkgY2xhc3MKICoJCiAqCUhhbmRsZXMgdHlwaWNhbCB1c2VyIGludGVyZmFjZSBpdGVtcyB1c2VkIGluIFdvcmRQcmVzcyBkZXZlbG9wbWVudC4KICoJCiAqCUBhdXRob3IgRHVzdGluIEJvbHRvbgogKglAdmVyc2lvbiAxLjAuMAogKi8KY2xhc3MgcGJfYmFja3VwYnVkZHlfdWkgewoKCXByaXZhdGUgJF90YWJfaW50ZXJmYWNlX3RhZyA9ICcnOwoJCgkKCS8qCXBsdWdpbmJ1ZGR5X3VpLT5zdGFydF9tZXRhYm94KCkKCSAqCQoJICoJU3RhcnRzIGEgbWV0YWJveC4gVXNlIHdpdGggZW5kX21ldGFib3goKS4KCSAqCUBzZWUgcGx1Z2luYnVkZHlfdWktPmVuZF9tZXRhYm94CgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkJCSR0aXRsZQkJCQlUaXRsZSB0byBkaXNwbGF5IGZvciB0aGUgbWV0YWJveC4KCSAqCUBwYXJhbQkJYm9vbGVhbgkJCQkkZWNobwkJCQlFY2hvcyBpZiB0cnVlOyBlbHNlIHJldHVybnMuCgkgKglAcGFyYW0JCWJvb2xlYW4vc3RyaW5nCQkkc21hbGxfb3JfY3NzCQl0cnVlOiBzaXplIGlzIGxpbWl0ZWQgc21hbGxlci4gZmFsc2U6IHNpemUgaXMgbGltaXRlZCBsYXJnZXIuIElmIGEgc3RyaW5nIHRoZW4gaW50ZXJwcmV0ZWQgYXMgQ1NTLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQkJCVJldHVybnMgbnVsbCBpZiAkZWNobyBpcyB0cnVlOyBlbHNlIHJldHVybnMgc3RyaW5nIHdpdGggSFRNTC4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0YXJ0X21ldGFib3goICR0aXRsZSwgJGVjaG8gPSB0cnVlLCAkc21hbGxfb3JfY3NzID0gZmFsc2UgKSB7CgkJaWYgKCAkc21hbGxfb3JfY3NzID09PSBmYWxzZSApIHsgLy8gTGFyZ2Ugc2l6ZS4KCQkJJGNzcyA9ICd3aWR0aDogNzAlOyBtaW4td2lkdGg6IDcyMHB4Oyc7CgkJfSBlbHNlaWYgKCAkc21hbGxfb3JfY3NzID09PSB0cnVlICkgeyAvLyBTbWFsbCBzaXplLgoJCQkkY3NzID0gJ3dpZHRoOiAyMCU7IG1pbi13aWR0aDogMjUwcHg7JzsKCQl9IGVsc2UgeyAvLyBTdHJpbmcgc28gaW50ZXJwcmV0IGFzIENTUy4KCQkJJGNzcyA9ICRzbWFsbF9vcl9jc3M7CgkJfQoJCQoJCSRjc3MgLj0gJyBwYWRkaW5nLXRvcDogMDsgbWFyZ2luLXRvcDogMTBweDsgY3Vyc29yOiBhdXRvOyc7CgkJCgkJJHJlc3BvbnNlID0gJzxkaXYgY2xhc3M9Im1ldGFib3gtaG9sZGVyIHBvc3Rib3giIHN0eWxlPSInIC4gJGNzcyAuICciPgoJCQkJCQk8aDMgY2xhc3M9ImhuZGxlIiBzdHlsZT0iY3Vyc29yOiBhdXRvOyI+PHNwYW4+JyAuICR0aXRsZSAuICc8L3NwYW4+PC9oMz4KCQkJCQkJPGRpdiBjbGFzcz0iaW5zaWRlIj4nOwoJCWlmICggJGVjaG8gPT09IHRydWUgKSB7CgkJCWVjaG8gJHJlc3BvbnNlOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmVzcG9uc2U7CgkJfQoJfSAvLyBFbmQgc3RhcnRfbWV0YWJveCgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfdWktPmVuZF9tZXRhYm94KCkKCSAqCQoJICoJRW5kcyBhIG1ldGFib3guIFVzZSB3aXRoIHN0YXJ0X21ldGFib3goKS4KCSAqCUBzZWUgcGx1Z2luYnVkZHlfdWktPnN0YXJ0X21ldGFib3gKCSAqCQoJICoJQHBhcmFtCQlib29sZWFuCQkkZWNobwkJRWNob3MgaWYgdHJ1ZTsgZWxzZSByZXR1cm5zLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJUmV0dXJucyBudWxsIGlmICRlY2hvIGlzIHRydWU7IGVsc2UgcmV0dXJucyBzdHJpbmcgd2l0aCBIVE1MLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZW5kX21ldGFib3goICRlY2hvID0gdHJ1ZSApIHsKCQkkcmVzcG9uc2UgPSAnCTwvZGl2PgoJCQkJCTwvZGl2Pic7CgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmVzcG9uc2U7CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXNwb25zZTsKCQl9Cgl9IC8vIEVuZCBlbmRfbWV0YWJveCgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfdWktPnRpdGxlKCkKCSAqCQoJICoJRGlzcGxheXMgYSBzdHlsZWQsIHByb3Blcmx5IGZvcm1hdHRlZCB0aXRsZSBmb3IgcGFnZXMuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGl0bGUJCVRpdGxlIHRvIGRpc3BsYXkuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQlXaGV0aGVyIG9yIG5vdCB0byBlY2hvIHRoZSBzdHJpbmcgb3IgcmV0dXJuLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJUmV0dXJucyBudWxsIGlmICRlY2hvIGlzIHRydWU7IGVsc2UgcmV0dXJucyBzdHJpbmcgd2l0aCBIVE1MLgoJICovCglwdWJsaWMgZnVuY3Rpb24gdGl0bGUoICR0aXRsZSwgJGVjaG8gPSB0cnVlICkgewoJCSRyZXR1cm4gPSAnPGgyPjxzcGFuIGNsYXNzPSJiYWNrdXBidWRkeS1pY29uLWRyaXZlIiBzdHlsZT0iZm9udC1zaXplOiAxLjJlbTsgdmVydGljYWwtYWxpZ246IC00cHg7Ij48L3NwYW4+ICcgLiAkdGl0bGUgLiAnPC9oMj48YnIgLz4nOwoJCWlmICggJGVjaG8gPT09IHRydWUgKSB7CgkJCWVjaG8gJHJldHVybjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJldHVybjsKCQl9Cgl9IC8vIEVuZCB0aXRsZSgpLgoJCgkKCQoJLyoJcGx1Z2luYnVkZHlfdWktPmJ1dHRvbigpCgkgKgkKCSAqCURpc3BsYXlzIGEgbmljZSBwcmV0dHkgc3R5bGVkIGJ1dHRvbi4gSG93IG5pY2UuIEFsd2F5cyByZXR1cm5zLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJHVybAkJCQlVUkwgKGhyZWYpIGZvciB0aGUgYnV0dG9uIHRvIGxpbmsgdG8uCgkgKglAcGFyYW0JCXN0cmluZwkJJHRleHQJCQkJVGV4dCB0byBkaXNwbGF5IGluIHRoZSBidXR0b24uCgkgKglAcGFyYW0JCXN0cmluZwkJJHRpdGxlCQkJCU9wdGlvbmFsIHRpdGxlIHRleHQgdG8gZGlzcGxheSBvbiBob3ZlciBpbiB0aGUgdGl0bGUgdGFnLgoJICoJQHBhcmFtCQlib29sZWFuCQkkcHJpbWFyeQkJCShvcHRpb25hbCkgV2hldGhlciBvciBub3QgdGhpcyBpcyBhIHByaW1hcnkgYnV0dG9uLiBQcmltYXJ5IGJ1dHRvbnMgYXJlIGJsdWUgYW5kIHN0cm9uZyB3aGVyZSBkZWZhdWx0IG5vbi1wcmltYXJ5IGlzIGdyZXkgYW5kIGdlbnRsZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkYWRkaXRpb25hbF9jbGFzcwkob3B0aW9uYWwpIEFkZGl0aW9uYWwgQ1NTIGNsYXNzIHRvIGFwcGx5IHRvIGJ1dHRvbi4gVXNlZnVsIGZvciB0aGlja2JveCBvciBvdGhlciBKUyBzdHVmZi4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkaWQJCQkJCShvcHRpb25hbCkgSFRNTCBJRCB0byBhcHBseS4gVXNlZnVsIGZvciBKUy4KCSAqCUByZXR1cm4JCXN0cmluZwkJCQkJCQlIVE1MIHN0cmluZyBmb3IgdGhlIGJ1dHRvbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGJ1dHRvbiggJHVybCwgJHRleHQsICR0aXRsZSA9ICcnLCAkcHJpbWFyeSA9IGZhbHNlLCAkYWRkaXRpb25hbF9jbGFzcyA9ICcnLCAkaWQgPSAnJyApIHsKCQlpZiAoICRwcmltYXJ5ID09PSBmYWxzZSApIHsKCQkJcmV0dXJuICc8YSBjbGFzcz0iYnV0dG9uIHNlY29uZGFyeS1idXR0b24gJyAuICRhZGRpdGlvbmFsX2NsYXNzIC4gJyIgc3R5bGU9Im1hcmdpbi10b3A6IDNweDsiIGlkPSInIC4gJGlkIC4gJyIgdGl0bGU9IicgLiAkdGl0bGUgLiAnIiBocmVmPSInIC4gJHVybCAuICciPicgLiAkdGV4dCAuICc8L2E+JzsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJzxhIGNsYXNzPSJidXR0b24gYnV0dG9uLXByaW1hcnkgJyAuICRhZGRpdGlvbmFsX2NsYXNzIC4gJyIgc3R5bGU9Im1hcmdpbi10b3A6IDNweDsiIGlkPSInIC4gJGlkIC4gJyIgdGl0bGU9IicgLiAkdGl0bGUgLiAnIiBocmVmPSInIC4gJHVybCAuICciPicgLiAkdGV4dCAuICc8L2E+JzsKCQl9Cgl9IC8vIEVuZCBidXR0b24oKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X3VpLT5ub3RlKCkKCSAqCQoJICoJRGlzcGxheSB0ZXh0IGluIGEgc3VidGxlIHdheS4KCSAqCQoJICoJQHBhcmFtCQlzdHJpbmcJCSR0ZXh0CQlUZXh0IG9mIG5vdGUuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQlXaGV0aGVyIG9yIG5vdCB0byBlY2hvIHRoZSBzdHJpbmcgb3IgcmV0dXJuLgoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJUmV0dXJucyBudWxsIGlmICRlY2hvIGlzIHRydWU7IGVsc2UgcmV0dXJucyBzdHJpbmcgd2l0aCBIVE1MLgoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vdGUoICR0ZXh0LCAkZWNobyA9IHRydWUgKSB7CgkJJHJldHVybiA9ICc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPjxpPicgLiAkdGV4dCAuICc8L2k+PC9zcGFuPic7CgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCX0gLy8gRW5kIG5vdGUoKS4KCQoJCgkKCS8qCXBsdWdpbmJ1ZGR5X3VpLT5saXN0X3RhYmxlKCkKCSAqCQoJICoJRGlzcGxheXMgYSBuaWNlIHRhYmxlIHdpdGggbXVsdGlwbGUgY29sdW1ucywgcm93cywgYnVsayBhY3Rpb25zLCBob3ZlciBhY3Rpb25zLCBldGMgc2ltaWxhciB0byBXb3JkUHJlc3MgcG9zdHMgdGFibGUuCgkgKglDdXJyZW50bHkgb25seSBzdXBwb3J0cyBlY2hvIG9mIG91dHB1dC4KCSAqCQoJICoJQHBhcmFtCQlhcnJheQkJJGl0ZW1zCQlBcnJheSBvZiByb3dzIHRvIGRpc3BsYXkuIEVhY2ggcm93IGFycmF5IGNvbnRhaW5zIGFuIGFycmF5IHdpdGggdGhlIGNvbHVtbnMuIFR5cGljYWxseSBzZXQgaW4gY29udHJvbGxlci4KCSAqCQkJCQkJCQkJCUV4OiBhcnJheSggYXJyYXkoICdibHVlJywgJ3JlZCcgKSwgYXJyYXkoICdicm93bicsICdncmVlbicgKSApLgoJICoJCQkJCQkJCQkJSWYgdGhlIHZhbHVlIGZvciBhbiBpdGVtIGlzIGFuIGFycmF5IHRoZW4gdGhlIGZpcnN0IHZhbHVlIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIHJlbCB0YWcgb2YgYW55IGhvdmVyIGFjdGlvbnMuIElmIG5vdAoJICoJCQkJCQkJCQkJYW4gYXJyYXkgdGhlbiB0aGUgdmFsdWUgaXRzZWxmIHdpbGwgYmUgcHV0IGluIHRoZSByZWwgdGFnLiAgSWYgYW4gYXJyYXkgdGhlIHNlY29uZCB2YWx1ZSB3aWxsIGJlIHRoZSBvbmUgZGlzcGxheWVkIGluIHRoZSBjb2x1bW4uCgkgKgkJCQkJCQkJCQlCYWNrdXBCdWRkeSBuZWVkZWQgdGhlIGRpc3BsYXllZCBpdGVtIGluIHRoZSBjb2x1bW4gdG8gYmUgYSBsaW5rIChmb3IgZG93bmxvYWRpbmcgYmFja3VwcykgYnV0IHRoZSBiYWNrdXAgZmlsZSBhcyB0aGUgcmVsLgoJICoJQHBhcmFtCQlhcnJheQkJJHNldHRpbmdzCUFycmF5IG9mIGFsbCB0aGUgdmFyaW91cyBzZXR0aW5ncy4gTWVyZ2VkIHdpdGggZGVmYXVsdHMgcHJpb3IgdG8gdXNhZ2UuIFR5cGljYWxseSBzZXQgaW4gdmlldy4KCSAqCQkJCQkJCQkJCVNlZSAkZGVmYXVsdF9zZXR0aW5ncyBhdCBiZWdpbm5pbmcgb2YgZnVuY3Rpb24gZm9yIGF2YWlsYWJsZSBzZXR0aW5ncy4KCSAqCQkJCQkJCQkJCUV4OiAkc2V0dGluZ3MgPSBhcnJheSgKCSAqCQkJCQkJCQkJCQkJJ2FjdGlvbicJCT0+CQlwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpLAoJICoJCQkJCQkJCQkJCQknY29sdW1ucycJCT0+CQlhcnJheSggJ0dyb3VwIE5hbWUnLCAnSW1hZ2VzJywgJ1Nob3J0Y29kZScgKSwKCSAqCQkJCQkJCQkJCQkJJ2hvdmVyX2FjdGlvbnMnCT0+CQlhcnJheSggJ2VkaXQnID0+ICdFZGl0IEdyb3VwIFNldHRpbmdzJyApLAkJLy8gU2x1ZyBjYW4gYmUgYSBVUkwuIEluIHRoaXMgY2FzZSB0aGUgdmFsdWUgb2YgdGhlIGhvdmVyZWQgcm93IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgVVJMLiBUT0RPOiBNYWtlIHRoZSBmaXJzdCBob3ZlciBhY3Rpb24gYmUgdGhlIGxpbmsgZm9yIHRoZSBmaXJzdCBsaXN0ZWQgaXRlbS4KCSAqCQkJCQkJCQkJCQkJJ2J1bGtfYWN0aW9ucycJPT4JCWFycmF5KCAnZGVsZXRlX2ltYWdlcycgPT4gJ0RlbGV0ZScgKSwKCSAqCQkJCQkJCQkJCQkpOwoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxpc3RfdGFibGUoICRpdGVtcywgJHNldHRpbmdzICkgewoJCSRkZWZhdWx0X3NldHRpbmdzID0gYXJyYXkoCgkJCQkJCQkJJ2NvbHVtbnMnCQkJCQk9PglhcnJheSgpLAoJCQkJCQkJCSdob3Zlcl9hY3Rpb25zJwkJCQk9PglhcnJheSgpLAoJCQkJCQkJCSdidWxrX2FjdGlvbnMnCQkJCT0+CWFycmF5KCksCgkJCQkJCQkJJ2hvdmVyX2FjdGlvbl9jb2x1bW5fa2V5Jwk9PgknJywJCQkvLyBpbnQgb2YgY29sdW1uIHRvIHNldCB2YWx1ZT0gaW4gVVJMIGFuZCByZWwgdGFnPSBmb3IgdXNpbmcgaW4gSlMuCgkJCQkJCQkJJ2FjdGlvbicJCQkJCT0+CScnLAoJCQkJCQkJCSdyZW9yZGVyJwkJCQkJPT4JJycsCgkJCQkJCQkJJ2FmdGVyX2J1bGsnCQkJCT0+CScnLAoJCQkJCQkJCSdjc3MnCQkJCQkJPT4JJycsCgkJCQkJCQkpOwoJCQoJCS8vIE1lcmdlIGRlZmF1bHRzLgoJCSRzZXR0aW5ncyA9IGFycmF5X21lcmdlKCAkZGVmYXVsdF9zZXR0aW5ncywgJHNldHRpbmdzICk7CgkJCgkJLy8gRnVuY3Rpb24gdG8gaXRlcmF0ZSB0aHJvdWdoIGJ1bGsgYWN0aW9ucy4gVG9wIGFuZCBib3R0b20gc2V0IGFyZSB0aGUgc2FtZS4KCQlpZiAoICFmdW5jdGlvbl9leGlzdHMoICdidWxrX2FjdGlvbnMnICkgKSB7CgkJCWZ1bmN0aW9uIGJ1bGtfYWN0aW9ucyggJHNldHRpbmdzLCAkaG92ZXJfbm90ZSA9IGZhbHNlICkgewoJCQkJaWYgKCBjb3VudCggJHNldHRpbmdzWydidWxrX2FjdGlvbnMnXSApID4gMCApIHsKCQkJCQllY2hvICc8ZGl2IHN0eWxlPSJwYWRkaW5nLWJvdHRvbTogM3B4OyBwYWRkaW5nLXRvcDogM3B4OyI+JzsKCQkJCQlpZiAoIGNvdW50KCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddICkgPT0gMSApIHsKCQkJCQkJZm9yZWFjaCggJHNldHRpbmdzWydidWxrX2FjdGlvbnMnXSBhcyAkYWN0aW9uX3NsdWcgPT4gJGFjdGlvbl90aXRsZSApIHsKCQkJCQkJCWVjaG8gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImJ1bGtfYWN0aW9uIiB2YWx1ZT0iJyAuICRhY3Rpb25fc2x1ZyAuICciPic7CgkJCQkJCQllY2hvICc8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJkb19idWxrX2FjdGlvbiIgdmFsdWU9IicgLiAkYWN0aW9uX3RpdGxlIC4gJyIgY2xhc3M9ImJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIGJhY2t1cGJ1ZGR5LWRvX2J1bGtfYWN0aW9uIj4nOwoJCQkJCQl9CgkJCQkJfSBlbHNlIHsKCQkJCQkJZWNobyAnPHNlbGVjdCBuYW1lPSJidWxrX2FjdGlvbiIgY2xhc3M9ImFjdGlvbnMiPic7CgkJCQkJCWZvcmVhY2ggKCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddIGFzICRhY3Rpb25fc2x1ZyA9PiAkYWN0aW9uX3RpdGxlICkgewoJCQkJCQkJZWNobyAnPG9wdGlvbj5CdWxrIEFjdGlvbnM8L29wdGlvbj4nOwoJCQkJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJyAuICRhY3Rpb25fc2x1ZyAuICciPicgLiAkYWN0aW9uX3RpdGxlIC4gJzwvb3B0aW9uPic7CgkJCQkJCX0KCQkJCQkJZWNobyAnPC9zZWxlY3Q+ICZuYnNwOyc7CgkJCQkJCS8vZWNobyBzZWxmOjpidXR0b24oICcjJywgJ0FwcGx5JyApOwoJCQkJCQllY2hvICc8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJkb19idWxrX2FjdGlvbiIgdmFsdWU9IkFwcGx5IiBjbGFzcz0iYnV0dG9uIHNlY29uZGFyeS1idXR0b24gYmFja3VwYnVkZHktZG9fYnVsa19hY3Rpb24iPic7CgkJCQkJfQoJCQkJCWVjaG8gJyZuYnNwOyZuYnNwOyc7CgkJCQkJZWNobyAkc2V0dGluZ3NbJ2FmdGVyX2J1bGsnXTsKCQkJCQkKCQkJCQllY2hvICc8ZGl2IGNsYXNzPSJhbGlnbnJpZ2h0IGFjdGlvbnMiPic7CgkJCQkJaWYgKCAkaG92ZXJfbm90ZSA9PT0gdHJ1ZSApIHsKCQkJCQkJZWNobyBwYl9iYWNrdXBidWRkeTo6JHVpLT5ub3RlKCAnSG92ZXIgb3ZlciBpdGVtcyBhYm92ZSBmb3IgYWRkaXRpb25hbCBvcHRpb25zLicgKTsKCQkJCQl9CgkJCQkJaWYgKCAkc2V0dGluZ3NbJ3Jlb3JkZXInXSAhPSAnJyApIHsKCQkJCQkJZWNobyAnCTxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InNhdmVfb3JkZXIiIGlkPSJzYXZlX29yZGVyIiB2YWx1ZT0iU2F2ZSBPcmRlciIgY2xhc3M9ImJ1dHRvbi1zZWNvbmRhcnkiIC8+JzsKCQkJCQl9CgkJCQkJZWNobyAnPC9kaXY+JzsKCQkJCQkKCQkJCQllY2hvICc8L2Rpdj4nOwoJCQkJfQoJCQl9IC8vIEVuZCBzdWJmdW5jdGlvbiBidWxrX2FjdGlvbnMoKS4KCQl9IC8vIEVuZCBpZiBmdW5jdGlvbiBkb2VzIG5vdCBleGlzdC4KCQkKCQlpZiAoICRzZXR0aW5nc1snYWN0aW9uJ10gIT0gJycgKSB7CgkJCWVjaG8gJzxmb3JtIG1ldGhvZD0icG9zdCIgYWN0aW9uPSInIC4gJHNldHRpbmdzWydhY3Rpb24nXSAuICciPic7CgkJCXBiX2JhY2t1cGJ1ZGR5Ojpub25jZSgpOwoJCQlpZiAoICRzZXR0aW5nc1sncmVvcmRlciddICE9ICcnICkgewoJCQkJZWNobyAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ib3JkZXIiIHZhbHVlPSIiIGlkPSJwYl9vcmRlciI+JzsKCQkJfQoJCX0KCQkKCQkKCQllY2hvICc8ZGl2IHN0eWxlPSJ3aWR0aDogNzAlOyBtaW4td2lkdGg6IDcyMHB4OyAnIC4gJHNldHRpbmdzWydjc3MnXSAuICciPic7CgkJCgkJLy8gRGlzcGxheSBidWxrIGFjdGlvbnMgKHRvcCkuCgkJYnVsa19hY3Rpb25zKCAkc2V0dGluZ3MgKTsKCQkKCQllY2hvICc8dGFibGUgY2xhc3M9IndpZGVmYXQiJzsKCQllY2hvICcgaWQ9InRlc3QiPic7CgkJZWNobyAnCQk8dGhlYWQ+CgkJCQkJPHRyIGNsYXNzPSJ0aGVhZCI+JzsKCQlpZiAoIGNvdW50KCAkc2V0dGluZ3NbJ2J1bGtfYWN0aW9ucyddICkgPiAwICkgewoJCQllY2hvJwkJPHRoIHNjb3BlPSJjb2wiIGNsYXNzPSJjaGVjay1jb2x1bW4iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrLWFsbC1lbnRyaWVzIiAvPjwvdGg+JzsKCQl9CgkJZm9yZWFjaCAoICRzZXR0aW5nc1snY29sdW1ucyddIGFzICRjb2x1bW4gKSB7CgkJCWVjaG8gJzx0aD4nIC4gJGNvbHVtbiAuICc8L3RoPic7CgkJfQoJCWVjaG8gJwkJPC90cj4KCQkJCTwvdGhlYWQ+CgkJCTx0Zm9vdD4KCQkJCTx0ciBjbGFzcz0idGhlYWQiPic7CgkJaWYgKCBjb3VudCggJHNldHRpbmdzWydidWxrX2FjdGlvbnMnXSApID4gMCApIHsKCQkJZWNobycJPHRoIHNjb3BlPSJjb2wiIGNsYXNzPSJjaGVjay1jb2x1bW4iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImNoZWNrLWFsbC1lbnRyaWVzIiAvPjwvdGg+JzsKCQl9CgkJZm9yZWFjaCAoICRzZXR0aW5nc1snY29sdW1ucyddIGFzICRjb2x1bW4gKSB7CgkJCWVjaG8gJzx0aD4nIC4gJGNvbHVtbiAuICc8L3RoPic7CgkJfQoJCWVjaG8gJwk8L3RyPgoJCQk8L3Rmb290PgoJCQk8dGJvZHknOwoJCWlmICggJHNldHRpbmdzWydyZW9yZGVyJ10gIT0gJycgKSB7CgkJCWVjaG8gJyBjbGFzcz0icGJfcmVvcmRlciInOwoJCX0KCQllY2hvICc+JzsKCQkKCQkvLyBMT09QIFRIUk9VR0ggRUFDSCBST1cuCgkJZm9yZWFjaCAoIChhcnJheSkkaXRlbXMgYXMgJGl0ZW1faWQgPT4gJGl0ZW0gKSB7CgkJCWVjaG8gJwk8dHIgY2xhc3M9ImVudHJ5LXJvdyBhbHRlcm5hdGUiIGlkPSJwYl9yb3dpdGVtLScgLiAkaXRlbV9pZCAuICciPic7CgkJCWlmICggY291bnQoICRzZXR0aW5nc1snYnVsa19hY3Rpb25zJ10gKSA+IDAgKSB7CgkJCQllY2hvJwk8dGggc2NvcGU9InJvdyIgY2xhc3M9ImNoZWNrLWNvbHVtbiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJpdGVtc1tdIiBjbGFzcz0iZW50cmllcyIgdmFsdWU9IicgLiAkaXRlbV9pZCAuICciPjwvdGg+JzsKCQkJfQoJCQllY2hvICcJCTx0ZD4nOwoJCQkKCQkJaWYgKCBpc19hcnJheSggJGl0ZW1bJzAnXSApICkgewoJCQkJaWYgKCAkaXRlbVsnMCddWzFdID09ICcnICkgewoJCQkJCWVjaG8gJyZuYnNwOyc7CgkJCQl9IGVsc2UgewoJCQkJCWVjaG8gJGl0ZW1bJzAnXVsxXTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWlmICggJGl0ZW1bJzAnXSA9PSAnJyApIHsKCQkJCQllY2hvICcmbmJzcDsnOwoJCQkJfSBlbHNlIHsKCQkJCQllY2hvICRpdGVtWycwJ107CgkJCQl9CgkJCX0KCQkJCgkJCWVjaG8gJwkJCTxkaXYgY2xhc3M9InJvdy1hY3Rpb25zIiBzdHlsZT0ibWFyZ2luLXRvcDogMTBweDsiPic7IC8vICBzdHlsZT0ibWFyZ2luOjA7IHBhZGRpbmc6MDsiCgkJCSRpID0gMDsKCQkJZm9yZWFjaCAoICRzZXR0aW5nc1snaG92ZXJfYWN0aW9ucyddIGFzICRhY3Rpb25fc2x1ZyA9PiAkYWN0aW9uX3RpdGxlICkgeyAvLyBEaXNwbGF5IGFsbCBob3ZlciBhY3Rpb25zLgoJCQkJJGkrKzsKCQkJCWlmICggJHNldHRpbmdzWydob3Zlcl9hY3Rpb25fY29sdW1uX2tleSddICE9ICcnICkgewoJCQkJCWlmICggaXNfYXJyYXkoICRpdGVtWyRzZXR0aW5nc1snaG92ZXJfYWN0aW9uX2NvbHVtbl9rZXknXV0gKSApIHsKCQkJCQkJJGhvdmVyX2FjdGlvbl9jb2x1bW5fdmFsdWUgPSAkaXRlbVskc2V0dGluZ3NbJ2hvdmVyX2FjdGlvbl9jb2x1bW5fa2V5J11dWzBdOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRob3Zlcl9hY3Rpb25fY29sdW1uX3ZhbHVlID0gJGl0ZW1bJHNldHRpbmdzWydob3Zlcl9hY3Rpb25fY29sdW1uX2tleSddXTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSRob3Zlcl9hY3Rpb25fY29sdW1uX3ZhbHVlID0gJyc7CgkJCQl9CgkJCQkKCQkJCWlmICggc3Ryc3RyKCAkYWN0aW9uX3NsdWcsICdodHRwJyApID09PSBmYWxzZSApIHsgLy8gV29yZCBob3ZlciBhY3Rpb24gc2x1Zy4KCQkJCQkkaG92ZXJfbGluaz0gcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCkgLiAnJicgLiAkYWN0aW9uX3NsdWcgLiAnPScgLiAkaXRlbV9pZCAuICcmdmFsdWU9JyAuICRob3Zlcl9hY3Rpb25fY29sdW1uX3ZhbHVlOwoJCQkJfSBlbHNlIHsgLy8gVVJMIGhvdmVyIGFjdGlvbiBzbHVnIHNvIGp1c3QgYXBwZW5kIHZhbHVlIHRvIFVSTC4KCQkJCQkkaG92ZXJfbGluayA9ICRhY3Rpb25fc2x1ZyAuICRob3Zlcl9hY3Rpb25fY29sdW1uX3ZhbHVlOwoJCQkJfQoJCQkJCgkJCQllY2hvICc8YSBocmVmPSInIC4gJGhvdmVyX2xpbmsgLiAnIiBjbGFzcz0icGJfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnX2hvdmVyYWN0aW9uXycgLiAkYWN0aW9uX3NsdWcgLiAnIiByZWw9IicgLiAkaG92ZXJfYWN0aW9uX2NvbHVtbl92YWx1ZSAuICciPicgLiAkYWN0aW9uX3RpdGxlIC4gJzwvYT4nOwoJCQkJaWYgKCAkaSA8IGNvdW50KCAkc2V0dGluZ3NbJ2hvdmVyX2FjdGlvbnMnXSApICkgewoJCQkJCWVjaG8gJyAmbmJzcDt8Jm5ic3A7ICc7CgkJCQl9CgkJCX0KCQkJZWNobyAnCQkJPC9kaXY+CgkJCQkJCTwvdGQ+JzsKCQkJCgkJCQoJCQlpZiAoICRzZXR0aW5nc1sncmVvcmRlciddICE9ICcnICkgewoJCQkJJGNvdW50ID0gY291bnQoICRpdGVtICkgKyAxOyAvLyBFeHRyYSByb3cgZm9yIHJlb3JkZXJpbmcuCgkJCX0gZWxzZSB7CgkJCQkkY291bnQgPSBjb3VudCggJGl0ZW0gKTsKCQkJfQoJCQkKCQkJLy8gTE9PUCBUSFJPVUdIIENPTFVNTlMgRk9SIFRISVMgUk9XLgoJCQlmb3IgKCAkaSA9IDE7ICRpIDwgJGNvdW50OyAkaSsrICkgewoJCQkJaWYgKCAhIGlzc2V0KCAkaXRlbVskaV0gKSApIHsgY29udGludWU7IH0gLy8gVGhpcyByb3cgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaW5kZXgtYmFzZWQgaXRlbS4gIEl0IGlzIHByb2JhYmx5IGEgbmFtZWQga2V5IG5vdCBmb3IgdXNlIGluIHRhYmxlPwoJCQkJZWNobyAnPHRkJzsKCQkJCWlmICggJHNldHRpbmdzWydyZW9yZGVyJ10gIT0gJycgKSB7CgkJCQkJaWYgKCAkaSA9PSAkc2V0dGluZ3NbJ3Jlb3JkZXInXSApIHsKCQkJCQkJZWNobyAnIGNsYXNzPSJwYl9kcmFnaGFuZGxlIiBhbGlnbj0iY2VudGVyIic7CgkJCQkJfQoJCQkJfQoJCQkJZWNobyAnPic7CgkJCQkKCQkJCWlmICggKCAkc2V0dGluZ3NbJ3Jlb3JkZXInXSAhPSAnJyApICYmICggJGkgPT0gKCAkc2V0dGluZ3NbJ3Jlb3JkZXInXSApICkgKSB7CgkJCQkJZWNobyAnPGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9wbHVnaW5idWRkeS9pbWFnZXMvZHJhZ2hhbmRsZS5wbmciIGFsdD0iQ2xpY2sgYW5kIGRyYWcgdG8gcmVvcmRlciI+JzsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCAkaXRlbVskaV0gPT0gJycgKSB7CgkJCQkJCWVjaG8gJyZuYnNwOyc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZWNobyAkaXRlbVskaV07CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQllY2hvICc8L3RkPic7CgkJCX0KCgkJCWVjaG8gJwk8L3RyPic7CgkJfQoKCQllY2hvICcJPC90Ym9keT4nOwoJCWVjaG8gJzwvdGFibGU+JzsKCQkKCQkvLyBEaXNwbGF5IGJ1bGsgYWN0aW9ucyAoYm90dG9tKS4KCQlidWxrX2FjdGlvbnMoICRzZXR0aW5ncywgdHJ1ZSApOwoJCQoJCWVjaG8gJzwvZGl2Pic7CgkJaWYgKCAkc2V0dGluZ3NbJ2FjdGlvbiddICE9ICcnICkgewoJCQllY2hvICc8L2Zvcm0+JzsKCQl9Cgl9IC8vIEVuZCBsaXN0X3RhYmxlKCkuCgkKCQoJLyoqCgkgKglwYl9iYWNrdXBidWRkeTo6Z2V0X2ZlZWQoKQoJICoKCSAqCUdldHMgYW4gUlNTIG9yIG90aGVyIGZlZWQgYW5kIGluc2VydHMgaXQgYXMgYSBsaXN0IG9mIGxpbmtzLi4uCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSRmZWVkCQlVUkwgdG8gdGhlIGZlZWQuCgkgKglAcGFyYW0JCWludAkJCSRsaW1pdAkJTnVtYmVyIG9mIGl0ZW1zIHRvIHJldHJpZXZlLgoJICoJQHBhcmFtCQlzdHJpbmcJCSRhcHBlbmQJCUhUTUwgdG8gaW5jbHVkZSBpbiB0aGUgbGlzdC4gU2hvdWxkIHVzdWFsbHkgYmUgPGxpPiBpdGVtcyBpbmNsdWRpbmcgdGhlIDxsaT4gY29kZS4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkcmVwbGFjZQlTdHJpbmcgdG8gcmVwbGFjZSBpbiBldmVyeSB0aXRsZSByZXR1cm5lZC4gaWUgdHdpdHRlciBpbmNsdWRlcyB5b3VyIG93biB1c2VybmFtZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZS4KCSAqCUByZXR1cm4JCXN0cmluZwoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X2ZlZWQoICRmZWVkLCAkbGltaXQsICRhcHBlbmQgPSAnJywgJHJlcGxhY2UgPSAnJyApIHsKCQkkcmV0dXJuID0gJyc7CgkJCgkJJGZlZWRfaHRtbCA9IGdldF90cmFuc2llbnQoIG1kNSggJGZlZWQgKSApOwoJCQoJCWlmICggZmFsc2UgPT09ICRmZWVkX2h0bWwgKSB7CgkJCSRmZWVkX2h0bWwgPSAnJzsKCQkJcmVxdWlyZV9vbmNlKEFCU1BBVEguV1BJTkMuJy9mZWVkLnBocCcpOyAgCgkJCSRyc3MgPSBmZXRjaF9mZWVkKCAkZmVlZCApOwoJCQlpZiAoIGlzX3dwX2Vycm9yKCAkcnNzICkgKSB7CgkJCQkkcmV0dXJuIC49ICd7VGVtcG9yYXJpbHkgdW5hYmxlIHRvIGxvYWQgZmVlZC59JzsKCQkJCXJldHVybiAkcmV0dXJuOwoJCQl9CgkJCSRtYXhpdGVtcyA9ICRyc3MtPmdldF9pdGVtX3F1YW50aXR5KCAkbGltaXQgKTsgLy8gTGltaXQgCgkJCSRyc3NfaXRlbXMgPSAkcnNzLT5nZXRfaXRlbXMoMCwgJG1heGl0ZW1zKTsgCgkJfQoJCQoJCSRyZXR1cm4gLj0gJzx1bCBjbGFzcz0icGx1Z2luYnVkZHktbm9kZWNvciIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+JzsKCgkJCgkJaWYgKCAkZmVlZF9odG1sID09ICcnICkgewoJCQlmb3JlYWNoICggKGFycmF5KSAkcnNzX2l0ZW1zIGFzICRpdGVtICkgewoJCQkJJGZlZWRfaHRtbCAuPSAnPGxpIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ij48YSBocmVmPSInIC4gJGl0ZW0tPmdldF9wZXJtYWxpbmsoKSAuICciIHRhcmdldD0iX25ldyI+JzsKCQkJCSR0aXRsZSA9ICAkaXRlbS0+Z2V0X3RpdGxlKCk7IC8vLCBFTlRfTk9RVU9URVMsICdVVEYtOCcpOwoJCQkJaWYgKCAkcmVwbGFjZSAhPSAnJyApIHsKCQkJCQkkdGl0bGUgPSBzdHJfcmVwbGFjZSggJHJlcGxhY2UsICcnLCAkdGl0bGUgKTsKCQkJCX0KCQkJCWlmICggc3RybGVuKCAkdGl0bGUgKSA8IDMwICkgewoJCQkJCSRmZWVkX2h0bWwgLj0gJHRpdGxlOwoJCQkJfSBlbHNlIHsKCQkJCQkkZmVlZF9odG1sIC49IHN1YnN0ciggJHRpdGxlLCAwLCAzMiApIC4gJyAuLi4nOwoJCQkJfQoJCQkJJGZlZWRfaHRtbCAuPSAnPC9hPjwvbGk+JzsKCQkJfQoJCQlzZXRfdHJhbnNpZW50KCBtZDUoICRmZWVkICksICRmZWVkX2h0bWwsIDMwMCApOyAvLyBleHBpcmVzIGluIDMwMHNlY3MgYWthIDVtaW4KCQl9IGVsc2UgewoJCQkvL2VjaG8gJ0NBQ0hFRCc7CgkJfQoJCSRyZXR1cm4gLj0gJGZlZWRfaHRtbDsKCQkKCQkkcmV0dXJuIC49ICRhcHBlbmQ7CgkJJHJldHVybiAuPSAnPC91bD4nOwoJCgkJCgkJcmV0dXJuICRyZXR1cm47Cgl9IC8vIEVuZCBnZXRfZmVlZCgpLgoJCgkKCQoJLyoqCgkgKglwYl9iYWNrdXBidWRkeTo6dGlwKCkKCSAqCgkgKglEaXNwbGF5cyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgd2hlbiB0aGV5IGhvdmVyIG92ZXIgdGhlIHF1ZXN0aW9uIG1hcmsuIEdyYWNlZnVsbHkgZmFsbHMgYmFjayB0byBub3JtYWwgdG9vbHRpcC4KCSAqCUhUTUwgaXMgc3VwcG9zZWQgd2l0aGluIHRvb2x0aXBzLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbWVzc2FnZQkJQWN0dWFsIG1lc3NhZ2UgdG8gc2hvdyB0byB1c2VyLgoJICoJQHBhcmFtCQlzdHJpbmcJCSR0aXRsZQkJCVRpdGxlIG9mIG1lc3NhZ2UgdG8gc2hvdyB0byB1c2VyLiBUaGlzIGlzIGRpc3BsYXllZCBhdCB0b3Agb2YgdGlwIGluIGJpZ2dlciBsZXR0ZXJzLiBEZWZhdWx0IGlzIGJsYW5rLiAob3B0aW9uYWwpCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvX3RpcAkJV2hldGhlciB0byBlY2hvIHRoZSB0aXAgKGRlZmF1bHQ7IHRydWUpLCBvciByZXR1cm4gdGhlIHRpcCAoZmFsc2UpLiAob3B0aW9uYWwpCgkgKglAcmV0dXJuCQlzdHJpbmcvbnVsbAkJCQkJSWYgbm90IGVjaG9pbmcgdGlwIHRoZW4gdGhlIHN0cmluZyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGVjaG9pbmcgdGhlcmUgaXMgbm8gcmV0dXJuLgoJICovCglwdWJsaWMgZnVuY3Rpb24gdGlwKCAkbWVzc2FnZSwgJHRpdGxlID0gJycsICRlY2hvX3RpcCA9IHRydWUgKSB7CgkJJHRpcCA9ICcgPGEgY2xhc3M9InBsdWdpbmJ1ZGR5X3RpcCIgdGl0bGU9IicgLiAkdGl0bGUgLiAnIC0gJyAuICRtZXNzYWdlIC4gJyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9wbHVnaW5idWRkeS9pbWFnZXMvcGx1Z2luYnVkZHlfdGlwLnBuZyIgYWx0PSIoPykiIC8+PC9hPic7CgkJaWYgKCAkZWNob190aXAgPT09IHRydWUgKSB7CgkJCWVjaG8gJHRpcDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHRpcDsKCQl9Cgl9IC8vIEVuZCB0aXAoKS4KCQoJCgkKCS8qKgoJICoJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCkKCSAqCgkgKglEaXNwbGF5cyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgYXQgdGhlIHRvcCBvZiB0aGUgcGFnZSB3aGVuIGluIHRoZSBkYXNoYm9hcmQuCgkgKgoJICoJQHBhcmFtCQlzdHJpbmcJCSRtZXNzYWdlCQlNZXNzYWdlIHlvdSB3YW50IHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlcnJvcgkJCU9QVElPTkFMISB0cnVlIGluZGljYXRlcyB0aGlzIGFsZXJ0IGlzIGFuIGVycm9yIGFuZCBkaXNwbGF5cyBhcyByZWQuIERlZmF1bHQ6IGZhbHNlCgkgKglAcGFyYW0JCWludAkJCSRlcnJvcl9jb2RlCQlPUFRJT05BTCEgRXJyb3IgY29kZSBudW1iZXIgdG8gdXNlIGluIGxpbmtpbmcgaW4gdGhlIHdpa2kgZm9yIGVhc3kgcmVmZXJlbmNlLgoJICoJQHJldHVybgkJbnVsbAoJICovCglwdWJsaWMgZnVuY3Rpb24gYWxlcnQoICRtZXNzYWdlLCAkZXJyb3IgPSBmYWxzZSwgJGVycm9yX2NvZGUgPSAnJywgJHJlbF90YWcgPSAnJyApIHsKCQkkbG9nX2Vycm9yID0gZmFsc2U7CgoJCWVjaG8gJzxkaXYgaWQ9Im1lc3NhZ2UiIHN0eWxlPSJwYWRkaW5nOiA5cHg7IiByZWw9IicgLiAkcmVsX3RhZyAuICciIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9hbGVydCAnOwoJCWlmICggJGVycm9yID09PSBmYWxzZSApIHsKCQkJZWNobyAndXBkYXRlZCBmYWRlJzsKCQl9IGVsc2UgewoJCQllY2hvICdlcnJvcic7CgkJCSRsb2dfZXJyb3IgPSB0cnVlOwoJCX0KCQlpZiAoICRlcnJvcl9jb2RlICE9ICcnICkgewoJCQkkbWVzc2FnZSAuPSAnIDxhIGhyZWY9Imh0dHA6Ly9pdGhlbWVzLmNvbS9jb2RleC9wYWdlL0JhY2t1cEJ1ZGR5Ol9FcnJvcl9Db2RlcyMnIC4gJGVycm9yX2NvZGUgLiAnIiB0YXJnZXQ9Il9uZXciPjxpPicgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICduYW1lJyApIC4gJyBFcnJvciBDb2RlICcgLiAkZXJyb3JfY29kZSAuICcgLSBDbGljayBmb3IgbW9yZSBkZXRhaWxzLjwvaT48L2E+JzsKCQkJJGxvZ19lcnJvciA9IHRydWU7CgkJfQoJCWlmICggJGxvZ19lcnJvciA9PT0gdHJ1ZSApIHsKCQkJcGJfYmFja3VwYnVkZHk6OmxvZyggJG1lc3NhZ2UgLiAnIEVycm9yIENvZGU6ICcgLiAkZXJyb3JfY29kZSwgJ2Vycm9yJyApOwoJCX0KCQllY2hvICciID4nIC4gJG1lc3NhZ2UgLiAnPC9kaXY+JzsKCX0gLy8gRW5kIGFsZXJ0KCkuCgkKCQoJCgkvKioKCSAqCXBiX2JhY2t1cGJ1ZGR5OjpkaXNhbGVydCgpCgkgKgoJICoJRGlzcGxheXMgYSBESVNNSVNTQUJMRSBtZXNzYWdlIHRvIHRoZSB1c2VyIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2Ugd2hlbiBpbiB0aGUgZGFzaGJvYXJkLgoJICoKCSAqCUBwYXJhbQkJc3RyaW5nCQkkbWVzc2FnZQkJTWVzc2FnZSB5b3Ugd2FudCB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLgoJICoJQHBhcmFtCQlib29sZWFuCQkkZXJyb3IJCQlPUFRJT05BTCEgdHJ1ZSBpbmRpY2F0ZXMgdGhpcyBhbGVydCBpcyBhbiBlcnJvciBhbmQgZGlzcGxheXMgYXMgcmVkLiBEZWZhdWx0OiBmYWxzZQoJICoJQHBhcmFtCQlpbnQJCQkkZXJyb3JfY29kZQkJT1BUSU9OQUwhIEVycm9yIGNvZGUgbnVtYmVyIHRvIHVzZSBpbiBsaW5raW5nIGluIHRoZSB3aWtpIGZvciBlYXN5IHJlZmVyZW5jZS4KCSAqCUByZXR1cm4JCW51bGwKCSAqLwoJcHVibGljIGZ1bmN0aW9uIGRpc2FsZXJ0KCAkdW5pcXVlX2lkLCAkbWVzc2FnZSwgJGVycm9yID0gZmFsc2UgKSB7CgkJCgkJaWYgKCAhIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ2Rpc2FsZXJ0cyddWyR1bmlxdWVfaWRdICkgKSB7CgkJCSRtZXNzYWdlID0gJzxhIHN0eWxlPSJmbG9hdDogcmlnaHQ7IiBjbGFzcz0icGJfYmFja3VwYnVkZHlfZGlzYWxlcnQiIGhyZWY9IiMiIHRpdGxlPSInIC4gX18oICdEaXNtaXNzIHRoaXMgYWxlcnQuIFVuaGlkZSBkaXNtaXNzZWQgYWxlcnRzIG9uIHRoZSBTZXR0aW5ncyBwYWdlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnZGlzYWxlcnQnICkgLiAnIj48Yj4nIC4gX18oICdEaXNtaXNzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9iPjwvYT48ZGl2IHN0eWxlPSJtYXJnaW4tcmlnaHQ6IDYwcHg7Ij4nIC4gJG1lc3NhZ2UgLiAnPC9kaXY+JzsKCQkJJHRoaXMtPmFsZXJ0KCAkbWVzc2FnZSwgJGVycm9yLCAnJywgJHVuaXF1ZV9pZCApOwoJCX0gZWxzZSB7CgkJCWVjaG8gJzwhLS0gUHJldmlvdXNseSBEaXNtaXNzZWQgQWxlcnQ6IGAnIC4gaHRtbGVudGl0aWVzKCAkbWVzc2FnZSApIC4gJ2AgLS0+JzsKCQl9CgkJCgkJcmV0dXJuOwoJCQoJfSAvLyBFbmQgYWxlcnQoKS4KCQoJCgkKCS8qKgoJICoJcGJfYmFja3VwYnVkZHk6OnZpZGVvKCkKCSAqCgkgKglEaXNwbGF5cyBhIFlvdVR1YmUgdmlkZW8gdG8gdGhlIHVzZXIgd2hlbiB0aGV5IGhvdmVyIG92ZXIgdGhlIHF1ZXN0aW9uIHZpZGVvIG1hcmsuCgkgKglIVE1MIGlzIHN1cHBvc2VkIHdpdGhpbiB0b29sdGlwcy4KCSAqCgkgKglAcGFyYW0JCXN0cmluZwkJJHZpZGVvX2tleQkJWW91VHViZSB2aWRlbyBrZXkgZnJvbSB0aGUgVVJMID92PVZJREVPX0tFWV9IRVJFICAtLSBUbyBqdW1wIHRvIGEgY2VydGFpbiB0aW1lc3RhbXAgYWRkICNTRUNPTkRTIHRvIHRoZSBlbmQgb2YgdGhlIGtleSwgd2hlcmUgU0VDT05EUyBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgaW50byB0aGUgdmlkZW8gdG8gc3RhcnQgYXQuIEV4YW1wbGUgdG8gc3RhcnQgNjUgc2Vjb25kcyBpbnRvIGEgdmlkZW86IDlaSFdHakJyODRzIzY1LiBUaGlzIG11c3QgYmUgaW4gc2Vjb25kcyBmb3JtYXQuCgkgKglAcGFyYW0JCXN0cmluZwkJJHRpdGxlCQkJVGl0bGUgb2YgbWVzc2FnZSB0byBzaG93IHRvIHVzZXIuIFRoaXMgaXMgZGlzcGxheWVkIGF0IHRvcCBvZiB0aXAgaW4gYmlnZ2VyIGxldHRlcnMuIERlZmF1bHQgaXMgYmxhbmsuIChvcHRpb25hbCkKCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGVjaG9fdGlwCQlXaGV0aGVyIHRvIGVjaG8gdGhlIHRpcCAoZGVmYXVsdDsgdHJ1ZSksIG9yIHJldHVybiB0aGUgdGlwIChmYWxzZSkuIChvcHRpb25hbCkKCSAqCUByZXR1cm4JCXN0cmluZy9udWxsCQkJCQlJZiBub3QgZWNob2luZyB0aXAgdGhlbiB0aGUgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gZWNob2luZyB0aGVyZSBpcyBubyByZXR1cm4uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiB2aWRlbyggJHZpZGVvX2tleSwgJHRpdGxlID0gJycsICRlY2hvX3RpcCA9IHRydWUgKSB7CgkJaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJCQlnbG9iYWwgJHdwX3NjcmlwdHM7CgkJCWlmICggaXNfb2JqZWN0KCAkd3Bfc2NyaXB0cyApICkgewoJCQkJaWYgKCAhaW5fYXJyYXkoICd0aGlja2JveCcsICR3cF9zY3JpcHRzLT5kb25lICkgKSB7CgkJCQkJd3BfZW5xdWV1ZV9zY3JpcHQoICd0aGlja2JveCcgKTsKCQkJCQl3cF9wcmludF9zY3JpcHRzKCAndGhpY2tib3gnICk7CgkJCQkJd3BfcHJpbnRfc3R5bGVzKCAndGhpY2tib3gnICk7CgkJCQl9CgkJCX0KCQl9CgkJCgkJaWYgKCBzdHJzdHIoICR2aWRlb19rZXksICcjJyApICkgewoJCQkkdmlkZW8gPSBleHBsb2RlKCAnIycsICR2aWRlb19rZXkgKTsKCQkJJHZpZGVvWzFdID0gJyZzdGFydD0nIC4gJHZpZGVvWzFdOwoJCX0gZWxzZSB7CgkJCSR2aWRlb1swXSA9ICR2aWRlb19rZXk7CgkJCSR2aWRlb1sxXSA9ICcnOwoJCX0KCgkJJHRpcCA9ICc8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJyAuIHVybGVuY29kZSggJHZpZGVvWzBdICkgLiAnP2F1dG9wbGF5PTEnIC4gJHZpZGVvWzFdIC4gJyZUQl9pZnJhbWU9MSZ3aWR0aD02MDAmaGVpZ2h0PTQwMCIgY2xhc3M9InRoaWNrYm94IHBsdWdpbmJ1ZGR5X3RpcCIgdGl0bGU9IlZpZGVvIFR1dG9yaWFsIC0gJyAuICR0aXRsZSAuICciPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvcGx1Z2luYnVkZHkvaW1hZ2VzL3BsdWdpbmJ1ZGR5X3BsYXkucG5nIiBhbHQ9Iih2aWRlbykiIC8+PC9hPic7CgkJaWYgKCAkZWNob190aXAgPT09IHRydWUgKSB7CgkJCWVjaG8gJHRpcDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHRpcDsKCQl9Cgl9IC8vIEVuZCB2aWRlbygpLgoJCgkKCQoJLyoJc3RhcnRfdGFicygpCgkgKgkKCSAqCVN0YXJ0cyBhIHRhYmJlZCBpbnRlcmZhY2UuCiAJICoJQHNlZSBlbmRfdGFicygpLgoJICoJCgkgKglAcGFyYW0JCXN0cmluZwkJJGludGVyZmFjZV90YWcJCVRhZy9zbHVnIGZvciB0aGlzIGVudGlyZSB0YWJiZWQgaW50ZXJmYWNlLiBTaG91bGQgYmUgdW5pcXVlLgoJICoJQHBhcmFtCQlhcnJheQkJJHRhYnMJCQkJQXJyYXkgY29udGFpbmluZyBhbiBhcnJheSBvZiBzZXR0aW5ncyBmb3IgdGhpcyB0YWJiZWQgaW50ZXJmYWNlLiBFeDogIGFycmF5KCBhcnJheSggJ3RpdGxlJz4gJ215IHRpdGxlJywgJ3NsdWcnID0+ICdteXRhYnMnICkgKTsKCSAqCQkJCQkJCQkJCQkJT3B0aW9uYWwgc2V0dGluZyB3aXRoIGtleSBgYWpheF91cmxgIG1heSBkZWZpbmUgYSBVUkwgZm9yIEFKQVggbG9hZGluZy4KCSAqCUBwYXJhbQkJc3RyaW5nCQkkY3NzCQkJCUFkZGl0aW9uYWwgQ1NTIHRvIGFwcGx5IHRvIG1haW4gb3V0ZXIgZGl2LiAob3B0aW9uYWwpCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQkJCUVjaG8gb3V0cHV0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiAob3B0aW9uYWwpCgkgKglAcGFyYW0JCWludAkJCSRhY3RpdmVfdGFiX2luZGV4CVRhYiB0byBzdGFydCBhcyBhY3RpdmUvc2VsZWN0ZWQuCgkgKglAcmV0dXJuCQludWxsL3N0cmluZwkJCQkJCW51bGwgaWYgJGVjaG8gPSBmYWxzZSwgYWxsIGRhdGEgb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc3RhcnRfdGFicyggJGludGVyZmFjZV90YWcsICR0YWJzLCAkY3NzID0gJycsICRlY2hvID0gdHJ1ZSwgJGFjdGl2ZV90YWJfaW5kZXggPSAwICkgewoJCSR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgPSAkaW50ZXJmYWNlX3RhZzsKCQkKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdwYl90YWJzLmpzJywgdHJ1ZSApOwoJCQoJCSRwcmVmaXggPSAncGJfJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3NsdWcnICkgLiAnXyc7IC8vIHBiX1BMVUdJTlNMVUdfCgkJJHJldHVybiA9ICcnOwoJCQoJCS8qCgkJJHJldHVybiAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPic7CgkJJHJldHVybiAuPSAnCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7JzsKCQkkcmV0dXJuIC49ICcJCWpRdWVyeSgiIycgLiAkcHJlZml4IC4gJHRoaXMtPl90YWJfaW50ZXJmYWNlX3RhZyAuICdfdGFicyIpLnRhYnMoeyBhY3RpdmU6ICcgLiAkYWN0aXZlX3RhYl9pbmRleCAuICcgfSk7JzsKCQkkcmV0dXJuIC49ICcJfSk7JzsKCQkkcmV0dXJuIC49ICc8L3NjcmlwdD4nOwoJCSovCgkJCgkJJHJldHVybiAuPSAnPGRpdiBjbGFzcz0iYmFja3VwYnVkZHktdGFicy13cmFwIj4nOwoJCQoJCQoJCSRyZXR1cm4gLj0gJzxoMiBjbGFzcz0ibmF2LXRhYi13cmFwcGVyIj4nOwoJCSRpID0gMDsKCQlmb3JlYWNoKCAkdGFicyBhcyAkdGFiICkgewoJCQlpZiAoICEgaXNzZXQoICR0YWJbJ2NzcyddICkgKSB7CgkJCQkkdGFiWydjc3MnXSA9ICcnOwoJCQl9CgkJCSRhY3RpdmVfdGFiX2NsYXNzID0gJyc7CgkJCWlmICggJGFjdGl2ZV90YWJfaW5kZXggPT0gJGkgKSB7CgkJCQkkYWN0aXZlX3RhYl9jbGFzcyA9ICduYXYtdGFiLWFjdGl2ZSc7CgkJCX0KCQkJaWYgKCBpc3NldCggJHRhYlsnYWpheCddICkgJiYgKCAkdGFiWydhamF4X3VybCddICE9ICcnICkgKSB7IC8vIEFKQVggdGFiLgoJCQkJJHJldHVybiAuPSAnPGEgY2xhc3M9Im5hdi10YWIgbmF2LXRhYi0nIC4gJGkgLiAnICcgLiAkYWN0aXZlX3RhYl9jbGFzcyAuICcgYmItdGFiLScgLiAkdGFiWydzbHVnJ10gLiAnIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGRhdGEtYWpheD0iJyAuICR0YWJbJ2FqYXhfdXJsJ10gLiAnIj4nIC4gJHRhYlsndGl0bGUnXSAuICc8L2E+JzsKCQkJfSBlbHNlaWYgKCBpc3NldCggJHRhYlsndXJsJ10gKSAmJiAoICR0YWJbJ3VybCddICE9ICcnICkgKSB7CgkJCQkkcmV0dXJuIC49ICc8YSBjbGFzcz0ibmF2LXRhYiBuYXYtdGFiLScgLiAkaSAuICcgJyAuICRhY3RpdmVfdGFiX2NsYXNzIC4gJyBiYi10YWItJyAuICR0YWJbJ3NsdWcnXSAuICciIGhyZWY9IicgLiAkdGFiWyd1cmwnXSAuICciPicgLiAkdGFiWyd0aXRsZSddIC4gJzwvYT4nOwoJCQl9IGVsc2UgeyAvLyBTdGFuZGFyZDsgTk8gQUpBWC4KCQkJCSRyZXR1cm4gLj0gJzxhIGNsYXNzPSJuYXYtdGFiIG5hdi10YWItJyAuICRpIC4gJyAnIC4gJGFjdGl2ZV90YWJfY2xhc3MgLiAnIGJiLXRhYi0nIC4gJHRhYlsnc2x1ZyddIC4gJyIgc3R5bGU9IicgLiAkdGFiWydjc3MnXSAuICciIGhyZWY9IiMnIC4gJHByZWZpeCAuICR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgLiAnX3RhYl8nIC4gJHRhYlsnc2x1ZyddIC4gJyI+JyAuICR0YWJbJ3RpdGxlJ10gLiAnPC9hPic7CgkJCX0KCQkJJGkrKzsKCQl9CgkJJHJldHVybiAuPSAnPC9oMj4nOwoJCQoJCQoJCS8qCgkJJHJldHVybiAuPSAnPGRpdiBpZD0iJyAuICRwcmVmaXggLiAkdGhpcy0+X3RhYl9pbnRlcmZhY2VfdGFnIC4gJ190YWJzIiBzdHlsZT0iJyAuICRjc3MgLiAnIj4nOwoJCSRyZXR1cm4gLj0gJzx1bD4nOwoJCWZvcmVhY2goICR0YWJzIGFzICR0YWIgKSB7CgkJCWlmICggISBpc3NldCggJHRhYlsnY3NzJ10gKSApIHsKCQkJCSR0YWJbJ2NzcyddID0gJyc7CgkJCX0KCQkJaWYgKCBpc3NldCggJHRhYlsnYWpheCddICkgJiYgKCAkdGFiWydhamF4X3VybCddICE9ICcnICkgKSB7IC8vIEFKQVggdGFiLgoJCQkJJHJldHVybiAuPSAnPGxpPjxhIGhyZWY9IicgLiAkdGFiWydhamF4X3VybCddIC4gJyI+PHNwYW4+JyAuICR0YWJbJ3RpdGxlJ10gLiAnPC9zcGFuPjwvYT48L2xpPic7CgkJCX0gZWxzZSB7IC8vIFN0YW5kYXJkOyBOTyBBSkFYLgoJCQkJJHJldHVybiAuPSAnPGxpIHN0eWxlPSInIC4gJHRhYlsnY3NzJ10gLiAnIj48YSBocmVmPSIjJyAuICRwcmVmaXggLiAkdGhpcy0+X3RhYl9pbnRlcmZhY2VfdGFnIC4gJ190YWJfJyAuICR0YWJbJ3NsdWcnXSAuICciPjxzcGFuPicgLiAkdGFiWyd0aXRsZSddIC4gJzwvc3Bhbj48L2E+PC9saT4nOwoJCQl9CgkJfQoJCSRyZXR1cm4gLj0gJzwvdWw+JzsKCQkkcmV0dXJuIC49ICc8YnI+JzsKCQkkcmV0dXJuIC49ICc8ZGl2IGNsYXNzPSJ0YWJzLWJvcmRlcndyYXAiPic7CgkJKi8KCQkKCQkkcmV0dXJuIC49ICc8ZGl2IGNsYXNzPSJiYWNrdXBidWRkeS10YWItYmxvY2tzIj4nOwoJCQoJCWlmICggJGVjaG8gPT09IHRydWUgKSB7CgkJCWVjaG8gJHJldHVybjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJCgl9IC8vIEVuZCBzdGFydF90YWJzKCkuCgkKCQoJCgkvKgllbmRfdGFicygpCgkgKgkKCSAqCUNsb3NlcyBvZmYgYSB0YWJiZWQgaW50ZXJmYWNlLgoJICoJQHNlZSBzdGFydF90YWJzKCkuCgkgKgkKCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGVjaG8JCQkJRWNobyBvdXRwdXQgaW5zdGVhZCBvZiByZXR1cm5pbmcuICAob3B0aW9uYWwpCgkgKglAcmV0dXJuCQludWxsL3N0cmluZwkJCQkJCW51bGwgaWYgJGVjaG8gPSBmYWxzZSwgYWxsIGRhdGEgb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZW5kX3RhYnMoICRlY2hvID0gdHJ1ZSApIHsKCQkKCQkvKgoJCSRyZXR1cm4gPSAnJzsKCQkkcmV0dXJuIC49ICcJPC9kaXY+JzsKCQkkcmV0dXJuIC49ICc8L2Rpdj4nOwoJCSovCgkJJHJldHVybiA9ICc8L2Rpdj48L2Rpdj4nOwoJCQoJCSR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgPSAnJzsKCQkKCQlpZiAoICRlY2hvID09PSB0cnVlICkgewoJCQllY2hvICRyZXR1cm47CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXR1cm47CgkJfQoJCQoJfSAvLyBFbmQgZW5kX3RhYnMoKS4KCQoJCgkKCS8qCXN0YXJ0X3RhYigpCgkgKgkKCSAqCU9wZW5zIHRoZSBzdGFydCBvZiBhbiBpbmRpdmlkdWFsIHBhZ2UgdG8gYmUgbG9hZGVkIGJ5IGEgdGFiLgoJICoJQHNlZSBlbmRfdGFiKCkuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFiX3RhZwkJCVVuaXF1ZSB0YWcgZm9yIHRoaXMgdGFiIHNlY3Rpb24uIE11c3QgbWF0Y2ggdGhlIHRhZyBkZWZpbmVkIHdoZW4gY3JlYXRpbmcgdGhlIHRhYiBpbnRlcmZhY2UuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQkJCUVjaG8gb3V0cHV0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKG9wdGlvbmFsKQoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQludWxsIGlmICRlY2hvID0gZmFsc2UsIGFsbCBkYXRhIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0YXJ0X3RhYiggJHRhYl90YWcsICRlY2hvID0gdHJ1ZSApIHsKCQkKCQkkcHJlZml4ID0gJ3BiXycgLiBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdzbHVnJyApIC4gJ18nOyAvLyBwYl9QTFVHSU5TTFVHXwoJCSRyZXR1cm4gPSAnJzsKCQkKCQkkcmV0dXJuIC49ICc8ZGl2IGNsYXNzPSJiYWNrdXBidWRkeS10YWIiIGlkPSInIC4gJHByZWZpeCAuICR0aGlzLT5fdGFiX2ludGVyZmFjZV90YWcgLiAnX3RhYl8nIC4gJHRhYl90YWcgLiAnIj4nOwoJCQoJCQoJCWlmICggJGVjaG8gPT09IHRydWUgKSB7CgkJCWVjaG8gJHJldHVybjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJldHVybjsKCQl9CgkJCgl9IC8vIEVuZCBzdGFydF90YWIoKS4KCQoJCgkKCS8qCWVuZF90YWIoKQoJICoJCgkgKglDbG9zZXMgdGhpcyB0YWIgc2VjdGlvbi4KCSAqCUBzZWUgc3RhcnRfdGFiKCkuCgkgKgkKCSAqCUBwYXJhbQkJc3RyaW5nCQkkdGFiX3RhZwkJCVVuaXF1ZSB0YWcgZm9yIHRoaXMgdGFiIHNlY3Rpb24uIE11c3QgbWF0Y2ggdGhlIHRhZyBkZWZpbmVkIHdoZW4gY3JlYXRpbmcgdGhlIHRhYiBpbnRlcmZhY2UuCgkgKglAcGFyYW0JCWJvb2xlYW4JCSRlY2hvCQkJCUVjaG8gb3V0cHV0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiAgKG9wdGlvbmFsKQoJICoJQHJldHVybgkJbnVsbC9zdHJpbmcJCQkJCQludWxsIGlmICRlY2hvID0gZmFsc2UsIGFsbCBkYXRhIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGVuZF90YWIoICRlY2hvID0gdHJ1ZSApIHsKCQkKCQkkcmV0dXJuID0gJzwvZGl2Pic7CgkJCgkJCgkJaWYgKCAkZWNobyA9PT0gdHJ1ZSApIHsKCQkJZWNobyAkcmV0dXJuOwoJCX0gZWxzZSB7CgkJCXJldHVybiAkcmV0dXJuOwoJCX0KCQkKCX0gLy8gRW5kIGVuZF90YWIoKS4KCQoJCgkKCS8qCWFqYXhfaGVhZGVyKCkKCSAqCQoJICoJT3V0cHV0IEhUTUwgaGVhZGVycyB3aGVuIHVzaW5nIEFKQVguCgkgKgkKCSAqCUBwYXJhbQkJYm9vbGVhbgkJJGpzCQkJV2hldGhlciBvciBub3QgdG8gbG9hZCBqYXZhc2NyaXB0LiBEZWZhdWx0IGZhbHNlLgoJICoJQHBhcmFtCQlib29sCQkkcGFkZGluZwlXaGV0aGVyIG9yIG5vdCB0byBwYWRkIHdyYXBwZXIgZGl2LiBEZWZhdWx0IGhhcyBwYWRkaW5nLgoJICoJQHJldHVybgkJCgkgKi8KCWZ1bmN0aW9uIGFqYXhfaGVhZGVyKCAkanMgPSB0cnVlLCAkcGFkZGluZyA9IHRydWUgKSB7CgkJZWNobyAnPGhlYWQ+JzsKCQllY2hvICc8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4nOwoJCWVjaG8gJzx0aXRsZT5QbHVnaW5CdWRkeTwvdGl0bGU+JzsKCQkKCQl3cF9wcmludF9zdHlsZXMoICd3cC1hZG1pbicgKTsKCQl3cF9wcmludF9zdHlsZXMoICdkYXNoaWNvbnMnICk7CgkJd3BfcHJpbnRfc3R5bGVzKCAnYnV0dG9ucycgKTsKCQl3cF9wcmludF9zdHlsZXMoICdjb2xvcnMnICk7CgkJCgkJaWYgKCAkanMgPT09IHRydWUgKSB7CgkJCXdwX2VucXVldWVfc2NyaXB0KCAnanF1ZXJ5JyApOwoJCQl3cF9wcmludF9zY3JpcHRzKCAnanF1ZXJ5JyApOwoJCX0KCQkKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ3dwLWFkbWluLmNzcycgKTsKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ3RoaWNrYm94ZWQuY3NzJyApOwoJCQoJCS8vZWNobyAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgLiAnL2Nzcy9hZG1pbi5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPic7CgkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnYWRtaW4uanMnLCB0cnVlICk7CgkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdhZG1pbi5jc3MnLCB0cnVlICk7CgkJcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAndG9vbHRpcC5qcycsIHRydWUgKTsKCQkKCQllY2hvICc8Ym9keSBjbGFzcz0id3AtY29yZS11aSIgc3R5bGU9ImJhY2tncm91bmQ6IGluaGVyaXQ7Ij4nOwoJCWlmICggJHBhZGRpbmcgPT09IHRydWUgKSB7CgkJCWVjaG8gJzxkaXYgc3R5bGU9InBhZGRpbmc6IDhweDsgcGFkZGluZy1sZWZ0OiAwOyBwYWRkaW5nLXJpZ2h0OiAwOyI+JzsKCQl9IGVsc2UgewoJCQllY2hvICc8ZGl2Pic7CgkJfQoJfSAvLyBFbmQgYWpheF9oZWFkZXIoKS4KCQoJCglmdW5jdGlvbiBhamF4X2Zvb3RlcigpIHsKCQllY2hvICc8L2JvZHk+JzsKCQllY2hvICc8L2Rpdj4nOwoJCWVjaG8gJzwvaGVhZD4nOwoJCWVjaG8gJzwvaHRtbD4nOwoJfSAvLyBFbmQgYWpheF9mb290ZXIoKS4KCQoJCgkKfSAvLyBFbmQgY2xhc3MgcGx1Z2luYnVkZHlfdWkuCgoKPz4=
###PACKDATA,FILE_END,/pluginbuddy/classes/ui.php,importbuddy/pluginbuddy/classes/ui.php
###PACKDATA,FILE_START,/pluginbuddy/css/admin.css,importbuddy/pluginbuddy/css/admin.css
I3Rvb2x0aXAgewoJcG9zaXRpb246IGFic29sdXRlOwoJei1pbmRleDogOTk5OTk5OwoJYm9yZGVyOiAycHggc29saWQgI0RGREZERjsKCXBhZGRpbmc6IDEycHg7CgltYXgtd2lkdGg6IDMwMHB4OwoJCglib3JkZXItcmFkaXVzOiA4cHg7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDhweDsKCS1tb3otYm9yZGVyLXJhZGl1czogOHB4OwoJCgktd2Via2l0LWJveC1zaGFkb3c6IDZweCA2cHggMjVweCAxNXB4IHJnYmEoMCwgMCwgMCwgLjA4KTsKCS1tb3otYm94LXNoYWRvdzogNnB4IDZweCAyNXB4IDE1cHggcmdiYSgwLCAwLCAwLCAuMDgpOwoJYm94LXNoYWRvdzogNnB4IDZweCAyNXB4IDE1cHggcmdiYSgwLCAwLCAwLCAuMDgpOyAKCQoJYmFja2dyb3VuZDogI2VkZWRlZDsKCWJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwgI2VkZWRlZCAwJSwgI2ZmZmZmZiAxMDAlKTsKCWJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoMCUsI2VkZWRlZCksIGNvbG9yLXN0b3AoMTAwJSwjZmZmZmZmKSk7CgliYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsICNlZGVkZWQgMCUsI2ZmZmZmZiAxMDAlKTsKCWJhY2tncm91bmQ6IC1vLWxpbmVhci1ncmFkaWVudCh0b3AsICNlZGVkZWQgMCUsI2ZmZmZmZiAxMDAlKTsKCWJhY2tncm91bmQ6IC1tcy1saW5lYXItZ3JhZGllbnQodG9wLCAjZWRlZGVkIDAlLCNmZmZmZmYgMTAwJSk7CgliYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZWRlZGVkIDAlLCNmZmZmZmYgMTAwJSk7CglmaWx0ZXI6IHByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudCggc3RhcnRDb2xvcnN0cj0nI2VkZWRlZCcsIGVuZENvbG9yc3RyPScjZmZmZmZmJyxHcmFkaWVudFR5cGU9MCApOwp9CiN0b29sdGlwIGgzLCAjdG9vbHRpcCBkaXYgeyBtYXJnaW46IDA7IH0KLnBsdWdpbmJ1ZGR5LW5vZGVjb3IgYSB7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLnBsdWdpbmJ1ZGR5X3RpcCBpbWcgewoJdmVydGljYWwtYWxpZ246IC0ycHg7Cn0KLmZvcm0tdGFibGUgc3Bhbi5kZXNjcmlwdGlvbiB7CglkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDsKfQovKiBTY3JvbGxhYmxlIHRleHQgZm9yIGRpc3BsYXlpbmcgZGVmYXVsdCBkaXJzLCBldGMuICovCi5wYl9zY3JvbGwgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJb3ZlcmZsb3cteDogc2Nyb2xsOwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoucGJfc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhciB7Cgktd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7Cgl3aWR0aDogMTFweDsKCWhlaWdodDogMTFweDsKfQoucGJfc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7Cglib3JkZXItcmFkaXVzOiA4cHg7Cglib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTsgLyogc2hvdWxkIG1hdGNoIGJhY2tncm91bmQsIGNhbid0IGJlIHRyYW5zcGFyZW50ICovCgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4xKTsKfQoucGJfc2Nyb2xsOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXJ7CgliYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC4wKTsKfQoKCmgzLnRpdGxlIHsKCWZvbnQtd2VpZ2h0OiA2MDA7Cn0KLnBiX2Zvcm0gdGgsIGgzIHsKCWZvbnQtd2VpZ2h0OiBub3JtYWw7Cn0KCnRkLnBiX2RyYWdoYW5kbGUgewoJY3Vyc29yOiBtb3ZlOwoJdGV4dC1hbGlnbjogY2VudGVyOwoJdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKdHIudERuRF93aGlsZURyYWcgdGQsdHIudERuRF93aGlsZURyYWcgdGh7CgliYWNrZ3JvdW5kOiAjRUVFRUVFOwoJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNCQkJCQkIgIWltcG9ydGFudDsKCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQkJCQkJCICFpbXBvcnRhbnQ7CglwYWRkaW5nLXRvcDogMnB4Owp9Ci5wYl9kZWJ1ZyB7CglmbG9hdDogcmlnaHQ7CgliYWNrZ3JvdW5kOiAjRkY4OTg5OwoJYm9yZGVyOiAycHggc29saWQgcmVkOwoJcGFkZGluZzogOHB4OwoJd2lkdGg6IDQwcHg7Cglwb3NpdGlvbjogYWJzb2x1dGU7CglyaWdodDogMDsKCXotaW5kZXg6IDkwMDA7Cn0KLnBiX2RlYnVnX3Nob3cgewoJY3Vyc29yOiBwb2ludGVyOwoJZmxvYXQ6IHJpZ2h0Owp9Ci5wYl9kZWJ1Z19oaWRlIHsKCWN1cnNvcjogcG9pbnRlcjsKCWRpc3BsYXk6IG5vbmU7CglmbG9hdDogcmlnaHQ7Cn0KLnBiX2RlYnVnX2NvbnRlbnQgewoJZGlzcGxheTogbm9uZTsKfQoucGJfZGVidWcgdGV4dGFyZWEgewoJd2lkdGg6IDEwMCU7CgloZWlnaHQ6IDEwMHB4Owp9CgoucGJfaHRpdGxlIHsKCWZvbnQtc2l6ZTogMThweDsKCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjREZERkRGOwoJcGFkZGluZy1ib3R0b206IDRweDsKfQoKLnBiX3RvZ2dsZSB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KLnBiX3RvZ2dsZWQgewoJZGlzcGxheTogbm9uZTsKCWJvcmRlcjogMXB4IHNvbGlkICNDQ0NDQ0M7CgltYXJnaW46IDRweDsKCXBhZGRpbmc6IDhweDsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4OwoJLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7Cglib3JkZXItcmFkaXVzOiA0cHg7Cn0KCiNwYl9iYWNrdXBidWRkeV9zdGF0dXMgewoJd2lkdGg6IDEwMCU7CgloZWlnaHQ6IDIwMHB4Owp9CgoKLmJhY2t1cGJ1ZGR5LXRhYi1ibG9ja3MgLmJhY2t1cGJ1ZGR5LXRhYiB7CglkaXNwbGF5OiBub25lOwoJcGFkZGluZy10b3A6IDEwcHg7IC8vIDI1cHgKfQouYmFja3VwYnVkZHktdGFiLWJsb2NrcyAuYmFja3VwYnVkZHktdGFiOmZpcnN0LWNoaWxkIHsKCWRpc3BsYXk6IGJsb2NrOwp9CgoKCgoKLyogVGFicyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXRhYnMgewoJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNERkRGREY7IG1hcmdpbi10b3A6IDIwcHg7IH0gLyogcGFkZGluZzogLjJlbTsgem9vbTogMTsgKi8KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IHsgei1pbmRleDogMTU7IGxpc3Qtc3R5bGU6IG5vbmU7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogMHB4IDBweCAwcHg7IG1hcmdpbi10b3A6IC0yOHB4OyBtYXJnaW4tbGVmdDogMTBweDsgfQoudWktdGFicyAudWktdGFicy1uYXYgbGkgeyBtYXJnaW46IC0xMnB4IDdweCAtMXB4IDBweDsgcG9zaXRpb246IHJlbGF0aXZlOyBmbG9hdDogbGVmdDsgcGFkZGluZzogMDsgdGV4dC1hbGlnbjogY2VudGVyOyB9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaSBhIHsKCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IC8qICNFREVERUQgSW5hY3RpdmUgYmcuICovCgloZWlnaHQ6IDI3cHg7CglmbG9hdDogbGVmdDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBwYWRkaW5nLWxlZnQ6IDE1cHg7IHBhZGRpbmctcmlnaHQ6IDE1cHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDNweCAzcHggMHB4IDBweDsKCS13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4IDNweCAwcHggMHB4OwoJYm9yZGVyLXJhZGl1czogM3B4IDNweCAwcHggMHB4OwoJYm9yZGVyOiAxcHggc29saWQgI2RmZGZkZjsgb3V0bGluZTogbm9uZTsgcGFkZGluZy10b3A6IDVweDsKCWJvcmRlci1ib3R0b206IDBweDsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCXBhZGRpbmctdG9wOiAxMHB4OwoJZm9udC13ZWlnaHQ6IDIwMDsKCWZvbnQtc2l6ZTogMjBweDsKCWZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhTmV1ZS1MaWdodCIsIkhlbHZldGljYSBOZXVlIExpZ2h0IiwiSGVsdmV0aWNhIE5ldWUiLHNhbnMtc2VyaWY7CgkvL2NvbG9yOiAjNDY0NjQ2ICFpbXBvcnRhbnQ7Cgljb2xvcjogI2FhYTsKCQp9Ci51aS10YWJzIC51aS10YWJzLW5hdiAudWktdGFicy1hY3RpdmUgewoJbWFyZ2luLXRvcDogLTEycHg7Cn0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IC51aS10YWJzLWFjdGl2ZSBhIHsKCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CgloZWlnaHQ6IDI4cHg7Cglib3JkZXItY29sb3I6ICNDQ0M7Cgljb2xvcjogIzQ2NDY0NjsKfQoudWktdGFicyAudWktdGFicy1uYXYgLnVpLXRhYnMtYWN0aXZlIGE6aG92ZXIgewoJYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKCS8vY3Vyc29yOiBkZWZhdWx0OwoJLy9ib3JkZXItY29sb3I6ICNDQ0M7Cn0KCi51aS10YWJzIC51aS10YWJzLW5hdiBsaSBhOmhvdmVyIHsKCS8vYmFja2dyb3VuZC1jb2xvcjogI0RGREZERjsKCWJvcmRlci1jb2xvcjogI0NDQzsKCWNvbG9yOiAjZDU0ZTIxOwp9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLXNlbGVjdGVkIHsgIH0gLyogcGFkZGluZy1ib3R0b206IDBweDsgKi8KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtc2VsZWN0ZWQgYSwgLnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXN0YXRlLWRpc2FibGVkIGEsIC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS1zdGF0ZS1wcm9jZXNzaW5nIGEgewoJaGVpZ2h0OiAyOHB4OyBjdXJzb3I6IHRleHQ7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyAvLyBGOUY5RjkKCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRkZGRkZGOwp9CgoudWktdGFicyAudWktdGFicy1uYXYgbGkgYSwgLnVpLXRhYnMudWktdGFicy1jb2xsYXBzaWJsZSAudWktdGFicy1uYXYgbGkudWktdGFicy1zZWxlY3RlZCBhIHsgY3Vyc29yOiBwb2ludGVyOyB9IC8qIGZpcnN0IHNlbGVjdG9yIGluIGdyb3VwIHNlZW1zIG9ic29sZXRlLCBidXQgcmVxdWlyZWQgdG8gb3ZlcmNvbWUgYnVnIGluIE9wZXJhIGFwcGx5aW5nIGN1cnNvcjogdGV4dCBvdmVyYWxsIGlmIGRlZmluZWQgZWxzZXdoZXJlLi4uICovCi51aS10YWJzIC51aS10YWJzLXBhbmVsIHsgcGFkZGluZzogMDsgcGFkZGluZy10b3A6IDEwcHg7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItd2lkdGg6IDA7IGJhY2tncm91bmQ6IG5vbmU7IH0KLnVpLXRhYnMgLnVpLXRhYnMtaGlkZSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQoKCgovKgoudWktdGFicy1uYXYgbGkgYSBzcGFuIC5wYl9iYWNrdXBidWRkeV9mYW5jeXRhYiB7CgkKfQoqLwoKCgoucGJfbGFiZWwgewoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7CgktbW96LWJvcmRlci1yYWRpdXM6IDNweDsKCWJvcmRlci1yYWRpdXM6IDNweDsKfQoucGJfbGFiZWwgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJcGFkZGluZzogMnB4IDRweDsKCWZvbnQtc2l6ZTogMTEuODQ0cHg7Cglmb250LXdlaWdodDogYm9sZDsKCWxpbmUtaGVpZ2h0OiAxNHB4OwoJY29sb3I6IHdoaXRlOwoJdGV4dC1zaGFkb3c6IDAgLTFweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSk7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwoJdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwoJYmFja2dyb3VuZC1jb2xvcjogIzk5OTsKfQoucGJfbGFiZWwtc3VjY2VzcyB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNDY4ODQ3Owp9Ci5wYl9sYWJlbC13YXJuaW5nIHsKCWJhY2tncm91bmQtY29sb3I6ICNGODk0MDY7Cn0KLnBiX2xhYmVsLWltcG9ydGFudCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjZGQ0NTQyOyAvLyNCOTRBNDg7Cn0KLnBiX2xhYmVsLWluZm8gewoJYmFja2dyb3VuZC1jb2xvcjogIzNBODdBRDsKfQoucGJfbGFiZWwtaW52ZXJzZSB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOwp9
###PACKDATA,FILE_END,/pluginbuddy/css/admin.css,importbuddy/pluginbuddy/css/admin.css
###PACKDATA,FILE_START,/pluginbuddy/css/index.php,importbuddy/pluginbuddy/css/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/pluginbuddy/css/index.php,importbuddy/pluginbuddy/css/index.php
###PACKDATA,FILE_START,/pluginbuddy/css/jquery.miniColors.css,importbuddy/pluginbuddy/css/jquery.miniColors.css
Lm1pbmlDb2xvcnMtdHJpZ2dlciB7CgloZWlnaHQ6IDIycHg7Cgl3aWR0aDogMjJweDsKCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgltYXJnaW46IDAgLjI1ZW07CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CglvdXRsaW5lOiBub25lOwp9CgoubWluaUNvbG9ycy1zZWxlY3RvciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl3aWR0aDogMTc1cHg7CgloZWlnaHQ6IDE1MHB4OwoJYmFja2dyb3VuZDogI0ZGRjsKCWJvcmRlcjogc29saWQgMXB4ICNCQkI7CgktbW96LWJveC1zaGFkb3c6IDAgMCA2cHggcmdiYSgwLCAwLCAwLCAuMjUpOwoJLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IHJnYmEoMCwgMCwgMCwgLjI1KTsKCWJveC1zaGFkb3c6IDAgMCA2cHggcmdiYSgwLCAwLCAwLCAuMjUpOwoJLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDsKCWJvcmRlci1yYWRpdXM6IDVweDsKCXBhZGRpbmc6IDVweDsKCXotaW5kZXg6IDk5OTk5OTsKfQoKLm1pbmlDb2xvcnMtc2VsZWN0b3IuYmxhY2sgewoJYmFja2dyb3VuZDogIzAwMDsKCWJvcmRlci1jb2xvcjogIzAwMDsKfQoKLm1pbmlDb2xvcnMtY29sb3JzIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNXB4OwoJbGVmdDogNXB4OwoJd2lkdGg6IDE1MHB4OwoJaGVpZ2h0OiAxNTBweDsKCWN1cnNvcjogY3Jvc3NoYWlyOwp9CgoubWluaUNvbG9ycy1odWVzIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNXB4OwoJbGVmdDogMTYwcHg7Cgl3aWR0aDogMjBweDsKCWhlaWdodDogMTUwcHg7CgljdXJzb3I6IGNyb3NzaGFpcjsKfQoKLm1pbmlDb2xvcnMtY29sb3JQaWNrZXIgewoJcG9zaXRpb246IGFic29sdXRlOwoJd2lkdGg6IDExcHg7CgloZWlnaHQ6IDExcHg7Cn0KCi5taW5pQ29sb3JzLWh1ZVBpY2tlciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7CglsZWZ0OiAtM3B4OwoJd2lkdGg6IDI2cHg7CgloZWlnaHQ6IDNweDsKfQ==
###PACKDATA,FILE_END,/pluginbuddy/css/jquery.miniColors.css,importbuddy/pluginbuddy/css/jquery.miniColors.css
###PACKDATA,FILE_START,/pluginbuddy/images/draghandle.png,importbuddy/pluginbuddy/images/draghandle.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9oHHRIvI8D7+LoAAALwSURBVDjLrZTNa11FGMZ/78ycnPvVNG3QlqTxkiuYxaUFQVMoLqqCilD6H0gFF4W4EbdduHDbnbisIIiCtOBKs9GNVKziouoiFmOTtOKtJNE093tmXhdzqpeeuNJZznmf33mfmXceUVUmlgEqwHGgBZwo9u8A68BvwACIDwRuQixADhwDTgLL71/ffArglTOPfQvUAZ2AKID76t3XFARjLa46TX12num5JdbvZ3xysw5Ay996oXVozN6va3S37+L7e8QQAMUpwpln22ArkB+F2gK7oymufOfxhb0rtxpcfskxd+Iw9LZguANhwPUvfsTFKCCGzz/9gaMLS9SPVXlnbYbtXva3t+2e8tZqj9eX/qDb6bCztcZzLz5BjIIJGECwLqN9foXVYZvb3YyH1+1uxuqwTfv8CtZlgBAwmKAGUNSPALh4dpGrK6dLgKsrp7l4dhGgqFWCGpxXAxrxox4+KlZApKRHVVGFoIof9ZJGDc5JBDG4qRrOCHKQGhARREAU3FQtaST+Dx1EbHEGY3xQMGBMmRAVYlR8TLWgRCzOR5tm2GgCAO6ADqImsQ+KManOR4vrDCsAVOs5Wzt9arnlUMWVAHt9z/2BpzcMVOs5AJ1h5cEcgLGOUYioKj7EEsAX30YhYmz6QcBgxlEAwU1VCitC0LKFoP+cTaoVxlFwXtMoZ9U6QdKT/LcOBDACtloHMXgVjBMFjYz7XaKmN+qsKQGcNWhxG+N+FzTiRP97BwmAYLOcKMKHX9/hxi+7JcAbH33P8uIRXj51HJvlgCQLCaBoDMysX+PCwiat6VACtKYDFxY2mVm/hsYUJl4FFxTQyMkn5yFvQK3BpdmMNz/z7PaT+EgVLj2fM5sbmGnA3DyEAUHBRRXe/vhPrN2n0RjwyKNjms0m55qGD9bStZ1rKj9tDtnY2OD3e/fY398nhAAIMpHKMpHIp4Dl977ceBrg1Wea3wA3gJsPh6ocEOvVIpkfB+aL/bvAz0AH6E/G+l/J23lk4gYAJAAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/pluginbuddy/images/draghandle.png,importbuddy/pluginbuddy/images/draghandle.png
###PACKDATA,FILE_START,/pluginbuddy/images/email.png,importbuddy/pluginbuddy/images/email.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAITSURBVBgZpcHLThNhGIDh9/vn7/RApwc5VCmFWBPi1mvwAlx7BW69Afeu3bozcSE7E02ILjCRhRrds8AEbKVS2gIdSjvTmf+TYqLu+zyiqszDMCf75PnnnVwhuNcLpwsXk8Q4BYeSOsWpkqrinJI6JXVK6lSRdDq9PO+19vb37XK13Hj0YLMUTVVyWY//Cf8IVwQEGEeJN47S1YdPo4npDpNmnDh5udOh1YsZRcph39EaONpnjs65oxsqvZEyTaHdj3n2psPpKDLBcuOOGUWpZDOG+q0S7751ObuYUisJGQ98T/Ct4Fuo5IX+MGZr95jKjRKLlSxXxFxOEmaaN4us1Upsf+1yGk5ZKhp8C74H5ZwwCGO2drssLZZo1ouIcs2MJikz1oPmapHlaoFXH1oMwphyTghyQj+MefG+RblcoLlaJG/5y4zGCTMikEwTctaxXq/w9kuXdm9Cuzfh9acujXqFwE8xmuBb/hCwl1GKAnGccDwIadQCfD9DZ5Dj494QA2w2qtQW84wmMZ1eyFI1QBVQwV5GiaZOpdsPaSwH5HMZULi9UmB9pYAAouBQbMHHrgQcnQwZV/KgTu1o8PMgipONu2t5KeaNiEkxgAiICDMCCFeEK5aNauAOfoXx8KR9ZOOLk8P7j7er2WBhwWY9sdbDeIJnwBjBWBBAhGsCmiZxPD4/7Z98b/0QVWUehjkZ5vQb/Un5e/DIsVsAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/email.png,importbuddy/pluginbuddy/images/email.png
###PACKDATA,FILE_START,/pluginbuddy/images/feed.png,importbuddy/pluginbuddy/images/feed.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJFSURBVBgZBcHda5V1AADg5/d733Oc7tjOaNs5GC6KdrEwmpPRxG7spoKghOim7oK8y0MIEQRL+geGEIQ3UXQvSJ8IafZxUbjQhRDZoU60iYsSc9t5v87b84TsVe3mrBWpHoCICIAIACixYTUfOJM2Z62YO97TOULSIKaEQAyESAzEgISAgLpi48de87MLUqmezhGyhO4SCW7f4O81YiSJiCQIkbqmNcXMIjMXeilIGsQxDp8AnKDY5teL3PyU6h4CdY3Av7cYu58R0QghZWeT9fP0v2V7i8Y4j77As2c5sAwIFAXDgjInJxURAzub/PwxMZBGphZYeIWJWZ44xdo5bl4kK8kzioohUUREd4kXP+Kpd3nkee72+epNBleAxdfoLJBlDEuKkpxoBAkBjXGm53n8ZZ45S/shrr7P75eBo6eo9zAsKCqGRBEB/1zj89e5eo7tLRr7ePJtWg9wZZV7t2i2OPQcw5JiRE4UESN1ZPc2g0tceos/LtPYx9HTaPDNe8Dhl9gtyStyUiMIJDXLp2m0GHzN2gdMzdPq0F3k+pcc/4+x/UwepKzIiSDWTB/iwBLT8xw8xt07rJ8HHj7GbkX/B+DBxyhrciIQ2N2i2AG2fiPL+OsXoNVlWPDnDaC5l6qiJJWjLlHxxRs0JhhcIyvp/8SHJylKdiu++4Tr31NW7B8nkrwzp627d9nkHM0Wsea+GSY6tDvESEyY6TIxyZ4GSUp/nTubqyF7WrvZtaKrZ4QSQ+TIMUSJHCVypGhaHW448z+h1tLAgvKk7gAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/pluginbuddy/images/feed.png,importbuddy/pluginbuddy/images/feed.png
###PACKDATA,FILE_START,/pluginbuddy/images/index.php,importbuddy/pluginbuddy/images/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/pluginbuddy/images/index.php,importbuddy/pluginbuddy/images/index.php
###PACKDATA,FILE_START,/pluginbuddy/images/pluginbuddy.png,importbuddy/pluginbuddy/images/pluginbuddy.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAktJREFUeNp0k01IVFEUx3/3vfvmzTjKmKNp2ARiioG4C8IWJURE5EYXgxu3UotqVcvAtlG0cVGk0FLBoE3QStpUCy2SCgwiUJNxPswZdb7ee6fFvBmdyf5w4Z57Pvif/7lHxeNxG2gFwoDBIYR6qCN3DzgAdjQQmbn7aikcLA0oKyYgCIJtK0Q1AQoleYpFF4UCFFJeV4WS3ph6PH5eA6GAdrvNjjuY7bcUCEoJu04nq5s/EYRzXTHa7Z1Ksijc9HOC249OA03ap61E97jK7jerHGeXU8wuRxGBsUGP6ZGBWh9i9bqACRi62q9Isa7hJx9/s57LA5BaCXD/YhfhgC+DV6jF1UTTZr1ikdDh3bYgZB1qaB6JNRo1/vWnjACzo71MDEa50dfK/HgfSlV8jfPQDaPi5ustVjNphmPN9LdVaDxb2WZs4QdDbVHeTJ6pi9eNZEZ6DN5tlln4toOhMr5AirBV8VUejLosAXDLWRMnyb3hIHPXbZq1hSfgCQSNADNXQ9wbDoGTxHOy1QqigVKhpLetxMOWYmYOiwLXYovO2VZXf06GAaG7ZZ8L7XnXW7tilr0AlDdUvmglgIIGcpupyNypaHZCJG0pxH3/YWp+L/fgNvSeAIUqbOx8fTv9NDKQjQvKVCpY3kq3LAJ7Kh6Pm0CTvwsm4AAdS0OTSwmnIwrQqZPpy19eXgJSvm4usA8cVI2cf2qjT5Y6bUyn8pFKJwPAHpBonJrB8TgIeplPVSMgu9/97fsH+j8FsqNrL8aBZt/eB3aPC/w7AI6b1V5KLAy/AAAAAElFTkSuQmCC
###PACKDATA,FILE_END,/pluginbuddy/images/pluginbuddy.png,importbuddy/pluginbuddy/images/pluginbuddy.png
###PACKDATA,FILE_START,/pluginbuddy/images/pluginbuddy_play.png,importbuddy/pluginbuddy/images/pluginbuddy_play.png
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAB7klEQVR42oWRT4gSURzHZ9u9tKmHos4WBB0VscPSEuEloot2yEsHIRE8hEIHQbBUEFSQQVBQ0EMHRRAvoh78OySMBMqSYKh7URDZg6mYLrK6r28DbjPTxn7gc3nz+7z3Zoa6jmq1+gi+hK/hE3iLuolisfgC0t9At9v90e/3u01QKpVqhULhzX/DXC5nZBiGnc1mUyJitVr9ajQazXQ6/RGjwltkMpnn5XK5sdlsLnbBdrslfC4BNjiJRCLvkexfxYlEIjCZTH7yh7PZLFksFuIbnKdSKUYul9/nwlgs9gDXYYmIaDRK4vE4GY/HgvVarfbdaDS+RXpAhUKh40ql0hbHwWCQ+P1+EggESLv993Gr1To1mUyfEEspDBzl8/l/Yq/XS1wuFyc2v1pnWfZUr9d7EN+j3G63FLvXLwE/djqdxOFwcKfySSaTLbVa/YGL/2Cz2T73er0z/pDP5yODwUAQjkajqcFgyCHRwDtcbLFYFDipPp/Pz3eDy+VSEK7X6wu8CotT/UgeC34XvuA7u91e73Q6Z0TEcDicejyehkaj+YLRZ1ACBezpdLojfAzabDYzNE03w+HwidVq/arVarMKhcKHmWN4F+5BMdzioUQikatUKp1SqTTIZLJXWHsKH0LpLryJfXgbHsKD66Lfk7TS2QhfFGsAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/pluginbuddy_play.png,importbuddy/pluginbuddy/images/pluginbuddy_play.png
###PACKDATA,FILE_START,/pluginbuddy/images/pluginbuddy_tip.png,importbuddy/pluginbuddy/images/pluginbuddy_tip.png
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAB/ElEQVR42n2RPYgaQRiG585rclGLhKQ2gYOUipjiyBGCTQhpNEVsrhAigsWhkEKwSEQQjCBroSBiYQpFEBv/Cn+XCLsElOMCBvUaFYWARoXgKSc3eVlQ9jY/LzwwzHzPzDczJJPJCOTzeVIqlQRqtdpj8BK8Bk/AfrFYJOl0mogjlV8A5ivS6XS+93q9ThMpl8t1yG/+J1tYluXm8/mMSrJcLn/xPN+E/B7KvlR+XqlU+M1mc03/kRsEG5xHIpF30GSCHIvFSCKRCEyn05/bwsFgQLPZLI3H4xQ3EHdwlUqlWJVK9WArP0Q7HBUll8sJTCYTGo1G6Xg83q3V6/ULi8XyFuoBCYVCJ9Vq9ZtYXq1WdDgcChsEg0G6WCx2a61W69JqtX6ArCB+v/+4UChAvhWhXWxM+/0+FYfjuEuTyeSFfJ94PB5FIBBo3CCiGqFVdESlSSaTLZ1Od7aVidPp/Njtdn+Ii/Bt1OVy3RJHo9HMbDbnIerBXWK32wlQu93uBu52JS7GD+zG6/X62ufzcTjVD/EIyLYywQue4qRGu93edSD6upnX6+X1ev1nSM+AnEiyZzQaj/EYjM1mYxmGaYbD4XOHw/HFYDBk1Wr1J9ScgHtgD0gjTB7K5XKVVqs1ajQas1KpfIW5p+ARUEjEPwOZIDJwBxyCg79JvwFn8/sITKnYXQAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/pluginbuddy/images/pluginbuddy_tip.png,importbuddy/pluginbuddy/images/pluginbuddy_tip.png
###PACKDATA,FILE_START,/pluginbuddy/images/rawr.gif,importbuddy/pluginbuddy/images/rawr.gif
R0lGODlhLwA9ALMAAP//////AMbGxgDXAP8AAABLAL0AAFkAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBQAJACwKAA4AHAAqAAAEzTAlNKm8OGtJ7f5fN2FIWYKZ2JVC25rhZVqmC6e0TApsH+c7l+3HSbUIAiRPoyoGhUvcaZQKIKxYT0onnU2ZTqlhfNuGL4UrYmxQb7TfwqDAy0ZJb4R8joDqZ2cZe3w2cgUyWhqDcwWNe4coaAOTlJWUkJGLlpWYKJqbk50gn6CiH6SbphuolqqKoKmRkrChsrO0rqu0tbYSrLkhpGm9OpqHibIWjo1cvch4xM/NydS20tDVkdfYKNscXyFlYCJEVGbkb0XPOddA6d7cFxEAIfkECRQACQAsCAAJABwAKgAABM0wJTSpvDhrSe3+XzdhSFmCmdiVQtua4WVapguntEwKbB/nO5ftx0m1CAIkT6MqBoVL3GmUCiCsWE9KJ51NmU6pYXzbhi+HK2JsUG+03wPhwMtGSW+EfI6A6mdnGXt8NnIHMloag3MHjXuHKGgEk5SVlJCRi5aVmCiam5OdIJ+goh+km6YbqJaqiqCpkZKwobKztK6rtLW2Eqy5IaRpvTqah4myFo6NXL3IeMTPzcnUttLQ1ZHX2CjbHF8hZWAiRFRm5G9FzznXQOne3BcRACH5BAkFAAkALAkADAAcACoAAATNMCU0qbw4a0nt/l83YUhZgpnYlULbmuFlWqYLp7RMCmwf5zuX7cdJtQgCJE+jKgaFS9xplAogrFhPSiedTZlOqWF824YvhStibFBvtN/CoMDLRklvhHyOgOpnZxl7fDZyBTJaGoNzBY17hyhoA5OUlZSQkYuWlZgompuTnSCfoKIfpJumG6iWqoqgqZGSsKGys7Suq7S1thKsuSGkab06moeJshaOjVy9yHjEz83J1LbS0NWR19go2xxfIWVgIkRUZuRvRc8510Dp3twXEQAh+QQJFAAJACwIABIAIAAoAAAExBClJKe9OGtZUdUg6I1hGXoZN3Lm9bmIIMuoqb7TOJNibuEUgUcYA/4oGFxstisBlTKCQCoUrV5YZjP5MXavvNwz9QsgzOiO8SQ+u1FrZ+JQXBFboAPhoKXhNXp7dDsHdH8YgQSChYEHhxeJipKSjo9zk5iTlYeRmZSWnZ57oKKYm3+hnqd4qZmrLa2mlpelo7Oxiq+stba3pbp/CKmGsz6dlXE2E4yFLrPJPpbQSNIt02TKj2EbK3gka3DRJyzWweJyJREAOw==
###PACKDATA,FILE_END,/pluginbuddy/images/rawr.gif,importbuddy/pluginbuddy/images/rawr.gif
###PACKDATA,FILE_START,/pluginbuddy/images/twitter.png,importbuddy/pluginbuddy/images/twitter.png
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACiUlEQVR42pWTTWgTQRTH/7MfadLUmoZqjURoq1i0gaBBKSKoCKKipadevHnwoBcvgiC6Sw8KWmitoFDRg3joQYKIYKUqKghFLW0pQVraWEpCWVOTpjabj83uOjNpQipV8M/s7syb937z5s0sOfpiNrjdLT9fyBSbBUJAG0TQh3VKjdrYe712uMR5LVvsIofCM8p4MqeaNiALBKIg0C8g8UBAoGMCuwSsUo1I0OyWVNL6NKJEV/IqC5T0HHbOx6m7jR9tLZDcDhBmp2MeXgVhC9bLgkp8jyeVxdW8SkQRAZeNqyEPd+gdSyNOQ1kMy4ZlUq20YaHBQQFNg2OKlimooIDOls24tn8rd7j1Nor3s6lKTZjEehdkbx3NB1jUi9jmFFXivf9FSeoMIKC7bQv6jzRz58noTyRS2XWrzmsrGIxnkHTI0IsWGmsowHNvVFnOUgChgL1NGDjWin/p4ps5hKNJ3vewGtT1fVJW84bKDN3tPgwc3/XX4KWsgbPhCL6nc3xcxwCuOx+VXBkQ8OHuiTY+eWVkBh9iaZRrt1owkcqbMC27AnQxgOPmO8XIFzmga08THnQG+GTPy294MrcEg5asYFobZuSQKEDqGVFMw+QA3yYnvl46DHYjl2m66rMIprVM1RYKiEkmPdPSfRAZQLg+rNiWpZadek+349w+/4YrGjSTU49GEUn84mMiUoD7xislu7YFJqckYKAriDO0oBvp/NAYhqc13pdleozB2yN9U1rm8p+OIX8DOlq8FChWbPFlHUMTMWCtjrsbXf1kdCZmn3z4GSsFG/+jepng9YWDIFpiKTU+MemZml2AruucLgjst15/923bgsWOkNavtrYW7a1+dBwI4TeMlfCatrT3RgAAAABJRU5ErkJggg==
###PACKDATA,FILE_END,/pluginbuddy/images/twitter.png,importbuddy/pluginbuddy/images/twitter.png
###PACKDATA,FILE_START,/pluginbuddy/js/admin.js,importbuddy/pluginbuddy/js/admin.js
alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQoJalF1ZXJ5KCcuYmFja3VwYnVkZHktZG9fYnVsa19hY3Rpb24nKS5jbGljayggZnVuY3Rpb24oKXsKCQl0aGlzRm9ybSA9IGpRdWVyeSh0aGlzKS5jbG9zZXN0KCdmb3JtJyk7CgkJaWYgKCB0aGlzRm9ybS5maW5kKCAnLmNoZWNrLWFsbC1lbnRyaWVzOmNoZWNrZWQnICkubGVuZ3RoID4gMCApIHsgLy8gSWYgYW55IGJ1bGsgYWN0aW9uIGJveCBpcyBjaGVja2VkLgoJCQlpZiAoICEgY29uZmlybSggJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkbyB0aGlzIHRvIGFsbCBzZWxlY3RlZCBpdGVtcz8nICkgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9Cgl9KTsKCQoJCgkKCWpRdWVyeSgnLnBiX2RlYnVnX3Nob3cnKS5jbGljayhmdW5jdGlvbihlKSB7CgkJalF1ZXJ5KHRoaXMpLmhpZGUoKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY2hpbGRyZW4oICcucGJfZGVidWdfaGlkZScpLnNob3coKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY3NzKCAnZmxvYXQnLCAnbGVmdCcgKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY3NzKCAnd2lkdGgnLCAnODAlJyApOwoJCWpRdWVyeSh0aGlzKS5wYXJlbnQoKS5jaGlsZHJlbiggJ2RpdicpLnNob3coKTsKCX0pOwoJalF1ZXJ5KCcucGJfZGVidWdfaGlkZScpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKCQlqUXVlcnkodGhpcykuaGlkZSgpOwoJCWpRdWVyeSh0aGlzKS5wYXJlbnQoKS5jaGlsZHJlbiggJy5wYl9kZWJ1Z19zaG93Jykuc2hvdygpOwoJCWpRdWVyeSh0aGlzKS5wYXJlbnQoKS5jc3MoICdmbG9hdCcsICdyaWdodCcgKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY3NzKCAnd2lkdGgnLCAnNDBweCcgKTsKCQlqUXVlcnkodGhpcykucGFyZW50KCkuY2hpbGRyZW4oICdkaXYnKS5oaWRlKCk7Cgl9KTsKCgkKCWpRdWVyeSgnLnBsdWdpbmJ1ZGR5X3RpcCcpLnRvb2x0aXAoeyAKCQl0cmFjazogdHJ1ZSwgCgkJZGVsYXk6IDAsIAoJCXNob3dVUkw6IGZhbHNlLCAKCQlzaG93Qm9keTogIiAtICIsIAoJCWZhZGU6IDI1MCAKCX0pOwoJCglpZiAodHlwZW9mIGpRdWVyeS50YWJsZURuRCAhPT0gJ3VuZGVmaW5lZCcpIHsgLy8gSWYgdGFibGVEbkQgZnVuY3Rpb24gbG9hZGVkLgoJCWpRdWVyeSgnLnBiX3Jlb3JkZXInKS50YWJsZURuRCh7CgkJCW9uRHJvcDogZnVuY3Rpb24odGJvZHksIHJvdykgewoJCQkJdmFyIG5ld19vcmRlciA9IG5ldyBBcnJheSgpOwoJCQkJdmFyIHJvd3MgPSB0Ym9keS5yb3dzOwoJCQkJZm9yICh2YXIgaT0wOyBpPHJvd3MubGVuZ3RoOyBpKyspIHsKCQkJCQluZXdfb3JkZXIucHVzaCggcm93c1tpXS5pZC5zdWJzdHJpbmcoMTEpICk7CgkJCQl9CgkJCQluZXdfb3JkZXIgPSBuZXdfb3JkZXIuam9pbiggJywnICk7CgkJCQlqUXVlcnkoICcjcGJfb3JkZXInICkudmFsKCBuZXdfb3JkZXIgKQoJCQl9LAoJCQlkcmFnSGFuZGxlOiAicGJfZHJhZ2hhbmRsZSIKCQl9KTsKCX0KCQoJalF1ZXJ5KCcucGJfdG9nZ2xlJykuY2xpY2soZnVuY3Rpb24oZSkgewoJCWpRdWVyeSggJyNwYl90b2dnbGUtJyArIGpRdWVyeSh0aGlzKS5hdHRyKCdpZCcpICkuc2xpZGVUb2dnbGUoKTsKCX0pOwoJCgkKCQoJLy8gSGlkZSBhIGRpc21pc3NhYmxlIGFsZXJ0IGFuZCBzZW5kIEFKQVggY2FsbCBzbyBpdCB3b24ndCBiZSBzaG93biBpbiB0aGUgZnV0dXJlLgoJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X2Rpc2FsZXJ0JyApLmNsaWNrKCBmdW5jdGlvbihlKSB7CgkJCgkJdmFyIHRoaXNfdW5pcXVlX2lkID0galF1ZXJ5KHRoaXMpLnBhcmVudHMoJy5wYl9iYWNrdXBidWRkeV9hbGVydCcpLmF0dHIoJ3JlbCcpOwoJCXZhciB0aGlzX2Rpc2FsZXJ0X3VybCA9IGpRdWVyeSh0aGlzKS5hdHRyKCdhbHQnKTsKCQkvL2FsZXJ0KCB1bmlxdWVfaWQgKTsKCQkKCQlqUXVlcnkucG9zdCggdGhpc19kaXNhbGVydF91cmwsCgkJCXsgdW5pcXVlX2lkOiB0aGlzX3VuaXF1ZV9pZCB9LCAKCQkJZnVuY3Rpb24oZGF0YSkgewoJCQkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgkJCQlpZiAoIGRhdGEgIT0gJzEnICkgewoJCQkJCWFsZXJ0KCAnRXJyb3Igc2F2aW5nIGRpc21pc3NhbC4gVGhlIGFsZXJ0IG1heSByZXR1cm4uIEVycm9yOiAnICsgZGF0YSApOwoJCQkJfQoJCQl9CgkJKTsKCQkKCQlqUXVlcnkodGhpcykucGFyZW50cygnLnBiX2JhY2t1cGJ1ZGR5X2FsZXJ0Jykuc2xpZGVVcCgpOwoJCQoJfSk7CgkKCQoJCn0pOw==
###PACKDATA,FILE_END,/pluginbuddy/js/admin.js,importbuddy/pluginbuddy/js/admin.js
###PACKDATA,FILE_START,/pluginbuddy/js/index.php,importbuddy/pluginbuddy/js/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/pluginbuddy/js/index.php,importbuddy/pluginbuddy/js/index.php
###PACKDATA,FILE_START,/pluginbuddy/js/jquery.miniColors.min.js,importbuddy/pluginbuddy/js/jquery.miniColors.min.js
LyoKICogalF1ZXJ5IG1pbmlDb2xvcnM6IEEgc21hbGwgY29sb3Igc2VsZWN0b3IKICoKICogQ29weXJpZ2h0IDIwMTEgQ29yeSBMYVZpc2thIGZvciBBIEJlYXV0aWZ1bCBTaXRlLCBMTEMuIChodHRwOi8vYWJlYXV0aWZ1bHNpdGUubmV0LykKICoKICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMKICoKKi8KaWYoalF1ZXJ5KShmdW5jdGlvbigkKXskLmV4dGVuZCgkLmZuLHttaW5pQ29sb3JzOmZ1bmN0aW9uKG8sZGF0YSl7dmFyIGNyZWF0ZT1mdW5jdGlvbihpbnB1dCxvLGRhdGEpe3ZhciBjb2xvcj1leHBhbmRIZXgoaW5wdXQudmFsKCkpO2lmKCFjb2xvciljb2xvcj0nZmZmZmZmJzt2YXIgaHNiPWhleDJoc2IoY29sb3IpO3ZhciB0cmlnZ2VyPSQoJzxhIGNsYXNzPSJtaW5pQ29sb3JzLXRyaWdnZXIiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjJytjb2xvcisnIiBocmVmPSIjIj48L2E+Jyk7dHJpZ2dlci5pbnNlcnRBZnRlcihpbnB1dCk7aW5wdXQuYWRkQ2xhc3MoJ21pbmlDb2xvcnMnKS5kYXRhKCdvcmlnaW5hbC1tYXhsZW5ndGgnLGlucHV0LmF0dHIoJ21heGxlbmd0aCcpfHxudWxsKS5kYXRhKCdvcmlnaW5hbC1hdXRvY29tcGxldGUnLGlucHV0LmF0dHIoJ2F1dG9jb21wbGV0ZScpfHxudWxsKS5kYXRhKCdsZXR0ZXJDYXNlJywndXBwZXJjYXNlJykuZGF0YSgndHJpZ2dlcicsdHJpZ2dlcikuZGF0YSgnaHNiJyxoc2IpLmRhdGEoJ2NoYW5nZScsby5jaGFuZ2U/by5jaGFuZ2U6bnVsbCkuYXR0cignbWF4bGVuZ3RoJyw3KS5hdHRyKCdhdXRvY29tcGxldGUnLCdvZmYnKS52YWwoJyMnK2NvbnZlcnRDYXNlKGNvbG9yLG8ubGV0dGVyQ2FzZSkpO2lmKG8ucmVhZG9ubHkpaW5wdXQucHJvcCgncmVhZG9ubHknLHRydWUpO2lmKG8uZGlzYWJsZWQpZGlzYWJsZShpbnB1dCk7dHJpZ2dlci5iaW5kKCdjbGljay5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtpZihpbnB1dC52YWwoKT09PScnKWlucHV0LnZhbCgnIycpO3Nob3coaW5wdXQpfSk7aW5wdXQuYmluZCgnZm9jdXMubWluaUNvbG9ycycsZnVuY3Rpb24oZXZlbnQpe2lmKGlucHV0LnZhbCgpPT09JycpaW5wdXQudmFsKCcjJyk7c2hvdyhpbnB1dCl9KTtpbnB1dC5iaW5kKCdibHVyLm1pbmlDb2xvcnMnLGZ1bmN0aW9uKGV2ZW50KXt2YXIgaGV4PWV4cGFuZEhleChpbnB1dC52YWwoKSk7aW5wdXQudmFsKGhleD8nIycrY29udmVydENhc2UoaGV4LGlucHV0LmRhdGEoJ2xldHRlckNhc2UnKSk6JycpfSk7aW5wdXQuYmluZCgna2V5ZG93bi5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7aWYoZXZlbnQua2V5Q29kZT09PTkpaGlkZShpbnB1dCl9KTtpbnB1dC5iaW5kKCdrZXl1cC5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7c2V0Q29sb3JGcm9tSW5wdXQoaW5wdXQpfSk7aW5wdXQuYmluZCgncGFzdGUubWluaUNvbG9ycycsZnVuY3Rpb24oZXZlbnQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZXRDb2xvckZyb21JbnB1dChpbnB1dCl9LDUpfSl9O3ZhciBkZXN0cm95PWZ1bmN0aW9uKGlucHV0KXtoaWRlKCk7aW5wdXQ9JChpbnB1dCk7aW5wdXQuZGF0YSgndHJpZ2dlcicpLnJlbW92ZSgpO2lucHV0LmF0dHIoJ2F1dG9jb21wbGV0ZScsaW5wdXQuZGF0YSgnb3JpZ2luYWwtYXV0b2NvbXBsZXRlJykpLmF0dHIoJ21heGxlbmd0aCcsaW5wdXQuZGF0YSgnb3JpZ2luYWwtbWF4bGVuZ3RoJykpLnJlbW92ZURhdGEoKS5yZW1vdmVDbGFzcygnbWluaUNvbG9ycycpLnVuYmluZCgnLm1pbmlDb2xvcnMnKTskKGRvY3VtZW50KS51bmJpbmQoJy5taW5pQ29sb3JzJyl9O3ZhciBlbmFibGU9ZnVuY3Rpb24oaW5wdXQpe2lucHV0LnByb3AoJ2Rpc2FibGVkJyxmYWxzZSkuZGF0YSgndHJpZ2dlcicpLmNzcygnb3BhY2l0eScsMSl9O3ZhciBkaXNhYmxlPWZ1bmN0aW9uKGlucHV0KXtoaWRlKGlucHV0KTtpbnB1dC5wcm9wKCdkaXNhYmxlZCcsdHJ1ZSkuZGF0YSgndHJpZ2dlcicpLmNzcygnb3BhY2l0eScsMC41KX07dmFyIHNob3c9ZnVuY3Rpb24oaW5wdXQpe2lmKGlucHV0LnByb3AoJ2Rpc2FibGVkJykpcmV0dXJuIGZhbHNlO2hpZGUoKTt2YXIgc2VsZWN0b3I9JCgnPGRpdiBjbGFzcz0ibWluaUNvbG9ycy1zZWxlY3RvciI+PC9kaXY+Jyk7c2VsZWN0b3IuYXBwZW5kKCc8ZGl2IGNsYXNzPSJtaW5pQ29sb3JzLWNvbG9ycyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkY7Ij48ZGl2IGNsYXNzPSJtaW5pQ29sb3JzLWNvbG9yUGlja2VyIj48L2Rpdj48L2Rpdj4nKS5hcHBlbmQoJzxkaXYgY2xhc3M9Im1pbmlDb2xvcnMtaHVlcyI+PGRpdiBjbGFzcz0ibWluaUNvbG9ycy1odWVQaWNrZXIiPjwvZGl2PjwvZGl2PicpLmNzcyh7dG9wOmlucHV0LmlzKCc6dmlzaWJsZScpP2lucHV0Lm9mZnNldCgpLnRvcCtpbnB1dC5vdXRlckhlaWdodCgpOmlucHV0LmRhdGEoJ3RyaWdnZXInKS5vZmZzZXQoKS50b3AraW5wdXQuZGF0YSgndHJpZ2dlcicpLm91dGVySGVpZ2h0KCksbGVmdDppbnB1dC5pcygnOnZpc2libGUnKT9pbnB1dC5vZmZzZXQoKS5sZWZ0OmlucHV0LmRhdGEoJ3RyaWdnZXInKS5vZmZzZXQoKS5sZWZ0LGRpc3BsYXk6J25vbmUnfSkuYWRkQ2xhc3MoaW5wdXQuYXR0cignY2xhc3MnKSk7dmFyIGhzYj1pbnB1dC5kYXRhKCdoc2InKTtzZWxlY3Rvci5maW5kKCcubWluaUNvbG9ycy1jb2xvcnMnKS5jc3MoJ2JhY2tncm91bmRDb2xvcicsJyMnK2hzYjJoZXgoe2g6aHNiLmgsczoxMDAsYjoxMDB9KSk7dmFyIGNvbG9yUG9zaXRpb249aW5wdXQuZGF0YSgnY29sb3JQb3NpdGlvbicpO2lmKCFjb2xvclBvc2l0aW9uKWNvbG9yUG9zaXRpb249Z2V0Q29sb3JQb3NpdGlvbkZyb21IU0IoaHNiKTtzZWxlY3Rvci5maW5kKCcubWluaUNvbG9ycy1jb2xvclBpY2tlcicpLmNzcygndG9wJyxjb2xvclBvc2l0aW9uLnkrJ3B4JykuY3NzKCdsZWZ0Jyxjb2xvclBvc2l0aW9uLngrJ3B4Jyk7dmFyIGh1ZVBvc2l0aW9uPWlucHV0LmRhdGEoJ2h1ZVBvc2l0aW9uJyk7aWYoIWh1ZVBvc2l0aW9uKWh1ZVBvc2l0aW9uPWdldEh1ZVBvc2l0aW9uRnJvbUhTQihoc2IpO3NlbGVjdG9yLmZpbmQoJy5taW5pQ29sb3JzLWh1ZVBpY2tlcicpLmNzcygndG9wJyxodWVQb3NpdGlvbi55KydweCcpO2lucHV0LmRhdGEoJ3NlbGVjdG9yJyxzZWxlY3RvcikuZGF0YSgnaHVlUGlja2VyJyxzZWxlY3Rvci5maW5kKCcubWluaUNvbG9ycy1odWVQaWNrZXInKSkuZGF0YSgnY29sb3JQaWNrZXInLHNlbGVjdG9yLmZpbmQoJy5taW5pQ29sb3JzLWNvbG9yUGlja2VyJykpLmRhdGEoJ21vdXNlYnV0dG9uJywwKTskKCdCT0RZJykuYXBwZW5kKHNlbGVjdG9yKTtzZWxlY3Rvci5mYWRlSW4oMTAwKTtzZWxlY3Rvci5iaW5kKCdzZWxlY3RzdGFydCcsZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9KTskKGRvY3VtZW50KS5iaW5kKCdtb3VzZWRvd24ubWluaUNvbG9ycyB0b3VjaHN0YXJ0Lm1pbmlDb2xvcnMnLGZ1bmN0aW9uKGV2ZW50KXtpbnB1dC5kYXRhKCdtb3VzZWJ1dHRvbicsMSk7aWYoJChldmVudC50YXJnZXQpLnBhcmVudHMoKS5hbmRTZWxmKCkuaGFzQ2xhc3MoJ21pbmlDb2xvcnMtY29sb3JzJykpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7aW5wdXQuZGF0YSgnbW92aW5nJywnY29sb3JzJyk7bW92ZUNvbG9yKGlucHV0LGV2ZW50KX1pZigkKGV2ZW50LnRhcmdldCkucGFyZW50cygpLmFuZFNlbGYoKS5oYXNDbGFzcygnbWluaUNvbG9ycy1odWVzJykpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7aW5wdXQuZGF0YSgnbW92aW5nJywnaHVlcycpO21vdmVIdWUoaW5wdXQsZXZlbnQpfWlmKCQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmhhc0NsYXNzKCdtaW5pQ29sb3JzLXNlbGVjdG9yJykpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7cmV0dXJufWlmKCQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCkuYW5kU2VsZigpLmhhc0NsYXNzKCdtaW5pQ29sb3JzJykpcmV0dXJuO2hpZGUoaW5wdXQpfSk7JChkb2N1bWVudCkuYmluZCgnbW91c2V1cC5taW5pQ29sb3JzIHRvdWNoZW5kLm1pbmlDb2xvcnMnLGZ1bmN0aW9uKGV2ZW50KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2lucHV0LmRhdGEoJ21vdXNlYnV0dG9uJywwKS5yZW1vdmVEYXRhKCdtb3ZpbmcnKX0pLmJpbmQoJ21vdXNlbW92ZS5taW5pQ29sb3JzIHRvdWNobW92ZS5taW5pQ29sb3JzJyxmdW5jdGlvbihldmVudCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtpZihpbnB1dC5kYXRhKCdtb3VzZWJ1dHRvbicpPT09MSl7aWYoaW5wdXQuZGF0YSgnbW92aW5nJyk9PT0nY29sb3JzJyltb3ZlQ29sb3IoaW5wdXQsZXZlbnQpO2lmKGlucHV0LmRhdGEoJ21vdmluZycpPT09J2h1ZXMnKW1vdmVIdWUoaW5wdXQsZXZlbnQpfX0pfTt2YXIgaGlkZT1mdW5jdGlvbihpbnB1dCl7aWYoIWlucHV0KWlucHV0PScubWluaUNvbG9ycyc7JChpbnB1dCkuZWFjaChmdW5jdGlvbigpe3ZhciBzZWxlY3Rvcj0kKHRoaXMpLmRhdGEoJ3NlbGVjdG9yJyk7JCh0aGlzKS5yZW1vdmVEYXRhKCdzZWxlY3RvcicpOyQoc2VsZWN0b3IpLmZhZGVPdXQoMTAwLGZ1bmN0aW9uKCl7JCh0aGlzKS5yZW1vdmUoKX0pfSk7JChkb2N1bWVudCkudW5iaW5kKCdtb3VzZWRvd24ubWluaUNvbG9ycyB0b3VjaHN0YXJ0Lm1pbmlDb2xvcnMnKS51bmJpbmQoJ21vdXNlbW92ZS5taW5pQ29sb3JzIHRvdWNobW92ZS5taW5pQ29sb3JzJyl9O3ZhciBtb3ZlQ29sb3I9ZnVuY3Rpb24oaW5wdXQsZXZlbnQpe3ZhciBjb2xvclBpY2tlcj1pbnB1dC5kYXRhKCdjb2xvclBpY2tlcicpO2NvbG9yUGlja2VyLmhpZGUoKTt2YXIgcG9zaXRpb249e3g6ZXZlbnQucGFnZVgseTpldmVudC5wYWdlWX07aWYoZXZlbnQub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcyl7cG9zaXRpb24ueD1ldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO3Bvc2l0aW9uLnk9ZXZlbnQub3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWX1wb3NpdGlvbi54PXBvc2l0aW9uLngtaW5wdXQuZGF0YSgnc2VsZWN0b3InKS5maW5kKCcubWluaUNvbG9ycy1jb2xvcnMnKS5vZmZzZXQoKS5sZWZ0LTU7cG9zaXRpb24ueT1wb3NpdGlvbi55LWlucHV0LmRhdGEoJ3NlbGVjdG9yJykuZmluZCgnLm1pbmlDb2xvcnMtY29sb3JzJykub2Zmc2V0KCkudG9wLTU7aWYocG9zaXRpb24ueDw9LTUpcG9zaXRpb24ueD0tNTtpZihwb3NpdGlvbi54Pj0xNDQpcG9zaXRpb24ueD0xNDQ7aWYocG9zaXRpb24ueTw9LTUpcG9zaXRpb24ueT0tNTtpZihwb3NpdGlvbi55Pj0xNDQpcG9zaXRpb24ueT0xNDQ7aW5wdXQuZGF0YSgnY29sb3JQb3NpdGlvbicscG9zaXRpb24pO2NvbG9yUGlja2VyLmNzcygnbGVmdCcscG9zaXRpb24ueCkuY3NzKCd0b3AnLHBvc2l0aW9uLnkpLnNob3coKTt2YXIgcz1NYXRoLnJvdW5kKChwb3NpdGlvbi54KzUpKjAuNjcpO2lmKHM8MClzPTA7aWYocz4xMDApcz0xMDA7dmFyIGI9MTAwLU1hdGgucm91bmQoKHBvc2l0aW9uLnkrNSkqMC42Nyk7aWYoYjwwKWI9MDtpZihiPjEwMCliPTEwMDt2YXIgaHNiPWlucHV0LmRhdGEoJ2hzYicpO2hzYi5zPXM7aHNiLmI9YjtzZXRDb2xvcihpbnB1dCxoc2IsdHJ1ZSl9O3ZhciBtb3ZlSHVlPWZ1bmN0aW9uKGlucHV0LGV2ZW50KXt2YXIgaHVlUGlja2VyPWlucHV0LmRhdGEoJ2h1ZVBpY2tlcicpO2h1ZVBpY2tlci5oaWRlKCk7dmFyIHBvc2l0aW9uPXt5OmV2ZW50LnBhZ2VZfTtpZihldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzKXtwb3NpdGlvbi55PWV2ZW50Lm9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVl9cG9zaXRpb24ueT1wb3NpdGlvbi55LWlucHV0LmRhdGEoJ3NlbGVjdG9yJykuZmluZCgnLm1pbmlDb2xvcnMtY29sb3JzJykub2Zmc2V0KCkudG9wLTE7aWYocG9zaXRpb24ueTw9LTEpcG9zaXRpb24ueT0tMTtpZihwb3NpdGlvbi55Pj0xNDkpcG9zaXRpb24ueT0xNDk7aW5wdXQuZGF0YSgnaHVlUG9zaXRpb24nLHBvc2l0aW9uKTtodWVQaWNrZXIuY3NzKCd0b3AnLHBvc2l0aW9uLnkpLnNob3coKTt2YXIgaD1NYXRoLnJvdW5kKCgxNTAtcG9zaXRpb24ueS0xKSoyLjQpO2lmKGg8MCloPTA7aWYoaD4zNjApaD0zNjA7dmFyIGhzYj1pbnB1dC5kYXRhKCdoc2InKTtoc2IuaD1oO3NldENvbG9yKGlucHV0LGhzYix0cnVlKX07dmFyIHNldENvbG9yPWZ1bmN0aW9uKGlucHV0LGhzYix1cGRhdGVJbnB1dCl7aW5wdXQuZGF0YSgnaHNiJyxoc2IpO3ZhciBoZXg9aHNiMmhleChoc2IpO2lmKHVwZGF0ZUlucHV0KWlucHV0LnZhbCgnIycrY29udmVydENhc2UoaGV4LGlucHV0LmRhdGEoJ2xldHRlckNhc2UnKSkpO2lucHV0LmRhdGEoJ3RyaWdnZXInKS5jc3MoJ2JhY2tncm91bmRDb2xvcicsJyMnK2hleCk7aWYoaW5wdXQuZGF0YSgnc2VsZWN0b3InKSlpbnB1dC5kYXRhKCdzZWxlY3RvcicpLmZpbmQoJy5taW5pQ29sb3JzLWNvbG9ycycpLmNzcygnYmFja2dyb3VuZENvbG9yJywnIycraHNiMmhleCh7aDpoc2IuaCxzOjEwMCxiOjEwMH0pKTtpZihpbnB1dC5kYXRhKCdjaGFuZ2UnKSl7aWYoaGV4PT09aW5wdXQuZGF0YSgnbGFzdENoYW5nZScpKXJldHVybjtpbnB1dC5kYXRhKCdjaGFuZ2UnKS5jYWxsKGlucHV0LCcjJytoZXgsaHNiMnJnYihoc2IpKTtpbnB1dC5kYXRhKCdsYXN0Q2hhbmdlJyxoZXgpfX07dmFyIHNldENvbG9yRnJvbUlucHV0PWZ1bmN0aW9uKGlucHV0KXtpbnB1dC52YWwoJyMnK2NsZWFuSGV4KGlucHV0LnZhbCgpKSk7dmFyIGhleD1leHBhbmRIZXgoaW5wdXQudmFsKCkpO2lmKCFoZXgpcmV0dXJuIGZhbHNlO3ZhciBoc2I9aGV4MmhzYihoZXgpO3ZhciBjdXJyZW50SFNCPWlucHV0LmRhdGEoJ2hzYicpO2lmKGhzYi5oPT09Y3VycmVudEhTQi5oJiZoc2Iucz09PWN1cnJlbnRIU0IucyYmaHNiLmI9PT1jdXJyZW50SFNCLmIpcmV0dXJuIHRydWU7dmFyIGNvbG9yUG9zaXRpb249Z2V0Q29sb3JQb3NpdGlvbkZyb21IU0IoaHNiKTt2YXIgY29sb3JQaWNrZXI9JChpbnB1dC5kYXRhKCdjb2xvclBpY2tlcicpKTtjb2xvclBpY2tlci5jc3MoJ3RvcCcsY29sb3JQb3NpdGlvbi55KydweCcpLmNzcygnbGVmdCcsY29sb3JQb3NpdGlvbi54KydweCcpO2lucHV0LmRhdGEoJ2NvbG9yUG9zaXRpb24nLGNvbG9yUG9zaXRpb24pO3ZhciBodWVQb3NpdGlvbj1nZXRIdWVQb3NpdGlvbkZyb21IU0IoaHNiKTt2YXIgaHVlUGlja2VyPSQoaW5wdXQuZGF0YSgnaHVlUGlja2VyJykpO2h1ZVBpY2tlci5jc3MoJ3RvcCcsaHVlUG9zaXRpb24ueSsncHgnKTtpbnB1dC5kYXRhKCdodWVQb3NpdGlvbicsaHVlUG9zaXRpb24pO3NldENvbG9yKGlucHV0LGhzYik7cmV0dXJuIHRydWV9O3ZhciBjb252ZXJ0Q2FzZT1mdW5jdGlvbihzdHJpbmcsbGV0dGVyQ2FzZSl7aWYobGV0dGVyQ2FzZT09PSdsb3dlcmNhc2UnKXJldHVybiBzdHJpbmcudG9Mb3dlckNhc2UoKTtpZihsZXR0ZXJDYXNlPT09J3VwcGVyY2FzZScpcmV0dXJuIHN0cmluZy50b1VwcGVyQ2FzZSgpO3JldHVybiBzdHJpbmd9O3ZhciBnZXRDb2xvclBvc2l0aW9uRnJvbUhTQj1mdW5jdGlvbihoc2Ipe3ZhciB4PU1hdGguY2VpbChoc2Iucy8wLjY3KTtpZih4PDApeD0wO2lmKHg+MTUwKXg9MTUwO3ZhciB5PTE1MC1NYXRoLmNlaWwoaHNiLmIvMC42Nyk7aWYoeTwwKXk9MDtpZih5PjE1MCl5PTE1MDtyZXR1cm57eDp4LTUseTp5LTV9fTt2YXIgZ2V0SHVlUG9zaXRpb25Gcm9tSFNCPWZ1bmN0aW9uKGhzYil7dmFyIHk9MTUwLShoc2IuaC8yLjQpO2lmKHk8MCloPTA7aWYoeT4xNTApaD0xNTA7cmV0dXJue3k6eS0xfX07dmFyIGNsZWFuSGV4PWZ1bmN0aW9uKGhleCl7cmV0dXJuIGhleC5yZXBsYWNlKC9bXkEtRjAtOV0vaWcsJycpfTt2YXIgZXhwYW5kSGV4PWZ1bmN0aW9uKGhleCl7aGV4PWNsZWFuSGV4KGhleCk7aWYoIWhleClyZXR1cm4gbnVsbDtpZihoZXgubGVuZ3RoPT09MyloZXg9aGV4WzBdK2hleFswXStoZXhbMV0raGV4WzFdK2hleFsyXStoZXhbMl07cmV0dXJuIGhleC5sZW5ndGg9PT02P2hleDpudWxsfTt2YXIgaHNiMnJnYj1mdW5jdGlvbihoc2Ipe3ZhciByZ2I9e307dmFyIGg9TWF0aC5yb3VuZChoc2IuaCk7dmFyIHM9TWF0aC5yb3VuZChoc2IucyoyNTUvMTAwKTt2YXIgdj1NYXRoLnJvdW5kKGhzYi5iKjI1NS8xMDApO2lmKHM9PT0wKXtyZ2Iucj1yZ2IuZz1yZ2IuYj12fWVsc2V7dmFyIHQxPXY7dmFyIHQyPSgyNTUtcykqdi8yNTU7dmFyIHQzPSh0MS10MikqKGglNjApLzYwO2lmKGg9PT0zNjApaD0wO2lmKGg8NjApe3JnYi5yPXQxO3JnYi5iPXQyO3JnYi5nPXQyK3QzfWVsc2UgaWYoaDwxMjApe3JnYi5nPXQxO3JnYi5iPXQyO3JnYi5yPXQxLXQzfWVsc2UgaWYoaDwxODApe3JnYi5nPXQxO3JnYi5yPXQyO3JnYi5iPXQyK3QzfWVsc2UgaWYoaDwyNDApe3JnYi5iPXQxO3JnYi5yPXQyO3JnYi5nPXQxLXQzfWVsc2UgaWYoaDwzMDApe3JnYi5iPXQxO3JnYi5nPXQyO3JnYi5yPXQyK3QzfWVsc2UgaWYoaDwzNjApe3JnYi5yPXQxO3JnYi5nPXQyO3JnYi5iPXQxLXQzfWVsc2V7cmdiLnI9MDtyZ2IuZz0wO3JnYi5iPTB9fXJldHVybntyOk1hdGgucm91bmQocmdiLnIpLGc6TWF0aC5yb3VuZChyZ2IuZyksYjpNYXRoLnJvdW5kKHJnYi5iKX19O3ZhciByZ2IyaGV4PWZ1bmN0aW9uKHJnYil7dmFyIGhleD1bcmdiLnIudG9TdHJpbmcoMTYpLHJnYi5nLnRvU3RyaW5nKDE2KSxyZ2IuYi50b1N0cmluZygxNildOyQuZWFjaChoZXgsZnVuY3Rpb24obnIsdmFsKXtpZih2YWwubGVuZ3RoPT09MSloZXhbbnJdPScwJyt2YWx9KTtyZXR1cm4gaGV4LmpvaW4oJycpfTt2YXIgaGV4MnJnYj1mdW5jdGlvbihoZXgpe2hleD1wYXJzZUludCgoKGhleC5pbmRleE9mKCcjJyk+LTEpP2hleC5zdWJzdHJpbmcoMSk6aGV4KSwxNik7cmV0dXJue3I6aGV4Pj4xNixnOihoZXgmMHgwMEZGMDApPj44LGI6KGhleCYweDAwMDBGRil9fTt2YXIgcmdiMmhzYj1mdW5jdGlvbihyZ2Ipe3ZhciBoc2I9e2g6MCxzOjAsYjowfTt2YXIgbWluPU1hdGgubWluKHJnYi5yLHJnYi5nLHJnYi5iKTt2YXIgbWF4PU1hdGgubWF4KHJnYi5yLHJnYi5nLHJnYi5iKTt2YXIgZGVsdGE9bWF4LW1pbjtoc2IuYj1tYXg7aHNiLnM9bWF4IT09MD8yNTUqZGVsdGEvbWF4OjA7aWYoaHNiLnMhPT0wKXtpZihyZ2Iucj09PW1heCl7aHNiLmg9KHJnYi5nLXJnYi5iKS9kZWx0YX1lbHNlIGlmKHJnYi5nPT09bWF4KXtoc2IuaD0yKyhyZ2IuYi1yZ2IucikvZGVsdGF9ZWxzZXtoc2IuaD00KyhyZ2Iuci1yZ2IuZykvZGVsdGF9fWVsc2V7aHNiLmg9LTF9aHNiLmgqPTYwO2lmKGhzYi5oPDApe2hzYi5oKz0zNjB9aHNiLnMqPTEwMC8yNTU7aHNiLmIqPTEwMC8yNTU7cmV0dXJuIGhzYn07dmFyIGhleDJoc2I9ZnVuY3Rpb24oaGV4KXt2YXIgaHNiPXJnYjJoc2IoaGV4MnJnYihoZXgpKTtpZihoc2Iucz09PTApaHNiLmg9MzYwO3JldHVybiBoc2J9O3ZhciBoc2IyaGV4PWZ1bmN0aW9uKGhzYil7cmV0dXJuIHJnYjJoZXgoaHNiMnJnYihoc2IpKX07c3dpdGNoKG8pe2Nhc2UncmVhZG9ubHknOiQodGhpcykuZWFjaChmdW5jdGlvbigpe2lmKCEkKHRoaXMpLmhhc0NsYXNzKCdtaW5pQ29sb3JzJykpcmV0dXJuOyQodGhpcykucHJvcCgncmVhZG9ubHknLGRhdGEpfSk7cmV0dXJuICQodGhpcyk7Y2FzZSdkaXNhYmxlZCc6JCh0aGlzKS5lYWNoKGZ1bmN0aW9uKCl7aWYoISQodGhpcykuaGFzQ2xhc3MoJ21pbmlDb2xvcnMnKSlyZXR1cm47aWYoZGF0YSl7ZGlzYWJsZSgkKHRoaXMpKX1lbHNle2VuYWJsZSgkKHRoaXMpKX19KTtyZXR1cm4gJCh0aGlzKTtjYXNlJ3ZhbHVlJzppZihkYXRhPT09dW5kZWZpbmVkKXtpZighJCh0aGlzKS5oYXNDbGFzcygnbWluaUNvbG9ycycpKXJldHVybjt2YXIgaW5wdXQ9JCh0aGlzKSxoZXg9ZXhwYW5kSGV4KGlucHV0LnZhbCgpKTtyZXR1cm4gaGV4PycjJytjb252ZXJ0Q2FzZShoZXgsaW5wdXQuZGF0YSgnbGV0dGVyQ2FzZScpKTpudWxsfSQodGhpcykuZWFjaChmdW5jdGlvbigpe2lmKCEkKHRoaXMpLmhhc0NsYXNzKCdtaW5pQ29sb3JzJykpcmV0dXJuOyQodGhpcykudmFsKGRhdGEpO3NldENvbG9yRnJvbUlucHV0KCQodGhpcykpfSk7cmV0dXJuICQodGhpcyk7Y2FzZSdkZXN0cm95JzokKHRoaXMpLmVhY2goZnVuY3Rpb24oKXtpZighJCh0aGlzKS5oYXNDbGFzcygnbWluaUNvbG9ycycpKXJldHVybjtkZXN0cm95KCQodGhpcykpfSk7cmV0dXJuICQodGhpcyk7ZGVmYXVsdDppZighbylvPXt9OyQodGhpcykuZWFjaChmdW5jdGlvbigpe2lmKCQodGhpcylbMF0udGFnTmFtZS50b0xvd2VyQ2FzZSgpIT09J2lucHV0JylyZXR1cm47aWYoJCh0aGlzKS5kYXRhKCd0cmlnZ2VyJykpcmV0dXJuO2NyZWF0ZSgkKHRoaXMpLG8sZGF0YSl9KTtyZXR1cm4gJCh0aGlzKX19fSl9KShqUXVlcnkpOw==
###PACKDATA,FILE_END,/pluginbuddy/js/jquery.miniColors.min.js,importbuddy/pluginbuddy/js/jquery.miniColors.min.js
###PACKDATA,FILE_START,/pluginbuddy/js/pb_tabs.js,importbuddy/pluginbuddy/js/pb_tabs.js
alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQoJLy8gQ2hhbmdlIHRhYiBvbiBjbGljay4KCWpRdWVyeSggJy5iYWNrdXBidWRkeS10YWJzLXdyYXAgLm5hdi10YWJbaHJlZl49IiMiXScgKS5jbGljayggZnVuY3Rpb24oZSl7IC8qIGlnbm9yZXMgYW55IG5vbiBoYXNodGFnIGxpbmtzIHNpbmNlIHRoZXkgZ28gZGlyZWN0IHRvIGEgVVJMLi4uICovCgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCQoJCS8vIEhpZGUgYWxsIHRhYiBibG9ja3MuCgkJdGhpc1RhYkJsb2NrID0galF1ZXJ5KHRoaXMpLmNsb3Nlc3QoICcuYmFja3VwYnVkZHktdGFicy13cmFwJyApOwoJCXRoaXNUYWJCbG9jay5maW5kKCAnLmJhY2t1cGJ1ZGR5LXRhYicgKS5oaWRlKCk7CgkJCgkJLy8gVXBkYXRlIHNlbGVjdGVkIHRhYi4KCQl0aGlzVGFiQmxvY2suZmluZCggJy5uYXYtdGFiLWFjdGl2ZScgKS5yZW1vdmVDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCWpRdWVyeSh0aGlzKS5hZGRDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCQoJCS8vIFNob3cgdGhlIGNvcnJlY3QgdGFiIGJsb2NrLgoJCS8vdGFyZ2V0RGl2SUQgPSBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICkuc3Vic3RyaW5nKDEpOwoJCXRoaXNUYWJCbG9jay5maW5kKCBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICkgKS5zaG93KCk7Cgl9KTsKCQoJLy8gQ2hhbmdlIHRhYiBvbiBjbGljayAtLSBBSkFYIHZlcnNpb24uCglqUXVlcnkoICcuYmFja3VwYnVkZHktdGFicy13cmFwIC5uYXYtdGFiW2hyZWZePSJqYXZhc2NyaXB0Il0nICkuY2xpY2soIGZ1bmN0aW9uKGUpeyAvKiBpZ25vcmVzIGFueSBub24gaGFzaHRhZyBsaW5rcyBzaW5jZSB0aGV5IGdvIGRpcmVjdCB0byBhIFVSTC4uLiAqLwoJCS8vIEhpZGUgYWxsIHRhYiBibG9ja3MuCgkJdGhpc1RhYkJsb2NrID0galF1ZXJ5KHRoaXMpLmNsb3Nlc3QoICcuYmFja3VwYnVkZHktdGFicy13cmFwJyApOwoJCXRoaXNUYWJCbG9jay5maW5kKCAnLmJhY2t1cGJ1ZGR5LXRhYicgKS5oaWRlKCk7CgkJCgkJLy8gVXBkYXRlIHNlbGVjdGVkIHRhYi4KCQl0aGlzVGFiQmxvY2suZmluZCggJy5uYXYtdGFiLWFjdGl2ZScgKS5yZW1vdmVDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCWpRdWVyeSh0aGlzKS5hZGRDbGFzcyggJ25hdi10YWItYWN0aXZlJyApOwoJCQoJCS8vIFNob3cgdGhlIGNvcnJlY3QgdGFiIGJsb2NrLgoJCS8vdGFyZ2V0RGl2SUQgPSBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICkuc3Vic3RyaW5nKDEpOwoJCXRoaXNUYWJCbG9jay5maW5kKCBqUXVlcnkodGhpcykuYXR0ciggJ2RhdGEtYWpheCcgKSApLnNob3coKTsKCX0pOwoJCgkvLyBBdXRvLWRpc3BsYXkgdGhlIGNvcnJlY3QgdGFiIG9uIGxvYWQgaWYgc3BlY2lmeWluZyBhIG5vbi1kZWZhdWx0LgoJalF1ZXJ5KCAnLm5hdi10YWItYWN0aXZlJyApLmVhY2goIGZ1bmN0aW9uKCl7CgkJalF1ZXJ5KHRoaXMpLmNsaWNrKCk7Cgl9KTsKfSk7
###PACKDATA,FILE_END,/pluginbuddy/js/pb_tabs.js,importbuddy/pluginbuddy/js/pb_tabs.js
###PACKDATA,FILE_START,/pluginbuddy/js/tablednd.js,importbuddy/pluginbuddy/js/tablednd.js
LyoqCiAqIFRhYmxlRG5EIHBsdWctaW4gZm9yIEpRdWVyeSwgYWxsb3dzIHlvdSB0byBkcmFnIGFuZCBkcm9wIHRhYmxlIHJvd3MKICogWW91IGNhbiBzZXQgdXAgdmFyaW91cyBvcHRpb25zIHRvIGNvbnRyb2wgaG93IHRoZSBzeXN0ZW0gd2lsbCB3b3JrCiAqIENvcHlyaWdodCAoYykgRGVuaXMgSG93bGV0dCA8ZGVuaXNoQGlzb2NyYS5jb20+CiAqIExpY2Vuc2VkIGxpa2UgalF1ZXJ5LCBzZWUgaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlLgogKi8KalF1ZXJ5LnRhYmxlRG5EID0gewogICAgLyoqIEtlZXAgaG9sZCBvZiB0aGUgY3VycmVudCB0YWJsZSBiZWluZyBkcmFnZ2VkICovCiAgICBjdXJyZW50VGFibGUgOiBudWxsLAogICAgLyoqIEtlZXAgaG9sZCBvZiB0aGUgY3VycmVudCBkcmFnIG9iamVjdCBpZiBhbnkgKi8KICAgIGRyYWdPYmplY3Q6IG51bGwsCiAgICAvKiogVGhlIGN1cnJlbnQgbW91c2Ugb2Zmc2V0ICovCiAgICBtb3VzZU9mZnNldDogbnVsbCwKICAgIC8qKiBSZW1lbWJlciB0aGUgb2xkIHZhbHVlIG9mIFkgc28gdGhhdCB3ZSBkb24ndCBkbyB0b28gbXVjaCBwcm9jZXNzaW5nICovCiAgICBvbGRZOiAwLAoKICAgIC8qKiBBY3R1YWxseSBidWlsZCB0aGUgc3RydWN0dXJlICovCiAgICBidWlsZDogZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIC8vIFNldCB1cCB0aGUgZGVmYXVsdHMgaWYgYW55CgogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBib3VuZCB0byBlYWNoIG1hdGNoaW5nIHRhYmxlLCBzZXQgdXAgdGhlIGRlZmF1bHRzIGFuZCBvdmVycmlkZSB3aXRoIHVzZXIgb3B0aW9ucwogICAgICAgICAgICB0aGlzLnRhYmxlRG5EQ29uZmlnID0galF1ZXJ5LmV4dGVuZCh7CiAgICAgICAgICAgICAgICBvbkRyYWdTdHlsZTogbnVsbCwKICAgICAgICAgICAgICAgIG9uRHJvcFN0eWxlOiBudWxsLAoJCQkJLy8gQWRkIGluIHRoZSBkZWZhdWx0IGNsYXNzIGZvciB3aGlsZURyYWdnaW5nCgkJCQlvbkRyYWdDbGFzczogInREbkRfd2hpbGVEcmFnIiwKICAgICAgICAgICAgICAgIG9uRHJvcDogbnVsbCwKICAgICAgICAgICAgICAgIG9uRHJhZ1N0YXJ0OiBudWxsLAogICAgICAgICAgICAgICAgc2Nyb2xsQW1vdW50OiA1LAoJCQkJc2VyaWFsaXplUmVnZXhwOiAvW15cLV0qJC8sIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlIHRvIHRyaW0gcm93IElEcwoJCQkJc2VyaWFsaXplUGFyYW1OYW1lOiBudWxsLCAvLyBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGFub3RoZXIgcGFyYW1ldGVyIG5hbWUgaW5zdGVhZCBvZiB0aGUgdGFibGUgSUQKICAgICAgICAgICAgICAgIGRyYWdIYW5kbGU6IG51bGwgLy8gSWYgeW91IGdpdmUgdGhlIG5hbWUgb2YgYSBjbGFzcyBoZXJlLCB0aGVuIG9ubHkgQ2VsbHMgd2l0aCB0aGlzIGNsYXNzIHdpbGwgYmUgZHJhZ2dhYmxlCiAgICAgICAgICAgIH0sIG9wdGlvbnMgfHwge30pOwogICAgICAgICAgICAvLyBOb3cgbWFrZSB0aGUgcm93cyBkcmFnZ2FibGUKICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELm1ha2VEcmFnZ2FibGUodGhpcyk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGNhcHR1cmUgdGhlIG1vdXNlIHVwIGFuZCBtb3VzZSBtb3ZlIGV2ZW50CiAgICAgICAgLy8gV2UgY2FuIHVzZSBiaW5kIHNvIHRoYXQgd2UgZG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgZXZlbnQgaGFuZGxlcnMKICAgICAgICBqUXVlcnkoZG9jdW1lbnQpCiAgICAgICAgICAgIC5iaW5kKCdtb3VzZW1vdmUnLCBqUXVlcnkudGFibGVEbkQubW91c2Vtb3ZlKQogICAgICAgICAgICAuYmluZCgnbW91c2V1cCcsIGpRdWVyeS50YWJsZURuRC5tb3VzZXVwKTsKCiAgICAgICAgLy8gRG9uJ3QgYnJlYWsgdGhlIGNoYWluCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAoKICAgIC8qKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIGFsbCB0aGUgcm93cyBvbiB0aGUgdGFibGUgZHJhZ2dhYmxlIGFwYXJ0IGZyb20gdGhvc2UgbWFya2VkIGFzICJOb0RyYWciICovCiAgICBtYWtlRHJhZ2dhYmxlOiBmdW5jdGlvbih0YWJsZSkgewogICAgICAgIHZhciBjb25maWcgPSB0YWJsZS50YWJsZURuRENvbmZpZzsKCQlpZiAodGFibGUudGFibGVEbkRDb25maWcuZHJhZ0hhbmRsZSkgewoJCQkvLyBXZSBvbmx5IG5lZWQgdG8gYWRkIHRoZSBldmVudCB0byB0aGUgc3BlY2lmaWVkIGNlbGxzCgkJCXZhciBjZWxscyA9IGpRdWVyeSgidGQuIit0YWJsZS50YWJsZURuRENvbmZpZy5kcmFnSGFuZGxlLCB0YWJsZSk7CgkJCWNlbGxzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkvLyBUaGUgY2VsbCBpcyBib3VuZCB0byAidGhpcyIKICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5tb3VzZWRvd24oZnVuY3Rpb24oZXYpIHsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlID0gdGFibGU7CiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELm1vdXNlT2Zmc2V0ID0galF1ZXJ5LnRhYmxlRG5ELmdldE1vdXNlT2Zmc2V0KHRoaXMsIGV2KTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm9uRHJhZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIG9uRHJvcCBtZXRob2QgaWYgdGhlcmUgaXMgb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkRyYWdTdGFydCh0YWJsZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoJCQl9KQoJCX0gZWxzZSB7CgkJCS8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UgYWRkIHRoZSBldmVudCB0byB0aGUgd2hvbGUgcm93CgkgICAgICAgIHZhciByb3dzID0galF1ZXJ5KCJ0ciIsIHRhYmxlKTsgLy8gZ2V0IGFsbCB0aGUgcm93cyBhcyBhIHdyYXBwZWQgc2V0CgkgICAgICAgIHJvd3MuZWFjaChmdW5jdGlvbigpIHsKCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIHJvdywgdGhlIHJvdyBpcyBib3VuZCB0byAidGhpcyIKCQkJCXZhciByb3cgPSBqUXVlcnkodGhpcyk7CgkJCQlpZiAoISByb3cuaGFzQ2xhc3MoIm5vZHJhZyIpKSB7CgkgICAgICAgICAgICAgICAgcm93Lm1vdXNlZG93bihmdW5jdGlvbihldikgewoJICAgICAgICAgICAgICAgICAgICBpZiAoZXYudGFyZ2V0LnRhZ05hbWUgPT0gIlREIikgewoJICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QgPSB0aGlzOwoJICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZSA9IHRhYmxlOwoJICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELm1vdXNlT2Zmc2V0ID0galF1ZXJ5LnRhYmxlRG5ELmdldE1vdXNlT2Zmc2V0KHRoaXMsIGV2KTsKCSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25EcmFnU3RhcnQpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBvbkRyb3AgbWV0aG9kIGlmIHRoZXJlIGlzIG9uZQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vbkRyYWdTdGFydCh0YWJsZSwgdGhpcyk7CgkgICAgICAgICAgICAgICAgICAgICAgICB9CgkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgkgICAgICAgICAgICAgICAgICAgIH0KCSAgICAgICAgICAgICAgICB9KS5jc3MoImN1cnNvciIsICJtb3ZlIik7IC8vIFN0b3JlIHRoZSB0YWJsZURuRCBvYmplY3QKCQkJCX0KCQkJfSk7CgkJfQoJfSwKCgl1cGRhdGVUYWJsZXM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdGhpcyBpcyBub3cgYm91bmQgdG8gZWFjaCBtYXRjaGluZyB0YWJsZQoJCQlpZiAodGhpcy50YWJsZURuRENvbmZpZykgewoJCQkJalF1ZXJ5LnRhYmxlRG5ELm1ha2VEcmFnZ2FibGUodGhpcyk7CgkJCX0KCQl9KQoJfSwKCiAgICAvKiogR2V0IHRoZSBtb3VzZSBjb29yZGluYXRlcyBmcm9tIHRoZSBldmVudCAoYWxsb3dpbmcgZm9yIGJyb3dzZXIgZGlmZmVyZW5jZXMpICovCiAgICBtb3VzZUNvb3JkczogZnVuY3Rpb24oZXYpewogICAgICAgIGlmKGV2LnBhZ2VYIHx8IGV2LnBhZ2VZKXsKICAgICAgICAgICAgcmV0dXJuIHt4OmV2LnBhZ2VYLCB5OmV2LnBhZ2VZfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgeDpldi5jbGllbnRYICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IC0gZG9jdW1lbnQuYm9keS5jbGllbnRMZWZ0LAogICAgICAgICAgICB5OmV2LmNsaWVudFkgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCAgLSBkb2N1bWVudC5ib2R5LmNsaWVudFRvcAogICAgICAgIH07CiAgICB9LAoKICAgIC8qKiBHaXZlbiBhIHRhcmdldCBlbGVtZW50IGFuZCBhIG1vdXNlIGV2ZW50LCBnZXQgdGhlIG1vdXNlIG9mZnNldCBmcm9tIHRoYXQgZWxlbWVudC4KICAgICAgICBUbyBkbyB0aGlzIHdlIG5lZWQgdGhlIGVsZW1lbnQncyBwb3NpdGlvbiBhbmQgdGhlIG1vdXNlIHBvc2l0aW9uICovCiAgICBnZXRNb3VzZU9mZnNldDogZnVuY3Rpb24odGFyZ2V0LCBldikgewogICAgICAgIGV2ID0gZXYgfHwgd2luZG93LmV2ZW50OwoKICAgICAgICB2YXIgZG9jUG9zICAgID0gdGhpcy5nZXRQb3NpdGlvbih0YXJnZXQpOwogICAgICAgIHZhciBtb3VzZVBvcyAgPSB0aGlzLm1vdXNlQ29vcmRzKGV2KTsKICAgICAgICByZXR1cm4ge3g6bW91c2VQb3MueCAtIGRvY1Bvcy54LCB5Om1vdXNlUG9zLnkgLSBkb2NQb3MueX07CiAgICB9LAoKICAgIC8qKiBHZXQgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgYnkgZ29pbmcgdXAgdGhlIERPTSB0cmVlIGFuZCBhZGRpbmcgdXAgYWxsIHRoZSBvZmZzZXRzICovCiAgICBnZXRQb3NpdGlvbjogZnVuY3Rpb24oZSl7CiAgICAgICAgdmFyIGxlZnQgPSAwOwogICAgICAgIHZhciB0b3AgID0gMDsKICAgICAgICAvKiogU2FmYXJpIGZpeCAtLSB0aGFua3MgdG8gTHVpcyBDaGF0byBmb3IgdGhpcyEgKi8KICAgICAgICBpZiAoZS5vZmZzZXRIZWlnaHQgPT0gMCkgewogICAgICAgICAgICAvKiogU2FmYXJpIDIgZG9lc24ndCBjb3JyZWN0bHkgZ3JhYiB0aGUgb2Zmc2V0VG9wIG9mIGEgdGFibGUgcm93CiAgICAgICAgICAgIHRoaXMgaXMgZGV0YWlsZWQgaGVyZToKICAgICAgICAgICAgaHR0cDovL2phY29iLnBlYXJncm92ZS5jb20vYmxvZy8yMDA2L3RlY2huaWNhbC90YWJsZS1yb3ctb2Zmc2V0dG9wLWJ1Zy1pbi1zYWZhcmkvCiAgICAgICAgICAgIHRoZSBzb2x1dGlvbiBpcyBsaWtld2lzZSBub3RlZCB0aGVyZSwgZ3JhYiB0aGUgb2Zmc2V0IG9mIGEgdGFibGUgY2VsbCBpbiB0aGUgcm93IC0gdGhlIGZpcnN0Q2hpbGQuCiAgICAgICAgICAgIG5vdGUgdGhhdCBmaXJlZm94IHdpbGwgcmV0dXJuIGEgdGV4dCBub2RlIGFzIGEgZmlyc3QgY2hpbGQsIHNvIGRlc2lnbmluZyBhIG1vcmUgdGhvcm91Z2gKICAgICAgICAgICAgc29sdXRpb24gbWF5IG5lZWQgdG8gdGFrZSB0aGF0IGludG8gYWNjb3VudCwgZm9yIG5vdyB0aGlzIHNlZW1zIHRvIHdvcmsgaW4gZmlyZWZveCwgc2FmYXJpLCBpZSAqLwogICAgICAgICAgICBlID0gZS5maXJzdENoaWxkOyAvLyBhIHRhYmxlIGNlbGwKICAgICAgICB9CgogICAgICAgIHdoaWxlIChlLm9mZnNldFBhcmVudCl7CiAgICAgICAgICAgIGxlZnQgKz0gZS5vZmZzZXRMZWZ0OwogICAgICAgICAgICB0b3AgICs9IGUub2Zmc2V0VG9wOwogICAgICAgICAgICBlICAgICA9IGUub2Zmc2V0UGFyZW50OwogICAgICAgIH0KCiAgICAgICAgbGVmdCArPSBlLm9mZnNldExlZnQ7CiAgICAgICAgdG9wICArPSBlLm9mZnNldFRvcDsKCiAgICAgICAgcmV0dXJuIHt4OmxlZnQsIHk6dG9wfTsKICAgIH0sCgogICAgbW91c2Vtb3ZlOiBmdW5jdGlvbihldikgewogICAgICAgIGlmIChqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBkcmFnT2JqID0galF1ZXJ5KGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0KTsKICAgICAgICB2YXIgY29uZmlnID0galF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZS50YWJsZURuRENvbmZpZzsKICAgICAgICB2YXIgbW91c2VQb3MgPSBqUXVlcnkudGFibGVEbkQubW91c2VDb29yZHMoZXYpOwogICAgICAgIHZhciB5ID0gbW91c2VQb3MueSAtIGpRdWVyeS50YWJsZURuRC5tb3VzZU9mZnNldC55OwogICAgICAgIC8vYXV0byBzY3JvbGwgdGhlIHdpbmRvdwoJICAgIHZhciB5T2Zmc2V0ID0gd2luZG93LnBhZ2VZT2Zmc2V0OwoJIAlpZiAoZG9jdW1lbnQuYWxsKSB7CgkgICAgICAgIC8vIFdpbmRvd3MgdmVyc2lvbgoJICAgICAgICAvL3lPZmZzZXQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgkgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQuY29tcGF0TW9kZSAhPSAndW5kZWZpbmVkJyAmJgoJICAgICAgICAgICAgIGRvY3VtZW50LmNvbXBhdE1vZGUgIT0gJ0JhY2tDb21wYXQnKSB7CgkgICAgICAgICAgIHlPZmZzZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwoJICAgICAgICB9CgkgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudC5ib2R5ICE9ICd1bmRlZmluZWQnKSB7CgkgICAgICAgICAgIHlPZmZzZXQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgkgICAgICAgIH0KCgkgICAgfQoJCSAgICAKCQlpZiAobW91c2VQb3MueS15T2Zmc2V0IDwgY29uZmlnLnNjcm9sbEFtb3VudCkgewoJICAgIAl3aW5kb3cuc2Nyb2xsQnkoMCwgLWNvbmZpZy5zY3JvbGxBbW91bnQpOwoJICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgPyB3aW5kb3cuaW5uZXJIZWlnaHQKICAgICAgICAgICAgICAgICAgICA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IDogZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgIGlmICh3aW5kb3dIZWlnaHQtKG1vdXNlUG9zLnkteU9mZnNldCkgPCBjb25maWcuc2Nyb2xsQW1vdW50KSB7CiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgY29uZmlnLnNjcm9sbEFtb3VudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgICAgICBpZiAoeSAhPSBqUXVlcnkudGFibGVEbkQub2xkWSkgewogICAgICAgICAgICAvLyB3b3JrIG91dCBpZiB3ZSdyZSBnb2luZyB1cCBvciBkb3duLi4uCiAgICAgICAgICAgIHZhciBtb3ZpbmdEb3duID0geSA+IGpRdWVyeS50YWJsZURuRC5vbGRZOwogICAgICAgICAgICAvLyB1cGRhdGUgdGhlIG9sZCB2YWx1ZQogICAgICAgICAgICBqUXVlcnkudGFibGVEbkQub2xkWSA9IHk7CiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgc3R5bGUgdG8gc2hvdyB3ZSdyZSBkcmFnZ2luZwoJCQlpZiAoY29uZmlnLm9uRHJhZ0NsYXNzKSB7CgkJCQlkcmFnT2JqLmFkZENsYXNzKGNvbmZpZy5vbkRyYWdDbGFzcyk7CgkJCX0gZWxzZSB7CgkgICAgICAgICAgICBkcmFnT2JqLmNzcyhjb25maWcub25EcmFnU3R5bGUpOwoJCQl9CiAgICAgICAgICAgIC8vIElmIHdlJ3JlIG92ZXIgYSByb3cgdGhlbiBtb3ZlIHRoZSBkcmFnZ2VkIHJvdyB0byB0aGVyZSBzbyB0aGF0IHRoZSB1c2VyIHNlZXMgdGhlCiAgICAgICAgICAgIC8vIGVmZmVjdCBkeW5hbWljYWxseQogICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IGpRdWVyeS50YWJsZURuRC5maW5kRHJvcFRhcmdldFJvdyhkcmFnT2JqLCB5KTsKICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8gd29ycnkgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIFRCT0RJRVMKICAgICAgICAgICAgICAgIGlmIChtb3ZpbmdEb3duICYmIGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0ICE9IGN1cnJlbnRSb3cpIHsKICAgICAgICAgICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCwgY3VycmVudFJvdy5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEgbW92aW5nRG93biAmJiBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCAhPSBjdXJyZW50Um93KSB7CiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QsIGN1cnJlbnRSb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKiBXZSdyZSBvbmx5IHdvcnJpZWQgYWJvdXQgdGhlIHkgcG9zaXRpb24gcmVhbGx5LCBiZWNhdXNlIHdlIGNhbiBvbmx5IG1vdmUgcm93cyB1cCBhbmQgZG93biAqLwogICAgZmluZERyb3BUYXJnZXRSb3c6IGZ1bmN0aW9uKGRyYWdnZWRSb3csIHkpIHsKICAgICAgICB2YXIgcm93cyA9IGpRdWVyeS50YWJsZURuRC5jdXJyZW50VGFibGUucm93czsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8cm93cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgcm93ID0gcm93c1tpXTsKICAgICAgICAgICAgdmFyIHJvd1kgICAgPSB0aGlzLmdldFBvc2l0aW9uKHJvdykueTsKICAgICAgICAgICAgdmFyIHJvd0hlaWdodCA9IHBhcnNlSW50KHJvdy5vZmZzZXRIZWlnaHQpLzI7CiAgICAgICAgICAgIGlmIChyb3cub2Zmc2V0SGVpZ2h0ID09IDApIHsKICAgICAgICAgICAgICAgIHJvd1kgPSB0aGlzLmdldFBvc2l0aW9uKHJvdy5maXJzdENoaWxkKS55OwogICAgICAgICAgICAgICAgcm93SGVpZ2h0ID0gcGFyc2VJbnQocm93LmZpcnN0Q2hpbGQub2Zmc2V0SGVpZ2h0KS8yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2UgYWx3YXlzIGhhdmUgdG8gaW5zZXJ0IGJlZm9yZSwgd2UgbmVlZCB0byBvZmZzZXQgdGhlIGhlaWdodCBhIGJpdAogICAgICAgICAgICBpZiAoKHkgPiByb3dZIC0gcm93SGVpZ2h0KSAmJiAoeSA8IChyb3dZICsgcm93SGVpZ2h0KSkpIHsKICAgICAgICAgICAgICAgIC8vIHRoYXQncyB0aGUgcm93IHdlJ3JlIG92ZXIKCQkJCS8vIElmIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgcm93LCBpZ25vcmUgaXQKCQkJCWlmIChyb3cgPT0gZHJhZ2dlZFJvdykge3JldHVybiBudWxsO30KICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlLnRhYmxlRG5EQ29uZmlnOwogICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5vbkFsbG93RHJvcCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcub25BbGxvd0Ryb3AoZHJhZ2dlZFJvdywgcm93KSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkJCQkJLy8gSWYgYSByb3cgaGFzIG5vZHJvcCBjbGFzcywgdGhlbiBkb24ndCBhbGxvdyBkcm9wcGluZyAoaW5zcGlyZWQgYnkgSm9obiBUYXJyIGFuZCBGYW1pYykKICAgICAgICAgICAgICAgICAgICB2YXIgbm9kcm9wID0galF1ZXJ5KHJvdykuaGFzQ2xhc3MoIm5vZHJvcCIpOwogICAgICAgICAgICAgICAgICAgIGlmICghIG5vZHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByb3c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAoKICAgIG1vdXNldXA6IGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAoalF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZSAmJiBqUXVlcnkudGFibGVEbkQuZHJhZ09iamVjdCkgewogICAgICAgICAgICB2YXIgZHJvcHBlZFJvdyA9IGpRdWVyeS50YWJsZURuRC5kcmFnT2JqZWN0OwogICAgICAgICAgICB2YXIgY29uZmlnID0galF1ZXJ5LnRhYmxlRG5ELmN1cnJlbnRUYWJsZS50YWJsZURuRENvbmZpZzsKICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGRyYWdPYmplY3QsIHRoZW4gd2UgbmVlZCB0byByZWxlYXNlIGl0LAogICAgICAgICAgICAvLyBUaGUgcm93IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gbW92ZWQgdG8gdGhlIHJpZ2h0IHBsYWNlIHNvIHdlIGp1c3QgcmVzZXQgc3R1ZmYKCQkJaWYgKGNvbmZpZy5vbkRyYWdDbGFzcykgewoJICAgICAgICAgICAgalF1ZXJ5KGRyb3BwZWRSb3cpLnJlbW92ZUNsYXNzKGNvbmZpZy5vbkRyYWdDbGFzcyk7CgkJCX0gZWxzZSB7CgkgICAgICAgICAgICBqUXVlcnkoZHJvcHBlZFJvdykuY3NzKGNvbmZpZy5vbkRyb3BTdHlsZSk7CgkJCX0KICAgICAgICAgICAgalF1ZXJ5LnRhYmxlRG5ELmRyYWdPYmplY3QgICA9IG51bGw7CiAgICAgICAgICAgIGlmIChjb25maWcub25Ecm9wKSB7CiAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBvbkRyb3AgbWV0aG9kIGlmIHRoZXJlIGlzIG9uZQogICAgICAgICAgICAgICAgY29uZmlnLm9uRHJvcChqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlLCBkcm9wcGVkUm93KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlID0gbnVsbDsgLy8gbGV0IGdvIG9mIHRoZSB0YWJsZSB0b28KICAgICAgICB9CiAgICB9LAoKICAgIHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGpRdWVyeS50YWJsZURuRC5jdXJyZW50VGFibGUpIHsKICAgICAgICAgICAgcmV0dXJuIGpRdWVyeS50YWJsZURuRC5zZXJpYWxpemVUYWJsZShqUXVlcnkudGFibGVEbkQuY3VycmVudFRhYmxlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIkVycm9yOiBObyBUYWJsZSBpZCBzZXQsIHlvdSBuZWVkIHRvIHNldCBhbiBpZCBvbiB5b3VyIHRhYmxlIGFuZCBldmVyeSByb3ciOwogICAgICAgIH0KICAgIH0sCgoJc2VyaWFsaXplVGFibGU6IGZ1bmN0aW9uKHRhYmxlKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICAgIHZhciB0YWJsZUlkID0gdGFibGUuaWQ7CiAgICAgICAgdmFyIHJvd3MgPSB0YWJsZS5yb3dzOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxyb3dzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgcmVzdWx0ICs9ICImIjsKICAgICAgICAgICAgdmFyIHJvd0lkID0gcm93c1tpXS5pZDsKICAgICAgICAgICAgaWYgKHJvd0lkICYmIHJvd0lkICYmIHRhYmxlLnRhYmxlRG5EQ29uZmlnICYmIHRhYmxlLnRhYmxlRG5EQ29uZmlnLnNlcmlhbGl6ZVJlZ2V4cCkgewogICAgICAgICAgICAgICAgcm93SWQgPSByb3dJZC5tYXRjaCh0YWJsZS50YWJsZURuRENvbmZpZy5zZXJpYWxpemVSZWdleHApWzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXN1bHQgKz0gdGFibGVJZCArICdbXT0nICsgcm93SWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7Cgl9LAoKCXNlcmlhbGl6ZVRhYmxlczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdGhpcyBpcyBub3cgYm91bmQgdG8gZWFjaCBtYXRjaGluZyB0YWJsZQoJCQlyZXN1bHQgKz0galF1ZXJ5LnRhYmxlRG5ELnNlcmlhbGl6ZVRhYmxlKHRoaXMpOwoJCX0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Cgp9CgpqUXVlcnkuZm4uZXh0ZW5kKAoJewoJCXRhYmxlRG5EIDogalF1ZXJ5LnRhYmxlRG5ELmJ1aWxkLAoJCXRhYmxlRG5EVXBkYXRlIDogalF1ZXJ5LnRhYmxlRG5ELnVwZGF0ZVRhYmxlcywKCQl0YWJsZURuRFNlcmlhbGl6ZTogalF1ZXJ5LnRhYmxlRG5ELnNlcmlhbGl6ZVRhYmxlcwoJfQopOw==
###PACKDATA,FILE_END,/pluginbuddy/js/tablednd.js,importbuddy/pluginbuddy/js/tablednd.js
###PACKDATA,FILE_START,/pluginbuddy/js/tooltip.js,importbuddy/pluginbuddy/js/tooltip.js
LyoKICogalF1ZXJ5IFRvb2x0aXAgcGx1Z2luIDEuMwogKgogKiBodHRwOi8vYmFzc2lzdGFuY2UuZGUvanF1ZXJ5LXBsdWdpbnMvanF1ZXJ5LXBsdWdpbi10b29sdGlwLwogKiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvVG9vbHRpcAogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgLSAyMDA4IErDtnJuIFphZWZmZXJlcgogKgogKiAkSWQ6IGpxdWVyeS50b29sdGlwLmpzIDU3NDEgMjAwOC0wNi0yMSAxNToyMjoxNlogam9lcm4uemFlZmZlcmVyICQKICogCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqLzsoZnVuY3Rpb24oJCl7dmFyIGhlbHBlcj17fSxjdXJyZW50LHRpdGxlLHRJRCxJRT0kLmJyb3dzZXIubXNpZSYmL01TSUVccyg1XC41fDZcLikvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdHJhY2s9ZmFsc2U7JC50b29sdGlwPXtibG9ja2VkOmZhbHNlLGRlZmF1bHRzOntkZWxheToyMDAsZmFkZTpmYWxzZSxzaG93VVJMOnRydWUsZXh0cmFDbGFzczoiIix0b3A6MTUsbGVmdDoxNSxpZDoidG9vbHRpcCJ9LGJsb2NrOmZ1bmN0aW9uKCl7JC50b29sdGlwLmJsb2NrZWQ9ISQudG9vbHRpcC5ibG9ja2VkO319OyQuZm4uZXh0ZW5kKHt0b29sdGlwOmZ1bmN0aW9uKHNldHRpbmdzKXtzZXR0aW5ncz0kLmV4dGVuZCh7fSwkLnRvb2x0aXAuZGVmYXVsdHMsc2V0dGluZ3MpO2NyZWF0ZUhlbHBlcihzZXR0aW5ncyk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyQuZGF0YSh0aGlzLCJ0b29sdGlwIixzZXR0aW5ncyk7dGhpcy50T3BhY2l0eT1oZWxwZXIucGFyZW50LmNzcygib3BhY2l0eSIpO3RoaXMudG9vbHRpcFRleHQ9dGhpcy50aXRsZTskKHRoaXMpLnJlbW92ZUF0dHIoInRpdGxlIik7dGhpcy5hbHQ9IiI7fSkubW91c2VvdmVyKHNhdmUpLm1vdXNlb3V0KGhpZGUpLmNsaWNrKGhpZGUpO30sZml4UE5HOklFP2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBpbWFnZT0kKHRoaXMpLmNzcygnYmFja2dyb3VuZEltYWdlJyk7aWYoaW1hZ2UubWF0Y2goL151cmxcKFsiJ10/KC4qXC5wbmcpWyInXT9cKSQvaSkpe2ltYWdlPVJlZ0V4cC4kMTskKHRoaXMpLmNzcyh7J2JhY2tncm91bmRJbWFnZSc6J25vbmUnLCdmaWx0ZXInOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGFJbWFnZUxvYWRlcihlbmFibGVkPXRydWUsIHNpemluZ01ldGhvZD1jcm9wLCBzcmM9JyIraW1hZ2UrIicpIn0pLmVhY2goZnVuY3Rpb24oKXt2YXIgcG9zaXRpb249JCh0aGlzKS5jc3MoJ3Bvc2l0aW9uJyk7aWYocG9zaXRpb24hPSdhYnNvbHV0ZScmJnBvc2l0aW9uIT0ncmVsYXRpdmUnKSQodGhpcykuY3NzKCdwb3NpdGlvbicsJ3JlbGF0aXZlJyk7fSk7fX0pO306ZnVuY3Rpb24oKXtyZXR1cm4gdGhpczt9LHVuZml4UE5HOklFP2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnZmlsdGVyJzonJyxiYWNrZ3JvdW5kSW1hZ2U6Jyd9KTt9KTt9OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fSxoaWRlV2hlbkVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyQodGhpcylbJCh0aGlzKS5odG1sKCk/InNob3ciOiJoaWRlIl0oKTt9KTt9LHVybDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHIoJ2hyZWYnKXx8dGhpcy5hdHRyKCdzcmMnKTt9fSk7ZnVuY3Rpb24gY3JlYXRlSGVscGVyKHNldHRpbmdzKXtpZihoZWxwZXIucGFyZW50KXJldHVybjtoZWxwZXIucGFyZW50PSQoJzxkaXYgaWQ9Iicrc2V0dGluZ3MuaWQrJyI+PGgzPjwvaDM+PGRpdiBjbGFzcz0iYm9keSI+PC9kaXY+PGRpdiBjbGFzcz0idXJsIj48L2Rpdj48L2Rpdj4nKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KS5oaWRlKCk7aWYoJC5mbi5iZ2lmcmFtZSloZWxwZXIucGFyZW50LmJnaWZyYW1lKCk7aGVscGVyLnRpdGxlPSQoJ2gzJyxoZWxwZXIucGFyZW50KTtoZWxwZXIuYm9keT0kKCdkaXYuYm9keScsaGVscGVyLnBhcmVudCk7aGVscGVyLnVybD0kKCdkaXYudXJsJyxoZWxwZXIucGFyZW50KTt9ZnVuY3Rpb24gc2V0dGluZ3MoZWxlbWVudCl7cmV0dXJuICQuZGF0YShlbGVtZW50LCJ0b29sdGlwIik7fWZ1bmN0aW9uIGhhbmRsZShldmVudCl7aWYoc2V0dGluZ3ModGhpcykuZGVsYXkpdElEPXNldFRpbWVvdXQoc2hvdyxzZXR0aW5ncyh0aGlzKS5kZWxheSk7ZWxzZQpzaG93KCk7dHJhY2s9ISFzZXR0aW5ncyh0aGlzKS50cmFjazskKGRvY3VtZW50LmJvZHkpLmJpbmQoJ21vdXNlbW92ZScsdXBkYXRlKTt1cGRhdGUoZXZlbnQpO31mdW5jdGlvbiBzYXZlKCl7aWYoJC50b29sdGlwLmJsb2NrZWR8fHRoaXM9PWN1cnJlbnR8fCghdGhpcy50b29sdGlwVGV4dCYmIXNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyKSlyZXR1cm47Y3VycmVudD10aGlzO3RpdGxlPXRoaXMudG9vbHRpcFRleHQ7aWYoc2V0dGluZ3ModGhpcykuYm9keUhhbmRsZXIpe2hlbHBlci50aXRsZS5oaWRlKCk7dmFyIGJvZHlDb250ZW50PXNldHRpbmdzKHRoaXMpLmJvZHlIYW5kbGVyLmNhbGwodGhpcyk7aWYoYm9keUNvbnRlbnQubm9kZVR5cGV8fGJvZHlDb250ZW50LmpxdWVyeSl7aGVscGVyLmJvZHkuZW1wdHkoKS5hcHBlbmQoYm9keUNvbnRlbnQpfWVsc2V7aGVscGVyLmJvZHkuaHRtbChib2R5Q29udGVudCk7fWhlbHBlci5ib2R5LnNob3coKTt9ZWxzZSBpZihzZXR0aW5ncyh0aGlzKS5zaG93Qm9keSl7dmFyIHBhcnRzPXRpdGxlLnNwbGl0KHNldHRpbmdzKHRoaXMpLnNob3dCb2R5KTtoZWxwZXIudGl0bGUuaHRtbChwYXJ0cy5zaGlmdCgpKS5zaG93KCk7aGVscGVyLmJvZHkuZW1wdHkoKTtmb3IodmFyIGk9MCxwYXJ0OyhwYXJ0PXBhcnRzW2ldKTtpKyspe2lmKGk+MCloZWxwZXIuYm9keS5hcHBlbmQoIjxici8+Iik7aGVscGVyLmJvZHkuYXBwZW5kKHBhcnQpO31oZWxwZXIuYm9keS5oaWRlV2hlbkVtcHR5KCk7fWVsc2V7aGVscGVyLnRpdGxlLmh0bWwodGl0bGUpLnNob3coKTtoZWxwZXIuYm9keS5oaWRlKCk7fWlmKHNldHRpbmdzKHRoaXMpLnNob3dVUkwmJiQodGhpcykudXJsKCkpaGVscGVyLnVybC5odG1sKCQodGhpcykudXJsKCkucmVwbGFjZSgnaHR0cDovLycsJycpKS5zaG93KCk7ZWxzZQpoZWxwZXIudXJsLmhpZGUoKTtoZWxwZXIucGFyZW50LmFkZENsYXNzKHNldHRpbmdzKHRoaXMpLmV4dHJhQ2xhc3MpO2lmKHNldHRpbmdzKHRoaXMpLmZpeFBORyloZWxwZXIucGFyZW50LmZpeFBORygpO2hhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fWZ1bmN0aW9uIHNob3coKXt0SUQ9bnVsbDtpZigoIUlFfHwhJC5mbi5iZ2lmcmFtZSkmJnNldHRpbmdzKGN1cnJlbnQpLmZhZGUpe2lmKGhlbHBlci5wYXJlbnQuaXMoIjphbmltYXRlZCIpKWhlbHBlci5wYXJlbnQuc3RvcCgpLnNob3coKS5mYWRlVG8oc2V0dGluZ3MoY3VycmVudCkuZmFkZSxjdXJyZW50LnRPcGFjaXR5KTtlbHNlCmhlbHBlci5wYXJlbnQuaXMoJzp2aXNpYmxlJyk/aGVscGVyLnBhcmVudC5mYWRlVG8oc2V0dGluZ3MoY3VycmVudCkuZmFkZSxjdXJyZW50LnRPcGFjaXR5KTpoZWxwZXIucGFyZW50LmZhZGVJbihzZXR0aW5ncyhjdXJyZW50KS5mYWRlKTt9ZWxzZXtoZWxwZXIucGFyZW50LnNob3coKTt9dXBkYXRlKCk7fWZ1bmN0aW9uIHVwZGF0ZShldmVudCl7aWYoJC50b29sdGlwLmJsb2NrZWQpcmV0dXJuO2lmKGV2ZW50JiZldmVudC50YXJnZXQudGFnTmFtZT09Ik9QVElPTiIpe3JldHVybjt9aWYoIXRyYWNrJiZoZWxwZXIucGFyZW50LmlzKCI6dmlzaWJsZSIpKXskKGRvY3VtZW50LmJvZHkpLnVuYmluZCgnbW91c2Vtb3ZlJyx1cGRhdGUpfWlmKGN1cnJlbnQ9PW51bGwpeyQoZG9jdW1lbnQuYm9keSkudW5iaW5kKCdtb3VzZW1vdmUnLHVwZGF0ZSk7cmV0dXJuO31oZWxwZXIucGFyZW50LnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1yaWdodCIpLnJlbW92ZUNsYXNzKCJ2aWV3cG9ydC1ib3R0b20iKTt2YXIgbGVmdD1oZWxwZXIucGFyZW50WzBdLm9mZnNldExlZnQ7dmFyIHRvcD1oZWxwZXIucGFyZW50WzBdLm9mZnNldFRvcDtpZihldmVudCl7bGVmdD1ldmVudC5wYWdlWCtzZXR0aW5ncyhjdXJyZW50KS5sZWZ0O3RvcD1ldmVudC5wYWdlWStzZXR0aW5ncyhjdXJyZW50KS50b3A7dmFyIHJpZ2h0PSdhdXRvJztpZihzZXR0aW5ncyhjdXJyZW50KS5wb3NpdGlvbkxlZnQpe3JpZ2h0PSQod2luZG93KS53aWR0aCgpLWxlZnQ7bGVmdD0nYXV0byc7fWhlbHBlci5wYXJlbnQuY3NzKHtsZWZ0OmxlZnQscmlnaHQ6cmlnaHQsdG9wOnRvcH0pO312YXIgdj12aWV3cG9ydCgpLGg9aGVscGVyLnBhcmVudFswXTtpZih2Lngrdi5jeDxoLm9mZnNldExlZnQraC5vZmZzZXRXaWR0aCl7bGVmdC09aC5vZmZzZXRXaWR0aCsyMCtzZXR0aW5ncyhjdXJyZW50KS5sZWZ0O2hlbHBlci5wYXJlbnQuY3NzKHtsZWZ0OmxlZnQrJ3B4J30pLmFkZENsYXNzKCJ2aWV3cG9ydC1yaWdodCIpO31pZih2Lnkrdi5jeTxoLm9mZnNldFRvcCtoLm9mZnNldEhlaWdodCl7dG9wLT1oLm9mZnNldEhlaWdodCsyMCtzZXR0aW5ncyhjdXJyZW50KS50b3A7aGVscGVyLnBhcmVudC5jc3Moe3RvcDp0b3ArJ3B4J30pLmFkZENsYXNzKCJ2aWV3cG9ydC1ib3R0b20iKTt9fWZ1bmN0aW9uIHZpZXdwb3J0KCl7cmV0dXJue3g6JCh3aW5kb3cpLnNjcm9sbExlZnQoKSx5OiQod2luZG93KS5zY3JvbGxUb3AoKSxjeDokKHdpbmRvdykud2lkdGgoKSxjeTokKHdpbmRvdykuaGVpZ2h0KCl9O31mdW5jdGlvbiBoaWRlKGV2ZW50KXtpZigkLnRvb2x0aXAuYmxvY2tlZClyZXR1cm47aWYodElEKWNsZWFyVGltZW91dCh0SUQpO2N1cnJlbnQ9bnVsbDt2YXIgdHNldHRpbmdzPXNldHRpbmdzKHRoaXMpO2Z1bmN0aW9uIGNvbXBsZXRlKCl7aGVscGVyLnBhcmVudC5yZW1vdmVDbGFzcyh0c2V0dGluZ3MuZXh0cmFDbGFzcykuaGlkZSgpLmNzcygib3BhY2l0eSIsIiIpO31pZigoIUlFfHwhJC5mbi5iZ2lmcmFtZSkmJnRzZXR0aW5ncy5mYWRlKXtpZihoZWxwZXIucGFyZW50LmlzKCc6YW5pbWF0ZWQnKSloZWxwZXIucGFyZW50LnN0b3AoKS5mYWRlVG8odHNldHRpbmdzLmZhZGUsMCxjb21wbGV0ZSk7ZWxzZQpoZWxwZXIucGFyZW50LnN0b3AoKS5mYWRlT3V0KHRzZXR0aW5ncy5mYWRlLGNvbXBsZXRlKTt9ZWxzZQpjb21wbGV0ZSgpO2lmKHNldHRpbmdzKHRoaXMpLmZpeFBORyloZWxwZXIucGFyZW50LnVuZml4UE5HKCk7fX0pKGpRdWVyeSk7
###PACKDATA,FILE_END,/pluginbuddy/js/tooltip.js,importbuddy/pluginbuddy/js/tooltip.js
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/circle.gif,importbuddy/pluginbuddy/images/minicolors/circle.gif
R0lGODlhCwALAJECAAAAAP///////wAAACH5BAEAAAIALAAAAAALAAsAAAIflINoG+AeGFgGxEaXxVns2X2dh4CZJXBadDxQlihGAQA7
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/circle.gif,importbuddy/pluginbuddy/images/minicolors/circle.gif
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/gradient.png,importbuddy/pluginbuddy/images/minicolors/gradient.png
iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHotAACAlQAA+NcAAIhSAABxRQAA6mYAADkHAAAh+QMnhVYAACf5SURBVHja7H3LjuRIkqQaJ+e0wB72T/s7+w/qOKduoLBd3ZVZmeEP0z0UjSUUiqqpuUf1AoMJIBDuTjrdwyhUERVVMzZ3/y8z+99m9jAz33/7/hs97vb7zzv7qff54n7HNncv7Vc9nnjuf/Ixsv2i7y/328eii/EMP9vd5fjvr3cc4/Fa793dvffe+/P57Pf73b99+9b/8pe/9C+99/9jZv9rB8Dsn3kWT9RsQCIgzE7Us3r8le+Ig/fqMRKAp8cAEPAY4/Gy93l2cY393P0J+/nYBtvH8+e+rfXe246cBr/+eDz68/m0+/3uHx8f9v37d/v69av9/PPP/tNPP9lf//pX+9J7f+ygenzCSfPZgLxz0l48oeEvXKVv7fPisU4/v28yM7O2/5q7t+A5P3Y8hvq772/u3nYQjdePfXbgbDuYxmv+fD7t+Xza4/Gwx+Ph9/vdbreb3W43//79u/3666/2z3/+0/72t7/5Tz/9ZN++fbMv8A+Vfmj/ZmZtf63hgLXWVo7z0ueOgQ0enwY9+MH9Kp99+Vw8wcG2bQc+7+cF8BgcC4957EevNwDRRgByAFYbQILIdIDI3e35fFrvvY2/j8ejPR6P7X6/++1284+Pj/bjxw/79u1b+/XXX9s//vGP9ve//91+/vnn9ng82pfe+8qJ5YH1FeAEJ28KEPpsg5NyArEA3+lEtdaOE8MXQvBZDBKbAYv3w+PhNnhsapu7W2tt671ba63vf1vvPQQWRaUjUu2/B9D2c34C0YhSO5B8j1B9/9uez2e73++2/247BfrXr1/tX//6l/3yyy/2yy+/+NevX+35fNoUWDAwKZCKESYEZyGCpSdeAEnRTRW4YSQKgJQBy+HxRkHUOZrtwEGAMICOY/wRhE60NsDTB7DGMZHuzMx778Zgcnd7PB4DWPZ8Pn0A6na79dvtZvf7fbvf7/bbb78dwPr111/t69ev/ttvv1nvfQqs8Y/5Im2VIluR3sag+uQ7toDi5PcQ39FEVLqALgNW8HgDJPWE0i5gIp00ANSZ0sxs0BkCyDBCjef7376/NgT51ns/IhYCCzXV/X63j48P//HjR//4+Gj3+719+/bNxu/379/9drv9DqwoUlQBpehnIk6jSOSr+ir4jnysCCDZ+46T1FrDk+2tNcOLESN6AKzTRwFQZsByEteK7hrS3R6ZBngaRizQUcfj5/PZdh01QDWe266p2uPxsPv93m632/i179+/t99++619fHwMrdV+/PjRbrebPR6PZmZaY1WFNdFkKwCqLYjriI48SCAqkU5RldJEXtBLBhGpR8AiACGNdd4v0EuH+GZggd7aRJTqCKRBhyN6YYQaVLhrqra/tokscEQs+/j4sG/fvg0hbz9+/LDb7eaPx8Pc/UKFHlz1L9GkONk+iXQZ9UnwKKApQNIxWyGVtxkV9t7bHsGOyBYAq+3jzGDCCHWIa6C+Jva9ZHs7tWEE25D6CEwDaObu2wDW8/n0XVPZ4/FAkLUBKgTWANK3b9/6x8fHtuuwASy/UOEMT8paSFJzn2WEETjpODK4Bd6PR1GVhT1mZgIUjhdYkt35hOKG3cD7oDVw8pYYdOOYw7AkXXWiwmEbDDpES2Hoqp3ybKfAE/09n8+2R6p2v9/brrdOVIiPPz4+2sfHhz0ej+3xePQRGTliTb2fLErR1e0FjeQB2CLqi7Ix3keefBF5HPZzYQd4JNCVfzRokSmTQDYcbtZU214iMQBiI5G+Daug//5zimSwDS2Ek0AHj2oYn0dk6r0fgn3XVna/3/1+v/fn87kNU3QI+X2bff/+vd/vd3s8HkekvGisiVGYgSoDVEsiT2iyigzsopeQgnbvx/Gqx+PTtgiATQBGelCUwTUGDBxzUxkd6qMByID6DEouaG6iN9VRoO9AQyBhJriBV3VQ4W6EbgJYdr/f++Px2G63G2aJvgNxZJI+wH0CFmc8k2wrjXJIQXBCj9d3s/L0VgDJBcScKJzMIG0BuNJ5FKkuEXCAqxClsowuMi3VYxbiJ62EYAIgDVrrHLH2KIXaagBpRCnctiGwBqD2yLXtUWgAaQAMjdIDgB8fHw4R96yxXgBV5rAfJ1fQravPGumyos8MaALUlwwPwYRCXgGNdZWyDlico/YR9oADAE7uusr20DkHf8r2E8flmAFMh+cbRqjn83lsez6f296NcESpkQkOnXS/3we42g6utkerfr/ffddhbQflQaPj89y9lahwxesKKC0T4XiVSwOTNJLyiDLt1DIdJQS82rYSlSLfaRNU2MAaQOd9i7K9AUb0o0a0IothwzLN8/kc20YmeGis/bUTre1Z4TYi1g4wu91uDr6X7zRruw5rkgoDEKlolUWKCCAVoEURxZSQJ8CYMk5VticikQEFSkc9K/4yeJSOQ0obQh6jFdoSqLcITJ0tBQTT0FXjdbQUIAvsz+ezuXvbW1+s9953CtzAbrDb7dZHlENb4na79cfjsaFFMT5jnI+S3VDcJwJPRG2evB+BEkU4BTKPaJIozIPOAUWBzlEIvxcBS+2LOglFuTM4oeRy2m8/YRdLAbRVH71S6LSzdwUdC0iPB609Hg9398NuGIVnduL3bUcHBEdPM+vTiFWNYBOgWGYh0L6H97MQiZTx6YHYNnDLEUwciYztAlWjE/ttlME5ZXlHJBrWA9b5JhGLHfROADuAhNFrWAoAtpHFdXcfAh47Ghr0YA09tqGRumutkwE7LA4z2xBYUQmkUqbxLCIJY1JRIeopT7SUKUCojI7KMxYArqExySZn1gfFAAs01sm7wmwPTE9JjQCyEaUYZNu+30AYgqcrd33fZxuFZtZYe4RyyBjb7XbroMl8aCoE6gDr+O5fVIE0A0zv3aGJ7wjp+2tH9rJbB6ayqQb+Az8fINn7jxToOCPzSG8RxTXhtl/cdwCnTwT7MR4ELG6oc5HtObnpp/4poJWTFTGi0XjfSO/JAPVdQw2v6jnApOyGYTOAI98AiIdbPxx4LFbvugw7Kw5cfBGV+ik1BtX6qB32orH4GIKO0ZJQ1MmRT1Irl0w4SkJDnZHmMWETXLwxtgYIdJjhdUGF3IhnAJgjGRj6CemPxLtDG8ygvw6txdtOhaOp73gO9oPt4NqGyN8j0jaAOOgSW5VHZOMCOFPhTF8p51s994QOmfqUPvJApB/utqBJRX0bTBy4RC/x/GRaMkgmlsJF3KOFEBidbG4iNSItbnDS0EbAks62U1pD8xTAZgAutBs6UJ7v+2yot0D0H/qLitqnwvnQsFVgqZpd9FxZES0CUKSjqLxigYnJ2VhEmS6EOReAT811rL8WgLXh8Vg3ofWwA+mSNQLINmExdDBFEWRSvA/AjegzBHvkY8H+p6gEYv6IbFjGuUQsprAqLSYgs4mQtwmNeUCfyvl2bo6j6KLc9YstwPvS+0xYAxcdFbjsjaLVoHjpvKPdgJoKAMcaC2fXODbwPZ9PN7OGzvjYd4js4aADiNpuJRwZ6PCp0LLgRIUK7meNNfOZEjBkJRaOVJdSSkSTIqM7rgZBca5qjMpZh6Jw5+iV1fJWtqFews8D7WSsozgqiVrhAEDn/SBadSjpDCAeVEjUeNo2DFLY5rhtHHOPdCNK+U6XGwD/bDfMIlY1WhE4PHHNI4A1dYxAU4XHUIYoHwMjmSpCZ6BT9Dd6pLDTYUxcIJpE6uukqzpMdjhto8cdvKpOvesH3cF+h/OOtIglHnDtj5LOHgEdmgZP+yEFAtuUqLAFnQtyP8iyuMB8WBJgR1yyxgGAkakFwLlENkFpRkLc4AQbgc0n+51oblAOfO4lewQKc4peWFh2ENzOzXy4DaIWuutO7cdD6xx0ho+HVTDEOLxnFKbZUjg04E6Bg2o9MIevdgObo4UIFWmrBuhN9QtrGQQI+EPsVXUVEVkHBd7UpeeKIo8JbYXFYRP2ggmLAT2ok8M+ohmA01QkwuiFpihEqUYRa2Mq3CMNUmFjWtyp7JQtDsCOrHAHU8dmweGZjYwSorSdSjpF6otqgCXARTQ5iUycBQ7dwVkh7yd9LAYaG6WTDHD6GgOL/KqTjUBA6kpjsa1AuoofH5kgPwbnHUE3PCoGXaPCNb5/dDQ4jLFjQpSJ9xmwLAFVn4AtAowFYPGkM8ECC8Gw15wzFirhOLnkTdT4PAIbFIgjMDkbqUizkN1dtou+9Q7PO2WGG7bGoI8VAM0hCrGYd0oAnH0rBBOiKrUbkozPFwA3jWbZZwsgeTKBIXL2I+q1RNzPgHbyvYbmEdmeilJOFsXIFk009xnPA6TuBnyM2grfh1rqpLmoHnn6HlBQvui28b7xOWKisIxYF7tAgKklloGanOBFoLRk1ktEY5445JZkf1GdEBfQkBYD1sXIp7pQoXjM2R33sOO+LcoKdzBjScfJee9QG+SscPRnjcenyIbvo3LQhiCmHvsOLTMW2g0TuptFuAs4lI5SACRwc8lF+VZNUaYQ9TMtZYGQb0Hr8Ba0w1QfH5po2ApCsGMJp2OGBuDBiIVA29DvejwekgrBQkCN5ZCVnqgOaRLXi4DEb5yDlApLYCIxHwnxVyjPgga8GXg8oEDuS3dM8xNKPOk9thCGTqJJppbQX4Pow/sZ2wtAPyb621FjOTb3DbpCehs2whhLbPaDx2pSa4eGANSXijFi8f4GmEyUY6Jow3pHinoB1Ma1uARIDF6mxVeimQVCHP0tg8LyicbAuzpFL9jviF7Q/tKhsH0yQckQ7QAiJyo8KA0jFACpg9vuoiLg6MqTIXpcV6tUaNEMYUVbKu2f7RcBSWR/GTVeQJFto8euwMRZ57hyx7iRWMcGvosgB7P40GVDXOMx0I8S1Gg4E4eywE1RIWaFBJDDx+LskUE2to3pZSozBJDNs8IJpZ0a/9TJ3534sV9pG9sNTE0U9bB/yYVRe9nGrcojonDNUVkUUTSb6SoCz0Ws4zGSbQg6zgLlNnTY99c6l35GZCI6RN13lG6gG3YjmwGXw6xHrGx71uxHK6ZY5G5Tx4EFUUxFPVetLcEyQKps48JB5++EeuJSHcBtrLfAjmg41ii8iU6noKOuBuPno8MBvC+MbidLAnSd4TR/ZWUgaOm8vq6xotphdKJFS0oTGaAFYLKgCM0n10UHQ0aLbFq66HDwaMlF9Rqk2a40VqCrsCW57ye0K/CwxsIeLKKtC90hLY7C86DXPZrhhAvH/i+0Mjh6EQ2ySeqr4l3ZCGo61ax3KrMfPNFHHmgsfu+lyMxLA0WinCjPlaNOkQdLMZfIQ89PugomWaDzPhz1LTipJ10FNgQ+b1w7xONNjn8CJOspFvNUysEVoXONNel8UK3HvmAtmABGRrGtCC7V0WDsSzHdcQE9mFjBFoKiTAvsBiedhfbCKVoCHbH9cBLwAU3iMRCIbCOw/jqKyWhhiPmQp+yXHPe8VhgBYCWyiQxy9tcUpTGNFo7VAi2XUiE77qp7Qbjrp3mHSGdAb5sAlQQFWgoYXiArRKrifixTVoTICtFuONEpRCaHibK8aK7D3Mlxg4JtSbwHLTGhXprNoIkiV9BLlQEwshRc1ASjKV3Sn1JCP8r8gomopuwGKuEgWNhtv1Am05aIRsP34udHBgfgQQCdgKkoEj0tBJT9cVMEEzdPuFLhrDwza/KLAEZzDUfjXybW8X1oSRj3rcMqNU10MKi7MrRoHiF3JYCzfsr88H1oVSC10usnpx7pMrMb4DV23Q93HVeiYRrjKfmDEqF33Uk3Oq0WqHrcj4xY0KCmwqh9Zva3oNOauEOCV8Q7ao/EL1MWA9Of6njgRj4X7cdGRWjpwuNECIpUHkS+jQDNrTKYKXJDIEYsIz8Ko9RGbcUYlRymxWON0Fig49pb4pYpuEqhpsKqYRqUbFINlYh8SXcBeCzyoQJH3YLGPksoMivjXPQW7XeiuERHZRHqoEVw0Lnxj+2Fk/OO1IeuOWZ36HGx5hL7bwxAPK0DjO8AK1vJxSagU4150eKwFpRvLlYA2xFKZwn91YLPOhWTsYwzsxTgdiJhNIs0G0QJg5PEpRvOItEcPYEJdJPNwMMrKw8A9T/C0waAOmmeEcna7+WXksaKIs4sml0AtmgjqC4GGcnUcRSlUshW7noDB91EZuk0+cEFxbONEIl+ZyCJ/YymrV9KQ+TOG82W9ijikuNvgcbEi+k/MPJyVeEljVWIYiH4koJxtmZV1sulsj3LqFFEM349ctRN0aJ6zuBlW6FChaKDAd9zoSRhYLLxqaIXZ5ONi9M4NY1tDl5c1/Jb6r0NrOo2bpO53CcmAODqtkukigCnthGNZVEJqaHT+0KNhdqJhbly14nqTpYFLfxh7HFRDfGizSjCskiX20TUisCV2w3FTFD2ZbGPla02o3rXZ9FsITNUjX6RQGeLIRL6FkyYcCXsxW1LVCZ4cegJOMYOvIq+2Iajoi5aHXa+odPlQsXvwKsfTvR3q4p3dsSz5j++8SJ/KZt0Mlh0jCgaTWgwms4VaQwP9mui/yqNRASyTLybcNeV3trIGe9KwON+ogUGC9enY1BN8RSFqIpwMUrtfOfY17LCpI041EbBzGSV0cmisOipsgJFqrZi9X+kuinTYgJA8jhMd7iUJMyQOQGVTzIDieyGkz4iUc/Oe4dVbzZBh05FZ4/oTznxEljD5c6iUmQrDGc9obGmoh4CZEzFh8YyC3wsizI3Me39otPIdc78rBBYTBViZo4pK0LNI6RtRgC69E+hpQDH3sR0fKepXXwHi4bgIMA79Iixj4WPOxWjrxqrUjuMSjdqra2kPhjZBvgdwvmEAd15ZoKSpSAb1hD4Qo+5yh4ZmFFEEyCRjjyPI/tg4II3QZenLJPAPsZno2LypXKA27MVHVliKLshKwRPxbuKSgkoZRdnRndCw10ojyOiaitOIl00jT6kPWE/lEDF2eOgrsBuiKyHjagLb9WLJR0T9oOLzPVEjQN8SnO11oab31prDu77MErnGqvappzMPK4CzZXADmwJi6Z8BdrsYpAGNcx3gSXFexVkILw70h2e+KGbRNaIgn0LANRoRcBO+25KN4F+6sQiKFcODyu1G16xHxIDVa1Eo1aJ8cmxs2JytGJfVIy2aA6hinJEd0p/+cwgnbjrJhoDjaZfScCDFJH/B72u5kBmcxPUvAE1sfi0ul8UseQUeBLtbRKFZhNTLZh5YyrDg5MrJ66Kx9Iby05M9lwtYzSJYivg2qA+N8vSkO4syBJNUSG56CzAnZr1Tlnh6Mfax+J4PBr9IKot+VgVSyFccDaqNRZn9yhATgGzAKooWqkZOjh3sAUa5ZLdLYLM1DHIrnBlEzAQry93pNcGqwaeqBZ1GtCcUfXkdFqXqTCYfm6VVWMyAEZrZgWWRhM9QKlrn0U1sbAarzBzWbVPTNBwtSQR2wsq26YSUGQtyP0R5ERxFyqcPVa2h8iYnTLSU8Mle5IV5z2cqJoJ74Du1H6WzGbOKLMUkYIZzp5Qps9Ee0XMs3e1Eqn4GJn7zk2EahtMyjhFupHBcXZKrceZu47UucmI9Q4VfvJfZSuE0Yw0oCXlnFRDrWx7RU+xF5WBh+wG1Dboe3UwP7swQtuMFvE1BAr2YkU/qMHUtjKwVrRWBArVnCeOO41YybZoTXYLANlIY83mH34KsKIINekm5ULxBvTEBucmOhTYYO2Be99QsEcRKrMjXrIbXphqP5soMRXyiZg3RasqokW99up4yj4Q/fIl2syi1mT/6cSKV6IprlHBvmCwOLGpIKDmRXCTXykrnAjyCyWpGdAV0CjjM3hPGKHQkpjMal61Ilql0BzpLdHa0oniD8oTC3Hw1HY+tjJSp1SGnQ404/mwFPx8oy2eMCF11ytUyECyqp8ljhFRYaWmmIl4FxHKkt72ioeljMRNZamRcBelGgWWLTBfsU345C0xILhZT0THxmUdpZlGnRCSNxf2g9Rd7zjvLeppd73YbATIMt0FlDa1FqJIJ+qRlixZxHXFavuyqYwz6Yl3VYxG519M0PDo+yYTPGZlL3nBk9OeUWWJCtMidAYK9cWSfipTglropdPxsZk/MTgtG8hKJlh9raK5YKVlhzIQrliTaS+MKEq8MzU20eqy8RQuFO+RG09rjI5WmRaI95LznkYo3xdPE6CoUKFHi3cosKjOhYjiou/AV3kCqtmV3agzIQNXqxSnDe7uEGilMLsTq7+EoEt0Fy9LEFkNNko6YVY4A9ZouptRGO8HzxtZ/5dUO4lYYRbHa55y8Ve1xwRTuySgKDJmIMzmFWYTYC8aCBaNVYYrg0KKegJPn2Sfl/YZO995TYEQI5W9bDcks3iiKFJp+rPA85rpNBOTMyT1ZdqJVgEMPS7XyyCFES1q3OMEYFbsTioIVun7Clx1NYMZP2cjAW/BxInNzjekr9sNb04Bk6I5ocJSVHKx0GxgP6T/C1JhJGgrmip4LqMIZoUFw3QaibDLAxYekTqKoq3KJi/RS0yOUKUcL1PhZ80trHphKvIks3iiWUItiy4V8LzTUrPw+ibm53G/uSfU52w9FKiQPSZTAl2BhyZHRHXCnAor0+SjSDHRR+E6Ddl0MY5Y1W0ZZfp16e1wichkgZGs5TmkqmSbqwkbLC9YqwoAnjRitE1Eqct71HlJlgNQoG7u/jsVvhOhViOYJ2tofWbEUgD8jIj1KlVSppVGpUm2p7apblZ0wtMoJaZ0WVILtGRq/VljfTKwShpL2As+mZg6O36a7U2cd59NvCj6XS3SWMpVT7LHkOKo5SUCYIOJppca6OwYag4h02miuUIqjIDliRHqlanzZEOEWWHi9l8ilrp5wMTNP9FJkFm2QlaYeWxhVljVbOJ3KSuEC5QjVsggOzi6KMifzldrrSeF6OWI1SbT6ytZoru+l2BGhe0zIpZoRmwTz6tNJhfMjiGn2WfbJkDjyNRmVMhzBFgrCfozmEvITvvJfE1o8o+s0Oc3DLBocY+CeJ/tF3VFmOijT8V61NEgDNCmJmEm8w3D4nIwuZUjVIkKwc2faSk1u4n3a5GjruhOtQ2prJDbygVNloDVBAVeXo8yPdHWosxNTzLElgl2MfO5VP5h2npFyE8ojW/FYolgj3RYKwj2BnP9VGRrQv031Fi4YiECRL0naJHREWumsWbZnOtbyVXc9WxF5iZmgmRWwgWoCb2qmUVRd4NP9JYHzr4pLRY0FFo0z4+zWnH/aY9aeFTHBHZJiHmBPjQwfz6v3Ke+47LGyiJV0CLsSYdpEyvMRCc++tzmwXpbijYnAJveVzoo8zTuREhotWXGaBKxGBRIbU3onsox25giDxNlT5ke9MM3YbC2SdRa0lih2A5626OZzjZZlC1qObaJWPcos0sshmmbdHEGUNgZkfTYN+WiD6AyVRKgZsKedZSzrlLgEZJBaimIXNENBNbtBhfLDlWjmxdX96uUgsS8xjbRZekcxSBCSr00KVaXgTabdDKZDGIqeqpedLXOgud3SruMu6JBoj2nx8t2w2UtiFdn6aw+T2ZYS4DNTlTyOWHr8gs98j6ZNCspTFBatB2bBi9ZZXRRctZo55uKXgzW3Xf8/cXf9VdUoLYMWDNB7QUd5olm8SjqqTbjZJ0IOWs6Wj0mWg9iZZbQqxljYkmE0VNZA5HGUtsYJGSOKpo8ZYEIJlHCacqFh225xsoMUdN3hOeTnE4sLYhxD45XmXoW+VHHohXQWhvdE3oGKmcdmCxkEiYK1QQAszkRsXwCzBZotsu5YC2Fj1U7MtwPqZ+A5fkNAaKsrBK50tVrZms3JAuLyAgQbTO9Zle4hGREw4XJr6WW5yxdp0bJTApEU+V4llKLLq7J3ED+Xkc7DGfe8LOV7IZK94Ja4sjyNbCmvV8RKAmIrThP0YNo5gVwHItf0KSNbCGT2WODe0TPoll2T+pTdiZ0WESFFwolf8wpU22ZnhJF6andICNUEm0yYW/ZdHkFSl7hRZmZ6vssAHC6yFtkJ7ygv0K7wa73f7yARzy+lIjUeWMqBM3UAr01Lib2uKaUKrLDuvMujE6vrOOQTXCd7avmrLlYzJ9S3Wx57xBkQdboonzkgQ2hwDKL0O76lnd8k/aQwuiejyEVqpJWQGkRDVZ/1px3RnoAlnQlwEADhTOdg2wuA4O6430YRZJk4aXF3Cy/eVQKas7qmJJEs1/o8NNYuIp6UbSEJQqixr6WWA2SCmW5xvRdvGS0CGgypEX6otFM53BFP/E+lXmqyNGoU7KtmLaFRU3k8YN9WpDVZced0mTCBsp6uFBxpOdIXzXx2vZqEfpIkyEMZ9nd6R8e97UjUSp77llEi6jHt+xNbyhgtM57Eh0vjXmV8g/eQKE6jS6iyaizZDETHrZKmHTtjX3KcR/foQdO+xoVFhr6mpiXl7YsGy3g7ws3MVflC4+X4bbAT4vuPOHqs5NJIWGPF2dukT8nwOau762YabNwfATItqxDlywEFYk2/r8m0WuLgFWxGUoAFNGsfC8dNTMoygotuZcOR6wCjdmsnvnqJF/qXvWZLlNue0WjTVqUXF1QykIItke9WgbA2krAssLdVhO9ZUJQZ9tkCSiaK8hRrgCeyv2r24y+kszykqREyxREYprXlA/GP5y0IRItj7ZlIFNRifcTrTdaY0WaqkJzE701NUhnJ00lCQEwsruQtaQtR1GiKX0XZcSq3x9Ape6tqDJbaTvw+7m7IehAiNgntCCqVkRQOWhlKpwAa+VWKFlkakmWWB5wC27bG2SIL93Z1ea3zCttq1wkynmPji0incxARWRSkccCZ139fZkKU8c40UcZ3aQDLpz/sLZXAJm6OtOLYWX5gJVtxRM/pdkK3RFlVujfo0SENNccWEkEyoCQvged+eL0MC+K2PTkUEZ5cuOD+YvRhaHc9ugv949faI7oFFN5eZfXzPkOdFgUwdOCd8AW2b4hZVbshupKyZXV/ppK+UUnwZQu+OQVqGsq7JPoMt03atku7hutKJ2uv5pF90CUl6IeZ3wiK6zQYY0KZzbDRD+F1FeJNsWsLdNA4Y2eIkG+AKQl8BSpMFpLtfRX7R9kdDITRCciyvyULvtsYL26nQvXK6DhbC2LSrLSb/mtVyyLhivabEWjTcpIUaG/VTUTue8ntx3/CuB07l6ZAQp7tsysZRortQsyWgw0i7+wXxrBJkapnASQNPXNXn/17+zzKxNIZEeE0l7B9LqNvtcmXHd83zaZO5h1Pcw1lriyohM9i0rT6MXiepH+lujzE+julUXnymAU9cyZxOA+9EaNchcao6zPIvqLsmwKEKi//iOkwkRHVeiwqrlUCC6DJaHLyrpdHvRNyWiyApwsSnv9tjBLEVFNfXshqjrNxpK0V9Bfsd1QHUhlAUyc33DwTawFUb3iA41Volo66ThnsXxh8ISRzC2HDojliykzgCsXjZr8gdO2ZvT6VqPf7MQWoluoubIu0iwardb4qE1aDlRB21T2LS/tZGICb9Jq3YQf5rNxy8xhQXkyYwyikE0MUrtErGwyRdKk5wG4wmn4BX1mBZqcgilq3KPHFwO18v6F5QeyMcnqmCt+XoUaS9osiXQp0FJgsTgfwvH3fjyb9rejm7yH+Sk1BS65Rc452gCT99nEeA09rFmf/4rVUJUT1WJ81vxXKIJ70KDHTn8nK2IWnaJt799hddaxUNFfq1d7YOAp8LcJrVc1nK1GjVmnwCSNXynuz8Y9M2952wYRp3x88Tn5vXQy8R2d8IS2ImBYRI8FqktnoVQj0qSNZOkkW2Eyb2G/ENAe30CrelFENGkzGgz0Va6xFoBlBdMzsx+sAMw2+8ez42VC3q7rPFgFdK+8JjRlJTpbpbtDXAipPgoqDyFIFsAUAat9mWUxFe0xEdvlq3ySGEyv6iIgLSiCX6h1ov2y/WRL9IsXxiXlL1BuutbF7DiJLVFx3+tUOANJAZAvAUFllJOBtSJNlibmJu8vj0ehM6Q6HlaRDOyoT4Dq3NIjHHULMsQocmkqTNLRWYSJ/pmVfavcz5liBRQrYCtnigWQTcfrxfctA+mNCzKjWN7+h92QDeCLUWsm6itXepT1hSvYvXhS1bHlehKFx+r/qZysGeVYVqoqHqN8Yb1QeJ5TYeWERf1Z1cczWqtQwgsAj56Xv8vKZ70g9g26S18Z5yVGwGhXAL0XBXxKhauRoBTiI4p9ZUCKgLQKgF8By+Ljy8JmwRKas/F4aayidbImGiuqF8p1Q98GVvZPRxMpOPNKsrCLo6s4vBgRo8FV6028FfU+8z0JMK3yv2ZjIKKTPJYAzyyKaWAVwrP0qWb7FY8XtuNUo1oVeFWRXDhRSyd0Ieq+StcWRN9IXL+roS4rKb+ssYoRbAVAFaBcwLUIIp8BYuVkV9qBXvn/3rhIOBq98v+FUWghQtWpcAYYE1O7FgfOViJCcHWWBi/L0lYo6819qxdgCZQTvfbKxcUyJKPEGQBjKlxMQzM6e2dQl04AaUr1vALiFcCvnECbXQR0wlqwQNzKBZPNE1QgerfB7xRcoog1PakU/lKAvHuyiiG9fKzZSXklYolWlYo9sxLVo/PwKcCOnos7U2QUOaXCtL3lVXAt/OP2Zw3UKuheeT4By2dfiC9duG+MXUv01RxYBYpLwQZNf2NVvsNRV8/Ve2YDhfuLIvClKEz2gnz+DrDwlmxOt2hzccu2NwE6u1iWLnjTyxGkIAqAlmusd8Bm8U0yj31oichsUZHsua1ShSooF6l/etUnd+IwS+Y8zjLOYvTl/1U+V3qouNpQVXed7QabtKysgE3RpLqSKldb9SpNTpjP3le1WCqvBRfa7AKogPnVqJXtUx7HSrQ6LW6b1KaWgFR9TXzJV8BTeQ3D+yVqBO9NFxyrjo8ARBlwn/jadHwqF+KCthqvnanwzcFcAZeKaMvgLAz0pbRUOAGlzymcQCu44y9fNCsAiFzyBQC9Yje0acRaOLnLJz07cew7rZ7kyeBZdVALBfmXx2p1TFZBTp5eNbq/PFbGq828GKHSiLQKxhWQUSZnnzAgqwBafv2dC1QIeV+JrquRsxC9PImAVyqcXYkjZVb7i22n9hnYdnHXs22RNmOHXXzfYQGE08f3z22R6SeuePx8qTnE6+G2JFJE52TFTa9E42XqK7zn7LxPIlBkCagaVmWbXL5xEsGq0c3oam9R1lNJ6YvR6E/ZlnhOKxGqHKWK22ZRrE6FVeAFYCiD5Z3BenfQKlfjnzk2s/cuXmjLY/fu2EyBNRmg0vY3BupdMK0O2lIPeqXHXLnwq/tkOq0KpM+4EBcuuHgyxeIAzsBV3mcCwqV9XgBrKwJ6+eSJIndqylYnRiwAwQoXin/GPvSzXeyGPwsUk5NVOWHVaPUpA754oqvezn/LsQr7sQJgrUwtaoXBWBmUTxucKh28eZVWLsK3x2oFlCsR992xsqi74QWP6t0r8933rAz4CkDfeU8LLJeq1qy8b+WiWAFGaHu8eAG2jArfAcorJ3/1arIXrqxXr8iXxPtqlMre9xkX0rvRbAG8ORV+EsBWuNzeHbDPHLw35cFnSIG3xuGViPxJ0bAOLFrd7+DVVwZahPxy2UCl68k+lcHzxYFtK//fZHw+PZH4BEB68XNnwGpf3g3vq1ffK0nBm9T06VfuvzGb/LOBtGwzFT+3fem9f/n/+c/8Gwa+2X/zn38DSFd//vNL7/3/mtnD/ufnf34+7+df/28AkXg9KZ7Ze3oAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/gradient.png,importbuddy/pluginbuddy/images/minicolors/gradient.png
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/line.gif,importbuddy/pluginbuddy/images/minicolors/line.gif
R0lGODlhGgADAIAAAP///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3QUM5NzJGODM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3QUM5NzJGOTM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjdBQzk3MkY2MzRBRTExRTA4NTRDRkRFMTEwOTI0OTNEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjdBQzk3MkY3MzRBRTExRTA4NTRDRkRFMTEwOTI0OTNEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAABoAAwAAAguEj6ka7Q+jW7SeAgA7
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/line.gif,importbuddy/pluginbuddy/images/minicolors/line.gif
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/rainbow.png,importbuddy/pluginbuddy/images/minicolors/rainbow.png
iVBORw0KGgoAAAANSUhEUgAAABQAAACWCAIAAABRkz+JAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6N0FDOTcyRjQzNEFFMTFFMDg1NENGREUxMTA5MjQ5M0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6N0FDOTcyRjUzNEFFMTFFMDg1NENGREUxMTA5MjQ5M0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3QUM5NzJGMjM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3QUM5NzJGMzM0QUUxMUUwODU0Q0ZERTExMDkyNDkzRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnzKFbcAAAcCSURBVHjanFnbcttGDMVZsbVlp0knb52+9/8/qh/QNrElpxVR7B3YxVJOlExCUQviDhyA+POPTyfsoPhh5vQ/If2h8k3+ZwDyI1DvMN0obL/TG/FO4yeeH79WDuX5jI3oM5Eizg/XXPoT0s3yiHhSiD8RdiJ7VDMRAk3WDwgxPsbntOfpT4A6ytOBSPyh02F4Bso/XAQlsBKMROxnpR4XQqBf98PGAUlnPCuelJ5dlWxHy7W1f+RcxKbRYN1CnPmoi0YcnpNVtbawMmZzotu1yiI6nwufrsygKo0/1YeK2E/Fk01zLIIEKk7i+UgsnENXj6y2TYD8dO153pO1u2F1GLFRfn4chHN4jJyZfJvn82GMrejRfU86y5cw8KtWoEoZJoOFSPyYxA7KKzacMNm/PEKIQ+JcMtGm1BCVQYlTXaV0DiqMoNO4Kd8sL38j53OUGZOd5q/mgrOrHovCQw3pF9kWqnx1P2fOzbxBx7YNDMM/i00PFE69vmk7B1W6eIoEZM4xPK2EONSZtM6ROPQIYZtcNpN6egrxjoeA0PUE+R8MD+JdxL4SnZrx29Nh8pobZ1XCpFxvV24alxLG7JVh2xR2TsQX5mxr1rnIo4V6gUg/7Yl+e0vcYMXT9bt5qpTAeiBzppZT3d5syrFWuNklchbiQKqKsAoSnmtYfVrjHKDsVLU31rYtIN+JnK8SH6oVS6seUwAqtZUeSeydA3oCsS0n3RA89psktliLVVx7tV6naTNNJH7JOu+JGDVOJptn5NH9nM6In9HhhxtVbJu0+myvPEVfrWI8N3wYg2+vka+yBdPywlxHI0fOcEsfe+GhwljkE86mqvmfhRTR2rpyur1q1L8aL3LOMTCgoHaTFLYZjm1fvdTV4anTbbDJ9pJShBXu0dczpOipImJ/mTm44TFFiNzfvmTc5QIXT2BWyCNxttk3aq57Loy/t3+AG4MNFLZgCE7PyYVeSi8XWi6JBbJAnXqesnXKFqHrFEJsI5K1HdAh5bb/PIbuUPxYFT1YYLzRWSaPZVCvYrxE2P7AujzpMJ5doNM+5jOfTa43AGzEHqo/crETsH6e4DIvEtuYJpbFRLwqBvNXOzgoziuz0CR2Mxg9dujoVxMeG1W1mOj8dFB+Dr2WdIYD6t/ncSHmOg554q3URmxWSWd4R/nenUQMAxB5crXr9ogrkMQO/P1Gi929+hmr4WmN6XbtZ1fIVdhy9vND0tnpRuoazjiXxU6uCjhqbq44RmxMYvNhbHc/BzoCB3PO7UXnWkiPbcvT5uLGifNJKTYHKRaRc2s6Y3Iv1onNzWDbjU78HYnVXRWnmwuxVboBxgPJ9zIaXYvcDVoMVb/VXtbLE+F8U8T8vkq/94SuxDxhgWGfZLZN+XTWmcIIh2CjmedFQiZma7DWFIfg5EkXbpxbfDLTMsVG7YX4rSwElmpzx2Lm1yh2gq7jqA4zJ7ECNax3Brjk8m8GRj1wr4BWNZgqoHrJxDCzZQM1BbsUg2HcoQxzvoYsbZhkqsRubHgDtJopIucXszpyNpZeryl7Enrtk/fdZISecTkZbJZ2XtjMw3tssSI2T6WTbW3BVJXr6vKrOT3X6gmKtDMSJC+qP9u5j21U98QsAF90/qrmiaGAkGvlirGRxd4XOyWL1sdVSdy4/p22zPeqD6vZvngriNh/xRE1DNMC+z2K9U3Jh9d1u8HhaLuXTdhBJByF3OZnLN9DRmrltd7buR2rSrR9JvrXzhg4RLA5lITnT0L8m3mXcK+/q6lL6Ldftf3ttMt2eczzOPhx2gS4WB9ebmy/2CjsxKqQs9qf9HxHJmbP1RMUNGVqT2I/z4CCj2CFKiRCPHHGEMU+AkzjYAS9YewtZpBFH7kApbno/KG998ilXr8DodFCw/i2naFEdper3tI5d5HtadoEz0M62x1khdvCua370d8sEdaDluZ8bpl1dyJxrJ0LyQF2XCwjo9hPKJt8fwFl/dz3T3G4oe2xLdPt3hUDUICt3HvaPp651j+owNIYZGqxGYVEsWUmO7UcgvfGyEZbfg3BCesng3FZrPtZ5cVMAvpZZ4wjRu5k/oatqnXLnE/wqgyc6UafiTqHb/FNxLuAPtunyJiANwU9ecL1q75TZoyrwa3LKXg25y0Tz6t1WkyUA2dcCWG9pFg0fOQdYBsxlmK7snSd1Vu2OyOwT+zisKPXoWnjiuuPLVky54tX7vhwos5QVYhlSkC4h0DceHN0dlcy3uSPovOcMjjcUzWDGZ158dp5seraCg5zXYL1VgzN2uEQOy3addq4XhbrBdDxkisW/TZi3EFArs64eGF8sPBAx82JM99bXS72H0nnY6S53rwkzu+pG16vT+HJP5RVWLmK3pEkQnz9zzZ3OCUacBwhvep/AQYA/fsCsjFZHQIAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/rainbow.png,importbuddy/pluginbuddy/images/minicolors/rainbow.png
###PACKDATA,FILE_START,/pluginbuddy/images/minicolors/trigger.png,importbuddy/pluginbuddy/images/minicolors/trigger.png
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RjU3RTU1MzIzNERFMTFFMDg1NENGREUxMTA5MjQ5M0QiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RjU3RTU1MzMzNERFMTFFMDg1NENGREUxMTA5MjQ5M0QiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4OEQxNkIyMTM0REUxMUUwODU0Q0ZERTExMDkyNDkzRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4OEQxNkIyMjM0REUxMUUwODU0Q0ZERTExMDkyNDkzRCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PiDK9P0AAAHySURBVHjarJVBasJAFIYnyVgXtrorusgdXOrWZaHgFbooegv1EoI7j+AtXLsXFFy0FFRs0LYxmXT+YV6YxIgpzcDzJcN73/z5M06s4XD4zBhrsGLHGxdCNEaj0aRI6mAw6AFs4SaKokKglmUxMHkYhgqKaDabvf9AF4vFBBwwAbbkCgpcqVTYfD7/kjWnjD6BB9MZEeocyLhrt9suOBhgJhRXq1WmodsrMBNo5gfZ65KdpFhBsVqtVmO6MLwBEkYdwkZvAhwEgUXgUqmEeV/Gzw1Q+l71EhhMpRhQBOcc8986TAgWg/dHfU3zaiPIuEev4XFSsQYfNSTUC3xq38WVzQCZPnoTivGTUnzScE9nkWOnCVMxgdNWAPiht1HekQZnWrHNAeXaArIiurDifD7Hih3HYTmgzng8floul/XEpOwlxWAmFGtwwlN5+qkwX9ZqtarLg2aCt28OWADGtZcnTGhGVn4C4vt+5iEUW0GKbduOwSmVMRj1qKOe2WzGNpsNc12XdbtdNa9q0las12uRBaWBfxjqqEeeiGy326lMh5lS7HmeTYcQlEyn09dbe4sUI6C01WqpTHNg8v1+b5PH/X4/95cE/tIu6HQ68TUymPxwODh4tHK5/KevCHr0LrqYB9OSwBf5aI9FfvOk6vdfAQYA4jTPF9eEdoEAAAAASUVORK5CYII=
###PACKDATA,FILE_END,/pluginbuddy/images/minicolors/trigger.png,importbuddy/pluginbuddy/images/minicolors/trigger.png
###PACKDATA,FILE_START,/controllers/pages/server_info/cron.php,importbuddy/controllers/pages/server_info/cron.php
QWxsIHNjaGVkdWxlZCBXb3JkUHJlc3MgdGFza3MgKENST04gam9icykgYXJlIGxpc3RlZCBiZWxvdy4gVXNlIGNhdXRpb24gd2hlbiBtYW51YWxseSBydW5uaW5nIG9yIGRlbGV0aW5nIHNjaGVkdWxlZCBDUk9OCmpvYnMgYXMgcGx1Z2lucywgdGhlbWVzLCBvciBXb3JkUHJlc3MgaXRzZWxmIG1heSBleHBlY3QgdGhlc2UgdG8gcmVtYWluIGluIHBsYWNlLiBXb3JkUHJlc3Mgd2lsbCByZWNyZWF0ZSBhbnkgbWFuZGF0b3J5CmludGVybmFsIENST04gam9icyBhdXRvbWF0aWNhbGx5IGlmIHRoZXkgYXJlIHJlbW92ZWQuPGJyPjxicj4KPD9waHAKJGNyb24gPSBnZXRfb3B0aW9uKCdjcm9uJyk7CgoKLy8gSGFuZGxlIENST04gZGVsZXRpb25zLgppZiAoIHBiX2JhY2t1cGJ1ZGR5OjpfUE9TVCggJ2J1bGtfYWN0aW9uJyApID09ICdkZWxldGVfY3JvbicgKSB7CglpZiAoIGRlZmluZWQoICdQQl9ERU1PX01PREUnICkgKSB7CgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnQWNjZXNzIGRlbmllZCBpbiBkZW1vIG1vZGUuJywgdHJ1ZSApOwoJfSBlbHNlIHsKCQkkZGVsZXRlX2l0ZW1zID0gcGJfYmFja3VwYnVkZHk6Ol9QT1NUKCAnaXRlbXMnICk7CgkJCgkJJGRlbGV0ZWRfY3JvbnMgPSBhcnJheSgpOyAvLyBGb3IgbGlzdGluZyBpbiBhbGVydC4KCQlmb3JlYWNoKCAkZGVsZXRlX2l0ZW1zIGFzICRkZWxldGVfaXRlbSApIHsKCQkJJGNyb25fcGFydHMgPSBleHBsb2RlKCAnfCcsICRkZWxldGVfaXRlbSApOwoJCQkkdGltZXN0YW1wID0gJGNyb25fcGFydHNbMF07CgkJCSRjcm9uX2hvb2sgPSAkY3Jvbl9wYXJ0c1sxXTsKCQkJJGNyb25fa2V5ID0gJGNyb25fcGFydHNbMl07CgkJCQoJCQlpZiAoIGlzc2V0KCAkY3JvblsgJHRpbWVzdGFtcCBdWyAkY3Jvbl9ob29rIF1bICRjcm9uX2tleSBdICkgKSB7IC8vIFJ1biBjcm9uLgoJCQkJCgkJCQkkY3Jvbl9hcnJheSA9ICRjcm9uWyAkdGltZXN0YW1wIF1bICRjcm9uX2hvb2sgXVsgJGNyb25fa2V5IF07IC8vIEdldCBjcm9uIGFycmF5IGJhc2VkIG9uIHBhc3NlZCB2YWx1ZXMuCgkJCQkkcmVzdWx0ID0gYmFja3VwYnVkZHlfY29yZTo6dW5zY2hlZHVsZV9ldmVudCggJHRpbWVzdGFtcCwgJGNyb25faG9vaywgJGNyb25fYXJyYXlbJ2FyZ3MnXSApOyAvLyBEZWxldGUgdGhlIHNjaGVkdWxlZCBjcm9uLgoJCQkJaWYgKCAkcmVzdWx0ID09PSBGQUxTRSApIHsKCQkJCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdFcnJvciAjNTY1NzY2NzY3NS4gVW5hYmxlIHRvIGRlbGV0ZSBDUk9OIGpvYi4gUGxlYXNlIHNlZSB5b3VyIEJhY2t1cEJ1ZGR5IGVycm9yIGxvZyBmb3IgZGV0YWlscy4nICk7CgkJCQl9CgkJCQkkZGVsZXRlZF9jcm9uc1tdID0gJGNyb25faG9vayAuICcgLyAnIC4gJGNyb25fa2V5OyAvLyBBZGQgZGVsZXRlZCBjcm9uIHRvIGxpc3Qgb2YgZGVsZXRpb25zIGZvciBkaXNwbGF5LgoJCQkJCgkJCX0gZWxzZSB7IC8vIENyb24gbm90IGZvdW5kLCBlcnJvci4KCQkJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0ludmFsaWQgQ1JPTiBqb2IuIE5vdCBmb3VuZC4nLCB0cnVlICk7CgkJCX0KCQkJCgkJfQoJCQoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggX18oJ0RlbGV0ZWQgc2hlZHVsZWQgQ1JPTiBldmVudChzKTonLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8YnI+JyAuIGltcGxvZGUoICc8YnI+JywgJGRlbGV0ZWRfY3JvbnMgKSApOwoJCSRjcm9uID0gZ2V0X29wdGlvbignY3JvbicpOyAvLyBSZXNldCB0byBtb3N0IHVwIHRvIGRhdGUgc3RhdHVzIGZvciBjcm9uIGxpc3RpbmcgYmVsb3cuIFRha2VzIGludG8gYWNjb3VudCBkZWxldGlvbnMuCgl9Cn0KCgoKLy8gSGFuZGxlIFJVTk5JTkcgY3JvbiBqb2JzIG1hbnVhbGx5LgppZiAoICFlbXB0eSggJF9HRVRbJ3J1bl9jcm9uJ10gKSApIHsKCWlmICggZGVmaW5lZCggJ1BCX0RFTU9fTU9ERScgKSApIHsKCQlwYl9iYWNrdXBidWRkeTo6YWxlcnQoICdBY2Nlc3MgZGVuaWVkIGluIGRlbW8gbW9kZS4nLCB0cnVlICk7Cgl9IGVsc2UgewoJCSRjcm9uX3BhcnRzID0gZXhwbG9kZSggJ3wnLCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3J1bl9jcm9uJyApICk7CgkJJHRpbWVzdGFtcCA9ICRjcm9uX3BhcnRzWzBdOwoJCSRjcm9uX2hvb2sgPSAkY3Jvbl9wYXJ0c1sxXTsKCQkkY3Jvbl9rZXkgPSAkY3Jvbl9wYXJ0c1syXTsKCQkKCQlpZiAoIGlzc2V0KCAkY3JvblsgJHRpbWVzdGFtcCBdWyAkY3Jvbl9ob29rIF1bICRjcm9uX2tleSBdICkgKSB7IC8vIFJ1biBjcm9uLgoJCQkkY3Jvbl9hcnJheSA9ICRjcm9uWyAkdGltZXN0YW1wIF1bICRjcm9uX2hvb2sgXVsgJGNyb25fa2V5IF07IC8vIEdldCBjcm9uIGFycmF5IGJhc2VkIG9uIHBhc3NlZCB2YWx1ZXMuCgkJCQoJCQkvKgoJCQlpZiAoIGNvdW50KCAkY3Jvbl9hcnJheVsnYXJncyddICkgPT0gMSApIHsKCQkJCSRhcmdzID0gJGNyb25fYXJyYXlbJ2FyZ3MnXVswXTsKCQkJfSBlbHNlIHsKCQkJCSRhcmdzID0gJGNyb25fYXJyYXlbJ2FyZ3MnXTsKCQkJfQoJCQkqLwoJCQkKCQkJZG9fYWN0aW9uX3JlZl9hcnJheSggJGNyb25faG9vaywgJGNyb25fYXJyYXlbJ2FyZ3MnXSApOyAvLyBSdW4gdGhlIGNyb24gam9iIQoJCQkKCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnUmFuIENST04gZXZlbnQgYCcgLiAkY3Jvbl9ob29rIC4gJyAvICcgLiAkY3Jvbl9rZXkgLiAnYC4gSXRzIHNjaGVkdWxlIHdhcyBub3QgbW9kaWZpZWQuJyApOwoJCX0gZWxzZSB7IC8vIENyb24gbm90IGZvdW5kLCBlcnJvci4KCQkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnSW52YWxpZCBDUk9OIGpvYi4gTm90IGZvdW5kLicsIHRydWUgKTsKCQl9Cgl9Cn0KCgoKCgovLyBMb29wIHRocm91Z2ggZWFjaCBjcm9uIHRpbWUgdG8gY3JlYXRlICRjcm9ucyBhcnJheSBmb3IgZGlzcGxheWluZyBsYXRlci4KJGNyb25zID0gYXJyYXkoKTsKZm9yZWFjaCAoIChhcnJheSkgJGNyb24gYXMgJHRpbWUgPT4gJGNyb25faXRlbSApIHsKCWlmICggaXNfbnVtZXJpYyggJHRpbWUgKSApIHsKCQkvLyBMb29wIHRocm91Z2ggZWFjaCBzY2hlZHVsZSBmb3IgdGhpcyB0aW1lCgkJZm9yZWFjaCAoIChhcnJheSkgJGNyb25faXRlbSBhcyAkaG9va19uYW1lID0+ICRldmVudCApIHsKCQkJZm9yZWFjaCAoIChhcnJheSkgJGV2ZW50IGFzICRpdGVtX25hbWUgPT4gJGl0ZW0gKSB7CgkJCQkKCQkJCS8vIERldGVybWluZSBwZXJpb2QuCgkJCQlpZiAoICFlbXB0eSggJGl0ZW1bJ3NjaGVkdWxlJ10gKSApIHsgLy8gUmVjdXJyaW5nIHNjaGVkdWxlLgoJCQkJCSRwZXJpb2QgPSAkaXRlbVsnc2NoZWR1bGUnXTsKCQkJCX0gZWxzZSB7IC8vIE9uZS10aW1lIG9ubHkgY3Jvbi4KCQkJCQkkcGVyaW9kID0gX18oJ29uZSB0aW1lIG9ubHknLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJCX0KCQkJCQoJCQkJLy8gRGV0ZXJtaW5lIGludGVydmFsLgoJCQkJaWYgKCAhZW1wdHkoICRpdGVtWydpbnRlcnZhbCddICkgKSB7CgkJCQkJJGludGVydmFsID0gJGl0ZW1bJ2ludGVydmFsJ10gLiAnIHNlY29uZHMnOwoJCQkJfSBlbHNlIHsKCQkJCQkkaW50ZXJ2YWwgPSBfXygnb25lIHRpbWUgb25seScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQkJfQoJCQkJCgkJCQkvLyBEZXRlcm1pbmUgYXJndW1lbnRzLgoJCQkJaWYgKCAhZW1wdHkoICRpdGVtWydhcmdzJ10gKSApIHsKCQkJCQkvLyRhcmd1bWVudHMgPSBpbXBsb2RlKCAnLCcsICRpdGVtWydhcmdzJ10gKTsKCQkJCQkkYXJndW1lbnRzID0gJyc7CgkJCQkJZm9yZWFjaCggJGl0ZW1bJ2FyZ3MnXSBhcyAkYXJnICkgewoJCQkJCQkkYXJndW1lbnRzIC49ICc8dGV4dGFyZWEgd3JhcD0ib2ZmIj4nIC4gcHJpbnRfciggJGFyZywgdHJ1ZSApIC4gJzwvdGV4dGFyZWE+JzsKCQkJCQkJLyoKCQkJCQkJaWYgKCBpc19hcnJheSggJGFyZyApICkgewoJCQkJCQkJJGFyZ3VtZW50cyAuPSAgJ1snIC4gcHJpbnRfciggJGFyZywgdHJ1ZSApIC4gJ10nOy8vcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPm11bHRpX2ltcGxvZGUoICRhcmcgLCAnOyAnICkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCSRhcmd1bWVudHMgLj0gJGFyZzsKCQkJCQkJfQoJCQkJCQkqLwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJGFyZ3VtZW50cyA9IF9fKCdub25lJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCQl9CgkJCQkKCQkJCS8vIFBvcHVsYXRlIGNyb25zIGFycmF5IGZvciBkaXNwbGF5aW5nIGxhdGVyLgoJCQkJJGNyb25zWyAkdGltZSAuICd8JyAuICRob29rX25hbWUgLiAnfCcgLiAkaXRlbV9uYW1lXSA9IGFycmF5KAoJCQkJCSc8c3BhbiB0aXRsZT1cJ0tleTogJyAuICRpdGVtX25hbWUgLiAnXCc+JyAuICRob29rX25hbWUgLiAnPC9zcGFuPicsCgkJCQkJcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmRhdGUoIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5sb2NhbGl6ZV90aW1lKCAkdGltZSApICkgLiAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+VGltZXN0YW1wOiAnIC4gJHRpbWUgLiAnPC9zcGFuPicsCgkJCQkJJHBlcmlvZCwKCQkJCQkkaW50ZXJ2YWwsCgkJCQkJJGFyZ3VtZW50cywKCQkJCSk7CgkJCQkKCQkJfSAvLyBFbmQgZm9yZWFjaC4KCQkJdW5zZXQoICRpdGVtICk7CgkJCXVuc2V0KCAkaXRlbV9uYW1lICk7CgkJfSAvLyBFbmQgZm9yZWFjaC4KCQl1bnNldCggJGV2ZW50ICk7CgkJdW5zZXQoICRob29rX25hbWUgKTsKCX0gLy8gRW5kIGlmIGlzX251bWVyaWMuCn0gLy8gRW5kIGZvcmVhY2guCnVuc2V0KCAkY3Jvbl9pdGVtICk7CnVuc2V0KCAkdGltZSApOwoKCgovLyBEaXNwbGF5IENST04gdGFibGUuCnBiX2JhY2t1cGJ1ZGR5OjokdWktPmxpc3RfdGFibGUoCgkkY3JvbnMsIC8vIEFycmF5IG9mIGNyb24gaXRlbXMgc2V0IGluIGNvZGUgc2VjdGlvbiBhYm92ZS4KCWFycmF5KAoJCSdhY3Rpb24nCQkJCQk9PglwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcjcGJfYmFja3VwYnVkZHlfZ2V0dGluZ19zdGFydGVkX3RhYl90b29scycsCgkJJ2NvbHVtbnMnCQkJCQk9PglhcnJheSgKCQkJCQkJCQkJCQlfXyggJ0V2ZW50JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCQkJCQkJX18oICdSdW4gVGltZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCV9fKCAnUGVyaW9kJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCQkJCQkJX18oICdJbnRlcnZhbCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCV9fKCAnQXJndW1lbnRzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJCQkJCQkpLAoJCSdjc3MnCQkJCQkJPT4JCSd3aWR0aDogMTAwJTsnLAoJCSdob3Zlcl9hY3Rpb25zJwkJCQk9PglhcnJheSgKCQkJCQkJCQkJCQkncnVuX2Nyb24nCT0+CSdSdW4gY3JvbiBqb2Igbm93JywKCQkJCQkJCQkJCSksCgkJJ2J1bGtfYWN0aW9ucycJPT4JYXJyYXkoICdkZWxldGVfY3JvbicgPT4gJ0RlbGV0ZScgKSwKCQknaG92ZXJfYWN0aW9uX2NvbHVtbl9rZXknCT0+CScwJywKCSkKKTsKCgoKCgoKaWYgKCBlbXB0eSggJF9HRVRbJ3Nob3dfY3Jvbl9hcnJheSddICkgKSB7CgllY2hvICc8YnI+JzsKCWVjaG8gJzxjZW50ZXI+JzsKCWVjaG8gX18oJ0N1cnJlbnQgVGltZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCB0aW1lKCkgKyAoIGdldF9vcHRpb24oICdnbXRfb2Zmc2V0JyApICogMzYwMCApICkgLiAnICgnIC4gdGltZSgpIC4gJykuICc7CgllY2hvICdBZGRpdGlvbmFsIGNyb24gY29udHJvbCBpcyBhdmFpbGFibGUgdmlhIHRoZSBmcmVlIHBsdWdpbiA8YSB0YXJnZXQ9Il9uZXciIGhyZWY9Imh0dHA6Ly93b3JkcHJlc3Mub3JnL2V4dGVuZC9wbHVnaW5zL3dwLWNyb24tY29udHJvbC8iPldQLUNyb24gQ29udHJvbDwvYT4gYnkgQXV0b21hdGljYy4gJzsKCWVjaG8gJzxhIGhyZWY9IicgLiBwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSAuICcmdGFiPTMmc2hvd19jcm9uX2FycmF5PXRydWUjcGJfYmFja3VwYnVkZHlfZ2V0dGluZ19zdGFydGVkX3RhYl90b29scyIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZTsiPicgLiBfXygnRGlzcGxheSBDUk9OIERlYnVnZ2luZyBBcnJheScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvYT4nOwoJZWNobyAnPC9jZW50ZXI+JzsKfSBlbHNlIHsKCWVjaG8gX18oJ0N1cnJlbnQgVGltZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzogJyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5kYXRlKCB0aW1lKCkgKyAoIGdldF9vcHRpb24oICdnbXRfb2Zmc2V0JyApICogMzYwMCApICkgLiAnICgnIC4gdGltZSgpIC4gJyknOwoJZWNobyAnPGJyPjx0ZXh0YXJlYSByZWFkb25seT0icmVhZG9ubHkiIHN0eWxlPSJ3aWR0aDogNzkzcHg7IiByb3dzPSIxMyIgY29scz0iNzUiIHdyYXA9Im9mZiI+JzsKCXByaW50X3IoICRjcm9uICk7CgllY2hvICc8L3RleHRhcmVhPic7Cn0KZWNobyAnPGJyPic7Cgp1bnNldCggJGNyb24gKTsKPz4K
###PACKDATA,FILE_END,/controllers/pages/server_info/cron.php,importbuddy/controllers/pages/server_info/cron.php
###PACKDATA,FILE_START,/controllers/pages/server_info/database.php,importbuddy/controllers/pages/server_info/database.php
PD9waHAKaWYgKCAhaXNzZXQoICRwYXJlbnRfY2xhc3MgKSApIHsKCSRwYXJlbnRfY2xhc3MgPSAkdGhpczsKfQppZiAoIGRlZmluZWQoICdwbHVnaW5idWRkeV9pbXBvcnRidWRkeScgKSApIHsKCS8vJHBhcmVudF9jbGFzcy0+YWRtaW5fc2NyaXB0cygpOwp9CgoKCgoKJHByb2ZpbGVfaWQgPSAwOwppZiAoIGlzX251bWVyaWMoIHBiX2JhY2t1cGJ1ZGR5OjpfR0VUKCAncHJvZmlsZScgKSApICkgewoJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Byb2ZpbGUnICkgXSApICkgewoJCSRwcm9maWxlX2lkID0gcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwcm9maWxlJyApOwoJCXBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncHJvZmlsZXMnXVsgcGJfYmFja3VwYnVkZHk6Ol9HRVQoICdwcm9maWxlJyApIF0gPSBhcnJheV9tZXJnZSggcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAncHJvZmlsZV9kZWZhdWx0cycgKSwgcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWyBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Byb2ZpbGUnICkgXSApOyAvLyBTZXQgZGVmYXVsdHMgaWYgbm90IHNldC4KCX0gZWxzZSB7CgkJcGJfYmFja3VwYnVkZHk6OmFsZXJ0KCAnRXJyb3IgIzQ1ODQ5NDU4OiBJbnZhbGlkIHByb2ZpbGUgSUQgbnVtYmVyIGAnIC4gaHRtbGVudGl0aWVzKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3Byb2ZpbGUnICkgKSAuICdgLiBEaXNwbGF5aW5nIHdpdGggZGVmYXVsdCBwcm9maWxlLicsIHRydWUgKTsKCX0KfQoKCi8vIEdldCBwcm9maWxlIGFycmF5LgokcHJvZmlsZSA9IGFycmF5X21lcmdlKCBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICdwcm9maWxlX2RlZmF1bHRzJyApLCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Byb2ZpbGVzJ11bJHByb2ZpbGVfaWRdICk7CmZvcmVhY2goICRwcm9maWxlIGFzICRwcm9maWxlX2l0ZW1fbmFtZSA9PiAmJHByb2ZpbGVfaXRlbSApIHsgLy8gcmVwbGFjZSBub24tb3ZlcnJpZGRlbiBkZWZhdWx0cyB3aXRoIGFjdHVhbCBkZWZhdWx0IHZhbHVlLgoJaWYgKCAnLTEnID09ICRwcm9maWxlX2l0ZW0gKSB7IC8vIFNldCB0byB1c2UgZGVmYXVsdCBzbyBnbyBncmFiIGRlZmF1bHQuCgkJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWzBdWyAkcHJvZmlsZV9pdGVtX25hbWUgXSApICkgewoJCQkkcHJvZmlsZV9pdGVtID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddWzBdWyAkcHJvZmlsZV9pdGVtX25hbWUgXTsgLy8gR3JhYiB2YWx1ZSBmcm9tIGRlZmF1bHRzIHByb2ZpbGUgYW5kIHJlcGxhY2Ugd2l0aCBpdC4KCQl9Cgl9Cn0KCgoKCmVjaG8gJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDRweDsiPkJhY2t1cCBwcm9maWxlIGZvciBjYWxjdWxhdGluZyBleGNsdXNpb25zOiAnOwplY2hvICc8c2VsZWN0IGlkPSJwYl9iYWNrdXBidWRkeV9kYXRhYmFzZXByb2ZpbGUiIG9uQ2hhbmdlPSJ3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwnJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwYWdlX3VybCgpIC4gJyZ0YWI9MSZwcm9maWxlPVwnICsgalF1ZXJ5KHRoaXMpLnZhbCgpOyI+JzsKZm9yZWFjaCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydwcm9maWxlcyddIGFzICR0aGlzX3Byb2ZpbGVfaWQgPT4gJHRoaXNfcHJvZmlsZSApIHsKCT8+Cgk8b3B0aW9uIHZhbHVlPSI8P3BocCBlY2hvICR0aGlzX3Byb2ZpbGVfaWQ7ID8+IiA8P3BocCBpZiAoICRwcm9maWxlX2lkID09ICR0aGlzX3Byb2ZpbGVfaWQgKSB7IGVjaG8gJ3NlbGVjdGVkJzsgfSA/Pj48P3BocCBlY2hvIGh0bWxlbnRpdGllcyggJHRoaXNfcHJvZmlsZVsndGl0bGUnXSApOyA/PiAgKDw/cGhwIGVjaG8gJHRoaXNfcHJvZmlsZVsndHlwZSddOyA/Pik8L2E+Cgk8P3BocAp9CmVjaG8gJzwvc2VsZWN0Pic7CmVjaG8gJzwvZGl2Pic7CgoKCgovLyR0YWJsZV9saXN0ID0gYXJyYXkoKTsKPz4KCgoKCjx0YWJsZSBjbGFzcz0id2lkZWZhdCI+Cgk8dGhlYWQ+CgkJPHRyIGNsYXNzPSJ0aGVhZCI+CgkJCTw/cGhwCgkJCQllY2hvICc8dGg+JywgX18oJ0RhdGFiYXNlIFRhYmxlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnU3RhdHVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJICc8dGg+JywgX18oJ1NldHRpbmdzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJICc8dGg+JywgX18oJ1VwZGF0ZWQgLyBDaGVja2VkJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnUm93cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdTaXplJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJICc8dGg+JywgX18oJ0V4Y2x1ZGVkIFNpemUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JzsKCQkJPz4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Zm9vdD4KCQk8dHIgY2xhc3M9InRoZWFkIj4KCQkJPD9waHAKCQkJCWVjaG8gJzx0aD4nLCBfXygnRGF0YWJhc2UgVGFibGUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdTdGF0dXMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnU2V0dGluZ3MnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnVXBkYXRlZCAvIENoZWNrZWQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdSb3dzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJICc8dGg+JywgX18oJ1NpemUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnRXhjbHVkZWQgU2l6ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nOwoJCQk/PgoJCTwvdHI+Cgk8L3Rmb290PgoJPHRib2R5PgoJCTw/cGhwCgkJZ2xvYmFsICR3cGRiOwoJCSRwcmVmaXggPSAkd3BkYi0+cHJlZml4OwoJCSRwcmVmaXhfbGVuZ3RoID0gc3RybGVuKCAkd3BkYi0+cHJlZml4ICk7CgkJCgkJJGFkZGl0aW9uYWxfaW5jbHVkZXMgPSBleHBsb2RlKCAiXG4iLCAkcHJvZmlsZVsnbXlzcWxkdW1wX2FkZGl0aW9uYWxfaW5jbHVkZXMnXSApOwoJCWFycmF5X3dhbGsoICRhZGRpdGlvbmFsX2luY2x1ZGVzLCBjcmVhdGVfZnVuY3Rpb24oJyYkdmFsJywgJyR2YWwgPSB0cmltKCR2YWwpOycpKTsgCgkJJGFkZGl0aW9uYWxfZXhjbHVkZXMgPSBleHBsb2RlKCAiXG4iLCAkcHJvZmlsZVsnbXlzcWxkdW1wX2FkZGl0aW9uYWxfZXhjbHVkZXMnXSApOwoJCWFycmF5X3dhbGsoICRhZGRpdGlvbmFsX2V4Y2x1ZGVzLCBjcmVhdGVfZnVuY3Rpb24oJyYkdmFsJywgJyR2YWwgPSB0cmltKCR2YWwpOycpKTsgCgkJCgkJJHRvdGFsX3NpemUgPSAwOwoJCSR0b3RhbF9zaXplX3dpdGhfZXhjbHVzaW9ucyA9IDA7CgkJJHRvdGFsX3Jvd3MgPSAwOwoJCSRyb3dzID0gJHdwZGItPmdldF9yZXN1bHRzKCAiU0hPVyBUQUJMRSBTVEFUVVMiLCBBUlJBWV9BICk7CgkJZm9yZWFjaCggJHJvd3MgYXMgJHJvdyApIHsKCQkJJGV4Y2x1ZGVkID0gdHJ1ZTsgLy8gRGVmYXVsdC4KCQkJCgkJCS8vIFRBQkxFIFNUQVRVUy4KCQkJJHJvd3NiID0gJHdwZGItPmdldF9yZXN1bHRzKCAiQ0hFQ0sgVEFCTEUgYHskcm93WydOYW1lJ119YCIsIEFSUkFZX0EgKTsKCQkJZm9yZWFjaCggJHJvd3NiIGFzICRyb3diICkgewoJCQkJaWYgKCAkcm93YlsnTXNnX3R5cGUnXSA9PSAnc3RhdHVzJyApIHsKCQkJCQkkc3RhdHVzID0gJHJvd2JbJ01zZ190ZXh0J107CgkJCQl9CgkJCX0KCQkJdW5zZXQoICRyb3dzYiApOwoJCQkKCQkJLy8gRml4IHVwIHJvdyBjb3VudCBhbmQgYXZlcmFnZSByb3cgbGVuZ3RoIGZvciBJbm5vREIgZW5naW5lIHdoaWNoIHJldHVybnMgaW5hY2N1cmF0ZQoJCQkvLyAoYW5kIGNoYW5naW5nKSB2YWx1ZXMgZm9yIHRoZXNlCgkJCWlmICggJ0lubm9EQicgPT09ICRyb3dbICdFbmdpbmUnIF0gKSB7CgkJCQlpZiAoIGZhbHNlICE9PSAoICRjb3VudCA9ICR3cGRiLT5nZXRfdmFyKCAiU0VMRUNUIENPVU5UKDEpIEZST00gYHskcm93WyAnTmFtZScgXX1gIiApICkgKSB7CgkJCQkJaWYgKCAwIDwgKCAkcm93WyAnUm93cycgXSA9ICRjb3VudCApICkgewoJCQkJCQkkcm93WyAnQXZnX3Jvd19sZW5ndGgnIF0gPSAoICRyb3dbICdEYXRhX2xlbmd0aCcgXSAvICRyb3dbICdSb3dzJyBdICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQkvLyBUQUJMRSBTSVpFLgoJCQkkc2l6ZSA9ICggJHJvd1snRGF0YV9sZW5ndGgnXSArICRyb3dbJ0luZGV4X2xlbmd0aCddICk7CgkJCSR0b3RhbF9zaXplICs9ICRzaXplOwoJCQkKCQkJLy8gSEFORExFIEVYQ0xVU0lPTlMuCgkJCWlmICggJHByb2ZpbGVbJ2JhY2t1cF9ub253cF90YWJsZXMnXSA9PSAwICkgeyAvLyBPbmx5IG1hdGNoaW5nIHByZWZpeC4KCQkJCWlmICggKCBzdWJzdHIoICRyb3dbJ05hbWUnXSwgMCwgJHByZWZpeF9sZW5ndGggKSA9PSAkcHJlZml4ICkgT1IgKCBpbl9hcnJheSggJHJvd1snTmFtZSddLCAkYWRkaXRpb25hbF9pbmNsdWRlcyApICkgKSB7CgkJCQkJaWYgKCAhaW5fYXJyYXkoICRyb3dbJ05hbWUnXSwgJGFkZGl0aW9uYWxfZXhjbHVkZXMgKSApIHsKCQkJCQkJJHRvdGFsX3NpemVfd2l0aF9leGNsdXNpb25zICs9ICRzaXplOwoJCQkJCQkkZXhjbHVkZWQgPSBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7IC8vIEFsbCB0YWJsZXMuCgkJCQlpZiAoICFpbl9hcnJheSggJHJvd1snTmFtZSddLCAkYWRkaXRpb25hbF9leGNsdWRlcyApICkgewoJCQkJCSR0b3RhbF9zaXplX3dpdGhfZXhjbHVzaW9ucyArPSAkc2l6ZTsKCQkJCQkkZXhjbHVkZWQgPSBmYWxzZTsKCQkJCX0KCQkJfQoJCQkKCQkJCgkJCQoJCQkKCQkJCgkJCS8vIE9VVFBVVCBUQUJMRSBST1cuCgkJCWVjaG8gJzx0ciBjbGFzcz0iZW50cnktcm93IGFsdGVybmF0ZSInOwoJCQlpZiAoICRleGNsdWRlZCA9PT0gdHJ1ZSApIHsKCQkJCWVjaG8gJyBzdHlsZT0iYmFja2dyb3VuZDogI2ZjYzljOTsiJzsKCQkJfQoJCQllY2hvICc+JzsKCQkJZWNobyAnCTx0ZD4nIC4gJHJvd1snTmFtZSddOwoJCQllY2hvICcJPGRpdiBjbGFzcz0icm93LWFjdGlvbnMiPgoJCQkJCQk8YSBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnZGJfY2hlY2snICkgLiAnJnRhYmxlPScgLiBiYXNlNjRfZW5jb2RlKCAkcm93WydOYW1lJ10gKSAuICcmIzAzODtUQl9pZnJhbWU9MSYjMDM4O3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAiIGNsYXNzPSJ0aGlja2JveCIgdGl0bGU9IkNoZWNrIGRhdGFiYXNlIHRhYmxlIGZvciBhbnkgZXJyb3JzIG9yIGNvcnJ1cHRpb24uIj5DaGVjazwvYT4KCQkJCQkJfAoJCQkJCQk8YSBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnZGJfcmVwYWlyJyApIC4gJyZ0YWJsZT0nIC4gYmFzZTY0X2VuY29kZSggJHJvd1snTmFtZSddICkgLiAnJiMwMzg7VEJfaWZyYW1lPTEmIzAzODt3aWR0aD02NDAmIzAzODtoZWlnaHQ9NjAwIiBjbGFzcz0idGhpY2tib3giIHRpdGxlPSJSZXBhaXIgdGFibGUgdGhhdCBoYXMgYmVlbiBjb3JydXB0ZWQuIE9ubHkgbmVlZGVkIGlmIHRoZSBzdGF0dXMgb3IgY2hlY2sgcmVzcG9uc2UgaW5kaWNhdGVkIGRhbWFnZS4iPlJlcGFpcjwvYT4KCQkJCQk8L2Rpdj4KCQkJCSc7CgkJCWVjaG8gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nIC4gJHN0YXR1cyAuICc8L3RkPic7CgkJCWVjaG8gJwk8dGQ+RW5naW5lOiAnIC4gJHJvd1snRW5naW5lJ10gLiAnPGJyPkNvbGxhdGlvbjogJyAuICRyb3dbJ0NvbGxhdGlvbiddIC4gJzwvdGQ+JzsKCQkJCgkJCWVjaG8gJwk8dGQ+VXBkYXRlZDogJzsKCQkJaWYgKCAkcm93WydVcGRhdGVfdGltZSddID09ICcnICkgewoJCQkJX2UoICdVbmF2YWlsYWJsZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQl9IGVsc2UgewoJCQkJZWNobyAkcm93WydVcGRhdGVfdGltZSddOwoJCQl9CgkJCWVjaG8gJzxicj5DaGVja2VkOiAnOwoJCQlpZiAoICRyb3dbJ0NoZWNrX3RpbWUnXSA9PSAnJyApIHsKCQkJCV9lKCAnVW5hdmFpbGFibGUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJfSBlbHNlIHsKCQkJCWVjaG8gJHJvd1snQ2hlY2tfdGltZSddOwoJCQl9CgkJCWVjaG8gJzwvdGQ+JzsKCQkJCgkJCWVjaG8gJwk8dGQ+JyAuICRyb3dbJ1Jvd3MnXSAuICc8L3RkPic7CgkJCWVjaG8gJwk8dGQ+JyAuIHBiX2JhY2t1cGJ1ZGR5OjokZm9ybWF0LT5maWxlX3NpemUoICRzaXplICkgLiAnPC90ZD4nOwoJCQlpZiAoICRleGNsdWRlZCA9PT0gdHJ1ZSApIHsKCQkJCWVjaG8gJwk8dGQ+PHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWltcG9ydGFudCI+RXhjbHVkZWQ8L3NwYW4+PC90ZD4nOwoJCQl9IGVsc2UgewoJCQkJZWNobyAnCTx0ZD4nIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHNpemUgKSAuICc8L3RkPic7CgkJCX0KCQkJCgkJCQoJCQkKCQkJCQkJCgkJCQoJCQkKCQkJJHRvdGFsX3Jvd3MgKz0gJHJvd1snUm93cyddOwoJCQllY2hvICc8L3RyPic7CgkJfQoJCWVjaG8gJzx0ciBjbGFzcz0iZW50cnktcm93IGFsdGVybmF0ZSI+JzsKCQllY2hvICcJPHRkPiZuYnNwOzwvdGQ+JzsKCQllY2hvICcJPHRkPiZuYnNwOzwvdGQ+JzsKCQllY2hvICcJPHRkPiZuYnNwOzwvdGQ+JzsKCQllY2hvICc8dGQ+PGI+JyxfXygnVE9UQUxTJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwnOjwvYj48L3RkPic7CgkJZWNobyAnPHRkPjxiPicgLiAkdG90YWxfcm93cyAuICc8L2I+PC90ZD4nOwoJCWVjaG8gJzx0ZD48Yj4nIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHRvdGFsX3NpemUgKSAuICc8L2I+PC90ZD4nOwoJCWVjaG8gJzx0ZD48Yj4nIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHRvdGFsX3NpemVfd2l0aF9leGNsdXNpb25zICkgLiAnPC9iPjwvdGQ+JzsKCQllY2hvICc8L3RyPic7CgkJCgkJcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydkYl9zaXplJ10gPSAkdG90YWxfc2l6ZTsKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ2RiX3NpemVfZXhjbHVkZWQnXSA9ICR0b3RhbF9zaXplX3dpdGhfZXhjbHVzaW9uczsKCQlwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ2RiX3NpemVfdXBkYXRlZCddID0gdGltZSgpOwoJCXBiX2JhY2t1cGJ1ZGR5OjpzYXZlKCk7CgkJCgkJdW5zZXQoICR0b3RhbF9zaXplICk7CgkJdW5zZXQoICR0b3RhbF9yb3dzICk7CgkJdW5zZXQoICRyb3dzICk7CgkJPz4KCTwvdGJvZHk+CjwvdGFibGU+PGJyPg==
###PACKDATA,FILE_END,/controllers/pages/server_info/database.php,importbuddy/controllers/pages/server_info/database.php
###PACKDATA,FILE_START,/controllers/pages/server_info/index.php,importbuddy/controllers/pages/server_info/index.php
PD9waHAKLy8gU2lsZW5jZSBpcyBnb2xkZW4uCj8+
###PACKDATA,FILE_END,/controllers/pages/server_info/index.php,importbuddy/controllers/pages/server_info/index.php
###PACKDATA,FILE_START,/controllers/pages/server_info/permissions.php,importbuddy/controllers/pages/server_info/permissions.php
PGJyPjw/cGhwCiR0ZXN0cyA9IGFycmF5KCk7CgokdXBsb2Fkc19kaXJzID0gd3BfdXBsb2FkX2RpcigpOwokZGlyZWN0b3JpZXMgPSBhcnJheSgKCUFCU1BBVEggLiAnJywKCUFCU1BBVEggLiAnd3AtaW5jbHVkZXMvJywKCUFCU1BBVEggLiAnd3AtYWRtaW4vJywKCVdQX0NPTlRFTlRfRElSIC4gJy90aGVtZXMvJywKCVdQX0NPTlRFTlRfRElSIC4gJy9wbHVnaW5zLycsCglXUF9DT05URU5UX0RJUiAuICcvJywKCS8vQUJTUEFUSCAuICd3cC1jb250ZW50LycsCglydHJpbSggJHVwbG9hZHNfZGlyc1snYmFzZWRpciddLCAnXFwvJyApIC4gJy8nLAoJQUJTUEFUSCAuICd3cC1pbmNsdWRlcy8nLAoJYmFja3VwYnVkZHlfY29yZTo6Z2V0QmFja3VwRGlyZWN0b3J5KCksCgliYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSwKKTsKaWYgKCBAZmlsZV9leGlzdHMoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSApICkgeyAvLyBUaGlzIGRpciBpcyB1c3VhbGx5IHRyYW5zaWVudCBzbyBtYXkgbm90IGV4aXN0LgoJJGRpcmVjdG9yaWVzW10gPSBiYWNrdXBidWRkeV9jb3JlOjpnZXRUZW1wRGlyZWN0b3J5KCk7Cn0KCgpmb3JlYWNoKCAkZGlyZWN0b3JpZXMgYXMgJGRpcmVjdG9yeSApIHsKCQoJJG1vZGVfb2N0YWxfZm91ciA9ICc8aT4nIC4gX18oICdVbmtub3duJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9pPic7Cgkkb3duZXIgPSAnPGk+JyAuIF9fKCAnVW5rbm93bicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvaT4nOwoJCglpZiAoICEgZmlsZV9leGlzdHMoICRkaXJlY3RvcnkgKSApIHsKCQkkbW9kZV9vY3RhbF9mb3VyID0gJ0RpcmVjdG9yeSBkb2VzXCd0IGV4aXN0JzsKCQkkb3duZXIgPSAnbi9hJzsKCX0KCSRzdGF0cyA9IHBsdWdpbmJ1ZGR5X3N0YXQ6OnN0YXQoICRkaXJlY3RvcnkgKTsKCWlmICggZmFsc2UgIT09ICRzdGF0cyApIHsKCQkkbW9kZV9vY3RhbF9mb3VyID0gJHN0YXRzWydtb2RlX29jdGFsX2ZvdXInXTsKCQkkb3duZXIgPSAkc3RhdHNbJ3VpZCddIC4gJzonIC4gJHN0YXRzWydnaWQnXTsKCX0KCSR0aGlzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCScvJyAuIHN0cl9yZXBsYWNlKCBBQlNQQVRILCAnJywgJGRpcmVjdG9yeSApLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJzw9IDc1NScsCgkJCQkJJ3ZhbHVlJwkJCT0+CQkkbW9kZV9vY3RhbF9mb3VyLAoJCQkJCSdvd25lcicJCQk9PgkJJG93bmVyLAoJCQkJKTsKCWlmICggZmFsc2UgPT09ICRzdGF0cyB8fCAkbW9kZV9vY3RhbF9mb3VyID4gNzU1ICkgewoJCSR0aGlzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJHRoaXNfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHRoaXNfdGVzdCApOwoJCn0gLy8gZW5kIGZvcmVhY2guCgoKPz4KCjx0YWJsZSBjbGFzcz0id2lkZWZhdCI+Cgk8dGhlYWQ+CgkJPHRyIGNsYXNzPSJ0aGVhZCI+CgkJCTw/cGhwIAoJCQkJZWNobyAnPHRoPicsIF9fKCdSZWxhdGl2ZSBQYXRoJywnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwnPC90aD4nLAoJCQkJCSc8dGg+JywgX18oJ1N1Z2dlc3Rpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQknPHRoPicsIF9fKCdWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSc8dGg+JywgX18oJ093bmVyIChVSUQ6R0lEKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCS8vICc8dGg+JywgX18oJ1Jlc3VsdCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoIHN0eWxlPSJ3aWR0aDogNjBweDsiPicsIF9fKCdTdGF0dXMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JzsKCQkJPz4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Zm9vdD4KCQk8dHIgY2xhc3M9InRoZWFkIj4KCQkJPD9waHAgCgkJCQllY2hvICc8dGg+JywgX18oJ1JlbGF0aXZlIFBhdGgnLCdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCc8L3RoPicsCgkJCQkJJzx0aD4nLCBfXygnU3VnZ2VzdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSc8dGg+JywgX18oJ1ZhbHVlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJJzx0aD4nLCBfXygnT3duZXIgKFVJRDpHSUQpJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJLy8gJzx0aD4nLCBfXygnUmVzdWx0JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJJzx0aCBzdHlsZT0id2lkdGg6IDYwcHg7Ij4nLCBfXygnU3RhdHVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPic7CgkJCT8+CgkJPC90cj4KCTwvdGZvb3Q+Cgk8dGJvZHk+CgkJPD9waHAKCQlmb3JlYWNoKCAkdGVzdHMgYXMgJHRoaXNfdGVzdCApIHsKCQkJZWNobyAnPHRyIGNsYXNzPSJlbnRyeS1yb3cgYWx0ZXJuYXRlIj4nOwoJCQllY2hvICcJPHRkPicgLiAkdGhpc190ZXN0Wyd0aXRsZSddIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nIC4gJHRoaXNfdGVzdFsnc3VnZ2VzdGlvbiddIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nIC4gJHRoaXNfdGVzdFsndmFsdWUnXSAuICc8L3RkPic7CgkJCWVjaG8gJwk8dGQ+JyAuICR0aGlzX3Rlc3RbJ293bmVyJ10gLiAnPC90ZD4nOwoJCQkvL2VjaG8gJwk8dGQ+JyAuICR0aGlzX3Rlc3RbJ3N0YXR1cyddIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nOwoJCQlpZiAoICR0aGlzX3Rlc3RbJ3N0YXR1cyddID09IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICkgewoJCQkJLy9lY2hvICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMjJFRTVCOyBib3JkZXI6IDFweCBzb2xpZCAjRTJFMkUyOyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9kaXY+JzsKCQkJCWVjaG8gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1zdWNjZXNzIj5QYXNzPC9zcGFuPic7CgkJCX0gZWxzZWlmICggJHRoaXNfdGVzdFsnc3RhdHVzJ10gPT0gX18oJ0ZBSUwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApIHsKCQkJCS8vZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0NGMzMzMzsgYm9yZGVyOiAxcHggc29saWQgI0UyRTJFMjsiPiZuYnNwOyZuYnNwOyZuYnNwOzwvZGl2Pic7CgkJCQllY2hvICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtaW1wb3J0YW50Ij5GYWlsPC9zcGFuPic7CgkJCX0gZWxzZWlmICggJHRoaXNfdGVzdFsnc3RhdHVzJ10gPT0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApIHsKCQkJCS8vZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZFRkY3RjsgYm9yZGVyOiAxcHggc29saWQgI0UyRTJFMjsiPiZuYnNwOyZuYnNwOyZuYnNwOzwvZGl2Pic7CgkJCQllY2hvICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyI+V2FybmluZzwvc3Bhbj4nOwoJCQl9IGVsc2UgewoJCQkJZWNobyAndW5rbm93bic7CgkJCX0KCQkJZWNobyAnCTwvdGQ+JzsKCQkJZWNobyAnPC90cj4nOwoJCX0KCQk/PgoJPC90Ym9keT4KPC90YWJsZT4KCjxicj48YnI+
###PACKDATA,FILE_END,/controllers/pages/server_info/permissions.php,importbuddy/controllers/pages/server_info/permissions.php
###PACKDATA,FILE_START,/controllers/pages/server_info/remote_sends.php,importbuddy/controllers/pages/server_info/remote_sends.php
PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKCQkKCQlqUXVlcnkoICcucGJfYmFja3VwYnVkZHlfcmVtb3Rlc2VuZF9hYm9ydCcgKS5jbGljayggZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmFqYXgoewoJCQkJdHlwZTogJ1BPU1QnLAoJCQkJdXJsOiBqUXVlcnkodGhpcykuYXR0ciggJ2hyZWYnICksCgkJCQlzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKCQkJCQlkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTsKCQkJCQlpZiAoICcxJyA9PSBkYXRhICkgewoJCQkJCQlhbGVydCggJ1JlbW90ZSB0cmFuc2ZlciBhYm9ydGVkLiBUaGlzIG1heSB0YWtlIGEgbW9tZW50IHRvIHRha2UgZWZmZWN0LicgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlhbGVydCggJ0Vycm9yICM4NTQ0ODk0OS4gVW5leHBlY3RlZCBzZXJ2ZXIgcmVzcG9uc2UuIERldGFpbHM6IGAnICsgZGF0YSArICdgLicgKTsKCQkJCQl9CgkJCQl9CgkJCX0pOwoJCQlyZXR1cm4gZmFsc2U7CgkJfSk7Cgl9KTsKPC9zY3JpcHQ+Cjw/cGhwCmJhY2t1cGJ1ZGR5X2NvcmU6OnRyaW1fcmVtb3RlX3NlbmRfc3RhdHMoKTsKCgoKJHJlbW90ZV9zZW5kcyA9IGFycmF5KCk7CiRzZW5kX2ZpbGVvcHRpb25zID0gcGJfYmFja3VwYnVkZHk6OiRmaWxlc3lzdGVtLT5nbG9iX2J5X2RhdGUoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldExvZ0RpcmVjdG9yeSgpIC4gJ2ZpbGVvcHRpb25zL3NlbmQtKi50eHQnICk7CmlmICggISBpc19hcnJheSggJHNlbmRfZmlsZW9wdGlvbnMgKSApIHsKCSRzZW5kX2ZpbGVvcHRpb25zID0gYXJyYXkoKTsKfQpmb3JlYWNoKCAkc2VuZF9maWxlb3B0aW9ucyBhcyAkc2VuZF9maWxlb3B0aW9uICkgewoJCgkkc2VuZF9pZCA9IHN0cl9yZXBsYWNlKCAnLnR4dCcsICcnLCBzdHJfcmVwbGFjZSggJ3NlbmQtJywgJycsIGJhc2VuYW1lKCAkc2VuZF9maWxlb3B0aW9uICkgKSApOwoJCglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdBYm91dCB0byBsb2FkIGZpbGVvcHRpb25zIGRhdGEuJyApOwoJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvY2xhc3Nlcy9maWxlb3B0aW9ucy5waHAnICk7CglwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnZGV0YWlscycsICdGaWxlb3B0aW9ucyBpbnN0YW5jZSAjMjMuJyApOwoJJGZpbGVvcHRpb25zX29iaiA9IG5ldyBwYl9iYWNrdXBidWRkeV9maWxlb3B0aW9ucyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvc2VuZC0nIC4gJHNlbmRfaWQgLiAnLnR4dCcsICRyZWFkX29ubHkgPSB0cnVlLCAkaWdub3JlX2xvY2sgPSB0cnVlLCAkY3JlYXRlX2ZpbGUgPSBmYWxzZSApOwoJaWYgKCB0cnVlICE9PSAoICRyZXN1bHQgPSAkZmlsZW9wdGlvbnNfb2JqLT5pc19vaygpICkgKSB7CgkJcGJfYmFja3VwYnVkZHk6OnN0YXR1cyggJ2Vycm9yJywgX18oJ0ZhdGFsIEVycm9yICM5MDM0LjMyMzkzLiBVbmFibGUgdG8gYWNjZXNzIGZpbGVvcHRpb25zIGRhdGEuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIEVycm9yOiAnIC4gJHJlc3VsdCApOwoJCXJldHVybiBmYWxzZTsKCX0KCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGRhdGEgbG9hZGVkLicgKTsKCQoJJHJlbW90ZV9zZW5kc1skc2VuZF9pZF0gPSAkZmlsZW9wdGlvbnNfb2JqLT5vcHRpb25zOwoJdW5zZXQoICRmaWxlb3B0aW9uc19vYmogKTsKCQp9CgoKCiRzZW5kcyA9IGFycmF5KCk7Ci8vZWNobyAnPHByZT4nIC4gcHJpbnRfciggJHJlbW90ZV9zZW5kcywgdHJ1ZSApIC4gJzwvcHJlPic7CmZvcmVhY2goICRyZW1vdGVfc2VuZHMgYXMgJHNlbmRfaWQgPT4gJHJlbW90ZV9zZW5kICkgewoJCgkvLyBTZXQgdXAgc29tZSB2YXJpYWJsZXMgYmFzZWQgb24gd2hldGhlciBmaWxlIGZpbmlzaGVkIHNlbmRpbmcgeWV0IG9yIG5vdC4KCWlmICggJHJlbW90ZV9zZW5kWydmaW5pc2hfdGltZSddID4gMCApIHsgLy8gRmluaXNoZWQgc2VuZGluZy4KCQkkdGltZV9hZ28gPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9hZ28oICRyZW1vdGVfc2VuZFsnZmluaXNoX3RpbWUnXSApIC4gJyBhZ287IDxiPnRvb2sgJzsKCQkkZHVyYXRpb24gPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+dGltZV9kdXJhdGlvbiggJHJlbW90ZV9zZW5kWydmaW5pc2hfdGltZSddIC0gJHJlbW90ZV9zZW5kWydzdGFydF90aW1lJ10gKSAuICc8L2I+JzsKCQkkZmluaXNoX3RpbWUgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoICRyZW1vdGVfc2VuZFsnZmluaXNoX3RpbWUnXSApICk7Cgl9IGVsc2UgeyAvLyBEaWQgbm90IGZpbmlzaCAoeWV0PykuCgkJJHRpbWVfYWdvID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPnRpbWVfYWdvKCAkcmVtb3RlX3NlbmRbJ3N0YXJ0X3RpbWUnXSApIC4gJyBhZ287IDxiPnVuZmluaXNoZWQ8L2I+JzsKCQkkZHVyYXRpb24gPSAnJzsKCQkkZmluaXNoX3RpbWUgPSAnPHNwYW4gY2xhc3M9ImRlc2NyaXB0aW9uIj5Vbmtub3duPC9zcGFuPic7Cgl9CgkKCS8vIEhhbmRsZSBzaG93aW5nIHNlbnQgSW1wb3J0QnVkZHkgKGlmIHNlbnQpLgoJaWYgKCBpc3NldCggJHJlbW90ZV9zZW5kWydzZW5kX2ltcG9ydGJ1ZGR5J10gKSAmJiAoICRyZW1vdGVfc2VuZFsnc2VuZF9pbXBvcnRidWRkeSddID09PSB0cnVlICkgKSB7CgkJJHNlbmRfaW1wb3J0YnVkZHkgPSAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+KyBpbXBvcnRidWRkeS5waHA8L3NwYW4+JzsKCX0gZWxzZSB7CgkJJHNlbmRfaW1wb3J0YnVkZHkgPSAnJzsKCX0KCQoJCgkvLyBTaG93IGZpbGUgc2l6ZSAoaWYgYXZhaWxhYmxlKS4KCWlmICggaXNzZXQoICRyZW1vdGVfc2VuZFsnZmlsZV9zaXplJ10gKSApIHsKCQkkZmlsZV9zaXplID0gJzxicj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPlNpemU6ICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkcmVtb3RlX3NlbmRbJ2ZpbGVfc2l6ZSddICkgLiAnPC9zcGFuPic7Cgl9IGVsc2UgewoJCSRmaWxlX3NpemUgPSAnJzsKCX0KCQoJaWYgKCBpc3NldCggJHJlbW90ZV9zZW5kWydlcnJvciddICkgKSB7CgkJJGVycm9yX2RldGFpbHMgPSAnPGJyPjxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiIgc3R5bGU9Im1hcmdpbi1sZWZ0OiAxMHB4OyI+JyAuICRyZW1vdGVfc2VuZFsnZXJyb3InXSAuICc8L3NwYW4+JzsKCX0gZWxzZSB7CgkJJGVycm9yX2RldGFpbHMgPSAnJzsKCX0KCQoJCgkvLyBTdGF0dXMgdmVyYmFnZSAmIHN0eWxpbmcgYmFzZWQgb24gc2VuZCBzdGF0dXMuCglpZiAoICRyZW1vdGVfc2VuZFsnc3RhdHVzJ10gPT0gJ3N1Y2Nlc3MnICkgewoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXN1Y2Nlc3MiPlN1Y2Nlc3M8L3NwYW4+JzsKCX0gZWxzZWlmICggJHJlbW90ZV9zZW5kWydzdGF0dXMnXSA9PSAndGltZW91dCcgKSB7CgkJJHN0YXR1cyA9ICc8c3BhbiBjbGFzcz0icGJfbGFiZWwgcGJfbGFiZWwtd2FybmluZyI+SW4gcHJvZ3Jlc3Mgb3IgdGltZWQgb3V0PC9zcGFuPic7IC8vIDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZW1vdGVzZW5kX2Fib3J0IiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVtb3Rlc2VuZF9hYm9ydCcgKSAuICcmc2VuZF9pZD0nIC4gJHNlbmRfaWQgIC4gJyI+KCBBYm9ydCApPC9hPic7Cgl9IGVsc2VpZiAoICRyZW1vdGVfc2VuZFsnc3RhdHVzJ10gPT0gJ2Fib3J0ZWQnICkgewoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciPkFib3J0ZWQgYnkgdXNlcjwvc3Bhbj4nOwoJfSBlbHNlaWYgKCAkcmVtb3RlX3NlbmRbJ3N0YXR1cyddID09ICdtdWx0aXBhcnQnICkgewoJCSRzdGF0dXMgPSAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLWluZm8iPk11bHRpcGFydCB0cmFuc2Zlcjwvc3Bhbj4nOyAvLyA8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVtb3Rlc2VuZF9hYm9ydCIgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlbW90ZXNlbmRfYWJvcnQnICkgLiAnJnNlbmRfaWQ9JyAuICRzZW5kX2lkICAuICciPiggQWJvcnQgKTwvYT4nOwoJfSBlbHNlIHsKCQkkc3RhdHVzID0gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1pbXBvcnRhbnQiPicgLiB1Y2ZpcnN0KCAkcmVtb3RlX3NlbmRbJ3N0YXR1cyddICkgLiAnPC9zcGFuPic7Cgl9CglpZiAoIGlzc2V0KCAkcmVtb3RlX3NlbmRbJ19tdWx0aXBhcnRfc3RhdHVzJ10gKSApIHsKCQkkc3RhdHVzIC49ICc8YnI+JyAuICRyZW1vdGVfc2VuZFsnX211bHRpcGFydF9zdGF0dXMnXTsKCX0KCQoJLy8gRGlzcGxheSAnVmlldyBMb2cnIGxpbmsgaWYgbG9nIGF2YWlsYWJsZSBmb3IgdGhpcyBzZW5kLgoJJGxvZ19maWxlID0gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnc3RhdHVzLXJlbW90ZV9zZW5kLScgLiAkc2VuZF9pZCAuICdfJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snbG9nX3NlcmlhbCddIC4gJy50eHQnOwoJaWYgKCBmaWxlX2V4aXN0cyggJGxvZ19maWxlICkgKSB7CgkJJHN0YXR1cyAuPSAnPGJyPjxhIHRpdGxlPSInIC4gX18oICdCYWNrdXAgUHJvY2VzcyBUZWNobmljYWwgRGV0YWlscycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgaHJlZj0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlbW90ZXNlbmRfZGV0YWlscycgKSAuICcmc2VuZF9pZD0nIC4gJHNlbmRfaWQgLiAnJiMwMzg7VEJfaWZyYW1lPTEmIzAzODt3aWR0aD02NDAmIzAzODtoZWlnaHQ9NjAwIiBjbGFzcz0idGhpY2tib3giPlZpZXcgTG9nPC9hPic7Cgl9CgkKCQoJLy8gRGV0ZXJtaW5lIGRlc3RpbmF0aW9uLgoJaWYgKCBpc3NldCggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydyZW1vdGVfZGVzdGluYXRpb25zJ11bJHJlbW90ZV9zZW5kWydkZXN0aW5hdGlvbiddXSApICkgeyAvLyBWYWxpZCBkZXN0aW5hdGlvbi4KCQkkZGVzdGluYXRpb24gPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3JlbW90ZV9kZXN0aW5hdGlvbnMnXVskcmVtb3RlX3NlbmRbJ2Rlc3RpbmF0aW9uJ11dWyd0aXRsZSddIC4gJyAoJyAuIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1sncmVtb3RlX2Rlc3RpbmF0aW9ucyddWyRyZW1vdGVfc2VuZFsnZGVzdGluYXRpb24nXV1bJ3R5cGUnXSAuICcpJzsKCX0gZWxzZSB7IC8vIEludmFsaWQgZGVzdGluYXRpb24gKGJlZW4gZGVsZXRlZCBzaW5jZSBzZW5kPykuCgkJJGRlc3RpbmF0aW9uID0gJzxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+VW5rbm93bjwvc3Bhbj4nOwoJfQoJCgkkd3JpdGVfc3BlZWQgPSAnJzsKCWlmICggaXNzZXQoICRyZW1vdGVfc2VuZFsnd3JpdGVfc3BlZWQnXSApICYmICggJycgIT0gJHJlbW90ZV9zZW5kWyd3cml0ZV9zcGVlZCddICkgKSB7CgkJJHdyaXRlX3NwZWVkID0gJ1RyYW5zZmVyIFNwZWVkOiAnIC4gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggJHJlbW90ZV9zZW5kWyd3cml0ZV9zcGVlZCddICkgLiAnL3NlYzxicj4nOwoJfQoJCgkkdHJpZ2dlciA9IHVjZmlyc3QoICRyZW1vdGVfc2VuZFsndHJpZ2dlciddICk7CgkkYmFzZV9maWxlID0gYmFzZW5hbWUoICRyZW1vdGVfc2VuZFsnZmlsZSddICk7CglpZiAoICdyZW1vdGUtc2VuZC10ZXN0LnBocCcgPT0gJGJhc2VfZmlsZSApIHsKCQkkYmFzZV9maWxlID0gX18oICdSZW1vdGUgZGVzdGluYXRpb24gdGVzdCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzxicj48c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iIHN0eWxlPSJtYXJnaW4tbGVmdDogMTBweDsiPihTZW5kICYgZGVsZXRlIHRlc3QgZmlsZSByZW1vdGUtc2VuZC10ZXN0LnBocCk8L3NwYW4+JzsKCQkkZmlsZV9zaXplID0gJyc7CgkJJHRyaWdnZXIgPSBfXyggJ01hbnVhbCBzZXR0aW5ncyB0ZXN0JywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJJGRlc3RpbmF0aW9uID0gJzxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+VGVzdCBzZXR0aW5nczwvc3Bhbj4nOwoJfQoJCgkvLyBQdXNoIGludG8gYXJyYXkuCgkkc2VuZHNbXSA9IGFycmF5KAoJCSRiYXNlX2ZpbGUgLiAkZmlsZV9zaXplIC4gJHNlbmRfaW1wb3J0YnVkZHkgLiAkZXJyb3JfZGV0YWlscywKCQkkZGVzdGluYXRpb24sCgkJJHRyaWdnZXIsCgkJJHdyaXRlX3NwZWVkIC4KCQknU3RhcnQ6ICcgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZGF0ZSggcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmxvY2FsaXplX3RpbWUoICAkcmVtb3RlX3NlbmRbJ3N0YXJ0X3RpbWUnXSApICkgLiAnPGJyPicgLgoJCSdGaW5pc2g6ICcgLiAkZmluaXNoX3RpbWUgLiAnPGJyPicgLgoJCSc8c3BhbiBjbGFzcz0iZGVzY3JpcHRpb24iPicgLiAkdGltZV9hZ28gIC4gJGR1cmF0aW9uIC4gJzwvc3Bhbj4nLAoJCSRzdGF0dXMsCgkpOwp9IC8vIEVuZCBmb3JlYWNoLgoKCmlmICggY291bnQoICRzZW5kcyApID09IDAgKSB7CgllY2hvICc8YnI+JyAuIF9fKCAnVGhlcmUgaGF2ZSBiZWVuIG5vIHJlY2VudCBmaWxlIHRyYW5zZmVycy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8YnI+JzsKfSBlbHNlIHsKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmxpc3RfdGFibGUoCgkJJHNlbmRzLAoJCWFycmF5KAoJCQknYWN0aW9uJwkJPT4JcGJfYmFja3VwYnVkZHk6OnBhZ2VfdXJsKCksCgkJCSdjb2x1bW5zJwkJPT4JYXJyYXkoCgkJCQlfXyggJ0JhY2t1cCBGaWxlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQlfXyggJ0Rlc3RpbmF0aW9uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQlfXyggJ1RyaWdnZXInLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCV9fKCAnVHJhbnNmZXIgSW5mb3JtYXRpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICcgPGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvc29ydF9kb3duLnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7IiB0aXRsZT0iU29ydGVkIG1vc3QgcmVjZW50IHN0YXJ0ZWQgZmlyc3QiPicsCgkJCQlfXyggJ1N0YXR1cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKSwKCQkJJ2NzcycJCQk9PgkJJ3dpZHRoOiAxMDAlOycsCgkJKQoJKTsKfQoKPz48YnI+
###PACKDATA,FILE_END,/controllers/pages/server_info/remote_sends.php,importbuddy/controllers/pages/server_info/remote_sends.php
###PACKDATA,FILE_START,/controllers/pages/server_info/server.php,importbuddy/controllers/pages/server_info/server.php
PHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5wYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIHsKCQljdXJzb3I6IHBvaW50ZXI7Cgl9Cjwvc3R5bGU+CjxzY3JpcHQ+CmpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CgkKCWpRdWVyeSgnLnBiX2JhY2t1cGJ1ZGR5X3Rlc3RFcnJvckxvZycpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKCQlqUXVlcnkoICcucGJfYmFja3VwYnVkZHlfbG9hZGluZycgKS5zaG93KCk7CgkJalF1ZXJ5LnBvc3QoIGpRdWVyeSh0aGlzKS5hdHRyKCAncmVsJyApLCB7IGZ1bmN0aW9uOiAndGVzdEVycm9yTG9nJyB9LCAKCQkJZnVuY3Rpb24oZGF0YSkgewoJCQkJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmcnICkuaGlkZSgpOwoJCQkJYWxlcnQoIGRhdGEgKTsKCQkJfQoJCSk7CgkJcmV0dXJuIGZhbHNlOwoJfSk7CgkKCWpRdWVyeSgnLnBiX2JhY2t1cGJ1ZGR5X3JlZnJlc2hfc3RhdHMnKS5jbGljayhmdW5jdGlvbihlKSB7CgkJbG9hZGluZyA9IGpRdWVyeSh0aGlzKS5jaGlsZHJlbiggJy5wYl9iYWNrdXBidWRkeV9sb2FkaW5nJyApOwoJCWxvYWRpbmcuc2hvdygpOwoJCQoJCXJlc3VsdF9vYmogPSBqUXVlcnkoICcjcGJfc3RhdHNfJyArIGpRdWVyeSh0aGlzKS5hdHRyKCAncmVsJyApICk7CgkJCgkJalF1ZXJ5LnBvc3QoIGpRdWVyeSh0aGlzKS5hdHRyKCAnYWx0JyApLCBqUXVlcnkodGhpcykuY2xvc2VzdCggJ2Zvcm0nICkuc2VyaWFsaXplKCksIAoJCQlmdW5jdGlvbihkYXRhKSB7CgkJCQkvL2FsZXJ0KGRhdGEpOwoJCQkJbG9hZGluZy5oaWRlKCk7CgkJCQlyZXN1bHRfb2JqLmh0bWwoIGRhdGEgKTsKCQkJfQoJCSk7IC8vLCJqc29uIik7CgkJCgkJcmV0dXJuIGZhbHNlOwoJfSk7Cn0pOwo8L3NjcmlwdD4KPD9waHAKLyoKICoJSU1QT1JUQU5UIE5PVEU6CiAqCiAqCVRoaXMgZmlsZSBpcyBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSBwcm9qZWN0cyAvIHB1cnBvc2VzOgogKgkJKyBCYWNrdXBCdWRkeSAodGhpcyBwbHVnaW4pIFNlcnZlciBJbmZvIHBhZ2UuCiAqCQkrIEltcG9ydEJ1ZGR5LnBocCAoQmFja3VwQnVkZHkgaW1wb3J0ZXIpIFNlcnZlciBJbmZvcm1hdGlvbiBidXR0b24gZHJvcGRvd24gZGlzcGxheS4KICoJCSsgU2VydmVyQnVkZHkgKHBsdWdpbikKICoKICoJVXNlIGNhdXRpb24gd2hlbiB1cGRhdGVkIHRvIHByZXZlbnQgYnJlYWtpbmcgb3RoZXIgcHJvamVjdHMuCiAqCiAqLwoKCi8vIGluaV9nZXRfYm9vbCgpIGNyZWRpdDogbmljb2xhcyBkb3QgZ3Jla2FzK3BocCBhdCBnbWFpbCBkb3QgY29tCmZ1bmN0aW9uIGluaV9nZXRfYm9vbCggJGEgKSB7CgkkYiA9IGluaV9nZXQoJGEpOwoJc3dpdGNoIChzdHJ0b2xvd2VyKCRiKSkgewoJCWNhc2UgJ29uJzoKCQljYXNlICd5ZXMnOgoJCWNhc2UgJ3RydWUnOgoJCQlyZXR1cm4gJ2Fzc2VydC5hY3RpdmUnICE9PSAkYTsKCQkJCgkJY2FzZSAnc3Rkb3V0JzoKCQljYXNlICdzdGRlcnInOgoJCQlyZXR1cm4gJ2Rpc3BsYXlfZXJyb3JzJyA9PT0gJGE7CgkJCQoJCWRlZmF1bHQ6CgkJCXJldHVybiAoYm9vbCkgKGludCkgJGI7Cgl9Cn0KCgoKZnVuY3Rpb24gcGJfYmFja3VwYnVkZHlfZ2V0X2xvYWRhdmcoKSB7CgkkcmVzdWx0ID0gYXJyYXkoICduL2EnLCAnbi9hJywgJ24vYScgKTsKCWlmICggZnVuY3Rpb25fZXhpc3RzKCdzeXNfZ2V0bG9hZGF2ZycpICkgewoJCSRsb2FkID0gQHN5c19nZXRsb2FkYXZnKCk7CgkJaWYgKGlzX2FycmF5KCRsb2FkKSkgewoJCQlpZihjb3VudCgkbG9hZCkgPT0gMykKCQkJCXJldHVybiAkbG9hZDsKCQkJZWxzZSB7CgkJCQlmb3IoJGk9MDskaTxjb3VudCgkbG9hZCk7JGkrKykKCQkJCQkkcmVzdWx0WyRpXSA9ICRsb2FkWyRpXTsKCQkJfQoJCX0KCX0KCWlmICggc3Vic3RyKCBQSFBfT1MsIDAsIDMgKSA9PSAnV0lOJyApIHsgLy8gV0lORE9XUy4KCQlvYl9zdGFydCgpOwoJCSRzdGF0dXMgPSBudWxsOwoJCUBwYXNzdGhydSgndHlwZXBlcmYgLXNjIDEgIlxwcm9jZXNzb3IoX3RvdGFsKVwlIHByb2Nlc3NvciB0aW1lIicsJHN0YXR1cyk7CgkJJGNvbnRlbnQgPSBvYl9nZXRfY29udGVudHMoKTsKCQlvYl9lbmRfY2xlYW4oKTsKCQlpZiAoJHN0YXR1cyA9PT0gMCkgewoJCQlpZiAocHJlZ19tYXRjaCgiL1wsXCIoWzAtOV0rXC5bMC05XSspXCIvIiwkY29udGVudCwkbG9hZCkpIHsJCQkJCQoJCQkJJHJlc3VsdFswXSA9IG51bWJlcl9mb3JtYXRfaTE4bigkbG9hZFsxXSwyKS4nICUnOwoJCQkJJHJlc3VsdFsxXSA9ICduL2EnOwoJCQkJJHJlc3VsdFsyXSA9ICduL2EnOwoJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCX0KCQl9CQkJCgl9IGVsc2UgewoJCWlmIChmdW5jdGlvbl9leGlzdHMoJ2ZpbGVfZ2V0X2NvbnRlbnRzJykgJiYgQGZpbGVfZXhpc3RzKCcvcHJvYy9sb2FkYXZnJykpIHsKCQkJJGxvYWQgPSBleHBsb2RlKGNocigzMiksIEBmaWxlX2dldF9jb250ZW50cygnL3Byb2MvbG9hZGF2ZycpKTsKCQkJaWYgKGlzX2FycmF5KCRsb2FkKSAmJiAoY291bnQoJGxvYWQpID49IDMpKSB7CgkJCQkkcmVzdWx0ID0gYXJyYXlfc2xpY2UoJGxvYWQsIDAsIDMpOwoJCQkJcmV0dXJuICRyZXN1bHQ7CgkJCX0KCQl9CgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSB7CgkJCSRzdHIgPSBzdWJzdHIoc3RycmNocihAc2hlbGxfZXhlYygndXB0aW1lJyksIjoiKSwxKTsKCQkJcmV0dXJuIGFycmF5X21hcCgidHJpbSIsZXhwbG9kZSgiLCIsJHN0cikpOwoJCX0KCX0KCXJldHVybiAkcmVzdWx0Owp9CgoKCQoJJHRlc3RzID0gYXJyYXkoKTsKCQoJCgkvLyBTa2lwIHRoZXNlIHRlc3RzIGluIGltcG9ydGJ1ZGR5LgoJaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJCQoJCS8vIEJBQ0tVUEJVRERZIFZFUlNJT04KCQkvLyBUT0RPOiBQdXQgQkIgdmVyc2lvbiBoZXJlLiBBZnRlciBKb3JkYW4gZml4ZXMgdXBkYXRlciBBUEkgdG8gYWx3YXlzIHByb3ZpZGUgbGF0ZXN0IHZlcnNpb24gaW5mbyB0aGVuIHdlIGNhbiBjb21wYXJlIGFuZCB3YXJuIGlmIHRvbyBvdXQgb2YgZGF0YS4KCQkvKgoJCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCQkndGl0bGUnCQkJPT4JCSdCYWNrdXBCdWRkeSBWZXJzaW9uJywKCQkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknPj0gJyAuIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3dwX21pbmltdW0nICkgLiAnIChsYXRlc3QgYmVzdCknLAoJCQkJCQkndmFsdWUnCQkJPT4JCSR3cF92ZXJzaW9uLAoJCQkJCQkndGlwJwkJCT0+CQlfXygnVmVyc2lvbiBvZiBXb3JkUHJlc3MgY3VycmVudGx5IHJ1bm5pbmcuIEl0IGlzIGltcG9ydGFudCB0byBrZWVwIHlvdXIgV29yZFByZXNzIHVwIHRvIGRhdGUgZm9yIHNlY3VyaXR5ICYgZmVhdHVyZXMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJKTsKCQlpZiAoIHZlcnNpb25fY29tcGFyZSggJHdwX3ZlcnNpb24sIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3dwX21pbmltdW0nICksICc8PScgKSApIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdGQUlMJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJfSBlbHNlIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCX0KCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCSovCgkJCgkJCgkJCgkJLy8gQkFDS1VQQlVERFkgVkVSU0lPTgoJCWlmICggZmFsc2UgPT09ICggJGxhdGVzdFZlcnNpb24gPSBiYWNrdXBidWRkeV9jb3JlOjpkZXRlcm1pbmVMYXRlc3RWZXJzaW9uKCkgKSApIHsKCQkJJHN1Z2dlc3Rpb25fdGV4dCA9ICdbaW5mb3JtYXRpb24gdW5hdmFpbGFibGVdJzsKCQkJJGxhdGVzdF9iYWNrdXBidWRkeV9ub25taW5vcl92ZXJzaW9uID0gMDsKCQl9IGVsc2UgewoJCQkkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24gPSAkbGF0ZXN0VmVyc2lvblswXTsKCQkJJGxhdGVzdF9iYWNrdXBidWRkeV9ub25taW5vcl92ZXJzaW9uID0gJGxhdGVzdFZlcnNpb25bMV07CgkJCQoJCQkkc3VnZ2VzdGlvbl90ZXh0ID0gJGxhdGVzdF9iYWNrdXBidWRkeV9ub25taW5vcl92ZXJzaW9uOwoJCQlpZiAoICRsYXRlc3RfYmFja3VwYnVkZHlfdmVyc2lvbiA9PSBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApICkgeyAvLyBBdCBhYnNvbHV0ZSBsYXRlc3QgaW5jbHVkaW5nIG1pbm9yLgoJCQkJJHN1Z2dlc3Rpb25fdGV4dCAuPSAnIChtYWpvciB2ZXJzaW9uKSBvciAnIC4gJGxhdGVzdF9iYWNrdXBidWRkeV92ZXJzaW9uIC4gJyAoPGEgaHJlZj0ib3B0aW9ucy1nZW5lcmFsLnBocD9wYWdlPWl0aGVtZXMtbGljZW5zaW5nIiB0aXRsZT0iWW91IG1heSBlbmFibGUgdXBncmFkaW5nIHRvIHRoZSBxdWljayByZWxlYXNlIHZlcnNpb24gb24gdGhlIGlUaGVtZXMgTGljZW5zaW5nIHBhZ2UuIj5xdWljayByZWxlYXNlPC9hPiknOwoJCQl9IGVsc2VpZiAoICRsYXRlc3RfYmFja3VwYnVkZHlfbm9ubWlub3JfdmVyc2lvbiAhPSAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24gKSB7IC8vIE1pbm9yIHZlcnNpb24gYXZhaWxhYmxlIHRoYXQgaXMgbmV3ZXIgdGhhbiBsYXRlc3QgbWFqb3IuCgkJCQkkc3VnZ2VzdGlvbl90ZXh0IC49ICcgKG1ham9yIHZlcnNpb24pIG9yICcgLiAkbGF0ZXN0X2JhY2t1cGJ1ZGR5X3ZlcnNpb24gLiAnICg8YSBocmVmPSJwbHVnaW5zLnBocD9pdGhlbWVzLXVwZGF0ZXItZm9yY2UtbWlub3ItdXBkYXRlPTEiIHRpdGxlPSJZb3UgbWF5IGVuYWJsZSB1cGdyYWRpbmcgdG8gdGhlIHF1aWNrIHJlbGVhc2UgdmVyc2lvbiBvbiB0aGUgaVRoZW1lcyBMaWNlbnNpbmcgcGFnZS4iPnF1aWNrIHJlbGVhc2UgdmVyc2lvbjwvYT47IDxhIGhyZWY9Im9wdGlvbnMtZ2VuZXJhbC5waHA/cGFnZT1pdGhlbWVzLWxpY2Vuc2luZyIgdGl0bGU9Ik9uY2UgeW91IGhhdmUgbGljZW5zZWQgQmFja3VwQnVkZHkgeW91IG1heSBzZWxlY3QgdGhpcyB0byBnbyB0byB0aGUgUGx1Z2lucyBwYWdlIHRvIHVwZ3JhZGUgdG8gdGhlIGxhdGVzdCBxdWljayByZWxlYXNlIHZlcnNpb24uIFR5cGljYWxseSBvbmx5IHRoZSBtYWluIG1ham9yIHZlcnNpb25zIGFyZSBhdmFpbGFibGUgZm9yIGF1dG9tYXRpYyB1cGRhdGVzIGJ1dCB0aGlzIG9wdGlvbiBpbnN0cnVjdHMgdGhlIHVwZGF0ZXIgdG8gZGlzcGxheSBtaW5vciB2ZXJzaW9uIHVwZGF0ZXMgZm9yIGFwcHJveGltYXRlbHkgb25lIGhvdXIuIElmIGl0IGRvZXMgbm90IGltbWVkaWF0ZWx5IGJlY29tZSBhdmFpbGFibGUgb24gdGhlIFBsdWdpbnMgcGFnZSwgdHJ5IHJlZnJlc2hpbmcgYSBjb3VwbGUgb2YgdGltZXMuIj5xdWljayByZWxlYXNlIHNldHRpbmdzPC9hPiknOwoJCQl9IGVsc2UgewoJCQkJJHN1Z2dlc3Rpb25fdGV4dCAuPSAnIChsYXRlc3QpJzsKCQkJfQoJCX0KCQkKCQkkdmVyc2lvbl9zdHJpbmcgPSBwYl9iYWNrdXBidWRkeTo6c2V0dGluZ3MoICd2ZXJzaW9uJyApOwoJCS8vIElmIG9uIERFViBzeXN0ZW0gKC5naXQgZGlyIGV4aXN0cykgdGhlbiBhcHBlbmQgc29tZSBkZXRhaWxzIG9uIGN1cnJlbnQuCgkJaWYgKCBAZmlsZV9leGlzdHMoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy8uZ2l0L2xvZ3MvSEVBRCcgKSApIHsKCQkJJGNvbW1pdF9sb2cgPSBlc2NhcGVzaGVsbGFyZyggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnLy5naXQvbG9ncy9IRUFEJyApOwoJCQkkY29tbWl0X2xpbmUgPSBleGVjKCAidGFpbCAtbiAxIHskY29tbWl0X2xvZ30iICk7CgkJCSR2ZXJzaW9uX3N0cmluZyAuPSAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1heC13aWR0aDogMjUwcHg7IGZvbnQtc2l6ZTogOHB4OyI+W0RFVjogJyAuICRjb21taXRfbGluZSAuICddPC9zcGFuPic7CgkJfQoJCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCQkndGl0bGUnCQkJPT4JCSdCYWNrdXBCdWRkeSBWZXJzaW9uJywKCQkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQkkc3VnZ2VzdGlvbl90ZXh0LAoJCQkJCQkndmFsdWUnCQkJPT4JCSR2ZXJzaW9uX3N0cmluZywKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ1ZlcnNpb24gb2YgQmFja3VwQnVkZHkgY3VycmVudGx5IHJ1bm5pbmcgb24gdGhpcyBzaXRlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCSk7CgkJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoIHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3ZlcnNpb24nICksICRsYXRlc3RfYmFja3VwYnVkZHlfbm9ubWlub3JfdmVyc2lvbiwgJzwnICkgKSB7CgkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnV0FSTklORycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCX0gZWxzZSB7CgkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQl9CgkJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQkKCQkKCQkKCQkvLyBXT1JEUFJFU1MgVkVSU0lPTgoJCWdsb2JhbCAkd3BfdmVyc2lvbjsKCQkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkJJ3RpdGxlJwkJCT0+CQknV29yZFByZXNzIFZlcnNpb24nLAoJCQkJCQknc3VnZ2VzdGlvbicJPT4JCSc+PSAnIC4gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnd3BfbWluaW11bScgKSAuICcgKGxhdGVzdCBiZXN0KScsCgkJCQkJCSd2YWx1ZScJCQk9PgkJJHdwX3ZlcnNpb24sCgkJCQkJCSd0aXAnCQkJPT4JCV9fKCdWZXJzaW9uIG9mIFdvcmRQcmVzcyBjdXJyZW50bHkgcnVubmluZy4gSXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgeW91ciBXb3JkUHJlc3MgdXAgdG8gZGF0ZSBmb3Igc2VjdXJpdHkgJiBmZWF0dXJlcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCWlmICggdmVyc2lvbl9jb21wYXJlKCAkd3BfdmVyc2lvbiwgcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAnd3BfbWluaW11bScgKSwgJzw9JyApICkgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ0ZBSUwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQl9IGVsc2UgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJfQoJCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQkvLyBNWVNRTCBWRVJTSU9OCgkJZ2xvYmFsICR3cGRiOwoJCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCQkndGl0bGUnCQkJPT4JCSdNeVNRTCBWZXJzaW9uJywKCQkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknPj0gNS4wLjE1JywKCQkJCQkJJ3ZhbHVlJwkJCT0+CQkkd3BkYi0+ZGJfdmVyc2lvbigpLAoJCQkJCQkndGlwJwkJCT0+CQlfXygnVmVyc2lvbiBvZiB5b3VyIGRhdGFiYXNlIHNlcnZlciAobXlzcWwpIGFzIHJlcG9ydGVkIHRvIHRoaXMgc2NyaXB0IGJ5IFdvcmRQcmVzcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCWlmICggdmVyc2lvbl9jb21wYXJlKCAkd3BkYi0+ZGJfdmVyc2lvbigpLCAnNS4wLjE1JywgJzw9JyApICkgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ0ZBSUwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQl9IGVsc2UgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJfQoJCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkJCgkJCgkJLy8gQURESEFORExFUiBIVEFDQ0VTUyBDSEVDSwoJCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCQkndGl0bGUnCQkJPT4JCSdBZGRIYW5kbGVyIGluIC5odGFjY2VzcycsCgkJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ2hvc3QgZGVwZW5kYW50IChub25lIGJlc3QgdW5sZXNzIHJlcXVpcmVkKScsCgkJCQkJCSd0aXAnCQkJPT4JCV9fKCdJZiBkZXRlY3RlZCB0aGVuIHlvdSBtYXkgaGF2ZSBkaWZmaWN1bHR5IG1pZ3JhdGluZyB5b3VyIHNpdGUgdG8gc29tZSBob3N0cyB3aXRob3V0IGZpcnN0IHJlbW92aW5nIHRoZSBBZGRIYW5kbGVyIGxpbmUuIFNvbWUgaG9zdHMgd2lsbCBtYWxmdW5jdGlvbiB3aXRoIHRoaXMgbGluZSBpbiB0aGUgLmh0YWNjZXNzIGZpbGUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJKTsKCQlpZiAoIGZpbGVfZXhpc3RzKCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKSApIHsKCQkJJGFkZGhhbmRsZXJfbm90ZSA9ICcnOwoJCQkkaHRhY2Nlc3NfbGluZXMgPSBmaWxlKCBBQlNQQVRIIC4gJy5odGFjY2VzcycgKTsKCQkJZm9yZWFjaCAoICRodGFjY2Vzc19saW5lcyBhcyAkaHRhY2Nlc3NfbGluZSApIHsKCQkJCWlmICggcHJlZ19tYXRjaCggJy9eKFxzKilBZGRIYW5kbGVyKC4qKS9pJywgJGh0YWNjZXNzX2xpbmUsICRtYXRjaGVzICkgPiAwICkgewoJCQkJCSRhZGRoYW5kbGVyX25vdGUgPSBwYl9iYWNrdXBidWRkeTo6dGlwKCBodG1sZW50aXRpZXMoICRtYXRjaGVzWzBdICksIF9fKCAnQWRkSGFuZGxlciBWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCBmYWxzZSApOwoJCQkJfQoJCQl9CgkJCXVuc2V0KCAkaHRhY2Nlc3NfbGluZXMgKTsKCQkJCgkJCWlmICggJGFkZGhhbmRsZXJfbm90ZSA9PSAnJyApIHsKCQkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJCSRwYXJlbnRfY2xhc3NfdGVzdFsndmFsdWUnXSA9IF9fKCdub25lLCBuL2EnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQkJfSBlbHNlIHsKCQkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnV0FSTklORycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQkJJHBhcmVudF9jbGFzc190ZXN0Wyd2YWx1ZSddID0gX18oJ2V4aXN0cycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJGFkZGhhbmRsZXJfbm90ZTsKCQkJfQoJCQl1bnNldCggJGh0YWNjZXNzX2NvbnRlbnRzICk7CgkJfSBlbHNlIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3ZhbHVlJ10gPSBfXygnbi9hJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJfQoJCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkJCgkJCgkJLy8gU2V0IHVwIFppcEJ1ZGR5IHdoZW4gd2l0aGluIEJhY2t1cEJ1ZGR5CgkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL3ppcGJ1ZGR5L3ppcGJ1ZGR5LnBocCcgKTsKCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10gPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpICk7CgkJCgkJcmVxdWlyZV9vbmNlKCBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3BhdGgoKSAuICcvbGliL215c3FsYnVkZHkvbXlzcWxidWRkeS5waHAnICk7CgkJZ2xvYmFsICR3cGRiOwoJCXBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snbXlzcWxidWRkeSddID0gbmV3IHBiX2JhY2t1cGJ1ZGR5X215c3FsYnVkZHkoIERCX0hPU1QsIERCX05BTUUsIERCX1VTRVIsIERCX1BBU1NXT1JELCAkd3BkYi0+cHJlZml4ICk7IC8vICRkYXRhYmFzZV9ob3N0LCAkZGF0YWJhc2VfbmFtZSwgJGRhdGFiYXNlX3VzZXIsICRkYXRhYmFzZV9wYXNzLCAkb2xkX3ByZWZpeCwgJGZvcmNlX21ldGhvZCA9IGFycmF5KCkKCX0KCQoJCgkvLyBQSFAgVkVSU0lPTgoJaWYgKCAhZGVmaW5lZCggJ3BsdWdpbmJ1ZGR5X2ltcG9ydGJ1ZGR5JyApICkgewoJCSRwaHBfbWluaW11bSA9IHBiX2JhY2t1cGJ1ZGR5OjpzZXR0aW5ncyggJ3BocF9taW5pbXVtJyApOwoJfSBlbHNlIHsgLy8gaW1wb3J0YnVkZHkgdmFsdWUuCgkJJHBocF9taW5pbXVtID0gcGJfYmFja3VwYnVkZHk6OnNldHRpbmdzKCAncGhwX21pbmltdW0nICk7Cgl9CgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdQSFAgVmVyc2lvbicsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknPj0gJyAuICRwaHBfbWluaW11bSAuICcgKDUuMi4xNisgYmVzdCknLAoJCQkJCSd2YWx1ZScJCQk9PgkJcGhwdmVyc2lvbigpLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdWZXJzaW9uIG9mIFBIUCBjdXJyZW50bHkgcnVubmluZyBvbiB0aGlzIHNpdGUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJaWYgKCB2ZXJzaW9uX2NvbXBhcmUoIFBIUF9WRVJTSU9OLCAkcGhwX21pbmltdW0sICc8PScgKSApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ0ZBSUwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkvLyBQSFAgbWF4X2V4ZWN1dGlvbl90aW1lCgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdQSFAgbWF4X2V4ZWN1dGlvbl90aW1lIChzZXJ2ZXItcmVwb3J0ZWQpJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSc+PSAnIC4gJzMwIHNlY29uZHMgKDMwKyBiZXN0KScsCgkJCQkJJ3ZhbHVlJwkJCT0+CQlpbmlfZ2V0KCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdNYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgUEhQIGFsbG93cyBzY3JpcHRzIHRvIHJ1bi4gQWZ0ZXIgdGhpcyBsaW1pdCBpcyByZWFjaGVkIHRoZSBzY3JpcHQgaXMga2lsbGVkLiBUaGUgbW9yZSB0aW1lIGF2YWlsYWJsZSB0aGUgYmV0dGVyLiAzMCBzZWNvbmRzIGlzIG1vc3QgY29tbW9uIHRob3VnaCA2MCBzZWNvbmRzIGlzIGlkZWFsLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCWlmICggc3RyX2lyZXBsYWNlKCAncycsICcnLCBpbmlfZ2V0KCAnbWF4X2V4ZWN1dGlvbl90aW1lJyApICkgPCAzMCApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIE1heGltdW0gUEhQIFJ1bnRpbWUgKEFDVFVBTCBURVNURUQhKQoJLyoKCWlmICggISBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJCSd0aXRsZScJCQk9PgkJJ1Rlc3RlZCBQSFAgTWF4IEV4ZWN1dGlvbiBUaW1lIChiZXRhKScsCgkJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJz49IDMwIHNlY29uZHMgKDMwKyBiZXN0KScsCgkJCQkJCSd2YWx1ZScJCQk9PgkJJzxzcGFuIGlkPSJwYl9zdGF0c19waHBfbWF4X3J1bnRpbWVfdGVzdCI+PCEtLSBjdXJyZW50IHZhbHVlIGhlcmUtLT48L3NwYW4+IDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzX0RJU0FCTEVEQUpBWCIgcmVsPSJwaHBfbWF4X3J1bnRpbWVfdGVzdCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncGhwX21heF9ydW50aW1lX3Rlc3QnICkgLiAnIiBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncGhwX21heF9ydW50aW1lX3Rlc3QnICkgLiAnIiB0YXJnZXQ9Il9uZXciIHRpdGxlPSInIC4gX18oJ1JlZnJlc2gnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSJUaGUgcGFnZSBtYXkgbm90IHNob3cgYW55dGhpbmcgdW50aWwgdGhlIHRlc3QgY29tcGxldGVzIChtYXggcnVudGltZSBnZXRzIGhpdCkuIFRlc3QgcmVzdWx0cyB3aWxsIGFsc28gYmUgZGlzcGxheWVkIGluIHlvdXIgQmFja3VwQnVkZHkgbG9nIGlmIGZ1bGwgbG9nZ2luZyBpcyBlbmFibGVkLiI+QmVnaW4gVGVzdDxpbWcgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IiBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPicsCgkJCQkJCSd0aXAnCQkJPT4JCV9fKCdUaGlzIGlzIHRoZSBURVNURUQgYW1vdW50IG9mIHRpbWUgdGhhdCBQSFAgYWxsb3dzIHNjcmlwdHMgdG8gcnVuLiBUaGUgdGVzdCB3YXMgcGVyZm9ybWVkIGJ5IG91dHB1dHRpbmcgLyBsb2dnaW5nIHRoZSBzY3JpcHQgdGltZSBlbGFwc2VkIG9uY2UgcGVyIHNlY29uZCB1bnRpbCBQSFAgdGltZWQgb3V0IGFuZCB0aHVzIHRoZSB0aW1lIHJlcG9ydGVkIHN0b3BwZWQuIFRoaXMgZ2l2ZXMgYSBmYWlybHkgYWNjdXJhdGUgbnVtYmVyIGNvbXBhcmVkIHRvIHRoZSByZXBvcnRlZCBudW1iZXIgd2hpY2ggaXMgbW9zdCBvZnRlbiBvdmVycmlkZW4gYXQgdGhlIHNlcnZlciB3aXRoIGEgbGltaXQuIElmIHRoZSBwYWdlIHN0YXlzIGJsYW5rIGZvciBhIHdoaWxlIHRoZW4gZXZlbnR1YWxseSBsb2FkcyB0aGVuIHlvdXIgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgbGl2ZSBmbHVzaGluZyBvZiB0aGUgdXBkYXRlZCB0aW1lIHRvIHlvdXIgYnJvd3NlciBzbyB5b3Ugd2lsbCBub3Qgc2VlIHVwZGF0ZXMgdW50aWwgdGhlIHRlc3QgY29tcGxldGVzLiAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJfQoJKi8KCQoJCgkKCS8vIE1FTU9SWSBMSU1JVAoJaWYgKCAhaW5pX2dldCggJ21lbW9yeV9saW1pdCcgKSApIHsKCQkkcGFyZW50X2NsYXNzX3ZhbCA9ICd1bmtub3duJzsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc192YWwgPSBpbmlfZ2V0KCAnbWVtb3J5X2xpbWl0JyApOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknUEhQIE1lbW9yeSBMaW1pdCcsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknPj0gMTI4TSAoMjU2TSsgYmVzdCknLAoJCQkJCSd2YWx1ZScJCQk9PgkJJHBhcmVudF9jbGFzc192YWwsCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ1RoZSBhbW91bnQgb2YgbWVtb3J5IHRoaXMgc2l0ZSBpcyBhbGxvd2VkIHRvIGNvbnN1bWUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJaWYgKCBwcmVnX21hdGNoKCAnLyhcZCspKFx3KikvJywgJHBhcmVudF9jbGFzc192YWwsICRtYXRjaGVzICkgKSB7CgkJJHBhcmVudF9jbGFzc192YWwgPSAkbWF0Y2hlc1sxXTsKCQkkdW5pdCA9ICRtYXRjaGVzWzJdOwoJCS8vIFVwIG1lbW9yeSBsaW1pdCBpZiBjdXJyZW50bHkgbG93ZXIgdGhhbiAyNTZNLgoJCWlmICggJ2cnICE9PSBzdHJ0b2xvd2VyKCAkdW5pdCApICkgewoJCQlpZiAoICggJHBhcmVudF9jbGFzc192YWwgPCAxMjggKSB8fCAoICdtJyAhPT0gc3RydG9sb3dlciggJHVuaXQgKSApICkgewoJCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdXQVJOSU5HJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCX0gZWxzZSB7CgkJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJCX0KCQl9Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnV0FSTklORycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIEVSUk9SIExPR0dJTkcgRU5BQkxFRC9ESVNBQkxFRAoJaWYgKCB0cnVlID09IGluaV9nZXQoICdsb2dfZXJyb3JzJyApICkgewoJCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2VuYWJsZWQnOwoJfSBlbHNlIHsKCQkkcGFyZW50X2NsYXNzX3ZhbCA9ICdkaXNhYmxlZCc7Cgl9CgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkndGl0bGUnCQkJPT4JCSdQSFAgRXJyb3IgTG9nZ2luZyAobG9nX2Vycm9ycyknLAoJCSdzdWdnZXN0aW9uJwk9PgkJJ2VuYWJsZWQnLAoJCSd2YWx1ZScJCQk9PgkJJHBhcmVudF9jbGFzc192YWwgLiAnIFs8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIGNsYXNzPSJwYl9iYWNrdXBidWRkeV90ZXN0RXJyb3JMb2ciIHJlbD0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3Rlc3RFcnJvckxvZycgKSAuICciIHRpdGxlPSInIC4gX18oJ1Rlc3RpbmcgdGhpcyB3aWxsIHRyaWdnZXIgYW4gZXJyb3JfbG9nKCkgZXZlbnQgd2l0aCB0aGUgY29udGVudCAiQmFja3VwQnVkZHkgVGVzdCAtIFRoaXMgaXMgb25seSBhIHRlc3QuIEEgdXNlciB0cmlnZ2VyZWQgQmFja3VwQnVkZHkgdG8gZGV0ZXJtaW5lIGlmIHdyaXRpbmcgdG8gdGhlIFBIUCBlcnJvciBsb2cgaXMgd29ya2luZyBhcyBleHBlY3RlZC4iJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj5UZXN0PC9hPl0nLAoJCSd0aXAnCQkJPT4JCV9fKCdXaGV0aGVyIG9yIG5vdCBQSFAgZXJyb3JzIGFyZSBsb2dnZWQgdG8gYSBmaWxlIG9yIG5vdC4gU2V0IGJ5IHBocC5pbmkgbG9nX2Vycm9ycycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJKTsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQoJCgkvLyBFUlJPUiBMT0cgRklMRQoJaWYgKCAhaW5pX2dldCggJ2Vycm9yX2xvZycgKSApIHsKCQkkcGFyZW50X2NsYXNzX3ZhbCA9ICd1bmtub3duJzsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc192YWwgPSBpbmlfZ2V0KCAnZXJyb3JfbG9nJyApOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJJ3RpdGxlJwkJCT0+CQknUEhQIEVycm9yIExvZyBGaWxlIChlcnJvcl9sb2cpJywKCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCSd2YWx1ZScJCQk9PgkJJzxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1heC13aWR0aDogMjUwcHg7Ij4nIC4gJHBhcmVudF9jbGFzc192YWwgLiAnPC9zcGFuPicsCgkJJ3RpcCcJCQk9PgkJX18oJ0ZpbGUgd2hlcmUgUEhQIGVycm9ycyBhcmUgbG9nZ2VkIHRvIGlmIFBIUCBFcnJvciBMb2dnaW5nIGlzIGVuYWJsZWQgKHJlY29tbWVuZGVkKS4gU2V0IGJ5IHBocC5pbmkgZXJyb3JfbG9nJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkpOwoJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIERJU1BMQVlfRVJST1JTIFNFVFRJTkcKCWlmICggdHJ1ZSA9PSBpbmlfZ2V0KCAnZGlzcGxheV9lcnJvcnMnICkgKSB7CgkJJHBhcmVudF9jbGFzc192YWwgPSAnZW5hYmxlZCc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2Rpc2FibGVkJzsKCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCSd0aXRsZScJCQk9PgkJJ1BIUCBEaXNwbGF5IEVycm9ycyB0byBTY3JlZW4gKGRpc3BsYXlfZXJyb3JzKScsCgkJJ3N1Z2dlc3Rpb24nCT0+CQknZGlzYWJsZWQnLAoJCSd2YWx1ZScJCQk9PgkJJHBhcmVudF9jbGFzc192YWwsCgkJJ3RpcCcJCQk9PgkJX18oJ1doZXRoZXIgb3Igbm90IFBIUCBlcnJvcnMgYXJlIGRpc3BsYXllZCBvbiBzY3JlZW4gdG8gdGhlIHVzZXIuIFRoaXMgaXMgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcgUEhQIHByb2JsZW1zIGJ1dCBkaXNhYmxpbmcgYnkgZGVmYXVsdCBpcyBtb3JlIHNlY3VyZSBmb3IgcHJvZHVjdGlvbi4gU2V0IGJ5IHBocC5pbmkgZGlzcGxheV9lcnJvcnMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkvKgoJaWYgKCAnZW5hYmxlZCcgIT0gJHBhcmVudF9jbGFzc192YWwgKSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfSBlbHNlIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0KCSovCglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCQoJaWYgKCBkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkJaWYgKCAhaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snemlwYnVkZHknXSApICkgewoJCQlyZXF1aXJlX29uY2UoIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fcGF0aCgpIC4gJy9saWIvemlwYnVkZHkvemlwYnVkZHkucGhwJyApOwoJCQlwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10gPSBuZXcgcGx1Z2luYnVkZHlfemlwYnVkZHkoIEFCU1BBVEggKTsKCQl9Cgl9CgkkemlwX21ldGhvZHMgPSBpbXBsb2RlKCAnLCAnLCBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPl96aXBfbWV0aG9kcyApOwoJCglpZiAoICEgZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJCSR6aXBtZXRob2RfcmVmcmVzaCA9ICc8YSBjbGFzcz0icGJfYmFja3VwYnVkZHlfcmVmcmVzaF9zdGF0cyIgcmVsPSJyZWZyZXNoX3ppcF9tZXRob2RzIiBhbHQ9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdyZWZyZXNoX3ppcF9tZXRob2RzJyApIC4gJyIgdGl0bGU9IicgLiBfXygnUmVmcmVzaCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPic7Cgl9IGVsc2UgewoJCSR6aXBtZXRob2RfcmVmcmVzaCA9ICcnOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknWmlwIE1ldGhvZHMnLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ0NvbW1hbmQgbGluZSBbZmFzdGVzdF0gPiB6aXBhcmNoaXZlID4gUEhQLWJhc2VkIChwY2x6aXApIFtzbG93ZXN0XScsCgkJCQkJJ3ZhbHVlJwkJCT0+CQknPHNwYW4gaWQ9InBiX3N0YXRzX3JlZnJlc2hfemlwX21ldGhvZHMiPicgLiAkemlwX21ldGhvZHMgLiAnPC9zcGFuPiAnIC4gJHppcG1ldGhvZF9yZWZyZXNoLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdNZXRob2RzIHlvdXIgc2VydmVyIHN1cHBvcnRzIGZvciBjcmVhdGluZyBaSVAgZmlsZXMuIFRoZXNlIHdlcmUgdGVzdGVkICYgdmVyaWZpZWQgdG8gb3BlcmF0ZS4gQ29tbWFuZCBsaW5lIGlzIG1hZ25pdHVkZXMgYmV0dGVyIHRoYW4gb3RoZXIgbWV0aG9kcyBhbmQgb3BlcmF0ZXMgdmlhIGV4ZWMoKSBvciBvdGhlciBleGVjdXRpb24gZnVuY3Rpb25zLiBaaXBBcmNoaXZlIGlzIGEgUEhQIGV4dGVuc2lvbi4gUEhQLWJhc2VkIFpJUCBjb21wcmVzc2lvbi9leHRyYWN0aW9uIGlzIHBlcmZvcm1lZCB2aWEgYSBQSFAgc2NyaXB0IGNhbGxlZCBwY2x6aXAgYnV0IGl0IGlzIHNsb3dlciBhbmQgY2FuIGJlIG1lbW9yeSBpbnRlbnNpdmUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJaWYgKCBpbl9hcnJheSggJ2V4ZWMnLCBwYl9iYWNrdXBidWRkeTo6JGNsYXNzZXNbJ3ppcGJ1ZGR5J10tPl96aXBfbWV0aG9kcyApICkgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdXQVJOSU5HJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCWlmICggIWRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCQkKCQkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkJJ3RpdGxlJwkJCT0+CQknRGF0YWJhc2UgRHVtcCBNZXRob2RzJywKCQkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknQ29tbWFuZCBsaW5lIGFuZC9vciBQSFAtYmFzZWQnLAoJCQkJCQkndmFsdWUnCQkJPT4JCWltcGxvZGUoICcsICcsIHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snbXlzcWxidWRkeSddLT5nZXRfbWV0aG9kcygpICksCgkJCQkJCSd0aXAnCQkJPT4JCV9fKCdNZXRob2RzIHlvdXIgc2VydmVyIHN1cHBvcnRzIGZvciBkdW1waW5nIChiYWNraW5nIHVwKSB5b3VyIG15c3FsIGRhdGFiYXNlLiBUaGVzZSB3ZXJlIHRlc3RlZCB2YWx1ZXMgdW5sZXNzIGNvbXBhdGliaWxpdHkgLyB0cm91Ymxlc2hvb3Rpbmcgc2V0dGluZ3Mgb3ZlcnJpZGUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJKTsKCQkkZGJfbWV0aG9kcyA9IHBiX2JhY2t1cGJ1ZGR5OjokY2xhc3Nlc1snbXlzcWxidWRkeSddLT5nZXRfbWV0aG9kcygpOwoJCWlmICggaW5fYXJyYXkoICdjb21tYW5kbGluZScsICRkYl9tZXRob2RzICkgfHwgaW5fYXJyYXkoICdwaHAnLCAkZGJfbWV0aG9kcyApICkgeyAvLyBQSFAgaXMgY29uc2lkZXJlZCBqdXN0IGFzIGdvb2QgYXMgb2YgQkIgdjUuMC4KCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCX0gZWxzZSB7CgkJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnV0FSTklORycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCX0KCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCQoJCQoJCQoJCS8vIFNpdGUgU2l6ZQoJCWlmICggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX3NpemUnXSA+IDAgKSB7CgkJCSRzaXRlX3NpemUgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfc2l6ZSddICk7CgkJfSBlbHNlIHsKCQkJJHNpdGVfc2l6ZSA9ICc8aT5Vbmtub3duPC9pPic7CgkJfQoJCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCQkndGl0bGUnCQkJPT4JCSdTaXRlIFNpemUnLAoJCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9zaXRlX3NpemUiPicgLiAkc2l0ZV9zaXplIC4gJzwvc3Bhbj4gPGEgY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X3JlZnJlc2hfc3RhdHMiIHJlbD0icmVmcmVzaF9zaXRlX3NpemUiIGFsdD0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlZnJlc2hfc2l0ZV9zaXplJyApIC4gJyIgdGl0bGU9IicgLiBfXygnUmVmcmVzaCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPicsCgkJCQkJCSd0aXAnCQkJPT4JCV9fKCdUb3RhbCBzaXplIG9mIHlvdXIgc2l0ZSAoc3RhcnRpbmcgaW4geW91ciBXb3JkUHJlc3MgbWFpbiBkaXJlY3RvcnkpIElOQ0xVRElORyBhbnkgZXhjbHVkZWQgZGlyZWN0b3JpZXMgLyBmaWxlcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCQoJCQoJCQoJCS8vIFNpdGUgc2l6ZSBXSVRIIEVYQ0xVU0lPTlMgYWNjb3VudGVkIGZvci4KCQlpZiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9zaXplX2V4Y2x1ZGVkJ10gPiAwICkgewoJCQkkc2l0ZV9zaXplX2V4Y2x1ZGVkID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX3NpemVfZXhjbHVkZWQnXSApOwoJCX0gZWxzZSB7CgkJCSRzaXRlX3NpemVfZXhjbHVkZWQgPSAnPGk+VW5rbm93bjwvaT4nOwoJCX0KCQkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkJJ3RpdGxlJwkJCT0+CQknU2l0ZSBTaXplIChEZWZhdWx0IEV4Y2x1c2lvbnMgYXBwbGllZCknLAoJCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9zaXRlX3NpemVfZXhjbHVkZWQiPicgLiAkc2l0ZV9zaXplX2V4Y2x1ZGVkIC4gJzwvc3Bhbj4gPGEgY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X3JlZnJlc2hfc3RhdHMiIHJlbD0icmVmcmVzaF9zaXRlX3NpemVfZXhjbHVkZWQiIGFsdD0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3JlZnJlc2hfc2l0ZV9zaXplX2V4Y2x1ZGVkJyApIC4gJyIgdGl0bGU9IicgLiBfXygnUmVmcmVzaCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+PGltZyBzcmM9IicgLiBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpIC4gJy9pbWFnZXMvcmVmcmVzaF9ncmF5LmdpZiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtMXB4OyI+IDxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+PC9hPicsCgkJCQkJCSd0aXAnCQkJPT4JCV9fKCdUb3RhbCBzaXplIG9mIHlvdXIgc2l0ZSAoc3RhcnRpbmcgaW4geW91ciBXb3JkUHJlc3MgbWFpbiBkaXJlY3RvcnkpIEVYQ0xVRElORyBhbnkgZGlyZWN0b3JpZXMgLyBmaWxlcyB5b3UgaGF2ZSBtYXJrZWQgZm9yIGV4Y2x1c2lvbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCQoJCQoJCS8vIFNpdGUgT2JqZWN0cwoJCWlmICggaXNzZXQoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzJ10gKSAmJiAoIHBiX2JhY2t1cGJ1ZGR5Ojokb3B0aW9uc1snc3RhdHMnXVsnc2l0ZV9vYmplY3RzJ10gPiAwICkgKSB7CgkJCSRzaXRlX29iamVjdHMgPSBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfb2JqZWN0cyddOwoJCX0gZWxzZSB7CgkJCSRzaXRlX29iamVjdHMgPSAnPGk+VW5rbm93bjwvaT4nOwoJCX0KCQkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkJJ3RpdGxlJwkJCT0+CQknU2l0ZSBudW1iZXIgb2YgZmlsZXMnLAoJCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9vYmplY3RzIj4nIC4gJHNpdGVfb2JqZWN0cyAuICc8L3NwYW4+IDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIiByZWw9InJlZnJlc2hfb2JqZWN0cyIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF9zaXRlX29iamVjdHMnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ1RvdGFsIG51bWJlciBvZiBmaWxlcy9mb2xkZXJzIGluIHlvdXIgc2l0ZSAoc3RhcnRpbmcgaW4geW91ciBXb3JkUHJlc3MgbWFpbiBkaXJlY3RvcnkpIElOQ0xVRElORyBhbnkgZXhjbHVkZWQgZGlyZWN0b3JpZXMgLyBmaWxlcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCQoJCQoJCQoJCS8vIFNpdGUgb2JqZWN0cyBXSVRIIEVYQ0xVU0lPTlMgYWNjb3VudGVkIGZvci4KCQlpZiAoIGlzc2V0KCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfb2JqZWN0c19leGNsdWRlZCddICkgJiYgKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ3NpdGVfb2JqZWN0c19leGNsdWRlZCddID4gMCApICkgewoJCQkkc2l0ZV9vYmplY3RzX2V4Y2x1ZGVkID0gcGJfYmFja3VwYnVkZHk6OiRvcHRpb25zWydzdGF0cyddWydzaXRlX29iamVjdHNfZXhjbHVkZWQnXTsKCQl9IGVsc2UgewoJCQkkc2l0ZV9vYmplY3RzX2V4Y2x1ZGVkID0gJzxpPlVua25vd248L2k+JzsKCQl9CgkJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJCSd0aXRsZScJCQk9PgkJJ1NpdGUgbnVtYmVyIG9mIGZpbGVzIChEZWZhdWx0IEV4Y2x1c2lvbnMgYXBwbGllZCknLAoJCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9vYmplY3RzX2V4Y2x1ZGVkIj4nIC4gJHNpdGVfb2JqZWN0c19leGNsdWRlZCAuICc8L3NwYW4+IDxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9yZWZyZXNoX3N0YXRzIiByZWw9InJlZnJlc2hfb2JqZWN0c19leGNsdWRlZCIgYWx0PSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncmVmcmVzaF9zaXRlX29iamVjdHNfZXhjbHVkZWQnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ1RvdGFsIG51bWJlciBvZiBmaWxlcy9mb2xkZXJzIHNpdGUgKHN0YXJ0aW5nIGluIHlvdXIgV29yZFByZXNzIG1haW4gZGlyZWN0b3J5KSBFWENMVURJTkcgYW55IGRpcmVjdG9yaWVzIC8gZmlsZXMgeW91IGhhdmUgbWFya2VkIGZvciBleGNsdXNpb24uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJKTsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQkKCQkKCQkKCQkvLyBEYXRhYmFzZSBTaXplCgkJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJCSd0aXRsZScJCQk9PgkJJ0RhdGFiYXNlIFNpemUnLAoJCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBpZD0icGJfc3RhdHNfcmVmcmVzaF9kYXRhYmFzZV9zaXplIj4nIC5wYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ2RiX3NpemUnXSApIC4gJzwvc3Bhbj4gPGEgY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X3JlZnJlc2hfc3RhdHMiIHJlbD0icmVmcmVzaF9kYXRhYmFzZV9zaXplIiBhbHQ9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdyZWZyZXNoX2RhdGFiYXNlX3NpemUnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ1RvdGFsIHNpemUgb2YgeW91ciBkYXRhYmFzZSBJTkNMVURJTkcgYW55IGV4Y2x1ZGVkIHRhYmxlcy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCQoJCQoJCQoJCS8vIERhdGFiYXNlIHNpemUgV0lUSCBFWENMVVNJT05TIGFjY291bnRlZCBmb3IuCgkJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJCSd0aXRsZScJCQk9PgkJJ0RhdGFiYXNlIFNpemUgKERlZmF1bHQgRXhjbHVzaW9ucyBhcHBsaWVkKScsCgkJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ24vYScsCgkJCQkJCSd2YWx1ZScJCQk9PgkJJzxzcGFuIGlkPSJwYl9zdGF0c19yZWZyZXNoX2RhdGFiYXNlX3NpemVfZXhjbHVkZWQiPicgLiBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3N0YXRzJ11bJ2RiX3NpemVfZXhjbHVkZWQnXSApIC4gJzwvc3Bhbj4gPGEgY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X3JlZnJlc2hfc3RhdHMiIHJlbD0icmVmcmVzaF9kYXRhYmFzZV9zaXplX2V4Y2x1ZGVkIiBhbHQ9IicgLiBwYl9iYWNrdXBidWRkeTo6YWpheF91cmwoICdyZWZyZXNoX2RhdGFiYXNlX3NpemVfZXhjbHVkZWQnICkgLiAnIiB0aXRsZT0iJyAuIF9fKCdSZWZyZXNoJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnIj48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9yZWZyZXNoX2dyYXkuZ2lmIiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0xcHg7Ij4gPHNwYW4gY2xhc3M9InBiX2JhY2t1cGJ1ZGR5X2xvYWRpbmciIHN0eWxlPSJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogMTBweDsiPjxpbWcgc3JjPSInIC4gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKSAuICcvaW1hZ2VzL2xvYWRpbmcuZ2lmIiBhbHQ9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgdGl0bGU9IicgLiBfXygnTG9hZGluZy4uLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiBzdHlsZT0idmVydGljYWwtYWxpZ246IC0zcHg7IiAvPjwvc3Bhbj48L2E+JywKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ1RvdGFsIHNpemUgb2YgeW91ciBkYXRhYmFzZSBFWENMVURJTkcgYW55IHRhYmxlcyB5b3UgaGF2ZSBtYXJrZWQgZm9yIGV4Y2x1c2lvbi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCQoJCQoJCQoJCS8qKioqKiBCRUdJTiBBVkVSQUdFIFdSSVRFIFNQRUVEICoqKioqLwoJCXJlcXVpcmVfb25jZSggcGJfYmFja3VwYnVkZHk6OnBsdWdpbl9wYXRoKCkgLiAnL2NsYXNzZXMvZmlsZW9wdGlvbnMucGhwJyApOwoJCQoJCSR3cml0ZV9zcGVlZF9zYW1wbGVzID0gMDsKCQkkd3JpdGVfc3BlZWRfc3VtID0gMDsKCQkkYmFja3VwcyA9IGdsb2IoIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpIC4gJyouemlwJyApOwoJCWlmICggISBpc19hcnJheSggJGJhY2t1cHMgKSApIHsKCQkJJGJhY2t1cHMgPSBhcnJheSgpOwoJCX0KCQlmb3JlYWNoKCAkYmFja3VwcyBhcyAkYmFja3VwICkgewoJCQkKCQkJJHNlcmlhbCA9IGJhY2t1cGJ1ZGR5X2NvcmU6OmdldF9zZXJpYWxfZnJvbV9maWxlKCAkYmFja3VwICk7CgkJCXBiX2JhY2t1cGJ1ZGR5OjpzdGF0dXMoICdkZXRhaWxzJywgJ0ZpbGVvcHRpb25zIGluc3RhbmNlICMyMi4nICk7CgkJCSRiYWNrdXBfb3B0aW9ucyA9IG5ldyBwYl9iYWNrdXBidWRkeV9maWxlb3B0aW9ucyggYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuICRzZXJpYWwgLiAnLnR4dCcsICRyZWFkX29ubHkgPSB0cnVlICk7CgkJCWlmICggdHJ1ZSAhPT0gKCAkcmVzdWx0ID0gJGJhY2t1cF9vcHRpb25zLT5pc19vaygpICkgKSB7CgkJCQlwYl9iYWNrdXBidWRkeTo6c3RhdHVzKCAnd2FybmluZycsICdVbmFibGUgdG8gb3BlbiBmaWxlb3B0aW9ucyBmaWxlIGAnIC4gYmFja3VwYnVkZHlfY29yZTo6Z2V0TG9nRGlyZWN0b3J5KCkgLiAnZmlsZW9wdGlvbnMvJyAuICRzZXJpYWwgLiAnLnR4dCcgLiAnYC4gRGV0YWlsczogYCcgLiAkcmVzdWx0IC4gJ2AuJyApOwoJCQl9IAoJCQkJCgkJCQkKCQkJaWYgKCBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydpbnRlZ3JpdHknXSApICYmIGlzc2V0KCAkYmFja3VwX29wdGlvbnMtPm9wdGlvbnNbJ2ludGVncml0eSddWydzaXplJ10gKSApIHsKCQkJCSR3cml0ZV9zcGVlZF9zYW1wbGVzKys7CgkJCQkKCQkJCSRzaXplID0gJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydpbnRlZ3JpdHknXVsnc2l6ZSddOwoJCQkJJHRpbWVfdGFrZW4gPSAwOwoJCQkJaWYgKCBpc3NldCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydzdGVwcyddICkgKSB7CgkJCQkJZm9yZWFjaCggJGJhY2t1cF9vcHRpb25zLT5vcHRpb25zWydzdGVwcyddIGFzICRzdGVwICkgewoJCQkJCQlpZiAoICRzdGVwWydmdW5jdGlvbiddID09ICdiYWNrdXBfemlwX2ZpbGVzJyApIHsKCQkJCQkJCSR0aW1lX3Rha2VuID0gJHN0ZXBbJ2ZpbmlzaF90aW1lJ10gLSAkc3RlcFsnc3RhcnRfdGltZSddOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9IC8vIEVuZCBmb3JlYWNoLgoJCQkJfSAvLyBFbmQgaWYgc3RlcHMgaXNzZXQuCgkJCQkKCQkJCWlmICggJHRpbWVfdGFrZW4gPT0gMCApIHsKCQkJCQkvLyR3cml0ZV9zcGVlZF9zdW0gKz0gMDsKCQkJCQkkd3JpdGVfc3BlZWRfc2FtcGxlcyA9ICR3cml0ZV9zcGVlZF9zYW1wbGVzIC0gMTsgLy8gSWdub3JlIHRoaXMgc2FtcGxlIHNpbmNlIGl0J3MgdG9vIHNtYWxsIHRvIGNvdW50LgoJCQkJfSBlbHNlIHsKCQkJCQkkd3JpdGVfc3BlZWRfc3VtICs9ICRzaXplIC8gJHRpbWVfdGFrZW47IC8vIFN1bSB1cCB3cml0ZSBzcGVlZHMuCgkJCQl9CgkJCQkKCQkJfQoJCX0KCQkKCQlpZiAoICR3cml0ZV9zcGVlZF9zdW0gPiAwICkgewoJCQkkZmluYWxfd3JpdGVfc3BlZWQgPSBwYl9iYWNrdXBidWRkeTo6JGZvcm1hdC0+ZmlsZV9zaXplKCAkd3JpdGVfc3BlZWRfc3VtIC8gJHdyaXRlX3NwZWVkX3NhbXBsZXMgKSAuICcvc2VjJzsKCQkJJGZpbmFsX3dyaXRlX3NwZWVkX2d1ZXNzID0gcGJfYmFja3VwYnVkZHk6OiRmb3JtYXQtPmZpbGVfc2l6ZSggKCAkd3JpdGVfc3BlZWRfc3VtIC8gJHdyaXRlX3NwZWVkX3NhbXBsZXMgKSAqIGluaV9nZXQoICdtYXhfZXhlY3V0aW9uX3RpbWUnICkgKTsKCQl9IGVsc2UgewoJCQkkZmluYWxfd3JpdGVfc3BlZWQgPSAnPGk+VW5rbm93bjwvaT4nOwoJCQkkZmluYWxfd3JpdGVfc3BlZWRfZ3Vlc3MgPSAnPGk+VW5rbm93bjwvaT4nOwoJCX0KCQkKCQkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkJJ3RpdGxlJwkJCT0+CQknQXZlcmFnZSBXcml0ZSBTcGVlZCcsCgkJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ24vYScsCgkJCQkJCSd2YWx1ZScJCQk9PgkJICRmaW5hbF93cml0ZV9zcGVlZCwKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ0F2ZXJhZ2UgWklQIGZpbGUgY3JlYXRpb24gd3JpdGUgc3BlZWQuIEJhY2t1cCBmaWxlIHNpemVzIGRpdmlkZWQgYnkgdGhlIHRpbWUgdGFrZW4gdG8gY3JlYXRlIGVhY2guIFNhbXBsZXM6IGAnIC4gJHdyaXRlX3NwZWVkX3NhbXBsZXMgLiAnYC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCS8qKioqKiBFTkQgQVZFUkFHRSBXUklURSBTUEVFRCAqKioqKi8KCQkKCQkKCQkvLyBHdWVzcyBtYXggc2l0ZSBzaXplIHRvIGJlIGFibGUgdG8gYmFja3VwLgoJCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCQkndGl0bGUnCQkJPT4JCSdHdWVzc3RpbWF0ZSBvZiBtYXggWklQIHNpemUnLAoJCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCQkndmFsdWUnCQkJPT4JCSRmaW5hbF93cml0ZV9zcGVlZF9ndWVzcywKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ0NhbGN1bGF0ZWQgZXN0aW1hdGUgb2YgdGhlIGxhcmdlc3QgLlpJUCBiYWNrdXAgZmlsZSB0aGF0IG1heSBiZSBjcmVhdGVkLiBBcyBaSVAgZmlsZXMgYXJlIGNvbXByZXNzZWQgdGhlIHNpdGUgc2l6ZSB0aGF0IG1heSBiZSBiYWNrZWQgdXAgc2hvdWxkIGJlIGxhcmdlciB0aGFuIHRoaXMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJKTsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQkKCQkKCQkKCQkvLyBIdHRwIGxvb3BiYWNrcy4KCQlpZiAoICggJGxvb3BiYWNrX3Jlc3BvbnNlID0gYmFja3VwYnVkZHlfY29yZTo6bG9vcGJhY2tfdGVzdCgpICkgPT09IHRydWUgKSB7CgkJCSRsb29wYmFja19zdGF0dXMgPSAnZW5hYmxlZCc7CgkJCSRzdGF0dXMgPSAnT0snOwoJCX0gZWxzZSB7CgkJCSRsb29wYmFja19zdGF0dXMgPSAnZGlzYWJsZWQgKGVuYWJsZSBhbHRlcm5hdGUgY3JvbiknOwoJCQkkc3RhdHVzID0gJ1dBUk5JTkcnOwoJCX0KCQkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkJJ3RpdGxlJwkJCT0+CQknSHR0cCBMb29wYmFja3MnLAoJCQkJCQknc3VnZ2VzdGlvbicJPT4JCSdlbmFibGVkJywKCQkJCQkJJ3ZhbHVlJwkJCT0+CQkkbG9vcGJhY2tfc3RhdHVzLAoJCQkJCQkndGlwJwkJCT0+CQlfXygnU29tZSBzZXJ2ZXJzIGRvIGFyZSBub3QgY29uZmlndXJlZCBwcm9wZXJseSB0byBhbGxvdyBXb3JkUHJlc3MgdG8gY29ubmVjdCBiYWNrIHRvIGl0c2VsZiB2aWEgdGhlIHNpdGUgVVJMIChpZTogaHR0cDovL3lvdXIuY29tIGNvbm5lY3RzIGJhY2sgdG8gaXRzZWxmIG9uIHRoZSBzYW1lIHNlcnZlciBhdCBodHRwOi8veW91ci5jb20vIHRvIHRyaWdnZXIgYSBzaW11bGF0ZWQgY3JvbiBzdGVwKS4gSWYgdGhpcyBpcyB0aGUgY2FzZSB5b3UgbXVzdCBlaXRoZXIgYXNrIHlvdXIgaG9zdGluZyBwcm92aWRlciB0byBmaXggdGhpcyBvciBlbmFibGUgV29yZFByZXMgQWx0ZXJuYXRlIENyb24gbW9kZSBpbiB5b3VyIHdwLWNvbmZpZy5waHAgZmlsZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXyggJHN0YXR1cywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQkKCQkKCQkKCQkvLyBIdHRwIGxvb3BiYWNrIFVSTCAmIElQLgoJCSRzdGF0dXMgPSAnT0snOwoJCSRwYXJzZWRfdXJsID0gcGFyc2VfdXJsKCBzaXRlX3VybCgpICk7CgkJJGlwID0gZ2V0aG9zdGJ5bmFtZSggJHBhcnNlZF91cmxbJ2hvc3QnXSApOwoJCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCQkndGl0bGUnCQkJPT4JCSdMb29wYmFjayBEb21haW4gJiBJUCcsCgkJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ24vYScsCgkJCQkJCSd2YWx1ZScJCQk9PgkJJHBhcnNlZF91cmxbJ2hvc3QnXSAuICcgPSZndDsgJyAuICRpcCwKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ1NvbWV0aW1lcyBkdWUgdG8gRE5TIGRlbGF5cyB0aGUgc2VydmVyIG1heSBkZXRlY3QgdGhlIG9sZCBJUCBhZGRyZXNzIGFzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCB5b3VyIHNpdGUgZG9tYWluIHVzZWQgaW4gdGhlIGxvb3BiYWNrIFVSTC4gVGhpcyBjYW4gcmVzdWx0IGluIGxvb3BiYWNrIHByb2JsZW1zIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGJlIGVuYWJsZWQuIENvbnRhY3QgeW91ciBob3N0IG9yIHdhaXQgbG9uZ2VyIGlmIHRoZSBJUCBhZGRyZXNzIHRoaXMgc2VydmVyIHJlcG9ydHMgaXMgaW5jb3JyZWN0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCSk7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCAkc3RhdHVzLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCQoJCQoJCQoJCS8vIENST04gZGlzYWJsZWQ/CgkJaWYgKCBkZWZpbmVkKCdESVNBQkxFX1dQX0NST04nKSAmJiBESVNBQkxFX1dQX0NST04gKSB7CgkJCSRjcm9uX3N0YXR1cyA9ICdkaXNhYmxlZCc7CgkJCSRzdGF0dXMgPSAnRkFJTCc7CgkJfSBlbHNlIHsKCQkJJGNyb25fc3RhdHVzID0gJ2VuYWJsZWQnOwoJCQkkc3RhdHVzID0gJ09LJzsKCQl9CgkJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJCSd0aXRsZScJCQk9PgkJJ1dvcmRQcmVzcyBDcm9uJywKCQkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknZW5hYmxlZCcsCgkJCQkJCSd2YWx1ZScJCQk9PgkJJGNyb25fc3RhdHVzLAoJCQkJCQkndGlwJwkJCT0+CQlfXyggJ1RoaXMgY2hlY2sgdmVyaWZpZXMgdGhhdCB0aGUgY3JvbiBzeXN0ZW0gaGFzIG5vdCBiZWVuIGRpc2FibGVkIGJ5IHRoZSBESVNBQkxFX1dQX0NST04gY29uc3RhbnQuIFRoaXMgbWF5IGJlIGRlZmluZWQgYnkgYSBwbHVnaW4gb3Igb3RoZXIgbWV0aG9kIHRvIGRpc2FibGUgdGhlIGNyb24gc3lzdGVtIHdoaWNoIG1heSByZXN1bHQgaW4gYXV0b21hdGVkIGZ1bmN0aW9uYWxpdHkgbm90IGJlaW5nIGF2YWlsYWJsZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXyggJHN0YXR1cywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQkKCQkKCQkKCQkvLyBBbHRlcm5hdGUgY3JvbiBvbj8KCQlpZiAoIGRlZmluZWQoICdBTFRFUk5BVEVfV1BfQ1JPTicgKSAmJiAoIEFMVEVSTkFURV9XUF9DUk9OID09PSB0cnVlICkgKSB7CgkJCSRhbHRlcm5hdGVfY3Jvbl9zdGF0dXMgPSAnZW5hYmxlZCc7CgkJfSBlbHNlIHsKCQkJJGFsdGVybmF0ZV9jcm9uX3N0YXR1cyA9ICdkaXNhYmxlZCAoZGVmYXVsdCknOwoJCX0KCQkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkJJ3RpdGxlJwkJCT0+CQknV29yZFByZXNzIEFsdGVybmF0ZSBDcm9uJywKCQkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknVmFyaWVzIChzZXJ2ZXItZGVwZW5kZW50KScsCgkJCQkJCSd2YWx1ZScJCQk9PgkJJGFsdGVybmF0ZV9jcm9uX3N0YXR1cywKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ1NvbWUgc2VydmVycyBkbyBub3QgYWxsb3cgc2l0ZXMgdG8gY29ubmVjdCBiYWNrIHRvIHRoZW1zZWx2ZXMgYXQgdGhlaXIgb3duIFVSTC4gIFdvcmRQcmVzcyBhbmQgQmFja3VwQnVkZHkgbWFrZSB1c2Ugb2YgdGhlc2UgIkh0dHAgTG9vcGJhY2tzIiBmb3Igc2V2ZXJhbCB0aGluZ3MuICBXaXRob3V0IHRoZW0geW91IG1heSBlbmNvdW50ZXIgaXNzdWVzLiBJZiB5b3VyIHNlcnZlciBuZWVkcyBpdCBvciB5b3UgYXJlIGRpcmVjdGVkIGJ5IHN1cHBvcnQgeW91IG1heSBlbmFibGUgQWx0ZXJuYXRlIENyb24gaW4geW91ciB3cC1jb25maWcucGhwIGZpbGUuICBXaGVuIGVuYWJsZWQgdGhpcyBzZXR0aW5nIHdpbGwgZGlzcGxheSAiRW5hYmxlZCIgdG8gcmVtaW5kIHlvdS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCQoJCQoJCQoJCQoJfSAvLyBFbmQgbm9uLWltcG9ydGJ1ZGR5IHRlc3RzLgoJCQoJCgkKCQoJCgoKCgoJCQoJCgkvLyBSRUdJU1RFUiBHTE9CQUxTCgkkZGlzYWJsZWRfZnVuY3Rpb25zID0gaW5pX2dldCggJ2Rpc2FibGVfZnVuY3Rpb25zJyApOwoJaWYgKCAkZGlzYWJsZWRfZnVuY3Rpb25zID09ICcnICkgewoJCSRkaXNhYmxlZF9mdW5jdGlvbnMgPSAnKG5vbmUpJzsKCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ0Rpc2FibGVkIFBIUCBGdW5jdGlvbnMnLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ24vYScsCgkJCQkJJ3ZhbHVlJwkJCT0+CQknPHRleHRhcmVhIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWF4LWhlaWdodDogMjAwcHg7IiBkaXNhYmxlZD0iZGlzYWJsZWQiPicgLiBzdHJfcmVwbGFjZSggJywnLCAnLCAnLCAkZGlzYWJsZWRfZnVuY3Rpb25zICkgLiAnPC90ZXh0YXJlYT4nLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdTb21lIGhvc3RzIGJsb2NrIGNlcnRhaW4gUEhQIGZ1bmN0aW9ucyBmb3IgdmFyaW91cyByZWFzb25zLiBTb21ldGltZXMgaG9zdHMgYmxvY2sgZnVuY3Rpb25zIHRoYXQgYXJlIHJlcXVpcmVkIGZvciBwcm9wZXIgZnVuY3Rpb25pbmcgb2YgV29yZFByZXNzIG9yIHBsdWdpbnMuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJJGRpc2FibGVkX2Z1bmN0aW9ucyA9IHN0cl9yZXBsYWNlKCAnLCAnLCAnLCcsICRkaXNhYmxlZF9mdW5jdGlvbnMgKTsgLy8gTm9ybWFsaXplIHNwYWNlcyBvciBsYWNrIG9mIHNwYWNlcyBiZXR3ZWVuIGRpc2FibGVkIGZ1bmN0aW9ucy4KCSRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgPSBleHBsb2RlKCAnLCcsICRkaXNhYmxlZF9mdW5jdGlvbnMgKTsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCWlmICgKCQkoIHRydWUgPT09IGluX2FycmF5KCAnZXhlYycsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApCgkJfHwKCQkoIHRydWUgPT09IGluX2FycmF5KCAnaW5pX3NldCcsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApCgkJKSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdGQUlMJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCS8vIFJFR0lTVEVSIEdMT0JBTFMKCWlmICggaW5pX2dldF9ib29sKCAncmVnaXN0ZXJfZ2xvYmFscycgKSA9PT0gdHJ1ZSApIHsKCQkkcGFyZW50X2NsYXNzX3ZhbCA9ICdlbmFibGVkJzsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc192YWwgPSAnZGlzYWJsZWQnOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknUEhQIFJlZ2lzdGVyIEdsb2JhbHMnLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ2Rpc2FibGVkJywKCQkJCQkndmFsdWUnCQkJPT4JCSRwYXJlbnRfY2xhc3NfdmFsLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdBdXRvbWF0aWNhbGx5IHJlZ2lzdGVycyB1c2VyIGlucHV0IGFzIHZhcmlhYmxlcy4gSElHSExZIGRpc2NvdXJhZ2VkLiBSZW1vdmVkIGZyb20gUEhQIGluIFBIUCA2IGZvciBzZWN1cml0eS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CglpZiAoICRwYXJlbnRfY2xhc3NfdmFsICE9ICdkaXNhYmxlZCcgKSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdGQUlMJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0KCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCS8vIE1BR0lDIFFVT1RFUyBHUEMKCWlmICggaW5pX2dldF9ib29sKCAnbWFnaWNfcXVvdGVzX2dwYycgKSA9PT0gdHJ1ZSApIHsKCQkkcGFyZW50X2NsYXNzX3ZhbCA9ICdlbmFibGVkJzsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc192YWwgPSAnZGlzYWJsZWQnOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknUEhQIE1hZ2ljIFF1b3RlcyBHUEMnLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ2Rpc2FibGVkJywKCQkJCQkndmFsdWUnCQkJPT4JCSRwYXJlbnRfY2xhc3NfdmFsLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdBdXRvbWF0aWNhbGx5IGVzY2FwZXMgdXNlciBpbnB1dHRlZCBkYXRhLiBOb3QgbmVlZGVkIHdoZW4gdXNpbmcgcHJvcGVybHkgY29kZWQgc29mdHdhcmUuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkpOwoJaWYgKCAkcGFyZW50X2NsYXNzX3ZhbCAhPSAnZGlzYWJsZWQnICkgewoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnV0FSTklORycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfSBlbHNlIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7Cgl9CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkvLyBNQUdJQyBRVU9URVMgUlVOVElNRQoJaWYgKCBpbmlfZ2V0X2Jvb2woICdtYWdpY19xdW90ZXNfcnVudGltZScgKSA9PT0gdHJ1ZSApIHsKCQkkcGFyZW50X2NsYXNzX3ZhbCA9ICdlbmFibGVkJzsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc192YWwgPSAnZGlzYWJsZWQnOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknUEhQIE1hZ2ljIFF1b3RlcyBSdW50aW1lJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSdkaXNhYmxlZCcsCgkJCQkJJ3ZhbHVlJwkJCT0+CQkkcGFyZW50X2NsYXNzX3ZhbCwKCQkJCQkndGlwJwkJCT0+CQlfXygnQXV0b21hdGljYWxseSBlc2NhcGVzIHVzZXIgaW5wdXR0ZWQgZGF0YS4gTm90IG5lZWRlZCB3aGVuIHVzaW5nIHByb3Blcmx5IGNvZGVkIHNvZnR3YXJlLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCWlmICggJHBhcmVudF9jbGFzc192YWwgIT0gJ2Rpc2FibGVkJyApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIFNBRkUgTU9ERQoJaWYgKCBpbmlfZ2V0X2Jvb2woICdzYWZlX21vZGUnICkgPT09IHRydWUgKSB7CgkJJHBhcmVudF9jbGFzc192YWwgPSAnZW5hYmxlZCc7Cgl9IGVsc2UgewoJCSRwYXJlbnRfY2xhc3NfdmFsID0gJ2Rpc2FibGVkJzsKCX0KCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCSd0aXRsZScJCQk9PgkJJ1BIUCBTYWZlIE1vZGUnLAoJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ2Rpc2FibGVkJywKCQkJCQkndmFsdWUnCQkJPT4JCSRwYXJlbnRfY2xhc3NfdmFsLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdUaGlzIG1vZGUgaXMgSElHSExZIGRpc2NvdXJhZ2VkIGFuZCBpcyBhIHNpZ24gb2YgYSBwb29ybHkgY29uZmlndXJlZCBob3N0LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCWlmICggJHBhcmVudF9jbGFzc192YWwgIT0gJ2Rpc2FibGVkJyApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIFBIUCBBUEkKCSRwaHBfYXBpID0gJ1Vua25vd24nOwoJaWYgKCBpc19jYWxsYWJsZSggJ3BocF9zYXBpX25hbWUnICkgKSB7CgkJJHBocF9hcGkgPSBwaHBfc2FwaV9uYW1lKCk7Cgl9CgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdQSFAgQVBJJywKCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCSd2YWx1ZScJCQk9PgkJJHBocF9hcGksCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ0FQSSBtb2RlIFBIUCBpcyBydW5uaW5nIHVuZGVyLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQoJCgkvLyBQSFAgQml0cwoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknUEhQIEFyY2hpdGVjdHVyZScsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknNjQtYml0JywKCQkJCQkndmFsdWUnCQkJPT4JCSggUEhQX0lOVF9TSVpFICogOCApIC4gJy1iaXQnLAoJCQkJCSd0aXAnCQkJPT4JCV9fKCdXaGV0aGVyIFBIUCBpcyBydW5uaW5nIGluIDMyIG9yIDY0IGJpdCBtb2RlLiA2NC1iaXQgaXMgcmVjb21tZW5kZWQgb3ZlciAzMi1iaXQuIE5vdGU6IFRoaXMgb25seSBkZXRlcm1pbmVzIFBIUCBzdGF0dXMgTk9UIHN0YXR1cyBvZiBvdGhlciBzZXJ2ZXIgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIGZpbGVzeXN0ZW0sIGNvbW1hbmQgbGluZSB6aXAsIGV0Yy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSk7CgkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CglhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJCgkKCQoJLy8gaHR0cCBTZXJ2ZXIgU29mdHdhcmUKCWlmICggaXNzZXQoICRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSApICkgewoJCSRzZXJ2ZXJfc29mdHdhcmUgPSAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ107Cgl9IGVsc2UgewoJCSRzZXJ2ZXJfc29mdHdhcmUgPSAnVW5rbm93bic7Cgl9CgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdIdHRwIFNlcnZlciBTb2Z0d2FyZScsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCQkndmFsdWUnCQkJPT4JCSRzZXJ2ZXJfc29mdHdhcmUsCgkJCQkJJ3RpcCcJCQk9PgkJX18oJ1NvZnR3YXJlIHJ1bm5pbmcgdGhpcyBodHRwIHdlYiBzZXJ2ZXIsIHN1Y2ggYXMgQXBhY2hlLCBJSVMsIG9yIE5naW54LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7CgkKCQoJCgkvLyBMb2FkIEF2ZXJhZ2UKCWlmICggIWRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCQkkbG9hZF9hdmVyYWdlID0gcGJfYmFja3VwYnVkZHlfZ2V0X2xvYWRhdmcoKTsKCQlmb3JlYWNoKCAkbG9hZF9hdmVyYWdlIGFzICYkdGhpc19sb2FkICkgewoJCQkkdGhpc19sb2FkID0gcm91bmQoICR0aGlzX2xvYWQsIDIgKTsKCQl9CgkJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJCSd0aXRsZScJCQk9PgkJJ1NlcnZlciBMb2FkIEF2ZXJhZ2UnLAoJCQkJCQknc3VnZ2VzdGlvbicJPT4JCSduL2EnLAoJCQkJCQkndmFsdWUnCQkJPT4JCWltcGxvZGUoICcsICcsICRsb2FkX2F2ZXJhZ2UgKSwKCQkJCQkJJ3RpcCcJCQk9PgkJX18oJ1NlcnZlciBDUFUgdXNlIGluIGludGVydmFsczogMSBtaW51dGUsIDUgbWludXRlcywgMTUgbWludXRlcy4gRS5nLiAuNDUgYmFzaWNhbGx5IGVxdWF0ZXMgdG8gNDUlIENQVSB1c2FnZS4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCSRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJfQoJCgkKCQoJLy8gU0ZUUCBzdXBwb3J0PwoJaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJCSRjb25uZWN0ID0gJ25vJzsKCQkkc2Z0cCA9ICdubyc7CgkJaWYgKCBpc19jYWxsYWJsZSggJ3NzaDJfY29ubmVjdCcgKSAmJiAoIGZhbHNlID09PSBpbl9hcnJheSggJ3NzaDJfY29ubmVjdCcsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApICkgewoJCQkkY29ubmVjdCA9ICd5ZXMnOwoJCX0KCQlpZiAoIGlzX2NhbGxhYmxlKCAnc3NoMl9mdHAnICkgJiYgKCBmYWxzZSA9PT0gaW5fYXJyYXkoICdzc2gyX2Z0cCcsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApICkgewoJCQkkY29ubmVjdCA9ICd5ZXMnOwoJCX0KCQkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkJJ3RpdGxlJwkJCT0+CQknUEhQIFNTSDIsIFNGVFAgU3VwcG9ydCcsCgkJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ24vYScsCgkJCQkJCSd2YWx1ZScJCQk9PgkJJGNvbm5lY3QgLiAnLCAnIC4gJHNmdHAsCgkJCQkJCSd0aXAnCQkJPT4JCV9fKCAnV2hldGhlciBvciBub3QgeW91ciBzZXJ2ZXIgaXMgY29uZmlndXJlZCB0byBhbGxvdyBTU0gyIGNvbm5lY3Rpb25zIG92ZXIgUEhQIG9yIFNGVFAgY29ubmVjdGlvbnMgb3IgUEhQLiBNb3N0IGhvc3RzIGRvIG5vdCBjdXJyZW50bHkgcHJvdmlkZSB0aGlzIGZlYXR1cmUuIEluZm9ybWF0aW9uIG9ubHk7IEJhY2t1cEJ1ZGR5IGNhbm5vdCBtYWtlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgYXQgdGhpcyB0aW1lLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCSk7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7Cgl9CgkKCQoJCgkvLyBBQlNQQVRICgkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkndGl0bGUnCQkJPT4JCSdXb3JkUHJlc3MgQUJTUEFUSCcsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCQkndmFsdWUnCQkJPT4JCSc8c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXgtd2lkdGg6IDI1MHB4OyI+JyAuIEFCU1BBVEggLiAnPC9zcGFuPicsCgkJCQkJJ3RpcCcJCQk9PgkJX18oICdUaGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hpY2ggV29yZFByZXNzIHJlcG9ydHMgdG8gQmFja3VwQnVkZHkgaXQgaXMgaW5zdGFsbGVkIGluLicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCWlmICggISBAZmlsZV9leGlzdHMoIEFCU1BBVEggKSApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIE9TCgkkcGhwX3VuYW1lID0gJyc7CglpZiAoIGlzX2NhbGxhYmxlKCAncGhwX3VuYW1lJyApICkgewoJCSRwaHBfdW5hbWUgPSAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1heC13aWR0aDogMjUwcHg7IGZvbnQtc2l6ZTogOHB4OyI+KCcgLiBAcGhwX3VuYW1lKCkgLiAnKTwvc3Bhbj4nOwoJfQoJJHBhcmVudF9jbGFzc190ZXN0ID0gYXJyYXkoCgkJCQkJJ3RpdGxlJwkJCT0+CQknT3BlcmF0aW5nIFN5c3RlbScsCgkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknTGludXgnLAoJCQkJCSd2YWx1ZScJCQk9PgkJUEhQX09TIC4gJHBocF91bmFtZSwKCQkJCQkndGlwJwkJCT0+CQlfXygnVGhlIHNlcnZlciBvcGVyYXRpbmcgc3lzdGVtIHJ1bm5pbmcgdGhpcyBzaXRlLiBMaW51eCBiYXNlZCBzeXN0ZW1zIGFyZSBlbmNvdXJhZ2VkLiBXaW5kb3dzIHVzZXJzIG1heSBuZWVkIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBzdGVwcyB0byBnZXQgcGx1Z2lucyB0byBwZXJmb3JtIHByb3Blcmx5LicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJKTsKCWlmICggc3Vic3RyKCBQSFBfT1MsIDAsIDMgKSA9PSAnV0lOJyApIHsKCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCX0gZWxzZSB7CgkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJfQoJYXJyYXlfcHVzaCggJHRlc3RzLCAkcGFyZW50X2NsYXNzX3Rlc3QgKTsKCQoJCgkKCS8vIEFjdGl2ZSBwbHVnaW5zIGxpc3QuCglpZiAoICFkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgkJLy8gQWN0aXZlIFBsdWdpbnMKCQkkc3VjY2VzcyA9IHRydWU7CgkJJGFjdGl2ZV9wbHVnaW5zID0gc2VyaWFsaXplKCBnZXRfb3B0aW9uKCAnYWN0aXZlX3BsdWdpbnMnICkgKTsKCQkkZm91bmRfcGx1Z2lucyA9IGFycmF5KCk7CgkJZm9yZWFjaCggYmFja3VwYnVkZHlfY29yZTo6JHdhcm5fcGx1Z2lucyBhcyAkd2Fybl9wbHVnaW4gPT4gJHdhcm5fcGx1Z2luX3RpdGxlICkgewoJCQlpZiAoIEZBTFNFICE9PSBzdHJwb3MoICRhY3RpdmVfcGx1Z2lucywgJHdhcm5fcGx1Z2luICkgKSB7IC8vIFBsdWdpbiBhY3RpdmUuCgkJCQkkZm91bmRfcGx1Z2luc1tdID0gJHdhcm5fcGx1Z2luX3RpdGxlOwoJCQkJJHN1Y2Nlc3MgPSBmYWxzZTsKCQkJfQoJCX0KCQkkcGFyZW50X2NsYXNzX3Rlc3QgPSBhcnJheSgKCQkJCQkJJ3RpdGxlJwkJCT0+CQknQWN0aXZlIFdvcmRQcmVzcyBQbHVnaW5zJywKCQkJCQkJJ3N1Z2dlc3Rpb24nCT0+CQknbi9hJywKCQkJCQkJJ3ZhbHVlJwkJCT0+CQknPHRleHRhcmVhIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWF4LWhlaWdodDogMjAwcHg7IiBkaXNhYmxlZD0iZGlzYWJsZWQiPicgLiBpbXBsb2RlKCAnLCAnLCB1bnNlcmlhbGl6ZSggJGFjdGl2ZV9wbHVnaW5zICkgKSAuICc8L3RleHRhcmVhPicsCgkJCQkJCSd0aXAnCQkJPT4JCV9fKCAnUGx1Z2lucyBjdXJyZW50bHkgYWN0aXZhdGVkIGZvciB0aGlzIHNpdGUuIEEgd2FybmluZyBkb2VzIG5vdCBndWFyZW50ZWUgcHJvYmxlbXMgd2l0aCBhIHBsdWdpbiBidXQgaW5kaWNhdGVzIHRoYXQgYSBwbHVnaW4gaXMgYWN0aXZhdGVkIHRoYXQgYXQgb25lIHBvaW50IG1heSBoYXZlIGNhdXNlZCBvcGVyYXRpb25hbCBpc3N1ZXMuICBQbHVnaW4gY29uZmxpY3RzIGNhbiBiZSBzcGVjaWZpYyBhbmQgbWF5IG9ubHkgb2NjdXIgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzIHN1Y2ggYXMgY2VydGFpbiBwbHVnaW4gdmVyc2lvbnMsIHBsdWdpbiBjb25maWd1cmF0aW9ucywgYW5kIHNlcnZlciBzZXR0aW5ncy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkpOwoJCWlmICggZmFsc2UgPT09ICRzdWNjZXNzICkgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ1dBUk5JTkcnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKCQl9IGVsc2UgewoJCQkkcGFyZW50X2NsYXNzX3Rlc3RbJ3N0YXR1cyddID0gX18oJ09LJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJfQoJCWFycmF5X3B1c2goICR0ZXN0cywgJHBhcmVudF9jbGFzc190ZXN0ICk7Cgl9CgkKCQoJCgkvLyBQSFAgUHJvY2VzcyB1c2VyL2dyb3VwLgoJaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJCSRzdWNjZXNzID0gdHJ1ZTsKCQkkcGhwX3VzZXIgPSAnPGk+JyAuIF9fKCAnVW5rbm93bicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvaT4nOwoJCSRwaHBfdWlkID0gJzxpPicgLiBfXyggJ1Vua25vd24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2k+JzsKCQkkcGhwX2dpZCA9ICc8aT4nIC4gX18oICdVbmtub3duJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9pPic7CgkJCgkJaWYgKCBpc19jYWxsYWJsZSggJ3Bvc2l4X2dldGV1aWQnICkgJiYgKCBmYWxzZSA9PT0gaW5fYXJyYXkoICdwb3NpeF9nZXRldWlkJywgJGRpc2FibGVkX2Z1bmN0aW9uc19hcnJheSApICkgKSB7CgkJCSRwaHBfdWlkID0gQHBvc2l4X2dldGV1aWQoKTsKCQkJaWYgKCBpc19jYWxsYWJsZSggJ3Bvc2l4X2dldHB3dWlkJyApICYmICggZmFsc2UgPT09IGluX2FycmF5KCAncG9zaXhfZ2V0cHd1aWQnLCAkZGlzYWJsZWRfZnVuY3Rpb25zX2FycmF5ICkgKSApIHsKCQkJCSRwaHBfdXNlciA9IEBwb3NpeF9nZXRwd3VpZCggJHBocF91aWQgKTsKCQkJCSRwaHBfdXNlciA9ICRwaHBfdXNlclsnbmFtZSddOwoJCQl9CgkJfQoJCWlmICggaXNfY2FsbGFibGUoICdwb3NpeF9nZXRlZ2lkJyApICYmICggZmFsc2UgPT09IGluX2FycmF5KCAncG9zaXhfZ2V0ZWdpZCcsICRkaXNhYmxlZF9mdW5jdGlvbnNfYXJyYXkgKSApICkgewoJCQkkcGhwX2dpZCA9IEBwb3NpeF9nZXRlZ2lkKCk7CgkJfQoJCSRwYXJlbnRfY2xhc3NfdGVzdCA9IGFycmF5KAoJCQkJCQkndGl0bGUnCQkJPT4JCSdQSFAgUHJvY2VzcyBVc2VyIChVSUQ6R0lEKScsCgkJCQkJCSdzdWdnZXN0aW9uJwk9PgkJJ24vYScsCgkJCQkJCSd2YWx1ZScJCQk9PgkJJHBocF91c2VyIC4gJyAoJyAuICRwaHBfdWlkIC4gJzonIC4gJHBocF9naWQgLiAnKScsCgkJCQkJCSd0aXAnCQkJPT4JCV9fKCAnQ3VycmVudCB1c2VyLCB1c2VyIElELCBhbmQgZ3JvdXAgSUQgdW5kZXIgd2hpY2ggdGhpcyBQSFAgcHJvY2VzcyBpcyBydW5uaW5nLiBUaGlzIHVzZXIgbXVzdCBoYXZlIHByb3BlciBhY2Nlc3MgdG8geW91ciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuIElmIHRoZSBQSFAgdXNlciBpcyBub3QgeW91ciBvd24gdGhlbiBzZXR0aW5nIHVwIGEgc3lzdGVtIHN1Y2ggYXMgc3VwaHAgaXMgZW5jb3VyYWdlZCB0byBlbnN1cmUgcHJvcGVyIGFjY2VzcyBhbmQgc2VjdXJpdHkuJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQkJKTsKCQlpZiAoIGZhbHNlID09PSAkc3VjY2VzcyApIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdXQVJOSU5HJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICk7CgkJfSBlbHNlIHsKCQkJJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9IF9fKCdPSycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOwoJCX0KCQlhcnJheV9wdXNoKCAkdGVzdHMsICRwYXJlbnRfY2xhc3NfdGVzdCApOwoJfQoJCgkKCQo/PgoKCgo8dGFibGUgY2xhc3M9IndpZGVmYXQiPgoJPHRoZWFkPgoJCTx0ciBjbGFzcz0idGhlYWQiPgoJCQk8dGggc3R5bGU9IndpZHRoOiAxNXB4OyI+Jm5ic3A7PC90aD4KCQkJPD9waHAKCQkJCWVjaG8gJzx0aD4nLCBfXygnU2VydmVyIENvbmZpZ3VyYXRpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnU3VnZ2VzdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoPicsIF9fKCdWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAvLyc8dGg+JywgX18oJ1Jlc3VsdCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCAnPC90aD4nLAoJCQkJCSAnPHRoIHN0eWxlPSJ3aWR0aDogNjBweDsiPicsIF9fKCdTdGF0dXMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JzsKCQkJPz4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Zm9vdD4KCQk8dHIgY2xhc3M9InRoZWFkIj4KCQkJPHRoIHN0eWxlPSJ3aWR0aDogMTVweDsiPiZuYnNwOzwvdGg+CgkJCTw/cGhwCgkJCQllY2hvICc8dGg+JywgX18oJ1NlcnZlciBDb25maWd1cmF0aW9uJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPicsCgkJCQkJICc8dGg+JywgX18oJ1N1Z2dlc3Rpb24nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aD4nLCBfXygnVmFsdWUnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgLy8nPHRoPicsIF9fKCdSZXN1bHQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwgJzwvdGg+JywKCQkJCQkgJzx0aCBzdHlsZT0id2lkdGg6IDE1cHg7Ij4nLCBfXygnU3RhdHVzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc8L3RoPic7CgkJCT8+CgkJPC90cj4KCTwvdGZvb3Q+Cgk8dGJvZHk+CgkJPD9waHAKCQlmb3JlYWNoKCAkdGVzdHMgYXMgJHBhcmVudF9jbGFzc190ZXN0ICkgewoJCQllY2hvICc8dHIgY2xhc3M9ImVudHJ5LXJvdyBhbHRlcm5hdGUiPic7CgkJCWVjaG8gJwk8dGQ+JyAuIHBiX2JhY2t1cGJ1ZGR5Ojp0aXAoICRwYXJlbnRfY2xhc3NfdGVzdFsndGlwJ10sICcnLCBmYWxzZSApIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nIC4gJHBhcmVudF9jbGFzc190ZXN0Wyd0aXRsZSddIC4gJzwvdGQ+JzsKCQkJZWNobyAnCTx0ZD4nIC4gJHBhcmVudF9jbGFzc190ZXN0WydzdWdnZXN0aW9uJ10gLiAnPC90ZD4nOwoJCQllY2hvICcJPHRkPicgLiAkcGFyZW50X2NsYXNzX3Rlc3RbJ3ZhbHVlJ10gLiAnPC90ZD4nOwoJCQkvL2VjaG8gJwk8dGQ+JyAuICRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gLiAnPC90ZD4nOwoJCQllY2hvICcJPHRkPic7CgkJCWlmICggJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9PSBfXygnT0snLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApIHsKCQkJCWVjaG8gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1zdWNjZXNzIj5QYXNzPC9zcGFuPic7CgkJCQkvL2VjaG8gJzxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICMyMkVFNUI7IGJvcmRlcjogMXB4IHNvbGlkICNFMkUyRTI7Ij4mbmJzcDsmbmJzcDsmbmJzcDs8L2Rpdj4nOwoJCQl9IGVsc2VpZiAoICRwYXJlbnRfY2xhc3NfdGVzdFsnc3RhdHVzJ10gPT0gX18oJ0ZBSUwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSApIHsKCQkJCWVjaG8gJzxzcGFuIGNsYXNzPSJwYl9sYWJlbCBwYl9sYWJlbC1pbXBvcnRhbnQiPkZhaWw8L3NwYW4+JzsKCQkJCS8vZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0NGMzMzMzsgYm9yZGVyOiAxcHggc29saWQgI0UyRTJFMjsiPiZuYnNwOyZuYnNwOyZuYnNwOzwvZGl2Pic7CgkJCX0gZWxzZWlmICggJHBhcmVudF9jbGFzc190ZXN0WydzdGF0dXMnXSA9PSBfXygnV0FSTklORycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApICkgewoJCQkJZWNobyAnPHNwYW4gY2xhc3M9InBiX2xhYmVsIHBiX2xhYmVsLXdhcm5pbmciPldhcm5pbmc8L3NwYW4+JzsKCQkJCS8vZWNobyAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZFRkY3RjsgYm9yZGVyOiAxcHggc29saWQgI0UyRTJFMjsiPiZuYnNwOyZuYnNwOyZuYnNwOzwvZGl2Pic7CgkJCX0KCQkJZWNobyAnCTwvdGQ+JzsKCQkJZWNobyAnPC90cj4nOwoJCX0KCQk/PgoJPC90Ym9keT4KPC90YWJsZT4KPD9waHAKaWYgKCBpc3NldCggJF9HRVRbJ3BocGluZm8nXSApICYmICRfR0VUWydwaHBpbmZvJ10gPT0gJ3RydWUnICkgewoJaWYgKCBkZWZpbmVkKCAnUEJfREVNT19NT0RFJyApICkgewoJCXBiX2JhY2t1cGJ1ZGR5OjphbGVydCggJ0FjY2VzcyBkZW5pZWQgaW4gZGVtbyBtb2RlLicsIHRydWUgKTsKCX0gZWxzZSB7CgkJZWNobyAnPGJyPjxoMz5waHBpbmZvKCkgJywgX18oJ1Jlc3BvbnNlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksICc6PC9oMz4nOwoJCQoJCWVjaG8gJzxkaXYgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDYwMHB4OyBwYWRkaW5nLXRvcDogMTBweDsgcGFkZGluZy1ib3R0b206IDEwcHg7IG92ZXJmbG93OiBzY3JvbGw7ICI+JzsKCQlvYl9zdGFydCgpOwoJCQoJCXBocGluZm8oKTsKCQkKCQkkaW5mbyA9IG9iX2dldF9jb250ZW50cygpOwoJCW9iX2VuZF9jbGVhbigpOwoJCSRpbmZvID0gcHJlZ19yZXBsYWNlKCclXi4qPGJvZHk+KC4qKTwvYm9keT4uKiQlbXMnLCAnJDEnLCAkaW5mbyk7CgkJZWNobyAkaW5mbzsKCQl1bnNldCggJGluZm8gKTsKCQkKCQllY2hvICc8L2Rpdj4nOwoJfQp9IGVsc2UgewoJZWNobyAnPGJyPic7CgllY2hvICc8Y2VudGVyPic7CgkKCWlmICggIWRlZmluZWQoICdQQl9JTVBPUlRCVUREWScgKSApIHsKCQllY2hvICc8YSBocmVmPSIjVEJfaW5saW5lP3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAmIzAzODtpbmxpbmVJZD1wYl9zZXJ2ZXJpbmZvdGV4dF9tb2RhbCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGJ1dHRvbi10ZXJ0aWFyeSB0aGlja2JveCIgdGl0bGU9IlNlcnZlciBJbmZvcm1hdGlvbiBSZXN1bHRzIj5EaXNwbGF5IFNlcnZlciBDb25maWd1cmF0aW9uIGluIFRleHQgRm9ybWF0PC9hPiAmbmJzcDsmbmJzcDsmbmJzcDsgJzsKCQllY2hvICc8YSBocmVmPSInIC4gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAncGhwaW5mbycgKSAuICcmIzAzODtUQl9pZnJhbWU9MSYjMDM4O3dpZHRoPTY0MCYjMDM4O2hlaWdodD02MDAiIGNsYXNzPSJ0aGlja2JveCBidXR0b24gc2Vjb25kYXJ5LWJ1dHRvbiIgdGl0bGU9IicgLiBfXygnRGlzcGxheSBFeHRlbmRlZCBQSFAgU2V0dGluZ3MgdmlhIHBocGluZm8oKScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJyI+JyAuIF9fKCdEaXNwbGF5IEV4dGVuZGVkIFBIUCBTZXR0aW5ncyB2aWEgcGhwaW5mbygpJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgLiAnPC9hPic7Cgl9IGVsc2UgewoJCWVjaG8gJzxhIGlkPSJzZXJ2ZXJpbmZvdGV4dCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tc2Vjb25kYXJ5IGJ1dHRvbi10ZXJ0aWFyeSBidXR0b24tcHJpbWFyeSB0aGlja2JveCB0b2dnbGUiIHRpdGxlPSJTZXJ2ZXIgSW5mb3JtYXRpb24gUmVzdWx0cyI+RGlzcGxheSBSZXN1bHRzIGluIFRleHQgRm9ybWF0PC9hPiAmbmJzcDsmbmJzcDsmbmJzcDsgJzsKCX0KCWVjaG8gJzwvY2VudGVyPic7CgkKCS8qCgllY2hvICc8cHJlPic7CglwcmludF9yKCBpbmlfZ2V0X2FsbCgpICk7CgllY2hvICc8L3ByZT4nOwoJKi8KfQo/Pjxicj4KCgoKPGRpdgo8P3BocAppZiAoICFkZWZpbmVkKCAnUEJfSU1QT1JUQlVERFknICkgKSB7CgllY2hvICdpZD0icGJfc2VydmVyaW5mb3RleHRfbW9kYWwiJzsKfSBlbHNlIHsKCWVjaG8gJ2lkPSJ0b2dnbGUtc2VydmVyaW5mb3RleHQiJzsKfQo/PiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgoJCTw/cGhwCgkJaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgewoJCQllY2hvICc8aDM+JyAuIF9fKCAnU2VydmVyIEluZm9ybWF0aW9uIFJlc3VsdHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2gzPic7CgkJCWVjaG8gJzx0ZXh0YXJlYSBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMzAwcHg7IiB3cmFwPSJvZmYiPic7CgkJfSBlbHNlIHsKCQkJZWNobyAnPHRleHRhcmVhIHN0eWxlPSJ3aWR0aDogOTUlOyBoZWlnaHQ6IDMwMHB4OyIgd3JhcD0ib2ZmIj4nOwoJCX0KCQlmb3JlYWNoKCAkdGVzdHMgYXMgJHRlc3QgKSB7CgkJCWVjaG8gJ1snIC4gJHRlc3RbJ3N0YXR1cyddIC4gJ10gICAgICcgLiAkdGVzdFsndGl0bGUnXSAuICcgICA9ICAgJyAuIHN0cmlwX3RhZ3MoICR0ZXN0Wyd2YWx1ZSddICkgLiAiXG4iOyAKCQl9CgkJPz48L3RleHRhcmVhPgo8L2Rpdj4K
###PACKDATA,FILE_END,/controllers/pages/server_info/server.php,importbuddy/controllers/pages/server_info/server.php
###PACKDATA,FILE_START,/controllers/pages/server_info/site_size.php,importbuddy/controllers/pages/server_info/site_size.php
PD9waHAKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnaWNpY2xlLmpzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zY3JpcHQoICdpY2ljbGVfc2V0dXAuanMnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3N0eWxlKCAnaml0X2Jhc2UuY3NzJyApOwpwYl9iYWNrdXBidWRkeTo6bG9hZF9zdHlsZSggJ2ppdF9pY2ljbGUuY3NzJyApOwo/Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewoJCWpRdWVyeSgnI3BiX2ljaWNsZWxhdW5jaCcpLmNsaWNrKGZ1bmN0aW9uKGUpIHsKCQkJalF1ZXJ5KCcjcGJfaW5mb3Zpc19jb250YWluZXInKS5zbGlkZVRvZ2dsZSgpOwoJCQlqUXVlcnkucG9zdCggJzw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OmFqYXhfdXJsKCAnaWNpY2xlJyApOyA/PicsIAoJCQkJZnVuY3Rpb24oIGRhdGEgKSB7CgkJCQkJalF1ZXJ5KCcjaW5mb3ZpcycpLmh0bWwoJycpOwoJCQkJCWljaWNsZV9pbml0KCBkYXRhICk7CgkJCQl9CgkJCSk7CgkJfSk7CgkJCgkJalF1ZXJ5KCAnLnBiX2JhY2t1cGJ1ZGR5X3NpdGVfc2l6ZV9saXN0aW5nX2J1dHRvbicgKS5jbGljayggZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19pbnRybyA+IC5wYl9iYWNrdXBidWRkeV9sb2FkaW5nJyApLnNob3coKTsKCQkJalF1ZXJ5LnBvc3QoICc8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjphamF4X3VybCggJ3NpdGVfc2l6ZV9saXN0aW5nJyApOyA/PiZwcm9maWxlPScgKyBqUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfZmlsZWxpc3Rpbmdwcm9maWxlJyApLnZhbCgpLCAKCQkJCWZ1bmN0aW9uKCBkYXRhICkgewoJCQkJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19jb250ZW50JyApLmh0bWwoIGRhdGEgKTsKCQkJCQlqUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfc2l0ZV9zaXplX2xpc3RpbmdfaW50cm8gPiAucGJfYmFja3VwYnVkZHlfbG9hZGluZycgKS5oaWRlKCk7CgkJCQkJLy9qUXVlcnkoICcjcGJfYmFja3VwYnVkZHlfc2l0ZV9zaXplX2xpc3RpbmdfaW50cm8nICkuc2xpZGVVcCgpOwoJCQkJCWpRdWVyeSggJyNwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19jb250ZW50JyApLnNsaWRlRG93bigpOwoJCQkJfQoJCQkpOwoJCQlqUXVlcnkoICdwYl9iYWNrdXBidWRkeV9sb2FkaW5nJyApLmhpZGUoKTsKCQl9ICk7CgkJCgl9KTsKPC9zY3JpcHQ+CgoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCSNwYl9iYWNrdXBidWRkeV9zZXJ2ZXJpbmZvX2V4Y2x1c2lvbnM6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKCQktd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CgkJd2lkdGg6IDExcHg7CgkJaGVpZ2h0OiAxMXB4OwoJfQoJCgkKCSNwYl9iYWNrdXBidWRkeV9zZXJ2ZXJpbmZvX2V4Y2x1c2lvbnM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKCQlib3JkZXItcmFkaXVzOiA4cHg7CgkJYm9yZGVyOiAycHggc29saWQgd2hpdGU7IC8qIHNob3VsZCBtYXRjaCBiYWNrZ3JvdW5kLCBjYW4ndCBiZSB0cmFuc3BhcmVudCAqLwoJCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjUpOwoJfeKAiwo8L3N0eWxlPgoKCgo8P3BocAplY2hvICc8ZGl2IGNsYXNzPSJwYl9odGl0bGUiPicgLiBfXygnRGlyZWN0b3J5IFNpemUgTGlzdGluZycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApIC4gJzwvZGl2Pjxicj4nOwplY2hvICc8YSBuYW1lPSJwYl9iYWNrdXBidWRkeV9kaXJfc2l6ZV9saXN0aW5nIj4mbmJzcDs8L2E+JzsKCmVjaG8gJzxkaXYgaWQ9InBiX2JhY2t1cGJ1ZGR5X3NpdGVfc2l6ZV9saXN0aW5nX2ludHJvIj4nOwplY2hvIF9fKCdUaGlzIG9wdGlvbiBkaXNwbGF5cyBhIGNvbXByZWhlbnNpdmUgbGlzdGluZyBvZiBkaXJlY3RvcmllcyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2l6ZSBvZiBhbGwgY29udGVudHMgd2l0aGluLCBpbmNsdWRpbmcgc3ViZGlyZWN0b3JpZXMuICBUaGlzIGlzIHVzZWZ1bCBmb3IgZmluZGluZyB3aGVyZSBzcGFjZSBpcyBiZWluZyB1c2VkLiBOb3RlIHRoYXQgdGhpcyBpcyBhIENQVSBpbnRlbnNpdmUgcHJvY2VzcyBhbmQgbWF5IHRha2UgYSB3aGlsZSB0byBsb2FkIGFuZCBldmVuIHRpbWUgb3V0IG9uIHNvbWUgc2VydmVycy4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKZWNobyAnPGJyIC8+PGJyIC8+JzsKCgplY2hvICdCYWNrdXAgcHJvZmlsZSBmb3IgY2FsY3VsYXRpbmcgZXhjbHVzaW9uczogJzsKZWNobyAnPHNlbGVjdCBpZD0icGJfYmFja3VwYnVkZHlfZmlsZWxpc3Rpbmdwcm9maWxlIj4nOwpmb3JlYWNoKCBwYl9iYWNrdXBidWRkeTo6JG9wdGlvbnNbJ3Byb2ZpbGVzJ10gYXMgJHRoaXNfcHJvZmlsZV9pZCA9PiAkcHJvZmlsZSApIHsKCT8+Cgk8b3B0aW9uIHZhbHVlPSI8P3BocCBlY2hvICR0aGlzX3Byb2ZpbGVfaWQ7ID8+IiA8P3BocCBpZiAoICRwcm9maWxlX2lkID09ICR0aGlzX3Byb2ZpbGVfaWQgKSB7IGVjaG8gJ3NlbGVjdGVkJzsgfSA/Pj48P3BocCBlY2hvIGh0bWxlbnRpdGllcyggJHByb2ZpbGVbJ3RpdGxlJ10gKTsgPz4gKDw/cGhwIGVjaG8gJHByb2ZpbGVbJ3R5cGUnXTsgPz4pPC9hPgoJPD9waHAKfQplY2hvICc8L3NlbGVjdD4nOwoKCmVjaG8gJyZuYnNwOyZuYnNwOyZuYnNwOzxhIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9zaXRlX3NpemVfbGlzdGluZ19idXR0b24gYnV0dG9uIGJ1dHRvbi1wcmltYXJ5IiBzdHlsZT0ibWFyZ2luLXRvcDogM3B4OyI+JywgX18oJ0Rpc3BsYXkgRGlyZWN0b3J5IFNpemUgTGlzdGluZycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLCc8L2E+ICc7CmVjaG8gJzxzcGFuIGNsYXNzPSJwYl9iYWNrdXBidWRkeV9sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IDEwcHg7Ij48aW1nIHNyYz0iJyAuIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCkgLiAnL2ltYWdlcy9sb2FkaW5nLmdpZiIgYWx0PSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHRpdGxlPSInIC4gX18oJ0xvYWRpbmcuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAtM3B4OyIgLz48L3NwYW4+JzsKZWNobyAnPC9kaXY+PGJyPic7CmVjaG8gJzxkaXYgaWQ9InBiX2JhY2t1cGJ1ZGR5X3NpdGVfc2l6ZV9saXN0aW5nX2NvbnRlbnQiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+PC9kaXY+JzsKZWNobyAnPGJyPjxicj4nOwo/PgoKCgo8P3BocCBlY2hvICc8ZGl2IGNsYXNzPSJwYl9odGl0bGUiPicgLiBfXyggJ0ludGVyYWN0aXZlIEdyYXBoaWNhbCBEaXJlY3RvcnkgU2l6ZSBNYXAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2Rpdj48YnI+Jzs/Pgo8P3BocCBfZSgnVGhpcyBvcHRpb24gZGlzcGxheXMgYW4gaW50ZXJhY3RpdmUgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGRpcmVjdG9yaWVzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzaXplIG9mIGFsbCBjb250ZW50cyB3aXRoaW4sIGluY2x1ZGluZyBzdWJkaXJlY3Rvcmllcy4KVGhpcyBpcyB1c2VmdWwgZm9yIGZpbmRpbmcgd2hlcmUgc3BhY2UgaXMgYmVpbmcgdXNlZC4gRGlyZWN0b3J5IGJveGVzIGFyZSBzY2FsZWQgYmFzZWQgb24gc2l6ZS4gQ2xpY2sgb24gYSBkaXJlY3RvcnkgYm94IHRvIG1vdmUgYXJvdW5kLiBOb3RlIHRoYXQgdGhpcwppcyBhIENQVSBpbnRlbnNpdmUgcHJvY2VzcyBhbmQgbWF5IHRha2UgYSB3aGlsZSB0byBsb2FkIGFuZCBldmVuIHRpbWUgb3V0IG9uIHNvbWUgc2VydmVycy4gU2xvd2VyIGNvbXB1dGVycyBtYXkgaGF2ZSB0cm91YmxlIG5hdmlnYXRpbmcgdGhlIGludGVyYWN0aXZlIG1hcC4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTsKPz4KPHA+PGEgaWQ9InBiX2ljaWNsZWxhdW5jaCIgY2xhc3M9ImJ1dHRvbiBidXR0b24tcHJpbWFyeSIgc3R5bGU9Im1hcmdpbi10b3A6IDNweDsiPjw/cGhwIF9lKCdEaXNwbGF5IEludGVyYWN0aXZlIEdyYXBoaWNhbCBEaXJlY3RvcnkgU2l6ZSBNYXAnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTs/PjwvYT48L3A+CgoKPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ijw/cGhwIGVjaG8gcGJfYmFja3VwYnVkZHk6OnBsdWdpbl91cmwoKTsgPz4vY3NzL2ppdF9iYXNlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgo8bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPD9waHAgZWNobyBwYl9iYWNrdXBidWRkeTo6cGx1Z2luX3VybCgpOyA/Pi9jc3Mvaml0X2ljaWNsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KCgo8ZGl2IHN0eWxlPSJkaXNwbGF5OiBub25lOyIgaWQ9InBiX2luZm92aXNfY29udGFpbmVyIj4KCTxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICMxQTFBMUE7Ij4KCQk8ZGl2IGlkPSJpbmZvdmlzIj4KCQkJPGJyIC8+PGJyIC8+CgkJCTxkaXYgc3R5bGU9Im1hcmdpbjogMzBweDsiPgoJCQkJPGg0IHN0eWxlPSJjb2xvcjogI0ZGRkZGRjsiPjxpbWcgc3JjPSI8P3BocCBlY2hvIHBiX2JhY2t1cGJ1ZGR5OjpwbHVnaW5fdXJsKCk7ID8+L2ltYWdlcy9sb2FkaW5nX2xhcmdlX2RhcmtiZy5naWYiIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogLTlweDsiIC8+IDw/cGhwIF9lKCdMb2FkaW5nIC4uLiBQbGVhc2Ugd2FpdCAuLi4nLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTs/PjwvaDQ+CgkJCTwvZGl2PgoJCTwvZGl2PgoJPC9kaXY+CgkKCTxsYWJlbCBmb3I9InMtb3JpZW50YXRpb24iPjw/cGhwIF9lKCdPcmllbnRhdGlvbicsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOz8+OiA8L2xhYmVsPgoJPHNlbGVjdCBuYW1lPSJzLW9yaWVudGF0aW9uIiBpZD0icy1vcmllbnRhdGlvbiI+CgkJPG9wdGlvbiB2YWx1ZT0iaCIgc2VsZWN0ZWQ+PD9waHAgX2UoJ2hvcml6b250YWwnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTs/Pjwvb3B0aW9uPgoJCTxvcHRpb24gdmFsdWU9InYiPjw/cGhwIF9lKCd2ZXJ0aWNhbCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOz8+PC9vcHRpb24+Cgk8L3NlbGVjdD4KCQoJPGxhYmVsIGZvcj0iaS1sZXZlbHMtdG8tc2hvdyI+PD9waHAgX2UoJ01heCBsZXZlbHMnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKTs/PjogPC9sYWJlbD4KCTxzZWxlY3QgIGlkPSJpLWxldmVscy10by1zaG93IiBuYW1lPSJpLWxldmVscy10by1zaG93IiBzdHlsZT0id2lkdGg6IDUwcHgiPgoJCTxvcHRpb24+YWxsPC9vcHRpb24+CgkJPG9wdGlvbj4xPC9vcHRpb24+CgkJPG9wdGlvbj4yPC9vcHRpb24+CgkJPG9wdGlvbiBzZWxlY3RlZD0ic2VsZWN0ZWQiPjM8L29wdGlvbj4KCQk8b3B0aW9uPjQ8L29wdGlvbj4KCQk8b3B0aW9uPjU8L29wdGlvbj4KCTwvc2VsZWN0PgoKCTxhIGlkPSJ1cGRhdGUiIGNsYXNzPSJ0aGVtZSBidXR0b24gd2hpdGUiPjw/cGhwIF9lKCdHbyBVcCcsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApOz8+PC9hPgo8L2Rpdj4KPGJyPjxicj4KCgo8P3BocAokZGlyX2FycmF5ID0gYXJyYXkoKTsKJGljaWNsZV9hcnJheSA9IGFycmF5KCk7CiR0aW1lX3N0YXJ0ID0gbWljcm90aW1lKHRydWUpOwoKLy9lY2hvICc8cHJlPicgLiAkdGhpcy0+YnVpbGRfaWNpY2xlKCBBQlNQQVRILCBBQlNQQVRILCAnJyApIC4gJzwvcHJlPic7CgoKCgoKCgoKCgoKCj8+Cg==
###PACKDATA,FILE_END,/controllers/pages/server_info/site_size.php,importbuddy/controllers/pages/server_info/site_size.php
###PACKDATA,FILE_START,/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php
PD9waHAKLy8gVHV0b3JpYWwKcGJfYmFja3VwYnVkZHk6OmxvYWRfc2NyaXB0KCAnanF1ZXJ5LmpveXJpZGUtMi4wLjMuanMnICk7CnBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ21vZGVybml6ci5tcS5qcycgKTsKcGJfYmFja3VwYnVkZHk6OmxvYWRfc3R5bGUoICdqb3lyaWRlLmNzcycgKTsKCgoKaWYgKCAhZGVmaW5lZCggJ1BCX0lNUE9SVEJVRERZJyApICkgeyAvLyBOT1QgSU4gSU1QT1JUQlVERFk6Cgl3cF9lbnF1ZXVlX3NjcmlwdCggJ3RoaWNrYm94JyApOwoJd3BfcHJpbnRfc2NyaXB0cyggJ3RoaWNrYm94JyApOwoJd3BfcHJpbnRfc3R5bGVzKCAndGhpY2tib3gnICk7Cgk/PgoJPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCSNiYWNrdXBidWRkeS1tZXRhLWxpbmstd3JhcCBhLnNob3ctc2V0dGluZ3MgewoJCWZsb2F0OiByaWdodDsKCQltYXJnaW46IDAgMCAwIDZweDsKCX0KCSNzY3JlZW4tbWV0YS1saW5rcyAjYmFja3VwYnVkZHktbWV0YS1saW5rLXdyYXAgYSB7CgkJYmFja2dyb3VuZDogbm9uZTsKCX0KCSNzY3JlZW4tbWV0YS1saW5rcyAjYmFja3VwYnVkZHktbWV0YS1saW5rLXdyYXAgYTphZnRlciB7CgkJY29udGVudDogJyc7CgkJbWFyZ2luLXJpZ2h0OiA1cHg7Cgl9Cgk8L3N0eWxlPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeSggZnVuY3Rpb24oKSB7CgkJalF1ZXJ5KCcjc2NyZWVuLW1ldGEtbGlua3MnKS5hcHBlbmQoCgkJCSc8ZGl2IGlkPSJiYWNrdXBidWRkeS1tZXRhLWxpbmstd3JhcCIgY2xhc3M9ImhpZGUtaWYtbm8tanMgc2NyZWVuLW1ldGEtdG9nZ2xlIj4nICsKCQkJCSc8YSBocmVmPSIiIGNsYXNzPSJzaG93LXNldHRpbmdzIHBiX2JhY2t1cGJ1ZGR5X2JlZ2ludG91ciI+PD9waHAgX2UoICJUb3VyIFBhZ2UiLCAiaXQtbDEwbi1iYWNrdXBidWRkeSIgKTsgPz48L2E+JyArCgkJCSc8L2Rpdj4nCgkJKTsKCX0pOwoJPC9zY3JpcHQ+Cgk8b2wgaWQ9InBiX2JhY2t1cGJ1ZGR5X3RvdXIiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CgkJPGxpIGRhdGEtY2xhc3M9Im5hdi10YWItMCI+VmlldyBzZXJ2ZXIgY29uZmlndXJhdGlvbiBkZXRhaWxzLCBzZWN1cml0eSBpbmZvcm1hdGlvbiwgc2VydmVyIHBhdGhzLCBldGMuPC9saT4KCQk8bGkgZGF0YS1jbGFzcz0ibmF2LXRhYi0xIj5WaWV3IGRhdGFiYXNlIGluZm9ybWF0aW9uIGFzIHdlbGwgYXMgdGFibGVzIGV4Y2x1ZGVkIGZyb20gYmFja3Vwcy48L2xpPgoJCTxsaSBkYXRhLWNsYXNzPSJuYXYtdGFiLTIiPlZpZXcgeW91ciBzaXRlJ3MgZmlsZXMgaW4gZWl0aGVyIGEgZ3JhcGhpY2FsIGZvcm1hdCBvciBhIGxpc3RpbmcuIFRoZSBsaXN0aW5nIGFsc28gbm90ZXMgZXhjbHVzaW9ucyBmcm9tIGJhY2t1cHMuPC9saT4KCQk8bGkgZGF0YS1jbGFzcz0ibmF2LXRhYi0zIiBkYXRhLWJ1dHRvbj0iRmluaXNoIj5BZGRpdGlvbmFsIHNpdGUgdG9vbHMgZm9yIG1hbmFnaW5nIENST04gc2NoZWR1bGVzIGFuZCBkYXRhYmFzZSB0ZXh0IHNlYXJjaCAmIHJlcGxhY2UuPC9saT4KCTwvb2w+Cgk8c2NyaXB0PgoJalF1ZXJ5KHdpbmRvdykubG9hZChmdW5jdGlvbigpIHsKCQlqUXVlcnkoZG9jdW1lbnQpLm9uKCAnY2xpY2snLCAnLnBiX2JhY2t1cGJ1ZGR5X2JlZ2ludG91cicsIGZ1bmN0aW9uKGUpIHsKCQkJalF1ZXJ5KCIjcGJfYmFja3VwYnVkZHlfdG91ciIpLmpveXJpZGUoewoJCQkJdGlwTG9jYXRpb246ICd0b3AnLAoJCQl9KTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0pOwoJfSk7Cgk8L3NjcmlwdD4KCgk8P3BocAoKCXBiX2JhY2t1cGJ1ZGR5Ojpsb2FkX3NjcmlwdCggJ2FkbWluLmpzJyApOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+dGl0bGUoIF9fKCAnU2VydmVyIFRvb2xzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICkgKTsKCWJhY2t1cGJ1ZGR5X2NvcmU6OnZlcnNpb25zX2NvbmZpcm0oKTsKCQoJJGRlZmF1bHRfdGFiID0gMDsKCWlmICggaXNfbnVtZXJpYyggcGJfYmFja3VwYnVkZHk6Ol9HRVQoICd0YWInICkgKSApIHsKCQkkZGVmYXVsdF90YWIgPSBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3RhYicgKTsKCX0KCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFicygKCQknZ2V0dGluZ19zdGFydGVkJywKCQlhcnJheSgKCQkJYXJyYXkoCgkJCQkndGl0bGUnCQk9PgkJX18oICdTZXJ2ZXInLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCSdzbHVnJwkJPT4JCSdzZXJ2ZXInLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ0RhdGFiYXNlJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknZGF0YWJhc2UnLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ1NpdGUgU2l6ZSBNYXBzJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknZmlsZXMnLAoJCQkpLAoJCQlhcnJheSgKCQkJCSd0aXRsZScJCT0+CQlfXyggJ1dvcmRQcmVzcyBTY2hlZHVsZXMgKENyb24pJywgJ2l0LWwxMG4tYmFja3VwYnVkZHknICksCgkJCQknc2x1ZycJCT0+CQknY3JvbicsCgkJCSksCgkJKSwKCQknd2lkdGg6IDEwMCU7JywKCQl0cnVlLAoJCSRkZWZhdWx0X3RhYgoJKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ3NlcnZlcicgKTsKCQkKCQlyZXF1aXJlX29uY2UoICdzZXJ2ZXJfaW5mby9zZXJ2ZXIucGhwJyApOwoJCQoJCQoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL3Blcm1pc3Npb25zLnBocCcgKTsKCQkKCQkKCQkkd3BfdXBsb2FkX2RpciA9IHdwX3VwbG9hZF9kaXIoKTsKCQkkd3Bfc2V0dGluZ3MgPSBhcnJheSgpOwoJCQoJCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyWydwYXRoJ10gKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBGaWxlIFBhdGgnLCAkd3BfdXBsb2FkX2RpclsncGF0aCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsndXJsJ10gKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ1VwbG9hZCBVUkwnLCAkd3BfdXBsb2FkX2RpclsndXJsJ10sICd3cF91cGxvYWRfZGlyKCknICk7CgkJfQoJCWlmICggaXNzZXQoICR3cF91cGxvYWRfZGlyWydzdWJkaXInXSApICkgewoJCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnVXBsb2FkIFN1YmRpcmVjdG9yeScsICR3cF91cGxvYWRfZGlyWydzdWJkaXInXSwgJ3dwX3VwbG9hZF9kaXIoKScpOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZXVybCddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgQmFzZSBVUkwnLCAkd3BfdXBsb2FkX2RpclsnYmFzZXVybCddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQlpZiAoIGlzc2V0KCAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddICkgKSB7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdVcGxvYWQgQmFzZSBEaXJlY3RvcnknLCAkd3BfdXBsb2FkX2RpclsnYmFzZWRpciddLCAnd3BfdXBsb2FkX2RpcigpJyApOwoJCX0KCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnU2l0ZSBVUkwnLCBzaXRlX3VybCgpLCAnc2l0ZV91cmwoKScgKTsKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnSG9tZSBVUkwnLCBob21lX3VybCgpLCAnaG9tZV91cmwoKScgKTsKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnV29yZFByZXNzIFJvb3QgUGF0aCcsIEFCU1BBVEgsICdBQlNQQVRIJyApOwoJCQoJCS8vIE11bHRpc2l0ZSBleHRyYXM6CgkJJHdwX3NldHRpbmdzX211bHRpc2l0ZSA9IGFycmF5KCk7CgkJaWYgKCBpc19tdWx0aXNpdGUoKSApIHsKCQkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ05ldHdvcmsgU2l0ZSBVUkwnLCBuZXR3b3JrX3NpdGVfdXJsKCksICduZXR3b3JrX3NpdGVfdXJsKCknICk7CgkJCSR3cF9zZXR0aW5nc1tdID0gYXJyYXkoICdOZXR3b3JrIEhvbWUgVVJMJywgbmV0d29ya19ob21lX3VybCgpLCAnbmV0d29ya19ob21lX3VybCgpJyApOwoJCX0KCQkKCQkkd3Bfc2V0dGluZ3NbXSA9IGFycmF5KCAnQmFja3VwQnVkZHkgbG9jYWwgc3RvcmFnZScsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldEJhY2t1cERpcmVjdG9yeSgpLCAnQmFja3VwQnVkZHkgU2V0dGluZ3MnICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IHRlbXBvcmFyeSBmaWxlcycsIGJhY2t1cGJ1ZGR5X2NvcmU6OmdldFRlbXBEaXJlY3RvcnkoKSwgJ0FCU1BBVEggKyBIYXJkY29kZWQgbG9jYXRpb24nICk7CgkJJHdwX3NldHRpbmdzW10gPSBhcnJheSggJ0JhY2t1cEJ1ZGR5IGxvZ3MnLCBiYWNrdXBidWRkeV9jb3JlOjpnZXRMb2dEaXJlY3RvcnkoKSwgJ1VwbG9hZCBCYXNlICsgQmFja3VwQnVkZHknICk7CgkJCgkJLy8gRGlzcGxheSBXUCBzZXR0aW5ncy4uCgkJcGJfYmFja3VwYnVkZHk6OiR1aS0+bGlzdF90YWJsZSgKCQkJJHdwX3NldHRpbmdzLAoJCQlhcnJheSgKCQkJCSdhY3Rpb24nCQkJCQk9PglwYl9iYWNrdXBidWRkeTo6cGFnZV91cmwoKSwKCQkJCSdjb2x1bW5zJwkJCQkJPT4JYXJyYXkoCgkJCQkJCQkJCQkJCQlfXyggJ1VSTHMgJiBQYXRocycsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCQkJX18oICdWYWx1ZScsICdpdC1sMTBuLWJhY2t1cGJ1ZGR5JyApLAoJCQkJCQkJCQkJCQkJX18oICdPYnRhaW5lZCB2aWEnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSwKCQkJCQkJCQkJCQkJKSwKCQkJCSdjc3MnCQkJCQkJPT4JCSd3aWR0aDogMTAwJTsnLAoJCQkpCgkJKTsKCQkKCQkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCQoJCgkKCS8vIFRoaXMgcGFnZSBjYW4gdGFrZSBhIGJpdCB0byBydW4uCgkvLyBSdW5zIEFGVEVSIHNlcnZlciBpbmZvcm1hdGlvbiBpcyBkaXNwbGF5ZWQgc28gd2UgY2FuIHZpZXcgdGhlIGRlZmF1bHQgbGltaXRzIGZvciB0aGUgc2VydmVyLgoJcGJfYmFja3VwYnVkZHk6OnNldF9ncmVlZHlfc2NyaXB0X2xpbWl0cygpOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnZGF0YWJhc2UnICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vZGF0YWJhc2UucGhwJyApOwoJCWVjaG8gJzxicj48YnI+PGEgbmFtZT0iZGF0YWJhc2VfcmVwbGFjZSI+PC9hPic7CgkJZWNobyAnPGRpdiBjbGFzcz0icGJfaHRpdGxlIj4nIC4gJ0FkdmFuY2VkOiAnIC4gX18oICdEYXRhYmFzZSBNYXNzIFRleHQgUmVwbGFjZW1lbnQnLCAnaXQtbDEwbi1iYWNrdXBidWRkeScgKSAuICc8L2Rpdj48YnI+JzsKCQlwYl9iYWNrdXBidWRkeTo6bG9hZF92aWV3KCAnX3NlcnZlcl90b29scy1kYXRhYmFzZV9yZXBsYWNlJyApOwoJCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+ZW5kX3RhYigpOwoJCgkKCQoJcGJfYmFja3VwYnVkZHk6OiR1aS0+c3RhcnRfdGFiKCAnZmlsZXMnICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vc2l0ZV9zaXplLnBocCcgKTsKCQkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWIoKTsKCQoJCgkKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPnN0YXJ0X3RhYiggJ2Nyb24nICk7CgkJCgkJcmVxdWlyZV9vbmNlKCAnc2VydmVyX2luZm8vY3Jvbi5waHAnICk7CgkJCglwYl9iYWNrdXBidWRkeTo6JHVpLT5lbmRfdGFiKCk7CgkKCQoJZWNobyAnPGJyIHN0eWxlPSJjbGVhcjogYm90aDsiPjxicj48YnI+JzsKCXBiX2JhY2t1cGJ1ZGR5OjokdWktPmVuZF90YWJzKCk7CgkKCQoJCgkvLyBIYW5kbGVzIHRoaWNrYm94IGF1dG8tcmVzaXppbmcuIEtlZXAgYXQgYm90dG9tIG9mIHBhZ2UgdG8gYXZvaWQgaXNzdWVzLgoJaWYgKCAhd3Bfc2NyaXB0X2lzKCAnbWVkaWEtdXBsb2FkJyApICkgewoJCXdwX2VucXVldWVfc2NyaXB0KCAnbWVkaWEtdXBsb2FkJyApOwoJCXdwX3ByaW50X3NjcmlwdHMoICdtZWRpYS11cGxvYWQnICk7Cgl9CgkKfSBlbHNlIHsgLy8gSU5TSURFIElNUE9SVEJVRERZOgoJaWYgKCBwYl9iYWNrdXBidWRkeTo6X0dFVCggJ3NraXBfc2VydmVyaW5mbycgKSA9PSAnJyApIHsgLy8gR2l2ZSBhIHdvcmthcm91bmQgdG8gc2tpcCB0aGlzLgoJCXJlcXVpcmVfb25jZSggJ3NlcnZlcl9pbmZvL3NlcnZlci5waHAnICk7Cgl9IGVsc2UgewoJCWVjaG8gJ3tTa2lwcGluZyBTZXJ2ZXIgSW5mby4gc2VjdGlvbiBiYXNlZCBvbiBxdWVyeXN0cmluZy59JzsKCX0KfQo/Pg==
###PACKDATA,FILE_END,/controllers/pages/server_tools.php,importbuddy/controllers/pages/server_tools.php
###PACKDATA,FILE_START,/destinations/stash/lib/class.itx_helper.php,importbuddy/classes/class.itx_helper.php
PD9waHAKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIGNsYXNzIElUWEFQSV9IZWxwZXIKICAgIHsKICAgIAogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAKICAgICAgICBwcm90ZWN0ZWQgJGFwaWtleTsKICAgICAgICAKICAgICAgICBwcm90ZWN0ZWQgJGFwaXVybDsgICAgCiAgICAgICAgCiAgICAgICAgcHJvdGVjdGVkICRfdXNlcm5hbWU7CiAgICAgICAgcHJvdGVjdGVkICRfcGFzc3dvcmQ7CiAgICAgICAgCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIAogICAgICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYXBpa2V5LCAkYXBpdXJsLCAkdXNlcm5hbWUsICRwYXNzd29yZCkKICAgICAgICB7CiAgICAgICAgCQogICAgICAgIAkkdXNlcm5hbWUgPSBzdHJ0b2xvd2VyKCAkdXNlcm5hbWUgKTsgLy8gTm9ybWFsaXplIHVzZXJuYW1lIHRvIGxvd2VyIGNhc2UuCiAgICAgICAgCQogICAgICAgICAgICAkdGhpcy0+YXBpa2V5ID0gJGFwaWtleTsKICAgICAgICAgICAgJHRoaXMtPmFwaXVybCA9ICRhcGl1cmw7CiAgICAgICAgICAgIAogICAgICAgICAgICAkdGhpcy0+X3VzZXJuYW1lID0gJHVzZXJuYW1lOwogICAgICAgICAgICAkdGhpcy0+X3Bhc3N3b3JkID0gJHBhc3N3b3JkOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAKICAgICAgICAKICAgICAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0X2FwaV91cmwoJHJlc291cmNlLCAkcGFyYW1zID0gYXJyYXkoKSkKICAgICAgICB7CiAgICAgICAgICAgIAogICAgICAgICAgICAkcGFyYW1zWydhcGlrZXknXSA9ICR0aGlzLT5hcGlrZXk7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gc3ByaW50ZignJXMvJXM/JXMnLCAkdGhpcy0+YXBpdXJsLCAkcmVzb3VyY2UsIGh0dHBfYnVpbGRfcXVlcnkoJHBhcmFtcywgbnVsbCwgJyYnKSk7CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgCiAgICAgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGhtYWNfU0hBMSgka2V5LCAkZGF0YSwgJGJsb2Nrc2l6ZSA9IDY0KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN0cmxlbigka2V5KSA+ICRibG9ja3NpemUpICRrZXkgPSBwYWNrKCdIKicsIHNoYTEoJGtleSkpOwogICAgICAgICAgICAKICAgICAgICAgICAgJGtleSA9IHN0cl9wYWQoJGtleSwgJGJsb2Nrc2l6ZSwgY2hyKDB4MDApKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICRpcGFkID0gc3RyX3JlcGVhdChjaHIoMHgzNiksICRibG9ja3NpemUpOwogICAgICAgICAgICAKICAgICAgICAgICAgJG9wYWQgPSBzdHJfcmVwZWF0KGNocigweDVjKSwgJGJsb2Nrc2l6ZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkaG1hYyA9IHBhY2soICdIKicsIHNoYTEoICgka2V5IF4gJG9wYWQpIC4gcGFjayggJ0gqJywgc2hhMSggKCRrZXkgXiAkaXBhZCkgLiAkZGF0YSApKSApKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCRobWFjKTsKICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIAogICAgICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X3Bhc3N3b3JkX2hhc2goJHVzZXJuYW1lLCAkcGFzc3dvcmQpCiAgICAgICAgewogICAgICAgICAgICAkdXNlcm5hbWUgPSBzdHJ0b2xvd2VyKCAkdXNlcm5hbWUgKTsgLy8gTm9ybWFsaXplIHVzZXJuYW1lIHRvIGxvd2VyIGNhc2UuCiAgICAgICAgICAgIHJldHVybiBzaGExKCdpdHhhcGknLiR1c2VybmFtZS4kcGFzc3dvcmQpOwogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIAogICAgICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmb3JtYXRfc2lnbmVkX3VybCgkcmVzb3VyY2UsICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkcGFyYW1zID0gYXJyYXkoKSwgJGV4cGlyZXMgPSAwLCAkdHlwZSA9ICdHRVQnKQogICAgICAgIHsKICAgICAgICAgICAgJHVzZXJuYW1lID0gc3RydG9sb3dlciggJHVzZXJuYW1lICk7IC8vIE5vcm1hbGl6ZSB1c2VybmFtZSB0byBsb3dlciBjYXNlLgogICAgICAgICAgICAKICAgICAgICAgICAgaWYoJGV4cGlyZXMgPT0gMCkKICAgICAgICAgICAgICAgICRleHBpcmVzID0gdGltZSgpICsgNzIwOyAvLyAxMm1pbiB3aW5kb3cgZm9yIG5vdyB0byBhY2NvdW50IGZvciBzZXJ2ZXIgdGltZXMgYmVpbmcgb2ZmLgogICAgICAgICAgICAKICAgICAgICAgICAgJHNpZ25lZF9wYXJ0cyA9IGFycmF5KCdhcGlrZXknPT4kdGhpcy0+YXBpa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVlc3QnPT5zdHJ0b3VwcGVyKCR0eXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBpcmVzJz0+aW50dmFsKCRleHBpcmVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXNvdXJjZSc9PiRyZXNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJzY3JpYmVyJz0+JHVzZXJuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJz0+JHBhc3N3b3JkKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBpZihjb3VudCgkcGFyYW1zKSkKICAgICAgICAgICAgICAgIGZvcmVhY2goJHBhcmFtcyBhcyAka2V5PT4kcGFyYW0pCiAgICAgICAgICAgICAgICAgICAgJHNpZ25lZF9wYXJ0c1ska2V5XSA9ICRwYXJhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAkc2lnbmF0dXJlID0gc2VsZjo6aG1hY19TSEExKCRzaWduZWRfcGFydHNbJ3Bhc3N3b3JkJ10sIGltcGxvZGUoIlxuIiwgJHNpZ25lZF9wYXJ0cykpOwogICAgICAgICAgICAKICAgICAgICAgICAgdW5zZXQoJHNpZ25lZF9wYXJ0c1sncmVxdWVzdCddKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHVuc2V0KCRzaWduZWRfcGFydHNbJ3Jlc291cmNlJ10pOwogICAgICAgICAgICAKICAgICAgICAgICAgdW5zZXQoJHNpZ25lZF9wYXJ0c1sncGFzc3dvcmQnXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAkc2lnbmVkX3BhcnRzWydzaWduYXR1cmUnXSA9ICRzaWduYXR1cmU7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZvcm1hdF9hcGlfdXJsKCRyZXNvdXJjZSwgJHNpZ25lZF9wYXJ0cyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3VwbG9hZF91cmwoJHNyY19maWxlLCAkdHlwZSA9ICdyZXF1ZXN0JywgJGRlc3RfZmlsZSA9IG51bGwpCiAgICAgICAgewogICAgICAgICAgICAKICAgICAgICAgICAgaWYoJHR5cGUhPSdhYm9ydC1hbGwnKQogICAgICAgICAgICAgICAgJHNpemUgPSBmaWxlc2l6ZSgkc3JjX2ZpbGUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAkc2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgJGhhc2ggPSBtZDUoJ2l0eGFwaTo6c3Rhc2g6OnVwbG9hZCcpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYoZW1wdHkoJGRlc3RfZmlsZSkpCiAgICAgICAgICAgICAgICAkZGVzdF9maWxlID0gJHNyY19maWxlOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHN3aXRjaCgkdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAncmVxdWVzdCc6ICAgICByZXR1cm4gJHRoaXMtPmZvcm1hdF9zaWduZWRfdXJsKCdzdGFzaC91cGxvYWQnLCAkdGhpcy0+X3VzZXJuYW1lLCAkdGhpcy0+X3Bhc3N3b3JkLCBhcnJheSgnZmlsZW5hbWUnPT5iYXNlNjRfZW5jb2RlKCRkZXN0X2ZpbGUpLCAnaGFzaCc9PiRoYXNoLCAnc2l6ZSc9PiRzaXplKSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjYXNlICdkb25lJzogICAgICAgIHJldHVybiAkdGhpcy0+Zm9ybWF0X3NpZ25lZF91cmwoJ3N0YXNoL3VwbG9hZC1kb25lJywgJHRoaXMtPl91c2VybmFtZSwgJHRoaXMtPl9wYXNzd29yZCwgYXJyYXkoJ2ZpbGVuYW1lJz0+YmFzZTY0X2VuY29kZSgkZGVzdF9maWxlKSwgJ2hhc2gnPT4kaGFzaCwgJ3NpemUnPT4kc2l6ZSkpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgY2FzZSAnYWJvcnQnOiAgICAgICByZXR1cm4gJHRoaXMtPmZvcm1hdF9zaWduZWRfdXJsKCdzdGFzaC91cGxvYWQtYWJvcnQnLCAkdGhpcy0+X3VzZXJuYW1lLCAkdGhpcy0+X3Bhc3N3b3JkLCBhcnJheSgnZmlsZW5hbWUnPT5iYXNlNjRfZW5jb2RlKCRkZXN0X2ZpbGUpLCAnaGFzaCc9PiRoYXNoLCAnc2l6ZSc9PiRzaXplKSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBjYXNlICdhYm9ydC1hbGwnOiAgIHJldHVybiAkdGhpcy0+Zm9ybWF0X3NpZ25lZF91cmwoJ3N0YXNoL3VwbG9hZC1hYm9ydC1hbGwnLCAkdGhpcy0+X3VzZXJuYW1lLCAkdGhpcy0+X3Bhc3N3b3JkKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVW5rbm93biB0eXBlIG9mIHVwbG9hZCB1cmwnKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgCiAgICAgICAgcHVibGljIGZ1bmN0aW9uIGdldF9tYW5hZ2VfdXJsKCkKICAgICAgICB7CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZvcm1hdF9zaWduZWRfdXJsKCdzdGFzaC9tYW5hZ2UnLCAkdGhpcy0+X3VzZXJuYW1lLCAkdGhpcy0+X3Bhc3N3b3JkKTsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAKICAgICAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0X3F1b3RhX3VybCgpCiAgICAgICAgewogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5mb3JtYXRfc2lnbmVkX3VybCgnc3Rhc2gvcXVvdGEnLCAkdGhpcy0+X3VzZXJuYW1lLCAkdGhpcy0+X3Bhc3N3b3JkKTsKICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAKICAgICAgICAgcHVibGljIGZ1bmN0aW9uIGdldF9maWxlc191cmwoKQogICAgICAgIHsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Zm9ybWF0X3NpZ25lZF91cmwoJ3N0YXNoL2ZpbGVzJywgJHRoaXMtPl91c2VybmFtZSwgJHRoaXMtPl9wYXNzd29yZCk7CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgCiAgICB9CiAgICAKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0=
###PACKDATA,FILE_END,/destinations/stash/lib/class.itx_helper.php,importbuddy/classes/class.itx_helper.php
###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/LICENSE,importbuddy/lib/requestcore/LICENSE
Q29weXJpZ2h0IChjKSAyMDA2LTIwMTAgUnlhbiBQYXJtYW4sIEZvbGVlbyBJbmMuLCBhbmQgY29udHJpYnV0b3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCnBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKCSogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YKCSAgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKCSogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3QKCSAgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKCSAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKCSogTmVpdGhlciB0aGUgbmFtZSBvZiBSeWFuIFBhcm1hbiwgRm9sZWVvIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvCgkgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KCSAgcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MKT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMKQU5EIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQpQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/LICENSE,importbuddy/lib/requestcore/LICENSE
###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/README.md,importbuddy/lib/requestcore/README.md
IyBSZXF1ZXN0Q29yZQoKUmVxdWVzdENvcmUgaXMgYSBsaWdodHdlaWdodCBjVVJMLWJhc2VkIEhUVFAgcmVxdWVzdC9yZXNwb25zZSBjbGFzcyB0aGF0IGxldmVyYWdlcyBNdWx0aUN1cmwgZm9yIHBhcmFsbGVsIHJlcXVlc3RzLgoKIyMjIFBFQVIgSFRUUF9SZXF1ZXN0PwoKUmVxdWVzdENvcmUgd2FzIHdyaXR0ZW4gYXMgYSByZXBsYWNlbWVudCBmb3IgW1BFQVIgSFRUUF9SZXF1ZXN0XShodHRwOi8vcGVhci5waHAubmV0L2h0dHBfcmVxdWVzdC8pLiBXaGlsZSBQRUFSIEhUVFBfUmVxdWVzdCBpcyBmdWxsLWZlYXR1cmVkIGFuZCBoZWF2eSwgUmVxdWVzdENvcmUgZmVhdHVyZXMgb25seSB0aGUgZXNzZW50aWFscyBhbmQgaXMgdmVyeSBsaWdodHdlaWdodC4gSXQgYWxzbyBsZXZlcmFnZXMgdGhlIGJhdGNoIHJlcXVlc3Qgc3VwcG9ydCBpbiBjVVJMJ3MgYGN1cmxfbXVsdGlfZXhlYygpYCB0byBlbmFibGUgbXVsdGktdGhyZWFkZWQgcmVxdWVzdHMgdGhhdCBmaXJlIGluIHBhcmFsbGVsLgoKIyMjIFJlZmVyZW5jZSBhbmQgRG93bmxvYWQKCllvdSBjYW4gZmluZCB0aGUgY2xhc3MgcmVmZXJlbmNlIGF0IDxodHRwOi8vc2t5enl4LmdpdGh1Yi5jb20vcmVxdWVzdGNvcmUvPi4gWW91IGNhbiBnZXQgdGhlIGNvZGUgZnJvbSA8aHR0cDovL2dpdGh1Yi5jb20vc2t5enl4L3JlcXVlc3Rjb3JlPi4KCiMjIyBMaWNlbnNlIGFuZCBDb3B5cmlnaHQKClRoaXMgY29kZSBpcyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCwgUnlhbiBQYXJtYW4uIEhvd2V2ZXIsIEknbSBsaWNlbnNpbmcgdGhpcyBjb2RlIGZvciBvdGhlcnMgdG8gdXNlIHVuZGVyIHRoZSBbU2ltcGxpZmllZCBCU0QgbGljZW5zZV0oaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHApLgo=
###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/README.md,importbuddy/lib/requestcore/README.md
###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/cacert.pem,importbuddy/lib/requestcore/cacert.pem
IyMKIyMgY2EtYnVuZGxlLmNydCAtLSBCdW5kbGUgb2YgQ0EgUm9vdCBDZXJ0aWZpY2F0ZXMKIyMKIyMgQ2VydGlmaWNhdGUgZGF0YSBmcm9tIE1vemlsbGEgYXMgb2Y6IFdlZCBKYW4gMTggMDA6MDQ6MTYgMjAxMgojIwojIyBUaGlzIGlzIGEgYnVuZGxlIG9mIFguNTA5IGNlcnRpZmljYXRlcyBvZiBwdWJsaWMgQ2VydGlmaWNhdGUgQXV0aG9yaXRpZXMKIyMgKENBKS4gVGhlc2Ugd2VyZSBhdXRvbWF0aWNhbGx5IGV4dHJhY3RlZCBmcm9tIE1vemlsbGEncyByb290IGNlcnRpZmljYXRlcwojIyBmaWxlIChjZXJ0ZGF0YS50eHQpLiAgVGhpcyBmaWxlIGNhbiBiZSBmb3VuZCBpbiB0aGUgbW96aWxsYSBzb3VyY2UgdHJlZToKIyMgaHR0cDovL214ci5tb3ppbGxhLm9yZy9tb3ppbGxhL3NvdXJjZS9zZWN1cml0eS9uc3MvbGliL2NrZncvYnVpbHRpbnMvY2VydGRhdGEudHh0P3Jhdz0xCiMjCiMjIEl0IGNvbnRhaW5zIHRoZSBjZXJ0aWZpY2F0ZXMgaW4gUEVNIGZvcm1hdCBhbmQgdGhlcmVmb3JlCiMjIGNhbiBiZSBkaXJlY3RseSB1c2VkIHdpdGggY3VybCAvIGxpYmN1cmwgLyBwaHBfY3VybCwgb3Igd2l0aAojIyBhbiBBcGFjaGUrbW9kX3NzbCB3ZWJzZXJ2ZXIgZm9yIFNTTCBjbGllbnQgYXV0aGVudGljYXRpb24uCiMjIEp1c3QgY29uZmlndXJlIHRoaXMgZmlsZSBhcyB0aGUgU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUuCiMjCgojICoqKioqIEJFR0lOIExJQ0VOU0UgQkxPQ0sgKioqKioKIyBWZXJzaW9uOiBNUEwgMS4xL0dQTCAyLjAvTEdQTCAyLjEKIwojIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbgojIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAojIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIyBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KIwojIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCiMgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlCiMgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKIyBMaWNlbnNlLgojCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgdGhlIE5ldHNjYXBlIHNlY3VyaXR5IGxpYnJhcmllcy4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojCiMgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2YKIyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlICJHUEwiKSwgb3IKIyB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKIyBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgb3IgdGhlIExHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZAojIG9mIHRob3NlIGFib3ZlLiBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5CiMgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0bwojIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyCiMgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKIyBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZQojIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKIyB0aGUgdGVybXMgb2YgYW55IG9uZSBvZiB0aGUgTVBMLCB0aGUgR1BMIG9yIHRoZSBMR1BMLgojCiMgKioqKiogRU5EIExJQ0VOU0UgQkxPQ0sgKioqKioKIyBAKCMpICRSQ1NmaWxlOiBjZXJ0ZGF0YS50eHQsdiAkICRSZXZpc2lvbjogMS44MSAkICREYXRlOiAyMDEyLzAxLzE3IDIyOjAyOjM3ICQKCkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDV2pDQ0FjTUNBZ0dsTUEwR0NTcUdTSWIzRFFFQkJBVUFNSFV4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OUhWRVVnClEyOXljRzl5WVhScGIyNHhKekFsQmdOVkJBc1RIa2RVUlNCRGVXSmxjbFJ5ZFhOMElGTnZiSFYwYVc5dWN5d2dTVzVqTGpFak1DRUcKQTFVRUF4TWFSMVJGSUVONVltVnlWSEoxYzNRZ1IyeHZZbUZzSUZKdmIzUXdIaGNOT1Rnd09ERXpNREF5T1RBd1doY05NVGd3T0RFegpNak0xT1RBd1dqQjFNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFIxUkZJRU52Y25CdmNtRjBhVzl1TVNjd0pRWURWUVFMCkV4NUhWRVVnUTNsaVpYSlVjblZ6ZENCVGIyeDFkR2x2Ym5Nc0lFbHVZeTR4SXpBaEJnTlZCQU1UR2tkVVJTQkRlV0psY2xSeWRYTjAKSUVkc2IySmhiQ0JTYjI5ME1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQ1ZENkMyOEZDYzZIckhpTTNkRnc0dQpzSlRRR3owTzlwVEFpcFRIQnNpUWw4aTRaQnA2Zm13OFUrRTNLSE5nZjdLWFV3ZWZVL2x0V0pUU3I0MXRpR2VBNXUyeWxjOXlNY3FsCkhISzZYQUxuWkVMbitha3Mxam9OckkxQ3FpUUJPZWFjUHdHRlZ3MVloMFg0MDRXcWsya21oWEJJZ0Q4U0ZjZDV0QjhGTHp0aW1RSUQKQVFBQk1BMEdDU3FHU0liM0RRRUJCQVVBQTRHQkFHM3JHd25wWHRsUjIyY2lZYVFxUEVoMzQ2QjhwdDV6b2hRRGhUMzdxdzR3eFlNVwpNNEVUQ0o1N05FN2ZRTWgwMTdsOTNQUjJWWDJiWTFRWTZmRHE4MXl4Mll0Q0hybkFsVTY2K3RYaWZQVm9ZYitPN0FXWFgxdXcxNk9GCk5NUWtwdzBQbFpQdnk1VFluaCtkWElWdHg2cXVUeDhpdGMyVnJicW56UG1yQzNwLwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUaGF3dGUgU2VydmVyIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFekNDQW55Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRUUZBRENCeERFTE1Ba0dBMVVFQmhNQ1drRXhGVEFUQmdOVkJBZ1QKREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRFZRUUtFeFJVYUdGM2RHVWdRMjl1YzNWcwpkR2x1WnlCall6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFWk1CY0dBMVVFCkF4TVFWR2hoZDNSbElGTmxjblpsY2lCRFFURW1NQ1FHQ1NxR1NJYjNEUUVKQVJZWGMyVnlkbVZ5TFdObGNuUnpRSFJvWVhkMFpTNWoKYjIwd0hoY05PVFl3T0RBeE1EQXdNREF3V2hjTk1qQXhNak14TWpNMU9UVTVXakNCeERFTE1Ba0dBMVVFQmhNQ1drRXhGVEFUQmdOVgpCQWdUREZkbGMzUmxjbTRnUTJGd1pURVNNQkFHQTFVRUJ4TUpRMkZ3WlNCVWIzZHVNUjB3R3dZRFZRUUtFeFJVYUdGM2RHVWdRMjl1CmMzVnNkR2x1WnlCall6RW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFWk1CY0cKQTFVRUF4TVFWR2hoZDNSbElGTmxjblpsY2lCRFFURW1NQ1FHQ1NxR1NJYjNEUUVKQVJZWGMyVnlkbVZ5TFdObGNuUnpRSFJvWVhkMApaUzVqYjIwd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFOT2tVRzdJLzFacjVzOWR0dW9NYUhWSG9xckMyb1FsCi9LajBSMUhhaGJVZ2RKU0dIZzkxeWVrSVlmVUdiVEJ1RlJrQzZWTEFZdHRObVo3aWFneEVPTTMrdnVOa0NYREYvckZyS2JZdlNjZzcKMUNjRUpSQ1hMK2VRYmNBb1FwblhURVBldy9VaGJWU2ZYY05ZNGNEazJWdXd1TnkwZTk4Mk9zSzFaaUlTMW9jTkFnTUJBQUdqRXpBUgpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFCL3BNYVZ6N2xjeEc3b1dEVFNFd2pzclpxRzlKCkd1YmFVZU5nY0d5RVlSR2hHc2hJUGxsRGZVK1ZQYUdMdHd0aW1IcDFpdDJJVGs2ZVFOdW96REowdVc4Tnh1T3pSQXZaaW0rYUtadVoKR0NnNzBlTkFLSnBhUE5XMTV5QWJpOHFrcTQzcFVkbmlUQ3hacWRxNXNuVWI5a0x5NzhmeUdQbUp2S1AvaWlNdWNFYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVGhhd3RlIFByZW1pdW0gU2VydmVyIENBCj09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREp6Q0NBcENnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFRRkFEQ0J6akVMTUFrR0ExVUVCaE1DV2tFeEZUQVRCZ05WQkFnVApERmRsYzNSbGNtNGdRMkZ3WlRFU01CQUdBMVVFQnhNSlEyRndaU0JVYjNkdU1SMHdHd1lEVlFRS0V4UlVhR0YzZEdVZ1EyOXVjM1ZzCmRHbHVaeUJqWXpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakVoTUI4R0ExVUUKQXhNWVZHaGhkM1JsSUZCeVpXMXBkVzBnVTJWeWRtVnlJRU5CTVNnd0pnWUpLb1pJaHZjTkFRa0JGaGx3Y21WdGFYVnRMWE5sY25abApja0IwYUdGM2RHVXVZMjl0TUI0WERUazJNRGd3TVRBd01EQXdNRm9YRFRJd01USXpNVEl6TlRrMU9Wb3dnYzR4Q3pBSkJnTlZCQVlUCkFscEJNUlV3RXdZRFZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWRNQnNHQTFVRUNoTVUKVkdoaGQzUmxJRU52Ym5OMWJIUnBibWNnWTJNeEtEQW1CZ05WQkFzVEgwTmxjblJwWm1sallYUnBiMjRnVTJWeWRtbGpaWE1nUkdsMgphWE5wYjI0eElUQWZCZ05WQkFNVEdGUm9ZWGQwWlNCUWNtVnRhWFZ0SUZObGNuWmxjaUJEUVRFb01DWUdDU3FHU0liM0RRRUpBUllaCmNISmxiV2wxYlMxelpYSjJaWEpBZEdoaGQzUmxMbU52YlRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTBqWTIKYW92WHdsdWUyb0ZCWW84NDdra0VWZGJRN3h3YmxSWkg3eGhJTlRwUzlDdHFCbzg3TCtwVzQ2K0dqWjRYOTU2MFpYVUNUZS9MQ2FJaApVZGliMEdmUXVnMlNCaFJ6MUpQTGx5b0FuRnhPREx6NkZWTDg4a1J1MmhGS2JnaWZMeTNqK2FvNmhuTzJSbE5ZeUlrRnZZTVJ1SE0vCnFnZU45RUpONTBDZEhEY0NBd0VBQWFNVE1CRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVFGQUFPQmdRQW0KU0N3V3dsajY2QlowREtxcVgxUS84dGZKZUdCZVhtNDNZeUozTm42eUY4UTB1ZlVJaGZ6SkFUai9UYjd5RmtKRDU3dGFSdnZCeGhFZgo4VXF3S0ViSnc4UkNmYno2cTFsdTFiZFJpQkhqcElVWmE0Sk1wQXdTcmVta3JqL3h3MGxsbW96RnlENGx0NVNadTVJeWNRZndobDd0ClVDZW1EYVlqK2J2THBnY1VRZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVxdWlmYXggU2VjdXJlIENBCj09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlESURDQ0FvbWdBd0lCQWdJRU5kNzB6ekFOQmdrcWhraUc5dzBCQVFVRkFEQk9NUXN3Q1FZRFZRUUdFd0pWVXpFUU1BNEdBMVVFCkNoTUhSWEYxYVdaaGVERXRNQ3NHQTFVRUN4TWtSWEYxYVdaaGVDQlRaV04xY21VZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjUKTUI0WERUazRNRGd5TWpFMk5ERTFNVm9YRFRFNE1EZ3lNakUyTkRFMU1Wb3dUakVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFvVApCMFZ4ZFdsbVlYZ3hMVEFyQmdOVkJBc1RKRVZ4ZFdsbVlYZ2dVMlZqZFhKbElFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVENCCm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXdWMnhXR2NJWXU2Z21pMGZDRzJSRkdpWUNoNysyZ1J2RTRSaUljUFIKZk02ZkJlQzRBZkJPTk96aWlwVUVaS3p4YTFOZkJiUExaNEMvUWdLTy90MEJDZXpoQUJSUC9QdndETjFEdWxzcjRSK0FjSmtWVjVNVwo4UStYYXJmQ2FDTWN6RTFaTUt4UkhqdXZLOWJ1WTBWN3hkbGZVTkxqVUE4NmlPZS9GUDNneDdrQ0F3RUFBYU9DQVFrd2dnRUZNSEFHCkExVWRId1JwTUdjd1phQmpvR0drWHpCZE1Rc3dDUVlEVlFRR0V3SlZVekVRTUE0R0ExVUVDaE1IUlhGMWFXWmhlREV0TUNzR0ExVUUKQ3hNa1JYRjFhV1poZUNCVFpXTjFjbVVnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNU1RMHdDd1lEVlFRREV3UkRVa3d4TUJvRwpBMVVkRUFRVE1CR0JEekl3TVRnd09ESXlNVFkwTVRVeFdqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVVNPWm8rU3ZTCnNwWFhSOWdqSUJCUE01aVFuOVF3SFFZRFZSME9CQllFRkVqbWFQa3IwcktWMTBmWUl5QVFUek9Za0ovVU1Bd0dBMVVkRXdRRk1BTUIKQWY4d0dnWUpLb1pJaHZaOUIwRUFCQTB3Q3hzRlZqTXVNR01EQWdiQU1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGak9LZXI4OTk2MQp6Z0s1RjdXRjBibmo0SlhNSlRFTkFLYVNibisya21PZVVKWFJtbS9rRWQ1amhXNlk3cWovV3NqVFZiSm1jVmZld0NIclBTcW5JMGtCCkJJWkNlL3p1ZjZJV1VyVm5aOU5BMnpzbVdMSW9kejJ1RkhkaDF2b3FaaWVnRGZxbmMxenFjUEdVSVdWRVgvcjg3eWxvcWFLSGVlOTUKNzArc0IzYzQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uIEdsb2JhbCBDQSAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREtUQ0NBcEtnQXdJQkFnSUVObkFWbGpBTkJna3Foa2lHOXcwQkFRVUZBREJHTVFzd0NRWURWUVFHRXdKVlV6RWtNQ0lHQTFVRQpDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJFd0R3WURWUVFMRXdoRVUxUkRRU0JGTVRBZUZ3MDVPREV5Ck1UQXhPREV3TWpOYUZ3MHhPREV5TVRBeE9EUXdNak5hTUVZeEN6QUpCZ05WQkFZVEFsVlRNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnMKSUZOcFoyNWhkSFZ5WlNCVWNuVnpkQ0JEYnk0eEVUQVBCZ05WQkFzVENFUlRWRU5CSUVVeE1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNEdMQURDQmh3S0JnUUNnYklHcHp6UWVKTjMraGlqTTNvTXYrVjdVUXRMb2RHQm1FNWdHSEtsUkVtbHZNVlc1U1hJQUNIN1RwV0pFCk55U1pqOW1EU0krWmJaVVR1ME03TGtsT2lEZkJ1MWgvL3VHOStMdGh6Zk5Id0ptbThmT1I2SGg4QU10aHlVUW5jV2xWU241SlRlMmkKbzc0Q1RBREtBcWp1QVFJeFpBOVNMUk4wZGphMWVyUXRjUUlCQTZPQ0FTUXdnZ0VnTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpCbwpCZ05WSFI4RVlUQmZNRjJnVzZCWnBGY3dWVEVMTUFrR0ExVUVCaE1DVlZNeEpEQWlCZ05WQkFvVEcwUnBaMmwwWVd3Z1UybG5ibUYwCmRYSmxJRlJ5ZFhOMElFTnZMakVSTUE4R0ExVUVDeE1JUkZOVVEwRWdSVEV4RFRBTEJnTlZCQU1UQkVOU1RERXdLd1lEVlIwUUJDUXcKSW9BUE1UazVPREV5TVRBeE9ERXdNak5hZ1E4eU1ERTRNVEl4TURFNE1UQXlNMW93Q3dZRFZSMFBCQVFEQWdFR01COEdBMVVkSXdRWQpNQmFBRkdwNWZwRnBSaGdUQ2dKM3BWbGJZSmdsRHFMNE1CMEdBMVVkRGdRV0JCUnFlWDZSYVVZWUV3b0NkNlZaVzJDWUpRNmkrREFNCkJnTlZIUk1FQlRBREFRSC9NQmtHQ1NxR1NJYjJmUWRCQUFRTU1Bb2JCRlkwTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0IKQUNJUzJIb2QzSUVHdGdsbHNvZklIMTYwTCtuRUh2STh3YnNFa0JGS2cwNStrN2xOUXNlU0pxQmNOSm80Y3ZqOWF4WStJTzZDaXpFcQpremFGSTRpS1BBTm8wOGtKRDAzOGJLVGFLSEtURG9tQXNIMytnRzlsYlJnemw0dkNhNG51WUQzSW0rOS9LekppYzVQTFBPTjc0blo0ClJieWhrd1M3aHA4NlcwTjZ3NHBsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLiBHbG9iYWwgQ0EgMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQXBLZ0F3SUJBZ0lFTm03VHpqQU5CZ2txaGtpRzl3MEJBUVVGQURCR01Rc3dDUVlEVlFRR0V3SlZVekVrTUNJR0ExVUUKQ2hNYlJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1FnUTI4dU1SRXdEd1lEVlFRTEV3aEVVMVJEUVNCRk1qQWVGdzA1T0RFeQpNRGt4T1RFM01qWmFGdzB4T0RFeU1Ea3hPVFEzTWpaYU1FWXhDekFKQmdOVkJBWVRBbFZUTVNRd0lnWURWUVFLRXh0RWFXZHBkR0ZzCklGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhFVEFQQmdOVkJBc1RDRVJUVkVOQklFVXlNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUEKQTRHTEFEQ0Jod0tCZ1FDL2s0OFhrdTh6RXhqckVIOU9Gci8vQm84cWhieGUrU1NtSklpMkE3ZkJ3MThEVzlGdnJuNUM2bVlqdUdPRApWdnNvTGVFNGk3VHVxQUhoemh5MmlDb2lSb1g3bjZkd3FVY1VQODdlWmZDb2NmZFBKbXlNdk1hMTc5NUpKLzlJS24zb1RRUE14N0pTCnhoY3hFenUxVGR2SXhQYkREeVFxMmd5ZDU1RmJnTTJVblFJQkE2T0NBU1F3Z2dFZ01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6Qm8KQmdOVkhSOEVZVEJmTUYyZ1c2QlpwRmN3VlRFTE1Ba0dBMVVFQmhNQ1ZWTXhKREFpQmdOVkJBb1RHMFJwWjJsMFlXd2dVMmxuYm1GMApkWEpsSUZSeWRYTjBJRU52TGpFUk1BOEdBMVVFQ3hNSVJGTlVRMEVnUlRJeERUQUxCZ05WQkFNVEJFTlNUREV3S3dZRFZSMFFCQ1F3CklvQVBNVGs1T0RFeU1Ea3hPVEUzTWpaYWdROHlNREU0TVRJd09URTVNVGN5Tmxvd0N3WURWUjBQQkFRREFnRUdNQjhHQTFVZEl3UVkKTUJhQUZCNkNUU2hsZ0R6SlFXNnNOUzVheTk3dStEbGJNQjBHQTFVZERnUVdCQlFlZ2swb1pZQTh5VUZ1ckRVdVdzdmU3dmc1V3pBTQpCZ05WSFJNRUJUQURBUUgvTUJrR0NTcUdTSWIyZlFkQkFBUU1NQW9iQkZZMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCCkFFZU5nNjFpOHR1d25rVWlCYm1pMWdNT09ITG5udng3NXBPMm1xV2lsTWcwSFpIUnhkZjBDaVVQUFhpQm5nK3haOFNRVEdQZFhxZmkKdXAvMTkwMmxNWHVjS1MxTS9tUSs3TFpUL3VxYjdZTGJkSFZMQjNsdUh0Z1pnM1BlOVQ3UXRkN25TMmg5UXk0cUlPRitvSGhFbmdqMQptUG5IZnhzYjFnWWdBbGlodzZJRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNQRENDQWFVQ0VIQzY1QjBRMlNrMHRqaktld1BNdXI4d0RRWUpLb1pJaHZjTkFRRUNCUUF3WHpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNQpJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVGsyTURFeU9UQXdNREF3TUZvWERUSTRNRGd3TVRJek5UazFPVm93Clh6RUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVGN3TlFZRFZRUUxFeTVEYkdGemN5QXoKSUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNEdOQURDQmlRS0JnUURKWEZtZThodUtBUlMwRU44RVFOdmpWNjlxUlVDUGhBd0wwVFBaMlJIUDdnSllIeVgzS3FoRUJhcnNBeDk0CmY1NlR1Wm9BcWlOOTFxeUZvbU5GeDNJbnpQUk14blZ4MGpudlQwTHdkZDhLa01hT0lHK1lEL2lzSTE5d0tUYWt5WWJuc1pvZ3kxT2wKaGVjOXZuMmEvaVJGTTl4MkZlMFBvbkZrVEdVdWdXaEZwd0lEQVFBQk1BMEdDU3FHU0liM0RRRUJBZ1VBQTRHQkFMdE1FaXZQTENZQQpUeFFUM2FiNy9Bb1JoSXp6S0J4bmtpOTh0c1g2My9Eb2xid2RqMndzcUZITWM5aWt3RlB3VHRZbXdIWUJWNEdTWGlIeDBiSC81OUFoCldNMXBGK05FSEp3WlJEbUpYTnljQUE5V2pRS1o3YUtRUlV6a3V4Q2tQZkF5QXc3eHp2am95VkdNNW1LZjVwL0FmYmR5bk1rMk9tdWYKVHFqL1pBMWsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmVyaXNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREFqQ0NBbXNDRUgzWi9nZlBxQjYzRUhsbis2ZUpOTVl3RFFZSktvWklodmNOQVFFRkJRQXdnY0V4Q3pBSkJnTlZCQVlUQWxWVApNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRThNRG9HQTFVRUN4TXpRMnhoYzNNZ015QlFkV0pzYVdNZ1VISnBiV0Z5CmVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3lNVG93T0FZRFZRUUxFekVvWXlrZ01UazVPQ0JXWlhKcFUybG4KYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WegpkQ0JPWlhSM2IzSnJNQjRYRFRrNE1EVXhPREF3TURBd01Gb1hEVEk0TURnd01USXpOVGsxT1Zvd2djRXhDekFKQmdOVkJBWVRBbFZUCk1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFOE1Eb0dBMVVFQ3hNelEyeGhjM01nTXlCUWRXSnNhV01nVUhKcGJXRnkKZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1Ub3dPQVlEVlFRTEV6RW9ZeWtnTVRrNU9DQldaWEpwVTJsbgpiaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnpaU0J2Ym14NU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6CmRDQk9aWFIzYjNKck1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRRE1YdEVSWFZ4cDBLdlR1V3BNbVI5Wm1EQ08KRm9VZ1JtMUhQOVNGSUlUaGJiUDRwTzBNOFJjUE8vbW4rU1hYd2MrRVkvSjhZOCtpUi9MR1d6T09aRUFFYU1HQXVXUWNSWGZIMkc3MQpsU2s4VU9nMDEzZ2ZxTHB0UTVHVmowVlhYbjdGKzhxa0JPdnFsemRVTUcrN0FVY3lNODNjVjV0a2FXSDRteDBjaVU5Y1p3SURBUUFCCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGRk56YjVjeTVnWm5CV3lBVGw0TGswUFozQndtY1lRV3BTa1UwMVViU3V2RFYxQWkyVFQKMSs3ZVZtR1NYNmJFSFJCaE50TXNKenpvS1FtNUVXUjB6TFZ6bnh4SXFieGhBZTdpRjZZTTQwQUlPdzduNjBSektwcnhhWkx2Y1JURApPYXh4cDVFSmIrUnhCck82V1ZjbWVRRDIrQTJpTXpBbzFLcFlvSjJkYVpIOQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZFRDQ0FsMmdBd0lCQWdJTEJBQUFBQUFCRlV0YXc1UXdEUVlKS29aSWh2Y05BUUVGQlFBd1Z6RUxNQWtHQTFVRUJoTUNRa1V4CkdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnZiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHMKYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9EQTVNREV4TWpBd01EQmFGdzB5T0RBeE1qZ3hNakF3TURCYU1GY3hDekFKQmdOVgpCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpWVd4VGFXZHVJRzUyTFhOaE1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEClZRUURFeEpIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGEKRHVhWmpjNmo0MCtLZnZ2eGk0TWxhK3BJSC9FcXNMbVZFUVM5OEdQUjRtZG16eHpkenh0SUsrNk5pWTZhcnltQVphdnB4eTBTeTZzYwpUSEFIb1QwS01NMFZqVS80M2RTTVVCVWM3MUR1eEM3My9PbFM4cEY5NEczVk5UQ09Ya056OGtIcDFXcmpzb2s2VmprNGJ3WThpR2xiCktrM0ZwMVM0YkluTW0vazh5dVg5aWZVU1BKSjRsdGJjZEc2VFJHSFJqY2RHc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlAKYzFTVEU0VTZHN3dlTkxXTEJZeTVkNHV4Mng4Z2thc0pVMjZRem5zM2RMbHdSNUVpVVdNV2VhNnhya0VtQ01nWks5Rkdxa2pXWkNyWApnelQvTENyQmJCbERTZ2VGNTlOODlpRm83K3J5VXA5L2s1RFBBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJnZTJZYVJRMlh5b2xRTDMwRXpUU28vL3o5U3pBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUExblBuZkU5MjBJMi83THFpdmpURktESzFmUHhzbkN3cnZRbWVVNzlyWHFvUlNMYmxDS096eWoxaFRkTkdDYk0rdzZEagpZMVViOHJydnJUbmhRN2s0bytZdmlpWTc3NkJRVnZuR0N2MDR6Y1FMY0ZHVWw1Z0UzOE5mbE5VVnlSUkJuTVJkZFdRVkRmOVZNT3lHCmovOE43eXk1WTBiMnF2emZ2R245TGhKSVpKcmdsZkNtN3ltUEFiRVZ0UXdkcGY1cExHa2tlQjZ6cHh4eFl1N0t5SmVzRjEyS3d2aEgKaG00cXhGWXhsZEJuaVlVcitXeW1YVWFkREtxQzVKbFIzWEMzMjFZOVllUnE0VnpXOXY0OTNrSE1CNjVqVXI5VFUvUXI2Y2Y5dHZlQwpYNFhTUVJqYmdiTUVITVVmcElCdkZTREozZ3lJQ2gzV1psWGkvRWpKS1NacDRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjIKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1akNDQXFLZ0F3SUJBZ0lMQkFBQUFBQUJENFltNWcwd0RRWUpLb1pJaHZjTkFRRUZCUUF3VERFZ01CNEdBMVVFQ3hNWFIyeHYKWW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpJeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzYjJKaApiRk5wWjI0d0hoY05NRFl4TWpFMU1EZ3dNREF3V2hjTk1qRXhNakUxTURnd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRWdMU0JTTWpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG4KYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2JQSkE2K0xtOG9tVVZDeEtzK0lWU2JDOU4vaEhENgpFclBMdjRkZnhuK0cwN0l3WE5iOXJmRjczT1g0WUpZSmtoRDEwRlBlKzN0K2M0aXNVb2g3U3FiS1NhWmVxS2VNV2hHOGVvTHJ2b3pwCnM2eVdKUWVYU3BrcUJ5KzBIbmUvaWcrMUFud2JscmpGdVRvc3ZOWVN1ZXRaZmVMUUJvWmZYa2xxdFRsZWlEVHN2SGdNQ0ppRWJLak4KUzdTZ2ZReDVUZkM0TGNzaHl0VnNXMzNob0NtRW9mblRsRW5MSkdLUklMemRDOVhaelBucUp3b3JjNUhHblJ1c3lNdm80S0QwTDVDTApUZnV3Tmh2MkdYcUY0RzN5WVJPSVhKL2drd3BSbDRwYXpxK3IxZmVxQ2FwZ3ZkelpYOTl5cVdBVFhnQUJ5VXI2UDZUcUJ3TWhBbzZDCnlnUENtNDhDQXdFQUFhT0JuRENCbVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEUKRmdRVW0rSUhWMmNjSHNCcUJ0NVp0Sm90Mzl3WmhpNHdOZ1lEVlIwZkJDOHdMVEFyb0NtZ0o0WWxhSFIwY0RvdkwyTnliQzVuYkc5aQpZV3h6YVdkdUxtNWxkQzl5YjI5MExYSXlMbU55YkRBZkJnTlZIU01FR0RBV2dCU2I0Z2RYWnh3ZXdHb0czbG0wbWkzZjNCbUdMakFOCkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQW1ZRlRoeHhvbDRhUjdPQkt1RVFMcTRHc0owL1d3YmdjUTNpekRKcjg2aXc4Ym1FYlRVc3AKOVo4RkhTYkJ1T21EQUdKRnRxa0lrN21wTTBzWW1zTDRoNGhPMjkxeE5CckJWTnBHUCtEVEtxdHRWQ0wxT21MTklHKzZLWW5YM1pIdQowMXlpUHFGYlFmWGY1V1JETGVuVk9hdlNvdCszaTlEQWdCa2NSY0F0ak9qNExhUjBWa25GQmJWUEZkNXVSSGc1aDZoK3UvTjVHSkc3CjlHK2R3ZkNNTll4ZEFmdkRiYm52UkcxNVJqRitDdjZwZ3NILzc2dHVJTVJReVYrZFRac1hqQXpsQWNtZ1FXcHpVL3FsVUxSdUpRLzcKVEJqMC9WTFpqbW14NkJFUDNvalkreDFKOTZyZWxjOGdlTUpnRXRzbFFJeHEvSDVDT0VCa0V2ZWVnZUdUTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpWYWxpQ2VydCBDbGFzcyAxIFZBCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWxBQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjBJRlpoYkdsa1lYUnAKYjI0Z1RtVjBkMjl5YXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBekJnTlZCQXNUTEZaaGJHbERaWEowSUVOcwpZWE56SURFZ1VHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3T2k4dmQzZDNMblpoCmJHbGpaWEowTG1OdmJTOHhJREFlQmdrcWhraUc5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmxjblF1WTI5dE1CNFhEVGs1TURZeU5USXkKTWpNME9Gb1hEVEU1TURZeU5USXlNak0wT0Zvd2dic3hKREFpQmdOVkJBY1RHMVpoYkdsRFpYSjBJRlpoYkdsa1lYUnBiMjRnVG1WMApkMjl5YXpFWE1CVUdBMVVFQ2hNT1ZtRnNhVU5sY25Rc0lFbHVZeTR4TlRBekJnTlZCQXNUTEZaaGJHbERaWEowSUVOc1lYTnpJREVnClVHOXNhV041SUZaaGJHbGtZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TRXdId1lEVlFRREV4aG9kSFJ3T2k4dmQzZDNMblpoYkdsalpYSjAKTG1OdmJTOHhJREFlQmdrcWhraUc5dzBCQ1FFV0VXbHVabTlBZG1Gc2FXTmxjblF1WTI5dE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNEdOQURDQmlRS0JnUURZV1lKNmliaVd1cVl2YUc5WUxxZFVIQVp1OU9xTlNMd3hsQmZ3ODA2OHNyZzFrbmF3MEtXbEFkY0FBeElpCkdRajQveEVqbTg0SDliOXBHaWIrVHVuUmY1MHNRQjFaYUc2bStGaXduUnFQMHoveDNCa0dnYWdPNERyZHlGTkZDUWJtRDNERCtrQ20KRHVKV0JROFlUZndnZ3RGelZYU05kbktnSFowZHdOMC9jUUlEQVFBQk1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFGQm9QVW4wTEJ3RwpsTitWWUgrV2V4ZitUM0d0Wk1qZGQ5THZXVlhvUCtpT0JTb2g4Z2ZTdGFkUy9weXh0dUpiZHhkQTZuTFdJOHNvZ1RMREFIa1k3RmtYCmljbkdhaDV4eWYyM2RLVWxSV25GU0tzWjRVV0tKV3NaN3VXN0V2Vi85NmFOVWNQd25YUzNxVDZncGYrMlNRTVQyaUxNN1hHQ0s1blAKT3JmMUxYTEkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmFsaUNlcnQgQ2xhc3MgMiBWQQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDNXpDQ0FsQUNBUUV3RFFZSktvWklodmNOQVFFRkJRQXdnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowSUZaaGJHbGtZWFJwCmIyNGdUbVYwZDI5eWF6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXpCZ05WQkFzVExGWmhiR2xEWlhKMElFTnMKWVhOeklESWdVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eWFYUjVNU0V3SHdZRFZRUURFeGhvZEhSd09pOHZkM2QzTG5aaApiR2xqWlhKMExtTnZiUzh4SURBZUJna3Foa2lHOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sY25RdVkyOXRNQjRYRFRrNU1EWXlOakF3Ck1UazFORm9YRFRFNU1EWXlOakF3TVRrMU5Gb3dnYnN4SkRBaUJnTlZCQWNURzFaaGJHbERaWEowSUZaaGJHbGtZWFJwYjI0Z1RtVjAKZDI5eWF6RVhNQlVHQTFVRUNoTU9WbUZzYVVObGNuUXNJRWx1WXk0eE5UQXpCZ05WQkFzVExGWmhiR2xEWlhKMElFTnNZWE56SURJZwpVRzlzYVdONUlGWmhiR2xrWVhScGIyNGdRWFYwYUc5eWFYUjVNU0V3SHdZRFZRUURFeGhvZEhSd09pOHZkM2QzTG5aaGJHbGpaWEowCkxtTnZiUzh4SURBZUJna3Foa2lHOXcwQkNRRVdFV2x1Wm05QWRtRnNhV05sY25RdVkyOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUEKQTRHTkFEQ0JpUUtCZ1FET09uSEs1YXZJV1pKVjE2dllkQTc1N3RuMlZVZFpaVWNPQlZYYzY1ZzJQRnhUWGRNd3p6anN2VUdKN1NWQwpDU1JyQ2w2emZOMVNMVXptMU5aOVdsbXBaZFJKRXkwa1RSeFFiN1hCaFZRNy9uSGswMXhDK1lEZ2tSb0tXemsyWi9NL1ZYd2JQN1JmClpITTA0N1FTdjRkaytOb1MvemNud2JORHUrOTdiaTVwOXdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBRHQvVUc5dlVKU1oKU1dJNE9COUwrS1hJUHFlQ2dmWXJ4K2pGenVnNkVJTExHQUNPVGIyb1dIK2hlUUMxdSttTnIwSFpEelR1SVlFWm9ESkpLUFRFamxiVgpValA5VU5WK21Xd0Q1TWxNL010c3EyYXpTaUdNNWJVTU1qNFFzc3hzb2R5YW1Fd0NXL1BPdVo2bGNnNUt0ejg4NWhabytMN3RkRXk4Clc5VmlIMFBkCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClJTQSBSb290IENlcnRpZmljYXRlIDEKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQzV6Q0NBbEFDQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMElGWmhiR2xrWVhScApiMjRnVG1WMGQyOXlhekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6QmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zCllYTnpJRE1nVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXlhWFI1TVNFd0h3WURWUVFERXhob2RIUndPaTh2ZDNkM0xuWmgKYkdsalpYSjBMbU52YlM4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObGNuUXVZMjl0TUI0WERUazVNRFl5TmpBdwpNakl6TTFvWERURTVNRFl5TmpBd01qSXpNMW93Z2JzeEpEQWlCZ05WQkFjVEcxWmhiR2xEWlhKMElGWmhiR2xrWVhScGIyNGdUbVYwCmQyOXlhekVYTUJVR0ExVUVDaE1PVm1Gc2FVTmxjblFzSUVsdVl5NHhOVEF6QmdOVkJBc1RMRlpoYkdsRFpYSjBJRU5zWVhOeklETWcKVUc5c2FXTjVJRlpoYkdsa1lYUnBiMjRnUVhWMGFHOXlhWFI1TVNFd0h3WURWUVFERXhob2RIUndPaTh2ZDNkM0xuWmhiR2xqWlhKMApMbU52YlM4eElEQWVCZ2txaGtpRzl3MEJDUUVXRVdsdVptOUFkbUZzYVdObGNuUXVZMjl0TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBCkE0R05BRENCaVFLQmdRRGptRkdXSE9qVnNRYUJhbGZEY25XVHE4K2Vwdnp6RmxMV0xVMmZOVVNvTGdSTkIwbUtPQ24xZHpmbnQ2dGQKM3paeEZKbVAzTUtTOGVkZ2twZnMyRWpjdjhFQ0lNWWtwQ2hNTUZwMmJiRmM4OTNlbmhCeG9ZakhXNXRCYmNxd3VJNFY3cTB6Szg5SApCRngxY1FxWUpKZ3BwMGxacGQzNHQwTmlZZlBUNHRCVlB3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUZhN0FsaUVad2dzCjN4L2JlMGt6OWRObm5mUzBDaEN6eWNVczRwSnFjWGduOG5DRFF0TSt6NmxVOVBIWWtoYU0wUVRMUzZ2Sm4wV3VQSXFwc0hFelhjakYKVjkrdnFEV3pmNG1INmVnbGtyaC9oWHF1MXJ3ZU4xZ3FaOG1SenlxQlB1M0dPZC9BUGhtY0djd1RUWUpCdFl6ZTREMWdDQ0FQUlg1cgpvbitqakJYdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFR2pDQ0F3SUNFUUNiZmdaSm96NWl1ZFh1a0VoeEtlOVhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEtNUXN3Q1FZRFZRUUdFd0pWClV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUYVdkdUlGUnlkWE4wSUU1bGRIZHYKY21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdUxDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObApJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdUlFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSE16QWVGdzA1T1RFd01ERXdNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUlIS01Rc3cKQ1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeQpkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2CmNtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1SUVOc1lYTnpJRE1nVUhWaWJHbGpJRkJ5YVcxaGNua2cKUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQU11Nm5GTDhlQjhhSG04Yk4zTzkrTWxybEJJd1QvQTJSL1hRa1FyMUY4aWxZY0VXUUUzN2ltR1E1WFlnd1JFR2Zhc3NicWIxCkVVR08raTJ0S21GWnBHY21UTkRvdkZKYmNDQUVXTkY2eWFScHZJTVhaSzBGaTd6UVdNNk5qUFhyOEVKSkM1MlhKMmN5YnVHdWt4VWMKY0x3Z1RTOFkzcEtJNkd5RlZ4RWE2WDdqSmhGVW9rV1dWWVBLTUlubzNOaWo3U3FBUDM5NVpWYytGU0JtQ0MrVms3K3FSeStvUnBmdwpFdUwrd2dvclVlWjI1cmRHdCtJTnBzeW93MHhaVllubTZGTmNIT3FkOEdJV0M2ZkpYd3p3M3NKMnpxLzNhdkw2UWFhaU14VEo1WHBqCjA1NWlOOVdGWlo0TzVsTWtkQnRlSFJKVFc4Y3M1NE5KT3hXdWltaTVWNWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKRVJTV3dhdVNDUGMvTDhteS91UmFuMlRlMnlGUGhwazBkalpYM2RBVkw4V3RmeFVmTjJKelB0VG5YODRYQTlzMStpdmJybUFKWHg1ZgpqMjY3Q3ozcVdoTWVER0J2dGNDMUl5SXVCd3ZMcVhUTFI3c2R3ZGVsYTh3djBrTDlTZDJuaWM5VHV0b0FXaWkvZ3QvNHVoTWRVSWFDCi9ZNHdqeWxHc0I0OU5kbzRZaFlZU3EzbXRsRnMzcTlpNndIUUhpVCtlbzhTR2hKb3VQdG1tUlFVUlZ5dTU2NXBGNEVyV2pmSlhpcjAKeHVLaFhGU2JwbFFBei9EeHdjZVlNQm83TmhiYm8yN3EvYTJ5d3RydkFrY1Rpc0R4c3pHdFR4emhUNXl2RHd5ZDkzZ04yUFExVm9EYQp0MjBYajUwZWdXVGgvc1ZGdXExcnVRcDZUazlMaE81TDhYM2RFUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClZlcmlzaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVHakNDQXdJQ0VRRHNvS2VMYm5WcUFjL0VmTXd2bEY3WE1BMEdDU3FHU0liM0RRRUJCUVVBTUlIS01Rc3dDUVlEVlFRR0V3SlYKVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdgpjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1SUVOc1lYTnpJRFFnVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITXpBZUZ3MDVPVEV3TURFd01EQXdNREJhRncwek5qQTNNVFl5TXpVNU5UbGFNSUhLTVFzdwpDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVGFXZHVJRlJ5CmRYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHYKY21sNlpXUWdkWE5sSUc5dWJIa3hSVEJEQmdOVkJBTVRQRlpsY21sVGFXZHVJRU5zWVhOeklEUWdVSFZpYkdsaklGQnlhVzFoY25rZwpRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBSzNMcFJGcHhsbXI4WSsxR1E5V3pzeTFIeURrbmlZbFMrQnpaWWxaM3RDRDVQVVB0YnV0OFh6b0lmems2QXp1ZkVVaUdYYVMKdEJPM0lGc0orbUd1cVBLbGpZWENLdGJlWmpiU213TDBxSkpnZkp4cHRJOGtIdENHVXZZeW5FRllIaUs5elVWaWxRaHUwR2JkVTZMTQo4QkRjVkhPTEJLRkdNek5jRjBDNW5rM1Q4NzVWZytpeGlZNWFmSnFXSXBBN2lDWHkwbE9JQWd3TGVQTG1OeGRMTUVZSDVJQnRwdGlXCkx1Z3MrQkd6T0ExbXBwdnF5U05iMjQ3aTh4T09HbGt0cWdMdzdLU0hadHpCUC9YWXVmVHNnc2JTUFpVZDVjQlBoTW5abzBRb0JtclgKUmF6d2EycnZUbC80RVlJZU9HTTBabERVUHBOeitqRERacTMva3kyWDd3TUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQQpqL29sYTA5YjVLUk9KMVdySWhWWlBNcTFDdFJLMjZ2ZG9WOVR4YUJYT2NMT1J5dStPc2hXdjhMWkp4QTZzUVU4d0hjeHV6clRCWHR0Cm1od3dqSURMazVNcWc2c0ZVWUlDQUJGbmEvT0lZVWRmQTVQVld3M2c4ZFNoTWpXRnNqcmJzSUtyMGNzS3ZFK01XOFZMQURzZktvS20KZmphRjNINDhad0MxNUR0UzRLanJYUlg1eG0zd3JSME9oYmVwbW5NVVdsdVBRU2pBMWVndFRhUmV6YXJaN2M3YzJOVThRaDBYd1JKZApSVGpET1BQOGhTNkRSa2l5MXlCZmtqYVA1M2tQbUY2WjZQRFFwTHYxVTcwcXpsbXdyMjUvYkx2U0hnQ3dJZTM0UVdLQ3VkaXl4THRHClVQTXh4WThCcUhUcjlYZ24ydWYzWmtQem5vTStJS3JETldDUnpnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFMkRDQ0JFR2dBd0lCQWdJRU4wclNRekFOQmdrcWhraUc5dzBCQVFVRkFEQ0J3ekVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WCkJBb1RDMFZ1ZEhKMWMzUXVibVYwTVRzd09RWURWUVFMRXpKM2QzY3VaVzUwY25WemRDNXVaWFF2UTFCVElHbHVZMjl5Y0M0Z1lua2cKY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbE1DTUdBMVVFQ3hNY0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbApaREU2TURnR0ExVUVBeE14Ulc1MGNuVnpkQzV1WlhRZ1UyVmpkWEpsSUZObGNuWmxjaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlVEFlRncwNU9UQTFNalV4TmpBNU5EQmFGdzB4T1RBMU1qVXhOak01TkRCYU1JSERNUXN3Q1FZRFZRUUdFd0pWVXpFVU1CSUcKQTFVRUNoTUxSVzUwY25WemRDNXVaWFF4T3pBNUJnTlZCQXNUTW5kM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FXNWpiM0p3TGlCaQplU0J5WldZdUlDaHNhVzFwZEhNZ2JHbGhZaTRwTVNVd0l3WURWUVFMRXh3b1l5a2dNVGs1T1NCRmJuUnlkWE4wTG01bGRDQk1hVzFwCmRHVmtNVG93T0FZRFZRUURFekZGYm5SeWRYTjBMbTVsZENCVFpXTjFjbVVnVTJWeWRtVnlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdMQURDQmh3S0JnUUROS0lNMFZCdUo4dyt2TjVFeC82OHhZTW1vNkxJUQphTzJmNTVNMjhRcGt1MGYxQkJjL0kwZE54U2NaZ1NZTVZISU5pQzNaSDVvU243eXpjZE9BR1Q5SFpudU1OU2pTdVFyZkpOcWMxbEI1CmdYcGEwemYzd2tyWUtaSW1aTkhrbUd3NkFJcjFOSnRsK08zakVQLzl1RWxZM0tEZWdqbHJnYkVXR1dHNVZMYm1Rd0lCQTZPQ0FkY3cKZ2dIVE1CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6Q0NBUmtHQTFVZEh3U0NBUkF3Z2dFTU1JSGVvSUhib0lIWXBJSFZNSUhTTVFzdwpDUVlEVlFRR0V3SlZVekVVTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1WlhReE96QTVCZ05WQkFzVE1uZDNkeTVsYm5SeWRYTjBMbTVsCmRDOURVRk1nYVc1amIzSndMaUJpZVNCeVpXWXVJQ2hzYVcxcGRITWdiR2xoWWk0cE1TVXdJd1lEVlFRTEV4d29ZeWtnTVRrNU9TQkYKYm5SeWRYTjBMbTVsZENCTWFXMXBkR1ZrTVRvd09BWURWUVFERXpGRmJuUnlkWE4wTG01bGRDQlRaV04xY21VZ1UyVnlkbVZ5SUVObApjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVEwd0N3WURWUVFERXdSRFVrd3hNQ21nSjZBbGhpTm9kSFJ3T2k4dmQzZDNMbVZ1CmRISjFjM1F1Ym1WMEwwTlNUQzl1WlhReExtTnliREFyQmdOVkhSQUVKREFpZ0E4eE9UazVNRFV5TlRFMk1EazBNRnFCRHpJd01Ua3cKTlRJMU1UWXdPVFF3V2pBTEJnTlZIUThFQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVOEJkaUUxVTlzLzhLQUd2N1VJU1g4KzFpMEJvdwpIUVlEVlIwT0JCWUVGUEFYWWhOVlBiUC9DZ0JyKzFDRWwvUHRZdEFhTUF3R0ExVWRFd1FGTUFNQkFmOHdHUVlKS29aSWh2WjlCMEVBCkJBd3dDaHNFVmpRdU1BTUNCSkF3RFFZSktvWklodmNOQVFFRkJRQURnWUVBa053d0F2cGtkTUtuQ3FWOElZMDBGNmo3Unc3L0pYeU4KRXdyNzVKaTE3NHo0eFJBTjk1Sys4Y1BWMVpWcUJMc3N6aVkyWmNneHh1ZnVQK05YZFlSNkVlOUdUeGowMDVpN3FJY3l1bkwyUE9JOQpuOWNkMmNOZ1E0eFlEaUtXTDJLakxCKzZyUVh2cXpKNGg2QlVjeG0xWEFYNVVqNXRMVVVMOXdxVDZ1MEcrYkk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWERDQ0EwU2dBd0lCQWdJRU9HTzVaakFOQmdrcWhraUc5dzBCQVFVRkFEQ0J0REVVTUJJR0ExVUVDaE1MUlc1MGNuVnpkQzV1ClpYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnBibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHAKYldsMGN5QnNhV0ZpTGlreEpUQWpCZ05WQkFzVEhDaGpLU0F4T1RrNUlFVnVkSEoxYzNRdWJtVjBJRXhwYldsMFpXUXhNekF4QmdOVgpCQU1US2tWdWRISjFjM1F1Ym1WMElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUNneU1EUTRLVEFlRncwNU9URXlNalF4Ck56VXdOVEZhRncweE9URXlNalF4T0RJd05URmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTMKZDNkM0xtVnVkSEoxYzNRdWJtVjBMME5RVTE4eU1EUTRJR2x1WTI5eWNDNGdZbmtnY21WbUxpQW9iR2x0YVhSeklHeHBZV0l1S1RFbApNQ01HQTFVRUN4TWNLR01wSURFNU9Ua2dSVzUwY25WemRDNXVaWFFnVEdsdGFYUmxaREV6TURFR0ExVUVBeE1xUlc1MGNuVnpkQzV1ClpYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBclUxTHFSS0dzdXFqSUFjVkZtUXFLMHZSdnd0S1RZN3RnSGFsWjdkNFFNQnpRc2hvd050VEs5MWV1SGFZTlpPTApHcDE4RXpvT0gxdTNIcy9sSkJRZXNZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyCmhSU0dsVnVYTWxCdlBjaTZaZ3pqL0wyNFNjRjJpVWtaL2NDb3ZZbWpaeS9Hbjd4eEdXQzRMZWtzeVpCMlpudVU0cTk0MW1WVFhUelcKbkxMUEtRUDVMNlJRc3RSSXpnVXlWWXI5c21STUR1U1lCM1hiZjkrNUNGVmdoVEFwK1h0SXBHbUc0elUvSG9aZGVub1Z2ZThBamhVaQpWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUg0UUlEQVFBQm8zUXdjakFSQmdsZ2hrZ0JodmhDCkFRRUVCQU1DQUFjd0h3WURWUjBqQkJnd0ZvQVVWZVNCMFJHQXZ0aUp1UWlqTWZtaEpBa1d1WEF3SFFZRFZSME9CQllFRkZYa2dkRVIKZ0w3WWlia0lvekg1b1NRSkZybHdNQjBHQ1NxR1NJYjJmUWRCQUFRUU1BNGJDRlkxTGpBNk5DNHdBd0lFa0RBTkJna3Foa2lHOXcwQgpBUVVGQUFPQ0FRRUFXVWVzSVlTS0Y4bWNpVk1ldW9DRkdzWThUajZ4bkxaOHhwSmRHR1FDNDlNR0NCRmhmR1BqSzUweEEzQjIwcU1vCm9QUzdtbU56N1czbEt0dnRGS2tyeGpZUjBDdnJCNHVsMnA1Y0daMVdFdlZVS2NnRjdiSVNLbzMwQXh2LzU1SVFoN0E2dGNPZEJUY1MKbzhmMEZiblZwRGtXbTFNNkk1SHhxSUtpYW9ob3dYa0NJcnlxcHRhdTM3QVVYN2lIME4xOGYzdi9yeHpQNXRzSHJWN2JoWjNRS3cwegoyd1RSNWtsQUV5dDIrejdwbklrUEZjNFlzSVY0SVU5clR3NzZObWZOQi9ML0NORGkzdG0vS3ErNGg0WWhQQVRLdDVSb2Y4ODg2WmpYCk9QL3N3TmxROEM1TFdLNUdiOUF1dzJEYWNsVnl2VXhGbm1HNnY0U0JrZ1BSMG1sOHhRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJRUFnQUF1VEFOQmdrcWhraUc5dzBCQVFVRkFEQmFNUXN3Q1FZRFZRUUdFd0pKUlRFU01CQUdBMVVFCkNoTUpRbUZzZEdsdGIzSmxNUk13RVFZRFZRUUxFd3BEZVdKbGNsUnlkWE4wTVNJd0lBWURWUVFERXhsQ1lXeDBhVzF2Y21VZ1EzbGkKWlhKVWNuVnpkQ0JTYjI5ME1CNFhEVEF3TURVeE1qRTRORFl3TUZvWERUSTFNRFV4TWpJek5Ua3dNRm93V2pFTE1Ba0dBMVVFQmhNQwpTVVV4RWpBUUJnTlZCQW9UQ1VKaGJIUnBiVzl5WlRFVE1CRUdBMVVFQ3hNS1EzbGlaWEpVY25WemRERWlNQ0FHQTFVRUF4TVpRbUZzCmRHbHRiM0psSUVONVltVnlWSEoxYzNRZ1VtOXZkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTUUKdXlLcm1EMVg2Q1p5bXJWNTFDbmk0ZWlWZ0xHdzQxdU9LeW1hWk4raFhlMndDUVZ0MnlndXptS2lZdjYwaU5vUzZ6anJJWjNBUVNzQgpVbnVJZDlNY2o4ZTZ1WWkxYWdubmMrZ1JRS2ZSek1waWpTM2xqd3VtVU5Lb1VNTW82dldySlllS21wWWNxV2U0UHd6VjkvbFNFeS9DCkc5VndjUENQd0JMS0JzdWE0ZG5LTTNwMzF2anN1ZkZvUkVKSUU5TEF3cVN1WG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDkKWGJJR2V2T0Y2dXZVQTY1ZWhENWYveFh0YWJ6NU9UWnlkYzkzVWszenlaQXN1VDNseVNOVFB4OGttQ0ZjQjVrcHZjWTY3T2R1aGpwcgpsM1JqTTcxb0dESHdlSTEydi95ZWpsMHFocWROa053bkdqa0NBd0VBQWFORk1FTXdIUVlEVlIwT0JCWUVGT1dkV1RDQ1Ixak1yUG9JClZEYUdlenExQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUIKQlFVQUE0SUJBUUNGREYyTzVHOVJhRUlGb04yN1R5Y2xoQU85OTJUOUxkY3c0NlFRRit2YUtTbTJlVDkyOWhrVEk3Z1FDdmxZcE5SaApjTDBFWVdvU2loZlZDcjNGdkRCODF1a01KWTJHUUUvc3pLTitPTVkzRVUvdDNXZ3hqa3pTc3dGMDdyNTFYZ2RJR245dy94WmNoTUI1CmhiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMEVwbjNvMFdDNHp4ZTlaMmV0Y2llZkM3SXBKNU9DQlJMYmYxd2JXc2EKWTcxazVoKzN6dkR5bnk2N0c3ZnlVSWh6a3NMaTR4YU5taklDcTQ0WTNla1FFZTUrTmF1UXJ6NHdsSHJRTXoyblpRLzEvSTZlWXM5SApSQ3dCWGJzZHRUTFNSOUk0THREK2dkd3lhaDYxN2p6Vi9PZUJIUm5ESkVMcVl6bXAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDa0RDQ0FmbWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVFGQURCYU1Rc3dDUVlEVlFRR0V3SlZVekVjTUJvR0ExVUVDaE1UClJYRjFhV1poZUNCVFpXTjFjbVVnU1c1akxqRXRNQ3NHQTFVRUF4TWtSWEYxYVdaaGVDQlRaV04xY21VZ1IyeHZZbUZzSUdWQ2RYTnAKYm1WemN5QkRRUzB4TUI0WERUazVNRFl5TVRBME1EQXdNRm9YRFRJd01EWXlNVEEwTURBd01Gb3dXakVMTUFrR0ExVUVCaE1DVlZNeApIREFhQmdOVkJBb1RFMFZ4ZFdsbVlYZ2dVMlZqZFhKbElFbHVZeTR4TFRBckJnTlZCQU1USkVWeGRXbG1ZWGdnVTJWamRYSmxJRWRzCmIySmhiQ0JsUW5WemFXNWxjM01nUTBFdE1UQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUF1dWNYa0FKbHNUUlYKUEVuQ1VkWGZwOUUzajlIbmdYTkJVbUNibmFFWEpuaXR4N0hvSnBReXRkNHpqVG92Mi9LYWVscHptS05jNmZ1S2N4dGM1OE8vZ0d6TgpxZlRXSzhEMytabXFZNkt4UndJUDFPUlJPaEk4YklwYVZJUncyOEhGa005eVJjdW9XY0ROTTUwL281YnJoVE1oSEQ0ZVBtQnVkcHhuCmhjWEl3MkVDQXdFQUFhTm1NR1F3RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGoKQkJnd0ZvQVV2cWlnZEhKUWEwUzN5U1BZKzZqL3MxZHJhR3d3SFFZRFZSME9CQllFRkw2b29IUnlVR3RFdDhrajJQdW8vN05YYTJocwpNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBRERpQVZHcXgrcGYycm5RWlE4dzFqN2FEUlJKYnBHVEp4UXg3OFQzTFVYNDdNZS9va0VOCkk3U1MrUmtBWjcwQnI4M2djZnhhejJURTRKYVkwS05BNGdHSzd5Y0g4V1VCaWtRdEJtVjFVc0NHRUNBaFgyeHJEMnl1Q1J5djhxSVkKTk1SMXBITWM4WTNjNzYzNXMzYTBrci9jbFJBZXZzdklPMXFFWUJsV2xLbFYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBIDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNnakNDQWV1Z0F3SUJBZ0lCQkRBTkJna3Foa2lHOXcwQkFRUUZBREJUTVFzd0NRWURWUVFHRXdKVlV6RWNNQm9HQTFVRUNoTVQKUlhGMWFXWmhlQ0JUWldOMWNtVWdTVzVqTGpFbU1DUUdBMVVFQXhNZFJYRjFhV1poZUNCVFpXTjFjbVVnWlVKMWMybHVaWE56SUVOQgpMVEV3SGhjTk9Ua3dOakl4TURRd01EQXdXaGNOTWpBd05qSXhNRFF3TURBd1dqQlRNUXN3Q1FZRFZRUUdFd0pWVXpFY01Cb0dBMVVFCkNoTVRSWEYxYVdaaGVDQlRaV04xY21VZ1NXNWpMakVtTUNRR0ExVUVBeE1kUlhGMWFXWmhlQ0JUWldOMWNtVWdaVUoxYzJsdVpYTnoKSUVOQkxURXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTTR2R2J3WHQzZmVrNmxmV2cwWFR6UWFESmowSXRsWgoxTVJvUnZDME5jV0ZBeURHcjBXbElWRkZRZXNXV0RZeWIrSlFZbVQ1L1ZHY3FpVFo5SjJES29jS0lkTVNPRFJzalFCdVdxRFpRdTRhCklaWDVVa3hWV3NVUE9FOUcrbTM0TGpYV0hYenI0dkN3ZFlESXFST3N2b2p2T202clh5bzRZZ0t3RW52K2o2WURBZ01CQUFHalpqQmsKTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZFcDRNbElSMjFrVwpObDdmd1JRMlFHcEhmRXloTUIwR0ExVWREZ1FXQkJSS2VESlNFZHRaRmpaZTM4RVVOa0JxUjN4TW9UQU5CZ2txaGtpRzl3MEJBUVFGCkFBT0JnUUIxVzZpYkF4SG02VlpNemZtcFRNQU5tdlBNWldubUpYYk1XYmZXVk1NZHpabXNHZDIwaGRYZ1BmeGlJS2VFUzFobDhlTDUKbFNFLzlkUitXQjVIaDFRK1dLRzF0ZmdxNzNIbnZNUDJzVWxHNHRlZ2ErVldlcG9ubUh4R1loVG55Znh1QXhKNWdEZ2RTSUtOL0JmKwpLcFlydFdLbXBqMjlmNUpaelZvcWdySTNlUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQSAyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlESURDQ0FvbWdBd0lCQWdJRU4zRFB0VEFOQmdrcWhraUc5dzBCQVFVRkFEQk9NUXN3Q1FZRFZRUUdFd0pWVXpFWE1CVUdBMVVFCkNoTU9SWEYxYVdaaGVDQlRaV04xY21VeEpqQWtCZ05WQkFzVEhVVnhkV2xtWVhnZ1UyVmpkWEpsSUdWQ2RYTnBibVZ6Y3lCRFFTMHkKTUI0WERUazVNRFl5TXpFeU1UUTBOVm9YRFRFNU1EWXlNekV5TVRRME5Wb3dUakVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVApEa1Z4ZFdsbVlYZ2dVMlZqZFhKbE1TWXdKQVlEVlFRTEV4MUZjWFZwWm1GNElGTmxZM1Z5WlNCbFFuVnphVzVsYzNNZ1EwRXRNakNCCm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTVEazVreDVTQmhzb052aXlveW5GN1k2eUViMys2K2UwZE1LUC93WG4KMlowR3Z4TElQdzd5MXRFa3NoSGUwWE1KaXRTeExKZ0pEUjVRUnJLRHBrV05ZbWk3aFJzZ2NES3FRTTJtbGwvRWNUYy9CUE8zUVNRNQpCeG9lTG1GWW9CSUw1YVhmeGF2cU4zSE1ITWczT3JtWFVxZXN4V29rbEU2Y2U4L0FhdGJmSWIwQ0F3RUFBYU9DQVFrd2dnRUZNSEFHCkExVWRId1JwTUdjd1phQmpvR0drWHpCZE1Rc3dDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PUlhGMWFXWmhlQ0JUWldOMWNtVXgKSmpBa0JnTlZCQXNUSFVWeGRXbG1ZWGdnVTJWamRYSmxJR1ZDZFhOcGJtVnpjeUJEUVMweU1RMHdDd1lEVlFRREV3UkRVa3d4TUJvRwpBMVVkRUFRVE1CR0JEekl3TVRrd05qSXpNVEl4TkRRMVdqQUxCZ05WSFE4RUJBTUNBUVl3SHdZRFZSMGpCQmd3Rm9BVVVKNEw2cTllCnVTQklwbEJxeS8zWUlIcW5nbll3SFFZRFZSME9CQllFRkZDZUMrcXZYcmtnU0taUWFzdjkyQ0I2cDRKMk1Bd0dBMVVkRXdRRk1BTUIKQWY4d0dnWUpLb1pJaHZaOUIwRUFCQTB3Q3hzRlZqTXVNR01EQWdiQU1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFBeUdncTNvVGhyMQpqb2tuNGpWWVBTbTBCNDgyVUpXL2JzR2U2OFNRc29Xb3U3ZEM0QThIT2QvN25wQ3kwY0UrVTU4RFJMQitTL1J2NUh3ZjUrS3g1TGlhCjc4Tzl6dDRMTWpUWjNpanRNMnZFMU5jOUVsaXJmUWt0eTNEMUU0cVVvU2VrMW5ERmJaUzF5WDJkb05MR0NFblpacHVtMC9RTDNNVW0KVitHUk1Pck4KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWRkVHJ1c3QgTG93LVZhbHVlIFNlcnZpY2VzIFJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVHRENDQXdDZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJsTVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU0V3SHdZRFZRUURFeGhCWkdSVQpjblZ6ZENCRGJHRnpjeUF4SUVOQklGSnZiM1F3SGhjTk1EQXdOVE13TVRBek9ETXhXaGNOTWpBd05UTXdNVEF6T0RNeFdqQmxNUXN3CkNRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SFRBYkJnTlZCQXNURkVGa1pGUnlkWE4wSUZSVVVDQk8KWlhSM2IzSnJNU0V3SHdZRFZRUURFeGhCWkdSVWNuVnpkQ0JEYkdGemN5QXhJRU5CSUZKdmIzUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1dsdFFoU1dEaWEraEJCd3pleE9EY0V5UE53VFhIKzlaT0VRcG5YdlVHVzJ1bENEdGJLUlk2CjU0ZXlOQWJGdkFXbEEzeUN5eWtRcnVHSWdiM1dudFArTFZiQkZjN2pKcDBWTGhEN0JvOHdCTjZudEdPMC83R2Nyanl2ZDdaV3hiV3IKb3VscE9qME9NM2t5UDNDQ2twbGhiWTB3Q0k5eFA2WklWeG40SmR4TFpseWxkSStZcnNqNXdBWWk1Nnh6MzZVdSsxTGNzUlZsSVBvMQpabW5lM3l6eGJyd3cyeXdrRXR2ck5UVm9rTXNBc0pjaFBYUWhJMlUwSzd0NFdhUFc0WFk1bXFSSmpveDByMjZrbXFQWm05STRYSnVpCkdNeDFJNFMrNitKTk0zR09HdkRDK01jZG9xMERseXo0enlYRzlyZ2tNYkZqWFpKL1kvQWx5Vk11SDc5TkFnTUJBQUdqZ2RJd2djOHcKSFFZRFZSME9CQllFRkpXeHRQQ1V0cjNIMnRFUkNTRyt3YTlKL1JCN01Bc0dBMVVkRHdRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUlHUEJnTlZIU01FZ1ljd2dZU0FGSld4dFBDVXRyM0gydEVSQ1NHK3dhOUovUkI3b1dta1p6QmxNUXN3Q1FZRFZRUUdFd0pUClJURVVNQklHQTFVRUNoTUxRV1JrVkhKMWMzUWdRVUl4SFRBYkJnTlZCQXNURkVGa1pGUnlkWE4wSUZSVVVDQk9aWFIzYjNKck1TRXcKSHdZRFZRUURFeGhCWkdSVWNuVnpkQ0JEYkdGemN5QXhJRU5CSUZKdmIzU0NBUUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUN4dApaQnNmelEzZHVRSDZsbU0wTWtoSG1hNlg3ZjF5RnFaelIxcjA2OTNwOWRiN1Jjd3BpVVJkdjBZNVBlanV2RTFVaGg0ZGJPTVhKMFBoCmlWWXJxVzl5VGtrejQzSjhLaU9hdkQ3L0tDcnRvLzhjSTdwRFZ3bG5UVXRpQmkzNC8yeWRZQjdZSEV0OXRURXYyZEI4WGZqZWE0TVkKZURkWEwrZ3pCMmZmSHNkcktwVjJybzlYby9EMFVyU3BVd2pQNEUvVGVsT0wvYnNjVmpieS9ySzI1WGE3MVNKbHB6LyswV2F0Qzd4cgptWWJ2UDMzekdETEtlOGJqcTJSR2xmZ21hZGxWZzNzc2xnZi9XU3hFbzhibDZhbmNvV09BV2lGZUljOVRWUEM2YjRuYnFLcVZ6NHZqCmNjd2VHeUJFQ01CNnRrRDl4T1ExNFIwV0hOQzhLNDdXY2RrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZGRUcnVzdCBFeHRlcm5hbCBSb290Cj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVOakNDQXg2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJ2TVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRApWUVFERXhsQlpHUlVjblZ6ZENCRmVIUmxjbTVoYkNCRFFTQlNiMjkwTUI0WERUQXdNRFV6TURFd05EZ3pPRm9YRFRJd01EVXpNREV3Ck5EZ3pPRm93YnpFTE1Ba0dBMVVFQmhNQ1UwVXhGREFTQmdOVkJBb1RDMEZrWkZSeWRYTjBJRUZDTVNZd0pBWURWUVFMRXgxQlpHUlUKY25WemRDQkZlSFJsY201aGJDQlVWRkFnVG1WMGQyOXlhekVpTUNBR0ExVUVBeE1aUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnUTBFZwpVbTl2ZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGYzR2pQbThnQUVMVG5nVGx2dEg3eHNEODIxCitpTzJ6dDZiRVRPWHBDbE1mWk9mdlVxOGsrMERHdU9QeitWdFVGcldseW1VV29Dd1NYcmJMcFg5dU1xL056Z3RIajZSUWExd1ZzZncKVHovb01wNTB5c2lRVk9uR1h3OTRuWnBBUEE2c1lhcGVGSStlaDZGcVVOelhtazZ2QmJPbWNaU2NjYk5RWUFySEU1MDRCNFlDcU9tbwphU1lZa0t0TXNFOGpxenBQaE5qZnpwL2hhVys3MTBMWGEwVGt4NjN1YlVGZmNscHhDRGV6ZVdXa1dhQ1VOL2NBTHczQ2tuTGEwRGh5CjJ4U29SY1JkS24yM3ROYkU3cXpORTBTM3lTdmRRd0FsK21HNWFXcFlJeEczcHpPUFZuVlo5YzBwMTBhM0NpdGx0dE5DYnhXeXVIdjcKNytsZFU5VTBXaWNDQXdFQUFhT0IzRENCMlRBZEJnTlZIUTRFRmdRVXJiMlllalMwSnZmNnhDWlU3d085NENUTFZCb3dDd1lEVlIwUApCQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d2daa0dBMVVkSXdTQmtUQ0Jqb0FVcmIyWWVqUzBKdmY2eENaVTd3Tzk0Q1RMClZCcWhjNlJ4TUc4eEN6QUpCZ05WQkFZVEFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVWNuVnpkQ0JCUWpFbU1DUUdBMVVFQ3hNZFFXUmsKVkhKMWMzUWdSWGgwWlhKdVlXd2dWRlJRSUU1bGRIZHZjbXN4SWpBZ0JnTlZCQU1UR1VGa1pGUnlkWE4wSUVWNGRHVnlibUZzSUVOQgpJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTENiNElVbHd0WWo0ZytXQnBLZFFaaWMyWVI1Z2RrZVd4UUhJelpsCmo3RFlkN3VzUVd4SFlJTlJzUGt5UGVmODlpWVR4NEFXcGI5YS9JZlBlSG1KSVpyaVRBY0toalc4OHQ1UnhOS1d0OXgrVHU1dy9SdzUKNnd3Q1VSUXRqcjBXNE1IZlJuWG5KSzNzOUVLMGhaTndFR2U2blFZMVNoalRLM3JNVVVLaGVtUFI1cnVoeFN2Q05yNFREZWE5WTM1NQplNmNKRFVDcmF0MlBpc1AyOW93YVFnVlIxRVgxbjZkaUlXZ1ZJRU04bWVkOHZTVFlxWkVYYzRnL1Zoc3hPQmkwY1ErYXpjZ09ubzR1CkcrR01tSVBMSHpIeFJFekdCSE5KZG1BUHgvaTlGNEJyTHVuTVRBNWFtbmtQSUFvdTFaNWpKaDVWa3BUWWdoZGFlOUM4eDQ5T2hnUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWRkVHJ1c3QgUHVibGljIFNlcnZpY2VzIFJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJrTVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU0F3SGdZRFZRUURFeGRCWkdSVQpjblZ6ZENCUWRXSnNhV01nUTBFZ1VtOXZkREFlRncwd01EQTFNekF4TURReE5UQmFGdzB5TURBMU16QXhNRFF4TlRCYU1HUXhDekFKCkJnTlZCQVlUQWxORk1SUXdFZ1lEVlFRS0V3dEJaR1JVY25WemRDQkJRakVkTUJzR0ExVUVDeE1VUVdSa1ZISjFjM1FnVkZSUUlFNWwKZEhkdmNtc3hJREFlQmdOVkJBTVRGMEZrWkZSeWRYTjBJRkIxWW14cFl5QkRRU0JTYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTZSb3dqNE9JRk1FZzJEeWJqeHQrQTNTNzJtblRScVg0anNJTUVaQlJwUzltVkVCVjZ0c2ZTbGJ1Cm55TnU5RG5Mb2JsdjhuNzVYWWNtWVo0YytPTHNwb0g0SWNVa3pCRU1QOXNtY25ySEFaY0hGL25YR0N3d2ZRNTZIbUlleGt2QS9YMWkKZDlORUhpZjJQMHRFczdjNDJUa2ZZTlZSa25NRHRBQnA0L01VVHU3UjNBblBkelJHVUxENEVmTCtPSG4zQnpuK1VaS1hDMXNJWHpTRwpBYTJJbCt0bXpWN1IvOXg5OG9UYXVuZXQzSUFJeDZlSDFsV2ZsMnJveUJGa3V1Y1pLVDhSczNpUWhDQlNXeEh2ZU5DRDl0VklrTkF3CkhNK0ErV0QrZWVTSTh0MEE2NVJGNjJXVWFVQzZ3TlcwdUxwOUJCR282ekVGbHBST1dDR09uOUJnL1FJREFRQUJvNEhSTUlIT01CMEcKQTFVZERnUVdCQlNCUGpmWWtyQWZkNTljdEt0enF1ZjJOR0F2K2pBTEJnTlZIUThFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekNCamdZRFZSMGpCSUdHTUlHRGdCU0JQamZZa3JBZmQ1OWN0S3R6cXVmMk5HQXYrcUZvcEdZd1pERUxNQWtHQTFVRUJoTUNVMFV4CkZEQVNCZ05WQkFvVEMwRmtaRlJ5ZFhOMElFRkNNUjB3R3dZRFZRUUxFeFJCWkdSVWNuVnpkQ0JVVkZBZ1RtVjBkMjl5YXpFZ01CNEcKQTFVRUF4TVhRV1JrVkhKMWMzUWdVSFZpYkdsaklFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVAzRlVyNApKTm9qVmhhVGR0MDJLTG11RzdqRDhXUzZJQmg0bFNrblZ3VzhmQ3IwdVZGVjJvY0MzZzhXRnpINHFua3VDUk83cjdJZ0dSTGxrL2xMCitZUG9STld5UVNXL2lIVnYveEQ4U2xUUVgvRDY3elp6ZlJzMlJjWWhiYlFWdUU3UG5GeWxQVm9BamdialBHc3llL0tmOExiOTMvQW8KR0Vqd3hyelF2elNBbHNKS3NXMk94NUJGM2k5bnJFVUVvM3JjVlpMSlIyYllHb3pIN1p4T211QVN1N1ZxVElUaDRTSU5od0JrL294OQpZamxscHU5Q3RvQWxFbUVCcUNRVGNBQVJKbC82TlZERlNNd0dSK2duMkhDTlgyVG1vVVFtWGlMc2tzMy9RcHBFSVcxY3hlTWlIVjlICkV1Zk9YMTM2MktxeE15M1pkdkpPT2pNTUs3TXRrQVk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFkZFRydXN0IFF1YWxpZmllZCBDZXJ0aWZpY2F0ZXMgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIakNDQXdhZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJuTVFzd0NRWURWUVFHRXdKVFJURVVNQklHQTFVRUNoTUwKUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU013SVFZRFZRUURFeHBCWkdSVQpjblZ6ZENCUmRXRnNhV1pwWldRZ1EwRWdVbTl2ZERBZUZ3MHdNREExTXpBeE1EUTBOVEJhRncweU1EQTFNekF4TURRME5UQmFNR2N4CkN6QUpCZ05WQkFZVEFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVWNuVnpkQ0JCUWpFZE1Cc0dBMVVFQ3hNVVFXUmtWSEoxYzNRZ1ZGUlEKSUU1bGRIZHZjbXN4SXpBaEJnTlZCQU1UR2tGa1pGUnlkWE4wSUZGMVlXeHBabWxsWkNCRFFTQlNiMjkwTUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNUI2YS90d0pXb2VrbjBlK0VWK3ZoRFRiWWp4NWVMZnBNTFhzREJ3cXhCYi80T3h4CjY0cjFFVzd0VHcyUjBoSVlMVWtWQWNLa0loUEhFV1QvSWhLYXVZNWNMd2pQY1dxelp3Rlo4VjFHODdCNHBmWU9RbnJqZnh2TTBQQzMKS1AwcTZwNnpzTGtFcXYzMng3U3h1Q3FnKzFqeEdhQnZjQ1YrUG1sS2Z3OGkyTyt0Q0JHYUtabmhxa1JGbWhKZVBwMXRVdnpub0QxbwpML0JMY0h3VE9LMjhGU1h4MXM2cm9zQXgxaStmNFA4VVdmeUVrOW1IZkV4VUUrdWYwUzBSK0JnNk90NGwyZmZUUU8ya0JoTEVPK0dSCndWWTE4QlRjWlRZSmJxdWtCOGMxMGNJRE16WmJkU1p0UXZFU2EwTnZTM0dVK2pRZDdSTnV5b0IvbUM5c3VXWFk2UUlEQVFBQm80SFUKTUlIUk1CMEdBMVVkRGdRV0JCUTVsWXRpaTF6SjFJQzZXQStYUHhVSVE4eVlwekFMQmdOVkhROEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96Q0JrUVlEVlIwakJJR0pNSUdHZ0JRNWxZdGlpMXpKMUlDNldBK1hQeFVJUTh5WXA2RnJwR2t3WnpFTE1Ba0dBMVVFCkJoTUNVMFV4RkRBU0JnTlZCQW9UQzBGa1pGUnlkWE4wSUVGQ01SMHdHd1lEVlFRTEV4UkJaR1JVY25WemRDQlVWRkFnVG1WMGQyOXkKYXpFak1DRUdBMVVFQXhNYVFXUmtWSEoxYzNRZ1VYVmhiR2xtYVdWa0lFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUJtcmRlcjRpMlZobFJPNmFRVHZoc29Ub01lcVQyUWJQeGoycUMwc1ZZOEZ0ekRxUW1vZHdDVlJMYWUvRExQdDd3aC9iRHhHCkd1b1lROTkyelBsbWhwd3NhUFhwRi9neHN4akUxa2g5STB4b3dYNjdBUlJ2eGRsdTNyc0VRbXI0OWx4OTVkcjZoK3NOTlZKbjBKNlgKZGdXVFA1WEhBZVpwVlRoL0VHR1p5ZU5mcHNvK2dtTklxdUlJU0Q2cThyS0ZZcWEwcDltOU41eG90UzFXZmJDM1A2Q3hCOWJwVDl6ZQpSWEV3TW44YkxnbjV2MUtoN3NLQVBnWmNMbFZBd1J2MWNFV3czRjM2OW5KYWQ5Smp6YzlZaVFCQ1l6OTVPZEJFc0lKdVFSbm8zZURCCmlGclJIbkdUSHlRd2RPVWVxTjQ4SnpkL2c2NmVkOC93TUxIL1M1bm94cUU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVrVENDQTNtZ0F3SUJBZ0lFUld0UVZEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnNERUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlYKQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4T1RBM0JnTlZCQXNUTUhkM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FYTWdhVzVqYjNKdwpiM0poZEdWa0lHSjVJSEpsWm1WeVpXNWpaVEVmTUIwR0ExVUVDeE1XS0dNcElESXdNRFlnUlc1MGNuVnpkQ3dnU1c1akxqRXRNQ3NHCkExVUVBeE1rUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTJNVEV5TnpJd01qTTAKTWxvWERUSTJNVEV5TnpJd05UTTBNbG93Z2JBeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdQpNVGt3TndZRFZRUUxFekIzZDNjdVpXNTBjblZ6ZEM1dVpYUXZRMUJUSUdseklHbHVZMjl5Y0c5eVlYUmxaQ0JpZVNCeVpXWmxjbVZ1ClkyVXhIekFkQmdOVkJBc1RGaWhqS1NBeU1EQTJJRVZ1ZEhKMWMzUXNJRWx1WXk0eExUQXJCZ05WQkFNVEpFVnVkSEoxYzNRZ1VtOXYKZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgpBTGFWdGtOQytzWnRLbTlJMzVSTU9WY0Y3c041RVVGb051M3MvcG9CajZFNEtQejNFRVptTGswZUdyRWFUc2JSd0pXSXNNbi9NWXN6CkE5dTNnM3MrSUlSZTdiSldLS2Y0NExsQWNUZkZ5MGNPbHlwb3dDS1ZZaFhiUjluMTBDdi9na3ZKclQ3ZVROdVFnRkEvQ1lxRUFPd3cKQ2owWXpmdjlLbG1hSTVVWExFV2VIMjVEZVcwTVhKaitTS2ZGSTBkY1h2MXU1eDYwOW1oRjBZYURXNktLamJIaktZRCtKWEdJcmI2OApqNnhTbGt1cVVZM2tFekVaNkU1Tm45dXNzMnJWdkRsVWNjcDZlbitRM1gwZGdObUJ1MWttd2hIKzVwUGk5NERrWmZzME53NHBnSEJOCnJ6aUdMcDUvVjYrZUY2N3JITXNvSVYrMkhOam5vZ1FpK2RQYTJNc0NBd0VBQWFPQnNEQ0JyVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFyQmdOVkhSQUVKREFpZ0E4eU1EQTJNVEV5TnpJd01qTTBNbHFCRHpJd01qWXhNVEkzTWpBMQpNelF5V2pBZkJnTlZIU01FR0RBV2dCUm9rT1JucEtaVGdNZUdacVR4OTB0RCs0UzliVEFkQmdOVkhRNEVGZ1FVYUpEa1o2U21VNERICmhtYWs4ZmRMUS91RXZXMHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWamN1TVRvMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQ1QxREN3MXdNZ0t0RDVZK2lSREFVZ3FWOFp5bnR5VHRTeDI5Q1crMVJhR1N3TUNQZXl2SVdvblg5dE8xS3pLdHZuMUlTTQpZL1lQeXlZQmtWQnM5RjhVNHBOMHdCT2VNRHBRNDdSZ3hSendJa1NOY1Vlc3lCcko2WnVhQUdBVC8zQitYeEZOU1J1ekZWSjd5VlRhCnY1MlZyMnVhMko3cDhlUkRqZUlSUkRxL3I3MkRRbk5TaTZxN3B5blA5V1FjQ2szUnZLcXNueXJRLzM5LzJuM3FzZTB3SmNHRTJqVFMKVzNpRFZ1eWNOc01tNGhIMlowa2RrcXVNKyt2L2V1NkZTcWRRZ1BDblhFcVVMbDhGbVR4U1FlRE50R1BQQVVPNm5JUGNqMkE3ODFxMAp0SHV1Mmd1UU9IWHZnUjFtMHZkWGNEYXp2L3dvcjNFbGhWc1QvaDUvV3JROAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpSU0EgU2VjdXJpdHkgMjA0OCB2Mwo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFlUQ0NBa21nQXdJQkFnSVFDZ0VCQVFBQUFud0FBQUFLQUFBQUFqQU5CZ2txaGtpRzl3MEJBUVVGQURBNk1Sa3dGd1lEVlFRSwpFeEJTVTBFZ1UyVmpkWEpwZEhrZ1NXNWpNUjB3R3dZRFZRUUxFeFJTVTBFZ1UyVmpkWEpwZEhrZ01qQTBPQ0JXTXpBZUZ3MHdNVEF5Ck1qSXlNRE01TWpOYUZ3MHlOakF5TWpJeU1ETTVNak5hTURveEdUQVhCZ05WQkFvVEVGSlRRU0JUWldOMWNtbDBlU0JKYm1NeEhUQWIKQmdOVkJBc1RGRkpUUVNCVFpXTjFjbWwwZVNBeU1EUTRJRll6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBdDQ5VmNkS0EzWHRwZWFmd0dGQXlQR0puOWdxVkI5M21HL09lMmRKQlZHdXRuM3krR2MzN1JxdEJhQjRZNmxYSUw1RjRpU2o3Ckp5bGcvOStQakR2SlNadTFwSlRPQWVvK3RXTjdmeWI5R2QzQUliMkUwUzFQUnNOTzNOZzNPVHNvcjh1ZEd1b3JyeUdsd1NNaXVMZ2IKV2hPSFY0UFI4Q0RuNkU4alFyQUFwWDJKNmVsaGM1U1ljU2E4TFdyZzkwM3c4YllxT0RHQkRTbmhBTUZSRDB4UytBUmFxbjF5MDdpSApLcnRqRUFNcXM2RlBEVnBlUnJjOUR2VjA3Sm1mK1Qwa2dZaW0zV0JVNkpVMlBjWUprNXFqRW9BQVZaa1pSNzNRcFh6RHV2c2Y5L1VQCitLeTV0ZlEzbUJNWTNvVmJ0d3lDTzRkdmxUbFlNTnB1QVdnWElzekFDd0lEQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC8KTUE0R0ExVWREd0VCL3dRRUF3SUJCakFmQmdOVkhTTUVHREFXZ0JRSHcxRXdwS3JwUmE0MUpQci9KQ3d6MExHZGpEQWRCZ05WSFE0RQpGZ1FVQjhOUk1LU3E2VVd1TlNUNi95UXNNOUN4bll3d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGOCtoblp1dURVOFRqWWNIbm1ZCnYvM1ZFaEY1VWc3dU1ZbTgzWC81MGNZVkllaUtBVlFOT3Z0VXVkWmoxTEdxbGsyaVFrM1VVeCtMRU41L1piNWdFeWR4aUtSejQ0UmoKMGFSVjRWQ1Q1aHNPZWRCbnZFYkl2ejhYRFpYbXhwQnAzdWUwTDk2VmZkQVNQejArZjAwL0ZHajFFVkRWd2ZTUXBRZ2RNV0QvWUl3agpWQXF2L3FGdXhkRjZLbWg0eng2Q0NpQzBINjNsaGJKcWFIVk9yU1UzbElXK3ZhSFU2cmNNU3p5ZDZCSUE4RitzRGVHc2NHTno5Mzk1Cm56SWxRblFGZ0NpL3ZjRWtsbGdWc1JjaDZZbEwyd2VJWi9RVnJYQStMMDJGTzhLMzIvNllhQ09KNFhRUDN2VEZoR01wRzh6TEI4a0EKcEtuWHdpSlBaOWQzN0NBRllkND0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2VvVHJ1c3QgR2xvYmFsIENBCj09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFZEQ0NBanlnQXdJQkFnSURBalJXTUEwR0NTcUdTSWIzRFFFQkJRVUFNRUl4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRSwpFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Sc3dHUVlEVlFRREV4SkhaVzlVY25WemRDQkhiRzlpWVd3Z1EwRXdIaGNOTURJd05USXhNRFF3Ck1EQXdXaGNOTWpJd05USXhNRFF3TURBd1dqQkNNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWoKTGpFYk1Ca0dBMVVFQXhNU1IyVnZWSEoxYzNRZ1IyeHZZbUZzSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQTJzd1lZekQ5OUJjakdsWitXOTg4YkRqa2NiZDRrZFM4b2RoTStLaER0Z1BwVFNFSENJamFXQzltT1NtOUJYaUxuVGpvCkJiZHFmbkdrNXNSZ3ByRHZnT1NKS0ErZUpkYnRnL090cHBISG1NbENHRFVVbmEyWVJwSXVUOHJ4aDBQQkZwVlhMVkR2aVMyQWVsZXQKOHU1ZmE5SUFqYmtVK0JRVk5kbkFScU43Y3NpUnY4bFZLODNRbHo2Y0ptVE0zODZER1hIS1R1YlUxWHVwR2MxVjNzanMwbDQ0VStWYwpUNHd0L2xBak52eG01c3VPcERrWkFMZVZBam1SQ3c3K09DN1JIUVdhOWswK2J3OEhIYThzSG85Z09lTDZObE1UT2RSZUppdmJQYWdVCnZUTHJHQU1vVWdSeDVhc3pQZUU0dXdjMmhHS2NlZW9XTVBSZndDdm9jV3ZrK1FJREFRQUJvMU13VVRBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01CMEdBMVVkRGdRV0JCVEFlcGhvalluN3F3VmtEQkY5cW4xbHVNck1UakFmQmdOVkhTTUVHREFXZ0JUQWVwaG9qWW43cXdWawpEQkY5cW4xbHVNck1UakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBTmVNcGF1VXZYVlNPS1ZDVW41a2FGT1NQZUNwaWxLSW5aNTdRCnp4cGVSK25Cc3FUUDNVRWFCVTZiUys1S2IxVlNzeVNoTndyclpIWXFMaXp6L1R0MWtMLzZjZGpIUFRmU3RRV1ZZcm1tM29rOU5uczQKZDBpWHJLWWdqeTZteVF6Q3NwbEZBTWZPRVZFaUl1Q2w2cllWU0FsazZsNVBkUGNGUHNlS1VnemJGYlM5Ylp2bHhyRlVhS25qYVpDMgptcVVQdUxrL0lIMnVTclc0bk9RZHRxdm1sS1hCeDRPdDIvVW5odzRFYk5YLzNhQmQ3WWRTdHlzVkFxNDVwbXAwNmRyRTU3eE5OQjZwClhFMHpYNUlKTDRobVhYZVh4eDEyRTZuVjVmRVdDUkUxMWF6YkpIRndMSmhXQzlrWHROSGpVU3RlZGVqVjBOeFBOTzNDQldhQW9jdm0KTXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHZW9UcnVzdCBHbG9iYWwgQ0EgMgo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFpqQ0NBazZnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkVNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTgpSMlZ2VkhKMWMzUWdTVzVqTGpFZE1Cc0dBMVVFQXhNVVIyVnZWSEoxYzNRZ1IyeHZZbUZzSUVOQklESXdIaGNOTURRd016QTBNRFV3Ck1EQXdXaGNOTVRrd016QTBNRFV3TURBd1dqQkVNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWoKTGpFZE1Cc0dBMVVFQXhNVVIyVnZWSEoxYzNRZ1IyeHZZbUZzSUVOQklESXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9JQkFRRHZQRTFBUFJEZk8xTUE0V2YrbEdBVlBvV0k4WWtOa01nb0k1a0Y2Q3NnbmNiellFYll3YkxWakRIWjNDQjVKSUcvCk5UTDhZMm5ic1NwcjdpRlk4Z2pwZU10dnkvd1dVc2lSeFA4OWM5NnhQcWZDZldiQjlYNVNKQnJpMVdlUjBJSVExM2hMVHl0Q09iMWsKTFVDZ3NCRFRPRWhHaUtFTXV6b3pLbUtZK3dDZEUxbC9ienR5cXU2bUQ0YjVCV0hxWjM4TU41YUw1bWtXUnhIQ0oxa0RzNlpnd2lGQQpWdnFneDMwNkUrUHNWOGV6MXE2ZGlZRDNBZWNzOXBZckV3MTVMTm5BNUlaN1M0d01jb0tLK3hmTkFHdzZFenl3aElkTEZub3Bzay9iCkhkUUw4MlkzdmRqMlY3dGVKSHE0UEl1NStwSWFHb1NlMkhTUHFodC9YdlQrUlNJaEFnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGSEU0TnZJQ01WTkhLMjY2WlVhcEVCVllJQVVKTUI4R0ExVWRJd1FZTUJhQUZIRTROdklDTVZOSApLMjY2WlVhcEVCVllJQVVKTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBQS9lMUs2dGRFUHg3CnNySmVySnNPZmxONFdUNUNCUDUxbzYyc2dVN1hBb3RleEMzSVVuYkhMQi84Z1RLWTBVdkdrcE16TlRFdi9OZ2RSTjNnZ1grZDZZdmgKWkpGaUN6a0lqS3gwblZuWmVsbFNseEc1Rm50dlJkT1cyVEY5QWpZUG5EdHV6eXdOQTBaRjY2RDBmMGhFeGdoQXpONGJjTFVwcmJxTApPelJsZFJ0eElSMHNGQXF3bHBXNDF1cnlaZnNwdWsvcWtaTjBhYmJ5LytFYTBBelJkb1hMaWlXOWwxNHNieFdaSnVlMktmOGk3TWtDCngxWUF6VW01czJ4N1V3UWE0cWpKcWhJRkk4TE81N3NFQXN6QVI2TGt4Q2t2VzBWWGlWSHVQT3RTQ1A4SE5SNmZOV3BIU2xhWTBWcUYKSDR6MUlyK3J6b1B6NGlJcHJuMkRRS2k2YkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHZW9UcnVzdCBVbml2ZXJzYWwgQ0EKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYURDQ0ExQ2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCRk1Rc3dDUVlEVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OClIyVnZWSEoxYzNRZ1NXNWpMakVlTUJ3R0ExVUVBeE1WUjJWdlZISjFjM1FnVlc1cGRtVnljMkZzSUVOQk1CNFhEVEEwTURNd05EQTEKTURBd01Gb1hEVEk1TURNd05EQTFNREF3TUZvd1JURUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdQpZeTR4SGpBY0JnTlZCQU1URlVkbGIxUnlkWE4wSUZWdWFYWmxjbk5oYkNCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQCkFEQ0NBZ29DZ2dJQkFLWVZWYUNqeHVBZmpKMGhVTmZCdml0YnRhU2VvZGx5V0wwQUcweS9ZY2tVSFVXQ3E4WWRnTlk5NnhDY09xOXQKSlBpOGNRR2VCdlY4WHg3QkRsWEtnNXBaTUs0Wnl6QklsZTBpTjQzMFNwcHlaajZ0bGNEZ0ZnRGdFQjhyTVE3WGxGVFRRak9nTkIwZQpSWGJkVDhvWU4reUZGWG9aQ1B6Vng1enc4cWt1RUttUzVqMVlQYWtXYUR3dmRTRVlmeWgzcGVGaEY3ZW02ZmdlbWR0emJ2UUtvaUZzCjd0cXFoWkptci9aNmE0TGF1aUlJTlEvUFF2RTErbXJ1ZmlzbHpEb1I1RzJ2YzdKMkhhM1FzbmhuR3FRNUhGRUxaMWFEL1RoZERjN2QKOExzcmxoL2VlekpTL1IyN3RRYWhzaUZlcGRhVmFIL3dtWjdjUlFnKzU5SUpEVFdVM1lCT1U1Zlh0UWxFSUdRV0Z3TUNURk1OYU43VgpxbkpOazIyQ0R0dWN2YyswODF4ZFZIcHBDWmJXMnhIQmpYV290TTg1eU00OHZDUjg1bUxLNGIxOXA3MVhaUXZrL2lYdHRta1EzQ2dhClJyMEJIZENYdGVHWU84QTNaTlk5bE80TDRmVW9yZ3RXdjNHTEl5bEJqb2JGUzFKNzJIR3JING9WcGp1RFd0ZFlBVkhHVEVIWmY5aEIKWjNLaUtOOWdnNm1leUh2OFUzTnlXZldUZWhkMkRzNzM1VnpaQzFVMG9xcGJ0V3BVNXhQS1YreVhiZlJlQmk5RmkxalVJeGFTNUJadQpLR05aTU45UUFaeGppUnFmMnhlVWduQTN3eVNlbWtmV1dzcE9xR21KY2grUmJOdCtuaHV0eHg5ejNTeFBHV1g5ZjVOQUVDN1M4TzA4Cm5pNG9QbWttTThWN0FnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcTdMcXF3RExpSUpsRjAKWEcwRDA4RFlqM3JXTUI4R0ExVWRJd1FZTUJhQUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQTRHQTFVZER3RUIvd1FFQXdJQgpoakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBTVhqbXg3WGZ1SlJBeVhIRXFEWHNSaDNDaGZNb1dJYXdDL3lPc2ptUFJGV3JaSVJjCmFhblFtamc4K3VVZk5lVkU0NEI1bEdpa3U4U2ZQZUUwelRCR2kxUXJsYVh2OXorWmhQMDE1czh4eHR4cXY2ZlhJd2pobUY3RFdnaDIKcWFhdmR5KzNZTDFFUm1ydmwvOXpsY0dPNkpQNy9URzM3RmNSRVVXYk1QRWFpRG5CVHp5bkFOWEgvS3R0Z0NKd3BRemdYUVFwQXZ2TApvSkhSZk5iRGZsRFZuVmkrUVRqcnVYVThGZG1ieVVxRFdjRGFVLzB6dXpZWW00VVBGZDN1TGF4Mms3blpBWTFJRUtqNzlUaUc4ZHNLCnhyMkVveU5CM3RaM2I0WFVoUnhRNEs1UmlycU5QbmJpdWNvbjhsK2Y3MjVaRFFiWUt4ZWswbnhydTE4VUdraVBHa3puczBjY2preEYKS3lEdVNOL24zUW1PR0tqYVFJMlNKaEZUWVhOZDY3M254RTBwTjJIcnJEa3RaeTRXMXZVQWc0V2h6SDkyeEgza3QwdG03d05GWUdtMgpERktXa29SZXBxTzFwRDRyMmN6WUcwZXE4a1RhVC9rRDZQQVV5ei96Zzk3UXdWVGp0K2dLTjAyTElGa0RNQm1oTE1pOUVSL2Zyc2xLCnhmTW5abWFHckdpUi85bm1VeHdQaTF4cFpRb215QjQwdzExUmU5ZXBuQWFoTnQzVmlaUzgyZVF0REY0SmJBaVhmS005ZkpQL1A2RVUKcDgrMVhldmIyeHpFZHQrSXViMUZCWlVicnZ4R2FreXZTT1BPcmcvU2Z1dm1iSnhQZ1dwNlpLeTdQdFhueTNZdXhhZEl3VnlRRDh2SQpQL3JtTXVHTkcyK2s1bzdZK1NsSWlzNXovaXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFVuaXZlcnNhbCBDQSAyCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYkRDQ0ExU2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCSE1Rc3dDUVlEVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OClIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjFjM1FnVlc1cGRtVnljMkZzSUVOQklESXdIaGNOTURRd016QTAKTURVd01EQXdXaGNOTWprd016QTBNRFV3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZwpTVzVqTGpFZ01CNEdBMVVFQXhNWFIyVnZWSEoxYzNRZ1ZXNXBkbVZ5YzJGc0lFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBCkE0SUNEd0F3Z2dJS0FvSUNBUUN6VkZMQnlUN3kyZHl4VXhwWktlZXh3MFVvNWRmUjdjWEZTNkdxZEh0WHIwb20vTmoxWHFkdUdkdDAKREU4MVd6SUxBZVBiNjNwM05lcXFXdURXNktGWGxQQ1FvM1JXbEVRd0F4NWNUaXVGSm5TQ2VneDJvRzlOemtFdG9CVUdGRiszUXMxNwpqMWhoTk53cUNQa3V3d0dtSWtRY1RBZUM1bHZPMEVwOEJOTVpjeWZ3cXBoL0xxOU82NGNlSkhkcVhiYm9XMFc2M01PaEJXOVdqbzhRCkpxVkp3eTdYUVljaTRFK0d5bUMxNnFGandBR1hFSG05QUR3U2JTc1ZzYXhMc2U0WXVVNlczTngyL3p1K3oxOER3UHc3Nkw1R0cvL2EKUU1KUzkvN2pPdmRxZHpYUTJvM3JYaGhxTWNjZXVqd2JLTlpyVk1hcVc5ZWlMQnNaektJQzlwdFp2VGRyaHJWdGdyclk2c2xXdktrMgpXUDArR2ZQdERDYXBremo0VDhGZElnYlFsK3JocmNaVjRJRXJLSU02K3ZSN0lWRUF2bEk0enMxbWVhajBnVmJpMElNSlIxRmJVR3JQCjIwZ2FYVDczeS9abDkyenhsZmdDT3pKV2dqbDZXNzB2aVJ1L29iVG8vMytOak44RDhXQk9XQkZNNjZNL0VDdURtZ0Z6MlpSdGhBQW4KWnF6d2NFQUpRcEt0VDVNTllRbFJKTmlTMVF1VVliS0hzdTMvbWpYL2hWVEs3VVJEckJzOEZtdElTZ29jUUlnZmtzSUxBQVgvOHNnQwpTcVNxcWN5Wmxwd3ZXT0I5NGI2N0I5eGZCSEpjTVRURDdGOHQ0RDFra0NMbTBleTRMdDFacnRtaE43OVVOZHh6TWsrTUJCNHpzc2xHCjhkaGN5RlZReVdpOXFMbzJDUUlEQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlIyODFYaCtxUTIKKy9DZlhHSng3VHowUnpnUUt6QWZCZ05WSFNNRUdEQVdnQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBT0JnTlZIUThCQWY4RQpCQU1DQVlZd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFHYkJ4aVB6MmVBdWJsL296NjZ3c0NWTksvZzdXSnRBSkRkYXk2c1dTZit6CmRYa3pvUzl0Y0JjMGtmNW5mby9zbStWZWdxbFZIeS9jMUZFSEV2NnNGajRzTmNaai9Od1E2dzJqcXRCOHpOSFFMMUV1eEJSYTN1Z1oKNFQ3R3pLUXA1eTZFcWdZd2VIWlVjeWlZV1RqZ0FBMWkwMEo5SVordVBUcU0xZnAzRFJnckZnNWZOdUg4S3JVd0pNL2dZd3g3V0JyKwptYnBDRXJHUjlIeG80c2pvcnl6cXlYNnV1eW85RFJYY05KVzJHSFNvYWcvSHRQUVR4T1JiN1FyU3BKZE1LdTB2YkJLSlBmRW5jS3BxCkExSWhuMENvWjFEeTgxb2YzOThqOXR4NFR1YVlUMVU2VStQdjh2U2Z4M3pZV0s4cElwZTQ0TDJSTHJCMjdGY1J6KzhwUlBQcGhYcGcKWStSZE00a1gyVEdxMnRiekdEVnl6NGNyTDJNamhGMkVqRDlYb0lqOG1aRW9KbW1aMUkrWFJMNk8xVWl4cENncDhSVzA0ZVdlM2ZpUApwbThtMXdrOE9od1JEcVpzTi9ldFJJY3NLTWZZZElLejBHOUtWN3MxS1NlZ2krZ2hwNGRrTmwzTTJCYXN4N0luUUpKVk9DaU5VVzdkCkZHZFRiSEZjSm9STmRWcTJmbUJXcVUydCs1c2VsL01OMmRLWFZIZmFQUkszNEI3dkNBYXMrWVdINmFMY3IzNFlFb1A5VmhkQkx0VXAKZ24yWjlESDJjYW5QTEFFbnBRVzVxckpJVGlydm41TlNVWlU4VW5PT1Zrd1hRTUFKS09TTGFraFQyK3pOVlZYeHh2anBvaXhNcHRFbQpYMzZ2V2t6YUg2YnlIQ3grcmdJVzBsYlFMMWRUUitpUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBbWVyaWNhIE9ubGluZSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcERDQ0FveWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SlZVekVjTUJvR0ExVUVDaE1UClFXMWxjbWxqWVNCUGJteHBibVVnU1c1akxqRTJNRFFHQTFVRUF4TXRRVzFsY21sallTQlBibXhwYm1VZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F4TUI0WERUQXlNRFV5T0RBMk1EQXdNRm9YRFRNM01URXhPVEl3TkRNd01Gb3dZekVMTUFrRwpBMVVFQmhNQ1ZWTXhIREFhQmdOVkJBb1RFMEZ0WlhKcFkyRWdUMjVzYVc1bElFbHVZeTR4TmpBMEJnTlZCQU1UTFVGdFpYSnBZMkVnClQyNXNhVzVsSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ01UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dFUEFEQ0NBUW9DZ2dFQkFLZ3Y2S1JwQmdOSHcra3FtUDhab25DYXhsQ3lmcVhmYUUwYmZBKzJsMmg5TGFhTGwrbGtoc21qNzZDRwp2MkJsbkV0VWlNSkl4VW81dnhUaldWWGxHYlIweUxRRk9Wd1dwZUtWQmVBU3JsbUxvak5vV0J5bTFCVzMySi9YM0hHcmZwcS9tNDR6CkR5TDlIeTduQnpidllqbkYzY3U2SlJRajNnekdQVHpPZ2dqbVpqN2FVVHNXT3FNRmY2RGNoOVdjL0hLcG9IMTQ1TGN4VlI1bHU5UmgKc0NGZzdSQXljc1dTSlI3NGtFb1llRWZmZmpBM1BsQWIyeHpUYTVxR1V3ZXc3NndHZVBpRW1mNGhqVXlBdGd5QzltWndlUnJUVDZQUAo4YzlHc0VzUFB0MklZcmlNcVFrb08zckhsK0VlNWZTZndNQ3VKS0RJb2RrUDFuc21nbWt5UGFjQ0F3RUFBYU5qTUdFd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBSzNaby9aNTltNTBxWDh6UFlFWDEwelBNOTR3SHdZRFZSMGpCQmd3Rm9BVUFLM1oKby9aNTltNTBxWDh6UFlFWDEwelBNOTR3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUI4aXRFZgpHRGVDNExpd28rMVdsY2hpWVp3Rm9zM0NZaVpoelJBVzE4eTBaVFRRRVlxdHFLa0ZadTkwODIxZm5abXY5b3Y3NjFLeUJaaWlieXJGClZMMGx2Vit1eUlicVJpekJzNzNCNlVsd0dCYVhDQk9NSU9BYkxqcEh5eDdrQURDVlcvUkZvOEFhc0FGT3E3M0FJMjVqUDRCS3hRZnQKM09Kdng4Rmk4ZU55MWdUSWRHY0wrb2lyb1FISWIvQVVyOUtaelZHVGZ1MHVPTWU5emtaUVBYTGplU1dkbTRnckVDRGRwYmd5bjQzZwpLZDhoZElhQzJ5K0NNTWJITllheitaWmZSdHNNUmYzelVNTnZ4c05JclVhbTRTZEhDaDBPbTdiQ2QzOWo4dUI5R3I3ODROL1h4NmRzCnNQbXV1ano5ZExRUjZGZ05nTHpUcUlBNm1lMTF6RVo3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFtZXJpY2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZwRENDQTR5Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJqTVFzd0NRWURWUVFHRXdKVlV6RWNNQm9HQTFVRUNoTVQKUVcxbGNtbGpZU0JQYm14cGJtVWdTVzVqTGpFMk1EUUdBMVVFQXhNdFFXMWxjbWxqWVNCUGJteHBibVVnVW05dmRDQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXlNQjRYRFRBeU1EVXlPREEyTURBd01Gb1hEVE0zTURreU9URTBNRGd3TUZvd1l6RUxNQWtHCkExVUVCaE1DVlZNeEhEQWFCZ05WQkFvVEUwRnRaWEpwWTJFZ1QyNXNhVzVsSUVsdVl5NHhOakEwQmdOVkJBTVRMVUZ0WlhKcFkyRWcKVDI1c2FXNWxJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0lQQURDQ0Fnb0NnZ0lCQU14QlJSM3BQVTBROW95eFFjbmdYc3NOdDc5SGM5UHdWVTNkeGd6NnNXWUZhczE0dE53QzIwNkI4OWVuCmZIRzhkV09nWGVNSERFanNKY1FESVBUL0Rqc1MvNXVONGNiVkc3UnRJdU94MjM4aFpLK0d2RmNpS3RaSGdWZEVnbFpUdllZVUFRdjgKZjNTa1dxN3h1aEcxbTFoYWdMUTNlQWt6ZkRKSEExekVwWU5JOUZkV2JvRTJKeGhQN0pzb3d0UzAxM3dNUGd3cjM4b0UxOGFPNmxoTwpxS1NsR0J4c1JaaWpRZEV0MHNkdGpSbnhyWG0zZ1QrOUJvSW5MUkJZQmJWNEJia3Yyd3hya0pCK0ZGazR1NVFrRStYUm5SVGYwNEpOClJ2Q0FPVkl5RCtPRXNucEQ4bDdlWHo4ZDNlT3lHNkNoS2lNRGJpNEJGWWRjcG5WMXg1ZGh2dDZHM05SSTI3MHF2MHBWMnVoOVVQdTAKZ0JlNGxMOEJQZXJhdW56Z1dHY1h1VmpnaUlaR1oyeWRFRWRZTXRBMWZIa3FrS0phRUJFak5hMHZ6T1JLVzZmSUovS0QzbDY3WG5mbgo2S1Z1WThJTlhXSFFqTkpzV2lFT3lpaWp6aXJwbGNkSXo1WnZIWklseU1iR3djRU1CYXdteE5KMTB1RXFaOEE5VzZXYTY4OTdHcWlkCkZFWGxENkNhWmQ0dktMM09iNVJtZzBncDJPcGxqSytUMldTZlZWY212Mi9MTnpHWm8yQzdISzJKTkRKaXVFTWhCbklNb1Z4dFJzWDYKS2M4dzNvbmNjVnZkdGpjKzMxRDF1QWNsSnVXOHRmNDhBck8zK0w1RHdZY1JsSjRqYkJlS3VJb25ERlJIOEttendJQ01vQ2ZySFJuagpCNDUzY01vcjlIMTI0SGhuQWdNQkFBR2pZekJoTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkUxRndXZzR1M09wCmFhRWc1KzMxSXFFakZOZWVNQjhHQTFVZEl3UVlNQmFBRkUxRndXZzR1M09wYWFFZzUrMzFJcUVqRk5lZU1BNEdBMVVkRHdFQi93UUUKQXdJQmhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFaMnNHdVY5Rk95cExNN1BtRzJ0WlRpTE11YmVrSmNtbnhQQlVsZ3RrODdGWQpUMTVSL0xLWGV5ZGx3dVhLNXcwTUpYdGk0L3FmdEllM1JVYXZnNldYU0l5bHZmRVdLNXQyTEhvMVlHd1JnSmZNcVpKUzVpdm1hZTJwCitEWXRMSGUvWVVqUll3dTVXMUx0R0xCRFFpS21zWGV1M21uRnpjY2NvYkdsSEJEN0dMNGFjTjNCa2t1K0tWcWRQelcrNVgxUitGWGcKSlhVamh4NWMzTHFkc0t5emFkc1hnOG4zM2d5OENOeVJucWpRMXhVM2M2VTF1UHgreFVSQUJzUHIrQ0tBWEVmT0F1TVJuMFQvL1pveQp6SDFrVVE3clZ5WjJPdU1lSWp6Q3BqYmRHZStuL0JMekpzQlpNWVZNbk5qUDM2VE16Q21ULzVSdGRsd1RDSmZ5N2FVTFRkM295V2dPClp0TUFEak1TVzd5VjVUS1FxTFBHYklPdGQrNkxmbjZ4cWF2VDRmRzJ3TEhxaU1EbjA1RHBLSktVZTJoN2x5b0taeTJGQWpnUTVBTmgKMU5vbE5zY0lXQzJocDFHdk1BcEo5YVpwaHdjdFJFWjJqaXJsbWp2WEdLTDhuRGdRek1ZNzByVVhPbS85cmlXOTlYSlpaTEYwS2poZgpHRXpmejNFRVdqYlV2eStabk9qWnVyR1Y1Z0pMSWFGYjFjRlBqNjVwYlZQYkFaTzFYQjRZM1dSYXloZ29QbU1FRWYwY2pRQVB1RGZmClo0cWRacWtDYXBIL0U4b3ZYWU84aDVOczNDUlJGZ1FsWnZxejJjSzZLYjZhU0RpQ21mUy9PMG94R2ZtL2ppRXpGTXBQVkYvN3p2dVAKY1gvOVhobWdEMHVSdU1SVXZBYXdSWThta2FLTy9xaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmlzYSBlQ29tbWVyY2UgUm9vdAo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb2pDQ0FvcWdBd0lCQWdJUUU0WTFUUjAvQnZMQitXVUYxWkFjWWpBTkJna3Foa2lHOXcwQkFRVUZBREJyTVFzd0NRWURWUVFHCkV3SlZVekVOTUFzR0ExVUVDaE1FVmtsVFFURXZNQzBHQTFVRUN4TW1WbWx6WVNCSmJuUmxjbTVoZEdsdmJtRnNJRk5sY25acFkyVWcKUVhOemIyTnBZWFJwYjI0eEhEQWFCZ05WQkFNVEUxWnBjMkVnWlVOdmJXMWxjbU5sSUZKdmIzUXdIaGNOTURJd05qSTJNREl4T0RNMgpXaGNOTWpJd05qSTBNREF4TmpFeVdqQnJNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tClZtbHpZU0JKYm5SbGNtNWhkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnYKYlcxbGNtTmxJRkp2YjNRd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2Vjk1V0htNmgybUN4bENmTApGOXNIUDRDRlQ4aWN0dEQwYjAvUG1kamgyOEpJWERxc09UUEhIMnFMSmowck5mVklzWkhCQWs0RWxwRjdzRFB3c1JST0VXKzFRSzhiClJhVks3MzYyclBLZ0gxZy9Fa1pnUEkyaDRIM1BWejR6SHZ0SDhhb1Zsd2RWWnFXMUxTN1lnRm15cHcyM1J1d2hZLzgxcTZVQ3p5cjAKVFA1NzlaUmRoRTJvOG1DUDJ3NGxQSjl6Y2MrVTMwcnEyOTl5T0l6emxyM3hGN3pTdWp0RldzYW45c1lYaXdHZC9CbW9Lb01XdURwSQovazQrb0tzR0dlbFQ4NEFUQiswdHZ6OEtQRlVnT1N3c0FHbDBsVXE4SUxLcGVlVVlpWkdvM0J4Tjc3dCtOd3RkL2ptbGlGS01BR3pzCkdIeEJ2ZmFMZFhlNllKMkU1LzR0QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUcKTUIwR0ExVWREZ1FXQkJRVk9JTVBQeXcvY0RNZXpVYitCNHdnNE5mRHR6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFYL0ZCZlh4YwpDTGtyNE5XU1IvcG5YS1VUd3dNaG15dE1pVWJQV1UzSi9xVkF0bVBOM1hFb2xXY1J6Q1NzMDBSc2NhNEJJR3NEb284WXR5azZmZVVXCllGTjRQTUN2RllQM2oxSXpKTDFrazVmdWkvZmJHS2h0Y2JQM0xCZlFkQ1ZwOS81clBKUytUVXRCakU3aWM5RGprQ0p6UTgzejcrcHoKemtXS3NLWkovMHg5blhHSXhIWWRrRnNkN3YzTTkrNzlZS1d4ZWhaeDBSYlFmQkk4YkdtWDI2NWZPWnB3THdVOEdVWUVtU0EyMEdCdQpZUWE3RmtLTWNQY3crK0RiWnFNQUFiM21MTnFSWDZCR2kwMXFuRDA5M1FWRy9uYS9vQW84NUFEbUo3Zi9oQzNldWlJbmxoQng2eUx0CjM5OHpuTS9qcmE2TzFJN21UMUd2RnBMZ1hQWUhEdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNlcnR1bSBSb290IENBCj09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlERERDQ0FmU2dBd0lCQWdJREFRQWdNQTBHQ1NxR1NJYjNEUUVCQlFVQU1ENHhDekFKQmdOVkJBWVRBbEJNTVJzd0dRWURWUVFLCkV4SlZibWw2WlhSdklGTndMaUI2SUc4dWJ5NHhFakFRQmdOVkJBTVRDVU5sY25SMWJTQkRRVEFlRncwd01qQTJNVEV4TURRMk16bGEKRncweU56QTJNVEV4TURRMk16bGFNRDR4Q3pBSkJnTlZCQVlUQWxCTU1Sc3dHUVlEVlFRS0V4SlZibWw2WlhSdklGTndMaUI2SUc4dQpieTR4RWpBUUJnTlZCQU1UQ1VObGNuUjFiU0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTZ4CndTN1RUM3pOSmM0WVBrL0VqRytBYW5QSVcxSDRtOUxjdXdCY3NhRDhkUVB1Z2ZDSTdpTlM2ZVlWTTQyc0xRbkZkdmtyT1lDSjVKZEwKa0tXb2VQaHpRM3VrWWJEWVdNemhiR1orblBNSlhsVmpoTldvNy9PeExqQm9zOFE4Mkt4dWpabGFrRTQwM0RhYWo0R0lVTGR0bGtJSgo4OWVWZ3cxQlM3QnFhL2o4RDM1aW4yZkU3U1pmRUNZUENFL3dwRmNvem8rNDdVWDJidTRsWGFwdU9iN2treS9aUjZCeTYvcW1XNi9LClV6L2lEc2FXVmhGdTkrbG1xU2JZZjVWVDdRcUZpTHBQS2FWQ2pGNjIvSVVnQUtwb0M2RWFoUUdjeEVaamdvaTJJckh1L3FwR1dYN1AKTlN6VnR0cGQ5MGd6RkZTMjY5bHZ6czJJMXFzYjJwWTdIVmtDQXdFQUFhTVRNQkV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcQpoa2lHOXcwQkFRVUZBQU9DQVFFQXVJM083K2NVdXMvdXNFU1NiTFE1UHFLRWJxMjRJWGZTMUhlQ2grWWdRWUh1NHZnUnQyUFJGemUrCkdYWWtIQVFhVE9zOXFtZHZMZFROL21VeGNNVWJwZ0lLdW1CN2JWakNta24rWXpJTGErTTZ3S3lyTzdEbzB3bFJqQkNEeGpUZ3hTdmcKR3JaZ0ZDZHNNbmVNdkxKeW1NL056RCs1eUNSQ0ZOWlgvT1ltUTZrZDVZQ1F6Z05VS0Q3M1A5UDRUZTFxQ2pxVEU1czdGQ01UWTV3LwowWWNuZWVWTVVlTUJyWVZkR2p1eDFYTVFwTlB5dkc1azlWcFdrS2pIRGt4MER5NXhPL2ZJUi9ScGJ4WHlFVjZESHB4OFVxNzlBdG9TCnFGbG5HTnU4Y04yYnNXbnRnTTZKUUVocURqWEtLV1lWSVpRczZHQXFtNFZLUVBOcmlpVHNCaFlzY3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDb21vZG8gQUFBIFNlcnZpY2VzIHJvb3QKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTWpDQ0F4cWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCN01Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQXdTClIzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3dHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWcKVEdsdGFYUmxaREVoTUI4R0ExVUVBd3dZUVVGQklFTmxjblJwWm1sallYUmxJRk5sY25acFkyVnpNQjRYRFRBME1ERXdNVEF3TURBdwpNRm9YRFRJNE1USXpNVEl6TlRrMU9Wb3dlekVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnTUVrZHlaV0YwWlhJZ1RXRnVZMmhsCmMzUmxjakVRTUE0R0ExVUVCd3dIVTJGc1ptOXlaREVhTUJnR0ExVUVDZ3dSUTI5dGIyUnZJRU5CSUV4cGJXbDBaV1F4SVRBZkJnTlYKQkFNTUdFRkJRU0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUw1QW5mUnU0ZXAyaHh4TlJVU092a2JJZ3dhZHdTcitHQitPNUFMNjg2dGRVSW9XTVF1YUJ0REZjQ0xOU1MxVVk4eTJibWhHCkMxUHF5MHdrd0x4eVR1cnhGYTcwVkpvU0NzTjZzak5nNHRxSlZmTWlXUFBlM00vdmc0YWlqSlJQbjJqeW1KQkdoQ2ZIZHIvanpEVXMKaTE0SFpHV0N3RWl3cUpINVlaOTJJRkNva2NkbXRldDRZZ05XOElvYUUrb3hveDZnbWYwNDl2WW5NbGh2Qi9WcnVQc1VLNiszcXN6VwpZMTl6ak5vRm1hZzRxTXNYZURaUnJPbWU5SGc2amM4UDJVTGltQXlyTDU4T0FkN3ZuNWxKOFMzZnJIUk5HNWkxUjhYbEtkSDVrQmpICllweStnOGNtZXo2S0pjZkEzWjNtTldnUUlKMlAyTjdTdzRTY0RWN29MOGtDQXdFQUFhT0J3RENCdlRBZEJnTlZIUTRFRmdRVW9CRUsKSXo2VzhRZnM0cThwNzRLbGY5QXdwTFF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdld1lEVlIwZgpCSFF3Y2pBNG9EYWdOSVl5YUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHZRVUZCUTJWeWRHbG1hV05oZEdWVFpYSjJhV05sCmN5NWpjbXd3TnFBMG9ES0dNR2gwZEhBNkx5OWpjbXd1WTI5dGIyUnZMbTVsZEM5QlFVRkRaWEowYVdacFkyRjBaVk5sY25acFkyVnoKTG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFDRmI4QXZDYjZQK2srdFo3eGtTQXprL0V4ZllBV015bXRyd1VTV2dFZHVqbQo3bDNzQWc5ZzFvMVFHRThtVGdIajVyQ2w3cis4ZEZSQnYvMzhFcmpIVDFyMGlXQUZmMkMzQlVyejl2SEN2OFM1ZElhMkxYMXJ6Tkx6ClJ0MHZ4dUJxdzhNMEF5eDlsdDFhd2c2bkNwbkJCWXVyREMvelhEclBiRGRWQ1lmZVUwQnNXTy84dHF0bGJnVDJHOXc4NEZvVnhwN1oKOFZsSU1DRmxBMnpzNlNGejdKc0RvZUEzcmFBVkdJLzZ1Z0xPcHl5cEVCTXMxT1VJSnFzaWwyRDRrRjUwMUtLYVU3M3lxV2pnb203QwoxMnl4b3crZXYrdG81MWJ5cnZMakt6ZzZDWUcxYTRYWHZpM3RQeHEzc21QaTlXSXNndFJxQUVGUThUbURuNVhwTnBhWWJnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ29tb2RvIFNlY3VyZSBTZXJ2aWNlcyByb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVB6Q0NBeWVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQitNUXN3Q1FZRFZRUUdFd0pIUWpFYk1Ca0dBMVVFQ0F3UwpSM0psWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhEQWRUWVd4bWIzSmtNUm93R0FZRFZRUUtEQkZEYjIxdlpHOGdRMEVnClRHbHRhWFJsWkRFa01DSUdBMVVFQXd3YlUyVmpkWEpsSUVObGNuUnBabWxqWVhSbElGTmxjblpwWTJWek1CNFhEVEEwTURFd01UQXcKTURBd01Gb1hEVEk0TVRJek1USXpOVGsxT1Zvd2ZqRUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdNRWtkeVpXRjBaWElnVFdGdQpZMmhsYzNSbGNqRVFNQTRHQTFVRUJ3d0hVMkZzWm05eVpERWFNQmdHQTFVRUNnd1JRMjl0YjJSdklFTkJJRXhwYldsMFpXUXhKREFpCkJnTlZCQU1NRzFObFkzVnlaU0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVAKQURDQ0FRb0NnZ0VCQU1CeE00S0swSERyYzRlQ1FOVWQ1TXZKRGtLUStkNDB1YUc2RWZRbGhmUE1jbTN5ZTVkcnN3ZnhkeVNSWHlXUAo5blE5NUlEQytEd044NzlBNnZmSVV0RnliKy9JcTBHNGJpNFhLcFZwRE0zU0hwUjdMWlFkcW5YWHM1akxyTHhrVTBDOGo2eXNOc3RjCnJidmQ0SlFYN05GYzBML3ZwWlhKa01Xd3JQc2JROTk2Q0YyM3VQSkFHeXNubmxET1htV0NpSXhlMDA0TWV1b0lrYlkycWl0QysrckMKb3pubDJ5WTRyWXNLN2hsanh4d2szd040MnVicXdVY2FDd3RHQ2QwQy9ON0xoMS9YTUdOb29hN2NNcUc2dnY1RXEyaTJwUmNWL2IzVgpwNmVhNUVRejZZaU8vTzFSNjVOeFRxMEI1MFNPcXkzTHFQNEJTVWp3d04zSGFOaVMvajBDQXdFQUFhT0J4ekNCeERBZEJnTlZIUTRFCkZnUVVQTmlUaU1MQWdnbk1BWmtHa3lEcG5uQUpZMDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHcKZ1lFR0ExVWRId1I2TUhnd082QTVvRGVHTldoMGRIQTZMeTlqY213dVkyOXRiMlJ2WTJFdVkyOXRMMU5sWTNWeVpVTmxjblJwWm1sagpZWFJsVTJWeWRtbGpaWE11WTNKc01EbWdONkExaGpOb2RIUndPaTh2WTNKc0xtTnZiVzlrYnk1dVpYUXZVMlZqZFhKbFEyVnlkR2xtCmFXTmhkR1ZUWlhKMmFXTmxjeTVqY213d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJY0JiU01kZmxzWGZjRmhNcytQNS9PS2xGbG0KNEo0b3FGN1R0L1EwNXFvNXNwY1d4WUp2TXFUcGpPZXYvZS9DNkxsTHFxUDA1dHFOWlNIN3VvRHJKaWlGR3Y0NWpONWJCQVMwVlBtagpaNTVCK2dsU3pBVklxTWsvSVFRZXpraHIvSVhvd251dmY3Zk0rRjg2L1RYR0RlK1gzRXlyRWVGcnl6SFJiUHRJZ0t2Y25EZTRJUlJMCkRYRTk3SU16YnRGdU1oYnNtTWNXaTFtbU5Lc0ZWeTJUOTZvVHk5SVQ0cmN1TzgxclVCY0phRDYxSmxmdXR1QzIzYmtwZ0hsOWo2UHcKcENpa0ZjU0Y5Q2ZVYTcvbFhPUmxBblpVdE9NM1ppVFRHV0hJVWhEbGl6ZWF1YW41SGIvcW1aSmhsdjhCemFGZkRieHh2QTZzQ3gxSApSUjNCN0h6cy9Taz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ29tb2RvIFRydXN0ZWQgU2VydmljZXMgcm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUXpDQ0F5dWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCL01Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQXdTClIzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3dHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWcKVEdsdGFYUmxaREVsTUNNR0ExVUVBd3djVkhKMWMzUmxaQ0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pBZUZ3MHdOREF4TURFdwpNREF3TURCYUZ3MHlPREV5TXpFeU16VTVOVGxhTUg4eEN6QUpCZ05WQkFZVEFrZENNUnN3R1FZRFZRUUlEQkpIY21WaGRHVnlJRTFoCmJtTm9aWE4wWlhJeEVEQU9CZ05WQkFjTUIxTmhiR1p2Y21ReEdqQVlCZ05WQkFvTUVVTnZiVzlrYnlCRFFTQk1hVzFwZEdWa01TVXcKSXdZRFZRUUREQnhVY25WemRHVmtJRU5sY25ScFptbGpZWFJsSUZObGNuWnBZMlZ6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBMzNGdk5saFRXdkkyVkZlQXhIUUlJTzBZZnlvZDVqV2FIaVdzbk9XV2ZuSlNvQlZDMjFuZFpIb2EwTGg3CjNUa1Z2RlZJeE8wNkFPb3hFYnJ5Y1hRYVo3alBNOHlvTWErajQ5ZC92ek10VEdvODdJdkRrdEpUZHlSMG5BZHVjUHk5QzF0MnVsL3kKLzljM1MwcGdlUGZ3K3Nwd3RPcFpxcVBPU0MrcHc3SUxmaGR5Rmd5bUJ3d2JPTS9KWXJjL29KT2xoMEh5dDNCQWQ5aStGSHpqcU1CNgpqdWxqYXRFUG1zYlM5SXM2RkFSVzFPMjR6RzcxKytJc1dMMS9UMnNyOTJBa1dDVE9KdTgwa1RyVjQ0SFFzdkFFQXRkYnR6NlNyR3NTCml2bmtCYkE3a1VsY3N1dFQ2dmlmUjRidXY1WEF3QWFmMGx0ZUVSdjB4d1ExS2RKVlhPVHQ2d0lEQVFBQm80SEpNSUhHTUIwR0ExVWQKRGdRV0JCVEZlMWk5N2RvbGFkTDNXUmFvc3pMQWV5ZGI5REFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekNCZ3dZRFZSMGZCSHd3ZWpBOG9EcWdPSVkyYUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHZWSEoxYzNSbFpFTmxjblJwClptbGpZWFJsVTJWeWRtbGpaWE11WTNKc01EcWdPS0EyaGpSb2RIUndPaTh2WTNKc0xtTnZiVzlrYnk1dVpYUXZWSEoxYzNSbFpFTmwKY25ScFptbGpZWFJsVTJWeWRtbGpaWE11WTNKc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRRElrNEU3aWJTdnVJUVNUSTNTOE50dwp1bGVHRlRRUXVTOS9IckNvaVdDaGlzSjNERkJLbXdDTDJJdjBRZUxRZzRwS0hCUUdzS05vQlhBeE1LZFRtdzdwU3FCWWFXY09ycDMyCnBTeEJ2endHYStSWnpHMFE4Wlp2SDkvMEJBS2tuMFUreU5qNk5rWkVVRCtDbDVFZktOc1lFWXdxNUdXRFZ4SVNqQmMvbERiK1hiREEKQkhjVHVQUVYxVDg0ekpRNlZkQ3NtUFc2QUYvZ2hobUJlQzhvd0g3VHpFSUs5YTVRb05FK3hxRng3RCtnSUl4bU9vbTBqdFRZc1UwbApSKzR2aU1pMTRRVkZ3TDRVY2Q1Ni9ZNTdmVTBJbHFVU2MvQXR5amNuZEJJblRNdTJsK25acmdodFdqbEEzUVZIZFdwYUliT2pHTTlPCjl5NVh0NWh3WHNqRWVMQmkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKUXVvVmFkaXMgUm9vdCBDQQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMERDQ0JMaWdBd0lCQWdJRU9yWlFpekFOQmdrcWhraUc5dzBCQVFVRkFEQi9NUXN3Q1FZRFZRUUdFd0pDVFRFWk1CY0dBMVVFCkNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWxNQ01HQTFVRUN4TWNVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDAKZVRFdU1Dd0dBMVVFQXhNbFVYVnZWbUZrYVhNZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TVRBegpNVGt4T0RNek16TmFGdzB5TVRBek1UY3hPRE16TXpOYU1IOHhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwCmN5Qk1hVzFwZEdWa01TVXdJd1lEVlFRTEV4eFNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUzR3TEFZRFZRUUQKRXlWUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXYyRzFsVk82Vi96NjhtY0xPaHJmRVlCa2xiVFJ2TTE2ei9ZcGxpNGtWRUFrT1BjYWhkeFlUTXVrCkowS1gwSitEaXNQa0JnTmJBS1ZSSG5BRWRPTEIxRHFyMTYwN0J4Z0ZqdjJEck9wbTJSZ2JhSXIxVnhxWXV2WHRkajE4MmQ2VWFqdEwKRjhIVmo3MWxPRHFWMEQxVk5rN2ZlVmN4S2g3WVdXVkpXQ0NZZnF0ZmZwL3AxazNzZzNTcHgyelk3aWxLaFNvR0ZQbFU1dFBhWlFlTApZemNTMTlEc3czc2dRVVNqN2N1Z0YrRnhaYzRkWmpIM2RnRVp5SDBEV0xhVlNSMm1FaWJveGd4MjRPTm15K3BkcGlidTVjeGZ2V2VuCkFTY09vc3BVeGJGNmxSMXhIa29waWdQY2FrWEJwQmxlYnpiTnc2S3d0LzVjT09KU3ZQaEVRK2FRdXdJREFRQUJvNElDVWpDQ0FrNHcKUFFZSUt3WUJCUVVIQVFFRU1UQXZNQzBHQ0NzR0FRVUZCekFCaGlGb2RIUndjem92TDI5amMzQXVjWFZ2ZG1Ga2FYTnZabVp6YUc5eQpaUzVqYjIwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pDQ0FSb0dBMVVkSUFTQ0FSRXdnZ0VOTUlJQkNRWUpLd1lCQkFHK1dBQUJNSUg3Ck1JSFVCZ2dyQmdFRkJRY0NBakNCeHhxQnhGSmxiR2xoYm1ObElHOXVJSFJvWlNCUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGoKWVhSbElHSjVJR0Z1ZVNCd1lYSjBlU0JoYzNOMWJXVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJSFJvWlc0Z1lYQndiR2xqWVdKcwpaU0J6ZEdGdVpHRnlaQ0IwWlhKdGN5QmhibVFnWTI5dVpHbDBhVzl1Y3lCdlppQjFjMlVzSUdObGNuUnBabWxqWVhScGIyNGdjSEpoClkzUnBZMlZ6TENCaGJtUWdkR2hsSUZGMWIxWmhaR2x6SUVObGNuUnBabWxqWVhSbElGQnZiR2xqZVM0d0lnWUlLd1lCQlFVSEFnRVcKRm1oMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhNdVltMHdIUVlEVlIwT0JCWUVGSXRMYmUzVEtia0dHZXc1T2Fud2w0UnF5Ky9mTUlHdQpCZ05WSFNNRWdhWXdnYU9BRkl0TGJlM1RLYmtHR2V3NU9hbndsNFJxeSsvZm9ZR0VwSUdCTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3CkZ3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVNVd0l3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNUzR3TEFZRFZRUURFeVZSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dRNgp0bENMTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBaXRRVXRmNzBtcEtuR2RTa2ZuSVlqOWxvCmZGSWszV2R2T1hyRXFsNDk0bGl3VFhDWWhHSG9HK05wR0E3TyswZFFvRTcvOENRZnZiTE85U2Y4N0M5VHFuTjdBejEwYnVZV251dWwKTHNTL1ZpZFFLMks2dmtzY1BGVmNRUjBrdm9JZ1IxM1ZSSDU2Rm1qZmZVMVJjSGhYSFRNZS9RS1puQXpOQ2dWUHg3dU9wSFg2U20yeApnSTRKVnJtY0dtRCtYY0hYZXR3UmVORFdYY0czMWEweW1RTTZpc3hVSlRreGdYc1RJbEc2Um15aHU1NzZCR3hKSm5TUDBuUHJ6RENpCjV1cFpJb2Y0bC9VTy9lck1rcVFXeEZJWTZpSE9zZkhtaElIbHVxbUdLUEpEV2wwU25hd2UyYWpsQ21xbmY2Q0hLYy95aVUzVTdNWGkKNW5yUU5pT0tTblEyK1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDIKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9UCkVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01qQWVGdzB3TmpFeE1qUXgKT0RJM01EQmFGdzB6TVRFeE1qUXhPREl6TXpOYU1FVXhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRQ2FHTXBMbEEwQUxhOERLWXJ3RDRISXJrd1poUjBJbjZzcFJJWHpMNEd0TWg2UVJyK2poaVlhSHY1K0hCZzYKWEp4Z0Z5bzZkSU16TUgxaFZCSEw3YXZnNXRLaWZ2VnJieGkzQ2dzdC9lays3d3JHc3hEcDNNSkdGL2hkL2FUYS81NUpXcHptTStZawpsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQnJyY0Nhb0Y2cVVXRDRnWG11VmJCCmxEZVBTSEZqSXV3WFpRZVZpa3ZmajhaYUN1V3c0MTllYXhHckRQbUY2MFRwK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3kKbFpVdFFvZlgxYk9RUTdkc0UvSGUzZmJFK0lrLzBYWDFrc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dAo2Ni8zRnN2YnpTVXI1Ui83bXAvaVVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhuCndRNWhZSWl6UHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZy96T2gKRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVIb3ljUjdoWVFlN3hGU2t5eQpCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUl5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllCkowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWQKRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhekJ1QmdOVkhTTUVaekJsZ0JRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVQphNkZKcEVjd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCkVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01vSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUQ0S0ZrMmZCbHVvcm5GZEx3VXYKWitZVFJZUEVOdmJ6d0NZTURiVkhaRjM0dEhMSlJxVURHQ2RWaVhoOWR1cVdOSUFYSU56bmcvaU4vQWU0Mmw5TkxtZXloUDNaUlB4MwpVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtClZqQjNwamQ0TTFJUVdLNC9ZWTd5YXJIdkdINUtXV1BLamFKVzFhY3Z2RllmenpuQjR2c0txQlVzZlUxNlk4WnNsMFE4MG0vRFNoY0sKK0pEU1Y2SVpVYVV0bDBIYUIwK3BVTnFRalpSRzRUN3dsUDBRQURqMU8raEE0YlJ1VmhvZ3pHOVlqZTB1UlkvVzZaTS81N0VzM3pyVwpJb3pjaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUlRVSVozUGgxCldWYWorYWhKZWZpdkRya1JvSHkzYXUwMDBMWW1ZamdhaHd6NDZQMHUwNUIvQjVFcUhkWitYSVdEbWJBNENEL3BYdmsxQitUSlltNVgKZjZkUWxmZTZ5SnZtanFJQnhkWm12M2xoOHp3YzRibUNYRjJndytuWVNMMFpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSQo0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eTRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04ClZDTEFBVkJwUTU3MHN1OXQrT3phOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMwo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1QKRUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXpBZUZ3MHdOakV4TWpReApPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUMKRHdBd2dnSUtBb0lDQVFETVYwSVdWSnptbU5QVFRlNys3Y2VmUXpsS1piUG9Gb2cwMncxWmtYVFBrcmdFUUswQ1N6R3J2STJSYU5nZwpEaG9CNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVckg1NTZWT2lqCktUVm9wQUZQRDZRdU4rOGJ2K09QRUtoeXExaFg1MVNHeU1uelc5b3MybDJPYmp5alB0cjdndVhkOGx5eUJUTnZpamJPMEJOTy83OUsKRERSTXBzTWh2VkFFVmV1eHU1MzdSUjVrRmQ1VkFZd0NkclhMb1Q5Q2Fid3Z2V2hERmxhSktqZGhrZjJtcms3QXl4UmxsRGRMa2didgpCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVG1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwCnA1aWpKVU12Ny9GZkp1R0lUZmhlYnRmWkZHNFpNMm1uTzRTSms4UlRWUk9oVVhoQStMakpvdTU3dWxKQ2c1NFU3UVZTV2xsV3A1ZjgKblQ4S0tkamNUNUVPRTd6ZWxhVGZpNW0rckpzemlPKzFnYThieGlKVHlQYkg3cGNVc01WOGVGTEk4TTV1ZDJDRXB1a3FkaUR0V0FFWApNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFpjNnRzZ0xqb0MyU1RvSnlNCkdmK3owZ3pza1NhSGlyT2k0WENQTEFybHpXMW9VZXZhUHdWL2l6TG1FMXhyL2w5QTRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHoKdUQ4N25TVkwydjlBNndJREFRQUJvNElCbFRDQ0FaRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVApCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUdDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqCllYUmxJR052Ym5OMGFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdWRDNHdMUVlJS3dZQgpCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53Y3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlEClZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEdBMVVkSXdSbk1HV0FGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTQKeXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQ1RURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWJNQmtHQTFVRQpBeE1TVVhWdlZtRmthWE1nVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWCnF5TTA3dWNwMnNOYnRyQ0QyZERRNGlINzgyQ25PMTFnVXllaW0vWUlJaXJudjZCeTVad2thakd4a0hvbjI0UVJpU2VtZDFvNDE3K3MKaHZ6dVhZTzhCc2JSZDJzUGJTUXZTM3BzcHdlV3l1T0VuNjJJaXgyckZvMWJaaGZaRnZTTGdOTGQrTEoydy93NEU2b00za0pwSzI3egpQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3QjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyClBiK2lTd3dRSFlhWlRLcnpjaEdUNU9yMm05cW9YYWROdDU0Q3JuTUF5Tm9qQStqNTZobDBZZ0NVeXlJZ3ZwU25XYldDYXI2WmVYcXAKOGtva1V2ZDAvYnBPNXFnZEFtNnhEWUJFd2E3VEl6ZGZ1NFY4SzVJdTZINmxpOTJaNGI4bmJ5MWRxbnVIL2dyZFMveU85U2JrYm5CQwpialBzTVo1N2s4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnN6SFh1CmcvV3dZam5QYkZmaVROS1JDdzUxS0J1YXYvMGFRL0hLZC9zN2oyRzRhU2dXUWdSZWNDb2NJZGlQNGIwald5MTBRSkxaWXhrTmM5MXAKdkdKSHZPQjBLN0xyZmI1Qkc3WEFSc1doSXN0ZlRzRW9rdDRZdXRVcUtMc1JpeGVUbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicgpxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEs0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFdqQ0NBa0tnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUApVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0ZFc1cFkyRjBhVzl1SUZKdmIzUkRRVEV3CkhoY05NRE13T1RNd01EUXlNRFE1V2hjTk1qTXdPVE13TURReU1EUTVXakJRTVFzd0NRWURWUVFHRXdKS1VERVlNQllHQTFVRUNoTVAKVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDenMvNS8wMjJ4N3haOFY2VU1iWGFLTDB1L1pQdE03b3J3Cjh5bDg5Zi91S3VEcDZicGJaQ0thbW04c09pWnBVUVdaSnR6VkhHcHh4cHA5SHAzZGZHekdqR2RuU2o3NGNiQVpKNmtKREthVnYwdU0KRFBwVm1Edlk2Q0toUzNFNGVheVhrbW16aVg3cUlXZ0dtQlNXaDlKaE5yeHRKMWFlVis3QXdGYjlNcytrMlk3Q0k5ZU5xUFBZSmF5WAo1SEE0OUxZNnRKMDdseVpEbzZHOFNWbHlUQ013aHdGWTlrNitIR2hXWnEvTlFWM0lzMDBxVlVhckg5b2U0a0E5MjgxOXVaS0FuRGZkCkRKWmtuZHdpOTJTTDMySGVGWlJTRmFCOVVzbExxQ0hKeHJIdHk4T1ZZTkVQOEt0dytOL0xUWDdzMXZxcjJiMS9WUEtsNlhuNjJkWjIKSkNoekFnTUJBQUdqUHpBOU1CMEdBMVVkRGdRV0JCU2djMG1aYU55RlcyWGpteWd2VjUrOU03d0hTREFMQmdOVkhROEVCQU1DQVFZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFhRUNwcUx2a1QxMTVzd1cxRjdOZ0UrdkdrbDNnCjBkTnEvdnUrbTIyL3h3VnRXU0RFSFBDMzJvUllBbVA2U0JidlQ2VUw5MHFZOGorZUc2MUhhMlBPQ0VmclVqOTRuSzlOcnZqVlQ4K2EKbUNvUVFUbFN4TjNabXc3dmt3R3VzaTdLYUVJa1FteXdzem8remVuYVNNUVZ5K241QncrU1VFbUszVEdYWDhucE42bzdXV1dYbERMSgpzNTgrT21KWXhVbXRZZzV4cFRLcUw4YUpka05BRXhOblBhSlVKUkRMOFRyeTJmcmJTVmE3cHY2blFUWEQ0SWhoeVlqSDN6WVFJcGhaCjZyQksrMVlXYzI2c1RmY2lvVSt0SFhvdFJTZmxNTUZlOHRvVHl5VkNVWlZIQTR4c0ljeDBRdTFUL3pPTGp3OVhBUll2ejZidXlYQWkKRkwzOXZtd0xBdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNvbmVyYSBDbGFzcyAyIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRElEQ0NBZ2lnQXdJQkFnSUJIVEFOQmdrcWhraUc5dzBCQVFVRkFEQTVNUXN3Q1FZRFZRUUdFd0pHU1RFUE1BMEdBMVVFQ2hNRwpVMjl1WlhKaE1Sa3dGd1lEVlFRREV4QlRiMjVsY21FZ1EyeGhjM015SUVOQk1CNFhEVEF4TURRd05qQTNNamswTUZvWERUSXhNRFF3Ck5qQTNNamswTUZvd09URUxNQWtHQTFVRUJoTUNSa2t4RHpBTkJnTlZCQW9UQmxOdmJtVnlZVEVaTUJjR0ExVUVBeE1RVTI5dVpYSmgKSUVOc1lYTnpNaUJEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSkFYU2pXZHl2QU5sc2RFK2hZMwovRWk5dlgrQUxUVTc0VytvWjZtL0F4eE5qRzh5UjlWQmFLUVRCTUUxREpxRVEveGNIZitKcytnWEdNMlJYL3VKNCtxL1RsMThHeWJUCmRYbnQ1b1RqVitXdEtjVDBPaWpucFh1RU5tbXovVjUydmFNdG1kT1FUaU1vZlJoajhWUTdKcDEyVzVkQ3N2K3U4RTdzM1RtVlRvTUcKZitkSlFNakZBYkpVV21ZZFBmejU2VHdLbm9HNGNQQUJpK1FqVkh6SXJ2aVFIZ0NXY3RSVXoyRWp2T3I3blFLVjBiYTVjVHBwQ0Q4UAp0T0ZDeDRqMVA1aW9wN29jNEhGeDcxaFhnVkI2WEd0MFJnNkRBNWpEanFodThuWXliaWVEd25QejNCam90SlBxZFVSckJHQWdjVmVICm5mTytvSkFqUFlvazRkb2gyOE1DQXdFQUFhTXpNREV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFSQmdOVkhRNEVDZ1FJU3FDcVdJVFQKWGp3d0N3WURWUjBQQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJhem9mNUZuSVZWMHNkMlp2bm9pWXc3Sk5uMzlZdAowalN2OXppbHpxc1d1YXN2ZkRYTHJOQVB0RXdyL0lEdmE0eVJYeloyOTl1ekd4bnE5TElSL1dGeFJMOG9zem9kdjdORDZKKy8zREVJCmNiQ2RqZFkwUnpLUXhtVWs5NkJLZkFSemp6bHZGNHh5dGIxTHlIcjRlNFBES0U2Y0NlcG5QN0puQkJ2REZOcjQ1MGtra2RBZGF2cGgKT2U5cjV5RjFCZ2ZZRXJRaElIQkNjWUhhUEpvMnZxWmJEV3BzbWgrUmUvbjU3MEs2VGs2ZXpBeU5sTnpaUlp4ZTdFSlFZNjcwWGNTeApFdHpLTzZndW5SUmFCWFczN05kajRybzF0Z1FJa2VqYW5aejJaclVZckFxbVZDWTBNOUlid2RSL0dqcU9DNm95YnR2OFR5V2YyVExICmxscHdyTjlNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdWpDQ0FxS2dBd0lCQWdJRUFKaVdpakFOQmdrcWhraUc5dzBCQVFVRkFEQlZNUXN3Q1FZRFZRUUdFd0pPVERFZU1Cd0dBMVVFCkNoTVZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNZd0pBWURWUVFERXgxVGRHRmhkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGcKVW05dmRDQkRRVEFlRncwd01qRXlNVGN3T1RJek5EbGFGdzB4TlRFeU1UWXdPVEUxTXpoYU1GVXhDekFKQmdOVkJBWVRBazVNTVI0dwpIQVlEVlFRS0V4VlRkR0ZoZENCa1pYSWdUbVZrWlhKc1lXNWtaVzR4SmpBa0JnTlZCQU1USFZOMFlXRjBJR1JsY2lCT1pXUmxjbXhoCmJtUmxiaUJTYjI5MElFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW1OSzFVUkY2Z2FZVW1IRnQKdnN6bkV4dldKdzU2czJvWUhMWmhXdFZoQ2IvZWtCUEhaKzdkODlyRkRCS2VOVlUrTENlSVFHdjMzTjBpWWZYQ3h3NzE5dFYyVTAyUApqTHdZZGplRm5laktTY2ZTVDVnVENhSStJb2ljZjlieUVHVzA3bDhZMVJmaitNWDk0cDJpNzFNT2hYZWlEK0V3Uis0QTV6TjlSR2NhCkMxSG9pNkNlVUpob05GSWZMbTBCOG1CRjhqSHJxVEZvS2J0NlFaN0dHWCtVdEZFNUEzK3kzcWN5bTdSSGptKzBTcTdscjdIY3NCdGgKdkpseTN1U0p0M29tWGRvelNWdFNuQTcxaXEzRHVEM29CbXJDMVNvTGJIdUV2VllGeTRabGt1eEVLN0NPdWR4d0MwYmFyYnhqaURuNgoyMnIrSS9xODVFajBaeXRxRVJBaFNRSURBUUFCbzRHUk1JR09NQXdHQTFVZEV3UUZNQU1CQWY4d1R3WURWUjBnQkVnd1JqQkVCZ1JWCkhTQUFNRHd3T2dZSUt3WUJCUVVIQWdFV0xtaDBkSEE2THk5M2QzY3VjR3RwYjNabGNtaGxhV1F1Ym13dmNHOXNhV05wWlhNdmNtOXYKZEMxd2IyeHBZM2t3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlNvZmV1OFk2UjBFM1FBN0piZzB6VEJMTDlzK0RBTgpCZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFCWVNIVlhRMlljRzcwZFRHRmFnVHRKK2svcnZ1RmJRdkJnd3A4cWlTcEdFTi9LdGNDRnRSCkV5dE53aXBoeVBnSldQd3RBckk1ZlpsbWdiOXVYSlZGSUd6bWVhZlIyQndwL01JZ0oxSEk4WHhkTkdkcGhSRXd4Z0RTMS9QVGZMYncKTVZjb0VvSno2VE12cGxXMEM1R1VSNXo2dTNwQ011aXVmaTNJdkt3VXY5a1AyVnY4d2ZsNmxlRjlmcGI4Y2JEQ1RNamZSVFRKemczeQpuR1FJMER2REtjV3k3WkFFd2JFcGtjVXdiOEdwY2pQTS9sMFdGeXdSYWVkKy9zV0RDTis4M0NJNkxpQnBJemxXWUdlUWl5NTJPZnNSCmlKZjJmTDFMdUNBV1p3V040anZCY2orVWxUZkhYYm1lMkpPaEY0Ly9ER1lWd1NSOE1ud0RIVHVoV0VVeWt3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVERDIEludGVybmV0IFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLekNDQXhPZ0F3SUJBZ0lFT3N5bFREQU5CZ2txaGtpRzl3MEJBUVVGQURCRE1Rc3dDUVlEVlFRR0V3SkVTekVWTUJNR0ExVUUKQ2hNTVZFUkRJRWx1ZEdWeWJtVjBNUjB3R3dZRFZRUUxFeFJVUkVNZ1NXNTBaWEp1WlhRZ1VtOXZkQ0JEUVRBZUZ3MHdNVEEwTURVeApOak16TVRkYUZ3MHlNVEEwTURVeE56QXpNVGRhTUVNeEN6QUpCZ05WQkFZVEFrUkxNUlV3RXdZRFZRUUtFd3hVUkVNZ1NXNTBaWEp1ClpYUXhIVEFiQmdOVkJBc1RGRlJFUXlCSmJuUmxjbTVsZENCU2IyOTBJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBeExoQXZKSFZZeC9YbWFDTERFQWVkTGRJblVhTUFyTGdKRi93R1JPbk40TnJYY2VPK1lRd3pobzcrdnZPaTIwagp4c051WnArSnBkL2dRbEJuK2g5c0h2VFFCZGEveXRaTzVHaGdiRWFxSEYxajRRZUdEbVVBcHk2bWNjYTh1WUdvT24wYTB2blJyRXZMCnpuV3YzSHY2Z1hQVS9McTlRWWpVZExQNVhqZzZQRU9vMHBWT2QyMFRESjJQZUFHM1dpQWZBemMxNGl6YlN5c3NlTGxKMjhUUXg1eWMKNUlvZ0NTRVdWbWIvQmV4YjQvRFBxeVFrWHNOL2NIb1N4TksxRUtDMkllR05lR2xWUkduMXlwWWNOSVVYSlhmaTlpOG5tSGo5ZVFZNgpvdFphUThILzdBUTc3aFB2MDFoYS81THI3SzdhOGpjRFIwRzJsOGt0Q2tFaXU3dm1wd0lEQVFBQm80SUJKVENDQVNFd0VRWUpZSVpJCkFZYjRRZ0VCQkFRREFnQUhNR1VHQTFVZEh3UmVNRnd3V3FCWW9GYWtWREJTTVFzd0NRWURWUVFHRXdKRVN6RVZNQk1HQTFVRUNoTU0KVkVSRElFbHVkR1Z5Ym1WME1SMHdHd1lEVlFRTEV4UlVSRU1nU1c1MFpYSnVaWFFnVW05dmRDQkRRVEVOTUFzR0ExVUVBeE1FUTFKTQpNVEFyQmdOVkhSQUVKREFpZ0E4eU1EQXhNRFF3TlRFMk16TXhOMXFCRHpJd01qRXdOREExTVRjd016RTNXakFMQmdOVkhROEVCQU1DCkFRWXdId1lEVlIwakJCZ3dGb0FVYkdRQngvMkZiYXpJMnA1UUNJVUl0VHhXcUZBd0hRWURWUjBPQkJZRUZHeGtBY2Y5aFcyc3lOcWUKVUFpRkNMVThWcWhRTUF3R0ExVWRFd1FGTUFNQkFmOHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWalV1TURvMExqQURBZ1NRTUEwRwpDU3FHU0liM0RRRUJCUVVBQTRJQkFRQk9ROHpSM1IwUUd3Wi90NlQ2MDlsTit5T2ZJMVJiNW9zdkJDaUx0U2R0aWFIc21HbmM1NDBtCmd3VjVkT3kwdWFPWHdUVUEvUlhhT1lFNmxUR1EzcGZwaHFpWmR3emxXcUNFL3hJV3JHNjRqY043a3NLc0x0QjlLT3kyODJBNGFXOCsKMkFSVlBwN01WZEs2L3J0SEJOY0syUllLTkNuMVdCUFZUOCtQVmt1ekh1N1RtSG5hQ0I0TWI3ajRGaWZ2d204OTlxTkxQZzdrYld6YgpPMEVTbTcwTlJ5Ti9QRXJRcjhDdjl1OGJ0UlhFNjRQRUNWOTBpOWtSKzhKV3NUejRjTW8walVOQUU0ejltUU5VZWNZdTZvYWg5anJVCkNiejB2R2JNUFZqUVYwa0s3aVhpUWU0VCtaczROTkVBOVg3bmxCMzhhUU5pdUprRkJUMXJlQks5c0c5bAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUREMgT0NFUyBSb290IENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZHVENDQkFHZ0F3SUJBZ0lFUGtpOXhEQU5CZ2txaGtpRzl3MEJBUVVGQURBeE1Rc3dDUVlEVlFRR0V3SkVTekVNTUFvR0ExVUUKQ2hNRFZFUkRNUlF3RWdZRFZRUURFd3RVUkVNZ1QwTkZVeUJEUVRBZUZ3MHdNekF5TVRFd09ETTVNekJhRncwek56QXlNVEV3T1RBNQpNekJhTURFeEN6QUpCZ05WQkFZVEFrUkxNUXd3Q2dZRFZRUUtFd05VUkVNeEZEQVNCZ05WQkFNVEMxUkVReUJQUTBWVElFTkJNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyR0wyWVNDeXo4REdoZGZqZWViTTdmSTVrcVNYTG1TamhGdUgKbkV6OXBQUEVYeUc5VmhEcjJ5NWg3Sk5wNDZQTXZabkRCZndHdU1vMkhQNlFqa2xNeEZhYUwxYTh6M3NNOFc5SHBnMURUZUxwSFRrMAp6WTBzMlJLWStlUGh3VXA4aGpqRXFjUmhpTkplcnhvbVRkWGtvQ0pIaE5sa3R4bVcvT3daNUxLWEprNUtUTXVQSkl0VUdCeElZWHZWCmlHamFYYlhxelJvd3dZQ0RkbENxVDlIVTNUanc3eGIwNFF4UUJyL3ErM3BKb1NnckhQYjhGVEtqZEdxUHFjTmlLWEV4NVR1a1lCZGUKZE9iYUUrM3BIeDhiMGJKb2M4WVFOSFZHRUJEamtBQjJRTXVMdDBNSklmK3JUcFBHV09tbGd0dDN4RHFac1hLVlNRVHd0eXY2ZTFtTwozUUlEQVFBQm80SUNOekNDQWpNd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3Z2V3R0ExVWRJQVNCCjVEQ0I0VENCM2dZSUtvRlFnU2tCQVFFd2dkRXdMd1lJS3dZQkJRVUhBZ0VXSTJoMGRIQTZMeTkzZDNjdVkyVnlkR2xtYVd0aGRDNWsKYXk5eVpYQnZjMmwwYjNKNU1JR2RCZ2dyQmdFRkJRY0NBakNCa0RBS0ZnTlVSRU13QXdJQkFScUJnVU5sY25ScFptbHJZWFJsY2lCbQpjbUVnWkdWdWJtVWdRMEVnZFdSemRHVmtaWE1nZFc1a1pYSWdUMGxFSURFdU1pNHlNRGd1TVRZNUxqRXVNUzR4TGlCRFpYSjBhV1pwClkyRjBaWE1nWm5KdmJTQjBhR2x6SUVOQklHRnlaU0JwYzNOMVpXUWdkVzVrWlhJZ1QwbEVJREV1TWk0eU1EZ3VNVFk1TGpFdU1TNHgKTGpBUkJnbGdoa2dCaHZoQ0FRRUVCQU1DQUFjd2dZRUdBMVVkSHdSNk1IZ3dTS0JHb0VTa1FqQkFNUXN3Q1FZRFZRUUdFd0pFU3pFTQpNQW9HQTFVRUNoTURWRVJETVJRd0VnWURWUVFERXd0VVJFTWdUME5GVXlCRFFURU5NQXNHQTFVRUF4TUVRMUpNTVRBc29DcWdLSVltCmFIUjBjRG92TDJOeWJDNXZZMlZ6TG1ObGNuUnBabWxyWVhRdVpHc3ZiMk5sY3k1amNtd3dLd1lEVlIwUUJDUXdJb0FQTWpBd016QXkKTVRFd09ETTVNekJhZ1E4eU1ETTNNREl4TVRBNU1Ea3pNRm93SHdZRFZSMGpCQmd3Rm9BVVlMV0Y3RlprZmhJWkoyY2RVQlZMYzY0NworUkl3SFFZRFZSME9CQllFRkdDMWhleFdaSDRTR1NkbkhWQVZTM091Ty9rU01CMEdDU3FHU0liMmZRZEJBQVFRTUE0YkNGWTJMakE2Ck5DNHdBd0lFa0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUNyb21Ka2JUYzZnSjgyc0xNSm45aXVGWGVoSFR1SlRYQ1JCdW83RTQKQTlHMjhrTkJLV0tuY3RqN2ZBWG1NWEFuVkJoT2lueE81ZEhLakhpSXp4dlRrSXZtSS9nTERqTkRmWnppQ2htUHlRRStkRjEweVlzYwpBK1VZeUFGTVA4dVhCVjJZY2FhWWI3Wjh2VGQvdnVHVEpXMXY4QXF0RnhqaEE3d0hLY2l0SnVqNFlmRDlJUWwrbW82cGFIMUlZbks5CkFPb0JtYmdHZ2xHQlR2SDF0SkZVdVNONkFKcWZYWTNnUEdTNUdoS1NLc2VDUkhJNTNPSTh4dGhWOVJWT3lBVU8yOGJRWXFic0ZiUzEKQW9MYnJJeWlnZkNibVRIMUlDQ29pR0VLQjUrVS9ORFhHOHd1Ri9NRUozWm42MVNEL2FTUWZnWTlCS05ETGRyOEMyTHFMMTlpVXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpVVE4gREFUQUNvcnAgU0dDIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWGpDQ0EwYWdBd0lCQWdJUVJMNE1pMUFBSWJRUjB5cG9CcW10YVRBTkJna3Foa2lHOXcwQkFRVUZBRENCa3pFTE1Ba0dBMVVFCkJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWdRMmwwZVRFZU1Cd0dBMVVFQ2hNVlZHaGwKSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhob2RIUndPaTh2ZDNkM0xuVnpaWEowY25WemRDNWpiMjB4R3pBWgpCZ05WQkFNVEVsVlVUaUF0SUVSQlZFRkRiM0p3SUZOSFF6QWVGdzA1T1RBMk1qUXhPRFUzTWpGYUZ3MHhPVEEyTWpReE9UQTJNekJhCk1JR1RNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1ZWUXhGekFWQmdOVkJBY1REbE5oYkhRZ1RHRnJaU0JEYVhSNU1SNHcKSEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeElUQWZCZ05WQkFzVEdHaDBkSEE2THk5M2QzY3VkWE5sY25SeQpkWE4wTG1OdmJURWJNQmtHQTFVRUF4TVNWVlJPSUMwZ1JFRlVRVU52Y25BZ1UwZERNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUEzKzVZRUtJcmJsWEVqcjh1UmdubjRBZ1BMaXQ2RTVRYnZmYTJnSTVsQlpNQUhyeXY0ZytPR1EwU1IreXMKcmFQNkxuRDQzbTc3VmtJVm5pNWM3eVBlSWJrRmRpY1pEMC9XdzV5MHZwUVpZL0ttRVFyclUwaWN2dklwT3hib0dxQk1wc24wR0Zsbwp3SER5VXdEQVhsQ0NwVlp2TnZsSzRFU0dvRTFPMWtkdVNVckxaOWVteEFXNWpoNzAvUC9ONXpiZ25BVnNzak1pRmRDMDRNd1h3TExBCjlQNHlQeWtxbFh2WThxZE9EMVI4b1EyQXN3a0R3ZjljM1Y2YVByeXV2RWVLYXE1eHloK3hLcmhmUWdVTDdFWXcwWElMeXVsV2JmWHYKMzNpK1licXlwYTRFVEx5b3JHa1ZsNzN2NjdTTXZ6WDQxTVBSS0E1Y09wOXdHRE1nZDhTaXJ3SURBUUFCbzRHck1JR29NQXNHQTFVZApEd1FFQXdJQnhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUlRNdEd6ejMvNjRQR2dYWVZPa3RLZVJSMjBUekE5CkJnTlZIUjhFTmpBME1ES2dNS0F1aGl4b2RIUndPaTh2WTNKc0xuVnpaWEowY25WemRDNWpiMjB2VlZST0xVUkJWRUZEYjNKd1UwZEQKTG1OeWJEQXFCZ05WSFNVRUl6QWhCZ2dyQmdFRkJRY0RBUVlLS3dZQkJBR0NOd29EQXdZSllJWklBWWI0UWdRQk1BMEdDU3FHU0liMwpEUUVCQlFVQUE0SUJBUUFuTlpjQWlvc292Y1l6TUI0cC9PTDMxWmpVUUx0Z3lyK3JGeXdKTm45UStrSGNycFk2Q2lNK2lWbkpvd2Z0Ckd6ZXQvSHkrVVVsYTNqb0tWQWdXUmNLWnNZZk5qR2pnYVFQcHhFNllzanVNRnJNT29BeVlVSnVUcVhBSnlDeWpqOThDNU9CeE92RzAKSTNLZ3FnSGYzNWcrRkZDZ01TYTlLT2xhTUNaMStYdGdISTN6elZBbWJRUW5tdC9WRFVWSEtXc3M1bmJacVNsOU10M0pOank5cmpYeApFWjRkdTVBL0VrZE9qdGQrRDJKekhWSW1PQndZU2Ywd2RKckU1U0l2Mk1DTjdaRjZUQUNQY245ZDJ0MGJpMFZyNTkxcGw2akZWa3dQCkRQYWZlcEUzOXBlQzROMXhhZjkyUDJCTlBNLzNtZm5HVi9USlZUbDR1aXg1eWFhSUsvUUkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVVROIFVTRVJGaXJzdCBIYXJkd2FyZSBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRWREQ0NBMXlnQXdJQkFnSVFSTDRNaTFBQUpMUVIwellxL21VSy9UQU5CZ2txaGtpRzl3MEJBUVVGQURDQmx6RUxNQWtHQTFVRQpCaE1DVlZNeEN6QUpCZ05WQkFnVEFsVlVNUmN3RlFZRFZRUUhFdzVUWVd4MElFeGhhMlVnUTJsMGVURWVNQndHQTFVRUNoTVZWR2hsCklGVlRSVkpVVWxWVFZDQk9aWFIzYjNKck1TRXdId1lEVlFRTEV4aG9kSFJ3T2k4dmQzZDNMblZ6WlhKMGNuVnpkQzVqYjIweEh6QWQKQmdOVkJBTVRGbFZVVGkxVlUwVlNSbWx5YzNRdFNHRnlaSGRoY21Vd0hoY05PVGt3TnpBNU1UZ3hNRFF5V2hjTk1Ua3dOekE1TVRneApPVEl5V2pDQmx6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWdRMmwwCmVURWVNQndHQTFVRUNoTVZWR2hsSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhob2RIUndPaTh2ZDNkM0xuVnoKWlhKMGNuVnpkQzVqYjIweEh6QWRCZ05WQkFNVEZsVlVUaTFWVTBWU1JtbHljM1F0U0dGeVpIZGhjbVV3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN4OThNNFA3U29mODg1Z2xGbjBHMmYwdjlZOCtlZksrd05pVlNadVRpWkZ2ZmdJWGxJCndydGhkQktXSFR4cWN0VThFR2M2T2UwckU4MW02NVVKTTZSc2w3SG94dXpCZFhtY1JsNk5xOUJxL2JrcVZSY1FWTE1aOEpyMjhiRmQKdHFkdCsrQnhGMnVpaVBzQTMvNGFNWGNNbWdGNnNUTGpLd0VIT0c3RHBWNGp2RVdiZTFEQnlUQ1AyK1VyZXROYit6TkFIcURWbUJlOAppNGZEaWROZG9JNnlxcXIyam1tSUJzWDZpU0h6Q0oxcExna3pteWtOUmcrTXpFazBzR2xSdmZrR3pXaXRaa3k4UHF4aHZRcUlEc2pmClBlNThCRXlkQ2w1cmtkYnV4KzBvamF0Tmg0bHowRzZrMEI0V2l4VGhka1FEZjJPczVNMUpuTVdTOUtzeW9VaGJBZ01CQUFHamdia3cKZ2JZd0N3WURWUjBQQkFRREFnSEdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGS0Z5WHlZYktKaERsVjBITjlXRgpscDFMMHNORk1FUUdBMVVkSHdROU1Ec3dPYUEzb0RXR00yaDBkSEE2THk5amNtd3VkWE5sY25SeWRYTjBMbU52YlM5VlZFNHRWVk5GClVrWnBjbk4wTFVoaGNtUjNZWEpsTG1OeWJEQXhCZ05WSFNVRUtqQW9CZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd1VHQ0NzR0FRVUYKQndNR0JnZ3JCZ0VGQlFjREJ6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFSeGtQM25UR21aZXYvSzBvWG5XTzZ5MW43azU3SzljTQovL2JleTFXaUN1Rk1WR1dUWUd1ZkVweXRYb01zNjFxdXdPUXQ5QUJqSGJqQWJQTFBTYnROazI4R3Bnb2lza2xpQ0U3L3lNZ1Vzb2dXClhlY0I1QktWNVVVMHM0dHB2YyswaFk5MVVaNTlPamc2RkVnU3h2dW5PeHFORFlKQUIrZ0VDSkNoaWNzWlVOL0tIQUc4SFFRWmV4QjIKbHp2dWtKREt4QTRmRm01MTd6UDQwMjliSHBiajRIUjNkSHVLb200dDNYYldPVENDOEt1Y1V2SXF4NjlKWG43SGFPV0NnY2hxSi9rbgppQ3JWV0ZDVkgvQTdIRmU3ZlJRNVlpdWF5WlNTS3FNaURQK0pKbjFmSXl0SDF4VWRxV3FlVVEwcVVaNkIrZFE3WG5BU2Z4QXluQjY3Cm5maG1xQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNhbWVyZmlybWEgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV2VENDQTZXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREIvTVFzd0NRWURWUVFHRXdKRlZURW5NQ1VHQTFVRUNoTWUKUVVNZ1EyRnRaWEptYVhKdFlTQlRRU0JEU1VZZ1FUZ3lOelF6TWpnM01TTXdJUVlEVlFRTEV4cG9kSFJ3T2k4dmQzZDNMbU5vWVcxaQpaWEp6YVdkdUxtOXlaekVpTUNBR0ExVUVBeE1aUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkREFlRncwd016QTVNekF4Ck5qRXpORE5hRncwek56QTVNekF4TmpFek5EUmFNSDh4Q3pBSkJnTlZCQVlUQWtWVk1TY3dKUVlEVlFRS0V4NUJReUJEWVcxbGNtWnAKY20xaElGTkJJRU5KUmlCQk9ESTNORE15T0RjeEl6QWhCZ05WQkFzVEdtaDBkSEE2THk5M2QzY3VZMmhoYldKbGNuTnBaMjR1YjNKbgpNU0l3SUFZRFZRUURFeGxEYUdGdFltVnljeUJ2WmlCRGIyMXRaWEpqWlNCU2IyOTBNSUlCSURBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFRMEFNSUlCQ0FLQ0FRRUF0elpWNWFWZEdERGcyb2xVa2Z6SXgxTDRMMURaNzdGMWMyVkhmUnRidW5YRi9LR0lKUG92N2NvSVNqbFUKeEZGNnRkcGc2amc4Z2JMTDhidlprU00vU0FGd2Rha0ZLcTBmY2ZQSlZEMGRCbXBBUHJNTWhlNWNHM25DWXNTNE5vNDFYUUVNSXdSSApOYXFiWUU2Z1pqM0xKZ3FjUUtIMFhaaS9jYXVsQUdncTdZTjZENklVdGRRaXM0Q3dQQXhhVVdrdFdCaVA3Wm1lOGE3aWxlYjJSNmpXCkRBK3dXRmpidzJZM25wdVJWRE0zMHBRY2Frakp5ZktsMnFVTUkvY2pEcHd5VlY1eG5JUUZVWm90L2VaT0tqUmEzc3BBTjJjTVZDRlYKZDlvS0RNeVhyb0RjbERaSzlEN09OaE1lVStTc1Rqb0Y3TnV1Y3B3NGk5QTVPNGtLUG5mK2RRSUJBNk9DQVVRd2dnRkFNQklHQTFVZApFd0VCL3dRSU1BWUJBZjhDQVF3d1BBWURWUjBmQkRVd016QXhvQytnTFlZcmFIUjBjRG92TDJOeWJDNWphR0Z0WW1WeWMybG5iaTV2CmNtY3ZZMmhoYldKbGNuTnliMjkwTG1OeWJEQWRCZ05WSFE0RUZnUVU0NVQxc1UzcDI2RXBXMWVMVFhZR2R1SFJvb293RGdZRFZSMFAKQVFIL0JBUURBZ0VHTUJFR0NXQ0dTQUdHK0VJQkFRUUVBd0lBQnpBbkJnTlZIUkVFSURBZWdSeGphR0Z0WW1WeWMzSnZiM1JBWTJoaApiV0psY25OcFoyNHViM0puTUNjR0ExVWRFZ1FnTUI2QkhHTm9ZVzFpWlhKemNtOXZkRUJqYUdGdFltVnljMmxuYmk1dmNtY3dXQVlEClZSMGdCRkV3VHpCTkJnc3JCZ0VFQVlHSExnb0RBVEErTUR3R0NDc0dBUVVGQndJQkZqQm9kSFJ3T2k4dlkzQnpMbU5vWVcxaVpYSnoKYVdkdUxtOXlaeTlqY0hNdlkyaGhiV0psY25OeWIyOTBMbWgwYld3d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFBeEJsOElhaHNBaQpmSi83a1BNYTBRT3g3eFA1SVY4RW5OckpwWTBuYkphSGtiNUJrQUZ5aytjZWZWLzJpY1pkcDBBSlBheEpSVVhjTG8wd2FMSUp1dnZECkw4eTZDOTgvZDN0R2ZUb1NKSTZXanp3RkNtL1NsQ2dkYlF6QUxvZ2kxZGpQSFJQSDhFalgxd1duejhkSG5qczhOTWlBVDlRVXUvd04KVVBmNnMreENYNm5kYmNqMGRjOTd3WEltc1FFY1hDejllazYwQWNVRlY3bm5QS29GMllqcEIwWkJ6dTlCZ2E1WTM0T2lyc3JYZHgvbgpBRHlkYjQ3a01na2RUWGcwZURROGxKc203VTl4eGhsNnZTQWlTRnIrUzMwRHQrZFl2c1l5VG5RZWFOMm9hRnV6UHU1aWZkbUE2QXAxCmVyZnV0R1dhSVpEZ3F0Q1l2RGkxY3p5TCtOdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2FtZXJmaXJtYSBHbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFeFRDQ0E2MmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCOU1Rc3dDUVlEVlFRR0V3SkZWVEVuTUNVR0ExVUVDaE1lClFVTWdRMkZ0WlhKbWFYSnRZU0JUUVNCRFNVWWdRVGd5TnpRek1qZzNNU013SVFZRFZRUUxFeHBvZEhSd09pOHZkM2QzTG1Ob1lXMWkKWlhKemFXZHVMbTl5WnpFZ01CNEdBMVVFQXhNWFIyeHZZbUZzSUVOb1lXMWlaWEp6YVdkdUlGSnZiM1F3SGhjTk1ETXdPVE13TVRZeApOREU0V2hjTk16Y3dPVE13TVRZeE5ERTRXakI5TVFzd0NRWURWUVFHRXdKRlZURW5NQ1VHQTFVRUNoTWVRVU1nUTJGdFpYSm1hWEp0CllTQlRRU0JEU1VZZ1FUZ3lOelF6TWpnM01TTXdJUVlEVlFRTEV4cG9kSFJ3T2k4dmQzZDNMbU5vWVcxaVpYSnphV2R1TG05eVp6RWcKTUI0R0ExVUVBeE1YUjJ4dlltRnNJRU5vWVcxaVpYSnphV2R1SUZKdmIzUXdnZ0VnTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRFFBdwpnZ0VJQW9JQkFRQ2ljS0xRbjBLdVd4ZkgySDNQRklQOFQ4bWh0eE92aXRlZVBnUUtrb3RnVnZxME1pK0lUYUZnQ1BTM0NVNmdTUzlKCjF0UGZuWmRhbjVRRWNPdy9XZG0zekdhTG1GSW9DUUxmeFMrRWpYcVhkNy9zUUowbGNxdTFQektZKzdlMy9IS0U1VFdIK1ZYNm94OE8KYnk0bzNXbWcyVUlReHZpMVJNTFFRMy9idk9TaVBHcFZlQXAzcWRqcUdUSzNMLzVjUHh2dXNaanN5cTE2YVVYamxnOVY5dWJ0ZGVwbAo2REpXazBhSnFDV0taUWJ1YTc5NUI5RHh0Ni90TEUyU3U4Q29YNmRuZlFUeUZRaHdySkxXZlFUU00vdE10Z3NMK3hySnhJMERxWDVjCjhsQ3JFcVdoejBoUXBlL1N5Qm9UK3JCL3NZSWNkMm9QWDl3TGxZL3ZRMzdtUlFrbEFnRURvNElCVURDQ0FVd3dFZ1lEVlIwVEFRSC8KQkFnd0JnRUIvd0lCRERBL0JnTlZIUjhFT0RBMk1EU2dNcUF3aGk1b2RIUndPaTh2WTNKc0xtTm9ZVzFpWlhKemFXZHVMbTl5Wnk5agphR0Z0WW1WeWMybG5ibkp2YjNRdVkzSnNNQjBHQTFVZERnUVdCQlJEbkRhZnNKNHdUY2JPWDYwUXErVURwZnFwRkRBT0JnTlZIUThCCkFmOEVCQU1DQVFZd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1Db0dBMVVkRVFRak1DR0JIMk5vWVcxaVpYSnphV2R1Y205dmRFQmoKYUdGdFltVnljMmxuYmk1dmNtY3dLZ1lEVlIwU0JDTXdJWUVmWTJoaGJXSmxjbk5wWjI1eWIyOTBRR05vWVcxaVpYSnphV2R1TG05eQpaekJiQmdOVkhTQUVWREJTTUZBR0N5c0dBUVFCZ1ljdUNnRUJNRUV3UHdZSUt3WUJCUVVIQWdFV00yaDBkSEE2THk5amNITXVZMmhoCmJXSmxjbk5wWjI0dWIzSm5MMk53Y3k5amFHRnRZbVZ5YzJsbmJuSnZiM1F1YUhSdGJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKUER0d2tma0VWQ2VSNGUzdC9taC9ZVjNsUVdWUE12RVlCWlJxSE40ZmNOcytleklDTkxVTWJLR0tmS1gwai8vVTJLMFgxUzBFMFQ5WQpnT0tCV1lpK3dPTkdreVQra0wwbW9qQXQ2SmNtVnpXSmRKWVk5aFhpcnlRWlZnSUNzcm9QRk9yR2ltYkJoa1ZWaTc2U3ZweWtCTWRKClBKN29LWHFKMS82di8yajFwUmVRdmF5WnpLV0dWd2xuUnR2V0ZzSkc4ZVNwVVBXUDBaSVYwMTgreGdCSk9tNVlzdEhSSncwbHlETDQKSUJITmZUSXpTSlJVVE4zY2VjUXduK3VPdUZXMTE0aGN4V29rUGJMVEJRTlJ4Z2Z2ekJSeWREMXVjczRZS0l4S29IZmxDU3RGUkVlcwp0MmQvQVlvRldwTytvY0gvK09jT1o2UkhTWFpkZFpBYTlTYVA4QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldExvY2sgTm90YXJ5IChDbGFzcyBBKSBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHZlRDQ0JXV2dBd0lCQWdJQ0FRTXdEUVlKS29aSWh2Y05BUUVFQlFBd2dhOHhDekFKQmdOVkJBWVRBa2hWTVJBd0RnWURWUVFJCkV3ZElkVzVuWVhKNU1SRXdEd1lEVlFRSEV3aENkV1JoY0dWemRERW5NQ1VHQTFVRUNoTWVUbVYwVEc5amF5QklZV3h2ZW1GMFltbDYKZEc5dWMyRm5hU0JMWm5RdU1Sb3dHQVlEVlFRTEV4RlVZVzUxYzJsMGRtRnVlV3RwWVdSdmF6RTJNRFFHQTFVRUF4TXRUbVYwVEc5agpheUJMYjNwcVpXZDVlbTlwSUNoRGJHRnpjeUJCS1NCVVlXNTFjMmwwZG1GdWVXdHBZV1J2TUI0WERUazVNREl5TkRJek1UUTBOMW9YCkRURTVNREl4T1RJek1UUTBOMW93Z2E4eEN6QUpCZ05WQkFZVEFraFZNUkF3RGdZRFZRUUlFd2RJZFc1bllYSjVNUkV3RHdZRFZRUUgKRXdoQ2RXUmhjR1Z6ZERFbk1DVUdBMVVFQ2hNZVRtVjBURzlqYXlCSVlXeHZlbUYwWW1sNmRHOXVjMkZuYVNCTFpuUXVNUm93R0FZRApWUVFMRXhGVVlXNTFjMmwwZG1GdWVXdHBZV1J2YXpFMk1EUUdBMVVFQXhNdFRtVjBURzlqYXlCTGIzcHFaV2Q1ZW05cElDaERiR0Z6CmN5QkJLU0JVWVc1MWMybDBkbUZ1ZVd0cFlXUnZNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZIU00KRDd0TTlEY2VxUVdDMk9iaGJIRHFlTFZ1MFRoRURhaUR6bDNTMXRXQnhkUkw1MXVVY0NiYk81MXFUR0wzY2ZOazFtRTdQZXR6b3pmWgp6K3FNa2p2Tjl3ZmNablNYOUVVaTNmUmM0TDl0ODc1bE0rUVZPci9ibUpCVk9NVHRwbFZqQzdCNEJQVGpic0UvanZ4UmVCK1Nub1BDCi90bXdxY204V2dEL3FhaVlkUHYyTEQ0Vk9RMjJCRldvRHBnZ1FyT3hKYTErbW05ZFU3R3JEUHpyNFBONnM2aXovMGIyWTZMWU9waDcKdHF5Ri83QWxUM1JqNXhNSHBRcVBCZmZBWkc5K3B5ZUFsdDdVTG9aZ3gyc3JYbk43RitlUlAyUU0yRXNpTkN1Yk12SklINStoQ29SNgo0c0t0bHoyTzFjSDVWcU5RNmNhMCtwaWk3cFhtS2dPTTN3SURBUUFCbzRJQ256Q0NBcHN3RGdZRFZSMFBBUUgvQkFRREFnQUdNQklHCkExVWRFd0VCL3dRSU1BWUJBZjhDQVFRd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1JSUNZQVlKWUlaSUFZYjRRZ0VOQklJQ1VSYUMKQWsxR1NVZFpSVXhGVFNFZ1JYcGxiaUIwWVc1MWMybDBkbUZ1ZVNCaElFNWxkRXh2WTJzZ1MyWjBMaUJCYkhSaGJHRnViM01nVTNwdgpiR2RoYkhSaGRHRnphU0JHWld4MFpYUmxiR1ZwWW1WdUlHeGxhWEowSUdWc2FtRnlZWE52YXlCaGJHRndhbUZ1SUd0bGMzcDFiSFF1CklFRWdhR2wwWld4bGMybDBaWE1nWm05c2VXRnRZWFJoZENCaElFNWxkRXh2WTJzZ1MyWjBMaUIwWlhKdFpXdG1aV3hsYkc5emMyVm4KTFdKcGVuUnZjMmwwWVhOaElIWmxaR2t1SUVFZ1pHbG5hWFJoYkdseklHRnNZV2x5WVhNZ1pXeG1iMmRoWkdGellXNWhheUJtWld4MApaWFJsYkdVZ1lYb2daV3h2YVhKMElHVnNiR1Z1YjNKNlpYTnBJR1ZzYW1GeVlYTWdiV1ZuZEdWMFpXeGxMaUJCZWlCbGJHcGhjbUZ6CklHeGxhWEpoYzJFZ2JXVm5kR0ZzWVd4b1lYUnZJR0VnVG1WMFRHOWpheUJMWm5RdUlFbHVkR1Z5Ym1WMElHaHZibXhoY0dwaGJpQmgKSUdoMGRIQnpPaTh2ZDNkM0xtNWxkR3h2WTJzdWJtVjBMMlJ2WTNNZ1kybHRaVzRnZG1GbmVTQnJaWEpvWlhSdklHRjZJR1ZzYkdWdQpiM0o2WlhOQWJtVjBiRzlqYXk1dVpYUWdaUzF0WVdsc0lHTnBiV1Z1TGlCSlRWQlBVbFJCVGxRaElGUm9aU0JwYzNOMVlXNWpaU0JoCmJtUWdkR2hsSUhWelpTQnZaaUIwYUdseklHTmxjblJwWm1sallYUmxJR2x6SUhOMVltcGxZM1FnZEc4Z2RHaGxJRTVsZEV4dlkyc2cKUTFCVElHRjJZV2xzWVdKc1pTQmhkQ0JvZEhSd2N6b3ZMM2QzZHk1dVpYUnNiMk5yTG01bGRDOWtiMk56SUc5eUlHSjVJR1V0YldGcApiQ0JoZENCamNITkFibVYwYkc5amF5NXVaWFF1TUEwR0NTcUdTSWIzRFFFQkJBVUFBNElCQVFCSUpFYjN1bFp2K3Nnb0EwQk81VEU1CmF5WnJVMy9iMzkvemNUMG13QlFPeG1kN0k2Z01jOTBCdThiS2JqYzVWZFhIakZZZ0RpZ0tEdElxcExCSlVzWTRCLzYrQ2dtTTBaalAKeXRvVU1hRlAwam44RHhFc1E4UGRxNVBIVlQ1SGZCZ2FBTnp6ZTlqeWYxSnNJUFFMWDJsUzlPNzRzaWxnNitOSk1TRU4xclVRUWVKQgpDV3ppR3BwV1MzY0M5cUNibWllSDZGVXBjY0tRbjBWNEd1RVZaRDNRRHRpZ2RwK3V4ZEF1NnRZUFZ1eGtmMXFiRkZnQkozNFRVTWRyCkt1Wm9QTDljb0FvYjRRNTY2ZUtBdytucDl2MXNFWjdRNVNnbksxUXlRaFNDZGVaSzhDdG1kV09Nb3ZzRVBvTU9temJ3R09RbUlNT00KOENnSHJUd1hab2kxL2JhSQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpOZXRMb2NrIEJ1c2luZXNzIChDbGFzcyBCKSBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZTekNDQkxTZ0F3SUJBZ0lCYVRBTkJna3Foa2lHOXcwQkFRUUZBRENCbVRFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY1QKQ0VKMVpHRndaWE4wTVNjd0pRWURWUVFLRXg1T1pYUk1iMk5ySUVoaGJHOTZZWFJpYVhwMGIyNXpZV2RwSUV0bWRDNHhHakFZQmdOVgpCQXNURVZSaGJuVnphWFIyWVc1NWEybGhaRzlyTVRJd01BWURWUVFERXlsT1pYUk1iMk5ySUZWNmJHVjBhU0FvUTJ4aGMzTWdRaWtnClZHRnVkWE5wZEhaaGJubHJhV0ZrYnpBZUZ3MDVPVEF5TWpVeE5ERXdNakphRncweE9UQXlNakF4TkRFd01qSmFNSUdaTVFzd0NRWUQKVlFRR0V3SklWVEVSTUE4R0ExVUVCeE1JUW5Wa1lYQmxjM1F4SnpBbEJnTlZCQW9USGs1bGRFeHZZMnNnU0dGc2IzcGhkR0pwZW5Sdgpibk5oWjJrZ1MyWjBMakVhTUJnR0ExVUVDeE1SVkdGdWRYTnBkSFpoYm5scmFXRmtiMnN4TWpBd0JnTlZCQU1US1U1bGRFeHZZMnNnClZYcHNaWFJwSUNoRGJHRnpjeUJDS1NCVVlXNTFjMmwwZG1GdWVXdHBZV1J2TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0IKaVFLQmdRQ3g2Z1RzSUtBandvODRZTS9IUnJQVkcvNzd1Wm1lQk53Y2Y0eEtnWmp1cE5US2loZTVJbitEQ25WTW04QnAyR1E1bysyUwpvLzFiWEhRYXdFZktPbWwybXJyaVJCZjhUS1BWL3JpWGlLK0lBNGtmcFBJRVBzZ0hDK2I1c3k5NlloUUpSaFRLWlBXTGdMVmlxTmhyCjFuR1RMYk8vQ1ZSWTdRYnJxSHZjUTdHaGFRSURBUUFCbzRJQ256Q0NBcHN3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQkRBT0JnTlYKSFE4QkFmOEVCQU1DQUFZd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1JSUNZQVlKWUlaSUFZYjRRZ0VOQklJQ1VSYUNBazFHU1VkWgpSVXhGVFNFZ1JYcGxiaUIwWVc1MWMybDBkbUZ1ZVNCaElFNWxkRXh2WTJzZ1MyWjBMaUJCYkhSaGJHRnViM01nVTNwdmJHZGhiSFJoCmRHRnphU0JHWld4MFpYUmxiR1ZwWW1WdUlHeGxhWEowSUdWc2FtRnlZWE52YXlCaGJHRndhbUZ1SUd0bGMzcDFiSFF1SUVFZ2FHbDAKWld4bGMybDBaWE1nWm05c2VXRnRZWFJoZENCaElFNWxkRXh2WTJzZ1MyWjBMaUIwWlhKdFpXdG1aV3hsYkc5emMyVm5MV0pwZW5SdgpjMmwwWVhOaElIWmxaR2t1SUVFZ1pHbG5hWFJoYkdseklHRnNZV2x5WVhNZ1pXeG1iMmRoWkdGellXNWhheUJtWld4MFpYUmxiR1VnCllYb2daV3h2YVhKMElHVnNiR1Z1YjNKNlpYTnBJR1ZzYW1GeVlYTWdiV1ZuZEdWMFpXeGxMaUJCZWlCbGJHcGhjbUZ6SUd4bGFYSmgKYzJFZ2JXVm5kR0ZzWVd4b1lYUnZJR0VnVG1WMFRHOWpheUJMWm5RdUlFbHVkR1Z5Ym1WMElHaHZibXhoY0dwaGJpQmhJR2gwZEhCegpPaTh2ZDNkM0xtNWxkR3h2WTJzdWJtVjBMMlJ2WTNNZ1kybHRaVzRnZG1GbmVTQnJaWEpvWlhSdklHRjZJR1ZzYkdWdWIzSjZaWE5BCmJtVjBiRzlqYXk1dVpYUWdaUzF0WVdsc0lHTnBiV1Z1TGlCSlRWQlBVbFJCVGxRaElGUm9aU0JwYzNOMVlXNWpaU0JoYm1RZ2RHaGwKSUhWelpTQnZaaUIwYUdseklHTmxjblJwWm1sallYUmxJR2x6SUhOMVltcGxZM1FnZEc4Z2RHaGxJRTVsZEV4dlkyc2dRMUJUSUdGMgpZV2xzWVdKc1pTQmhkQ0JvZEhSd2N6b3ZMM2QzZHk1dVpYUnNiMk5yTG01bGRDOWtiMk56SUc5eUlHSjVJR1V0YldGcGJDQmhkQ0JqCmNITkFibVYwYkc5amF5NXVaWFF1TUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUFUYnJvd1hyL2dPa0RGT3pUNEp3RzA2c1BnelRFZE0KNDNXSUVKZXNzRGdWa2NZcGxzd2h3RzA4cFhUUDJJS2xPY05sNDBKd3V5S1E0MzNiTlhiaG9MWGFuM0J1a3hvd09SMHcyeTdqZkxLUgpzdEUzS2ZxNTFoZGNSMC9qSFRqcm45VjdsYWdvbmhWSzBkSFFLd0NYb09LU05pdGpyRmdCYXpNcFVJYUQ4UUZJCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldExvY2sgRXhwcmVzcyAoQ2xhc3MgQykgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZUekNDQkxpZ0F3SUJBZ0lCYURBTkJna3Foa2lHOXcwQkFRUUZBRENCbXpFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY1QKQ0VKMVpHRndaWE4wTVNjd0pRWURWUVFLRXg1T1pYUk1iMk5ySUVoaGJHOTZZWFJpYVhwMGIyNXpZV2RwSUV0bWRDNHhHakFZQmdOVgpCQXNURVZSaGJuVnphWFIyWVc1NWEybGhaRzlyTVRRd01nWURWUVFERXl0T1pYUk1iMk5ySUVWNGNISmxjM042SUNoRGJHRnpjeUJECktTQlVZVzUxYzJsMGRtRnVlV3RwWVdSdk1CNFhEVGs1TURJeU5URTBNRGd4TVZvWERURTVNREl5TURFME1EZ3hNVm93Z1pzeEN6QUoKQmdOVkJBWVRBa2hWTVJFd0R3WURWUVFIRXdoQ2RXUmhjR1Z6ZERFbk1DVUdBMVVFQ2hNZVRtVjBURzlqYXlCSVlXeHZlbUYwWW1sNgpkRzl1YzJGbmFTQkxablF1TVJvd0dBWURWUVFMRXhGVVlXNTFjMmwwZG1GdWVXdHBZV1J2YXpFME1ESUdBMVVFQXhNclRtVjBURzlqCmF5QkZlSEJ5WlhOemVpQW9RMnhoYzNNZ1F5a2dWR0Z1ZFhOcGRIWmhibmxyYVdGa2J6Q0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0IKalFBd2dZa0NnWUVBNit5d2JHR0tJeVd2WUNEajJaLzhrd3ZiWFkyd29iTkFPb0xPL1hYZ2VESURobHFHbFpIdFUvcWRRUHptNk4zWgpXM29EdlYzek93ekRVWG1iclZXZzZkQURFSzhLdWhSQzJWSW1FU0xIMGlETWdxU2FxZjY0Z1hhZGFyZlNOblUrc1lZSjltNXRmazYzCmV1eXVjWVQyQkRNSUpUTHJkS3dXUk1ia1FKTWRmNjBDQXdFQUFhT0NBcDh3Z2dLYk1CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRUXcKRGdZRFZSMFBBUUgvQkFRREFnQUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekNDQW1BR0NXQ0dTQUdHK0VJQkRRU0NBbEVXZ2dKTgpSa2xIV1VWTVJVMGhJRVY2Wlc0Z2RHRnVkWE5wZEhaaGJua2dZU0JPWlhSTWIyTnJJRXRtZEM0Z1FXeDBZV3hoYm05eklGTjZiMnhuCllXeDBZWFJoYzJrZ1JtVnNkR1YwWld4bGFXSmxiaUJzWldseWRDQmxiR3BoY21GemIyc2dZV3hoY0dwaGJpQnJaWE42ZFd4MExpQkIKSUdocGRHVnNaWE5wZEdWeklHWnZiSGxoYldGMFlYUWdZU0JPWlhSTWIyTnJJRXRtZEM0Z2RHVnliV1ZyWm1Wc1pXeHZjM05sWnkxaQphWHAwYjNOcGRHRnpZU0IyWldScExpQkJJR1JwWjJsMFlXeHBjeUJoYkdGcGNtRnpJR1ZzWm05bllXUmhjMkZ1WVdzZ1ptVnNkR1YwClpXeGxJR0Y2SUdWc2IybHlkQ0JsYkd4bGJtOXllbVZ6YVNCbGJHcGhjbUZ6SUcxbFozUmxkR1ZzWlM0Z1FYb2daV3hxWVhKaGN5QnMKWldseVlYTmhJRzFsWjNSaGJHRnNhR0YwYnlCaElFNWxkRXh2WTJzZ1MyWjBMaUJKYm5SbGNtNWxkQ0JvYjI1c1lYQnFZVzRnWVNCbwpkSFJ3Y3pvdkwzZDNkeTV1WlhSc2IyTnJMbTVsZEM5a2IyTnpJR05wYldWdUlIWmhaM2tnYTJWeWFHVjBieUJoZWlCbGJHeGxibTl5CmVtVnpRRzVsZEd4dlkyc3VibVYwSUdVdGJXRnBiQ0JqYVcxbGJpNGdTVTFRVDFKVVFVNVVJU0JVYUdVZ2FYTnpkV0Z1WTJVZ1lXNWsKSUhSb1pTQjFjMlVnYjJZZ2RHaHBjeUJqWlhKMGFXWnBZMkYwWlNCcGN5QnpkV0pxWldOMElIUnZJSFJvWlNCT1pYUk1iMk5ySUVOUQpVeUJoZG1GcGJHRmliR1VnWVhRZ2FIUjBjSE02THk5M2QzY3VibVYwYkc5amF5NXVaWFF2Wkc5amN5QnZjaUJpZVNCbExXMWhhV3dnCllYUWdZM0J6UUc1bGRHeHZZMnN1Ym1WMExqQU5CZ2txaGtpRzl3MEJBUVFGQUFPQmdRQVFyWC9YRERLQUN0aUc4WG1ZdGEzVXpiTTIKeEpaSXdWek5tdGtGTHArK1VPdjBKaFFRTGRSbUYvaWV3U2Y5OGUza2UwdWdiTFdybWxkd3B1MmdwTzB1OWYzOHZmNU5Od2dNdk9PVwpneUwxU1J0L1N5dTBWTUdBZkpsT0hkQ003dENzNVpMNmRWYitaS0FUajdpNEZwMWhCV2VBeU5EWXBRY0NOSmdFalRNRTFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKWFJhbXAgR2xvYmFsIENBIFJvb3QKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNRENDQXhpZ0F3SUJBZ0lRVUpSczdCanExWnhOMVpmdmRZK2dyVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JnakVMTUFrR0ExVUUKQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFa01DSUdBMVVFQ2hNYldGSmhiWEFnVTJWagpkWEpwZEhrZ1UyVnlkbWxqWlhNZ1NXNWpNUzB3S3dZRFZRUURFeVJZVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd0hoY05NRFF4TVRBeE1UY3hOREEwV2hjTk16VXdNVEF4TURVek56RTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXgKSGpBY0JnTlZCQXNURlhkM2R5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWtNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZwpVMlZ5ZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWVVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwCmRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDWUpCNjlGYlM2MzhlTXBTZTJPQXRwODdaT3FDd3UKSVIxY1JOOGhYWDRqZFA1ZWZyUkt0NmF0SDY3Z0JoYmltMXZaWjNSclhZQ1BLWjJHRzltY0RaaHRkaEFvV09SbHNIOUttSG1mNE1NeApmb0FydFl6QVFEc1JodERMb29ZMllLVFZNSUp0Mlc3UUR4SUVNNWRmVDJGYThPVDVrYXZuSFR1ODZNLzBheTAwZk9KSVlSeU84MkZFCnpHK2dTcW1Vc0UzYTU2azBlbkk0cUVITVBKUVJmZXZJcG95M2hzdktNenZaUFRlTCszbytoaXpuYzljS1Y2eGtteG5yOUE4RUNJcXMKQXhjWlpQUmFKU0tOTkN5eTltZ2RFbTNUaWg0VTJzU1BwdUlqaGRWNkRiMXE0T25zN0JlN1FodG5xaVh0UllNaC9NSEpmTlZpUHZyeQp4UzNUL2RSbEFnTUJBQUdqZ1o4d2dad3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFBCQVFEQWdHR01BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTVpQb2owR1k0UUpuTTVpNUFTc2pWeTE2YlliTURZR0ExVWRId1F2TUMwd0s2QXAKb0NlR0pXaDBkSEE2THk5amNtd3VlSEpoYlhCelpXTjFjbWwwZVM1amIyMHZXRWREUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQwpBUUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUpFVk9RTUJHMmY3U2h6NUNtQmJvZHBObDJMNUpGTW4xNEprVHBBdXcwa2JLNXJjCi9LaDRaelh4SGZBUnZiZEk0eEQyRGQ4LzBzbTJxbFdrU0xvQzI5NVpMaFZiTzUwV2ZVZlhOK3BmVFhZU05yc2YxNkdCQkVZZ295eHQKcVo0QmZqOHB6Z0NUMy8zSmtuT0ppV1NlNXl2a0hKRXMwcm5PZmM1dk1ablQ1cjdTSHBEd0NSUjVYQ09yVGRMYUlSOU5tWG1kNGM4bgpueENiSElnTnNJcGtRVEc0RG15UUpLU2JYSEdQdXJ0K0hCdmJhb0FQSWJ6cDI2YTNRUFN5aTZteDVPK2FHdEE5YVpudXFDaWo0VHl6CjhMSVJuTTk4UU9iZDUwTjlvdGc2dGFtTjhqU1p4TlFRNFFiOUNZUVFPKzdFVFBUc0ozeEN3blI4Z29vSnliUURKYnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdvIERhZGR5IENsYXNzIDIgQ0EKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFEQ0NBdWlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWQpWR2hsSUVkdklFUmhaR1I1SUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwClptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEwTURZeU9URTNNRFl5TUZvWERUTTBNRFl5T1RFM01EWXlNRm93WXpFTE1Ba0cKQTFVRUJoTUNWVk14SVRBZkJnTlZCQW9UR0ZSb1pTQkhieUJFWVdSa2VTQkhjbTkxY0N3Z1NXNWpMakV4TUM4R0ExVUVDeE1vUjI4ZwpSR0ZrWkhrZ1EyeGhjM01nTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNBd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRU5BRENDQVFnQ2dnRUJBTjZkMStwWEdFbWhXK3ZYWDBpRzZyN2QvK1R2Wnh6MFpXaXpWM0dnWG5lNzdadEo2WENBUFZZWVl3aHYKMnZMTTBEOS9BbFFpVkJEWXNvSFV3SFU5UzMvSGQ4TStlS3NhQTdVZ2F5OXFLN0hGaUg3RXV4Nnd3ZGhGSjIrcU4xajNoeWJYMkMzMgpxUmUzSDNJMlRxWVhQMldZa3RzcWJsMmkvb2pnQzk1LzVZMFY0ZXZMT3RYaUVxSVRMZGlPcjE4U1BhQUlCUWkyWEtWbE9BUkZtUjZqCllHQjB4VUdsY21JYllzVWZiMThhUXI0Q1VXV29yaU1ZYXZ4NEE2bE5mNEREK3F0YS9LRkFwTW9aRnY2eXlPOWVjdzN1ZDcyYTlubVkKdkxFSFo2SVZEZDJnV01aRWV3bytZaWhmdWtFSFUxalBFWDQ0ZE1YNC83VnBrSStFZE9xWEc2OENBUU9qZ2NBd2diMHdIUVlEVlIwTwpCQllFRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvYXRUak1JR05CZ05WSFNNRWdZVXdnWUtBRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvCmF0VGpvV2VrWlRCak1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVkdobElFZHZJRVJoWkdSNUlFZHliM1Z3TENCSmJtTXUKTVRFd0x3WURWUVFMRXloSGJ5QkVZV1JrZVNCRGJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3RwpBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQURKTDg3TEtQcEg4RXNhaEI0eU9kNkF6QmhSY2tCNFk5d2ltClBRb1orWWVBRVc1cDVKWVhNUDgwa1dOeU9PN01IQUdqSFpRb3BESDJlc1JVMS9ibE1WZ0Rvc3pPWXR1VVJYTzF2MFhKSkxYVmdnS3QKSTNscGpiaTJUYzdQVE1vekkrZ2NpS3FkaTBGdUZza2c1WW1lelR2YWNQZCttU1lnRkZRbHEyNXpoZWFiSVowS2JJSU9xUGpDRFBvUQpIbXlXNzRjTnhBOWhpNjN1Z3l1VitJNlNoSEk1NnlEcWcrMkR6WmR1Q0x6clRpYTJjeXZrMC9aTS9pWng0bUVSZEVyL1Z4cUhEM1ZJCkxzOVJhUmVnQWhKaGxkWFJRTElRVE83RXJCQkRwcVdlQ3RXVllwb056NGlDeFRJTTVDdWZSZVlObnlpY3Nia3FXbGV0TncrdkhYL2IKdlo4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTdGFyZmllbGQgQ2xhc3MgMiBDQQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUR6Q0NBdmVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQm9NUXN3Q1FZRFZRUUdFd0pWVXpFbE1DTUdBMVVFQ2hNYwpVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wVTNSaGNtWnBaV3hrSUVOc1lYTnpJRElnClEyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXdOakk1TVRjek9URTJXaGNOTXpRd05qSTVNVGN6T1RFMldqQm8KTVFzd0NRWURWUVFHRXdKVlV6RWxNQ01HQTFVRUNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBRwpBMVVFQ3hNcFUzUmhjbVpwWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFZ01BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEUUF3Z2dFSUFvSUJBUUMzTXNqKzZYR21CSVd0REJGazM4NU43OGdER0ljL29hdjdQS2FmOE1PaDJ0VFkKYml0VGtQc2twRDZFOEo3b1gremxKMFQxS0tZL2U5N2dLdkRJcjFNdm5zb0ZBWk1lajJZY09hZE4rbHEyY3dRbFp1dDNmK2RaeGtxWgpKUlJVNnliSDgzOFoxVEJ3ajYrd1Jpci9yZXNwN2RlZnFnU0hvOVQ1aWFVMFg5dERrWUkyMldZOHNiaTVndjJjT2o0UXlEdnZCbVZtCmVwc1pHRDMvY1ZFOE1DNWZ2ajEzYzdKZEJtekRJMWFhSzRVbWtoeW5BclBrUHcydkNIbUN1RFk5NnB6VE5iTzhhY3Ixekozby9XU04KRjRBemJsNUtYWm5KSG9lMG5SckExVzRUTlNOZTM1dGZQZS9XOTNiQzZqNjdlQTBjUW1kckJOajQxdHB2aS9KRW9BR3JBZ0VEbzRIRgpNSUhDTUIwR0ExVWREZ1FXQkJTL1g3ZlJ6dDBmaHZSYlZhemMxeERDRHFtSTV6Q0JrZ1lEVlIwakJJR0tNSUdIZ0JTL1g3ZlJ6dDBmCmh2UmJWYXpjMXhEQ0RxbUk1NkZzcEdvd2FERUxNQWtHQTFVRUJoTUNWVk14SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm8KYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBc1RLVk4wWVhKbWFXVnNaQ0JEYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0ZwpRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVdkUDRpZDBja2FWYUdzCmFmUHpXZHFiQVljYVQxZXBvWGtKS3R2M0w3SWV6TWRlYXRpRGg2R1g3MGsxUG5jR1FWaGl2NDVZdUFwblAreXozU0ZtSDhsVStuTE0KUFV4QTJJR3ZkNTZEZXJ1aXgvVTBGNDdaRVVEMC9Dd3FUUlYvcDJKZExpWFRBQXNnR2gxbytSZTQ5TDJMN1NoWjNVMFdpeGVEeUxKbAp4eTE2cGFxOFU0WnQzVmVreXZnZ1FRdG84UFQ3ZEw1V1hYcDU5ZmtkaGVNdGxiNzFjWkJEekkwZm1nQUtoeW5wVlNKWUFDUHE0eEpECktWdEhDTjJNUVdwbEJxamxJYXBCdEpVaGxibDkwVFNyRTlhdHZOemlQVG5OdlQ1MWNLRVlXUVBKSXJTUG5OVmVLdGVsdHRRS2JmaTMKUUJGR21oOTVEbUsvRDVmczRDOGZGNVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIeVRDQ0JiR2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCOU1Rc3dDUVlEVlFRR0V3SkpUREVXTUJRR0ExVUVDaE1OClUzUmhjblJEYjIwZ1RIUmtMakVyTUNrR0ExVUVDeE1pVTJWamRYSmxJRVJwWjJsMFlXd2dRMlZ5ZEdsbWFXTmhkR1VnVTJsbmJtbHUKWnpFcE1DY0dBMVVFQXhNZ1UzUmhjblJEYjIwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EWXdPVEUzTVRrMApOak0yV2hjTk16WXdPVEUzTVRrME5qTTJXakI5TVFzd0NRWURWUVFHRXdKSlRERVdNQlFHQTFVRUNoTU5VM1JoY25SRGIyMGdUSFJrCkxqRXJNQ2tHQTFVRUN4TWlVMlZqZFhKbElFUnBaMmwwWVd3Z1EyVnlkR2xtYVdOaGRHVWdVMmxuYm1sdVp6RXBNQ2NHQTFVRUF4TWcKVTNSaGNuUkRiMjBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBdwpnZ0lLQW9JQ0FRREJpTnNKdkd4R2ZIaWZsWHUxTTVEeWNtTFd3VFlnSWlSZXp1bDM4a01Lb2daa3BNeU9Odmc0NWlQd2JtMnhQTjF5Cm80VWNvZE05dERNcjB5K3YvdXF3UVZsbnRzUUdmUXFlZElYV2VVeUFOM3JmT1FWU1dmZjBHMFpEcE5LRmhkTERjZk4xWWpTNkxJcC8KSG8vdTdUVFFFY2VXelZJOXVqUFczVTNlQ3p0S1M1L0NKaS82dFJZY2NqVjN5anhkNXNyaEpvc2FOblpjQWR0MEZDWCs3YldnaUEvZAplTW90SHdlWE1BRXRjbm42UnRZVEtxaTVwcXVEU1IzbDh1L2Q1QUdPR0FxUFkxTVdoV0twRGhrNnpMVm1wc0pyZEFma0srRjJQclJ0CjJQWkU0WE5pSHp2RXZxQlRWaVZzVVFuM3Fxdkt2M2I5Ylp2em5kdS9QV2E4REZhcXI1aElsVHBMMzZkWVVOazRkYWxiNmtNTUF2K1oKNitoc1RYQmJLV1djM2FwZHpLOEJNZXdNNjlLTjZPcWNlK1p1OXlkbURCcEkxMjVDNHovZUlUNTc0UTF3KzJPcXFHd2FWTFJjSlhySgpvc21MRnFhN0xINFhYZ1ZOV0c0U0hRSHVFaEFOeGpKL0dQLzg5UHJOYnBIb05rbStHa2hwaThLV1RSb1NzbWtYd1FxUTF2cDVJa2kvCnVudHArSERIK25vMzJOZ04wblpQVi8rUXQrT1IwdDN2d21DM1p6cmQvcXFjOE5TTGYzSWl6c2FmbDdiNHI0cWdFS2paK3hqR3RyVmMKVWp5SnRoa3Fjd0VLRHdPekVtRHllaStCMjZOdS95WXdsL1dMM1lsWHRxMDlzNjhyeGJkMkF2Q2wxaXVhaGhRcWN2YmpNNHhkQ1VzVAozN3VNZEJOU1N3SURBUUFCbzRJQ1VqQ0NBazR3REFZRFZSMFRCQVV3QXdFQi96QUxCZ05WSFE4RUJBTUNBYTR3SFFZRFZSME9CQllFCkZFNEw3eHFrUUZ1bEYybUhNTW8wYUVQUVFhN3lNR1FHQTFVZEh3UmRNRnN3TEtBcW9DaUdKbWgwZEhBNkx5OWpaWEowTG5OMFlYSjAKWTI5dExtOXlaeTl6Wm5OallTMWpjbXd1WTNKc01DdWdLYUFuaGlWb2RIUndPaTh2WTNKc0xuTjBZWEowWTI5dExtOXlaeTl6Wm5OagpZUzFqY213dVkzSnNNSUlCWFFZRFZSMGdCSUlCVkRDQ0FWQXdnZ0ZNQmdzckJnRUVBWUcxTndFQkFUQ0NBVHN3THdZSUt3WUJCUVVICkFnRVdJMmgwZEhBNkx5OWpaWEowTG5OMFlYSjBZMjl0TG05eVp5OXdiMnhwWTNrdWNHUm1NRFVHQ0NzR0FRVUZCd0lCRmlsb2RIUncKT2k4dlkyVnlkQzV6ZEdGeWRHTnZiUzV2Y21jdmFXNTBaWEp0WldScFlYUmxMbkJrWmpDQjBBWUlLd1lCQlFVSEFnSXdnY013SnhZZwpVM1JoY25RZ1EyOXRiV1Z5WTJsaGJDQW9VM1JoY25SRGIyMHBJRXgwWkM0d0F3SUJBUnFCbDB4cGJXbDBaV1FnVEdsaFltbHNhWFI1CkxDQnlaV0ZrSUhSb1pTQnpaV04wYVc5dUlDcE1aV2RoYkNCTWFXMXBkR0YwYVc5dWN5b2diMllnZEdobElGTjBZWEowUTI5dElFTmwKY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlGQnZiR2xqZVNCaGRtRnBiR0ZpYkdVZ1lYUWdhSFIwY0RvdkwyTmxjblF1YzNSaApjblJqYjIwdWIzSm5MM0J2YkdsamVTNXdaR1l3RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITURnR0NXQ0dTQUdHK0VJQkRRUXJGaWxUCmRHRnlkRU52YlNCR2NtVmxJRk5UVENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFOQmdrcWhraUc5dzBCQVFVRkFBT0MKQWdFQUZteVo5R1lNTlBYUWhWNTlDdXphRUU0NEhGN2ZwaVVGUzVFeXdlZzc4VDNkUkFsYkIwbUtLY3RtQXJleG12Y2xtQWs4amh2aAozVGFISzB1N2FOTTVaajJnSnNmeU9aRWRVYXVDZTM3Vnpscms0Z05YY0dtWENQbGVXS1lLMzR3R21rVVdGamdLWGxmMllzZDZBZ1htCnZCNjE4cDcwcVNtRCtMSVU0MjRvaDBURGtCcmVPS2s4ckVOTlpFWE8zU2lwWFBKemV3VDRGK2lyc2ZNdVhHUnVjekU2RXJpOHN4SGsKZlkrQlVabzdqWW4wVFpObWV6d0Q3ZE9hSFpyelpWRDFvTkIxbnkrdjhPcUNRNWo0YVp5SmVjUkRqa1p5NDJRMkVxLzNKUjQ0aVpCMwpmc05yYXJuRHkwUkxySGlRaStmSExCNUxFVVRJTkZJbnpRcGRuNFhCaWRVYWVQS1ZFRk15M1lDRVpuWFp0V2dvKzJFdXZvU29PTUNaCkVvYWxIbWRrclFZdUw2bHdoY2VXRDN5SlpmV09RMVFPcTkybGdEbVVZTUEweVpad0xLTVM5UjlJZTcwY2ZtdTNuWkQwSWp1dStQd3EKeXZxQ1VxRHZyMHRWayt2QnRmQWlpNncwVGlZaUJLR0hMSFZLdCtWOUU5ZTRER1RBTnRMSkw0WVNqQ01Kd1J1Q08zTkpvMnBYaDVUbAoxbmpGbVVOajQwM2dkeTNoWlpseWFRUWFSd25tRHdGV0pQc2Z2dzU1cVZndXVjUUpBWDZWdW0wQUJqNnk2a29RT2RqUUsvVy83SFcvCmx3TEZDUnNJM0ZVMzRvSDdONFJEWWlESzUxWkxaZXIrYk1Fa2t5U2hOT3NGLzVvaXJwdDlQL0ZsVVFxbU1HcXo5SWdjZ0EzOGNvcm8KZzE0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUYWl3YW4gR1JDQQo9PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNqQ0NBMXFnQXdJQkFnSVFINTFaV3RjdndnWkVwWUFJYWVOZTlqQU5CZ2txaGtpRzl3MEJBUVVGQURBL01Rc3dDUVlEVlFRRwpFd0pVVnpFd01DNEdBMVVFQ2d3blIyOTJaWEp1YldWdWRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYCkRUQXlNVEl3TlRFek1qTXpNMW9YRFRNeU1USXdOVEV6TWpNek0xb3dQekVMTUFrR0ExVUVCaE1DVkZjeE1EQXVCZ05WQkFvTUowZHYKZG1WeWJtMWxiblFnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0lQQURDQ0Fnb0NnZ0lCQUpvbHVPek1vbldvZS9mT1cxbUt5ZEdHRWdoVTdKenk1MGIyaVBOODZhWGZURWMycEJzQkhIOGVWNHFOCnc4WFJJZVBhSkQ5SUsvdWZMcUdVNXl3Y2s5Ry9Hd0dIVTVuT3AvVUtJWFozLzZtM3huT1VUMGIzRUVrMytxaFpTVjFxZ1FkVzhvcjUKQnREM2NDSk50TGRCdVRLNHNmQ3h3NXcvY1AxVDNZR3EyR040OXRoVGJxR3Nhb1FrY2xTR3h0S3l5aHdPZVlIV3RYQmlDQUV1VGs4TwoxUkd2cWEvbG1yL2N6SWR0SnVUSlY2TDdsdm5NNFQ5VGpHeE1mcHRUQ0F0c0YvdG55TUt0c2MyQXRKZmNkZ0VXRmVscTE2VGhlRWZPCmh0WDdNZlA2TWI0MHFpajdjRXdkU2NldkxKMXRacWEyaldSK3RTQnFuVHVCdG85QUFHZExpWWE0ekdYK0ZWUHBCTUhXWHgxRTF3b3YKSjVwR2ZhRU5kYTFVaGhYY1NUdnhsczRQbTZEc28zcGR2dFVxZFVMbGU5Nmx0cXF2S0t5c2tLdzR0OVZvTlNaNjNQYzc4LzFGbTlHNwpRM2h1Yi9GQ1ZHcVk4QTJ0bCtsU1h1blZhbkxlYXZjYllCVDBwZVMyY1dlcUgrcmlUY0ZDUVA1blJoYzRMMGMvY1p5dTVTSEtZUzF0CkI2aUVmQzN1VVNYeFk1Q2UvZUZYaUd2dmlpTnRzZWE5UDYzUlBaWUxoWTNOYXllN3R3V2I3THVScVFvSEVnS1hUaUNROFA4Tkh1SkIKTzlOQU91ZU5YZHBtNUFLd0IxS1lYQTZPTTV6Q3BwWDdWUmx1VEk2dVN3Kzl3VGhOWG8rRUhXYk54V0NXdEZKYUJZbU9sWHFZd1pFOApsU095RHZSNXRNbDh3VW9oQWdNQkFBR2phakJvTUIwR0ExVWREZ1FXQkJUTXpPL01LV0NrTzdHU3RqejZNbUtQckNVVk96QU1CZ05WCkhSTUVCVEFEQVFIL01Ea0dCR2NxQndBRU1UQXZNQzBDQVFBd0NRWUZLdzREQWhvRkFEQUhCZ1ZuS2dNQUFBUVVBNXZ3SWhQL2xTZzIKMDl5ZXdETDdNVHFLVVdVd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFFQ0FTdm9teWM1ZU1OMVBoblIyV1BXdXM0TXplS1I2ZEJjWgpUdWxTdGJuZ0NuUmlxbWpLZUtCTW1vNHNJeTdWYWhJa3Y5Um8wNHJRMkp5ZnRCOE0zamgrVnpqOGplSlBYZ3lmcXp2Uy8zV1h5NlRqClp3ai81Y0FXdFVnQmZlbjVDdjhiNVdwcHYzZ2hxTUtuSTZtR3EzWlc2QTRNOWhQZEttYUtaRWs5R2hpSGtBU2ZRbEszVDh2K1IwRjIKTmUvL0FIWTJSVEtieGthRlhlSWtzQjdqU0phWVYwZVVWWG9QUWJGRUpQUEIvaHBydjRqOXdhYmFrMkJlZ1VxWklKeElaaG0xQUhsVQpEN2dzTDB1OHFWMWJZSCtNaDZYZ1VtTXF2dGc3aFVBVi9oNjJaVC9GUzlwK3RYbzFLYU11ZXBoZ0lxUDBmU2RPTGVxMGREenBENlF6CkR4QVJ2Qk1CMXVVTzA3KzFFcUxoUlNQQXpBaHVZYmVKcTRQakpCN21YUWZuSHlBK3oyZkk1Nnd3YlNkTGFHNUxLbHdDQ0RUYitIYmsKWjZNbW5EK2lNc0pLeFlFWU1SQldxb1R2TFFyL3VCOTMwcitsV0tCaTVOZExrWFdOaVlDWWZtM0xVMDVlci9heWw0V1h1ZHBWQnJrawo3dGZHT0I1akd4STdsZUZZclBMZmhOVmZtUzhOVlZ2bU9Oc3VQM0xwU0lYTHV5a1RqeDQ0VmJuenNzUXdtU05PWGZKSW9SSU0zQktRCkNaQlVrUU04UitYVnlXWGd0MHQ5N0VmVHN3cytyWjdRZEFBTzY3MVJyY0RlTE1ERGF2N3YzQXVuK2tiZllOdWNwbGxRZFNOcGM1T3kKK2Z3QzAwZm1jYzRRQXU0bmpJVC9yRVVORTF5RE11QWxwWVlzZlBRUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpGaXJtYXByb2Zlc2lvbmFsIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFVnpDQ0F6K2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQm5URUxNQWtHQTFVRUJoTUNSVk14SWpBZ0JnTlZCQWNUCkdVTXZJRTExYm5SaGJtVnlJREkwTkNCQ1lYSmpaV3h2Ym1FeFFqQkFCZ05WQkFNVE9VRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnAKWTJGamFXOXVJRVpwY20xaGNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMk1qWXpOREEyT0RFbU1DUUdDU3FHU0liM0RRRUpBUllYWTJGQQpabWx5YldGd2NtOW1aWE5wYjI1aGJDNWpiMjB3SGhjTk1ERXhNREkwTWpJd01EQXdXaGNOTVRNeE1ESTBNakl3TURBd1dqQ0JuVEVMCk1Ba0dBMVVFQmhNQ1JWTXhJakFnQmdOVkJBY1RHVU12SUUxMWJuUmhibVZ5SURJME5DQkNZWEpqWld4dmJtRXhRakJBQmdOVkJBTVQKT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWhjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTJNall6TkRBMgpPREVtTUNRR0NTcUdTSWIzRFFFSkFSWVhZMkZBWm1seWJXRndjbTltWlhOcGIyNWhiQzVqYjIwd2dnRWlNQTBHQ1NxR1NJYjNEUUVCCkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEbkl3TnZieU9sWG5qT2xTenRsQjV1Q3A0Qngrb3cwU3lkM1Rmb201aDVWdFA4YzkvUWl0NVYKajFINVd1cmV0WERFN2FUdC82TU5iZzlrVURHdkFTZFlydjVzcDBvdkZ5M1RjOVVUSEk5WnBUUXNIVlFFUmMxb3VLREFBNlhQaFVKSApsU2hieisrQWJPQ1FsNG9CUEIzemh4QXdKa2g5MS96cG5aRngvMEdhcVVDMU41d3BJRThmVXVPZ2ZSTnRWTGNLM3VscVRnZXNyQmxmCjNINWlkUGF5QlFDNmhhRDlIVGh1eTFxN2hyeVVaek0xZ3l3Zkk4MzR5SkZ4ekplTDc2NFAzQ2tERzhBNTYzRHR3VzRPMkdjTGlhbTgKTmVUdnRqUzBwYmJFTGFXKzBNT1VKRWpiMzViVEFMVm1Hb3RtQlEvZFB6L0xQNnBlbWtyNHRFcnZsVGNiQWdNQkFBR2pnWjh3Z1p3dwpLZ1lEVlIwUkJDTXdJWVlmYUhSMGNEb3ZMM2QzZHk1bWFYSnRZWEJ5YjJabGMybHZibUZzTG1OdmJUQVNCZ05WSFJNQkFmOEVDREFHCkFRSC9BZ0VCTUNzR0ExVWRFQVFrTUNLQUR6SXdNREV4TURJME1qSXdNREF3V29FUE1qQXhNekV3TWpReU1qQXdNREJhTUE0R0ExVWQKRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVU13dWdadEhxMnM3ZVlwTUVLRksxRkg4NGFMY3dEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQUVkei9vMG5WUEQxMUhlY0ozbFhWN2NWVnV6SDJGaTNBUUwwTSsyVFVJaWVmRWF4dlQ4VWIvR3pSMGlMakpjRzErcCtvMXdxCnUwMHZSK0w0T1FiSm5DNHhHZ040OUx3NHhpS0xNekh3RmdRRWZmbDI1RXZYd09hRDdGbk1QOTcvVDJ1M1ozNm1ob0V5SXdPZHlQZGYKd1VwZ3BaS3BzYVNnWU1ONGg3TWk4eXJyVzZudEJhczNEN0hpMDVWMlkxWjBqRmh5R3pmbFpLRytUUXlUbUF5WDlvZHRzei9ueTRDbQo3WWpIWDFCaUF1aVpkQmJRNXJRNThTZkx5RURXNDRZUXFTTVNrdUJwUVdPbnJ5VUx3TVdTeXg2WW8xcTZ4VE1Qb0pjQjNYL2dlOVlHClZNK2g0azA0NjB0UXRjc205TXJhY0VwcW9lSjVxdUduTS9iOVNoLzIyV0E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCldlbGxzIEZhcmdvIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDVUQ0NBczJnQXdJQkFnSUVPZVNYbmpBTkJna3Foa2lHOXcwQkFRVUZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVgpCQW9UQzFkbGJHeHpJRVpoY21kdk1Td3dLZ1lEVlFRTEV5TlhaV3hzY3lCR1lYSm5ieUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2CmNtbDBlVEV2TUMwR0ExVUVBeE1tVjJWc2JITWdSbUZ5WjI4Z1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY04KTURBeE1ERXhNVFkwTVRJNFdoY05NakV3TVRFME1UWTBNVEk0V2pDQmdqRUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9UQzFkbApiR3h6SUVaaGNtZHZNU3d3S2dZRFZRUUxFeU5YWld4c2N5QkdZWEpuYnlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEV2Ck1DMEdBMVVFQXhNbVYyVnNiSE1nUm1GeVoyOGdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFZxRE03SnZrMC84MmJmdVVFUjg0QTRuMTM1ekhDTGllbFRXaTVNYnFOUTFtWAp4M09xZnoxY1FKNEY1YUhpaWRsTXVEK2IrUXkweUdJWkxFV3VrUjV6Y1VIRVN4UDljTUlsckNMMWRRdTNVK1NsSzkzT3ZSdzZlc1AzCkU0OG1WSndXYTJ1dis5aVdzV0NhU09BbElpUjVOTTRPSmdBTFRxdjlpODZDMXk4SWNHakJxQXI1ZEU4SHE2VDU0b04rSjNOMFByajUKT0VMOHBhaGJTQ096NitNbHNvQ3VsdFFLbk1KNG1zWm9HSzQzWWpkZVVYV29XR1BBVWU1QWVINm9yeHFnNGJCNG5WQ01lK2V6L0k0agpzTnRsQUhDRUFRZ0FGRzVVaHBxNnpQazNFUGJnM29RdG5hU0ZOOU9INHhYUXdSZVFmaGtoYWhLcGR2MFNBdWxQSVY0WEFnTUJBQUdqCllUQmZNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdUQVlEVlIwZ0JFVXdRekJCQmd0Z2hrZ0JodnQ3aHdjQkN6QXlNREFHQ0NzR0FRVUYKQndJQkZpUm9kSFJ3T2k4dmQzZDNMbmRsYkd4elptRnlaMjh1WTI5dEwyTmxjblJ3YjJ4cFkza3dEUVlKS29aSWh2Y05BUUVGQlFBRApnZ0VCQU5JbjNad0tkeXU3SXZJQ3RVcEtrZm5STGI3a3V4cG83dzZrQU9udTUrL3U5dm5sZEtUQzJGSll4SFQ3em11MU95bDVHRnJ2Cm0rMGZhemJ1U0NVbEZMWldvaERvN3FkLzBEK2owTU5kSnU0SHpNUEJKQ0dISHQ4cUVsTnZRUmJuN2E2VStveHkraE5IOER4K3JuMFIKT2hQczdmcHZjbVI3blgxL0p2MTYreVd0Nmo0cGYwempBRmN5c0xQcDdWTVgyWXV5RkE0dzZPWFZFOFprcjhRQTFkaFlKUHoxait6eAp4MzJsMnc4bjBjYnlRSWptSC9aaHFQUkN5TGszMDZtK0xGWjR3bktiV1YwMVFJcm9UbU1hdHVrZ2FsSGl6cVNRMzNad21WeHdRMDIzCnRxY1paRTZTdDhXUlBIOUlGbVY3RnYzTC9QdloxZFpQSVdVN1NuOUhvL3M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN3aXNzY29tIFJvb3QgQ0EgMQo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYyVENDQThHZ0F3SUJBZ0lRWEF1RlhBdm5XVUhmVjh3L2Y1Mm9OakFOQmdrcWhraUc5dzBCQVFVRkFEQmtNUXN3Q1FZRFZRUUcKRXdKamFERVJNQThHQTFVRUNoTUlVM2RwYzNOamIyMHhKVEFqQmdOVkJBc1RIRVJwWjJsMFlXd2dRMlZ5ZEdsbWFXTmhkR1VnVTJWeQpkbWxqWlhNeEd6QVpCZ05WQkFNVEVsTjNhWE56WTI5dElGSnZiM1FnUTBFZ01UQWVGdzB3TlRBNE1UZ3hNakEyTWpCYUZ3MHlOVEE0Ck1UZ3lNakEyTWpCYU1HUXhDekFKQmdOVkJBWVRBbU5vTVJFd0R3WURWUVFLRXdoVGQybHpjMk52YlRFbE1DTUdBMVVFQ3hNY1JHbG4KYVhSaGJDQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekViTUJrR0ExVUVBeE1TVTNkcGMzTmpiMjBnVW05dmRDQkRRU0F4TUlJQwpJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMExtd3FBelp1ejhoK0J2Vk01T0FGbVVnZGJJOW0yQnRSc2lNCk1XOFh3L3FhYkZidFBNV1JWOFBOcTVaSmtDb1pTeDZqYlZmZDhTdGlLSFZGWHFyV1cvb0xKZGloRnZrY3hDN21sU3Buek5BcGJqeUYKTkRoaFNiRUFuOVk2Y1Y5TmJjNWZ1YW5raVg5cVV2ckttL0xjcWZtZG1VYy9UaWxmdEthTlhYc0xtUkVEQS83bjI5dWoveDJselpBZQpBUjgxc0g4QTI1QnZ4bjU3MGU1NmVxZXFERmR2cEczRkV6dXdwZG50TWh5MFhtZUxWTnh6aCtYVEYzeG1VSEpkMUJwWXdkblAySWtDCmI2ZEp0RFpkMEtUZUJ5eTJkYmNva2RhWHZpajFtQjdxV3liSnZiQ1hjOXF1a1NicmFNSDVPUlhXWjBzS2JVL0x6N0RrUW5HTVUzbm4KN3VIYkhhQnVIWXdhZHpWY0ZoNHJVeDgwaTlGcy9QSm5CM3IxcmUzV21xdWhzVXZoekRkZi9YL05UYTY0SDV4RCtTcFlWVU5GdkpiTgpjQTc4eWVObXVrNk5PNEhMRldSN3VaVG9YVE5TaFhFdVQ0NmlCaEZSeWVQTG9XNHhDR1FNd3RJODlUYm8xOUFPZUNNZ2tja2tLbVVwCld5TDNJYzZEWHFUejNrdlRhSTlHZFZ5RENXNHBhOFJ3alBXZDF5QXYvMGJTS3pqQ0wzVWNQWDdhcGU4ZVlJVnBRdFBNK0dQK0hrTTUKaGFhMlkwRVFzM01ldk5QNnluMFdSK0tuMWRDamlnb0lsbUpXYmpUYjJRSzVNSFhqQk5Mbmo4S3dFVUFLck5WeEFtS0xNYjdkeGlOWQpNVUpETFhUNXhwNm1pZy9wL3IrRDVrTlhKTHJ2UmpTcTF4SUJPTzBDQXdFQUFhT0JoakNCZ3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3CkhRWURWUjBoQkJZd0ZEQVNCZ2RnaFhRQlV3QUJCZ2RnaFhRQlV3QUJNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUWN3SHdZRFZSMGoKQkJnd0ZvQVVBeVV2M20rQ0FUcGNMTndyb1dtMVo5U00wLzB3SFFZRFZSME9CQllFRkFNbEw5NXZnZ0U2WEN6Y0s2RnB0V2ZVak5QOQpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUUExRU12c3BnUU5EUS9Od051cnFQS0lsd3pma3k5TmZFQldNWHJycEE5Z3pYcnp2c01uCmpnTStwTjBTNzM0ZWRBWThQekh5SEh1Uk1TRzA4TkJzbDlUcGw3SWtWaDVXd3pXOWlBVVBXeEFhWk9ISGdqRDVNcTJlVUN6bmVBWFEKTWJGYW1JcDFUcEJjYWhRcTRGSkhnbURtSHRxQnNmc1VDMXJ4bjlLVnVqN1FHOVlWSGFPK2h0WGJEOEJKWkxzdVVCbEwwaVQ0M1I0SApWdEE0b0pWd0lIYU0xOTBlM3A5eHhDUHZneE5jb3lRVlRTbEFQR3JFcWRpM3BrU2xEZlRnblhjZVFIQW0vTnJaTnVSNTVMVS92SnRsCnZyc1Jscy9ieGlnNU9nak9SMXRUV3NXWi9sMnAzZTlNMU1hbHJRTG1qQWNTSG04RDBXK2dvL01wdlJMSFVLS3dmNGlwbVhlYXNjQ2wKT1M1Y2ZHbmlMTERxTjJxazRWcmg5VkRsZysrbHV5cUk1NHpiL1cxZWx4bW9mbVoxYTNIcXY3SEhiNkQwanFUc05GRmJqQ1lEY0tGMwoxUUVTVndBMTJ5UGVEb29vbWYyeEVHOUwvemd0WUU0c25PdG50YTFKN2tzZnJLLzdEWkJhWm1Cd1hhck5lTlFrN3NoQm9KTUJrcHhxCm52eTVKTVd6RllKK3ZxNlZLK3V4d05yakFXQUxYbW1zaEZaaHZuRVgvaDBURC83R2gwWHAvaktnR2cwVHBKUlZjYVVXaTdyS2liQ3kKeC95UDJGUzFrMktkenM5Wit6MFl6aXJMTlJXQ1hmOVVJbHR4VXZ1M3lmNWdtd0JCWlBDcUt1eTJRa1BPaVdhQnlJdWZPVlFESmRNVwpOWTZFMEYvNk1CcjFtbXowRGxQNU9sdlJIQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0ekNDQXArZ0F3SUJBZ0lRRE9mZzVSZllSdjZQNVdEOEcvQXdPVEFOQmdrcWhraUc5dzBCQVFVRkFEQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRdwpJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4Ck1URXdNREF3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUwKRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3Y0pwU0lxdlRPCjlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQbURJMmRzemUzVHlvb3U5cSt5SHkKVW1IZm55RFhIK0t4MmY0WVpOSVNXMS81V0JnMXZFZk5vVGI1YTMvVXNEZyt3UnZEakRQWjJDOFkvaWdQczZlRDFzTnVSTUJoTlpZVwovbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNFZZY2dvYy9sYlFySVNYd3htRE5zSXVtSDBESmFvcm9UZ2hIdE9SZWRtVHB5Cm9lYjZwTm5WRnpGMXJvVjlJcTQvQVVhRzlpaDV5TEhhNUZjWHhINGNEckMwa3FaV3M3MnlsKzJxcC9DM3hhZy9sUmJRLzZHVzZ3aGYKR0hkUEFnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSRgo2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFmQmdOVkhTTUVHREFXZ0JSRjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QU5CZ2txCmhraUc5dzBCQVFVRkFBT0NBUUVBb2c2ODMrTHQ4T055YzNwa2xMLzNjbWJZTXVSQ2RXS3VoK3Z5MWRuZVZyT2Z6TTRVS0xrTmwyQmMKRWt4WTVOTTlnMGxGV0pjMWFScW9SK3BXeG5tckV0aG5nWVRmZndrOGxPYTRKaXdndlQyektJbjNYLzhpNHBlRUgrbGw3NGZnMzhGbgpTYk5kNjdJSkt1c203WGkrZlQ4cjg3Y21OVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpCjhiNVFaN2RzdmZQeEgyc01OZ2NXZnpkOHFWdHRldkVTUm1DRDF5Y0V2a3ZPbDc3RFp5cG9FZCtBNXd3elpyOFREUlJ1ODM4Zll4QWUKK28wYkpXMXNqNlczWVFHeDBxTW1vUkJ4bmEzaXcvbkRtVkczS3djSXppN21VTEtuK2dwRkw2THc4Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEdsb2JhbCBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcnpDQ0FwZWdBd0lCQWdJUUNEdmdWcEJDUnJHaGRXckpXWkhIU2pBTkJna3Foa2lHOXcwQkFRVUZBREJoTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXcKSGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCRFFUQWVGdzB3TmpFeE1UQXdNREF3TURCYUZ3MHpNVEV4TVRBdwpNREF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzCmR5NWthV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3EKaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0anZoRVhMZXFLVFRvMWVxVUtLUEMzZVF5YUtsN2hMT2xsc0JDU0RNQVpPbgpUakMzVS9kRHhHa0FWNTNpalNMZGh3WkFBSUVKenM0Ymc3L2Z6VHR4UnVMV1pzY0ZzM1luRm85N25oNlZmZTYzU0tNSTJ0YXZlZ3c1CkJtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0NDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUgKNGlkcTlKb3orRWtJWUl2VVg3UTZoTCtocWtwTWZUN1BUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveQo3dnJUQzBMVXE3ZEJNdG9NMU8vNGdkVzdqVmcvdFJ2b1NTaWljTm94Qk4zM3NoYnlUQXBPQjZqdFNqMWV0WCtqa01Pdkp3SURBUUFCCm8yTXdZVEFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUlRMdG0KOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3RFFZSktvWklodmNOQVFFRgpCUUFEZ2dFQkFNdWNONnBJRXhJSyt0MUVuRTlTc1BUZnJnVDFlWGtJb3lRWS9Fc3JoTUF0dWRYSC92VEJIMWpMdUcyY2VuVG5tQ21yCkViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZzA2Ty9uVnNKOGRXTzQxUDBqbVA2UDZmYnRHYmZZbWJXMFc1QmpmSXQKdGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGUG5sVWtpYVk0SUJJcURmdjhOWjVZQmJlck9nT3pXNnNSQmM0TDBuYTRVVStLcmsyVTg4NgpVQWIzTHVqRVYwbHNZU0VZMVFTdGVEd3NPb0JycCt1dkZSVHAySW5CdVRoczRwRnNpdjlrdVhjbFZ6REFHeVNqNGR6cDMwZDh0YlFrCkNBVXc3QzI5Qzc5RnYxQzVxZlBybUFFU3JjaUl4cGcwWDQwS1BNYnAxWldWYmQ0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnNNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNzdwpLUVlEVlFRREV5SkVhV2RwUTJWeWRDQklhV2RvSUVGemMzVnlZVzVqWlNCRlZpQlNiMjkwSUVOQk1CNFhEVEEyTVRFeE1EQXdNREF3Ck1Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREVScFoybERaWEowSUVsdVl6RVoKTUJjR0ExVUVDeE1RZDNkM0xtUnBaMmxqWlhKMExtTnZiVEVyTUNrR0ExVUVBeE1pUkdsbmFVTmxjblFnU0dsbmFDQkJjM04xY21GdQpZMlVnUlZZZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWJNNVhQbSs5Uzc1UzB0Ck1xYmY1WUUveWMwbFNiWnhLc1BWbERSbm9nb2NzRjlwcGtDeHhMZXlqOUNZcEtsQldUclQzSlRXUE50ME9LUkt6RTBsZ3ZkS3BWTVMKT083elNXMXhrWDVqdHF1bVg4T2toUGhQWWxHKytNWHMyemlTNHdibENKRU14Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0MwpNUnVOczhja1JacW5yRzBBRkZvRXQ3b1Q2MUVLbUVGQklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRCk5BUVRYS0Z4MDFwOFZkdGVaT0UzaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWUKaDEwYVVBc2dFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUFGTEUrdzJrRCtMOUhBZFNZCkpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lY256eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVEKVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6ZU03YjQxTjVjZGJsSVpRQjJsV0htaVJrOW9wbXpONmNOODJvTkxGcApteVBJbm5naUszQkQ0MVZITVdFWjcxakZoUzlPTVBhZ01SWWp5T2ZpWlJZenk3OGFHNkE5K01wZWl6R0xZQWlKTFF3R1hGSzN4UGtLCm1ORVZYNThTdm53Mll6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKdkVzWENTKzB5eDVEYU1rSEo4SFNYUGZxSWJsb0VwdzhuTCtlL0lCY20yUE43RWVxSlNkbm9EZnpBSUo5Vk5lcCtPa3VFNk4zNkI5SwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0cGx1cyBDbGFzcyAyIFByaW1hcnkgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEa2pDQ0FucWdBd0lCQWdJUkFJVzlTL1BZMnVOcDlwVFhYOE9sUkNNd0RRWUpLb1pJaHZjTkFRRUZCUUF3UFRFTE1Ba0dBMVVFCkJoTUNSbEl4RVRBUEJnTlZCQW9UQ0VObGNuUndiSFZ6TVJzd0dRWURWUVFERXhKRGJHRnpjeUF5SUZCeWFXMWhjbmtnUTBFd0hoY04KT1Rrd056QTNNVGN3TlRBd1doY05NVGt3TnpBMk1qTTFPVFU1V2pBOU1Rc3dDUVlEVlFRR0V3SkdVakVSTUE4R0ExVUVDaE1JUTJWeQpkSEJzZFhNeEd6QVpCZ05WQkFNVEVrTnNZWE56SURJZ1VISnBiV0Z5ZVNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCkFEQ0NBUW9DZ2dFQkFOeFFsdEFTK0RYU0NIaDZ0bEp3L1cvdXo3a1J5MTEzNGV6cGZnU04xc3h2YzBOWFlLd3pDa1RzQTE4Y2dDU1IKNWFpUlZoS0M5K0FyOU51dVlTNkpFSTFyYkxxekFyM1ZOc1ZJTnlQaThGbzNVak1YRXVMUllFMitMMEVSNC9ZWEpReUxrY0FibVh1WgpWZzJ2N3RLOFIxZmplVWw3TklrbkpJVGVzZXpwV0U3K1R0OWF2a0d0ckFqRkdBN3YwbFB1Yk5DZEVnRVRqZHlBWXZlVnFVU0lTbkZPCllGV2UyeU1aZVZZSEREOWpDMXl3NHI1K0ZmeVVNMWhCT0hURTRZK0wzeWFzSDdXTE83ZERXV3V3SktadGtJdkVjdXBkTTVpM3k5NWUKZSsrVThScyt5c2tod2NXWUFxcWk5bHQzbS9WK2xsVTBIR2Rwd1BGQzQwZXMvQ2djWmxVQ0F3RUFBYU9CakRDQmlUQVBCZ05WSFJNRQpDREFHQVFIL0FnRUtNQXNHQTFVZER3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTQzTXQzOHNPS0F6ZTNiT2t5bm00anJ2b01Ja3dFUVlKCllJWklBWWI0UWdFQkJBUURBZ0VHTURjR0ExVWRId1F3TUM0d0xLQXFvQ2lHSm1oMGRIQTZMeTkzZDNjdVkyVnlkSEJzZFhNdVkyOXQKTDBOU1RDOWpiR0Z6Y3pJdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNuVk0rSVJCbkwzOVIvQU45V00ySzE5MUVCa092RApQOUdJUk9ra1hlL25GTDBndDVvOEFQNXRuOXVRM05mMFl0YUxjRjNuNVFSSXFXaDh5ZkZDODJ4L3hYcDhIVkdJdXRJS1BpZGQzaTFSClR0TVRaR25rTHVQVDU1c0ptYWJnbFp2T0d0ZC92anpPVXJNUkZjRVBGODBEdTV3bEZicWlkb244QnZFWTBKTkxEbnlDdDZYMDlsLysKN1VDbW5ZUjBPYm5jSG9VVzJpa2JoaU1BeWJ1SmZtNkFpQjR2RkxRREpLZ3lid09hUnl3d3ZsYkdwMElDY0J2cVFOaTZCUU53QjZTVwovLzFJTXdyaDNLV0JrSnROM1gzbjU3TE5YTWhxbGZpbDlvM0VYWGdJdm5zRzFrblBHVFpRSXk0STVwNEZUVWNZMVJicHNkYTJFTlc3Cmw3K2lqclJVCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRTVCBSb290IENBIFgzCj09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEU2pDQ0FqS2dBd0lCQWdJUVJLK3dnTmFqSjdxSk1EbUdMdmhBYXpBTkJna3Foa2lHOXcwQkFRVUZBREEvTVNRd0lnWURWUVFLCkV4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVREa1JUVkNCU2IyOTBJRU5CSUZnek1CNFgKRFRBd01Ea3pNREl4TVRJeE9Wb1hEVEl4TURrek1ERTBNREV4TlZvd1B6RWtNQ0lHQTFVRUNoTWJSR2xuYVhSaGJDQlRhV2R1WVhSMQpjbVVnVkhKMWMzUWdRMjh1TVJjd0ZRWURWUVFERXc1RVUxUWdVbTl2ZENCRFFTQllNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBTit2NlpkUUNJTlh0TXhpWmZhUWd1ekgweXhyTU1wYjdObkRmY2RBd1JnVWkrRG9NM1pKS3VNL0lVbVQKckU0T3J6NUl5Mlh1L05NaEQyWFNLdGt5ajR6bDkzZXdFbnUxbGNDSm82bTY3WE11ZWd3R01vT2lmb29VTU0wUm9PRXFPTGw1Q2pIOQpVTDJBWmQrM1VXT0R5T0tJWWVwTFlZSHNVbXU1b3VKTEdpaWZTS09lRE5vSmpqNFhMaDdkSU45YnhpcUtxeTY5Y0szRkN4b2xrSFJ5CnhYdHFxelRXTUluLzVXZ1RlMVFMeU5hdTdGcWNraDQ5WkxPTXh0Ky95VUZ3N0JaeTFTYnNPRlU1UTlEOC9SaGNRUEdYNjlXYW00MGQKdXRvbHVjYlkzOEVWQWpxcjJtN3hQaTcxWEFpY1BOYURhZVFRbXhrcXRpbFg0K1U5bTUvd0FsMENBd0VBQWFOQ01FQXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTVNuc2FSN0xISDYyK0ZMa0hYL3hCVmdoWWtRCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ2pHaXliRndCY3FSN3VLR1kzT3IrRHh6OUx3d21nbFNCZDQ5bFpSTkkrRFQ2OWlrdWcKZEIvT0VJS2NkQm9kZnBnYTNjc1RTN01nUk9TUjZjejhmYVhiYXVYKzV2M2dUdDIzQURxMWNFbXY4dVhyQXZIUkFvc1p5NVE2WGtqRQpHQjVZR1Y4ZUFscndEUEd4cmFuY1dZYUxidW1SOVliSytybG1NNnBaVzg3aXB4WnpSOHNyekptd04walA0MVpMOWM4UERISXloOGJ3ClJMdFRjbTFEOVNaSW1sSm50MWlyL21kMmNYamJEYUpXRkJNNUpER0ZvcWdDV2pCSDRkMVFCN3dDQ1pBQTYyUmpZSnNXdklqSkV1YlMKZlpHTCtUMHlqV1cwNlh5eFYzYnF4YllvT2I4VlpSekk5bmVXYWdxTmR3dllrUXNFamdmYktiWUs3cDJDTlRVUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEU1QgQUNFUyBDQSBYNgo9PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUNUQ0NBdkdnQXdJQkFnSVFEVjZaQ3RhZHQzanMyQWRXTzRZVjJUQU5CZ2txaGtpRzl3MEJBUVVGQURCYk1Rc3dDUVlEVlFRRwpFd0pWVXpFZ01CNEdBMVVFQ2hNWFJHbG5hWFJoYkNCVGFXZHVZWFIxY21VZ1ZISjFjM1F4RVRBUEJnTlZCQXNUQ0VSVFZDQkJRMFZUCk1SY3dGUVlEVlFRREV3NUVVMVFnUVVORlV5QkRRU0JZTmpBZUZ3MHdNekV4TWpBeU1URTVOVGhhRncweE56RXhNakF5TVRFNU5UaGEKTUZzeEN6QUpCZ05WQkFZVEFsVlRNU0F3SGdZRFZRUUtFeGRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRERVJNQThHQTFVRQpDeE1JUkZOVUlFRkRSVk14RnpBVkJnTlZCQU1URGtSVFZDQkJRMFZUSUVOQklGZzJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUF1VDMxTE1tVTNIV0tsVjFqNklSM2RtYTVXWkZjUnQyU1BwLzVEZ08wUFdHU3ZTTW10V1B1a3RLZTFqekkKRFpCZlpJR3hxQWdOVE5qNTB3VW9VclFCSmNXVkhBeCtQaENFZGMvQkdaRmp6K2lva1lpNVExSzdnTEZWaVlzeCt0QzNkcjVCUFRDYQpwQ0lsRjNQb0h1TFRyQ3E5V3pnaDFTcEwxMVY5NHpwVnZkZHRhd0pYYStaSGZBaklncnJlcDRjOW9XMjRNRmJDc3dLQlh5MzE0cG93CkdDaTRadFBMQVpadjZvcEZWZGJnbmY5bkt4Y0NwazRhYWhFTGZyZDc1NWpXakhadndUdmJVSk4rNWRDT0h6ZTR2YnJHbjJ6cGZEUHkKTWp3bVIvb25KQUxKZmgxYmlFSVRhalY4ZlRYcExtYVJjcFBWTWliRWRQVlRvN05kbXZZSnl3SURBUUFCbzRISU1JSEZNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnSEdNQjhHQTFVZEVRUVlNQmFCRkhCcmFTMXZjSE5BZEhKMWMzUmtjM1F1ClkyOXRNR0lHQTFVZElBUmJNRmt3VndZS1lJWklBV1VEQWdFQkFUQkpNRWNHQ0NzR0FRVUZCd0lCRmp0b2RIUndPaTh2ZDNkM0xuUnkKZFhOMFpITjBMbU52YlM5alpYSjBhV1pwWTJGMFpYTXZjRzlzYVdONUwwRkRSVk10YVc1a1pYZ3VhSFJ0YkRBZEJnTlZIUTRFRmdRVQpDWElHVGhoREQrWFd6TU5xaXpGN2VJK29nN2d3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUtQWWp0YXkyODRGNXpMTkFkTUVBK1YyCjVGWXJuSm1RNkFnd2JOOTlQZTdsdjdVa1FJUko0ZEVvcnNUQ09sTXdpUEgxZDI1Unl2ci9tYThrWHh1Zy9mS3NoTXJmcWZCZkJDNnQKRnI4aGx4Q0JQZVAvaDQweTNKVGxSNHBlYWhQSmxKVTkwdTdJTkpYUWdOU3RNZ2lBVkR6Z3ZWSlQxMUo4c21rL2YzclBhblRLK2dRcQpuRXhhQnFYcElLMUZaZzlwOGQyLzZlTXlpL3Jnd1laTmNqd3UySk40Q2lyNDJOSW5QUm1KWDFwN2lqdk1ETnBScnNjTDl5dXdOd1hzCnZGY2o0ampTbTJqelZoS0lUMEo4dURIRXRkdmt5Q0UwNlVnUk5lNzZ4NUpYeFo4MDVNZjI5dzRMVEp4b2VIdHhNY2ZySHVCblFmTzMKb0tmTjVYb3pObXI2bWlzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUVVJLVFJVU1QgQ2VydGlmaWNhdGUgU2VydmljZXMgUHJvdmlkZXIgUm9vdCAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQrekNDQXVPZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBRENCdHpFL01EMEdBMVVFQXd3MlZNT2NVa3RVVWxWVFZDQkYKYkdWcmRISnZibWxySUZObGNuUnBabWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hNUXN3Q1FZRFZRUUdEQUpVVWpFUApNQTBHQTFVRUJ3d0dRVTVMUVZKQk1WWXdWQVlEVlFRS0RFMG9ZeWtnTWpBd05TQlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwCmFjV2ZhVzBnZG1VZ1FtbHNhY1dmYVcwZ1I4TzhkbVZ1YkduRW4ya2dTR2w2YldWMGJHVnlhU0JCTHNXZUxqQWVGdzB3TlRBMU1UTXgKTURJM01UZGFGdzB4TlRBek1qSXhNREkzTVRkYU1JRzNNVDh3UFFZRFZRUURERFpVdzV4U1MxUlNWVk5VSUVWc1pXdDBjbTl1YVdzZwpVMlZ5ZEdsbWFXdGhJRWhwZW0xbGRDQlRZY1NmYkdGNXhMRmp4TEZ6eExFeEN6QUpCZ05WQkFZTUFsUlNNUTh3RFFZRFZRUUhEQVpCClRrdEJVa0V4VmpCVUJnTlZCQW9NVFNoaktTQXlNREExSUZURG5GSkxWRkpWVTFRZ1FtbHNaMmtneExCc1pYUnB4WjlwYlNCMlpTQkMKYVd4cHhaOXBiU0JIdzd4MlpXNXNhY1NmYVNCSWFYcHRaWFJzWlhKcElFRXV4WjR1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBeWxJRjFtTUQyQnhmM2RKN1hmSU1ZR0ZiYXp0MEszZ05mVVc5SW5Ub2pBUEJ4aEVxUFpXOHFaU3d1NUdYCnlHbDhoTVcwa1d4c0UycWtWYTJraGVpVmZyTUFyd0RDQlJqMWNKMDJpNjdMNUJ1QmY1T0krMnBWdTMyRmtzNjZXSi9iTXNXOVhlOGkKU2k5QkIzNUpZYk9HN0U2bVFXNkV2QVBzOVRzY3lCL0M3cWp1NmhKS2pSVFA4d3JnVURuNUNEWDRFVm10NXlMcVM4b1VCdDVDdXJLWgo4eTFVaUJBRzZ1RWFQajFuSC92TyszeUM2QkZkU3NHNUZPcFUyV2FiZklsOUJKcGl5ZWxTUEo2Yzc5TDFKdVRtNVJoOGkyN2ZiTXg0ClcwOXlzc3RjUDR3RmpkRk1qSzJTeCtGNGYyVnNTUVpRTEo0eXd0ZEt4bldLV1U1MWIwZGV3UUlEQVFBQm94QXdEakFNQmdOVkhSTUUKQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFWOVZYL041YUFXU0drL0tFVlRDRDIxRi9hQXlUOHo1QWE5Q0VLbXU0NgpzV3J2Ny9oZzBVdzJaa1VkODJZQ2RBUjdrakNvM2dwMkQrK1ZicjNKTitZYURheUpTRnZNZ3piQzlVWmNXWUpXdE5YK0k3VFlWQnhFCnE4U241UlRPUEVGaGZFUG16Y1NCQ1lzaysxUWwxaGFvbGd4bkIyK3pVRWZqSENRbzNTcVlwR0grMitvU043d0JHalNGdlc1UDU1RnkKQjBTRkhsaktWRVRkOTZ5NXk0a2hjdHVQd0drcGx5cWpyaGdqbHh4QktvdDhLc0Y4a09pcEtNRFRrY2F0S0lkQWFMWC83S2ZTMHpnWQpuTk45YVYzd3hxVWVKQnVqUi94cEIyam41SnEwN1EraGg0Y0N6b2ZTU0U3aHZQL0w4WEtTUkdRREplcmVXMjZmeWZKT3JOM0gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFVSS1RSVVNUIENlcnRpZmljYXRlIFNlcnZpY2VzIFByb3ZpZGVyIFJvb3QgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUERDQ0F5U2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQnZqRS9NRDBHQTFVRUF3dzJWTU9jVWt0VVVsVlRWQ0JGCmJHVnJkSEp2Ym1scklGTmxjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4TVFzd0NRWURWUVFHRXdKVVVqRVAKTUEwR0ExVUVCd3dHUVc1cllYSmhNVjB3V3dZRFZRUUtERlJVdzV4U1MxUlNWVk5VSUVKcGJHZHBJTVN3YkdWMGFjV2ZhVzBnZG1VZwpRbWxzYWNXZmFXMGdSOE84ZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMaUFvWXlrZ1MyRnp4TEZ0SURJd01EVXdIaGNOCk1EVXhNVEEzTVRBd056VTNXaGNOTVRVd09URTJNVEF3TnpVM1dqQ0J2akUvTUQwR0ExVUVBd3cyVk1PY1VrdFVVbFZUVkNCRmJHVnIKZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeE1Rc3dDUVlEVlFRR0V3SlVVakVQTUEwRwpBMVVFQnd3R1FXNXJZWEpoTVYwd1d3WURWUVFLREZSVXc1eFNTMVJTVlZOVUlFSnBiR2RwSU1Td2JHVjBhY1dmYVcwZ2RtVWdRbWxzCmFjV2ZhVzBnUjhPOGRtVnViR25FbjJrZ1NHbDZiV1YwYkdWeWFTQkJMc1dlTGlBb1l5a2dTMkZ6eExGdElESXdNRFV3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNwTm43RGtVTk13eG1ZQ01qSFdIdFBGb3lsemtrQkgzTU9ySFVUcHZxZQpMQ0RlMkpBT0N0RnAwaWY3cW5lZkoxSWw0c3RkMk5pRFVCZDlpcldDUHdTT3ROWHdTYWRrdHg0dVh5Q2NVSFZQcitHMVFSVDBtSktJCngrWGxaRWRoUjNuOXdGSHh3Wm5uM001cSs2KzFBVERjUmh6dml1eVY3OXovcnhBYzY1M1lzS3BxaFJnTkY4ayt2L0diMEFtSlF2MmcKUXJTZGlWRlZLYzhiY0x5RVZLM0JFeCtZOUM1MllJdGRQNXF0eWd5L3AxWmJqM2U0MVo1NVNaSS80UEdYSkhwc214Y1BiZTlUbUpFcgo1QSsrV1hrSGVMdVhsZlNmYWRSWWh3cXA0OHkyV0JtZkppR3h4Rm1Oc2tGMXdLMXB6cHdBQ1BJMi96N3dvUThhckJUOXBtQVBBZ01CCkFBR2pRekJCTUIwR0ExVWREZ1FXQkJUWk43Tk9CZjNaejU4U0ZxNjJpUy9ySlRxSUhEQVBCZ05WSFE4QkFmOEVCUU1EQndZQU1BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSEpnbHJmSjNOZ3BYaU9GWDdLekxYYjdpTmNYL250dApSYmoyaFd5Zkl2d3FFQ0xzcXJrdzlxdFkxamtRTVprcEFMMkpaa0g3ZE42UndSZ0xuN1ZoeTUwNnZ2V29sS01pVlc0WFNmL1NLZkU0CkpsM3ZwYW82K1hGNzV0cFlIZE4wd2dINlBtbFlYNjNMYUw0VUxwdHN3TGJjb0NiNmR4cmlKTm9hTitCbnJkRnpndzJsR2gxdUVwSisKaEdJQUY3MjhKUmhYOHRlcGIxbUl2RFMzTG9WNG5aYmNGTU1zaWxLYmxveFNaajJHRm90SHVGRUpqT3A5elloeXMyQXpzZkFLUk84UAo5UWszaUNRT0xHc2dPcUw2RWZKQU5aeEVhR003ckROdlk3d3N1L0xTeTNaOWZZallIY2dGSFc2OGxLbG1qSGR4eC9xUitpOVJudWs1ClVyYm5CRUk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN3aXNzU2lnbiBHb2xkIENBIC0gRzIKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnVqQ0NBNktnQXdJQkFnSUpBTHRBSEVQMVhrK3dNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FVXhDekFKQmdOVkJBWVRBa05JTVJVdwpFd1lEVlFRS0V3eFRkMmx6YzFOcFoyNGdRVWN4SHpBZEJnTlZCQU1URmxOM2FYTnpVMmxuYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOCk1EWXhNREkxTURnek1ETTFXaGNOTXpZeE1ESTFNRGd6TURNMVdqQkZNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHAKYzNOVGFXZHVJRUZITVI4d0hRWURWUVFERXhaVGQybHpjMU5wWjI0Z1IyOXNaQ0JEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFyK1R1Zm9za0RoSnVxVkF0RmtRN2twSmN5cmhkaEpKQ0V5cThaVmVDUUQ1WEpNMVFpeVVxCnQyLzg3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrYmJxQkhINUMKakNBMTJVTk5oUHFFMjFJczh3NG5kd3RydnhFdmNuaWZMdGcrNWhnM1dpcHkrZHBpa0pLVnloK2M2Yk04Szh2ekFSTy9Xcy9CdFFwZwp2ZDIxbVdSVHVLQ1dzMi9pSm5lUmpPQmlFQUtmTkErazFaSXpVZDYramJxRWVtQThhdHVmSyt6ZTNnRS9iazNsVUliTHRLL3RSRURGCnlscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkTW1xWGwyTVQyOG5iZVRaN2hUcEt4VktKK1NUbm5YZXBndjlWSEtWeGFTdlIKQWlUeXN5YlVhOW9FVmVYQkNzZHRNRGVRS3VTZUZETmVGaGRWeFZ1MXl6U0prdkdkSm8raEI5VEdzbmhRMnd3TUMzd0xqRUhYdWVuZApqSWozbzAyeU1zellGOXJOdDg1bW5kVDlYdis5bHo0cGRlZCtwMkpZcnlVMHBVSEhQYndOVU1vREF3OElXaCtWYzNoaXY2OXlGR2tPCnBlVUREbmlPSmloQzhBY0xZaUFRWnpsRytxa0R6QVE0ZW1idklJTzFqRXBXanBFQS9JNWNndDZJb01QaWFHNTlqZTg4M1dYMFhheFIKN3lTQXJxcFdsMi81clgzYVlUK1lkenlsa2JZY2pDYmFaYUlKYmNIaVZPTzV5a3hNZ0k5M2UyQ2FIdCsyOGtnZURycE9WRzJZNE9HaQpHcUozVU0vRVk1THNSeG1kNitacnpzRUNBd0VBQWFPQnJEQ0JxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFkQmdOVkhRNEVGZ1FVV3lWN2xxUmxVWDY0T2ZQQWVHWmU2RHJuOE80d0h3WURWUjBqQkJnd0ZvQVVXeVY3bHFSbFVYNjQKT2ZQQWVHWmU2RHJuOE80d1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRUNBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwY0RvdgpMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQ2U2NDVSODhhN0EzaGZtCjVkalY5VlN3Zy9TN3pWNEZlMCtmZFdhdlBPaFdmdnh5ZURnRDJTdGlHd0M1K09sZ3pjek9VWXJIVURGdTRVcCtHQzlwV2JZOVpJRXIKNDRPRTVpS0hqbjNnN2dLWlliZ2U5TGdyaUJJV2hNSXhremlXTWFhNU8xTS93eVNUVmx0cGt1ekZ3YnM0QU9Qc0Y2bTQzTWQ4QVlPZgpNa2U2VWlJMEhUSjZDVmFuZkNVMnFUMUwyc0NDYndxN0VzaUhTeWNSK1I0dHg1TS9udHRmSm10UzJTNks4UlRHUkkwVnFiZS92ZDZtCkd1NnVMZnRJZHhmK3UreXZHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHAKbW8vYTc3S3dQSitIYkJJclpYQVZVakVhSk05dk1TTlFINHhQanlQRGRFRmpIRldvRk4wKzRGRlF6L0ViTUZZT2tyQ0NoZGlEeXlKawp2QzI0SmRWVW9yZ0c2cTJTcENTZ3dZYTFTaE5xUjg4dUMxYVZWTXZPbXR0cXRLYXkyMEVJaGlkMzkycWdRbXdMT003WGRWQXlrc0xmCkt6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwTGQ2bGVOY0cybXFlU3o1M09pQVRJZ0hRdjJpZVkyQnIKTlUwTGJicWhQY0NUNEg4anMxV3RjaVZPUnZuU0Z1K3daTUVCbnVuS29HcVlEcy9ZWVBJdlNiamtRdUU0TlJiMHlHNVA5NEZXNkxxagp2aU92cnYxdkErQUNPekIyK2h0dFFjOEJzZW00eVdiMDJ5YnpPcVIwOGtra1c4bXcwRmZCK2o1NjRaZkoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnZUQ0NBNldnQXdJQkFnSUlUeHZVTDFTN0wwc3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNRMGd4RlRBVApCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZVTNkcGMzTlRhV2R1SUZOcGJIWmxjaUJEUVNBdElFY3lNQjRYCkRUQTJNVEF5TlRBNE16STBObG9YRFRNMk1UQXlOVEE0TXpJME5sb3dSekVMTUFrR0ExVUVCaE1DUTBneEZUQVRCZ05WQkFvVERGTjMKYVhOelUybG5iaUJCUnpFaE1COEdBMVVFQXhNWVUzZHBjM05UYVdkdUlGTnBiSFpsY2lCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBeFBHSGY5TjRNZmM0eWZqRG1VTzh4L2U4TitkT2NicExqNlZ6SFZ4dW1LNERWNjQ0Ck4wTXZGejBmeU01b0VNRjRyaGtES3hENkxIbUQ5dWk1YUxsVjhnUkVwem41L0FTTEh2R2lUU2Y1WVh1NnQrV2lFN2JyWVQ3UWJOSG0KKy9wZTdSMjBucUExVzZHU3kvQkprdjZGQ2dVKzV0a0w0ays3M0pVMy9KSHBNalVpMFI4NlRpZUZuYkFWbERMYVlRMUhUV0JDcnBKSAo2SU5hVUZqcGlvdTVYYUhjM1psS0h6Wm51MGprZzdZMzYwZzZydzluanhjSDZBVEs3Mm94aDlUQXR2bVVjWHRuWkxpMmtVcENlMlV1Ck1Hb005WkR1bGVieXpZTHMyYUZLN1BheVMrVkZoZVp0ZUpNRUxweUNiVGFweERGa0g0YURDeXIwTlFwNHlWWFBRYkJINlRDZm1iNWgKcUFhRXVTaDZYempaRzZrNHNJTi9jOEhETzBncWdnOGhtN2pNcURYRGhCdURzejYrcEpWcEFUcUpBSGdFMmNuMG1SbXJWbjViaTRZNQpGWkdrRUN3Sk1vQmdzNVBBS3JZWUM1MStqVW55RUVwLytkVkdMeG1TbzVtbkpxeTdqRHptRHJ4SEI5eHpVZkZ3WkM4SStiUkhIVEJzClJPb3BONFdTYUdhOGd6aitlemt1MDFEd0gvdGVZTGFwcHZvblFmR2JHSEx5OVlSMFNzbG54RlN1U0dUZmpORnVzQjNoQjQ4SUhwbWMKY2VsTTJLWDNSeElmZE5GUm5vYnp3cUlqUUF0ejIwdW01M01Hak1HZzZjRlpyRWI2NWkvNHozR2NSbTI1eEJXTk9Ia0RSVWp2eEYzWApDTzZIT1NLR3NnMFBXRVAzY2FsSUx2M3ExaDhDQXdFQUFhT0JyRENCcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUY2RE53ZVJCdGpwYk84dEZuYjBjd3BqNmhsZ3dId1lEVlIwakJCZ3dGb0FVRjZETndlUkIKdGpwYk84dEZuYjBjd3BqNmhsZ3dSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVEQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMApjRG92TDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUhQR2dlQW4waTBQCjRKVXc0cHBCZjFBc1gxOWlZYW1HYW1rWURIUkoxbDJFNmtGU0dHOVlyVkJXSUdyR3ZTaHBXSkhja1JFMXFUb2R2QnFsWUo3WUgzOUYKa1duWmZydDRjc0VHRHlyT2o0VndZYXlnelF1NE9TbFdoREpPaHJzOXhDcloxeDl5N3Y1Um9TSkJzWEVDWXhxQ3NHS3JYbGNTSDkvTAozWFdnd0YxNWtJd2I0RkRtM2pIK21IdHdYNldRMkszNEFyWnYwMkRkUUVzaXhUMnRPbnFmR2hwSGtYa3p1b0xjTW1rRGxtNGZTL0J4Ci91Tm5jcUN4djF5TDVQcVpJc2VFdVJ1Tkk1Yy83U1hnejJXNzlXRUU3OTBlc2xwQklscWhuMTBzNkZ2SmJha01ESGlxWU1aV2p3RmEKREdpOGFSbDV4QjkrbHdXL3hla2tVVjdVMVV0VDdka2pXallEWmFQQkE2MUJNUE5HRzRXUXIyVzExYkhrRmx0NGRSMlhlbTFacVNxUAplOTdEaDRrUW1VbHplTWc5dlZFMWRDclY4WDVwR3lxN083MGx1SnBhUFhKaGtHYUg3Z3pXVGRRUmRBdHEvZ3NEL0tOVlY0bitTc3V1Cld4Y0Z5UEtOSXpGVE9OSXRhaitDdVkwSWF2ZGVRWFJ1d3hGK0I2d3BZSkUvT01wWEVBMjlNQy9IcGVaQm9OcXVCWWVhb0tSbGJFd0oKREltNnVOTzV3Sk9LTVBxTjVacHJGUUZPWjZyYVlsWStoQWhtMHNRMmZhYytFUHlJNE5TQTVRQzlxdk5PQnFONmF2bGljdU1KVCt1YgpEZ0VqOForN2ZOemNiQkdYSmJMeXRHTVUwZ1lxWjR5RDljN3FCOWlhYWg3czVBcTdLa3pyQ1dBNXpzcGkyQzV1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZEQ0NBbVNnQXdJQkFnSVFHS3kxYXYxcHRoVTZZMnl2MnZyRW9UQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRRwpFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakV4TUM4R0ExVUVBeE1vUjJWdlZISjFjM1FnVUhKcGJXRnllU0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05qRXhNamN3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1GZ3gKQ3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRFd0x3WURWUVFERXloSFpXOVVjblZ6ZENCUQpjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCCkNnS0NBUUVBdnJnVmUvL1VmSDFucllOa2U4aENVeTNmOW9RSUlHSFdBVmxxbkVRUnIrOTIvWlYrem1Fd3UzcURYd0s5QVdiSzdoV04KYjZFd25MMmhoWjZVT3ZOV2lBQXh6OWp1YXBZQzJlMERqUHQxYmVmcXVGVVdCUmFhOU9CZXNZakFaSVZjRlUySXg3ZTY0SFhwclFVOQpuY2VKU09DN0tNZ0Q0VENUWkY1U3dGbHdJalZYaUlyeGxRcUQxN3d4Y3dFMDdlOUdjZUJyQXFnMWNtdVhtMmJneXh4NVg5Z2FCR2dlClJ3TG1uV0RpTnBjQjM4NDFrdCsrWjhkdGQxazdqNTNXa0JXVXZFSTBFTUU1K2JFblBuN1dpblhGc3ErVzA2TGVtK1NZdm4zaDZZR3QKdG0vODF3N2E0RFN3RFJwMzUrTUltTzlZK3B5RXR6YXZ3dCtzMHZRUUJuQnhOUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVTE5WUVFaY1ZpL0NQTm1GYlN2dHIyWm5KTTVJd0RRWUpLb1pJCmh2Y05BUUVGQlFBRGdnRUJBRnB3Znl6ZHR6UlA5WVpScVNhK1M3aXE4WEVOM0dISG9PbzBIbnAzRHdRMTZDZVBiSkMva1JZa1JqNUsKVHM0ckZ0VUxVaDM4SDJlaUFrVXhUODd6K2dPbmVaMVRhdG5hWXpyNGdOZlRtZUdsNGI3VVZYR1lOVHEraytxdXJVS3lrRy9nL0NGTgpOV016aVVuV20wN0t4K2RPQ1FEMzJzZnZtV0taZDdhVklsNktvS3YwdUhpWXlqZ1ptY2x5bm5qTlM2eXZHYUJ6RWkzOHdrRzZnWkhhCkZsb3h0L20wY1lBU1NKbHljMXBaVThGalVqUHRwOG5TT1FKdyt1Q3hRbVlwcXB0UjdUQlVJaFJmMmFzZHdlU1U4UGoxSy9mcXluaEcKMXJpUi9hWU5LeG9VQVQ2QThFS2dsUWRlYmMzTVM2UkZqYXNTNkxQZVd1V2dmT2dQSWgxYTZWaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKdGhhd3RlIFByaW1hcnkgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSURDQ0F3aWdBd0lCQWdJUU5FN1ZWeURWN2V4SjlDL09OOXNyYlRBTkJna3Foa2lHOXcwQkFRVUZBRENCcVRFTE1Ba0dBMVVFCkJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjIKYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodgpjbWw2WldRZ2RYTmxJRzl1YkhreEh6QWRCZ05WQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3SGhjTk1EWXhNVEUzCk1EQXdNREF3V2hjTk16WXdOekUyTWpNMU9UVTVXakNCcVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2cKU1c1akxqRW9NQ1lHQTFVRUN4TWZRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdgpLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SHpBZEJnTlZCQU1UCkZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3MKb1BEN2dGblVuTWVrejUyaFdYTUpFRVVNRFN4dWFQRnNXMGhvU1ZrMy9Bc3pHY0ozZjh3UUxaVTBIT2JyVFFtbkhOSzR5WmMyQXJlSgoxQ1JmQnNETVJKU1VqUUppYit0YTNSR05LSnBjaEpBUWVnMjlkR1l2YWppZzR0VlVST3NkQjU4SHVtL3U2ZjFPQ3luMVBvU2dBZkdjCnEvZ2Nmb21rNktIWWNXVU5vMUY3N3J6U0ltQU51VnVkMzdyOFVWc0xyNWl5NlM3cEJPaGloOTRyeU5kT3dVeGtIdDNQaDFpNlNrL0sKYUFjZEhKMUt4dFV2a2N4OGNYSWN4Y0JuNnpMOXlaSmNsTnFGd0p1L1UzMHJDZlNNblpFZmwycFN5OTRKTnFSMzJIdUhVRVRWUG00cAphZnM1U1NZZUNhV0FlMEF0NitnbmhjbitZZjErNW55WEhkV2RBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEClZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlI3VzBYUHI4N0xldjB4a2hwcXR2Tkc2MWRJVURBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFlUkhBUzdPUnR2enc2V2ZVRFc1RnZsWG9rOUxPQXovdDJpV3dIVmZMSGpwMm9FenNVSGJvWkhJTXBLbnh1SXZXMW9lRQp1ekxsUVJIQWQ5bXpZSjNyRzlYUmJrUkVxYVlCN0ZWaUhYZTRYSTVJU1h5Y08xY1JySzF6TjQ0dmVGeVFhRWZaWUdEbS9BYzlJaUFYCnhQY1c2Y1RZY3ZuSWMzemZGaThWcVQ3OWFpZTJvZXRhdXBnZjFlTk5aQXFkRThoaHV2VTVISWU2dUwxN0luLzIvcXhBZWVXc0VHODkKanh0NWRvdkVON01oR0lUbE5nRHJZeUNadWVuK013UzdRY2pCQXZsRVl5Q2VnYzVDMDlZL0xIYlRZNXhaM1krbTRRNmdMa0gzTHBWSAp6N3o5TS9QMkMyRitmcEVyZ1VmQ0p6RHVweEJkTjQ5Y09TdmtCUEI3alZhTWFBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRTB6Q0NBN3VnQXdJQkFnSVFHTnJSbmlaOTZMdEtJVmpOekdzN1NqQU5CZ2txaGtpRzl3MEJBUVVGQURDQnlqRUxNQWtHQTFVRQpCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPClpYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TmlCV1pYSnBVMmxuYml3Z1NXNWpMaUF0SUVadmNpQmhkWFJvYjNKcGVtVmsKSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnBVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpVd0hoY05NRFl4TVRBNE1EQXdNREF3V2hjTk16WXdOekUyTWpNMU9UVTVXakNCCnlqRUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG4KYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaApkWFJvYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0CllYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSelV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXcKZ2dFS0FvSUJBUUN2SkFnSUtYbzFubUFNcXVkTE8wN2NmTHc4UlJ5N0srRCtLUUw1VndpalpJVVZKL1h4cmNneGlWMGk2Q3FxcGtLegpqL2k1VmJleHQwdXovbzkrQjFmczcwUGJabUlWWWM5Z0RhVFkzdmpndzJJSVBWUVQ2MG5LV1ZTRkp1VXJqeHVmNi9XaGtjSXpTZGhEClkycFNTOUtQNkhCUlRkR0phWHZIY1BhejNCSjAyM3RkUzFiVGxyOFZkNkd3OUtJbDhxOGNrbWNZNWZRR0JPK1F1ZVFBNU4wNnRSbi8KQXJyMFBPN2dpK3MzaSt6MDE2enk5dkE5cjkxMWtUTVpIUnhBeTNRa0dTR1QyUlQrckNwU3g0L1ZCRW5raldOSGlEeHBnOHYrUjcwcgpmay9GbGE0T25kVFJROEJuYytNVUNIN2xQNTl6dURNS3oxMC9OSWVXaXU1VDZDVVZBZ01CQUFHamdiSXdnYTh3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKYVcxaFoyVXYKWjJsbU1DRXdIekFIQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWphSFIwY0RvdkwyeHZaMjh1ZG1WeQphWE5wWjI0dVkyOXRMM1p6Ykc5bmJ5NW5hV1l3SFFZRFZSME9CQllFRkgvVFphZkMzZXk3OERBSjgwTTUrZ0t2TXpFek1BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUNUSkVvd1gyTFAyQnFZTHozcTNKa3R2WGYycFhraU9PekVwNkI0RXExaURrVndaTVhubDJZdG1BbCsKWDYvV3pDaGw4Z0dxQ0JwSDN2bjVmSkphQ0drZ0RkaytiVzQ4RFc3WTVnYVJRQmk1K01IdDM5dEJxdUNXSU1uTlpCVTRnY21VN3FLRQpLUXNUYjQ3YkROMGxBdHVraXhsRTBrRjZCV2xLV0U5Z3luNkNhZ3NDcWlVWE9iWGJmK2VFWlNxVmlyMkczbDZCRm9NdEVNemUvYWlDCkttMG9IdzBMeE9YbkdpWVo0ZlFSYnhDMWxmem5RZ1V5Mjg2ZFVWNG90cDZGMDF2dnBYMUZRSEtPdHc1ckRnYjdNelZJY2JpZEo0dkUKWlY4TmhuYWNSSHIybFZ6MlhUSUlNNlJVdGhnL2FGenlRa3FGT0ZTRFg5SG9MUEtzRWRhbzdXTnEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlVHJ1c3QgQ0EKPT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lRRFBDT1hBZ1dwYTFDZi9Eckp4aFowREFOQmdrcWhraUc5dzBCQVFVRkFEQklNUXN3Q1FZRFZRUUcKRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eEZ6QVZCZ05WQkFNVERsTmxZM1Z5WlZSeQpkWE4wSUVOQk1CNFhEVEEyTVRFd056RTVNekV4T0ZvWERUSTVNVEl6TVRFNU5EQTFOVm93U0RFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlCkJnTlZCQW9URjFObFkzVnlaVlJ5ZFhOMElFTnZjbkJ2Y21GMGFXOXVNUmN3RlFZRFZRUURFdzVUWldOMWNtVlVjblZ6ZENCRFFUQ0MKQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLdWtnZVdWemZYMkZJN0NUOHJVNG5pVldKeEI0UTJaUUNRWApPWkV6WnVtKzRZT3ZZbHlKMGZ3a1cyR3o0QkVSUVJ3ZGJ2QzR1L2plcDRHNnBrakdueDI5dm82cFFUNjRsTzBwR3RTTzBnTWRBKzl0CkRXY2NWOWNHcmNySTlmNE9yMllsU0FTV0MxMmp1aGJEQ0UvUlJ2Z1VYUExJWGdHWmJmMkl6SWFvd1c4eFFteFNQbWpMOHhrMDM3dUgKR0ZhQUpzVFEzTUJ2Mzk2Z3dwRVdvR1FSUzBTOEh2Ym4rbVBlWnF4MnBIR2o3RGFVYUhwM3BMSG5EaStCZXVLMWNvYnZvbXVMOEEvYgowMWsvdW5LOFJDU2M0M096OTY5WEwwSW1uYWwwdWdCUzhrdk5VM3hIQ3phRkRtYXBDSmNXTkZmQlp2ZUE0KzF3Vk1lVDRDNG9GVm1ICnVyc0NBd0VBQWFPQm5UQ0JtakFUQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUWpLMkZ2b0UvZjVkUzNyRC9mZE1RQjFhUTY4d05BWURWUjBmQkMwd0t6QXBvQ2VnSllZagphSFIwY0RvdkwyTnliQzV6WldOMWNtVjBjblZ6ZEM1amIyMHZVMVJEUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0MzZaM3EwNTljNEVWbGV3M0tXK0p3VUxLVUJSU3UKU2NlTlFRY1NjNVIrRENNaC9id1FmMkFRV25MMW1BNnM3TGwvM1hwdlhkTWM5UCtJQldsQ3FRVnh5TGVzSnVndXRJeHEvM0hjdUxIZgptYng4SVZRcjVGaWl1MWNwcnA2cG94a21ENWt1Q0xEdi9XblBtUm9KamVPbm55dkpOalI3SkxONFRKVVhwQVltSHJaa1VqWmZZR2ZaCm5NVUZkQXZuWnlQU0NQeUk2YTZMZitFdzlEZCsvY1l5MmkyZVJEQXdiTzRIM3RJMC9OTC9RUFpMOUdaR0JsU204aklLWXlZd2E1dlIKM0l0SHV1RzUxV0xRb3FEMFp3VjRLV01hYndUVytNWk1vNXF4TjdTTjVTaExIWjRzd3Job3ZPMEM3akU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZSBHbG9iYWwgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHZEQ0NBcVNnQXdJQkFnSVFCMVlpcE9qVWlvbE45QlBJOFBqcXBUQU5CZ2txaGtpRzl3MEJBUVVGQURCS01Rc3dDUVlEVlFRRwpFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JICmJHOWlZV3dnUTBFd0hoY05NRFl4TVRBM01UazBNakk0V2hjTk1qa3hNak14TVRrMU1qQTJXakJLTVFzd0NRWURWUVFHRXdKVlV6RWcKTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHhHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3ZwpRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZOUzdZckd4VmFRWng1Uk5vSkxOUDJNd2hSL2p4CllEaUppUVBwdmVwZVJsTUozRnoxV3VqM1JTb0M2ekZoMXlrelRNN0hmQW8zZmcrNk1wamhIWmV2ajhmY3lUaVc4OXNhL0ZIdGFNYlEKYnFSOEpOR3VRc2lXVUdNdTRQNTEvcGluWDBrdWxlTTVNMlNPSHFSZmtOSm5QTExaL2tHNVZhY0pqbklGSG92ZFJJV0NRdEJKd0IxZwo4TkVYTEpYcjlxWEJrcVBGd3FjSVlBMWdCQkNXZVo0V05PYXB0dm9sUlRuSUhtWDVrL1dxOFZMY21aZzlwWVlhRERVeitrdWxCQVlWCkhER0E3Nm9ZYThKNzE5ck8rVE1nMWZXOWFqTXRnUVQ3c0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkKMFhQbmozcERBZ01CQUFHamdaMHdnWm93RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRks5RUJNSkJma2lEMjA0NUF1enNoSHJtenNta01EUUdBMVVkSHdRdE1Dc3dLYUFuCm9DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzR0FRUUJnamNWQVFRREFnRUEKTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCakdnaEFmYVJlVXcxMzJIcXVIdzBMVVJZRDd4aDh5T092YWxpVEZHQ1Jzb1RjaUU2KwpPWW82OCthQ2lWMEJON09ySktRVkRwSTFXa3BFWGs1WCtuWE9IMGpPWnZROFFDYVNtR3diN2lSR0RCZXpVcVhicFpHUnp6ZlRiK2NuCkNEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbUk1MG1EMWhwL0VkK3N0Q05pNU8vS1U5RGFYUjJaMHZQQjR6bUF2ZTE0YlJEdFVzdEZKLzUKM0NZTnY2WkhkQWJZaU5FNktUQ0V6dEk1Z0dJYnFNZFhTYnhxVlZGbkZVcStOUWZrMVhXWU4za3dGTnNwbld6RmFjeEhWYUl3OTh4YwpmOExEbUJ4clRoYUE2M3A0WlVXaUFCcXZEQTFWWkRSSXVKSzU4YlJRS2ZKUEl4L2FiS3dmUk9IZEkzaFJXOGNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIVENDQXdXZ0F3SUJBZ0lRVG9FdGlvSmw0QXNDN2o0MUFrYmxQVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JnVEVMTUFrR0ExVUUKQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnRwpBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEp6QWxCZ05WQkFNVEhrTlBUVTlFVHlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxCmRHaHZjbWwwZVRBZUZ3MHdOakV5TURFd01EQXdNREJhRncweU9URXlNekV5TXpVNU5UbGFNSUdCTVFzd0NRWURWUVFHRXdKSFFqRWIKTUJrR0ExVUVDQk1TUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRApUMDFQUkU4Z1EwRWdUR2x0YVhSbFpERW5NQ1VHQTFVRUF4TWVRMDlOVDBSUElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMEVDTGkzTGprUnYzVWNFYlZBU1kwNm0vd2VhS1hUdUgKKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkyR3FHZDBTN1dXYVhVRjYwMUN4d1JNL2FONVZDYVR3dwp4SEd6VXZBaFRhSFl1amw4SEo2akpKM3lneGFZcWhaOFE1c1ZXN2V1TkpIKzFHSW1HRWFhUCt2QitmR1FWK3VzZWcyTDIzSXdhbWJWCjRFYWpjTnhvMmY4RVNJbDMzclhwKzJkdFFlbThPYjB5MldJQzhiR29QVzQzbk9JdjR0T2lKb3ZHdUZWRGlPRWpQcVhTSkRscVI2c0EKMUtHenFTWCtEVCtuSGJyVFVjRUxwTnFzT085VlVDUUZaVWFUTkU4dGphM0cxQ0VaMG83S0JXRnhCM05INVlvWkVyMEVUYzVPbktWSQpyTHNtOXdJREFRQUJvNEdPTUlHTE1CMEdBMVVkRGdRV0JCUUxXT1dMeGt3Vk42UkFxVENwSWI1SE5scFcvekFPQmdOVkhROEJBZjhFCkJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJKQmdOVkhSOEVRakJBTUQ2Z1BLQTZoamhvZEhSd09pOHZZM0pzTG1OdmJXOWsKYjJOaExtTnZiUzlEVDAxUFJFOURaWEowYVdacFkyRjBhVzl1UVhWMGFHOXlhWFI1TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQwpBUUVBUHBpZW0vWWI2ZGM1dDNpdUhYSVlTZE9INUVPQzZ6L0pxdldvdGU5VmZDRlNaZm5WRGVGczlENk1rM09STGdMRVRnZHhiOENQCk9HRUlxQjZCQ3NBdklDOUJpNUhjU0VXODhjYmV1blpyTThnQUxURkdUTzNubmMrSWxQOHp3RmJvSklZbXVOZzRPTjhxYTkwU3pNYy8KUnhkTW9zSUdsZ25XMi80L1BFWkIzMWppVmc4OE84RWNrelhaT0ZLczdzanNMakJPbERXMEpCOUxlR25hOGdJNHpKVlNrL0J3SlZtYwpJR2ZFN3ZtTFYySDBrblo5UDRTTlZiZm81YXpWOGZVWlZxWmErNUFjcjVQcjVSelVaNWRkQkE2K0M0T21GNE81TUJLZ3hUTVZCYmtOCis4Y0ZkdVBZU28zOE5CZWp4aUVvdmpCRk1SN0hlTDVZWVRpc08rSUJaUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1akNDQXM2Z0F3SUJBZ0lRVjhzemI4SmNGdVpIRmhmamtERm80REFOQmdrcWhraUc5dzBCQVFVRkFEQmlNUXN3Q1FZRFZRUUcKRXdKVlV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdU1UQXdMZ1lEVlFRREV5ZE9aWFIzYjNKcgpJRk52YkhWMGFXOXVjeUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrd0hoY05NRFl4TWpBeE1EQXdNREF3V2hjTk1qa3hNak14Ck1qTTFPVFU1V2pCaU1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZVG1WMGQyOXlheUJUYjJ4MWRHbHZibk1nVEM1TUxrTXUKTVRBd0xnWURWUVFERXlkT1pYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGt2SDZTTUczRzJJNHJDN3hHenVBbmx0N2UrZm9TMHp3emM3TUVMN3h4CmpPV2Z0aUpnUGw5ZHpnbi9nZ3dibWxGUUdpYUozZFZoWFJuY0VnOHRDcUpEWFJmUU5KSWc2blBQT0N3R0pnbDZjdmY2VURMNHdwUFQKYWFJanprR3h6T1RWSHpiUmlqcjRqR1BpRkZscDdRM1RmMnZvdUFQbFQycmxtR05wU0FXK0x2OHp0dW1YV1duNFp4bXVrMkdXUkJYVApjckEvdkdwOTdFaC9qY09ycW5FclUybEJVelMxc0xuRkJnckVzRVgxUVYxdWlVVjdQVHNtakhUQzVkTFJmYklSMVB0WU1pS2FnTW5jCi9RenBmMTREbDg0N0FCU0hKM0E0cVk1dXN5ZDJtRkhnQmVNaHF4clZoU0k4S2JXYUZzV0FxUFM3YXpDUEwwWUNvckVNSXVEVEFnTUIKQUFHamdaY3dnWlF3SFFZRFZSME9CQllFRkNFd3lmc0ExMDZZMm9lcUt0Q25MckZBTWFkTU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01GSUdBMVVkSHdSTE1Fa3dSNkJGb0VPR1FXaDBkSEE2THk5amNtd3VibVYwYzI5c2MzTnNMbU52CmJTOU9aWFIzYjNKclUyOXNkWFJwYjI1elEyVnlkR2xtYVdOaGRHVkJkWFJvYjNKcGRIa3VZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQzdya3ZudDFmcmY2b3R0M05IaFdyQjVLVWQ1T2M4NmZSWlpYZTFlbHRhalNVMjRIcVhMampBVjJDRG1BYURuN2wyZW01UQo0THFJTFB4RnpCaXdtWlZSRHV3ZHVJai9oMUFjZ3NMajRES0F2NkFMUjhqRE1lK1paektBVHhjaGVReHBYTjVlTks0Q3RTYnFVTjkvCkdHVXN5ZkpqNGFrSC9ueHhIMnN6SkdvZUJmY0ZhTUJxRXNzdVhtSExyaWpUZnNLMFpwRW1Yend1SkYvTFdBL3JLT3l2RVpiejNIdHYKd0tlSThsTjNzMkJlcnE0bzJqVXNielJGMHliaDN1eGJUeWRyRm55OVJBUVlnck9KZVJjUWNUMTZvaFpPOVFITnBHeGxhS0ZKZGx4RAp5ZGk4Tm1kc3BaUzExTXk1dldvMVZpSGUyTVByKzh1a1lFeXdWYUNnZTFleQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpXZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdlRDQ0E2V2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhURUxNQWtHQTFVRUJoTUNWVk14SURBZUJnTlZCQW9NCkYxZGxiR3h6SUVaaGNtZHZJRmRsYkd4elUyVmpkWEpsTVJ3d0dnWURWUVFMREJOWFpXeHNjeUJHWVhKbmJ5QkNZVzVySUU1Qk1UWXcKTkFZRFZRUUREQzFYWld4c2MxTmxZM1Z5WlNCUWRXSnNhV01nVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt3SGhjTgpNRGN4TWpFek1UY3dOelUwV2hjTk1qSXhNakUwTURBd056VTBXakNCaFRFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlQmdOVkJBb01GMWRsCmJHeHpJRVpoY21kdklGZGxiR3h6VTJWamRYSmxNUnd3R2dZRFZRUUxEQk5YWld4c2N5QkdZWEpuYnlCQ1lXNXJJRTVCTVRZd05BWUQKVlFRRERDMVhaV3hzYzFObFkzVnlaU0JRZFdKc2FXTWdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRHViN1M5ZWVLUENDR2VPQVJCSmUrcld4eFRrcXh0bnQzQ3hDNUZsQU0xCmlHZDBWK1BmakxpbmRvODc5NmpFMnlsakRwRm9Ob3FYam9weGFBa0g1T2pVRGsvNDFpdE1wQmI1NzBPWWo3T2VVdDl0a1RtUE9MMTMKaTBOajY3ZVQvREJNSEFHVHRoUDc5NkVmdnlYaGREY3NIcVJlUEdqNFM3OE51UjR1TnVpcDVLZjREOHVDZFh3MUxTTFd3cjhMODdUOApiSlZoSGxmWEJJRXlnMUo1NW9Oano3ZkxZNHNSNHIxZTYvYU43WlZ5S0xTc0VtTHBTalBtZ3pLdUJYV1Z2WVNWMnlwY200NHVETGlCCkswSG1PRmFmU1p0c2R2cUtYZmNCZVlGOHdZTkFCZjV4L1F3L3pFNWdDUTVsUnhBdkFjQUZQNC80czBIdldrSitXZS9TbHd4bEFnTUIKQUFHamdnRTBNSUlCTURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTURrR0ExVWRId1F5TURBd0xxQXNvQ3FHS0doMGRIQTZMeTlqY213dQpjR3RwTG5kbGJHeHpabUZ5WjI4dVkyOXRMM2R6Y0hKallTNWpjbXd3RGdZRFZSMFBBUUgvQkFRREFnSEdNQjBHQTFVZERnUVdCQlFtCmxSa1EyZWlobDVILzNCblp0UVErMG5NS2FqQ0JzZ1lEVlIwakJJR3FNSUduZ0JRbWxSa1EyZWlobDVILzNCblp0UVErMG5NS2FxR0IKaTZTQmlEQ0JoVEVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WQkFvTUYxZGxiR3h6SUVaaGNtZHZJRmRsYkd4elUyVmpkWEpsTVJ3dwpHZ1lEVlFRTERCTlhaV3hzY3lCR1lYSm5ieUJDWVc1cklFNUJNVFl3TkFZRFZRUUREQzFYWld4c2MxTmxZM1Z5WlNCUWRXSnNhV01nClVtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhtQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTGtWc1VTUnpDUEkKSzAxMzQvaWFleWNOelhLN21RREtmR1laVU1iVm1PMnJ2d05hNVUzbEhzaFBjWmVHMWVNZC9aREpQSFYzVjNwOStONzAxTlgzbGVaMApiaDA4cm55ZDJ3SURCU3h4U3lVK0IrTmVtdlZtRnltSUdqaWZ6NnBCQTRTWGE1TTRlc293UkJza1JEUFE1TkhjS0RqMEUwTTFOU2xqCnFIeWl0YTA0cE8ydC9jYWFILytYYy83N3N6V25rNGJHZHBFQTVxeFJGc1FuTWx6YmM5cWxrMWVPUG0wMUpnaFoxZWRFMTNZZ1krZXMKRTJmRGJiRndSbnpWbGhFOWlXOWRxS0hyalFyYXd4MHpiS1BxWnhtYW1YOUxQWU5SS2gzS0w0WU1vbjRRTFN2VUZwVUxCNm91RkpKSgp0eWx2MkcweGZmWDhvUkFIaDg0dldkdytXTnM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lUQ0NBZytnQXdJQkFnSVFIMGV2cW1JQWNGQlVUQUdlbTJPWktqQUtCZ2dxaGtqT1BRUURBekNCaFRFTE1Ba0dBMVVFQmhNQwpSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFCkNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3SGhjTk1EZ3dNekEyTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeApHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SClEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm8KYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRRFIzc3ZkY21DRllYN2RlU1JGdFNyWXBuMVBsSUxCczVCQUgrWAo0UW9rUEIwQkJPNDkwbzBKbHd6Z2RlVDYrM2VLS3ZVRFlFczJpeFlqRnEwSmNmUks5Q2hRdFA2SUhHNC9iQzh2Q1ZsYnBWc0xNNW5pCnd6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXQkJSMWNhY1pTQm04blozcVFVZmZsTVJJZDVuVGVUQU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUE3d05iZXF5M2VBcHl0NGpmLzdWRwpGQWtLK3FEbWZRakdHb2U5R0toenZTYktZQXlkenBtZnoxd1BNT0crRkRIcUFqQVU5Sk04U2FjemVwQkdSN05qZlJPYlRyZHZHRGVBClUvN2RJT0ExbWpiUnh3RzU1dHpkOC84ZExEb1dWOW1TT2RZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpJR0MvQQo9PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUFqQ0NBdXFnQXdJQkFnSUZPUkZGRUpRd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z1lVeEN6QUpCZ05WQkFZVEFrWlNNUTh3RFFZRApWUVFJRXdaR2NtRnVZMlV4RGpBTUJnTlZCQWNUQlZCaGNtbHpNUkF3RGdZRFZRUUtFd2RRVFM5VFIwUk9NUTR3REFZRFZRUUxFd1ZFClExTlRTVEVPTUF3R0ExVUVBeE1GU1VkREwwRXhJekFoQmdrcWhraUc5dzBCQ1FFV0ZHbG5ZMkZBYzJka2JpNXdiUzVuYjNWMkxtWnkKTUI0WERUQXlNVEl4TXpFME1qa3lNMW9YRFRJd01UQXhOekUwTWpreU1sb3dnWVV4Q3pBSkJnTlZCQVlUQWtaU01ROHdEUVlEVlFRSQpFd1pHY21GdVkyVXhEakFNQmdOVkJBY1RCVkJoY21sek1SQXdEZ1lEVlFRS0V3ZFFUUzlUUjBST01RNHdEQVlEVlFRTEV3VkVRMU5UClNURU9NQXdHQTFVRUF4TUZTVWRETDBFeEl6QWhCZ2txaGtpRzl3MEJDUUVXRkdsblkyRkFjMmRrYmk1d2JTNW5iM1YyTG1aeU1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNoL1IwR0xGTXp2QUJJYUlzOXo0aVBmOTMwUGZlbzJhU1Z6MgpUcXJNSExtaDZ5ZUo4a2JwTzBweDFSMk9MYy9tcmF0alVNZFVDMjRTeVpBMnh0Z3YycEdxYU1WeS9oY0tzaGQrZWJVeWlIREtjTUNXClNvN2tWYzBkSjVTL3puSXE3Rno1Y3lEK3ZmY3VpV2U0dTBkekV2ZlJOV2s2OGdxNXJ2OUdRa2FpdjZHRkd2bS81UDlKaGZlamNJWXkKSEYyZllQZXByYVgvejlFMCtYMWJGOGJjMWc0b2E4TGQ4ZlV6YUoxTy9JZDhOaExXbzREb1F3MVZZWlRxWkRkSDZuZkswTEpZQmNOZApmckdvUnBBeFZzNXdLcGF5TUxoMzVubkF2U2s3L1pSM1RMMGd6VUVsNEM3SEc3dnVwQVJCMGwydEVtcUttMGY3eWQxR1FPR2RQRFBRCnRRSURBUUFCbzNjd2RUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bc0dBMVVkRHdRRUF3SUJSakFWQmdOVkhTQUVEakFNTUFvR0NDcUIKZWdGNUFRRUJNQjBHQTFVZERnUVdCQlNqQlM4WVlGRENpUXJkS3lGUC80NU9xREF4TmpBZkJnTlZIU01FR0RBV2dCU2pCUzhZWUZEQwppUXJkS3lGUC80NU9xREF4TmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUJkd20yUHAzRlVSby9DOW1PblRnWGVRcC93WUhFNFJLCnE4OXRvQjlSbFBoSnkzUTJGTHdWM2R1Skw5MlBvRjE4OVJMcm41NDRwRWZNczViWnZwd2xxd04rTXcrVmdRMzlGdUNJdmpmd2JGM1EKTVpzeUsxMFhaWk9ZWUx4dWo3R29QQjdaSFBPcEprTDVaQjNDNTVMMjlCNWFxaGxTWGEvb292ZGdvUGFOOEluMWJ1QUtCUUdWeVlzZwpDcnBhL0pvc1BMM0R0OGxkZUNVRlAxWVVtd3phK3pwSS9wZHBYc29RaHZkT2xnUUlUZXl3dmwzY080NVB3ZjJhTmpTYVRGUitGd05JCmxRZ1JIQWR2aFFoK1hVM0VuZHY3cnM2eTBiTzRnMndkc3JONThkaHdtWDd3RXdMT1h0MVIwOTgyZ2FFYmVDOXhzL0ZaVEVZWUtLdUYKMG1CV1dnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGZUQ0NBbVdnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmdNUXN3Q1FZRFZRUUdFd0pLVURFbE1DTUdBMVVFQ2hNYwpVMFZEVDAwZ1ZISjFjM1FnVTNsemRHVnRjeUJEVHk0c1RGUkVMakVxTUNnR0ExVUVDeE1oVTJWamRYSnBkSGtnUTI5dGJYVnVhV05oCmRHbHZiaUJGVmlCU2IyOTBRMEV4TUI0WERUQTNNRFl3TmpBeU1USXpNbG9YRFRNM01EWXdOakF5TVRJek1sb3dZREVMTUFrR0ExVUUKQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnlkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4S2pBb0JnTlZCQXNUSVZObApZM1Z5YVhSNUlFTnZiVzExYm1sallYUnBiMjRnUlZZZ1VtOXZkRU5CTVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQUx4LzdGZWJKT0QrbkxwQ2VhbUlpdnFBNFBVSEtVUHFqZ28wTm8wYytxZTFPWGovbDNYM0wrU3Fhd1NFUk1xbTRtaU8KL1ZWUVlnK2tjUTdPQnpndFFvVlFyVHlXYjR2Vm9nN1Aza21KUGRaa0xqamxIbXkxVjRxZTcwZ096WHBwRm9kRXRaRGtCcDJ1b1FTWApXSG52SUVxQ2E0d2l2K3dmRCttRWNlM3hEdVM0R0JQTVZqWmQwWm9lVVdzNWJtQjJpRFFMODdQUnNKM0tZZUprSGNGR0I3aGozUjR6ClpiT09DVlZTUGJXOS93ZnJyV0ZWR0N5cGFaaEtxa0RGTXhSbGRBRDVrZDZ2QTBqRlFGVGNENFNRYUNERmtwYmNMdVVDUmFyQVgxVDQKYmVwSnoxMXNTNi92bXNKV1hNWTFWa0pxTUYvQ3EvYmlQVCt6eVJHUE1VelhuMGtDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkRWSwo5VTJ2UDllQ09LeXJjV1VYZFl5ZFZaUG1NQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUNvaCtucytFQm5YY1BCWnNkQVM1ZjhoeE9RV3NUdm9NcGZpN2VudC9IV3RXUzNpck80Rzh6YSs2eG0KaUVITzZQemsyeDZJcHUwblVCc0NNQ1JHZWY0RWgzQ1hRSFBSd01GWEdacHBwU2VacTUxaWhQWlJ3U3pKSXhYWUtMZXJKUk8xUnVHRwpBdjhtak1TSWtoMVcvaGxuOGxYa2dLTnJuS3QzNFZGeERTRGJFSnJidlhaNUIzZVpLSzJhWHRxeFQwUXNOWTZsbHNmOWcvQll4bm5XCm1IeW9qZjZHUGdjV2t1Rjc1eDNzTTNaK1FpNUtoZm1SaVdpRUE0R2xtNXErNHpmRlZLdFdPeGd0UWFRTStFTGJtYURnY20rN1hlRVcKVDFNS1pQbE85TDlPVkwxNGJJanF2NXdUSk1Kd2FhSi9EOGc4clFqSnNKaEFveXJuaUlQdGQ0OTAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEOFRDQ0F0bWdBd0lCQWdJUVFUMXl4L1JySDRGRGZmSFNLRlRmbWpBTkJna3Foa2lHOXcwQkFRVUZBRENCaWpFTE1Ba0dBMVVFCkJoTUNRMGd4RURBT0JnTlZCQW9UQjFkSlUyVkxaWGt4R3pBWkJnTlZCQXNURWtOdmNIbHlhV2RvZENBb1l5a2dNakF3TlRFaU1DQUcKQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObFpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSApiRzlpWVd3Z1VtOXZkQ0JIUVNCRFFUQWVGdzB3TlRFeU1URXhOakF6TkRSYUZ3MHpOekV5TVRFeE5qQTVOVEZhTUlHS01Rc3dDUVlEClZRUUdFd0pEU0RFUU1BNEdBMVVFQ2hNSFYwbFRaVXRsZVRFYk1Ca0dBMVVFQ3hNU1EyOXdlWEpwWjJoMElDaGpLU0F5TURBMU1TSXcKSUFZRFZRUUxFeGxQU1ZOVVJTQkdiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlhTVk5sUzJWNQpJRWRzYjJKaGJDQlNiMjkwSUVkQklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXkwK3pBSnM5Ck50MzUwVWxxYXhCSkgrellLN0xHK0RLQktVT1ZUSm9aSXlFVlJkN2p5QnhSVlZ1dWsrZzMveXRyNmRUcXZpcmRxRkVyMTJiRFlWeGcKQXNqMXpuSjdPN2p5VG1VSW1zMmthaG5CQWJ0enB0ZjJ3OTNOdktTTHRabGh1QUdpbzlSTjFBVTlrYTM0dEFoeFpLOXc4UnhyZnZiRApkNTBrYzN2a0RJemgyVGJobVlzRm1RdnRSVEVKeXNJQTIvZHlvSmFxbFlmUWpzZTJZWE1OZG1hTTNCdTBZNktmZjVNVE1QR2hKOXZaCi95eFZpSkdnNEU4SHNDaFdqQmdibDBTT2lkM2dGMjduS3UrUE9Rb3hoSUxZUUJSSkxucEI1S2YrNDJUTXdWbHhTeXdocDF0OTRCM1IKTG9HYnc5aG85NzJXRzZ4d3NSWVVDOXRndVNZQkJRSURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBZEJnTlZIUTRFRmdRVXN3TityamE4c0huUjNKUW10aEcrSWJKcGhwUXdFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUV1aC93dUhiclA1d1VPeFNQTW93QjB1eVFsQitwUUFIS1NrcTBsUGp6MGU3MDF2dmJ5azl2SW0KTU1rUXloMkkrM1FaSDRWRnZiQnNVZmsyZnR2MVRESTZRVTliUjgvb0N5MjJ4Qm1kZE1WSHhqdHFENndVMnp6MGM1eXBCZDhBM0hSNAordmcxWUZrQ0V4aDh2UHROc0NCdFE3dGdNSHBuTTF6Rm1kSDRMVGxTYy91TXFwY2xYSExaQ0I2clRqempnVEdmQTZiN3dQNHBpRlhhCmhOVlFBN2JpaEtPbU5xb1JPZ0hoR0V2V1JHaXpQZmxUZElTelJwRkdsZ0MzZ0N5MjRlTVE0dHVpNXlpUEFaWmlGajRBNHh5bE5vRVkKb2t4U2RzQVJvMjdtSGJyaldyNDJVOFUrZFkrR2FTbFlVN1djdTIrZlhNVVk3TjB2NFpqSi9MN2ZDZzA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSHFEQ0NCcENnQXdJQkFnSVJBTXk0NTc5T0tScjlvdHhtcFJ3c0R4RXdEUVlKS29aSWh2Y05BUUVGQlFBd2NqRUxNQWtHQTFVRQpCaE1DU0ZVeEVUQVBCZ05WQkFjVENFSjFaR0Z3WlhOME1SWXdGQVlEVlFRS0V3MU5hV055YjNObFl5Qk1kR1F1TVJRd0VnWURWUVFMCkV3dGxMVk42YVdkdWJ5QkRRVEVpTUNBR0ExVUVBeE1aVFdsamNtOXpaV01nWlMxVGVtbG5ibThnVW05dmRDQkRRVEFlRncwd05UQTAKTURZeE1qSTRORFJhRncweE56QTBNRFl4TWpJNE5EUmFNSEl4Q3pBSkJnTlZCQVlUQWtoVk1SRXdEd1lEVlFRSEV3aENkV1JoY0dWegpkREVXTUJRR0ExVUVDaE1OVFdsamNtOXpaV01nVEhSa0xqRVVNQklHQTFVRUN4TUxaUzFUZW1sbmJtOGdRMEV4SWpBZ0JnTlZCQU1UCkdVMXBZM0p2YzJWaklHVXRVM3BwWjI1dklGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUIKQVFEdHlBRFZnWHZOT0FCSHpOdUV3U0ZwTEhTUURDSFpVNGZ0UGtORVU2K3IrSUNiUEhpTjFJMnV1Ty9URWR5QjVzODdsb3pXYnhYRwpkMzZoTCtCZmtyWW4xM2FhSFVNODZ0bnNMKzQ1ODJwblM0dUN6eUw0WlZYK0xNc3ZmVWg2UFhYNXFxQW51M2pDQnNwUnduNW1TNi9OCm9xZE5Bb0kvZ3F5Rnh1RVBrRWVabEFweGNwTXF5YWJBdmp4V1RIT1NKL0ZydGZYOS9EQUZZSkxHNjVaK0FaSENhYkVlSFh0VFJiamMKUVIvSmkzSFdWQlRqaTFSNFA3NzBZanRiOWFQczFaSjA0blF3N3dIYjRkU3JtWnNxYS9pOXBoeUdJMEpmN0VuZW1vdGI5SEk2UU1WSgpQcVcranFweDYyejY5UnJrYXYxN2ZWVkE3MWh1NXRuVnZDU3J3ZSszQWdNQkFBR2pnZ1EzTUlJRU16Qm5CZ2dyQmdFRkJRY0JBUVJiCk1Ga3dLQVlJS3dZQkJRVUhNQUdHSEdoMGRIQnpPaTh2Y21OaExtVXRjM3BwWjI1dkxtaDFMMjlqYzNBd0xRWUlLd1lCQlFVSE1BS0cKSVdoMGRIQTZMeTkzZDNjdVpTMXplbWxuYm04dWFIVXZVbTl2ZEVOQkxtTnlkREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NSUlCY3dZRApWUjBnQklJQmFqQ0NBV1l3Z2dGaUJnd3JCZ0VFQVlHb0dBSUJBUUV3Z2dGUU1DZ0dDQ3NHQVFVRkJ3SUJGaHhvZEhSd09pOHZkM2QzCkxtVXRjM3BwWjI1dkxtaDFMMU5hVTFvdk1JSUJJZ1lJS3dZQkJRVUhBZ0l3Z2dFVUhvSUJFQUJCQUNBQWRBQmhBRzRBK2dCekFPMEEKZEFCMkFPRUFiZ0I1QUNBQTZRQnlBSFFBWlFCc0FHMEFaUUI2QU9rQWN3RHBBR2dBWlFCNkFDQUE2UUJ6QUNBQVpRQnNBR1lBYndCbgpBR0VBWkFEaEFITUE0UUJvQUc4QWVnQWdBR0VBSUFCVEFIb0Fid0JzQUdjQTRRQnNBSFFBWVFCMEFQTUFJQUJUQUhvQWJ3QnNBR2NBCjRRQnNBSFFBWVFCMEFPRUFjd0JwQUNBQVV3QjZBR0VBWWdEaEFHd0FlUUI2QUdFQWRBQmhBQ0FBY3dCNkFHVUFjZ0JwQUc0QWRBQWcKQUdzQVpRQnNBR3dBSUFCbEFHd0FhZ0RoQUhJQWJnQnBBRG9BSUFCb0FIUUFkQUJ3QURvQUx3QXZBSGNBZHdCM0FDNEFaUUF0QUhNQQplZ0JwQUdjQWJnQnZBQzRBYUFCMUFDOEFVd0JhQUZNQVdnQXZNSUhJQmdOVkhSOEVnY0F3Z2Iwd2dicWdnYmVnZ2JTR0lXaDBkSEE2Ckx5OTNkM2N1WlMxemVtbG5ibTh1YUhVdlVtOXZkRU5CTG1OeWJJYUJqbXhrWVhBNkx5OXNaR0Z3TG1VdGMzcHBaMjV2TG1oMUwwTk8KUFUxcFkzSnZjMlZqSlRJd1pTMVRlbWxuYm04bE1qQlNiMjkwSlRJd1EwRXNUMVU5WlMxVGVtbG5ibThsTWpCRFFTeFBQVTFwWTNKdgpjMlZqSlRJd1RIUmtMaXhNUFVKMVpHRndaWE4wTEVNOVNGVS9ZMlZ5ZEdsbWFXTmhkR1ZTWlhadlkyRjBhVzl1VEdsemREdGlhVzVoCmNua3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01JR1dCZ05WSFJFRWdZNHdnWXVCRUdsdVptOUFaUzF6ZW1sbmJtOHVhSFdrZHpCMU1TTXcKSVFZRFZRUUREQnBOYVdOeWIzTmxZeUJsTFZONmFXZHV3N01nVW05dmRDQkRRVEVXTUJRR0ExVUVDd3dOWlMxVGVtbG5ic096SUVoVApXakVXTUJRR0ExVUVDaE1OVFdsamNtOXpaV01nUzJaMExqRVJNQThHQTFVRUJ4TUlRblZrWVhCbGMzUXhDekFKQmdOVkJBWVRBa2hWCk1JR3NCZ05WSFNNRWdhUXdnYUdBRk1lZ1NYVVdZWVRiTVV1RTB2RTNRSkR2VHR6M29YYWtkREJ5TVFzd0NRWURWUVFHRXdKSVZURVIKTUE4R0ExVUVCeE1JUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9URFUxcFkzSnZjMlZqSUV4MFpDNHhGREFTQmdOVkJBc1RDMlV0VTNwcApaMjV2SUVOQk1TSXdJQVlEVlFRREV4bE5hV055YjNObFl5QmxMVk42YVdkdWJ5QlNiMjkwSUVOQmdoRUF6TGpudjA0cEd2MmkzR2FsCkhDd1BFVEFkQmdOVkhRNEVGZ1FVeDZCSmRSWmhoTnN4UzRUUzhUZEFrTzlPM1Bjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFOTVQKbkdaaldTN0tYSEFNL0lPOFZiSDBqZ2RzWmlmT3dUc2dxUnk3UmxSdzdsck1vSGZxYUVRbjYvSXAzWGVwMWZ2ajFLY0V4Slc0QytGRQphR0FIUXpBeFFtSGw3dG5sSk5VYjMrRktHNnFmeDEvNGVoSHFFNU1BeW9wWXNlN3REazIwMTZnMkpuemdPc0hWVjRMeGRiYjlpVi9hCjg2ZzRuelVHQ000aWxiN04xZnkrVzk1NWE5eDZxV1ZtdnJFbFdsL3RmdE9zUm0xTTlES0h0Q0FFNEd4NHNIZlJoVVpMcGhLM2RlaEsKeVZaczE1S3JuZlZKT05KUFUrTlZrQkhibUpiR1NmSSs5SjhiNFBlSTNDVmltVVRZYzc4L01QTU1OejdVd2lpQWM3RUJ0NTFhbGhRQgpTNmtSblNscUx0QmRnY0RQc2lCRHh3UGdOMDVkQ3R4WklDVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGlnbmEKPT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lKQVA3YzR3RVB5VWovTUEwR0NTcUdTSWIzRFFFQkJRVUFNRFF4Q3pBSkJnTlZCQVlUQWtaU01SSXcKRUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoTUI0WERUQTNNRFl5T1RFMU1UTXdOVm9YRFRJMwpNRFl5T1RFMU1UTXdOVm93TkRFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVVJvYVcxNWIzUnBjekVSTUE4R0ExVUVBd3dJClEyVnlkR2xuYm1Fd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3EKWE9FbTdSRkhZZUdpZkJaNFFDSGtZSjVheUdQaHhMR1drdjhZYldrajRTdGk5OTNpTmkrUkI3bEl6dzdzZWJZczV6UkxjQWdsb3p5SApHeG55Z1FjUE9KQVoweEgraHJUeTBWNGVIcGJOZ0d6T096R1R0dktnMEttVkVuMmxtc3hyeUlSV2lqT3A1eUlWVXhid3pCZnNWMS9wCm9ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRMTMweUdMTUxMR3Evamo4VUVZa2cKRG5jVXRUMlVDSWYzSlI3VnNtQUE3RzhxS0NWdUtqNFlZeGNsUHo1RUlCYjJKc2dscmdWS3RPZGpMUE9NRmxOK1hQc1JHZ2pCUm1LZgpJcmp4d28xcDNQbzZXQWJmQWdNQkFBR2pnYnd3Z2Jrd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUd1MytRVG1RCnRDUlp2Z0h5VXRWRjlsbzUzQkV3WkFZRFZSMGpCRjB3VzRBVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCR2hPS1EyTURReEN6QUoKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aGdna0EvdHpqQVEvSgpTUDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCmhRTWVrbkgyUXEvaG8yR2U2L1BBRC9LbDFOcVY1dGErYURZOWZtNGZUSXJ2MFE4aGJWNmxVbVBPRXZqdkt0cHY2emYrRXdMSHl6cysKSW12YVlTNS8xSEk5M1REaEhreEFHWXdQMTV6Umd6QjdtRm5jZmNhNURDbE1vVE9pNjJjNlpZVFRsdUx0ZGtWd2o3VXIzdmtqMWtsdQpQQlMxeHA4MUhsRFF3WTlxY0VRQ1lzdXVIV2hCcDZwWDZGT3FCOUlHOXRVVUJndVJBM1VzYkhLMVlaV2FEWXU1RGVmMTMxVE4zdWJZCjFna0lsMlBsd1M2d3QwUW13Q2JBcjFVd25qdlZOaW9aQlBSY0h2L1BMTGYvMFAySFFCSFZFU083U01BaHFhUW9MZjBWK0xCT0svUXcKV3lIOEVaRTB2a0h2ZTUyWGRmK1hsY0NXV0MvcXUwYlh1K1RaTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBQyBSYVx4QzNceEFEeiBDZXJ0aWNceEMzXHhBMW1hcmEgUy5BLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR1pqQ0NCRTZnQXdJQkFnSVBCMzVTazN2Z0ZlTlg4R21NeSt3TU1BMEdDU3FHU0liM0RRRUJCUVVBTUhzeEN6QUpCZ05WQkFZVApBa05QTVVjd1JRWURWUVFLREQ1VGIyTnBaV1JoWkNCRFlXMWxjbUZzSUdSbElFTmxjblJwWm1sallXTnB3N051SUVScFoybDBZV3dnCkxTQkRaWEowYVdQRG9XMWhjbUVnVXk1QkxqRWpNQ0VHQTFVRUF3d2FRVU1nVW1IRHJYb2dRMlZ5ZEdsanc2RnRZWEpoSUZNdVFTNHcKSGhjTk1EWXhNVEkzTWpBME5qSTVXaGNOTXpBd05EQXlNakUwTWpBeVdqQjdNUXN3Q1FZRFZRUUdFd0pEVHpGSE1FVUdBMVVFQ2d3KwpVMjlqYVdWa1lXUWdRMkZ0WlhKaGJDQmtaU0JEWlhKMGFXWnBZMkZqYWNPemJpQkVhV2RwZEdGc0lDMGdRMlZ5ZEdsanc2RnRZWEpoCklGTXVRUzR4SXpBaEJnTlZCQU1NR2tGRElGSmh3NjE2SUVObGNuUnBZOE9oYldGeVlTQlRMa0V1TUlJQ0lqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcTJ1Sm8xUE1TQ01JKzhQUFVaWUlMcmdJZW0wOGtCZUdxZW50TGhNMFI3TFFjTnpKUE5DTgp5dTVMRjZ2UWhiQ25Jd1RMcUtMODVYWGJRTXBpaVk5UW5nRTlKbHNZaEJ6TGZEZTNmZXpUZjNNWnNHcXkySWlLTFVWMHFQZXp1TURVCjJzMGlpWFJOV2hVNWN4aDBUN1hybWFmQkhvaTB3cE9RWTVmenA2Y1NzZ2tpQnpQWmtjME9uQjhPSU1mdXV6T05qOExTV0tkZi9XVTMKNG9qQzJJK0dkVjc1TGFlSE0vSjROeStMdkIyR056bXhsUExZdkVxY2d4aGFCdnp6MU5TNmpCVUpKZkQ1dG8wRWZoY1NNMnRYU0V4UAoyeVllNjh5UTU0djVhSHh3RDZNcTBEbzQzemVYNGx2ZWdHSFRnTmlSZzBKYVRBU0phQkU4ckY5b2dFSE1ZRUxPRFZvcURBK2JNTUNtCjhJYmJxMG5YbDIxSWkva0R3RkpubXhMM3d2SXVtR1ZDMmRhYTQ5QVpNUXl0aDlWWEFub3c2SVltKzQ4amlsU0g1TDg4N3V2RGRVaGYKSGpsdmdXSnN4UzNFRjFRWnR6ZU5uRGVSeVBZTDFlcGpiNE9zT01MelA5NmErK0VqWWZESUpzczJ5S0h6TUkra282S2gzVk96M3ZDYQpNaCtEa1hrd3dha2ZVNXRUb2hWVFA5MmRzeEE3U0gySkQvenRBL1g3SldSMURoY1pEWThBRm1kNWVrRDhMVmtIMlpENm1xMDkzSUNLCjVsdzFvbWRNRVd1eCtJQmtBQzF2SW1IRnJFc201Vm9RZ3B1a2czczA5NTZKa1NDWGpyZEN4MmJEME9tazF2VWdqY1REbGF4RUNwMWIKY3p3bVBTOUt2cWZKcHhBZSs1OVFhZk1DQXdFQUFhT0I1akNCNHpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRQpBd0lCQmpBZEJnTlZIUTRFRmdRVTBRblE2ZGZPZVhSVStUb3dzL1J0TEFNREcyZ3dnYUFHQTFVZElBU0JtRENCbFRDQmtnWUVWUjBnCkFEQ0JpVEFyQmdnckJnRUZCUWNDQVJZZmFIUjBjRG92TDNkM2R5NWpaWEowYVdOaGJXRnlZUzVqYjIwdlpIQmpMekJhQmdnckJnRUYKQlFjQ0FqQk9Ha3hNYVcxcGRHRmphVzl1WlhNZ1pHVWdaMkZ5WVc1MDdXRnpJR1JsSUdWemRHVWdZMlZ5ZEdsbWFXTmhaRzhnYzJVZwpjSFZsWkdWdUlHVnVZMjl1ZEhKaGNpQmxiaUJzWVNCRVVFTXVNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUUJjbExXNFJaRk5qbUVmCkF5Z1BVM3ptcEZtcHM0cDZ4YkQvQ0h3c28zRWNJUk5ub1pVU1FEV0RnNDkwMnpOYzhFbDJDb0ZTM1VuVW1qSXo3NXVueTNYbGVzdVgKRXBCY3VudkZtOSs3T1NQSS81ak9DazBpQVVnSGZvckExU0JDbEVUdnYzZWlpV2RJRzBBREJhR0o3TTlpNHowbGRtYS9KcmU3SXI1dgovemxYZExwNnlRR1Z3WlZSNktzcytMR0dJT2sveXpWYjBoZnBLdjZERXhkQTdvaGlaVnZWTzJEcGV6eTR5ZFYvTmdJbHFtakNNUlczCk1HWHJmeDFJZWJIUE9lSkNnQmJUOVpNai9FeVh5Vm8zYkh3aTJFck4wbzQyZ3ptUmtCREk4Y2sxZmorNDA0SEdJR1FhdGxEQ0lhUjQKM05Bdk8yU1RkUENXa1BIdit3bGFORUNXOERZU3dhTjBqSk4rUWQ1M2kreUcyZElQUHkzUnpFQ2lpV1pJSGlDem5DTlpjNmxFYzd3awplWkJXTjdQR0tYNmpEL0VwT2U5K1hDZ3ljRFdzMnJqSWRXYjhtMHc1UjQ0YmI1dE5BbFFpTSs5aHVwNHBoTzlPU3pOSGRwZHF5MzVmCi9SV21ua0pEVzJaYWlvZ045eGE1UDFGbEsyWnFpOUU0VXFMV1JoSDYvSm9jZEo2UGx3c0NUMlRHOVdqVFN5My9wRGNlaXorL1JMNWgKUnFHRVBRZ25USUVnZDRrSTZtZEFYbXdJVVY4MFdveVdhTTNYOTRuQ0hOTXlBSzlTeTlOZ1d5bzZSMzVyTURPaFlpbC9Tcm5oTGVjVQpJdzRPR0VmaGVmd1ZWZEN4L0NWeFkzVXpIQ01ycjF6WjdVZDNZQTQ3RHg3U3dOeGtCWW44ZU5aY0xDWkRxUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXFqQ0NBNUtnQXdJQkFnSU9MbW9BQVFBQ0g5ZFNJU3dSWERzd0RRWUpLb1pJaHZjTkFRRUZCUUF3ZGpFTE1Ba0dBMVVFQmhNQwpSRVV4SERBYUJnTlZCQW9URTFSRElGUnlkWE4wUTJWdWRHVnlJRWR0WWtneElqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5CklFTnNZWE56SURJZ1EwRXhKVEFqQmdOVkJBTVRIRlJESUZSeWRYTjBRMlZ1ZEdWeUlFTnNZWE56SURJZ1EwRWdTVWt3SGhjTk1EWXcKTVRFeU1UUXpPRFF6V2hjTk1qVXhNak14TWpJMU9UVTVXakIyTVFzd0NRWURWUVFHRXdKRVJURWNNQm9HQTFVRUNoTVRWRU1nVkhKMQpjM1JEWlc1MFpYSWdSMjFpU0RFaU1DQUdBMVVFQ3hNWlZFTWdWSEoxYzNSRFpXNTBaWElnUTJ4aGMzTWdNaUJEUVRFbE1DTUdBMVVFCkF4TWNWRU1nVkhKMWMzUkRaVzUwWlhJZ1EyeGhjM01nTWlCRFFTQkpTVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0MKQVFvQ2dnRUJBS3VBaDV1TzhNTjhoOWZvSklJUnN6emRRMkx1K01ORjJ1amhvRi9SS3JMcWsyamZ0TWpXUStuRWRWbC8vT0VkK0RGdwpJeHVJbmllNWUvMDYwc21wNlJRdmtMNERVc0ZKemZiOTVBaG1DMWVLb2tLZ3VOVi9hVnlRTXJLWERjcEszRVkrQWxXSlUrTWFXc3MyCnhnZFc5NHpQRWZSTXV6QndCSldsOWptTS9YT0JDSDJKWGpJZUlxa2lSVXV3Wmk0d3pKOWwvZnpMZ2FueDREdXZvNGJSaWVyRVJYbFEKWGE3cElYU1NUWXRaZ28rVTQrbEs4ZWRKc0JUajlXTEwxWEs5SDduU242RE5xUG9CeU5rTjM5cjhSNTJ6eUZUZlNVcnhJYW4rR0U3dQpTTlFadSs5OTVPS2R5MXUyYnYvanpWcm5kSUlGdW9BbE9NdmthWjZ2UWFvYWhQVUNBd0VBQWFPQ0FUUXdnZ0V3TUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJUanExUk1nS0hiVmtPM2tVckw4NEo2RTF3SXF6Q0IKN1FZRFZSMGZCSUhsTUlIaU1JSGZvSUhjb0lIWmhqVm9kSFJ3T2k4dmQzZDNMblJ5ZFhOMFkyVnVkR1Z5TG1SbEwyTnliQzkyTWk5MApZMTlqYkdGemMxOHlYMk5oWDBsSkxtTnliSWFCbjJ4a1lYQTZMeTkzZDNjdWRISjFjM1JqWlc1MFpYSXVaR1V2UTA0OVZFTWxNakJVCmNuVnpkRU5sYm5SbGNpVXlNRU5zWVhOekpUSXdNaVV5TUVOQkpUSXdTVWtzVHoxVVF5VXlNRlJ5ZFhOMFEyVnVkR1Z5SlRJd1IyMWkKU0N4UFZUMXliMjkwWTJWeWRITXNSRU05ZEhKMWMzUmpaVzUwWlhJc1JFTTlaR1UvWTJWeWRHbG1hV05oZEdWU1pYWnZZMkYwYVc5dQpUR2x6ZEQ5aVlYTmxQekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBak5mZmZ1NGJnQkN6Zy9YYkVlcHJTNmlTR05uM0J6bjFMTDRHCmRYcG9VeFVjNmtydFh2d2pzaE9nMHduLzl2WXVhMEZ4ZWMzaWJmMnVXV3VGSGJoT0lwcnRaamx1UzVUbVZmd0xHNHQzd1ZNVFpvbloKS05hTDgwVktZN2Y5ZXd0aFhiaHR2c1BjVzNuUzdZYmxvazIrWG5SOGF1MFdPQjkvV0lGYUd1c3lpQzJ5OHpsM2dLOWV0bUYxS2RzagpUWWpLVUNqTGhkTFRFS0paYnRPVFZBQjZva2FWaGdXY3FSbVk1VEZ5REFEaVo5bEE0Q1F6ZTI4c3VWeXJaWjBzckhicU5abjFsN2tQCkpPekhkaUVvWmE1WDZBZUlkVXBXb05JRk9xVG1qWktJTFBQeTRjSEdZZHRCeGNlYjl3NGFVVVhDWVd2Y1pDY1hqRnEzMm5Rb3paZmsKdlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBIElJCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVxakNDQTVLZ0F3SUJBZ0lPU2tjQUFRQUM1YUJkMWo4QVViOHdEUVlKS29aSWh2Y05BUUVGQlFBd2RqRUxNQWtHQTFVRUJoTUMKUkVVeEhEQWFCZ05WQkFvVEUxUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVkdFlrZ3hJakFnQmdOVkJBc1RHVlJESUZSeWRYTjBRMlZ1ZEdWeQpJRU5zWVhOeklETWdRMEV4SlRBakJnTlZCQU1USEZSRElGUnlkWE4wUTJWdWRHVnlJRU5zWVhOeklETWdRMEVnU1Vrd0hoY05NRFl3Ck1URXlNVFEwTVRVM1doY05NalV4TWpNeE1qSTFPVFU1V2pCMk1Rc3dDUVlEVlFRR0V3SkVSVEVjTUJvR0ExVUVDaE1UVkVNZ1ZISjEKYzNSRFpXNTBaWElnUjIxaVNERWlNQ0FHQTFVRUN4TVpWRU1nVkhKMWMzUkRaVzUwWlhJZ1EyeGhjM01nTXlCRFFURWxNQ01HQTFVRQpBeE1jVkVNZ1ZISjFjM1JEWlc1MFpYSWdRMnhoYzNNZ015QkRRU0JKU1RDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQUxUZ3UxRzdPVnlMQk1WTWVSd2poakVRWTBOVkp6L0dSY2VrUGV3SkRSb2VJTUpXSHQ0Yk53Y3dJaTl2OFFieHE2M1cKeUt0aG95OUR4TEN5TGZ6RGxtbDdmb3Jrek1BNUVwQkNZTW5NTldqdTJsK1FWbC9OSEUxYldFbnJEZ0ZQWlBvc1BJbFkyQzh1NHJCbwo2U0k3ZFluV1JCcGw4aHVYSmgwb2Jhem92VmtkS3lUMjFvUURab2drQUhoZzhmaXIvZ0t5YS9zaSt6WG1GdEd0OWk0UzVQbzFhdVVaCnVWM2JPeDRhKzlQL0ZSUUkyQWxxdWtXZEZIbGdmYTlBaWdkenM1T1cwM1EwalRvM0tkNWM3UFh1TGpIQ0lOeSs4VTkvSTFMWlcrSmsKMlp5cUJ3aTFSYjNSMERIQnExU2ZxZExEWW1BRDhiczVTcEpLUFFxNW5jV2cvamNDQXdFQUFhT0NBVFF3Z2dFd01BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCVFVvdnlmczhQWUE5TlhYQWVrMENTbndQSUExRENCCjdRWURWUjBmQklIbE1JSGlNSUhmb0lIY29JSFpoalZvZEhSd09pOHZkM2QzTG5SeWRYTjBZMlZ1ZEdWeUxtUmxMMk55YkM5Mk1pOTAKWTE5amJHRnpjMTh6WDJOaFgwbEpMbU55YklhQm4yeGtZWEE2THk5M2QzY3VkSEoxYzNSalpXNTBaWEl1WkdVdlEwNDlWRU1sTWpCVQpjblZ6ZEVObGJuUmxjaVV5TUVOc1lYTnpKVEl3TXlVeU1FTkJKVEl3U1Vrc1R6MVVReVV5TUZSeWRYTjBRMlZ1ZEdWeUpUSXdSMjFpClNDeFBWVDF5YjI5MFkyVnlkSE1zUkVNOWRISjFjM1JqWlc1MFpYSXNSRU05WkdVL1kyVnlkR2xtYVdOaGRHVlNaWFp2WTJGMGFXOXUKVEdsemREOWlZWE5sUHpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQU5tRGtjUGNHSUVQWkl4cEM4dmlqc3JsTmlyVHp3cHBWTVh6RQpPMmVhdE45TkRvcVRTaGVMRzQzS2llSFBPaDZzSGZHY01yU09XWGFpUVlVbE42QVQwUFY4VHRYcWx1SnVjc0c3S3Y1c2J2aVJtRWI4CnlSdFhXK3JJR2pzL3NGR1lQQWZhTEZrQjJvdEU2T0YwL2FkbzNWUzZnMGJzeUVhMStLK1h3RHNKSEkvT2NwWTlNMVp3dkpiTDJOVjkKSUpxRG54cmNPZkhGY3FNUkEvMDdRbElwMitnQjk1dGVqTmFOaGs0Wityd2N2c1VocFllZWVDNDIyd2x4bzNJMCtHempCZ255WGxhbAowOTJZK3RUbUJ2VHd0aUJqUytvcHZhcUNaaDc3Z2Fxbk42MFRHT2FTdzRIQk03dUlIcUhuNHJTOU1Xd09VVDF2KzVaV2dPSTJGOUhjCjVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lPSGFJQUFRQUM3TGRnZ0hpTnRnWXdEUVlKS29aSWh2Y05BUUVGQlFBd2VURUxNQWtHQTFVRUJoTUMKUkVVeEhEQWFCZ05WQkFvVEUxUkRJRlJ5ZFhOMFEyVnVkR1Z5SUVkdFlrZ3hKREFpQmdOVkJBc1RHMVJESUZSeWRYTjBRMlZ1ZEdWeQpJRlZ1YVhabGNuTmhiQ0JEUVRFbU1DUUdBMVVFQXhNZFZFTWdWSEoxYzNSRFpXNTBaWElnVlc1cGRtVnljMkZzSUVOQklFa3dIaGNOCk1EWXdNekl5TVRVMU5ESTRXaGNOTWpVeE1qTXhNakkxT1RVNVdqQjVNUXN3Q1FZRFZRUUdFd0pFUlRFY01Cb0dBMVVFQ2hNVFZFTWcKVkhKMWMzUkRaVzUwWlhJZ1IyMWlTREVrTUNJR0ExVUVDeE1iVkVNZ1ZISjFjM1JEWlc1MFpYSWdWVzVwZG1WeWMyRnNJRU5CTVNZdwpKQVlEVlFRREV4MVVReUJVY25WemRFTmxiblJsY2lCVmJtbDJaWEp6WVd3Z1EwRWdTVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBS1IzSTVaRXI1RDBNYWNROUNhSG5QTTQyUTllM3M5QjZER3R4blNSSkpaNEhnbWdtNXFWU2tyMVlud0MKcU1xcysxb0Vkam5lWC9INXM3L3pBMWhWMHFxMzR3UWkwZmlVMmlJSUFJM1RmQ1pkekhkNTV5eDRPYWdtY3c2aVhTVnBoVTlWRHBydgp4cmxFNFZjOTN4OVVJdVZ2WmFvemhEcnp6bnErVlpldWpSSVBGRFBpVUhERFNZY1R2RkhlMTVnU1d1ODZnek9TQm5XTGtud1NhSHR3CmFnKzFtN1ozVzBoWm5lVHZXcTN6d1o3VTEwVk95bFkwSWJ3K0YxdHZkd3hJQVVNcHNOMC9sbTdtbGFvTXdDQzIvVDQySjV6alhNOU8KZ2R3WnU1R1FmZXptbHdRZWs4d2lTZGVYaHJZVENqeERJM2QrOE56bXpTUWZPNE9iTkRxRE5PTUNBd0VBQWFOak1HRXdId1lEVlIwagpCQmd3Rm9BVWtxUjFMS1Nldm9GRTYzbjhpc1dWcGVzUWRYTXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFZWXdIUVlEVlIwT0JCWUVGSktrZFN5a25yNkJST3Q1L0lyRmxhWHJFSFZ6TUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBbzB1Q0cKMWViNGUvQ1gzQ0pyTzVVVVZnOFJNS1dhVHpxd091QUd5MlgxN2NhWEovNGw4bGZtWHBXTVBtUmdGVnAvTHcwQnhiRmcvVVUxei9DeQp2d2JaNzFxK3MySWh0TmVyTlh4VFBxWW44YUV0Mmhvam5jemQ3RHd0bmljMFhRL0NObm04eVVwaUxlMXIyWDFCUTN5MnFzcnRZYkUzCmdoVUpHb29XTU5qc3lkWkhjbmhMRUVZVWpsOE9yK3pITDZzUTE3YnhidXlHc3NMb0RaSnozS0wwRHpxL1lTTVFpWnhJUUc1d0FMUFQKdWpkRVdCRjZBbXFJOERjMDhCbnByTlJsYy9acGpHU1VPbm1GS2JBV0t3eUNQd2FjeC8wUUs1NFBMTGFlNHhXLzJUWWN1aVVhVWowYQo3Q0lNSE9Da29qM3c2RG5QZ2NCNzdWMGZiOFhRQzllWQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMgo9PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG56Q0NBb2VnQXdJQkFnSUJKakFOQmdrcWhraUc5dzBCQVFVRkFEQnhNUXN3Q1FZRFZRUUdFd0pFUlRFY01Cb0dBMVVFQ2hNVApSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGxVMlZqSUZSeWRYTjBJRU5sYm5SbGNqRWpNQ0VHCkExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MElFTkJJREl3SGhjTk9Ua3dOekE1TVRJeE1UQXdXaGNOTVRrd056QTUKTWpNMU9UQXdXakJ4TVFzd0NRWURWUVFHRXdKRVJURWNNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwRwpBMVVFQ3hNV1ZDMVVaV3hsVTJWaklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTCmIyOTBJRU5CSURJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNyQzZNMTRJc3BGTEVVaGE4OEVPUTUKYnpWZFNxN2Q2bUdObFVuMGIyU2pHbUJtcEtsQUlvVFoxS1hsZUpNT2FBR3R1VTFjT3M3VHVLaENRTi9QbzdxQ1dXcVNHNndjbXRvSQpLeVVuK1dralIvSGc2eXg2bS9VVEF0QitOSHpDbmp3QVdhdjEyZ3oxTWp3cnJGRGExc1BlZzVUS3FBeVpNZzRJU0ZaYmF2dmE0VmhZCkFVbGZja0U4RlFZQmpsMnRxcmlUdE0yZTY2Zm9haTFTTk5zNjcxeDFVZHJiOHpINTduR1lNc1JVRlVRTStadFY3YTNmR0FpZ280YUsKU2U1VEJZOFpUTlhlV0htYjBtb2NRcXZGMWFmUGFBK1c1T0ZobUhaaHlKRjgxajRBNHBGUWgrR2RDdWF0bDlJZHhqcDl5N3phQXpUVgpqbHNCOVdvSHR4YTJia3AvQWdNQkFBR2pRakJBTUIwR0ExVWREZ1FXQkJReHcza2J1dlZUMXhmZ2lYb3RGMndLc3l1ZE16QVBCZ05WCkhSTUVDREFHQVFIL0FnRUZNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFsR1JaclRsazV5bnIKRS81YXc0c1RWOGdFSlBCMGQ4Qmc0MmY3NlltbWc3K1dnbnh1MU1NOTc1NkFicnNwdEpoNnNUdFU2emtYUjM0YWpndjhIekZaTVFTeQp6aGZ6TE1kaU5sWGlJdGlKVmJTWVNLcGsrdFljTnRoRWVGcGFJenBYbC9WNk1FK3VuMnBNU3l1T29BUGpQdUNwMU5KNzByT280bkk4CnJaNy9nRm5rbTBXMDlqdXd6VGtabURMbDZpRmhrT1F4SVk0MHNmY3ZOVXFGRU5ybmlqY2h2bGxqNFBLRmlERlQxRlFVaFhCNTlDNEcKZHlkMUx4KzRpdm4reGJyWU51U0Q3T2RsdDc5ald2TkdyNEdVTjlSQmpOWWoxaDdQOVdnYlJHT2lXcnFuTlZtaDVYQUZtdzRqVjVtVQpDbTI2T1dNb2hwTHpHSVRZKzlIUEJWWmtWdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNvbVNpZ24gU2VjdXJlZCBDQQo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxekNDQXBPZ0F3SUJBZ0lSQU1jb1J3bXp1R3hGakIzNkpQVTJUdWt3RFFZSktvWklodmNOQVFFRkJRQXdQREViTUJrR0ExVUUKQXhNU1EyOXRVMmxuYmlCVFpXTjFjbVZrSUVOQk1SQXdEZ1lEVlFRS0V3ZERiMjFUYVdkdU1Rc3dDUVlEVlFRR0V3SkpUREFlRncwdwpOREF6TWpReE1UTTNNakJhRncweU9UQXpNVFl4TlRBME5UWmFNRHd4R3pBWkJnTlZCQU1URWtOdmJWTnBaMjRnVTJWamRYSmxaQ0JEClFURVFNQTRHQTFVRUNoTUhRMjl0VTJsbmJqRUxNQWtHQTFVRUJoTUNTVXd3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXcKZ2dFS0FvSUJBUURHdFdoZkhaUVZ3NlFJVlMzam9GZDY3K2wwS3J1NWZGZEpHaEZlVHltSERFaldhdWVQMUg1WEpMa0dpZVFjUE9xcwo0OW9oZ0hNaEN1OTVtR3dmQ1AraFVIM3ltQnZKVkc4K3BTanNJUVFQUmJzSFBhSEEraXFZSFU0R2svdjFpRHVyWDhzV3YrYnpua3FICjdSbnF3cDlENVBHQnBYOFFUejdSU21LdFV4dkxnLzhIWmFXU0xXYXBXN2hhOUIyMElaRktGM3VlTXY1V0pEbXlWSVJEOVlUQzJMeEIKa015ZDFtamE2WUpRcVR0b3o3VmRBcFJnRnJGRDJVTmQzVjJIYnVxN3M4bHI5Z09VQ1hEZUZoRjZLK2gyajBrUW1IZTVZMXlMTTVkMQo5Z3VNc3F0YjNuUWdKVC9qOHhINWgyaUdOWEhESFl3dDYrVWFyQTl6MVlKWlFJRFRBZ01CQUFHamdhY3dnYVF3REFZRFZSMFRCQVV3CkF3RUIvekJFQmdOVkhSOEVQVEE3TURtZ042QTFoak5vZEhSd09pOHZabVZrYVhJdVkyOXRjMmxuYmk1amJ5NXBiQzlqY213dlEyOXQKVTJsbmJsTmxZM1Z5WldSRFFTNWpjbXd3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjhHQTFVZEl3UVlNQmFBRk1GTDdYQzI5ejU4QURzQQpqOGMrRGtXZkhsM3NNQjBHQTFVZERnUVdCQlRCUysxd3R2YytmQUE3QUkvSFBnNUZueDVkN0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DCkFRRUFGcy91a2hOUXEzc1Vuak8yUWlCcTFCVzlDYXY4Y3VqdlIzcVFyRkhCWkU3cGlMMURSWUhqWmlNL0VvWk5HZVFGc09ZM3dvM2EKQmlqSkQ0bWtVNmwxUDdDVys2dE1NMVg1ZUNaR2J4czJtUHRDZHNHQ3VZN2UrMFg1WXh0aU96a0d5bmQ2cUR3SnoydzJQUThLUlV0cApGaHBGZlRNRFpmbFNjWkFtbGF4TURQV0xrei9NZFhTRm1Mci9ZbnBOSDRuK3JyMlVBSm0vRWFYYzRIbkZGZ3Q5QW1FZDZvWDVBaFZQCjUxcUpUaFJ2NHpkTGhmWEJQR0hnL1FWQnNwSi93eDJnMEs1U1pHQnJHTVltbk5qMVpPUTJHbUtmaWc4Ky8yMU9HVlpPSUpGc256UXoKT2pSWFVEcHZnVjRHeHZVK2ZFNk9LODVsQmk1ZDBpcFRkRjdUYmllZWp3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ3liZXJ0cnVzdCBHbG9iYWwgUm9vdAo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEb1RDQ0FvbWdBd0lCQWdJTEJBQUFBQUFCRDRXcUxVZ3dEUVlKS29aSWh2Y05BUUVGQlFBd096RVlNQllHQTFVRUNoTVBRM2xpClpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTYjI5ME1CNFhEVEEyTVRJeE5UQTQKTURBd01Gb1hEVEl4TVRJeE5UQTRNREF3TUZvd096RVlNQllHQTFVRUNoTVBRM2xpWlhKMGNuVnpkQ3dnU1c1ak1SOHdIUVlEVlFRRApFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCitNaTh2UlJRWmhQLzhOTjU3Q1B5dHhySGpvWHhFbk9tR2FvUTI1eWlaWFJhZHo1UmZWYjIzQ08yMU8xZldMRTNUZFZKRG03MWFvZlcKMG96U0o4YmkvemFmbUdXZ0UwN0dLbVNiMVpBU3p4UUc5RHZqMUNpKzZBNzRxMDVJbEcyT2xURVFYTzJpTGIzVk9tMnlITHRnd0VaTApBZlZKcm41R2l0QjBqYUVNQXM3dS9PZVB1R3RtODM5RUFMOW1KUlFyM1JBd0hRZVdQMDMyYTdpUHQzc01wVGpyM2tmYjFWMDUvSWluCjg5Y3FkUEhvV3FJN24xQzZwb3hGTmNKUVpaWGNZNEx2M2I5M1RaeGl5V056RnRBcEQwbXBTUEN6cXJkc3hhY3dPVUJkcnNUaVhTWlQKOE00Y0l3aGhxSlFadWdSaVFPd2ZPSEIzRWdaeHB6QVlYU1VucFFJREFRQUJvNEdsTUlHaU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUzJDSHNOZXN5c0lFeUdWakplejZ0dWhTMXdWekEvQmdOVkhSOEVPREEyCk1EU2dNcUF3aGk1b2RIUndPaTh2ZDNkM01pNXdkV0pzYVdNdGRISjFjM1F1WTI5dEwyTnliQzlqZEM5amRISnZiM1F1WTNKc01COEcKQTFVZEl3UVlNQmFBRkxZSWV3MTZ6S3dnVElaV01sN1BxMjZGTFhCWE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQlc3d29qb0ZSTwpsWmZKK0luYVJjSFVvd0FsOUI4VHE3ZWpoVmhwd2pDdDJCV0tMZVBKellGYStITWpXcWQ4QmZQOUlqc08wUWJFMnpaTWN3U081YkFpCjVNWHpMcVhaSStPNFRrb2dwMjRDSko4aVlHZDdpeDF5Q2NVeFhPbDVuNEJIUGEyaEN3Y1VQVWYvQTJrYURBdEU1Mk1scDMreXliaDIKaE8wajluMEhxMFYrMDkrenYrbUt0czJvb21jclV0VzNaZkE1VEdPZ2tYbVRVZzlVM1lPN245R1BwMU56dzh2L01PeDhCTGpZUkIrVApYM0VKSXJkdVB1b2NBMDZkR2lCaCs0RTM3Rjc4Q2tXcjErY1hWZENnNm1DYnB2YmpqRnNwd2daZ0ZKMHRsMHlwa3hXZFljUUJYMGpXCldMMVdNUkpPRWNnaDRMTVJrV1hidEthSU9NNVYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnNEQ0NBNWlnQXdJQkFnSVFGY2k5WlVkY3I3aVhBRjdrQnRLOG5UQU5CZ2txaGtpRzl3MEJBUVVGQURCZU1Rc3dDUVlEVlFRRwpFd0pVVnpFak1DRUdBMVVFQ2d3YVEyaDFibWRvZDJFZ1ZHVnNaV052YlNCRGJ5NHNJRXgwWkM0eEtqQW9CZ05WQkFzTUlXVlFTMGtnClVtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TkRFeU1qQXdNak14TWpkYUZ3MHpOREV5TWpBd01qTXgKTWpkYU1GNHhDekFKQmdOVkJBWVRBbFJYTVNNd0lRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFcQpNQ2dHQTFVRUN3d2haVkJMU1NCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUNJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTRTVVA3bzNiaUROMVo4MnRIMzA2VG0yZDB5OFU4Mk4weXdFaGFqZnFoRkFIU3laYkNVTnMKSVo1cXlOVUQ5V0Jwajh6d0l1UWY1L2RxSWpHM0xCWHk0UDRBYWtQL2gyWEd0UnJCcDB4dEluQWhpakh5bDNTSkNSSW1ISjdLMlJLaQpsVHphNldlL0NLQms0OVpDdDBYdmwvVDI5ZGUxU2hVQ1dIMllXRXRndk0zWERab1RNMVBSWWZsNjFkZDRzNW96OXdDR3poMU5sRGl2CnFPeDRVWENLWEJDRFVTSDNFVDAwaGw3bFNNMlhnWUkxVEJuc1pmWnJ4UVdoN2tjVDFyTWhKNVFRQ3Rra083cStSQk5HTUQrWFBOalgKMTJydU96ampLOVNYRHJrYjV3ZEpmemNxK1hkNHoxVHRXMGFkbzRBT2tVUEIxbHRmRkxxZnBvMGtSMEJadjNJNHNqWnNOLytaMFYwTwpXUXFyYWZmQXNnUkZlbFFBcnI1VDlyWG40Zmc4b3pIU3FmNGhVbVRGcG1md2RRY0dsQlNCVmNZbjVBR1BGOEZxY2RlK1MvdVVXSDErCkVUT3hRdmRpYkJqV3p3bG9QbjlzOWg2UFlxMmxZOXNKcHg4aVFrRWViNW1LUHRmNVAwQjZlYkNsQVpMU25UMElGYVVRQVMyek1uYW8KbFEyemVwcjdCeEI0RVcvaGo4ZTZEeVVhZENybEhKaEJtZDhoaCtpVkJtb0tzMnBIZG1YMk9zK1BZaGNaZXdvb3pSclNneDRoeHl5Lwp2djloYUxkbkc3dDRUWTNPWitYa3dZNjNJMmJpblpCMU5KaXBOaXVLbXBTNW5lek1pckg0SllsY1dyWXZqQjl0ZVNTblVtakRoRFhpClpvMWpEaVZOMVJteTVuazNweUtkVkRFQ0F3RUFBYU5xTUdnd0hRWURWUjBPQkJZRUZCNE05N1puOHVHU0pnbEZ3RlU1TG5jL1FrcWkKTUF3R0ExVWRFd1FGTUFNQkFmOHdPUVlFWnlvSEFBUXhNQzh3TFFJQkFEQUpCZ1VyRGdNQ0dnVUFNQWNHQldjcUF3QUFCQlJGc01MSApDbFo4N2x0NERKWDVHRlBCcGh6WUVEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFDYk9EVTFrQlBwVkp1ZkdCdXZsMklDTzFKMkIwCjFHcVpORjVzQUZQWm4vS21zU1FIUkdvcXhxV09lQkxvUjlsWUd4TXFYbm1ibndvcVo2WWxQd1pwVm5QRGltWkkreW1CVjNRR3lwenEKS09nNFp5WXI4ZFcxUDJXVCtEWmRqbzJOUUNDSEdlcnZKOEE5dERrUEpYdG9VSFJWbkF4WmZWbzlRWlFsVWdqZ1J5d1ZNUm5WdndkVgp4cnNTdFpmMFg0T0Z1bkhCMld5QkVYWUtDckMvZ3BmMzZqMzYrdXd0cVNpVU8xYmQwbEV1cnNDOUNCV01kMUkwbHRhYnJOTWRqbUVQCk5YdWJyamxwQzJKZ1FDQTJqNi83TnU0dENFb2R1TCtiWFBqcXBSdWdjNmJZK0c3Z013UmZhS29uaCszWndaQ2M3YjNqYWpXdlk5K3IKR05tNjV1bEs2bENLRDJHVEh1SXRHZUl3bERXU1hRNjJCNjhaZ0k5SGtGRkxMazNkaGVMU0NsSUtGNXI4R3JCUUF1VUJvMk0zSVV4RQp4SnRSbVJFT2M1d0dqMVF1cHloZVJEbUhWaTAzdllWRWxPRU1TeXljdzVLRk5HSExEN2liU2tOUy9qUTZmYmpwS2R4MnFjZ3crQlJ4CmdNWWVOa2gwSWtGY2g0TG9HSEdMUVlsRTUzNVlXNmk0alJQcHAyekRSKzJ6R3AxaXJvMkM2cFNlM1ZrUXc2M2Q0azNqTWRYSDdPankKc1A2U0hoWUtHdnpaOC9nbnRzbStIYlJzWkpCLzlPVEVXOWMzcmtJTzNhUWFiM3lJVk1VV2J1RjZhQzc0T3I4TnBEeUpPM2luVG1PRApCQ0VJWjQzeWdrblFXLzJ4elErRGhOUStJSVgzU2owcm5QMHFDZ2xONm9INEVadz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFx4YzNceDljXHg0Mlx4QzRceEIwVEFLIFVFS0FFIEtceEMzXHhCNmsgU2VydGlmaWthIEhpem1ldCBTYVx4QzRceDlGbGF5XHhjNFx4YjFceDYzXHhjNFx4YjFzXHhjNFx4YjEgLSBTXHhDM1x4QkNyXHhDM1x4QkNtIDMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZGekNDQS8rZ0F3SUJBZ0lCRVRBTkJna3Foa2lHOXcwQkFRVUZBRENDQVNzeEN6QUpCZ05WQkFZVEFsUlNNUmd3RmdZRFZRUUgKREE5SFpXSjZaU0F0SUV0dlkyRmxiR2t4UnpCRkJnTlZCQW9NUGxURHZISnJhWGxsSUVKcGJHbHRjMlZzSUhabElGUmxhMjV2Ykc5cQphV3NnUVhKaHhaOTB4TEZ5YldFZ1MzVnlkVzExSUMwZ1ZNT2NRc1N3VkVGTE1VZ3dSZ1lEVlFRTEREOVZiSFZ6WVd3Z1JXeGxhM1J5CmIyNXBheUIyWlNCTGNtbHdkRzlzYjJwcElFRnlZY1dmZE1TeGNtMWhJRVZ1YzNScGRNTzhjOE84SUMwZ1ZVVkxRVVV4SXpBaEJnTlYKQkFzTUdrdGhiWFVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcE1Vb3dTQVlEVlFRRERFRlV3NXhDeExCVVFVc2dWVVZMUVVVZwpTOE8yYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzU0F0SUZQRHZITER2RzBnTXpBZUZ3MHdOekE0Ck1qUXhNVE0zTURkYUZ3MHhOekE0TWpFeE1UTTNNRGRhTUlJQkt6RUxNQWtHQTFVRUJoTUNWRkl4R0RBV0JnTlZCQWNNRDBkbFlucGwKSUMwZ1MyOWpZV1ZzYVRGSE1FVUdBMVVFQ2d3K1ZNTzhjbXRwZVdVZ1FtbHNhVzF6Wld3Z2RtVWdWR1ZyYm05c2IycHBheUJCY21IRgpuM1RFc1hKdFlTQkxkWEoxYlhVZ0xTQlV3NXhDeExCVVFVc3hTREJHQmdOVkJBc01QMVZzZFhOaGJDQkZiR1ZyZEhKdmJtbHJJSFpsCklFdHlhWEIwYjJ4dmFta2dRWEpoeFo5MHhMRnliV0VnUlc1emRHbDB3N3h6dzd3Z0xTQlZSVXRCUlRFak1DRUdBMVVFQ3d3YVMyRnQKZFNCVFpYSjBhV1pwYTJGemVXOXVJRTFsY210bGVta3hTakJJQmdOVkJBTU1RVlREbkVMRXNGUkJTeUJWUlV0QlJTQkx3N1pySUZObApjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4SUMwZ1U4Tzhjc084YlNBek1JSUJJakFOQmdrcWhraUc5dzBCCkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWltMUwveENJT3NQMmZwVG82aUJrY0s0aGdiNDZlenpiOFIxU2YxbjY4eUpNbGFDUXZFaE8KRWF2N3Q3V05lb01vakNaRzJFNlZRSWRobjhXZWJZR0hWMnlLTzdSbTZzeEEvT09xYkxMTEFkc3l2OUxyaGMraERWWERXemhYY0xoMQp4bm5SRkREdEcxaGJhKzgxOHFFaFRzWE9mSmxmYkxtNElwTlFwODFNY0dxK2FnVi9FNXdySHVyK1I4NEVwVytza3k1OEs1K2VlUk9SCjZPcWV5amgxam1Ld2xaTXE1ZC9wWHBkdUlGOWZoSHBFT1JsQUhMcFZLL3N3c29IdmhPUGM3Smc0T1FPRkNLbFVBd1VwOE1tUGkrb0wKaG1VWkVkUHBDU1BlYUpNRHlUWWNJVzdPakdieG1URFkxN1BESGZpQkxxaTlnZ3RtL29MTDRlQWFnc05BZ1FJREFRQUJvMEl3UURBZApCZ05WSFE0RUZnUVV2WWlIeVkvMnBBb0xxdXZGL3BFam5hdEtpakl3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUIxOCtrbVBOT20zSnBJV21nVjA1MHZRYlRsc3d5YjJ6cmd4dk1UZnZDcjQKTjVFWTNBVElaSmtyR0cyQUExbkpydmhZMEQ3dHd5T2ZhVHlHT0J5ZTc5b25lTkdFTjNHS1BFczV6MzVGQnRZdDJJcE5lQkxXcmNMVAp5OUxRUWZNbU5rcWJsV3dNN3VYUlF5ZG13WWozZXJNZ2JPcXdhU3ZISU9nTUE4UkJCWm5pUCtScitLQ0dnY2VFeGgvVlM0RVNzaFloCkxCT2hnTEplREVvVG5pRFlZa0Nya09wa1NpK3NEUUVTZVVXb0w0Y1phTWppaGNjd3NuWDVPRCt5d0pPMGErSURSTTVub04rSjFxMk0KZHFNVHc1UmhLMnZaYk1FSENpSUhoV3lGSkVhcHZqK0xlSVNDZmlRTW5mMkJOK01scU8wMlRwVXN5WnlRMnV5cFFqeXR0Z0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkJ1eXBhc3MgQ2xhc3MgMiBDQSAxCj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVXpDQ0FqdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCTE1Rc3dDUVlEVlFRR0V3Sk9UekVkTUJzR0ExVUVDZ3dVClFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hIVEFiQmdOVkJBTU1GRUoxZVhCaGMzTWdRMnhoYzNNZ01pQkRRU0F4TUI0WERUQTIKTVRBeE16RXdNalV3T1ZvWERURTJNVEF4TXpFd01qVXdPVm93U3pFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxZVhCaApjM01nUVZNdE9UZ3pNVFl6TXpJM01SMHdHd1lEVlFRRERCUkNkWGx3WVhOeklFTnNZWE56SURJZ1EwRWdNVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSXM4QjBYWTl0L214OHE2alVQRlI0MndXc0U0MjVLRUhLOFQxQTl2TmtZZ3hDN00KY1hBMG9qVFROeTdZM1RwM0w4RHJLZWhjMHJXcGtUU0hJbG4rek52bm1hK1d3YWpIUU4ybEZZeHV5SHlYQTh2bUlQTFhsMTh4b1M4Mwowcjd1dnFtdHFFeWVJV1pETzZpODh3bWpPTlZaSk1IQ1IzYXhpRnlDTzdzcnBnVFhqQWVQemRWQkhmQ3V1Q2tzbEZKZ05KUTcydUE0CjBaMHpQaFgwa3pMRkFOcTFLV1lPT25nUElWSmZBdVdTZXlYVGtoNHZGWjJCNUoyTzZPK0p6aFJNVkIwY2dSSk5jS2krRUFVWGZoL1IKdUZkVjdjMjdVc0t3SG5qQ1RUWm95MVltd1ZMQnZYYjNXTlZ5Zmg5RWRyc0FpUjBXblZFMTcwM0NWdTlyNEl3N0Rla0NBd0VBQWFOQwpNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUDQyYVdZdjhlM3VjbzY4NHNEbnRrSEdBMXNnd0RnWURWUjBQCkFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQVZHbjRUaXJub0I2TkxKekt5UUpIeUlkRmtoYjVqYXRMUGdjSVYKMVhwK0RDbXNOeDRjZkhaU2xkcTFmeU9oS1hkbHlUS2RxQzVXcTJCMnpoYTBqWDk0d05XWlVZTi9YdG0rREtoUTdTTEhyUVZNZHZ2dAo3aDVIWlBiM0ozMWNLQTlGeFZ4aVhxYWFrWkczVXhjdTNLMWduWlprT2IxbmFMS3VCY3RONTE4ZlY0YlZJSndvKzI4VE9QWDJFWkwyCmZabGVId3pvcTBRa0tYSkFQVFpTcjR4WWtIUEI3R0VzZWFIc2g3VS8yazNaSVFBdzNwRGFEdE1hU0trK2hRc1VpNHk4UVo1cTl3NXcKd0RYM09hSmRadEI3V1orb1J4S2FKeU9rTFk0bmc1SWdvZGNWZi9FdUdPNzBTSDh2Zi9HaEdMV2hDNVNnWWlBeW5CMzIxTysvVElobwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpCdXlwYXNzIENsYXNzIDMgQ0EgMQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFV6Q0NBanVnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFVRkFEQkxNUXN3Q1FZRFZRUUdFd0pPVHpFZE1Cc0dBMVVFQ2d3VQpRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SFRBYkJnTlZCQU1NRkVKMWVYQmhjM01nUTJ4aGMzTWdNeUJEUVNBeE1CNFhEVEExCk1EVXdPVEUwTVRNd00xb1hEVEUxTURVd09URTBNVE13TTFvd1N6RUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmgKYzNNZ1FWTXRPVGd6TVRZek16STNNUjB3R3dZRFZRUUREQlJDZFhsd1lYTnpJRU5zWVhOeklETWdRMEVnTVRDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtTTzEzVFpLV1RlWHgrSGdKSHFUam5tR2NaRUM0RFZDNjlUQjRzU3ZlWm44QUt4CmlmWmdpc1Jic0VMUndDR295K0diNzJSUnRxZlBGZlYwZ0dnRWtLQllvdVowcGxOVFZVaGpQNUpXM1NST2p2aTZLLy96TklxZUtOYzAKbjZ3djFnL3hwQys5VXJKSmhXMDVOZkJFTUpOR0pQTzI1MVA3dkdHdnFhTVUrOElYRjRSczRIeUkrTWtjVnl6d1BYNlV2Q1dUaE9pYQpBSnBGQlVKWGdQUk96dG11T2ZiSVV4QU1aVHBIZTJEQzF2cVJ5Y1p4YkwyUmh6eVJoa21yOHcrZ2JDWjJYaHlzbTNIbGpieWJJUjZjCjFqaCtKSUFWTVlLV3NVblRZamRiaUF3S1lqVCtwMGgrbWJFd2k1QTNsUnlvSDZVc2pmUlZ5TnZkV1FyQ3JYaWc5SXNDQXdFQUFhTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVU9CVG15UENwcEFQMFRqNGlvMXZ5MXVDdFFIUXdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFCWjZPTXlTVTlFMk5kRm0vc29UNEpYSkVWS2lyWmdDRlBCZHk3CnBZbXJFek1xbmppM2pHOENjbVBIYzNjZUNRYTZPeWg3cEVmSllXc0lDQ0Q4aWdXS0g3eTZ4c0wrejI3c0V6TnhaeTVwK3Frc1AyYkEKRWxsTkMxUUNrb1M3MnhMdmczQndlTWhUK3QvR3h2L2NpQzhId0VtZE1sZGcwL0wybVNsZjU2b0J6S3d6cUJ3S3U1SEVBNkJ2dGpUNQpodE96ZGxTWTlFcUJzMU9kVFVEczVYY1RSYTlicWgvWUwweUNlLzRxeEZpN1QveWUvUU5sR2lvT3c2VWdGcFJyZWFhaUVyUzdHcVFqCmVsL3dyb1FrNVBNcis0b2tveWVZWmRvd2RYYjhHWkhvMit1YlB6Sy9RSmNISnJyTTg1U0ZTbm9uazgrUVF0UzRXeGFtNTh0QUE5MTUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRUJHIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx4QzRceDlGbGF5XHhjNFx4YjFceDYzXHhjNFx4YjFzXHhjNFx4YjEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY1ekNDQTgrZ0F3SUJBZ0lJVEs5elFoeU9kQUl3RFFZSktvWklodmNOQVFFRkJRQXdnWUF4T0RBMkJnTlZCQU1NTDBWQ1J5QkYKYkdWcmRISnZibWxySUZObGNuUnBabWxyWVNCSWFYcHRaWFFnVTJIRW4yeGhlY1N4WThTeGM4U3hNVGN3TlFZRFZRUUtEQzVGUWtjZwpRbWxzYWNXZmFXMGdWR1ZyYm05c2IycHBiR1Z5YVNCMlpTQklhWHB0WlhSc1pYSnBJRUV1eFo0dU1Rc3dDUVlEVlFRR0V3SlVVakFlCkZ3MHdOakE0TVRjd01ESXhNRGxhRncweE5qQTRNVFF3TURNeE1EbGFNSUdBTVRnd05nWURWUVFEREM5RlFrY2dSV3hsYTNSeWIyNXAKYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzVEUzTURVR0ExVUVDZ3d1UlVKSElFSnBiR25GbjJsdApJRlJsYTI1dmJHOXFhV3hsY21rZ2RtVWdTR2w2YldWMGJHVnlhU0JCTHNXZUxqRUxNQWtHQTFVRUJoTUNWRkl3Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUR1b0lSaDBEcHFaaEF5MkRFNGY2ZW41ZjJoNGZ1WGQ3aHhsdWdUbGthRFQ3YnkKWDNKV2JoTmdwUUdSNGx2RnpWY2ZkMk5SL3k4OTI3ay9xcWsxNTNuUTlkQWt0aUhxNnlPVS9pbS8rNG1SREdTYUJVb3J6QXp1OFQyYgpnbW1rVFBpYWIrY2kyaEM2WDVMOEdDY0txS3BFK2k0c3RQdEdtZ2dEZzNLcmlPUnFjc25sWlI5dUtnK2RzK2c3NUF4dWV0cFgvZGZyCmVZdGVJQWJUZGd0c0FwV2psdVRMZGxIUktKMmhHdnhFb2szTWVuYW9EVDIvRjA4aWlGRDlycmJza0ZCS1c1K1ZRYXJLRDdKSy9vQ1oKVHFOR0ZhdjRjMEpxd21aMnNRb21GZDJUa3V6YnFWOVVJbEtSY0YwVDZranNiZ05zMmQxcy9Pc05BLyttZ3hLYjhhbVREOFVtVERHeQpZNWxoY3VjcVpKblN1T2wxNG55cHFab2Fxc05XMnhDYVBJTlN0bnVXdDZ5SGQ2aTU4bWNMbEVPenJ6NXora0kyc1NYRkNqRW1OMVpuCnVxTUxmZGIzaWMxbm9iYzZIbVpQOXFCVkZDVk1MRE1OcGtHTXZRUXhhaEJ5Q3AwT0xuYTlYdk5SaVl1b1AxVnp2OXM2eGlRRmxwSkkKcWt1TktnUGxWNUVROUdvb0ZXNUhkNFJjVVhTZkdlbm1IbU1XT2VNUkZlTllHa1M5eThSc1p0ZUVCdDh3OURlaVF5SjUwaEJzMzd2bQpFeEg4bllRS0UzdndPOUQ4b3dyWGllcVdmbzFJaFI1a1g5dFVvcXpWZWdKNWE5S0s4R2ZhWlhJTkZIRGs2WTU0anpKMGZGZnkxdGIwCk5va2IrQ2xzaTduMmw5R2tMcXErQ3huQ1JlbHdYUUlEQUozWm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIKL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVNTg3R1Qvd1daNWI2U3FNSHdRU255MnJlMmtjd0h3WURWUjBqQkJnd0ZvQVU1ODdHVC93VwpaNWI2U3FNSHdRU255MnJlMmtjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFKdVltbDIrOHlnamRzWnM5My9tUUo3QU50eVZEUjJ0CkZjVTIyTlU1Ny9JZUlsNnpnclJkdTB3YXlwSU4zMGNrSHJNazJwR0k2WU53M1pQWDZicXozeFphUHQ3Z3lQdlQvV3dwK0JWR29HZ20KekpOU3JvSUJrNURLZDhwTlNlL2lXdGtxdlRET1RMS0J0akRPV1UvYVdSMXFlcVJGc0lJbWdZWjI5ZlVRQUxqdXN3bm9UNGNDQjY0awpYUEJmckFvd3pJcEFvSE1Fd2Z1SkpQYWFIRnkzUEFwbk5nVUlNYk92MkFGb0t1QjRqM1RldUZHa2pHd2dQYUw3czlRSi9YdkNnS3FUCmJDbVlJYWk3RnZPcEVsOTB0WWVZOHBVbTN6VHZpbE9SaUYwYWxLTS9mQ0w0MTRpNnBveVdxRDFTTkdLZkFCNVVWVUpueGsxR2o3c1UKUlQwS2xoYU9FS0dYbWRYVE1JWE0zclJ5dDd5S1BCZ3BhUDNjY1FmdUpEbHErdTJsckRnditSNFFEZ1p4R2hCTS9uVisveDVYT1VMSwoxK0VWb1ZaVldSdlJvNjhSMkU3RHBTdnZrTC9BN0lJVFc0M1djaXlUVG85cUtkK0ZQTk1ONEtJWUVzeFZMMGUzcDVzQy9rSDJpRXh0CjJxa0JSNE5rSjJJUWd0WVNlMTRESHpTcHlaSCtyMTF0aGllM0k2cDFHTW9nNTdBUDE0a09wbWNpWS9TRFFTc0dTN3RZMWRIWHQ3a1EKWTlpSlNyU3EzUlpqOVc2K1lLSDQ3ZWpXa0U4YXhzV2dLZE9uSWFqMVdqejN4MG1pSVpwS2xWSWdsbkthWnN2MzBvWkRmQ0srbHZtOQpBYWhIM2VVN1FQbDFLNXNyUm1TR2pSNzBqL3NIZDlEcVNhSWNqVklVcGdxVAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpjZXJ0U0lHTiBST09UIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURPRENDQWlDZ0F3SUJBZ0lHSUFZRkZuQUNNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WUQKVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQWVGdzB3TmpBM01EUXhOekl3TURSYQpGdzB6TVRBM01EUXhOekl3TURSYU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFCkN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxjenVYN0kKSlVxT3RkdTBLQnVxVjVEbzBTTFRaTHJUaytqVXJJWmhRR3BnVjJoVWhFMjhhbFFDQmYvZm01b3FybDBIajByREtIL3YreXY2ZWZISApyZkFRVXlTUWkyYkpxSWlycjFxakFPbSt1a2J1VzNON0xCZUNnVjVpTEtFQ1piTzl4U3NBZnNUOEF6TlhEZTNpK3M1ZFJkWTR6VFcyCnNzSFFuSUZLcXVTeUFWd2RqMStaeExHdDI0Z2g2NUFJZ29Eek1LTkQ1cENDcmxVb1NlMWIxNmtRT0E3K2oweGJtMGJxUWZXd0NIVEQKMElnenRuelhkTi9jaE5GRERuVTVvU1ZBS09wNHl3NHNMam1kakl0dUZod3ZKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0MwpBQUFhV3lqajBweHpQaktIbUtISlVTL1gzcXd6czA4Q0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCCkFmOEVCQU1DQWNZd0hRWURWUjBPQkJZRUZPQ01tOXNsU2JQeGZJYldza0tIQzlCcm9ObmtNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUIKQVFBKzBoeUpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZTW5ROApTRzRQbjB2VTl4N1RrNFprVkpkamNsRFZWYy82SUpNQ29wdkRJNU5PRmxWMm9IQjViYzBoSDg4dkxid1o0NGd4K0ZrYWdRbklsNlowCngyREVXOHhYanJKMS9Sc0NDZHRaYjNLVGFmY3hRZGFJT0wrSHNyMFdlZm1xNUw2SUpkMWhKeU1jdFRFSEJEYTBHcEM5b0hSeFVJbHQKdkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053aS9uRGhEd1RxbjZTbTFkVGsvcHd3cEVPTWZtYloxM3BsamhlWDdOegpUb2dWWjk2ZWRoQmlJTDVWYVpWREFEbE45dTZ3V2s1SlJGUllYMEtECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNOTklDIFJPT1QKPT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFZUQ0NBajJnQXdJQkFnSUVTVE1BQVRBTkJna3Foa2lHOXcwQkFRVUZBREF5TVFzd0NRWURWUVFHRXdKRFRqRU9NQXdHQTFVRQpDaE1GUTA1T1NVTXhFekFSQmdOVkJBTVRDa05PVGtsRElGSlBUMVF3SGhjTk1EY3dOREUyTURjd09URTBXaGNOTWpjd05ERTJNRGN3Ck9URTBXakF5TVFzd0NRWURWUVFHRXdKRFRqRU9NQXdHQTFVRUNoTUZRMDVPU1VNeEV6QVJCZ05WQkFNVENrTk9Ua2xESUZKUFQxUXcKZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFROZmMvYzNldDZGdHpGOExSYisxVnZHN3E2S1I1c216RApvKy9objdFN1NJWDFtbHdoSWhBc3hZTE8ydU9hYmpmaGh5emN1UXhhdW9oVjMvMnEyeDh4NmdIeDN6a0J3UlA5U0ZJaHhGWGYydGl6ClZIYTZkTEczZmRmQTZQWlp4VTNJdmEwZkZOcmZXRVFsTWhrcXgzNStqcTQ0c0RCN1IzSUpNZkF3MjhNYmRpbTdhWFpPVi9rYlpLS1QKVnJkdm1XN2JDZ1NjRWVPQUg4dGpsQkFLcWVGa2dqSDVqQ2Z0cHBrQTluQ1RHUGloTklhajNYckNHSG4yZW1VMXo1RHJ2VE9UbjFPcgpjenZtbXpRZ0x4M3ZxUjFqR3FDQTJ3TXYrU1lhaHRLTnU2bStVanFIWjBnTnY3U2cyQ2ErSTE5ek4zOG01cElFbzMvUElLZTM4enJLCnk1bkxBZ01CQUFHamN6QnhNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFmQmdOVkhTTUVHREFXZ0JSbDhqR3RLdmYzM1ZLV0NzY0MKd1E3dnB0VTdFVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQXNHQTFVZER3UUVBd0lCL2pBZEJnTlZIUTRFRmdRVVpmSXhyU3IzOTkxUwpsZ3JIQXNFTzc2YlZPeEV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUVzMTdzemtyci9EYnEyZmxUdExQMXNlMzFjcG9sbktPT0s1Ckd2K2U1bTR5M1I2dTZqVzM5Wk9SVHRwQzRjTVhZRkR5MFZ3bXVZSzM2bTNrbklUbkEza1hyNWc5bE52SHVnRG51TDhCVjhGM1JUSU0KTy9HMEhBaXcvVkdnb2QyYUhSTTJtbTIzeHp5NTRjWFpGL3FEMVQwVm9EeTdIZ3ZpeUpBL3FJWU0vUG1MWG9YTFQxdExZaEZIeFVWOApCUzlCc1o0UWFSdVpsdUJWZWZ0T2hwbTRsTnFHT0dxVG8rZkxidVhmNmlGVmlaeDlmWCtZOVFDSjd1T0V3RnlXdGNWRzZrYmdoVlcyCkc4a1Mxc0hOellEekFnRTh5R25MUlVoajJKVFE3SVVPTzA0UlpmU0NqS1k5cmk0aWxBbklYT284Z1YwV0tnT1hGbFVKMjRwQmdwNW0KbXhFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBcHBsaWNhdGlvbkNBIC0gSmFwYW5lc2UgR292ZXJubWVudAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG9EQ0NBb2lnQXdJQkFnSUJNVEFOQmdrcWhraUc5dzBCQVFVRkFEQkRNUXN3Q1FZRFZRUUdFd0pLVURFY01Cb0dBMVVFQ2hNVApTbUZ3WVc1bGMyVWdSMjkyWlhKdWJXVnVkREVXTUJRR0ExVUVDeE1OUVhCd2JHbGpZWFJwYjI1RFFUQWVGdzB3TnpFeU1USXhOVEF3Ck1EQmFGdzB4TnpFeU1USXhOVEF3TURCYU1FTXhDekFKQmdOVkJBWVRBa3BRTVJ3d0dnWURWUVFLRXhOS1lYQmhibVZ6WlNCSGIzWmwKY201dFpXNTBNUll3RkFZRFZRUUxFdzFCY0hCc2FXTmhkR2x2YmtOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgpDZ0tDQVFFQXAyM2dkRTZIajZVRzNtaWkyNGFaUzJRTmNmQUtCWnVPcXVITUx0SnFPOEY2dEpkaGpZcSt4cHFjQnJTR1VlUTNEblI0CmZsK0tmNVNrMTBjSS9WQmFWdVJvckNoem9IdnBmeGlTUUU4dG5mV3VSRWh6TmdhZVpDdzdOQ1BiWENia2NYbVAxRzU1SXJtVHdjck4Kd1ZidGlHclhvRGtoQkZjc292VzhSMEZQWGpRaWxiVWZLVzFlU3ZOTmNyNUJWaUNIL09sUVI5Y3dGTzVjakZXNldZMkgvQ1BlazlBRQpqUDN2YmIzUWVzbWxPbXB5TThaS0RRVVhLaTE3c2FmWTF2Qys5RC9xRGlodFFXRWpkbmpEdUdXazgxcXV6TUtxMmVkWTNyWituWVZ1Cm55b0tiNThES1RDWEtCMjh0ODlVS1U1Uk1ma250aWdtL3FKajVrRVc4RE9ZUndJREFRQUJvNEdlTUlHYk1CMEdBMVVkRGdRV0JCUlUKV3NzbVAzSE1sRVlObGxQcWEwalFrLzVDZFRBT0JnTlZIUThCQWY4RUJBTUNBUVl3V1FZRFZSMFJCRkl3VUtST01Fd3hDekFKQmdOVgpCQVlUQWtwUU1SZ3dGZ1lEVlFRS0RBL21sNlhtbkt6bG03M21sTC9sdXB3eEl6QWhCZ05WQkFzTUd1T0NvdU9EbCtPRHF1T0NzZU9ECnZPT0N0K09EcCtPRHMwTkJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRGxxUkhaM09EcnMKbzJkR0QvbUxCcWo3YXBBeHpuN3MydEdKZkhyckxneTltVExuc0NUV3cvLzFzb2dKaHl6alZPR2pwcklJQzhDRnFNalNuSEgySFo5ZwovRGd6RStHZTNBdGYyaFpRS1hzdmNKRVBtYm8wTkkyVmRNVitlS2xtWGIzS0lYZENFS3htSmozZWthdjlGZkJ2N1d4ZkVQanpGdllECmlvK25FaEVNeS8wL2VjR2MvV0x1bzg5VURORXJYeGMrNHo2L3dDcytDWnYraUtaK3RKSVgvQ09VZ2IxdXA4V013dXNSUmR2NFFjbVcKZHVwd1gza1NhK1NqQjFvRjd5ZEp6eUdmaWt3SmNHYXBKc0VyRVU0ejBnNzgxbXpTRGpKa2FQK3RCWGhmQXgybzQ1Q3NKT0FQUUtkTApyb3NvdDRMS0dBZm10MXQwNlNBWmY3SWJpVlE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQvakNDQXVhZ0F3SUJBZ0lRRmF4dWxCbXllVXRCOWllcHd4Z1BIekFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUUKQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNElFZGxiMVJ5ZFhOMApJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFMk1EUUdBMVVFQXhNdFIyVnZWSEoxYzNRZ1VISnBiV0Z5CmVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdElFY3pNQjRYRFRBNE1EUXdNakF3TURBd01Gb1hEVE0zTVRJd01USXoKTlRrMU9Wb3dnWmd4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBbwpZeWtnTWpBd09DQkhaVzlVY25WemRDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TmpBMEJnTlZCQU1UCkxVZGxiMVJ5ZFhOMElGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSE16Q0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOemlYbUpZSFROWE9USXordXZMaDR5bjFFcmRCb2pxWkk0eG1LVTRrQjZZenk1agpLL0JHdkVTeWlhSEFLQXhKY0NHVm4yVEFwcE1TQW1VbWhzYWxpZkQ2MTRTZ2NLOVBHcGMvQmtUVnlldHlFSDNrTVNqN0hHSG1LQWRFCmM1SWlhYWNEaUd5ZFk4aFMycGduNXdoTWNENjB5UkxCeFdlRFhUUHpBeEhzYXRCVDR0RzZObUNVZ0x0aFkyeGJGMzdmUUpRZXF3M0MKSVNod2lQL1dKbXhzWUFRbFRsVitmZSsvbEVqZXR4M2RjSTBGWDRpbG0vTEM3dXJSUUVGdFlqZ2RWZ2JGQTBkUklCbjhleEFMRG1LdQpkbFcvWDNlK1Bra0JVejJZSlFOMkpGb2R0TnVKNm5ubHRyTTdQN3BNS0VGL0JxeHFqc0hROWdVZGZlWkNodU9sMVVjQ0F3RUFBYU5DCk1FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZNUjV5bzZoVGdNZEhOeHIKMnpGYmxENC9NSDh0TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBdHhSUFBWb0I3ZW5pOW42NHNtZWZ2MnQrVVhnbHBwK2R1YUl5OQpjcjVIcVE2WEVyaEs4V1RUT2Q4bE5OVEJ6VTZCOEE4RXhDU3pOSmJHcHFvdzMyaGhjOWY1am9XSjd3NWVsU2hLS2llUEVJNHVmSWJFCkFwN2FESGRsRGtRTmt2MzlzeFkyK2hFTkhZd09CNGxxS1ZiM2N2VGRGWngzTldaWHF4TlQySTdCUU1YWEV4WmFjc2UzYVFIRWVyR0QKQVdoOWpVR2hsQmpCSlZ6ODhQNkRBb2Q4RFEzUExnaGNTa0FOUHV5QlllWWsyOHJnRGkwSHNqNVczSTMxUVlVSFNKc01DOHRKUDMzcwp0LzNMaldlSkdxdnR1eDZqQUFnSUZ5cUNYREZkUm9vdEQ0YWJkTmxGKzlSQXNYcXFhQzJHc3BraTRjRXJ4NXo0ODErb2doTHJHUkV0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpRENDQWcyZ0F3SUJBZ0lRTmZ3bVhObUVUOGs5SmoxWG02N1hWakFLQmdncWhrak9QUVFEQXpDQmhERUxNQWtHQTFVRUJoTUMKVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakU0TURZR0ExVUVDeE12S0dNcElESXdNRGNnZEdoaGQzUmxMQ0JKYm1NdQpJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnClEwRWdMU0JITWpBZUZ3MHdOekV4TURVd01EQXdNREJhRncwek9EQXhNVGd5TXpVNU5UbGFNSUdFTVFzd0NRWURWUVFHRXdKVlV6RVYKTUJNR0ExVUVDaE1NZEdoaGQzUmxMQ0JKYm1NdU1UZ3dOZ1lEVlFRTEV5OG9ZeWtnTWpBd055QjBhR0YzZEdVc0lFbHVZeTRnTFNCRwpiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0CklFY3lNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRW90V2NnbnVWbmZGU2VJZitpaGEvQmViZm93SlBEUWZHQUZHNkRBSlMKTFNLa1FqbkUvby9xeWNHKzFFMy9uM3FlNHJGOG1xMm5oZ2x6aDlIbm11TjZwYXB1KzdxemNNQm5pS0kxMUtPYXNmMnR3dTh4K3FpNQo4L3NJeHBIUit5bVZvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVCm10Z0FNQURuYTMrRkdPNkx0czZLRFBnUjRic3dDZ1lJS29aSXpqMEVBd01EYVFBd1pnSXhBTjM0NEZkSFc2Zm1Dc085OVlDS2x6VU4KRzRrOFZJWjNLTXFoOUhuZXRlWTRzUEJsY0l4L0FsVEN2Ly9Zb1Q3Wnp3SXhBTVNObFB6Y1U5TGNuWGdXSHhVekkxTlM0MW94WFozSwpycjBUS1VRTkoxdW81MmljRXZkWVB5NXlBbGVqajZFVUxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUtqQ0NBeEtnQXdJQkFnSVFZQUdYdDBhbjZyUzBtdFpMTC9lUSt6QU5CZ2txaGtpRzl3MEJBUXNGQURDQnJqRUxNQWtHQTFVRQpCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyCmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXdNRGdnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHYKY21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNekFlRncwdwpPREEwTURJd01EQXdNREJhRncwek56RXlNREV5TXpVNU5UbGFNSUd1TVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1kR2hoCmQzUmxMQ0JKYm1NdU1TZ3dKZ1lEVlFRTEV4OURaWEowYVdacFkyRjBhVzl1SUZObGNuWnBZMlZ6SUVScGRtbHphVzl1TVRnd05nWUQKVlFRTEV5OG9ZeWtnTWpBd09DQjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEVrTUNJRwpBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0SUVjek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXNyOG5MUHZiMkZ2ZGVIc2JubmRtZ2NzK3ZIeXU4NllubWpTamFERnhPRE5pNVBOeFpubXhxV1dqcFl2VmoyQXQKUDBMTXFtc3l3Q1BMTEVIZDVOLzhZWnppYzdJaWxSRkRHRi9FdGg5WGJBb0ZXQ0xJTmt3NmZLWFJ6NGF2aUtkRUFoTjBjWE1LUWxrQworQnNVYTBMZmIxKzZhNEtpblZ2blNyMGVBWExiUzNUb08zOS9mUjhFdENhYjRMUmFyRWM5VmJqWHNDWlNLQUV4UUdiWTJTUzk5aXJZCjdDRkpYSnYyZXVsL1ZUVitsbXVOazVNbnk1Szc2cXhBd0ovQytJRFBYZlJhM001MGhxWStiQXRUeXIyU3poa0djdVlNWERocHh3VFcKdkd6T1cvYjNhSnpjSlJWSWlLSHBxZmlZbk9EejFURW9ZUkZzWjVhTk9abkx3a1VrT1FJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXJXeXFsR0NjN2VULytqNEtkQ3RqQS9lMldiOHdEUVlKCktvWklodmNOQVFFTEJRQURnZ0VCQUJwQTJKVmxyQW1TaWNZNTlCRGxxUTVtVTExNDN2b2trYnZuUkZIZnhoWTBDdTlxUkZIcUt3ZUsKQTNyRDZ6OEtMRklXb0N0RHVTV1FQM0NwTXlWdFJSb29PeWZQcXNNcFFodmZPMHpBTXpSYlFZaS9heXRscnlqdnN2WERxbWJPZTFidQp0OGpMWjhISm5Cb1l1TVREU1FQeFlBNVF6VWJGODNkNTk3WVY0RGpieHk4b29Bdy9keVowMlNVUzJqSGFHaDdjS1VHUklqeHBwN3NDCjhyWmNKd09KOUFicW0rUnlndU9oQ2NIcEFCblRQdFJ3YTdweHBxcFlydlM3Nld5Mjc0Zk1tN3YvT2VaV1lkTUtwOFJjVEdCN0JYY20KZXIvWUIxSXNZdmR3WTlrNXZHOGN3bm5jZGltdnpzVXNaQVJlaURadU1kUkFHbUkwTmo4MUFhNnNZNkE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNyakNDQWpXZ0F3SUJBZ0lRUExMMFNBb0E0djdySkR0ZVlEN0RhekFLQmdncWhrak9QUVFEQXpDQm1ERUxNQWtHQTFVRUJoTUMKVlZNeEZqQVVCZ05WQkFvVERVZGxiMVJ5ZFhOMElFbHVZeTR4T1RBM0JnTlZCQXNUTUNoaktTQXlNREEzSUVkbGIxUnlkWE4wSUVsdQpZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEUyTURRR0ExVUVBeE10UjJWdlZISjFjM1FnVUhKcGJXRnllU0JEClpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEEzTVRFd05UQXdNREF3TUZvWERUTTRNREV4T0RJek5UazEKT1Zvd2daZ3hDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxSFpXOVVjblZ6ZENCSmJtTXVNVGt3TndZRFZRUUxFekFvWXlrZwpNakF3TnlCSFpXOVVjblZ6ZENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hOakEwQmdOVkJBTVRMVWRsCmIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITWpCMk1CQUdCeXFHU000OUFnRUcKQlN1QkJBQWlBMklBQkJXeDZQMERGVVBsck91SE54Rmk3OUtETmxKOVJWY0xTbzE3VkRzNmJsOFZBc0JRcHM4bEwzM0tTTGpIVUdNYwpLaUVJZkpvMjJBdiswU2JGV0RFd0tDWHpYVjJqdUxhbHRKTHRiQ3lmNjkxRGlhSThTMGlSSFZEc0p0L1dZQzY5SWFOQ01FQXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQlZmTlZkUlZmc2xzcTBEYWZ3Qm8vcSsKRVZYVk1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01HU1dXYWJvQ2Q2THV2cGFpSWp3SDVIVFJxanlTa3dDWS90c1h6amJMa0dUcVE3bQpuZHd4SExLZ3B4Z2NlZUhITmdJd09sYXZtblJzOXZ1RDREUFRDRitobk1KYm4wYld0c3VSQm1PaUJ1Y3pyRDZvZ1JMUXk3clFrZ3UyCm5wYXFCQStLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdVRDQ0E2R2dBd0lCQWdJUVFCckVaQ0d6RXlFRERydmtFaHJGSFRBTkJna3Foa2lHOXcwQkFRc0ZBRENCdlRFTE1Ba0dBMVVFCkJoTUNWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk8KWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdPQ0JXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1WawpJSFZ6WlNCdmJteDVNVGd3TmdZRFZRUURFeTlXWlhKcFUybG5iaUJWYm1sMlpYSnpZV3dnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1CklFRjFkR2h2Y21sMGVUQWVGdzB3T0RBME1ESXdNREF3TURCYUZ3MHpOekV5TURFeU16VTVOVGxhTUlHOU1Rc3dDUVlEVlFRR0V3SlYKVXpFWE1CVUdBMVVFQ2hNT1ZtVnlhVk5wWjI0c0lFbHVZeTR4SHpBZEJnTlZCQXNURmxabGNtbFRhV2R1SUZSeWRYTjBJRTVsZEhkdgpjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXlNREE0SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCklHOXViSGt4T0RBMkJnTlZCQU1UTDFabGNtbFRhV2R1SUZWdWFYWmxjbk5oYkNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjAKYUc5eWFYUjVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXgyRTNYckVCTk50aTF4V2IvMWhhakNNagoxbUNPa2RlUW1JTjY1bGdaT0l6Rjl1VmtoYlNpY2Z2dHZibmF6VTBBdE1ndGM2WEhhWEdWSHprOHNrUUhuT2dPK2sxS3hDSGZLV0dQCk1pSmhnc1dISDI2TWZGOFdJRkZFMFhCUFYrcmpIT1BNZWU1WTJBN0NzMFdUd0N6bm1oY3Jld0EzZWtFemVPRXo0dk1RR24rSExMNzIKOWZkQzR1Vy9oMktKWHdCTDM4WGQ1SFZFTWtFNkhuRnVhY3NMZFVZSTBjclNLNVhRei91NVFHdGtqRmROL0JNUmVZVHRYbFQyTko4SQpBZk1RSlFZWFN0cnhIWHBtYTVoZ1pxVFo3OUl1Z3ZIdzd3bnFSTWtWYXVJRGJqUFRySjlWQU1mMkNHcVV1Vi9jNERQeGhHRDVXeWNSCnRQd1c4cnRXYW9BbGpRSURBUUFCbzRHeU1JR3ZNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01HMEcKQ0NzR0FRVUZCd0VNQkdFd1g2RmRvRnN3V1RCWE1GVVdDV2x0WVdkbEwyZHBaakFoTUI4d0J3WUZLdzREQWhvRUZJL2wweHFHckkyTwphOFBQZ0dyVVNCZ3NleGt1TUNVV0kyaDBkSEE2THk5c2IyZHZMblpsY21semFXZHVMbU52YlM5MmMyeHZaMjh1WjJsbU1CMEdBMVVkCkRnUVdCQlMyZC9wcFNFZWZVeExWd3VvSE1uWUgwWmNIR1RBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVN2ajRzQVBtTEdkNzVKUjMKWTh4dVRQbDlEZzNjeUxrMXVYQlBZL29rK215RGpFZWRPMlB6bXZsMk1wV1JzWGU4ckpxK3NlUXhJY2FCbFZaYURySEMxTEdtV2F6eApZOHU0VEIxWmtFcnZrQllvSDFxdUVQdUJVRGdNYk16eFBjUDFZK096NHlISkpEbnAvUlZtUnZRYkVkQk5jNk45UnZrOTdhaGZZdFR4ClAvamdkRmNyR0oyQnRNUW8ycFNYcFhEcnJCMitCeEh3MWR2ZDVZencxVEt3ZytaWDRvKy92cUdxdnowZHRkUTQ2dGV3WERwUGFqK1AKd0dac1k2cnAyYVFXOUlIUmxSUU9mYzJWTk5uU2ozQnpnWHVjZnIyWVlkaEZoNWlReGV1R01NWTF2L0QvdzFXSWcwdnZCWklHY2ZLNAptSk8zN00yQ1lmRTQ1aytYbUNwYWpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGhEQ0NBd3FnQXdJQkFnSVFMNEQrSTR3T0lnOUlaeElva1llc3N6QUtCZ2dxaGtqT1BRUURBekNCeWpFTE1Ba0dBMVVFQmhNQwpWVk14RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNUjh3SFFZRFZRUUxFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzCmIzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOeUJXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1Wa0lIVnoKWlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSelF3SGhjTk1EY3hNVEExTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0J5akVMCk1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlUKY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSbwpiM0pwZW1Wa0lIVnpaU0J2Ym14NU1VVXdRd1lEVlFRREV6eFdaWEpwVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1CklFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6UXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFTblZucDgKVXRwa213NHRYTmhlckpJOS9nSG1HVW85RkFOTCttQW5JTm1EaVduNlZNYWFHRjVWS21UZUJ2YU5TanV0RUR4bFBaQ0lCSW5nTUdHegpybDBCcDN2ZWZMSyt5bVZoQUlhdTJvOTcwSW10VFIxWm1rR3h2RWVBM0o1aXcvbWpnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSmFXMWhaMlV2WjJsbU1DRXcKSHpBSEJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqYUhSMGNEb3ZMMnh2WjI4dWRtVnlhWE5wWjI0dQpZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZMTVdrZjN1cG03a3RTNUpqNGQ0Z1lEczViRzFNQW9HQ0NxR1NNNDlCQU1ECkEyZ0FNR1VDTUdZaERCZ21ZRm80ZTFaQzRLZjhOb1JSa1NBc2RrMURQY1FkaENQUXJOWjhOUWJPeldtOWtBM2JiRWhDSFE2cVFnSXgKQUp3OVNEa2pPVmdhRlJKWmFwN3YxVm15SFZJc21YSE54eW5mR3lwaGUzSFIzdlBBNVEwNlNxb3RwOWlHS3QwdUVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsOF4oCYdGFuw4PCunPDg8KtdHbDg8KhbnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lHU1VFczVBQVFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR25NUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEcKQTFVRUJ3d0lRblZrWVhCbGMzUXhGVEFUQmdOVkJBb01ERTVsZEV4dlkyc2dTMlowTGpFM01EVUdBMVVFQ3d3dVZHRnV3N3B6dzYxMApkc09oYm5scmFXRmt3N05ySUNoRFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpLVEUxTURNR0ExVUVBd3dzVG1WMFRHOWpheUJCCmNtRnVlU0FvUTJ4aGMzTWdSMjlzWkNrZ1JzV1JkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3gKTWpBMk1UVXdPREl4V2pDQnB6RUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJVd0V3WURWUVFLREF4TwpaWFJNYjJOcklFdG1kQzR4TnpBMUJnTlZCQXNNTGxSaGJzTzZjOE90ZEhiRG9XNTVhMmxoWk1PemF5QW9RMlZ5ZEdsbWFXTmhkR2x2CmJpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56SUVkdmJHUXBJRWJGa1hSaGJzTzYKYzhPdGRIYkRvVzU1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4Q1JlYzc1TGJSVERvZlRqbDVCdQowakJGSGp6dVo5bGs0QnFLZjhvd3lvUGpJTUhqOURyVGxGOGFmRnR0dnpCUGhDZjJueDlKdk1hWkNwRHlEL1YvUTRRM1kxR0xlcVZ3Ci9IcFl6WTZiN2NOR2JJUndYZHJ6QVpBai9FNHdxWDdoSjJQbjdXUThvTGpKTTJQK0ZwRC9zTGo5MTZqQXdKUkRDN2JWV2FhZVZ0QWsKSDNCNXI5czVWQTFsZGRrVlFaUUJyMTdzOW8zeC82MWsvaUNhMTF6ci9xWWZDR1NqaTNaVnJSNDdLR0F1aHlYb3FxOGZ4bVJHSUxkdwpmenplU051V1U3YzVkK1FhNHNjV2hIYVhXeSs3R1JXRitHbUY5Wm1ucWZJMHA2bTJwZ1A4YjRZOVZIeDJCSnRyK1VCZEFEVEhMcGwxCm5lV0lBNnBOK0FQU1FuYkFHd0lEQUtpTG8wVXdRekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VFTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVXpQcG5rL0MydU5DbHdCN3pVLzJNVTkrRDE1WXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS3QvN2h3VwpxWnc4VVFDZ3dCRUlCYWVaNW04QmlGUmhidkc1R0sxS3JmNkJRQ09VTC90MWZDOG9TMklrZ1lJTDlXSHhIRzY0WVRqcmdmcGlvVHRhCll0T1VaY1RoNW0yQytDOGxjTEloSnNGeVVSK01MTU9Fa01OYWo3clA5S2RscGV1WTBmc0Zza1oxRlNOcWI0VmpNSUR3MVo0ZktSekMKYkxCUVdWMlFXenVvRFREUHYzMS96dkdkZzczSlJtNGdwdmxoVWJvaEwzdStwUlZqb2RTVmgvR2V1Zk9KOHoyRnVMamJ2clc1S2ZuYQpOd1VBU1pRRGhFVG52ME14ejNXTEpkSDBwbVQxa3ZhckJlczk2YVVMTm1MYXpBWmZOb3UyWGpHNEt2dGU5bkhmUkNhZXhPWU5rYlF1CmRaV0FVV3BMTUthd1lxR1Q4WnZZenNSamRUOVpSN0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnlqQ0NBN0tnQXdJQkFnSUVBSmlXakRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKT1RERWVNQndHQTFVRQpDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnClVtOXZkQ0JEUVNBdElFY3lNQjRYRFRBNE1ETXlOakV4TVRneE4xb1hEVEl3TURNeU5URXhNRE14TUZvd1dqRUxNQWtHQTFVRUJoTUMKVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbGNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bApaR1Z5YkdGdVpHVnVJRkp2YjNRZ1EwRWdMU0JITWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTVZaCjUyOTFxajVMbkxXNHJKNEw1UG5aeXF0ZGo3VTVFSUxYcjFIZ08rRUFTR3JQMnVFR1F4R1pxaFFsRXEwaTZBQnRROFNwdU9VZmlVdG4KdldGSTcvM1M0R0NJNWJrWVlDakRkeXV0c0RlcU45NWtXU3BHVitSTHVmZzNmTlUyNTREQnR2UFVaNXVXNk03WHhncFQwR3RKbHZPagpDd1YzU1BjbDVYQ3NNQlFnSmVOL2RWcmxTUGhPZXdNSEJQcUNZWWR1OER2RXBNZlE5WFErcFYwYUNQS2JKZEwyckFRbVBsVTZZaWlsCmU3SXdyL2czd3RHNjFqajk5TzlKTURlWkppRkloUUdwNVJibjNKQlYzdy9vT00yWk55RlBYZlVpYjJyRkVoWmdGMVh5WldhbXB6Q1IKT01FNEhZWUVoTG9hSlhoZW5hL01VR0RXRTRkUzdXTWZiV1Y5d2hVWWRNcmhmbVFwakhMWUZoTjlDMGxLOFNnYklIUnJ4VDNkc0twSQpDVDB1Z3BUTkdtWFpLNGlhbWJ3WWZwL3VmV1o4UHIyVXVJSE96Wmd3ZU1Gdlo5QytYK0JvN2Q3aXNja3NXWGlTcXQ4cllHUHk1VjY1CjQ4cjZmMUNHUHFJMEdBd0phQ2dSSE9UaHVWdytSN295UHhqTVc0VDE4MnQweEhKMDRlT0xvRXE5aldZdjZxMDEyaURUaUlKaDhCSWkKdHJ6UTFhVHNyMVNJSlNROHAyMnhjaWsvUGxlbWYxV3ZiaWJHL3VmTVFGeFJSSUVLZU41S3psVy9IZFhadDFidjhIYi9DM20xcjczNwpxV21SUnBkb2dCUTJIYk4vdXltWU5xVWcrb0pnWWpPazdOYTZCNmR1eGM4VXB1ZldralRZZ2ZYOEhWMnFYQjcybzAwN3VQYzVBZ01CCkFBR2pnWmN3Z1pRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCU0JnTlZIU0FFU3pCSk1FY0dCRlVkSUFBd1B6QTlCZ2dyQmdFRkJRY0MKQVJZeGFIUjBjRG92TDNkM2R5NXdhMmx2ZG1WeWFHVnBaQzV1YkM5d2IyeHBZMmxsY3k5eWIyOTBMWEJ2YkdsamVTMUhNakFPQmdOVgpIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkpGb01vY1ZIWW5pdGZHc05pZzBqUXQ4WW9qck1BMEdDU3FHU0liM0RRRUJDd1VBCkE0SUNBUUNvUVVwbktwS0JnbEJ1NGRmWXN6azc4d0lWQ1ZCUjd5MjlKSHVJaGp2NXRMeVNDWmE1OXNDckkyQUdlWXdSVGxIU2VZQXoKKzUxSXZ1eEJRNEVmZmtkQUhPVjZDTXFxaTNXdEZNVEM2R1k4Z2dlbjVpZUNXeGptRDI3WlVENktRaGdweHJSVy9GWVFvQVVYdlF3agpmL1NUN1p3YVViN2RSVUcva1NTMEg0enBYODk3SVptZmxaODVPa1ljYlBuTmU1eVF6U2lweDZsVnU2eGlOR0kxRTBzVU9sV0R1WWFOCmtxYkc5QWNsVk13V1Z4SktnbmpJRk5rWGdpWXRYU0FmZWE3KzFIQVdGcFdEMkRVNS8xSmRkUndXeFJOVnowZk1kV1ZTU3Q3d3NLZmsKQ3BZTCs2M0M0aVdFc3Qza3ZYNVpiSnZ3OE5qbnl2THBsemgraWI3TSt6a1hZVDl5MnpxUjJHVUJHUjJ0VUtSWENueEx2Snh4Y3lwRgpVUm1Gekk3OVI2ZDBsUjJvMGE5T0Y3RnBKc0txZUZkYnhVMm41WjRGRjVUS3NsK2dTUmlOTk9rbWJFZ2VxbWlTQmVHQ2MxcWIzQWRiCkNHMTluZGVOSWRuOEZDQ3F3a1hmUCtjQXNsSGt3dmdGdVhrYWpEVHpubHZrTjF0clN0OHNWNHBBV2phNjNYVkVDRGRDY0F6KzNGNGgKb0tPS3dKQ2NhTnBRNWtVUVIzaTJUdEpseWNNMzMrRkNZN0JYTjBVdGU0cWN2d1hxWlZVejl6a1F4U2dxSVhvYmlzUWsrVDhWeUpvVgpJUFZWWXBidGJaTlF2T1NxZUszWnl3cGxoNlptd2NTQm8zYzZXQjRMN29PTG5SN1NVcVRNSFcrd21HMlVNYlg0Y1FyY3VmeDlNbURtCjY2K0tBUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNBIERpc2lnCj09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRHpDQ0F2ZWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCS01Rc3dDUVlEVlFRR0V3SlRTekVUTUJFR0ExVUVCeE1LClFuSmhkR2x6YkdGMllURVRNQkVHQTFVRUNoTUtSR2x6YVdjZ1lTNXpMakVSTUE4R0ExVUVBeE1JUTBFZ1JHbHphV2N3SGhjTk1EWXcKTXpJeU1ERXpPVE0wV2hjTk1UWXdNekl5TURFek9UTTBXakJLTVFzd0NRWURWUVFHRXdKVFN6RVRNQkVHQTFVRUJ4TUtRbkpoZEdsegpiR0YyWVRFVE1CRUdBMVVFQ2hNS1JHbHphV2NnWVM1ekxqRVJNQThHQTFVRUF4TUlRMEVnUkdsemFXY3dnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1M5akhCZllqOW1RR3AySHZ5Y1hYeE1jYnpkV2I2VVNoR2hKZDROTHhzL0x4RldZZ20KR0VyRU54K2hTa1M5NDNFRTlVUVg0ai84U0ZodlhKNTZDYnBSTnlJalprTWhzRHhrb3ZocUZRNC82MUhoVktuZEJwblhtanhVaXprRApQdy9GenNicmczSUNxQjl4OHkzNGRRamJZa3pvK3M3NTUyb2Z0bXMxZ3JyaWp4YVNmUVVNYkVZRFhjRHRhYjg2d1lxZzZJN1p1VVVvCmh3anN0TW9Wdm9MZHRVU0xMYTJHREdoaWJZVlc4cXdVWXpyRzBabXNOSGhXUzgrMnJUK01pdGNFNWVONFRQV0dxdldQK2oxc2NhTXQKeW1mcmFIdHVNNmtNZ2lpb1RHb2hRQlVnRENaYmc4S3BGaFhBSklKZEt4YXR5bVAyZEFDdzMwUEVFR0JXWjJORkFnTUJBQUdqZ2Y4dwpnZnd3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVamJKSmFKMXlDQ1c1d0NmMVVKTldTRVp4K1k4d0RnWURWUjBQCkFRSC9CQVFEQWdFR01EWUdBMVVkRVFRdk1DMkJFMk5oYjNCbGNtRjBiM0pBWkdsemFXY3VjMnVHRm1oMGRIQTZMeTkzZDNjdVpHbHoKYVdjdWMyc3ZZMkV3WmdZRFZSMGZCRjh3WFRBdG9DdWdLWVluYUhSMGNEb3ZMM2QzZHk1a2FYTnBaeTV6YXk5allTOWpjbXd2WTJGZgpaR2x6YVdjdVkzSnNNQ3lnS3FBb2hpWm9kSFJ3T2k4dlkyRXVaR2x6YVdjdWMyc3ZZMkV2WTNKc0wyTmhYMlJwYzJsbkxtTnliREFhCkJnTlZIU0FFRXpBUk1BOEdEU3VCSHBHVDVnb0FBQUFCQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGMDBkR0ZNcnp2WS81OXQKV0RZY1BRdUJEUklyUmhDQS9lYzhKOUI2eUttMmZuUXdNNk02aW50MHdIbDVRcE50LzdFcEZJS3JJWXd2Ri9rL0ppLzFXY2J2Z0FhMwpta2twN001K2NUeHFFRUhBOXRPYXNueGFrWnpBckZ2SVRWNzM0VlAvUTNmOG5rdG5iTmZ6ZzlHZzRIOGwzN2lZQzVveU9Hd3dvUFAvCkNCVXo5MUJLZXo2alBpQ3AzQzlXZ0FydFFWQ3d5ZlRzc3VNbVJBQU9iNTRHdkNLV1UzQmx4RkFLUm11a0x5ZUJFaWNUWHhDaGRzNksKZXpmcXd6bGhBNVdZT3Vkc2lDVUkvSGxvRFlkOVl2aTBYL3ZGMkV5OVdMdy9RMXZVSGdGTlBHTytJKytNelZwUXVHaFUrUXFaTXhFQQo0WjdDUm5lQzlWa0dqQ0ZNaHduTjVhZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSnV1ci1TSwo9PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFNWpDQ0E4NmdBd0lCQWdJRU80NUwvREFOQmdrcWhraUc5dzBCQVFVRkFEQmRNUmd3RmdZSktvWklodmNOQVFrQkZnbHdhMmxBCmMyc3VaV1V4Q3pBSkJnTlZCQVlUQWtWRk1TSXdJQVlEVlFRS0V4bEJVeUJUWlhKMGFXWnBkSE5sWlhKcGJXbHphMlZ6YTNWek1SQXcKRGdZRFZRUURFd2RLZFhWeUxWTkxNQjRYRFRBeE1EZ3pNREUwTWpNd01Wb1hEVEUyTURneU5qRTBNak13TVZvd1hURVlNQllHQ1NxRwpTSWIzRFFFSkFSWUpjR3RwUUhOckxtVmxNUXN3Q1FZRFZRUUdFd0pGUlRFaU1DQUdBMVVFQ2hNWlFWTWdVMlZ5ZEdsbWFYUnpaV1Z5CmFXMXBjMnRsYzJ0MWN6RVFNQTRHQTFVRUF4TUhTblYxY2kxVFN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKZ2dFQkFJRnhOajR6Qjliak1JMFRmbmN5UnN2UEdiSmdNVWFYaHZTWVJxVENaVVhQMDBCODQxb2lxQkI0TTh5SXNkT0JTdlppRjN0ZgpUUW91ME0rTEkrNVBBazY3Nnc3S3ZSaGo2SUFjamVFY2pUM2cvMXRmNm1UbGwrZy9tWDhNQ2drekFCcFRweUhoT0V2V2d4dXRyMlRDCitSeDZqR1pJVFdZZkdBcmlQcnNmQjJXVGhia2FzTG5FK3cwUjl2WFcrUnZITEN1M0dGSCs0SHYycUVpdmJEdFBMKy80MFVjZUpsZncKVVIwemx2L3ZXVDNhVGRFVk5NZnFQeFpJZTVFY2dFTVBQYmdGUHRHemxjM1l5Zy9DUTJmYnQ1UGdJb0l1dnZWb0tJTzV3VHRwZXlEYQpUcHh0NGJyTmozcHNzQWtpMTRzTDJ4elZXaVpiRGNEcTVXRFFuLzQxM3o4Q0F3RUFBYU9DQWF3d2dnR29NQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3Z2dFV0JnTlZIU0FFZ2dFTk1JSUJDVENDQVFVR0Npc0dBUVFCemg4QkFRRXdnZll3Z2RBR0NDc0dBUVVGQndJQ01JSEQKSG9IQUFGTUFaUUJsQUNBQWN3QmxBSElBZEFCcEFHWUFhUUJyQUdFQVlRQjBBQ0FBYndCdUFDQUFkZ0RrQUd3QWFnQmhBSE1BZEFCaApBSFFBZFFCa0FDQUFRUUJUQUMwQWFRQnpBQ0FBVXdCbEFISUFkQUJwQUdZQWFRQjBBSE1BWlFCbEFISUFhUUJ0QUdrQWN3QnJBR1VBCmN3QnJBSFVBY3dBZ0FHRUFiQUJoQUcwQUxRQlRBRXNBSUFCekFHVUFjZ0IwQUdrQVpnQnBBR3NBWVFCaEFIUUFhUUJrQUdVQUlBQnIKQUdrQWJnQnVBR2tBZEFCaEFHMEFhUUJ6QUdVQWF3QnpNQ0VHQ0NzR0FRVUZCd0lCRmhWb2RIUndPaTh2ZDNkM0xuTnJMbVZsTDJOdwpjeTh3S3dZRFZSMGZCQ1F3SWpBZ29CNmdISVlhYUhSMGNEb3ZMM2QzZHk1emF5NWxaUzlxZFhWeUwyTnliQzh3SFFZRFZSME9CQllFCkZBU3Fla2VqNUltdkdzOEtRS2NZUDIvdjZYMitNQjhHQTFVZEl3UVlNQmFBRkFTcWVrZWo1SW12R3M4S1FLY1lQMi92NlgyK01BNEcKQTFVZER3RUIvd1FFQXdJQjVqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFlOEVZbEZPaUNmUCtKbWVhVU9UREJTOHJOWGlSVEh5bwpFUkY1VEVsWnJNajNoV1ZjUnJzN0VLQUNyODFQdGN3Mkt1eGQvdStna2NtMmsyOThnRlRzeHdod0RZNzdndXdxWUhocE5qYlJ4WnlMCmFiVkF5SlJsZC9KWElXWTd6b1ZBdGpOakdyOTVIdnhjSGRNZGt4dUxERjJGdlprd01oZ0prVkxwZktHNi8yU1NtdXorTmU2TUw2NzgKSUlic1N0NGJlREkzcG9IU25hOWFFaGJLbVZ2OGIyME94YUFlaHNtUjBGeVlnbDlqRElwYXE5aVZwc3pMaXRhL1pFdU95b3F5c09raApNcDZxcUlXWU5JRTVJVHVvT2xJeVBmWnJONFlHV2hXWTNQQVJadjQwSUxjRDlFRVFmVG1FZVpaeVk3YVdBdVZydWEwWlRidkdSTnMyCnl5cWNqZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhvbmdrb25nIFBvc3QgUm9vdCBDQSAxCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlETURDQ0FoaWdBd0lCQWdJQ0ErZ3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNTRXN4RmpBVUJnTlZCQW9UCkRVaHZibWRyYjI1bklGQnZjM1F4SURBZUJnTlZCQU1URjBodmJtZHJiMjVuSUZCdmMzUWdVbTl2ZENCRFFTQXhNQjRYRFRBek1EVXgKTlRBMU1UTXhORm9YRFRJek1EVXhOVEEwTlRJeU9Wb3dSekVMTUFrR0ExVUVCaE1DU0VzeEZqQVVCZ05WQkFvVERVaHZibWRyYjI1bgpJRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyYjI1bklGQnZjM1FnVW05dmRDQkRRU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBUThBTUlJQkNnS0NBUUVBclA4NHR1bG1Ba25qb3JUaGtQbEFqM241NHIxNS9nSzk3aVNTSFNMMjJvVnlhZjdYUHduVTNaRzEKQXB6UWpWcmhWY05RaHJrcEpzTGoyYUR4YVFNb0lJQkZJaTFXcHp0VWxWWWlXUjhvM3g4Z1BXMmlOcjRqb0xGdXRiRW5QemxUQ2VxcgphdWgwc3NKbFhJNi9mTU40aE0yZUZ2ejFMazhnS2dpZmQvUEZIc1NhVW1ZZVNGN2pFQWFQSXBqaFpZNGJYU05tTzdpbE1sSElocXFoCnFaNS9kcFRDcG15M1FmRFZ5QVk0NXRRTTR2TTdURzFRak1TREo4RVRoRms5bm5WMHR0Z0NYanFRZXNCQ05uTHNhazNjNzhRQTN4TVkKVjE4bWVNaldDbmwzdi9ldnQzYTVwUXVFRjEwUTZtL2hxNVVSWDIwOG8xeE5nMXZ5c3htS2dJc0xod0lEQVFBQm95WXdKREFTQmdOVgpIUk1CQWY4RUNEQUdBUUgvQWdFRE1BNEdBMVVkRHdFQi93UUVBd0lCeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQURrYlZQSzdpCmg5bGVnWXNDbUVFSWpFeTgydHZ1Snh1QzUycEY3QmFMVDRXZzg3Snd2VnFXdXNwdWJlNUdpMjduS2k2V3N4a3o2N1NmcUxJMzdwaW8KbDdZdXRtY24xS1pKL1J5VFpYYWVRaS9jSW15YVQvSmFGVG14Y2RjclVlaHRISmpBMlNyMG9ZSjcxY2xCb2lNQmREaFZpdys1TG1laQpJQVEzMnB3TDB4Y2g0SStYZVRSdmhFZ0NJRE1iNWpSRW41Rnc5SUJlaEVQQ0tkSnNFaFRrWVkyc0VKQ2VoRkM3OEpadlJaK0s4OHBzClQvb1JPaFVWUnNQTkg0TmJMVUVTN1ZCblFSTTlJYXVVaXFwT2ZNR3grNmZXdFNjdmw2dHU0QjNpMFJ3c0gwVGkvTDZSb1p6NzFpbFQKYzRhZlU5aEREbDNXWTRKeEhZQjB5dmJpQW12WldnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlU2lnbiBSb290Q0ExMQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEYlRDQ0FsV2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRR0V3SktVREVyTUNrR0ExVUVDaE1pClNtRndZVzRnUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5d2dTVzVqTGpFY01Cb0dBMVVFQXhNVFUyVmpkWEpsVTJsbmJpQlMKYjI5MFEwRXhNVEFlRncwd09UQTBNRGd3TkRVMk5EZGFGdzB5T1RBME1EZ3dORFUyTkRkYU1GZ3hDekFKQmdOVkJBWVRBa3BRTVNzdwpLUVlEVlFRS0V5SktZWEJoYmlCRFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpMQ0JKYm1NdU1Sd3dHZ1lEVlFRREV4TlRaV04xCmNtVlRhV2R1SUZKdmIzUkRRVEV4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEvWGVxcFJ5UUJUdkwKVEpzemkxb1VSYVRua0JiUjMxZlNJUkNrRi8zZnJOWWZwK1RiZlBmczM3Z0QycFJZL1YxeWZJdy9Yd0ZuZEJXVzR3SThoOXV1eXdHTwp3dk5teG9WRjlBTEdPclZpc3EvNm5MK2s1dFNBTUpqekRiYVRqNm5VMkRieXNQeUt5aXloRlRPVk1kckFHL0x1WXBtR1l6Ky8zWk1xCmc2aDJ1Uk1mdDg1T1FvV1BJdWN1R3ZLVkNiSUZ0VVJPZDZFZ3ZhbnlUZ3A5VUszMUJRMUZUMFp4L1NnK1Uvc0UyQzNYWlIxS0cvclAKTzdBeG1qVnV5SXNHMHdDUjhwUUlaVXl4TkFZQWVvbmk4TWNEV2MvVjF1aW5NclBtbUVDR3hjMG5Fb3ZNZTg2M0VUeGlZQWNqUGl0QQpicFNBQ1cyMnMyOTNielVJVVBzQ2g4VStpUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVy9oTlQ3S2xodFE2MHZGam1xQytDZlpYCnQ5NHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLQ2gKT0JabUxxZFdIeUdjQnZvZDdia2l4VGdtMkU1UDdLTi9lZDVHSWFHSGQ0OEhDSnF5cE1XdkR6S1lDM3htS2JhYmZTVlNTVU9yVEM0cgpibnB3cnhZTzR3SnMrMExtR0oxRjJGWEk2RHZkNStIMExnc2NORnhzV0VyN2pJaFFYNVVjdisycklyVmxzNFc2bmcrNHJlVjZHNHBRCk9oMjlEYng3VkZBTHVVS3ZWYUFZZ2ExbG1lKys1SnkveElXclFiSlViOXdsemUxNDRvNE1qUWxKM1dON1dtbVdBaUdvdlZKWjZYMDEKeThoU3luK0IvdGxyMC9jUjdTWGYrT2Y1cFBweWw0UlREYVhRTWhoUmRsa1ViQS9yN0YrQWpIVkRnOE9GbVA5TW5pME41SGVEazA2MQpsZ2VMS0JPYmpCbU5RU2RKUU83ZTVpTkVPZHloSXRhNkEvST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQUNFRElDT00gUm9vdAo9PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdFRDQ0E1MmdBd0lCQWdJSVlZM0hoanNCZ2dVd0RRWUpLb1pJaHZjTkFRRUZCUUF3UkRFV01CUUdBMVVFQXd3TlFVTkZSRWxEClQwMGdVbTl2ZERFTU1Bb0dBMVVFQ3d3RFVFdEpNUTh3RFFZRFZRUUtEQVpGUkVsRFQwMHhDekFKQmdOVkJBWVRBa1ZUTUI0WERUQTQKTURReE9ERTJNalF5TWxvWERUSTRNRFF4TXpFMk1qUXlNbG93UkRFV01CUUdBMVVFQXd3TlFVTkZSRWxEVDAwZ1VtOXZkREVNTUFvRwpBMVVFQ3d3RFVFdEpNUTh3RFFZRFZRUUtEQVpGUkVsRFQwMHhDekFKQmdOVkJBWVRBa1ZUTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGCkFBT0NBZzhBTUlJQ0NnS0NBZ0VBLzVLVjRXZ0dkclFzeUZoSXl2MkFWQ2xWWXlUL2tHV2JFSFY3dzJyYllnSUI4aGlHdFh4YU9MSGsKV0xuNzA5Z3RuNzB5Tjc4c0ZXMit0ZlFoMGhPUjJRZXRBUVhXODcxM3psOUNnUXI1YXVPREFLZ3JMbFVUWTRIS1J4eDdYQlpYZWh1RApZQVE2UG1YRHpRSGUzcVRXRExxTzN0a0U3aGRXSXB1UFkvMU5GZ3UzZTNlTStTVzEwVzJaRWk1UEdyam02Z1NTcmowUnVWRkNQWWV3Ck1ZV3ZlVnFjL3VkT1hwSlBRL3lyT3EybEVpWm11ZUlNMTVqTzFGaWxsVUFLdDBTZEUzUXJ3cVhySWhXWUVOaUx4UVNmSFk5ZzVRWWIKbTgrNWVhQTlvaU0vUWo5citod0RlekNOem16QXYrWWJYNzludUlRWjFSWHZlOHVRTmpGaXlid0NxMFpmbS80YWFKUTBQWkNPcmZiawpIUWwvU29nNFA3NW4vVFNXOVIyOE1IVExPTzdWYkt2VS9QUUF0d0JiaFRJV2RqUHAyS09ablFVQXFoYm04NEY5YjMycWhtMnRGWFRUCnhLSnhxdlFVZmVjeXVCKzgxZkZPdlc4WEFqblhEcFZDT3NjQVB1a21ZeEhxQzlGSy94aWRzdGQ3THpyWmx2dm9IcEt1RTFYSTJTZjIKM0VnYnNDVEJoZU4zblpxazh3d1JIUTNJdEJUdXRZSlhDYjhnV0g4dklpUFljTXQ1Yk1sTDhxa3F5UHlISzljYVVQZ242QzlENHpxOQoyRmR4L2M2bVVsdjUzVTN0NWZadmllMjdrNXgySVhYd2trd3A5eStjQVM3K1VFYWVaQXdVc3dkYnhjSnpiUEVIWEVVa0ZEV3VnL0ZxClRZbDYrclBZTFdid05vZjFLMU1DQXdFQUFhT0JxakNCcHpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZLYXoKNFNzclNiYlhjNkdxbFBVQjUzTmxUS3hRTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVcHJQaEt5dEp0dGR6b2FxVQo5UUhuYzJWTXJGQXdSQVlEVlIwZ0JEMHdPekE1QmdSVkhTQUFNREV3THdZSUt3WUJCUVVIQWdFV0kyaDBkSEE2THk5aFkyVmthV052CmJTNWxaR2xqYjIxbmNtOTFjQzVqYjIwdlpHOWpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUURPTEF0U1VXSW1mUXduZzQvRjl0cWcKYUh0UGtsN3FwSE15RVZORXNrVExuZXdQZVVLekVLYkhEWjNMdHZvL09uenF2NGhUR3p6M2d2b0ZOVFBoTmFoWHdPZjlqVTgva3pKUAplR1lEZHdkWTZaWElmajdRZVFDTThodFJNNXU4bE9rNmUyNVNMVEtlSTZSRis3WXVFN0NMR0xIZHp0VWRwMEovVmI3N1c3dEgxUHdrCnpRU3VsZ1VWMXF6T01QUEtDOFc2NGlMZ3BxMGk1QUx1ZEJGL1RQOTRIVFhhNWdJMDZ4Z1NZWGNHQ1JaajZoaXRvb2NmOHNlQUNRbDEKVGhDb2p6Mkd1SFVSd0NSaWlwWjdTa1hwN0ZuRnZtdUQ1dUhvckxVd0h2NEZCNEQ1NFNNTlVJOEZtUDhzWCtnN3RxM1BnYlVoaDhvSQpLaU1uTUNBcnorMlVXNnl5ZXRMSEtLR0tDNXROU2l4dGhUOEpjanhuNHRuY0I3cnJaWHRhQVdQV2tGdFBGMlk5ZndzWm81TmpFRklxCm54UVdXT0xjcGZTaEZvc09rWXVCeXB0Wit0aHJrUWRsVlY5U0g2ODYrNURkYWFWYm5HME9MTGI2enF5bGZESktaMERjTURRajNkY0UKSTJidy9GV0FwL3RtR1lJMVoySndPVjV2eCtxUVFFUUlIcml5MXR2dVdhY05HSGswdkZRWVhsUEtORkh0UlFybWpzZUNOajZuT0dPcApNQ3dYRUdDU24xV0hFbGtRd2c5bmFSSE1UaDUrU3BxdHIwQ29kYXhXa0hTNG9KeWxlVy9jNlJySWFRWHB1dm9EczN6azRFN0N6cDNvCnRrWU5ibjVYT21lVXdzc2ZuSGRLWjA1cGhrT1RPUHUyMjArRGtkUmdma3MrS3pnSFZaaGVwQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClZlcmlzaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1BEQ0NBYVVDRUR5Uk1jc2Y5dEFiRHBxNDBFUy9FcjR3RFFZSktvWklodmNOQVFFRkJRQXdYekVMTUFrR0ExVUVCaE1DVlZNeApGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1CklFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUazJNREV5T1RBd01EQXdNRm9YRFRJNE1EZ3dNakl6TlRrMU9Wb3cKWHpFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UY3dOUVlEVlFRTEV5NURiR0Z6Y3lBegpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBCkE0R05BRENCaVFLQmdRREpYRm1lOGh1S0FSUzBFTjhFUU52alY2OXFSVUNQaEF3TDBUUFoyUkhQN2dKWUh5WDNLcWhFQmFyc0F4OTQKZjU2VHVab0FxaU45MXF5Rm9tTkZ4M0luelBSTXhuVngwam52VDBMd2RkOEtrTWFPSUcrWUQvaXNJMTl3S1Rha3lZYm5zWm9neTFPbApoZWM5dm4yYS9pUkZNOXgyRmUwUG9uRmtUR1V1Z1doRnB3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUJCeVVxa0ZGQmt5CkNFSHd4V3NLekg0UElSbk41R2ZjWDZrYjVzcm9jNTBpMkpodWN3TmhrY1Y4c0VWQWJrU2RqYkN4bG5SaExRMnBSZEtra2lyV21uV1gKYmo5VC9VV1pZQjJvSzB6NVhxY0oySFV3MTlKbFlEMW4xa2hWZFdrL2tmVklDMGRwSW1tQ2xyN0p5RGlHU25vc2N4bElhVTVyZkdXLwpEL3h3em9pUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpNaWNyb3NlYyBlLVN6aWdubyBSb290IENBIDIwMDkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQ2pDQ0F2S2dBd0lCQWdJSkFNSitRd1JPUno4Wk1BMEdDU3FHU0liM0RRRUJDd1VBTUlHQ01Rc3dDUVlEVlFRR0V3SklWVEVSCk1BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDBaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnYKYzJWaklHVXRVM3BwWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwR0NTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1bwpkVEFlRncwd09UQTJNVFl4TVRNd01UaGFGdzB5T1RFeU16QXhNVE13TVRoYU1JR0NNUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEdBMVVFCkJ3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXQKVTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW9kVENDQVNJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT240ai9OanJkcUcyS2ZnUXZ2UGtkNm1KdmlacFdOd3JadXV5ak5BCmZXMldicUVPUk83aEU1MlVRbEthdlhXRmRDeW9EaDJUdGhpM2pDeW96L3RjY2JuYTdQN29mby9rTHgyeXFIV0gyTGVoNVR2UG1VcEcKMElNWmZjQ2hFaHlWYlVyMDJNZWxUVE11aFRsQWRYNFVmSUFTbUZESFFXZTRvSUJoVktac1RoL2duUTRINmNtNk0rZit3RlVvTEFLQQpweG4xbnR4VlV3T1hld2RJLzVuN040b2t4Rm5NVUJCampxcXBHckNFR29iNVg3dXhVRzZrMFFyTTFYRitINmNiZlBWVGJpSmZ5eXZtCjFIeGRydGJDeGt6bEJRSFo3VmY4d1NONS9QcklKSU9WODdWcVVRSFFkOWJwRXFINUdvUDdnaHU1c0pmMGRnWXpRMG1nL3d1MStyVUMKQXdFQUFhT0JnREIrTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlRMRDhiZgpRa1BNUGN1MVNDT2hHbnFtS3JzMGFEQWZCZ05WSFNNRUdEQVdnQlRMRDhiZlFrUE1QY3UxU0NPaEducW1LcnMwYURBYkJnTlZIUkVFCkZEQVNnUkJwYm1adlFHVXRjM3BwWjI1dkxtaDFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUURKMFE1ZUx0WE1zM3creS93OS93MG8KbFpNRXlML2F6WG00UTVEd3BMN3Y4dThobUx6VTFGMEc5dTVDN0RCc29LcXB5dkd2aXZvL0MzTnFQdW91UUg0ZnJsUmhlZXN1Q0RmWApJL09Nbjc0ZHNlR2tkZHVnNGxRVXNib2NLYVFZOWhLNm9oUVU0ekUxeUVEL3QrQUZkbGZCSEZueStML2s3U1ZpWElUd2ZuNGZzNzc1CnR5RVJ6QU1CVm5DbkVKSWVHelNCSHEyY0dzTUVQTzBDWWRZZUJ2TmZPb2Z5Sy9GRmgrVTlyTkhIVjRTOWE2N2MyUG0yRzJKd0N6MDIKeVVMeU10ZDZZZWJTMnozUHlLbkptOXpiV0VUWGJ6aXZmM2pUbzYwYWRib2N3VFo4ang1dEhNTjFScTQxQmFiMlhEMGg3bGJ3eVlJaQpMWHBVcTNERGZTSmxnbkNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkUtR3V2ZW4gS29rIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0akNDQXA2Z0F3SUJBZ0lRUkptTlBNQURKNzJjZHBXNTZ0dXN0VEFOQmdrcWhraUc5dzBCQVFVRkFEQjFNUXN3Q1FZRFZRUUcKRXdKVVVqRW9NQ1lHQTFVRUNoTWZSV3hsYTNSeWIyNXBheUJDYVd4bmFTQkhkWFpsYm14cFoya2dRUzVUTGpFOE1Eb0dBMVVFQXhNegpaUzFIZFhabGJpQkxiMnNnUld4bGEzUnliMjVwYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaFoyeGhlV2xqYVhOcE1CNFhEVEEzCk1ERXdOREV4TXpJME9Gb1hEVEUzTURFd05ERXhNekkwT0Zvd2RURUxNQWtHQTFVRUJoTUNWRkl4S0RBbUJnTlZCQW9USDBWc1pXdDAKY205dWFXc2dRbWxzWjJrZ1IzVjJaVzVzYVdkcElFRXVVeTR4UERBNkJnTlZCQU1UTTJVdFIzVjJaVzRnUzI5cklFVnNaV3QwY205dQphV3NnVTJWeWRHbG1hV3RoSUVocGVtMWxkQ0JUWVdkc1lYbHBZMmx6YVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQU1NU0lKNndYZ0JsalU1R3U0QmM2U3dHbDlYemNzbHd1ZWRMWllEQlM3NStQTmRVTVpUZTFSSzZVeFlDNmxoajcxdlkKOCswcUdxcHhTS1BjRUMxZlgrdGNTNXlXQ0VJbEtCSE1pbHBpQVZEVjZ3bFRML2pEai82ei9QMmRvdU5mZmI3dEMrQmc2Mm5zTSszWQpqZnNTU1lNQXlZdVhqRHR6S2pLekV2ZTVUZkwwVFczSDV0WW1Od2p5MmYxclhLUGxTRnhZdkVLK0ExcUJ1aHcxREFEVDlTTitjVEFJCkpqamNKUkZITGZPNkl4Q2x2N3dDOTBOZXgvNndOMUNaZXcrVHp1WkRMTU4rRGZJY1EyWmd5MkV4UjRlalQ2NjlWbXhNdkx6NEJjcGsKOU9rMG9TeTFjK0hDUHVqSXlUUWxDRnp6N2FiSGxKK3RpRU1sMStFNVlQNnNPVmtDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkovdVJMT1UxZnFSVHk3WlZab0VWdHN0eE51bE1BMEdDU3FHClNJYjNEUUVCQlFVQUE0SUJBUUIvWDdsVFcyTTlkVExuK3NSMEdzdEczMFpwSEZMUHFrL0NhT3YvZ0tsUjZEMWlkNGs5Q25VNThXNWQKRjRkdmFBWEJsR3paWGQvYXNsbkxwUkNLeXN3NXpaL3JUdDVTL3d6dzlKS3A4bXhUcTV2U1I2QWZkUGVibXZFdkZaOTZaREFZQnp3cQpEMmZLL0ErSllaMWxwVHpsdkJOYkNOdmovKzI3QnJ0cUJyRjZUMlhHZ3YwZW5JdTFEZTVJdTdpOXFnaTArNk44eTUvTmtIWmNocFo0ClZ3cG0rVmdhbmYyWEtXRGVFYWFRSEJrYzdnR1dJalEwTHBINXQ4UW4wWHZtdi91QVJGb1c1ZXZnMUFvNHZPU1I0OVhyWE1HczN4dHEKZko3bGRkSzJsNGZiekljclF6cUVDSytyUE52M1BHWXhockNkVTNudCtDUGVRdU10Z3ZFUDVmcVgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEdBMVVFQ3hNWFIyeHYKWW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpNeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzYjJKaApiRk5wWjI0d0hoY05NRGt3TXpFNE1UQXdNREF3V2hjTk1qa3dNekU0TVRBd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG4KYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXdsZHBCNUJuZ2lGdlhBZzdhRXlpaWUvUVYyRWNXdAppSEw4UmdKRHg3S0tuUVJmSk1zdVMrRmdna2JoVXFzTWdVZHdiTjFrMGV2MUxLTVBnajBNSzY2WDE3WVVoaEI1dXpzVGdIZU1DT0ZKCjBtcGlMeDllK3BabzM0a25sVGlmQnRjK3ljc21XUTF6M3JESTZTWU9neFhHNzF1TDBnUmd5a21tS1BacE8vYkx5Q2lSNVoyS1lWYzMKckhRVTNIVGdPdTV5THk2Yys5Qzd2L1U5QU9FR00raUNLNjVUcGpvV2M0emRRUTRnT3NDMHA2SHBzaytRTGpKZzZWZkx1UVNTYUdqbApPQ1pnZGJLZmQvK1JGTyt1SUVuOHJVQVZTTkVDTVdFWlhyaVg3NjEzdDJTYWVyOWZ3UlB2bTJMN0RXemdWR2tXcVFQYWJ1bURrM0YyCnhtbUZnaGNDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUUKRkkvd1MzK29Ma1VrcmsxUSttT2FpOTdpM1J1OE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxRTnZBVUtyK3lBenY5NVpVUlVtNwpsZ0FKUWF5ekU0YUdLQWN6eW12bWRMbTZBQzJ1cEFyVDlmSHhENHEvYzJkS2c4ZEVlM2pncjI1c2J3TXBqak01UmNPTzVMbFhiS3I4CkVwYnNVOFl0NUNSc3VaUmorOXhUYUdkV1BvTzR6elVodzhsby9zN2F3bE9xekpDSzZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUUKYmRkVEtKZCs4MmNFSGhYWGlwYTAwOTVNSjZSTUczTnpkdlFYbWNJZmVnN2pMUWl0Q2h3cy96eXJWUTRQa1g0MjY4TlhTYjdoTGkxOApZSXZEUVZFVEk1M085ekpybEFHb21lY3NNeDg2T3lYU2hrRE9PeXlHZU1saEx4UzY3dHRWYjkrRTdnVUpUYjBvMkhMTzAySlFaUjdyCmtwZURNZG16dGNwSFdEOWYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlENFRDQ0FzbWdBd0lCQWdJT1l5VUFBUUFDRkkwekZRTGtiUFF3RFFZSktvWklodmNOQVFFRkJRQXdlekVMTUFrR0ExVUVCaE1DClJFVXhIREFhQmdOVkJBb1RFMVJESUZSeWRYTjBRMlZ1ZEdWeUlFZHRZa2d4SkRBaUJnTlZCQXNURzFSRElGUnlkWE4wUTJWdWRHVnkKSUZWdWFYWmxjbk5oYkNCRFFURW9NQ1lHQTFVRUF4TWZWRU1nVkhKMWMzUkRaVzUwWlhJZ1ZXNXBkbVZ5YzJGc0lFTkJJRWxKU1RBZQpGdzB3T1RBNU1Ea3dPREUxTWpkYUZ3MHlPVEV5TXpFeU16VTVOVGxhTUhzeEN6QUpCZ05WQkFZVEFrUkZNUnd3R2dZRFZRUUtFeE5VClF5QlVjblZ6ZEVObGJuUmxjaUJIYldKSU1TUXdJZ1lEVlFRTEV4dFVReUJVY25WemRFTmxiblJsY2lCVmJtbDJaWEp6WVd3Z1EwRXgKS0RBbUJnTlZCQU1USDFSRElGUnlkWE4wUTJWdWRHVnlJRlZ1YVhabGNuTmhiQ0JEUVNCSlNVa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREMycHhpc0xseEVyQUx5QnBYc3E2REZKbXpORXVia0tMRjUrY3ZBcUJOTGFUNmhkcWJKWVV0ClFDZ2diZXJndmJGSWd5SXBSSjlPZys0MVVSTnpkTlc4OGpCbWxGUEFRRFl2RElSbHpnOXV3bGlUNkN3TE91bkJqdnZ5YThvODRweE8KanVUNWZkTW5ueHZWWjNpSExYOExSN1BINk1sSWZLOHZ6QXJaUWUrZi9wcmhzcTc1VTdYbDZVYWZZT1BmamROLys1WitzN1Z5K0V1dApDSG5OYVlsQUovVXF3YTFEN0tSVHlHRzI5OUo1S21jWWRraHRXeVVCMFNiRnQxZHBJeFZiWVlxdDhCc3QyYTljOFNhUWFhblZERUQxCk00QkRqNXlqZGlwRnRLKy9mejZIUDNiRnpTcmVJTVVXV012NUcvVVB5dzBSVW1TNDBuWmlkNFB4V0ovL0FnTUJBQUdqWXpCaE1COEcKQTFVZEl3UVlNQmFBRkZibjRWc2xRNERnOW96aGNieU81WUF2eEVqaU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFILwpCQVFEQWdFR01CMEdBMVVkRGdRV0JCUlc1K0ZiSlVPQTRQYU00WEc4anVXQUw4Ukk0akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCmc4ZXY2bjlOQ2p3NXNXaStlMjJKTHVtekNlY1lWNDJGbWhmemRrSlFFdy9Ia0c4enJjVkpZQ3RzU1ZnWjFPSyt0NytyU2J5VXlLdSsKS0d3V2FPRElsMFlnb0dobllJZzVJRkhZYUFFUnpxZjJFUWYyN095c0doK3labTVXWjJCNmRGN0FiWmMycnJVTlhXWnp3Q1V5UmRoSwpCZ2VQeExjSHNVMEdEZUdsNi9SMXlycWMwTDJ6MHpJa1RPNSs0bllFUzBsVDJQTHBWRFA4NVhFZlBSUmNsa3Z4T3ZJQXUyeTArcFpWCkNJZ0p3Y3lSR1Ntd0lDMy95emlrUU9FWHZubGhnUDhIQTRaTVRuc0dueEdHalludUo4VGI0cndaamd2RHd4UEhMUU5qTzlQbzVLSXEKd29JSWxCWlU4TzhmSjVBbHVBME9LQnRIZDBlOUhLZ2w4WlMwWmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHRkRDQ0EveWdBd0lCQWdJSVUrdzc3dnV5U0Y4d0RRWUpLb1pJaHZjTkFRRUZCUUF3VVRFTE1Ba0dBMVVFQmhNQ1JWTXhRakJBCkJnTlZCQU1NT1VGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1SUVacGNtMWhjSEp2Wm1WemFXOXVZV3dnUTBsR0lFRTIKTWpZek5EQTJPREFlRncwd09UQTFNakF3T0RNNE1UVmFGdzB6TURFeU16RXdPRE00TVRWYU1GRXhDekFKQmdOVkJBWVRBa1ZUTVVJdwpRQVlEVlFRREREbEJkWFJ2Y21sa1lXUWdaR1VnUTJWeWRHbG1hV05oWTJsdmJpQkdhWEp0WVhCeWIyWmxjMmx2Ym1Gc0lFTkpSaUJCCk5qSTJNelF3Tmpnd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURLbG11TzZ2ajc4YUkxNEg5TTJ1REQKVXRkOXRoRElBbDZ6UXlyRVQycXl5aHhkS0pwNEVScHBXVmV2dFNCQzVJc1A1dDlicGdPU0wvVVI1R0xYTW5FNDJRUU1jYXM5VVg0UApCOTlqQlZ6cHY1UnZ3U21Dd0xUYVViREJQTHV0TjBwY3l2RkxOZzRrcTcvRGhIZjlxRkQwc2VmR0w5SXRXWTE2Q2s2V2FWSUNxamFZCjdQejZGSU1NTngvSmtqZC8xNEV0NWNTNTRENDAvbWYwUG1iUjAvUkF6MTVpTkE5d0JqNGdHRnJPOTNJYkpXeVRkQlNUbzNPeERxcUgKRUNOWlh5QUZHVWZ0YUk2U0VzcGQvTllyc3BJOElNL2hYNjhndnFCMmYzYmw3QnFHWVRNKzUzdTBQNkFQanFLNWFtKzVoeVp2UVd5SQpwbEQ5YW1NTDlaTVdHeG1Qc3UyYm04bVE5UUVNM3hrOUR6NDRJOGt2and6UkF2NGJWZFpPMEkwOHIwK2s4LzZ2S3RNRm5Ya0lvY3RYCk1iU2N5SkN5Wi9RWUZwTTYvRWZZMFhpV01SKzZLd3hmWFptdFk0bGFKQ0IyMk4vOXEwNm1JcXFkWHVZbmluMW9LYVBuaXJqYUVic1gKTFptZEV5Ukc5OFhpMkorT2Y4ZVBkRzFhc3VoeTlhenVKQkN0THhUYS95MmFSbkZIdmtMZnV3SGI5SC9US0k4eFdWdlR5UUttdEZMSwpicGY3UThVSUptK0s5THY5bnlpcURkVkY4eE02SGRqQWVJOUJaendlbEdTdWV3dkY2TmtCaURrYWw0WmtRZFU3aHd4dStnL0d2VWdVCnZ6bE4xSjVCdG8rV0hXT1drOW1WQm5neGFKNDNCanVBaVVWaE9TUEhHMFNqRmVVYytKSXd1d0lEQVFBQm80SHZNSUhzTUJJR0ExVWQKRXdFQi93UUlNQVlCQWY4Q0FRRXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUmx6ZXVyTlI0QVBuN1ZkTUFjdEhOSApEaHBrTHpDQnBnWURWUjBnQklHZU1JR2JNSUdZQmdSVkhTQUFNSUdQTUM4R0NDc0dBUVVGQndJQkZpTm9kSFJ3T2k4dmQzZDNMbVpwCmNtMWhjSEp2Wm1WemFXOXVZV3d1WTI5dEwyTndjekJjQmdnckJnRUZCUWNDQWpCUUhrNEFVQUJoQUhNQVpRQnZBQ0FBWkFCbEFDQUEKYkFCaEFDQUFRZ0J2QUc0QVlRQnVBRzhBZGdCaEFDQUFOQUEzQUNBQVFnQmhBSElBWXdCbEFHd0Fid0J1QUdFQUlBQXdBRGdBTUFBeApBRGN3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUJkOW9QbTAzY1hGNjYxTEpMV2hBcXZkcFloS3NnOVZTeXRYakR2bE1kMyt4REx4CjUxdGtsall5R095bE1uZlg0MFMyd0JFcWdMazlhbTU4bTlPdC9NUFdvK1prS1h6UjRUZ2VnaXYvSjJXdit4WVZ4QzV4aE9XMS8vcWsKUjcxa01ydjJKWVNpSjBMMUlMRENFeEFSelJBVnVrS1FLdEpFNFpZbTZ6RklFdjBxMnNrR3ozUWVxVXZWaHlqNWVUU1NQaTVFNlBhUApUNDgxUHlXek9keGpLcEJySUYvRVVoSk9seXdxckoyWDNranlvMmJid3RLRGxhWm1wNTRsRCtrTE01RmxDbHJEMlZRUzNhL0RUZzRmCkpsNE4zTE9ON05XQmNON1NUeVFGODJ4TzlVeEpabzNSLzlJTEpVRkkvbEdFeGtLdmdBVFAwSDVrU2VUeTM2THNzVXpBS2gzbnRMRmwKb3NTODhaajBxbkFIWTdTNDJqdE0ra0FpTUZzUnB2QUZEc1lDQTBpcmhwdUYzZHZkNnFKMmdITjk5WndFeEVXTjU3a2NpNTdxMTNYUgpjckhlZFVUblFuM2lWMnQ5M0ptOFBZTW82b0NUamNWTVpjRndnYmc0L0VNeHN2WURORWV5clBzaUJzc2UzUmRISEY5bXVkTWFvdG9SCnNhUzhJOG5rdm9mL3VaUzIrRjBnU3RSZjU3MW9lMlh5RlI3U09xa3Q2ZGhySkt5WFdFUkhyVmtZOFNGbGNON09OR0NvUVBIelBLVEQKS0NPTS9pY3pRMENnRnp6cjZqdXdjcWFqdVVwTFhoWkk5TEs4eUl5U3haMmZySEkydkRTQU5HdXBpNUxBdUJmdDdIWlQ5U1FCakxNaQo2RXQ4VmNhZCtxTVV1MldGYm01UEVuNEtQSjJWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkl6ZW5wZS5jb20KPT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjhUQ0NBOW1nQXdJQkFnSVFBTEMzV2haSVg3L2h5L1dMMXhubWZUQU5CZ2txaGtpRzl3MEJBUXNGQURBNE1Rc3dDUVlEVlFRRwpFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdVFTNHhFekFSQmdOVkJBTU1Da2w2Wlc1d1pTNWpiMjB3SGhjTk1EY3hNakV6Ck1UTXdPREk0V2hjTk16Y3hNakV6TURneU56STFXakE0TVFzd0NRWURWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXUKUVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1amIyMHdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFESgowM3JLRHg2c3A0Ym9GbVZxc2NJYlJUSnhsZG4rRUZ2TXIrZWxlUUdQaWNQSzhsVng5M2UrZDVUemNxUXNSTmlla3BzVU9xSG5KSkFLCkNsYU94ZGdtbE9IWlNPRXRQdG9LY3Qyam1SWGFnYUtIOUh0dUpuZUpXSzNXNnd5eVFYcHpibTNiZW5oQjZRaUlFbjZITG1ZUlkyeFUKK3p5ZGNzQzhMdi9DdDkwTmR1TTYxL2UwYUw2aTllT0Jic0ZHYjEyTjRFM0dWRldKR2pNeENyRlh1YU9LbU1Qc096VEZsVUZwZm5YQwpQQ0RGWWJwUlI2QWdrSk9oa0V2elRueUZSVlNhMFFVbVFiQzFUUjB6dnNRRHlDVjh3WERiTy9RSkxWUW5TS3d2NGNTc1Bzakxra3hUCk9UY2o3Tk1CK2VBSlJFMU5aTURoRFZxSElyeXRHNlArSnJVVjg2ZjhoQm5wN0tHSXRFUnBoSVB6aWRGMEJxbk1DOWJDM2llRlVDYksKRjdqSmVvZFdMQm9CSG15K0U2MFFyTFVrOVRpUm9kWkwydkc3MHQ1SHRmRzhnZlpaYTg4WlUrbU5GY3RLeTZsdlJPVWJRYy9oaHFmSwowR3FmdkV5TkJqTmFvb1hsa0RXZ1lsd1dUdkRqb3ZvREdyUXNjYk5ZTE41N0M5c2FEK3ZlSVI4R2R3WURzTW52bWZ6QXVVOExoaWorCjBybnE0OXFsdzBkcEV1RGI4UFlaaSsxN2NOY0MxdTJIR0Nnc0JDUk1kK1JJaWhyR081clVEOHI2ZGRJQlFGcU5lYitMejB2UHFoYkIKbGVTdFRJbytGNUhVc1dMbGd1V0FCS1FEZm8yLzJuK2lENWRQRE5NTis5ZlI1WEorSE1oMy8xdWFEN2V1QlVibDhhZ1c3RWVrRndJRApBUUFCbzRIMk1JSHpNSUd3QmdOVkhSRUVnYWd3Z2FXQkQybHVabTlBYVhwbGJuQmxMbU52YmFTQmtUQ0JqakZITUVVR0ExVUVDZ3crClNWcEZUbEJGSUZNdVFTNGdMU0JEU1VZZ1FUQXhNek0zTWpZd0xWSk5aWEpqTGxacGRHOXlhV0V0UjJGemRHVnBlaUJVTVRBMU5TQkcKTmpJZ1V6Z3hRekJCQmdOVkJBa01Pa0YyWkdFZ1pHVnNJRTFsWkdsMFpYSnlZVzVsYnlCRmRHOXlZbWxrWldFZ01UUWdMU0F3TVRBeApNQ0JXYVhSdmNtbGhMVWRoYzNSbGFYb3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPCkJCWUVGQjBjWlE2bzhpVjd0SkhQNUxHeDVyMVZkR3dGTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCNHBnd1dTcDlNaURyQXl3NmwKRm4yZnVVaGZHSThOWWpiMnpSbHJyS3ZWOXBGOXJuSHpQN01PZUlXYmxhUW5JVWRDU254SU92VkZmTE1NamxGNHJKVVQzc2I5ZmJnYQprRXlya2dQSDdVSUJ6Zy9Zc2ZxaWt1RmdiYTU2YXdtcXhpbnVhRWxuTUlBa2VqRVdPVnQrOFJ3dTNXd0pyZkl4d1lKT3VidjV2cjhxCmhUL0FRS002V2Z4WlN6d29KTnUwRlhXdURZaTZMblBBdlZpSDVVTHk2MTd1SGpBaW1jczMwY1FoYklIc3ZtMG01aHprUWlDZVI3Q3MKZzFsd0xEWFdyelkwdE0wNytES283K040aWZ1TlJTemFuTGgrUUJ4aDV6NmlraXhMOHMzNm1MWXAvL1B5ZTZrZkxxQ1RWeXZlaFFQNQphVGZMbm5ocUJiVEZNWGlKN0hxbmhlRzVlenpldmg1NWhNNmZjQTVad2pVdWtDb3gyZVJGZWtHa0xoT2JOQTVtZTBtclpKZlFSc041Cm5YSlFZNmFZV3dhOVNHM1lPWU53NkRYd0JkR3F2T1BieUFMcWZQMkMyc0piVWpXdW1EcXR1aldUSTZjZlNOMDFScGl5RUdqa3BUSEMKQ2xndUdZRVF5VkIxL09wYUZzNFIxKzd2VUlndFlmOC9Rbk1GbEVQVmpqeE9BVG9acFI5R1RuZlFYZVdCSWlHSC9wUjloTmlUcmRabwpRMGl5Mit0ekpPZVJmMVNrdG9BK25hTThUSExDVjhTZzFNdzRKODdWQnA2aVNObnBuODZDY0RhVG1qdmZsaUhqV2JjTTJwRTM4UDFaCldyT1p5R2xzUXlZQk5XTmdWWWtET25YWXVrclpWUC91M29EWUxkRTQxVjR0QzVoOVBtemIvQ2FJeHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFR6Q0NCVGVnQXdJQkFnSUpBS1BhUW42a3NhN2FNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3VNUXN3Q1FZRFZRUUdFd0pGVlRGRApNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwSUhkM2R5NWpZVzFsY21acGNtMWhMbU52CmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzNNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXUKUVM0eEtUQW5CZ05WQkFNVElFTm9ZVzFpWlhKeklHOW1JRU52YlcxbGNtTmxJRkp2YjNRZ0xTQXlNREE0TUI0WERUQTRNRGd3TVRFeQpNamsxTUZvWERUTTRNRGN6TVRFeU1qazFNRm93Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOWVdSeWFXUWdLSE5sClpTQmpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXRMMkZrWkhKbGMzTXBNUkl3RUFZRFZRUUYKRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeVptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbApjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0SURJd01EZ3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDCkFRQ3ZBTXR3Tnl1QVdrbzZiSGlVZmFOL0doLzJOZFc5MjhzTlJISStKcktRVXJwak95aFliNld6YlpTbTg5MWtERlgyOXVmeUlpS0EKWHVGaXhyWXA0WUZzOHIvbGZUSnFWS0F5R1ZuK0g0dlhQV0NHaFNSdjR4R3pkejRnbGpVaGE3TUkyWEF1WlBlRWtsUFdEckNRaW9yagpoNDBHMDcyUUR1S1pvUnVHRHRxYUNyc0xZVkFHVXZHZWYzYnN5dy9RSGczUG1UQTlITVJGRUZpczF0UG8xK1hxeFFFSGQ5WlI1Z04vCmlraWxUV2gxdWVtOG5rNFpjZlV5UzV4dFlCa0wrOHlkZGR5L0pzMlBrM2c1ZVhOZUpRN0tYT3QzRWdmTFpFRkhjcE9yVU1QckNYWmsKTk5JNXQzWVJDUTEyUmNTcHJqMXFyN1Y5WlMrVVdCRHNYSHl2ZnVLMkdOblFtMDVhU2QrcFpndk1QTVo0ZktlY0hlUE9qbE8rQmQ1ZwpEMnZsR3RzLzQrRWh5U25COGVzSG5GSWJBVVJSUEhzbDE4VGxVbFJkSlFmS0ZpQzRyZVJCN25vSS9wbHZnNmFSQXJCc05sVnE1MzMxCmx1YktnZGFYOFpTRDZlMndzV3NTYVI2cysxMnB4WmpwdEZ0WWVyNDlva1E2WTFuVUN5WGVHMCs5NVFHZXpkSXAxWjhYR1FwdnZ3eVEKMHdsZjJlT0tOY3g1V2swWk41SzN4TUd0ci9SNUpKcXlBUXV4cjF5Vzg0QXkrMXc5bVBHZ1AwcmV2cStVTHRsVm1oZHVZSjFqYkxoagp5YTZCWEJnMTRKQzd2anhQTnlLNWZ1dlBubmNocGowNGdmdEkyakU5SytPSjlkQzF2WDdnVU1RU2liTWptaEF4aGR1dWIrODRNeGgyCkVRSURBUUFCbzRJQmJEQ0NBV2d3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCRERBZEJnTlZIUTRFRmdRVStTU3NEN0sxK0huQSttQ0kKRzhUWlRRS2VGeGt3Z2VNR0ExVWRJd1NCMnpDQjJJQVUrU1NzRDdLMStIbkErbUNJRzhUWlRRS2VGeG1oZ2JTa2diRXdnYTR4Q3pBSgpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOWVdSeWFXUWdLSE5sWlNCamRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oCmJXVnlabWx5YldFdVkyOXRMMkZrWkhKbGMzTXBNUkl3RUFZRFZRUUZFd2xCT0RJM05ETXlPRGN4R3pBWkJnTlZCQW9URWtGRElFTmgKYldWeVptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXRJREl3TURpQwpDUUNqMmtKK3BMR3UyakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVkhTQUFNQ293S0FZSUt3WUJCUVVICkFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUpBU3J5STEKd3FNNThDN2U2YlhwZUh4SXZqOTlSWkplNmRxeEdmd1dQSiswVzJhZWF1ZkR1VjJJNkErdHp5TVAzaVU2WHN4UHBjRzFMYXdrMGxnSAozcUxQYVlSZ00rZ1FEUk9wSTlDRjVZNTdwcDQ5Y2hOeU0vV3FmY1pqSHdqMC9nRi9KTThyTEZRSjN1SXJiWkxHT1U4VzZqeCtla2JVClJXcEdxT3QxZ2xhbnE2QjhhQk16OXAwdzhHOG5PU1FqS3BEOWtDazE4cFBmTktYRzkvanZqQTlpU255dTAvVlUrSTIybWxhSEZvSTYKTTZ0YUlnajNncnJxTHVCSG1yUzFSYU1GTzluY0xrVkFPK3JjZitnNzY5SHNKdGcxcERERk9xeFhuck4ycFNCNytSNUtCV0lCcGloMQpZSmVTRFc0K1RUZEREWklWbkJnaXpWR1pvQ2thUEYrS01qTmJNTWVKTDBlWUQ2TUR4dmJ4ck44eThObUJHdVNjdmZhQUZQRFJMTG1GCjlkaWpzY2lsSWVVY0U1ZnVEcjNmS2Fudk5GTmIwK1JxRTRRR3RqSUN4Rkt1SXRMY3NpRkNHdHBBOENuSjdBb01YT0xRdXN4STB6Y0sKekJJS2lubXdQUU4vYVV2ME5DQjlzelRxamt0azlUNzlzeU5uRlEwRXVQQXR3UWxSUExKc0ZmQ2xJOWVEZE9UbExzbittQ2RDeHF2RwpuckRRV3ppbG0xRGVmaGlZdFVVNzlubTA2UGNhZXdhRCs5Q0wycnZIdlJpckNHODhnR3RBUHhrWnVtV0s1cjdWWE5NMjErOUFVaVJnCk9HY0VNZXlQODRMRzNybFY4enN4a1ZyY3RRZ1ZyWFlsQ2cxN0xvZmlES1lHdkNZUWJUZWQ3TjE0akh5QXhmRFpkMGpRCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhTVENDQlRHZ0F3SUJBZ0lKQU1uTjArblZmU1BPTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdzTVFzd0NRWURWUVFHRXdKRlZURkQKTUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMElIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdgpiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KUVRneU56UXpNamczTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11ClFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkRhR0Z0WW1WeWMybG5iaUJTYjI5MElDMGdNakF3T0RBZUZ3MHdPREE0TURFeE1qTXgKTkRCYUZ3MHpPREEzTXpFeE1qTXhOREJhTUlHc01Rc3dDUVlEVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZwpZM1Z5Y21WdWRDQmhaR1J5WlhOeklHRjBJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBR0ExVUVCUk1KClFUZ3lOelF6TWpnM01Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsQmdOVkJBTVRIa2RzYjJKaGJDQkQKYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1EZgpWdFBrT3B0MlJiUVQyLy9CdGhtTE4wRVlsVkpINnhlZEtZaU9OV3dHTWk1SFl2TkpCTDk5UkRheGNjeTlXZ2x6MWRtRlJQK1JWeVhmClhqYU9jTkZjY1VNZDJkcnZYTkw3RzcwNnRjdXRvOHhFcHcydUlSVS91WHBia25YWXBCSTRpUm1LdDREUzRqSnZWcHlSMW9nUUM3TjAKWkpKMFlQUDJ6eGhQWUxJajBNYzd6bUZMbVkvQ0ROQkFzcGpjRGFoT283a0tybUNnclVWU1k3cG12V2pnK2I0YXFJRzdIa0Y0ZGRQQgovZ0JWc0lkVTZDZVFOUjFNTTYyWC9KY3VtSVMvTE1tanY5R1lFUlR0WS9qS21JaFlGNW50UlFPWGZqeUdIb2lNdnZLUmhJOWxOTmdBClRIMjNNUmRhS1hvS0dDUXdvemUxZXFrQmZTYlcrUTZPV2ZIOUd6TzFLVHNYTzBHMklkM1V3RDJsbjU4ZlExREp1N3hzZXBlWTdzMk0KSC91Y1VhNkxjTDBubjNIQWE2eDlrR2JvMTEwNkRiRFZ3bzNWeUoyZHdXM1EwTDlSNU9QNHd6ZzJydGFuZGVhdmhFTmRrNUlNYWdmZQpPeDJZSXRhc3dUWGJvNkFsLzNLMWRoM2ViZWtzWml4U2hOQkZrczRjNWVVekhkd0hVMVNqcW9JN21qY3YzTjJnWk9ubTNiMnUvR1NGCkhUeW55UWJlaFA5cjZHc2FQTVdpczBMN2l3aytYd2hTeDJMRTFBVnh2OFJrNVBpaGcrZytFcHVvSHRRMlRTOXg5bzBvOW9PcEU5SmgKd1pHN1NNQTBqMEdNUzB6YmFSTC9VSlNjSUlOWmMrMThvZkx4L2QzM1NkTkRXS0JXWThvOVBlVTFWbG5wRHNvZ3pDdExreWtQQWdNQgpBQUdqZ2dGcU1JSUJaakFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VNTUIwR0ExVWREZ1FXQkJTNUNjcWNIdHZUYkRwcnJ1MVU4VnVUCkJqVXVYakNCNFFZRFZSMGpCSUhaTUlIV2dCUzVDY3FjSHR2VGJEcHJydTFVOFZ1VEJqVXVYcUdCc3FTQnJ6Q0JyREVMTUFrR0ExVUUKQmhNQ1JWVXhRekJCQmdOVkJBY1RPazFoWkhKcFpDQW9jMlZsSUdOMWNuSmxiblFnWVdSa2NtVnpjeUJoZENCM2QzY3VZMkZ0WlhKbQphWEp0WVM1amIyMHZZV1JrY21WemN5a3hFakFRQmdOVkJBVVRDVUU0TWpjME16STROekViTUJrR0ExVUVDaE1TUVVNZ1EyRnRaWEptCmFYSnRZU0JUTGtFdU1TY3dKUVlEVlFRREV4NUhiRzlpWVd3Z1EyaGhiV0psY25OcFoyNGdVbTl2ZENBdElESXdNRGlDQ1FESnpkUHAKMVgwanpqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWSFNBQU1Db3dLQVlJS3dZQkJRVUhBZ0VXSEdoMApkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBSUNJZjNEZWtpalpCWlJHCi81QlhxZkV2M3hvTmEvcDhEaHhKSkhrbjJFYXFieWxaVW9od0V1cmRQZldiVTFSdjRXQ2lxQW01N090WmZNWTE4ZHdZNmZGbjVhKzYKUmVBSjNzcEVEOElYRG5lUlJYb3pYMStXTEdpTHdVZVBtSnM5d096TDlkV0Nrb1ExMGI0Mk9GWnlNVnRITGFvWHBHTlI2d29CclgvcwpkWjdMb1IveGZ4S3h1ZVJrZjJmV0l5cjB1RGxkbU9naHArRzlQVUlhZEpwd3IyaHNVRjFKei8vN0RsM21MRWZYZ1RwWkFMVnphMk1nCjlqRkZDRGtPOUhCK1FIQmFQOUJyUXFsMFBTZ3ZBbTExY3BVSmpVaGp4c1lqVjVLVFhqWEJqZmtLOXl5ZFloejJyWHpkcGpFZXRySEgKZm9VbStxUnF0ZHBqTU5Idmt6ZXlaaTk5QmZmbnQwdVlsRFhBMlRvcHdaMnlVRE1kU3FsYXBza0Q3KzMwNTZodWlyUlhoT3VrUDlEdQpxcXFIVzJQb2srSnJxTlM0Y25ockcrMDU1RjNMbTZxSDFVOU9BUDdaYXA4OE1ROG9BZ0Y5bU9pbnNLSmtubm40U1BJVnFjem15RVRyClAzaVo4bnR4UGp6eG1LZkZHQkkvNXJzb00wTHBSUXA4YmZLR2VTL0ZnaGw5Q1lsOHNsUjJpSzdld2ZQTTRXN2JNZGFUcnBtZzd5VnEKYzVpSld6b3VFNGdldjhDU2xEUWI0eWUzaXg1dlF2L242VGViVUIwdG92a0M3c3RZV0RweHZHampxc0d2SENnZm90d2paVCtCNnE2WgowOWd3enhNTlR4WEpoTHluU0MzNE1DTjMyRVpMZVczMmpPMDZmMkFSZVBUcG02N1ZWTUIwZ05FTFFwL0IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmd6RUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUCkIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhHakFZQmdOVkJBb1RFVWR2UkdGa1pIa3VZMjl0TENCSmJtTXUKTVRFd0x3WURWUVFERXloSGJ5QkVZV1JrZVNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNQpNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWU14Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2CmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVJvd0dBWURWUVFLRXhGSGIwUmhaR1I1TG1OdmJTd2dTVzVqTGpFeE1DOEcKQTFVRUF4TW9SMjhnUkdGa1pIa2dVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUw5eFlnangrbGswOXh2SkdLUDNnRWxZNlNLREU2YkZJRU1CTzRUeDVvVkpueWZxCjlvUWJUcUMwMjNDWXh6SUJzUVUrQjA3dTlQcFBMMWt3SXVlckdWWnI0b0FIL1BNV2RZQTVVWHZsK1RXMmRFNnBqWUlUNUxZL3FRT0QKK3FLK2loVnFmOTRMdzdZWkZBWEs2c09vQkpRN1Jud3lEZk1BWmlMSWpXbHROb3dSR0xmVHNoeGd0RGo2QW96TzA5MUdCOTRLUHV0ZApmTWg4KzdBclU2U1NZbWxSSlFWaEdrU0JqQ3lwUTVZajM2dzZnWm9PS2NVY3FlbGRIcmFlbmpBS09jN3hpSUQ3UzEzTU11eUZZa01sCk5BSldKd0dSdER0d0tqOXVzZWljaUFGOW45VDUyMU50WUoyL0xPZFlxN2hmUnZ6T3hCc0RQQW5yU1RGY2FVYXo0RWNDQXdFQUFhTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkRxYWhRY1FaeWkyNy9hOQpCVUZ1SU1HVTJnL2VNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNaMjExNTFmbVhXV2NEWWZGK093WXhkUzJoSUk1UFpZZTA5NmFjCnZOanBMOURiV3U3UGRJeHp0RGhDMmdWNytBSjF1UDJsc2RldTl0ZmVFOHRURUg2S1J0R1grcmN1S3hHcmtMQW5nUG5vbjFycE41K3IKNU45c3M0VVhuVDNaSkU5NWtUWFdYd1RyZ0lPcm1nSXR0UkQwMkpESEJITkE3WElsb0ttZjdKNnJhQktaVjhhUEVqb0pwTDFFL1FZVgpOOEdiNURLajdUam8yR1R6TEg0VS9BTHFuODMvQjJnWDJ5S1FPQzE2amRGVThXbmpYelBLZWoxN0N1UEtmMTg1NWVKMXVzVjJHRFBPCkxQQXZUSzMzc2VmT1Q2akVtMHBVQnNWL2ZkVUlEK0ljL240WHVLeGU5dFFXc2tNSkRFMzJwMnUwbVlSbHlucUk0dUpFdmx6MzZoejEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCanpFTE1Ba0dBMVVFQmhNQ1ZWTXhFREFPQmdOVkJBZ1QKQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVEhGTjBZWEptYVdWc1pDQlVaV05vYm05cwpiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQU1US1ZOMFlYSm1hV1ZzWkNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwCmVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1SQXcKRGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZwpWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNVEl3TUFZRFZRUURFeWxUZEdGeVptbGxiR1FnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCCmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMM3R3UVA4OW8vOEFyRnYKVzU5STJaMTU0cUszQTJGV0dNTkh0dGZLUFRVdWlVUDNvV21iM29vYS9STWduTFJKZHpJcFZ2MjU3SXpkSXZweTNDZGhsKzcyV29UcwpiaG01aVN6Y2hGdlZkUHRyWDhXSnBSQlNpVVpWOUxoMUhPWi81RlN1Uy9oVmNsY0NHZmdYY1ZuckhpZ0hkTVdkU0w1c3RQU2tzUE5rCk4zbVN3T3hHWG4vaGJWTk1ZcS9OSHd0anV6cWQrL3g1QUpoaGRNOG1na0JqODdKeWFoa05tY3JVRG5YTU4vdUxpY0ZaOFdKL1g3TmYKWlRENHA3ZE5kbG9lZGw0MHdPaVdWcG1Lcy9CL3BNMjkzREl4ZkpIUDRGOFIrR3VxU1Z6Um1aVFJvdU5qV3dsMnRWWmk0VXQwSFpiVQpKdFFJQkZuUW1BNE81dDc4dyt3ZmtQRUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdIUVlEVlIwT0JCWUVGSHdNTWgrbjJUQi94SDFvbzJLb29jNnJCMXNuTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBUldmb2wKVHdOdmxKazdtaCtDaFRuVWRnV1VYdUVvazIxaVhRbkNvS2pVc0hVNDhUUnFuZVNmaW9ZbVVlWXMwY1l0YnBVZ1NwSUI3TGlLWjNzeAo0bWN1akpVREppNURuVW94OWc2MURMdTM0amQvSXJvQW93NTdVdnRydXp2RTAzbFJUczJROUdjSEdjZzhSbm9OQVgzRldPZHQ1b1V3CkY1b2t4QkRnQlBmZzhuL1VxZ3IvUWgwMzdaVGxaRmtTSUhjNDB6SStPSUYxbG5QNmFJK3h5ODRmeGV6Nm5IN1Bmckh4QnkyMi9ML0sKcEwvUWx3Vkt2T29ZS0FLUXZWUjRDU0Z4MDlGOUhka1dzS2xoUGRBS0FDTDh4M3ZMQ1dSRkN6dEFnZmQ5ZkRMMW1NcFlqbjBxN3BCWgpjMlQ1Tm5SZUphSDFaZ1V1ZnprVnFTcjdVSXVPaFduMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDd6Q0NBdGVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVApCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzCmIyZHBaWE1zSUVsdVl5NHhPekE1QmdOVkJBTVRNbE4wWVhKbWFXVnNaQ0JUWlhKMmFXTmxjeUJTYjI5MElFTmxjblJwWm1sallYUmwKSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2daZ3hDekFKQmdOVgpCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUCmRHRnlabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1Uc3dPUVlEVlFRREV6SlRkR0Z5Wm1sbGJHUWdVMlZ5ZG1salpYTWcKVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQwpBUW9DZ2dFQkFOVU1Pc1FxK1U3aTliNFpsMStPaUZPeEh6L0x6NThnRTIwcE9zZ1BmVHozYTNZNFk5azJZS2liWGx3QWdMSXZXWC8yCmgva2xRNGJuYVJ0U21wRGhjZVBZTFExT2IvYklTZG0yOHhwV3JpdTJkQlRyei9zbTR4cTZIWll1YWp0WWxJbEhWdjhsb0pOd1U0UGEKaEhRVXcyZWVCR2c2MzQ1QVdoMUtUczlEa1R2blZ0WUFjTXRTN250OXJqcm52REg1UmZiQ1lNOFRXUUlyZ013MFI5KzUzcEJsYlFMUApMSkdtcHVmZWhSaEpmR1pPb3pwdHFiWHVOQzY2RFFPNE05OUg2N0ZyalNYWm04NkIwVVZHTXBad2g5NENEa2xEaGJac2M3dGs2bUZCCnJNblVWTitITDhjaXNpYk1uMWxVYUovOHZpb3Z4RlVjZFVCZ0Y0VUNWVG1MZndVQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKeGZBTitxQWRjd0t6aUlvcmh0U3B6eUVaR0RNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElCQVFCTE5xYUVkMm5kT3htZlp5TUlidzVoeWYyRTNGL1lOb0hOMkJ0QkxaOWczY2NhYU5uUmJvYmhpQ1BQCkU5NUR6K0kwc3dTZEh5blZ2L2hleU5YQnZlNlNiekowOHBHQ0w3MkNRbnF0S3JjZ2ZVMjhlbFVTd2hYcXZmZHFsUzVzZEovUEhMVHkKeFFHamhkQnlQcTF6cXd1YmRReHRSYmVPbEt5V043V2cwSThWUnc3ajZJUGRqLzN2UVFGM3pDZXBZb1V6OGpjSTczSFBkd2JleUJrZAppRURQZlVZZC94N0g0YzcvSTl2RytvMVZUcWtDNTBjUlJqNzAvYjE3S1NhN3FXRmlOeWkyTFNyMkVJWmt5WENuMHEyM0tYQjU2anphCll5V2YvV2kzTU94dyszV0t0MjFnWjdJZXlMbnAyS2h2QW90bkRVMG1WM0hhSVB6QlNsQ05zU2k2Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IENvbW1lcmNpYWwKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlkM2NHSnlhcHNYd3dEUVlKS29aSWh2Y05BUUVMQlFBd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01CNFhEVEV3Ck1ERXlPVEUwTURZd05sb1hEVE13TVRJek1URTBNRFl3Tmxvd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHkKYlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTlodFBad2Nyb1JYMUJpTExId0d5NDNORkJrUkpMTHRKSlJUV3pzTzNxeXhQeGtFeWxGZjZFcWRiCkR1S1BIeDZHR2FlcXRTMjVYdzJLd3ErRk5Ya3lMYnNjWWpmeXNWdEtQY3JOY1YvcFFyNlU2TWplK1NKSVpNYmxxOFlyYmEwRjhQclYKQzgrYTVmQlFwSXM3UjZValczcDYrRE0vdU8rWmwrTWd3ZFlvaWMrVSs3bEY3ZU5BRnhIVWRQQUxNZUlySm1xYlRGZXVyQ0ErdWtWNgpCZk85bTJrVnJuMU9JR1BFTlhZNkJ3TEpOLzNIUis3bzhYWWRjeFh5bDZTMXlIcDUyVUtxSzM5Yy9zNG1UNk5tZ1RXdlJMcFVIaHd3Ck1tV2Q1anlUWGxCT2V1TTYxRzdNR3Z2NTBqZXVKQ3FyVndNaUtBMUpkWCszS05wMXY0N2ozQTU1TVFJREFRQUJvMEl3UURBZEJnTlYKSFE0RUZnUVVuWlBHVTR0ZXlxOC9ueDRQNVptVnZDVDJsSTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUZpczlBUU96Y0FOL3dyOTFMb1dYeW05ZTJpWldFblN0QjAzVFg4bmZVWUdYVVBHCmhpNCtjN0ltZlUrVHFiYkVLcHFySVpjVXNkNk0wNnVKRmRockpOVHhGcTdZcEZ6VWYxR083UmdCc1pOanZiejRZWUNhbnJIT1FuRGkKcVgwR0pYMG5vZjV2N0xNZUpOcmpTMVVhQURzMXREdloxMTB3L1lFVGlmTENCaXZ0WjhTT3lVT3lYR3NWaVFLOFl2eE84clV6cXJKdgowd3FpVU9QMk8rZ3VSTUxiWmppcE0xWkk4VzBiTTQwTmpEOWdONTNUeW0xK05INE5uM0oyaXh1ZmN2MVNOVUZGQXBZdkhMS2FjMGtoCnNVbEhSVWUwNzJvMEVjbE5tc3hadDlZQ25scE9aYldVcmh2ZktiQVc4YjhBbmdjNkYyUzFCTFVqSVprS2xUdVhmTzg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IE5ldHdvcmtpbmcKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlmRThFT1J6VW1TMHdEUVlKS29aSWh2Y05BUUVGQlFBd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1CNFhEVEV3Ck1ERXlPVEUwTURneU5Gb1hEVE13TVRJek1URTBNRGd5TkZvd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHkKYlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXRJVE1NeGN1YTVSc2EyRlNvT3VqejNtVVRPV1VnSm5MVldSRVpZOW5aT0lHNDF3M1NmWXZtNFNFCkhpM3lZSjB3VHN5RWhlSXN6eDZlL2phck0zYzFSTmcxbGhvOU51aDZEdGpWUjZGcWFZdlovTHM2cm5sYTFmVFdjYnVha0NOcm1yZUkKZEljTUhsKzVuaTM2cTFNcjNMdDJQcE5NQ0FpTUhxSWpITlJxclNLNm1RRXViV1hMdmlSbVZTUkxRRVN4RzlmaHdvWEEzaEEvUGUyNAovUEh4STFQY3YyV1hiOW41UUhHTmZiMlYxTTYrb0Y0bkk5NzlwdEFtRGdBcDZ6eEc4RDFndno5UTB0d21RVkdlRkRkQ0JLTndWNmdiCmgrMHQrbnZ1akFyanFXYUpHY3RCK2QxRU5tSFA0bmRHeUgzMjlKS0JOdjNiTlBGeWZ2TU1GcjIwRlFJREFRQUJvMEl3UURBZEJnTlYKSFE0RUZnUVVCeC9TNTV6YXdtNmlRTFN3ZWxBUVVIVEV5TDB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUlsWHNoWjZxTUw5MXRtYm16VENuTFF5RkUybnBOL3N2cWUrK0VQYmtUZk90REl1ClVGVWFOVTUyUTNFZzc1TjNUaFZ3TG9mRHdSMXQzTXUxSjlRc1Z0RlNVenBFMG5QSXhCc0ZaVnBpa3B6dVFZMHgyK2MwNmxraDFRRjYKMTJTNFpEbk55ZTJ2N1VzRFNLZWdtUUdBM0dXak5xNWxXVWhQZ2t2SVpmRlhIZVZaTGdvL2JOalI5ZVVKdEd4VUFBcmdGVTJIZFcyMwpXSlphM1czU0FLRDBtMGkrd3pla3VqYmdmSWVGbHhvVm90NHVvbHU5cnhqNWtGRE5jRm40SjJkSHk4ZWdCenA5MFN4ZGJCazZaclY5Ci9aRnZnckcrQ0pQYkZFZnhvamZIUlo0OHgzZXZaS2lUMy9acGc0Smc4a2xDTk8xYUFGU0ZIQlkya2d4YytxYXR2OXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IFByZW1pdW0KPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJqQ0NBeTZnQXdJQkFnSUliWXdVUnJHbUN1NHdEUVlKS29aSWh2Y05BUUVNQlFBd1FURUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0TUI0WERURXdNREV5Ck9URTBNVEF6TmxvWERUUXdNVEl6TVRFME1UQXpObG93UVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnkKZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QQpNSUlDQ2dLQ0FnRUF4QkxmcVYvK1FkM2Q5WitLNC9hczRUeDRtcnpZOEg5Nm9ETXEzSTBnVzY0dGIrZVQyVFp3YW1qUGpsR2poVnRuCkJLQVFKRzlkS0lMQmwxZllTQ2tUdHVHK2tVM2ZoUXhUR0pvZUpLSlBqL0NpaFF2TDlDbC8wcVJZN2laTnlhcW9lNXJaK2pqZVJGY1YKNWZpTXlObEk0ZzBXSngwZXlJT0ZKYmU2cWxWQnpBTWlTeTJSall2bWlhOW14K24vSytrOHJOclNzOFBoYUp5SitIb0FWdDcwVlpWcworN3BrM1dLTDN3dDNNdXRpekNhYW03dXFZb05NdEFaNk1NZ3B2KzBHVFplNUhNUXhLOVZmdkZNU0Y1eVpWeWxtZDJFaE1RY3VKVW1kCkdQTHU4eXR4akxXNk9RZEpkL3p2THBLUUJZMHRMM2Q3NzBPL05idWEyUGx6cHl6eTBGZnVLRTRtWDQrUWFBa3Z1UGpjQnVrdW1qNVIKcDlFaXhBcW5PRWhzcy9uL2ZhdUdWK082MW9WNGQ3cEQ2a2gvOXRpK0kyMGV2OUUyYkZoYzhlNmtHVlFhOVFQU2R1YmhqTDA4czlOSQpTK0xJK0grU3FIWkduRUpsUHFRZXdRY0RXa1l0dUpmenQ5V3lWU0h2dXR4TUFKZjdGSlVuTTcvb1EwZEcwZ2laRm1BN21uN1M1dTA0CjZ1d0JIanhJVmtrSngwdzNBSjZJRHNCejRXOW02WEpITUQ0UTVRc0R5WnBDQUd6RmxINWh4SXJmZjRJYUMxbkVXVEozczd4Z2FWWTUKL2JRR2V5eldaRGJadlVqdGhCOStwU0tQS3JoQzlJSzMxRk9RZUU0dEd2MkJiMFRYT3dGMGxrTGdBT0l1YStyRjduS3N1Ny8rNnFxbworTnoyc25tS3RtY0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGSjNBWjZZTUl0a205VVdycG1WU0VTZllSYXhqTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkRBVUFBNElDQVFDelYwMFFZazQ2NUt6cXVCeXYKTWlQSXMwbGFVWngyS0kxNXFsZEdGOVgxVXZhM1JPZ0lSTDhZaE5JTGdNM0ZFdjBBVlFWaGgwSGN0U1NlUE1UWXlQdHduaTk0bG9NZwpOdDU4RDJrVGlLVjFOcGdJcHNiZnJNN2pXTmEzUHQ2NjgrczBRTmlpZ2ZWNFB5L1ZwZnpab3RSZUJBNFhyZjVCOE9XeWN2cEVnak5DCjZDMVk5MWFNWWorNlFyQ2NERngrTG1VbVhGTlBBTEo0ZnFFTm1TMk51QjJPb3NTdy9XRFFNS1NPeUFSaXFjVHROZDU2bCswT09GNlMKTDVOd3BhbWNiNmQ5RXgxK3hnaElzVjVuNjFFSUplbm1KV3RTS1pHYzBqbHpDRmZlbVFhMFc1MFFCdUhDQUtpNEhFb0NDaFRRd1VISworNHcxSVgyQ09QS3BWSkVaTlpPVWJXbzZ4YkxRdTRtR2sraWJ5UTg2cDNxNG9mQjRSdnI4TnkvbGlvVHozLzRFMmFGb29DOGs0Z21WCkJ0V1Z5dUVrbHV0ODlwTUZ1KzF6NlMzUmRUblg1eVRiMkU1ZlE0K2UwQlE1djFWd1NKbFhNYlNjN2txWUE1WXdIMkFHN2hzai9vRmcKSXhwSFlvV2x6QmswZ0crenJCcmpuL0I3U0szVkFkbG50cWx5aytvdFpyV3l1T1E5UExMdlRJenE2d2UvcXpXYVZZYThHS2ExcUY2MApnMnhyYVVEVG45enh3MmxydWVGdENmVHhxbEIyQ25wOWVoZWhWWlpDbVRFSjNXQVJqUVV3ZnVhT1J0R2RGTnJIRitRRmxvekVKTFViCnp4UUhza0Q0bzU1Qmhyd0UwR3VXeUNxQU5QMi83d2FqM1ZqRmhUMCtqLzZlS2VDMnVBbG9HUndZUXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQi9qQ0NBWVdnQXdJQkFnSUlkSmNsaXNjL2VsUXdDZ1lJS29aSXpqMEVBd013UlRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVgpCQW9NQzBGbVptbHliVlJ5ZFhOME1TQXdIZ1lEVlFRRERCZEJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRJRVZEUXpBZUZ3MHhNREF4Ck1qa3hOREl3TWpSYUZ3MDBNREV5TXpFeE5ESXdNalJhTUVVeEN6QUpCZ05WQkFZVEFsVlRNUlF3RWdZRFZRUUtEQXRCWm1acGNtMVUKY25WemRERWdNQjRHQTFVRUF3d1hRV1ptYVhKdFZISjFjM1FnVUhKbGJXbDFiU0JGUTBNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQQpJZ05pQUFRTk1GNGJGWjBEMEtGNU5iYzZQSko2eWhVY3pXTHpuQ1pjQnozbFZQcWoxc3dTNnZRVVgraU9HYXN2TGtqbXJCaERlS3pRCk44TzlzczBzNWtmaUd1Wmp1RDB1TDNqRVQ5djBENlJvVEZWeWE1VWRUaGhDbFhqTU56eVI0cHRsS3ltalFqQkFNQjBHQTFVZERnUVcKQkJTYXJ5bDZ3QkUxTlNaUk1BRERhdjVBMWE3V1BEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBSwpCZ2dxaGtqT1BRUURBd05uQURCa0FqQVhDZk9IaUZCYXI4akFRcjlIWC9Wc2FvYmd4Q2QwNURoVDF3Vi9HelRqeGkrenlnazhONTNYCjU3aEc4ZjJoNG5FQ01FSlpoMFBVVWQrNjB3a3lXczZJZmxjOW5GOUNhL1VITGJYd2dwUDVXVyt1WlBwWTVZc2U0Mk8rdFlITmJ3S00KZVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1ekNDQXFPZ0F3SUJBZ0lEQkVUQU1BMEdDU3FHU0liM0RRRUJCUVVBTUg0eEN6QUpCZ05WQkFZVEFsQk1NU0l3SUFZRFZRUUsKRXhsVmJtbDZaWFJ2SUZSbFkyaHViMnh2WjJsbGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt4SWpBZ0JnTlZCQU1UR1VObGNuUjFiU0JVY25WemRHVmtJRTVsZEhkdmNtc2dRMEV3SGhjTk1EZ3hNREl5Ck1USXdOek0zV2hjTk1qa3hNak14TVRJd056TTNXakIrTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVpWVzVwZW1WMGJ5QlUKWldOb2JtOXNiMmRwWlhNZ1V5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpNU0l3SUFZRFZRUURFeGxEWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzYjNKcklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUE0L3Q5bzNLNnd2REpGSWYxYXdGTzRXNUFCN3B0SjExLzkxc3RzMXJIVVYrcnBES21ZWWUyYmcrRzBqQUMKbC9qWGFWZWhHRGxkYW1SNXhnRlpyRHd4U2poODBnVFNTeWpvSUY4N0I2TE1UWFBiODY1UHgxYlZXcWVXaWZyenEyalVJNFpaSjg4SgpKN3lzYm5LREhEQnkzK0NpNmRMaGRIVVp2U3FlZXhWVUJCdlhRem10VlNqRjRocTc5TURrcmpoSk04eDJoWjg1UmRLa252SVNqRkg0CmZPUXRmL1dzWCtzV243RXQwYnJNa1VKM1RDWEprRGh2Mi9ETSs0NGVsMWsrMVdCTzVnVW83VWw1RTB1NlNOc3YrWExUT2NyK0g5ZzAKY3ZXMFFNOHhBY1BzM2hFdEYxMGZ1RkRSWGhtbmFkNEhNeWpLVUpYNXAxVExWSVpRUmFuNVNRSURBUUFCbzBJd1FEQVBCZ05WSFJNQgpBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlFJZHMzTEIvOGs5c1hON2J1UXZPS0VOMFoxOXpBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLYW9yU0xPQVQybW8vOWkwRWlkaTE1eXNIaEU0OXdjcnduOUkwajZ2U3JFdVZVRXRSQ2oKalNmZUM0SmowTzdlRERkNVFWc2lzckNhUVZ5bWNPRFUwSGZMSTlNQTRHeFdMK0ZwRFEzWnFyOGhnVkRaQnFXby81VTMwS3IrNHJQMQptUzFGaElybFFnblhkQUl2OTRuWW1lbThKOVJIamJvTlJoeDN6eFNrSExta01jU2NLSFFETlA4ekdTYWw2UTEwdHo2WHhuYm9KNWFqClp0M2hydkpCVzhxWVZvTnpjT1NHR3RJeFFib3Z2aTBUV25adlR1aE9nUTQvV3dNaW9CSytabGdSU3NzRHhMUXFLaTJXRitBNVZMeEkKMDNZbm5ab3RCcWJKN0RuU3E5dWZtZ3NuQWpVcHNVQ1Y1L25vbkZXSUdVYld0elQxZnM0NW10azQ4VkgzVHl3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0aW5vbWlzIC0gQXV0b3JpdMODwqkgUmFjaW5lCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGbkRDQ0E0U2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SkdVakVUTUJFR0ExVUVDaE1LClEyVnlkR2x1YjIxcGN6RVhNQlVHQTFVRUN4TU9NREF3TWlBME16TTVPVGc1TURNeEpqQWtCZ05WQkFNTUhVTmxjblJwYm05dGFYTWcKTFNCQmRYUnZjbWwwdzZrZ1VtRmphVzVsTUI0WERUQTRNRGt4TnpBNE1qZzFPVm9YRFRJNE1Ea3hOekE0TWpnMU9Wb3dZekVMTUFrRwpBMVVFQmhNQ1JsSXhFekFSQmdOVkJBb1RDa05sY25ScGJtOXRhWE14RnpBVkJnTlZCQXNURGpBd01ESWdORE16T1RrNE9UQXpNU1l3CkpBWURWUVFEREIxRFpYSjBhVzV2YldseklDMGdRWFYwYjNKcGRNT3BJRkpoWTJsdVpUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dJUEFEQ0NBZ29DZ2dJQkFKMkZuNGJUNDYvSHNtdHVNK0NldDBJMFZaMzVnYjVqMkNOMkRwZFV6WmxNR3ZFNXg0allGMUFNbm1IYQp3RTVWM3VkYXVIcE9kNGNONWJqcitwNWVleDdFenloMHg1UDFGTVlpS0FUNWtjT3JKM05xRGk1Tjh5NG9IM0RmVlM5TzdjZHhid2x5Ckx1M1ZNcGZROFZoMzBXQzhUbDdibW9UMlIyRkZLL1pRcG45cWNTZEloRFdlclA1cHFaNTZYalVsK3JTblNUVjNscWMyVytITjN5TncKMkYxTXBRaUQ4YVlrT0JPbzdDK29vV2ZIcGkyR1IrNksvT3liRG5UMEswa0NlNUIxalB5Wk9RRTUxa3FKNVo1MnF6NldLRGdtaTkyTgpqTUQyQVI1dnBURVNPSDJWd25IdTdYU3U1RGFpUTNYVjhRQ2I0dVRYekVJRFMzaDY1WDI3dUs0dUlKUFQ1R0hmY2VGMlo1Yy90dDlxCmMxcGtJdVZDMjgrQkE1UFk5T01RNEhMMkFIQ3M4TUY2RHdWL3p6UnBSYldUNUJuYlVoWWpCWWtPalVqa0pXK3plTDlpOVFmNmxTVEMKbHJMb295UENYUVA4dzlQbGZNbDFJOWYwOWJ6ZTVOL05nTCtSaUgybkU3UTV1aXk2dmRGcnpQT2xLTzFFbm4xU28yK1dMaGwrSFBOYgp4eGFPdTJCOWQyWkhWSUlBRVdCc01zR29PQnZyYnBnVDF1NDQ5ZkNmRHUvK01ZSEIwaVNWTDFONmFhTHdENFpGamxpQ0swd2kxRjZnCjUzMG1KMGpmSlVhTlNpaDhocDc1bXhwWnVXVy9CZDIyUWwwOTVnQklnbDRnOXhHQzNzclluK1kzUnlZZTYzajNZY05CWkZnQ1FmbmEKNE5INCtlajlVamkyOVluZkFnTUJBQUdqV3pCWk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwRwpBMVVkRGdRV0JCUU5qTFpoMmtTNDBSUjl3NzU5WGtqd3pzcHFzREFYQmdOVkhTQUVFREFPTUF3R0NpcUJlZ0ZXQWdJQUFRRXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0lCQUNRK1lBWitIZTg2UHR2cXJ4eWFMQUVMOU1XMTJVa3g5RjFCallrTVR2OXNvdjMvNGdiSU9aL3gKV3FuZElsZ1ZxSXJUc2VZeUNZSURiTmMvQ01mNHVib0FiYm5XL0ZJeVhhUi9wREdVdTdaTU9IOG9NRFgvbnlOVHQ3YnVGSEFBUUN2YQpSNnMwZmw2blZqQmhLNHREclAyMmlDajFhN1krWUVxNlFwQTBaNDNxNjE5RlZEc1hySXZreG1VUDd0Q01YV1k1empLbjJCQ1h3SDQwCm5KK1U4L2FHSDg4YmM2MlVlWWRvY01NenBYRG4yTlU0bEc5amVldS9DZzRJNThVdkQwS2dLeFJBL3lIZ0JjVW40WVFSRTdyV2hoMUIKQ3hNamlkUEpDK2lLdW5xam8zTTNOWUI5RXJnemQwQTR3UHBlTU5MeXRxT3gxcUtWbDRHYlV1MXBUUCtBNUZQYlZGc0RiVlJmc2JqdgpKTDF2bnhIRHgyVENEeWhpaFdaZUdudXl0Kyt1TmNrWk02aTRKOXN6VmI5bzRYVklSRmI3emROSXUwZUpPcXhwOVlERzVFUlFMMVRFCnFrUEZNVEZZdlpiRjZuVnNtbld4VGZqM2wvK1dGdktYVGVqMjh4SDVPbjJLT0c0RXkrSFRSUldxcGRFZG5WMWo2Q1RtTmhUaWg2MGIKV2ZWRW0vdlhkM3dmQVhCaW9TQWFvc1VhS1BRaEErNHUyY0dBNnJuWmd0WmJkc0xMTzdYU0FQQ2pEdUd0YmtEMzI2QzAwRWF1RmRkRQp3azAxK2RJTDhoZjJyR2JWSkxKUDBSeVp3RzcxZmV0MEJMajVUWGNKMTdUUEJ6QUo4YmdBVnRrWEZoWUtLNGJmandFWkd1VzdnbVAvCnZndDJGbDQzTitiWWRKZWltVVY1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClJvb3QgQ0EgR2VuZXJhbGl0YXQgVmFsZW5jaWFuYQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdpekNDQlhPZ0F3SUJBZ0lFTzBYbGFEQU5CZ2txaGtpRzl3MEJBUVVGQURCb01Rc3dDUVlEVlFRR0V3SkZVekVmTUIwR0ExVUUKQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUVDeE1HVUV0SlIxWkJNU2N3SlFZRFZRUURFeDVTYjI5MApJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtRXdIaGNOTURFd056QTJNVFl5TWpRM1doY05NakV3TnpBeE1UVXlNalEzCldqQm9NUXN3Q1FZRFZRUUdFd0pGVXpFZk1CMEdBMVVFQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUUKQ3hNR1VFdEpSMVpCTVNjd0pRWURWUVFERXg1U2IyOTBJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtRXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREdLcXRYRVRjdklvcktBM1FkeXUwdG9ndThNMUpBSmtlK1dtbW1PM0kyCkYwem8zN2k3TDNiaFFFWjBaUUtRVWdpMC82aU13ZURIaVZZUU9UUHZhTFJmWDlwdEk2R0pYaUtqU2did0ovQlh1ZmpwVGpKM0NqOUIKWlBQclplNTIvbFNxZlIwZ3J2UFhkTUlLWC9VSUtGSUl6RlZkMGcvYm1vR2x1Nkd6d1pUTlZPQXlkVEdSR21LeTNuWGl6MCtKMlpHUQpEMEVidEZwS2Q3MW5nK0NUNTE2bkRPZUIwL1JTckZPeUE4ZEVKdnQ1NWNzMFlGQVFleHZiYTlkSHExOThhTXB1blVFREVPNXJtWHRlCkphakNxK1RBODF5YzQ3N09NVXhrSGw2QW92V0RmZ3pXeW94VmpyN2d2a2tIRDZNa1FYcFlIWVRxV0JMSTRiZnQ3NVBlbEFneEFnTUIKQUFHamdnTTdNSUlETnpBeUJnZ3JCZ0VGQlFjQkFRUW1NQ1F3SWdZSUt3WUJCUVVITUFHR0ZtaDBkSEE2THk5dlkzTndMbkJyYVM1bgpkbUV1WlhNd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQ0NBalFHQTFVZElBU0NBaXN3Z2dJbk1JSUNJd1lLS3dZQkJBRy9WUUlCCkFEQ0NBaE13Z2dIb0JnZ3JCZ0VGQlFjQ0FqQ0NBZG9lZ2dIV0FFRUFkUUIwQUc4QWNnQnBBR1FBWVFCa0FDQUFaQUJsQUNBQVF3QmwKQUhJQWRBQnBBR1lBYVFCakFHRUFZd0JwQVBNQWJnQWdBRklBWVFEdEFIb0FJQUJrQUdVQUlBQnNBR0VBSUFCSEFHVUFiZ0JsQUhJQQpZUUJzQUdrQWRBQmhBSFFBSUFCV0FHRUFiQUJsQUc0QVl3QnBBR0VBYmdCaEFDNEFEUUFLQUV3QVlRQWdBRVFBWlFCakFHd0FZUUJ5CkFHRUFZd0JwQVBNQWJnQWdBR1FBWlFBZ0FGQUFjZ0RoQUdNQWRBQnBBR01BWVFCekFDQUFaQUJsQUNBQVF3QmxBSElBZEFCcEFHWUEKYVFCakFHRUFZd0JwQVBNQWJnQWdBSEVBZFFCbEFDQUFjZ0JwQUdjQVpRQWdBR1VBYkFBZ0FHWUFkUUJ1QUdNQWFRQnZBRzRBWVFCdApBR2tBWlFCdUFIUUFid0FnQUdRQVpRQWdBR3dBWVFBZ0FIQUFjZ0JsQUhNQVpRQnVBSFFBWlFBZ0FFRUFkUUIwQUc4QWNnQnBBR1FBCllRQmtBQ0FBWkFCbEFDQUFRd0JsQUhJQWRBQnBBR1lBYVFCakFHRUFZd0JwQVBNQWJnQWdBSE1BWlFBZ0FHVUFiZ0JqQUhVQVpRQnUKQUhRQWNnQmhBQ0FBWlFCdUFDQUFiQUJoQUNBQVpBQnBBSElBWlFCakFHTUFhUUR6QUc0QUlBQjNBR1VBWWdBZ0FHZ0FkQUIwQUhBQQpPZ0F2QUM4QWR3QjNBSGNBTGdCd0FHc0FhUUF1QUdjQWRnQmhBQzRBWlFCekFDOEFZd0J3QUhNd0pRWUlLd1lCQlFVSEFnRVdHV2gwCmRIQTZMeTkzZDNjdWNHdHBMbWQyWVM1bGN5OWpjSE13SFFZRFZSME9CQllFRkhzMTAwRFNISGdaWnU5MEVDamNQayt5ZUFUOE1JR1YKQmdOVkhTTUVnWTB3Z1lxQUZIczEwMERTSEhnWlp1OTBFQ2pjUGsreWVBVDhvV3lrYWpCb01Rc3dDUVlEVlFRR0V3SkZVekVmTUIwRwpBMVVFQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUVDeE1HVUV0SlIxWkJNU2N3SlFZRFZRUURFeDVTCmIyOTBJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtR0NCRHRGNVdnd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFDUmgKVHZXMXlFSUNLck5jZGEzRmJjcm5sRCtsYUpXSXdWVEFFR21pRWk4WVB5VlFxSHhLNnNZSjJmUjF4a0RhcjFDZFBhVVd1MjB4eHNkegpDa2orSUhMdGI4em9nMkVXUnBBQmxVdDlqcHBTQ1MvMmJ4emtvWEhQakNwYUYzT0RSMDBQTnZzRVRVbFI0aFRKWkdINzFCVGc5SjYzCk5JOEtKcjJYWFBSNU9rb3dHY3l0VDZDWWlyUXhseXJpYzIxK2VMajRpSWxQc1NLUlpFdjFVTjREMitYRmR1Y1RablYrWmZzQm41T0gKaUozNVJsZDhUV0N2bUhNVEk2UWdrWUg2MEdGbXVIM1JyOVp2SG13OTZSSDlxZm1DSW9hWk0zRmE2aGxYUFpITnFjQ2piZ2NUcHNudAorR2lqbnNOYWNnbUhLTkhFYzhSekdGOVFkUll4bjdmb2ZNTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQS1UcnVzdC1uUXVhbC0wMwo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEenpDQ0FyZWdBd0lCQWdJREFXd2VNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR05NUXN3Q1FZRFZRUUdFd0pCVkRGSU1FWUdBMVVFCkNndy9RUzFVY25WemRDQkhaWE11SUdZdUlGTnBZMmhsY21obGFYUnpjM2x6ZEdWdFpTQnBiU0JsYkdWcmRISXVJRVJoZEdWdWRtVnkKYTJWb2NpQkhiV0pJTVJrd0Z3WURWUVFMREJCQkxWUnlkWE4wTFc1UmRXRnNMVEF6TVJrd0Z3WURWUVFEREJCQkxWUnlkWE4wTFc1UgpkV0ZzTFRBek1CNFhEVEExTURneE56SXlNREF3TUZvWERURTFNRGd4TnpJeU1EQXdNRm93Z1kweEN6QUpCZ05WQkFZVEFrRlVNVWd3ClJnWURWUVFLREQ5QkxWUnlkWE4wSUVkbGN5NGdaaTRnVTJsamFHVnlhR1ZwZEhOemVYTjBaVzFsSUdsdElHVnNaV3QwY2k0Z1JHRjAKWlc1MlpYSnJaV2h5SUVkdFlrZ3hHVEFYQmdOVkJBc01FRUV0VkhKMWMzUXRibEYxWVd3dE1ETXhHVEFYQmdOVkJBTU1FRUV0VkhKMQpjM1F0YmxGMVlXd3RNRE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3RQV0Z1QS9PUU84QkJDNFNBCnpld3FvNTFydTI3Q1FvVDNVUlRob0tndFVhTlI4dDRqOERSRS81VHJ6QVVqbFVDNUIzaWxKZllLdlVXRzZObTl3QVNPaFVSaDczK24KeWZyQkpjeUZMR00vQldCelNRWGdZSGlWRUV2YytSRlp6bkYvUUp1S3FpVGZDMExpMjFhOFN0S2xESnUzUXo3ZGc5TW1FQUxQNmlQRQpTVTdsMCttMGlLc01ybUtTMUdXSDJXclg5SVdmNURNaUphWGx5RE82dzhkQjNGL0dhc3dBRG0weXFMYUhOZ0JpZDVzZUh6VExrRHg0CmlIUUY2M24xazNGbHlwM0hheGd0UFZ4TzU5WDRQekY5ajRmc0NpSXZJK24rdTMzSjRQVHM2M3pFc01NdFlyV2FjZGF4YXVqczJlM1YKY3V5K1Z3SE9CVldmM3RGZ2lCQ3pBZ01CQUFHak5qQTBNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdFUVlEVlIwT0JBb0VDRVJxbFdkVgplUkZQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBVmRSVTBWbElYTE9UaGFxL1l5L2tnTTQwCm96UmlQdmJZN21lSU1RUURid3ZVQi90T2RRL1RMdFBBRjhmR0tPd0dEUkVrRGc2bFhiK01zaE9XY2R6VXpnNE5DbWd5YkxsQk1SbXIKc1FkN1RaalRYTERSOEtkQ29MWEVqcS8rOFQvMDcwOUdBSGJyQXZ2NW5kSkFsc2VJT3JpZkVYbnpnR1dvdlIvVGVJR2dVVXczdEtaZApKWERSWnNsbytTNFJGR2p4VkpnSXJDYVNEOTZKbnRUNnMza3IwcU41MU95THJJZFRhRUpNVVZGMEhoc25MdVAxSHlsMFRlMnY5K0dTCm1ZSG92anJIRjFEMnQ4YjhtN0NLYTlhSUE1R1BCbmM2aFFMZG1OVkRlRC9HTUJXc20ydkxWN2VKVVlzNjZNbUVETnV4VUNBS0drcTYKYWhxOTdCdkl4WVNhelE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZXpDQ0FtT2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCZk1Rc3dDUVlEVlFRR0V3SlVWekVTTUJBR0ExVUVDZ3dKClZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd09ESTRNRGN5TkRNeldoY05NekF4TWpNeE1UVTFPVFU1V2pCZk1Rc3dDUVlEVlFRRwpFd0pVVnpFU01CQUdBMVVFQ2d3SlZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CCklGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUsKQW9JQkFRQ3dmbks0cEFPVTVxZmVDVGlSU2hGQWg2ZDhXV1FVZTdVUkVOMyt2OVhBdTFiaWhTWDBOWElQK0ZQUVFlRkVBY0swSE1NeApRaFpIaFRNaWRySUtidy9sSlZCUGhZYSt2NWd1RUdjZXZoRUZoZ1dReEZuUWZIZ1FzSUJjdCtISEszWExmSit1dGRHZEl6ZGpwOXhDCm9pMlNCQnRRd1h1NFBodkpWZ1NMTDFLYnJhbFc2Y0gvcmFsWWh6QzJnZmVYUmZ3WlZ6c3JiK1JIOUpsRi9oM3grSmVqaUIwM0hGeVAKNEhZbG1sRDRvRlQvUkpCMkk5SXl4c09yQnIvOCs3L3pyWDJTWWdKYktkTTFvNU9hUTJSZ1hiTDZNdjg3Qks5TlFHcjV4K1B2SS8xcgp5K1VQaXpnTjdncjgvZytZbnpBeDNXeFNaZm1MZ2I0aTRSeFlBN3FSRzRrSEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFPRnNtamQ2TFd2SlBlbFNER1JqakNEV211akFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQVFFQVBOVjNQZHJmaWJxSERBaFVhaUJRa3I2d1FUMjVKbVNEQ2kvb1FNQ1hLQ2VDTUVySmsvOXE1NllBZjRsQwptdFlSNVZQT0w4enkyZ1hFL3VKUXhEcUdmY3phZmhBSk81STFLbE95L3VzckJkbHNYZWJRNzlOcVpwNFZLSVY2NklJQXJCNm5DV2xXClF0Tm9VUmkrVkpxL1JFRzZTYjRndW1sYzdyaDN6YzVzSDYyRGxoaDlEclVVT1lUeEtPa3RvNTU3SG5weVdvT3plVy92dFB6UUNxVlkKVDBiZisyMTVXZktFSWxLdUQ4ejdmRHZuYXNwSFljTjYrTk9TQkIrNElJVGhObFFXeDBEZU80cHozTi9HQ1V6ZjdOci8xRk5Db2NueQpZaDBpZ3p5WHhma1pZaWVzWlNMWDB6ekc1WTZ5VTh4Snpyd3cvbnNPTTVENzdkSVVrUjhIcnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURCZE1Rc3dDUVlEVlFRR0V3SktVREVsTUNNR0ExVUVDaE1jClUwVkRUMDBnVkhKMWMzUWdVM2x6ZEdWdGN5QkRUeTRzVEZSRUxqRW5NQ1VHQTFVRUN4TWVVMlZqZFhKcGRIa2dRMjl0YlhWdWFXTmgKZEdsdmJpQlNiMjkwUTBFeU1CNFhEVEE1TURVeU9UQTFNREF6T1ZvWERUSTVNRFV5T1RBMU1EQXpPVm93WFRFTE1Ba0dBMVVFQmhNQwpTbEF4SlRBakJnTlZCQW9USEZORlEwOU5JRlJ5ZFhOMElGTjVjM1JsYlhNZ1EwOHVMRXhVUkM0eEp6QWxCZ05WQkFzVEhsTmxZM1Z5CmFYUjVJRU52YlcxMWJtbGpZWFJwYjI0Z1VtOXZkRU5CTWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQU5BVk9WS3hVck82eFZtQ3hGMVNyanBEWllCTHgvS1d2TnMybDlhbVpJeW9YdkRqQ2h6MzM1YzlTNjcyWGV3aHRVR3J6YmwrZHArKworVDQyTktBN3dmWXhFVVYwa3oxWGdNWDVpWm5LNWF0cTFMWGFRWkFRd2RiV1FvbkN2L1E0RXBWTVZBWDNOdVJGZzNzVVpkYmNERTNSCjNuNE1xenZFRmI0NlZxWmFiM1pwVXFsNnVjanJhcHBkVXRBdENtczFGZ2tRaE5CcXlqb0dBRGRINUg1WFR6K0w2MmU0aUtyRnZsTlYKc3BIRWZibXdoUmtHZUM3YllScjZoZlZLa2FIbkZ0V09vam5mbExod0h5Zy9pL3hBWG1PRFBJTXFHcGxyejk1WmFqdjhieGJYSC8xSwpFT3RPZ2hZNnJDY01VL0d0MVNTd2F3TlF3UzA4RnQxRU5DY2FkZnNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkFxRnFYZGxCWmg4ClFJSDRENWNzT1BFSzdEelBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUIKQ3dVQUE0SUJBUUJNT3FORXJMbEZzY2VUZnNnTENrTGZaT29jN2xsc0NMcUpYMnJLU3BXZWVvOEh4ZHBGY29KeERqclN6RytudEtFagp1L1lrbjhzWC9veW16c0xTMjh5Ti9ISDhBeW5CYkYwelgyUzJaVHVKYnhoMmVQWGNva2dmR1QrT2srdngraGZ1elU3akJCSlYxdVhrCjNmcytCWHppSFY3R3A3eVhUMmc2OWVrdUNrTzJyMWRjWW1oOHQvMmppb1NnckdLK0t3bUhOUEJxQWJ1YktWWTgvZ0EzenlOczhVNnEKdG5SR0VteVI3alRWN0pxUjUwUytrREZ5MVVrQzlnTGw5Qi9yZk5tV1Zhbi83SXI1bVVmL05Wb0NxZ1RMaWx1SGNTbVJ2YVMwZWcyOQptdlZYSXdBSElSYy9Tam5SQlVrTHA3WTNnYVZkaktvelhvRW9mS2Q5SitzQXJvMDMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRUMtQUNDCj09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlZqQ0NCRDZnQXdJQkFnSVE3aXM5NjlRaDNoU29ZcXdFODkzRUFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQjh6RUxNQWtHQTFVRQpCaE1DUlZNeE96QTVCZ05WQkFvVE1rRm5aVzVqYVdFZ1EyRjBZV3hoYm1FZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2SUNoT1NVWWdVUzB3Ck9EQXhNVGMyTFVrcE1TZ3dKZ1lEVlFRTEV4OVRaWEoyWldseklGQjFZbXhwWTNNZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2TVRVd013WUQKVlFRTEV5eFdaV2RsZFNCb2RIUndjem92TDNkM2R5NWpZWFJqWlhKMExtNWxkQzkyWlhKaGNuSmxiQ0FvWXlrd016RTFNRE1HQTFVRQpDeE1zU21WeVlYSnhkV2xoSUVWdWRHbDBZWFJ6SUdSbElFTmxjblJwWm1sallXTnBieUJEWVhSaGJHRnVaWE14RHpBTkJnTlZCQU1UCkJrVkRMVUZEUXpBZUZ3MHdNekF4TURjeU16QXdNREJhRncwek1UQXhNRGN5TWpVNU5UbGFNSUh6TVFzd0NRWURWUVFHRXdKRlV6RTcKTURrR0ExVUVDaE15UVdkbGJtTnBZU0JEWVhSaGJHRnVZU0JrWlNCRFpYSjBhV1pwWTJGamFXOGdLRTVKUmlCUkxUQTRNREV4TnpZdApTU2t4S0RBbUJnTlZCQXNUSDFObGNuWmxhWE1nVUhWaWJHbGpjeUJrWlNCRFpYSjBhV1pwWTJGamFXOHhOVEF6QmdOVkJBc1RMRlpsCloyVjFJR2gwZEhCek9pOHZkM2QzTG1OaGRHTmxjblF1Ym1WMEwzWmxjbUZ5Y21Wc0lDaGpLVEF6TVRVd013WURWUVFMRXl4S1pYSmgKY25GMWFXRWdSVzUwYVhSaGRITWdaR1VnUTJWeWRHbG1hV05oWTJsdklFTmhkR0ZzWVc1bGN6RVBNQTBHQTFVRUF4TUdSVU10UVVORApNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXN5TEhUK0tYUXBXSVI0TkE5aDBYODROekpCNVI4NWlLCnc1SzQvMENRQlhDSFlNa0FxYldVWlJraUZSZkNRMnhtUkpvTkJENDViNlZMZXFwanQ0cEVuZGxqa1lSbTRDZ1B1a0xqYm83M0ZDZVQKYWU2UkRxTmZEckhyWnFKeVR4SVRobVY2UHR0UEIvU25DV0RhT2tLWng3Si9zeGFWSE1mNU5MV1VoZFdaWHFCSW9IN25GMlc0b25XNApIdlBsUW4ydjdmT0tTR1JkZ2hTVDJNRGsvN05RY3ZKMjlyTmRRbEI1MEpRK2F3d0F2dGhyRGs0cTdEN1N6SUtpR0dVekUzZWVtbDBhCkU5akQyejNJbDNydWNPMm41bnpiY2M4dGxHTGZiZGIxT0w0L3BZVUtHYmlvMkFsMVFuREU2dS9MRHNnMHFCSWltQXk0RTVTMlMrencKMEpEbkp3SURBUUFCbzRIak1JSGdNQjBHQTFVZEVRUVdNQlNCRW1WalgyRmpZMEJqWVhSalpYSjBMbTVsZERBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVW9NT0xSS28zcFVXL2w0QmEwZkY0b3B2cFhZMHdmd1lEClZSMGdCSGd3ZGpCMEJnc3JCZ0VFQWZWNEFRTUJDakJsTUN3R0NDc0dBUVVGQndJQkZpQm9kSFJ3Y3pvdkwzZDNkeTVqWVhSalpYSjAKTG01bGRDOTJaWEpoY25KbGJEQTFCZ2dyQmdFRkJRY0NBakFwR2lkV1pXZGxkU0JvZEhSd2N6b3ZMM2QzZHk1allYUmpaWEowTG01bApkQzkyWlhKaGNuSmxiQ0F3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUtCSVc0SUI5azFJdURsVk5aeUFlbE9aMVZyL3NYRTd6RGtKCmxGN1cydSsrQVZ0ZDB4N1kvWDFQemFCQjREU1R2OHZpaHB3M2twQldITnpyS1FYbHhKN0hOZCtLRE0zRklVUHBxb2psTmNBWlFtTmEKQWw2a1NCZzZoVy9jbmJ3L25aekJoN2g2WVFqcGR3dC9jS3Q2M2RtWExHUWVoYis4ZEphaHczb1M3QXdhYm9NTVBPaHlScC83U05WZQpsK2F4b2ZqazcwWWxsSnlKMjJrNHZ1eGNEbGJIWlZIbFVJaUl2MExWS3ozbCticWVMclBLOUhPU0FndStUR2JySVA2NXk3V1pmK2EyCkUvcktTMDNaN2xOR0JqdkdUcTJUV29GK2JDcExhZ1ZGalBJaHBER1FoMnhsbkoybFlKVTZVbi8xMGFzSWJ2UHVXL21JUFg2NGIyNEQKNUVJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNVENDQXhtZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBRENCbFRFTE1Ba0dBMVVFQmhNQ1IxSXhSREJDQmdOVkJBb1QKTzBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eQphWFI1TVVBd1BnWURWUVFERXpkSVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6CklGSnZiM1JEUVNBeU1ERXhNQjRYRFRFeE1USXdOakV6TkRrMU1sb1hEVE14TVRJd01URXpORGsxTWxvd2daVXhDekFKQmdOVkJBWVQKQWtkU01VUXdRZ1lEVlFRS0V6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1egpJRU5sY25RdUlFRjFkR2h2Y21sMGVURkFNRDRHQTFVRUF4TTNTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vCklFbHVjM1JwZEhWMGFXOXVjeUJTYjI5MFEwRWdNakF4TVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQUtsVEFPTXVwdmFPK21EWUxaVSsrQ3dxVkU3TnVZUmhsRmhQanoyTDVFUHpkWW1OVWVURE45S0tpRTE1SHJjUzNVTjRTb3FTNXRkSQoxUStrT2lsRU5iZ0g5bWdkVmMwNFVmQ01KREdGcjRQSmZlbDNyKzBhZTUwWCtiT2RPRkFQcGxwNWtZQ3ZONjZtMHpIN3RTWUpuVHhhCjcxSEZLOStXWGVzeUhnTGFjRW5zYmd6SW1qZU45L0UyWUVzbUxJS2UwSGp6RFE5anBGRXc0ZmtySnhJSDJPcTlHR0tZc0ZrM2ZiN3UKOHlCUlFscUQ3NU82YVJYeFlwMmZtVG1Db2JkMExvdlV4UXQ3TC9ESUN0bzllUXFha3h5bEtISnprVU9hcDlGTmhZUzVxWFNQRkVESAozTjZzUVdSc3RCbWJBbU50SkdTUFJMSWw2czVkZEF4ak1seU5oK1VDQXdFQUFhT0JpVENCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCk1Bc0dBMVVkRHdRRUF3SUJCakFkQmdOVkhRNEVGZ1FVcHBGQy9STmhTaU9lQ0tRcDVkZ1RCQ1B1UVNVd1J3WURWUjBlQkVBd1BxQTgKTUFXQ0F5NW5jakFGZ2dNdVpYVXdCb0lFTG1Wa2RUQUdnZ1F1YjNKbk1BV0JBeTVuY2pBRmdRTXVaWFV3Qm9FRUxtVmtkVEFHZ1FRdQpiM0puTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBZjczbEI0WHR1UDdLTWhqZENTazRjTng2Tlpyb2tnY2xQRWc4aHdBT1hoaVZ0ClhkTWlLYWhzb2cycDZ6MEdXNWs2eDh6RG1qUi9xdzdJVGh6aCt1VGN6UTIrdnlUK2JPZHJ3ZzNJQnA1T2pXRW9wbXI5NWZaaTZoZzgKVHFCVG5iSTZuT3VsbkpFV3RrMkM0QXdGU0tsczljejR5NTFKdFBBQ3BmMXdBKzJLSWFXdUU0Wkp3ek56dm9jN2RJc1hSU1pNRnBHRAovbWQ5elUxalovcnpBeEtXZUFhTnNXZnRqaisrbjA4QzliTUpML05NaDk4cXk1VjhBY3lzTm5xL29uTjY5NC9CdFpxaEZMS1BNNThOCjd5TGNabnVFdlVVWEJqMDh5cmwzTkkvSzZzOC9NVDdqaU9PQVNTWElsN1dkbXBsTnNEejRTZ0NiWk4yZk9VdlJKOWU0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/cacert.pem,importbuddy/lib/requestcore/cacert.pem
###PACKDATA,FILE_START,/destinations/_s3lib/aws-sdk/lib/requestcore/requestcore.class.php,importbuddy/lib/requestcore/requestcore.class.php
PD9waHAKLyoqCiAqIEhhbmRsZXMgYWxsIEhUVFAgcmVxdWVzdHMgdXNpbmcgY1VSTCBhbmQgbWFuYWdlcyB0aGUgcmVzcG9uc2VzLgogKgogKiBAdmVyc2lvbiAyMDEyLjAxLjE3CiAqIEBjb3B5cmlnaHQgMjAwNi0yMDExIFJ5YW4gUGFybWFuCiAqIEBjb3B5cmlnaHQgMjAwNi0yMDEwIEZvbGVlbyBJbmMuCiAqIEBjb3B5cmlnaHQgMjAxMC0yMDExIEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCiAqIEBjb3B5cmlnaHQgMjAwOC0yMDExIENvbnRyaWJ1dG9ycwogKiBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwIFNpbXBsaWZpZWQgQlNEIExpY2Vuc2UKICovCmNsYXNzIFJlcXVlc3RDb3JlCnsKCS8qKgoJICogVGhlIFVSTCBiZWluZyByZXF1ZXN0ZWQuCgkgKi8KCXB1YmxpYyAkcmVxdWVzdF91cmw7CgoJLyoqCgkgKiBUaGUgaGVhZGVycyBiZWluZyBzZW50IGluIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHJlcXVlc3RfaGVhZGVyczsKCgkvKioKCSAqIFRoZSBib2R5IGJlaW5nIHNlbnQgaW4gdGhlIHJlcXVlc3QuCgkgKi8KCXB1YmxpYyAkcmVxdWVzdF9ib2R5OwoKCS8qKgoJICogVGhlIHJlc3BvbnNlIHJldHVybmVkIGJ5IHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHJlc3BvbnNlOwoKCS8qKgoJICogVGhlIGhlYWRlcnMgcmV0dXJuZWQgYnkgdGhlIHJlcXVlc3QuCgkgKi8KCXB1YmxpYyAkcmVzcG9uc2VfaGVhZGVyczsKCgkvKioKCSAqIFRoZSBib2R5IHJldHVybmVkIGJ5IHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHJlc3BvbnNlX2JvZHk7CgoJLyoqCgkgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgcmVxdWVzdC4KCSAqLwoJcHVibGljICRyZXNwb25zZV9jb2RlOwoKCS8qKgoJICogQWRkaXRpb25hbCByZXNwb25zZSBkYXRhLgoJICovCglwdWJsaWMgJHJlc3BvbnNlX2luZm87CgoJLyoqCgkgKiBUaGUgaGFuZGxlIGZvciB0aGUgY1VSTCBvYmplY3QuCgkgKi8KCXB1YmxpYyAkY3VybF9oYW5kbGU7CgoJLyoqCgkgKiBUaGUgbWV0aG9kIGJ5IHdoaWNoIHRoZSByZXF1ZXN0IGlzIGJlaW5nIG1hZGUuCgkgKi8KCXB1YmxpYyAkbWV0aG9kOwoKCS8qKgoJICogU3RvcmVzIHRoZSBwcm94eSBzZXR0aW5ncyB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHByb3h5ID0gbnVsbDsKCgkvKioKCSAqIFRoZSB1c2VybmFtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHVzZXJuYW1lID0gbnVsbDsKCgkvKioKCSAqIFRoZSBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgJHBhc3N3b3JkID0gbnVsbDsKCgkvKioKCSAqIEN1c3RvbSBDVVJMT1BUIHNldHRpbmdzLgoJICovCglwdWJsaWMgJGN1cmxvcHRzID0gbnVsbDsKCgkvKioKCSAqIFRoZSBzdGF0ZSBvZiBkZWJ1ZyBtb2RlLgoJICovCglwdWJsaWMgJGRlYnVnX21vZGUgPSBmYWxzZTsKCgkvKioKCSAqIFRoZSBkZWZhdWx0IGNsYXNzIHRvIHVzZSBmb3IgSFRUUCBSZXF1ZXN0cyAoZGVmYXVsdHMgdG8gPFJlcXVlc3RDb3JlPikuCgkgKi8KCXB1YmxpYyAkcmVxdWVzdF9jbGFzcyA9ICdSZXF1ZXN0Q29yZSc7CgoJLyoqCgkgKiBUaGUgZGVmYXVsdCBjbGFzcyB0byB1c2UgZm9yIEhUVFAgUmVzcG9uc2VzIChkZWZhdWx0cyB0byA8UmVzcG9uc2VDb3JlPikuCgkgKi8KCXB1YmxpYyAkcmVzcG9uc2VfY2xhc3MgPSAnUmVzcG9uc2VDb3JlJzsKCgkvKioKCSAqIERlZmF1bHQgdXNlcmFnZW50IHN0cmluZyB0byB1c2UuCgkgKi8KCXB1YmxpYyAkdXNlcmFnZW50ID0gJ1JlcXVlc3RDb3JlLzEuNC40JzsKCgkvKioKCSAqIEZpbGUgdG8gcmVhZCBmcm9tIHdoaWxlIHN0cmVhbWluZyB1cC4KCSAqLwoJcHVibGljICRyZWFkX2ZpbGUgPSBudWxsOwoKCS8qKgoJICogVGhlIHJlc291cmNlIHRvIHJlYWQgZnJvbSB3aGlsZSBzdHJlYW1pbmcgdXAuCgkgKi8KCXB1YmxpYyAkcmVhZF9zdHJlYW0gPSBudWxsOwoKCS8qKgoJICogVGhlIHNpemUgb2YgdGhlIHN0cmVhbSB0byByZWFkIGZyb20uCgkgKi8KCXB1YmxpYyAkcmVhZF9zdHJlYW1fc2l6ZSA9IG51bGw7CgoJLyoqCgkgKiBUaGUgbGVuZ3RoIGFscmVhZHkgcmVhZCBmcm9tIHRoZSBzdHJlYW0uCgkgKi8KCXB1YmxpYyAkcmVhZF9zdHJlYW1fcmVhZCA9IDA7CgoJLyoqCgkgKiBGaWxlIHRvIHdyaXRlIHRvIHdoaWxlIHN0cmVhbWluZyBkb3duLgoJICovCglwdWJsaWMgJHdyaXRlX2ZpbGUgPSBudWxsOwoKCS8qKgoJICogVGhlIHJlc291cmNlIHRvIHdyaXRlIHRvIHdoaWxlIHN0cmVhbWluZyBkb3duLgoJICovCglwdWJsaWMgJHdyaXRlX3N0cmVhbSA9IG51bGw7CgoJLyoqCgkgKiBTdG9yZXMgdGhlIGludGVuZGVkIHN0YXJ0aW5nIHNlZWsgcG9zaXRpb24uCgkgKi8KCXB1YmxpYyAkc2Vla19wb3NpdGlvbiA9IG51bGw7CgoJLyoqCgkgKiBUaGUgbG9jYXRpb24gb2YgdGhlIGNhY2VydC5wZW0gZmlsZSB0byB1c2UuCgkgKi8KCXB1YmxpYyAkY2FjZXJ0X2xvY2F0aW9uID0gZmFsc2U7CgoJLyoqCgkgKiBUaGUgc3RhdGUgb2YgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4KCSAqLwoJcHVibGljICRzc2xfdmVyaWZpY2F0aW9uID0gdHJ1ZTsKCgkvKioKCSAqIFRoZSB1c2VyLWRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgc3RyZWFtIGlzIHJlYWQgZnJvbS4KCSAqLwoJcHVibGljICRyZWdpc3RlcmVkX3N0cmVhbWluZ19yZWFkX2NhbGxiYWNrID0gbnVsbDsKCgkvKioKCSAqIFRoZSB1c2VyLWRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgc3RyZWFtIGlzIHdyaXR0ZW4gdG8uCgkgKi8KCXB1YmxpYyAkcmVnaXN0ZXJlZF9zdHJlYW1pbmdfd3JpdGVfY2FsbGJhY2sgPSBudWxsOwoKCS8qKgoJICogV2hldGhlciBvciBub3QgdGhlIHNldF90aW1lX2xpbWl0IGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQuCgkgKi8KCXB1YmxpYyAkYWxsb3dfc2V0X3RpbWVfbGltaXQgPSB0cnVlOwoKCS8qKgoJICogV2hldGhlciBvciBub3QgdG8gdXNlIGd6aXAgZW5jb2RpbmcgdmlhIENVUkxPUFRfRU5DT0RJTkcKCSAqLwoJcHVibGljICR1c2VfZ3ppcF9lbmNvbmRpbmcgPSB0cnVlOwoKCgkvKiUqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiolKi8KCS8vIENPTlNUQU5UUwoKCS8qKgoJICogR0VUIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfR0VUID0gJ0dFVCc7CgoJLyoqCgkgKiBQT1NUIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfUE9TVCA9ICdQT1NUJzsKCgkvKioKCSAqIFBVVCBIVFRQIE1ldGhvZAoJICovCgljb25zdCBIVFRQX1BVVCA9ICdQVVQnOwoKCS8qKgoJICogREVMRVRFIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfREVMRVRFID0gJ0RFTEVURSc7CgoJLyoqCgkgKiBIRUFEIEhUVFAgTWV0aG9kCgkgKi8KCWNvbnN0IEhUVFBfSEVBRCA9ICdIRUFEJzsKCgoJLyolKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJSovCgkvLyBDT05TVFJVQ1RPUi9ERVNUUlVDVE9SCgoJLyoqCgkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkdXJsIChPcHRpb25hbCkgVGhlIFVSTCB0byByZXF1ZXN0IG9yIHNlcnZpY2UgZW5kcG9pbnQgdG8gcXVlcnkuCgkgKiBAcGFyYW0gc3RyaW5nICRwcm94eSAoT3B0aW9uYWwpIFRoZSBmYXV4LXVybCB0byB1c2UgZm9yIHByb3h5IHNldHRpbmdzLiBUYWtlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogYHByb3h5Oi8vdXNlcjpwYXNzQGhvc3RuYW1lOnBvcnRgCgkgKiBAcGFyYW0gYXJyYXkgJGhlbHBlcnMgKE9wdGlvbmFsKSBBbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBjbGFzc25hbWVzIHRvIHVzZSBmb3IgcmVxdWVzdCwgYW5kIHJlc3BvbnNlIGZ1bmN0aW9uYWxpdHkuIEdldHMgcGFzc2VkIGluIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNhbGxpbmcgY2xhc3MuCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHVybCA9IG51bGwsICRwcm94eSA9IG51bGwsICRoZWxwZXJzID0gbnVsbCkKCXsKCQkvLyBTZXQgc29tZSBkZWZhdWx0IHZhbHVlcy4KCQkkdGhpcy0+cmVxdWVzdF91cmwgPSAkdXJsOwoJCSR0aGlzLT5tZXRob2QgPSBzZWxmOjpIVFRQX0dFVDsKCQkkdGhpcy0+cmVxdWVzdF9oZWFkZXJzID0gYXJyYXkoKTsKCQkkdGhpcy0+cmVxdWVzdF9ib2R5ID0gJyc7CgoJCS8vIERldGVybWluZSBpZiBzZXRfdGltZV9saW1pdCBjYW4gYmUgY2FsbGVkCgkJaWYgKHN0cnBvcyhpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLCAnc2V0X3RpbWVfbGltaXQnKSAhPT0gZmFsc2UpCgkJewoJCQkkdGhpcy0+YWxsb3dfc2V0X3RpbWVfbGltaXQgPSBmYWxzZTsKCQl9CgoJCS8vIFNldCBhIG5ldyBSZXF1ZXN0IGNsYXNzIGlmIG9uZSB3YXMgc2V0LgoJCWlmIChpc3NldCgkaGVscGVyc1sncmVxdWVzdCddKSAmJiAhZW1wdHkoJGhlbHBlcnNbJ3JlcXVlc3QnXSkpCgkJewoJCQkkdGhpcy0+cmVxdWVzdF9jbGFzcyA9ICRoZWxwZXJzWydyZXF1ZXN0J107CgkJfQoKCQkvLyBTZXQgYSBuZXcgUmVxdWVzdCBjbGFzcyBpZiBvbmUgd2FzIHNldC4KCQlpZiAoaXNzZXQoJGhlbHBlcnNbJ3Jlc3BvbnNlJ10pICYmICFlbXB0eSgkaGVscGVyc1sncmVzcG9uc2UnXSkpCgkJewoJCQkkdGhpcy0+cmVzcG9uc2VfY2xhc3MgPSAkaGVscGVyc1sncmVzcG9uc2UnXTsKCQl9CgoJCWlmICgkcHJveHkpCgkJewoJCQkkdGhpcy0+c2V0X3Byb3h5KCRwcm94eSk7CgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBEZXN0cnVjdHMgdGhlIGluc3RhbmNlLiBDbG9zZXMgb3BlbmVkIGZpbGUgaGFuZGxlcy4KCSAqCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCgl7CgkJaWYgKGlzc2V0KCR0aGlzLT5yZWFkX2ZpbGUpICYmIGlzc2V0KCR0aGlzLT5yZWFkX3N0cmVhbSkpCgkJewoJCQlmY2xvc2UoJHRoaXMtPnJlYWRfc3RyZWFtKTsKCQl9CgoJCWlmIChpc3NldCgkdGhpcy0+d3JpdGVfZmlsZSkgJiYgaXNzZXQoJHRoaXMtPndyaXRlX3N0cmVhbSkpCgkJewoJCQlmY2xvc2UoJHRoaXMtPndyaXRlX3N0cmVhbSk7CgkJfQoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoKCS8qJSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiUqLwoJLy8gUkVRVUVTVCBNRVRIT0RTCgoJLyoqCgkgKiBTZXRzIHRoZSBjcmVkZW50aWFscyB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW9uLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHVzZXIgKFJlcXVpcmVkKSBUaGUgdXNlcm5hbWUgdG8gYXV0aGVudGljYXRlIHdpdGguCgkgKiBAcGFyYW0gc3RyaW5nICRwYXNzIChSZXF1aXJlZCkgVGhlIHBhc3N3b3JkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jcmVkZW50aWFscygkdXNlciwgJHBhc3MpCgl7CgkJJHRoaXMtPnVzZXJuYW1lID0gJHVzZXI7CgkJJHRoaXMtPnBhc3N3b3JkID0gJHBhc3M7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogQWRkcyBhIGN1c3RvbSBIVFRQIGhlYWRlciB0byB0aGUgY1VSTCByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGtleSAoUmVxdWlyZWQpIFRoZSBjdXN0b20gSFRUUCBoZWFkZXIgdG8gc2V0LgoJICogQHBhcmFtIG1peGVkICR2YWx1ZSAoUmVxdWlyZWQpIFRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhlIGN1c3RvbSBIVFRQIGhlYWRlci4KCSAqIEByZXR1cm4gJHRoaXMgQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRfaGVhZGVyKCRrZXksICR2YWx1ZSkKCXsKCQkkdGhpcy0+cmVxdWVzdF9oZWFkZXJzWyRrZXldID0gJHZhbHVlOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFJlbW92ZXMgYW4gSFRUUCBoZWFkZXIgZnJvbSB0aGUgY1VSTCByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGtleSAoUmVxdWlyZWQpIFRoZSBjdXN0b20gSFRUUCBoZWFkZXIgdG8gc2V0LgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHJlbW92ZV9oZWFkZXIoJGtleSkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPnJlcXVlc3RfaGVhZGVyc1ska2V5XSkpCgkJewoJCQl1bnNldCgkdGhpcy0+cmVxdWVzdF9oZWFkZXJzWyRrZXldKTsKCQl9CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBtZXRob2QgdHlwZSBmb3IgdGhlIHJlcXVlc3QuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbWV0aG9kIChSZXF1aXJlZCkgT25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOiA8SFRUUF9HRVQ+LCA8SFRUUF9QT1NUPiwgPEhUVFBfUFVUPiwgPEhUVFBfSEVBRD4sIDxIVFRQX0RFTEVURT4uCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X21ldGhvZCgkbWV0aG9kKQoJewoJCSR0aGlzLT5tZXRob2QgPSBzdHJ0b3VwcGVyKCRtZXRob2QpOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgYSBjdXN0b20gdXNlcmFnZW50IHN0cmluZyBmb3IgdGhlIGNsYXNzLgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJHVhIChSZXF1aXJlZCkgVGhlIHVzZXJhZ2VudCBzdHJpbmcgdG8gdXNlLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF91c2VyYWdlbnQoJHVhKQoJewoJCSR0aGlzLT51c2VyYWdlbnQgPSAkdWE7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBib2R5IHRvIHNlbmQgaW4gdGhlIHJlcXVlc3QuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkYm9keSAoUmVxdWlyZWQpIFRoZSB0ZXh0dWFsIGNvbnRlbnQgdG8gc2VuZCBhbG9uZyBpbiB0aGUgYm9keSBvZiB0aGUgcmVxdWVzdC4KCSAqIEByZXR1cm4gJHRoaXMgQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzZXRfYm9keSgkYm9keSkKCXsKCQkkdGhpcy0+cmVxdWVzdF9ib2R5ID0gJGJvZHk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBVUkwgdG8gbWFrZSB0aGUgcmVxdWVzdCB0by4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICR1cmwgKFJlcXVpcmVkKSBUaGUgVVJMIHRvIG1ha2UgdGhlIHJlcXVlc3QgdG8uCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3JlcXVlc3RfdXJsKCR1cmwpCgl7CgkJJHRoaXMtPnJlcXVlc3RfdXJsID0gJHVybDsKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBTZXQgYWRkaXRpb25hbCBDVVJMT1BUIHNldHRpbmdzLiBUaGVzZSB3aWxsIG1lcmdlIHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MsIGFuZCBvdmVycmlkZSBpZgoJICogdGhlcmUgaXMgYSBkdXBsaWNhdGUuCgkgKgoJICogQHBhcmFtIGFycmF5ICRjdXJsb3B0cyAoT3B0aW9uYWwpIEEgc2V0IG9mIGtleS12YWx1ZSBwYWlycyB0aGF0IHNldCBgQ1VSTE9QVGAgb3B0aW9ucy4gVGhlc2Ugd2lsbCBtZXJnZSB3aXRoIHRoZSBleGlzdGluZyBDVVJMT1BUcywgYW5kIG9uZXMgcGFzc2VkIGhlcmUgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdHMuIEtleXMgc2hvdWxkIGJlIHRoZSBgQ1VSTE9QVF8qYCBjb25zdGFudHMsIG5vdCBzdHJpbmdzLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9jdXJsb3B0cygkY3VybG9wdHMpCgl7CgkJJHRoaXMtPmN1cmxvcHRzID0gJGN1cmxvcHRzOwoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGxlbmd0aCBpbiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbSB3aGlsZSBzdHJlYW1pbmcgdXAuCgkgKgoJICogQHBhcmFtIGludGVnZXIgJHNpemUgKFJlcXVpcmVkKSBUaGUgbGVuZ3RoIGluIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9yZWFkX3N0cmVhbV9zaXplKCRzaXplKQoJewoJCSR0aGlzLT5yZWFkX3N0cmVhbV9zaXplID0gJHNpemU7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHJlc291cmNlIHRvIHJlYWQgZnJvbSB3aGlsZSBzdHJlYW1pbmcgdXAuIFJlYWRzIHRoZSBzdHJlYW0gZnJvbSBpdHMgY3VycmVudCBwb3NpdGlvbiB1bnRpbAoJICogRU9GIG9yIGAkc2l6ZWAgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuIElmIGAkc2l6ZWAgaXMgbm90IGdpdmVuIGl0IHdpbGwgYmUgZGV0ZXJtaW5lZCBieSA8cGhwOmZzdGF0KCk+IGFuZAoJICogPHBocDpmdGVsbCgpPi4KCSAqCgkgKiBAcGFyYW0gcmVzb3VyY2UgJHJlc291cmNlIChSZXF1aXJlZCkgVGhlIHJlYWRhYmxlIHJlc291cmNlIHRvIHJlYWQgZnJvbS4KCSAqIEBwYXJhbSBpbnRlZ2VyICRzaXplIChPcHRpb25hbCkgVGhlIHNpemUgb2YgdGhlIHN0cmVhbSB0byByZWFkLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9yZWFkX3N0cmVhbSgkcmVzb3VyY2UsICRzaXplID0gbnVsbCkKCXsKCQlpZiAoIWlzc2V0KCRzaXplKSB8fCAkc2l6ZSA8IDApCgkJewoJCQkkc3RhdHMgPSBmc3RhdCgkcmVzb3VyY2UpOwoKCQkJaWYgKCRzdGF0cyAmJiAkc3RhdHNbJ3NpemUnXSA+PSAwKQoJCQl7CgkJCQkkcG9zaXRpb24gPSBmdGVsbCgkcmVzb3VyY2UpOwoKCQkJCWlmICgkcG9zaXRpb24gIT09IGZhbHNlICYmICRwb3NpdGlvbiA+PSAwKQoJCQkJewoJCQkJCSRzaXplID0gJHN0YXRzWydzaXplJ10gLSAkcG9zaXRpb247CgkJCQl9CgkJCX0KCQl9CgoJCSR0aGlzLT5yZWFkX3N0cmVhbSA9ICRyZXNvdXJjZTsKCgkJcmV0dXJuICR0aGlzLT5zZXRfcmVhZF9zdHJlYW1fc2l6ZSgkc2l6ZSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBmaWxlIHRvIHJlYWQgZnJvbSB3aGlsZSBzdHJlYW1pbmcgdXAuCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gKFJlcXVpcmVkKSBUaGUgcmVhZGFibGUgbG9jYXRpb24gdG8gcmVhZCBmcm9tLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9yZWFkX2ZpbGUoJGxvY2F0aW9uKQoJewoJCSR0aGlzLT5yZWFkX2ZpbGUgPSAkbG9jYXRpb247CgkJJHJlYWRfZmlsZV9oYW5kbGUgPSBmb3BlbigkbG9jYXRpb24sICdyJyk7CgoJCXJldHVybiAkdGhpcy0+c2V0X3JlYWRfc3RyZWFtKCRyZWFkX2ZpbGVfaGFuZGxlKTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHJlc291cmNlIHRvIHdyaXRlIHRvIHdoaWxlIHN0cmVhbWluZyBkb3duLgoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkcmVzb3VyY2UgKFJlcXVpcmVkKSBUaGUgd3JpdGVhYmxlIHJlc291cmNlIHRvIHdyaXRlIHRvLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF93cml0ZV9zdHJlYW0oJHJlc291cmNlKQoJewoJCSR0aGlzLT53cml0ZV9zdHJlYW0gPSAkcmVzb3VyY2U7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGZpbGUgdG8gd3JpdGUgdG8gd2hpbGUgc3RyZWFtaW5nIGRvd24uCgkgKgoJICogQHBhcmFtIHN0cmluZyAkbG9jYXRpb24gKFJlcXVpcmVkKSBUaGUgd3JpdGVhYmxlIGxvY2F0aW9uIHRvIHdyaXRlIHRvLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF93cml0ZV9maWxlKCRsb2NhdGlvbikKCXsKCQkkdGhpcy0+d3JpdGVfZmlsZSA9ICRsb2NhdGlvbjsKCQkkd3JpdGVfZmlsZV9oYW5kbGUgPSBmb3BlbigkbG9jYXRpb24sICd3Jyk7CgoJCXJldHVybiAkdGhpcy0+c2V0X3dyaXRlX3N0cmVhbSgkd3JpdGVfZmlsZV9oYW5kbGUpOwoJfQoKCS8qKgoJICogU2V0IHRoZSBwcm94eSB0byB1c2UgZm9yIG1ha2luZyByZXF1ZXN0cy4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nICRwcm94eSAoUmVxdWlyZWQpIFRoZSBmYXV4LXVybCB0byB1c2UgZm9yIHByb3h5IHNldHRpbmdzLiBUYWtlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDogYHByb3h5Oi8vdXNlcjpwYXNzQGhvc3RuYW1lOnBvcnRgCgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2V0X3Byb3h5KCRwcm94eSkKCXsKCQkkcHJveHkgPSBwYXJzZV91cmwoJHByb3h5KTsKCQkkcHJveHlbJ3VzZXInXSA9IGlzc2V0KCRwcm94eVsndXNlciddKSA/ICRwcm94eVsndXNlciddIDogbnVsbDsKCQkkcHJveHlbJ3Bhc3MnXSA9IGlzc2V0KCRwcm94eVsncGFzcyddKSA/ICRwcm94eVsncGFzcyddIDogbnVsbDsKCQkkcHJveHlbJ3BvcnQnXSA9IGlzc2V0KCRwcm94eVsncG9ydCddKSA/ICRwcm94eVsncG9ydCddIDogbnVsbDsKCQkkdGhpcy0+cHJveHkgPSAkcHJveHk7CgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogU2V0IHRoZSBpbnRlbmRlZCBzdGFydGluZyBzZWVrIHBvc2l0aW9uLgoJICoKCSAqIEBwYXJhbSBpbnRlZ2VyICRwb3NpdGlvbiAoUmVxdWlyZWQpIFRoZSBieXRlLXBvc2l0aW9uIG9mIHRoZSBzdHJlYW0gdG8gYmVnaW4gcmVhZGluZyBmcm9tLgoJICogQHJldHVybiAkdGhpcyBBIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBpbnN0YW5jZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNldF9zZWVrX3Bvc2l0aW9uKCRwb3NpdGlvbikKCXsKCQkkdGhpcy0+c2Vla19wb3NpdGlvbiA9IGlzc2V0KCRwb3NpdGlvbikgPyAoaW50ZWdlcikgJHBvc2l0aW9uIDogbnVsbDsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCS8qKgoJICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIHdoZW5ldmVyIGEgZGF0YSBzdHJlYW0gaXMgcmVhZCBmcm9tIHVzaW5nCgkgKiA8Q0ZSZXF1ZXN0OjpzdHJlYW1pbmdfcmVhZF9jYWxsYmFjaygpPi4KCSAqCgkgKiBUaGUgdXNlci1kZWZpbmVkIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgdGhyZWUgYXJndW1lbnRzOgoJICoKCSAqIDx1bD4KCSAqIAk8bGk+PGNvZGU+JGN1cmxfaGFuZGxlPC9jb2RlPiAtIDxjb2RlPnJlc291cmNlPC9jb2RlPiAtIFJlcXVpcmVkIC0gVGhlIGNVUkwgaGFuZGxlIHJlc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgaW4tcHJvZ3Jlc3MgdHJhbnNmZXIuPC9saT4KCSAqIAk8bGk+PGNvZGU+JGZpbGVfaGFuZGxlPC9jb2RlPiAtIDxjb2RlPnJlc291cmNlPC9jb2RlPiAtIFJlcXVpcmVkIC0gVGhlIGZpbGUgaGFuZGxlIHJlc291cmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uPC9saT4KCSAqIAk8bGk+PGNvZGU+JGxlbmd0aDwvY29kZT4gLSA8Y29kZT5pbnRlZ2VyPC9jb2RlPiAtIFJlcXVpcmVkIC0gVGhlIGxlbmd0aCBpbiBraWxvYnl0ZXMgb2YgdGhlIGRhdGEgY2h1bmsgdGhhdCB3YXMgdHJhbnNmZXJyZWQuPC9saT4KCSAqIDwvdWw+CgkgKgoJICogQHBhcmFtIHN0cmluZ3xhcnJheXxmdW5jdGlvbiAkY2FsbGJhY2sgKFJlcXVpcmVkKSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IDxwaHA6Y2FsbF91c2VyX2Z1bmMoKT4sIHNvIHlvdSBjYW4gcGFzcyB0aGUgZm9sbG93aW5nIHZhbHVlczogPHVsPgoJICogCTxsaT5UaGUgbmFtZSBvZiBhIGdsb2JhbCBmdW5jdGlvbiB0byBleGVjdXRlLCBwYXNzZWQgYXMgYSBzdHJpbmcuPC9saT4KCSAqIAk8bGk+QSBtZXRob2QgdG8gZXhlY3V0ZSwgcGFzc2VkIGFzIDxjb2RlPmFycmF5KCdDbGFzc05hbWUnLCAnTWV0aG9kTmFtZScpPC9jb2RlPi48L2xpPgoJICogCTxsaT5BbiBhbm9ueW1vdXMgZnVuY3Rpb24gKFBIUCA1LjMrKS48L2xpPjwvdWw+CgkgKiBAcmV0dXJuICR0aGlzIEEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJfc3RyZWFtaW5nX3JlYWRfY2FsbGJhY2soJGNhbGxiYWNrKQoJewoJCSR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ19yZWFkX2NhbGxiYWNrID0gJGNhbGxiYWNrOwoKCQlyZXR1cm4gJHRoaXM7Cgl9CgoJLyoqCgkgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbmV2ZXIgYSBkYXRhIHN0cmVhbSBpcyB3cml0dGVuIHRvIHVzaW5nCgkgKiA8Q0ZSZXF1ZXN0OjpzdHJlYW1pbmdfd3JpdGVfY2FsbGJhY2soKT4uCgkgKgoJICogVGhlIHVzZXItZGVmaW5lZCBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IHR3byBhcmd1bWVudHM6CgkgKgoJICogPHVsPgoJICogCTxsaT48Y29kZT4kY3VybF9oYW5kbGU8L2NvZGU+IC0gPGNvZGU+cmVzb3VyY2U8L2NvZGU+IC0gUmVxdWlyZWQgLSBUaGUgY1VSTCBoYW5kbGUgcmVzb3VyY2UgdGhhdCByZXByZXNlbnRzIHRoZSBpbi1wcm9ncmVzcyB0cmFuc2Zlci48L2xpPgoJICogCTxsaT48Y29kZT4kbGVuZ3RoPC9jb2RlPiAtIDxjb2RlPmludGVnZXI8L2NvZGU+IC0gUmVxdWlyZWQgLSBUaGUgbGVuZ3RoIGluIGtpbG9ieXRlcyBvZiB0aGUgZGF0YSBjaHVuayB0aGF0IHdhcyB0cmFuc2ZlcnJlZC48L2xpPgoJICogPC91bD4KCSAqCgkgKiBAcGFyYW0gc3RyaW5nfGFycmF5fGZ1bmN0aW9uICRjYWxsYmFjayAoUmVxdWlyZWQpIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgPHBocDpjYWxsX3VzZXJfZnVuYygpPiwgc28geW91IGNhbiBwYXNzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiA8dWw+CgkgKiAJPGxpPlRoZSBuYW1lIG9mIGEgZ2xvYmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUsIHBhc3NlZCBhcyBhIHN0cmluZy48L2xpPgoJICogCTxsaT5BIG1ldGhvZCB0byBleGVjdXRlLCBwYXNzZWQgYXMgPGNvZGU+YXJyYXkoJ0NsYXNzTmFtZScsICdNZXRob2ROYW1lJyk8L2NvZGU+LjwvbGk+CgkgKiAJPGxpPkFuIGFub255bW91cyBmdW5jdGlvbiAoUEhQIDUuMyspLjwvbGk+PC91bD4KCSAqIEByZXR1cm4gJHRoaXMgQSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlcl9zdHJlYW1pbmdfd3JpdGVfY2FsbGJhY2soJGNhbGxiYWNrKQoJewoJCSR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ193cml0ZV9jYWxsYmFjayA9ICRjYWxsYmFjazsKCgkJcmV0dXJuICR0aGlzOwoJfQoKCgkvKiUqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiolKi8KCS8vIFBSRVBBUkUsIFNFTkQsIEFORCBQUk9DRVNTIFJFUVVFU1QKCgkvKioKCSAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGJ5IGNVUkwgZm9yIHN0cmVhbWluZyB1cC4KCSAqCgkgKiBAcGFyYW0gcmVzb3VyY2UgJGN1cmxfaGFuZGxlIChSZXF1aXJlZCkgVGhlIGNVUkwgaGFuZGxlIGZvciB0aGUgcmVxdWVzdC4KCSAqIEBwYXJhbSByZXNvdXJjZSAkZmlsZV9oYW5kbGUgKFJlcXVpcmVkKSBUaGUgb3BlbiBmaWxlIGhhbmRsZSByZXNvdXJjZS4KCSAqIEBwYXJhbSBpbnRlZ2VyICRsZW5ndGggKFJlcXVpcmVkKSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KCSAqIEByZXR1cm4gYmluYXJ5IEJpbmFyeSBkYXRhIGZyb20gYSBzdHJlYW0uCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBzdHJlYW1pbmdfcmVhZF9jYWxsYmFjaygkY3VybF9oYW5kbGUsICRmaWxlX2hhbmRsZSwgJGxlbmd0aCkKCXsKCQkvLyBPbmNlIHdlJ3ZlIHNlbnQgYXMgbXVjaCBhcyB3ZSdyZSBzdXBwb3NlZCB0byBzZW5kLi4uCgkJaWYgKCR0aGlzLT5yZWFkX3N0cmVhbV9yZWFkID49ICR0aGlzLT5yZWFkX3N0cmVhbV9zaXplKQoJCXsKCQkJLy8gU2VuZCBFT0YKCQkJcmV0dXJuICcnOwoJCX0KCgkJLy8gSWYgd2UncmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiB1cGxvYWQgYW5kIG5lZWQgdG8gc2Vlay4uLgoJCWlmICgkdGhpcy0+cmVhZF9zdHJlYW1fcmVhZCA9PSAwICYmIGlzc2V0KCR0aGlzLT5zZWVrX3Bvc2l0aW9uKSAmJiAkdGhpcy0+c2Vla19wb3NpdGlvbiAhPT0gZnRlbGwoJHRoaXMtPnJlYWRfc3RyZWFtKSkKCQl7CgkJCWlmIChmc2VlaygkdGhpcy0+cmVhZF9zdHJlYW0sICR0aGlzLT5zZWVrX3Bvc2l0aW9uKSAhPT0gMCkKCQkJewoJCQkJdGhyb3cgbmV3IFJlcXVlc3RDb3JlX0V4Y2VwdGlvbignVGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IHNlZWtpbmcgYW5kIGlzIGVpdGhlciBub3QgYXQgdGhlIHJlcXVlc3RlZCBwb3NpdGlvbiBvciB0aGUgcG9zaXRpb24gaXMgdW5rbm93bi4nKTsKCQkJfQoJCX0KCgkJJHJlYWQgPSBmcmVhZCgkdGhpcy0+cmVhZF9zdHJlYW0sIG1pbigkdGhpcy0+cmVhZF9zdHJlYW1fc2l6ZSAtICR0aGlzLT5yZWFkX3N0cmVhbV9yZWFkLCAkbGVuZ3RoKSk7IC8vIFJlbWFpbmluZyB1cGxvYWQgZGF0YSBvciBjVVJMJ3MgcmVxdWVzdGVkIGNodW5rIHNpemUKCQkkdGhpcy0+cmVhZF9zdHJlYW1fcmVhZCArPSBzdHJsZW4oJHJlYWQpOwoKCQkkb3V0ID0gJHJlYWQgPT09IGZhbHNlID8gJycgOiAkcmVhZDsKCgkJLy8gRXhlY3V0ZSBjYWxsYmFjayBmdW5jdGlvbgoJCWlmICgkdGhpcy0+cmVnaXN0ZXJlZF9zdHJlYW1pbmdfcmVhZF9jYWxsYmFjaykKCQl7CgkJCWNhbGxfdXNlcl9mdW5jKCR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ19yZWFkX2NhbGxiYWNrLCAkY3VybF9oYW5kbGUsICRmaWxlX2hhbmRsZSwgJG91dCk7CgkJfQoKCQlyZXR1cm4gJG91dDsKCX0KCgkvKioKCSAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIGJ5IGNVUkwgZm9yIHN0cmVhbWluZyBkb3duLgoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkY3VybF9oYW5kbGUgKFJlcXVpcmVkKSBUaGUgY1VSTCBoYW5kbGUgZm9yIHRoZSByZXF1ZXN0LgoJICogQHBhcmFtIGJpbmFyeSAkZGF0YSAoUmVxdWlyZWQpIFRoZSBkYXRhIHRvIHdyaXRlLgoJICogQHJldHVybiBpbnRlZ2VyIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHN0cmVhbWluZ193cml0ZV9jYWxsYmFjaygkY3VybF9oYW5kbGUsICRkYXRhKQoJewoJCSRsZW5ndGggPSBzdHJsZW4oJGRhdGEpOwoJCSR3cml0dGVuX3RvdGFsID0gMDsKCQkkd3JpdHRlbl9sYXN0ID0gMDsKCgkJd2hpbGUgKCR3cml0dGVuX3RvdGFsIDwgJGxlbmd0aCkKCQl7CgkJCSR3cml0dGVuX2xhc3QgPSBmd3JpdGUoJHRoaXMtPndyaXRlX3N0cmVhbSwgc3Vic3RyKCRkYXRhLCAkd3JpdHRlbl90b3RhbCkpOwoKCQkJaWYgKCR3cml0dGVuX2xhc3QgPT09IGZhbHNlKQoJCQl7CgkJCQlyZXR1cm4gJHdyaXR0ZW5fdG90YWw7CgkJCX0KCgkJCSR3cml0dGVuX3RvdGFsICs9ICR3cml0dGVuX2xhc3Q7CgkJfQoKCQkvLyBFeGVjdXRlIGNhbGxiYWNrIGZ1bmN0aW9uCgkJaWYgKCR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ193cml0ZV9jYWxsYmFjaykKCQl7CgkJCWNhbGxfdXNlcl9mdW5jKCR0aGlzLT5yZWdpc3RlcmVkX3N0cmVhbWluZ193cml0ZV9jYWxsYmFjaywgJGN1cmxfaGFuZGxlLCAkd3JpdHRlbl90b3RhbCk7CgkJfQoKCQlyZXR1cm4gJHdyaXR0ZW5fdG90YWw7Cgl9CgoJLyoqCgkgKiBQcmVwYXJlcyBhbmQgYWRkcyB0aGUgZGV0YWlscyBvZiB0aGUgY1VSTCByZXF1ZXN0LiBUaGlzIGNhbiBiZSBwYXNzZWQgYWxvbmcgdG8gYSA8cGhwOmN1cmxfbXVsdGlfZXhlYygpPgoJICogZnVuY3Rpb24uCgkgKgoJICogQHJldHVybiByZXNvdXJjZSBUaGUgaGFuZGxlIGZvciB0aGUgY1VSTCBvYmplY3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBwcmVwX3JlcXVlc3QoKQoJewoJCSRjdXJsX2hhbmRsZSA9IGN1cmxfaW5pdCgpOwoKCQkvLyBTZXQgZGVmYXVsdCBvcHRpb25zLgoJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9VUkwsICR0aGlzLT5yZXF1ZXN0X3VybCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0ZJTEVUSU1FLCB0cnVlKTsKCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfRlJFU0hfQ09OTkVDVCwgZmFsc2UpOwoJCWlmICggaXNfbG9uZyggQ1VSTE9QVF9DTE9TRVBPTElDWSApICkgeyAvLyBOb3QgYXZhaWxhYmxlIG9uIHNvbWUgc3lzdGVtcyByZXN1bHRpbmcgaW4gd2FybmluZy4gU2VlIHplbmRlc2sgdGlja2V0IDE1OTI2LgoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfQ0xPU0VQT0xJQ1ksIENVUkxDTE9TRVBPTElDWV9MRUFTVF9SRUNFTlRMWV9VU0VEKTsKCQl9CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX01BWFJFRElSUywgNSk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0hFQURFUiwgdHJ1ZSk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfVElNRU9VVCwgNTE4NDAwMCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAxMjApOwoJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9OT1NJR05BTCwgdHJ1ZSk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1JFRkVSRVIsICR0aGlzLT5yZXF1ZXN0X3VybCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1VTRVJBR0VOVCwgJHRoaXMtPnVzZXJhZ2VudCk7CgkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgYXJyYXkoJHRoaXMsICdzdHJlYW1pbmdfcmVhZF9jYWxsYmFjaycpKTsKCgkJLy8gVmVyaWZpY2F0aW9uIG9mIHRoZSBTU0wgY2VydAoJCWlmICgkdGhpcy0+c3NsX3ZlcmlmaWNhdGlvbikKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgdHJ1ZSk7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMik7CgkJfQoJCWVsc2UKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgZmFsc2UpOwoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIGZhbHNlKTsKCQl9CgoJCS8vIGNobW9kIHRoZSBmaWxlIGFzIDA3NTUKCQlpZiAoJHRoaXMtPmNhY2VydF9sb2NhdGlvbiA9PT0gdHJ1ZSkKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9DQUlORk8sIGRpcm5hbWUoX19GSUxFX18pIC4gJy9jYWNlcnQucGVtJyk7CgkJfQoJCWVsc2VpZiAoaXNfc3RyaW5nKCR0aGlzLT5jYWNlcnRfbG9jYXRpb24pKQoJCXsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0NBSU5GTywgJHRoaXMtPmNhY2VydF9sb2NhdGlvbik7CgkJfQoKCQkvLyBEZWJ1ZyBtb2RlCgkJaWYgKCR0aGlzLT5kZWJ1Z19tb2RlKQoJCXsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1ZFUkJPU0UsIHRydWUpOwoJCX0KCgkJLy8gSGFuZGxlIG9wZW5fYmFzZWRpciAmIHNhZmUgbW9kZQoJCWlmICghaW5pX2dldCgnc2FmZV9tb2RlJykgJiYgIWluaV9nZXQoJ29wZW5fYmFzZWRpcicpKQoJCXsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsKCQl9CgoJCS8vIEVuYWJsZSBhIHByb3h5IGNvbm5lY3Rpb24gaWYgcmVxdWVzdGVkLgoJCWlmICgkdGhpcy0+cHJveHkpCgkJewoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfSFRUUFBST1hZVFVOTkVMLCB0cnVlKTsKCgkJCSRob3N0ID0gJHRoaXMtPnByb3h5Wydob3N0J107CgkJCSRob3N0IC49ICgkdGhpcy0+cHJveHlbJ3BvcnQnXSkgPyAnOicgLiAkdGhpcy0+cHJveHlbJ3BvcnQnXSA6ICcnOwoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUFJPWFksICRob3N0KTsKCgkJCWlmIChpc3NldCgkdGhpcy0+cHJveHlbJ3VzZXInXSkgJiYgaXNzZXQoJHRoaXMtPnByb3h5WydwYXNzJ10pKQoJCQl7CgkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUFJPWFlVU0VSUFdELCAkdGhpcy0+cHJveHlbJ3VzZXInXSAuICc6JyAuICR0aGlzLT5wcm94eVsncGFzcyddKTsKCQkJfQoJCX0KCgkJLy8gU2V0IGNyZWRlbnRpYWxzIGZvciBIVFRQIEJhc2ljL0RpZ2VzdCBBdXRoZW50aWNhdGlvbi4KCQlpZiAoJHRoaXMtPnVzZXJuYW1lICYmICR0aGlzLT5wYXNzd29yZCkKCQl7CgkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9IVFRQQVVUSCwgQ1VSTEFVVEhfQU5ZKTsKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1VTRVJQV0QsICR0aGlzLT51c2VybmFtZSAuICc6JyAuICR0aGlzLT5wYXNzd29yZCk7CgkJfQoKCQkvLyBIYW5kbGUgdGhlIGVuY29kaW5nIGlmIHdlIGNhbi4KCQlpZiAoJHRoaXMtPnVzZV9nemlwX2VuY29uZGluZyAmJiBleHRlbnNpb25fbG9hZGVkKCd6bGliJykpCgkJewoJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfRU5DT0RJTkcsICdnemlwLCBkZWZsYXRlJyk7CgkJfQoKCQkvLyBQcm9jZXNzIGN1c3RvbSBoZWFkZXJzCgkJaWYgKGlzc2V0KCR0aGlzLT5yZXF1ZXN0X2hlYWRlcnMpICYmIGNvdW50KCR0aGlzLT5yZXF1ZXN0X2hlYWRlcnMpKQoJCXsKCQkJJHRlbXBfaGVhZGVycyA9IGFycmF5KCk7CgoJCQlpZiAoIWFycmF5X2tleV9leGlzdHMoJ0V4cGVjdCcsICR0aGlzLT5yZXF1ZXN0X2hlYWRlcnMpKQoJCQl7CgkJCQkkdGhpcy0+cmVxdWVzdF9oZWFkZXJzWydFeHBlY3QnXSA9ICcnOwoJCQl9CgoJCQlmb3JlYWNoICgkdGhpcy0+cmVxdWVzdF9oZWFkZXJzIGFzICRrID0+ICR2KQoJCQl7CgkJCQkkdGVtcF9oZWFkZXJzW10gPSAkayAuICc6ICcgLiAkdjsKCQkJfQoKCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0hUVFBIRUFERVIsICR0ZW1wX2hlYWRlcnMpOwoJCX0KCgkJc3dpdGNoICgkdGhpcy0+bWV0aG9kKQoJCXsKCQkJY2FzZSBzZWxmOjpIVFRQX1BVVDoKCQkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCAnUFVUJyk7CgkJCQlpZiAoaXNzZXQoJHRoaXMtPnJlYWRfc3RyZWFtKSkKCQkJCXsKCQkJCQlpZiAoIWlzc2V0KCR0aGlzLT5yZWFkX3N0cmVhbV9zaXplKSB8fCAkdGhpcy0+cmVhZF9zdHJlYW1fc2l6ZSA8IDApCgkJCQkJewoJCQkJCQl0aHJvdyBuZXcgUmVxdWVzdENvcmVfRXhjZXB0aW9uKCdUaGUgc3RyZWFtIHNpemUgZm9yIHRoZSBzdHJlYW1pbmcgdXBsb2FkIGNhbm5vdCBiZSBkZXRlcm1pbmVkLicpOwoJCQkJCX0KCgkJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX0lORklMRVNJWkUsICR0aGlzLT5yZWFkX3N0cmVhbV9zaXplKTsKCQkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfVVBMT0FELCB0cnVlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPnJlcXVlc3RfYm9keSk7CgkJCQl9CgkJCQlicmVhazsKCgkJCWNhc2Ugc2VsZjo6SFRUUF9QT1NUOgoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1BPU1QsIHRydWUpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0X2JvZHkpOwoJCQkJYnJlYWs7CgoJCQljYXNlIHNlbGY6OkhUVFBfSEVBRDoKCQkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBzZWxmOjpIVFRQX0hFQUQpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX05PQk9EWSwgMSk7CgkJCQlicmVhazsKCgkJCWRlZmF1bHQ6IC8vIEFzc3VtZWQgR0VUCgkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgJHRoaXMtPm1ldGhvZCk7CgkJCQlpZiAoaXNzZXQoJHRoaXMtPndyaXRlX3N0cmVhbSkpCgkJCQl7CgkJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGFycmF5KCR0aGlzLCAnc3RyZWFtaW5nX3dyaXRlX2NhbGxiYWNrJykpOwoJCQkJCWN1cmxfc2V0b3B0KCRjdXJsX2hhbmRsZSwgQ1VSTE9QVF9IRUFERVIsIGZhbHNlKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQljdXJsX3NldG9wdCgkY3VybF9oYW5kbGUsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPnJlcXVlc3RfYm9keSk7CgkJCQl9CgkJCQlicmVhazsKCQl9CgoJCS8vIE1lcmdlIGluIHRoZSBDVVJMT1BUcwoJCWlmIChpc3NldCgkdGhpcy0+Y3VybG9wdHMpICYmIHNpemVvZigkdGhpcy0+Y3VybG9wdHMpID4gMCkKCQl7CgkJCWZvcmVhY2ggKCR0aGlzLT5jdXJsb3B0cyBhcyAkayA9PiAkdikKCQkJewoJCQkJY3VybF9zZXRvcHQoJGN1cmxfaGFuZGxlLCAkaywgJHYpOwoJCQl9CgkJfQoKCQlyZXR1cm4gJGN1cmxfaGFuZGxlOwoJfQoKCS8qKgoJICogVGFrZSB0aGUgcG9zdC1wcm9jZXNzZWQgY1VSTCBkYXRhIGFuZCBicmVhayBpdCBkb3duIGludG8gdXNlZnVsIGhlYWRlci9ib2R5L2luZm8gY2h1bmtzLiBVc2VzIHRoZQoJICogZGF0YSBzdG9yZWQgaW4gdGhlIGBjdXJsX2hhbmRsZWAgYW5kIGByZXNwb25zZWAgcHJvcGVydGllcyB1bmxlc3MgcmVwbGFjZW1lbnQgZGF0YSBpcyBwYXNzZWQgaW4gdmlhCgkgKiBwYXJhbWV0ZXJzLgoJICoKCSAqIEBwYXJhbSByZXNvdXJjZSAkY3VybF9oYW5kbGUgKE9wdGlvbmFsKSBUaGUgcmVmZXJlbmNlIHRvIHRoZSBhbHJlYWR5IGV4ZWN1dGVkIGNVUkwgcmVxdWVzdC4KCSAqIEBwYXJhbSBzdHJpbmcgJHJlc3BvbnNlIChPcHRpb25hbCkgVGhlIGFjdHVhbCByZXNwb25zZSBjb250ZW50IGl0c2VsZiB0aGF0IG5lZWRzIHRvIGJlIHBhcnNlZC4KCSAqIEByZXR1cm4gUmVzcG9uc2VDb3JlIEEgPFJlc3BvbnNlQ29yZT4gb2JqZWN0IGNvbnRhaW5pbmcgYSBwYXJzZWQgSFRUUCByZXNwb25zZS4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3NfcmVzcG9uc2UoJGN1cmxfaGFuZGxlID0gbnVsbCwgJHJlc3BvbnNlID0gbnVsbCkKCXsKCQkvLyBBY2NlcHQgYSBjdXN0b20gb25lIGlmIGl0J3MgcGFzc2VkLgoJCWlmICgkY3VybF9oYW5kbGUgJiYgJHJlc3BvbnNlKQoJCXsKCQkJJHRoaXMtPmN1cmxfaGFuZGxlID0gJGN1cmxfaGFuZGxlOwoJCQkkdGhpcy0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7CgkJfQoKCQkvLyBBcyBsb25nIGFzIHRoaXMgY2FtZSBiYWNrIGFzIGEgdmFsaWQgcmVzb3VyY2UuLi4KCQlpZiAoaXNfcmVzb3VyY2UoJHRoaXMtPmN1cmxfaGFuZGxlKSkKCQl7CgkJCS8vIERldGVybWluZSB3aGF0J3Mgd2hhdC4KCQkJJGhlYWRlcl9zaXplID0gY3VybF9nZXRpbmZvKCR0aGlzLT5jdXJsX2hhbmRsZSwgQ1VSTElORk9fSEVBREVSX1NJWkUpOwoJCQkkdGhpcy0+cmVzcG9uc2VfaGVhZGVycyA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2UsIDAsICRoZWFkZXJfc2l6ZSk7CgkJCSR0aGlzLT5yZXNwb25zZV9ib2R5ID0gc3Vic3RyKCR0aGlzLT5yZXNwb25zZSwgJGhlYWRlcl9zaXplKTsKCQkJJHRoaXMtPnJlc3BvbnNlX2NvZGUgPSBjdXJsX2dldGluZm8oJHRoaXMtPmN1cmxfaGFuZGxlLCBDVVJMSU5GT19IVFRQX0NPREUpOwoJCQkkdGhpcy0+cmVzcG9uc2VfaW5mbyA9IGN1cmxfZ2V0aW5mbygkdGhpcy0+Y3VybF9oYW5kbGUpOwoKCQkJLy8gUGFyc2Ugb3V0IHRoZSBoZWFkZXJzCgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzID0gZXhwbG9kZSgiXHJcblxyXG4iLCB0cmltKCR0aGlzLT5yZXNwb25zZV9oZWFkZXJzKSk7CgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzID0gYXJyYXlfcG9wKCR0aGlzLT5yZXNwb25zZV9oZWFkZXJzKTsKCQkJJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMgPSBleHBsb2RlKCJcclxuIiwgJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMpOwoJCQlhcnJheV9zaGlmdCgkdGhpcy0+cmVzcG9uc2VfaGVhZGVycyk7CgoJCQkvLyBMb29wIHRocm91Z2ggYW5kIHNwbGl0IHVwIHRoZSBoZWFkZXJzLgoJCQkkaGVhZGVyX2Fzc29jID0gYXJyYXkoKTsKCQkJZm9yZWFjaCAoJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMgYXMgJGhlYWRlcikKCQkJewoJCQkJJGt2ID0gZXhwbG9kZSgnOiAnLCAkaGVhZGVyKTsKCQkJCSRoZWFkZXJfYXNzb2Nbc3RydG9sb3dlcigka3ZbMF0pXSA9ICRrdlsxXTsKCQkJfQoKCQkJLy8gUmVzZXQgdGhlIGhlYWRlcnMgdG8gdGhlIGFwcHJvcHJpYXRlIHByb3BlcnR5LgoJCQkkdGhpcy0+cmVzcG9uc2VfaGVhZGVycyA9ICRoZWFkZXJfYXNzb2M7CgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzWydfaW5mbyddID0gJHRoaXMtPnJlc3BvbnNlX2luZm87CgkJCSR0aGlzLT5yZXNwb25zZV9oZWFkZXJzWydfaW5mbyddWydtZXRob2QnXSA9ICR0aGlzLT5tZXRob2Q7CgoJCQlpZiAoJGN1cmxfaGFuZGxlICYmICRyZXNwb25zZSkKCQkJewoJCQkJcmV0dXJuIG5ldyAkdGhpcy0+cmVzcG9uc2VfY2xhc3MoJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnMsICR0aGlzLT5yZXNwb25zZV9ib2R5LCAkdGhpcy0+cmVzcG9uc2VfY29kZSwgJHRoaXMtPmN1cmxfaGFuZGxlKTsKCQkJfQoJCX0KCgkJLy8gUmV0dXJuIGZhbHNlCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogU2VuZHMgdGhlIHJlcXVlc3QsIGNhbGxpbmcgbmVjZXNzYXJ5IHV0aWxpdHkgZnVuY3Rpb25zIHRvIHVwZGF0ZSBidWlsdC1pbiBwcm9wZXJ0aWVzLgoJICoKCSAqIEBwYXJhbSBib29sZWFuICRwYXJzZSAoT3B0aW9uYWwpIFdoZXRoZXIgdG8gcGFyc2UgdGhlIHJlc3BvbnNlIHdpdGggUmVzcG9uc2VDb3JlIG9yIG5vdC4KCSAqIEByZXR1cm4gc3RyaW5nIFRoZSByZXN1bHRpbmcgdW5wYXJzZWQgZGF0YSBmcm9tIHRoZSByZXF1ZXN0LgoJICovCglwdWJsaWMgZnVuY3Rpb24gc2VuZF9yZXF1ZXN0KCRwYXJzZSA9IGZhbHNlKQoJewoJCWlmICgkdGhpcy0+YWxsb3dfc2V0X3RpbWVfbGltaXQpCgkJewoJCQlzZXRfdGltZV9saW1pdCgwKTsKCQl9CgoJCSRjdXJsX2hhbmRsZSA9ICR0aGlzLT5wcmVwX3JlcXVlc3QoKTsKCQkkdGhpcy0+cmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGN1cmxfaGFuZGxlKTsKCgkJaWYgKCR0aGlzLT5yZXNwb25zZSA9PT0gZmFsc2UpCgkJewoJCQl0aHJvdyBuZXcgY1VSTF9FeGNlcHRpb24oJ2NVUkwgcmVzb3VyY2U6ICcgLiAoc3RyaW5nKSAkY3VybF9oYW5kbGUgLiAnOyBjVVJMIGVycm9yOiAnIC4gY3VybF9lcnJvcigkY3VybF9oYW5kbGUpIC4gJyAoY1VSTCBlcnJvciBjb2RlICcgLiBjdXJsX2Vycm5vKCRjdXJsX2hhbmRsZSkgLiAnKS4gU2VlIGh0dHA6Ly9jdXJsLmhheHguc2UvbGliY3VybC9jL2xpYmN1cmwtZXJyb3JzLmh0bWwgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGVycm9yIGNvZGVzLicpOwoJCX0KCgkJJHBhcnNlZF9yZXNwb25zZSA9ICR0aGlzLT5wcm9jZXNzX3Jlc3BvbnNlKCRjdXJsX2hhbmRsZSwgJHRoaXMtPnJlc3BvbnNlKTsKCgkJY3VybF9jbG9zZSgkY3VybF9oYW5kbGUpOwoKCQlpZiAoJHBhcnNlKQoJCXsKCQkJcmV0dXJuICRwYXJzZWRfcmVzcG9uc2U7CgkJfQoKCQlyZXR1cm4gJHRoaXMtPnJlc3BvbnNlOwoJfQoKCS8qKgoJICogU2VuZHMgdGhlIHJlcXVlc3QgdXNpbmcgPHBocDpjdXJsX211bHRpX2V4ZWMoKT4sIGVuYWJsaW5nIHBhcmFsbGVsIHJlcXVlc3RzLiBVc2VzIHRoZSAicm9sbGluZyIgbWV0aG9kLgoJICoKCSAqIEBwYXJhbSBhcnJheSAkaGFuZGxlcyAoUmVxdWlyZWQpIEFuIGluZGV4ZWQgYXJyYXkgb2YgY1VSTCBoYW5kbGVzIHRvIHByb2Nlc3Mgc2ltdWx0YW5lb3VzbHkuCgkgKiBAcGFyYW0gYXJyYXkgJG9wdCAoT3B0aW9uYWwpIEFuIGFzc29jaWF0aXZlIGFycmF5IG9mIHBhcmFtZXRlcnMgdGhhdCBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGtleXM6IDx1bD4KCSAqIAk8bGk+PGNvZGU+Y2FsbGJhY2s8L2NvZGU+IC0gPGNvZGU+c3RyaW5nfGFycmF5PC9jb2RlPiAtIE9wdGlvbmFsIC0gVGhlIHN0cmluZyBuYW1lIG9mIGEgZnVuY3Rpb24gdG8gcGFzcyB0aGUgcmVzcG9uc2UgZGF0YSB0by4gSWYgdGhpcyBpcyBhIG1ldGhvZCwgcGFzcyBhbiBhcnJheSB3aGVyZSB0aGUgPGNvZGU+WzBdPC9jb2RlPiBpbmRleCBpcyB0aGUgY2xhc3MgYW5kIHRoZSA8Y29kZT5bMV08L2NvZGU+IGluZGV4IGlzIHRoZSBtZXRob2QgbmFtZS48L2xpPgoJICogCTxsaT48Y29kZT5saW1pdDwvY29kZT4gLSA8Y29kZT5pbnRlZ2VyPC9jb2RlPiAtIE9wdGlvbmFsIC0gVGhlIG51bWJlciBvZiBzaW11bHRhbmVvdXMgcmVxdWVzdHMgdG8gbWFrZS4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBzY2FsaW5nIGFyb3VuZCBzbG93IHNlcnZlciByZXNwb25zZXMuIERlZmF1bHRzIHRvIHRydXN0aW5nIGNVUkxzIGp1ZGdlbWVudCBhcyB0byBob3cgbWFueSB0byB1c2UuPC9saT48L3VsPgoJICogQHJldHVybiBhcnJheSBQb3N0LXByb2Nlc3NlZCBjVVJMIHJlc3BvbnNlcy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIHNlbmRfbXVsdGlfcmVxdWVzdCgkaGFuZGxlcywgJG9wdCA9IG51bGwpCgl7CgkJaWYgKCR0aGlzLT5hbGxvd19zZXRfdGltZV9saW1pdCkKCQl7CgkJCXNldF90aW1lX2xpbWl0KDApOwoJCX0KCgkJLy8gU2tpcCBldmVyeXRoaW5nIGlmIHRoZXJlIGFyZSBubyBoYW5kbGVzIHRvIHByb2Nlc3MuCgkJaWYgKGNvdW50KCRoYW5kbGVzKSA9PT0gMCkgcmV0dXJuIGFycmF5KCk7CgoJCWlmICghJG9wdCkgJG9wdCA9IGFycmF5KCk7CgoJCS8vIEluaXRpYWxpemUgYW55IG1pc3Npbmcgb3B0aW9ucwoJCSRsaW1pdCA9IGlzc2V0KCRvcHRbJ2xpbWl0J10pID8gJG9wdFsnbGltaXQnXSA6IC0xOwoKCQkvLyBJbml0aWFsaXplCgkJJGhhbmRsZV9saXN0ID0gJGhhbmRsZXM7CgkJJGh0dHAgPSBuZXcgJHRoaXMtPnJlcXVlc3RfY2xhc3MoKTsKCQkkbXVsdGlfaGFuZGxlID0gY3VybF9tdWx0aV9pbml0KCk7CgkJJGhhbmRsZXNfcG9zdCA9IGFycmF5KCk7CgkJJGFkZGVkID0gY291bnQoJGhhbmRsZXMpOwoJCSRsYXN0X2hhbmRsZSA9IG51bGw7CgkJJGNvdW50ID0gMDsKCQkkaSA9IDA7CgoJCS8vIExvb3AgdGhyb3VnaCB0aGUgY1VSTCBoYW5kbGVzIGFuZCBhZGQgYXMgbWFueSBhcyBpdCBzZXQgYnkgdGhlIGxpbWl0IHBhcmFtZXRlci4KCQl3aGlsZSAoJGkgPCAkYWRkZWQpCgkJewoJCQlpZiAoJGxpbWl0ID4gMCAmJiAkaSA+PSAkbGltaXQpIGJyZWFrOwoJCQljdXJsX211bHRpX2FkZF9oYW5kbGUoJG11bHRpX2hhbmRsZSwgYXJyYXlfc2hpZnQoJGhhbmRsZXMpKTsKCQkJJGkrKzsKCQl9CgoJCWRvCgkJewoJCQkkYWN0aXZlID0gZmFsc2U7CgoJCQkvLyBTdGFydCBleGVjdXRpbmcgYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UuCgkJCXdoaWxlICgoJHN0YXR1cyA9IGN1cmxfbXVsdGlfZXhlYygkbXVsdGlfaGFuZGxlLCAkYWN0aXZlKSkgPT09IENVUkxNX0NBTExfTVVMVElfUEVSRk9STSkKCQkJewoJCQkJLy8gU3RhcnQgbG9va2luZyBmb3IgcG9zc2libGUgcmVzcG9uc2VzIGltbWVkaWF0ZWx5IHdoZW4gd2UgaGF2ZSB0byBhZGQgbW9yZSBoYW5kbGVzCgkJCQlpZiAoY291bnQoJGhhbmRsZXMpID4gMCkgYnJlYWs7CgkJCX0KCgkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggcmVxdWVzdHMgZmluaXNoZWQuCgkJCSR0b19wcm9jZXNzID0gYXJyYXkoKTsKCgkJCXdoaWxlICgkZG9uZSA9IGN1cmxfbXVsdGlfaW5mb19yZWFkKCRtdWx0aV9oYW5kbGUpKQoJCQl7CgkJCQkvLyBTaW5jZSBjdXJsX2Vycm5vKCkgaXNuJ3QgcmVsaWFibGUgZm9yIGhhbmRsZXMgdGhhdCB3ZXJlIGluIG11bHRpcmVxdWVzdHMsIHdlIGNoZWNrIHRoZSAncmVzdWx0JyBvZiB0aGUgaW5mbyByZWFkLCB3aGljaCBjb250YWlucyB0aGUgY3VybCBlcnJvciBudW1iZXIsIChsaXN0ZWQgaGVyZSBodHRwOi8vY3VybC5oYXh4LnNlL2xpYmN1cmwvYy9saWJjdXJsLWVycm9ycy5odG1sICkKCQkJCWlmICgkZG9uZVsncmVzdWx0J10gPiAwKQoJCQkJewoJCQkJCXRocm93IG5ldyBjVVJMX011bHRpX0V4Y2VwdGlvbignY1VSTCByZXNvdXJjZTogJyAuIChzdHJpbmcpICRkb25lWydoYW5kbGUnXSAuICc7IGNVUkwgZXJyb3I6ICcgLiBjdXJsX2Vycm9yKCRkb25lWydoYW5kbGUnXSkgLiAnIChjVVJMIGVycm9yIGNvZGUgJyAuICRkb25lWydyZXN1bHQnXSAuICcpLiBTZWUgaHR0cDovL2N1cmwuaGF4eC5zZS9saWJjdXJsL2MvbGliY3VybC1lcnJvcnMuaHRtbCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgZXJyb3IgY29kZXMuJyk7CgkJCQl9CgoJCQkJLy8gQmVjYXVzZSBjdXJsX211bHRpX2luZm9fcmVhZCgpIG1pZ2h0IHJldHVybiBtb3JlIHRoYW4gb25lIG1lc3NhZ2UgYWJvdXQgYSByZXF1ZXN0LCB3ZSBjaGVjayB0byBzZWUgaWYgdGhpcyByZXF1ZXN0IGlzIGFscmVhZHkgaW4gb3VyIGFycmF5IG9mIGNvbXBsZXRlZCByZXF1ZXN0cwoJCQkJZWxzZWlmICghaXNzZXQoJHRvX3Byb2Nlc3NbKGludCkgJGRvbmVbJ2hhbmRsZSddXSkpCgkJCQl7CgkJCQkJJHRvX3Byb2Nlc3NbKGludCkgJGRvbmVbJ2hhbmRsZSddXSA9ICRkb25lOwoJCQkJfQoJCQl9CgoJCQkvLyBBY3R1YWxseSBkZWFsIHdpdGggdGhlIHJlcXVlc3QKCQkJZm9yZWFjaCAoJHRvX3Byb2Nlc3MgYXMgJHBrZXkgPT4gJGRvbmUpCgkJCXsKCQkJCSRyZXNwb25zZSA9ICRodHRwLT5wcm9jZXNzX3Jlc3BvbnNlKCRkb25lWydoYW5kbGUnXSwgY3VybF9tdWx0aV9nZXRjb250ZW50KCRkb25lWydoYW5kbGUnXSkpOwoJCQkJJGtleSA9IGFycmF5X3NlYXJjaCgkZG9uZVsnaGFuZGxlJ10sICRoYW5kbGVfbGlzdCwgdHJ1ZSk7CgkJCQkkaGFuZGxlc19wb3N0WyRrZXldID0gJHJlc3BvbnNlOwoKCQkJCWlmIChjb3VudCgkaGFuZGxlcykgPiAwKQoJCQkJewoJCQkJCWN1cmxfbXVsdGlfYWRkX2hhbmRsZSgkbXVsdGlfaGFuZGxlLCBhcnJheV9zaGlmdCgkaGFuZGxlcykpOwoJCQkJfQoKCQkJCWN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgkbXVsdGlfaGFuZGxlLCAkZG9uZVsnaGFuZGxlJ10pOwoJCQkJY3VybF9jbG9zZSgkZG9uZVsnaGFuZGxlJ10pOwoJCQl9CgkJfQoJCXdoaWxlICgkYWN0aXZlIHx8IGNvdW50KCRoYW5kbGVzX3Bvc3QpIDwgJGFkZGVkKTsKCgkJY3VybF9tdWx0aV9jbG9zZSgkbXVsdGlfaGFuZGxlKTsKCgkJa3NvcnQoJGhhbmRsZXNfcG9zdCwgU09SVF9OVU1FUklDKTsKCQlyZXR1cm4gJGhhbmRsZXNfcG9zdDsKCX0KCgoJLyolKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJSovCgkvLyBSRVNQT05TRSBNRVRIT0RTCgoJLyoqCgkgKiBHZXQgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyBmcm9tIHRoZSByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBzdHJpbmcgJGhlYWRlciAoT3B0aW9uYWwpIEEgc3BlY2lmaWMgaGVhZGVyIHZhbHVlIHRvIHJldHVybi4gRGVmYXVsdHMgdG8gYWxsIGhlYWRlcnMuCgkgKiBAcmV0dXJuIHN0cmluZ3xhcnJheSBBbGwgb3Igc2VsZWN0ZWQgaGVhZGVyIHZhbHVlcy4KCSAqLwoJcHVibGljIGZ1bmN0aW9uIGdldF9yZXNwb25zZV9oZWFkZXIoJGhlYWRlciA9IG51bGwpCgl7CgkJaWYgKCRoZWFkZXIpCgkJewoJCQlyZXR1cm4gJHRoaXMtPnJlc3BvbnNlX2hlYWRlcnNbc3RydG9sb3dlcigkaGVhZGVyKV07CgkJfQoJCXJldHVybiAkdGhpcy0+cmVzcG9uc2VfaGVhZGVyczsKCX0KCgkvKioKCSAqIEdldCB0aGUgSFRUUCByZXNwb25zZSBib2R5IGZyb20gdGhlIHJlcXVlc3QuCgkgKgoJICogQHJldHVybiBzdHJpbmcgVGhlIHJlc3BvbnNlIGJvZHkuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRfcmVzcG9uc2VfYm9keSgpCgl7CgkJcmV0dXJuICR0aGlzLT5yZXNwb25zZV9ib2R5OwoJfQoKCS8qKgoJICogR2V0IHRoZSBIVFRQIHJlc3BvbnNlIGNvZGUgZnJvbSB0aGUgcmVxdWVzdC4KCSAqCgkgKiBAcmV0dXJuIHN0cmluZyBUaGUgSFRUUCByZXNwb25zZSBjb2RlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gZ2V0X3Jlc3BvbnNlX2NvZGUoKQoJewoJCXJldHVybiAkdGhpcy0+cmVzcG9uc2VfY29kZTsKCX0KfQoKCi8qKgogKiBDb250YWluZXIgZm9yIGFsbCByZXNwb25zZS1yZWxhdGVkIG1ldGhvZHMuCiAqLwpjbGFzcyBSZXNwb25zZUNvcmUKewoJLyoqCgkgKiBTdG9yZXMgdGhlIEhUVFAgaGVhZGVyIGluZm9ybWF0aW9uLgoJICovCglwdWJsaWMgJGhlYWRlcjsKCgkvKioKCSAqIFN0b3JlcyB0aGUgU2ltcGxlWE1MIHJlc3BvbnNlLgoJICovCglwdWJsaWMgJGJvZHk7CgoJLyoqCgkgKiBTdG9yZXMgdGhlIEhUVFAgcmVzcG9uc2UgY29kZS4KCSAqLwoJcHVibGljICRzdGF0dXM7CgoJLyoqCgkgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCgkgKgoJICogQHBhcmFtIGFycmF5ICRoZWFkZXIgKFJlcXVpcmVkKSBBc3NvY2lhdGl2ZSBhcnJheSBvZiBIVFRQIGhlYWRlcnMgKHR5cGljYWxseSByZXR1cm5lZCBieSA8UmVxdWVzdENvcmU6OmdldF9yZXNwb25zZV9oZWFkZXIoKT4pLgoJICogQHBhcmFtIHN0cmluZyAkYm9keSAoUmVxdWlyZWQpIFhNTC1mb3JtYXR0ZWQgcmVzcG9uc2UgZnJvbSBBV1MuCgkgKiBAcGFyYW0gaW50ZWdlciAkc3RhdHVzIChPcHRpb25hbCkgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBmcm9tIHRoZSByZXF1ZXN0LgoJICogQHJldHVybiBvYmplY3QgQ29udGFpbnMgYW4gPHBocDphcnJheT4gYGhlYWRlcmAgcHJvcGVydHkgKEhUVFAgaGVhZGVycyBhcyBhbiBhc3NvY2lhdGl2ZSBhcnJheSksIGEgPHBocDpTaW1wbGVYTUxFbGVtZW50PiBvciA8cGhwOnN0cmluZz4gYGJvZHlgIHByb3BlcnR5LCBhbmQgYW4gPHBocDppbnRlZ2VyPiBgc3RhdHVzYCBjb2RlLgoJICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhlYWRlciwgJGJvZHksICRzdGF0dXMgPSBudWxsKQoJewoJCSR0aGlzLT5oZWFkZXIgPSAkaGVhZGVyOwoJCSR0aGlzLT5ib2R5ID0gJGJvZHk7CgkJJHRoaXMtPnN0YXR1cyA9ICRzdGF0dXM7CgoJCXJldHVybiAkdGhpczsKCX0KCgkvKioKCSAqIERpZCB3ZSByZWNlaXZlIHRoZSBzdGF0dXMgY29kZSB3ZSBleHBlY3RlZD8KCSAqCgkgKiBAcGFyYW0gaW50ZWdlcnxhcnJheSAkY29kZXMgKE9wdGlvbmFsKSBUaGUgc3RhdHVzIGNvZGUocykgdG8gZXhwZWN0LiBQYXNzIGFuIDxwaHA6aW50ZWdlcj4gZm9yIGEgc2luZ2xlIGFjY2VwdGFibGUgdmFsdWUsIG9yIGFuIDxwaHA6YXJyYXk+IG9mIGludGVnZXJzIGZvciBtdWx0aXBsZSBhY2NlcHRhYmxlIHZhbHVlcy4KCSAqIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVyIHdlIHJlY2VpdmVkIHRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBvciBub3QuCgkgKi8KCXB1YmxpYyBmdW5jdGlvbiBpc09LKCRjb2RlcyA9IGFycmF5KDIwMCwgMjAxLCAyMDQsIDIwNikpCgl7CgkJaWYgKGlzX2FycmF5KCRjb2RlcykpCgkJewoJCQlyZXR1cm4gaW5fYXJyYXkoJHRoaXMtPnN0YXR1cywgJGNvZGVzKTsKCQl9CgoJCXJldHVybiAkdGhpcy0+c3RhdHVzID09PSAkY29kZXM7Cgl9Cn0KCmNsYXNzIGNVUkxfRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHt9CmNsYXNzIGNVUkxfTXVsdGlfRXhjZXB0aW9uIGV4dGVuZHMgY1VSTF9FeGNlcHRpb24ge30KY2xhc3MgUmVxdWVzdENvcmVfRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHt9Cg==
###PACKDATA,FILE_END,/destinations/_s3lib/aws-sdk/lib/requestcore/requestcore.class.php,importbuddy/lib/requestcore/requestcore.class.php
###PACKDATA,END
*/