@sunbird-cb/toc 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +3 -3
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +3 -3
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +345 -49
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +2 -8
- package/esm2022/lib/_services/widget-content.model.mjs +2 -1
- package/esm2022/lib/_services/widget-content.service.mjs +6 -1
- package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +62 -32
- package/esm2022/lib/services/app-toc-v2.service.mjs +193 -20
- package/esm2022/lib/services/app-toc.service.mjs +292 -18
- package/esm2022/public-api.mjs +15 -1
- package/fesm2022/sunbird-cb-toc.mjs +899 -127
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +45 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +1 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +0 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts.map +1 -1
- package/lib/_services/widget-content.model.d.ts +1 -0
- package/lib/_services/widget-content.model.d.ts.map +1 -1
- package/lib/_services/widget-content.service.d.ts +1 -0
- package/lib/_services/widget-content.service.d.ts.map +1 -1
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +11 -0
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +1 -1
- package/lib/services/app-toc-v2.service.d.ts +8 -1
- package/lib/services/app-toc-v2.service.d.ts.map +1 -1
- package/lib/services/app-toc.service.d.ts +32 -1
- package/lib/services/app-toc.service.d.ts.map +1 -1
- package/package.json +3 -3
- package/public-api.d.ts +12 -0
- package/public-api.d.ts.map +1 -1
|
@@ -1,41 +1,214 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "./app-toc.service";
|
|
3
4
|
export class AppTocV2Service {
|
|
4
|
-
constructor() {
|
|
5
|
+
constructor(tocSvc) {
|
|
6
|
+
this.tocSvc = tocSvc;
|
|
7
|
+
}
|
|
5
8
|
constructHeirarchyData(contentReadData) {
|
|
6
9
|
let contentHeirarchy = { ...contentReadData };
|
|
10
|
+
let leafNodes = [];
|
|
11
|
+
if (contentHeirarchy['preliminaryAssessmentDetail'] && Object.keys(contentHeirarchy['preliminaryAssessmentDetail']).length > 0) {
|
|
12
|
+
contentHeirarchy['children'] = [];
|
|
13
|
+
// Set parent reference for preliminary assessment (pre-assessment)
|
|
14
|
+
contentHeirarchy['preliminaryAssessmentDetail'].parent = contentHeirarchy.identifier;
|
|
15
|
+
// Mark this as the pre-assessment for milestone locking logic
|
|
16
|
+
contentHeirarchy['preliminaryAssessmentDetail'].isPreAssessment = true;
|
|
17
|
+
contentHeirarchy['children'].push(contentHeirarchy['preliminaryAssessmentDetail']);
|
|
18
|
+
leafNodes.push(contentReadData?.preliminaryAssessment || contentReadData?.preliminaryAssessmentDetail?.identifier);
|
|
19
|
+
}
|
|
20
|
+
// Track milestone index for proper locking logic
|
|
21
|
+
// All milestones are locked by default - unlocking is computed based on progress
|
|
22
|
+
let milestoneIndex = 0;
|
|
7
23
|
contentHeirarchy['milestones_v1'].forEach((milestone) => {
|
|
24
|
+
// All milestones are locked by default
|
|
25
|
+
// M1 unlocks when pre-assessment is completed
|
|
26
|
+
// M2+ unlock when previous milestone's mandatory content + assessment are completed
|
|
27
|
+
const shouldBeLocked = true;
|
|
8
28
|
let mileStoneData = {
|
|
9
29
|
"identifier": milestone.id,
|
|
10
30
|
"description": milestone.description,
|
|
11
31
|
"mimeType": "application/vnd.ekstep.content-collection",
|
|
12
32
|
"duration": "3600",
|
|
13
|
-
"primaryCategory": "
|
|
14
|
-
"courseCategory": "
|
|
33
|
+
"primaryCategory": "Milestone",
|
|
34
|
+
"courseCategory": "Milestone",
|
|
15
35
|
"createdBy": "25311a4f-fa42-4cf7-882a-5e79198edfcb",
|
|
16
36
|
"name": milestone.name,
|
|
17
37
|
"contentType": "Course",
|
|
18
|
-
"isLocked":
|
|
19
|
-
"
|
|
38
|
+
"isLocked": shouldBeLocked,
|
|
39
|
+
"milestoneIndex": milestoneIndex,
|
|
40
|
+
"status": "Live",
|
|
41
|
+
"leafNodes": [],
|
|
42
|
+
// Pre-computed flags for performance optimization
|
|
43
|
+
"isMilestone": true,
|
|
44
|
+
"isCollection": true,
|
|
45
|
+
"isModule": false,
|
|
46
|
+
"isResource": false,
|
|
47
|
+
"isLearningPathway": false,
|
|
48
|
+
"parent": contentHeirarchy.identifier
|
|
20
49
|
};
|
|
21
50
|
mileStoneData['children'] = [];
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
51
|
+
if (milestone?.courses && milestone?.courses?.length) {
|
|
52
|
+
milestone.courses.forEach((mileStoneCourse) => {
|
|
53
|
+
// Set parent reference for courses inside milestone
|
|
54
|
+
mileStoneCourse.parent = milestone.id;
|
|
55
|
+
if (mileStoneCourse && mileStoneCourse?.leafNodes && mileStoneCourse?.leafNodes?.length) {
|
|
56
|
+
leafNodes = [...leafNodes, ...mileStoneCourse.leafNodes];
|
|
57
|
+
mileStoneData['leafNodes'] = [...mileStoneData?.leafNodes, ...mileStoneCourse.leafNodes];
|
|
58
|
+
}
|
|
59
|
+
this.tocSvc.checkModuleWiseData(mileStoneCourse);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (milestone?.assessmentDetail) {
|
|
63
|
+
// Set parent reference for assessment inside milestone
|
|
64
|
+
milestone.assessmentDetail.parent = milestone.id;
|
|
65
|
+
leafNodes.push(milestone?.assessmentDetail?.identifier);
|
|
66
|
+
mileStoneData['leafNodes'] = [...mileStoneData?.leafNodes, milestone?.assessmentDetail?.identifier];
|
|
67
|
+
mileStoneData['children'].push(milestone?.assessmentDetail);
|
|
68
|
+
}
|
|
69
|
+
mileStoneData['children'] = [...milestone['courses'], ...mileStoneData['children']];
|
|
70
|
+
mileStoneData['leafNodesCount'] = mileStoneData['leafNodes'].length;
|
|
34
71
|
contentHeirarchy['children'] = contentHeirarchy['children'] ? [...contentHeirarchy['children'], mileStoneData] : [mileStoneData];
|
|
72
|
+
milestoneIndex++;
|
|
35
73
|
});
|
|
74
|
+
contentHeirarchy['leafNodes'] = [...leafNodes];
|
|
36
75
|
return contentHeirarchy;
|
|
37
76
|
}
|
|
38
|
-
|
|
77
|
+
mapContentHierarchyProgressUpdate(contentHeirarchyData, enrollmentListData) {
|
|
78
|
+
if (contentHeirarchyData && contentHeirarchyData.children) {
|
|
79
|
+
let totalLeafNodes = 0;
|
|
80
|
+
let totalCompletedLeafNodes = 0;
|
|
81
|
+
contentHeirarchyData.children.forEach((child) => {
|
|
82
|
+
if (child.primaryCategory === 'Milestone') {
|
|
83
|
+
this.updateMilestoneProgress(child, contentHeirarchyData?.identifier, enrollmentListData);
|
|
84
|
+
totalLeafNodes += child.leafNodesCount || 0;
|
|
85
|
+
totalCompletedLeafNodes += child.completedLeafNodesCount || 0;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// For pre-assessment and other root-level content
|
|
89
|
+
const enrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
|
|
90
|
+
this.updateNodeProgress(child, enrollment);
|
|
91
|
+
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage === 100;
|
|
92
|
+
totalLeafNodes += child.leafNodesCount || 1;
|
|
93
|
+
totalCompletedLeafNodes += isCompleted ? (child.leafNodesCount || 1) : 0;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
if (totalLeafNodes > 0) {
|
|
97
|
+
contentHeirarchyData.completionPercentage = Math.round((totalCompletedLeafNodes / totalLeafNodes) * 100);
|
|
98
|
+
contentHeirarchyData.completionStatus = contentHeirarchyData.completionPercentage === 100 ? 2 : 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return contentHeirarchyData;
|
|
102
|
+
}
|
|
103
|
+
updateMilestoneProgress(milestone, parentContentIdentifier, enrollmentListData) {
|
|
104
|
+
let totalLeafNodes = 0;
|
|
105
|
+
let totalCompletedLeafNodes = 0;
|
|
106
|
+
let completedCourses = 0;
|
|
107
|
+
let totalCourses = 0;
|
|
108
|
+
if (milestone.children) {
|
|
109
|
+
milestone.children.forEach((child) => {
|
|
110
|
+
if (child.primaryCategory === 'Course') {
|
|
111
|
+
totalCourses += 1;
|
|
112
|
+
this.updateCourseProgress(child, parentContentIdentifier, enrollmentListData);
|
|
113
|
+
// Check both status and completionStatus for completion
|
|
114
|
+
if (child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100) {
|
|
115
|
+
completedCourses += 1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// For assessments and other content, try multiple enrollment sources
|
|
120
|
+
// First try parent Learning Pathway enrollment
|
|
121
|
+
let enrollment = this.findEnrollment(enrollmentListData, parentContentIdentifier);
|
|
122
|
+
if (!enrollment) {
|
|
123
|
+
// Try milestone enrollment
|
|
124
|
+
enrollment = this.findEnrollment(enrollmentListData, milestone?.identifier);
|
|
125
|
+
}
|
|
126
|
+
this.updateNodeProgress(child, enrollment);
|
|
127
|
+
}
|
|
128
|
+
const leafNodes = child.leafNodesCount || 1;
|
|
129
|
+
totalLeafNodes += leafNodes;
|
|
130
|
+
// Check both status and completionStatus for completion
|
|
131
|
+
if (child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100) {
|
|
132
|
+
totalCompletedLeafNodes += leafNodes;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
milestone.leafNodesCount = totalLeafNodes;
|
|
137
|
+
milestone.completedLeafNodesCount = totalCompletedLeafNodes;
|
|
138
|
+
milestone.totalCourses = totalCourses;
|
|
139
|
+
milestone.completedCourses = completedCourses;
|
|
140
|
+
if (totalLeafNodes > 0) {
|
|
141
|
+
milestone.completionPercentage = Math.round((totalCompletedLeafNodes / totalLeafNodes) * 100);
|
|
142
|
+
milestone.completionStatus = milestone.completionPercentage === 100 ? 2 : 1;
|
|
143
|
+
milestone.status = milestone.completionPercentage === 100 ? 2 : 1;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
updateNodeProgress(node, enrollment) {
|
|
147
|
+
const nodeEnrollData = enrollment?.contentList?.find((ele) => ele?.contentId === node.identifier);
|
|
148
|
+
if (enrollment && nodeEnrollData && nodeEnrollData.status < 2) {
|
|
149
|
+
node.completionPercentage = nodeEnrollData.completionPercentage || nodeEnrollData.progress || 0;
|
|
150
|
+
node.completionStatus = nodeEnrollData.status;
|
|
151
|
+
}
|
|
152
|
+
else if (enrollment && nodeEnrollData && nodeEnrollData.status === 2) {
|
|
153
|
+
node.completionPercentage = 100;
|
|
154
|
+
node.completionStatus = 2;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
node.completionPercentage = 0;
|
|
158
|
+
node.completionStatus = 0;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
updateCourseProgress(course, parentContentIdentifier, enrollmentListData) {
|
|
162
|
+
const enrollment = this.findEnrollment(enrollmentListData, course?.identifier);
|
|
163
|
+
if (enrollment?.completionPercentage === 100) {
|
|
164
|
+
// Enrollment shows 100% - mark course as complete
|
|
165
|
+
course.completionPercentage = 100;
|
|
166
|
+
course.completionStatus = 2;
|
|
167
|
+
course.status = 2;
|
|
168
|
+
this.tocSvc.mapCompletionChildPercentageProgram(course);
|
|
169
|
+
}
|
|
170
|
+
else if (enrollment && enrollment.completionPercentage > 0) {
|
|
171
|
+
// Enrollment has partial progress
|
|
172
|
+
course.completionPercentage = enrollment.completionPercentage || 0;
|
|
173
|
+
course.completionStatus = 1;
|
|
174
|
+
course.status = 1;
|
|
175
|
+
// Also update children
|
|
176
|
+
if (course.children && course.children.length > 0) {
|
|
177
|
+
course.children.forEach((child) => {
|
|
178
|
+
this.updateNodeProgress(child, enrollment);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
if (course.children && course.children.length > 0) {
|
|
184
|
+
let totalLeafNodes = course.leafNodesCount || 0;
|
|
185
|
+
let totalCompleted = 0;
|
|
186
|
+
course.children.forEach((child) => {
|
|
187
|
+
this.updateNodeProgress(child, enrollment);
|
|
188
|
+
if (child.status === 2 || child.completionStatus === 2 || child.completionPercentage === 100) {
|
|
189
|
+
totalCompleted += child.leafNodesCount || 1;
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
// If it's a collection and doesn't have its own enrollment progress, calculate it
|
|
193
|
+
if (!enrollment || !course.completionPercentage || course.completionPercentage === 0) {
|
|
194
|
+
if (!totalLeafNodes) {
|
|
195
|
+
totalLeafNodes = course.children.reduce((acc, curr) => acc + (curr.leafNodesCount || 1), 0);
|
|
196
|
+
}
|
|
197
|
+
if (totalLeafNodes > 0) {
|
|
198
|
+
course.completionPercentage = Math.round((totalCompleted / totalLeafNodes) * 100);
|
|
199
|
+
course.completionStatus = course.completionPercentage === 100 ? 2 : (course.completionPercentage > 0 ? 1 : 0);
|
|
200
|
+
course.status = course.completionStatus;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
findEnrollment(enrollmentList, identifier) {
|
|
207
|
+
if (!enrollmentList || !enrollmentList.length)
|
|
208
|
+
return null;
|
|
209
|
+
return enrollmentList.find((el) => el.collectionId === identifier || el.contentId === identifier);
|
|
210
|
+
}
|
|
211
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, deps: [{ token: i1.AppTocService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
39
212
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, providedIn: 'root' }); }
|
|
40
213
|
}
|
|
41
214
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocV2Service, decorators: [{
|
|
@@ -43,5 +216,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
43
216
|
args: [{
|
|
44
217
|
providedIn: 'root'
|
|
45
218
|
}]
|
|
46
|
-
}], ctorParameters: function () { return []; } });
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2MtdjIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sZUFBZTtJQUUxQixnQkFBZ0IsQ0FBQztJQUVqQixzQkFBc0IsQ0FBQyxlQUFvQjtRQUN4QyxJQUFJLGdCQUFnQixHQUFPLEVBQUMsR0FBRyxlQUFlLEVBQUMsQ0FBQTtRQUU5QyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUMzRCxJQUFJLGFBQWEsR0FBRztnQkFDaEIsWUFBWSxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dCQUMxQixhQUFhLEVBQUUsU0FBUyxDQUFDLFdBQVc7Z0JBQ3BDLFVBQVUsRUFBRSwyQ0FBMkM7Z0JBQ3ZELFVBQVUsRUFBRSxNQUFNO2dCQUNsQixpQkFBaUIsRUFBRSxXQUFXO2dCQUM5QixnQkFBZ0IsRUFBRSxXQUFXO2dCQUM3QixXQUFXLEVBQUUsc0NBQXNDO2dCQUNuRCxNQUFNLEVBQUUsU0FBUyxDQUFDLElBQUk7Z0JBQ3RCLGFBQWEsRUFBRSxRQUFRO2dCQUN2QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsUUFBUSxFQUFFLE1BQU07YUFDbkIsQ0FBQTtZQUNELGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDOUIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbkIsTUFBTSxFQUFFLHVCQUF1QjtnQkFDL0IsaUJBQWlCLEVBQUUsMEJBQTBCO2dCQUM3QyxZQUFZLEVBQUUsNkJBQTZCO2dCQUMzQyxhQUFhLEVBQUUsbUNBQW1DO2dCQUNsRCxvQkFBb0IsRUFBRSxDQUFDO2dCQUN2QixpQkFBaUIsRUFBRSxtQkFBbUI7Z0JBQ3RDLFVBQVUsRUFBRSxxQ0FBcUM7Z0JBQ2pELFlBQVksRUFBRSxhQUFhO2dCQUMzQixRQUFRLEVBQUUsUUFBUTthQUNyQixDQUFDLENBQUE7WUFDVixhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO1lBQ25GLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFbEksQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLGdCQUFnQixDQUFBO0lBQzNCLENBQUM7K0dBdENVLGVBQWU7bUhBQWYsZUFBZSxjQUZkLE1BQU07OzRGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBUb2NWMlNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgY29uc3RydWN0SGVpcmFyY2h5RGF0YShjb250ZW50UmVhZERhdGE6IGFueSk6IGFueSB7XG4gICAgIGxldCBjb250ZW50SGVpcmFyY2h5OmFueSA9IHsuLi5jb250ZW50UmVhZERhdGF9XG4gICAgICAgICBcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ21pbGVzdG9uZXNfdjEnXS5mb3JFYWNoKChtaWxlc3RvbmU6IGFueSkgPT4ge1xuICAgICAgICBsZXQgbWlsZVN0b25lRGF0YSA9IHtcbiAgICAgICAgICAgIFwiaWRlbnRpZmllclwiOiBtaWxlc3RvbmUuaWQsXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IG1pbGVzdG9uZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIFwibWltZVR5cGVcIjogXCJhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmNvbnRlbnQtY29sbGVjdGlvblwiLFxuICAgICAgICAgICAgXCJkdXJhdGlvblwiOiBcIjM2MDBcIixcbiAgICAgICAgICAgIFwicHJpbWFyeUNhdGVnb3J5XCI6IFwiTWlsZVN0b25lXCIsXG4gICAgICAgICAgICBcImNvdXJzZUNhdGVnb3J5XCI6IFwiTWlsZVN0b25lXCIsXG4gICAgICAgICAgICBcImNyZWF0ZWRCeVwiOiBcIjI1MzExYTRmLWZhNDItNGNmNy04ODJhLTVlNzkxOThlZGZjYlwiLFxuICAgICAgICAgICAgXCJuYW1lXCI6IG1pbGVzdG9uZS5uYW1lLFxuICAgICAgICAgICAgXCJjb250ZW50VHlwZVwiOiBcIkNvdXJzZVwiLFxuICAgICAgICAgICAgXCJpc0xvY2tlZFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJzdGF0dXNcIjogXCJMaXZlXCJcbiAgICAgICAgfVxuICAgICAgICBtaWxlU3RvbmVEYXRhWydjaGlsZHJlbiddID0gW11cbiAgICAgICAgbWlsZVN0b25lRGF0YVsnY2hpbGRyZW4nXS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiRmluYWwgQXNzZXNzbWVudCBSNDE4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY29udGV4dENhdGVnb3J5XCI6IFwiRmluYWwgUHJvZ3JhbSBBc3Nlc3NtZW50XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiaWRlbnRpZmllclwiOiBcImRvXzExNDQ3ODA3MzIwNTA5NjQ0ODExODQ4OVwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiRmluYWwgQXNzZXNzbWVudCBSNDE4IGRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY29tcGF0aWJpbGl0eUxldmVsXCI6IDYsXG4gICAgICAgICAgICAgICAgICAgIFwicHJpbWFyeUNhdGVnb3J5XCI6IFwiQ291cnNlIEFzc2Vzc21lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJtaW1lVHlwZVwiOiBcImFwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwib2JqZWN0VHlwZVwiOiBcIlF1ZXN0aW9uU2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3RhdHVzXCI6IFwiUmV2aWV3XCJcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICBtaWxlU3RvbmVEYXRhWydjaGlsZHJlbiddID0gWy4uLm1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10sIC4uLm1pbGVzdG9uZVsnY291cnNlcyddXVxuICAgICAgICBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddID0gY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXSA/IFsuLi5jb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddLCBtaWxlU3RvbmVEYXRhXSA6IFttaWxlU3RvbmVEYXRhXVxuICAgICAgICBcbiAgICAgIH0pXG4gICAgICByZXR1cm4gY29udGVudEhlaXJhcmNoeSBcbiAgfVxufVxuXG4iXX0=
|
|
219
|
+
}], ctorParameters: function () { return [{ type: i1.AppTocService }]; } });
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2MtdjIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFLM0MsTUFBTSxPQUFPLGVBQWU7SUFFMUIsWUFBb0IsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtJQUFJLENBQUM7SUFFOUMsc0JBQXNCLENBQUMsZUFBb0I7UUFDekMsSUFBSSxnQkFBZ0IsR0FBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUE7UUFDbEQsSUFBSSxTQUFTLEdBQWEsRUFBRSxDQUFBO1FBQzVCLElBQUksZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzlILGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUNqQyxtRUFBbUU7WUFDbkUsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFBO1lBQ3BGLDhEQUE4RDtZQUM5RCxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7WUFDdEUsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQTtZQUNsRixTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxxQkFBcUIsSUFBSSxlQUFlLEVBQUUsMkJBQTJCLEVBQUUsVUFBVSxDQUFDLENBQUE7U0FDbkg7UUFFRCxpREFBaUQ7UUFDakQsaUZBQWlGO1FBQ2pG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O2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsY0FBbUIsRUFBRSxVQUFrQjtRQUM1RCxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQTtRQUMxRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEtBQUssVUFBVSxJQUFJLEVBQUUsQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLENBQUE7SUFDeEcsQ0FBQzsrR0EzTlUsZUFBZTttSEFBZixlQUFlLGNBRmQsTUFBTTs7NEZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi9hcHAtdG9jLnNlcnZpY2UnO1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXBwVG9jVjJTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRvY1N2YzogQXBwVG9jU2VydmljZSkgeyB9XG5cbiAgY29uc3RydWN0SGVpcmFyY2h5RGF0YShjb250ZW50UmVhZERhdGE6IGFueSk6IGFueSB7XG4gICAgbGV0IGNvbnRlbnRIZWlyYXJjaHk6IGFueSA9IHsgLi4uY29udGVudFJlYWREYXRhIH1cbiAgICBsZXQgbGVhZk5vZGVzOiBzdHJpbmdbXSA9IFtdXG4gICAgaWYgKGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddICYmIE9iamVjdC5rZXlzKGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddID0gW11cbiAgICAgIC8vIFNldCBwYXJlbnQgcmVmZXJlbmNlIGZvciBwcmVsaW1pbmFyeSBhc3Nlc3NtZW50IChwcmUtYXNzZXNzbWVudClcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddLnBhcmVudCA9IGNvbnRlbnRIZWlyYXJjaHkuaWRlbnRpZmllclxuICAgICAgLy8gTWFyayB0aGlzIGFzIHRoZSBwcmUtYXNzZXNzbWVudCBmb3IgbWlsZXN0b25lIGxvY2tpbmcgbG9naWNcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddLmlzUHJlQXNzZXNzbWVudCA9IHRydWVcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10ucHVzaChjb250ZW50SGVpcmFyY2h5WydwcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWwnXSlcbiAgICAgIGxlYWZOb2Rlcy5wdXNoKGNvbnRlbnRSZWFkRGF0YT8ucHJlbGltaW5hcnlBc3Nlc3NtZW50IHx8IGNvbnRlbnRSZWFkRGF0YT8ucHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsPy5pZGVudGlmaWVyKVxuICAgIH1cblxuICAgIC8vIFRyYWNrIG1pbGVzdG9uZSBpbmRleCBmb3IgcHJvcGVyIGxvY2tpbmcgbG9naWNcbiAgICAvLyBBbGwgbWlsZXN0b25lcyBhcmUgbG9ja2VkIGJ5IGRlZmF1bHQgLSB1bmxvY2tpbmcgaXMgY29tcHV0ZWQgYmFzZWQgb24gcHJvZ3Jlc3NcbiAgICBsZXQgbWlsZXN0b25lSW5kZXggPSAwXG4gICAgY29udGVudEhlaXJhcmNoeVsnbWlsZXN0b25lc192MSddLmZvckVhY2goKG1pbGVzdG9uZTogYW55KSA9PiB7XG4gICAgICAvLyBBbGwgbWlsZXN0b25lcyBhcmUgbG9ja2VkIGJ5IGRlZmF1bHRcbiAgICAgIC8vIE0xIHVubG9ja3Mgd2hlbiBwcmUtYXNzZXNzbWVudCBpcyBjb21wbGV0ZWRcbiAgICAgIC8vIE0yKyB1bmxvY2sgd2hlbiBwcmV2aW91cyBtaWxlc3RvbmUncyBtYW5kYXRvcnkgY29udGVudCArIGFzc2Vzc21lbnQgYXJlIGNvbXBsZXRlZFxuICAgICAgY29uc3Qgc2hvdWxkQmVMb2NrZWQgPSB0cnVlXG5cbiAgICAgIGxldCBtaWxlU3RvbmVEYXRhOiBhbnkgPSB7XG4gICAgICAgIFwiaWRlbnRpZmllclwiOiBtaWxlc3RvbmUuaWQsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogbWlsZXN0b25lLmRlc2NyaXB0aW9uLFxuICAgICAgICBcIm1pbWVUeXBlXCI6IFwiYXBwbGljYXRpb24vdm5kLmVrc3RlcC5jb250ZW50LWNvbGxlY3Rpb25cIixcbiAgICAgICAgXCJkdXJhdGlvblwiOiBcIjM2MDBcIixcbiAgICAgICAgXCJwcmltYXJ5Q2F0ZWdvcnlcIjogXCJNaWxlc3RvbmVcIixcbiAgICAgICAgXCJjb3Vyc2VDYXRlZ29yeVwiOiBcIk1pbGVzdG9uZVwiLFxuICAgICAgICBcImNyZWF0ZWRCeVwiOiBcIjI1MzExYTRmLWZhNDItNGNmNy04ODJhLTVlNzkxOThlZGZjYlwiLFxuICAgICAgICBcIm5hbWVcIjogbWlsZXN0b25lLm5hbWUsXG4gICAgICAgIFwiY29udGVudFR5cGVcIjogXCJDb3Vyc2VcIixcbiAgICAgICAgXCJpc0xvY2tlZFwiOiBzaG91bGRCZUxvY2tlZCxcbiAgICAgICAgXCJtaWxlc3RvbmVJbmRleFwiOiBtaWxlc3RvbmVJbmRleCxcbiAgICAgICAgXCJzdGF0dXNcIjogXCJMaXZlXCIsXG4gICAgICAgIFwibGVhZk5vZGVzXCI6IFtdLFxuICAgICAgICAvLyBQcmUtY29tcHV0ZWQgZmxhZ3MgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgICAgICBcImlzTWlsZXN0b25lXCI6IHRydWUsXG4gICAgICAgIFwiaXNDb2xsZWN0aW9uXCI6IHRydWUsXG4gICAgICAgIFwiaXNNb2R1bGVcIjogZmFsc2UsXG4gICAgICAgIFwiaXNSZXNvdXJjZVwiOiBmYWxzZSxcbiAgICAgICAgXCJpc0xlYXJuaW5nUGF0aHdheVwiOiBmYWxzZSxcbiAgICAgICAgXCJwYXJlbnRcIjogY29udGVudEhlaXJhcmNoeS5pZGVudGlmaWVyXG4gICAgICB9XG4gICAgICBtaWxlU3RvbmVEYXRhWydjaGlsZHJlbiddID0gW11cbiAgICAgIGlmIChtaWxlc3RvbmU/LmNvdXJzZXMgJiYgbWlsZXN0b25lPy5jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgbWlsZXN0b25lLmNvdXJzZXMuZm9yRWFjaCgobWlsZVN0b25lQ291cnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBTZXQgcGFyZW50IHJlZmVyZW5jZSBmb3IgY291cnNlcyBpbnNpZGUgbWlsZXN0b25lXG4gICAgICAgICAgbWlsZVN0b25lQ291cnNlLnBhcmVudCA9IG1pbGVzdG9uZS5pZFxuICAgICAgICAgIGlmIChtaWxlU3RvbmVDb3Vyc2UgJiYgbWlsZVN0b25lQ291cnNlPy5sZWFmTm9kZXMgJiYgbWlsZVN0b25lQ291cnNlPy5sZWFmTm9kZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgbGVhZk5vZGVzID0gWy4uLmxlYWZOb2RlcywgLi4ubWlsZVN0b25lQ291cnNlLmxlYWZOb2Rlc11cbiAgICAgICAgICAgIG1pbGVTdG9uZURhdGFbJ2xlYWZOb2RlcyddID0gWy4uLm1pbGVTdG9uZURhdGE/LmxlYWZOb2RlcywgLi4ubWlsZVN0b25lQ291cnNlLmxlYWZOb2Rlc11cblxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKG1pbGVTdG9uZUNvdXJzZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWwpIHtcbiAgICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIGFzc2Vzc21lbnQgaW5zaWRlIG1pbGVzdG9uZVxuICAgICAgICBtaWxlc3RvbmUuYXNzZXNzbWVudERldGFpbC5wYXJlbnQgPSBtaWxlc3RvbmUuaWRcbiAgICAgICAgbGVhZk5vZGVzLnB1c2gobWlsZXN0b25lPy5hc3Nlc3NtZW50RGV0YWlsPy5pZGVudGlmaWVyKVxuICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbD8uaWRlbnRpZmllcl1cbiAgICAgICAgbWlsZVN0b25lRGF0YVsnY2hpbGRyZW4nXS5wdXNoKG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbClcbiAgICAgIH1cbiAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10gPSBbLi4ubWlsZXN0b25lWydjb3Vyc2VzJ10sIC4uLm1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ11dXG4gICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXNDb3VudCddID0gbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzJ10ubGVuZ3RoXG4gICAgICBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddID0gY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXSA/IFsuLi5jb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddLCBtaWxlU3RvbmVEYXRhXSA6IFttaWxlU3RvbmVEYXRhXVxuXG4gICAgICBtaWxlc3RvbmVJbmRleCsrXG4gICAgfSlcbiAgICBjb250ZW50SGVpcmFyY2h5WydsZWFmTm9kZXMnXSA9IFsuLi5sZWFmTm9kZXNdXG4gICAgcmV0dXJuIGNvbnRlbnRIZWlyYXJjaHlcbiAgfVxuXG5cbiAgbWFwQ29udGVudEhpZXJhcmNoeVByb2dyZXNzVXBkYXRlKGNvbnRlbnRIZWlyYXJjaHlEYXRhOiBhbnksIGVucm9sbG1lbnRMaXN0RGF0YTogYW55KSB7XG4gICAgaWYgKGNvbnRlbnRIZWlyYXJjaHlEYXRhICYmIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNoaWxkcmVuKSB7XG4gICAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgPSAwXG5cbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1pbGVzdG9uZVByb2dyZXNzKGNoaWxkLCBjb250ZW50SGVpcmFyY2h5RGF0YT8uaWRlbnRpZmllciwgZW5yb2xsbWVudExpc3REYXRhKVxuICAgICAgICAgIHRvdGFsTGVhZk5vZGVzICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDBcbiAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBjaGlsZC5jb21wbGV0ZWRMZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIHByZS1hc3Nlc3NtZW50IGFuZCBvdGhlciByb290LWxldmVsIGNvbnRlbnRcbiAgICAgICAgICBjb25zdCBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVByb2dyZXNzKGNoaWxkLCBlbnJvbGxtZW50KVxuICAgICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFxuICAgICAgICAgIHRvdGFsTGVhZk5vZGVzICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBpc0NvbXBsZXRlZCA/IChjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxKSA6IDBcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgaWYgKHRvdGFsTGVhZk5vZGVzID4gMCkge1xuICAgICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uU3RhdHVzID0gY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAxXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5RGF0YVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhtaWxlc3RvbmU6IGFueSwgcGFyZW50Q29udGVudElkZW50aWZpZXI6IHN0cmluZywgZW5yb2xsbWVudExpc3REYXRhOiBhbnkpIHtcbiAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgbGV0IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzID0gMFxuICAgIGxldCBjb21wbGV0ZWRDb3Vyc2VzID0gMFxuICAgIGxldCB0b3RhbENvdXJzZXMgPSAwXG5cbiAgICBpZiAobWlsZXN0b25lLmNoaWxkcmVuKSB7XG4gICAgICBtaWxlc3RvbmUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlJykge1xuICAgICAgICAgIHRvdGFsQ291cnNlcyArPSAxXG4gICAgICAgICAgdGhpcy51cGRhdGVDb3Vyc2VQcm9ncmVzcyhjaGlsZCwgcGFyZW50Q29udGVudElkZW50aWZpZXIsIGVucm9sbG1lbnRMaXN0RGF0YSlcbiAgICAgICAgICAvLyBDaGVjayBib3RoIHN0YXR1cyBhbmQgY29tcGxldGlvblN0YXR1cyBmb3IgY29tcGxldGlvblxuICAgICAgICAgIGlmIChjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApIHtcbiAgICAgICAgICAgIGNvbXBsZXRlZENvdXJzZXMgKz0gMVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgYXNzZXNzbWVudHMgYW5kIG90aGVyIGNvbnRlbnQsIHRyeSBtdWx0aXBsZSBlbnJvbGxtZW50IHNvdXJjZXNcbiAgICAgICAgICAvLyBGaXJzdCB0cnkgcGFyZW50IExlYXJuaW5nIFBhdGh3YXkgZW5yb2xsbWVudFxuICAgICAgICAgIGxldCBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIHBhcmVudENvbnRlbnRJZGVudGlmaWVyKVxuICAgICAgICAgIGlmICghZW5yb2xsbWVudCkge1xuICAgICAgICAgICAgLy8gVHJ5IG1pbGVzdG9uZSBlbnJvbGxtZW50XG4gICAgICAgICAgICBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIG1pbGVzdG9uZT8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZWFmTm9kZXMgPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXG4gICAgICAgIHRvdGFsTGVhZk5vZGVzICs9IGxlYWZOb2Rlc1xuICAgICAgICAvLyBDaGVjayBib3RoIHN0YXR1cyBhbmQgY29tcGxldGlvblN0YXR1cyBmb3IgY29tcGxldGlvblxuICAgICAgICBpZiAoY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwKSB7XG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgbWlsZXN0b25lLmxlYWZOb2Rlc0NvdW50ID0gdG90YWxMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUuY29tcGxldGVkTGVhZk5vZGVzQ291bnQgPSB0b3RhbENvbXBsZXRlZExlYWZOb2Rlc1xuICAgIG1pbGVzdG9uZS50b3RhbENvdXJzZXMgPSB0b3RhbENvdXJzZXNcbiAgICBtaWxlc3RvbmUuY29tcGxldGVkQ291cnNlcyA9IGNvbXBsZXRlZENvdXJzZXNcblxuICAgIGlmICh0b3RhbExlYWZOb2RlcyA+IDApIHtcbiAgICAgIG1pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgbWlsZXN0b25lLmNvbXBsZXRpb25TdGF0dXMgPSBtaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAxXG4gICAgICBtaWxlc3RvbmUuc3RhdHVzID0gbWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyAyIDogMVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTm9kZVByb2dyZXNzKG5vZGU6IGFueSwgZW5yb2xsbWVudDogYW55KSB7XG5cbiAgICBjb25zdCBub2RlRW5yb2xsRGF0YSA9IGVucm9sbG1lbnQ/LmNvbnRlbnRMaXN0Py5maW5kKChlbGU6IGFueSkgPT4gZWxlPy5jb250ZW50SWQgPT09IG5vZGUuaWRlbnRpZmllcilcbiAgICBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPCAyKSB7XG4gICAgICBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gbm9kZUVucm9sbERhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgbm9kZUVucm9sbERhdGEucHJvZ3Jlc3MgfHwgMFxuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gbm9kZUVucm9sbERhdGEuc3RhdHVzXG4gICAgfSBlbHNlIGlmIChlbnJvbGxtZW50ICYmIG5vZGVFbnJvbGxEYXRhICYmIG5vZGVFbnJvbGxEYXRhLnN0YXR1cyA9PT0gMikge1xuICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDEwMFxuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gMlxuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMFxuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gMFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ291cnNlUHJvZ3Jlc3MoY291cnNlOiBhbnksIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGE6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgY291cnNlPy5pZGVudGlmaWVyKVxuXG4gICAgaWYgKGVucm9sbG1lbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgIC8vIEVucm9sbG1lbnQgc2hvd3MgMTAwJSAtIG1hcmsgY291cnNlIGFzIGNvbXBsZXRlXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzID0gMlxuICAgICAgY291cnNlLnN0YXR1cyA9IDJcbiAgICAgIHRoaXMudG9jU3ZjLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvdXJzZSlcbiAgICB9IGVsc2UgaWYgKGVucm9sbG1lbnQgJiYgZW5yb2xsbWVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDApIHtcbiAgICAgIC8vIEVucm9sbG1lbnQgaGFzIHBhcnRpYWwgcHJvZ3Jlc3NcbiAgICAgIGNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGVucm9sbG1lbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgMFxuICAgICAgY291cnNlLmNvbXBsZXRpb25TdGF0dXMgPSAxXG4gICAgICBjb3Vyc2Uuc3RhdHVzID0gMVxuICAgICAgLy8gQWxzbyB1cGRhdGUgY2hpbGRyZW5cbiAgICAgIGlmIChjb3Vyc2UuY2hpbGRyZW4gJiYgY291cnNlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY291cnNlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhjaGlsZCwgZW5yb2xsbWVudClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvdXJzZS5jaGlsZHJlbiAmJiBjb3Vyc2UuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSBjb3Vyc2UubGVhZk5vZGVzQ291bnQgfHwgMFxuICAgICAgICBsZXQgdG90YWxDb21wbGV0ZWQgPSAwXG5cbiAgICAgICAgY291cnNlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhjaGlsZCwgZW5yb2xsbWVudClcbiAgICAgICAgICBpZiAoY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgdG90YWxDb21wbGV0ZWQgKz0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvLyBJZiBpdCdzIGEgY29sbGVjdGlvbiBhbmQgZG9lc24ndCBoYXZlIGl0cyBvd24gZW5yb2xsbWVudCBwcm9ncmVzcywgY2FsY3VsYXRlIGl0XG4gICAgICAgIGlmICghZW5yb2xsbWVudCB8fCAhY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMCkge1xuICAgICAgICAgIGlmICghdG90YWxMZWFmTm9kZXMpIHtcbiAgICAgICAgICAgIHRvdGFsTGVhZk5vZGVzID0gY291cnNlLmNoaWxkcmVuLnJlZHVjZSgoYWNjOiBudW1iZXIsIGN1cnI6IGFueSkgPT4gYWNjICsgKGN1cnIubGVhZk5vZGVzQ291bnQgfHwgMSksIDApXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0b3RhbExlYWZOb2RlcyA+IDApIHtcbiAgICAgICAgICAgIGNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgICAgICAgY291cnNlLmNvbXBsZXRpb25TdGF0dXMgPSBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKVxuICAgICAgICAgICAgY291cnNlLnN0YXR1cyA9IGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdDogYW55LCBpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICBpZiAoIWVucm9sbG1lbnRMaXN0IHx8ICFlbnJvbGxtZW50TGlzdC5sZW5ndGgpIHJldHVybiBudWxsXG4gICAgcmV0dXJuIGVucm9sbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmNvbGxlY3Rpb25JZCA9PT0gaWRlbnRpZmllciB8fCBlbC5jb250ZW50SWQgPT09IGlkZW50aWZpZXIpXG4gIH1cblxuXG5cbn1cblxuIl19
|