@lenne.tech/ng-base 14.34.0 → 14.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/base-components/components/model-table/model-table.component.d.ts +16 -4
- package/esm2020/base-components/components/model-table/model-table.component.mjs +77 -18
- package/esm2020/base-prototype/pages/profile/profile.component.mjs +4 -1
- package/esm2020/shared/classes/auth.class.mjs +2 -1
- package/esm2020/shared/services/auth.service.mjs +76 -13
- package/esm2020/shared/services/user.service.mjs +9 -7
- package/esm2020/src/factories/apollo-options.factory.mjs +45 -4
- package/fesm2015/lenne.tech-ng-base-base-components.mjs +69 -13
- package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +1 -1
- package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +3 -0
- package/fesm2015/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
- package/fesm2015/lenne.tech-ng-base-shared.mjs +309 -246
- package/fesm2015/lenne.tech-ng-base-shared.mjs.map +1 -1
- package/fesm2015/lenne.tech-ng-base.mjs +42 -4
- package/fesm2015/lenne.tech-ng-base.mjs.map +1 -1
- package/fesm2020/lenne.tech-ng-base-base-components.mjs +69 -13
- package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +1 -1
- package/fesm2020/lenne.tech-ng-base-base-prototype.mjs +3 -0
- package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
- package/fesm2020/lenne.tech-ng-base-shared.mjs +306 -241
- package/fesm2020/lenne.tech-ng-base-shared.mjs.map +1 -1
- package/fesm2020/lenne.tech-ng-base.mjs +44 -4
- package/fesm2020/lenne.tech-ng-base.mjs.map +1 -1
- package/package.json +1 -1
- package/shared/classes/auth.class.d.ts +1 -0
- package/shared/services/auth.service.d.ts +15 -4
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import { AfterViewInit, ComponentRef, EventEmitter, OnChanges, OnInit, SimpleChanges, ViewContainerRef } from '@angular/core';
|
|
2
|
-
import { CMSFieldConfig, CMSModelConfig, CmsService, CMSTableField, GraphQLMeta, GraphQLMetaService, GraphQLService, GraphQLType, ScrollService, ToastService } from '@lenne.tech/ng-base/shared';
|
|
1
|
+
import { AfterViewInit, ComponentRef, EventEmitter, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewContainerRef } from '@angular/core';
|
|
2
|
+
import { CMSFieldConfig, CMSModelConfig, CmsService, CMSTableField, GraphQLMeta, GraphQLMetaService, GraphQLService, GraphQLType, ScrollService, StorageService, ToastService } from '@lenne.tech/ng-base/shared';
|
|
3
|
+
import { FormControl } from '@angular/forms';
|
|
4
|
+
import { Subscription } from 'rxjs';
|
|
3
5
|
import * as i0 from "@angular/core";
|
|
4
|
-
export declare class ModelTableComponent implements OnInit, OnChanges, AfterViewInit {
|
|
6
|
+
export declare class ModelTableComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {
|
|
5
7
|
private graphQLMetaService;
|
|
6
8
|
private graphQLService;
|
|
7
9
|
private cmsService;
|
|
8
10
|
private toastService;
|
|
9
11
|
private scrollService;
|
|
12
|
+
private storageService;
|
|
10
13
|
modelName: string;
|
|
11
14
|
objectId: string;
|
|
12
15
|
createMode: boolean;
|
|
@@ -38,15 +41,23 @@ export declare class ModelTableComponent implements OnInit, OnChanges, AfterView
|
|
|
38
41
|
totalCount: number;
|
|
39
42
|
selectedPageIndex: number;
|
|
40
43
|
pages: any[];
|
|
41
|
-
|
|
44
|
+
pageItemsLimitControl: FormControl<number>;
|
|
45
|
+
pageOptions: {
|
|
46
|
+
text: string;
|
|
47
|
+
value: number;
|
|
48
|
+
}[];
|
|
49
|
+
subscription: Subscription;
|
|
50
|
+
constructor(graphQLMetaService: GraphQLMetaService, graphQLService: GraphQLService, cmsService: CmsService, toastService: ToastService, scrollService: ScrollService, storageService: StorageService);
|
|
42
51
|
ngAfterViewInit(): void;
|
|
43
52
|
ngOnInit(): void;
|
|
44
53
|
ngOnChanges(changes: SimpleChanges): void;
|
|
54
|
+
ngOnDestroy(): void;
|
|
45
55
|
/**
|
|
46
56
|
* We're using the `meta` service to get the fields that are available for the `find` query for the model we're working
|
|
47
57
|
* with. We're then using that information to populate the `availableFields` array
|
|
48
58
|
*/
|
|
49
59
|
init(): Promise<void>;
|
|
60
|
+
subscribeToPageItems(): void;
|
|
50
61
|
integrateCustomFormComponent(): void;
|
|
51
62
|
setChangesInComponentRef(): void;
|
|
52
63
|
/**
|
|
@@ -67,6 +78,7 @@ export declare class ModelTableComponent implements OnInit, OnChanges, AfterView
|
|
|
67
78
|
* selectedId property
|
|
68
79
|
*/
|
|
69
80
|
selectId(object: any): void;
|
|
81
|
+
openNewTab(object: any): void;
|
|
70
82
|
/**
|
|
71
83
|
* It calls the duplicateObject function in the cmsService, passing in the id of the object to be duplicated and the
|
|
72
84
|
* modelName of the object
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { Component, EventEmitter, Input, Output, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
2
|
-
import { GraphQLRequestType,
|
|
2
|
+
import { GraphQLRequestType, ToastType, } from '@lenne.tech/ng-base/shared';
|
|
3
|
+
import { FormControl } from '@angular/forms';
|
|
4
|
+
import { Subscription } from 'rxjs';
|
|
3
5
|
import * as i0 from "@angular/core";
|
|
4
6
|
import * as i1 from "@lenne.tech/ng-base/shared";
|
|
5
7
|
import * as i2 from "@angular/common";
|
|
6
8
|
import * as i3 from "../../directives/sort.directive";
|
|
7
9
|
import * as i4 from "../../directives/context-menu.directive";
|
|
8
|
-
import * as i5 from "../
|
|
9
|
-
import * as i6 from "../
|
|
10
|
-
import * as i7 from "
|
|
10
|
+
import * as i5 from "../select/select.component";
|
|
11
|
+
import * as i6 from "../model-form/model-form.component";
|
|
12
|
+
import * as i7 from "../fab-button/fab-button.component";
|
|
13
|
+
import * as i8 from "../../pipes/ellipses.pipe";
|
|
11
14
|
export class ModelTableComponent {
|
|
12
|
-
constructor(graphQLMetaService, graphQLService, cmsService, toastService, scrollService) {
|
|
15
|
+
constructor(graphQLMetaService, graphQLService, cmsService, toastService, scrollService, storageService) {
|
|
13
16
|
this.graphQLMetaService = graphQLMetaService;
|
|
14
17
|
this.graphQLService = graphQLService;
|
|
15
18
|
this.cmsService = cmsService;
|
|
16
19
|
this.toastService = toastService;
|
|
17
20
|
this.scrollService = scrollService;
|
|
21
|
+
this.storageService = storageService;
|
|
18
22
|
this.createMode = false;
|
|
19
23
|
this.logging = false;
|
|
20
24
|
this.create = true;
|
|
@@ -45,6 +49,30 @@ export class ModelTableComponent {
|
|
|
45
49
|
this.componentRef = undefined;
|
|
46
50
|
this.selectedPageIndex = 0;
|
|
47
51
|
this.pages = [];
|
|
52
|
+
this.pageItemsLimitControl = new FormControl(25);
|
|
53
|
+
this.pageOptions = [
|
|
54
|
+
{
|
|
55
|
+
text: '25',
|
|
56
|
+
value: 25,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
text: '50',
|
|
60
|
+
value: 50,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
text: '75',
|
|
64
|
+
value: 75,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
text: '100',
|
|
68
|
+
value: 100,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
text: '200',
|
|
72
|
+
value: 200,
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
this.subscription = new Subscription();
|
|
48
76
|
}
|
|
49
77
|
ngAfterViewInit() {
|
|
50
78
|
// Needed time out to prevent ExpressionChangedAfterItHasBeenCheckedError
|
|
@@ -53,6 +81,8 @@ export class ModelTableComponent {
|
|
|
53
81
|
}, 10);
|
|
54
82
|
}
|
|
55
83
|
ngOnInit() {
|
|
84
|
+
const pageItemsLimit = this.storageService.load('pageItemsLimit');
|
|
85
|
+
this.pageItemsLimitControl.setValue(pageItemsLimit ? pageItemsLimit : 25, { onlySelf: true, emitEvent: false });
|
|
56
86
|
this.graphQLMetaService.getMeta().subscribe((meta) => {
|
|
57
87
|
this.meta = meta;
|
|
58
88
|
if (this.modelName) {
|
|
@@ -81,6 +111,9 @@ export class ModelTableComponent {
|
|
|
81
111
|
}
|
|
82
112
|
this.setChangesInComponentRef();
|
|
83
113
|
}
|
|
114
|
+
ngOnDestroy() {
|
|
115
|
+
this.subscription.unsubscribe();
|
|
116
|
+
}
|
|
84
117
|
/**
|
|
85
118
|
* We're using the `meta` service to get the fields that are available for the `find` query for the model we're working
|
|
86
119
|
* with. We're then using that information to populate the `availableFields` array
|
|
@@ -125,8 +158,19 @@ export class ModelTableComponent {
|
|
|
125
158
|
console.log('ModelTableComponent::init->keys', keys);
|
|
126
159
|
console.log('ModelTableComponent::init->availableFields', this.availableFields);
|
|
127
160
|
}
|
|
128
|
-
this.selectedPageIndex = 0;
|
|
129
|
-
this.objects = await this.loadObjects(this.availableFields, 0,
|
|
161
|
+
this.selectedPageIndex = this.storageService.load('pageIndex') ? this.storageService.load('pageIndex') : 0;
|
|
162
|
+
this.objects = await this.loadObjects(this.availableFields, 0, this.pageItemsLimitControl.value);
|
|
163
|
+
this.subscribeToPageItems();
|
|
164
|
+
}
|
|
165
|
+
subscribeToPageItems() {
|
|
166
|
+
this.subscription.add(this.pageItemsLimitControl.valueChanges.subscribe({
|
|
167
|
+
next: async (value) => {
|
|
168
|
+
this.selectedPageIndex = 0;
|
|
169
|
+
this.storageService.save('pageIndex', this.selectedPageIndex);
|
|
170
|
+
this.objects = await this.loadObjects(this.availableFields, 0, value);
|
|
171
|
+
this.storageService.save('pageItemsLimit', value);
|
|
172
|
+
},
|
|
173
|
+
}));
|
|
130
174
|
}
|
|
131
175
|
integrateCustomFormComponent() {
|
|
132
176
|
if (!this.customFormTemplate || this.componentRef) {
|
|
@@ -184,7 +228,6 @@ export class ModelTableComponent {
|
|
|
184
228
|
this.graphQLService
|
|
185
229
|
.graphQl(this.queryName, {
|
|
186
230
|
arguments: {
|
|
187
|
-
sort: [{ field: 'createdAt', order: SortOrderEnum.ASC }],
|
|
188
231
|
limit: isFindAndCount ? limit : null,
|
|
189
232
|
skip: isFindAndCount ? skip : null,
|
|
190
233
|
},
|
|
@@ -205,9 +248,16 @@ export class ModelTableComponent {
|
|
|
205
248
|
while (numbers < this.totalCount) {
|
|
206
249
|
this.pages.push({
|
|
207
250
|
skip: numbers,
|
|
208
|
-
limit:
|
|
251
|
+
limit: this.pageItemsLimitControl.value,
|
|
209
252
|
});
|
|
210
|
-
numbers = numbers +
|
|
253
|
+
numbers = numbers + this.pageItemsLimitControl.value;
|
|
254
|
+
}
|
|
255
|
+
const loadedIndex = this.storageService.load('pageIndex');
|
|
256
|
+
if (loadedIndex) {
|
|
257
|
+
if (loadedIndex > this.pages.length) {
|
|
258
|
+
this.selectedPageIndex = 0;
|
|
259
|
+
this.storageService.save('pageIndex');
|
|
260
|
+
}
|
|
211
261
|
}
|
|
212
262
|
}
|
|
213
263
|
else {
|
|
@@ -236,13 +286,16 @@ export class ModelTableComponent {
|
|
|
236
286
|
this.idSelected.emit(this.id);
|
|
237
287
|
}
|
|
238
288
|
}
|
|
289
|
+
openNewTab(object) {
|
|
290
|
+
window.open(location.href + '/' + object['id'], '_blank');
|
|
291
|
+
}
|
|
239
292
|
/**
|
|
240
293
|
* It calls the duplicateObject function in the cmsService, passing in the id of the object to be duplicated and the
|
|
241
294
|
* modelName of the object
|
|
242
295
|
*/
|
|
243
296
|
async duplicateObject(id) {
|
|
244
297
|
await this.cmsService.duplicateObject(id, this.camelModelName);
|
|
245
|
-
this.selectedPageIndex = 0;
|
|
298
|
+
this.selectedPageIndex = this.storageService.load('pageIndex') ? this.storageService.load('pageIndex') : 0;
|
|
246
299
|
this.objects = await this.loadObjects(this.availableFields, this.pages[this.selectedPageIndex].skip, this.pages[this.selectedPageIndex].limit);
|
|
247
300
|
}
|
|
248
301
|
/**
|
|
@@ -251,7 +304,7 @@ export class ModelTableComponent {
|
|
|
251
304
|
*/
|
|
252
305
|
async deleteObject(id) {
|
|
253
306
|
await this.cmsService.deleteObject(id, this.camelModelName);
|
|
254
|
-
this.selectedPageIndex = 0;
|
|
307
|
+
this.selectedPageIndex = this.storageService.load('pageIndex') ? this.storageService.load('pageIndex') : 0;
|
|
255
308
|
this.objects = await this.loadObjects(this.availableFields, this.pages[this.selectedPageIndex].skip, this.pages[this.selectedPageIndex].limit);
|
|
256
309
|
}
|
|
257
310
|
/**
|
|
@@ -295,7 +348,9 @@ export class ModelTableComponent {
|
|
|
295
348
|
description: 'Element ' + (i + 1) + ' von ' + jsonResult.length + ' erfolgreich importiert.',
|
|
296
349
|
});
|
|
297
350
|
if (i === jsonResult.length - 1) {
|
|
298
|
-
this.selectedPageIndex =
|
|
351
|
+
this.selectedPageIndex = this.storageService.load('pageIndex')
|
|
352
|
+
? this.storageService.load('pageIndex')
|
|
353
|
+
: 0;
|
|
299
354
|
this.objects = await this.loadObjects(this.availableFields, this.pages[this.selectedPageIndex].skip, this.pages[this.selectedPageIndex].limit);
|
|
300
355
|
}
|
|
301
356
|
},
|
|
@@ -350,17 +405,21 @@ export class ModelTableComponent {
|
|
|
350
405
|
return items;
|
|
351
406
|
}
|
|
352
407
|
async selectPage(i) {
|
|
408
|
+
if (!this.pages[i]) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
353
411
|
this.selectedPageIndex = i;
|
|
354
412
|
await this.scrollService.scrollTo('model-table-top');
|
|
413
|
+
this.storageService.save('pageIndex', this.selectedPageIndex);
|
|
355
414
|
this.objects = await this.loadObjects(this.availableFields, this.pages[this.selectedPageIndex].skip, this.pages[this.selectedPageIndex].limit);
|
|
356
415
|
}
|
|
357
416
|
}
|
|
358
|
-
ModelTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ModelTableComponent, deps: [{ token: i1.GraphQLMetaService }, { token: i1.GraphQLService }, { token: i1.CmsService }, { token: i1.ToastService }, { token: i1.ScrollService }], target: i0.ɵɵFactoryTarget.Component });
|
|
359
|
-
ModelTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ModelTableComponent, selector: "base-model-table", inputs: { modelName: "modelName", objectId: "objectId", createMode: "createMode", logging: "logging", create: "create", update: "update", delete: "delete", import: "import", export: "export", duplicate: "duplicate", modelConfig: "modelConfig", config: "config", showFavButton: "showFavButton" }, outputs: { idSelected: "idSelected", createModeChanged: "createModeChanged" }, viewQueries: [{ propertyName: "customFormTemplate", first: true, predicate: ["customFormTemplate"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"!id && !createMode\">\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-2 mb-lg-4\">\n <h2 id=\"model-table-top\" class=\"mb-0\" *ngIf=\"modelName\">\n {{\n modelConfig?.plural\n ? modelConfig?.plural\n : modelConfig?.label\n ? modelConfig?.label\n : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n <div class=\"d-flex align-items-center d-none d-lg-block\">\n <input #importFile type=\"file\" accept=\".json\" class=\"d-none\" (change)=\"processImport($event)\" />\n <div class=\"btn-group me-4\" *ngIf=\"import || export\">\n <i\n class=\"bi bi-three-dots-vertical\"\n id=\"settingsDropdown\"\n type=\"button\"\n data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"true\"\n aria-expanded=\"false\"\n ></i>\n <ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"settingsDropdown\">\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"export\" (click)=\"processExport()\">Export</a></li>\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"import\" (click)=\"importFile.click()\"> Import </a></li>\n </ul>\n </div>\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\" *ngIf=\"create\">Erstellen</button>\n </div>\n </div>\n\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white d-none d-lg-table\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let field of availableFields\"\n [baseSort]=\"objects\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"object-col\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <td class=\"cursor-pointer\" *ngFor=\"let field of availableFields\" (click)=\"selectId(object)\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date: tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses: 60 }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"d-flex d-lg-none flex-column flex-grow-1\">\n <div class=\"table-card\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <div class=\"table-card-entry\" *ngFor=\"let field of availableFields; let i = index\" (click)=\"selectId(object)\">\n <b *ngIf=\"i > 0\"\n >{{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}:</b\n >\n <p [ngClass]=\"{ 'table-card-entry-first': i === 0 }\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date: tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses: 60 }}\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n\n <nav *ngIf=\"totalCount >= 0\">\n <ul class=\"pagination justify-content-center\">\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex - 1)\"\n aria-label=\"Previous\"\n [ngClass]=\"{ disabled: selectedPageIndex - 1 > 0 }\"\n >\n <span aria-hidden=\"true\">«</span>\n </a>\n </li>\n <li class=\"page-item\" *ngFor=\"let page of pages; let i = index\">\n <a class=\"page-link\" [ngClass]=\"{ active: selectedPageIndex === i }\" (click)=\"selectPage(i)\">{{ i + 1 }}</a>\n </li>\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex + 1)\"\n aria-label=\"Next\"\n [ngClass]=\"{ disabled: pages[selectedPageIndex + 1] }\"\n >\n <span aria-hidden=\"true\">»</span>\n </a>\n </li>\n </ul>\n </nav>\n\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" *ngIf=\"duplicate\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n <div class=\"context-menu-item\" *ngIf=\"delete\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"w-100\" *ngIf=\"id || createMode\">\n <button class=\"d-none d-lg-block btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n <base-model-form\n *ngIf=\"!modelConfig?.customTemplateComponent\"\n [modelName]=\"camelModelName\"\n [label]=\"modelConfig?.label\"\n [config]=\"config\"\n [logging]=\"logging\"\n [id]=\"id\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n [showFavButton]=\"showFavButton\"\n ></base-model-form>\n <ng-template *ngIf=\"modelConfig?.customTemplateComponent\" #customFormTemplate></ng-template>\n</div>\n\n<div class=\"responsive-action-button d-block d-lg-none\">\n <base-fab-button\n [fabIcon]=\"'bi-plus'\"\n (click)=\"createNewObject()\"\n *ngIf=\"!(id || createMode) && showFavButton\"\n ></base-fab-button>\n</div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}.table-card{background:var(--bs-white);padding:10px;margin-bottom:10px}.table-card-entry{margin-top:4px}.table-card-entry-first{font-size:18px;font-weight:800;color:var(--bs-primary)}.responsive-action-button{position:fixed;bottom:15px;right:15px}.bi-three-dots-vertical{font-size:18px;line-height:18px}.page-item{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.SortDirective, selector: "[baseSort]", inputs: ["baseSort"] }, { kind: "directive", type: i4.ContextMenuDirective, selector: "[ltContextMenu]", inputs: ["contextMenuData", "ltContextMenu", "xGap", "yGap", "overflowSpace", "selectors"], outputs: ["clickedElement"], exportAs: ["contextMenuData"] }, { kind: "component", type: i5.ModelFormComponent, selector: "base-model-form", inputs: ["modelName", "label", "id", "delete", "onlyUpdateMode", "duplicate", "logging", "config", "showFavButton"], outputs: ["finished"] }, { kind: "component", type: i6.FabButtonComponent, selector: "base-fab-button", inputs: ["fabIcon", "buttons"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i7.EllipsesPipe, name: "baseEllipses" }] });
|
|
417
|
+
ModelTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ModelTableComponent, deps: [{ token: i1.GraphQLMetaService }, { token: i1.GraphQLService }, { token: i1.CmsService }, { token: i1.ToastService }, { token: i1.ScrollService }, { token: i1.StorageService }], target: i0.ɵɵFactoryTarget.Component });
|
|
418
|
+
ModelTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ModelTableComponent, selector: "base-model-table", inputs: { modelName: "modelName", objectId: "objectId", createMode: "createMode", logging: "logging", create: "create", update: "update", delete: "delete", import: "import", export: "export", duplicate: "duplicate", modelConfig: "modelConfig", config: "config", showFavButton: "showFavButton" }, outputs: { idSelected: "idSelected", createModeChanged: "createModeChanged" }, viewQueries: [{ propertyName: "customFormTemplate", first: true, predicate: ["customFormTemplate"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"!id && !createMode\">\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-2 mb-lg-4\">\n <h2 id=\"model-table-top\" class=\"mb-0\" *ngIf=\"modelName\">\n {{\n modelConfig?.plural\n ? modelConfig?.plural\n : modelConfig?.label\n ? modelConfig?.label\n : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n <div class=\"d-flex align-items-center d-none d-lg-block\">\n <input #importFile type=\"file\" accept=\".json\" class=\"d-none\" (change)=\"processImport($event)\" />\n <div class=\"btn-group me-4\" *ngIf=\"import || export\">\n <i\n class=\"bi bi-three-dots-vertical\"\n id=\"settingsDropdown\"\n type=\"button\"\n data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"true\"\n aria-expanded=\"false\"\n ></i>\n <ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"settingsDropdown\">\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"export\" (click)=\"processExport()\">Export</a></li>\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"import\" (click)=\"importFile.click()\"> Import </a></li>\n </ul>\n </div>\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\" *ngIf=\"create\">Erstellen</button>\n </div>\n </div>\n\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white d-none d-lg-table\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let field of availableFields\"\n [baseSort]=\"objects\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"object-col\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <td class=\"cursor-pointer\" *ngFor=\"let field of availableFields\" (click)=\"selectId(object)\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses : 60 }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"d-flex d-lg-none flex-column flex-grow-1\">\n <div class=\"table-card\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <div class=\"table-card-entry\" *ngFor=\"let field of availableFields; let i = index\" (click)=\"selectId(object)\">\n <b *ngIf=\"i > 0\"\n >{{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}:</b\n >\n <p [ngClass]=\"{ 'table-card-entry-first': i === 0 }\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses : 60 }}\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"container-fluid\" *ngIf=\"totalCount >= 0 && pages.length > 1\">\n <nav class=\"d-flex row\">\n <div class=\"col-12 col-md-2\"></div>\n <ul class=\"pagination justify-content-center col-12 col-md-8\">\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex - 1)\"\n aria-label=\"Previous\"\n [ngClass]=\"{ disabled: selectedPageIndex - 1 > 0 }\"\n >\n <span aria-hidden=\"true\">«</span>\n </a>\n </li>\n <li class=\"page-item\" *ngFor=\"let page of pages; let i = index\">\n <a class=\"page-link\" [ngClass]=\"{ active: selectedPageIndex === i }\" (click)=\"selectPage(i)\">{{ i + 1 }}</a>\n </li>\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex + 1)\"\n aria-label=\"Next\"\n [ngClass]=\"{ disabled: pages[selectedPageIndex + 1] }\"\n >\n <span aria-hidden=\"true\">»</span>\n </a>\n </li>\n </ul>\n\n <div class=\"col-12 col-md-2\">\n <base-select [options]=\"pageOptions\" [control]=\"pageItemsLimitControl\"></base-select>\n </div>\n </nav>\n </div>\n\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" (click)=\"openNewTab({ id: contextMenuData.clickedElement?.id })\">\n In neuen Tab \u00F6ffnen\n </div>\n <div class=\"context-menu-item\" *ngIf=\"duplicate\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n <div class=\"context-menu-item\" *ngIf=\"delete\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"w-100\" *ngIf=\"id || createMode\">\n <button class=\"d-none d-lg-block btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n <base-model-form\n *ngIf=\"!modelConfig?.customTemplateComponent\"\n [modelName]=\"camelModelName\"\n [label]=\"modelConfig?.label\"\n [config]=\"config\"\n [logging]=\"logging\"\n [id]=\"id\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n [showFavButton]=\"showFavButton\"\n ></base-model-form>\n <ng-template *ngIf=\"modelConfig?.customTemplateComponent\" #customFormTemplate></ng-template>\n</div>\n\n<div class=\"responsive-action-button d-block d-lg-none\">\n <base-fab-button\n [fabIcon]=\"'bi-plus'\"\n (click)=\"createNewObject()\"\n *ngIf=\"!(id || createMode) && showFavButton\"\n ></base-fab-button>\n</div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px;z-index:999}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}.table-card{background:var(--bs-white);padding:10px;margin-bottom:10px}.table-card-entry{margin-top:4px}.table-card-entry-first{font-size:18px;font-weight:800;color:var(--bs-primary)}.responsive-action-button{position:fixed;bottom:15px;right:15px}.bi-three-dots-vertical{font-size:18px;line-height:18px}.page-item{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.SortDirective, selector: "[baseSort]", inputs: ["baseSort"] }, { kind: "directive", type: i4.ContextMenuDirective, selector: "[ltContextMenu]", inputs: ["contextMenuData", "ltContextMenu", "xGap", "yGap", "overflowSpace", "selectors"], outputs: ["clickedElement"], exportAs: ["contextMenuData"] }, { kind: "component", type: i5.SelectComponent, selector: "base-select", inputs: ["id", "name", "infoText", "label", "placeholder", "objectPath", "control", "tabIndex", "required", "multiple", "search", "options"] }, { kind: "component", type: i6.ModelFormComponent, selector: "base-model-form", inputs: ["modelName", "label", "id", "delete", "onlyUpdateMode", "duplicate", "logging", "config", "showFavButton"], outputs: ["finished"] }, { kind: "component", type: i7.FabButtonComponent, selector: "base-fab-button", inputs: ["fabIcon", "buttons"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i8.EllipsesPipe, name: "baseEllipses" }] });
|
|
360
419
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ModelTableComponent, decorators: [{
|
|
361
420
|
type: Component,
|
|
362
|
-
args: [{ selector: 'base-model-table', template: "<div *ngIf=\"!id && !createMode\">\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-2 mb-lg-4\">\n <h2 id=\"model-table-top\" class=\"mb-0\" *ngIf=\"modelName\">\n {{\n modelConfig?.plural\n ? modelConfig?.plural\n : modelConfig?.label\n ? modelConfig?.label\n : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n <div class=\"d-flex align-items-center d-none d-lg-block\">\n <input #importFile type=\"file\" accept=\".json\" class=\"d-none\" (change)=\"processImport($event)\" />\n <div class=\"btn-group me-4\" *ngIf=\"import || export\">\n <i\n class=\"bi bi-three-dots-vertical\"\n id=\"settingsDropdown\"\n type=\"button\"\n data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"true\"\n aria-expanded=\"false\"\n ></i>\n <ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"settingsDropdown\">\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"export\" (click)=\"processExport()\">Export</a></li>\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"import\" (click)=\"importFile.click()\"> Import </a></li>\n </ul>\n </div>\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\" *ngIf=\"create\">Erstellen</button>\n </div>\n </div>\n\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white d-none d-lg-table\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let field of availableFields\"\n [baseSort]=\"objects\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"object-col\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <td class=\"cursor-pointer\" *ngFor=\"let field of availableFields\" (click)=\"selectId(object)\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date: tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses: 60 }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"d-flex d-lg-none flex-column flex-grow-1\">\n <div class=\"table-card\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <div class=\"table-card-entry\" *ngFor=\"let field of availableFields; let i = index\" (click)=\"selectId(object)\">\n <b *ngIf=\"i > 0\"\n >{{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}:</b\n >\n <p [ngClass]=\"{ 'table-card-entry-first': i === 0 }\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date: tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses: 60 }}\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n\n <
|
|
363
|
-
}], ctorParameters: function () { return [{ type: i1.GraphQLMetaService }, { type: i1.GraphQLService }, { type: i1.CmsService }, { type: i1.ToastService }, { type: i1.ScrollService }]; }, propDecorators: { modelName: [{
|
|
421
|
+
args: [{ selector: 'base-model-table', template: "<div *ngIf=\"!id && !createMode\">\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-2 mb-lg-4\">\n <h2 id=\"model-table-top\" class=\"mb-0\" *ngIf=\"modelName\">\n {{\n modelConfig?.plural\n ? modelConfig?.plural\n : modelConfig?.label\n ? modelConfig?.label\n : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n <div class=\"d-flex align-items-center d-none d-lg-block\">\n <input #importFile type=\"file\" accept=\".json\" class=\"d-none\" (change)=\"processImport($event)\" />\n <div class=\"btn-group me-4\" *ngIf=\"import || export\">\n <i\n class=\"bi bi-three-dots-vertical\"\n id=\"settingsDropdown\"\n type=\"button\"\n data-bs-toggle=\"dropdown\"\n data-bs-auto-close=\"true\"\n aria-expanded=\"false\"\n ></i>\n <ul class=\"dropdown-menu dropdown-menu-end\" aria-labelledby=\"settingsDropdown\">\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"export\" (click)=\"processExport()\">Export</a></li>\n <li><a class=\"dropdown-item cursor-pointer\" *ngIf=\"import\" (click)=\"importFile.click()\"> Import </a></li>\n </ul>\n </div>\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\" *ngIf=\"create\">Erstellen</button>\n </div>\n </div>\n\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white d-none d-lg-table\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let field of availableFields\"\n [baseSort]=\"objects\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"object-col\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <td class=\"cursor-pointer\" *ngFor=\"let field of availableFields\" (click)=\"selectId(object)\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses : 60 }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"d-flex d-lg-none flex-column flex-grow-1\">\n <div class=\"table-card\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <div class=\"table-card-entry\" *ngFor=\"let field of availableFields; let i = index\" (click)=\"selectId(object)\">\n <b *ngIf=\"i > 0\"\n >{{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}:</b\n >\n <p [ngClass]=\"{ 'table-card-entry-first': i === 0 }\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date : tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses : 60 }}\n </ng-container>\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"container-fluid\" *ngIf=\"totalCount >= 0 && pages.length > 1\">\n <nav class=\"d-flex row\">\n <div class=\"col-12 col-md-2\"></div>\n <ul class=\"pagination justify-content-center col-12 col-md-8\">\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex - 1)\"\n aria-label=\"Previous\"\n [ngClass]=\"{ disabled: selectedPageIndex - 1 > 0 }\"\n >\n <span aria-hidden=\"true\">«</span>\n </a>\n </li>\n <li class=\"page-item\" *ngFor=\"let page of pages; let i = index\">\n <a class=\"page-link\" [ngClass]=\"{ active: selectedPageIndex === i }\" (click)=\"selectPage(i)\">{{ i + 1 }}</a>\n </li>\n <li class=\"page-item\">\n <a\n class=\"page-link\"\n (click)=\"selectPage(selectedPageIndex + 1)\"\n aria-label=\"Next\"\n [ngClass]=\"{ disabled: pages[selectedPageIndex + 1] }\"\n >\n <span aria-hidden=\"true\">»</span>\n </a>\n </li>\n </ul>\n\n <div class=\"col-12 col-md-2\">\n <base-select [options]=\"pageOptions\" [control]=\"pageItemsLimitControl\"></base-select>\n </div>\n </nav>\n </div>\n\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" (click)=\"openNewTab({ id: contextMenuData.clickedElement?.id })\">\n In neuen Tab \u00F6ffnen\n </div>\n <div class=\"context-menu-item\" *ngIf=\"duplicate\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n <div class=\"context-menu-item\" *ngIf=\"delete\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"w-100\" *ngIf=\"id || createMode\">\n <button class=\"d-none d-lg-block btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n <base-model-form\n *ngIf=\"!modelConfig?.customTemplateComponent\"\n [modelName]=\"camelModelName\"\n [label]=\"modelConfig?.label\"\n [config]=\"config\"\n [logging]=\"logging\"\n [id]=\"id\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n [showFavButton]=\"showFavButton\"\n ></base-model-form>\n <ng-template *ngIf=\"modelConfig?.customTemplateComponent\" #customFormTemplate></ng-template>\n</div>\n\n<div class=\"responsive-action-button d-block d-lg-none\">\n <base-fab-button\n [fabIcon]=\"'bi-plus'\"\n (click)=\"createNewObject()\"\n *ngIf=\"!(id || createMode) && showFavButton\"\n ></base-fab-button>\n</div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px;z-index:999}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}.table-card{background:var(--bs-white);padding:10px;margin-bottom:10px}.table-card-entry{margin-top:4px}.table-card-entry-first{font-size:18px;font-weight:800;color:var(--bs-primary)}.responsive-action-button{position:fixed;bottom:15px;right:15px}.bi-three-dots-vertical{font-size:18px;line-height:18px}.page-item{cursor:pointer}\n"] }]
|
|
422
|
+
}], ctorParameters: function () { return [{ type: i1.GraphQLMetaService }, { type: i1.GraphQLService }, { type: i1.CmsService }, { type: i1.ToastService }, { type: i1.ScrollService }, { type: i1.StorageService }]; }, propDecorators: { modelName: [{
|
|
364
423
|
type: Input
|
|
365
424
|
}], objectId: [{
|
|
366
425
|
type: Input
|
|
@@ -394,4 +453,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
394
453
|
type: ViewChild,
|
|
395
454
|
args: ['customFormTemplate', { read: ViewContainerRef }]
|
|
396
455
|
}] } });
|
|
397
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNvbXBvbmVudHMvY29tcG9uZW50cy9tb2RlbC10YWJsZS9tb2RlbC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL21vZGVsLXRhYmxlL21vZGVsLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBT0wsa0JBQWtCLEVBSWxCLGFBQWEsRUFFYixTQUFTLEdBQ1YsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7O0FBT3BDLE1BQU0sT0FBTyxtQkFBbUI7SUEyQzlCLFlBQ1Usa0JBQXNDLEVBQ3RDLGNBQThCLEVBQzlCLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLGFBQTRCO1FBSjVCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUE3QzdCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2QsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFDZCxXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2QsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLGNBQVMsR0FBRyxJQUFJLENB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LEVBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUN6QyxDQUFDO0lBQ0osQ0FBQzs7aUhBcGFVLG1CQUFtQjtxR0FBbkIsbUJBQW1CLG9oQkFrQlcsZ0JBQWdCLGtEQ3BEM0Qsc3RNQTZKQTs0RkQzSGEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGtCQUFrQjtzTkFLbkIsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUVzRCxrQkFBa0I7c0JBQTlFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENNU0ZpZWxkQ29uZmlnLFxuICBDTVNNb2RlbENvbmZpZyxcbiAgQ21zU2VydmljZSxcbiAgQ01TVGFibGVGaWVsZCxcbiAgR3JhcGhRTE1ldGEsXG4gIEdyYXBoUUxNZXRhU2VydmljZSxcbiAgR3JhcGhRTFJlcXVlc3RUeXBlLFxuICBHcmFwaFFMU2VydmljZSxcbiAgR3JhcGhRTFR5cGUsXG4gIFNjcm9sbFNlcnZpY2UsXG4gIFNvcnRPcmRlckVudW0sXG4gIFRvYXN0U2VydmljZSxcbiAgVG9hc3RUeXBlLFxufSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Jhc2UtbW9kZWwtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vbW9kZWwtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tb2RlbC10YWJsZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RlbFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBtb2RlbE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgb2JqZWN0SWQ6IHN0cmluZztcbiAgQElucHV0KCkgY3JlYXRlTW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKSBsb2dnaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNyZWF0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIHVwZGF0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGRlbGV0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGltcG9ydCA9IHRydWU7XG4gIEBJbnB1dCgpIGV4cG9ydCA9IHRydWU7XG4gIEBJbnB1dCgpIGR1cGxpY2F0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIG1vZGVsQ29uZmlnOiBDTVNNb2RlbENvbmZpZyA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbmZpZzogeyBba2V5OiBzdHJpbmddOiBDTVNGaWVsZENvbmZpZyB9O1xuICBASW5wdXQoKSBzaG93RmF2QnV0dG9uID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGlkU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNyZWF0ZU1vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbUZvcm1UZW1wbGF0ZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBjdXN0b21Gb3JtVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgdW5pcXVlRmllbGQgPSAnaWQnO1xuICB0YWJsZUZpZWxkczogQ01TVGFibGVGaWVsZCA9IHtcbiAgICBpZDogeyBsYWJlbDogJ0lEJyB9LFxuICAgIG5hbWU6IHsgbGFiZWw6ICdOYW1lJyB9LFxuICAgIHRpdGxlOiB7IGxhYmVsOiAnVGl0ZWwnIH0sXG4gICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdCZXNjaHJlaWJ1bmcnIH0sXG4gICAgZW1haWw6IHsgbGFiZWw6ICdFLU1haWwnIH0sXG4gICAgY3JlYXRlZEF0OiB7IGxhYmVsOiAnRXJzdGVsbHQgYW0nLCBkYXRlRm9ybWF0OiAnZGQuTU0uWVlZWSBISDptbScgfSxcbiAgICB1cGRhdGVkQXQ6IHsgbGFiZWw6ICdCZWFyYmVpdGV0IGFtJywgZGF0ZUZvcm1hdDogJ2RkLk1NLllZWVkgSEg6bW0nIH0sXG4gIH07XG4gIG1ldGEhOiBHcmFwaFFMTWV0YTtcbiAgb2JqZWN0czogYW55W10gPSBbXTtcbiAgYXZhaWxhYmxlRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZCA9ICcnO1xuICBxdWVyeU5hbWU6IHN0cmluZyA9IG51bGw7XG4gIGNhbWVsTW9kZWxOYW1lOiBzdHJpbmc7XG4gIHBvc3NpYmxlRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBHcmFwaFFMVHlwZT4gPSB7fTtcbiAgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHVuZGVmaW5lZDtcblxuICB0b3RhbENvdW50OiBudW1iZXI7XG4gIHNlbGVjdGVkUGFnZUluZGV4ID0gMDtcbiAgcGFnZXMgPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGdyYXBoUUxNZXRhU2VydmljZTogR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3JhcGhRTFNlcnZpY2U6IEdyYXBoUUxTZXJ2aWNlLFxuICAgIHByaXZhdGUgY21zU2VydmljZTogQ21zU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZVxuICApIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIE5lZWRlZCB0aW1lIG91dCB0byBwcmV2ZW50IEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW50ZWdyYXRlQ3VzdG9tRm9ybUNvbXBvbmVudCgpO1xuICAgIH0sIDEwKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ3JhcGhRTE1ldGFTZXJ2aWNlLmdldE1ldGEoKS5zdWJzY3JpYmUoKG1ldGEpID0+IHtcbiAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgIGlmICh0aGlzLm1vZGVsTmFtZSkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub2JqZWN0SWQ7XG5cbiAgICAgICAgLy8gTmVlZGVkIHRpbWUgb3V0IGZvciByZXJlbmRlclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmludGVncmF0ZUN1c3RvbUZvcm1Db21wb25lbnQoKTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydtb2RlbE5hbWUnXSAmJiB0aGlzLm1ldGEpIHtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydvYmplY3RJZCddICYmIHRoaXMubWV0YSkge1xuICAgICAgaWYgKHRoaXMuaWQgIT09IHRoaXMub2JqZWN0SWQpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50OjpuZ09uQ2hhbmdlcy0+c2VsZWN0ZWRJZCcsIHRoaXMuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub2JqZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRDaGFuZ2VzSW5Db21wb25lbnRSZWYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXZSdyZSB1c2luZyB0aGUgYG1ldGFgIHNlcnZpY2UgdG8gZ2V0IHRoZSBmaWVsZHMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGUgYGZpbmRgIHF1ZXJ5IGZvciB0aGUgbW9kZWwgd2UncmUgd29ya2luZ1xuICAgKiB3aXRoLiBXZSdyZSB0aGVuIHVzaW5nIHRoYXQgaW5mb3JtYXRpb24gdG8gcG9wdWxhdGUgdGhlIGBhdmFpbGFibGVGaWVsZHNgIGFycmF5XG4gICAqL1xuICBhc3luYyBpbml0KCkge1xuICAgIHRoaXMuYXZhaWxhYmxlRmllbGRzID0gW107XG4gICAgdGhpcy5wYWdlcyA9IFtdO1xuICAgIHRoaXMudG90YWxDb3VudCA9IG51bGw7XG4gICAgdGhpcy5jYW1lbE1vZGVsTmFtZSA9IHRoaXMua2ViYWJUb0NhbWVsQ2FzZSh0aGlzLm1vZGVsTmFtZSk7XG5cbiAgICAvLyBTZXQgcXVlcnkgbmFtZVxuICAgIGlmICghdGhpcy5tb2RlbENvbmZpZz8ucXVlcnlOYW1lKSB7XG4gICAgICB0aGlzLnF1ZXJ5TmFtZSA9ICdmaW5kQW5kQ291bnQnICsgdGhpcy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIodGhpcy5jYW1lbE1vZGVsTmFtZSkgKyAncyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucXVlcnlOYW1lID0gdGhpcy5tb2RlbENvbmZpZz8ucXVlcnlOYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGVsQ29uZmlnPy50YWJsZUZpZWxkcykge1xuICAgICAgdGhpcy50YWJsZUZpZWxkcyA9IHRoaXMubW9kZWxDb25maWcudGFibGVGaWVsZHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgY29uc29sZS5sb2coJ01vZGVsVGFibGVDb21wb25lbnQ6OmluaXQtPm1vZGVsTmFtZScsIHRoaXMubW9kZWxOYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5jYW1lbE1vZGVsTmFtZScsIHRoaXMuY2FtZWxNb2RlbE5hbWUpO1xuICAgICAgY29uc29sZS5sb2coJ01vZGVsVGFibGVDb21wb25lbnQ6OmluaXQtPnF1ZXJ5TmFtZScsIHRoaXMucXVlcnlOYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT50YWJsZUZpZWxkcycsIHRoaXMudGFibGVGaWVsZHMpO1xuICAgIH1cblxuICAgIHRoaXMucG9zc2libGVGaWVsZHMgPSB0aGlzLm1ldGEuZ2V0RmllbGRzKHRoaXMucXVlcnlOYW1lKS5maWVsZHM7XG4gICAgbGV0IGtleXM7XG4gICAgaWYgKHRoaXMucG9zc2libGVGaWVsZHM/Lml0ZW1zICYmIE9iamVjdC5rZXlzKHRoaXMucG9zc2libGVGaWVsZHM/Lml0ZW1zPy5maWVsZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnBvc3NpYmxlRmllbGRzLml0ZW1zLmZpZWxkcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnBvc3NpYmxlRmllbGRzKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZUZpZWxkS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMudGFibGVGaWVsZHMpO1xuICAgIHRhYmxlRmllbGRLZXlzPy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGtleXMuaW5jbHVkZXMoZmllbGQpKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlRmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgY29uc29sZS5sb2coJ01vZGVsVGFibGVDb21wb25lbnQ6OmluaXQtPnBvc3NpYmxlRmllbGRzJywgdGhpcy5wb3NzaWJsZUZpZWxkcyk7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6aW5pdC0+a2V5cycsIGtleXMpO1xuICAgICAgY29uc29sZS5sb2coJ01vZGVsVGFibGVDb21wb25lbnQ6OmluaXQtPmF2YWlsYWJsZUZpZWxkcycsIHRoaXMuYXZhaWxhYmxlRmllbGRzKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkUGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKHRoaXMuYXZhaWxhYmxlRmllbGRzLCAwLCAyNSk7XG4gIH1cblxuICBpbnRlZ3JhdGVDdXN0b21Gb3JtQ29tcG9uZW50KCkge1xuICAgIGlmICghdGhpcy5jdXN0b21Gb3JtVGVtcGxhdGUgfHwgdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21Db21wb25lbnQgPSB0aGlzLm1vZGVsQ29uZmlnPy5jdXN0b21UZW1wbGF0ZUNvbXBvbmVudDtcbiAgICBpZiAoY3VzdG9tQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tRm9ybVRlbXBsYXRlPy5jcmVhdGVDb21wb25lbnQ8YW55PihjdXN0b21Db21wb25lbnQpO1xuICAgICAgdGhpcy5zZXRDaGFuZ2VzSW5Db21wb25lbnRSZWYoKTtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmZpbmlzaGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0SWQoJycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Q2hhbmdlc0luQ29tcG9uZW50UmVmKCkge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgICAgZGVsZXRlOiB0aGlzLmRlbGV0ZSxcbiAgICAgICAgZHVwbGljYXRlOiB0aGlzLmR1cGxpY2F0ZSxcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIGxhYmVsOiB0aGlzLm1vZGVsQ29uZmlnPy5sYWJlbCxcbiAgICAgICAgbG9nZ2luZzogdGhpcy5sb2dnaW5nLFxuICAgICAgICBtb2RlbE5hbWU6IHRoaXMuY2FtZWxNb2RlbE5hbWUsXG4gICAgICAgIHNob3dGYXZCdXR0b246IHRoaXMuc2hvd0ZhdkJ1dHRvbixcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJDcmVhdGUgTmV3XCIgYnV0dG9uLCB0aGUgY3JlYXRlTW9kZUNoYW5nZWQgZXZlbnQgaXMgZW1pdHRlZCwgd2hpY2ggaXMgdGhlbiBoYW5kbGVkIGJ5IHRoZVxuICAgKiBwYXJlbnQgY29tcG9uZW50XG4gICAqL1xuICBjcmVhdGVOZXdPYmplY3QoKSB7XG4gICAgdGhpcy5jcmVhdGVNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLmNyZWF0ZU1vZGVDaGFuZ2VkLmVtaXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgbG9hZHMgdGhlIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSBvYmplY3RzIHZhcmlhYmxlXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZHMgLSBzdHJpbmdbXSAtIFRoZSBmaWVsZHMgeW91IHdhbnQgdG8gbG9hZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHNraXBcbiAgICogQHBhcmFtIGxpbWl0XG4gICAqL1xuICBsb2FkT2JqZWN0cyhmaWVsZHM6IHN0cmluZ1tdLCBza2lwID0gMCwgbGltaXQgPSAyNSk6IFByb21pc2U8YW55W10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55W10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RGaWVsZHMgPSBbLi4uZmllbGRzXTtcbiAgICAgIGNvbnN0IGlkSW5GaWVsZHMgPSByZXF1ZXN0RmllbGRzLmZpbmQoKGUpID0+IGUgPT09ICdpZCcpO1xuXG4gICAgICBpZiAoIWlkSW5GaWVsZHMpIHtcbiAgICAgICAgcmVxdWVzdEZpZWxkcy5wdXNoKCdpZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0ZpbmRBbmRDb3VudCA9IHRoaXMucXVlcnlOYW1lLmluY2x1ZGVzKCdmaW5kQW5kQ291bnQnKTtcblxuICAgICAgdGhpcy5ncmFwaFFMU2VydmljZVxuICAgICAgICAuZ3JhcGhRbCh0aGlzLnF1ZXJ5TmFtZSwge1xuICAgICAgICAgIGFyZ3VtZW50czoge1xuICAgICAgICAgICAgc29ydDogW3sgZmllbGQ6ICdjcmVhdGVkQXQnLCBvcmRlcjogU29ydE9yZGVyRW51bS5BU0MgfV0sXG4gICAgICAgICAgICBsaW1pdDogaXNGaW5kQW5kQ291bnQgPyBsaW1pdCA6IG51bGwsXG4gICAgICAgICAgICBza2lwOiBpc0ZpbmRBbmRDb3VudCA/IHNraXAgOiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBpc0ZpbmRBbmRDb3VudCA/IFsndG90YWxDb3VudCcsIHsgaXRlbXM6IHJlcXVlc3RGaWVsZHMgfV0gOiByZXF1ZXN0RmllbGRzLFxuICAgICAgICAgIHR5cGU6IEdyYXBoUUxSZXF1ZXN0VHlwZS5RVUVSWSxcbiAgICAgICAgfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBsZXQgaXRlbXM7XG4gICAgICAgICAgICBpZiAodGhpcy5sb2dnaW5nKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojpsb2FkT2JqZWN0cy0+dmFsdWUnLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZT8udG90YWxDb3VudCA+PSAwKSB7XG4gICAgICAgICAgICAgIGl0ZW1zID0gdmFsdWUuaXRlbXM7XG4gICAgICAgICAgICAgIHRoaXMudG90YWxDb3VudCA9IHZhbHVlLnRvdGFsQ291bnQ7XG4gICAgICAgICAgICAgIHRoaXMucGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgbGV0IG51bWJlcnMgPSAwO1xuXG4gICAgICAgICAgICAgIHdoaWxlIChudW1iZXJzIDwgdGhpcy50b3RhbENvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIHNraXA6IG51bWJlcnMsXG4gICAgICAgICAgICAgICAgICBsaW1pdDogMjUsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBudW1iZXJzID0gbnVtYmVycyArIDI1O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpdGVtcyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKGl0ZW1zKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3Igb24gbG9hZGluZyBvYmplY3RzJywgZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSB1cGRhdGUgcHJvcGVydHkgaXMgdHJ1ZSwgdGhlbiBzZXQgdGhlIHNlbGVjdGVkSWQgcHJvcGVydHkgdG8gdGhlIGlkIG9mIHRoZSBvYmplY3QgcGFzc2VkIGluLCBhbmQgZW1pdCB0aGVcbiAgICogc2VsZWN0ZWRJZCBwcm9wZXJ0eVxuICAgKi9cbiAgc2VsZWN0SWQob2JqZWN0OiBhbnkpIHtcbiAgICBpZiAoIW9iamVjdCkge1xuICAgICAgdGhpcy5jcmVhdGVNb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLmNyZWF0ZU1vZGVDaGFuZ2VkLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVwZGF0ZSkge1xuICAgICAgdGhpcy5pZCA9IG9iamVjdFsnaWQnXTtcbiAgICAgIHRoaXMuaWRTZWxlY3RlZC5lbWl0KHRoaXMuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBjYWxscyB0aGUgZHVwbGljYXRlT2JqZWN0IGZ1bmN0aW9uIGluIHRoZSBjbXNTZXJ2aWNlLCBwYXNzaW5nIGluIHRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGJlIGR1cGxpY2F0ZWQgYW5kIHRoZVxuICAgKiBtb2RlbE5hbWUgb2YgdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZHVwbGljYXRlT2JqZWN0KGlkOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmNtc1NlcnZpY2UuZHVwbGljYXRlT2JqZWN0KGlkLCB0aGlzLmNhbWVsTW9kZWxOYW1lKTtcbiAgICB0aGlzLnNlbGVjdGVkUGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKFxuICAgICAgdGhpcy5hdmFpbGFibGVGaWVsZHMsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLnNraXAsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLmxpbWl0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBjYWxscyB0aGUgZGVsZXRlT2JqZWN0IGZ1bmN0aW9uIGluIHRoZSBjbXNTZXJ2aWNlLCBwYXNzaW5nIGluIHRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGRlbGV0ZSBhbmQgdGhlIG5hbWUgb2YgdGhlXG4gICAqIG1vZGVsXG4gICAqL1xuICBhc3luYyBkZWxldGVPYmplY3QoaWQ6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuY21zU2VydmljZS5kZWxldGVPYmplY3QoaWQsIHRoaXMuY2FtZWxNb2RlbE5hbWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXggPSAwO1xuICAgIHRoaXMub2JqZWN0cyA9IGF3YWl0IHRoaXMubG9hZE9iamVjdHMoXG4gICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0ubGltaXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHRha2VzIGEgc3RyaW5nLCBjYXBpdGFsaXplcyB0aGUgZmlyc3QgbGV0dGVyLCBhbmQgcmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nXG4gICAqL1xuICBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNtc1NlcnZpY2UuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLZWJhYiB0byBjYW1lbCBjYXNlIHN0cmluZ1xuICAgKi9cbiAga2ViYWJUb0NhbWVsQ2FzZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvLS4vZywgKG1hdGNoKSA9PiBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgb2JqZWN0cyBmcm9tIGpzb24gZmlsZVxuICAgKi9cbiAgcHJvY2Vzc0ltcG9ydChldmVudCkge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBGaWxlUmVhZGVyKCkgb2JqZWN0XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIC8vIFNldHVwIHRoZSBjYWxsYmFjayBldmVudCB0byBydW4gd2hlbiB0aGUgZmlsZSBpcyByZWFkXG4gICAgcmVhZGVyLm9ubG9hZCA9IGFzeW5jIChyZWFkZXJFdmVudCkgPT4ge1xuICAgICAgbGV0IGpzb25SZXN1bHQgPSBKU09OLnBhcnNlKHJlYWRlckV2ZW50LnRhcmdldC5yZXN1bHQgYXMgYW55KTtcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGpzb25SZXN1bHQpKSB7XG4gICAgICAgIGpzb25SZXN1bHQgPSBbanNvblJlc3VsdF07XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwganNvblJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuZ3JhcGhRTFNlcnZpY2VcbiAgICAgICAgICAgIC5ncmFwaFFsKCdjcmVhdGUnICsgdGhpcy5jYXBpdGFsaXplRmlyc3RMZXR0ZXIodGhpcy5tb2RlbE5hbWUpLCB7XG4gICAgICAgICAgICAgIGFyZ3VtZW50czogeyBpbnB1dDoganNvblJlc3VsdFtpXSB9LFxuICAgICAgICAgICAgICBmaWVsZHM6IFsnaWQnXSxcbiAgICAgICAgICAgICAgdHlwZTogR3JhcGhRTFJlcXVlc3RUeXBlLk1VVEFUSU9OLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbE5hbWUgKyAnLScgKyBpICsgJy1zdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFRvYXN0VHlwZS5TVUNDRVNTLFxuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdFcmZvbGdyZWljaCcsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0VsZW1lbnQgJyArIChpICsgMSkgKyAnIHZvbiAnICsganNvblJlc3VsdC5sZW5ndGggKyAnIGVyZm9sZ3JlaWNoIGltcG9ydGllcnQuJyxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChpID09PSBqc29uUmVzdWx0Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlc1t0aGlzLnNlbGVjdGVkUGFnZUluZGV4XS5saW1pdFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbE5hbWUgKyAnLScgKyBpICsgJy1lcnJvcicsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuRVJST1IsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRWxlbWVudCAnICsgKGkgKyAxKSArICcgdm9uICcgKyBqc29uUmVzdWx0Lmxlbmd0aCArICcga29ubnRlIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuLicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy0nICsgaSArICctZXJyb3InLFxuICAgICAgICAgICAgdHlwZTogVG9hc3RUeXBlLkVSUk9SLFxuICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0VsZW1lbnQgJyArIChpICsgMSkgKyAnIHZvbiAnICsganNvblJlc3VsdC5sZW5ndGggKyAnIGtvbm50ZSBuaWNodCBpbXBvcnRpZXJ0IHdlcmRlbi4nLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFJlYWQgdGhlIGZpbGVcbiAgICByZWFkZXIucmVhZEFzVGV4dChldmVudC50YXJnZXQuZmlsZXNbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBvYmplY3RzIGFzIGpzb25cbiAgICovXG4gIGFzeW5jIHByb2Nlc3NFeHBvcnQoKSB7XG4gICAgY29uc3Qga2V5cyA9IHRoaXMuZ2V0QWxsS2V5cygpO1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyhcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLnNraXAsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLmxpbWl0XG4gICAgKTtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoaXRlbXMpO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZTogJ3RleHQvanNvbjtjaGFyc2V0PXV0Zi04OycgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIHRoaXMubW9kZWxOYW1lICsgJ3MuanNvbicpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgbGluay5jbGljaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwga2V5cyBmb3IgcmVxdWVzdCB0byBleHBvcnQgb2JqZWN0cyBhcyBqc29uXG4gICAqL1xuICBnZXRBbGxLZXlzKCkge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wb3NzaWJsZUZpZWxkcykpIHtcbiAgICAgIGlmICghdGhpcy5wb3NzaWJsZUZpZWxkc1trZXldLmZpZWxkcyB8fCBPYmplY3Qua2V5cyh0aGlzLnBvc3NpYmxlRmllbGRzW2tleV0uZmllbGRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaXRlbXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGFzeW5jIHNlbGVjdFBhZ2UoaTogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IGk7XG4gICAgYXdhaXQgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvKCdtb2RlbC10YWJsZS10b3AnKTtcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKFxuICAgICAgdGhpcy5hdmFpbGFibGVGaWVsZHMsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLnNraXAsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLmxpbWl0XG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIiFpZCAmJiAhY3JlYXRlTW9kZVwiPlxuICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtYi0yIG1iLWxnLTRcIj5cbiAgICA8aDIgaWQ9XCJtb2RlbC10YWJsZS10b3BcIiBjbGFzcz1cIm1iLTBcIiAqbmdJZj1cIm1vZGVsTmFtZVwiPlxuICAgICAge3tcbiAgICAgICAgbW9kZWxDb25maWc/LnBsdXJhbFxuICAgICAgICAgID8gbW9kZWxDb25maWc/LnBsdXJhbFxuICAgICAgICAgIDogbW9kZWxDb25maWc/LmxhYmVsXG4gICAgICAgICAgPyBtb2RlbENvbmZpZz8ubGFiZWxcbiAgICAgICAgICA6IGNhcGl0YWxpemVGaXJzdExldHRlcihjYW1lbE1vZGVsTmFtZSkgKyAncydcbiAgICAgIH19XG4gICAgPC9oMj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBkLW5vbmUgZC1sZy1ibG9ja1wiPlxuICAgICAgPGlucHV0ICNpbXBvcnRGaWxlIHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiLmpzb25cIiBjbGFzcz1cImQtbm9uZVwiIChjaGFuZ2UpPVwicHJvY2Vzc0ltcG9ydCgkZXZlbnQpXCIgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgbWUtNFwiICpuZ0lmPVwiaW1wb3J0IHx8IGV4cG9ydFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwiYmkgYmktdGhyZWUtZG90cy12ZXJ0aWNhbFwiXG4gICAgICAgICAgaWQ9XCJzZXR0aW5nc0Ryb3Bkb3duXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCJcbiAgICAgICAgICBkYXRhLWJzLWF1dG8tY2xvc2U9XCJ0cnVlXCJcbiAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICA+PC9pPlxuICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtZW5kXCIgYXJpYS1sYWJlbGxlZGJ5PVwic2V0dGluZ3NEcm9wZG93blwiPlxuICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImV4cG9ydFwiIChjbGljayk9XCJwcm9jZXNzRXhwb3J0KClcIj5FeHBvcnQ8L2E+PC9saT5cbiAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGN1cnNvci1wb2ludGVyXCIgKm5nSWY9XCJpbXBvcnRcIiAoY2xpY2spPVwiaW1wb3J0RmlsZS5jbGljaygpXCI+IEltcG9ydCA8L2E+PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJjcmVhdGVOZXdPYmplY3QoKVwiICpuZ0lmPVwiY3JlYXRlXCI+RXJzdGVsbGVuPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIlxuICAgIFtsdENvbnRleHRNZW51XT1cImNvbnRleHRNZW51XCJcbiAgICBbc2VsZWN0b3JzXT1cIicub2JqZWN0LWNvbCdcIlxuICAgICNjb250ZXh0TWVudURhdGE9XCJjb250ZXh0TWVudURhdGFcIlxuICA+XG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtaG92ZXIgYmctd2hpdGUgZC1ub25lIGQtbGctdGFibGVcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGF2YWlsYWJsZUZpZWxkc1wiXG4gICAgICAgICAgICBbYmFzZVNvcnRdPVwib2JqZWN0c1wiXG4gICAgICAgICAgICBkYXRhLW9yZGVyPVwiZGVzY1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW5hbWVdPVwiZmllbGRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHRhYmxlRmllbGRzW2ZpZWxkXT8ubGFiZWwgPyB0YWJsZUZpZWxkc1tmaWVsZF0/LmxhYmVsIDogY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGZpZWxkKSB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICAgPHRib2R5PlxuICAgICAgICA8dHIgY2xhc3M9XCJvYmplY3QtY29sXCIgKm5nRm9yPVwibGV0IG9iamVjdCBvZiBvYmplY3RzXCIgW2lkXT1cIm9iamVjdFt1bmlxdWVGaWVsZF1cIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBhdmFpbGFibGVGaWVsZHNcIiAoY2xpY2spPVwic2VsZWN0SWQob2JqZWN0KVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhYmxlRmllbGRzW2ZpZWxkXT8uZGF0ZUZvcm1hdFwiPlxuICAgICAgICAgICAgICB7eyBvYmplY3RbZmllbGRdIHwgZGF0ZTogdGFibGVGaWVsZHNbZmllbGRdPy5kYXRlRm9ybWF0IH19IFVoclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZUZpZWxkc1tmaWVsZF0/LmVudW1WYWx1ZXNcIj5cbiAgICAgICAgICAgICAge3sgdGFibGVGaWVsZHNbZmllbGRdPy5lbnVtVmFsdWVzW29iamVjdFtmaWVsZF1dPy50ZXh0IH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWJsZUZpZWxkc1tmaWVsZF0/LmRhdGVGb3JtYXQgJiYgIXRhYmxlRmllbGRzW2ZpZWxkXT8uZW51bVZhbHVlc1wiPlxuICAgICAgICAgICAgICB7eyBvYmplY3RbZmllbGRdIHwgYmFzZUVsbGlwc2VzOiA2MCB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cblxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZC1sZy1ub25lIGZsZXgtY29sdW1uIGZsZXgtZ3Jvdy0xXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2FyZFwiICpuZ0Zvcj1cImxldCBvYmplY3Qgb2Ygb2JqZWN0c1wiIFtpZF09XCJvYmplY3RbdW5pcXVlRmllbGRdXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jYXJkLWVudHJ5XCIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGF2YWlsYWJsZUZpZWxkczsgbGV0IGkgPSBpbmRleFwiIChjbGljayk9XCJzZWxlY3RJZChvYmplY3QpXCI+XG4gICAgICAgICAgPGIgKm5nSWY9XCJpID4gMFwiXG4gICAgICAgICAgICA+e3sgdGFibGVGaWVsZHNbZmllbGRdPy5sYWJlbCA/IHRhYmxlRmllbGRzW2ZpZWxkXT8ubGFiZWwgOiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoZmllbGQpIH19OjwvYlxuICAgICAgICAgID5cbiAgICAgICAgICA8cCBbbmdDbGFzc109XCJ7ICd0YWJsZS1jYXJkLWVudHJ5LWZpcnN0JzogaSA9PT0gMCB9XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFibGVGaWVsZHNbZmllbGRdPy5kYXRlRm9ybWF0XCI+XG4gICAgICAgICAgICAgIHt7IG9iamVjdFtmaWVsZF0gfCBkYXRlOiB0YWJsZUZpZWxkc1tmaWVsZF0/LmRhdGVGb3JtYXQgfX0gVWhyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhYmxlRmllbGRzW2ZpZWxkXT8uZW51bVZhbHVlc1wiPlxuICAgICAgICAgICAgICB7eyB0YWJsZUZpZWxkc1tmaWVsZF0/LmVudW1WYWx1ZXNbb2JqZWN0W2ZpZWxkXV0/LnRleHQgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhYmxlRmllbGRzW2ZpZWxkXT8uZGF0ZUZvcm1hdCAmJiAhdGFibGVGaWVsZHNbZmllbGRdPy5lbnVtVmFsdWVzXCI+XG4gICAgICAgICAgICAgIHt7IG9iamVjdFtmaWVsZF0gfCBiYXNlRWxsaXBzZXM6IDYwIH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmF2ICpuZ0lmPVwidG90YWxDb3VudCA+PSAwXCI+XG4gICAgICA8dWwgY2xhc3M9XCJwYWdpbmF0aW9uIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwicGFnZS1saW5rXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKHNlbGVjdGVkUGFnZUluZGV4IC0gMSlcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IHNlbGVjdGVkUGFnZUluZGV4IC0gMSA+IDAgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JmxhcXVvOzwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiICpuZ0Zvcj1cImxldCBwYWdlIG9mIHBhZ2VzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQYWdlSW5kZXggPT09IGkgfVwiIChjbGljayk9XCJzZWxlY3RQYWdlKGkpXCI+e3sgaSArIDEgfX08L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2UtbGlua1wiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGFnZShzZWxlY3RlZFBhZ2VJbmRleCArIDEpXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IHBhZ2VzW3NlbGVjdGVkUGFnZUluZGV4ICsgMV0gfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnJhcXVvOzwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvbmF2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudVwiICNjb250ZXh0TWVudT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiIChjbGljayk9XCJzZWxlY3RJZCh7IGlkOiBjb250ZXh0TWVudURhdGEuY2xpY2tlZEVsZW1lbnQ/LmlkIH0pXCI+QmVhcmJlaXRlbjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCIgKm5nSWY9XCJkdXBsaWNhdGVcIiAoY2xpY2spPVwiZHVwbGljYXRlT2JqZWN0KGNvbnRleHRNZW51RGF0YS5jbGlja2VkRWxlbWVudD8uaWQpXCI+XG4gICAgICAgIER1cGxpemllcmVuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiICpuZ0lmPVwiZGVsZXRlXCIgKGNsaWNrKT1cImRlbGV0ZU9iamVjdChjb250ZXh0TWVudURhdGEuY2xpY2tlZEVsZW1lbnQ/LmlkKVwiPlxuICAgICAgICBMw7ZzY2hlblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJ3LTEwMFwiICpuZ0lmPVwiaWQgfHwgY3JlYXRlTW9kZVwiPlxuICA8YnV0dG9uIGNsYXNzPVwiZC1ub25lIGQtbGctYmxvY2sgYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbWItM1wiIChjbGljayk9XCJzZWxlY3RJZCgnJylcIj5adXLDvGNrPC9idXR0b24+XG4gIDxiYXNlLW1vZGVsLWZvcm1cbiAgICAqbmdJZj1cIiFtb2RlbENvbmZpZz8uY3VzdG9tVGVtcGxhdGVDb21wb25lbnRcIlxuICAgIFttb2RlbE5hbWVdPVwiY2FtZWxNb2RlbE5hbWVcIlxuICAgIFtsYWJlbF09XCJtb2RlbENvbmZpZz8ubGFiZWxcIlxuICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICBbbG9nZ2luZ109XCJsb2dnaW5nXCJcbiAgICBbaWRdPVwiaWRcIlxuICAgIChmaW5pc2hlZCk9XCJzZWxlY3RJZCgnJylcIlxuICAgIFtkZWxldGVdPVwiZGVsZXRlXCJcbiAgICBbZHVwbGljYXRlXT1cImR1cGxpY2F0ZVwiXG4gICAgW3Nob3dGYXZCdXR0b25dPVwic2hvd0ZhdkJ1dHRvblwiXG4gID48L2Jhc2UtbW9kZWwtZm9ybT5cbiAgPG5nLXRlbXBsYXRlICpuZ0lmPVwibW9kZWxDb25maWc/LmN1c3RvbVRlbXBsYXRlQ29tcG9uZW50XCIgI2N1c3RvbUZvcm1UZW1wbGF0ZT48L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJyZXNwb25zaXZlLWFjdGlvbi1idXR0b24gZC1ibG9jayBkLWxnLW5vbmVcIj5cbiAgPGJhc2UtZmFiLWJ1dHRvblxuICAgIFtmYWJJY29uXT1cIidiaS1wbHVzJ1wiXG4gICAgKGNsaWNrKT1cImNyZWF0ZU5ld09iamVjdCgpXCJcbiAgICAqbmdJZj1cIiEoaWQgfHwgY3JlYXRlTW9kZSkgJiYgc2hvd0ZhdkJ1dHRvblwiXG4gID48L2Jhc2UtZmFiLWJ1dHRvbj5cbjwvZGl2PlxuIl19
|
|
456
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9iYXNlLWNvbXBvbmVudHMvY29tcG9uZW50cy9tb2RlbC10YWJsZS9tb2RlbC10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtY29tcG9uZW50cy9jb21wb25lbnRzL21vZGVsLXRhYmxlL21vZGVsLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBT0wsa0JBQWtCLEVBTWxCLFNBQVMsR0FDVixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7O0FBT3BDLE1BQU0sT0FBTyxtQkFBbUI7SUFtRTlCLFlBQ1Usa0JBQXNDLEVBQ3RDLGNBQThCLEVBQzlCLFVBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLGFBQTRCLEVBQzVCLGNBQThCO1FBTDlCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBdEUvQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLFdB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RCxrQkFBa0I7c0JBQTlFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ01TRmllbGRDb25maWcsXG4gIENNU01vZGVsQ29uZmlnLFxuICBDbXNTZXJ2aWNlLFxuICBDTVNUYWJsZUZpZWxkLFxuICBHcmFwaFFMTWV0YSxcbiAgR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICBHcmFwaFFMUmVxdWVzdFR5cGUsXG4gIEdyYXBoUUxTZXJ2aWNlLFxuICBHcmFwaFFMVHlwZSxcbiAgU2Nyb2xsU2VydmljZSxcbiAgU3RvcmFnZVNlcnZpY2UsXG4gIFRvYXN0U2VydmljZSxcbiAgVG9hc3RUeXBlLFxufSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdiYXNlLW1vZGVsLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGVsLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kZWwtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTW9kZWxUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBtb2RlbE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgb2JqZWN0SWQ6IHN0cmluZztcbiAgQElucHV0KCkgY3JlYXRlTW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKSBsb2dnaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNyZWF0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIHVwZGF0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGRlbGV0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIGltcG9ydCA9IHRydWU7XG4gIEBJbnB1dCgpIGV4cG9ydCA9IHRydWU7XG4gIEBJbnB1dCgpIGR1cGxpY2F0ZSA9IHRydWU7XG4gIEBJbnB1dCgpIG1vZGVsQ29uZmlnOiBDTVNNb2RlbENvbmZpZyA9IG51bGw7XG4gIEBJbnB1dCgpIGNvbmZpZzogeyBba2V5OiBzdHJpbmddOiBDTVNGaWVsZENvbmZpZyB9O1xuICBASW5wdXQoKSBzaG93RmF2QnV0dG9uID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGlkU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIGNyZWF0ZU1vZGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbUZvcm1UZW1wbGF0ZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBjdXN0b21Gb3JtVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgdW5pcXVlRmllbGQgPSAnaWQnO1xuICB0YWJsZUZpZWxkczogQ01TVGFibGVGaWVsZCA9IHtcbiAgICBpZDogeyBsYWJlbDogJ0lEJyB9LFxuICAgIG5hbWU6IHsgbGFiZWw6ICdOYW1lJyB9LFxuICAgIHRpdGxlOiB7IGxhYmVsOiAnVGl0ZWwnIH0sXG4gICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdCZXNjaHJlaWJ1bmcnIH0sXG4gICAgZW1haWw6IHsgbGFiZWw6ICdFLU1haWwnIH0sXG4gICAgY3JlYXRlZEF0OiB7IGxhYmVsOiAnRXJzdGVsbHQgYW0nLCBkYXRlRm9ybWF0OiAnZGQuTU0uWVlZWSBISDptbScgfSxcbiAgICB1cGRhdGVkQXQ6IHsgbGFiZWw6ICdCZWFyYmVpdGV0IGFtJywgZGF0ZUZvcm1hdDogJ2RkLk1NLllZWVkgSEg6bW0nIH0sXG4gIH07XG4gIG1ldGEhOiBHcmFwaFFMTWV0YTtcbiAgb2JqZWN0czogYW55W10gPSBbXTtcbiAgYXZhaWxhYmxlRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZCA9ICcnO1xuICBxdWVyeU5hbWU6IHN0cmluZyA9IG51bGw7XG4gIGNhbWVsTW9kZWxOYW1lOiBzdHJpbmc7XG4gIHBvc3NpYmxlRmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBHcmFwaFFMVHlwZT4gPSB7fTtcbiAgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55PiA9IHVuZGVmaW5lZDtcblxuICB0b3RhbENvdW50OiBudW1iZXI7XG4gIHNlbGVjdGVkUGFnZUluZGV4ID0gMDtcbiAgcGFnZXMgPSBbXTtcbiAgcGFnZUl0ZW1zTGltaXRDb250cm9sID0gbmV3IEZvcm1Db250cm9sKDI1KTtcbiAgcGFnZU9wdGlvbnMgPSBbXG4gICAge1xuICAgICAgdGV4dDogJzI1JyxcbiAgICAgIHZhbHVlOiAyNSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRleHQ6ICc1MCcsXG4gICAgICB2YWx1ZTogNTAsXG4gICAgfSxcbiAgICB7XG4gICAgICB0ZXh0OiAnNzUnLFxuICAgICAgdmFsdWU6IDc1LFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogJzEwMCcsXG4gICAgICB2YWx1ZTogMTAwLFxuICAgIH0sXG4gICAge1xuICAgICAgdGV4dDogJzIwMCcsXG4gICAgICB2YWx1ZTogMjAwLFxuICAgIH0sXG4gIF07XG4gIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGdyYXBoUUxNZXRhU2VydmljZTogR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ3JhcGhRTFNlcnZpY2U6IEdyYXBoUUxTZXJ2aWNlLFxuICAgIHByaXZhdGUgY21zU2VydmljZTogQ21zU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2Nyb2xsU2VydmljZTogU2Nyb2xsU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVxuICApIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIE5lZWRlZCB0aW1lIG91dCB0byBwcmV2ZW50IEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW50ZWdyYXRlQ3VzdG9tRm9ybUNvbXBvbmVudCgpO1xuICAgIH0sIDEwKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhZ2VJdGVtc0xpbWl0ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSXRlbXNMaW1pdCcpO1xuICAgIHRoaXMucGFnZUl0ZW1zTGltaXRDb250cm9sLnNldFZhbHVlKHBhZ2VJdGVtc0xpbWl0ID8gcGFnZUl0ZW1zTGltaXQgOiAyNSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIHRoaXMuZ3JhcGhRTE1ldGFTZXJ2aWNlLmdldE1ldGEoKS5zdWJzY3JpYmUoKG1ldGEpID0+IHtcbiAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cbiAgICAgIGlmICh0aGlzLm1vZGVsTmFtZSkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub2JqZWN0SWQ7XG5cbiAgICAgICAgLy8gTmVlZGVkIHRpbWUgb3V0IGZvciByZXJlbmRlclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmludGVncmF0ZUN1c3RvbUZvcm1Db21wb25lbnQoKTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydtb2RlbE5hbWUnXSAmJiB0aGlzLm1ldGEpIHtcbiAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzWydvYmplY3RJZCddICYmIHRoaXMubWV0YSkge1xuICAgICAgaWYgKHRoaXMuaWQgIT09IHRoaXMub2JqZWN0SWQpIHtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50OjpuZ09uQ2hhbmdlcy0+c2VsZWN0ZWRJZCcsIHRoaXMuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pZCA9IHRoaXMub2JqZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRDaGFuZ2VzSW5Db21wb25lbnRSZWYoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogV2UncmUgdXNpbmcgdGhlIGBtZXRhYCBzZXJ2aWNlIHRvIGdldCB0aGUgZmllbGRzIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGBmaW5kYCBxdWVyeSBmb3IgdGhlIG1vZGVsIHdlJ3JlIHdvcmtpbmdcbiAgICogd2l0aC4gV2UncmUgdGhlbiB1c2luZyB0aGF0IGluZm9ybWF0aW9uIHRvIHBvcHVsYXRlIHRoZSBgYXZhaWxhYmxlRmllbGRzYCBhcnJheVxuICAgKi9cbiAgYXN5bmMgaW5pdCgpIHtcbiAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyA9IFtdO1xuICAgIHRoaXMucGFnZXMgPSBbXTtcbiAgICB0aGlzLnRvdGFsQ291bnQgPSBudWxsO1xuICAgIHRoaXMuY2FtZWxNb2RlbE5hbWUgPSB0aGlzLmtlYmFiVG9DYW1lbENhc2UodGhpcy5tb2RlbE5hbWUpO1xuXG4gICAgLy8gU2V0IHF1ZXJ5IG5hbWVcbiAgICBpZiAoIXRoaXMubW9kZWxDb25maWc/LnF1ZXJ5TmFtZSkge1xuICAgICAgdGhpcy5xdWVyeU5hbWUgPSAnZmluZEFuZENvdW50JyArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMuY2FtZWxNb2RlbE5hbWUpICsgJ3MnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXJ5TmFtZSA9IHRoaXMubW9kZWxDb25maWc/LnF1ZXJ5TmFtZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbENvbmZpZz8udGFibGVGaWVsZHMpIHtcbiAgICAgIHRoaXMudGFibGVGaWVsZHMgPSB0aGlzLm1vZGVsQ29uZmlnLnRhYmxlRmllbGRzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5tb2RlbE5hbWUnLCB0aGlzLm1vZGVsTmFtZSk7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6aW5pdC0+Y2FtZWxNb2RlbE5hbWUnLCB0aGlzLmNhbWVsTW9kZWxOYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5xdWVyeU5hbWUnLCB0aGlzLnF1ZXJ5TmFtZSk7XG4gICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6aW5pdC0+dGFibGVGaWVsZHMnLCB0aGlzLnRhYmxlRmllbGRzKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc3NpYmxlRmllbGRzID0gdGhpcy5tZXRhLmdldEZpZWxkcyh0aGlzLnF1ZXJ5TmFtZSkuZmllbGRzO1xuICAgIGxldCBrZXlzO1xuICAgIGlmICh0aGlzLnBvc3NpYmxlRmllbGRzPy5pdGVtcyAmJiBPYmplY3Qua2V5cyh0aGlzLnBvc3NpYmxlRmllbGRzPy5pdGVtcz8uZmllbGRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModGhpcy5wb3NzaWJsZUZpZWxkcy5pdGVtcy5maWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBrZXlzID0gT2JqZWN0LmtleXModGhpcy5wb3NzaWJsZUZpZWxkcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVGaWVsZEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnRhYmxlRmllbGRzKTtcbiAgICB0YWJsZUZpZWxkS2V5cz8uZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGlmIChrZXlzLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5wb3NzaWJsZUZpZWxkcycsIHRoaXMucG9zc2libGVGaWVsZHMpO1xuICAgICAgY29uc29sZS5sb2coJ01vZGVsVGFibGVDb21wb25lbnQ6OmluaXQtPmtleXMnLCBrZXlzKTtcbiAgICAgIGNvbnNvbGUubG9nKCdNb2RlbFRhYmxlQ29tcG9uZW50Ojppbml0LT5hdmFpbGFibGVGaWVsZHMnLCB0aGlzLmF2YWlsYWJsZUZpZWxkcyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JykgPyB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWQoJ3BhZ2VJbmRleCcpIDogMDtcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKHRoaXMuYXZhaWxhYmxlRmllbGRzLCAwLCB0aGlzLnBhZ2VJdGVtc0xpbWl0Q29udHJvbC52YWx1ZSk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb1BhZ2VJdGVtcygpO1xuICB9XG5cbiAgc3Vic2NyaWJlVG9QYWdlSXRlbXMoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5wYWdlSXRlbXNMaW1pdENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXggPSAwO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZSgncGFnZUluZGV4JywgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCk7XG4gICAgICAgICAgdGhpcy5vYmplY3RzID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyh0aGlzLmF2YWlsYWJsZUZpZWxkcywgMCwgdmFsdWUpO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2F2ZSgncGFnZUl0ZW1zTGltaXQnLCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBpbnRlZ3JhdGVDdXN0b21Gb3JtQ29tcG9uZW50KCkge1xuICAgIGlmICghdGhpcy5jdXN0b21Gb3JtVGVtcGxhdGUgfHwgdGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21Db21wb25lbnQgPSB0aGlzLm1vZGVsQ29uZmlnPy5jdXN0b21UZW1wbGF0ZUNvbXBvbmVudDtcbiAgICBpZiAoY3VzdG9tQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMuY3VzdG9tRm9ybVRlbXBsYXRlPy5jcmVhdGVDb21wb25lbnQ8YW55PihjdXN0b21Db21wb25lbnQpO1xuICAgICAgdGhpcy5zZXRDaGFuZ2VzSW5Db21wb25lbnRSZWYoKTtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlLmZpbmlzaGVkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0SWQoJycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Q2hhbmdlc0luQ29tcG9uZW50UmVmKCkge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgICAgZGVsZXRlOiB0aGlzLmRlbGV0ZSxcbiAgICAgICAgZHVwbGljYXRlOiB0aGlzLmR1cGxpY2F0ZSxcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIGxhYmVsOiB0aGlzLm1vZGVsQ29uZmlnPy5sYWJlbCxcbiAgICAgICAgbG9nZ2luZzogdGhpcy5sb2dnaW5nLFxuICAgICAgICBtb2RlbE5hbWU6IHRoaXMuY2FtZWxNb2RlbE5hbWUsXG4gICAgICAgIHNob3dGYXZCdXR0b246IHRoaXMuc2hvd0ZhdkJ1dHRvbixcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJDcmVhdGUgTmV3XCIgYnV0dG9uLCB0aGUgY3JlYXRlTW9kZUNoYW5nZWQgZXZlbnQgaXMgZW1pdHRlZCwgd2hpY2ggaXMgdGhlbiBoYW5kbGVkIGJ5IHRoZVxuICAgKiBwYXJlbnQgY29tcG9uZW50XG4gICAqL1xuICBjcmVhdGVOZXdPYmplY3QoKSB7XG4gICAgdGhpcy5jcmVhdGVNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLmNyZWF0ZU1vZGVDaGFuZ2VkLmVtaXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgbG9hZHMgdGhlIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSBvYmplY3RzIHZhcmlhYmxlXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZHMgLSBzdHJpbmdbXSAtIFRoZSBmaWVsZHMgeW91IHdhbnQgdG8gbG9hZCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHNraXBcbiAgICogQHBhcmFtIGxpbWl0XG4gICAqL1xuICBsb2FkT2JqZWN0cyhmaWVsZHM6IHN0cmluZ1tdLCBza2lwID0gMCwgbGltaXQgPSAyNSk6IFByb21pc2U8YW55W10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55W10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RGaWVsZHMgPSBbLi4uZmllbGRzXTtcbiAgICAgIGNvbnN0IGlkSW5GaWVsZHMgPSByZXF1ZXN0RmllbGRzLmZpbmQoKGUpID0+IGUgPT09ICdpZCcpO1xuXG4gICAgICBpZiAoIWlkSW5GaWVsZHMpIHtcbiAgICAgICAgcmVxdWVzdEZpZWxkcy5wdXNoKCdpZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0ZpbmRBbmRDb3VudCA9IHRoaXMucXVlcnlOYW1lLmluY2x1ZGVzKCdmaW5kQW5kQ291bnQnKTtcblxuICAgICAgdGhpcy5ncmFwaFFMU2VydmljZVxuICAgICAgICAuZ3JhcGhRbCh0aGlzLnF1ZXJ5TmFtZSwge1xuICAgICAgICAgIGFyZ3VtZW50czoge1xuICAgICAgICAgICAgbGltaXQ6IGlzRmluZEFuZENvdW50ID8gbGltaXQgOiBudWxsLFxuICAgICAgICAgICAgc2tpcDogaXNGaW5kQW5kQ291bnQgPyBza2lwIDogbnVsbCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogaXNGaW5kQW5kQ291bnQgPyBbJ3RvdGFsQ291bnQnLCB7IGl0ZW1zOiByZXF1ZXN0RmllbGRzIH1dIDogcmVxdWVzdEZpZWxkcyxcbiAgICAgICAgICB0eXBlOiBHcmFwaFFMUmVxdWVzdFR5cGUuUVVFUlksXG4gICAgICAgIH0pXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1zO1xuICAgICAgICAgICAgaWYgKHRoaXMubG9nZ2luZykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kZWxUYWJsZUNvbXBvbmVudDo6bG9hZE9iamVjdHMtPnZhbHVlJywgdmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWU/LnRvdGFsQ291bnQgPj0gMCkge1xuICAgICAgICAgICAgICBpdGVtcyA9IHZhbHVlLml0ZW1zO1xuICAgICAgICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSB2YWx1ZS50b3RhbENvdW50O1xuICAgICAgICAgICAgICB0aGlzLnBhZ2VzID0gW107XG4gICAgICAgICAgICAgIGxldCBudW1iZXJzID0gMDtcblxuICAgICAgICAgICAgICB3aGlsZSAobnVtYmVycyA8IHRoaXMudG90YWxDb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBza2lwOiBudW1iZXJzLFxuICAgICAgICAgICAgICAgICAgbGltaXQ6IHRoaXMucGFnZUl0ZW1zTGltaXRDb250cm9sLnZhbHVlLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbnVtYmVycyA9IG51bWJlcnMgKyB0aGlzLnBhZ2VJdGVtc0xpbWl0Q29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGxvYWRlZEluZGV4ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSW5kZXgnKTtcbiAgICAgICAgICAgICAgaWYgKGxvYWRlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvYWRlZEluZGV4ID4gdGhpcy5wYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zYXZlKCdwYWdlSW5kZXgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGl0ZW1zID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoaXRlbXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBvbiBsb2FkaW5nIG9iamVjdHMnLCBlcnIpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHVwZGF0ZSBwcm9wZXJ0eSBpcyB0cnVlLCB0aGVuIHNldCB0aGUgc2VsZWN0ZWRJZCBwcm9wZXJ0eSB0byB0aGUgaWQgb2YgdGhlIG9iamVjdCBwYXNzZWQgaW4sIGFuZCBlbWl0IHRoZVxuICAgKiBzZWxlY3RlZElkIHByb3BlcnR5XG4gICAqL1xuICBzZWxlY3RJZChvYmplY3Q6IGFueSkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICB0aGlzLmNyZWF0ZU1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY3JlYXRlTW9kZUNoYW5nZWQuZW1pdChmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXBkYXRlKSB7XG4gICAgICB0aGlzLmlkID0gb2JqZWN0WydpZCddO1xuICAgICAgdGhpcy5pZFNlbGVjdGVkLmVtaXQodGhpcy5pZCk7XG4gICAgfVxuICB9XG5cbiAgb3Blbk5ld1RhYihvYmplY3Q6IGFueSkge1xuICAgIHdpbmRvdy5vcGVuKGxvY2F0aW9uLmhyZWYgKyAnLycgKyBvYmplY3RbJ2lkJ10sICdfYmxhbmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBjYWxscyB0aGUgZHVwbGljYXRlT2JqZWN0IGZ1bmN0aW9uIGluIHRoZSBjbXNTZXJ2aWNlLCBwYXNzaW5nIGluIHRoZSBpZCBvZiB0aGUgb2JqZWN0IHRvIGJlIGR1cGxpY2F0ZWQgYW5kIHRoZVxuICAgKiBtb2RlbE5hbWUgb2YgdGhlIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgZHVwbGljYXRlT2JqZWN0KGlkOiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmNtc1NlcnZpY2UuZHVwbGljYXRlT2JqZWN0KGlkLCB0aGlzLmNhbWVsTW9kZWxOYW1lKTtcbiAgICB0aGlzLnNlbGVjdGVkUGFnZUluZGV4ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSW5kZXgnKSA/IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JykgOiAwO1xuICAgIHRoaXMub2JqZWN0cyA9IGF3YWl0IHRoaXMubG9hZE9iamVjdHMoXG4gICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0ubGltaXRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IGNhbGxzIHRoZSBkZWxldGVPYmplY3QgZnVuY3Rpb24gaW4gdGhlIGNtc1NlcnZpY2UsIHBhc3NpbmcgaW4gdGhlIGlkIG9mIHRoZSBvYmplY3QgdG8gZGVsZXRlIGFuZCB0aGUgbmFtZSBvZiB0aGVcbiAgICogbW9kZWxcbiAgICovXG4gIGFzeW5jIGRlbGV0ZU9iamVjdChpZDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5jbXNTZXJ2aWNlLmRlbGV0ZU9iamVjdChpZCwgdGhpcy5jYW1lbE1vZGVsTmFtZSk7XG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JykgPyB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmxvYWQoJ3BhZ2VJbmRleCcpIDogMDtcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLmxvYWRPYmplY3RzKFxuICAgICAgdGhpcy5hdmFpbGFibGVGaWVsZHMsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLnNraXAsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLmxpbWl0XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCB0YWtlcyBhIHN0cmluZywgY2FwaXRhbGl6ZXMgdGhlIGZpcnN0IGxldHRlciwgYW5kIHJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZ1xuICAgKi9cbiAgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jbXNTZXJ2aWNlLmNhcGl0YWxpemVGaXJzdExldHRlcih2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogS2ViYWIgdG8gY2FtZWwgY2FzZSBzdHJpbmdcbiAgICovXG4gIGtlYmFiVG9DYW1lbENhc2Uoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLy0uL2csIChtYXRjaCkgPT4gbWF0Y2hbMV0udG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IG9iamVjdHMgZnJvbSBqc29uIGZpbGVcbiAgICovXG4gIHByb2Nlc3NJbXBvcnQoZXZlbnQpIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgRmlsZVJlYWRlcigpIG9iamVjdFxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgZXZlbnQgdG8gcnVuIHdoZW4gdGhlIGZpbGUgaXMgcmVhZFxuICAgIHJlYWRlci5vbmxvYWQgPSBhc3luYyAocmVhZGVyRXZlbnQpID0+IHtcbiAgICAgIGxldCBqc29uUmVzdWx0ID0gSlNPTi5wYXJzZShyZWFkZXJFdmVudC50YXJnZXQucmVzdWx0IGFzIGFueSk7XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uUmVzdWx0KSkge1xuICAgICAgICBqc29uUmVzdWx0ID0gW2pzb25SZXN1bHRdO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb25SZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmdyYXBoUUxTZXJ2aWNlXG4gICAgICAgICAgICAuZ3JhcGhRbCgnY3JlYXRlJyArIHRoaXMuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMubW9kZWxOYW1lKSwge1xuICAgICAgICAgICAgICBhcmd1bWVudHM6IHsgaW5wdXQ6IGpzb25SZXN1bHRbaV0gfSxcbiAgICAgICAgICAgICAgZmllbGRzOiBbJ2lkJ10sXG4gICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxSZXF1ZXN0VHlwZS5NVVRBVElPTixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy0nICsgaSArICctc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuU1VDQ0VTUyxcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiAnRXJmb2xncmVpY2gnLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdFbGVtZW50ICcgKyAoaSArIDEpICsgJyB2b24gJyArIGpzb25SZXN1bHQubGVuZ3RoICsgJyBlcmZvbGdyZWljaCBpbXBvcnRpZXJ0LicsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0ganNvblJlc3VsdC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGFnZUluZGV4ID0gdGhpcy5zdG9yYWdlU2VydmljZS5sb2FkKCdwYWdlSW5kZXgnKVxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc3RvcmFnZVNlcnZpY2UubG9hZCgncGFnZUluZGV4JylcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgICAgICAgdGhpcy5vYmplY3RzID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlc1t0aGlzLnNlbGVjdGVkUGFnZUluZGV4XS5saW1pdFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbE5hbWUgKyAnLScgKyBpICsgJy1lcnJvcicsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdFR5cGUuRVJST1IsXG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRWxlbWVudCAnICsgKGkgKyAxKSArICcgdm9uICcgKyBqc29uUmVzdWx0Lmxlbmd0aCArICcga29ubnRlIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuLicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWxOYW1lICsgJy0nICsgaSArICctZXJyb3InLFxuICAgICAgICAgICAgdHlwZTogVG9hc3RUeXBlLkVSUk9SLFxuICAgICAgICAgICAgdGl0bGU6ICdFcnJvcicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0VsZW1lbnQgJyArIChpICsgMSkgKyAnIHZvbiAnICsganNvblJlc3VsdC5sZW5ndGggKyAnIGtvbm50ZSBuaWNodCBpbXBvcnRpZXJ0IHdlcmRlbi4nLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFJlYWQgdGhlIGZpbGVcbiAgICByZWFkZXIucmVhZEFzVGV4dChldmVudC50YXJnZXQuZmlsZXNbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBvYmplY3RzIGFzIGpzb25cbiAgICovXG4gIGFzeW5jIHByb2Nlc3NFeHBvcnQoKSB7XG4gICAgY29uc3Qga2V5cyA9IHRoaXMuZ2V0QWxsS2V5cygpO1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5sb2FkT2JqZWN0cyhcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLnNraXAsXG4gICAgICB0aGlzLnBhZ2VzW3RoaXMuc2VsZWN0ZWRQYWdlSW5kZXhdLmxpbWl0XG4gICAgKTtcbiAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoaXRlbXMpO1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHsgdHlwZTogJ3RleHQvanNvbjtjaGFyc2V0PXV0Zi04OycgfSk7XG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xuICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIHRoaXMubW9kZWxOYW1lICsgJ3MuanNvbicpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgbGluay5jbGljaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwga2V5cyBmb3IgcmVxdWVzdCB0byBleHBvcnQgb2JqZWN0cyBhcyBqc29uXG4gICAqL1xuICBnZXRBbGxLZXlzKCkge1xuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wb3NzaWJsZUZpZWxkcykpIHtcbiAgICAgIGlmICghdGhpcy5wb3NzaWJsZUZpZWxkc1trZXldLmZpZWxkcyB8fCBPYmplY3Qua2V5cyh0aGlzLnBvc3NpYmxlRmllbGRzW2tleV0uZmllbGRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaXRlbXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIGFzeW5jIHNlbGVjdFBhZ2UoaTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnBhZ2VzW2ldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZFBhZ2VJbmRleCA9IGk7XG4gICAgYXdhaXQgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvKCdtb2RlbC10YWJsZS10b3AnKTtcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNhdmUoJ3BhZ2VJbmRleCcsIHRoaXMuc2VsZWN0ZWRQYWdlSW5kZXgpO1xuICAgIHRoaXMub2JqZWN0cyA9IGF3YWl0IHRoaXMubG9hZE9iamVjdHMoXG4gICAgICB0aGlzLmF2YWlsYWJsZUZpZWxkcyxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0uc2tpcCxcbiAgICAgIHRoaXMucGFnZXNbdGhpcy5zZWxlY3RlZFBhZ2VJbmRleF0ubGltaXRcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiIWlkICYmICFjcmVhdGVNb2RlXCI+XG4gIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXggZmxleC1yb3cganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTIgbWItbGctNFwiPlxuICAgIDxoMiBpZD1cIm1vZGVsLXRhYmxlLXRvcFwiIGNsYXNzPVwibWItMFwiICpuZ0lmPVwibW9kZWxOYW1lXCI+XG4gICAgICB7e1xuICAgICAgICBtb2RlbENvbmZpZz8ucGx1cmFsXG4gICAgICAgICAgPyBtb2RlbENvbmZpZz8ucGx1cmFsXG4gICAgICAgICAgOiBtb2RlbENvbmZpZz8ubGFiZWxcbiAgICAgICAgICA/IG1vZGVsQ29uZmlnPy5sYWJlbFxuICAgICAgICAgIDogY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGNhbWVsTW9kZWxOYW1lKSArICdzJ1xuICAgICAgfX1cbiAgICA8L2gyPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGQtbm9uZSBkLWxnLWJsb2NrXCI+XG4gICAgICA8aW5wdXQgI2ltcG9ydEZpbGUgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIuanNvblwiIGNsYXNzPVwiZC1ub25lXCIgKGNoYW5nZSk9XCJwcm9jZXNzSW1wb3J0KCRldmVudClcIiAvPlxuICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBtZS00XCIgKm5nSWY9XCJpbXBvcnQgfHwgZXhwb3J0XCI+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJiaSBiaS10aHJlZS1kb3RzLXZlcnRpY2FsXCJcbiAgICAgICAgICBpZD1cInNldHRpbmdzRHJvcGRvd25cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIlxuICAgICAgICAgIGRhdGEtYnMtYXV0by1jbG9zZT1cInRydWVcIlxuICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgID48L2k+XG4gICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1lbmRcIiBhcmlhLWxhYmVsbGVkYnk9XCJzZXR0aW5nc0Ryb3Bkb3duXCI+XG4gICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBjdXJzb3ItcG9pbnRlclwiICpuZ0lmPVwiZXhwb3J0XCIgKGNsaWNrKT1cInByb2Nlc3NFeHBvcnQoKVwiPkV4cG9ydDwvYT48L2xpPlxuICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImltcG9ydFwiIChjbGljayk9XCJpbXBvcnRGaWxlLmNsaWNrKClcIj4gSW1wb3J0IDwvYT48L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImNyZWF0ZU5ld09iamVjdCgpXCIgKm5nSWY9XCJjcmVhdGVcIj5FcnN0ZWxsZW48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiXG4gICAgW2x0Q29udGV4dE1lbnVdPVwiY29udGV4dE1lbnVcIlxuICAgIFtzZWxlY3RvcnNdPVwiJy5vYmplY3QtY29sJ1wiXG4gICAgI2NvbnRleHRNZW51RGF0YT1cImNvbnRleHRNZW51RGF0YVwiXG4gID5cbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ob3ZlciBiZy13aGl0ZSBkLW5vbmUgZC1sZy10YWJsZVwiPlxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgYXZhaWxhYmxlRmllbGRzXCJcbiAgICAgICAgICAgIFtiYXNlU29ydF09XCJvYmplY3RzXCJcbiAgICAgICAgICAgIGRhdGEtb3JkZXI9XCJkZXNjXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbmFtZV09XCJmaWVsZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdGFibGVGaWVsZHNbZmllbGRdPy5sYWJlbCA/IHRhYmxlRmllbGRzW2ZpZWxkXT8ubGFiZWwgOiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoZmllbGQpIH19XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gICAgICAgIDx0ciBjbGFzcz1cIm9iamVjdC1jb2xcIiAqbmdGb3I9XCJsZXQgb2JqZWN0IG9mIG9iamVjdHNcIiBbaWRdPVwib2JqZWN0W3VuaXF1ZUZpZWxkXVwiPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGF2YWlsYWJsZUZpZWxkc1wiIChjbGljayk9XCJzZWxlY3RJZChvYmplY3QpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFibGVGaWVsZHNbZmllbGRdPy5kYXRlRm9ybWF0XCI+XG4gICAgICAgICAgICAgIHt7IG9iamVjdFtmaWVsZF0gfCBkYXRlIDogdGFibGVGaWVsZHNbZmllbGRdPy5kYXRlRm9ybWF0IH19IFVoclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZUZpZWxkc1tmaWVsZF0/LmVudW1WYWx1ZXNcIj5cbiAgICAgICAgICAgICAge3sgdGFibGVGaWVsZHNbZmllbGRdPy5lbnVtVmFsdWVzW29iamVjdFtmaWVsZF1dPy50ZXh0IH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YWJsZUZpZWxkc1tmaWVsZF0/LmRhdGVGb3JtYXQgJiYgIXRhYmxlRmllbGRzW2ZpZWxkXT8uZW51bVZhbHVlc1wiPlxuICAgICAgICAgICAgICB7eyBvYmplY3RbZmllbGRdIHwgYmFzZUVsbGlwc2VzIDogNjAgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGQtbGctbm9uZSBmbGV4LWNvbHVtbiBmbGV4LWdyb3ctMVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNhcmRcIiAqbmdGb3I9XCJsZXQgb2JqZWN0IG9mIG9iamVjdHNcIiBbaWRdPVwib2JqZWN0W3VuaXF1ZUZpZWxkXVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY2FyZC1lbnRyeVwiICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBhdmFpbGFibGVGaWVsZHM7IGxldCBpID0gaW5kZXhcIiAoY2xpY2spPVwic2VsZWN0SWQob2JqZWN0KVwiPlxuICAgICAgICAgIDxiICpuZ0lmPVwiaSA+IDBcIlxuICAgICAgICAgICAgPnt7IHRhYmxlRmllbGRzW2ZpZWxkXT8ubGFiZWwgPyB0YWJsZUZpZWxkc1tmaWVsZF0/LmxhYmVsIDogY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGZpZWxkKSB9fTo8L2JcbiAgICAgICAgICA+XG4gICAgICAgICAgPHAgW25nQ2xhc3NdPVwieyAndGFibGUtY2FyZC1lbnRyeS1maXJzdCc6IGkgPT09IDAgfVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhYmxlRmllbGRzW2ZpZWxkXT8uZGF0ZUZvcm1hdFwiPlxuICAgICAgICAgICAgICB7eyBvYmplY3RbZmllbGRdIHwgZGF0ZSA6IHRhYmxlRmllbGRzW2ZpZWxkXT8uZGF0ZUZvcm1hdCB9fSBVaHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFibGVGaWVsZHNbZmllbGRdPy5lbnVtVmFsdWVzXCI+XG4gICAgICAgICAgICAgIHt7IHRhYmxlRmllbGRzW2ZpZWxkXT8uZW51bVZhbHVlc1tvYmplY3RbZmllbGRdXT8udGV4dCB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFibGVGaWVsZHNbZmllbGRdPy5kYXRlRm9ybWF0ICYmICF0YWJsZUZpZWxkc1tmaWVsZF0/LmVudW1WYWx1ZXNcIj5cbiAgICAgICAgICAgICAge3sgb2JqZWN0W2ZpZWxkXSB8IGJhc2VFbGxpcHNlcyA6IDYwIH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCIgKm5nSWY9XCJ0b3RhbENvdW50ID49IDAgJiYgcGFnZXMubGVuZ3RoID4gMVwiPlxuICAgICAgPG5hdiBjbGFzcz1cImQtZmxleCByb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtMlwiPjwvZGl2PlxuICAgICAgICA8dWwgY2xhc3M9XCJwYWdpbmF0aW9uIGp1c3RpZnktY29udGVudC1jZW50ZXIgY29sLTEyIGNvbC1tZC04XCI+XG4gICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBjbGFzcz1cInBhZ2UtbGlua1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKHNlbGVjdGVkUGFnZUluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXNcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGRpc2FibGVkOiBzZWxlY3RlZFBhZ2VJbmRleCAtIDEgPiAwIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mbGFxdW87PC9zcGFuPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCIgKm5nRm9yPVwibGV0IHBhZ2Ugb2YgcGFnZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUGFnZUluZGV4ID09PSBpIH1cIiAoY2xpY2spPVwic2VsZWN0UGFnZShpKVwiPnt7IGkgKyAxIH19PC9hPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPGxpIGNsYXNzPVwicGFnZS1pdGVtXCI+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBjbGFzcz1cInBhZ2UtbGlua1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQYWdlKHNlbGVjdGVkUGFnZUluZGV4ICsgMSlcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgZGlzYWJsZWQ6IHBhZ2VzW3NlbGVjdGVkUGFnZUluZGV4ICsgMV0gfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZyYXF1bzs8L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC0yXCI+XG4gICAgICAgICAgPGJhc2Utc2VsZWN0IFtvcHRpb25zXT1cInBhZ2VPcHRpb25zXCIgW2NvbnRyb2xdPVwicGFnZUl0ZW1zTGltaXRDb250cm9sXCI+PC9iYXNlLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25hdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnVcIiAjY29udGV4dE1lbnU+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1tZW51LWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0SWQoeyBpZDogY29udGV4dE1lbnVEYXRhLmNsaWNrZWRFbGVtZW50Py5pZCB9KVwiPkJlYXJiZWl0ZW48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiIChjbGljayk9XCJvcGVuTmV3VGFiKHsgaWQ6IGNvbnRleHRNZW51RGF0YS5jbGlja2VkRWxlbWVudD8uaWQgfSlcIj5cbiAgICAgICAgSW4gbmV1ZW4gVGFiIMO2ZmZuZW5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudS1pdGVtXCIgKm5nSWY9XCJkdXBsaWNhdGVcIiAoY2xpY2spPVwiZHVwbGljYXRlT2JqZWN0KGNvbnRleHRNZW51RGF0YS5jbGlja2VkRWxlbWVudD8uaWQpXCI+XG4gICAgICAgIER1cGxpemllcmVuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LW1lbnUtaXRlbVwiICpuZ0lmPVwiZGVsZXRlXCIgKGNsaWNrKT1cImRlbGV0ZU9iamVjdChjb250ZXh0TWVudURhdGEuY2xpY2tlZEVsZW1lbnQ/LmlkKVwiPlxuICAgICAgICBMw7ZzY2hlblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJ3LTEwMFwiICpuZ0lmPVwiaWQgfHwgY3JlYXRlTW9kZVwiPlxuICA8YnV0dG9uIGNsYXNzPVwiZC1ub25lIGQtbGctYmxvY2sgYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgbWItM1wiIChjbGljayk9XCJzZWxlY3RJZCgnJylcIj5adXLDvGNrPC9idXR0b24+XG4gIDxiYXNlLW1vZGVsLWZvcm1cbiAgICAqbmdJZj1cIiFtb2RlbENvbmZpZz8uY3VzdG9tVGVtcGxhdGVDb21wb25lbnRcIlxuICAgIFttb2RlbE5hbWVdPVwiY2FtZWxNb2RlbE5hbWVcIlxuICAgIFtsYWJlbF09XCJtb2RlbENvbmZpZz8ubGFiZWxcIlxuICAgIFtjb25maWddPVwiY29uZmlnXCJcbiAgICBbbG9nZ2luZ109XCJsb2dnaW5nXCJcbiAgICBbaWRdPVwiaWRcIlxuICAgIChmaW5pc2hlZCk9XCJzZWxlY3RJZCgnJylcIlxuICAgIFtkZWxldGVdPVwiZGVsZXRlXCJcbiAgICBbZHVwbGljYXRlXT1cImR1cGxpY2F0ZVwiXG4gICAgW3Nob3dGYXZCdXR0b25dPVwic2hvd0ZhdkJ1dHRvblwiXG4gID48L2Jhc2UtbW9kZWwtZm9ybT5cbiAgPG5nLXRlbXBsYXRlICpuZ0lmPVwibW9kZWxDb25maWc/LmN1c3RvbVRlbXBsYXRlQ29tcG9uZW50XCIgI2N1c3RvbUZvcm1UZW1wbGF0ZT48L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJyZXNwb25zaXZlLWFjdGlvbi1idXR0b24gZC1ibG9jayBkLWxnLW5vbmVcIj5cbiAgPGJhc2UtZmFiLWJ1dHRvblxuICAgIFtmYWJJY29uXT1cIidiaS1wbHVzJ1wiXG4gICAgKGNsaWNrKT1cImNyZWF0ZU5ld09iamVjdCgpXCJcbiAgICAqbmdJZj1cIiEoaWQgfHwgY3JlYXRlTW9kZSkgJiYgc2hvd0ZhdkJ1dHRvblwiXG4gID48L2Jhc2UtZmFiLWJ1dHRvbj5cbjwvZGl2PlxuIl19
|
|
@@ -60,6 +60,9 @@ export class ProfileComponent {
|
|
|
60
60
|
* It gets the current user from the database and updates the current user in the session
|
|
61
61
|
*/
|
|
62
62
|
updateSessionUser() {
|
|
63
|
+
if (!this.authService.currentUser) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
63
66
|
this.userService.get(this.authService.currentUser.id).subscribe((user) => {
|
|
64
67
|
if (user) {
|
|
65
68
|
this.authService.currentUser = user;
|
|
@@ -75,4 +78,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
75
78
|
}], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.ActivatedRoute }, { type: i1.UserService }]; }, propDecorators: { config: [{
|
|
76
79
|
type: Input
|
|
77
80
|
}] } });
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtcHJvdG90eXBlL3BhZ2VzL3Byb2ZpbGUvcHJvZmlsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL2Jhc2UtcHJvdG90eXBlL3BhZ2VzL3Byb2ZpbGUvcHJvZmlsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFTekQsTUFBTSxPQUFPLGdCQUFnQjtJQXlDM0IsWUFBb0IsV0FBd0IsRUFBVSxLQUFxQixFQUFVLFdBQXdCO1FBQXpGLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQXhDcEcsV0FBTSxHQUFzQyxFQUFFLENBQUM7UUFDeEQsa0JBQWEsR0FBc0M7WUFDakQsTUFBTSxFQUFFO2dCQUNOLEtBQUssRUFBRSxZQUFZO2dCQUNuQixXQUFXLEVBQUUsRUFBRTtnQkFDZixhQUFhLEVBQUUsSUFBSTtnQkFDbkIsZUFBZSxFQUFFO29CQUNmLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDbEIsTUFBTSxFQUFFLEtBQUs7aUJBQ2Q7YUFDRjtZQUNELEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsUUFBUTtnQkFDZixXQUFXLEVBQUUsRUFBRTthQUNoQjtZQUNELFNBQVMsRUFBRTtnQkFDVCxLQUFLLEVBQUUsU0FBUztnQkFDaEIsV0FBVyxFQUFFLEVBQUU7YUFDaEI7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFdBQVcsRUFBRSxFQUFFO2FBQ2hCO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxFQUFFO2dCQUNULE9BQU8sRUFBRSxJQUFJO2dCQUNiLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQzthQUNqQjtZQUNELFFBQVEsRUFBRTtnQkFDUixLQUFLLEVBQUUsY0FBYztnQkFDckIsV0FBVyxFQUFFLEVBQUU7YUFDaEI7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLElBQUk7YUFDZDtTQUNGLENBQUM7UUFLQSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUM7SUFDN0MsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9ELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2pDLHVDQUF1QztZQUN2QyxJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7YUFDekQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRTtZQUNqQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2RSxJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDckM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OzhHQXBFVSxnQkFBZ0I7a0dBQWhCLGdCQUFnQixrRkNUN0IsaVVBWUE7NEZESGEsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGNBQWM7eUpBS2YsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSwgQmFzaWNVc2VyLCBDTVNGaWVsZENvbmZpZywgVXNlclNlcnZpY2UgfSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Jhc2UtcHJvZmlsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9maWxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvZmlsZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9maWxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgY29uZmlnOiB7IFtrZXk6IHN0cmluZ106IENNU0ZpZWxkQ29uZmlnIH0gPSB7fTtcbiAgcHJvZmlsZUNvbmZpZzogeyBba2V5OiBzdHJpbmddOiBDTVNGaWVsZENvbmZpZyB9ID0ge1xuICAgIGF2YXRhcjoge1xuICAgICAgbGFiZWw6ICdQcm9maWxiaWxkJyxcbiAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgIGNyb3BwaW5nSW1hZ2U6IHRydWUsXG4gICAgICBjcm9wcGluZ09wdGlvbnM6IHtcbiAgICAgICAgYXNwZWN0UmF0aW86IDEgLyAxLFxuICAgICAgICBmb3JtYXQ6ICdwbmcnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGVtYWlsOiB7XG4gICAgICBsYWJlbDogJ0UtTWFpbCcsXG4gICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgfSxcbiAgICBmaXJzdE5hbWU6IHtcbiAgICAgIGxhYmVsOiAnVm9ybmFtZScsXG4gICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgfSxcbiAgICBsYXN0TmFtZToge1xuICAgICAgbGFiZWw6ICdOYWNobmFtZScsXG4gICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgfSxcbiAgICByb2xlczoge1xuICAgICAgbGFiZWw6ICcnLFxuICAgICAgZXhjbHVkZTogdHJ1ZSxcbiAgICAgIHJvbGVzOiBbJ2FkbWluJ10sXG4gICAgfSxcbiAgICB1c2VybmFtZToge1xuICAgICAgbGFiZWw6ICdCZW51dHplcm5hbWUnLFxuICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgIH0sXG4gICAgcGFzc3dvcmQ6IHtcbiAgICAgIGxhYmVsOiAnJyxcbiAgICAgIGV4Y2x1ZGU6IHRydWUsXG4gICAgfSxcbiAgfTtcblxuICBjdXJyZW50VXNlcjogQmFzaWNVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UpIHtcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gYXV0aFNlcnZpY2UuY3VycmVudFVzZXI7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnByb2ZpbGVDb25maWcgPSB7IC4uLnRoaXMucHJvZmlsZUNvbmZpZywgLi4udGhpcy5jb25maWcgfTtcbiAgICB0aGlzLnJvdXRlLmRhdGEuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAvLyBNZXJnZSBjb25maWcgZnJvbSByb3V0ZSB0byBjb21wb25lbnRcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHRoaXMucHJvZmlsZUNvbmZpZyA9IHsgLi4udGhpcy5wcm9maWxlQ29uZmlnLCAuLi5kYXRhIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgZ2V0cyB0aGUgY3VycmVudCB1c2VyIGZyb20gdGhlIGRhdGFiYXNlIGFuZCB1cGRhdGVzIHRoZSBjdXJyZW50IHVzZXIgaW4gdGhlIHNlc3Npb25cbiAgICovXG4gIHVwZGF0ZVNlc3Npb25Vc2VyKCkge1xuICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5jdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudXNlclNlcnZpY2UuZ2V0KHRoaXMuYXV0aFNlcnZpY2UuY3VycmVudFVzZXIuaWQpLnN1YnNjcmliZSgodXNlcikgPT4ge1xuICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5jdXJyZW50VXNlciA9IHVzZXI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cInB5LTVcIj5cbiAgICA8YmFzZS1tb2RlbC1mb3JtXG4gICAgICBbaWRdPVwiY3VycmVudFVzZXI/LmlkXCJcbiAgICAgIFttb2RlbE5hbWVdPVwiJ3VzZXInXCJcbiAgICAgIFtsYWJlbF09XCInTWVpbiBQcm9maWwnXCJcbiAgICAgIFtjb25maWddPVwicHJvZmlsZUNvbmZpZyB8fCB7fVwiXG4gICAgICBbZGVsZXRlXT1cImZhbHNlXCJcbiAgICAgIChmaW5pc2hlZCk9XCJ1cGRhdGVTZXNzaW9uVXNlcigpXCJcbiAgICA+PC9iYXNlLW1vZGVsLWZvcm0+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|