@valtimo/task-management 12.0.0 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,176 @@
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 } from '@angular/core';
18
+ import { TranslateModule } from '@ngx-translate/core';
19
+ import { CarbonListModule, ConfirmationModalModule, ViewType, } from '@valtimo/components';
20
+ import { TaskListSearchFieldFieldType, } from '@valtimo/task';
21
+ import { ButtonModule, IconModule } from 'carbon-components-angular';
22
+ import { BehaviorSubject, combineLatest, filter, map, of, switchMap, take, tap, } from 'rxjs';
23
+ import { TaskManagementSearchFieldsModalComponent } from '../task-management-search-fields-modal/task-management-search-fields-modal.component';
24
+ import * as i0 from "@angular/core";
25
+ import * as i1 from "@valtimo/document";
26
+ import * as i2 from "@angular/router";
27
+ import * as i3 from "../../services";
28
+ import * as i4 from "@ngx-translate/core";
29
+ import * as i5 from "@angular/common";
30
+ import * as i6 from "@valtimo/components";
31
+ import * as i7 from "carbon-components-angular";
32
+ export class TaskManagementSearchFieldsComponent {
33
+ constructor(documentService, route, searchFieldsService, trasnlateService) {
34
+ this.documentService = documentService;
35
+ this.route = route;
36
+ this.searchFieldsService = searchFieldsService;
37
+ this.trasnlateService = trasnlateService;
38
+ this.documentDefinitionName$ = this.route.params.pipe(map(params => params.name || ''), filter(docDefName => !!docDefName), tap((docDefName) => this.searchFieldsService.setDocumentDefinitionName(docDefName)));
39
+ this._refresh$ = new BehaviorSubject(null);
40
+ this.searchFields$ = combineLatest([
41
+ this.documentDefinitionName$,
42
+ this._refresh$,
43
+ this.trasnlateService.stream('key'),
44
+ ]).pipe(switchMap(() => this.searchFieldsService.getTaskListSearchFields()), map((searchFields) => this.mapTranslations(searchFields)));
45
+ this.fields$ = this.trasnlateService.stream('key').pipe(map(() => [
46
+ {
47
+ key: 'title',
48
+ label: 'searchFieldsOverview.title',
49
+ viewType: ViewType.TEXT,
50
+ },
51
+ {
52
+ key: 'key',
53
+ label: 'searchFieldsOverview.key',
54
+ viewType: ViewType.TEXT,
55
+ },
56
+ {
57
+ key: 'path',
58
+ label: 'searchFieldsOverview.path',
59
+ viewType: ViewType.TEXT,
60
+ },
61
+ {
62
+ key: 'dataTypeTranslation',
63
+ label: 'searchFieldsOverview.dataType',
64
+ viewType: ViewType.TEXT,
65
+ },
66
+ {
67
+ key: 'fieldTypeTranslation',
68
+ label: 'searchFieldsOverview.fieldType',
69
+ viewType: ViewType.TEXT,
70
+ },
71
+ ]));
72
+ this.deleteModalOpen$ = new BehaviorSubject(false);
73
+ this.fieldModalOpen$ = new BehaviorSubject(false);
74
+ this.itemToDelete$ = new BehaviorSubject(null);
75
+ this.prefillData$ = new BehaviorSubject(null);
76
+ this.ACTION_ITEMS = [
77
+ {
78
+ label: 'interface.edit',
79
+ callback: this.editField.bind(this),
80
+ type: 'normal',
81
+ },
82
+ {
83
+ label: 'interface.delete',
84
+ callback: this.deleteField.bind(this),
85
+ type: 'danger',
86
+ },
87
+ ];
88
+ }
89
+ editField(item) {
90
+ if (!!item.dropdownDataProvider) {
91
+ this.documentService
92
+ .getDropdownData(item.dropdownDataProvider, item.ownerId, item.key)
93
+ .pipe(take(1))
94
+ .subscribe(dropdownValues => {
95
+ item.dropdownValues = dropdownValues;
96
+ this.prefillData$.next(item);
97
+ this.fieldModalOpen$.next(true);
98
+ });
99
+ return;
100
+ }
101
+ this.prefillData$.next(item);
102
+ this.fieldModalOpen$.next(true);
103
+ }
104
+ onItemsReordered(event) {
105
+ this.searchFieldsService
106
+ .orderTaskListSearchFields(event)
107
+ .pipe(take(1))
108
+ .subscribe(() => this._refresh$.next(null));
109
+ }
110
+ onAddButtonClick() {
111
+ this.fieldModalOpen$.next(true);
112
+ }
113
+ onCloseEvent(searchField, prefillData) {
114
+ this.fieldModalOpen$.next(false);
115
+ this.prefillData$.next(null);
116
+ if (!searchField)
117
+ return;
118
+ const hasDropdownValues = searchField.fieldType === TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN ||
119
+ searchField.fieldType === TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN;
120
+ (!prefillData
121
+ ? this.searchFieldsService.createTaskListSearchField(searchField)
122
+ : this.searchFieldsService.updateTaskListSearchField(searchField))
123
+ .pipe(take(1), switchMap((field) => {
124
+ return hasDropdownValues
125
+ ? this.documentService.postDropdownData(field.dropdownDataProvider ?? '', field.ownerId, field.key, searchField.dropdownValues ?? {})
126
+ : of(field);
127
+ }))
128
+ .subscribe(() => this._refresh$.next(null));
129
+ }
130
+ onDeleteFieldConfirm(item) {
131
+ if (!item)
132
+ return;
133
+ this.searchFieldsService
134
+ .deleteTaskListSearchField(item.key)
135
+ .pipe(take(1), switchMap(() => item.dropdownDataProvider
136
+ ? this.documentService.deleteDropdownData(item.dropdownDataProvider, item.ownerId, item.key)
137
+ : of()))
138
+ .subscribe(() => this._refresh$.next(null));
139
+ }
140
+ deleteField(item) {
141
+ this.itemToDelete$.next(item);
142
+ this.deleteModalOpen$.next(true);
143
+ }
144
+ mapTranslations(searchFields) {
145
+ return searchFields.map((searchField) => ({
146
+ ...searchField,
147
+ dataTypeTranslation: this.trasnlateService.instant(`searchFields.${searchField.dataType.toLowerCase()}`),
148
+ fieldTypeTranslation: this.trasnlateService.instant(`searchFieldsOverview.${this.fieldTypeTranslation(searchField.fieldType)}`),
149
+ }));
150
+ }
151
+ fieldTypeTranslation(fieldType) {
152
+ switch (fieldType) {
153
+ case TaskListSearchFieldFieldType.SINGLE_SELECT_DROPDOWN:
154
+ return 'single-select-dropdown';
155
+ case TaskListSearchFieldFieldType.MULTI_SELECT_DROPDOWN:
156
+ return 'multi-select-dropdown';
157
+ default:
158
+ return fieldType.toLowerCase();
159
+ }
160
+ }
161
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TaskManagementSearchFieldsComponent, deps: [{ token: i1.DocumentService }, { token: i2.ActivatedRoute }, { token: i3.TaskManagementSearchFieldsService }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
162
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: TaskManagementSearchFieldsComponent, isStandalone: true, selector: "valtimo-task-management-search-fields", 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\n<ng-container\n *ngIf=\"{\n fieldModalOpen: fieldModalOpen$ | async,\n fields: fields$ | async,\n itemToDelete: itemToDelete$ | async,\n prefillData: prefillData$ | async,\n searchFields: searchFields$ | async\n } as obs\"\n>\n <valtimo-carbon-list\n [actionItems]=\"ACTION_ITEMS\"\n [fields]=\"obs.fields\"\n [items]=\"obs.searchFields\"\n [dragAndDrop]=\"true\"\n (itemsReordered)=\"onItemsReordered($event)\"\n (rowClicked)=\"editField($event)\"\n >\n <ng-container carbonToolbarContent>\n <ng-container [ngTemplateOutlet]=\"addButton\"></ng-container>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addButton\"\n [description]=\"'searchFieldsOverview.noSearchfieldsDescription' | translate\"\n [title]=\"'searchFieldsOverview.noSearchfieldsTitle' | translate\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n\n <valtimo-task-management-search-fields-modal\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [open]=\"obs.fieldModalOpen\"\n [prefillData]=\"obs.prefillData\"\n (closeEvent)=\"onCloseEvent($event, obs.prefillData)\"\n ></valtimo-task-management-search-fields-modal>\n\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"interface.delete\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"searchFieldsOverview.deleteSearchFieldConfirmation\"\n [outputOnConfirm]=\"obs.itemToDelete\"\n [showModalSubject$]=\"deleteModalOpen$\"\n titleTranslationKey=\"searchFieldsOverview.deleteSearchField\"\n (confirmEvent)=\"onDeleteFieldConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-container>\n\n<ng-template #addButton>\n <button cdsButton=\"primary\" (click)=\"onAddButtonClick()\">\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFieldsOverview.add' | translate }}\n </button>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { 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: "component", type: i6.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i7.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "ngmodule", type: IconModule }, { kind: "directive", type: i7.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: TaskManagementSearchFieldsModalComponent, selector: "valtimo-task-management-search-fields-modal", inputs: ["open", "documentDefinitionName", "prefillData"], outputs: ["closeEvent"] }, { kind: "ngmodule", type: ConfirmationModalModule }, { kind: "component", type: i6.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
163
+ }
164
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: TaskManagementSearchFieldsComponent, decorators: [{
165
+ type: Component,
166
+ args: [{ selector: 'valtimo-task-management-search-fields', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
167
+ CommonModule,
168
+ TranslateModule,
169
+ CarbonListModule,
170
+ ButtonModule,
171
+ IconModule,
172
+ TaskManagementSearchFieldsModalComponent,
173
+ ConfirmationModalModule,
174
+ ], 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\n<ng-container\n *ngIf=\"{\n fieldModalOpen: fieldModalOpen$ | async,\n fields: fields$ | async,\n itemToDelete: itemToDelete$ | async,\n prefillData: prefillData$ | async,\n searchFields: searchFields$ | async\n } as obs\"\n>\n <valtimo-carbon-list\n [actionItems]=\"ACTION_ITEMS\"\n [fields]=\"obs.fields\"\n [items]=\"obs.searchFields\"\n [dragAndDrop]=\"true\"\n (itemsReordered)=\"onItemsReordered($event)\"\n (rowClicked)=\"editField($event)\"\n >\n <ng-container carbonToolbarContent>\n <ng-container [ngTemplateOutlet]=\"addButton\"></ng-container>\n </ng-container>\n\n <valtimo-no-results\n [action]=\"addButton\"\n [description]=\"'searchFieldsOverview.noSearchfieldsDescription' | translate\"\n [title]=\"'searchFieldsOverview.noSearchfieldsTitle' | translate\"\n ></valtimo-no-results>\n </valtimo-carbon-list>\n\n <valtimo-task-management-search-fields-modal\n [documentDefinitionName]=\"documentDefinitionName$ | async\"\n [open]=\"obs.fieldModalOpen\"\n [prefillData]=\"obs.prefillData\"\n (closeEvent)=\"onCloseEvent($event, obs.prefillData)\"\n ></valtimo-task-management-search-fields-modal>\n\n <valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"interface.delete\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"searchFieldsOverview.deleteSearchFieldConfirmation\"\n [outputOnConfirm]=\"obs.itemToDelete\"\n [showModalSubject$]=\"deleteModalOpen$\"\n titleTranslationKey=\"searchFieldsOverview.deleteSearchField\"\n (confirmEvent)=\"onDeleteFieldConfirm($event)\"\n ></valtimo-confirmation-modal>\n</ng-container>\n\n<ng-template #addButton>\n <button cdsButton=\"primary\" (click)=\"onAddButtonClick()\">\n <svg cdsIcon=\"add\" size=\"16\" class=\"cds--btn__icon\"></svg>\n\n {{ 'searchFieldsOverview.add' | translate }}\n </button>\n</ng-template>\n" }]
175
+ }], ctorParameters: () => [{ type: i1.DocumentService }, { type: i2.ActivatedRoute }, { type: i3.TaskManagementSearchFieldsService }, { type: i4.TranslateService }] });
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrLW1hbmFnZW1lbnQvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzL3Rhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vdGFzay1tYW5hZ2VtZW50L3NyYy9saWIvY29tcG9uZW50cy90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBQyxlQUFlLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDdEUsT0FBTyxFQUVMLGdCQUFnQixFQUVoQix1QkFBdUIsRUFDdkIsUUFBUSxHQUNULE1BQU0scUJBQXFCLENBQUM7QUFFN0IsT0FBTyxFQUdMLDRCQUE0QixHQUM3QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsWUFBWSxFQUFFLFVBQVUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLE1BQU0sRUFDTixHQUFHLEVBRUgsRUFBRSxFQUNGLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFDLHdDQUF3QyxFQUFDLE1BQU0sc0ZBQXNGLENBQUM7Ozs7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LDRCQUE0QixDQUFDLHFCQUFxQjtnQkFDckQsT0FBTyx1QkFBdUIsQ0FBQztZQUNqQztnQkFDRSxPQUFPLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQzs4R0FyTFUsbUNBQW1DO2tHQUFuQyxtQ0FBbUMsaUdDOURoRCxzZ0ZBcUVBLDJDRGhCSSxZQUFZLDhWQUNaLGVBQWUsMkZBQ2YsZ0JBQWdCLHcxQkFDaEIsWUFBWSxnTUFDWixVQUFVLDZOQUNWLHdDQUF3QywyS0FDeEMsdUJBQXVCOzsyRkFHZCxtQ0FBbUM7a0JBZi9DLFNBQVM7K0JBQ0UsdUNBQXVDLG1CQUVoQyx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLFVBQVU7d0JBQ1Ysd0NBQXdDO3dCQUN4Qyx1QkFBdUI7cUJBQ3hCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICBBY3Rpb25JdGVtLFxuICBDYXJib25MaXN0TW9kdWxlLFxuICBDb2x1bW5Db25maWcsXG4gIENvbmZpcm1hdGlvbk1vZGFsTW9kdWxlLFxuICBWaWV3VHlwZSxcbn0gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge0RvY3VtZW50U2VydmljZX0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtcbiAgVGFza0xpc3RTZWFyY2hEcm9wZG93blZhbHVlLFxuICBUYXNrTGlzdFNlYXJjaEZpZWxkLFxuICBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLFxufSBmcm9tICdAdmFsdGltby90YXNrJztcbmltcG9ydCB7QnV0dG9uTW9kdWxlLCBJY29uTW9kdWxlfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1Rhc2tNYW5hZ2VtZW50U2VhcmNoRmllbGRzU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtUYXNrTWFuYWdlbWVudFNlYXJjaEZpZWxkc01vZGFsQ29tcG9uZW50fSBmcm9tICcuLi90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC90YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXRhc2stbWFuYWdlbWVudC1zZWFyY2gtZmllbGRzJyxcbiAgdGVtcGxhdGVVcmw6ICd0YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBDYXJib25MaXN0TW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBJY29uTW9kdWxlLFxuICAgIFRhc2tNYW5hZ2VtZW50U2VhcmNoRmllbGRzTW9kYWxDb21wb25lbnQsXG4gICAgQ29uZmlybWF0aW9uTW9kYWxNb2R1bGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFRhc2tNYW5hZ2VtZW50U2VhcmNoRmllbGRzQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKFxuICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zLm5hbWUgfHwgJycpLFxuICAgIGZpbHRlcihkb2NEZWZOYW1lID0+ICEhZG9jRGVmTmFtZSksXG4gICAgdGFwKChkb2NEZWZOYW1lOiBzdHJpbmcpID0+IHRoaXMuc2VhcmNoRmllbGRzU2VydmljZS5zZXREb2N1bWVudERlZmluaXRpb25OYW1lKGRvY0RlZk5hbWUpKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlZnJlc2gkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudWxsPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc2VhcmNoRmllbGRzJDogT2JzZXJ2YWJsZTxUYXNrTGlzdFNlYXJjaEZpZWxkW10+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJCxcbiAgICB0aGlzLl9yZWZyZXNoJCxcbiAgICB0aGlzLnRyYXNubGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zZWFyY2hGaWVsZHNTZXJ2aWNlLmdldFRhc2tMaXN0U2VhcmNoRmllbGRzKCkpLFxuICAgIG1hcCgoc2VhcmNoRmllbGRzOiBUYXNrTGlzdFNlYXJjaEZpZWxkW10pID0+IHRoaXMubWFwVHJhbnNsYXRpb25zKHNlYXJjaEZpZWxkcykpXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGZpZWxkcyQ6IE9ic2VydmFibGU8Q29sdW1uQ29uZmlnW10+ID0gdGhpcy50cmFzbmxhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JykucGlwZShcbiAgICBtYXAoKCkgPT4gW1xuICAgICAge1xuICAgICAgICBrZXk6ICd0aXRsZScsXG4gICAgICAgIGxhYmVsOiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcudGl0bGUnLFxuICAgICAgICB2aWV3VHlwZTogVmlld1R5cGUuVEVYVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGtleTogJ2tleScsXG4gICAgICAgIGxhYmVsOiAnc2VhcmNoRmllbGRzT3ZlcnZpZXcua2V5JyxcbiAgICAgICAgdmlld1R5cGU6IFZpZXdUeXBlLlRFWFQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdwYXRoJyxcbiAgICAgICAgbGFiZWw6ICdzZWFyY2hGaWVsZHNPdmVydmlldy5wYXRoJyxcbiAgICAgICAgdmlld1R5cGU6IFZpZXdUeXBlLlRFWFQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBrZXk6ICdkYXRhVHlwZVRyYW5zbGF0aW9uJyxcbiAgICAgICAgbGFiZWw6ICdzZWFyY2hGaWVsZHNPdmVydmlldy5kYXRhVHlwZScsXG4gICAgICAgIHZpZXdUeXBlOiBWaWV3VHlwZS5URVhULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAnZmllbGRUeXBlVHJhbnNsYXRpb24nLFxuICAgICAgICBsYWJlbDogJ3NlYXJjaEZpZWxkc092ZXJ2aWV3LmZpZWxkVHlwZScsXG4gICAgICAgIHZpZXdUeXBlOiBWaWV3VHlwZS5URVhULFxuICAgICAgfSxcbiAgICBdKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkZWxldGVNb2RhbE9wZW4kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBmaWVsZE1vZGFsT3BlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1Ub0RlbGV0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRhc2tMaXN0U2VhcmNoRmllbGQgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHByZWZpbGxEYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBBQ1RJT05fSVRFTVM6IEFjdGlvbkl0ZW1bXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogJ2ludGVyZmFjZS5lZGl0JyxcbiAgICAgIGNhbGxiYWNrOiB0aGlzLmVkaXRGaWVsZC5iaW5kKHRoaXMpLFxuICAgICAgdHlwZTogJ25vcm1hbCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogJ2ludGVyZmFjZS5kZWxldGUnLFxuICAgICAgY2FsbGJhY2s6IHRoaXMuZGVsZXRlRmllbGQuYmluZCh0aGlzKSxcbiAgICAgIHR5cGU6ICdkYW5nZXInLFxuICAgIH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlYXJjaEZpZWxkc1NlcnZpY2U6IFRhc2tNYW5hZ2VtZW50U2VhcmNoRmllbGRzU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYXNubGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIHB1YmxpYyBlZGl0RmllbGQoaXRlbTogVGFza0xpc3RTZWFyY2hGaWVsZCk6IHZvaWQge1xuICAgIGlmICghIWl0ZW0uZHJvcGRvd25EYXRhUHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlXG4gICAgICAgIC5nZXREcm9wZG93bkRhdGEoaXRlbS5kcm9wZG93bkRhdGFQcm92aWRlciwgaXRlbS5vd25lcklkLCBpdGVtLmtleSlcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZShkcm9wZG93blZhbHVlcyA9PiB7XG4gICAgICAgICAgaXRlbS5kcm9wZG93blZhbHVlcyA9IGRyb3Bkb3duVmFsdWVzIGFzIFRhc2tMaXN0U2VhcmNoRHJvcGRvd25WYWx1ZTtcbiAgICAgICAgICB0aGlzLnByZWZpbGxEYXRhJC5uZXh0KGl0ZW0pO1xuICAgICAgICAgIHRoaXMuZmllbGRNb2RhbE9wZW4kLm5leHQodHJ1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJlZmlsbERhdGEkLm5leHQoaXRlbSk7XG4gICAgdGhpcy5maWVsZE1vZGFsT3BlbiQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkl0ZW1zUmVvcmRlcmVkKGV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hGaWVsZHNTZXJ2aWNlXG4gICAgICAub3JkZXJUYXNrTGlzdFNlYXJjaEZpZWxkcyhldmVudClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3JlZnJlc2gkLm5leHQobnVsbCkpO1xuICB9XG5cbiAgcHVibGljIG9uQWRkQnV0dG9uQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5maWVsZE1vZGFsT3BlbiQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsb3NlRXZlbnQoXG4gICAgc2VhcmNoRmllbGQ6IFRhc2tMaXN0U2VhcmNoRmllbGQgfCBudWxsLFxuICAgIHByZWZpbGxEYXRhOiBUYXNrTGlzdFNlYXJjaEZpZWxkIHwgbnVsbFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkTW9kYWxPcGVuJC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnByZWZpbGxEYXRhJC5uZXh0KG51bGwpO1xuICAgIGlmICghc2VhcmNoRmllbGQpIHJldHVybjtcblxuICAgIGNvbnN0IGhhc0Ryb3Bkb3duVmFsdWVzOiBib29sZWFuID1cbiAgICAgIHNlYXJjaEZpZWxkLmZpZWxkVHlwZSA9PT0gVGFza0xpc3RTZWFyY2hGaWVsZEZpZWxkVHlwZS5TSU5HTEVfU0VMRUNUX0RST1BET1dOIHx8XG4gICAgICBzZWFyY2hGaWVsZC5maWVsZFR5cGUgPT09IFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuTVVMVElfU0VMRUNUX0RST1BET1dOO1xuXG4gICAgKCFwcmVmaWxsRGF0YVxuICAgICAgPyB0aGlzLnNlYXJjaEZpZWxkc1NlcnZpY2UuY3JlYXRlVGFza0xpc3RTZWFyY2hGaWVsZChzZWFyY2hGaWVsZClcbiAgICAgIDogdGhpcy5zZWFyY2hGaWVsZHNTZXJ2aWNlLnVwZGF0ZVRhc2tMaXN0U2VhcmNoRmllbGQoc2VhcmNoRmllbGQpXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoZmllbGQ6IFRhc2tMaXN0U2VhcmNoRmllbGQpID0+IHtcbiAgICAgICAgICByZXR1cm4gaGFzRHJvcGRvd25WYWx1ZXNcbiAgICAgICAgICAgID8gdGhpcy5kb2N1bWVudFNlcnZpY2UucG9zdERyb3Bkb3duRGF0YShcbiAgICAgICAgICAgICAgICBmaWVsZC5kcm9wZG93bkRhdGFQcm92aWRlciA/PyAnJyxcbiAgICAgICAgICAgICAgICBmaWVsZC5vd25lcklkLFxuICAgICAgICAgICAgICAgIGZpZWxkLmtleSxcbiAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZC5kcm9wZG93blZhbHVlcyA/PyB7fVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IG9mKGZpZWxkKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcmVmcmVzaCQubmV4dChudWxsKSk7XG4gIH1cblxuICBwdWJsaWMgb25EZWxldGVGaWVsZENvbmZpcm0oaXRlbTogVGFza0xpc3RTZWFyY2hGaWVsZCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIWl0ZW0pIHJldHVybjtcblxuICAgIHRoaXMuc2VhcmNoRmllbGRzU2VydmljZVxuICAgICAgLmRlbGV0ZVRhc2tMaXN0U2VhcmNoRmllbGQoaXRlbS5rZXkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgaXRlbS5kcm9wZG93bkRhdGFQcm92aWRlclxuICAgICAgICAgICAgPyB0aGlzLmRvY3VtZW50U2VydmljZS5kZWxldGVEcm9wZG93bkRhdGEoXG4gICAgICAgICAgICAgICAgaXRlbS5kcm9wZG93bkRhdGFQcm92aWRlcixcbiAgICAgICAgICAgICAgICBpdGVtLm93bmVySWQsXG4gICAgICAgICAgICAgICAgaXRlbS5rZXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBvZigpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fcmVmcmVzaCQubmV4dChudWxsKSk7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZUZpZWxkKGl0ZW06IFRhc2tMaXN0U2VhcmNoRmllbGQpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1Ub0RlbGV0ZSQubmV4dChpdGVtKTtcbiAgICB0aGlzLmRlbGV0ZU1vZGFsT3BlbiQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwVHJhbnNsYXRpb25zKFxuICAgIHNlYXJjaEZpZWxkczogVGFza0xpc3RTZWFyY2hGaWVsZFtdXG4gICk6IChUYXNrTGlzdFNlYXJjaEZpZWxkICYge2RhdGFUeXBlVHJhbnNsYXRpb246IHN0cmluZzsgZmllbGRUeXBlVHJhbnNsYXRpb246IHN0cmluZ30pW10ge1xuICAgIHJldHVybiBzZWFyY2hGaWVsZHMubWFwKChzZWFyY2hGaWVsZDogVGFza0xpc3RTZWFyY2hGaWVsZCkgPT4gKHtcbiAgICAgIC4uLnNlYXJjaEZpZWxkLFxuICAgICAgZGF0YVR5cGVUcmFuc2xhdGlvbjogdGhpcy50cmFzbmxhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgIGBzZWFyY2hGaWVsZHMuJHtzZWFyY2hGaWVsZC5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpfWBcbiAgICAgICksXG4gICAgICBmaWVsZFR5cGVUcmFuc2xhdGlvbjogdGhpcy50cmFzbmxhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgIGBzZWFyY2hGaWVsZHNPdmVydmlldy4ke3RoaXMuZmllbGRUeXBlVHJhbnNsYXRpb24oc2VhcmNoRmllbGQuZmllbGRUeXBlKX1gXG4gICAgICApLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgZmllbGRUeXBlVHJhbnNsYXRpb24oZmllbGRUeXBlOiBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGZpZWxkVHlwZSkge1xuICAgICAgY2FzZSBUYXNrTGlzdFNlYXJjaEZpZWxkRmllbGRUeXBlLlNJTkdMRV9TRUxFQ1RfRFJPUERPV046XG4gICAgICAgIHJldHVybiAnc2luZ2xlLXNlbGVjdC1kcm9wZG93bic7XG4gICAgICBjYXNlIFRhc2tMaXN0U2VhcmNoRmllbGRGaWVsZFR5cGUuTVVMVElfU0VMRUNUX0RST1BET1dOOlxuICAgICAgICByZXR1cm4gJ211bHRpLXNlbGVjdC1kcm9wZG93bic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmllbGRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCJ7XG4gICAgZmllbGRNb2RhbE9wZW46IGZpZWxkTW9kYWxPcGVuJCB8IGFzeW5jLFxuICAgIGZpZWxkczogZmllbGRzJCB8IGFzeW5jLFxuICAgIGl0ZW1Ub0RlbGV0ZTogaXRlbVRvRGVsZXRlJCB8IGFzeW5jLFxuICAgIHByZWZpbGxEYXRhOiBwcmVmaWxsRGF0YSQgfCBhc3luYyxcbiAgICBzZWFyY2hGaWVsZHM6IHNlYXJjaEZpZWxkcyQgfCBhc3luY1xuICB9IGFzIG9ic1wiXG4+XG4gIDx2YWx0aW1vLWNhcmJvbi1saXN0XG4gICAgW2FjdGlvbkl0ZW1zXT1cIkFDVElPTl9JVEVNU1wiXG4gICAgW2ZpZWxkc109XCJvYnMuZmllbGRzXCJcbiAgICBbaXRlbXNdPVwib2JzLnNlYXJjaEZpZWxkc1wiXG4gICAgW2RyYWdBbmREcm9wXT1cInRydWVcIlxuICAgIChpdGVtc1Jlb3JkZXJlZCk9XCJvbkl0ZW1zUmVvcmRlcmVkKCRldmVudClcIlxuICAgIChyb3dDbGlja2VkKT1cImVkaXRGaWVsZCgkZXZlbnQpXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgY2FyYm9uVG9vbGJhckNvbnRlbnQ+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZEJ1dHRvblwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPHZhbHRpbW8tbm8tcmVzdWx0c1xuICAgICAgW2FjdGlvbl09XCJhZGRCdXR0b25cIlxuICAgICAgW2Rlc2NyaXB0aW9uXT1cIidzZWFyY2hGaWVsZHNPdmVydmlldy5ub1NlYXJjaGZpZWxkc0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbdGl0bGVdPVwiJ3NlYXJjaEZpZWxkc092ZXJ2aWV3Lm5vU2VhcmNoZmllbGRzVGl0bGUnIHwgdHJhbnNsYXRlXCJcbiAgICA+PC92YWx0aW1vLW5vLXJlc3VsdHM+XG4gIDwvdmFsdGltby1jYXJib24tbGlzdD5cblxuICA8dmFsdGltby10YXNrLW1hbmFnZW1lbnQtc2VhcmNoLWZpZWxkcy1tb2RhbFxuICAgIFtkb2N1bWVudERlZmluaXRpb25OYW1lXT1cImRvY3VtZW50RGVmaW5pdGlvbk5hbWUkIHwgYXN5bmNcIlxuICAgIFtvcGVuXT1cIm9icy5maWVsZE1vZGFsT3BlblwiXG4gICAgW3ByZWZpbGxEYXRhXT1cIm9icy5wcmVmaWxsRGF0YVwiXG4gICAgKGNsb3NlRXZlbnQpPVwib25DbG9zZUV2ZW50KCRldmVudCwgb2JzLnByZWZpbGxEYXRhKVwiXG4gID48L3ZhbHRpbW8tdGFzay1tYW5hZ2VtZW50LXNlYXJjaC1maWVsZHMtbW9kYWw+XG5cbiAgPHZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsXG4gICAgY29uZmlybUJ1dHRvblRleHRUcmFuc2xhdGlvbktleT1cImludGVyZmFjZS5kZWxldGVcIlxuICAgIGNvbmZpcm1CdXR0b25UeXBlPVwiZGFuZ2VyXCJcbiAgICBjb250ZW50VHJhbnNsYXRpb25LZXk9XCJzZWFyY2hGaWVsZHNPdmVydmlldy5kZWxldGVTZWFyY2hGaWVsZENvbmZpcm1hdGlvblwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJvYnMuaXRlbVRvRGVsZXRlXCJcbiAgICBbc2hvd01vZGFsU3ViamVjdCRdPVwiZGVsZXRlTW9kYWxPcGVuJFwiXG4gICAgdGl0bGVUcmFuc2xhdGlvbktleT1cInNlYXJjaEZpZWxkc092ZXJ2aWV3LmRlbGV0ZVNlYXJjaEZpZWxkXCJcbiAgICAoY29uZmlybUV2ZW50KT1cIm9uRGVsZXRlRmllbGRDb25maXJtKCRldmVudClcIlxuICA+PC92YWx0aW1vLWNvbmZpcm1hdGlvbi1tb2RhbD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2FkZEJ1dHRvbj5cbiAgPGJ1dHRvbiBjZHNCdXR0b249XCJwcmltYXJ5XCIgKGNsaWNrKT1cIm9uQWRkQnV0dG9uQ2xpY2soKVwiPlxuICAgIDxzdmcgY2RzSWNvbj1cImFkZFwiIHNpemU9XCIxNlwiIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIj48L3N2Zz5cblxuICAgIHt7ICdzZWFyY2hGaWVsZHNPdmVydmlldy5hZGQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==