fantasy-ngzorro 2.2.3 → 2.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,24 +2,49 @@
2
2
  * @fileoverview added by tsickle
3
3
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
4
  */
5
- import { Component, EventEmitter, Input, Output } from '@angular/core';
5
+ import * as tslib_1 from "tslib";
6
+ import { Component, EventEmitter, Inject, Input, Optional, Output } from '@angular/core';
6
7
  import { FormBuilder } from '@angular/forms';
8
+ import { FilterListType } from './hd-filter.service';
7
9
  import { getCascaderMenuClassName, getCascaderMenuStyle, getCascaderShowSearch, } from '../utils/cascader.util';
8
10
  import { Subject } from 'rxjs';
9
11
  import { debounceTime } from 'rxjs/operators';
12
+ import { InputBoolean } from 'ng-zorro-antd';
13
+ import { HD_FILTER_DEFAULT_SCHEME_NAME, HD_FILTER_SCHEME_STORE, HdFilterSchemeStore } from './hd-filter-scheme';
10
14
  export class HdFilterComponent {
11
15
  /**
12
16
  * @param {?} fb
17
+ * @param {?} schemeStore
13
18
  */
14
- constructor(fb) {
19
+ constructor(fb, schemeStore) {
15
20
  this.fb = fb;
21
+ this.schemeStore = schemeStore;
22
+ /**
23
+ * 是否启用筛选组(默认关闭)
24
+ */
25
+ this.enableFilterScheme = false;
16
26
  this.searchEvent = new EventEmitter();
17
27
  this.resetEvent = new EventEmitter();
18
28
  this.isShowMore = true;
19
- // 对filterList取模运算
20
29
  this.filterListModular = 0;
21
30
  this.searchSubject = new Subject();
22
- this.debounceTimeout = 0; // 默认防抖时间
31
+ this.debounceTimeout = 0;
32
+ /**
33
+ * 页面配置的初始值(虚拟「默认条件」)
34
+ */
35
+ this.defaultFilterValues = {};
36
+ this.defaultValuesCaptured = false;
37
+ this.schemeList = [];
38
+ this.currentScheme = null;
39
+ this.currentSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;
40
+ this.schemeLoading = false;
41
+ this.schemeSaving = false;
42
+ this.switchModalVisible = false;
43
+ this.switchKeyword = '';
44
+ this.switchSelectedUuid = null;
45
+ this.saveAsModalVisible = false;
46
+ this.saveAsName = '';
47
+ this.defaultSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;
23
48
  this.getCascaderShowSearch = getCascaderShowSearch;
24
49
  this.getCascaderMenuClassName = getCascaderMenuClassName;
25
50
  this.getCascaderMenuStyle = getCascaderMenuStyle;
@@ -34,12 +59,56 @@ export class HdFilterComponent {
34
59
  */
35
60
  ngOnInit() {
36
61
  this.init();
62
+ this.tryLoadSchemes(true);
37
63
  }
38
64
  /**
65
+ * @param {?} changes
39
66
  * @return {?}
40
67
  */
41
- ngOnChanges() {
42
- this.init();
68
+ ngOnChanges(changes) {
69
+ if (changes['filterList']) {
70
+ this.init();
71
+ }
72
+ if (changes['enableFilterScheme'] || changes['filterSchemeKey']) {
73
+ this.tryLoadSchemes(true);
74
+ }
75
+ }
76
+ /**
77
+ * @return {?}
78
+ */
79
+ ngOnDestroy() {
80
+ if (this.searchSubscription) {
81
+ this.searchSubscription.unsubscribe();
82
+ }
83
+ if (this.schemeLoadSub) {
84
+ this.schemeLoadSub.unsubscribe();
85
+ }
86
+ if (this.schemeActionSub) {
87
+ this.schemeActionSub.unsubscribe();
88
+ }
89
+ }
90
+ /**
91
+ * @return {?}
92
+ */
93
+ get canUseScheme() {
94
+ return !!(this.enableFilterScheme && this.filterSchemeKey && this.schemeStore);
95
+ }
96
+ /**
97
+ * @return {?}
98
+ */
99
+ get filteredSwitchList() {
100
+ /** @type {?} */
101
+ const list = this.getDisplaySchemeList();
102
+ /** @type {?} */
103
+ const kw = (this.switchKeyword || '').trim();
104
+ if (!kw) {
105
+ return list;
106
+ }
107
+ return list.filter((/**
108
+ * @param {?} item
109
+ * @return {?}
110
+ */
111
+ item => (item.templateName || '').indexOf(kw) >= 0));
43
112
  }
44
113
  /**
45
114
  * @private
@@ -47,14 +116,15 @@ export class HdFilterComponent {
47
116
  */
48
117
  init() {
49
118
  this.isShowMore = true;
50
- // 异常捕获
51
119
  if (!this.checkList(this.filterList)) {
52
120
  throw 'filter组件数据格式不规范';
53
121
  }
122
+ if (!this.filterList) {
123
+ this.filterList = [];
124
+ }
54
125
  this.filterListModular = this.filterList.length % 4;
55
- // 首先根据定义的组件数组 去初始化表单
56
126
  /** @type {?} */
57
- let formGroupList = {};
127
+ const formGroupList = {};
58
128
  this.filterList.forEach((/**
59
129
  * @param {?} item
60
130
  * @param {?} index
@@ -62,10 +132,13 @@ export class HdFilterComponent {
62
132
  */
63
133
  (item, index) => {
64
134
  formGroupList[item.name] = this.fb.control(item.value, []);
65
- // 初始化控件显影
66
135
  item.show = index < 7;
67
136
  }));
68
137
  this.validateFilterForm = this.fb.group(formGroupList);
138
+ if (!this.defaultValuesCaptured) {
139
+ this.defaultFilterValues = this.clonePlain(this.getFilterData());
140
+ this.defaultValuesCaptured = true;
141
+ }
69
142
  this.filterList.forEach((/**
70
143
  * @param {?} item
71
144
  * @return {?}
@@ -100,19 +173,15 @@ export class HdFilterComponent {
100
173
  */
101
174
  onSearchEvent(fn, event, onSearchEventDebounceTime, selectOption) {
102
175
  if (onSearchEventDebounceTime) {
103
- // 更新防抖时间
104
176
  this.debounceTimeout = onSearchEventDebounceTime;
105
- // 取消之前的订阅
106
177
  if (this.searchSubscription) {
107
178
  this.searchSubscription.unsubscribe();
108
179
  }
109
- // 创建新的订阅
110
180
  this.searchSubscription = this.searchSubject.pipe(debounceTime(this.debounceTimeout)).subscribe((/**
111
181
  * @param {?} __0
112
182
  * @return {?}
113
183
  */
114
184
  ({ fn, event, selectOption }) => this.triggerEvent(fn, event, selectOption)));
115
- // 发送事件
116
185
  this.searchSubject.next({ fn, event, selectOption });
117
186
  }
118
187
  else {
@@ -140,7 +209,6 @@ export class HdFilterComponent {
140
209
  * @return {?}
141
210
  */
142
211
  computeOffset() {
143
- // 特殊处理下等于4个选项的情况
144
212
  if (this.filterList.length === 4) {
145
213
  return 18;
146
214
  }
@@ -156,23 +224,17 @@ export class HdFilterComponent {
156
224
  return true;
157
225
  }
158
226
  /** @type {?} */
159
- let nameList = [];
227
+ const nameList = [];
160
228
  list.forEach((/**
161
229
  * @param {?} item
162
230
  * @return {?}
163
231
  */
164
232
  (item) => {
165
- // 校验单项选择器
166
- // if (item.type === FilterListType.Select && (!item.selectOption.selectList || (item.selectOption.selectList && item.selectOption.selectList.length === 0))) {
167
- // throw 'filter组件数据格式不规范,存在单项选择器没有传入选项!'
168
- // }
169
233
  nameList.push(item.name);
170
234
  }));
171
- // 校验name是否重复
172
235
  if ([...new Set(nameList)].length !== list.length) {
173
236
  throw 'filter组件数据格式不规范,存在重复name值!';
174
237
  }
175
- // ...more check
176
238
  return true;
177
239
  }
178
240
  /**
@@ -186,18 +248,14 @@ export class HdFilterComponent {
186
248
  */
187
249
  resetForm() {
188
250
  this.resetFilterFormWithValue();
189
- // this.validateFilterForm.reset();
190
251
  if (this.resetEvent.observers.length > 0) {
191
- // 如果有父组件绑定了 resetEvent 的处理器
192
252
  this.resetEvent.emit(this.validateFilterForm.getRawValue());
193
253
  }
194
254
  else {
195
- // 如果没有绑定处理器,则触发 searchEvent
196
255
  this.searchEvent.emit(this.validateFilterForm.getRawValue());
197
256
  }
198
257
  }
199
258
  /**
200
- * 带初始值重置表单
201
259
  * @return {?}
202
260
  */
203
261
  resetFilterFormWithValue() {
@@ -210,7 +268,6 @@ export class HdFilterComponent {
210
268
  (item) => {
211
269
  resetValue[item.name] = item.value;
212
270
  }));
213
- // 重置表单值(会触发valueChanges事件)
214
271
  this.validateFilterForm.patchValue(resetValue);
215
272
  }
216
273
  /**
@@ -244,7 +301,6 @@ export class HdFilterComponent {
244
301
  this.validateFilterForm.patchValue(patchObject);
245
302
  }
246
303
  /**
247
- * 是否允许清空:优先 Filter.hdAllowClear,其次 selectOption.hdAllowClear,默认 true
248
304
  * @param {?} item
249
305
  * @return {?}
250
306
  */
@@ -260,26 +316,543 @@ export class HdFilterComponent {
260
316
  }
261
317
  return true;
262
318
  }
319
+ // ---------- 筛选组 ----------
320
+ /**
321
+ * @private
322
+ * @param {?} applyDefault
323
+ * @return {?}
324
+ */
325
+ tryLoadSchemes(applyDefault) {
326
+ if (!this.canUseScheme) {
327
+ this.schemeList = [];
328
+ this.currentScheme = null;
329
+ this.currentSchemeName = HD_FILTER_DEFAULT_SCHEME_NAME;
330
+ return;
331
+ }
332
+ this.schemeLoading = true;
333
+ if (this.schemeLoadSub) {
334
+ this.schemeLoadSub.unsubscribe();
335
+ }
336
+ this.schemeLoadSub = this.schemeStore.queryByFilterKey(this.filterSchemeKey).subscribe((/**
337
+ * @param {?} list
338
+ * @return {?}
339
+ */
340
+ (list) => {
341
+ this.schemeLoading = false;
342
+ this.schemeList = list || [];
343
+ if (applyDefault) {
344
+ this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);
345
+ }
346
+ else if (this.currentScheme && this.currentScheme.uuid) {
347
+ /** @type {?} */
348
+ const found = this.schemeList.find((/**
349
+ * @param {?} s
350
+ * @return {?}
351
+ */
352
+ s => s.uuid === this.currentScheme.uuid));
353
+ this.currentScheme = found || null;
354
+ this.currentSchemeName = found ? found.templateName : HD_FILTER_DEFAULT_SCHEME_NAME;
355
+ }
356
+ }), (/**
357
+ * @param {?} err
358
+ * @return {?}
359
+ */
360
+ (err) => {
361
+ this.schemeLoading = false;
362
+ this.showError('加载筛选模版失败:' + (err || ''));
363
+ if (applyDefault) {
364
+ this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);
365
+ }
366
+ }));
367
+ }
368
+ /**
369
+ * 展示用列表:保证有「默认条件」
370
+ * @return {?}
371
+ */
372
+ getDisplaySchemeList() {
373
+ /** @type {?} */
374
+ const result = [];
375
+ /** @type {?} */
376
+ const fromDb = this.schemeList.find((/**
377
+ * @param {?} s
378
+ * @return {?}
379
+ */
380
+ s => s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME));
381
+ if (fromDb) {
382
+ result.push(fromDb);
383
+ }
384
+ else {
385
+ result.push({
386
+ filterKey: this.filterSchemeKey,
387
+ templateName: HD_FILTER_DEFAULT_SCHEME_NAME,
388
+ filterValue: JSON.stringify(this.defaultFilterValues || {})
389
+ });
390
+ }
391
+ (this.schemeList || []).forEach((/**
392
+ * @param {?} s
393
+ * @return {?}
394
+ */
395
+ s => {
396
+ if (s.templateName !== HD_FILTER_DEFAULT_SCHEME_NAME) {
397
+ result.push(s);
398
+ }
399
+ }));
400
+ return result;
401
+ }
402
+ /**
403
+ * @return {?}
404
+ */
405
+ openSwitchModal() {
406
+ if (!this.canUseScheme) {
407
+ return;
408
+ }
409
+ this.switchKeyword = '';
410
+ this.switchSelectedUuid = this.currentScheme && this.currentScheme.uuid
411
+ ? this.currentScheme.uuid
412
+ : null;
413
+ // 虚拟默认条件:uuid 为空时用空串标记
414
+ if (!this.currentScheme || !this.currentScheme.uuid) {
415
+ if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME) {
416
+ this.switchSelectedUuid = '';
417
+ }
418
+ }
419
+ this.switchModalVisible = true;
420
+ }
421
+ /**
422
+ * @return {?}
423
+ */
424
+ closeSwitchModal() {
425
+ this.switchModalVisible = false;
426
+ }
427
+ /**
428
+ * @param {?} item
429
+ * @return {?}
430
+ */
431
+ selectSwitchItem(item) {
432
+ this.switchSelectedUuid = item.uuid ? item.uuid : '';
433
+ }
434
+ /**
435
+ * @return {?}
436
+ */
437
+ confirmSwitch() {
438
+ /** @type {?} */
439
+ const list = this.getDisplaySchemeList();
440
+ /** @type {?} */
441
+ let target = null;
442
+ if (this.switchSelectedUuid === '' || this.switchSelectedUuid == null) {
443
+ target = list.find((/**
444
+ * @param {?} s
445
+ * @return {?}
446
+ */
447
+ s => s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME && !s.uuid))
448
+ || list.find((/**
449
+ * @param {?} s
450
+ * @return {?}
451
+ */
452
+ s => s.templateName === HD_FILTER_DEFAULT_SCHEME_NAME));
453
+ }
454
+ else {
455
+ target = list.find((/**
456
+ * @param {?} s
457
+ * @return {?}
458
+ */
459
+ s => s.uuid === this.switchSelectedUuid));
460
+ }
461
+ if (!target) {
462
+ this.showError('请选择筛选模版');
463
+ return;
464
+ }
465
+ this.applyScheme(target, true);
466
+ this.switchModalVisible = false;
467
+ }
468
+ /**
469
+ * @param {?} item
470
+ * @return {?}
471
+ */
472
+ isDefaultScheme(item) {
473
+ return !!(item && item.templateName === HD_FILTER_DEFAULT_SCHEME_NAME);
474
+ }
475
+ /**
476
+ * @return {?}
477
+ */
478
+ canDeleteCurrent() {
479
+ return !!(this.currentScheme && this.currentScheme.uuid
480
+ && this.currentScheme.templateName !== HD_FILTER_DEFAULT_SCHEME_NAME);
481
+ }
482
+ /**
483
+ * @return {?}
484
+ */
485
+ saveCurrentScheme() {
486
+ if (!this.canUseScheme) {
487
+ return;
488
+ }
489
+ /** @type {?} */
490
+ const name = this.currentSchemeName || HD_FILTER_DEFAULT_SCHEME_NAME;
491
+ /** @type {?} */
492
+ const body = {
493
+ uuid: this.currentScheme && this.currentScheme.uuid ? this.currentScheme.uuid : null,
494
+ filterKey: this.filterSchemeKey,
495
+ templateName: name,
496
+ filterValue: this.serializeFilterValue()
497
+ };
498
+ this.schemeSaving = true;
499
+ if (this.schemeActionSub) {
500
+ this.schemeActionSub.unsubscribe();
501
+ }
502
+ this.schemeActionSub = this.schemeStore.save(body).subscribe((/**
503
+ * @param {?} saved
504
+ * @return {?}
505
+ */
506
+ (saved) => {
507
+ this.schemeSaving = false;
508
+ this.showSuccess('保存成功');
509
+ this.currentScheme = saved;
510
+ this.currentSchemeName = saved.templateName;
511
+ this.refreshSchemeListKeepCurrent();
512
+ }), (/**
513
+ * @param {?} err
514
+ * @return {?}
515
+ */
516
+ (err) => {
517
+ this.schemeSaving = false;
518
+ this.showError('保存失败:' + (err || ''));
519
+ }));
520
+ }
521
+ /**
522
+ * @return {?}
523
+ */
524
+ openSaveAsModal() {
525
+ this.saveAsName = '';
526
+ this.saveAsModalVisible = true;
527
+ }
528
+ /**
529
+ * @return {?}
530
+ */
531
+ closeSaveAsModal() {
532
+ this.saveAsModalVisible = false;
533
+ }
534
+ /**
535
+ * @return {?}
536
+ */
537
+ confirmSaveAs() {
538
+ /** @type {?} */
539
+ const name = (this.saveAsName || '').trim();
540
+ if (!name) {
541
+ this.showError('请输入模版名称');
542
+ return;
543
+ }
544
+ if (name === HD_FILTER_DEFAULT_SCHEME_NAME) {
545
+ this.showError('不能使用「默认条件」作为模版名称,请使用「保存为当前」覆盖默认条件');
546
+ return;
547
+ }
548
+ /** @type {?} */
549
+ const exists = (this.schemeList || []).some((/**
550
+ * @param {?} s
551
+ * @return {?}
552
+ */
553
+ s => s.templateName === name));
554
+ if (exists) {
555
+ this.showError('模版名称已存在');
556
+ return;
557
+ }
558
+ /** @type {?} */
559
+ const body = {
560
+ filterKey: this.filterSchemeKey,
561
+ templateName: name,
562
+ filterValue: this.serializeFilterValue()
563
+ };
564
+ this.schemeSaving = true;
565
+ if (this.schemeActionSub) {
566
+ this.schemeActionSub.unsubscribe();
567
+ }
568
+ this.schemeActionSub = this.schemeStore.save(body).subscribe((/**
569
+ * @param {?} saved
570
+ * @return {?}
571
+ */
572
+ (saved) => {
573
+ this.schemeSaving = false;
574
+ this.saveAsModalVisible = false;
575
+ this.showSuccess('另存为成功');
576
+ this.currentScheme = saved;
577
+ this.currentSchemeName = saved.templateName;
578
+ this.refreshSchemeListKeepCurrent();
579
+ }), (/**
580
+ * @param {?} err
581
+ * @return {?}
582
+ */
583
+ (err) => {
584
+ this.schemeSaving = false;
585
+ this.showError('另存为失败:' + (err || ''));
586
+ }));
587
+ }
588
+ /**
589
+ * @return {?}
590
+ */
591
+ deleteCurrentScheme() {
592
+ if (!this.canDeleteCurrent()) {
593
+ return;
594
+ }
595
+ /** @type {?} */
596
+ const uuid = this.currentScheme.uuid;
597
+ this.schemeSaving = true;
598
+ if (this.schemeActionSub) {
599
+ this.schemeActionSub.unsubscribe();
600
+ }
601
+ this.schemeActionSub = this.schemeStore.delete(uuid).subscribe((/**
602
+ * @return {?}
603
+ */
604
+ () => {
605
+ this.schemeSaving = false;
606
+ this.showSuccess('删除成功');
607
+ this.schemeList = (this.schemeList || []).filter((/**
608
+ * @param {?} s
609
+ * @return {?}
610
+ */
611
+ s => s.uuid !== uuid));
612
+ this.applySchemeByName(HD_FILTER_DEFAULT_SCHEME_NAME, true);
613
+ }), (/**
614
+ * @param {?} err
615
+ * @return {?}
616
+ */
617
+ (err) => {
618
+ this.schemeSaving = false;
619
+ this.showError('删除失败:' + (err || ''));
620
+ }));
621
+ }
622
+ /**
623
+ * @private
624
+ * @return {?}
625
+ */
626
+ refreshSchemeListKeepCurrent() {
627
+ if (!this.canUseScheme) {
628
+ return;
629
+ }
630
+ this.schemeStore.queryByFilterKey(this.filterSchemeKey).subscribe((/**
631
+ * @param {?} list
632
+ * @return {?}
633
+ */
634
+ (list) => {
635
+ this.schemeList = list || [];
636
+ if (this.currentScheme && this.currentScheme.uuid) {
637
+ /** @type {?} */
638
+ const found = this.schemeList.find((/**
639
+ * @param {?} s
640
+ * @return {?}
641
+ */
642
+ s => s.uuid === this.currentScheme.uuid));
643
+ if (found) {
644
+ this.currentScheme = found;
645
+ this.currentSchemeName = found.templateName;
646
+ }
647
+ }
648
+ }), (/**
649
+ * @return {?}
650
+ */
651
+ () => { }));
652
+ }
653
+ /**
654
+ * @private
655
+ * @param {?} name
656
+ * @param {?} emitSearch
657
+ * @return {?}
658
+ */
659
+ applySchemeByName(name, emitSearch) {
660
+ /** @type {?} */
661
+ const list = this.getDisplaySchemeList();
662
+ /** @type {?} */
663
+ const target = list.find((/**
664
+ * @param {?} s
665
+ * @return {?}
666
+ */
667
+ s => s.templateName === name));
668
+ if (target) {
669
+ this.applyScheme(target, emitSearch);
670
+ }
671
+ }
672
+ /**
673
+ * @private
674
+ * @param {?} scheme
675
+ * @param {?} emitSearch
676
+ * @return {?}
677
+ */
678
+ applyScheme(scheme, emitSearch) {
679
+ this.currentScheme = scheme && scheme.uuid ? scheme : {
680
+ filterKey: this.filterSchemeKey,
681
+ templateName: scheme ? scheme.templateName : HD_FILTER_DEFAULT_SCHEME_NAME,
682
+ filterValue: scheme ? scheme.filterValue : JSON.stringify(this.defaultFilterValues || {})
683
+ };
684
+ this.currentSchemeName = this.currentScheme.templateName || HD_FILTER_DEFAULT_SCHEME_NAME;
685
+ /** @type {?} */
686
+ let values = {};
687
+ if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME && !(scheme && scheme.uuid)) {
688
+ values = this.clonePlain(this.defaultFilterValues || {});
689
+ }
690
+ else {
691
+ try {
692
+ values = JSON.parse(scheme.filterValue || '{}');
693
+ }
694
+ catch (e) {
695
+ values = {};
696
+ }
697
+ if (this.currentSchemeName === HD_FILTER_DEFAULT_SCHEME_NAME) {
698
+ // 库中默认条件覆盖初始值:以默认值为底,再叠加库值
699
+ values = Object.assign({}, this.defaultFilterValues || {}, values || {});
700
+ }
701
+ }
702
+ this.patchFilterValues(values);
703
+ if (emitSearch) {
704
+ this.submitForm();
705
+ }
706
+ }
707
+ /**
708
+ * @private
709
+ * @return {?}
710
+ */
711
+ serializeFilterValue() {
712
+ return JSON.stringify(this.getFilterData() || {});
713
+ }
714
+ /**
715
+ * @private
716
+ * @param {?} values
717
+ * @return {?}
718
+ */
719
+ patchFilterValues(values) {
720
+ if (!this.validateFilterForm || !this.filterList) {
721
+ return;
722
+ }
723
+ /** @type {?} */
724
+ const patch = {};
725
+ this.filterList.forEach((/**
726
+ * @param {?} item
727
+ * @return {?}
728
+ */
729
+ item => {
730
+ if (values && Object.prototype.hasOwnProperty.call(values, item.name)) {
731
+ patch[item.name] = this.reviveFilterValue(item, values[item.name]);
732
+ }
733
+ }));
734
+ this.validateFilterForm.patchValue(patch);
735
+ }
736
+ /**
737
+ * @private
738
+ * @param {?} filter
739
+ * @param {?} value
740
+ * @return {?}
741
+ */
742
+ reviveFilterValue(filter, value) {
743
+ if (value == null) {
744
+ return value;
745
+ }
746
+ if (filter.type === FilterListType.DateRange) {
747
+ if (Array.isArray(value)) {
748
+ return value.map((/**
749
+ * @param {?} v
750
+ * @return {?}
751
+ */
752
+ v => this.parseDateLike(v)));
753
+ }
754
+ return value;
755
+ }
756
+ if (filter.type === FilterListType.Date || filter.type === FilterListType.Month) {
757
+ return this.parseDateLike(value);
758
+ }
759
+ return value;
760
+ }
761
+ /**
762
+ * @private
763
+ * @param {?} value
764
+ * @return {?}
765
+ */
766
+ parseDateLike(value) {
767
+ if (value == null || value instanceof Date) {
768
+ return value;
769
+ }
770
+ if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}/.test(value)) {
771
+ /** @type {?} */
772
+ const d = new Date(value);
773
+ return isNaN(d.getTime()) ? value : d;
774
+ }
775
+ if (typeof value === 'number') {
776
+ /** @type {?} */
777
+ const d = new Date(value);
778
+ return isNaN(d.getTime()) ? value : d;
779
+ }
780
+ return value;
781
+ }
782
+ /**
783
+ * @private
784
+ * @param {?} obj
785
+ * @return {?}
786
+ */
787
+ clonePlain(obj) {
788
+ try {
789
+ return JSON.parse(JSON.stringify(obj == null ? {} : obj));
790
+ }
791
+ catch (e) {
792
+ return {};
793
+ }
794
+ }
795
+ /**
796
+ * @private
797
+ * @param {?} msg
798
+ * @return {?}
799
+ */
800
+ showSuccess(msg) {
801
+ if (typeof window !== 'undefined' && ((/** @type {?} */ (window))).hdMessageService) {
802
+ ((/** @type {?} */ (window))).hdMessageService.prototype.success(msg);
803
+ }
804
+ }
805
+ /**
806
+ * @private
807
+ * @param {?} msg
808
+ * @return {?}
809
+ */
810
+ showError(msg) {
811
+ if (typeof window !== 'undefined' && ((/** @type {?} */ (window))).hdMessageService) {
812
+ ((/** @type {?} */ (window))).hdMessageService.prototype.error(msg);
813
+ }
814
+ else {
815
+ // eslint-disable-next-line no-console
816
+ console.error(msg);
817
+ }
818
+ }
263
819
  }
264
820
  HdFilterComponent.decorators = [
265
821
  { type: Component, args: [{
266
822
  selector: 'hd-filter',
267
- template: "<form nz-form [formGroup]=\"validateFilterForm\" class=\"ant-advanced-search-form hd-filter-container\">\n <!-- \u6574\u4F53\u7ED3\u6784 -->\n <div nz-row [nzGutter]=\"24\">\n <!-- \u5BF9\u7EC4\u4EF6\u5217\u8868\u5FAA\u73AF\u5904\u7406 -->\n <ng-container *ngFor=\"let filter of filterList\">\n <div nz-col [nzSpan]=\"6\" [hidden]=\"!filter.show\">\n <nz-form-item nzFlex>\n <nz-form-label class=\"hd-filter-label\" [nzNoColon]=\"true\"><span class=\"hd-red\" *ngIf=\"filter.require\">*</span>{{ filter.label }}\n </nz-form-label>\n <nz-form-control class=\"hd-filter-control\">\n <ng-container [ngSwitch]=\"filter.type\">\n <!-- \u8FD9\u91CC\u6570\u5B57\u5BF9\u5E94\u679A\u4E3E\u7C7B\u578B\uFF0C\u53EF\u5728hd-filter.service.ts\u6587\u4EF6\u4E2D\u67E5\u770B\u5BF9\u5E94\u5173\u7CFB -->\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input nz-input [placeholder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u8F93\u5165' + filter.label\"\n [formControlName]=\"filter.name\"\n (blur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\"/>\n </nz-input-group>\n <ng-template #inputCleanTemplate><i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\"\n nzType=\"close-circle\" *ngIf=\"isAllowClear(filter) && validateFilterForm.get(filter.name).value\"\n (click)=\"inputClean(filter)\"></i></ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n nzShowTime nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"!filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\">\n </nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <nz-range-picker [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\" [formControlName]=\"filter.name\">\n </nz-range-picker>\n </ng-container>\n <!-- \u591A\u9879\u9009\u62E9\u5668 -->\n <ng-container *ngSwitchCase=\"4\">\n <nz-select\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n nzMode=\"multiple\"\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <nz-cascader [nzOptions]=\"filter.cascaderOption.options\" [formControlName]=\"filter.name\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzShowSearch]=\"getCascaderShowSearch(filter.cascaderOption)\"\n [nzMenuClassName]=\"getCascaderMenuClassName(filter.cascaderOption)\"\n [nzMenuStyle]=\"getCascaderMenuStyle(filter.cascaderOption)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\">\n </nz-cascader>\n </ng-container>\n <ng-container *ngSwitchCase=\"6\">\n <nz-month-picker [formControlName]=\"filter.name\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"></nz-month-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n <nz-input-number [formControlName]=\"filter.name\" [nzMin]=\"filter?.inputNumber?.min || 0\"\n [nzMax]=\"filter?.inputNumber?.max || 99999999\" [nzStep]=\"filter?.inputNumber?.step || 1\"\n [nzPlaceHolder]=\"'\u8BF7\u8F93\u5165' + filter.label\"\n [nzPrecision]=\"filter?.inputNumber?.precision != null ? filter.inputNumber.precision : 4\"\n (nzBlur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\">\n </nz-input-number>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n </div>\n </ng-container>\n\n <div class=\"hd-filter-btn\" nz-col [nzSpan]=\"6\" [nzOffset]=\"computeOffset()\">\n <a *ngIf=\"filterList.length > 7\" class=\"hd-filter-more\" (click)=\"showMore()\">\n {{ isShowMore ? '\u5C55\u5F00' : '\u6536\u8D77' }}\n <i nz-icon [nzType]=\"isShowMore ? 'down' : 'up'\"></i>\n </a>\n <hd-button type=\"primary\" (click)=\"submitForm()\">\u67E5\u8BE2</hd-button>\n <hd-button type=\"reset\" (click)=\"resetForm()\">\u91CD\u7F6E</hd-button>\n </div>\n </div>\n</form>\n",
268
- styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-filter-container{padding:20px 23px;background:#fff;border-radius:4px;margin-bottom:8px!important;font-size:14px}.hd-filter-container .ant-row{display:flex;flex-wrap:wrap;align-items:flex-start;row-gap:4px;margin-right:0!important;margin-left:0!important}.hd-filter-container .ant-row::after,.hd-filter-container .ant-row::before{display:none}.hd-filter-container .ant-col-6{float:none;padding-left:0!important;padding-right:0!important}.hd-filter-container .hd-filter-label{width:124px;word-break:break-all;font-size:14px}.hd-filter-container .hd-filter-label ::ng-deep label{font-size:14px}.hd-filter-container .hd-filter-control{width:calc(100% - 124px)}.hd-filter-container ::ng-deep .ant-calendar-picker{width:100%}.hd-filter-container .hd-filter-more{color:#20b95d}.hd-filter-container .hd-filter-btn{height:40px;display:inline-flex;align-items:center;justify-content:flex-end}.hd-filter-container hd-button{margin-left:12px}.hd-filter-container ::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}.hd-filter-container ::ng-deep .ant-select-selection--single{height:32px!important}.hd-filter-container ::ng-deep .ant-input{height:32px!important}.hd-filter-container ::ng-deep .ant-calendar-range-picker-input{text-align:left!important}.hd-filter-container .ant-input-number{width:100%}.hd-filter-container .hd-red{color:#f5222d}"]
823
+ template: "<form nz-form [formGroup]=\"validateFilterForm\" class=\"ant-advanced-search-form hd-filter-container\">\n <!-- \u6574\u4F53\u7ED3\u6784 -->\n <div nz-row [nzGutter]=\"24\">\n <!-- \u5BF9\u7EC4\u4EF6\u5217\u8868\u5FAA\u73AF\u5904\u7406 -->\n <ng-container *ngFor=\"let filter of filterList\">\n <div nz-col [nzSpan]=\"6\" [hidden]=\"!filter.show\">\n <nz-form-item nzFlex>\n <nz-form-label class=\"hd-filter-label\" [nzNoColon]=\"true\"><span class=\"hd-red\" *ngIf=\"filter.require\">*</span>{{ filter.label }}\n </nz-form-label>\n <nz-form-control class=\"hd-filter-control\">\n <ng-container [ngSwitch]=\"filter.type\">\n <!-- \u8FD9\u91CC\u6570\u5B57\u5BF9\u5E94\u679A\u4E3E\u7C7B\u578B\uFF0C\u53EF\u5728hd-filter.service.ts\u6587\u4EF6\u4E2D\u67E5\u770B\u5BF9\u5E94\u5173\u7CFB -->\n <ng-container *ngSwitchCase=\"0\">\n <nz-input-group [nzSuffix]=\"inputCleanTemplate\">\n <input nz-input [placeholder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u8F93\u5165' + filter.label\"\n [formControlName]=\"filter.name\"\n (blur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\"/>\n </nz-input-group>\n <ng-template #inputCleanTemplate><i nz-icon nz-tooltip class=\"ant-input-clear-icon\" nzTheme=\"fill\"\n nzType=\"close-circle\" *ngIf=\"isAllowClear(filter) && validateFilterForm.get(filter.name).value\"\n (click)=\"inputClean(filter)\"></i></ng-template>\n </ng-container>\n <ng-container *ngSwitchCase=\"1\">\n <nz-select\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"2\">\n <nz-date-picker *ngIf=\"filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n nzShowTime nzFormat=\"yyyy-MM-dd HH:mm:ss\">\n </nz-date-picker>\n <nz-date-picker *ngIf=\"!filter.showTime\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\">\n </nz-date-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"3\">\n <nz-range-picker [nzPlaceHolder]=\"['\u5F00\u59CB\u65E5\u671F','\u7ED3\u675F\u65E5\u671F']\" [nzDisabledDate]=\"filter.hdDisabledDate\"\n [nzAllowClear]=\"isAllowClear(filter)\" [formControlName]=\"filter.name\">\n </nz-range-picker>\n </ng-container>\n <!-- \u591A\u9879\u9009\u62E9\u5668 -->\n <ng-container *ngSwitchCase=\"4\">\n <nz-select\n [nzDropdownMatchSelectWidth]=\"filter.selectOption.hdDropdownMatchSelectWidth ? filter.selectOption.hdDropdownMatchSelectWidth : false\"\n nzMode=\"multiple\"\n [nzShowSearch]=\"filter.selectOption.hdShowSearch != null ? filter.selectOption.hdShowSearch : true\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"\n [formControlName]=\"filter.name\" [nzServerSearch]=\"filter.selectOption.hdServerSearch || false\"\n (nzOnSearch)=\"onSearchEvent(filter.onSearchEvent || null, $event, filter.onSearchEventEventDebounceTime, filter.selectOption)\">\n <nz-option *ngFor=\"let selectItem of filter.selectOption.selectList\"\n [nzValue]=\"selectItem[filter.selectOption.value]\" [nzLabel]=\"filter.selectOption.showLabelAndValue ? '['+ selectItem[filter.selectOption.value] +']' +\n selectItem[filter.selectOption.label] : selectItem[filter.selectOption.label]\"></nz-option>\n </nz-select>\n </ng-container>\n <ng-container *ngSwitchCase=\"5\">\n <nz-cascader [nzOptions]=\"filter.cascaderOption.options\" [formControlName]=\"filter.name\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzShowSearch]=\"getCascaderShowSearch(filter.cascaderOption)\"\n [nzMenuClassName]=\"getCascaderMenuClassName(filter.cascaderOption)\"\n [nzMenuStyle]=\"getCascaderMenuStyle(filter.cascaderOption)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\">\n </nz-cascader>\n </ng-container>\n <ng-container *ngSwitchCase=\"6\">\n <nz-month-picker [formControlName]=\"filter.name\"\n [nzAllowClear]=\"isAllowClear(filter)\"\n [nzPlaceHolder]=\"filter.placeholder ? filter.placeholder : '\u8BF7\u9009\u62E9' + filter.label\"></nz-month-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"7\">\n <nz-input-number [formControlName]=\"filter.name\" [nzMin]=\"filter?.inputNumber?.min || 0\"\n [nzMax]=\"filter?.inputNumber?.max || 99999999\" [nzStep]=\"filter?.inputNumber?.step || 1\"\n [nzPlaceHolder]=\"'\u8BF7\u8F93\u5165' + filter.label\"\n [nzPrecision]=\"filter?.inputNumber?.precision != null ? filter.inputNumber.precision : 4\"\n (nzBlur)=\"triggerEvent(filter.onBlurEvent || null, validateFilterForm.get(filter.name).value)\">\n </nz-input-number>\n </ng-container>\n </ng-container>\n </nz-form-control>\n </nz-form-item>\n </div>\n </ng-container>\n\n <div class=\"hd-filter-btn\" nz-col [nzSpan]=\"6\" [nzOffset]=\"computeOffset()\">\n <a *ngIf=\"filterList.length > 7\" class=\"hd-filter-more\" (click)=\"showMore()\">\n {{ isShowMore ? '\u5C55\u5F00' : '\u6536\u8D77' }}\n <i nz-icon [nzType]=\"isShowMore ? 'down' : 'up'\"></i>\n </a>\n <ng-container *ngIf=\"canUseScheme\">\n <a class=\"hd-filter-scheme-name\" (click)=\"openSwitchModal()\" nz-tooltip [nzTitle]=\"'\u5207\u6362\u7B5B\u9009\u7EC4'\">\n {{ currentSchemeName }}\n <i nz-icon nzType=\"down\"></i>\n </a>\n <a class=\"hd-filter-scheme-op\" nz-dropdown [nzDropdownMenu]=\"schemeOpMenu\" nzTrigger=\"click\">\n \u64CD\u4F5C\n <i nz-icon nzType=\"down\"></i>\n </a>\n <nz-dropdown-menu #schemeOpMenu=\"nzDropdownMenu\">\n <ul nz-menu>\n <li nz-menu-item (click)=\"saveCurrentScheme()\">\u4FDD\u5B58\u4E3A\u5F53\u524D</li>\n <li nz-menu-item (click)=\"openSaveAsModal()\">\u53E6\u5B58\u4E3A</li>\n <li nz-menu-item *ngIf=\"canDeleteCurrent()\"\n nz-popconfirm\n nzTitle=\"\u786E\u5B9A\u5220\u9664\u5F53\u524D\u7B5B\u9009\u7EC4\u5417\uFF1F\"\n nzPopconfirmPlacement=\"bottomRight\"\n (nzOnConfirm)=\"deleteCurrentScheme()\">\u5220\u9664</li>\n </ul>\n </nz-dropdown-menu>\n </ng-container>\n <hd-button type=\"primary\" (click)=\"submitForm()\">\u67E5\u8BE2</hd-button>\n <hd-button type=\"reset\" (click)=\"resetForm()\">\u91CD\u7F6E</hd-button>\n </div>\n </div>\n</form>\n\n<!-- \u5207\u6362\u7B5B\u9009\u7EC4 -->\n<nz-modal\n [(nzVisible)]=\"switchModalVisible\"\n nzTitle=\"\u5207\u6362\u7B5B\u9009\u7EC4\"\n nzWidth=\"480px\"\n [nzOkLoading]=\"schemeLoading\"\n (nzOnCancel)=\"closeSwitchModal()\"\n (nzOnOk)=\"confirmSwitch()\">\n <div class=\"hd-filter-scheme-switch\">\n <input nz-input placeholder=\"\u641C\u7D22\u6A21\u7248\u540D\u79F0\" [(ngModel)]=\"switchKeyword\" />\n <div class=\"hd-filter-scheme-switch-list\">\n <div\n class=\"hd-filter-scheme-switch-item\"\n *ngFor=\"let item of filteredSwitchList\"\n [class.active]=\"(item.uuid && item.uuid === switchSelectedUuid) || (!item.uuid && switchSelectedUuid === '')\"\n (click)=\"selectSwitchItem(item)\">\n <span>{{ item.templateName }}</span>\n <span class=\"hd-filter-scheme-tag\" *ngIf=\"isDefaultScheme(item)\">\u9ED8\u8BA4</span>\n </div>\n <div class=\"hd-filter-scheme-empty\" *ngIf=\"!filteredSwitchList.length\">\u6682\u65E0\u5339\u914D\u6A21\u7248</div>\n </div>\n </div>\n</nz-modal>\n\n<!-- \u53E6\u5B58\u4E3A -->\n<nz-modal\n [(nzVisible)]=\"saveAsModalVisible\"\n nzTitle=\"\u53E6\u5B58\u4E3A\u7B5B\u9009\u7EC4\"\n nzWidth=\"420px\"\n [nzOkLoading]=\"schemeSaving\"\n (nzOnCancel)=\"closeSaveAsModal()\"\n (nzOnOk)=\"confirmSaveAs()\">\n <div class=\"hd-filter-scheme-save-as\">\n <nz-form-item nzFlex>\n <nz-form-label [nzNoColon]=\"true\" [nzRequired]=\"true\">\u6A21\u7248\u540D\u79F0</nz-form-label>\n <nz-form-control>\n <input nz-input maxlength=\"100\" placeholder=\"\u8BF7\u8F93\u5165\u6A21\u7248\u540D\u79F0\" [(ngModel)]=\"saveAsName\" />\n </nz-form-control>\n </nz-form-item>\n </div>\n</nz-modal>\n",
824
+ styles: ["::ng-deep .common-btn-group>a{font-size:14px;font-weight:400;color:#20b95d!important;white-space:nowrap}::ng-deep .common-btn-group .common-danger-btn:hover{color:#f05b24!important}::ng-deep .common-btn-group>a:hover{color:#20bd62!important}::ng-deep .common-btn-group>a:not(:last-child)::after{content:'';margin:0 2px}::ng-deep .common-billNumber>a{color:#3b77e3}button{box-shadow:unset;text-shadow:unset}::ng-deep .ant-form-item-label>label{color:#4b504e;font-size:14px}::ng-deep .ant-input-number-input{height:32px}::ng-deep .ant-input-number{height:32px}textarea.ant-input{height:auto;min-height:32px}::ng-deep .ant-select-selection--multiple{min-height:32px}::ng-deep .ant-select-selection__rendered>ul>li{height:26px!important;margin-top:3px!important;line-height:26px!important}::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}::ng-deep .ant-select-selection--single{height:32px!important}::ng-deep .ant-input{height:32px}::ng-deep .ant-input[disabled]:hover{border-color:#d9d9d9!important}::ng-deep .ant-select-selection__rendered{line-height:32px!important}::ng-deep .ant-calendar-range-picker-input{text-align:left!important}::ng-deep .ant-calendar-picker{width:100%!important}::ng-deep .ant-row{margin-right:0!important;margin-left:0!important}::ng-deep .ant-col-6{padding-left:12px;padding-right:12px}::ng-deep .ant-col-12{padding-left:12px;padding-right:12px}::ng-deep .ant-col-18{padding-left:12px;padding-right:12px}::ng-deep .ant-col-24{padding-left:12px;padding-right:12px}::ng-deep .ant-alert-info{background-color:#f5f8f6;border:1px solid #cfe3d4}::ng-deep .hd-table-container .ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-th-right-sticky{z-index:2;transform:translateZ(0)}::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-left-sticky,::ng-deep .hd-table-container .ant-table-thead>tr>th.ant-table-th-right-sticky{background:#f5f8f6!important}::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr>td.ant-table-td-right-sticky{background:#fff}::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr.ant-table-row-hover>td.ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-left-sticky,::ng-deep .hd-table-container .ant-table-tbody>tr:hover>td.ant-table-td-right-sticky{background:#ecf8f1!important}::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-left .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-middle .ant-table-th-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-td-right-sticky,::ng-deep .hd-table-container .ant-table-scroll-position-right .ant-table-th-right-sticky{box-shadow:none!important}::ng-deep .hd-table-container .ant-table-fixed-right{right:0!important}:host ::ng-deep th{background:#f5f8f6!important;font-weight:700!important;white-space:nowrap;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#2a3634;padding:8px!important;box-sizing:border-box}:host ::ng-deep td{font-weight:400;font-style:normal;font-size:14px;color:#2a3634;text-align:left;white-space:nowrap;padding:8px!important;box-sizing:border-box}::ng-deep .ant-pagination-options{display:inline-flex;align-items:center}::ng-deep .ant-pagination-options .ant-select,::ng-deep .ant-pagination-options .ant-select-selection--single{min-width:100px}::ng-deep .ant-pagination-options-size-changer.ant-select{min-width:100px}::ng-deep .ant-time-picker{width:100%}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:var(--hd-cascader-menu-min-width,auto);max-width:560px}::ng-deep .cdk-overlay-pane .hd-cascader-menus.ant-cascader-menus>.ant-cascader-menu:only-child .ant-cascader-menu-item{white-space:nowrap}.ant-input-number-disabled,.ant-input[disabled],.ant-select-disabled{color:#4b504e}.hd-filter-container{padding:20px 23px;background:#fff;border-radius:4px;margin-bottom:8px!important;font-size:14px}.hd-filter-container .ant-row{display:flex;flex-wrap:wrap;align-items:flex-start;row-gap:4px;margin-right:0!important;margin-left:0!important}.hd-filter-container .ant-row::after,.hd-filter-container .ant-row::before{display:none}.hd-filter-container .ant-col-6{float:none;padding-left:0!important;padding-right:0!important}.hd-filter-container .hd-filter-label{width:124px;word-break:break-all;font-size:14px}.hd-filter-container .hd-filter-label ::ng-deep label{font-size:14px}.hd-filter-container .hd-filter-control{width:calc(100% - 124px)}.hd-filter-container ::ng-deep .ant-calendar-picker{width:100%}.hd-filter-container .hd-filter-more{color:#20b95d}.hd-filter-container .hd-filter-btn{height:40px;display:inline-flex;align-items:center;justify-content:flex-end}.hd-filter-container hd-button{margin-left:12px}.hd-filter-container ::ng-deep .ant-advanced-search-form .ant-form-item{margin-bottom:0!important}.hd-filter-container ::ng-deep .ant-select-selection--single{height:32px!important}.hd-filter-container ::ng-deep .ant-input{height:32px!important}.hd-filter-container ::ng-deep .ant-calendar-range-picker-input{text-align:left!important}.hd-filter-container .ant-input-number{width:100%}.hd-filter-container .hd-red{color:#f5222d}.hd-filter-container .hd-filter-scheme-name,.hd-filter-container .hd-filter-scheme-op{color:#20b95d;margin-left:12px;white-space:nowrap}.hd-filter-scheme-switch input{margin-bottom:12px}.hd-filter-scheme-switch .hd-filter-scheme-switch-list{max-height:320px;overflow:auto;border:1px solid #e8e8e8;border-radius:4px}.hd-filter-scheme-switch .hd-filter-scheme-switch-item{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;cursor:pointer;border-bottom:1px solid #f0f0f0}.hd-filter-scheme-switch .hd-filter-scheme-switch-item:last-child{border-bottom:none}.hd-filter-scheme-switch .hd-filter-scheme-switch-item.active,.hd-filter-scheme-switch .hd-filter-scheme-switch-item:hover{background:#e6f7ff}.hd-filter-scheme-switch .hd-filter-scheme-tag{color:#20b95d;font-size:12px}.hd-filter-scheme-switch .hd-filter-scheme-empty{padding:24px;text-align:center;color:rgba(0,0,0,.45)}.hd-filter-scheme-save-as .ant-form-item{margin-bottom:0}"]
269
825
  }] }
270
826
  ];
271
827
  /** @nocollapse */
272
828
  HdFilterComponent.ctorParameters = () => [
273
- { type: FormBuilder }
829
+ { type: FormBuilder },
830
+ { type: HdFilterSchemeStore, decorators: [{ type: Optional }, { type: Inject, args: [HD_FILTER_SCHEME_STORE,] }] }
274
831
  ];
275
832
  HdFilterComponent.propDecorators = {
276
833
  filterList: [{ type: Input }],
834
+ enableFilterScheme: [{ type: Input }],
835
+ filterSchemeKey: [{ type: Input }],
277
836
  searchEvent: [{ type: Output }],
278
837
  resetEvent: [{ type: Output }]
279
838
  };
839
+ tslib_1.__decorate([
840
+ InputBoolean(),
841
+ tslib_1.__metadata("design:type", Object)
842
+ ], HdFilterComponent.prototype, "enableFilterScheme", void 0);
280
843
  if (false) {
281
844
  /** @type {?} */
282
845
  HdFilterComponent.prototype.filterList;
846
+ /**
847
+ * 是否启用筛选组(默认关闭)
848
+ * @type {?}
849
+ */
850
+ HdFilterComponent.prototype.enableFilterScheme;
851
+ /**
852
+ * 筛选器标识,开启筛选组时必传
853
+ * @type {?}
854
+ */
855
+ HdFilterComponent.prototype.filterSchemeKey;
283
856
  /** @type {?} */
284
857
  HdFilterComponent.prototype.searchEvent;
285
858
  /** @type {?} */
@@ -305,6 +878,49 @@ if (false) {
305
878
  * @private
306
879
  */
307
880
  HdFilterComponent.prototype.searchSubscription;
881
+ /**
882
+ * @type {?}
883
+ * @private
884
+ */
885
+ HdFilterComponent.prototype.schemeLoadSub;
886
+ /**
887
+ * @type {?}
888
+ * @private
889
+ */
890
+ HdFilterComponent.prototype.schemeActionSub;
891
+ /**
892
+ * 页面配置的初始值(虚拟「默认条件」)
893
+ * @type {?}
894
+ * @private
895
+ */
896
+ HdFilterComponent.prototype.defaultFilterValues;
897
+ /**
898
+ * @type {?}
899
+ * @private
900
+ */
901
+ HdFilterComponent.prototype.defaultValuesCaptured;
902
+ /** @type {?} */
903
+ HdFilterComponent.prototype.schemeList;
904
+ /** @type {?} */
905
+ HdFilterComponent.prototype.currentScheme;
906
+ /** @type {?} */
907
+ HdFilterComponent.prototype.currentSchemeName;
908
+ /** @type {?} */
909
+ HdFilterComponent.prototype.schemeLoading;
910
+ /** @type {?} */
911
+ HdFilterComponent.prototype.schemeSaving;
912
+ /** @type {?} */
913
+ HdFilterComponent.prototype.switchModalVisible;
914
+ /** @type {?} */
915
+ HdFilterComponent.prototype.switchKeyword;
916
+ /** @type {?} */
917
+ HdFilterComponent.prototype.switchSelectedUuid;
918
+ /** @type {?} */
919
+ HdFilterComponent.prototype.saveAsModalVisible;
920
+ /** @type {?} */
921
+ HdFilterComponent.prototype.saveAsName;
922
+ /** @type {?} */
923
+ HdFilterComponent.prototype.defaultSchemeName;
308
924
  /** @type {?} */
309
925
  HdFilterComponent.prototype.getCascaderShowSearch;
310
926
  /** @type {?} */
@@ -316,5 +932,10 @@ if (false) {
316
932
  * @private
317
933
  */
318
934
  HdFilterComponent.prototype.fb;
935
+ /**
936
+ * @type {?}
937
+ * @private
938
+ */
939
+ HdFilterComponent.prototype.schemeStore;
319
940
  }
320
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2ZhbnRhc3ktbmd6b3Jyby8iLCJzb3VyY2VzIjpbImhkLWZpbHRlci9oZC1maWx0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixxQkFBcUIsR0FDdEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPOUMsTUFBTSxPQUFPLGlCQUFpQjs7OztJQWM1QixZQUFvQixFQUFlO1FBQWYsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQVh6QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHMUMsZUFBVSxHQUFZLElBQUksQ0FBQzs7UUFFM0Isc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQWdELENBQUM7UUFDNUUsb0JBQWUsR0FBVyxDQUFDLENBQUMsQ0FBRSxTQUFTO1FBeUsvQywwQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztRQUM5Qyw2QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQztRQUNwRCx5QkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztRQXZLMUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUMvQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUNuQyxDQUFDLFNBQVM7Ozs7UUFB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O1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRTtZQUMvRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztTQUN6QztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7O1lBdkxGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsV0FBVztnQkFDckIsaW1QQUF5Qzs7YUFFMUM7Ozs7WUFkUSxXQUFXOzs7eUJBaUJqQixLQUFLOzBCQUNMLE1BQU07eUJBQ04sTUFBTTs7OztJQUZQLHVDQUFtQzs7SUFDbkMsd0NBQTJDOztJQUMzQyx1Q0FBMEM7O0lBRTFDLCtDQUE4Qjs7SUFDOUIsdUNBQTJCOztJQUUzQiw4Q0FBOEI7Ozs7O0lBQzlCLDBDQUFvRjs7Ozs7SUFDcEYsNENBQW9DOzs7OztJQUVwQywrQ0FBcUQ7O0lBdUtyRCxrREFBOEM7O0lBQzlDLHFEQUFvRDs7SUFDcEQsaURBQTRDOzs7OztJQXhLaEMsK0JBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZpbHRlciB9IGZyb20gJy4vaGQtZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgZ2V0Q2FzY2FkZXJNZW51Q2xhc3NOYW1lLFxuICBnZXRDYXNjYWRlck1lbnVTdHlsZSxcbiAgZ2V0Q2FzY2FkZXJTaG93U2VhcmNoLFxufSBmcm9tICcuLi91dGlscy9jYXNjYWRlci51dGlsJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZC1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaGQtZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaGQtZmlsdGVyLmNvbXBvbmVudC5sZXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgSGRGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGZpbHRlckxpc3Q6IEFycmF5PEZpbHRlcj47XG4gIEBPdXRwdXQoKSBzZWFyY2hFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJlc2V0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgdmFsaWRhdGVGaWx0ZXJGb3JtOiBGb3JtR3JvdXA7XG4gIGlzU2hvd01vcmU6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyDlr7lmaWx0ZXJMaXN05Y+W5qih6L+Q566XXG4gIGZpbHRlckxpc3RNb2R1bGFyOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHNlYXJjaFN1YmplY3QgPSBuZXcgU3ViamVjdDx7IGZuOiBhbnksIGV2ZW50OiBhbnksIHNlbGVjdE9wdGlvbj86IGFueTsgfT4oKTtcbiAgcHJpdmF0ZSBkZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7ICAvLyDpu5jorqTpmLLmipbml7bpl7RcblxuICBwcml2YXRlIHNlYXJjaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0LnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVvdXQpXG4gICAgKS5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBzZWxlY3RPcHRpb24gfSkgPT4gdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBzZWxlY3RPcHRpb24pKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1Nob3dNb3JlID0gdHJ1ZTtcbiAgICAvLyDlvILluLjmjZXojrdcbiAgICBpZiAoIXRoaXMuY2hlY2tMaXN0KHRoaXMuZmlsdGVyTGlzdCkpIHtcbiAgICAgIHRocm93ICdmaWx0ZXLnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIMnO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlckxpc3RNb2R1bGFyID0gdGhpcy5maWx0ZXJMaXN0Lmxlbmd0aCAlIDQ7XG4gICAgLy8g6aaW5YWI5qC55o2u5a6a5LmJ55qE57uE5Lu25pWw57uEICDljrvliJ3lp4vljJbooajljZVcbiAgICBsZXQgZm9ybUdyb3VwTGlzdCA9IHt9O1xuICAgIHRoaXMuZmlsdGVyTGlzdC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgZm9ybUdyb3VwTGlzdFtpdGVtLm5hbWVdID0gdGhpcy5mYi5jb250cm9sKGl0ZW0udmFsdWUsIFtdKTtcbiAgICAgIC8vIOWIneWni+WMluaOp+S7tuaYvuW9sVxuICAgICAgaXRlbS5zaG93ID0gaW5kZXggPCA3O1xuICAgIH0pO1xuICAgIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBMaXN0KTtcbiAgICB0aGlzLmZpbHRlckxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0ub25DaGFuZ2VFdmVudCkge1xuICAgICAgICBpZiAoaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lKSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUZpbHRlckZvcm0uZ2V0KGl0ZW0ubmFtZSkudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKGl0ZW0ub25DaGFuZ2VFdmVudERlYm91bmNlVGltZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLmdldChpdGVtLm5hbWUpLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsdWUgPT4gdGhpcy50cmlnZ2VyRXZlbnQoaXRlbS5vbkNoYW5nZUV2ZW50LCB2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblNlYXJjaEV2ZW50KGZuOiBhbnksIGV2ZW50OiBhbnksIG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWU6IGFueSwgc2VsZWN0T3B0aW9uPzogYW55KSB7XG4gICAgaWYgKG9uU2VhcmNoRXZlbnREZWJvdW5jZVRpbWUpIHtcbiAgICAgIC8vIOabtOaWsOmYsuaKluaXtumXtFxuICAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBvblNlYXJjaEV2ZW50RGVib3VuY2VUaW1lO1xuXG4gICAgICAvLyDlj5bmtojkuYvliY3nmoTorqLpmIVcbiAgICAgIGlmICh0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyDliJvlu7rmlrDnmoTorqLpmIVcbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0LnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dClcbiAgICAgICkuc3Vic2NyaWJlKCh7IGZuLCBldmVudCwgc2VsZWN0T3B0aW9uIH0pID0+IHRoaXMudHJpZ2dlckV2ZW50KGZuLCBldmVudCwgc2VsZWN0T3B0aW9uKSk7XG5cbiAgICAgIC8vIOWPkemAgeS6i+S7tlxuICAgICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQoeyBmbiwgZXZlbnQsIHNlbGVjdE9wdGlvbiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBzZWxlY3RPcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJFdmVudChmbjogYW55LCBldmVudDogYW55LCBzZWxlY3RPcHRpb24/OiBhbnkpIHtcbiAgICBpZiAoZm4gJiYgc2VsZWN0T3B0aW9uKSB7XG4gICAgICBmbihldmVudCwgc2VsZWN0T3B0aW9uKTtcbiAgICB9IGVsc2UgaWYgKGZuKSB7XG4gICAgICBmbihldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb21wdXRlT2Zmc2V0KCkge1xuICAgIC8vIOeJueauiuWkhOeQhuS4i+etieS6jjTkuKrpgInpobnnmoTmg4XlhrVcbiAgICBpZiAodGhpcy5maWx0ZXJMaXN0Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgcmV0dXJuIDE4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc1Nob3dNb3JlID8gKCh0aGlzLmZpbHRlckxpc3RNb2R1bGFyID09PSAwIHx8IHRoaXMuZmlsdGVyTGlzdC5sZW5ndGggPiA3KSA/IDAgOiAoMyAtIHRoaXMuZmlsdGVyTGlzdE1vZHVsYXIpICogNikgOiAodGhpcy5maWx0ZXJMaXN0TW9kdWxhciA9PT0gMCA/IDE4IDogKDMgLSB0aGlzLmZpbHRlckxpc3RNb2R1bGFyKSAqIDYpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0xpc3QobGlzdDogQXJyYXk8RmlsdGVyPik6IGJvb2xlYW4ge1xuICAgIGlmICghbGlzdCB8fCAobGlzdCAmJiBsaXN0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgbmFtZUxpc3QgPSBbXTtcbiAgICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIC8vIOagoemqjOWNlemhuemAieaLqeWZqFxuICAgICAgLy8gaWYgKGl0ZW0udHlwZSA9PT0gRmlsdGVyTGlzdFR5cGUuU2VsZWN0ICYmICghaXRlbS5zZWxlY3RPcHRpb24uc2VsZWN0TGlzdCB8fCAoaXRlbS5zZWxlY3RPcHRpb24uc2VsZWN0TGlzdCAmJiBpdGVtLnNlbGVjdE9wdGlvbi5zZWxlY3RMaXN0Lmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICAvLyAgIHRocm93ICdmaWx0ZXLnu4Tku7bmlbDmja7moLzlvI/kuI3op4TojIPvvIzlrZjlnKjljZXpobnpgInmi6nlmajmsqHmnInkvKDlhaXpgInpobkhJ1xuICAgICAgLy8gfVxuICAgICAgbmFtZUxpc3QucHVzaChpdGVtLm5hbWUpO1xuICAgIH0pO1xuICAgIC8vIOagoemqjG5hbWXmmK/lkKbph43lpI1cbiAgICBpZiAoWy4uLm5ldyBTZXQobmFtZUxpc3QpXS5sZW5ndGggIT09IGxpc3QubGVuZ3RoKSB7XG4gICAgICB0aHJvdyAnZmlsdGVy57uE5Lu25pWw5o2u5qC85byP5LiN6KeE6IyD77yM5a2Y5Zyo6YeN5aSNbmFtZeWAvCEnO1xuICAgIH1cbiAgICAvLyAuLi5tb3JlIGNoZWNrXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaEV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUZpbHRlckZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRGaWx0ZXJGb3JtV2l0aFZhbHVlKCk7XG4gICAgLy8gdGhpcy52YWxpZGF0ZUZpbHRlckZvcm0ucmVzZXQoKTtcbiAgICBpZiAodGhpcy5yZXNldEV2ZW50Lm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyDlpoLmnpzmnInniLbnu4Tku7bnu5HlrprkuoYgcmVzZXRFdmVudCDnmoTlpITnkIblmahcbiAgICAgIHRoaXMucmVzZXRFdmVudC5lbWl0KHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLmdldFJhd1ZhbHVlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDlpoLmnpzmsqHmnInnu5HlrprlpITnkIblmajvvIzliJnop6blj5Egc2VhcmNoRXZlbnRcbiAgICAgIHRoaXMuc2VhcmNoRXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5bim5Yid5aeL5YC86YeN572u6KGo5Y2VXG4gICAqL1xuICBwdWJsaWMgcmVzZXRGaWx0ZXJGb3JtV2l0aFZhbHVlKCkge1xuICAgIGNvbnN0IHJlc2V0VmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB0aGlzLmZpbHRlckxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgcmVzZXRWYWx1ZVtpdGVtLm5hbWVdID0gaXRlbS52YWx1ZTtcbiAgICB9KTtcbiAgICAvLyDph43nva7ooajljZXlgLzvvIjkvJrop6blj5F2YWx1ZUNoYW5nZXPkuovku7bvvIlcbiAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5wYXRjaFZhbHVlKHJlc2V0VmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLmdldFJhd1ZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2hvd01vcmUoKTogdm9pZCB7XG4gICAgdGhpcy5pc1Nob3dNb3JlID0gIXRoaXMuaXNTaG93TW9yZTtcbiAgICB0aGlzLmZpbHRlckxpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uc2hvdyA9IHRoaXMuaXNTaG93TW9yZSA/IGluZGV4IDwgNyA6IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW5wdXRDbGVhbihmaWx0ZXI6IEZpbHRlcik6IHZvaWQge1xuICAgIGNvbnN0IHBhdGNoT2JqZWN0ID0ge307XG4gICAgcGF0Y2hPYmplY3RbZmlsdGVyLm5hbWVdID0gbnVsbDtcblxuICAgIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLnBhdGNoVmFsdWUocGF0Y2hPYmplY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaYr+WQpuWFgeiuuOa4heepuu+8muS8mOWFiCBGaWx0ZXIuaGRBbGxvd0NsZWFy77yM5YW25qyhIHNlbGVjdE9wdGlvbi5oZEFsbG93Q2xlYXLvvIzpu5jorqQgdHJ1ZVxuICAgKi9cbiAgaXNBbGxvd0NsZWFyKGl0ZW06IEZpbHRlcik6IGJvb2xlYW4ge1xuICAgIGlmICghaXRlbSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChpdGVtLmhkQWxsb3dDbGVhciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gISFpdGVtLmhkQWxsb3dDbGVhcjtcbiAgICB9XG4gICAgaWYgKGl0ZW0uc2VsZWN0T3B0aW9uICYmIGl0ZW0uc2VsZWN0T3B0aW9uLmhkQWxsb3dDbGVhciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gISFpdGVtLnNlbGVjdE9wdGlvbi5oZEFsbG93Q2xlYXI7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0Q2FzY2FkZXJTaG93U2VhcmNoID0gZ2V0Q2FzY2FkZXJTaG93U2VhcmNoO1xuICBnZXRDYXNjYWRlck1lbnVDbGFzc05hbWUgPSBnZXRDYXNjYWRlck1lbnVDbGFzc05hbWU7XG4gIGdldENhc2NhZGVyTWVudVN0eWxlID0gZ2V0Q2FzY2FkZXJNZW51U3R5bGU7XG59XG4iXX0=
941
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGQtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2ZhbnRhc3ktbmd6b3Jyby8iLCJzb3VyY2VzIjpbImhkLWZpbHRlci9oZC1maWx0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQVUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixvQkFBb0IsRUFDcEIscUJBQXFCLEdBQ3RCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUNMLDZCQUE2QixFQUM3QixzQkFBc0IsRUFFdEIsbUJBQW1CLEVBQ3BCLE1BQU0sb0JBQW9CLENBQUM7QUFPNUIsTUFBTSxPQUFPLGlCQUFpQjs7Ozs7SUF3QzVCLFlBQ1UsRUFBZSxFQUM2QixXQUFnQztRQUQ1RSxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQzZCLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjs7OztRQXRDN0QsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBSTFDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcxQyxlQUFVLEdBQVksSUFBSSxDQUFDO1FBQzNCLHNCQUFpQixHQUFXLENBQUMsQ0FBQztRQUN0QixrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFnRCxDQUFDO1FBQzVFLG9CQUFlLEdBQVcsQ0FBQyxDQUFDOzs7O1FBTzVCLHdCQUFtQixHQUEyQixFQUFFLENBQUM7UUFDakQsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBRXRDLGVBQVUsR0FBMEIsRUFBRSxDQUFDO1FBQ3ZDLGtCQUFhLEdBQW1CLElBQUksQ0FBQztRQUNyQyxzQkFBaUIsR0FBRyw2QkFBNkIsQ0FBQztRQUNsRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0Isa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsdUJBQWtCLEdBQVcsSUFBSSxDQUFDO1FBRWxDLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUMzQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRVAsc0JBQWlCLEdBQUcsNkJBQTZCLENBQUM7UUFvZ0IzRCwwQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztRQUM5Qyw2QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQztRQUNwRCx5QkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztRQWhnQjFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDL0MsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDbkMsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsRUFBQyxDQUFDO0lBQzNGLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtRQUNELElBQUksT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7WUFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3ZDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDbEM7UUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQztJQUNILENBQUM7Ozs7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRixDQUFDOzs7O0lBRUQsSUFBSSxrQkFBa0I7O2NBQ2QsSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRTs7Y0FDbEMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDNUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNOzs7O1FBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDO0lBQ3pFLENBQUM7Ozs7O0lBRU8sSUFBSTtRQUNWLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwQyxNQUFNLGlCQUFpQixDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7U0FDdEI7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztjQUM5QyxhQUFhLEdBQUcsRUFBRTtRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87Ozs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN4QixDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7U0FDbkM7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7b0JBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVk7eUJBQ2hELElBQUksQ0FDSCxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQzdDO3lCQUNBLFNBQVM7Ozs7b0JBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUMsQ0FBQztpQkFDckU7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVM7Ozs7b0JBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUMsQ0FBQztpQkFDdEg7YUFDRjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7Ozs7SUFFRCxhQUFhLENBQUMsRUFBTyxFQUFFLEtBQVUsRUFBRSx5QkFBOEIsRUFBRSxZQUFrQjtRQUNuRixJQUFJLHlCQUF5QixFQUFFO1lBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcseUJBQXlCLENBQUM7WUFDakQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN2QztZQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDL0MsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDbkMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsRUFBQyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQ3REO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDOzs7Ozs7O0lBRUQsWUFBWSxDQUFDLEVBQU8sRUFBRSxLQUFVLEVBQUUsWUFBa0I7UUFDbEQsSUFBSSxFQUFFLElBQUksWUFBWSxFQUFFO1lBQ3RCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDekI7YUFBTSxJQUFJLEVBQUUsRUFBRTtZQUNiLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNYO2FBQU07WUFDTCxPQUFPO1NBQ1I7SUFDSCxDQUFDOzs7O0lBRUQsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMU0sQ0FBQzs7Ozs7O0lBRU8sU0FBUyxDQUFDLElBQW1CO1FBQ25DLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN4QyxPQUFPLElBQUksQ0FBQztTQUNiOztjQUNLLFFBQVEsR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNwQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDakQsTUFBTSw0QkFBNEIsQ0FBQztTQUNwQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7OztJQUVNLFVBQVU7UUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDOzs7O0lBRU0sU0FBUztRQUNkLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUM3RDthQUFNO1lBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDOUQ7SUFDSCxDQUFDOzs7O0lBRU0sd0JBQXdCOztjQUN2QixVQUFVLEdBQTJCLEVBQUU7UUFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMvQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckMsQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7Ozs7SUFFTSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQy9DLENBQUM7Ozs7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPOzs7OztRQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2pELENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFTSxVQUFVLENBQUMsTUFBYzs7Y0FDeEIsV0FBVyxHQUFHLEVBQUU7UUFDdEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDOzs7OztJQUVELFlBQVksQ0FBQyxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRTtZQUM3QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRTtZQUMvRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztTQUN6QztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7OztJQUlPLGNBQWMsQ0FBQyxZQUFxQjtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsNkJBQTZCLENBQUM7WUFDdkQsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDbEM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFNBQVM7Ozs7UUFDcEYsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNQLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLFlBQVksRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDZCQUE2QixFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzdEO2lCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRTs7c0JBQ2xELEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7Ozs7Z0JBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFDO2dCQUMzRSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDO2FBQ3JGO1FBQ0gsQ0FBQzs7OztRQUNELENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksWUFBWSxFQUFFO2dCQUNoQixJQUFJLENBQUMsaUJBQWlCLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDN0Q7UUFDSCxDQUFDLEVBQ0YsQ0FBQztJQUNKLENBQUM7Ozs7O0lBR0Qsb0JBQW9COztjQUNaLE1BQU0sR0FBMEIsRUFBRTs7Y0FDbEMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyw2QkFBNkIsRUFBQztRQUMxRixJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckI7YUFBTTtZQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUMvQixZQUFZLEVBQUUsNkJBQTZCO2dCQUMzQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksRUFBRSxDQUFDO2FBQzVELENBQUMsQ0FBQztTQUNKO1FBQ0QsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLENBQUMsRUFBRTtZQUNsQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEtBQUssNkJBQTZCLEVBQUU7Z0JBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEI7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Ozs7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJO1lBQ3JFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUk7WUFDekIsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNULHVCQUF1QjtRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1lBQ25ELElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLDZCQUE2QixFQUFFO2dCQUM1RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO2FBQzlCO1NBQ0Y7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7Ozs7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsSUFBb0I7UUFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2RCxDQUFDOzs7O0lBRUQsYUFBYTs7Y0FDTCxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFOztZQUNwQyxNQUFNLEdBQW1CLElBQUk7UUFDakMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLEVBQUU7WUFDckUsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJOzs7O1lBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLDZCQUE2QixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBQzttQkFDL0UsSUFBSSxDQUFDLElBQUk7Ozs7Z0JBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLDZCQUE2QixFQUFDLENBQUM7U0FDdkU7YUFBTTtZQUNMLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSTs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsa0JBQWtCLEVBQUMsQ0FBQztTQUM3RDtRQUNELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQzs7Ozs7SUFFRCxlQUFlLENBQUMsSUFBb0I7UUFDbEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Ozs7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJO2VBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxLQUFLLDZCQUE2QixDQUFDLENBQUM7SUFDMUUsQ0FBQzs7OztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE9BQU87U0FDUjs7Y0FDSyxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLDZCQUE2Qjs7Y0FDOUQsSUFBSSxHQUFtQjtZQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDcEYsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQy9CLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFdBQVcsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7U0FDekM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUzs7OztRQUMxRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztZQUM1QyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUN0QyxDQUFDOzs7O1FBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxFQUNGLENBQUM7SUFDSixDQUFDOzs7O0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFDakMsQ0FBQzs7OztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQzs7OztJQUVELGFBQWE7O2NBQ0wsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDM0MsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLEtBQUssNkJBQTZCLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQ3BELE9BQU87U0FDUjs7Y0FDSyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUk7Ozs7UUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssSUFBSSxFQUFDO1FBQ3pFLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxQixPQUFPO1NBQ1I7O2NBQ0ssSUFBSSxHQUFtQjtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDL0IsWUFBWSxFQUFFLElBQUk7WUFDbEIsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtTQUN6QztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTOzs7O1FBQzFELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDNUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDdEMsQ0FBQzs7OztRQUNELENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsRUFDRixDQUFDO0lBQ0osQ0FBQzs7OztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7WUFDNUIsT0FBTztTQUNSOztjQUNLLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUk7UUFDcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVM7OztRQUM1RCxHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU07Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDZCQUE2QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlELENBQUM7Ozs7UUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4QyxDQUFDLEVBQ0YsQ0FBQztJQUNKLENBQUM7Ozs7O0lBRU8sNEJBQTRCO1FBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFNBQVM7Ozs7UUFDL0QsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNQLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7O3NCQUMzQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJOzs7O2dCQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBQztnQkFDM0UsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7b0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO2lCQUM3QzthQUNGO1FBQ0gsQ0FBQzs7O1FBQ0QsR0FBRyxFQUFFLEdBQWdCLENBQUMsRUFDdkIsQ0FBQztJQUNKLENBQUM7Ozs7Ozs7SUFFTyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsVUFBbUI7O2NBQ25ELElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7O2NBQ2xDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJLEVBQUM7UUFDdEQsSUFBSSxNQUFNLEVBQUU7WUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN0QztJQUNILENBQUM7Ozs7Ozs7SUFFTyxXQUFXLENBQUMsTUFBc0IsRUFBRSxVQUFtQjtRQUM3RCxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3BELFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUMvQixZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7WUFDMUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksRUFBRSxDQUFDO1NBQzFGLENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLElBQUksNkJBQTZCLENBQUM7O1lBRXRGLE1BQU0sR0FBUSxFQUFFO1FBQ3BCLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLDZCQUE2QixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3hGLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUMxRDthQUFNO1lBQ0wsSUFBSTtnQkFDRixNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDO2FBQ2pEO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsTUFBTSxHQUFHLEVBQUUsQ0FBQzthQUNiO1lBQ0QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssNkJBQTZCLEVBQUU7Z0JBQzVELDJCQUEyQjtnQkFDM0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQzFFO1NBQ0Y7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDOzs7OztJQUVPLG9CQUFvQjtRQUMxQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Ozs7OztJQUVPLGlCQUFpQixDQUFDLE1BQThCO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2hELE9BQU87U0FDUjs7Y0FDSyxLQUFLLEdBQTJCLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPOzs7O1FBQUMsSUFBSSxDQUFDLEVBQUU7WUFDN0IsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3JFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDcEU7UUFDSCxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQzs7Ozs7OztJQUVPLGlCQUFpQixDQUFDLE1BQWMsRUFBRSxLQUFVO1FBQ2xELElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUNqQixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxTQUFTLEVBQUU7WUFDNUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN4QixPQUFPLEtBQUssQ0FBQyxHQUFHOzs7O2dCQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO2FBQzlDO1lBQ0QsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUFDLEtBQUssRUFBRTtZQUMvRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Ozs7OztJQUVPLGFBQWEsQ0FBQyxLQUFVO1FBQzlCLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFO1lBQzFDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7O2tCQUMzRCxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2QztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFOztrQkFDdkIsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Ozs7OztJQUVPLFVBQVUsQ0FBQyxHQUFRO1FBQ3pCLElBQUk7WUFDRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDM0Q7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sRUFBRSxDQUFDO1NBQ1g7SUFDSCxDQUFDOzs7Ozs7SUFFTyxXQUFXLENBQUMsR0FBVztRQUM3QixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLG1CQUFBLE1BQU0sRUFBTyxDQUFDLENBQUMsZ0JBQWdCLEVBQUU7WUFDckUsQ0FBQyxtQkFBQSxNQUFNLEVBQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDOzs7Ozs7SUFFTyxTQUFTLENBQUMsR0FBVztRQUMzQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxDQUFDLG1CQUFBLE1BQU0sRUFBTyxDQUFDLENBQUMsZ0JBQWdCLEVBQUU7WUFDckUsQ0FBQyxtQkFBQSxNQUFNLEVBQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUNMLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQzs7O1lBN2lCRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLHkzVUFBeUM7O2FBRTFDOzs7O1lBckJRLFdBQVc7WUFjbEIsbUJBQW1CLHVCQWtEaEIsUUFBUSxZQUFJLE1BQU0sU0FBQyxzQkFBc0I7Ozt5QkF4QzNDLEtBQUs7aUNBRUwsS0FBSzs4QkFFTCxLQUFLOzBCQUVMLE1BQU07eUJBQ04sTUFBTTs7QUFMa0I7SUFBZixZQUFZLEVBQUU7OzZEQUE0Qjs7O0lBRnBELHVDQUFtQzs7Ozs7SUFFbkMsK0NBQW9EOzs7OztJQUVwRCw0Q0FBaUM7O0lBRWpDLHdDQUEyQzs7SUFDM0MsdUNBQTBDOztJQUUxQywrQ0FBOEI7O0lBQzlCLHVDQUEyQjs7SUFDM0IsOENBQThCOzs7OztJQUM5QiwwQ0FBb0Y7Ozs7O0lBQ3BGLDRDQUFvQzs7Ozs7SUFFcEMsK0NBQXFEOzs7OztJQUNyRCwwQ0FBZ0Q7Ozs7O0lBQ2hELDRDQUFrRDs7Ozs7O0lBR2xELGdEQUF5RDs7Ozs7SUFDekQsa0RBQXNDOztJQUV0Qyx1Q0FBdUM7O0lBQ3ZDLDBDQUFxQzs7SUFDckMsOENBQWtEOztJQUNsRCwwQ0FBc0I7O0lBQ3RCLHlDQUFxQjs7SUFFckIsK0NBQTJCOztJQUMzQiwwQ0FBbUI7O0lBQ25CLCtDQUFrQzs7SUFFbEMsK0NBQTJCOztJQUMzQix1Q0FBZ0I7O0lBRWhCLDhDQUEyRDs7SUFvZ0IzRCxrREFBOEM7O0lBQzlDLHFEQUFvRDs7SUFDcEQsaURBQTRDOzs7OztJQW5nQjFDLCtCQUF1Qjs7Ozs7SUFDdkIsd0NBQW9GIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmlsdGVyLCBGaWx0ZXJMaXN0VHlwZSB9IGZyb20gJy4vaGQtZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgZ2V0Q2FzY2FkZXJNZW51Q2xhc3NOYW1lLFxuICBnZXRDYXNjYWRlck1lbnVTdHlsZSxcbiAgZ2V0Q2FzY2FkZXJTaG93U2VhcmNoLFxufSBmcm9tICcuLi91dGlscy9jYXNjYWRlci51dGlsJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZCc7XG5pbXBvcnQge1xuICBIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRSxcbiAgSERfRklMVEVSX1NDSEVNRV9TVE9SRSxcbiAgSGRGaWx0ZXJTY2hlbWUsXG4gIEhkRmlsdGVyU2NoZW1lU3RvcmVcbn0gZnJvbSAnLi9oZC1maWx0ZXItc2NoZW1lJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGQtZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2hkLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2hkLWZpbHRlci5jb21wb25lbnQubGVzcyddXG59KVxuZXhwb3J0IGNsYXNzIEhkRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgZmlsdGVyTGlzdDogQXJyYXk8RmlsdGVyPjtcbiAgLyoqIOaYr+WQpuWQr+eUqOetm+mAiee7hO+8iOm7mOiupOWFs+mXre+8iSAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgZW5hYmxlRmlsdGVyU2NoZW1lID0gZmFsc2U7XG4gIC8qKiDnrZvpgInlmajmoIfor4bvvIzlvIDlkK/nrZvpgInnu4Tml7blv4XkvKAgKi9cbiAgQElucHV0KCkgZmlsdGVyU2NoZW1lS2V5OiBzdHJpbmc7XG5cbiAgQE91dHB1dCgpIHNlYXJjaEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcmVzZXRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICB2YWxpZGF0ZUZpbHRlckZvcm06IEZvcm1Hcm91cDtcbiAgaXNTaG93TW9yZTogYm9vbGVhbiA9IHRydWU7XG4gIGZpbHRlckxpc3RNb2R1bGFyOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHNlYXJjaFN1YmplY3QgPSBuZXcgU3ViamVjdDx7IGZuOiBhbnksIGV2ZW50OiBhbnksIHNlbGVjdE9wdGlvbj86IGFueTsgfT4oKTtcbiAgcHJpdmF0ZSBkZWJvdW5jZVRpbWVvdXQ6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBzZWFyY2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzY2hlbWVMb2FkU3ViOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2NoZW1lQWN0aW9uU3ViOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIOmhtemdoumFjee9rueahOWIneWni+WAvO+8iOiZmuaLn+OAjOm7mOiupOadoeS7tuOAje+8iSAqL1xuICBwcml2YXRlIGRlZmF1bHRGaWx0ZXJWYWx1ZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBkZWZhdWx0VmFsdWVzQ2FwdHVyZWQgPSBmYWxzZTtcblxuICBzY2hlbWVMaXN0OiBBcnJheTxIZEZpbHRlclNjaGVtZT4gPSBbXTtcbiAgY3VycmVudFNjaGVtZTogSGRGaWx0ZXJTY2hlbWUgPSBudWxsO1xuICBjdXJyZW50U2NoZW1lTmFtZSA9IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FO1xuICBzY2hlbWVMb2FkaW5nID0gZmFsc2U7XG4gIHNjaGVtZVNhdmluZyA9IGZhbHNlO1xuXG4gIHN3aXRjaE1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICBzd2l0Y2hLZXl3b3JkID0gJyc7XG4gIHN3aXRjaFNlbGVjdGVkVXVpZDogc3RyaW5nID0gbnVsbDtcblxuICBzYXZlQXNNb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgc2F2ZUFzTmFtZSA9ICcnO1xuXG4gIHJlYWRvbmx5IGRlZmF1bHRTY2hlbWVOYW1lID0gSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChIRF9GSUxURVJfU0NIRU1FX1NUT1JFKSBwcml2YXRlIHNjaGVtZVN0b3JlOiBIZEZpbHRlclNjaGVtZVN0b3JlXG4gICkge1xuICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gdGhpcy5zZWFyY2hTdWJqZWN0LnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVvdXQpXG4gICAgKS5zdWJzY3JpYmUoKHsgZm4sIGV2ZW50LCBzZWxlY3RPcHRpb24gfSkgPT4gdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBzZWxlY3RPcHRpb24pKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMudHJ5TG9hZFNjaGVtZXModHJ1ZSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2ZpbHRlckxpc3QnXSkge1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydlbmFibGVGaWx0ZXJTY2hlbWUnXSB8fCBjaGFuZ2VzWydmaWx0ZXJTY2hlbWVLZXknXSkge1xuICAgICAgdGhpcy50cnlMb2FkU2NoZW1lcyh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjaGVtZUxvYWRTdWIpIHtcbiAgICAgIHRoaXMuc2NoZW1lTG9hZFN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zY2hlbWVBY3Rpb25TdWIpIHtcbiAgICAgIHRoaXMuc2NoZW1lQWN0aW9uU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNhblVzZVNjaGVtZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5lbmFibGVGaWx0ZXJTY2hlbWUgJiYgdGhpcy5maWx0ZXJTY2hlbWVLZXkgJiYgdGhpcy5zY2hlbWVTdG9yZSk7XG4gIH1cblxuICBnZXQgZmlsdGVyZWRTd2l0Y2hMaXN0KCk6IEFycmF5PEhkRmlsdGVyU2NoZW1lPiB7XG4gICAgY29uc3QgbGlzdCA9IHRoaXMuZ2V0RGlzcGxheVNjaGVtZUxpc3QoKTtcbiAgICBjb25zdCBrdyA9ICh0aGlzLnN3aXRjaEtleXdvcmQgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIWt3KSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKGl0ZW0gPT4gKGl0ZW0udGVtcGxhdGVOYW1lIHx8ICcnKS5pbmRleE9mKGt3KSA+PSAwKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2hvd01vcmUgPSB0cnVlO1xuICAgIGlmICghdGhpcy5jaGVja0xpc3QodGhpcy5maWx0ZXJMaXN0KSkge1xuICAgICAgdGhyb3cgJ2ZpbHRlcue7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMgyc7XG4gICAgfVxuICAgIGlmICghdGhpcy5maWx0ZXJMaXN0KSB7XG4gICAgICB0aGlzLmZpbHRlckxpc3QgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJMaXN0TW9kdWxhciA9IHRoaXMuZmlsdGVyTGlzdC5sZW5ndGggJSA0O1xuICAgIGNvbnN0IGZvcm1Hcm91cExpc3QgPSB7fTtcbiAgICB0aGlzLmZpbHRlckxpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGZvcm1Hcm91cExpc3RbaXRlbS5uYW1lXSA9IHRoaXMuZmIuY29udHJvbChpdGVtLnZhbHVlLCBbXSk7XG4gICAgICBpdGVtLnNob3cgPSBpbmRleCA8IDc7XG4gICAgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUZpbHRlckZvcm0gPSB0aGlzLmZiLmdyb3VwKGZvcm1Hcm91cExpc3QpO1xuICAgIGlmICghdGhpcy5kZWZhdWx0VmFsdWVzQ2FwdHVyZWQpIHtcbiAgICAgIHRoaXMuZGVmYXVsdEZpbHRlclZhbHVlcyA9IHRoaXMuY2xvbmVQbGFpbih0aGlzLmdldEZpbHRlckRhdGEoKSk7XG4gICAgICB0aGlzLmRlZmF1bHRWYWx1ZXNDYXB0dXJlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuZmlsdGVyTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoaXRlbS5vbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGlmIChpdGVtLm9uQ2hhbmdlRXZlbnREZWJvdW5jZVRpbWUpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5nZXQoaXRlbS5uYW1lKS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoaXRlbS5vbkNoYW5nZUV2ZW50RGVib3VuY2VUaW1lKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUZpbHRlckZvcm0uZ2V0KGl0ZW0ubmFtZSkudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh2YWx1ZSA9PiB0aGlzLnRyaWdnZXJFdmVudChpdGVtLm9uQ2hhbmdlRXZlbnQsIHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VhcmNoRXZlbnQoZm46IGFueSwgZXZlbnQ6IGFueSwgb25TZWFyY2hFdmVudERlYm91bmNlVGltZTogYW55LCBzZWxlY3RPcHRpb24/OiBhbnkpIHtcbiAgICBpZiAob25TZWFyY2hFdmVudERlYm91bmNlVGltZSkge1xuICAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBvblNlYXJjaEV2ZW50RGVib3VuY2VUaW1lO1xuICAgICAgaWYgKHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VhcmNoU3ViamVjdC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVvdXQpXG4gICAgICApLnN1YnNjcmliZSgoeyBmbiwgZXZlbnQsIHNlbGVjdE9wdGlvbiB9KSA9PiB0aGlzLnRyaWdnZXJFdmVudChmbiwgZXZlbnQsIHNlbGVjdE9wdGlvbikpO1xuICAgICAgdGhpcy5zZWFyY2hTdWJqZWN0Lm5leHQoeyBmbiwgZXZlbnQsIHNlbGVjdE9wdGlvbiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoZm4sIGV2ZW50LCBzZWxlY3RPcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJFdmVudChmbjogYW55LCBldmVudDogYW55LCBzZWxlY3RPcHRpb24/OiBhbnkpIHtcbiAgICBpZiAoZm4gJiYgc2VsZWN0T3B0aW9uKSB7XG4gICAgICBmbihldmVudCwgc2VsZWN0T3B0aW9uKTtcbiAgICB9IGVsc2UgaWYgKGZuKSB7XG4gICAgICBmbihldmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb21wdXRlT2Zmc2V0KCkge1xuICAgIGlmICh0aGlzLmZpbHRlckxpc3QubGVuZ3RoID09PSA0KSB7XG4gICAgICByZXR1cm4gMTg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmlzU2hvd01vcmUgPyAoKHRoaXMuZmlsdGVyTGlzdE1vZHVsYXIgPT09IDAgfHwgdGhpcy5maWx0ZXJMaXN0Lmxlbmd0aCA+IDcpID8gMCA6ICgzIC0gdGhpcy5maWx0ZXJMaXN0TW9kdWxhcikgKiA2KSA6ICh0aGlzLmZpbHRlckxpc3RNb2R1bGFyID09PSAwID8gMTggOiAoMyAtIHRoaXMuZmlsdGVyTGlzdE1vZHVsYXIpICogNik7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrTGlzdChsaXN0OiBBcnJheTxGaWx0ZXI+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFsaXN0IHx8IChsaXN0ICYmIGxpc3QubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWVMaXN0ID0gW107XG4gICAgbGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBuYW1lTGlzdC5wdXNoKGl0ZW0ubmFtZSk7XG4gICAgfSk7XG4gICAgaWYgKFsuLi5uZXcgU2V0KG5hbWVMaXN0KV0ubGVuZ3RoICE9PSBsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgJ2ZpbHRlcue7hOS7tuaVsOaNruagvOW8j+S4jeinhOiMg++8jOWtmOWcqOmHjeWkjW5hbWXlgLwhJztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaEV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUZpbHRlckZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRGaWx0ZXJGb3JtV2l0aFZhbHVlKCk7XG4gICAgaWYgKHRoaXMucmVzZXRFdmVudC5vYnNlcnZlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZXNldEV2ZW50LmVtaXQodGhpcy52YWxpZGF0ZUZpbHRlckZvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VhcmNoRXZlbnQuZW1pdCh0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5nZXRSYXdWYWx1ZSgpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzZXRGaWx0ZXJGb3JtV2l0aFZhbHVlKCkge1xuICAgIGNvbnN0IHJlc2V0VmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB0aGlzLmZpbHRlckxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgcmVzZXRWYWx1ZVtpdGVtLm5hbWVdID0gaXRlbS52YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5wYXRjaFZhbHVlKHJlc2V0VmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtLmdldFJhd1ZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2hvd01vcmUoKTogdm9pZCB7XG4gICAgdGhpcy5pc1Nob3dNb3JlID0gIXRoaXMuaXNTaG93TW9yZTtcbiAgICB0aGlzLmZpbHRlckxpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uc2hvdyA9IHRoaXMuaXNTaG93TW9yZSA/IGluZGV4IDwgNyA6IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW5wdXRDbGVhbihmaWx0ZXI6IEZpbHRlcik6IHZvaWQge1xuICAgIGNvbnN0IHBhdGNoT2JqZWN0ID0ge307XG4gICAgcGF0Y2hPYmplY3RbZmlsdGVyLm5hbWVdID0gbnVsbDtcbiAgICB0aGlzLnZhbGlkYXRlRmlsdGVyRm9ybS5wYXRjaFZhbHVlKHBhdGNoT2JqZWN0KTtcbiAgfVxuXG4gIGlzQWxsb3dDbGVhcihpdGVtOiBGaWx0ZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaXRlbS5oZEFsbG93Q2xlYXIgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuICEhaXRlbS5oZEFsbG93Q2xlYXI7XG4gICAgfVxuICAgIGlmIChpdGVtLnNlbGVjdE9wdGlvbiAmJiBpdGVtLnNlbGVjdE9wdGlvbi5oZEFsbG93Q2xlYXIgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuICEhaXRlbS5zZWxlY3RPcHRpb24uaGRBbGxvd0NsZWFyO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0g562b6YCJ57uEIC0tLS0tLS0tLS1cblxuICBwcml2YXRlIHRyeUxvYWRTY2hlbWVzKGFwcGx5RGVmYXVsdDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5jYW5Vc2VTY2hlbWUpIHtcbiAgICAgIHRoaXMuc2NoZW1lTGlzdCA9IFtdO1xuICAgICAgdGhpcy5jdXJyZW50U2NoZW1lID0gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudFNjaGVtZU5hbWUgPSBIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY2hlbWVMb2FkaW5nID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zY2hlbWVMb2FkU3ViKSB7XG4gICAgICB0aGlzLnNjaGVtZUxvYWRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5zY2hlbWVMb2FkU3ViID0gdGhpcy5zY2hlbWVTdG9yZS5xdWVyeUJ5RmlsdGVyS2V5KHRoaXMuZmlsdGVyU2NoZW1lS2V5KS5zdWJzY3JpYmUoXG4gICAgICAobGlzdCkgPT4ge1xuICAgICAgICB0aGlzLnNjaGVtZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY2hlbWVMaXN0ID0gbGlzdCB8fCBbXTtcbiAgICAgICAgaWYgKGFwcGx5RGVmYXVsdCkge1xuICAgICAgICAgIHRoaXMuYXBwbHlTY2hlbWVCeU5hbWUoSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFNjaGVtZSAmJiB0aGlzLmN1cnJlbnRTY2hlbWUudXVpZCkge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zY2hlbWVMaXN0LmZpbmQocyA9PiBzLnV1aWQgPT09IHRoaXMuY3VycmVudFNjaGVtZS51dWlkKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTY2hlbWUgPSBmb3VuZCB8fCBudWxsO1xuICAgICAgICAgIHRoaXMuY3VycmVudFNjaGVtZU5hbWUgPSBmb3VuZCA/IGZvdW5kLnRlbXBsYXRlTmFtZSA6IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNjaGVtZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IoJ+WKoOi9veetm+mAieaooeeJiOWksei0pe+8micgKyAoZXJyIHx8ICcnKSk7XG4gICAgICAgIGlmIChhcHBseURlZmF1bHQpIHtcbiAgICAgICAgICB0aGlzLmFwcGx5U2NoZW1lQnlOYW1lKEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKiog5bGV56S655So5YiX6KGo77ya5L+d6K+B5pyJ44CM6buY6K6k5p2h5Lu244CNICovXG4gIGdldERpc3BsYXlTY2hlbWVMaXN0KCk6IEFycmF5PEhkRmlsdGVyU2NoZW1lPiB7XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxIZEZpbHRlclNjaGVtZT4gPSBbXTtcbiAgICBjb25zdCBmcm9tRGIgPSB0aGlzLnNjaGVtZUxpc3QuZmluZChzID0+IHMudGVtcGxhdGVOYW1lID09PSBIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRSk7XG4gICAgaWYgKGZyb21EYikge1xuICAgICAgcmVzdWx0LnB1c2goZnJvbURiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICBmaWx0ZXJLZXk6IHRoaXMuZmlsdGVyU2NoZW1lS2V5LFxuICAgICAgICB0ZW1wbGF0ZU5hbWU6IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FLFxuICAgICAgICBmaWx0ZXJWYWx1ZTogSlNPTi5zdHJpbmdpZnkodGhpcy5kZWZhdWx0RmlsdGVyVmFsdWVzIHx8IHt9KVxuICAgICAgfSk7XG4gICAgfVxuICAgICh0aGlzLnNjaGVtZUxpc3QgfHwgW10pLmZvckVhY2gocyA9PiB7XG4gICAgICBpZiAocy50ZW1wbGF0ZU5hbWUgIT09IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvcGVuU3dpdGNoTW9kYWwoKSB7XG4gICAgaWYgKCF0aGlzLmNhblVzZVNjaGVtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN3aXRjaEtleXdvcmQgPSAnJztcbiAgICB0aGlzLnN3aXRjaFNlbGVjdGVkVXVpZCA9IHRoaXMuY3VycmVudFNjaGVtZSAmJiB0aGlzLmN1cnJlbnRTY2hlbWUudXVpZFxuICAgICAgPyB0aGlzLmN1cnJlbnRTY2hlbWUudXVpZFxuICAgICAgOiBudWxsO1xuICAgIC8vIOiZmuaLn+m7mOiupOadoeS7tu+8mnV1aWQg5Li656m65pe255So56m65Liy5qCH6K6wXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRTY2hlbWUgfHwgIXRoaXMuY3VycmVudFNjaGVtZS51dWlkKSB7XG4gICAgICBpZiAodGhpcy5jdXJyZW50U2NoZW1lTmFtZSA9PT0gSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUUpIHtcbiAgICAgICAgdGhpcy5zd2l0Y2hTZWxlY3RlZFV1aWQgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zd2l0Y2hNb2RhbFZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgY2xvc2VTd2l0Y2hNb2RhbCgpIHtcbiAgICB0aGlzLnN3aXRjaE1vZGFsVmlzaWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgc2VsZWN0U3dpdGNoSXRlbShpdGVtOiBIZEZpbHRlclNjaGVtZSkge1xuICAgIHRoaXMuc3dpdGNoU2VsZWN0ZWRVdWlkID0gaXRlbS51dWlkID8gaXRlbS51dWlkIDogJyc7XG4gIH1cblxuICBjb25maXJtU3dpdGNoKCkge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLmdldERpc3BsYXlTY2hlbWVMaXN0KCk7XG4gICAgbGV0IHRhcmdldDogSGRGaWx0ZXJTY2hlbWUgPSBudWxsO1xuICAgIGlmICh0aGlzLnN3aXRjaFNlbGVjdGVkVXVpZCA9PT0gJycgfHwgdGhpcy5zd2l0Y2hTZWxlY3RlZFV1aWQgPT0gbnVsbCkge1xuICAgICAgdGFyZ2V0ID0gbGlzdC5maW5kKHMgPT4gcy50ZW1wbGF0ZU5hbWUgPT09IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FICYmICFzLnV1aWQpXG4gICAgICAgIHx8IGxpc3QuZmluZChzID0+IHMudGVtcGxhdGVOYW1lID09PSBIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldCA9IGxpc3QuZmluZChzID0+IHMudXVpZCA9PT0gdGhpcy5zd2l0Y2hTZWxlY3RlZFV1aWQpO1xuICAgIH1cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ+ivt+mAieaLqeetm+mAieaooeeJiCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFwcGx5U2NoZW1lKHRhcmdldCwgdHJ1ZSk7XG4gICAgdGhpcy5zd2l0Y2hNb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgfVxuXG4gIGlzRGVmYXVsdFNjaGVtZShpdGVtOiBIZEZpbHRlclNjaGVtZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShpdGVtICYmIGl0ZW0udGVtcGxhdGVOYW1lID09PSBIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRSk7XG4gIH1cblxuICBjYW5EZWxldGVDdXJyZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLmN1cnJlbnRTY2hlbWUgJiYgdGhpcy5jdXJyZW50U2NoZW1lLnV1aWRcbiAgICAgICYmIHRoaXMuY3VycmVudFNjaGVtZS50ZW1wbGF0ZU5hbWUgIT09IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FKTtcbiAgfVxuXG4gIHNhdmVDdXJyZW50U2NoZW1lKCkge1xuICAgIGlmICghdGhpcy5jYW5Vc2VTY2hlbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuY3VycmVudFNjaGVtZU5hbWUgfHwgSERfRklMVEVSX0RFRkFVTFRfU0NIRU1FX05BTUU7XG4gICAgY29uc3QgYm9keTogSGRGaWx0ZXJTY2hlbWUgPSB7XG4gICAgICB1dWlkOiB0aGlzLmN1cnJlbnRTY2hlbWUgJiYgdGhpcy5jdXJyZW50U2NoZW1lLnV1aWQgPyB0aGlzLmN1cnJlbnRTY2hlbWUudXVpZCA6IG51bGwsXG4gICAgICBmaWx0ZXJLZXk6IHRoaXMuZmlsdGVyU2NoZW1lS2V5LFxuICAgICAgdGVtcGxhdGVOYW1lOiBuYW1lLFxuICAgICAgZmlsdGVyVmFsdWU6IHRoaXMuc2VyaWFsaXplRmlsdGVyVmFsdWUoKVxuICAgIH07XG4gICAgdGhpcy5zY2hlbWVTYXZpbmcgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNjaGVtZUFjdGlvblN1Yikge1xuICAgICAgdGhpcy5zY2hlbWVBY3Rpb25TdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5zY2hlbWVBY3Rpb25TdWIgPSB0aGlzLnNjaGVtZVN0b3JlLnNhdmUoYm9keSkuc3Vic2NyaWJlKFxuICAgICAgKHNhdmVkKSA9PiB7XG4gICAgICAgIHRoaXMuc2NoZW1lU2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd1N1Y2Nlc3MoJ+S/neWtmOaIkOWKnycpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTY2hlbWUgPSBzYXZlZDtcbiAgICAgICAgdGhpcy5jdXJyZW50U2NoZW1lTmFtZSA9IHNhdmVkLnRlbXBsYXRlTmFtZTtcbiAgICAgICAgdGhpcy5yZWZyZXNoU2NoZW1lTGlzdEtlZXBDdXJyZW50KCk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNjaGVtZVNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dFcnJvcign5L+d5a2Y5aSx6LSl77yaJyArIChlcnIgfHwgJycpKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgb3BlblNhdmVBc01vZGFsKCkge1xuICAgIHRoaXMuc2F2ZUFzTmFtZSA9ICcnO1xuICAgIHRoaXMuc2F2ZUFzTW9kYWxWaXNpYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIGNsb3NlU2F2ZUFzTW9kYWwoKSB7XG4gICAgdGhpcy5zYXZlQXNNb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgfVxuXG4gIGNvbmZpcm1TYXZlQXMoKSB7XG4gICAgY29uc3QgbmFtZSA9ICh0aGlzLnNhdmVBc05hbWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKCfor7fovpPlhaXmqKHniYjlkI3np7AnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcign5LiN6IO95L2/55So44CM6buY6K6k5p2h5Lu244CN5L2c5Li65qih54mI5ZCN56ew77yM6K+35L2/55So44CM5L+d5a2Y5Li65b2T5YmN44CN6KaG55uW6buY6K6k5p2h5Lu2Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0cyA9ICh0aGlzLnNjaGVtZUxpc3QgfHwgW10pLnNvbWUocyA9PiBzLnRlbXBsYXRlTmFtZSA9PT0gbmFtZSk7XG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ+aooeeJiOWQjeensOW3suWtmOWcqCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBib2R5OiBIZEZpbHRlclNjaGVtZSA9IHtcbiAgICAgIGZpbHRlcktleTogdGhpcy5maWx0ZXJTY2hlbWVLZXksXG4gICAgICB0ZW1wbGF0ZU5hbWU6IG5hbWUsXG4gICAgICBmaWx0ZXJWYWx1ZTogdGhpcy5zZXJpYWxpemVGaWx0ZXJWYWx1ZSgpXG4gICAgfTtcbiAgICB0aGlzLnNjaGVtZVNhdmluZyA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2NoZW1lQWN0aW9uU3ViKSB7XG4gICAgICB0aGlzLnNjaGVtZUFjdGlvblN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLnNjaGVtZUFjdGlvblN1YiA9IHRoaXMuc2NoZW1lU3RvcmUuc2F2ZShib2R5KS5zdWJzY3JpYmUoXG4gICAgICAoc2F2ZWQpID0+IHtcbiAgICAgICAgdGhpcy5zY2hlbWVTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zYXZlQXNNb2RhbFZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93U3VjY2Vzcygn5Y+m5a2Y5Li65oiQ5YqfJyk7XG4gICAgICAgIHRoaXMuY3VycmVudFNjaGVtZSA9IHNhdmVkO1xuICAgICAgICB0aGlzLmN1cnJlbnRTY2hlbWVOYW1lID0gc2F2ZWQudGVtcGxhdGVOYW1lO1xuICAgICAgICB0aGlzLnJlZnJlc2hTY2hlbWVMaXN0S2VlcEN1cnJlbnQoKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuc2NoZW1lU2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCflj6blrZjkuLrlpLHotKXvvJonICsgKGVyciB8fCAnJykpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBkZWxldGVDdXJyZW50U2NoZW1lKCkge1xuICAgIGlmICghdGhpcy5jYW5EZWxldGVDdXJyZW50KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdXVpZCA9IHRoaXMuY3VycmVudFNjaGVtZS51dWlkO1xuICAgIHRoaXMuc2NoZW1lU2F2aW5nID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zY2hlbWVBY3Rpb25TdWIpIHtcbiAgICAgIHRoaXMuc2NoZW1lQWN0aW9uU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuc2NoZW1lQWN0aW9uU3ViID0gdGhpcy5zY2hlbWVTdG9yZS5kZWxldGUodXVpZCkuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnNjaGVtZVNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dTdWNjZXNzKCfliKDpmaTmiJDlip8nKTtcbiAgICAgICAgdGhpcy5zY2hlbWVMaXN0ID0gKHRoaXMuc2NoZW1lTGlzdCB8fCBbXSkuZmlsdGVyKHMgPT4gcy51dWlkICE9PSB1dWlkKTtcbiAgICAgICAgdGhpcy5hcHBseVNjaGVtZUJ5TmFtZShIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRSwgdHJ1ZSk7XG4gICAgICB9LFxuICAgICAgKGVycikgPT4ge1xuICAgICAgICB0aGlzLnNjaGVtZVNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dFcnJvcign5Yig6Zmk5aSx6LSl77yaJyArIChlcnIgfHwgJycpKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoU2NoZW1lTGlzdEtlZXBDdXJyZW50KCkge1xuICAgIGlmICghdGhpcy5jYW5Vc2VTY2hlbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY2hlbWVTdG9yZS5xdWVyeUJ5RmlsdGVyS2V5KHRoaXMuZmlsdGVyU2NoZW1lS2V5KS5zdWJzY3JpYmUoXG4gICAgICAobGlzdCkgPT4ge1xuICAgICAgICB0aGlzLnNjaGVtZUxpc3QgPSBsaXN0IHx8IFtdO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50U2NoZW1lICYmIHRoaXMuY3VycmVudFNjaGVtZS51dWlkKSB7XG4gICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLnNjaGVtZUxpc3QuZmluZChzID0+IHMudXVpZCA9PT0gdGhpcy5jdXJyZW50U2NoZW1lLnV1aWQpO1xuICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2NoZW1lID0gZm91bmQ7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTY2hlbWVOYW1lID0gZm91bmQudGVtcGxhdGVOYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgpID0+IHsgLyogaWdub3JlICovIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNjaGVtZUJ5TmFtZShuYW1lOiBzdHJpbmcsIGVtaXRTZWFyY2g6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5nZXREaXNwbGF5U2NoZW1lTGlzdCgpO1xuICAgIGNvbnN0IHRhcmdldCA9IGxpc3QuZmluZChzID0+IHMudGVtcGxhdGVOYW1lID09PSBuYW1lKTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICB0aGlzLmFwcGx5U2NoZW1lKHRhcmdldCwgZW1pdFNlYXJjaCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVNjaGVtZShzY2hlbWU6IEhkRmlsdGVyU2NoZW1lLCBlbWl0U2VhcmNoOiBib29sZWFuKSB7XG4gICAgdGhpcy5jdXJyZW50U2NoZW1lID0gc2NoZW1lICYmIHNjaGVtZS51dWlkID8gc2NoZW1lIDoge1xuICAgICAgZmlsdGVyS2V5OiB0aGlzLmZpbHRlclNjaGVtZUtleSxcbiAgICAgIHRlbXBsYXRlTmFtZTogc2NoZW1lID8gc2NoZW1lLnRlbXBsYXRlTmFtZSA6IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FLFxuICAgICAgZmlsdGVyVmFsdWU6IHNjaGVtZSA/IHNjaGVtZS5maWx0ZXJWYWx1ZSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuZGVmYXVsdEZpbHRlclZhbHVlcyB8fCB7fSlcbiAgICB9O1xuICAgIHRoaXMuY3VycmVudFNjaGVtZU5hbWUgPSB0aGlzLmN1cnJlbnRTY2hlbWUudGVtcGxhdGVOYW1lIHx8IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FO1xuXG4gICAgbGV0IHZhbHVlczogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY3VycmVudFNjaGVtZU5hbWUgPT09IEhEX0ZJTFRFUl9ERUZBVUxUX1NDSEVNRV9OQU1FICYmICEoc2NoZW1lICYmIHNjaGVtZS51dWlkKSkge1xuICAgICAgdmFsdWVzID0gdGhpcy5jbG9uZVBsYWluKHRoaXMuZGVmYXVsdEZpbHRlclZhbHVlcyB8fCB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhbHVlcyA9IEpTT04ucGFyc2Uoc2NoZW1lLmZpbHRlclZhbHVlIHx8ICd7fScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB2YWx1ZXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTY2hlbWVOYW1lID09PSBIRF9GSUxURVJfREVGQVVMVF9TQ0hFTUVfTkFNRSkge1xuICAgICAgICAvLyDlupPkuK3pu5jorqTmnaHku7bopobnm5bliJ3lp4vlgLzvvJrku6Xpu5jorqTlgLzkuLrlupXvvIzlho3lj6DliqDlupPlgLxcbiAgICAgICAgdmFsdWVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kZWZhdWx0RmlsdGVyVmFsdWVzIHx8IHt9LCB2YWx1ZXMgfHwge30pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnBhdGNoRmlsdGVyVmFsdWVzKHZhbHVlcyk7XG4gICAgaWYgKGVtaXRTZWFyY2gpIHtcbiAgICAgIHRoaXMuc3VibWl0Rm9ybSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VyaWFsaXplRmlsdGVyVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRGaWx0ZXJEYXRhKCkgfHwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXRjaEZpbHRlclZhbHVlcyh2YWx1ZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVGaWx0ZXJGb3JtIHx8ICF0aGlzLmZpbHRlckxpc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGF0Y2g6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB0aGlzLmZpbHRlckxpc3QuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICh2YWx1ZXMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlcywgaXRlbS5uYW1lKSkge1xuICAgICAgICBwYXRjaFtpdGVtLm5hbWVdID0gdGhpcy5yZXZpdmVGaWx0ZXJWYWx1ZShpdGVtLCB2YWx1ZXNbaXRlbS5uYW1lXSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUZpbHRlckZvcm0ucGF0Y2hWYWx1ZShwYXRjaCk7XG4gIH1cblxuICBwcml2YXRlIHJldml2ZUZpbHRlclZhbHVlKGZpbHRlcjogRmlsdGVyLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlckxpc3RUeXBlLkRhdGVSYW5nZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAodiA9PiB0aGlzLnBhcnNlRGF0ZUxpa2UodikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlckxpc3RUeXBlLkRhdGUgfHwgZmlsdGVyLnR5cGUgPT09IEZpbHRlckxpc3RUeXBlLk1vbnRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVMaWtlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZURhdGVMaWtlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9Ly50ZXN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIHJldHVybiBpc05hTihkLmdldFRpbWUoKSkgPyB2YWx1ZSA6IGQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA/IHZhbHVlIDogZDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZVBsYWluKG9iajogYW55KTogYW55IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqID09IG51bGwgPyB7fSA6IG9iaikpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dTdWNjZXNzKG1zZzogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICh3aW5kb3cgYXMgYW55KS5oZE1lc3NhZ2VTZXJ2aWNlKSB7XG4gICAgICAod2luZG93IGFzIGFueSkuaGRNZXNzYWdlU2VydmljZS5wcm90b3R5cGUuc3VjY2Vzcyhtc2cpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Vycm9yKG1zZzogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICh3aW5kb3cgYXMgYW55KS5oZE1lc3NhZ2VTZXJ2aWNlKSB7XG4gICAgICAod2luZG93IGFzIGFueSkuaGRNZXNzYWdlU2VydmljZS5wcm90b3R5cGUuZXJyb3IobXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICB9XG4gIH1cblxuICBnZXRDYXNjYWRlclNob3dTZWFyY2ggPSBnZXRDYXNjYWRlclNob3dTZWFyY2g7XG4gIGdldENhc2NhZGVyTWVudUNsYXNzTmFtZSA9IGdldENhc2NhZGVyTWVudUNsYXNzTmFtZTtcbiAgZ2V0Q2FzY2FkZXJNZW51U3R5bGUgPSBnZXRDYXNjYWRlck1lbnVTdHlsZTtcbn1cbiJdfQ==