@sunbird-cb/cbp-ai 0.0.1
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 +24 -0
- package/esm2022/lib/ai-cbp-routing.module.mjs +56 -0
- package/esm2022/lib/ai-cbp.component.mjs +14 -0
- package/esm2022/lib/ai-cbp.module.mjs +263 -0
- package/esm2022/lib/ai-cbp.service.mjs +14 -0
- package/esm2022/lib/components/add-course/add-course.component.mjs +444 -0
- package/esm2022/lib/components/add-designation/add-designation.component.mjs +460 -0
- package/esm2022/lib/components/add-personalisation/add-personalisation.component.mjs +33 -0
- package/esm2022/lib/components/approval-request-form/approval-request-form.component.mjs +392 -0
- package/esm2022/lib/components/approval-requests/approval-requests.component.mjs +398 -0
- package/esm2022/lib/components/dashboard/dashboard.component.mjs +265 -0
- package/esm2022/lib/components/delete-role-mapping/delete-role-mapping.component.mjs +53 -0
- package/esm2022/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.mjs +39 -0
- package/esm2022/lib/components/edit-cbp-plan/edit-cbp-plan.component.mjs +699 -0
- package/esm2022/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.mjs +188 -0
- package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +1949 -0
- package/esm2022/lib/components/list-popup/list-popup.component.mjs +32 -0
- package/esm2022/lib/components/review-request/review-request.component.mjs +138 -0
- package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +1082 -0
- package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +714 -0
- package/esm2022/lib/components/suggest-more-courses/suggest-more-courses.component.mjs +370 -0
- package/esm2022/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.mjs +235 -0
- package/esm2022/lib/components/view-cbp-plan/view-cbp-plan.component.mjs +125 -0
- package/esm2022/lib/components/view-course-recommendation/view-course-recommendation.component.mjs +397 -0
- package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +883 -0
- package/esm2022/lib/modules/initial-screen/initial-screen.component.mjs +127 -0
- package/esm2022/lib/modules/shared/constant/app.constant.mjs +2036 -0
- package/esm2022/lib/modules/shared/directives/clickoutside.directive.mjs +38 -0
- package/esm2022/lib/modules/shared/directives/directive.module.mjs +21 -0
- package/esm2022/lib/modules/shared/pipes/order-by-name.pipe.mjs +23 -0
- package/esm2022/lib/modules/shared/services/event.service.mjs +24 -0
- package/esm2022/lib/modules/shared/services/events.mjs +125 -0
- package/esm2022/lib/modules/shared/services/init.service.mjs +41 -0
- package/esm2022/lib/modules/shared/services/role-mapping.service.mjs +261 -0
- package/esm2022/lib/modules/shared/services/shared.service.mjs +869 -0
- package/esm2022/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.mjs +53 -0
- package/esm2022/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.mjs +186 -0
- package/esm2022/lib/modules/upload-document-page/upload-document-page.component.mjs +367 -0
- package/esm2022/lib/pipe-public-URL/pipe-public-URL.module.mjs +20 -0
- package/esm2022/lib/pipe-public-URL/pipe-public-URL.pipe.mjs +23 -0
- package/esm2022/public-api.mjs +14 -0
- package/esm2022/sunbird-cb-cbp-ai.mjs +5 -0
- package/fesm2022/sunbird-cb-cbp-ai.mjs +12952 -0
- package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/ai-cbp-routing.module.d.ts +8 -0
- package/lib/ai-cbp-routing.module.d.ts.map +1 -0
- package/lib/ai-cbp.component.d.ts +7 -0
- package/lib/ai-cbp.component.d.ts.map +1 -0
- package/lib/ai-cbp.module.d.ts +68 -0
- package/lib/ai-cbp.module.d.ts.map +1 -0
- package/lib/ai-cbp.service.d.ts +7 -0
- package/lib/ai-cbp.service.d.ts.map +1 -0
- package/lib/components/add-course/add-course.component.d.ts +67 -0
- package/lib/components/add-course/add-course.component.d.ts.map +1 -0
- package/lib/components/add-designation/add-designation.component.d.ts +52 -0
- package/lib/components/add-designation/add-designation.component.d.ts.map +1 -0
- package/lib/components/add-personalisation/add-personalisation.component.d.ts +16 -0
- package/lib/components/add-personalisation/add-personalisation.component.d.ts.map +1 -0
- package/lib/components/approval-request-form/approval-request-form.component.d.ts +48 -0
- package/lib/components/approval-request-form/approval-request-form.component.d.ts.map +1 -0
- package/lib/components/approval-requests/approval-requests.component.d.ts +80 -0
- package/lib/components/approval-requests/approval-requests.component.d.ts.map +1 -0
- package/lib/components/dashboard/dashboard.component.d.ts +55 -0
- package/lib/components/dashboard/dashboard.component.d.ts.map +1 -0
- package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts +18 -0
- package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts.map +1 -0
- package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts +18 -0
- package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts.map +1 -0
- package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts +94 -0
- package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts.map +1 -0
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts +35 -0
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts.map +1 -0
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +198 -0
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -0
- package/lib/components/list-popup/list-popup.component.d.ts +13 -0
- package/lib/components/list-popup/list-popup.component.d.ts.map +1 -0
- package/lib/components/review-request/review-request.component.d.ts +39 -0
- package/lib/components/review-request/review-request.component.d.ts.map +1 -0
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +99 -0
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -0
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +83 -0
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -0
- package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts +48 -0
- package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts.map +1 -0
- package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts +41 -0
- package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts.map +1 -0
- package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts +29 -0
- package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts.map +1 -0
- package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts +49 -0
- package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts.map +1 -0
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts +73 -0
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts.map +1 -0
- package/lib/modules/initial-screen/initial-screen.component.d.ts +85 -0
- package/lib/modules/initial-screen/initial-screen.component.d.ts.map +1 -0
- package/lib/modules/shared/constant/app.constant.d.ts +457 -0
- package/lib/modules/shared/constant/app.constant.d.ts.map +1 -0
- package/lib/modules/shared/directives/clickoutside.directive.d.ts +13 -0
- package/lib/modules/shared/directives/clickoutside.directive.d.ts.map +1 -0
- package/lib/modules/shared/directives/directive.module.d.ts +8 -0
- package/lib/modules/shared/directives/directive.module.d.ts.map +1 -0
- package/lib/modules/shared/pipes/order-by-name.pipe.d.ts +8 -0
- package/lib/modules/shared/pipes/order-by-name.pipe.d.ts.map +1 -0
- package/lib/modules/shared/services/event.service.d.ts +12 -0
- package/lib/modules/shared/services/event.service.d.ts.map +1 -0
- package/lib/modules/shared/services/events.d.ts +200 -0
- package/lib/modules/shared/services/events.d.ts.map +1 -0
- package/lib/modules/shared/services/init.service.d.ts +13 -0
- package/lib/modules/shared/services/init.service.d.ts.map +1 -0
- package/lib/modules/shared/services/role-mapping.service.d.ts +21 -0
- package/lib/modules/shared/services/role-mapping.service.d.ts.map +1 -0
- package/lib/modules/shared/services/shared.service.d.ts +108 -0
- package/lib/modules/shared/services/shared.service.d.ts.map +1 -0
- package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts +14 -0
- package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts.map +1 -0
- package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts +29 -0
- package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts.map +1 -0
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts +64 -0
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts.map +1 -0
- package/lib/pipe-public-URL/pipe-public-URL.module.d.ts +9 -0
- package/lib/pipe-public-URL/pipe-public-URL.module.d.ts.map +1 -0
- package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts +11 -0
- package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts.map +1 -0
- package/package.json +28 -0
- package/public-api.d.ts +11 -0
- package/public-api.d.ts.map +1 -0
- package/sunbird-cb-cbp-ai-0.0.1.tgz +0 -0
- package/sunbird-cb-cbp-ai.d.ts.map +1 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
import { Component, Inject } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/material/dialog";
|
|
6
|
+
import * as i2 from "../../modules/shared/services/shared.service";
|
|
7
|
+
import * as i3 from "@angular/forms";
|
|
8
|
+
import * as i4 from "@angular/material/snack-bar";
|
|
9
|
+
import * as i5 from "@angular/common/http";
|
|
10
|
+
import * as i6 from "@angular/common";
|
|
11
|
+
import * as i7 from "@angular/material/legacy-form-field";
|
|
12
|
+
import * as i8 from "@angular/material/legacy-input";
|
|
13
|
+
import * as i9 from "@angular/material/icon";
|
|
14
|
+
import * as i10 from "@angular/material/legacy-select";
|
|
15
|
+
import * as i11 from "@angular/material/legacy-core";
|
|
16
|
+
import * as i12 from "@angular/material/progress-spinner";
|
|
17
|
+
export class AddCourseComponent {
|
|
18
|
+
constructor(dialogRef, data, sharedService, fb, snackBar, http, cdRef) {
|
|
19
|
+
this.dialogRef = dialogRef;
|
|
20
|
+
this.data = data;
|
|
21
|
+
this.sharedService = sharedService;
|
|
22
|
+
this.fb = fb;
|
|
23
|
+
this.snackBar = snackBar;
|
|
24
|
+
this.http = http;
|
|
25
|
+
this.cdRef = cdRef;
|
|
26
|
+
this.loading = false;
|
|
27
|
+
// Enhanced competency selection properties
|
|
28
|
+
this.competenciesData = [];
|
|
29
|
+
this.availableThemes = [];
|
|
30
|
+
this.availableSubThemes = [];
|
|
31
|
+
this.filteredThemes = [];
|
|
32
|
+
this.filteredSubThemes = [];
|
|
33
|
+
this.selectedCompetencyType = '';
|
|
34
|
+
this.selectedTheme = '';
|
|
35
|
+
this.selectedSubTheme = '';
|
|
36
|
+
this.manualTheme = '';
|
|
37
|
+
this.manualSubTheme = '';
|
|
38
|
+
this.themeSearchText = '';
|
|
39
|
+
this.subThemeSearchText = '';
|
|
40
|
+
this.competenciesCount = { total: 0, behavioral: 0, functional: 0, domain: 0 };
|
|
41
|
+
// Prefill properties
|
|
42
|
+
this.isCompetencyPrefilled = false;
|
|
43
|
+
this.prefilledCompetencyType = '';
|
|
44
|
+
this.prefilledTheme = '';
|
|
45
|
+
this.prefilledSubTheme = '';
|
|
46
|
+
this.planData = data;
|
|
47
|
+
this.initializeForm();
|
|
48
|
+
}
|
|
49
|
+
ngOnInit() {
|
|
50
|
+
this.loadCompetenciesData();
|
|
51
|
+
this.updateCompetencyCounts();
|
|
52
|
+
this.checkForPrefilledData();
|
|
53
|
+
}
|
|
54
|
+
checkForPrefilledData() {
|
|
55
|
+
console.log('=== CheckForPrefilledData ===');
|
|
56
|
+
console.log('Full data object:', this.data);
|
|
57
|
+
if (this.data && this.data.prefillCompetency) {
|
|
58
|
+
console.log('✅ Prefill competency data found:', this.data.prefillCompetency);
|
|
59
|
+
this.isCompetencyPrefilled = true;
|
|
60
|
+
this.prefilledCompetencyType = this.data.prefillCompetency.type;
|
|
61
|
+
this.prefilledTheme = this.data.prefillCompetency.theme;
|
|
62
|
+
this.prefilledSubTheme = this.data.prefillCompetency.subTheme || '';
|
|
63
|
+
console.log('Processed prefill data:', {
|
|
64
|
+
isCompetencyPrefilled: this.isCompetencyPrefilled,
|
|
65
|
+
prefilledCompetencyType: this.prefilledCompetencyType,
|
|
66
|
+
prefilledTheme: this.prefilledTheme,
|
|
67
|
+
prefilledSubTheme: this.prefilledSubTheme
|
|
68
|
+
});
|
|
69
|
+
// Set the competency type and trigger the theme loading
|
|
70
|
+
this.selectedCompetencyType = this.prefilledCompetencyType;
|
|
71
|
+
this.courseForm.patchValue({
|
|
72
|
+
competencyType: this.prefilledCompetencyType
|
|
73
|
+
});
|
|
74
|
+
console.log('Form updated with competency type:', this.prefilledCompetencyType);
|
|
75
|
+
// For Domain competencies, set manual theme and subtheme inputs and auto-add
|
|
76
|
+
if (this.prefilledCompetencyType === 'Domain') {
|
|
77
|
+
console.log('Setting Domain manual inputs...');
|
|
78
|
+
this.courseForm.patchValue({
|
|
79
|
+
manualThemeInput: this.prefilledTheme,
|
|
80
|
+
manualSubThemeInput: this.prefilledSubTheme
|
|
81
|
+
});
|
|
82
|
+
console.log('Domain form values set:', {
|
|
83
|
+
manualThemeInput: this.prefilledTheme,
|
|
84
|
+
manualSubThemeInput: this.prefilledSubTheme
|
|
85
|
+
});
|
|
86
|
+
// Auto-add the domain competency
|
|
87
|
+
setTimeout(() => {
|
|
88
|
+
console.log('Adding prefilled Domain competency...');
|
|
89
|
+
this.addPrefilledCompetency();
|
|
90
|
+
}, 100);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.log('Will handle Behavioral/Functional after competencies data loads...');
|
|
94
|
+
// For Behavioral/Functional, wait for competencies data to load
|
|
95
|
+
// The theme and subtheme will be set in loadCompetenciesData after data is available
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
console.log('❌ No prefill competency data found');
|
|
100
|
+
console.log('data.prefillCompetency:', this.data?.prefillCompetency);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
loadCompetenciesData() {
|
|
104
|
+
this.sharedService.getCompetencyJson().subscribe({
|
|
105
|
+
next: (data) => {
|
|
106
|
+
this.competenciesData = data;
|
|
107
|
+
console.log('Competencies data loaded:', this.competenciesData);
|
|
108
|
+
// Handle prefilled data after competencies are loaded
|
|
109
|
+
if (this.isCompetencyPrefilled && this.prefilledCompetencyType !== 'Domain') {
|
|
110
|
+
this.handlePrefilledBehavioralFunctional();
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
error: (error) => {
|
|
114
|
+
console.error('Error loading competencies data:', error);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
handlePrefilledBehavioralFunctional() {
|
|
119
|
+
console.log('=== HandlePrefilledBehavioralFunctional ===');
|
|
120
|
+
console.log('Prefilled competency type:', this.prefilledCompetencyType);
|
|
121
|
+
console.log('Prefilled theme:', this.prefilledTheme);
|
|
122
|
+
console.log('Prefilled subTheme:', this.prefilledSubTheme);
|
|
123
|
+
// Load themes for the prefilled competency type
|
|
124
|
+
this.onCompetencyTypeChange(this.prefilledCompetencyType);
|
|
125
|
+
// Find and set the theme if it exists in the data
|
|
126
|
+
setTimeout(() => {
|
|
127
|
+
console.log('Available themes:', this.availableThemes);
|
|
128
|
+
const matchingTheme = this.availableThemes.find(theme => theme.name.toLowerCase() === this.prefilledTheme.toLowerCase());
|
|
129
|
+
console.log('Matching theme found:', matchingTheme);
|
|
130
|
+
if (matchingTheme) {
|
|
131
|
+
this.selectedTheme = matchingTheme.name;
|
|
132
|
+
this.courseForm.patchValue({
|
|
133
|
+
competencyTheme: matchingTheme.name
|
|
134
|
+
});
|
|
135
|
+
this.onThemeChange(matchingTheme.name);
|
|
136
|
+
console.log('Theme set successfully:', matchingTheme.name);
|
|
137
|
+
// If subTheme is provided, try to set it after themes are loaded
|
|
138
|
+
if (this.prefilledSubTheme) {
|
|
139
|
+
setTimeout(() => {
|
|
140
|
+
console.log('Available subThemes:', this.availableSubThemes);
|
|
141
|
+
const matchingSubTheme = this.availableSubThemes.find(subTheme => subTheme.toLowerCase() === this.prefilledSubTheme.toLowerCase());
|
|
142
|
+
console.log('Matching subTheme found:', matchingSubTheme);
|
|
143
|
+
if (matchingSubTheme) {
|
|
144
|
+
this.selectedSubTheme = matchingSubTheme;
|
|
145
|
+
this.courseForm.patchValue({
|
|
146
|
+
competencySubTheme: matchingSubTheme
|
|
147
|
+
});
|
|
148
|
+
console.log('SubTheme set successfully:', matchingSubTheme);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
console.log('⚠️ SubTheme not found in available options');
|
|
152
|
+
}
|
|
153
|
+
// Add the prefilled competency with the specified theme and sub-theme
|
|
154
|
+
setTimeout(() => {
|
|
155
|
+
console.log('Adding prefilled competency with theme and subtheme...');
|
|
156
|
+
this.addPrefilledCompetency();
|
|
157
|
+
}, 100);
|
|
158
|
+
}, 300);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Automatically add the prefilled competency with just the theme
|
|
162
|
+
setTimeout(() => {
|
|
163
|
+
console.log('Adding prefilled competency with theme only...');
|
|
164
|
+
this.addPrefilledCompetency();
|
|
165
|
+
}, 200);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
console.log('⚠️ Theme not found in available options');
|
|
170
|
+
}
|
|
171
|
+
}, 100);
|
|
172
|
+
}
|
|
173
|
+
addPrefilledCompetency() {
|
|
174
|
+
// For prefilled competencies, use the theme name as the sub-theme
|
|
175
|
+
// This ensures the competency gap is addressed
|
|
176
|
+
const exists = this.competenciesArray.value.some(c => c.theme === this.prefilledTheme && c.type === this.prefilledCompetencyType);
|
|
177
|
+
if (!exists) {
|
|
178
|
+
const newComp = this.fb.group({
|
|
179
|
+
type: [this.prefilledCompetencyType],
|
|
180
|
+
theme: [this.prefilledTheme],
|
|
181
|
+
sub_theme: [this.prefilledTheme] // Use theme as sub_theme for gap filling
|
|
182
|
+
});
|
|
183
|
+
this.competenciesArray.push(newComp);
|
|
184
|
+
this.updateCompetencyCounts();
|
|
185
|
+
this.cdRef.detectChanges();
|
|
186
|
+
console.log('Auto-added prefilled competency:', {
|
|
187
|
+
type: this.prefilledCompetencyType,
|
|
188
|
+
theme: this.prefilledTheme,
|
|
189
|
+
sub_theme: this.prefilledTheme
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
initializeForm() {
|
|
194
|
+
this.courseForm = this.fb.group({
|
|
195
|
+
courseName: ['', Validators.required],
|
|
196
|
+
summary: [''],
|
|
197
|
+
platformName: ['', Validators.required],
|
|
198
|
+
courseUrl: ['', Validators.required],
|
|
199
|
+
competencyType: [''],
|
|
200
|
+
competencyTheme: [''],
|
|
201
|
+
competencySubTheme: [''],
|
|
202
|
+
manualThemeInput: [''],
|
|
203
|
+
manualSubThemeInput: [''],
|
|
204
|
+
themeSearch: [''],
|
|
205
|
+
subThemeSearch: [''],
|
|
206
|
+
competencies: this.fb.array([])
|
|
207
|
+
});
|
|
208
|
+
// Listen to form changes to trigger validation updates
|
|
209
|
+
this.courseForm.valueChanges.subscribe(() => {
|
|
210
|
+
this.cdRef.detectChanges();
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
cancelForm() {
|
|
214
|
+
this.dialogRef.close();
|
|
215
|
+
}
|
|
216
|
+
get competenciesArray() {
|
|
217
|
+
return this.courseForm.get('competencies');
|
|
218
|
+
}
|
|
219
|
+
updateCompetencyCounts() {
|
|
220
|
+
const comps = this.competenciesArray.value;
|
|
221
|
+
this.competenciesCount = { total: 0, behavioral: 0, functional: 0, domain: 0 };
|
|
222
|
+
comps.forEach(c => {
|
|
223
|
+
this.competenciesCount.total++;
|
|
224
|
+
if (c.type.toLowerCase() === 'behavioral')
|
|
225
|
+
this.competenciesCount.behavioral++;
|
|
226
|
+
if (c.type.toLowerCase() === 'functional')
|
|
227
|
+
this.competenciesCount.functional++;
|
|
228
|
+
if (c.type.toLowerCase() === 'domain')
|
|
229
|
+
this.competenciesCount.domain++;
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
onCompetencyTypeChange(type) {
|
|
233
|
+
this.selectedCompetencyType = type;
|
|
234
|
+
this.selectedTheme = '';
|
|
235
|
+
this.selectedSubTheme = '';
|
|
236
|
+
this.manualTheme = '';
|
|
237
|
+
this.manualSubTheme = '';
|
|
238
|
+
this.availableThemes = [];
|
|
239
|
+
this.availableSubThemes = [];
|
|
240
|
+
this.filteredThemes = [];
|
|
241
|
+
this.filteredSubThemes = [];
|
|
242
|
+
this.themeSearchText = '';
|
|
243
|
+
this.subThemeSearchText = '';
|
|
244
|
+
// Reset form controls
|
|
245
|
+
this.courseForm.patchValue({
|
|
246
|
+
competencyTheme: '',
|
|
247
|
+
competencySubTheme: '',
|
|
248
|
+
manualThemeInput: '',
|
|
249
|
+
manualSubThemeInput: '',
|
|
250
|
+
themeSearch: '',
|
|
251
|
+
subThemeSearch: ''
|
|
252
|
+
});
|
|
253
|
+
if (type === 'Behavioral' || type === 'Functional') {
|
|
254
|
+
// Load themes from JSON for Behavioral and Functional
|
|
255
|
+
const competencyCategory = this.competenciesData.find(cat => cat.name.toLowerCase() === type.toLowerCase() ||
|
|
256
|
+
(type === 'Behavioral' && cat.name === 'Behavioural'));
|
|
257
|
+
if (competencyCategory) {
|
|
258
|
+
this.availableThemes = competencyCategory.competency_theme || [];
|
|
259
|
+
this.filteredThemes = [...this.availableThemes];
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// For Domain, no themes are loaded - user will enter manually
|
|
263
|
+
}
|
|
264
|
+
onThemeChange(themeName) {
|
|
265
|
+
this.selectedTheme = themeName;
|
|
266
|
+
this.selectedSubTheme = '';
|
|
267
|
+
this.availableSubThemes = [];
|
|
268
|
+
this.filteredSubThemes = [];
|
|
269
|
+
this.subThemeSearchText = '';
|
|
270
|
+
this.courseForm.patchValue({
|
|
271
|
+
competencySubTheme: '',
|
|
272
|
+
subThemeSearch: ''
|
|
273
|
+
});
|
|
274
|
+
// Find the selected theme and load its sub-themes
|
|
275
|
+
const selectedThemeObj = this.availableThemes.find(theme => theme.name === themeName);
|
|
276
|
+
if (selectedThemeObj) {
|
|
277
|
+
this.availableSubThemes = selectedThemeObj.competency_sub_theme || [];
|
|
278
|
+
this.filteredSubThemes = [...this.availableSubThemes];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
onSubThemeChange(subThemeName) {
|
|
282
|
+
this.selectedSubTheme = subThemeName;
|
|
283
|
+
}
|
|
284
|
+
filterThemes(searchText) {
|
|
285
|
+
this.themeSearchText = searchText;
|
|
286
|
+
if (!searchText.trim()) {
|
|
287
|
+
this.filteredThemes = [...this.availableThemes];
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
this.filteredThemes = this.availableThemes.filter(theme => theme.name.toLowerCase().includes(searchText.toLowerCase()));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
filterSubThemes(searchText) {
|
|
294
|
+
this.subThemeSearchText = searchText;
|
|
295
|
+
if (!searchText.trim()) {
|
|
296
|
+
this.filteredSubThemes = [...this.availableSubThemes];
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
this.filteredSubThemes = this.availableSubThemes.filter(subTheme => subTheme.toLowerCase().includes(searchText.toLowerCase()));
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
addCompetency() {
|
|
303
|
+
let type = this.selectedCompetencyType;
|
|
304
|
+
let theme = '';
|
|
305
|
+
let subTheme = '';
|
|
306
|
+
if (type === 'Domain') {
|
|
307
|
+
// For Domain, use manual input
|
|
308
|
+
theme = this.courseForm.value.manualThemeInput?.trim();
|
|
309
|
+
subTheme = this.courseForm.value.manualSubThemeInput?.trim();
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
// For Behavioral/Functional, use dropdown selections
|
|
313
|
+
theme = this.selectedTheme;
|
|
314
|
+
subTheme = this.selectedSubTheme;
|
|
315
|
+
}
|
|
316
|
+
if (type && theme && subTheme) {
|
|
317
|
+
const exists = this.competenciesArray.value.some(c => c.theme === theme && c.sub_theme === subTheme && c.type === type);
|
|
318
|
+
if (!exists) {
|
|
319
|
+
const newComp = this.fb.group({
|
|
320
|
+
type: [type],
|
|
321
|
+
theme: [theme],
|
|
322
|
+
sub_theme: [subTheme]
|
|
323
|
+
});
|
|
324
|
+
this.competenciesArray.push(newComp);
|
|
325
|
+
}
|
|
326
|
+
// Clear input fields after adding
|
|
327
|
+
this.resetCompetencyForm();
|
|
328
|
+
}
|
|
329
|
+
const currentValues = this.competenciesArray.value;
|
|
330
|
+
this.courseForm.patchValue({ competencies: [...currentValues] });
|
|
331
|
+
this.updateCompetencyCounts();
|
|
332
|
+
this.cdRef.detectChanges(); // Trigger validation update
|
|
333
|
+
console.log(this.courseForm?.get('competencies')?.value);
|
|
334
|
+
}
|
|
335
|
+
resetCompetencyForm() {
|
|
336
|
+
this.selectedCompetencyType = '';
|
|
337
|
+
this.selectedTheme = '';
|
|
338
|
+
this.selectedSubTheme = '';
|
|
339
|
+
this.manualTheme = '';
|
|
340
|
+
this.manualSubTheme = '';
|
|
341
|
+
this.availableThemes = [];
|
|
342
|
+
this.availableSubThemes = [];
|
|
343
|
+
this.filteredThemes = [];
|
|
344
|
+
this.filteredSubThemes = [];
|
|
345
|
+
this.themeSearchText = '';
|
|
346
|
+
this.subThemeSearchText = '';
|
|
347
|
+
this.courseForm.patchValue({
|
|
348
|
+
competencyType: '',
|
|
349
|
+
competencyTheme: '',
|
|
350
|
+
competencySubTheme: '',
|
|
351
|
+
manualThemeInput: '',
|
|
352
|
+
manualSubThemeInput: '',
|
|
353
|
+
themeSearch: '',
|
|
354
|
+
subThemeSearch: ''
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
canAddCompetency() {
|
|
358
|
+
if (!this.selectedCompetencyType)
|
|
359
|
+
return false;
|
|
360
|
+
if (this.selectedCompetencyType === 'Domain') {
|
|
361
|
+
const theme = this.courseForm.value.manualThemeInput?.trim();
|
|
362
|
+
const subTheme = this.courseForm.value.manualSubThemeInput?.trim();
|
|
363
|
+
return !!(theme && subTheme);
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
return !!(this.selectedTheme && this.selectedSubTheme);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
canSaveCourse() {
|
|
370
|
+
// Check if required fields are filled
|
|
371
|
+
const courseName = this.courseForm.value.courseName?.trim();
|
|
372
|
+
const platformName = this.courseForm.value.platformName?.trim();
|
|
373
|
+
const courseUrl = this.courseForm.value.courseUrl?.trim();
|
|
374
|
+
// Check if at least one competency is added
|
|
375
|
+
const hasCompetencies = this.competenciesArray.length > 0;
|
|
376
|
+
return !!(courseName && platformName && courseUrl && hasCompetencies);
|
|
377
|
+
}
|
|
378
|
+
getCompetenciesByType(type) {
|
|
379
|
+
return (this.courseForm?.get('competencies')?.value || []).filter(c => c.type === type);
|
|
380
|
+
}
|
|
381
|
+
deleteCompetency(comp) {
|
|
382
|
+
const index = this.competenciesArray.controls.findIndex(control => control.value.theme === comp.theme && control.value.type === comp.type);
|
|
383
|
+
if (index !== -1) {
|
|
384
|
+
this.competenciesArray.removeAt(index);
|
|
385
|
+
}
|
|
386
|
+
this.updateCompetencyCounts();
|
|
387
|
+
this.cdRef.detectChanges(); // Trigger validation update
|
|
388
|
+
}
|
|
389
|
+
saveCourse() {
|
|
390
|
+
this.loading = true;
|
|
391
|
+
// Transform competencies to the required API format
|
|
392
|
+
const competencies = this.competenciesArray.value.map(comp => ({
|
|
393
|
+
"competencyAreaName": comp.type,
|
|
394
|
+
"competencyThemeName": comp.theme,
|
|
395
|
+
"competencySubThemeName": comp.sub_theme
|
|
396
|
+
}));
|
|
397
|
+
let reqBody = {
|
|
398
|
+
"role_mapping_id": this.planData.id,
|
|
399
|
+
"name": this.courseForm.value.courseName,
|
|
400
|
+
"platform": this.courseForm.value.platformName,
|
|
401
|
+
"public_link": this.courseForm.value.courseUrl,
|
|
402
|
+
"rationale": this.courseForm.value.summary,
|
|
403
|
+
"competencies": competencies
|
|
404
|
+
};
|
|
405
|
+
console.log('Request body:', reqBody);
|
|
406
|
+
// this.sharedService.addUserCourse(reqBody).subscribe(()=>{
|
|
407
|
+
// this.loading = false
|
|
408
|
+
// this.snackBar.open('Course Added Successfully', 'X', {
|
|
409
|
+
// duration: 3000,
|
|
410
|
+
// panelClass: ['snackbar-success']
|
|
411
|
+
// });
|
|
412
|
+
// })
|
|
413
|
+
this.sharedService.addUserCourse(reqBody).subscribe({
|
|
414
|
+
next: () => {
|
|
415
|
+
this.loading = false;
|
|
416
|
+
this.snackBar.open('Course Added Successfully', 'X', {
|
|
417
|
+
duration: 3000,
|
|
418
|
+
panelClass: ['snackbar-success']
|
|
419
|
+
});
|
|
420
|
+
},
|
|
421
|
+
error: (error) => {
|
|
422
|
+
this.loading = false;
|
|
423
|
+
this.snackBar.open(error?.error?.detail, 'X', {
|
|
424
|
+
duration: 3000,
|
|
425
|
+
panelClass: ['snackbar-error']
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
this.dialogRef.close('saved');
|
|
430
|
+
}
|
|
431
|
+
closeDialog() {
|
|
432
|
+
this.dialogRef.close();
|
|
433
|
+
}
|
|
434
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AddCourseComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.SharedService }, { token: i3.FormBuilder }, { token: i4.MatSnackBar }, { token: i5.HttpClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
435
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AddCourseComponent, selector: "app-add-course", ngImport: i0, template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Add Course</div>\n </div>\n <div class=\"cursor-pointer\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container\" [formGroup]=\"courseForm\">\n\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Course Name</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <input type=\"text\" placeholder=\"Enter Course Name\" formControlName=\"courseName\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\">\n </div>\n </div>\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Summary / Rationale:</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <textarea class=\"custom-textarea\" formControlName=\"summary\" rows=\"5\" placeholder=\"Enter Summary\"\n [value]=\"\"></textarea>\n </div>\n </div>\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Platform Name</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <input type=\"text\" placeholder=\"Enter Platform Name\" formControlName=\"platformName\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\">\n </div>\n </div>\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Course URL</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <input type=\"text\" placeholder=\"Enter Course Url\" formControlName=\"courseUrl\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\">\n </div>\n </div>\n\n\n\n\n\n <div class=\"mt-2 section\">\n <div class=\"competency-container mt-4\">\n <div class=\"outside-layer-total\">\n <div class=\"inside-layer\">\n Total Competencies\n </div>\n <div class=\"count\">\n {{competenciesCount?.total}}\n </div>\n </div>\n <div class=\"outside-layer-behavioral\">\n <div class=\"inside-layer\">\n Behavioral Competencies\n </div>\n <div class=\"count\">\n {{competenciesCount?.behavioral}}\n </div>\n </div>\n <div class=\"outside-layer-functional\">\n <div class=\"inside-layer\">\n Functional Competencies\n </div>\n <div class=\"count\">\n {{competenciesCount?.functional}}\n </div>\n </div>\n <div class=\"outside-layer-domain\">\n <div class=\"inside-layer\">\n Domain Competencies\n </div>\n <div class=\"count\">\n {{competenciesCount?.domain}}\n </div>\n </div>\n </div>\n <div class=\"sub-heading mt-4\">\n <p>Competency</p>\n </div>\n <div class=\"enhanced-competency-section mt-4\">\n <!-- Step 1: Select Competency Type -->\n <div class=\"competency-step\">\n <label class=\"step-label\">1. Select Core Competency Type</label>\n <div class=\"competency-dropdown-container\">\n <mat-form-field appearance=\"outline\" class=\"competency-dropdown\">\n <mat-select formControlName=\"competencyType\"\n placeholder=\"Select Competency Type\"\n [disabled]=\"isCompetencyPrefilled\"\n (selectionChange)=\"onCompetencyTypeChange($event.value)\">\n <mat-option value=\"Behavioral\">Behavioural</mat-option>\n <mat-option value=\"Functional\">Functional</mat-option>\n <mat-option value=\"Domain\">Domain</mat-option>\n </mat-select>\n </mat-form-field>\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Core competency type is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n </div>\n\n <!-- Step 2: Theme Selection (Behavioral/Functional from JSON, Domain manual) -->\n <div class=\"competency-step\" *ngIf=\"selectedCompetencyType\">\n <label class=\"step-label\">2. Select/Enter Theme</label>\n\n <!-- For Behavioral and Functional: Searchable Dropdown from JSON -->\n <div class=\"competency-dropdown-container\"\n *ngIf=\"selectedCompetencyType === 'Behavioral' || selectedCompetencyType === 'Functional'\">\n <mat-form-field appearance=\"outline\" class=\"competency-dropdown\">\n <mat-select formControlName=\"competencyTheme\"\n placeholder=\"Search and select theme\"\n [disabled]=\"isCompetencyPrefilled\"\n (selectionChange)=\"onThemeChange($event.value)\">\n <!-- Search input inside dropdown -->\n <mat-option class=\"search-option\" disabled>\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <input matInput\n placeholder=\"Search themes...\"\n formControlName=\"themeSearch\"\n (input)=\"filterThemes($event.target.value)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n <!-- Theme options -->\n <mat-option *ngFor=\"let theme of filteredThemes\" [value]=\"theme.name\">\n {{theme.name}}\n </mat-option>\n\n <!-- No results message -->\n <mat-option *ngIf=\"filteredThemes.length === 0 && themeSearchText\" disabled>\n No themes found matching \"{{themeSearchText}}\"\n </mat-option>\n </mat-select>\n </mat-form-field>\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Theme is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n\n <!-- For Domain: Manual input -->\n <div class=\"manual-input-container\" *ngIf=\"selectedCompetencyType === 'Domain'\">\n <input type=\"text\"\n formControlName=\"manualThemeInput\"\n placeholder=\"Enter Theme manually\"\n [disabled]=\"isCompetencyPrefilled\"\n class=\"manual-input\" />\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Theme is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n </div>\n\n <!-- Step 3: Sub-theme Selection -->\n <div class=\"competency-step\" *ngIf=\"selectedTheme || (selectedCompetencyType === 'Domain')\">\n <label class=\"step-label\">3. Select/Enter Sub-theme</label>\n\n <!-- For Behavioral and Functional: Searchable Dropdown based on selected theme -->\n <div class=\"competency-dropdown-container\"\n *ngIf=\"selectedCompetencyType === 'Behavioral' || selectedCompetencyType === 'Functional'\">\n <mat-form-field appearance=\"outline\" class=\"competency-dropdown\">\n <mat-select formControlName=\"competencySubTheme\"\n placeholder=\"Search and select sub-theme\"\n [disabled]=\"isCompetencyPrefilled\"\n (selectionChange)=\"onSubThemeChange($event.value)\">\n <!-- Search input inside dropdown -->\n <mat-option class=\"search-option\" disabled>\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <input matInput\n placeholder=\"Search sub-themes...\"\n formControlName=\"subThemeSearch\"\n (input)=\"filterSubThemes($event.target.value)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n <!-- Sub-theme options -->\n <mat-option *ngFor=\"let subTheme of filteredSubThemes\" [value]=\"subTheme\">\n {{subTheme}}\n </mat-option>\n\n <!-- No results message -->\n <mat-option *ngIf=\"filteredSubThemes.length === 0 && subThemeSearchText\" disabled>\n No sub-themes found matching \"{{subThemeSearchText}}\"\n </mat-option>\n </mat-select>\n </mat-form-field>\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Sub-theme is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n\n <!-- For Domain: Manual input -->\n <div class=\"manual-input-container\" *ngIf=\"selectedCompetencyType === 'Domain'\">\n <input type=\"text\"\n formControlName=\"manualSubThemeInput\"\n placeholder=\"Enter Sub-theme manually\"\n [disabled]=\"isCompetencyPrefilled\"\n class=\"manual-input\" />\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Sub-theme is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n </div>\n\n <!-- Add Button -->\n <div class=\"add-button-section\" *ngIf=\"selectedCompetencyType\">\n <button type=\"button\"\n class=\"add-competency-btn\"\n [disabled]=\"!canAddCompetency()\"\n [ngClass]=\"canAddCompetency() ? 'btn-active' : 'btn-disable'\"\n (click)=\"addCompetency()\">\n Add Competency\n </button>\n </div>\n </div>\n <div class=\"mt-4\">\n <div class=\"competency-sub-heading mt-2\" *ngIf=\"getCompetenciesByType('Behavioral')?.length\">\n Behavioral Competencies\n </div>\n\n <div class=\"competency-grid mt-2\">\n <div class=\"competency-item behavioural-pill\"\n *ngFor=\"let comp of getCompetenciesByType('Behavioral')\">\n <span class=\"competency-text-behavioral\">\n {{ comp.theme }} - {{ comp.sub_theme }}\n </span>\n <span class=\"cursor-pointer close\" (click)=\"deleteCompetency(comp)\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </div>\n <div class=\"mt-4\">\n <div class=\"competency-sub-heading mt-2\" *ngIf=\"getCompetenciesByType('Functional')?.length\">\n Functional Competencies</div>\n <div class=\"competency-grid mt-2\">\n <div class=\"competency-item functional-pill\"\n *ngFor=\"let comp of getCompetenciesByType('Functional')\">\n <span class=\"competency-text-functional\">\n {{ comp.theme }} - {{ comp.sub_theme }}\n </span>\n <span class=\"cursor-pointer close\" (click)=\"deleteCompetency(comp)\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </div>\n <div class=\"mt-4\">\n <div class=\"competency-sub-heading mt-2\" *ngIf=\"getCompetenciesByType('Domain')?.length\">Domain Competencies</div>\n <div class=\"competency-grid mt-2\">\n <div class=\"competency-item domain-pill\"\n *ngFor=\"let comp of getCompetenciesByType('Domain')\">\n <span class=\"competency-text-domain\">\n {{ comp.theme }} - {{ comp.sub_theme }}\n </span>\n <span class=\"cursor-pointer close\" (click)=\"deleteCompetency(comp)\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"popup-footer\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Cancel\" (click)=\"cancelForm()\" />\n </div>\n <div>\n <input [class]=\"canSaveCourse() ? 'btn-active' : 'btn-disable'\" \n type=\"button\" \n value=\"Save\" \n [disabled]=\"!canSaveCourse()\"\n (click)=\"canSaveCourse() && saveCourse()\" />\n </div>\n </div>\n</div>\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: ["@charset \"UTF-8\";.container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.search-filter-section{display:flex;flex-direction:row;gap:10px}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:10px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex;justify-content:flex-start;flex-direction:row;flex-wrap:wrap;gap:32px;width:100%;overflow-x:auto}@media (max-width: 768px){.competency-container{flex-direction:column;align-items:stretch;gap:12px}.outside-layer-total,.outside-layer-behavioral,.outside-layer-functional,.outside-layer-domain{width:100%;justify-content:space-between}}@media (max-width: 1024px) and (min-width: 769px){.competency-container{gap:6px}.outside-layer-total,.outside-layer-behavioral,.outside-layer-functional,.outside-layer-domain{padding:3px 8px;gap:12px}.inside-layer{font-size:16px}.count{font-size:20px}}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #1B4CA1;border-right:2px solid #1B4CA1;background:#edf1f8;margin:0;flex-shrink:0;width:20%}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #E24577;border-right:2px solid #E24577;background:#f8d2de;margin:0;flex-shrink:0;width:20%}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #7B47A4;border-right:2px solid #7B47A4;background:#dfd3e9;margin:0;flex-shrink:0;width:20%}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #F8B861;border-right:2px solid #F8B861;background:#fde8cc;margin:0;flex-shrink:0;width:20%}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:2px 8px;justify-content:center;align-items:center;gap:10px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:2px 8px;justify-content:center;align-items:center;gap:10px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:2px 8px;justify-content:center;align-items:center;gap:10px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:6px}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;padding:5px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.close .mat-icon{height:18px!important;width:18px!important}:host ::ng-deep .mat-select-arrow-wrapper{height:6px!important}::ng-deep .filter-section .mat-form-field-appearance-fill .mat-form-field-flex{padding:.5em .75em 0!important}.competency-grid{display:flex;flex-wrap:wrap;gap:12px}.competency-item{flex:0 0 calc(33.333% - 12px);box-sizing:border-box;background-color:#f5f5f5;padding:4px 10px;border-radius:6px;display:flex;justify-content:space-between;align-items:center}.snackbar-success{background-color:#4caf50!important;color:#fff!important;font-weight:500;font-size:14px;border-radius:4px}.enhanced-competency-section{display:flex;flex-direction:column;gap:24px;padding:24px;background:linear-gradient(135deg,#1b4ca105,#1b4ca10f);border-radius:12px;border:1px solid rgba(27,76,161,.15);box-shadow:0 2px 8px #1b4ca114}.competency-step{display:flex;flex-direction:column;gap:12px}.step-label{color:#1b4ca1;font-family:Lato;font-size:15px;font-weight:600;margin-bottom:8px;display:flex;align-items:center}.step-label:before{content:\"\";width:4px;height:16px;background:#1b4ca1;border-radius:2px;margin-right:8px}.competency-dropdown-container,.manual-input-container{width:100%;position:relative}.competency-dropdown{width:100%}.competency-dropdown ::ng-deep .mat-form-field-wrapper{padding:0;margin:0}.competency-dropdown ::ng-deep .mat-form-field-flex{padding:0 16px 0 20px;height:48px;align-items:center;transition:all .3s ease;display:flex;justify-content:space-between}.competency-dropdown ::ng-deep .mat-form-field-outline,.competency-dropdown ::ng-deep .mat-form-field-outline-start,.competency-dropdown ::ng-deep .mat-form-field-outline-gap,.competency-dropdown ::ng-deep .mat-form-field-outline-end{display:none}.competency-dropdown ::ng-deep .mat-form-field-infix{padding:0;border:none;height:48px;display:flex;align-items:center;flex:1;width:auto}.competency-dropdown ::ng-deep .mat-select{height:100%;display:flex;align-items:center;font-family:Lato;font-size:14px;color:#333;width:100%;flex:1}.competency-dropdown ::ng-deep .mat-select-value{display:flex;align-items:center;height:100%;color:#333;font-weight:400;flex:1;width:100%;justify-content:flex-start}.competency-dropdown ::ng-deep .mat-select-placeholder{color:#00000080;width:100%;display:flex;align-items:center}.competency-dropdown ::ng-deep .mat-select-value-text{width:100%;display:flex;align-items:center;font-weight:400}.competency-dropdown ::ng-deep .mat-select-arrow-wrapper{height:20px;display:flex;align-items:center;margin-left:8px;flex-shrink:0}.competency-dropdown ::ng-deep .mat-select-arrow-wrapper .mat-select-arrow{color:#1b4ca1;border-top-color:#1b4ca1;margin:0}.competency-dropdown ::ng-deep .mat-form-field-label{display:none}.competency-dropdown ::ng-deep .mat-focused .mat-form-field-flex{border-color:#1b4ca1;box-shadow:0 0 0 3px #1b4ca11a}.competency-dropdown ::ng-deep .mat-select-min-line{line-height:normal}.competency-dropdown ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{padding:0}.competency-dropdown ::ng-deep .mat-form-field-appearance-outline .mat-form-field-wrapper{margin:0;padding:0}.search-option{pointer-events:auto!important;opacity:1!important}.search-option ::ng-deep .mat-option-text{width:100%;padding:0}.search-field{width:100%;margin:0}.search-field ::ng-deep .mat-form-field-wrapper{padding:0;margin:0}.search-field ::ng-deep .mat-form-field-flex{height:36px;padding:0 12px;align-items:center}.search-field ::ng-deep .mat-form-field-infix{padding:0;border:none;height:36px;display:flex;align-items:center}.search-field ::ng-deep .mat-form-field-underline,.search-field ::ng-deep .mat-form-field-outline{display:none}.search-field ::ng-deep input{font-family:Lato;font-size:13px;color:#495057}.search-field ::ng-deep input::placeholder{color:#6c757d}::ng-deep .mat-select-panel{background:#fff;border-radius:12px;box-shadow:0 8px 32px #0000001f;border:1px solid #e0e0e0;max-height:320px;margin-top:4px}::ng-deep .mat-select-panel .mat-option{font-family:Lato;font-size:14px;padding:14px 16px;line-height:1.4;transition:all .2s ease;border-bottom:1px solid rgba(0,0,0,.05)}::ng-deep .mat-select-panel .mat-option:last-child{border-bottom:none}::ng-deep .mat-select-panel .mat-option:hover{background-color:#1b4ca10f;color:#1b4ca1}::ng-deep .mat-select-panel .mat-option.mat-selected{background-color:#1b4ca11a;color:#1b4ca1;font-weight:500;position:relative}::ng-deep .mat-select-panel .mat-option.mat-selected:after{content:\"\\2713\";position:absolute;right:16px;color:#1b4ca1;font-weight:700}::ng-deep .mat-select-panel .mat-option.search-option{padding:12px;background-color:#f8f9fa;border-bottom:2px solid #e9ecef;position:sticky;top:0;z-index:10}::ng-deep .mat-select-panel .mat-option.search-option:hover{background-color:#f8f9fa}.enhanced-competency-section ::ng-deep mat-select{border-radius:0!important;background-color:transparent!important}.enhanced-competency-section ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}.enhanced-competency-section ::ng-deep .mat-select-trigger{width:100%;display:flex;align-items:center;justify-content:space-between;min-height:auto}.enhanced-competency-section ::ng-deep .mat-form-field-suffix{margin:0;padding:0;display:flex;align-items:center}.manual-input{border-radius:25px;border:2px solid #e0e0e0;padding:12px 16px;width:100%;font-size:14px;font-family:Lato;background:#fff;height:48px;box-sizing:border-box;transition:all .3s ease;box-shadow:0 2px 4px #0000000d}.manual-input::placeholder{color:#00000080;font-family:Lato;font-size:14px}.manual-input:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 3px #1b4ca11a}.manual-input:hover{border-color:#1b4ca1;box-shadow:0 4px 8px #1b4ca11a}.add-button-section{display:flex;justify-content:flex-start;margin-top:20px;padding-top:20px;border-top:2px solid rgba(27,76,161,.1)}.add-competency-btn{border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;border:none;cursor:pointer;transition:all .3s ease;box-shadow:0 2px 8px #0000001a;min-width:140px}.add-competency-btn.btn-active{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff}.add-competency-btn.btn-active:hover{background:linear-gradient(135deg,#164080,#0f2f5f);box-shadow:0 4px 16px #1b4ca14d;transform:translateY(-1px)}.add-competency-btn.btn-active:active{transform:translateY(0);box-shadow:0 2px 8px #1b4ca133}.add-competency-btn.btn-disable{background:#e9ecef;color:#6c757d;border:1px solid #ccc;cursor:not-allowed;opacity:.7;box-shadow:none}.prefill-info{margin-top:8px;padding:8px 12px;background:#1b4ca10d;border:1px solid rgba(27,76,161,.2);border-radius:8px}.prefill-info .text-muted{color:#6c757d;font-family:Lato;font-size:12px;display:flex;align-items:center;gap:6px}.prefill-info .text-muted .info-icon{font-size:16px;color:#1b4ca1}.competency-dropdown[disabled] ::ng-deep .mat-form-field-flex{opacity:.7}.competency-dropdown[disabled] ::ng-deep .mat-select{color:#6c757d!important}.manual-input:disabled{background:#f8f9fa!important;border-color:#e9ecef!important;color:#6c757d!important;opacity:.7;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
436
|
+
}
|
|
437
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AddCourseComponent, decorators: [{
|
|
438
|
+
type: Component,
|
|
439
|
+
args: [{ selector: 'app-add-course', template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Add Course</div>\n </div>\n <div class=\"cursor-pointer\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container\" [formGroup]=\"courseForm\">\n\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Course Name</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <input type=\"text\" placeholder=\"Enter Course Name\" formControlName=\"courseName\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\">\n </div>\n </div>\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Summary / Rationale:</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <textarea class=\"custom-textarea\" formControlName=\"summary\" rows=\"5\" placeholder=\"Enter Summary\"\n [value]=\"\"></textarea>\n </div>\n </div>\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Platform Name</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <input type=\"text\" placeholder=\"Enter Platform Name\" formControlName=\"platformName\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\">\n </div>\n </div>\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Course URL</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <input type=\"text\" placeholder=\"Enter Course Url\" formControlName=\"courseUrl\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\">\n </div>\n </div>\n\n\n\n\n\n <div class=\"mt-2 section\">\n <div class=\"competency-container mt-4\">\n <div class=\"outside-layer-total\">\n <div class=\"inside-layer\">\n Total Competencies\n </div>\n <div class=\"count\">\n {{competenciesCount?.total}}\n </div>\n </div>\n <div class=\"outside-layer-behavioral\">\n <div class=\"inside-layer\">\n Behavioral Competencies\n </div>\n <div class=\"count\">\n {{competenciesCount?.behavioral}}\n </div>\n </div>\n <div class=\"outside-layer-functional\">\n <div class=\"inside-layer\">\n Functional Competencies\n </div>\n <div class=\"count\">\n {{competenciesCount?.functional}}\n </div>\n </div>\n <div class=\"outside-layer-domain\">\n <div class=\"inside-layer\">\n Domain Competencies\n </div>\n <div class=\"count\">\n {{competenciesCount?.domain}}\n </div>\n </div>\n </div>\n <div class=\"sub-heading mt-4\">\n <p>Competency</p>\n </div>\n <div class=\"enhanced-competency-section mt-4\">\n <!-- Step 1: Select Competency Type -->\n <div class=\"competency-step\">\n <label class=\"step-label\">1. Select Core Competency Type</label>\n <div class=\"competency-dropdown-container\">\n <mat-form-field appearance=\"outline\" class=\"competency-dropdown\">\n <mat-select formControlName=\"competencyType\"\n placeholder=\"Select Competency Type\"\n [disabled]=\"isCompetencyPrefilled\"\n (selectionChange)=\"onCompetencyTypeChange($event.value)\">\n <mat-option value=\"Behavioral\">Behavioural</mat-option>\n <mat-option value=\"Functional\">Functional</mat-option>\n <mat-option value=\"Domain\">Domain</mat-option>\n </mat-select>\n </mat-form-field>\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Core competency type is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n </div>\n\n <!-- Step 2: Theme Selection (Behavioral/Functional from JSON, Domain manual) -->\n <div class=\"competency-step\" *ngIf=\"selectedCompetencyType\">\n <label class=\"step-label\">2. Select/Enter Theme</label>\n\n <!-- For Behavioral and Functional: Searchable Dropdown from JSON -->\n <div class=\"competency-dropdown-container\"\n *ngIf=\"selectedCompetencyType === 'Behavioral' || selectedCompetencyType === 'Functional'\">\n <mat-form-field appearance=\"outline\" class=\"competency-dropdown\">\n <mat-select formControlName=\"competencyTheme\"\n placeholder=\"Search and select theme\"\n [disabled]=\"isCompetencyPrefilled\"\n (selectionChange)=\"onThemeChange($event.value)\">\n <!-- Search input inside dropdown -->\n <mat-option class=\"search-option\" disabled>\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <input matInput\n placeholder=\"Search themes...\"\n formControlName=\"themeSearch\"\n (input)=\"filterThemes($event.target.value)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n <!-- Theme options -->\n <mat-option *ngFor=\"let theme of filteredThemes\" [value]=\"theme.name\">\n {{theme.name}}\n </mat-option>\n\n <!-- No results message -->\n <mat-option *ngIf=\"filteredThemes.length === 0 && themeSearchText\" disabled>\n No themes found matching \"{{themeSearchText}}\"\n </mat-option>\n </mat-select>\n </mat-form-field>\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Theme is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n\n <!-- For Domain: Manual input -->\n <div class=\"manual-input-container\" *ngIf=\"selectedCompetencyType === 'Domain'\">\n <input type=\"text\"\n formControlName=\"manualThemeInput\"\n placeholder=\"Enter Theme manually\"\n [disabled]=\"isCompetencyPrefilled\"\n class=\"manual-input\" />\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Theme is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n </div>\n\n <!-- Step 3: Sub-theme Selection -->\n <div class=\"competency-step\" *ngIf=\"selectedTheme || (selectedCompetencyType === 'Domain')\">\n <label class=\"step-label\">3. Select/Enter Sub-theme</label>\n\n <!-- For Behavioral and Functional: Searchable Dropdown based on selected theme -->\n <div class=\"competency-dropdown-container\"\n *ngIf=\"selectedCompetencyType === 'Behavioral' || selectedCompetencyType === 'Functional'\">\n <mat-form-field appearance=\"outline\" class=\"competency-dropdown\">\n <mat-select formControlName=\"competencySubTheme\"\n placeholder=\"Search and select sub-theme\"\n [disabled]=\"isCompetencyPrefilled\"\n (selectionChange)=\"onSubThemeChange($event.value)\">\n <!-- Search input inside dropdown -->\n <mat-option class=\"search-option\" disabled>\n <mat-form-field appearance=\"outline\" class=\"search-field\">\n <input matInput\n placeholder=\"Search sub-themes...\"\n formControlName=\"subThemeSearch\"\n (input)=\"filterSubThemes($event.target.value)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </mat-form-field>\n </mat-option>\n\n <!-- Sub-theme options -->\n <mat-option *ngFor=\"let subTheme of filteredSubThemes\" [value]=\"subTheme\">\n {{subTheme}}\n </mat-option>\n\n <!-- No results message -->\n <mat-option *ngIf=\"filteredSubThemes.length === 0 && subThemeSearchText\" disabled>\n No sub-themes found matching \"{{subThemeSearchText}}\"\n </mat-option>\n </mat-select>\n </mat-form-field>\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Sub-theme is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n\n <!-- For Domain: Manual input -->\n <div class=\"manual-input-container\" *ngIf=\"selectedCompetencyType === 'Domain'\">\n <input type=\"text\"\n formControlName=\"manualSubThemeInput\"\n placeholder=\"Enter Sub-theme manually\"\n [disabled]=\"isCompetencyPrefilled\"\n class=\"manual-input\" />\n <div *ngIf=\"isCompetencyPrefilled\" class=\"prefill-info\">\n <small class=\"text-muted\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n Sub-theme is pre-selected based on gap analysis\n </small>\n </div>\n </div>\n </div>\n\n <!-- Add Button -->\n <div class=\"add-button-section\" *ngIf=\"selectedCompetencyType\">\n <button type=\"button\"\n class=\"add-competency-btn\"\n [disabled]=\"!canAddCompetency()\"\n [ngClass]=\"canAddCompetency() ? 'btn-active' : 'btn-disable'\"\n (click)=\"addCompetency()\">\n Add Competency\n </button>\n </div>\n </div>\n <div class=\"mt-4\">\n <div class=\"competency-sub-heading mt-2\" *ngIf=\"getCompetenciesByType('Behavioral')?.length\">\n Behavioral Competencies\n </div>\n\n <div class=\"competency-grid mt-2\">\n <div class=\"competency-item behavioural-pill\"\n *ngFor=\"let comp of getCompetenciesByType('Behavioral')\">\n <span class=\"competency-text-behavioral\">\n {{ comp.theme }} - {{ comp.sub_theme }}\n </span>\n <span class=\"cursor-pointer close\" (click)=\"deleteCompetency(comp)\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </div>\n <div class=\"mt-4\">\n <div class=\"competency-sub-heading mt-2\" *ngIf=\"getCompetenciesByType('Functional')?.length\">\n Functional Competencies</div>\n <div class=\"competency-grid mt-2\">\n <div class=\"competency-item functional-pill\"\n *ngFor=\"let comp of getCompetenciesByType('Functional')\">\n <span class=\"competency-text-functional\">\n {{ comp.theme }} - {{ comp.sub_theme }}\n </span>\n <span class=\"cursor-pointer close\" (click)=\"deleteCompetency(comp)\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </div>\n <div class=\"mt-4\">\n <div class=\"competency-sub-heading mt-2\" *ngIf=\"getCompetenciesByType('Domain')?.length\">Domain Competencies</div>\n <div class=\"competency-grid mt-2\">\n <div class=\"competency-item domain-pill\"\n *ngFor=\"let comp of getCompetenciesByType('Domain')\">\n <span class=\"competency-text-domain\">\n {{ comp.theme }} - {{ comp.sub_theme }}\n </span>\n <span class=\"cursor-pointer close\" (click)=\"deleteCompetency(comp)\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"popup-footer\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Cancel\" (click)=\"cancelForm()\" />\n </div>\n <div>\n <input [class]=\"canSaveCourse() ? 'btn-active' : 'btn-disable'\" \n type=\"button\" \n value=\"Save\" \n [disabled]=\"!canSaveCourse()\"\n (click)=\"canSaveCourse() && saveCourse()\" />\n </div>\n </div>\n</div>\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: ["@charset \"UTF-8\";.container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.search-filter-section{display:flex;flex-direction:row;gap:10px}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:10px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex;justify-content:flex-start;flex-direction:row;flex-wrap:wrap;gap:32px;width:100%;overflow-x:auto}@media (max-width: 768px){.competency-container{flex-direction:column;align-items:stretch;gap:12px}.outside-layer-total,.outside-layer-behavioral,.outside-layer-functional,.outside-layer-domain{width:100%;justify-content:space-between}}@media (max-width: 1024px) and (min-width: 769px){.competency-container{gap:6px}.outside-layer-total,.outside-layer-behavioral,.outside-layer-functional,.outside-layer-domain{padding:3px 8px;gap:12px}.inside-layer{font-size:16px}.count{font-size:20px}}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #1B4CA1;border-right:2px solid #1B4CA1;background:#edf1f8;margin:0;flex-shrink:0;width:20%}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #E24577;border-right:2px solid #E24577;background:#f8d2de;margin:0;flex-shrink:0;width:20%}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #7B47A4;border-right:2px solid #7B47A4;background:#dfd3e9;margin:0;flex-shrink:0;width:20%}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #F8B861;border-right:2px solid #F8B861;background:#fde8cc;margin:0;flex-shrink:0;width:20%}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:2px 8px;justify-content:center;align-items:center;gap:10px;border-radius:8px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:2px 8px;justify-content:center;align-items:center;gap:10px;border-radius:8px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:2px 8px;justify-content:center;align-items:center;gap:10px;border-radius:8px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:6px}.competency-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;padding:5px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.close .mat-icon{height:18px!important;width:18px!important}:host ::ng-deep .mat-select-arrow-wrapper{height:6px!important}::ng-deep .filter-section .mat-form-field-appearance-fill .mat-form-field-flex{padding:.5em .75em 0!important}.competency-grid{display:flex;flex-wrap:wrap;gap:12px}.competency-item{flex:0 0 calc(33.333% - 12px);box-sizing:border-box;background-color:#f5f5f5;padding:4px 10px;border-radius:6px;display:flex;justify-content:space-between;align-items:center}.snackbar-success{background-color:#4caf50!important;color:#fff!important;font-weight:500;font-size:14px;border-radius:4px}.enhanced-competency-section{display:flex;flex-direction:column;gap:24px;padding:24px;background:linear-gradient(135deg,#1b4ca105,#1b4ca10f);border-radius:12px;border:1px solid rgba(27,76,161,.15);box-shadow:0 2px 8px #1b4ca114}.competency-step{display:flex;flex-direction:column;gap:12px}.step-label{color:#1b4ca1;font-family:Lato;font-size:15px;font-weight:600;margin-bottom:8px;display:flex;align-items:center}.step-label:before{content:\"\";width:4px;height:16px;background:#1b4ca1;border-radius:2px;margin-right:8px}.competency-dropdown-container,.manual-input-container{width:100%;position:relative}.competency-dropdown{width:100%}.competency-dropdown ::ng-deep .mat-form-field-wrapper{padding:0;margin:0}.competency-dropdown ::ng-deep .mat-form-field-flex{padding:0 16px 0 20px;height:48px;align-items:center;transition:all .3s ease;display:flex;justify-content:space-between}.competency-dropdown ::ng-deep .mat-form-field-outline,.competency-dropdown ::ng-deep .mat-form-field-outline-start,.competency-dropdown ::ng-deep .mat-form-field-outline-gap,.competency-dropdown ::ng-deep .mat-form-field-outline-end{display:none}.competency-dropdown ::ng-deep .mat-form-field-infix{padding:0;border:none;height:48px;display:flex;align-items:center;flex:1;width:auto}.competency-dropdown ::ng-deep .mat-select{height:100%;display:flex;align-items:center;font-family:Lato;font-size:14px;color:#333;width:100%;flex:1}.competency-dropdown ::ng-deep .mat-select-value{display:flex;align-items:center;height:100%;color:#333;font-weight:400;flex:1;width:100%;justify-content:flex-start}.competency-dropdown ::ng-deep .mat-select-placeholder{color:#00000080;width:100%;display:flex;align-items:center}.competency-dropdown ::ng-deep .mat-select-value-text{width:100%;display:flex;align-items:center;font-weight:400}.competency-dropdown ::ng-deep .mat-select-arrow-wrapper{height:20px;display:flex;align-items:center;margin-left:8px;flex-shrink:0}.competency-dropdown ::ng-deep .mat-select-arrow-wrapper .mat-select-arrow{color:#1b4ca1;border-top-color:#1b4ca1;margin:0}.competency-dropdown ::ng-deep .mat-form-field-label{display:none}.competency-dropdown ::ng-deep .mat-focused .mat-form-field-flex{border-color:#1b4ca1;box-shadow:0 0 0 3px #1b4ca11a}.competency-dropdown ::ng-deep .mat-select-min-line{line-height:normal}.competency-dropdown ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{padding:0}.competency-dropdown ::ng-deep .mat-form-field-appearance-outline .mat-form-field-wrapper{margin:0;padding:0}.search-option{pointer-events:auto!important;opacity:1!important}.search-option ::ng-deep .mat-option-text{width:100%;padding:0}.search-field{width:100%;margin:0}.search-field ::ng-deep .mat-form-field-wrapper{padding:0;margin:0}.search-field ::ng-deep .mat-form-field-flex{height:36px;padding:0 12px;align-items:center}.search-field ::ng-deep .mat-form-field-infix{padding:0;border:none;height:36px;display:flex;align-items:center}.search-field ::ng-deep .mat-form-field-underline,.search-field ::ng-deep .mat-form-field-outline{display:none}.search-field ::ng-deep input{font-family:Lato;font-size:13px;color:#495057}.search-field ::ng-deep input::placeholder{color:#6c757d}::ng-deep .mat-select-panel{background:#fff;border-radius:12px;box-shadow:0 8px 32px #0000001f;border:1px solid #e0e0e0;max-height:320px;margin-top:4px}::ng-deep .mat-select-panel .mat-option{font-family:Lato;font-size:14px;padding:14px 16px;line-height:1.4;transition:all .2s ease;border-bottom:1px solid rgba(0,0,0,.05)}::ng-deep .mat-select-panel .mat-option:last-child{border-bottom:none}::ng-deep .mat-select-panel .mat-option:hover{background-color:#1b4ca10f;color:#1b4ca1}::ng-deep .mat-select-panel .mat-option.mat-selected{background-color:#1b4ca11a;color:#1b4ca1;font-weight:500;position:relative}::ng-deep .mat-select-panel .mat-option.mat-selected:after{content:\"\\2713\";position:absolute;right:16px;color:#1b4ca1;font-weight:700}::ng-deep .mat-select-panel .mat-option.search-option{padding:12px;background-color:#f8f9fa;border-bottom:2px solid #e9ecef;position:sticky;top:0;z-index:10}::ng-deep .mat-select-panel .mat-option.search-option:hover{background-color:#f8f9fa}.enhanced-competency-section ::ng-deep mat-select{border-radius:0!important;background-color:transparent!important}.enhanced-competency-section ::ng-deep mat-form-field .mat-form-field-underline{display:none!important}.enhanced-competency-section ::ng-deep .mat-select-trigger{width:100%;display:flex;align-items:center;justify-content:space-between;min-height:auto}.enhanced-competency-section ::ng-deep .mat-form-field-suffix{margin:0;padding:0;display:flex;align-items:center}.manual-input{border-radius:25px;border:2px solid #e0e0e0;padding:12px 16px;width:100%;font-size:14px;font-family:Lato;background:#fff;height:48px;box-sizing:border-box;transition:all .3s ease;box-shadow:0 2px 4px #0000000d}.manual-input::placeholder{color:#00000080;font-family:Lato;font-size:14px}.manual-input:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 3px #1b4ca11a}.manual-input:hover{border-color:#1b4ca1;box-shadow:0 4px 8px #1b4ca11a}.add-button-section{display:flex;justify-content:flex-start;margin-top:20px;padding-top:20px;border-top:2px solid rgba(27,76,161,.1)}.add-competency-btn{border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;border:none;cursor:pointer;transition:all .3s ease;box-shadow:0 2px 8px #0000001a;min-width:140px}.add-competency-btn.btn-active{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff}.add-competency-btn.btn-active:hover{background:linear-gradient(135deg,#164080,#0f2f5f);box-shadow:0 4px 16px #1b4ca14d;transform:translateY(-1px)}.add-competency-btn.btn-active:active{transform:translateY(0);box-shadow:0 2px 8px #1b4ca133}.add-competency-btn.btn-disable{background:#e9ecef;color:#6c757d;border:1px solid #ccc;cursor:not-allowed;opacity:.7;box-shadow:none}.prefill-info{margin-top:8px;padding:8px 12px;background:#1b4ca10d;border:1px solid rgba(27,76,161,.2);border-radius:8px}.prefill-info .text-muted{color:#6c757d;font-family:Lato;font-size:12px;display:flex;align-items:center;gap:6px}.prefill-info .text-muted .info-icon{font-size:16px;color:#1b4ca1}.competency-dropdown[disabled] ::ng-deep .mat-form-field-flex{opacity:.7}.competency-dropdown[disabled] ::ng-deep .mat-select{color:#6c757d!important}.manual-input:disabled{background:#f8f9fa!important;border-color:#e9ecef!important;color:#6c757d!important;opacity:.7;cursor:not-allowed}\n"] }]
|
|
440
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
441
|
+
type: Inject,
|
|
442
|
+
args: [MAT_DIALOG_DATA]
|
|
443
|
+
}] }, { type: i2.SharedService }, { type: i3.FormBuilder }, { type: i4.MatSnackBar }, { type: i5.HttpClient }, { type: i0.ChangeDetectorRef }]; } });
|
|
444
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWNvdXJzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy9hZGQtY291cnNlL2FkZC1jb3Vyc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvYWRkLWNvdXJzZS9hZGQtY291cnNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUM3RSxPQUFPLEVBQTBCLFVBQVUsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQy9FLE9BQU8sRUFBZ0IsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBVXpFLE1BQU0sT0FBTyxrQkFBa0I7SUF5QjdCLFlBQW1CLFNBQTJDLEVBQzVCLElBQVMsRUFDbEMsYUFBNEIsRUFDM0IsRUFBZSxFQUNoQixRQUFxQixFQUNwQixJQUFnQixFQUNoQixLQUF3QjtRQU5mLGNBQVMsR0FBVCxTQUFTLENBQWtDO1FBQzVCLFNBQUksR0FBSixJQUFJLENBQUs7UUFDbEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDM0IsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQ3BCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUE3QmxDLFlBQU8sR0FBRyxLQUFLLENBQUE7UUFHZiwyQ0FBMkM7UUFDM0MscUJBQWdCLEdBQVUsRUFBRSxDQUFDO1FBQzdCLG9CQUFlLEdBQVUsRUFBRSxDQUFDO1FBQzVCLHVCQUFrQixHQUFVLEVBQUUsQ0FBQztRQUMvQixtQkFBYyxHQUFVLEVBQUUsQ0FB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QUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2dCQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7b0JBQzVDLFFBQVEsRUFBRSxJQUFJO29CQUNkLFVBQVUsRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lCQUMvQixDQUFDLENBQUM7WUFDTCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3hCLENBQUM7K0dBdGVVLGtCQUFrQiw4Q0EwQm5CLGVBQWU7bUdBMUJkLGtCQUFrQixzRENaL0Isc3ZnQkFvVE07OzRGRHhTTyxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZ0JBQWdCOzswQkE4QnZCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBDaGFuZ2VEZXRlY3RvclJlZiwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkZC1jb3Vyc2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLWNvdXJzZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FkZC1jb3Vyc2UuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBZGRDb3Vyc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb3Vyc2VGb3JtOiBGb3JtR3JvdXA7XG4gIGxvYWRpbmcgPSBmYWxzZVxuICBwbGFuRGF0YTphbnlcbiAgXG4gIC8vIEVuaGFuY2VkIGNvbXBldGVuY3kgc2VsZWN0aW9uIHByb3BlcnRpZXNcbiAgY29tcGV0ZW5jaWVzRGF0YTogYW55W10gPSBbXTtcbiAgYXZhaWxhYmxlVGhlbWVzOiBhbnlbXSA9IFtdO1xuICBhdmFpbGFibGVTdWJUaGVtZXM6IGFueVtdID0gW107XG4gIGZpbHRlcmVkVGhlbWVzOiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJlZFN1YlRoZW1lczogc3RyaW5nW10gPSBbXTtcbiAgc2VsZWN0ZWRDb21wZXRlbmN5VHlwZSA9ICcnO1xuICBzZWxlY3RlZFRoZW1lID0gJyc7XG4gIHNlbGVjdGVkU3ViVGhlbWUgPSAnJztcbiAgbWFudWFsVGhlbWUgPSAnJztcbiAgbWFudWFsU3ViVGhlbWUgPSAnJztcbiAgdGhlbWVTZWFyY2hUZXh0ID0gJyc7XG4gIHN1YlRoZW1lU2VhcmNoVGV4dCA9ICcnO1xuICBjb21wZXRlbmNpZXNDb3VudCA9IHt0b3RhbDowLCBiZWhhdmlvcmFsOjAsIGZ1bmN0aW9uYWw6MCwgZG9tYWluOjB9O1xuICBcbiAgLy8gUHJlZmlsbCBwcm9wZXJ0aWVzXG4gIGlzQ29tcGV0ZW5jeVByZWZpbGxlZCA9IGZhbHNlO1xuICBwcmVmaWxsZWRDb21wZXRlbmN5VHlwZSA9ICcnO1xuICBwcmVmaWxsZWRUaGVtZSA9ICcnO1xuICBwcmVmaWxsZWRTdWJUaGVtZSA9ICcnO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QWRkQ291cnNlQ29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSxcbiAgICBwdWJsaWMgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwdWJsaWMgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgdGhpcy5wbGFuRGF0YSA9IGRhdGFcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcbiAgfVxuICBcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2FkQ29tcGV0ZW5jaWVzRGF0YSgpO1xuICAgIHRoaXMudXBkYXRlQ29tcGV0ZW5jeUNvdW50cygpO1xuICAgIHRoaXMuY2hlY2tGb3JQcmVmaWxsZWREYXRhKCk7XG4gIH1cbiAgXG4gIGNoZWNrRm9yUHJlZmlsbGVkRGF0YSgpIHtcbiAgICBjb25zb2xlLmxvZygnPT09IENoZWNrRm9yUHJlZmlsbGVkRGF0YSA9PT0nKTtcbiAgICBjb25zb2xlLmxvZygnRnVsbCBkYXRhIG9iamVjdDonLCB0aGlzLmRhdGEpO1xuICAgIFxuICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLnByZWZpbGxDb21wZXRlbmN5KSB7XG4gICAgICBjb25zb2xlLmxvZygn4pyFIFByZWZpbGwgY29tcGV0ZW5jeSBkYXRhIGZvdW5kOicsIHRoaXMuZGF0YS5wcmVmaWxsQ29tcGV0ZW5jeSk7XG4gICAgICBcbiAgICAgIHRoaXMuaXNDb21wZXRlbmN5UHJlZmlsbGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucHJlZmlsbGVkQ29tcGV0ZW5jeVR5cGUgPSB0aGlzLmRhdGEucHJlZmlsbENvbXBldGVuY3kudHlwZTtcbiAgICAgIHRoaXMucHJlZmlsbGVkVGhlbWUgPSB0aGlzLmRhdGEucHJlZmlsbENvbXBldGVuY3kudGhlbWU7XG4gICAgICB0aGlzLnByZWZpbGxlZFN1YlRoZW1lID0gdGhpcy5kYXRhLnByZWZpbGxDb21wZXRlbmN5LnN1YlRoZW1lIHx8ICcnO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnUHJvY2Vzc2VkIHByZWZpbGwgZGF0YTonLCB7XG4gICAgICAgIGlzQ29tcGV0ZW5jeVByZWZpbGxlZDogdGhpcy5pc0NvbXBldGVuY3lQcmVmaWxsZWQsXG4gICAgICAgIHByZWZpbGxlZENvbXBldGVuY3lUeXBlOiB0aGlzLnByZWZpbGxlZENvbXBldGVuY3lUeXBlLFxuICAgICAgICBwcmVmaWxsZWRUaGVtZTogdGhpcy5wcmVmaWxsZWRUaGVtZSxcbiAgICAgICAgcHJlZmlsbGVkU3ViVGhlbWU6IHRoaXMucHJlZmlsbGVkU3ViVGhlbWVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBTZXQgdGhlIGNvbXBldGVuY3kgdHlwZSBhbmQgdHJpZ2dlciB0aGUgdGhlbWUgbG9hZGluZ1xuICAgICAgdGhpcy5zZWxlY3RlZENvbXBldGVuY3lUeXBlID0gdGhpcy5wcmVmaWxsZWRDb21wZXRlbmN5VHlwZTtcbiAgICAgIHRoaXMuY291cnNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgY29tcGV0ZW5jeVR5cGU6IHRoaXMucHJlZmlsbGVkQ29tcGV0ZW5jeVR5cGVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnRm9ybSB1cGRhdGVkIHdpdGggY29tcGV0ZW5jeSB0eXBlOicsIHRoaXMucHJlZmlsbGVkQ29tcGV0ZW5jeVR5cGUpO1xuICAgICAgXG4gICAgICAvLyBGb3IgRG9tYWluIGNvbXBldGVuY2llcywgc2V0IG1hbnVhbCB0aGVtZSBhbmQgc3VidGhlbWUgaW5wdXRzIGFuZCBhdXRvLWFkZFxuICAgICAgaWYgKHRoaXMucHJlZmlsbGVkQ29tcGV0ZW5jeVR5cGUgPT09ICdEb21haW4nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIERvbWFpbiBtYW51YWwgaW5wdXRzLi4uJyk7XG4gICAgICAgIHRoaXMuY291cnNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBtYW51YWxUaGVtZUlucHV0OiB0aGlzLnByZWZpbGxlZFRoZW1lLFxuICAgICAgICAgIG1hbnVhbFN1YlRoZW1lSW5wdXQ6IHRoaXMucHJlZmlsbGVkU3ViVGhlbWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdEb21haW4gZm9ybSB2YWx1ZXMgc2V0OicsIHtcbiAgICAgICAgICBtYW51YWxUaGVtZUlucHV0OiB0aGlzLnByZWZpbGxlZFRoZW1lLFxuICAgICAgICAgIG1hbnVhbFN1YlRoZW1lSW5wdXQ6IHRoaXMucHJlZmlsbGVkU3ViVGhlbWVcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBBdXRvLWFkZCB0aGUgZG9tYWluIGNvbXBldGVuY3lcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0FkZGluZyBwcmVmaWxsZWQgRG9tYWluIGNvbXBldGVuY3kuLi4nKTtcbiAgICAgICAgICB0aGlzLmFkZFByZWZpbGxlZENvbXBldGVuY3koKTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdXaWxsIGhhbmRsZSBCZWhhdmlvcmFsL0Z1bmN0aW9uYWwgYWZ0ZXIgY29tcGV0ZW5jaWVzIGRhdGEgbG9hZHMuLi4nKTtcbiAgICAgICAgLy8gRm9yIEJlaGF2aW9yYWwvRnVuY3Rpb25hbCwgd2FpdCBmb3IgY29tcGV0ZW5jaWVzIGRhdGEgdG8gbG9hZFxuICAgICAgICAvLyBUaGUgdGhlbWUgYW5kIHN1YnRoZW1lIHdpbGwgYmUgc2V0IGluIGxvYWRDb21wZXRlbmNpZXNEYXRhIGFmdGVyIGRhdGEgaXMgYXZhaWxhYmxlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCfinYwgTm8gcHJlZmlsbCBjb21wZXRlbmN5IGRhdGEgZm91bmQnKTtcbiAgICAgIGNvbnNvbGUubG9nKCdkYXRhLnByZWZpbGxDb21wZXRlbmN5OicsIHRoaXMuZGF0YT8ucHJlZmlsbENvbXBldGVuY3kpO1xuICAgIH1cbiAgfVxuICBcbiAgbG9hZENvbXBldGVuY2llc0RhdGEoKSB7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENvbXBldGVuY3lKc29uKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcGV0ZW5jaWVzRGF0YSA9IGRhdGE7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDb21wZXRlbmNpZXMgZGF0YSBsb2FkZWQ6JywgdGhpcy5jb21wZXRlbmNpZXNEYXRhKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEhhbmRsZSBwcmVmaWxsZWQgZGF0YSBhZnRlciBjb21wZXRlbmNpZXMgYXJlIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5pc0NvbXBldGVuY3lQcmVmaWxsZWQgJiYgdGhpcy5wcmVmaWxsZWRDb21wZXRlbmN5VHlwZSAhPT0gJ0RvbWFpbicpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVByZWZpbGxlZEJlaGF2aW9yYWxGdW5jdGlvbmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgY29tcGV0ZW5jaWVzIGRhdGE6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICBoYW5kbGVQcmVmaWxsZWRCZWhhdmlvcmFsRnVuY3Rpb25hbCgpIHtcbiAgICBjb25zb2xlLmxvZygnPT09IEhhbmRsZVByZWZpbGxlZEJlaGF2aW9yYWxGdW5jdGlvbmFsID09PScpO1xuICAgIGNvbnNvbGUubG9nKCdQcmVmaWxsZWQgY29tcGV0ZW5jeSB0eXBlOicsIHRoaXMucHJlZmlsbGVkQ29tcGV0ZW5jeVR5cGUpO1xuICAgIGNvbnNvbGUubG9nKCdQcmVmaWxsZWQgdGhlbWU6JywgdGhpcy5wcmVmaWxsZWRUaGVtZSk7XG4gICAgY29uc29sZS5sb2coJ1ByZWZpbGxlZCBzdWJUaGVtZTonLCB0aGlzLnByZWZpbGxlZFN1YlRoZW1lKTtcbiAgICBcbiAgICAvLyBMb2FkIHRoZW1lcyBmb3IgdGhlIHByZWZpbGxlZCBjb21wZXRlbmN5IHR5cGVcbiAgICB0aGlzLm9uQ29tcGV0ZW5jeVR5cGVDaGFuZ2UodGhpcy5wcmVmaWxsZWRDb21wZXRlbmN5VHlwZSk7XG4gICAgXG4gICAgLy8gRmluZCBhbmQgc2V0IHRoZSB0aGVtZSBpZiBpdCBleGlzdHMgaW4gdGhlIGRhdGFcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdBdmFpbGFibGUgdGhlbWVzOicsIHRoaXMuYXZhaWxhYmxlVGhlbWVzKTtcbiAgICAgIFxuICAgICAgY29uc3QgbWF0Y2hpbmdUaGVtZSA9IHRoaXMuYXZhaWxhYmxlVGhlbWVzLmZpbmQodGhlbWUgPT4gXG4gICAgICAgIHRoZW1lLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5wcmVmaWxsZWRUaGVtZS50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZygnTWF0Y2hpbmcgdGhlbWUgZm91bmQ6JywgbWF0Y2hpbmdUaGVtZSk7XG4gICAgICBcbiAgICAgIGlmIChtYXRjaGluZ1RoZW1lKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtZSA9IG1hdGNoaW5nVGhlbWUubmFtZTtcbiAgICAgICAgdGhpcy5jb3Vyc2VGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIGNvbXBldGVuY3lUaGVtZTogbWF0Y2hpbmdUaGVtZS5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uVGhlbWVDaGFuZ2UobWF0Y2hpbmdUaGVtZS5uYW1lKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKCdUaGVtZSBzZXQgc3VjY2Vzc2Z1bGx5OicsIG1hdGNoaW5nVGhlbWUubmFtZSk7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiBzdWJUaGVtZSBpcyBwcm92aWRlZCwgdHJ5IHRvIHNldCBpdCBhZnRlciB0aGVtZXMgYXJlIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wcmVmaWxsZWRTdWJUaGVtZSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0F2YWlsYWJsZSBzdWJUaGVtZXM6JywgdGhpcy5hdmFpbGFibGVTdWJUaGVtZXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBtYXRjaGluZ1N1YlRoZW1lID0gdGhpcy5hdmFpbGFibGVTdWJUaGVtZXMuZmluZChzdWJUaGVtZSA9PiBcbiAgICAgICAgICAgICAgc3ViVGhlbWUudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5wcmVmaWxsZWRTdWJUaGVtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTWF0Y2hpbmcgc3ViVGhlbWUgZm91bmQ6JywgbWF0Y2hpbmdTdWJUaGVtZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChtYXRjaGluZ1N1YlRoZW1lKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdWJUaGVtZSA9IG1hdGNoaW5nU3ViVGhlbWU7XG4gICAgICAgICAgICAgIHRoaXMuY291cnNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICBjb21wZXRlbmN5U3ViVGhlbWU6IG1hdGNoaW5nU3ViVGhlbWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdWJUaGVtZSBzZXQgc3VjY2Vzc2Z1bGx5OicsIG1hdGNoaW5nU3ViVGhlbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+KaoO+4jyBTdWJUaGVtZSBub3QgZm91bmQgaW4gYXZhaWxhYmxlIG9wdGlvbnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIHRoZSBwcmVmaWxsZWQgY29tcGV0ZW5jeSB3aXRoIHRoZSBzcGVjaWZpZWQgdGhlbWUgYW5kIHN1Yi10aGVtZVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZGRpbmcgcHJlZmlsbGVkIGNvbXBldGVuY3kgd2l0aCB0aGVtZSBhbmQgc3VidGhlbWUuLi4nKTtcbiAgICAgICAgICAgICAgdGhpcy5hZGRQcmVmaWxsZWRDb21wZXRlbmN5KCk7XG4gICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXV0b21hdGljYWxseSBhZGQgdGhlIHByZWZpbGxlZCBjb21wZXRlbmN5IHdpdGgganVzdCB0aGUgdGhlbWVcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBZGRpbmcgcHJlZmlsbGVkIGNvbXBldGVuY3kgd2l0aCB0aGVtZSBvbmx5Li4uJyk7XG4gICAgICAgICAgICB0aGlzLmFkZFByZWZpbGxlZENvbXBldGVuY3koKTtcbiAgICAgICAgICB9LCAyMDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygn4pqg77iPIFRoZW1lIG5vdCBmb3VuZCBpbiBhdmFpbGFibGUgb3B0aW9ucycpO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cbiAgXG4gIGFkZFByZWZpbGxlZENvbXBldGVuY3koKSB7XG4gICAgLy8gRm9yIHByZWZpbGxlZCBjb21wZXRlbmNpZXMsIHVzZSB0aGUgdGhlbWUgbmFtZSBhcyB0aGUgc3ViLXRoZW1lXG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBjb21wZXRlbmN5IGdhcCBpcyBhZGRyZXNzZWRcbiAgICBjb25zdCBleGlzdHMgPSB0aGlzLmNvbXBldGVuY2llc0FycmF5LnZhbHVlLnNvbWUoYyA9PiBcbiAgICAgIGMudGhlbWUgPT09IHRoaXMucHJlZmlsbGVkVGhlbWUgJiYgYy50eXBlID09PSB0aGlzLnByZWZpbGxlZENvbXBldGVuY3lUeXBlXG4gICAgKTtcbiAgICBcbiAgICBpZiAoIWV4aXN0cykge1xuICAgICAgY29uc3QgbmV3Q29tcCA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICB0eXBlOiBbdGhpcy5wcmVmaWxsZWRDb21wZXRlbmN5VHlwZV0sXG4gICAgICAgIHRoZW1lOiBbdGhpcy5wcmVmaWxsZWRUaGVtZV0sXG4gICAgICAgIHN1Yl90aGVtZTogW3RoaXMucHJlZmlsbGVkVGhlbWVdIC8vIFVzZSB0aGVtZSBhcyBzdWJfdGhlbWUgZm9yIGdhcCBmaWxsaW5nXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29tcGV0ZW5jaWVzQXJyYXkucHVzaChuZXdDb21wKTtcbiAgICAgIHRoaXMudXBkYXRlQ29tcGV0ZW5jeUNvdW50cygpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICBcbiAgICAgIGNvbnNvbGUubG9nKCdBdXRvLWFkZGVkIHByZWZpbGxlZCBjb21wZXRlbmN5OicsIHtcbiAgICAgICAgdHlwZTogdGhpcy5wcmVmaWxsZWRDb21wZXRlbmN5VHlwZSxcbiAgICAgICAgdGhlbWU6IHRoaXMucHJlZmlsbGVkVGhlbWUsXG4gICAgICAgIHN1Yl90aGVtZTogdGhpcy5wcmVmaWxsZWRUaGVtZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICBpbml0aWFsaXplRm9ybSgpIHtcbiAgICB0aGlzLmNvdXJzZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNvdXJzZU5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBzdW1tYXJ5OiBbJyddLFxuICAgICAgcGxhdGZvcm1OYW1lOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgY291cnNlVXJsOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgY29tcGV0ZW5jeVR5cGU6IFsnJ10sXG4gICAgICBjb21wZXRlbmN5VGhlbWU6IFsnJ10sXG4gICAgICBjb21wZXRlbmN5U3ViVGhlbWU6IFsnJ10sXG4gICAgICBtYW51YWxUaGVtZUlucHV0OiBbJyddLFxuICAgICAgbWFudWFsU3ViVGhlbWVJbnB1dDogWycnXSxcbiAgICAgIHRoZW1lU2VhcmNoOiBbJyddLFxuICAgICAgc3ViVGhlbWVTZWFyY2g6IFsnJ10sXG4gICAgICBjb21wZXRlbmNpZXM6IHRoaXMuZmIuYXJyYXkoW10pXG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gdG8gZm9ybSBjaGFuZ2VzIHRvIHRyaWdnZXIgdmFsaWRhdGlvbiB1cGRhdGVzXG4gICAgdGhpcy5jb3Vyc2VGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cbiAgY2FuY2VsRm9ybSgpIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpXG4gIH1cblxuICBnZXQgY29tcGV0ZW5jaWVzQXJyYXkoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5jb3Vyc2VGb3JtLmdldCgnY29tcGV0ZW5jaWVzJykgYXMgRm9ybUFycmF5O1xuICB9XG4gIFxuICB1cGRhdGVDb21wZXRlbmN5Q291bnRzKCkge1xuICAgIGNvbnN0IGNvbXBzID0gdGhpcy5jb21wZXRlbmNpZXNBcnJheS52YWx1ZTtcbiAgICB0aGlzLmNvbXBldGVuY2llc0NvdW50ID0ge3RvdGFsOiAwLCBiZWhhdmlvcmFsOiAwLCBmdW5jdGlvbmFsOiAwLCBkb21haW46IDB9O1xuICAgIGNvbXBzLmZvckVhY2goYyA9PiB7XG4gICAgICB0aGlzLmNvbXBldGVuY2llc0NvdW50LnRvdGFsKys7XG4gICAgICBpZiAoYy50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdiZWhhdmlvcmFsJykgdGhpcy5jb21wZXRlbmNpZXNDb3VudC5iZWhhdmlvcmFsKys7XG4gICAgICBpZiAoYy50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdmdW5jdGlvbmFsJykgdGhpcy5jb21wZXRlbmNpZXNDb3VudC5mdW5jdGlvbmFsKys7XG4gICAgICBpZiAoYy50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdkb21haW4nKSB0aGlzLmNvbXBldGVuY2llc0NvdW50LmRvbWFpbisrO1xuICAgIH0pO1xuICB9XG4gIFxuICBvbkNvbXBldGVuY3lUeXBlQ2hhbmdlKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wZXRlbmN5VHlwZSA9IHR5cGU7XG4gICAgdGhpcy5zZWxlY3RlZFRoZW1lID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZFN1YlRoZW1lID0gJyc7XG4gICAgdGhpcy5tYW51YWxUaGVtZSA9ICcnO1xuICAgIHRoaXMubWFudWFsU3ViVGhlbWUgPSAnJztcbiAgICB0aGlzLmF2YWlsYWJsZVRoZW1lcyA9IFtdO1xuICAgIHRoaXMuYXZhaWxhYmxlU3ViVGhlbWVzID0gW107XG4gICAgdGhpcy5maWx0ZXJlZFRoZW1lcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyZWRTdWJUaGVtZXMgPSBbXTtcbiAgICB0aGlzLnRoZW1lU2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMuc3ViVGhlbWVTZWFyY2hUZXh0ID0gJyc7XG4gICAgXG4gICAgLy8gUmVzZXQgZm9ybSBjb250cm9sc1xuICAgIHRoaXMuY291cnNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGNvbXBldGVuY3lUaGVtZTogJycsXG4gICAgICBjb21wZXRlbmN5U3ViVGhlbWU6ICcnLFxuICAgICAgbWFudWFsVGhlbWVJbnB1dDogJycsXG4gICAgICBtYW51YWxTdWJUaGVtZUlucHV0OiAnJyxcbiAgICAgIHRoZW1lU2VhcmNoOiAnJyxcbiAgICAgIHN1YlRoZW1lU2VhcmNoOiAnJ1xuICAgIH0pO1xuICAgIFxuICAgIGlmICh0eXBlID09PSAnQmVoYXZpb3JhbCcgfHwgdHlwZSA9PT0gJ0Z1bmN0aW9uYWwnKSB7XG4gICAgICAvLyBMb2FkIHRoZW1lcyBmcm9tIEpTT04gZm9yIEJlaGF2aW9yYWwgYW5kIEZ1bmN0aW9uYWxcbiAgICAgIGNvbnN0IGNvbXBldGVuY3lDYXRlZ29yeSA9IHRoaXMuY29tcGV0ZW5jaWVzRGF0YS5maW5kKGNhdCA9PiBcbiAgICAgICAgY2F0Lm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdHlwZS50b0xvd2VyQ2FzZSgpIHx8IFxuICAgICAgICAodHlwZSA9PT0gJ0JlaGF2aW9yYWwnICYmIGNhdC5uYW1lID09PSAnQmVoYXZpb3VyYWwnKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgaWYgKGNvbXBldGVuY3lDYXRlZ29yeSkge1xuICAgICAgICB0aGlzLmF2YWlsYWJsZVRoZW1lcyA9IGNvbXBldGVuY3lDYXRlZ29yeS5jb21wZXRlbmN5X3RoZW1lIHx8IFtdO1xuICAgICAgICB0aGlzLmZpbHRlcmVkVGhlbWVzID0gWy4uLnRoaXMuYXZhaWxhYmxlVGhlbWVzXTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRm9yIERvbWFpbiwgbm8gdGhlbWVzIGFyZSBsb2FkZWQgLSB1c2VyIHdpbGwgZW50ZXIgbWFudWFsbHlcbiAgfVxuICBcbiAgb25UaGVtZUNoYW5nZSh0aGVtZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZSA9IHRoZW1lTmFtZTtcbiAgICB0aGlzLnNlbGVjdGVkU3ViVGhlbWUgPSAnJztcbiAgICB0aGlzLmF2YWlsYWJsZVN1YlRoZW1lcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyZWRTdWJUaGVtZXMgPSBbXTtcbiAgICB0aGlzLnN1YlRoZW1lU2VhcmNoVGV4dCA9ICcnO1xuICAgIFxuICAgIHRoaXMuY291cnNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGNvbXBldGVuY3lTdWJUaGVtZTogJycsXG4gICAgICBzdWJUaGVtZVNlYXJjaDogJydcbiAgICB9KTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBzZWxlY3RlZCB0aGVtZSBhbmQgbG9hZCBpdHMgc3ViLXRoZW1lc1xuICAgIGNvbnN0IHNlbGVjdGVkVGhlbWVPYmogPSB0aGlzLmF2YWlsYWJsZVRoZW1lcy5maW5kKHRoZW1lID0+IHRoZW1lLm5hbWUgPT09IHRoZW1lTmFtZSk7XG4gICAgaWYgKHNlbGVjdGVkVGhlbWVPYmopIHtcbiAgICAgIHRoaXMuYXZhaWxhYmxlU3ViVGhlbWVzID0gc2VsZWN0ZWRUaGVtZU9iai5jb21wZXRlbmN5X3N1Yl90aGVtZSB8fCBbXTtcbiAgICAgIHRoaXMuZmlsdGVyZWRTdWJUaGVtZXMgPSBbLi4udGhpcy5hdmFpbGFibGVTdWJUaGVtZXNdO1xuICAgIH1cbiAgfVxuICBcbiAgb25TdWJUaGVtZUNoYW5nZShzdWJUaGVtZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRTdWJUaGVtZSA9IHN1YlRoZW1lTmFtZTtcbiAgfVxuICBcbiAgZmlsdGVyVGhlbWVzKHNlYXJjaFRleHQ6IHN0cmluZykge1xuICAgIHRoaXMudGhlbWVTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICBpZiAoIXNlYXJjaFRleHQudHJpbSgpKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkVGhlbWVzID0gWy4uLnRoaXMuYXZhaWxhYmxlVGhlbWVzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZFRoZW1lcyA9IHRoaXMuYXZhaWxhYmxlVGhlbWVzLmZpbHRlcih0aGVtZSA9PiBcbiAgICAgICAgdGhlbWUubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIFxuICBmaWx0ZXJTdWJUaGVtZXMoc2VhcmNoVGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zdWJUaGVtZVNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgIGlmICghc2VhcmNoVGV4dC50cmltKCkpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRTdWJUaGVtZXMgPSBbLi4udGhpcy5hdmFpbGFibGVTdWJUaGVtZXNdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlcmVkU3ViVGhlbWVzID0gdGhpcy5hdmFpbGFibGVTdWJUaGVtZXMuZmlsdGVyKHN1YlRoZW1lID0+IFxuICAgICAgICBzdWJUaGVtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIFxuICBhZGRDb21wZXRlbmN5KCkge1xuICAgIGxldCB0eXBlID0gdGhpcy5zZWxlY3RlZENvbXBldGVuY3lUeXBlO1xuICAgIGxldCB0aGVtZSA9ICcnO1xuICAgIGxldCBzdWJUaGVtZSA9ICcnO1xuICAgIFxuICAgIGlmICh0eXBlID09PSAnRG9tYWluJykge1xuICAgICAgLy8gRm9yIERvbWFpbiwgdXNlIG1hbnVhbCBpbnB1dFxuICAgICAgdGhlbWUgPSB0aGlzLmNvdXJzZUZvcm0udmFsdWUubWFudWFsVGhlbWVJbnB1dD8udHJpbSgpO1xuICAgICAgc3ViVGhlbWUgPSB0aGlzLmNvdXJzZUZvcm0udmFsdWUubWFudWFsU3ViVGhlbWVJbnB1dD8udHJpbSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgQmVoYXZpb3JhbC9GdW5jdGlvbmFsLCB1c2UgZHJvcGRvd24gc2VsZWN0aW9uc1xuICAgICAgdGhlbWUgPSB0aGlzLnNlbGVjdGVkVGhlbWU7XG4gICAgICBzdWJUaGVtZSA9IHRoaXMuc2VsZWN0ZWRTdWJUaGVtZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHR5cGUgJiYgdGhlbWUgJiYgc3ViVGhlbWUpIHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuY29tcGV0ZW5jaWVzQXJyYXkudmFsdWUuc29tZShjID0+IFxuICAgICAgICBjLnRoZW1lID09PSB0aGVtZSAmJiBjLnN1Yl90aGVtZSA9PT0gc3ViVGhlbWUgJiYgYy50eXBlID09PSB0eXBlXG4gICAgICApO1xuICAgICAgXG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICBjb25zdCBuZXdDb21wID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgdHlwZTogW3R5cGVdLFxuICAgICAgICAgIHRoZW1lOiBbdGhlbWVdLFxuICAgICAgICAgIHN1Yl90aGVtZTogW3N1YlRoZW1lXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21wZXRlbmNpZXNBcnJheS5wdXNoKG5ld0NvbXApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBpbnB1dCBmaWVsZHMgYWZ0ZXIgYWRkaW5nXG4gICAgICB0aGlzLnJlc2V0Q29tcGV0ZW5jeUZvcm0oKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgY3VycmVudFZhbHVlcyA9IHRoaXMuY29tcGV0ZW5jaWVzQXJyYXkudmFsdWU7XG4gICAgdGhpcy5jb3Vyc2VGb3JtLnBhdGNoVmFsdWUoeyBjb21wZXRlbmNpZXM6IFsuLi5jdXJyZW50VmFsdWVzXSB9KTtcbiAgICBcbiAgICB0aGlzLnVwZGF0ZUNvbXBldGVuY3lDb3VudHMoKTtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTsgLy8gVHJpZ2dlciB2YWxpZGF0aW9uIHVwZGF0ZVxuICAgIGNvbnNvbGUubG9nKHRoaXMuY291cnNlRm9ybT8uZ2V0KCdjb21wZXRlbmNpZXMnKT8udmFsdWUpO1xuICB9XG4gIFxuICByZXNldENvbXBldGVuY3lGb3JtKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wZXRlbmN5VHlwZSA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRUaGVtZSA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRTdWJUaGVtZSA9ICcnO1xuICAgIHRoaXMubWFudWFsVGhlbWUgPSAnJztcbiAgICB0aGlzLm1hbnVhbFN1YlRoZW1lID0gJyc7XG4gICAgdGhpcy5hdmFpbGFibGVUaGVtZXMgPSBbXTtcbiAgICB0aGlzLmF2YWlsYWJsZVN1YlRoZW1lcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyZWRUaGVtZXMgPSBbXTtcbiAgICB0aGlzLmZpbHRlcmVkU3ViVGhlbWVzID0gW107XG4gICAgdGhpcy50aGVtZVNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLnN1YlRoZW1lU2VhcmNoVGV4dCA9ICcnO1xuICAgIFxuICAgIHRoaXMuY291cnNlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGNvbXBldGVuY3lUeXBlOiAnJyxcbiAgICAgIGNvbXBldGVuY3lUaGVtZTogJycsXG4gICAgICBjb21wZXRlbmN5U3ViVGhlbWU6ICcnLFxuICAgICAgbWFudWFsVGhlbWVJbnB1dDogJycsXG4gICAgICBtYW51YWxTdWJUaGVtZUlucHV0OiAnJyxcbiAgICAgIHRoZW1lU2VhcmNoOiAnJyxcbiAgICAgIHN1YlRoZW1lU2VhcmNoOiAnJ1xuICAgIH0pO1xuICB9XG4gIFxuICBjYW5BZGRDb21wZXRlbmN5KCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbXBldGVuY3lUeXBlKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wZXRlbmN5VHlwZSA9PT0gJ0RvbWFpbicpIHtcbiAgICAgIGNvbnN0IHRoZW1lID0gdGhpcy5jb3Vyc2VGb3JtLnZhbHVlLm1hbnVhbFRoZW1lSW5wdXQ/LnRyaW0oKTtcbiAgICAgIGNvbnN0IHN1YlRoZW1lID0gdGhpcy5jb3Vyc2VGb3JtLnZhbHVlLm1hbnVhbFN1YlRoZW1lSW5wdXQ/LnRyaW0oKTtcbiAgICAgIHJldHVybiAhISh0aGVtZSAmJiBzdWJUaGVtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAhISh0aGlzLnNlbGVjdGVkVGhlbWUgJiYgdGhpcy5zZWxlY3RlZFN1YlRoZW1lKTtcbiAgICB9XG4gIH1cblxuICBjYW5TYXZlQ291cnNlKCk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHJlcXVpcmVkIGZpZWxkcyBhcmUgZmlsbGVkXG4gICAgY29uc3QgY291cnNlTmFtZSA9IHRoaXMuY291cnNlRm9ybS52YWx1ZS5jb3Vyc2VOYW1lPy50cmltKCk7XG4gICAgY29uc3QgcGxhdGZvcm1OYW1lID0gdGhpcy5jb3Vyc2VGb3JtLnZhbHVlLnBsYXRmb3JtTmFtZT8udHJpbSgpO1xuICAgIGNvbnN0IGNvdXJzZVVybCA9IHRoaXMuY291cnNlRm9ybS52YWx1ZS5jb3Vyc2VVcmw/LnRyaW0oKTtcbiAgICBcbiAgICAvLyBDaGVjayBpZiBhdCBsZWFzdCBvbmUgY29tcGV0ZW5jeSBpcyBhZGRlZFxuICAgIGNvbnN0IGhhc0NvbXBldGVuY2llcyA9IHRoaXMuY29tcGV0ZW5jaWVzQXJyYXkubGVuZ3RoID4gMDtcbiAgICBcbiAgICByZXR1cm4gISEoY291cnNlTmFtZSAmJiBwbGF0Zm9ybU5hbWUgJiYgY291cnNlVXJsICYmIGhhc0NvbXBldGVuY2llcyk7XG4gIH1cbiAgXG4gIGdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgcmV0dXJuICh0aGlzLmNvdXJzZUZvcm0/LmdldCgnY29tcGV0ZW5jaWVzJyk/LnZhbHVlIHx8IFtdKS5maWx0ZXIoYyA9PiBjLnR5cGUgPT09IHR5cGUpO1xuICB9XG4gIFxuICBkZWxldGVDb21wZXRlbmN5KGNvbXApIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuY29tcGV0ZW5jaWVzQXJyYXkuY29udHJvbHMuZmluZEluZGV4KFxuICAgICAgY29udHJvbCA9PiBjb250cm9sLnZhbHVlLnRoZW1lID09PSBjb21wLnRoZW1lICYmIGNvbnRyb2wudmFsdWUudHlwZSA9PT0gY29tcC50eXBlXG4gICAgKTtcbiAgXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5jb21wZXRlbmNpZXNBcnJheS5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ29tcGV0ZW5jeUNvdW50cygpO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpOyAvLyBUcmlnZ2VyIHZhbGlkYXRpb24gdXBkYXRlXG4gIH1cbiAgXG4gIHNhdmVDb3Vyc2UoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIFxuICAgIC8vIFRyYW5zZm9ybSBjb21wZXRlbmNpZXMgdG8gdGhlIHJlcXVpcmVkIEFQSSBmb3JtYXRcbiAgICBjb25zdCBjb21wZXRlbmNpZXMgPSB0aGlzLmNvbXBldGVuY2llc0FycmF5LnZhbHVlLm1hcChjb21wID0+ICh7XG4gICAgICBcImNvbXBldGVuY3lBcmVhTmFtZVwiOiBjb21wLnR5cGUsXG4gICAgICBcImNvbXBldGVuY3lUaGVtZU5hbWVcIjogY29tcC50aGVtZSxcbiAgICAgIFwiY29tcGV0ZW5jeVN1YlRoZW1lTmFtZVwiOiBjb21wLnN1Yl90aGVtZVxuICAgIH0pKTtcbiAgICBcbiAgICBsZXQgcmVxQm9keSA9IHtcbiAgICAgIFwicm9sZV9tYXBwaW5nX2lkXCI6IHRoaXMucGxhbkRhdGEuaWQsXG4gICAgICBcIm5hbWVcIjogdGhpcy5jb3Vyc2VGb3JtLnZhbHVlLmNvdXJzZU5hbWUsXG4gICAgICBcInBsYXRmb3JtXCI6IHRoaXMuY291cnNlRm9ybS52YWx1ZS5wbGF0Zm9ybU5hbWUsXG4gICAgICBcInB1YmxpY19saW5rXCI6IHRoaXMuY291cnNlRm9ybS52YWx1ZS5jb3Vyc2VVcmwsXG4gICAgICBcInJhdGlvbmFsZVwiOiB0aGlzLmNvdXJzZUZvcm0udmFsdWUuc3VtbWFyeSxcbiAgICAgIFwiY29tcGV0ZW5jaWVzXCI6IGNvbXBldGVuY2llc1xuICAgIH1cbiAgICBcbiAgICBjb25zb2xlLmxvZygnUmVxdWVzdCBib2R5OicsIHJlcUJvZHkpO1xuICAgIFxuICAgIC8vIHRoaXMuc2hhcmVkU2VydmljZS5hZGRVc2VyQ291cnNlKHJlcUJvZHkpLnN1YnNjcmliZSgoKT0+e1xuICAgIC8vICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAvLyAgIHRoaXMuc25hY2tCYXIub3BlbignQ291cnNlIEFkZGVkIFN1Y2Nlc3NmdWxseScsICdYJywge1xuICAgIC8vICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAvLyAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1zdWNjZXNzJ11cbiAgICAvLyAgIH0pO1xuICAgIC8vIH0pXG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuYWRkVXNlckNvdXJzZShyZXFCb2R5KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NvdXJzZSBBZGRlZCBTdWNjZXNzZnVsbHknLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdzYXZlZCcpXG4gIH1cblxuICBjbG9zZURpYWxvZygpIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWV3LWNicC1wbGFuXCI+XG4gICAgPGRpdiBjbGFzcz1cInBvcHVwLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nXCI+QWRkIENvdXJzZTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiY2xvc2VEaWFsb2coKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGFpbmVyXCIgW2Zvcm1Hcm91cF09XCJjb3Vyc2VGb3JtXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgPHA+Q291cnNlIE5hbWU8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IGFkZGl0aW9uYWwtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgQ291cnNlIE5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3Vyc2VOYW1lXCIgW3ZhbHVlXT1cIlwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweDsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgcGFkZGluZzogOHB4IDEycHg7IHdpZHRoOiAxMDAlO2ZvbnQtc2l6ZTogMTRweDtmb250LWZhbWlseTogJ0xhdG8nO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBzZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8cD5TdW1tYXJ5IC8gUmF0aW9uYWxlOjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgYWRkaXRpb25hbC1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiY3VzdG9tLXRleHRhcmVhXCIgZm9ybUNvbnRyb2xOYW1lPVwic3VtbWFyeVwiIHJvd3M9XCI1XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBTdW1tYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIlwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIHNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgIDxwPlBsYXRmb3JtIE5hbWU8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00IGFkZGl0aW9uYWwtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGxhdGZvcm0gTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInBsYXRmb3JtTmFtZVwiIFt2YWx1ZV09XCJcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJvcmRlcjogMXB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDhweCAxMnB4OyB3aWR0aDogMTAwJTtmb250LXNpemU6IDE0cHg7Zm9udC1mYW1pbHk6ICdMYXRvJztcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgPHA+Q291cnNlIFVSTDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTQgYWRkaXRpb25hbC1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb3Vyc2UgVXJsXCIgZm9ybUNvbnRyb2xOYW1lPVwiY291cnNlVXJsXCIgW3ZhbHVlXT1cIlwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweDsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgcGFkZGluZzogOHB4IDEycHg7IHdpZHRoOiAxMDAlO2ZvbnQtc2l6ZTogMTRweDtmb250LWZhbWlseTogJ0xhdG8nO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG5cblxuXG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktY29udGFpbmVyIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0c2lkZS1sYXllci10b3RhbFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zaWRlLWxheWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBUb3RhbCBDb21wZXRlbmNpZXNcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wZXRlbmNpZXNDb3VudD8udG90YWx9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0c2lkZS1sYXllci1iZWhhdmlvcmFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNpZGUtbGF5ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEJlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGV0ZW5jaWVzQ291bnQ/LmJlaGF2aW9yYWx9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0c2lkZS1sYXllci1mdW5jdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNpZGUtbGF5ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29tcGV0ZW5jaWVzQ291bnQ/LmZ1bmN0aW9uYWx9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3V0c2lkZS1sYXllci1kb21haW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluc2lkZS1sYXllclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgRG9tYWluIENvbXBldGVuY2llc1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBldGVuY2llc0NvdW50Py5kb21haW59fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8cD5Db21wZXRlbmN5PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW5oYW5jZWQtY29tcGV0ZW5jeS1zZWN0aW9uIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8IS0tIFN0ZXAgMTogU2VsZWN0IENvbXBldGVuY3kgVHlwZSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdGVwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN0ZXAtbGFiZWxcIj4xLiBTZWxlY3QgQ29yZSBDb21wZXRlbmN5IFR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1kcm9wZG93bi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiY29tcGV0ZW5jeS1kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImNvbXBldGVuY3lUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IENvbXBldGVuY3kgVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNDb21wZXRlbmN5UHJlZmlsbGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25Db21wZXRlbmN5VHlwZUNoYW5nZSgkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQmVoYXZpb3JhbFwiPkJlaGF2aW91cmFsPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkZ1bmN0aW9uYWxcIj5GdW5jdGlvbmFsPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkRvbWFpblwiPkRvbWFpbjwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ29tcGV0ZW5jeVByZWZpbGxlZFwiIGNsYXNzPVwicHJlZmlsbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb25cIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZSBjb21wZXRlbmN5IHR5cGUgaXMgcHJlLXNlbGVjdGVkIGJhc2VkIG9uIGdhcCBhbmFseXNpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFN0ZXAgMjogVGhlbWUgU2VsZWN0aW9uIChCZWhhdmlvcmFsL0Z1bmN0aW9uYWwgZnJvbSBKU09OLCBEb21haW4gbWFudWFsKSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdGVwXCIgKm5nSWY9XCJzZWxlY3RlZENvbXBldGVuY3lUeXBlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN0ZXAtbGFiZWxcIj4yLiBTZWxlY3QvRW50ZXIgVGhlbWU8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRm9yIEJlaGF2aW9yYWwgYW5kIEZ1bmN0aW9uYWw6IFNlYXJjaGFibGUgRHJvcGRvd24gZnJvbSBKU09OIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1kcm9wZG93bi1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRDb21wZXRlbmN5VHlwZSA9PT0gJ0JlaGF2aW9yYWwnIHx8IHNlbGVjdGVkQ29tcGV0ZW5jeVR5cGUgPT09ICdGdW5jdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJjb21wZXRlbmN5LWRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFuZCBzZWxlY3QgdGhlbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQ29tcGV0ZW5jeVByZWZpbGxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVGhlbWVDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNlYXJjaCBpbnB1dCBpbnNpZGUgZHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIGNsYXNzPVwic2VhcmNoLW9wdGlvblwiIGRpc2FibGVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJzZWFyY2gtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggdGhlbWVzLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGhlbWVTZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQpPVwiZmlsdGVyVGhlbWVzKCRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlbWUgb3B0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHRoZW1lIG9mIGZpbHRlcmVkVGhlbWVzXCIgW3ZhbHVlXT1cInRoZW1lLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGhlbWUubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vIHJlc3VsdHMgbWVzc2FnZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJmaWx0ZXJlZFRoZW1lcy5sZW5ndGggPT09IDAgJiYgdGhlbWVTZWFyY2hUZXh0XCIgZGlzYWJsZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyB0aGVtZXMgZm91bmQgbWF0Y2hpbmcgXCJ7e3RoZW1lU2VhcmNoVGV4dH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb21wZXRlbmN5UHJlZmlsbGVkXCIgY2xhc3M9XCJwcmVmaWxsLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImluZm8taWNvblwiPmluZm88L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVtZSBpcyBwcmUtc2VsZWN0ZWQgYmFzZWQgb24gZ2FwIGFuYWx5c2lzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIEZvciBEb21haW46IE1hbnVhbCBpbnB1dCAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hbnVhbC1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cInNlbGVjdGVkQ29tcGV0ZW5jeVR5cGUgPT09ICdEb21haW4nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1hbnVhbFRoZW1lSW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgVGhlbWUgbWFudWFsbHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NvbXBldGVuY3lQcmVmaWxsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWFudWFsLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbXBldGVuY3lQcmVmaWxsZWRcIiBjbGFzcz1cInByZWZpbGwtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lIGlzIHByZS1zZWxlY3RlZCBiYXNlZCBvbiBnYXAgYW5hbHlzaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBTdGVwIDM6IFN1Yi10aGVtZSBTZWxlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktc3RlcFwiICpuZ0lmPVwic2VsZWN0ZWRUaGVtZSB8fCAoc2VsZWN0ZWRDb21wZXRlbmN5VHlwZSA9PT0gJ0RvbWFpbicpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN0ZXAtbGFiZWxcIj4zLiBTZWxlY3QvRW50ZXIgU3ViLXRoZW1lPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIEZvciBCZWhhdmlvcmFsIGFuZCBGdW5jdGlvbmFsOiBTZWFyY2hhYmxlIERyb3Bkb3duIGJhc2VkIG9uIHNlbGVjdGVkIHRoZW1lIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1kcm9wZG93bi1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRDb21wZXRlbmN5VHlwZSA9PT0gJ0JlaGF2aW9yYWwnIHx8IHNlbGVjdGVkQ29tcGV0ZW5jeVR5cGUgPT09ICdGdW5jdGlvbmFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJjb21wZXRlbmN5LWRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGV0ZW5jeVN1YlRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFuZCBzZWxlY3Qgc3ViLXRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NvbXBldGVuY3lQcmVmaWxsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblN1YlRoZW1lQ2hhbmdlKCRldmVudC52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggaW5wdXQgaW5zaWRlIGRyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBjbGFzcz1cInNlYXJjaC1vcHRpb25cIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwic2VhcmNoLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHN1Yi10aGVtZXMuLi5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdWJUaGVtZVNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJTdWJUaGVtZXMoJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTdWItdGhlbWUgb3B0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHN1YlRoZW1lIG9mIGZpbHRlcmVkU3ViVGhlbWVzXCIgW3ZhbHVlXT1cInN1YlRoZW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3N1YlRoZW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gcmVzdWx0cyBtZXNzYWdlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImZpbHRlcmVkU3ViVGhlbWVzLmxlbmd0aCA9PT0gMCAmJiBzdWJUaGVtZVNlYXJjaFRleHRcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIHN1Yi10aGVtZXMgZm91bmQgbWF0Y2hpbmcgXCJ7e3N1YlRoZW1lU2VhcmNoVGV4dH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb21wZXRlbmN5UHJlZmlsbGVkXCIgY2xhc3M9XCJwcmVmaWxsLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImluZm8taWNvblwiPmluZm88L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWItdGhlbWUgaXMgcHJlLXNlbGVjdGVkIGJhc2VkIG9uIGdhcCBhbmFseXNpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3IgRG9tYWluOiBNYW51YWwgaW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYW51YWwtaW5wdXQtY29udGFpbmVyXCIgKm5nSWY9XCJzZWxlY3RlZENvbXBldGVuY3lUeXBlID09PSAnRG9tYWluJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtYW51YWxTdWJUaGVtZUlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIFN1Yi10aGVtZSBtYW51YWxseVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzQ29tcGV0ZW5jeVByZWZpbGxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYW51YWwtaW5wdXRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQ29tcGV0ZW5jeVByZWZpbGxlZFwiIGNsYXNzPVwicHJlZmlsbC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpbmZvLWljb25cIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViLXRoZW1lIGlzIHByZS1zZWxlY3RlZCBiYXNlZCBvbiBnYXAgYW5hbHlzaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBBZGQgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtYnV0dG9uLXNlY3Rpb25cIiAqbmdJZj1cInNlbGVjdGVkQ29tcGV0ZW5jeVR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFkZC1jb21wZXRlbmN5LWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5BZGRDb21wZXRlbmN5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNhbkFkZENvbXBldGVuY3koKSA/ICdidG4tYWN0aXZlJyA6ICdidG4tZGlzYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRDb21wZXRlbmN5KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBDb21wZXRlbmN5XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nIG10LTJcIiAqbmdJZj1cImdldENvbXBldGVuY2llc0J5VHlwZSgnQmVoYXZpb3JhbCcpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3JhbCBDb21wZXRlbmNpZXNcbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWdyaWQgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1pdGVtIGJlaGF2aW91cmFsLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdCZWhhdmlvcmFsJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0LWJlaGF2aW9yYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb21wLnRoZW1lIH19IC0ge3sgY29tcC5zdWJfdGhlbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgY2xvc2VcIiAoY2xpY2spPVwiZGVsZXRlQ29tcGV0ZW5jeShjb21wKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nIG10LTJcIiAqbmdJZj1cImdldENvbXBldGVuY2llc0J5VHlwZSgnRnVuY3Rpb25hbCcpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25hbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktZ3JpZCBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1pdGVtIGZ1bmN0aW9uYWwtcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdGdW5jdGlvbmFsJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dC1mdW5jdGlvbmFsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbXAudGhlbWUgfX0gLSB7eyBjb21wLnN1Yl90aGVtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGNsb3NlXCIgKGNsaWNrKT1cImRlbGV0ZUNvbXBldGVuY3koY29tcClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktc3ViLWhlYWRpbmcgbXQtMlwiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdEb21haW4nKT8ubGVuZ3RoXCI+RG9tYWluIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWdyaWQgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1pdGVtIGRvbWFpbi1waWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldENvbXBldGVuY2llc0J5VHlwZSgnRG9tYWluJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0LWRvbWFpblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbXAudGhlbWUgfX0gLSB7eyBjb21wLnN1Yl90aGVtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBjbG9zZVwiIChjbGljayk9XCJkZWxldGVDb21wZXRlbmN5KGNvbXApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBvcHVwLWZvb3RlclwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkNhbmNlbFwiIChjbGljayk9XCJjYW5jZWxGb3JtKClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxpbnB1dCBbY2xhc3NdPVwiY2FuU2F2ZUNvdXJzZSgpID8gJ2J0bi1hY3RpdmUnIDogJ2J0bi1kaXNhYmxlJ1wiIFxuICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIlNhdmVcIiBcbiAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhblNhdmVDb3Vyc2UoKVwiXG4gICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNhblNhdmVDb3Vyc2UoKSAmJiBzYXZlQ291cnNlKClcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJsb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuPC9kaXY+Il19
|