@sunbird-cb/tree-hierarchy 0.0.1-cbrelease-4.8.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/components/action-bar/action-bar.component.mjs +41 -0
  3. package/esm2022/lib/components/approval/approval.component.mjs +19 -0
  4. package/esm2022/lib/components/approve-view/approve-view.component.mjs +64 -0
  5. package/esm2022/lib/components/categories-preview/categories-preview.component.mjs +44 -0
  6. package/esm2022/lib/components/conforamtion-popup/conforamtion-popup.component.mjs +74 -0
  7. package/esm2022/lib/components/connector/connector.component.mjs +59 -0
  8. package/esm2022/lib/components/create-categories/create-categories.component.mjs +83 -0
  9. package/esm2022/lib/components/create-term/create-term.component.mjs +847 -0
  10. package/esm2022/lib/components/create-term-from-framework/create-term-from-framework.component.mjs +823 -0
  11. package/esm2022/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.mjs +149 -0
  12. package/esm2022/lib/components/pending-approval/pending-approval.component.mjs +64 -0
  13. package/esm2022/lib/components/term-card/term-card.component.mjs +311 -0
  14. package/esm2022/lib/components/tree-column-view/tree-column-view.component.mjs +322 -0
  15. package/esm2022/lib/components/tree-view/tree-view.component.mjs +497 -0
  16. package/esm2022/lib/constants/app-constant.mjs +40 -0
  17. package/esm2022/lib/constants/data.mjs +6972 -0
  18. package/esm2022/lib/containers/config-framework/config-framework.component.mjs +92 -0
  19. package/esm2022/lib/containers/dashboard/dashboard.component.mjs +14 -0
  20. package/esm2022/lib/labels/strings.mjs +40 -0
  21. package/esm2022/lib/models/approval.model.mjs +2 -0
  22. package/esm2022/lib/models/connection-type.model.mjs +2 -0
  23. package/esm2022/lib/models/connection.model.mjs +2 -0
  24. package/esm2022/lib/models/framework.model.mjs +2 -0
  25. package/esm2022/lib/models/variable-type.model.mjs +2 -0
  26. package/esm2022/lib/pipes/order-by.pipe.mjs +35 -0
  27. package/esm2022/lib/services/approval.service.mjs +47 -0
  28. package/esm2022/lib/services/connection.service.mjs +3 -0
  29. package/esm2022/lib/services/connector.service.mjs +240 -0
  30. package/esm2022/lib/services/framework.service.mjs +387 -0
  31. package/esm2022/lib/services/local-connection.service.mjs +75 -0
  32. package/esm2022/lib/services/odcs.service.mjs +23 -0
  33. package/esm2022/lib/tree-hierarchy-routing.module.mjs +43 -0
  34. package/esm2022/lib/tree-hierarchy.component.mjs +24 -0
  35. package/esm2022/lib/tree-hierarchy.module.mjs +138 -0
  36. package/esm2022/lib/tree-hierarchy.service.mjs +41 -0
  37. package/esm2022/material.module.mjs +199 -0
  38. package/esm2022/public-api.mjs +9 -0
  39. package/esm2022/sunbird-cb-tree-hierarchy.mjs +2 -0
  40. package/fesm2022/sunbird-cb-tree-hierarchy.mjs +11577 -0
  41. package/fesm2022/sunbird-cb-tree-hierarchy.mjs.map +1 -0
  42. package/index.d.ts +3 -0
  43. package/lib/components/action-bar/action-bar.component.d.ts +17 -0
  44. package/lib/components/action-bar/action-bar.component.d.ts.map +1 -0
  45. package/lib/components/approval/approval.component.d.ts +10 -0
  46. package/lib/components/approval/approval.component.d.ts.map +1 -0
  47. package/lib/components/approve-view/approve-view.component.d.ts +27 -0
  48. package/lib/components/approve-view/approve-view.component.d.ts.map +1 -0
  49. package/lib/components/categories-preview/categories-preview.component.d.ts +14 -0
  50. package/lib/components/categories-preview/categories-preview.component.d.ts.map +1 -0
  51. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts +20 -0
  52. package/lib/components/conforamtion-popup/conforamtion-popup.component.d.ts.map +1 -0
  53. package/lib/components/connector/connector.component.d.ts +23 -0
  54. package/lib/components/connector/connector.component.d.ts.map +1 -0
  55. package/lib/components/create-categories/create-categories.component.d.ts +26 -0
  56. package/lib/components/create-categories/create-categories.component.d.ts.map +1 -0
  57. package/lib/components/create-term/create-term.component.d.ts +148 -0
  58. package/lib/components/create-term/create-term.component.d.ts.map +1 -0
  59. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts +105 -0
  60. package/lib/components/create-term-from-framework/create-term-from-framework.component.d.ts.map +1 -0
  61. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts +31 -0
  62. package/lib/components/org-hierarchy-add-modal/org-hierarchy-add-modal.component.d.ts.map +1 -0
  63. package/lib/components/pending-approval/pending-approval.component.d.ts +21 -0
  64. package/lib/components/pending-approval/pending-approval.component.d.ts.map +1 -0
  65. package/lib/components/term-card/term-card.component.d.ts +43 -0
  66. package/lib/components/term-card/term-card.component.d.ts.map +1 -0
  67. package/lib/components/tree-column-view/tree-column-view.component.d.ts +52 -0
  68. package/lib/components/tree-column-view/tree-column-view.component.d.ts.map +1 -0
  69. package/lib/components/tree-view/tree-view.component.d.ts +91 -0
  70. package/lib/components/tree-view/tree-view.component.d.ts.map +1 -0
  71. package/lib/constants/app-constant.d.ts +44 -0
  72. package/lib/constants/app-constant.d.ts.map +1 -0
  73. package/lib/constants/data.d.ts +117 -0
  74. package/lib/constants/data.d.ts.map +1 -0
  75. package/lib/containers/config-framework/config-framework.component.d.ts +32 -0
  76. package/lib/containers/config-framework/config-framework.component.d.ts.map +1 -0
  77. package/lib/containers/dashboard/dashboard.component.d.ts +9 -0
  78. package/lib/containers/dashboard/dashboard.component.d.ts.map +1 -0
  79. package/lib/labels/strings.d.ts +40 -0
  80. package/lib/labels/strings.d.ts.map +1 -0
  81. package/lib/models/approval.model.d.ts +11 -0
  82. package/lib/models/approval.model.d.ts.map +1 -0
  83. package/lib/models/connection-type.model.d.ts +6 -0
  84. package/lib/models/connection-type.model.d.ts.map +1 -0
  85. package/lib/models/connection.model.d.ts +7 -0
  86. package/lib/models/connection.model.d.ts.map +1 -0
  87. package/lib/models/framework.model.d.ts +88 -0
  88. package/lib/models/framework.model.d.ts.map +1 -0
  89. package/lib/models/variable-type.model.d.ts +46 -0
  90. package/lib/models/variable-type.model.d.ts.map +1 -0
  91. package/lib/pipes/order-by.pipe.d.ts +10 -0
  92. package/lib/pipes/order-by.pipe.d.ts.map +1 -0
  93. package/lib/services/approval.service.d.ts +21 -0
  94. package/lib/services/approval.service.d.ts.map +1 -0
  95. package/lib/services/connection.service.d.ts +4 -0
  96. package/lib/services/connection.service.d.ts.map +1 -0
  97. package/lib/services/connector.service.d.ts +17 -0
  98. package/lib/services/connector.service.d.ts.map +1 -0
  99. package/lib/services/framework.service.d.ts +82 -0
  100. package/lib/services/framework.service.d.ts.map +1 -0
  101. package/lib/services/local-connection.service.d.ts +18 -0
  102. package/lib/services/local-connection.service.d.ts.map +1 -0
  103. package/lib/services/odcs.service.d.ts +11 -0
  104. package/lib/services/odcs.service.d.ts.map +1 -0
  105. package/lib/tree-hierarchy-routing.module.d.ts +8 -0
  106. package/lib/tree-hierarchy-routing.module.d.ts.map +1 -0
  107. package/lib/tree-hierarchy.component.d.ts +13 -0
  108. package/lib/tree-hierarchy.component.d.ts.map +1 -0
  109. package/lib/tree-hierarchy.module.d.ts +31 -0
  110. package/lib/tree-hierarchy.module.d.ts.map +1 -0
  111. package/lib/tree-hierarchy.service.d.ts +17 -0
  112. package/lib/tree-hierarchy.service.d.ts.map +1 -0
  113. package/material.module.d.ts +52 -0
  114. package/material.module.d.ts.map +1 -0
  115. package/package.json +43 -0
  116. package/public-api.d.ts +9 -0
  117. package/public-api.d.ts.map +1 -0
  118. package/sunbird-cb-tree-hierarchy.d.ts.map +1 -0
@@ -0,0 +1,823 @@
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/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
+ export class CreateTermFromFrameworkComponent {
27
+ constructor(dialogRef, data, dialog, frameWorkService, fb, _snackBar) {
28
+ this.dialogRef = dialogRef;
29
+ this.data = data;
30
+ this.dialog = dialog;
31
+ this.frameWorkService = frameWorkService;
32
+ this.fb = fb;
33
+ this._snackBar = _snackBar;
34
+ this.app_strings = labels;
35
+ this.selectedTerm = {};
36
+ this.selectedTermArray = [];
37
+ this.isTermExist = false;
38
+ this.disableCreate = false;
39
+ this.disableMultiCreate = false;
40
+ this.disableUpdate = false;
41
+ this.kcmList = new Map();
42
+ this.allCompetency = [];
43
+ this.allCompetencyTheme = [];
44
+ this.filteredallCompetencyTheme = [];
45
+ this.allCompetencySubtheme = [];
46
+ this.filteredallCompetencySubTheme = [];
47
+ }
48
+ ngOnInit() {
49
+ this.environment = this.frameWorkService.getEnviroment();
50
+ this.getComptencyData();
51
+ this.kcmConfigData = this.frameWorkService.getConfigByFrameWorkId(this.environment.kcmFrameworkName);
52
+ this.competencyForm = this.fb.group({
53
+ compArea: ['', Validators.required],
54
+ compThemeFields: this.fb.array([this.createCompThemeFields()])
55
+ });
56
+ }
57
+ getComptencyData() {
58
+ this.frameWorkService.getFrameworkRead(this.environment.kcmFrameworkName).subscribe((data) => {
59
+ if (data.categories) {
60
+ this.formateData(data, this.environment.kcmFrameworkName);
61
+ this.selectedCardCompThemeData = '';
62
+ if (this.data && this.data.selectedParentTerms) {
63
+ this.data.selectedParentTerms.forEach((ele) => {
64
+ if (ele.category === "competency") {
65
+ this.selectedCardCompThemeData = ele;
66
+ let option = this.selectedCardCompThemeData.additionalProperties.competencyArea;
67
+ this.onSelectionArea(option);
68
+ }
69
+ });
70
+ }
71
+ }
72
+ }, ((_err) => {
73
+ this._snackBar.open(`KCM Framework read failed.`);
74
+ }));
75
+ }
76
+ formateData(response, frameworkId) {
77
+ (response.categories).forEach((a) => {
78
+ if (a.code !== undefined) {
79
+ this.kcmList.set(a.code, {
80
+ code: a.code,
81
+ identifier: a.identifier,
82
+ index: a.index,
83
+ name: a.name,
84
+ description: a.description,
85
+ config: this.frameWorkService.getConfigOfCategoryConfigByFrameWorkId(a.code, frameworkId),
86
+ children: (a.terms || []).map((c) => {
87
+ const associations = c.associations || [];
88
+ if (associations.length > 0) {
89
+ Object.assign(c, { children: associations });
90
+ }
91
+ return c;
92
+ })
93
+ });
94
+ }
95
+ });
96
+ this.kcmList.forEach((a) => {
97
+ if (a.code === _.get(this.kcmConfigData, 'config[0].category')) {
98
+ this.competencyArea = a;
99
+ }
100
+ });
101
+ }
102
+ createCompThemeFields() {
103
+ return this.fb.group({
104
+ competencyTheme: ['', [Validators.required]],
105
+ competencySubTheme: ['', [Validators.required]]
106
+ });
107
+ }
108
+ getCreateName(data) {
109
+ let popUpCategory = data.cardColInfo ? data.cardColInfo.name : data.columnInfo.name;
110
+ switch (popUpCategory) {
111
+ case 'Designation':
112
+ return `Create Competency Mapping`;
113
+ case 'Sub Theme':
114
+ if (data.openMode === 'view') {
115
+ return `View Competency ${popUpCategory}`;
116
+ }
117
+ return `Add Competency ${popUpCategory}`;
118
+ case 'Competency':
119
+ if (data.openMode === 'edit') {
120
+ return `Edit Competency Theme`;
121
+ }
122
+ else if (data.openMode === 'view') {
123
+ return `View Competency Theme`;
124
+ }
125
+ return `Create Competency Mapping`;
126
+ default: return '';
127
+ }
128
+ }
129
+ clearSelectedThemes(option) {
130
+ if (this.isThemeSelected) {
131
+ this.openConforamtionPopup(option);
132
+ }
133
+ else {
134
+ this.onSelectionArea(option);
135
+ }
136
+ }
137
+ get isThemeSelected() {
138
+ let hasValue = false;
139
+ if (this.competencyForm) {
140
+ const compThemeFields = this.competencyForm.get('compThemeFields');
141
+ if (compThemeFields) {
142
+ compThemeFields.controls.forEach((element) => {
143
+ if (element.get('competencyTheme')?.value || element.get('competencySubTheme')?.value) {
144
+ hasValue = true;
145
+ }
146
+ });
147
+ }
148
+ }
149
+ return hasValue;
150
+ }
151
+ openConforamtionPopup(option) {
152
+ const dialogData = {
153
+ dialogType: 'warning',
154
+ descriptions: [
155
+ {
156
+ header: 'Are you sure you want to alter the competency area?',
157
+ headerClass: 'flex items-center justify-center text-blue textBold',
158
+ messages: [
159
+ {
160
+ msgClass: '',
161
+ msg: `This action will result in the loss of your currently added data`,
162
+ },
163
+ ],
164
+ },
165
+ ],
166
+ footerClass: 'items-center justify-center',
167
+ buttons: [
168
+ {
169
+ btnText: 'Cancel',
170
+ btnClass: 'btn-outline',
171
+ response: false,
172
+ },
173
+ {
174
+ btnText: 'Confirm',
175
+ btnClass: 'btn-full-success',
176
+ response: true,
177
+ },
178
+ ],
179
+ };
180
+ const dialogRef = this.dialog.open(ConforamtionPopupComponent, {
181
+ data: dialogData,
182
+ autoFocus: false,
183
+ width: '600px',
184
+ maxWidth: '80vw',
185
+ maxHeight: '90vh',
186
+ disableClose: true,
187
+ });
188
+ dialogRef.afterClosed().subscribe((res) => {
189
+ if (res) {
190
+ this.onSelectionArea(option);
191
+ }
192
+ else {
193
+ const compAreaControl = this.competencyForm.get('compArea');
194
+ if (compAreaControl) {
195
+ compAreaControl.setValue(this.seletedCompetencyArea);
196
+ compAreaControl.updateValueAndValidity();
197
+ }
198
+ }
199
+ });
200
+ }
201
+ onSelectionArea(option) {
202
+ this.competencyForm.reset();
203
+ while (this.compThemeFields.length !== 0) {
204
+ this.compThemeFields.removeAt(0);
205
+ }
206
+ this.compThemeFields.push(this.createCompThemeFields());
207
+ if ('theme' === this.kcmConfigData.config[1].category) {
208
+ this.seletedCompetencyArea = option;
209
+ const compAreaControl = this.competencyForm.get('compArea');
210
+ if (compAreaControl) {
211
+ compAreaControl.patchValue(option);
212
+ compAreaControl.updateValueAndValidity();
213
+ }
214
+ this.filteredallCompetencyTheme = [];
215
+ this.allCompetencyTheme = [];
216
+ if (option && option.children && option.children.length) {
217
+ let themeValue = this.kcmList.get(this.kcmConfigData.config[1].category);
218
+ option.children.forEach((ele) => {
219
+ if (ele.category === 'theme') {
220
+ let result = themeValue.children.findIndex((themeData) => {
221
+ if (ele.refId === themeData.refId) {
222
+ return themeData.children && themeData.children.length;
223
+ }
224
+ });
225
+ if (result >= 0) {
226
+ this.allCompetencyTheme.push(ele);
227
+ this.filteredallCompetencyTheme.push(ele);
228
+ }
229
+ }
230
+ });
231
+ }
232
+ else {
233
+ if (this.competencyArea && this.competencyArea.children) {
234
+ this.competencyArea.children.forEach((element) => {
235
+ if (element.code === option.code) {
236
+ this.seletedCompetencyArea = option;
237
+ if (element.children && element.children.length) {
238
+ element.children.forEach((ele) => {
239
+ if (ele.category === 'theme') {
240
+ this.allCompetencyTheme.push(ele);
241
+ this.filteredallCompetencyTheme.push(ele);
242
+ if (this.selectedCardCompThemeData.refId.toLowerCase() === ele.refId.toLowerCase()) {
243
+ let formArray = this.competencyForm.get('compThemeFields');
244
+ formArray.at(0).get('competencyTheme').patchValue(ele);
245
+ formArray.at(0).get('competencyTheme').updateValueAndValidity();
246
+ const compAreaControl = this.competencyForm.get('compArea');
247
+ if (compAreaControl) {
248
+ compAreaControl.patchValue(option);
249
+ compAreaControl.updateValueAndValidity();
250
+ }
251
+ }
252
+ }
253
+ });
254
+ }
255
+ }
256
+ });
257
+ }
258
+ }
259
+ }
260
+ }
261
+ addCompetencyTheme() {
262
+ if (this.data.mode === 'multi-create') {
263
+ this.compThemeFields.insert(0, this.createCompThemeFields());
264
+ }
265
+ }
266
+ removeCompFields(index) {
267
+ if (this.data.mode === 'multi-create') {
268
+ this.compThemeFields.removeAt(index);
269
+ }
270
+ }
271
+ OnThemeSelection(event, _indexValue, optionData) {
272
+ const selectedTheme = event.source.value;
273
+ this.kcmList.forEach((ele) => {
274
+ if (selectedTheme.category === ele.code) {
275
+ if (ele.children && ele.children.length) {
276
+ ele.children.forEach((themeChild) => {
277
+ if (themeChild.identifier === selectedTheme.identifier) {
278
+ if (themeChild.children && themeChild.children.length) {
279
+ optionData['children'] = themeChild.children;
280
+ this.filteredallCompetencySubTheme = themeChild.children;
281
+ let matchedData = [];
282
+ if (this.data.childrenData && this.data.childrenData.category === "subtheme") {
283
+ matchedData = _.intersectionBy(themeChild.children, [this.data.childrenData], 'refId');
284
+ }
285
+ else {
286
+ matchedData = _.intersectionBy(themeChild.children, this.selectedCardCompThemeData.children, 'refId');
287
+ }
288
+ let formArray = this.competencyForm.get('compThemeFields');
289
+ const competencySubThemeControl = formArray.at(_indexValue).get('competencySubTheme');
290
+ if (competencySubThemeControl) {
291
+ competencySubThemeControl.patchValue(matchedData);
292
+ competencySubThemeControl.updateValueAndValidity();
293
+ }
294
+ }
295
+ }
296
+ });
297
+ }
298
+ }
299
+ });
300
+ }
301
+ onTermRemove(termData, indexValue) {
302
+ let formArray = this.competencyForm.get('compThemeFields');
303
+ const compThemeControl = formArray.at(indexValue).get('competencySubTheme');
304
+ if (compThemeControl) {
305
+ const themes = compThemeControl.value;
306
+ if (themes) {
307
+ const index = themes.indexOf(termData);
308
+ if (index >= 0) {
309
+ themes.splice(index, 1);
310
+ compThemeControl.setValue(themes);
311
+ }
312
+ }
313
+ }
314
+ }
315
+ OnSubThemeSelection(_event, _indexValue, _option) {
316
+ }
317
+ async multiCreate(form, _data) {
318
+ this.disableMultiCreate = true;
319
+ let counterSubTheme = 0;
320
+ let parentCategory = {};
321
+ let createdTerms = [];
322
+ let createdSubTheme = [];
323
+ if (form.valid) {
324
+ const themeFields = form && form.value && form.value.compThemeFields;
325
+ if (themeFields && themeFields.length) {
326
+ let localCompArea = { ...this.seletedCompetencyArea };
327
+ if (localCompArea.children && localCompArea.children.length) {
328
+ delete localCompArea.children;
329
+ }
330
+ if (localCompArea.associations && localCompArea.associations.length) {
331
+ delete localCompArea.associations;
332
+ }
333
+ for (let [index, objVal] of themeFields.entries()) {
334
+ parentCategory = {};
335
+ if (objVal['competencyTheme']) {
336
+ createdTerms = [];
337
+ let value = objVal['competencyTheme'];
338
+ const term = {
339
+ code: this.frameWorkService.getUuid(),
340
+ name: value.name,
341
+ description: value.description,
342
+ category: this.data.columnInfo.code,
343
+ status: appConstants.LIVE,
344
+ refId: value.refId || '',
345
+ refType: value.refType || '',
346
+ parents: [
347
+ { identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
348
+ ],
349
+ additionalProperties: {
350
+ competencyArea: localCompArea,
351
+ timeStamp: new Date().getTime()
352
+ }
353
+ };
354
+ const requestBody = {
355
+ request: {
356
+ term: term
357
+ }
358
+ };
359
+ await this.frameWorkService.createTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody).toPromise().then(async (res) => {
360
+ requestBody.request.term['identifier'] = res.result.node_id[0];
361
+ this.frameWorkService.selectionList.delete('competency');
362
+ parentCategory = requestBody.request.term;
363
+ createdTerms.push(requestBody.request.term);
364
+ const parentColumn = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
365
+ let parentCol = this.frameWorkService.selectionList.get(parentColumn.code);
366
+ await this.updateTermAssociationsMultiV2(createdTerms, parentCol);
367
+ let data = {
368
+ "selected": false,
369
+ "category": parentColumn.code,
370
+ "cardSubType": "minimal",
371
+ "isViewOnly": false,
372
+ "index": parentColumn.index,
373
+ "columnInfo": this.data.cardColInfo
374
+ };
375
+ const responseData12 = {
376
+ res: { term: [this.selectedTerm], created: true, multi: true },
377
+ index: this.data.columnInfo.index,
378
+ data: data,
379
+ type: 'multi-create'
380
+ };
381
+ this.frameWorkService.updateAfterAddOrEditSubject(responseData12);
382
+ });
383
+ }
384
+ if (objVal['competencySubTheme']) {
385
+ this.frameWorkService.selectionList.set(this.data.columnInfo.code, parentCategory);
386
+ let value = objVal['competencySubTheme'];
387
+ if (value && value.length) {
388
+ counterSubTheme = 0;
389
+ createdSubTheme = [];
390
+ for (let ele of value) {
391
+ const term = {
392
+ code: this.frameWorkService.getUuid(),
393
+ name: ele.name,
394
+ description: ele.description,
395
+ category: this.data.nextColInfo.code,
396
+ status: appConstants.LIVE,
397
+ refId: ele.refId || '',
398
+ refType: ele.refType || '',
399
+ parents: [
400
+ { identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.nextColInfo.code}` }
401
+ ],
402
+ additionalProperties: {
403
+ timeStamp: new Date().getTime()
404
+ }
405
+ };
406
+ const requestBody = {
407
+ request: {
408
+ term: term
409
+ }
410
+ };
411
+ let responseData = await this.crateTerm(this.data.frameworkId, this.data.nextColInfo.code, requestBody);
412
+ requestBody.request.term['identifier'] = responseData.result.node_id[0];
413
+ createdSubTheme.push(requestBody.request.term);
414
+ counterSubTheme++;
415
+ if ((counterSubTheme === objVal['competencySubTheme'].length)) {
416
+ const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.nextColInfo.code);
417
+ let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
418
+ await this.updateTermAssociationsMultiV2(createdSubTheme, parentCol, index, themeFields.length);
419
+ if (index === themeFields.length - 1) {
420
+ this.frameWorkService.selectionList.delete('competency');
421
+ this.dialogClose({ term: this.selectedTermArray, created: true, multi: false, callUpdate: false });
422
+ this.disableMultiCreate = false;
423
+ this._snackBar.open(`Competency Mapping created successfully.`);
424
+ }
425
+ }
426
+ }
427
+ }
428
+ }
429
+ }
430
+ }
431
+ }
432
+ }
433
+ async crateTerm(frameworkId, colCode, requestBody) {
434
+ return new Promise(async (resolve) => {
435
+ this.frameWorkService.createTerm(frameworkId, colCode, requestBody).subscribe((res) => {
436
+ resolve(res);
437
+ }, ((_err) => {
438
+ this._snackBar.open(`Create Term failed.`);
439
+ }));
440
+ });
441
+ }
442
+ async updateTermAssociationsMultiV2(createdTerms, parentSelectedTerm, _runningIndex, _themFieldsLength) {
443
+ if (createdTerms && createdTerms.length) {
444
+ this.selectedTermArray = [];
445
+ let createdTermsIdentifiers = [];
446
+ this.selectedTermArray = createdTerms;
447
+ this.selectedTerm = createdTerms[createdTerms.length - 1];
448
+ for (let createdTerm of createdTerms) {
449
+ createdTermsIdentifiers.push({ identifier: createdTerm.identifier });
450
+ }
451
+ let associations = [];
452
+ let counter = 0;
453
+ if (!parentSelectedTerm) {
454
+ for (const [value] of this.frameWorkService.selectionList) {
455
+ const parent = value;
456
+ counter++;
457
+ associations = parent.children ? parent.children.map((c) => {
458
+ return c.identifier ? { identifier: c.identifier } : null;
459
+ }) : [];
460
+ associations = [...associations, ...createdTermsIdentifiers];
461
+ this.isTermExist = false;
462
+ const reguestBody = {
463
+ request: {
464
+ term: {
465
+ ...(associations && associations.length) ? { associations: [...associations] } : null,
466
+ }
467
+ }
468
+ };
469
+ await this.callUpdateAssociationsV2(counter, parent, reguestBody);
470
+ }
471
+ }
472
+ else {
473
+ const parent = parentSelectedTerm;
474
+ associations = parent.children ? parent.children.map((c) => {
475
+ return c.identifier ? { identifier: c.identifier } : null;
476
+ }) : [];
477
+ associations = [...associations, ...createdTermsIdentifiers];
478
+ this.isTermExist = false;
479
+ const reguestBody = {
480
+ request: {
481
+ term: {
482
+ ...(associations && associations.length) ? { associations: [...associations] } : null,
483
+ }
484
+ }
485
+ };
486
+ return await this.callUpdateAssociationsV2(counter, parent, reguestBody);
487
+ this.disableMultiCreate = false;
488
+ }
489
+ }
490
+ }
491
+ async updateTermAssociationsMulti(createdTerms) {
492
+ if (createdTerms && createdTerms.length) {
493
+ for (let createdTerm of createdTerms) {
494
+ this.selectedTerm = createdTerm;
495
+ let associations = [];
496
+ let temp;
497
+ let counter = 0;
498
+ for (const [value] of this.frameWorkService.selectionList) {
499
+ const parent = value;
500
+ counter++;
501
+ temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
502
+ associations = parent.children ? parent.children.map((c) => {
503
+ return c.identifier ? { identifier: c.identifier } : null;
504
+ }) : [];
505
+ if (temp && temp.length) {
506
+ this.isTermExist = true;
507
+ return;
508
+ }
509
+ else {
510
+ associations.push({ identifier: this.selectedTerm.identifier });
511
+ this.isTermExist = false;
512
+ const reguestBody = {
513
+ request: {
514
+ term: {
515
+ ...(associations && associations.length) ? { associations: [...associations] } : null,
516
+ }
517
+ }
518
+ };
519
+ await this.callUpdateAssociations(counter, parent, reguestBody);
520
+ }
521
+ }
522
+ }
523
+ }
524
+ }
525
+ async callUpdateAssociationsV2(counter, parent, reguestBody) {
526
+ return new Promise(async (resolve) => {
527
+ this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(async () => {
528
+ parent['children'] = parent && parent.children ? [...parent.children, ...this.selectedTermArray] : this.selectedTermArray;
529
+ let listData = this.frameWorkService.list.get(this.data.columnInfo.code);
530
+ let differenceData = [];
531
+ if (listData && listData.children && listData.children.length) {
532
+ differenceData = _.differenceBy(this.selectedTermArray, listData.children, 'identifier');
533
+ }
534
+ else {
535
+ differenceData = this.selectedTermArray;
536
+ }
537
+ listData['associations'] = listData && listData.associations ? [...listData.associations, ...differenceData] : differenceData;
538
+ listData['children'] = listData && listData.children ? [...listData.children, ...differenceData] : differenceData;
539
+ this.frameWorkService.selectionList.forEach((selectedData) => {
540
+ let listData = this.frameWorkService.list.get(selectedData.category);
541
+ if (listData && listData.children && listData.children.length) {
542
+ this.updateLocalList(listData, parent, this.selectedTermArray);
543
+ }
544
+ });
545
+ if (counter === this.frameWorkService.selectionList.size) {
546
+ this.disableUpdate = false;
547
+ let returnValue = true;
548
+ resolve(true);
549
+ await returnValue;
550
+ }
551
+ else {
552
+ let returnValue = true;
553
+ resolve(true);
554
+ await returnValue;
555
+ }
556
+ }, (_err) => {
557
+ console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
558
+ this._snackBar.open(`Term Association failed.`);
559
+ this.disableMultiCreate = false;
560
+ });
561
+ });
562
+ }
563
+ async callUpdateAssociations(counter, parent, reguestBody) {
564
+ return new Promise(async (resolve) => {
565
+ this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(async () => {
566
+ if (counter === this.frameWorkService.selectionList.size) {
567
+ const found = parent.children ? parent.children.find((c) => c.identifier === this.selectedTerm.identifier) : false;
568
+ if (!found) {
569
+ parent.children ? parent.children.push(this.selectedTerm) : parent['children'] = [this.selectedTerm];
570
+ }
571
+ this.disableUpdate = false;
572
+ let returnValue = true;
573
+ resolve(true);
574
+ await returnValue;
575
+ }
576
+ else {
577
+ let returnValue = true;
578
+ resolve(true);
579
+ await returnValue;
580
+ }
581
+ }, (_err) => {
582
+ console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
583
+ });
584
+ });
585
+ }
586
+ updateTermData(form, data) {
587
+ this.disableUpdate = true;
588
+ const formData = {
589
+ ...form.value
590
+ };
591
+ const updateData = {
592
+ formData,
593
+ updateTermData: data.childrenData
594
+ };
595
+ this.updateTermAssociations(updateData);
596
+ }
597
+ updateTermAssociations(updateData) {
598
+ let associations = [];
599
+ let temp;
600
+ let counter = 0;
601
+ this.frameWorkService.selectionList.forEach((parent) => {
602
+ counter++;
603
+ temp = parent.children ? parent.children.filter((child) => child.identifier === this.selectedTerm.identifier) : null;
604
+ associations = parent.children ? parent.children.map((c) => {
605
+ return c.identifier ? { identifier: c.identifier } : null;
606
+ }) : [];
607
+ if (temp && temp.length) {
608
+ this.isTermExist = true;
609
+ return;
610
+ }
611
+ else {
612
+ if (this.selectedTerm && this.selectedTerm.identifier) {
613
+ associations.push({ identifier: this.selectedTerm.identifier });
614
+ }
615
+ this.isTermExist = false;
616
+ const reguestBody = {
617
+ request: {
618
+ term: {
619
+ ...(updateData && updateData.formData && updateData.updateTermData.code === parent.code) ? { ...updateData.formData } : null,
620
+ ...(associations && associations.length) ? { associations: [...associations] } : null,
621
+ }
622
+ }
623
+ };
624
+ this.frameWorkService.updateTerm(this.data.frameworkId, parent.category, parent.code, reguestBody).subscribe(() => {
625
+ if (counter === this.frameWorkService.selectionList.size) {
626
+ const value = (this.selectedTerm && this.selectedTerm.identifier) ? this.selectedTerm : (updateData) ? { ...updateData.updateTermData, ...updateData.formData } : {};
627
+ this.disableUpdate = false;
628
+ this.dialogClose({ term: { ...value }, created: true });
629
+ }
630
+ }, (_err) => {
631
+ console.error(`Edit ${this.data.columnInfo.name} failed, please try again later`);
632
+ this._snackBar.open(`Term Association failed.`);
633
+ this.disableMultiCreate = false;
634
+ });
635
+ }
636
+ });
637
+ }
638
+ dialogClose(term) {
639
+ this.frameWorkService.publishFramework().subscribe(() => {
640
+ this.disableMultiCreate = false;
641
+ this.dialogRef.close(term);
642
+ }, (_err) => {
643
+ this.disableMultiCreate = false;
644
+ this.dialogRef.close(term);
645
+ this._snackBar.open(`Publish failed.`);
646
+ });
647
+ }
648
+ async multiCreateSubTheme(_form, data) {
649
+ this.disableMultiCreate = true;
650
+ let formArray = this.competencyForm.get('compThemeFields');
651
+ let selectedFormData = formArray.at(0).get('competencySubTheme').value;
652
+ let previousSubThemeData = data.childrenData.children;
653
+ let newlyAdded = [];
654
+ let removedExisting = [];
655
+ let createdSubTheme = [];
656
+ let counterSubTheme = 0;
657
+ newlyAdded = _.differenceBy(selectedFormData, previousSubThemeData, 'refId');
658
+ removedExisting = _.differenceBy(previousSubThemeData, selectedFormData, 'refId');
659
+ if (newlyAdded && newlyAdded.length) {
660
+ for (let val of newlyAdded) {
661
+ const term = {
662
+ code: this.frameWorkService.getUuid(),
663
+ name: val.name,
664
+ description: val.description,
665
+ category: this.data.columnInfo.code,
666
+ status: appConstants.LIVE,
667
+ refId: val.refId,
668
+ refType: val.refType,
669
+ parents: [
670
+ { identifier: `${this.data.frameworkId.toLowerCase()}_${this.data.columnInfo.code}` }
671
+ ],
672
+ additionalProperties: {
673
+ timeStamp: new Date().getTime()
674
+ }
675
+ };
676
+ const requestBody = {
677
+ request: {
678
+ term: term
679
+ }
680
+ };
681
+ const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
682
+ let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
683
+ let responseData = await this.crateTerm(this.data.frameworkId, this.data.columnInfo.code, requestBody);
684
+ requestBody.request.term['identifier'] = responseData.result.node_id[0];
685
+ createdSubTheme.push(requestBody.request.term);
686
+ counterSubTheme++;
687
+ if (counterSubTheme === newlyAdded.length) {
688
+ await this.updateTermAssociationsMultiV2(createdSubTheme, parentCol);
689
+ this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parentCol, createdSubTheme, 'create');
690
+ if (!(removedExisting && removedExisting.length)) {
691
+ this.dialogClose({ term: this.selectedTermArray, created: true, multi: true, callUpdate: false });
692
+ this.disableMultiCreate = false;
693
+ this._snackBar.open(`Competency theme updated successfully.`);
694
+ }
695
+ }
696
+ }
697
+ }
698
+ if (removedExisting && removedExisting.length) {
699
+ let removedTermsCollection = [];
700
+ for (let removedTerm of removedExisting) {
701
+ removedTermsCollection.push(removedTerm.code);
702
+ }
703
+ let subThemeRequest = {
704
+ "request": {
705
+ "contentIds": removedTermsCollection
706
+ }
707
+ };
708
+ await this.frameWorkService.retireMultipleTerm(this.data.frameworkId, this.data.columnInfo.code, subThemeRequest).toPromise().then(async () => {
709
+ const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
710
+ let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
711
+ const sectionListchildrenList = _.differenceWith(parentCol.children, removedExisting, (a, b) => a.identifier === b.identifier);
712
+ const sectionListAssociationList = _.differenceWith(parentCol.associations, removedExisting, (a, b) => a.identifier === b.identifier);
713
+ parentCol['children'] = sectionListchildrenList;
714
+ parentCol['associations'] = sectionListAssociationList;
715
+ this.frameWorkService.updateFrameworkList(this.data.columnInfo.code, parentCol, removedExisting, 'delete');
716
+ this.dialogClose({ term: [], created: true, multi: true, callUpdate: false });
717
+ this.frameWorkService.currentSelection.next({ type: parentColumnConfigData.code, data: parentCol, cardRef: parentCol.cardRef });
718
+ this.disableMultiCreate = false;
719
+ this._snackBar.open(`Competency theme updated successfully.`);
720
+ });
721
+ }
722
+ this.disableMultiCreate = false;
723
+ }
724
+ onDisableTheme(option) {
725
+ const parentColumnConfigData = this.frameWorkService.getPreviousCategory(this.data.columnInfo.code);
726
+ let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
727
+ let result = -1;
728
+ if (parentCol && parentCol.children && parentCol.children.length) {
729
+ result = parentCol.children.findIndex((ele) => {
730
+ if ((ele.refType === 'theme') && (this.seletedCompetencyArea.code === ele.additionalProperties.competencyArea.code)) {
731
+ return ele.refId === option.refId;
732
+ }
733
+ return false;
734
+ });
735
+ }
736
+ if (result < 0) {
737
+ let formArray = this.competencyForm.get('compThemeFields');
738
+ result = formArray.value.findIndex((formEle) => {
739
+ if (formEle.competencyTheme && formEle.competencyTheme.refId) {
740
+ return formEle.competencyTheme.refId === option.refId;
741
+ }
742
+ return false;
743
+ });
744
+ }
745
+ return result >= 0 ? true : false;
746
+ }
747
+ updateLocalList(item, parent, selectedTermArray, updateType) {
748
+ if (item && item.children && item.children.length) {
749
+ if (updateType === 'delete') {
750
+ item.children.forEach((itmData) => {
751
+ if (itmData.identifier === parent.identifier) {
752
+ const associationList = _.differenceWith(itmData.associations, selectedTermArray, (a, b) => a.identifier === b.identifier);
753
+ const childrenList = _.differenceWith(itmData.children, selectedTermArray, (a, b) => a.identifier === b.identifier);
754
+ itmData['associations'] = associationList;
755
+ itmData['children'] = childrenList;
756
+ }
757
+ if (itmData.children) {
758
+ this.updateLocalList(itmData, parent, selectedTermArray, updateType);
759
+ }
760
+ });
761
+ }
762
+ else {
763
+ item.children.forEach((itmData) => {
764
+ if (itmData.identifier === parent.identifier) {
765
+ let differenceData = [];
766
+ if (itmData && itmData.children && itmData.children.length) {
767
+ differenceData = _.differenceBy(selectedTermArray, itmData.children, 'identifier');
768
+ }
769
+ else {
770
+ differenceData = selectedTermArray;
771
+ }
772
+ itmData['associations'] = itmData && itmData.associations ? [...itmData.associations, ...differenceData] : differenceData;
773
+ itmData['children'] = itmData && itmData.children ? [...itmData.children, ...differenceData] : differenceData;
774
+ }
775
+ if (itmData.children) {
776
+ this.updateLocalList(itmData, parent, selectedTermArray);
777
+ }
778
+ });
779
+ }
780
+ }
781
+ }
782
+ deleteTheme() {
783
+ this.disableMultiCreate = true;
784
+ const cardData = this.data.childrenData;
785
+ let removedListTerm = [];
786
+ removedListTerm.push(cardData.code);
787
+ let subThemeRequest = {
788
+ "request": {
789
+ "contentIds": removedListTerm
790
+ }
791
+ };
792
+ this.frameWorkService.retireMultipleTerm(this.frameWorkService.frameworkId, cardData.category, subThemeRequest).toPromise().then(async () => {
793
+ let removedExisting = [cardData];
794
+ const parentColumnConfigData = this.frameWorkService.getPreviousCategory(cardData.category);
795
+ let parentCol = this.frameWorkService.selectionList.get(parentColumnConfigData.code);
796
+ const sectionListchildrenList = _.differenceWith(parentCol.children, removedExisting, (a, b) => a.identifier === b.identifier);
797
+ const sectionListAssociationList = _.differenceWith(parentCol.associations, removedExisting, (a, b) => a.identifier === b.identifier);
798
+ parentCol['children'] = sectionListchildrenList;
799
+ parentCol['associations'] = sectionListAssociationList;
800
+ this.frameWorkService.updateFrameworkList(cardData.category, parentCol, removedExisting, 'delete');
801
+ this.frameWorkService.currentSelection.next({ type: parentColumnConfigData.code, data: parentCol, cardRef: parentCol.cardRef });
802
+ this.dialogClose({});
803
+ this.disableMultiCreate = false;
804
+ this._snackBar.open(`Competency theme deleted successfully.`);
805
+ }, ((_err) => {
806
+ this.disableMultiCreate = false;
807
+ this._snackBar.open(`Competency theme delete failed.`);
808
+ }));
809
+ }
810
+ get compThemeFields() {
811
+ return this.competencyForm.get('compThemeFields');
812
+ }
813
+ 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 }); }
814
+ 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: "component", type: i8.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: i8.MatChipListbox, selector: "mat-chip-listbox", inputs: ["tabIndex", "multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "directive", type: i8.MatChipRemove, 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"] }] }); }
815
+ }
816
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CreateTermFromFrameworkComponent, decorators: [{
817
+ type: Component,
818
+ 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"] }]
819
+ }], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
820
+ type: Inject,
821
+ args: [MAT_DIALOG_DATA]
822
+ }] }, { type: i1.MatLegacyDialog }, { type: i2.FrameworkService }, { type: i3.UntypedFormBuilder }, { type: i4.MatLegacySnackBar }]; } });
823
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXRlcm0tZnJvbS1mcmFtZXdvcmsuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RyZWUtaGllcmFyY2h5L3NyYy9saWIvY29tcG9uZW50cy9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdHJlZS1oaWVyYXJjaHkvc3JjL2xpYi9jb21wb25lbnRzL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBOEUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEgsT0FBTyxFQUFFLHNCQUFzQixJQUFJLGVBQWUsRUFBb0UsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5SixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHOUMsT0FBTyxLQUFLLFlBQVksTUFBTSw4QkFBOEIsQ0FBQztBQUc3RCxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRaEcsTUFBTSxPQUFPLGdDQUFnQztJQWdDM0MsWUFDUyxTQUF5RCxFQUNoQyxJQUFTLEVBQ2pDLE1BQWlCLEVBQ2xCLGdCQUFrQyxFQUNqQyxFQUFzQixFQUN0QixTQUFzQjtRQUx2QixjQUFTLEdBQVQsU0FBUyxDQUFnRDtRQUNoQyxTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ2pDLFdBQU0sR0FBTixNQUFN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QUMsaUJBQWlCLENBQXFCLENBQUM7SUFDeEUsQ0FBQzsrR0FwOEJVLGdDQUFnQyxvREFrQ2pDLGVBQWU7bUdBbENkLGdDQUFnQyxzRUNwQjdDLCsxaUJBbU9XOzs0RkQvTUUsZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLGdDQUFnQzs7MEJBc0N2QyxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUFycmF5LCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1BVF9MRUdBQ1lfRElBTE9HX0RBVEEgYXMgTUFUX0RJQUxPR19EQVRBLCBNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nLCBNYXRMZWdhY3lEaWFsb2dSZWYgYXMgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZyc7XG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInO1xuaW1wb3J0IHsgbGFiZWxzIH0gZnJvbSAnLi4vLi4vbGFiZWxzL3N0cmluZ3MnO1xuaW1wb3J0IHsgRnJhbWV3b3JrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZyYW1ld29yay5zZXJ2aWNlJztcbmltcG9ydCB7IE5TRnJhbWV3b3JrIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZyYW1ld29yay5tb2RlbCc7XG5pbXBvcnQgKiBhcyBhcHBDb25zdGFudHMgZnJvbSAnLi4vLi4vY29uc3RhbnRzL2FwcC1jb25zdGFudCc7XG5pbXBvcnQgeyBDYXJkIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3ZhcmlhYmxlLXR5cGUubW9kZWwnO1xuLyogdHNsaW50OmRpc2FibGUgKi9cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbi8vIGltcG9ydCB7IHJlc29sdmUgfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgQ29uZm9yYW10aW9uUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9jb25mb3JhbXRpb24tcG9wdXAvY29uZm9yYW10aW9uLXBvcHVwLmNvbXBvbmVudCc7XG4vKiB0c2xpbnQ6ZW5hYmxlICovXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yaycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtdGVybS1mcm9tLWZyYW1ld29yay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS10ZXJtLWZyb20tZnJhbWV3b3JrLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ3JlYXRlVGVybUZyb21GcmFtZXdvcmtDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGFwcF9zdHJpbmdzID0gbGFiZWxzO1xuICBlbnZpcm9ubWVudDogYW55XG5cbiAgc2VsZWN0ZWRUZXJtOiBDYXJkID0ge307XG4gIHNlbGVjdGVkVGVybUFycmF5IDogYW55ID0gW11cbiAga2NtQ29uZmlnRGF0YTogYW55XG4gIHNlbGVjdGVkVGhlbWVEYXRhOiBhbnlcblxuXG4gIGlzVGVybUV4aXN0OiBib29sZWFuID0gZmFsc2U7XG4gIGRpc2FibGVDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzYWJsZU11bHRpQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIGRpc2FibGVVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuXG4gIGNvbXBldGVuY3lGb3JtITogVW50eXBlZEZvcm1Hcm91cFxuXG5cbiAga2NtTGlzdCA6IGFueT0gbmV3IE1hcDxzdHJpbmcsIE5TRnJhbWV3b3JrLklDb2x1bW5WaWV3PigpO1xuICAvLyBjYXRlZ29yaWVzSGFzaDogYW55XG4gIGNvbXBldGVuY3lBcmVhOiBhbnlcbiAgc2VsZWN0ZWRDYXJkQ29tcFRoZW1lRGF0YTogYW55XG5cbiAgYWxsQ29tcGV0ZW5jeTphbnlbXT1bXVxuICBzZWxldGVkQ29tcGV0ZW5jeUFyZWE6IGFueVxuICBhbGxDb21wZXRlbmN5VGhlbWU6YW55W109W11cbiAgZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWU6YW55W109W11cbiAgYWxsQ29tcGV0ZW5jeVN1YnRoZW1lOmFueVtdPVtdXG4gIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lOmFueVtdPVtdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPENyZWF0ZVRlcm1Gcm9tRnJhbWV3b3JrQ29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHB1YmxpYyBmcmFtZVdvcmtTZXJ2aWNlOiBGcmFtZXdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIF9zbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRFbnZpcm9tZW50KClcbiAgICB0aGlzLmdldENvbXB0ZW5jeURhdGEoKVxuICAgIHRoaXMua2NtQ29uZmlnRGF0YSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRDb25maWdCeUZyYW1lV29ya0lkKHRoaXMuZW52aXJvbm1lbnQua2NtRnJhbWV3b3JrTmFtZSlcbiAgICB0aGlzLmNvbXBldGVuY3lGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb21wQXJlYTpbJycsVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBjb21wVGhlbWVGaWVsZHM6IHRoaXMuZmIuYXJyYXkoW3RoaXMuY3JlYXRlQ29tcFRoZW1lRmllbGRzKCldKVxuICAgIH0pXG5cbiAgfVxuXG4gIGdldENvbXB0ZW5jeURhdGEoKXtcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0RnJhbWV3b3JrUmVhZCh0aGlzLmVudmlyb25tZW50LmtjbUZyYW1ld29ya05hbWUpLnN1YnNjcmliZSgoZGF0YSk9PntcbiAgICAgaWYoZGF0YS5jYXRlZ29yaWVzKSB7XG4gICAgICB0aGlzLmZvcm1hdGVEYXRhKGRhdGEsIHRoaXMuZW52aXJvbm1lbnQua2NtRnJhbWV3b3JrTmFtZSlcbiAgICAgIHRoaXMuc2VsZWN0ZWRDYXJkQ29tcFRoZW1lRGF0YSA9ICAnJ1xuICAgICAgLy8gdG8gZG86IGNoYW5nZSBnZXR0aW5nIHNlbGVjdGVkUGFyZW50VGVybXMgdG8gZHluYW1pY1xuICAgICAgaWYodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5zZWxlY3RlZFBhcmVudFRlcm1zKSB7XG4gICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZFBhcmVudFRlcm1zLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYoZWxlLmNhdGVnb3J5ID09PSBcImNvbXBldGVuY3lcIikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENhcmRDb21wVGhlbWVEYXRhID0gZWxlXG4gICAgICAgICAgICBsZXQgb3B0aW9uID0gdGhpcy5zZWxlY3RlZENhcmRDb21wVGhlbWVEYXRhLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmNvbXBldGVuY3lBcmVhXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQXJlYShvcHRpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICB9XG4gICAgfSwoKF9lcnI6IGFueSkgPT4ge1xuICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgS0NNIEZyYW1ld29yayByZWFkIGZhaWxlZC5gKVxuICAgIH0pKVxuICB9XG5cbiAgZm9ybWF0ZURhdGEocmVzcG9uc2U6IGFueSwgZnJhbWV3b3JrSWQ6IHN0cmluZykge1xuICAgIChyZXNwb25zZS5jYXRlZ29yaWVzKS5mb3JFYWNoKChhOmFueSkgPT4ge1xuICAgICAgaWYoYS5jb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5rY21MaXN0LnNldChhLmNvZGUsIHtcbiAgICAgICAgICBjb2RlOiBhLmNvZGUsXG4gICAgICAgICAgaWRlbnRpZmllcjogYS5pZGVudGlmaWVyLFxuICAgICAgICAgIGluZGV4OiBhLmluZGV4LFxuICAgICAgICAgIG5hbWU6IGEubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYS5kZXNjcmlwdGlvbixcbiAgICAgICAgICBjb25maWc6IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRDb25maWdPZkNhdGVnb3J5Q29uZmlnQnlGcmFtZVdvcmtJZChhLmNvZGUsIGZyYW1ld29ya0lkKSxcbiAgICAgICAgICAvLyBjaGlsZHJlbjogKFsuLi5hLnRlcm1zLCAuLi5sb2NhbERhdGFdIHx8IFtdKS5tYXAoYyA9PiB7XG4gICAgICAgICAgY2hpbGRyZW46IChhLnRlcm1zIHx8IFtdKS5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NvY2lhdGlvbnMgPSBjLmFzc29jaWF0aW9ucyB8fCBbXVxuICAgICAgICAgICAgaWYgKGFzc29jaWF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYywgeyBjaGlsZHJlbjogYXNzb2NpYXRpb25zIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5rY21MaXN0LmZvckVhY2goKGE6IGFueSkgPT4ge1xuICAgICAgaWYoYS5jb2RlID09PSBfLmdldCh0aGlzLmtjbUNvbmZpZ0RhdGEsICdjb25maWdbMF0uY2F0ZWdvcnknKSl7XG4gICAgICAgIHRoaXMuY29tcGV0ZW5jeUFyZWEgPSBhXG4gICAgICB9XG4gICAgfSlcbiAgICBcblxuICB9XG5cblxuICBjcmVhdGVDb21wVGhlbWVGaWVsZHMoKTpVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjb21wZXRlbmN5VGhlbWU6WycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgY29tcGV0ZW5jeVN1YlRoZW1lOlsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXVxuICAgIH0pXG4gIH1cblxuXG4gIGdldENyZWF0ZU5hbWUoZGF0YTogYW55KSB7XG4gICAgICBsZXQgcG9wVXBDYXRlZ29yeSA9IGRhdGEuY2FyZENvbEluZm8gPyBkYXRhLmNhcmRDb2xJbmZvLm5hbWUgOiBkYXRhLmNvbHVtbkluZm8ubmFtZVxuICAgICAgc3dpdGNoKHBvcFVwQ2F0ZWdvcnkpe1xuICAgICAgICBjYXNlICdEZXNpZ25hdGlvbic6XG4gICAgICAgIHJldHVybiBgQ3JlYXRlIENvbXBldGVuY3kgTWFwcGluZ2A7XG4gICAgICAgIGNhc2UgJ1N1YiBUaGVtZSc6XG4gICAgICAgICAgaWYoZGF0YS5vcGVuTW9kZSA9PT0gJ3ZpZXcnKSB7XG4gICAgICAgICAgICByZXR1cm4gYFZpZXcgQ29tcGV0ZW5jeSAke3BvcFVwQ2F0ZWdvcnl9YFxuICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBBZGQgQ29tcGV0ZW5jeSAke3BvcFVwQ2F0ZWdvcnl9YFxuICAgICAgICBjYXNlICdDb21wZXRlbmN5JzpcbiAgICAgICAgICBpZihkYXRhLm9wZW5Nb2RlID09PSAnZWRpdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBgRWRpdCBDb21wZXRlbmN5IFRoZW1lYFxuICAgICAgICAgIH0gZWxzZSBpZihkYXRhLm9wZW5Nb2RlID09PSAndmlldycpIHtcbiAgICAgICAgICAgIHJldHVybiBgVmlldyBDb21wZXRlbmN5IFRoZW1lYFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYENyZWF0ZSBDb21wZXRlbmN5IE1hcHBpbmdgXG4gICAgICAgICAgZGVmYXVsdDogcmV0dXJuICcnXG4gICAgICB9XG4gIH1cblxuICBjbGVhclNlbGVjdGVkVGhlbWVzKG9wdGlvbjphbnkpe1xuICAgIGlmKHRoaXMuaXNUaGVtZVNlbGVjdGVkKSB7XG4gICAgICB0aGlzLm9wZW5Db25mb3JhbXRpb25Qb3B1cChvcHRpb24pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25TZWxlY3Rpb25BcmVhKG9wdGlvbilcbiAgICB9XG4gIH1cblxuICBnZXQgaXNUaGVtZVNlbGVjdGVkICgpIHtcbiAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZVxuICAgIGlmICh0aGlzLmNvbXBldGVuY3lGb3JtKSB7XG4gICAgICBjb25zdCBjb21wVGhlbWVGaWVsZHMgPSB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICAgIGlmIChjb21wVGhlbWVGaWVsZHMpIHtcbiAgICAgICAgY29tcFRoZW1lRmllbGRzLmNvbnRyb2xzLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgICAgaWYoZWxlbWVudC5nZXQoJ2NvbXBldGVuY3lUaGVtZScpPy52YWx1ZSB8fCBlbGVtZW50LmdldCgnY29tcGV0ZW5jeVN1YlRoZW1lJyk/LnZhbHVlKSB7XG4gICAgICAgICAgICBoYXNWYWx1ZSA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzVmFsdWVcbiAgfVxuXG4gIG9wZW5Db25mb3JhbXRpb25Qb3B1cChvcHRpb246YW55KSB7XG4gICAgY29uc3QgZGlhbG9nRGF0YSA9IHtcbiAgICAgIGRpYWxvZ1R5cGU6ICd3YXJuaW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGFsdGVyIHRoZSBjb21wZXRlbmN5IGFyZWE/JyxcbiAgICAgICAgICBoZWFkZXJDbGFzczogJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtYmx1ZSB0ZXh0Qm9sZCcsXG4gICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbXNnQ2xhc3M6ICcnLFxuICAgICAgICAgICAgICBtc2c6IGBUaGlzIGFjdGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgbG9zcyBvZiB5b3VyIGN1cnJlbnRseSBhZGRlZCBkYXRhYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBmb290ZXJDbGFzczogJ2l0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlcicsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBidG5UZXh0OiAnQ2FuY2VsJyxcbiAgICAgICAgICBidG5DbGFzczogJ2J0bi1vdXRsaW5lJyxcbiAgICAgICAgICByZXNwb25zZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBidG5UZXh0OiAnQ29uZmlybScsXG4gICAgICAgICAgYnRuQ2xhc3M6ICdidG4tZnVsbC1zdWNjZXNzJyxcbiAgICAgICAgICByZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZm9yYW10aW9uUG9wdXBDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBtYXhXaWR0aDogJzgwdncnLFxuICAgICAgbWF4SGVpZ2h0OiAnOTB2aCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgfSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25BcmVhKG9wdGlvbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbXBBcmVhQ29udHJvbCA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wQXJlYScpO1xuICAgICAgICBpZiAoY29tcEFyZWFDb250cm9sKSB7XG4gICAgICAgICAgY29tcEFyZWFDb250cm9sLnNldFZhbHVlKHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhKTtcbiAgICAgICAgICBjb21wQXJlYUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIG9uU2VsZWN0aW9uQXJlYShvcHRpb246YW55KXtcbiAgICB0aGlzLmNvbXBldGVuY3lGb3JtLnJlc2V0KClcbiAgICB3aGlsZSh0aGlzLmNvbXBUaGVtZUZpZWxkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgICB0aGlzLmNvbXBUaGVtZUZpZWxkcy5wdXNoKHRoaXMuY3JlYXRlQ29tcFRoZW1lRmllbGRzKCkpO1xuICAgIGlmKCd0aGVtZScgPT09IHRoaXMua2NtQ29uZmlnRGF0YS5jb25maWdbMV0uY2F0ZWdvcnkpe1xuICAgICAgdGhpcy5zZWxldGVkQ29tcGV0ZW5jeUFyZWEgPSBvcHRpb25cbiAgICAgIGNvbnN0IGNvbXBBcmVhQ29udHJvbCA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wQXJlYScpO1xuICAgICAgaWYgKGNvbXBBcmVhQ29udHJvbCkge1xuICAgICAgICBjb21wQXJlYUNvbnRyb2wucGF0Y2hWYWx1ZShvcHRpb24pO1xuICAgICAgICBjb21wQXJlYUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJlZGFsbENvbXBldGVuY3lUaGVtZSA9IFtdXG4gICAgICB0aGlzLmFsbENvbXBldGVuY3lUaGVtZSA9IFtdXG4gICAgICBpZihvcHRpb24gJiYgIG9wdGlvbi5jaGlsZHJlbiAmJiAgb3B0aW9uLmNoaWxkcmVuLmxlbmd0aCl7XG4gICAgICAgIGxldCB0aGVtZVZhbHVlID0gdGhpcy5rY21MaXN0LmdldCh0aGlzLmtjbUNvbmZpZ0RhdGEuY29uZmlnWzFdLmNhdGVnb3J5KVxuICAgICAgICBvcHRpb24uY2hpbGRyZW4uZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZihlbGUuY2F0ZWdvcnkgPT09ICd0aGVtZScgKSB7XG4gICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGVtZVZhbHVlLmNoaWxkcmVuLmZpbmRJbmRleCgodGhlbWVEYXRhIDphbnkgKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoZWxlLnJlZklkID09PSB0aGVtZURhdGEucmVmSWQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGVtZURhdGEuY2hpbGRyZW4gJiYgdGhlbWVEYXRhLmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgaWYocmVzdWx0ID49IDApe1xuICAgICAgICAgICAgICAgIHRoaXMuYWxsQ29tcGV0ZW5jeVRoZW1lLnB1c2goZWxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUucHVzaChlbGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZih0aGlzLmNvbXBldGVuY3lBcmVhICYmIHRoaXMuY29tcGV0ZW5jeUFyZWEuY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLmNvbXBldGVuY3lBcmVhLmNoaWxkcmVuLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XG4gICAgICAgICAgICBpZihlbGVtZW50LmNvZGUgPT09IG9wdGlvbi5jb2RlKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhID0gb3B0aW9uXG4gICAgICAgICAgICAgIGlmKGVsZW1lbnQuY2hpbGRyZW4gJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNoaWxkcmVuLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZihlbGUuY2F0ZWdvcnkgPT09ICd0aGVtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxDb21wZXRlbmN5VGhlbWUucHVzaChlbGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWUucHVzaChlbGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIGRvOiAgdG8gYmUgY2hlY2sgYmFzZWQgb24gcmVmZiBpZFxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnNlbGVjdGVkQ2FyZENvbXBUaGVtZURhdGEucmVmSWQudG9Mb3dlckNhc2UoKSA9PT0gZWxlLnJlZklkLnRvTG93ZXJDYXNlKCkpe1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3JtQXJyYXk6YW55ID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUFycmF5LmF0KDApLmdldCgnY29tcGV0ZW5jeVRoZW1lJykucGF0Y2hWYWx1ZShlbGUpXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUFycmF5LmF0KDApLmdldCgnY29tcGV0ZW5jeVRoZW1lJykudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcEFyZWFDb250cm9sID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBBcmVhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBBcmVhQ29udHJvbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcEFyZWFDb250cm9sLnBhdGNoVmFsdWUob3B0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBBcmVhQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgfVxuICB9XG5cbiAgYWRkQ29tcGV0ZW5jeVRoZW1lKCl7XG4gICAgaWYgKHRoaXMuZGF0YS5tb2RlID09PSAnbXVsdGktY3JlYXRlJykge1xuICAgICAgdGhpcy5jb21wVGhlbWVGaWVsZHMuaW5zZXJ0KDAsIHRoaXMuY3JlYXRlQ29tcFRoZW1lRmllbGRzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUNvbXBGaWVsZHMoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScpIHtcbiAgICAgIHRoaXMuY29tcFRoZW1lRmllbGRzLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBPblRoZW1lU2VsZWN0aW9uKGV2ZW50OiBhbnksIF9pbmRleFZhbHVlOiBhbnksIG9wdGlvbkRhdGE6YW55KSB7XG4gICAgLy8gaWYgKGV2ZW50LmlzVXNlcklucHV0IHx8IHRoaXMuZGF0YS5vcGVuTW9kZSA9PT0gJ3ZpZXcnKSB7ICAgXG4gICAgY29uc3Qgc2VsZWN0ZWRUaGVtZSA9IGV2ZW50LnNvdXJjZS52YWx1ZVxuICAgIHRoaXMua2NtTGlzdC5mb3JFYWNoKChlbGU6YW55KSA9PiB7XG4gICAgICBpZihzZWxlY3RlZFRoZW1lLmNhdGVnb3J5ID09PSBlbGUuY29kZSkge1xuICAgICAgICBpZihlbGUuY2hpbGRyZW4gJiYgZWxlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgIGVsZS5jaGlsZHJlbi5mb3JFYWNoKCh0aGVtZUNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmKHRoZW1lQ2hpbGQuaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRUaGVtZS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgIGlmKHRoZW1lQ2hpbGQuY2hpbGRyZW4gJiYgdGhlbWVDaGlsZC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25EYXRhWydjaGlsZHJlbiddID0gdGhlbWVDaGlsZC5jaGlsZHJlblxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRhbGxDb21wZXRlbmN5U3ViVGhlbWUgPSB0aGVtZUNoaWxkLmNoaWxkcmVuIFxuICAgICAgICAgICAgICAgICAvLyB0byBkbzogIHRvIGJlIGNoZWNrIGJhc2VkIG9uIHJlZmYgaWRcbiAgICAgICAgICAgICAgICAgbGV0IG1hdGNoZWREYXRhID0gW11cbiAgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmNoaWxkcmVuRGF0YSAmJiB0aGlzLmRhdGEuY2hpbGRyZW5EYXRhLmNhdGVnb3J5ID09PSBcInN1YnRoZW1lXCIpIHtcbiAgICAgICAgICAgICAgICAgIG1hdGNoZWREYXRhID0gXy5pbnRlcnNlY3Rpb25CeSh0aGVtZUNoaWxkLmNoaWxkcmVuLFt0aGlzLmRhdGEuY2hpbGRyZW5EYXRhXSwgJ3JlZklkJyk7XG4gICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRGF0YSA9IF8uaW50ZXJzZWN0aW9uQnkodGhlbWVDaGlsZC5jaGlsZHJlbix0aGlzLnNlbGVjdGVkQ2FyZENvbXBUaGVtZURhdGEuY2hpbGRyZW4sICdyZWZJZCcpO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBsZXQgZm9ybUFycmF5ID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjb21wZXRlbmN5U3ViVGhlbWVDb250cm9sID0gZm9ybUFycmF5LmF0KF9pbmRleFZhbHVlKS5nZXQoJ2NvbXBldGVuY3lTdWJUaGVtZScpO1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbXBldGVuY3lTdWJUaGVtZUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGV0ZW5jeVN1YlRoZW1lQ29udHJvbC5wYXRjaFZhbHVlKG1hdGNoZWREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcGV0ZW5jeVN1YlRoZW1lQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAvLyB9XG4gIH1cblxuICBvblRlcm1SZW1vdmUodGVybURhdGE6IGFueSwgaW5kZXhWYWx1ZTogbnVtYmVyKSB7XG4gICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgIGNvbnN0IGNvbXBUaGVtZUNvbnRyb2wgPSBmb3JtQXJyYXkuYXQoaW5kZXhWYWx1ZSkuZ2V0KCdjb21wZXRlbmN5U3ViVGhlbWUnKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wgfCBudWxsXG4gICAgaWYgKGNvbXBUaGVtZUNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IHRoZW1lcyA9IGNvbXBUaGVtZUNvbnRyb2wudmFsdWVcbiAgICAgIGlmICh0aGVtZXMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGVtZXMuaW5kZXhPZih0ZXJtRGF0YSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICB0aGVtZXMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgIGNvbXBUaGVtZUNvbnRyb2wuc2V0VmFsdWUodGhlbWVzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICB9XG5cbiAgT25TdWJUaGVtZVNlbGVjdGlvbihfZXZlbnQ6IGFueSwgX2luZGV4VmFsdWU6IG51bWJlciwgX29wdGlvbjogYW55KXtcbiAgICAvLyBsZXQgZm9ybUFycmF5ID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgLy8gY29uc3QgY29tcFRoZW1lQ29udHJvbCA9IGZvcm1BcnJheS5hdChpbmRleFZhbHVlKS5nZXQoJ2NvbXBldGVuY3lTdWJUaGVtZScpIGFzIFVudHlwZWRGb3JtQ29udHJvbCB8IG51bGxcbiAgICBcbiAgfVxuXG4gIC8vIGFkZCBmb3JtXG4gIGFzeW5jIG11bHRpQ3JlYXRlKGZvcm06IGFueSwgX2RhdGE6IGFueSkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIC8vIGxldCBjb3VudGVyVGhlbWUgPSAwXG4gICAgbGV0IGNvdW50ZXJTdWJUaGVtZSA9IDBcbiAgICBsZXQgcGFyZW50Q2F0ZWdvcnkgPSB7fVxuICAgIGxldCBjcmVhdGVkVGVybXM6YW55ID0gW11cbiAgICBsZXQgY3JlYXRlZFN1YlRoZW1lID0gW11cbiAgICBpZihmb3JtLnZhbGlkKSB7XG4gICAgICBjb25zdCB0aGVtZUZpZWxkcyA9IGZvcm0gJiYgZm9ybS52YWx1ZSAmJiBmb3JtLnZhbHVlLmNvbXBUaGVtZUZpZWxkc1xuICAgICAgaWYodGhlbWVGaWVsZHMgJiYgdGhlbWVGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgIGxldCBsb2NhbENvbXBBcmVhID0gey4uLnRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhfVxuICAgICAgICBpZihsb2NhbENvbXBBcmVhLmNoaWxkcmVuICYmIGxvY2FsQ29tcEFyZWEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgZGVsZXRlIGxvY2FsQ29tcEFyZWEuY2hpbGRyZW5cbiAgICAgICAgfVxuICAgICAgICBpZihsb2NhbENvbXBBcmVhLmFzc29jaWF0aW9ucyAmJiBsb2NhbENvbXBBcmVhLmFzc29jaWF0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICBkZWxldGUgbG9jYWxDb21wQXJlYS5hc3NvY2lhdGlvbnNcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZW1lRmllbGRzLmZvckVhY2goYXN5bmMgKG9ialZhbCwgdGhlbWVJbmRleCkgPT5cbiAgICAgICAgZm9yKGxldCBbaW5kZXgsIG9ialZhbF0gb2YgdGhlbWVGaWVsZHMuZW50cmllcygpKSB7XG4gICAgICAgICAgcGFyZW50Q2F0ZWdvcnkgPSB7fVxuICAgICAgICAgIGlmKG9ialZhbFsnY29tcGV0ZW5jeVRoZW1lJ10pIHtcbiAgICAgICAgICAgIGNyZWF0ZWRUZXJtcz0gW11cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialZhbFsnY29tcGV0ZW5jeVRoZW1lJ11cbiAgICAgICAgICAgIGNvbnN0IHRlcm06IE5TRnJhbWV3b3JrLklDcmVhdGVUZXJtID0ge1xuICAgICAgICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLFxuICAgICAgICAgICAgICBzdGF0dXM6IGFwcENvbnN0YW50cy5MSVZFLFxuICAgICAgICAgICAgICByZWZJZDogdmFsdWUucmVmSWQgfHwgJycsXG4gICAgICAgICAgICAgIHJlZlR5cGU6IHZhbHVlLnJlZlR5cGUgfHwgJycsXG4gICAgICAgICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgICAgICAgcGFyZW50czogW1xuICAgICAgICAgICAgICAgIHsgaWRlbnRpZmllcjogYCR7dGhpcy5kYXRhLmZyYW1ld29ya0lkLnRvTG93ZXJDYXNlKCl9XyR7dGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZX1gIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBjb21wZXRlbmN5QXJlYTogbG9jYWxDb21wQXJlYSxcbiAgICAgICAgICAgICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICAgIHRlcm06IHRlcm1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmNyZWF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSkudG9Qcm9taXNlKCkudGhlbihhc3luYyAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgcmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtWydpZGVudGlmaWVyJ10gPSByZXMucmVzdWx0Lm5vZGVfaWRbMF1cbiAgICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZGVsZXRlKCdjb21wZXRlbmN5JylcbiAgICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnkgPSByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1cbiAgICAgICAgICAgICAgY3JlYXRlZFRlcm1zLnB1c2gocmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtKVxuICAgICAgICAgICAgICAvLyBjb3VudGVyVGhlbWUrK1xuXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbjogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICAgICAgICAgICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbi5jb2RlKVxuICBcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGlWMihjcmVhdGVkVGVybXMscGFyZW50Q29sKVxuICAgICAgICAgICAgICAvLyAvLyBhd2FpdCB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aShjcmVhdGVkVGVybXMpXG5cbiAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICBcInNlbGVjdGVkXCI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IHBhcmVudENvbHVtbi5jb2RlLFxuICAgICAgICAgICAgICAgICAgICBcImNhcmRTdWJUeXBlXCI6IFwibWluaW1hbFwiLFxuICAgICAgICAgICAgICAgICAgICBcImlzVmlld09ubHlcIjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIFwiaW5kZXhcIjogcGFyZW50Q29sdW1uLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICBcImNvbHVtbkluZm9cIjogdGhpcy5kYXRhLmNhcmRDb2xJbmZvXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZURhdGExMiA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzOiB7IHRlcm06IFt0aGlzLnNlbGVjdGVkVGVybV0sIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbXVsdGktY3JlYXRlJ1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUFmdGVyQWRkT3JFZGl0U3ViamVjdChyZXNwb25zZURhdGExMilcblxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYob2JqVmFsWydjb21wZXRlbmN5U3ViVGhlbWUnXSkge1xuICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Quc2V0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsIHBhcmVudENhdGVnb3J5KVxuXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBvYmpWYWxbJ2NvbXBldGVuY3lTdWJUaGVtZSddXG4gICAgICAgICAgICBpZih2YWx1ZSAmJiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY291bnRlclN1YlRoZW1lID0gMFxuICAgICAgICAgICAgICBjcmVhdGVkU3ViVGhlbWUgPSBbXVxuICAgICAgICAgICAgICAvLyB2YWx1ZS5mb3JFYWNoKGFzeW5jIChlbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvcihsZXQgZWxlIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVybTogTlNGcmFtZXdvcmsuSUNyZWF0ZVRlcm0gPSB7XG4gICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICAgICAgICAgICAgbmFtZTogZWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZWxlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZGF0YS5uZXh0Q29sSW5mby5jb2RlLFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiBhcHBDb25zdGFudHMuTElWRSxcbiAgICAgICAgICAgICAgICAgIHJlZklkOiBlbGUucmVmSWQgfHwgJycsXG4gICAgICAgICAgICAgICAgICByZWZUeXBlOiBlbGUucmVmVHlwZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgIHBhcmVudHM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBpZGVudGlmaWVyOiBgJHt0aGlzLmRhdGEuZnJhbWV3b3JrSWQudG9Mb3dlckNhc2UoKX1fJHt0aGlzLmRhdGEubmV4dENvbEluZm8uY29kZX1gIH1cbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5OmFueSA9IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVybTogdGVybVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VEYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmNyYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHRoaXMuZGF0YS5uZXh0Q29sSW5mby5jb2RlLCByZXF1ZXN0Qm9keSlcblxuICAgICAgICAgICAgICAgIHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybVsnaWRlbnRpZmllciddID0gcmVzcG9uc2VEYXRhLnJlc3VsdC5ub2RlX2lkWzBdXG4gICAgICAgICAgICAgICAgY3JlYXRlZFN1YlRoZW1lLnB1c2gocmVxdWVzdEJvZHkucmVxdWVzdC50ZXJtKVxuICAgICAgICAgICAgICAgIGNvdW50ZXJTdWJUaGVtZSsrXG4gICAgICAgICAgICAgICAgaWYoKGNvdW50ZXJTdWJUaGVtZSA9PT0gb2JqVmFsWydjb21wZXRlbmN5U3ViVGhlbWUnXS5sZW5ndGgpKXtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGE6YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLm5leHRDb2xJbmZvLmNvZGUpXG4gICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuICAgICAgXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnNNdWx0aVYyKGNyZWF0ZWRTdWJUaGVtZSxwYXJlbnRDb2wsIGluZGV4LCB0aGVtZUZpZWxkcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICBpZihpbmRleCA9PT0gdGhlbWVGaWVsZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5kZWxldGUoJ2NvbXBldGVuY3knKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogdGhpcy5zZWxlY3RlZFRlcm1BcnJheSwgY3JlYXRlZDogdHJ1ZSwgbXVsdGk6ZmFsc2UsIGNhbGxVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSBNYXBwaW5nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBhc3luYyBjcmF0ZVRlcm0oZnJhbWV3b3JrSWQ6IGFueSwgY29sQ29kZTogYW55LCByZXF1ZXN0Qm9keTogYW55KXtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpPT57XG4gICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UuY3JlYXRlVGVybShmcmFtZXdvcmtJZCwgY29sQ29kZSwgcmVxdWVzdEJvZHkpLnN1YnNjcmliZSgocmVzOiBhbnkpPT57XG4gICAgICAgIHJlc29sdmUocmVzKVxuICAgICAgfSwoKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDcmVhdGUgVGVybSBmYWlsZWQuYClcbiAgICAgIH0pKVxuICAgIH0pXG4gIH1cblxuXG5cbiAgYXN5bmMgdXBkYXRlVGVybUFzc29jaWF0aW9uc011bHRpVjIoY3JlYXRlZFRlcm1zOiBhbnlbXSwgcGFyZW50U2VsZWN0ZWRUZXJtPzogYW55LCBfcnVubmluZ0luZGV4PzogbnVtYmVyLCBfdGhlbUZpZWxkc0xlbmd0aD86IG51bWJlcikge1xuICAgIGlmKGNyZWF0ZWRUZXJtcyAmJiBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGVybUFycmF5ID0gW11cbiAgICAgIC8vIGxldCBjcmVhdGVkVGVybXNDb3VudGVyID0gMFxuICAgICAgbGV0IGNyZWF0ZWRUZXJtc0lkZW50aWZpZXJzID0gW11cbiAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXkgPSBjcmVhdGVkVGVybXNcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gY3JlYXRlZFRlcm1zW2NyZWF0ZWRUZXJtcy5sZW5ndGggLTFdXG4gICAgICBmb3IobGV0IGNyZWF0ZWRUZXJtIG9mIGNyZWF0ZWRUZXJtcykge1xuICAgICAgICBjcmVhdGVkVGVybXNJZGVudGlmaWVycy5wdXNoKHsgaWRlbnRpZmllcjogY3JlYXRlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgfVxuICAgICAgbGV0IGFzc29jaWF0aW9ucyA9IFtdXG4gICAgICBsZXQgY291bnRlciA9IDBcbiAgICAgIGlmKCFwYXJlbnRTZWxlY3RlZFRlcm0pIHtcbiAgICAgICAgZm9yKGNvbnN0IFt2YWx1ZV0gb2YgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3Qpe1xuICAgICAgICAgIGNvbnN0IHBhcmVudDphbnkgPSB2YWx1ZVxuICAgICAgICAgIGNvdW50ZXIrK1xuICAgICAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYy5pZGVudGlmaWVyID8gIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyIH0gOiBudWxsXG4gICAgICAgICAgfSkgOiBbXVxuICAgICAgICAgICAgYXNzb2NpYXRpb25zID0gWy4uLmFzc29jaWF0aW9ucywgLi4uY3JlYXRlZFRlcm1zSWRlbnRpZmllcnNdXG4gICAgICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGxVcGRhdGVBc3NvY2lhdGlvbnNWMihjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuICAgICAgICAgIC8vIGNyZWF0ZWRUZXJtc0NvdW50ZXIrK1xuICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICAgIC8vIGlmKHJ1bm5pbmdJbmRleCA9PT0gdGhlbUZpZWxkc0xlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmRlbGV0ZSgnY29tcGV0ZW5jeScpXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IFt0aGlzLnNlbGVjdGVkVGVybV0sIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUsIGNhbGxVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyAgICAgaWYoY3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5ID09PSAndGhlbWUnKXtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBpZihjcmVhdGVkVGVybXNbMF0uY2F0ZWdvcnkgPT09ICdzdWJ0aGVtZScpeyAgICAgICAgIFxuXG4gICAgICAgICAgICAvLyAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSAke2NyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYClcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgLy8gfVxuICAgICAgICB9IFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gcGFyZW50U2VsZWN0ZWRUZXJtXG4gICAgICAgIGFzc29jaWF0aW9ucyA9IHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5tYXAoKGM6YW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICB9KSA6IFtdXG4gICAgICAgICAgYXNzb2NpYXRpb25zID0gWy4uLmFzc29jaWF0aW9ucywgLi4uY3JlYXRlZFRlcm1zSWRlbnRpZmllcnNdXG4gICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgICAgY29uc3QgcmVndWVzdEJvZHkgPSB7XG4gICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgICAuLi4oYXNzb2NpYXRpb25zICYmIGFzc29jaWF0aW9ucy5sZW5ndGgpID8ge2Fzc29jaWF0aW9uczogWy4uLmFzc29jaWF0aW9uc119IDogbnVsbCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jYWxsVXBkYXRlQXNzb2NpYXRpb25zVjIoY291bnRlciwgcGFyZW50LCByZWd1ZXN0Qm9keSlcblxuICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc0NvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgLy8gdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IFt0aGlzLnNlbGVjdGVkVGVybV0sIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUsIHN0b3BVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgICAgIC8vIGlmKGNyZWF0ZWRUZXJtc1swXS5jYXRlZ29yeSA9PT0gJ3N1YnRoZW1lJyl7ICAgXG4gICAgICAgICAgLy8gICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5ICR7Y3JlYXRlZFRlcm1zWzBdLmNhdGVnb3J5fSBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGkoY3JlYXRlZFRlcm1zOiBhbnlbXSkge1xuICAgIGlmKGNyZWF0ZWRUZXJtcyAmJiBjcmVhdGVkVGVybXMubGVuZ3RoKSB7XG4gICAgICAvLyBsZXQgY3JlYXRlZFRlcm1zQ291bnRlciA9IDBcbiAgICAgIGZvcihsZXQgY3JlYXRlZFRlcm0gb2YgY3JlYXRlZFRlcm1zKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtID0gY3JlYXRlZFRlcm1cbiAgICAgICAgbGV0IGFzc29jaWF0aW9ucyA9IFtdXG4gICAgICAgIGxldCB0ZW1wXG4gICAgICAgIGxldCBjb3VudGVyID0gMFxuICAgICAgICAvLyBsZXQgbG9jYWxJc0V4aXN0ID0gZmFsc2VcbiAgICAgICAgXG4gICAgICAgIGZvcihjb25zdCBbdmFsdWVdIG9mIHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0KXtcbiAgICAgICAgICBjb25zdCBwYXJlbnQ6YW55ID0gdmFsdWVcbiAgICAgICAgICBjb3VudGVyKytcbiAgICAgICAgICB0ZW1wID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbHRlcigoY2hpbGQ6YW55KSA9PiBjaGlsZC5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IG51bGxcbiAgICAgICAgICBhc3NvY2lhdGlvbnMgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4ubWFwKChjOmFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGMuaWRlbnRpZmllciA/ICB7IGlkZW50aWZpZXI6IGMuaWRlbnRpZmllciB9IDogbnVsbFxuICAgICAgICAgIH0pIDogW11cbiAgICAgICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IHRydWVcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciB9KVxuICAgICAgICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gaWYoY3JlYXRlZFRlcm1zQ291bnRlciA9PT0gKGNyZWF0ZWRUZXJtcy5sZW5ndGgtMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWd1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgdGVybToge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLihhc3NvY2lhdGlvbnMgJiYgYXNzb2NpYXRpb25zLmxlbmd0aCkgPyB7YXNzb2NpYXRpb25zOiBbLi4uYXNzb2NpYXRpb25zXX0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbFVwZGF0ZUFzc29jaWF0aW9ucyhjb3VudGVyLCBwYXJlbnQsIHJlZ3Vlc3RCb2R5KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNyZWF0ZWRUZXJtc0NvdW50ZXIrK1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNhbGxVcGRhdGVBc3NvY2lhdGlvbnNWMihjb3VudGVyOiBhbnksIHBhcmVudDogYW55LCByZWd1ZXN0Qm9keTogYW55ICk6IFByb21pc2U8YW55PntcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlVGVybSh0aGlzLmRhdGEuZnJhbWV3b3JrSWQsIHBhcmVudC5jYXRlZ29yeSwgcGFyZW50LmNvZGUsIHJlZ3Vlc3RCb2R5KS5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xuICAgICAgICBwYXJlbnRbJ2NoaWxkcmVuJ10gPSBwYXJlbnQgJiYgcGFyZW50LmNoaWxkcmVuID9bLi4ucGFyZW50LmNoaWxkcmVuLCAuLi50aGlzLnNlbGVjdGVkVGVybUFycmF5XTp0aGlzLnNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgbGV0IGxpc3REYXRhIDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmxpc3QuZ2V0KHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUpXG4gICAgICAgICAgbGV0IGRpZmZlcmVuY2VEYXRhID0gW11cbiAgICAgICAgICBpZihsaXN0RGF0YSAmJiBsaXN0RGF0YS5jaGlsZHJlbiAmJiBsaXN0RGF0YS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRpZmZlcmVuY2VEYXRhICA9IF8uZGlmZmVyZW5jZUJ5KHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksbGlzdERhdGEuY2hpbGRyZW4sICdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpZmZlcmVuY2VEYXRhID0gdGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICAgIH1cbiAgICAgICAgICBsaXN0RGF0YVsnYXNzb2NpYXRpb25zJ10gPSBsaXN0RGF0YSAmJiBsaXN0RGF0YS5hc3NvY2lhdGlvbnMgP1suLi5saXN0RGF0YS5hc3NvY2lhdGlvbnMsIC4uLmRpZmZlcmVuY2VEYXRhXTpkaWZmZXJlbmNlRGF0YVxuICAgICAgICAgIGxpc3REYXRhWydjaGlsZHJlbiddID0gbGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gP1suLi5saXN0RGF0YS5jaGlsZHJlbiwgLi4uZGlmZmVyZW5jZURhdGFdOmRpZmZlcmVuY2VEYXRhXG5cbiAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5mb3JFYWNoKChzZWxlY3RlZERhdGE6IGFueSk9PiB7XG4gICAgICAgICAgICBsZXQgbGlzdERhdGEgOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UubGlzdC5nZXQoc2VsZWN0ZWREYXRhLmNhdGVnb3J5KVxuICAgICAgICAgICAgaWYobGlzdERhdGEgJiYgbGlzdERhdGEuY2hpbGRyZW4gJiYgbGlzdERhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlTG9jYWxMaXN0KGxpc3REYXRhLHBhcmVudCwgdGhpcy5zZWxlY3RlZFRlcm1BcnJheSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSBcbiAgICAgICAgLy8gbGV0IHNlbGVjdGVkQ2FyZEluZm8gPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQodGhpcy5kYXRhLmNhcmRDb2xJbmZvLmNvZGUpXG4gICAgICAgIC8vIHRoaXMuZnJhbWVXb3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiBzZWxlY3RlZENhcmRJbmZvLmNvZGUsIGRhdGE6c2VsZWN0ZWRDYXJkSW5mbywgY2FyZFJlZjpzZWxlY3RlZENhcmRJbmZvLmNhcmRSZWYsIGlzVXBkYXRlOiB0cnVlfSlcbiAgICAgICAgaWYgKGNvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICAvLyB0aGlzIHZhbHVlIGlzIGZvciBzZWxlY3RlZCB0ZXJtIGluIGNhc2Ugb2YgY3JlYXRlIHNjZW5hcmlvLCBpbiBjYXNlIG9mIGVkaXQgc2NlbmFyaW8gdGhpcyB3b24ndCBiZSBhdmFpYWJsZSBcbiAgICAgICAgICAvLyBzbyB0ZXJtIGlzIHNldCBmcm9tIGNoaWxkZGF0YSB3aGljaCBpcyByZWNlaXZlZCBmcm9tIHBhcmFtcyBpbiB1cGRhdGVEYXRhXG4gICAgICAgICAgLy8gY29uc3QgdmFsdWUgPSAodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgPyB0aGlzLnNlbGVjdGVkVGVybSA6IHt9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gY29uc3QgZm91bmQgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmluZChjPT4gYy5pZGVudGlmaWVyID09PSB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSA6IGZhbHNlXG4gICAgICAgICAgLy8gaWYoIWZvdW5kKSB7XG5cbiAgICAgICAgICAgIC8vIHBhcmVudFsnY2hpbGRyZW4nXSA9IHBhcmVudCAmJiBwYXJlbnQuY2hpbGRyZW4gP1suLi5wYXJlbnQuY2hpbGRyZW4sIC4uLnRoaXMuc2VsZWN0ZWRUZXJtQXJyYXldOnRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICAgIC8vIHBhcmVudC5jaGlsZHJlbiA/IHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMuc2VsZWN0ZWRUZXJtKSA6IHBhcmVudFsnY2hpbGRyZW4nXSA9IFt0aGlzLnNlbGVjdGVkVGVybV1cbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gZmFsc2VcbiAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgOiBhbnkgPSB0cnVlXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIGF3YWl0IHJldHVyblZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHJldHVyblZhbHVlIDogYW55ID0gdHJ1ZVxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICBhd2FpdCByZXR1cm5WYWx1ZVxuICAgICAgICB9XG4gICAgICB9LCAoX2VycjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBUZXJtIEFzc29jaWF0aW9uIGZhaWxlZC5gKVxuICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBjYWxsVXBkYXRlQXNzb2NpYXRpb25zKGNvdW50ZXI6IGFueSwgcGFyZW50OiBhbnksIHJlZ3Vlc3RCb2R5OiBhbnkgKTogUHJvbWlzZTxhbnk+e1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgcGFyZW50LmNhdGVnb3J5LCBwYXJlbnQuY29kZSwgcmVndWVzdEJvZHkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChjb3VudGVyID09PSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5zaXplKSB7XG4gICAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFRlcm1bJ2Fzc29jaWF0aW9uUHJvcGVydGllcyddWydhcHByb3ZhbFN0YXR1cyddID0gJ0RyYWZ0JztcbiAgXG4gICAgICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBmb3Igc2VsZWN0ZWQgdGVybSBpbiBjYXNlIG9mIGNyZWF0ZSBzY2VuYXJpbywgaW4gY2FzZSBvZiBlZGl0IHNjZW5hcmlvIHRoaXMgd29uJ3QgYmUgYXZhaWFibGUgXG4gICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAgIC8vIGNvbnN0IHZhbHVlID0gKHRoaXMuc2VsZWN0ZWRUZXJtICYmIHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpID8gdGhpcy5zZWxlY3RlZFRlcm0gOiB7fVxuICAgICAgICAgIGNvbnN0IGZvdW5kID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLmZpbmQoKGM6YW55KT0+IGMuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgOiBmYWxzZVxuICAgICAgICAgIGlmKCFmb3VuZCkge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcy5zZWxlY3RlZFRlcm0pIDogcGFyZW50WydjaGlsZHJlbiddID0gW3RoaXMuc2VsZWN0ZWRUZXJtXVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA6IGFueSA9IHRydWVcbiAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgYXdhaXQgcmV0dXJuVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgOiBhbnkgPSB0cnVlXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgIGF3YWl0IHJldHVyblZhbHVlXG4gICAgICAgIH1cbiAgICAgIH0sIChfZXJyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRWRpdCAke3RoaXMuZGF0YS5jb2x1bW5JbmZvLm5hbWV9IGZhaWxlZCwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcmApXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICB1cGRhdGVUZXJtRGF0YShmb3JtOmFueSwgZGF0YTogYW55KSB7XG4gICAgdGhpcy5kaXNhYmxlVXBkYXRlID0gdHJ1ZVxuICAgIGNvbnN0IGZvcm1EYXRhID0ge1xuICAgICAgLy8gdXNlIHRoaXMgaWYgeW91IG5lZWQgZGlzYWJsZWQgZmllbGQgdmFsdWVzIDogZm9ybS5nZXRSYXdWYWx1ZSgpXG4gICAgICAuLi5mb3JtLnZhbHVlXG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZURhdGEgPSB7XG4gICAgICBmb3JtRGF0YSxcbiAgICAgIHVwZGF0ZVRlcm1EYXRhOiBkYXRhLmNoaWxkcmVuRGF0YVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnModXBkYXRlRGF0YSlcbiAgfVxuXG4gIHVwZGF0ZVRlcm1Bc3NvY2lhdGlvbnModXBkYXRlRGF0YT86IGFueSkge1xuICAgIGxldCBhc3NvY2lhdGlvbnMgPSBbXVxuICAgIGxldCB0ZW1wXG4gICAgbGV0IGNvdW50ZXIgPSAwXG4gICAgLy8gbGV0IGxvY2FsSXNFeGlzdCA9IGZhbHNlXG4gICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZm9yRWFjaCgocGFyZW50KSA9PiB7XG4gICAgICBjb3VudGVyKytcbiAgICAgIHRlbXAgPSBwYXJlbnQuY2hpbGRyZW4gPyBwYXJlbnQuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDphbnkpID0+IGNoaWxkLmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRUZXJtLmlkZW50aWZpZXIpIDogbnVsbFxuICAgICAgYXNzb2NpYXRpb25zID0gcGFyZW50LmNoaWxkcmVuID8gcGFyZW50LmNoaWxkcmVuLm1hcCgoYzphbnkpID0+IHtcbiAgICAgICAgLy8gcmV0dXJuIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyLCBhcHByb3ZhbFN0YXR1czogYy5hc3NvY2lhdGlvblByb3BlcnRpZXM/Yy5hc3NvY2lhdGlvblByb3BlcnRpZXMuYXBwcm92YWxTdGF0dXM6ICdEcmFmdCcgfVxuICAgICAgICByZXR1cm4gYy5pZGVudGlmaWVyID8gIHsgaWRlbnRpZmllcjogYy5pZGVudGlmaWVyIH0gOiBudWxsXG4gICAgICB9KSA6IFtdXG4gICAgICBpZiAodGVtcCAmJiB0ZW1wLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmlzVGVybUV4aXN0ID0gdHJ1ZVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFzc29jaWF0aW9ucy5wdXNoKHsgaWRlbnRpZmllcjogdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllciwgYXBwcm92YWxTdGF0dXM6IGFwcENvbnN0YW50cy5EUkFGVCB9KVxuICAgICAgICBpZih0aGlzLnNlbGVjdGVkVGVybSAmJiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgYXNzb2NpYXRpb25zLnB1c2goeyBpZGVudGlmaWVyOiB0aGlzLnNlbGVjdGVkVGVybS5pZGVudGlmaWVyIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1Rlcm1FeGlzdCA9IGZhbHNlXG4gICAgICAgIGNvbnN0IHJlZ3Vlc3RCb2R5ID0ge1xuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHRlcm06IHtcbiAgICAgICAgICAgICAgLi4uKHVwZGF0ZURhdGEgJiYgdXBkYXRlRGF0YS5mb3JtRGF0YSAmJiB1cGRhdGVEYXRhLnVwZGF0ZVRlcm1EYXRhLmNvZGUgPT09IHBhcmVudC5jb2RlKSA/IHsuLi51cGRhdGVEYXRhLmZvcm1EYXRhfTogbnVsbCxcbiAgICAgICAgICAgICAgLi4uKGFzc29jaWF0aW9ucyAmJiBhc3NvY2lhdGlvbnMubGVuZ3RoKSA/IHthc3NvY2lhdGlvbnM6IFsuLi5hc3NvY2lhdGlvbnNdfSA6IG51bGwsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS51cGRhdGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgcGFyZW50LmNhdGVnb3J5LCBwYXJlbnQuY29kZSwgcmVndWVzdEJvZHkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKGNvdW50ZXIgPT09IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LnNpemUpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRUZXJtWydhc3NvY2lhdGlvblByb3BlcnRpZXMnXVsnYXBwcm92YWxTdGF0dXMnXSA9ICdEcmFmdCc7XG5cbiAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUgaXMgZm9yIHNlbGVjdGVkIHRlcm0gaW4gY2FzZSBvZiBjcmVhdGUgc2NlbmFyaW8sIGluIGNhc2Ugb2YgZWRpdCBzY2VuYXJpbyB0aGlzIHdvbid0IGJlIGF2YWlhYmxlIFxuICAgICAgICAgICAgLy8gc28gdGVybSBpcyBzZXQgZnJvbSBjaGlsZGRhdGEgd2hpY2ggaXMgcmVjZWl2ZWQgZnJvbSBwYXJhbXMgaW4gdXBkYXRlRGF0YVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAodGhpcy5zZWxlY3RlZFRlcm0gJiYgdGhpcy5zZWxlY3RlZFRlcm0uaWRlbnRpZmllcikgPyB0aGlzLnNlbGVjdGVkVGVybSA6ICh1cGRhdGVEYXRhKSA/IHsuLi51cGRhdGVEYXRhLnVwZGF0ZVRlcm1EYXRhLCAuLi51cGRhdGVEYXRhLmZvcm1EYXRhfSA6IHt9XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVcGRhdGUgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHsgLi4udmFsdWUgfSwgY3JlYXRlZDogdHJ1ZSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVkaXQgJHt0aGlzLmRhdGEuY29sdW1uSW5mby5uYW1lfSBmYWlsZWQsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXJgKVxuICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYFRlcm0gQXNzb2NpYXRpb24gZmFpbGVkLmApXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG4gIGRpYWxvZ0Nsb3NlKHRlcm06IGFueSkge1xuICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5wdWJsaXNoRnJhbWV3b3JrKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRlcm0pXG4gICAgfSwoX2VycjphbnkpPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGVybSlcbiAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW4oYFB1Ymxpc2ggIGZhaWxlZC5gKVxuICAgIH0pO1xuICB9XG5cblxuXG5cblxuICBhc3luYyBtdWx0aUNyZWF0ZVN1YlRoZW1lKF9mb3JtOiBhbnksIGRhdGE6IGFueSkge1xuICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gdHJ1ZVxuICAgIGxldCBmb3JtQXJyYXk6YW55ID0gdGhpcy5jb21wZXRlbmN5Rm9ybS5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgbGV0IHNlbGVjdGVkRm9ybURhdGE6YW55ICA9IGZvcm1BcnJheS5hdCgwKS5nZXQoJ2NvbXBldGVuY3lTdWJUaGVtZScpLnZhbHVlXG4gICAgbGV0IHByZXZpb3VzU3ViVGhlbWVEYXRhID0gZGF0YS5jaGlsZHJlbkRhdGEuY2hpbGRyZW5cbiAgICBsZXQgbmV3bHlBZGRlZDogYW55ID0gW11cbiAgICBsZXQgcmVtb3ZlZEV4aXN0aW5nOmFueSA9IFtdXG4gICAgbGV0IGNyZWF0ZWRTdWJUaGVtZSA9IFtdXG4gICAgbGV0IGNvdW50ZXJTdWJUaGVtZSA9IDBcbiAgICAvLyBsZXQgY291bnRlclJldGlyZVN1YlRoZW1lID0gMFxuICAgIFxuICAgIG5ld2x5QWRkZWQgPSBfLmRpZmZlcmVuY2VCeShzZWxlY3RlZEZvcm1EYXRhLCBwcmV2aW91c1N1YlRoZW1lRGF0YSwgJ3JlZklkJyk7XG4gICAgcmVtb3ZlZEV4aXN0aW5nID0gXy5kaWZmZXJlbmNlQnkocHJldmlvdXNTdWJUaGVtZURhdGEsIHNlbGVjdGVkRm9ybURhdGEsICdyZWZJZCcpO1xuICAgIGlmKG5ld2x5QWRkZWQgJiYgbmV3bHlBZGRlZC5sZW5ndGgpIHtcbiAgICAgICAgLy8gbmV3bHlBZGRlZC5mb3JFYWNoKGFzeW5jICh2YWwsIGkpID0+e1xuICAgICAgICBmb3IobGV0IHZhbCBvZiBuZXdseUFkZGVkKXtcbiAgICAgICAgICBjb25zdCB0ZXJtOiBOU0ZyYW1ld29yay5JQ3JlYXRlVGVybSA9IHtcbiAgICAgICAgICBjb2RlOiB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0VXVpZCgpLFxuICAgICAgICAgIG5hbWU6IHZhbC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWwuZGVzY3JpcHRpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGUsXG4gICAgICAgICAgc3RhdHVzOiBhcHBDb25zdGFudHMuTElWRSxcbiAgICAgICAgICByZWZJZDogdmFsLnJlZklkLFxuICAgICAgICAgIHJlZlR5cGU6IHZhbC5yZWZUeXBlLFxuICAgICAgICAgIC8vIGFwcHJvdmFsU3RhdHVzOmFwcENvbnN0YW50cy5EUkFGVCxcbiAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICB7IGlkZW50aWZpZXI6IGAke3RoaXMuZGF0YS5mcmFtZXdvcmtJZC50b0xvd2VyQ2FzZSgpfV8ke3RoaXMuZGF0YS5jb2x1bW5JbmZvLmNvZGV9YCB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczoge1xuICAgICAgICAgICAgdGltZVN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHk6YW55ID0ge1xuICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICB0ZXJtOiB0ZXJtXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcGFyZW50Q29sdW1uQ29uZmlnRGF0YTphbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICAgIGxldCBwYXJlbnRDb2w6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUpXG4gICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgbGV0IHJlc3BvbnNlRGF0YTogYW55ID0gYXdhaXQgdGhpcy5jcmF0ZVRlcm0odGhpcy5kYXRhLmZyYW1ld29ya0lkLCB0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCByZXF1ZXN0Qm9keSlcbiAgICAgICAgICByZXF1ZXN0Qm9keS5yZXF1ZXN0LnRlcm1bJ2lkZW50aWZpZXInXSA9IHJlc3BvbnNlRGF0YS5yZXN1bHQubm9kZV9pZFswXVxuICAgICAgICAgIGNyZWF0ZWRTdWJUaGVtZS5wdXNoKHJlcXVlc3RCb2R5LnJlcXVlc3QudGVybSlcbiAgICAgICAgICBjb3VudGVyU3ViVGhlbWUrK1xuICAgICAgICAgIGlmKGNvdW50ZXJTdWJUaGVtZSA9PT0gbmV3bHlBZGRlZC5sZW5ndGgpe1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVUZXJtQXNzb2NpYXRpb25zTXVsdGlWMihjcmVhdGVkU3ViVGhlbWUsIHBhcmVudENvbClcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgcGFyZW50Q29sLCBjcmVhdGVkU3ViVGhlbWUsICdjcmVhdGUnKVxuICAgICAgICAgICAgaWYoIShyZW1vdmVkRXhpc3RpbmcgJiYgcmVtb3ZlZEV4aXN0aW5nLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaWFsb2dDbG9zZSh7IHRlcm06IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXksIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUsIGNhbGxVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpQ3JlYXRlID0gZmFsc2VcbiAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSB0aGVtZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgXG4gICAgaWYocmVtb3ZlZEV4aXN0aW5nICYmIHJlbW92ZWRFeGlzdGluZy5sZW5ndGgpIHtcbiAgICAgIGxldCByZW1vdmVkVGVybXNDb2xsZWN0aW9uID0gW11cbiAgICAgIGZvcihsZXQgcmVtb3ZlZFRlcm0gb2YgcmVtb3ZlZEV4aXN0aW5nKSB7XG4gICAgICAgIHJlbW92ZWRUZXJtc0NvbGxlY3Rpb24ucHVzaChyZW1vdmVkVGVybS5jb2RlKVxuICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHN1YlRoZW1lUmVxdWVzdCA9e1xuICAgICAgICAgIFwicmVxdWVzdFwiOiB7IFxuICAgICAgICAgICAgXCJjb250ZW50SWRzXCI6IHJlbW92ZWRUZXJtc0NvbGxlY3Rpb24gXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBhd2FpdCB0aGlzLmZyYW1lV29ya1NlcnZpY2UucmV0aXJlTXVsdGlwbGVUZXJtKHRoaXMuZGF0YS5mcmFtZXdvcmtJZCwgdGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSwgc3ViVGhlbWVSZXF1ZXN0KS50b1Byb21pc2UoKS50aGVuKGFzeW5jICgpID0+IHtcblxuICAgICAgICAgIC8vIGNvdW50ZXJSZXRpcmVTdWJUaGVtZSsrXG4gICAgICAgICAgY29uc3QgcGFyZW50Q29sdW1uQ29uZmlnRGF0YTphbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2UuZ2V0UHJldmlvdXNDYXRlZ29yeSh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlKVxuICAgICAgICAgIGxldCBwYXJlbnRDb2w6IGFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5zZWxlY3Rpb25MaXN0LmdldChwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUpXG5cbiAgICAgICAgICAvLyBsZXQgc2VjdGlvbkxpc3QgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNlY3Rpb25MaXN0Y2hpbGRyZW5MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKHBhcmVudENvbC5jaGlsZHJlbiwgcmVtb3ZlZEV4aXN0aW5nLCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgICAgICAgIGNvbnN0IHNlY3Rpb25MaXN0QXNzb2NpYXRpb25MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKHBhcmVudENvbC5hc3NvY2lhdGlvbnMsIHJlbW92ZWRFeGlzdGluZywgKGE6YW55LCBiOiBhbnkpID0+IGEuaWRlbnRpZmllciA9PT0gYi5pZGVudGlmaWVyKTtcbiAgICAgICAgIFxuICAgICAgICAgIHBhcmVudENvbFsnY2hpbGRyZW4nXSA9IHNlY3Rpb25MaXN0Y2hpbGRyZW5MaXN0XG4gICAgICAgICAgcGFyZW50Q29sWydhc3NvY2lhdGlvbnMnXSA9IHNlY3Rpb25MaXN0QXNzb2NpYXRpb25MaXN0XG4gICAgXG5cbiAgICAgICAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UudXBkYXRlRnJhbWV3b3JrTGlzdCh0aGlzLmRhdGEuY29sdW1uSW5mby5jb2RlLCBwYXJlbnRDb2wsIHJlbW92ZWRFeGlzdGluZywgJ2RlbGV0ZScpXG5cbiAgICAgICAgICB0aGlzLmRpYWxvZ0Nsb3NlKHsgdGVybTogW10sIGNyZWF0ZWQ6IHRydWUsIG11bHRpOnRydWUsIGNhbGxVcGRhdGU6IGZhbHNlIH0pXG4gICAgICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmN1cnJlbnRTZWxlY3Rpb24ubmV4dCh7IHR5cGU6IHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSwgZGF0YTogcGFyZW50Q29sLCBjYXJkUmVmOiBwYXJlbnRDb2wuY2FyZFJlZiB9KTtcbiAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbihgQ29tcGV0ZW5jeSB0aGVtZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5gKVxuXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSBmYWxzZVxuICB9XG5cbiAgb25EaXNhYmxlVGhlbWUob3B0aW9uOiBhbnkpe1xuICAgIGNvbnN0IHBhcmVudENvbHVtbkNvbmZpZ0RhdGE6YW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLmdldFByZXZpb3VzQ2F0ZWdvcnkodGhpcy5kYXRhLmNvbHVtbkluZm8uY29kZSlcbiAgICBsZXQgcGFyZW50Q29sOiBhbnkgPSB0aGlzLmZyYW1lV29ya1NlcnZpY2Uuc2VsZWN0aW9uTGlzdC5nZXQocGFyZW50Q29sdW1uQ29uZmlnRGF0YS5jb2RlKVxuICAgIGxldCByZXN1bHQgPSAtMVxuICAgIGlmKHBhcmVudENvbCAmJiBwYXJlbnRDb2wuY2hpbGRyZW4gJiYgcGFyZW50Q29sLmNoaWxkcmVuLmxlbmd0aCl7XG4gICAgICByZXN1bHQgPSBwYXJlbnRDb2wuY2hpbGRyZW4uZmluZEluZGV4KChlbGU6IGFueSkgPT4ge1xuICAgICAgICBpZiggKGVsZS5yZWZUeXBlID09PSAndGhlbWUnKSAgJiYgKHRoaXMuc2VsZXRlZENvbXBldGVuY3lBcmVhLmNvZGUgPT09IGVsZS5hZGRpdGlvbmFsUHJvcGVydGllcy5jb21wZXRlbmN5QXJlYS5jb2RlKSkge1xuICAgICAgICByZXR1cm4gIGVsZS5yZWZJZCA9PT0gb3B0aW9uLnJlZklkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmKHJlc3VsdCA8IDApe1xuICAgICAgbGV0IGZvcm1BcnJheSA9IHRoaXMuY29tcGV0ZW5jeUZvcm0uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICAgICAgcmVzdWx0ID0gZm9ybUFycmF5LnZhbHVlLmZpbmRJbmRleCgoZm9ybUVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmKGZvcm1FbGUuY29tcGV0ZW5jeVRoZW1lICYmIGZvcm1FbGUuY29tcGV0ZW5jeVRoZW1lLnJlZklkICl7XG4gICAgICAgICAgcmV0dXJuICBmb3JtRWxlLmNvbXBldGVuY3lUaGVtZS5yZWZJZCA9PT0gb3B0aW9uLnJlZklkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9KTtcbiAgICAgfVxuIFxuICAgIC8vIFxuICAgIFxuICAgIHJldHVybiByZXN1bHQgPj0gMCA/IHRydWU6IGZhbHNlXG4gIH1cblxuXG4gIHVwZGF0ZUxvY2FsTGlzdChpdGVtOiBhbnksIHBhcmVudDogYW55LHNlbGVjdGVkVGVybUFycmF5OiBhbnksIHVwZGF0ZVR5cGU/OmFueSkge1xuICAgIGlmKGl0ZW0gJiYgaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgaWYodXBkYXRlVHlwZSA9PT0gJ2RlbGV0ZScpe1xuICAgICAgICBpdGVtLmNoaWxkcmVuLmZvckVhY2goKGl0bURhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGlmKGl0bURhdGEuaWRlbnRpZmllciA9PT0gcGFyZW50LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIC8vIGxldCBkaWZmZXJlbmNlRGF0YSA9IFtdXG4gICAgICAgICAgICAvLyBpZihpdG1EYXRhICYmIGl0bURhdGEuY2hpbGRyZW4gJiYgaXRtRGF0YS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vICAgZGlmZmVyZW5jZURhdGEgID0gXy5kaWZmZXJlbmNlQnkoaXRtRGF0YS5jaGlsZHJlbixzZWxlY3RlZFRlcm1BcnJheSwgJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgIGRpZmZlcmVuY2VEYXRhID0gc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGRpZmZlcmVuY2VEYXRhID0gdGhpcy5zZWxlY3RlZFRlcm1BcnJheVxuICAgICAgICAgICAgY29uc3QgYXNzb2NpYXRpb25MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKGl0bURhdGEuYXNzb2NpYXRpb25zLHNlbGVjdGVkVGVybUFycmF5LCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKGl0bURhdGEuY2hpbGRyZW4sIHNlbGVjdGVkVGVybUFycmF5LCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgICAgICAgICAgaXRtRGF0YVsnYXNzb2NpYXRpb25zJ10gPSBhc3NvY2lhdGlvbkxpc3RcbiAgICAgICAgICAgIGl0bURhdGFbJ2NoaWxkcmVuJ10gPSBjaGlsZHJlbkxpc3RcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoaXRtRGF0YS5jaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb2NhbExpc3QoaXRtRGF0YSwgcGFyZW50LHNlbGVjdGVkVGVybUFycmF5LHVwZGF0ZVR5cGUpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5jaGlsZHJlbi5mb3JFYWNoKChpdG1EYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBpZihpdG1EYXRhLmlkZW50aWZpZXIgPT09IHBhcmVudC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBsZXQgZGlmZmVyZW5jZURhdGEgPSBbXVxuICAgICAgICAgICAgaWYoaXRtRGF0YSAmJiBpdG1EYXRhLmNoaWxkcmVuICYmIGl0bURhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGRpZmZlcmVuY2VEYXRhICA9IF8uZGlmZmVyZW5jZUJ5KHNlbGVjdGVkVGVybUFycmF5LGl0bURhdGEuY2hpbGRyZW4sICdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkaWZmZXJlbmNlRGF0YSA9IHNlbGVjdGVkVGVybUFycmF5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkaWZmZXJlbmNlRGF0YSA9IHRoaXMuc2VsZWN0ZWRUZXJtQXJyYXlcbiAgICAgICAgICAgIGl0bURhdGFbJ2Fzc29jaWF0aW9ucyddID0gaXRtRGF0YSAmJiBpdG1EYXRhLmFzc29jaWF0aW9ucyA/Wy4uLml0bURhdGEuYXNzb2NpYXRpb25zLCAuLi5kaWZmZXJlbmNlRGF0YV06ZGlmZmVyZW5jZURhdGFcbiAgICAgICAgICAgIGl0bURhdGFbJ2NoaWxkcmVuJ10gPSBpdG1EYXRhICYmIGl0bURhdGEuY2hpbGRyZW4gP1suLi5pdG1EYXRhLmNoaWxkcmVuLCAuLi5kaWZmZXJlbmNlRGF0YV06ZGlmZmVyZW5jZURhdGFcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoaXRtRGF0YS5jaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMb2NhbExpc3QoaXRtRGF0YSwgcGFyZW50LCBzZWxlY3RlZFRlcm1BcnJheSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlVGhlbWUoKSB7XG4gICAgdGhpcy5kaXNhYmxlTXVsdGlDcmVhdGUgPSB0cnVlXG4gICAgY29uc3QgY2FyZERhdGEgPSB0aGlzLmRhdGEuY2hpbGRyZW5EYXRhXG4gICAgbGV0IHJlbW92ZWRMaXN0VGVybSA9IFtdXG4gICAgcmVtb3ZlZExpc3RUZXJtLnB1c2goY2FyZERhdGEuY29kZSlcbiAgICBsZXQgc3ViVGhlbWVSZXF1ZXN0ID17XG4gICAgICBcInJlcXVlc3RcIjogeyBcbiAgICAgICAgXCJjb250ZW50SWRzXCI6IHJlbW92ZWRMaXN0VGVybVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICB0aGlzLmZyYW1lV29ya1NlcnZpY2UucmV0aXJlTXVsdGlwbGVUZXJtKHRoaXMuZnJhbWVXb3JrU2VydmljZS5mcmFtZXdvcmtJZCwgY2FyZERhdGEuY2F0ZWdvcnksIHN1YlRoZW1lUmVxdWVzdCkudG9Qcm9taXNlKCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBcbiAgICAgIGxldCByZW1vdmVkRXhpc3RpbmcgPSBbY2FyZERhdGFdXG4gICAgICBjb25zdCBwYXJlbnRDb2x1bW5Db25maWdEYXRhOmFueSA9IHRoaXMuZnJhbWVXb3JrU2VydmljZS5nZXRQcmV2aW91c0NhdGVnb3J5KGNhcmREYXRhLmNhdGVnb3J5KVxuICAgICAgbGV0IHBhcmVudENvbDogYW55ID0gdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnNlbGVjdGlvbkxpc3QuZ2V0KHBhcmVudENvbHVtbkNvbmZpZ0RhdGEuY29kZSlcbiAgICBcbiAgICAgIGNvbnN0IHNlY3Rpb25MaXN0Y2hpbGRyZW5MaXN0OiBhbnkgPSBfLmRpZmZlcmVuY2VXaXRoKHBhcmVudENvbC5jaGlsZHJlbiwgcmVtb3ZlZEV4aXN0aW5nLCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgICAgY29uc3Qgc2VjdGlvbkxpc3RBc3NvY2lhdGlvbkxpc3Q6IGFueSA9IF8uZGlmZmVyZW5jZVdpdGgocGFyZW50Q29sLmFzc29jaWF0aW9ucywgcmVtb3ZlZEV4aXN0aW5nLCAoYTphbnksIGI6IGFueSkgPT4gYS5pZGVudGlmaWVyID09PSBiLmlkZW50aWZpZXIpO1xuICAgIFxuICAgICAgcGFyZW50Q29sWydjaGlsZHJlbiddID0gc2VjdGlvbkxpc3RjaGlsZHJlbkxpc3RcbiAgICAgIHBhcmVudENvbFsnYXNzb2NpYXRpb25zJ10gPSBzZWN0aW9uTGlzdEFzc29jaWF0aW9uTGlzdFxuICAgICAgdGhpcy5mcmFtZVdvcmtTZXJ2aWNlLnVwZGF0ZUZyYW1ld29ya0xpc3QoY2FyZERhdGEuY2F0ZWdvcnksIHBhcmVudENvbCwgcmVtb3ZlZEV4aXN0aW5nLCAnZGVsZXRlJylcbiAgICAgIHRoaXMuZnJhbWVXb3JrU2VydmljZS5jdXJyZW50U2VsZWN0aW9uLm5leHQoeyB0eXBlOiBwYXJlbnRDb2x1bW5Db25maWdEYXRhLmNvZGUsIGRhdGE6IHBhcmVudENvbCwgY2FyZFJlZjogcGFyZW50Q29sLmNhcmRSZWYgfSlcbiAgICAgIHRoaXMuZGlhbG9nQ2xvc2Uoe30pXG4gICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5IHRoZW1lIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApXG4gICAgfSwoKF9lcnI6IGFueSk9PiB7XG4gICAgICB0aGlzLmRpc2FibGVNdWx0aUNyZWF0ZSA9IGZhbHNlXG4gICAgICB0aGlzLl9zbmFja0Jhci5vcGVuKGBDb21wZXRlbmN5IHRoZW1lIGRlbGV0ZSBmYWlsZWQuYClcbiAgICB9KSlcbiAgfVxuXG5cbiAgLy8gZ2V0dGVyIG1ldGhvZHNcblxuICBnZXQgY29tcFRoZW1lRmllbGRzKCk6IFVudHlwZWRGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmNvbXBldGVuY3lGb3JtLmdldCgnY29tcFRoZW1lRmllbGRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuXG59XG4iLCJcbjxkaXYgY2xhc3M9XCJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzYWJsZU11bHRpQ3JlYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtMSB3LTEwMCBhYnNvbHV0ZSBsb2FkZXItYmcgaXRlbXMtY2VudGVyIHB0LTUgdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJkaXNwbGF5LWlubGluZS1ibG9jayBtYi01XCIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0cm9rZVdpZHRoXT1cIjNcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgIDwhLS0gPHA+e3tsb2FkZXJNc2d9fTwvcD4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nTmV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibW9kYWxUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiYWN0aW9uIGl0ZW1zXCJcbiAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJjYXJkTWVudVwiIFttYXRNZW51VHJpZ2dlckRhdGFdPVwieydkYXRhJzpkYXRhfVwiIGNsYXNzPVwiYWN0aW9uLWJ0blwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0ZXJtIG9mIGRhdGE/LnNlbGVjdGVkUGFyZW50VGVybXNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGVybS5jYXRlZ29yeSAhPT0gJ2NvbXBldGVuY3knXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJuYW1lXCIgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb3JtLWxhYmVsXCIgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2ZyYW1lV29ya1NlcnZpY2UuZ2V0Q29uZmlnKHRlcm0uY2F0ZWdvcnkpLmxhYmVsTmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgbmFtZT1cIm5hbWVcIiBpZD1cIm5hbWVcIiAjbmFtZSBwbGFjZWhvbGRlcj1cInt7YXBwX3N0cmluZ3MubmFtZX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInRlcm0ubmFtZVwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29tcGV0ZW5jeUZvcm1cIj5cbiAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY29tcGV0ZW5jeUZvcm1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiIGFyaWEtbGFiZWw9XCJGaXJzdCBuYW1lIGxhYmUgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydTZWxlY3QgQXJlYSd9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cCBjbGFzcz1cImNvbXBldGVuY3ktZ3JvdXBcIiBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBBcmVhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gIFtkaXNhYmxlZF09XCJkYXRhPy5jb2x1bW5JbmZvPy5jb2RlID09PSAnc3VidGhlbWUnIHx8IGRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCIgY2xhc3M9XCJsZWFybmluZy1zZWN0aW9uXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtYnRuJzppdGVtPy5jb2RlID09PSBzZWxldGVkQ29tcGV0ZW5jeUFyZWE/LmNvZGV9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jeUFyZWE/LmNoaWxkcmVuXCIgW3ZhbHVlXT1cIml0ZW1cIiBbY2hlY2tlZF09XCJpdGVtPy5jb2RlID09PSBzZWxldGVkQ29tcGV0ZW5jeUFyZWE/LmNvZGVcIiAoY2hhbmdlKT1cImNsZWFyU2VsZWN0ZWRUaGVtZXMoaXRlbSlcIj57e2l0ZW0ubmFtZX19PC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnbXVsdGktY3JlYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1lbmQgbWItNFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8uY29sdW1uSW5mbz8uY29kZSAhPT0gJ3N1YnRoZW1lJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1hdC1idXR0b24gZmxleCBpdGVtcy1jZW50ZXIgY3JlYXRlLWFjY29yZGlvbi1idG5cIiAqbmdJZj1cImRhdGEubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIiAoY2xpY2spPVwiYWRkQ29tcGV0ZW5jeVRoZW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTIgbWF0LWljb24tY3VzdG9tIFwiPmFkZF9jaXJjbGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgbW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7e2RhdGEuY29sdW1uSW5mby5uYW1lfX0gIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24gZm9ybUFycmF5TmFtZT1cImNvbXBUaGVtZUZpZWxkc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXTsgbGV0IGkgPSBpbmRleDsgbGV0IGlzRmlyc3QgPSBmaXJzdFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWFyZ2luLWJvdHRvbS1sIGNvbXAtdGhlbWUtZmllbGRzXCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiIFtleHBhbmRlZF09XCJpc0ZpcnN0XCI+ICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVRoZW1lPy52YWx1ZT8ubmFtZX19IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcGFuZWwtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8uY29sdW1uSW5mbz8uY29kZSAhPT0gJ3N1YnRoZW1lJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKm5nSWY9XCJkYXRhLm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ29tcEZpZWxkcyhpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uLWN1c3RvbSBcIj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIG1hcmdpbi10b3Atc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkZpcnN0IG5hbWUgbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RhdGEub3Blbk1vZGUgIT09ICd2aWV3Jz8gJ1NlbGVjdCBDb21wZXRlbmN5IFRoZW1lJzogJ0NvbXBldGVuY3kgVGhlbWUgTmFtZSd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Rpc2FibGVkXT1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgPT09ICdzdWJ0aGVtZScgfHwgZGF0YS5vcGVuTW9kZSA9PT0ndmlldydcIiBwbGFjZWhvbGRlcj1cIkNob29zZSB0aGUgQ29tcGV0ZW5jeSBUaGVtZVwiIGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lUaGVtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRhbGxDb21wZXRlbmN5VGhlbWVcIiAgW3ZhbHVlXT1cIm9wdGlvblwiIFtkaXNhYmxlZF09XCJvbkRpc2FibGVUaGVtZShvcHRpb24pIHx8IGRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0aW9uQ2hhbmdlKT1cIk9uVGhlbWVTZWxlY3Rpb24oJGV2ZW50LCBpLCBvcHRpb24pXCIgID57e29wdGlvbi5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3B0aW9uLnJlZklkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yIHJlZi1pZFwiPih7e29wdGlvbi5yZWZJZH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzVGVybUV4aXN0XCI+e3thcHBfc3RyaW5ncy5hbHJlYWR5RXhpc3R9fTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmbmFtZVwiIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9ybS1sYWJlbCByZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuPVwiRmlyc3QgTmFtZSBsYWJlbHxMYWJlbCB3aGljaCBleHBsYWlucyB0aGUgdXNlciB0byBlbnRlciBmaXJzdCBuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tYXJpYS1sYWJlbCBhcmlhLWxhYmVsPVwiRmlyc3QgbmFtZSBsYWJlbFwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2RhdGEub3Blbk1vZGUgIT09ICd2aWV3Jz8gJ1NlbGVjdCBDb21wZXRlbmN5IFN1Yi1UaGVtZSc6ICdDb21wZXRlbmN5IFN1Yi1UaGVtZSBOYW1lJ319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGxhY2Vob2xkZXI9XCJDaG9vc2UgdGhlIENvbXBldGVuY3kgVGhlbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJjb21wZXRlbmN5U3ViVGhlbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkYWxsQ29tcGV0ZW5jeVN1YlRoZW1lXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9uLm5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3tjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVN1YlRoZW1lPy52YWx1ZSB8anNvbn19IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbCBmaWVsZC1oZWlnaHRcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBjbGFzcz1cIiBwbGFjZWhvbGRlci10ZXh0XCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgdGhlIENvbXBldGVuY3kgU3ViLVRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVN1YlRoZW1lXCIgbXVsdGlwbGUgW2Rpc2FibGVkXT1cImRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCIgcGFuZWxDbGFzcz1cImZ1bGwtd2lkdGgtcGFuZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBbbmdDbGFzc109XCJ7J2Rpc2JhbGVkU2VsZWN0Jzppc0hpZGVEYXRhfVwiIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdGJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcCAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVN1YlRoZW1lPy52YWx1ZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWQpPVwib25UZXJtUmVtb3ZlKGl0ZW0sIGkpXCIgW2Rpc2FibGVkXT1cImRhdGEub3Blbk1vZGUgPT09J3ZpZXcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc3ViLXRoZW1lLWRpc2FibGUnOiBkYXRhPy5vcGVuTW9kZSA9PT0ndmlldyd9XCIgIFtyZW1vdmFibGVdPVwiZGF0YT8ub3Blbk1vZGUgPT09J3ZpZXcnPyBmYWxzZTogdHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiA+e3sgaXRlbS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZT5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Rib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHt7Y29tcGV0ZW5jeUZvcm0/LmdldCgnY29tcFRoZW1lRmllbGRzJykgfGpzb259fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LW9wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwibmV2ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjc2VhcmNoIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVN1YlRoZW1lXCIgbWF0SW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGdyb3VwICpuZ0lmPVwiZmlsdGVyZWRhbGxDb21wZXRlbmN5U3ViVGhlbWUubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5ObyByZXN1bHRzIGZvdW5kITwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHJlcXVlc3RPYmpEYXRhLnByZWZlcnJlZFByb3ZpZGVyXCIgW3ZhbHVlXT1cIm9wdGlvbi5wcm92aWRlck5hbWVcIj57e29wdGlvbi5wcm92aWRlck5hbWV9fTwvbWF0LW9wdGlvbj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb21wZXRlbmN5Rm9ybT8uZ2V0KCdjb21wVGhlbWVGaWVsZHMnKVsnY29udHJvbHMnXVtpXVsnY29udHJvbHMnXT8uY29tcGV0ZW5jeVRoZW1lPy52YWx1ZT8uY2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIiBjbGFzcz1cIm1hdC1vcHRpb24tbGlzdFwiPnt7b3B0aW9uPy5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9wdGlvbj8ucmVmSWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMiByZWYtaWRcIj4oe3tvcHRpb24/LnJlZklkfX0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtZXJyb3IgKm5nSWY9XCJyZXF1ZXN0Rm9ybS5jb250cm9sc1sncHJvdmlkZXJUZXh0J10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIHNlbGVjdCB1cCB0byBmaXZlIHByZWZlcnJlZCBwcm92aWRlcnMgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvb3RlciBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwiZGVmYXVsdFwiIHR5cGU9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkaWFsb2dDbG9zZSgnJylcIj57e2FwcF9zdHJpbmdzLmNhbmNlbH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnICYmIGRhdGEub3Blbk1vZGUgIT09J3ZpZXcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cInN1Ym1pdFwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbXBldGVuY3lGb3JtPy5pbnZhbGlkXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MuY3JlYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZScgJiYgZGF0YS5vcGVuTW9kZSAhPT0ndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgIT09ICdzdWJ0aGVtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbXBldGVuY3lGb3JtLmludmFsaWQgfHwgZGlzYWJsZU11bHRpQ3JlYXRlXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiIChjbGljayk9XCJtdWx0aUNyZWF0ZShjb21wZXRlbmN5Rm9ybSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MuY3JlYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/LmNvbHVtbkluZm8/LmNvZGUgPT09ICdzdWJ0aGVtZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbXBldGVuY3lGb3JtPy5nZXQoJ2NvbXBUaGVtZUZpZWxkcycpWydjb250cm9scyddWzBdWydjb250cm9scyddPy5jb21wZXRlbmN5U3ViVGhlbWU/LnZhbHVlPy5sZW5ndGg7ZWxzZSB1cGRhdGVCdG5cIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgY2RrRm9jdXNJbml0aWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbXBldGVuY3lGb3JtLmludmFsaWQgfHwgZGlzYWJsZU11bHRpQ3JlYXRlXCIgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiIChjbGljayk9XCJtdWx0aUNyZWF0ZVN1YlRoZW1lKGNvbXBldGVuY3lGb3JtLCBkYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YXBwX3N0cmluZ3MudXBkYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxuZy10ZW1wbGF0ZSAjdXBkYXRlQnRuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wZXRlbmN5Rm9ybS5pbnZhbGlkIHx8IGRpc2FibGVNdWx0aUNyZWF0ZVwiICpuZ0lmPVwiIWRpc2FibGVDcmVhdGVcIiAoY2xpY2spPVwibXVsdGlDcmVhdGVTdWJUaGVtZShjb21wZXRlbmN5Rm9ybSwgZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcF9zdHJpbmdzLmRlbGV0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdlZGl0JyAmJiBkYXRhLm9wZW5Nb2RlICE9PSd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIiBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVUZXJtRGF0YShjb21wZXRlbmN5Rm9ybSwgZGF0YSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbXBldGVuY3lGb3JtPy5pbnZhbGlkIHx8IGRpc2FibGVVcGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhZGlzYWJsZUNyZWF0ZVwiPnt7YXBwX3N0cmluZ3MudXBkYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9vdGVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIFxuICAgIDwvZGl2PlxuICAgIFxuICAgIFxuICAgIDwhLS0gVGl0bGUgb2YgdGhlIHBvcHVwIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjbW9kYWxUaXRsZT5cbiAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ2NyZWF0ZScgfHwgZGF0YT8ubW9kZSA9PT0gJ211bHRpLWNyZWF0ZSdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPnt7ZGF0YS5jb2x1bW5JbmZvLm5hbWUgPT09ICdUaGVtZScgPyBhcHBfc3RyaW5ncy5hZGRDb21wZXRlbmN5IDogYXBwX3N0cmluZ3MuY3JlYXRlTmV3fX0ge3tkYXRhLmNvbHVtbkluZm8ubmFtZX19PC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgPCEtLSB7e2RhdGEgfGpzb259fSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGE/Lm1vZGUgPT09ICdjcmVhdGUnIHx8IGRhdGE/Lm1vZGUgPT09ICdtdWx0aS1jcmVhdGUnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT57e2dldENyZWF0ZU5hbWUoZGF0YSl9fTwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YT8ubW9kZSA9PT0gJ3ZpZXcnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgbWF0LWRpYWxvZy10aXRsZT5WaWV3IHt7ZGF0YS5jb2x1bW5JbmZvLm5hbWV9fTwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhPy5tb2RlID09PSAnZWRpdCdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctdGl0bGVcIiBtYXQtZGlhbG9nLXRpdGxlPnt7YXBwX3N0cmluZ3MuZWRpdH19IHt7ZGF0YS5jb2x1bW5JbmZvLm5hbWV9fTwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cblxuPG1hdC1tZW51ICNjYXJkTWVudT1cIm1hdE1lbnVcIiBjbGFzcz1cIm1lbnUtc2VjXCI+XG4gICAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50IGxldC1yb3dEYXRhPVwiZGF0YVwiIGxldC1jYXJkUmVmPVwiY2FyZFJlZlwiPlxuICAgICAgICA8YnV0dG9uICAoY2xpY2spPVwiZGVsZXRlVGhlbWUoKVwiXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtIG5hbWU9XCJjaGFubmVsLWFuYWx5dGljcy1idXR0b25cIiBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LXRleHRcIiBpMThuLWFyaWEtbGFiZWxcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBbmFseXRpY3NcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4+RGVsZXRlPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT4iXX0=