@valtimo/task-management 12.0.0 → 12.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/esm2022/lib/components/index.mjs +2 -1
  2. package/esm2022/lib/components/task-management/task-management.component.mjs +2 -2
  3. package/esm2022/lib/components/task-management-columns/task-management-columns.component.mjs +2 -2
  4. package/esm2022/lib/components/task-management-detail/task-management-detail.component.mjs +21 -17
  5. package/esm2022/lib/components/task-management-search-fields/task-management-search-fields.component.mjs +176 -0
  6. package/esm2022/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.mjs +354 -0
  7. package/esm2022/lib/models/task-management.model.mjs +3 -2
  8. package/esm2022/lib/services/index.mjs +2 -1
  9. package/esm2022/lib/services/task-management-search-fields.service.mjs +47 -0
  10. package/fesm2022/valtimo-task-management.mjs +574 -30
  11. package/fesm2022/valtimo-task-management.mjs.map +1 -1
  12. package/lib/components/index.d.ts +1 -0
  13. package/lib/components/index.d.ts.map +1 -1
  14. package/lib/components/task-management-detail/task-management-detail.component.d.ts +7 -5
  15. package/lib/components/task-management-detail/task-management-detail.component.d.ts.map +1 -1
  16. package/lib/components/task-management-search-fields/task-management-search-fields.component.d.ts +35 -0
  17. package/lib/components/task-management-search-fields/task-management-search-fields.component.d.ts.map +1 -0
  18. package/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.d.ts +79 -0
  19. package/lib/components/task-management-search-fields-modal/task-management-search-fields-modal.component.d.ts.map +1 -0
  20. package/lib/models/task-management.model.d.ts +2 -1
  21. package/lib/models/task-management.model.d.ts.map +1 -1
  22. package/lib/services/index.d.ts +1 -0
  23. package/lib/services/index.d.ts.map +1 -1
  24. package/lib/services/task-management-search-fields.service.d.ts +20 -0
  25. package/lib/services/task-management-search-fields.service.d.ts.map +1 -0
  26. package/package.json +1 -1
@@ -0,0 +1,354 @@
1
+ /*
2
+ * Copyright 2015-2024 Ritense BV, the Netherlands.
3
+ *
4
+ * Licensed under EUPL, Version 1.2 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { CommonModule } from '@angular/common';
17
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from '@angular/core';
18
+ import { ReactiveFormsModule, Validators, } from '@angular/forms';
19
+ import { InformationFilled16, TrashCan16 } from '@carbon/icons';
20
+ import { TranslateModule } from '@ngx-translate/core';
21
+ import { CARBON_CONSTANTS, CarbonListModule, InputLabelModule, ViewType, } from '@valtimo/components';
22
+ import { TaskListSearchDropdownDataProvider, TaskListSearchFieldDataType, TaskListSearchFieldFieldType, TaskListSearchFieldMatchType, } from '@valtimo/task';
23
+ import { ButtonModule, DropdownModule, IconModule, InputModule, ModalModule, } from 'carbon-components-angular';
24
+ import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, startWith, switchMap, } from 'rxjs';
25
+ import * as i0 from "@angular/core";
26
+ import * as i1 from "@valtimo/document";
27
+ import * as i2 from "carbon-components-angular";
28
+ import * as i3 from "@angular/forms";
29
+ import * as i4 from "@ngx-translate/core";
30
+ import * as i5 from "@angular/common";
31
+ import * as i6 from "@valtimo/components";
32
+ export class TaskManagementSearchFieldsModalComponent {
33
+ set prefillData(value) {
34
+ this._prefillData = value;
35
+ this.setPrefilledForm(value);
36
+ }
37
+ get prefillData() {
38
+ return this._prefillData;
39
+ }
40
+ get dataType() {
41
+ return this.form.get('dataType');
42
+ }
43
+ get dataTypeValue$() {
44
+ return this.dataType.valueChanges.pipe(startWith(this.dataType.value));
45
+ }
46
+ get matchType() {
47
+ return this.form.get('matchType');
48
+ }
49
+ get matchTypeValue$() {
50
+ return this.matchType.valueChanges.pipe(startWith(this.matchType.value));
51
+ }
52
+ get dropdownDataProvider() {
53
+ return this.form.get('dropdownDataProvider');
54
+ }
55
+ get dropdownDataProviderValue$() {
56
+ return this.dropdownDataProvider.valueChanges.pipe(startWith(this.dropdownDataProvider.value));
57
+ }
58
+ get fieldType() {
59
+ return this.form.get('fieldType');
60
+ }
61
+ get fieldTypeValue$() {
62
+ return this.fieldType.valueChanges.pipe(startWith(this.fieldType.value));
63
+ }
64
+ get keyValue() {
65
+ const controlValue = this.form.get('key')?.value;
66
+ return !controlValue ? null : controlValue;
67
+ }
68
+ get dataTypeValue() {
69
+ const controlValue = this.form.get('dataType')?.value;
70
+ this._dataTypeValue$.next(controlValue?.id);
71
+ return !controlValue ? null : controlValue.id;
72
+ }
73
+ get fieldTypeValue() {
74
+ const controlValue = this.form.get('fieldType')?.value;
75
+ return !controlValue ? null : controlValue.id;
76
+ }
77
+ get dropdownDataProviderValue() {
78
+ const controlValue = this.form.get('dropdownDataProvider')?.value;
79
+ this._dropdownProviderValue$.next(controlValue?.id);
80
+ return !controlValue ? null : controlValue.id;
81
+ }
82
+ get dropdownValuesArray() {
83
+ const formArray = this.form.get('dropdownValues');
84
+ return !formArray ? null : formArray;
85
+ }
86
+ constructor(documentService, iconService, fb, translateService) {
87
+ this.documentService = documentService;
88
+ this.iconService = iconService;
89
+ this.fb = fb;
90
+ this.translateService = translateService;
91
+ this.closeEvent = new EventEmitter();
92
+ this.form = this.fb.group({
93
+ key: this.fb.control('', Validators.required),
94
+ title: this.fb.control('', Validators.required),
95
+ path: this.fb.control('', Validators.required),
96
+ dataType: this.fb.control(null, Validators.required),
97
+ matchType: this.fb.control(null, this.matchTypeValidator),
98
+ fieldType: this.fb.control(null, Validators.required),
99
+ dropdownDataProvider: this.fb.control(null),
100
+ dropdownValues: this.fb.array([]),
101
+ });
102
+ this.TaskListSearchFieldDataType = TaskListSearchFieldDataType;
103
+ this.TaskListSearchFieldFieldType = TaskListSearchFieldFieldType;
104
+ this.TaskListSearchDropdownDataProvider = TaskListSearchDropdownDataProvider;
105
+ this.DROPDOWN_FIELDS = [
106
+ {
107
+ key: 'key',
108
+ label: 'searchFieldsOverview.key',
109
+ viewType: ViewType.TEXT,
110
+ },
111
+ {
112
+ key: 'value',
113
+ label: 'searchFieldsOverview.text',
114
+ viewType: ViewType.TEXT,
115
+ },
116
+ ];
117
+ this._dataTypeValue$ = new BehaviorSubject(null);
118
+ this._dropdownProviderValue$ = new BehaviorSubject(null);
119
+ this.dropdownReadonlyItems$ = this._dropdownProviderValue$.pipe(distinctUntilChanged(), filter(val => !!val && val === TaskListSearchDropdownDataProvider.JSON), switchMap((provider) => this.documentService.getDropdownData(provider ?? '', this.documentDefinitionName ?? '', this.keyValue ?? '')), map(dropdownData => dropdownData ? Object.entries(dropdownData).map(([key, value]) => ({ key, value })) : []));
120
+ this.dataTypeItems$ = combineLatest([
121
+ this.dataTypeValue$,
122
+ this.translateService.stream('key'),
123
+ ]).pipe(map(([dataTypeValue]) => [
124
+ {
125
+ content: this.translateService.instant('searchFields.text'),
126
+ id: TaskListSearchFieldDataType.TEXT,
127
+ },
128
+ {
129
+ content: this.translateService.instant('searchFields.boolean'),
130
+ id: TaskListSearchFieldDataType.BOOLEAN,
131
+ },
132
+ {
133
+ content: this.translateService.instant('searchFields.date'),
134
+ id: TaskListSearchFieldDataType.DATE,
135
+ },
136
+ {
137
+ content: this.translateService.instant('searchFields.datetime'),
138
+ id: TaskListSearchFieldDataType.DATETIME,
139
+ },
140
+ {
141
+ content: this.translateService.instant('searchFields.number'),
142
+ id: TaskListSearchFieldDataType.NUMBER,
143
+ },
144
+ {
145
+ content: this.translateService.instant('searchFields.time'),
146
+ id: TaskListSearchFieldDataType.TIME,
147
+ },
148
+ ].map(item => ({ ...item, selected: item.id === dataTypeValue?.id }))));
149
+ this.fieldTypeItems$ = combineLatest([
150
+ this._dataTypeValue$.pipe(distinctUntilChanged()),
151
+ this.fieldTypeValue$,
152
+ this.translateService.stream('key'),
153
+ ]).pipe(map(([dataTypeValue, fieldTypeValue]) => [
154
+ {
155
+ content: this.translateService.instant('searchFieldsOverview.single'),
156
+ id: TaskListSearchFieldFieldType.SINGLE,
157
+ },
158
+ {
159
+ content: this.translateService.instant('searchFieldsOverview.range'),
160
+ id: TaskListSearchFieldFieldType.RANGE,
161
+ },
162
+ ...(dataTypeValue === TaskListSearchFieldDataType.TEXT
163
+ ? [
164
+ {
165
+ content: this.translateService.instant('searchFieldsOverview.single-select-dropdown'),
166
+ id: TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN,
167
+ },
168
+ {
169
+ content: this.translateService.instant('searchFieldsOverview.multi-select-dropdown'),
170
+ id: TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN,
171
+ },
172
+ ]
173
+ : []),
174
+ ].map(item => ({ ...item, selected: item.id === fieldTypeValue?.id }))));
175
+ this.dataProviderItems$ = this.translateService
176
+ .stream('key')
177
+ .pipe(switchMap(() => this.dropdownDataProviderValue$), map(dataProviderValue => [
178
+ {
179
+ content: this.translateService.instant('searchFieldsOverview.dropdownDatabaseDataProvider'),
180
+ id: TaskListSearchDropdownDataProvider.DATABASE,
181
+ },
182
+ {
183
+ content: this.translateService.instant('searchFieldsOverview.dropdownJsonFileDataProvider'),
184
+ id: TaskListSearchDropdownDataProvider.JSON,
185
+ },
186
+ ].map(item => ({ ...item, selected: item.id === dataProviderValue?.id }))));
187
+ this.matchTypeItems$ = this.translateService
188
+ .stream('key')
189
+ .pipe(switchMap(() => this.matchTypeValue$), map(matchTypeValue => [
190
+ {
191
+ content: this.translateService.instant('searchFieldsOverview.like'),
192
+ id: TaskListSearchFieldMatchType.LIKE,
193
+ },
194
+ {
195
+ content: this.translateService.instant('searchFieldsOverview.exact'),
196
+ id: TaskListSearchFieldMatchType.EXACT,
197
+ },
198
+ ].map(item => ({ ...item, selected: item.id === matchTypeValue?.id }))));
199
+ this.iconService.registerAll([TrashCan16, InformationFilled16]);
200
+ }
201
+ ngOnInit() {
202
+ this.form.setValidators([this.dropdownDataProviderValidator, this.dropdownValuesValidator]);
203
+ }
204
+ addDropdownValue(prefillValue) {
205
+ if (!this.dropdownValuesArray)
206
+ return;
207
+ this.dropdownValuesArray.push(this.fb.group({
208
+ key: this.fb.control(prefillValue?.key ?? '', Validators.required),
209
+ value: this.fb.control(prefillValue?.value ?? '', Validators.required),
210
+ }));
211
+ }
212
+ removeDropdownValue(index) {
213
+ if (!this.dropdownValuesArray)
214
+ return;
215
+ this.dropdownValuesArray.removeAt(index);
216
+ }
217
+ onCancel() {
218
+ this.closeEvent.emit(null);
219
+ this.resetForm();
220
+ }
221
+ onSave() {
222
+ const groupValue = this.form.getRawValue();
223
+ this.closeEvent.emit({
224
+ ...(groupValue.title && { title: groupValue.title }),
225
+ ...(groupValue.key && { key: groupValue.key }),
226
+ ...(groupValue.path && { path: groupValue.path }),
227
+ ...(groupValue.dataType?.content && { dataType: groupValue.dataType.id }),
228
+ ...(groupValue.matchType?.content && { matchType: groupValue.matchType.id }),
229
+ ...(groupValue.fieldType?.content && { fieldType: groupValue.fieldType.id }),
230
+ ...(groupValue.dropdownDataProvider?.content && {
231
+ dropdownDataProvider: groupValue.dropdownDataProvider.id,
232
+ }),
233
+ ...(groupValue.dropdownValues && {
234
+ dropdownValues: groupValue.dropdownValues.reduce((acc, curr) => ({ ...acc, ...(!!curr?.key && { [curr.key]: curr.value }) }), {}),
235
+ }),
236
+ });
237
+ this.resetForm();
238
+ }
239
+ setPrefilledForm(prefillData) {
240
+ if (!prefillData)
241
+ return;
242
+ this.form.patchValue({
243
+ ...prefillData,
244
+ dataType: !prefillData.dataType
245
+ ? null
246
+ : {
247
+ content: prefillData.dataType,
248
+ id: prefillData.dataType,
249
+ selected: true,
250
+ },
251
+ matchType: !prefillData.matchType
252
+ ? null
253
+ : {
254
+ content: prefillData.matchType,
255
+ id: prefillData.matchType,
256
+ selected: true,
257
+ },
258
+ fieldType: !prefillData.fieldType
259
+ ? null
260
+ : {
261
+ content: prefillData.fieldType,
262
+ id: prefillData.fieldType,
263
+ selected: true,
264
+ },
265
+ dropdownDataProvider: !prefillData.dropdownDataProvider
266
+ ? null
267
+ : {
268
+ content: prefillData.dropdownDataProvider,
269
+ id: prefillData.dropdownDataProvider,
270
+ selected: true,
271
+ },
272
+ dropdownValues: [],
273
+ });
274
+ if (prefillData.dropdownDataProvider && prefillData.dropdownValues)
275
+ this.setPrefilledDropdownValues(prefillData.dropdownValues);
276
+ this.form.get('key')?.disable();
277
+ }
278
+ setPrefilledDropdownValues(dropdownValue) {
279
+ if (!this.dropdownValuesArray || !this.dropdownDataProviderValue)
280
+ return;
281
+ Object.entries(dropdownValue).forEach(([key, value]) => {
282
+ this.addDropdownValue({ key, value });
283
+ });
284
+ }
285
+ matchTypeValidator(control) {
286
+ const controlValue = control.value;
287
+ const dataTypeControlValue = control.parent?.get('dataType')?.value;
288
+ if (dataTypeControlValue?.id === TaskListSearchFieldDataType.TEXT &&
289
+ (!controlValue || !controlValue.selected))
290
+ return { error: 'Match type not selected' };
291
+ return null;
292
+ }
293
+ dropdownDataProviderValidator(group) {
294
+ const controlValue = group.get('dropdownDataProvider')?.value;
295
+ const fieldTypeControlValue = group.get('fieldType')?.value;
296
+ if ([
297
+ TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN,
298
+ TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN,
299
+ ].includes(fieldTypeControlValue?.id) &&
300
+ !controlValue)
301
+ return { error: 'Dropdown source provider is not specified' };
302
+ return null;
303
+ }
304
+ dropdownValuesValidator(group) {
305
+ const controlValue = group.get('dropdownValues')?.value;
306
+ const fieldTypeControlValue = group.get('fieldType')?.value?.id;
307
+ const dropdownProviderValue = group.get('dropdownDataProvider')?.value?.id;
308
+ if ([
309
+ TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN,
310
+ TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN,
311
+ ].includes(fieldTypeControlValue) &&
312
+ (!controlValue || controlValue?.length === 0) &&
313
+ dropdownProviderValue === TaskListSearchDropdownDataProvider.DATABASE)
314
+ return { error: 'Dropdown source provider is not specified or is empty' };
315
+ return null;
316
+ }
317
+ resetForm() {
318
+ setTimeout(() => {
319
+ while (!!this.dropdownValuesArray?.length) {
320
+ this.dropdownValuesArray.removeAt(0);
321
+ }
322
+ this.form.reset();
323
+ this.form.enable();
324
+ }, CARBON_CONSTANTS.modalAnimationMs);
325
+ }
326
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TaskManagementSearchFieldsModalComponent, deps: [{ token: i1.DocumentService }, { token: i2.IconService }, { token: i3.FormBuilder }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
327
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: TaskManagementSearchFieldsModalComponent, isStandalone: true, selector: "valtimo-task-management-search-fields-modal", inputs: { open: "open", documentDefinitionName: "documentDefinitionName", prefillData: "prefillData" }, outputs: { closeEvent: "closeEvent" }, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-modal [open]=\"open\" showFooter=\"true\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ (!prefillData ? 'searchFieldsOverview.add' : 'searchFieldsOverview.edit') | translate }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <form [formGroup]=\"form\" class=\"valtimo-task-management-search-fields-modal__content\">\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.title' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input-label>\n\n <input cdsText type=\"text\" formControlName=\"title\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.key' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input-label>\n\n <input cdsText type=\"text\" formControlName=\"key\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.path' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input-label>\n\n <input cdsText type=\"text\" formControlName=\"path\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"dataType\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dataTypeValue === TaskListSearchFieldDataType.TEXT) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"matchType\">\n <cds-dropdown-list [items]=\"matchTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n }\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"fieldType\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (\n dataTypeValue === TaskListSearchFieldDataType.TEXT &&\n (fieldTypeValue === TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN ||\n fieldTypeValue === TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN)\n ) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"dropdownDataProvider\">\n <cds-dropdown-list [items]=\"dataProviderItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.DATABASE) {\n <div\n class=\"valtimo-task-management-search-fields-modal__list\"\n formArrayName=\"dropdownValues\"\n >\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n [noMargin]=\"true\"\n >\n </v-input-label>\n\n @for (dropdownValue of dropdownValuesArray?.controls; track $index) {\n <form\n [formGroup]=\"dropdownValue\"\n class=\"valtimo-task-management-search-fields-modal__dropdown-values\"\n >\n <cds-text-label>\n {{ 'interface.key' | translate }}\n\n <input cdsText type=\"text\" formControlName=\"key\" />\n </cds-text-label>\n\n <cds-text-label>\n {{ 'interface.value' | translate }}\n\n <input cdsText type=\"text\" formControlName=\"value\" />\n </cds-text-label>\n\n <button\n cdsButton=\"danger\"\n [disabled]=\"$count === 1\"\n [iconOnly]=\"true\"\n (click)=\"removeDropdownValue($index)\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </form>\n }\n\n <button cdsButton=\"primary\" (click)=\"addDropdownValue()\">\n {{ 'interface.addRow' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </div>\n } @else if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.JSON) {\n <valtimo-carbon-list\n [header]=\"false\"\n [hideToolbar]=\"true\"\n [fields]=\"DROPDOWN_FIELDS\"\n [items]=\"dropdownReadonlyItems$ | async\"\n ></valtimo-carbon-list>\n }\n }\n </form>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"ghost\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"form.invalid\" (click)=\"onSave()\">\n {{ 'interface.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".valtimo-task-management-search-fields-modal__content,.valtimo-task-management-search-fields-modal__dropdown-values{display:flex;gap:16px}.valtimo-task-management-search-fields-modal__content{flex-direction:column}.valtimo-task-management-search-fields-modal__dropdown-values{align-items:flex-end;gap:16px}.valtimo-task-management-search-fields-modal__label{display:flex;gap:4px}.valtimo-task-management-search-fields-modal__list{display:flex;flex-direction:column;gap:16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i2.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "ngmodule", type: InputModule }, { kind: "component", type: i2.TextInputLabelComponent, selector: "cds-text-label, ibm-text-label", inputs: ["labelInputID", "disabled", "skeleton", "labelTemplate", "textInputTemplate", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i2.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "ngmodule", type: ModalModule }, { kind: "component", type: i2.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i2.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i2.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i2.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i2.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "ngmodule", type: CarbonListModule }, { kind: "component", type: i6.CarbonListComponent, selector: "valtimo-carbon-list", inputs: ["items", "fields", "tableTranslations", "paginatorConfig", "pagination", "loading", "actions", "actionItems", "header", "hideColumnHeader", "initialSortState", "sortState", "isSearchable", "enableSingleSelection", "lastColumnTemplate", "paginationIdentifier", "showSelectionColumn", "striped", "hideToolbar", "lockedTooltipTranslationKey", "movingRowsEnabled", "dragAndDrop", "dragAndDropDisabled"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged", "moveRow", "itemsReordered"] }, { kind: "ngmodule", type: InputLabelModule }, { kind: "component", type: i6.InputLabelComponent, selector: "v-input-label", inputs: ["name", "tooltip", "largeMargin", "small", "noMargin", "title", "titleTranslationKey", "required", "disabled", "carbonTheme"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
328
+ }
329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TaskManagementSearchFieldsModalComponent, decorators: [{
330
+ type: Component,
331
+ args: [{ selector: 'valtimo-task-management-search-fields-modal', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
332
+ CommonModule,
333
+ TranslateModule,
334
+ ButtonModule,
335
+ DropdownModule,
336
+ InputModule,
337
+ ModalModule,
338
+ ReactiveFormsModule,
339
+ IconModule,
340
+ CarbonListModule,
341
+ InputLabelModule,
342
+ ], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<cds-modal [open]=\"open\" showFooter=\"true\">\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"onCancel()\">\n <h3 cdsModalHeaderHeading>\n {{ (!prefillData ? 'searchFieldsOverview.add' : 'searchFieldsOverview.edit') | translate }}\n </h3>\n </cds-modal-header>\n\n <section cdsModalContent>\n <form [formGroup]=\"form\" class=\"valtimo-task-management-search-fields-modal__content\">\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.title' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.title' | translate\"\n >\n </v-input-label>\n\n <input cdsText type=\"text\" formControlName=\"title\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.key' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.key' | translate\"\n >\n </v-input-label>\n\n <input cdsText type=\"text\" formControlName=\"key\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.path' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.path' | translate\"\n >\n </v-input-label>\n\n <input cdsText type=\"text\" formControlName=\"path\" />\n </div>\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dataType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dataType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"dataType\">\n <cds-dropdown-list [items]=\"dataTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dataTypeValue === TaskListSearchFieldDataType.TEXT) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.matchType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.matchType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"matchType\">\n <cds-dropdown-list [items]=\"matchTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n }\n\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.fieldType' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.fieldType' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"fieldType\">\n <cds-dropdown-list [items]=\"fieldTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (\n dataTypeValue === TaskListSearchFieldDataType.TEXT &&\n (fieldTypeValue === TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN ||\n fieldTypeValue === TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN)\n ) {\n <div class=\"valtimo-task-management-search-fields-modal__input\">\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownDataProvider' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownDataProvider' | translate\"\n >\n </v-input-label>\n\n <cds-dropdown formControlName=\"dropdownDataProvider\">\n <cds-dropdown-list [items]=\"dataProviderItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </div>\n\n @if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.DATABASE) {\n <div\n class=\"valtimo-task-management-search-fields-modal__list\"\n formArrayName=\"dropdownValues\"\n >\n <v-input-label\n [title]=\"'searchFieldsOverview.dropdownListValues' | translate\"\n [tooltip]=\"'searchFieldsOverviewTooltips.dropdownListValues' | translate\"\n [noMargin]=\"true\"\n >\n </v-input-label>\n\n @for (dropdownValue of dropdownValuesArray?.controls; track $index) {\n <form\n [formGroup]=\"dropdownValue\"\n class=\"valtimo-task-management-search-fields-modal__dropdown-values\"\n >\n <cds-text-label>\n {{ 'interface.key' | translate }}\n\n <input cdsText type=\"text\" formControlName=\"key\" />\n </cds-text-label>\n\n <cds-text-label>\n {{ 'interface.value' | translate }}\n\n <input cdsText type=\"text\" formControlName=\"value\" />\n </cds-text-label>\n\n <button\n cdsButton=\"danger\"\n [disabled]=\"$count === 1\"\n [iconOnly]=\"true\"\n (click)=\"removeDropdownValue($index)\"\n >\n <svg class=\"cds--btn__icon\" cdsIcon=\"trash-can\" size=\"16\"></svg>\n </button>\n </form>\n }\n\n <button cdsButton=\"primary\" (click)=\"addDropdownValue()\">\n {{ 'interface.addRow' | translate }}\n\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n </button>\n </div>\n } @else if (dropdownDataProviderValue === TaskListSearchDropdownDataProvider.JSON) {\n <valtimo-carbon-list\n [header]=\"false\"\n [hideToolbar]=\"true\"\n [fields]=\"DROPDOWN_FIELDS\"\n [items]=\"dropdownReadonlyItems$ | async\"\n ></valtimo-carbon-list>\n }\n }\n </form>\n </section>\n\n <cds-modal-footer>\n <button cdsButton=\"ghost\" (click)=\"onCancel()\">\n {{ 'interface.cancel' | translate }}\n </button>\n\n <button cdsButton=\"primary\" [disabled]=\"form.invalid\" (click)=\"onSave()\">\n {{ 'interface.save' | translate }}\n </button>\n </cds-modal-footer>\n</cds-modal>\n", styles: [".valtimo-task-management-search-fields-modal__content,.valtimo-task-management-search-fields-modal__dropdown-values{display:flex;gap:16px}.valtimo-task-management-search-fields-modal__content{flex-direction:column}.valtimo-task-management-search-fields-modal__dropdown-values{align-items:flex-end;gap:16px}.valtimo-task-management-search-fields-modal__label{display:flex;gap:4px}.valtimo-task-management-search-fields-modal__list{display:flex;flex-direction:column;gap:16px}\n/*!\n * Copyright 2015-2024 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n"] }]
343
+ }], ctorParameters: () => [{ type: i1.DocumentService }, { type: i2.IconService }, { type: i3.FormBuilder }, { type: i4.TranslateService }], propDecorators: { open: [{
344
+ type: Input,
345
+ args: [{ required: true }]
346
+ }], documentDefinitionName: [{
347
+ type: Input,
348
+ args: [{ required: true }]
349
+ }], prefillData: [{
350
+ type: Input
351
+ }], closeEvent: [{
352
+ type: Output
353
+ }] } });
354
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vdGFzay1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsbUJBQW1CLEVBRW5CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBbUIsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUVoQixnQkFBZ0IsRUFDaEIsUUFBUSxHQUNULE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUNMLGtDQUFrQyxFQUdsQywyQkFBMkIsRUFDM0IsNEJBQTRCLEVBQzVCLDRCQUE0QixHQUM3QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsWUFBWSxFQUNaLGNBQWMsRUFDZCxVQUFVLEVBRVYsV0FBVyxFQUVYLFdBQVcsR0FDWixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sR0FBRyxFQUVILFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7O0FBcUJkLE1BQU0sT0FBTyx3Q0FBd0M7SUFLbkQsSUFBb0IsV0FBVyxDQUFDLEtBQWlDO1FBQy9ELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBY0QsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsSUFBVywwQkFBMEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBTUQsSUFBVyxRQUFRO1FBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUVqRCxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUN0RCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFNUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBRXZELE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBVyx5QkFBeUI7UUFDbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDbEUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFcEQsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLG1CQUFtQjtRQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWxELE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUUsU0FBdUIsQ0FBQztJQUN0RCxDQUFDO0lBa0pELFlBQ21CLGVBQWdDLEVBQ2hDLFdBQXdCLEVBQ3hCLEVBQWUsRUFDZixnQkFBa0M7UUFIbEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBak8zQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXVDLENBQUM7UUFFL0QsU0FBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25DLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBUyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNyRCxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQVMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDdkQsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFTLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3RELFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBa0IsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDckUsU0FBUyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFrQixJQUFJLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQzFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBa0IsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDdEUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQWtCLElBQUksQ0FBQztZQUM1RCxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQStCLEVBQUUsQ0FBQztTQUNoRSxDQUFDLENBQUM7UUE4QmEsZ0NBQTJCLEdBQUcsMkJBQTJCLENBQUM7UUFDMUQsaUNBQTRCLEdBQUcsNEJBQTRCLENBQUM7UUFDNUQsdUNBQWtDLEdBQUcsa0NBQWtDLENBQUM7UUFrQ3hFLG9CQUFlLEdBQW1CO1lBQ2hEO2dCQUNFLEdBQUcsRUFBRSxLQUFLO2dCQUNWLEtBQUssRUFBRSwwQkFBMEI7Z0JBQ2pDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSTthQUN4QjtZQUNEO2dCQUNFLEdBQUcsRUFBRSxPQUFPO2dCQUNaLEtBQUssRUFBRSwyQkFBMkI7Z0JBQ2xDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSTthQUN4QjtTQUNGLENBQUM7UUFFZSxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUVwRCxJQUFJLENBQUMsQ0FBQztRQUVTLDRCQUF1QixHQUFHLElBQUksZUFBZSxDQUU1RCxJQUFJLENBQUMsQ0FBQztRQUNRLDJCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQ3hFLG9CQUFvQixFQUFFLEVBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxFQUN2RSxTQUFTLENBQUMsQ0FBQyxRQUErRCxFQUFFLEVBQUUsQ0FDNUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQ2xDLFFBQVEsSUFBSSxFQUFFLEVBQ2QsSUFBSSxDQUFDLHNCQUFzQixJQUFJLEVBQUUsRUFDakMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQ3BCLENBQ0YsRUFDRCxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FDakIsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUN2RixDQUNGLENBQUM7UUFFYyxtQkFBYyxHQUEyQixhQUFhLENBQUM7WUFDckUsSUFBSSxDQUFDLGNBQWM7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDcEMsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsQ0FDdEI7WUFDRTtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztnQkFDM0QsRUFBRSxFQUFFLDJCQUEyQixDQUFDLElBQUk7YUFDckM7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztnQkFDOUQsRUFBRSxFQUFFLDJCQUEyQixDQUFDLE9BQU87YUFDeEM7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztnQkFDM0QsRUFBRSxFQUFFLDJCQUEyQixDQUFDLElBQUk7YUFDckM7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztnQkFDL0QsRUFBRSxFQUFFLDJCQUEyQixDQUFDLFFBQVE7YUFDekM7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztnQkFDN0QsRUFBRSxFQUFFLDJCQUEyQixDQUFDLE1BQU07YUFDdkM7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztnQkFDM0QsRUFBRSxFQUFFLDJCQUEyQixDQUFDLElBQUk7YUFDckM7U0FDRixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxhQUFhLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUNwRSxDQUNGLENBQUM7UUFFYyxvQkFBZSxHQUEyQixhQUFhLENBQUM7WUFDdEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsZUFBZTtZQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNwQyxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FDdEM7WUFDRTtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQztnQkFDckUsRUFBRSxFQUFFLDRCQUE0QixDQUFDLE1BQU07YUFDeEM7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQztnQkFDcEUsRUFBRSxFQUFFLDRCQUE0QixDQUFDLEtBQUs7YUFDdkM7WUFDRCxHQUFHLENBQUMsYUFBYSxLQUFLLDJCQUEyQixDQUFDLElBQUk7Z0JBQ3BELENBQUMsQ0FBQztvQkFDRTt3QkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FDcEMsNkNBQTZDLENBQzlDO3dCQUNELEVBQUUsRUFBRSw0QkFBNEIsQ0FBQyxzQkFBc0I7cUJBQ3hEO29CQUNEO3dCQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUNwQyw0Q0FBNEMsQ0FDN0M7d0JBQ0QsRUFBRSxFQUFFLDRCQUE0QixDQUFDLHFCQUFxQjtxQkFDdkQ7aUJBQ0Y7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxLQUFLLGNBQWMsRUFBRSxFQUFFLEVBQUMsQ0FBQyxDQUFDLENBQ3JFLENBQ0YsQ0FBQztRQUVjLHVCQUFrQixHQUEyQixJQUFJLENBQUMsZ0JBQWdCO2FBQy9FLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDYixJQUFJLENBQ0gsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxFQUNoRCxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUN0QjtZQUNFO2dCQUNFLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUNwQyxtREFBbUQsQ0FDcEQ7Z0JBQ0QsRUFBRSxFQUFFLGtDQUFrQyxDQUFDLFFBQVE7YUFDaEQ7WUFDRDtnQkFDRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FDcEMsbURBQW1ELENBQ3BEO2dCQUNELEVBQUUsRUFBRSxrQ0FBa0MsQ0FBQyxJQUFJO2FBQzVDO1NBQ0YsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssaUJBQWlCLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUN4RSxDQUNGLENBQUM7UUFFWSxvQkFBZSxHQUEyQixJQUFJLENBQUMsZ0JBQWdCO2FBQzVFLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDYixJQUFJLENBQ0gsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFDckMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQ25CO1lBQ0U7Z0JBQ0UsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUM7Z0JBQ25FLEVBQUUsRUFBRSw0QkFBNEIsQ0FBQyxJQUFJO2FBQ3RDO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUM7Z0JBQ3BFLEVBQUUsRUFBRSw0QkFBNEIsQ0FBQyxLQUFLO2FBQ3ZDO1NBQ0YsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssY0FBYyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUMsQ0FDckUsQ0FDRixDQUFDO1FBUUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsWUFBMkM7UUFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUI7WUFBRSxPQUFPO1FBRXRDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQzNCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ1osR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbEUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDdkUsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRU0sbUJBQW1CLENBQUMsS0FBYTtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtZQUFFLE9BQU87UUFFdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU0sUUFBUTtRQUNiLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU0sTUFBTTtRQUNYLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBQyxDQUFDO1lBQ2xELEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLEVBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUMsQ0FBQztZQUM1QyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxFQUFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFDLENBQUM7WUFDL0MsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxJQUFJLEVBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFDLENBQUM7WUFDdkUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxJQUFJLEVBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFDLENBQUM7WUFDMUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxJQUFJLEVBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFDLENBQUM7WUFDMUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLElBQUk7Z0JBQzlDLG9CQUFvQixFQUFFLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO2FBQ3pELENBQUM7WUFDRixHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsSUFBSTtnQkFDL0IsY0FBYyxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUM5QyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksRUFBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQ3ZFLEVBQUUsQ0FDSDthQUNGLENBQUM7U0FDSCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFdBQXVDO1FBQzlELElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTztRQUV6QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNuQixHQUFHLFdBQVc7WUFDZCxRQUFRLEVBQUUsQ0FBQyxXQUFXLENBQUMsUUFBUTtnQkFDN0IsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDO29CQUNFLE9BQU8sRUFBRSxXQUFXLENBQUMsUUFBUTtvQkFDN0IsRUFBRSxFQUFFLFdBQVcsQ0FBQyxRQUFRO29CQUN4QixRQUFRLEVBQUUsSUFBSTtpQkFDZjtZQUNMLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTO2dCQUMvQixDQUFDLENBQUMsSUFBSTtnQkFDTixDQUFDLENBQUM7b0JBQ0UsT0FBTyxFQUFFLFdBQVcsQ0FBQyxTQUFTO29CQUM5QixFQUFFLEVBQUUsV0FBVyxDQUFDLFNBQVM7b0JBQ3pCLFFBQVEsRUFBRSxJQUFJO2lCQUNmO1lBQ0wsU0FBUyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVM7Z0JBQy9CLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQztvQkFDRSxPQUFPLEVBQUUsV0FBVyxDQUFDLFNBQVM7b0JBQzlCLEVBQUUsRUFBRSxXQUFXLENBQUMsU0FBUztvQkFDekIsUUFBUSxFQUFFLElBQUk7aUJBQ2Y7WUFDTCxvQkFBb0IsRUFBRSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0I7Z0JBQ3JELENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQztvQkFDRSxPQUFPLEVBQUUsV0FBVyxDQUFDLG9CQUFvQjtvQkFDekMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxvQkFBb0I7b0JBQ3BDLFFBQVEsRUFBRSxJQUFJO2lCQUNmO1lBQ0wsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxXQUFXLENBQUMsb0JBQW9CLElBQUksV0FBVyxDQUFDLGNBQWM7WUFDaEUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sMEJBQTBCLENBQUMsYUFBMEM7UUFDM0UsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUI7WUFBRSxPQUFPO1FBRXpFLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxPQUF3QjtRQUNqRCxNQUFNLFlBQVksR0FBeUIsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUN6RCxNQUFNLG9CQUFvQixHQUN4QixPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUM7UUFFekMsSUFDRSxvQkFBb0IsRUFBRSxFQUFFLEtBQUssMkJBQTJCLENBQUMsSUFBSTtZQUM3RCxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztZQUV6QyxPQUFPLEVBQUMsS0FBSyxFQUFFLHlCQUF5QixFQUFDLENBQUM7UUFFNUMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sNkJBQTZCLENBQUMsS0FBdUI7UUFDM0QsTUFBTSxZQUFZLEdBQXlCLEtBQUssQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDcEYsTUFBTSxxQkFBcUIsR0FBZ0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLENBQUM7UUFFekYsSUFDRTtZQUNFLDRCQUE0QixDQUFDLHNCQUFzQjtZQUNuRCw0QkFBNEIsQ0FBQyxxQkFBcUI7U0FDbkQsQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLENBQUMsWUFBWTtZQUViLE9BQU8sRUFBQyxLQUFLLEVBQUUsMkNBQTJDLEVBQUMsQ0FBQztRQUU5RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxLQUF1QjtRQUNyRCxNQUFNLFlBQVksR0FDaEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssQ0FBQztRQUNyQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNoRSxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBRTNFLElBQ0U7WUFDRSw0QkFBNEIsQ0FBQyxzQkFBc0I7WUFDbkQsNEJBQTRCLENBQUMscUJBQXFCO1NBQ25ELENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1lBQ2pDLENBQUMsQ0FBQyxZQUFZLElBQUksWUFBWSxFQUFFLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDN0MscUJBQXFCLEtBQUssa0NBQWtDLENBQUMsUUFBUTtZQUVyRSxPQUFPLEVBQUMsS0FBSyxFQUFFLHVEQUF1RCxFQUFDLENBQUM7UUFFMUUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sU0FBUztRQUNmLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixDQUFDLEVBQUUsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN4QyxDQUFDOzhHQTdZVSx3Q0FBd0M7a0dBQXhDLHdDQUF3QyxzUEN6RnJELGt3TkFpTEEsbXBDRHBHSSxZQUFZLG1GQUNaLGVBQWUsMkZBQ2YsWUFBWSxnTUFDWixjQUFjLG1yQkFDZCxXQUFXLDJhQUNYLFdBQVcsK3NCQUNYLG1CQUFtQixtakNBQ25CLFVBQVUsNE5BQ1YsZ0JBQWdCLGtvQkFDaEIsZ0JBQWdCOzsyRkFHUCx3Q0FBd0M7a0JBbkJwRCxTQUFTOytCQUNFLDZDQUE2QyxtQkFHdEMsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxXQUFXO3dCQUNYLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQixVQUFVO3dCQUNWLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3FCQUNqQjt1S0FHd0IsSUFBSTtzQkFBNUIsS0FBSzt1QkFBQyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUM7Z0JBQ0Usc0JBQXNCO3NCQUE5QyxLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztnQkFHSCxXQUFXO3NCQUE5QixLQUFLO2dCQU9JLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1BcnJheSxcbiAgRm9ybUJ1aWxkZXIsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7SW5mb3JtYXRpb25GaWxsZWQxNiwgVHJhc2hDYW4xNn0gZnJvbSAnQGNhcmJvbi9pY29ucyc7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICBDQVJCT05fQ09OU1RBTlRTLFxuICBDYXJib25MaXN0TW9kdWxlLFxuICBDb2x1bW5Db25maWcsXG4gIElucHV0TGFiZWxNb2R1bGUsXG4gIFZpZXdUeXBlLFxufSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1xuICBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICBUYXNrTGlzdFNlYXJjaERyb3Bkb3duVmFsdWUsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGQsXG4gIFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZSxcbiAgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZSxcbiAgVGFza0xpc3RTZWFyY2hGaWVsZE1hdGNoVHlwZSxcbn0gZnJvbSAnQHZhbHRpbW8vdGFzayc7XG5pbXBvcnQge1xuICBCdXR0b25Nb2R1bGUsXG4gIERyb3Bkb3duTW9kdWxlLFxuICBJY29uTW9kdWxlLFxuICBJY29uU2VydmljZSxcbiAgSW5wdXRNb2R1bGUsXG4gIExpc3RJdGVtLFxuICBNb2RhbE1vZHVsZSxcbn0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG59IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBEcm9wZG93bk1vZHVsZSxcbiAgICBJbnB1dE1vZHVsZSxcbiAgICBNb2RhbE1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEljb25Nb2R1bGUsXG4gICAgQ2FyYm9uTGlzdE1vZHVsZSxcbiAgICBJbnB1dExhYmVsTW9kdWxlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNrTWFuYWdlbWVudFNlYXJjaEZpZWxkc01vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pIG9wZW46IGJvb2xlYW47XG4gIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KSBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfcHJlZmlsbERhdGE6IFRhc2tMaXN0U2VhcmNoRmllbGQgfCBudWxsO1xuICBASW5wdXQoKSBwdWJsaWMgc2V0IHByZWZpbGxEYXRhKHZhbHVlOiBUYXNrTGlzdFNlYXJjaEZpZWxkIHwgbnVsbCkge1xuICAgIHRoaXMuX3ByZWZpbGxEYXRhID0gdmFsdWU7XG4gICAgdGhpcy5zZXRQcmVmaWxsZWRGb3JtKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHByZWZpbGxEYXRhKCk6IFRhc2tMaXN0U2VhcmNoRmllbGQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZmlsbERhdGE7XG4gIH1cbiAgQE91dHB1dCgpIGNsb3NlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFBhcnRpYWw8VGFza0xpc3RTZWFyY2hGaWVsZD4gfCBudWxsPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAga2V5OiB0aGlzLmZiLmNvbnRyb2w8c3RyaW5nPignJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgdGl0bGU6IHRoaXMuZmIuY29udHJvbDxzdHJpbmc+KCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBwYXRoOiB0aGlzLmZiLmNvbnRyb2w8c3RyaW5nPignJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgZGF0YVR5cGU6IHRoaXMuZmIuY29udHJvbDxMaXN0SXRlbSB8IG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIG1hdGNoVHlwZTogdGhpcy5mYi5jb250cm9sPExpc3RJdGVtIHwgbnVsbD4obnVsbCwgdGhpcy5tYXRjaFR5cGVWYWxpZGF0b3IpLFxuICAgIGZpZWxkVHlwZTogdGhpcy5mYi5jb250cm9sPExpc3RJdGVtIHwgbnVsbD4obnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgZHJvcGRvd25EYXRhUHJvdmlkZXI6IHRoaXMuZmIuY29udHJvbDxMaXN0SXRlbSB8IG51bGw+KG51bGwpLFxuICAgIGRyb3Bkb3duVmFsdWVzOiB0aGlzLmZiLmFycmF5PHtrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZ30+KFtdKSxcbiAgfSk7XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBBYnN0cmFjdENvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2RhdGFUeXBlJyk7XG4gIH1cbiAgcHVibGljIGdldCBkYXRhVHlwZVZhbHVlJCgpOiBPYnNlcnZhYmxlPExpc3RJdGVtIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFUeXBlLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmRhdGFUeXBlLnZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1hdGNoVHlwZSgpOiBBYnN0cmFjdENvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ21hdGNoVHlwZScpO1xuICB9XG4gIHB1YmxpYyBnZXQgbWF0Y2hUeXBlVmFsdWUkKCk6IE9ic2VydmFibGU8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hUeXBlLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLm1hdGNoVHlwZS52YWx1ZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBkcm9wZG93bkRhdGFQcm92aWRlcigpOiBBYnN0cmFjdENvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duRGF0YVByb3ZpZGVyJyk7XG4gIH1cbiAgcHVibGljIGdldCBkcm9wZG93bkRhdGFQcm92aWRlclZhbHVlJCgpOiBPYnNlcnZhYmxlPExpc3RJdGVtIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyLnZhbHVlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkVHlwZSgpOiBBYnN0cmFjdENvbnRyb2w8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2ZpZWxkVHlwZScpO1xuICB9XG4gIHB1YmxpYyBnZXQgZmllbGRUeXBlVmFsdWUkKCk6IE9ic2VydmFibGU8TGlzdEl0ZW0gfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGRUeXBlLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmZpZWxkVHlwZS52YWx1ZSkpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZSA9IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZTtcbiAgcHVibGljIHJlYWRvbmx5IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUgPSBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlciA9IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXI7XG5cbiAgcHVibGljIGdldCBrZXlWYWx1ZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCdrZXknKT8udmFsdWU7XG5cbiAgICByZXR1cm4gIWNvbnRyb2xWYWx1ZSA/IG51bGwgOiBjb250cm9sVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFUeXBlVmFsdWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldCgnZGF0YVR5cGUnKT8udmFsdWU7XG4gICAgdGhpcy5fZGF0YVR5cGVWYWx1ZSQubmV4dChjb250cm9sVmFsdWU/LmlkKTtcblxuICAgIHJldHVybiAhY29udHJvbFZhbHVlID8gbnVsbCA6IGNvbnRyb2xWYWx1ZS5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRUeXBlVmFsdWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5mb3JtLmdldCgnZmllbGRUeXBlJyk/LnZhbHVlO1xuXG4gICAgcmV0dXJuICFjb250cm9sVmFsdWUgPyBudWxsIDogY29udHJvbFZhbHVlLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBkcm9wZG93bkRhdGFQcm92aWRlclZhbHVlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoJ2Ryb3Bkb3duRGF0YVByb3ZpZGVyJyk/LnZhbHVlO1xuICAgIHRoaXMuX2Ryb3Bkb3duUHJvdmlkZXJWYWx1ZSQubmV4dChjb250cm9sVmFsdWU/LmlkKTtcblxuICAgIHJldHVybiAhY29udHJvbFZhbHVlID8gbnVsbCA6IGNvbnRyb2xWYWx1ZS5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZHJvcGRvd25WYWx1ZXNBcnJheSgpOiBGb3JtQXJyYXkgfCBudWxsIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdkcm9wZG93blZhbHVlcycpO1xuXG4gICAgcmV0dXJuICFmb3JtQXJyYXkgPyBudWxsIDogKGZvcm1BcnJheSBhcyBGb3JtQXJyYXkpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IERST1BET1dOX0ZJRUxEUzogQ29sdW1uQ29uZmlnW10gPSBbXG4gICAge1xuICAgICAga2V5OiAna2V5JyxcbiAgICAgIGxhYmVsOiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcua2V5JyxcbiAgICAgIHZpZXdUeXBlOiBWaWV3VHlwZS5URVhULFxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAndmFsdWUnLFxuICAgICAgbGFiZWw6ICdzZWFyY2hGaWVsZHNPdmVydmlldy50ZXh0JyxcbiAgICAgIHZpZXdUeXBlOiBWaWV3VHlwZS5URVhULFxuICAgIH0sXG4gIF07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGF0YVR5cGVWYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgPihudWxsKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kcm9wZG93blByb3ZpZGVyVmFsdWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuICA+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgZHJvcGRvd25SZWFkb25seUl0ZW1zJCA9IHRoaXMuX2Ryb3Bkb3duUHJvdmlkZXJWYWx1ZSQucGlwZShcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIGZpbHRlcih2YWwgPT4gISF2YWwgJiYgdmFsID09PSBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLkpTT04pLFxuICAgIHN3aXRjaE1hcCgocHJvdmlkZXI6IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIgfCBudWxsIHwgdW5kZWZpbmVkKSA9PlxuICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0RHJvcGRvd25EYXRhKFxuICAgICAgICBwcm92aWRlciA/PyAnJyxcbiAgICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lID8/ICcnLFxuICAgICAgICB0aGlzLmtleVZhbHVlID8/ICcnXG4gICAgICApXG4gICAgKSxcbiAgICBtYXAoZHJvcGRvd25EYXRhID0+XG4gICAgICBkcm9wZG93bkRhdGEgPyBPYmplY3QuZW50cmllcyhkcm9wZG93bkRhdGEpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe2tleSwgdmFsdWV9KSkgOiBbXVxuICAgIClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGF0YVR5cGVJdGVtcyQ6IE9ic2VydmFibGU8TGlzdEl0ZW1bXT4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRhdGFUeXBlVmFsdWUkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2RhdGFUeXBlVmFsdWVdKSA9PlxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy50ZXh0JyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhULFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy5ib29sZWFuJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5CT09MRUFOLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy5kYXRlJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5EQVRFLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy5kYXRldGltZScpLFxuICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuREFURVRJTUUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzLm51bWJlcicpLFxuICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuTlVNQkVSLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkcy50aW1lJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5USU1FLFxuICAgICAgICB9LFxuICAgICAgXS5tYXAoaXRlbSA9PiAoey4uLml0ZW0sIHNlbGVjdGVkOiBpdGVtLmlkID09PSBkYXRhVHlwZVZhbHVlPy5pZH0pKVxuICAgIClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZmllbGRUeXBlSXRlbXMkOiBPYnNlcnZhYmxlPExpc3RJdGVtW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fZGF0YVR5cGVWYWx1ZSQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKSxcbiAgICB0aGlzLmZpZWxkVHlwZVZhbHVlJCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtkYXRhVHlwZVZhbHVlLCBmaWVsZFR5cGVWYWx1ZV0pID0+XG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzT3ZlcnZpZXcuc2luZ2xlJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuU0lOR0xFLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnJhbmdlJyksXG4gICAgICAgICAgaWQ6IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuUkFOR0UsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLihkYXRhVHlwZVZhbHVlID09PSBUYXNrTGlzdFNlYXJjaEZpZWxkRGF0YVR5cGUuVEVYVFxuICAgICAgICAgID8gW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgICAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuc2luZ2xlLXNlbGVjdC1kcm9wZG93bidcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLlNJTkdMRV9TRUxFQ1RfRFJPUERPV04sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICdzZWFyY2hGaWVsZHNPdmVydmlldy5tdWx0aS1zZWxlY3QtZHJvcGRvd24nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBpZDogVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5NVUxUSV9TRUxFQ1RfRFJPUERPV04sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdLm1hcChpdGVtID0+ICh7Li4uaXRlbSwgc2VsZWN0ZWQ6IGl0ZW0uaWQgPT09IGZpZWxkVHlwZVZhbHVlPy5pZH0pKVxuICAgIClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGF0YVByb3ZpZGVySXRlbXMkOiBPYnNlcnZhYmxlPExpc3RJdGVtW10+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgLnN0cmVhbSgna2V5JylcbiAgICAucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUkKSxcbiAgICAgIG1hcChkYXRhUHJvdmlkZXJWYWx1ZSA9PlxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICdzZWFyY2hGaWVsZHNPdmVydmlldy5kcm9wZG93bkRhdGFiYXNlRGF0YVByb3ZpZGVyJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLkRBVEFCQVNFLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICdzZWFyY2hGaWVsZHNPdmVydmlldy5kcm9wZG93bkpzb25GaWxlRGF0YVByb3ZpZGVyJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLkpTT04sXG4gICAgICAgICAgfSxcbiAgICAgICAgXS5tYXAoaXRlbSA9PiAoey4uLml0ZW0sIHNlbGVjdGVkOiBpdGVtLmlkID09PSBkYXRhUHJvdmlkZXJWYWx1ZT8uaWR9KSlcbiAgICAgIClcbiAgICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBtYXRjaFR5cGVJdGVtcyQ6IE9ic2VydmFibGU8TGlzdEl0ZW1bXT4gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VcbiAgICAuc3RyZWFtKCdrZXknKVxuICAgIC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMubWF0Y2hUeXBlVmFsdWUkKSxcbiAgICAgIG1hcChtYXRjaFR5cGVWYWx1ZSA9PlxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3NlYXJjaEZpZWxkc092ZXJ2aWV3Lmxpa2UnKSxcbiAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkTWF0Y2hUeXBlLkxJS0UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnc2VhcmNoRmllbGRzT3ZlcnZpZXcuZXhhY3QnKSxcbiAgICAgICAgICAgIGlkOiBUYXNrTGlzdFNlYXJjaEZpZWxkTWF0Y2hUeXBlLkVYQUNULFxuICAgICAgICAgIH0sXG4gICAgICAgIF0ubWFwKGl0ZW0gPT4gKHsuLi5pdGVtLCBzZWxlY3RlZDogaXRlbS5pZCA9PT0gbWF0Y2hUeXBlVmFsdWU/LmlkfSkpXG4gICAgICApXG4gICAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50U2VydmljZTogRG9jdW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvblNlcnZpY2U6IEljb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLmljb25TZXJ2aWNlLnJlZ2lzdGVyQWxsKFtUcmFzaENhbjE2LCBJbmZvcm1hdGlvbkZpbGxlZDE2XSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLnNldFZhbGlkYXRvcnMoW3RoaXMuZHJvcGRvd25EYXRhUHJvdmlkZXJWYWxpZGF0b3IsIHRoaXMuZHJvcGRvd25WYWx1ZXNWYWxpZGF0b3JdKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGREcm9wZG93blZhbHVlKHByZWZpbGxWYWx1ZT86IHtrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZ30pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheSkgcmV0dXJuO1xuXG4gICAgdGhpcy5kcm9wZG93blZhbHVlc0FycmF5LnB1c2goXG4gICAgICB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAga2V5OiB0aGlzLmZiLmNvbnRyb2wocHJlZmlsbFZhbHVlPy5rZXkgPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgICB2YWx1ZTogdGhpcy5mYi5jb250cm9sKHByZWZpbGxWYWx1ZT8udmFsdWUgPz8gJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZURyb3Bkb3duVmFsdWUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcm9wZG93blZhbHVlc0FycmF5KSByZXR1cm47XG5cbiAgICB0aGlzLmRyb3Bkb3duVmFsdWVzQXJyYXkucmVtb3ZlQXQoaW5kZXgpO1xuICB9XG5cbiAgcHVibGljIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VFdmVudC5lbWl0KG51bGwpO1xuICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gIH1cblxuICBwdWJsaWMgb25TYXZlKCk6IHZvaWQge1xuICAgIGNvbnN0IGdyb3VwVmFsdWUgPSB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICB0aGlzLmNsb3NlRXZlbnQuZW1pdCh7XG4gICAgICAuLi4oZ3JvdXBWYWx1ZS50aXRsZSAmJiB7dGl0bGU6IGdyb3VwVmFsdWUudGl0bGV9KSxcbiAgICAgIC4uLihncm91cFZhbHVlLmtleSAmJiB7a2V5OiBncm91cFZhbHVlLmtleX0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUucGF0aCAmJiB7cGF0aDogZ3JvdXBWYWx1ZS5wYXRofSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5kYXRhVHlwZT8uY29udGVudCAmJiB7ZGF0YVR5cGU6IGdyb3VwVmFsdWUuZGF0YVR5cGUuaWR9KSxcbiAgICAgIC4uLihncm91cFZhbHVlLm1hdGNoVHlwZT8uY29udGVudCAmJiB7bWF0Y2hUeXBlOiBncm91cFZhbHVlLm1hdGNoVHlwZS5pZH0pLFxuICAgICAgLi4uKGdyb3VwVmFsdWUuZmllbGRUeXBlPy5jb250ZW50ICYmIHtmaWVsZFR5cGU6IGdyb3VwVmFsdWUuZmllbGRUeXBlLmlkfSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5kcm9wZG93bkRhdGFQcm92aWRlcj8uY29udGVudCAmJiB7XG4gICAgICAgIGRyb3Bkb3duRGF0YVByb3ZpZGVyOiBncm91cFZhbHVlLmRyb3Bkb3duRGF0YVByb3ZpZGVyLmlkLFxuICAgICAgfSksXG4gICAgICAuLi4oZ3JvdXBWYWx1ZS5kcm9wZG93blZhbHVlcyAmJiB7XG4gICAgICAgIGRyb3Bkb3duVmFsdWVzOiBncm91cFZhbHVlLmRyb3Bkb3duVmFsdWVzLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBjdXJyKSA9PiAoey4uLmFjYywgLi4uKCEhY3Vycj8ua2V5ICYmIHtbY3Vyci5rZXldOiBjdXJyLnZhbHVlfSl9KSxcbiAgICAgICAgICB7fVxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcmVmaWxsZWRGb3JtKHByZWZpbGxEYXRhOiBUYXNrTGlzdFNlYXJjaEZpZWxkIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghcHJlZmlsbERhdGEpIHJldHVybjtcblxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIC4uLnByZWZpbGxEYXRhLFxuICAgICAgZGF0YVR5cGU6ICFwcmVmaWxsRGF0YS5kYXRhVHlwZVxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBjb250ZW50OiBwcmVmaWxsRGF0YS5kYXRhVHlwZSxcbiAgICAgICAgICAgIGlkOiBwcmVmaWxsRGF0YS5kYXRhVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICBtYXRjaFR5cGU6ICFwcmVmaWxsRGF0YS5tYXRjaFR5cGVcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDoge1xuICAgICAgICAgICAgY29udGVudDogcHJlZmlsbERhdGEubWF0Y2hUeXBlLFxuICAgICAgICAgICAgaWQ6IHByZWZpbGxEYXRhLm1hdGNoVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICBmaWVsZFR5cGU6ICFwcmVmaWxsRGF0YS5maWVsZFR5cGVcbiAgICAgICAgPyBudWxsXG4gICAgICAgIDoge1xuICAgICAgICAgICAgY29udGVudDogcHJlZmlsbERhdGEuZmllbGRUeXBlLFxuICAgICAgICAgICAgaWQ6IHByZWZpbGxEYXRhLmZpZWxkVHlwZSxcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICBkcm9wZG93bkRhdGFQcm92aWRlcjogIXByZWZpbGxEYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHByZWZpbGxEYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICAgICAgICAgICAgaWQ6IHByZWZpbGxEYXRhLmRyb3Bkb3duRGF0YVByb3ZpZGVyLFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgIGRyb3Bkb3duVmFsdWVzOiBbXSxcbiAgICB9KTtcblxuICAgIGlmIChwcmVmaWxsRGF0YS5kcm9wZG93bkRhdGFQcm92aWRlciAmJiBwcmVmaWxsRGF0YS5kcm9wZG93blZhbHVlcylcbiAgICAgIHRoaXMuc2V0UHJlZmlsbGVkRHJvcGRvd25WYWx1ZXMocHJlZmlsbERhdGEuZHJvcGRvd25WYWx1ZXMpO1xuICAgIHRoaXMuZm9ybS5nZXQoJ2tleScpPy5kaXNhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldFByZWZpbGxlZERyb3Bkb3duVmFsdWVzKGRyb3Bkb3duVmFsdWU6IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25WYWx1ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcm9wZG93blZhbHVlc0FycmF5IHx8ICF0aGlzLmRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUpIHJldHVybjtcblxuICAgIE9iamVjdC5lbnRyaWVzKGRyb3Bkb3duVmFsdWUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgdGhpcy5hZGREcm9wZG93blZhbHVlKHtrZXksIHZhbHVlfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoVHlwZVZhbGlkYXRvcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBudWxsIHwge1trZXk6IHN0cmluZ106IHN0cmluZ30ge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZTogTGlzdEl0ZW0gfCB1bmRlZmluZWQgPSBjb250cm9sLnZhbHVlO1xuICAgIGNvbnN0IGRhdGFUeXBlQ29udHJvbFZhbHVlOiBMaXN0SXRlbSB8IG51bGwgfCB1bmRlZmluZWQgPVxuICAgICAgY29udHJvbC5wYXJlbnQ/LmdldCgnZGF0YVR5cGUnKT8udmFsdWU7XG5cbiAgICBpZiAoXG4gICAgICBkYXRhVHlwZUNvbnRyb2xWYWx1ZT8uaWQgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUICYmXG4gICAgICAoIWNvbnRyb2xWYWx1ZSB8fCAhY29udHJvbFZhbHVlLnNlbGVjdGVkKVxuICAgIClcbiAgICAgIHJldHVybiB7ZXJyb3I6ICdNYXRjaCB0eXBlIG5vdCBzZWxlY3RlZCd9O1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsaWRhdG9yKGdyb3VwOiB0eXBlb2YgdGhpcy5mb3JtKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgY29uc3QgY29udHJvbFZhbHVlOiBMaXN0SXRlbSB8IHVuZGVmaW5lZCA9IGdyb3VwLmdldCgnZHJvcGRvd25EYXRhUHJvdmlkZXInKT8udmFsdWU7XG4gICAgY29uc3QgZmllbGRUeXBlQ29udHJvbFZhbHVlOiBMaXN0SXRlbSB8IG51bGwgfCB1bmRlZmluZWQgPSBncm91cC5nZXQoJ2ZpZWxkVHlwZScpPy52YWx1ZTtcblxuICAgIGlmIChcbiAgICAgIFtcbiAgICAgICAgVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOLFxuICAgICAgICBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLk1VTFRJX1NFTEVDVF9EUk9QRE9XTixcbiAgICAgIF0uaW5jbHVkZXMoZmllbGRUeXBlQ29udHJvbFZhbHVlPy5pZCkgJiZcbiAgICAgICFjb250cm9sVmFsdWVcbiAgICApXG4gICAgICByZXR1cm4ge2Vycm9yOiAnRHJvcGRvd24gc291cmNlIHByb3ZpZGVyIGlzIG5vdCBzcGVjaWZpZWQnfTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBkcm9wZG93blZhbHVlc1ZhbGlkYXRvcihncm91cDogdHlwZW9mIHRoaXMuZm9ybSk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIGNvbnN0IGNvbnRyb2xWYWx1ZToge2tleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nfVtdIHwgdW5kZWZpbmVkID1cbiAgICAgIGdyb3VwLmdldCgnZHJvcGRvd25WYWx1ZXMnKT8udmFsdWU7XG4gICAgY29uc3QgZmllbGRUeXBlQ29udHJvbFZhbHVlID0gZ3JvdXAuZ2V0KCdmaWVsZFR5cGUnKT8udmFsdWU/LmlkO1xuICAgIGNvbnN0IGRyb3Bkb3duUHJvdmlkZXJWYWx1ZSA9IGdyb3VwLmdldCgnZHJvcGRvd25EYXRhUHJvdmlkZXInKT8udmFsdWU/LmlkO1xuXG4gICAgaWYgKFxuICAgICAgW1xuICAgICAgICBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLlNJTkdMRV9TRUxFQ1RfRFJPUERPV04sXG4gICAgICAgIFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuTVVMVElfU0VMRUNUX0RST1BET1dOLFxuICAgICAgXS5pbmNsdWRlcyhmaWVsZFR5cGVDb250cm9sVmFsdWUpICYmXG4gICAgICAoIWNvbnRyb2xWYWx1ZSB8fCBjb250cm9sVmFsdWU/Lmxlbmd0aCA9PT0gMCkgJiZcbiAgICAgIGRyb3Bkb3duUHJvdmlkZXJWYWx1ZSA9PT0gVGFza0xpc3RTZWFyY2hEcm9wZG93bkRhdGFQcm92aWRlci5EQVRBQkFTRVxuICAgIClcbiAgICAgIHJldHVybiB7ZXJyb3I6ICdEcm9wZG93biBzb3VyY2UgcHJvdmlkZXIgaXMgbm90IHNwZWNpZmllZCBvciBpcyBlbXB0eSd9O1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHdoaWxlICghIXRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheT8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25WYWx1ZXNBcnJheS5yZW1vdmVBdCgwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgICAgdGhpcy5mb3JtLmVuYWJsZSgpO1xuICAgIH0sIENBUkJPTl9DT05TVEFOVFMubW9kYWxBbmltYXRpb25Ncyk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cbjxjZHMtbW9kYWwgW29wZW5dPVwib3BlblwiIHNob3dGb290ZXI9XCJ0cnVlXCI+XG4gIDxjZHMtbW9kYWwtaGVhZGVyIFtzaG93Q2xvc2VCdXR0b25dPVwidHJ1ZVwiIChjbG9zZVNlbGVjdCk9XCJvbkNhbmNlbCgpXCI+XG4gICAgPGgzIGNkc01vZGFsSGVhZGVySGVhZGluZz5cbiAgICAgIHt7ICghcHJlZmlsbERhdGEgPyAnc2VhcmNoRmllbGRzT3ZlcnZpZXcuYWRkJyA6ICdzZWFyY2hGaWVsZHNPdmVydmlldy5lZGl0JykgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2gzPlxuICA8L2Nkcy1tb2RhbC1oZWFkZXI+XG5cbiAgPHNlY3Rpb24gY2RzTW9kYWxDb250ZW50PlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwidmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbF9fY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2lucHV0XCI+XG4gICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy50aXRsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLnRpdGxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxpbnB1dCBjZHNUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMua2V5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxpbnB1dCBjZHNUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbF9faW5wdXRcIj5cbiAgICAgICAgPHYtaW5wdXQtbGFiZWxcbiAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LnBhdGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5wYXRoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxpbnB1dCBjZHNUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2lucHV0XCI+XG4gICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5kYXRhVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFt0b29sdGlwXT1cIidzZWFyY2hGaWVsZHNPdmVydmlld1Rvb2x0aXBzLmRhdGFUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZGF0YVR5cGVcIj5cbiAgICAgICAgICA8Y2RzLWRyb3Bkb3duLWxpc3QgW2l0ZW1zXT1cImRhdGFUeXBlSXRlbXMkIHwgYXN5bmNcIj48L2Nkcy1kcm9wZG93bi1saXN0PlxuICAgICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKGRhdGFUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3Lm1hdGNoVHlwZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMubWF0Y2hUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwibWF0Y2hUeXBlXCI+XG4gICAgICAgICAgICA8Y2RzLWRyb3Bkb3duLWxpc3QgW2l0ZW1zXT1cIm1hdGNoVHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICA8di1pbnB1dC1sYWJlbFxuICAgICAgICAgIFt0aXRsZV09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXcuZmllbGRUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZmllbGRUeXBlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgPC92LWlucHV0LWxhYmVsPlxuXG4gICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZmllbGRUeXBlXCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJmaWVsZFR5cGVJdGVtcyQgfCBhc3luY1wiPjwvY2RzLWRyb3Bkb3duLWxpc3Q+XG4gICAgICAgIDwvY2RzLWRyb3Bkb3duPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoXG4gICAgICAgIGRhdGFUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGREYXRhVHlwZS5URVhUICYmXG4gICAgICAgIChmaWVsZFR5cGVWYWx1ZSA9PT0gVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOIHx8XG4gICAgICAgICAgZmllbGRUeXBlVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuTVVMVElfU0VMRUNUX0RST1BET1dOKVxuICAgICAgKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19pbnB1dFwiPlxuICAgICAgICAgIDx2LWlucHV0LWxhYmVsXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmRyb3Bkb3duRGF0YVByb3ZpZGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInc2VhcmNoRmllbGRzT3ZlcnZpZXdUb29sdGlwcy5kcm9wZG93bkRhdGFQcm92aWRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3YtaW5wdXQtbGFiZWw+XG5cbiAgICAgICAgICA8Y2RzLWRyb3Bkb3duIGZvcm1Db250cm9sTmFtZT1cImRyb3Bkb3duRGF0YVByb3ZpZGVyXCI+XG4gICAgICAgICAgICA8Y2RzLWRyb3Bkb3duLWxpc3QgW2l0ZW1zXT1cImRhdGFQcm92aWRlckl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChkcm9wZG93bkRhdGFQcm92aWRlclZhbHVlID09PSBUYXNrTGlzdFNlYXJjaERyb3Bkb3duRGF0YVByb3ZpZGVyLkRBVEFCQVNFKSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLW1vZGFsX19saXN0XCJcbiAgICAgICAgICAgIGZvcm1BcnJheU5hbWU9XCJkcm9wZG93blZhbHVlc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHYtaW5wdXQtbGFiZWxcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5kcm9wZG93bkxpc3RWYWx1ZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3VG9vbHRpcHMuZHJvcGRvd25MaXN0VmFsdWVzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtub01hcmdpbl09XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvdi1pbnB1dC1sYWJlbD5cblxuICAgICAgICAgICAgQGZvciAoZHJvcGRvd25WYWx1ZSBvZiBkcm9wZG93blZhbHVlc0FycmF5Py5jb250cm9sczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJkcm9wZG93blZhbHVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWxfX2Ryb3Bkb3duLXZhbHVlc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Y2RzLXRleHQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICB7eyAnaW50ZXJmYWNlLmtleScgfCB0cmFuc2xhdGUgfX1cblxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNkc1RleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIiAvPlxuICAgICAgICAgICAgICAgIDwvY2RzLXRleHQtbGFiZWw+XG5cbiAgICAgICAgICAgICAgICA8Y2RzLXRleHQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICB7eyAnaW50ZXJmYWNlLnZhbHVlJyB8IHRyYW5zbGF0ZSB9fVxuXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgY2RzVGV4dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Nkcy10ZXh0LWxhYmVsPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2RzQnV0dG9uPVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIkY291bnQgPT09IDFcIlxuICAgICAgICAgICAgICAgICAgW2ljb25Pbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZURyb3Bkb3duVmFsdWUoJGluZGV4KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNkcy0tYnRuX19pY29uXCIgY2RzSWNvbj1cInRyYXNoLWNhblwiIHNpemU9XCIxNlwiPjwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDxidXR0b24gY2RzQnV0dG9uPVwicHJpbWFyeVwiIChjbGljayk9XCJhZGREcm9wZG93blZhbHVlKClcIj5cbiAgICAgICAgICAgICAge3sgJ2ludGVyZmFjZS5hZGRSb3cnIHwgdHJhbnNsYXRlIH19XG5cbiAgICAgICAgICAgICAgPHN2ZyBjZHNJY29uPVwiYWRkXCIgc2l6ZT1cIjE2XCIgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiPjwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2UgaWYgKGRyb3Bkb3duRGF0YVByb3ZpZGVyVmFsdWUgPT09IFRhc2tMaXN0U2VhcmNoRHJvcGRvd25EYXRhUHJvdmlkZXIuSlNPTikge1xuICAgICAgICAgIDx2YWx0aW1vLWNhcmJvbi1saXN0XG4gICAgICAgICAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtoaWRlVG9vbGJhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtmaWVsZHNdPVwiRFJPUERPV05fRklFTERTXCJcbiAgICAgICAgICAgIFtpdGVtc109XCJkcm9wZG93blJlYWRvbmx5SXRlbXMkIHwgYXN5bmNcIlxuICAgICAgICAgID48L3ZhbHRpbW8tY2FyYm9uLWxpc3Q+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Zvcm0+XG4gIDwvc2VjdGlvbj5cblxuICA8Y2RzLW1vZGFsLWZvb3Rlcj5cbiAgICA8YnV0dG9uIGNkc0J1dHRvbj1cImdob3N0XCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgIHt7ICdpbnRlcmZhY2UuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGJ1dHRvbiBjZHNCdXR0b249XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiIChjbGljayk9XCJvblNhdmUoKVwiPlxuICAgICAge3sgJ2ludGVyZmFjZS5zYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L2Nkcy1tb2RhbD5cbiJdfQ==
@@ -15,7 +15,8 @@
15
15
  */
16
16
  var TaskManagementTab;
17
17
  (function (TaskManagementTab) {
18
- TaskManagementTab[TaskManagementTab["COLUMNS"] = 0] = "COLUMNS";
18
+ TaskManagementTab["COLUMNS"] = "columns";
19
+ TaskManagementTab["SEARCH_FIELDS"] = "searchFields";
19
20
  })(TaskManagementTab || (TaskManagementTab = {}));
20
21
  export { TaskManagementTab };
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrLW1hbmFnZW1lbnQvc3JjL2xpYi9tb2RlbHMvdGFzay1tYW5hZ2VtZW50Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsSUFBSyxpQkFFSjtBQUZELFdBQUssaUJBQWlCO0lBQ3BCLCtEQUFPLENBQUE7QUFDVCxDQUFDLEVBRkksaUJBQWlCLEtBQWpCLGlCQUFpQixRQUVyQjtBQUVELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZW51bSBUYXNrTWFuYWdlbWVudFRhYiB7XG4gIENPTFVNTlMsXG59XG5cbmV4cG9ydCB7VGFza01hbmFnZW1lbnRUYWJ9O1xuIl19
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrLW1hbmFnZW1lbnQvc3JjL2xpYi9tb2RlbHMvdGFzay1tYW5hZ2VtZW50Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsSUFBSyxpQkFHSjtBQUhELFdBQUssaUJBQWlCO0lBQ3BCLHdDQUFtQixDQUFBO0lBQ25CLG1EQUE4QixDQUFBO0FBQ2hDLENBQUMsRUFISSxpQkFBaUIsS0FBakIsaUJBQWlCLFFBR3JCO0FBRUQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5lbnVtIFRhc2tNYW5hZ2VtZW50VGFiIHtcbiAgQ09MVU1OUyA9ICdjb2x1bW5zJyxcbiAgU0VBUkNIX0ZJRUxEUyA9ICdzZWFyY2hGaWVsZHMnLFxufVxuXG5leHBvcnQge1Rhc2tNYW5hZ2VtZW50VGFifTtcbiJdfQ==
@@ -15,4 +15,5 @@
15
15
  */
16
16
  export * from './task-management.service';
17
17
  export * from './task-management-api.service';
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2stbWFuYWdlbWVudC9zcmMvbGliL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi90YXNrLW1hbmFnZW1lbnQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3Rhc2stbWFuYWdlbWVudC1hcGkuc2VydmljZSc7XG4iXX0=
18
+ export * from './task-management-search-fields.service';
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2stbWFuYWdlbWVudC9zcmMvbGliL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMseUNBQXlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3Rhc2stbWFuYWdlbWVudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdGFzay1tYW5hZ2VtZW50LWFwaS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuc2VydmljZSc7XG4iXX0=
@@ -0,0 +1,47 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BaseApiService } from '@valtimo/config';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common/http";
5
+ import * as i2 from "@valtimo/config";
6
+ export class TaskManagementSearchFieldsService extends BaseApiService {
7
+ constructor(httpClient, configService) {
8
+ super(httpClient, configService);
9
+ this.httpClient = httpClient;
10
+ this.configService = configService;
11
+ }
12
+ setDocumentDefinitionName(documentDefinitionName) {
13
+ this._documentDefinitionName = documentDefinitionName;
14
+ }
15
+ getTaskListSearchFields() {
16
+ return this.httpClient.get(this.getApiUrl(`/v1/search/field/TaskListSearchColumns/${this._documentDefinitionName}`));
17
+ }
18
+ createTaskListSearchField(searchField) {
19
+ return this.httpClient.post(this.getApiUrl(`/v1/search/field/${this._documentDefinitionName}`), {
20
+ ...searchField,
21
+ ownerType: 'TaskListSearchColumns',
22
+ ownerId: this._documentDefinitionName,
23
+ });
24
+ }
25
+ updateTaskListSearchField(searchField) {
26
+ return this.httpClient.put(this.getApiUrl(`/v1/search/field/${this._documentDefinitionName}/${searchField.key}`), {
27
+ ...searchField,
28
+ ownerType: 'TaskListSearchColumns',
29
+ ownerId: this._documentDefinitionName,
30
+ });
31
+ }
32
+ deleteTaskListSearchField(searchFieldKey) {
33
+ return this.httpClient.delete(this.getApiUrl(`/v1/search/field/TaskListSearchColumns/${this._documentDefinitionName}/${searchFieldKey}`));
34
+ }
35
+ orderTaskListSearchFields(searchFields) {
36
+ return this.httpClient.put(this.getApiUrl(`/v1/search/field/${this._documentDefinitionName}/fields`), searchFields);
37
+ }
38
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TaskManagementSearchFieldsService, deps: [{ token: i1.HttpClient }, { token: i2.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
39
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TaskManagementSearchFieldsService, providedIn: 'root' }); }
40
+ }
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TaskManagementSearchFieldsService, decorators: [{
42
+ type: Injectable,
43
+ args: [{
44
+ providedIn: 'root',
45
+ }]
46
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.ConfigService }] });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vdGFzay1tYW5hZ2VtZW50L3NyYy9saWIvc2VydmljZXMvdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsY0FBYyxFQUFnQixNQUFNLGlCQUFpQixDQUFDOzs7O0FBTzlELE1BQU0sT0FBTyxpQ0FBa0MsU0FBUSxjQUFjO0lBR25FLFlBQ3FCLFVBQXNCLEVBQ3RCLGFBQTRCO1FBRS9DLEtBQUssQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFIZCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO0lBR2pELENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxzQkFBOEI7UUFDN0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0lBQ3hELENBQUM7SUFFTSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQywwQ0FBMEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FDekYsQ0FBQztJQUNKLENBQUM7SUFFTSx5QkFBeUIsQ0FDOUIsV0FBZ0M7UUFFaEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsRUFDbEU7WUFDRSxHQUFHLFdBQVc7WUFDZCxTQUFTLEVBQUUsdUJBQXVCO1lBQ2xDLE9BQU8sRUFBRSxJQUFJLENBQUMsdUJBQXVCO1NBQ3RDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSx5QkFBeUIsQ0FDOUIsV0FBZ0M7UUFFaEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLHVCQUF1QixJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUNyRjtZQUNFLEdBQUcsV0FBVztZQUNkLFNBQVMsRUFBRSx1QkFBdUI7WUFDbEMsT0FBTyxFQUFFLElBQUksQ0FBQyx1QkFBdUI7U0FDdEMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLHlCQUF5QixDQUFDLGNBQXNCO1FBQ3JELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQzNCLElBQUksQ0FBQyxTQUFTLENBQ1osMENBQTBDLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxjQUFjLEVBQUUsQ0FDM0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLHlCQUF5QixDQUFDLFlBQW1DO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLElBQUksQ0FBQyx1QkFBdUIsU0FBUyxDQUFDLEVBQ3pFLFlBQVksQ0FDYixDQUFDO0lBQ0osQ0FBQzs4R0EzRFUsaUNBQWlDO2tIQUFqQyxpQ0FBaUMsY0FGaEMsTUFBTTs7MkZBRVAsaUNBQWlDO2tCQUg3QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmFzZUFwaVNlcnZpY2UsIENvbmZpZ1NlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL2NvbmZpZyc7XG5pbXBvcnQge1Rhc2tMaXN0U2VhcmNoRmllbGR9IGZyb20gJ0B2YWx0aW1vL3Rhc2snO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFRhc2tNYW5hZ2VtZW50U2VhcmNoRmllbGRzU2VydmljZSBleHRlbmRzIEJhc2VBcGlTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGh0dHBDbGllbnQsIGNvbmZpZ1NlcnZpY2UpO1xuICB9XG5cbiAgcHVibGljIHNldERvY3VtZW50RGVmaW5pdGlvbk5hbWUoZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9IGRvY3VtZW50RGVmaW5pdGlvbk5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFza0xpc3RTZWFyY2hGaWVsZHMoKTogT2JzZXJ2YWJsZTxUYXNrTGlzdFNlYXJjaEZpZWxkW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxUYXNrTGlzdFNlYXJjaEZpZWxkW10+KFxuICAgICAgdGhpcy5nZXRBcGlVcmwoYC92MS9zZWFyY2gvZmllbGQvVGFza0xpc3RTZWFyY2hDb2x1bW5zLyR7dGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZX1gKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVGFza0xpc3RTZWFyY2hGaWVsZChcbiAgICBzZWFyY2hGaWVsZDogVGFza0xpc3RTZWFyY2hGaWVsZFxuICApOiBPYnNlcnZhYmxlPFRhc2tMaXN0U2VhcmNoRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8VGFza0xpc3RTZWFyY2hGaWVsZD4oXG4gICAgICB0aGlzLmdldEFwaVVybChgL3YxL3NlYXJjaC9maWVsZC8ke3RoaXMuX2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9YCksXG4gICAgICB7XG4gICAgICAgIC4uLnNlYXJjaEZpZWxkLFxuICAgICAgICBvd25lclR5cGU6ICdUYXNrTGlzdFNlYXJjaENvbHVtbnMnLFxuICAgICAgICBvd25lcklkOiB0aGlzLl9kb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlVGFza0xpc3RTZWFyY2hGaWVsZChcbiAgICBzZWFyY2hGaWVsZDogVGFza0xpc3RTZWFyY2hGaWVsZFxuICApOiBPYnNlcnZhYmxlPFRhc2tMaXN0U2VhcmNoRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnB1dDxUYXNrTGlzdFNlYXJjaEZpZWxkPihcbiAgICAgIHRoaXMuZ2V0QXBpVXJsKGAvdjEvc2VhcmNoL2ZpZWxkLyR7dGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vJHtzZWFyY2hGaWVsZC5rZXl9YCksXG4gICAgICB7XG4gICAgICAgIC4uLnNlYXJjaEZpZWxkLFxuICAgICAgICBvd25lclR5cGU6ICdUYXNrTGlzdFNlYXJjaENvbHVtbnMnLFxuICAgICAgICBvd25lcklkOiB0aGlzLl9kb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlVGFza0xpc3RTZWFyY2hGaWVsZChzZWFyY2hGaWVsZEtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5kZWxldGU8dm9pZD4oXG4gICAgICB0aGlzLmdldEFwaVVybChcbiAgICAgICAgYC92MS9zZWFyY2gvZmllbGQvVGFza0xpc3RTZWFyY2hDb2x1bW5zLyR7dGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vJHtzZWFyY2hGaWVsZEtleX1gXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvcmRlclRhc2tMaXN0U2VhcmNoRmllbGRzKHNlYXJjaEZpZWxkczogVGFza0xpc3RTZWFyY2hGaWVsZFtdKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucHV0PGFueVtdPihcbiAgICAgIHRoaXMuZ2V0QXBpVXJsKGAvdjEvc2VhcmNoL2ZpZWxkLyR7dGhpcy5fZG9jdW1lbnREZWZpbml0aW9uTmFtZX0vZmllbGRzYCksXG4gICAgICBzZWFyY2hGaWVsZHNcbiAgICApO1xuICB9XG59XG4iXX0=