@sunbird-cb/tree-hierarchy 0.0.1-cbrelease-4.8.29 → 0.0.2-ang-17-20
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/fesm2022/sunbird-cb-tree-hierarchy.mjs +770 -200
- package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -1
- package/index.d.ts +1052 -3
- package/index.d.ts.map +1 -0
- package/package.json +14 -16
- package/sunbird-cb-tree-hierarchy-0.0.2-ang-17-20.tgz +0 -0
- package/esm2022/lib/components/action-bar/action-bar.component.mjs +0 -41
- package/esm2022/lib/components/approval/approval.component.mjs +0 -19
- package/esm2022/lib/components/approve-view/approve-view.component.mjs +0 -64
- package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +0 -44
- package/esm2022/lib/components/category-edit/category-edit-module/category-edit-module.component.mjs +0 -55
- package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +0 -74
- package/esm2022/lib/components/connector/connector.component.mjs +0 -59
- package/esm2022/lib/components/create-categories/create-categories.component.mjs +0 -83
- package/esm2022/lib/components/create-term/create-term.component.mjs +0 -847
- package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +0 -824
- package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +0 -223
- package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +0 -64
- package/esm2022/lib/components/term-card/term-card.component.mjs +0 -340
- package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +0 -354
- package/esm2022/lib/components/tree-view/tree-view.component.mjs +0 -826
- package/esm2022/lib/constants/app-constant.mjs +0 -40
- package/esm2022/lib/constants/data.mjs +0 -6972
- package/esm2022/lib/containers/config-framework/config-framework.component.mjs +0 -92
- package/esm2022/lib/containers/dashboard/dashboard.component.mjs +0 -14
- package/esm2022/lib/labels/strings.mjs +0 -40
- package/esm2022/lib/models/approval.model.mjs +0 -2
- package/esm2022/lib/models/connection-type.model.mjs +0 -2
- package/esm2022/lib/models/connection.model.mjs +0 -2
- package/esm2022/lib/models/framework.model.mjs +0 -2
- package/esm2022/lib/models/variable-type.model.mjs +0 -2
- package/esm2022/lib/pipes/order-by.pipe.mjs +0 -35
- package/esm2022/lib/services/approval.service.mjs +0 -47
- package/esm2022/lib/services/connection.service.mjs +0 -3
- package/esm2022/lib/services/connector.service.mjs +0 -286
- package/esm2022/lib/services/framework.service.mjs +0 -525
- package/esm2022/lib/services/local-connection.service.mjs +0 -75
- package/esm2022/lib/services/odcs.service.mjs +0 -23
- package/esm2022/lib/tree-hierarchy-routing.module.mjs +0 -43
- package/esm2022/lib/tree-hierarchy.component.mjs +0 -24
- package/esm2022/lib/tree-hierarchy.module.mjs +0 -145
- package/esm2022/lib/tree-hierarchy.service.mjs +0 -57
- package/esm2022/material.module.mjs +0 -199
- package/esm2022/public-api.mjs +0 -9
- package/esm2022/sunbird-cb-tree-hierarchy.mjs +0 -2
- package/lib/components/action-bar/action-bar.component.d.ts +0 -17
- package/lib/components/action-bar/action-bar.component.d.ts.map +0 -1
- package/lib/components/approval/approval.component.d.ts +0 -10
- package/lib/components/approval/approval.component.d.ts.map +0 -1
- package/lib/components/approve-view/approve-view.component.d.ts +0 -27
- package/lib/components/approve-view/approve-view.component.d.ts.map +0 -1
- package/lib/components/categories-preview/categories-preview.component.d.ts +0 -14
- package/lib/components/categories-preview/categories-preview.component.d.ts.map +0 -1
- package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts +0 -18
- package/lib/components/category-edit/category-edit-module/category-edit-module.component.d.ts.map +0 -1
- package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +0 -20
- package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +0 -1
- package/lib/components/connector/connector.component.d.ts +0 -23
- package/lib/components/connector/connector.component.d.ts.map +0 -1
- package/lib/components/create-categories/create-categories.component.d.ts +0 -26
- package/lib/components/create-categories/create-categories.component.d.ts.map +0 -1
- package/lib/components/create-term/create-term.component.d.ts +0 -148
- package/lib/components/create-term/create-term.component.d.ts.map +0 -1
- package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +0 -105
- package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +0 -1
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +0 -46
- package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +0 -1
- package/lib/components/pending-approval/pending-approval.component.d.ts +0 -21
- package/lib/components/pending-approval/pending-approval.component.d.ts.map +0 -1
- package/lib/components/term-card/term-card.component.d.ts +0 -53
- package/lib/components/term-card/term-card.component.d.ts.map +0 -1
- package/lib/components/tree-column-view/tree-column-view.component.d.ts +0 -56
- package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +0 -1
- package/lib/components/tree-view/tree-view.component.d.ts +0 -102
- package/lib/components/tree-view/tree-view.component.d.ts.map +0 -1
- package/lib/constants/app-constant.d.ts +0 -44
- package/lib/constants/app-constant.d.ts.map +0 -1
- package/lib/constants/data.d.ts +0 -117
- package/lib/constants/data.d.ts.map +0 -1
- package/lib/containers/config-framework/config-framework.component.d.ts +0 -32
- package/lib/containers/config-framework/config-framework.component.d.ts.map +0 -1
- package/lib/containers/dashboard/dashboard.component.d.ts +0 -9
- package/lib/containers/dashboard/dashboard.component.d.ts.map +0 -1
- package/lib/labels/strings.d.ts +0 -40
- package/lib/labels/strings.d.ts.map +0 -1
- package/lib/models/approval.model.d.ts +0 -11
- package/lib/models/approval.model.d.ts.map +0 -1
- package/lib/models/connection-type.model.d.ts +0 -6
- package/lib/models/connection-type.model.d.ts.map +0 -1
- package/lib/models/connection.model.d.ts +0 -7
- package/lib/models/connection.model.d.ts.map +0 -1
- package/lib/models/framework.model.d.ts +0 -89
- package/lib/models/framework.model.d.ts.map +0 -1
- package/lib/models/variable-type.model.d.ts +0 -46
- package/lib/models/variable-type.model.d.ts.map +0 -1
- package/lib/pipes/order-by.pipe.d.ts +0 -10
- package/lib/pipes/order-by.pipe.d.ts.map +0 -1
- package/lib/services/approval.service.d.ts +0 -21
- package/lib/services/approval.service.d.ts.map +0 -1
- package/lib/services/connection.service.d.ts +0 -4
- package/lib/services/connection.service.d.ts.map +0 -1
- package/lib/services/connector.service.d.ts +0 -18
- package/lib/services/connector.service.d.ts.map +0 -1
- package/lib/services/framework.service.d.ts +0 -89
- package/lib/services/framework.service.d.ts.map +0 -1
- package/lib/services/local-connection.service.d.ts +0 -18
- package/lib/services/local-connection.service.d.ts.map +0 -1
- package/lib/services/odcs.service.d.ts +0 -11
- package/lib/services/odcs.service.d.ts.map +0 -1
- package/lib/tree-hierarchy-routing.module.d.ts +0 -8
- package/lib/tree-hierarchy-routing.module.d.ts.map +0 -1
- package/lib/tree-hierarchy.component.d.ts +0 -13
- package/lib/tree-hierarchy.component.d.ts.map +0 -1
- package/lib/tree-hierarchy.module.d.ts +0 -33
- package/lib/tree-hierarchy.module.d.ts.map +0 -1
- package/lib/tree-hierarchy.service.d.ts +0 -21
- package/lib/tree-hierarchy.service.d.ts.map +0 -1
- package/material.module.d.ts +0 -52
- package/material.module.d.ts.map +0 -1
- package/public-api.d.ts +0 -9
- package/public-api.d.ts.map +0 -1
- package/sunbird-cb-tree-hierarchy.d.ts.map +0 -1
package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs
DELETED
|
@@ -1,824 +0,0 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { Validators } from '@angular/forms';
|
|
3
|
-
import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
|
|
4
|
-
import { labels } from '../../labels/strings';
|
|
5
|
-
import * as appConstants from '../../constants/app-constant';
|
|
6
|
-
import _ from 'lodash';
|
|
7
|
-
import { ConforamtionPopupComponent } from '../conforamtion-popup/conforamtion-popup.component';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/material/legacy-dialog";
|
|
10
|
-
import * as i2 from "../../services/framework.service";
|
|
11
|
-
import * as i3 from "@angular/forms";
|
|
12
|
-
import * as i4 from "@angular/material/legacy-snack-bar";
|
|
13
|
-
import * as i5 from "@angular/common";
|
|
14
|
-
import * as i6 from "@angular/material/core";
|
|
15
|
-
import * as i7 from "@angular/material/button";
|
|
16
|
-
import * as i8 from "@angular/material/legacy-chips";
|
|
17
|
-
import * as i9 from "@angular/material/dialog";
|
|
18
|
-
import * as i10 from "@angular/material/expansion";
|
|
19
|
-
import * as i11 from "@angular/material/icon";
|
|
20
|
-
import * as i12 from "@angular/material/input";
|
|
21
|
-
import * as i13 from "@angular/material/form-field";
|
|
22
|
-
import * as i14 from "@angular/material/menu";
|
|
23
|
-
import * as i15 from "@angular/material/progress-spinner";
|
|
24
|
-
import * as i16 from "@angular/material/radio";
|
|
25
|
-
import * as i17 from "@angular/material/select";
|
|
26
|
-
import * as i18 from "@angular/material/chips";
|
|
27
|
-
export class CreateTermFromFrameworkComponent {
|
|
28
|
-
constructor(dialogRef, data, dialog, frameWorkService, fb, _snackBar) {
|
|
29
|
-
this.dialogRef = dialogRef;
|
|
30
|
-
this.data = data;
|
|
31
|
-
this.dialog = dialog;
|
|
32
|
-
this.frameWorkService = frameWorkService;
|
|
33
|
-
this.fb = fb;
|
|
34
|
-
this._snackBar = _snackBar;
|
|
35
|
-
this.app_strings = labels;
|
|
36
|
-
this.selectedTerm = {};
|
|
37
|
-
this.selectedTermArray = [];
|
|
38
|
-
this.isTermExist = false;
|
|
39
|
-
this.disableCreate = false;
|
|
40
|
-
this.disableMultiCreate = false;
|
|
41
|
-
this.disableUpdate = false;
|
|
42
|
-
this.kcmList = new Map();
|
|
43
|
-
this.allCompetency = [];
|
|
44
|
-
this.allCompetencyTheme = [];
|
|
45
|
-
this.filteredallCompetencyTheme = [];
|
|
46
|
-
this.allCompetencySubtheme = [];
|
|
47
|
-
this.filteredallCompetencySubTheme = [];
|
|
48
|
-
}
|
|
49
|
-
ngOnInit() {
|
|
50
|
-
this.environment = this.frameWorkService.getEnviroment();
|
|
51
|
-
this.getComptencyData();
|
|
52
|
-
this.kcmConfigData = this.frameWorkService.getConfigByFrameWorkId(this.environment.kcmFrameworkName);
|
|
53
|
-
this.competencyForm = this.fb.group({
|
|
54
|
-
compArea: ['', Validators.required],
|
|
55
|
-
compThemeFields: this.fb.array([this.createCompThemeFields()])
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
getComptencyData() {
|
|
59
|
-
this.frameWorkService.getFrameworkRead(this.environment.kcmFrameworkName).subscribe((data) => {
|
|
60
|
-
if (data.categories) {
|
|
61
|
-
this.formateData(data, this.environment.kcmFrameworkName);
|
|
62
|
-
this.selectedCardCompThemeData = '';
|
|
63
|
-
if (this.data && this.data.selectedParentTerms) {
|
|
64
|
-
this.data.selectedParentTerms.forEach((ele) => {
|
|
65
|
-
if (ele.category === "competency") {
|
|
66
|
-
this.selectedCardCompThemeData = ele;
|
|
67
|
-
let option = this.selectedCardCompThemeData.additionalProperties.competencyArea;
|
|
68
|
-
this.onSelectionArea(option);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}, ((_err) => {
|
|
74
|
-
this._snackBar.open(`KCM Framework read failed.`);
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
formateData(response, frameworkId) {
|
|
78
|
-
(response.categories).forEach((a) => {
|
|
79
|
-
if (a.code !== undefined) {
|
|
80
|
-
this.kcmList.set(a.code, {
|
|
81
|
-
code: a.code,
|
|
82
|
-
identifier: a.identifier,
|
|
83
|
-
index: a.index,
|
|
84
|
-
name: a.name,
|
|
85
|
-
description: a.description,
|
|
86
|
-
config: this.frameWorkService.getConfigOfCategoryConfigByFrameWorkId(a.code, frameworkId),
|
|
87
|
-
children: (a.terms || []).map((c) => {
|
|
88
|
-
const associations = c.associations || [];
|
|
89
|
-
if (associations.length > 0) {
|
|
90
|
-
Object.assign(c, { children: associations });
|
|
91
|
-
}
|
|
92
|
-
return c;
|
|
93
|
-
})
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
this.kcmList.forEach((a) => {
|
|
98
|
-
if (a.code === _.get(this.kcmConfigData, 'config[0].category')) {
|
|
99
|
-
this.competencyArea = a;
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
createCompThemeFields() {
|
|
104
|
-
return this.fb.group({
|
|
105
|
-
competencyTheme: ['', [Validators.required]],
|
|
106
|
-
competencySubTheme: ['', [Validators.required]]
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
getCreateName(data) {
|
|
110
|
-
let popUpCategory = data.cardColInfo ? data.cardColInfo.name : data.columnInfo.name;
|
|
111
|
-
switch (popUpCategory) {
|
|
112
|
-
case 'Designation':
|
|
113
|
-
return `Create Competency Mapping`;
|
|
114
|
-
case 'Sub Theme':
|
|
115
|
-
if (data.openMode === 'view') {
|
|
116
|
-
return `View Competency ${popUpCategory}`;
|
|
117
|
-
}
|
|
118
|
-
return `Add Competency ${popUpCategory}`;
|
|
119
|
-
case 'Competency':
|
|
120
|
-
if (data.openMode === 'edit') {
|
|
121
|
-
return `Edit Competency Theme`;
|
|
122
|
-
}
|
|
123
|
-
else if (data.openMode === 'view') {
|
|
124
|
-
return `View Competency Theme`;
|
|
125
|
-
}
|
|
126
|
-
return `Create Competency Mapping`;
|
|
127
|
-
default: return '';
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
clearSelectedThemes(option) {
|
|
131
|
-
if (this.isThemeSelected) {
|
|
132
|
-
this.openConforamtionPopup(option);
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
this.onSelectionArea(option);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
get isThemeSelected() {
|
|
139
|
-
let hasValue = false;
|
|
140
|
-
if (this.competencyForm) {
|
|
141
|
-
const compThemeFields = this.competencyForm.get('compThemeFields');
|
|
142
|
-
if (compThemeFields) {
|
|
143
|
-
compThemeFields.controls.forEach((element) => {
|
|
144
|
-
if (element.get('competencyTheme')?.value || element.get('competencySubTheme')?.value) {
|
|
145
|
-
hasValue = true;
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return hasValue;
|
|
151
|
-
}
|
|
152
|
-
openConforamtionPopup(option) {
|
|
153
|
-
const dialogData = {
|
|
154
|
-
dialogType: 'warning',
|
|
155
|
-
descriptions: [
|
|
156
|
-
{
|
|
157
|
-
header: 'Are you sure you want to alter the competency area?',
|
|
158
|
-
headerClass: 'flex items-center justify-center text-blue textBold',
|
|
159
|
-
messages: [
|
|
160
|
-
{
|
|
161
|
-
msgClass: '',
|
|
162
|
-
msg: `This action will result in the loss of your currently added data`,
|
|
163
|
-
},
|
|
164
|
-
],
|
|
165
|
-
},
|
|
166
|
-
],
|
|
167
|
-
footerClass: 'items-center justify-center',
|
|
168
|
-
buttons: [
|
|
169
|
-
{
|
|
170
|
-
btnText: 'Cancel',
|
|
171
|
-
btnClass: 'btn-outline',
|
|
172
|
-
response: false,
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
btnText: 'Confirm',
|
|
176
|
-
btnClass: 'btn-full-success',
|
|
177
|
-
response: true,
|
|
178
|
-
},
|
|
179
|
-
],
|
|
180
|
-
};
|
|
181
|
-
const dialogRef = this.dialog.open(ConforamtionPopupComponent, {
|
|
182
|
-
data: dialogData,
|
|
183
|
-
autoFocus: false,
|
|
184
|
-
width: '600px',
|
|
185
|
-
maxWidth: '80vw',
|
|
186
|
-
maxHeight: '90vh',
|
|
187
|
-
disableClose: true,
|
|
188
|
-
});
|
|
189
|
-
dialogRef.afterClosed().subscribe((res) => {
|
|
190
|
-
if (res) {
|
|
191
|
-
this.onSelectionArea(option);
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
const compAreaControl = this.competencyForm.get('compArea');
|
|
195
|
-
if (compAreaControl) {
|
|
196
|
-
compAreaControl.setValue(this.seletedCompetencyArea);
|
|
197
|
-
compAreaControl.updateValueAndValidity();
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
onSelectionArea(option) {
|
|
203
|
-
this.competencyForm.reset();
|
|
204
|
-
while (this.compThemeFields.length !== 0) {
|
|
205
|
-
this.compThemeFields.removeAt(0);
|
|
206
|
-
}
|
|
207
|
-
this.compThemeFields.push(this.createCompThemeFields());
|
|
208
|
-
if ('theme' === this.kcmConfigData.config[1].category) {
|
|
209
|
-
this.seletedCompetencyArea = option;
|
|
210
|
-
const compAreaControl = this.competencyForm.get('compArea');
|
|
211
|
-
if (compAreaControl) {
|
|
212
|
-
compAreaControl.patchValue(option);
|
|
213
|
-
compAreaControl.updateValueAndValidity();
|
|
214
|
-
}
|
|
215
|
-
this.filteredallCompetencyTheme = [];
|
|
216
|
-
this.allCompetencyTheme = [];
|
|
217
|
-
if (option && option.children && option.children.length) {
|
|
218
|
-
let themeValue = this.kcmList.get(this.kcmConfigData.config[1].category);
|
|
219
|
-
option.children.forEach((ele) => {
|
|
220
|
-
if (ele.category === 'theme') {
|
|
221
|
-
let result = themeValue.children.findIndex((themeData) => {
|
|
222
|
-
if (ele.refId === themeData.refId) {
|
|
223
|
-
return themeData.children && themeData.children.length;
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
if (result >= 0) {
|
|
227
|
-
this.allCompetencyTheme.push(ele);
|
|
228
|
-
this.filteredallCompetencyTheme.push(ele);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
if (this.competencyArea && this.competencyArea.children) {
|
|
235
|
-
this.competencyArea.children.forEach((element) => {
|
|
236
|
-
if (element.code === option.code) {
|
|
237
|
-
this.seletedCompetencyArea = option;
|
|
238
|
-
if (element.children && element.children.length) {
|
|
239
|
-
element.children.forEach((ele) => {
|
|
240
|
-
if (ele.category === 'theme') {
|
|
241
|
-
this.allCompetencyTheme.push(ele);
|
|
242
|
-
this.filteredallCompetencyTheme.push(ele);
|
|
243
|
-
if (this.selectedCardCompThemeData.refId.toLowerCase() === ele.refId.toLowerCase()) {
|
|
244
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
245
|
-
formArray.at(0).get('competencyTheme').patchValue(ele);
|
|
246
|
-
formArray.at(0).get('competencyTheme').updateValueAndValidity();
|
|
247
|
-
const compAreaControl = this.competencyForm.get('compArea');
|
|
248
|
-
if (compAreaControl) {
|
|
249
|
-
compAreaControl.patchValue(option);
|
|
250
|
-
compAreaControl.updateValueAndValidity();
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
addCompetencyTheme() {
|
|
263
|
-
if (this.data.mode === 'multi-create') {
|
|
264
|
-
this.compThemeFields.insert(0, this.createCompThemeFields());
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
removeCompFields(index) {
|
|
268
|
-
if (this.data.mode === 'multi-create') {
|
|
269
|
-
this.compThemeFields.removeAt(index);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
OnThemeSelection(event, _indexValue, optionData) {
|
|
273
|
-
const selectedTheme = event.source.value;
|
|
274
|
-
this.kcmList.forEach((ele) => {
|
|
275
|
-
if (selectedTheme.category === ele.code) {
|
|
276
|
-
if (ele.children && ele.children.length) {
|
|
277
|
-
ele.children.forEach((themeChild) => {
|
|
278
|
-
if (themeChild.identifier === selectedTheme.identifier) {
|
|
279
|
-
if (themeChild.children && themeChild.children.length) {
|
|
280
|
-
optionData['children'] = themeChild.children;
|
|
281
|
-
this.filteredallCompetencySubTheme = themeChild.children;
|
|
282
|
-
let matchedData = [];
|
|
283
|
-
if (this.data.childrenData && this.data.childrenData.category === "subtheme") {
|
|
284
|
-
matchedData = _.intersectionBy(themeChild.children, [this.data.childrenData], 'refId');
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
matchedData = _.intersectionBy(themeChild.children, this.selectedCardCompThemeData.children, 'refId');
|
|
288
|
-
}
|
|
289
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
290
|
-
const competencySubThemeControl = formArray.at(_indexValue).get('competencySubTheme');
|
|
291
|
-
if (competencySubThemeControl) {
|
|
292
|
-
competencySubThemeControl.patchValue(matchedData);
|
|
293
|
-
competencySubThemeControl.updateValueAndValidity();
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
onTermRemove(termData, indexValue) {
|
|
303
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
304
|
-
const compThemeControl = formArray.at(indexValue).get('competencySubTheme');
|
|
305
|
-
if (compThemeControl) {
|
|
306
|
-
const themes = compThemeControl.value;
|
|
307
|
-
if (themes) {
|
|
308
|
-
const index = themes.indexOf(termData);
|
|
309
|
-
if (index >= 0) {
|
|
310
|
-
themes.splice(index, 1);
|
|
311
|
-
compThemeControl.setValue(themes);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
OnSubThemeSelection(_event, _indexValue, _option) {
|
|
317
|
-
}
|
|
318
|
-
async multiCreate(form, _data) {
|
|
319
|
-
this.disableMultiCreate = true;
|
|
320
|
-
let counterSubTheme = 0;
|
|
321
|
-
let parentCategory = {};
|
|
322
|
-
let createdTerms = [];
|
|
323
|
-
let createdSubTheme = [];
|
|
324
|
-
if (form.valid) {
|
|
325
|
-
const themeFields = form && form.value && form.value.compThemeFields;
|
|
326
|
-
if (themeFields && themeFields.length) {
|
|
327
|
-
let localCompArea = { ...this.seletedCompetencyArea };
|
|
328
|
-
if (localCompArea.children && localCompArea.children.length) {
|
|
329
|
-
delete localCompArea.children;
|
|
330
|
-
}
|
|
331
|
-
if (localCompArea.associations && localCompArea.associations.length) {
|
|
332
|
-
delete localCompArea.associations;
|
|
333
|
-
}
|
|
334
|
-
for (let [index, objVal] of themeFields.entries()) {
|
|
335
|
-
parentCategory = {};
|
|
336
|
-
if (objVal['competencyTheme']) {
|
|
337
|
-
createdTerms = [];
|
|
338
|
-
let value = objVal['competencyTheme'];
|
|
339
|
-
const term = {
|
|
340
|
-
code: this.frameWorkService.getUuid(),
|
|
341
|
-
name: value.name,
|
|
342
|
-
description: value.description,
|
|
343
|
-
category: this.data.columnInfo.code,
|
|
344
|
-
status: appConstants.LIVE,
|
|
345
|
-
refId: value.refId || '',
|
|
346
|
-
refType: value.refType || '',
|
|
347
|
-
parents: [
|
|
348
|
-
{ identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
|
|
349
|
-
],
|
|
350
|
-
additionalProperties: {
|
|
351
|
-
competencyArea: localCompArea,
|
|
352
|
-
timeStamp: new Date().getTime()
|
|
353
|
-
}
|
|
354
|
-
};
|
|
355
|
-
const requestBody = {
|
|
356
|
-
request: {
|
|
357
|
-
term: term
|
|
358
|
-
}
|
|
359
|
-
};
|
|
360
|
-
await this.frameWorkService.createTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody).toPromise().then(async (res) => {
|
|
361
|
-
requestBody.request.term['identifier'] = res.result.node_id[0];
|
|
362
|
-
this.frameWorkService.selectionList.delete('competency');
|
|
363
|
-
parentCategory = requestBody.request.term;
|
|
364
|
-
createdTerms.push(requestBody.request.term);
|
|
365
|
-
const parentColumn = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
|
|
366
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumn.code);
|
|
367
|
-
await this.updateTermAssociationsMultiV2(createdTerms, parentCol);
|
|
368
|
-
let data = {
|
|
369
|
-
"selected": false,
|
|
370
|
-
"category": parentColumn.code,
|
|
371
|
-
"cardSubType": "minimal",
|
|
372
|
-
"isViewOnly": false,
|
|
373
|
-
"index": parentColumn.index,
|
|
374
|
-
"columnInfo": this.data.cardColInfo
|
|
375
|
-
};
|
|
376
|
-
const responseData12 = {
|
|
377
|
-
res: { term: [this.selectedTerm], created: true, multi: true },
|
|
378
|
-
index: this.data.columnInfo.index,
|
|
379
|
-
data: data,
|
|
380
|
-
type: 'multi-create'
|
|
381
|
-
};
|
|
382
|
-
this.frameWorkService.updateAfterAddOrEditSubject(responseData12);
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
if (objVal['competencySubTheme']) {
|
|
386
|
-
this.frameWorkService.selectionList.set(this.data.columnInfo.code, parentCategory);
|
|
387
|
-
let value = objVal['competencySubTheme'];
|
|
388
|
-
if (value && value.length) {
|
|
389
|
-
counterSubTheme = 0;
|
|
390
|
-
createdSubTheme = [];
|
|
391
|
-
for (let ele of value) {
|
|
392
|
-
const term = {
|
|
393
|
-
code: this.frameWorkService.getUuid(),
|
|
394
|
-
name: ele.name,
|
|
395
|
-
description: ele.description,
|
|
396
|
-
category: this.data.nextColInfo.code,
|
|
397
|
-
status: appConstants.LIVE,
|
|
398
|
-
refId: ele.refId || '',
|
|
399
|
-
refType: ele.refType || '',
|
|
400
|
-
parents: [
|
|
401
|
-
{ identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.nextColInfo.code}` }
|
|
402
|
-
],
|
|
403
|
-
additionalProperties: {
|
|
404
|
-
timeStamp: new Date().getTime()
|
|
405
|
-
}
|
|
406
|
-
};
|
|
407
|
-
const requestBody = {
|
|
408
|
-
request: {
|
|
409
|
-
term: term
|
|
410
|
-
}
|
|
411
|
-
};
|
|
412
|
-
let responseData = await this.crateTerm(this.data.frameworkId, this.data.nextColInfo.code, requestBody);
|
|
413
|
-
requestBody.request.term['identifier'] = responseData.result.node_id[0];
|
|
414
|
-
createdSubTheme.push(requestBody.request.term);
|
|
415
|
-
counterSubTheme++;
|
|
416
|
-
if ((counterSubTheme === objVal['competencySubTheme'].length)) {
|
|
417
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.nextColInfo.code);
|
|
418
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
419
|
-
await this.updateTermAssociationsMultiV2(createdSubTheme, parentCol, index, themeFields.length);
|
|
420
|
-
if (index === themeFields.length - 1) {
|
|
421
|
-
this.frameWorkService.selectionList.delete('competency');
|
|
422
|
-
this.dialogClose({ term: this.selectedTermArray, created: true, multi: false, callUpdate: false });
|
|
423
|
-
this.disableMultiCreate = false;
|
|
424
|
-
this._snackBar.open(`Competency Mapping created successfully.`);
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
async crateTerm(frameworkId, colCode, requestBody) {
|
|
435
|
-
return new Promise(async (resolve) => {
|
|
436
|
-
this.frameWorkService.createTerm(frameworkId, colCode, requestBody).subscribe((res) => {
|
|
437
|
-
resolve(res);
|
|
438
|
-
}, ((_err) => {
|
|
439
|
-
this._snackBar.open(`Create Term failed.`);
|
|
440
|
-
}));
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
async updateTermAssociationsMultiV2(createdTerms, parentSelectedTerm, _runningIndex, _themFieldsLength) {
|
|
444
|
-
if (createdTerms && createdTerms.length) {
|
|
445
|
-
this.selectedTermArray = [];
|
|
446
|
-
let createdTermsIdentifiers = [];
|
|
447
|
-
this.selectedTermArray = createdTerms;
|
|
448
|
-
this.selectedTerm = createdTerms[createdTerms.length - 1];
|
|
449
|
-
for (let createdTerm of createdTerms) {
|
|
450
|
-
createdTermsIdentifiers.push({ identifier: createdTerm.identifier });
|
|
451
|
-
}
|
|
452
|
-
let associations = [];
|
|
453
|
-
let counter = 0;
|
|
454
|
-
if (!parentSelectedTerm) {
|
|
455
|
-
for (const [value] of this.frameWorkService.selectionList) {
|
|
456
|
-
const parent = value;
|
|
457
|
-
counter++;
|
|
458
|
-
associations = parent.children ? parent.children.map((c) => {
|
|
459
|
-
return c.identifier ? { identifier: c.identifier } : null;
|
|
460
|
-
}) : [];
|
|
461
|
-
associations = [...associations, ...createdTermsIdentifiers];
|
|
462
|
-
this.isTermExist = false;
|
|
463
|
-
const reguestBody = {
|
|
464
|
-
request: {
|
|
465
|
-
term: {
|
|
466
|
-
...(associations && associations.length) ? { associations: [...associations] } : null,
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
};
|
|
470
|
-
await this.callUpdateAssociationsV2(counter, parent, reguestBody);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
else {
|
|
474
|
-
const parent = parentSelectedTerm;
|
|
475
|
-
associations = parent.children ? parent.children.map((c) => {
|
|
476
|
-
return c.identifier ? { identifier: c.identifier } : null;
|
|
477
|
-
}) : [];
|
|
478
|
-
associations = [...associations, ...createdTermsIdentifiers];
|
|
479
|
-
this.isTermExist = false;
|
|
480
|
-
const reguestBody = {
|
|
481
|
-
request: {
|
|
482
|
-
term: {
|
|
483
|
-
...(associations && associations.length) ? { associations: [...associations] } : null,
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
};
|
|
487
|
-
return await this.callUpdateAssociationsV2(counter, parent, reguestBody);
|
|
488
|
-
this.disableMultiCreate = false;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
async updateTermAssociationsMulti(createdTerms) {
|
|
493
|
-
if (createdTerms && createdTerms.length) {
|
|
494
|
-
for (let createdTerm of createdTerms) {
|
|
495
|
-
this.selectedTerm = createdTerm;
|
|
496
|
-
let associations = [];
|
|
497
|
-
let temp;
|
|
498
|
-
let counter = 0;
|
|
499
|
-
for (const [value] of this.frameWorkService.selectionList) {
|
|
500
|
-
const parent = value;
|
|
501
|
-
counter++;
|
|
502
|
-
temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
|
|
503
|
-
associations = parent.children ? parent.children.map((c) => {
|
|
504
|
-
return c.identifier ? { identifier: c.identifier } : null;
|
|
505
|
-
}) : [];
|
|
506
|
-
if (temp && temp.length) {
|
|
507
|
-
this.isTermExist = true;
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
else {
|
|
511
|
-
associations.push({ identifier: this.selectedTerm.identifier });
|
|
512
|
-
this.isTermExist = false;
|
|
513
|
-
const reguestBody = {
|
|
514
|
-
request: {
|
|
515
|
-
term: {
|
|
516
|
-
...(associations && associations.length) ? { associations: [...associations] } : null,
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
};
|
|
520
|
-
await this.callUpdateAssociations(counter, parent, reguestBody);
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
async callUpdateAssociationsV2(counter, parent, reguestBody) {
|
|
527
|
-
return new Promise(async (resolve) => {
|
|
528
|
-
this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(async () => {
|
|
529
|
-
parent['children'] = parent && parent.children ? [...parent.children, ...this.selectedTermArray] : this.selectedTermArray;
|
|
530
|
-
let listData = this.frameWorkService.list.get(this.data.columnInfo.code);
|
|
531
|
-
let differenceData = [];
|
|
532
|
-
if (listData && listData.children && listData.children.length) {
|
|
533
|
-
differenceData = _.differenceBy(this.selectedTermArray, listData.children, 'identifier');
|
|
534
|
-
}
|
|
535
|
-
else {
|
|
536
|
-
differenceData = this.selectedTermArray;
|
|
537
|
-
}
|
|
538
|
-
listData['associations'] = listData && listData.associations ? [...listData.associations, ...differenceData] : differenceData;
|
|
539
|
-
listData['children'] = listData && listData.children ? [...listData.children, ...differenceData] : differenceData;
|
|
540
|
-
this.frameWorkService.selectionList.forEach((selectedData) => {
|
|
541
|
-
let listData = this.frameWorkService.list.get(selectedData.category);
|
|
542
|
-
if (listData && listData.children && listData.children.length) {
|
|
543
|
-
this.updateLocalList(listData, parent, this.selectedTermArray);
|
|
544
|
-
}
|
|
545
|
-
});
|
|
546
|
-
if (counter === this.frameWorkService.selectionList.size) {
|
|
547
|
-
this.disableUpdate = false;
|
|
548
|
-
let returnValue = true;
|
|
549
|
-
resolve(true);
|
|
550
|
-
await returnValue;
|
|
551
|
-
}
|
|
552
|
-
else {
|
|
553
|
-
let returnValue = true;
|
|
554
|
-
resolve(true);
|
|
555
|
-
await returnValue;
|
|
556
|
-
}
|
|
557
|
-
}, (_err) => {
|
|
558
|
-
console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
|
|
559
|
-
this._snackBar.open(`Term Association failed.`);
|
|
560
|
-
this.disableMultiCreate = false;
|
|
561
|
-
});
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
async callUpdateAssociations(counter, parent, reguestBody) {
|
|
565
|
-
return new Promise(async (resolve) => {
|
|
566
|
-
this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(async () => {
|
|
567
|
-
if (counter === this.frameWorkService.selectionList.size) {
|
|
568
|
-
const found = parent.children ? parent.children.find((c) => c.identifier === this.selectedTerm.identifier) : false;
|
|
569
|
-
if (!found) {
|
|
570
|
-
parent.children ? parent.children.push(this.selectedTerm) : parent['children'] = [this.selectedTerm];
|
|
571
|
-
}
|
|
572
|
-
this.disableUpdate = false;
|
|
573
|
-
let returnValue = true;
|
|
574
|
-
resolve(true);
|
|
575
|
-
await returnValue;
|
|
576
|
-
}
|
|
577
|
-
else {
|
|
578
|
-
let returnValue = true;
|
|
579
|
-
resolve(true);
|
|
580
|
-
await returnValue;
|
|
581
|
-
}
|
|
582
|
-
}, (_err) => {
|
|
583
|
-
console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
|
|
584
|
-
});
|
|
585
|
-
});
|
|
586
|
-
}
|
|
587
|
-
updateTermData(form, data) {
|
|
588
|
-
this.disableUpdate = true;
|
|
589
|
-
const formData = {
|
|
590
|
-
...form.value
|
|
591
|
-
};
|
|
592
|
-
const updateData = {
|
|
593
|
-
formData,
|
|
594
|
-
updateTermData: data.childrenData
|
|
595
|
-
};
|
|
596
|
-
this.updateTermAssociations(updateData);
|
|
597
|
-
}
|
|
598
|
-
updateTermAssociations(updateData) {
|
|
599
|
-
let associations = [];
|
|
600
|
-
let temp;
|
|
601
|
-
let counter = 0;
|
|
602
|
-
this.frameWorkService.selectionList.forEach((parent) => {
|
|
603
|
-
counter++;
|
|
604
|
-
temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
|
|
605
|
-
associations = parent.children ? parent.children.map((c) => {
|
|
606
|
-
return c.identifier ? { identifier: c.identifier } : null;
|
|
607
|
-
}) : [];
|
|
608
|
-
if (temp && temp.length) {
|
|
609
|
-
this.isTermExist = true;
|
|
610
|
-
return;
|
|
611
|
-
}
|
|
612
|
-
else {
|
|
613
|
-
if (this.selectedTerm && this.selectedTerm.identifier) {
|
|
614
|
-
associations.push({ identifier: this.selectedTerm.identifier });
|
|
615
|
-
}
|
|
616
|
-
this.isTermExist = false;
|
|
617
|
-
const reguestBody = {
|
|
618
|
-
request: {
|
|
619
|
-
term: {
|
|
620
|
-
...(updateData && updateData.formData && updateData.updateTermData.code === parent.code) ? { ...updateData.formData } : null,
|
|
621
|
-
...(associations && associations.length) ? { associations: [...associations] } : null,
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
};
|
|
625
|
-
this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(() => {
|
|
626
|
-
if (counter === this.frameWorkService.selectionList.size) {
|
|
627
|
-
const value = (this.selectedTerm && this.selectedTerm.identifier) ? this.selectedTerm : (updateData) ? { ...updateData.updateTermData, ...updateData.formData } : {};
|
|
628
|
-
this.disableUpdate = false;
|
|
629
|
-
this.dialogClose({ term: { ...value }, created: true });
|
|
630
|
-
}
|
|
631
|
-
}, (_err) => {
|
|
632
|
-
console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
|
|
633
|
-
this._snackBar.open(`Term Association failed.`);
|
|
634
|
-
this.disableMultiCreate = false;
|
|
635
|
-
});
|
|
636
|
-
}
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
dialogClose(term) {
|
|
640
|
-
this.frameWorkService.publishFramework().subscribe(() => {
|
|
641
|
-
this.disableMultiCreate = false;
|
|
642
|
-
this.dialogRef.close(term);
|
|
643
|
-
}, (_err) => {
|
|
644
|
-
this.disableMultiCreate = false;
|
|
645
|
-
this.dialogRef.close(term);
|
|
646
|
-
this._snackBar.open(`Publish failed.`);
|
|
647
|
-
});
|
|
648
|
-
}
|
|
649
|
-
async multiCreateSubTheme(_form, data) {
|
|
650
|
-
this.disableMultiCreate = true;
|
|
651
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
652
|
-
let selectedFormData = formArray.at(0).get('competencySubTheme').value;
|
|
653
|
-
let previousSubThemeData = data.childrenData.children;
|
|
654
|
-
let newlyAdded = [];
|
|
655
|
-
let removedExisting = [];
|
|
656
|
-
let createdSubTheme = [];
|
|
657
|
-
let counterSubTheme = 0;
|
|
658
|
-
newlyAdded = _.differenceBy(selectedFormData, previousSubThemeData, 'refId');
|
|
659
|
-
removedExisting = _.differenceBy(previousSubThemeData, selectedFormData, 'refId');
|
|
660
|
-
if (newlyAdded && newlyAdded.length) {
|
|
661
|
-
for (let val of newlyAdded) {
|
|
662
|
-
const term = {
|
|
663
|
-
code: this.frameWorkService.getUuid(),
|
|
664
|
-
name: val.name,
|
|
665
|
-
description: val.description,
|
|
666
|
-
category: this.data.columnInfo.code,
|
|
667
|
-
status: appConstants.LIVE,
|
|
668
|
-
refId: val.refId,
|
|
669
|
-
refType: val.refType,
|
|
670
|
-
parents: [
|
|
671
|
-
{ identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
|
|
672
|
-
],
|
|
673
|
-
additionalProperties: {
|
|
674
|
-
timeStamp: new Date().getTime()
|
|
675
|
-
}
|
|
676
|
-
};
|
|
677
|
-
const requestBody = {
|
|
678
|
-
request: {
|
|
679
|
-
term: term
|
|
680
|
-
}
|
|
681
|
-
};
|
|
682
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
|
|
683
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
684
|
-
let responseData = await this.crateTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody);
|
|
685
|
-
requestBody.request.term['identifier'] = responseData.result.node_id[0];
|
|
686
|
-
createdSubTheme.push(requestBody.request.term);
|
|
687
|
-
counterSubTheme++;
|
|
688
|
-
if (counterSubTheme === newlyAdded.length) {
|
|
689
|
-
await this.updateTermAssociationsMultiV2(createdSubTheme, parentCol);
|
|
690
|
-
this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parentCol, createdSubTheme, 'create');
|
|
691
|
-
if (!(removedExisting && removedExisting.length)) {
|
|
692
|
-
this.dialogClose({ term: this.selectedTermArray, created: true, multi: true, callUpdate: false });
|
|
693
|
-
this.disableMultiCreate = false;
|
|
694
|
-
this._snackBar.open(`Competency theme updated successfully.`);
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
if (removedExisting && removedExisting.length) {
|
|
700
|
-
let removedTermsCollection = [];
|
|
701
|
-
for (let removedTerm of removedExisting) {
|
|
702
|
-
removedTermsCollection.push(removedTerm.code);
|
|
703
|
-
}
|
|
704
|
-
let subThemeRequest = {
|
|
705
|
-
"request": {
|
|
706
|
-
"contentIds": removedTermsCollection
|
|
707
|
-
}
|
|
708
|
-
};
|
|
709
|
-
await this.frameWorkService.retireMultipleTerm(this.data.frameworkId, this.data.columnInfo.code, subThemeRequest).toPromise().then(async () => {
|
|
710
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
|
|
711
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
712
|
-
const sectionListchildrenList = _.differenceWith(parentCol.children, removedExisting, (a, b) => a.identifier === b.identifier);
|
|
713
|
-
const sectionListAssociationList = _.differenceWith(parentCol.associations, removedExisting, (a, b) => a.identifier === b.identifier);
|
|
714
|
-
parentCol['children'] = sectionListchildrenList;
|
|
715
|
-
parentCol['associations'] = sectionListAssociationList;
|
|
716
|
-
this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parentCol, removedExisting, 'delete');
|
|
717
|
-
this.dialogClose({ term: [], created: true, multi: true, callUpdate: false });
|
|
718
|
-
this.frameWorkService.currentSelection.next({ type: parentColumnConfigData.code, data: parentCol, cardRef: parentCol.cardRef });
|
|
719
|
-
this.disableMultiCreate = false;
|
|
720
|
-
this._snackBar.open(`Competency theme updated successfully.`);
|
|
721
|
-
});
|
|
722
|
-
}
|
|
723
|
-
this.disableMultiCreate = false;
|
|
724
|
-
}
|
|
725
|
-
onDisableTheme(option) {
|
|
726
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
|
|
727
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
728
|
-
let result = -1;
|
|
729
|
-
if (parentCol && parentCol.children && parentCol.children.length) {
|
|
730
|
-
result = parentCol.children.findIndex((ele) => {
|
|
731
|
-
if ((ele.refType === 'theme') && (this.seletedCompetencyArea.code === ele.additionalProperties.competencyArea.code)) {
|
|
732
|
-
return ele.refId === option.refId;
|
|
733
|
-
}
|
|
734
|
-
return false;
|
|
735
|
-
});
|
|
736
|
-
}
|
|
737
|
-
if (result < 0) {
|
|
738
|
-
let formArray = this.competencyForm.get('compThemeFields');
|
|
739
|
-
result = formArray.value.findIndex((formEle) => {
|
|
740
|
-
if (formEle.competencyTheme && formEle.competencyTheme.refId) {
|
|
741
|
-
return formEle.competencyTheme.refId === option.refId;
|
|
742
|
-
}
|
|
743
|
-
return false;
|
|
744
|
-
});
|
|
745
|
-
}
|
|
746
|
-
return result >= 0 ? true : false;
|
|
747
|
-
}
|
|
748
|
-
updateLocalList(item, parent, selectedTermArray, updateType) {
|
|
749
|
-
if (item && item.children && item.children.length) {
|
|
750
|
-
if (updateType === 'delete') {
|
|
751
|
-
item.children.forEach((itmData) => {
|
|
752
|
-
if (itmData.identifier === parent.identifier) {
|
|
753
|
-
const associationList = _.differenceWith(itmData.associations, selectedTermArray, (a, b) => a.identifier === b.identifier);
|
|
754
|
-
const childrenList = _.differenceWith(itmData.children, selectedTermArray, (a, b) => a.identifier === b.identifier);
|
|
755
|
-
itmData['associations'] = associationList;
|
|
756
|
-
itmData['children'] = childrenList;
|
|
757
|
-
}
|
|
758
|
-
if (itmData.children) {
|
|
759
|
-
this.updateLocalList(itmData, parent, selectedTermArray, updateType);
|
|
760
|
-
}
|
|
761
|
-
});
|
|
762
|
-
}
|
|
763
|
-
else {
|
|
764
|
-
item.children.forEach((itmData) => {
|
|
765
|
-
if (itmData.identifier === parent.identifier) {
|
|
766
|
-
let differenceData = [];
|
|
767
|
-
if (itmData && itmData.children && itmData.children.length) {
|
|
768
|
-
differenceData = _.differenceBy(selectedTermArray, itmData.children, 'identifier');
|
|
769
|
-
}
|
|
770
|
-
else {
|
|
771
|
-
differenceData = selectedTermArray;
|
|
772
|
-
}
|
|
773
|
-
itmData['associations'] = itmData && itmData.associations ? [...itmData.associations, ...differenceData] : differenceData;
|
|
774
|
-
itmData['children'] = itmData && itmData.children ? [...itmData.children, ...differenceData] : differenceData;
|
|
775
|
-
}
|
|
776
|
-
if (itmData.children) {
|
|
777
|
-
this.updateLocalList(itmData, parent, selectedTermArray);
|
|
778
|
-
}
|
|
779
|
-
});
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
deleteTheme() {
|
|
784
|
-
this.disableMultiCreate = true;
|
|
785
|
-
const cardData = this.data.childrenData;
|
|
786
|
-
let removedListTerm = [];
|
|
787
|
-
removedListTerm.push(cardData.code);
|
|
788
|
-
let subThemeRequest = {
|
|
789
|
-
"request": {
|
|
790
|
-
"contentIds": removedListTerm
|
|
791
|
-
}
|
|
792
|
-
};
|
|
793
|
-
this.frameWorkService.retireMultipleTerm(this.frameWorkService.frameworkId, cardData.category, subThemeRequest).toPromise().then(async () => {
|
|
794
|
-
let removedExisting = [cardData];
|
|
795
|
-
const parentColumnConfigData = this.frameWorkService.getPreviousCategory(cardData.category);
|
|
796
|
-
let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
|
|
797
|
-
const sectionListchildrenList = _.differenceWith(parentCol.children, removedExisting, (a, b) => a.identifier === b.identifier);
|
|
798
|
-
const sectionListAssociationList = _.differenceWith(parentCol.associations, removedExisting, (a, b) => a.identifier === b.identifier);
|
|
799
|
-
parentCol['children'] = sectionListchildrenList;
|
|
800
|
-
parentCol['associations'] = sectionListAssociationList;
|
|
801
|
-
this.frameWorkService.updateFrameworkList(cardData.category, parentCol, removedExisting, 'delete');
|
|
802
|
-
this.frameWorkService.currentSelection.next({ type: parentColumnConfigData.code, data: parentCol, cardRef: parentCol.cardRef });
|
|
803
|
-
this.dialogClose({});
|
|
804
|
-
this.disableMultiCreate = false;
|
|
805
|
-
this._snackBar.open(`Competency theme deleted successfully.`);
|
|
806
|
-
}, ((_err) => {
|
|
807
|
-
this.disableMultiCreate = false;
|
|
808
|
-
this._snackBar.open(`Competency theme delete failed.`);
|
|
809
|
-
}));
|
|
810
|
-
}
|
|
811
|
-
get compThemeFields() {
|
|
812
|
-
return this.competencyForm.get('compThemeFields');
|
|
813
|
-
}
|
|
814
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermFromFrameworkComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i1.MatLegacyDialog }, { token: i2.FrameworkService }, { token: i3.UntypedFormBuilder }, { token: i4.MatLegacySnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
815
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CreateTermFromFrameworkComponent, selector: "lib-create-term-from-framework", ngImport: i0, template: "\n<div class=\"\">\n <ng-container *ngIf=\"disableMultiCreate\">\n <div class=\"flex flex-col flex-1 w-100 absolute loader-bg items-center pt-5 text-center\">\n <mat-spinner class=\"display-inline-block mb-5\" [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n <!-- <p>{{loaderMsg}}</p> -->\n </div>\n </ng-container>\n <div class=\"dialogNew\">\n <div class=\"flex items-center justify-between\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <button type=\"button\" mat-icon-button i18n-aria-label aria-label=\"action items\"\n [matMenuTriggerFor]=\"cardMenu\" [matMenuTriggerData]=\"{'data':data}\" class=\"action-btn\">\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <ng-container *ngIf=\"term.category !== 'competency'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{frameWorkService.getConfig(term.category).labelName}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"competencyForm\">\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\" aria-label=\"First name labe \">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group class=\"competency-group\" aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" class=\"learning-section\" [ngClass]=\"{'active-btn':item?.code === seletedCompetencyArea?.code}\"\n *ngFor=\"let item of competencyArea?.children\" [value]=\"item\" [checked]=\"item?.code === seletedCompetencyArea?.code\" (change)=\"clearSelectedThemes(item)\">{{item.name}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <div class=\"flex flex-end mb-4\" >\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button type=\"button\" class=\"mat-button flex items-center create-accordion-btn\" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n <!-- {{data.columnInfo.name}} -->\n </button>\n </ng-container>\n </div>\n <mat-accordion formArrayName=\"compThemeFields\">\n <mat-expansion-panel *ngFor=\"let field of competencyForm?.get('compThemeFields')['controls']; let i = index; let isFirst = first\" \n class=\"margin-bottom-l comp-theme-fields\" [formGroupName]=\"i\" [expanded]=\"isFirst\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.name}} \n </mat-panel-title>\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeCompFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </ng-container>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n {{data.openMode !== 'view'? 'Select Competency Theme': 'Competency Theme Name'}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <ng-container >\n <ng-container >\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" [disabled]=\"onDisableTheme(option) || data.openMode ==='view'\" \n (onSelectionChange)=\"OnThemeSelection($event, i, option)\" >{{option.name}}\n <ng-container *ngIf=\"option.refId\">\n <span class=\"ml-2 ref-id\">({{option.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n </ng-container>\n </mat-select>\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n </div>\n \n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n\n {{data.openMode !== 'view'? 'Select Competency Sub-Theme': 'Competency Sub-Theme Name'}}\n \n </label>\n <!-- <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field> -->\n <!-- {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value |json}} -->\n <mat-form-field appearance=\"outline\" class=\"w-full field-height\" >\n <mat-select class=\" placeholder-text\" placeholder=\"Choose the Competency Sub-Theme\"\n formControlName=\"competencySubTheme\" multiple [disabled]=\"data.openMode ==='view'\" panelClass=\"full-width-panel\">\n <!-- [ngClass]=\"{'disbaledSelect':isHideData}\" -->\n <mat-select-trigger >\n <mat-chip-listbox>\n <!-- -->\n \n <mat-chip *ngFor=\"let item of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value\" \n (removed)=\"onTermRemove(item, i)\" [disabled]=\"data.openMode ==='view'\"\n [ngClass]=\"{'sub-theme-disable': data?.openMode ==='view'}\" [removable]=\"data?.openMode ==='view'? false: true\">\n <span >{{ item.name }}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-listbox>\n </mat-select-trigger>\n <!-- {{competencyForm?.get('compThemeFields') |json}} -->\n <!-- <mat-optgroup>\n <mat-form-field floatLabel=\"never\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" (keydown.space)=\"$event.stopPropagation()\"\n formControlName=\"competencySubTheme\" matInput>\n </mat-form-field>\n </mat-optgroup> -->\n <mat-optgroup *ngIf=\"filteredallCompetencySubTheme.length === 0\">\n <div>No results found!</div>\n </mat-optgroup>\n <!-- <mat-option *ngFor=\"let option of requestObjData.preferredProvider\" [value]=\"option.providerName\">{{option.providerName}}</mat-option> -->\n <ng-container *ngFor=\"let option of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.children\">\n <mat-option \n [value]=\"option\" class=\"mat-option-list\">{{option?.name}}\n <ng-container *ngIf=\"option?.refId\">\n <span class=\"ml-2 ref-id\">({{option?.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n \n </mat-select>\n <!-- <mat-error *ngIf=\"requestForm.controls['providerText'].hasError('required')\">\n Please select up to five preferred providers for the request.\n </mat-error> -->\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"competencyForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create' && data.openMode !=='view'\">\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(competencyForm, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.columnInfo?.code === 'subtheme'\">\n <!-- <ng-container *ngIf=\"competencyForm?.get('compThemeFields')['controls'][0]['controls']?.competencySubTheme?.value?.length;else updateBtn\"> -->\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.update}}\n </button>\n <!-- </ng-container> -->\n \n <!-- <ng-template #updateBtn>\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.delete}}\n </button>\n </ng-template> -->\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(competencyForm, data)\"\n [disabled]=\"competencyForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n </ng-container>\n \n </div>\n \n \n <!-- Title of the popup -->\n <ng-template #modalTitle>\n <!-- <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{data.columnInfo.name === 'Theme' ? app_strings.addCompetency : app_strings.createNew}} {{data.columnInfo.name}}</div>\n </ng-container> -->\n <!-- {{data |json}} -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{getCreateName(data)}}</div>\n </ng-container>\n <!-- <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title>View {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data.columnInfo.name}}</div>\n </ng-container>\n </ng-template>\n</div>\n\n\n<mat-menu #cardMenu=\"matMenu\" class=\"menu-sec\">\n <ng-template matMenuContent let-rowData=\"data\" let-cardRef=\"cardRef\">\n <button (click)=\"deleteTheme()\"\n mat-menu-item name=\"channel-analytics-button\" class=\"ws-mat-primary-text\" i18n-aria-label\n aria-label=\"Analytics\">\n <mat-icon>delete</mat-icon>\n <span>Delete</span>\n </button>\n </ng-template>\n</mat-menu>", styles: [".gap-3{gap:1.25rem}.gap-4{gap:1.5rem}.row-divider{width:100%;border-top:1px solid rgba(0,0,0,.08);margin:1rem 0}.defaultForm{padding:16px;display:flex;gap:16px;flex-direction:column}.theme-actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:30px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialog .mat-dialog-title{padding:1em;margin-bottom:0;background:#00000014}.dialog .mat-form-field{padding:0;background:#fff;border-radius:2px}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:15px;margin-top:0;border-top:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix textarea{resize:none}.dialog .mat-form-field-disabled{background:#00000014}.dialog .actions{display:flex;flex-direction:row;justify-content:space-between;padding:0 1em 1em}.dialog .mat-error{padding:0 25px;margin-top:-10px}.dialogNew{padding:1rem}.dialogNew .mat-dialog-title{padding:1em 0;margin-bottom:0}.dialogNew .actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:16px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialogNew .mat-error{margin-top:-10px}.dialogNew .learning-section{padding:10px!important;border:1px solid rgba(0,0,0,.1803921569);border-radius:4px;margin-right:8px}.dialogNew .learning-section.active-btn{border:1px solid #1B4CA1!important}.learning-section.mat-radio-button .mat-radio-container .mat-radio-outer-circle{border-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-inner-circle{background-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#1b4ca1!important}.dialog-title{align-items:center;display:flex}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.mr-5{margin-right:1.5rem}.flex-1{flex:1 1}.margin-remove-bottom{margin-bottom:0}::ng-deep .custom-dialog-container{max-height:90vh}::ng-deep .custom-dialog-container .mat-dialog-container{padding:0;border-radius:0;background:#00000014}@media only screen and (max-width: 1024px){::ng-deep .cdk-overlay-pane{width:40%!important}}@media only screen and (max-width: 992px){::ng-deep .cdk-overlay-pane{width:45%!important}}@media only screen and (max-width: 1024px){.dialog{font-size:12px}.dialog .dialog-title{font-size:24px;height:1em}.dialog button{font-size:12px;line-height:3.5em}.dialog .mat-raised-button{padding:0 3em}}.flex-align{align-items:center;justify-content:flex-start}::ng-deep mat-form-field .mat-form-field-infix .mat-form-field-label,::ng-deep mat-form-field .mat-form-field-infix .mat-select-value{line-height:normal!important}ws-widget-btn-page-back-admin{margin-left:-270px}.max-wid{max-width:400px}::ng-deep .mat-form-field.mat-focused .mat-form-field-label{color:#333232!important}.margin-right-10{margin-right:10px!important}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}::ng-deep .mat-tab-header{margin:0 3rem}.heading{color:#222}.heading.mt-10{margin-top:2.5rem!important}.img-column{flex:100px 0 0}.input-column{flex:auto}.radio-toolbar input[type=radio]{opacity:0;position:fixed;width:0}.radio-toolbar{padding:10px 0}.radio-toolbar label{display:inline-block;padding:7px 21px;font-size:14px;background:#fff 0% 0% no-repeat padding-box;border:1px solid #5F5F5F;border-radius:4px;margin:0 10px 10px 0;color:#5f5f5f;cursor:pointer;transition:all .125s ease-in-out}.radio-toolbar input[type=radio]:checked+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.radio-toolbar input[type=radio]:focus+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.mar{margin-left:30px;min-width:175px}.radio-toolbar label:hover{background:none;border-color:#0074b6;color:#0074b6}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-form-field.full-width{max-width:100%}::ng-deep .mat-form-field.no-pb .mat-form-field-wrapper{padding-bottom:0}.combined-field{width:100%}.w-full-imp{width:100%!important}::ng-deep .full-width-panel{width:100%!important;min-width:300px}::ng-deep .full-width-panel .mat-option{white-space:normal}.btn-success{background-color:#0075b7!important;border-radius:4px;width:240px;box-shadow:none;margin-right:16px}.btn-success.btn-responsive{width:100%}.btn-success:disabled,.btn-success[disabled]{opacity:.6}.btn-danger{height:30px;width:30px}.color-danger{font-size:30px;height:30px;width:30px;color:#e44}::ng-deep .mat-form-field-outline{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline .mat-form-field-outline-start{border:1px solid rgba(112,112,112,.4117647059);border-radius:4px 0 0 4px;min-width:8px;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-gap{border:1px solid currentColor;border-radius:82px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-end{border:1px solid rgba(112,112,112,.4117647059);border-left-style:none;border-radius:0 4px 4px 0}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-start{border-radius:4px 0 0 4px;min-width:8px;border:1px solid currentColor;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:1px;border:1px solid currentColor;border-radius:4px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-end{border-width:1px;border-radius:0 4px 4px 0;border:1px solid currentColor;border-left-style:none}::ng-deep .mat-form-field-disabled .mat-form-field-outline{background:#ebebeb!important}::ng-deep .mat-form-field-infix{padding:0;margin:0;border:none}::ng-deep .mat-form-field-flex{min-height:40px;align-items:center}::ng-deep .mat-form-field-infix{padding:0;margin:8px 0 0;border:none}.form-label{color:#222;font-size:14px;margin-bottom:.5rem;font-weight:700;font-family:Lato}.form-input{font-size:14px;font-weight:400;font-family:Lato}input.mat-input-element{color:#5f5f5f}::ng-deep .mat-radio-group{padding-bottom:1.34375em}::ng-deep .mat-chip-list-wrapper{margin:0!important}::ng-deep .mat-chip{font-weight:400;background:#f1f9ff 0% 0% no-repeat padding-box!important;border-radius:12px!important;color:#0074b6!important}::ng-deep .mat-chip:hover{filter:brightness(90%)}::ng-deep .mat-chip .mat-chip-remove{opacity:1!important;color:#0074b6!important;border-radius:50%}::ng-deeptextarea .mat-input-element{padding:8px 0}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}::ng-deep .mat-checkbox .mat-checkbox-frame{border-radius:4px!important}::ng-deep .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:none!important}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label{font-size:18px;color:#222}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label-active .mat-tab-label-content{color:#0074b6}::ng-deep .mat-tab-label-container .mat-tab-list .mat-ink-bar{height:3px;background-color:#0074b6!important}.form-control{background:#fff 0% 0% no-repeat padding-box;border:1px solid rgba(112,112,112,.4117647059);border-radius:4px;display:block}.form-control::placeholder{color:#bebebe;font-size:14px}.form-control:focus{border:2px solid #0074b6;outline:none}.input-wrapper{flex:1;display:flex;flex-wrap:wrap;flex-direction:column}::ng-deep .mat-checkbox-inner-container{height:23px!important;width:23px!important}.flex-expand{flex:1!important}.heading{font-weight:600;font-family:Montserrat;font-size:1.25rem;display:block;padding:0px 0px 1rem 0}::ng-deep .multiselect-dropdown{margin-bottom:20px}::ng-deep .multiselect-dropdown .dropdown-btn{border:1px solid #ccc!important;width:92%!important}::ng-deep .multiselect-dropdown .dropdown-list .filter-textbox input{width:90%!important}.organisation{color:#212529;font-weight:700;font-size:14px;font-family:Lato}.org-name{height:50px;border:1px solid #e2e2e2;border-radius:5px;background-color:#ebebeb;font-size:14px}.add-designation{height:25px;color:#1b4ca1!important;font-weight:500;font-size:14px;font-family:Lato;cursor:pointer}.add-designation .add-icon{color:#1b4ca1!important;height:24px;width:24px;font-size:24px}.info-icon{width:14px;height:14px;font-size:14px;color:#a7a9ae!important}.themDesignation{max-height:90vh;overflow-y:auto}.designation-panel{margin-bottom:0!important;background-color:#eef1f7!important;border:1px solid #DBE0E9;box-shadow:none!important}.designation-panel .deletDesignation{font-size:18px;width:14px;height:14px;color:#5f6063}.designation-panel .saveDesignaton{color:#fff;height:40px;width:80px;background-color:#1b4ca1;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.designation-footer{padding:1rem;border-top:1px solid #efefef}.cancel{width:93px;height:40px;font-weight:700;font-size:14px;font-family:Lato;border:1px solid #eee;color:#363636}.addBtn{color:#fff!important;height:40px;width:80px;background-color:#1b4ca1!important;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}::ng-deep .mat-option.mat-selected:not(.mat-option-disabled){color:#000000de!important}::ng-deep .theme-igot.day-mode .mat-pseudo-checkbox-checked{background:#0074b6!important}::ng-deep .mat-select-panel .mat-option{line-height:1!important}.comp-theme-fields{background:#eef1f7!important;border:1px solid #DBE0E9!important}.create-accordion-btn{color:#1b4ca1!important;padding:0!important}.create-accordion-btn mat-icon{color:#1b4ca1}.ref-id{font-size:10px}::ng-deep .mat-select-panel{min-width:103%!important;margin-left:32px}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}::ng-deep .mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.8!important;cursor:none;filter:brightness(90%)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.MatOptgroup, selector: "mat-optgroup", inputs: ["disabled"], exportAs: ["matOptgroup"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i8.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i8.MatLegacyChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i9.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i10.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i10.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i10.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i13.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i14.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i14.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i14.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i14.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i15.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i16.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i16.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i17.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i17.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i18.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "role", "id", "aria-label", "aria-description", "value", "removable", "highlighted"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i18.MatChipListbox, selector: "mat-chip-listbox", inputs: ["tabIndex", "multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "directive", type: i18.MatChipRemove, selector: "[matChipRemove]" }] }); }
|
|
816
|
-
}
|
|
817
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermFromFrameworkComponent, decorators: [{
|
|
818
|
-
type: Component,
|
|
819
|
-
args: [{ selector: 'lib-create-term-from-framework', template: "\n<div class=\"\">\n <ng-container *ngIf=\"disableMultiCreate\">\n <div class=\"flex flex-col flex-1 w-100 absolute loader-bg items-center pt-5 text-center\">\n <mat-spinner class=\"display-inline-block mb-5\" [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n <!-- <p>{{loaderMsg}}</p> -->\n </div>\n </ng-container>\n <div class=\"dialogNew\">\n <div class=\"flex items-center justify-between\">\n <ng-container [ngTemplateOutlet]=\"modalTitle\"></ng-container>\n <button type=\"button\" mat-icon-button i18n-aria-label aria-label=\"action items\"\n [matMenuTriggerFor]=\"cardMenu\" [matMenuTriggerData]=\"{'data':data}\" class=\"action-btn\">\n <mat-icon>more_vert</mat-icon>\n </button>\n </div>\n <div class=\"flex gap-4\">\n <ng-container *ngFor=\"let term of data?.selectedParentTerms\">\n <ng-container *ngIf=\"term.category !== 'competency'\">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label\" aria-label=\"First name label\">\n {{frameWorkService.getConfig(term.category).labelName}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <input matInput name=\"name\" id=\"name\" #name placeholder=\"{{app_strings.name}}\"\n [value]=\"term.name\" disabled>\n </mat-form-field>\n </div>\n </ng-container>\n </ng-container>\n </div>\n <div class=\"row-divider\"></div>\n <ng-container *ngIf=\"competencyForm\">\n <form [formGroup]=\"competencyForm\">\n <div class=\"title-text\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\" aria-label=\"First name labe \">\n {{'Select Area'}}\n </label>\n <div class=\"mt-5\">\n <mat-radio-group class=\"competency-group\" aria-label=\"Select an option\" formControlName=\"compArea\">\n <mat-radio-button [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" class=\"learning-section\" [ngClass]=\"{'active-btn':item?.code === seletedCompetencyArea?.code}\"\n *ngFor=\"let item of competencyArea?.children\" [value]=\"item\" [checked]=\"item?.code === seletedCompetencyArea?.code\" (change)=\"clearSelectedThemes(item)\">{{item.name}}</mat-radio-button>\n </mat-radio-group>\n </div>\n </div>\n <ng-container *ngIf=\"data?.mode === 'multi-create'\">\n <div class=\"flex flex-end mb-4\" >\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button type=\"button\" class=\"mat-button flex items-center create-accordion-btn\" *ngIf=\"data.mode === 'multi-create'\" (click)=\"addCompetencyTheme()\">\n <mat-icon class=\"mr-2 mat-icon-custom \">add_circle_outline</mat-icon>\n Add more\n <!-- {{data.columnInfo.name}} -->\n </button>\n </ng-container>\n </div>\n <mat-accordion formArrayName=\"compThemeFields\">\n <mat-expansion-panel *ngFor=\"let field of competencyForm?.get('compThemeFields')['controls']; let i = index; let isFirst = first\" \n class=\"margin-bottom-l comp-theme-fields\" [formGroupName]=\"i\" [expanded]=\"isFirst\"> \n <mat-expansion-panel-header>\n <mat-panel-title>\n {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.name}} \n </mat-panel-title>\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-button type=\"button\" *ngIf=\"data.mode === 'multi-create'\"\n (click)=\"removeCompFields(i)\">\n <mat-icon class=\"mat-icon-custom \">delete</mat-icon>\n </button>\n </ng-container>\n </mat-expansion-panel-header>\n <div class=\"input-column\">\n <div class=\"input-wrapper margin-top-s\">\n <div class=\"flex gap-4 \">\n <div class=\"flex-1 flex-col\">\n <label for=\"name\" class=\"margin-remove-bottom form-label required\"\n aria-label=\"First name label\">\n {{data.openMode !== 'view'? 'Select Competency Theme': 'Competency Theme Name'}}\n </label>\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select [disabled]=\"data?.columnInfo?.code === 'subtheme' || data.openMode ==='view'\" placeholder=\"Choose the Competency Theme\" formControlName=\"competencyTheme\">\n <ng-container >\n <ng-container >\n <mat-option *ngFor=\"let option of filteredallCompetencyTheme\" [value]=\"option\" [disabled]=\"onDisableTheme(option) || data.openMode ==='view'\" \n (onSelectionChange)=\"OnThemeSelection($event, i, option)\" >{{option.name}}\n <ng-container *ngIf=\"option.refId\">\n <span class=\"ml-2 ref-id\">({{option.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n </ng-container>\n </mat-select>\n </mat-form-field>\n <mat-error *ngIf=\"isTermExist\">{{app_strings.alreadyExist}}</mat-error>\n </div>\n </div>\n \n <div class=\"flex-col mt-2\">\n <label for=\"fname\" class=\"margin-remove-bottom form-label required\"\n i18n=\"First Name label|Label which explains the user to enter first name\"\n i18n-aria-label aria-label=\"First name label\">\n\n {{data.openMode !== 'view'? 'Select Competency Sub-Theme': 'Competency Sub-Theme Name'}}\n \n </label>\n <!-- <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-select placeholder=\"Choose the Competency Theme\" formControlName=\"competencySubTheme\">\n <mat-option *ngFor=\"let option of filteredallCompetencySubTheme\" [value]=\"option\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field> -->\n <!-- {{competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value |json}} -->\n <mat-form-field appearance=\"outline\" class=\"w-full field-height\" >\n <mat-select class=\" placeholder-text\" placeholder=\"Choose the Competency Sub-Theme\"\n formControlName=\"competencySubTheme\" multiple [disabled]=\"data.openMode ==='view'\" panelClass=\"full-width-panel\">\n <!-- [ngClass]=\"{'disbaledSelect':isHideData}\" -->\n <mat-select-trigger >\n <mat-chip-listbox>\n <!-- -->\n \n <mat-chip *ngFor=\"let item of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencySubTheme?.value\" \n (removed)=\"onTermRemove(item, i)\" [disabled]=\"data.openMode ==='view'\"\n [ngClass]=\"{'sub-theme-disable': data?.openMode ==='view'}\" [removable]=\"data?.openMode ==='view'? false: true\">\n <span >{{ item.name }}</span>\n <mat-icon matChipRemove>cancel</mat-icon>\n </mat-chip>\n </mat-chip-listbox>\n </mat-select-trigger>\n <!-- {{competencyForm?.get('compThemeFields') |json}} -->\n <!-- <mat-optgroup>\n <mat-form-field floatLabel=\"never\">\n <input #search autocomplete=\"off\" placeholder=\"Search\" (keydown.space)=\"$event.stopPropagation()\"\n formControlName=\"competencySubTheme\" matInput>\n </mat-form-field>\n </mat-optgroup> -->\n <mat-optgroup *ngIf=\"filteredallCompetencySubTheme.length === 0\">\n <div>No results found!</div>\n </mat-optgroup>\n <!-- <mat-option *ngFor=\"let option of requestObjData.preferredProvider\" [value]=\"option.providerName\">{{option.providerName}}</mat-option> -->\n <ng-container *ngFor=\"let option of competencyForm?.get('compThemeFields')['controls'][i]['controls']?.competencyTheme?.value?.children\">\n <mat-option \n [value]=\"option\" class=\"mat-option-list\">{{option?.name}}\n <ng-container *ngIf=\"option?.refId\">\n <span class=\"ml-2 ref-id\">({{option?.refId}})</span>\n </ng-container>\n </mat-option>\n </ng-container>\n \n </mat-select>\n <!-- <mat-error *ngIf=\"requestForm.controls['providerText'].hasError('required')\">\n Please select up to five preferred providers for the request.\n </mat-error> -->\n </mat-form-field>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n <footer class=\"actions\">\n <button mat-raised-button color=\"default\" type=\"reset\"\n (click)=\"dialogClose('')\">{{app_strings.cancel}}</button>\n <ng-container *ngIf=\"data?.mode === 'create' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"submit\" cdkFocusInitial\n [disabled]=\"competencyForm?.invalid\" *ngIf=\"!disableCreate\">{{app_strings.create}}</button>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'multi-create' && data.openMode !=='view'\">\n <ng-container *ngIf=\"data?.columnInfo?.code !== 'subtheme'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreate(competencyForm, data)\">\n {{app_strings.create}}\n </button>\n </ng-container>\n <ng-container *ngIf=\"data?.columnInfo?.code === 'subtheme'\">\n <!-- <ng-container *ngIf=\"competencyForm?.get('compThemeFields')['controls'][0]['controls']?.competencySubTheme?.value?.length;else updateBtn\"> -->\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.update}}\n </button>\n <!-- </ng-container> -->\n \n <!-- <ng-template #updateBtn>\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n [disabled]=\"competencyForm.invalid || disableMultiCreate\" *ngIf=\"!disableCreate\" (click)=\"multiCreateSubTheme(competencyForm, data)\">\n {{app_strings.delete}}\n </button>\n </ng-template> -->\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"data?.mode === 'edit' && data.openMode !=='view'\">\n <button mat-raised-button color=\"primary\" type=\"button\" cdkFocusInitial\n (click)=\"updateTermData(competencyForm, data)\"\n [disabled]=\"competencyForm?.invalid || disableUpdate\"\n *ngIf=\"!disableCreate\">{{app_strings.update}}</button>\n </ng-container>\n </footer>\n </ng-container>\n </form>\n </ng-container>\n \n </div>\n \n \n <!-- Title of the popup -->\n <ng-template #modalTitle>\n <!-- <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{data.columnInfo.name === 'Theme' ? app_strings.addCompetency : app_strings.createNew}} {{data.columnInfo.name}}</div>\n </ng-container> -->\n <!-- {{data |json}} -->\n <ng-container *ngIf=\"data?.mode === 'create' || data?.mode === 'multi-create'\">\n <div class=\"dialog-title\" mat-dialog-title>{{getCreateName(data)}}</div>\n </ng-container>\n <!-- <ng-container *ngIf=\"data?.mode === 'view'\">\n <div class=\"dialog-title\" mat-dialog-title>View {{data.columnInfo.name}}</div>\n </ng-container> -->\n <ng-container *ngIf=\"data?.mode === 'edit'\">\n <div class=\"dialog-title\" mat-dialog-title>{{app_strings.edit}} {{data.columnInfo.name}}</div>\n </ng-container>\n </ng-template>\n</div>\n\n\n<mat-menu #cardMenu=\"matMenu\" class=\"menu-sec\">\n <ng-template matMenuContent let-rowData=\"data\" let-cardRef=\"cardRef\">\n <button (click)=\"deleteTheme()\"\n mat-menu-item name=\"channel-analytics-button\" class=\"ws-mat-primary-text\" i18n-aria-label\n aria-label=\"Analytics\">\n <mat-icon>delete</mat-icon>\n <span>Delete</span>\n </button>\n </ng-template>\n</mat-menu>", styles: [".gap-3{gap:1.25rem}.gap-4{gap:1.5rem}.row-divider{width:100%;border-top:1px solid rgba(0,0,0,.08);margin:1rem 0}.defaultForm{padding:16px;display:flex;gap:16px;flex-direction:column}.theme-actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:30px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialog .mat-dialog-title{padding:1em;margin-bottom:0;background:#00000014}.dialog .mat-form-field{padding:0;background:#fff;border-radius:2px}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:15px;margin-top:0;border-top:0}.dialog .mat-form-field ::ng-deep .mat-form-field-wrapper .mat-form-field-infix textarea{resize:none}.dialog .mat-form-field-disabled{background:#00000014}.dialog .actions{display:flex;flex-direction:row;justify-content:space-between;padding:0 1em 1em}.dialog .mat-error{padding:0 25px;margin-top:-10px}.dialogNew{padding:1rem}.dialogNew .mat-dialog-title{padding:1em 0;margin-bottom:0}.dialogNew .actions{display:flex;justify-content:right;padding:1em 0;gap:16px;margin-top:16px;border-top:1px solid rgba(0,0,0,.0784313725)}.dialogNew .mat-error{margin-top:-10px}.dialogNew .learning-section{padding:10px!important;border:1px solid rgba(0,0,0,.1803921569);border-radius:4px;margin-right:8px}.dialogNew .learning-section.active-btn{border:1px solid #1B4CA1!important}.learning-section.mat-radio-button .mat-radio-container .mat-radio-outer-circle{border-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-inner-circle{background-color:#1b4ca1!important}::ng-deep .competency-group .learning-section .mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#1b4ca1!important}.dialog-title{align-items:center;display:flex}.flex{display:flex}.flex-col{display:flex;flex-direction:column}.mr-5{margin-right:1.5rem}.flex-1{flex:1 1}.margin-remove-bottom{margin-bottom:0}::ng-deep .custom-dialog-container{max-height:90vh}::ng-deep .custom-dialog-container .mat-dialog-container{padding:0;border-radius:0;background:#00000014}@media only screen and (max-width: 1024px){::ng-deep .cdk-overlay-pane{width:40%!important}}@media only screen and (max-width: 992px){::ng-deep .cdk-overlay-pane{width:45%!important}}@media only screen and (max-width: 1024px){.dialog{font-size:12px}.dialog .dialog-title{font-size:24px;height:1em}.dialog button{font-size:12px;line-height:3.5em}.dialog .mat-raised-button{padding:0 3em}}.flex-align{align-items:center;justify-content:flex-start}::ng-deep mat-form-field .mat-form-field-infix .mat-form-field-label,::ng-deep mat-form-field .mat-form-field-infix .mat-select-value{line-height:normal!important}ws-widget-btn-page-back-admin{margin-left:-270px}.max-wid{max-width:400px}::ng-deep .mat-form-field.mat-focused .mat-form-field-label{color:#333232!important}.margin-right-10{margin-right:10px!important}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}::ng-deep .mat-tab-header{margin:0 3rem}.heading{color:#222}.heading.mt-10{margin-top:2.5rem!important}.img-column{flex:100px 0 0}.input-column{flex:auto}.radio-toolbar input[type=radio]{opacity:0;position:fixed;width:0}.radio-toolbar{padding:10px 0}.radio-toolbar label{display:inline-block;padding:7px 21px;font-size:14px;background:#fff 0% 0% no-repeat padding-box;border:1px solid #5F5F5F;border-radius:4px;margin:0 10px 10px 0;color:#5f5f5f;cursor:pointer;transition:all .125s ease-in-out}.radio-toolbar input[type=radio]:checked+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.radio-toolbar input[type=radio]:focus+label{background:#0074b6 0% 0% no-repeat padding-box;border-radius:6px;border-color:#0074b6;color:#fff}.mar{margin-left:30px;min-width:175px}.radio-toolbar label:hover{background:none;border-color:#0074b6;color:#0074b6}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-form-field.full-width{max-width:100%}::ng-deep .mat-form-field.no-pb .mat-form-field-wrapper{padding-bottom:0}.combined-field{width:100%}.w-full-imp{width:100%!important}::ng-deep .full-width-panel{width:100%!important;min-width:300px}::ng-deep .full-width-panel .mat-option{white-space:normal}.btn-success{background-color:#0075b7!important;border-radius:4px;width:240px;box-shadow:none;margin-right:16px}.btn-success.btn-responsive{width:100%}.btn-success:disabled,.btn-success[disabled]{opacity:.6}.btn-danger{height:30px;width:30px}.color-danger{font-size:30px;height:30px;width:30px;color:#e44}::ng-deep .mat-form-field-outline{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline .mat-form-field-outline-start{border:1px solid rgba(112,112,112,.4117647059);border-radius:4px 0 0 4px;min-width:8px;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-gap{border:1px solid currentColor;border-radius:82px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline .mat-form-field-outline-end{border:1px solid rgba(112,112,112,.4117647059);border-left-style:none;border-radius:0 4px 4px 0}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick{min-height:40px;background:#fff;border-radius:4px}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-start{border-radius:4px 0 0 4px;min-width:8px;border:1px solid currentColor;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-gap{border-width:1px;border:1px solid currentColor;border-radius:4px;border-left-style:none;border-right-style:none}::ng-deep .mat-form-field-outline.mat-form-field-outline-thick .mat-form-field-outline-end{border-width:1px;border-radius:0 4px 4px 0;border:1px solid currentColor;border-left-style:none}::ng-deep .mat-form-field-disabled .mat-form-field-outline{background:#ebebeb!important}::ng-deep .mat-form-field-infix{padding:0;margin:0;border:none}::ng-deep .mat-form-field-flex{min-height:40px;align-items:center}::ng-deep .mat-form-field-infix{padding:0;margin:8px 0 0;border:none}.form-label{color:#222;font-size:14px;margin-bottom:.5rem;font-weight:700;font-family:Lato}.form-input{font-size:14px;font-weight:400;font-family:Lato}input.mat-input-element{color:#5f5f5f}::ng-deep .mat-radio-group{padding-bottom:1.34375em}::ng-deep .mat-chip-list-wrapper{margin:0!important}::ng-deep .mat-chip{font-weight:400;background:#f1f9ff 0% 0% no-repeat padding-box!important;border-radius:12px!important;color:#0074b6!important}::ng-deep .mat-chip:hover{filter:brightness(90%)}::ng-deep .mat-chip .mat-chip-remove{opacity:1!important;color:#0074b6!important;border-radius:50%}::ng-deeptextarea .mat-input-element{padding:8px 0}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}::ng-deep .mat-checkbox .mat-checkbox-frame{border-radius:4px!important}::ng-deep .mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:none!important}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label{font-size:18px;color:#222}::ng-deep .mat-tab-label-container .mat-tab-list .mat-tab-labels .mat-tab-label-active .mat-tab-label-content{color:#0074b6}::ng-deep .mat-tab-label-container .mat-tab-list .mat-ink-bar{height:3px;background-color:#0074b6!important}.form-control{background:#fff 0% 0% no-repeat padding-box;border:1px solid rgba(112,112,112,.4117647059);border-radius:4px;display:block}.form-control::placeholder{color:#bebebe;font-size:14px}.form-control:focus{border:2px solid #0074b6;outline:none}.input-wrapper{flex:1;display:flex;flex-wrap:wrap;flex-direction:column}::ng-deep .mat-checkbox-inner-container{height:23px!important;width:23px!important}.flex-expand{flex:1!important}.heading{font-weight:600;font-family:Montserrat;font-size:1.25rem;display:block;padding:0px 0px 1rem 0}::ng-deep .multiselect-dropdown{margin-bottom:20px}::ng-deep .multiselect-dropdown .dropdown-btn{border:1px solid #ccc!important;width:92%!important}::ng-deep .multiselect-dropdown .dropdown-list .filter-textbox input{width:90%!important}.organisation{color:#212529;font-weight:700;font-size:14px;font-family:Lato}.org-name{height:50px;border:1px solid #e2e2e2;border-radius:5px;background-color:#ebebeb;font-size:14px}.add-designation{height:25px;color:#1b4ca1!important;font-weight:500;font-size:14px;font-family:Lato;cursor:pointer}.add-designation .add-icon{color:#1b4ca1!important;height:24px;width:24px;font-size:24px}.info-icon{width:14px;height:14px;font-size:14px;color:#a7a9ae!important}.themDesignation{max-height:90vh;overflow-y:auto}.designation-panel{margin-bottom:0!important;background-color:#eef1f7!important;border:1px solid #DBE0E9;box-shadow:none!important}.designation-panel .deletDesignation{font-size:18px;width:14px;height:14px;color:#5f6063}.designation-panel .saveDesignaton{color:#fff;height:40px;width:80px;background-color:#1b4ca1;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}.designation-footer{padding:1rem;border-top:1px solid #efefef}.cancel{width:93px;height:40px;font-weight:700;font-size:14px;font-family:Lato;border:1px solid #eee;color:#363636}.addBtn{color:#fff!important;height:40px;width:80px;background-color:#1b4ca1!important;border:1px solid #1B4CA1;font-weight:700;font-size:14px;font-family:Lato}::ng-deep .mat-option.mat-selected:not(.mat-option-disabled){color:#000000de!important}::ng-deep .theme-igot.day-mode .mat-pseudo-checkbox-checked{background:#0074b6!important}::ng-deep .mat-select-panel .mat-option{line-height:1!important}.comp-theme-fields{background:#eef1f7!important;border:1px solid #DBE0E9!important}.create-accordion-btn{color:#1b4ca1!important;padding:0!important}.create-accordion-btn mat-icon{color:#1b4ca1}.ref-id{font-size:10px}::ng-deep .mat-select-panel{min-width:103%!important;margin-left:32px}.loader-bg{background:#ffffffcf;inset:0;transform:translate(-50% -50%);pointer-events:unset;z-index:999999;display:flex;align-items:center;justify-content:center}::ng-deep .mat-chip.mat-standard-chip.mat-chip-disabled{opacity:.8!important;cursor:none;filter:brightness(90%)}\n"] }]
|
|
820
|
-
}], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
|
|
821
|
-
type: Inject,
|
|
822
|
-
args: [MAT_DIALOG_DATA]
|
|
823
|
-
}] }, { type: i1.MatLegacyDialog }, { type: i2.FrameworkService }, { type: i3.UntypedFormBuilder }, { type: i4.MatLegacySnackBar }]; } });
|
|
824
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RyZWUtaGllcmFyY2h5L3NyYy9saWIvY29tcG9uZW50cy9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBOEUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEgsT0FBTyxFQUFFLHNCQUFzQixJQUFJLGVBQWUsRUFBb0UsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5SixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHOUMsT0FBTyxLQUFLLFlBQVksTUFBTSw4QkFBOEIsQ0FBQztBQUc3RCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhHLE1BQU0sT0FBTyxnQ0FBZ0M7SUFnQzNDLFlBQ1MsU0FBeUQsRUFDaEMsSUFBUyxFQUNqQyxNQUFpQixFQUNsQixnQkFBa0MsRUFDakMsRUFBc0IsRUFDdEIsU0FBc0I7UUFMdkIsY0FBUyxHQUFULFNBQVMsQ0FBZ0Q7UUFDaEMsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxXQUFNLEdBQU4sTUFB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QUFDLGlCQUFpQixDQUFxQixDQUFDO0lBQ3hFLENBQUM7K0dBcDhCVSxnQ0FBZ0Msb0RBa0NqQyxlQUFlO21HQWxDZCxnQ0FBZ0Msc0VDcEI3QywrMWlCQW1PVzs7NEZEL01FLGdDQUFnQztrQkFMNUMsU0FBUzsrQkFDRSxnQ0FBZ0M7OzBCQXNDdkMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1BcnJheSwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNQVRfTEVHQUNZX0RJQUxPR19EQVRBIGFzIE1BVF9ESUFMT0dfREFUQSwgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZywgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJztcbmltcG9ydCB7IGxhYmVscyB9IGZyb20gJy4uLy4uL2xhYmVscy9zdHJpbmdzJztcbmltcG9ydCB7IEZyYW1ld29ya1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mcmFtZXdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBOU0ZyYW1ld29yayB9IGZyb20gJy4uLy4uL21vZGVscy9mcmFtZXdvcmsubW9kZWwnO1xuaW1wb3J0ICogYXMgYXBwQ29uc3RhbnRzIGZyb20gJy4uLy4uL2NvbnN0YW50cy9hcHAtY29uc3RhbnQnO1xuaW1wb3J0IHsgQ2FyZCB9IGZyb20gJy4uLy4uL21vZGVscy92YXJpYWJsZS10eXBlLm1vZGVsJztcbi8qIHRzbGludDpkaXNhYmxlICovXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG4vLyBpbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IENvbmZvcmFtdGlvblBvcHVwQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZm9yYW10aW9uLXBvcHVwL2NvbmZvcmFtdGlvbi1wb3B1cC5jb21wb25lbnQnO1xuLyogdHNsaW50OmVuYWJsZSAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENyZWF0ZVRlcm1Gcm9tRnJhbWV3b3JrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBhcHBfc3RyaW5ncyA9IGxhYmVscztcbiAgZW52aXJvbm1lbnQ6IGFueVxuXG4gIHNlbGVjdGVkVGVybTogQ2FyZCA9IHt9O1xuICBzZWxlY3RlZFRlcm1BcnJheSA6IGFueSA9IFtdXG4gIGtjbUNvbmZpZ0RhdGE6IGFueVxuICBzZWxlY3RlZFRoZW1lRGF0YTogYW55XG5cblxuICBpc1Rlcm1FeGlzdDogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNhYmxlQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIGRpc2FibGVNdWx0aUNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBkaXNhYmxlVXBkYXRlOiBib29sZWFuID0gZmFsc2U7XG5cblxuICBjb21wZXRlbmN5Rm9ybSE6IFVudHlwZWRGb3JtR3JvdXBcblxuXG4gIGtjbUxpc3QgOiBhbnk9IG5ldyBNYXA8c3RyaW5nLCBOU0ZyYW1ld29yay5JQ29sdW1uVmlldz4oKTtcbiAgLy8gY2F0ZWdvcmllc0hhc2g6IGFueVxuICBjb21wZXRlbmN5QXJlYTogYW55XG4gIHNlbGVjdGVkQ2FyZENvbXBUaGVtZURhdGE6IGFueVxuXG4gIGFsbENvbXBldGVuY3k6YW55W109W11cbiAgc2VsZXRlZENvbXBldGVuY3lBcmVhOiBhbnlcbiAgYWxsQ29tcGV0ZW5jeVRoZW1lOmFueVtdPVtdXG4gIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lOmFueVtdPVtdXG4gIGFsbENvbXBldGVuY3lTdWJ0aGVtZTphbnlbXT1bXVxuICBmaWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZTphbnlbXT1bXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDcmVhdGVUZXJtRnJvbUZyYW1ld29ya0NvbXBvbmVudD4sXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwdWJsaWMgZnJhbWVXb3JrU2VydmljZTogRnJhbWV3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBfc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0RW52aXJvbWVudCgpXG4gICAgdGhpcy5nZXRDb21wdGVuY3lEYXRhKClcbiAgICB0aGlzLmtjbUNvbmZpZ0RhdGEgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0Q29uZmlnQnlGcmFtZVdvcmtJZCh0aGlzLmVudmlyb25tZW50LmtjbUZyYW1ld29ya05hbWUpXG4gICAgdGhpcy5jb21wZXRlbmN5Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29tcEFyZWE6WycnLFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgY29tcFRoZW1lRmllbGRzOiB0aGlzLmZiLmFycmF5KFt0aGlzLmNyZWF0ZUNvbXBUaGVtZUZpZWxkcygpXSlcbiAgICB9KVxuXG4gIH1cblxuICBnZXRDb21wdGVuY3lEYXRhKCl7XG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldEZyYW1ld29ya1JlYWQodGhpcy5lbnZpcm9ubWVudC5rY21GcmFtZXdvcmtOYW1lKS5zdWJzY3JpYmUoKGRhdGEpPT57XG4gICAgIGlmKGRhdGEuY2F0ZWdvcmllcykge1xuICAgICAgdGhpcy5mb3JtYXRlRGF0YShkYXRhLCB0aGlzLmVudmlyb25tZW50LmtjbUZyYW1ld29ya05hbWUpXG4gICAgICB0aGlzLnNlbGVjdGVkQ2FyZENvbXBUaGVtZURhdGEgPSAgJydcbiAgICAgIC8vIHRvIGRvOiBjaGFuZ2UgZ2V0dGluZyBzZWxlY3RlZFBhcmVudFRlcm1zIHRvIGR5bmFtaWNcbiAgICAgIGlmKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuc2VsZWN0ZWRQYXJlbnRUZXJtcykge1xuICAgICAgICB0aGlzLmRhdGEuc2VsZWN0ZWRQYXJlbnRUZXJtcy5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICAgIGlmKGVsZS5jYXRlZ29yeSA9PT0gXCJjb21wZXRlbmN5XCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYXJkQ29tcFRoZW1lRGF0YSA9IGVsZVxuICAgICAgICAgICAgbGV0IG9wdGlvbiA9IHRoaXMuc2VsZWN0ZWRDYXJkQ29tcFRoZW1lRGF0YS5hZGRpdGlvbmFsUHJvcGVydGllcy5jb21wZXRlbmN5QXJlYVxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkFyZWEob3B0aW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgfVxuICAgIH0sKChfZXJyOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYEtDTSBGcmFtZXdvcmsgcmVhZCBmYWlsZWQuYClcbiAgICB9KSlcbiAgfVxuXG4gIGZvcm1hdGVEYXRhKHJlc3BvbnNlOiBhbnksIGZyYW1ld29ya0lkOiBzdHJpbmcpIHtcbiAgICAocmVzcG9uc2UuY2F0ZWdvcmllcykuZm9yRWFjaCgoYTphbnkpID0+IHtcbiAgICAgIGlmKGEuY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMua2NtTGlzdC5zZXQoYS5jb2RlLCB7XG4gICAgICAgICAgY29kZTogYS5jb2RlLFxuICAgICAgICAgIGlkZW50aWZpZXI6IGEuaWRlbnRpZmllcixcbiAgICAgICAgICBpbmRleDogYS5pbmRleCxcbiAgICAgICAgICBuYW1lOiBhLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGEuZGVzY3JpcHRpb24sXG4gICAgICAgICAgY29uZmlnOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0Q29uZmlnT2ZDYXRlZ29yeUNvbmZpZ0J5RnJhbWVXb3JrSWQoYS5jb2RlLCBmcmFtZXdvcmtJZCksXG4gICAgICAgICAgLy8gY2hpbGRyZW46IChbLi4uYS50ZXJtcywgLi4ubG9jYWxEYXRhXSB8fCBbXSkubWFwKGMgPT4ge1xuICAgICAgICAgIGNoaWxkcmVuOiAoYS50ZXJtcyB8fCBbXSkubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXNzb2NpYXRpb25zID0gYy5hc3NvY2lhdGlvbnMgfHwgW11cbiAgICAgICAgICAgIGlmIChhc3NvY2lhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGMsIHsgY2hpbGRyZW46IGFzc29jaWF0aW9ucyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMua2NtTGlzdC5mb3JFYWNoKChhOiBhbnkpID0+IHtcbiAgICAgIGlmKGEuY29kZSA9PT0gXy5nZXQodGhpcy5rY21Db25maWdEYXRhLCAnY29uZmlnWzBdLmNhdGVnb3J5Jykpe1xuICAgICAgICB0aGlzLmNvbXBldGVuY3lBcmVhID0gYVxuICAgICAgfVxuICAgIH0pXG4gICAgXG5cbiAgfVxuXG5cbiAgY3JlYXRlQ29tcFRoZW1lRmllbGRzKCk6VW50eXBlZEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY29tcGV0ZW5jeVRoZW1lOlsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIGNvbXBldGVuY3lTdWJUaGVtZTpbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICB9KVxuICB9XG5cblxuICBnZXRDcmVhdGVOYW1lKGRhdGE6IGFueSkge1xuICAgICAgbGV0IHBvcFVwQ2F0ZWdvcnkgPSBkYXRhLmNhcmRDb2xJbmZvID8gZGF0YS5jYXJkQ29sSW5mby5uYW1lIDogZGF0YS5jb2x1bW5JbmZvLm5hbWVcbiAgICAgIHN3aXRjaChwb3BVcENhdGVnb3J5KXtcbiAgICAgICAgY2FzZSAnRGVzaWduYXRpb24nOlxuICAgICAgICByZXR1cm4gYENyZWF0ZSBDb21wZXRlbmN5IE1hcHBpbmdgO1xuICAgICAgICBjYXNlICdTdWIgVGhlbWUnOlxuICAgICAgICAgIGlmKGRhdGEub3Blbk1vZGUgPT09ICd2aWV3Jykge1xuICAgICAgICAgICAgcmV0dXJuIGBWaWV3IENvbXBldGVuY3kgJHtwb3BVcENhdGVnb3J5fWBcbiAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBgQWRkIENvbXBldGVuY3kgJHtwb3BVcENhdGVnb3J5fWBcbiAgICAgICAgY2FzZSAnQ29tcGV0ZW5jeSc6XG4gICAgICAgICAgaWYoZGF0YS5vcGVuTW9kZSA9PT0gJ2VkaXQnKSB7XG4gICAgICAgICAgICByZXR1cm4gYEVkaXQgQ29tcGV0ZW5jeSBUaGVtZWBcbiAgICAgICAgICB9IGVsc2UgaWYoZGF0YS5vcGVuTW9kZSA9PT0gJ3ZpZXcnKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZpZXcgQ29tcGV0ZW5jeSBUaGVtZWBcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGBDcmVhdGUgQ29tcGV0ZW5jeSBNYXBwaW5nYFxuICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAnJ1xuICAgICAgfVxuICB9XG5cbiAgY2xlYXJTZWxlY3RlZFRoZW1lcyhvcHRpb246YW55KXtcbiAgICBpZih0aGlzLmlzVGhlbWVTZWxlY3RlZCkge1xuICAgICAgdGhpcy5vcGVuQ29uZm9yYW10aW9uUG9wdXAob3B0aW9uKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uU2VsZWN0aW9uQXJlYShvcHRpb24pXG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzVGhlbWVTZWxlY3RlZCAoKSB7XG4gICAgbGV0IGhhc1ZhbHVlID0gZmFsc2VcbiAgICBpZiAodGhpcy5jb21wZXRlbmN5Rm9ybSkge1xuICAgICAgY29uc3QgY29tcFRoZW1lRmllbGRzID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICBpZiAoY29tcFRoZW1lRmllbGRzKSB7XG4gICAgICAgIGNvbXBUaGVtZUZpZWxkcy5jb250cm9scy5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgICAgIGlmKGVsZW1lbnQuZ2V0KCdjb21wZXRlbmN5VGhlbWUnKT8udmFsdWUgfHwgZWxlbWVudC5nZXQoJ2NvbXBldGVuY3lTdWJUaGVtZScpPy52YWx1ZSkge1xuICAgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc1ZhbHVlXG4gIH1cblxuICBvcGVuQ29uZm9yYW10aW9uUG9wdXAob3B0aW9uOmFueSkge1xuICAgIGNvbnN0IGRpYWxvZ0RhdGEgPSB7XG4gICAgICBkaWFsb2dUeXBlOiAnd2FybmluZycsXG4gICAgICBkZXNjcmlwdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcjogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBhbHRlciB0aGUgY29tcGV0ZW5jeSBhcmVhPycsXG4gICAgICAgICAgaGVhZGVyQ2xhc3M6ICdmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWJsdWUgdGV4dEJvbGQnLFxuICAgICAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1zZ0NsYXNzOiAnJyxcbiAgICAgICAgICAgICAgbXNnOiBgVGhpcyBhY3Rpb24gd2lsbCByZXN1bHQgaW4gdGhlIGxvc3Mgb2YgeW91ciBjdXJyZW50bHkgYWRkZWQgZGF0YWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZm9vdGVyQ2xhc3M6ICdpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXInLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgYnRuVGV4dDogJ0NhbmNlbCcsXG4gICAgICAgICAgYnRuQ2xhc3M6ICdidG4tb3V0bGluZScsXG4gICAgICAgICAgcmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgYnRuVGV4dDogJ0NvbmZpcm0nLFxuICAgICAgICAgIGJ0bkNsYXNzOiAnYnRuLWZ1bGwtc3VjY2VzcycsXG4gICAgICAgICAgcmVzcG9uc2U6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH1cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZvcmFtdGlvblBvcHVwQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgIHdpZHRoOiAnNjAwcHgnLFxuICAgICAgbWF4V2lkdGg6ICc4MHZ3JyxcbiAgICAgIG1heEhlaWdodDogJzkwdmgnLFxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgIH0pXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQXJlYShvcHRpb24pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb21wQXJlYUNvbnRyb2wgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcEFyZWEnKTtcbiAgICAgICAgaWYgKGNvbXBBcmVhQ29udHJvbCkge1xuICAgICAgICAgIGNvbXBBcmVhQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYSk7XG4gICAgICAgICAgY29tcEFyZWFDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBvblNlbGVjdGlvbkFyZWEob3B0aW9uOmFueSl7XG4gICAgdGhpcy5jb21wZXRlbmN5Rm9ybS5yZXNldCgpXG4gICAgd2hpbGUodGhpcy5jb21wVGhlbWVGaWVsZHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmNvbXBUaGVtZUZpZWxkcy5yZW1vdmVBdCgwKTtcbiAgICB9XG4gICAgdGhpcy5jb21wVGhlbWVGaWVsZHMucHVzaCh0aGlzLmNyZWF0ZUNvbXBUaGVtZUZpZWxkcygpKTtcbiAgICBpZigndGhlbWUnID09PSB0aGlzLmtjbUNvbmZpZ0RhdGEuY29uZmlnWzFdLmNhdGVnb3J5KXtcbiAgICAgIHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhID0gb3B0aW9uXG4gICAgICBjb25zdCBjb21wQXJlYUNvbnRyb2wgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcEFyZWEnKTtcbiAgICAgIGlmIChjb21wQXJlYUNvbnRyb2wpIHtcbiAgICAgICAgY29tcEFyZWFDb250cm9sLnBhdGNoVmFsdWUob3B0aW9uKTtcbiAgICAgICAgY29tcEFyZWFDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUgPSBbXVxuICAgICAgdGhpcy5hbGxDb21wZXRlbmN5VGhlbWUgPSBbXVxuICAgICAgaWYob3B0aW9uICYmICBvcHRpb24uY2hpbGRyZW4gJiYgIG9wdGlvbi5jaGlsZHJlbi5sZW5ndGgpe1xuICAgICAgICBsZXQgdGhlbWVWYWx1ZSA9IHRoaXMua2NtTGlzdC5nZXQodGhpcy5rY21Db25maWdEYXRhLmNvbmZpZ1sxXS5jYXRlZ29yeSlcbiAgICAgICAgb3B0aW9uLmNoaWxkcmVuLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYoZWxlLmNhdGVnb3J5ID09PSAndGhlbWUnICkge1xuICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhlbWVWYWx1ZS5jaGlsZHJlbi5maW5kSW5kZXgoKHRoZW1lRGF0YSA6YW55ICkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKGVsZS5yZWZJZCA9PT0gdGhlbWVEYXRhLnJlZklkKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhlbWVEYXRhLmNoaWxkcmVuICYmIHRoZW1lRGF0YS5jaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGlmKHJlc3VsdCA+PSAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLmFsbENvbXBldGVuY3lUaGVtZS5wdXNoKGVsZSlcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lLnB1c2goZWxlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYodGhpcy5jb21wZXRlbmN5QXJlYSAmJiB0aGlzLmNvbXBldGVuY3lBcmVhLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5jb21wZXRlbmN5QXJlYS5jaGlsZHJlbi5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xuICAgICAgICAgICAgaWYoZWxlbWVudC5jb2RlID09PSBvcHRpb24uY29kZSkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYSA9IG9wdGlvblxuICAgICAgICAgICAgICBpZihlbGVtZW50LmNoaWxkcmVuICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYoZWxlLmNhdGVnb3J5ID09PSAndGhlbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lLnB1c2goZWxlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lLnB1c2goZWxlKVxuICAgICAgICAgICAgICAgICAgICAvLyB0byBkbzogIHRvIGJlIGNoZWNrIGJhc2VkIG9uIHJlZmYgaWRcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5zZWxlY3RlZENhcmRDb21wVGhlbWVEYXRhLnJlZklkLnRvTG93ZXJDYXNlKCkgPT09IGVsZS5yZWZJZC50b0xvd2VyQ2FzZSgpKXtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybUFycmF5OmFueSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1BcnJheS5hdCgwKS5nZXQoJ2NvbXBldGVuY3lUaGVtZScpLnBhdGNoVmFsdWUoZWxlKVxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1BcnJheS5hdCgwKS5nZXQoJ2NvbXBldGVuY3lUaGVtZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBBcmVhQ29udHJvbCA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wQXJlYScpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wQXJlYUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBBcmVhQ29udHJvbC5wYXRjaFZhbHVlKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wQXJlYUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgIH1cbiAgfVxuXG4gIGFkZENvbXBldGVuY3lUaGVtZSgpe1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLmluc2VydCgwLCB0aGlzLmNyZWF0ZUNvbXBUaGVtZUZpZWxkcygpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDb21wRmllbGRzKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnKSB7XG4gICAgICB0aGlzLmNvbXBUaGVtZUZpZWxkcy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgT25UaGVtZVNlbGVjdGlvbihldmVudDogYW55LCBfaW5kZXhWYWx1ZTogYW55LCBvcHRpb25EYXRhOmFueSkge1xuICAgIC8vIGlmIChldmVudC5pc1VzZXJJbnB1dCB8fCB0aGlzLmRhdGEub3Blbk1vZGUgPT09ICd2aWV3JykgeyAgIFxuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWUgPSBldmVudC5zb3VyY2UudmFsdWVcbiAgICB0aGlzLmtjbUxpc3QuZm9yRWFjaCgoZWxlOmFueSkgPT4ge1xuICAgICAgaWYoc2VsZWN0ZWRUaGVtZS5jYXRlZ29yeSA9PT0gZWxlLmNvZGUpIHtcbiAgICAgICAgaWYoZWxlLmNoaWxkcmVuICYmIGVsZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICBlbGUuY2hpbGRyZW4uZm9yRWFjaCgodGhlbWVDaGlsZDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZih0aGVtZUNoaWxkLmlkZW50aWZpZXIgPT09IHNlbGVjdGVkVGhlbWUuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICBpZih0aGVtZUNoaWxkLmNoaWxkcmVuICYmIHRoZW1lQ2hpbGQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uRGF0YVsnY2hpbGRyZW4nXSA9IHRoZW1lQ2hpbGQuY2hpbGRyZW5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lID0gdGhlbWVDaGlsZC5jaGlsZHJlbiBcbiAgICAgICAgICAgICAgICAgLy8gdG8gZG86ICB0byBiZSBjaGVjayBiYXNlZCBvbiByZWZmIGlkXG4gICAgICAgICAgICAgICAgIGxldCBtYXRjaGVkRGF0YSA9IFtdXG4gICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5jaGlsZHJlbkRhdGEgJiYgdGhpcy5kYXRhLmNoaWxkcmVuRGF0YS5jYXRlZ29yeSA9PT0gXCJzdWJ0aGVtZVwiKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRGF0YSA9IF8uaW50ZXJzZWN0aW9uQnkodGhlbWVDaGlsZC5jaGlsZHJlbixbdGhpcy5kYXRhLmNoaWxkcmVuRGF0YV0sICdyZWZJZCcpO1xuICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbWF0Y2hlZERhdGEgPSBfLmludGVyc2VjdGlvbkJ5KHRoZW1lQ2hpbGQuY2hpbGRyZW4sdGhpcy5zZWxlY3RlZENhcmRDb21wVGhlbWVEYXRhLmNoaWxkcmVuLCAncmVmSWQnKTtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGV0ZW5jeVN1YlRoZW1lQ29udHJvbCA9IGZvcm1BcnJheS5hdChfaW5kZXhWYWx1ZSkuZ2V0KCdjb21wZXRlbmN5U3ViVGhlbWUnKTtcbiAgICAgICAgICAgICAgICAgIGlmIChjb21wZXRlbmN5U3ViVGhlbWVDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBldGVuY3lTdWJUaGVtZUNvbnRyb2wucGF0Y2hWYWx1ZShtYXRjaGVkRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBldGVuY3lTdWJUaGVtZUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgLy8gfVxuICB9XG5cbiAgb25UZXJtUmVtb3ZlKHRlcm1EYXRhOiBhbnksIGluZGV4VmFsdWU6IG51bWJlcikge1xuICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICBjb25zdCBjb21wVGhlbWVDb250cm9sID0gZm9ybUFycmF5LmF0KGluZGV4VmFsdWUpLmdldCgnY29tcGV0ZW5jeVN1YlRoZW1lJykgYXMgVW50eXBlZEZvcm1Db250cm9sIHwgbnVsbFxuICAgIGlmIChjb21wVGhlbWVDb250cm9sKSB7XG4gICAgICBjb25zdCB0aGVtZXMgPSBjb21wVGhlbWVDb250cm9sLnZhbHVlXG4gICAgICBpZiAodGhlbWVzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhlbWVzLmluZGV4T2YodGVybURhdGEpXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgdGhlbWVzLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgICBjb21wVGhlbWVDb250cm9sLnNldFZhbHVlKHRoZW1lcylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIE9uU3ViVGhlbWVTZWxlY3Rpb24oX2V2ZW50OiBhbnksIF9pbmRleFZhbHVlOiBudW1iZXIsIF9vcHRpb246IGFueSl7XG4gICAgLy8gbGV0IGZvcm1BcnJheSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIC8vIGNvbnN0IGNvbXBUaGVtZUNvbnRyb2wgPSBmb3JtQXJyYXkuYXQoaW5kZXhWYWx1ZSkuZ2V0KCdjb21wZXRlbmN5U3ViVGhlbWUnKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wgfCBudWxsXG4gICAgXG4gIH1cblxuICAvLyBhZGQgZm9ybVxuICBhc3luYyBtdWx0aUNyZWF0ZShmb3JtOiBhbnksIF9kYXRhOiBhbnkpIHtcbiAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICAvLyBsZXQgY291bnRlclRoZW1lID0gMFxuICAgIGxldCBjb3VudGVyU3ViVGhlbWUgPSAwXG4gICAgbGV0IHBhcmVudENhdGVnb3J5ID0ge31cbiAgICBsZXQgY3JlYXRlZFRlcm1zOmFueSA9IFtdXG4gICAgbGV0IGNyZWF0ZWRTdWJUaGVtZSA9IFtdXG4gICAgaWYoZm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgdGhlbWVGaWVsZHMgPSBmb3JtICYmIGZvcm0udmFsdWUgJiYgZm9ybS52YWx1ZS5jb21wVGhlbWVGaWVsZHNcbiAgICAgIGlmKHRoZW1lRmllbGRzICYmIHRoZW1lRmllbGRzLmxlbmd0aCkge1xuICAgICAgICBsZXQgbG9jYWxDb21wQXJlYSA9IHsuLi50aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYX1cbiAgICAgICAgaWYobG9jYWxDb21wQXJlYS5jaGlsZHJlbiAmJiBsb2NhbENvbXBBcmVhLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgIGRlbGV0ZSBsb2NhbENvbXBBcmVhLmNoaWxkcmVuXG4gICAgICAgIH1cbiAgICAgICAgaWYobG9jYWxDb21wQXJlYS5hc3NvY2lhdGlvbnMgJiYgbG9jYWxDb21wQXJlYS5hc3NvY2lhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgZGVsZXRlIGxvY2FsQ29tcEFyZWEuYXNzb2NpYXRpb25zXG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGVtZUZpZWxkcy5mb3JFYWNoKGFzeW5jIChvYmpWYWwsIHRoZW1lSW5kZXgpID0+XG4gICAgICAgIGZvcihsZXQgW2luZGV4LCBvYmpWYWxdIG9mIHRoZW1lRmllbGRzLmVudHJpZXMoKSkge1xuICAgICAgICAgIHBhcmVudENhdGVnb3J5ID0ge31cbiAgICAgICAgICBpZihvYmpWYWxbJ2NvbXBldGVuY3lUaGVtZSddKSB7XG4gICAgICAgICAgICBjcmVhdGVkVGVybXM9IFtdXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBvYmpWYWxbJ2NvbXBldGVuY3lUaGVtZSddXG4gICAgICAgICAgICBjb25zdCB0ZXJtOiBOU0ZyYW1ld29yay5JQ3JlYXRlVGVybSA9IHtcbiAgICAgICAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiBhcHBDb25zdGFudHMuTElWRSxcbiAgICAgICAgICAgICAgcmVmSWQ6IHZhbHVlLnJlZklkIHx8ICcnLFxuICAgICAgICAgICAgICByZWZUeXBlOiB2YWx1ZS5yZWZUeXBlIHx8ICcnLFxuICAgICAgICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICAgICAgICB7IGlkZW50aWZpZXI6IGAke3RoaXMuZGF0YS5mcmFtZXdvcmtJZC50b0xvd2VyQ2FzZSgpfV8ke3RoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGV9YCB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgY29tcGV0ZW5jeUFyZWE6IGxvY2FsQ29tcEFyZWEsXG4gICAgICAgICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICB0ZXJtOiB0ZXJtXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWVXb3JrU2VydmljZS5jcmVhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcmVxdWVzdEJvZHkpLnRvUHJvbWlzZSgpLnRoZW4oYXN5bmMgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybVsnaWRlbnRpZmllciddID0gcmVzLnJlc3VsdC5ub2RlX2lkWzBdXG4gICAgICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmRlbGV0ZSgnY29tcGV0ZW5jeScpXG4gICAgICAgICAgICAgIHBhcmVudENhdGVnb3J5ID0gcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtXG4gICAgICAgICAgICAgIGNyZWF0ZWRUZXJtcy5wdXNoKHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSlcbiAgICAgICAgICAgICAgLy8gY291bnRlclRoZW1lKytcblxuICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb2x1bW46IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgICAgICAgICAgIGxldCBwYXJlbnRDb2w6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW4uY29kZSlcbiAgXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFRlcm1zLHBhcmVudENvbClcbiAgICAgICAgICAgICAgLy8gLy8gYXdhaXQgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGkoY3JlYXRlZFRlcm1zKVxuXG4gICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgXCJzZWxlY3RlZFwiOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBwYXJlbnRDb2x1bW4uY29kZSxcbiAgICAgICAgICAgICAgICAgICAgXCJjYXJkU3ViVHlwZVwiOiBcIm1pbmltYWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJpc1ZpZXdPbmx5XCI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBcImluZGV4XCI6IHBhcmVudENvbHVtbi5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgXCJjb2x1bW5JbmZvXCI6IHRoaXMuZGF0YS5jYXJkQ29sSW5mb1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhMTIgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJlczogeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiB0aGlzLmRhdGEuY29sdW1uSW5mby5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ211bHRpLWNyZWF0ZSdcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVBZnRlckFkZE9yRWRpdFN1YmplY3QocmVzcG9uc2VEYXRhMTIpXG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKG9ialZhbFsnY29tcGV0ZW5jeVN1YlRoZW1lJ10pIHtcbiAgICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCBwYXJlbnRDYXRlZ29yeSlcblxuICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqVmFsWydjb21wZXRlbmN5U3ViVGhlbWUnXVxuICAgICAgICAgICAgaWYodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvdW50ZXJTdWJUaGVtZSA9IDBcbiAgICAgICAgICAgICAgY3JlYXRlZFN1YlRoZW1lID0gW11cbiAgICAgICAgICAgICAgLy8gdmFsdWUuZm9yRWFjaChhc3luYyAoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBmb3IobGV0IGVsZSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlcm06IE5TRnJhbWV3b3JrLklDcmVhdGVUZXJtID0ge1xuICAgICAgICAgICAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGVsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGVsZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEubmV4dENvbEluZm8uY29kZSxcbiAgICAgICAgICAgICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgICAgICAgICAgICByZWZJZDogZWxlLnJlZklkIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgcmVmVHlwZTogZWxlLnJlZlR5cGUgfHwgJycsXG4gICAgICAgICAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLm5leHRDb2xJbmZvLmNvZGV9YCB9XG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keTphbnkgPSB7XG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHRlcm1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlRGF0YTogYW55ID0gYXdhaXQgdGhpcy5jcmF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEubmV4dENvbEluZm8uY29kZSwgcmVxdWVzdEJvZHkpXG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlc3BvbnNlRGF0YS5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICAgICAgICAgIGNyZWF0ZWRTdWJUaGVtZS5wdXNoKHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSlcbiAgICAgICAgICAgICAgICBjb3VudGVyU3ViVGhlbWUrK1xuICAgICAgICAgICAgICAgIGlmKChjb3VudGVyU3ViVGhlbWUgPT09IG9ialZhbFsnY29tcGV0ZW5jeVN1YlRoZW1lJ10ubGVuZ3RoKSl7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb2x1bW5Db25maWdEYXRhOmFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHRoaXMuZGF0YS5uZXh0Q29sSW5mby5jb2RlKVxuICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICAgIFxuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGlWMihjcmVhdGVkU3ViVGhlbWUscGFyZW50Q29sLCBpbmRleCwgdGhlbWVGaWVsZHMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgaWYoaW5kZXggPT09IHRoZW1lRmllbGRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZGVsZXRlKCdjb21wZXRlbmN5JylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksIGNyZWF0ZWQ6IHRydWUsIG11bHRpOmZhbHNlLCBjYWxsVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgTWFwcGluZyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgYXN5bmMgY3JhdGVUZXJtKGZyYW1ld29ya0lkOiBhbnksIGNvbENvZGU6IGFueSwgcmVxdWVzdEJvZHk6IGFueSl7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKT0+e1xuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0oZnJhbWV3b3JrSWQsIGNvbENvZGUsIHJlcXVlc3RCb2R5KS5zdWJzY3JpYmUoKHJlczogYW55KT0+e1xuICAgICAgICByZXNvbHZlKHJlcylcbiAgICAgIH0sKChfZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ3JlYXRlIFRlcm0gZmFpbGVkLmApXG4gICAgICB9KSlcbiAgICB9KVxuICB9XG5cblxuXG4gIGFzeW5jIHVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aVYyKGNyZWF0ZWRUZXJtczogYW55W10sIHBhcmVudFNlbGVjdGVkVGVybT86IGFueSwgX3J1bm5pbmdJbmRleD86IG51bWJlciwgX3RoZW1GaWVsZHNMZW5ndGg/OiBudW1iZXIpIHtcbiAgICBpZihjcmVhdGVkVGVybXMgJiYgY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRlcm1BcnJheSA9IFtdXG4gICAgICAvLyBsZXQgY3JlYXRlZFRlcm1zQ291bnRlciA9IDBcbiAgICAgIGxldCBjcmVhdGVkVGVybXNJZGVudGlmaWVycyA9IFtdXG4gICAgICB0aGlzLnNlbGVjdGVkVGVybUFycmF5ID0gY3JlYXRlZFRlcm1zXG4gICAgICB0aGlzLnNlbGVjdGVkVGVybSA9IGNyZWF0ZWRUZXJtc1tjcmVhdGVkVGVybXMubGVuZ3RoIC0xXVxuICAgICAgZm9yKGxldCBjcmVhdGVkVGVybSBvZiBjcmVhdGVkVGVybXMpIHtcbiAgICAgICAgY3JlYXRlZFRlcm1zSWRlbnRpZmllcnMucHVzaCh7IGlkZW50aWZpZXI6IGNyZWF0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgIH1cbiAgICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgICAgbGV0IGNvdW50ZXIgPSAwXG4gICAgICBpZighcGFyZW50U2VsZWN0ZWRUZXJtKSB7XG4gICAgICAgIGZvcihjb25zdCBbdmFsdWVdIG9mIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0KXtcbiAgICAgICAgICBjb25zdCBwYXJlbnQ6YW55ID0gdmFsdWVcbiAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICAgIH0pIDogW11cbiAgICAgICAgICAgIGFzc29jaWF0aW9ucyA9IFsuLi5hc3NvY2lhdGlvbnMsIC4uLmNyZWF0ZWRUZXJtc0lkZW50aWZpZXJzXVxuICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWxsVXBkYXRlQXNzb2NpYXRpb25zVjIoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcbiAgICAgICAgICAvLyBjcmVhdGVkVGVybXNDb3VudGVyKytcbiAgICAgICAgICAvLyBpZihjcmVhdGVkVGVybXNDb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgICAvLyBpZihydW5uaW5nSW5kZXggPT09IHRoZW1GaWVsZHNMZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5kZWxldGUoJ2NvbXBldGVuY3knKVxuICAgICAgICAgICAgLy8gICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlLCBjYWxsVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgICAgLy8gICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gICAgIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3RoZW1lJyl7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAnc3VidGhlbWUnKXsgICAgICAgICBcblxuICAgICAgICAgICAgLy8gICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgJHtjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnl9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFNlbGVjdGVkVGVybVxuICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgICAgfSkgOiBbXVxuICAgICAgICAgIGFzc29jaWF0aW9ucyA9IFsuLi5hc3NvY2lhdGlvbnMsIC4uLmNyZWF0ZWRUZXJtc0lkZW50aWZpZXJzXVxuICAgICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSBmYWxzZVxuICAgICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9uc1YyKGNvdW50ZXIsIHBhcmVudCwgcmVndWVzdEJvZHkpXG5cbiAgICAgICAgICAvLyBpZihjcmVhdGVkVGVybXNDb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIC8vIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiBbdGhpcy5zZWxlY3RlZFRlcm1dLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlLCBzdG9wVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgICAvLyBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpeyAgIFxuICAgICAgICAgIC8vICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpKGNyZWF0ZWRUZXJtczogYW55W10pIHtcbiAgICBpZihjcmVhdGVkVGVybXMgJiYgY3JlYXRlZFRlcm1zLmxlbmd0aCkge1xuICAgICAgLy8gbGV0IGNyZWF0ZWRUZXJtc0NvdW50ZXIgPSAwXG4gICAgICBmb3IobGV0IGNyZWF0ZWRUZXJtIG9mIGNyZWF0ZWRUZXJtcykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGVybSA9IGNyZWF0ZWRUZXJtXG4gICAgICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgICAgICBsZXQgdGVtcFxuICAgICAgICBsZXQgY291bnRlciA9IDBcbiAgICAgICAgLy8gbGV0IGxvY2FsSXNFeGlzdCA9IGZhbHNlXG4gICAgICAgIFxuICAgICAgICBmb3IoY29uc3QgW3ZhbHVlXSBvZiB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdCl7XG4gICAgICAgICAgY29uc3QgcGFyZW50OmFueSA9IHZhbHVlXG4gICAgICAgICAgY291bnRlcisrXG4gICAgICAgICAgdGVtcCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOmFueSkgPT4gY2hpbGQuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBudWxsXG4gICAgICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjLmlkZW50aWZpZXIgPyAgeyBpZGVudGlmaWVyOiBjLmlkZW50aWZpZXIgfSA6IG51bGxcbiAgICAgICAgICB9KSA6IFtdXG4gICAgICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSB0cnVlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIgfSlcbiAgICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IChjcmVhdGVkVGVybXMubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnMoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGVkVGVybXNDb3VudGVyKytcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBjYWxsVXBkYXRlQXNzb2NpYXRpb25zVjIoY291bnRlcjogYW55LCBwYXJlbnQ6IGFueSwgcmVndWVzdEJvZHk6IGFueSApOiBQcm9taXNlPGFueT57XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCBwYXJlbnQuY2F0ZWdvcnksIHBhcmVudC5jb2RlLCByZWd1ZXN0Qm9keSkuc3Vic2NyaWJlKGFzeW5jICgpID0+IHtcbiAgICAgICAgcGFyZW50WydjaGlsZHJlbiddID0gcGFyZW50ICYmIHBhcmVudC5jaGlsZHJlbiA/Wy4uLnBhcmVudC5jaGlsZHJlbiwgLi4udGhpcy5zZWxlY3RlZFRlcm1BcnJheV06dGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICAgIGxldCBsaXN0RGF0YSA6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5saXN0LmdldCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICAgIGxldCBkaWZmZXJlbmNlRGF0YSA9IFtdXG4gICAgICAgICAgaWYobGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gJiYgbGlzdERhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBkaWZmZXJlbmNlRGF0YSAgPSBfLmRpZmZlcmVuY2VCeSh0aGlzLnNlbGVjdGVkVGVybUFycmF5LGxpc3REYXRhLmNoaWxkcmVuLCAnaWRlbnRpZmllcicpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkaWZmZXJlbmNlRGF0YSA9IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICB9XG4gICAgICAgICAgbGlzdERhdGFbJ2Fzc29jaWF0aW9ucyddID0gbGlzdERhdGEgJiYgbGlzdERhdGEuYXNzb2NpYXRpb25zID9bLi4ubGlzdERhdGEuYXNzb2NpYXRpb25zLCAuLi5kaWZmZXJlbmNlRGF0YV06ZGlmZmVyZW5jZURhdGFcbiAgICAgICAgICBsaXN0RGF0YVsnY2hpbGRyZW4nXSA9IGxpc3REYXRhICYmIGxpc3REYXRhLmNoaWxkcmVuID9bLi4ubGlzdERhdGEuY2hpbGRyZW4sIC4uLmRpZmZlcmVuY2VEYXRhXTpkaWZmZXJlbmNlRGF0YVxuXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZm9yRWFjaCgoc2VsZWN0ZWREYXRhOiBhbnkpPT4ge1xuICAgICAgICAgICAgbGV0IGxpc3REYXRhIDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmxpc3QuZ2V0KHNlbGVjdGVkRGF0YS5jYXRlZ29yeSlcbiAgICAgICAgICAgIGlmKGxpc3REYXRhICYmIGxpc3REYXRhLmNoaWxkcmVuICYmIGxpc3REYXRhLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxvY2FsTGlzdChsaXN0RGF0YSxwYXJlbnQsIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgXG4gICAgICAgIC8vIGxldCBzZWxlY3RlZENhcmRJbmZvID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHRoaXMuZGF0YS5jYXJkQ29sSW5mby5jb2RlKVxuICAgICAgICAvLyB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogc2VsZWN0ZWRDYXJkSW5mby5jb2RlLCBkYXRhOnNlbGVjdGVkQ2FyZEluZm8sIGNhcmRSZWY6c2VsZWN0ZWRDYXJkSW5mby5jYXJkUmVmLCBpc1VwZGF0ZTogdHJ1ZX0pXG4gICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBmb3Igc2VsZWN0ZWQgdGVybSBpbiBjYXNlIG9mIGNyZWF0ZSBzY2VuYXJpbywgaW4gY2FzZSBvZiBlZGl0IHNjZW5hcmlvIHRoaXMgd29uJ3QgYmUgYXZhaWFibGUgXG4gICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAgIC8vIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiB7fVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIGNvbnN0IGZvdW5kID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbmQoYz0+IGMuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBmYWxzZVxuICAgICAgICAgIC8vIGlmKCFmb3VuZCkge1xuXG4gICAgICAgICAgICAvLyBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBwYXJlbnQgJiYgcGFyZW50LmNoaWxkcmVuID9bLi4ucGFyZW50LmNoaWxkcmVuLCAuLi50aGlzLnNlbGVjdGVkVGVybUFycmF5XTp0aGlzLnNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgICAvLyBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzLnNlbGVjdGVkVGVybSkgOiBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBbdGhpcy5zZWxlY3RlZFRlcm1dXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IGZhbHNlXG4gICAgICAgICAgbGV0IHJldHVyblZhbHVlIDogYW55ID0gdHJ1ZVxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICBhd2FpdCByZXR1cm5WYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA6IGFueSA9IHRydWVcbiAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgYXdhaXQgcmV0dXJuVmFsdWVcbiAgICAgICAgfVxuICAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgVGVybSBBc3NvY2lhdGlvbiBmYWlsZWQuYClcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyOiBhbnksIHBhcmVudDogYW55LCByZWd1ZXN0Qm9keTogYW55ICk6IFByb21pc2U8YW55PntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoY291bnRlciA9PT0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Quc2l6ZSkge1xuICAgICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRUZXJtWydhc3NvY2lhdGlvblByb3BlcnRpZXMnXVsnYXBwcm92YWxTdGF0dXMnXSA9ICdEcmFmdCc7XG4gIFxuICAgICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgZm9yIHNlbGVjdGVkIHRlcm0gaW4gY2FzZSBvZiBjcmVhdGUgc2NlbmFyaW8sIGluIGNhc2Ugb2YgZWRpdCBzY2VuYXJpbyB0aGlzIHdvbid0IGJlIGF2YWlhYmxlIFxuICAgICAgICAgIC8vIHNvIHRlcm0gaXMgc2V0IGZyb20gY2hpbGRkYXRhIHdoaWNoIGlzIHJlY2VpdmVkIGZyb20gcGFyYW1zIGluIHVwZGF0ZURhdGFcbiAgICAgICAgICAvLyBjb25zdCB2YWx1ZSA9ICh0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA/IHRoaXMuc2VsZWN0ZWRUZXJtIDoge31cbiAgICAgICAgICBjb25zdCBmb3VuZCA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5maW5kKChjOmFueSk9PiBjLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogZmFsc2VcbiAgICAgICAgICBpZighZm91bmQpIHtcbiAgICAgICAgICAgIHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMuc2VsZWN0ZWRUZXJtKSA6IHBhcmVudFsnY2hpbGRyZW4nXSA9IFt0aGlzLnNlbGVjdGVkVGVybV1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgOiBhbnkgPSB0cnVlXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIGF3YWl0IHJldHVyblZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHJldHVyblZhbHVlIDogYW55ID0gdHJ1ZVxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICBhd2FpdCByZXR1cm5WYWx1ZVxuICAgICAgICB9XG4gICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlVGVybURhdGEoZm9ybTphbnksIGRhdGE6IGFueSkge1xuICAgIHRoaXMuZGlzYWJsZVVwZGF0ZSA9IHRydWVcbiAgICBjb25zdCBmb3JtRGF0YSA9IHtcbiAgICAgIC8vIHVzZSB0aGlzIGlmIHlvdSBuZWVkIGRpc2FibGVkIGZpZWxkIHZhbHVlcyA6IGZvcm0uZ2V0UmF3VmFsdWUoKVxuICAgICAgLi4uZm9ybS52YWx1ZVxuICAgIH1cbiAgICBjb25zdCB1cGRhdGVEYXRhID0ge1xuICAgICAgZm9ybURhdGEsXG4gICAgICB1cGRhdGVUZXJtRGF0YTogZGF0YS5jaGlsZHJlbkRhdGFcbiAgICB9XG4gICAgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zKHVwZGF0ZURhdGEpXG4gIH1cblxuICB1cGRhdGVUZXJtQXNzb2NpYXRpb25zKHVwZGF0ZURhdGE/OiBhbnkpIHtcbiAgICBsZXQgYXNzb2NpYXRpb25zID0gW11cbiAgICBsZXQgdGVtcFxuICAgIGxldCBjb3VudGVyID0gMFxuICAgIC8vIGxldCBsb2NhbElzRXhpc3QgPSBmYWxzZVxuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmZvckVhY2goKHBhcmVudCkgPT4ge1xuICAgICAgY291bnRlcisrXG4gICAgICB0ZW1wID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbHRlcigoY2hpbGQ6YW55KSA9PiBjaGlsZC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IG51bGxcbiAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgIC8vIHJldHVybiB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGMuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzP2MuYXNzb2NpYXRpb25Qcm9wZXJ0aWVzLmFwcHJvdmFsU3RhdHVzOiAnRHJhZnQnIH1cbiAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgfSkgOiBbXVxuICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhc3NvY2lhdGlvbnMucHVzaCh7IGlkZW50aWZpZXI6IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIsIGFwcHJvdmFsU3RhdHVzOiBhcHBDb25zdGFudHMuRFJBRlQgfSlcbiAgICAgICAgaWYodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikge1xuICAgICAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNUZXJtRXhpc3QgPSBmYWxzZVxuICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICB0ZXJtOiB7XG4gICAgICAgICAgICAgIC4uLih1cGRhdGVEYXRhICYmIHVwZGF0ZURhdGEuZm9ybURhdGEgJiYgdXBkYXRlRGF0YS51cGRhdGVUZXJtRGF0YS5jb2RlID09PSBwYXJlbnQuY29kZSkgPyB7Li4udXBkYXRlRGF0YS5mb3JtRGF0YX06IG51bGwsXG4gICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgICAvLyB0aGlzLnNlbGVjdGVkVGVybVsnYXNzb2NpYXRpb25Qcm9wZXJ0aWVzJ11bJ2FwcHJvdmFsU3RhdHVzJ10gPSAnRHJhZnQnO1xuXG4gICAgICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgICAgIC8vIHNvIHRlcm0gaXMgc2V0IGZyb20gY2hpbGRkYXRhIHdoaWNoIGlzIHJlY2VpdmVkIGZyb20gcGFyYW1zIGluIHVwZGF0ZURhdGFcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiAodXBkYXRlRGF0YSkgPyB7Li4udXBkYXRlRGF0YS51cGRhdGVUZXJtRGF0YSwgLi4udXBkYXRlRGF0YS5mb3JtRGF0YX0gOiB7fVxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB7IC4uLnZhbHVlIH0sIGNyZWF0ZWQ6IHRydWUgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0sIChfZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFZGl0ICR7dGhpcy5kYXRhLmNvbHVtbkluZm8ubmFtZX0gZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyYClcbiAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBUZXJtIEFzc29jaWF0aW9uIGZhaWxlZC5gKVxuICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBkaWFsb2dDbG9zZSh0ZXJtOiBhbnkpIHtcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UucHVibGlzaEZyYW1ld29yaygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0ZXJtKVxuICAgIH0sKF9lcnI6YW55KT0+IHtcbiAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBQdWJsaXNoICBmYWlsZWQuYClcbiAgICB9KTtcbiAgfVxuXG5cblxuXG5cbiAgYXN5bmMgbXVsdGlDcmVhdGVTdWJUaGVtZShfZm9ybTogYW55LCBkYXRhOiBhbnkpIHtcbiAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IHRydWVcbiAgICBsZXQgZm9ybUFycmF5OmFueSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIGxldCBzZWxlY3RlZEZvcm1EYXRhOmFueSAgPSBmb3JtQXJyYXkuYXQoMCkuZ2V0KCdjb21wZXRlbmN5U3ViVGhlbWUnKS52YWx1ZVxuICAgIGxldCBwcmV2aW91c1N1YlRoZW1lRGF0YSA9IGRhdGEuY2hpbGRyZW5EYXRhLmNoaWxkcmVuXG4gICAgbGV0IG5ld2x5QWRkZWQ6IGFueSA9IFtdXG4gICAgbGV0IHJlbW92ZWRFeGlzdGluZzphbnkgPSBbXVxuICAgIGxldCBjcmVhdGVkU3ViVGhlbWUgPSBbXVxuICAgIGxldCBjb3VudGVyU3ViVGhlbWUgPSAwXG4gICAgLy8gbGV0IGNvdW50ZXJSZXRpcmVTdWJUaGVtZSA9IDBcbiAgICBcbiAgICBuZXdseUFkZGVkID0gXy5kaWZmZXJlbmNlQnkoc2VsZWN0ZWRGb3JtRGF0YSwgcHJldmlvdXNTdWJUaGVtZURhdGEsICdyZWZJZCcpO1xuICAgIHJlbW92ZWRFeGlzdGluZyA9IF8uZGlmZmVyZW5jZUJ5KHByZXZpb3VzU3ViVGhlbWVEYXRhLCBzZWxlY3RlZEZvcm1EYXRhLCAncmVmSWQnKTtcbiAgICBpZihuZXdseUFkZGVkICYmIG5ld2x5QWRkZWQubGVuZ3RoKSB7XG4gICAgICAgIC8vIG5ld2x5QWRkZWQuZm9yRWFjaChhc3luYyAodmFsLCBpKSA9PntcbiAgICAgICAgZm9yKGxldCB2YWwgb2YgbmV3bHlBZGRlZCl7XG4gICAgICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgICAgY29kZTogdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFV1aWQoKSxcbiAgICAgICAgICBuYW1lOiB2YWwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICAgIHN0YXR1czogYXBwQ29uc3RhbnRzLkxJVkUsXG4gICAgICAgICAgcmVmSWQ6IHZhbC5yZWZJZCxcbiAgICAgICAgICByZWZUeXBlOiB2YWwucmVmVHlwZSxcbiAgICAgICAgICAvLyBhcHByb3ZhbFN0YXR1czphcHBDb25zdGFudHMuRFJBRlQsXG4gICAgICAgICAgcGFyZW50czogW1xuICAgICAgICAgICAgeyBpZGVudGlmaWVyOiBgJHt0aGlzLmRhdGEuZnJhbWV3b3JrSWQudG9Mb3dlckNhc2UoKX1fJHt0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlfWAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpbWVTdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgdGVybTogdGVybVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGE6YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgIGxldCByZXNwb25zZURhdGE6IGFueSA9IGF3YWl0IHRoaXMuY3JhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtWydpZGVudGlmaWVyJ10gPSByZXNwb25zZURhdGEucmVzdWx0Lm5vZGVfaWRbMF1cbiAgICAgICAgICBjcmVhdGVkU3ViVGhlbWUucHVzaChyZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm0pXG4gICAgICAgICAgY291bnRlclN1YlRoZW1lKytcbiAgICAgICAgICBpZihjb3VudGVyU3ViVGhlbWUgPT09IG5ld2x5QWRkZWQubGVuZ3RoKXtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFN1YlRoZW1lLCBwYXJlbnRDb2wpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVGcmFtZXdvcmtMaXN0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHBhcmVudENvbCwgY3JlYXRlZFN1YlRoZW1lLCAnY3JlYXRlJylcbiAgICAgICAgICAgIGlmKCEocmVtb3ZlZEV4aXN0aW5nICYmIHJlbW92ZWRFeGlzdGluZy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbG9nQ2xvc2UoeyB0ZXJtOiB0aGlzLnNlbGVjdGVkVGVybUFycmF5LCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlLCBjYWxsVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgdGhlbWUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIFxuICAgIGlmKHJlbW92ZWRFeGlzdGluZyAmJiByZW1vdmVkRXhpc3RpbmcubGVuZ3RoKSB7XG4gICAgICBsZXQgcmVtb3ZlZFRlcm1zQ29sbGVjdGlvbiA9IFtdXG4gICAgICBmb3IobGV0IHJlbW92ZWRUZXJtIG9mIHJlbW92ZWRFeGlzdGluZykge1xuICAgICAgICByZW1vdmVkVGVybXNDb2xsZWN0aW9uLnB1c2gocmVtb3ZlZFRlcm0uY29kZSlcbiAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBzdWJUaGVtZVJlcXVlc3QgPXtcbiAgICAgICAgICBcInJlcXVlc3RcIjogeyBcbiAgICAgICAgICAgIFwiY29udGVudElkc1wiOiByZW1vdmVkVGVybXNDb2xsZWN0aW9uIFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgYXdhaXQgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnJldGlyZU11bHRpcGxlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHN1YlRoZW1lUmVxdWVzdCkudG9Qcm9taXNlKCkudGhlbihhc3luYyAoKSA9PiB7XG5cbiAgICAgICAgICAvLyBjb3VudGVyUmV0aXJlU3ViVGhlbWUrK1xuICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGE6YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuXG4gICAgICAgICAgLy8gbGV0IHNlY3Rpb25MaXN0ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBzZWN0aW9uTGlzdGNoaWxkcmVuTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChwYXJlbnRDb2wuY2hpbGRyZW4sIHJlbW92ZWRFeGlzdGluZywgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgICAgICBjb25zdCBzZWN0aW9uTGlzdEFzc29jaWF0aW9uTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChwYXJlbnRDb2wuYXNzb2NpYXRpb25zLCByZW1vdmVkRXhpc3RpbmcsIChhOmFueSwgYjogYW55KSA9PiBhLmlkZW50aWZpZXIgPT09IGIuaWRlbnRpZmllcik7XG4gICAgICAgICBcbiAgICAgICAgICBwYXJlbnRDb2xbJ2NoaWxkcmVuJ10gPSBzZWN0aW9uTGlzdGNoaWxkcmVuTGlzdFxuICAgICAgICAgIHBhcmVudENvbFsnYXNzb2NpYXRpb25zJ10gPSBzZWN0aW9uTGlzdEFzc29jaWF0aW9uTGlzdFxuICAgIFxuXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50Q29sLCByZW1vdmVkRXhpc3RpbmcsICdkZWxldGUnKVxuXG4gICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IFtdLCBjcmVhdGVkOiB0cnVlLCBtdWx0aTp0cnVlLCBjYWxsVXBkYXRlOiBmYWxzZSB9KVxuICAgICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiBwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUsIGRhdGE6IHBhcmVudENvbCwgY2FyZFJlZjogcGFyZW50Q29sLmNhcmRSZWYgfSk7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYENvbXBldGVuY3kgdGhlbWUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuYClcblxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgfVxuXG4gIG9uRGlzYWJsZVRoZW1lKG9wdGlvbjogYW55KXtcbiAgICBjb25zdCBwYXJlbnRDb2x1bW5Db25maWdEYXRhOmFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICBsZXQgcmVzdWx0ID0gLTFcbiAgICBpZihwYXJlbnRDb2wgJiYgcGFyZW50Q29sLmNoaWxkcmVuICYmIHBhcmVudENvbC5jaGlsZHJlbi5sZW5ndGgpe1xuICAgICAgcmVzdWx0ID0gcGFyZW50Q29sLmNoaWxkcmVuLmZpbmRJbmRleCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYoIChlbGUucmVmVHlwZSA9PT0gJ3RoZW1lJykgICYmICh0aGlzLnNlbGV0ZWRDb21wZXRlbmN5QXJlYS5jb2RlID09PSBlbGUuYWRkaXRpb25hbFByb3BlcnRpZXMuY29tcGV0ZW5jeUFyZWEuY29kZSkpIHtcbiAgICAgICAgcmV0dXJuICBlbGUucmVmSWQgPT09IG9wdGlvbi5yZWZJZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZihyZXN1bHQgPCAwKXtcbiAgICAgIGxldCBmb3JtQXJyYXkgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICAgIHJlc3VsdCA9IGZvcm1BcnJheS52YWx1ZS5maW5kSW5kZXgoKGZvcm1FbGU6IGFueSkgPT4ge1xuICAgICAgICBpZihmb3JtRWxlLmNvbXBldGVuY3lUaGVtZSAmJiBmb3JtRWxlLmNvbXBldGVuY3lUaGVtZS5yZWZJZCApe1xuICAgICAgICAgIHJldHVybiAgZm9ybUVsZS5jb21wZXRlbmN5VGhlbWUucmVmSWQgPT09IG9wdGlvbi5yZWZJZFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfSk7XG4gICAgIH1cbiBcbiAgICAvLyBcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0ID49IDAgPyB0cnVlOiBmYWxzZVxuICB9XG5cblxuICB1cGRhdGVMb2NhbExpc3QoaXRlbTogYW55LCBwYXJlbnQ6IGFueSxzZWxlY3RlZFRlcm1BcnJheTogYW55LCB1cGRhdGVUeXBlPzphbnkpIHtcbiAgICBpZihpdGVtICYmIGl0ZW0uY2hpbGRyZW4gJiYgaXRlbS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGlmKHVwZGF0ZVR5cGUgPT09ICdkZWxldGUnKXtcbiAgICAgICAgaXRlbS5jaGlsZHJlbi5mb3JFYWNoKChpdG1EYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZihpdG1EYXRhLmlkZW50aWZpZXIgPT09IHBhcmVudC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAvLyBsZXQgZGlmZmVyZW5jZURhdGEgPSBbXVxuICAgICAgICAgICAgLy8gaWYoaXRtRGF0YSAmJiBpdG1EYXRhLmNoaWxkcmVuICYmIGl0bURhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyAgIGRpZmZlcmVuY2VEYXRhICA9IF8uZGlmZmVyZW5jZUJ5KGl0bURhdGEuY2hpbGRyZW4sc2VsZWN0ZWRUZXJtQXJyYXksICdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICBkaWZmZXJlbmNlRGF0YSA9IHNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBkaWZmZXJlbmNlRGF0YSA9IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICAgIGNvbnN0IGFzc29jaWF0aW9uTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChpdG1EYXRhLmFzc29jaWF0aW9ucyxzZWxlY3RlZFRlcm1BcnJheSwgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChpdG1EYXRhLmNoaWxkcmVuLCBzZWxlY3RlZFRlcm1BcnJheSwgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGl0bURhdGFbJ2Fzc29jaWF0aW9ucyddID0gYXNzb2NpYXRpb25MaXN0XG4gICAgICAgICAgICBpdG1EYXRhWydjaGlsZHJlbiddID0gY2hpbGRyZW5MaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGl0bURhdGEuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9jYWxMaXN0KGl0bURhdGEsIHBhcmVudCxzZWxlY3RlZFRlcm1BcnJheSx1cGRhdGVUeXBlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaCgoaXRtRGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgaWYoaXRtRGF0YS5pZGVudGlmaWVyID09PSBwYXJlbnQuaWRlbnRpZmllcikge1xuICAgICAgICAgICAgbGV0IGRpZmZlcmVuY2VEYXRhID0gW11cbiAgICAgICAgICAgIGlmKGl0bURhdGEgJiYgaXRtRGF0YS5jaGlsZHJlbiAmJiBpdG1EYXRhLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICBkaWZmZXJlbmNlRGF0YSAgPSBfLmRpZmZlcmVuY2VCeShzZWxlY3RlZFRlcm1BcnJheSxpdG1EYXRhLmNoaWxkcmVuLCAnaWRlbnRpZmllcicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGlmZmVyZW5jZURhdGEgPSBzZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZGlmZmVyZW5jZURhdGEgPSB0aGlzLnNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgICBpdG1EYXRhWydhc3NvY2lhdGlvbnMnXSA9IGl0bURhdGEgJiYgaXRtRGF0YS5hc3NvY2lhdGlvbnMgP1suLi5pdG1EYXRhLmFzc29jaWF0aW9ucywgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG4gICAgICAgICAgICBpdG1EYXRhWydjaGlsZHJlbiddID0gaXRtRGF0YSAmJiBpdG1EYXRhLmNoaWxkcmVuID9bLi4uaXRtRGF0YS5jaGlsZHJlbiwgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGl0bURhdGEuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9jYWxMaXN0KGl0bURhdGEsIHBhcmVudCwgc2VsZWN0ZWRUZXJtQXJyYXkpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVRoZW1lKCkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIGNvbnN0IGNhcmREYXRhID0gdGhpcy5kYXRhLmNoaWxkcmVuRGF0YVxuICAgIGxldCByZW1vdmVkTGlzdFRlcm0gPSBbXVxuICAgIHJlbW92ZWRMaXN0VGVybS5wdXNoKGNhcmREYXRhLmNvZGUpXG4gICAgbGV0IHN1YlRoZW1lUmVxdWVzdCA9e1xuICAgICAgXCJyZXF1ZXN0XCI6IHsgXG4gICAgICAgIFwiY29udGVudElkc1wiOiByZW1vdmVkTGlzdFRlcm1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnJldGlyZU11bHRpcGxlVGVybSh0aGlzLmZyYW1lV29ya1NlcnZpY2UuZnJhbWV3b3JrSWQsIGNhcmREYXRhLmNhdGVnb3J5LCBzdWJUaGVtZVJlcXVlc3QpLnRvUHJvbWlzZSgpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgXG4gICAgICBsZXQgcmVtb3ZlZEV4aXN0aW5nID0gW2NhcmREYXRhXVxuICAgICAgY29uc3QgcGFyZW50Q29sdW1uQ29uZmlnRGF0YTphbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeShjYXJkRGF0YS5jYXRlZ29yeSlcbiAgICAgIGxldCBwYXJlbnRDb2w6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUpXG4gICAgXG4gICAgICBjb25zdCBzZWN0aW9uTGlzdGNoaWxkcmVuTGlzdDogYW55ID0gXy5kaWZmZXJlbmNlV2l0aChwYXJlbnRDb2wuY2hpbGRyZW4sIHJlbW92ZWRFeGlzdGluZywgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgIGNvbnN0IHNlY3Rpb25MaXN0QXNzb2NpYXRpb25MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKHBhcmVudENvbC5hc3NvY2lhdGlvbnMsIHJlbW92ZWRFeGlzdGluZywgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICBcbiAgICAgIHBhcmVudENvbFsnY2hpbGRyZW4nXSA9IHNlY3Rpb25MaXN0Y2hpbGRyZW5MaXN0XG4gICAgICBwYXJlbnRDb2xbJ2Fzc29jaWF0aW9ucyddID0gc2VjdGlvbkxpc3RBc3NvY2lhdGlvbkxpc3RcbiAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVGcmFtZXdvcmtMaXN0KGNhcmREYXRhLmNhdGVnb3J5LCBwYXJlbnRDb2wsIHJlbW92ZWRFeGlzdGluZywgJ2RlbGV0ZScpXG4gICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3VycmVudFNlbGVjdGlvbi5uZXh0KHsgdHlwZTogcGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlLCBkYXRhOiBwYXJlbnRDb2wsIGNhcmRSZWY6IHBhcmVudENvbC5jYXJkUmVmIH0pXG4gICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHt9KVxuICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSB0aGVtZSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgIH0sKChfZXJyOiBhbnkpPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSB0aGVtZSBkZWxldGUgZmFpbGVkLmApXG4gICAgfSkpXG4gIH1cblxuXG4gIC8vIGdldHRlciBtZXRob2RzXG5cbiAgZ2V0IGNvbXBUaGVtZUZpZWxkcygpOiBVbnR5cGVkRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gIH1cblxufVxuIiwiXG48ZGl2IGNsYXNzPVwiXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc2FibGVNdWx0aUNyZWF0ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LTEgdy0xMDAgYWJzb2x1dGUgbG9hZGVyLWJnIGl0ZW1zLWNlbnRlciBwdC01IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPG1hdC1zcGlubmVyIGNsYXNzPVwiZGlzcGxheS1pbmxpbmUtYmxvY2sgbWItNVwiIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICA8IS0tIDxwPnt7bG9hZGVyTXNnfX08L3A+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZ05ld1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vZGFsVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBpMThuLWFyaWEtbGFiZWwgYXJpYS1sYWJlbD1cImFjdGlvbiBpdGVtc1wiXG4gICAgICAgICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY2FyZE1lbnVcIiBbbWF0TWVudVRyaWdnZXJEYXRhXT1cInsnZGF0YSc6ZGF0YX1cIiBjbGFzcz1cImFjdGlvbi1idG5cIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVybSBvZiBkYXRhPy5zZWxlY3RlZFBhcmVudFRlcm1zXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRlcm0uY2F0ZWdvcnkgIT09ICdjb21wZXRlbmN5J1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbFwiIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmcmFtZVdvcmtTZXJ2aWNlLmdldENvbmZpZyh0ZXJtLmNhdGVnb3J5KS5sYWJlbE5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IG5hbWU9XCJuYW1lXCIgaWQ9XCJuYW1lXCIgI25hbWUgcGxhY2Vob2xkZXI9XCJ7e2FwcF9zdHJpbmdzLm5hbWV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0ZXJtLm5hbWVcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBldGVuY3lGb3JtXCI+XG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNvbXBldGVuY3lGb3JtXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIiBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snU2VsZWN0IEFyZWEnfX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgY2xhc3M9XCJjb21wZXRlbmN5LWdyb3VwXCIgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiBvcHRpb25cIiBmb3JtQ29udHJvbE5hbWU9XCJjb21wQXJlYVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uICBbZGlzYWJsZWRdPVwiZGF0YT8uY29sdW1uSW5mbz8uY29kZSA9PT0gJ3N1YnRoZW1lJyB8fCBkYXRhLm9wZW5Nb2RlID09PSd2aWV3J1wiIGNsYXNzPVwibGVhcm5pbmctc2VjdGlvblwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWJ0bic6aXRlbT8uY29kZSA9PT0gc2VsZXRlZENvbXBldGVuY3lBcmVhPy5jb2RlfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbXBldGVuY3lBcmVhPy5jaGlsZHJlblwiIFt2YWx1ZV09XCJpdGVtXCIgW2NoZWNrZWRdPVwiaXRlbT8uY29kZSA9PT0gc2VsZXRlZENvbXBldGVuY3lBcmVhPy5jb2RlXCIgKGNoYW5nZSk9XCJjbGVhclNlbGVjdGVkVGhlbWVzKGl0ZW0pXCI+e3tpdGVtLm5hbWV9fTwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtZW5kIG1iLTRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgIT09ICdzdWJ0aGVtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYXQtYnV0dG9uIGZsZXggaXRlbXMtY2VudGVyIGNyZWF0ZS1hY2NvcmRpb24tYnRuXCIgKm5nSWY9XCJkYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCIgKGNsaWNrKT1cImFkZENvbXBldGVuY3lUaGVtZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci0yIG1hdC1pY29uLWN1c3RvbSBcIj5hZGRfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIG1vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3tkYXRhLmNvbHVtbkluZm8ubmFtZX19ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYWNjb3JkaW9uIGZvcm1BcnJheU5hbWU9XCJjb21wVGhlbWVGaWVsZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCAqbmdGb3I9XCJsZXQgZmllbGQgb2YgY29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ107IGxldCBpID0gaW5kZXg7IGxldCBpc0ZpcnN0ID0gZmlyc3RcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hcmdpbi1ib3R0b20tbCBjb21wLXRoZW1lLWZpZWxkc1wiIFtmb3JtR3JvdXBOYW1lXT1cImlcIiBbZXhwYW5kZWRdPVwiaXNGaXJzdFwiPiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV1bJ2NvbnRyb2xzJ10/LmNvbXBldGVuY3lUaGVtZT8udmFsdWU/Lm5hbWV9fSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgIT09ICdzdWJ0aGVtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNvbXBGaWVsZHMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1jdXN0b20gXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlciBtYXJnaW4tdG9wLXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhLm9wZW5Nb2RlICE9PSAndmlldyc/ICdTZWxlY3QgQ29tcGV0ZW5jeSBUaGVtZSc6ICdDb21wZXRlbmN5IFRoZW1lIE5hbWUnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtkaXNhYmxlZF09XCJkYXRhPy5jb2x1bW5JbmZvPy5jb2RlID09PSAnc3VidGhlbWUnIHx8IGRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgdGhlIENvbXBldGVuY3kgVGhlbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJjb21wZXRlbmN5VGhlbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVRoZW1lXCIgIFt2YWx1ZV09XCJvcHRpb25cIiBbZGlzYWJsZWRdPVwib25EaXNhYmxlVGhlbWUob3B0aW9uKSB8fCBkYXRhLm9wZW5Nb2RlID09PSd2aWV3J1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblNlbGVjdGlvbkNoYW5nZSk9XCJPblRoZW1lU2VsZWN0aW9uKCRldmVudCwgaSwgb3B0aW9uKVwiICA+e3tvcHRpb24ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbi5yZWZJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMiByZWYtaWRcIj4oe3tvcHRpb24ucmVmSWR9fSk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc1Rlcm1FeGlzdFwiPnt7YXBwX3N0cmluZ3MuYWxyZWFkeUV4aXN0fX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZm5hbWVcIiBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvcm0tbGFiZWwgcmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bj1cIkZpcnN0IE5hbWUgbGFiZWx8TGFiZWwgd2hpY2ggZXhwbGFpbnMgdGhlIHVzZXIgdG8gZW50ZXIgZmlyc3QgbmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLWFyaWEtbGFiZWwgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXRhLm9wZW5Nb2RlICE9PSAndmlldyc/ICdTZWxlY3QgQ29tcGV0ZW5jeSBTdWItVGhlbWUnOiAnQ29tcGV0ZW5jeSBTdWItVGhlbWUgTmFtZSd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiQ2hvb3NlIHRoZSBDb21wZXRlbmN5IFRoZW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVN1YlRoZW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZGFsbENvbXBldGVuY3lTdWJUaGVtZVwiIFt2YWx1ZV09XCJvcHRpb25cIj57e29wdGlvbi5uYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHt7Y29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV1bJ2NvbnRyb2xzJ10/LmNvbXBldGVuY3lTdWJUaGVtZT8udmFsdWUgfGpzb259fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGwgZmllbGQtaGVpZ2h0XCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgY2xhc3M9XCIgcGxhY2Vob2xkZXItdGV4dFwiIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIHRoZSBDb21wZXRlbmN5IFN1Yi1UaGVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lTdWJUaGVtZVwiIG11bHRpcGxlIFtkaXNhYmxlZF09XCJkYXRhLm9wZW5Nb2RlID09PSd2aWV3J1wiIHBhbmVsQ2xhc3M9XCJmdWxsLXdpZHRoLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gW25nQ2xhc3NdPVwieydkaXNiYWxlZFNlbGVjdCc6aXNIaWRlRGF0YX1cIiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlciA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLWxpc3Rib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV1bJ2NvbnRyb2xzJ10/LmNvbXBldGVuY3lTdWJUaGVtZT8udmFsdWVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkKT1cIm9uVGVybVJlbW92ZShpdGVtLCBpKVwiIFtkaXNhYmxlZF09XCJkYXRhLm9wZW5Nb2RlID09PSd2aWV3J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3N1Yi10aGVtZS1kaXNhYmxlJzogZGF0YT8ub3Blbk1vZGUgPT09J3ZpZXcnfVwiICBbcmVtb3ZhYmxlXT1cImRhdGE/Lm9wZW5Nb2RlID09PSd2aWV3Jz8gZmFsc2U6IHRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gPnt7IGl0ZW0ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1saXN0Ym94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e2NvbXBldGVuY3lGb3JtPy5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIHxqc29ufX0gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cIm5ldmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI3NlYXJjaCBhdXRvY29tcGxldGU9XCJvZmZcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaFwiIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lTdWJUaGVtZVwiIG1hdElucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGdyb3VwPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRncm91cCAqbmdJZj1cImZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+Tm8gcmVzdWx0cyBmb3VuZCE8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiByZXF1ZXN0T2JqRGF0YS5wcmVmZXJyZWRQcm92aWRlclwiIFt2YWx1ZV09XCJvcHRpb24ucHJvdmlkZXJOYW1lXCI+e3tvcHRpb24ucHJvdmlkZXJOYW1lfX08L21hdC1vcHRpb24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgY29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJylbJ2NvbnRyb2xzJ11baV1bJ2NvbnRyb2xzJ10/LmNvbXBldGVuY3lUaGVtZT8udmFsdWU/LmNoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uXCIgY2xhc3M9XCJtYXQtb3B0aW9uLWxpc3RcIj57e29wdGlvbj8ubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb24/LnJlZklkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTIgcmVmLWlkXCI+KHt7b3B0aW9uPy5yZWZJZH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWVycm9yICpuZ0lmPVwicmVxdWVzdEZvcm0uY29udHJvbHNbJ3Byb3ZpZGVyVGV4dCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgdXAgdG8gZml2ZSBwcmVmZXJyZWQgcHJvdmlkZXJzIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWFjY29yZGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb290ZXIgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cImRlZmF1bHRcIiB0eXBlPVwicmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGlhbG9nQ2xvc2UoJycpXCI+e3thcHBfc3RyaW5ncy5jYW5jZWx9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJyAmJiBkYXRhLm9wZW5Nb2RlICE9PSd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJzdWJtaXRcIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybT8uaW52YWxpZFwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLmNyZWF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnICYmIGRhdGEub3Blbk1vZGUgIT09J3ZpZXcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5jb2x1bW5JbmZvPy5jb2RlICE9PSAnc3VidGhlbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybS5pbnZhbGlkIHx8IGRpc2FibGVNdWx0aUNyZWF0ZVwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIiAoY2xpY2spPVwibXVsdGlDcmVhdGUoY29tcGV0ZW5jeUZvcm0sIGRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmNyZWF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5jb2x1bW5JbmZvPy5jb2RlID09PSAnc3VidGhlbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVswXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVN1YlRoZW1lPy52YWx1ZT8ubGVuZ3RoO2Vsc2UgdXBkYXRlQnRuXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybS5pbnZhbGlkIHx8IGRpc2FibGVNdWx0aUNyZWF0ZVwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIiAoY2xpY2spPVwibXVsdGlDcmVhdGVTdWJUaGVtZShjb21wZXRlbmN5Rm9ybSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLnVwZGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctdGVtcGxhdGUgI3VwZGF0ZUJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29tcGV0ZW5jeUZvcm0uaW52YWxpZCB8fCBkaXNhYmxlTXVsdGlDcmVhdGVcIiAqbmdJZj1cIiFkaXNhYmxlQ3JlYXRlXCIgKGNsaWNrKT1cIm11bHRpQ3JlYXRlU3ViVGhlbWUoY29tcGV0ZW5jeUZvcm0sIGRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcHBfc3RyaW5ncy5kZWxldGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCcgJiYgZGF0YS5vcGVuTW9kZSAhPT0ndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVGVybURhdGEoY29tcGV0ZW5jeUZvcm0sIGRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybT8uaW52YWxpZCB8fCBkaXNhYmxlVXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIj57e2FwcF9zdHJpbmdzLnVwZGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICA8L2Rpdj5cbiAgICBcbiAgICBcbiAgICA8IS0tIFRpdGxlIG9mIHRoZSBwb3B1cCAtLT5cbiAgICA8bmctdGVtcGxhdGUgI21vZGFsVGl0bGU+XG4gICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnIHx8IGRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT57e2RhdGEuY29sdW1uSW5mby5uYW1lID09PSAnVGhlbWUnID8gYXBwX3N0cmluZ3MuYWRkQ29tcGV0ZW5jeSA6IGFwcF9zdHJpbmdzLmNyZWF0ZU5ld319IHt7ZGF0YS5jb2x1bW5JbmZvLm5hbWV9fTwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgIDwhLS0ge3tkYXRhIHxqc29ufX0gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnY3JlYXRlJyB8fCBkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIG1hdC1kaWFsb2ctdGl0bGU+e3tnZXRDcmVhdGVOYW1lKGRhdGEpfX08L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICd2aWV3J1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy10aXRsZVwiIG1hdC1kaWFsb2ctdGl0bGU+VmlldyB7e2RhdGEuY29sdW1uSW5mby5uYW1lfX08L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2VkaXQnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT57e2FwcF9zdHJpbmdzLmVkaXR9fSB7e2RhdGEuY29sdW1uSW5mby5uYW1lfX08L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuXG5cbjxtYXQtbWVudSAjY2FyZE1lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJtZW51LXNlY1wiPlxuICAgIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudCBsZXQtcm93RGF0YT1cImRhdGFcIiBsZXQtY2FyZFJlZj1cImNhcmRSZWZcIj5cbiAgICAgICAgPGJ1dHRvbiAgKGNsaWNrKT1cImRlbGV0ZVRoZW1lKClcIlxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbSBuYW1lPVwiY2hhbm5lbC1hbmFseXRpY3MtYnV0dG9uXCIgY2xhc3M9XCJ3cy1tYXQtcHJpbWFyeS10ZXh0XCIgaTE4bi1hcmlhLWxhYmVsXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQW5hbHl0aWNzXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPkRlbGV0ZTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+Il19
|