commons-assessment 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -0
- package/bundles/commons-assessment.umd.js +3968 -0
- package/bundles/commons-assessment.umd.js.map +1 -0
- package/commons-assessment.d.ts +5 -0
- package/esm2015/commons-assessment.js +5 -0
- package/esm2015/lib/commons-assessment.module.js +28 -0
- package/esm2015/lib/configuration.js +4 -0
- package/esm2015/lib/modules/assessment-maker/assessment-maker.component.js +409 -0
- package/esm2015/lib/modules/assessment-maker/assessment-maker.module.js +52 -0
- package/esm2015/lib/modules/assessment-maker/components/add-edit-section-introduction/add-edit-section-introduction.component.js +55 -0
- package/esm2015/lib/modules/assessment-maker/components/assessment-builder/assessment-builder.component.js +551 -0
- package/esm2015/lib/modules/assessment-maker/components/question-details/question-details.component.js +75 -0
- package/esm2015/lib/modules/assessment-maker/services/assessment-builder.service.js +150 -0
- package/esm2015/lib/modules/assessment-maker/services/assessment-maker.service.js +55 -0
- package/esm2015/lib/modules/assessment-taker/assessment-taker.component.js +618 -0
- package/esm2015/lib/modules/assessment-taker/assessment-taker.module.js +70 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-editor/question-type-editor.component.js +70 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-file-upload/question-type-file-upload.component.js +153 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-long/question-type-long.component.js +74 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-multiselect/question-type-multiselect.component.js +105 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-number/question-type-number.component.js +47 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-objective/question-type-objective.component.js +91 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-preference/question-type-preference.component.js +105 -0
- package/esm2015/lib/modules/assessment-taker/components/question-type-short/question-type-short.component.js +98 -0
- package/esm2015/lib/modules/assessment-taker/components/section-instructions/section-instructions.component.js +61 -0
- package/esm2015/lib/modules/assessment-taker/services/assessment-taker.service.js +58 -0
- package/esm2015/lib/modules/assessment-taker/services/response-builder.service.js +202 -0
- package/esm2015/lib/shared/components/text-editor/text-editor.component.js +119 -0
- package/esm2015/lib/shared/controllers.js +21 -0
- package/esm2015/lib/shared/interfaces/assessment.interface.js +2 -0
- package/esm2015/lib/shared/interfaces/question-paper.interface.js +2 -0
- package/esm2015/lib/shared/interfaces/question.interface.js +2 -0
- package/esm2015/lib/shared/material-modules.js +74 -0
- package/esm2015/lib/shared/pipes/order-by.pipe.js +25 -0
- package/esm2015/lib/shared/shared.module.js +48 -0
- package/esm2015/lib/shared/utils.js +16 -0
- package/esm2015/public-api.js +13 -0
- package/fesm2015/commons-assessment.js +3278 -0
- package/fesm2015/commons-assessment.js.map +1 -0
- package/lib/commons-assessment.module.d.ts +10 -0
- package/lib/configuration.d.ts +5 -0
- package/lib/modules/assessment-maker/assessment-maker.component.d.ts +64 -0
- package/lib/modules/assessment-maker/assessment-maker.module.d.ts +14 -0
- package/lib/modules/assessment-maker/components/add-edit-section-introduction/add-edit-section-introduction.component.d.ts +24 -0
- package/lib/modules/assessment-maker/components/assessment-builder/assessment-builder.component.d.ts +70 -0
- package/lib/modules/assessment-maker/components/question-details/question-details.component.d.ts +36 -0
- package/lib/modules/assessment-maker/services/assessment-builder.service.d.ts +43 -0
- package/lib/modules/assessment-maker/services/assessment-maker.service.d.ts +22 -0
- package/lib/modules/assessment-taker/assessment-taker.component.d.ts +81 -0
- package/lib/modules/assessment-taker/assessment-taker.module.d.ts +20 -0
- package/lib/modules/assessment-taker/components/question-type-editor/question-type-editor.component.d.ts +22 -0
- package/lib/modules/assessment-taker/components/question-type-file-upload/question-type-file-upload.component.d.ts +38 -0
- package/lib/modules/assessment-taker/components/question-type-long/question-type-long.component.d.ts +23 -0
- package/lib/modules/assessment-taker/components/question-type-multiselect/question-type-multiselect.component.d.ts +25 -0
- package/lib/modules/assessment-taker/components/question-type-number/question-type-number.component.d.ts +13 -0
- package/lib/modules/assessment-taker/components/question-type-objective/question-type-objective.component.d.ts +23 -0
- package/lib/modules/assessment-taker/components/question-type-preference/question-type-preference.component.d.ts +25 -0
- package/lib/modules/assessment-taker/components/question-type-short/question-type-short.component.d.ts +25 -0
- package/lib/modules/assessment-taker/components/section-instructions/section-instructions.component.d.ts +24 -0
- package/lib/modules/assessment-taker/services/assessment-taker.service.d.ts +20 -0
- package/lib/modules/assessment-taker/services/response-builder.service.d.ts +16 -0
- package/lib/shared/components/text-editor/text-editor.component.d.ts +24 -0
- package/lib/shared/controllers.d.ts +19 -0
- package/lib/shared/interfaces/assessment.interface.d.ts +133 -0
- package/lib/shared/interfaces/question-paper.interface.d.ts +73 -0
- package/lib/shared/interfaces/question.interface.d.ts +82 -0
- package/lib/shared/material-modules.d.ts +18 -0
- package/lib/shared/pipes/order-by.pipe.d.ts +7 -0
- package/lib/shared/shared.module.d.ts +12 -0
- package/lib/shared/utils.d.ts +2 -0
- package/package.json +22 -0
- package/public-api.d.ts +9 -0
- package/src/lib/assets/images/action-dots.svg +5 -0
- package/src/lib/assets/images/add-section.svg +4 -0
- package/src/lib/assets/images/arrow-down-black.svg +3 -0
- package/src/lib/assets/images/arrow-ramp-left.svg +3 -0
- package/src/lib/assets/images/close.svg +3 -0
- package/src/lib/assets/images/copy.svg +3 -0
- package/src/lib/assets/images/delete.svg +1 -0
- package/src/lib/assets/images/drag-drop.svg +8 -0
- package/src/lib/assets/images/file.svg +5 -0
- package/src/lib/assets/images/go-back.svg +3 -0
- package/src/lib/assets/images/info.svg +3 -0
- package/src/lib/assets/images/jpeg.svg +5 -0
- package/src/lib/assets/images/jpg.svg +5 -0
- package/src/lib/assets/images/keyboard.svg +3 -0
- package/src/lib/assets/images/no-questions.svg +14 -0
- package/src/lib/assets/images/pdf.svg +5 -0
- package/src/lib/assets/images/pencil.svg +3 -0
- package/src/lib/assets/images/plus-primary.svg +3 -0
- package/src/lib/assets/images/png.svg +5 -0
- package/src/lib/assets/images/svg.svg +5 -0
- package/src/lib/assets/json/imageConfig.json +22 -0
- package/src/lib/assets/json/labelConfig.json +96 -0
- package/src/lib/assets/json/question-builder-rules.json +97 -0
- package/src/lib/assets/json/questionTypes.json +50 -0
- package/src/lib/assets/theme/_theme.global.scss +63 -0
- package/src/lib/assets/theme/_theme.scss +568 -0
- package/src/lib/assets/theme/styles.global.scss +191 -0
- package/src/lib/assets/theme/styles.scss +63 -0
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Component, Inject, ViewChild } from '@angular/core';
|
|
3
|
+
import { Validators } from '@angular/forms';
|
|
4
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
5
|
+
import { deepClone, generateUuid } from '../../../../shared/utils';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/forms";
|
|
8
|
+
import * as i2 from "../../services/assessment-builder.service";
|
|
9
|
+
import * as i3 from "../../services/assessment-maker.service";
|
|
10
|
+
import * as i4 from "@angular/material/dialog";
|
|
11
|
+
import * as i5 from "@angular/material/progress-spinner";
|
|
12
|
+
import * as i6 from "@angular/material/select";
|
|
13
|
+
import * as i7 from "@angular/material/core";
|
|
14
|
+
import * as i8 from "../../../../shared/components/text-editor/text-editor.component";
|
|
15
|
+
import * as i9 from "@angular/common";
|
|
16
|
+
import * as i10 from "@angular/material/form-field";
|
|
17
|
+
import * as i11 from "@angular/material/tooltip";
|
|
18
|
+
export class AssessmentBuilderComponent {
|
|
19
|
+
constructor(formBuilder, assessmentBuilderService, assessmentMakerService, dialogRef, dialogData) {
|
|
20
|
+
this.formBuilder = formBuilder;
|
|
21
|
+
this.assessmentBuilderService = assessmentBuilderService;
|
|
22
|
+
this.assessmentMakerService = assessmentMakerService;
|
|
23
|
+
this.dialogRef = dialogRef;
|
|
24
|
+
this.dialogData = dialogData;
|
|
25
|
+
this.labelConfig = {};
|
|
26
|
+
this.imageConfig = {};
|
|
27
|
+
this.questionTypes = [];
|
|
28
|
+
this.questionDetails = null;
|
|
29
|
+
this.rules = {};
|
|
30
|
+
this.questionStack = [];
|
|
31
|
+
this.childQuestionGroups = [];
|
|
32
|
+
this.questionBank = {};
|
|
33
|
+
this.isChild = false;
|
|
34
|
+
// parentQuestion: AssessmentQuestion | null = null;
|
|
35
|
+
this.assessmentId = 0;
|
|
36
|
+
this.isSubmitting = false;
|
|
37
|
+
}
|
|
38
|
+
ngOnInit() {
|
|
39
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
40
|
+
this.labelConfig = (_a = this.dialogData) === null || _a === void 0 ? void 0 : _a.labelConfig;
|
|
41
|
+
this.imageConfig = (_b = this.dialogData) === null || _b === void 0 ? void 0 : _b.imageConfig;
|
|
42
|
+
this.rules = (_c = this.dialogData) === null || _c === void 0 ? void 0 : _c.rules;
|
|
43
|
+
this.questionTypes = (_d = this.dialogData) === null || _d === void 0 ? void 0 : _d.questionTypes;
|
|
44
|
+
this.questionBank = (_e = this.dialogData) === null || _e === void 0 ? void 0 : _e.questionBank;
|
|
45
|
+
this.isChild = (_f = this.dialogData) === null || _f === void 0 ? void 0 : _f.isChild;
|
|
46
|
+
this.assessmentId = (_g = this.dialogData) === null || _g === void 0 ? void 0 : _g.assessmentId;
|
|
47
|
+
if (this.dialogData.questionDetails) {
|
|
48
|
+
this.questionDetails = deepClone((_h = this.dialogData) === null || _h === void 0 ? void 0 : _h.questionDetails);
|
|
49
|
+
}
|
|
50
|
+
this.setupFormGroup();
|
|
51
|
+
this.applyDynamicValidators();
|
|
52
|
+
}
|
|
53
|
+
generateChildQuestionList() {
|
|
54
|
+
var _a, _b, _c, _d;
|
|
55
|
+
if (this.isChild) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
const uniqueIds = new Set();
|
|
59
|
+
(_b = (_a = this.questionDetails) === null || _a === void 0 ? void 0 : _a.defaultOptionsList) === null || _b === void 0 ? void 0 : _b.forEach(option => {
|
|
60
|
+
var _a;
|
|
61
|
+
(_a = option.childQuestionList) === null || _a === void 0 ? void 0 : _a.forEach(id => uniqueIds.add(id));
|
|
62
|
+
});
|
|
63
|
+
return (_d = (_c = Array.from(uniqueIds)) === null || _c === void 0 ? void 0 : _c.map(id => {
|
|
64
|
+
return this.questionBank[id] ? deepClone(this.questionBank[id]) : null;
|
|
65
|
+
})) === null || _d === void 0 ? void 0 : _d.filter(Boolean);
|
|
66
|
+
}
|
|
67
|
+
setupFormGroup() {
|
|
68
|
+
var _a;
|
|
69
|
+
this.questionsFormGroup = this.formBuilder.group({
|
|
70
|
+
questionType: ['', Validators.required],
|
|
71
|
+
questionText: ['', Validators.required],
|
|
72
|
+
isMandatory: [false],
|
|
73
|
+
// visibility: [true],
|
|
74
|
+
totalMarks: [null],
|
|
75
|
+
minCharacterCount: [null],
|
|
76
|
+
maxCharacterCount: [null],
|
|
77
|
+
maximumNumberOfOption: [null],
|
|
78
|
+
minimumNumberOfOption: [null],
|
|
79
|
+
maxFileSize: [null],
|
|
80
|
+
maxNoOfFiles: [null],
|
|
81
|
+
customRegex: [''],
|
|
82
|
+
hintText: [''],
|
|
83
|
+
questionMedia: [''],
|
|
84
|
+
options: this.formBuilder.array([]),
|
|
85
|
+
childQuestions: [[]]
|
|
86
|
+
});
|
|
87
|
+
(_a = this.questionsFormGroup.get('questionType')) === null || _a === void 0 ? void 0 : _a.valueChanges.subscribe(() => {
|
|
88
|
+
this.applyDynamicValidators();
|
|
89
|
+
});
|
|
90
|
+
if (this.questionDetails) {
|
|
91
|
+
this.populateForm(this.questionDetails, true);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this.buildChildQuestionGroups([]);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
populateForm(questionDetails, buildChildGroups = false) {
|
|
98
|
+
var _a;
|
|
99
|
+
if (!questionDetails)
|
|
100
|
+
return;
|
|
101
|
+
const childQuestions = (questionDetails === null || questionDetails === void 0 ? void 0 : questionDetails.childQuestions) || this.generateChildQuestionList();
|
|
102
|
+
const formData = this.assessmentBuilderService.getQuestionDTO(Object.assign(Object.assign({}, questionDetails), { childQuestions }));
|
|
103
|
+
this.questionsFormGroup.patchValue(formData);
|
|
104
|
+
if ((_a = formData.options) === null || _a === void 0 ? void 0 : _a.length) {
|
|
105
|
+
formData.options.forEach((opt) => {
|
|
106
|
+
const optGroup = this.createOption();
|
|
107
|
+
optGroup.patchValue(opt);
|
|
108
|
+
this.options.push(optGroup);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (buildChildGroups) {
|
|
112
|
+
this.buildChildQuestionGroups(childQuestions);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
onSubmit() {
|
|
116
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
if (this.questionsFormGroup.invalid) {
|
|
119
|
+
this.questionsFormGroup.markAllAsTouched();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.isSubmitting = true;
|
|
123
|
+
if (this.questionStack.length > 0) {
|
|
124
|
+
// child question logic
|
|
125
|
+
const state = this.questionStack[this.questionStack.length - 1];
|
|
126
|
+
if ((state === null || state === void 0 ? void 0 : state.editingQuestionIndex) !== undefined) {
|
|
127
|
+
if (!state.parentFormValue.childQuestions) {
|
|
128
|
+
state.parentFormValue.childQuestions = [];
|
|
129
|
+
}
|
|
130
|
+
// Update existing child
|
|
131
|
+
const childQuestion = state.parentFormValue.childQuestions[state.editingQuestionIndex];
|
|
132
|
+
const payload = this.assessmentBuilderService.setQuestionDTO(this.questionsFormGroup.value, childQuestion);
|
|
133
|
+
try {
|
|
134
|
+
const question = yield this.updateQuestion(payload);
|
|
135
|
+
state.parentFormValue.childQuestions[state.editingQuestionIndex] = question;
|
|
136
|
+
if (question === null || question === void 0 ? void 0 : question.id) {
|
|
137
|
+
this.questionBank[question.id] = question;
|
|
138
|
+
}
|
|
139
|
+
this.isSubmitting = false;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
this.isSubmitting = false;
|
|
143
|
+
console.error(error);
|
|
144
|
+
(_b = (_a = this.dialogData) === null || _a === void 0 ? void 0 : _a.snackbarMessageEmitter) === null || _b === void 0 ? void 0 : _b.emit({ message: this.labelConfig['COMMONS_ASSESSMENT.TOAST.ERROR_DEFAULT'], type: 'error' });
|
|
145
|
+
throw { error, method: 'PATCH', payload };
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Add new child
|
|
150
|
+
const payload = this.assessmentBuilderService.setQuestionDTO(this.questionsFormGroup.value);
|
|
151
|
+
try {
|
|
152
|
+
const question = yield this.createQuestion(payload);
|
|
153
|
+
(_d = (_c = state === null || state === void 0 ? void 0 : state.parentFormValue) === null || _c === void 0 ? void 0 : _c.childQuestions) === null || _d === void 0 ? void 0 : _d.push(question);
|
|
154
|
+
if (question === null || question === void 0 ? void 0 : question.id) {
|
|
155
|
+
this.questionBank[question.id] = question;
|
|
156
|
+
const grp = this.childQuestionGroups.find((g) => g.id === state.addingToGroupId);
|
|
157
|
+
if (grp) {
|
|
158
|
+
(_e = grp.questionIds) === null || _e === void 0 ? void 0 : _e.push(question === null || question === void 0 ? void 0 : question.id);
|
|
159
|
+
if (grp.optionId) {
|
|
160
|
+
const opt = (_g = (_f = state.parentFormValue) === null || _f === void 0 ? void 0 : _f.defaultOptionsList) === null || _g === void 0 ? void 0 : _g.find((o) => (o.id || o.uuid) == grp.optionId);
|
|
161
|
+
if (opt) {
|
|
162
|
+
opt.childQuestionList = opt.childQuestionList || [];
|
|
163
|
+
opt.childQuestionList.push(question.id);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
this.childQuestionGroups.push({
|
|
169
|
+
id: generateUuid(),
|
|
170
|
+
optionId: null,
|
|
171
|
+
questionIds: [question === null || question === void 0 ? void 0 : question.id]
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
this.isSubmitting = false;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
this.isSubmitting = false;
|
|
179
|
+
console.error(error);
|
|
180
|
+
(_j = (_h = this.dialogData) === null || _h === void 0 ? void 0 : _h.snackbarMessageEmitter) === null || _j === void 0 ? void 0 : _j.emit({ message: this.labelConfig['COMMONS_ASSESSMENT.TOAST.ERROR_DEFAULT'], type: 'error' });
|
|
181
|
+
throw { error, method: 'POST', payload };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
this.questionStack.pop();
|
|
185
|
+
// Re-populate parent form
|
|
186
|
+
this.resetAndPopulate(state === null || state === void 0 ? void 0 : state.parentFormValue);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
let questionDTO = this.assessmentBuilderService.setQuestionDTO(this.questionsFormGroup.value, this.questionDetails);
|
|
190
|
+
// Update local template tree representation
|
|
191
|
+
if ((_k = this.questionDetails) === null || _k === void 0 ? void 0 : _k.id) {
|
|
192
|
+
try {
|
|
193
|
+
questionDTO = yield this.updateQuestion(questionDTO);
|
|
194
|
+
if (questionDTO === null || questionDTO === void 0 ? void 0 : questionDTO.id) {
|
|
195
|
+
this.questionBank[questionDTO.id] = questionDTO;
|
|
196
|
+
}
|
|
197
|
+
(_m = (_l = this.dialogData) === null || _l === void 0 ? void 0 : _l.snackbarMessageEmitter) === null || _m === void 0 ? void 0 : _m.emit({ message: this.labelConfig['COMMONS_ASSESSMENT.TOAST.QUESTION_UPDATED_SUCCESS'], type: 'success' });
|
|
198
|
+
this.dialogRef.close({ success: true });
|
|
199
|
+
this.isSubmitting = false;
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
this.isSubmitting = false;
|
|
203
|
+
console.error(error);
|
|
204
|
+
(_p = (_o = this.dialogData) === null || _o === void 0 ? void 0 : _o.snackbarMessageEmitter) === null || _p === void 0 ? void 0 : _p.emit({ message: this.labelConfig['COMMONS_ASSESSMENT.TOAST.ERROR_DEFAULT'], type: 'error' });
|
|
205
|
+
throw { error, method: 'PATCH', payload: questionDTO };
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
this.createOrEditAssessmentAndQuestionPaper(questionDTO);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
createQuestion(payload) {
|
|
215
|
+
return new Promise((resolve, reject) => {
|
|
216
|
+
this.assessmentMakerService.createQuestion(payload).subscribe({
|
|
217
|
+
next: (res) => resolve(res),
|
|
218
|
+
error: (err) => reject(err)
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
updateQuestion(payload) {
|
|
223
|
+
return new Promise((resolve, reject) => {
|
|
224
|
+
this.assessmentMakerService.patchQuestion(payload).subscribe({
|
|
225
|
+
next: (res) => resolve(res),
|
|
226
|
+
error: (err) => reject(err)
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
createOrEditAssessmentAndQuestionPaper(question) {
|
|
231
|
+
var _a, _b, _c, _d, _e, _f;
|
|
232
|
+
const questionPaper = deepClone((_a = this.dialogData) === null || _a === void 0 ? void 0 : _a.assessmentQuestionPaperData);
|
|
233
|
+
const sectionQuestion = this.assessmentBuilderService.generateSectionQuestion(question);
|
|
234
|
+
if (!((_b = this.dialogData) === null || _b === void 0 ? void 0 : _b.sectionDetails)) {
|
|
235
|
+
const list = questionPaper === null || questionPaper === void 0 ? void 0 : questionPaper.questionPaperSectionList;
|
|
236
|
+
const lastSequence = (list === null || list === void 0 ? void 0 : list.length) ? list[list.length - 1].orderNo || 0 : 0;
|
|
237
|
+
const newSection = this.assessmentBuilderService.createNewSection(lastSequence + 1);
|
|
238
|
+
(_c = newSection === null || newSection === void 0 ? void 0 : newSection.sectionQuestionsList) === null || _c === void 0 ? void 0 : _c.push(sectionQuestion);
|
|
239
|
+
(_d = questionPaper === null || questionPaper === void 0 ? void 0 : questionPaper.questionPaperSectionList) === null || _d === void 0 ? void 0 : _d.push(newSection);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
const sectionRef = (_e = questionPaper === null || questionPaper === void 0 ? void 0 : questionPaper.questionPaperSectionList) === null || _e === void 0 ? void 0 : _e.find((section) => { var _a, _b; return (section === null || section === void 0 ? void 0 : section.id) == ((_b = (_a = this.dialogData) === null || _a === void 0 ? void 0 : _a.sectionDetails) === null || _b === void 0 ? void 0 : _b.id); });
|
|
243
|
+
(_f = sectionRef === null || sectionRef === void 0 ? void 0 : sectionRef.sectionQuestionsList) === null || _f === void 0 ? void 0 : _f.push(sectionQuestion);
|
|
244
|
+
}
|
|
245
|
+
const questionPaperDTO = this.assessmentBuilderService.generateQuestionPaperDTO(questionPaper, this.questionBank);
|
|
246
|
+
const assessmentDTO = this.assessmentBuilderService.generateAssessmentDTO(this.assessmentId, questionPaperDTO);
|
|
247
|
+
const payload = {
|
|
248
|
+
assessment: assessmentDTO,
|
|
249
|
+
questionPaper: questionPaperDTO
|
|
250
|
+
};
|
|
251
|
+
const apiCall = this.assessmentId
|
|
252
|
+
? this.assessmentMakerService.patchAssessmentAndQuestionPaper(payload)
|
|
253
|
+
: this.assessmentMakerService.createAssessmentAndQuestionPaper(payload);
|
|
254
|
+
apiCall.subscribe({
|
|
255
|
+
next: (res) => {
|
|
256
|
+
var _a;
|
|
257
|
+
this.isSubmitting = false;
|
|
258
|
+
this.dialogRef.close({
|
|
259
|
+
success: true,
|
|
260
|
+
assessmentId: (_a = res === null || res === void 0 ? void 0 : res.assessment) === null || _a === void 0 ? void 0 : _a.id,
|
|
261
|
+
questionPaper: res === null || res === void 0 ? void 0 : res.questionPaper,
|
|
262
|
+
questionMap: res === null || res === void 0 ? void 0 : res.questionMap
|
|
263
|
+
});
|
|
264
|
+
},
|
|
265
|
+
error: (error) => {
|
|
266
|
+
var _a, _b;
|
|
267
|
+
console.error(error);
|
|
268
|
+
this.isSubmitting = false;
|
|
269
|
+
(_b = (_a = this.dialogData) === null || _a === void 0 ? void 0 : _a.snackbarMessageEmitter) === null || _b === void 0 ? void 0 : _b.emit({ message: this.labelConfig['COMMONS_ASSESSMENT.TOAST.ERROR_DEFAULT'], type: 'error' });
|
|
270
|
+
throw { error, method: this.assessmentId ? 'PATCH' : 'POST', payload };
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
applyDynamicValidators() {
|
|
275
|
+
var _a;
|
|
276
|
+
if (!this.rules || Object.keys(this.rules).length === 0)
|
|
277
|
+
return;
|
|
278
|
+
const form = this.questionsFormGroup;
|
|
279
|
+
const qType = (_a = form.get('questionType')) === null || _a === void 0 ? void 0 : _a.value;
|
|
280
|
+
const currentRules = this.rules[qType] || {};
|
|
281
|
+
const excludedControls = new Set(['questionType', 'questionText', 'options', 'visibility', 'isMandatory']);
|
|
282
|
+
// Handle normal controls
|
|
283
|
+
Object.entries(form.controls).forEach(([key, control]) => {
|
|
284
|
+
if (excludedControls.has(key))
|
|
285
|
+
return;
|
|
286
|
+
const rule = currentRules[key];
|
|
287
|
+
if (rule === null || rule === void 0 ? void 0 : rule.visible) {
|
|
288
|
+
const validators = (rule === null || rule === void 0 ? void 0 : rule.required) ? [Validators.required] : [];
|
|
289
|
+
if (key === 'questionMedia') {
|
|
290
|
+
validators.push(Validators.pattern(/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?(\?[^\s]*)?$/i));
|
|
291
|
+
}
|
|
292
|
+
control.setValidators(validators.length > 0 ? validators : null);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
control.clearValidators();
|
|
296
|
+
control.setValue(key === 'childQuestions' ? [] : null, { emitEvent: false });
|
|
297
|
+
}
|
|
298
|
+
control.updateValueAndValidity({ emitEvent: false });
|
|
299
|
+
});
|
|
300
|
+
// Handle options FormArray
|
|
301
|
+
const optionsControl = form.get('options');
|
|
302
|
+
const optionsRule = currentRules['options'];
|
|
303
|
+
if (!(optionsRule === null || optionsRule === void 0 ? void 0 : optionsRule.visible)) {
|
|
304
|
+
optionsControl.clearValidators();
|
|
305
|
+
optionsControl.clear();
|
|
306
|
+
optionsControl.updateValueAndValidity({ emitEvent: false });
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const optionsValidator = (optionsRule === null || optionsRule === void 0 ? void 0 : optionsRule.required) ? (control) => {
|
|
310
|
+
const activeOptions = (control.value || []).filter((opt) => opt.isActive !== false);
|
|
311
|
+
return activeOptions.length > 0 ? null : { required: true };
|
|
312
|
+
} : null;
|
|
313
|
+
optionsControl.setValidators(optionsValidator);
|
|
314
|
+
const showWeightage = optionsRule === null || optionsRule === void 0 ? void 0 : optionsRule.showWeightage;
|
|
315
|
+
const showRemarks = optionsRule === null || optionsRule === void 0 ? void 0 : optionsRule.showRemarks;
|
|
316
|
+
optionsControl.controls.forEach(optGroup => {
|
|
317
|
+
const weightCtrl = optGroup.get('weight');
|
|
318
|
+
const remarksCtrl = optGroup.get('remarksRequired');
|
|
319
|
+
if (!showWeightage)
|
|
320
|
+
weightCtrl === null || weightCtrl === void 0 ? void 0 : weightCtrl.setValue(0, { emitEvent: false });
|
|
321
|
+
if (!showRemarks)
|
|
322
|
+
remarksCtrl === null || remarksCtrl === void 0 ? void 0 : remarksCtrl.setValue(false, { emitEvent: false });
|
|
323
|
+
weightCtrl === null || weightCtrl === void 0 ? void 0 : weightCtrl.updateValueAndValidity({ emitEvent: false });
|
|
324
|
+
remarksCtrl === null || remarksCtrl === void 0 ? void 0 : remarksCtrl.updateValueAndValidity({ emitEvent: false });
|
|
325
|
+
});
|
|
326
|
+
optionsControl.updateValueAndValidity({ emitEvent: false });
|
|
327
|
+
}
|
|
328
|
+
showField(fieldName, nestedProp) {
|
|
329
|
+
var _a, _b, _c;
|
|
330
|
+
const questionType = (_b = (_a = this.questionsFormGroup) === null || _a === void 0 ? void 0 : _a.get('questionType')) === null || _b === void 0 ? void 0 : _b.value;
|
|
331
|
+
if (!questionType || !this.rules[questionType] || !this.rules[questionType][fieldName]) {
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
if (nestedProp) {
|
|
335
|
+
return !!this.rules[questionType][fieldName][nestedProp];
|
|
336
|
+
}
|
|
337
|
+
return !!((_c = this.rules[questionType][fieldName]) === null || _c === void 0 ? void 0 : _c.visible);
|
|
338
|
+
}
|
|
339
|
+
get options() {
|
|
340
|
+
return this.questionsFormGroup.get('options');
|
|
341
|
+
}
|
|
342
|
+
addOption() {
|
|
343
|
+
this.options.push(this.createOption());
|
|
344
|
+
}
|
|
345
|
+
removeOption(index) {
|
|
346
|
+
var _a, _b, _c;
|
|
347
|
+
const removedOption = this.options.at(index);
|
|
348
|
+
const removedOptionId = (_a = removedOption.get('id')) === null || _a === void 0 ? void 0 : _a.value;
|
|
349
|
+
const removedOptionUuid = (_b = removedOption.get('uuid')) === null || _b === void 0 ? void 0 : _b.value;
|
|
350
|
+
const uniqueId = removedOptionId || removedOptionUuid;
|
|
351
|
+
if (removedOptionId) {
|
|
352
|
+
(_c = removedOption.get('isActive')) === null || _c === void 0 ? void 0 : _c.setValue(false);
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
this.options.removeAt(index);
|
|
356
|
+
}
|
|
357
|
+
this.childQuestionGroups.forEach(g => {
|
|
358
|
+
if (g.optionId === uniqueId) {
|
|
359
|
+
g.optionId = null;
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
createOption() {
|
|
364
|
+
return this.formBuilder.group({
|
|
365
|
+
id: [0],
|
|
366
|
+
uuid: [generateUuid()],
|
|
367
|
+
optionLabel: ['', Validators.required],
|
|
368
|
+
weight: [0],
|
|
369
|
+
remarksRequired: [false],
|
|
370
|
+
isActive: [true],
|
|
371
|
+
childQuestionList: [[]]
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
allowOnlyNumbers(event) {
|
|
375
|
+
event.target.value = event.target.value.replace(/\D/g, '');
|
|
376
|
+
}
|
|
377
|
+
imageErrorHandler(event, filePath) {
|
|
378
|
+
event.target.src = filePath;
|
|
379
|
+
}
|
|
380
|
+
addEditChildQuestion(childQuestion, index, groupId) {
|
|
381
|
+
var _a;
|
|
382
|
+
// Save current parent state
|
|
383
|
+
const questionData = this.assessmentBuilderService.setQuestionDTO(this.questionsFormGroup.value, this.questionDetails);
|
|
384
|
+
this.questionStack.push({
|
|
385
|
+
parentFormValue: Object.assign(Object.assign({}, questionData), { childQuestions: (_a = this.questionsFormGroup.get('childQuestions')) === null || _a === void 0 ? void 0 : _a.value }),
|
|
386
|
+
editingQuestionIndex: index,
|
|
387
|
+
addingToGroupId: groupId
|
|
388
|
+
});
|
|
389
|
+
// Reset form for child
|
|
390
|
+
this.questionsFormGroup.reset({
|
|
391
|
+
questionType: '',
|
|
392
|
+
questionText: '',
|
|
393
|
+
isMandatory: false,
|
|
394
|
+
// visibility: true,
|
|
395
|
+
totalMarks: null,
|
|
396
|
+
minCharacterCount: null,
|
|
397
|
+
maxCharacterCount: null,
|
|
398
|
+
maximumNumberOfOption: null,
|
|
399
|
+
minimumNumberOfOption: null,
|
|
400
|
+
maxFileSize: null,
|
|
401
|
+
maxNoOfFiles: null,
|
|
402
|
+
customRegex: '',
|
|
403
|
+
hintText: '',
|
|
404
|
+
questionMedia: '',
|
|
405
|
+
childQuestions: [[]]
|
|
406
|
+
});
|
|
407
|
+
const optionsControl = this.questionsFormGroup.get('options');
|
|
408
|
+
while (optionsControl.length !== 0) {
|
|
409
|
+
optionsControl.removeAt(0);
|
|
410
|
+
}
|
|
411
|
+
this.applyDynamicValidators();
|
|
412
|
+
if (childQuestion) {
|
|
413
|
+
this.populateForm(childQuestion);
|
|
414
|
+
}
|
|
415
|
+
this.scrollToTop();
|
|
416
|
+
}
|
|
417
|
+
deleteChildQuestion(index, event) {
|
|
418
|
+
var _a, _b;
|
|
419
|
+
event.stopPropagation();
|
|
420
|
+
const deletedChild = (_a = this.questionsFormGroup.get('childQuestions')) === null || _a === void 0 ? void 0 : _a.value[index];
|
|
421
|
+
this.options.controls.forEach(opt => {
|
|
422
|
+
var _a, _b;
|
|
423
|
+
let childList = [...(((_a = opt.get('childQuestionList')) === null || _a === void 0 ? void 0 : _a.value) || [])];
|
|
424
|
+
childList = childList.filter((id) => id !== deletedChild.id);
|
|
425
|
+
(_b = opt.get('childQuestionList')) === null || _b === void 0 ? void 0 : _b.setValue(childList);
|
|
426
|
+
});
|
|
427
|
+
(_b = this.questionsFormGroup.get('childQuestions')) === null || _b === void 0 ? void 0 : _b.value.splice(index, 1);
|
|
428
|
+
this.childQuestionGroups.forEach(g => {
|
|
429
|
+
g.questionIds = g.questionIds.filter(qid => qid !== deletedChild.id);
|
|
430
|
+
});
|
|
431
|
+
this.childQuestionGroups = this.childQuestionGroups.filter(g => g.questionIds.length > 0);
|
|
432
|
+
}
|
|
433
|
+
getOptionId(opt) {
|
|
434
|
+
var _a, _b, _c;
|
|
435
|
+
return ((_a = opt.get('id')) === null || _a === void 0 ? void 0 : _a.value) ? (_b = opt.get('id')) === null || _b === void 0 ? void 0 : _b.value : (_c = opt.get('uuid')) === null || _c === void 0 ? void 0 : _c.value;
|
|
436
|
+
}
|
|
437
|
+
getChildQuestionById(id) {
|
|
438
|
+
var _a, _b;
|
|
439
|
+
return (_b = (_a = this.questionsFormGroup.get('childQuestions')) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.find((q) => q.id === id);
|
|
440
|
+
}
|
|
441
|
+
getChildQuestionIndex(id) {
|
|
442
|
+
var _a, _b;
|
|
443
|
+
return (_b = (_a = this.questionsFormGroup.get('childQuestions')) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.findIndex((q) => q.id === id);
|
|
444
|
+
}
|
|
445
|
+
deleteChildQuestionById(id, event) {
|
|
446
|
+
event.stopPropagation();
|
|
447
|
+
const index = this.getChildQuestionIndex(id);
|
|
448
|
+
if (index > -1) {
|
|
449
|
+
this.deleteChildQuestion(index, event);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
buildChildQuestionGroups(childQuestions) {
|
|
453
|
+
this.childQuestionGroups = [];
|
|
454
|
+
const processedQuestionIds = new Set();
|
|
455
|
+
this.options.controls.forEach(opt => {
|
|
456
|
+
var _a;
|
|
457
|
+
const optionId = this.getOptionId(opt);
|
|
458
|
+
const childList = ((_a = opt.get('childQuestionList')) === null || _a === void 0 ? void 0 : _a.value) || [];
|
|
459
|
+
if (childList.length > 0) {
|
|
460
|
+
this.childQuestionGroups.push({
|
|
461
|
+
id: generateUuid(),
|
|
462
|
+
optionId: optionId,
|
|
463
|
+
questionIds: [...childList]
|
|
464
|
+
});
|
|
465
|
+
childList.forEach((id) => processedQuestionIds.add(id));
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
childQuestions.forEach(cq => {
|
|
469
|
+
if (cq.id && !processedQuestionIds.has(cq.id)) {
|
|
470
|
+
this.childQuestionGroups.push({
|
|
471
|
+
id: generateUuid(),
|
|
472
|
+
optionId: null,
|
|
473
|
+
questionIds: [cq.id]
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
onGroupOptionChange(groupId, newOptionId) {
|
|
479
|
+
var _a, _b, _c, _d;
|
|
480
|
+
const groupIndex = this.childQuestionGroups.findIndex(g => g.id === groupId);
|
|
481
|
+
if (groupIndex === -1)
|
|
482
|
+
return;
|
|
483
|
+
const group = this.childQuestionGroups[groupIndex];
|
|
484
|
+
const oldOptionId = group.optionId;
|
|
485
|
+
if (oldOptionId) {
|
|
486
|
+
const oldOpt = this.options.controls.find(opt => this.getOptionId(opt) === oldOptionId);
|
|
487
|
+
if (oldOpt) {
|
|
488
|
+
let childList = [...(((_a = oldOpt.get('childQuestionList')) === null || _a === void 0 ? void 0 : _a.value) || [])];
|
|
489
|
+
childList = childList.filter(id => !group.questionIds.includes(id));
|
|
490
|
+
(_b = oldOpt.get('childQuestionList')) === null || _b === void 0 ? void 0 : _b.setValue(childList);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
const existingGroup = this.childQuestionGroups.find(g => g.id !== groupId && g.optionId === newOptionId);
|
|
494
|
+
if (existingGroup && newOptionId) {
|
|
495
|
+
existingGroup.questionIds.push(...group.questionIds);
|
|
496
|
+
this.childQuestionGroups.splice(groupIndex, 1);
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
group.optionId = newOptionId;
|
|
500
|
+
}
|
|
501
|
+
if (newOptionId) {
|
|
502
|
+
const newOpt = this.options.controls.find(opt => this.getOptionId(opt) === newOptionId);
|
|
503
|
+
if (newOpt) {
|
|
504
|
+
let childList = [...(((_c = newOpt.get('childQuestionList')) === null || _c === void 0 ? void 0 : _c.value) || [])];
|
|
505
|
+
const set = new Set([...childList, ...group.questionIds]);
|
|
506
|
+
(_d = newOpt.get('childQuestionList')) === null || _d === void 0 ? void 0 : _d.setValue(Array.from(set));
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
goBack() {
|
|
511
|
+
if (this.questionStack.length === 0) {
|
|
512
|
+
this.dialogRef.close();
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
const state = this.questionStack.pop();
|
|
516
|
+
this.resetAndPopulate(state === null || state === void 0 ? void 0 : state.parentFormValue);
|
|
517
|
+
this.scrollToTop();
|
|
518
|
+
}
|
|
519
|
+
resetAndPopulate(parentValue) {
|
|
520
|
+
this.questionsFormGroup.reset();
|
|
521
|
+
const optionsControl = this.questionsFormGroup.get('options');
|
|
522
|
+
while (optionsControl.length !== 0) {
|
|
523
|
+
optionsControl.removeAt(0);
|
|
524
|
+
}
|
|
525
|
+
this.populateForm(parentValue);
|
|
526
|
+
}
|
|
527
|
+
scrollToTop() {
|
|
528
|
+
if (this.scrollContainer && this.scrollContainer.nativeElement) {
|
|
529
|
+
setTimeout(() => {
|
|
530
|
+
this.scrollContainer.nativeElement.scrollTop = 0;
|
|
531
|
+
}, 0);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
AssessmentBuilderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AssessmentBuilderComponent, deps: [{ token: i1.FormBuilder }, { token: i2.AssessmentBuilderService }, { token: i3.AssessmentMakerService }, { token: i4.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
536
|
+
AssessmentBuilderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: AssessmentBuilderComponent, selector: "lib-app-assessment-builder", viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }], ngImport: i0, template: "<div class=\"d-flex vh-100 position-relative overflow-hidden\">\r\n <div *ngIf=\"questionStack.length > 0 || isChild\"\r\n class=\"p-3 px-2 col-auto assessment-bg-palette-C8DAF9 flex-column align-items-center justify-content-end d-md-flex d-none\">\r\n <p class=\"m-0 assessment-text-semibold-18 vertical-text\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.CHILD_QUESTION']}}\r\n </p>\r\n </div>\r\n <div class=\"flex-grow-1 h-100 d-flex flex-column position-relative\">\r\n <header\r\n class=\"p-3 d-flex align-items-center justify-content-between position-sticky top-0 col-12 border-bottom\">\r\n <p *ngIf=\"questionStack.length == 0\" class=\"mb-0 assessment-text-semibold-18 d-md-inline d-none\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.INPUT_FIELD_SETTINGS']}}\r\n </p>\r\n <button *ngIf=\"questionStack.length > 0\" (click)=\"goBack()\"\r\n class=\"d-flex align-items-center gap-2 assessment-text-grey-ten border-0 outline-0 assessment-text-medium-14 bg-transparent\">\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.GO_BACK']\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/go-back.svg')\" />\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.GO_BACK']}}\r\n </button>\r\n <div class=\"d-flex align-items-center justify-content-md-end justify-content-between gap-3 flex-grow-1\">\r\n <button (click)=\"onSubmit()\" [disabled]=\"isSubmitting\"\r\n class=\"assessment-btn-primary assessment-button-padding assessment-text-medium-13 assessment-zoom-animation assessment-button-padding position-relative\">\r\n <span [ngClass]=\"{'opacity-0': isSubmitting}\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.SAVE_QUESTION']}}\r\n </span>\r\n <mat-spinner *ngIf=\"isSubmitting\" [diameter]=\"20\"\r\n class=\"position-absolute top-50 start-50 translate-middle assessment-spinner-white\"></mat-spinner>\r\n </button>\r\n <img class=\"d-md-none\" *ngIf=\"questionStack.length == 0\" mat-dialog-close\r\n [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.CLOSE']\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/close.svg')\" />\r\n </div>\r\n </header>\r\n <div #scrollContainer class=\"col-12 py-4 px-md-4 px-3 flex-grow-1 overflow-y-auto form-container\"\r\n [formGroup]=\"questionsFormGroup\">\r\n <div class=\"pb-4 col-12\">\r\n <label\r\n class=\"mb-2 assessment-text-medium-16 assessment-text-grey-ten col-12\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.TYPE']}}</label>\r\n <mat-select formControlName=\"questionType\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.SELECT_QUESTION_TYPE']\"\r\n class=\"assessment-mat-select col-12 assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\">\r\n <mat-option class=\"assessment-text-medium-13\" *ngFor=\"let type of questionTypes\" [value]=\"type?.code\">\r\n {{type?.label}}\r\n </mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('questionType')?.errors && questionsFormGroup.get('questionType')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n <div class=\"pb-4 col-12\">\r\n <label class=\"mb-2 assessment-text-medium-16 assessment-text-grey-ten\">Question</label>\r\n <app-text-editor [preText]=\"questionsFormGroup?.get('questionText')?.value\"\r\n (inputChange)=\"questionsFormGroup?.get('questionText')?.patchValue($event)\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.ENTER_QUESTION']\"\r\n class=\"assessment-custom-angular-editor-white assessment-text-regular-13 assessment-text-grey-ten\"\r\n [height]=\"'8rem'\">\r\n </app-text-editor>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('questionText')?.errors && questionsFormGroup.get('questionText')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n <div class=\"col-12 position-relative mt-3\" *ngIf=\"showField('questionMedia')\">\r\n <input formControlName=\"questionMedia\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.ENTER_QUESTION_MEDIA']\"\r\n class=\"col-12 assessment-input-padding assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\"\r\n [ngClass]=\"{'border-danger': questionsFormGroup.get('questionMedia')?.invalid && questionsFormGroup.get('questionMedia')?.touched}\">\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('questionMedia')?.hasError('pattern') && questionsFormGroup.get('questionMedia')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger mt-1\">\r\n {{labelConfig['COMMONS_ASSESSMENT.ERROR.INVALID_URL']}}\r\n </mat-error>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('questionMedia')?.hasError('required') && questionsFormGroup.get('questionMedia')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger mt-1\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n </div>\r\n <div class=\"row mx-0 col-12 pb-4\" *ngIf=\"showField('minCharacterCount') || showField('maxCharacterCount')\">\r\n <div class=\"col-6 ps-0\" *ngIf=\"showField('minCharacterCount')\">\r\n <label\r\n class=\"mb-1 assessment-text-medium-13 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.MIN_CHARACTER_LIMIT']}}</label>\r\n <div class=\"col-12 d-flex align-items-center gap-2 position-relative\">\r\n <input formControlName=\"minCharacterCount\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.NOT_SET']\"\r\n (input)=\"allowOnlyNumbers($event)\"\r\n (blur)=\"questionsFormGroup.get('minCharacterCount')?.markAsTouched()\"\r\n class=\"col-12 assessment-input-padding assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\">\r\n <span\r\n class=\"assessment-text-regular-12 assessment-text-grey-seven position-absolute end-0 me-3\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.CHARACTERS']}}</span>\r\n </div>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('minCharacterCount')?.errors && questionsFormGroup.get('minCharacterCount')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n <div class=\"col-6 pe-0\" *ngIf=\"showField('maxCharacterCount')\">\r\n <label\r\n class=\"mb-1 assessment-text-medium-13 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.MAX_CHARACTER_LIMIT']}}</label>\r\n <div class=\"col-12 d-flex align-items-center gap-2 position-relative\">\r\n <input formControlName=\"maxCharacterCount\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.NOT_SET']\"\r\n (input)=\"allowOnlyNumbers($event)\"\r\n (blur)=\"questionsFormGroup.get('maxCharacterCount')?.markAsTouched()\"\r\n class=\"col-12 assessment-input-padding assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\">\r\n <span\r\n class=\"assessment-text-regular-12 assessment-text-grey-seven position-absolute end-0 me-3\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.CHARACTERS']}}</span>\r\n </div>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('maxCharacterCount')?.errors && questionsFormGroup.get('maxCharacterCount')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n </div>\r\n <div class=\"row mx-0 col-12 pb-4\" *ngIf=\"showField('maxFileSize') || showField('maxNoOfFiles')\">\r\n <div class=\"col-6 ps-0\" *ngIf=\"showField('maxFileSize')\">\r\n <label\r\n class=\"mb-1 assessment-text-medium-13 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.MAX_FILE_SIZE']}}</label>\r\n <div class=\"col-12 d-flex align-items-center gap-2 position-relative\">\r\n <input formControlName=\"maxFileSize\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.NOT_SET']\"\r\n (input)=\"allowOnlyNumbers($event)\"\r\n (blur)=\"questionsFormGroup.get('maxFileSize')?.markAsTouched()\"\r\n class=\"col-12 assessment-input-padding assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\">\r\n <span\r\n class=\"assessment-text-regular-12 assessment-text-grey-seven position-absolute end-0 me-3\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.MB']}}</span>\r\n </div>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('maxFileSize')?.errors && questionsFormGroup.get('maxFileSize')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n <div class=\"col-6 pe-0\" *ngIf=\"showField('maxNoOfFiles')\">\r\n <label\r\n class=\"mb-1 assessment-text-medium-13 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.MAX_NO_OF_FILES']}}</label>\r\n <div class=\"col-12 d-flex align-items-center gap-2 position-relative\">\r\n <input formControlName=\"maxNoOfFiles\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.NOT_SET']\"\r\n (input)=\"allowOnlyNumbers($event)\"\r\n (blur)=\"questionsFormGroup.get('maxNoOfFiles')?.markAsTouched()\"\r\n class=\"col-12 assessment-input-padding assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\">\r\n <span\r\n class=\"assessment-text-regular-12 assessment-text-grey-seven position-absolute end-0 me-3\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.FILES']}}</span>\r\n </div>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('maxNoOfFiles')?.errors && questionsFormGroup.get('maxNoOfFiles')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n </div>\r\n <div class=\"pb-4 col-12\" *ngIf=\"showField('customRegex')\">\r\n <label\r\n class=\"mb-1 assessment-text-medium-13 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.CUSTOM_REGEX']}}</label>\r\n <div class=\"col-12 d-flex align-items-center gap-2 position-relative\">\r\n <input formControlName=\"customRegex\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.ENTER_CUSTOM_REGEX']\"\r\n (blur)=\"questionsFormGroup.get('customRegex')?.markAsTouched()\"\r\n class=\"col-12 assessment-input-padding assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\">\r\n </div>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('customRegex')?.errors && questionsFormGroup.get('customRegex')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n <div class=\"pb-4 col-12\" *ngIf=\"showField('totalMarks') && !isChild && questionStack.length == 0\">\r\n <label\r\n class=\"mb-1 assessment-text-medium-13 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.TOTAL_MARKS']}}</label>\r\n <div class=\"col-12 d-flex align-items-center gap-2 position-relative\">\r\n <input formControlName=\"totalMarks\" placeholder=\"0\" (input)=\"allowOnlyNumbers($event)\"\r\n (blur)=\"questionsFormGroup.get('totalMarks')?.markAsTouched()\"\r\n class=\"col-12 assessment-input-padding assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\">\r\n <span\r\n class=\"assessment-text-regular-12 assessment-text-grey-seven position-absolute end-0 me-3\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.MARKS']}}</span>\r\n </div>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('totalMarks')?.errors && questionsFormGroup.get('totalMarks')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n\r\n <div class=\"row mx-0 col-12 pb-4\"\r\n *ngIf=\"showField('minimumNumberOfOption') || showField('maximumNumberOfOption')\">\r\n <div class=\"col-6 ps-0\" *ngIf=\"showField('minimumNumberOfOption')\">\r\n <label\r\n class=\"mb-1 assessment-text-medium-13 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.MIN_OPTION_SELECT_LIMIT']}}</label>\r\n <div class=\"col-12 d-flex align-items-center gap-2 position-relative\">\r\n <input formControlName=\"minimumNumberOfOption\" placeholder=\"0\"\r\n (input)=\"allowOnlyNumbers($event)\"\r\n (blur)=\"questionsFormGroup.get('minimumNumberOfOption')?.markAsTouched()\"\r\n class=\"col-12 assessment-input-padding assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\">\r\n <span\r\n class=\"assessment-text-regular-12 assessment-text-grey-seven position-absolute end-0 me-3\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.OPTIONS']}}</span>\r\n </div>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('minimumNumberOfOption')?.errors && questionsFormGroup.get('minimumNumberOfOption')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n <div class=\"col-6 pe-0\" *ngIf=\"showField('maximumNumberOfOption')\">\r\n <label\r\n class=\"mb-1 assessment-text-medium-13 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.MAX_OPTION_SELECT_LIMIT']}}</label>\r\n <div class=\"col-12 d-flex align-items-center gap-2 position-relative\">\r\n <input formControlName=\"maximumNumberOfOption\" [placeholder]=\"options.length || 0\"\r\n (input)=\"allowOnlyNumbers($event)\"\r\n (blur)=\"questionsFormGroup.get('maximumNumberOfOption')?.markAsTouched()\"\r\n class=\"col-12 assessment-input-padding assessment-border-radius-two outline-0 assessment-input-border-one assessment-text-medium-13 assessment-bg-grey-one\">\r\n <span\r\n class=\"assessment-text-regular-12 assessment-text-grey-seven position-absolute end-0 me-3\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.OPTIONS']}}</span>\r\n </div>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('maximumNumberOfOption')?.errors && questionsFormGroup.get('maximumNumberOfOption')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pb-4 col-12 mt-md-3\" *ngIf=\"showField('options')\">\r\n <div formArrayName=\"options\">\r\n <ng-container *ngFor=\"let option of options.controls; let i = index\">\r\n <div [formGroupName]=\"i\" *ngIf=\"option.get('isActive')?.value !== false\"\r\n class=\"py-md-0 py-3 border-bottom border-md-0 col-12 d-flex flex-wrap flex-md-nowrap align-items-md-start align-items-center justify-content-between gap-md-4 gap-3\">\r\n\r\n <div class=\"col-12 col-md flex-md-grow-1 d-flex flex-column justify-content-center mt-md-3\"\r\n [class.pt-md-3]=\"i == 0\">\r\n <div class=\"col-12 d-flex align-items-center justify-content-between gap-3\">\r\n <div class=\"flex-grow-1 d-flex align-items-center gap-2\">\r\n <div class=\"rounded-circle p-2 border-grey-ten-2 mt-1\"></div>\r\n <input formControlName=\"optionLabel\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.ENTER_OPTION']\"\r\n class=\"flex-grow-1 assessment-text-medium-13 border-0 outline-0 bg-transparent input-focus py-1\">\r\n </div>\r\n <img class=\"cursor-pointer d-md-none\"\r\n [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.CLOSE']\" (click)=\"removeOption(i)\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/close.svg')\" />\r\n </div>\r\n <mat-error\r\n *ngIf=\"option.get('optionLabel')?.invalid && option.get('optionLabel')?.touched\"\r\n class=\"assessment-text-regular-12 mt-1\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n\r\n <div *ngIf=\"showField('options', 'showWeightage') && !isChild && questionStack.length == 0\"\r\n class=\"col-auto\">\r\n <p class=\"assessment-text-medium-12 assessment-text-grey-six mb-2 mb-md-3\"\r\n [ngClass]=\"{'hidden-label': i > 0}\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.WEIGHTAGE']}}\r\n </p>\r\n <input (input)=\"allowOnlyNumbers($event)\" formControlName=\"weight\"\r\n class=\"px-3 py-md-1 py-2 assessment-border-radius-two assessment-input-border-one outline-0 assessment-text-regular-12 assessment-marks-input assessment-bg-grey-one\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.LABEL.WEIGHTAGE']\">\r\n </div>\r\n\r\n <div *ngIf=\"showField('options', 'showRemarks')\" class=\"col-auto\">\r\n <p class=\"assessment-text-medium-12 assessment-text-grey-six mb-2 mb-md-3 pb-md-1\"\r\n [ngClass]=\"{'hidden-label': i > 0}\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.REMARKS']}}\r\n </p>\r\n <div class=\"form-check form-switch\">\r\n <input type=\"checkbox\" class=\"form-check-input cursor-pointer\"\r\n name=\"remarksRequired\" formControlName=\"remarksRequired\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-none d-md-block pt-3\" [class.custom-margin]=\"i == 0\">\r\n <img class=\"cursor-pointer\" [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.CLOSE']\"\r\n (click)=\"removeOption(i)\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/close.svg')\" />\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <button type=\"button\" (click)=\"addOption()\"\r\n class=\"assessment-border-radius-two d-flex align-items-center gap-2 bg-transparent assessment-text-primary-one assessment-text-medium-12 border-0 assessment-zoom-animation mt-4\">\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.PLUS_PRIMARY']\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/plus-primary.svg')\" />\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.ADD_OPTION']}}\r\n </button>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('options')?.errors && questionsFormGroup.get('options')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n <div class=\"py-4 col-12 border-top\"\r\n *ngIf=\"showField('childQuestions') && questionStack.length == 0 && !isChild\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-2\">\r\n <label\r\n class=\"assessment-text-medium-16 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.CHILD_QUESTIONS']}}</label>\r\n <img matTooltip=\"{{labelConfig['COMMONS_ASSESSMENT.LABEL.CHILD_QUESTIONS_INFO']}}\"\r\n matTooltipPosition=\"above\" matTooltipClass=\"assessment-tooltip\"\r\n [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.INFO']\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/info.svg')\" />\r\n </div>\r\n\r\n <div *ngFor=\"let group of childQuestionGroups; let groupIndex = index\"\r\n class=\"col-12 p-3 my-3 assessment-bg-grey-one assessment-border-radius-three assessment-input-border-one\">\r\n <div class=\"col-12 mb-3\" *ngIf=\"options.length > 0\">\r\n <label\r\n class=\"mb-1 assessment-text-medium-13 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.ASSIGNED_OPTION']}}</label>\r\n <mat-select [value]=\"group.optionId\"\r\n (selectionChange)=\"onGroupOptionChange(group.id, $event.value)\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.SELECT_OPTION_TO_LINK']\"\r\n class=\"col-12 assessment-mat-select assessment-border-radius-two assessment-bg-white outline-0 assessment-input-border-one assessment-text-medium-13\">\r\n <mat-option class=\"assessment-text-medium-13\" [value]=\"null\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.NONE']}}\r\n </mat-option>\r\n <ng-container *ngFor=\"let opt of options.controls; let opIndex = index\">\r\n <mat-option *ngIf=\"opt.get('isActive')?.value !== false\" class=\"assessment-text-medium-13\"\r\n [value]=\"getOptionId(opt)\">\r\n {{ opt.get('optionLabel')?.value || ('Option ' + (opIndex + 1)) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </div>\r\n\r\n <ng-container *ngFor=\"let questionId of group.questionIds; let i = index\">\r\n <ng-container *ngIf=\"getChildQuestionById(questionId) as child\">\r\n <div class=\"d-flex align-items-center justify-content-between mb-1 mt-3\">\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <p class=\"mb-0 assessment-text-medium-14\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.QUESTION']}} {{i + 1}}</p>\r\n </div>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.DELETE']\"\r\n class=\"action-icon cursor-pointer\"\r\n (click)=\"deleteChildQuestionById(child.id, $event)\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/delete.svg')\" />\r\n </div>\r\n </div>\r\n <div [innerHTML]=\"child?.questionText?.[0]?.text\"\r\n (click)=\"addEditChildQuestion(child, getChildQuestionIndex(child.id))\"\r\n class=\"col-12 assessment-button-padding assessment-border-radius-two assessment-bg-white assessment-input-border-one assessment-text-medium-12 cursor-pointer\">\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <button (click)=\"addEditChildQuestion(undefined, undefined, group.id)\"\r\n class=\"assessment-zoom-animation border-0 d-flex align-items-center justify-content-center gap-2 assessment-text-primary-one bg-transparent assessment-text-semibold-12 outline-0 mt-3\">\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.PLUS_PRIMARY']\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/plus-primary.svg')\" />\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.ADD_MORE']}}\r\n </button>\r\n </div>\r\n\r\n <button (click)=\"addEditChildQuestion()\"\r\n class=\"assessment-zoom-animation assessment-button-padding d-flex align-items-center justify-content-center gap-3 assessment-text-primary-one assessment-bg-palette-EDF3FD assessment-text-semibold-12 outline-0 col-12 assessment-border-radius-two mt-3 border-ADC9F6\">\r\n <img [src]=\"imageConfig['COMMONS_ASSESSMENT.ICON.PLUS_PRIMARY']\"\r\n (error)=\"imageErrorHandler($event, 'assets/commons-assessment/images/plus-primary.svg')\" />\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.ADD_CHILD_QUESTION']}}\r\n </button>\r\n </div>\r\n <div class=\"py-4 col-12 border-top\" *ngIf=\"showField('hintText')\">\r\n <label\r\n class=\"mb-2 assessment-text-medium-16 assessment-text-grey-ten\">{{labelConfig['COMMONS_ASSESSMENT.LABEL.ADD_HINT']}}</label>\r\n <app-text-editor [preText]=\"questionsFormGroup?.get('hintText')?.value\"\r\n (inputChange)=\"questionsFormGroup?.get('hintText')?.patchValue($event)\"\r\n [placeholder]=\"labelConfig['COMMONS_ASSESSMENT.PLACEHOLDER.ENTER_HINT']\"\r\n class=\"assessment-custom-angular-editor-white assessment-text-regular-13 assessment-text-grey-ten\"\r\n [height]=\"'8rem'\">\r\n </app-text-editor>\r\n <mat-error\r\n *ngIf=\"questionsFormGroup.get('hintText')?.errors && questionsFormGroup.get('hintText')?.touched\"\r\n class=\"assessment-text-regular-12 assessment-text-danger\">{{labelConfig['COMMONS_ASSESSMENT.ERROR.REQUIRED']}}</mat-error>\r\n </div>\r\n <div class=\"py-4 col-12 border-top\">\r\n <label class=\"mb-2 assessment-text-semibold-18 assessment-text-grey-ten col-12\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.FIELDS_SETTINGS']}}</label>\r\n <!-- <div class=\"my-3 d-flex align-items-center justify-content-between gap-2\">\r\n <div>\r\n <p class=\"mb-0 assessment-text-medium-13 assessment-text-grey-ten\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.SHOW_THIS_FIELD']}}</p>\r\n <p class=\"mb-0 assessment-text-regular-11 assessment-text-grey-eight\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.SHOW_THIS_FIELD_DESC']}}</p>\r\n </div>\r\n <div class=\"form-check form-switch\">\r\n <input type=\"checkbox\" class=\"form-check-input cursor-pointer\" name=\"visibility\"\r\n formControlName=\"visibility\">\r\n </div>\r\n </div> -->\r\n <div class=\"my-3 d-flex align-items-center justify-content-between gap-2\">\r\n <div>\r\n <p class=\"mb-0 assessment-text-medium-13 assessment-text-grey-ten\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.MANDATORY']}}</p>\r\n <p class=\"mb-0 assessment-text-regular-11 assessment-text-grey-eight\">\r\n {{labelConfig['COMMONS_ASSESSMENT.LABEL.MANDATORY_DESC']}}</p>\r\n </div>\r\n <div class=\"form-check form-switch\">\r\n <input type=\"checkbox\" class=\"form-check-input cursor-pointer\" name=\"isMandatory\"\r\n formControlName=\"isMandatory\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".assessment-text-grey-ten{color:var(--assessment-grey-ten)!important}.assessment-bg-grey-ten{background-color:var(--assessment-grey-ten)!important}.assessment-text-grey-nine{color:var(--assessment-grey-nine)!important}.assessment-bg-grey-nine{background-color:var(--assessment-grey-nine)!important}.assessment-text-grey-eight{color:var(--assessment-grey-eight)!important}.assessment-bg-grey-eight{background-color:var(--assessment-grey-eight)!important}.assessment-text-grey-seven{color:var(--assessment-grey-seven)!important}.assessment-bg-grey-seven{background-color:var(--assessment-grey-seven)!important}.assessment-text-grey-six{color:var(--assessment-grey-six)!important}.assessment-bg-grey-six{background-color:var(--assessment-grey-six)!important}.assessment-text-grey-five{color:var(--assessment-grey-five)!important}.assessment-bg-grey-five{background-color:var(--assessment-grey-five)!important}.assessment-text-grey-four{color:var(--assessment-grey-four)!important}.assessment-bg-grey-four{background-color:var(--assessment-grey-four)!important}.assessment-text-grey-three{color:var(--assessment-grey-three)!important}.assessment-bg-grey-three{background-color:var(--assessment-grey-three)!important}.assessment-text-grey-two{color:var(--assessment-grey-two)!important}.assessment-bg-grey-two{background-color:var(--assessment-grey-two)!important}.assessment-text-grey-one{color:var(--assessment-grey-one)!important}.assessment-bg-grey-one{background-color:var(--assessment-grey-one)!important}.assessment-text-white{color:var(--assessment-white)!important}.assessment-bg-white{background-color:var(--assessment-white)!important}.assessment-text-black{color:var(--assessment-black)!important}.assessment-bg-black{background-color:var(--assessment-black)!important}.assessment-text-danger{color:var(--assessment-danger)!important}.assessment-bg-danger{background-color:var(--assessment-danger)!important}.assessment-text-primary-one{color:var(--assessment-primary-one)!important}.assessment-bg-primary-one{background-color:var(--assessment-primary-one)!important}.assessment-text-primary-four{color:var(--assessment-primary-four)!important}.assessment-bg-primary-four{background-color:var(--assessment-primary-four)!important}.assessment-text-palette-EDF3FD{color:var(--assessment-palette-EDF3FD)!important}.assessment-bg-palette-EDF3FD{background-color:var(--assessment-palette-EDF3FD)!important}.assessment-text-palette-C8DAF9{color:var(--assessment-palette-C8DAF9)!important}.assessment-bg-palette-C8DAF9{background-color:var(--assessment-palette-C8DAF9)!important}.assessment-text-palette-ADC9F6{color:var(--assessment-palette-ADC9F6)!important}.assessment-bg-palette-ADC9F6{background-color:var(--assessment-palette-ADC9F6)!important}.assessment-text-palette-FEF9F1{color:var(--assessment-palette-FEF9F1)!important}.assessment-bg-palette-FEF9F1{background-color:var(--assessment-palette-FEF9F1)!important}.assessment-text-palette-F9DAA6{color:var(--assessment-palette-F9DAA6)!important}.assessment-bg-palette-F9DAA6{background-color:var(--assessment-palette-F9DAA6)!important}.assessment-text-palette-E8F7F0{color:var(--assessment-palette-E8F7F0)!important}.assessment-bg-palette-E8F7F0{background-color:var(--assessment-palette-E8F7F0)!important}.assessment-text-palette-B7E7CF{color:var(--assessment-palette-B7E7CF)!important}.assessment-bg-palette-B7E7CF{background-color:var(--assessment-palette-B7E7CF)!important}.assessment-box-shadow-one{box-shadow:var(--assessment-box-shadow-one)!important}.assessment-border-radius-one{border-radius:var(--assessment-border-radius-one)!important}.assessment-border-radius-two{border-radius:var(--assessment-border-radius-two)!important}.assessment-border-radius-three{border-radius:var(--assessment-border-radius-three)!important}.assessment-border-radius-four{border-radius:var(--assessment-border-radius-four)!important}.assessment-border-radius-five{border-radius:var(--assessment-border-radius-five)!important}.assessment-border-radius-six{border-radius:var(--assessment-border-radius-six)!important}.assessment-input-border-one{border:var(--assessment-input-border-one)!important}.assessment-input-border-invalid{border:var(--assessment-input-border-invalid)!important}.assessment-input-focus-border{border:var(--assessment-input-focus-border)!important}.assessment-border-two{border:var(--assessment-border-two)!important}.assessment-card-border{border:var(--assessment-card-border)!important}.assessment-tooltip-border{border:var(--assessment-tooltip-border)!important}.assessment-box-shadow-tooltip{box-shadow:var(--assessment-box-shadow-tooltip)!important}.assessment-button-padding{padding:var(--assessment-button-padding)!important}.assessment-button-padding-large{padding:var(--assessment-button-padding-large)!important}.assessment-input-padding{padding:var(--assessment-input-padding)!important}.assessment-text-font-family{color:var(--assessment-font-family)!important}.assessment-bg-font-family{background-color:var(--assessment-font-family)!important}.assessment-text-regular-12{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(.48rem + .3vw);line-height:calc(.9rem + .3vw)}.assessment-text-bold-12{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.48rem + .3vw);line-height:calc(.9rem + .3vw)}.assessment-text-semibold-12{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.48rem + .3vw);line-height:calc(.9rem + .3vw)}.assessment-text-semibold-11{font-weight:600;font-family:var(--assessment-font-family);font-size:calc(.48rem + .25vw);line-height:calc(.8rem + .25vw)}.assessment-text-medium-11{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(.48rem + .25vw);line-height:calc(.8rem + .25vw)}.assessment-text-regular-11{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(.48rem + .25vw);line-height:calc(.8rem + .25vw)}.assessment-text-medium-12{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(.48rem + .3vw);line-height:calc(.9rem + .3vw)}.assessment-text-regular-13{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(.64rem + .2vw)!important;line-height:calc(.9rem + .2vw)!important}.assessment-text-bold-13{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.64rem + .2vw)!important;line-height:calc(.9rem + .2vw)!important}.assessment-text-semibold-13{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.64rem + .2vw)!important;line-height:calc(.9rem + .2vw)!important}.assessment-text-medium-13{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(.64rem + .2vw)!important;line-height:calc(.9rem + .2vw)!important}.assessment-text-regular-14{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(.7rem + .2vw);line-height:calc(1.2rem + .2vw)}.assessment-text-bold-14{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.7rem + .2vw);line-height:calc(1.2rem + .2vw)}.assessment-text-medium-14{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(.7rem + .2vw)!important;line-height:calc(1.2rem + .2vw)!important}.assessment-text-semibold-14{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.7rem + .2vw);line-height:calc(1.2rem + .2vw)}.assessment-text-semibold-10{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.55rem + .1vw);line-height:calc(1rem + .1vw)}.assessment-text-regular-10{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(.55rem + .1vw)!important;line-height:calc(1rem + .1vw)}.assessment-text-regular-15{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(.85rem + .1vw);line-height:calc(1.4rem + .1vw)}.assessment-text-medium-15{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(.85rem + .1vw);line-height:calc(1.25rem + .1vw)}.assessment-text-semibold-15{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.85rem + .1vw);line-height:calc(1.25rem + .1vw)}.assessment-text-bold-15{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.85rem + .1vw);line-height:calc(1.25rem + .1vw)}.assessment-text-regular-16{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(.77rem + .25vw);line-height:calc(1.25rem + .2vw)}.assessment-text-semibold-16{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.77rem + .25vw);line-height:calc(1.25rem + .2vw)}.assessment-text-bold-16{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.77rem + .25vw);line-height:calc(1.25rem + .2vw)}.assessment-text-medium-16{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(.77rem + .25vw);line-height:calc(1.25rem + .2vw)}.assessment-text-regular-20{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1rem + .3vw);line-height:calc(1.2rem + .3vw)}.assessment-text-bold-20{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .3vw);line-height:calc(1.2rem + .3vw)}.assessment-text-semibold-20{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .3vw);line-height:calc(1.2rem + .3vw)}.assessment-text-medium-20{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .3vw);line-height:calc(1.2rem + .3vw)}.assessment-text-medium-18{font-weight:500;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .125vw)!important;line-height:calc(1.5rem + .1vw)!important}.assessment-text-regular-18{font-weight:400;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .125vw)!important;line-height:calc(1.5rem + .3vw)!important}.assessment-text-bold-18{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .125vw);line-height:calc(1.5rem + .1vw)}.assessment-text-semibold-18{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .125vw)!important;line-height:calc(1.5rem + .1vw)!important}.assessment-text-bold-34{overflow-wrap:break-word;font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(2rem + .15vw);line-height:calc(2.5rem + .15vw)}.assessment-text-medium-34{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(2rem + .15vw);line-height:calc(2.5rem + .15vw)}.assessment-text-bold-32{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1.3rem + .75vw);line-height:calc(1.625rem + .5vw)}.assessment-text-bold-22{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-regular-22{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-semibold-22{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-medium-22{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(1rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-bold-24{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(.8rem + .75vw);line-height:calc(.9rem + .75vw)}.assessment-text-regular-24{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(.8rem + .75vw);line-height:calc(.9rem + .75vw)}.assessment-text-semibold-24{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(.8rem + .75vw);line-height:calc(.9rem + .75vw)}.assessment-text-medium-24{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(.8rem + .75vw);line-height:calc(1.2rem + .75vw)}.assessment-text-regular-26{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1.5rem + .1vw);line-height:calc(1.8rem + .1vw)}.assessment-text-medium-26{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(1.5rem + .1vw);line-height:calc(1.8rem + .1vw)}.assessment-text-bold-26{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1.5rem + .1vw);line-height:calc(1.8rem + .1vw)}.assessment-text-semibold-26{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1.55rem + .1vw);line-height:calc(1.8rem + .1vw)}.assessment-text-regular-28{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1.55rem + .2vw);line-height:calc(2rem + .2vw)}.assessment-text-medium-28{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(1.55rem + .2vw);line-height:calc(2rem + .2vw)}.assessment-text-semibold-28{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1.55rem + .2vw);line-height:calc(2rem + .2vw);letter-spacing:1}.assessment-text-bold-28{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1.55rem + .2vw);line-height:calc(2rem + .2vw)}.assessment-text-regular-30{font-weight:400;font-family:var(--assessment-font-family);font-size:calc(1.5rem + .4vw)}.assessment-text-medium-30{font-weight:500;font-family:var(--assessment-font-family);font-size:calc(1.5rem + .4vw);line-height:calc(1.5rem + .4vw)}.assessment-text-bold-30{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(1.5rem + .4vw);line-height:calc(2rem + .4vw)}.assessment-text-semibold-30{font-weight:600;font-family:var(--assessment-font-family)!important;font-size:calc(1.5rem + .4vw);line-height:calc(1.5rem + .4vw);letter-spacing:.5}.assessment-text-bold-36{font-weight:700;font-family:var(--assessment-font-family)!important;font-size:calc(2rem + .25vw);line-height:calc(2.5rem + .3vw)}.assessment-text-semibold-36{font-weight:600;font-family:var(--assessment-font-family);font-size:calc(2rem + .25vw);line-height:calc(2.5rem + .3vw)}@media (min-height: 100vw) and (orientation: portrait){.assessment-text-bold-34{font-size:calc(1.8rem + .15vh);line-height:calc(2.2rem + .15vh)}.assessment-text-bold-32{font-size:calc(1.3rem + 1vh);line-height:calc(1.5rem + 1vh)}.assessment-text-semibold-30{font-size:calc(1.5rem + .4vh);line-height:calc(1.8rem + .4vh)}.assessment-text-medium-24{line-height:2.188rem}.assessment-text-medium-24,.assessment-text-regular-24,.assessment-text-semibold-24,.assessment-text-bold-24,.assessment-text-light-24{font-size:calc(1.3rem + .5vh);line-height:calc(1.8rem + .5vh)}.assessment-text-medium-18,.assessment-text-regular-18,.assessment-text-bold-18,.assessment-text-semibold-18,.assessment-text-light-18{font-size:calc(1rem + .1vh)!important;line-height:calc(1.6rem + .1vh)!important}.assessment-text-light-16,.assessment-text-bold-16{font-size:calc(.9rem + .3vh)!important;line-height:calc(1.2rem + .3vh)!important}.assessment-text-medium-16,.assessment-text-semibold-16,.assessment-text-regular-16{font-size:calc(.9rem + .2vh)!important;line-height:calc(1.4rem + .2vh)!important}.assessment-text-regular-15,.assessment-text-semibold-15,.assessment-text-bold-15,.assessment-text-light-15{font-size:calc(.8rem + .2vh);line-height:calc(1.27rem + .2vh)}.assessment-text-medium-15{font-size:calc(.8rem + .2vh);line-height:calc(1.27rem + .2vh)}.assessment-text-medium-12,.assessment-text-regular-12,.assessment-text-semibold-12,.assessment-text-bold-12,.assessment-text-medium-upper-12,.assessment-text-light-12{font-size:calc(.5rem + .4vh);line-height:calc(.8rem + .4vh)}.assessment-text-medium-14,.assessment-text-regular-14,.assessment-text-light-14,.assessment-text-medium-upper-14,.assessment-text-semibold-14,.assessment-text-bold-14{font-size:calc(.8rem + .1vh)!important;line-height:calc(1.2rem + .2vh)!important}.assessment-text-regular-13,.assessment-text-medium-13,.assessment-text-semibold-13,.assessment-text-bold-13,.assessment-text-light-13{font-size:calc(.7rem + .2vh)!important;line-height:calc(1rem + .3vh)!important}.assessment-text-regular-11,.assessment-text-medium-11,.assessment-text-semibold-11,.assessment-text-bold-11,.assessment-text-light-11{font-size:calc(.5rem + .2vh)!important;line-height:calc(.8rem + .2vh)!important}}.assessment-btn-primary{background-color:var(--assessment-primary-one);color:var(--assessment-white);border:.064rem solid var(--assessment-primary-one);border-radius:var(--assessment-border-radius-two)}.assessment-btn-primary-transparent{background-color:var(--assessment-white);color:var(--assessment-primary-one);border-radius:var(--assessment-border-radius-two);border:.064rem solid var(--assessment-primary-one)}.assessment-zoom-animation{transition:transform .2s ease;transform:translateZ(0);text-rendering:optimizeLegibility}.assessment-zoom-animation:hover{transform:scale(1.03)}.assessment-zoom-animation:active{transform:scale(1)}.assessment-zoom-animation:disabled{transform:none!important}.change-direction{transform:rotate(180deg);transition:.3s ease-out}.change-direction-reverse{transform:rotate(0);transition:.3s ease-out}.outline-0{outline:none}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.action-icon{width:1.2rem}.mat-menu-item{height:inherit}.form-container{max-height:calc(100dvh - 4rem)}.border-grey-ten-2{border:.12rem solid var(--assessment-grey-ten)}.input-focus{overflow:hidden;text-overflow:ellipsis}.input-focus:focus-visible{border-bottom:var(--assessment-input-focus-border)!important}.assessment-marks-input{width:4.5rem}header{z-index:1}.vertical-text{writing-mode:vertical-rl;text-orientation:mixed;transform:rotate(180deg);white-space:nowrap}@media (min-width: 768px){.hidden-label{visibility:hidden;line-height:0!important}}@media screen and (min-width: 768px){.border-md-0{border:0!important}}.primary-border{border:.064rem solid var(--assessment-primary-one)}.form-check-input:checked{background-color:var(--assessment-primary-one)!important;border-color:var(--assessment-primary-one)!important}.custom-margin{margin-top:1.3rem}.border-ADC9F6{border:.064rem solid var(--assessment-palette-ADC9F6)}\n"], components: [{ type: i5.MatSpinner, selector: "mat-spinner", inputs: ["color"] }, { type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i8.TextEditorComponent, selector: "app-text-editor", inputs: ["height", "placeholder", "subject", "preText", "maxLength", "disabled", "showToolbar", "editorConfig"], outputs: ["inputChange"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["type", "mat-dialog-close", "aria-label", "matDialogClose"], exportAs: ["matDialogClose"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.MatError, selector: "mat-error", inputs: ["id"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
537
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: AssessmentBuilderComponent, decorators: [{
|
|
538
|
+
type: Component,
|
|
539
|
+
args: [{
|
|
540
|
+
selector: 'lib-app-assessment-builder',
|
|
541
|
+
templateUrl: './assessment-builder.component.html',
|
|
542
|
+
styleUrls: ['./assessment-builder.component.scss']
|
|
543
|
+
}]
|
|
544
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.AssessmentBuilderService }, { type: i3.AssessmentMakerService }, { type: i4.MatDialogRef }, { type: undefined, decorators: [{
|
|
545
|
+
type: Inject,
|
|
546
|
+
args: [MAT_DIALOG_DATA]
|
|
547
|
+
}] }]; }, propDecorators: { scrollContainer: [{
|
|
548
|
+
type: ViewChild,
|
|
549
|
+
args: ['scrollContainer']
|
|
550
|
+
}] } });
|
|
551
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXNzbWVudC1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbW1vbnMtYXNzZXNzbWVudC9zcmMvbGliL21vZHVsZXMvYXNzZXNzbWVudC1tYWtlci9jb21wb25lbnRzL2Fzc2Vzc21lbnQtYnVpbGRlci9hc3Nlc3NtZW50LWJ1aWxkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9ucy1hc3Nlc3NtZW50L3NyYy9saWIvbW9kdWxlcy9hc3Nlc3NtZW50LW1ha2VyL2NvbXBvbmVudHMvYXNzZXNzbWVudC1idWlsZGVyL2Fzc2Vzc21lbnQtYnVpbGRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQU16RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBUW5FLE1BQU0sT0FBTywwQkFBMEI7SUFvQm5DLFlBQ1ksV0FBd0IsRUFDeEIsd0JBQWtELEVBQ2xELHNCQUE4QyxFQUMvQyxTQUFtRCxFQUMxQixVQUFlO1FBSnZDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUMvQyxjQUFTLEdBQVQsU0FBUyxDQUEwQztRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFLO1FBeEJuRCxnQkFBVyxHQUE4QixFQUFFLENBQUM7UUFDNUMsZ0JBQVcsR0FBOEIs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QUE0QjtvQkFDdEMsV0FBVyxFQUFFLHFDQUFxQztvQkFDbEQsU0FBUyxFQUFFLENBQUMscUNBQXFDLENBQUM7aUJBQ3JEOzswQkEyQlEsTUFBTTsyQkFBQyxlQUFlOzRDQWxCRyxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgUXVlc3Rpb25UeXBlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZXMvYXNzZXNzbWVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBBc3Nlc3NtZW50UXVlc3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlcy9xdWVzdGlvbi5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBBc3Nlc3NtZW50TWFrZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXNzZXNzbWVudC1tYWtlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUXVlc3Rpb25QYXBlclNlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZWQvaW50ZXJmYWNlcy9xdWVzdGlvbi1wYXBlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBBc3Nlc3NtZW50QnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hc3Nlc3NtZW50LWJ1aWxkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IGRlZXBDbG9uZSwgZ2VuZXJhdGVVdWlkIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItYXBwLWFzc2Vzc21lbnQtYnVpbGRlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYXNzZXNzbWVudC1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2Fzc2Vzc21lbnQtYnVpbGRlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQXNzZXNzbWVudEJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgbGFiZWxDb25maWc6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcclxuICAgIGltYWdlQ29uZmlnOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XHJcbiAgICBxdWVzdGlvblR5cGVzOiBRdWVzdGlvblR5cGVbXSA9IFtdO1xyXG4gICAgcXVlc3Rpb25EZXRhaWxzOiBBc3Nlc3NtZW50UXVlc3Rpb24gfCBudWxsID0gbnVsbDtcclxuICAgIHJ1bGVzOiBhbnkgPSB7fTtcclxuICAgIHF1ZXN0aW9uU3RhY2s6IHsgcGFyZW50Rm9ybVZhbHVlOiBBc3Nlc3NtZW50UXVlc3Rpb24sIGVkaXRpbmdRdWVzdGlvbkluZGV4PzogbnVtYmVyLCBhZGRpbmdUb0dyb3VwSWQ/OiBzdHJpbmcgfVtdID0gW107XHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInKSBzY3JvbGxDb250YWluZXIhOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIGNoaWxkUXVlc3Rpb25Hcm91cHM6IHsgaWQ6IHN0cmluZywgb3B0aW9uSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGwsIHF1ZXN0aW9uSWRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdIH1bXSA9IFtdO1xyXG5cclxuICAgIHF1ZXN0aW9uc0Zvcm1Hcm91cCE6IEZvcm1Hcm91cDtcclxuICAgIHF1ZXN0aW9uQmFuazogUmVjb3JkPG51bWJlciwgQXNzZXNzbWVudFF1ZXN0aW9uPiA9IHt9O1xyXG4gICAgaXNDaGlsZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgLy8gcGFyZW50UXVlc3Rpb246IEFzc2Vzc21lbnRRdWVzdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGFzc2Vzc21lbnRJZDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIGFzc2Vzc21lbnRCdWlsZGVyU2VydmljZTogQXNzZXNzbWVudEJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYXNzZXNzbWVudE1ha2VyU2VydmljZTogQXNzZXNzbWVudE1ha2VyU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QXNzZXNzbWVudEJ1aWxkZXJDb21wb25lbnQ+LFxyXG4gICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGlhbG9nRGF0YTogYW55LFxyXG4gICAgKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxhYmVsQ29uZmlnID0gdGhpcy5kaWFsb2dEYXRhPy5sYWJlbENvbmZpZztcclxuICAgICAgICB0aGlzLmltYWdlQ29uZmlnID0gdGhpcy5kaWFsb2dEYXRhPy5pbWFnZUNvbmZpZztcclxuICAgICAgICB0aGlzLnJ1bGVzID0gdGhpcy5kaWFsb2dEYXRhPy5ydWxlcztcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uVHlwZXMgPSB0aGlzLmRpYWxvZ0RhdGE/LnF1ZXN0aW9uVHlwZXM7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbkJhbmsgPSB0aGlzLmRpYWxvZ0RhdGE/LnF1ZXN0aW9uQmFuaztcclxuICAgICAgICB0aGlzLmlzQ2hpbGQgPSB0aGlzLmRpYWxvZ0RhdGE/LmlzQ2hpbGQ7XHJcblxyXG4gICAgICAgIHRoaXMuYXNzZXNzbWVudElkID0gdGhpcy5kaWFsb2dEYXRhPy5hc3Nlc3NtZW50SWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEucXVlc3Rpb25EZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25EZXRhaWxzID0gZGVlcENsb25lKHRoaXMuZGlhbG9nRGF0YT8ucXVlc3Rpb25EZXRhaWxzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXR1cEZvcm1Hcm91cCgpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlEeW5hbWljVmFsaWRhdG9ycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlQ2hpbGRRdWVzdGlvbkxpc3QoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDaGlsZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG5cclxuICAgICAgICB0aGlzLnF1ZXN0aW9uRGV0YWlscz8uZGVmYXVsdE9wdGlvbnNMaXN0Py5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgICAgIG9wdGlvbi5jaGlsZFF1ZXN0aW9uTGlzdD8uZm9yRWFjaChpZCA9PiB1bmlxdWVJZHMuYWRkKGlkKSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUlkcyk/Lm1hcChpZCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFua1tpZF0gPyBkZWVwQ2xvbmUodGhpcy5xdWVzdGlvbkJhbmtbaWRdKSA6IG51bGw7XHJcbiAgICAgICAgfSk/LmZpbHRlcihCb29sZWFuKSBhcyBBc3Nlc3NtZW50UXVlc3Rpb25bXTtcclxuICAgIH1cclxuXHJcbiAgICBzZXR1cEZvcm1Hcm91cCgpIHtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBxdWVzdGlvblR5cGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uVGV4dDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgaXNNYW5kYXRvcnk6IFtmYWxzZV0sXHJcbiAgICAgICAgICAgIC8vIHZpc2liaWxpdHk6IFt0cnVlXSxcclxuICAgICAgICAgICAgdG90YWxNYXJrczogW251bGxdLFxyXG4gICAgICAgICAgICBtaW5DaGFyYWN0ZXJDb3VudDogW251bGxdLFxyXG4gICAgICAgICAgICBtYXhDaGFyYWN0ZXJDb3VudDogW251bGxdLFxyXG4gICAgICAgICAgICBtYXhpbXVtTnVtYmVyT2ZPcHRpb246IFtudWxsXSxcclxuICAgICAgICAgICAgbWluaW11bU51bWJlck9mT3B0aW9uOiBbbnVsbF0sXHJcbiAgICAgICAgICAgIG1heEZpbGVTaXplOiBbbnVsbF0sXHJcbiAgICAgICAgICAgIG1heE5vT2ZGaWxlczogW251bGxdLFxyXG4gICAgICAgICAgICBjdXN0b21SZWdleDogWycnXSxcclxuICAgICAgICAgICAgaGludFRleHQ6IFsnJ10sXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uTWVkaWE6IFsnJ10sXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW10pLFxyXG4gICAgICAgICAgICBjaGlsZFF1ZXN0aW9uczogW1tdXVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ3F1ZXN0aW9uVHlwZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hcHBseUR5bmFtaWNWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25EZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVGb3JtKHRoaXMucXVlc3Rpb25EZXRhaWxzLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmJ1aWxkQ2hpbGRRdWVzdGlvbkdyb3VwcyhbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHBvcHVsYXRlRm9ybShxdWVzdGlvbkRldGFpbHM6IEFzc2Vzc21lbnRRdWVzdGlvbiwgYnVpbGRDaGlsZEdyb3VwczogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCFxdWVzdGlvbkRldGFpbHMpIHJldHVybjtcclxuICAgICAgICBjb25zdCBjaGlsZFF1ZXN0aW9ucyA9IHF1ZXN0aW9uRGV0YWlscz8uY2hpbGRRdWVzdGlvbnMgfHwgdGhpcy5nZW5lcmF0ZUNoaWxkUXVlc3Rpb25MaXN0KCk7XHJcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmFzc2Vzc21lbnRCdWlsZGVyU2VydmljZS5nZXRRdWVzdGlvbkRUTyh7IC4uLnF1ZXN0aW9uRGV0YWlscywgY2hpbGRRdWVzdGlvbnMgfSk7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbnNGb3JtR3JvdXAucGF0Y2hWYWx1ZShmb3JtRGF0YSk7XHJcbiAgICAgICAgaWYgKGZvcm1EYXRhLm9wdGlvbnM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBmb3JtRGF0YS5vcHRpb25zLmZvckVhY2goKG9wdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRHcm91cCA9IHRoaXMuY3JlYXRlT3B0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBvcHRHcm91cC5wYXRjaFZhbHVlKG9wdCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucHVzaChvcHRHcm91cCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnVpbGRDaGlsZEdyb3Vwcykge1xyXG4gICAgICAgICAgICB0aGlzLmJ1aWxkQ2hpbGRRdWVzdGlvbkdyb3VwcyhjaGlsZFF1ZXN0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VibWl0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cC5pbnZhbGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zRm9ybUdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5xdWVzdGlvblN0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gY2hpbGQgcXVlc3Rpb24gbG9naWNcclxuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnF1ZXN0aW9uU3RhY2tbdGhpcy5xdWVzdGlvblN0YWNrLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0YXRlPy5lZGl0aW5nUXVlc3Rpb25JbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLnBhcmVudEZvcm1WYWx1ZS5jaGlsZFF1ZXN0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnBhcmVudEZvcm1WYWx1ZS5jaGlsZFF1ZXN0aW9ucyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGNoaWxkXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFF1ZXN0aW9uID0gc3RhdGUucGFyZW50Rm9ybVZhbHVlLmNoaWxkUXVlc3Rpb25zW3N0YXRlLmVkaXRpbmdRdWVzdGlvbkluZGV4XTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmFzc2Vzc21lbnRCdWlsZGVyU2VydmljZS5zZXRRdWVzdGlvbkRUTyh0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cC52YWx1ZSwgY2hpbGRRdWVzdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYXdhaXQgdGhpcy51cGRhdGVRdWVzdGlvbihwYXlsb2FkKTtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wYXJlbnRGb3JtVmFsdWUuY2hpbGRRdWVzdGlvbnNbc3RhdGUuZWRpdGluZ1F1ZXN0aW9uSW5kZXhdID0gcXVlc3Rpb247XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXN0aW9uPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uQmFua1txdWVzdGlvbi5pZF0gPSBxdWVzdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ0RhdGE/LnNuYWNrYmFyTWVzc2FnZUVtaXR0ZXI/LmVtaXQoeyBtZXNzYWdlOiB0aGlzLmxhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuVE9BU1QuRVJST1JfREVGQVVMVCddLCB0eXBlOiAnZXJyb3InIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IHsgZXJyb3IsIG1ldGhvZDogJ1BBVENIJywgcGF5bG9hZCB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgbmV3IGNoaWxkIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuYXNzZXNzbWVudEJ1aWxkZXJTZXJ2aWNlLnNldFF1ZXN0aW9uRFRPKHRoaXMucXVlc3Rpb25zRm9ybUdyb3VwLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBhd2FpdCB0aGlzLmNyZWF0ZVF1ZXN0aW9uKHBheWxvYWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlPy5wYXJlbnRGb3JtVmFsdWU/LmNoaWxkUXVlc3Rpb25zPy5wdXNoKHF1ZXN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocXVlc3Rpb24/LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25CYW5rW3F1ZXN0aW9uLmlkXSA9IHF1ZXN0aW9uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JwID0gdGhpcy5jaGlsZFF1ZXN0aW9uR3JvdXBzLmZpbmQoKGc6IGFueSkgPT4gZy5pZCA9PT0gc3RhdGUuYWRkaW5nVG9Hcm91cElkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdycCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwLnF1ZXN0aW9uSWRzPy5wdXNoKHF1ZXN0aW9uPy5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JwLm9wdGlvbklkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gc3RhdGUucGFyZW50Rm9ybVZhbHVlPy5kZWZhdWx0T3B0aW9uc0xpc3Q/LmZpbmQoKG86IGFueSkgPT4gKG8uaWQgfHwgby51dWlkKSA9PSBncnAub3B0aW9uSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0LmNoaWxkUXVlc3Rpb25MaXN0ID0gb3B0LmNoaWxkUXVlc3Rpb25MaXN0IHx8IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQuY2hpbGRRdWVzdGlvbkxpc3QucHVzaChxdWVzdGlvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZFF1ZXN0aW9uR3JvdXBzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBnZW5lcmF0ZVV1aWQoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25JZDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbklkczogW3F1ZXN0aW9uPy5pZF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3VibWl0dGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nRGF0YT8uc25hY2tiYXJNZXNzYWdlRW1pdHRlcj8uZW1pdCh7IG1lc3NhZ2U6IHRoaXMubGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5UT0FTVC5FUlJPUl9ERUZBVUxUJ10sIHR5cGU6ICdlcnJvcicgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgeyBlcnJvciwgbWV0aG9kOiAnUE9TVCcsIHBheWxvYWQgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25TdGFjay5wb3AoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlLXBvcHVsYXRlIHBhcmVudCBmb3JtXHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRBbmRQb3B1bGF0ZShzdGF0ZT8ucGFyZW50Rm9ybVZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcXVlc3Rpb25EVE8gPSB0aGlzLmFzc2Vzc21lbnRCdWlsZGVyU2VydmljZS5zZXRRdWVzdGlvbkRUTyh0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cC52YWx1ZSwgdGhpcy5xdWVzdGlvbkRldGFpbHMpO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIGxvY2FsIHRlbXBsYXRlIHRyZWUgcmVwcmVzZW50YXRpb25cclxuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25EZXRhaWxzPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbkRUTyA9IGF3YWl0IHRoaXMudXBkYXRlUXVlc3Rpb24ocXVlc3Rpb25EVE8pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWVzdGlvbkRUTz8uaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbkJhbmtbcXVlc3Rpb25EVE8uaWRdID0gcXVlc3Rpb25EVE9cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dEYXRhPy5zbmFja2Jhck1lc3NhZ2VFbWl0dGVyPy5lbWl0KHsgbWVzc2FnZTogdGhpcy5sYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULlRPQVNULlFVRVNUSU9OX1VQREFURURfU1VDQ0VTUyddLCB0eXBlOiAnc3VjY2VzcycgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdWJtaXR0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dEYXRhPy5zbmFja2Jhck1lc3NhZ2VFbWl0dGVyPy5lbWl0KHsgbWVzc2FnZTogdGhpcy5sYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULlRPQVNULkVSUk9SX0RFRkFVTFQnXSwgdHlwZTogJ2Vycm9yJyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7IGVycm9yLCBtZXRob2Q6ICdQQVRDSCcsIHBheWxvYWQ6IHF1ZXN0aW9uRFRPIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3JFZGl0QXNzZXNzbWVudEFuZFF1ZXN0aW9uUGFwZXIocXVlc3Rpb25EVE8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVF1ZXN0aW9uKHBheWxvYWQ6IGFueSk6IFByb21pc2U8QXNzZXNzbWVudFF1ZXN0aW9uPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hc3Nlc3NtZW50TWFrZXJTZXJ2aWNlLmNyZWF0ZVF1ZXN0aW9uKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVzKSA9PiByZXNvbHZlKHJlcyBhcyBBc3Nlc3NtZW50UXVlc3Rpb24pLFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHJlamVjdChlcnIpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVF1ZXN0aW9uKHBheWxvYWQ6IGFueSk6IFByb21pc2U8QXNzZXNzbWVudFF1ZXN0aW9uPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hc3Nlc3NtZW50TWFrZXJTZXJ2aWNlLnBhdGNoUXVlc3Rpb24ocGF5bG9hZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChyZXMpID0+IHJlc29sdmUocmVzIGFzIEFzc2Vzc21lbnRRdWVzdGlvbiksXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4gcmVqZWN0KGVycilcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlT3JFZGl0QXNzZXNzbWVudEFuZFF1ZXN0aW9uUGFwZXIocXVlc3Rpb246IEFzc2Vzc21lbnRRdWVzdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uUGFwZXIgPSBkZWVwQ2xvbmUodGhpcy5kaWFsb2dEYXRhPy5hc3Nlc3NtZW50UXVlc3Rpb25QYXBlckRhdGEpO1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25RdWVzdGlvbiA9IHRoaXMuYXNzZXNzbWVudEJ1aWxkZXJTZXJ2aWNlLmdlbmVyYXRlU2VjdGlvblF1ZXN0aW9uKHF1ZXN0aW9uKTtcclxuICAgICAgICBpZiAoIXRoaXMuZGlhbG9nRGF0YT8uc2VjdGlvbkRldGFpbHMpIHtcclxuICAgICAgICAgICAgY29uc3QgbGlzdCA9IHF1ZXN0aW9uUGFwZXI/LnF1ZXN0aW9uUGFwZXJTZWN0aW9uTGlzdDtcclxuICAgICAgICAgICAgY29uc3QgbGFzdFNlcXVlbmNlID0gbGlzdD8ubGVuZ3RoID8gbGlzdFtsaXN0Lmxlbmd0aCAtIDFdLm9yZGVyTm8gfHwgMCA6IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1NlY3Rpb24gPSB0aGlzLmFzc2Vzc21lbnRCdWlsZGVyU2VydmljZS5jcmVhdGVOZXdTZWN0aW9uKGxhc3RTZXF1ZW5jZSArIDEpO1xyXG5cclxuICAgICAgICAgICAgbmV3U2VjdGlvbj8uc2VjdGlvblF1ZXN0aW9uc0xpc3Q/LnB1c2goc2VjdGlvblF1ZXN0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uUGFwZXI/LnF1ZXN0aW9uUGFwZXJTZWN0aW9uTGlzdD8ucHVzaChuZXdTZWN0aW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uUmVmID0gcXVlc3Rpb25QYXBlcj8ucXVlc3Rpb25QYXBlclNlY3Rpb25MaXN0Py5maW5kKChzZWN0aW9uOiBRdWVzdGlvblBhcGVyU2VjdGlvbikgPT4gc2VjdGlvbj8uaWQgPT0gdGhpcy5kaWFsb2dEYXRhPy5zZWN0aW9uRGV0YWlscz8uaWQpO1xyXG4gICAgICAgICAgICBzZWN0aW9uUmVmPy5zZWN0aW9uUXVlc3Rpb25zTGlzdD8ucHVzaChzZWN0aW9uUXVlc3Rpb24pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcXVlc3Rpb25QYXBlckRUTyA9IHRoaXMuYXNzZXNzbWVudEJ1aWxkZXJTZXJ2aWNlLmdlbmVyYXRlUXVlc3Rpb25QYXBlckRUTyhxdWVzdGlvblBhcGVyLCB0aGlzLnF1ZXN0aW9uQmFuayk7XHJcbiAgICAgICAgY29uc3QgYXNzZXNzbWVudERUTyA9IHRoaXMuYXNzZXNzbWVudEJ1aWxkZXJTZXJ2aWNlLmdlbmVyYXRlQXNzZXNzbWVudERUTyh0aGlzLmFzc2Vzc21lbnRJZCwgcXVlc3Rpb25QYXBlckRUTyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgICAgIGFzc2Vzc21lbnQ6IGFzc2Vzc21lbnREVE8sXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uUGFwZXI6IHF1ZXN0aW9uUGFwZXJEVE9cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFwaUNhbGwgPSB0aGlzLmFzc2Vzc21lbnRJZFxyXG4gICAgICAgICAgICA/IHRoaXMuYXNzZXNzbWVudE1ha2VyU2VydmljZS5wYXRjaEFzc2Vzc21lbnRBbmRRdWVzdGlvblBhcGVyKHBheWxvYWQpXHJcbiAgICAgICAgICAgIDogdGhpcy5hc3Nlc3NtZW50TWFrZXJTZXJ2aWNlLmNyZWF0ZUFzc2Vzc21lbnRBbmRRdWVzdGlvblBhcGVyKHBheWxvYWQpO1xyXG5cclxuICAgICAgICBhcGlDYWxsLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHtcclxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGFzc2Vzc21lbnRJZDogcmVzPy5hc3Nlc3NtZW50Py5pZCxcclxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvblBhcGVyOiByZXM/LnF1ZXN0aW9uUGFwZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25NYXA6IHJlcz8ucXVlc3Rpb25NYXBcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1N1Ym1pdHRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nRGF0YT8uc25hY2tiYXJNZXNzYWdlRW1pdHRlcj8uZW1pdCh7IG1lc3NhZ2U6IHRoaXMubGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5UT0FTVC5FUlJPUl9ERUZBVUxUJ10sIHR5cGU6ICdlcnJvcicgfSk7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyB7IGVycm9yLCBtZXRob2Q6IHRoaXMuYXNzZXNzbWVudElkID8gJ1BBVENIJyA6ICdQT1NUJywgcGF5bG9hZCB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUR5bmFtaWNWYWxpZGF0b3JzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5ydWxlcyB8fCBPYmplY3Qua2V5cyh0aGlzLnJ1bGVzKS5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMucXVlc3Rpb25zRm9ybUdyb3VwO1xyXG4gICAgICAgIGNvbnN0IHFUeXBlID0gZm9ybS5nZXQoJ3F1ZXN0aW9uVHlwZScpPy52YWx1ZTtcclxuICAgICAgICBjb25zdCBjdXJyZW50UnVsZXMgPSB0aGlzLnJ1bGVzW3FUeXBlXSB8fCB7fTtcclxuXHJcbiAgICAgICAgY29uc3QgZXhjbHVkZWRDb250cm9scyA9IG5ldyBTZXQoWydxdWVzdGlvblR5cGUnLCAncXVlc3Rpb25UZXh0JywgJ29wdGlvbnMnLCAndmlzaWJpbGl0eScsICdpc01hbmRhdG9yeSddKTtcclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIG5vcm1hbCBjb250cm9sc1xyXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGZvcm0uY29udHJvbHMpLmZvckVhY2goKFtrZXksIGNvbnRyb2xdKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChleGNsdWRlZENvbnRyb2xzLmhhcyhrZXkpKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBydWxlID0gY3VycmVudFJ1bGVzW2tleV07XHJcblxyXG4gICAgICAgICAgICBpZiAocnVsZT8udmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHJ1bGU/LnJlcXVpcmVkID8gW1ZhbGlkYXRvcnMucmVxdWlyZWRdIDogW107XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAncXVlc3Rpb25NZWRpYScpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKC9eKGh0dHBzPzpcXC9cXC8pPyhbXFxkYS16XFwuLV0rKVxcLihbYS16XFwuXXsyLDZ9KShbXFwvXFx3IFxcLi1dKikqXFwvPyhcXD9bXlxcc10qKT8kL2kpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzLmxlbmd0aCA+IDAgPyB2YWxpZGF0b3JzIDogbnVsbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShrZXkgPT09ICdjaGlsZFF1ZXN0aW9ucycgPyBbXSA6IG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIG9wdGlvbnMgRm9ybUFycmF5XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NvbnRyb2wgPSBmb3JtLmdldCgnb3B0aW9ucycpIGFzIEZvcm1BcnJheTtcclxuICAgICAgICBjb25zdCBvcHRpb25zUnVsZSA9IGN1cnJlbnRSdWxlc1snb3B0aW9ucyddO1xyXG5cclxuICAgICAgICBpZiAoIW9wdGlvbnNSdWxlPy52aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnNDb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICBvcHRpb25zQ29udHJvbC5jbGVhcigpO1xyXG4gICAgICAgICAgICBvcHRpb25zQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgb3B0aW9uc1ZhbGlkYXRvciA9IG9wdGlvbnNSdWxlPy5yZXF1aXJlZCA/IChjb250cm9sOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlT3B0aW9ucyA9IChjb250cm9sLnZhbHVlIHx8IFtdKS5maWx0ZXIoKG9wdDogYW55KSA9PiBvcHQuaXNBY3RpdmUgIT09IGZhbHNlKTtcclxuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZU9wdGlvbnMubGVuZ3RoID4gMCA/IG51bGwgOiB7IHJlcXVpcmVkOiB0cnVlIH07XHJcbiAgICAgICAgfSA6IG51bGw7XHJcblxyXG4gICAgICAgIG9wdGlvbnNDb250cm9sLnNldFZhbGlkYXRvcnMob3B0aW9uc1ZhbGlkYXRvcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHNob3dXZWlnaHRhZ2UgPSBvcHRpb25zUnVsZT8uc2hvd1dlaWdodGFnZTtcclxuICAgICAgICBjb25zdCBzaG93UmVtYXJrcyA9IG9wdGlvbnNSdWxlPy5zaG93UmVtYXJrcztcclxuXHJcbiAgICAgICAgb3B0aW9uc0NvbnRyb2wuY29udHJvbHMuZm9yRWFjaChvcHRHcm91cCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdlaWdodEN0cmwgPSBvcHRHcm91cC5nZXQoJ3dlaWdodCcpO1xyXG4gICAgICAgICAgICBjb25zdCByZW1hcmtzQ3RybCA9IG9wdEdyb3VwLmdldCgncmVtYXJrc1JlcXVpcmVkJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXNob3dXZWlnaHRhZ2UpIHdlaWdodEN0cmw/LnNldFZhbHVlKDAsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgaWYgKCFzaG93UmVtYXJrcykgcmVtYXJrc0N0cmw/LnNldFZhbHVlKGZhbHNlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG4gICAgICAgICAgICB3ZWlnaHRDdHJsPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgcmVtYXJrc0N0cmw/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBvcHRpb25zQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93RmllbGQoZmllbGROYW1lOiBzdHJpbmcsIG5lc3RlZFByb3A/OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBxdWVzdGlvblR5cGUgPSB0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cD8uZ2V0KCdxdWVzdGlvblR5cGUnKT8udmFsdWU7XHJcbiAgICAgICAgaWYgKCFxdWVzdGlvblR5cGUgfHwgIXRoaXMucnVsZXNbcXVlc3Rpb25UeXBlXSB8fCAhdGhpcy5ydWxlc1txdWVzdGlvblR5cGVdW2ZpZWxkTmFtZV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmVzdGVkUHJvcCkge1xyXG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLnJ1bGVzW3F1ZXN0aW9uVHlwZV1bZmllbGROYW1lXVtuZXN0ZWRQcm9wXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5ydWxlc1txdWVzdGlvblR5cGVdW2ZpZWxkTmFtZV0/LnZpc2libGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKTogRm9ybUFycmF5IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdvcHRpb25zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIGFkZE9wdGlvbigpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMucHVzaCh0aGlzLmNyZWF0ZU9wdGlvbigpKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVPcHRpb24oaW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuYXQoaW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWRPcHRpb25JZCA9IHJlbW92ZWRPcHRpb24uZ2V0KCdpZCcpPy52YWx1ZTtcclxuICAgICAgICBjb25zdCByZW1vdmVkT3B0aW9uVXVpZCA9IHJlbW92ZWRPcHRpb24uZ2V0KCd1dWlkJyk/LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gcmVtb3ZlZE9wdGlvbklkIHx8IHJlbW92ZWRPcHRpb25VdWlkO1xyXG5cclxuICAgICAgICBpZiAocmVtb3ZlZE9wdGlvbklkKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZWRPcHRpb24uZ2V0KCdpc0FjdGl2ZScpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnJlbW92ZUF0KGluZGV4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hpbGRRdWVzdGlvbkdyb3Vwcy5mb3JFYWNoKGcgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZy5vcHRpb25JZCA9PT0gdW5pcXVlSWQpIHtcclxuICAgICAgICAgICAgICAgIGcub3B0aW9uSWQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlT3B0aW9uKCk6IEZvcm1Hcm91cCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBpZDogWzBdLFxyXG4gICAgICAgICAgICB1dWlkOiBbZ2VuZXJhdGVVdWlkKCldLFxyXG4gICAgICAgICAgICBvcHRpb25MYWJlbDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgd2VpZ2h0OiBbMF0sXHJcbiAgICAgICAgICAgIHJlbWFya3NSZXF1aXJlZDogW2ZhbHNlXSxcclxuICAgICAgICAgICAgaXNBY3RpdmU6IFt0cnVlXSxcclxuICAgICAgICAgICAgY2hpbGRRdWVzdGlvbkxpc3Q6IFtbXV1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhbGxvd09ubHlOdW1iZXJzKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSBldmVudC50YXJnZXQudmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpbWFnZUVycm9ySGFuZGxlcihldmVudDogYW55LCBmaWxlUGF0aDogc3RyaW5nKSB7XHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnNyYyA9IGZpbGVQYXRoO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEVkaXRDaGlsZFF1ZXN0aW9uKGNoaWxkUXVlc3Rpb24/OiBBc3Nlc3NtZW50UXVlc3Rpb24sIGluZGV4PzogbnVtYmVyLCBncm91cElkPzogc3RyaW5nKSB7XHJcbiAgICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhcmVudCBzdGF0ZVxyXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uRGF0YSA9IHRoaXMuYXNzZXNzbWVudEJ1aWxkZXJTZXJ2aWNlLnNldFF1ZXN0aW9uRFRPKHRoaXMucXVlc3Rpb25zRm9ybUdyb3VwLnZhbHVlLCB0aGlzLnF1ZXN0aW9uRGV0YWlscyk7XHJcblxyXG4gICAgICAgIHRoaXMucXVlc3Rpb25TdGFjay5wdXNoKHtcclxuICAgICAgICAgICAgcGFyZW50Rm9ybVZhbHVlOiB7IC4uLnF1ZXN0aW9uRGF0YSwgY2hpbGRRdWVzdGlvbnM6IHRoaXMucXVlc3Rpb25zRm9ybUdyb3VwLmdldCgnY2hpbGRRdWVzdGlvbnMnKT8udmFsdWUgfSxcclxuICAgICAgICAgICAgZWRpdGluZ1F1ZXN0aW9uSW5kZXg6IGluZGV4LFxyXG4gICAgICAgICAgICBhZGRpbmdUb0dyb3VwSWQ6IGdyb3VwSWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gUmVzZXQgZm9ybSBmb3IgY2hpbGRcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cC5yZXNldCh7XHJcbiAgICAgICAgICAgIHF1ZXN0aW9uVHlwZTogJycsXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uVGV4dDogJycsXHJcbiAgICAgICAgICAgIGlzTWFuZGF0b3J5OiBmYWxzZSxcclxuICAgICAgICAgICAgLy8gdmlzaWJpbGl0eTogdHJ1ZSxcclxuICAgICAgICAgICAgdG90YWxNYXJrczogbnVsbCxcclxuICAgICAgICAgICAgbWluQ2hhcmFjdGVyQ291bnQ6IG51bGwsXHJcbiAgICAgICAgICAgIG1heENoYXJhY3RlckNvdW50OiBudWxsLFxyXG4gICAgICAgICAgICBtYXhpbXVtTnVtYmVyT2ZPcHRpb246IG51bGwsXHJcbiAgICAgICAgICAgIG1pbmltdW1OdW1iZXJPZk9wdGlvbjogbnVsbCxcclxuICAgICAgICAgICAgbWF4RmlsZVNpemU6IG51bGwsXHJcbiAgICAgICAgICAgIG1heE5vT2ZGaWxlczogbnVsbCxcclxuICAgICAgICAgICAgY3VzdG9tUmVnZXg6ICcnLFxyXG4gICAgICAgICAgICBoaW50VGV4dDogJycsXHJcbiAgICAgICAgICAgIHF1ZXN0aW9uTWVkaWE6ICcnLFxyXG4gICAgICAgICAgICBjaGlsZFF1ZXN0aW9uczogW1tdXVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnNDb250cm9sID0gdGhpcy5xdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdvcHRpb25zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIHdoaWxlIChvcHRpb25zQ29udHJvbC5sZW5ndGggIT09IDApIHtcclxuICAgICAgICAgICAgb3B0aW9uc0NvbnRyb2wucmVtb3ZlQXQoMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFwcGx5RHluYW1pY1ZhbGlkYXRvcnMoKTtcclxuICAgICAgICBpZiAoY2hpbGRRdWVzdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnBvcHVsYXRlRm9ybShjaGlsZFF1ZXN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZUNoaWxkUXVlc3Rpb24oaW5kZXg6IG51bWJlciwgZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgY29uc3QgZGVsZXRlZENoaWxkID0gdGhpcy5xdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdjaGlsZFF1ZXN0aW9ucycpPy52YWx1ZVtpbmRleF07XHJcblxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5jb250cm9scy5mb3JFYWNoKG9wdCA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjaGlsZExpc3QgPSBbLi4uKG9wdC5nZXQoJ2NoaWxkUXVlc3Rpb25MaXN0Jyk/LnZhbHVlIHx8IFtdKV07XHJcbiAgICAgICAgICAgIGNoaWxkTGlzdCA9IGNoaWxkTGlzdC5maWx0ZXIoKGlkOiBzdHJpbmcgfCBudW1iZXIpID0+IGlkICE9PSBkZWxldGVkQ2hpbGQuaWQpO1xyXG4gICAgICAgICAgICBvcHQuZ2V0KCdjaGlsZFF1ZXN0aW9uTGlzdCcpPy5zZXRWYWx1ZShjaGlsZExpc3QpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ2NoaWxkUXVlc3Rpb25zJyk/LnZhbHVlLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2hpbGRRdWVzdGlvbkdyb3Vwcy5mb3JFYWNoKGcgPT4ge1xyXG4gICAgICAgICAgICBnLnF1ZXN0aW9uSWRzID0gZy5xdWVzdGlvbklkcy5maWx0ZXIocWlkID0+IHFpZCAhPT0gZGVsZXRlZENoaWxkLmlkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNoaWxkUXVlc3Rpb25Hcm91cHMgPSB0aGlzLmNoaWxkUXVlc3Rpb25Hcm91cHMuZmlsdGVyKGcgPT4gZy5xdWVzdGlvbklkcy5sZW5ndGggPiAwKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRPcHRpb25JZChvcHQ6IGFueSk6IHN0cmluZyB8IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIG9wdC5nZXQoJ2lkJyk/LnZhbHVlID8gb3B0LmdldCgnaWQnKT8udmFsdWUgOiBvcHQuZ2V0KCd1dWlkJyk/LnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENoaWxkUXVlc3Rpb25CeUlkKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBBc3Nlc3NtZW50UXVlc3Rpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ2NoaWxkUXVlc3Rpb25zJyk/LnZhbHVlPy5maW5kKChxOiBBc3Nlc3NtZW50UXVlc3Rpb24pID0+IHEuaWQgPT09IGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGlsZFF1ZXN0aW9uSW5kZXgoaWQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zRm9ybUdyb3VwLmdldCgnY2hpbGRRdWVzdGlvbnMnKT8udmFsdWU/LmZpbmRJbmRleCgocTogQXNzZXNzbWVudFF1ZXN0aW9uKSA9PiBxLmlkID09PSBpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlQ2hpbGRRdWVzdGlvbkJ5SWQoaWQ6IG51bWJlciB8IHVuZGVmaW5lZCwgZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldENoaWxkUXVlc3Rpb25JbmRleChpZCk7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWxldGVDaGlsZFF1ZXN0aW9uKGluZGV4LCBldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkQ2hpbGRRdWVzdGlvbkdyb3VwcyhjaGlsZFF1ZXN0aW9uczogQXNzZXNzbWVudFF1ZXN0aW9uW10pIHtcclxuICAgICAgICB0aGlzLmNoaWxkUXVlc3Rpb25Hcm91cHMgPSBbXTtcclxuICAgICAgICBjb25zdCBwcm9jZXNzZWRRdWVzdGlvbklkcyA9IG5ldyBTZXQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLmNvbnRyb2xzLmZvckVhY2gob3B0ID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uSWQgPSB0aGlzLmdldE9wdGlvbklkKG9wdCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkTGlzdCA9IG9wdC5nZXQoJ2NoaWxkUXVlc3Rpb25MaXN0Jyk/LnZhbHVlIHx8IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoaWxkTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkUXVlc3Rpb25Hcm91cHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGdlbmVyYXRlVXVpZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbklkOiBvcHRpb25JZCxcclxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbklkczogWy4uLmNoaWxkTGlzdF1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0LmZvckVhY2goKGlkOiBhbnkpID0+IHByb2Nlc3NlZFF1ZXN0aW9uSWRzLmFkZChpZCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNoaWxkUXVlc3Rpb25zLmZvckVhY2goY3EgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY3EuaWQgJiYgIXByb2Nlc3NlZFF1ZXN0aW9uSWRzLmhhcyhjcS5pZCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRRdWVzdGlvbkdyb3Vwcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBpZDogZ2VuZXJhdGVVdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uSWQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25JZHM6IFtjcS5pZF1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Hcm91cE9wdGlvbkNoYW5nZShncm91cElkOiBzdHJpbmcsIG5ld09wdGlvbklkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBJbmRleCA9IHRoaXMuY2hpbGRRdWVzdGlvbkdyb3Vwcy5maW5kSW5kZXgoZyA9PiBnLmlkID09PSBncm91cElkKTtcclxuICAgICAgICBpZiAoZ3JvdXBJbmRleCA9PT0gLTEpIHJldHVybjtcclxuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuY2hpbGRRdWVzdGlvbkdyb3Vwc1tncm91cEluZGV4XTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2xkT3B0aW9uSWQgPSBncm91cC5vcHRpb25JZDtcclxuXHJcbiAgICAgICAgaWYgKG9sZE9wdGlvbklkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZE9wdCA9IHRoaXMub3B0aW9ucy5jb250cm9scy5maW5kKG9wdCA9PiB0aGlzLmdldE9wdGlvbklkKG9wdCkgPT09IG9sZE9wdGlvbklkKTtcclxuICAgICAgICAgICAgaWYgKG9sZE9wdCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkTGlzdCA9IFsuLi4ob2xkT3B0LmdldCgnY2hpbGRRdWVzdGlvbkxpc3QnKT8udmFsdWUgfHwgW10pXTtcclxuICAgICAgICAgICAgICAgIGNoaWxkTGlzdCA9IGNoaWxkTGlzdC5maWx0ZXIoaWQgPT4gIWdyb3VwLnF1ZXN0aW9uSWRzLmluY2x1ZGVzKGlkIGFzIGFueSkpO1xyXG4gICAgICAgICAgICAgICAgb2xkT3B0LmdldCgnY2hpbGRRdWVzdGlvbkxpc3QnKT8uc2V0VmFsdWUoY2hpbGRMaXN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdHcm91cCA9IHRoaXMuY2hpbGRRdWVzdGlvbkdyb3Vwcy5maW5kKGcgPT4gZy5pZCAhPT0gZ3JvdXBJZCAmJiBnLm9wdGlvbklkID09PSBuZXdPcHRpb25JZCk7XHJcblxyXG4gICAgICAgIGlmIChleGlzdGluZ0dyb3VwICYmIG5ld09wdGlvbklkKSB7XHJcbiAgICAgICAgICAgIGV4aXN0aW5nR3JvdXAucXVlc3Rpb25JZHMucHVzaCguLi5ncm91cC5xdWVzdGlvbklkcyk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hpbGRRdWVzdGlvbkdyb3Vwcy5zcGxpY2UoZ3JvdXBJbmRleCwgMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ3JvdXAub3B0aW9uSWQgPSBuZXdPcHRpb25JZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChuZXdPcHRpb25JZCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdPcHQgPSB0aGlzLm9wdGlvbnMuY29udHJvbHMuZmluZChvcHQgPT4gdGhpcy5nZXRPcHRpb25JZChvcHQpID09PSBuZXdPcHRpb25JZCk7XHJcbiAgICAgICAgICAgIGlmIChuZXdPcHQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZExpc3QgPSBbLi4uKG5ld09wdC5nZXQoJ2NoaWxkUXVlc3Rpb25MaXN0Jyk/LnZhbHVlIHx8IFtdKV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KFsuLi5jaGlsZExpc3QsIC4uLmdyb3VwLnF1ZXN0aW9uSWRzXSk7XHJcbiAgICAgICAgICAgICAgICBuZXdPcHQuZ2V0KCdjaGlsZFF1ZXN0aW9uTGlzdCcpPy5zZXRWYWx1ZShBcnJheS5mcm9tKHNldCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdvQmFjaygpIHtcclxuICAgICAgICBpZiAodGhpcy5xdWVzdGlvblN0YWNrLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5xdWVzdGlvblN0YWNrLnBvcCgpO1xyXG5cclxuICAgICAgICB0aGlzLnJlc2V0QW5kUG9wdWxhdGUoc3RhdGU/LnBhcmVudEZvcm1WYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVzZXRBbmRQb3B1bGF0ZShwYXJlbnRWYWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbnNGb3JtR3JvdXAucmVzZXQoKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb3B0aW9uc0NvbnRyb2wgPSB0aGlzLnF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ29wdGlvbnMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgd2hpbGUgKG9wdGlvbnNDb250cm9sLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICBvcHRpb25zQ29udHJvbC5yZW1vdmVBdCgwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucG9wdWxhdGVGb3JtKHBhcmVudFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNjcm9sbFRvVG9wKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lciAmJiB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImQtZmxleCB2aC0xMDAgcG9zaXRpb24tcmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb25TdGFjay5sZW5ndGggPiAwIHx8IGlzQ2hpbGRcIlxyXG4gICAgICAgIGNsYXNzPVwicC0zIHB4LTIgY29sLWF1dG8gYXNzZXNzbWVudC1iZy1wYWxldHRlLUM4REFGOSBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZCBkLW1kLWZsZXggZC1ub25lXCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJtLTAgYXNzZXNzbWVudC10ZXh0LXNlbWlib2xkLTE4IHZlcnRpY2FsLXRleHRcIj5cclxuICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLkNISUxEX1FVRVNUSU9OJ119fVxyXG4gICAgICAgIDwvcD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xIGgtMTAwIGQtZmxleCBmbGV4LWNvbHVtbiBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgIDxoZWFkZXJcclxuICAgICAgICAgICAgY2xhc3M9XCJwLTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBwb3NpdGlvbi1zdGlja3kgdG9wLTAgY29sLTEyIGJvcmRlci1ib3R0b21cIj5cclxuICAgICAgICAgICAgPHAgKm5nSWY9XCJxdWVzdGlvblN0YWNrLmxlbmd0aCA9PSAwXCIgY2xhc3M9XCJtYi0wIGFzc2Vzc21lbnQtdGV4dC1zZW1pYm9sZC0xOCBkLW1kLWlubGluZSBkLW5vbmVcIj5cclxuICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5JTlBVVF9GSUVMRF9TRVRUSU5HUyddfX1cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwicXVlc3Rpb25TdGFjay5sZW5ndGggPiAwXCIgKGNsaWNrKT1cImdvQmFjaygpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBhc3Nlc3NtZW50LXRleHQtZ3JleS10ZW4gYm9yZGVyLTAgb3V0bGluZS0wIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTQgYmctdHJhbnNwYXJlbnRcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uR09fQkFDSyddXCJcclxuICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VFcnJvckhhbmRsZXIoJGV2ZW50LCAnYXNzZXRzL2NvbW1vbnMtYXNzZXNzbWVudC9pbWFnZXMvZ28tYmFjay5zdmcnKVwiIC8+XHJcbiAgICAgICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuR09fQkFDSyddfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1tZC1lbmQganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLTMgZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU3VibWl0KClcIiBbZGlzYWJsZWRdPVwiaXNTdWJtaXR0aW5nXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzc2Vzc21lbnQtYnRuLXByaW1hcnkgYXNzZXNzbWVudC1idXR0b24tcGFkZGluZyBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtem9vbS1hbmltYXRpb24gYXNzZXNzbWVudC1idXR0b24tcGFkZGluZyBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsnb3BhY2l0eS0wJzogaXNTdWJtaXR0aW5nfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuU0FWRV9RVUVTVElPTiddfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNTdWJtaXR0aW5nXCIgW2RpYW1ldGVyXT1cIjIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSB0b3AtNTAgc3RhcnQtNTAgdHJhbnNsYXRlLW1pZGRsZSBhc3Nlc3NtZW50LXNwaW5uZXItd2hpdGVcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiZC1tZC1ub25lXCIgKm5nSWY9XCJxdWVzdGlvblN0YWNrLmxlbmd0aCA9PSAwXCIgbWF0LWRpYWxvZy1jbG9zZVxyXG4gICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaW1hZ2VDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5JQ09OLkNMT1NFJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJpbWFnZUVycm9ySGFuZGxlcigkZXZlbnQsICdhc3NldHMvY29tbW9ucy1hc3Nlc3NtZW50L2ltYWdlcy9jbG9zZS5zdmcnKVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgIDxkaXYgI3Njcm9sbENvbnRhaW5lciBjbGFzcz1cImNvbC0xMiBweS00IHB4LW1kLTQgcHgtMyBmbGV4LWdyb3ctMSBvdmVyZmxvdy15LWF1dG8gZm9ybS1jb250YWluZXJcIlxyXG4gICAgICAgICAgICBbZm9ybUdyb3VwXT1cInF1ZXN0aW9uc0Zvcm1Hcm91cFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItNCBjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMiBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTE2IGFzc2Vzc21lbnQtdGV4dC1ncmV5LXRlbiBjb2wtMTJcIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuVFlQRSddfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwicXVlc3Rpb25UeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5QTEFDRUhPTERFUi5TRUxFQ1RfUVVFU1RJT05fVFlQRSddXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzc2Vzc21lbnQtbWF0LXNlbGVjdCBjb2wtMTIgYXNzZXNzbWVudC1ib3JkZXItcmFkaXVzLXR3byBvdXRsaW5lLTAgYXNzZXNzbWVudC1pbnB1dC1ib3JkZXItb25lIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTMgYXNzZXNzbWVudC1iZy1ncmV5LW9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xM1wiICpuZ0Zvcj1cImxldCB0eXBlIG9mIHF1ZXN0aW9uVHlwZXNcIiBbdmFsdWVdPVwidHlwZT8uY29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3R5cGU/LmxhYmVsfX1cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdxdWVzdGlvblR5cGUnKT8uZXJyb3JzICAmJiBxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdxdWVzdGlvblR5cGUnKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkVSUk9SLlJFUVVJUkVEJ119fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBiLTQgY29sLTEyXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi0yIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTYgYXNzZXNzbWVudC10ZXh0LWdyZXktdGVuXCI+UXVlc3Rpb248L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGFwcC10ZXh0LWVkaXRvciBbcHJlVGV4dF09XCJxdWVzdGlvbnNGb3JtR3JvdXA/LmdldCgncXVlc3Rpb25UZXh0Jyk/LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2UpPVwicXVlc3Rpb25zRm9ybUdyb3VwPy5nZXQoJ3F1ZXN0aW9uVGV4dCcpPy5wYXRjaFZhbHVlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULlBMQUNFSE9MREVSLkVOVEVSX1FVRVNUSU9OJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC1jdXN0b20tYW5ndWxhci1lZGl0b3Itd2hpdGUgYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTMgYXNzZXNzbWVudC10ZXh0LWdyZXktdGVuXCJcclxuICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIic4cmVtJ1wiPlxyXG4gICAgICAgICAgICAgICAgPC9hcHAtdGV4dC1lZGl0b3I+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdxdWVzdGlvblRleHQnKT8uZXJyb3JzICAmJiBxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdxdWVzdGlvblRleHQnKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkVSUk9SLlJFUVVJUkVEJ119fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBwb3NpdGlvbi1yZWxhdGl2ZSBtdC0zXCIgKm5nSWY9XCJzaG93RmllbGQoJ3F1ZXN0aW9uTWVkaWEnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJxdWVzdGlvbk1lZGlhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuUExBQ0VIT0xERVIuRU5URVJfUVVFU1RJT05fTUVESUEnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLTEyIGFzc2Vzc21lbnQtaW5wdXQtcGFkZGluZyBhc3Nlc3NtZW50LWJvcmRlci1yYWRpdXMtdHdvIG91dGxpbmUtMCBhc3Nlc3NtZW50LWlucHV0LWJvcmRlci1vbmUgYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xMyBhc3Nlc3NtZW50LWJnLWdyZXktb25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydib3JkZXItZGFuZ2VyJzogcXVlc3Rpb25zRm9ybUdyb3VwLmdldCgncXVlc3Rpb25NZWRpYScpPy5pbnZhbGlkICYmIHF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ3F1ZXN0aW9uTWVkaWEnKT8udG91Y2hlZH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicXVlc3Rpb25zRm9ybUdyb3VwLmdldCgncXVlc3Rpb25NZWRpYScpPy5oYXNFcnJvcigncGF0dGVybicpICYmIHF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ3F1ZXN0aW9uTWVkaWEnKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWRhbmdlciBtdC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5JTlZBTElEX1VSTCddfX1cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicXVlc3Rpb25zRm9ybUdyb3VwLmdldCgncXVlc3Rpb25NZWRpYScpPy5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdxdWVzdGlvbk1lZGlhJyk/LnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEyIGFzc2Vzc21lbnQtdGV4dC1kYW5nZXIgbXQtMVwiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5SRVFVSVJFRCddfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBteC0wIGNvbC0xMiBwYi00XCIgKm5nSWY9XCJzaG93RmllbGQoJ21pbkNoYXJhY3RlckNvdW50JykgfHwgc2hvd0ZpZWxkKCdtYXhDaGFyYWN0ZXJDb3VudCcpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcHMtMFwiICpuZ0lmPVwic2hvd0ZpZWxkKCdtaW5DaGFyYWN0ZXJDb3VudCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMSBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXRlblwiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5NSU5fQ0hBUkFDVEVSX0xJTUlUJ119fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJtaW5DaGFyYWN0ZXJDb3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5QTEFDRUhPTERFUi5OT1RfU0VUJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImFsbG93T25seU51bWJlcnMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdtaW5DaGFyYWN0ZXJDb3VudCcpPy5tYXJrQXNUb3VjaGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtMTIgYXNzZXNzbWVudC1pbnB1dC1wYWRkaW5nIGFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gb3V0bGluZS0wIGFzc2Vzc21lbnQtaW5wdXQtYm9yZGVyLW9uZSBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtYmctZ3JleS1vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWdyZXktc2V2ZW4gcG9zaXRpb24tYWJzb2x1dGUgZW5kLTAgbWUtM1wiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5DSEFSQUNURVJTJ119fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicXVlc3Rpb25zRm9ybUdyb3VwLmdldCgnbWluQ2hhcmFjdGVyQ291bnQnKT8uZXJyb3JzICAmJiBxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdtaW5DaGFyYWN0ZXJDb3VudCcpPy50b3VjaGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkVSUk9SLlJFUVVJUkVEJ119fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcGUtMFwiICpuZ0lmPVwic2hvd0ZpZWxkKCdtYXhDaGFyYWN0ZXJDb3VudCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMSBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXRlblwiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5NQVhfQ0hBUkFDVEVSX0xJTUlUJ119fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJtYXhDaGFyYWN0ZXJDb3VudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5QTEFDRUhPTERFUi5OT1RfU0VUJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImFsbG93T25seU51bWJlcnMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdtYXhDaGFyYWN0ZXJDb3VudCcpPy5tYXJrQXNUb3VjaGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtMTIgYXNzZXNzbWVudC1pbnB1dC1wYWRkaW5nIGFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gb3V0bGluZS0wIGFzc2Vzc21lbnQtaW5wdXQtYm9yZGVyLW9uZSBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtYmctZ3JleS1vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWdyZXktc2V2ZW4gcG9zaXRpb24tYWJzb2x1dGUgZW5kLTAgbWUtM1wiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5DSEFSQUNURVJTJ119fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicXVlc3Rpb25zRm9ybUdyb3VwLmdldCgnbWF4Q2hhcmFjdGVyQ291bnQnKT8uZXJyb3JzICAmJiBxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdtYXhDaGFyYWN0ZXJDb3VudCcpPy50b3VjaGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkVSUk9SLlJFUVVJUkVEJ119fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG14LTAgY29sLTEyIHBiLTRcIiAqbmdJZj1cInNob3dGaWVsZCgnbWF4RmlsZVNpemUnKSB8fCBzaG93RmllbGQoJ21heE5vT2ZGaWxlcycpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcHMtMFwiICpuZ0lmPVwic2hvd0ZpZWxkKCdtYXhGaWxlU2l6ZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMSBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXRlblwiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5NQVhfRklMRV9TSVpFJ119fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJtYXhGaWxlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5QTEFDRUhPTERFUi5OT1RfU0VUJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImFsbG93T25seU51bWJlcnMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdtYXhGaWxlU2l6ZScpPy5tYXJrQXNUb3VjaGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtMTIgYXNzZXNzbWVudC1pbnB1dC1wYWRkaW5nIGFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gb3V0bGluZS0wIGFzc2Vzc21lbnQtaW5wdXQtYm9yZGVyLW9uZSBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtYmctZ3JleS1vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWdyZXktc2V2ZW4gcG9zaXRpb24tYWJzb2x1dGUgZW5kLTAgbWUtM1wiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5NQiddfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ21heEZpbGVTaXplJyk/LmVycm9ycyAgJiYgcXVlc3Rpb25zRm9ybUdyb3VwLmdldCgnbWF4RmlsZVNpemUnKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWRhbmdlclwiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5SRVFVSVJFRCddfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHBlLTBcIiAqbmdJZj1cInNob3dGaWVsZCgnbWF4Tm9PZkZpbGVzJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0xIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTMgYXNzZXNzbWVudC10ZXh0LWdyZXktdGVuXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk1BWF9OT19PRl9GSUxFUyddfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwibWF4Tm9PZkZpbGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULlBMQUNFSE9MREVSLk5PVF9TRVQnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiYWxsb3dPbmx5TnVtYmVycygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cInF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ21heE5vT2ZGaWxlcycpPy5tYXJrQXNUb3VjaGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtMTIgYXNzZXNzbWVudC1pbnB1dC1wYWRkaW5nIGFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gb3V0bGluZS0wIGFzc2Vzc21lbnQtaW5wdXQtYm9yZGVyLW9uZSBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtYmctZ3JleS1vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWdyZXktc2V2ZW4gcG9zaXRpb24tYWJzb2x1dGUgZW5kLTAgbWUtM1wiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5GSUxFUyddfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ21heE5vT2ZGaWxlcycpPy5lcnJvcnMgICYmIHF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ21heE5vT2ZGaWxlcycpPy50b3VjaGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkVSUk9SLlJFUVVJUkVEJ119fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGItNCBjb2wtMTJcIiAqbmdJZj1cInNob3dGaWVsZCgnY3VzdG9tUmVnZXgnKVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0xIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTMgYXNzZXNzbWVudC10ZXh0LWdyZXktdGVuXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLkNVU1RPTV9SRUdFWCddfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImN1c3RvbVJlZ2V4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuUExBQ0VIT0xERVIuRU5URVJfQ1VTVE9NX1JFR0VYJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdjdXN0b21SZWdleCcpPy5tYXJrQXNUb3VjaGVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBhc3Nlc3NtZW50LWlucHV0LXBhZGRpbmcgYXNzZXNzbWVudC1ib3JkZXItcmFkaXVzLXR3byBvdXRsaW5lLTAgYXNzZXNzbWVudC1pbnB1dC1ib3JkZXItb25lIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTMgYXNzZXNzbWVudC1iZy1ncmV5LW9uZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdjdXN0b21SZWdleCcpPy5lcnJvcnMgICYmIHF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ2N1c3RvbVJlZ2V4Jyk/LnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWRhbmdlclwiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5SRVFVSVJFRCddfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi00IGNvbC0xMlwiICpuZ0lmPVwic2hvd0ZpZWxkKCd0b3RhbE1hcmtzJykgJiYgIWlzQ2hpbGQgJiYgcXVlc3Rpb25TdGFjay5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0xIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTMgYXNzZXNzbWVudC10ZXh0LWdyZXktdGVuXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLlRPVEFMX01BUktTJ119fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidG90YWxNYXJrc1wiIHBsYWNlaG9sZGVyPVwiMFwiIChpbnB1dCk9XCJhbGxvd09ubHlOdW1iZXJzKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCd0b3RhbE1hcmtzJyk/Lm1hcmtBc1RvdWNoZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLTEyIGFzc2Vzc21lbnQtaW5wdXQtcGFkZGluZyBhc3Nlc3NtZW50LWJvcmRlci1yYWRpdXMtdHdvIG91dGxpbmUtMCBhc3Nlc3NtZW50LWlucHV0LWJvcmRlci1vbmUgYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xMyBhc3Nlc3NtZW50LWJnLWdyZXktb25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZ3JleS1zZXZlbiBwb3NpdGlvbi1hYnNvbHV0ZSBlbmQtMCBtZS0zXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk1BUktTJ119fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicXVlc3Rpb25zRm9ybUdyb3VwLmdldCgndG90YWxNYXJrcycpPy5lcnJvcnMgICYmIHF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ3RvdGFsTWFya3MnKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkVSUk9SLlJFUVVJUkVEJ119fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXgtMCBjb2wtMTIgcGItNFwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dGaWVsZCgnbWluaW11bU51bWJlck9mT3B0aW9uJykgfHwgc2hvd0ZpZWxkKCdtYXhpbXVtTnVtYmVyT2ZPcHRpb24nKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IHBzLTBcIiAqbmdJZj1cInNob3dGaWVsZCgnbWluaW11bU51bWJlck9mT3B0aW9uJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0xIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTMgYXNzZXNzbWVudC10ZXh0LWdyZXktdGVuXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk1JTl9PUFRJT05fU0VMRUNUX0xJTUlUJ119fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJtaW5pbXVtTnVtYmVyT2ZPcHRpb25cIiBwbGFjZWhvbGRlcj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImFsbG93T25seU51bWJlcnMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdtaW5pbXVtTnVtYmVyT2ZPcHRpb24nKT8ubWFya0FzVG91Y2hlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLTEyIGFzc2Vzc21lbnQtaW5wdXQtcGFkZGluZyBhc3Nlc3NtZW50LWJvcmRlci1yYWRpdXMtdHdvIG91dGxpbmUtMCBhc3Nlc3NtZW50LWlucHV0LWJvcmRlci1vbmUgYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xMyBhc3Nlc3NtZW50LWJnLWdyZXktb25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEyIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXNldmVuIHBvc2l0aW9uLWFic29sdXRlIGVuZC0wIG1lLTNcIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuT1BUSU9OUyddfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ21pbmltdW1OdW1iZXJPZk9wdGlvbicpPy5lcnJvcnMgICYmIHF1ZXN0aW9uc0Zvcm1Hcm91cC5nZXQoJ21pbmltdW1OdW1iZXJPZk9wdGlvbicpPy50b3VjaGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZGFuZ2VyXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkVSUk9SLlJFUVVJUkVEJ119fTwvbWF0LWVycm9yPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgcGUtMFwiICpuZ0lmPVwic2hvd0ZpZWxkKCdtYXhpbXVtTnVtYmVyT2ZPcHRpb24nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTEgYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xMyBhc3Nlc3NtZW50LXRleHQtZ3JleS10ZW5cIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuTUFYX09QVElPTl9TRUxFQ1RfTElNSVQnXX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgcG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cIm1heGltdW1OdW1iZXJPZk9wdGlvblwiIFtwbGFjZWhvbGRlcl09XCJvcHRpb25zLmxlbmd0aCB8fCAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJhbGxvd09ubHlOdW1iZXJzKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwicXVlc3Rpb25zRm9ybUdyb3VwLmdldCgnbWF4aW11bU51bWJlck9mT3B0aW9uJyk/Lm1hcmtBc1RvdWNoZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBhc3Nlc3NtZW50LWlucHV0LXBhZGRpbmcgYXNzZXNzbWVudC1ib3JkZXItcmFkaXVzLXR3byBvdXRsaW5lLTAgYXNzZXNzbWVudC1pbnB1dC1ib3JkZXItb25lIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTMgYXNzZXNzbWVudC1iZy1ncmV5LW9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMiBhc3Nlc3NtZW50LXRleHQtZ3JleS1zZXZlbiBwb3NpdGlvbi1hYnNvbHV0ZSBlbmQtMCBtZS0zXCI+e3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk9QVElPTlMnXX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdtYXhpbXVtTnVtYmVyT2ZPcHRpb24nKT8uZXJyb3JzICAmJiBxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdtYXhpbXVtTnVtYmVyT2ZPcHRpb24nKT8udG91Y2hlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LXJlZ3VsYXItMTIgYXNzZXNzbWVudC10ZXh0LWRhbmdlclwiPnt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5FUlJPUi5SRVFVSVJFRCddfX08L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYi00IGNvbC0xMiBtdC1tZC0zXCIgKm5nSWY9XCJzaG93RmllbGQoJ29wdGlvbnMnKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwib3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiICpuZ0lmPVwib3B0aW9uLmdldCgnaXNBY3RpdmUnKT8udmFsdWUgIT09IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHktbWQtMCBweS0zIGJvcmRlci1ib3R0b20gYm9yZGVyLW1kLTAgY29sLTEyIGQtZmxleCBmbGV4LXdyYXAgZmxleC1tZC1ub3dyYXAgYWxpZ24taXRlbXMtbWQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGdhcC1tZC00IGdhcC0zXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQgZmxleC1tZC1ncm93LTEgZC1mbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1jZW50ZXIgbXQtbWQtM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnB0LW1kLTNdPVwiaSA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm91bmRlZC1jaXJjbGUgcC0yIGJvcmRlci1ncmV5LXRlbi0yIG10LTFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJvcHRpb25MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuUExBQ0VIT0xERVIuRU5URVJfT1BUSU9OJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1ncm93LTEgYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xMyBib3JkZXItMCBvdXRsaW5lLTAgYmctdHJhbnNwYXJlbnQgaW5wdXQtZm9jdXMgcHktMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtbWQtbm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImltYWdlQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuSUNPTi5DTE9TRSddXCIgKGNsaWNrKT1cInJlbW92ZU9wdGlvbihpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VFcnJvckhhbmRsZXIoJGV2ZW50LCAnYXNzZXRzL2NvbW1vbnMtYXNzZXNzbWVudC9pbWFnZXMvY2xvc2Uuc3ZnJylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24uZ2V0KCdvcHRpb25MYWJlbCcpPy5pbnZhbGlkICYmIG9wdGlvbi5nZXQoJ29wdGlvbkxhYmVsJyk/LnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEyIG10LTFcIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuRVJST1IuUkVRVUlSRUQnXX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0ZpZWxkKCdvcHRpb25zJywgJ3Nob3dXZWlnaHRhZ2UnKSAmJiAhaXNDaGlsZCAmJiBxdWVzdGlvblN0YWNrLmxlbmd0aCA9PSAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEyIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXNpeCBtYi0yIG1iLW1kLTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2hpZGRlbi1sYWJlbCc6IGkgPiAwfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuV0VJR0hUQUdFJ119fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGlucHV0KT1cImFsbG93T25seU51bWJlcnMoJGV2ZW50KVwiIGZvcm1Db250cm9sTmFtZT1cIndlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHgtMyBweS1tZC0xIHB5LTIgYXNzZXNzbWVudC1ib3JkZXItcmFkaXVzLXR3byBhc3Nlc3NtZW50LWlucHV0LWJvcmRlci1vbmUgb3V0bGluZS0wIGFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEyIGFzc2Vzc21lbnQtbWFya3MtaW5wdXQgYXNzZXNzbWVudC1iZy1ncmV5LW9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLldFSUdIVEFHRSddXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0ZpZWxkKCdvcHRpb25zJywgJ3Nob3dSZW1hcmtzJylcIiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEyIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXNpeCBtYi0yIG1iLW1kLTMgcGItbWQtMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGlkZGVuLWxhYmVsJzogaSA+IDB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5SRU1BUktTJ119fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJyZW1hcmtzUmVxdWlyZWRcIiBmb3JtQ29udHJvbE5hbWU9XCJyZW1hcmtzUmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLW5vbmUgZC1tZC1ibG9jayBwdC0zXCIgW2NsYXNzLmN1c3RvbS1tYXJnaW5dPVwiaSA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW3NyY109XCJpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uQ0xPU0UnXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVPcHRpb24oaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VFcnJvckhhbmRsZXIoJGV2ZW50LCAnYXNzZXRzL2NvbW1vbnMtYXNzZXNzbWVudC9pbWFnZXMvY2xvc2Uuc3ZnJylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRPcHRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LWJvcmRlci1yYWRpdXMtdHdvIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgYmctdHJhbnNwYXJlbnQgYXNzZXNzbWVudC10ZXh0LXByaW1hcnktb25lIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTIgYm9yZGVyLTAgYXNzZXNzbWVudC16b29tLWFuaW1hdGlvbiBtdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImltYWdlQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuSUNPTi5QTFVTX1BSSU1BUlknXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJpbWFnZUVycm9ySGFuZGxlcigkZXZlbnQsICdhc3NldHMvY29tbW9ucy1hc3Nlc3NtZW50L2ltYWdlcy9wbHVzLXByaW1hcnkuc3ZnJylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5BRERfT1BUSU9OJ119fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdvcHRpb25zJyk/LmVycm9ycyAgJiYgcXVlc3Rpb25zRm9ybUdyb3VwLmdldCgnb3B0aW9ucycpPy50b3VjaGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEyIGFzc2Vzc21lbnQtdGV4dC1kYW5nZXJcIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuRVJST1IuUkVRVUlSRUQnXX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktNCBjb2wtMTIgYm9yZGVyLXRvcFwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dGaWVsZCgnY2hpbGRRdWVzdGlvbnMnKSAmJiBxdWVzdGlvblN0YWNrLmxlbmd0aCA9PSAwICYmICFpc0NoaWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xNiBhc3Nlc3NtZW50LXRleHQtZ3JleS10ZW5cIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuQ0hJTERfUVVFU1RJT05TJ119fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBtYXRUb29sdGlwPVwie3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLkNISUxEX1FVRVNUSU9OU19JTkZPJ119fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgbWF0VG9vbHRpcENsYXNzPVwiYXNzZXNzbWVudC10b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uSU5GTyddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKT1cImltYWdlRXJyb3JIYW5kbGVyKCRldmVudCwgJ2Fzc2V0cy9jb21tb25zLWFzc2Vzc21lbnQvaW1hZ2VzL2luZm8uc3ZnJylcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgY2hpbGRRdWVzdGlvbkdyb3VwczsgbGV0IGdyb3VwSW5kZXggPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtMTIgcC0zIG15LTMgYXNzZXNzbWVudC1iZy1ncmV5LW9uZSBhc3Nlc3NtZW50LWJvcmRlci1yYWRpdXMtdGhyZWUgYXNzZXNzbWVudC1pbnB1dC1ib3JkZXItb25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi0zXCIgKm5nSWY9XCJvcHRpb25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTEgYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xMyBhc3Nlc3NtZW50LXRleHQtZ3JleS10ZW5cIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuQVNTSUdORURfT1BUSU9OJ119fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFt2YWx1ZV09XCJncm91cC5vcHRpb25JZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uR3JvdXBPcHRpb25DaGFuZ2UoZ3JvdXAuaWQsICRldmVudC52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuUExBQ0VIT0xERVIuU0VMRUNUX09QVElPTl9UT19MSU5LJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtMTIgYXNzZXNzbWVudC1tYXQtc2VsZWN0IGFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gYXNzZXNzbWVudC1iZy13aGl0ZSBvdXRsaW5lLTAgYXNzZXNzbWVudC1pbnB1dC1ib3JkZXItb25lIGFzc2Vzc21lbnQtdGV4dC1tZWRpdW0tMTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwiYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xM1wiIFt2YWx1ZV09XCJudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk5PTkUnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHQgb2Ygb3B0aW9ucy5jb250cm9sczsgbGV0IG9wSW5kZXggPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwib3B0LmdldCgnaXNBY3RpdmUnKT8udmFsdWUgIT09IGZhbHNlXCIgY2xhc3M9XCJhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE9wdGlvbklkKG9wdClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0LmdldCgnb3B0aW9uTGFiZWwnKT8udmFsdWUgfHwgKCdPcHRpb24gJyArIChvcEluZGV4ICsgMSkpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcXVlc3Rpb25JZCBvZiBncm91cC5xdWVzdGlvbklkczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q2hpbGRRdWVzdGlvbkJ5SWQocXVlc3Rpb25JZCkgYXMgY2hpbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTEgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMCBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTE0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuUVVFU1RJT04nXX19IHt7aSArIDF9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1hZ2VDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5JQ09OLkRFTEVURSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWljb24gY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUNoaWxkUXVlc3Rpb25CeUlkKGNoaWxkLmlkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJpbWFnZUVycm9ySGFuZGxlcigkZXZlbnQsICdhc3NldHMvY29tbW9ucy1hc3Nlc3NtZW50L2ltYWdlcy9kZWxldGUuc3ZnJylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiY2hpbGQ/LnF1ZXN0aW9uVGV4dD8uWzBdPy50ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkRWRpdENoaWxkUXVlc3Rpb24oY2hpbGQsIGdldENoaWxkUXVlc3Rpb25JbmRleChjaGlsZC5pZCkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBhc3Nlc3NtZW50LWJ1dHRvbi1wYWRkaW5nIGFzc2Vzc21lbnQtYm9yZGVyLXJhZGl1cy10d28gYXNzZXNzbWVudC1iZy13aGl0ZSBhc3Nlc3NtZW50LWlucHV0LWJvcmRlci1vbmUgYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xMiBjdXJzb3ItcG9pbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhZGRFZGl0Q2hpbGRRdWVzdGlvbih1bmRlZmluZWQsIHVuZGVmaW5lZCwgZ3JvdXAuaWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhc3Nlc3NtZW50LXpvb20tYW5pbWF0aW9uIGJvcmRlci0wIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtMiBhc3Nlc3NtZW50LXRleHQtcHJpbWFyeS1vbmUgYmctdHJhbnNwYXJlbnQgYXNzZXNzbWVudC10ZXh0LXNlbWlib2xkLTEyIG91dGxpbmUtMCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uUExVU19QUklNQVJZJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKT1cImltYWdlRXJyb3JIYW5kbGVyKCRldmVudCwgJ2Fzc2V0cy9jb21tb25zLWFzc2Vzc21lbnQvaW1hZ2VzL3BsdXMtcHJpbWFyeS5zdmcnKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5BRERfTU9SRSddfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImFkZEVkaXRDaGlsZFF1ZXN0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXNzbWVudC16b29tLWFuaW1hdGlvbiBhc3Nlc3NtZW50LWJ1dHRvbi1wYWRkaW5nIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBnYXAtMyBhc3Nlc3NtZW50LXRleHQtcHJpbWFyeS1vbmUgYXNzZXNzbWVudC1iZy1wYWxldHRlLUVERjNGRCBhc3Nlc3NtZW50LXRleHQtc2VtaWJvbGQtMTIgb3V0bGluZS0wIGNvbC0xMiBhc3Nlc3NtZW50LWJvcmRlci1yYWRpdXMtdHdvIG10LTMgYm9yZGVyLUFEQzlGNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWFnZUNvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULklDT04uUExVU19QUklNQVJZJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwiaW1hZ2VFcnJvckhhbmRsZXIoJGV2ZW50LCAnYXNzZXRzL2NvbW1vbnMtYXNzZXNzbWVudC9pbWFnZXMvcGx1cy1wcmltYXJ5LnN2ZycpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICB7e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuQUREX0NISUxEX1FVRVNUSU9OJ119fVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktNCBjb2wtMTIgYm9yZGVyLXRvcFwiICpuZ0lmPVwic2hvd0ZpZWxkKCdoaW50VGV4dCcpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTIgYXNzZXNzbWVudC10ZXh0LW1lZGl1bS0xNiBhc3Nlc3NtZW50LXRleHQtZ3JleS10ZW5cIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuTEFCRUwuQUREX0hJTlQnXX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxhcHAtdGV4dC1lZGl0b3IgW3ByZVRleHRdPVwicXVlc3Rpb25zRm9ybUdyb3VwPy5nZXQoJ2hpbnRUZXh0Jyk/LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2UpPVwicXVlc3Rpb25zRm9ybUdyb3VwPy5nZXQoJ2hpbnRUZXh0Jyk/LnBhdGNoVmFsdWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuUExBQ0VIT0xERVIuRU5URVJfSElOVCddXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzc2Vzc21lbnQtY3VzdG9tLWFuZ3VsYXItZWRpdG9yLXdoaXRlIGFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEzIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXRlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCInOHJlbSdcIj5cclxuICAgICAgICAgICAgICAgIDwvYXBwLXRleHQtZWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicXVlc3Rpb25zRm9ybUdyb3VwLmdldCgnaGludFRleHQnKT8uZXJyb3JzICAmJiBxdWVzdGlvbnNGb3JtR3JvdXAuZ2V0KCdoaW50VGV4dCcpPy50b3VjaGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFzc2Vzc21lbnQtdGV4dC1yZWd1bGFyLTEyIGFzc2Vzc21lbnQtdGV4dC1kYW5nZXJcIj57e2xhYmVsQ29uZmlnWydDT01NT05TX0FTU0VTU01FTlQuRVJST1IuUkVRVUlSRUQnXX19PC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktNCBjb2wtMTIgYm9yZGVyLXRvcFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMiBhc3Nlc3NtZW50LXRleHQtc2VtaWJvbGQtMTggYXNzZXNzbWVudC10ZXh0LWdyZXktdGVuIGNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7bGFiZWxDb25maWdbJ0NPTU1PTlNfQVNTRVNTTUVOVC5MQUJFTC5GSUVMRFNfU0VUVElOR1MnXX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm15LTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMCBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXRlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLlNIT1dfVEhJU19GSUVMRCddfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMCBhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMSBhc3Nlc3NtZW50LXRleHQtZ3JleS1laWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLlNIT1dfVEhJU19GSUVMRF9ERVNDJ119fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgbmFtZT1cInZpc2liaWxpdHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmlzaWJpbGl0eVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMCBhc3Nlc3NtZW50LXRleHQtbWVkaXVtLTEzIGFzc2Vzc21lbnQtdGV4dC1ncmV5LXRlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk1BTkRBVE9SWSddfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMCBhc3Nlc3NtZW50LXRleHQtcmVndWxhci0xMSBhc3Nlc3NtZW50LXRleHQtZ3JleS1laWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsYWJlbENvbmZpZ1snQ09NTU9OU19BU1NFU1NNRU5ULkxBQkVMLk1BTkRBVE9SWV9ERVNDJ119fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgbmFtZT1cImlzTWFuZGF0b3J5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImlzTWFuZGF0b3J5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
|