@mediusinc/mng-commons 5.4.0-rc.3 → 5.4.0-rc.5

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.
Files changed (60) hide show
  1. package/core/data-list/data-list-params-helpers.d.ts +1 -1
  2. package/core/data-list/data-list.model.d.ts +1 -0
  3. package/core/helpers/type-helpers.d.ts +12 -0
  4. package/esm2022/core/data-list/data-list-params-helpers.mjs +29 -5
  5. package/esm2022/core/data-list/data-list.model.mjs +1 -1
  6. package/esm2022/core/helpers/type-helpers.mjs +1 -1
  7. package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +21 -0
  8. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +1 -1
  9. package/esm2022/filter/descriptors/filter.descriptor.mjs +40 -1
  10. package/esm2022/filter/index.mjs +3 -1
  11. package/esm2022/filter/models/filter-generic-property.model.mjs +2 -0
  12. package/esm2022/form/components/dropdown/dropdown.component.mjs +159 -10
  13. package/esm2022/table/api/descriptors/table.descriptor.mjs +51 -2
  14. package/esm2022/table/components/column-filter/column-filter.component.mjs +2 -2
  15. package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +4 -1
  16. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +42 -9
  17. package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +95 -11
  18. package/esm2022/table/components/table/table.component.mjs +57 -13
  19. package/esm2022/table/helpers/filters.mjs +32 -2
  20. package/esm2022/table/services/table-feature-config.token.mjs +1 -1
  21. package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +2 -2
  22. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +11 -10
  23. package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +16 -2
  24. package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +2 -1
  25. package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +23 -3
  26. package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +2 -2
  27. package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +3 -3
  28. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +3 -4
  29. package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +2 -1
  30. package/fesm2022/mediusinc-mng-commons-core.mjs +28 -4
  31. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  32. package/fesm2022/mediusinc-mng-commons-filter.mjs +61 -1
  33. package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
  34. package/fesm2022/mediusinc-mng-commons-form.mjs +156 -7
  35. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  36. package/fesm2022/mediusinc-mng-commons-table-api.mjs +50 -1
  37. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  38. package/fesm2022/mediusinc-mng-commons-table.mjs +230 -45
  39. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  40. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +26 -10
  41. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  42. package/fesm2022/mediusinc-mng-commons-tableview.mjs +29 -8
  43. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  44. package/filter/descriptors/filter-generic.descriptor.d.ts +11 -0
  45. package/filter/descriptors/filter.descriptor.d.ts +21 -2
  46. package/filter/index.d.ts +2 -0
  47. package/filter/models/filter-generic-property.model.d.ts +7 -0
  48. package/form/components/dropdown/dropdown.component.d.ts +27 -1
  49. package/i18n/en.json +4 -0
  50. package/i18n/sl.json +4 -0
  51. package/package.json +1 -1
  52. package/table/api/descriptors/table.descriptor.d.ts +33 -1
  53. package/table/components/filter/filter-form/filter-form.component.d.ts +11 -2
  54. package/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.d.ts +21 -1
  55. package/table/components/table/table.component.d.ts +20 -5
  56. package/table/helpers/filters.d.ts +9 -1
  57. package/table/services/table-feature-config.token.d.ts +1 -0
  58. package/tableview/api/editor/descriptors/field-many.descriptor.d.ts +6 -4
  59. package/tableview/api/editor/descriptors/field.descriptor.d.ts +10 -1
  60. package/version-info.json +5 -5
@@ -1,30 +1,51 @@
1
- import { NgTemplateOutlet } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, computed, contentChildren, inject, input, signal, viewChild } from '@angular/core';
1
+ import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, booleanAttribute, computed, contentChildren, inject, input, signal, viewChild } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
4
  import { TranslateModule } from '@ngx-translate/core';
4
5
  import { Button } from 'primeng/button';
6
+ import { CheckboxModule } from 'primeng/checkbox';
7
+ import { InputGroupModule } from 'primeng/inputgroup';
8
+ import { InputGroupAddonModule } from 'primeng/inputgroupaddon';
9
+ import { InputTextModule } from 'primeng/inputtext';
5
10
  import { OverlayPanel, OverlayPanelModule } from 'primeng/overlaypanel';
11
+ import { PaginatorModule } from 'primeng/paginator';
6
12
  import { Table } from 'primeng/table';
7
13
  import { TagModule } from 'primeng/tag';
14
+ import { ToggleButtonModule } from 'primeng/togglebutton';
15
+ import { BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged, skip } from 'rxjs';
8
16
  import { COMMONS_MODULE_CONFIG_IT, FilterMatchMode, TemplateDirective, findTemplateByName } from '@mediusinc/mng-commons/core';
9
17
  import { filterApplySerializationConfigToCmp, filterGetDateConfig, filterSetMetadataOnChange, filterSetMetadataOnDisplayChange } from '../../../helpers/filters';
10
18
  import { DataListService } from '../../../services/data-list.service';
19
+ import { COMMONS_TABLE_FEATURE_CONFIG_IT } from '../../../services/table-feature-config.token';
11
20
  import { FilterActiveTagComponent } from '../filter-active-tag/filter-active-tag.component';
12
21
  import { FilterFormComponent } from '../filter-form/filter-form.component';
13
22
  import * as i0 from "@angular/core";
14
23
  import * as i1 from "primeng/overlaypanel";
24
+ import * as i2 from "@ngx-translate/core";
25
+ import * as i3 from "primeng/inputtext";
26
+ import * as i4 from "@angular/forms";
27
+ import * as i5 from "primeng/togglebutton";
15
28
  export class FilterOverlayWithTagComponent {
29
+ static { this.SEARCH_WORD_LIMIT_MAX = 4; }
16
30
  constructor() {
17
31
  this.primeTable = inject(Table);
18
32
  this.dataListService = inject((DataListService));
19
33
  this.moduleConfig = inject(COMMONS_MODULE_CONFIG_IT, { optional: true });
34
+ this.tableConfig = inject(COMMONS_TABLE_FEATURE_CONFIG_IT, { optional: true });
20
35
  this.descriptors = input.required();
21
36
  this.model = input.required();
37
+ this.enableSearch = input(false, { transform: booleanAttribute });
38
+ this.search = input();
39
+ this.searchLimitWordMax = input(undefined);
40
+ this.enableCaseSensitive = input(true, { transform: booleanAttribute });
22
41
  this.filterOverlay = viewChild.required(OverlayPanel);
42
+ this.filterFormComponent = viewChild(FilterFormComponent);
23
43
  this.templates = contentChildren(TemplateDirective);
24
44
  this.titleTemplate = computed(() => findTemplateByName([...this.templates()], 'title'));
25
45
  this.filters = computed(() => {
26
46
  return this.setInitialFilters(this.dataListService.filterMeta());
27
47
  });
48
+ this.showFilterButton = computed(() => this.descriptors().length > 0);
28
49
  this.activeFilters = computed(() => {
29
50
  const filterEntry = this.filters();
30
51
  return this.descriptors()
@@ -42,19 +63,41 @@ export class FilterOverlayWithTagComponent {
42
63
  this.activeFilterProperties = computed(() => this.activeFilters().map(f => f.descriptor.property));
43
64
  this.filterEdit = signal(undefined);
44
65
  this.serializationCfg = {};
66
+ // global search model
67
+ this.searchValue = computed(() => this.search()?.value);
68
+ this.searchCaseSensitive = computed(() => this.search()?.caseSensitive);
69
+ this.searchWordLimitMaxError = signal(false);
70
+ this.searchWordLimitMaxCmp = computed(() => {
71
+ const inputLimit = this.searchLimitWordMax();
72
+ if (inputLimit !== undefined) {
73
+ return inputLimit;
74
+ }
75
+ return this.tableConfig?.searchLimitMaxWords !== undefined ? this.tableConfig?.searchLimitMaxWords : FilterOverlayWithTagComponent.SEARCH_WORD_LIMIT_MAX;
76
+ });
77
+ this.searchValueSubject = new BehaviorSubject(undefined);
78
+ this.searchCaseSensitiveSubject = new BehaviorSubject(undefined);
45
79
  // UI utilities
46
80
  this.clickedOnFilterEvent = undefined;
47
81
  filterApplySerializationConfigToCmp(this.moduleConfig, this.serializationCfg);
82
+ combineLatest([this.searchValueSubject.pipe(debounceTime(500), distinctUntilChanged()), this.searchCaseSensitiveSubject])
83
+ // NOTE: skip is used to ignore propagating the initial value of the subjects
84
+ .pipe(skip(1), takeUntilDestroyed())
85
+ .subscribe(([value, caseSensitive]) => {
86
+ this.updatePrimeTableGlobalFilter(value == null ? this.search()?.value ?? '' : value, caseSensitive == null ? this.search()?.caseSensitive ?? undefined : caseSensitive);
87
+ });
48
88
  }
49
89
  onFilterFormApply(event) {
50
90
  const descriptor = this.descriptors().find(d => d.property === event.property);
51
91
  if (!descriptor) {
52
92
  return;
53
93
  }
54
- this.updatePrimeTableFilter({
94
+ const filterData = {
55
95
  ...filterSetMetadataOnDisplayChange({ caseSensitive: event.caseSensitive }, event.matchMode, event.value, descriptor.filterType, filterGetDateConfig(descriptor, this.serializationCfg)),
56
96
  descriptor: descriptor
57
- });
97
+ };
98
+ this.updatePrimeTableFilter(filterData);
99
+ // this keeps the UI updated properly before closing the overlay
100
+ this.filterEdit.set(filterData);
58
101
  // Resetting the form is done in the onOverlayHide callback because resetting the
59
102
  // values here renders empty inputs for a split second before closing the overlay
60
103
  this.filterOverlay().hide();
@@ -74,11 +117,32 @@ export class FilterOverlayWithTagComponent {
74
117
  onFilterAdd(event) {
75
118
  this.onFilterAddOrEdit(undefined, event);
76
119
  }
120
+ onSearchChange(value) {
121
+ const searchWordLimitMax = this.searchWordLimitMaxCmp();
122
+ if (searchWordLimitMax !== null) {
123
+ const wordCount = value.split(/\s+/).filter(word => word.length > 0).length;
124
+ this.searchWordLimitMaxError.set(wordCount > searchWordLimitMax);
125
+ }
126
+ else {
127
+ this.searchWordLimitMaxError.set(false);
128
+ }
129
+ if (!this.searchWordLimitMaxError()) {
130
+ this.searchValueSubject.next(value);
131
+ }
132
+ }
133
+ onSearchCaseSensitiveChange(value) {
134
+ this.searchCaseSensitiveSubject.next(value);
135
+ }
77
136
  onOverlayHide() {
137
+ // resetting the form is done here for a smoother animation
138
+ if (this.filterFormComponent !== undefined) {
139
+ this.filterFormComponent()?.resetForm();
140
+ }
78
141
  if (this.clickedOnFilterEvent) {
79
142
  // show the overlay again if the user clicked another filter
80
143
  setTimeout(() => {
81
- this.filterOverlay().show(this.clickedOnFilterEvent);
144
+ this.filterEdit.set(this.clickedOnFilterEvent?.filter);
145
+ this.filterOverlay().show(this.clickedOnFilterEvent?.event);
82
146
  this.clickedOnFilterEvent = undefined;
83
147
  }, 0);
84
148
  return;
@@ -92,17 +156,16 @@ export class FilterOverlayWithTagComponent {
92
156
  // If user clicks on the same filter or add that is already open, close the overlay
93
157
  if (this.filterOverlay().overlayVisible && this.filterEdit()?.descriptor.property === filter?.descriptor.property) {
94
158
  this.filterOverlay().hide();
95
- this.filterEdit.set(undefined);
96
159
  return;
97
160
  }
98
- this.filterEdit.set(filter);
99
161
  if (this.filterOverlay().overlayVisible) {
100
162
  // In case the user clicks another filter, 're-showing' the overlay in
101
163
  // the new position is done in the onOverlayHide callback
102
- this.clickedOnFilterEvent = event;
164
+ this.clickedOnFilterEvent = { event, filter };
103
165
  this.filterOverlay().hide();
104
166
  }
105
167
  else {
168
+ this.filterEdit.set(filter);
106
169
  this.filterOverlay().show(event);
107
170
  }
108
171
  }
@@ -125,11 +188,32 @@ export class FilterOverlayWithTagComponent {
125
188
  this.primeTable.filters[filter.descriptor.property] = { ...filter };
126
189
  this.primeTable._filter();
127
190
  }
191
+ updatePrimeTableGlobalFilter(searchQuery, caseSensitive = false) {
192
+ // match mode needs to be set for inline search
193
+ this.primeTable.filters['global'] = { ...{ value: searchQuery, matchMode: 'contains', caseSensitive: caseSensitive } };
194
+ this.primeTable._filter();
195
+ }
128
196
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FilterOverlayWithTagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
129
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: FilterOverlayWithTagComponent, isStandalone: true, selector: "mng-filter-overlay-with-tag", inputs: { descriptors: { classPropertyName: "descriptors", publicName: "descriptors", isSignal: true, isRequired: true, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null } }, queries: [{ propertyName: "templates", predicate: TemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "filterOverlay", first: true, predicate: OverlayPanel, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex align-items-center flex-grow-1\">\n @if (titleTemplate()) {\n <ng-container *ngTemplateOutlet=\"titleTemplate()\"></ng-container>\n }\n <p-button\n icon=\"pi pi-filter\"\n rounded=\"true\"\n [severity]=\"activeFilters().length > 0 ? 'primary' : 'secondary'\"\n size=\"small\"\n (click)=\"onFilterAdd($event)\"\n [styleClass]=\"'my-1 mr-2' + (titleTemplate() ? ' ml-3' : '')\">\n </p-button>\n</div>\n@if (activeFilters().length > 0) {\n <div class=\"flex align-items-center flex-wrap mt-2\">\n @for (filter of activeFilters(); track filter.descriptor.property) {\n <mng-filter-active-tag [model]=\"model()\" [filter]=\"filter\" (edit)=\"onFilterEdit($event)\" (remove)=\"onFilterRemove($event)\" />\n }\n </div>\n}\n<p-overlayPanel #op [showCloseIcon]=\"true\" (onHide)=\"onOverlayHide()\" appendTo=\"body\">\n <mng-filter-form\n [model]=\"model()\"\n [descriptors]=\"descriptors()\"\n [filter]=\"filterEdit()\"\n [disabledProperties]=\"activeFilterProperties()\"\n [overlay]=\"op\"\n (apply)=\"onFilterFormApply($event)\" />\n</p-overlayPanel>\n", dependencies: [{ kind: "ngmodule", type: OverlayPanelModule }, { kind: "component", type: i1.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: FilterFormComponent, selector: "mng-filter-form", inputs: ["title", "descriptors", "model", "filter", "overlay", "disabledProperties"], outputs: ["apply"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FilterActiveTagComponent, selector: "mng-filter-active-tag", inputs: ["model", "filter"], outputs: ["edit", "remove"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
197
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: FilterOverlayWithTagComponent, isStandalone: true, selector: "mng-filter-overlay-with-tag", inputs: { descriptors: { classPropertyName: "descriptors", publicName: "descriptors", isSignal: true, isRequired: true, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, enableSearch: { classPropertyName: "enableSearch", publicName: "enableSearch", isSignal: true, isRequired: false, transformFunction: null }, search: { classPropertyName: "search", publicName: "search", isSignal: true, isRequired: false, transformFunction: null }, searchLimitWordMax: { classPropertyName: "searchLimitWordMax", publicName: "searchLimitWordMax", isSignal: true, isRequired: false, transformFunction: null }, enableCaseSensitive: { classPropertyName: "enableCaseSensitive", publicName: "enableCaseSensitive", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "templates", predicate: TemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "filterOverlay", first: true, predicate: OverlayPanel, descendants: true, isSignal: true }, { propertyName: "filterFormComponent", first: true, predicate: FilterFormComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex align-items-center flex-grow-1\">\n @if (titleTemplate()) {\n <ng-container *ngTemplateOutlet=\"titleTemplate()\"></ng-container>\n }\n @if (showFilterButton()) {\n <p-button\n icon=\"pi pi-filter\"\n rounded=\"true\"\n [severity]=\"activeFilters().length > 0 ? 'primary' : 'secondary'\"\n size=\"small\"\n (click)=\"onFilterAdd($event)\"\n [styleClass]=\"'my-1 mr-2' + (titleTemplate() ? ' ml-3' : '')\">\n </p-button>\n }\n @if (enableSearch()) {\n <div class=\"col-4\" [ngClass]=\"{'ml-3': !showFilterButton() && titleTemplate()}\">\n <span class=\"p-input-icon-left w-full\">\n <i class=\"pi pi-search\"></i>\n <input\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"onSearchChange($event)\"\n name=\"globalSearch\"\n type=\"text\"\n pInputText\n class=\"search-input w-full\"\n [ngClass]=\"{'ng-invalid': searchWordLimitMaxError()}\"\n [attr.placeholder]=\"'mngFilter.search.input' | translate\"\n [placeholder]=\"'mngFilter.search.input' | translate\" />\n @if (enableCaseSensitive()) {\n <span class=\"toggle-button-input\">\n <p-toggleButton\n styleClass=\"ml-1 p-1 p-button-sm\"\n [ngModel]=\"searchCaseSensitive()\"\n (ngModelChange)=\"onSearchCaseSensitiveChange($event)\"\n onLabel=\"Aa\"\n offLabel=\"Aa\" />\n </span>\n }\n </span>\n @if (searchWordLimitMaxError()) {\n <small class=\"p-error block\">\n {{ 'mngFilter.search.maxWordsExceededMessage' | translate }}\n </small>\n }\n </div>\n }\n</div>\n@if (activeFilters().length > 0) {\n <div class=\"flex align-items-center flex-wrap mt-2\">\n @for (filter of activeFilters(); track filter.descriptor.property) {\n <mng-filter-active-tag [model]=\"model()\" [filter]=\"filter\" (edit)=\"onFilterEdit($event)\" (remove)=\"onFilterRemove($event)\" />\n }\n </div>\n}\n<p-overlayPanel #op [showCloseIcon]=\"true\" (onHide)=\"onOverlayHide()\" appendTo=\"body\">\n <mng-filter-form\n [model]=\"model()\"\n [descriptors]=\"descriptors()\"\n [filter]=\"filterEdit()\"\n [disabledProperties]=\"activeFilterProperties()\"\n [overlay]=\"op\"\n (apply)=\"onFilterFormApply($event)\" />\n</p-overlayPanel>\n", styles: [".toggle-button-input{position:absolute;right:.35rem;top:50%;transform:translateY(-50%)}\n"], dependencies: [{ kind: "ngmodule", type: OverlayPanelModule }, { kind: "component", type: i1.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: FilterFormComponent, selector: "mng-filter-form", inputs: ["title", "descriptors", "model", "filter", "overlay", "disabledProperties"], outputs: ["apply"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FilterActiveTagComponent, selector: "mng-filter-active-tag", inputs: ["model", "filter"], outputs: ["edit", "remove"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: PaginatorModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ToggleButtonModule }, { kind: "component", type: i5.ToggleButton, selector: "p-toggleButton", inputs: ["onLabel", "offLabel", "onIcon", "offIcon", "ariaLabel", "ariaLabelledBy", "disabled", "style", "styleClass", "inputId", "tabindex", "iconPos", "autofocus"], outputs: ["onChange"] }, { kind: "ngmodule", type: InputGroupModule }, { kind: "ngmodule", type: InputGroupAddonModule }, { kind: "ngmodule", type: CheckboxModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
130
198
  }
131
199
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FilterOverlayWithTagComponent, decorators: [{
132
200
  type: Component,
133
- args: [{ standalone: true, selector: 'mng-filter-overlay-with-tag', imports: [OverlayPanelModule, TranslateModule, TagModule, FilterFormComponent, Button, FilterActiveTagComponent, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex align-items-center flex-grow-1\">\n @if (titleTemplate()) {\n <ng-container *ngTemplateOutlet=\"titleTemplate()\"></ng-container>\n }\n <p-button\n icon=\"pi pi-filter\"\n rounded=\"true\"\n [severity]=\"activeFilters().length > 0 ? 'primary' : 'secondary'\"\n size=\"small\"\n (click)=\"onFilterAdd($event)\"\n [styleClass]=\"'my-1 mr-2' + (titleTemplate() ? ' ml-3' : '')\">\n </p-button>\n</div>\n@if (activeFilters().length > 0) {\n <div class=\"flex align-items-center flex-wrap mt-2\">\n @for (filter of activeFilters(); track filter.descriptor.property) {\n <mng-filter-active-tag [model]=\"model()\" [filter]=\"filter\" (edit)=\"onFilterEdit($event)\" (remove)=\"onFilterRemove($event)\" />\n }\n </div>\n}\n<p-overlayPanel #op [showCloseIcon]=\"true\" (onHide)=\"onOverlayHide()\" appendTo=\"body\">\n <mng-filter-form\n [model]=\"model()\"\n [descriptors]=\"descriptors()\"\n [filter]=\"filterEdit()\"\n [disabledProperties]=\"activeFilterProperties()\"\n [overlay]=\"op\"\n (apply)=\"onFilterFormApply($event)\" />\n</p-overlayPanel>\n" }]
201
+ args: [{ standalone: true, selector: 'mng-filter-overlay-with-tag', imports: [
202
+ OverlayPanelModule,
203
+ TranslateModule,
204
+ TagModule,
205
+ FilterFormComponent,
206
+ Button,
207
+ FilterActiveTagComponent,
208
+ NgTemplateOutlet,
209
+ InputTextModule,
210
+ PaginatorModule,
211
+ NgClass,
212
+ ToggleButtonModule,
213
+ InputGroupModule,
214
+ InputGroupAddonModule,
215
+ CheckboxModule,
216
+ NgStyle
217
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex align-items-center flex-grow-1\">\n @if (titleTemplate()) {\n <ng-container *ngTemplateOutlet=\"titleTemplate()\"></ng-container>\n }\n @if (showFilterButton()) {\n <p-button\n icon=\"pi pi-filter\"\n rounded=\"true\"\n [severity]=\"activeFilters().length > 0 ? 'primary' : 'secondary'\"\n size=\"small\"\n (click)=\"onFilterAdd($event)\"\n [styleClass]=\"'my-1 mr-2' + (titleTemplate() ? ' ml-3' : '')\">\n </p-button>\n }\n @if (enableSearch()) {\n <div class=\"col-4\" [ngClass]=\"{'ml-3': !showFilterButton() && titleTemplate()}\">\n <span class=\"p-input-icon-left w-full\">\n <i class=\"pi pi-search\"></i>\n <input\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"onSearchChange($event)\"\n name=\"globalSearch\"\n type=\"text\"\n pInputText\n class=\"search-input w-full\"\n [ngClass]=\"{'ng-invalid': searchWordLimitMaxError()}\"\n [attr.placeholder]=\"'mngFilter.search.input' | translate\"\n [placeholder]=\"'mngFilter.search.input' | translate\" />\n @if (enableCaseSensitive()) {\n <span class=\"toggle-button-input\">\n <p-toggleButton\n styleClass=\"ml-1 p-1 p-button-sm\"\n [ngModel]=\"searchCaseSensitive()\"\n (ngModelChange)=\"onSearchCaseSensitiveChange($event)\"\n onLabel=\"Aa\"\n offLabel=\"Aa\" />\n </span>\n }\n </span>\n @if (searchWordLimitMaxError()) {\n <small class=\"p-error block\">\n {{ 'mngFilter.search.maxWordsExceededMessage' | translate }}\n </small>\n }\n </div>\n }\n</div>\n@if (activeFilters().length > 0) {\n <div class=\"flex align-items-center flex-wrap mt-2\">\n @for (filter of activeFilters(); track filter.descriptor.property) {\n <mng-filter-active-tag [model]=\"model()\" [filter]=\"filter\" (edit)=\"onFilterEdit($event)\" (remove)=\"onFilterRemove($event)\" />\n }\n </div>\n}\n<p-overlayPanel #op [showCloseIcon]=\"true\" (onHide)=\"onOverlayHide()\" appendTo=\"body\">\n <mng-filter-form\n [model]=\"model()\"\n [descriptors]=\"descriptors()\"\n [filter]=\"filterEdit()\"\n [disabledProperties]=\"activeFilterProperties()\"\n [overlay]=\"op\"\n (apply)=\"onFilterFormApply($event)\" />\n</p-overlayPanel>\n", styles: [".toggle-button-input{position:absolute;right:.35rem;top:50%;transform:translateY(-50%)}\n"] }]
134
218
  }], ctorParameters: () => [] });
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLW92ZXJsYXktd2l0aC10YWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci1vdmVybGF5LXdpdGgtdGFnL2ZpbHRlci1vdmVybGF5LXdpdGgtdGFnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3RhYmxlL3NyYy9jb21wb25lbnRzL2ZpbHRlci9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUF1QixRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVuSixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsT0FBTyxFQUFDLHdCQUF3QixFQUFxRCxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUloTCxPQUFPLEVBQUMsbUNBQW1DLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsZ0NBQWdDLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUUvSixPQUFPLEVBQUMsZUFBZSxFQUFDLE1B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LHdCQUF3QixFQUFFLGdCQUFnQixDQUFDLG1CQUNqSCx1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBTaWduYWwsIFRlbXBsYXRlUmVmLCBjb21wdXRlZCwgY29udGVudENoaWxkcmVuLCBpbmplY3QsIGlucHV0LCBzaWduYWwsIHZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7VHJhbnNsYXRlTW9kdWxlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7QnV0dG9ufSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQge092ZXJsYXlQYW5lbCwgT3ZlcmxheVBhbmVsTW9kdWxlfSBmcm9tICdwcmltZW5nL292ZXJsYXlwYW5lbCc7XG5pbXBvcnQge1RhYmxlfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7VGFnTW9kdWxlfSBmcm9tICdwcmltZW5nL3RhZyc7XG5cbmltcG9ydCB7Q09NTU9OU19NT0RVTEVfQ09ORklHX0lULCBDb21tb25zRmlsdGVyTWV0YWRhdGEsIENvbW1vbnNTZXJpYWxpemF0aW9uQ29uZmlnLCBGaWx0ZXJNYXRjaE1vZGUsIFRlbXBsYXRlRGlyZWN0aXZlLCBmaW5kVGVtcGxhdGVCeU5hbWV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0ZpbHRlckRlc2NyaXB0b3J9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZmlsdGVyJztcbmltcG9ydCB7TW9kZWxEZXNjcmlwdG9yfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL21vZGVsJztcblxuaW1wb3J0IHtmaWx0ZXJBcHBseVNlcmlhbGl6YXRpb25Db25maWdUb0NtcCwgZmlsdGVyR2V0RGF0ZUNvbmZpZywgZmlsdGVyU2V0TWV0YWRhdGFPbkNoYW5nZSwgZmlsdGVyU2V0TWV0YWRhdGFPbkRpc3BsYXlDaGFuZ2V9IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZmlsdGVycyc7XG5pbXBvcnQge0NvbW1vbnNGaWx0ZXJNZXRhZGF0YVdpdGhEZXNjcmlwdG9yLCBGaWx0ZXJBY3RpdmVUYWdFdmVudCwgRmlsdGVyRm9ybUVtaXRFdmVudH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2ZpbHRlci5tb2RlbCc7XG5pbXBvcnQge0RhdGFMaXN0U2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZGF0YS1saXN0LnNlcnZpY2UnO1xuaW1wb3J0IHtGaWx0ZXJBY3RpdmVUYWdDb21wb25lbnR9IGZyb20gJy4uL2ZpbHRlci1hY3RpdmUtdGFnL2ZpbHRlci1hY3RpdmUtdGFnLmNvbXBvbmVudCc7XG5pbXBvcnQge0ZpbHRlckZvcm1Db21wb25lbnR9IGZyb20gJy4uL2ZpbHRlci1mb3JtL2ZpbHRlci1mb3JtLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctZmlsdGVyLW92ZXJsYXktd2l0aC10YWcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW092ZXJsYXlQYW5lbE1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBUYWdNb2R1bGUsIEZpbHRlckZvcm1Db21wb25lbnQsIEJ1dHRvbiwgRmlsdGVyQWN0aXZlVGFnQ29tcG9uZW50LCBOZ1RlbXBsYXRlT3V0bGV0XSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJPdmVybGF5V2l0aFRhZ0NvbXBvbmVudCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmltZVRhYmxlID0gaW5qZWN0KFRhYmxlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGFMaXN0U2VydmljZSA9IGluamVjdChEYXRhTGlzdFNlcnZpY2U8YW55Pik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVDb25maWcgPSBpbmplY3QoQ09NTU9OU19NT0RVTEVfQ09ORklHX0lULCB7b3B0aW9uYWw6IHRydWV9KTtcblxuICAgIHB1YmxpYyBkZXNjcmlwdG9ycyA9IGlucHV0LnJlcXVpcmVkPEZpbHRlckRlc2NyaXB0b3I8YW55LCBhbnk+W10+KCk7XG4gICAgcHVibGljIG1vZGVsID0gaW5wdXQucmVxdWlyZWQ8TW9kZWxEZXNjcmlwdG9yPGFueT4+KCk7XG5cbiAgICBwcml2YXRlIGZpbHRlck92ZXJsYXkgPSB2aWV3Q2hpbGQucmVxdWlyZWQoT3ZlcmxheVBhbmVsKTtcblxuICAgIHB1YmxpYyB0ZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVEaXJlY3RpdmUpO1xuICAgIHB1YmxpYyB0aXRsZVRlbXBsYXRlOiBTaWduYWw8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4gZmluZFRlbXBsYXRlQnlOYW1lKFsuLi50aGlzLnRlbXBsYXRlcygpXSwgJ3RpdGxlJykpO1xuXG4gICAgcHVibGljIGZpbHRlcnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldEluaXRpYWxGaWx0ZXJzKHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmZpbHRlck1ldGEoKSk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgYWN0aXZlRmlsdGVycyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRW50cnkgPSB0aGlzLmZpbHRlcnMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvcnMoKVxuICAgICAgICAgICAgLmZpbHRlcihkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJFbnRyeVtkLnByb3BlcnR5XTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1hdGNoTW9kZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlci5kaXNwbGF5TWF0Y2hNb2RlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgKGZpbHRlci5tYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5FeGlzdHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5tYXRjaE1vZGUgPT09IEZpbHRlck1hdGNoTW9kZS5Eb2VzTm90RXhpc3QgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXIudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIuZGlzcGxheVZhbHVlICE9PSB1bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcChkID0+IGZpbHRlckVudHJ5W2QucHJvcGVydHldISk7XG4gICAgfSk7XG4gICAgcHVibGljIGFjdGl2ZUZpbHRlclByb3BlcnRpZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmFjdGl2ZUZpbHRlcnMoKS5tYXAoZiA9PiBmLmRlc2NyaXB0b3IucHJvcGVydHkpKTtcbiAgICBwdWJsaWMgZmlsdGVyRWRpdCA9IHNpZ25hbDxDb21tb25zRmlsdGVyTWV0YWRhdGFXaXRoRGVzY3JpcHRvciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIHByaXZhdGUgc2VyaWFsaXphdGlvbkNmZzogQ29tbW9uc1NlcmlhbGl6YXRpb25Db25maWcgPSB7fTtcblxuICAgIC8vIFVJIHV0aWxpdGllc1xuICAgIHByaXZhdGUgY2xpY2tlZE9uRmlsdGVyRXZlbnQ6IEV2ZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGZpbHRlckFwcGx5U2VyaWFsaXphdGlvbkNvbmZpZ1RvQ21wKHRoaXMubW9kdWxlQ29uZmlnLCB0aGlzLnNlcmlhbGl6YXRpb25DZmcpO1xuICAgIH1cblxuICAgIG9uRmlsdGVyRm9ybUFwcGx5KGV2ZW50OiBGaWx0ZXJGb3JtRW1pdEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLmRlc2NyaXB0b3JzKCkuZmluZChkID0+IGQucHJvcGVydHkgPT09IGV2ZW50LnByb3BlcnR5KTtcbiAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVByaW1lVGFibGVGaWx0ZXIoe1xuICAgICAgICAgICAgLi4uZmlsdGVyU2V0TWV0YWRhdGFPbkRpc3BsYXlDaGFuZ2UoXG4gICAgICAgICAgICAgICAge2Nhc2VTZW5zaXRpdmU6IGV2ZW50LmNhc2VTZW5zaXRpdmV9LFxuICAgICAgICAgICAgICAgIGV2ZW50Lm1hdGNoTW9kZSxcbiAgICAgICAgICAgICAgICBldmVudC52YWx1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbHRlclR5cGUsXG4gICAgICAgICAgICAgICAgZmlsdGVyR2V0RGF0ZUNvbmZpZyhkZXNjcmlwdG9yLCB0aGlzLnNlcmlhbGl6YXRpb25DZmcpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvclxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZXNldHRpbmcgdGhlIGZvcm0gaXMgZG9uZSBpbiB0aGUgb25PdmVybGF5SGlkZSBjYWxsYmFjayBiZWNhdXNlIHJlc2V0dGluZyB0aGVcbiAgICAgICAgLy8gdmFsdWVzIGhlcmUgcmVuZGVycyBlbXB0eSBpbnB1dHMgZm9yIGEgc3BsaXQgc2Vjb25kIGJlZm9yZSBjbG9zaW5nIHRoZSBvdmVybGF5XG4gICAgICAgIHRoaXMuZmlsdGVyT3ZlcmxheSgpLmhpZGUoKTtcbiAgICB9XG5cbiAgICBvbkZpbHRlclJlbW92ZShldmVudDogRmlsdGVyQWN0aXZlVGFnRXZlbnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQcmltZVRhYmxlRmlsdGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuZmlsdGVycygpW2V2ZW50LmZpbHRlci5kZXNjcmlwdG9yLnByb3BlcnR5XSxcbiAgICAgICAgICAgIG1hdGNoTW9kZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGlzcGxheU1hdGNoTW9kZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRmlsdGVyRWRpdChldmVudDogRmlsdGVyQWN0aXZlVGFnRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbkZpbHRlckFkZE9yRWRpdChldmVudC5maWx0ZXIsIGV2ZW50LmV2ZW50KTtcbiAgICB9XG5cbiAgICBvbkZpbHRlckFkZChldmVudDogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbkZpbHRlckFkZE9yRWRpdCh1bmRlZmluZWQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICBvbk92ZXJsYXlIaWRlKCkge1xuICAgICAgICBpZiAodGhpcy5jbGlja2VkT25GaWx0ZXJFdmVudCkge1xuICAgICAgICAgICAgLy8gc2hvdyB0aGUgb3ZlcmxheSBhZ2FpbiBpZiB0aGUgdXNlciBjbGlja2VkIGFub3RoZXIgZmlsdGVyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlck92ZXJsYXkoKS5zaG93KHRoaXMuY2xpY2tlZE9uRmlsdGVyRXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tlZE9uRmlsdGVyRXZlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNsZWFuIHN0YXRlXG4gICAgICAgICAgICB0aGlzLmZpbHRlckVkaXQuc2V0KHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRmlsdGVyQWRkT3JFZGl0KGZpbHRlcj86IENvbW1vbnNGaWx0ZXJNZXRhZGF0YVdpdGhEZXNjcmlwdG9yLCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIC8vIElmIHVzZXIgY2xpY2tzIG9uIHRoZSBzYW1lIGZpbHRlciBvciBhZGQgdGhhdCBpcyBhbHJlYWR5IG9wZW4sIGNsb3NlIHRoZSBvdmVybGF5XG4gICAgICAgIGlmICh0aGlzLmZpbHRlck92ZXJsYXkoKS5vdmVybGF5VmlzaWJsZSAmJiB0aGlzLmZpbHRlckVkaXQoKT8uZGVzY3JpcHRvci5wcm9wZXJ0eSA9PT0gZmlsdGVyPy5kZXNjcmlwdG9yLnByb3BlcnR5KSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlck92ZXJsYXkoKS5oaWRlKCk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckVkaXQuc2V0KHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbHRlckVkaXQuc2V0KGZpbHRlcik7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlck92ZXJsYXkoKS5vdmVybGF5VmlzaWJsZSkge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgdXNlciBjbGlja3MgYW5vdGhlciBmaWx0ZXIsICdyZS1zaG93aW5nJyB0aGUgb3ZlcmxheSBpblxuICAgICAgICAgICAgLy8gdGhlIG5ldyBwb3NpdGlvbiBpcyBkb25lIGluIHRoZSBvbk92ZXJsYXlIaWRlIGNhbGxiYWNrXG4gICAgICAgICAgICB0aGlzLmNsaWNrZWRPbkZpbHRlckV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICB0aGlzLmZpbHRlck92ZXJsYXkoKS5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlck92ZXJsYXkoKS5zaG93KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0SW5pdGlhbEZpbHRlcnMoZmlsdGVyc0luaXQ6IFJlY29yZDxzdHJpbmcsIENvbW1vbnNGaWx0ZXJNZXRhZGF0YT4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyc1Jlc3VsdDoge1twOiBzdHJpbmddOiBDb21tb25zRmlsdGVyTWV0YWRhdGFXaXRoRGVzY3JpcHRvcn0gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGZpbHRlcnNJbml0KSB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJJbml0ID0gZmlsdGVyc0luaXRbcHJvcGVydHldO1xuXG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9ycygpLmZpbmQoZmlsdGVyRGVzY3JpcHRvciA9PiBmaWx0ZXJEZXNjcmlwdG9yLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsdGVyc1Jlc3VsdFtwcm9wZXJ0eV0gPSB7XG4gICAgICAgICAgICAgICAgLi4uZmlsdGVyU2V0TWV0YWRhdGFPbkNoYW5nZShmaWx0ZXJJbml0LCBmaWx0ZXJJbml0Lm1hdGNoTW9kZSwgZmlsdGVySW5pdC52YWx1ZSwgZGVzY3JpcHRvci5maWx0ZXJUeXBlLCBmaWx0ZXJHZXREYXRlQ29uZmlnKGRlc2NyaXB0b3IsIHRoaXMuc2VyaWFsaXphdGlvbkNmZykpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3I6IGRlc2NyaXB0b3JcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsdGVyc1Jlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVByaW1lVGFibGVGaWx0ZXIoZmlsdGVyOiBDb21tb25zRmlsdGVyTWV0YWRhdGFXaXRoRGVzY3JpcHRvcikge1xuICAgICAgICB0aGlzLnByaW1lVGFibGUuZmlsdGVyc1tmaWx0ZXIuZGVzY3JpcHRvci5wcm9wZXJ0eV0gPSB7Li4uZmlsdGVyfTtcbiAgICAgICAgdGhpcy5wcmltZVRhYmxlLl9maWx0ZXIoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1ncm93LTFcIj5cbiAgICBAaWYgKHRpdGxlVGVtcGxhdGUoKSkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGl0bGVUZW1wbGF0ZSgpXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuICAgIDxwLWJ1dHRvblxuICAgICAgICBpY29uPVwicGkgcGktZmlsdGVyXCJcbiAgICAgICAgcm91bmRlZD1cInRydWVcIlxuICAgICAgICBbc2V2ZXJpdHldPVwiYWN0aXZlRmlsdGVycygpLmxlbmd0aCA+IDAgPyAncHJpbWFyeScgOiAnc2Vjb25kYXJ5J1wiXG4gICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgIChjbGljayk9XCJvbkZpbHRlckFkZCgkZXZlbnQpXCJcbiAgICAgICAgW3N0eWxlQ2xhc3NdPVwiJ215LTEgbXItMicgKyAodGl0bGVUZW1wbGF0ZSgpID8gJyBtbC0zJyA6ICcnKVwiPlxuICAgIDwvcC1idXR0b24+XG48L2Rpdj5cbkBpZiAoYWN0aXZlRmlsdGVycygpLmxlbmd0aCA+IDApIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwIG10LTJcIj5cbiAgICAgICAgQGZvciAoZmlsdGVyIG9mIGFjdGl2ZUZpbHRlcnMoKTsgdHJhY2sgZmlsdGVyLmRlc2NyaXB0b3IucHJvcGVydHkpIHtcbiAgICAgICAgICAgIDxtbmctZmlsdGVyLWFjdGl2ZS10YWcgW21vZGVsXT1cIm1vZGVsKClcIiBbZmlsdGVyXT1cImZpbHRlclwiIChlZGl0KT1cIm9uRmlsdGVyRWRpdCgkZXZlbnQpXCIgKHJlbW92ZSk9XCJvbkZpbHRlclJlbW92ZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxufVxuPHAtb3ZlcmxheVBhbmVsICNvcCBbc2hvd0Nsb3NlSWNvbl09XCJ0cnVlXCIgKG9uSGlkZSk9XCJvbk92ZXJsYXlIaWRlKClcIiBhcHBlbmRUbz1cImJvZHlcIj5cbiAgICA8bW5nLWZpbHRlci1mb3JtXG4gICAgICAgIFttb2RlbF09XCJtb2RlbCgpXCJcbiAgICAgICAgW2Rlc2NyaXB0b3JzXT1cImRlc2NyaXB0b3JzKClcIlxuICAgICAgICBbZmlsdGVyXT1cImZpbHRlckVkaXQoKVwiXG4gICAgICAgIFtkaXNhYmxlZFByb3BlcnRpZXNdPVwiYWN0aXZlRmlsdGVyUHJvcGVydGllcygpXCJcbiAgICAgICAgW292ZXJsYXldPVwib3BcIlxuICAgICAgICAoYXBwbHkpPVwib25GaWx0ZXJGb3JtQXBwbHkoJGV2ZW50KVwiIC8+XG48L3Atb3ZlcmxheVBhbmVsPlxuIl19
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLW92ZXJsYXktd2l0aC10YWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci1vdmVybGF5LXdpdGgtdGFnL2ZpbHRlci1vdmVybGF5LXdpdGgtdGFnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3RhYmxlL3NyYy9jb21wb25lbnRzL2ZpbHRlci9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ25FLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQXVCLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JLLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRTlELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdEUsT0FBTyxFQUFDLGVB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UUFDbEYsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlCLENBQUM7OEdBak5RLDZCQUE2QjtrR0FBN0IsNkJBQTZCLHM4QkFrQkgsaUJBQWlCLDRGQUhULFlBQVksc0dBQ2YsbUJBQW1CLGdFQ3BFL0QsOHVGQStEQSxrSkQ3QlEsa0JBQWtCLGtXQUNsQixlQUFlLDJGQUNmLFNBQVMsK0JBQ1QsbUJBQW1CLHNLQUNuQixNQUFNLHNWQUNOLHdCQUF3Qiw0SEFDeEIsZ0JBQWdCLG1KQUNoQixlQUFlLHdIQUNmLGVBQWUsK21CQUNmLE9BQU8sbUZBQ1Asa0JBQWtCLHNTQUNsQixnQkFBZ0IsOEJBQ2hCLHFCQUFxQiw4QkFDckIsY0FBYzs7MkZBS1QsNkJBQTZCO2tCQXhCekMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sNkJBQTZCLFdBRzlCO3dCQUNMLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixTQUFTO3dCQUNULG1CQUFtQjt3QkFDbkIsTUFBTTt3QkFDTix3QkFBd0I7d0JBQ3hCLGdCQUFnQjt3QkFDaEIsZUFBZTt3QkFDZixlQUFlO3dCQUNmLE9BQU87d0JBQ1Asa0JBQWtCO3dCQUNsQixnQkFBZ0I7d0JBQ2hCLHFCQUFxQjt3QkFDckIsY0FBYzt3QkFDZCxPQUFPO3FCQUNWLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ0NsYXNzLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBTaWduYWwsIFRlbXBsYXRlUmVmLCBib29sZWFuQXR0cmlidXRlLCBjb21wdXRlZCwgY29udGVudENoaWxkcmVuLCBpbmplY3QsIGlucHV0LCBzaWduYWwsIHZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0J1dHRvbn0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHtDaGVja2JveE1vZHVsZX0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XG5pbXBvcnQge0lucHV0R3JvdXBNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXRncm91cCc7XG5pbXBvcnQge0lucHV0R3JvdXBBZGRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9pbnB1dGdyb3VwYWRkb24nO1xuaW1wb3J0IHtJbnB1dFRleHRNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7T3ZlcmxheVBhbmVsLCBPdmVybGF5UGFuZWxNb2R1bGV9IGZyb20gJ3ByaW1lbmcvb3ZlcmxheXBhbmVsJztcbmltcG9ydCB7UGFnaW5hdG9yTW9kdWxlfSBmcm9tICdwcmltZW5nL3BhZ2luYXRvcic7XG5pbXBvcnQge1RhYmxlfSBmcm9tICdwcmltZW5nL3RhYmxlJztcbmltcG9ydCB7VGFnTW9kdWxlfSBmcm9tICdwcmltZW5nL3RhZyc7XG5pbXBvcnQge1RvZ2dsZUJ1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy90b2dnbGVidXR0b24nO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHNraXB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0NPTU1PTlNfTU9EVUxFX0NPTkZJR19JVCwgQ29tbW9uc0ZpbHRlck1ldGFkYXRhLCBDb21tb25zU2VyaWFsaXphdGlvbkNvbmZpZywgRmlsdGVyTWF0Y2hNb2RlLCBUZW1wbGF0ZURpcmVjdGl2ZSwgZmluZFRlbXBsYXRlQnlOYW1lfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJEZXNjcmlwdG9yfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2ZpbHRlcic7XG5pbXBvcnQge01vZGVsRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5cbmltcG9ydCB7ZmlsdGVyQXBwbHlTZXJpYWxpemF0aW9uQ29uZmlnVG9DbXAsIGZpbHRlckdldERhdGVDb25maWcsIGZpbHRlclNldE1ldGFkYXRhT25DaGFuZ2UsIGZpbHRlclNldE1ldGFkYXRhT25EaXNwbGF5Q2hhbmdlfSBmcm9tICcuLi8uLi8uLi9oZWxwZXJzL2ZpbHRlcnMnO1xuaW1wb3J0IHtDb21tb25zRmlsdGVyTWV0YWRhdGFXaXRoRGVzY3JpcHRvciwgRmlsdGVyQWN0aXZlVGFnRXZlbnQsIEZpbHRlckZvcm1FbWl0RXZlbnR9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWx0ZXIubW9kZWwnO1xuaW1wb3J0IHtEYXRhTGlzdFNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2RhdGEtbGlzdC5zZXJ2aWNlJztcbmltcG9ydCB7Q09NTU9OU19UQUJMRV9GRUFUVVJFX0NPTkZJR19JVH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdGFibGUtZmVhdHVyZS1jb25maWcudG9rZW4nO1xuaW1wb3J0IHtGaWx0ZXJBY3RpdmVUYWdDb21wb25lbnR9IGZyb20gJy4uL2ZpbHRlci1hY3RpdmUtdGFnL2ZpbHRlci1hY3RpdmUtdGFnLmNvbXBvbmVudCc7XG5pbXBvcnQge0ZpbHRlckZvcm1Db21wb25lbnR9IGZyb20gJy4uL2ZpbHRlci1mb3JtL2ZpbHRlci1mb3JtLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctZmlsdGVyLW92ZXJsYXktd2l0aC10YWcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXItb3ZlcmxheS13aXRoLXRhZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZmlsdGVyLW92ZXJsYXktd2l0aC10YWcuY29tcG9uZW50LnNjc3MnXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE92ZXJsYXlQYW5lbE1vZHVsZSxcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBUYWdNb2R1bGUsXG4gICAgICAgIEZpbHRlckZvcm1Db21wb25lbnQsXG4gICAgICAgIEJ1dHRvbixcbiAgICAgICAgRmlsdGVyQWN0aXZlVGFnQ29tcG9uZW50LFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBJbnB1dFRleHRNb2R1bGUsXG4gICAgICAgIFBhZ2luYXRvck1vZHVsZSxcbiAgICAgICAgTmdDbGFzcyxcbiAgICAgICAgVG9nZ2xlQnV0dG9uTW9kdWxlLFxuICAgICAgICBJbnB1dEdyb3VwTW9kdWxlLFxuICAgICAgICBJbnB1dEdyb3VwQWRkb25Nb2R1bGUsXG4gICAgICAgIENoZWNrYm94TW9kdWxlLFxuICAgICAgICBOZ1N0eWxlXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJPdmVybGF5V2l0aFRhZ0NvbXBvbmVudCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0VBUkNIX1dPUkRfTElNSVRfTUFYID0gNDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpbWVUYWJsZSA9IGluamVjdChUYWJsZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkYXRhTGlzdFNlcnZpY2UgPSBpbmplY3QoRGF0YUxpc3RTZXJ2aWNlPGFueT4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlQ29uZmlnID0gaW5qZWN0KENPTU1PTlNfTU9EVUxFX0NPTkZJR19JVCwge29wdGlvbmFsOiB0cnVlfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0YWJsZUNvbmZpZyA9IGluamVjdChDT01NT05TX1RBQkxFX0ZFQVRVUkVfQ09ORklHX0lULCB7b3B0aW9uYWw6IHRydWV9KTtcblxuICAgIHB1YmxpYyBkZXNjcmlwdG9ycyA9IGlucHV0LnJlcXVpcmVkPEZpbHRlckRlc2NyaXB0b3I8YW55LCBhbnk+W10+KCk7XG4gICAgcHVibGljIG1vZGVsID0gaW5wdXQucmVxdWlyZWQ8TW9kZWxEZXNjcmlwdG9yPGFueT4+KCk7XG4gICAgcHVibGljIGVuYWJsZVNlYXJjaCA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIHNlYXJjaCA9IGlucHV0PHt2YWx1ZTogc3RyaW5nOyBjYXNlU2Vuc2l0aXZlOiBib29sZWFufSB8IHVuZGVmaW5lZD4oKTtcbiAgICBwdWJsaWMgc2VhcmNoTGltaXRXb3JkTWF4ID0gaW5wdXQ8bnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbD4odW5kZWZpbmVkKTtcbiAgICBwdWJsaWMgZW5hYmxlQ2FzZVNlbnNpdGl2ZSA9IGlucHV0KHRydWUsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcblxuICAgIHByaXZhdGUgZmlsdGVyT3ZlcmxheSA9IHZpZXdDaGlsZC5yZXF1aXJlZChPdmVybGF5UGFuZWwpO1xuICAgIHByaXZhdGUgZmlsdGVyRm9ybUNvbXBvbmVudCA9IHZpZXdDaGlsZChGaWx0ZXJGb3JtQ29tcG9uZW50KTtcblxuICAgIHB1YmxpYyB0ZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVEaXJlY3RpdmUpO1xuICAgIHB1YmxpYyB0aXRsZVRlbXBsYXRlOiBTaWduYWw8VGVtcGxhdGVSZWY8YW55PiB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4gZmluZFRlbXBsYXRlQnlOYW1lKFsuLi50aGlzLnRlbXBsYXRlcygpXSwgJ3RpdGxlJykpO1xuXG4gICAgcHVibGljIGZpbHRlcnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldEluaXRpYWxGaWx0ZXJzKHRoaXMuZGF0YUxpc3RTZXJ2aWNlLmZpbHRlck1ldGEoKSk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgc2hvd0ZpbHRlckJ1dHRvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGVzY3JpcHRvcnMoKS5sZW5ndGggPiAwKTtcblxuICAgIHB1YmxpYyBhY3RpdmVGaWx0ZXJzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJFbnRyeSA9IHRoaXMuZmlsdGVycygpO1xuICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9ycygpXG4gICAgICAgICAgICAuZmlsdGVyKGQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGZpbHRlckVudHJ5W2QucHJvcGVydHldO1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlciAmJlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIubWF0Y2hNb2RlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmRpc3BsYXlNYXRjaE1vZGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAoZmlsdGVyLm1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkV4aXN0cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1hdGNoTW9kZSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlci52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZpbHRlci5kaXNwbGF5VmFsdWUgIT09IHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAubWFwKGQgPT4gZmlsdGVyRW50cnlbZC5wcm9wZXJ0eV0hKTtcbiAgICB9KTtcbiAgICBwdWJsaWMgYWN0aXZlRmlsdGVyUHJvcGVydGllcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYWN0aXZlRmlsdGVycygpLm1hcChmID0+IGYuZGVzY3JpcHRvci5wcm9wZXJ0eSkpO1xuICAgIHB1YmxpYyBmaWx0ZXJFZGl0ID0gc2lnbmFsPENvbW1vbnNGaWx0ZXJNZXRhZGF0YVdpdGhEZXNjcmlwdG9yIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgcHJpdmF0ZSBzZXJpYWxpemF0aW9uQ2ZnOiBDb21tb25zU2VyaWFsaXphdGlvbkNvbmZpZyA9IHt9O1xuXG4gICAgLy8gZ2xvYmFsIHNlYXJjaCBtb2RlbFxuICAgIHB1YmxpYyBzZWFyY2hWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VhcmNoKCk/LnZhbHVlKTtcbiAgICBwdWJsaWMgc2VhcmNoQ2FzZVNlbnNpdGl2ZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VhcmNoKCk/LmNhc2VTZW5zaXRpdmUpO1xuICAgIHB1YmxpYyBzZWFyY2hXb3JkTGltaXRNYXhFcnJvciA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJpdmF0ZSBzZWFyY2hXb3JkTGltaXRNYXhDbXAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0TGltaXQgPSB0aGlzLnNlYXJjaExpbWl0V29yZE1heCgpO1xuICAgICAgICBpZiAoaW5wdXRMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXRMaW1pdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50YWJsZUNvbmZpZz8uc2VhcmNoTGltaXRNYXhXb3JkcyAhPT0gdW5kZWZpbmVkID8gdGhpcy50YWJsZUNvbmZpZz8uc2VhcmNoTGltaXRNYXhXb3JkcyA6IEZpbHRlck92ZXJsYXlXaXRoVGFnQ29tcG9uZW50LlNFQVJDSF9XT1JEX0xJTUlUX01BWDtcbiAgICB9KTtcbiAgICBwcml2YXRlIHNlYXJjaFZhbHVlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIHByaXZhdGUgc2VhcmNoQ2FzZVNlbnNpdGl2ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvLyBVSSB1dGlsaXRpZXNcbiAgICBwcml2YXRlIGNsaWNrZWRPbkZpbHRlckV2ZW50OiB7ZXZlbnQ/OiBFdmVudDsgZmlsdGVyPzogQ29tbW9uc0ZpbHRlck1ldGFkYXRhV2l0aERlc2NyaXB0b3J9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGZpbHRlckFwcGx5U2VyaWFsaXphdGlvbkNvbmZpZ1RvQ21wKHRoaXMubW9kdWxlQ29uZmlnLCB0aGlzLnNlcmlhbGl6YXRpb25DZmcpO1xuXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuc2VhcmNoVmFsdWVTdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDUwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLCB0aGlzLnNlYXJjaENhc2VTZW5zaXRpdmVTdWJqZWN0XSlcbiAgICAgICAgICAgIC8vIE5PVEU6IHNraXAgaXMgdXNlZCB0byBpZ25vcmUgcHJvcGFnYXRpbmcgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHN1YmplY3RzXG4gICAgICAgICAgICAucGlwZShza2lwKDEpLCB0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKFt2YWx1ZSwgY2FzZVNlbnNpdGl2ZV0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVByaW1lVGFibGVHbG9iYWxGaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID09IG51bGwgPyB0aGlzLnNlYXJjaCgpPy52YWx1ZSA/PyAnJyA6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlID09IG51bGwgPyB0aGlzLnNlYXJjaCgpPy5jYXNlU2Vuc2l0aXZlID8/IHVuZGVmaW5lZCA6IGNhc2VTZW5zaXRpdmVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25GaWx0ZXJGb3JtQXBwbHkoZXZlbnQ6IEZpbHRlckZvcm1FbWl0RXZlbnQpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuZGVzY3JpcHRvcnMoKS5maW5kKGQgPT4gZC5wcm9wZXJ0eSA9PT0gZXZlbnQucHJvcGVydHkpO1xuICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbHRlckRhdGEgPSB7XG4gICAgICAgICAgICAuLi5maWx0ZXJTZXRNZXRhZGF0YU9uRGlzcGxheUNoYW5nZShcbiAgICAgICAgICAgICAgICB7Y2FzZVNlbnNpdGl2ZTogZXZlbnQuY2FzZVNlbnNpdGl2ZX0sXG4gICAgICAgICAgICAgICAgZXZlbnQubWF0Y2hNb2RlLFxuICAgICAgICAgICAgICAgIGV2ZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZmlsdGVyVHlwZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJHZXREYXRlQ29uZmlnKGRlc2NyaXB0b3IsIHRoaXMuc2VyaWFsaXphdGlvbkNmZylcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBkZXNjcmlwdG9yOiBkZXNjcmlwdG9yXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy51cGRhdGVQcmltZVRhYmxlRmlsdGVyKGZpbHRlckRhdGEpO1xuXG4gICAgICAgIC8vIHRoaXMga2VlcHMgdGhlIFVJIHVwZGF0ZWQgcHJvcGVybHkgYmVmb3JlIGNsb3NpbmcgdGhlIG92ZXJsYXlcbiAgICAgICAgdGhpcy5maWx0ZXJFZGl0LnNldChmaWx0ZXJEYXRhKTtcblxuICAgICAgICAvLyBSZXNldHRpbmcgdGhlIGZvcm0gaXMgZG9uZSBpbiB0aGUgb25PdmVybGF5SGlkZSBjYWxsYmFjayBiZWNhdXNlIHJlc2V0dGluZyB0aGVcbiAgICAgICAgLy8gdmFsdWVzIGhlcmUgcmVuZGVycyBlbXB0eSBpbnB1dHMgZm9yIGEgc3BsaXQgc2Vjb25kIGJlZm9yZSBjbG9zaW5nIHRoZSBvdmVybGF5XG4gICAgICAgIHRoaXMuZmlsdGVyT3ZlcmxheSgpLmhpZGUoKTtcbiAgICB9XG5cbiAgICBvbkZpbHRlclJlbW92ZShldmVudDogRmlsdGVyQWN0aXZlVGFnRXZlbnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQcmltZVRhYmxlRmlsdGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuZmlsdGVycygpW2V2ZW50LmZpbHRlci5kZXNjcmlwdG9yLnByb3BlcnR5XSxcbiAgICAgICAgICAgIG1hdGNoTW9kZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGlzcGxheU1hdGNoTW9kZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRmlsdGVyRWRpdChldmVudDogRmlsdGVyQWN0aXZlVGFnRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbkZpbHRlckFkZE9yRWRpdChldmVudC5maWx0ZXIsIGV2ZW50LmV2ZW50KTtcbiAgICB9XG5cbiAgICBvbkZpbHRlckFkZChldmVudDogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbkZpbHRlckFkZE9yRWRpdCh1bmRlZmluZWQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICBvblNlYXJjaENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFdvcmRMaW1pdE1heCA9IHRoaXMuc2VhcmNoV29yZExpbWl0TWF4Q21wKCk7XG4gICAgICAgIGlmIChzZWFyY2hXb3JkTGltaXRNYXggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmRDb3VudCA9IHZhbHVlLnNwbGl0KC9cXHMrLykuZmlsdGVyKHdvcmQgPT4gd29yZC5sZW5ndGggPiAwKS5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFdvcmRMaW1pdE1heEVycm9yLnNldCh3b3JkQ291bnQgPiBzZWFyY2hXb3JkTGltaXRNYXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hXb3JkTGltaXRNYXhFcnJvci5zZXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlYXJjaFdvcmRMaW1pdE1heEVycm9yKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWVTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TZWFyY2hDYXNlU2Vuc2l0aXZlQ2hhbmdlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoQ2FzZVNlbnNpdGl2ZVN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgb25PdmVybGF5SGlkZSgpIHtcbiAgICAgICAgLy8gcmVzZXR0aW5nIHRoZSBmb3JtIGlzIGRvbmUgaGVyZSBmb3IgYSBzbW9vdGhlciBhbmltYXRpb25cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyRm9ybUNvbXBvbmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckZvcm1Db21wb25lbnQoKT8ucmVzZXRGb3JtKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jbGlja2VkT25GaWx0ZXJFdmVudCkge1xuICAgICAgICAgICAgLy8gc2hvdyB0aGUgb3ZlcmxheSBhZ2FpbiBpZiB0aGUgdXNlciBjbGlja2VkIGFub3RoZXIgZmlsdGVyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckVkaXQuc2V0KHRoaXMuY2xpY2tlZE9uRmlsdGVyRXZlbnQ/LmZpbHRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJPdmVybGF5KCkuc2hvdyh0aGlzLmNsaWNrZWRPbkZpbHRlckV2ZW50Py5ldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja2VkT25GaWx0ZXJFdmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY2xlYW4gc3RhdGVcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRWRpdC5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25GaWx0ZXJBZGRPckVkaXQoZmlsdGVyPzogQ29tbW9uc0ZpbHRlck1ldGFkYXRhV2l0aERlc2NyaXB0b3IsIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgLy8gSWYgdXNlciBjbGlja3Mgb24gdGhlIHNhbWUgZmlsdGVyIG9yIGFkZCB0aGF0IGlzIGFscmVhZHkgb3BlbiwgY2xvc2UgdGhlIG92ZXJsYXlcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyT3ZlcmxheSgpLm92ZXJsYXlWaXNpYmxlICYmIHRoaXMuZmlsdGVyRWRpdCgpPy5kZXNjcmlwdG9yLnByb3BlcnR5ID09PSBmaWx0ZXI/LmRlc2NyaXB0b3IucHJvcGVydHkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyT3ZlcmxheSgpLmhpZGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlck92ZXJsYXkoKS5vdmVybGF5VmlzaWJsZSkge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgdXNlciBjbGlja3MgYW5vdGhlciBmaWx0ZXIsICdyZS1zaG93aW5nJyB0aGUgb3ZlcmxheSBpblxuICAgICAgICAgICAgLy8gdGhlIG5ldyBwb3NpdGlvbiBpcyBkb25lIGluIHRoZSBvbk92ZXJsYXlIaWRlIGNhbGxiYWNrXG4gICAgICAgICAgICB0aGlzLmNsaWNrZWRPbkZpbHRlckV2ZW50ID0ge2V2ZW50LCBmaWx0ZXJ9O1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJPdmVybGF5KCkuaGlkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJFZGl0LnNldChmaWx0ZXIpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJPdmVybGF5KCkuc2hvdyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEluaXRpYWxGaWx0ZXJzKGZpbHRlcnNJbml0OiBSZWNvcmQ8c3RyaW5nLCBDb21tb25zRmlsdGVyTWV0YWRhdGE+KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnNSZXN1bHQ6IHtbcDogc3RyaW5nXTogQ29tbW9uc0ZpbHRlck1ldGFkYXRhV2l0aERlc2NyaXB0b3J9ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBmaWx0ZXJzSW5pdCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVySW5pdCA9IGZpbHRlcnNJbml0W3Byb3BlcnR5XTtcblxuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuZGVzY3JpcHRvcnMoKS5maW5kKGZpbHRlckRlc2NyaXB0b3IgPT4gZmlsdGVyRGVzY3JpcHRvci5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpbHRlcnNSZXN1bHRbcHJvcGVydHldID0ge1xuICAgICAgICAgICAgICAgIC4uLmZpbHRlclNldE1ldGFkYXRhT25DaGFuZ2UoZmlsdGVySW5pdCwgZmlsdGVySW5pdC5tYXRjaE1vZGUsIGZpbHRlckluaXQudmFsdWUsIGRlc2NyaXB0b3IuZmlsdGVyVHlwZSwgZmlsdGVyR2V0RGF0ZUNvbmZpZyhkZXNjcmlwdG9yLCB0aGlzLnNlcmlhbGl6YXRpb25DZmcpKSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yOiBkZXNjcmlwdG9yXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcnNSZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQcmltZVRhYmxlRmlsdGVyKGZpbHRlcjogQ29tbW9uc0ZpbHRlck1ldGFkYXRhV2l0aERlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhpcy5wcmltZVRhYmxlLmZpbHRlcnNbZmlsdGVyLmRlc2NyaXB0b3IucHJvcGVydHldID0gey4uLmZpbHRlcn07XG4gICAgICAgIHRoaXMucHJpbWVUYWJsZS5fZmlsdGVyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQcmltZVRhYmxlR2xvYmFsRmlsdGVyKHNlYXJjaFF1ZXJ5OiBzdHJpbmcgfCBudWxsLCBjYXNlU2Vuc2l0aXZlID0gZmFsc2UpIHtcbiAgICAgICAgLy8gbWF0Y2ggbW9kZSBuZWVkcyB0byBiZSBzZXQgZm9yIGlubGluZSBzZWFyY2hcbiAgICAgICAgdGhpcy5wcmltZVRhYmxlLmZpbHRlcnNbJ2dsb2JhbCddID0gey4uLnt2YWx1ZTogc2VhcmNoUXVlcnksIG1hdGNoTW9kZTogJ2NvbnRhaW5zJywgY2FzZVNlbnNpdGl2ZTogY2FzZVNlbnNpdGl2ZX19O1xuICAgICAgICB0aGlzLnByaW1lVGFibGUuX2ZpbHRlcigpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWdyb3ctMVwiPlxuICAgIEBpZiAodGl0bGVUZW1wbGF0ZSgpKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0aXRsZVRlbXBsYXRlKClcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gICAgQGlmIChzaG93RmlsdGVyQnV0dG9uKCkpIHtcbiAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZmlsdGVyXCJcbiAgICAgICAgICAgIHJvdW5kZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzZXZlcml0eV09XCJhY3RpdmVGaWx0ZXJzKCkubGVuZ3RoID4gMCA/ICdwcmltYXJ5JyA6ICdzZWNvbmRhcnknXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25GaWx0ZXJBZGQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbc3R5bGVDbGFzc109XCInbXktMSBtci0yJyArICh0aXRsZVRlbXBsYXRlKCkgPyAnIG1sLTMnIDogJycpXCI+XG4gICAgICAgIDwvcC1idXR0b24+XG4gICAgfVxuICAgIEBpZiAoZW5hYmxlU2VhcmNoKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCIgW25nQ2xhc3NdPVwieydtbC0zJzogIXNob3dGaWx0ZXJCdXR0b24oKSAmJiB0aXRsZVRlbXBsYXRlKCl9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtaW5wdXQtaWNvbi1sZWZ0IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktc2VhcmNoXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWFyY2hWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJnbG9iYWxTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXQgdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyduZy1pbnZhbGlkJzogc2VhcmNoV29yZExpbWl0TWF4RXJyb3IoKX1cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5wbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnNlYXJjaC5pbnB1dCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ21uZ0ZpbHRlci5zZWFyY2guaW5wdXQnIHwgdHJhbnNsYXRlXCIgLz5cbiAgICAgICAgICAgICAgICBAaWYgKGVuYWJsZUNhc2VTZW5zaXRpdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1idXR0b24taW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRvZ2dsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJtbC0xIHAtMSBwLWJ1dHRvbi1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoQ2FzZVNlbnNpdGl2ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaENhc2VTZW5zaXRpdmVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25MYWJlbD1cIkFhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZMYWJlbD1cIkFhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIEBpZiAoc2VhcmNoV29yZExpbWl0TWF4RXJyb3IoKSkge1xuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInAtZXJyb3IgYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21uZ0ZpbHRlci5zZWFyY2gubWF4V29yZHNFeGNlZWRlZE1lc3NhZ2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9kaXY+XG5AaWYgKGFjdGl2ZUZpbHRlcnMoKS5sZW5ndGggPiAwKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBtdC0yXCI+XG4gICAgICAgIEBmb3IgKGZpbHRlciBvZiBhY3RpdmVGaWx0ZXJzKCk7IHRyYWNrIGZpbHRlci5kZXNjcmlwdG9yLnByb3BlcnR5KSB7XG4gICAgICAgICAgICA8bW5nLWZpbHRlci1hY3RpdmUtdGFnIFttb2RlbF09XCJtb2RlbCgpXCIgW2ZpbHRlcl09XCJmaWx0ZXJcIiAoZWRpdCk9XCJvbkZpbHRlckVkaXQoJGV2ZW50KVwiIChyZW1vdmUpPVwib25GaWx0ZXJSZW1vdmUoJGV2ZW50KVwiIC8+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbn1cbjxwLW92ZXJsYXlQYW5lbCAjb3AgW3Nob3dDbG9zZUljb25dPVwidHJ1ZVwiIChvbkhpZGUpPVwib25PdmVybGF5SGlkZSgpXCIgYXBwZW5kVG89XCJib2R5XCI+XG4gICAgPG1uZy1maWx0ZXItZm9ybVxuICAgICAgICBbbW9kZWxdPVwibW9kZWwoKVwiXG4gICAgICAgIFtkZXNjcmlwdG9yc109XCJkZXNjcmlwdG9ycygpXCJcbiAgICAgICAgW2ZpbHRlcl09XCJmaWx0ZXJFZGl0KClcIlxuICAgICAgICBbZGlzYWJsZWRQcm9wZXJ0aWVzXT1cImFjdGl2ZUZpbHRlclByb3BlcnRpZXMoKVwiXG4gICAgICAgIFtvdmVybGF5XT1cIm9wXCJcbiAgICAgICAgKGFwcGx5KT1cIm9uRmlsdGVyRm9ybUFwcGx5KCRldmVudClcIiAvPlxuPC9wLW92ZXJsYXlQYW5lbD5cbiJdfQ==