@sunbird-cb/toc 0.0.8 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +40 -4
  2. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +210 -63
  3. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +34 -1
  4. package/esm2022/lib/services/app-toc-v2.service.mjs +105 -16
  5. package/esm2022/lib/services/app-toc.service.mjs +303 -43
  6. package/esm2022/lib/services/viewer-util.service.mjs +30 -21
  7. package/esm2022/public-api.mjs +3 -1
  8. package/fesm2022/sunbird-cb-toc.mjs +795 -223
  9. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  10. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +2 -0
  11. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +1 -1
  12. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +27 -7
  13. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +1 -1
  14. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +6 -0
  15. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +1 -1
  16. package/lib/services/app-toc-v2.service.d.ts +2 -0
  17. package/lib/services/app-toc-v2.service.d.ts.map +1 -1
  18. package/lib/services/app-toc.service.d.ts +64 -1
  19. package/lib/services/app-toc.service.d.ts.map +1 -1
  20. package/lib/services/viewer-util.service.d.ts.map +1 -1
  21. package/package.json +1 -1
  22. package/public-api.d.ts +2 -0
  23. package/public-api.d.ts.map +1 -1
@@ -14,18 +14,19 @@ import * as i3 from "../../../../services/certificate.service";
14
14
  import * as i4 from "../../../../services/app-toc.service";
15
15
  import * as i5 from "@sunbird-cb/consumption";
16
16
  import * as i6 from "../../../../services/resource-download-helper.service";
17
- import * as i7 from "@angular/common";
18
- import * as i8 from "@angular/router";
19
- import * as i9 from "@angular/material/icon";
20
- import * as i10 from "@angular/material/menu";
21
- import * as i11 from "@angular/material/progress-spinner";
22
- import * as i12 from "../../content-progress/content-progress.component";
23
- import * as i13 from "ng-circle-progress";
24
- import * as i14 from "@angular/material/legacy-tooltip";
25
- import * as i15 from "@ngx-translate/core";
26
- import * as i16 from "../pipes/truncate.pipe";
17
+ import * as i7 from "@angular/material/legacy-snack-bar";
18
+ import * as i8 from "@angular/common";
19
+ import * as i9 from "@angular/router";
20
+ import * as i10 from "@angular/material/icon";
21
+ import * as i11 from "@angular/material/menu";
22
+ import * as i12 from "@angular/material/progress-spinner";
23
+ import * as i13 from "../../content-progress/content-progress.component";
24
+ import * as i14 from "ng-circle-progress";
25
+ import * as i15 from "@angular/material/legacy-tooltip";
26
+ import * as i16 from "@ngx-translate/core";
27
+ import * as i17 from "../pipes/truncate.pipe";
27
28
  export class AppTocContentCardV2Component {
28
- constructor(events, dialog, renderer, certificateService, appTocSvc, contentLangSvc, resourceDownloadHelperSvc) {
29
+ constructor(events, dialog, renderer, certificateService, appTocSvc, contentLangSvc, resourceDownloadHelperSvc, configSvc, snackBar) {
29
30
  this.events = events;
30
31
  this.dialog = dialog;
31
32
  this.renderer = renderer;
@@ -33,6 +34,8 @@ export class AppTocContentCardV2Component {
33
34
  this.appTocSvc = appTocSvc;
34
35
  this.contentLangSvc = contentLangSvc;
35
36
  this.resourceDownloadHelperSvc = resourceDownloadHelperSvc;
37
+ this.configSvc = configSvc;
38
+ this.snackBar = snackBar;
36
39
  this.content = null;
37
40
  this.expandAll = false;
38
41
  this.forPreview = false;
@@ -71,6 +74,8 @@ export class AppTocContentCardV2Component {
71
74
  this.viewChildren = false;
72
75
  this.primaryCategory = NsContent.EPrimaryCategory;
73
76
  this.pageScrollSubscription = null;
77
+ this.hashmapUpdatedSubscription = null;
78
+ this.achievementLoading = false;
74
79
  // Cached computed properties for performance optimization
75
80
  this._cachedIsCollection = false;
76
81
  this._cachedIsModule = false;
@@ -93,6 +98,16 @@ export class AppTocContentCardV2Component {
93
98
  // }
94
99
  // )
95
100
  this.resourceScroll();
101
+ // Subscribe to hashmap updates to recompute cached properties when progress changes
102
+ this.hashmapUpdatedSubscription = this.appTocSvc.hashmapUpdated$.subscribe((update) => {
103
+ if (update && update.hashmap) {
104
+ console.log('🔄 Hashmap updated, recomputing cached properties for:', this.content?.identifier);
105
+ // IMPORTANT: Update hierarchyMapData with the latest hashmap from the service
106
+ // This ensures the component uses the updated data, not the stale @Input reference
107
+ this.hierarchyMapData = update.hashmap;
108
+ this.computeAllCachedProperties();
109
+ }
110
+ });
96
111
  }
97
112
  /**
98
113
  * Initialize all computed properties once to avoid expensive getter calculations
@@ -267,7 +282,9 @@ export class AppTocContentCardV2Component {
267
282
  return false;
268
283
  }
269
284
  /**
270
- * Check if current content is a milestone assessment (Course Assessment or Final Assessment inside a Milestone)
285
+ * Check if current content is a MILESTONE assessment (DIRECT child of a Milestone)
286
+ * IMPORTANT: This should NOT return true for course assessments inside courses within milestones
287
+ * Only assessments that are direct children of milestones should be locked by milestone logic
271
288
  */
272
289
  computeIsMilestoneAssessment() {
273
290
  if (!this.baseContentReadData || this.baseContentReadData.courseCategory !== 'Learning Pathway') {
@@ -276,63 +293,95 @@ export class AppTocContentCardV2Component {
276
293
  if (!this.content || !this.hierarchyMapData) {
277
294
  return false;
278
295
  }
279
- // Check if this is an assessment
296
+ // Check if this is an assessment type
297
+ // Note: FINAL_ASSESSMENT maps to 'Course Assessment' in the enum, not 'Final Assessment'
280
298
  const isAssessment = this.content.primaryCategory === 'Course Assessment' ||
281
- this.content.courseCategory === 'Course Assessment' ||
282
- (this.content.name && this.content.name.toLowerCase().includes('assessment'));
299
+ this.content.primaryCategory === 'Standalone Assessment' ||
300
+ this.content.mimeType === 'application/vnd.sunbird.questionset' ||
301
+ this.content.mimeType === 'application/quiz';
283
302
  if (!isAssessment) {
284
303
  return false;
285
304
  }
286
- // Check if the parent or grandparent is a milestone (since assessments can be inside courses inside milestones)
287
- if (this.content.parent && this.hierarchyMapData[this.content.parent]) {
288
- const parentData = this.hierarchyMapData[this.content.parent];
289
- // Check if direct parent is a milestone
290
- if (parentData.isMilestone || parentData.primaryCategory === 'Milestone' || parentData.courseCategory === 'Milestone') {
305
+ // IMPORTANT: Only return true if the DIRECT parent is a milestone
306
+ // Assessments inside courses (grandchildren of milestones) should NOT be locked by milestone logic
307
+ // They follow their own course's locking rules
308
+ // Get the parent from hashmap (which we fixed to track correct parent-child relationships)
309
+ // or fallback to content.parent if hashmap entry doesn't exist
310
+ const contentHashData = this.hierarchyMapData[this.content.identifier];
311
+ const parentId = contentHashData?.parent || this.content.parent;
312
+ console.log(`🔍 computeIsMilestoneAssessment for "${this.content.name}" (${this.content.identifier}):`, {
313
+ contentId: this.content.identifier,
314
+ primaryCategory: this.content.primaryCategory,
315
+ mimeType: this.content.mimeType,
316
+ contentParent: this.content.parent,
317
+ hashmapParent: contentHashData?.parent,
318
+ resolvedParentId: parentId,
319
+ hasParentData: !!this.hierarchyMapData[parentId]
320
+ });
321
+ if (parentId && this.hierarchyMapData[parentId]) {
322
+ const parentData = this.hierarchyMapData[parentId];
323
+ console.log(` Parent details:`, {
324
+ parentId: parentId,
325
+ parentName: parentData?.name,
326
+ parentPrimaryCategory: parentData?.primaryCategory,
327
+ parentIsMilestone: parentData?.isMilestone,
328
+ parentCourseCategory: parentData?.courseCategory,
329
+ });
330
+ // Check if DIRECT parent is a milestone - ONLY this case
331
+ const isParentMilestone = parentData.isMilestone ||
332
+ parentData.primaryCategory === 'Milestone' ||
333
+ parentData.courseCategory === 'Milestone';
334
+ if (isParentMilestone) {
335
+ console.log(` ✅ Result: IS a milestone assessment (direct child of milestone)`);
291
336
  return true;
292
337
  }
293
- // Check if grandparent is a milestone (for assessments inside courses inside milestones)
294
- if (parentData.parent && this.hierarchyMapData[parentData.parent]) {
295
- const grandparentData = this.hierarchyMapData[parentData.parent];
296
- return grandparentData.isMilestone || grandparentData.primaryCategory === 'Milestone' || grandparentData.courseCategory === 'Milestone';
297
- }
338
+ console.log(` ❌ Result: NOT a milestone assessment (parent is ${parentData.primaryCategory}, not a Milestone)`);
339
+ // DO NOT check grandparent - course assessments inside courses within milestones
340
+ // should NOT be treated as milestone assessments
341
+ return false;
342
+ }
343
+ else {
344
+ console.log(` ⚠️ No parent data found for ${parentId}`);
298
345
  }
299
346
  return false;
300
347
  }
301
348
  /**
302
349
  * Check if milestone assessment should be locked
303
350
  * Assessment is locked if:
304
- * 1. The parent milestone is unlocked (otherwise handled by parent milestone lock)
305
- * 2. NOT all mandatory content in the milestone is completed
351
+ * 1. It's an assessment that is a DIRECT child of a milestone
352
+ * 2. The parent milestone is unlocked (otherwise handled by parent milestone lock)
353
+ * 3. NOT all mandatory courses in the same milestone are completed
306
354
  */
307
355
  computeIsMilestoneAssessmentLocked() {
308
- if (!this._cachedIsMilestoneAssessment && !this.computeIsMilestoneAssessment()) {
356
+ // Only apply to assessments that are DIRECT children of milestones
357
+ const isMilestoneAssessment = this._cachedIsMilestoneAssessment || this.computeIsMilestoneAssessment();
358
+ console.log(`🔒 computeIsMilestoneAssessmentLocked for "${this.content?.name}":`, {
359
+ isMilestoneAssessment,
360
+ _cachedIsMilestoneAssessment: this._cachedIsMilestoneAssessment,
361
+ });
362
+ if (!isMilestoneAssessment) {
363
+ console.log(`🔓 "${this.content?.name}" NOT locked - not a milestone assessment`);
309
364
  return false;
310
365
  }
366
+ // Check if hashmap has pre-computed assessment locking status
367
+ const hashData = this.hierarchyMapData && this.hierarchyMapData[this.content?.identifier || ''];
368
+ if (hashData && hashData.isAssessmentLocked !== undefined) {
369
+ return hashData.isAssessmentLocked;
370
+ }
311
371
  // If already completed, don't lock
312
372
  if (this.content && (this.content.completionStatus === 2 ||
313
373
  (this.content.completionPercentage && this.content.completionPercentage >= 100))) {
314
374
  return false;
315
375
  }
316
- // Find the milestone ID (could be parent or grandparent)
317
- let milestoneId;
318
- let milestone;
319
- // Check if direct parent is milestone
320
- if (this.content?.parent && this.hierarchyMapData && this.hierarchyMapData[this.content.parent]) {
321
- const parentData = this.hierarchyMapData[this.content.parent];
322
- if (parentData.isMilestone || parentData.primaryCategory === 'Milestone' || parentData.courseCategory === 'Milestone') {
323
- milestoneId = this.content.parent;
324
- milestone = parentData;
325
- }
326
- else if (parentData.parent && this.hierarchyMapData[parentData.parent]) {
327
- // Check if grandparent is milestone
328
- const grandparentData = this.hierarchyMapData[parentData.parent];
329
- if (grandparentData.isMilestone || grandparentData.primaryCategory === 'Milestone' || grandparentData.courseCategory === 'Milestone') {
330
- milestoneId = parentData.parent;
331
- milestone = grandparentData;
332
- }
333
- }
376
+ // For milestone assessments, the parent IS the milestone (verified by computeIsMilestoneAssessment)
377
+ // Use hashmap's parent which has correct parent-child relationships
378
+ const contentHashData = this.hierarchyMapData && this.hierarchyMapData[this.content?.identifier || ''];
379
+ const milestoneId = contentHashData?.parent || this.content?.parent;
380
+ if (!milestoneId || !this.hierarchyMapData) {
381
+ return false;
334
382
  }
335
- if (!milestoneId || !milestone) {
383
+ const milestone = this.hierarchyMapData[milestoneId];
384
+ if (!milestone) {
336
385
  return false;
337
386
  }
338
387
  // If the parent milestone itself is locked, don't add additional locking
@@ -340,24 +389,27 @@ export class AppTocContentCardV2Component {
340
389
  if (milestone.computedIsLocked || milestone.isLocked) {
341
390
  return false;
342
391
  }
343
- // Check if all mandatory content in the milestone is completed
392
+ // Check if all mandatory COURSES in the milestone are completed
393
+ // Note: Only checking courses that are direct children of the milestone
344
394
  let mandatoryCount = 0;
345
395
  let completedMandatoryCount = 0;
346
- // Check all items in hashmap that are direct children of this milestone
347
396
  for (const key of Object.keys(this.hierarchyMapData)) {
348
397
  const item = this.hierarchyMapData[key];
349
- // Check if this item is a direct child of the milestone
398
+ // Only check items that are direct children of this milestone
350
399
  if (item.parent !== milestoneId)
351
400
  continue;
352
- // Skip assessments - we're checking if other content is complete
401
+ // Only count courses (not assessments, not other types)
402
+ if (item.primaryCategory !== 'Course' && !item.isCollection)
403
+ continue;
404
+ // Skip if this is an assessment
353
405
  const isItemAssessment = item.primaryCategory === 'Course Assessment' ||
354
406
  item.primaryCategory === 'Final Assessment' ||
355
- item.courseCategory === 'Course Assessment' ||
356
- (item.name && item.name.toLowerCase().includes('assessment'));
407
+ item.primaryCategory === 'Standalone Assessment' ||
408
+ item.mimeType === 'application/vnd.sunbird.questionset';
357
409
  if (isItemAssessment)
358
410
  continue;
359
- // Check if this content is mandatory
360
- if (item.isMandatory) {
411
+ // By default, courses are mandatory unless explicitly marked as optional
412
+ if (item.isMandatory !== false) {
361
413
  mandatoryCount++;
362
414
  const isCompleted = item.completionStatus === 2 || item.status === 2 ||
363
415
  item.completionPercentage >= 100 || item.progress >= 100;
@@ -366,11 +418,11 @@ export class AppTocContentCardV2Component {
366
418
  }
367
419
  }
368
420
  }
369
- // If there are no mandatory items, assessment is unlocked
421
+ // If there are no mandatory courses, assessment is unlocked
370
422
  if (mandatoryCount === 0) {
371
423
  return false;
372
424
  }
373
- // Lock assessment if not all mandatory items are completed
425
+ // Lock assessment if not all mandatory courses are completed
374
426
  const allMandatoryComplete = completedMandatoryCount >= mandatoryCount;
375
427
  return !allMandatoryComplete;
376
428
  }
@@ -630,7 +682,9 @@ export class AppTocContentCardV2Component {
630
682
  return true;
631
683
  }
632
684
  get isEnrolled() {
633
- return this.batchId ? true : false;
685
+ // Check both batchId and batchData.enrolled to support Learning Pathways
686
+ // where batchId might not be directly set but user is enrolled in courses within the pathway
687
+ return this.batchId ? true : (this.batchData?.enrolled || false);
634
688
  }
635
689
  updateChildParentMap(identifier) {
636
690
  if (this.hierarchyMapData && this.hierarchyMapData[identifier]) {
@@ -743,6 +797,9 @@ export class AppTocContentCardV2Component {
743
797
  }
744
798
  }
745
799
  ngOnDestroy() {
800
+ if (this.hashmapUpdatedSubscription) {
801
+ this.hashmapUpdatedSubscription.unsubscribe();
802
+ }
746
803
  if (this.pageScrollSubscription) {
747
804
  this.pageScrollSubscription.unsubscribe();
748
805
  }
@@ -923,6 +980,10 @@ export class AppTocContentCardV2Component {
923
980
  if (!milestoneData) {
924
981
  return '';
925
982
  }
983
+ // Check if hashmap has pre-computed unlock message
984
+ if (milestoneData.unlockMessage) {
985
+ return milestoneData.unlockMessage;
986
+ }
926
987
  const milestoneIndex = milestoneData.milestoneIndex;
927
988
  // Milestone 1 requires pre-assessment completion
928
989
  if (milestoneIndex === 0) {
@@ -931,6 +992,32 @@ export class AppTocContentCardV2Component {
931
992
  // Other milestones require previous milestone completion
932
993
  return `Complete all mandatory content and assessment in Milestone ${milestoneIndex} to unlock this milestone`;
933
994
  }
995
+ /**
996
+ * Get lock message for content inside locked milestones
997
+ */
998
+ getParentMilestoneLockMessage() {
999
+ if (!this.isParentMilestoneLocked) {
1000
+ return '';
1001
+ }
1002
+ return 'This content is locked. Complete previous milestone to view this content.';
1003
+ }
1004
+ /**
1005
+ * Get lock message for milestone assessments
1006
+ */
1007
+ getAssessmentLockMessage() {
1008
+ if (!this.content || !this.hierarchyMapData) {
1009
+ return '';
1010
+ }
1011
+ const hashData = this.hierarchyMapData[this.content.identifier];
1012
+ // Check if hashmap has pre-computed assessment lock message
1013
+ if (hashData && hashData.assessmentLockMessage) {
1014
+ return hashData.assessmentLockMessage;
1015
+ }
1016
+ if (this.isMilestoneAssessmentLocked) {
1017
+ return 'This content is locked. Complete all mandatory items to unlock the assessment.';
1018
+ }
1019
+ return '';
1020
+ }
934
1021
  shouldShowDownloadButton(content) {
935
1022
  if (!content) {
936
1023
  return false;
@@ -968,8 +1055,68 @@ export class AppTocContentCardV2Component {
968
1055
  console.log('content', content);
969
1056
  console.log('baseContent', this.baseContentReadData);
970
1057
  }
971
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocContentCardV2Component, deps: [{ token: i1.EventService }, { token: i2.MatLegacyDialog }, { token: i0.Renderer2 }, { token: i3.CertificateService }, { token: i4.AppTocService }, { token: i5.ContentLanguageService }, { token: i6.ResourceDownloadHelperService }], target: i0.ɵɵFactoryTarget.Component }); }
972
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocContentCardV2Component, selector: "ws-widget-app-toc-content-card-v2", inputs: { content: "content", expandAll: "expandAll", rootId: "rootId", rootContentType: "rootContentType", forPreview: "forPreview", batchId: "batchId", componentName: "componentName", index: "index", pathSet: "pathSet", expandActive: "expandActive", hierarchyMapData: "hierarchyMapData", batchData: "batchData", isPreAssessment: "isPreAssessment", baseContentReadData: "baseContentReadData", mlCourse: "mlCourse", parentMilestoneLocked: "parentMilestoneLocked" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"content && !isPreAssessment\">\n <ng-container *ngIf=\"isCollection && !isModule\">\n <ng-container [ngTemplateOutlet]=\"collectionTemplate\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isCollection && isModule\">\n <ng-container *ngIf=\"content?.moduleResourseCount\">\n <ng-container [ngTemplateOutlet]=\"collectionTemplate\">\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"isResource\" class=\"resource-container\"\n [ngClass]=\"pathSet?.has(content?.identifier) && isEnrolled ? 'content-active-resource': 'content-not-active-resource'\">\n <div class=\"resource flex sm:flex-row flex-start width-expand w-100 sm:pr-4 sm:w-auto\"\n [ngClass]=\"{'activeResource': pathSet?.has(content?.identifier) && isEnrolled}\">\n <!-- Lock message for curated programs only (shown above content) -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.FINAL_ASSESSMENT && checkForCuratedProgram &&\n !isContentUnlocked\">\n <div class=\"content-locking flex w-full flex-middle mb-2 gap-3\">\n <mat-icon class=\"lock-icon\">lock</mat-icon>\n <span class=\"lock-message mat-body-2\">\n The content is locked. Complete program or all courses to view this module\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.FINAL_ASSESSMENT && checkForCuratedProgram &&\n isContentUnlocked\">\n <div class=\"content-locking flex w-full flex-middle mb-2 gap-3\">\n <mat-icon class=\"unlock-icon\">lock_open_right</mat-icon>\n <span class=\"unlock-message mat-body-2\">\n This content is unlocked.\n </span>\n </div>\n </ng-container>\n <div class=\"flex flex-wrap items-start justify-start sm:justify-end\">\n <!-- <button *ngIf=\"!forPreview && content?.artifactUrl && !isXSmall && isAllowed && isEnabled\" type=\"button\"\n mat-icon-button class=\"\" [matMenuTriggerFor]=\"buttonMenu\">\n <mat-icon>more_vertical</mat-icon>\n </button> -->\n <ng-container *ngIf=\"isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"completed\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <circle-progress class=\"flex items-center progress\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\" [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\"\n [animation]=\"true\" [animationDuration]=\"250\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n matTooltip=\"In progress\" [showZeroOuterStroke]=false [backgroundPadding]=\"-9\"\n [startFromZero]=\"false\" [backgroundPadding]=\"0\" [imageHeight]=\"22\" [imageWidth]=\"22\"\n [showBackground]=\"false\" [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n <!-- <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" class=\"progress-bar-thin\" [progress]=\"content?.completionPercentage\"\n [progressType]=\"'percentage'\">\n </ws-widget-content-progress> -->\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\" [showUnits]=\"false\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [backgroundPadding]=\"0\"\n [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\" matTooltip=\"Not started\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\" [imageHeight]=\"22\"\n [imageWidth]=\"22\" [showBackground]=\"false\"></circle-progress>\n <!-- <p>no data</p> -->\n </ng-template>\n </ng-container>\n </div>\n <!-- deactivated as per NIC CEO requirement to access course wthout login -->\n <a class=\"width-expand\"\n [class.disabled]=\"(forPreview || !isEnabled || !isEnrolled || !isBatchInProgess || !isContentUnlocked || isParentMilestoneLocked || isMilestoneAssessmentLocked) ? true : null\"\n [ngClass]=\"{'ml-3': isEnrolled}\"\n [routerLink]=\"(isAllowed && !forPreview && isEnabled && !isParentMilestoneLocked && !isMilestoneAssessmentLocked) ? resourceLink.url : null\"\n [queryParams]=\"(isAllowed && !forPreview && isEnabled && !isParentMilestoneLocked && !isMilestoneAssessmentLocked) ? resourceLink.queryParams : null\"\n [matTooltip]=\"isParentMilestoneLocked ? 'This content is locked. Complete previous milestone to view this content.' : (isMilestoneAssessmentLocked ? 'This content is locked. Complete all mandatory items to unlock the assessment.' : '')\"\n matTooltipPosition=\"above\">\n <div [ngClass]=\"{'resource-active': pathSet?.has(content?.identifier) && isEnrolled}\"></div>\n <div class=\"text-truncate \" [ngClass]=\"{'cursor-pointer': !isEnabled && isEnrolled}\"\n (click)=\"content.viewChildren = !content.viewChildren; raiseTelemetry(); changeResource()\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content?.identifier) && isEnrolled}\">\n <!-- <mat-icon class=\"margin-right-xs radiobtn time-icon\">radio_button_unchecked </mat-icon> -->\n {{ content?.name | truncate:50 }}\n\n </p>\n <span class=\"content-type optional-span nodtranslate\" *ngIf=\"content?.optionalReading\">{{\n 'playerbrief.optional' | translate | titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier) || !isEnrolled\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/grey/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- for white icons when content highlighted -->\n <ng-container *ngIf=\"pathSet?.has(content?.identifier) && isEnrolled\">\n <div class=\"resicons ws-mat-white-text\">\n <img src=\"/assets/icons/content/white/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/white/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/white/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/white/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/white/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/white/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/white/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/white/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Download button for pdf resources -->\n <ng-container *ngIf=\"shouldShowDownloadButton(content)\">\n <div class=\"download-btn mat-body-2 mt-2 sm:mt-1\" (click)=\"downloadContent(content, $event)\"\n [ngClass]=\"{'active': pathSet?.has(content?.identifier)}\">\n <a class=\"download-link flex items-center\">\n <span class=\"\">Download</span>\n </a>\n </div>\n </ng-container>\n </div>\n </a>\n \n <!-- Lock messages shown below content name (outside anchor tag) -->\n <!-- Lock message for resources in locked milestones -->\n <ng-container *ngIf=\"isParentMilestoneLocked && isEnrolled\">\n <div class=\"content-locking flex w-full flex-middle mt-2 gap-3\">\n <mat-icon class=\"lock-icon\">lock</mat-icon>\n <span class=\"lock-message mat-body-2\">\n This content is locked. Complete previous milestone to view this content.\n </span>\n </div>\n </ng-container>\n <!-- Lock message for milestone assessments when mandatory content not completed -->\n <ng-container *ngIf=\"isMilestoneAssessmentLocked && isEnrolled && !isParentMilestoneLocked\">\n <div class=\"content-locking flex w-full flex-middle mt-2 gap-3\">\n <mat-icon class=\"lock-icon\">lock</mat-icon>\n <span class=\"lock-message mat-body-2\">\n This content is locked. Complete all mandatory items to unlock the assessment.\n </span>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n\n<mat-menu #buttonMenu=\"matMenu\">\n <a mat-menu-item [routerLink]=\"'../' + content?.identifier + '/overview'\" [queryParams]=\"contextPath\"\n class=\"flex flex-middle\">\n <mat-icon>toc</mat-icon>\n <h3 class=\"margin-remove nodtranslate\">\n View Details\n </h3>\n </a>\n</mat-menu>\n\n<ng-template #collectionTemplate>\n <ng-container *ngIf=\"isCollection\">\n <div class=\"collection-wrapper p-4 flex flex-col position-relative\" [ngClass]=\"{'open': check(content),\n 'close': !content.viewChildren,\n 'course':!isModule, 'module': isModule,\n 'content-active': pathSet?.has(content.identifier) && isEnrolled}\">\n <div class=\"card-collection w-auto sm:w-100 padding-right-xl\">\n <!-- <img class=\"card-thumbnail ws-mat-primary-lite-background\" [src]=\"content?.appIcon\" alt=\"Thumbnail\"\n (click)=\"content.viewChildren = !content.viewChildren\" [wsUtilsDefaultThumbnail]=\"defaultThumbnail\" /> -->\n <div class=\"flex flex-col flex-wrap flex-between width-expand pr-0 w-100 \">\n <div class=\"text-truncate\" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"content.viewChildren = !content.viewChildren\">\n <div class=\"flex items-center justify-center mb-1 sm:flex-row\">\n <ng-container\n *ngIf=\"isModule && isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content.identifier) == 2\">\n <div class=\"completed mr-2\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <circle-progress class=\"flex items-center progress mr-1\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\"\n [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\" [animation]=\"true\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\"\n [backgroundStrokeWidth]=\"3\" matTooltip=\"In progress\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-7\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"18\" [imageWidth]=\"18\"\n [showBackground]=\"false\" [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress mr-1\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\"\n [showUnits]=\"false\" [animationDuration]=\"250\" [showTitle]=\"false\"\n [backgroundPadding]=\"0\" [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\"\n matTooltip=\"Not started\" [showSubtitle]=\"false\" [showInnerStroke]=\"true\"\n [clockwise]=\"true\" [imageHeight]=\"22\" [imageWidth]=\"22\"\n [showBackground]=\"false\"></circle-progress>\n </ng-template>\n </ng-container>\n <div\n [ngClass]=\"{'collection-active-class': pathSet?.has(content?.identifier) && isEnrolled}\">\n </div>\n <img *ngIf=\"isMilestoneLocked\" src=\"assets/icons/hubs/lock.svg\" alt=\"Locked\"\n class=\"lock-icon mr-2 margin-bottom-xxs\">\n <p class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content.identifier) && isEnrolled}\">\n <span>{{isMilestone ? index -1 : index}}. </span>{{ content?.name | truncate:50 }}\n <ng-container *ngIf=\"isMilestone\">\n <span *ngIf=\"isMilestoneLocked\" class=\"locked-text ml-2\">Locked</span>\n </ng-container>\n <span *ngIf=\"content?.isMandatory\"\n class=\"mandatory-text mat-caption ml-2\">Mandatory</span>\n </p>\n <div class=\"type-container resource mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Resource'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Resource</span>\n </div>\n <div class=\"type-container module mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Collection'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Module</span>\n </div>\n <div class=\"type-container course mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Course'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Course</span>\n </div>\n </div>\n <!-- Milestone Badge -->\n <div *ngIf=\"isMilestone\" class=\"milestone-badge mt-2 mb-2\">\n <span class=\"milestone-badge-text nodtranslate\">Milestone {{index - 1}}</span>\n </div>\n <!-- Milestone Description (3 lines with ellipsis) -->\n <p *ngIf=\"isMilestone && content?.description\" class=\"milestone-description mt-2 nodtranslate\">\n {{ content?.description }}\n </p>\n <div class=\"flex flex-row gap-3 items-center content-key-values mt-2\">\n <mat-icon *ngIf=\"!isModule\" alt=\"course\"\n class=\"time-icon icon-color\">video_library</mat-icon>\n <img *ngIf=\"isModule\" alt=\"Module\" class=\"time-icon\"\n src=\"/assets/icons/content/grey/module.svg\">\n <div class=\"text-xs nodtranslate\">{{ (hierarchyMapData[content?.identifier]?.duration ||\n 120)|\n pipeDurationTransform: 'hms' }}</div>\n\n <ng-container *ngIf=\"content?.moduleCount\">\n <div class=\"flex items-center\">\n <span class=\"period\"></span>\n </div>\n <div class=\"text-xs nodtranslate\">{{content?.moduleCount}} {{content?.moduleCount > 1?\n 'modules' :\n 'module'}}</div>\n </ng-container>\n <ng-container *ngIf=\"content?.leafNodesCount\">\n <div class=\"flex items-center\">\n <span class=\"period\"></span>\n </div>\n <div class=\"text-xs nodtranslate\">{{content?.leafNodesCount}} {{content?.leafNodesCount\n >1 ? 'items':\n 'item'}}</div>\n </ng-container>\n </div>\n <!-- Milestone Completion Progress -->\n <div *ngIf=\"isMilestone && isEnrolled && !isMilestoneLocked\" class=\"milestone-progress mt-2\">\n <span class=\"milestone-progress-text nodtranslate\">{{getMilestoneCompletedCount()}} of\n {{content?.leafNodesCount || 0}} completed</span>\n </div>\n <!-- Unlock Criteria Message for Locked Milestones -->\n <div *ngIf=\"isMilestone && isEnrolled && isMilestoneLocked\" class=\"milestone-locked-message mt-2\">\n <span class=\"locked-criteria-text mat-caption\">\n {{ getMilestoneUnlockMessage() }}\n </span>\n </div>\n <!-- View Achievement Button for completed milestones -->\n <div *ngIf=\"isMilestone && isEnrolled && (getCompletionPercentage(content?.identifier) >= 100 || getCompletionStatus(content?.identifier) === 2)\"\n class=\"view-achievement-container mt-2\">\n <button type=\"button\" class=\"view-achievement-btn\" [disabled]=\"achievementLoading\"\n (click)=\"viewMilestoneAchievement($event)\">\n <span *ngIf=\"!achievementLoading\">View Achievement</span>\n <mat-spinner *ngIf=\"achievementLoading\" [diameter]=\"16\"\n class=\"inline-spinner\"></mat-spinner>\n </button>\n </div>\n </div>\n <!-- For course progress to be shown -->\n <ng-container *ngIf=\"isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) && content.primaryCategory === 'Course'\">\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full \">\n <span class=\"mat-body-2 nodtranslate \">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n <!-- <circle-progress class=\"flex items-center progress\" [percent]=\"100\" [radius]=\"12\"\n [outerStrokeWidth]=\"3\" [innerStrokeWidth]=\"3\" [space]=\"-3\"\n [outerStrokeColor]=\"progressColor()\" [innerStrokeColor]=\"'rgba(0,0,0,.16)'\"\n [animation]=\"true\" [animationDuration]=\"300\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-9\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"24\" [imageWidth]=\"24\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress> -->\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text nodtranslate\">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div class=\"see-all-container\">\n <a href=\"javascript:void(0)\" role=\"button\"\n (click)=\"content.viewChildren = !content.viewChildren; expandActive = false\"\n class=\"see-all-btn tab custom-chevron customicon\" mat-button>\n <mat-icon *ngIf=\"!content.viewChildren && !isModule\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && !isModule\">keyboard_arrow_up</mat-icon>\n <mat-icon *ngIf=\"!content.viewChildren && isModule\">add</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && isModule\">remove</mat-icon>\n </a>\n </div>\n </div>\n </div>\n </div>\n <div class=\"child-wrapper \" *ngIf=\"content.viewChildren\" [ngClass]=\"{'open': content.viewChildren,\n 'close': !content.viewChildren,\n 'course':!isModule,\n 'module': isModule}\" [@panelInOut]>\n <div class=\"children-container\" [ngClass]=\"{'module': isModule, '': !isModule}\">\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [componentName]=\"componentName\"\n [content]=\"child\" [expandAll]=\"expandAll\" [rootId]=\"rootId\" [batchId]=\"batchId\"\n [rootContentType]=\"rootContentType\" [index]=\"j+1\" [baseContentReadData]=\"baseContentReadData\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [mlCourse]=\"mlCourse\" [parentMilestoneLocked]=\"isMilestoneLocked || isParentMilestoneLocked\"\n *ngFor=\"let child of content?.children; trackBy: contentTrackBy; let j= index;let isFirst = first\"\n [ngClass]=\"{'moduleCard': checkIsModule(child), 'resourceCard': !checkIsModule(child), 'first': isFirst}\">\n </ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n\n<ng-container *ngIf=\"isPreAssessment\">\n <div class=\"collection-wrapper p-4 flex flex-col position-relative\" [ngClass]=\"{'open': check(content),\n 'course':!isModule, 'module': isModule,\n 'content-active': pathSet?.has(content.identifier)}\">\n <div class=\"card-collection w-auto sm:w-100 padding-right-xl\">\n <!-- <img class=\"card-thumbnail ws-mat-primary-lite-background\" [src]=\"content?.appIcon\" alt=\"Thumbnail\"\n (click)=\"content.viewChildren = !content.viewChildren\" [wsUtilsDefaultThumbnail]=\"defaultThumbnail\" /> -->\n <div class=\"flex flex-col flex-wrap flex-between width-expand pr-0 w-100 \">\n\n <div class=\"text-truncate\" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"content.viewChildren = !content.viewChildren\">\n <div class=\"flex sm:flex-row flex-wrap\">\n <ng-container>\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content.identifier) == 2\">\n <div class=\"completed mr-2\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n\n <circle-progress class=\"flex items-center progress mr-1\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\" [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\"\n [animation]=\"true\" [animationDuration]=\"250\" [showTitle]=\"false\"\n [showUnits]=\"false\" [showSubtitle]=\"false\" [showInnerStroke]=\"true\"\n [clockwise]=\"true\" [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\"\n [backgroundStrokeWidth]=\"3\" matTooltip=\"In progress\" [showZeroOuterStroke]=false\n [backgroundPadding]=\"-7\" [startFromZero]=\"false\" [backgroundPadding]=\"0\"\n [imageHeight]=\"18\" [imageWidth]=\"18\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress mr-1\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\" [showUnits]=\"false\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [backgroundPadding]=\"0\"\n [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\" matTooltip=\"Not started\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [imageHeight]=\"22\" [imageWidth]=\"22\" [showBackground]=\"false\"></circle-progress>\n </ng-template>\n </ng-container>\n <div [ngClass]=\"{'collection-active-class': pathSet?.has(content?.identifier)}\"></div>\n <!-- <p class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content.identifier)}\">\n {{index}}. {{ content?.name | truncate:50 }}\n </p> -->\n <a class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [class.disabled]=\"null\" [ngClass]=\"{'ml-3': isEnrolled}\"\n [routerLink]=\"(isAllowed && !forPreview && isEnabled) ? resourceLink.url : null\"\n [queryParams]=\"computedQueryParams\">\n <!-- {{content?.courseCategory}} -->\n <div [ngClass]=\"{'resource-active': pathSet?.has(content?.identifier)}\"></div>\n <div class=\"text-truncate \" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"raiseTelemetry(); changeResource()\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content?.identifier)}\">\n <!-- <mat-icon class=\"margin-right-xs radiobtn time-icon\">radio_button_unchecked </mat-icon> -->\n {{index}}. {{ content?.name | truncate:50 }}\n\n </p>\n <span class=\"content-type optional-span nodtranslate\"\n *ngIf=\"content?.optionalReading\">{{ 'playerbrief.optional' | translate |\n titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier)\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/grey/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\"\n alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\"\n class=\"float-left margin-right-xs\" alt=\"offline sessions\"\n *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{\n content?.maxQuestions }} {{ 'playerbrief.questions' | translate |\n titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{\n (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- for white icons when content highlighted -->\n <ng-container *ngIf=\"pathSet?.has(content?.identifier)\">\n <div class=\"resicons ws-mat-white-text\">\n <img src=\"/assets/icons/content/white/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/white/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/white/pdf.svg\" alt=\"PDF\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/white/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/white/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/white/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/white/content_copy.svg\" class=\"contenticon\"\n alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/white/module.svg\"\n class=\"float-left margin-right-xs\" alt=\"offline sessions\"\n *ngIf=\"content.mimeType === 'application/offline'\">\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-white-text nodtranslate\">{{\n content?.maxQuestions }} {{ 'playerbrief.questions' | translate |\n titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-white-text nodtranslate\">{{\n (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </a>\n <!-- <div class=\"type-container resource mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Resource'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Resource</span>\n </div>\n <div class=\"type-container module mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Collection'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Module</span>\n </div>\n <div class=\"type-container course mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Course'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Course</span>\n </div> -->\n </div>\n\n </div>\n <!-- For course progress to be shown -->\n <ng-container>\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier)\">\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full \">\n <span class=\"mat-body-2 nodtranslate \">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n <!-- <circle-progress class=\"flex items-center progress\" [percent]=\"100\" [radius]=\"12\"\n [outerStrokeWidth]=\"3\" [innerStrokeWidth]=\"3\" [space]=\"-3\"\n [outerStrokeColor]=\"progressColor()\" [innerStrokeColor]=\"'rgba(0,0,0,.16)'\"\n [animation]=\"true\" [animationDuration]=\"300\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-9\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"24\" [imageWidth]=\"24\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress> -->\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text nodtranslate\">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- <div class=\"see-all-container\">\n <a href=\"javascript:void(0)\" role=\"button\"\n (click)=\"content.viewChildren = !content.viewChildren; expandActive = false\"\n class=\"see-all-btn tab custom-chevron customicon\" mat-button>\n <mat-icon *ngIf=\"!content.viewChildren && !isModule\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && !isModule\">keyboard_arrow_up</mat-icon>\n <mat-icon *ngIf=\"!content.viewChildren && isModule\">add</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && isModule\">remove</mat-icon>\n </a>\n </div> -->\n </div>\n </div>\n </div>\n\n</ng-container>", styles: [".customicon{position:absolute;top:-.5em;right:0}.customicon .mat-icon{color:#1a4ca1}a.disabled{pointer-events:none;cursor:default}span.optional-span{margin-left:8px;padding:0 6px;border-radius:2px;display:inline-block;background-color:#0074b6;color:#fff;font-size:12px}.card-collection{display:flex;align-items:center;border-radius:8px}.card-collection .card-thumbnail{height:100%;margin-right:12px;cursor:pointer;border-radius:8px 0 0}@media only screen and (max-width: 469px){.card-collection{flex-direction:column;align-items:flex-start!important}.card-collection .card-thumbnail{height:100%!important;width:100%!important}.card-collection .text-truncate{white-space:unset!important}}.tab:focus{outline:1px solid!important}.custom-chevron:focus{outline:0px solid!important}.resource-container{display:flex;align-items:flex-start;flex-direction:column}.resource-container .resource{padding:16px 16px 16px 0;width:100%}.resource-container .card-thumbnail{height:100%;cursor:pointer}.resource-container .img-container{position:relative;margin-right:12px}.resource-container .img-container ws-widget-content-progress{position:absolute;left:0;right:0;bottom:5px}@media only screen and (max-width: 469px){.resource-container{flex-direction:column;align-items:flex-start!important}.resource-container .card-thumbnail{height:100%!important;width:100%!important}.resource-container .text-truncate{white-space:unset!important}}.child-meta-container{margin-top:8px;display:flex}.child-meta-container .child-structure{display:flex;align-items:center;flex-wrap:wrap}.child-meta-container .child-structure span{margin-right:12px;text-align:center;margin-bottom:8px}.child-meta-container .child-structure .structure-icon{margin-right:12px}@media only screen and (max-width: 469px){.child-meta-container{margin-left:.5rem;justify-content:space-between}}.resource-container{display:flex;align-items:center}.resource-container ws-display-content-type-icon{display:flex;align-items:center}.resource-container .resource-meta{margin-left:12px;display:flex;justify-content:space-between;align-items:center}.completed-icon{color:#1a4ca1}.collection-wrapper{padding:1rem}.collection-wrapper.course.content-active{background-color:#1a4ca1;color:#fff}.collection-wrapper.course.content-active .period{background:#fff}.collection-wrapper.course.content-active .text-active,.collection-wrapper.course.content-active .icon-color,.collection-wrapper.course.content-active .customicon .mat-icon{color:#fff}.collection-wrapper.course.content-active .progress-container span{color:#fff!important}.text-active{color:#1a4ca1}.text-active.font-bold{font-weight:600}.activeResource{background-color:#1a4ca1;color:#fff;padding-top:1rem!important;padding-bottom:1rem!important}.activeResource .text-active{color:#fff}.activeResource .text-active.font-bold{font-weight:600}.activeResource .resourceDuration,.activeResource .completed-icon{color:#fff}.collection-wrapper.open{border-bottom:1px solid rgba(0,0,0,.16)}.collection-wrapper.close{border:none}.child-wrapper.open{border-radius:0 0 8px 8px}.children-container .mat-subheading-1{font:500 16px/24px Lato!important}.children-container .resource-container{margin-bottom:16px}.children-container .resource-container .resource{padding:0}.children-container .resource-container .card-thumbnail{height:65px;align-self:center}.first.resourceCard:nth-child(1) .resource{margin-top:16px!important}.first.resourceCard:nth-child(1) .activeResource{margin-top:0!important}.children-container .resourceCard:last-child .resource-container:has(.activeResource){margin-bottom:0!important}.moduleCard:not(:last-child)>.collection-wrapper.close.module{border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.moduleCard:not(:last-child)>.collection-wrapper.open.module+.child-wrapper.open{border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.collection-wrapper.open.course+.child-wrapper.open .collection-wrapper.open.module+.child-wrapper.open{background-color:#eff3f9;border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.collection-wrapper.open.module+.child-wrapper.open{background-color:#eff3f9;border-radius:0;padding-bottom:8px}.content-heading{letter-spacing:0px;color:#222}.content-type{letter-spacing:0px}.time-icon{height:16px;width:16px;font-size:16px;vertical-align:middle}.time-icon.icon-color{color:#0009}.period{width:3px;height:3px;background:#0009;border-radius:4px}.time-value{letter-spacing:0px;color:#222;text-transform:lowercase}.see-all-container{position:absolute;right:16px;top:24px}.oval-white{background:#fff 0% 0% no-repeat padding-box;border-radius:8px;padding:2px 8px}.type-container{letter-spacing:0px;display:flex;align-items:center}.type-container .rotate-90{transform:rotate(-90deg)}.type-container .custom-icon{width:18px;height:18px;font-size:18px;margin-right:8px}.type-container.resource{color:#00a9f4}.type-container.module{color:#34d6a4}.type-container.course{color:#f58634}.no-mb{margin-bottom:0!important}.w-100{width:100%}.w-auto{width:auto}.progress-bar-thin{height:5px!important}.progress-bar-thin ::ng-deep .mat-progress-bar{height:5px}.progress-bar-thin ::ng-deep .theme-igot.day-mode .mat-progress-bar-buffer{background-color:transparent!important}.progress-bar-thin ::ng-deep .theme-igot.day-mode .mat-progress-bar-background{fill:transparent}.radiobtn{color:#00000029}.resicons img{width:22px;opacity:.5;margin-top:2px;vertical-align:sub}.certificate-btn{height:24px;background:#1a4ca1;display:flex;justify-content:center;align-items:center;padding:4px 11px;color:#fff;border-radius:20px;border:1px solid white;font:400 12px/16px Lato;cursor:pointer}.certificate-btn .mat-icon{fill:#fff;color:#fff;font-size:16px;height:auto;width:auto}.view-certificate-wrapper{display:flex;border-radius:4px;border:1.5px solid rgb(0,116,182);opacity:1;padding:8px}.collection-wrapper.course,.collection-wrapper.module,.resource-container .resource{padding-left:16px;box-sizing:border-box;width:100%;overflow:hidden}.children-container.module .resource-container .resource,.course .collection-wrapper.module{padding-left:24px;box-sizing:border-box;width:100%}.course .children-container.module .resource-container .resource{padding-left:32px;box-sizing:border-box;width:100%}.course .resource-container .resource{padding-left:24px}::ng-deep .white-spinner{stroke:#fff!important}.certificate-loader ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.lock-message{background:#fff4ec;color:#d13924;padding:10px;border-radius:4px;display:block!important;width:100%}.content-locking{padding:8px 12px;margin-top:8px;margin-left:0;margin-right:0;border-radius:4px;background:#fff4ec;display:flex!important;align-items:center;gap:8px;width:100%;box-sizing:border-box}.lock-icon{color:#f3962f;font-size:20px;flex-shrink:0}.unlock-message{background:#efffec;color:#0c9600;padding:10px}.unlock-icon{color:#0c9600}.download-btn{padding:4px 12px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;cursor:pointer;border-radius:40px;color:#1b4ca1;font-weight:700;border:1px solid #1B4CA1;display:inline-block;pointer-events:auto;position:relative;z-index:1}.activeResource .download-btn.active{color:#fff;border:1px solid #fff}.milestone-badge{display:inline-block;background-color:#fefaf4;border:1px solid #EF951E;border-radius:16px;padding:2px 12px}.milestone-badge-text{font-size:12px;font-weight:500;color:#212121}.milestone-description{font-size:14px;line-height:1.5;color:#000000b3;margin:0;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.milestone-progress{display:flex;align-items:center}.milestone-progress-text{font-size:14px;font-weight:500;color:#0009}.milestone-locked-message{display:flex;align-items:center;padding:8px 12px;background-color:#f3962f1a;border-left:3px solid #F3962F;border-radius:4px}.locked-criteria-text{font-size:13px;font-weight:400;color:#000000b3;line-height:1.4}.locked-text{font-size:14px;font-weight:500;color:#f3962f}.mandatory-text{color:#d13924!important}.view-achievement-container{display:flex;align-items:center}.view-achievement-btn{background-color:transparent;border:1.5px solid #1a4ca1;color:#1a4ca1;border-radius:20px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:8px;transition:all .2s ease}.view-achievement-btn:hover:not(:disabled){background-color:#1a4ca1;color:#fff}.view-achievement-btn:disabled{opacity:.6;cursor:not-allowed}.view-achievement-btn .inline-spinner{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i12.ContentProgressComponent, selector: "ws-widget-content-progress", inputs: ["contentId", "progress", "progressType", "forPreview", "className", "customClassName"] }, { kind: "component", type: i13.CircleProgressComponent, selector: "circle-progress", inputs: ["name", "class", "backgroundGradient", "backgroundColor", "backgroundGradientStopColor", "backgroundOpacity", "backgroundStroke", "backgroundStrokeWidth", "backgroundPadding", "radius", "space", "percent", "toFixed", "maxPercent", "renderOnClick", "units", "unitsFontSize", "unitsFontWeight", "unitsColor", "outerStrokeGradient", "outerStrokeWidth", "outerStrokeColor", "outerStrokeGradientStopColor", "outerStrokeLinecap", "innerStrokeColor", "innerStrokeWidth", "titleFormat", "title", "titleColor", "titleFontSize", "titleFontWeight", "subtitleFormat", "subtitle", "subtitleColor", "subtitleFontSize", "subtitleFontWeight", "imageSrc", "imageHeight", "imageWidth", "animation", "animateTitle", "animateSubtitle", "animationDuration", "showTitle", "showSubtitle", "showUnits", "showImage", "showBackground", "showInnerStroke", "clockwise", "responsive", "startFromZero", "showZeroOuterStroke", "lazy", "options"], outputs: ["onClick"] }, { kind: "directive", type: i14.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AppTocContentCardV2Component, selector: "ws-widget-app-toc-content-card-v2", inputs: ["content", "expandAll", "rootId", "rootContentType", "forPreview", "batchId", "componentName", "index", "pathSet", "expandActive", "hierarchyMapData", "batchData", "isPreAssessment", "baseContentReadData", "mlCourse", "parentMilestoneLocked"] }, { kind: "pipe", type: i7.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1.PipeDurationTransformPipe, name: "pipeDurationTransform" }, { kind: "pipe", type: i15.TranslatePipe, name: "translate" }, { kind: "pipe", type: i16.TruncatePipe, name: "truncate" }], animations: [
1058
+ /**
1059
+ * View milestone achievement - calls the achievement API and shows the result
1060
+ */
1061
+ viewMilestoneAchievement(event) {
1062
+ if (event) {
1063
+ event.preventDefault();
1064
+ event.stopPropagation();
1065
+ }
1066
+ if (!this.content || !this.batchId || this.achievementLoading) {
1067
+ return;
1068
+ }
1069
+ // Get user ID from ConfigurationsService
1070
+ const userId = this.configSvc?.userProfile?.userId;
1071
+ if (!userId) {
1072
+ console.error('User ID not found');
1073
+ return;
1074
+ }
1075
+ // Extract milestone ID (e.g., "m1", "m2") from the content name or index
1076
+ // Try to get milestone number from the index or extract from content
1077
+ let milestoneId = 'm' + (this.index - 1); // index is typically 1-based, milestones are 0-based
1078
+ // If content name contains milestone number, extract it
1079
+ if (this.content.name) {
1080
+ const match = this.content.name.match(/milestone\s*(\d+)/i);
1081
+ if (match) {
1082
+ milestoneId = 'm' + match[1];
1083
+ }
1084
+ }
1085
+ const courseId = this.baseContentReadData?.identifier || this.rootId;
1086
+ this.achievementLoading = true;
1087
+ this.appTocSvc.generateMilestoneAchievement(userId, courseId, this.batchId, milestoneId).subscribe({
1088
+ next: (response) => {
1089
+ this.achievementLoading = false;
1090
+ console.log('Achievement generated successfully:', response);
1091
+ // Show achievement dialog or handle response
1092
+ if (response && response.result) {
1093
+ // Open a dialog to show the achievement
1094
+ this.dialog.open(CertificateDialogComponent, {
1095
+ width: '1300px',
1096
+ data: {
1097
+ cet: response.result.printUri || response.result.svgData,
1098
+ certId: response.result.identifier,
1099
+ isAchievement: true
1100
+ },
1101
+ });
1102
+ }
1103
+ },
1104
+ error: (error) => {
1105
+ this.achievementLoading = false;
1106
+ // Show error message in snackbar
1107
+ const errorMessage = error?.error?.result?.message || error?.message || 'Failed to generate achievement';
1108
+ this.snackBar.open(errorMessage, 'Close', {
1109
+ duration: 5000,
1110
+ horizontalPosition: 'center',
1111
+ verticalPosition: 'bottom',
1112
+ panelClass: ['error-snackbar']
1113
+ });
1114
+ console.error('Error generating achievement:', error);
1115
+ }
1116
+ });
1117
+ }
1118
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocContentCardV2Component, deps: [{ token: i1.EventService }, { token: i2.MatLegacyDialog }, { token: i0.Renderer2 }, { token: i3.CertificateService }, { token: i4.AppTocService }, { token: i5.ContentLanguageService }, { token: i6.ResourceDownloadHelperService }, { token: i1.ConfigurationsService }, { token: i7.MatLegacySnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
1119
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocContentCardV2Component, selector: "ws-widget-app-toc-content-card-v2", inputs: { content: "content", expandAll: "expandAll", rootId: "rootId", rootContentType: "rootContentType", forPreview: "forPreview", batchId: "batchId", componentName: "componentName", index: "index", pathSet: "pathSet", expandActive: "expandActive", hierarchyMapData: "hierarchyMapData", batchData: "batchData", isPreAssessment: "isPreAssessment", baseContentReadData: "baseContentReadData", mlCourse: "mlCourse", parentMilestoneLocked: "parentMilestoneLocked" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"content && !isPreAssessment\">\n <ng-container *ngIf=\"isCollection && !isModule\">\n <ng-container [ngTemplateOutlet]=\"collectionTemplate\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isCollection && isModule\">\n <ng-container *ngIf=\"content?.moduleResourseCount\">\n <ng-container [ngTemplateOutlet]=\"collectionTemplate\">\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"isResource\" class=\"resource-container\"\n [ngClass]=\"pathSet?.has(content?.identifier) && isEnrolled ? 'content-active-resource': 'content-not-active-resource'\">\n <div class=\"resource flex sm:flex-row flex-start width-expand w-100 sm:pr-4 sm:w-auto\"\n [ngClass]=\"{'activeResource': pathSet?.has(content?.identifier) && isEnrolled}\">\n <!-- Lock message for curated programs only (shown above content) -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.FINAL_ASSESSMENT && checkForCuratedProgram &&\n !isContentUnlocked\">\n <div class=\"content-locking flex w-full flex-middle mb-2 gap-3\">\n <mat-icon class=\"lock-icon\">lock</mat-icon>\n <span class=\"lock-message mat-body-2\">\n The content is locked. Complete program or all courses to view this module\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.FINAL_ASSESSMENT && checkForCuratedProgram &&\n isContentUnlocked\">\n <div class=\"content-locking flex w-full flex-middle mb-2 gap-3\">\n <mat-icon class=\"unlock-icon\">lock_open_right</mat-icon>\n <span class=\"unlock-message mat-body-2\">\n This content is unlocked.\n </span>\n </div>\n </ng-container>\n <div class=\"flex flex-wrap items-start justify-start sm:justify-end\">\n <!-- <button *ngIf=\"!forPreview && content?.artifactUrl && !isXSmall && isAllowed && isEnabled\" type=\"button\"\n mat-icon-button class=\"\" [matMenuTriggerFor]=\"buttonMenu\">\n <mat-icon>more_vertical</mat-icon>\n </button> -->\n <ng-container *ngIf=\"isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"completed\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <circle-progress class=\"flex items-center progress\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\" [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\"\n [animation]=\"true\" [animationDuration]=\"250\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n matTooltip=\"In progress\" [showZeroOuterStroke]=false [backgroundPadding]=\"-9\"\n [startFromZero]=\"false\" [backgroundPadding]=\"0\" [imageHeight]=\"22\" [imageWidth]=\"22\"\n [showBackground]=\"false\" [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n <!-- <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" class=\"progress-bar-thin\" [progress]=\"content?.completionPercentage\"\n [progressType]=\"'percentage'\">\n </ws-widget-content-progress> -->\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\" [showUnits]=\"false\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [backgroundPadding]=\"0\"\n [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\" matTooltip=\"Not started\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\" [imageHeight]=\"22\"\n [imageWidth]=\"22\" [showBackground]=\"false\"></circle-progress>\n <!-- <p>no data</p> -->\n </ng-template>\n </ng-container>\n </div>\n <!-- deactivated as per NIC CEO requirement to access course wthout login -->\n <!-- For locked assessments: show content but make it non-clickable -->\n <div class=\"width-expand\" *ngIf=\"isMilestoneAssessmentLocked && isEnrolled; else clickableContent\"\n [ngClass]=\"{'ml-3': isEnrolled}\">\n <div class=\"text-truncate opacity-60\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <div class=\"flex items-center gap-2 w-full\">\n <mat-icon class=\"text-gray-500\">lock</mat-icon>\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate text-gray-600\">\n {{ content?.name | truncate:50 }}\n </p>\n </div>\n <span class=\"content-type optional-span nodtranslate\" *ngIf=\"content?.optionalReading\">{{\n 'playerbrief.optional' | translate | titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier) || !isEnrolled\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n </div>\n \n <!-- Lock message displayed BELOW assessment details when locked -->\n <div class=\"content-locking flex w-full flex-middle mt-2 gap-2 px-2 py-1 bg-orange-50 border-l-4 border-orange-400\">\n <mat-icon class=\"lock-icon text-orange-600\" style=\"font-size: 18px; width: 18px; height: 18px;\">lock</mat-icon>\n <span class=\"lock-message mat-body-2 text-orange-800\" style=\"font-size: 13px;\">\n This content is locked. Complete all mandatory items to unlock the assessment.\n </span>\n </div>\n </div>\n \n <!-- Clickable content template (when NOT locked) -->\n <ng-template #clickableContent>\n <a class=\"width-expand\"\n [class.disabled]=\"(forPreview || !isEnabled || !isEnrolled || !isBatchInProgess || !isContentUnlocked || isParentMilestoneLocked) ? true : null\"\n [ngClass]=\"{'ml-3': isEnrolled}\"\n [routerLink]=\"(isAllowed && !forPreview && isEnabled && !isParentMilestoneLocked) ? resourceLink.url : null\"\n [queryParams]=\"(isAllowed && !forPreview && isEnabled && !isParentMilestoneLocked) ? resourceLink.queryParams : null\"\n [matTooltip]=\"isParentMilestoneLocked ? 'This content is locked. Complete previous milestone to view this content.' : ''\"\n matTooltipPosition=\"above\">\n <div [ngClass]=\"{'resource-active': pathSet?.has(content?.identifier) && isEnrolled}\"></div>\n <div class=\"text-truncate \" [ngClass]=\"{'cursor-pointer': !isEnabled && isEnrolled}\"\n (click)=\"content.viewChildren = !content.viewChildren; raiseTelemetry(); changeResource()\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content?.identifier) && isEnrolled}\">\n {{ content?.name | truncate:50 }}\n </p>\n <span class=\"content-type optional-span nodtranslate\" *ngIf=\"content?.optionalReading\">{{\n 'playerbrief.optional' | translate | titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier) || !isEnrolled\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- for white icons when content highlighted -->\n <ng-container *ngIf=\"pathSet?.has(content?.identifier) && isEnrolled\">\n <div class=\"resicons ws-mat-white-text\">\n <img src=\"/assets/icons/content/white/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/white/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/white/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <img src=\"/assets/icons/content/white/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/white/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/white/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/white/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Download button for pdf resources -->\n <ng-container *ngIf=\"shouldShowDownloadButton(content)\">\n <div class=\"download-btn mat-body-2 mt-2 sm:mt-1\" (click)=\"downloadContent(content, $event)\"\n [ngClass]=\"{'active': pathSet?.has(content?.identifier)}\">\n <a class=\"download-link flex items-center\">\n <span class=\"\">Download</span>\n </a>\n </div>\n </ng-container>\n </div>\n </a>\n </ng-template>\n </div>\n </div>\n</ng-container>\n\n<mat-menu #buttonMenu=\"matMenu\">\n <a mat-menu-item [routerLink]=\"'../' + content?.identifier + '/overview'\" [queryParams]=\"contextPath\"\n class=\"flex flex-middle\">\n <mat-icon>toc</mat-icon>\n <h3 class=\"margin-remove nodtranslate\">\n View Details\n </h3>\n </a>\n</mat-menu>\n\n<ng-template #collectionTemplate>\n <ng-container *ngIf=\"isCollection\">\n <div class=\"collection-wrapper p-4 flex flex-col position-relative\" [ngClass]=\"{'open': check(content),\n 'close': !content.viewChildren,\n 'course':!isModule, 'module': isModule,\n 'content-active': pathSet?.has(content.identifier) && isEnrolled}\">\n <div class=\"card-collection w-auto sm:w-100 padding-right-xl\">\n <!-- <img class=\"card-thumbnail ws-mat-primary-lite-background\" [src]=\"content?.appIcon\" alt=\"Thumbnail\"\n (click)=\"content.viewChildren = !content.viewChildren\" [wsUtilsDefaultThumbnail]=\"defaultThumbnail\" /> -->\n <div class=\"flex flex-col flex-wrap flex-between width-expand pr-0 w-100 \">\n <div class=\"text-truncate\" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"content.viewChildren = !content.viewChildren\">\n <div class=\"flex items-center justify-center mb-1 sm:flex-row\">\n <ng-container\n *ngIf=\"isModule && isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content.identifier) == 2\">\n <div class=\"completed mr-2\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <circle-progress class=\"flex items-center progress mr-1\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\"\n [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\" [animation]=\"true\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\"\n [backgroundStrokeWidth]=\"3\" matTooltip=\"In progress\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-7\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"18\" [imageWidth]=\"18\"\n [showBackground]=\"false\" [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress mr-1\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\"\n [showUnits]=\"false\" [animationDuration]=\"250\" [showTitle]=\"false\"\n [backgroundPadding]=\"0\" [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\"\n matTooltip=\"Not started\" [showSubtitle]=\"false\" [showInnerStroke]=\"true\"\n [clockwise]=\"true\" [imageHeight]=\"22\" [imageWidth]=\"22\"\n [showBackground]=\"false\"></circle-progress>\n </ng-template>\n </ng-container>\n <div\n [ngClass]=\"{'collection-active-class': pathSet?.has(content?.identifier) && isEnrolled}\">\n </div>\n <img *ngIf=\"isMilestoneLocked\" src=\"assets/icons/hubs/lock.svg\" alt=\"Locked\"\n class=\"lock-icon mr-2 margin-bottom-xxs\">\n <div class=\"flex-auto flex flex-col\" style=\"min-width: 0;\">\n <p class=\"margin-remove text-truncate mat-subheading-1 font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content.identifier) && isEnrolled}\">\n <span>{{isMilestone ? index -1 : index}}. </span>{{ content?.name | truncate:50 }}\n </p>\n <div class=\"mt-1\" *ngIf=\"isMilestone && isMilestoneLocked\">\n <span class=\"locked-text\">Locked</span>\n </div>\n <div class=\"mt-1\" *ngIf=\"content?.isMandatory\">\n <span class=\"mandatory-text mat-caption\">Mandatory</span>\n </div>\n </div>\n \n <div class=\"type-container resource mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Resource'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Resource</span>\n </div>\n <div class=\"type-container module mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Collection'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Module</span>\n </div>\n <div class=\"type-container course mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Course'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Course</span>\n </div>\n </div>\n <!-- Milestone Badge -->\n <div *ngIf=\"isMilestone\" class=\"milestone-badge mt-2 mb-2\">\n <span class=\"milestone-badge-text nodtranslate\">Milestone {{index - 1}}</span>\n </div>\n <!-- Milestone Description (3 lines with ellipsis) -->\n <p *ngIf=\"isMilestone && content?.description\" class=\"milestone-description mt-2 nodtranslate\">\n {{ content?.description }}\n </p>\n <div class=\"flex flex-row gap-3 items-center content-key-values mt-2\">\n <mat-icon *ngIf=\"!isModule\" alt=\"course\"\n class=\"time-icon icon-color\">video_library</mat-icon>\n <img *ngIf=\"isModule\" alt=\"Module\" class=\"time-icon\"\n src=\"/assets/icons/content/grey/module.svg\">\n <div class=\"text-xs nodtranslate\">{{ (hierarchyMapData[content?.identifier]?.duration ||\n 120)|\n pipeDurationTransform: 'hms' }}</div>\n\n <ng-container *ngIf=\"content?.moduleCount\">\n <div class=\"flex items-center\">\n <span class=\"period\"></span>\n </div>\n <div class=\"text-xs nodtranslate\">{{content?.moduleCount}} {{content?.moduleCount > 1?\n 'modules' :\n 'module'}}</div>\n </ng-container>\n <ng-container *ngIf=\"content?.leafNodesCount\">\n <div class=\"flex items-center\">\n <span class=\"period\"></span>\n </div>\n <div class=\"text-xs nodtranslate\">{{content?.leafNodesCount}} {{content?.leafNodesCount\n >1 ? 'items':\n 'item'}}</div>\n </ng-container>\n </div>\n <!-- Milestone Completion Progress -->\n <div *ngIf=\"isMilestone && isEnrolled && !isMilestoneLocked\" class=\"milestone-progress mt-2 flex items-center justify-between\">\n <div>\n <span class=\"milestone-progress-text nodtranslate\">{{getMilestoneCompletedCount()}} of\n {{content?.leafNodesCount || 0}} completed</span>\n </div>\n <!-- View Achievement Button for completed milestones - Outside clickable area -->\n <div *ngIf=\"isMilestone && isEnrolled && (getCompletionPercentage(content?.identifier) >= 100 || getCompletionStatus(content?.identifier) === 2)\"\n class=\"view-achievement-container mt-2\">\n <button type=\"button\" class=\"view-achievement-btn\" [disabled]=\"achievementLoading\"\n (click)=\"viewMilestoneAchievement($event)\">\n <span *ngIf=\"!achievementLoading\">View Achievement</span>\n <mat-spinner *ngIf=\"achievementLoading\" [diameter]=\"16\" \n [strokeWidth]=\"2\" color=\"primary\" class=\"inline-spinner\"></mat-spinner>\n </button>\n </div>\n </div>\n <!-- Unlock Criteria Message for Locked Milestones -->\n <div *ngIf=\"isMilestone && isEnrolled && isMilestoneLocked\" class=\"milestone-locked-message mt-2\">\n <span class=\"locked-criteria-text mat-caption\">\n {{ getMilestoneUnlockMessage() }}\n </span>\n </div>\n \n </div>\n <!-- For course progress to be shown -->\n <ng-container *ngIf=\"isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) && content.primaryCategory === 'Course'\">\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full \">\n <span class=\"mat-body-2 nodtranslate \">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n <!-- <circle-progress class=\"flex items-center progress\" [percent]=\"100\" [radius]=\"12\"\n [outerStrokeWidth]=\"3\" [innerStrokeWidth]=\"3\" [space]=\"-3\"\n [outerStrokeColor]=\"progressColor()\" [innerStrokeColor]=\"'rgba(0,0,0,.16)'\"\n [animation]=\"true\" [animationDuration]=\"300\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-9\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"24\" [imageWidth]=\"24\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress> -->\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text nodtranslate\">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div class=\"see-all-container\">\n <a href=\"javascript:void(0)\" role=\"button\"\n (click)=\"content.viewChildren = !content.viewChildren; expandActive = false\"\n class=\"see-all-btn tab custom-chevron customicon\" mat-button>\n <mat-icon *ngIf=\"!content.viewChildren && !isModule\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && !isModule\">keyboard_arrow_up</mat-icon>\n <mat-icon *ngIf=\"!content.viewChildren && isModule\">add</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && isModule\">remove</mat-icon>\n </a>\n </div>\n </div>\n </div>\n </div>\n <div class=\"child-wrapper \" *ngIf=\"content.viewChildren\" [ngClass]=\"{'open': content.viewChildren,\n 'close': !content.viewChildren,\n 'course':!isModule,\n 'module': isModule}\" [@panelInOut]>\n <div class=\"children-container\" [ngClass]=\"{'module': isModule, '': !isModule}\">\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [componentName]=\"componentName\"\n [content]=\"child\" [expandAll]=\"expandAll\" [rootId]=\"rootId\" [batchId]=\"batchId\"\n [rootContentType]=\"rootContentType\" [index]=\"j+1\" [baseContentReadData]=\"baseContentReadData\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [mlCourse]=\"mlCourse\" [parentMilestoneLocked]=\"isMilestoneLocked || isParentMilestoneLocked\"\n *ngFor=\"let child of content?.children; trackBy: contentTrackBy; let j= index;let isFirst = first\"\n [ngClass]=\"{'moduleCard': checkIsModule(child), 'resourceCard': !checkIsModule(child), 'first': isFirst}\">\n </ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n\n<ng-container *ngIf=\"isPreAssessment\">\n <div class=\"collection-wrapper p-4 flex flex-col position-relative\" [ngClass]=\"{'open': check(content),\n 'course':!isModule, 'module': isModule,\n 'content-active': pathSet?.has(content.identifier)}\">\n <div class=\"card-collection w-auto sm:w-100 padding-right-xl\">\n <!-- <img class=\"card-thumbnail ws-mat-primary-lite-background\" [src]=\"content?.appIcon\" alt=\"Thumbnail\"\n (click)=\"content.viewChildren = !content.viewChildren\" [wsUtilsDefaultThumbnail]=\"defaultThumbnail\" /> -->\n <div class=\"flex flex-col flex-wrap flex-between width-expand pr-0 w-100 \">\n\n <div class=\"text-truncate\" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"content.viewChildren = !content.viewChildren\">\n <div class=\"flex sm:flex-row flex-wrap\">\n <ng-container>\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content.identifier) == 2\">\n <div class=\"completed mr-2\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n\n <circle-progress class=\"flex items-center progress mr-1\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\" [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\"\n [animation]=\"true\" [animationDuration]=\"250\" [showTitle]=\"false\"\n [showUnits]=\"false\" [showSubtitle]=\"false\" [showInnerStroke]=\"true\"\n [clockwise]=\"true\" [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\"\n [backgroundStrokeWidth]=\"3\" matTooltip=\"In progress\" [showZeroOuterStroke]=false\n [backgroundPadding]=\"-7\" [startFromZero]=\"false\" [backgroundPadding]=\"0\"\n [imageHeight]=\"18\" [imageWidth]=\"18\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress mr-1\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\" [showUnits]=\"false\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [backgroundPadding]=\"0\"\n [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\" matTooltip=\"Not started\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [imageHeight]=\"22\" [imageWidth]=\"22\" [showBackground]=\"false\"></circle-progress>\n </ng-template>\n </ng-container>\n <div [ngClass]=\"{'collection-active-class': pathSet?.has(content?.identifier)}\"></div>\n <!-- <p class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content.identifier)}\">\n {{index}}. {{ content?.name | truncate:50 }}\n </p> -->\n <a class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [class.disabled]=\"null\" [ngClass]=\"{'ml-3': isEnrolled}\"\n [routerLink]=\"(isAllowed && !forPreview && isEnabled) ? resourceLink.url : null\"\n [queryParams]=\"computedQueryParams\">\n <!-- {{content?.courseCategory}} -->\n <div [ngClass]=\"{'resource-active': pathSet?.has(content?.identifier)}\"></div>\n <div class=\"text-truncate \" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"raiseTelemetry(); changeResource()\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content?.identifier)}\">\n <!-- <mat-icon class=\"margin-right-xs radiobtn time-icon\">radio_button_unchecked </mat-icon> -->\n {{index}}. {{ content?.name | truncate:50 }}\n\n </p>\n <span class=\"content-type optional-span nodtranslate\"\n *ngIf=\"content?.optionalReading\">{{ 'playerbrief.optional' | translate |\n titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier)\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/grey/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\"\n alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\"\n class=\"float-left margin-right-xs\" alt=\"offline sessions\"\n *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{\n content?.maxQuestions }} {{ 'playerbrief.questions' | translate |\n titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{\n (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- for white icons when content highlighted -->\n <ng-container *ngIf=\"pathSet?.has(content?.identifier)\">\n <div class=\"resicons ws-mat-white-text\">\n <img src=\"/assets/icons/content/white/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/white/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/white/pdf.svg\" alt=\"PDF\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/white/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/white/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/white/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/white/content_copy.svg\" class=\"contenticon\"\n alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/white/module.svg\"\n class=\"float-left margin-right-xs\" alt=\"offline sessions\"\n *ngIf=\"content.mimeType === 'application/offline'\">\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-white-text nodtranslate\">{{\n content?.maxQuestions }} {{ 'playerbrief.questions' | translate |\n titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-white-text nodtranslate\">{{\n (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </a>\n <!-- <div class=\"type-container resource mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Resource'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Resource</span>\n </div>\n <div class=\"type-container module mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Collection'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Module</span>\n </div>\n <div class=\"type-container course mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Course'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Course</span>\n </div> -->\n </div>\n\n </div>\n <!-- For course progress to be shown -->\n <ng-container>\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier)\">\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full \">\n <span class=\"mat-body-2 nodtranslate \">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n <!-- <circle-progress class=\"flex items-center progress\" [percent]=\"100\" [radius]=\"12\"\n [outerStrokeWidth]=\"3\" [innerStrokeWidth]=\"3\" [space]=\"-3\"\n [outerStrokeColor]=\"progressColor()\" [innerStrokeColor]=\"'rgba(0,0,0,.16)'\"\n [animation]=\"true\" [animationDuration]=\"300\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-9\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"24\" [imageWidth]=\"24\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress> -->\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text nodtranslate\">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- <div class=\"see-all-container\">\n <a href=\"javascript:void(0)\" role=\"button\"\n (click)=\"content.viewChildren = !content.viewChildren; expandActive = false\"\n class=\"see-all-btn tab custom-chevron customicon\" mat-button>\n <mat-icon *ngIf=\"!content.viewChildren && !isModule\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && !isModule\">keyboard_arrow_up</mat-icon>\n <mat-icon *ngIf=\"!content.viewChildren && isModule\">add</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && isModule\">remove</mat-icon>\n </a>\n </div> -->\n </div>\n </div>\n </div>\n\n</ng-container>", styles: [".customicon{position:absolute;top:-.5em;right:0}.customicon .mat-icon{color:#1a4ca1}a.disabled{pointer-events:none;cursor:default}span.optional-span{margin-left:8px;padding:0 6px;border-radius:2px;display:inline-block;background-color:#0074b6;color:#fff;font-size:12px}.card-collection{display:flex;align-items:center;border-radius:8px}.card-collection .card-thumbnail{height:100%;margin-right:12px;cursor:pointer;border-radius:8px 0 0}@media only screen and (max-width: 469px){.card-collection{flex-direction:column;align-items:flex-start!important}.card-collection .card-thumbnail{height:100%!important;width:100%!important}.card-collection .text-truncate{white-space:unset!important}}.tab:focus{outline:1px solid!important}.custom-chevron:focus{outline:0px solid!important}.resource-container{display:flex;align-items:flex-start;flex-direction:column}.resource-container .resource{padding:16px 16px 16px 0;width:100%}.resource-container .card-thumbnail{height:100%;cursor:pointer}.resource-container .img-container{position:relative;margin-right:12px}.resource-container .img-container ws-widget-content-progress{position:absolute;left:0;right:0;bottom:5px}@media only screen and (max-width: 469px){.resource-container{flex-direction:column;align-items:flex-start!important}.resource-container .card-thumbnail{height:100%!important;width:100%!important}.resource-container .text-truncate{white-space:unset!important}}.child-meta-container{margin-top:8px;display:flex}.child-meta-container .child-structure{display:flex;align-items:center;flex-wrap:wrap}.child-meta-container .child-structure span{margin-right:12px;text-align:center;margin-bottom:8px}.child-meta-container .child-structure .structure-icon{margin-right:12px}@media only screen and (max-width: 469px){.child-meta-container{margin-left:.5rem;justify-content:space-between}}.resource-container{display:flex;align-items:center}.resource-container ws-display-content-type-icon{display:flex;align-items:center}.resource-container .resource-meta{margin-left:12px;display:flex;justify-content:space-between;align-items:center}.completed-icon{color:#1a4ca1}.collection-wrapper{padding:1rem}.collection-wrapper.course.content-active{background-color:#1a4ca1;color:#fff}.collection-wrapper.course.content-active .period{background:#fff}.collection-wrapper.course.content-active .text-active,.collection-wrapper.course.content-active .icon-color,.collection-wrapper.course.content-active .customicon .mat-icon{color:#fff}.collection-wrapper.course.content-active .progress-container span{color:#fff!important}.text-active{color:#1a4ca1}.text-active.font-bold{font-weight:600}.activeResource{background-color:#1a4ca1;color:#fff;padding-top:1rem!important;padding-bottom:1rem!important}.activeResource .text-active{color:#fff}.activeResource .text-active.font-bold{font-weight:600}.activeResource .resourceDuration,.activeResource .completed-icon{color:#fff}.collection-wrapper.open{border-bottom:1px solid rgba(0,0,0,.16)}.collection-wrapper.close{border:none}.child-wrapper.open{border-radius:0 0 8px 8px}.children-container .mat-subheading-1{font:500 16px/24px Lato!important}.children-container .resource-container{margin-bottom:16px}.children-container .resource-container .resource{padding:0}.children-container .resource-container .card-thumbnail{height:65px;align-self:center}.first.resourceCard:nth-child(1) .resource{margin-top:16px!important}.first.resourceCard:nth-child(1) .activeResource{margin-top:0!important}.children-container .resourceCard:last-child .resource-container:has(.activeResource){margin-bottom:0!important}.moduleCard:not(:last-child)>.collection-wrapper.close.module{border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.moduleCard:not(:last-child)>.collection-wrapper.open.module+.child-wrapper.open{border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.collection-wrapper.open.course+.child-wrapper.open .collection-wrapper.open.module+.child-wrapper.open{background-color:#eff3f9;border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.collection-wrapper.open.module+.child-wrapper.open{background-color:#eff3f9;border-radius:0;padding-bottom:8px}.content-heading{letter-spacing:0px;color:#222}.content-type{letter-spacing:0px}.time-icon{height:16px;width:16px;font-size:16px;vertical-align:middle}.time-icon.icon-color{color:#0009}.period{width:3px;height:3px;background:#0009;border-radius:4px}.time-value{letter-spacing:0px;color:#222;text-transform:lowercase}.see-all-container{position:absolute;right:16px;top:24px}.oval-white{background:#fff 0% 0% no-repeat padding-box;border-radius:8px;padding:2px 8px}.type-container{letter-spacing:0px;display:flex;align-items:center}.type-container .rotate-90{transform:rotate(-90deg)}.type-container .custom-icon{width:18px;height:18px;font-size:18px;margin-right:8px}.type-container.resource{color:#00a9f4}.type-container.module{color:#34d6a4}.type-container.course{color:#f58634}.no-mb{margin-bottom:0!important}.w-100{width:100%}.w-auto{width:auto}.progress-bar-thin{height:5px!important}.progress-bar-thin ::ng-deep .mat-progress-bar{height:5px}.progress-bar-thin ::ng-deep .theme-igot.day-mode .mat-progress-bar-buffer{background-color:transparent!important}.progress-bar-thin ::ng-deep .theme-igot.day-mode .mat-progress-bar-background{fill:transparent}.radiobtn{color:#00000029}.resicons img{width:22px;opacity:.5;margin-top:2px;vertical-align:sub}.certificate-btn{height:24px;background:#1a4ca1;display:flex;justify-content:center;align-items:center;padding:4px 11px;color:#fff;border-radius:20px;border:1px solid white;font:400 12px/16px Lato;cursor:pointer}.certificate-btn .mat-icon{fill:#fff;color:#fff;font-size:16px;height:auto;width:auto}.view-certificate-wrapper{display:flex;border-radius:4px;border:1.5px solid rgb(0,116,182);opacity:1;padding:8px}.collection-wrapper.course,.collection-wrapper.module,.resource-container .resource{padding-left:16px;box-sizing:border-box;width:100%;overflow:hidden}.children-container.module .resource-container .resource,.course .collection-wrapper.module{padding-left:24px;box-sizing:border-box;width:100%}.course .children-container.module .resource-container .resource{padding-left:32px;box-sizing:border-box;width:100%}.course .resource-container .resource{padding-left:24px}::ng-deep .white-spinner{stroke:#fff!important}.certificate-loader ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.lock-message{background:#fff4ec;color:#d13924;padding:10px;border-radius:4px;display:block!important;width:100%}.content-locking{padding:8px 12px;margin-top:8px;margin-left:0;margin-right:0;border-radius:4px;background:#fff4ec;display:flex!important;align-items:center;gap:8px;width:100%;box-sizing:border-box}.lock-icon{color:#f3962f;font-size:20px;flex-shrink:0}.unlock-message{background:#efffec;color:#0c9600;padding:10px}.unlock-icon{color:#0c9600}.download-btn{padding:4px 12px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;cursor:pointer;border-radius:40px;color:#1b4ca1;font-weight:700;border:1px solid #1B4CA1;display:inline-block;pointer-events:auto;position:relative;z-index:1}.activeResource .download-btn.active{color:#fff;border:1px solid #fff}.milestone-badge{display:inline-block;background-color:#fefaf4;border:1px solid #EF951E;border-radius:16px;padding:2px 12px}.milestone-badge-text{font-size:12px;font-weight:500;color:#212121}.milestone-description{font-size:14px;line-height:1.5;color:#000000b3;margin:0;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.milestone-progress{display:flex;align-items:center}.milestone-progress-text{font-size:14px;font-weight:500;color:#0009}.milestone-locked-message{display:flex;align-items:center;padding:8px 12px;background-color:#f3962f1a;border-left:3px solid #F3962F;border-radius:4px}.locked-criteria-text{font-size:13px;font-weight:400;color:#000000b3;line-height:1.4}.locked-text{font-size:14px;font-weight:500;color:#f3962f}.mandatory-text{color:#d13924!important}.view-achievement-container{display:flex;align-items:center}.view-achievement-btn{background-color:transparent;border:1.5px solid #1a4ca1;color:#1a4ca1;border-radius:20px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:8px;transition:all .2s ease;min-width:150px}.view-achievement-btn:hover:not(:disabled){background-color:#1a4ca1;color:#fff}.view-achievement-btn:disabled{opacity:.6;cursor:not-allowed}.view-achievement-btn .inline-spinner{display:inline-block}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i11.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "component", type: i12.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i13.ContentProgressComponent, selector: "ws-widget-content-progress", inputs: ["contentId", "progress", "progressType", "forPreview", "className", "customClassName"] }, { kind: "component", type: i14.CircleProgressComponent, selector: "circle-progress", inputs: ["name", "class", "backgroundGradient", "backgroundColor", "backgroundGradientStopColor", "backgroundOpacity", "backgroundStroke", "backgroundStrokeWidth", "backgroundPadding", "radius", "space", "percent", "toFixed", "maxPercent", "renderOnClick", "units", "unitsFontSize", "unitsFontWeight", "unitsColor", "outerStrokeGradient", "outerStrokeWidth", "outerStrokeColor", "outerStrokeGradientStopColor", "outerStrokeLinecap", "innerStrokeColor", "innerStrokeWidth", "titleFormat", "title", "titleColor", "titleFontSize", "titleFontWeight", "subtitleFormat", "subtitle", "subtitleColor", "subtitleFontSize", "subtitleFontWeight", "imageSrc", "imageHeight", "imageWidth", "animation", "animateTitle", "animateSubtitle", "animationDuration", "showTitle", "showSubtitle", "showUnits", "showImage", "showBackground", "showInnerStroke", "clockwise", "responsive", "startFromZero", "showZeroOuterStroke", "lazy", "options"], outputs: ["onClick"] }, { kind: "directive", type: i15.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: AppTocContentCardV2Component, selector: "ws-widget-app-toc-content-card-v2", inputs: ["content", "expandAll", "rootId", "rootContentType", "forPreview", "batchId", "componentName", "index", "pathSet", "expandActive", "hierarchyMapData", "batchData", "isPreAssessment", "baseContentReadData", "mlCourse", "parentMilestoneLocked"] }, { kind: "pipe", type: i8.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1.PipeDurationTransformPipe, name: "pipeDurationTransform" }, { kind: "pipe", type: i16.TranslatePipe, name: "translate" }, { kind: "pipe", type: i17.TruncatePipe, name: "truncate" }], animations: [
973
1120
  trigger('panelInOut', [
974
1121
  transition('void => *', [
975
1122
  style({ transform: 'translateY(-10%)', opacity: '0' }),
@@ -993,8 +1140,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
993
1140
  animate(200, style({ transform: 'translateY(-10%)', opacity: '0' }))
994
1141
  ])
995
1142
  ])
996
- ], template: "<ng-container *ngIf=\"content && !isPreAssessment\">\n <ng-container *ngIf=\"isCollection && !isModule\">\n <ng-container [ngTemplateOutlet]=\"collectionTemplate\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isCollection && isModule\">\n <ng-container *ngIf=\"content?.moduleResourseCount\">\n <ng-container [ngTemplateOutlet]=\"collectionTemplate\">\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"isResource\" class=\"resource-container\"\n [ngClass]=\"pathSet?.has(content?.identifier) && isEnrolled ? 'content-active-resource': 'content-not-active-resource'\">\n <div class=\"resource flex sm:flex-row flex-start width-expand w-100 sm:pr-4 sm:w-auto\"\n [ngClass]=\"{'activeResource': pathSet?.has(content?.identifier) && isEnrolled}\">\n <!-- Lock message for curated programs only (shown above content) -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.FINAL_ASSESSMENT && checkForCuratedProgram &&\n !isContentUnlocked\">\n <div class=\"content-locking flex w-full flex-middle mb-2 gap-3\">\n <mat-icon class=\"lock-icon\">lock</mat-icon>\n <span class=\"lock-message mat-body-2\">\n The content is locked. Complete program or all courses to view this module\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.FINAL_ASSESSMENT && checkForCuratedProgram &&\n isContentUnlocked\">\n <div class=\"content-locking flex w-full flex-middle mb-2 gap-3\">\n <mat-icon class=\"unlock-icon\">lock_open_right</mat-icon>\n <span class=\"unlock-message mat-body-2\">\n This content is unlocked.\n </span>\n </div>\n </ng-container>\n <div class=\"flex flex-wrap items-start justify-start sm:justify-end\">\n <!-- <button *ngIf=\"!forPreview && content?.artifactUrl && !isXSmall && isAllowed && isEnabled\" type=\"button\"\n mat-icon-button class=\"\" [matMenuTriggerFor]=\"buttonMenu\">\n <mat-icon>more_vertical</mat-icon>\n </button> -->\n <ng-container *ngIf=\"isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"completed\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <circle-progress class=\"flex items-center progress\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\" [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\"\n [animation]=\"true\" [animationDuration]=\"250\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n matTooltip=\"In progress\" [showZeroOuterStroke]=false [backgroundPadding]=\"-9\"\n [startFromZero]=\"false\" [backgroundPadding]=\"0\" [imageHeight]=\"22\" [imageWidth]=\"22\"\n [showBackground]=\"false\" [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n <!-- <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" class=\"progress-bar-thin\" [progress]=\"content?.completionPercentage\"\n [progressType]=\"'percentage'\">\n </ws-widget-content-progress> -->\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\" [showUnits]=\"false\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [backgroundPadding]=\"0\"\n [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\" matTooltip=\"Not started\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\" [imageHeight]=\"22\"\n [imageWidth]=\"22\" [showBackground]=\"false\"></circle-progress>\n <!-- <p>no data</p> -->\n </ng-template>\n </ng-container>\n </div>\n <!-- deactivated as per NIC CEO requirement to access course wthout login -->\n <a class=\"width-expand\"\n [class.disabled]=\"(forPreview || !isEnabled || !isEnrolled || !isBatchInProgess || !isContentUnlocked || isParentMilestoneLocked || isMilestoneAssessmentLocked) ? true : null\"\n [ngClass]=\"{'ml-3': isEnrolled}\"\n [routerLink]=\"(isAllowed && !forPreview && isEnabled && !isParentMilestoneLocked && !isMilestoneAssessmentLocked) ? resourceLink.url : null\"\n [queryParams]=\"(isAllowed && !forPreview && isEnabled && !isParentMilestoneLocked && !isMilestoneAssessmentLocked) ? resourceLink.queryParams : null\"\n [matTooltip]=\"isParentMilestoneLocked ? 'This content is locked. Complete previous milestone to view this content.' : (isMilestoneAssessmentLocked ? 'This content is locked. Complete all mandatory items to unlock the assessment.' : '')\"\n matTooltipPosition=\"above\">\n <div [ngClass]=\"{'resource-active': pathSet?.has(content?.identifier) && isEnrolled}\"></div>\n <div class=\"text-truncate \" [ngClass]=\"{'cursor-pointer': !isEnabled && isEnrolled}\"\n (click)=\"content.viewChildren = !content.viewChildren; raiseTelemetry(); changeResource()\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content?.identifier) && isEnrolled}\">\n <!-- <mat-icon class=\"margin-right-xs radiobtn time-icon\">radio_button_unchecked </mat-icon> -->\n {{ content?.name | truncate:50 }}\n\n </p>\n <span class=\"content-type optional-span nodtranslate\" *ngIf=\"content?.optionalReading\">{{\n 'playerbrief.optional' | translate | titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier) || !isEnrolled\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/grey/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- for white icons when content highlighted -->\n <ng-container *ngIf=\"pathSet?.has(content?.identifier) && isEnrolled\">\n <div class=\"resicons ws-mat-white-text\">\n <img src=\"/assets/icons/content/white/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/white/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/white/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/white/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/white/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/white/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/white/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/white/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Download button for pdf resources -->\n <ng-container *ngIf=\"shouldShowDownloadButton(content)\">\n <div class=\"download-btn mat-body-2 mt-2 sm:mt-1\" (click)=\"downloadContent(content, $event)\"\n [ngClass]=\"{'active': pathSet?.has(content?.identifier)}\">\n <a class=\"download-link flex items-center\">\n <span class=\"\">Download</span>\n </a>\n </div>\n </ng-container>\n </div>\n </a>\n \n <!-- Lock messages shown below content name (outside anchor tag) -->\n <!-- Lock message for resources in locked milestones -->\n <ng-container *ngIf=\"isParentMilestoneLocked && isEnrolled\">\n <div class=\"content-locking flex w-full flex-middle mt-2 gap-3\">\n <mat-icon class=\"lock-icon\">lock</mat-icon>\n <span class=\"lock-message mat-body-2\">\n This content is locked. Complete previous milestone to view this content.\n </span>\n </div>\n </ng-container>\n <!-- Lock message for milestone assessments when mandatory content not completed -->\n <ng-container *ngIf=\"isMilestoneAssessmentLocked && isEnrolled && !isParentMilestoneLocked\">\n <div class=\"content-locking flex w-full flex-middle mt-2 gap-3\">\n <mat-icon class=\"lock-icon\">lock</mat-icon>\n <span class=\"lock-message mat-body-2\">\n This content is locked. Complete all mandatory items to unlock the assessment.\n </span>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-container>\n\n<mat-menu #buttonMenu=\"matMenu\">\n <a mat-menu-item [routerLink]=\"'../' + content?.identifier + '/overview'\" [queryParams]=\"contextPath\"\n class=\"flex flex-middle\">\n <mat-icon>toc</mat-icon>\n <h3 class=\"margin-remove nodtranslate\">\n View Details\n </h3>\n </a>\n</mat-menu>\n\n<ng-template #collectionTemplate>\n <ng-container *ngIf=\"isCollection\">\n <div class=\"collection-wrapper p-4 flex flex-col position-relative\" [ngClass]=\"{'open': check(content),\n 'close': !content.viewChildren,\n 'course':!isModule, 'module': isModule,\n 'content-active': pathSet?.has(content.identifier) && isEnrolled}\">\n <div class=\"card-collection w-auto sm:w-100 padding-right-xl\">\n <!-- <img class=\"card-thumbnail ws-mat-primary-lite-background\" [src]=\"content?.appIcon\" alt=\"Thumbnail\"\n (click)=\"content.viewChildren = !content.viewChildren\" [wsUtilsDefaultThumbnail]=\"defaultThumbnail\" /> -->\n <div class=\"flex flex-col flex-wrap flex-between width-expand pr-0 w-100 \">\n <div class=\"text-truncate\" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"content.viewChildren = !content.viewChildren\">\n <div class=\"flex items-center justify-center mb-1 sm:flex-row\">\n <ng-container\n *ngIf=\"isModule && isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content.identifier) == 2\">\n <div class=\"completed mr-2\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <circle-progress class=\"flex items-center progress mr-1\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\"\n [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\" [animation]=\"true\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\"\n [backgroundStrokeWidth]=\"3\" matTooltip=\"In progress\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-7\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"18\" [imageWidth]=\"18\"\n [showBackground]=\"false\" [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress mr-1\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\"\n [showUnits]=\"false\" [animationDuration]=\"250\" [showTitle]=\"false\"\n [backgroundPadding]=\"0\" [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\"\n matTooltip=\"Not started\" [showSubtitle]=\"false\" [showInnerStroke]=\"true\"\n [clockwise]=\"true\" [imageHeight]=\"22\" [imageWidth]=\"22\"\n [showBackground]=\"false\"></circle-progress>\n </ng-template>\n </ng-container>\n <div\n [ngClass]=\"{'collection-active-class': pathSet?.has(content?.identifier) && isEnrolled}\">\n </div>\n <img *ngIf=\"isMilestoneLocked\" src=\"assets/icons/hubs/lock.svg\" alt=\"Locked\"\n class=\"lock-icon mr-2 margin-bottom-xxs\">\n <p class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content.identifier) && isEnrolled}\">\n <span>{{isMilestone ? index -1 : index}}. </span>{{ content?.name | truncate:50 }}\n <ng-container *ngIf=\"isMilestone\">\n <span *ngIf=\"isMilestoneLocked\" class=\"locked-text ml-2\">Locked</span>\n </ng-container>\n <span *ngIf=\"content?.isMandatory\"\n class=\"mandatory-text mat-caption ml-2\">Mandatory</span>\n </p>\n <div class=\"type-container resource mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Resource'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Resource</span>\n </div>\n <div class=\"type-container module mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Collection'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Module</span>\n </div>\n <div class=\"type-container course mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Course'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Course</span>\n </div>\n </div>\n <!-- Milestone Badge -->\n <div *ngIf=\"isMilestone\" class=\"milestone-badge mt-2 mb-2\">\n <span class=\"milestone-badge-text nodtranslate\">Milestone {{index - 1}}</span>\n </div>\n <!-- Milestone Description (3 lines with ellipsis) -->\n <p *ngIf=\"isMilestone && content?.description\" class=\"milestone-description mt-2 nodtranslate\">\n {{ content?.description }}\n </p>\n <div class=\"flex flex-row gap-3 items-center content-key-values mt-2\">\n <mat-icon *ngIf=\"!isModule\" alt=\"course\"\n class=\"time-icon icon-color\">video_library</mat-icon>\n <img *ngIf=\"isModule\" alt=\"Module\" class=\"time-icon\"\n src=\"/assets/icons/content/grey/module.svg\">\n <div class=\"text-xs nodtranslate\">{{ (hierarchyMapData[content?.identifier]?.duration ||\n 120)|\n pipeDurationTransform: 'hms' }}</div>\n\n <ng-container *ngIf=\"content?.moduleCount\">\n <div class=\"flex items-center\">\n <span class=\"period\"></span>\n </div>\n <div class=\"text-xs nodtranslate\">{{content?.moduleCount}} {{content?.moduleCount > 1?\n 'modules' :\n 'module'}}</div>\n </ng-container>\n <ng-container *ngIf=\"content?.leafNodesCount\">\n <div class=\"flex items-center\">\n <span class=\"period\"></span>\n </div>\n <div class=\"text-xs nodtranslate\">{{content?.leafNodesCount}} {{content?.leafNodesCount\n >1 ? 'items':\n 'item'}}</div>\n </ng-container>\n </div>\n <!-- Milestone Completion Progress -->\n <div *ngIf=\"isMilestone && isEnrolled && !isMilestoneLocked\" class=\"milestone-progress mt-2\">\n <span class=\"milestone-progress-text nodtranslate\">{{getMilestoneCompletedCount()}} of\n {{content?.leafNodesCount || 0}} completed</span>\n </div>\n <!-- Unlock Criteria Message for Locked Milestones -->\n <div *ngIf=\"isMilestone && isEnrolled && isMilestoneLocked\" class=\"milestone-locked-message mt-2\">\n <span class=\"locked-criteria-text mat-caption\">\n {{ getMilestoneUnlockMessage() }}\n </span>\n </div>\n <!-- View Achievement Button for completed milestones -->\n <div *ngIf=\"isMilestone && isEnrolled && (getCompletionPercentage(content?.identifier) >= 100 || getCompletionStatus(content?.identifier) === 2)\"\n class=\"view-achievement-container mt-2\">\n <button type=\"button\" class=\"view-achievement-btn\" [disabled]=\"achievementLoading\"\n (click)=\"viewMilestoneAchievement($event)\">\n <span *ngIf=\"!achievementLoading\">View Achievement</span>\n <mat-spinner *ngIf=\"achievementLoading\" [diameter]=\"16\"\n class=\"inline-spinner\"></mat-spinner>\n </button>\n </div>\n </div>\n <!-- For course progress to be shown -->\n <ng-container *ngIf=\"isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) && content.primaryCategory === 'Course'\">\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full \">\n <span class=\"mat-body-2 nodtranslate \">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n <!-- <circle-progress class=\"flex items-center progress\" [percent]=\"100\" [radius]=\"12\"\n [outerStrokeWidth]=\"3\" [innerStrokeWidth]=\"3\" [space]=\"-3\"\n [outerStrokeColor]=\"progressColor()\" [innerStrokeColor]=\"'rgba(0,0,0,.16)'\"\n [animation]=\"true\" [animationDuration]=\"300\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-9\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"24\" [imageWidth]=\"24\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress> -->\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text nodtranslate\">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div class=\"see-all-container\">\n <a href=\"javascript:void(0)\" role=\"button\"\n (click)=\"content.viewChildren = !content.viewChildren; expandActive = false\"\n class=\"see-all-btn tab custom-chevron customicon\" mat-button>\n <mat-icon *ngIf=\"!content.viewChildren && !isModule\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && !isModule\">keyboard_arrow_up</mat-icon>\n <mat-icon *ngIf=\"!content.viewChildren && isModule\">add</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && isModule\">remove</mat-icon>\n </a>\n </div>\n </div>\n </div>\n </div>\n <div class=\"child-wrapper \" *ngIf=\"content.viewChildren\" [ngClass]=\"{'open': content.viewChildren,\n 'close': !content.viewChildren,\n 'course':!isModule,\n 'module': isModule}\" [@panelInOut]>\n <div class=\"children-container\" [ngClass]=\"{'module': isModule, '': !isModule}\">\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [componentName]=\"componentName\"\n [content]=\"child\" [expandAll]=\"expandAll\" [rootId]=\"rootId\" [batchId]=\"batchId\"\n [rootContentType]=\"rootContentType\" [index]=\"j+1\" [baseContentReadData]=\"baseContentReadData\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [mlCourse]=\"mlCourse\" [parentMilestoneLocked]=\"isMilestoneLocked || isParentMilestoneLocked\"\n *ngFor=\"let child of content?.children; trackBy: contentTrackBy; let j= index;let isFirst = first\"\n [ngClass]=\"{'moduleCard': checkIsModule(child), 'resourceCard': !checkIsModule(child), 'first': isFirst}\">\n </ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n\n<ng-container *ngIf=\"isPreAssessment\">\n <div class=\"collection-wrapper p-4 flex flex-col position-relative\" [ngClass]=\"{'open': check(content),\n 'course':!isModule, 'module': isModule,\n 'content-active': pathSet?.has(content.identifier)}\">\n <div class=\"card-collection w-auto sm:w-100 padding-right-xl\">\n <!-- <img class=\"card-thumbnail ws-mat-primary-lite-background\" [src]=\"content?.appIcon\" alt=\"Thumbnail\"\n (click)=\"content.viewChildren = !content.viewChildren\" [wsUtilsDefaultThumbnail]=\"defaultThumbnail\" /> -->\n <div class=\"flex flex-col flex-wrap flex-between width-expand pr-0 w-100 \">\n\n <div class=\"text-truncate\" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"content.viewChildren = !content.viewChildren\">\n <div class=\"flex sm:flex-row flex-wrap\">\n <ng-container>\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content.identifier) == 2\">\n <div class=\"completed mr-2\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n\n <circle-progress class=\"flex items-center progress mr-1\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\" [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\"\n [animation]=\"true\" [animationDuration]=\"250\" [showTitle]=\"false\"\n [showUnits]=\"false\" [showSubtitle]=\"false\" [showInnerStroke]=\"true\"\n [clockwise]=\"true\" [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\"\n [backgroundStrokeWidth]=\"3\" matTooltip=\"In progress\" [showZeroOuterStroke]=false\n [backgroundPadding]=\"-7\" [startFromZero]=\"false\" [backgroundPadding]=\"0\"\n [imageHeight]=\"18\" [imageWidth]=\"18\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress mr-1\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\" [showUnits]=\"false\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [backgroundPadding]=\"0\"\n [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\" matTooltip=\"Not started\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [imageHeight]=\"22\" [imageWidth]=\"22\" [showBackground]=\"false\"></circle-progress>\n </ng-template>\n </ng-container>\n <div [ngClass]=\"{'collection-active-class': pathSet?.has(content?.identifier)}\"></div>\n <!-- <p class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content.identifier)}\">\n {{index}}. {{ content?.name | truncate:50 }}\n </p> -->\n <a class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [class.disabled]=\"null\" [ngClass]=\"{'ml-3': isEnrolled}\"\n [routerLink]=\"(isAllowed && !forPreview && isEnabled) ? resourceLink.url : null\"\n [queryParams]=\"computedQueryParams\">\n <!-- {{content?.courseCategory}} -->\n <div [ngClass]=\"{'resource-active': pathSet?.has(content?.identifier)}\"></div>\n <div class=\"text-truncate \" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"raiseTelemetry(); changeResource()\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content?.identifier)}\">\n <!-- <mat-icon class=\"margin-right-xs radiobtn time-icon\">radio_button_unchecked </mat-icon> -->\n {{index}}. {{ content?.name | truncate:50 }}\n\n </p>\n <span class=\"content-type optional-span nodtranslate\"\n *ngIf=\"content?.optionalReading\">{{ 'playerbrief.optional' | translate |\n titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier)\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/grey/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\"\n alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\"\n class=\"float-left margin-right-xs\" alt=\"offline sessions\"\n *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{\n content?.maxQuestions }} {{ 'playerbrief.questions' | translate |\n titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{\n (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- for white icons when content highlighted -->\n <ng-container *ngIf=\"pathSet?.has(content?.identifier)\">\n <div class=\"resicons ws-mat-white-text\">\n <img src=\"/assets/icons/content/white/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/white/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/white/pdf.svg\" alt=\"PDF\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/white/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/white/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/white/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/white/content_copy.svg\" class=\"contenticon\"\n alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/white/module.svg\"\n class=\"float-left margin-right-xs\" alt=\"offline sessions\"\n *ngIf=\"content.mimeType === 'application/offline'\">\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-white-text nodtranslate\">{{\n content?.maxQuestions }} {{ 'playerbrief.questions' | translate |\n titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-white-text nodtranslate\">{{\n (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </a>\n <!-- <div class=\"type-container resource mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Resource'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Resource</span>\n </div>\n <div class=\"type-container module mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Collection'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Module</span>\n </div>\n <div class=\"type-container course mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Course'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Course</span>\n </div> -->\n </div>\n\n </div>\n <!-- For course progress to be shown -->\n <ng-container>\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier)\">\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full \">\n <span class=\"mat-body-2 nodtranslate \">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n <!-- <circle-progress class=\"flex items-center progress\" [percent]=\"100\" [radius]=\"12\"\n [outerStrokeWidth]=\"3\" [innerStrokeWidth]=\"3\" [space]=\"-3\"\n [outerStrokeColor]=\"progressColor()\" [innerStrokeColor]=\"'rgba(0,0,0,.16)'\"\n [animation]=\"true\" [animationDuration]=\"300\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-9\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"24\" [imageWidth]=\"24\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress> -->\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text nodtranslate\">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- <div class=\"see-all-container\">\n <a href=\"javascript:void(0)\" role=\"button\"\n (click)=\"content.viewChildren = !content.viewChildren; expandActive = false\"\n class=\"see-all-btn tab custom-chevron customicon\" mat-button>\n <mat-icon *ngIf=\"!content.viewChildren && !isModule\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && !isModule\">keyboard_arrow_up</mat-icon>\n <mat-icon *ngIf=\"!content.viewChildren && isModule\">add</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && isModule\">remove</mat-icon>\n </a>\n </div> -->\n </div>\n </div>\n </div>\n\n</ng-container>", styles: [".customicon{position:absolute;top:-.5em;right:0}.customicon .mat-icon{color:#1a4ca1}a.disabled{pointer-events:none;cursor:default}span.optional-span{margin-left:8px;padding:0 6px;border-radius:2px;display:inline-block;background-color:#0074b6;color:#fff;font-size:12px}.card-collection{display:flex;align-items:center;border-radius:8px}.card-collection .card-thumbnail{height:100%;margin-right:12px;cursor:pointer;border-radius:8px 0 0}@media only screen and (max-width: 469px){.card-collection{flex-direction:column;align-items:flex-start!important}.card-collection .card-thumbnail{height:100%!important;width:100%!important}.card-collection .text-truncate{white-space:unset!important}}.tab:focus{outline:1px solid!important}.custom-chevron:focus{outline:0px solid!important}.resource-container{display:flex;align-items:flex-start;flex-direction:column}.resource-container .resource{padding:16px 16px 16px 0;width:100%}.resource-container .card-thumbnail{height:100%;cursor:pointer}.resource-container .img-container{position:relative;margin-right:12px}.resource-container .img-container ws-widget-content-progress{position:absolute;left:0;right:0;bottom:5px}@media only screen and (max-width: 469px){.resource-container{flex-direction:column;align-items:flex-start!important}.resource-container .card-thumbnail{height:100%!important;width:100%!important}.resource-container .text-truncate{white-space:unset!important}}.child-meta-container{margin-top:8px;display:flex}.child-meta-container .child-structure{display:flex;align-items:center;flex-wrap:wrap}.child-meta-container .child-structure span{margin-right:12px;text-align:center;margin-bottom:8px}.child-meta-container .child-structure .structure-icon{margin-right:12px}@media only screen and (max-width: 469px){.child-meta-container{margin-left:.5rem;justify-content:space-between}}.resource-container{display:flex;align-items:center}.resource-container ws-display-content-type-icon{display:flex;align-items:center}.resource-container .resource-meta{margin-left:12px;display:flex;justify-content:space-between;align-items:center}.completed-icon{color:#1a4ca1}.collection-wrapper{padding:1rem}.collection-wrapper.course.content-active{background-color:#1a4ca1;color:#fff}.collection-wrapper.course.content-active .period{background:#fff}.collection-wrapper.course.content-active .text-active,.collection-wrapper.course.content-active .icon-color,.collection-wrapper.course.content-active .customicon .mat-icon{color:#fff}.collection-wrapper.course.content-active .progress-container span{color:#fff!important}.text-active{color:#1a4ca1}.text-active.font-bold{font-weight:600}.activeResource{background-color:#1a4ca1;color:#fff;padding-top:1rem!important;padding-bottom:1rem!important}.activeResource .text-active{color:#fff}.activeResource .text-active.font-bold{font-weight:600}.activeResource .resourceDuration,.activeResource .completed-icon{color:#fff}.collection-wrapper.open{border-bottom:1px solid rgba(0,0,0,.16)}.collection-wrapper.close{border:none}.child-wrapper.open{border-radius:0 0 8px 8px}.children-container .mat-subheading-1{font:500 16px/24px Lato!important}.children-container .resource-container{margin-bottom:16px}.children-container .resource-container .resource{padding:0}.children-container .resource-container .card-thumbnail{height:65px;align-self:center}.first.resourceCard:nth-child(1) .resource{margin-top:16px!important}.first.resourceCard:nth-child(1) .activeResource{margin-top:0!important}.children-container .resourceCard:last-child .resource-container:has(.activeResource){margin-bottom:0!important}.moduleCard:not(:last-child)>.collection-wrapper.close.module{border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.moduleCard:not(:last-child)>.collection-wrapper.open.module+.child-wrapper.open{border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.collection-wrapper.open.course+.child-wrapper.open .collection-wrapper.open.module+.child-wrapper.open{background-color:#eff3f9;border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.collection-wrapper.open.module+.child-wrapper.open{background-color:#eff3f9;border-radius:0;padding-bottom:8px}.content-heading{letter-spacing:0px;color:#222}.content-type{letter-spacing:0px}.time-icon{height:16px;width:16px;font-size:16px;vertical-align:middle}.time-icon.icon-color{color:#0009}.period{width:3px;height:3px;background:#0009;border-radius:4px}.time-value{letter-spacing:0px;color:#222;text-transform:lowercase}.see-all-container{position:absolute;right:16px;top:24px}.oval-white{background:#fff 0% 0% no-repeat padding-box;border-radius:8px;padding:2px 8px}.type-container{letter-spacing:0px;display:flex;align-items:center}.type-container .rotate-90{transform:rotate(-90deg)}.type-container .custom-icon{width:18px;height:18px;font-size:18px;margin-right:8px}.type-container.resource{color:#00a9f4}.type-container.module{color:#34d6a4}.type-container.course{color:#f58634}.no-mb{margin-bottom:0!important}.w-100{width:100%}.w-auto{width:auto}.progress-bar-thin{height:5px!important}.progress-bar-thin ::ng-deep .mat-progress-bar{height:5px}.progress-bar-thin ::ng-deep .theme-igot.day-mode .mat-progress-bar-buffer{background-color:transparent!important}.progress-bar-thin ::ng-deep .theme-igot.day-mode .mat-progress-bar-background{fill:transparent}.radiobtn{color:#00000029}.resicons img{width:22px;opacity:.5;margin-top:2px;vertical-align:sub}.certificate-btn{height:24px;background:#1a4ca1;display:flex;justify-content:center;align-items:center;padding:4px 11px;color:#fff;border-radius:20px;border:1px solid white;font:400 12px/16px Lato;cursor:pointer}.certificate-btn .mat-icon{fill:#fff;color:#fff;font-size:16px;height:auto;width:auto}.view-certificate-wrapper{display:flex;border-radius:4px;border:1.5px solid rgb(0,116,182);opacity:1;padding:8px}.collection-wrapper.course,.collection-wrapper.module,.resource-container .resource{padding-left:16px;box-sizing:border-box;width:100%;overflow:hidden}.children-container.module .resource-container .resource,.course .collection-wrapper.module{padding-left:24px;box-sizing:border-box;width:100%}.course .children-container.module .resource-container .resource{padding-left:32px;box-sizing:border-box;width:100%}.course .resource-container .resource{padding-left:24px}::ng-deep .white-spinner{stroke:#fff!important}.certificate-loader ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.lock-message{background:#fff4ec;color:#d13924;padding:10px;border-radius:4px;display:block!important;width:100%}.content-locking{padding:8px 12px;margin-top:8px;margin-left:0;margin-right:0;border-radius:4px;background:#fff4ec;display:flex!important;align-items:center;gap:8px;width:100%;box-sizing:border-box}.lock-icon{color:#f3962f;font-size:20px;flex-shrink:0}.unlock-message{background:#efffec;color:#0c9600;padding:10px}.unlock-icon{color:#0c9600}.download-btn{padding:4px 12px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;cursor:pointer;border-radius:40px;color:#1b4ca1;font-weight:700;border:1px solid #1B4CA1;display:inline-block;pointer-events:auto;position:relative;z-index:1}.activeResource .download-btn.active{color:#fff;border:1px solid #fff}.milestone-badge{display:inline-block;background-color:#fefaf4;border:1px solid #EF951E;border-radius:16px;padding:2px 12px}.milestone-badge-text{font-size:12px;font-weight:500;color:#212121}.milestone-description{font-size:14px;line-height:1.5;color:#000000b3;margin:0;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.milestone-progress{display:flex;align-items:center}.milestone-progress-text{font-size:14px;font-weight:500;color:#0009}.milestone-locked-message{display:flex;align-items:center;padding:8px 12px;background-color:#f3962f1a;border-left:3px solid #F3962F;border-radius:4px}.locked-criteria-text{font-size:13px;font-weight:400;color:#000000b3;line-height:1.4}.locked-text{font-size:14px;font-weight:500;color:#f3962f}.mandatory-text{color:#d13924!important}.view-achievement-container{display:flex;align-items:center}.view-achievement-btn{background-color:transparent;border:1.5px solid #1a4ca1;color:#1a4ca1;border-radius:20px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:8px;transition:all .2s ease}.view-achievement-btn:hover:not(:disabled){background-color:#1a4ca1;color:#fff}.view-achievement-btn:disabled{opacity:.6;cursor:not-allowed}.view-achievement-btn .inline-spinner{display:inline-block}\n"] }]
997
- }], ctorParameters: function () { return [{ type: i1.EventService }, { type: i2.MatLegacyDialog }, { type: i0.Renderer2 }, { type: i3.CertificateService }, { type: i4.AppTocService }, { type: i5.ContentLanguageService }, { type: i6.ResourceDownloadHelperService }]; }, propDecorators: { content: [{
1143
+ ], template: "<ng-container *ngIf=\"content && !isPreAssessment\">\n <ng-container *ngIf=\"isCollection && !isModule\">\n <ng-container [ngTemplateOutlet]=\"collectionTemplate\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isCollection && isModule\">\n <ng-container *ngIf=\"content?.moduleResourseCount\">\n <ng-container [ngTemplateOutlet]=\"collectionTemplate\">\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div *ngIf=\"isResource\" class=\"resource-container\"\n [ngClass]=\"pathSet?.has(content?.identifier) && isEnrolled ? 'content-active-resource': 'content-not-active-resource'\">\n <div class=\"resource flex sm:flex-row flex-start width-expand w-100 sm:pr-4 sm:w-auto\"\n [ngClass]=\"{'activeResource': pathSet?.has(content?.identifier) && isEnrolled}\">\n <!-- Lock message for curated programs only (shown above content) -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.FINAL_ASSESSMENT && checkForCuratedProgram &&\n !isContentUnlocked\">\n <div class=\"content-locking flex w-full flex-middle mb-2 gap-3\">\n <mat-icon class=\"lock-icon\">lock</mat-icon>\n <span class=\"lock-message mat-body-2\">\n The content is locked. Complete program or all courses to view this module\n </span>\n </div>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.FINAL_ASSESSMENT && checkForCuratedProgram &&\n isContentUnlocked\">\n <div class=\"content-locking flex w-full flex-middle mb-2 gap-3\">\n <mat-icon class=\"unlock-icon\">lock_open_right</mat-icon>\n <span class=\"unlock-message mat-body-2\">\n This content is unlocked.\n </span>\n </div>\n </ng-container>\n <div class=\"flex flex-wrap items-start justify-start sm:justify-end\">\n <!-- <button *ngIf=\"!forPreview && content?.artifactUrl && !isXSmall && isAllowed && isEnabled\" type=\"button\"\n mat-icon-button class=\"\" [matMenuTriggerFor]=\"buttonMenu\">\n <mat-icon>more_vertical</mat-icon>\n </button> -->\n <ng-container *ngIf=\"isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"completed\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <circle-progress class=\"flex items-center progress\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\" [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\"\n [animation]=\"true\" [animationDuration]=\"250\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n matTooltip=\"In progress\" [showZeroOuterStroke]=false [backgroundPadding]=\"-9\"\n [startFromZero]=\"false\" [backgroundPadding]=\"0\" [imageHeight]=\"22\" [imageWidth]=\"22\"\n [showBackground]=\"false\" [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n <!-- <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" class=\"progress-bar-thin\" [progress]=\"content?.completionPercentage\"\n [progressType]=\"'percentage'\">\n </ws-widget-content-progress> -->\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\" [showUnits]=\"false\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [backgroundPadding]=\"0\"\n [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\" matTooltip=\"Not started\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\" [imageHeight]=\"22\"\n [imageWidth]=\"22\" [showBackground]=\"false\"></circle-progress>\n <!-- <p>no data</p> -->\n </ng-template>\n </ng-container>\n </div>\n <!-- deactivated as per NIC CEO requirement to access course wthout login -->\n <!-- For locked assessments: show content but make it non-clickable -->\n <div class=\"width-expand\" *ngIf=\"isMilestoneAssessmentLocked && isEnrolled; else clickableContent\"\n [ngClass]=\"{'ml-3': isEnrolled}\">\n <div class=\"text-truncate opacity-60\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <div class=\"flex items-center gap-2 w-full\">\n <mat-icon class=\"text-gray-500\">lock</mat-icon>\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate text-gray-600\">\n {{ content?.name | truncate:50 }}\n </p>\n </div>\n <span class=\"content-type optional-span nodtranslate\" *ngIf=\"content?.optionalReading\">{{\n 'playerbrief.optional' | translate | titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier) || !isEnrolled\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n </div>\n \n <!-- Lock message displayed BELOW assessment details when locked -->\n <div class=\"content-locking flex w-full flex-middle mt-2 gap-2 px-2 py-1 bg-orange-50 border-l-4 border-orange-400\">\n <mat-icon class=\"lock-icon text-orange-600\" style=\"font-size: 18px; width: 18px; height: 18px;\">lock</mat-icon>\n <span class=\"lock-message mat-body-2 text-orange-800\" style=\"font-size: 13px;\">\n This content is locked. Complete all mandatory items to unlock the assessment.\n </span>\n </div>\n </div>\n \n <!-- Clickable content template (when NOT locked) -->\n <ng-template #clickableContent>\n <a class=\"width-expand\"\n [class.disabled]=\"(forPreview || !isEnabled || !isEnrolled || !isBatchInProgess || !isContentUnlocked || isParentMilestoneLocked) ? true : null\"\n [ngClass]=\"{'ml-3': isEnrolled}\"\n [routerLink]=\"(isAllowed && !forPreview && isEnabled && !isParentMilestoneLocked) ? resourceLink.url : null\"\n [queryParams]=\"(isAllowed && !forPreview && isEnabled && !isParentMilestoneLocked) ? resourceLink.queryParams : null\"\n [matTooltip]=\"isParentMilestoneLocked ? 'This content is locked. Complete previous milestone to view this content.' : ''\"\n matTooltipPosition=\"above\">\n <div [ngClass]=\"{'resource-active': pathSet?.has(content?.identifier) && isEnrolled}\"></div>\n <div class=\"text-truncate \" [ngClass]=\"{'cursor-pointer': !isEnabled && isEnrolled}\"\n (click)=\"content.viewChildren = !content.viewChildren; raiseTelemetry(); changeResource()\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content?.identifier) && isEnrolled}\">\n {{ content?.name | truncate:50 }}\n </p>\n <span class=\"content-type optional-span nodtranslate\" *ngIf=\"content?.optionalReading\">{{\n 'playerbrief.optional' | translate | titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier) || !isEnrolled\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- for white icons when content highlighted -->\n <ng-container *ngIf=\"pathSet?.has(content?.identifier) && isEnrolled\">\n <div class=\"resicons ws-mat-white-text\">\n <img src=\"/assets/icons/content/white/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/white/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/white/pdf.svg\" alt=\"PDF\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <img src=\"/assets/icons/content/white/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/white/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/white/content_copy.svg\" class=\"contenticon\" alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/white/module.svg\" class=\"float-left margin-right-xs\"\n alt=\"offline sessions\" *ngIf=\"content.mimeType === 'application/offline'\">\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ content?.maxQuestions\n }} {{ 'playerbrief.questions' | translate | titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{ (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- Download button for pdf resources -->\n <ng-container *ngIf=\"shouldShowDownloadButton(content)\">\n <div class=\"download-btn mat-body-2 mt-2 sm:mt-1\" (click)=\"downloadContent(content, $event)\"\n [ngClass]=\"{'active': pathSet?.has(content?.identifier)}\">\n <a class=\"download-link flex items-center\">\n <span class=\"\">Download</span>\n </a>\n </div>\n </ng-container>\n </div>\n </a>\n </ng-template>\n </div>\n </div>\n</ng-container>\n\n<mat-menu #buttonMenu=\"matMenu\">\n <a mat-menu-item [routerLink]=\"'../' + content?.identifier + '/overview'\" [queryParams]=\"contextPath\"\n class=\"flex flex-middle\">\n <mat-icon>toc</mat-icon>\n <h3 class=\"margin-remove nodtranslate\">\n View Details\n </h3>\n </a>\n</mat-menu>\n\n<ng-template #collectionTemplate>\n <ng-container *ngIf=\"isCollection\">\n <div class=\"collection-wrapper p-4 flex flex-col position-relative\" [ngClass]=\"{'open': check(content),\n 'close': !content.viewChildren,\n 'course':!isModule, 'module': isModule,\n 'content-active': pathSet?.has(content.identifier) && isEnrolled}\">\n <div class=\"card-collection w-auto sm:w-100 padding-right-xl\">\n <!-- <img class=\"card-thumbnail ws-mat-primary-lite-background\" [src]=\"content?.appIcon\" alt=\"Thumbnail\"\n (click)=\"content.viewChildren = !content.viewChildren\" [wsUtilsDefaultThumbnail]=\"defaultThumbnail\" /> -->\n <div class=\"flex flex-col flex-wrap flex-between width-expand pr-0 w-100 \">\n <div class=\"text-truncate\" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"content.viewChildren = !content.viewChildren\">\n <div class=\"flex items-center justify-center mb-1 sm:flex-row\">\n <ng-container\n *ngIf=\"isModule && isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content.identifier) == 2\">\n <div class=\"completed mr-2\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <circle-progress class=\"flex items-center progress mr-1\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\"\n [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\" [animation]=\"true\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\"\n [backgroundStrokeWidth]=\"3\" matTooltip=\"In progress\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-7\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"18\" [imageWidth]=\"18\"\n [showBackground]=\"false\" [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress mr-1\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\"\n [showUnits]=\"false\" [animationDuration]=\"250\" [showTitle]=\"false\"\n [backgroundPadding]=\"0\" [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\"\n matTooltip=\"Not started\" [showSubtitle]=\"false\" [showInnerStroke]=\"true\"\n [clockwise]=\"true\" [imageHeight]=\"22\" [imageWidth]=\"22\"\n [showBackground]=\"false\"></circle-progress>\n </ng-template>\n </ng-container>\n <div\n [ngClass]=\"{'collection-active-class': pathSet?.has(content?.identifier) && isEnrolled}\">\n </div>\n <img *ngIf=\"isMilestoneLocked\" src=\"assets/icons/hubs/lock.svg\" alt=\"Locked\"\n class=\"lock-icon mr-2 margin-bottom-xxs\">\n <div class=\"flex-auto flex flex-col\" style=\"min-width: 0;\">\n <p class=\"margin-remove text-truncate mat-subheading-1 font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content.identifier) && isEnrolled}\">\n <span>{{isMilestone ? index -1 : index}}. </span>{{ content?.name | truncate:50 }}\n </p>\n <div class=\"mt-1\" *ngIf=\"isMilestone && isMilestoneLocked\">\n <span class=\"locked-text\">Locked</span>\n </div>\n <div class=\"mt-1\" *ngIf=\"content?.isMandatory\">\n <span class=\"mandatory-text mat-caption\">Mandatory</span>\n </div>\n </div>\n \n <div class=\"type-container resource mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Resource'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Resource</span>\n </div>\n <div class=\"type-container module mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Collection'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Module</span>\n </div>\n <div class=\"type-container course mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Course'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Course</span>\n </div>\n </div>\n <!-- Milestone Badge -->\n <div *ngIf=\"isMilestone\" class=\"milestone-badge mt-2 mb-2\">\n <span class=\"milestone-badge-text nodtranslate\">Milestone {{index - 1}}</span>\n </div>\n <!-- Milestone Description (3 lines with ellipsis) -->\n <p *ngIf=\"isMilestone && content?.description\" class=\"milestone-description mt-2 nodtranslate\">\n {{ content?.description }}\n </p>\n <div class=\"flex flex-row gap-3 items-center content-key-values mt-2\">\n <mat-icon *ngIf=\"!isModule\" alt=\"course\"\n class=\"time-icon icon-color\">video_library</mat-icon>\n <img *ngIf=\"isModule\" alt=\"Module\" class=\"time-icon\"\n src=\"/assets/icons/content/grey/module.svg\">\n <div class=\"text-xs nodtranslate\">{{ (hierarchyMapData[content?.identifier]?.duration ||\n 120)|\n pipeDurationTransform: 'hms' }}</div>\n\n <ng-container *ngIf=\"content?.moduleCount\">\n <div class=\"flex items-center\">\n <span class=\"period\"></span>\n </div>\n <div class=\"text-xs nodtranslate\">{{content?.moduleCount}} {{content?.moduleCount > 1?\n 'modules' :\n 'module'}}</div>\n </ng-container>\n <ng-container *ngIf=\"content?.leafNodesCount\">\n <div class=\"flex items-center\">\n <span class=\"period\"></span>\n </div>\n <div class=\"text-xs nodtranslate\">{{content?.leafNodesCount}} {{content?.leafNodesCount\n >1 ? 'items':\n 'item'}}</div>\n </ng-container>\n </div>\n <!-- Milestone Completion Progress -->\n <div *ngIf=\"isMilestone && isEnrolled && !isMilestoneLocked\" class=\"milestone-progress mt-2 flex items-center justify-between\">\n <div>\n <span class=\"milestone-progress-text nodtranslate\">{{getMilestoneCompletedCount()}} of\n {{content?.leafNodesCount || 0}} completed</span>\n </div>\n <!-- View Achievement Button for completed milestones - Outside clickable area -->\n <div *ngIf=\"isMilestone && isEnrolled && (getCompletionPercentage(content?.identifier) >= 100 || getCompletionStatus(content?.identifier) === 2)\"\n class=\"view-achievement-container mt-2\">\n <button type=\"button\" class=\"view-achievement-btn\" [disabled]=\"achievementLoading\"\n (click)=\"viewMilestoneAchievement($event)\">\n <span *ngIf=\"!achievementLoading\">View Achievement</span>\n <mat-spinner *ngIf=\"achievementLoading\" [diameter]=\"16\" \n [strokeWidth]=\"2\" color=\"primary\" class=\"inline-spinner\"></mat-spinner>\n </button>\n </div>\n </div>\n <!-- Unlock Criteria Message for Locked Milestones -->\n <div *ngIf=\"isMilestone && isEnrolled && isMilestoneLocked\" class=\"milestone-locked-message mt-2\">\n <span class=\"locked-criteria-text mat-caption\">\n {{ getMilestoneUnlockMessage() }}\n </span>\n </div>\n \n </div>\n <!-- For course progress to be shown -->\n <ng-container *ngIf=\"isEnrolled && !isMilestoneLocked && !isParentMilestoneLocked\">\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) && content.primaryCategory === 'Course'\">\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full \">\n <span class=\"mat-body-2 nodtranslate \">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n <!-- <circle-progress class=\"flex items-center progress\" [percent]=\"100\" [radius]=\"12\"\n [outerStrokeWidth]=\"3\" [innerStrokeWidth]=\"3\" [space]=\"-3\"\n [outerStrokeColor]=\"progressColor()\" [innerStrokeColor]=\"'rgba(0,0,0,.16)'\"\n [animation]=\"true\" [animationDuration]=\"300\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-9\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"24\" [imageWidth]=\"24\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress> -->\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text nodtranslate\">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <div class=\"see-all-container\">\n <a href=\"javascript:void(0)\" role=\"button\"\n (click)=\"content.viewChildren = !content.viewChildren; expandActive = false\"\n class=\"see-all-btn tab custom-chevron customicon\" mat-button>\n <mat-icon *ngIf=\"!content.viewChildren && !isModule\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && !isModule\">keyboard_arrow_up</mat-icon>\n <mat-icon *ngIf=\"!content.viewChildren && isModule\">add</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && isModule\">remove</mat-icon>\n </a>\n </div>\n </div>\n </div>\n </div>\n <div class=\"child-wrapper \" *ngIf=\"content.viewChildren\" [ngClass]=\"{'open': content.viewChildren,\n 'close': !content.viewChildren,\n 'course':!isModule,\n 'module': isModule}\" [@panelInOut]>\n <div class=\"children-container\" [ngClass]=\"{'module': isModule, '': !isModule}\">\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [componentName]=\"componentName\"\n [content]=\"child\" [expandAll]=\"expandAll\" [rootId]=\"rootId\" [batchId]=\"batchId\"\n [rootContentType]=\"rootContentType\" [index]=\"j+1\" [baseContentReadData]=\"baseContentReadData\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [mlCourse]=\"mlCourse\" [parentMilestoneLocked]=\"isMilestoneLocked || isParentMilestoneLocked\"\n *ngFor=\"let child of content?.children; trackBy: contentTrackBy; let j= index;let isFirst = first\"\n [ngClass]=\"{'moduleCard': checkIsModule(child), 'resourceCard': !checkIsModule(child), 'first': isFirst}\">\n </ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n\n<ng-container *ngIf=\"isPreAssessment\">\n <div class=\"collection-wrapper p-4 flex flex-col position-relative\" [ngClass]=\"{'open': check(content),\n 'course':!isModule, 'module': isModule,\n 'content-active': pathSet?.has(content.identifier)}\">\n <div class=\"card-collection w-auto sm:w-100 padding-right-xl\">\n <!-- <img class=\"card-thumbnail ws-mat-primary-lite-background\" [src]=\"content?.appIcon\" alt=\"Thumbnail\"\n (click)=\"content.viewChildren = !content.viewChildren\" [wsUtilsDefaultThumbnail]=\"defaultThumbnail\" /> -->\n <div class=\"flex flex-col flex-wrap flex-between width-expand pr-0 w-100 \">\n\n <div class=\"text-truncate\" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"content.viewChildren = !content.viewChildren\">\n <div class=\"flex sm:flex-row flex-wrap\">\n <ng-container>\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier) ; else elseBlock\">\n\n <ng-container *ngIf=\"getCompletionStatus(content.identifier) == 2\">\n <div class=\"completed mr-2\">\n <div>\n <mat-icon class=\"completed-icon\" [color]=\"blue\">check_circle</mat-icon>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n\n <circle-progress class=\"flex items-center progress mr-1\"\n [percent]=\"getCompletionPercentage(content?.identifier)\" [radius]=\"10\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [space]=\"-2\"\n [outerStrokeColor]=\"progressColor2()\" [innerStrokeColor]=\"'rgba(0, 0, 0, 0.16)'\"\n [animation]=\"true\" [animationDuration]=\"250\" [showTitle]=\"false\"\n [showUnits]=\"false\" [showSubtitle]=\"false\" [showInnerStroke]=\"true\"\n [clockwise]=\"true\" [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\"\n [backgroundStrokeWidth]=\"3\" matTooltip=\"In progress\" [showZeroOuterStroke]=false\n [backgroundPadding]=\"-7\" [startFromZero]=\"false\" [backgroundPadding]=\"0\"\n [imageHeight]=\"18\" [imageWidth]=\"18\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress>\n </ng-container>\n </ng-container>\n <ng-template #elseBlock>\n <circle-progress class=\"flex items-center progress mr-1\" [percent]=\"0\" [radius]=\"11\"\n [outerStrokeWidth]=\"2\" [innerStrokeWidth]=\"2\" [outerStrokeColor]=\"'#808080'\"\n [innerStrokeColor]=\"'#808080'\" [animation]=\"true\" [space]=\"-2\" [showUnits]=\"false\"\n [animationDuration]=\"250\" [showTitle]=\"false\" [backgroundPadding]=\"0\"\n [backgroundPadding]=\"-9\" [outerStrokeLinecap]=\"'butt'\" matTooltip=\"Not started\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [imageHeight]=\"22\" [imageWidth]=\"22\" [showBackground]=\"false\"></circle-progress>\n </ng-template>\n </ng-container>\n <div [ngClass]=\"{'collection-active-class': pathSet?.has(content?.identifier)}\"></div>\n <!-- <p class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content.identifier)}\">\n {{index}}. {{ content?.name | truncate:50 }}\n </p> -->\n <a class=\"margin-remove text-truncate mat-subheading-1 flex-auto font-bold nodtranslate\"\n [class.disabled]=\"null\" [ngClass]=\"{'ml-3': isEnrolled}\"\n [routerLink]=\"(isAllowed && !forPreview && isEnabled) ? resourceLink.url : null\"\n [queryParams]=\"computedQueryParams\">\n <!-- {{content?.courseCategory}} -->\n <div [ngClass]=\"{'resource-active': pathSet?.has(content?.identifier)}\"></div>\n <div class=\"text-truncate \" [ngClass]=\"{'cursor-pointer': !isEnabled}\"\n (click)=\"raiseTelemetry(); changeResource()\">\n <div class=\"flex flex-col sm:flex-row flex-wrap\">\n <p class=\"margin-remove text-truncate mat-body-2 flex-auto font-bold nodtranslate\"\n [ngClass]=\"{'text-active': pathSet?.has(content?.identifier)}\">\n <!-- <mat-icon class=\"margin-right-xs radiobtn time-icon\">radio_button_unchecked </mat-icon> -->\n {{index}}. {{ content?.name | truncate:50 }}\n\n </p>\n <span class=\"content-type optional-span nodtranslate\"\n *ngIf=\"content?.optionalReading\">{{ 'playerbrief.optional' | translate |\n titlecase}} </span>\n </div>\n <!-- for default grey icons -->\n <ng-container *ngIf=\"!pathSet?.has(content?.identifier)\">\n <div class=\"resicons ws-mat-black60-text\">\n <img src=\"/assets/icons/content/grey/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/grey/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/grey/pdf.svg\" alt=\"PDF\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/grey/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/grey/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/grey/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/grey/content_copy.svg\" class=\"contenticon\"\n alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/grey/module.svg\"\n class=\"float-left margin-right-xs\" alt=\"offline sessions\"\n *ngIf=\"content.mimeType === 'application/offline'\">\n\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{\n content?.maxQuestions }} {{ 'playerbrief.questions' | translate |\n titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-black60-text nodtranslate\">{{\n (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- for white icons when content highlighted -->\n <ng-container *ngIf=\"pathSet?.has(content?.identifier)\">\n <div class=\"resicons ws-mat-white-text\">\n <img src=\"/assets/icons/content/white/video.svg\" alt=\"Video\"\n class=\"float-left margin-right-xs\" *ngIf=\"content?.mimeType === 'video/mp4' || content?.mimeType === 'video/x-youtube' ||\n content?.mimeType ==='application/x-mpegURL'\">\n <img src=\"/assets/icons/content/white/audio.svg\" alt=\"Audio\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'audio/mpeg'\">\n <img src=\"/assets/icons/content/white/pdf.svg\" alt=\"PDF\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/pdf'\">\n <!-- <img src=\"/assets/icons/content/white/resource.svg\" alt=\"Survey\" class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/survey'\"> -->\n <img src=\"/assets/icons/content/white/link.svg\" alt=\"InteractiveContent\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/vnd.ekstep.html-archive' || content?.mimeType === 'text/x-url'\">\n <img src=\"/assets/icons/content/white/assessment.svg\" alt=\"Assessment\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'application/json' || content?.mimeType === 'application/quiz' || content?.mimeType === 'application/vnd.sunbird.questionset'\">\n <img src=\"/assets/icons/content/grey/image.svg\" alt=\"Image\"\n class=\"float-left margin-right-xs\"\n *ngIf=\"content?.mimeType === 'image/png' || content?.mimeType === 'image/jpeg'\">\n <img src=\"/assets/icons/content/white/content_copy.svg\" class=\"contenticon\"\n alt=\"Course\"\n *ngIf=\"content.mimeType === 'application/vnd.ekstep.content-collection' || content?.mimeType === 'application/survey'\">\n <img src=\"/assets/icons/content/white/module.svg\"\n class=\"float-left margin-right-xs\" alt=\"offline sessions\"\n *ngIf=\"content.mimeType === 'application/offline'\">\n <ng-container *ngIf=\"content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE\">\n <span class=\"resourceDuration ws-mat-white-text nodtranslate\">{{\n content?.maxQuestions }} {{ 'playerbrief.questions' | translate |\n titlecase}}</span>\n </ng-container>\n <ng-container *ngIf=\"!(content.primaryCategory === primaryCategory.FINAL_ASSESSMENT ||\n content.primaryCategory === primaryCategory.COMP_ASSESSMENT ||\n content.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT ||\n content.primaryCategory === primaryCategory.PRACTICE_RESOURCE)\">\n <span class=\"resourceDuration ws-mat-white-text nodtranslate\">{{\n (content?.duration||\n hierarchyMapData[content?.identifier]?.expectedDuration || 0)|\n pipeDurationTransform:\n 'hms'\n }}</span>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </a>\n <!-- <div class=\"type-container resource mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Resource'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Resource</span>\n </div>\n <div class=\"type-container module mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Collection'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Module</span>\n </div>\n <div class=\"type-container course mt-2 sm:mt-0\" *ngIf=\"content?.category === 'Course'\">\n <mat-icon class=\"mr-1 custom-icon rotate-90\">call_to_action</mat-icon>\n <span class=\"nodtranslate\">Course</span>\n </div> -->\n </div>\n\n </div>\n <!-- For course progress to be shown -->\n <ng-container>\n <ng-container\n *ngIf=\"!forPreview && content?.identifier && getCompletionPercentage(content?.identifier)\">\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) == 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full \">\n <span class=\"mat-body-2 nodtranslate \">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n <!-- <circle-progress class=\"flex items-center progress\" [percent]=\"100\" [radius]=\"12\"\n [outerStrokeWidth]=\"3\" [innerStrokeWidth]=\"3\" [space]=\"-3\"\n [outerStrokeColor]=\"progressColor()\" [innerStrokeColor]=\"'rgba(0,0,0,.16)'\"\n [animation]=\"true\" [animationDuration]=\"300\" [showTitle]=\"false\" [showUnits]=\"false\"\n [showSubtitle]=\"false\" [showInnerStroke]=\"true\" [clockwise]=\"true\"\n [backgroundOpacity]=\"0\" [backgroundGradient]=\"false\" [backgroundStrokeWidth]=\"3\"\n [showZeroOuterStroke]=false [backgroundPadding]=\"-9\" [startFromZero]=\"false\"\n [backgroundPadding]=\"0\" [imageHeight]=\"24\" [imageWidth]=\"24\" [showBackground]=\"false\"\n [outerStrokeLinecap]=\"'butt'\">\n </circle-progress> -->\n </ng-container>\n <ng-container *ngIf=\"getCompletionStatus(content?.identifier) < 2\">\n <div class=\"flex flex-1\">\n <div class=\"mt-2 mr-4 flex flex-1 flex-col progress-container\">\n <div class=\"flex flex-row justify-end w-full ws-mat-black-text\">\n <span class=\"mat-body-2 ws-mat-black-text nodtranslate\">\n {{getCompletionPercentage(content?.identifier)}}%</span>\n </div>\n\n <ws-widget-content-progress [contentId]=\"content?.progress\"\n [progress]=\"getCompletionPercentage(content?.identifier)\"\n [progressType]=\"'percentage'\" [customClassName]=\"'viewer-progress'\">\n </ws-widget-content-progress>\n </div>\n <ng-container *ngIf=\"content?.issuedCertificatesId\">\n <a class=\"ml-5 certificate-btn\"\n [ngClass]=\"{'disable-btn': downloadCertificateLoading || content?.issuedCertificatesId}\"\n (click)=\"!downloadCertificateLoading && downloadCertificate(content?.issuedCertificatesId);$event.stopPropagation()\">\n <!-- <img src=\"fusion-assets/images/certificate-ico.svg\" width=\"24\" height=\"24\"> -->\n <span class=\"nodtranslate\">Certificate</span>\n <mat-icon *ngIf=\"!downloadCertificateLoading\"\n class=\"ml-2\">arrow_downward</mat-icon>\n <div class=\"center flex flex-middle certificate-loader\"\n *ngIf=\"downloadCertificateLoading\">\n <mat-spinner strokeWidth=\"2\" stroke=\"'white'\" class=\"white-spinner\"\n [diameter]=\"16\"></mat-spinner>\n </div>\n </a>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- <div class=\"see-all-container\">\n <a href=\"javascript:void(0)\" role=\"button\"\n (click)=\"content.viewChildren = !content.viewChildren; expandActive = false\"\n class=\"see-all-btn tab custom-chevron customicon\" mat-button>\n <mat-icon *ngIf=\"!content.viewChildren && !isModule\">keyboard_arrow_down</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && !isModule\">keyboard_arrow_up</mat-icon>\n <mat-icon *ngIf=\"!content.viewChildren && isModule\">add</mat-icon>\n <mat-icon *ngIf=\"content.viewChildren && isModule\">remove</mat-icon>\n </a>\n </div> -->\n </div>\n </div>\n </div>\n\n</ng-container>", styles: [".customicon{position:absolute;top:-.5em;right:0}.customicon .mat-icon{color:#1a4ca1}a.disabled{pointer-events:none;cursor:default}span.optional-span{margin-left:8px;padding:0 6px;border-radius:2px;display:inline-block;background-color:#0074b6;color:#fff;font-size:12px}.card-collection{display:flex;align-items:center;border-radius:8px}.card-collection .card-thumbnail{height:100%;margin-right:12px;cursor:pointer;border-radius:8px 0 0}@media only screen and (max-width: 469px){.card-collection{flex-direction:column;align-items:flex-start!important}.card-collection .card-thumbnail{height:100%!important;width:100%!important}.card-collection .text-truncate{white-space:unset!important}}.tab:focus{outline:1px solid!important}.custom-chevron:focus{outline:0px solid!important}.resource-container{display:flex;align-items:flex-start;flex-direction:column}.resource-container .resource{padding:16px 16px 16px 0;width:100%}.resource-container .card-thumbnail{height:100%;cursor:pointer}.resource-container .img-container{position:relative;margin-right:12px}.resource-container .img-container ws-widget-content-progress{position:absolute;left:0;right:0;bottom:5px}@media only screen and (max-width: 469px){.resource-container{flex-direction:column;align-items:flex-start!important}.resource-container .card-thumbnail{height:100%!important;width:100%!important}.resource-container .text-truncate{white-space:unset!important}}.child-meta-container{margin-top:8px;display:flex}.child-meta-container .child-structure{display:flex;align-items:center;flex-wrap:wrap}.child-meta-container .child-structure span{margin-right:12px;text-align:center;margin-bottom:8px}.child-meta-container .child-structure .structure-icon{margin-right:12px}@media only screen and (max-width: 469px){.child-meta-container{margin-left:.5rem;justify-content:space-between}}.resource-container{display:flex;align-items:center}.resource-container ws-display-content-type-icon{display:flex;align-items:center}.resource-container .resource-meta{margin-left:12px;display:flex;justify-content:space-between;align-items:center}.completed-icon{color:#1a4ca1}.collection-wrapper{padding:1rem}.collection-wrapper.course.content-active{background-color:#1a4ca1;color:#fff}.collection-wrapper.course.content-active .period{background:#fff}.collection-wrapper.course.content-active .text-active,.collection-wrapper.course.content-active .icon-color,.collection-wrapper.course.content-active .customicon .mat-icon{color:#fff}.collection-wrapper.course.content-active .progress-container span{color:#fff!important}.text-active{color:#1a4ca1}.text-active.font-bold{font-weight:600}.activeResource{background-color:#1a4ca1;color:#fff;padding-top:1rem!important;padding-bottom:1rem!important}.activeResource .text-active{color:#fff}.activeResource .text-active.font-bold{font-weight:600}.activeResource .resourceDuration,.activeResource .completed-icon{color:#fff}.collection-wrapper.open{border-bottom:1px solid rgba(0,0,0,.16)}.collection-wrapper.close{border:none}.child-wrapper.open{border-radius:0 0 8px 8px}.children-container .mat-subheading-1{font:500 16px/24px Lato!important}.children-container .resource-container{margin-bottom:16px}.children-container .resource-container .resource{padding:0}.children-container .resource-container .card-thumbnail{height:65px;align-self:center}.first.resourceCard:nth-child(1) .resource{margin-top:16px!important}.first.resourceCard:nth-child(1) .activeResource{margin-top:0!important}.children-container .resourceCard:last-child .resource-container:has(.activeResource){margin-bottom:0!important}.moduleCard:not(:last-child)>.collection-wrapper.close.module{border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.moduleCard:not(:last-child)>.collection-wrapper.open.module+.child-wrapper.open{border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.collection-wrapper.open.course+.child-wrapper.open .collection-wrapper.open.module+.child-wrapper.open{background-color:#eff3f9;border-bottom:4px solid rgba(0,0,0,.08);border-radius:0}.collection-wrapper.open.module+.child-wrapper.open{background-color:#eff3f9;border-radius:0;padding-bottom:8px}.content-heading{letter-spacing:0px;color:#222}.content-type{letter-spacing:0px}.time-icon{height:16px;width:16px;font-size:16px;vertical-align:middle}.time-icon.icon-color{color:#0009}.period{width:3px;height:3px;background:#0009;border-radius:4px}.time-value{letter-spacing:0px;color:#222;text-transform:lowercase}.see-all-container{position:absolute;right:16px;top:24px}.oval-white{background:#fff 0% 0% no-repeat padding-box;border-radius:8px;padding:2px 8px}.type-container{letter-spacing:0px;display:flex;align-items:center}.type-container .rotate-90{transform:rotate(-90deg)}.type-container .custom-icon{width:18px;height:18px;font-size:18px;margin-right:8px}.type-container.resource{color:#00a9f4}.type-container.module{color:#34d6a4}.type-container.course{color:#f58634}.no-mb{margin-bottom:0!important}.w-100{width:100%}.w-auto{width:auto}.progress-bar-thin{height:5px!important}.progress-bar-thin ::ng-deep .mat-progress-bar{height:5px}.progress-bar-thin ::ng-deep .theme-igot.day-mode .mat-progress-bar-buffer{background-color:transparent!important}.progress-bar-thin ::ng-deep .theme-igot.day-mode .mat-progress-bar-background{fill:transparent}.radiobtn{color:#00000029}.resicons img{width:22px;opacity:.5;margin-top:2px;vertical-align:sub}.certificate-btn{height:24px;background:#1a4ca1;display:flex;justify-content:center;align-items:center;padding:4px 11px;color:#fff;border-radius:20px;border:1px solid white;font:400 12px/16px Lato;cursor:pointer}.certificate-btn .mat-icon{fill:#fff;color:#fff;font-size:16px;height:auto;width:auto}.view-certificate-wrapper{display:flex;border-radius:4px;border:1.5px solid rgb(0,116,182);opacity:1;padding:8px}.collection-wrapper.course,.collection-wrapper.module,.resource-container .resource{padding-left:16px;box-sizing:border-box;width:100%;overflow:hidden}.children-container.module .resource-container .resource,.course .collection-wrapper.module{padding-left:24px;box-sizing:border-box;width:100%}.course .children-container.module .resource-container .resource{padding-left:32px;box-sizing:border-box;width:100%}.course .resource-container .resource{padding-left:24px}::ng-deep .white-spinner{stroke:#fff!important}.certificate-loader ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.lock-message{background:#fff4ec;color:#d13924;padding:10px;border-radius:4px;display:block!important;width:100%}.content-locking{padding:8px 12px;margin-top:8px;margin-left:0;margin-right:0;border-radius:4px;background:#fff4ec;display:flex!important;align-items:center;gap:8px;width:100%;box-sizing:border-box}.lock-icon{color:#f3962f;font-size:20px;flex-shrink:0}.unlock-message{background:#efffec;color:#0c9600;padding:10px}.unlock-icon{color:#0c9600}.download-btn{padding:4px 12px;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;cursor:pointer;border-radius:40px;color:#1b4ca1;font-weight:700;border:1px solid #1B4CA1;display:inline-block;pointer-events:auto;position:relative;z-index:1}.activeResource .download-btn.active{color:#fff;border:1px solid #fff}.milestone-badge{display:inline-block;background-color:#fefaf4;border:1px solid #EF951E;border-radius:16px;padding:2px 12px}.milestone-badge-text{font-size:12px;font-weight:500;color:#212121}.milestone-description{font-size:14px;line-height:1.5;color:#000000b3;margin:0;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.milestone-progress{display:flex;align-items:center}.milestone-progress-text{font-size:14px;font-weight:500;color:#0009}.milestone-locked-message{display:flex;align-items:center;padding:8px 12px;background-color:#f3962f1a;border-left:3px solid #F3962F;border-radius:4px}.locked-criteria-text{font-size:13px;font-weight:400;color:#000000b3;line-height:1.4}.locked-text{font-size:14px;font-weight:500;color:#f3962f}.mandatory-text{color:#d13924!important}.view-achievement-container{display:flex;align-items:center}.view-achievement-btn{background-color:transparent;border:1.5px solid #1a4ca1;color:#1a4ca1;border-radius:20px;padding:6px 16px;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:8px;transition:all .2s ease;min-width:150px}.view-achievement-btn:hover:not(:disabled){background-color:#1a4ca1;color:#fff}.view-achievement-btn:disabled{opacity:.6;cursor:not-allowed}.view-achievement-btn .inline-spinner{display:inline-block}\n"] }]
1144
+ }], ctorParameters: function () { return [{ type: i1.EventService }, { type: i2.MatLegacyDialog }, { type: i0.Renderer2 }, { type: i3.CertificateService }, { type: i4.AppTocService }, { type: i5.ContentLanguageService }, { type: i6.ResourceDownloadHelperService }, { type: i1.ConfigurationsService }, { type: i7.MatLegacySnackBar }]; }, propDecorators: { content: [{
998
1145
  type: Input
999
1146
  }], expandAll: [{
1000
1147
  type: Input
@@ -1027,4 +1174,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1027
1174
  }], parentMilestoneLocked: [{
1028
1175
  type: Input
1029
1176
  }] } });
1030
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1jb250ZW50LWNhcmQtdjIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1jb250ZW50LWNhcmQtdjIvYXBwLXRvYy1jb250ZW50LWNhcmQtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1jb250ZW50LWNhcmQtdjIvYXBwLXRvYy1jb250ZW50LWNhcmQtdjIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLE1BQU0sZUFBZSxDQUFBO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQTtBQUU5RSxPQUFPLEVBQWdCLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQzdELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVEQUF1RCxDQUFBO0FBRWxHLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN6RSxtQkFBbUI7QUFDbkIsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ3RCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUIzQixNQUFNLE9BQU8sNEJBQTRCO0lBMkR2QyxZQUNVLE1BQW9CLEVBQ3BCLE1BQWlCLEVBQ2pCLFFBQW1CLEVBQ25CLGtCQUFzQyxFQUN0QyxTQUF3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NEJBQ3BCLFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0NBQ3RCLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0NBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUM7NkJBQ2IsQ0FBQzs0QkFDRixVQUFVLENBQUMsV0FBVyxFQUFFO2dDQUN0QixPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzs2QkFDckUsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIO3VTQUdRLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBSZW5kZXJlcjIsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgTnNDb250ZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgdmlld2VyUm91dGVHZW5lcmF0b3IgfSBmcm9tICcuLi8uLi8uLi8uLi9fc2VydmljZXMvdmlld2VyLXJvdXRlLXV0aWwnXG5pbXBvcnQgeyBOc0FwcFRvYyB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9hcHAtdG9jLm1vZGVsJ1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlLCBXc0V2ZW50cyB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jZXJ0aWZpY2F0ZS1kaWFsb2cvY2VydGlmaWNhdGUtZGlhbG9nLmNvbXBvbmVudCdcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJ1xuLyogdHNsaW50OmRpc2FibGUqL1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXG5pbXBvcnQgeyBDZXJ0aWZpY2F0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9jZXJ0aWZpY2F0ZS5zZXJ2aWNlJ1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvY29uc3VtcHRpb24nXG5pbXBvcnQgeyBSZXNvdXJjZURvd25sb2FkSGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3Jlc291cmNlLWRvd25sb2FkLWhlbHBlci5zZXJ2aWNlJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjInLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1jb250ZW50LWNhcmQtdjIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWNvbnRlbnQtY2FyZC12Mi5jb21wb25lbnQuc2NzcyddLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcigncGFuZWxJbk91dCcsIFtcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0xMCUpJywgb3BhY2l0eTogJzAnIH0pLFxuICAgICAgICBhbmltYXRlKDI1MClcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW1xuICAgICAgICBhbmltYXRlKDIwMCwgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0xMCUpJywgb3BhY2l0eTogJzAnIH0pKVxuICAgICAgXSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFwcFRvY0NvbnRlbnRDYXJkVjJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBleHBhbmRBbGwgPSBmYWxzZVxuICBASW5wdXQoKSByb290SWQhOiBzdHJpbmdcbiAgQElucHV0KCkgcm9vdENvbnRlbnRUeXBlITogc3RyaW5nXG4gIEBJbnB1dCgpIGZvclByZXZpZXcgPSBmYWxzZVxuICBASW5wdXQoKSBiYXRjaElkITogc3RyaW5nXG4gIEBJbnB1dCgpIGNvbXBvbmVudE5hbWU6IHN0cmluZyA9ICd0b2MnXG4gIEBJbnB1dCgpIGluZGV4ITogbnVtYmVyXG4gIEBJbnB1dCgpIHBhdGhTZXQhOiBhbnlcbiAgQElucHV0KCkgZXhwYW5kQWN0aXZlID0gdHJ1ZVxuICBASW5wdXQoKSBoaWVyYXJjaHlNYXBEYXRhOiBhbnkgPSB7fVxuICBASW5wdXQoKSBiYXRjaERhdGE6IC8qKk5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UgKi8gYW55IHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgaXNQcmVBc3Nlc3NtZW50ID0gZmFsc2VcbiAgQElucHV0KCkgYmFzZUNvbnRlbnRSZWFkRGF0YTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgbWxDb3Vyc2U6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIHBhcmVudE1pbGVzdG9uZUxvY2tlZCA9IGZhbHNlIC8vIFBhc3NlZCBmcm9tIHBhcmVudCB3aGVuIGluc2lkZSBhIGxvY2tlZCBtaWxlc3RvbmVcbiAgaGFzQ29udGVudFN0cnVjdHVyZSA9IGZhbHNlXG4gIGRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nID0gZmFsc2VcbiAgZW51bUNvbnRlbnRUeXBlcyA9IE5zQ29udGVudC5FRGlzcGxheUNvbnRlbnRUeXBlc1xuICBjb250ZW50U3RydWN0dXJlOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlID0ge1xuICAgIGFzc2Vzc21lbnQ6IDAsXG4gICAgZmluYWxUZXN0OiAwLFxuICAgIGNvdXJzZTogMCxcbiAgICBoYW5kc09uOiAwLFxuICAgIGludGVyYWN0aXZlVmlkZW86IDAsXG4gICAgbGVhcm5pbmdNb2R1bGU6IDAsXG4gICAgb3RoZXI6IDAsXG4gICAgcGRmOiAwLFxuICAgIHN1cnZleTogMCxcbiAgICBwb2RjYXN0OiAwLFxuICAgIHByYWN0aWNlVGVzdDogMCxcbiAgICBxdWl6OiAwLFxuICAgIHZpZGVvOiAwLFxuICAgIHdlYk1vZHVsZTogMCxcbiAgICB3ZWJQYWdlOiAwLFxuICAgIHlvdXR1YmU6IDAsXG4gICAgaW50ZXJhY3RpdmVjb250ZW50OiAwLFxuICAgIG9mZmxpbmVTZXNzaW9uOiAwLFxuICB9XG4gIGRlZmF1bHRUaHVtYm5haWwgPSAnJ1xuICB2aWV3Q2hpbGRyZW4gPSBmYWxzZVxuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxuICBwYWdlU2Nyb2xsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuXG4gIC8vIENhY2hlZCBjb21wdXRlZCBwcm9wZXJ0aWVzIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgcHJpdmF0ZSBfY2FjaGVkSXNDb2xsZWN0aW9uOiBib29sZWFuID0gZmFsc2VcbiAgcHJpdmF0ZSBfY2FjaGVkSXNNb2R1bGU6IGJvb2xlYW4gPSBmYWxzZVxuICBwcml2YXRlIF9jYWNoZWRJc1Jlc291cmNlOiBib29sZWFuID0gZmFsc2VcbiAgcHJpdmF0ZSBfY2FjaGVkSXNNaWxlc3RvbmU6IGJvb2xlYW4gPSBmYWxzZVxuICBwcml2YXRlIF9jYWNoZWRJc01pbGVzdG9uZUxvY2tlZDogYm9vbGVhbiA9IGZhbHNlXG4gIHByaXZhdGUgX2NhY2hlZElzUGFyZW50TWlsZXN0b25lTG9ja2VkOiBib29sZWFuID0gZmFsc2VcbiAgcHJpdmF0ZSBfY2FjaGVkSXNDb250ZW50VW5sb2NrZWQ6IGJvb2xlYW4gPSB0cnVlXG4gIHByaXZhdGUgX2NhY2hlZENoZWNrRm9yQ3VyYXRlZFByb2dyYW06IGJvb2xlYW4gPSBmYWxzZVxuICBwcml2YXRlIF9jYWNoZWRJc01pbGVzdG9uZUFzc2Vzc21lbnQ6IGJvb2xlYW4gPSBmYWxzZVxuICBwcml2YXRlIF9jYWNoZWRJc01pbGVzdG9uZUFzc2Vzc21lbnRMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBwcml2YXRlIF9jYWNoZWRSZXNvdXJjZUxpbms6IHsgdXJsOiBzdHJpbmc7IHF1ZXJ5UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH0gPSB7IHVybDogJycsIHF1ZXJ5UGFyYW1zOiB7fSB9XG4gIHByaXZhdGUgX2NhY2hlSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZXZlbnRzOiBFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBjZXJ0aWZpY2F0ZVNlcnZpY2U6IENlcnRpZmljYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGFwcFRvY1N2YzogQXBwVG9jU2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRlbnRMYW5nU3ZjOiBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVzb3VyY2VEb3dubG9hZEhlbHBlclN2YzogUmVzb3VyY2VEb3dubG9hZEhlbHBlclNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmV2YWx1YXRlSW1tZWRpYXRlQ2hpbGRyZW5TdHJ1Y3R1cmUoKVxuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXB1dGVkUHJvcGVydGllcygpXG4gICAgLy8gdGhpcy5yb3V0ZS5kYXRhLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAvLyAgICAgdGhpcy5kZWZhdWx0VGh1bWJuYWlsID0gZGF0YS5jb25maWdEYXRhLmRhdGEubG9nb3MuZGVmYXVsdENvbnRlbnRcbiAgICAvLyAgIH1cbiAgICAvLyApXG4gICAgdGhpcy5yZXNvdXJjZVNjcm9sbCgpXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhbGwgY29tcHV0ZWQgcHJvcGVydGllcyBvbmNlIHRvIGF2b2lkIGV4cGVuc2l2ZSBnZXR0ZXIgY2FsY3VsYXRpb25zXG4gICAqIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbXB1dGVkUHJvcGVydGllcygpIHtcbiAgICB0aGlzLmNvbXB1dGVBbGxDYWNoZWRQcm9wZXJ0aWVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlIGFsbCBjYWNoZWQgcHJvcGVydGllcyBhdCBvbmNlIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUFsbENhY2hlZFByb3BlcnRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2NhY2hlSW5pdGlhbGl6ZWQgPSBmYWxzZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudElkID0gdGhpcy5jb250ZW50LmlkZW50aWZpZXJcbiAgICBjb25zdCBoYXNoRGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbY29udGVudElkXVxuXG4gICAgLy8gVXNlIGhhc2htYXAgZGF0YSBpZiBhdmFpbGFibGUgZm9yIHByZS1jb21wdXRlZCB2YWx1ZXNcbiAgICBpZiAoaGFzaERhdGEpIHtcbiAgICAgIHRoaXMuX2NhY2hlZElzQ29sbGVjdGlvbiA9IGhhc2hEYXRhLmlzQ29sbGVjdGlvbiAhPT0gdW5kZWZpbmVkID8gXG4gICAgICAgIGhhc2hEYXRhLmlzQ29sbGVjdGlvbiA6IHRoaXMuY29udGVudC5taW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuQ09MTEVDVElPTlxuICAgICAgdGhpcy5fY2FjaGVkSXNNb2R1bGUgPSBoYXNoRGF0YS5pc01vZHVsZSAhPT0gdW5kZWZpbmVkID8gXG4gICAgICAgIGhhc2hEYXRhLmlzTW9kdWxlIDogdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFXG4gICAgICB0aGlzLl9jYWNoZWRJc1Jlc291cmNlID0gaGFzaERhdGEuaXNSZXNvdXJjZSAhPT0gdW5kZWZpbmVkID8gXG4gICAgICAgIGhhc2hEYXRhLmlzUmVzb3VyY2UgOiB0aGlzLmNvbXB1dGVJc1Jlc291cmNlKClcbiAgICAgIHRoaXMuX2NhY2hlZElzTWlsZXN0b25lID0gaGFzaERhdGEuaXNNaWxlc3RvbmUgIT09IHVuZGVmaW5lZCA/IFxuICAgICAgICBoYXNoRGF0YS5pc01pbGVzdG9uZSA6IHRoaXMuY29tcHV0ZUlzTWlsZXN0b25lKClcbiAgICAgIHRoaXMuX2NhY2hlZElzTWlsZXN0b25lTG9ja2VkID0gaGFzaERhdGEuY29tcHV0ZWRJc0xvY2tlZCAhPT0gdW5kZWZpbmVkID8gXG4gICAgICAgIGhhc2hEYXRhLmNvbXB1dGVkSXNMb2NrZWQgOiB0aGlzLmNvbXB1dGVJc01pbGVzdG9uZUxvY2tlZCgpXG4gICAgICB0aGlzLl9jYWNoZWRJc1BhcmVudE1pbGVzdG9uZUxvY2tlZCA9IGhhc2hEYXRhLmlzUGFyZW50TWlsZXN0b25lTG9ja2VkICE9PSB1bmRlZmluZWQgPyBcbiAgICAgICAgaGFzaERhdGEuaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQgOiB0aGlzLmNvbXB1dGVJc1BhcmVudE1pbGVzdG9uZUxvY2tlZCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIGRpcmVjdCBjb21wdXRhdGlvbiBpZiBoYXNobWFwIG5vdCBhdmFpbGFibGVcbiAgICAgIHRoaXMuX2NhY2hlZElzQ29sbGVjdGlvbiA9IHRoaXMuY29udGVudC5taW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuQ09MTEVDVElPTlxuICAgICAgdGhpcy5fY2FjaGVkSXNNb2R1bGUgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEVcbiAgICAgIHRoaXMuX2NhY2hlZElzUmVzb3VyY2UgPSB0aGlzLmNvbXB1dGVJc1Jlc291cmNlKClcbiAgICAgIHRoaXMuX2NhY2hlZElzTWlsZXN0b25lID0gdGhpcy5jb21wdXRlSXNNaWxlc3RvbmUoKVxuICAgICAgdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmVMb2NrZWQgPSB0aGlzLmNvbXB1dGVJc01pbGVzdG9uZUxvY2tlZCgpXG4gICAgICB0aGlzLl9jYWNoZWRJc1BhcmVudE1pbGVzdG9uZUxvY2tlZCA9IHRoaXMuY29tcHV0ZUlzUGFyZW50TWlsZXN0b25lTG9ja2VkKClcbiAgICB9XG5cbiAgICB0aGlzLl9jYWNoZWRDaGVja0ZvckN1cmF0ZWRQcm9ncmFtID0gdGhpcy5jb21wdXRlQ2hlY2tGb3JDdXJhdGVkUHJvZ3JhbSgpXG4gICAgdGhpcy5fY2FjaGVkSXNDb250ZW50VW5sb2NrZWQgPSB0aGlzLmNvbXB1dGVJc0NvbnRlbnRVbmxvY2tlZCgpXG4gICAgdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmVBc3Nlc3NtZW50ID0gdGhpcy5jb21wdXRlSXNNaWxlc3RvbmVBc3Nlc3NtZW50KClcbiAgICB0aGlzLl9jYWNoZWRJc01pbGVzdG9uZUFzc2Vzc21lbnRMb2NrZWQgPSB0aGlzLmNvbXB1dGVJc01pbGVzdG9uZUFzc2Vzc21lbnRMb2NrZWQoKVxuICAgIHRoaXMuX2NhY2hlZFJlc291cmNlTGluayA9IHRoaXMuY29tcHV0ZVJlc291cmNlTGluaygpXG4gICAgdGhpcy5fY2FjaGVJbml0aWFsaXplZCA9IHRydWVcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUlzUmVzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnQpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSB8fFxuICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0UgfHxcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUlzTWlsZXN0b25lKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb250ZW50KSByZXR1cm4gZmFsc2VcbiAgICBjb25zdCBwcmltYXJ5Q2F0ID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSBhcyBzdHJpbmdcbiAgICBjb25zdCBjb3Vyc2VDYXQgPSB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgYXMgc3RyaW5nXG4gICAgcmV0dXJuIHByaW1hcnlDYXQgPT09ICdNaWxlc3RvbmUnIHx8IGNvdXJzZUNhdCA9PT0gJ01pbGVzdG9uZSdcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUNoZWNrRm9yQ3VyYXRlZFByb2dyYW0oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucGFyZW50ICYmIHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbdGhpcy5jb250ZW50LnBhcmVudF0pIHtcbiAgICAgIGNvbnN0IHBhcmVudERhdGEgPSB0aGlzLmhpZXJhcmNoeU1hcERhdGFbdGhpcy5jb250ZW50LnBhcmVudF1cbiAgICAgIHJldHVybiBwYXJlbnREYXRhICYmIHBhcmVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0gJiZcbiAgICAgICAgcGFyZW50RGF0YS5jb21wYXRpYmlsaXR5TGV2ZWwgPj0gNSAmJlxuICAgICAgICBwYXJlbnREYXRhLmNvbnRleHRMb2NraW5nVHlwZSA9PT0gTnNDb250ZW50LkVDb250ZXh0TG9ja2luZ1R5cGUuQ09VUlNFX0FTU0VTU01FTlRfT05MWVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUlzQ29udGVudFVubG9ja2VkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9jYWNoZWRDaGVja0ZvckN1cmF0ZWRQcm9ncmFtKSB7XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wYXJlbnQgJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhICYmIHRoaXMuaGllcmFyY2h5TWFwRGF0YVt0aGlzLmNvbnRlbnQucGFyZW50XSkge1xuICAgICAgICBjb25zdCBwYXJlbnREYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudC5wYXJlbnRdXG4gICAgICAgIGxldCBjb21wbGV0ZWRMZWFmTm9kZXM6IGFueVtdID0gW11cbiAgICAgICAgcGFyZW50RGF0YS5sZWFmTm9kZXMuZm9yRWFjaCgoX2VsZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbX2VsZV0pIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkRGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtfZWxlXVxuICAgICAgICAgICAgaWYgKGNoaWxkRGF0YSAmJiBjaGlsZERhdGEuY29tcGxldGlvblN0YXR1cyA9PT0gMikge1xuICAgICAgICAgICAgICBjb21wbGV0ZWRMZWFmTm9kZXMucHVzaChjaGlsZERhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gY29tcGxldGVkTGVhZk5vZGVzLmxlbmd0aCA+PSBwYXJlbnREYXRhLmxlYWZOb2Rlc0NvdW50IC0gMVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVSZXNvdXJjZUxpbmsoKTogeyB1cmw6IHN0cmluZzsgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgbGV0IG1pbWVUeXBlOiBhbnkgPSAnJ1xuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09ICdQcmUgRW5yb2xtZW50IEFzc2Vzc21lbnQnICYmXG4gICAgICAgIHRoaXMuY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuY29udGVudC1jb2xsZWN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIG1pbWVUeXBlID0gJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0J1xuICAgICAgICB0aGlzLmNvbnRlbnQubWltZVR5cGUgPSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW1lVHlwZSA9IHRoaXMuY29udGVudC5taW1lVHlwZVxuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZWN0ZWRMYW5ndWFnZSA9IHRoaXMubWxDb3Vyc2UgPyB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldFNlbGVjdGVkTGFuZ3VhZ2UodGhpcy5tbENvdXJzZSkgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiB2aWV3ZXJSb3V0ZUdlbmVyYXRvcihcbiAgICAgICAgdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIG1pbWVUeXBlLFxuICAgICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgdGhpcy5yb290SWQsXG4gICAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uY29udGVudFR5cGUgfHwgdGhpcy5yb290Q29udGVudFR5cGUsXG4gICAgICAgIHRoaXMuZm9yUHJldmlldyxcbiAgICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgdGhpcy5iYXRjaElkLFxuICAgICAgICB0aGlzLmNvbnRlbnQ/Lm5hbWUgfHwgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5uYW1lLFxuICAgICAgICAoc2VsZWN0ZWRMYW5ndWFnZSA/IHNlbGVjdGVkTGFuZ3VhZ2UubGFuZ0lkIDogbnVsbCksXG4gICAgICAgIChzZWxlY3RlZExhbmd1YWdlID8gc2VsZWN0ZWRMYW5ndWFnZS5pZGVudGlmaWVyIDogbnVsbCksXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB7IHVybDogJycsIHF1ZXJ5UGFyYW1zOiB7fSB9XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVJc01pbGVzdG9uZUxvY2tlZCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IGFwcGx5IG1pbGVzdG9uZSBsb2NraW5nIGZvciBMZWFybmluZyBQYXRod2F5IGNvbnRlbnRcbiAgICBpZiAoIXRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSB8fCB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuY291cnNlQ2F0ZWdvcnkgIT09ICdMZWFybmluZyBQYXRod2F5Jykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgY29udGVudCBpcyBhIE1pbGVzdG9uZVxuICAgIGlmICghdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmUgJiYgIXRoaXMuY29tcHV0ZUlzTWlsZXN0b25lKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGhhc2htYXAgaGFzIHByZS1jb21wdXRlZCBsb2NraW5nIHN0YXR1cyAocHJlZmVycmVkIC0gY29tcHV0ZWQgYnkgc2VydmljZSlcbiAgICBjb25zdCBoYXNoRGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbdGhpcy5jb250ZW50LmlkZW50aWZpZXJdXG4gICAgY29uc29sZS5sb2coYGNvbXB1dGVJc01pbGVzdG9uZUxvY2tlZCBmb3IgJHt0aGlzLmNvbnRlbnQuaWRlbnRpZmllcn0gKCR7dGhpcy5jb250ZW50Lm5hbWV9KTpgLCB7XG4gICAgICBoYXNoRGF0YSxcbiAgICAgIGNvbXB1dGVkSXNMb2NrZWQ6IGhhc2hEYXRhPy5jb21wdXRlZElzTG9ja2VkLFxuICAgICAgY29udGVudElzTG9ja2VkOiB0aGlzLmNvbnRlbnQuaXNMb2NrZWRcbiAgICB9KVxuICAgIFxuICAgIGlmIChoYXNoRGF0YSAmJiBoYXNoRGF0YS5jb21wdXRlZElzTG9ja2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBoYXNoRGF0YS5jb21wdXRlZElzTG9ja2VkXG4gICAgfVxuXG4gICAgLy8gSWYgbWlsZXN0b25lIGhhcyBpc0xvY2tlZCBmbGFnIGV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlLCBpdCdzIHVubG9ja2VkXG4gICAgaWYgKHRoaXMuY29udGVudC5pc0xvY2tlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBBbGwgbWlsZXN0b25lcyBhcmUgbG9ja2VkIGJ5IGRlZmF1bHQgdW50aWwgY29tcHV0ZWQgb3RoZXJ3aXNlXG4gICAgLy8gVGhpcyBlbnN1cmVzIHByb3BlciBsb2NraW5nIHVudGlsIHRoZSBoYXNobWFwIGlzIHVwZGF0ZWQgd2l0aCBwcm9ncmVzc1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVJc1BhcmVudE1pbGVzdG9uZUxvY2tlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5wYXJlbnRNaWxlc3RvbmVMb2NrZWQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgfHwgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmNvdXJzZUNhdGVnb3J5ICE9PSAnTGVhcm5pbmcgUGF0aHdheScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jb250ZW50IHx8ICF0aGlzLmhpZXJhcmNoeU1hcERhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGhhc2htYXAgZm9yIHByZS1jb21wdXRlZCB2YWx1ZVxuICAgIGNvbnN0IGhhc2hEYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudC5pZGVudGlmaWVyXVxuICAgIGlmIChoYXNoRGF0YSAmJiBoYXNoRGF0YS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gaGFzaERhdGEuaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWRcbiAgICB9XG5cbiAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgaGllcmFyY2h5IHRvIGZpbmQgaWYgYW55IGFuY2VzdG9yIGlzIGEgbG9ja2VkIE1pbGVzdG9uZVxuICAgIGxldCBjdXJyZW50UGFyZW50SWQgPSB0aGlzLmNvbnRlbnQucGFyZW50XG4gICAgY29uc3QgbWF4RGVwdGggPSA1XG4gICAgbGV0IGRlcHRoID0gMFxuXG4gICAgd2hpbGUgKGN1cnJlbnRQYXJlbnRJZCAmJiBkZXB0aCA8IG1heERlcHRoKSB7XG4gICAgICBjb25zdCBwYXJlbnREYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2N1cnJlbnRQYXJlbnRJZF1cbiAgICAgIGlmIChwYXJlbnREYXRhKSB7XG4gICAgICAgIGlmICgocGFyZW50RGF0YS5pc01pbGVzdG9uZSB8fCBwYXJlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScgfHwgcGFyZW50RGF0YS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScpICYmIFxuICAgICAgICAgICAgKHBhcmVudERhdGEuY29tcHV0ZWRJc0xvY2tlZCB8fCBwYXJlbnREYXRhLmlzTG9ja2VkKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFBhcmVudElkID0gcGFyZW50RGF0YS5wYXJlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZXB0aCsrXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGN1cnJlbnQgY29udGVudCBpcyBhIG1pbGVzdG9uZSBhc3Nlc3NtZW50IChDb3Vyc2UgQXNzZXNzbWVudCBvciBGaW5hbCBBc3Nlc3NtZW50IGluc2lkZSBhIE1pbGVzdG9uZSlcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUlzTWlsZXN0b25lQXNzZXNzbWVudCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSB8fCB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuY291cnNlQ2F0ZWdvcnkgIT09ICdMZWFybmluZyBQYXRod2F5Jykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRlbnQgfHwgIXRoaXMuaGllcmFyY2h5TWFwRGF0YSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBhc3Nlc3NtZW50XG4gICAgY29uc3QgaXNBc3Nlc3NtZW50ID0gXG4gICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgICh0aGlzLmNvbnRlbnQubmFtZSAmJiB0aGlzLmNvbnRlbnQubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhc3Nlc3NtZW50JykpXG5cbiAgICBpZiAoIWlzQXNzZXNzbWVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmVudCBvciBncmFuZHBhcmVudCBpcyBhIG1pbGVzdG9uZSAoc2luY2UgYXNzZXNzbWVudHMgY2FuIGJlIGluc2lkZSBjb3Vyc2VzIGluc2lkZSBtaWxlc3RvbmVzKVxuICAgIGlmICh0aGlzLmNvbnRlbnQucGFyZW50ICYmIHRoaXMuaGllcmFyY2h5TWFwRGF0YVt0aGlzLmNvbnRlbnQucGFyZW50XSkge1xuICAgICAgY29uc3QgcGFyZW50RGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVt0aGlzLmNvbnRlbnQucGFyZW50XVxuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBkaXJlY3QgcGFyZW50IGlzIGEgbWlsZXN0b25lXG4gICAgICBpZiAocGFyZW50RGF0YS5pc01pbGVzdG9uZSB8fCBwYXJlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScgfHwgcGFyZW50RGF0YS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZ3JhbmRwYXJlbnQgaXMgYSBtaWxlc3RvbmUgKGZvciBhc3Nlc3NtZW50cyBpbnNpZGUgY291cnNlcyBpbnNpZGUgbWlsZXN0b25lcylcbiAgICAgIGlmIChwYXJlbnREYXRhLnBhcmVudCAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbcGFyZW50RGF0YS5wYXJlbnRdKSB7XG4gICAgICAgIGNvbnN0IGdyYW5kcGFyZW50RGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtwYXJlbnREYXRhLnBhcmVudF1cbiAgICAgICAgcmV0dXJuIGdyYW5kcGFyZW50RGF0YS5pc01pbGVzdG9uZSB8fCBncmFuZHBhcmVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSAnTWlsZXN0b25lJyB8fCBncmFuZHBhcmVudERhdGEuY291cnNlQ2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgbWlsZXN0b25lIGFzc2Vzc21lbnQgc2hvdWxkIGJlIGxvY2tlZFxuICAgKiBBc3Nlc3NtZW50IGlzIGxvY2tlZCBpZjpcbiAgICogMS4gVGhlIHBhcmVudCBtaWxlc3RvbmUgaXMgdW5sb2NrZWQgKG90aGVyd2lzZSBoYW5kbGVkIGJ5IHBhcmVudCBtaWxlc3RvbmUgbG9jaylcbiAgICogMi4gTk9UIGFsbCBtYW5kYXRvcnkgY29udGVudCBpbiB0aGUgbWlsZXN0b25lIGlzIGNvbXBsZXRlZFxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlSXNNaWxlc3RvbmVBc3Nlc3NtZW50TG9ja2VkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmVBc3Nlc3NtZW50ICYmICF0aGlzLmNvbXB1dGVJc01pbGVzdG9uZUFzc2Vzc21lbnQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSWYgYWxyZWFkeSBjb21wbGV0ZWQsIGRvbid0IGxvY2tcbiAgICBpZiAodGhpcy5jb250ZW50ICYmICh0aGlzLmNvbnRlbnQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBcbiAgICAgICAgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSAmJiB0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIG1pbGVzdG9uZSBJRCAoY291bGQgYmUgcGFyZW50IG9yIGdyYW5kcGFyZW50KVxuICAgIGxldCBtaWxlc3RvbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgbGV0IG1pbGVzdG9uZTogYW55XG5cbiAgICAvLyBDaGVjayBpZiBkaXJlY3QgcGFyZW50IGlzIG1pbGVzdG9uZVxuICAgIGlmICh0aGlzLmNvbnRlbnQ/LnBhcmVudCAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGEgJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudC5wYXJlbnRdKSB7XG4gICAgICBjb25zdCBwYXJlbnREYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudC5wYXJlbnRdXG4gICAgICBpZiAocGFyZW50RGF0YS5pc01pbGVzdG9uZSB8fCBwYXJlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScgfHwgcGFyZW50RGF0YS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScpIHtcbiAgICAgICAgbWlsZXN0b25lSWQgPSB0aGlzLmNvbnRlbnQucGFyZW50XG4gICAgICAgIG1pbGVzdG9uZSA9IHBhcmVudERhdGFcbiAgICAgIH0gZWxzZSBpZiAocGFyZW50RGF0YS5wYXJlbnQgJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3BhcmVudERhdGEucGFyZW50XSkge1xuICAgICAgICAvLyBDaGVjayBpZiBncmFuZHBhcmVudCBpcyBtaWxlc3RvbmVcbiAgICAgICAgY29uc3QgZ3JhbmRwYXJlbnREYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3BhcmVudERhdGEucGFyZW50XVxuICAgICAgICBpZiAoZ3JhbmRwYXJlbnREYXRhLmlzTWlsZXN0b25lIHx8IGdyYW5kcGFyZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnIHx8IGdyYW5kcGFyZW50RGF0YS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScpIHtcbiAgICAgICAgICBtaWxlc3RvbmVJZCA9IHBhcmVudERhdGEucGFyZW50XG4gICAgICAgICAgbWlsZXN0b25lID0gZ3JhbmRwYXJlbnREYXRhXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW1pbGVzdG9uZUlkIHx8ICFtaWxlc3RvbmUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiB0aGUgcGFyZW50IG1pbGVzdG9uZSBpdHNlbGYgaXMgbG9ja2VkLCBkb24ndCBhZGQgYWRkaXRpb25hbCBsb2NraW5nXG4gICAgLy8gKHRoZSBwYXJlbnQgbG9jayB3aWxsIGhhbmRsZSBpdClcbiAgICBpZiAobWlsZXN0b25lLmNvbXB1dGVkSXNMb2NrZWQgfHwgbWlsZXN0b25lLmlzTG9ja2VkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBhbGwgbWFuZGF0b3J5IGNvbnRlbnQgaW4gdGhlIG1pbGVzdG9uZSBpcyBjb21wbGV0ZWRcbiAgICBsZXQgbWFuZGF0b3J5Q291bnQgPSAwXG4gICAgbGV0IGNvbXBsZXRlZE1hbmRhdG9yeUNvdW50ID0gMFxuXG4gICAgLy8gQ2hlY2sgYWxsIGl0ZW1zIGluIGhhc2htYXAgdGhhdCBhcmUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgbWlsZXN0b25lXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oaWVyYXJjaHlNYXBEYXRhKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtrZXldXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgbWlsZXN0b25lXG4gICAgICBpZiAoaXRlbS5wYXJlbnQgIT09IG1pbGVzdG9uZUlkKSBjb250aW51ZVxuXG4gICAgICAvLyBTa2lwIGFzc2Vzc21lbnRzIC0gd2UncmUgY2hlY2tpbmcgaWYgb3RoZXIgY29udGVudCBpcyBjb21wbGV0ZVxuICAgICAgY29uc3QgaXNJdGVtQXNzZXNzbWVudCA9XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnRmluYWwgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgaXRlbS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICAoaXRlbS5uYW1lICYmIGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhc3Nlc3NtZW50JykpXG4gICAgICBpZiAoaXNJdGVtQXNzZXNzbWVudCkgY29udGludWVcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjb250ZW50IGlzIG1hbmRhdG9yeVxuICAgICAgaWYgKGl0ZW0uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgbWFuZGF0b3J5Q291bnQrK1xuICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBpdGVtLnN0YXR1cyA9PT0gMiB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwIHx8IGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwXG4gICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgIGNvbXBsZXRlZE1hbmRhdG9yeUNvdW50KytcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBubyBtYW5kYXRvcnkgaXRlbXMsIGFzc2Vzc21lbnQgaXMgdW5sb2NrZWRcbiAgICBpZiAobWFuZGF0b3J5Q291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIExvY2sgYXNzZXNzbWVudCBpZiBub3QgYWxsIG1hbmRhdG9yeSBpdGVtcyBhcmUgY29tcGxldGVkXG4gICAgY29uc3QgYWxsTWFuZGF0b3J5Q29tcGxldGUgPSBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCA+PSBtYW5kYXRvcnlDb3VudFxuICAgIHJldHVybiAhYWxsTWFuZGF0b3J5Q29tcGxldGVcbiAgfVxuXG4gIC8vIEZPUiBSSUdIVCBTSURFIFJFU09VUkNFIFNDUk9MTCBPTiBUT0MgUEFHRVxuICByZXNvdXJjZVNjcm9sbCgpIHtcbiAgICB0aGlzLnBhZ2VTY3JvbGxTdWJzY3JpcHRpb24gPSB0aGlzLmFwcFRvY1N2Yy51cGRhdGVQYWdlU2Nyb2xsLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFZpZXcoKVxuICAgICAgICB9LCA3MDApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvLyBUTyBVUERBVEUgUkVTT1VSQ0UgQkVIQVZPVVIgU1VCSkVDVCBGT1IgUkVTT1VSQ0UgU0NST0xMXG4gIGNoYW5nZVJlc291cmNlKCkge1xuICAgIHRoaXMuYXBwVG9jU3ZjLmdldFBhZ2VTY3JvbGwubmV4dCh0cnVlKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGxldCBzaG91bGRSZWNvbXB1dGVDYWNoZSA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGNoYW5nZXMpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ2V4cGFuZEFsbCcpIHtcbiAgICAgICAgdGhpcy52aWV3Q2hpbGRyZW4gPSB0aGlzLmV4cGFuZEFsbFxuICAgICAgfVxuICAgICAgaWYgKHByb3BlcnR5ID09PSAncGF0aFNldCcgJiYgY2hhbmdlc1sncGF0aFNldCddKSB7XG4gICAgICAgIGxldCBjdXJyZW50VmFsdWUgPSBjaGFuZ2VzWydwYXRoU2V0J10uY3VycmVudFZhbHVlXG4gICAgICAgIGxldCBwcmV2aW91c1ZhbHVlID0gY2hhbmdlc1sncGF0aFNldCddLnByZXZpb3VzVmFsdWVcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAmJiBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgZXFTZXQgPSAoeHM6IGFueSwgeXM6IGFueSkgPT5cbiAgICAgICAgICAgIHhzLnNpemUgPT09IHlzLnNpemUgJiZcbiAgICAgICAgICAgIFsuLi54c10uZXZlcnkoKHgpID0+IHlzLmhhcyh4KSlcbiAgICAgICAgICBpZiAoIWVxU2V0KHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkpIHsgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmKHByZXZpb3VzVmFsdWUgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgIC8vICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAvLyAgIH0sNzAwKVxuICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgICAvLyB0aGlzLmFwcFRvY1N2Yy5nZXRQYWdlU2Nyb2xsLm5leHQodHJ1ZSlcblxuICAgICAgaWYgKHByb3BlcnR5ID09PSAnaGllcmFyY2h5TWFwRGF0YScpIHtcbiAgICAgICAgaWYgKF8uaXNFbXB0eShjaGFuZ2VzWydoaWVyYXJjaHlNYXBEYXRhJ10uY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgIC8vIHRoaXMubG9hZGluZ092ZXJhbGxQUm9ncmVzcyA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkUGFyZW50TWFwKHRoaXMuY29udGVudC5pZGVudGlmaWVyKVxuICAgICAgICAgIH1cbiAgICAgICAgICBzaG91bGRSZWNvbXB1dGVDYWNoZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZWNvbXB1dGUgY2FjaGUgd2hlbiBjcml0aWNhbCBpbnB1dHMgY2hhbmdlXG4gICAgICBpZiAocHJvcGVydHkgPT09ICdjb250ZW50JyB8fCBwcm9wZXJ0eSA9PT0gJ2Jhc2VDb250ZW50UmVhZERhdGEnIHx8IFxuICAgICAgICAgIHByb3BlcnR5ID09PSAnYmF0Y2hJZCcgfHwgcHJvcGVydHkgPT09ICdmb3JQcmV2aWV3JyB8fCBcbiAgICAgICAgICBwcm9wZXJ0eSA9PT0gJ3BhcmVudE1pbGVzdG9uZUxvY2tlZCcgfHwgcHJvcGVydHkgPT09ICdtbENvdXJzZScpIHtcbiAgICAgICAgc2hvdWxkUmVjb21wdXRlQ2FjaGUgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb21wdXRlIGFsbCBjYWNoZWQgcHJvcGVydGllcyBpZiBuZWVkZWRcbiAgICBpZiAoc2hvdWxkUmVjb21wdXRlQ2FjaGUpIHtcbiAgICAgIHRoaXMuY29tcHV0ZUFsbENhY2hlZFByb3BlcnRpZXMoKVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZygncHJlIGFzc2Vzc21lbnQgY29udGVudC0tLScsIHRoaXMuY29udGVudClcbiAgICAvLyBjb25zb2xlLmxvZygndGhpcy5oaWVyYXJjaHlNYXBEYXRhLS0tJywgdGhpcy5oaWVyYXJjaHlNYXBEYXRhKVxuICB9XG5cbiAgY2hlY2soY29udGVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuZXhwYW5kQWN0aXZlKSB7XG4gICAgICBjb250ZW50LnZpZXdDaGlsZHJlbiA9IHRoaXMucGF0aFNldCAmJiB0aGlzLnBhdGhTZXQuaGFzKGNvbnRlbnQuaWRlbnRpZmllcikgfHwgY29udGVudC52aWV3Q2hpbGRyZW5cbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQudmlld0NoaWxkcmVuXG4gIH1cblxuICBnZXQgaXNDb2xsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9jYWNoZUluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVkSXNDb2xsZWN0aW9uXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQubWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLkNPTExFQ1RJT05cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgaXNNb2R1bGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2NhY2hlSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRJc01vZHVsZVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcHVibGljIGNoZWNrTW9kdWxlKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjaGVja0lzTW9kdWxlKGNvbnRlbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChjb250ZW50KSB7XG4gICAgICByZXR1cm4gY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc0JhdGNoSW5Qcm9nZXNzKCkge1xuICAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiAodGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50Lmxlbmd0aCkgJiYgdGhpcy5iYXRjaERhdGEuZW5yb2xsZWQpIHtcbiAgICAgIGNvbnN0IGJhdGNoRGF0YSA9IHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnRbMF1cbiAgICAgIGlmIChiYXRjaERhdGEgJiYgYmF0Y2hEYXRhLmVuZERhdGUpIHtcbiAgICAgICAgY29uc3Qgbm93ID0gbW9tZW50KCkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KGJhdGNoRGF0YS5zdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSBiYXRjaERhdGEuZW5kRGF0ZSA/IG1vbWVudChiYXRjaERhdGEuZW5kRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJykgOiBub3dcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvLyBiYXRjaC5zdGF0dXMgJiZcbiAgICAgICAgICBtb21lbnQoc3RhcnREYXRlKS5pc1NhbWVPckJlZm9yZShub3cpXG4gICAgICAgICAgJiYgbW9tZW50KGVuZERhdGUpLmlzU2FtZU9yQWZ0ZXIobm93KVxuICAgICAgICApXG4gICAgICB9IHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzUmVzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2NhY2hlSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRJc1Jlc291cmNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVJc1Jlc291cmNlKClcbiAgfVxuXG4gIGdldCByZXNvdXJjZUxpbmsoKTogeyB1cmw6IHN0cmluZzsgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRSZXNvdXJjZUxpbmtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZVJlc291cmNlTGluaygpXG4gIH1cblxuICBwdWJsaWMgcHJvZ3Jlc3NDb2xvcigpOiBzdHJpbmcge1xuICAgIC8vIGlmICh0aGlzLmN1cnJlbnRQcm9ncmVzcyA8PSAzMCkge1xuICAgIC8vICAgcmV0dXJuICcjRDEzOTI0J1xuICAgIC8vIH0gaWYgKHRoaXMuY3VycmVudFByb2dyZXNzID4gMzAgJiYgdGhpcy5jdXJyZW50UHJvZ3Jlc3MgPD0gNzApIHtcbiAgICAvLyAgIHJldHVybiAnI0U5OUUzOCdcbiAgICAvLyB9XG4gICAgLy8gaWYgKHRoaXMuY3VycmVudFByb2dyZXNzID4gNzAgJiYgdGhpcy5jdXJyZW50UHJvZ3Jlc3MgPD0gMTAwKSB7XG4gICAgLy8gICByZXR1cm4gJyMxRDg5MjMnXG4gICAgLy8gfVxuXG4gICAgcmV0dXJuICcjMUQ4OTIzJ1xuICB9XG4gIHB1YmxpYyBwcm9ncmVzc0NvbG9yMigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnI2YyN2QwMCdcbiAgfVxuXG4gIHByaXZhdGUgZXZhbHVhdGVJbW1lZGlhdGVDaGlsZHJlblN0cnVjdHVyZSgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jaGlsZHJlbiAmJiB0aGlzLmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbnRlbnQuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUuY291cnNlICs9IDFcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LktOT1dMRURHRV9BUlRJRkFDVCkge1xuICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS5vdGhlciArPSAxXG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUubGVhcm5pbmdNb2R1bGUgKz0gMVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OKSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLm9mZmxpbmVTZXNzaW9uICs9IDFcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFKSB7XG4gICAgICAgICAgc3dpdGNoIChjaGlsZC5taW1lVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5IQU5EU19PTjpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLmhhbmRzT24gKz0gMVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDM6XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS5wb2RjYXN0ICs9IDFcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0OlxuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NM1U4OlxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUudmlkZW8gKz0gMVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5JTlRFUkFDVElPTjpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLmludGVyYWN0aXZlVmlkZW8gKz0gMVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5QREY6XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS5wZGYgKz0gMVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5PRkZMSU5FX1NFU1NJT046XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS5vZmZsaW5lU2Vzc2lvbiArPSAxXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlNVUlZFWTpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLnN1cnZleSArPSAxXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLkhUTUw6XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS53ZWJQYWdlICs9IDFcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUVVJWjpcbiAgICAgICAgICAgICAgaWYgKGNoaWxkLnJlc291cmNlVHlwZSA9PT0gJ0Fzc2Vzc21lbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLmFzc2Vzc21lbnQgKz0gMVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS5xdWl6ICs9IDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5QUkFDVElDRV9SRVNPVVJDRTpcbiAgICAgICAgICAgICAgLy8gY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5GSU5BTF9BU1NFU1NNRU5UOlxuICAgICAgICAgICAgICAvLyBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlBSQUNUSUNFX1JFU09VUkNFOlxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUucHJhY3RpY2VUZXN0ICs9IDFcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuV0VCX01PRFVMRTpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLndlYk1vZHVsZSArPSAxXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLllPVVRVQkU6XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS55b3V0dWJlICs9IDFcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS5vdGhlciArPSAxXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRTdHJ1Y3R1cmVba2V5XSA+IDApIHtcbiAgICAgICAgdGhpcy5oYXNDb250ZW50U3RydWN0dXJlID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBjb250ZXh0UGF0aCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGV4dElkOiB0aGlzLnJvb3RJZCxcbiAgICAgIGNvbnRleHRQYXRoOiB0aGlzLnJvb3RDb250ZW50VHlwZSxcbiAgICAgIGJhdGNoSWQ6IHRoaXMuYmF0Y2hJZCxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29udGVudFRyYWNrQnkoX2luZGV4OiBudW1iZXIsIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQuaWRlbnRpZmllclxuICB9XG5cbiAgcHVibGljIHJhaXNlVGVsZW1ldHJ5KCkge1xuICAgIC8vIGlmICh0aGlzLmZvclByZXZpZXcpIHsgcmV0dXJuIH1cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgICBzdWJUeXBlOiBgY2FyZC10b2NDb250ZW50Q2FyZGAsXG4gICAgICAgICAgLy8gaWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyIHx8ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgLy8gY29udGVudElkOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciB8fCAnJyxcbiAgICAgICAgICAvLyBjb250ZW50VHlwZTogdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgICBpZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIgfHwgJycsXG4gICAgICAgICAgdHlwZTogdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgICByb2xsdXA6IHtcbiAgICAgICAgICAgIGwxOiB0aGlzLnJvb3RJZCB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlcjogYCR7dGhpcy5jb250ZW50LnZlcnNpb259JHsnJ31gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGFnZUlkRXh0OiBgJHtfLmNhbWVsQ2FzZSh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KX0tY2FyZGAsXG4gICAgICAgICAgbW9kdWxlOiBfLmNhbWVsQ2FzZSh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KSxcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cbiAgZ2V0IGlzQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICByZXR1cm4gIShOc0NvbnRlbnQuVU5fU1VQUE9SVEVEX0RBVEFfVFlQRVNfRk9SX05PTl9CQVRDSF9VU0VSUy5pbmRleE9mKHRoaXMuY29udGVudC5taW1lVHlwZSkgPj0gMClcbiAgICB9IHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZ2V0IGlzRW5yb2xsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hJZCA/IHRydWUgOiBmYWxzZVxuICB9XG5cbiAgdXBkYXRlQ2hpbGRQYXJlbnRNYXAoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0pIHtcbiAgICAgIGxldCBsb2NhbENvbnRlbnREYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2lkZW50aWZpZXJdXG4gICAgICBpZiAoXG4gICAgICAgICEobG9jYWxDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFXG4gICAgICAgICAgfHwgbG9jYWxDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFXG4gICAgICAgICAgfHwgbG9jYWxDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlRcbiAgICAgICAgICB8fCBsb2NhbENvbnRlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UKVxuICAgICAgKSB7XG4gICAgICAgIC8vIHJlYWwgcGVyY2VudCBsb2dpY1xuICAgICAgICAvLyBjb25zdCB0b3RhbCA9IGxvY2FsQ29udGVudERhdGEubGVhZk5vZGVzLnJlZHVjZSgoc3VtOiBudW1iZXIsIGNoaWxkSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyAgIHJldHVybiBzdW0gKyBOdW1iZXIodGhpcy5oaWVyYXJjaHlNYXBEYXRhW2NoaWxkSWRdLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDApXG4gICAgICAgIC8vIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKVxuICAgICAgICAvLyBjb25zb2xlLmxvZygndG90YWwgJywgdG90YWwpXG4gICAgICAgIC8vIGlmKHRvdGFsID4gMCkge1xuICAgICAgICAvLyAgIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IHRvdGFsIC8gXy50b0ludGVnZXIoXy5nZXQodGhpcy5oaWVyYXJjaHlNYXBEYXRhW2lkZW50aWZpZXJdLCAnbGVhZk5vZGVzQ291bnQnKSlcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAobG9jYWxDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSkge1xuICAgICAgICAgIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXVsnZHVyYXRpb24nXSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXS5sZWFmTm9kZXMucmVkdWNlKFxuICAgICAgICAgICAgKHN1bTogYW55LCBjaGlsZElEOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbY2hpbGRJRF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VtICsgTnVtYmVyKHRoaXMuaGllcmFyY2h5TWFwRGF0YVtjaGlsZElEXS5kdXJhdGlvbiB8fCB0aGlzLmhpZXJhcmNoeU1hcERhdGFbY2hpbGRJRF0uZXhwZWN0ZWREdXJhdGlvbiB8fCAwKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sIDApXG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGVcbiAgICAgICAgY29uc3QgY29tcGxldGVkSXRlbXMgPSBfLmZpbHRlcih0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0ubGVhZk5vZGVzLCByID0+ICh0aGlzLmhpZXJhcmNoeU1hcERhdGFbcl0gJiYgKHRoaXMuaGllcmFyY2h5TWFwRGF0YVtyXS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtyXS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSkpXG4gICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBfLnRvSW50ZWdlcihfLmdldCh0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0sICdsZWFmTm9kZXNDb3VudCcpKSB8fCAxXG4gICAgICAgIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IE51bWJlcigoKGNvbXBsZXRlZEl0ZW1zLmxlbmd0aCAvIHRvdGFsQ291bnQpICogMTAwKS50b0ZpeGVkKCkpXG4gICAgICAgIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXVsnY29tcGxldGlvblN0YXR1cyddID0gKHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApID8gMiA6IDFcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl1cbiAgICB9XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBnZXRDb21wbGV0aW9uUGVyY2VudGFnZShpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UnLCBpZGVudGlmaWVyKVxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0gOiAnLCB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0pXG4gICAgLy8gY29uc3QgaXRlbSA9IHRoaXMudXBkYXRlQ2hpbGRQYXJlbnRNYXAoaWRlbnRpZmllcilcbiAgICBsZXQgcGVyY2VudCA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0gJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2lkZW50aWZpZXJdLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDBcbiAgICByZXR1cm4gdGhpcy5yb3VuZElmRGVjaW1hbChwZXJjZW50KVxuICB9XG5cbiAgcm91bmRJZkRlY2ltYWwodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUudG9GaXhlZCgyKSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuXG4gIGdldENvbXBsZXRpb25TdGF0dXMoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2dldENvbXBsZXRpb25TdGF0dXMnKVxuICAgIC8vIGNvbnN0IGl0ZW0gPSB0aGlzLnVwZGF0ZUNoaWxkUGFyZW50TWFwKGlkZW50aWZpZXIpXG4gICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0gJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2lkZW50aWZpZXJdLmNvbXBsZXRpb25TdGF0dXNcbiAgfVxuXG4gIG9wZW5DZXJ0aWZpY2F0ZURpYWxvZyhjZXJ0RGF0YTogYW55KSB7XG4gICAgY29uc3QgY2V0ID0gY2VydERhdGFcbiAgICB0aGlzLmRpYWxvZy5vcGVuKENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAvLyBoZWlnaHQ6ICc0MDBweCcsXG4gICAgICB3aWR0aDogJzEzMDBweCcsXG4gICAgICBkYXRhOiB7IGNldCB9LFxuICAgICAgLy8gcGFuZWxDbGFzczogJ2N1c3RvbS1kaWFsb2ctY29udGFpbmVyJyxcbiAgICB9KVxuICB9XG4gIHNjcm9sbFZpZXcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBlcnJvckZpZWxkOiBhbnkgPSB0aGlzLnJlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KCcucmVzb3VyY2UtY29udGFpbmVyIC5yZXNvdXJjZS1hY3RpdmUnKVxuICAgICAgaWYgKGVycm9yRmllbGQpIHtcbiAgICAgICAgZXJyb3JGaWVsZC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiBcInNtb290aFwiLCBibG9jazogXCJzdGFydFwiLCBpbmxpbmU6IFwibmVhcmVzdFwiIH0pXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb21wb25lbnROYW1lID09PSAndG9jJykge1xuICAgICAgICBpZiAoZXJyb3JGaWVsZCkge1xuICAgICAgICAgIGNvbnN0IHJlY3QgPSBlcnJvckZpZWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgaWYgKHJlY3QudG9wIC0gNDIwID4gMCkge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbCg0MjAsIHJlY3QudG9wIC0gMTQ4KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwVG9jU3ZjLmdldFBhZ2VTY3JvbGwubmV4dChmYWxzZSlcbiAgICAgIH0sIDcwMClcblxuICAgICAgLy8gZWxzZSB7XG4gICAgICAvLyAgIGVycm9yRmllbGQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogXCJzbW9vdGhcIiwgYmxvY2s6IFwic3RhcnRcIiwgaW5saW5lOiBcIm5lYXJlc3RcIiB9KTtcbiAgICAgIC8vICAgY29uc3QgcmVjdCA9IGVycm9yRmllbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAvLyAgIGVycm9yRmllbGQuc2Nyb2xsKDAscmVjdC50b3AtNTYpXG4gICAgICAvLyB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgfVxuICB9XG5cbiAgZG93bmxvYWRDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZURhdGE6IGFueSkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFR5cGVzLkNMSUNLLFxuICAgICAgICBpZDogJ3ZpZXctY2VydGlmaWNhdGUnLFxuICAgICAgICBzdWJUeXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RTdWJUeXBlcy5DRVJUSUZJQ0FURSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBjZXJ0aWZpY2F0ZURhdGEsICAgLy8gaWQgb2YgdGhlIGNlcnRpZmljYXRlXG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFN1YlR5cGVzLkNFUlRJRklDQVRFLFxuICAgICAgfSlcbiAgICBpZiAoY2VydGlmaWNhdGVEYXRhKSB7XG4gICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nID0gdHJ1ZVxuICAgICAgbGV0IGNlcnREYXRhOiBhbnkgPSBjZXJ0aWZpY2F0ZURhdGFcbiAgICAgIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlLmRvd25sb2FkQ2VydGlmaWNhdGVfdjIoY2VydERhdGEpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnN0IGNldCA9IHJlcy5yZXN1bHQucHJpbnRVcmlcbiAgICAgICAgdGhpcy5kaWFsb2cub3BlbihDZXJ0aWZpY2F0ZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgIHdpZHRoOiAnMTMwMHB4JyxcbiAgICAgICAgICBkYXRhOiB7IGNldCwgY2VydElkOiBjZXJ0RGF0YS5pZGVudGlmaWVyIH0sXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nID0gZmFsc2VcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucGFnZVNjcm9sbFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5wYWdlU2Nyb2xsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxuICBnZXQgY2hlY2tGb3JDdXJhdGVkUHJvZ3JhbSgpIHtcbiAgICBpZiAodGhpcy5fY2FjaGVJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZENoZWNrRm9yQ3VyYXRlZFByb2dyYW1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUNoZWNrRm9yQ3VyYXRlZFByb2dyYW0oKVxuICB9XG5cbiAgZ2V0IGlzQ29udGVudFVubG9ja2VkKCkge1xuICAgIGlmICh0aGlzLl9jYWNoZUluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVkSXNDb250ZW50VW5sb2NrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUlzQ29udGVudFVubG9ja2VkKClcbiAgfVxuXG4gIGdldCBpc1BhcmVudE1pbGVzdG9uZUxvY2tlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fY2FjaGVJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZElzUGFyZW50TWlsZXN0b25lTG9ja2VkXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVJc1BhcmVudE1pbGVzdG9uZUxvY2tlZCgpXG4gIH1cblxuICBnZXQgaXNNaWxlc3RvbmVMb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2NhY2hlSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRJc01pbGVzdG9uZUxvY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21wdXRlSXNNaWxlc3RvbmVMb2NrZWQoKVxuICB9XG5cbiAgZ2V0IGlzTWlsZXN0b25lQXNzZXNzbWVudCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fY2FjaGVJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZElzTWlsZXN0b25lQXNzZXNzbWVudFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21wdXRlSXNNaWxlc3RvbmVBc3Nlc3NtZW50KClcbiAgfVxuXG4gIGdldCBpc01pbGVzdG9uZUFzc2Vzc21lbnRMb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2NhY2hlSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRJc01pbGVzdG9uZUFzc2Vzc21lbnRMb2NrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUlzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZCgpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBtaWxlc3RvbmUncyBtYW5kYXRvcnkgY291cnNlcyBhbmQgYXNzZXNzbWVudCBhcmUgY29tcGxldGVkLlxuICAgKiBMb29rcyBhdCB0aGUgY29udGVudCBoaWVyYXJjaHkgdG8gZmluZCBjaGlsZHJlbiBvZiB0aGUgbWlsZXN0b25lLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja01pbGVzdG9uZUNvbnRlbnRDb21wbGV0aW9uKG1pbGVzdG9uZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSB8fCAhdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmNoaWxkcmVuIHx8ICF0aGlzLmhpZXJhcmNoeU1hcERhdGEpIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBUcnkgdG8gZmluZCBhc3Nlc3NtZW50IGNvbXBsZXRpb24gaW4gaGFzaG1hcCBmb3IgdGhpcyBtaWxlc3RvbmVcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrTWlsZXN0b25lQXNzZXNzbWVudENvbXBsZXRpb24obWlsZXN0b25lSWQpXG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgbWlsZXN0b25lIGluIHRoZSBjb250ZW50IGhpZXJhcmNoeVxuICAgIGNvbnN0IG1pbGVzdG9uZUNvbnRlbnQgPSB0aGlzLmZpbmRDb250ZW50SW5IaWVyYXJjaHkodGhpcy5iYXNlQ29udGVudFJlYWREYXRhLCBtaWxlc3RvbmVJZClcbiAgICBpZiAoIW1pbGVzdG9uZUNvbnRlbnQgfHwgIW1pbGVzdG9uZUNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrTWlsZXN0b25lQXNzZXNzbWVudENvbXBsZXRpb24obWlsZXN0b25lSWQpXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYWxsIG1hbmRhdG9yeSBjb3Vyc2VzIGFuZCBhc3Nlc3NtZW50c1xuICAgIGxldCBhbGxNYW5kYXRvcnlDb21wbGV0ZSA9IHRydWVcbiAgICBsZXQgaGFzQXNzZXNzbWVudCA9IGZhbHNlXG4gICAgbGV0IGFzc2Vzc21lbnRDb21wbGV0ZSA9IGZhbHNlXG5cbiAgICBtaWxlc3RvbmVDb250ZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkRGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtjaGlsZC5pZGVudGlmaWVyXVxuICAgICAgY29uc3QgaXNBc3Nlc3NtZW50ID0gY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGNoaWxkLmNvdXJzZUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0ZpbmFsIEFzc2Vzc21lbnQnXG4gICAgICBjb25zdCBpc01hbmRhdG9yeSA9IGNoaWxkLm1hbmRhdG9yeSA9PT0gdHJ1ZSB8fCBjaGlsZC5vcHRpb25hbFJlYWRpbmcgIT09IHRydWVcblxuICAgICAgaWYgKGlzQXNzZXNzbWVudCkge1xuICAgICAgICBoYXNBc3Nlc3NtZW50ID0gdHJ1ZVxuICAgICAgICBpZiAoY2hpbGREYXRhICYmIChjaGlsZERhdGEuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZERhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwKSkge1xuICAgICAgICAgIGFzc2Vzc21lbnRDb21wbGV0ZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc01hbmRhdG9yeSkge1xuICAgICAgICAvLyBDaGVjayBpZiBtYW5kYXRvcnkgY29udGVudCBpcyBjb21wbGV0ZWRcbiAgICAgICAgaWYgKCFjaGlsZERhdGEgfHwgKGNoaWxkRGF0YS5jb21wbGV0aW9uU3RhdHVzICE9PSAyICYmIGNoaWxkRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkpIHtcbiAgICAgICAgICBhbGxNYW5kYXRvcnlDb21wbGV0ZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc29sZS5sb2coJ01pbGVzdG9uZSBjb250ZW50IGNoZWNrOicsIHsgYWxsTWFuZGF0b3J5Q29tcGxldGUsIGhhc0Fzc2Vzc21lbnQsIGFzc2Vzc21lbnRDb21wbGV0ZSB9KVxuXG4gICAgLy8gTWlsZXN0b25lIGlzIGNvbXBsZXRlIGlmIGFzc2Vzc21lbnQgaXMgY29tcGxldGUgKG1hbmRhdG9yeSBjb3Vyc2VzIG9wdGlvbmFsIGJhc2VkIG9uIHJlcXVpcmVtZW50cylcbiAgICByZXR1cm4gaGFzQXNzZXNzbWVudCA/IGFzc2Vzc21lbnRDb21wbGV0ZSA6IGFsbE1hbmRhdG9yeUNvbXBsZXRlXG4gIH1cblxuICAvKipcbiAgICogRmFsbGJhY2s6IENoZWNrIGlmIGVub3VnaCBhc3Nlc3NtZW50cyBhcmUgY29tcGxldGVkIHRvIHVubG9jayB0aGlzIG1pbGVzdG9uZS5cbiAgICogRm9yIG1pbGVzdG9uZSBhdCBpbmRleCBOLCB3ZSBuZWVkIGF0IGxlYXN0IE4gY29tcGxldGVkIGFzc2Vzc21lbnRzLlxuICAgKiBFLmcuLCBGb3IgTTIgKGluZGV4IDEpLCB3ZSBuZWVkIDEgY29tcGxldGVkIGFzc2Vzc21lbnQgKE0xJ3MgYXNzZXNzbWVudClcbiAgICogICAgICAgRm9yIE0zIChpbmRleCAyKSwgd2UgbmVlZCAyIGNvbXBsZXRlZCBhc3Nlc3NtZW50cyAoTTEncyBhbmQgTTIncylcbiAgICovXG4gIHByaXZhdGUgY2hlY2tNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGlvbihtaWxlc3RvbmVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmhpZXJhcmNoeU1hcERhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgbWlsZXN0b25lIG51bWJlciBmcm9tIElEIChNMSAtPiAxLCBNMiAtPiAyLCBldGMuKVxuICAgIGNvbnN0IG1pbGVzdG9uZU51bSA9IHBhcnNlSW50KG1pbGVzdG9uZUlkLnJlcGxhY2UoL1xcRC9nLCAnJykpIHx8IDBcbiAgICBjb25zdCByZXF1aXJlZENvbXBsZXRlZEFzc2Vzc21lbnRzID0gbWlsZXN0b25lTnVtIC0gMSAvLyBGb3IgTTIsIG5lZWQgMTsgZm9yIE0zLCBuZWVkIDJcblxuICAgIGNvbnNvbGUubG9nKGBNaWxlc3RvbmUgJHttaWxlc3RvbmVJZH0gKG51bTogJHttaWxlc3RvbmVOdW19KSByZXF1aXJlcyAke3JlcXVpcmVkQ29tcGxldGVkQXNzZXNzbWVudHN9IGNvbXBsZXRlZCBhc3Nlc3NtZW50c2ApXG5cbiAgICBpZiAocmVxdWlyZWRDb21wbGV0ZWRBc3Nlc3NtZW50cyA8PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZSAvLyBGaXJzdCBtaWxlc3RvbmUsIG5vIHJlcXVpcmVtZW50c1xuICAgIH1cblxuICAgIC8vIENvdW50IGNvbXBsZXRlZCBDb3Vyc2UgQXNzZXNzbWVudHMgdGhhdCBhcmUgSU5TSURFIG1pbGVzdG9uZXMgKGhhdmUgYSBwYXJlbnQpXG4gICAgLy8gRXhjbHVkZSBwcmUtZW5yb2xsbWVudCBhc3Nlc3NtZW50cyBhdCB0aGUgcm9vdCBsZXZlbCAobm8gcGFyZW50IG9yIHBhcmVudCBpcyBMZWFybmluZyBQYXRod2F5KVxuICAgIGxldCBjb21wbGV0ZWRNaWxlc3RvbmVBc3Nlc3NtZW50Q291bnQgPSAwXG4gICAgY29uc3QgbGVhcm5pbmdQYXRod2F5SWQgPSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXJcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuaGllcmFyY2h5TWFwRGF0YSkpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhpZXJhcmNoeU1hcERhdGFba2V5XVxuXG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgY29tcGxldGVkIENvdXJzZSBBc3Nlc3NtZW50XG4gICAgICBpZiAoKGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8IGl0ZW0uY291cnNlQ2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcpICYmXG4gICAgICAgIChpdGVtLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApKSB7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBhc3Nlc3NtZW50IGhhcyBhIHBhcmVudCAobWVhbmluZyBpdCdzIGluc2lkZSBhIGNvdXJzZS9taWxlc3RvbmUsIG5vdCBhdCByb290IGxldmVsKVxuICAgICAgICAvLyBBbHNvIGV4Y2x1ZGUgaWYgcGFyZW50IGlzIHRoZSBMZWFybmluZyBQYXRod2F5IGl0c2VsZiAocHJlLWVucm9sbG1lbnQgYXNzZXNzbWVudClcbiAgICAgICAgY29uc3QgaGFzUGFyZW50ID0gaXRlbS5wYXJlbnQgJiYgaXRlbS5wYXJlbnQgIT09IGxlYXJuaW5nUGF0aHdheUlkXG5cbiAgICAgICAgaWYgKGhhc1BhcmVudCkge1xuICAgICAgICAgIGNvbXBsZXRlZE1pbGVzdG9uZUFzc2Vzc21lbnRDb3VudCsrXG4gICAgICAgICAgY29uc29sZS5sb2coYEZvdW5kIGNvbXBsZXRlZCBNSUxFU1RPTkUgYXNzZXNzbWVudDogJHtrZXl9YCwgaXRlbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgU2tpcHBpbmcgcm9vdC1sZXZlbC9wcmUtZW5yb2xsbWVudCBhc3Nlc3NtZW50OiAke2tleX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFRvdGFsIGNvbXBsZXRlZCBNSUxFU1RPTkUgYXNzZXNzbWVudHM6ICR7Y29tcGxldGVkTWlsZXN0b25lQXNzZXNzbWVudENvdW50fSwgUmVxdWlyZWQ6ICR7cmVxdWlyZWRDb21wbGV0ZWRBc3Nlc3NtZW50c31gKVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggY29tcGxldGVkIG1pbGVzdG9uZSBhc3Nlc3NtZW50cywgdW5sb2NrIHRoaXMgbWlsZXN0b25lXG4gICAgcmV0dXJuIGNvbXBsZXRlZE1pbGVzdG9uZUFzc2Vzc21lbnRDb3VudCA+PSByZXF1aXJlZENvbXBsZXRlZEFzc2Vzc21lbnRzXG4gIH1cblxuICBwcml2YXRlIGZpbmRDb250ZW50SW5IaWVyYXJjaHkoY29udGVudDogYW55LCBpZGVudGlmaWVyOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghY29udGVudCkgcmV0dXJuIG51bGxcbiAgICBpZiAoY29udGVudC5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSByZXR1cm4gY29udGVudFxuICAgIGlmIChjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRDb250ZW50SW5IaWVyYXJjaHkoY2hpbGQsIGlkZW50aWZpZXIpXG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBnZXQgY29tcHV0ZWRRdWVyeVBhcmFtcygpIHtcbiAgICBpZiAodGhpcy5pc0FsbG93ZWQgJiYgIXRoaXMuZm9yUHJldmlldyAmJiB0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhpcy5yZXNvdXJjZUxpbmsucXVlcnlQYXJhbXMsXG4gICAgICAgIHByZUFzc2Vzc21lbnQ6ICd0cnVlJ1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZ2V0IGlzTWlsZXN0b25lKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9jYWNoZUluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmVcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUlzTWlsZXN0b25lKClcbiAgfVxuXG4gIGdldE1pbGVzdG9uZUNvbXBsZXRlZENvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnQgfHwgIXRoaXMuaGllcmFyY2h5TWFwRGF0YSkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gICAgY29uc3QgbWlsZXN0b25lRGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVt0aGlzLmNvbnRlbnQuaWRlbnRpZmllcl1cbiAgICBpZiAoIW1pbGVzdG9uZURhdGEgfHwgIW1pbGVzdG9uZURhdGEubGVhZk5vZGVzKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgICBsZXQgY29tcGxldGVkQ291bnQgPSAwXG4gICAgbWlsZXN0b25lRGF0YS5sZWFmTm9kZXMuZm9yRWFjaCgobGVhZklkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGxlYWZEYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2xlYWZJZF1cbiAgICAgIGlmIChsZWFmRGF0YSAmJiBsZWFmRGF0YS5jb21wbGV0aW9uU3RhdHVzID09PSAyKSB7XG4gICAgICAgIGNvbXBsZXRlZENvdW50KytcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBjb21wbGV0ZWRDb3VudFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1bmxvY2sgY3JpdGVyaWEgbWVzc2FnZSBmb3IgbG9ja2VkIG1pbGVzdG9uZXNcbiAgICovXG4gIGdldE1pbGVzdG9uZVVubG9ja01lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29udGVudCB8fCAhdGhpcy5oaWVyYXJjaHlNYXBEYXRhKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICBjb25zdCBtaWxlc3RvbmVEYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudC5pZGVudGlmaWVyXVxuICAgIGlmICghbWlsZXN0b25lRGF0YSkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgY29uc3QgbWlsZXN0b25lSW5kZXggPSBtaWxlc3RvbmVEYXRhLm1pbGVzdG9uZUluZGV4XG5cbiAgICAvLyBNaWxlc3RvbmUgMSByZXF1aXJlcyBwcmUtYXNzZXNzbWVudCBjb21wbGV0aW9uXG4gICAgaWYgKG1pbGVzdG9uZUluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gJ0NvbXBsZXRlIHRoZSBwcmVsaW1pbmFyeSBhc3Nlc3NtZW50IHRvIHVubG9jayB0aGlzIG1pbGVzdG9uZSdcbiAgICB9XG5cbiAgICAvLyBPdGhlciBtaWxlc3RvbmVzIHJlcXVpcmUgcHJldmlvdXMgbWlsZXN0b25lIGNvbXBsZXRpb25cbiAgICByZXR1cm4gYENvbXBsZXRlIGFsbCBtYW5kYXRvcnkgY29udGVudCBhbmQgYXNzZXNzbWVudCBpbiBNaWxlc3RvbmUgJHttaWxlc3RvbmVJbmRleH0gdG8gdW5sb2NrIHRoaXMgbWlsZXN0b25lYFxuICB9XG5cbiAgc2hvdWxkU2hvd0Rvd25sb2FkQnV0dG9uKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGNvbnRlbnQgaGFzIGFuIGFydGlmYWN0IFVSTCAoZG93bmxvYWRhYmxlIHJlc291cmNlKVxuICAgIGlmICghY29udGVudC5hcnRpZmFjdFVybCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYmFzZSBjb250ZW50IHJlc291cmNlIGNhdGVnb3J5IGluY2x1ZGVzIFwiQ2FzZSBTdHVkeVwiXG4gICAgaWYgKCF0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5IHx8XG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuY291cnNlQ2F0ZWdvcnkgIT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ0FTRV9TVFVEWSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy9mb3IgcHVibGljIHNjZW5hcmlvIGNoZWNrIGlmIGl0cyBwbGF5ZXIgcGxhZ2UgdGhlbiBvbmx5IGVuYWJsZSBkb3dubG9hZFxuICAgIGlmICh0aGlzLmZvclByZXZpZXcgJiYgIXdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvdmlld2VyLycpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBmb3IgbG9nZ2VkIGluIHVzZXIgY2hlY2sgaWYgdXNlciBlbnJvbGxlZCB0aGVuIG9ubHkgYWxsb3cgZG93bmxvYWRcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldyAmJiAhdGhpcy5pc0Vucm9sbGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgZG93bmxvYWRhYmxlIE1JTUUgdHlwZXNcbiAgICBjb25zdCBkb3dubG9hZGFibGVNaW1lVHlwZXMgPSBbXG4gICAgICBOc0NvbnRlbnQuRU1pbWVUeXBlcy5QREZcbiAgICBdXG5cbiAgICByZXR1cm4gZG93bmxvYWRhYmxlTWltZVR5cGVzLmluY2x1ZGVzKGNvbnRlbnQubWltZVR5cGUpXG4gIH1cblxuICBkb3dubG9hZENvbnRlbnQoY29udGVudDogTnNDb250ZW50LklDb250ZW50LCBldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfVxuICAgIGNvbnN0IHBhZ2VJZCA9IGBhcHAvdG9jL3BhZ2VJZC8ke2NvbnRlbnQuaWRlbnRpZmllcn1gXG4gICAgdGhpcy5yZXNvdXJjZURvd25sb2FkSGVscGVyU3ZjLmRvd25sb2FkUERGKGNvbnRlbnQsIHBhZ2VJZClcbiAgICBjb25zb2xlLmxvZygnY29udGVudCcsIGNvbnRlbnQpXG4gICAgY29uc29sZS5sb2coJ2Jhc2VDb250ZW50JywgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhKVxuICB9XG5cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50ICYmICFpc1ByZUFzc2Vzc21lbnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb2xsZWN0aW9uICYmICFpc01vZHVsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbGxlY3Rpb25UZW1wbGF0ZVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb2xsZWN0aW9uICYmIGlzTW9kdWxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5tb2R1bGVSZXNvdXJzZUNvdW50XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbGxlY3Rpb25UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiAqbmdJZj1cImlzUmVzb3VyY2VcIiBjbGFzcz1cInJlc291cmNlLWNvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInBhdGhTZXQ/Lmhhcyhjb250ZW50Py5pZGVudGlmaWVyKSAmJiBpc0Vucm9sbGVkID8gJ2NvbnRlbnQtYWN0aXZlLXJlc291cmNlJzogJ2NvbnRlbnQtbm90LWFjdGl2ZS1yZXNvdXJjZSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc291cmNlIGZsZXggIHNtOmZsZXgtcm93IGZsZXgtc3RhcnQgd2lkdGgtZXhwYW5kIHctMTAwIHNtOnByLTQgc206dy1hdXRvXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlUmVzb3VyY2UnOiBwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcikgJiYgaXNFbnJvbGxlZH1cIj5cbiAgICAgICAgICAgIDwhLS0gTG9jayBtZXNzYWdlIGZvciBjdXJhdGVkIHByb2dyYW1zIG9ubHkgKHNob3duIGFib3ZlIGNvbnRlbnQpIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgJiYgY2hlY2tGb3JDdXJhdGVkUHJvZ3JhbSAmJlxuICAgICAgICAgICAgIWlzQ29udGVudFVubG9ja2VkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbG9ja2luZyBmbGV4IHctZnVsbCBmbGV4LW1pZGRsZSBtYi0yIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImxvY2staWNvblwiPmxvY2s8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvY2stbWVzc2FnZSBtYXQtYm9keS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBUaGUgY29udGVudCBpcyBsb2NrZWQuIENvbXBsZXRlIHByb2dyYW0gb3IgYWxsIGNvdXJzZXMgdG8gdmlldyB0aGlzIG1vZHVsZVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UICYmIGNoZWNrRm9yQ3VyYXRlZFByb2dyYW0gJiZcbiAgICAgICAgICAgIGlzQ29udGVudFVubG9ja2VkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbG9ja2luZyBmbGV4IHctZnVsbCBmbGV4LW1pZGRsZSBtYi0yIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInVubG9jay1pY29uXCI+bG9ja19vcGVuX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1bmxvY2stbWVzc2FnZSBtYXQtYm9keS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNvbnRlbnQgaXMgdW5sb2NrZWQuXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLXN0YXJ0IGp1c3RpZnktc3RhcnQgc206anVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gKm5nSWY9XCIhZm9yUHJldmlldyAmJiBjb250ZW50Py5hcnRpZmFjdFVybCAmJiAhaXNYU21hbGwgJiYgaXNBbGxvd2VkICYmIGlzRW5hYmxlZFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYnV0dG9uTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0aWNhbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Vucm9sbGVkICAmJiAhaXNNaWxlc3RvbmVMb2NrZWQgJiYgIWlzUGFyZW50TWlsZXN0b25lTG9ja2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZvclByZXZpZXcgJiYgIGNvbnRlbnQ/LmlkZW50aWZpZXIgJiYgZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcikgOyBlbHNlIGVsc2VCbG9ja1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29tcGxldGlvblN0YXR1cyhjb250ZW50Py5pZGVudGlmaWVyKSA9PSAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29tcGxldGVkLWljb25cIiBbY29sb3JdPVwiYmx1ZVwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29tcGxldGlvblN0YXR1cyhjb250ZW50Py5pZGVudGlmaWVyKSA8IDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGVyY2VudF09XCJnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKVwiIFtyYWRpdXNdPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VXaWR0aF09XCIyXCIgW2lubmVyU3Ryb2tlV2lkdGhdPVwiMlwiIFtzcGFjZV09XCItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZUNvbG9yXT1cInByb2dyZXNzQ29sb3IyKClcIiBbaW5uZXJTdHJva2VDb2xvcl09XCIncmdiYSgwLCAwLCAwLCAwLjE2KSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5pbWF0aW9uXT1cInRydWVcIiBbYW5pbWF0aW9uRHVyYXRpb25dPVwiMjUwXCIgW3Nob3dUaXRsZV09XCJmYWxzZVwiIFtzaG93VW5pdHNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCIgW2Nsb2Nrd2lzZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRPcGFjaXR5XT1cIjBcIiBbYmFja2dyb3VuZEdyYWRpZW50XT1cImZhbHNlXCIgW2JhY2tncm91bmRTdHJva2VXaWR0aF09XCIzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkluIHByb2dyZXNzXCIgW3Nob3daZXJvT3V0ZXJTdHJva2VdPWZhbHNlIFtiYWNrZ3JvdW5kUGFkZGluZ109XCItOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGFydEZyb21aZXJvXT1cImZhbHNlXCIgW2JhY2tncm91bmRQYWRkaW5nXT1cIjBcIiBbaW1hZ2VIZWlnaHRdPVwiMjJcIiBbaW1hZ2VXaWR0aF09XCIyMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QmFja2dyb3VuZF09XCJmYWxzZVwiIFtvdXRlclN0cm9rZUxpbmVjYXBdPVwiJ2J1dHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaXJjbGUtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8d3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3MgKm5nSWY9XCJjb250ZW50Py5pZGVudGlmaWVyXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb250ZW50SWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiIGNsYXNzPVwicHJvZ3Jlc3MtYmFyLXRoaW5cIiBbcHJvZ3Jlc3NdPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbcHJvZ3Jlc3NUeXBlXT1cIidwZXJjZW50YWdlJ1wiPlxuICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZS1wcm9ncmVzcyBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHByb2dyZXNzXCIgW3BlcmNlbnRdPVwiMFwiIFtyYWRpdXNdPVwiMTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZVdpZHRoXT1cIjJcIiBbaW5uZXJTdHJva2VXaWR0aF09XCIyXCIgW291dGVyU3Ryb2tlQ29sb3JdPVwiJyM4MDgwODAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJTdHJva2VDb2xvcl09XCInIzgwODA4MCdcIiBbYW5pbWF0aW9uXT1cInRydWVcIiBbc3BhY2VdPVwiLTJcIiBbc2hvd1VuaXRzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5pbWF0aW9uRHVyYXRpb25dPVwiMjUwXCIgW3Nob3dUaXRsZV09XCJmYWxzZVwiIFtiYWNrZ3JvdW5kUGFkZGluZ109XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZFBhZGRpbmddPVwiLTlcIiBbb3V0ZXJTdHJva2VMaW5lY2FwXT1cIididXR0J1wiIG1hdFRvb2x0aXA9XCJOb3Qgc3RhcnRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dTdWJ0aXRsZV09XCJmYWxzZVwiIFtzaG93SW5uZXJTdHJva2VdPVwidHJ1ZVwiIFtjbG9ja3dpc2VdPVwidHJ1ZVwiIFtpbWFnZUhlaWdodF09XCIyMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlV2lkdGhdPVwiMjJcIiBbc2hvd0JhY2tncm91bmRdPVwiZmFsc2VcIj48L2NpcmNsZS1wcm9ncmVzcz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHA+bm8gZGF0YTwvcD4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gZGVhY3RpdmF0ZWQgYXMgcGVyIE5JQyBDRU8gcmVxdWlyZW1lbnQgdG8gYWNjZXNzIGNvdXJzZSB3dGhvdXQgbG9naW4gLS0+XG4gICAgICAgICAgICA8YSBjbGFzcz1cIndpZHRoLWV4cGFuZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIihmb3JQcmV2aWV3IHx8ICFpc0VuYWJsZWQgfHwgIWlzRW5yb2xsZWQgfHwgIWlzQmF0Y2hJblByb2dlc3MgfHwgIWlzQ29udGVudFVubG9ja2VkIHx8IGlzUGFyZW50TWlsZXN0b25lTG9ja2VkIHx8IGlzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtbC0zJzogaXNFbnJvbGxlZH1cIlxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIihpc0FsbG93ZWQgJiYgIWZvclByZXZpZXcgJiYgaXNFbmFibGVkICYmICFpc1BhcmVudE1pbGVzdG9uZUxvY2tlZCAmJiAhaXNNaWxlc3RvbmVBc3Nlc3NtZW50TG9ja2VkKSA/IHJlc291cmNlTGluay51cmwgOiBudWxsXCJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKGlzQWxsb3dlZCAmJiAhZm9yUHJldmlldyAmJiBpc0VuYWJsZWQgJiYgIWlzUGFyZW50TWlsZXN0b25lTG9ja2VkICYmICFpc01pbGVzdG9uZUFzc2Vzc21lbnRMb2NrZWQpICA/IHJlc291cmNlTGluay5xdWVyeVBhcmFtcyA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImlzUGFyZW50TWlsZXN0b25lTG9ja2VkID8gJ1RoaXMgY29udGVudCBpcyBsb2NrZWQuIENvbXBsZXRlIHByZXZpb3VzIG1pbGVzdG9uZSB0byB2aWV3IHRoaXMgY29udGVudC4nIDogKGlzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZCA/ICdUaGlzIGNvbnRlbnQgaXMgbG9ja2VkLiBDb21wbGV0ZSBhbGwgbWFuZGF0b3J5IGl0ZW1zIHRvIHVubG9jayB0aGUgYXNzZXNzbWVudC4nIDogJycpXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydyZXNvdXJjZS1hY3RpdmUnOiBwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcikgJiYgaXNFbnJvbGxlZH1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZSBcIiBbbmdDbGFzc109XCJ7J2N1cnNvci1wb2ludGVyJzogIWlzRW5hYmxlZCAmJiBpc0Vucm9sbGVkfVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdDaGlsZHJlbiA9ICFjb250ZW50LnZpZXdDaGlsZHJlbjsgcmFpc2VUZWxlbWV0cnkoKTsgY2hhbmdlUmVzb3VyY2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWFyZ2luLXJlbW92ZSB0ZXh0LXRydW5jYXRlIG1hdC1ib2R5LTIgZmxleC1hdXRvIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndGV4dC1hY3RpdmUnOiBwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcikgJiYgaXNFbnJvbGxlZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cIm1hcmdpbi1yaWdodC14cyByYWRpb2J0biB0aW1lLWljb25cIj5yYWRpb19idXR0b25fdW5jaGVja2VkIDwvbWF0LWljb24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbnRlbnQ/Lm5hbWUgfCB0cnVuY2F0ZTo1MCB9fVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRlbnQtdHlwZSBvcHRpb25hbC1zcGFuIG5vZHRyYW5zbGF0ZVwiICpuZ0lmPVwiY29udGVudD8ub3B0aW9uYWxSZWFkaW5nXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxheWVyYnJpZWYub3B0aW9uYWwnIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBmb3IgZGVmYXVsdCBncmV5IGljb25zIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXBhdGhTZXQ/Lmhhcyhjb250ZW50Py5pZGVudGlmaWVyKSB8fCAhaXNFbnJvbGxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc2ljb25zIHdzLW1hdC1ibGFjazYwLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L3ZpZGVvLnN2Z1wiIGFsdD1cIlZpZGVvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICd2aWRlby9tcDQnIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndmlkZW8veC15b3V0dWJlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/Lm1pbWVUeXBlID09PSdhcHBsaWNhdGlvbi94LW1wZWdVUkwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9hdWRpby5zdmdcIiBhbHQ9XCJBdWRpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIiAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXVkaW8vbXBlZydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L3BkZi5zdmdcIiBhbHQ9XCJQREZcIiBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvcmVzb3VyY2Uuc3ZnXCIgYWx0PVwiU3VydmV5XCIgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9zdXJ2ZXknXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvbGluay5zdmdcIiBhbHQ9XCJJbnRlcmFjdGl2ZUNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuaHRtbC1hcmNoaXZlJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ3RleHQveC11cmwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9hc3Nlc3NtZW50LnN2Z1wiIGFsdD1cIkFzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vcXVpeicgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L2ltYWdlLnN2Z1wiIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdpbWFnZS9wbmcnIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnaW1hZ2UvanBlZydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L2NvbnRlbnRfY29weS5zdmdcIiBjbGFzcz1cImNvbnRlbnRpY29uXCIgYWx0PVwiQ291cnNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLmVrc3RlcC5jb250ZW50LWNvbGxlY3Rpb24nIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vc3VydmV5J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvbW9kdWxlLnN2Z1wiIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJvZmZsaW5lIHNlc3Npb25zXCIgKm5nSWY9XCJjb250ZW50Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vb2ZmbGluZSdcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVzb3VyY2VEdXJhdGlvbiB3cy1tYXQtYmxhY2s2MC10ZXh0IG5vZHRyYW5zbGF0ZVwiPnt7IGNvbnRlbnQ/Lm1heFF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0ge3sgJ3BsYXllcmJyaWVmLnF1ZXN0aW9ucycgfCB0cmFuc2xhdGUgfCB0aXRsZWNhc2V9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXNvdXJjZUR1cmF0aW9uIHdzLW1hdC1ibGFjazYwLXRleHQgbm9kdHJhbnNsYXRlXCI+e3sgKGNvbnRlbnQ/LmR1cmF0aW9ufHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeU1hcERhdGFbY29udGVudD8uaWRlbnRpZmllcl0/LmV4cGVjdGVkRHVyYXRpb24gfHwgMCl8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlRHVyYXRpb25UcmFuc2Zvcm06XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG1zJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBmb3Igd2hpdGUgaWNvbnMgd2hlbiBjb250ZW50IGhpZ2hsaWdodGVkIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpICYmIGlzRW5yb2xsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpY29ucyB3cy1tYXQtd2hpdGUtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL3ZpZGVvLnN2Z1wiIGFsdD1cIlZpZGVvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICd2aWRlby9tcDQnIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndmlkZW8veC15b3V0dWJlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/Lm1pbWVUeXBlID09PSdhcHBsaWNhdGlvbi94LW1wZWdVUkwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvd2hpdGUvYXVkaW8uc3ZnXCIgYWx0PVwiQXVkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCIgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2F1ZGlvL21wZWcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvd2hpdGUvcGRmLnN2Z1wiIGFsdD1cIlBERlwiIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vcGRmJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvd2hpdGUvcmVzb3VyY2Uuc3ZnXCIgYWx0PVwiU3VydmV5XCIgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9zdXJ2ZXknXCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL2xpbmsuc3ZnXCIgYWx0PVwiSW50ZXJhY3RpdmVDb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmh0bWwtYXJjaGl2ZScgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICd0ZXh0L3gtdXJsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL2Fzc2Vzc21lbnQuc3ZnXCIgYWx0PVwiQXNzZXNzbWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9xdWl6JyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvaW1hZ2Uuc3ZnXCIgYWx0PVwiSW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2ltYWdlL3BuZycgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICdpbWFnZS9qcGVnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL2NvbnRlbnRfY29weS5zdmdcIiBjbGFzcz1cImNvbnRlbnRpY29uXCIgYWx0PVwiQ291cnNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLmVrc3RlcC5jb250ZW50LWNvbGxlY3Rpb24nIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vc3VydmV5J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL21vZHVsZS5zdmdcIiBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwib2ZmbGluZSBzZXNzaW9uc1wiICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29mZmxpbmUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVzb3VyY2VEdXJhdGlvbiB3cy1tYXQtYmxhY2s2MC10ZXh0IG5vZHRyYW5zbGF0ZVwiPnt7IGNvbnRlbnQ/Lm1heFF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0ge3sgJ3BsYXllcmJyaWVmLnF1ZXN0aW9ucycgfCB0cmFuc2xhdGUgfCB0aXRsZWNhc2V9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXNvdXJjZUR1cmF0aW9uIHdzLW1hdC1ibGFjazYwLXRleHQgbm9kdHJhbnNsYXRlXCI+e3sgKGNvbnRlbnQ/LmR1cmF0aW9ufHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeU1hcERhdGFbY29udGVudD8uaWRlbnRpZmllcl0/LmV4cGVjdGVkRHVyYXRpb24gfHwgMCl8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlRHVyYXRpb25UcmFuc2Zvcm06XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG1zJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEb3dubG9hZCBidXR0b24gZm9yIHBkZiByZXNvdXJjZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG91bGRTaG93RG93bmxvYWRCdXR0b24oY29udGVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3dubG9hZC1idG4gbWF0LWJvZHktMiBtdC0yIHNtOm10LTFcIiAoY2xpY2spPVwiZG93bmxvYWRDb250ZW50KGNvbnRlbnQsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogcGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG93bmxvYWQtbGluayBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIlwiPkRvd25sb2FkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPCEtLSBMb2NrIG1lc3NhZ2VzIHNob3duIGJlbG93IGNvbnRlbnQgbmFtZSAob3V0c2lkZSBhbmNob3IgdGFnKSAtLT5cbiAgICAgICAgICAgIDwhLS0gTG9jayBtZXNzYWdlIGZvciByZXNvdXJjZXMgaW4gbG9ja2VkIG1pbGVzdG9uZXMgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQgJiYgaXNFbnJvbGxlZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWxvY2tpbmcgZmxleCB3LWZ1bGwgZmxleC1taWRkbGUgbXQtMiBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsb2NrLWljb25cIj5sb2NrPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2NrLW1lc3NhZ2UgbWF0LWJvZHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb250ZW50IGlzIGxvY2tlZC4gQ29tcGxldGUgcHJldmlvdXMgbWlsZXN0b25lIHRvIHZpZXcgdGhpcyBjb250ZW50LlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwhLS0gTG9jayBtZXNzYWdlIGZvciBtaWxlc3RvbmUgYXNzZXNzbWVudHMgd2hlbiBtYW5kYXRvcnkgY29udGVudCBub3QgY29tcGxldGVkIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZCAmJiBpc0Vucm9sbGVkICYmICFpc1BhcmVudE1pbGVzdG9uZUxvY2tlZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWxvY2tpbmcgZmxleCB3LWZ1bGwgZmxleC1taWRkbGUgbXQtMiBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsb2NrLWljb25cIj5sb2NrPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2NrLW1lc3NhZ2UgbWF0LWJvZHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb250ZW50IGlzIGxvY2tlZC4gQ29tcGxldGUgYWxsIG1hbmRhdG9yeSBpdGVtcyB0byB1bmxvY2sgdGhlIGFzc2Vzc21lbnQuXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bWF0LW1lbnUgI2J1dHRvbk1lbnU9XCJtYXRNZW51XCI+XG4gICAgPGEgbWF0LW1lbnUtaXRlbSBbcm91dGVyTGlua109XCInLi4vJyArIGNvbnRlbnQ/LmlkZW50aWZpZXIgKyAnL292ZXJ2aWV3J1wiIFtxdWVyeVBhcmFtc109XCJjb250ZXh0UGF0aFwiXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZVwiPlxuICAgICAgICA8bWF0LWljb24+dG9jPC9tYXQtaWNvbj5cbiAgICAgICAgPGgzIGNsYXNzPVwibWFyZ2luLXJlbW92ZSBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICA8L2gzPlxuICAgIDwvYT5cbjwvbWF0LW1lbnU+XG5cbjxuZy10ZW1wbGF0ZSAjY29sbGVjdGlvblRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0NvbGxlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbGxlY3Rpb24td3JhcHBlciBwLTQgZmxleCBmbGV4LWNvbCBwb3NpdGlvbi1yZWxhdGl2ZVwiIFtuZ0NsYXNzXT1cInsnb3Blbic6IGNoZWNrKGNvbnRlbnQpLFxuICAgICAgICAgICAgJ2Nsb3NlJzogIWNvbnRlbnQudmlld0NoaWxkcmVuLFxuICAgICAgICAgICAgJ2NvdXJzZSc6IWlzTW9kdWxlLCAnbW9kdWxlJzogaXNNb2R1bGUsXG4gICAgICAgICAgICAnY29udGVudC1hY3RpdmUnOiBwYXRoU2V0Py5oYXMoY29udGVudC5pZGVudGlmaWVyKSAmJiBpc0Vucm9sbGVkfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sbGVjdGlvbiB3LWF1dG8gc206dy0xMDAgcGFkZGluZy1yaWdodC14bFwiPlxuICAgICAgICAgICAgICAgIDwhLS0gPGltZyBjbGFzcz1cImNhcmQtdGh1bWJuYWlsIHdzLW1hdC1wcmltYXJ5LWxpdGUtYmFja2dyb3VuZFwiIFtzcmNdPVwiY29udGVudD8uYXBwSWNvblwiIGFsdD1cIlRodW1ibmFpbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY29udGVudC52aWV3Q2hpbGRyZW4gPSAhY29udGVudC52aWV3Q2hpbGRyZW5cIiBbd3NVdGlsc0RlZmF1bHRUaHVtYm5haWxdPVwiZGVmYXVsdFRodW1ibmFpbFwiIC8+IC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtd3JhcCBmbGV4LWJldHdlZW4gd2lkdGgtZXhwYW5kIHByLTAgdy0xMDAgXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgW25nQ2xhc3NdPVwieydjdXJzb3ItcG9pbnRlcic6ICFpc0VuYWJsZWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdDaGlsZHJlbiA9ICFjb250ZW50LnZpZXdDaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIG1iLTEgc206ZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNb2R1bGUgJiYgaXNFbnJvbGxlZCAmJiAhaXNNaWxlc3RvbmVMb2NrZWQgJiYgIWlzUGFyZW50TWlsZXN0b25lTG9ja2VkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZvclByZXZpZXcgJiYgY29udGVudD8uaWRlbnRpZmllciAmJiBnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKSA7IGVsc2UgZWxzZUJsb2NrXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb21wbGV0aW9uU3RhdHVzKGNvbnRlbnQuaWRlbnRpZmllcikgPT0gMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0ZWQgbXItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29tcGxldGVkLWljb25cIiBbY29sb3JdPVwiYmx1ZVwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29tcGxldGlvblN0YXR1cyhjb250ZW50Py5pZGVudGlmaWVyKSA8IDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3MgbXItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwZXJjZW50XT1cImdldENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQ/LmlkZW50aWZpZXIpXCIgW3JhZGl1c109XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZVdpZHRoXT1cIjJcIiBbaW5uZXJTdHJva2VXaWR0aF09XCIyXCIgW3NwYWNlXT1cIi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW291dGVyU3Ryb2tlQ29sb3JdPVwicHJvZ3Jlc3NDb2xvcjIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lclN0cm9rZUNvbG9yXT1cIidyZ2JhKDAsIDAsIDAsIDAuMTYpJ1wiIFthbmltYXRpb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbmltYXRpb25EdXJhdGlvbl09XCIyNTBcIiBbc2hvd1RpdGxlXT1cImZhbHNlXCIgW3Nob3dVbml0c109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U3VidGl0bGVdPVwiZmFsc2VcIiBbc2hvd0lubmVyU3Ryb2tlXT1cInRydWVcIiBbY2xvY2t3aXNlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZE9wYWNpdHldPVwiMFwiIFtiYWNrZ3JvdW5kR3JhZGllbnRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZFN0cm9rZVdpZHRoXT1cIjNcIiBtYXRUb29sdGlwPVwiSW4gcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1plcm9PdXRlclN0cm9rZV09ZmFsc2UgW2JhY2tncm91bmRQYWRkaW5nXT1cIi03XCIgW3N0YXJ0RnJvbVplcm9dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZFBhZGRpbmddPVwiMFwiIFtpbWFnZUhlaWdodF09XCIxOFwiIFtpbWFnZVdpZHRoXT1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dCYWNrZ3JvdW5kXT1cImZhbHNlXCIgW291dGVyU3Ryb2tlTGluZWNhcF09XCInYnV0dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NpcmNsZS1wcm9ncmVzcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3MgbXItMVwiIFtwZXJjZW50XT1cIjBcIiBbcmFkaXVzXT1cIjExXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VXaWR0aF09XCIyXCIgW2lubmVyU3Ryb2tlV2lkdGhdPVwiMlwiIFtvdXRlclN0cm9rZUNvbG9yXT1cIicjODA4MDgwJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVyU3Ryb2tlQ29sb3JdPVwiJyM4MDgwODAnXCIgW2FuaW1hdGlvbl09XCJ0cnVlXCIgW3NwYWNlXT1cIi0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1VuaXRzXT1cImZhbHNlXCIgW2FuaW1hdGlvbkR1cmF0aW9uXT1cIjI1MFwiIFtzaG93VGl0bGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kUGFkZGluZ109XCIwXCIgW2JhY2tncm91bmRQYWRkaW5nXT1cIi05XCIgW291dGVyU3Ryb2tlTGluZWNhcF09XCInYnV0dCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJOb3Qgc3RhcnRlZFwiIFtzaG93U3VidGl0bGVdPVwiZmFsc2VcIiBbc2hvd0lubmVyU3Ryb2tlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbG9ja3dpc2VdPVwidHJ1ZVwiIFtpbWFnZUhlaWdodF09XCIyMlwiIFtpbWFnZVdpZHRoXT1cIjIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0JhY2tncm91bmRdPVwiZmFsc2VcIj48L2NpcmNsZS1wcm9ncmVzcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY29sbGVjdGlvbi1hY3RpdmUtY2xhc3MnOiBwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcikgJiYgaXNFbnJvbGxlZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiaXNNaWxlc3RvbmVMb2NrZWRcIiBzcmM9XCJhc3NldHMvaWNvbnMvaHVicy9sb2NrLnN2Z1wiIGFsdD1cIkxvY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibG9jay1pY29uIG1yLTIgbWFyZ2luLWJvdHRvbS14eHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUgdGV4dC10cnVuY2F0ZSBtYXQtc3ViaGVhZGluZy0xIGZsZXgtYXV0byBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd0ZXh0LWFjdGl2ZSc6IHBhdGhTZXQ/Lmhhcyhjb250ZW50LmlkZW50aWZpZXIpICYmIGlzRW5yb2xsZWR9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7aXNNaWxlc3RvbmUgPyBpbmRleCAtMSA6IGluZGV4fX0uIDwvc3Bhbj57eyBjb250ZW50Py5uYW1lIHwgdHJ1bmNhdGU6NTAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTWlsZXN0b25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzTWlsZXN0b25lTG9ja2VkXCIgY2xhc3M9XCJsb2NrZWQtdGV4dCBtbC0yXCI+TG9ja2VkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50Py5pc01hbmRhdG9yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hbmRhdG9yeS10ZXh0IG1hdC1jYXB0aW9uIG1sLTJcIj5NYW5kYXRvcnk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0eXBlLWNvbnRhaW5lciByZXNvdXJjZSBtdC0yIHNtOm10LTBcIiAqbmdJZj1cImNvbnRlbnQ/LmNhdGVnb3J5ID09PSAnUmVzb3VyY2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTEgY3VzdG9tLWljb24gcm90YXRlLTkwXCI+Y2FsbF90b19hY3Rpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPlJlc291cmNlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0eXBlLWNvbnRhaW5lciBtb2R1bGUgbXQtMiBzbTptdC0wXCIgKm5nSWY9XCJjb250ZW50Py5jYXRlZ29yeSA9PT0gJ0NvbGxlY3Rpb24nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTEgY3VzdG9tLWljb24gcm90YXRlLTkwXCI+Y2FsbF90b19hY3Rpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPk1vZHVsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHlwZS1jb250YWluZXIgY291cnNlIG10LTIgc206bXQtMFwiICpuZ0lmPVwiY29udGVudD8uY2F0ZWdvcnkgPT09ICdDb3Vyc2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTEgY3VzdG9tLWljb24gcm90YXRlLTkwXCI+Y2FsbF90b19hY3Rpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPkNvdXJzZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNaWxlc3RvbmUgQmFkZ2UgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNNaWxlc3RvbmVcIiBjbGFzcz1cIm1pbGVzdG9uZS1iYWRnZSBtdC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbGVzdG9uZS1iYWRnZS10ZXh0IG5vZHRyYW5zbGF0ZVwiPk1pbGVzdG9uZSB7e2luZGV4IC0gMX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1pbGVzdG9uZSBEZXNjcmlwdGlvbiAoMyBsaW5lcyB3aXRoIGVsbGlwc2lzKSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXNNaWxlc3RvbmUgJiYgY29udGVudD8uZGVzY3JpcHRpb25cIiBjbGFzcz1cIm1pbGVzdG9uZS1kZXNjcmlwdGlvbiBtdC0yICBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb250ZW50Py5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTMgaXRlbXMtY2VudGVyIGNvbnRlbnQta2V5LXZhbHVlcyBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWlzTW9kdWxlXCIgYWx0PVwiY291cnNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWljb24gaWNvbi1jb2xvclwiPnZpZGVvX2xpYnJhcnk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJpc01vZHVsZVwiIGFsdD1cIk1vZHVsZVwiIGNsYXNzPVwidGltZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvbW9kdWxlLnN2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG5vZHRyYW5zbGF0ZVwiPnt7IChoaWVyYXJjaHlNYXBEYXRhW2NvbnRlbnQ/LmlkZW50aWZpZXJdPy5kdXJhdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjApfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlRHVyYXRpb25UcmFuc2Zvcm06ICdobXMnIH19PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ubW9kdWxlQ291bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmlvZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG5vZHRyYW5zbGF0ZVwiPnt7Y29udGVudD8ubW9kdWxlQ291bnR9fSB7e2NvbnRlbnQ/Lm1vZHVsZUNvdW50ID4gMT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVzJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmxlYWZOb2Rlc0NvdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBub2R0cmFuc2xhdGVcIj57e2NvbnRlbnQ/LmxlYWZOb2Rlc0NvdW50fX0ge3tjb250ZW50Py5sZWFmTm9kZXNDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjEgPyAnaXRlbXMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0ZW0nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNaWxlc3RvbmUgQ29tcGxldGlvbiBQcm9ncmVzcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc01pbGVzdG9uZSAmJiBpc0Vucm9sbGVkICYmICFpc01pbGVzdG9uZUxvY2tlZFwiIGNsYXNzPVwibWlsZXN0b25lLXByb2dyZXNzIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbGVzdG9uZS1wcm9ncmVzcy10ZXh0IG5vZHRyYW5zbGF0ZVwiPnt7Z2V0TWlsZXN0b25lQ29tcGxldGVkQ291bnQoKX19IG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udGVudD8ubGVhZk5vZGVzQ291bnQgfHwgMH19IGNvbXBsZXRlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBVbmxvY2sgQ3JpdGVyaWEgTWVzc2FnZSBmb3IgTG9ja2VkIE1pbGVzdG9uZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNNaWxlc3RvbmUgJiYgaXNFbnJvbGxlZCAmJiBpc01pbGVzdG9uZUxvY2tlZFwiIGNsYXNzPVwibWlsZXN0b25lLWxvY2tlZC1tZXNzYWdlIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvY2tlZC1jcml0ZXJpYS10ZXh0IG1hdC1jYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldE1pbGVzdG9uZVVubG9ja01lc3NhZ2UoKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBWaWV3IEFjaGlldmVtZW50IEJ1dHRvbiBmb3IgY29tcGxldGVkIG1pbGVzdG9uZXMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNNaWxlc3RvbmUgJiYgaXNFbnJvbGxlZCAmJiAoZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcikgPj0gMTAwIHx8IGdldENvbXBsZXRpb25TdGF0dXMoY29udGVudD8uaWRlbnRpZmllcikgPT09IDIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZpZXctYWNoaWV2ZW1lbnQtY29udGFpbmVyIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZXctYWNoaWV2ZW1lbnQtYnRuXCIgW2Rpc2FibGVkXT1cImFjaGlldmVtZW50TG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3TWlsZXN0b25lQWNoaWV2ZW1lbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFhY2hpZXZlbWVudExvYWRpbmdcIj5WaWV3IEFjaGlldmVtZW50PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJhY2hpZXZlbWVudExvYWRpbmdcIiBbZGlhbWV0ZXJdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtc3Bpbm5lclwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRm9yIGNvdXJzZSBwcm9ncmVzcyB0byBiZSBzaG93biAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRW5yb2xsZWQgJiYgIWlzTWlsZXN0b25lTG9ja2VkICYmICFpc1BhcmVudE1pbGVzdG9uZUxvY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZvclByZXZpZXcgJiYgY29udGVudD8uaWRlbnRpZmllciAmJiBnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKSAmJiBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29tcGxldGlvblN0YXR1cyhjb250ZW50Py5pZGVudGlmaWVyKSA9PSAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgbXItNCAgZmxleCBmbGV4LTEgZmxleC1jb2wgIHByb2dyZXNzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIHctZnVsbCBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtYm9keS0yIG5vZHRyYW5zbGF0ZSBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcil9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3MgW2NvbnRlbnRJZF09XCJjb250ZW50Py5wcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9ncmVzc109XCJnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCIgW2N1c3RvbUNsYXNzTmFtZV09XCIndmlld2VyLXByb2dyZXNzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibWwtNSBjZXJ0aWZpY2F0ZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGUtYnRuJzogZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmcgfHwgY29udGVudD8uaXNzdWVkQ2VydGlmaWNhdGVzSWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyAmJiBkb3dubG9hZENlcnRpZmljYXRlKGNvbnRlbnQ/Lmlzc3VlZENlcnRpZmljYXRlc0lkKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW1nIHNyYz1cImZ1c2lvbi1hc3NldHMvaW1hZ2VzL2NlcnRpZmljYXRlLWljby5zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+Q2VydGlmaWNhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTJcIj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXIgZmxleCBmbGV4LW1pZGRsZSBjZXJ0aWZpY2F0ZS1sb2FkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiIHN0cm9rZT1cIid3aGl0ZSdcIiBjbGFzcz1cIndoaXRlLXNwaW5uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaWFtZXRlcl09XCIxNlwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3NcIiBbcGVyY2VudF09XCIxMDBcIiBbcmFkaXVzXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZVdpZHRoXT1cIjNcIiBbaW5uZXJTdHJva2VXaWR0aF09XCIzXCIgW3NwYWNlXT1cIi0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZUNvbG9yXT1cInByb2dyZXNzQ29sb3IoKVwiIFtpbm5lclN0cm9rZUNvbG9yXT1cIidyZ2JhKDAsMCwwLC4xNiknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbmltYXRpb25dPVwidHJ1ZVwiIFthbmltYXRpb25EdXJhdGlvbl09XCIzMDBcIiBbc2hvd1RpdGxlXT1cImZhbHNlXCIgW3Nob3dVbml0c109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCIgW2Nsb2Nrd2lzZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kT3BhY2l0eV09XCIwXCIgW2JhY2tncm91bmRHcmFkaWVudF09XCJmYWxzZVwiIFtiYWNrZ3JvdW5kU3Ryb2tlV2lkdGhdPVwiM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1plcm9PdXRlclN0cm9rZV09ZmFsc2UgW2JhY2tncm91bmRQYWRkaW5nXT1cIi05XCIgW3N0YXJ0RnJvbVplcm9dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRQYWRkaW5nXT1cIjBcIiBbaW1hZ2VIZWlnaHRdPVwiMjRcIiBbaW1hZ2VXaWR0aF09XCIyNFwiIFtzaG93QmFja2dyb3VuZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VMaW5lY2FwXT1cIididXR0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NpcmNsZS1wcm9ncmVzcz4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENvbXBsZXRpb25TdGF0dXMoY29udGVudD8uaWRlbnRpZmllcikgPCAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgbXItNCAgZmxleCBmbGV4LTEgZmxleC1jb2wgIHByb2dyZXNzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIHctZnVsbCB3cy1tYXQtYmxhY2stdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1ib2R5LTIgIHdzLW1hdC1ibGFjay10ZXh0IG5vZHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKX19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtY29udGVudC1wcm9ncmVzcyBbY29udGVudElkXT1cImNvbnRlbnQ/LnByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb2dyZXNzXT1cImdldENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQ/LmlkZW50aWZpZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb2dyZXNzVHlwZV09XCIncGVyY2VudGFnZSdcIiBbY3VzdG9tQ2xhc3NOYW1lXT1cIid2aWV3ZXItcHJvZ3Jlc3MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/Lmlzc3VlZENlcnRpZmljYXRlc0lkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJtbC01IGNlcnRpZmljYXRlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1idG4nOiBkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyB8fCBjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiIWRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nICYmIGRvd25sb2FkQ2VydGlmaWNhdGUoY29udGVudD8uaXNzdWVkQ2VydGlmaWNhdGVzSWQpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbWcgc3JjPVwiZnVzaW9uLWFzc2V0cy9pbWFnZXMvY2VydGlmaWNhdGUtaWNvLnN2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5DZXJ0aWZpY2F0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlciBmbGV4IGZsZXgtbWlkZGxlIGNlcnRpZmljYXRlLWxvYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCIgc3Ryb2tlPVwiJ3doaXRlJ1wiIGNsYXNzPVwid2hpdGUtc3Bpbm5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RpYW1ldGVyXT1cIjE2XCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWUtYWxsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdDaGlsZHJlbiA9ICFjb250ZW50LnZpZXdDaGlsZHJlbjsgZXhwYW5kQWN0aXZlID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VlLWFsbC1idG4gdGFiIGN1c3RvbS1jaGV2cm9uIGN1c3RvbWljb25cIiBtYXQtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFjb250ZW50LnZpZXdDaGlsZHJlbiAmJiAhaXNNb2R1bGVcIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb250ZW50LnZpZXdDaGlsZHJlbiAmJiAhaXNNb2R1bGVcIj5rZXlib2FyZF9hcnJvd191cDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWNvbnRlbnQudmlld0NoaWxkcmVuICYmIGlzTW9kdWxlXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb250ZW50LnZpZXdDaGlsZHJlbiAmJiBpc01vZHVsZVwiPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpbGQtd3JhcHBlciAgXCIgKm5nSWY9XCJjb250ZW50LnZpZXdDaGlsZHJlblwiIFtuZ0NsYXNzXT1cInsnb3Blbic6IGNvbnRlbnQudmlld0NoaWxkcmVuLFxuICAgICAgICAgICAgJ2Nsb3NlJzogIWNvbnRlbnQudmlld0NoaWxkcmVuLFxuICAgICAgICAgICAgJ2NvdXJzZSc6IWlzTW9kdWxlLFxuICAgICAgICAgICAgJ21vZHVsZSc6IGlzTW9kdWxlfVwiIFtAcGFuZWxJbk91dF0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpbGRyZW4tY29udGFpbmVyXCIgW25nQ2xhc3NdPVwieydtb2R1bGUnOiBpc01vZHVsZSwgJyc6ICFpc01vZHVsZX1cIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudC1jYXJkLXYyIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29tcG9uZW50TmFtZV09XCJjb21wb25lbnROYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiY2hpbGRcIiBbZXhwYW5kQWxsXT1cImV4cGFuZEFsbFwiIFtyb290SWRdPVwicm9vdElkXCIgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiXG4gICAgICAgICAgICAgICAgICAgIFtyb290Q29udGVudFR5cGVdPVwicm9vdENvbnRlbnRUeXBlXCIgW2luZGV4XT1cImorMVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICBbcGF0aFNldF09XCJwYXRoU2V0XCIgW2hpZXJhcmNoeU1hcERhdGFdPVwiaGllcmFyY2h5TWFwRGF0YVwiIFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgW21sQ291cnNlXT1cIm1sQ291cnNlXCIgW3BhcmVudE1pbGVzdG9uZUxvY2tlZF09XCJpc01pbGVzdG9uZUxvY2tlZCB8fCBpc1BhcmVudE1pbGVzdG9uZUxvY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjaGlsZCBvZiBjb250ZW50Py5jaGlsZHJlbjsgdHJhY2tCeTogY29udGVudFRyYWNrQnk7IGxldCBqPSBpbmRleDtsZXQgaXNGaXJzdCA9IGZpcnN0XCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtb2R1bGVDYXJkJzogY2hlY2tJc01vZHVsZShjaGlsZCksICdyZXNvdXJjZUNhcmQnOiAhY2hlY2tJc01vZHVsZShjaGlsZCksICdmaXJzdCc6IGlzRmlyc3R9XCI+XG4gICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ByZUFzc2Vzc21lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sbGVjdGlvbi13cmFwcGVyIHAtNCBmbGV4IGZsZXgtY29sIHBvc2l0aW9uLXJlbGF0aXZlXCIgW25nQ2xhc3NdPVwieydvcGVuJzogY2hlY2soY29udGVudCksXG4gICAgICAgICdjb3Vyc2UnOiFpc01vZHVsZSwgJ21vZHVsZSc6IGlzTW9kdWxlLFxuICAgICAgICAnY29udGVudC1hY3RpdmUnOiBwYXRoU2V0Py5oYXMoY29udGVudC5pZGVudGlmaWVyKX1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sbGVjdGlvbiB3LWF1dG8gc206dy0xMDAgcGFkZGluZy1yaWdodC14bFwiPlxuICAgICAgICAgICAgPCEtLSA8aW1nIGNsYXNzPVwiY2FyZC10aHVtYm5haWwgd3MtbWF0LXByaW1hcnktbGl0ZS1iYWNrZ3JvdW5kXCIgW3NyY109XCJjb250ZW50Py5hcHBJY29uXCIgYWx0PVwiVGh1bWJuYWlsXCJcbiAgICAgICAgKGNsaWNrKT1cImNvbnRlbnQudmlld0NoaWxkcmVuID0gIWNvbnRlbnQudmlld0NoaWxkcmVuXCIgW3dzVXRpbHNEZWZhdWx0VGh1bWJuYWlsXT1cImRlZmF1bHRUaHVtYm5haWxcIiAvPiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtd3JhcCBmbGV4LWJldHdlZW4gd2lkdGgtZXhwYW5kIHByLTAgdy0xMDAgXCI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiIFtuZ0NsYXNzXT1cInsnY3Vyc29yLXBvaW50ZXInOiAhaXNFbmFibGVkfVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdDaGlsZHJlbiA9ICFjb250ZW50LnZpZXdDaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzbTpmbGV4LXJvdyBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFmb3JQcmV2aWV3ICYmIGNvbnRlbnQ/LmlkZW50aWZpZXIgJiYgZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcikgOyBlbHNlIGVsc2VCbG9ja1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb21wbGV0aW9uU3RhdHVzKGNvbnRlbnQuaWRlbnRpZmllcikgPT0gMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlZCBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29tcGxldGVkLWljb25cIiBbY29sb3JdPVwiYmx1ZVwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb21wbGV0aW9uU3RhdHVzKGNvbnRlbnQ/LmlkZW50aWZpZXIpIDwgMlwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3MgbXItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BlcmNlbnRdPVwiZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcilcIiBbcmFkaXVzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VXaWR0aF09XCIyXCIgW2lubmVyU3Ryb2tlV2lkdGhdPVwiMlwiIFtzcGFjZV09XCItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW291dGVyU3Ryb2tlQ29sb3JdPVwicHJvZ3Jlc3NDb2xvcjIoKVwiIFtpbm5lclN0cm9rZUNvbG9yXT1cIidyZ2JhKDAsIDAsIDAsIDAuMTYpJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuaW1hdGlvbl09XCJ0cnVlXCIgW2FuaW1hdGlvbkR1cmF0aW9uXT1cIjI1MFwiIFtzaG93VGl0bGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VW5pdHNdPVwiZmFsc2VcIiBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xvY2t3aXNlXT1cInRydWVcIiBbYmFja2dyb3VuZE9wYWNpdHldPVwiMFwiIFtiYWNrZ3JvdW5kR3JhZGllbnRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kU3Ryb2tlV2lkdGhdPVwiM1wiIG1hdFRvb2x0aXA9XCJJbiBwcm9ncmVzc1wiIFtzaG93WmVyb091dGVyU3Ryb2tlXT1mYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kUGFkZGluZ109XCItN1wiIFtzdGFydEZyb21aZXJvXT1cImZhbHNlXCIgW2JhY2tncm91bmRQYWRkaW5nXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbWFnZUhlaWdodF09XCIxOFwiIFtpbWFnZVdpZHRoXT1cIjE4XCIgW3Nob3dCYWNrZ3JvdW5kXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VMaW5lY2FwXT1cIididXR0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaXJjbGUtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3MgbXItMVwiIFtwZXJjZW50XT1cIjBcIiBbcmFkaXVzXT1cIjExXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZVdpZHRoXT1cIjJcIiBbaW5uZXJTdHJva2VXaWR0aF09XCIyXCIgW291dGVyU3Ryb2tlQ29sb3JdPVwiJyM4MDgwODAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lclN0cm9rZUNvbG9yXT1cIicjODA4MDgwJ1wiIFthbmltYXRpb25dPVwidHJ1ZVwiIFtzcGFjZV09XCItMlwiIFtzaG93VW5pdHNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuaW1hdGlvbkR1cmF0aW9uXT1cIjI1MFwiIFtzaG93VGl0bGVdPVwiZmFsc2VcIiBbYmFja2dyb3VuZFBhZGRpbmddPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZFBhZGRpbmddPVwiLTlcIiBbb3V0ZXJTdHJva2VMaW5lY2FwXT1cIididXR0J1wiIG1hdFRvb2x0aXA9XCJOb3Qgc3RhcnRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCIgW2Nsb2Nrd2lzZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbWFnZUhlaWdodF09XCIyMlwiIFtpbWFnZVdpZHRoXT1cIjIyXCIgW3Nob3dCYWNrZ3JvdW5kXT1cImZhbHNlXCI+PC9jaXJjbGUtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2NvbGxlY3Rpb24tYWN0aXZlLWNsYXNzJzogcGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUgdGV4dC10cnVuY2F0ZSBtYXQtc3ViaGVhZGluZy0xIGZsZXgtYXV0byBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3RleHQtYWN0aXZlJzogcGF0aFNldD8uaGFzKGNvbnRlbnQuaWRlbnRpZmllcil9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpbmRleH19LiB7eyBjb250ZW50Py5uYW1lIHwgdHJ1bmNhdGU6NTAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm1hcmdpbi1yZW1vdmUgdGV4dC10cnVuY2F0ZSBtYXQtc3ViaGVhZGluZy0xIGZsZXgtYXV0byBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwibnVsbFwiIFtuZ0NsYXNzXT1cInsnbWwtMyc6IGlzRW5yb2xsZWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCIoaXNBbGxvd2VkICYmICFmb3JQcmV2aWV3ICYmIGlzRW5hYmxlZCkgPyByZXNvdXJjZUxpbmsudXJsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImNvbXB1dGVkUXVlcnlQYXJhbXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHt7Y29udGVudD8uY291cnNlQ2F0ZWdvcnl9fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsncmVzb3VyY2UtYWN0aXZlJzogcGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlIFwiIFtuZ0NsYXNzXT1cInsnY3Vyc29yLXBvaW50ZXInOiAhaXNFbmFibGVkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyYWlzZVRlbGVtZXRyeSgpOyBjaGFuZ2VSZXNvdXJjZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlIHRleHQtdHJ1bmNhdGUgbWF0LWJvZHktMiBmbGV4LWF1dG8gZm9udC1ib2xkIG5vZHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd0ZXh0LWFjdGl2ZSc6IHBhdGhTZXQ/Lmhhcyhjb250ZW50Py5pZGVudGlmaWVyKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cIm1hcmdpbi1yaWdodC14cyByYWRpb2J0biB0aW1lLWljb25cIj5yYWRpb19idXR0b25fdW5jaGVja2VkIDwvbWF0LWljb24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aW5kZXh9fS4ge3sgY29udGVudD8ubmFtZSB8IHRydW5jYXRlOjUwIH19XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udGVudC10eXBlIG9wdGlvbmFsLXNwYW4gbm9kdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm9wdGlvbmFsUmVhZGluZ1wiPnt7ICdwbGF5ZXJicmllZi5vcHRpb25hbCcgfCB0cmFuc2xhdGUgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZm9yIGRlZmF1bHQgZ3JleSBpY29ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpY29ucyB3cy1tYXQtYmxhY2s2MC10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS92aWRlby5zdmdcIiBhbHQ9XCJWaWRlb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIiAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndmlkZW8vbXA0JyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ3ZpZGVvL3gteW91dHViZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Py5taW1lVHlwZSA9PT0nYXBwbGljYXRpb24veC1tcGVnVVJMJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvYXVkaW8uc3ZnXCIgYWx0PVwiQXVkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2F1ZGlvL21wZWcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9wZGYuc3ZnXCIgYWx0PVwiUERGXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L3Jlc291cmNlLnN2Z1wiIGFsdD1cIlN1cnZleVwiIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vc3VydmV5J1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L2xpbmsuc3ZnXCIgYWx0PVwiSW50ZXJhY3RpdmVDb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmh0bWwtYXJjaGl2ZScgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICd0ZXh0L3gtdXJsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvYXNzZXNzbWVudC5zdmdcIiBhbHQ9XCJBc3Nlc3NtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3F1aXonIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLnN1bmJpcmQucXVlc3Rpb25zZXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9pbWFnZS5zdmdcIiBhbHQ9XCJJbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnaW1hZ2UvcG5nJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2ltYWdlL2pwZWcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9jb250ZW50X2NvcHkuc3ZnXCIgY2xhc3M9XCJjb250ZW50aWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkNvdXJzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuY29udGVudC1jb2xsZWN0aW9uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3N1cnZleSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L21vZHVsZS5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCIgYWx0PVwib2ZmbGluZSBzZXNzaW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29mZmxpbmUnXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT01QX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc291cmNlRHVyYXRpb24gd3MtbWF0LWJsYWNrNjAtdGV4dCBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8ubWF4UXVlc3Rpb25zIH19IHt7ICdwbGF5ZXJicmllZi5xdWVzdGlvbnMnIHwgdHJhbnNsYXRlIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc291cmNlRHVyYXRpb24gd3MtbWF0LWJsYWNrNjAtdGV4dCBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRlbnQ/LmR1cmF0aW9ufHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeU1hcERhdGFbY29udGVudD8uaWRlbnRpZmllcl0/LmV4cGVjdGVkRHVyYXRpb24gfHwgMCl8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlRHVyYXRpb25UcmFuc2Zvcm06XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG1zJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmb3Igd2hpdGUgaWNvbnMgd2hlbiBjb250ZW50IGhpZ2hsaWdodGVkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzaWNvbnMgd3MtbWF0LXdoaXRlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS92aWRlby5zdmdcIiBhbHQ9XCJWaWRlb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIiAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndmlkZW8vbXA0JyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ3ZpZGVvL3gteW91dHViZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Py5taW1lVHlwZSA9PT0nYXBwbGljYXRpb24veC1tcGVnVVJMJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL2F1ZGlvLnN2Z1wiIGFsdD1cIkF1ZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhdWRpby9tcGVnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL3BkZi5zdmdcIiBhbHQ9XCJQREZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL3Jlc291cmNlLnN2Z1wiIGFsdD1cIlN1cnZleVwiIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vc3VydmV5J1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9saW5rLnN2Z1wiIGFsdD1cIkludGVyYWN0aXZlQ29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLmVrc3RlcC5odG1sLWFyY2hpdmUnIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndGV4dC94LXVybCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9hc3Nlc3NtZW50LnN2Z1wiIGFsdD1cIkFzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vcXVpeicgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L2ltYWdlLnN2Z1wiIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdpbWFnZS9wbmcnIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnaW1hZ2UvanBlZydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9jb250ZW50X2NvcHkuc3ZnXCIgY2xhc3M9XCJjb250ZW50aWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkNvdXJzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuY29udGVudC1jb2xsZWN0aW9uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3N1cnZleSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9tb2R1bGUuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiIGFsdD1cIm9mZmxpbmUgc2Vzc2lvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9vZmZsaW5lJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc291cmNlRHVyYXRpb24gd3MtbWF0LXdoaXRlLXRleHQgbm9kdHJhbnNsYXRlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/Lm1heFF1ZXN0aW9ucyB9fSB7eyAncGxheWVyYnJpZWYucXVlc3Rpb25zJyB8IHRyYW5zbGF0ZSB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZWNhc2V9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXNvdXJjZUR1cmF0aW9uIHdzLW1hdC13aGl0ZS10ZXh0IG5vZHRyYW5zbGF0ZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uZHVyYXRpb258fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5TWFwRGF0YVtjb250ZW50Py5pZGVudGlmaWVyXT8uZXhwZWN0ZWREdXJhdGlvbiB8fCAwKXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVEdXJhdGlvblRyYW5zZm9ybTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdobXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInR5cGUtY29udGFpbmVyIHJlc291cmNlIG10LTIgc206bXQtMFwiICpuZ0lmPVwiY29udGVudD8uY2F0ZWdvcnkgPT09ICdSZXNvdXJjZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci0xIGN1c3RvbS1pY29uIHJvdGF0ZS05MFwiPmNhbGxfdG9fYWN0aW9uPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPlJlc291cmNlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHlwZS1jb250YWluZXIgbW9kdWxlIG10LTIgc206bXQtMFwiICpuZ0lmPVwiY29udGVudD8uY2F0ZWdvcnkgPT09ICdDb2xsZWN0aW9uJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTEgY3VzdG9tLWljb24gcm90YXRlLTkwXCI+Y2FsbF90b19hY3Rpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+TW9kdWxlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHlwZS1jb250YWluZXIgY291cnNlIG10LTIgc206bXQtMFwiICpuZ0lmPVwiY29udGVudD8uY2F0ZWdvcnkgPT09ICdDb3Vyc2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXItMSBjdXN0b20taWNvbiByb3RhdGUtOTBcIj5jYWxsX3RvX2FjdGlvbjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5Db3Vyc2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBGb3IgY291cnNlIHByb2dyZXNzIHRvIGJlIHNob3duIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZvclByZXZpZXcgJiYgY29udGVudD8uaWRlbnRpZmllciAmJiBnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENvbXBsZXRpb25TdGF0dXMoY29udGVudD8uaWRlbnRpZmllcikgPT0gMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBtci00ICBmbGV4IGZsZXgtMSBmbGV4LWNvbCAgcHJvZ3Jlc3MtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCB3LWZ1bGwgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtYm9keS0yIG5vZHRyYW5zbGF0ZSBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKX19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3MgW2NvbnRlbnRJZF09XCJjb250ZW50Py5wcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb2dyZXNzXT1cImdldENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQ/LmlkZW50aWZpZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvZ3Jlc3NUeXBlXT1cIidwZXJjZW50YWdlJ1wiIFtjdXN0b21DbGFzc05hbWVdPVwiJ3ZpZXdlci1wcm9ncmVzcydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uaXNzdWVkQ2VydGlmaWNhdGVzSWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibWwtNSBjZXJ0aWZpY2F0ZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1idG4nOiBkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyB8fCBjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmcgJiYgZG93bmxvYWRDZXJ0aWZpY2F0ZShjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW1nIHNyYz1cImZ1c2lvbi1hc3NldHMvaW1hZ2VzL2NlcnRpZmljYXRlLWljby5zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5DZXJ0aWZpY2F0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTJcIj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlciBmbGV4IGZsZXgtbWlkZGxlIGNlcnRpZmljYXRlLWxvYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiIHN0cm9rZT1cIid3aGl0ZSdcIiBjbGFzcz1cIndoaXRlLXNwaW5uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RpYW1ldGVyXT1cIjE2XCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3NcIiBbcGVyY2VudF09XCIxMDBcIiBbcmFkaXVzXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW291dGVyU3Ryb2tlV2lkdGhdPVwiM1wiIFtpbm5lclN0cm9rZVdpZHRoXT1cIjNcIiBbc3BhY2VdPVwiLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VDb2xvcl09XCJwcm9ncmVzc0NvbG9yKClcIiBbaW5uZXJTdHJva2VDb2xvcl09XCIncmdiYSgwLDAsMCwuMTYpJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbmltYXRpb25dPVwidHJ1ZVwiIFthbmltYXRpb25EdXJhdGlvbl09XCIzMDBcIiBbc2hvd1RpdGxlXT1cImZhbHNlXCIgW3Nob3dVbml0c109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U3VidGl0bGVdPVwiZmFsc2VcIiBbc2hvd0lubmVyU3Ryb2tlXT1cInRydWVcIiBbY2xvY2t3aXNlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZE9wYWNpdHldPVwiMFwiIFtiYWNrZ3JvdW5kR3JhZGllbnRdPVwiZmFsc2VcIiBbYmFja2dyb3VuZFN0cm9rZVdpZHRoXT1cIjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1plcm9PdXRlclN0cm9rZV09ZmFsc2UgW2JhY2tncm91bmRQYWRkaW5nXT1cIi05XCIgW3N0YXJ0RnJvbVplcm9dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZFBhZGRpbmddPVwiMFwiIFtpbWFnZUhlaWdodF09XCIyNFwiIFtpbWFnZVdpZHRoXT1cIjI0XCIgW3Nob3dCYWNrZ3JvdW5kXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW291dGVyU3Ryb2tlTGluZWNhcF09XCInYnV0dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NpcmNsZS1wcm9ncmVzcz4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb21wbGV0aW9uU3RhdHVzKGNvbnRlbnQ/LmlkZW50aWZpZXIpIDwgMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBtci00ICBmbGV4IGZsZXgtMSBmbGV4LWNvbCAgcHJvZ3Jlc3MtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCB3LWZ1bGwgd3MtbWF0LWJsYWNrLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1ib2R5LTIgIHdzLW1hdC1ibGFjay10ZXh0IG5vZHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2dldENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQ/LmlkZW50aWZpZXIpfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtY29udGVudC1wcm9ncmVzcyBbY29udGVudElkXT1cImNvbnRlbnQ/LnByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvZ3Jlc3NdPVwiZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCIgW2N1c3RvbUNsYXNzTmFtZV09XCIndmlld2VyLXByb2dyZXNzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJtbC01IGNlcnRpZmljYXRlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlLWJ0bic6IGRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nIHx8IGNvbnRlbnQ/Lmlzc3VlZENlcnRpZmljYXRlc0lkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyAmJiBkb3dubG9hZENlcnRpZmljYXRlKGNvbnRlbnQ/Lmlzc3VlZENlcnRpZmljYXRlc0lkKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbWcgc3JjPVwiZnVzaW9uLWFzc2V0cy9pbWFnZXMvY2VydGlmaWNhdGUtaWNvLnN2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPkNlcnRpZmljYXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyIGZsZXggZmxleC1taWRkbGUgY2VydGlmaWNhdGUtbG9hZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCIgc3Ryb2tlPVwiJ3doaXRlJ1wiIGNsYXNzPVwid2hpdGUtc3Bpbm5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMTZcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNlZS1hbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdDaGlsZHJlbiA9ICFjb250ZW50LnZpZXdDaGlsZHJlbjsgZXhwYW5kQWN0aXZlID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWUtYWxsLWJ0biB0YWIgY3VzdG9tLWNoZXZyb24gY3VzdG9taWNvblwiIG1hdC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhY29udGVudC52aWV3Q2hpbGRyZW4gJiYgIWlzTW9kdWxlXCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb250ZW50LnZpZXdDaGlsZHJlbiAmJiAhaXNNb2R1bGVcIj5rZXlib2FyZF9hcnJvd191cDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhY29udGVudC52aWV3Q2hpbGRyZW4gJiYgaXNNb2R1bGVcIj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29udGVudC52aWV3Q2hpbGRyZW4gJiYgaXNNb2R1bGVcIj5yZW1vdmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG48L25nLWNvbnRhaW5lcj4iXX0=
1177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1jb250ZW50LWNhcmQtdjIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1jb250ZW50LWNhcmQtdjIvYXBwLXRvYy1jb250ZW50LWNhcmQtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1jb250ZW50LWNhcmQtdjIvYXBwLXRvYy1jb250ZW50LWNhcmQtdjIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQStDLE1BQU0sZUFBZSxDQUFBO0FBQzdGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQTtBQUU5RSxPQUFPLEVBQWdCLFFBQVEsRUFBeUIsTUFBTSxzQkFBc0IsQ0FBQTtBQUNwRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQTtBQUVsRyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDekUsbUJBQW1CO0FBQ25CLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUN0QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QjNCLE1BQU0sT0FBTyw0QkFBNEI7SUE0RHZDLFlBQ1UsTUFBb0IsRUFDcEIsTUFBaUIsRUFDakIsUUFBbUIsRUFDbkIsa0JBQXNDLEVBQ3RDLFNB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b25lbnQsIElucHV0LCBPbkluaXQsIE9uRGVzdHJveSwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uLy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IHZpZXdlclJvdXRlR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vX3NlcnZpY2VzL3ZpZXdlci1yb3V0ZS11dGlsJ1xuaW1wb3J0IHsgTnNBcHBUb2MgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvYXBwLXRvYy5tb2RlbCdcbmltcG9ydCB7IEV2ZW50U2VydmljZSwgV3NFdmVudHMsIENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jZXJ0aWZpY2F0ZS1kaWFsb2cvY2VydGlmaWNhdGUtZGlhbG9nLmNvbXBvbmVudCdcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJ1xuLyogdHNsaW50OmRpc2FibGUqL1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXG5pbXBvcnQgeyBDZXJ0aWZpY2F0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9jZXJ0aWZpY2F0ZS5zZXJ2aWNlJ1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvY29uc3VtcHRpb24nXG5pbXBvcnQgeyBSZXNvdXJjZURvd25sb2FkSGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3Jlc291cmNlLWRvd25sb2FkLWhlbHBlci5zZXJ2aWNlJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjInLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1jb250ZW50LWNhcmQtdjIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWNvbnRlbnQtY2FyZC12Mi5jb21wb25lbnQuc2NzcyddLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcigncGFuZWxJbk91dCcsIFtcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0xMCUpJywgb3BhY2l0eTogJzAnIH0pLFxuICAgICAgICBhbmltYXRlKDI1MClcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW1xuICAgICAgICBhbmltYXRlKDIwMCwgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0xMCUpJywgb3BhY2l0eTogJzAnIH0pKVxuICAgICAgXSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFwcFRvY0NvbnRlbnRDYXJkVjJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIGV4cGFuZEFsbCA9IGZhbHNlXG4gIEBJbnB1dCgpIHJvb3RJZCE6IHN0cmluZ1xuICBASW5wdXQoKSByb290Q29udGVudFR5cGUhOiBzdHJpbmdcbiAgQElucHV0KCkgZm9yUHJldmlldyA9IGZhbHNlXG4gIEBJbnB1dCgpIGJhdGNoSWQhOiBzdHJpbmdcbiAgQElucHV0KCkgY29tcG9uZW50TmFtZTogc3RyaW5nID0gJ3RvYydcbiAgQElucHV0KCkgaW5kZXghOiBudW1iZXJcbiAgQElucHV0KCkgcGF0aFNldCE6IGFueVxuICBASW5wdXQoKSBleHBhbmRBY3RpdmUgPSB0cnVlXG4gIEBJbnB1dCgpIGhpZXJhcmNoeU1hcERhdGE6IGFueSA9IHt9XG4gIEBJbnB1dCgpIGJhdGNoRGF0YTogLyoqTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSAqLyBhbnkgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBpc1ByZUFzc2Vzc21lbnQgPSBmYWxzZVxuICBASW5wdXQoKSBiYXNlQ29udGVudFJlYWREYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBtbENvdXJzZTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgcGFyZW50TWlsZXN0b25lTG9ja2VkID0gZmFsc2UgLy8gUGFzc2VkIGZyb20gcGFyZW50IHdoZW4gaW5zaWRlIGEgbG9ja2VkIG1pbGVzdG9uZVxuICBoYXNDb250ZW50U3RydWN0dXJlID0gZmFsc2VcbiAgZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmcgPSBmYWxzZVxuICBlbnVtQ29udGVudFR5cGVzID0gTnNDb250ZW50LkVEaXNwbGF5Q29udGVudFR5cGVzXG4gIGNvbnRlbnRTdHJ1Y3R1cmU6IE5zQXBwVG9jLklUb2NTdHJ1Y3R1cmUgPSB7XG4gICAgYXNzZXNzbWVudDogMCxcbiAgICBmaW5hbFRlc3Q6IDAsXG4gICAgY291cnNlOiAwLFxuICAgIGhhbmRzT246IDAsXG4gICAgaW50ZXJhY3RpdmVWaWRlbzogMCxcbiAgICBsZWFybmluZ01vZHVsZTogMCxcbiAgICBvdGhlcjogMCxcbiAgICBwZGY6IDAsXG4gICAgc3VydmV5OiAwLFxuICAgIHBvZGNhc3Q6IDAsXG4gICAgcHJhY3RpY2VUZXN0OiAwLFxuICAgIHF1aXo6IDAsXG4gICAgdmlkZW86IDAsXG4gICAgd2ViTW9kdWxlOiAwLFxuICAgIHdlYlBhZ2U6IDAsXG4gICAgeW91dHViZTogMCxcbiAgICBpbnRlcmFjdGl2ZWNvbnRlbnQ6IDAsXG4gICAgb2ZmbGluZVNlc3Npb246IDAsXG4gIH1cbiAgZGVmYXVsdFRodW1ibmFpbCA9ICcnXG4gIHZpZXdDaGlsZHJlbiA9IGZhbHNlXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XG4gIHBhZ2VTY3JvbGxTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGhhc2htYXBVcGRhdGVkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBhY2hpZXZlbWVudExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICAvLyBDYWNoZWQgY29tcHV0ZWQgcHJvcGVydGllcyBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gIHByaXZhdGUgX2NhY2hlZElzQ29sbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlXG4gIHByaXZhdGUgX2NhY2hlZElzTW9kdWxlOiBib29sZWFuID0gZmFsc2VcbiAgcHJpdmF0ZSBfY2FjaGVkSXNSZXNvdXJjZTogYm9vbGVhbiA9IGZhbHNlXG4gIHByaXZhdGUgX2NhY2hlZElzTWlsZXN0b25lOiBib29sZWFuID0gZmFsc2VcbiAgcHJpdmF0ZSBfY2FjaGVkSXNNaWxlc3RvbmVMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBwcml2YXRlIF9jYWNoZWRJc1BhcmVudE1pbGVzdG9uZUxvY2tlZDogYm9vbGVhbiA9IGZhbHNlXG4gIHByaXZhdGUgX2NhY2hlZElzQ29udGVudFVubG9ja2VkOiBib29sZWFuID0gdHJ1ZVxuICBwcml2YXRlIF9jYWNoZWRDaGVja0ZvckN1cmF0ZWRQcm9ncmFtOiBib29sZWFuID0gZmFsc2VcbiAgcHJpdmF0ZSBfY2FjaGVkSXNNaWxlc3RvbmVBc3Nlc3NtZW50OiBib29sZWFuID0gZmFsc2VcbiAgcHJpdmF0ZSBfY2FjaGVkSXNNaWxlc3RvbmVBc3Nlc3NtZW50TG9ja2VkOiBib29sZWFuID0gZmFsc2VcbiAgcHJpdmF0ZSBfY2FjaGVkUmVzb3VyY2VMaW5rOiB7IHVybDogc3RyaW5nOyBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9ID0geyB1cmw6ICcnLCBxdWVyeVBhcmFtczoge30gfVxuICBwcml2YXRlIF9jYWNoZUluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2VcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGV2ZW50czogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgY2VydGlmaWNhdGVTZXJ2aWNlOiBDZXJ0aWZpY2F0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBUb2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIHJlc291cmNlRG93bmxvYWRIZWxwZXJTdmM6IFJlc291cmNlRG93bmxvYWRIZWxwZXJTZXJ2aWNlLCAgICBcbiAgICBwcml2YXRlIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5ldmFsdWF0ZUltbWVkaWF0ZUNoaWxkcmVuU3RydWN0dXJlKClcbiAgICB0aGlzLmluaXRpYWxpemVDb21wdXRlZFByb3BlcnRpZXMoKVxuICAgIC8vIHRoaXMucm91dGUuZGF0YS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgLy8gICAgIHRoaXMuZGVmYXVsdFRodW1ibmFpbCA9IGRhdGEuY29uZmlnRGF0YS5kYXRhLmxvZ29zLmRlZmF1bHRDb250ZW50XG4gICAgLy8gICB9XG4gICAgLy8gKVxuICAgIHRoaXMucmVzb3VyY2VTY3JvbGwoKVxuICAgIFxuICAgIC8vIFN1YnNjcmliZSB0byBoYXNobWFwIHVwZGF0ZXMgdG8gcmVjb21wdXRlIGNhY2hlZCBwcm9wZXJ0aWVzIHdoZW4gcHJvZ3Jlc3MgY2hhbmdlc1xuICAgIHRoaXMuaGFzaG1hcFVwZGF0ZWRTdWJzY3JpcHRpb24gPSB0aGlzLmFwcFRvY1N2Yy5oYXNobWFwVXBkYXRlZCQuc3Vic2NyaWJlKCh1cGRhdGUpID0+IHtcbiAgICAgIGlmICh1cGRhdGUgJiYgdXBkYXRlLmhhc2htYXApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ/CflIQgSGFzaG1hcCB1cGRhdGVkLCByZWNvbXB1dGluZyBjYWNoZWQgcHJvcGVydGllcyBmb3I6JywgdGhpcy5jb250ZW50Py5pZGVudGlmaWVyKVxuICAgICAgICAvLyBJTVBPUlRBTlQ6IFVwZGF0ZSBoaWVyYXJjaHlNYXBEYXRhIHdpdGggdGhlIGxhdGVzdCBoYXNobWFwIGZyb20gdGhlIHNlcnZpY2VcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBjb21wb25lbnQgdXNlcyB0aGUgdXBkYXRlZCBkYXRhLCBub3QgdGhlIHN0YWxlIEBJbnB1dCByZWZlcmVuY2VcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlNYXBEYXRhID0gdXBkYXRlLmhhc2htYXBcbiAgICAgICAgdGhpcy5jb21wdXRlQWxsQ2FjaGVkUHJvcGVydGllcygpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFsbCBjb21wdXRlZCBwcm9wZXJ0aWVzIG9uY2UgdG8gYXZvaWQgZXhwZW5zaXZlIGdldHRlciBjYWxjdWxhdGlvbnNcbiAgICogb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbiBjeWNsZVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcHV0ZWRQcm9wZXJ0aWVzKCkge1xuICAgIHRoaXMuY29tcHV0ZUFsbENhY2hlZFByb3BlcnRpZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYWxsIGNhY2hlZCBwcm9wZXJ0aWVzIGF0IG9uY2UgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlQWxsQ2FjaGVkUHJvcGVydGllcygpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5fY2FjaGVJbml0aWFsaXplZCA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50SWQgPSB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAgIGNvbnN0IGhhc2hEYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhICYmIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtjb250ZW50SWRdXG5cbiAgICAvLyBVc2UgaGFzaG1hcCBkYXRhIGlmIGF2YWlsYWJsZSBmb3IgcHJlLWNvbXB1dGVkIHZhbHVlc1xuICAgIGlmIChoYXNoRGF0YSkge1xuICAgICAgdGhpcy5fY2FjaGVkSXNDb2xsZWN0aW9uID0gaGFzaERhdGEuaXNDb2xsZWN0aW9uICE9PSB1bmRlZmluZWQgPyBcbiAgICAgICAgaGFzaERhdGEuaXNDb2xsZWN0aW9uIDogdGhpcy5jb250ZW50Lm1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5DT0xMRUNUSU9OXG4gICAgICB0aGlzLl9jYWNoZWRJc01vZHVsZSA9IGhhc2hEYXRhLmlzTW9kdWxlICE9PSB1bmRlZmluZWQgPyBcbiAgICAgICAgaGFzaERhdGEuaXNNb2R1bGUgOiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEVcbiAgICAgIHRoaXMuX2NhY2hlZElzUmVzb3VyY2UgPSBoYXNoRGF0YS5pc1Jlc291cmNlICE9PSB1bmRlZmluZWQgPyBcbiAgICAgICAgaGFzaERhdGEuaXNSZXNvdXJjZSA6IHRoaXMuY29tcHV0ZUlzUmVzb3VyY2UoKVxuICAgICAgdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmUgPSBoYXNoRGF0YS5pc01pbGVzdG9uZSAhPT0gdW5kZWZpbmVkID8gXG4gICAgICAgIGhhc2hEYXRhLmlzTWlsZXN0b25lIDogdGhpcy5jb21wdXRlSXNNaWxlc3RvbmUoKVxuICAgICAgdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmVMb2NrZWQgPSBoYXNoRGF0YS5jb21wdXRlZElzTG9ja2VkICE9PSB1bmRlZmluZWQgPyBcbiAgICAgICAgaGFzaERhdGEuY29tcHV0ZWRJc0xvY2tlZCA6IHRoaXMuY29tcHV0ZUlzTWlsZXN0b25lTG9ja2VkKClcbiAgICAgIHRoaXMuX2NhY2hlZElzUGFyZW50TWlsZXN0b25lTG9ja2VkID0gaGFzaERhdGEuaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQgIT09IHVuZGVmaW5lZCA/IFxuICAgICAgICBoYXNoRGF0YS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCA6IHRoaXMuY29tcHV0ZUlzUGFyZW50TWlsZXN0b25lTG9ja2VkKClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZGlyZWN0IGNvbXB1dGF0aW9uIGlmIGhhc2htYXAgbm90IGF2YWlsYWJsZVxuICAgICAgdGhpcy5fY2FjaGVkSXNDb2xsZWN0aW9uID0gdGhpcy5jb250ZW50Lm1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5DT0xMRUNUSU9OXG4gICAgICB0aGlzLl9jYWNoZWRJc01vZHVsZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRVxuICAgICAgdGhpcy5fY2FjaGVkSXNSZXNvdXJjZSA9IHRoaXMuY29tcHV0ZUlzUmVzb3VyY2UoKVxuICAgICAgdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmUgPSB0aGlzLmNvbXB1dGVJc01pbGVzdG9uZSgpXG4gICAgICB0aGlzLl9jYWNoZWRJc01pbGVzdG9uZUxvY2tlZCA9IHRoaXMuY29tcHV0ZUlzTWlsZXN0b25lTG9ja2VkKClcbiAgICAgIHRoaXMuX2NhY2hlZElzUGFyZW50TWlsZXN0b25lTG9ja2VkID0gdGhpcy5jb21wdXRlSXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQoKVxuICAgIH1cblxuICAgIHRoaXMuX2NhY2hlZENoZWNrRm9yQ3VyYXRlZFByb2dyYW0gPSB0aGlzLmNvbXB1dGVDaGVja0ZvckN1cmF0ZWRQcm9ncmFtKClcbiAgICB0aGlzLl9jYWNoZWRJc0NvbnRlbnRVbmxvY2tlZCA9IHRoaXMuY29tcHV0ZUlzQ29udGVudFVubG9ja2VkKClcbiAgICB0aGlzLl9jYWNoZWRJc01pbGVzdG9uZUFzc2Vzc21lbnQgPSB0aGlzLmNvbXB1dGVJc01pbGVzdG9uZUFzc2Vzc21lbnQoKVxuICAgIHRoaXMuX2NhY2hlZElzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZCA9IHRoaXMuY29tcHV0ZUlzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZCgpXG4gICAgdGhpcy5fY2FjaGVkUmVzb3VyY2VMaW5rID0gdGhpcy5jb21wdXRlUmVzb3VyY2VMaW5rKClcbiAgICB0aGlzLl9jYWNoZUluaXRpYWxpemVkID0gdHJ1ZVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlSXNSZXNvdXJjZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29udGVudCkgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFIHx8XG4gICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSB8fFxuICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCB8fFxuICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlSXNNaWxlc3RvbmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnQpIHJldHVybiBmYWxzZVxuICAgIGNvbnN0IHByaW1hcnlDYXQgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IGFzIHN0cmluZ1xuICAgIGNvbnN0IGNvdXJzZUNhdCA9IHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSBhcyBzdHJpbmdcbiAgICByZXR1cm4gcHJpbWFyeUNhdCA9PT0gJ01pbGVzdG9uZScgfHwgY291cnNlQ2F0ID09PSAnTWlsZXN0b25lJ1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlQ2hlY2tGb3JDdXJhdGVkUHJvZ3JhbSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wYXJlbnQgJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhICYmIHRoaXMuaGllcmFyY2h5TWFwRGF0YVt0aGlzLmNvbnRlbnQucGFyZW50XSkge1xuICAgICAgY29uc3QgcGFyZW50RGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVt0aGlzLmNvbnRlbnQucGFyZW50XVxuICAgICAgcmV0dXJuIHBhcmVudERhdGEgJiYgcGFyZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSAmJlxuICAgICAgICBwYXJlbnREYXRhLmNvbXBhdGliaWxpdHlMZXZlbCA+PSA1ICYmXG4gICAgICAgIHBhcmVudERhdGEuY29udGV4dExvY2tpbmdUeXBlID09PSBOc0NvbnRlbnQuRUNvbnRleHRMb2NraW5nVHlwZS5DT1VSU0VfQVNTRVNTTUVOVF9PTkxZXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlSXNDb250ZW50VW5sb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2NhY2hlZENoZWNrRm9yQ3VyYXRlZFByb2dyYW0pIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnBhcmVudCAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGEgJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudC5wYXJlbnRdKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudERhdGEgPSB0aGlzLmhpZXJhcmNoeU1hcERhdGFbdGhpcy5jb250ZW50LnBhcmVudF1cbiAgICAgICAgbGV0IGNvbXBsZXRlZExlYWZOb2RlczogYW55W10gPSBbXVxuICAgICAgICBwYXJlbnREYXRhLmxlYWZOb2Rlcy5mb3JFYWNoKChfZWxlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlNYXBEYXRhICYmIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtfZWxlXSkge1xuICAgICAgICAgICAgY29uc3QgY2hpbGREYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW19lbGVdXG4gICAgICAgICAgICBpZiAoY2hpbGREYXRhICYmIGNoaWxkRGF0YS5jb21wbGV0aW9uU3RhdHVzID09PSAyKSB7XG4gICAgICAgICAgICAgIGNvbXBsZXRlZExlYWZOb2Rlcy5wdXNoKGNoaWxkRGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBjb21wbGV0ZWRMZWFmTm9kZXMubGVuZ3RoID49IHBhcmVudERhdGEubGVhZk5vZGVzQ291bnQgLSAxXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZVJlc291cmNlTGluaygpOiB7IHVybDogc3RyaW5nOyBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9IHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICBsZXQgbWltZVR5cGU6IGFueSA9ICcnXG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSA9PT0gJ1ByZSBFbnJvbG1lbnQgQXNzZXNzbWVudCcgJiZcbiAgICAgICAgdGhpcy5jb250ZW50Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLmVrc3RlcC5jb250ZW50LWNvbGxlY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgbWltZVR5cGUgPSAnYXBwbGljYXRpb24vdm5kLnN1bmJpcmQucXVlc3Rpb25zZXQnXG4gICAgICAgIHRoaXMuY29udGVudC5taW1lVHlwZSA9IE5zQ29udGVudC5FTWltZVR5cGVzLkZJTkFMX0FTU0VTU01FTlRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbWVUeXBlID0gdGhpcy5jb250ZW50Lm1pbWVUeXBlXG4gICAgICB9XG4gICAgICBjb25zdCBzZWxlY3RlZExhbmd1YWdlID0gdGhpcy5tbENvdXJzZSA/IHRoaXMuY29udGVudExhbmdTdmMuZ2V0U2VsZWN0ZWRMYW5ndWFnZSh0aGlzLm1sQ291cnNlKSA6IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuIHZpZXdlclJvdXRlR2VuZXJhdG9yKFxuICAgICAgICB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgbWltZVR5cGUsXG4gICAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCB0aGlzLnJvb3RJZCxcbiAgICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5jb250ZW50VHlwZSB8fCB0aGlzLnJvb3RDb250ZW50VHlwZSxcbiAgICAgICAgdGhpcy5mb3JQcmV2aWV3LFxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICB0aGlzLmJhdGNoSWQsXG4gICAgICAgIHRoaXMuY29udGVudD8ubmFtZSB8fCB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/Lm5hbWUsXG4gICAgICAgIChzZWxlY3RlZExhbmd1YWdlID8gc2VsZWN0ZWRMYW5ndWFnZS5sYW5nSWQgOiBudWxsKSxcbiAgICAgICAgKHNlbGVjdGVkTGFuZ3VhZ2UgPyBzZWxlY3RlZExhbmd1YWdlLmlkZW50aWZpZXIgOiBudWxsKSxcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHsgdXJsOiAnJywgcXVlcnlQYXJhbXM6IHt9IH1cbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUlzTWlsZXN0b25lTG9ja2VkKCk6IGJvb2xlYW4ge1xuICAgIC8vIE9ubHkgYXBwbHkgbWlsZXN0b25lIGxvY2tpbmcgZm9yIExlYXJuaW5nIFBhdGh3YXkgY29udGVudFxuICAgIGlmICghdGhpcy5iYXNlQ29udGVudFJlYWREYXRhIHx8IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5jb3Vyc2VDYXRlZ29yeSAhPT0gJ0xlYXJuaW5nIFBhdGh3YXknKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgY3VycmVudCBjb250ZW50IGlzIGEgTWlsZXN0b25lXG4gICAgaWYgKCF0aGlzLl9jYWNoZWRJc01pbGVzdG9uZSAmJiAhdGhpcy5jb21wdXRlSXNNaWxlc3RvbmUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaGFzaG1hcCBoYXMgcHJlLWNvbXB1dGVkIGxvY2tpbmcgc3RhdHVzIChwcmVmZXJyZWQgLSBjb21wdXRlZCBieSBzZXJ2aWNlKVxuICAgIGNvbnN0IGhhc2hEYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhICYmIHRoaXMuaGllcmFyY2h5TWFwRGF0YVt0aGlzLmNvbnRlbnQuaWRlbnRpZmllcl1cbiAgICBjb25zb2xlLmxvZyhgY29tcHV0ZUlzTWlsZXN0b25lTG9ja2VkIGZvciAke3RoaXMuY29udGVudC5pZGVudGlmaWVyfSAoJHt0aGlzLmNvbnRlbnQubmFtZX0pOmAsIHtcbiAgICAgIGhhc2hEYXRhLFxuICAgICAgY29tcHV0ZWRJc0xvY2tlZDogaGFzaERhdGE/LmNvbXB1dGVkSXNMb2NrZWQsXG4gICAgICBjb250ZW50SXNMb2NrZWQ6IHRoaXMuY29udGVudC5pc0xvY2tlZFxuICAgIH0pXG4gICAgXG4gICAgaWYgKGhhc2hEYXRhICYmIGhhc2hEYXRhLmNvbXB1dGVkSXNMb2NrZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGhhc2hEYXRhLmNvbXB1dGVkSXNMb2NrZWRcbiAgICB9XG5cbiAgICAvLyBJZiBtaWxlc3RvbmUgaGFzIGlzTG9ja2VkIGZsYWcgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UsIGl0J3MgdW5sb2NrZWRcbiAgICBpZiAodGhpcy5jb250ZW50LmlzTG9ja2VkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdCB1bnRpbCBjb21wdXRlZCBvdGhlcndpc2VcbiAgICAvLyBUaGlzIGVuc3VyZXMgcHJvcGVyIGxvY2tpbmcgdW50aWwgdGhlIGhhc2htYXAgaXMgdXBkYXRlZCB3aXRoIHByb2dyZXNzXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHByaXZhdGUgY29tcHV0ZUlzUGFyZW50TWlsZXN0b25lTG9ja2VkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnBhcmVudE1pbGVzdG9uZUxvY2tlZCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSB8fCB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuY291cnNlQ2F0ZWdvcnkgIT09ICdMZWFybmluZyBQYXRod2F5Jykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRlbnQgfHwgIXRoaXMuaGllcmFyY2h5TWFwRGF0YSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaGFzaG1hcCBmb3IgcHJlLWNvbXB1dGVkIHZhbHVlXG4gICAgY29uc3QgaGFzaERhdGEgPSB0aGlzLmhpZXJhcmNoeU1hcERhdGFbdGhpcy5jb250ZW50LmlkZW50aWZpZXJdXG4gICAgaWYgKGhhc2hEYXRhICYmIGhhc2hEYXRhLmlzUGFyZW50TWlsZXN0b25lTG9ja2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBoYXNoRGF0YS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZFxuICAgIH1cblxuICAgIC8vIFRyYXZlcnNlIHVwIHRoZSBoaWVyYXJjaHkgdG8gZmluZCBpZiBhbnkgYW5jZXN0b3IgaXMgYSBsb2NrZWQgTWlsZXN0b25lXG4gICAgbGV0IGN1cnJlbnRQYXJlbnRJZCA9IHRoaXMuY29udGVudC5wYXJlbnRcbiAgICBjb25zdCBtYXhEZXB0aCA9IDVcbiAgICBsZXQgZGVwdGggPSAwXG5cbiAgICB3aGlsZSAoY3VycmVudFBhcmVudElkICYmIGRlcHRoIDwgbWF4RGVwdGgpIHtcbiAgICAgIGNvbnN0IHBhcmVudERhdGEgPSB0aGlzLmhpZXJhcmNoeU1hcERhdGFbY3VycmVudFBhcmVudElkXVxuICAgICAgaWYgKHBhcmVudERhdGEpIHtcbiAgICAgICAgaWYgKChwYXJlbnREYXRhLmlzTWlsZXN0b25lIHx8IHBhcmVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSAnTWlsZXN0b25lJyB8fCBwYXJlbnREYXRhLmNvdXJzZUNhdGVnb3J5ID09PSAnTWlsZXN0b25lJykgJiYgXG4gICAgICAgICAgICAocGFyZW50RGF0YS5jb21wdXRlZElzTG9ja2VkIHx8IHBhcmVudERhdGEuaXNMb2NrZWQpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UGFyZW50SWQgPSBwYXJlbnREYXRhLnBhcmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlcHRoKytcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY3VycmVudCBjb250ZW50IGlzIGEgTUlMRVNUT05FIGFzc2Vzc21lbnQgKERJUkVDVCBjaGlsZCBvZiBhIE1pbGVzdG9uZSlcbiAgICogSU1QT1JUQU5UOiBUaGlzIHNob3VsZCBOT1QgcmV0dXJuIHRydWUgZm9yIGNvdXJzZSBhc3Nlc3NtZW50cyBpbnNpZGUgY291cnNlcyB3aXRoaW4gbWlsZXN0b25lc1xuICAgKiBPbmx5IGFzc2Vzc21lbnRzIHRoYXQgYXJlIGRpcmVjdCBjaGlsZHJlbiBvZiBtaWxlc3RvbmVzIHNob3VsZCBiZSBsb2NrZWQgYnkgbWlsZXN0b25lIGxvZ2ljXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVJc01pbGVzdG9uZUFzc2Vzc21lbnQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgfHwgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmNvdXJzZUNhdGVnb3J5ICE9PSAnTGVhcm5pbmcgUGF0aHdheScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICghdGhpcy5jb250ZW50IHx8ICF0aGlzLmhpZXJhcmNoeU1hcERhdGEpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gYXNzZXNzbWVudCB0eXBlXG4gICAgLy8gTm90ZTogRklOQUxfQVNTRVNTTUVOVCBtYXBzIHRvICdDb3Vyc2UgQXNzZXNzbWVudCcgaW4gdGhlIGVudW0sIG5vdCAnRmluYWwgQXNzZXNzbWVudCdcbiAgICBjb25zdCBpc0Fzc2Vzc21lbnQgPSBcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdTdGFuZGFsb25lIEFzc2Vzc21lbnQnIHx8XG4gICAgICB0aGlzLmNvbnRlbnQubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCcgfHxcbiAgICAgIHRoaXMuY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3F1aXonXG5cbiAgICBpZiAoIWlzQXNzZXNzbWVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSU1QT1JUQU5UOiBPbmx5IHJldHVybiB0cnVlIGlmIHRoZSBESVJFQ1QgcGFyZW50IGlzIGEgbWlsZXN0b25lXG4gICAgLy8gQXNzZXNzbWVudHMgaW5zaWRlIGNvdXJzZXMgKGdyYW5kY2hpbGRyZW4gb2YgbWlsZXN0b25lcykgc2hvdWxkIE5PVCBiZSBsb2NrZWQgYnkgbWlsZXN0b25lIGxvZ2ljXG4gICAgLy8gVGhleSBmb2xsb3cgdGhlaXIgb3duIGNvdXJzZSdzIGxvY2tpbmcgcnVsZXNcbiAgICBcbiAgICAvLyBHZXQgdGhlIHBhcmVudCBmcm9tIGhhc2htYXAgKHdoaWNoIHdlIGZpeGVkIHRvIHRyYWNrIGNvcnJlY3QgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMpXG4gICAgLy8gb3IgZmFsbGJhY2sgdG8gY29udGVudC5wYXJlbnQgaWYgaGFzaG1hcCBlbnRyeSBkb2Vzbid0IGV4aXN0XG4gICAgY29uc3QgY29udGVudEhhc2hEYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudC5pZGVudGlmaWVyXVxuICAgIGNvbnN0IHBhcmVudElkID0gY29udGVudEhhc2hEYXRhPy5wYXJlbnQgfHwgdGhpcy5jb250ZW50LnBhcmVudFxuICAgIFxuICAgIGNvbnNvbGUubG9nKGDwn5SNIGNvbXB1dGVJc01pbGVzdG9uZUFzc2Vzc21lbnQgZm9yIFwiJHt0aGlzLmNvbnRlbnQubmFtZX1cIiAoJHt0aGlzLmNvbnRlbnQuaWRlbnRpZmllcn0pOmAsIHtcbiAgICAgIGNvbnRlbnRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICBwcmltYXJ5Q2F0ZWdvcnk6IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICBtaW1lVHlwZTogdGhpcy5jb250ZW50Lm1pbWVUeXBlLFxuICAgICAgY29udGVudFBhcmVudDogdGhpcy5jb250ZW50LnBhcmVudCxcbiAgICAgIGhhc2htYXBQYXJlbnQ6IGNvbnRlbnRIYXNoRGF0YT8ucGFyZW50LFxuICAgICAgcmVzb2x2ZWRQYXJlbnRJZDogcGFyZW50SWQsXG4gICAgICBoYXNQYXJlbnREYXRhOiAhIXRoaXMuaGllcmFyY2h5TWFwRGF0YVtwYXJlbnRJZF1cbiAgICB9KVxuICAgIFxuICAgIGlmIChwYXJlbnRJZCAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbcGFyZW50SWRdKSB7XG4gICAgICBjb25zdCBwYXJlbnREYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3BhcmVudElkXVxuICAgICAgXG4gICAgICBjb25zb2xlLmxvZyhgICAgUGFyZW50IGRldGFpbHM6YCwge1xuICAgICAgICBwYXJlbnRJZDogcGFyZW50SWQsXG4gICAgICAgIHBhcmVudE5hbWU6IHBhcmVudERhdGE/Lm5hbWUsXG4gICAgICAgIHBhcmVudFByaW1hcnlDYXRlZ29yeTogcGFyZW50RGF0YT8ucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICBwYXJlbnRJc01pbGVzdG9uZTogcGFyZW50RGF0YT8uaXNNaWxlc3RvbmUsXG4gICAgICAgIHBhcmVudENvdXJzZUNhdGVnb3J5OiBwYXJlbnREYXRhPy5jb3Vyc2VDYXRlZ29yeSxcbiAgICAgIH0pXG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIERJUkVDVCBwYXJlbnQgaXMgYSBtaWxlc3RvbmUgLSBPTkxZIHRoaXMgY2FzZVxuICAgICAgY29uc3QgaXNQYXJlbnRNaWxlc3RvbmUgPSBwYXJlbnREYXRhLmlzTWlsZXN0b25lIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudERhdGEuY291cnNlQ2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnXG4gICAgICBcbiAgICAgIGlmIChpc1BhcmVudE1pbGVzdG9uZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAg4pyFIFJlc3VsdDogSVMgYSBtaWxlc3RvbmUgYXNzZXNzbWVudCAoZGlyZWN0IGNoaWxkIG9mIG1pbGVzdG9uZSlgKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zb2xlLmxvZyhgICAg4p2MIFJlc3VsdDogTk9UIGEgbWlsZXN0b25lIGFzc2Vzc21lbnQgKHBhcmVudCBpcyAke3BhcmVudERhdGEucHJpbWFyeUNhdGVnb3J5fSwgbm90IGEgTWlsZXN0b25lKWApXG4gICAgICAvLyBETyBOT1QgY2hlY2sgZ3JhbmRwYXJlbnQgLSBjb3Vyc2UgYXNzZXNzbWVudHMgaW5zaWRlIGNvdXJzZXMgd2l0aGluIG1pbGVzdG9uZXNcbiAgICAgIC8vIHNob3VsZCBOT1QgYmUgdHJlYXRlZCBhcyBtaWxlc3RvbmUgYXNzZXNzbWVudHNcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAg4pqg77iPICBObyBwYXJlbnQgZGF0YSBmb3VuZCBmb3IgJHtwYXJlbnRJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG1pbGVzdG9uZSBhc3Nlc3NtZW50IHNob3VsZCBiZSBsb2NrZWRcbiAgICogQXNzZXNzbWVudCBpcyBsb2NrZWQgaWY6XG4gICAqIDEuIEl0J3MgYW4gYXNzZXNzbWVudCB0aGF0IGlzIGEgRElSRUNUIGNoaWxkIG9mIGEgbWlsZXN0b25lXG4gICAqIDIuIFRoZSBwYXJlbnQgbWlsZXN0b25lIGlzIHVubG9ja2VkIChvdGhlcndpc2UgaGFuZGxlZCBieSBwYXJlbnQgbWlsZXN0b25lIGxvY2spXG4gICAqIDMuIE5PVCBhbGwgbWFuZGF0b3J5IGNvdXJzZXMgaW4gdGhlIHNhbWUgbWlsZXN0b25lIGFyZSBjb21wbGV0ZWRcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUlzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IGFwcGx5IHRvIGFzc2Vzc21lbnRzIHRoYXQgYXJlIERJUkVDVCBjaGlsZHJlbiBvZiBtaWxlc3RvbmVzXG4gICAgY29uc3QgaXNNaWxlc3RvbmVBc3Nlc3NtZW50ID0gdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmVBc3Nlc3NtZW50IHx8IHRoaXMuY29tcHV0ZUlzTWlsZXN0b25lQXNzZXNzbWVudCgpXG4gICAgXG4gICAgY29uc29sZS5sb2coYPCflJIgY29tcHV0ZUlzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZCBmb3IgXCIke3RoaXMuY29udGVudD8ubmFtZX1cIjpgLCB7XG4gICAgICBpc01pbGVzdG9uZUFzc2Vzc21lbnQsXG4gICAgICBfY2FjaGVkSXNNaWxlc3RvbmVBc3Nlc3NtZW50OiB0aGlzLl9jYWNoZWRJc01pbGVzdG9uZUFzc2Vzc21lbnQsXG4gICAgfSlcbiAgICBcbiAgICBpZiAoIWlzTWlsZXN0b25lQXNzZXNzbWVudCkge1xuICAgICAgY29uc29sZS5sb2coYPCflJMgXCIke3RoaXMuY29udGVudD8ubmFtZX1cIiBOT1QgbG9ja2VkIC0gbm90IGEgbWlsZXN0b25lIGFzc2Vzc21lbnRgKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaGFzaG1hcCBoYXMgcHJlLWNvbXB1dGVkIGFzc2Vzc21lbnQgbG9ja2luZyBzdGF0dXNcbiAgICBjb25zdCBoYXNoRGF0YSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbdGhpcy5jb250ZW50Py5pZGVudGlmaWVyIHx8ICcnXVxuICAgIGlmIChoYXNoRGF0YSAmJiBoYXNoRGF0YS5pc0Fzc2Vzc21lbnRMb2NrZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGhhc2hEYXRhLmlzQXNzZXNzbWVudExvY2tlZFxuICAgIH1cblxuICAgIC8vIElmIGFscmVhZHkgY29tcGxldGVkLCBkb24ndCBsb2NrXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiAodGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgXG4gICAgICAgICh0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgJiYgdGhpcy5jb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBGb3IgbWlsZXN0b25lIGFzc2Vzc21lbnRzLCB0aGUgcGFyZW50IElTIHRoZSBtaWxlc3RvbmUgKHZlcmlmaWVkIGJ5IGNvbXB1dGVJc01pbGVzdG9uZUFzc2Vzc21lbnQpXG4gICAgLy8gVXNlIGhhc2htYXAncyBwYXJlbnQgd2hpY2ggaGFzIGNvcnJlY3QgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHNcbiAgICBjb25zdCBjb250ZW50SGFzaERhdGEgPSB0aGlzLmhpZXJhcmNoeU1hcERhdGEgJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudD8uaWRlbnRpZmllciB8fCAnJ11cbiAgICBjb25zdCBtaWxlc3RvbmVJZCA9IGNvbnRlbnRIYXNoRGF0YT8ucGFyZW50IHx8IHRoaXMuY29udGVudD8ucGFyZW50XG4gICAgXG4gICAgaWYgKCFtaWxlc3RvbmVJZCB8fCAhdGhpcy5oaWVyYXJjaHlNYXBEYXRhKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgXG4gICAgY29uc3QgbWlsZXN0b25lID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW21pbGVzdG9uZUlkXVxuICAgIFxuICAgIGlmICghbWlsZXN0b25lKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgXG4gICAgLy8gSWYgdGhlIHBhcmVudCBtaWxlc3RvbmUgaXRzZWxmIGlzIGxvY2tlZCwgZG9uJ3QgYWRkIGFkZGl0aW9uYWwgbG9ja2luZ1xuICAgIC8vICh0aGUgcGFyZW50IGxvY2sgd2lsbCBoYW5kbGUgaXQpXG4gICAgaWYgKG1pbGVzdG9uZS5jb21wdXRlZElzTG9ja2VkIHx8IG1pbGVzdG9uZS5pc0xvY2tlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYWxsIG1hbmRhdG9yeSBDT1VSU0VTIGluIHRoZSBtaWxlc3RvbmUgYXJlIGNvbXBsZXRlZFxuICAgIC8vIE5vdGU6IE9ubHkgY2hlY2tpbmcgY291cnNlcyB0aGF0IGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIG1pbGVzdG9uZVxuICAgIGxldCBtYW5kYXRvcnlDb3VudCA9IDBcbiAgICBsZXQgY29tcGxldGVkTWFuZGF0b3J5Q291bnQgPSAwXG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhpZXJhcmNoeU1hcERhdGEpKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2tleV1cblxuICAgICAgLy8gT25seSBjaGVjayBpdGVtcyB0aGF0IGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhpcyBtaWxlc3RvbmVcbiAgICAgIGlmIChpdGVtLnBhcmVudCAhPT0gbWlsZXN0b25lSWQpIGNvbnRpbnVlXG5cbiAgICAgIC8vIE9ubHkgY291bnQgY291cnNlcyAobm90IGFzc2Vzc21lbnRzLCBub3Qgb3RoZXIgdHlwZXMpXG4gICAgICBpZiAoaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgIT09ICdDb3Vyc2UnICYmICFpdGVtLmlzQ29sbGVjdGlvbikgY29udGludWVcbiAgICAgIFxuICAgICAgLy8gU2tpcCBpZiB0aGlzIGlzIGFuIGFzc2Vzc21lbnRcbiAgICAgIGNvbnN0IGlzSXRlbUFzc2Vzc21lbnQgPVxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0ZpbmFsIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnU3RhbmRhbG9uZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLnN1bmJpcmQucXVlc3Rpb25zZXQnXG4gICAgICBpZiAoaXNJdGVtQXNzZXNzbWVudCkgY29udGludWVcblxuICAgICAgLy8gQnkgZGVmYXVsdCwgY291cnNlcyBhcmUgbWFuZGF0b3J5IHVubGVzcyBleHBsaWNpdGx5IG1hcmtlZCBhcyBvcHRpb25hbFxuICAgICAgaWYgKGl0ZW0uaXNNYW5kYXRvcnkgIT09IGZhbHNlKSB7XG4gICAgICAgIG1hbmRhdG9yeUNvdW50KytcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBpdGVtLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgaXRlbS5zdGF0dXMgPT09IDIgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCB8fCBpdGVtLnByb2dyZXNzID49IDEwMFxuICAgICAgICBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCsrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbWFuZGF0b3J5IGNvdXJzZXMsIGFzc2Vzc21lbnQgaXMgdW5sb2NrZWRcbiAgICBpZiAobWFuZGF0b3J5Q291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIExvY2sgYXNzZXNzbWVudCBpZiBub3QgYWxsIG1hbmRhdG9yeSBjb3Vyc2VzIGFyZSBjb21wbGV0ZWRcbiAgICBjb25zdCBhbGxNYW5kYXRvcnlDb21wbGV0ZSA9IGNvbXBsZXRlZE1hbmRhdG9yeUNvdW50ID49IG1hbmRhdG9yeUNvdW50XG4gICAgcmV0dXJuICFhbGxNYW5kYXRvcnlDb21wbGV0ZVxuICB9XG5cbiAgLy8gRk9SIFJJR0hUIFNJREUgUkVTT1VSQ0UgU0NST0xMIE9OIFRPQyBQQUdFXG4gIHJlc291cmNlU2Nyb2xsKCkge1xuICAgIHRoaXMucGFnZVNjcm9sbFN1YnNjcmlwdGlvbiA9IHRoaXMuYXBwVG9jU3ZjLnVwZGF0ZVBhZ2VTY3JvbGwuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldygpXG4gICAgICAgIH0sIDcwMClcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIC8vIFRPIFVQREFURSBSRVNPVVJDRSBCRUhBVk9VUiBTVUJKRUNUIEZPUiBSRVNPVVJDRSBTQ1JPTExcbiAgY2hhbmdlUmVzb3VyY2UoKSB7XG4gICAgdGhpcy5hcHBUb2NTdmMuZ2V0UGFnZVNjcm9sbC5uZXh0KHRydWUpXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgbGV0IHNob3VsZFJlY29tcHV0ZUNhY2hlID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gY2hhbmdlcykge1xuICAgICAgaWYgKHByb3BlcnR5ID09PSAnZXhwYW5kQWxsJykge1xuICAgICAgICB0aGlzLnZpZXdDaGlsZHJlbiA9IHRoaXMuZXhwYW5kQWxsXG4gICAgICB9XG4gICAgICBpZiAocHJvcGVydHkgPT09ICdwYXRoU2V0JyAmJiBjaGFuZ2VzWydwYXRoU2V0J10pIHtcbiAgICAgICAgbGV0IGN1cnJlbnRWYWx1ZSA9IGNoYW5nZXNbJ3BhdGhTZXQnXS5jdXJyZW50VmFsdWVcbiAgICAgICAgbGV0IHByZXZpb3VzVmFsdWUgPSBjaGFuZ2VzWydwYXRoU2V0J10ucHJldmlvdXNWYWx1ZVxuICAgICAgICBpZiAoY3VycmVudFZhbHVlICYmIHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBlcVNldCA9ICh4czogYW55LCB5czogYW55KSA9PlxuICAgICAgICAgICAgeHMuc2l6ZSA9PT0geXMuc2l6ZSAmJlxuICAgICAgICAgICAgWy4uLnhzXS5ldmVyeSgoeCkgPT4geXMuaGFzKHgpKVxuICAgICAgICAgIGlmICghZXFTZXQocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSkgeyB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYocHJldmlvdXNWYWx1ZSA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgLy8gICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgIC8vICAgfSw3MDApXG4gICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICAgIC8vIHRoaXMuYXBwVG9jU3ZjLmdldFBhZ2VTY3JvbGwubmV4dCh0cnVlKVxuXG4gICAgICBpZiAocHJvcGVydHkgPT09ICdoaWVyYXJjaHlNYXBEYXRhJykge1xuICAgICAgICBpZiAoXy5pc0VtcHR5KGNoYW5nZXNbJ2hpZXJhcmNoeU1hcERhdGEnXS5jdXJyZW50VmFsdWUpKSB7XG4gICAgICAgICAgLy8gdGhpcy5sb2FkaW5nT3ZlcmFsbFBSb2dyZXNzID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hpbGRQYXJlbnRNYXAodGhpcy5jb250ZW50LmlkZW50aWZpZXIpXG4gICAgICAgICAgfVxuICAgICAgICAgIHNob3VsZFJlY29tcHV0ZUNhY2hlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlY29tcHV0ZSBjYWNoZSB3aGVuIGNyaXRpY2FsIGlucHV0cyBjaGFuZ2VcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ2NvbnRlbnQnIHx8IHByb3BlcnR5ID09PSAnYmFzZUNvbnRlbnRSZWFkRGF0YScgfHwgXG4gICAgICAgICAgcHJvcGVydHkgPT09ICdiYXRjaElkJyB8fCBwcm9wZXJ0eSA9PT0gJ2ZvclByZXZpZXcnIHx8IFxuICAgICAgICAgIHByb3BlcnR5ID09PSAncGFyZW50TWlsZXN0b25lTG9ja2VkJyB8fCBwcm9wZXJ0eSA9PT0gJ21sQ291cnNlJykge1xuICAgICAgICBzaG91bGRSZWNvbXB1dGVDYWNoZSA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNvbXB1dGUgYWxsIGNhY2hlZCBwcm9wZXJ0aWVzIGlmIG5lZWRlZFxuICAgIGlmIChzaG91bGRSZWNvbXB1dGVDYWNoZSkge1xuICAgICAgdGhpcy5jb21wdXRlQWxsQ2FjaGVkUHJvcGVydGllcygpXG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCdwcmUgYXNzZXNzbWVudCBjb250ZW50LS0tJywgdGhpcy5jb250ZW50KVxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmhpZXJhcmNoeU1hcERhdGEtLS0nLCB0aGlzLmhpZXJhcmNoeU1hcERhdGEpXG4gIH1cblxuICBjaGVjayhjb250ZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5leHBhbmRBY3RpdmUpIHtcbiAgICAgIGNvbnRlbnQudmlld0NoaWxkcmVuID0gdGhpcy5wYXRoU2V0ICYmIHRoaXMucGF0aFNldC5oYXMoY29udGVudC5pZGVudGlmaWVyKSB8fCBjb250ZW50LnZpZXdDaGlsZHJlblxuICAgIH1cbiAgICByZXR1cm4gY29udGVudC52aWV3Q2hpbGRyZW5cbiAgfVxuXG4gIGdldCBpc0NvbGxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2NhY2hlSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRJc0NvbGxlY3Rpb25cbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5taW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuQ09MTEVDVElPTlxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc01vZHVsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fY2FjaGVJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZElzTW9kdWxlXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwdWJsaWMgY2hlY2tNb2R1bGUoY29udGVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChjb250ZW50KSB7XG4gICAgICByZXR1cm4gY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGNoZWNrSXNNb2R1bGUoY29udGVudDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzQmF0Y2hJblByb2dlc3MoKSB7XG4gICAgaWYgKHRoaXMuYmF0Y2hEYXRhICYmICh0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQubGVuZ3RoKSAmJiB0aGlzLmJhdGNoRGF0YS5lbnJvbGxlZCkge1xuICAgICAgY29uc3QgYmF0Y2hEYXRhID0gdGhpcy5iYXRjaERhdGEuY29udGVudFswXVxuICAgICAgaWYgKGJhdGNoRGF0YSAmJiBiYXRjaERhdGEuZW5kRGF0ZSkge1xuICAgICAgICBjb25zdCBub3cgPSBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgICAgICBjb25zdCBzdGFydERhdGUgPSBtb21lbnQoYmF0Y2hEYXRhLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3QgZW5kRGF0ZSA9IGJhdGNoRGF0YS5lbmREYXRlID8gbW9tZW50KGJhdGNoRGF0YS5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSA6IG5vd1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8vIGJhdGNoLnN0YXR1cyAmJlxuICAgICAgICAgIG1vbWVudChzdGFydERhdGUpLmlzU2FtZU9yQmVmb3JlKG5vdylcbiAgICAgICAgICAmJiBtb21lbnQoZW5kRGF0ZSkuaXNTYW1lT3JBZnRlcihub3cpXG4gICAgICAgIClcbiAgICAgIH0gcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgaXNSZXNvdXJjZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fY2FjaGVJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZElzUmVzb3VyY2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUlzUmVzb3VyY2UoKVxuICB9XG5cbiAgZ2V0IHJlc291cmNlTGluaygpOiB7IHVybDogc3RyaW5nOyBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9IHtcbiAgICBpZiAodGhpcy5fY2FjaGVJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFJlc291cmNlTGlua1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21wdXRlUmVzb3VyY2VMaW5rKClcbiAgfVxuXG4gIHB1YmxpYyBwcm9ncmVzc0NvbG9yKCk6IHN0cmluZyB7XG4gICAgLy8gaWYgKHRoaXMuY3VycmVudFByb2dyZXNzIDw9IDMwKSB7XG4gICAgLy8gICByZXR1cm4gJyNEMTM5MjQnXG4gICAgLy8gfSBpZiAodGhpcy5jdXJyZW50UHJvZ3Jlc3MgPiAzMCAmJiB0aGlzLmN1cnJlbnRQcm9ncmVzcyA8PSA3MCkge1xuICAgIC8vICAgcmV0dXJuICcjRTk5RTM4J1xuICAgIC8vIH1cbiAgICAvLyBpZiAodGhpcy5jdXJyZW50UHJvZ3Jlc3MgPiA3MCAmJiB0aGlzLmN1cnJlbnRQcm9ncmVzcyA8PSAxMDApIHtcbiAgICAvLyAgIHJldHVybiAnIzFEODkyMydcbiAgICAvLyB9XG5cbiAgICByZXR1cm4gJyMxRDg5MjMnXG4gIH1cbiAgcHVibGljIHByb2dyZXNzQ29sb3IyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcjZjI3ZDAwJ1xuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZUltbWVkaWF0ZUNoaWxkcmVuU3RydWN0dXJlKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNoaWxkcmVuICYmIHRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29udGVudC5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogTnNDb250ZW50LklDb250ZW50KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSkge1xuICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS5jb3Vyc2UgKz0gMVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuS05PV0xFREdFX0FSVElGQUNUKSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLm90aGVyICs9IDFcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSkge1xuICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS5sZWFybmluZ01vZHVsZSArPSAxXG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT04pIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUub2ZmbGluZVNlc3Npb24gKz0gMVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0UpIHtcbiAgICAgICAgICBzd2l0Y2ggKGNoaWxkLm1pbWVUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLkhBTkRTX09OOlxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUuaGFuZHNPbiArPSAxXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLk1QMzpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLnBvZGNhc3QgKz0gMVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDQ6XG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTg6XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS52aWRlbyArPSAxXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLklOVEVSQUNUSU9OOlxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUuaW50ZXJhY3RpdmVWaWRlbyArPSAxXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlBERjpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLnBkZiArPSAxXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLk9GRkxJTkVfU0VTU0lPTjpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLm9mZmxpbmVTZXNzaW9uICs9IDFcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuU1VSVkVZOlxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUuc3VydmV5ICs9IDFcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSFRNTDpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLndlYlBhZ2UgKz0gMVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5RVUlaOlxuICAgICAgICAgICAgICBpZiAoY2hpbGQucmVzb3VyY2VUeXBlID09PSAnQXNzZXNzbWVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUuYXNzZXNzbWVudCArPSAxXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLnF1aXogKz0gMVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlBSQUNUSUNFX1JFU09VUkNFOlxuICAgICAgICAgICAgICAvLyBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLkZJTkFMX0FTU0VTU01FTlQ6XG4gICAgICAgICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUFJBQ1RJQ0VfUkVTT1VSQ0U6XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudFN0cnVjdHVyZS5wcmFjdGljZVRlc3QgKz0gMVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5XRUJfTU9EVUxFOlxuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRTdHJ1Y3R1cmUud2ViTW9kdWxlICs9IDFcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWU9VVFVCRTpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLnlvdXR1YmUgKz0gMVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50U3RydWN0dXJlLm90aGVyICs9IDFcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY29udGVudFN0cnVjdHVyZSkge1xuICAgICAgaWYgKHRoaXMuY29udGVudFN0cnVjdHVyZVtrZXldID4gMCkge1xuICAgICAgICB0aGlzLmhhc0NvbnRlbnRTdHJ1Y3R1cmUgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbnRleHRQYXRoKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZXh0SWQ6IHRoaXMucm9vdElkLFxuICAgICAgY29udGV4dFBhdGg6IHRoaXMucm9vdENvbnRlbnRUeXBlLFxuICAgICAgYmF0Y2hJZDogdGhpcy5iYXRjaElkLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjb250ZW50VHJhY2tCeShfaW5kZXg6IG51bWJlciwgY29udGVudDogTnNDb250ZW50LklDb250ZW50KSB7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gY29udGVudC5pZGVudGlmaWVyXG4gIH1cblxuICBwdWJsaWMgcmFpc2VUZWxlbWV0cnkoKSB7XG4gICAgLy8gaWYgKHRoaXMuZm9yUHJldmlldykgeyByZXR1cm4gfVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgIHN1YlR5cGU6IGBjYXJkLXRvY0NvbnRlbnRDYXJkYCxcbiAgICAgICAgICAvLyBpZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIgfHwgJycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBjb250ZW50SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyIHx8ICcnLFxuICAgICAgICAgIC8vIGNvbnRlbnRUeXBlOiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICAgIGlkOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciB8fCAnJyxcbiAgICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICAgIHJvbGx1cDoge1xuICAgICAgICAgICAgbDE6IHRoaXMucm9vdElkIHx8ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmVyOiBgJHt0aGlzLmNvbnRlbnQudmVyc2lvbn0keycnfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwYWdlSWRFeHQ6IGAke18uY2FtZWxDYXNlKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpfS1jYXJkYCxcbiAgICAgICAgICBtb2R1bGU6IF8uY2FtZWxDYXNlKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpLFxuICAgICAgICB9KVxuICAgIH1cbiAgfVxuICBnZXQgaXNBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiAhKE5zQ29udGVudC5VTl9TVVBQT1JURURfREFUQV9UWVBFU19GT1JfTk9OX0JBVENIX1VTRVJTLmluZGV4T2YodGhpcy5jb250ZW50Lm1pbWVUeXBlKSA+PSAwKVxuICAgIH0gcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBnZXQgaXNFbnJvbGxlZCgpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBib3RoIGJhdGNoSWQgYW5kIGJhdGNoRGF0YS5lbnJvbGxlZCB0byBzdXBwb3J0IExlYXJuaW5nIFBhdGh3YXlzXG4gICAgLy8gd2hlcmUgYmF0Y2hJZCBtaWdodCBub3QgYmUgZGlyZWN0bHkgc2V0IGJ1dCB1c2VyIGlzIGVucm9sbGVkIGluIGNvdXJzZXMgd2l0aGluIHRoZSBwYXRod2F5XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hJZCA/IHRydWUgOiAodGhpcy5iYXRjaERhdGE/LmVucm9sbGVkIHx8IGZhbHNlKVxuICB9XG5cbiAgdXBkYXRlQ2hpbGRQYXJlbnRNYXAoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0pIHtcbiAgICAgIGxldCBsb2NhbENvbnRlbnREYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2lkZW50aWZpZXJdXG4gICAgICBpZiAoXG4gICAgICAgICEobG9jYWxDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFXG4gICAgICAgICAgfHwgbG9jYWxDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFXG4gICAgICAgICAgfHwgbG9jYWxDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlRcbiAgICAgICAgICB8fCBsb2NhbENvbnRlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UKVxuICAgICAgKSB7XG4gICAgICAgIC8vIHJlYWwgcGVyY2VudCBsb2dpY1xuICAgICAgICAvLyBjb25zdCB0b3RhbCA9IGxvY2FsQ29udGVudERhdGEubGVhZk5vZGVzLnJlZHVjZSgoc3VtOiBudW1iZXIsIGNoaWxkSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAvLyAgIHJldHVybiBzdW0gKyBOdW1iZXIodGhpcy5oaWVyYXJjaHlNYXBEYXRhW2NoaWxkSWRdLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDApXG4gICAgICAgIC8vIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKVxuICAgICAgICAvLyBjb25zb2xlLmxvZygndG90YWwgJywgdG90YWwpXG4gICAgICAgIC8vIGlmKHRvdGFsID4gMCkge1xuICAgICAgICAvLyAgIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IHRvdGFsIC8gXy50b0ludGVnZXIoXy5nZXQodGhpcy5oaWVyYXJjaHlNYXBEYXRhW2lkZW50aWZpZXJdLCAnbGVhZk5vZGVzQ291bnQnKSlcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAobG9jYWxDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSkge1xuICAgICAgICAgIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXVsnZHVyYXRpb24nXSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXS5sZWFmTm9kZXMucmVkdWNlKFxuICAgICAgICAgICAgKHN1bTogYW55LCBjaGlsZElEOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbY2hpbGRJRF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VtICsgTnVtYmVyKHRoaXMuaGllcmFyY2h5TWFwRGF0YVtjaGlsZElEXS5kdXJhdGlvbiB8fCB0aGlzLmhpZXJhcmNoeU1hcERhdGFbY2hpbGRJRF0uZXhwZWN0ZWREdXJhdGlvbiB8fCAwKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sIDApXG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGVcbiAgICAgICAgY29uc3QgY29tcGxldGVkSXRlbXMgPSBfLmZpbHRlcih0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0ubGVhZk5vZGVzLCByID0+ICh0aGlzLmhpZXJhcmNoeU1hcERhdGFbcl0gJiYgKHRoaXMuaGllcmFyY2h5TWFwRGF0YVtyXS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtyXS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSkpXG4gICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBfLnRvSW50ZWdlcihfLmdldCh0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0sICdsZWFmTm9kZXNDb3VudCcpKSB8fCAxXG4gICAgICAgIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IE51bWJlcigoKGNvbXBsZXRlZEl0ZW1zLmxlbmd0aCAvIHRvdGFsQ291bnQpICogMTAwKS50b0ZpeGVkKCkpXG4gICAgICAgIHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXVsnY29tcGxldGlvblN0YXR1cyddID0gKHRoaXMuaGllcmFyY2h5TWFwRGF0YVtpZGVudGlmaWVyXS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApID8gMiA6IDFcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl1cbiAgICB9XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBnZXRDb21wbGV0aW9uUGVyY2VudGFnZShpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UnLCBpZGVudGlmaWVyKVxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0gOiAnLCB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0pXG4gICAgLy8gY29uc3QgaXRlbSA9IHRoaXMudXBkYXRlQ2hpbGRQYXJlbnRNYXAoaWRlbnRpZmllcilcbiAgICBsZXQgcGVyY2VudCA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0gJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2lkZW50aWZpZXJdLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDBcbiAgICByZXR1cm4gdGhpcy5yb3VuZElmRGVjaW1hbChwZXJjZW50KVxuICB9XG5cbiAgcm91bmRJZkRlY2ltYWwodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUudG9GaXhlZCgyKSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuXG4gIGdldENvbXBsZXRpb25TdGF0dXMoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2dldENvbXBsZXRpb25TdGF0dXMnKVxuICAgIC8vIGNvbnN0IGl0ZW0gPSB0aGlzLnVwZGF0ZUNoaWxkUGFyZW50TWFwKGlkZW50aWZpZXIpXG4gICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5TWFwRGF0YSAmJiB0aGlzLmhpZXJhcmNoeU1hcERhdGFbaWRlbnRpZmllcl0gJiYgdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2lkZW50aWZpZXJdLmNvbXBsZXRpb25TdGF0dXNcbiAgfVxuXG4gIG9wZW5DZXJ0aWZpY2F0ZURpYWxvZyhjZXJ0RGF0YTogYW55KSB7XG4gICAgY29uc3QgY2V0ID0gY2VydERhdGFcbiAgICB0aGlzLmRpYWxvZy5vcGVuKENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAvLyBoZWlnaHQ6ICc0MDBweCcsXG4gICAgICB3aWR0aDogJzEzMDBweCcsXG4gICAgICBkYXRhOiB7IGNldCB9LFxuICAgICAgLy8gcGFuZWxDbGFzczogJ2N1c3RvbS1kaWFsb2ctY29udGFpbmVyJyxcbiAgICB9KVxuICB9XG4gIHNjcm9sbFZpZXcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBlcnJvckZpZWxkOiBhbnkgPSB0aGlzLnJlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KCcucmVzb3VyY2UtY29udGFpbmVyIC5yZXNvdXJjZS1hY3RpdmUnKVxuICAgICAgaWYgKGVycm9yRmllbGQpIHtcbiAgICAgICAgZXJyb3JGaWVsZC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiBcInNtb290aFwiLCBibG9jazogXCJzdGFydFwiLCBpbmxpbmU6IFwibmVhcmVzdFwiIH0pXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb21wb25lbnROYW1lID09PSAndG9jJykge1xuICAgICAgICBpZiAoZXJyb3JGaWVsZCkge1xuICAgICAgICAgIGNvbnN0IHJlY3QgPSBlcnJvckZpZWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgaWYgKHJlY3QudG9wIC0gNDIwID4gMCkge1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbCg0MjAsIHJlY3QudG9wIC0gMTQ4KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwVG9jU3ZjLmdldFBhZ2VTY3JvbGwubmV4dChmYWxzZSlcbiAgICAgIH0sIDcwMClcblxuICAgICAgLy8gZWxzZSB7XG4gICAgICAvLyAgIGVycm9yRmllbGQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogXCJzbW9vdGhcIiwgYmxvY2s6IFwic3RhcnRcIiwgaW5saW5lOiBcIm5lYXJlc3RcIiB9KTtcbiAgICAgIC8vICAgY29uc3QgcmVjdCA9IGVycm9yRmllbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAvLyAgIGVycm9yRmllbGQuc2Nyb2xsKDAscmVjdC50b3AtNTYpXG4gICAgICAvLyB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgfVxuICB9XG5cbiAgZG93bmxvYWRDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZURhdGE6IGFueSkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFR5cGVzLkNMSUNLLFxuICAgICAgICBpZDogJ3ZpZXctY2VydGlmaWNhdGUnLFxuICAgICAgICBzdWJUeXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RTdWJUeXBlcy5DRVJUSUZJQ0FURSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBjZXJ0aWZpY2F0ZURhdGEsICAgLy8gaWQgb2YgdGhlIGNlcnRpZmljYXRlXG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFN1YlR5cGVzLkNFUlRJRklDQVRFLFxuICAgICAgfSlcbiAgICBpZiAoY2VydGlmaWNhdGVEYXRhKSB7XG4gICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nID0gdHJ1ZVxuICAgICAgbGV0IGNlcnREYXRhOiBhbnkgPSBjZXJ0aWZpY2F0ZURhdGFcbiAgICAgIHRoaXMuY2VydGlmaWNhdGVTZXJ2aWNlLmRvd25sb2FkQ2VydGlmaWNhdGVfdjIoY2VydERhdGEpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnN0IGNldCA9IHJlcy5yZXN1bHQucHJpbnRVcmlcbiAgICAgICAgdGhpcy5kaWFsb2cub3BlbihDZXJ0aWZpY2F0ZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgIHdpZHRoOiAnMTMwMHB4JyxcbiAgICAgICAgICBkYXRhOiB7IGNldCwgY2VydElkOiBjZXJ0RGF0YS5pZGVudGlmaWVyIH0sXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nID0gZmFsc2VcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuaGFzaG1hcFVwZGF0ZWRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuaGFzaG1hcFVwZGF0ZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5wYWdlU2Nyb2xsU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnBhZ2VTY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgfVxuXG4gIGdldCBjaGVja0ZvckN1cmF0ZWRQcm9ncmFtKCkge1xuICAgIGlmICh0aGlzLl9jYWNoZUluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVkQ2hlY2tGb3JDdXJhdGVkUHJvZ3JhbVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21wdXRlQ2hlY2tGb3JDdXJhdGVkUHJvZ3JhbSgpXG4gIH1cblxuICBnZXQgaXNDb250ZW50VW5sb2NrZWQoKSB7XG4gICAgaWYgKHRoaXMuX2NhY2hlSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRJc0NvbnRlbnRVbmxvY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21wdXRlSXNDb250ZW50VW5sb2NrZWQoKVxuICB9XG5cbiAgZ2V0IGlzUGFyZW50TWlsZXN0b25lTG9ja2VkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9jYWNoZUluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVkSXNQYXJlbnRNaWxlc3RvbmVMb2NrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29tcHV0ZUlzUGFyZW50TWlsZXN0b25lTG9ja2VkKClcbiAgfVxuXG4gIGdldCBpc01pbGVzdG9uZUxvY2tlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fY2FjaGVJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZElzTWlsZXN0b25lTG9ja2VkXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVJc01pbGVzdG9uZUxvY2tlZCgpXG4gIH1cblxuICBnZXQgaXNNaWxlc3RvbmVBc3Nlc3NtZW50KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9jYWNoZUluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2FjaGVkSXNNaWxlc3RvbmVBc3Nlc3NtZW50XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVJc01pbGVzdG9uZUFzc2Vzc21lbnQoKVxuICB9XG5cbiAgZ2V0IGlzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fY2FjaGVJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZElzTWlsZXN0b25lQXNzZXNzbWVudExvY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21wdXRlSXNNaWxlc3RvbmVBc3Nlc3NtZW50TG9ja2VkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1pbGVzdG9uZSdzIG1hbmRhdG9yeSBjb3Vyc2VzIGFuZCBhc3Nlc3NtZW50IGFyZSBjb21wbGV0ZWQuXG4gICAqIExvb2tzIGF0IHRoZSBjb250ZW50IGhpZXJhcmNoeSB0byBmaW5kIGNoaWxkcmVuIG9mIHRoZSBtaWxlc3RvbmUuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrTWlsZXN0b25lQ29udGVudENvbXBsZXRpb24obWlsZXN0b25lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29udGVudFJlYWREYXRhIHx8ICF0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuY2hpbGRyZW4gfHwgIXRoaXMuaGllcmFyY2h5TWFwRGF0YSkge1xuICAgICAgLy8gRmFsbGJhY2s6IFRyeSB0byBmaW5kIGFzc2Vzc21lbnQgY29tcGxldGlvbiBpbiBoYXNobWFwIGZvciB0aGlzIG1pbGVzdG9uZVxuICAgICAgcmV0dXJuIHRoaXMuY2hlY2tNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGlvbihtaWxlc3RvbmVJZClcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBtaWxlc3RvbmUgaW4gdGhlIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgY29uc3QgbWlsZXN0b25lQ29udGVudCA9IHRoaXMuZmluZENvbnRlbnRJbkhpZXJhcmNoeSh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEsIG1pbGVzdG9uZUlkKVxuICAgIGlmICghbWlsZXN0b25lQ29udGVudCB8fCAhbWlsZXN0b25lQ29udGVudC5jaGlsZHJlbikge1xuICAgICAgcmV0dXJuIHRoaXMuY2hlY2tNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGlvbihtaWxlc3RvbmVJZClcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbGwgbWFuZGF0b3J5IGNvdXJzZXMgYW5kIGFzc2Vzc21lbnRzXG4gICAgbGV0IGFsbE1hbmRhdG9yeUNvbXBsZXRlID0gdHJ1ZVxuICAgIGxldCBoYXNBc3Nlc3NtZW50ID0gZmFsc2VcbiAgICBsZXQgYXNzZXNzbWVudENvbXBsZXRlID0gZmFsc2VcblxuICAgIG1pbGVzdG9uZUNvbnRlbnQuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGREYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW2NoaWxkLmlkZW50aWZpZXJdXG4gICAgICBjb25zdCBpc0Fzc2Vzc21lbnQgPSBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgY2hpbGQuY291cnNlQ2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSAnRmluYWwgQXNzZXNzbWVudCdcbiAgICAgIGNvbnN0IGlzTWFuZGF0b3J5ID0gY2hpbGQubWFuZGF0b3J5ID09PSB0cnVlIHx8IGNoaWxkLm9wdGlvbmFsUmVhZGluZyAhPT0gdHJ1ZVxuXG4gICAgICBpZiAoaXNBc3Nlc3NtZW50KSB7XG4gICAgICAgIGhhc0Fzc2Vzc21lbnQgPSB0cnVlXG4gICAgICAgIGlmIChjaGlsZERhdGEgJiYgKGNoaWxkRGF0YS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApKSB7XG4gICAgICAgICAgYXNzZXNzbWVudENvbXBsZXRlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTWFuZGF0b3J5KSB7XG4gICAgICAgIC8vIENoZWNrIGlmIG1hbmRhdG9yeSBjb250ZW50IGlzIGNvbXBsZXRlZFxuICAgICAgICBpZiAoIWNoaWxkRGF0YSB8fCAoY2hpbGREYXRhLmNvbXBsZXRpb25TdGF0dXMgIT09IDIgJiYgY2hpbGREYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwKSkge1xuICAgICAgICAgIGFsbE1hbmRhdG9yeUNvbXBsZXRlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zb2xlLmxvZygnTWlsZXN0b25lIGNvbnRlbnQgY2hlY2s6JywgeyBhbGxNYW5kYXRvcnlDb21wbGV0ZSwgaGFzQXNzZXNzbWVudCwgYXNzZXNzbWVudENvbXBsZXRlIH0pXG5cbiAgICAvLyBNaWxlc3RvbmUgaXMgY29tcGxldGUgaWYgYXNzZXNzbWVudCBpcyBjb21wbGV0ZSAobWFuZGF0b3J5IGNvdXJzZXMgb3B0aW9uYWwgYmFzZWQgb24gcmVxdWlyZW1lbnRzKVxuICAgIHJldHVybiBoYXNBc3Nlc3NtZW50ID8gYXNzZXNzbWVudENvbXBsZXRlIDogYWxsTWFuZGF0b3J5Q29tcGxldGVcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWxsYmFjazogQ2hlY2sgaWYgZW5vdWdoIGFzc2Vzc21lbnRzIGFyZSBjb21wbGV0ZWQgdG8gdW5sb2NrIHRoaXMgbWlsZXN0b25lLlxuICAgKiBGb3IgbWlsZXN0b25lIGF0IGluZGV4IE4sIHdlIG5lZWQgYXQgbGVhc3QgTiBjb21wbGV0ZWQgYXNzZXNzbWVudHMuXG4gICAqIEUuZy4sIEZvciBNMiAoaW5kZXggMSksIHdlIG5lZWQgMSBjb21wbGV0ZWQgYXNzZXNzbWVudCAoTTEncyBhc3Nlc3NtZW50KVxuICAgKiAgICAgICBGb3IgTTMgKGluZGV4IDIpLCB3ZSBuZWVkIDIgY29tcGxldGVkIGFzc2Vzc21lbnRzIChNMSdzIGFuZCBNMidzKVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja01pbGVzdG9uZUFzc2Vzc21lbnRDb21wbGV0aW9uKG1pbGVzdG9uZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaGllcmFyY2h5TWFwRGF0YSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBtaWxlc3RvbmUgbnVtYmVyIGZyb20gSUQgKE0xIC0+IDEsIE0yIC0+IDIsIGV0Yy4pXG4gICAgY29uc3QgbWlsZXN0b25lTnVtID0gcGFyc2VJbnQobWlsZXN0b25lSWQucmVwbGFjZSgvXFxEL2csICcnKSkgfHwgMFxuICAgIGNvbnN0IHJlcXVpcmVkQ29tcGxldGVkQXNzZXNzbWVudHMgPSBtaWxlc3RvbmVOdW0gLSAxIC8vIEZvciBNMiwgbmVlZCAxOyBmb3IgTTMsIG5lZWQgMlxuXG4gICAgY29uc29sZS5sb2coYE1pbGVzdG9uZSAke21pbGVzdG9uZUlkfSAobnVtOiAke21pbGVzdG9uZU51bX0pIHJlcXVpcmVzICR7cmVxdWlyZWRDb21wbGV0ZWRBc3Nlc3NtZW50c30gY29tcGxldGVkIGFzc2Vzc21lbnRzYClcblxuICAgIGlmIChyZXF1aXJlZENvbXBsZXRlZEFzc2Vzc21lbnRzIDw9IDApIHtcbiAgICAgIHJldHVybiB0cnVlIC8vIEZpcnN0IG1pbGVzdG9uZSwgbm8gcmVxdWlyZW1lbnRzXG4gICAgfVxuXG4gICAgLy8gQ291bnQgY29tcGxldGVkIENvdXJzZSBBc3Nlc3NtZW50cyB0aGF0IGFyZSBJTlNJREUgbWlsZXN0b25lcyAoaGF2ZSBhIHBhcmVudClcbiAgICAvLyBFeGNsdWRlIHByZS1lbnJvbGxtZW50IGFzc2Vzc21lbnRzIGF0IHRoZSByb290IGxldmVsIChubyBwYXJlbnQgb3IgcGFyZW50IGlzIExlYXJuaW5nIFBhdGh3YXkpXG4gICAgbGV0IGNvbXBsZXRlZE1pbGVzdG9uZUFzc2Vzc21lbnRDb3VudCA9IDBcbiAgICBjb25zdCBsZWFybmluZ1BhdGh3YXlJZCA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllclxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oaWVyYXJjaHlNYXBEYXRhKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGllcmFyY2h5TWFwRGF0YVtrZXldXG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjb21wbGV0ZWQgQ291cnNlIEFzc2Vzc21lbnRcbiAgICAgIGlmICgoaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHwgaXRlbS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JykgJiZcbiAgICAgICAgKGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCkpIHtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGFzc2Vzc21lbnQgaGFzIGEgcGFyZW50IChtZWFuaW5nIGl0J3MgaW5zaWRlIGEgY291cnNlL21pbGVzdG9uZSwgbm90IGF0IHJvb3QgbGV2ZWwpXG4gICAgICAgIC8vIEFsc28gZXhjbHVkZSBpZiBwYXJlbnQgaXMgdGhlIExlYXJuaW5nIFBhdGh3YXkgaXRzZWxmIChwcmUtZW5yb2xsbWVudCBhc3Nlc3NtZW50KVxuICAgICAgICBjb25zdCBoYXNQYXJlbnQgPSBpdGVtLnBhcmVudCAmJiBpdGVtLnBhcmVudCAhPT0gbGVhcm5pbmdQYXRod2F5SWRcblxuICAgICAgICBpZiAoaGFzUGFyZW50KSB7XG4gICAgICAgICAgY29tcGxldGVkTWlsZXN0b25lQXNzZXNzbWVudENvdW50KytcbiAgICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgY29tcGxldGVkIE1JTEVTVE9ORSBhc3Nlc3NtZW50OiAke2tleX1gLCBpdGVtKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBTa2lwcGluZyByb290LWxldmVsL3ByZS1lbnJvbGxtZW50IGFzc2Vzc21lbnQ6ICR7a2V5fWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgVG90YWwgY29tcGxldGVkIE1JTEVTVE9ORSBhc3Nlc3NtZW50czogJHtjb21wbGV0ZWRNaWxlc3RvbmVBc3Nlc3NtZW50Q291bnR9LCBSZXF1aXJlZDogJHtyZXF1aXJlZENvbXBsZXRlZEFzc2Vzc21lbnRzfWApXG5cbiAgICAvLyBJZiB3ZSBoYXZlIGVub3VnaCBjb21wbGV0ZWQgbWlsZXN0b25lIGFzc2Vzc21lbnRzLCB1bmxvY2sgdGhpcyBtaWxlc3RvbmVcbiAgICByZXR1cm4gY29tcGxldGVkTWlsZXN0b25lQXNzZXNzbWVudENvdW50ID49IHJlcXVpcmVkQ29tcGxldGVkQXNzZXNzbWVudHNcbiAgfVxuXG4gIHByaXZhdGUgZmluZENvbnRlbnRJbkhpZXJhcmNoeShjb250ZW50OiBhbnksIGlkZW50aWZpZXI6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFjb250ZW50KSByZXR1cm4gbnVsbFxuICAgIGlmIChjb250ZW50LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHJldHVybiBjb250ZW50XG4gICAgaWYgKGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY29udGVudC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZENvbnRlbnRJbkhpZXJhcmNoeShjaGlsZCwgaWRlbnRpZmllcilcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmRcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGdldCBjb21wdXRlZFF1ZXJ5UGFyYW1zKCkge1xuICAgIGlmICh0aGlzLmlzQWxsb3dlZCAmJiAhdGhpcy5mb3JQcmV2aWV3ICYmIHRoaXMuaXNFbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLnJlc291cmNlTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgcHJlQXNzZXNzbWVudDogJ3RydWUnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBnZXQgaXNNaWxlc3RvbmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2NhY2hlSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRJc01pbGVzdG9uZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb21wdXRlSXNNaWxlc3RvbmUoKVxuICB9XG5cbiAgZ2V0TWlsZXN0b25lQ29tcGxldGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuY29udGVudCB8fCAhdGhpcy5oaWVyYXJjaHlNYXBEYXRhKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cbiAgICBjb25zdCBtaWxlc3RvbmVEYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudC5pZGVudGlmaWVyXVxuICAgIGlmICghbWlsZXN0b25lRGF0YSB8fCAhbWlsZXN0b25lRGF0YS5sZWFmTm9kZXMpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuICAgIGxldCBjb21wbGV0ZWRDb3VudCA9IDBcbiAgICBtaWxlc3RvbmVEYXRhLmxlYWZOb2Rlcy5mb3JFYWNoKChsZWFmSWQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgbGVhZkRhdGEgPSB0aGlzLmhpZXJhcmNoeU1hcERhdGFbbGVhZklkXVxuICAgICAgaWYgKGxlYWZEYXRhICYmIGxlYWZEYXRhLmNvbXBsZXRpb25TdGF0dXMgPT09IDIpIHtcbiAgICAgICAgY29tcGxldGVkQ291bnQrK1xuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGNvbXBsZXRlZENvdW50XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVubG9jayBjcml0ZXJpYSBtZXNzYWdlIGZvciBsb2NrZWQgbWlsZXN0b25lc1xuICAgKi9cbiAgZ2V0TWlsZXN0b25lVW5sb2NrTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb250ZW50IHx8ICF0aGlzLmhpZXJhcmNoeU1hcERhdGEpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGNvbnN0IG1pbGVzdG9uZURhdGEgPSB0aGlzLmhpZXJhcmNoeU1hcERhdGFbdGhpcy5jb250ZW50LmlkZW50aWZpZXJdXG4gICAgaWYgKCFtaWxlc3RvbmVEYXRhKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBoYXNobWFwIGhhcyBwcmUtY29tcHV0ZWQgdW5sb2NrIG1lc3NhZ2VcbiAgICBpZiAobWlsZXN0b25lRGF0YS51bmxvY2tNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gbWlsZXN0b25lRGF0YS51bmxvY2tNZXNzYWdlXG4gICAgfVxuXG4gICAgY29uc3QgbWlsZXN0b25lSW5kZXggPSBtaWxlc3RvbmVEYXRhLm1pbGVzdG9uZUluZGV4XG5cbiAgICAvLyBNaWxlc3RvbmUgMSByZXF1aXJlcyBwcmUtYXNzZXNzbWVudCBjb21wbGV0aW9uXG4gICAgaWYgKG1pbGVzdG9uZUluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gJ0NvbXBsZXRlIHRoZSBwcmVsaW1pbmFyeSBhc3Nlc3NtZW50IHRvIHVubG9jayB0aGlzIG1pbGVzdG9uZSdcbiAgICB9XG5cbiAgICAvLyBPdGhlciBtaWxlc3RvbmVzIHJlcXVpcmUgcHJldmlvdXMgbWlsZXN0b25lIGNvbXBsZXRpb25cbiAgICByZXR1cm4gYENvbXBsZXRlIGFsbCBtYW5kYXRvcnkgY29udGVudCBhbmQgYXNzZXNzbWVudCBpbiBNaWxlc3RvbmUgJHttaWxlc3RvbmVJbmRleH0gdG8gdW5sb2NrIHRoaXMgbWlsZXN0b25lYFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsb2NrIG1lc3NhZ2UgZm9yIGNvbnRlbnQgaW5zaWRlIGxvY2tlZCBtaWxlc3RvbmVzXG4gICAqL1xuICBnZXRQYXJlbnRNaWxlc3RvbmVMb2NrTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIHJldHVybiAnVGhpcyBjb250ZW50IGlzIGxvY2tlZC4gQ29tcGxldGUgcHJldmlvdXMgbWlsZXN0b25lIHRvIHZpZXcgdGhpcyBjb250ZW50LidcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbG9jayBtZXNzYWdlIGZvciBtaWxlc3RvbmUgYXNzZXNzbWVudHNcbiAgICovXG4gIGdldEFzc2Vzc21lbnRMb2NrTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb250ZW50IHx8ICF0aGlzLmhpZXJhcmNoeU1hcERhdGEpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIGNvbnN0IGhhc2hEYXRhID0gdGhpcy5oaWVyYXJjaHlNYXBEYXRhW3RoaXMuY29udGVudC5pZGVudGlmaWVyXVxuICAgIFxuICAgIC8vIENoZWNrIGlmIGhhc2htYXAgaGFzIHByZS1jb21wdXRlZCBhc3Nlc3NtZW50IGxvY2sgbWVzc2FnZVxuICAgIGlmIChoYXNoRGF0YSAmJiBoYXNoRGF0YS5hc3Nlc3NtZW50TG9ja01lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBoYXNoRGF0YS5hc3Nlc3NtZW50TG9ja01lc3NhZ2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc01pbGVzdG9uZUFzc2Vzc21lbnRMb2NrZWQpIHtcbiAgICAgIHJldHVybiAnVGhpcyBjb250ZW50IGlzIGxvY2tlZC4gQ29tcGxldGUgYWxsIG1hbmRhdG9yeSBpdGVtcyB0byB1bmxvY2sgdGhlIGFzc2Vzc21lbnQuJ1xuICAgIH1cblxuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgc2hvdWxkU2hvd0Rvd25sb2FkQnV0dG9uKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGNvbnRlbnQgaGFzIGFuIGFydGlmYWN0IFVSTCAoZG93bmxvYWRhYmxlIHJlc291cmNlKVxuICAgIGlmICghY29udGVudC5hcnRpZmFjdFVybCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYmFzZSBjb250ZW50IHJlc291cmNlIGNhdGVnb3J5IGluY2x1ZGVzIFwiQ2FzZSBTdHVkeVwiXG4gICAgaWYgKCF0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5IHx8XG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuY291cnNlQ2F0ZWdvcnkgIT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ0FTRV9TVFVEWSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy9mb3IgcHVibGljIHNjZW5hcmlvIGNoZWNrIGlmIGl0cyBwbGF5ZXIgcGxhZ2UgdGhlbiBvbmx5IGVuYWJsZSBkb3dubG9hZFxuICAgIGlmICh0aGlzLmZvclByZXZpZXcgJiYgIXdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvdmlld2VyLycpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBmb3IgbG9nZ2VkIGluIHVzZXIgY2hlY2sgaWYgdXNlciBlbnJvbGxlZCB0aGVuIG9ubHkgYWxsb3cgZG93bmxvYWRcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldyAmJiAhdGhpcy5pc0Vucm9sbGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgZG93bmxvYWRhYmxlIE1JTUUgdHlwZXNcbiAgICBjb25zdCBkb3dubG9hZGFibGVNaW1lVHlwZXMgPSBbXG4gICAgICBOc0NvbnRlbnQuRU1pbWVUeXBlcy5QREZcbiAgICBdXG5cbiAgICByZXR1cm4gZG93bmxvYWRhYmxlTWltZVR5cGVzLmluY2x1ZGVzKGNvbnRlbnQubWltZVR5cGUpXG4gIH1cblxuICBkb3dubG9hZENvbnRlbnQoY29udGVudDogTnNDb250ZW50LklDb250ZW50LCBldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfVxuICAgIGNvbnN0IHBhZ2VJZCA9IGBhcHAvdG9jL3BhZ2VJZC8ke2NvbnRlbnQuaWRlbnRpZmllcn1gXG4gICAgdGhpcy5yZXNvdXJjZURvd25sb2FkSGVscGVyU3ZjLmRvd25sb2FkUERGKGNvbnRlbnQsIHBhZ2VJZClcbiAgICBjb25zb2xlLmxvZygnY29udGVudCcsIGNvbnRlbnQpXG4gICAgY29uc29sZS5sb2coJ2Jhc2VDb250ZW50JywgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhKVxuICB9XG5cblxuXG4gIC8qKlxuICAgKiBWaWV3IG1pbGVzdG9uZSBhY2hpZXZlbWVudCAtIGNhbGxzIHRoZSBhY2hpZXZlbWVudCBBUEkgYW5kIHNob3dzIHRoZSByZXN1bHRcbiAgICovXG4gIHZpZXdNaWxlc3RvbmVBY2hpZXZlbWVudChldmVudD86IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbnRlbnQgfHwgIXRoaXMuYmF0Y2hJZCB8fCB0aGlzLmFjaGlldmVtZW50TG9hZGluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gR2V0IHVzZXIgSUQgZnJvbSBDb25maWd1cmF0aW9uc1NlcnZpY2VcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yz8udXNlclByb2ZpbGU/LnVzZXJJZFxuICAgIGlmICghdXNlcklkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdVc2VyIElEIG5vdCBmb3VuZCcpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IG1pbGVzdG9uZSBJRCAoZS5nLiwgXCJtMVwiLCBcIm0yXCIpIGZyb20gdGhlIGNvbnRlbnQgbmFtZSBvciBpbmRleFxuICAgIC8vIFRyeSB0byBnZXQgbWlsZXN0b25lIG51bWJlciBmcm9tIHRoZSBpbmRleCBvciBleHRyYWN0IGZyb20gY29udGVudFxuICAgIGxldCBtaWxlc3RvbmVJZCA9ICdtJyArICh0aGlzLmluZGV4IC0gMSkgLy8gaW5kZXggaXMgdHlwaWNhbGx5IDEtYmFzZWQsIG1pbGVzdG9uZXMgYXJlIDAtYmFzZWRcblxuICAgIC8vIElmIGNvbnRlbnQgbmFtZSBjb250YWlucyBtaWxlc3RvbmUgbnVtYmVyLCBleHRyYWN0IGl0XG4gICAgaWYgKHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRoaXMuY29udGVudC5uYW1lLm1hdGNoKC9taWxlc3RvbmVcXHMqKFxcZCspL2kpXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgbWlsZXN0b25lSWQgPSAnbScgKyBtYXRjaFsxXVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvdXJzZUlkID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8IHRoaXMucm9vdElkXG5cbiAgICB0aGlzLmFjaGlldmVtZW50TG9hZGluZyA9IHRydWVcblxuICAgIHRoaXMuYXBwVG9jU3ZjLmdlbmVyYXRlTWlsZXN0b25lQWNoaWV2ZW1lbnQodXNlcklkLCBjb3Vyc2VJZCwgdGhpcy5iYXRjaElkLCBtaWxlc3RvbmVJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYWNoaWV2ZW1lbnRMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgY29uc29sZS5sb2coJ0FjaGlldmVtZW50IGdlbmVyYXRlZCBzdWNjZXNzZnVsbHk6JywgcmVzcG9uc2UpXG4gICAgICAgIC8vIFNob3cgYWNoaWV2ZW1lbnQgZGlhbG9nIG9yIGhhbmRsZSByZXNwb25zZVxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgICAgLy8gT3BlbiBhIGRpYWxvZyB0byBzaG93IHRoZSBhY2hpZXZlbWVudFxuICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIHdpZHRoOiAnMTMwMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgY2V0OiByZXNwb25zZS5yZXN1bHQucHJpbnRVcmkgfHwgcmVzcG9uc2UucmVzdWx0LnN2Z0RhdGEsXG4gICAgICAgICAgICAgIGNlcnRJZDogcmVzcG9uc2UucmVzdWx0LmlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIGlzQWNoaWV2ZW1lbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFjaGlldmVtZW50TG9hZGluZyA9IGZhbHNlXG4gICAgICAgIC8vIFNob3cgZXJyb3IgbWVzc2FnZSBpbiBzbmFja2JhclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvcj8uZXJyb3I/LnJlc3VsdD8ubWVzc2FnZSB8fCBlcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGdlbmVyYXRlIGFjaGlldmVtZW50J1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3JNZXNzYWdlLCAnQ2xvc2UnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDUwMDAsXG4gICAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uOiAnY2VudGVyJyxcbiAgICAgICAgICB2ZXJ0aWNhbFBvc2l0aW9uOiAnYm90dG9tJyxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ2Vycm9yLXNuYWNrYmFyJ11cbiAgICAgICAgfSlcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBhY2hpZXZlbWVudDonLCBlcnJvcilcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50ICYmICFpc1ByZUFzc2Vzc21lbnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb2xsZWN0aW9uICYmICFpc01vZHVsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbGxlY3Rpb25UZW1wbGF0ZVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb2xsZWN0aW9uICYmIGlzTW9kdWxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5tb2R1bGVSZXNvdXJzZUNvdW50XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbGxlY3Rpb25UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiAqbmdJZj1cImlzUmVzb3VyY2VcIiBjbGFzcz1cInJlc291cmNlLWNvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInBhdGhTZXQ/Lmhhcyhjb250ZW50Py5pZGVudGlmaWVyKSAmJiBpc0Vucm9sbGVkID8gJ2NvbnRlbnQtYWN0aXZlLXJlc291cmNlJzogJ2NvbnRlbnQtbm90LWFjdGl2ZS1yZXNvdXJjZSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlc291cmNlIGZsZXggIHNtOmZsZXgtcm93IGZsZXgtc3RhcnQgd2lkdGgtZXhwYW5kIHctMTAwIHNtOnByLTQgc206dy1hdXRvXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlUmVzb3VyY2UnOiBwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcikgJiYgaXNFbnJvbGxlZH1cIj5cbiAgICAgICAgICAgIDwhLS0gTG9jayBtZXNzYWdlIGZvciBjdXJhdGVkIHByb2dyYW1zIG9ubHkgKHNob3duIGFib3ZlIGNvbnRlbnQpIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgJiYgY2hlY2tGb3JDdXJhdGVkUHJvZ3JhbSAmJlxuICAgICAgICAgICAgIWlzQ29udGVudFVubG9ja2VkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbG9ja2luZyBmbGV4IHctZnVsbCBmbGV4LW1pZGRsZSBtYi0yIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImxvY2staWNvblwiPmxvY2s8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvY2stbWVzc2FnZSBtYXQtYm9keS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBUaGUgY29udGVudCBpcyBsb2NrZWQuIENvbXBsZXRlIHByb2dyYW0gb3IgYWxsIGNvdXJzZXMgdG8gdmlldyB0aGlzIG1vZHVsZVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UICYmIGNoZWNrRm9yQ3VyYXRlZFByb2dyYW0gJiZcbiAgICAgICAgICAgIGlzQ29udGVudFVubG9ja2VkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtbG9ja2luZyBmbGV4IHctZnVsbCBmbGV4LW1pZGRsZSBtYi0yIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInVubG9jay1pY29uXCI+bG9ja19vcGVuX3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1bmxvY2stbWVzc2FnZSBtYXQtYm9keS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNvbnRlbnQgaXMgdW5sb2NrZWQuXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLXN0YXJ0IGp1c3RpZnktc3RhcnQgc206anVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gKm5nSWY9XCIhZm9yUHJldmlldyAmJiBjb250ZW50Py5hcnRpZmFjdFVybCAmJiAhaXNYU21hbGwgJiYgaXNBbGxvd2VkICYmIGlzRW5hYmxlZFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYnV0dG9uTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0aWNhbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Vucm9sbGVkICAmJiAhaXNNaWxlc3RvbmVMb2NrZWQgJiYgIWlzUGFyZW50TWlsZXN0b25lTG9ja2VkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZvclByZXZpZXcgJiYgIGNvbnRlbnQ/LmlkZW50aWZpZXIgJiYgZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcikgOyBlbHNlIGVsc2VCbG9ja1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29tcGxldGlvblN0YXR1cyhjb250ZW50Py5pZGVudGlmaWVyKSA9PSAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29tcGxldGVkLWljb25cIiBbY29sb3JdPVwiYmx1ZVwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29tcGxldGlvblN0YXR1cyhjb250ZW50Py5pZGVudGlmaWVyKSA8IDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGVyY2VudF09XCJnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKVwiIFtyYWRpdXNdPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VXaWR0aF09XCIyXCIgW2lubmVyU3Ryb2tlV2lkdGhdPVwiMlwiIFtzcGFjZV09XCItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZUNvbG9yXT1cInByb2dyZXNzQ29sb3IyKClcIiBbaW5uZXJTdHJva2VDb2xvcl09XCIncmdiYSgwLCAwLCAwLCAwLjE2KSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5pbWF0aW9uXT1cInRydWVcIiBbYW5pbWF0aW9uRHVyYXRpb25dPVwiMjUwXCIgW3Nob3dUaXRsZV09XCJmYWxzZVwiIFtzaG93VW5pdHNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCIgW2Nsb2Nrd2lzZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRPcGFjaXR5XT1cIjBcIiBbYmFja2dyb3VuZEdyYWRpZW50XT1cImZhbHNlXCIgW2JhY2tncm91bmRTdHJva2VXaWR0aF09XCIzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkluIHByb2dyZXNzXCIgW3Nob3daZXJvT3V0ZXJTdHJva2VdPWZhbHNlIFtiYWNrZ3JvdW5kUGFkZGluZ109XCItOVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGFydEZyb21aZXJvXT1cImZhbHNlXCIgW2JhY2tncm91bmRQYWRkaW5nXT1cIjBcIiBbaW1hZ2VIZWlnaHRdPVwiMjJcIiBbaW1hZ2VXaWR0aF09XCIyMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QmFja2dyb3VuZF09XCJmYWxzZVwiIFtvdXRlclN0cm9rZUxpbmVjYXBdPVwiJ2J1dHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaXJjbGUtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8d3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3MgKm5nSWY9XCJjb250ZW50Py5pZGVudGlmaWVyXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb250ZW50SWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiIGNsYXNzPVwicHJvZ3Jlc3MtYmFyLXRoaW5cIiBbcHJvZ3Jlc3NdPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbcHJvZ3Jlc3NUeXBlXT1cIidwZXJjZW50YWdlJ1wiPlxuICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZS1wcm9ncmVzcyBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHByb2dyZXNzXCIgW3BlcmNlbnRdPVwiMFwiIFtyYWRpdXNdPVwiMTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZVdpZHRoXT1cIjJcIiBbaW5uZXJTdHJva2VXaWR0aF09XCIyXCIgW291dGVyU3Ryb2tlQ29sb3JdPVwiJyM4MDgwODAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJTdHJva2VDb2xvcl09XCInIzgwODA4MCdcIiBbYW5pbWF0aW9uXT1cInRydWVcIiBbc3BhY2VdPVwiLTJcIiBbc2hvd1VuaXRzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5pbWF0aW9uRHVyYXRpb25dPVwiMjUwXCIgW3Nob3dUaXRsZV09XCJmYWxzZVwiIFtiYWNrZ3JvdW5kUGFkZGluZ109XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZFBhZGRpbmddPVwiLTlcIiBbb3V0ZXJTdHJva2VMaW5lY2FwXT1cIididXR0J1wiIG1hdFRvb2x0aXA9XCJOb3Qgc3RhcnRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dTdWJ0aXRsZV09XCJmYWxzZVwiIFtzaG93SW5uZXJTdHJva2VdPVwidHJ1ZVwiIFtjbG9ja3dpc2VdPVwidHJ1ZVwiIFtpbWFnZUhlaWdodF09XCIyMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlV2lkdGhdPVwiMjJcIiBbc2hvd0JhY2tncm91bmRdPVwiZmFsc2VcIj48L2NpcmNsZS1wcm9ncmVzcz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHA+bm8gZGF0YTwvcD4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gZGVhY3RpdmF0ZWQgYXMgcGVyIE5JQyBDRU8gcmVxdWlyZW1lbnQgdG8gYWNjZXNzIGNvdXJzZSB3dGhvdXQgbG9naW4gLS0+XG4gICAgICAgICAgICA8IS0tIEZvciBsb2NrZWQgYXNzZXNzbWVudHM6IHNob3cgY29udGVudCBidXQgbWFrZSBpdCBub24tY2xpY2thYmxlIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndpZHRoLWV4cGFuZFwiICpuZ0lmPVwiaXNNaWxlc3RvbmVBc3Nlc3NtZW50TG9ja2VkICYmIGlzRW5yb2xsZWQ7IGVsc2UgY2xpY2thYmxlQ29udGVudFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtbC0zJzogaXNFbnJvbGxlZH1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZSBvcGFjaXR5LTYwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cInRleHQtZ3JheS01MDBcIj5sb2NrPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUgdGV4dC10cnVuY2F0ZSBtYXQtYm9keS0yIGZsZXgtYXV0byBmb250LWJvbGQgbm9kdHJhbnNsYXRlIHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY29udGVudD8ubmFtZSB8IHRydW5jYXRlOjUwIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRlbnQtdHlwZSBvcHRpb25hbC1zcGFuIG5vZHRyYW5zbGF0ZVwiICpuZ0lmPVwiY29udGVudD8ub3B0aW9uYWxSZWFkaW5nXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxheWVyYnJpZWYub3B0aW9uYWwnIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBmb3IgZGVmYXVsdCBncmV5IGljb25zIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXBhdGhTZXQ/Lmhhcyhjb250ZW50Py5pZGVudGlmaWVyKSB8fCAhaXNFbnJvbGxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc2ljb25zIHdzLW1hdC1ibGFjazYwLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L3ZpZGVvLnN2Z1wiIGFsdD1cIlZpZGVvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICd2aWRlby9tcDQnIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndmlkZW8veC15b3V0dWJlJyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/Lm1pbWVUeXBlID09PSdhcHBsaWNhdGlvbi94LW1wZWdVUkwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9hdWRpby5zdmdcIiBhbHQ9XCJBdWRpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIiAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXVkaW8vbXBlZydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L3BkZi5zdmdcIiBhbHQ9XCJQREZcIiBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L2xpbmsuc3ZnXCIgYWx0PVwiSW50ZXJhY3RpdmVDb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmh0bWwtYXJjaGl2ZScgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICd0ZXh0L3gtdXJsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvYXNzZXNzbWVudC5zdmdcIiBhbHQ9XCJBc3Nlc3NtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3F1aXonIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLnN1bmJpcmQucXVlc3Rpb25zZXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9pbWFnZS5zdmdcIiBhbHQ9XCJJbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnaW1hZ2UvcG5nJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2ltYWdlL2pwZWcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9jb250ZW50X2NvcHkuc3ZnXCIgY2xhc3M9XCJjb250ZW50aWNvblwiIGFsdD1cIkNvdXJzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuY29udGVudC1jb2xsZWN0aW9uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3N1cnZleSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L21vZHVsZS5zdmdcIiBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwib2ZmbGluZSBzZXNzaW9uc1wiICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29mZmxpbmUnXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT01QX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXNvdXJjZUR1cmF0aW9uIHdzLW1hdC1ibGFjazYwLXRleHQgbm9kdHJhbnNsYXRlXCI+e3sgY29udGVudD8ubWF4UXVlc3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSB7eyAncGxheWVyYnJpZWYucXVlc3Rpb25zJyB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc291cmNlRHVyYXRpb24gd3MtbWF0LWJsYWNrNjAtdGV4dCBub2R0cmFuc2xhdGVcIj57eyAoY29udGVudD8uZHVyYXRpb258fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5TWFwRGF0YVtjb250ZW50Py5pZGVudGlmaWVyXT8uZXhwZWN0ZWREdXJhdGlvbiB8fCAwKXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVEdXJhdGlvblRyYW5zZm9ybTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdobXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8IS0tIExvY2sgbWVzc2FnZSBkaXNwbGF5ZWQgQkVMT1cgYXNzZXNzbWVudCBkZXRhaWxzIHdoZW4gbG9ja2VkIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWxvY2tpbmcgZmxleCB3LWZ1bGwgZmxleC1taWRkbGUgbXQtMiBnYXAtMiBweC0yIHB5LTEgYmctb3JhbmdlLTUwIGJvcmRlci1sLTQgYm9yZGVyLW9yYW5nZS00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibG9jay1pY29uIHRleHQtb3JhbmdlLTYwMFwiIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4OyB3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4O1wiPmxvY2s8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvY2stbWVzc2FnZSBtYXQtYm9keS0yIHRleHQtb3JhbmdlLTgwMFwiIHN0eWxlPVwiZm9udC1zaXplOiAxM3B4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb250ZW50IGlzIGxvY2tlZC4gQ29tcGxldGUgYWxsIG1hbmRhdG9yeSBpdGVtcyB0byB1bmxvY2sgdGhlIGFzc2Vzc21lbnQuXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8IS0tIENsaWNrYWJsZSBjb250ZW50IHRlbXBsYXRlICh3aGVuIE5PVCBsb2NrZWQpIC0tPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjbGlja2FibGVDb250ZW50PlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwid2lkdGgtZXhwYW5kXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIihmb3JQcmV2aWV3IHx8ICFpc0VuYWJsZWQgfHwgIWlzRW5yb2xsZWQgfHwgIWlzQmF0Y2hJblByb2dlc3MgfHwgIWlzQ29udGVudFVubG9ja2VkIHx8IGlzUGFyZW50TWlsZXN0b25lTG9ja2VkKSA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtbC0zJzogaXNFbnJvbGxlZH1cIlxuICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCIoaXNBbGxvd2VkICYmICFmb3JQcmV2aWV3ICYmIGlzRW5hYmxlZCAmJiAhaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQpID8gcmVzb3VyY2VMaW5rLnVybCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKGlzQWxsb3dlZCAmJiAhZm9yUHJldmlldyAmJiBpc0VuYWJsZWQgJiYgIWlzUGFyZW50TWlsZXN0b25lTG9ja2VkKSAgPyByZXNvdXJjZUxpbmsucXVlcnlQYXJhbXMgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQgPyAnVGhpcyBjb250ZW50IGlzIGxvY2tlZC4gQ29tcGxldGUgcHJldmlvdXMgbWlsZXN0b25lIHRvIHZpZXcgdGhpcyBjb250ZW50LicgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydyZXNvdXJjZS1hY3RpdmUnOiBwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcikgJiYgaXNFbnJvbGxlZH1cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtdHJ1bmNhdGUgXCIgW25nQ2xhc3NdPVwieydjdXJzb3ItcG9pbnRlcic6ICFpc0VuYWJsZWQgJiYgaXNFbnJvbGxlZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbnRlbnQudmlld0NoaWxkcmVuID0gIWNvbnRlbnQudmlld0NoaWxkcmVuOyByYWlzZVRlbGVtZXRyeSgpOyBjaGFuZ2VSZXNvdXJjZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUgdGV4dC10cnVuY2F0ZSBtYXQtYm9keS0yIGZsZXgtYXV0byBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd0ZXh0LWFjdGl2ZSc6IHBhdGhTZXQ/Lmhhcyhjb250ZW50Py5pZGVudGlmaWVyKSAmJiBpc0Vucm9sbGVkfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb250ZW50Py5uYW1lIHwgdHJ1bmNhdGU6NTAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250ZW50LXR5cGUgb3B0aW9uYWwtc3BhbiBub2R0cmFuc2xhdGVcIiAqbmdJZj1cImNvbnRlbnQ/Lm9wdGlvbmFsUmVhZGluZ1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF5ZXJicmllZi5vcHRpb25hbCcgfCB0cmFuc2xhdGUgfCB0aXRsZWNhc2V9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZm9yIGRlZmF1bHQgZ3JleSBpY29ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpIHx8ICFpc0Vucm9sbGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc2ljb25zIHdzLW1hdC1ibGFjazYwLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS92aWRlby5zdmdcIiBhbHQ9XCJWaWRlb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCIgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ3ZpZGVvL21wNCcgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICd2aWRlby94LXlvdXR1YmUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/Lm1pbWVUeXBlID09PSdhcHBsaWNhdGlvbi94LW1wZWdVUkwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvYXVkaW8uc3ZnXCIgYWx0PVwiQXVkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhdWRpby9tcGVnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L3BkZi5zdmdcIiBhbHQ9XCJQREZcIiBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvbGluay5zdmdcIiBhbHQ9XCJJbnRlcmFjdGl2ZUNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLmVrc3RlcC5odG1sLWFyY2hpdmUnIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndGV4dC94LXVybCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9hc3Nlc3NtZW50LnN2Z1wiIGFsdD1cIkFzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9xdWl6JyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5zdW5iaXJkLnF1ZXN0aW9uc2V0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L2ltYWdlLnN2Z1wiIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2ltYWdlL3BuZycgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICdpbWFnZS9qcGVnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L2NvbnRlbnRfY29weS5zdmdcIiBjbGFzcz1cImNvbnRlbnRpY29uXCIgYWx0PVwiQ291cnNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuY29udGVudC1jb2xsZWN0aW9uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3N1cnZleSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9tb2R1bGUuc3ZnXCIgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJvZmZsaW5lIHNlc3Npb25zXCIgKm5nSWY9XCJjb250ZW50Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vb2ZmbGluZSdcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVzb3VyY2VEdXJhdGlvbiB3cy1tYXQtYmxhY2s2MC10ZXh0IG5vZHRyYW5zbGF0ZVwiPnt7IGNvbnRlbnQ/Lm1heFF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19IHt7ICdwbGF5ZXJicmllZi5xdWVzdGlvbnMnIHwgdHJhbnNsYXRlIHwgdGl0bGVjYXNlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT01QX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVzb3VyY2VEdXJhdGlvbiB3cy1tYXQtYmxhY2s2MC10ZXh0IG5vZHRyYW5zbGF0ZVwiPnt7IChjb250ZW50Py5kdXJhdGlvbnx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5TWFwRGF0YVtjb250ZW50Py5pZGVudGlmaWVyXT8uZXhwZWN0ZWREdXJhdGlvbiB8fCAwKXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlRHVyYXRpb25UcmFuc2Zvcm06XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2htcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIGZvciB3aGl0ZSBpY29ucyB3aGVuIGNvbnRlbnQgaGlnaGxpZ2h0ZWQgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcikgJiYgaXNFbnJvbGxlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc2ljb25zIHdzLW1hdC13aGl0ZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvd2hpdGUvdmlkZW8uc3ZnXCIgYWx0PVwiVmlkZW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCIgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ3ZpZGVvL21wNCcgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICd2aWRlby94LXlvdXR1YmUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudD8ubWltZVR5cGUgPT09J2FwcGxpY2F0aW9uL3gtbXBlZ1VSTCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9hdWRpby5zdmdcIiBhbHQ9XCJBdWRpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIiAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXVkaW8vbXBlZydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9wZGYuc3ZnXCIgYWx0PVwiUERGXCIgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvd2hpdGUvbGluay5zdmdcIiBhbHQ9XCJJbnRlcmFjdGl2ZUNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuaHRtbC1hcmNoaXZlJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ3RleHQveC11cmwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvd2hpdGUvYXNzZXNzbWVudC5zdmdcIiBhbHQ9XCJBc3Nlc3NtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3F1aXonIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLnN1bmJpcmQucXVlc3Rpb25zZXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9pbWFnZS5zdmdcIiBhbHQ9XCJJbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnaW1hZ2UvcG5nJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2ltYWdlL2pwZWcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvd2hpdGUvY29udGVudF9jb3B5LnN2Z1wiIGNsYXNzPVwiY29udGVudGljb25cIiBhbHQ9XCJDb3Vyc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmNvbnRlbnQtY29sbGVjdGlvbicgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9zdXJ2ZXknXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvd2hpdGUvbW9kdWxlLnN2Z1wiIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJvZmZsaW5lIHNlc3Npb25zXCIgKm5nSWY9XCJjb250ZW50Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vb2ZmbGluZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT01QX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXNvdXJjZUR1cmF0aW9uIHdzLW1hdC1ibGFjazYwLXRleHQgbm9kdHJhbnNsYXRlXCI+e3sgY29udGVudD8ubWF4UXVlc3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSB7eyAncGxheWVyYnJpZWYucXVlc3Rpb25zJyB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc291cmNlRHVyYXRpb24gd3MtbWF0LWJsYWNrNjAtdGV4dCBub2R0cmFuc2xhdGVcIj57eyAoY29udGVudD8uZHVyYXRpb258fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5TWFwRGF0YVtjb250ZW50Py5pZGVudGlmaWVyXT8uZXhwZWN0ZWREdXJhdGlvbiB8fCAwKXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVEdXJhdGlvblRyYW5zZm9ybTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdobXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIERvd25sb2FkIGJ1dHRvbiBmb3IgcGRmIHJlc291cmNlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3VsZFNob3dEb3dubG9hZEJ1dHRvbihjb250ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLWJ0biBtYXQtYm9keS0yIG10LTIgc206bXQtMVwiIChjbGljayk9XCJkb3dubG9hZENvbnRlbnQoY29udGVudCwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcil9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkb3dubG9hZC1saW5rIGZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiXCI+RG93bmxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPG1hdC1tZW51ICNidXR0b25NZW51PVwibWF0TWVudVwiPlxuICAgIDxhIG1hdC1tZW51LWl0ZW0gW3JvdXRlckxpbmtdPVwiJy4uLycgKyBjb250ZW50Py5pZGVudGlmaWVyICsgJy9vdmVydmlldydcIiBbcXVlcnlQYXJhbXNdPVwiY29udGV4dFBhdGhcIlxuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1taWRkbGVcIj5cbiAgICAgICAgPG1hdC1pY29uPnRvYzwvbWF0LWljb24+XG4gICAgICAgIDxoMyBjbGFzcz1cIm1hcmdpbi1yZW1vdmUgbm9kdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgPC9oMz5cbiAgICA8L2E+XG48L21hdC1tZW51PlxuXG48bmctdGVtcGxhdGUgI2NvbGxlY3Rpb25UZW1wbGF0ZT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDb2xsZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xsZWN0aW9uLXdyYXBwZXIgcC00IGZsZXggZmxleC1jb2wgcG9zaXRpb24tcmVsYXRpdmVcIiBbbmdDbGFzc109XCJ7J29wZW4nOiBjaGVjayhjb250ZW50KSxcbiAgICAgICAgICAgICdjbG9zZSc6ICFjb250ZW50LnZpZXdDaGlsZHJlbixcbiAgICAgICAgICAgICdjb3Vyc2UnOiFpc01vZHVsZSwgJ21vZHVsZSc6IGlzTW9kdWxlLFxuICAgICAgICAgICAgJ2NvbnRlbnQtYWN0aXZlJzogcGF0aFNldD8uaGFzKGNvbnRlbnQuaWRlbnRpZmllcikgJiYgaXNFbnJvbGxlZH1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbGxlY3Rpb24gdy1hdXRvIHNtOnctMTAwIHBhZGRpbmctcmlnaHQteGxcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxpbWcgY2xhc3M9XCJjYXJkLXRodW1ibmFpbCB3cy1tYXQtcHJpbWFyeS1saXRlLWJhY2tncm91bmRcIiBbc3JjXT1cImNvbnRlbnQ/LmFwcEljb25cIiBhbHQ9XCJUaHVtYm5haWxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNvbnRlbnQudmlld0NoaWxkcmVuID0gIWNvbnRlbnQudmlld0NoaWxkcmVuXCIgW3dzVXRpbHNEZWZhdWx0VGh1bWJuYWlsXT1cImRlZmF1bHRUaHVtYm5haWxcIiAvPiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LXdyYXAgZmxleC1iZXR3ZWVuIHdpZHRoLWV4cGFuZCBwci0wIHctMTAwIFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiIFtuZ0NsYXNzXT1cInsnY3Vyc29yLXBvaW50ZXInOiAhaXNFbmFibGVkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29udGVudC52aWV3Q2hpbGRyZW4gPSAhY29udGVudC52aWV3Q2hpbGRyZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtYi0xIHNtOmZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTW9kdWxlICYmIGlzRW5yb2xsZWQgJiYgIWlzTWlsZXN0b25lTG9ja2VkICYmICFpc1BhcmVudE1pbGVzdG9uZUxvY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFmb3JQcmV2aWV3ICYmIGNvbnRlbnQ/LmlkZW50aWZpZXIgJiYgZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcikgOyBlbHNlIGVsc2VCbG9ja1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29tcGxldGlvblN0YXR1cyhjb250ZW50LmlkZW50aWZpZXIpID09IDJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGVkIG1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbXBsZXRlZC1pY29uXCIgW2NvbG9yXT1cImJsdWVcIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENvbXBsZXRpb25TdGF0dXMoY29udGVudD8uaWRlbnRpZmllcikgPCAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZS1wcm9ncmVzcyBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHByb2dyZXNzIG1yLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGVyY2VudF09XCJnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKVwiIFtyYWRpdXNdPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VXaWR0aF09XCIyXCIgW2lubmVyU3Ryb2tlV2lkdGhdPVwiMlwiIFtzcGFjZV09XCItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZUNvbG9yXT1cInByb2dyZXNzQ29sb3IyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJTdHJva2VDb2xvcl09XCIncmdiYSgwLCAwLCAwLCAwLjE2KSdcIiBbYW5pbWF0aW9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYW5pbWF0aW9uRHVyYXRpb25dPVwiMjUwXCIgW3Nob3dUaXRsZV09XCJmYWxzZVwiIFtzaG93VW5pdHNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCIgW2Nsb2Nrd2lzZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRPcGFjaXR5XT1cIjBcIiBbYmFja2dyb3VuZEdyYWRpZW50XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRTdHJva2VXaWR0aF09XCIzXCIgbWF0VG9vbHRpcD1cIkluIHByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3daZXJvT3V0ZXJTdHJva2VdPWZhbHNlIFtiYWNrZ3JvdW5kUGFkZGluZ109XCItN1wiIFtzdGFydEZyb21aZXJvXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRQYWRkaW5nXT1cIjBcIiBbaW1hZ2VIZWlnaHRdPVwiMThcIiBbaW1hZ2VXaWR0aF09XCIxOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QmFja2dyb3VuZF09XCJmYWxzZVwiIFtvdXRlclN0cm9rZUxpbmVjYXBdPVwiJ2J1dHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaXJjbGUtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZS1wcm9ncmVzcyBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHByb2dyZXNzIG1yLTFcIiBbcGVyY2VudF09XCIwXCIgW3JhZGl1c109XCIxMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW291dGVyU3Ryb2tlV2lkdGhdPVwiMlwiIFtpbm5lclN0cm9rZVdpZHRoXT1cIjJcIiBbb3V0ZXJTdHJva2VDb2xvcl09XCInIzgwODA4MCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lclN0cm9rZUNvbG9yXT1cIicjODA4MDgwJ1wiIFthbmltYXRpb25dPVwidHJ1ZVwiIFtzcGFjZV09XCItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dVbml0c109XCJmYWxzZVwiIFthbmltYXRpb25EdXJhdGlvbl09XCIyNTBcIiBbc2hvd1RpdGxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZFBhZGRpbmddPVwiMFwiIFtiYWNrZ3JvdW5kUGFkZGluZ109XCItOVwiIFtvdXRlclN0cm9rZUxpbmVjYXBdPVwiJ2J1dHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiTm90IHN0YXJ0ZWRcIiBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xvY2t3aXNlXT1cInRydWVcIiBbaW1hZ2VIZWlnaHRdPVwiMjJcIiBbaW1hZ2VXaWR0aF09XCIyMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dCYWNrZ3JvdW5kXT1cImZhbHNlXCI+PC9jaXJjbGUtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NvbGxlY3Rpb24tYWN0aXZlLWNsYXNzJzogcGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpICYmIGlzRW5yb2xsZWR9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImlzTWlsZXN0b25lTG9ja2VkXCIgc3JjPVwiYXNzZXRzL2ljb25zL2h1YnMvbG9jay5zdmdcIiBhbHQ9XCJMb2NrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxvY2staWNvbiBtci0yIG1hcmdpbi1ib3R0b20teHhzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtYXV0byBmbGV4IGZsZXgtY29sXCIgc3R5bGU9XCJtaW4td2lkdGg6IDA7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWFyZ2luLXJlbW92ZSB0ZXh0LXRydW5jYXRlIG1hdC1zdWJoZWFkaW5nLTEgZm9udC1ib2xkIG5vZHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3RleHQtYWN0aXZlJzogcGF0aFNldD8uaGFzKGNvbnRlbnQuaWRlbnRpZmllcikgJiYgaXNFbnJvbGxlZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7aXNNaWxlc3RvbmUgPyBpbmRleCAtMSA6IGluZGV4fX0uIDwvc3Bhbj57eyBjb250ZW50Py5uYW1lIHwgdHJ1bmNhdGU6NTAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiICpuZ0lmPVwiaXNNaWxlc3RvbmUgJiYgaXNNaWxlc3RvbmVMb2NrZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9ja2VkLXRleHRcIj5Mb2NrZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiICpuZ0lmPVwiY29udGVudD8uaXNNYW5kYXRvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWFuZGF0b3J5LXRleHQgbWF0LWNhcHRpb25cIj5NYW5kYXRvcnk8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0eXBlLWNvbnRhaW5lciByZXNvdXJjZSBtdC0yIHNtOm10LTBcIiAqbmdJZj1cImNvbnRlbnQ/LmNhdGVnb3J5ID09PSAnUmVzb3VyY2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTEgY3VzdG9tLWljb24gcm90YXRlLTkwXCI+Y2FsbF90b19hY3Rpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPlJlc291cmNlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0eXBlLWNvbnRhaW5lciBtb2R1bGUgbXQtMiBzbTptdC0wXCIgKm5nSWY9XCJjb250ZW50Py5jYXRlZ29yeSA9PT0gJ0NvbGxlY3Rpb24nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTEgY3VzdG9tLWljb24gcm90YXRlLTkwXCI+Y2FsbF90b19hY3Rpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPk1vZHVsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHlwZS1jb250YWluZXIgY291cnNlIG10LTIgc206bXQtMFwiICpuZ0lmPVwiY29udGVudD8uY2F0ZWdvcnkgPT09ICdDb3Vyc2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTEgY3VzdG9tLWljb24gcm90YXRlLTkwXCI+Y2FsbF90b19hY3Rpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPkNvdXJzZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNaWxlc3RvbmUgQmFkZ2UgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNNaWxlc3RvbmVcIiBjbGFzcz1cIm1pbGVzdG9uZS1iYWRnZSBtdC0yIG1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1pbGVzdG9uZS1iYWRnZS10ZXh0IG5vZHRyYW5zbGF0ZVwiPk1pbGVzdG9uZSB7e2luZGV4IC0gMX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE1pbGVzdG9uZSBEZXNjcmlwdGlvbiAoMyBsaW5lcyB3aXRoIGVsbGlwc2lzKSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiaXNNaWxlc3RvbmUgJiYgY29udGVudD8uZGVzY3JpcHRpb25cIiBjbGFzcz1cIm1pbGVzdG9uZS1kZXNjcmlwdGlvbiBtdC0yICBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb250ZW50Py5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTMgaXRlbXMtY2VudGVyIGNvbnRlbnQta2V5LXZhbHVlcyBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWlzTW9kdWxlXCIgYWx0PVwiY291cnNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aW1lLWljb24gaWNvbi1jb2xvclwiPnZpZGVvX2xpYnJhcnk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJpc01vZHVsZVwiIGFsdD1cIk1vZHVsZVwiIGNsYXNzPVwidGltZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvbW9kdWxlLnN2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG5vZHRyYW5zbGF0ZVwiPnt7IChoaWVyYXJjaHlNYXBEYXRhW2NvbnRlbnQ/LmlkZW50aWZpZXJdPy5kdXJhdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjApfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlRHVyYXRpb25UcmFuc2Zvcm06ICdobXMnIH19PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ubW9kdWxlQ291bnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmlvZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG5vZHRyYW5zbGF0ZVwiPnt7Y29udGVudD8ubW9kdWxlQ291bnR9fSB7e2NvbnRlbnQ/Lm1vZHVsZUNvdW50ID4gMT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVzJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmxlYWZOb2Rlc0NvdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBub2R0cmFuc2xhdGVcIj57e2NvbnRlbnQ/LmxlYWZOb2Rlc0NvdW50fX0ge3tjb250ZW50Py5sZWFmTm9kZXNDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjEgPyAnaXRlbXMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0ZW0nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNaWxlc3RvbmUgQ29tcGxldGlvbiBQcm9ncmVzcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc01pbGVzdG9uZSAmJiBpc0Vucm9sbGVkICYmICFpc01pbGVzdG9uZUxvY2tlZFwiIGNsYXNzPVwibWlsZXN0b25lLXByb2dyZXNzIG10LTIgIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWlsZXN0b25lLXByb2dyZXNzLXRleHQgbm9kdHJhbnNsYXRlXCI+e3tnZXRNaWxlc3RvbmVDb21wbGV0ZWRDb3VudCgpfX0gb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb250ZW50Py5sZWFmTm9kZXNDb3VudCB8fCAwfX0gY29tcGxldGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVmlldyBBY2hpZXZlbWVudCBCdXR0b24gZm9yIGNvbXBsZXRlZCBtaWxlc3RvbmVzIC0gT3V0c2lkZSBjbGlja2FibGUgYXJlYSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNNaWxlc3RvbmUgJiYgaXNFbnJvbGxlZCAmJiAoZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcikgPj0gMTAwIHx8IGdldENvbXBsZXRpb25TdGF0dXMoY29udGVudD8uaWRlbnRpZmllcikgPT09IDIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2aWV3LWFjaGlldmVtZW50LWNvbnRhaW5lciBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidmlldy1hY2hpZXZlbWVudC1idG5cIiBbZGlzYWJsZWRdPVwiYWNoaWV2ZW1lbnRMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3TWlsZXN0b25lQWNoaWV2ZW1lbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYWNoaWV2ZW1lbnRMb2FkaW5nXCI+VmlldyBBY2hpZXZlbWVudDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImFjaGlldmVtZW50TG9hZGluZ1wiIFtkaWFtZXRlcl09XCIxNlwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHJva2VXaWR0aF09XCIyXCIgY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJpbmxpbmUtc3Bpbm5lclwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVubG9jayBDcml0ZXJpYSBNZXNzYWdlIGZvciBMb2NrZWQgTWlsZXN0b25lcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc01pbGVzdG9uZSAmJiBpc0Vucm9sbGVkICYmIGlzTWlsZXN0b25lTG9ja2VkXCIgY2xhc3M9XCJtaWxlc3RvbmUtbG9ja2VkLW1lc3NhZ2UgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibG9ja2VkLWNyaXRlcmlhLXRleHQgbWF0LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0TWlsZXN0b25lVW5sb2NrTWVzc2FnZSgpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRm9yIGNvdXJzZSBwcm9ncmVzcyB0byBiZSBzaG93biAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRW5yb2xsZWQgJiYgIWlzTWlsZXN0b25lTG9ja2VkICYmICFpc1BhcmVudE1pbGVzdG9uZUxvY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZvclByZXZpZXcgJiYgY29udGVudD8uaWRlbnRpZmllciAmJiBnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKSAmJiBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29tcGxldGlvblN0YXR1cyhjb250ZW50Py5pZGVudGlmaWVyKSA9PSAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgbXItNCAgZmxleCBmbGV4LTEgZmxleC1jb2wgIHByb2dyZXNzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIHctZnVsbCBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtYm9keS0yIG5vZHRyYW5zbGF0ZSBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcil9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3MgW2NvbnRlbnRJZF09XCJjb250ZW50Py5wcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9ncmVzc109XCJnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCIgW2N1c3RvbUNsYXNzTmFtZV09XCIndmlld2VyLXByb2dyZXNzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibWwtNSBjZXJ0aWZpY2F0ZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2Rpc2FibGUtYnRuJzogZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmcgfHwgY29udGVudD8uaXNzdWVkQ2VydGlmaWNhdGVzSWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyAmJiBkb3dubG9hZENlcnRpZmljYXRlKGNvbnRlbnQ/Lmlzc3VlZENlcnRpZmljYXRlc0lkKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW1nIHNyYz1cImZ1c2lvbi1hc3NldHMvaW1hZ2VzL2NlcnRpZmljYXRlLWljby5zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+Q2VydGlmaWNhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTJcIj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXIgZmxleCBmbGV4LW1pZGRsZSBjZXJ0aWZpY2F0ZS1sb2FkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiIHN0cm9rZT1cIid3aGl0ZSdcIiBjbGFzcz1cIndoaXRlLXNwaW5uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaWFtZXRlcl09XCIxNlwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3NcIiBbcGVyY2VudF09XCIxMDBcIiBbcmFkaXVzXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZVdpZHRoXT1cIjNcIiBbaW5uZXJTdHJva2VXaWR0aF09XCIzXCIgW3NwYWNlXT1cIi0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZUNvbG9yXT1cInByb2dyZXNzQ29sb3IoKVwiIFtpbm5lclN0cm9rZUNvbG9yXT1cIidyZ2JhKDAsMCwwLC4xNiknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbmltYXRpb25dPVwidHJ1ZVwiIFthbmltYXRpb25EdXJhdGlvbl09XCIzMDBcIiBbc2hvd1RpdGxlXT1cImZhbHNlXCIgW3Nob3dVbml0c109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCIgW2Nsb2Nrd2lzZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kT3BhY2l0eV09XCIwXCIgW2JhY2tncm91bmRHcmFkaWVudF09XCJmYWxzZVwiIFtiYWNrZ3JvdW5kU3Ryb2tlV2lkdGhdPVwiM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1plcm9PdXRlclN0cm9rZV09ZmFsc2UgW2JhY2tncm91bmRQYWRkaW5nXT1cIi05XCIgW3N0YXJ0RnJvbVplcm9dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRQYWRkaW5nXT1cIjBcIiBbaW1hZ2VIZWlnaHRdPVwiMjRcIiBbaW1hZ2VXaWR0aF09XCIyNFwiIFtzaG93QmFja2dyb3VuZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VMaW5lY2FwXT1cIididXR0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NpcmNsZS1wcm9ncmVzcz4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENvbXBsZXRpb25TdGF0dXMoY29udGVudD8uaWRlbnRpZmllcikgPCAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgbXItNCAgZmxleCBmbGV4LTEgZmxleC1jb2wgIHByb2dyZXNzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktZW5kIHctZnVsbCB3cy1tYXQtYmxhY2stdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1ib2R5LTIgIHdzLW1hdC1ibGFjay10ZXh0IG5vZHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKX19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtY29udGVudC1wcm9ncmVzcyBbY29udGVudElkXT1cImNvbnRlbnQ/LnByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb2dyZXNzXT1cImdldENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQ/LmlkZW50aWZpZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb2dyZXNzVHlwZV09XCIncGVyY2VudGFnZSdcIiBbY3VzdG9tQ2xhc3NOYW1lXT1cIid2aWV3ZXItcHJvZ3Jlc3MnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/Lmlzc3VlZENlcnRpZmljYXRlc0lkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJtbC01IGNlcnRpZmljYXRlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1idG4nOiBkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyB8fCBjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiIWRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nICYmIGRvd25sb2FkQ2VydGlmaWNhdGUoY29udGVudD8uaXNzdWVkQ2VydGlmaWNhdGVzSWQpOyRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbWcgc3JjPVwiZnVzaW9uLWFzc2V0cy9pbWFnZXMvY2VydGlmaWNhdGUtaWNvLnN2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5DZXJ0aWZpY2F0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlciBmbGV4IGZsZXgtbWlkZGxlIGNlcnRpZmljYXRlLWxvYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCIgc3Ryb2tlPVwiJ3doaXRlJ1wiIGNsYXNzPVwid2hpdGUtc3Bpbm5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RpYW1ldGVyXT1cIjE2XCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWUtYWxsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdDaGlsZHJlbiA9ICFjb250ZW50LnZpZXdDaGlsZHJlbjsgZXhwYW5kQWN0aXZlID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VlLWFsbC1idG4gdGFiIGN1c3RvbS1jaGV2cm9uIGN1c3RvbWljb25cIiBtYXQtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFjb250ZW50LnZpZXdDaGlsZHJlbiAmJiAhaXNNb2R1bGVcIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb250ZW50LnZpZXdDaGlsZHJlbiAmJiAhaXNNb2R1bGVcIj5rZXlib2FyZF9hcnJvd191cDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWNvbnRlbnQudmlld0NoaWxkcmVuICYmIGlzTW9kdWxlXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb250ZW50LnZpZXdDaGlsZHJlbiAmJiBpc01vZHVsZVwiPnJlbW92ZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpbGQtd3JhcHBlciAgXCIgKm5nSWY9XCJjb250ZW50LnZpZXdDaGlsZHJlblwiIFtuZ0NsYXNzXT1cInsnb3Blbic6IGNvbnRlbnQudmlld0NoaWxkcmVuLFxuICAgICAgICAgICAgJ2Nsb3NlJzogIWNvbnRlbnQudmlld0NoaWxkcmVuLFxuICAgICAgICAgICAgJ2NvdXJzZSc6IWlzTW9kdWxlLFxuICAgICAgICAgICAgJ21vZHVsZSc6IGlzTW9kdWxlfVwiIFtAcGFuZWxJbk91dF0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpbGRyZW4tY29udGFpbmVyXCIgW25nQ2xhc3NdPVwieydtb2R1bGUnOiBpc01vZHVsZSwgJyc6ICFpc01vZHVsZX1cIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudC1jYXJkLXYyIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29tcG9uZW50TmFtZV09XCJjb21wb25lbnROYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRdPVwiY2hpbGRcIiBbZXhwYW5kQWxsXT1cImV4cGFuZEFsbFwiIFtyb290SWRdPVwicm9vdElkXCIgW2JhdGNoSWRdPVwiYmF0Y2hJZFwiXG4gICAgICAgICAgICAgICAgICAgIFtyb290Q29udGVudFR5cGVdPVwicm9vdENvbnRlbnRUeXBlXCIgW2luZGV4XT1cImorMVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIlxuICAgICAgICAgICAgICAgICAgICBbcGF0aFNldF09XCJwYXRoU2V0XCIgW2hpZXJhcmNoeU1hcERhdGFdPVwiaGllcmFyY2h5TWFwRGF0YVwiIFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgW21sQ291cnNlXT1cIm1sQ291cnNlXCIgW3BhcmVudE1pbGVzdG9uZUxvY2tlZF09XCJpc01pbGVzdG9uZUxvY2tlZCB8fCBpc1BhcmVudE1pbGVzdG9uZUxvY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjaGlsZCBvZiBjb250ZW50Py5jaGlsZHJlbjsgdHJhY2tCeTogY29udGVudFRyYWNrQnk7IGxldCBqPSBpbmRleDtsZXQgaXNGaXJzdCA9IGZpcnN0XCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtb2R1bGVDYXJkJzogY2hlY2tJc01vZHVsZShjaGlsZCksICdyZXNvdXJjZUNhcmQnOiAhY2hlY2tJc01vZHVsZShjaGlsZCksICdmaXJzdCc6IGlzRmlyc3R9XCI+XG4gICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc1ByZUFzc2Vzc21lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sbGVjdGlvbi13cmFwcGVyIHAtNCBmbGV4IGZsZXgtY29sIHBvc2l0aW9uLXJlbGF0aXZlXCIgW25nQ2xhc3NdPVwieydvcGVuJzogY2hlY2soY29udGVudCksXG4gICAgICAgICdjb3Vyc2UnOiFpc01vZHVsZSwgJ21vZHVsZSc6IGlzTW9kdWxlLFxuICAgICAgICAnY29udGVudC1hY3RpdmUnOiBwYXRoU2V0Py5oYXMoY29udGVudC5pZGVudGlmaWVyKX1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29sbGVjdGlvbiB3LWF1dG8gc206dy0xMDAgcGFkZGluZy1yaWdodC14bFwiPlxuICAgICAgICAgICAgPCEtLSA8aW1nIGNsYXNzPVwiY2FyZC10aHVtYm5haWwgd3MtbWF0LXByaW1hcnktbGl0ZS1iYWNrZ3JvdW5kXCIgW3NyY109XCJjb250ZW50Py5hcHBJY29uXCIgYWx0PVwiVGh1bWJuYWlsXCJcbiAgICAgICAgKGNsaWNrKT1cImNvbnRlbnQudmlld0NoaWxkcmVuID0gIWNvbnRlbnQudmlld0NoaWxkcmVuXCIgW3dzVXRpbHNEZWZhdWx0VGh1bWJuYWlsXT1cImRlZmF1bHRUaHVtYm5haWxcIiAvPiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtd3JhcCBmbGV4LWJldHdlZW4gd2lkdGgtZXhwYW5kIHByLTAgdy0xMDAgXCI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiIFtuZ0NsYXNzXT1cInsnY3Vyc29yLXBvaW50ZXInOiAhaXNFbmFibGVkfVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdDaGlsZHJlbiA9ICFjb250ZW50LnZpZXdDaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzbTpmbGV4LXJvdyBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFmb3JQcmV2aWV3ICYmIGNvbnRlbnQ/LmlkZW50aWZpZXIgJiYgZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcikgOyBlbHNlIGVsc2VCbG9ja1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb21wbGV0aW9uU3RhdHVzKGNvbnRlbnQuaWRlbnRpZmllcikgPT0gMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlZCBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29tcGxldGVkLWljb25cIiBbY29sb3JdPVwiYmx1ZVwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb21wbGV0aW9uU3RhdHVzKGNvbnRlbnQ/LmlkZW50aWZpZXIpIDwgMlwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3MgbXItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BlcmNlbnRdPVwiZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcilcIiBbcmFkaXVzXT1cIjEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VXaWR0aF09XCIyXCIgW2lubmVyU3Ryb2tlV2lkdGhdPVwiMlwiIFtzcGFjZV09XCItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW291dGVyU3Ryb2tlQ29sb3JdPVwicHJvZ3Jlc3NDb2xvcjIoKVwiIFtpbm5lclN0cm9rZUNvbG9yXT1cIidyZ2JhKDAsIDAsIDAsIDAuMTYpJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuaW1hdGlvbl09XCJ0cnVlXCIgW2FuaW1hdGlvbkR1cmF0aW9uXT1cIjI1MFwiIFtzaG93VGl0bGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VW5pdHNdPVwiZmFsc2VcIiBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xvY2t3aXNlXT1cInRydWVcIiBbYmFja2dyb3VuZE9wYWNpdHldPVwiMFwiIFtiYWNrZ3JvdW5kR3JhZGllbnRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kU3Ryb2tlV2lkdGhdPVwiM1wiIG1hdFRvb2x0aXA9XCJJbiBwcm9ncmVzc1wiIFtzaG93WmVyb091dGVyU3Ryb2tlXT1mYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kUGFkZGluZ109XCItN1wiIFtzdGFydEZyb21aZXJvXT1cImZhbHNlXCIgW2JhY2tncm91bmRQYWRkaW5nXT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbWFnZUhlaWdodF09XCIxOFwiIFtpbWFnZVdpZHRoXT1cIjE4XCIgW3Nob3dCYWNrZ3JvdW5kXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VMaW5lY2FwXT1cIididXR0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jaXJjbGUtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3MgbXItMVwiIFtwZXJjZW50XT1cIjBcIiBbcmFkaXVzXT1cIjExXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRlclN0cm9rZVdpZHRoXT1cIjJcIiBbaW5uZXJTdHJva2VXaWR0aF09XCIyXCIgW291dGVyU3Ryb2tlQ29sb3JdPVwiJyM4MDgwODAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lclN0cm9rZUNvbG9yXT1cIicjODA4MDgwJ1wiIFthbmltYXRpb25dPVwidHJ1ZVwiIFtzcGFjZV09XCItMlwiIFtzaG93VW5pdHNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuaW1hdGlvbkR1cmF0aW9uXT1cIjI1MFwiIFtzaG93VGl0bGVdPVwiZmFsc2VcIiBbYmFja2dyb3VuZFBhZGRpbmddPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZFBhZGRpbmddPVwiLTlcIiBbb3V0ZXJTdHJva2VMaW5lY2FwXT1cIididXR0J1wiIG1hdFRvb2x0aXA9XCJOb3Qgc3RhcnRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1N1YnRpdGxlXT1cImZhbHNlXCIgW3Nob3dJbm5lclN0cm9rZV09XCJ0cnVlXCIgW2Nsb2Nrd2lzZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbWFnZUhlaWdodF09XCIyMlwiIFtpbWFnZVdpZHRoXT1cIjIyXCIgW3Nob3dCYWNrZ3JvdW5kXT1cImZhbHNlXCI+PC9jaXJjbGUtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2NvbGxlY3Rpb24tYWN0aXZlLWNsYXNzJzogcGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUgdGV4dC10cnVuY2F0ZSBtYXQtc3ViaGVhZGluZy0xIGZsZXgtYXV0byBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3RleHQtYWN0aXZlJzogcGF0aFNldD8uaGFzKGNvbnRlbnQuaWRlbnRpZmllcil9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpbmRleH19LiB7eyBjb250ZW50Py5uYW1lIHwgdHJ1bmNhdGU6NTAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cIm1hcmdpbi1yZW1vdmUgdGV4dC10cnVuY2F0ZSBtYXQtc3ViaGVhZGluZy0xIGZsZXgtYXV0byBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwibnVsbFwiIFtuZ0NsYXNzXT1cInsnbWwtMyc6IGlzRW5yb2xsZWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCIoaXNBbGxvd2VkICYmICFmb3JQcmV2aWV3ICYmIGlzRW5hYmxlZCkgPyByZXNvdXJjZUxpbmsudXJsIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImNvbXB1dGVkUXVlcnlQYXJhbXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHt7Y29udGVudD8uY291cnNlQ2F0ZWdvcnl9fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsncmVzb3VyY2UtYWN0aXZlJzogcGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpfVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlIFwiIFtuZ0NsYXNzXT1cInsnY3Vyc29yLXBvaW50ZXInOiAhaXNFbmFibGVkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyYWlzZVRlbGVtZXRyeSgpOyBjaGFuZ2VSZXNvdXJjZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlIHRleHQtdHJ1bmNhdGUgbWF0LWJvZHktMiBmbGV4LWF1dG8gZm9udC1ib2xkIG5vZHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd0ZXh0LWFjdGl2ZSc6IHBhdGhTZXQ/Lmhhcyhjb250ZW50Py5pZGVudGlmaWVyKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cIm1hcmdpbi1yaWdodC14cyByYWRpb2J0biB0aW1lLWljb25cIj5yYWRpb19idXR0b25fdW5jaGVja2VkIDwvbWF0LWljb24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aW5kZXh9fS4ge3sgY29udGVudD8ubmFtZSB8IHRydW5jYXRlOjUwIH19XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udGVudC10eXBlIG9wdGlvbmFsLXNwYW4gbm9kdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm9wdGlvbmFsUmVhZGluZ1wiPnt7ICdwbGF5ZXJicmllZi5vcHRpb25hbCcgfCB0cmFuc2xhdGUgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZm9yIGRlZmF1bHQgZ3JleSBpY29ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwYXRoU2V0Py5oYXMoY29udGVudD8uaWRlbnRpZmllcilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpY29ucyB3cy1tYXQtYmxhY2s2MC10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS92aWRlby5zdmdcIiBhbHQ9XCJWaWRlb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIiAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndmlkZW8vbXA0JyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ3ZpZGVvL3gteW91dHViZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Py5taW1lVHlwZSA9PT0nYXBwbGljYXRpb24veC1tcGVnVVJMJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvYXVkaW8uc3ZnXCIgYWx0PVwiQXVkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2F1ZGlvL21wZWcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9wZGYuc3ZnXCIgYWx0PVwiUERGXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L3Jlc291cmNlLnN2Z1wiIGFsdD1cIlN1cnZleVwiIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vc3VydmV5J1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L2xpbmsuc3ZnXCIgYWx0PVwiSW50ZXJhY3RpdmVDb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmh0bWwtYXJjaGl2ZScgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICd0ZXh0L3gtdXJsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L2dyZXkvYXNzZXNzbWVudC5zdmdcIiBhbHQ9XCJBc3Nlc3NtZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9qc29uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3F1aXonIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLnN1bmJpcmQucXVlc3Rpb25zZXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9pbWFnZS5zdmdcIiBhbHQ9XCJJbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnaW1hZ2UvcG5nJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2ltYWdlL2pwZWcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2NvbnRlbnQvZ3JleS9jb250ZW50X2NvcHkuc3ZnXCIgY2xhc3M9XCJjb250ZW50aWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkNvdXJzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuY29udGVudC1jb2xsZWN0aW9uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3N1cnZleSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L21vZHVsZS5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCIgYWx0PVwib2ZmbGluZSBzZXNzaW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29mZmxpbmUnXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT01QX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc291cmNlRHVyYXRpb24gd3MtbWF0LWJsYWNrNjAtdGV4dCBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8ubWF4UXVlc3Rpb25zIH19IHt7ICdwbGF5ZXJicmllZi5xdWVzdGlvbnMnIHwgdHJhbnNsYXRlIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc291cmNlRHVyYXRpb24gd3MtbWF0LWJsYWNrNjAtdGV4dCBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRlbnQ/LmR1cmF0aW9ufHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoeU1hcERhdGFbY29udGVudD8uaWRlbnRpZmllcl0/LmV4cGVjdGVkRHVyYXRpb24gfHwgMCl8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlRHVyYXRpb25UcmFuc2Zvcm06XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG1zJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmb3Igd2hpdGUgaWNvbnMgd2hlbiBjb250ZW50IGhpZ2hsaWdodGVkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGF0aFNldD8uaGFzKGNvbnRlbnQ/LmlkZW50aWZpZXIpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzaWNvbnMgd3MtbWF0LXdoaXRlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS92aWRlby5zdmdcIiBhbHQ9XCJWaWRlb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIiAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndmlkZW8vbXA0JyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ3ZpZGVvL3gteW91dHViZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Py5taW1lVHlwZSA9PT0nYXBwbGljYXRpb24veC1tcGVnVVJMJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL2F1ZGlvLnN2Z1wiIGFsdD1cIkF1ZGlvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdhdWRpby9tcGVnJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL3BkZi5zdmdcIiBhbHQ9XCJQREZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9jb250ZW50L3doaXRlL3Jlc291cmNlLnN2Z1wiIGFsdD1cIlN1cnZleVwiIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vc3VydmV5J1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9saW5rLnN2Z1wiIGFsdD1cIkludGVyYWN0aXZlQ29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxvYXQtbGVmdCBtYXJnaW4tcmlnaHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLmVrc3RlcC5odG1sLWFyY2hpdmUnIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAndGV4dC94LXVybCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9hc3Nlc3NtZW50LnN2Z1wiIGFsdD1cIkFzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsb2F0LWxlZnQgbWFyZ2luLXJpZ2h0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vcXVpeicgfHwgY29udGVudD8ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC9ncmV5L2ltYWdlLnN2Z1wiIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ubWltZVR5cGUgPT09ICdpbWFnZS9wbmcnIHx8IGNvbnRlbnQ/Lm1pbWVUeXBlID09PSAnaW1hZ2UvanBlZydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9jb250ZW50X2NvcHkuc3ZnXCIgY2xhc3M9XCJjb250ZW50aWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkNvdXJzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudC5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuY29udGVudC1jb2xsZWN0aW9uJyB8fCBjb250ZW50Py5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3N1cnZleSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvY29udGVudC93aGl0ZS9tb2R1bGUuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbG9hdC1sZWZ0IG1hcmdpbi1yaWdodC14c1wiIGFsdD1cIm9mZmxpbmUgc2Vzc2lvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9vZmZsaW5lJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc291cmNlRHVyYXRpb24gd3MtbWF0LXdoaXRlLXRleHQgbm9kdHJhbnNsYXRlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/Lm1heFF1ZXN0aW9ucyB9fSB7eyAncGxheWVyYnJpZWYucXVlc3Rpb25zJyB8IHRyYW5zbGF0ZSB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZWNhc2V9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIShjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXNvdXJjZUR1cmF0aW9uIHdzLW1hdC13aGl0ZS10ZXh0IG5vZHRyYW5zbGF0ZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uZHVyYXRpb258fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5TWFwRGF0YVtjb250ZW50Py5pZGVudGlmaWVyXT8uZXhwZWN0ZWREdXJhdGlvbiB8fCAwKXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVEdXJhdGlvblRyYW5zZm9ybTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdobXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInR5cGUtY29udGFpbmVyIHJlc291cmNlIG10LTIgc206bXQtMFwiICpuZ0lmPVwiY29udGVudD8uY2F0ZWdvcnkgPT09ICdSZXNvdXJjZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci0xIGN1c3RvbS1pY29uIHJvdGF0ZS05MFwiPmNhbGxfdG9fYWN0aW9uPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPlJlc291cmNlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHlwZS1jb250YWluZXIgbW9kdWxlIG10LTIgc206bXQtMFwiICpuZ0lmPVwiY29udGVudD8uY2F0ZWdvcnkgPT09ICdDb2xsZWN0aW9uJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTEgY3VzdG9tLWljb24gcm90YXRlLTkwXCI+Y2FsbF90b19hY3Rpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+TW9kdWxlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHlwZS1jb250YWluZXIgY291cnNlIG10LTIgc206bXQtMFwiICpuZ0lmPVwiY29udGVudD8uY2F0ZWdvcnkgPT09ICdDb3Vyc2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXItMSBjdXN0b20taWNvbiByb3RhdGUtOTBcIj5jYWxsX3RvX2FjdGlvbjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5Db3Vyc2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBGb3IgY291cnNlIHByb2dyZXNzIHRvIGJlIHNob3duIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWZvclByZXZpZXcgJiYgY29udGVudD8uaWRlbnRpZmllciAmJiBnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENvbXBsZXRpb25TdGF0dXMoY29udGVudD8uaWRlbnRpZmllcikgPT0gMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBtci00ICBmbGV4IGZsZXgtMSBmbGV4LWNvbCAgcHJvZ3Jlc3MtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCB3LWZ1bGwgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtYm9keS0yIG5vZHRyYW5zbGF0ZSBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tnZXRDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50Py5pZGVudGlmaWVyKX19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3MgW2NvbnRlbnRJZF09XCJjb250ZW50Py5wcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb2dyZXNzXT1cImdldENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQ/LmlkZW50aWZpZXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvZ3Jlc3NUeXBlXT1cIidwZXJjZW50YWdlJ1wiIFtjdXN0b21DbGFzc05hbWVdPVwiJ3ZpZXdlci1wcm9ncmVzcydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3M+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uaXNzdWVkQ2VydGlmaWNhdGVzSWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibWwtNSBjZXJ0aWZpY2F0ZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1idG4nOiBkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyB8fCBjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmcgJiYgZG93bmxvYWRDZXJ0aWZpY2F0ZShjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZCk7JGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW1nIHNyYz1cImZ1c2lvbi1hc3NldHMvaW1hZ2VzL2NlcnRpZmljYXRlLWljby5zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5DZXJ0aWZpY2F0ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTJcIj5hcnJvd19kb3dud2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlbnRlciBmbGV4IGZsZXgtbWlkZGxlIGNlcnRpZmljYXRlLWxvYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZG93bmxvYWRDZXJ0aWZpY2F0ZUxvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIHN0cm9rZVdpZHRoPVwiMlwiIHN0cm9rZT1cIid3aGl0ZSdcIiBjbGFzcz1cIndoaXRlLXNwaW5uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RpYW1ldGVyXT1cIjE2XCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8Y2lyY2xlLXByb2dyZXNzIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgcHJvZ3Jlc3NcIiBbcGVyY2VudF09XCIxMDBcIiBbcmFkaXVzXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW291dGVyU3Ryb2tlV2lkdGhdPVwiM1wiIFtpbm5lclN0cm9rZVdpZHRoXT1cIjNcIiBbc3BhY2VdPVwiLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0ZXJTdHJva2VDb2xvcl09XCJwcm9ncmVzc0NvbG9yKClcIiBbaW5uZXJTdHJva2VDb2xvcl09XCIncmdiYSgwLDAsMCwuMTYpJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbmltYXRpb25dPVwidHJ1ZVwiIFthbmltYXRpb25EdXJhdGlvbl09XCIzMDBcIiBbc2hvd1RpdGxlXT1cImZhbHNlXCIgW3Nob3dVbml0c109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U3VidGl0bGVdPVwiZmFsc2VcIiBbc2hvd0lubmVyU3Ryb2tlXT1cInRydWVcIiBbY2xvY2t3aXNlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZE9wYWNpdHldPVwiMFwiIFtiYWNrZ3JvdW5kR3JhZGllbnRdPVwiZmFsc2VcIiBbYmFja2dyb3VuZFN0cm9rZVdpZHRoXT1cIjNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1plcm9PdXRlclN0cm9rZV09ZmFsc2UgW2JhY2tncm91bmRQYWRkaW5nXT1cIi05XCIgW3N0YXJ0RnJvbVplcm9dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmFja2dyb3VuZFBhZGRpbmddPVwiMFwiIFtpbWFnZUhlaWdodF09XCIyNFwiIFtpbWFnZVdpZHRoXT1cIjI0XCIgW3Nob3dCYWNrZ3JvdW5kXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW291dGVyU3Ryb2tlTGluZWNhcF09XCInYnV0dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NpcmNsZS1wcm9ncmVzcz4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb21wbGV0aW9uU3RhdHVzKGNvbnRlbnQ/LmlkZW50aWZpZXIpIDwgMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBtci00ICBmbGV4IGZsZXgtMSBmbGV4LWNvbCAgcHJvZ3Jlc3MtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCB3LWZ1bGwgd3MtbWF0LWJsYWNrLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1ib2R5LTIgIHdzLW1hdC1ibGFjay10ZXh0IG5vZHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2dldENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQ/LmlkZW50aWZpZXIpfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtY29udGVudC1wcm9ncmVzcyBbY29udGVudElkXT1cImNvbnRlbnQ/LnByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvZ3Jlc3NdPVwiZ2V0Q29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudD8uaWRlbnRpZmllcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCIgW2N1c3RvbUNsYXNzTmFtZV09XCIndmlld2VyLXByb2dyZXNzJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJtbC01IGNlcnRpZmljYXRlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkaXNhYmxlLWJ0bic6IGRvd25sb2FkQ2VydGlmaWNhdGVMb2FkaW5nIHx8IGNvbnRlbnQ/Lmlzc3VlZENlcnRpZmljYXRlc0lkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZyAmJiBkb3dubG9hZENlcnRpZmljYXRlKGNvbnRlbnQ/Lmlzc3VlZENlcnRpZmljYXRlc0lkKTskZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbWcgc3JjPVwiZnVzaW9uLWFzc2V0cy9pbWFnZXMvY2VydGlmaWNhdGUtaWNvLnN2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPkNlcnRpZmljYXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyIGZsZXggZmxleC1taWRkbGUgY2VydGlmaWNhdGUtbG9hZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkb3dubG9hZENlcnRpZmljYXRlTG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCIgc3Ryb2tlPVwiJ3doaXRlJ1wiIGNsYXNzPVwid2hpdGUtc3Bpbm5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMTZcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInNlZS1hbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdDaGlsZHJlbiA9ICFjb250ZW50LnZpZXdDaGlsZHJlbjsgZXhwYW5kQWN0aXZlID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWUtYWxsLWJ0biB0YWIgY3VzdG9tLWNoZXZyb24gY3VzdG9taWNvblwiIG1hdC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhY29udGVudC52aWV3Q2hpbGRyZW4gJiYgIWlzTW9kdWxlXCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJjb250ZW50LnZpZXdDaGlsZHJlbiAmJiAhaXNNb2R1bGVcIj5rZXlib2FyZF9hcnJvd191cDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhY29udGVudC52aWV3Q2hpbGRyZW4gJiYgaXNNb2R1bGVcIj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29udGVudC52aWV3Q2hpbGRyZW4gJiYgaXNNb2R1bGVcIj5yZW1vdmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG48L25nLWNvbnRhaW5lcj4iXX0=