@mediusinc/mng-commons 5.4.0 → 5.5.0-rc.1
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.
- package/core/descriptors/table.descriptor.d.ts +4 -2
- package/core/directives/rerender.directive.d.ts +9 -0
- package/core/helpers/route.d.ts +25 -25
- package/core/index.d.ts +2 -0
- package/core/models/version.model.d.ts +16 -4
- package/core/reactivity/effect.d.ts +16 -0
- package/esm2022/core/components/notification/notification-wrapper.component.mjs +4 -4
- package/esm2022/core/components/pages/error/error.page.component.mjs +4 -4
- package/esm2022/core/components/pages/not-found/not-found.page.component.mjs +4 -4
- package/esm2022/core/data-list/data-list-params-helpers.mjs +18 -3
- package/esm2022/core/descriptors/table.descriptor.mjs +1 -1
- package/esm2022/core/directives/component.directive.mjs +4 -4
- package/esm2022/core/directives/rerender.directive.mjs +25 -0
- package/esm2022/core/directives/template.directive.mjs +4 -4
- package/esm2022/core/index.mjs +4 -1
- package/esm2022/core/models/version.model.mjs +1 -1
- package/esm2022/core/pipes/boolean.pipe.mjs +6 -6
- package/esm2022/core/pipes/class-map.pipe.mjs +4 -4
- package/esm2022/core/pipes/enum.pipe.mjs +4 -4
- package/esm2022/core/pipes/enumerate-async.pipe.mjs +4 -4
- package/esm2022/core/pipes/enumerate.pipe.mjs +4 -4
- package/esm2022/core/pipes/getter.pipe.mjs +5 -5
- package/esm2022/core/pipes/i18n-property.pipe.mjs +4 -4
- package/esm2022/core/pipes/json-path.pipe.mjs +4 -4
- package/esm2022/core/pipes/parametrize.pipe.mjs +4 -4
- package/esm2022/core/pipes/template.pipe.mjs +4 -4
- package/esm2022/core/reactivity/effect.mjs +22 -0
- package/esm2022/core/security/permission.service.mjs +4 -4
- package/esm2022/core/services/commons-init.service.mjs +4 -4
- package/esm2022/core/services/commons-router.service.mjs +4 -4
- package/esm2022/core/services/commons-storage.service.mjs +4 -4
- package/esm2022/core/services/commons.service.mjs +8 -8
- package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +32 -25
- package/esm2022/filter/descriptors/filter.descriptor.mjs +53 -1
- package/esm2022/form/components/autocomplete/autocomplete.component.mjs +4 -4
- package/esm2022/form/components/date-range/date-range.component.mjs +4 -4
- package/esm2022/form/components/dropdown/dropdown.component.mjs +4 -4
- package/esm2022/form/components/number-range/number-range.component.mjs +4 -4
- package/esm2022/form/directives/input-trim.directive.mjs +4 -4
- package/esm2022/table/api/descriptors/sort.descriptor.mjs +2 -2
- package/esm2022/table/api/descriptors/table.descriptor.mjs +31 -7
- package/esm2022/table/components/column-filter/column-filter.component.mjs +33 -40
- package/esm2022/table/components/column-value/column-value.component.mjs +6 -6
- package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +7 -7
- package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +28 -35
- package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +44 -45
- package/esm2022/table/components/table/table.component.mjs +114 -430
- package/esm2022/table/helpers/filters.mjs +9 -25
- package/esm2022/table/helpers/table.mjs +24 -0
- package/esm2022/table/index.mjs +2 -2
- package/esm2022/table/models/column-preferences.model.mjs +1 -1
- package/esm2022/table/models/filter.model.mjs +1 -1
- package/esm2022/table/pipes/filter-value.pipe.mjs +4 -4
- package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +4 -4
- package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +4 -4
- package/esm2022/table/services/table-data.service.mjs +194 -0
- package/esm2022/table/services/table-metadata.service.mjs +136 -0
- package/esm2022/table/services/table-preferences.service.mjs +142 -0
- package/esm2022/tableview/action/components/action/action.component.mjs +6 -7
- package/esm2022/tableview/action/components/editor/action-editor.component.mjs +4 -4
- package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +69 -46
- package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +4 -4
- package/esm2022/tableview/action/components/route/action-route.component.mjs +5 -6
- package/esm2022/tableview/action/components/table/action-table.component.mjs +6 -6
- package/esm2022/tableview/action/helpers/action-execution.mjs +25 -0
- package/esm2022/tableview/action/models/execution/action-instance.model.mjs +2 -3
- package/esm2022/tableview/action/services/action-executor.service.mjs +12 -79
- package/esm2022/tableview/action/services/component-action-executor.service.mjs +4 -4
- package/esm2022/tableview/action/services/data-provider-executor.service.mjs +4 -4
- package/esm2022/tableview/action/services/navigation.service.mjs +4 -4
- package/esm2022/tableview/action/services/root-action-executor.service.mjs +4 -4
- package/esm2022/tableview/action/services/view-container.service.mjs +4 -4
- package/esm2022/tableview/api/action/descriptors/action-confirmation.descriptor.mjs +13 -1
- package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +67 -10
- package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +2 -2
- package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +17 -1
- package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +32 -7
- package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +2 -2
- package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +2 -1
- package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +4 -4
- package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +13 -5
- package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +3 -2
- package/esm2022/tableview/api/tableview/helpers/tableview-descriptor-helpers.mjs +2 -2
- package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +4 -4
- package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +31 -38
- package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +7 -5
- package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +7 -5
- package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +7 -5
- package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +5 -5
- package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +5 -6
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +5 -6
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +6 -7
- package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +6 -5
- package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +4 -4
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +4 -4
- package/esm2022/tableview/editor/helpers/editor-autosave.mjs +2 -2
- package/esm2022/tableview/editor/services/form-editor.service.mjs +4 -4
- package/esm2022/tableview/index.mjs +1 -2
- package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +4 -4
- package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +4 -4
- package/fesm2022/mediusinc-mng-commons-core.mjs +130 -71
- package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-filter.mjs +83 -24
- package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form.mjs +15 -15
- package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-model.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table-api.mjs +31 -7
- package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table.mjs +704 -606
- package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +146 -26
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview.mjs +260 -317
- package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
- package/filter/descriptors/filter-lookup.descriptor.d.ts +17 -20
- package/filter/descriptors/filter.descriptor.d.ts +32 -2
- package/form/components/date-range/date-range.component.d.ts +3 -3
- package/form/components/number-range/number-range.component.d.ts +2 -2
- package/package.json +4 -4
- package/table/api/descriptors/column.descriptor.d.ts +1 -1
- package/table/api/descriptors/sort.descriptor.d.ts +2 -2
- package/table/api/descriptors/table.descriptor.d.ts +20 -6
- package/table/components/column-filter/column-filter.component.d.ts +8 -14
- package/table/components/filter/filter-active-tag/filter-active-tag.component.d.ts +5 -5
- package/table/components/filter/filter-form/filter-form.component.d.ts +10 -19
- package/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.d.ts +11 -13
- package/table/components/table/table.component.d.ts +20 -64
- package/table/helpers/filters.d.ts +4 -7
- package/table/helpers/table.d.ts +6 -0
- package/table/index.d.ts +1 -1
- package/table/models/column-preferences.model.d.ts +2 -2
- package/table/models/filter.model.d.ts +14 -2
- package/table/services/table-data.service.d.ts +36 -0
- package/table/services/table-metadata.service.d.ts +31 -0
- package/table/services/table-preferences.service.d.ts +25 -0
- package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +4 -7
- package/tableview/action/components/localization/data-language-dropdown.component.d.ts +1 -1
- package/tableview/action/helpers/action-execution.d.ts +7 -0
- package/tableview/action/models/execution/action-instance.model.d.ts +1 -2
- package/tableview/action/services/action-executor.service.d.ts +1 -2
- package/tableview/api/action/descriptors/action-confirmation.descriptor.d.ts +1 -0
- package/tableview/api/action/descriptors/action-editor.descriptor.d.ts +12 -4
- package/tableview/api/action/descriptors/action-link.descriptor.d.ts +1 -0
- package/tableview/api/action/descriptors/action.descriptor.d.ts +5 -3
- package/tableview/api/action/models/execution/action-instance-state.model.d.ts +1 -1
- package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +4 -10
- package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +1 -1
- package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +6 -4
- package/tableview/editor/components/editor/form-editor.component.d.ts +3 -2
- package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +1 -1
- package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +2 -1
- package/tableview/index.d.ts +0 -1
- package/version-info.json +6 -6
- package/esm2022/table/services/data-list.service.mjs +0 -29
- package/esm2022/tableview/action/models/execution/action-instance-state.model.mjs +0 -32
- package/table/services/data-list.service.d.ts +0 -19
- package/tableview/action/models/execution/action-instance-state.model.d.ts +0 -30
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { animate, style, transition, trigger } from '@angular/animations';
|
|
2
2
|
import { NgClass, NgTemplateOutlet } from '@angular/common';
|
|
3
3
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, ElementRef, Renderer2, ViewEncapsulation, computed, effect, inject, input, signal, untracked, viewChild } from '@angular/core';
|
|
4
|
-
import { takeUntilDestroyed
|
|
4
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
5
|
import { FormsModule } from '@angular/forms';
|
|
6
6
|
import { TranslateModule } from '@ngx-translate/core';
|
|
7
|
-
import { OverlayService,
|
|
7
|
+
import { OverlayService, TranslationKeys } from 'primeng/api';
|
|
8
8
|
import { CalendarModule } from 'primeng/calendar';
|
|
9
9
|
import { CheckboxModule } from 'primeng/checkbox';
|
|
10
10
|
import { ConnectedOverlayScrollHandler, DomHandler } from 'primeng/dom';
|
|
@@ -15,11 +15,12 @@ import { InputTextModule } from 'primeng/inputtext';
|
|
|
15
15
|
import { Table, TableModule } from 'primeng/table';
|
|
16
16
|
import { ZIndexUtils } from 'primeng/utils';
|
|
17
17
|
import { Subject, debounceTime, distinctUntilChanged } from 'rxjs';
|
|
18
|
-
import {
|
|
18
|
+
import { FilterMatchMode, RerenderDirective } from '@mediusinc/mng-commons/core';
|
|
19
19
|
import { FilterLookupDescriptor, FilterLookupTypeEnum, FilterTypeEnum } from '@mediusinc/mng-commons/filter';
|
|
20
20
|
import { AutocompleteComponent, DateRangeComponent, DropdownComponent, InputTrimDirective, NumberRangeComponent } from '@mediusinc/mng-commons/form';
|
|
21
|
-
import { filterAdjustDisplayValueOnMatchModeChange,
|
|
22
|
-
import {
|
|
21
|
+
import { filterAdjustDisplayValueOnMatchModeChange, filterSetMetadataOnChange, filterSetMetadataOnDisplayChange } from '../../helpers/filters';
|
|
22
|
+
import { TableDataService } from '../../services/table-data.service';
|
|
23
|
+
import { TableMetadataService } from '../../services/table-metadata.service';
|
|
23
24
|
import * as i0 from "@angular/core";
|
|
24
25
|
import * as i1 from "@ngx-translate/core";
|
|
25
26
|
import * as i2 from "primeng/calendar";
|
|
@@ -39,23 +40,17 @@ export class TableColumnFilterComponent {
|
|
|
39
40
|
this.FilterMatchMode = FilterMatchMode;
|
|
40
41
|
this.el = inject(ElementRef);
|
|
41
42
|
this.primeTable = inject(Table);
|
|
42
|
-
this.dataListService = inject((DataListService));
|
|
43
|
-
this.moduleConfig = inject(COMMONS_MODULE_CONFIG_IT, { optional: true });
|
|
44
43
|
this.renderer = inject(Renderer2);
|
|
45
|
-
this.primeConfig = inject(PrimeNGConfig);
|
|
46
44
|
this.overlayService = inject(OverlayService);
|
|
47
45
|
this.cd = inject(ChangeDetectorRef);
|
|
48
46
|
this.destroyRef = inject(DestroyRef);
|
|
47
|
+
this.tableData = inject((TableDataService));
|
|
48
|
+
this.tableMetadata = inject(TableMetadataService);
|
|
49
49
|
this.document = window.document;
|
|
50
|
-
this.
|
|
51
|
-
this.descriptorAsLookup = computed(() =>
|
|
50
|
+
this.metadata = input.required();
|
|
51
|
+
this.descriptorAsLookup = computed(() => this.metadata().descriptor instanceof FilterLookupDescriptor ? this.metadata().descriptor : undefined);
|
|
52
52
|
this.icon = viewChild('icon');
|
|
53
|
-
this.
|
|
54
|
-
this.matchModes = computed(() => {
|
|
55
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
56
|
-
const translationObserver = this.translationObserver();
|
|
57
|
-
return generateMatchModeOptions(this.primeConfig, this.descriptor(), this.serializationCfg);
|
|
58
|
-
});
|
|
53
|
+
this.matchModes = computed(() => this.metadata().matchModes);
|
|
59
54
|
this.filterConstraint = signal(undefined);
|
|
60
55
|
this.isFilterSet = computed(() => this.filterConstraint()?.matchMode === FilterMatchMode.Exists ||
|
|
61
56
|
this.filterConstraint()?.matchMode === FilterMatchMode.DoesNotExist ||
|
|
@@ -63,19 +58,20 @@ export class TableColumnFilterComponent {
|
|
|
63
58
|
this.isInputDisabled = computed(() => this.filterConstraint()?.matchMode === FilterMatchMode.Exists || this.filterConstraint()?.matchMode === FilterMatchMode.DoesNotExist);
|
|
64
59
|
this.overlayVisible = signal(false);
|
|
65
60
|
// display configs
|
|
66
|
-
this.
|
|
67
|
-
|
|
61
|
+
this.isMultiselect = computed(() => {
|
|
62
|
+
const ft = this.filterConstraint();
|
|
63
|
+
const matchMode = ft?.displayMatchMode ?? this.metadata().defaultMatchMode;
|
|
64
|
+
return (matchMode === FilterMatchMode.In || matchMode === FilterMatchMode.NotIn) && (ft?.displayValue == null || Array.isArray(ft.displayValue));
|
|
65
|
+
});
|
|
68
66
|
this.window = this.document.defaultView;
|
|
69
67
|
this.numericValueFromModelChange = null;
|
|
70
68
|
this.dateDebounceSubject = new Subject();
|
|
71
|
-
this.serializationCfg = {};
|
|
72
|
-
filterApplySerializationConfigToCmp(this.moduleConfig, this.serializationCfg);
|
|
73
69
|
this.dateDebounceSubject.pipe(debounceTime(500), distinctUntilChanged(), takeUntilDestroyed()).subscribe(v => this.updateFilterOnDisplayValueChange(v));
|
|
74
70
|
effect(() => {
|
|
75
|
-
const fieldFilterMeta = this.
|
|
71
|
+
const fieldFilterMeta = this.tableData.filterMeta()?.[this.metadata().descriptor.property];
|
|
76
72
|
const filterConstraint = untracked(() => this.filterConstraint());
|
|
77
73
|
if (fieldFilterMeta && (!filterConstraint || filterConstraint.value !== fieldFilterMeta.value || filterConstraint.matchMode !== fieldFilterMeta.matchMode)) {
|
|
78
|
-
this.setFilterConstraint(filterSetMetadataOnChange(fieldFilterMeta, fieldFilterMeta.matchMode, fieldFilterMeta.value, untracked(() => this.
|
|
74
|
+
this.setFilterConstraint(filterSetMetadataOnChange(fieldFilterMeta, fieldFilterMeta.matchMode, fieldFilterMeta.value, untracked(() => this.metadata().descriptor.filterType), untracked(() => this.metadata().dateConfig)));
|
|
79
75
|
}
|
|
80
76
|
}, { allowSignalWrites: true });
|
|
81
77
|
}
|
|
@@ -141,16 +137,13 @@ export class TableColumnFilterComponent {
|
|
|
141
137
|
}
|
|
142
138
|
// eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any
|
|
143
139
|
dropdownFilter(value) {
|
|
144
|
-
if (Array.isArray(value) && value.length === 0) {
|
|
145
|
-
value = undefined;
|
|
146
|
-
}
|
|
147
140
|
this.updateFilterOnDisplayValueChange(value);
|
|
148
141
|
}
|
|
149
142
|
onMatchModeChange(displayMatchMode) {
|
|
150
143
|
if (this.filterConstraint()?.displayMatchMode === displayMatchMode) {
|
|
151
144
|
return;
|
|
152
145
|
}
|
|
153
|
-
this.setFilterConstraint(filterSetMetadataOnDisplayChange(this.filterConstraint(), displayMatchMode, filterAdjustDisplayValueOnMatchModeChange(displayMatchMode, this.filterConstraint()?.displayValue), this.
|
|
146
|
+
this.setFilterConstraint(filterSetMetadataOnDisplayChange(this.filterConstraint(), displayMatchMode, filterAdjustDisplayValueOnMatchModeChange(displayMatchMode, this.filterConstraint()?.displayValue), this.metadata().descriptor.filterType, this.metadata().dateConfig));
|
|
154
147
|
this.hideOverlay();
|
|
155
148
|
}
|
|
156
149
|
onMatchModeKeyDown(event) {
|
|
@@ -219,7 +212,7 @@ export class TableColumnFilterComponent {
|
|
|
219
212
|
case 'visible':
|
|
220
213
|
this.overlay = event.element;
|
|
221
214
|
this.renderer.appendChild(this.document.body, this.overlay);
|
|
222
|
-
ZIndexUtils.set('overlay', this.overlay, this.primeConfig.zIndex.overlay);
|
|
215
|
+
ZIndexUtils.set('overlay', this.overlay, this.tableMetadata.primeConfig.zIndex.overlay);
|
|
223
216
|
DomHandler.absolutePosition(this.overlay, this.icon()?.nativeElement);
|
|
224
217
|
this.bindDocumentClickListener();
|
|
225
218
|
this.bindDocumentResizeListener();
|
|
@@ -246,7 +239,7 @@ export class TableColumnFilterComponent {
|
|
|
246
239
|
}
|
|
247
240
|
}
|
|
248
241
|
get noFilterLabel() {
|
|
249
|
-
return this.primeConfig.getTranslation(TranslationKeys.NO_FILTER);
|
|
242
|
+
return this.tableMetadata.primeConfig.getTranslation(TranslationKeys.NO_FILTER);
|
|
250
243
|
}
|
|
251
244
|
clearFilter() {
|
|
252
245
|
this.initFilterConstraint(true);
|
|
@@ -336,19 +329,18 @@ export class TableColumnFilterComponent {
|
|
|
336
329
|
this.overlay = null;
|
|
337
330
|
}
|
|
338
331
|
updateFilterOnDisplayValueChange(displayValue) {
|
|
339
|
-
this.setFilterConstraint(filterSetMetadataOnDisplayChange(this.filterConstraint(), this.filterConstraint()?.displayMatchMode ??
|
|
332
|
+
this.setFilterConstraint(filterSetMetadataOnDisplayChange(this.filterConstraint(), this.filterConstraint()?.displayMatchMode ?? this.metadata().defaultMatchMode, displayValue, this.metadata().descriptor.filterType, this.metadata().dateConfig));
|
|
340
333
|
}
|
|
341
334
|
initFilterConstraint(reset = false) {
|
|
342
335
|
if (reset) {
|
|
343
|
-
|
|
344
|
-
this.primeTable.filters[this.descriptor().property] = { value: null, matchMode: defaultMatchMode };
|
|
336
|
+
this.primeTable.filters[this.metadata().descriptor.property] = { value: null, matchMode: this.metadata().defaultMatchMode };
|
|
345
337
|
}
|
|
346
338
|
// set internal filter constraint
|
|
347
|
-
let metadata = this.primeTable.filters[this.
|
|
339
|
+
let metadata = this.primeTable.filters[this.metadata().descriptor.property];
|
|
348
340
|
if (Array.isArray(metadata)) {
|
|
349
341
|
metadata = metadata[0];
|
|
350
342
|
}
|
|
351
|
-
this.setFilterConstraint(filterSetMetadataOnChange(metadata, metadata?.matchMode, metadata?.value, this.
|
|
343
|
+
this.setFilterConstraint(filterSetMetadataOnChange(metadata, metadata?.matchMode, metadata?.value, this.metadata().descriptor.filterType, this.metadata().dateConfig));
|
|
352
344
|
}
|
|
353
345
|
setFilterConstraint(metadata) {
|
|
354
346
|
if (metadata && !metadata.displayMatchMode)
|
|
@@ -356,18 +348,18 @@ export class TableColumnFilterComponent {
|
|
|
356
348
|
if (metadata && !metadata.displayValue)
|
|
357
349
|
metadata.displayValue = metadata.value;
|
|
358
350
|
this.filterConstraint.set(metadata);
|
|
359
|
-
this.primeTable.filters[this.
|
|
351
|
+
this.primeTable.filters[this.metadata().descriptor.property] = this.filterConstraint();
|
|
360
352
|
this.primeTable._filter();
|
|
361
353
|
}
|
|
362
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.
|
|
363
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: TableColumnFilterComponent, isStandalone: true, selector: "mng-table-column-filter", inputs: { descriptor: { classPropertyName: "descriptor", publicName: "descriptor", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "icon", first: true, predicate: ["icon"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"p-column-filter p-column-filter-row\">\n @switch (descriptor().filterType) {\n @case (FilterTypeEnum.Number) {\n @if (filterConstraint()?.displayMatchMode === 'between') {\n <mng-number-range\n className=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (keyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"descriptor().placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"descriptor().numberUseGrouping\"\n [minFractionDigits]=\"numberConfig()?.fractionsMin\"\n [maxFractionDigits]=\"numberConfig()?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (onKeyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"descriptor().placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"descriptor().numberUseGrouping\"\n [minFractionDigits]=\"numberConfig()?.fractionsMin\"\n [maxFractionDigits]=\"numberConfig()?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [ngModel]=\"filterConstraint()?.displayValue\" binary=\"true\" (ngModelChange)=\"onCheckboxModelChange($event)\"></p-checkbox>\n }\n @case (FilterTypeEnum.Date) {\n @if (filterConstraint()?.displayMatchMode === FilterMatchMode.Between) {\n <mng-date-range\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [showTime]=\"dateConfig()?.showTime ?? false\"\n [showSeconds]=\"dateConfig()?.showSeconds ?? false\"\n [dateFormat]=\"dateConfig()?.format\"\n [placeholder]=\"descriptor().placeholder ?? 'mngTable.typeToFilter' | translate\"\n [disabled]=\"isInputDisabled()\"></mng-date-range>\n } @else {\n <p-calendar\n appendTo=\"body\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [placeholder]=\"descriptor().placeholder ?? 'mngTable.typeToFilter' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"dateConfig()?.showTime ?? false\"\n [showSeconds]=\"dateConfig()?.showSeconds ?? false\"\n [dateFormat]=\"dateConfig()?.format\"\n [firstDayOfWeek]=\"1\">\n </p-calendar>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @default {\n <input\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input\"\n [value]=\"filterConstraint()?.displayValue\"\n [disabled]=\"isInputDisabled()\"\n (input)=\"onTextModelChange($event)\"\n (keydown.enter)=\"onTextInputEnterKeyDown($event)\"\n [attr.placeholder]=\"descriptor().placeholder ?? 'mngTable.typeToFilter' | translate\"\n [mngInputTrim]=\"descriptor().trimOption\" />\n }\n }\n\n <ng-template #lookupFilter>\n @if (descriptorAsLookup(); as lookup) {\n @switch (lookup.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsTrackProperty]=\"lookup.optionsValueProperty\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"lookup.multiselect\"\n [autoClear]=\"lookup.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookup.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookup.autocompleteInlineSearch ?? false\"\n [placeholder]=\"descriptor().placeholder ?? 'mngTable.searchToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"autocompleteFilter($event)\"\n [searchTrim]=\"descriptor().trimOption\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"lookup.multiselect\"\n [placeholder]=\"descriptor().placeholder ?? 'mngTable.selectToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [showClear]=\"false\"\n [changeValueOnBlur]=\"lookup.multiselect\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"dropdownFilter($event)\">\n </mng-dropdown>\n }\n }\n }\n </ng-template>\n\n @if (matchModes().length > 1) {\n <button\n #icon\n type=\"button\"\n class=\"p-column-filter-menu-button p-link\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"overlayVisible()\"\n [ngClass]=\"{'p-column-filter-menu-button-open': overlayVisible(), 'p-column-filter-menu-button-active': isFilterSet()}\"\n (click)=\"toggleMenu($event)\"\n (keydown)=\"onToggleButtonKeyDown($event)\">\n <FilterIcon [styleClass]=\"'pi-filter-icon'\" />\n </button>\n }\n <button #icon [ngClass]=\"{'p-hidden-space': !isFilterSet()}\" type=\"button\" class=\"p-column-filter-clear-button p-link\" (click)=\"clearFilter()\">\n <FilterSlashIcon />\n </button>\n @if (overlayVisible()) {\n <div\n class=\"p-column-filter-overlay p-component p-fluid\"\n (click)=\"onContentClick()\"\n [@overlayAnimation]=\"'visible'\"\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\"\n (@overlayAnimation.done)=\"onOverlayAnimationEnd($event)\"\n (keydown.escape)=\"onEscape()\">\n <ul class=\"p-column-filter-row-items\">\n @for (matchMode of matchModes(); track matchMode; let i = $index) {\n <li\n class=\"p-column-filter-row-item\"\n (click)=\"onMatchModeChange(matchMode.value)\"\n (keydown)=\"onMatchModeKeyDown($event)\"\n (keydown.enter)=\"this.onMatchModeChange(matchMode.value)\"\n [ngClass]=\"{'p-highlight': matchMode.value === filterConstraint()?.displayMatchMode}\"\n [attr.tabindex]=\"i === 0 ? '0' : null\">\n {{ matchMode.label }}\n </li>\n }\n <li class=\"p-column-filter-separator\"></li>\n <li class=\"p-column-filter-row-item\" (click)=\"onRowClearItemClick()\" (keydown)=\"onMatchModeKeyDown($event)\" (keydown.enter)=\"onRowClearItemClick()\">\n {{ noFilterLabel }}\n </li>\n </ul>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TableModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: DateRangeComponent, selector: "mng-date-range", inputs: ["placeholder", "showTime", "showSeconds", "dateFormat", "className", "required", "disabled"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i2.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AutocompleteComponent, selector: "mng-autocomplete", inputs: ["dataProvider", "optionsTrackProperty", "optionsValueProperty", "optionsLabelProperty", "optionsLabelTranslate", "inlineSearch", "openOnFocus", "multiselect", "placeholder", "className", "dropdownClassName", "showClear", "autoClear", "selectFirst", "searchTrim", "disabled"], outputs: ["valueChange", "blur"] }, { kind: "component", type: DropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "options", "optionsTrackProperty", "optionsLabelProperty", "optionsLabelTranslate", "optionsValueProperty", "optionsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur", "loading", "disabled", "allowInput", "appendTo", "inlineSearch", "searchTrim"], outputs: ["valueChange", "blur"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i4.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: FilterIcon, selector: "FilterIcon" }, { kind: "component", type: FilterSlashIcon, selector: "FilterSlashIcon" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: InputTrimDirective, selector: "[mngInputTrim]", inputs: ["mngInputTrim"] }, { kind: "component", type: NumberRangeComponent, selector: "mng-number-range", inputs: ["placeholder", "useGrouping", "minFractionDigits", "maxFractionDigits", "required", "disabled"], outputs: ["keyDown"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }], animations: [
|
|
354
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableColumnFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
355
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: TableColumnFilterComponent, isStandalone: true, selector: "mng-table-column-filter", inputs: { metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "icon", first: true, predicate: ["icon"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"p-column-filter p-column-filter-row\">\n @switch (metadata().descriptor.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (filterConstraint()?.displayMatchMode === 'between') {\n <mng-number-range\n className=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (keyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"metadata().descriptor.numberUseGrouping\"\n [minFractionDigits]=\"metadata().numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"metadata().numberConfig?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (onKeyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"metadata().descriptor.numberUseGrouping\"\n [minFractionDigits]=\"metadata().numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"metadata().numberConfig?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [ngModel]=\"filterConstraint()?.displayValue\" binary=\"true\" (ngModelChange)=\"onCheckboxModelChange($event)\"></p-checkbox>\n }\n @case (FilterTypeEnum.Date) {\n @if (filterConstraint()?.displayMatchMode === FilterMatchMode.Between) {\n <mng-date-range\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [showTime]=\"metadata().dateConfig?.showTime ?? false\"\n [showSeconds]=\"metadata().dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"metadata().dateConfig?.format\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [disabled]=\"isInputDisabled()\"></mng-date-range>\n } @else {\n <p-calendar\n appendTo=\"body\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"metadata().dateConfig?.showTime ?? false\"\n [showSeconds]=\"metadata().dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"metadata().dateConfig?.format\"\n [firstDayOfWeek]=\"1\">\n </p-calendar>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @default {\n <input\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input\"\n [value]=\"filterConstraint()?.displayValue\"\n [disabled]=\"isInputDisabled()\"\n (input)=\"onTextModelChange($event)\"\n (keydown.enter)=\"onTextInputEnterKeyDown($event)\"\n [attr.placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [mngInputTrim]=\"metadata().descriptor.trimOption\" />\n }\n }\n\n <ng-template #lookupFilter>\n @if (descriptorAsLookup(); as lookup) {\n @switch (lookup.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n *mngRerender=\"isMultiselect()\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsTrackProperty]=\"lookup.optionsValueProperty\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [autoClear]=\"lookup.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookup.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookup.autocompleteInlineSearch ?? false\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.searchToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"autocompleteFilter($event)\"\n [searchTrim]=\"metadata().descriptor.trimOption\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n *mngRerender=\"isMultiselect()\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.selectToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [showClear]=\"false\"\n [changeValueOnBlur]=\"isMultiselect()\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"dropdownFilter($event)\">\n </mng-dropdown>\n }\n }\n }\n </ng-template>\n\n @if (matchModes().length > 1) {\n <button\n #icon\n type=\"button\"\n class=\"p-column-filter-menu-button p-link\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"overlayVisible()\"\n [ngClass]=\"{'p-column-filter-menu-button-open': overlayVisible(), 'p-column-filter-menu-button-active': isFilterSet()}\"\n (click)=\"toggleMenu($event)\"\n (keydown)=\"onToggleButtonKeyDown($event)\">\n <FilterIcon [styleClass]=\"'pi-filter-icon'\" />\n </button>\n }\n <button #icon [ngClass]=\"{'p-hidden-space': !isFilterSet()}\" type=\"button\" class=\"p-column-filter-clear-button p-link\" (click)=\"clearFilter()\">\n <FilterSlashIcon />\n </button>\n @if (overlayVisible()) {\n <div\n class=\"p-column-filter-overlay p-component p-fluid\"\n (click)=\"onContentClick()\"\n [@overlayAnimation]=\"'visible'\"\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\"\n (@overlayAnimation.done)=\"onOverlayAnimationEnd($event)\"\n (keydown.escape)=\"onEscape()\">\n <ul class=\"p-column-filter-row-items\">\n @for (matchMode of matchModes(); track matchMode; let i = $index) {\n <li\n class=\"p-column-filter-row-item\"\n (click)=\"onMatchModeChange(matchMode.value)\"\n (keydown)=\"onMatchModeKeyDown($event)\"\n (keydown.enter)=\"this.onMatchModeChange(matchMode.value)\"\n [ngClass]=\"{'p-highlight': matchMode.value === filterConstraint()?.displayMatchMode}\"\n [attr.tabindex]=\"i === 0 ? '0' : null\">\n {{ matchMode.label }}\n </li>\n }\n <li class=\"p-column-filter-separator\"></li>\n <li class=\"p-column-filter-row-item\" (click)=\"onRowClearItemClick()\" (keydown)=\"onMatchModeKeyDown($event)\" (keydown.enter)=\"onRowClearItemClick()\">\n {{ noFilterLabel }}\n </li>\n </ul>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TableModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: DateRangeComponent, selector: "mng-date-range", inputs: ["placeholder", "showTime", "showSeconds", "dateFormat", "className", "required", "disabled"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i2.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AutocompleteComponent, selector: "mng-autocomplete", inputs: ["dataProvider", "optionsTrackProperty", "optionsValueProperty", "optionsLabelProperty", "optionsLabelTranslate", "inlineSearch", "openOnFocus", "multiselect", "placeholder", "className", "dropdownClassName", "showClear", "autoClear", "selectFirst", "searchTrim", "disabled"], outputs: ["valueChange", "blur"] }, { kind: "component", type: DropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "options", "optionsTrackProperty", "optionsLabelProperty", "optionsLabelTranslate", "optionsValueProperty", "optionsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur", "loading", "disabled", "allowInput", "appendTo", "inlineSearch", "searchTrim"], outputs: ["valueChange", "blur"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i4.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: FilterIcon, selector: "FilterIcon" }, { kind: "component", type: FilterSlashIcon, selector: "FilterSlashIcon" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: InputTrimDirective, selector: "[mngInputTrim]", inputs: ["mngInputTrim"] }, { kind: "component", type: NumberRangeComponent, selector: "mng-number-range", inputs: ["placeholder", "useGrouping", "minFractionDigits", "maxFractionDigits", "required", "disabled"], outputs: ["keyDown"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: RerenderDirective, selector: "[mngRerender]", inputs: ["mngRerender"] }], animations: [
|
|
364
356
|
trigger('overlayAnimation', [
|
|
365
357
|
transition(':enter', [style({ opacity: 0, transform: 'scaleY(0.8)' }), animate('.12s cubic-bezier(0, 0, 0.2, 1)')]),
|
|
366
358
|
transition(':leave', [animate('.1s linear', style({ opacity: 0 }))])
|
|
367
359
|
])
|
|
368
360
|
], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
369
361
|
}
|
|
370
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.
|
|
362
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableColumnFilterComponent, decorators: [{
|
|
371
363
|
type: Component,
|
|
372
364
|
args: [{ standalone: true, selector: 'mng-table-column-filter', imports: [
|
|
373
365
|
TableModule,
|
|
@@ -385,12 +377,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImpor
|
|
|
385
377
|
InputTrimDirective,
|
|
386
378
|
NumberRangeComponent,
|
|
387
379
|
NgTemplateOutlet,
|
|
388
|
-
CheckboxModule
|
|
380
|
+
CheckboxModule,
|
|
381
|
+
RerenderDirective
|
|
389
382
|
], animations: [
|
|
390
383
|
trigger('overlayAnimation', [
|
|
391
384
|
transition(':enter', [style({ opacity: 0, transform: 'scaleY(0.8)' }), animate('.12s cubic-bezier(0, 0, 0.2, 1)')]),
|
|
392
385
|
transition(':leave', [animate('.1s linear', style({ opacity: 0 }))])
|
|
393
386
|
])
|
|
394
|
-
], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"p-column-filter p-column-filter-row\">\n @switch (
|
|
387
|
+
], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"p-column-filter p-column-filter-row\">\n @switch (metadata().descriptor.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (filterConstraint()?.displayMatchMode === 'between') {\n <mng-number-range\n className=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (keyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"metadata().descriptor.numberUseGrouping\"\n [minFractionDigits]=\"metadata().numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"metadata().numberConfig?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (onKeyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"metadata().descriptor.numberUseGrouping\"\n [minFractionDigits]=\"metadata().numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"metadata().numberConfig?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [ngModel]=\"filterConstraint()?.displayValue\" binary=\"true\" (ngModelChange)=\"onCheckboxModelChange($event)\"></p-checkbox>\n }\n @case (FilterTypeEnum.Date) {\n @if (filterConstraint()?.displayMatchMode === FilterMatchMode.Between) {\n <mng-date-range\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [showTime]=\"metadata().dateConfig?.showTime ?? false\"\n [showSeconds]=\"metadata().dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"metadata().dateConfig?.format\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [disabled]=\"isInputDisabled()\"></mng-date-range>\n } @else {\n <p-calendar\n appendTo=\"body\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"metadata().dateConfig?.showTime ?? false\"\n [showSeconds]=\"metadata().dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"metadata().dateConfig?.format\"\n [firstDayOfWeek]=\"1\">\n </p-calendar>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @default {\n <input\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input\"\n [value]=\"filterConstraint()?.displayValue\"\n [disabled]=\"isInputDisabled()\"\n (input)=\"onTextModelChange($event)\"\n (keydown.enter)=\"onTextInputEnterKeyDown($event)\"\n [attr.placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [mngInputTrim]=\"metadata().descriptor.trimOption\" />\n }\n }\n\n <ng-template #lookupFilter>\n @if (descriptorAsLookup(); as lookup) {\n @switch (lookup.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n *mngRerender=\"isMultiselect()\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsTrackProperty]=\"lookup.optionsValueProperty\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [autoClear]=\"lookup.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookup.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookup.autocompleteInlineSearch ?? false\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.searchToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"autocompleteFilter($event)\"\n [searchTrim]=\"metadata().descriptor.trimOption\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n *mngRerender=\"isMultiselect()\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.selectToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [showClear]=\"false\"\n [changeValueOnBlur]=\"isMultiselect()\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"dropdownFilter($event)\">\n </mng-dropdown>\n }\n }\n }\n </ng-template>\n\n @if (matchModes().length > 1) {\n <button\n #icon\n type=\"button\"\n class=\"p-column-filter-menu-button p-link\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"overlayVisible()\"\n [ngClass]=\"{'p-column-filter-menu-button-open': overlayVisible(), 'p-column-filter-menu-button-active': isFilterSet()}\"\n (click)=\"toggleMenu($event)\"\n (keydown)=\"onToggleButtonKeyDown($event)\">\n <FilterIcon [styleClass]=\"'pi-filter-icon'\" />\n </button>\n }\n <button #icon [ngClass]=\"{'p-hidden-space': !isFilterSet()}\" type=\"button\" class=\"p-column-filter-clear-button p-link\" (click)=\"clearFilter()\">\n <FilterSlashIcon />\n </button>\n @if (overlayVisible()) {\n <div\n class=\"p-column-filter-overlay p-component p-fluid\"\n (click)=\"onContentClick()\"\n [@overlayAnimation]=\"'visible'\"\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\"\n (@overlayAnimation.done)=\"onOverlayAnimationEnd($event)\"\n (keydown.escape)=\"onEscape()\">\n <ul class=\"p-column-filter-row-items\">\n @for (matchMode of matchModes(); track matchMode; let i = $index) {\n <li\n class=\"p-column-filter-row-item\"\n (click)=\"onMatchModeChange(matchMode.value)\"\n (keydown)=\"onMatchModeKeyDown($event)\"\n (keydown.enter)=\"this.onMatchModeChange(matchMode.value)\"\n [ngClass]=\"{'p-highlight': matchMode.value === filterConstraint()?.displayMatchMode}\"\n [attr.tabindex]=\"i === 0 ? '0' : null\">\n {{ matchMode.label }}\n </li>\n }\n <li class=\"p-column-filter-separator\"></li>\n <li class=\"p-column-filter-row-item\" (click)=\"onRowClearItemClick()\" (keydown)=\"onMatchModeKeyDown($event)\" (keydown.enter)=\"onRowClearItemClick()\">\n {{ noFilterLabel }}\n </li>\n </ul>\n </div>\n }\n</div>\n" }]
|
|
395
388
|
}], ctorParameters: () => [] });
|
|
396
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90YWJsZS9zcmMvY29tcG9uZW50cy9jb2x1bW4tZmlsdGVyL2NvbHVtbi1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvY29sdW1uLWZpbHRlci9jb2x1bW4tZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBRVYsU0FBUyxFQUNULGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFFLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3hFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLDZCQUE2QixFQUFFLFVBQVUsRUFBQyxNQUFNLGFB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eUJBQ3JFLENBQUM7cUJBQ0wsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtOZ0NsYXNzLCBOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFbGVtZW50UmVmLFxuICAgIE9uRGVzdHJveSxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgY29tcHV0ZWQsXG4gICAgZWZmZWN0LFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBzaWduYWwsXG4gICAgdW50cmFja2VkLFxuICAgIHZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b1NpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge092ZXJsYXlTZXJ2aWNlLCBQcmltZU5HQ29uZmlnLCBUcmFuc2xhdGlvbktleXN9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7Q2FsZW5kYXJNb2R1bGV9IGZyb20gJ3ByaW1lbmcvY2FsZW5kYXInO1xuaW1wb3J0IHtDaGVja2JveE1vZHVsZX0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XG5pbXBvcnQge0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxIYW5kbGVyLCBEb21IYW5kbGVyfSBmcm9tICdwcmltZW5nL2RvbSc7XG5pbXBvcnQge0ZpbHRlckljb259IGZyb20gJ3ByaW1lbmcvaWNvbnMvZmlsdGVyJztcbmltcG9ydCB7RmlsdGVyU2xhc2hJY29ufSBmcm9tICdwcmltZW5nL2ljb25zL2ZpbHRlcnNsYXNoJztcbmltcG9ydCB7SW5wdXROdW1iZXJNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXRudW1iZXInO1xuaW1wb3J0IHtJbnB1dFRleHRNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7VGFibGUsIFRhYmxlTW9kdWxlfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7TnVsbGFibGUsIFZvaWRMaXN0ZW5lcn0gZnJvbSAncHJpbWVuZy90cy1oZWxwZXJzJztcbmltcG9ydCB7WkluZGV4VXRpbHN9IGZyb20gJ3ByaW1lbmcvdXRpbHMnO1xuaW1wb3J0IHtTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWR9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0NPTU1PTlNfTU9EVUxFX0NPTkZJR19JVCwgQ29tbW9uc0ZpbHRlck1ldGFkYXRhLCBDb21tb25zU2VyaWFsaXphdGlvbkNvbmZpZywgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJNYXRjaE1vZGVFeHRlbmRlZFR5cGV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0ZpbHRlckRlc2NyaXB0b3IsIEZpbHRlckxvb2t1cERlc2NyaXB0b3IsIEZpbHRlckxvb2t1cFR5cGVFbnVtLCBGaWx0ZXJUeXBlRW51bX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9maWx0ZXInO1xuaW1wb3J0IHtBdXRvY29tcGxldGVDb21wb25lbnQsIERhdGVSYW5nZUNvbXBvbmVudCwgRHJvcGRvd25Db21wb25lbnQsIElucHV0VHJpbURpcmVjdGl2ZSwgTnVtYmVyUmFuZ2VDb21wb25lbnR9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZm9ybSc7XG5cbmltcG9ydCB7XG4gICAgZmlsdGVyQWRqdXN0RGlzcGxheVZhbHVlT25NYXRjaE1vZGVDaGFuZ2UsXG4gICAgZmlsdGVyQXBwbHlTZXJpYWxpemF0aW9uQ29uZmlnVG9DbXAsXG4gICAgZmlsdGVyR2V0RGF0ZUNvbmZpZyxcbiAgICBmaWx0ZXJHZXREZWZhdWx0TWF0Y2hNb2RlLFxuICAgIGZpbHRlckdldE51bWJlckNvbmZpZyxcbiAgICBmaWx0ZXJTZXRNZXRhZGF0YU9uQ2hhbmdlLFxuICAgIGZpbHRlclNldE1ldGFkYXRhT25EaXNwbGF5Q2hhbmdlLFxuICAgIGdlbmVyYXRlTWF0Y2hNb2RlT3B0aW9uc1xufSBmcm9tICcuLi8uLi9oZWxwZXJzL2ZpbHRlcnMnO1xuaW1wb3J0IHtEYXRhTGlzdFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEtbGlzdC5zZXJ2aWNlJztcblxuLyoqXG4gKiBDYW5ub3QgYmUgb24gcHVzaCBjaGFuZ2UgZGV0ZWN0aW9uIHN0cmF0ZWd5IGJlY2F1c2Ugb2YgZmlsdGVyIHVwZGF0ZXMgdHJpZ2dlcmVkIGZyb20gcm91dGUgd2hpY2ggY2F1c2VzIHRvIGZvcmNlIHVwZGF0ZSB2YWx1ZXMgaW4gZm9yY2UgbWV0YWRhdGFcbiAqIGFuZCB0aGVzZSBtdXN0IGJlIHByb3BhZ2F0ZWQgdGhyb3VnaCB0byB0aGlzIGNvbXBvbmVudCBhbmQgYmV5b25kIHRvIHByaW1lTkcuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctdGFibGUtY29sdW1uLWZpbHRlcicsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBUYWJsZU1vZHVsZSxcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBEYXRlUmFuZ2VDb21wb25lbnQsXG4gICAgICAgIENhbGVuZGFyTW9kdWxlLFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgQXV0b2NvbXBsZXRlQ29tcG9uZW50LFxuICAgICAgICBEcm9wZG93bkNvbXBvbmVudCxcbiAgICAgICAgSW5wdXROdW1iZXJNb2R1bGUsXG4gICAgICAgIElucHV0VGV4dE1vZHVsZSxcbiAgICAgICAgRmlsdGVySWNvbixcbiAgICAgICAgRmlsdGVyU2xhc2hJY29uLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBJbnB1dFRyaW1EaXJlY3RpdmUsXG4gICAgICAgIE51bWJlclJhbmdlQ29tcG9uZW50LFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBDaGVja2JveE1vZHVsZVxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbHVtbi1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgdHJpZ2dlcignb3ZlcmxheUFuaW1hdGlvbicsIFtcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtzdHlsZSh7b3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGVZKDAuOCknfSksIGFuaW1hdGUoJy4xMnMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSknKV0pLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmxlYXZlJywgW2FuaW1hdGUoJy4xcyBsaW5lYXInLCBzdHlsZSh7b3BhY2l0eTogMH0pKV0pXG4gICAgICAgIF0pXG4gICAgXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29sdW1uRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbG9va3VwVHlwZURyb3Bkb3duOiBGaWx0ZXJMb29rdXBUeXBlRW51bSA9IEZpbHRlckxvb2t1cFR5cGVFbnVtLkRyb3Bkb3duO1xuICAgIHB1YmxpYyByZWFkb25seSBsb29rdXBUeXBlQXV0b2NvbXBsZXRlOiBGaWx0ZXJMb29rdXBUeXBlRW51bSA9IEZpbHRlckxvb2t1cFR5cGVFbnVtLkF1dG9jb21wbGV0ZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgRmlsdGVyVHlwZUVudW0gPSBGaWx0ZXJUeXBlRW51bTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgRmlsdGVyTWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbCA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByaW1lVGFibGUgPSBpbmplY3QoVGFibGUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YUxpc3RTZXJ2aWNlID0gaW5qZWN0KERhdGFMaXN0U2VydmljZTxhbnk+KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZUNvbmZpZyA9IGluamVjdChDT01NT05TX01PRFVMRV9DT05GSUdfSVQsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByaW1lQ29uZmlnID0gaW5qZWN0KFByaW1lTkdDb25maWcpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheVNlcnZpY2UgPSBpbmplY3QoT3ZlcmxheVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxuICAgIHB1YmxpYyBkZXNjcmlwdG9yID0gaW5wdXQucmVxdWlyZWQ8RmlsdGVyRGVzY3JpcHRvcjxhbnksIGFueT4+KCk7XG4gICAgcHVibGljIGRlc2NyaXB0b3JBc0xvb2t1cCA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmRlc2NyaXB0b3IoKSBpbnN0YW5jZW9mIEZpbHRlckxvb2t1cERlc2NyaXB0b3IgPyAodGhpcy5kZXNjcmlwdG9yKCkgYXMgRmlsdGVyTG9va3VwRGVzY3JpcHRvcjxhbnksIGFueT4pIDogdW5kZWZpbmVkKSk7XG4gICAgcHJpdmF0ZSBpY29uID0gdmlld0NoaWxkPE51bGxhYmxlPEVsZW1lbnRSZWY+PignaWNvbicpO1xuXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvbk9ic2VydmVyID0gdG9TaWduYWwodGhpcy5wcmltZUNvbmZpZy50cmFuc2xhdGlvbk9ic2VydmVyKTtcbiAgICBwdWJsaWMgbWF0Y2hNb2RlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbk9ic2VydmVyID0gdGhpcy50cmFuc2xhdGlvbk9ic2VydmVyKCk7XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZU1hdGNoTW9kZU9wdGlvbnModGhpcy5wcmltZUNvbmZpZywgdGhpcy5kZXNjcmlwdG9yKCksIHRoaXMuc2VyaWFsaXphdGlvbkNmZyk7XG4gICAgfSk7XG4gICAgcHVibGljIGZpbHRlckNvbnN0cmFpbnQgPSBzaWduYWw8Q29tbW9uc0ZpbHRlck1ldGFkYXRhIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIHB1YmxpYyBpc0ZpbHRlclNldCA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgdGhpcy5maWx0ZXJDb25zdHJhaW50KCk/Lm1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkV4aXN0cyB8fFxuICAgICAgICAgICAgdGhpcy5maWx0ZXJDb25zdHJhaW50KCk/Lm1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdCB8fFxuICAgICAgICAgICAgIXRoaXMucHJpbWVUYWJsZS5pc0ZpbHRlckJsYW5rKHRoaXMuZmlsdGVyQ29uc3RyYWludCgpPy52YWx1ZSlcbiAgICApO1xuICAgIHB1YmxpYyBpc0lucHV0RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKT8ubWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzIHx8IHRoaXMuZmlsdGVyQ29uc3RyYWludCgpPy5tYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5Eb2VzTm90RXhpc3QpO1xuICAgIHB1YmxpYyBvdmVybGF5VmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICAvLyBkaXNwbGF5IGNvbmZpZ3NcbiAgICBwdWJsaWMgZGF0ZUNvbmZpZyA9IGNvbXB1dGVkKCgpID0+IGZpbHRlckdldERhdGVDb25maWcodGhpcy5kZXNjcmlwdG9yKCksIHRoaXMuc2VyaWFsaXphdGlvbkNmZykpO1xuICAgIHB1YmxpYyBudW1iZXJDb25maWcgPSBjb21wdXRlZCgoKSA9PiBmaWx0ZXJHZXROdW1iZXJDb25maWcodGhpcy5kZXNjcmlwdG9yKCkpKTtcblxuICAgIHByaXZhdGUgb3ZlcmxheVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIG92ZXJsYXk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgICBwcml2YXRlIHNjcm9sbEhhbmRsZXI/OiBDb25uZWN0ZWRPdmVybGF5U2Nyb2xsSGFuZGxlciB8IG51bGw7XG4gICAgcHJpdmF0ZSBkb2N1bWVudENsaWNrTGlzdGVuZXI6IFZvaWRMaXN0ZW5lcjtcbiAgICBwcml2YXRlIGRvY3VtZW50UmVzaXplTGlzdGVuZXI6IFZvaWRMaXN0ZW5lcjtcbiAgICBwcml2YXRlIHJlc2V0U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgc2VsZkNsaWNrPzogYm9vbGVhbjtcbiAgICBwcml2YXRlIG92ZXJsYXlFdmVudExpc3RlbmVyOiBhbnk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvdyA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcgYXMgV2luZG93O1xuXG4gICAgcHJpdmF0ZSBudW1lcmljVmFsdWVGcm9tTW9kZWxDaGFuZ2U6IG51bWJlciB8IG51bWJlcltdIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIGRhdGVEZWJvdW5jZVN1YmplY3QgPSBuZXcgU3ViamVjdDxEYXRlIHwgRGF0ZVtdIHwgbnVsbD4oKTtcblxuICAgIHByaXZhdGUgc2VyaWFsaXphdGlvbkNmZzogQ29tbW9uc1NlcmlhbGl6YXRpb25Db25maWcgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBmaWx0ZXJBcHBseVNlcmlhbGl6YXRpb25Db25maWdUb0NtcCh0aGlzLm1vZHVsZUNvbmZpZywgdGhpcy5zZXJpYWxpemF0aW9uQ2ZnKTtcblxuICAgICAgICB0aGlzLmRhdGVEZWJvdW5jZVN1YmplY3QucGlwZShkZWJvdW5jZVRpbWUoNTAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSh2ID0+IHRoaXMudXBkYXRlRmlsdGVyT25EaXNwbGF5VmFsdWVDaGFuZ2UodikpO1xuXG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEZpbHRlck1ldGEgPSB0aGlzLmRhdGFMaXN0U2VydmljZS5maWx0ZXJNZXRhKClbdGhpcy5kZXNjcmlwdG9yKCkucHJvcGVydHldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckNvbnN0cmFpbnQgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5maWx0ZXJDb25zdHJhaW50KCkpO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZEZpbHRlck1ldGEgJiYgKCFmaWx0ZXJDb25zdHJhaW50IHx8IGZpbHRlckNvbnN0cmFpbnQudmFsdWUgIT09IGZpZWxkRmlsdGVyTWV0YS52YWx1ZSB8fCBmaWx0ZXJDb25zdHJhaW50Lm1hdGNoTW9kZSAhPT0gZmllbGRGaWx0ZXJNZXRhLm1hdGNoTW9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGaWx0ZXJDb25zdHJhaW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyU2V0TWV0YWRhdGFPbkNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZpbHRlck1ldGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGaWx0ZXJNZXRhLm1hdGNoTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZpbHRlck1ldGEudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuZGVzY3JpcHRvcigpLmZpbHRlclR5cGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmRhdGVDb25maWcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge2FsbG93U2lnbmFsV3JpdGVzOiB0cnVlfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5vdmVybGF5KSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5vdmVybGF5KTtcbiAgICAgICAgICAgIFpJbmRleFV0aWxzLmNsZWFyKHRoaXMub3ZlcmxheSk7XG4gICAgICAgICAgICB0aGlzLm9uT3ZlcmxheUhpZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMub3ZlcmxheVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIG9uVGV4dE1vZGVsQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyT25EaXNwbGF5VmFsdWVDaGFuZ2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBvblRleHRJbnB1dEVudGVyS2V5RG93bihldmVudDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlck9uRGlzcGxheVZhbHVlQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIG9uTnVtZXJpY01vZGVsQ2hhbmdlKHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XG4gICAgICAgIHRoaXMubnVtZXJpY1ZhbHVlRnJvbU1vZGVsQ2hhbmdlID0gdmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJPbkRpc3BsYXlWYWx1ZUNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIG9uTnVtZXJpY0lucHV0S2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlNYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuICYmIEFycmF5LmlzQXJyYXkodGhpcy5udW1lcmljVmFsdWVGcm9tTW9kZWxDaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyVmFsdWVzID0gdGhpcy5udW1lcmljVmFsdWVGcm9tTW9kZWxDaGFuZ2UuZmlsdGVyKHYgPT4gdHlwZW9mIHYgPT09ICdudW1iZXInKTtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyVmFsdWVzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJPbkRpc3BsYXlWYWx1ZUNoYW5nZSh0aGlzLm51bWVyaWNWYWx1ZUZyb21Nb2RlbENoYW5nZSk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBvbkNoZWNrYm94TW9kZWxDaGFuZ2UodmFsdWU6IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyT25EaXNwbGF5VmFsdWVDaGFuZ2UodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgb25EYXRlRmlsdGVyTW9kZWxDaGFuZ2UodmFsdWU6IERhdGUgfCBEYXRlW10gfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheU1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW4gJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVWYWx1ZXMgPSB2YWx1ZS5maWx0ZXIodiA9PiB2IGluc3RhbmNlb2YgRGF0ZSk7XG4gICAgICAgICAgICBpZiAoZGF0ZVZhbHVlcy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRlRGVib3VuY2VTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgYXV0b2NvbXBsZXRlRmlsdGVyKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJPbkRpc3BsYXlWYWx1ZUNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkcm9wZG93bkZpbHRlcih2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyT25EaXNwbGF5VmFsdWVDaGFuZ2UodmFsdWUpO1xuICAgIH1cblxuICAgIG9uTWF0Y2hNb2RlQ2hhbmdlKGRpc3BsYXlNYXRjaE1vZGU6IEZpbHRlck1hdGNoTW9kZUV4dGVuZGVkVHlwZSkge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlNYXRjaE1vZGUgPT09IGRpc3BsYXlNYXRjaE1vZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0RmlsdGVyQ29uc3RyYWludChcbiAgICAgICAgICAgIGZpbHRlclNldE1ldGFkYXRhT25EaXNwbGF5Q2hhbmdlKFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyQ29uc3RyYWludCgpLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlNYXRjaE1vZGUsXG4gICAgICAgICAgICAgICAgZmlsdGVyQWRqdXN0RGlzcGxheVZhbHVlT25NYXRjaE1vZGVDaGFuZ2UoZGlzcGxheU1hdGNoTW9kZSwgdGhpcy5maWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlWYWx1ZSksXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yKCkuZmlsdGVyVHlwZSxcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVDb25maWcoKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmhpZGVPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgb25NYXRjaE1vZGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSA8SFRNTExJRWxlbWVudD5ldmVudC50YXJnZXQ7XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEl0ZW0gPSB0aGlzLmZpbmROZXh0TWVudU1vZGVJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZW0udGFiSW5kZXggPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJdGVtLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNhc2UtZGVjbGFyYXRpb25zXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldkl0ZW0gPSB0aGlzLmZpbmRQcmV2TWVudU1vZGVJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgICAgICAgICAgICAgICAgcHJldkl0ZW0udGFiSW5kZXggPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgIHByZXZJdGVtLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUm93Q2xlYXJJdGVtQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWx0ZXIoKTtcbiAgICAgICAgdGhpcy5oaWRlT3ZlcmxheSgpO1xuICAgIH1cblxuICAgIHRvZ2dsZU1lbnUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUuc2V0KCF0aGlzLm92ZXJsYXlWaXNpYmxlKCkpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBvblRvZ2dsZUJ1dHRvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5VmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IERvbUhhbmRsZXIuZ2V0Rm9jdXNhYmxlRWxlbWVudHMoPEhUTUxFbGVtZW50PnRoaXMub3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZVswXS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Fc2NhcGUoKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUuc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBvbkNvbnRlbnRDbGljaygpIHtcbiAgICAgICAgdGhpcy5zZWxmQ2xpY2sgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIG9uT3ZlcmxheUFuaW1hdGlvblN0YXJ0KGV2ZW50OiBBbmltYXRpb25FdmVudCkge1xuICAgIG9uT3ZlcmxheUFuaW1hdGlvblN0YXJ0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgc3dpdGNoIChldmVudC50b1N0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICd2aXNpYmxlJzpcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXkgPSBldmVudC5lbGVtZW50O1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5ib2R5LCB0aGlzLm92ZXJsYXkpO1xuICAgICAgICAgICAgICAgIFpJbmRleFV0aWxzLnNldCgnb3ZlcmxheScsIHRoaXMub3ZlcmxheSwgdGhpcy5wcmltZUNvbmZpZy56SW5kZXgub3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgRG9tSGFuZGxlci5hYnNvbHV0ZVBvc2l0aW9uKHRoaXMub3ZlcmxheSwgdGhpcy5pY29uKCk/Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZERvY3VtZW50Q2xpY2tMaXN0ZW5lcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZERvY3VtZW50UmVzaXplTGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRTY3JvbGxMaXN0ZW5lcigpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5RXZlbnRMaXN0ZW5lciA9IChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3ZlcmxheSAmJiB0aGlzLm92ZXJsYXkuY29udGFpbnMoZS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGZDbGljayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5U3Vic2NyaXB0aW9uID0gdGhpcy5vdmVybGF5U2VydmljZS5jbGlja09ic2VydmFibGUucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKHRoaXMub3ZlcmxheUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICd2b2lkJzpcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3ZlcmxheUhpZGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvbk92ZXJsYXlBbmltYXRpb25FbmQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KSB7XG4gICAgb25PdmVybGF5QW5pbWF0aW9uRW5kKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgc3dpdGNoIChldmVudC50b1N0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICd2b2lkJzpcbiAgICAgICAgICAgICAgICBaSW5kZXhVdGlscy5jbGVhcihldmVudC5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBub0ZpbHRlckxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnByaW1lQ29uZmlnLmdldFRyYW5zbGF0aW9uKFRyYW5zbGF0aW9uS2V5cy5OT19GSUxURVIpO1xuICAgIH1cblxuICAgIGNsZWFyRmlsdGVyKCkge1xuICAgICAgICB0aGlzLmluaXRGaWx0ZXJDb25zdHJhaW50KHRydWUpO1xuICAgICAgICB0aGlzLnByaW1lVGFibGUuX2ZpbHRlcigpO1xuICAgICAgICB0aGlzLmhpZGVPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kTmV4dE1lbnVNb2RlSXRlbShpdGVtOiBIVE1MTElFbGVtZW50KTogYW55IHtcbiAgICAgICAgY29uc3QgbmV4dEl0ZW0gPSA8SFRNTExJRWxlbWVudD5pdGVtLm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICBpZiAobmV4dEl0ZW0pIHJldHVybiBEb21IYW5kbGVyLmhhc0NsYXNzKG5leHRJdGVtLCAncC1jb2x1bW4tZmlsdGVyLXNlcGFyYXRvcicpID8gdGhpcy5maW5kTmV4dE1lbnVNb2RlSXRlbShuZXh0SXRlbSkgOiBuZXh0SXRlbTtcbiAgICAgICAgZWxzZSByZXR1cm4gaXRlbS5wYXJlbnRFbGVtZW50Py5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRQcmV2TWVudU1vZGVJdGVtKGl0ZW06IEhUTUxMSUVsZW1lbnQpOiBhbnkge1xuICAgICAgICBjb25zdCBwcmV2SXRlbSA9IDxIVE1MTElFbGVtZW50Pml0ZW0ucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICBpZiAocHJldkl0ZW0pIHJldHVybiBEb21IYW5kbGVyLmhhc0NsYXNzKHByZXZJdGVtLCAncC1jb2x1bW4tZmlsdGVyLXNlcGFyYXRvcicpID8gdGhpcy5maW5kUHJldk1lbnVNb2RlSXRlbShwcmV2SXRlbSkgOiBwcmV2SXRlbTtcbiAgICAgICAgZWxzZSByZXR1cm4gaXRlbS5wYXJlbnRFbGVtZW50Py5sYXN0RWxlbWVudENoaWxkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNPdXRzaWRlQ2xpY2tlZChldmVudDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgdGhpcy5vdmVybGF5Py5pc1NhbWVOb2RlKGV2ZW50LnRhcmdldCkgfHxcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheT8uY29udGFpbnMoZXZlbnQudGFyZ2V0KSB8fFxuICAgICAgICAgICAgdGhpcy5pY29uKCk/Lm5hdGl2ZUVsZW1lbnQuaXNTYW1lTm9kZShldmVudC50YXJnZXQpIHx8XG4gICAgICAgICAgICB0aGlzLmljb24oKT8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpIHx8XG4gICAgICAgICAgICBEb21IYW5kbGVyLmhhc0NsYXNzKGV2ZW50LnRhcmdldCwgJ3AtY29sdW1uLWZpbHRlci1hZGQtYnV0dG9uJykgfHxcbiAgICAgICAgICAgIERvbUhhbmRsZXIuaGFzQ2xhc3MoZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQsICdwLWNvbHVtbi1maWx0ZXItYWRkLWJ1dHRvbicpIHx8XG4gICAgICAgICAgICBEb21IYW5kbGVyLmhhc0NsYXNzKGV2ZW50LnRhcmdldCwgJ3AtY29sdW1uLWZpbHRlci1yZW1vdmUtYnV0dG9uJykgfHxcbiAgICAgICAgICAgIERvbUhhbmRsZXIuaGFzQ2xhc3MoZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQsICdwLWNvbHVtbi1maWx0ZXItcmVtb3ZlLWJ1dHRvbicpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kRG9jdW1lbnRDbGlja0xpc3RlbmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyKSB7XG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudFRhcmdldDogYW55ID0gdGhpcy5lbCA/IHRoaXMuZWwubmF0aXZlRWxlbWVudC5vd25lckRvY3VtZW50IDogJ2RvY3VtZW50JztcblxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbihkb2N1bWVudFRhcmdldCwgJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlWaXNpYmxlKCkgJiYgIXRoaXMuc2VsZkNsaWNrICYmIHRoaXMuaXNPdXRzaWRlQ2xpY2tlZChldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlT3ZlcmxheSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZkNsaWNrID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdW5iaW5kRG9jdW1lbnRDbGlja0xpc3RlbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50Q2xpY2tMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNlbGZDbGljayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kRG9jdW1lbnRSZXNpemVMaXN0ZW5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMud2luZG93LCAncmVzaXplJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlWaXNpYmxlKCkgJiYgIURvbUhhbmRsZXIuaXNUb3VjaERldmljZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdW5iaW5kRG9jdW1lbnRSZXNpemVMaXN0ZW5lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFJlc2l6ZUxpc3RlbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kU2Nyb2xsTGlzdGVuZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIgPSBuZXcgQ29ubmVjdGVkT3ZlcmxheVNjcm9sbEhhbmRsZXIodGhpcy5pY29uKCk/Lm5hdGl2ZUVsZW1lbnQsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5VmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlci5iaW5kU2Nyb2xsTGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVuYmluZFNjcm9sbExpc3RlbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIudW5iaW5kU2Nyb2xsTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZU92ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uT3ZlcmxheUhpZGUoKSB7XG4gICAgICAgIHRoaXMudW5iaW5kRG9jdW1lbnRDbGlja0xpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMudW5iaW5kRG9jdW1lbnRSZXNpemVMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLnVuYmluZFNjcm9sbExpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJPbkRpc3BsYXlWYWx1ZUNoYW5nZShkaXNwbGF5VmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnNldEZpbHRlckNvbnN0cmFpbnQoXG4gICAgICAgICAgICBmaWx0ZXJTZXRNZXRhZGF0YU9uRGlzcGxheUNoYW5nZShcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheU1hdGNoTW9kZSA/PyBmaWx0ZXJHZXREZWZhdWx0TWF0Y2hNb2RlKHRoaXMuZGVzY3JpcHRvcigpLCB0aGlzLm1hdGNoTW9kZXMoKSksXG4gICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLmZpbHRlclR5cGUsXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlQ29uZmlnKClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRGaWx0ZXJDb25zdHJhaW50KHJlc2V0ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHJlc2V0KSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0TWF0Y2hNb2RlID0gZmlsdGVyR2V0RGVmYXVsdE1hdGNoTW9kZSh0aGlzLmRlc2NyaXB0b3IoKSwgdGhpcy5tYXRjaE1vZGVzKCkpO1xuICAgICAgICAgICAgdGhpcy5wcmltZVRhYmxlLmZpbHRlcnNbdGhpcy5kZXNjcmlwdG9yKCkucHJvcGVydHldID0ge3ZhbHVlOiBudWxsLCBtYXRjaE1vZGU6IGRlZmF1bHRNYXRjaE1vZGV9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IGludGVybmFsIGZpbHRlciBjb25zdHJhaW50XG4gICAgICAgIGxldCBtZXRhZGF0YSA9IHRoaXMucHJpbWVUYWJsZS5maWx0ZXJzW3RoaXMuZGVzY3JpcHRvcigpLnByb3BlcnR5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWV0YWRhdGEpKSB7XG4gICAgICAgICAgICBtZXRhZGF0YSA9IG1ldGFkYXRhWzBdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyQ29uc3RyYWludChmaWx0ZXJTZXRNZXRhZGF0YU9uQ2hhbmdlKG1ldGFkYXRhLCBtZXRhZGF0YT8ubWF0Y2hNb2RlLCBtZXRhZGF0YT8udmFsdWUsIHRoaXMuZGVzY3JpcHRvcigpLmZpbHRlclR5cGUsIHRoaXMuZGF0ZUNvbmZpZygpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGaWx0ZXJDb25zdHJhaW50KG1ldGFkYXRhPzogQ29tbW9uc0ZpbHRlck1ldGFkYXRhKSB7XG4gICAgICAgIGlmIChtZXRhZGF0YSAmJiAhbWV0YWRhdGEuZGlzcGxheU1hdGNoTW9kZSkgbWV0YWRhdGEuZGlzcGxheU1hdGNoTW9kZSA9IG1ldGFkYXRhLm1hdGNoTW9kZTtcbiAgICAgICAgaWYgKG1ldGFkYXRhICYmICFtZXRhZGF0YS5kaXNwbGF5VmFsdWUpIG1ldGFkYXRhLmRpc3BsYXlWYWx1ZSA9IG1ldGFkYXRhLnZhbHVlO1xuICAgICAgICB0aGlzLmZpbHRlckNvbnN0cmFpbnQuc2V0KG1ldGFkYXRhKTtcbiAgICAgICAgdGhpcy5wcmltZVRhYmxlLmZpbHRlcnNbdGhpcy5kZXNjcmlwdG9yKCkucHJvcGVydHldID0gdGhpcy5maWx0ZXJDb25zdHJhaW50KCkhO1xuICAgICAgICB0aGlzLnByaW1lVGFibGUuX2ZpbHRlcigpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwLWNvbHVtbi1maWx0ZXIgcC1jb2x1bW4tZmlsdGVyLXJvd1wiPlxuICAgIEBzd2l0Y2ggKGRlc2NyaXB0b3IoKS5maWx0ZXJUeXBlKSB7XG4gICAgICAgIEBjYXNlIChGaWx0ZXJUeXBlRW51bS5OdW1iZXIpIHtcbiAgICAgICAgICAgIEBpZiAoZmlsdGVyQ29uc3RyYWludCgpPy5kaXNwbGF5TWF0Y2hNb2RlID09PSAnYmV0d2VlbicpIHtcbiAgICAgICAgICAgICAgICA8bW5nLW51bWJlci1yYW5nZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtbmctY29sdW1uLWZpbHRlci1udW1iZXItaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTnVtZXJpY01vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5RG93bik9XCJvbk51bWVyaWNJbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkZXNjcmlwdG9yKCkucGxhY2Vob2xkZXIgPz8gJ21uZ1RhYmxlLnR5cGVUb0ZpbHRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbdXNlR3JvdXBpbmddPVwiZGVzY3JpcHRvcigpLm51bWJlclVzZUdyb3VwaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIm51bWJlckNvbmZpZygpPy5mcmFjdGlvbnNNaW5cIlxuICAgICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwibnVtYmVyQ29uZmlnKCk/LmZyYWN0aW9uc01heFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0lucHV0RGlzYWJsZWQoKVwiIC8+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgICAgICAgICBpbnB1dFN0eWxlQ2xhc3M9XCJtbmctY29sdW1uLWZpbHRlci1udW1iZXItaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTnVtZXJpY01vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAob25LZXlEb3duKT1cIm9uTnVtZXJpY0lucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRlc2NyaXB0b3IoKS5wbGFjZWhvbGRlciA/PyAnbW5nVGFibGUudHlwZVRvRmlsdGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt1c2VHcm91cGluZ109XCJkZXNjcmlwdG9yKCkubnVtYmVyVXNlR3JvdXBpbmdcIlxuICAgICAgICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwibnVtYmVyQ29uZmlnKCk/LmZyYWN0aW9uc01pblwiXG4gICAgICAgICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJudW1iZXJDb25maWcoKT8uZnJhY3Rpb25zTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW5wdXREaXNhYmxlZCgpXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBjYXNlIChGaWx0ZXJUeXBlRW51bS5Cb29sZWFuKSB7XG4gICAgICAgICAgICA8cC1jaGVja2JveCBbbmdNb2RlbF09XCJmaWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlWYWx1ZVwiIGJpbmFyeT1cInRydWVcIiAobmdNb2RlbENoYW5nZSk9XCJvbkNoZWNrYm94TW9kZWxDaGFuZ2UoJGV2ZW50KVwiPjwvcC1jaGVja2JveD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRmlsdGVyVHlwZUVudW0uRGF0ZSkge1xuICAgICAgICAgICAgQGlmIChmaWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlNYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuKSB7XG4gICAgICAgICAgICAgICAgPG1uZy1kYXRlLXJhbmdlXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25EYXRlRmlsdGVyTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJkYXRlQ29uZmlnKCk/LnNob3dUaW1lID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImRhdGVDb25maWcoKT8uc2hvd1NlY29uZHMgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJkYXRlQ29uZmlnKCk/LmZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJkZXNjcmlwdG9yKCkucGxhY2Vob2xkZXIgPz8gJ21uZ1RhYmxlLnR5cGVUb0ZpbHRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNJbnB1dERpc2FibGVkKClcIj48L21uZy1kYXRlLXJhbmdlPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyQ29uc3RyYWludCgpPy5kaXNwbGF5VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkRhdGVGaWx0ZXJNb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRlc2NyaXB0b3IoKS5wbGFjZWhvbGRlciA/PyAnbW5nVGFibGUudHlwZVRvRmlsdGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93SWNvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cImRhdGVDb25maWcoKT8uc2hvd1RpbWUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1NlY29uZHNdPVwiZGF0ZUNvbmZpZygpPy5zaG93U2Vjb25kcyA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImRhdGVDb25maWcoKT8uZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpcnN0RGF5T2ZXZWVrXT1cIjFcIj5cbiAgICAgICAgICAgICAgICA8L3AtY2FsZW5kYXI+XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLkxvb2t1cCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvb2t1cEZpbHRlclwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW0pIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb29rdXBGaWx0ZXJcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtbmctY29sdW1uLWZpbHRlci1zdHJpbmctaW5wdXRcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJmaWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW5wdXREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25UZXh0TW9kZWxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25UZXh0SW5wdXRFbnRlcktleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwiZGVzY3JpcHRvcigpLnBsYWNlaG9sZGVyID8/ICdtbmdUYWJsZS50eXBlVG9GaWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbbW5nSW5wdXRUcmltXT1cImRlc2NyaXB0b3IoKS50cmltT3B0aW9uXCIgLz5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIDxuZy10ZW1wbGF0ZSAjbG9va3VwRmlsdGVyPlxuICAgICAgICBAaWYgKGRlc2NyaXB0b3JBc0xvb2t1cCgpOyBhcyBsb29rdXApIHtcbiAgICAgICAgICAgIEBzd2l0Y2ggKGxvb2t1cC5sb29rdXBUeXBlKSB7XG4gICAgICAgICAgICAgICAgQGNhc2UgKGxvb2t1cFR5cGVBdXRvY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1uZy1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhUHJvdmlkZXJdPVwibG9va3VwLmRhdGFQcm92aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc1RyYWNrUHJvcGVydHldPVwibG9va3VwLm9wdGlvbnNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zVmFsdWVQcm9wZXJ0eV09XCJsb29rdXAub3B0aW9uc1ZhbHVlUHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNMYWJlbFByb3BlcnR5XT1cImxvb2t1cC5vcHRpb25zTGFiZWxQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc0xhYmVsVHJhbnNsYXRlXT1cImxvb2t1cC5vcHRpb25zTGFiZWxUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpc2VsZWN0XT1cImxvb2t1cC5tdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0NsZWFyXT1cImxvb2t1cC5hdXRvY29tcGxldGVBdXRvQ2xlYXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wZW5PbkZvY3VzXT1cImxvb2t1cC5hdXRvY29tcGxldGVBdXRvQ2xlYXIgPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5saW5lU2VhcmNoXT1cImxvb2t1cC5hdXRvY29tcGxldGVJbmxpbmVTZWFyY2ggPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRlc2NyaXB0b3IoKS5wbGFjZWhvbGRlciA/PyAnbW5nVGFibGUuc2VhcmNoVG9GaWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc05hbWVdPVwibG9va3VwLmNsYXNzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZHJvcGRvd25DbGFzc05hbWVdPVwibG9va3VwLmRyb3Bkb3duQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0lucHV0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiYXV0b2NvbXBsZXRlRmlsdGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaFRyaW1dPVwiZGVzY3JpcHRvcigpLnRyaW1PcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9tbmctYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAobG9va3VwVHlwZURyb3Bkb3duKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtbmctZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhUHJvdmlkZXJdPVwibG9va3VwLmRhdGFQcm92aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc1ZhbHVlUHJvcGVydHldPVwibG9va3VwLm9wdGlvbnNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zTGFiZWxQcm9wZXJ0eV09XCJsb29rdXAub3B0aW9uc0xhYmVsUHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNMYWJlbFRyYW5zbGF0ZV09XCJsb29rdXAub3B0aW9uc0xhYmVsVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXNlbGVjdF09XCJsb29rdXAubXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImRlc2NyaXB0b3IoKS5wbGFjZWhvbGRlciA/PyAnbW5nVGFibGUuc2VsZWN0VG9GaWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc05hbWVdPVwibG9va3VwLmNsYXNzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZHJvcGRvd25DbGFzc05hbWVdPVwibG9va3VwLmRyb3Bkb3duQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoYW5nZVZhbHVlT25CbHVyXT1cImxvb2t1cC5tdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNJbnB1dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRyb3Bkb3duRmlsdGVyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9tbmctZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIEBpZiAobWF0Y2hNb2RlcygpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgI2ljb25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWNvbHVtbi1maWx0ZXItbWVudS1idXR0b24gcC1saW5rXCJcbiAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwib3ZlcmxheVZpc2libGUoKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J3AtY29sdW1uLWZpbHRlci1tZW51LWJ1dHRvbi1vcGVuJzogb3ZlcmxheVZpc2libGUoKSwgJ3AtY29sdW1uLWZpbHRlci1tZW51LWJ1dHRvbi1hY3RpdmUnOiBpc0ZpbHRlclNldCgpfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uVG9nZ2xlQnV0dG9uS2V5RG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICA8RmlsdGVySWNvbiBbc3R5bGVDbGFzc109XCIncGktZmlsdGVyLWljb24nXCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIDxidXR0b24gI2ljb24gW25nQ2xhc3NdPVwieydwLWhpZGRlbi1zcGFjZSc6ICFpc0ZpbHRlclNldCgpfVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInAtY29sdW1uLWZpbHRlci1jbGVhci1idXR0b24gcC1saW5rXCIgKGNsaWNrKT1cImNsZWFyRmlsdGVyKClcIj5cbiAgICAgICAgPEZpbHRlclNsYXNoSWNvbiAvPlxuICAgIDwvYnV0dG9uPlxuICAgIEBpZiAob3ZlcmxheVZpc2libGUoKSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInAtY29sdW1uLWZpbHRlci1vdmVybGF5IHAtY29tcG9uZW50IHAtZmx1aWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29udGVudENsaWNrKClcIlxuICAgICAgICAgICAgW0BvdmVybGF5QW5pbWF0aW9uXT1cIid2aXNpYmxlJ1wiXG4gICAgICAgICAgICAoQG92ZXJsYXlBbmltYXRpb24uc3RhcnQpPVwib25PdmVybGF5QW5pbWF0aW9uU3RhcnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoQG92ZXJsYXlBbmltYXRpb24uZG9uZSk9XCJvbk92ZXJsYXlBbmltYXRpb25FbmQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwib25Fc2NhcGUoKVwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwicC1jb2x1bW4tZmlsdGVyLXJvdy1pdGVtc1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKG1hdGNoTW9kZSBvZiBtYXRjaE1vZGVzKCk7IHRyYWNrIG1hdGNoTW9kZTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtY29sdW1uLWZpbHRlci1yb3ctaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NYXRjaE1vZGVDaGFuZ2UobWF0Y2hNb2RlLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk1hdGNoTW9kZUtleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJ0aGlzLm9uTWF0Y2hNb2RlQ2hhbmdlKG1hdGNoTW9kZS52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydwLWhpZ2hsaWdodCc6IG1hdGNoTW9kZS52YWx1ZSA9PT0gZmlsdGVyQ29uc3RyYWludCgpPy5kaXNwbGF5TWF0Y2hNb2RlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpID09PSAwID8gJzAnIDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbWF0Y2hNb2RlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtY29sdW1uLWZpbHRlci1zZXBhcmF0b3JcIj48L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtY29sdW1uLWZpbHRlci1yb3ctaXRlbVwiIChjbGljayk9XCJvblJvd0NsZWFySXRlbUNsaWNrKClcIiAoa2V5ZG93bik9XCJvbk1hdGNoTW9kZUtleURvd24oJGV2ZW50KVwiIChrZXlkb3duLmVudGVyKT1cIm9uUm93Q2xlYXJJdGVtQ2xpY2soKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBub0ZpbHRlckxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbjwvZGl2PlxuIl19
|
|
389
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90YWJsZS9zcmMvY29tcG9uZW50cy9jb2x1bW4tZmlsdGVyL2NvbHVtbi1maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvY29sdW1uLWZpbHRlci9jb2x1bW4tZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBRVYsU0FBUyxFQUNULGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsY0FBYyxFQUFFLGVBQWUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxVQUFVLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxF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QUUsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JFLENBQUM7U0FDTDs7NEZBSVEsMEJBQTBCO2tCQWhDdEMsU0FBUztpQ0FDTSxJQUFJLFlBQ04seUJBQXlCLFdBQzFCO3dCQUNMLFdBQVc7d0JBQ1gsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsV0FBVzt3QkFDWCxxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIsaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLFVBQVU7d0JBQ1YsZUFBZTt3QkFDZixPQUFPO3dCQUNQLGtCQUFrQjt3QkFDbEIsb0JBQW9CO3dCQUNwQixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsaUJBQWlCO3FCQUNwQixjQUVXO3dCQUNSLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTs0QkFDeEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQzs0QkFDakgsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNyRSxDQUFDO3FCQUNMLGlCQUNjLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7TmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIGNvbXB1dGVkLFxuICAgIGVmZmVjdCxcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgc2lnbmFsLFxuICAgIHVudHJhY2tlZCxcbiAgICB2aWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtGb3Jtc01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge092ZXJsYXlTZXJ2aWNlLCBUcmFuc2xhdGlvbktleXN9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7Q2FsZW5kYXJNb2R1bGV9IGZyb20gJ3ByaW1lbmcvY2FsZW5kYXInO1xuaW1wb3J0IHtDaGVja2JveE1vZHVsZX0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XG5pbXBvcnQge0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxIYW5kbGVyLCBEb21IYW5kbGVyfSBmcm9tICdwcmltZW5nL2RvbSc7XG5pbXBvcnQge0ZpbHRlckljb259IGZyb20gJ3ByaW1lbmcvaWNvbnMvZmlsdGVyJztcbmltcG9ydCB7RmlsdGVyU2xhc2hJY29ufSBmcm9tICdwcmltZW5nL2ljb25zL2ZpbHRlcnNsYXNoJztcbmltcG9ydCB7SW5wdXROdW1iZXJNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXRudW1iZXInO1xuaW1wb3J0IHtJbnB1dFRleHRNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7VGFibGUsIFRhYmxlTW9kdWxlfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7TnVsbGFibGUsIFZvaWRMaXN0ZW5lcn0gZnJvbSAncHJpbWVuZy90cy1oZWxwZXJzJztcbmltcG9ydCB7WkluZGV4VXRpbHN9IGZyb20gJ3ByaW1lbmcvdXRpbHMnO1xuaW1wb3J0IHtTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWR9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0NvbW1vbnNGaWx0ZXJNZXRhZGF0YSwgRmlsdGVyTWF0Y2hNb2RlLCBGaWx0ZXJNYXRjaE1vZGVFeHRlbmRlZFR5cGUsIFJlcmVuZGVyRGlyZWN0aXZlfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJMb29rdXBEZXNjcmlwdG9yLCBGaWx0ZXJMb29rdXBUeXBlRW51bSwgRmlsdGVyVHlwZUVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZmlsdGVyJztcbmltcG9ydCB7QXV0b2NvbXBsZXRlQ29tcG9uZW50LCBEYXRlUmFuZ2VDb21wb25lbnQsIERyb3Bkb3duQ29tcG9uZW50LCBJbnB1dFRyaW1EaXJlY3RpdmUsIE51bWJlclJhbmdlQ29tcG9uZW50fSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2Zvcm0nO1xuXG5pbXBvcnQge2ZpbHRlckFkanVzdERpc3BsYXlWYWx1ZU9uTWF0Y2hNb2RlQ2hhbmdlLCBmaWx0ZXJTZXRNZXRhZGF0YU9uQ2hhbmdlLCBmaWx0ZXJTZXRNZXRhZGF0YU9uRGlzcGxheUNoYW5nZX0gZnJvbSAnLi4vLi4vaGVscGVycy9maWx0ZXJzJztcbmltcG9ydCB7RmlsdGVyTWV0YWRhdGF9IGZyb20gJy4uLy4uL21vZGVscy9maWx0ZXIubW9kZWwnO1xuaW1wb3J0IHtUYWJsZURhdGFTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS1kYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHtUYWJsZU1ldGFkYXRhU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFibGUtbWV0YWRhdGEuc2VydmljZSc7XG5cbi8qKlxuICogQ2Fubm90IGJlIG9uIHB1c2ggY2hhbmdlIGRldGVjdGlvbiBzdHJhdGVneSBiZWNhdXNlIG9mIGZpbHRlciB1cGRhdGVzIHRyaWdnZXJlZCBmcm9tIHJvdXRlIHdoaWNoIGNhdXNlcyB0byBmb3JjZSB1cGRhdGUgdmFsdWVzIGluIGZvcmNlIG1ldGFkYXRhXG4gKiBhbmQgdGhlc2UgbXVzdCBiZSBwcm9wYWdhdGVkIHRocm91Z2ggdG8gdGhpcyBjb21wb25lbnQgYW5kIGJleW9uZCB0byBwcmltZU5HLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLXRhYmxlLWNvbHVtbi1maWx0ZXInLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgVGFibGVNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgRGF0ZVJhbmdlQ29tcG9uZW50LFxuICAgICAgICBDYWxlbmRhck1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIEF1dG9jb21wbGV0ZUNvbXBvbmVudCxcbiAgICAgICAgRHJvcGRvd25Db21wb25lbnQsXG4gICAgICAgIElucHV0TnVtYmVyTW9kdWxlLFxuICAgICAgICBJbnB1dFRleHRNb2R1bGUsXG4gICAgICAgIEZpbHRlckljb24sXG4gICAgICAgIEZpbHRlclNsYXNoSWNvbixcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgSW5wdXRUcmltRGlyZWN0aXZlLFxuICAgICAgICBOdW1iZXJSYW5nZUNvbXBvbmVudCxcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgQ2hlY2tib3hNb2R1bGUsXG4gICAgICAgIFJlcmVuZGVyRGlyZWN0aXZlXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29sdW1uLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCdvdmVybGF5QW5pbWF0aW9uJywgW1xuICAgICAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW3N0eWxlKHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZVkoMC44KSd9KSwgYW5pbWF0ZSgnLjEycyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScpXSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbYW5pbWF0ZSgnLjFzIGxpbmVhcicsIHN0eWxlKHtvcGFjaXR5OiAwfSkpXSlcbiAgICAgICAgXSlcbiAgICBdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb2x1bW5GaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHB1YmxpYyByZWFkb25seSBsb29rdXBUeXBlRHJvcGRvd246IEZpbHRlckxvb2t1cFR5cGVFbnVtID0gRmlsdGVyTG9va3VwVHlwZUVudW0uRHJvcGRvd247XG4gICAgcHVibGljIHJlYWRvbmx5IGxvb2t1cFR5cGVBdXRvY29tcGxldGU6IEZpbHRlckxvb2t1cFR5cGVFbnVtID0gRmlsdGVyTG9va3VwVHlwZUVudW0uQXV0b2NvbXBsZXRlO1xuICAgIHB1YmxpYyByZWFkb25seSBGaWx0ZXJUeXBlRW51bSA9IEZpbHRlclR5cGVFbnVtO1xuICAgIHB1YmxpYyByZWFkb25seSBGaWx0ZXJNYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGU7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpbWVUYWJsZSA9IGluamVjdChUYWJsZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3ZlcmxheVNlcnZpY2UgPSBpbmplY3QoT3ZlcmxheVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlRGF0YSA9IGluamVjdChUYWJsZURhdGFTZXJ2aWNlPGFueT4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFibGVNZXRhZGF0YSA9IGluamVjdChUYWJsZU1ldGFkYXRhU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cbiAgICBwdWJsaWMgbWV0YWRhdGEgPSBpbnB1dC5yZXF1aXJlZDxGaWx0ZXJNZXRhZGF0YT4oKTtcbiAgICBwdWJsaWMgZGVzY3JpcHRvckFzTG9va3VwID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgdGhpcy5tZXRhZGF0YSgpLmRlc2NyaXB0b3IgaW5zdGFuY2VvZiBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yID8gKHRoaXMubWV0YWRhdGEoKS5kZXNjcmlwdG9yIGFzIEZpbHRlckxvb2t1cERlc2NyaXB0b3I8YW55LCBhbnk+KSA6IHVuZGVmaW5lZFxuICAgICk7XG4gICAgcHJpdmF0ZSBpY29uID0gdmlld0NoaWxkPE51bGxhYmxlPEVsZW1lbnRSZWY+PignaWNvbicpO1xuXG4gICAgcHVibGljIG1hdGNoTW9kZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1ldGFkYXRhKCkubWF0Y2hNb2Rlcyk7XG4gICAgcHVibGljIGZpbHRlckNvbnN0cmFpbnQgPSBzaWduYWw8Q29tbW9uc0ZpbHRlck1ldGFkYXRhIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIHB1YmxpYyBpc0ZpbHRlclNldCA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgdGhpcy5maWx0ZXJDb25zdHJhaW50KCk/Lm1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkV4aXN0cyB8fFxuICAgICAgICAgICAgdGhpcy5maWx0ZXJDb25zdHJhaW50KCk/Lm1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdCB8fFxuICAgICAgICAgICAgIXRoaXMucHJpbWVUYWJsZS5pc0ZpbHRlckJsYW5rKHRoaXMuZmlsdGVyQ29uc3RyYWludCgpPy52YWx1ZSlcbiAgICApO1xuICAgIHB1YmxpYyBpc0lucHV0RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKT8ubWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzIHx8IHRoaXMuZmlsdGVyQ29uc3RyYWludCgpPy5tYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5Eb2VzTm90RXhpc3QpO1xuICAgIHB1YmxpYyBvdmVybGF5VmlzaWJsZSA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICAvLyBkaXNwbGF5IGNvbmZpZ3NcbiAgICBwdWJsaWMgaXNNdWx0aXNlbGVjdCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZnQgPSB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gZnQ/LmRpc3BsYXlNYXRjaE1vZGUgPz8gdGhpcy5tZXRhZGF0YSgpLmRlZmF1bHRNYXRjaE1vZGU7XG4gICAgICAgIHJldHVybiAobWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuSW4gfHwgbWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuTm90SW4pICYmIChmdD8uZGlzcGxheVZhbHVlID09IG51bGwgfHwgQXJyYXkuaXNBcnJheShmdC5kaXNwbGF5VmFsdWUpKTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgb3ZlcmxheVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIG92ZXJsYXk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgICBwcml2YXRlIHNjcm9sbEhhbmRsZXI/OiBDb25uZWN0ZWRPdmVybGF5U2Nyb2xsSGFuZGxlciB8IG51bGw7XG4gICAgcHJpdmF0ZSBkb2N1bWVudENsaWNrTGlzdGVuZXI6IFZvaWRMaXN0ZW5lcjtcbiAgICBwcml2YXRlIGRvY3VtZW50UmVzaXplTGlzdGVuZXI6IFZvaWRMaXN0ZW5lcjtcbiAgICBwcml2YXRlIHJlc2V0U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgc2VsZkNsaWNrPzogYm9vbGVhbjtcbiAgICBwcml2YXRlIG92ZXJsYXlFdmVudExpc3RlbmVyOiBhbnk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvdyA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcgYXMgV2luZG93O1xuXG4gICAgcHJpdmF0ZSBudW1lcmljVmFsdWVGcm9tTW9kZWxDaGFuZ2U6IG51bWJlciB8IG51bWJlcltdIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIGRhdGVEZWJvdW5jZVN1YmplY3QgPSBuZXcgU3ViamVjdDxEYXRlIHwgRGF0ZVtdIHwgbnVsbD4oKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRhdGVEZWJvdW5jZVN1YmplY3QucGlwZShkZWJvdW5jZVRpbWUoNTAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSh2ID0+IHRoaXMudXBkYXRlRmlsdGVyT25EaXNwbGF5VmFsdWVDaGFuZ2UodikpO1xuXG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEZpbHRlck1ldGEgPSB0aGlzLnRhYmxlRGF0YS5maWx0ZXJNZXRhKCk/Llt0aGlzLm1ldGFkYXRhKCkuZGVzY3JpcHRvci5wcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyQ29uc3RyYWludCA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkRmlsdGVyTWV0YSAmJiAoIWZpbHRlckNvbnN0cmFpbnQgfHwgZmlsdGVyQ29uc3RyYWludC52YWx1ZSAhPT0gZmllbGRGaWx0ZXJNZXRhLnZhbHVlIHx8IGZpbHRlckNvbnN0cmFpbnQubWF0Y2hNb2RlICE9PSBmaWVsZEZpbHRlck1ldGEubWF0Y2hNb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZpbHRlckNvbnN0cmFpbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTZXRNZXRhZGF0YU9uQ2hhbmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRmlsdGVyTWV0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZpbHRlck1ldGEubWF0Y2hNb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRmlsdGVyTWV0YS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5tZXRhZGF0YSgpLmRlc2NyaXB0b3IuZmlsdGVyVHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMubWV0YWRhdGEoKS5kYXRlQ29uZmlnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJsYXkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLm92ZXJsYXkpO1xuICAgICAgICAgICAgWkluZGV4VXRpbHMuY2xlYXIodGhpcy5vdmVybGF5KTtcbiAgICAgICAgICAgIHRoaXMub25PdmVybGF5SGlkZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNldFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5vdmVybGF5U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgb25UZXh0TW9kZWxDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJPbkRpc3BsYXlWYWx1ZUNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIG9uVGV4dElucHV0RW50ZXJLZXlEb3duKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyT25EaXNwbGF5VmFsdWVDaGFuZ2UodmFsdWUpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgb25OdW1lcmljTW9kZWxDaGFuZ2UodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICAgICAgdGhpcy5udW1lcmljVmFsdWVGcm9tTW9kZWxDaGFuZ2UgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlck9uRGlzcGxheVZhbHVlQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgb25OdW1lcmljSW5wdXRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheU1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW4gJiYgQXJyYXkuaXNBcnJheSh0aGlzLm51bWVyaWNWYWx1ZUZyb21Nb2RlbENoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJWYWx1ZXMgPSB0aGlzLm51bWVyaWNWYWx1ZUZyb21Nb2RlbENoYW5nZS5maWx0ZXIodiA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicpO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJWYWx1ZXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlck9uRGlzcGxheVZhbHVlQ2hhbmdlKHRoaXMubnVtZXJpY1ZhbHVlRnJvbU1vZGVsQ2hhbmdlKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIG9uQ2hlY2tib3hNb2RlbENoYW5nZSh2YWx1ZTogYm9vbGVhbiB8IG51bGwpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJPbkRpc3BsYXlWYWx1ZUNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBvbkRhdGVGaWx0ZXJNb2RlbENoYW5nZSh2YWx1ZTogRGF0ZSB8IERhdGVbXSB8IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyQ29uc3RyYWludCgpPy5kaXNwbGF5TWF0Y2hNb2RlID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2VlbiAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZVZhbHVlcyA9IHZhbHVlLmZpbHRlcih2ID0+IHYgaW5zdGFuY2VvZiBEYXRlKTtcbiAgICAgICAgICAgIGlmIChkYXRlVmFsdWVzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGVEZWJvdW5jZVN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBhdXRvY29tcGxldGVGaWx0ZXIodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlck9uRGlzcGxheVZhbHVlQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRyb3Bkb3duRmlsdGVyKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJPbkRpc3BsYXlWYWx1ZUNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgb25NYXRjaE1vZGVDaGFuZ2UoZGlzcGxheU1hdGNoTW9kZTogRmlsdGVyTWF0Y2hNb2RlRXh0ZW5kZWRUeXBlKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheU1hdGNoTW9kZSA9PT0gZGlzcGxheU1hdGNoTW9kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRGaWx0ZXJDb25zdHJhaW50KFxuICAgICAgICAgICAgZmlsdGVyU2V0TWV0YWRhdGFPbkRpc3BsYXlDaGFuZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJDb25zdHJhaW50KCksXG4gICAgICAgICAgICAgICAgZGlzcGxheU1hdGNoTW9kZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJBZGp1c3REaXNwbGF5VmFsdWVPbk1hdGNoTW9kZUNoYW5nZShkaXNwbGF5TWF0Y2hNb2RlLCB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheVZhbHVlKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGFkYXRhKCkuZGVzY3JpcHRvci5maWx0ZXJUeXBlLFxuICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGEoKS5kYXRlQ29uZmlnXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaGlkZU92ZXJsYXkoKTtcbiAgICB9XG5cbiAgICBvbk1hdGNoTW9kZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IDxIVE1MTElFbGVtZW50PmV2ZW50LnRhcmdldDtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0SXRlbSA9IHRoaXMuZmluZE5leHRNZW51TW9kZUl0ZW0oaXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHRJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgICAgICAgICAgICAgICBuZXh0SXRlbS50YWJJbmRleCA9ICcwJztcbiAgICAgICAgICAgICAgICAgICAgbmV4dEl0ZW0uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2SXRlbSA9IHRoaXMuZmluZFByZXZNZW51TW9kZUl0ZW0oaXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2SXRlbS50YWJJbmRleCA9ICcwJztcbiAgICAgICAgICAgICAgICAgICAgcHJldkl0ZW0uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Sb3dDbGVhckl0ZW1DbGljaygpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbHRlcigpO1xuICAgICAgICB0aGlzLmhpZGVPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlTWVudShldmVudDogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZS5zZXQoIXRoaXMub3ZlcmxheVZpc2libGUoKSk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIG9uVG9nZ2xlQnV0dG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlWaXNpYmxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gRG9tSGFuZGxlci5nZXRGb2N1c2FibGVFbGVtZW50cyg8SFRNTEVsZW1lbnQ+dGhpcy5vdmVybGF5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNhYmxlWzBdLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmFsdEtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlLnNldCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkVzY2FwZSgpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIG9uQ29udGVudENsaWNrKCkge1xuICAgICAgICB0aGlzLnNlbGZDbGljayA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gb25PdmVybGF5QW5pbWF0aW9uU3RhcnQoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KSB7XG4gICAgb25PdmVybGF5QW5pbWF0aW9uU3RhcnQoZXZlbnQ6IGFueSkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LnRvU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3Zpc2libGUnOlxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheSA9IGV2ZW50LmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmJvZHksIHRoaXMub3ZlcmxheSk7XG4gICAgICAgICAgICAgICAgWkluZGV4VXRpbHMuc2V0KCdvdmVybGF5JywgdGhpcy5vdmVybGF5LCB0aGlzLnRhYmxlTWV0YWRhdGEucHJpbWVDb25maWcuekluZGV4Lm92ZXJsYXkpO1xuICAgICAgICAgICAgICAgIERvbUhhbmRsZXIuYWJzb2x1dGVQb3NpdGlvbih0aGlzLm92ZXJsYXksIHRoaXMuaWNvbigpPy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmREb2N1bWVudENsaWNrTGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmREb2N1bWVudFJlc2l6ZUxpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kU2Nyb2xsTGlzdGVuZXIoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheUV2ZW50TGlzdGVuZXIgPSAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXkgJiYgdGhpcy5vdmVybGF5LmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxmQ2xpY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVN1YnNjcmlwdGlvbiA9IHRoaXMub3ZlcmxheVNlcnZpY2UuY2xpY2tPYnNlcnZhYmxlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSh0aGlzLm92ZXJsYXlFdmVudExpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAndm9pZCc6XG4gICAgICAgICAgICAgICAgdGhpcy5vbk92ZXJsYXlIaWRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gb25PdmVybGF5QW5pbWF0aW9uRW5kKGV2ZW50OiBBbmltYXRpb25FdmVudCkge1xuICAgIG9uT3ZlcmxheUFuaW1hdGlvbkVuZChldmVudDogYW55KSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQudG9TdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAndm9pZCc6XG4gICAgICAgICAgICAgICAgWkluZGV4VXRpbHMuY2xlYXIoZXZlbnQuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgbm9GaWx0ZXJMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJsZU1ldGFkYXRhLnByaW1lQ29uZmlnLmdldFRyYW5zbGF0aW9uKFRyYW5zbGF0aW9uS2V5cy5OT19GSUxURVIpO1xuICAgIH1cblxuICAgIGNsZWFyRmlsdGVyKCkge1xuICAgICAgICB0aGlzLmluaXRGaWx0ZXJDb25zdHJhaW50KHRydWUpO1xuICAgICAgICB0aGlzLnByaW1lVGFibGUuX2ZpbHRlcigpO1xuICAgICAgICB0aGlzLmhpZGVPdmVybGF5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kTmV4dE1lbnVNb2RlSXRlbShpdGVtOiBIVE1MTElFbGVtZW50KTogYW55IHtcbiAgICAgICAgY29uc3QgbmV4dEl0ZW0gPSA8SFRNTExJRWxlbWVudD5pdGVtLm5leHRFbGVtZW50U2libGluZztcblxuICAgICAgICBpZiAobmV4dEl0ZW0pIHJldHVybiBEb21IYW5kbGVyLmhhc0NsYXNzKG5leHRJdGVtLCAncC1jb2x1bW4tZmlsdGVyLXNlcGFyYXRvcicpID8gdGhpcy5maW5kTmV4dE1lbnVNb2RlSXRlbShuZXh0SXRlbSkgOiBuZXh0SXRlbTtcbiAgICAgICAgZWxzZSByZXR1cm4gaXRlbS5wYXJlbnRFbGVtZW50Py5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRQcmV2TWVudU1vZGVJdGVtKGl0ZW06IEhUTUxMSUVsZW1lbnQpOiBhbnkge1xuICAgICAgICBjb25zdCBwcmV2SXRlbSA9IDxIVE1MTElFbGVtZW50Pml0ZW0ucHJldmlvdXNFbGVtZW50U2libGluZztcblxuICAgICAgICBpZiAocHJldkl0ZW0pIHJldHVybiBEb21IYW5kbGVyLmhhc0NsYXNzKHByZXZJdGVtLCAncC1jb2x1bW4tZmlsdGVyLXNlcGFyYXRvcicpID8gdGhpcy5maW5kUHJldk1lbnVNb2RlSXRlbShwcmV2SXRlbSkgOiBwcmV2SXRlbTtcbiAgICAgICAgZWxzZSByZXR1cm4gaXRlbS5wYXJlbnRFbGVtZW50Py5sYXN0RWxlbWVudENoaWxkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNPdXRzaWRlQ2xpY2tlZChldmVudDogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhKFxuICAgICAgICAgICAgdGhpcy5vdmVybGF5Py5pc1NhbWVOb2RlKGV2ZW50LnRhcmdldCkgfHxcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheT8uY29udGFpbnMoZXZlbnQudGFyZ2V0KSB8fFxuICAgICAgICAgICAgdGhpcy5pY29uKCk/Lm5hdGl2ZUVsZW1lbnQuaXNTYW1lTm9kZShldmVudC50YXJnZXQpIHx8XG4gICAgICAgICAgICB0aGlzLmljb24oKT8ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpIHx8XG4gICAgICAgICAgICBEb21IYW5kbGVyLmhhc0NsYXNzKGV2ZW50LnRhcmdldCwgJ3AtY29sdW1uLWZpbHRlci1hZGQtYnV0dG9uJykgfHxcbiAgICAgICAgICAgIERvbUhhbmRsZXIuaGFzQ2xhc3MoZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQsICdwLWNvbHVtbi1maWx0ZXItYWRkLWJ1dHRvbicpIHx8XG4gICAgICAgICAgICBEb21IYW5kbGVyLmhhc0NsYXNzKGV2ZW50LnRhcmdldCwgJ3AtY29sdW1uLWZpbHRlci1yZW1vdmUtYnV0dG9uJykgfHxcbiAgICAgICAgICAgIERvbUhhbmRsZXIuaGFzQ2xhc3MoZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQsICdwLWNvbHVtbi1maWx0ZXItcmVtb3ZlLWJ1dHRvbicpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kRG9jdW1lbnRDbGlja0xpc3RlbmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyKSB7XG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudFRhcmdldDogYW55ID0gdGhpcy5lbCA/IHRoaXMuZWwubmF0aXZlRWxlbWVudC5vd25lckRvY3VtZW50IDogJ2RvY3VtZW50JztcblxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbihkb2N1bWVudFRhcmdldCwgJ2NsaWNrJywgZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlWaXNpYmxlKCkgJiYgIXRoaXMuc2VsZkNsaWNrICYmIHRoaXMuaXNPdXRzaWRlQ2xpY2tlZChldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlT3ZlcmxheSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZkNsaWNrID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdW5iaW5kRG9jdW1lbnRDbGlja0xpc3RlbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50Q2xpY2tMaXN0ZW5lciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNlbGZDbGljayA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kRG9jdW1lbnRSZXNpemVMaXN0ZW5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMud2luZG93LCAncmVzaXplJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlWaXNpYmxlKCkgJiYgIURvbUhhbmRsZXIuaXNUb3VjaERldmljZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdW5iaW5kRG9jdW1lbnRSZXNpemVMaXN0ZW5lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnRSZXNpemVMaXN0ZW5lcikge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFJlc2l6ZUxpc3RlbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50UmVzaXplTGlzdGVuZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kU2Nyb2xsTGlzdGVuZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5zY3JvbGxIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIgPSBuZXcgQ29ubmVjdGVkT3ZlcmxheVNjcm9sbEhhbmRsZXIodGhpcy5pY29uKCk/Lm5hdGl2ZUVsZW1lbnQsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5VmlzaWJsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZU92ZXJsYXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlci5iaW5kU2Nyb2xsTGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVuYmluZFNjcm9sbExpc3RlbmVyKCkge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIudW5iaW5kU2Nyb2xsTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZU92ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVZpc2libGUuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uT3ZlcmxheUhpZGUoKSB7XG4gICAgICAgIHRoaXMudW5iaW5kRG9jdW1lbnRDbGlja0xpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMudW5iaW5kRG9jdW1lbnRSZXNpemVMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLnVuYmluZFNjcm9sbExpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJPbkRpc3BsYXlWYWx1ZUNoYW5nZShkaXNwbGF5VmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLnNldEZpbHRlckNvbnN0cmFpbnQoXG4gICAgICAgICAgICBmaWx0ZXJTZXRNZXRhZGF0YU9uRGlzcGxheUNoYW5nZShcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheU1hdGNoTW9kZSA/PyB0aGlzLm1ldGFkYXRhKCkuZGVmYXVsdE1hdGNoTW9kZSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5VmFsdWUsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSgpLmRlc2NyaXB0b3IuZmlsdGVyVHlwZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ldGFkYXRhKCkuZGF0ZUNvbmZpZ1xuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEZpbHRlckNvbnN0cmFpbnQocmVzZXQgPSBmYWxzZSkge1xuICAgICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgICAgIHRoaXMucHJpbWVUYWJsZS5maWx0ZXJzW3RoaXMubWV0YWRhdGEoKS5kZXNjcmlwdG9yLnByb3BlcnR5XSA9IHt2YWx1ZTogbnVsbCwgbWF0Y2hNb2RlOiB0aGlzLm1ldGFkYXRhKCkuZGVmYXVsdE1hdGNoTW9kZX07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgaW50ZXJuYWwgZmlsdGVyIGNvbnN0cmFpbnRcbiAgICAgICAgbGV0IG1ldGFkYXRhID0gdGhpcy5wcmltZVRhYmxlLmZpbHRlcnNbdGhpcy5tZXRhZGF0YSgpLmRlc2NyaXB0b3IucHJvcGVydHldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YSkpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhID0gbWV0YWRhdGFbMF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRGaWx0ZXJDb25zdHJhaW50KGZpbHRlclNldE1ldGFkYXRhT25DaGFuZ2UobWV0YWRhdGEsIG1ldGFkYXRhPy5tYXRjaE1vZGUsIG1ldGFkYXRhPy52YWx1ZSwgdGhpcy5tZXRhZGF0YSgpLmRlc2NyaXB0b3IuZmlsdGVyVHlwZSwgdGhpcy5tZXRhZGF0YSgpLmRhdGVDb25maWcpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZpbHRlckNvbnN0cmFpbnQobWV0YWRhdGE/OiBDb21tb25zRmlsdGVyTWV0YWRhdGEpIHtcbiAgICAgICAgaWYgKG1ldGFkYXRhICYmICFtZXRhZGF0YS5kaXNwbGF5TWF0Y2hNb2RlKSBtZXRhZGF0YS5kaXNwbGF5TWF0Y2hNb2RlID0gbWV0YWRhdGEubWF0Y2hNb2RlO1xuICAgICAgICBpZiAobWV0YWRhdGEgJiYgIW1ldGFkYXRhLmRpc3BsYXlWYWx1ZSkgbWV0YWRhdGEuZGlzcGxheVZhbHVlID0gbWV0YWRhdGEudmFsdWU7XG4gICAgICAgIHRoaXMuZmlsdGVyQ29uc3RyYWludC5zZXQobWV0YWRhdGEpO1xuICAgICAgICB0aGlzLnByaW1lVGFibGUuZmlsdGVyc1t0aGlzLm1ldGFkYXRhKCkuZGVzY3JpcHRvci5wcm9wZXJ0eV0gPSB0aGlzLmZpbHRlckNvbnN0cmFpbnQoKSE7XG4gICAgICAgIHRoaXMucHJpbWVUYWJsZS5fZmlsdGVyKCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInAtY29sdW1uLWZpbHRlciBwLWNvbHVtbi1maWx0ZXItcm93XCI+XG4gICAgQHN3aXRjaCAobWV0YWRhdGEoKS5kZXNjcmlwdG9yLmZpbHRlclR5cGUpIHtcbiAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLk51bWJlcikge1xuICAgICAgICAgICAgQGlmIChmaWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlNYXRjaE1vZGUgPT09ICdiZXR3ZWVuJykge1xuICAgICAgICAgICAgICAgIDxtbmctbnVtYmVyLXJhbmdlXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1uZy1jb2x1bW4tZmlsdGVyLW51bWJlci1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25OdW1lcmljTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlEb3duKT1cIm9uTnVtZXJpY0lucHV0S2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1ldGFkYXRhKCkuZGVzY3JpcHRvci5wbGFjZWhvbGRlciA/PyAnbW5nVGFibGUudHlwZVRvRmlsdGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt1c2VHcm91cGluZ109XCJtZXRhZGF0YSgpLmRlc2NyaXB0b3IubnVtYmVyVXNlR3JvdXBpbmdcIlxuICAgICAgICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwibWV0YWRhdGEoKS5udW1iZXJDb25maWc/LmZyYWN0aW9uc01pblwiXG4gICAgICAgICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJtZXRhZGF0YSgpLm51bWJlckNvbmZpZz8uZnJhY3Rpb25zTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW5wdXREaXNhYmxlZCgpXCIgLz5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIGlucHV0U3R5bGVDbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLW51bWJlci1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25OdW1lcmljTW9kZWxDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChvbktleURvd24pPVwib25OdW1lcmljSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibWV0YWRhdGEoKS5kZXNjcmlwdG9yLnBsYWNlaG9sZGVyID8/ICdtbmdUYWJsZS50eXBlVG9GaWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW3VzZUdyb3VwaW5nXT1cIm1ldGFkYXRhKCkuZGVzY3JpcHRvci5udW1iZXJVc2VHcm91cGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCJtZXRhZGF0YSgpLm51bWJlckNvbmZpZz8uZnJhY3Rpb25zTWluXCJcbiAgICAgICAgICAgICAgICAgICAgW21heEZyYWN0aW9uRGlnaXRzXT1cIm1ldGFkYXRhKCkubnVtYmVyQ29uZmlnPy5mcmFjdGlvbnNNYXhcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNJbnB1dERpc2FibGVkKClcIiAvPlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLkJvb2xlYW4pIHtcbiAgICAgICAgICAgIDxwLWNoZWNrYm94IFtuZ01vZGVsXT1cImZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheVZhbHVlXCIgYmluYXJ5PVwidHJ1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hlY2tib3hNb2RlbENoYW5nZSgkZXZlbnQpXCI+PC9wLWNoZWNrYm94PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChGaWx0ZXJUeXBlRW51bS5EYXRlKSB7XG4gICAgICAgICAgICBAaWYgKGZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheU1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW4pIHtcbiAgICAgICAgICAgICAgICA8bW5nLWRhdGUtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyQ29uc3RyYWludCgpPy5kaXNwbGF5VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkRhdGVGaWx0ZXJNb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cIm1ldGFkYXRhKCkuZGF0ZUNvbmZpZz8uc2hvd1RpbWUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1NlY29uZHNdPVwibWV0YWRhdGEoKS5kYXRlQ29uZmlnPy5zaG93U2Vjb25kcyA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cIm1ldGFkYXRhKCkuZGF0ZUNvbmZpZz8uZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1ldGFkYXRhKCkuZGVzY3JpcHRvci5wbGFjZWhvbGRlciA/PyAnbW5nVGFibGUudHlwZVRvRmlsdGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0lucHV0RGlzYWJsZWQoKVwiPjwvbW5nLWRhdGUtcmFuZ2U+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8cC1jYWxlbmRhclxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGF0ZUZpbHRlck1vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibWV0YWRhdGEoKS5kZXNjcmlwdG9yLnBsYWNlaG9sZGVyID8/ICdtbmdUYWJsZS50eXBlVG9GaWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dJY29uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwibWV0YWRhdGEoKS5kYXRlQ29uZmlnPy5zaG93VGltZSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93U2Vjb25kc109XCJtZXRhZGF0YSgpLmRhdGVDb25maWc/LnNob3dTZWNvbmRzID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwibWV0YWRhdGEoKS5kYXRlQ29uZmlnPy5mb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICBbZmlyc3REYXlPZldlZWtdPVwiMVwiPlxuICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRmlsdGVyVHlwZUVudW0uTG9va3VwKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9va3VwRmlsdGVyXCIgLz5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoRmlsdGVyVHlwZUVudW0uTG9va3VwRW51bSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvb2t1cEZpbHRlclwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLXN0cmluZy1pbnB1dFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNJbnB1dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvblRleHRNb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvblRleHRJbnB1dEVudGVyS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCJtZXRhZGF0YSgpLmRlc2NyaXB0b3IucGxhY2Vob2xkZXIgPz8gJ21uZ1RhYmxlLnR5cGVUb0ZpbHRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFttbmdJbnB1dFRyaW1dPVwibWV0YWRhdGEoKS5kZXNjcmlwdG9yLnRyaW1PcHRpb25cIiAvPlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgPG5nLXRlbXBsYXRlICNsb29rdXBGaWx0ZXI+XG4gICAgICAgIEBpZiAoZGVzY3JpcHRvckFzTG9va3VwKCk7IGFzIGxvb2t1cCkge1xuICAgICAgICAgICAgQHN3aXRjaCAobG9va3VwLmxvb2t1cFR5cGUpIHtcbiAgICAgICAgICAgICAgICBAY2FzZSAobG9va3VwVHlwZUF1dG9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICA8bW5nLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKm1uZ1JlcmVuZGVyPVwiaXNNdWx0aXNlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhUHJvdmlkZXJdPVwibG9va3VwLmRhdGFQcm92aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc1RyYWNrUHJvcGVydHldPVwibG9va3VwLm9wdGlvbnNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zVmFsdWVQcm9wZXJ0eV09XCJsb29rdXAub3B0aW9uc1ZhbHVlUHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNMYWJlbFByb3BlcnR5XT1cImxvb2t1cC5vcHRpb25zTGFiZWxQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc0xhYmVsVHJhbnNsYXRlXT1cImxvb2t1cC5vcHRpb25zTGFiZWxUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpc2VsZWN0XT1cImlzTXVsdGlzZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0NsZWFyXT1cImxvb2t1cC5hdXRvY29tcGxldGVBdXRvQ2xlYXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wZW5PbkZvY3VzXT1cImxvb2t1cC5hdXRvY29tcGxldGVBdXRvQ2xlYXIgPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5saW5lU2VhcmNoXT1cImxvb2t1cC5hdXRvY29tcGxldGVJbmxpbmVTZWFyY2ggPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIm1ldGFkYXRhKCkuZGVzY3JpcHRvci5wbGFjZWhvbGRlciA/PyAnbW5nVGFibGUuc2VhcmNoVG9GaWx0ZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc05hbWVdPVwibG9va3VwLmNsYXNzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZHJvcGRvd25DbGFzc05hbWVdPVwibG9va3VwLmRyb3Bkb3duQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0lucHV0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiYXV0b2NvbXBsZXRlRmlsdGVyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaFRyaW1dPVwibWV0YWRhdGEoKS5kZXNjcmlwdG9yLnRyaW1PcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9tbmctYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAobG9va3VwVHlwZURyb3Bkb3duKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtbmctZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICptbmdSZXJlbmRlcj1cImlzTXVsdGlzZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJmaWx0ZXJDb25zdHJhaW50KCk/LmRpc3BsYXlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVByb3ZpZGVyXT1cImxvb2t1cC5kYXRhUHJvdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNWYWx1ZVByb3BlcnR5XT1cImxvb2t1cC5vcHRpb25zVmFsdWVQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc0xhYmVsUHJvcGVydHldPVwibG9va3VwLm9wdGlvbnNMYWJlbFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zTGFiZWxUcmFuc2xhdGVdPVwibG9va3VwLm9wdGlvbnNMYWJlbFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlzZWxlY3RdPVwiaXNNdWx0aXNlbGVjdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJtZXRhZGF0YSgpLmRlc2NyaXB0b3IucGxhY2Vob2xkZXIgPz8gJ21uZ1RhYmxlLnNlbGVjdFRvRmlsdGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NOYW1lXT1cImxvb2t1cC5jbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3Bkb3duQ2xhc3NOYW1lXT1cImxvb2t1cC5kcm9wZG93bkNsYXNzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGFuZ2VWYWx1ZU9uQmx1cl09XCJpc011bHRpc2VsZWN0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzSW5wdXREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkcm9wZG93bkZpbHRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbW5nLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICBAaWYgKG1hdGNoTW9kZXMoKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICNpY29uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1jb2x1bW4tZmlsdGVyLW1lbnUtYnV0dG9uIHAtbGlua1wiXG4gICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIm92ZXJsYXlWaXNpYmxlKClcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydwLWNvbHVtbi1maWx0ZXItbWVudS1idXR0b24tb3Blbic6IG92ZXJsYXlWaXNpYmxlKCksICdwLWNvbHVtbi1maWx0ZXItbWVudS1idXR0b24tYWN0aXZlJzogaXNGaWx0ZXJTZXQoKX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU1lbnUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvblRvZ2dsZUJ1dHRvbktleURvd24oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPEZpbHRlckljb24gW3N0eWxlQ2xhc3NdPVwiJ3BpLWZpbHRlci1pY29uJ1wiIC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgICA8YnV0dG9uICNpY29uIFtuZ0NsYXNzXT1cInsncC1oaWRkZW4tc3BhY2UnOiAhaXNGaWx0ZXJTZXQoKX1cIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwLWNvbHVtbi1maWx0ZXItY2xlYXItYnV0dG9uIHAtbGlua1wiIChjbGljayk9XCJjbGVhckZpbHRlcigpXCI+XG4gICAgICAgIDxGaWx0ZXJTbGFzaEljb24gLz5cbiAgICA8L2J1dHRvbj5cbiAgICBAaWYgKG92ZXJsYXlWaXNpYmxlKCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJwLWNvbHVtbi1maWx0ZXItb3ZlcmxheSBwLWNvbXBvbmVudCBwLWZsdWlkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNvbnRlbnRDbGljaygpXCJcbiAgICAgICAgICAgIFtAb3ZlcmxheUFuaW1hdGlvbl09XCIndmlzaWJsZSdcIlxuICAgICAgICAgICAgKEBvdmVybGF5QW5pbWF0aW9uLnN0YXJ0KT1cIm9uT3ZlcmxheUFuaW1hdGlvblN0YXJ0KCRldmVudClcIlxuICAgICAgICAgICAgKEBvdmVybGF5QW5pbWF0aW9uLmRvbmUpPVwib25PdmVybGF5QW5pbWF0aW9uRW5kKCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cIm9uRXNjYXBlKClcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInAtY29sdW1uLWZpbHRlci1yb3ctaXRlbXNcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChtYXRjaE1vZGUgb2YgbWF0Y2hNb2RlcygpOyB0cmFjayBtYXRjaE1vZGU7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWNvbHVtbi1maWx0ZXItcm93LWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWF0Y2hNb2RlQ2hhbmdlKG1hdGNoTW9kZS52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25NYXRjaE1vZGVLZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwidGhpcy5vbk1hdGNoTW9kZUNoYW5nZShtYXRjaE1vZGUudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncC1oaWdobGlnaHQnOiBtYXRjaE1vZGUudmFsdWUgPT09IGZpbHRlckNvbnN0cmFpbnQoKT8uZGlzcGxheU1hdGNoTW9kZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiaSA9PT0gMCA/ICcwJyA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1hdGNoTW9kZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLWNvbHVtbi1maWx0ZXItc2VwYXJhdG9yXCI+PC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLWNvbHVtbi1maWx0ZXItcm93LWl0ZW1cIiAoY2xpY2spPVwib25Sb3dDbGVhckl0ZW1DbGljaygpXCIgKGtleWRvd24pPVwib25NYXRjaE1vZGVLZXlEb3duKCRldmVudClcIiAoa2V5ZG93bi5lbnRlcik9XCJvblJvd0NsZWFySXRlbUNsaWNrKClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbm9GaWx0ZXJMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L2Rpdj5cbiJdfQ==
|