verben-workflow-ui 0.5.75 → 0.5.76
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/esm2022/src/lib/components/tasks/tasks.component.mjs +11 -132
- package/esm2022/src/lib/components/tasks/tasks.facade.mjs +45 -7
- package/esm2022/src/lib/components/tasks/tasks.service.mjs +2 -2
- package/esm2022/src/lib/components/tasks/tasks.state.mjs +11 -1
- package/fesm2022/verben-workflow-ui-src-lib-components-tasks.mjs +67 -138
- package/fesm2022/verben-workflow-ui-src-lib-components-tasks.mjs.map +1 -1
- package/package.json +23 -23
- package/src/lib/components/tasks/tasks.component.d.ts +8 -34
- package/src/lib/components/tasks/tasks.facade.d.ts +7 -1
- package/src/lib/components/tasks/tasks.state.d.ts +4 -0
- package/styles/styles.css +0 -6
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Component, input
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
1
|
+
import { Component, input } from '@angular/core';
|
|
3
2
|
import { ObjectState, TaskStatus } from 'verben-workflow-ui/src/lib/models';
|
|
4
3
|
import { BaseDataViewComponent } from 'verben-workflow-ui/src/lib/shared';
|
|
5
4
|
import { columns } from './tasks.columns';
|
|
@@ -11,13 +10,13 @@ import * as i0 from "@angular/core";
|
|
|
11
10
|
import * as i1 from "./tasks.facade";
|
|
12
11
|
import * as i2 from "@angular/common";
|
|
13
12
|
import * as i3 from "verben-ng-ui";
|
|
14
|
-
import * as i4 from "@angular/
|
|
15
|
-
import * as i5 from "
|
|
13
|
+
import * as i4 from "@angular/router";
|
|
14
|
+
import * as i5 from "verben-workflow-ui/src/lib/components/operation-popup";
|
|
16
15
|
import * as i6 from "./tasks.form.component";
|
|
17
16
|
export class TasksComponent extends BaseDataViewComponent {
|
|
18
17
|
cdr;
|
|
19
18
|
taskFacade;
|
|
20
|
-
user = input();
|
|
19
|
+
user = input('');
|
|
21
20
|
config = {
|
|
22
21
|
dataSource: [], // Populate from service
|
|
23
22
|
columns: columns, // Your existing column definitions
|
|
@@ -35,41 +34,6 @@ export class TasksComponent extends BaseDataViewComponent {
|
|
|
35
34
|
// Custom detail view logic
|
|
36
35
|
},
|
|
37
36
|
};
|
|
38
|
-
popups = viewChildren('popup');
|
|
39
|
-
selectedTaskCode = null;
|
|
40
|
-
activeActionType = null;
|
|
41
|
-
comment = '';
|
|
42
|
-
isModalVisible = false;
|
|
43
|
-
tableRowActions = [
|
|
44
|
-
// { label: 'Pick Task', action: (data: Task) => {}, divider: false },
|
|
45
|
-
// { label: 'Release Task', action: (data: Task) => {}, divider: false },
|
|
46
|
-
{ label: 'Follow Task', action: (data) => { }, divider: true },
|
|
47
|
-
// { label: 'Pass On', action: (data: Task) => {}, divider: false },
|
|
48
|
-
// { label: 'Pass Back', action: (data: Task) => {}, divider: false },
|
|
49
|
-
{
|
|
50
|
-
label: 'Re-Assign',
|
|
51
|
-
action: (data) => {
|
|
52
|
-
this.activeActionType = ActionType.ReAssign;
|
|
53
|
-
this.selectedTaskCode = data.Code;
|
|
54
|
-
console.log(this.selectedTaskCode, this.activeActionType);
|
|
55
|
-
this.comment = '';
|
|
56
|
-
this.nextActors = [];
|
|
57
|
-
this.taskFacade.loadNextActors(data.Code, undefined, true).then(() => {
|
|
58
|
-
// if (this.popup() && !this.popup()?.dropdownOpen) {
|
|
59
|
-
// this.popup()?.toggleDropdown();
|
|
60
|
-
// }
|
|
61
|
-
});
|
|
62
|
-
},
|
|
63
|
-
divider: true,
|
|
64
|
-
},
|
|
65
|
-
{ label: 'View Operation', action: (data) => { }, divider: false },
|
|
66
|
-
];
|
|
67
|
-
nextActions = [];
|
|
68
|
-
nextActors = [];
|
|
69
|
-
recipientCode = null;
|
|
70
|
-
selectedAction = new BehaviorSubject(null);
|
|
71
|
-
currentTask = null;
|
|
72
|
-
selectedStageCode = null;
|
|
73
37
|
constructor(cdr, taskFacade) {
|
|
74
38
|
super();
|
|
75
39
|
this.cdr = cdr;
|
|
@@ -77,16 +41,6 @@ export class TasksComponent extends BaseDataViewComponent {
|
|
|
77
41
|
this.taskFacade.getRequests$().subscribe((data) => {
|
|
78
42
|
this.data.set(data);
|
|
79
43
|
});
|
|
80
|
-
// this.taskFacade.getNextActions$().subscribe((data) => {
|
|
81
|
-
// this.nextActions = data;
|
|
82
|
-
// });
|
|
83
|
-
this.taskFacade.getNextActors$().subscribe((data) => {
|
|
84
|
-
this.nextActors = data;
|
|
85
|
-
const activeUser = this.user();
|
|
86
|
-
if (activeUser && data.map(({ Identifier }) => Identifier).includes(activeUser)) {
|
|
87
|
-
this.recipientCode = activeUser;
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
44
|
}
|
|
91
45
|
loadInitialData() {
|
|
92
46
|
try {
|
|
@@ -96,75 +50,11 @@ export class TasksComponent extends BaseDataViewComponent {
|
|
|
96
50
|
// Handle error
|
|
97
51
|
}
|
|
98
52
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (event) {
|
|
102
|
-
this.selectedTaskCode = null;
|
|
103
|
-
}
|
|
53
|
+
handleSearch(event) {
|
|
54
|
+
this.taskFacade.search(event.value, this.user());
|
|
104
55
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
this.popups().forEach((popup) => {
|
|
108
|
-
if (popup !== currentPopup && popup.dropdownOpen) {
|
|
109
|
-
popup.toggleDropdown();
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
this.handlePopupClose(!isOpen);
|
|
114
|
-
}
|
|
115
|
-
handleAction(task, popup) {
|
|
116
|
-
const action = this.activeActionType;
|
|
117
|
-
switch (action) {
|
|
118
|
-
case ActionType.ReAssign:
|
|
119
|
-
this.taskFacade
|
|
120
|
-
.reAssign(task, this.comment, this.recipientCode ?? undefined)
|
|
121
|
-
.then(() => {
|
|
122
|
-
this.comment = '';
|
|
123
|
-
this.nextActors = [];
|
|
124
|
-
this.recipientCode = null;
|
|
125
|
-
this.selectedAction.next(null);
|
|
126
|
-
popup.toggleDropdown();
|
|
127
|
-
});
|
|
128
|
-
break;
|
|
129
|
-
case ActionType.PickTask:
|
|
130
|
-
this.taskFacade
|
|
131
|
-
.pickTask(task, this.comment, this.recipientCode ?? undefined, this.selectedStageCode ?? undefined)
|
|
132
|
-
.then(() => {
|
|
133
|
-
this.comment = '';
|
|
134
|
-
this.nextActors = [];
|
|
135
|
-
this.recipientCode = null;
|
|
136
|
-
this.selectedAction.next(null);
|
|
137
|
-
this.selectedStageCode = null;
|
|
138
|
-
popup.toggleDropdown();
|
|
139
|
-
});
|
|
140
|
-
break;
|
|
141
|
-
case ActionType.SkipTo:
|
|
142
|
-
// const selectedAction = this.selectedAction.getValue();
|
|
143
|
-
// console.log('Selected Action for Skip:', selectedAction);
|
|
144
|
-
// console.log('Task for Skip:', task);
|
|
145
|
-
// console.log('Comment for Skip:', this.comment);
|
|
146
|
-
// console.log('Recipient Code for Skip:', this.recipientCode);
|
|
147
|
-
// if (selectedAction) {
|
|
148
|
-
// this.facade
|
|
149
|
-
// .skipTo(
|
|
150
|
-
// task.CurrentStages[0],
|
|
151
|
-
// selectedAction.ToStage,
|
|
152
|
-
// task,
|
|
153
|
-
// this.comment,
|
|
154
|
-
// this.recipientCode
|
|
155
|
-
// )
|
|
156
|
-
// .then(() => {
|
|
157
|
-
// this.comment = '';
|
|
158
|
-
// this.nextActions = [];
|
|
159
|
-
// this.recipientCode = null;
|
|
160
|
-
// this.selectedAction.next(null);
|
|
161
|
-
// popup.toggleDropdown();
|
|
162
|
-
// });
|
|
163
|
-
// }
|
|
164
|
-
break;
|
|
165
|
-
default:
|
|
166
|
-
break;
|
|
167
|
-
}
|
|
56
|
+
getActionNamesForTask(task) {
|
|
57
|
+
return ['followtask', 'reassign'];
|
|
168
58
|
}
|
|
169
59
|
onStateChange(event) {
|
|
170
60
|
switch (event.key) {
|
|
@@ -223,21 +113,10 @@ export class TasksComponent extends BaseDataViewComponent {
|
|
|
223
113
|
await this.taskFacade.addRequest(payload);
|
|
224
114
|
}
|
|
225
115
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TasksComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TaskFacade }], target: i0.ɵɵFactoryTarget.Component });
|
|
226
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: TasksComponent, selector: "lib-tasks", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null } }, providers: [TasksService, TaskFacade, TaskState], viewQueries: [{ propertyName: "popups", predicate: ["popup"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"space-y-8\">\n <verben-data-view #vdv [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle: true,\n }\" [buttonClass]=\"'my-custom-button-class'\" [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\" [selectedColumnCount]=\"0\" [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\" (viewChange)=\"onViewChange($event)\" (stateChange)=\"onStateChange($event)\">\n <div table-content>\n <lib-data-table [data]=\"data()\" [columns]=\"config.columns\" [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\">\n <ng-container libColumn=\"history\">\n <ng-template #cell let-value>\n <a [routerLink]=\"['/workflow/task-history', value]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF]\">view history</a>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"workflow\">\n <ng-template #cell let-value>\n <a [routerLink]=\"['/workflow/workflows', value]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF]\">view Workflow</a>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-row=\"row\">\n <verben-pop-Up #popup [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\" [customStyles]=\"{\n border: '1px solid #d4a10780',\n borderRadius: '5px',\n backgroundColor: 'white'\n }\" (dropdownOpenChange)=\"onPopupToggled($event, popup)\">\n <div dropdown-trigger class=\"cursor-pointer p-2 -m-2 inline-flex items-center justify-center\">\n <verben-svg icon=\"dots\" [width]=\"3\" [height]=\"18\" class=\"w-auto\"></verben-svg>\n </div>\n <div class=\"bg-white rounded-sm\" dropdown-content>\n @for (item of tableRowActions; track item.label) {\n\n <verben-pop-Up #popup2 [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\" [customStyles]=\"{\n border: '1px solid #d4a10780',\n borderRadius: '5px',\n backgroundColor: 'white'\n }\" (dropdownOpenChange)=\"handlePopupClose($event)\">\n <div (click)=\"item.action(row)\" dropdown-trigger class=\"cursor-pointer py-2 px-3 hover:bg-primary\">\n {{ item.label }}\n </div>\n <div class=\"bg-white rounded-sm\" dropdown-content>\n <div style=\"width: 16rem\">\n <div class=\"flex items-center gap-4 justify-between h-12 px-2 pt-4\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g opacity=\"0.6\">\n <path\n d=\"M6.74649 8.00338C6.91483 8.1347 7.0252 8.20455 7.11531 8.29396C7.98846 9.16222 8.85742 10.0347 9.72917 10.905C9.87167 11.0475 9.99391 11.1921 9.99321 11.4129C9.99251 11.6462 9.89472 11.8152 9.69564 11.9256C9.49307 12.038 9.2926 12.0206 9.10469 11.8899C9.03833 11.8438 8.98175 11.7845 8.92378 11.7272C7.85574 10.6592 6.79678 9.58203 5.71477 8.52867C5.3711 8.19407 5.38437 7.79173 5.70779 7.47599C6.7884 6.42123 7.84875 5.34551 8.91539 4.27607C9.11377 4.07769 9.32054 3.92262 9.623 4.04137C9.97924 4.18107 10.112 4.58901 9.89472 4.90335C9.82976 4.99765 9.74174 5.07728 9.66002 5.1597C8.80642 6.01469 7.95283 6.86968 7.09645 7.72257C7.01472 7.8043 6.91553 7.86856 6.74579 8.00408L6.74649 8.00338Z\"\n fill=\"black\" />\n </g>\n </svg>\n\n <h3 class=\"text-sm font-medium\">Select Assignee</h3>\n </div>\n\n <div class=\"grid gap-2 max-h-96 overflow-y-auto p-2\">\n <!-- <verben-drop-down\n label=\"Action\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Action\"\n [options]=\"nextActions\"\n id=\"actions\"\n optionLabel=\"Name\"\n [ngModel]=\"selectedAction | async\"\n (ngModelChange)=\"selectedAction.next($event)\"\n class=\"form-control\"\n >\n </verben-drop-down> -->\n @if (\n item.label === 'Pick Task'\n ) {\n <verben-drop-down label=\"Stages\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\"\n [filter]=\"true\" filterBy=\"Name\" [showClear]=\"true\" placeholder=\"Select Stage\"\n [options]=\"currentTask?.FullStages || []\" id=\"stages\" optionLabel=\"Name\"\n [(ngModel)]=\"selectedStageCode\" class=\"form-control\">\n </verben-drop-down>\n } @else {\n <verben-drop-down label=\"Actors\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\"\n [filter]=\"true\" filterBy=\"Name\" [showClear]=\"true\" placeholder=\"Select Actor\" [options]=\"nextActors\"\n id=\"actors\" optionLabel=\"Name\" optionValue=\"Identifier\" [(ngModel)]=\"recipientCode\"\n class=\"form-control\">\n </verben-drop-down>\n }\n\n <textarea [(ngModel)]=\"comment\" placeholder=\"Enter Comment\"\n class=\"w-full p-1 text-xs border border-primary rounded-md\" style=\"height: 8rem\"\n [cols]=\"8\"></textarea>\n\n <verbena-button [disable]=\"!comment\" [text]=\"activeActionType ?? ''\"\n (click)=\"handleAction(row, popup)\" class=\"text-xs w-full\" bgColor=\"#FFE681\"\n textColor=\"#404040\" borderRadius=\"10px\" fontSize=\"14px\" pd=\"10px 20px\" width=\"100%\"\n height=\"32px\">\n {{ activeActionType }}\n </verbena-button>\n </div>\n </div>\n </div>\n </verben-pop-Up>\n\n @if (item.divider) {\n <hr class=\"bg-[#FFE681] h-1 rounded-xl border-0\" />\n } }\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template #header>\n <strong>Actions</strong>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n\n <div card-content>\n <verben-card-data-view borderRadius=\"12px\" (loadMoreClick)=\"loadMore()\" #vdcv dataId=\"Id\" border=\"5px\"\n [cardDataList]=\"cardData()\" rbgColor=\"#f5f6f9\" mg=\"20px\">\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data #vlcd [parent]=\"vdcv\" dataId=\"Code\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\" [cardDataList]=\"cardData()\">\n <ng-template #card let-cardItem>\n <div (click)=\"currentData = vdcv.onItemClick(cardItem)\" class=\"flex\">\n <div (click)=\"currentData = vdcv.onItemClick(cardItem)\"\n class=\"flex cursor-pointer w-full bg-secondary rounded-xl\">\n <div class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\" [ngClass]=\"\n cardItem.selected ? 'bg-primary' : 'bg-secondary-200'\n \"></div>\n <div class=\"flex flex-col py-2 px-4 w-full\">\n <div class=\"flex items-center gap-4 justify-between\">\n <div class=\"grid gap-y-2\">\n <span class=\"font-semibold text-[#404040]\">{{\n cardItem.title\n }}</span>\n <p class=\"flex items-center\">\n <!-- <label for=\"phone\" class=\"text-[10px] font-light\">Current Actors:</label> -->\n @if (cardItem.data.CurrentActors && cardItem.data.CurrentActors.length > 0) {\n @if (cardItem.data.CurrentActors.length === 1) {\n <span id=\"phone\" class=\"text-sm\">{{ cardItem.data.CurrentActors[0].Identifier }}</span>\n } @else {\n <verben-tooltip [top]=\"'0px'\" [textColor]=\"'#000'\" [backgroundColor]=\"'#D3D3D3'\" [left]=\"'0'\"\n [tooltipContent]=\"actorsTooltipTemplate\" #actorsTooltip>\n <span id=\"phone\" class=\"text-sm cursor-pointer\">\n {{ cardItem.data.CurrentActors[0].Identifier }} and {{ cardItem.data.CurrentActors.length\n - 1 }} others\n </span>\n </verben-tooltip>\n\n <ng-template #actorsTooltipTemplate>\n <div class=\"p-2\">\n <p class=\"text-xs font-semibold mb-1\">Current Actors:</p>\n <ul class=\"list-disc list-inside\">\n @for (actor of cardItem.data.CurrentActors; track actor.Identifier) {\n <li class=\"text-xs\">{{ actor.Identifier }}</li>\n }\n </ul>\n </div>\n </ng-template>\n }\n } @else {\n <span id=\"phone\" class=\"text-sm text-gray-400\">No actors assigned</span>\n }\n </p>\n </div>\n\n <div class=\"grid gap-y-2\">\n <span for=\"role\" class=\"font-light\">{{\n cardItem.data.Code\n }}</span>\n\n <div (click)=\"$event.stopPropagation();\" class=\"flex items-end gap-4\">\n <a [routerLink]=\"[\n '/workflow/task-history',\n cardItem.data.Code\n ]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF] text-xs relative z-10\">view\n history</a>\n\n <verben-pop-Up #popup [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\"\n [customStyles]=\"{\n border: '1px solid #d4a10780',\n borderRadius: '5px',\n backgroundColor: 'white'\n }\" (dropdownOpenChange)=\"onPopupToggled($event, popup)\">\n <div dropdown-trigger\n class=\"cursor-pointer p-2 -m-2 inline-flex items-center justify-center\">\n <verben-svg icon=\"dots\" [width]=\"3\" [height]=\"18\" class=\"w-auto\"></verben-svg>\n </div>\n <div class=\"bg-white rounded-sm\" dropdown-content>\n @for (item of tableRowActions; track item.label) {\n\n <verben-pop-Up #popup2 [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\"\n [customStyles]=\"{\n border: '1px solid #d4a10780',\n borderRadius: '5px',\n backgroundColor: 'white'\n }\" (dropdownOpenChange)=\"handlePopupClose($event)\">\n <div (click)=\"item.action(cardItem.data)\" dropdown-trigger\n class=\"cursor-pointer py-2 px-3 hover:bg-primary\">\n {{ item.label }}\n </div>\n <div class=\"bg-white rounded-sm\" dropdown-content>\n <div style=\"width: 16rem\">\n <div class=\"flex items-center gap-4 justify-between h-12 px-2 pt-4\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g opacity=\"0.6\">\n <path\n d=\"M6.74649 8.00338C6.91483 8.1347 7.0252 8.20455 7.11531 8.29396C7.98846 9.16222 8.85742 10.0347 9.72917 10.905C9.87167 11.0475 9.99391 11.1921 9.99321 11.4129C9.99251 11.6462 9.89472 11.8152 9.69564 11.9256C9.49307 12.038 9.2926 12.0206 9.10469 11.8899C9.03833 11.8438 8.98175 11.7845 8.92378 11.7272C7.85574 10.6592 6.79678 9.58203 5.71477 8.52867C5.3711 8.19407 5.38437 7.79173 5.70779 7.47599C6.7884 6.42123 7.84875 5.34551 8.91539 4.27607C9.11377 4.07769 9.32054 3.92262 9.623 4.04137C9.97924 4.18107 10.112 4.58901 9.89472 4.90335C9.82976 4.99765 9.74174 5.07728 9.66002 5.1597C8.80642 6.01469 7.95283 6.86968 7.09645 7.72257C7.01472 7.8043 6.91553 7.86856 6.74579 8.00408L6.74649 8.00338Z\"\n fill=\"black\" />\n </g>\n </svg>\n\n <h3 class=\"text-sm font-medium\">Select Assignee</h3>\n </div>\n\n <div class=\"grid gap-2 max-h-96 overflow-y-auto p-2\">\n <!-- <verben-drop-down\n label=\"Action\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Action\"\n [options]=\"nextActions\"\n id=\"actions\"\n optionLabel=\"Name\"\n [ngModel]=\"selectedAction | async\"\n (ngModelChange)=\"selectedAction.next($event)\"\n class=\"form-control\"\n >\n </verben-drop-down> -->\n\n <verben-drop-down label=\"Actors\" styleClass=\"w-full\" width=\"100%\"\n [multiselect]=\"false\" [filter]=\"true\" filterBy=\"Name\" [showClear]=\"true\"\n placeholder=\"Select Actor\" [options]=\"nextActors\" id=\"actors\"\n optionLabel=\"Name\" optionValue=\"Identifier\" [(ngModel)]=\"recipientCode\"\n class=\"form-control\">\n </verben-drop-down>\n\n <textarea [(ngModel)]=\"comment\" placeholder=\"Enter Comment\"\n class=\"w-full p-1 text-xs border border-primary rounded-md\" style=\"height: 8rem\"\n [cols]=\"8\"></textarea>\n\n <verbena-button [disable]=\"!comment\" [text]=\"activeActionType ?? ''\"\n (click)=\"handleAction(cardItem.data, popup)\" class=\"text-xs w-full\"\n bgColor=\"#FFE681\" textColor=\"#404040\" borderRadius=\"10px\" fontSize=\"14px\"\n pd=\"10px 20px\" width=\"100%\" height=\"32px\">\n {{ activeActionType }}\n </verbena-button>\n </div>\n </div>\n </div>\n </verben-pop-Up>\n\n @if (item.divider) {\n <hr class=\"bg-[#FFE681] h-1 rounded-xl border-0\" />\n } }\n </div>\n </verben-pop-Up>\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex\">\n <span class=\"font-normal text-sm\">{{ item.title }}</span>\n </div>\n @for (ciItem of item.body; track ciItem.value) {\n <div class=\"\">\n <span class=\"text-muted font-light text-xs\"\n >{{ ciItem.title }}:</span\n >\n <span class=\"text-black\">{{ ciItem.value }}</span>\n </div>\n } -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n\n <verben-right-card-data-view>\n <ng-template #parent>\n <!-- <lib-user-request-form\n [currentData]=\"currentData\"\n (switchView)=\"vdv.toggleView()\"\n (onApproval)=\"onApprove($event)\"\n ></lib-user-request-form> -->\n <tasks-form [currentData]=\"currentData\" (switchView)=\"vdv.toggleView()\"\n (onSave)=\"onSave($event)\"></tasks-form>\n </ng-template>\n </verben-right-card-data-view>\n\n <verben-card-data-view-footer class=\"w-full\">\n <div [ngClass]=\"{\n 'flex gap-2 items-center': true,\n 'justify-end': true\n }\">\n <!-- <verbena-button\n *ngIf=\"!vdcv.hasCurrentItem()\"\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button> -->\n <div class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData().length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links text-[#3479E9] underline\">\n Load more\n </button>\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <lib-data-columns [columns]=\"config.columns\" (columnsUpdated)=\"onColumnsUpdated($event)\"></lib-data-columns>\n </div>\n <div filter-content>\n <verben-table-filter [border]=\"'1px solid rgba(212, 160, 7, 1)'\" borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\" bgColor=\"white\" width=\"420px\" textColor=\"black\" pd=\"1rem\"\n primaryColor=\"#FFE681\" secondaryColor=\"#3479E9\" tertiaryColor=\"#404040\" [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"></verben-table-filter>\n </div>\n <div sort-content>\n <lib-data-sort [columns]=\"config.columns\" [data]=\"data()\" (sortApplied)=\"onSortUpdated($event)\"></lib-data-sort>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data()\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <!-- <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button> -->\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData().length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links text-[#3479E9] underline\">\n Load more\n </button>\n </div>\n </div>\n</div>\n", styles: [".view-links{color:#3479e9;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i3.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i3.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "extendCustomClass", "exportCustomClass", "selectCustomClass", "importCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "importTemplate", "columnTemplate", "extendTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showImportChild", "showExportChild", "showExtendChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i3.CardDataViewComponent, selector: "verben-card-data-view", inputs: ["pd", "mg", "lHeight", "rHeight", "rWidth", "lWidth", "textColor", "lbgColor", "rbgColor", "border", "display", "borderRadius", "activeCss", "inActiveCss", "displayAsRow", "cardDataList", "dataId", "totalRecords", "footer", "noOfVisibleChildren", "showEditIcon", "onItemClick", "onCardChildClick"], outputs: ["editClicked", "loadMoreClick"] }, { kind: "component", type: i3.LeftCardDataComponent, selector: "verben-left-card-data", inputs: ["pd", "mg", "height", "weight", "activeCss", "inActiveCss", "cardDataList", "iconCollapse", "iconExpanded", "parent", "dataId"] }, { kind: "component", type: i3.LeftCardDataViewComponent, selector: "verben-left-card-data-view", inputs: ["cardDataList"] }, { kind: "component", type: i3.RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: ["parentData", "chilData", "meth"] }, { kind: "component", type: i3.CardDataViewFooterComponent, selector: "verben-card-data-view-footer" }, { kind: "component", type: i3.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied", "resetSortData"] }, { kind: "component", type: i3.DataExportComponent, selector: "lib-data-export", inputs: ["columns", "data", "dataFetchUrl", "dataQueryParameters"], outputs: ["exportDataEvent"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.VerbenaButtonComponent, selector: "verbena-button", inputs: ["text", "icon", "useIcon", "svgPosition", "iconPosition", "bgColor", "textColor", "border", "borderRadius", "pd", "width", "height", "fontSize", "fontWeight", "disable", "svgSize", "weight", "variant", "styleType", "svg", "svgWidth", "svgHeight", "iconColor", "svgColor", "buttonClass", "buttonTextClass", "isLoading", "spinnerSize", "spinnerColor"] }, { kind: "component", type: i3.DropDownComponent, selector: "verben-drop-down", inputs: ["options", "width", "showHorizontalLine", "horizontalLineColor", "optionLabel", "optionSubLabel", "optionValue", "placeholder", "invalidMessage", "errorPosition", "loadMoreCaption", "display", "showClear", "lazyLoad", "selectKey", "styleClass", "group", "multiselect", "filter", "avoidDuplication", "filterBy", "debounceTime", "minChar", "disabled", "required", "load", "asyncLabel", "search"], outputs: ["optionsChange", "onChange", "onClick", "onClear"] }, { kind: "component", type: i3.VerbenPopUpComponent, selector: "verben-pop-Up", inputs: ["dropdownOpen", "dropdownWidth", "color", "customStyles", "popUpClass", "border", "borderRadius", "enableMouseLeave", "cdkPosition"], outputs: ["dropdownOpenChange", "close"] }, { kind: "component", type: i3.DataColumnsComponent, selector: "lib-data-columns", inputs: ["columns", "enableDragAndDrop", "maxVisibleItems"], outputs: ["columnsUpdated"] }, { kind: "component", type: i3.DataSortComponent, selector: "lib-data-sort", inputs: ["columns", "data", "enableDragAndDrop"], outputs: ["sortApplied", "resetFilter"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.TooltipComponent, selector: "verben-tooltip", inputs: ["tooltipContent", "customClass", "backgroundColor", "textColor", "padding", "borderRadius", "zIndex", "border", "width", "top", "bottom", "left", "right"] }, { kind: "component", type: i6.TasksFormComponent, selector: "tasks-form", inputs: ["currentData"], outputs: ["onTaskFormSave", "onSave"] }] });
|
|
116
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: TasksComponent, selector: "lib-tasks", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: false, transformFunction: null } }, providers: [TasksService, TaskFacade, TaskState], usesInheritance: true, ngImport: i0, template: "<div class=\"space-y-8\">\n <verben-data-view #vdv [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle: true,\n }\" [buttonClass]=\"'my-custom-button-class'\" [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\" [selectedColumnCount]=\"0\" [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\" (viewChange)=\"onViewChange($event)\" (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"handleSearch($event)\">\n <div table-content>\n <lib-data-table [data]=\"data()\" [columns]=\"config.columns\" [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\">\n <ng-container libColumn=\"history\">\n <ng-template #cell let-value>\n <a [routerLink]=\"['/workflow/task-history', value]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF]\">view history</a>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"workflow\">\n <ng-template #cell let-value>\n <a [routerLink]=\"['/workflow/workflows', value]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF]\">view Workflow</a>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-row=\"row\">\n <lib-operation-popup [user]=\"user()\" [task]=\"row\" [allowedActions]=\"getActionNamesForTask(row)\"\n (actionComplete)=\"loadInitialData()\">\n <div trigger class=\"cursor-pointer p-2 -m-2 inline-flex items-center justify-center\">\n <verben-svg icon=\"dots\" [width]=\"3\" [height]=\"18\" class=\"w-auto\"></verben-svg>\n </div>\n </lib-operation-popup>\n </ng-template>\n <ng-template #header>\n <strong>Actions</strong>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n\n <div card-content>\n <verben-card-data-view borderRadius=\"12px\" (loadMoreClick)=\"loadMore()\" #vdcv dataId=\"Id\" border=\"5px\"\n [cardDataList]=\"cardData()\" rbgColor=\"#f5f6f9\" mg=\"20px\">\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data #vlcd [parent]=\"vdcv\" dataId=\"Code\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\" [cardDataList]=\"cardData()\">\n <ng-template #card let-cardItem>\n <div (click)=\"currentData = vdcv.onItemClick(cardItem)\" class=\"flex\">\n <div (click)=\"currentData = vdcv.onItemClick(cardItem)\"\n class=\"flex cursor-pointer w-full bg-secondary rounded-xl\">\n <div class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\" [ngClass]=\"\n cardItem.selected ? 'bg-primary' : 'bg-secondary-200'\n \"></div>\n <div class=\"flex flex-col py-2 px-4 w-full\">\n <div class=\"flex items-center gap-4 justify-between\">\n <div class=\"grid gap-y-2\">\n <span class=\"font-semibold text-[#404040]\">{{\n cardItem.title\n }}</span>\n <p class=\"flex items-center\">\n <!-- <label for=\"phone\" class=\"text-[10px] font-light\">Current Actors:</label> -->\n @if (cardItem.data.CurrentActors && cardItem.data.CurrentActors.length > 0) {\n @if (cardItem.data.CurrentActors.length === 1) {\n <span id=\"phone\" class=\"text-sm\">{{ cardItem.data.CurrentActors[0].Identifier }}</span>\n } @else {\n <verben-tooltip [top]=\"'0px'\" [textColor]=\"'#000'\" [backgroundColor]=\"'#D3D3D3'\" [left]=\"'0'\"\n [tooltipContent]=\"actorsTooltipTemplate\" #actorsTooltip>\n <span id=\"phone\" class=\"text-sm cursor-pointer\">\n {{ cardItem.data.CurrentActors[0].Identifier }} and {{ cardItem.data.CurrentActors.length\n - 1 }} others\n </span>\n </verben-tooltip>\n\n <ng-template #actorsTooltipTemplate>\n <div class=\"p-2\">\n <p class=\"text-xs font-semibold mb-1\">Current Actors:</p>\n <ul class=\"list-disc list-inside\">\n @for (actor of cardItem.data.CurrentActors; track actor.Identifier) {\n <li class=\"text-xs\">{{ actor.Identifier }}</li>\n }\n </ul>\n </div>\n </ng-template>\n }\n } @else {\n <span id=\"phone\" class=\"text-sm text-gray-400\">No actors assigned</span>\n }\n </p>\n </div>\n\n <div class=\"grid gap-y-2\">\n <span for=\"role\" class=\"font-light\">{{\n cardItem.data.Code\n }}</span>\n\n <div (click)=\"$event.stopPropagation();\" class=\"flex items-end gap-4\">\n <a [routerLink]=\"[\n '/workflow/task-history',\n cardItem.data.Code\n ]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF] text-xs relative z-10\">view\n history</a>\n\n <lib-operation-popup [user]=\"user()\" [task]=\"cardItem.data\"\n [allowedActions]=\"getActionNamesForTask(cardItem.data)\" (actionComplete)=\"loadInitialData()\">\n <div trigger class=\"cursor-pointer p-2 -m-2 inline-flex items-center justify-center\">\n <verben-svg icon=\"dots\" [width]=\"3\" [height]=\"18\" class=\"w-auto\"></verben-svg>\n </div>\n </lib-operation-popup>\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex\">\n <span class=\"font-normal text-sm\">{{ item.title }}</span>\n </div>\n @for (ciItem of item.body; track ciItem.value) {\n <div class=\"\">\n <span class=\"text-muted font-light text-xs\"\n >{{ ciItem.title }}:</span\n >\n <span class=\"text-black\">{{ ciItem.value }}</span>\n </div>\n } -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n\n <verben-right-card-data-view>\n <ng-template #parent>\n <!-- <lib-user-request-form\n [currentData]=\"currentData\"\n (switchView)=\"vdv.toggleView()\"\n (onApproval)=\"onApprove($event)\"\n ></lib-user-request-form> -->\n <tasks-form [currentData]=\"currentData\" (switchView)=\"vdv.toggleView()\"\n (onSave)=\"onSave($event)\"></tasks-form>\n </ng-template>\n </verben-right-card-data-view>\n\n <verben-card-data-view-footer class=\"w-full\">\n <div [ngClass]=\"{\n 'flex gap-2 items-center': true,\n 'justify-end': true\n }\">\n <!-- <verbena-button\n *ngIf=\"!vdcv.hasCurrentItem()\"\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button> -->\n <div class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData().length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links text-[#3479E9] underline\">\n Load more\n </button>\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <lib-data-columns [columns]=\"config.columns\" (columnsUpdated)=\"onColumnsUpdated($event)\"></lib-data-columns>\n </div>\n <div filter-content>\n <verben-table-filter [border]=\"'1px solid rgba(212, 160, 7, 1)'\" borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\" bgColor=\"white\" width=\"420px\" textColor=\"black\" pd=\"1rem\"\n primaryColor=\"#FFE681\" secondaryColor=\"#3479E9\" tertiaryColor=\"#404040\" [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"></verben-table-filter>\n </div>\n <div sort-content>\n <lib-data-sort [columns]=\"config.columns\" [data]=\"data()\" (sortApplied)=\"onSortUpdated($event)\"></lib-data-sort>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data()\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <!-- <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button> -->\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData().length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links text-[#3479E9] underline\">\n Load more\n </button>\n </div>\n </div>\n</div>\n", styles: [".view-links{color:#3479e9;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DataTableComponent, selector: "lib-data-table", inputs: ["data", "columns", "dataKey", "formGroupConfig", "groupBy", "useVirtualScroll", "virtualScrollItemSize", "styleConfig"], outputs: ["rowEdit", "rowSave", "rowRevert", "rowDelete", "selectionChange"] }, { kind: "directive", type: i3.ColumnDirective, selector: "[libColumn]", inputs: ["libColumn"] }, { kind: "component", type: i3.SvgComponent, selector: "verben-svg", inputs: ["icon", "width", "height", "fill", "stroke", "type", "size"] }, { kind: "component", type: i3.DataViewComponent, selector: "verben-data-view", inputs: ["buttonClass", "iconClass", "activeIconClass", "columnCustomClass", "filterCustomClass", "sortCustomClass", "extendCustomClass", "exportCustomClass", "selectCustomClass", "importCustomClass", "zIndex", "createCustomClass", "tableIcon", "cardIcon", "cardClass", "tableClass", "searchKey", "searchValue", "viewState", "searchTemplate", "importTemplate", "columnTemplate", "extendTemplate", "filterTemplate", "sortTemplate", "children", "exportTemplate", "createTemplate", "selectedColumnCount", "selectedSortCount", "selectedFilterTableCount", "inputWidth", "milliseconds", "showColumnChild", "showSortChild", "showFilterChild", "showImportChild", "showExportChild", "showExtendChild", "create", "showSelected", "isTableView"], outputs: ["viewChange", "stateChange", "onSearchChange"] }, { kind: "component", type: i3.CardDataViewComponent, selector: "verben-card-data-view", inputs: ["pd", "mg", "lHeight", "rHeight", "rWidth", "lWidth", "textColor", "lbgColor", "rbgColor", "border", "display", "borderRadius", "activeCss", "inActiveCss", "displayAsRow", "cardDataList", "dataId", "totalRecords", "footer", "noOfVisibleChildren", "showEditIcon", "onItemClick", "onCardChildClick"], outputs: ["editClicked", "loadMoreClick"] }, { kind: "component", type: i3.LeftCardDataComponent, selector: "verben-left-card-data", inputs: ["pd", "mg", "height", "weight", "activeCss", "inActiveCss", "cardDataList", "iconCollapse", "iconExpanded", "parent", "dataId"] }, { kind: "component", type: i3.LeftCardDataViewComponent, selector: "verben-left-card-data-view", inputs: ["cardDataList"] }, { kind: "component", type: i3.RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: ["parentData", "chilData", "meth"] }, { kind: "component", type: i3.CardDataViewFooterComponent, selector: "verben-card-data-view-footer" }, { kind: "component", type: i3.TableFilterComponent, selector: "verben-table-filter", inputs: ["filterOptions", "pd", "mg", "height", "width", "bgColor", "boxShadow", "textColor", "primaryColor", "secondaryColor", "tertiaryColor", "border", "borderRadius", "selectWidth", "maxFilterLength", "tooltip"], outputs: ["filtersApplied", "resetSortData"] }, { kind: "component", type: i3.DataExportComponent, selector: "lib-data-export", inputs: ["columns", "data", "dataFetchUrl", "dataQueryParameters"], outputs: ["exportDataEvent"] }, { kind: "component", type: i3.DataColumnsComponent, selector: "lib-data-columns", inputs: ["columns", "enableDragAndDrop", "maxVisibleItems"], outputs: ["columnsUpdated"] }, { kind: "component", type: i3.DataSortComponent, selector: "lib-data-sort", inputs: ["columns", "data", "enableDragAndDrop"], outputs: ["sortApplied", "resetFilter"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.TooltipComponent, selector: "verben-tooltip", inputs: ["tooltipContent", "customClass", "backgroundColor", "textColor", "padding", "borderRadius", "zIndex", "border", "width", "top", "bottom", "left", "right"] }, { kind: "component", type: i5.OperationPopupComponent, selector: "lib-operation-popup", inputs: ["user", "task", "allowedActions"], outputs: ["actionComplete"] }, { kind: "component", type: i6.TasksFormComponent, selector: "tasks-form", inputs: ["currentData"], outputs: ["onTaskFormSave", "onSave"] }] });
|
|
227
117
|
}
|
|
228
118
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TasksComponent, decorators: [{
|
|
229
119
|
type: Component,
|
|
230
|
-
args: [{ selector: 'lib-tasks', providers: [TasksService, TaskFacade, TaskState], template: "<div class=\"space-y-8\">\n <verben-data-view #vdv [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle: true,\n }\" [buttonClass]=\"'my-custom-button-class'\" [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\" [selectedColumnCount]=\"0\" [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\" (viewChange)=\"onViewChange($event)\" (stateChange)=\"onStateChange($event)\">\n <div table-content>\n <lib-data-table [data]=\"data()\" [columns]=\"config.columns\" [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\">\n <ng-container libColumn=\"history\">\n <ng-template #cell let-value>\n <a [routerLink]=\"['/workflow/task-history', value]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF]\">view history</a>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"workflow\">\n <ng-template #cell let-value>\n <a [routerLink]=\"['/workflow/workflows', value]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF]\">view Workflow</a>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-row=\"row\">\n <verben-pop-Up #popup [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\" [customStyles]=\"{\n border: '1px solid #d4a10780',\n borderRadius: '5px',\n backgroundColor: 'white'\n }\" (dropdownOpenChange)=\"onPopupToggled($event, popup)\">\n <div dropdown-trigger class=\"cursor-pointer p-2 -m-2 inline-flex items-center justify-center\">\n <verben-svg icon=\"dots\" [width]=\"3\" [height]=\"18\" class=\"w-auto\"></verben-svg>\n </div>\n <div class=\"bg-white rounded-sm\" dropdown-content>\n @for (item of tableRowActions; track item.label) {\n\n <verben-pop-Up #popup2 [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\" [customStyles]=\"{\n border: '1px solid #d4a10780',\n borderRadius: '5px',\n backgroundColor: 'white'\n }\" (dropdownOpenChange)=\"handlePopupClose($event)\">\n <div (click)=\"item.action(row)\" dropdown-trigger class=\"cursor-pointer py-2 px-3 hover:bg-primary\">\n {{ item.label }}\n </div>\n <div class=\"bg-white rounded-sm\" dropdown-content>\n <div style=\"width: 16rem\">\n <div class=\"flex items-center gap-4 justify-between h-12 px-2 pt-4\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g opacity=\"0.6\">\n <path\n d=\"M6.74649 8.00338C6.91483 8.1347 7.0252 8.20455 7.11531 8.29396C7.98846 9.16222 8.85742 10.0347 9.72917 10.905C9.87167 11.0475 9.99391 11.1921 9.99321 11.4129C9.99251 11.6462 9.89472 11.8152 9.69564 11.9256C9.49307 12.038 9.2926 12.0206 9.10469 11.8899C9.03833 11.8438 8.98175 11.7845 8.92378 11.7272C7.85574 10.6592 6.79678 9.58203 5.71477 8.52867C5.3711 8.19407 5.38437 7.79173 5.70779 7.47599C6.7884 6.42123 7.84875 5.34551 8.91539 4.27607C9.11377 4.07769 9.32054 3.92262 9.623 4.04137C9.97924 4.18107 10.112 4.58901 9.89472 4.90335C9.82976 4.99765 9.74174 5.07728 9.66002 5.1597C8.80642 6.01469 7.95283 6.86968 7.09645 7.72257C7.01472 7.8043 6.91553 7.86856 6.74579 8.00408L6.74649 8.00338Z\"\n fill=\"black\" />\n </g>\n </svg>\n\n <h3 class=\"text-sm font-medium\">Select Assignee</h3>\n </div>\n\n <div class=\"grid gap-2 max-h-96 overflow-y-auto p-2\">\n <!-- <verben-drop-down\n label=\"Action\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Action\"\n [options]=\"nextActions\"\n id=\"actions\"\n optionLabel=\"Name\"\n [ngModel]=\"selectedAction | async\"\n (ngModelChange)=\"selectedAction.next($event)\"\n class=\"form-control\"\n >\n </verben-drop-down> -->\n @if (\n item.label === 'Pick Task'\n ) {\n <verben-drop-down label=\"Stages\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\"\n [filter]=\"true\" filterBy=\"Name\" [showClear]=\"true\" placeholder=\"Select Stage\"\n [options]=\"currentTask?.FullStages || []\" id=\"stages\" optionLabel=\"Name\"\n [(ngModel)]=\"selectedStageCode\" class=\"form-control\">\n </verben-drop-down>\n } @else {\n <verben-drop-down label=\"Actors\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\"\n [filter]=\"true\" filterBy=\"Name\" [showClear]=\"true\" placeholder=\"Select Actor\" [options]=\"nextActors\"\n id=\"actors\" optionLabel=\"Name\" optionValue=\"Identifier\" [(ngModel)]=\"recipientCode\"\n class=\"form-control\">\n </verben-drop-down>\n }\n\n <textarea [(ngModel)]=\"comment\" placeholder=\"Enter Comment\"\n class=\"w-full p-1 text-xs border border-primary rounded-md\" style=\"height: 8rem\"\n [cols]=\"8\"></textarea>\n\n <verbena-button [disable]=\"!comment\" [text]=\"activeActionType ?? ''\"\n (click)=\"handleAction(row, popup)\" class=\"text-xs w-full\" bgColor=\"#FFE681\"\n textColor=\"#404040\" borderRadius=\"10px\" fontSize=\"14px\" pd=\"10px 20px\" width=\"100%\"\n height=\"32px\">\n {{ activeActionType }}\n </verbena-button>\n </div>\n </div>\n </div>\n </verben-pop-Up>\n\n @if (item.divider) {\n <hr class=\"bg-[#FFE681] h-1 rounded-xl border-0\" />\n } }\n </div>\n </verben-pop-Up>\n </ng-template>\n <ng-template #header>\n <strong>Actions</strong>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n\n <div card-content>\n <verben-card-data-view borderRadius=\"12px\" (loadMoreClick)=\"loadMore()\" #vdcv dataId=\"Id\" border=\"5px\"\n [cardDataList]=\"cardData()\" rbgColor=\"#f5f6f9\" mg=\"20px\">\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data #vlcd [parent]=\"vdcv\" dataId=\"Code\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\" [cardDataList]=\"cardData()\">\n <ng-template #card let-cardItem>\n <div (click)=\"currentData = vdcv.onItemClick(cardItem)\" class=\"flex\">\n <div (click)=\"currentData = vdcv.onItemClick(cardItem)\"\n class=\"flex cursor-pointer w-full bg-secondary rounded-xl\">\n <div class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\" [ngClass]=\"\n cardItem.selected ? 'bg-primary' : 'bg-secondary-200'\n \"></div>\n <div class=\"flex flex-col py-2 px-4 w-full\">\n <div class=\"flex items-center gap-4 justify-between\">\n <div class=\"grid gap-y-2\">\n <span class=\"font-semibold text-[#404040]\">{{\n cardItem.title\n }}</span>\n <p class=\"flex items-center\">\n <!-- <label for=\"phone\" class=\"text-[10px] font-light\">Current Actors:</label> -->\n @if (cardItem.data.CurrentActors && cardItem.data.CurrentActors.length > 0) {\n @if (cardItem.data.CurrentActors.length === 1) {\n <span id=\"phone\" class=\"text-sm\">{{ cardItem.data.CurrentActors[0].Identifier }}</span>\n } @else {\n <verben-tooltip [top]=\"'0px'\" [textColor]=\"'#000'\" [backgroundColor]=\"'#D3D3D3'\" [left]=\"'0'\"\n [tooltipContent]=\"actorsTooltipTemplate\" #actorsTooltip>\n <span id=\"phone\" class=\"text-sm cursor-pointer\">\n {{ cardItem.data.CurrentActors[0].Identifier }} and {{ cardItem.data.CurrentActors.length\n - 1 }} others\n </span>\n </verben-tooltip>\n\n <ng-template #actorsTooltipTemplate>\n <div class=\"p-2\">\n <p class=\"text-xs font-semibold mb-1\">Current Actors:</p>\n <ul class=\"list-disc list-inside\">\n @for (actor of cardItem.data.CurrentActors; track actor.Identifier) {\n <li class=\"text-xs\">{{ actor.Identifier }}</li>\n }\n </ul>\n </div>\n </ng-template>\n }\n } @else {\n <span id=\"phone\" class=\"text-sm text-gray-400\">No actors assigned</span>\n }\n </p>\n </div>\n\n <div class=\"grid gap-y-2\">\n <span for=\"role\" class=\"font-light\">{{\n cardItem.data.Code\n }}</span>\n\n <div (click)=\"$event.stopPropagation();\" class=\"flex items-end gap-4\">\n <a [routerLink]=\"[\n '/workflow/task-history',\n cardItem.data.Code\n ]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF] text-xs relative z-10\">view\n history</a>\n\n <verben-pop-Up #popup [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\"\n [customStyles]=\"{\n border: '1px solid #d4a10780',\n borderRadius: '5px',\n backgroundColor: 'white'\n }\" (dropdownOpenChange)=\"onPopupToggled($event, popup)\">\n <div dropdown-trigger\n class=\"cursor-pointer p-2 -m-2 inline-flex items-center justify-center\">\n <verben-svg icon=\"dots\" [width]=\"3\" [height]=\"18\" class=\"w-auto\"></verben-svg>\n </div>\n <div class=\"bg-white rounded-sm\" dropdown-content>\n @for (item of tableRowActions; track item.label) {\n\n <verben-pop-Up #popup2 [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\"\n [customStyles]=\"{\n border: '1px solid #d4a10780',\n borderRadius: '5px',\n backgroundColor: 'white'\n }\" (dropdownOpenChange)=\"handlePopupClose($event)\">\n <div (click)=\"item.action(cardItem.data)\" dropdown-trigger\n class=\"cursor-pointer py-2 px-3 hover:bg-primary\">\n {{ item.label }}\n </div>\n <div class=\"bg-white rounded-sm\" dropdown-content>\n <div style=\"width: 16rem\">\n <div class=\"flex items-center gap-4 justify-between h-12 px-2 pt-4\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g opacity=\"0.6\">\n <path\n d=\"M6.74649 8.00338C6.91483 8.1347 7.0252 8.20455 7.11531 8.29396C7.98846 9.16222 8.85742 10.0347 9.72917 10.905C9.87167 11.0475 9.99391 11.1921 9.99321 11.4129C9.99251 11.6462 9.89472 11.8152 9.69564 11.9256C9.49307 12.038 9.2926 12.0206 9.10469 11.8899C9.03833 11.8438 8.98175 11.7845 8.92378 11.7272C7.85574 10.6592 6.79678 9.58203 5.71477 8.52867C5.3711 8.19407 5.38437 7.79173 5.70779 7.47599C6.7884 6.42123 7.84875 5.34551 8.91539 4.27607C9.11377 4.07769 9.32054 3.92262 9.623 4.04137C9.97924 4.18107 10.112 4.58901 9.89472 4.90335C9.82976 4.99765 9.74174 5.07728 9.66002 5.1597C8.80642 6.01469 7.95283 6.86968 7.09645 7.72257C7.01472 7.8043 6.91553 7.86856 6.74579 8.00408L6.74649 8.00338Z\"\n fill=\"black\" />\n </g>\n </svg>\n\n <h3 class=\"text-sm font-medium\">Select Assignee</h3>\n </div>\n\n <div class=\"grid gap-2 max-h-96 overflow-y-auto p-2\">\n <!-- <verben-drop-down\n label=\"Action\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Action\"\n [options]=\"nextActions\"\n id=\"actions\"\n optionLabel=\"Name\"\n [ngModel]=\"selectedAction | async\"\n (ngModelChange)=\"selectedAction.next($event)\"\n class=\"form-control\"\n >\n </verben-drop-down> -->\n\n <verben-drop-down label=\"Actors\" styleClass=\"w-full\" width=\"100%\"\n [multiselect]=\"false\" [filter]=\"true\" filterBy=\"Name\" [showClear]=\"true\"\n placeholder=\"Select Actor\" [options]=\"nextActors\" id=\"actors\"\n optionLabel=\"Name\" optionValue=\"Identifier\" [(ngModel)]=\"recipientCode\"\n class=\"form-control\">\n </verben-drop-down>\n\n <textarea [(ngModel)]=\"comment\" placeholder=\"Enter Comment\"\n class=\"w-full p-1 text-xs border border-primary rounded-md\" style=\"height: 8rem\"\n [cols]=\"8\"></textarea>\n\n <verbena-button [disable]=\"!comment\" [text]=\"activeActionType ?? ''\"\n (click)=\"handleAction(cardItem.data, popup)\" class=\"text-xs w-full\"\n bgColor=\"#FFE681\" textColor=\"#404040\" borderRadius=\"10px\" fontSize=\"14px\"\n pd=\"10px 20px\" width=\"100%\" height=\"32px\">\n {{ activeActionType }}\n </verbena-button>\n </div>\n </div>\n </div>\n </verben-pop-Up>\n\n @if (item.divider) {\n <hr class=\"bg-[#FFE681] h-1 rounded-xl border-0\" />\n } }\n </div>\n </verben-pop-Up>\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex\">\n <span class=\"font-normal text-sm\">{{ item.title }}</span>\n </div>\n @for (ciItem of item.body; track ciItem.value) {\n <div class=\"\">\n <span class=\"text-muted font-light text-xs\"\n >{{ ciItem.title }}:</span\n >\n <span class=\"text-black\">{{ ciItem.value }}</span>\n </div>\n } -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n\n <verben-right-card-data-view>\n <ng-template #parent>\n <!-- <lib-user-request-form\n [currentData]=\"currentData\"\n (switchView)=\"vdv.toggleView()\"\n (onApproval)=\"onApprove($event)\"\n ></lib-user-request-form> -->\n <tasks-form [currentData]=\"currentData\" (switchView)=\"vdv.toggleView()\"\n (onSave)=\"onSave($event)\"></tasks-form>\n </ng-template>\n </verben-right-card-data-view>\n\n <verben-card-data-view-footer class=\"w-full\">\n <div [ngClass]=\"{\n 'flex gap-2 items-center': true,\n 'justify-end': true\n }\">\n <!-- <verbena-button\n *ngIf=\"!vdcv.hasCurrentItem()\"\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button> -->\n <div class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData().length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links text-[#3479E9] underline\">\n Load more\n </button>\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <lib-data-columns [columns]=\"config.columns\" (columnsUpdated)=\"onColumnsUpdated($event)\"></lib-data-columns>\n </div>\n <div filter-content>\n <verben-table-filter [border]=\"'1px solid rgba(212, 160, 7, 1)'\" borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\" bgColor=\"white\" width=\"420px\" textColor=\"black\" pd=\"1rem\"\n primaryColor=\"#FFE681\" secondaryColor=\"#3479E9\" tertiaryColor=\"#404040\" [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"></verben-table-filter>\n </div>\n <div sort-content>\n <lib-data-sort [columns]=\"config.columns\" [data]=\"data()\" (sortApplied)=\"onSortUpdated($event)\"></lib-data-sort>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data()\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <!-- <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button> -->\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData().length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links text-[#3479E9] underline\">\n Load more\n </button>\n </div>\n </div>\n</div>\n", styles: [".view-links{color:#3479e9;cursor:pointer}\n"] }]
|
|
120
|
+
args: [{ selector: 'lib-tasks', providers: [TasksService, TaskFacade, TaskState], template: "<div class=\"space-y-8\">\n <verben-data-view #vdv [viewState]=\"{\n isSearch: true,\n isColumn: true,\n isFilter: true,\n isSort: true,\n isExport: true,\n isSelect: true,\n isCreate: true,\n isToggle: true,\n }\" [buttonClass]=\"'my-custom-button-class'\" [iconClass]=\"'my-icon-class'\"\n [activeIconClass]=\"'my-active-icon-class'\" [selectedColumnCount]=\"0\" [selectedSortCount]=\"0\"\n [selectedFilterTableCount]=\"0\" (viewChange)=\"onViewChange($event)\" (stateChange)=\"onStateChange($event)\"\n (onSearchChange)=\"handleSearch($event)\">\n <div table-content>\n <lib-data-table [data]=\"data()\" [columns]=\"config.columns\" [styleConfig]=\"styles\"\n (selectionChange)=\"onSelectionChange($event)\">\n <ng-container libColumn=\"history\">\n <ng-template #cell let-value>\n <a [routerLink]=\"['/workflow/task-history', value]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF]\">view history</a>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"workflow\">\n <ng-template #cell let-value>\n <a [routerLink]=\"['/workflow/workflows', value]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF]\">view Workflow</a>\n </ng-template>\n </ng-container>\n\n <ng-container libColumn=\"actions\">\n <ng-template #cell let-row=\"row\">\n <lib-operation-popup [user]=\"user()\" [task]=\"row\" [allowedActions]=\"getActionNamesForTask(row)\"\n (actionComplete)=\"loadInitialData()\">\n <div trigger class=\"cursor-pointer p-2 -m-2 inline-flex items-center justify-center\">\n <verben-svg icon=\"dots\" [width]=\"3\" [height]=\"18\" class=\"w-auto\"></verben-svg>\n </div>\n </lib-operation-popup>\n </ng-template>\n <ng-template #header>\n <strong>Actions</strong>\n </ng-template>\n </ng-container>\n </lib-data-table>\n </div>\n\n <div card-content>\n <verben-card-data-view borderRadius=\"12px\" (loadMoreClick)=\"loadMore()\" #vdcv dataId=\"Id\" border=\"5px\"\n [cardDataList]=\"cardData()\" rbgColor=\"#f5f6f9\" mg=\"20px\">\n <verben-left-card-data-view class=\"space-y-7\">\n <verben-left-card-data #vlcd [parent]=\"vdcv\" dataId=\"Code\"\n class=\"bg-secondary-100 rounded-xl border-primary border-[1px]\" [cardDataList]=\"cardData()\">\n <ng-template #card let-cardItem>\n <div (click)=\"currentData = vdcv.onItemClick(cardItem)\" class=\"flex\">\n <div (click)=\"currentData = vdcv.onItemClick(cardItem)\"\n class=\"flex cursor-pointer w-full bg-secondary rounded-xl\">\n <div class=\"w-3 rounded-xl rounded-tr-none rounded-br-none\" [ngClass]=\"\n cardItem.selected ? 'bg-primary' : 'bg-secondary-200'\n \"></div>\n <div class=\"flex flex-col py-2 px-4 w-full\">\n <div class=\"flex items-center gap-4 justify-between\">\n <div class=\"grid gap-y-2\">\n <span class=\"font-semibold text-[#404040]\">{{\n cardItem.title\n }}</span>\n <p class=\"flex items-center\">\n <!-- <label for=\"phone\" class=\"text-[10px] font-light\">Current Actors:</label> -->\n @if (cardItem.data.CurrentActors && cardItem.data.CurrentActors.length > 0) {\n @if (cardItem.data.CurrentActors.length === 1) {\n <span id=\"phone\" class=\"text-sm\">{{ cardItem.data.CurrentActors[0].Identifier }}</span>\n } @else {\n <verben-tooltip [top]=\"'0px'\" [textColor]=\"'#000'\" [backgroundColor]=\"'#D3D3D3'\" [left]=\"'0'\"\n [tooltipContent]=\"actorsTooltipTemplate\" #actorsTooltip>\n <span id=\"phone\" class=\"text-sm cursor-pointer\">\n {{ cardItem.data.CurrentActors[0].Identifier }} and {{ cardItem.data.CurrentActors.length\n - 1 }} others\n </span>\n </verben-tooltip>\n\n <ng-template #actorsTooltipTemplate>\n <div class=\"p-2\">\n <p class=\"text-xs font-semibold mb-1\">Current Actors:</p>\n <ul class=\"list-disc list-inside\">\n @for (actor of cardItem.data.CurrentActors; track actor.Identifier) {\n <li class=\"text-xs\">{{ actor.Identifier }}</li>\n }\n </ul>\n </div>\n </ng-template>\n }\n } @else {\n <span id=\"phone\" class=\"text-sm text-gray-400\">No actors assigned</span>\n }\n </p>\n </div>\n\n <div class=\"grid gap-y-2\">\n <span for=\"role\" class=\"font-light\">{{\n cardItem.data.Code\n }}</span>\n\n <div (click)=\"$event.stopPropagation();\" class=\"flex items-end gap-4\">\n <a [routerLink]=\"[\n '/workflow/task-history',\n cardItem.data.Code\n ]\" routerLinkActive=\"router-link-active\"\n class=\"underline text-[#0000FF] text-xs relative z-10\">view\n history</a>\n\n <lib-operation-popup [user]=\"user()\" [task]=\"cardItem.data\"\n [allowedActions]=\"getActionNamesForTask(cardItem.data)\" (actionComplete)=\"loadInitialData()\">\n <div trigger class=\"cursor-pointer p-2 -m-2 inline-flex items-center justify-center\">\n <verben-svg icon=\"dots\" [width]=\"3\" [height]=\"18\" class=\"w-auto\"></verben-svg>\n </div>\n </lib-operation-popup>\n </div>\n </div>\n </div>\n\n <!-- <div class=\"flex\">\n <span class=\"font-normal text-sm\">{{ item.title }}</span>\n </div>\n @for (ciItem of item.body; track ciItem.value) {\n <div class=\"\">\n <span class=\"text-muted font-light text-xs\"\n >{{ ciItem.title }}:</span\n >\n <span class=\"text-black\">{{ ciItem.value }}</span>\n </div>\n } -->\n </div>\n </div>\n </div>\n </ng-template>\n </verben-left-card-data>\n </verben-left-card-data-view>\n\n <verben-right-card-data-view>\n <ng-template #parent>\n <!-- <lib-user-request-form\n [currentData]=\"currentData\"\n (switchView)=\"vdv.toggleView()\"\n (onApproval)=\"onApprove($event)\"\n ></lib-user-request-form> -->\n <tasks-form [currentData]=\"currentData\" (switchView)=\"vdv.toggleView()\"\n (onSave)=\"onSave($event)\"></tasks-form>\n </ng-template>\n </verben-right-card-data-view>\n\n <verben-card-data-view-footer class=\"w-full\">\n <div [ngClass]=\"{\n 'flex gap-2 items-center': true,\n 'justify-end': true\n }\">\n <!-- <verbena-button\n *ngIf=\"!vdcv.hasCurrentItem()\"\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button> -->\n <div class=\"flex {{\n vdcv.hasCurrentItem() ? 'flex-1' : ''\n }} justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData().length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links text-[#3479E9] underline\">\n Load more\n </button>\n </div>\n </div>\n </verben-card-data-view-footer>\n </verben-card-data-view>\n </div>\n <div column-content>\n <lib-data-columns [columns]=\"config.columns\" (columnsUpdated)=\"onColumnsUpdated($event)\"></lib-data-columns>\n </div>\n <div filter-content>\n <verben-table-filter [border]=\"'1px solid rgba(212, 160, 7, 1)'\" borderRadius=\"10px\"\n boxShadow=\"2px 2px 2px 0px silver\" bgColor=\"white\" width=\"420px\" textColor=\"black\" pd=\"1rem\"\n primaryColor=\"#FFE681\" secondaryColor=\"#3479E9\" tertiaryColor=\"#404040\" [filterOptions]=\"filterArray\"\n [maxFilterLength]=\"3\"></verben-table-filter>\n </div>\n <div sort-content>\n <lib-data-sort [columns]=\"config.columns\" [data]=\"data()\" (sortApplied)=\"onSortUpdated($event)\"></lib-data-sort>\n </div>\n <div export-content>\n <lib-data-export [data]=\"data()\" (exportDataEvent)=\"handleExport($event)\">\n </lib-data-export>\n </div>\n </verben-data-view>\n\n <div *ngIf=\"vdv.isTableView\" class=\"flex gap-2 justify-between\">\n <div class=\"message-log-button-container flex justify-between\">\n <!-- <verbena-button\n [fontWeight]=\"'bold'\"\n [bgColor]=\"'#8E8D87'\"\n [borderRadius]=\"'4px'\"\n [textColor]=\"'#fff'\"\n [pd]=\"'9.79px 37.28px'\"\n [text]=\"'Delete'\"\n >\n </verbena-button> -->\n </div>\n <div class=\"flex justify-end items-center gap-5\">\n <span class=\"paginator-text\">{{ cardData().length }} records loaded</span>\n <button (click)=\"loadMore()\" class=\"load-more view-links text-[#3479E9] underline\">\n Load more\n </button>\n </div>\n </div>\n</div>\n", styles: [".view-links{color:#3479e9;cursor:pointer}\n"] }]
|
|
231
121
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.TaskFacade }] });
|
|
232
|
-
var ActionType;
|
|
233
|
-
(function (ActionType) {
|
|
234
|
-
ActionType["PickTask"] = "PickTask";
|
|
235
|
-
ActionType["UnPickTask"] = "UnPickTask";
|
|
236
|
-
ActionType["ReAssign"] = "ReAssign";
|
|
237
|
-
ActionType["PassOn"] = "PassOn";
|
|
238
|
-
ActionType["PassBack"] = "PassBack";
|
|
239
|
-
ActionType["FollowTask"] = "FollowTask";
|
|
240
|
-
ActionType["UnfollowTask"] = "UnfollowTask";
|
|
241
|
-
ActionType["SkipTo"] = "SkipTo";
|
|
242
|
-
})(ActionType || (ActionType = {}));
|
|
243
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy90YXNrcy90YXNrcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2tzL3Rhc2tzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQVMsV0FBVyxFQUFRLFVBQVUsRUFBa0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUN6RyxPQUFPLEVBQUUscUJBQXFCLEVBQWtCLE1BQU0sbUNBQW1DLENBQUM7QUFDMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBUTFDLE1BQU0sT0FBTyxjQUFlLFNBQVEscUJBQTJCO0lBNkR6QztJQUFnQztJQTVEcEQsSUFBSSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ3ZCLE1BQU0sR0FBeUI7UUFDN0IsVUFBVSxFQUFFLEVBQUUsRUFBRSx3QkFBd0I7UUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxtQ0FBbUM7UUFDckQsY0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLEVB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K0JBQWlCLENBQUE7SUFDakIsbUNBQXFCLENBQUE7SUFDckIsdUNBQXlCLENBQUE7SUFDekIsMkNBQTZCLENBQUE7SUFDN0IsK0JBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQVRJLFVBQVUsS0FBVixVQUFVLFFBU2QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBpbnB1dCwgdmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENhcmREYXRhLCBWZXJiZW5Qb3BVcENvbXBvbmVudCB9IGZyb20gJ3ZlcmJlbi1uZy11aSc7XG5pbXBvcnQgeyBBY3RvciwgT2JqZWN0U3RhdGUsIFRhc2ssIFRhc2tTdGF0dXMsIFdvcmtmbG93QWN0aW9uIH0gZnJvbSAndmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IEJhc2VEYXRhVmlld0NvbXBvbmVudCwgRGF0YVZpZXdDb25maWcgfSBmcm9tICd2ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9zaGFyZWQnO1xuaW1wb3J0IHsgY29sdW1ucyB9IGZyb20gJy4vdGFza3MuY29sdW1ucyc7XG5pbXBvcnQgeyBUYXNrRmFjYWRlIH0gZnJvbSAnLi90YXNrcy5mYWNhZGUnO1xuaW1wb3J0IHsgVGFza01vZGVsIH0gZnJvbSAnLi90YXNrcy5tb2RlbHMnO1xuaW1wb3J0IHsgVGFza3NTZXJ2aWNlIH0gZnJvbSAnLi90YXNrcy5zZXJ2aWNlJztcbmltcG9ydCB7IFRhc2tTdGF0ZSB9IGZyb20gJy4vdGFza3Muc3RhdGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdGFza3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFza3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdGFza3MuY29tcG9uZW50LmNzcycsXG4gIHByb3ZpZGVyczogW1Rhc2tzU2VydmljZSwgVGFza0ZhY2FkZSwgVGFza1N0YXRlXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFza3NDb21wb25lbnQgZXh0ZW5kcyBCYXNlRGF0YVZpZXdDb21wb25lbnQ8VGFzaz4ge1xuICB1c2VyID0gaW5wdXQ8c3RyaW5nPigpO1xuICBjb25maWc6IERhdGFWaWV3Q29uZmlnPFRhc2s+ID0ge1xuICAgIGRhdGFTb3VyY2U6IFtdLCAvLyBQb3B1bGF0ZSBmcm9tIHNlcnZpY2VcbiAgICBjb2x1bW5zOiBjb2x1bW5zLCAvLyBZb3VyIGV4aXN0aW5nIGNvbHVtbiBkZWZpbml0aW9uc1xuICAgIGNhcmREYXRhTWFwcGVyOiAodGFzaykgPT4gKHtcbiAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgIHRpdGxlOiB0YXNrLk5hbWUsXG4gICAgICBkYXRhOiB0YXNrLFxuICAgICAgYm9keTogW1xuICAgICAgICB7IHRpdGxlOiAnTmFtZScsIHZhbHVlOiB0YXNrLk5hbWUgfSxcbiAgICAgICAgeyB0aXRsZTogJ1N0YXR1cycsIHZhbHVlOiB0YXNrLlN0YXR1cyB9LFxuICAgICAgXSxcbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICB9KSxcbiAgICBvbkRldGFpbFZpZXc6ICh0YXNrKSA9PiB7XG4gICAgICAvLyBDdXN0b20gZGV0YWlsIHZpZXcgbG9naWNcbiAgICB9LFxuICB9O1xuICBwb3B1cHMgPSB2aWV3Q2hpbGRyZW48VmVyYmVuUG9wVXBDb21wb25lbnQ+KCdwb3B1cCcpO1xuXG4gIHNlbGVjdGVkVGFza0NvZGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBhY3RpdmVBY3Rpb25UeXBlOiBBY3Rpb25UeXBlIHwgbnVsbCA9IG51bGw7XG4gIGNvbW1lbnQ6IHN0cmluZyA9ICcnO1xuICBpc01vZGFsVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHRhYmxlUm93QWN0aW9ucyA9IFtcbiAgICAvLyB7IGxhYmVsOiAnUGljayBUYXNrJywgYWN0aW9uOiAoZGF0YTogVGFzaykgPT4ge30sIGRpdmlkZXI6IGZhbHNlIH0sXG4gICAgLy8geyBsYWJlbDogJ1JlbGVhc2UgVGFzaycsIGFjdGlvbjogKGRhdGE6IFRhc2spID0+IHt9LCBkaXZpZGVyOiBmYWxzZSB9LFxuICAgIHsgbGFiZWw6ICdGb2xsb3cgVGFzaycsIGFjdGlvbjogKGRhdGE6IFRhc2spID0+IHsgfSwgZGl2aWRlcjogdHJ1ZSB9LFxuICAgIC8vIHsgbGFiZWw6ICdQYXNzIE9uJywgYWN0aW9uOiAoZGF0YTogVGFzaykgPT4ge30sIGRpdmlkZXI6IGZhbHNlIH0sXG4gICAgLy8geyBsYWJlbDogJ1Bhc3MgQmFjaycsIGFjdGlvbjogKGRhdGE6IFRhc2spID0+IHt9LCBkaXZpZGVyOiBmYWxzZSB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnUmUtQXNzaWduJyxcbiAgICAgIGFjdGlvbjogKGRhdGE6IFRhc2spID0+IHtcbiAgICAgICAgdGhpcy5hY3RpdmVBY3Rpb25UeXBlID0gQWN0aW9uVHlwZS5SZUFzc2lnbjtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhc2tDb2RlID0gZGF0YS5Db2RlO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkVGFza0NvZGUsIHRoaXMuYWN0aXZlQWN0aW9uVHlwZSk7XG4gICAgICAgIHRoaXMuY29tbWVudCA9ICcnO1xuICAgICAgICB0aGlzLm5leHRBY3RvcnMgPSBbXTtcbiAgICAgICAgdGhpcy50YXNrRmFjYWRlLmxvYWROZXh0QWN0b3JzKGRhdGEuQ29kZSwgdW5kZWZpbmVkLCB0cnVlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBpZiAodGhpcy5wb3B1cCgpICYmICF0aGlzLnBvcHVwKCk/LmRyb3Bkb3duT3Blbikge1xuICAgICAgICAgIC8vICAgdGhpcy5wb3B1cCgpPy50b2dnbGVEcm9wZG93bigpO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZGl2aWRlcjogdHJ1ZSxcbiAgICB9LFxuICAgIHsgbGFiZWw6ICdWaWV3IE9wZXJhdGlvbicsIGFjdGlvbjogKGRhdGE6IFRhc2spID0+IHsgfSwgZGl2aWRlcjogZmFsc2UgfSxcbiAgXTtcblxuICBuZXh0QWN0aW9uczogV29ya2Zsb3dBY3Rpb25bXSA9IFtdO1xuICBuZXh0QWN0b3JzOiBBY3RvcltdID0gW107XG5cbiAgcmVjaXBpZW50Q29kZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHNlbGVjdGVkQWN0aW9uOiBCZWhhdmlvclN1YmplY3Q8V29ya2Zsb3dBY3Rpb24gfCBudWxsPiA9XG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdDxXb3JrZmxvd0FjdGlvbiB8IG51bGw+KG51bGwpO1xuICBjdXJyZW50VGFzazogVGFzayB8IG51bGwgPSBudWxsO1xuXG4gIHNlbGVjdGVkU3RhZ2VDb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgdGFza0ZhY2FkZTogVGFza0ZhY2FkZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnRhc2tGYWNhZGUuZ2V0UmVxdWVzdHMkKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmRhdGEuc2V0KGRhdGEpO1xuICAgIH0pO1xuXG4gICAgLy8gdGhpcy50YXNrRmFjYWRlLmdldE5leHRBY3Rpb25zJCgpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgIC8vICAgdGhpcy5uZXh0QWN0aW9ucyA9IGRhdGE7XG4gICAgLy8gfSk7XG5cbiAgICB0aGlzLnRhc2tGYWNhZGUuZ2V0TmV4dEFjdG9ycyQoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMubmV4dEFjdG9ycyA9IGRhdGE7XG4gICAgICBjb25zdCBhY3RpdmVVc2VyID0gdGhpcy51c2VyKCk7XG4gICAgICBpZiAoYWN0aXZlVXNlciAmJiBkYXRhLm1hcCgoeyBJZGVudGlmaWVyIH0pID0+IElkZW50aWZpZXIpLmluY2x1ZGVzKGFjdGl2ZVVzZXIpKSB7XG4gICAgICAgIHRoaXMucmVjaXBpZW50Q29kZSA9IGFjdGl2ZVVzZXI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBsb2FkSW5pdGlhbERhdGEoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudGFza0ZhY2FkZS5sb2FkUmVxdWVzdHModGhpcy51c2VyKCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgZXJyb3JcbiAgICB9XG4gIH1cblxuICBoYW5kbGVQb3B1cENsb3NlKGV2ZW50OiBib29sZWFuKSB7XG4gICAgY29uc29sZS5sb2coJ0Nsb3NpbmcuLi4nLCBldmVudCk7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFza0NvZGUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uUG9wdXBUb2dnbGVkKGlzT3BlbjogYm9vbGVhbiwgY3VycmVudFBvcHVwOiBWZXJiZW5Qb3BVcENvbXBvbmVudCkge1xuICAgIGlmIChpc09wZW4pIHtcbiAgICAgIHRoaXMucG9wdXBzKCkuZm9yRWFjaCgocG9wdXApID0+IHtcbiAgICAgICAgaWYgKHBvcHVwICE9PSBjdXJyZW50UG9wdXAgJiYgcG9wdXAuZHJvcGRvd25PcGVuKSB7XG4gICAgICAgICAgcG9wdXAudG9nZ2xlRHJvcGRvd24oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlUG9wdXBDbG9zZSghaXNPcGVuKTtcbiAgfVxuXG4gIGhhbmRsZUFjdGlvbih0YXNrOiBUYXNrLCBwb3B1cDogVmVyYmVuUG9wVXBDb21wb25lbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGl2ZUFjdGlvblR5cGU7XG5cbiAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgY2FzZSBBY3Rpb25UeXBlLlJlQXNzaWduOlxuICAgICAgICB0aGlzLnRhc2tGYWNhZGVcbiAgICAgICAgICAucmVBc3NpZ24odGFzaywgdGhpcy5jb21tZW50LCB0aGlzLnJlY2lwaWVudENvZGUgPz8gdW5kZWZpbmVkKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5uZXh0QWN0b3JzID0gW107XG4gICAgICAgICAgICB0aGlzLnJlY2lwaWVudENvZGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEFjdGlvbi5uZXh0KG51bGwpO1xuICAgICAgICAgICAgcG9wdXAudG9nZ2xlRHJvcGRvd24oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEFjdGlvblR5cGUuUGlja1Rhc2s6XG4gICAgICAgIHRoaXMudGFza0ZhY2FkZVxuICAgICAgICAgIC5waWNrVGFzayh0YXNrLCB0aGlzLmNvbW1lbnQsIHRoaXMucmVjaXBpZW50Q29kZSA/PyB1bmRlZmluZWQsIHRoaXMuc2VsZWN0ZWRTdGFnZUNvZGUgPz8gdW5kZWZpbmVkKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5uZXh0QWN0b3JzID0gW107XG4gICAgICAgICAgICB0aGlzLnJlY2lwaWVudENvZGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEFjdGlvbi5uZXh0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFN0YWdlQ29kZSA9IG51bGw7XG4gICAgICAgICAgICBwb3B1cC50b2dnbGVEcm9wZG93bigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQWN0aW9uVHlwZS5Ta2lwVG86XG4gICAgICAgIC8vIGNvbnN0IHNlbGVjdGVkQWN0aW9uID0gdGhpcy5zZWxlY3RlZEFjdGlvbi5nZXRWYWx1ZSgpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnU2VsZWN0ZWQgQWN0aW9uIGZvciBTa2lwOicsIHNlbGVjdGVkQWN0aW9uKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1Rhc2sgZm9yIFNraXA6JywgdGFzayk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdDb21tZW50IGZvciBTa2lwOicsIHRoaXMuY29tbWVudCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdSZWNpcGllbnQgQ29kZSBmb3IgU2tpcDonLCB0aGlzLnJlY2lwaWVudENvZGUpO1xuICAgICAgICAvLyBpZiAoc2VsZWN0ZWRBY3Rpb24pIHtcbiAgICAgICAgLy8gICB0aGlzLmZhY2FkZVxuICAgICAgICAvLyAgICAgLnNraXBUbyhcbiAgICAgICAgLy8gICAgICAgdGFzay5DdXJyZW50U3RhZ2VzWzBdLFxuICAgICAgICAvLyAgICAgICBzZWxlY3RlZEFjdGlvbi5Ub1N0YWdlLFxuICAgICAgICAvLyAgICAgICB0YXNrLFxuICAgICAgICAvLyAgICAgICB0aGlzLmNvbW1lbnQsXG4gICAgICAgIC8vICAgICAgIHRoaXMucmVjaXBpZW50Q29kZVxuICAgICAgICAvLyAgICAgKVxuICAgICAgICAvLyAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyAgICAgICB0aGlzLmNvbW1lbnQgPSAnJztcbiAgICAgICAgLy8gICAgICAgdGhpcy5uZXh0QWN0aW9ucyA9IFtdO1xuICAgICAgICAvLyAgICAgICB0aGlzLnJlY2lwaWVudENvZGUgPSBudWxsO1xuICAgICAgICAvLyAgICAgICB0aGlzLnNlbGVjdGVkQWN0aW9uLm5leHQobnVsbCk7XG4gICAgICAgIC8vICAgICAgIHBvcHVwLnRvZ2dsZURyb3Bkb3duKCk7XG4gICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgLy8gfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIG9uU3RhdGVDaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnY3JlYXRlJzpcbiAgICAgICAgdmFyIG5ld0l0ZW06IFRhc2sgPSBuZXcgVGFza01vZGVsKHtcbiAgICAgICAgICBXb3JrZmxvd0NvZGU6ICcnLFxuICAgICAgICAgIFN0YXR1czogVGFza1N0YXR1cy5BY3RpdmUsXG4gICAgICAgICAgRmxvd2FibGU6ICcnLFxuICAgICAgICAgIEZsb3dhYmxlRGF0YTogbnVsbCxcbiAgICAgICAgICBGbG93YWJsZVBhdGg6ICcnLFxuICAgICAgICAgIEN1cnJlbnRBY3RvcnM6IFtdLFxuICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICB9KSBhcyB1bmtub3duIGFzIFRhc2s7XG4gICAgICAgIHRoaXMudGFza0ZhY2FkZS5hZGROZXdSZXF1ZXN0KG5ld0l0ZW0pO1xuICAgICAgICAvLyBjb25zdCBjYXJkRGF0YTogQ2FyZERhdGEgPSB7XG4gICAgICAgIC8vICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAvLyAgIHRpdGxlOiAsXG4gICAgICAgIC8vICAgZGF0YTogbmV3R3JvdXAsXG4gICAgICAgIC8vICAgYm9keTogW10sXG4gICAgICAgIC8vICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAvLyB9O1xuICAgICAgICAvLyB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KFtuZXdHcm91cF0pO1xuICAgICAgICAvLyB0aGlzLmNhcmREYXRhLnB1c2goY2FyZERhdGEpO1xuICAgICAgICAvLyB0aGlzLnVzZXJDYXJkQ2xpY2tlZChjYXJkRGF0YSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuaXNUYWJsZVZpZXcgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBjYXNlICdmaWx0ZXInOlxuICAgICAgLy8gICB0aGlzLnNob3dGaWx0ZXIgPSBldmVudC52YWx1ZTtcbiAgICAgIC8vICAgYnJlYWs7XG4gICAgICAvLyBjYXNlICdzb3J0JzpcbiAgICAgIC8vICAgdGhpcy5zaG93U29ydCA9IGV2ZW50LnZhbHVlO1xuICAgICAgLy8gICBicmVhaztcbiAgICAgIC8vIGNhc2UgJ2NvbHVtbic6XG4gICAgICAvLyAgIHRoaXMuc2hvd0NvbHVtbiA9IGV2ZW50LnZhbHVlO1xuICAgICAgLy8gICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYXJkRGF0YUJ5SWRlbnRpZmllcihjb2RlOiBzdHJpbmcpOiBDYXJkRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2FyZERhdGEoKT8uZmluZCgoeyBkYXRhIH0pID0+IGRhdGEuZGF0YS5Db2RlID09PSBjb2RlKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRNb3JlKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnRhc2tGYWNhZGUubG9hZE1vcmUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TYXZlKGRhdGE6IFBhcnRpYWw8VGFzaz4pIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgLi4udGhpcy5jdXJyZW50RGF0YT8uZGF0YSxcbiAgICAgIC4uLmRhdGEsXG4gICAgfSBhcyBUYXNrO1xuICAgIGF3YWl0IHRoaXMudGFza0ZhY2FkZS5hZGRSZXF1ZXN0KHBheWxvYWQpO1xuICB9XG59XG5cbmVudW0gQWN0aW9uVHlwZSB7XG4gIFBpY2tUYXNrID0gJ1BpY2tUYXNrJyxcbiAgVW5QaWNrVGFzayA9ICdVblBpY2tUYXNrJyxcbiAgUmVBc3NpZ24gPSAnUmVBc3NpZ24nLFxuICBQYXNzT24gPSAnUGFzc09uJyxcbiAgUGFzc0JhY2sgPSAnUGFzc0JhY2snLFxuICBGb2xsb3dUYXNrID0gJ0ZvbGxvd1Rhc2snLFxuICBVbmZvbGxvd1Rhc2sgPSAnVW5mb2xsb3dUYXNrJyxcbiAgU2tpcFRvID0gJ1NraXBUbycsXG59XG4iLCI8ZGl2IGNsYXNzPVwic3BhY2UteS04XCI+XG4gIDx2ZXJiZW4tZGF0YS12aWV3ICN2ZHYgW3ZpZXdTdGF0ZV09XCJ7XG4gICAgICBpc1NlYXJjaDogdHJ1ZSxcbiAgICAgIGlzQ29sdW1uOiB0cnVlLFxuICAgICAgaXNGaWx0ZXI6IHRydWUsXG4gICAgICBpc1NvcnQ6IHRydWUsXG4gICAgICBpc0V4cG9ydDogdHJ1ZSxcbiAgICAgIGlzU2VsZWN0OiB0cnVlLFxuICAgICAgaXNDcmVhdGU6IHRydWUsXG4gICAgICBpc1RvZ2dsZTogdHJ1ZSxcbiAgICB9XCIgW2J1dHRvbkNsYXNzXT1cIidteS1jdXN0b20tYnV0dG9uLWNsYXNzJ1wiIFtpY29uQ2xhc3NdPVwiJ215LWljb24tY2xhc3MnXCJcbiAgICBbYWN0aXZlSWNvbkNsYXNzXT1cIidteS1hY3RpdmUtaWNvbi1jbGFzcydcIiBbc2VsZWN0ZWRDb2x1bW5Db3VudF09XCIwXCIgW3NlbGVjdGVkU29ydENvdW50XT1cIjBcIlxuICAgIFtzZWxlY3RlZEZpbHRlclRhYmxlQ291bnRdPVwiMFwiICh2aWV3Q2hhbmdlKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQpXCIgKHN0YXRlQ2hhbmdlKT1cIm9uU3RhdGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDxkaXYgdGFibGUtY29udGVudD5cbiAgICAgIDxsaWItZGF0YS10YWJsZSBbZGF0YV09XCJkYXRhKClcIiBbY29sdW1uc109XCJjb25maWcuY29sdW1uc1wiIFtzdHlsZUNvbmZpZ109XCJzdHlsZXNcIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJoaXN0b3J5XCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZT5cbiAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIlsnL3dvcmtmbG93L3Rhc2staGlzdG9yeScsIHZhbHVlXVwiIHJvdXRlckxpbmtBY3RpdmU9XCJyb3V0ZXItbGluay1hY3RpdmVcIlxuICAgICAgICAgICAgICBjbGFzcz1cInVuZGVybGluZSB0ZXh0LVsjMDAwMEZGXVwiPnZpZXcgaGlzdG9yeTwvYT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cIndvcmtmbG93XCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC12YWx1ZT5cbiAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIlsnL3dvcmtmbG93L3dvcmtmbG93cycsIHZhbHVlXVwiIHJvdXRlckxpbmtBY3RpdmU9XCJyb3V0ZXItbGluay1hY3RpdmVcIlxuICAgICAgICAgICAgICBjbGFzcz1cInVuZGVybGluZSB0ZXh0LVsjMDAwMEZGXVwiPnZpZXcgV29ya2Zsb3c8L2E+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBsaWJDb2x1bW49XCJhY3Rpb25zXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICAgIDx2ZXJiZW4tcG9wLVVwICNwb3B1cCBbY3VzdG9tU3R5bGVzXT1cInsgJ3otaW5kZXgnOiAnOTknIH1cIiBbZW5hYmxlTW91c2VMZWF2ZV09XCJmYWxzZVwiIFtjdXN0b21TdHlsZXNdPVwie1xuICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjZDRhMTA3ODAnLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzVweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnd2hpdGUnXG4gICAgICAgICAgICAgIH1cIiAoZHJvcGRvd25PcGVuQ2hhbmdlKT1cIm9uUG9wdXBUb2dnbGVkKCRldmVudCwgcG9wdXApXCI+XG4gICAgICAgICAgICAgIDxkaXYgZHJvcGRvd24tdHJpZ2dlciBjbGFzcz1cImN1cnNvci1wb2ludGVyIHAtMiAtbS0yIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnIGljb249XCJkb3RzXCIgW3dpZHRoXT1cIjNcIiBbaGVpZ2h0XT1cIjE4XCIgY2xhc3M9XCJ3LWF1dG9cIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctd2hpdGUgcm91bmRlZC1zbVwiIGRyb3Bkb3duLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiB0YWJsZVJvd0FjdGlvbnM7IHRyYWNrIGl0ZW0ubGFiZWwpIHtcblxuICAgICAgICAgICAgICAgIDx2ZXJiZW4tcG9wLVVwICNwb3B1cDIgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzk5JyB9XCIgW2VuYWJsZU1vdXNlTGVhdmVdPVwiZmFsc2VcIiBbY3VzdG9tU3R5bGVzXT1cIntcbiAgICAgICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgI2Q0YTEwNzgwJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc1cHgnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3doaXRlJ1xuICAgICAgICAgICAgICB9XCIgKGRyb3Bkb3duT3BlbkNoYW5nZSk9XCJoYW5kbGVQb3B1cENsb3NlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIml0ZW0uYWN0aW9uKHJvdylcIiBkcm9wZG93bi10cmlnZ2VyIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgcHktMiBweC0zIGhvdmVyOmJnLXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctd2hpdGUgcm91bmRlZC1zbVwiIGRyb3Bkb3duLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTZyZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQganVzdGlmeS1iZXR3ZWVuIGgtMTIgcHgtMiBwdC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgb3BhY2l0eT1cIjAuNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuNzQ2NDkgOC4wMDMzOEM2LjkxNDgzIDguMTM0NyA3LjAyNTIgOC4yMDQ1NSA3LjExNTMxIDguMjkzOTZDNy45ODg0NiA5LjE2MjIyIDguODU3NDIgMTAuMDM0NyA5LjcyOTE3IDEwLjkwNUM5Ljg3MTY3IDExLjA0NzUgOS45OTM5MSAxMS4xOTIxIDkuOTkzMjEgMTEuNDEyOUM5Ljk5MjUxIDExLjY0NjIgOS44OTQ3MiAxMS44MTUyIDkuNjk1NjQgMTEuOTI1NkM5LjQ5MzA3IDEyLjAzOCA5LjI5MjYgMTIuMDIwNiA5LjEwNDY5IDExLjg4OTlDOS4wMzgzMyAxMS44NDM4IDguOTgxNzUgMTEuNzg0NSA4LjkyMzc4IDExLjcyNzJDNy44NTU3NCAxMC42NTkyIDYuNzk2NzggOS41ODIwMyA1LjcxNDc3IDguNTI4NjdDNS4zNzExIDguMTk0MDcgNS4zODQzNyA3Ljc5MTczIDUuNzA3NzkgNy40NzU5OUM2Ljc4ODQgNi40MjEyMyA3Ljg0ODc1IDUuMzQ1NTEgOC45MTUzOSA0LjI3NjA3QzkuMTEzNzcgNC4wNzc2OSA5LjMyMDU0IDMuOTIyNjIgOS42MjMgNC4wNDEzN0M5Ljk3OTI0IDQuMTgxMDcgMTAuMTEyIDQuNTg5MDEgOS44OTQ3MiA0LjkwMzM1QzkuODI5NzYgNC45OTc2NSA5Ljc0MTc0IDUuMDc3MjggOS42NjAwMiA1LjE1OTdDOC44MDY0MiA2LjAxNDY5IDcuOTUyODMgNi44Njk2OCA3LjA5NjQ1IDcuNzIyNTdDNy4wMTQ3MiA3LjgwNDMgNi45MTU1MyA3Ljg2ODU2IDYuNzQ1NzkgOC4wMDQwOEw2Ljc0NjQ5IDguMDAzMzhaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJibGFja1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+U2VsZWN0IEFzc2lnbmVlPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdhcC0yIG1heC1oLTk2IG92ZXJmbG93LXktYXV0byBwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHZlcmJlbi1kcm9wLWRvd25cbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInctZnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlzZWxlY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBBY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIm5leHRBY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICBpZD1cImFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwiTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRBY3Rpb24gfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VsZWN0ZWRBY3Rpb24ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC92ZXJiZW4tZHJvcC1kb3duPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmxhYmVsID09PSAnUGljayBUYXNrJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dmVyYmVuLWRyb3AtZG93biBsYWJlbD1cIlN0YWdlc1wiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiB3aWR0aD1cIjEwMCVcIiBbbXVsdGlzZWxlY3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cInRydWVcIiBmaWx0ZXJCeT1cIk5hbWVcIiBbc2hvd0NsZWFyXT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdGFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImN1cnJlbnRUYXNrPy5GdWxsU3RhZ2VzIHx8IFtdXCIgaWQ9XCJzdGFnZXNcIiBvcHRpb25MYWJlbD1cIk5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU3RhZ2VDb2RlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd24gbGFiZWw9XCJBY3RvcnNcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgd2lkdGg9XCIxMDAlXCIgW211bHRpc2VsZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlcl09XCJ0cnVlXCIgZmlsdGVyQnk9XCJOYW1lXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQWN0b3JcIiBbb3B0aW9uc109XCJuZXh0QWN0b3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhY3RvcnNcIiBvcHRpb25MYWJlbD1cIk5hbWVcIiBvcHRpb25WYWx1ZT1cIklkZW50aWZpZXJcIiBbKG5nTW9kZWwpXT1cInJlY2lwaWVudENvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC92ZXJiZW4tZHJvcC1kb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgWyhuZ01vZGVsKV09XCJjb21tZW50XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb21tZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgcC0xIHRleHQteHMgYm9yZGVyIGJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbWRcIiBzdHlsZT1cImhlaWdodDogOHJlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2xzXT1cIjhcIj48L3RleHRhcmVhPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b24gW2Rpc2FibGVdPVwiIWNvbW1lbnRcIiBbdGV4dF09XCJhY3RpdmVBY3Rpb25UeXBlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZUFjdGlvbihyb3csIHBvcHVwKVwiIGNsYXNzPVwidGV4dC14cyB3LWZ1bGxcIiBiZ0NvbG9yPVwiI0ZGRTY4MVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcj1cIiM0MDQwNDBcIiBib3JkZXJSYWRpdXM9XCIxMHB4XCIgZm9udFNpemU9XCIxNHB4XCIgcGQ9XCIxMHB4IDIwcHhcIiB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIzMnB4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFjdGl2ZUFjdGlvblR5cGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdmVyYmVuYS1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC92ZXJiZW4tcG9wLVVwPlxuXG4gICAgICAgICAgICAgICAgQGlmIChpdGVtLmRpdmlkZXIpIHtcbiAgICAgICAgICAgICAgICA8aHIgY2xhc3M9XCJiZy1bI0ZGRTY4MV0gaC0xIHJvdW5kZWQteGwgYm9yZGVyLTBcIiAvPlxuICAgICAgICAgICAgICAgIH0gfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdmVyYmVuLXBvcC1VcD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaGVhZGVyPlxuICAgICAgICAgICAgPHN0cm9uZz5BY3Rpb25zPC9zdHJvbmc+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2xpYi1kYXRhLXRhYmxlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjYXJkLWNvbnRlbnQ+XG4gICAgICA8dmVyYmVuLWNhcmQtZGF0YS12aWV3IGJvcmRlclJhZGl1cz1cIjEycHhcIiAobG9hZE1vcmVDbGljayk9XCJsb2FkTW9yZSgpXCIgI3ZkY3YgZGF0YUlkPVwiSWRcIiBib3JkZXI9XCI1cHhcIlxuICAgICAgICBbY2FyZERhdGFMaXN0XT1cImNhcmREYXRhKClcIiByYmdDb2xvcj1cIiNmNWY2ZjlcIiBtZz1cIjIwcHhcIj5cbiAgICAgICAgPHZlcmJlbi1sZWZ0LWNhcmQtZGF0YS12aWV3IGNsYXNzPVwic3BhY2UteS03XCI+XG4gICAgICAgICAgPHZlcmJlbi1sZWZ0LWNhcmQtZGF0YSAjdmxjZCBbcGFyZW50XT1cInZkY3ZcIiBkYXRhSWQ9XCJDb2RlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYmctc2Vjb25kYXJ5LTEwMCByb3VuZGVkLXhsIGJvcmRlci1wcmltYXJ5IGJvcmRlci1bMXB4XVwiIFtjYXJkRGF0YUxpc3RdPVwiY2FyZERhdGEoKVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjYXJkIGxldC1jYXJkSXRlbT5cbiAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiY3VycmVudERhdGEgPSB2ZGN2Lm9uSXRlbUNsaWNrKGNhcmRJdGVtKVwiIGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImN1cnJlbnREYXRhID0gdmRjdi5vbkl0ZW1DbGljayhjYXJkSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGN1cnNvci1wb2ludGVyIHctZnVsbCBiZy1zZWNvbmRhcnkgcm91bmRlZC14bFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMyByb3VuZGVkLXhsIHJvdW5kZWQtdHItbm9uZSByb3VuZGVkLWJyLW5vbmVcIiBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgICAgICBjYXJkSXRlbS5zZWxlY3RlZCA/ICdiZy1wcmltYXJ5JyA6ICdiZy1zZWNvbmRhcnktMjAwJ1xuICAgICAgICAgICAgICAgICAgICBcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHB5LTIgcHgtNCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC00IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdhcC15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZCB0ZXh0LVsjNDA0MDQwXVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRJdGVtLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxsYWJlbCBmb3I9XCJwaG9uZVwiIGNsYXNzPVwidGV4dC1bMTBweF0gZm9udC1saWdodFwiPkN1cnJlbnQgQWN0b3JzOjwvbGFiZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNhcmRJdGVtLmRhdGEuQ3VycmVudEFjdG9ycyAmJiBjYXJkSXRlbS5kYXRhLkN1cnJlbnRBY3RvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNhcmRJdGVtLmRhdGEuQ3VycmVudEFjdG9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJwaG9uZVwiIGNsYXNzPVwidGV4dC1zbVwiPnt7IGNhcmRJdGVtLmRhdGEuQ3VycmVudEFjdG9yc1swXS5JZGVudGlmaWVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcmJlbi10b29sdGlwIFt0b3BdPVwiJzBweCdcIiBbdGV4dENvbG9yXT1cIicjMDAwJ1wiIFtiYWNrZ3JvdW5kQ29sb3JdPVwiJyNEM0QzRDMnXCIgW2xlZnRdPVwiJzAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcENvbnRlbnRdPVwiYWN0b3JzVG9vbHRpcFRlbXBsYXRlXCIgI2FjdG9yc1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJwaG9uZVwiIGNsYXNzPVwidGV4dC1zbSBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2FyZEl0ZW0uZGF0YS5DdXJyZW50QWN0b3JzWzBdLklkZW50aWZpZXIgfX0gYW5kIHt7IGNhcmRJdGVtLmRhdGEuQ3VycmVudEFjdG9ycy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMSB9fSBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmVyYmVuLXRvb2x0aXA+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNhY3RvcnNUb29sdGlwVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgbWItMVwiPkN1cnJlbnQgQWN0b3JzOjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZGlzYyBsaXN0LWluc2lkZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChhY3RvciBvZiBjYXJkSXRlbS5kYXRhLkN1cnJlbnRBY3RvcnM7IHRyYWNrIGFjdG9yLklkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidGV4dC14c1wiPnt7IGFjdG9yLklkZW50aWZpZXIgfX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD1cInBob25lXCIgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS00MDBcIj5ObyBhY3RvcnMgYXNzaWduZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdhcC15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGZvcj1cInJvbGVcIiBjbGFzcz1cImZvbnQtbGlnaHRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkSXRlbS5kYXRhLkNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIiBjbGFzcz1cImZsZXggaXRlbXMtZW5kIGdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cIltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvd29ya2Zsb3cvdGFzay1oaXN0b3J5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRJdGVtLmRhdGEuQ29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cIiByb3V0ZXJMaW5rQWN0aXZlPVwicm91dGVyLWxpbmstYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVuZGVybGluZSB0ZXh0LVsjMDAwMEZGXSB0ZXh0LXhzIHJlbGF0aXZlIHotMTBcIj52aWV3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeTwvYT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyYmVuLXBvcC1VcCAjcG9wdXAgW2N1c3RvbVN0eWxlc109XCJ7ICd6LWluZGV4JzogJzk5JyB9XCIgW2VuYWJsZU1vdXNlTGVhdmVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXN0b21TdHlsZXNdPVwie1xuICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCAjZDRhMTA3ODAnLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzVweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnd2hpdGUnXG4gICAgICAgICAgICAgIH1cIiAoZHJvcGRvd25PcGVuQ2hhbmdlKT1cIm9uUG9wdXBUb2dnbGVkKCRldmVudCwgcG9wdXApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkcm9wZG93bi10cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIHAtMiAtbS0yIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcmJlbi1zdmcgaWNvbj1cImRvdHNcIiBbd2lkdGhdPVwiM1wiIFtoZWlnaHRdPVwiMThcIiBjbGFzcz1cInctYXV0b1wiPjwvdmVyYmVuLXN2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctd2hpdGUgcm91bmRlZC1zbVwiIGRyb3Bkb3duLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHRhYmxlUm93QWN0aW9uczsgdHJhY2sgaXRlbS5sYWJlbCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyYmVuLXBvcC1VcCAjcG9wdXAyIFtjdXN0b21TdHlsZXNdPVwieyAnei1pbmRleCc6ICc5OScgfVwiIFtlbmFibGVNb3VzZUxlYXZlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1c3RvbVN0eWxlc109XCJ7XG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkICNkNGExMDc4MCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnNXB4JyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd3aGl0ZSdcbiAgICAgICAgICAgICAgfVwiIChkcm9wZG93bk9wZW5DaGFuZ2UpPVwiaGFuZGxlUG9wdXBDbG9zZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIml0ZW0uYWN0aW9uKGNhcmRJdGVtLmRhdGEpXCIgZHJvcGRvd24tdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgcHktMiBweC0zIGhvdmVyOmJnLXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctd2hpdGUgcm91bmRlZC1zbVwiIGRyb3Bkb3duLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAxNnJlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC00IGp1c3RpZnktYmV0d2VlbiBoLTEyIHB4LTIgcHQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIG9wYWNpdHk9XCIwLjZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNi43NDY0OSA4LjAwMzM4QzYuOTE0ODMgOC4xMzQ3IDcuMDI1MiA4LjIwNDU1IDcuMTE1MzEgOC4yOTM5NkM3Ljk4ODQ2IDkuMTYyMjIgOC44NTc0MiAxMC4wMzQ3IDkuNzI5MTcgMTAuOTA1QzkuODcxNjcgMTEuMDQ3NSA5Ljk5MzkxIDExLjE5MjEgOS45OTMyMSAxMS40MTI5QzkuOTkyNTEgMTEuNjQ2MiA5Ljg5NDcyIDExLjgxNTIgOS42OTU2NCAxMS45MjU2QzkuNDkzMDcgMTIuMDM4IDkuMjkyNiAxMi4wMjA2IDkuMTA0NjkgMTEuODg5OUM5LjAzODMzIDExLjg0MzggOC45ODE3NSAxMS43ODQ1IDguOTIzNzggMTEuNzI3MkM3Ljg1NTc0IDEwLjY1OTIgNi43OTY3OCA5LjU4MjAzIDUuNzE0NzcgOC41Mjg2N0M1LjM3MTEgOC4xOTQwNyA1LjM4NDM3IDcuNzkxNzMgNS43MDc3OSA3LjQ3NTk5QzYuNzg4NCA2LjQyMTIzIDcuODQ4NzUgNS4zNDU1MSA4LjkxNTM5IDQuMjc2MDdDOS4xMTM3NyA0LjA3NzY5IDkuMzIwNTQgMy45MjI2MiA5LjYyMyA0LjA0MTM3QzkuOTc5MjQgNC4xODEwNyAxMC4xMTIgNC41ODkwMSA5Ljg5NDcyIDQuOTAzMzVDOS44Mjk3NiA0Ljk5NzY1IDkuNzQxNzQgNS4wNzcyOCA5LjY2MDAyIDUuMTU5N0M4LjgwNjQyIDYuMDE0NjkgNy45NTI4MyA2Ljg2OTY4IDcuMDk2NDUgNy43MjI1N0M3LjAxNDcyIDcuODA0MyA2LjkxNTUzIDcuODY4NTYgNi43NDU3OSA4LjAwNDA4TDYuNzQ2NDkgOC4wMDMzOFpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiYmxhY2tcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bVwiPlNlbGVjdCBBc3NpZ25lZTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ2FwLTIgbWF4LWgtOTYgb3ZlcmZsb3cteS1hdXRvIHAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDx2ZXJiZW4tZHJvcC1kb3duXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJBY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgW211bHRpc2VsZWN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgQWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJuZXh0QWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIk5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkQWN0aW9uIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlbGVjdGVkQWN0aW9uLm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcmJlbi1kcm9wLWRvd24gbGFiZWw9XCJBY3RvcnNcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlzZWxlY3RdPVwiZmFsc2VcIiBbZmlsdGVyXT1cInRydWVcIiBmaWx0ZXJCeT1cIk5hbWVcIiBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IEFjdG9yXCIgW29wdGlvbnNdPVwibmV4dEFjdG9yc1wiIGlkPVwiYWN0b3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIk5hbWVcIiBvcHRpb25WYWx1ZT1cIklkZW50aWZpZXJcIiBbKG5nTW9kZWwpXT1cInJlY2lwaWVudENvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmVyYmVuLWRyb3AtZG93bj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgWyhuZ01vZGVsKV09XCJjb21tZW50XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb21tZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBwLTEgdGV4dC14cyBib3JkZXIgYm9yZGVyLXByaW1hcnkgcm91bmRlZC1tZFwiIHN0eWxlPVwiaGVpZ2h0OiA4cmVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sc109XCI4XCI+PC90ZXh0YXJlYT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyYmVuYS1idXR0b24gW2Rpc2FibGVdPVwiIWNvbW1lbnRcIiBbdGV4dF09XCJhY3RpdmVBY3Rpb25UeXBlID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQWN0aW9uKGNhcmRJdGVtLmRhdGEsIHBvcHVwKVwiIGNsYXNzPVwidGV4dC14cyB3LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnQ29sb3I9XCIjRkZFNjgxXCIgdGV4dENvbG9yPVwiIzQwNDA0MFwiIGJvcmRlclJhZGl1cz1cIjEwcHhcIiBmb250U2l6ZT1cIjE0cHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkPVwiMTBweCAyMHB4XCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiMzJweFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFjdGl2ZUFjdGlvblR5cGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ZXJiZW5hLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmVyYmVuLXBvcC1VcD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmRpdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociBjbGFzcz1cImJnLVsjRkZFNjgxXSBoLTEgcm91bmRlZC14bCBib3JkZXItMFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ZXJiZW4tcG9wLVVwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbm9ybWFsIHRleHQtc21cIj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoY2lJdGVtIG9mIGl0ZW0uYm9keTsgdHJhY2sgY2lJdGVtLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgZm9udC1saWdodCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID57eyBjaUl0ZW0udGl0bGUgfX06PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ibGFja1wiPnt7IGNpSXRlbS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH0gLS0+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdmVyYmVuLWxlZnQtY2FyZC1kYXRhPlxuICAgICAgICA8L3ZlcmJlbi1sZWZ0LWNhcmQtZGF0YS12aWV3PlxuXG4gICAgICAgIDx2ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwYXJlbnQ+XG4gICAgICAgICAgICA8IS0tIDxsaWItdXNlci1yZXF1ZXN0LWZvcm1cbiAgICAgICAgICAgICAgW2N1cnJlbnREYXRhXT1cImN1cnJlbnREYXRhXCJcbiAgICAgICAgICAgICAgKHN3aXRjaFZpZXcpPVwidmR2LnRvZ2dsZVZpZXcoKVwiXG4gICAgICAgICAgICAgIChvbkFwcHJvdmFsKT1cIm9uQXBwcm92ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID48L2xpYi11c2VyLXJlcXVlc3QtZm9ybT4gLS0+XG4gICAgICAgICAgICA8dGFza3MtZm9ybSBbY3VycmVudERhdGFdPVwiY3VycmVudERhdGFcIiAoc3dpdGNoVmlldyk9XCJ2ZHYudG9nZ2xlVmlldygpXCJcbiAgICAgICAgICAgICAgKG9uU2F2ZSk9XCJvblNhdmUoJGV2ZW50KVwiPjwvdGFza3MtZm9ybT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3ZlcmJlbi1yaWdodC1jYXJkLWRhdGEtdmlldz5cblxuICAgICAgICA8dmVyYmVuLWNhcmQtZGF0YS12aWV3LWZvb3RlciBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnZmxleCBnYXAtMiBpdGVtcy1jZW50ZXInOiB0cnVlLFxuICAgICAgICAgICAgICAnanVzdGlmeS1lbmQnOiB0cnVlXG4gICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICA8IS0tIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cIiF2ZGN2Lmhhc0N1cnJlbnRJdGVtKClcIlxuICAgICAgICAgICAgICBbZm9udFdlaWdodF09XCInYm9sZCdcIlxuICAgICAgICAgICAgICBbYmdDb2xvcl09XCInIzhFOEQ4NydcIlxuICAgICAgICAgICAgICBbYm9yZGVyUmFkaXVzXT1cIic0cHgnXCJcbiAgICAgICAgICAgICAgW3RleHRDb2xvcl09XCInI2ZmZidcIlxuICAgICAgICAgICAgICBbcGRdPVwiJzkuNzlweCAzNy4yOHB4J1wiXG4gICAgICAgICAgICAgIFt0ZXh0XT1cIidEZWxldGUnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvdmVyYmVuYS1idXR0b24+IC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgge3tcbiAgICAgICAgICAgICAgICB2ZGN2Lmhhc0N1cnJlbnRJdGVtKCkgPyAnZmxleC0xJyA6ICcnXG4gICAgICAgICAgICAgIH19IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlciBnYXAtNVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhZ2luYXRvci10ZXh0XCI+e3sgY2FyZERhdGEoKS5sZW5ndGggfX0gcmVjb3JkcyBsb2FkZWQ8L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxvYWRNb3JlKClcIiBjbGFzcz1cImxvYWQtbW9yZSB2aWV3LWxpbmtzIHRleHQtWyMzNDc5RTldIHVuZGVybGluZVwiPlxuICAgICAgICAgICAgICAgIExvYWQgbW9yZVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3ZlcmJlbi1jYXJkLWRhdGEtdmlldy1mb290ZXI+XG4gICAgICA8L3ZlcmJlbi1jYXJkLWRhdGEtdmlldz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNvbHVtbi1jb250ZW50PlxuICAgICAgPGxpYi1kYXRhLWNvbHVtbnMgW2NvbHVtbnNdPVwiY29uZmlnLmNvbHVtbnNcIiAoY29sdW1uc1VwZGF0ZWQpPVwib25Db2x1bW5zVXBkYXRlZCgkZXZlbnQpXCI+PC9saWItZGF0YS1jb2x1bW5zPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgZmlsdGVyLWNvbnRlbnQ+XG4gICAgICA8dmVyYmVuLXRhYmxlLWZpbHRlciBbYm9yZGVyXT1cIicxcHggc29saWQgcmdiYSgyMTIsIDE2MCwgNywgMSknXCIgYm9yZGVyUmFkaXVzPVwiMTBweFwiXG4gICAgICAgIGJveFNoYWRvdz1cIjJweCAycHggMnB4IDBweCBzaWx2ZXJcIiBiZ0NvbG9yPVwid2hpdGVcIiB3aWR0aD1cIjQyMHB4XCIgdGV4dENvbG9yPVwiYmxhY2tcIiBwZD1cIjFyZW1cIlxuICAgICAgICBwcmltYXJ5Q29sb3I9XCIjRkZFNjgxXCIgc2Vjb25kYXJ5Q29sb3I9XCIjMzQ3OUU5XCIgdGVydGlhcnlDb2xvcj1cIiM0MDQwNDBcIiBbZmlsdGVyT3B0aW9uc109XCJmaWx0ZXJBcnJheVwiXG4gICAgICAgIFttYXhGaWx0ZXJMZW5ndGhdPVwiM1wiPjwvdmVyYmVuLXRhYmxlLWZpbHRlcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHNvcnQtY29udGVudD5cbiAgICAgIDxsaWItZGF0YS1zb3J0IFtjb2x1bW5zXT1cImNvbmZpZy5jb2x1bW5zXCIgW2RhdGFdPVwiZGF0YSgpXCIgKHNvcnRBcHBsaWVkKT1cIm9uU29ydFVwZGF0ZWQoJGV2ZW50KVwiPjwvbGliLWRhdGEtc29ydD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGV4cG9ydC1jb250ZW50PlxuICAgICAgPGxpYi1kYXRhLWV4cG9ydCBbZGF0YV09XCJkYXRhKClcIiAoZXhwb3J0RGF0YUV2ZW50KT1cImhhbmRsZUV4cG9ydCgkZXZlbnQpXCI+XG4gICAgICA8L2xpYi1kYXRhLWV4cG9ydD5cbiAgICA8L2Rpdj5cbiAgPC92ZXJiZW4tZGF0YS12aWV3PlxuXG4gIDxkaXYgKm5nSWY9XCJ2ZHYuaXNUYWJsZVZpZXdcIiBjbGFzcz1cImZsZXggZ2FwLTIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtbG9nLWJ1dHRvbi1jb250YWluZXIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgIDwhLS0gPHZlcmJlbmEtYnV0dG9uXG4gICAgICAgIFtmb250V2VpZ2h0XT1cIidib2xkJ1wiXG4gICAgICAgIFtiZ0NvbG9yXT1cIicjOEU4RDg3J1wiXG4gICAgICAgIFtib3JkZXJSYWRpdXNdPVwiJzRweCdcIlxuICAgICAgICBbdGV4dENvbG9yXT1cIicjZmZmJ1wiXG4gICAgICAgIFtwZF09XCInOS43OXB4IDM3LjI4cHgnXCJcbiAgICAgICAgW3RleHRdPVwiJ0RlbGV0ZSdcIlxuICAgICAgPlxuICAgICAgPC92ZXJiZW5hLWJ1dHRvbj4gLS0+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgaXRlbXMtY2VudGVyIGdhcC01XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInBhZ2luYXRvci10ZXh0XCI+e3sgY2FyZERhdGEoKS5sZW5ndGggfX0gcmVjb3JkcyBsb2FkZWQ8L3NwYW4+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZSgpXCIgY2xhc3M9XCJsb2FkLW1vcmUgdmlldy1saW5rcyB0ZXh0LVsjMzQ3OUU5XSB1bmRlcmxpbmVcIj5cbiAgICAgICAgTG9hZCBtb3JlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvY29tcG9uZW50cy90YXNrcy90YXNrcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9jb21wb25lbnRzL3Rhc2tzL3Rhc2tzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsV0FBVyxFQUFRLFVBQVUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFRMUMsTUFBTSxPQUFPLGNBQWUsU0FBUSxxQkFBMkI7SUFtQnpDO0lBQWdDO0lBbEJwRCxJQUFJLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sR0FBeUI7UUFDN0IsVUFBVSxFQUFFLEVBQUUsRUFBRSx3QkFBd0I7UUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxtQ0FBbUM7UUFDckQsY0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsS0FB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LEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGVBQWU7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLElBQW1CO1FBQzlCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUk7WUFDekIsR0FBRyxJQUFJO1NBQ0EsQ0FBQztRQUNWLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQzt3R0FwR1UsY0FBYzs0RkFBZCxjQUFjLHFLQUZkLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsaURDZGxELGkxVUF1TkE7OzRGRHZNYSxjQUFjO2tCQU4xQixTQUFTOytCQUNFLFdBQVcsYUFHVixDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhcmREYXRhIH0gZnJvbSAndmVyYmVuLW5nLXVpJztcbmltcG9ydCB7IE9iamVjdFN0YXRlLCBUYXNrLCBUYXNrU3RhdHVzIH0gZnJvbSAndmVyYmVuLXdvcmtmbG93LXVpL3NyYy9saWIvbW9kZWxzJztcbmltcG9ydCB7IEJhc2VEYXRhVmlld0NvbXBvbmVudCwgRGF0YVZpZXdDb25maWcgfSBmcm9tICd2ZXJiZW4td29ya2Zsb3ctdWkvc3JjL2xpYi9zaGFyZWQnO1xuaW1wb3J0IHsgY29sdW1ucyB9IGZyb20gJy4vdGFza3MuY29sdW1ucyc7XG5pbXBvcnQgeyBUYXNrRmFjYWRlIH0gZnJvbSAnLi90YXNrcy5mYWNhZGUnO1xuaW1wb3J0IHsgVGFza01vZGVsIH0gZnJvbSAnLi90YXNrcy5tb2RlbHMnO1xuaW1wb3J0IHsgVGFza3NTZXJ2aWNlIH0gZnJvbSAnLi90YXNrcy5zZXJ2aWNlJztcbmltcG9ydCB7IFRhc2tTdGF0ZSB9IGZyb20gJy4vdGFza3Muc3RhdGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdGFza3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFza3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vdGFza3MuY29tcG9uZW50LmNzcycsXG4gIHByb3ZpZGVyczogW1Rhc2tzU2VydmljZSwgVGFza0ZhY2FkZSwgVGFza1N0YXRlXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFza3NDb21wb25lbnQgZXh0ZW5kcyBCYXNlRGF0YVZpZXdDb21wb25lbnQ8VGFzaz4ge1xuICB1c2VyID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIGNvbmZpZzogRGF0YVZpZXdDb25maWc8VGFzaz4gPSB7XG4gICAgZGF0YVNvdXJjZTogW10sIC8vIFBvcHVsYXRlIGZyb20gc2VydmljZVxuICAgIGNvbHVtbnM6IGNvbHVtbnMsIC8vIFlvdXIgZXhpc3RpbmcgY29sdW1uIGRlZmluaXRpb25zXG4gICAgY2FyZERhdGFNYXBwZXI6ICh0YXNrKSA9PiAoe1xuICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgdGl0bGU6IHRhc2suTmFtZSxcbiAgICAgIGRhdGE6IHRhc2ssXG4gICAgICBib2R5OiBbXG4gICAgICAgIHsgdGl0bGU6ICdOYW1lJywgdmFsdWU6IHRhc2suTmFtZSB9LFxuICAgICAgICB7IHRpdGxlOiAnU3RhdHVzJywgdmFsdWU6IHRhc2suU3RhdHVzIH0sXG4gICAgICBdLFxuICAgICAgY2hpbGRyZW46IFtdLFxuICAgIH0pLFxuICAgIG9uRGV0YWlsVmlldzogKHRhc2spID0+IHtcbiAgICAgIC8vIEN1c3RvbSBkZXRhaWwgdmlldyBsb2dpY1xuICAgIH0sXG4gIH07XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSB0YXNrRmFjYWRlOiBUYXNrRmFjYWRlKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMudGFza0ZhY2FkZS5nZXRSZXF1ZXN0cyQoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuZGF0YS5zZXQoZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBsb2FkSW5pdGlhbERhdGEoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudGFza0ZhY2FkZS5sb2FkUmVxdWVzdHModGhpcy51c2VyKCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgZXJyb3JcbiAgICB9XG4gIH1cblxuICBoYW5kbGVTZWFyY2goZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSkge1xuICAgIHRoaXMudGFza0ZhY2FkZS5zZWFyY2goZXZlbnQudmFsdWUsIHRoaXMudXNlcigpKTtcbiAgfVxuXG4gIGdldEFjdGlvbk5hbWVzRm9yVGFzayh0YXNrOiBUYXNrKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbJ2ZvbGxvd3Rhc2snLCAncmVhc3NpZ24nXTtcbiAgfVxuXG4gIG92ZXJyaWRlIG9uU3RhdGVDaGFuZ2UoZXZlbnQ6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnY3JlYXRlJzpcbiAgICAgICAgdmFyIG5ld0l0ZW06IFRhc2sgPSBuZXcgVGFza01vZGVsKHtcbiAgICAgICAgICBXb3JrZmxvd0NvZGU6ICcnLFxuICAgICAgICAgIFN0YXR1czogVGFza1N0YXR1cy5BY3RpdmUsXG4gICAgICAgICAgRmxvd2FibGU6ICcnLFxuICAgICAgICAgIEZsb3dhYmxlRGF0YTogbnVsbCxcbiAgICAgICAgICBGbG93YWJsZVBhdGg6ICcnLFxuICAgICAgICAgIEN1cnJlbnRBY3RvcnM6IFtdLFxuICAgICAgICAgIERhdGFTdGF0ZTogT2JqZWN0U3RhdGUuTmV3LFxuICAgICAgICB9KSBhcyB1bmtub3duIGFzIFRhc2s7XG4gICAgICAgIHRoaXMudGFza0ZhY2FkZS5hZGROZXdSZXF1ZXN0KG5ld0l0ZW0pO1xuICAgICAgICAvLyBjb25zdCBjYXJkRGF0YTogQ2FyZERhdGEgPSB7XG4gICAgICAgIC8vICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAvLyAgIHRpdGxlOiAsXG4gICAgICAgIC8vICAgZGF0YTogbmV3R3JvdXAsXG4gICAgICAgIC8vICAgYm9keTogW10sXG4gICAgICAgIC8vICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAvLyB9O1xuICAgICAgICAvLyB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KFtuZXdHcm91cF0pO1xuICAgICAgICAvLyB0aGlzLmNhcmREYXRhLnB1c2goY2FyZERhdGEpO1xuICAgICAgICAvLyB0aGlzLnVzZXJDYXJkQ2xpY2tlZChjYXJkRGF0YSk7XG4gICAgICAgIHRoaXMuZGF0YVZpZXcuaXNUYWJsZVZpZXcgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBjYXNlICdmaWx0ZXInOlxuICAgICAgLy8gICB0aGlzLnNob3dGaWx0ZXIgPSBldmVudC52YWx1ZTtcbiAgICAgIC8vICAgYnJlYWs7XG4gICAgICAvLyBjYXNlICdzb3J0JzpcbiAgICAgIC8vICAgdGhpcy5zaG93U29ydCA9IGV2ZW50LnZhbHVlO1xuICAgICAgLy8gICBicmVhaztcbiAgICAgIC8vIGNhc2UgJ2NvbHVtbic6XG4gICAgICAvLyAgIHRoaXMuc2hvd0NvbHVtbiA9IGV2ZW50LnZhbHVlO1xuICAgICAgLy8gICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYXJkRGF0YUJ5SWRlbnRpZmllcihjb2RlOiBzdHJpbmcpOiBDYXJkRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2FyZERhdGEoKT8uZmluZCgoeyBkYXRhIH0pID0+IGRhdGEuZGF0YS5Db2RlID09PSBjb2RlKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRNb3JlKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnRhc2tGYWNhZGUubG9hZE1vcmUoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25TYXZlKGRhdGE6IFBhcnRpYWw8VGFzaz4pIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgLi4udGhpcy5jdXJyZW50RGF0YT8uZGF0YSxcbiAgICAgIC4uLmRhdGEsXG4gICAgfSBhcyBUYXNrO1xuICAgIGF3YWl0IHRoaXMudGFza0ZhY2FkZS5hZGRSZXF1ZXN0KHBheWxvYWQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic3BhY2UteS04XCI+XG4gIDx2ZXJiZW4tZGF0YS12aWV3ICN2ZHYgW3ZpZXdTdGF0ZV09XCJ7XG4gICAgICBpc1NlYXJjaDogdHJ1ZSxcbiAgICAgIGlzQ29sdW1uOiB0cnVlLFxuICAgICAgaXNGaWx0ZXI6IHRydWUsXG4gICAgICBpc1NvcnQ6IHRydWUsXG4gICAgICBpc0V4cG9ydDogdHJ1ZSxcbiAgICAgIGlzU2VsZWN0OiB0cnVlLFxuICAgICAgaXNDcmVhdGU6IHRydWUsXG4gICAgICBpc1RvZ2dsZTogdHJ1ZSxcbiAgICB9XCIgW2J1dHRvbkNsYXNzXT1cIidteS1jdXN0b20tYnV0dG9uLWNsYXNzJ1wiIFtpY29uQ2xhc3NdPVwiJ215LWljb24tY2xhc3MnXCJcbiAgICBbYWN0aXZlSWNvbkNsYXNzXT1cIidteS1hY3RpdmUtaWNvbi1jbGFzcydcIiBbc2VsZWN0ZWRDb2x1bW5Db3VudF09XCIwXCIgW3NlbGVjdGVkU29ydENvdW50XT1cIjBcIlxuICAgIFtzZWxlY3RlZEZpbHRlclRhYmxlQ291bnRdPVwiMFwiICh2aWV3Q2hhbmdlKT1cIm9uVmlld0NoYW5nZSgkZXZlbnQpXCIgKHN0YXRlQ2hhbmdlKT1cIm9uU3RhdGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKG9uU2VhcmNoQ2hhbmdlKT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCI+XG4gICAgPGRpdiB0YWJsZS1jb250ZW50PlxuICAgICAgPGxpYi1kYXRhLXRhYmxlIFtkYXRhXT1cImRhdGEoKVwiIFtjb2x1bW5zXT1cImNvbmZpZy5jb2x1bW5zXCIgW3N0eWxlQ29uZmlnXT1cInN0eWxlc1wiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImhpc3RvcnlcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPlxuICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiWycvd29ya2Zsb3cvdGFzay1oaXN0b3J5JywgdmFsdWVdXCIgcm91dGVyTGlua0FjdGl2ZT1cInJvdXRlci1saW5rLWFjdGl2ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidW5kZXJsaW5lIHRleHQtWyMwMDAwRkZdXCI+dmlldyBoaXN0b3J5PC9hPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbGliQ29sdW1uPVwid29ya2Zsb3dcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXZhbHVlPlxuICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiWycvd29ya2Zsb3cvd29ya2Zsb3dzJywgdmFsdWVdXCIgcm91dGVyTGlua0FjdGl2ZT1cInJvdXRlci1saW5rLWFjdGl2ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidW5kZXJsaW5lIHRleHQtWyMwMDAwRkZdXCI+dmlldyBXb3JrZmxvdzwvYT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIGxpYkNvbHVtbj1cImFjdGlvbnNcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2NlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgICAgPGxpYi1vcGVyYXRpb24tcG9wdXAgW3VzZXJdPVwidXNlcigpXCIgW3Rhc2tdPVwicm93XCIgW2FsbG93ZWRBY3Rpb25zXT1cImdldEFjdGlvbk5hbWVzRm9yVGFzayhyb3cpXCJcbiAgICAgICAgICAgICAgKGFjdGlvbkNvbXBsZXRlKT1cImxvYWRJbml0aWFsRGF0YSgpXCI+XG4gICAgICAgICAgICAgIDxkaXYgdHJpZ2dlciBjbGFzcz1cImN1cnNvci1wb2ludGVyIHAtMiAtbS0yIGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnIGljb249XCJkb3RzXCIgW3dpZHRoXT1cIjNcIiBbaGVpZ2h0XT1cIjE4XCIgY2xhc3M9XCJ3LWF1dG9cIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saWItb3BlcmF0aW9uLXBvcHVwPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNoZWFkZXI+XG4gICAgICAgICAgICA8c3Ryb25nPkFjdGlvbnM8L3N0cm9uZz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbGliLWRhdGEtdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNhcmQtY29udGVudD5cbiAgICAgIDx2ZXJiZW4tY2FyZC1kYXRhLXZpZXcgYm9yZGVyUmFkaXVzPVwiMTJweFwiIChsb2FkTW9yZUNsaWNrKT1cImxvYWRNb3JlKClcIiAjdmRjdiBkYXRhSWQ9XCJJZFwiIGJvcmRlcj1cIjVweFwiXG4gICAgICAgIFtjYXJkRGF0YUxpc3RdPVwiY2FyZERhdGEoKVwiIHJiZ0NvbG9yPVwiI2Y1ZjZmOVwiIG1nPVwiMjBweFwiPlxuICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhLXZpZXcgY2xhc3M9XCJzcGFjZS15LTdcIj5cbiAgICAgICAgICA8dmVyYmVuLWxlZnQtY2FyZC1kYXRhICN2bGNkIFtwYXJlbnRdPVwidmRjdlwiIGRhdGFJZD1cIkNvZGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJiZy1zZWNvbmRhcnktMTAwIHJvdW5kZWQteGwgYm9yZGVyLXByaW1hcnkgYm9yZGVyLVsxcHhdXCIgW2NhcmREYXRhTGlzdF09XCJjYXJkRGF0YSgpXCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NhcmQgbGV0LWNhcmRJdGVtPlxuICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjdXJyZW50RGF0YSA9IHZkY3Yub25JdGVtQ2xpY2soY2FyZEl0ZW0pXCIgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiY3VycmVudERhdGEgPSB2ZGN2Lm9uSXRlbUNsaWNrKGNhcmRJdGVtKVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggY3Vyc29yLXBvaW50ZXIgdy1mdWxsIGJnLXNlY29uZGFyeSByb3VuZGVkLXhsXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0zIHJvdW5kZWQteGwgcm91bmRlZC10ci1ub25lIHJvdW5kZWQtYnItbm9uZVwiIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNhcmRJdGVtLnNlbGVjdGVkID8gJ2JnLXByaW1hcnknIDogJ2JnLXNlY29uZGFyeS0yMDAnXG4gICAgICAgICAgICAgICAgICAgIFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcHktMiBweC00IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ2FwLXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXNlbWlib2xkIHRleHQtWyM0MDQwNDBdXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZEl0ZW0udGl0bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGxhYmVsIGZvcj1cInBob25lXCIgY2xhc3M9XCJ0ZXh0LVsxMHB4XSBmb250LWxpZ2h0XCI+Q3VycmVudCBBY3RvcnM6PC9sYWJlbD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY2FyZEl0ZW0uZGF0YS5DdXJyZW50QWN0b3JzICYmIGNhcmRJdGVtLmRhdGEuQ3VycmVudEFjdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY2FyZEl0ZW0uZGF0YS5DdXJyZW50QWN0b3JzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD1cInBob25lXCIgY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgY2FyZEl0ZW0uZGF0YS5DdXJyZW50QWN0b3JzWzBdLklkZW50aWZpZXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyYmVuLXRvb2x0aXAgW3RvcF09XCInMHB4J1wiIFt0ZXh0Q29sb3JdPVwiJyMwMDAnXCIgW2JhY2tncm91bmRDb2xvcl09XCInI0QzRDNEMydcIiBbbGVmdF09XCInMCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwQ29udGVudF09XCJhY3RvcnNUb29sdGlwVGVtcGxhdGVcIiAjYWN0b3JzVG9vbHRpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD1cInBob25lXCIgY2xhc3M9XCJ0ZXh0LXNtIGN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjYXJkSXRlbS5kYXRhLkN1cnJlbnRBY3RvcnNbMF0uSWRlbnRpZmllciB9fSBhbmQge3sgY2FyZEl0ZW0uZGF0YS5DdXJyZW50QWN0b3JzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAxIH19IG90aGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ZXJiZW4tdG9vbHRpcD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FjdG9yc1Rvb2x0aXBUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQteHMgZm9udC1zZW1pYm9sZCBtYi0xXCI+Q3VycmVudCBBY3RvcnM6PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1kaXNjIGxpc3QtaW5zaWRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGFjdG9yIG9mIGNhcmRJdGVtLmRhdGEuQ3VycmVudEFjdG9yczsgdHJhY2sgYWN0b3IuSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ0ZXh0LXhzXCI+e3sgYWN0b3IuSWRlbnRpZmllciB9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwicGhvbmVcIiBjbGFzcz1cInRleHQtc20gdGV4dC1ncmF5LTQwMFwiPk5vIGFjdG9ycyBhc3NpZ25lZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQgZ2FwLXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZm9yPVwicm9sZVwiIGNsYXNzPVwiZm9udC1saWdodFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRJdGVtLmRhdGEuQ29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiIGNsYXNzPVwiZmxleCBpdGVtcy1lbmQgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy93b3JrZmxvdy90YXNrLWhpc3RvcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZEl0ZW0uZGF0YS5Db2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVwiIHJvdXRlckxpbmtBY3RpdmU9XCJyb3V0ZXItbGluay1hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidW5kZXJsaW5lIHRleHQtWyMwMDAwRkZdIHRleHQteHMgcmVsYXRpdmUgei0xMFwiPnZpZXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5PC9hPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItb3BlcmF0aW9uLXBvcHVwIFt1c2VyXT1cInVzZXIoKVwiIFt0YXNrXT1cImNhcmRJdGVtLmRhdGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd2VkQWN0aW9uc109XCJnZXRBY3Rpb25OYW1lc0ZvclRhc2soY2FyZEl0ZW0uZGF0YSlcIiAoYWN0aW9uQ29tcGxldGUpPVwibG9hZEluaXRpYWxEYXRhKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRyaWdnZXIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBwLTIgLW0tMiBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJiZW4tc3ZnIGljb249XCJkb3RzXCIgW3dpZHRoXT1cIjNcIiBbaGVpZ2h0XT1cIjE4XCIgY2xhc3M9XCJ3LWF1dG9cIj48L3ZlcmJlbi1zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLW9wZXJhdGlvbi1wb3B1cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LW5vcm1hbCB0ZXh0LXNtXCI+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGNpSXRlbSBvZiBpdGVtLmJvZHk7IHRyYWNrIGNpSXRlbS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIGZvbnQtbGlnaHQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+e3sgY2lJdGVtLnRpdGxlIH19Ojwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtYmxhY2tcIj57eyBjaUl0ZW0udmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9IC0tPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3ZlcmJlbi1sZWZ0LWNhcmQtZGF0YT5cbiAgICAgICAgPC92ZXJiZW4tbGVmdC1jYXJkLWRhdGEtdmlldz5cblxuICAgICAgICA8dmVyYmVuLXJpZ2h0LWNhcmQtZGF0YS12aWV3PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGFyZW50PlxuICAgICAgICAgICAgPCEtLSA8bGliLXVzZXItcmVxdWVzdC1mb3JtXG4gICAgICAgICAgICAgIFtjdXJyZW50RGF0YV09XCJjdXJyZW50RGF0YVwiXG4gICAgICAgICAgICAgIChzd2l0Y2hWaWV3KT1cInZkdi50b2dnbGVWaWV3KClcIlxuICAgICAgICAgICAgICAob25BcHByb3ZhbCk9XCJvbkFwcHJvdmUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9saWItdXNlci1yZXF1ZXN0LWZvcm0+IC0tPlxuICAgICAgICAgICAgPHRhc2tzLWZvcm0gW2N1cnJlbnREYXRhXT1cImN1cnJlbnREYXRhXCIgKHN3aXRjaFZpZXcpPVwidmR2LnRvZ2dsZVZpZXcoKVwiXG4gICAgICAgICAgICAgIChvblNhdmUpPVwib25TYXZlKCRldmVudClcIj48L3Rhc2tzLWZvcm0+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC92ZXJiZW4tcmlnaHQtY2FyZC1kYXRhLXZpZXc+XG5cbiAgICAgICAgPHZlcmJlbi1jYXJkLWRhdGEtdmlldy1mb290ZXIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ2ZsZXggZ2FwLTIgaXRlbXMtY2VudGVyJzogdHJ1ZSxcbiAgICAgICAgICAgICAgJ2p1c3RpZnktZW5kJzogdHJ1ZVxuICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgPCEtLSA8dmVyYmVuYS1idXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCIhdmRjdi5oYXNDdXJyZW50SXRlbSgpXCJcbiAgICAgICAgICAgICAgW2ZvbnRXZWlnaHRdPVwiJ2JvbGQnXCJcbiAgICAgICAgICAgICAgW2JnQ29sb3JdPVwiJyM4RThEODcnXCJcbiAgICAgICAgICAgICAgW2JvcmRlclJhZGl1c109XCInNHB4J1wiXG4gICAgICAgICAgICAgIFt0ZXh0Q29sb3JdPVwiJyNmZmYnXCJcbiAgICAgICAgICAgICAgW3BkXT1cIic5Ljc5cHggMzcuMjhweCdcIlxuICAgICAgICAgICAgICBbdGV4dF09XCInRGVsZXRlJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3ZlcmJlbmEtYnV0dG9uPiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHt7XG4gICAgICAgICAgICAgICAgdmRjdi5oYXNDdXJyZW50SXRlbSgpID8gJ2ZsZXgtMScgOiAnJ1xuICAgICAgICAgICAgICB9fSBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgZ2FwLTVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0b3ItdGV4dFwiPnt7IGNhcmREYXRhKCkubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuPlxuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsb2FkTW9yZSgpXCIgY2xhc3M9XCJsb2FkLW1vcmUgdmlldy1saW5rcyB0ZXh0LVsjMzQ3OUU5XSB1bmRlcmxpbmVcIj5cbiAgICAgICAgICAgICAgICBMb2FkIG1vcmVcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXctZm9vdGVyPlxuICAgICAgPC92ZXJiZW4tY2FyZC1kYXRhLXZpZXc+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjb2x1bW4tY29udGVudD5cbiAgICAgIDxsaWItZGF0YS1jb2x1bW5zIFtjb2x1bW5zXT1cImNvbmZpZy5jb2x1bW5zXCIgKGNvbHVtbnNVcGRhdGVkKT1cIm9uQ29sdW1uc1VwZGF0ZWQoJGV2ZW50KVwiPjwvbGliLWRhdGEtY29sdW1ucz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGZpbHRlci1jb250ZW50PlxuICAgICAgPHZlcmJlbi10YWJsZS1maWx0ZXIgW2JvcmRlcl09XCInMXB4IHNvbGlkIHJnYmEoMjEyLCAxNjAsIDcsIDEpJ1wiIGJvcmRlclJhZGl1cz1cIjEwcHhcIlxuICAgICAgICBib3hTaGFkb3c9XCIycHggMnB4IDJweCAwcHggc2lsdmVyXCIgYmdDb2xvcj1cIndoaXRlXCIgd2lkdGg9XCI0MjBweFwiIHRleHRDb2xvcj1cImJsYWNrXCIgcGQ9XCIxcmVtXCJcbiAgICAgICAgcHJpbWFyeUNvbG9yPVwiI0ZGRTY4MVwiIHNlY29uZGFyeUNvbG9yPVwiIzM0NzlFOVwiIHRlcnRpYXJ5Q29sb3I9XCIjNDA0MDQwXCIgW2ZpbHRlck9wdGlvbnNdPVwiZmlsdGVyQXJyYXlcIlxuICAgICAgICBbbWF4RmlsdGVyTGVuZ3RoXT1cIjNcIj48L3ZlcmJlbi10YWJsZS1maWx0ZXI+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzb3J0LWNvbnRlbnQ+XG4gICAgICA8bGliLWRhdGEtc29ydCBbY29sdW1uc109XCJjb25maWcuY29sdW1uc1wiIFtkYXRhXT1cImRhdGEoKVwiIChzb3J0QXBwbGllZCk9XCJvblNvcnRVcGRhdGVkKCRldmVudClcIj48L2xpYi1kYXRhLXNvcnQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBleHBvcnQtY29udGVudD5cbiAgICAgIDxsaWItZGF0YS1leHBvcnQgW2RhdGFdPVwiZGF0YSgpXCIgKGV4cG9ydERhdGFFdmVudCk9XCJoYW5kbGVFeHBvcnQoJGV2ZW50KVwiPlxuICAgICAgPC9saWItZGF0YS1leHBvcnQ+XG4gICAgPC9kaXY+XG4gIDwvdmVyYmVuLWRhdGEtdmlldz5cblxuICA8ZGl2ICpuZ0lmPVwidmR2LmlzVGFibGVWaWV3XCIgY2xhc3M9XCJmbGV4IGdhcC0yIGp1c3RpZnktYmV0d2VlblwiPlxuICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWxvZy1idXR0b24tY29udGFpbmVyIGZsZXgganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICA8IS0tIDx2ZXJiZW5hLWJ1dHRvblxuICAgICAgICBbZm9udFdlaWdodF09XCInYm9sZCdcIlxuICAgICAgICBbYmdDb2xvcl09XCInIzhFOEQ4NydcIlxuICAgICAgICBbYm9yZGVyUmFkaXVzXT1cIic0cHgnXCJcbiAgICAgICAgW3RleHRDb2xvcl09XCInI2ZmZidcIlxuICAgICAgICBbcGRdPVwiJzkuNzlweCAzNy4yOHB4J1wiXG4gICAgICAgIFt0ZXh0XT1cIidEZWxldGUnXCJcbiAgICAgID5cbiAgICAgIDwvdmVyYmVuYS1idXR0b24+IC0tPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktZW5kIGl0ZW1zLWNlbnRlciBnYXAtNVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJwYWdpbmF0b3ItdGV4dFwiPnt7IGNhcmREYXRhKCkubGVuZ3RoIH19IHJlY29yZHMgbG9hZGVkPC9zcGFuPlxuICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibG9hZE1vcmUoKVwiIGNsYXNzPVwibG9hZC1tb3JlIHZpZXctbGlua3MgdGV4dC1bIzM0NzlFOV0gdW5kZXJsaW5lXCI+XG4gICAgICAgIExvYWQgbW9yZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|