@seniorsistemas/data-seniorx-core 3.0.0 → 3.1.0
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/constants/editable-overlay.const.d.ts +4 -0
- package/core/constants/help-popover.const.d.ts +7 -0
- package/core/constants/input-mask.const.d.ts +5 -0
- package/core/constants/navigation-button.const.d.ts +3 -0
- package/core/constants/object-card.const.d.ts +21 -0
- package/core/constants/thumbnail.const.d.ts +6 -0
- package/core/constants/thumbnails.const.d.ts +4 -0
- package/core/constants/token-list.const.d.ts +3 -0
- package/core/types/button.type.d.ts +1 -1
- package/core/types/datepicker.type.d.ts +28 -0
- package/core/types/dynamic-form.type.d.ts +29 -0
- package/core/types/editable-overlay.type.d.ts +15 -0
- package/core/types/help-popover.type.d.ts +2 -0
- package/core/types/input-mask.type.d.ts +6 -0
- package/core/types/lookup.type.d.ts +45 -0
- package/core/types/navigation-button.type.d.ts +9 -0
- package/core/types/row-card.type.d.ts +5 -0
- package/core/types/semantics.type.d.ts +1 -1
- package/core/types/table-options.type.d.ts +1 -0
- package/core/types/thumbnail.type.d.ts +1 -0
- package/core/types/thumbnails.type.d.ts +20 -0
- package/core/types/token-list.type.d.ts +6 -0
- package/core/utils/emoji-support.util.d.ts +12 -0
- package/core/utils/overlay-dismiss.util.d.ts +25 -0
- package/esm2022/core/config/row-card.type.config.mjs +3 -1
- package/esm2022/core/constants/country-phone-picker.const.mjs +6 -6
- package/esm2022/core/constants/editable-overlay.const.mjs +5 -0
- package/esm2022/core/constants/help-popover.const.mjs +7 -0
- package/esm2022/core/constants/input-mask.const.mjs +6 -0
- package/esm2022/core/constants/navigation-button.const.mjs +4 -0
- package/esm2022/core/constants/object-card.const.mjs +23 -0
- package/esm2022/core/constants/thumbnail.const.mjs +14 -0
- package/esm2022/core/constants/thumbnails.const.mjs +5 -0
- package/esm2022/core/constants/token-list.const.mjs +4 -0
- package/esm2022/core/types/button.type.mjs +1 -1
- package/esm2022/core/types/datepicker.type.mjs +2 -0
- package/esm2022/core/types/dynamic-form.type.mjs +2 -0
- package/esm2022/core/types/editable-overlay.type.mjs +2 -0
- package/esm2022/core/types/help-popover.type.mjs +2 -0
- package/esm2022/core/types/input-mask.type.mjs +2 -0
- package/esm2022/core/types/lookup.type.mjs +2 -0
- package/esm2022/core/types/navigation-button.type.mjs +2 -0
- package/esm2022/core/types/row-card.type.mjs +1 -1
- package/esm2022/core/types/semantics.type.mjs +1 -1
- package/esm2022/core/types/table-options.type.mjs +1 -1
- package/esm2022/core/types/thumbnail.type.mjs +2 -0
- package/esm2022/core/types/thumbnails.type.mjs +2 -0
- package/esm2022/core/types/token-list.type.mjs +2 -0
- package/esm2022/core/utils/emoji-support.util.mjs +48 -0
- package/esm2022/core/utils/mask.util.mjs +2 -2
- package/esm2022/core/utils/overlay-dismiss.util.mjs +38 -0
- package/esm2022/features/alert/alert.component.mjs +5 -2
- package/esm2022/features/autocomplete/autocomplete.component.mjs +30 -8
- package/esm2022/features/bignumber-input/bignumber-input.component.mjs +1 -1
- package/esm2022/features/button/button.component.mjs +13 -5
- package/esm2022/features/card-list/card/card.component.mjs +2 -2
- package/esm2022/features/card-list/card-list.component.mjs +2 -2
- package/esm2022/features/checkbox-list/checkbox-list.component.mjs +25 -5
- package/esm2022/features/chips/chips.component.mjs +3 -3
- package/esm2022/features/code-editor/code-editor.component.mjs +12 -3
- package/esm2022/features/combobox/combobox.component.mjs +3 -3
- package/esm2022/features/confirm/confirm.component.mjs +2 -2
- package/esm2022/features/context-selector/context-selector.component.mjs +1 -1
- package/esm2022/features/country-phone-picker/country-phone-picker.component.mjs +22 -18
- package/esm2022/features/currency/currency.component.mjs +3 -3
- package/esm2022/features/datepicker/datepicker.component.mjs +814 -0
- package/esm2022/features/dynamic-form/dynamic-form-field.directive.mjs +178 -0
- package/esm2022/features/dynamic-form/dynamic-form.component.mjs +60 -0
- package/esm2022/features/dynamic-form/dynamic-form.registry.mjs +13 -0
- package/esm2022/features/editable-overlay/editable-overlay-editor.directive.mjs +31 -0
- package/esm2022/features/editable-overlay/editable-overlay.component.mjs +217 -0
- package/esm2022/features/editor/editor.component.mjs +173 -0
- package/esm2022/features/empty-state/empty-state.component.mjs +3 -3
- package/esm2022/features/fileupload/fileupload.component.mjs +3 -3
- package/esm2022/features/help-popover/help-popover.component.mjs +204 -0
- package/esm2022/features/hyperlink/hyperlink.component.mjs +3 -3
- package/esm2022/features/icon-picker/icon-picker.component.mjs +4 -4
- package/esm2022/features/image-cropper/image-cropper.component.mjs +2 -2
- package/esm2022/features/info-sign/info-sign.component.mjs +6 -3
- package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
- package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +2 -2
- package/esm2022/features/input-mask/input-mask.directive.mjs +510 -0
- package/esm2022/features/list/list.component.mjs +2 -2
- package/esm2022/features/localized-number-input/localized-number-input.component.mjs +3 -3
- package/esm2022/features/lookup/lookup.component.mjs +351 -0
- package/esm2022/features/modal/modal.component.mjs +6 -3
- package/esm2022/features/modalc/modalc.component.mjs +6 -3
- package/esm2022/features/navigation-button/navigation-button.component.mjs +172 -0
- package/esm2022/features/number-input/number-input.component.mjs +10 -4
- package/esm2022/features/object-card/components/object-card-field/object-card-field.component.mjs +89 -0
- package/esm2022/features/object-card/components/object-card-main/object-card-main.component.mjs +114 -0
- package/esm2022/features/object-card/object-card.component.mjs +199 -0
- package/esm2022/features/password-strength/password-strength.component.mjs +3 -3
- package/esm2022/features/pin-code-field/pin-code-field.component.mjs +14 -4
- package/esm2022/features/popover/popover.component.mjs +29 -3
- package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +13 -4
- package/esm2022/features/rating-scale/rating-scale.component.mjs +24 -4
- package/esm2022/features/row-card-list/row-card/row-card.component.mjs +19 -4
- package/esm2022/features/row-card-list/row-card-list.component.mjs +12 -3
- package/esm2022/features/scaffold/scaffold.component.mjs +3 -3
- package/esm2022/features/searchbox/searchbox.component.mjs +2 -2
- package/esm2022/features/select-button/select-button.component.mjs +26 -4
- package/esm2022/features/slider/slider.component.mjs +3 -3
- package/esm2022/features/split-button/split-button.component.mjs +1 -1
- package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +15 -18
- package/esm2022/features/spotlight/spotlight.component.mjs +2 -2
- package/esm2022/features/star-rating/star-rating.component.mjs +25 -4
- package/esm2022/features/table/components/table-cell-content.component.mjs +2 -2
- package/esm2022/features/table/table.component.mjs +30 -9
- package/esm2022/features/textarea/textarea.component.mjs +3 -3
- package/esm2022/features/thumbnail/thumbnail.component.mjs +86 -0
- package/esm2022/features/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +59 -0
- package/esm2022/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.mjs +25 -0
- package/esm2022/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.mjs +50 -0
- package/esm2022/features/thumbnails/thumbnails.component.mjs +76 -0
- package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +13 -1
- package/esm2022/features/token-list/token-list.component.mjs +64 -0
- package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +2 -2
- package/esm2022/locales/en.json +409 -1
- package/esm2022/locales/es-CO.json +423 -2
- package/esm2022/locales/pt.json +1037 -630
- package/esm2022/providers/features.provider.mjs +20 -2
- package/esm2022/providers/primeng-config.provider.mjs +14 -128
- package/esm2022/providers/translate.provider.mjs +2 -2
- package/esm2022/public-api.mjs +31 -1
- package/features/alert/alert.component.d.ts +1 -0
- package/features/autocomplete/autocomplete.component.d.ts +9 -3
- package/features/button/button.component.d.ts +3 -1
- package/features/checkbox-list/checkbox-list.component.d.ts +8 -1
- package/features/code-editor/code-editor.component.d.ts +5 -1
- package/features/country-phone-picker/country-phone-picker.component.d.ts +3 -0
- package/features/datepicker/datepicker.component.d.ts +118 -0
- package/features/dynamic-form/dynamic-form-field.directive.d.ts +26 -0
- package/features/dynamic-form/dynamic-form.component.d.ts +15 -0
- package/features/dynamic-form/dynamic-form.registry.d.ts +11 -0
- package/features/editable-overlay/editable-overlay-editor.directive.d.ts +22 -0
- package/features/editable-overlay/editable-overlay.component.d.ts +60 -0
- package/features/editor/editor.component.d.ts +47 -0
- package/features/help-popover/help-popover.component.d.ts +81 -0
- package/features/info-sign/info-sign.component.d.ts +2 -1
- package/features/input-mask/input-mask.directive.d.ts +117 -0
- package/features/lookup/lookup.component.d.ts +104 -0
- package/features/modal/modal.component.d.ts +2 -1
- package/features/modalc/modalc.component.d.ts +2 -1
- package/features/navigation-button/navigation-button.component.d.ts +58 -0
- package/features/number-input/number-input.component.d.ts +3 -1
- package/features/object-card/components/object-card-field/object-card-field.component.d.ts +48 -0
- package/features/object-card/components/object-card-main/object-card-main.component.d.ts +57 -0
- package/features/object-card/object-card.component.d.ts +70 -0
- package/features/pin-code-field/pin-code-field.component.d.ts +6 -1
- package/features/popover/popover.component.d.ts +4 -1
- package/features/profile-picture-picker/profile-picture-picker.component.d.ts +5 -1
- package/features/rating-scale/rating-scale.component.d.ts +9 -1
- package/features/row-card-list/row-card/row-card.component.d.ts +6 -1
- package/features/row-card-list/row-card-list.component.d.ts +4 -1
- package/features/select-button/select-button.component.d.ts +9 -1
- package/features/star-rating/star-rating.component.d.ts +9 -1
- package/features/table/table.component.d.ts +2 -1
- package/features/thumbnail/thumbnail.component.d.ts +48 -0
- package/features/thumbnails/components/thumbnail-item/thumbnail-item.component.d.ts +29 -0
- package/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.d.ts +13 -0
- package/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.d.ts +19 -0
- package/features/thumbnails/thumbnails.component.d.ts +46 -0
- package/features/tiered-menu/directives/tiered-menu.directive.d.ts +2 -0
- package/features/token-list/token-list.component.d.ts +31 -0
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs +11288 -6613
- package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
- package/package.json +12 -3
- package/providers/primeng-config.provider.d.ts +12 -0
- package/public-api.d.ts +38 -0
- package/src/locales/en.json +409 -1
- package/src/locales/es-CO.json +423 -2
- package/src/locales/pt.json +1037 -630
- package/styles/sdc-global-variables.scss +38 -0
- package/styles.css +132 -0
- package/styles.scss +2 -0
- package/esm2022/providers/custom/button.mjs +0 -93
- package/esm2022/providers/custom/toast.mjs +0 -75
- package/providers/custom/button.d.ts +0 -16
- package/providers/custom/toast.d.ts +0 -14
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, computed, EventEmitter, forwardRef, inject, Input, Output, signal, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
3
|
+
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import { CdkConnectedOverlay, CdkOverlayOrigin, Overlay } from '@angular/cdk/overlay';
|
|
5
|
+
import { Router } from '@angular/router';
|
|
6
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
7
|
+
import { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';
|
|
8
|
+
import { InputsComponent } from '../../core/directives/inputs.directive';
|
|
9
|
+
import { watchOverlayDismiss } from '../../core/utils/overlay-dismiss.util';
|
|
10
|
+
import { ModalComponent } from '../modal/modal.component';
|
|
11
|
+
import { TableComponent } from '../table/table.component';
|
|
12
|
+
import { SearchboxComponent } from '../searchbox/searchbox.component';
|
|
13
|
+
import { PaginatorComponent } from '../paginator/paginator.component';
|
|
14
|
+
import { ButtonComponent } from '../button/button.component';
|
|
15
|
+
import { TextboxComponent } from '../textbox/textbox.component';
|
|
16
|
+
import { ComboboxComponent } from '../combobox/combobox.component';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
import * as i1 from "@angular/common";
|
|
19
|
+
import * as i2 from "@angular/forms";
|
|
20
|
+
import * as i3 from "@ngx-translate/core";
|
|
21
|
+
const DEFAULT_PAGE_SIZE = 10;
|
|
22
|
+
const LOOKUP_DEBOUNCE_MS = 300;
|
|
23
|
+
export class LookupComponent extends InputsComponent {
|
|
24
|
+
static nextId = 0;
|
|
25
|
+
static allocateComponentId() {
|
|
26
|
+
const id = LookupComponent.nextId;
|
|
27
|
+
LookupComponent.nextId += 1;
|
|
28
|
+
return `sdc-lookup-${id}`;
|
|
29
|
+
}
|
|
30
|
+
overlay = inject(Overlay);
|
|
31
|
+
router = inject(Router, { optional: true });
|
|
32
|
+
destroy$ = new Subject();
|
|
33
|
+
inputSubject = new Subject();
|
|
34
|
+
dismissWatcher = null;
|
|
35
|
+
/** CDK overlay config */
|
|
36
|
+
scrollStrategy = this.overlay.scrollStrategies.reposition();
|
|
37
|
+
overlayPositions = [
|
|
38
|
+
{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },
|
|
39
|
+
{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }
|
|
40
|
+
];
|
|
41
|
+
containerDiv;
|
|
42
|
+
// --- Inputs ---
|
|
43
|
+
config;
|
|
44
|
+
suggestions = [];
|
|
45
|
+
dialogData = { items: [], totalRecords: 0 };
|
|
46
|
+
dialogLoading = false;
|
|
47
|
+
// --- Outputs ---
|
|
48
|
+
onLookupRequest = new EventEmitter();
|
|
49
|
+
onDialogSearch = new EventEmitter();
|
|
50
|
+
onDialogOpen = new EventEmitter();
|
|
51
|
+
valueSelected = new EventEmitter();
|
|
52
|
+
// --- Internal state ---
|
|
53
|
+
componentId = LookupComponent.allocateComponentId();
|
|
54
|
+
inputValue = signal('');
|
|
55
|
+
panelOpen = signal(false);
|
|
56
|
+
dialogVisible = signal(false);
|
|
57
|
+
dialogQuery = signal('');
|
|
58
|
+
dialogPage = signal(0);
|
|
59
|
+
filtersExpanded = signal(false);
|
|
60
|
+
filterValues = signal({});
|
|
61
|
+
dialogSelection = signal([]);
|
|
62
|
+
pageSize = computed(() => this.config?.pageSize ?? DEFAULT_PAGE_SIZE);
|
|
63
|
+
isMultiple = computed(() => this.config?.multiple === true);
|
|
64
|
+
hasFilters = computed(() => (this.config?.filters?.length ?? 0) > 0);
|
|
65
|
+
dialogTableConfig = computed(() => ({
|
|
66
|
+
search: { show: false },
|
|
67
|
+
// 'api' mode: dialogData.items is a single externally-fetched page (via onDialogSearch),
|
|
68
|
+
// not the full dataset. This also tells sdc-table to preserve multi-select across page
|
|
69
|
+
// changes instead of dropping rows that aren't on the currently displayed page.
|
|
70
|
+
table: { totalRecordsLabel: '', responsive: false, mode: 'api' },
|
|
71
|
+
pagination: { show: false },
|
|
72
|
+
empty: { show: true, title: 'Nenhum resultado', text: 'Tente ajustar a busca.' },
|
|
73
|
+
cells: {
|
|
74
|
+
checkbox: { selectAll: true }
|
|
75
|
+
}
|
|
76
|
+
}));
|
|
77
|
+
tableColumns = computed(() => {
|
|
78
|
+
if (!this.config?.gridFields) {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
const fieldColumns = this.config.gridFields.map((field) => ({
|
|
82
|
+
field: field.name,
|
|
83
|
+
header: field.label,
|
|
84
|
+
type: this.mapFieldType(field.type),
|
|
85
|
+
width: field.width
|
|
86
|
+
}));
|
|
87
|
+
if (!this.isMultiple()) {
|
|
88
|
+
return fieldColumns;
|
|
89
|
+
}
|
|
90
|
+
const checkboxColumn = {
|
|
91
|
+
field: this.config.dataKey,
|
|
92
|
+
header: 'platform.datacore.lookup.select_column',
|
|
93
|
+
type: 'checkbox-selection',
|
|
94
|
+
sortable: false,
|
|
95
|
+
align: 'center'
|
|
96
|
+
};
|
|
97
|
+
return [checkboxColumn, ...fieldColumns];
|
|
98
|
+
});
|
|
99
|
+
dialogFirst = computed(() => this.dialogPage() * this.pageSize());
|
|
100
|
+
hasDialogSelection = computed(() => this.dialogSelection().length > 0);
|
|
101
|
+
dialogModalFooterButtons = computed(() => {
|
|
102
|
+
if (!this.isMultiple()) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
return [
|
|
106
|
+
{
|
|
107
|
+
id: `${this.componentId}-confirm-selection`,
|
|
108
|
+
label: 'platform.datacore.lookup.confirm_selection',
|
|
109
|
+
severity: 'primary',
|
|
110
|
+
disabled: !this.hasDialogSelection(),
|
|
111
|
+
action: () => this.confirmMultipleSelection()
|
|
112
|
+
}
|
|
113
|
+
];
|
|
114
|
+
});
|
|
115
|
+
constructor() {
|
|
116
|
+
super();
|
|
117
|
+
this.inputSubject.pipe(debounceTime(LOOKUP_DEBOUNCE_MS), distinctUntilChanged(), takeUntil(this.destroy$)).subscribe((query) => {
|
|
118
|
+
this.onLookupRequest.emit(query);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
ngAfterViewInit() {
|
|
122
|
+
this.dismissWatcher = watchOverlayDismiss({
|
|
123
|
+
getTriggerElement: () => this.containerDiv?.nativeElement ?? null,
|
|
124
|
+
isOpen: () => this.panelOpen(),
|
|
125
|
+
onDismiss: () => this.closePanel(),
|
|
126
|
+
router: this.router
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
ngOnDestroy() {
|
|
130
|
+
this.destroy$.next();
|
|
131
|
+
this.destroy$.complete();
|
|
132
|
+
this.dismissWatcher?.destroy();
|
|
133
|
+
}
|
|
134
|
+
// --- Value accessor overrides ---
|
|
135
|
+
writeValue(value) {
|
|
136
|
+
this.value = value;
|
|
137
|
+
this.updateInputDisplay();
|
|
138
|
+
}
|
|
139
|
+
// --- Filters ---
|
|
140
|
+
toggleFilters() {
|
|
141
|
+
this.filtersExpanded.set(!this.filtersExpanded());
|
|
142
|
+
}
|
|
143
|
+
onFilterValueChange(name, value) {
|
|
144
|
+
this.filterValues.set({ ...this.filterValues(), [name]: value ?? '' });
|
|
145
|
+
}
|
|
146
|
+
filterValueFor(name) {
|
|
147
|
+
return this.filterValues()[name] ?? '';
|
|
148
|
+
}
|
|
149
|
+
mapFilterOptions(options) {
|
|
150
|
+
return (options ?? []).map((option) => ({ value: option.value, text: option.label }));
|
|
151
|
+
}
|
|
152
|
+
applyFilters() {
|
|
153
|
+
this.dialogPage.set(0);
|
|
154
|
+
this.emitDialogSearch();
|
|
155
|
+
}
|
|
156
|
+
clearFilters() {
|
|
157
|
+
this.filterValues.set({});
|
|
158
|
+
this.dialogPage.set(0);
|
|
159
|
+
this.emitDialogSearch();
|
|
160
|
+
}
|
|
161
|
+
// --- Autocomplete input ---
|
|
162
|
+
onInputChange(event) {
|
|
163
|
+
const target = event.target;
|
|
164
|
+
const query = target?.value ?? '';
|
|
165
|
+
this.inputValue.set(query);
|
|
166
|
+
this.inputSubject.next(query);
|
|
167
|
+
if (query.length > 0) {
|
|
168
|
+
this.panelOpen.set(true);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
this.panelOpen.set(false);
|
|
172
|
+
this.commitValue(null);
|
|
173
|
+
this.valueSelected.emit(null);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
onInputFocus() {
|
|
177
|
+
if (this.suggestions.length > 0 && this.inputValue().length > 0) {
|
|
178
|
+
this.panelOpen.set(true);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
closePanel() {
|
|
182
|
+
this.panelOpen.set(false);
|
|
183
|
+
}
|
|
184
|
+
selectSuggestion(item) {
|
|
185
|
+
this.selectItem(item);
|
|
186
|
+
this.panelOpen.set(false);
|
|
187
|
+
}
|
|
188
|
+
getDisplayValue(item) {
|
|
189
|
+
if (!item || !this.config) {
|
|
190
|
+
return '';
|
|
191
|
+
}
|
|
192
|
+
const record = item;
|
|
193
|
+
return String(record[this.config.displayField] ?? '');
|
|
194
|
+
}
|
|
195
|
+
// --- Dialog ---
|
|
196
|
+
openDialog() {
|
|
197
|
+
this.dialogVisible.set(true);
|
|
198
|
+
this.dialogQuery.set('');
|
|
199
|
+
this.dialogPage.set(0);
|
|
200
|
+
this.filtersExpanded.set(false);
|
|
201
|
+
this.dialogSelection.set(this.isMultiple() && Array.isArray(this.value) ? [...this.value] : []);
|
|
202
|
+
this.onDialogOpen.emit();
|
|
203
|
+
this.emitDialogSearch();
|
|
204
|
+
}
|
|
205
|
+
onDialogVisibleChange(visible) {
|
|
206
|
+
this.dialogVisible.set(visible);
|
|
207
|
+
}
|
|
208
|
+
onDialogSearchEvent(query) {
|
|
209
|
+
this.dialogQuery.set(query);
|
|
210
|
+
this.dialogPage.set(0);
|
|
211
|
+
this.emitDialogSearch();
|
|
212
|
+
}
|
|
213
|
+
onDialogPageChange(event) {
|
|
214
|
+
this.dialogPage.set(event.page);
|
|
215
|
+
this.emitDialogSearch();
|
|
216
|
+
}
|
|
217
|
+
onDialogRowClick(row) {
|
|
218
|
+
if (this.isMultiple()) {
|
|
219
|
+
// In multiple mode, a row click toggles the checkbox instead of committing
|
|
220
|
+
// immediately, so the user can pick several rows before confirming.
|
|
221
|
+
this.toggleDialogRowSelection(row);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
this.selectItem(row);
|
|
225
|
+
this.dialogVisible.set(false);
|
|
226
|
+
}
|
|
227
|
+
onDialogSelectionChange(selection) {
|
|
228
|
+
this.dialogSelection.set(selection);
|
|
229
|
+
}
|
|
230
|
+
confirmMultipleSelection() {
|
|
231
|
+
const selection = this.dialogSelection();
|
|
232
|
+
if (selection.length === 0) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
this.value = selection;
|
|
236
|
+
this.onChange(selection);
|
|
237
|
+
this.valueChange.emit(selection);
|
|
238
|
+
this.valueSelected.emit(selection);
|
|
239
|
+
this.updateInputDisplay();
|
|
240
|
+
this.dialogVisible.set(false);
|
|
241
|
+
}
|
|
242
|
+
// --- Helpers ---
|
|
243
|
+
selectItem(item) {
|
|
244
|
+
const record = item;
|
|
245
|
+
const storedValue = record[this.config.dataKey] ?? item;
|
|
246
|
+
this.value = item;
|
|
247
|
+
this.onChange(storedValue);
|
|
248
|
+
this.valueChange.emit(storedValue);
|
|
249
|
+
this.updateInputDisplay();
|
|
250
|
+
this.valueSelected.emit(item);
|
|
251
|
+
}
|
|
252
|
+
toggleDialogRowSelection(row) {
|
|
253
|
+
const current = this.dialogSelection();
|
|
254
|
+
const key = this.dataKeyOf(row);
|
|
255
|
+
const index = current.findIndex((item) => this.dataKeyOf(item) === key);
|
|
256
|
+
if (index >= 0) {
|
|
257
|
+
this.dialogSelection.set([...current.slice(0, index), ...current.slice(index + 1)]);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
this.dialogSelection.set([...current, row]);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
dataKeyOf(item) {
|
|
264
|
+
const record = item;
|
|
265
|
+
return record?.[this.config?.dataKey];
|
|
266
|
+
}
|
|
267
|
+
updateInputDisplay() {
|
|
268
|
+
if (this.isMultiple() && Array.isArray(this.value)) {
|
|
269
|
+
this.inputValue.set(this.value.length > 0
|
|
270
|
+
? this.value.map((item) => this.getDisplayValue(item)).join(', ')
|
|
271
|
+
: '');
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (this.value) {
|
|
275
|
+
this.inputValue.set(this.getDisplayValue(this.value));
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
this.inputValue.set('');
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
emitDialogSearch() {
|
|
282
|
+
const request = {
|
|
283
|
+
query: this.dialogQuery(),
|
|
284
|
+
pageSize: this.pageSize(),
|
|
285
|
+
page: this.dialogPage()
|
|
286
|
+
};
|
|
287
|
+
if (this.hasFilters()) {
|
|
288
|
+
request.filters = this.filterValues();
|
|
289
|
+
}
|
|
290
|
+
this.onDialogSearch.emit(request);
|
|
291
|
+
}
|
|
292
|
+
mapFieldType(type) {
|
|
293
|
+
switch (type) {
|
|
294
|
+
case 'number': return 'numeric';
|
|
295
|
+
case 'date': return 'date';
|
|
296
|
+
default: return undefined;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LookupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
300
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LookupComponent, isStandalone: true, selector: "sdc-lookup", inputs: { config: "config", suggestions: "suggestions", dialogData: "dialogData", dialogLoading: "dialogLoading" }, outputs: { onLookupRequest: "onLookupRequest", onDialogSearch: "onDialogSearch", onDialogOpen: "onDialogOpen", valueSelected: "valueSelected" }, providers: [
|
|
301
|
+
{
|
|
302
|
+
provide: NG_VALUE_ACCESSOR,
|
|
303
|
+
useExisting: forwardRef(() => LookupComponent),
|
|
304
|
+
multi: true
|
|
305
|
+
}
|
|
306
|
+
], viewQueries: [{ propertyName: "containerDiv", first: true, predicate: ["containerDiv"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"sdc-lookup\" [ngStyle]=\"getInputStyle()\">\n @if (labelKey()) {\n <label class=\"sdc-lookup__label\" [for]=\"componentId\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"sdc-lookup__required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n\n <div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"sdc-lookup__control\"\n [class.sdc-lookup__control--invalid]=\"invalid\"\n [class.sdc-lookup__control--disabled]=\"disabled\"\n >\n <input\n [id]=\"componentId\"\n class=\"sdc-lookup__input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen() ? 'true' : 'false'\"\n aria-controls=\"sdc-lookup-listbox\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-label]=\"placeholder || (config?.placeholder ?? '') | translate\"\n [placeholder]=\"(config?.placeholder ?? placeholder) | translate\"\n [disabled]=\"disabled\"\n [value]=\"inputValue()\"\n (input)=\"onInputChange($event)\"\n (focus)=\"onInputFocus()\"\n />\n\n <button\n type=\"button\"\n class=\"sdc-lookup__search-button\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'platform.datacore.lookup.open_dialog' | translate\"\n (click)=\"openDialog()\"\n >\n <i class=\"fas fa-search\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Autocomplete dropdown -->\n @if (suggestions.length > 0) {\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"closePanel()\"\n (detach)=\"closePanel()\"\n >\n <!-- NOSONAR: custom autocomplete popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-lookup__panel\"\n [id]=\"componentId + '-listbox'\"\n [attr.role]=\"'listbox'\"\n [style.width.px]=\"containerDiv?.offsetWidth ?? null\"\n >\n <ul class=\"sdc-lookup__list\">\n @for (item of suggestions; track item; let i = $index) {\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <li\n class=\"sdc-lookup__option\"\n [attr.role]=\"'option'\"\n tabindex=\"-1\"\n [id]=\"componentId + '-option-' + i\"\n [attr.aria-selected]=\"'false'\"\n (click)=\"selectSuggestion(item)\"\n (keydown.enter)=\"selectSuggestion(item)\"\n >\n {{ getDisplayValue(item) }}\n </li>\n }\n </ul>\n </div>\n </ng-template>\n }\n\n @if (messageKey()) {\n <small\n class=\"sdc-lookup__message\"\n [class.sdc-lookup__message--invalid]=\"invalid\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n\n<!-- Search Dialog -->\n<sdc-modal\n [visible]=\"dialogVisible()\"\n (visibleChange)=\"onDialogVisibleChange($event)\"\n [header]=\"config?.dialogTitle ?? 'platform.datacore.lookup.dialog_title'\"\n [footerButtons]=\"dialogModalFooterButtons()\"\n [width]=\"800\"\n>\n <div class=\"sdc-lookup__dialog\">\n @if (config?.showSearch !== false) {\n <div class=\"sdc-lookup__dialog-search\">\n <sdc-searchbox\n [placeholder]=\"'platform.datacore.lookup.search_placeholder'\"\n (onSearch)=\"onDialogSearchEvent($event)\"\n ></sdc-searchbox>\n </div>\n }\n\n @if (hasFilters()) {\n <div class=\"sdc-lookup__dialog-filters\">\n <button\n type=\"button\"\n class=\"sdc-lookup__filters-toggle\"\n [attr.aria-expanded]=\"filtersExpanded()\"\n [attr.aria-controls]=\"componentId + '-filters-panel'\"\n (click)=\"toggleFilters()\"\n >\n <i class=\"fas fa-filter\" aria-hidden=\"true\"></i>\n {{ 'platform.datacore.lookup.filters' | translate }}\n <i\n class=\"fas fa-chevron-down sdc-lookup__filters-toggle-caret\"\n [class.sdc-lookup__filters-toggle-caret--open]=\"filtersExpanded()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n @if (filtersExpanded()) {\n <div class=\"sdc-lookup__filters-panel\" [id]=\"componentId + '-filters-panel'\">\n <div class=\"sdc-lookup__filters-grid\">\n @for (filter of config.filters; track filter.name) {\n <div class=\"sdc-lookup__filters-field\">\n @if (filter.type === 'select') {\n <sdc-combobox\n [label]=\"filter.label\"\n [placeholder]=\"filter.placeholder ?? ''\"\n [options]=\"mapFilterOptions(filter.options)\"\n [ngModel]=\"filterValueFor(filter.name)\"\n (ngModelChange)=\"onFilterValueChange(filter.name, $event)\"\n width=\"100%\"\n ></sdc-combobox>\n } @else {\n <sdc-textbox\n [label]=\"filter.label\"\n [placeholder]=\"filter.placeholder ?? ''\"\n [ngModel]=\"filterValueFor(filter.name)\"\n (ngModelChange)=\"onFilterValueChange(filter.name, $event)\"\n width=\"100%\"\n ></sdc-textbox>\n }\n </div>\n }\n </div>\n\n <div class=\"sdc-lookup__filters-actions\">\n <button\n type=\"button\"\n class=\"sdc-lookup__filters-action sdc-lookup__filters-action--secondary\"\n (click)=\"clearFilters()\"\n >\n {{ 'platform.datacore.lookup.clear_filters' | translate }}\n </button>\n <button\n type=\"button\"\n class=\"sdc-lookup__filters-action sdc-lookup__filters-action--primary\"\n (click)=\"applyFilters()\"\n >\n {{ 'platform.datacore.lookup.apply_filters' | translate }}\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-lookup__dialog-table\">\n <sdc-table\n [cols]=\"tableColumns()\"\n [data]=\"dialogData.items\"\n [loading]=\"dialogLoading\"\n [config]=\"dialogTableConfig()\"\n (rowClick)=\"onDialogRowClick($event)\"\n (selectionChange)=\"onDialogSelectionChange($event)\"\n ></sdc-table>\n </div>\n\n <div class=\"sdc-lookup__dialog-paginator\">\n <sdc-paginator\n [first]=\"dialogFirst()\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"dialogData.totalRecords\"\n (pageChange)=\"onDialogPageChange($event)\"\n ></sdc-paginator>\n </div>\n </div>\n</sdc-modal>\n", styles: [":host{display:block}.sdc-lookup__label{display:inline-flex;align-items:center;margin-bottom:var(--sdc-form-label-row-mb);line-height:1;padding-top:var(--sdc-form-label-py, 0);padding-bottom:var(--sdc-form-label-py, 0)}.sdc-lookup__required{margin-left:var(--sdc-form-required-ml, .25rem);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-lookup__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height, 2.5rem);border:1px solid var(--sdc-formfield-default-border, #d1d5db);border-radius:var(--sdc-formfield-border-radius, .375rem);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-lookup__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-lookup__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-lookup__control--invalid,.sdc-lookup__control--invalid:hover,.sdc-lookup__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-lookup__control--disabled,.sdc-lookup__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg, #f3f4f6);border-color:var(--sdc-formfield-default-border, #d1d5db);box-shadow:none;cursor:not-allowed}.sdc-lookup__input{flex:1 1 auto;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height, 1.5);padding:0 .75rem}.sdc-lookup__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-lookup__input:disabled{cursor:not-allowed}.sdc-lookup__search-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;border-left:1px solid var(--sdc-formfield-default-border, #d1d5db);background:transparent;color:var(--sdc-button-icon-default, #6b7280);cursor:pointer;transition:background-color .16s ease}.sdc-lookup__search-button:disabled{cursor:not-allowed;opacity:.6}.sdc-lookup__search-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px}.sdc-lookup__search-button:hover:not(:disabled){background:var(--sdc-lookup-button-hover-bg, rgba(0, 0, 0, .04))}.sdc-lookup__panel{display:flex;flex-direction:column;min-width:100%;padding:.5rem 0;background:var(--sdc-lookup-panel-bg, #fff);border:1px solid var(--sdc-lookup-panel-border, #e5e7eb);border-radius:var(--sdc-lookup-panel-radius, .375rem);box-shadow:var(--sdc-lookup-panel-shadow, 0 12px 28px rgba(15, 23, 42, .14));max-height:var(--sdc-lookup-panel-max-height, 240px);overflow:auto;box-sizing:border-box}.sdc-lookup__list{margin:0;padding:0;list-style:none}.sdc-lookup__option{display:flex;align-items:center;min-height:2.5rem;padding:.5rem .75rem;cursor:pointer;transition:background-color .16s ease;color:var(--sdc-lookup-option-color, #334155);font-size:.95rem}.sdc-lookup__option:hover{background:var(--sdc-lookup-option-hover-bg, #eeebf2)}.sdc-lookup__message{display:block;margin-top:.25rem;font-size:.8rem;color:var(--sdc-lookup-message-color, #6b7280)}.sdc-lookup__message--invalid{color:var(--sdc-error-color, #dc3545)}.sdc-lookup__dialog{display:flex;flex-direction:column;gap:1rem;padding:.5rem 0;overflow:hidden}.sdc-lookup__dialog-search,.sdc-lookup__dialog-filters{flex:0 0 auto;padding:0 .5rem}.sdc-lookup__filters-toggle{display:inline-flex;align-items:center;gap:.5rem;padding:.375rem .75rem;border:1px solid var(--sdc-formfield-default-border, #d1d5db);border-radius:var(--sdc-formfield-border-radius, .375rem);background:transparent;color:var(--sdc-text-default, #111827);font-size:.85rem;cursor:pointer;transition:background-color .16s ease}.sdc-lookup__filters-toggle:hover{background:var(--sdc-lookup-option-hover-bg, #eeebf2)}.sdc-lookup__filters-toggle-caret{font-size:.7rem;transition:transform .16s ease}.sdc-lookup__filters-toggle-caret--open{transform:rotate(180deg)}.sdc-lookup__filters-panel{margin-top:.75rem;padding:.75rem;border:1px solid var(--sdc-lookup-panel-border, #e5e7eb);border-radius:var(--sdc-formfield-border-radius, .375rem);background:var(--sdc-lookup-filters-bg, #f9fafb)}.sdc-lookup__filters-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem}.sdc-lookup__filters-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem}.sdc-lookup__filters-action{padding:.375rem .875rem;border:0;border-radius:var(--sdc-formfield-border-radius, .375rem);font-size:.85rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-lookup__filters-action--secondary{background:transparent;color:var(--sdc-tab-primary, #007bff)}.sdc-lookup__filters-action--secondary:hover{background:#007bff14}.sdc-lookup__filters-action--primary{background:var(--sdc-tab-primary, #007bff);color:#fff}.sdc-lookup__filters-action--primary:hover{background:#0056b3}.sdc-lookup__dialog-table{flex:1 1 auto;min-height:120px;overflow:auto}.sdc-lookup__dialog-paginator{flex:0 0 auto;padding:0 .5rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ModalComponent, selector: "sdc-modal", inputs: ["footerButtons", "headerActions", "header", "height", "maximizable", "maximize", "resizable", "responsive", "width", "zIndex", "closable", "styleClass", "appendToBody", "visible"], outputs: ["hidden", "visibleChange"] }, { kind: "component", type: TableComponent, selector: "sdc-table", inputs: ["cols", "data", "loading", "config", "ariaLabel"], outputs: ["action", "rowClick", "lazyLoad", "selectionChange"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: PaginatorComponent, selector: "sdc-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "showRowsPerPageSelector", "isMobile", "totalRecordsLabel"], outputs: ["pageChange"] }, { kind: "component", type: TextboxComponent, selector: "sdc-textbox", inputs: ["infoTooltip", "infoTooltipPosition", "infoTooltipEvent"] }, { kind: "component", type: ComboboxComponent, selector: "sdc-combobox", inputs: ["multiple", "appendTo", "zIndex", "options", "overrideChipMessage", "maxSelectedLabels", "showClear", "searchable", "iconSelector", "showIconClass", "infoTooltip", "infoTooltipPosition", "infoTooltipEvent", "infoTooltipAllowHtml"], outputs: ["onSelectedItem", "panelClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
307
|
+
}
|
|
308
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LookupComponent, decorators: [{
|
|
309
|
+
type: Component,
|
|
310
|
+
args: [{ selector: 'sdc-lookup', standalone: true, imports: [
|
|
311
|
+
CommonModule,
|
|
312
|
+
FormsModule,
|
|
313
|
+
TranslateModule,
|
|
314
|
+
CdkConnectedOverlay,
|
|
315
|
+
CdkOverlayOrigin,
|
|
316
|
+
ModalComponent,
|
|
317
|
+
TableComponent,
|
|
318
|
+
SearchboxComponent,
|
|
319
|
+
PaginatorComponent,
|
|
320
|
+
ButtonComponent,
|
|
321
|
+
TextboxComponent,
|
|
322
|
+
ComboboxComponent
|
|
323
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, providers: [
|
|
324
|
+
{
|
|
325
|
+
provide: NG_VALUE_ACCESSOR,
|
|
326
|
+
useExisting: forwardRef(() => LookupComponent),
|
|
327
|
+
multi: true
|
|
328
|
+
}
|
|
329
|
+
], template: "<div class=\"sdc-lookup\" [ngStyle]=\"getInputStyle()\">\n @if (labelKey()) {\n <label class=\"sdc-lookup__label\" [for]=\"componentId\">\n {{ labelKey() | translate }}\n @if (required) {\n <span class=\"sdc-lookup__required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n\n <div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"sdc-lookup__control\"\n [class.sdc-lookup__control--invalid]=\"invalid\"\n [class.sdc-lookup__control--disabled]=\"disabled\"\n >\n <input\n [id]=\"componentId\"\n class=\"sdc-lookup__input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen() ? 'true' : 'false'\"\n aria-controls=\"sdc-lookup-listbox\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-label]=\"placeholder || (config?.placeholder ?? '') | translate\"\n [placeholder]=\"(config?.placeholder ?? placeholder) | translate\"\n [disabled]=\"disabled\"\n [value]=\"inputValue()\"\n (input)=\"onInputChange($event)\"\n (focus)=\"onInputFocus()\"\n />\n\n <button\n type=\"button\"\n class=\"sdc-lookup__search-button\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'platform.datacore.lookup.open_dialog' | translate\"\n (click)=\"openDialog()\"\n >\n <i class=\"fas fa-search\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <!-- Autocomplete dropdown -->\n @if (suggestions.length > 0) {\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayViewportMargin]=\"8\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"closePanel()\"\n (detach)=\"closePanel()\"\n >\n <!-- NOSONAR: custom autocomplete popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-lookup__panel\"\n [id]=\"componentId + '-listbox'\"\n [attr.role]=\"'listbox'\"\n [style.width.px]=\"containerDiv?.offsetWidth ?? null\"\n >\n <ul class=\"sdc-lookup__list\">\n @for (item of suggestions; track item; let i = $index) {\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <li\n class=\"sdc-lookup__option\"\n [attr.role]=\"'option'\"\n tabindex=\"-1\"\n [id]=\"componentId + '-option-' + i\"\n [attr.aria-selected]=\"'false'\"\n (click)=\"selectSuggestion(item)\"\n (keydown.enter)=\"selectSuggestion(item)\"\n >\n {{ getDisplayValue(item) }}\n </li>\n }\n </ul>\n </div>\n </ng-template>\n }\n\n @if (messageKey()) {\n <small\n class=\"sdc-lookup__message\"\n [class.sdc-lookup__message--invalid]=\"invalid\"\n >\n {{ messageKey() | translate }}\n </small>\n }\n</div>\n\n<!-- Search Dialog -->\n<sdc-modal\n [visible]=\"dialogVisible()\"\n (visibleChange)=\"onDialogVisibleChange($event)\"\n [header]=\"config?.dialogTitle ?? 'platform.datacore.lookup.dialog_title'\"\n [footerButtons]=\"dialogModalFooterButtons()\"\n [width]=\"800\"\n>\n <div class=\"sdc-lookup__dialog\">\n @if (config?.showSearch !== false) {\n <div class=\"sdc-lookup__dialog-search\">\n <sdc-searchbox\n [placeholder]=\"'platform.datacore.lookup.search_placeholder'\"\n (onSearch)=\"onDialogSearchEvent($event)\"\n ></sdc-searchbox>\n </div>\n }\n\n @if (hasFilters()) {\n <div class=\"sdc-lookup__dialog-filters\">\n <button\n type=\"button\"\n class=\"sdc-lookup__filters-toggle\"\n [attr.aria-expanded]=\"filtersExpanded()\"\n [attr.aria-controls]=\"componentId + '-filters-panel'\"\n (click)=\"toggleFilters()\"\n >\n <i class=\"fas fa-filter\" aria-hidden=\"true\"></i>\n {{ 'platform.datacore.lookup.filters' | translate }}\n <i\n class=\"fas fa-chevron-down sdc-lookup__filters-toggle-caret\"\n [class.sdc-lookup__filters-toggle-caret--open]=\"filtersExpanded()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n @if (filtersExpanded()) {\n <div class=\"sdc-lookup__filters-panel\" [id]=\"componentId + '-filters-panel'\">\n <div class=\"sdc-lookup__filters-grid\">\n @for (filter of config.filters; track filter.name) {\n <div class=\"sdc-lookup__filters-field\">\n @if (filter.type === 'select') {\n <sdc-combobox\n [label]=\"filter.label\"\n [placeholder]=\"filter.placeholder ?? ''\"\n [options]=\"mapFilterOptions(filter.options)\"\n [ngModel]=\"filterValueFor(filter.name)\"\n (ngModelChange)=\"onFilterValueChange(filter.name, $event)\"\n width=\"100%\"\n ></sdc-combobox>\n } @else {\n <sdc-textbox\n [label]=\"filter.label\"\n [placeholder]=\"filter.placeholder ?? ''\"\n [ngModel]=\"filterValueFor(filter.name)\"\n (ngModelChange)=\"onFilterValueChange(filter.name, $event)\"\n width=\"100%\"\n ></sdc-textbox>\n }\n </div>\n }\n </div>\n\n <div class=\"sdc-lookup__filters-actions\">\n <button\n type=\"button\"\n class=\"sdc-lookup__filters-action sdc-lookup__filters-action--secondary\"\n (click)=\"clearFilters()\"\n >\n {{ 'platform.datacore.lookup.clear_filters' | translate }}\n </button>\n <button\n type=\"button\"\n class=\"sdc-lookup__filters-action sdc-lookup__filters-action--primary\"\n (click)=\"applyFilters()\"\n >\n {{ 'platform.datacore.lookup.apply_filters' | translate }}\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n <div class=\"sdc-lookup__dialog-table\">\n <sdc-table\n [cols]=\"tableColumns()\"\n [data]=\"dialogData.items\"\n [loading]=\"dialogLoading\"\n [config]=\"dialogTableConfig()\"\n (rowClick)=\"onDialogRowClick($event)\"\n (selectionChange)=\"onDialogSelectionChange($event)\"\n ></sdc-table>\n </div>\n\n <div class=\"sdc-lookup__dialog-paginator\">\n <sdc-paginator\n [first]=\"dialogFirst()\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"dialogData.totalRecords\"\n (pageChange)=\"onDialogPageChange($event)\"\n ></sdc-paginator>\n </div>\n </div>\n</sdc-modal>\n", styles: [":host{display:block}.sdc-lookup__label{display:inline-flex;align-items:center;margin-bottom:var(--sdc-form-label-row-mb);line-height:1;padding-top:var(--sdc-form-label-py, 0);padding-bottom:var(--sdc-form-label-py, 0)}.sdc-lookup__required{margin-left:var(--sdc-form-required-ml, .25rem);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-lookup__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height, 2.5rem);border:1px solid var(--sdc-formfield-default-border, #d1d5db);border-radius:var(--sdc-formfield-border-radius, .375rem);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-lookup__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-lookup__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-lookup__control--invalid,.sdc-lookup__control--invalid:hover,.sdc-lookup__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-lookup__control--disabled,.sdc-lookup__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg, #f3f4f6);border-color:var(--sdc-formfield-default-border, #d1d5db);box-shadow:none;cursor:not-allowed}.sdc-lookup__input{flex:1 1 auto;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height, 1.5);padding:0 .75rem}.sdc-lookup__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-lookup__input:disabled{cursor:not-allowed}.sdc-lookup__search-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;border-left:1px solid var(--sdc-formfield-default-border, #d1d5db);background:transparent;color:var(--sdc-button-icon-default, #6b7280);cursor:pointer;transition:background-color .16s ease}.sdc-lookup__search-button:disabled{cursor:not-allowed;opacity:.6}.sdc-lookup__search-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px}.sdc-lookup__search-button:hover:not(:disabled){background:var(--sdc-lookup-button-hover-bg, rgba(0, 0, 0, .04))}.sdc-lookup__panel{display:flex;flex-direction:column;min-width:100%;padding:.5rem 0;background:var(--sdc-lookup-panel-bg, #fff);border:1px solid var(--sdc-lookup-panel-border, #e5e7eb);border-radius:var(--sdc-lookup-panel-radius, .375rem);box-shadow:var(--sdc-lookup-panel-shadow, 0 12px 28px rgba(15, 23, 42, .14));max-height:var(--sdc-lookup-panel-max-height, 240px);overflow:auto;box-sizing:border-box}.sdc-lookup__list{margin:0;padding:0;list-style:none}.sdc-lookup__option{display:flex;align-items:center;min-height:2.5rem;padding:.5rem .75rem;cursor:pointer;transition:background-color .16s ease;color:var(--sdc-lookup-option-color, #334155);font-size:.95rem}.sdc-lookup__option:hover{background:var(--sdc-lookup-option-hover-bg, #eeebf2)}.sdc-lookup__message{display:block;margin-top:.25rem;font-size:.8rem;color:var(--sdc-lookup-message-color, #6b7280)}.sdc-lookup__message--invalid{color:var(--sdc-error-color, #dc3545)}.sdc-lookup__dialog{display:flex;flex-direction:column;gap:1rem;padding:.5rem 0;overflow:hidden}.sdc-lookup__dialog-search,.sdc-lookup__dialog-filters{flex:0 0 auto;padding:0 .5rem}.sdc-lookup__filters-toggle{display:inline-flex;align-items:center;gap:.5rem;padding:.375rem .75rem;border:1px solid var(--sdc-formfield-default-border, #d1d5db);border-radius:var(--sdc-formfield-border-radius, .375rem);background:transparent;color:var(--sdc-text-default, #111827);font-size:.85rem;cursor:pointer;transition:background-color .16s ease}.sdc-lookup__filters-toggle:hover{background:var(--sdc-lookup-option-hover-bg, #eeebf2)}.sdc-lookup__filters-toggle-caret{font-size:.7rem;transition:transform .16s ease}.sdc-lookup__filters-toggle-caret--open{transform:rotate(180deg)}.sdc-lookup__filters-panel{margin-top:.75rem;padding:.75rem;border:1px solid var(--sdc-lookup-panel-border, #e5e7eb);border-radius:var(--sdc-formfield-border-radius, .375rem);background:var(--sdc-lookup-filters-bg, #f9fafb)}.sdc-lookup__filters-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.75rem}.sdc-lookup__filters-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:.75rem}.sdc-lookup__filters-action{padding:.375rem .875rem;border:0;border-radius:var(--sdc-formfield-border-radius, .375rem);font-size:.85rem;font-weight:600;cursor:pointer;transition:background-color .15s ease}.sdc-lookup__filters-action--secondary{background:transparent;color:var(--sdc-tab-primary, #007bff)}.sdc-lookup__filters-action--secondary:hover{background:#007bff14}.sdc-lookup__filters-action--primary{background:var(--sdc-tab-primary, #007bff);color:#fff}.sdc-lookup__filters-action--primary:hover{background:#0056b3}.sdc-lookup__dialog-table{flex:1 1 auto;min-height:120px;overflow:auto}.sdc-lookup__dialog-paginator{flex:0 0 auto;padding:0 .5rem}\n"] }]
|
|
330
|
+
}], ctorParameters: () => [], propDecorators: { containerDiv: [{
|
|
331
|
+
type: ViewChild,
|
|
332
|
+
args: ['containerDiv']
|
|
333
|
+
}], config: [{
|
|
334
|
+
type: Input,
|
|
335
|
+
args: [{ required: true }]
|
|
336
|
+
}], suggestions: [{
|
|
337
|
+
type: Input
|
|
338
|
+
}], dialogData: [{
|
|
339
|
+
type: Input
|
|
340
|
+
}], dialogLoading: [{
|
|
341
|
+
type: Input
|
|
342
|
+
}], onLookupRequest: [{
|
|
343
|
+
type: Output
|
|
344
|
+
}], onDialogSearch: [{
|
|
345
|
+
type: Output
|
|
346
|
+
}], onDialogOpen: [{
|
|
347
|
+
type: Output
|
|
348
|
+
}], valueSelected: [{
|
|
349
|
+
type: Output
|
|
350
|
+
}] } });
|
|
351
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvbG9va3VwL2xvb2t1cC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2xvb2t1cC9sb29rdXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFFUixZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQ0gsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUVoQixPQUFPLEVBRVYsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFLekUsT0FBTyxFQUFFLG1CQUFtQixFQUE4QixNQUFNLHVDQUF1QyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NB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Q2hCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIENka0Nvbm5lY3RlZE92ZXJsYXksXG4gICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICBDb25uZWN0ZWRQb3NpdGlvbixcbiAgICBPdmVybGF5LFxuICAgIFNjcm9sbFN0cmF0ZWd5XG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJbnB1dHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvaW5wdXRzLmRpcmVjdGl2ZSc7XG5pbXBvcnQgdHlwZSB7IExvb2t1cENvbmZpZywgTG9va3VwR3JpZEZpZWxkLCBMb29rdXBTZWFyY2hSZXF1ZXN0LCBMb29rdXBTZWFyY2hSZXNwb25zZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvbG9va3VwLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBNb2RhbEJ1dHRvbiB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvbW9kYWwudHlwZSc7XG5pbXBvcnQgdHlwZSB7IFRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90YWJsZS50eXBlJztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdG9yU3RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL3BhZ2luYXRvci50eXBlJztcbmltcG9ydCB7IHdhdGNoT3ZlcmxheURpc21pc3MsIHR5cGUgT3ZlcmxheURpc21pc3NXYXRjaGVyIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9vdmVybGF5LWRpc21pc3MudXRpbCc7XG5pbXBvcnQgeyBNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL21vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hib3hDb21wb25lbnQgfSBmcm9tICcuLi9zZWFyY2hib3gvc2VhcmNoYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi4vdGV4dGJveC90ZXh0Ym94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21ib2JveENvbXBvbmVudCB9IGZyb20gJy4uL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudCc7XG5cbmNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMTA7XG5jb25zdCBMT09LVVBfREVCT1VOQ0VfTVMgPSAzMDA7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2RjLWxvb2t1cCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgTW9kYWxDb21wb25lbnQsXG4gICAgICAgIFRhYmxlQ29tcG9uZW50LFxuICAgICAgICBTZWFyY2hib3hDb21wb25lbnQsXG4gICAgICAgIFBhZ2luYXRvckNvbXBvbmVudCxcbiAgICAgICAgQnV0dG9uQ29tcG9uZW50LFxuICAgICAgICBUZXh0Ym94Q29tcG9uZW50LFxuICAgICAgICBDb21ib2JveENvbXBvbmVudFxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xvb2t1cC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2xvb2t1cC5jb21wb25lbnQuc2NzcycsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTG9va3VwQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIExvb2t1cENvbXBvbmVudCBleHRlbmRzIElucHV0c0NvbXBvbmVudDx1bmtub3duPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dElkID0gMDtcblxuICAgIHByaXZhdGUgc3RhdGljIGFsbG9jYXRlQ29tcG9uZW50SWQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaWQgPSBMb29rdXBDb21wb25lbnQubmV4dElkO1xuICAgICAgICBMb29rdXBDb21wb25lbnQubmV4dElkICs9IDE7XG4gICAgICAgIHJldHVybiBgc2RjLWxvb2t1cC0ke2lkfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBvdmVybGF5ID0gaW5qZWN0KE92ZXJsYXkpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlucHV0U3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICBwcml2YXRlIGRpc21pc3NXYXRjaGVyOiBPdmVybGF5RGlzbWlzc1dhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBDREsgb3ZlcmxheSBjb25maWcgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBvdmVybGF5UG9zaXRpb25zOiBDb25uZWN0ZWRQb3NpdGlvbltdID0gW1xuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICd0b3AnIH0sXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfVxuICAgIF07XG5cbiAgICBAVmlld0NoaWxkKCdjb250YWluZXJEaXYnKSBwcm90ZWN0ZWQgY29udGFpbmVyRGl2PzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICAvLyAtLS0gSW5wdXRzIC0tLVxuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGNvbmZpZyE6IExvb2t1cENvbmZpZztcbiAgICBASW5wdXQoKSBzdWdnZXN0aW9uczogdW5rbm93bltdID0gW107XG4gICAgQElucHV0KCkgZGlhbG9nRGF0YTogTG9va3VwU2VhcmNoUmVzcG9uc2UgPSB7IGl0ZW1zOiBbXSwgdG90YWxSZWNvcmRzOiAwIH07XG4gICAgQElucHV0KCkgZGlhbG9nTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgLy8gLS0tIE91dHB1dHMgLS0tXG4gICAgQE91dHB1dCgpIG9uTG9va3VwUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAgIEBPdXRwdXQoKSBvbkRpYWxvZ1NlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8TG9va3VwU2VhcmNoUmVxdWVzdD4oKTtcbiAgICBAT3V0cHV0KCkgb25EaWFsb2dPcGVuID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoKSB2YWx1ZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuXG4gICAgLy8gLS0tIEludGVybmFsIHN0YXRlIC0tLVxuICAgIHByb3RlY3RlZCByZWFkb25seSBjb21wb25lbnRJZCA9IExvb2t1cENvbXBvbmVudC5hbGxvY2F0ZUNvbXBvbmVudElkKCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlucHV0VmFsdWUgPSBzaWduYWwoJycpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwYW5lbE9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaWFsb2dWaXNpYmxlID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nUXVlcnkgPSBzaWduYWwoJycpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaWFsb2dQYWdlID0gc2lnbmFsKDApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmaWx0ZXJzRXhwYW5kZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmaWx0ZXJWYWx1ZXMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaWFsb2dTZWxlY3Rpb24gPSBzaWduYWw8dW5rbm93bltdPihbXSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFnZVNpemUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbmZpZz8ucGFnZVNpemUgPz8gREVGQVVMVF9QQUdFX1NJWkUpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc011bHRpcGxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25maWc/Lm11bHRpcGxlID09PSB0cnVlKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzRmlsdGVycyA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmNvbmZpZz8uZmlsdGVycz8ubGVuZ3RoID8/IDApID4gMCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nVGFibGVDb25maWcgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgICAgICBzZWFyY2g6IHsgc2hvdzogZmFsc2UgfSxcbiAgICAgICAgLy8gJ2FwaScgbW9kZTogZGlhbG9nRGF0YS5pdGVtcyBpcyBhIHNpbmdsZSBleHRlcm5hbGx5LWZldGNoZWQgcGFnZSAodmlhIG9uRGlhbG9nU2VhcmNoKSxcbiAgICAgICAgLy8gbm90IHRoZSBmdWxsIGRhdGFzZXQuIFRoaXMgYWxzbyB0ZWxscyBzZGMtdGFibGUgdG8gcHJlc2VydmUgbXVsdGktc2VsZWN0IGFjcm9zcyBwYWdlXG4gICAgICAgIC8vIGNoYW5nZXMgaW5zdGVhZCBvZiBkcm9wcGluZyByb3dzIHRoYXQgYXJlbid0IG9uIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIHBhZ2UuXG4gICAgICAgIHRhYmxlOiB7IHRvdGFsUmVjb3Jkc0xhYmVsOiAnJywgcmVzcG9uc2l2ZTogZmFsc2UsIG1vZGU6ICdhcGknIGFzIGNvbnN0IH0sXG4gICAgICAgIHBhZ2luYXRpb246IHsgc2hvdzogZmFsc2UgfSxcbiAgICAgICAgZW1wdHk6IHsgc2hvdzogdHJ1ZSwgdGl0bGU6ICdOZW5odW0gcmVzdWx0YWRvJywgdGV4dDogJ1RlbnRlIGFqdXN0YXIgYSBidXNjYS4nIH0sXG4gICAgICAgIGNlbGxzOiB7XG4gICAgICAgICAgICBjaGVja2JveDogeyBzZWxlY3RBbGw6IHRydWUgfVxuICAgICAgICB9XG4gICAgfSkpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlQ29sdW1ucyA9IGNvbXB1dGVkPFRhYmxlQ29sdW1uW10+KCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZz8uZ3JpZEZpZWxkcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmllbGRDb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gdGhpcy5jb25maWcuZ3JpZEZpZWxkcy5tYXAoKGZpZWxkOiBMb29rdXBHcmlkRmllbGQpID0+ICh7XG4gICAgICAgICAgICBmaWVsZDogZmllbGQubmFtZSxcbiAgICAgICAgICAgIGhlYWRlcjogZmllbGQubGFiZWwsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLm1hcEZpZWxkVHlwZShmaWVsZC50eXBlKSxcbiAgICAgICAgICAgIHdpZHRoOiBmaWVsZC53aWR0aFxuICAgICAgICB9IGFzIFRhYmxlQ29sdW1uKSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkQ29sdW1ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoZWNrYm94Q29sdW1uOiBUYWJsZUNvbHVtbiA9IHtcbiAgICAgICAgICAgIGZpZWxkOiB0aGlzLmNvbmZpZy5kYXRhS2V5LFxuICAgICAgICAgICAgaGVhZGVyOiAncGxhdGZvcm0uZGF0YWNvcmUubG9va3VwLnNlbGVjdF9jb2x1bW4nLFxuICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94LXNlbGVjdGlvbicsXG4gICAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICBhbGlnbjogJ2NlbnRlcidcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gW2NoZWNrYm94Q29sdW1uLCAuLi5maWVsZENvbHVtbnNdO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpYWxvZ0ZpcnN0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kaWFsb2dQYWdlKCkgKiB0aGlzLnBhZ2VTaXplKCkpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhc0RpYWxvZ1NlbGVjdGlvbiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGlhbG9nU2VsZWN0aW9uKCkubGVuZ3RoID4gMCk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nTW9kYWxGb290ZXJCdXR0b25zID0gY29tcHV0ZWQ8TW9kYWxCdXR0b25bXT4oKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiBgJHt0aGlzLmNvbXBvbmVudElkfS1jb25maXJtLXNlbGVjdGlvbmAsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdwbGF0Zm9ybS5kYXRhY29yZS5sb29rdXAuY29uZmlybV9zZWxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAncHJpbWFyeScsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICF0aGlzLmhhc0RpYWxvZ1NlbGVjdGlvbigpLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5jb25maXJtTXVsdGlwbGVTZWxlY3Rpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH0pO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5pbnB1dFN1YmplY3QucGlwZShcbiAgICAgICAgICAgIGRlYm91bmNlVGltZShMT09LVVBfREVCT1VOQ0VfTVMpLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgICApLnN1YnNjcmliZSgocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkxvb2t1cFJlcXVlc3QuZW1pdChxdWVyeSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNtaXNzV2F0Y2hlciA9IHdhdGNoT3ZlcmxheURpc21pc3Moe1xuICAgICAgICAgICAgZ2V0VHJpZ2dlckVsZW1lbnQ6ICgpID0+IHRoaXMuY29udGFpbmVyRGl2Py5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICAgICAgICAgICBpc09wZW46ICgpID0+IHRoaXMucGFuZWxPcGVuKCksXG4gICAgICAgICAgICBvbkRpc21pc3M6ICgpID0+IHRoaXMuY2xvc2VQYW5lbCgpLFxuICAgICAgICAgICAgcm91dGVyOiB0aGlzLnJvdXRlclxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5kaXNtaXNzV2F0Y2hlcj8uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIC0tLSBWYWx1ZSBhY2Nlc3NvciBvdmVycmlkZXMgLS0tXG4gICAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXREaXNwbGF5KCk7XG4gICAgfVxuXG4gICAgLy8gLS0tIEZpbHRlcnMgLS0tXG4gICAgcHJvdGVjdGVkIHRvZ2dsZUZpbHRlcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyc0V4cGFuZGVkLnNldCghdGhpcy5maWx0ZXJzRXhwYW5kZWQoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRmlsdGVyVmFsdWVDaGFuZ2UobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlclZhbHVlcy5zZXQoeyAuLi50aGlzLmZpbHRlclZhbHVlcygpLCBbbmFtZV06IHZhbHVlID8/ICcnIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBmaWx0ZXJWYWx1ZUZvcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJWYWx1ZXMoKVtuYW1lXSA/PyAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbWFwRmlsdGVyT3B0aW9ucyhvcHRpb25zOiB7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdIHwgdW5kZWZpbmVkKTogeyB2YWx1ZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdIHtcbiAgICAgICAgcmV0dXJuIChvcHRpb25zID8/IFtdKS5tYXAoKG9wdGlvbikgPT4gKHsgdmFsdWU6IG9wdGlvbi52YWx1ZSwgdGV4dDogb3B0aW9uLmxhYmVsIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1BhZ2Uuc2V0KDApO1xuICAgICAgICB0aGlzLmVtaXREaWFsb2dTZWFyY2goKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xlYXJGaWx0ZXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlclZhbHVlcy5zZXQoe30pO1xuICAgICAgICB0aGlzLmRpYWxvZ1BhZ2Uuc2V0KDApO1xuICAgICAgICB0aGlzLmVtaXREaWFsb2dTZWFyY2goKTtcbiAgICB9XG5cbiAgICAvLyAtLS0gQXV0b2NvbXBsZXRlIGlucHV0IC0tLVxuICAgIHByb3RlY3RlZCBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgcXVlcnkgPSB0YXJnZXQ/LnZhbHVlID8/ICcnO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KHF1ZXJ5KTtcbiAgICAgICAgdGhpcy5pbnB1dFN1YmplY3QubmV4dChxdWVyeSk7XG5cbiAgICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucGFuZWxPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFuZWxPcGVuLnNldChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmNvbW1pdFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZVNlbGVjdGVkLmVtaXQobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25JbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdWdnZXN0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuaW5wdXRWYWx1ZSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucGFuZWxPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjbG9zZVBhbmVsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhbmVsT3Blbi5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RTdWdnZXN0aW9uKGl0ZW06IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW0pO1xuICAgICAgICB0aGlzLnBhbmVsT3Blbi5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWUoaXRlbTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgICAgIGlmICghaXRlbSB8fCAhdGhpcy5jb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIHJldHVybiBTdHJpbmcocmVjb3JkW3RoaXMuY29uZmlnLmRpc3BsYXlGaWVsZF0gPz8gJycpO1xuICAgIH1cblxuICAgIC8vIC0tLSBEaWFsb2cgLS0tXG4gICAgcHJvdGVjdGVkIG9wZW5EaWFsb2coKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGlhbG9nUXVlcnkuc2V0KCcnKTtcbiAgICAgICAgdGhpcy5kaWFsb2dQYWdlLnNldCgwKTtcbiAgICAgICAgdGhpcy5maWx0ZXJzRXhwYW5kZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5kaWFsb2dTZWxlY3Rpb24uc2V0KHRoaXMuaXNNdWx0aXBsZSgpICYmIEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyBbLi4udGhpcy52YWx1ZV0gOiBbXSk7XG4gICAgICAgIHRoaXMub25EaWFsb2dPcGVuLmVtaXQoKTtcbiAgICAgICAgdGhpcy5lbWl0RGlhbG9nU2VhcmNoKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRGlhbG9nVmlzaWJsZUNoYW5nZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZS5zZXQodmlzaWJsZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRGlhbG9nU2VhcmNoRXZlbnQocXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWxvZ1F1ZXJ5LnNldChxdWVyeSk7XG4gICAgICAgIHRoaXMuZGlhbG9nUGFnZS5zZXQoMCk7XG4gICAgICAgIHRoaXMuZW1pdERpYWxvZ1NlYXJjaCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkRpYWxvZ1BhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2luYXRvclN0YXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUGFnZS5zZXQoZXZlbnQucGFnZSk7XG4gICAgICAgIHRoaXMuZW1pdERpYWxvZ1NlYXJjaCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkRpYWxvZ1Jvd0NsaWNrKHJvdzogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIC8vIEluIG11bHRpcGxlIG1vZGUsIGEgcm93IGNsaWNrIHRvZ2dsZXMgdGhlIGNoZWNrYm94IGluc3RlYWQgb2YgY29tbWl0dGluZ1xuICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHksIHNvIHRoZSB1c2VyIGNhbiBwaWNrIHNldmVyYWwgcm93cyBiZWZvcmUgY29uZmlybWluZy5cbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRGlhbG9nUm93U2VsZWN0aW9uKHJvdyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdEl0ZW0ocm93KTtcbiAgICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlLnNldChmYWxzZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRGlhbG9nU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbjogdW5rbm93bltdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nU2VsZWN0aW9uLnNldChzZWxlY3Rpb24pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjb25maXJtTXVsdGlwbGVTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZGlhbG9nU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFsdWUgPSBzZWxlY3Rpb247XG4gICAgICAgIHRoaXMub25DaGFuZ2Uoc2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHNlbGVjdGlvbik7XG4gICAgICAgIHRoaXMudmFsdWVTZWxlY3RlZC5lbWl0KHNlbGVjdGlvbik7XG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXREaXNwbGF5KCk7XG4gICAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZS5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIC0tLSBIZWxwZXJzIC0tLVxuICAgIHByaXZhdGUgc2VsZWN0SXRlbShpdGVtOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IHN0b3JlZFZhbHVlID0gcmVjb3JkW3RoaXMuY29uZmlnLmRhdGFLZXldID8/IGl0ZW07XG4gICAgICAgIHRoaXMudmFsdWUgPSBpdGVtO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHN0b3JlZFZhbHVlKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHN0b3JlZFZhbHVlKTtcbiAgICAgICAgdGhpcy51cGRhdGVJbnB1dERpc3BsYXkoKTtcbiAgICAgICAgdGhpcy52YWx1ZVNlbGVjdGVkLmVtaXQoaXRlbSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVEaWFsb2dSb3dTZWxlY3Rpb24ocm93OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmRpYWxvZ1NlbGVjdGlvbigpO1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmRhdGFLZXlPZihyb3cpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGN1cnJlbnQuZmluZEluZGV4KChpdGVtKSA9PiB0aGlzLmRhdGFLZXlPZihpdGVtKSA9PT0ga2V5KTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZWxlY3Rpb24uc2V0KFsuLi5jdXJyZW50LnNsaWNlKDAsIGluZGV4KSwgLi4uY3VycmVudC5zbGljZShpbmRleCArIDEpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlbGVjdGlvbi5zZXQoWy4uLmN1cnJlbnQsIHJvd10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkYXRhS2V5T2YoaXRlbTogdW5rbm93bik6IHVua25vd24ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICByZXR1cm4gcmVjb3JkPy5bdGhpcy5jb25maWc/LmRhdGFLZXldO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSW5wdXREaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlKCkgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlLnNldChcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnZhbHVlLm1hcCgoaXRlbSkgPT4gdGhpcy5nZXREaXNwbGF5VmFsdWUoaXRlbSkpLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUuc2V0KHRoaXMuZ2V0RGlzcGxheVZhbHVlKHRoaXMudmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRWYWx1ZS5zZXQoJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbWl0RGlhbG9nU2VhcmNoKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBMb29rdXBTZWFyY2hSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgcXVlcnk6IHRoaXMuZGlhbG9nUXVlcnkoKSxcbiAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplKCksXG4gICAgICAgICAgICBwYWdlOiB0aGlzLmRpYWxvZ1BhZ2UoKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0ZpbHRlcnMoKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5maWx0ZXJzID0gdGhpcy5maWx0ZXJWYWx1ZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25EaWFsb2dTZWFyY2guZW1pdChyZXF1ZXN0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcEZpZWxkVHlwZSh0eXBlPzogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdkYXRlJyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzogcmV0dXJuICdudW1lcmljJztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOiByZXR1cm4gJ2RhdGUnO1xuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtbG9va3VwXCIgW25nU3R5bGVdPVwiZ2V0SW5wdXRTdHlsZSgpXCI+XG4gIEBpZiAobGFiZWxLZXkoKSkge1xuICAgIDxsYWJlbCBjbGFzcz1cInNkYy1sb29rdXBfX2xhYmVsXCIgW2Zvcl09XCJjb21wb25lbnRJZFwiPlxuICAgICAge3sgbGFiZWxLZXkoKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgQGlmIChyZXF1aXJlZCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1sb29rdXBfX3JlcXVpcmVkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+Kjwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L2xhYmVsPlxuICB9XG5cbiAgPGRpdlxuICAgICNjb250YWluZXJEaXZcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBjbGFzcz1cInNkYy1sb29rdXBfX2NvbnRyb2xcIlxuICAgIFtjbGFzcy5zZGMtbG9va3VwX19jb250cm9sLS1pbnZhbGlkXT1cImludmFsaWRcIlxuICAgIFtjbGFzcy5zZGMtbG9va3VwX19jb250cm9sLS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gID5cbiAgICA8aW5wdXRcbiAgICAgIFtpZF09XCJjb21wb25lbnRJZFwiXG4gICAgICBjbGFzcz1cInNkYy1sb29rdXBfX2lucHV0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicGFuZWxPcGVuKCkgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgIGFyaWEtY29udHJvbHM9XCJzZGMtbG9va3VwLWxpc3Rib3hcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJjb21wb25lbnRJZCArICctbGlzdGJveCdcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwbGFjZWhvbGRlciB8fCAoY29uZmlnPy5wbGFjZWhvbGRlciA/PyAnJykgfCB0cmFuc2xhdGVcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIihjb25maWc/LnBsYWNlaG9sZGVyID8/IHBsYWNlaG9sZGVyKSB8IHRyYW5zbGF0ZVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3ZhbHVlXT1cImlucHV0VmFsdWUoKVwiXG4gICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgLz5cblxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJzZGMtbG9va3VwX19zZWFyY2gtYnV0dG9uXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5sb29rdXAub3Blbl9kaWFsb2cnIHwgdHJhbnNsYXRlXCJcbiAgICAgIChjbGljayk9XCJvcGVuRGlhbG9nKClcIlxuICAgID5cbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNlYXJjaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBBdXRvY29tcGxldGUgZHJvcGRvd24gLS0+XG4gIEBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwicGFuZWxPcGVuKClcIlxuICAgICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwib3ZlcmxheVBvc2l0aW9uc1wiXG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVNjcm9sbFN0cmF0ZWd5XT1cInNjcm9sbFN0cmF0ZWd5XCJcbiAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5Vmlld3BvcnRNYXJnaW5dPVwiOFwiXG4gICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgICAoYmFja2Ryb3BDbGljayk9XCJjbG9zZVBhbmVsKClcIlxuICAgICAgKGRldGFjaCk9XCJjbG9zZVBhbmVsKClcIlxuICAgID5cbiAgICAgIDwhLS0gTk9TT05BUjogY3VzdG9tIGF1dG9jb21wbGV0ZSBwb3B1cCBpbnRlbnRpb25hbGx5IHVzZXMgQVJJQSBsaXN0Ym94IHNlbWFudGljcyBpbnN0ZWFkIG9mIGEgbmF0aXZlIHNlbGVjdCAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzZGMtbG9va3VwX19wYW5lbFwiXG4gICAgICAgIFtpZF09XCJjb21wb25lbnRJZCArICctbGlzdGJveCdcIlxuICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXY/Lm9mZnNldFdpZHRoID8/IG51bGxcIlxuICAgICAgPlxuICAgICAgICA8dWwgY2xhc3M9XCJzZGMtbG9va3VwX19saXN0XCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBzdWdnZXN0aW9uczsgdHJhY2sgaXRlbTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgIDwhLS0gTk9TT05BUiAtLT5cbiAgICAgICAgICAgIDwhLS0gdGhlIGN1c3RvbSBsaXN0Ym94IGtlZXBzIG9wdGlvbiBzZW1hbnRpY3Mgb24gdGhlIGZvY3VzYWJsZSBhY3Rpb24gZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gLS0+XG4gICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtbG9va3VwX19vcHRpb25cIlxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidvcHRpb24nXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIFtpZF09XCJjb21wb25lbnRJZCArICctb3B0aW9uLScgKyBpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCInZmFsc2UnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFN1Z2dlc3Rpb24oaXRlbSlcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWxlY3RTdWdnZXN0aW9uKGl0ZW0pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGl0ZW0pIH19XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIH1cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIH1cblxuICBAaWYgKG1lc3NhZ2VLZXkoKSkge1xuICAgIDxzbWFsbFxuICAgICAgY2xhc3M9XCJzZGMtbG9va3VwX19tZXNzYWdlXCJcbiAgICAgIFtjbGFzcy5zZGMtbG9va3VwX19tZXNzYWdlLS1pbnZhbGlkXT1cImludmFsaWRcIlxuICAgID5cbiAgICAgIHt7IG1lc3NhZ2VLZXkoKSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvc21hbGw+XG4gIH1cbjwvZGl2PlxuXG48IS0tIFNlYXJjaCBEaWFsb2cgLS0+XG48c2RjLW1vZGFsXG4gIFt2aXNpYmxlXT1cImRpYWxvZ1Zpc2libGUoKVwiXG4gICh2aXNpYmxlQ2hhbmdlKT1cIm9uRGlhbG9nVmlzaWJsZUNoYW5nZSgkZXZlbnQpXCJcbiAgW2hlYWRlcl09XCJjb25maWc/LmRpYWxvZ1RpdGxlID8/ICdwbGF0Zm9ybS5kYXRhY29yZS5sb29rdXAuZGlhbG9nX3RpdGxlJ1wiXG4gIFtmb290ZXJCdXR0b25zXT1cImRpYWxvZ01vZGFsRm9vdGVyQnV0dG9ucygpXCJcbiAgW3dpZHRoXT1cIjgwMFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJzZGMtbG9va3VwX19kaWFsb2dcIj5cbiAgICBAaWYgKGNvbmZpZz8uc2hvd1NlYXJjaCAhPT0gZmFsc2UpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzZGMtbG9va3VwX19kaWFsb2ctc2VhcmNoXCI+XG4gICAgICAgIDxzZGMtc2VhcmNoYm94XG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidwbGF0Zm9ybS5kYXRhY29yZS5sb29rdXAuc2VhcmNoX3BsYWNlaG9sZGVyJ1wiXG4gICAgICAgICAgKG9uU2VhcmNoKT1cIm9uRGlhbG9nU2VhcmNoRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgID48L3NkYy1zZWFyY2hib3g+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYgKGhhc0ZpbHRlcnMoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cInNkYy1sb29rdXBfX2RpYWxvZy1maWx0ZXJzXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cInNkYy1sb29rdXBfX2ZpbHRlcnMtdG9nZ2xlXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImZpbHRlcnNFeHBhbmRlZCgpXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImNvbXBvbmVudElkICsgJy1maWx0ZXJzLXBhbmVsJ1wiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZpbHRlcnMoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1maWx0ZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAge3sgJ3BsYXRmb3JtLmRhdGFjb3JlLmxvb2t1cC5maWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gc2RjLWxvb2t1cF9fZmlsdGVycy10b2dnbGUtY2FyZXRcIlxuICAgICAgICAgICAgW2NsYXNzLnNkYy1sb29rdXBfX2ZpbHRlcnMtdG9nZ2xlLWNhcmV0LS1vcGVuXT1cImZpbHRlcnNFeHBhbmRlZCgpXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgQGlmIChmaWx0ZXJzRXhwYW5kZWQoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtbG9va3VwX19maWx0ZXJzLXBhbmVsXCIgW2lkXT1cImNvbXBvbmVudElkICsgJy1maWx0ZXJzLXBhbmVsJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1sb29rdXBfX2ZpbHRlcnMtZ3JpZFwiPlxuICAgICAgICAgICAgICBAZm9yIChmaWx0ZXIgb2YgY29uZmlnLmZpbHRlcnM7IHRyYWNrIGZpbHRlci5uYW1lKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1sb29rdXBfX2ZpbHRlcnMtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyLnR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzZGMtY29tYm9ib3hcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZmlsdGVyLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmlsdGVyLnBsYWNlaG9sZGVyID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJtYXBGaWx0ZXJPcHRpb25zKGZpbHRlci5vcHRpb25zKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyVmFsdWVGb3IoZmlsdGVyLm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpbHRlclZhbHVlQ2hhbmdlKGZpbHRlci5uYW1lLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zZGMtY29tYm9ib3g+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPHNkYy10ZXh0Ym94XG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImZpbHRlci5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpbHRlci5wbGFjZWhvbGRlciA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZmlsdGVyVmFsdWVGb3IoZmlsdGVyLm5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZpbHRlclZhbHVlQ2hhbmdlKGZpbHRlci5uYW1lLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zZGMtdGV4dGJveD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtbG9va3VwX19maWx0ZXJzLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWxvb2t1cF9fZmlsdGVycy1hY3Rpb24gc2RjLWxvb2t1cF9fZmlsdGVycy1hY3Rpb24tLXNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5kYXRhY29yZS5sb29rdXAuY2xlYXJfZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1sb29rdXBfX2ZpbHRlcnMtYWN0aW9uIHNkYy1sb29rdXBfX2ZpbHRlcnMtYWN0aW9uLS1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmRhdGFjb3JlLmxvb2t1cC5hcHBseV9maWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8ZGl2IGNsYXNzPVwic2RjLWxvb2t1cF9fZGlhbG9nLXRhYmxlXCI+XG4gICAgICA8c2RjLXRhYmxlXG4gICAgICAgIFtjb2xzXT1cInRhYmxlQ29sdW1ucygpXCJcbiAgICAgICAgW2RhdGFdPVwiZGlhbG9nRGF0YS5pdGVtc1wiXG4gICAgICAgIFtsb2FkaW5nXT1cImRpYWxvZ0xvYWRpbmdcIlxuICAgICAgICBbY29uZmlnXT1cImRpYWxvZ1RhYmxlQ29uZmlnKClcIlxuICAgICAgICAocm93Q2xpY2spPVwib25EaWFsb2dSb3dDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkRpYWxvZ1NlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgID48L3NkYy10YWJsZT5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzZGMtbG9va3VwX19kaWFsb2ctcGFnaW5hdG9yXCI+XG4gICAgICA8c2RjLXBhZ2luYXRvclxuICAgICAgICBbZmlyc3RdPVwiZGlhbG9nRmlyc3QoKVwiXG4gICAgICAgIFtyb3dzXT1cInBhZ2VTaXplKClcIlxuICAgICAgICBbdG90YWxSZWNvcmRzXT1cImRpYWxvZ0RhdGEudG90YWxSZWNvcmRzXCJcbiAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25EaWFsb2dQYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgPjwvc2RjLXBhZ2luYXRvcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3NkYy1tb2RhbD5cbiJdfQ==
|