tango-app-ui-ai-audio 3.0.2 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -109,7 +109,6 @@ export class AddManageCohortComponent {
109
109
  },
110
110
  error: () => {
111
111
  this.isLoading = false;
112
- this.showToast('Failed to load cohort details. Please try again.', 'warning');
113
112
  }
114
113
  });
115
114
  }
@@ -238,12 +237,19 @@ export class AddManageCohortComponent {
238
237
  onNumericalToggle(mi) {
239
238
  const metric = this.metrics[mi];
240
239
  if (metric.numericalValue) {
240
+ // User clicked ON → save current contexts, revert until confirmed
241
+ metric._savedContexts = metric.contexts.map(c => ({ ...c }));
241
242
  metric.numericalValue = false;
242
243
  this.pendingNumericalMetricIndex = mi;
243
244
  this.showNumericalConfirmModal = true;
244
245
  }
245
246
  else {
247
+ // User clicked OFF → restore saved contexts or add a fresh one
246
248
  metric.minMaxEnabled = false;
249
+ metric.contexts = metric._savedContexts && metric._savedContexts.length > 0
250
+ ? metric._savedContexts.map(c => ({ ...c, isWeightageOpen: false }))
251
+ : [{ context: '', weightage: '', description: '', isWeightageOpen: false }];
252
+ metric._savedContexts = undefined;
247
253
  }
248
254
  }
249
255
  confirmNumericalToggle() {
@@ -251,12 +257,22 @@ export class AddManageCohortComponent {
251
257
  const metric = this.metrics[this.pendingNumericalMetricIndex];
252
258
  metric.numericalValue = true;
253
259
  metric.minMaxEnabled = true;
254
- metric.contexts = [{ context: '', weightage: '', description: '', isWeightageOpen: false }];
260
+ // contexts already saved in _savedContexts; clear active contexts
261
+ metric.contexts = [];
255
262
  }
256
263
  this.showNumericalConfirmModal = false;
257
264
  this.pendingNumericalMetricIndex = null;
258
265
  }
259
266
  cancelNumericalToggle() {
267
+ if (this.pendingNumericalMetricIndex !== null) {
268
+ const metric = this.metrics[this.pendingNumericalMetricIndex];
269
+ // Restore contexts that were saved before the toggle click
270
+ if (metric._savedContexts) {
271
+ metric.contexts = metric._savedContexts.map(c => ({ ...c, isWeightageOpen: false }));
272
+ metric._savedContexts = undefined;
273
+ }
274
+ metric.numericalValue = false;
275
+ }
260
276
  this.showNumericalConfirmModal = false;
261
277
  this.pendingNumericalMetricIndex = null;
262
278
  }
@@ -293,6 +309,7 @@ export class AddManageCohortComponent {
293
309
  selectWeightage(mi, ci, weight) {
294
310
  this.metrics[mi].contexts[ci].weightage = weight;
295
311
  this.metrics[mi].contexts[ci].isWeightageOpen = false;
312
+ this.metrics[mi].contexts[ci].weightageError = false;
296
313
  }
297
314
  removeContext(metricIndex, contextIndex) {
298
315
  if (this.metrics[metricIndex].contexts.length > 1) {
@@ -302,6 +319,22 @@ export class AddManageCohortComponent {
302
319
  patchSuggestedDescription(mi, ci, text) {
303
320
  this.metrics[mi].contexts[ci].description = text;
304
321
  }
322
+ fetchSuggestions(mi, ci) {
323
+ const ctx = this.metrics[mi].contexts[ci];
324
+ if (!ctx.context)
325
+ return;
326
+ ctx.isSuggestionLoading = true;
327
+ ctx.suggestions = [];
328
+ this.audioService.getGeminiSuggestions(ctx.context, ctx.description).subscribe({
329
+ next: (response) => {
330
+ ctx.suggestions = response?.data?.suggestions || [];
331
+ ctx.isSuggestionLoading = false;
332
+ },
333
+ error: () => {
334
+ ctx.isSuggestionLoading = false;
335
+ }
336
+ });
337
+ }
305
338
  weightageToPriority(weightage) {
306
339
  const map = { 'Low': 0, 'Medium': 1, 'High': 2, 'Critical': 3 };
307
340
  return map[weightage] ?? 1;
@@ -362,7 +395,23 @@ export class AddManageCohortComponent {
362
395
  this.confirmAction = 'draft';
363
396
  this.showConfirmModal = true;
364
397
  }
398
+ validateContextFields() {
399
+ let valid = true;
400
+ this.metrics.forEach(m => {
401
+ if (!m.numericalValue) {
402
+ m.contexts.forEach(c => {
403
+ c.weightageError = !!c.context && !c.weightage;
404
+ c.descriptionError = !!c.context && !c.description;
405
+ if (c.weightageError || c.descriptionError)
406
+ valid = false;
407
+ });
408
+ }
409
+ });
410
+ return valid;
411
+ }
365
412
  submit() {
413
+ if (!this.validateContextFields())
414
+ return;
366
415
  this.confirmTitle = 'Submit Cohort';
367
416
  this.confirmMessage = 'Are you sure you want to submit this cohort? Once submitted it will be activated.';
368
417
  this.confirmAction = 'submit';
@@ -372,9 +421,12 @@ export class AddManageCohortComponent {
372
421
  this.showConfirmModal = false;
373
422
  const action = this.confirmAction;
374
423
  this.confirmAction = null;
424
+ if (action === 'back') {
425
+ this.router.navigate(['/manage/ai-audio/manage-cohort']);
426
+ return;
427
+ }
375
428
  const isUpdateFlow = this.isEditMode && !!this.cohortId;
376
429
  if (this.isEditMode && !this.cohortId) {
377
- this.showToast('Missing cohortId. Unable to update cohort.', 'warning');
378
430
  return;
379
431
  }
380
432
  const payload = isUpdateFlow ? this.buildUpdatePayload() : this.buildCreatePayload();
@@ -385,17 +437,10 @@ export class AddManageCohortComponent {
385
437
  request$.subscribe({
386
438
  next: () => {
387
439
  this.isLoading = false;
388
- if (action === 'draft') {
389
- this.showToast(isUpdateFlow ? 'Cohort updated as draft successfully!' : 'Cohort saved as draft successfully!', 'success');
390
- }
391
- else if (action === 'submit') {
392
- this.showToast(isUpdateFlow ? 'Cohort updated successfully!' : 'Cohort submitted successfully!', 'success');
393
- }
394
- setTimeout(() => this.router.navigate(['/manage/ai-audio/manage-cohort']), 1800);
440
+ this.router.navigate(['/manage/ai-audio/manage-cohort']);
395
441
  },
396
442
  error: () => {
397
443
  this.isLoading = false;
398
- this.showToast(isUpdateFlow ? 'Failed to update cohort. Please try again.' : 'Failed to save cohort. Please try again.', 'warning');
399
444
  }
400
445
  });
401
446
  }
@@ -418,16 +463,19 @@ export class AddManageCohortComponent {
418
463
  });
419
464
  }
420
465
  goBack() {
421
- this.router.navigate(['/tango-ai-audio/manage-cohort']);
466
+ this.confirmTitle = 'Go Back';
467
+ this.confirmMessage = 'Are you sure you want to go back? Any unsaved changes will be lost.';
468
+ this.confirmAction = 'back';
469
+ this.showConfirmModal = true;
422
470
  }
423
471
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddManageCohortComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.PageInfoService }, { token: i3.AudioService }], target: i0.ɵɵFactoryTarget.Component });
424
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddManageCohortComponent, selector: "lib-add-manage-cohort", host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div class=\"add-manage-cohort\">\r\n\r\n <!-- \u2500\u2500 Numerical Confirm Modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"confirm-modal-overlay\" *ngIf=\"showNumericalConfirmModal\" (click)=\"cancelNumericalToggle()\">\r\n <div class=\"confirm-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"confirm-modal-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#FEF3C7\" />\r\n <path d=\"M20 13V21M20 27H20.01\" stroke=\"#D97706\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h3 class=\"confirm-modal-title\">Enable Numerical Value</h3>\r\n <p class=\"confirm-modal-message\">Context you added will be removed from the metric by enabling the numerical value. Are you sure to proceed?</p>\r\n <div class=\"confirm-modal-actions\">\r\n <button class=\"btn-cancel-modal\" (click)=\"cancelNumericalToggle()\">Cancel</button>\r\n <button class=\"btn-confirm-modal\" (click)=\"confirmNumericalToggle()\">Yes, Proceed</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Confirmation Modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"confirm-modal-overlay\" *ngIf=\"showConfirmModal\" (click)=\"cancelConfirm()\">\r\n <div class=\"confirm-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"confirm-modal-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#FEF3C7\" />\r\n <path d=\"M20 13V21M20 27H20.01\" stroke=\"#D97706\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h3 class=\"confirm-modal-title\">{{ confirmTitle }}</h3>\r\n <p class=\"confirm-modal-message\">{{ confirmMessage }}</p>\r\n <div class=\"confirm-modal-actions\">\r\n <button class=\"btn-cancel-modal\" (click)=\"cancelConfirm()\">Cancel</button>\r\n <button class=\"btn-confirm-modal\" (click)=\"confirmProceed()\">Yes, Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Toast Notification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"cohort-toast\" [class.visible]=\"toastVisible\" [class.toast-success]=\"toastType==='success'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M10 18.3333C14.6024 18.3333 18.3333 14.6024 18.3333 10C18.3333 5.39763 14.6024 1.66667 10 1.66667C5.39763 1.66667 1.66667 5.39763 1.66667 10C1.66667 14.6024 5.39763 18.3333 10 18.3333Z\"\r\n stroke=\"white\" stroke-width=\"1.66667\" />\r\n <path d=\"M7.5 10L9.16667 11.6667L12.5 8.33333\" stroke=\"white\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n {{ toastMessage }}\r\n </div>\r\n\r\n <!-- \u2500\u2500 Top Header Bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"top-header\">\r\n <div class=\"top-header-left\">\r\n <h4 class=\"header-title\">{{ headerTitle }}</h4>\r\n <p class=\"header-subtitle\">{{ headerSubtitle }}</p>\r\n </div>\r\n <div class=\"top-header-actions my-3\">\r\n <!-- View Mode: only show Edit button -->\r\n <ng-container *ngIf=\"isViewMode\">\r\n <button class=\"btn btn-outline btn-default\" (click)=\"switchToEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_2398_367)\">\r\n <path\r\n d=\"M14.168 2.49993C14.3868 2.28106 14.6467 2.10744 14.9326 1.98899C15.2186 1.87054 15.5251 1.80957 15.8346 1.80957C16.1442 1.80957 16.4507 1.87054 16.7366 1.98899C17.0226 2.10744 17.2824 2.28106 17.5013 2.49993C17.7202 2.7188 17.8938 2.97863 18.0122 3.2646C18.1307 3.55057 18.1917 3.85706 18.1917 4.16659C18.1917 4.47612 18.1307 4.78262 18.0122 5.06859C17.8938 5.35455 17.7202 5.61439 17.5013 5.83326L6.2513 17.0833L1.66797 18.3333L2.91797 13.7499L14.168 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2398_367\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit Cohort\r\n </button>\r\n </ng-container>\r\n <!-- Create / Edit Mode: Save Draft + Submit -->\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <!-- <button class=\"btn-draft\" (click)=\"saveDraft()\">Save As Draft</button> -->\r\n <button class=\"btn-submit\" (click)=\"submit()\">Submit</button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Form Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"form-body\">\r\n\r\n <!-- Cohort Name -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Cohort Name</label>\r\n <input type=\"text\" class=\"form-input\" placeholder=\"Enter Cohort Name\" [(ngModel)]=\"cohortName\"\r\n [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Cohort Description -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Cohort Description</label>\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Cohort description...\"\r\n [(ngModel)]=\"cohortDescription\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Source Multi-select Dropdown -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Select Source</label>\r\n <div class=\"multi-select-container w-50\" [class.view-disabled]=\"isViewMode\">\r\n <div class=\"multi-select-trigger\" (click)=\"!isViewMode && toggleSourceDropdown()\">\r\n <span>{{ sourceDisplay }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n [class.rotate]=\"isSourceDropdownOpen\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"multi-select-dropdown\" *ngIf=\"isSourceDropdownOpen\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"search-box p-2\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Source...\"\r\n [(ngModel)]=\"sourceSearchText\" (ngModelChange)=\"filterSources()\" />\r\n </div>\r\n <div class=\"multi-select-option\" (click)=\"selectAllSources()\">\r\n <input type=\"checkbox\" [checked]=\"selectedSources.length === sourceOptions.length\" readonly />\r\n <span>Select All</span>\r\n </div>\r\n <div class=\"multi-select-option\" *ngFor=\"let s of filteredSourceOptions\" (click)=\"toggleSource(s)\">\r\n <input type=\"checkbox\" [checked]=\"isSourceSelected(s)\" readonly />\r\n <span>{{ s.label }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Metrics \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"metric-card\" *ngFor=\"let metric of metrics; let mi = index\">\r\n\r\n <div class=\"metric-header-row\">\r\n <h5 class=\"metric-title\">Metric {{ mi + 1 }}</h5>\r\n\r\n </div>\r\n\r\n <!-- Metric Name -->\r\n <div class=\"form-field\">\r\n <input type=\"text\" class=\"form-input\" placeholder=\"Enter Metric Name\" [(ngModel)]=\"metric.name\"\r\n [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Metric Description -->\r\n <div class=\"form-field\">\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Description...\"\r\n [(ngModel)]=\"metric.description\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Provide Context Header -->\r\n <div class=\"context-header\">\r\n <div class=\"context-header-left\">\r\n <span class=\"context-label\">Provide Context</span>\r\n <span class=\"context-sublabel\">Check whether the following are discussed</span>\r\n </div>\r\n <div class=\"context-header-right\">\r\n <label class=\"toggle-label\">\r\n <span class=\"toggle-text\">Numerical Value</span>\r\n <label class=\"toggle-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"metric.numericalValue\" [disabled]=\"isViewMode\"\r\n (ngModelChange)=\"onNumericalToggle(mi)\" />\r\n <span class=\"toggle-slider\"></span>\r\n </label>\r\n </label>\r\n <button class=\"btn-add-context\" (click)=\"addContext(mi)\" [disabled]=\"isViewMode || metric.numericalValue\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33337V12.6667M3.33334 8.00004H12.6667\" stroke=\"#344054\" stroke-width=\"1.33\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n Add New\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Numerical Section (shown when toggle is ON) \u2500\u2500 -->\r\n <ng-container *ngIf=\"metric.numericalValue\">\r\n <div class=\"min-max-checkbox\">\r\n <label class=\"checkbox-label\">\r\n <input type=\"checkbox\" [(ngModel)]=\"metric.minMaxEnabled\" [disabled]=\"isViewMode\" />\r\n <span>Min and Max Range Validation</span>\r\n </label>\r\n </div>\r\n <div class=\"numerical-section\" *ngIf=\"metric.minMaxEnabled\">\r\n <div class=\"stepper-group\">\r\n <span class=\"stepper-label\">Min Value</span>\r\n <div class=\"stepper-control\">\r\n <button class=\"stepper-btn\" (click)=\"decrementMin(mi)\" [disabled]=\"isViewMode\">\u2014</button>\r\n <span class=\"stepper-value\">{{ metric.minValue }}</span>\r\n <button class=\"stepper-btn\" (click)=\"incrementMin(mi)\" [disabled]=\"isViewMode\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"stepper-group\">\r\n <span class=\"stepper-label\">Max Value</span>\r\n <div class=\"stepper-control\">\r\n <button class=\"stepper-btn\" (click)=\"decrementMax(mi)\" [disabled]=\"isViewMode\">\u2014</button>\r\n <span class=\"stepper-value\">{{ metric.maxValue }}</span>\r\n <button class=\"stepper-btn\" (click)=\"incrementMax(mi)\" [disabled]=\"isViewMode\">+</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Context Items (hidden when numerical value is ON) -->\r\n <ng-container *ngIf=\"!metric.numericalValue\">\r\n <div class=\"context-item-container\" *ngFor=\"let ctx of metric.contexts; let ci = index\">\r\n <div class=\"context-item\">\r\n <div class=\"context-item-header\">\r\n <span class=\"context-item-title\">Context {{ ci + 1 }} Details</span>\r\n <button class=\"context-remove-btn\" (click)=\"removeContext(mi, ci)\" title=\"Remove context\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"context-fields\">\r\n <div class=\"context-row\">\r\n <input type=\"text\" class=\"form-input context-input\" placeholder=\"Enter Context\"\r\n [(ngModel)]=\"ctx.context\" [disabled]=\"isViewMode\" />\r\n\r\n <!-- Custom Single-select Weightage -->\r\n <div class=\"custom-select-container w-25 context-select\" [class.view-disabled]=\"isViewMode\">\r\n <div class=\"custom-select-trigger\"\r\n (click)=\"!isViewMode && toggleWeightageDropdown(mi, ci)\">\r\n <span>{{ ctx.weightage || 'Select Weightage' }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\" [class.rotate]=\"ctx.isWeightageOpen\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"custom-select-dropdown\" *ngIf=\"ctx.isWeightageOpen\">\r\n <div class=\"custom-select-option\" *ngFor=\"let w of weightageOptions\"\r\n (click)=\"selectWeightage(mi, ci, w)\">\r\n <span>{{ w }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Description\"\r\n [(ngModel)]=\"ctx.description\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Suggested Descriptions Section (hidden in view mode) -->\r\n <div class=\"suggested-desc-section mt-3\" *ngIf=\"!isViewMode\">\r\n <p class=\"suggested-title\">Try the suggested descriptions</p>\r\n <div class=\"suggested-chips\">\r\n <span class=\"suggested-chip\"\r\n (click)=\"patchSuggestedDescription(mi, ci, 'If the conversation has been done with the greetings from the start and end, then it is true.')\">\r\n If the conversation has been done with the greetings from the start and end, then it is\r\n true.\r\n </span>\r\n <span class=\"suggested-chip\"\r\n (click)=\"patchSuggestedDescription(mi, ci, 'Lorem ipsum dolor sit amet consectetur.')\">\r\n Lorem ipsum dolor sit amet consectetur.\r\n </span>\r\n <span class=\"suggested-chip\"\r\n (click)=\"patchSuggestedDescription(mi, ci, 'Fringilla leo eget nam nec arcu tristique tristique.')\">\r\n Fringilla leo eget nam nec arcu tristique tristique.\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Metric Footer Actions -->\r\n <div class=\"metric-footer\">\r\n <button class=\"metric-action-btn\" title=\"Duplicate Metric\" (click)=\"duplicateMetric(mi)\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <rect x=\"6.66669\" y=\"6.66663\" width=\"11.6667\" height=\"11.6667\" rx=\"2\" stroke=\"#667085\"\r\n stroke-width=\"1.5\" />\r\n <path\r\n d=\"M3.33331 13.3333H2.49998C2.05795 13.3333 1.63403 13.1577 1.32147 12.8452C1.00891 12.5326 0.833313 12.1087 0.833313 11.6666V2.49996C0.833313 2.05793 1.00891 1.63401 1.32147 1.32145C1.63403 1.00889 2.05795 0.833293 2.49998 0.833293H11.6666C12.1087 0.833293 12.5326 1.00889 12.8452 1.32145C13.1577 1.63401 13.3333 2.05793 13.3333 2.49996V3.33329\"\r\n stroke=\"#667085\" stroke-width=\"1.5\" />\r\n </svg>\r\n </button>\r\n <button class=\"metric-action-btn metric-delete-btn\" title=\"Delete Metric\" (click)=\"removeMetric(mi)\"\r\n [disabled]=\"isViewMode || metrics.length <= 1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M2.5 5H4.16667H17.5\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M6.66669 5.00004V3.33337C6.66669 2.89135 6.84228 2.46742 7.15484 2.15486C7.4674 1.8423 7.89133 1.66671 8.33335 1.66671H11.6667C12.1087 1.66671 12.5326 1.8423 12.8452 2.15486C13.1578 2.46742 13.3334 2.89135 13.3334 3.33337V5.00004M15.8334 5.00004V16.6667C15.8334 17.1087 15.6578 17.5327 15.3452 17.8452C15.0326 18.1578 14.6087 18.3334 14.1667 18.3334H5.83335C5.39133 18.3334 4.9674 18.1578 4.65484 17.8452C4.34228 17.5327 4.16669 17.1087 4.16669 16.6667V5.00004H15.8334Z\"\r\n stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Add New Metric Button -->\r\n <button class=\"btn-add-metric\" (click)=\"addMetric()\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10 4.16699V15.8337M4.16669 10.0003H15.8334\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n Add New Metric\r\n </button>\r\n\r\n </div>\r\n\r\n</div>\r\n", styles: [".add-manage-cohort{padding:24px;background-color:#f5f7fa;min-height:100vh;position:relative}.add-manage-cohort .confirm-modal-overlay{position:fixed;inset:0;background:#10182880;z-index:9999;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:fadeIn .2s ease}.add-manage-cohort .confirm-modal{background:#fff;border-radius:16px;padding:36px 32px;max-width:440px;width:90%;box-shadow:0 24px 48px -12px #1018282e;text-align:center;animation:slideUp .25s ease}.add-manage-cohort .confirm-modal .confirm-modal-icon{margin-bottom:20px}.add-manage-cohort .confirm-modal .confirm-modal-title{font-size:20px;font-weight:700;color:#101828;margin-bottom:8px}.add-manage-cohort .confirm-modal .confirm-modal-message{font-size:14px;color:#667085;line-height:22px;margin-bottom:28px}.add-manage-cohort .confirm-modal .confirm-modal-actions{display:flex;gap:12px;justify-content:center}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-cancel-modal{flex:1;padding:10px 20px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-cancel-modal:hover{background:#f5f7fa}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-confirm-modal{flex:1;padding:10px 20px;border:none;border-radius:8px;background:#2196f3;font-size:14px;font-weight:600;color:#fff;cursor:pointer;transition:background .2s}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-confirm-modal:hover{background:#1976d2}.add-manage-cohort .cohort-toast{position:fixed;bottom:32px;right:32px;z-index:10000;display:flex;align-items:center;gap:10px;padding:14px 20px;border-radius:10px;background:#12b76a;color:#fff;font-size:14px;font-weight:600;box-shadow:0 8px 24px #00000026;opacity:0;transform:translateY(12px);transition:opacity .3s ease,transform .3s ease;pointer-events:none}.add-manage-cohort .cohort-toast.visible{opacity:1;transform:translateY(0);pointer-events:auto}.add-manage-cohort .view-disabled{opacity:.7;pointer-events:none;cursor:not-allowed}.add-manage-cohort input:disabled,.add-manage-cohort input[disabled]{background:#f9fafb!important;color:#667085!important;cursor:not-allowed;border-color:#eaecf0!important}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{transform:translateY(16px);opacity:0}to{transform:translateY(0);opacity:1}}.add-manage-cohort .top-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:24px;background:#fff;border:1px solid #e8edf3;border-radius:8px;padding:16px 24px}.add-manage-cohort .top-header-left .header-badge{font-size:12px;font-weight:500;color:#667085}.add-manage-cohort .top-header-left .header-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#667085}.add-manage-cohort .top-header-left .header-subtitle{font-size:14px;color:#667085;margin:0}.add-manage-cohort .top-header-actions{display:flex;align-items:center;gap:10px}.add-manage-cohort .btn-draft{padding:8px 20px;border:1px solid #d0d5dd;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s;white-space:nowrap}.add-manage-cohort .btn-draft:hover{background:#f5f7fa}.add-manage-cohort .btn-submit{padding:8px 24px;border:none;border-radius:8px;background:#2196f3;font-size:14px;font-weight:600;color:#fff;cursor:pointer;transition:background .2s;white-space:nowrap}.add-manage-cohort .btn-submit:hover{background:#1976d2}.add-manage-cohort .form-body{opacity:1;gap:24px;border-radius:16px;padding:24px;background:#fff;margin:0 auto}.add-manage-cohort .form-field{margin-bottom:20px}.add-manage-cohort .form-field .field-label{display:block;font-size:14px;font-weight:600;color:#344054;margin-bottom:6px}.add-manage-cohort .form-input{width:100%;padding:12px 16px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;color:#1a2b4b;background:#fff;outline:none;transition:border-color .2s}.add-manage-cohort .form-input::placeholder{color:#98a2b3}.add-manage-cohort .form-input:focus{border-color:#2196f3}.add-manage-cohort .form-input--indent{padding-left:24px}.add-manage-cohort .form-select-custom{padding:12px 16px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;color:#1a2b4b;background:#fff;outline:none;min-width:240px;cursor:pointer;transition:border-color .2s;appearance:auto}.add-manage-cohort .form-select-custom:focus{border-color:#2196f3}.add-manage-cohort .multi-select-container{position:relative;width:100%}.add-manage-cohort .multi-select-container .multi-select-trigger{display:flex;justify-content:space-between;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:12px 16px;cursor:pointer;font-size:14px;color:#101828;box-shadow:0 1px 2px #1018280d}.add-manage-cohort .multi-select-container .multi-select-trigger svg{transition:transform .2s ease}.add-manage-cohort .multi-select-container .multi-select-trigger svg.rotate{transform:rotate(180deg)}.add-manage-cohort .multi-select-container .multi-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:100;background:#fff;border:1px solid #D0D5DD;border-radius:8px;margin-top:4px;padding:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box{padding:8px;border-bottom:1px solid #F2F4F7;margin-bottom:4px}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box input{width:100%;height:36px;padding:8px 12px;border:1px solid #D0D5DD;border-radius:6px;font-size:13px;outline:none}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box input:focus{border-color:#00a3ff;box-shadow:0 0 0 2px #00a3ff1a}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:6px;cursor:pointer;transition:background .2s}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option:hover{background:#f9fafb}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option input[type=checkbox]{width:18px!important;height:18px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--primary-600, #00A3FF)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:var(--primary-50, #EAF8FF);position:relative}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option input[type=checkbox]:checked:after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:block;width:5px;height:10px;margin:0;padding:0;box-sizing:border-box}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option span{font-size:14px;color:#344054}.add-manage-cohort .custom-select-container{position:relative;width:100%}.add-manage-cohort .custom-select-container .custom-select-trigger{display:flex;justify-content:space-between;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:12px 16px;cursor:pointer;font-size:14px;color:#101828;box-shadow:0 1px 2px #1018280d}.add-manage-cohort .custom-select-container .custom-select-trigger svg{transition:transform .2s ease}.add-manage-cohort .custom-select-container .custom-select-trigger svg.rotate{transform:rotate(180deg)}.add-manage-cohort .custom-select-container .custom-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:100;background:#fff;border:1px solid #D0D5DD;border-radius:8px;margin-top:4px;padding:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:6px;cursor:pointer;transition:background .2s}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option:hover{background:#f9fafb}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option span{font-size:14px;color:#344054}.add-manage-cohort .metric-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px 24px;margin-bottom:16px;margin-top:20px}.add-manage-cohort .metric-header-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:12px;border-bottom:1px solid #eaecf0}.add-manage-cohort .metric-header-row .metric-title{margin:0;font-size:18px;font-weight:600;color:#101828;border-bottom:none;padding-bottom:0}.add-manage-cohort .metric-title{font-size:16px;font-weight:700;color:#1a2b4b;margin:0 0 16px;padding-bottom:12px;border-bottom:1px solid #eaecf0}.add-manage-cohort .context-header{display:flex;align-items:flex-start;justify-content:space-between;margin-top:16px;margin-bottom:16px;padding-top:12px;border-top:1px solid #eaecf0;flex-wrap:wrap;gap:12px}.add-manage-cohort .context-header-left .context-label{font-size:14px;font-weight:700;color:#1a2b4b;display:block;margin-bottom:2px}.add-manage-cohort .context-header-left .context-sublabel{font-size:12px;color:#667085}.add-manage-cohort .context-header-right{display:flex;align-items:center;gap:16px}.add-manage-cohort .toggle-label{display:flex;align-items:center;gap:8px;cursor:pointer}.add-manage-cohort .toggle-label .toggle-text{font-size:13px;color:#667085;font-weight:500}.add-manage-cohort .toggle-switch{position:relative;display:inline-block;width:36px;height:20px}.add-manage-cohort .toggle-switch input{opacity:0;width:0;height:0}.add-manage-cohort .toggle-switch .toggle-slider{position:absolute;cursor:pointer;inset:0;background-color:#d0d5dd;border-radius:20px;transition:.3s}.add-manage-cohort .toggle-switch .toggle-slider:before{content:\"\";position:absolute;height:16px;width:16px;left:2px;bottom:2px;background-color:#fff;border-radius:50%;transition:.3s}.add-manage-cohort .toggle-switch input:checked+.toggle-slider{background-color:#2196f3}.add-manage-cohort .toggle-switch input:checked+.toggle-slider:before{transform:translate(16px)}.add-manage-cohort .btn-add-context{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;border:1px solid #d0d5dd;border-radius:6px;background:#fff;font-size:13px;font-weight:500;color:#344054;cursor:pointer;transition:background .2s,opacity .2s}.add-manage-cohort .btn-add-context:hover:not(:disabled){background:#f5f7fa}.add-manage-cohort .btn-add-context:disabled{opacity:.45;cursor:not-allowed}.add-manage-cohort .min-max-checkbox{margin:12px 0}.add-manage-cohort .min-max-checkbox .checkbox-label{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:14px;font-weight:500;color:#344054}.add-manage-cohort .min-max-checkbox .checkbox-label input[type=checkbox]{width:18px!important;height:18px!important;margin:-4px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--primary-600, #00A3FF)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:var(--primary-50, #EAF8FF);position:relative}.add-manage-cohort .min-max-checkbox .checkbox-label input[type=checkbox]:checked:after{content:\"\";position:absolute;left:50%;top:40%;transform:translate(-50%,-50%) rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:block;width:5px;height:10px;margin:0;padding:0;box-sizing:border-box}.add-manage-cohort .numerical-section{display:flex;gap:24px;margin-bottom:16px;padding:12px 0}.add-manage-cohort .stepper-group .stepper-label{display:block;font-size:12px;font-weight:500;color:#667085;margin-bottom:6px}.add-manage-cohort .stepper-control{display:inline-flex;align-items:center;border:1px solid #d0d5dd;border-radius:8px;overflow:hidden;background:#fff}.add-manage-cohort .stepper-btn{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border:none;background:#fff;font-size:16px;font-weight:500;color:#344054;cursor:pointer;transition:background .15s}.add-manage-cohort .stepper-btn:hover{background:#f2f4f7}.add-manage-cohort .stepper-value{min-width:40px;text-align:center;font-size:14px;font-weight:600;color:#1a2b4b;padding:0 4px}.add-manage-cohort .context-item-container{margin-bottom:20px}.add-manage-cohort .context-item{border:1px solid #e8edf3;border-radius:12px;padding:24px;margin-bottom:12px;background:#fff;box-shadow:0 1px 3px #1018281a}.add-manage-cohort .context-item-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.add-manage-cohort .context-item-title{font-size:14px;font-weight:700;color:#1a2b4b}.add-manage-cohort .context-remove-btn{background:none;border:none;padding:2px;cursor:pointer;color:#667085;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:background .15s}.add-manage-cohort .context-remove-btn:hover{background:#f2f4f7}.add-manage-cohort .context-fields{display:flex;flex-direction:column;gap:10px}.add-manage-cohort .context-row{display:flex;gap:12px;align-items:center}.add-manage-cohort .context-input{flex:1}.add-manage-cohort .context-select{min-width:180px}.add-manage-cohort .suggested-desc-section{background:#f9fafb;border-radius:8px;padding:16px;margin-top:20px}.add-manage-cohort .suggested-desc-section .suggested-title{font-size:13px;font-weight:600;color:#475467;margin-bottom:12px}.add-manage-cohort .suggested-desc-section .suggested-chips{display:flex;flex-wrap:wrap;gap:8px}.add-manage-cohort .suggested-desc-section .suggested-chips .suggested-chip{background:#fff;border:1px solid #D0D5DD;border-radius:6px;padding:6px 12px;font-size:12px;color:#344054;cursor:pointer;transition:all .2s}.add-manage-cohort .suggested-desc-section .suggested-chips .suggested-chip:hover{border-color:#00a3ff;color:#00a3ff;background:#eaf8ff}.add-manage-cohort .metric-footer{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid #eaecf0}.add-manage-cohort .metric-action-btn{background:none;border:none;padding:6px;border-radius:6px;cursor:pointer;color:#667085;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.add-manage-cohort .metric-action-btn:hover{background:#f2f4f7;color:#344054}.add-manage-cohort .metric-action-btn:disabled{opacity:.35;cursor:not-allowed}.add-manage-cohort .metric-delete-btn:hover:not(:disabled){background:#fef3f2;color:#d92d20}.add-manage-cohort .metric-delete-btn:hover:not(:disabled) svg path{stroke:#d92d20}.add-manage-cohort .btn-add-metric{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:14px;border:1px dashed #d0d5dd;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s,border-color .2s;margin-top:8px}.add-manage-cohort .btn-add-metric:hover{border-color:#2196f3}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
472
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddManageCohortComponent, selector: "lib-add-manage-cohort", host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div class=\"add-manage-cohort\">\r\n\r\n <!-- \u2500\u2500 Numerical Confirm Modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"confirm-modal-overlay\" *ngIf=\"showNumericalConfirmModal\" (click)=\"cancelNumericalToggle()\">\r\n <div class=\"confirm-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"confirm-modal-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#FEF3C7\" />\r\n <path d=\"M20 13V21M20 27H20.01\" stroke=\"#D97706\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h3 class=\"confirm-modal-title\">Enable Numerical Value</h3>\r\n <p class=\"confirm-modal-message\">Context you added will be removed from the metric by enabling the numerical value. Are you sure to proceed?</p>\r\n <div class=\"confirm-modal-actions\">\r\n <button class=\"btn-cancel-modal\" (click)=\"cancelNumericalToggle()\">Cancel</button>\r\n <button class=\"btn-confirm-modal\" (click)=\"confirmNumericalToggle()\">Yes, Proceed</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Confirmation Modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"confirm-modal-overlay\" *ngIf=\"showConfirmModal\" (click)=\"cancelConfirm()\">\r\n <div class=\"confirm-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"confirm-modal-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#FEF3C7\" />\r\n <path d=\"M20 13V21M20 27H20.01\" stroke=\"#D97706\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h3 class=\"confirm-modal-title\">{{ confirmTitle }}</h3>\r\n <p class=\"confirm-modal-message\">{{ confirmMessage }}</p>\r\n <div class=\"confirm-modal-actions\">\r\n <button class=\"btn-cancel-modal\" (click)=\"cancelConfirm()\">Cancel</button>\r\n <button class=\"btn-confirm-modal\" (click)=\"confirmProceed()\">Yes, Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Toast Notification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"cohort-toast\" [class.visible]=\"toastVisible\" [class.toast-success]=\"toastType==='success'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M10 18.3333C14.6024 18.3333 18.3333 14.6024 18.3333 10C18.3333 5.39763 14.6024 1.66667 10 1.66667C5.39763 1.66667 1.66667 5.39763 1.66667 10C1.66667 14.6024 5.39763 18.3333 10 18.3333Z\"\r\n stroke=\"white\" stroke-width=\"1.66667\" />\r\n <path d=\"M7.5 10L9.16667 11.6667L12.5 8.33333\" stroke=\"white\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n {{ toastMessage }}\r\n </div>\r\n\r\n <!-- \u2500\u2500 Top Header Bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"top-header\">\r\n <div class=\"top-header-left\">\r\n <button class=\"btn-back\" (click)=\"goBack()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M15.8333 10H4.16667M4.16667 10L10 15.8333M4.16667 10L10 4.16667\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n <div>\r\n <h4 class=\"header-title\">{{ headerTitle }}</h4>\r\n <p class=\"header-subtitle\">{{ headerSubtitle }}</p>\r\n </div>\r\n </div>\r\n <div class=\"top-header-actions my-3\">\r\n <!-- View Mode: only show Edit button -->\r\n <ng-container *ngIf=\"isViewMode\">\r\n <button class=\"btn btn-outline btn-default\" (click)=\"switchToEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_2398_367)\">\r\n <path\r\n d=\"M14.168 2.49993C14.3868 2.28106 14.6467 2.10744 14.9326 1.98899C15.2186 1.87054 15.5251 1.80957 15.8346 1.80957C16.1442 1.80957 16.4507 1.87054 16.7366 1.98899C17.0226 2.10744 17.2824 2.28106 17.5013 2.49993C17.7202 2.7188 17.8938 2.97863 18.0122 3.2646C18.1307 3.55057 18.1917 3.85706 18.1917 4.16659C18.1917 4.47612 18.1307 4.78262 18.0122 5.06859C17.8938 5.35455 17.7202 5.61439 17.5013 5.83326L6.2513 17.0833L1.66797 18.3333L2.91797 13.7499L14.168 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2398_367\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit Cohort\r\n </button>\r\n </ng-container>\r\n <!-- Create / Edit Mode: Save Draft + Submit -->\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <!-- <button class=\"btn-draft\" (click)=\"saveDraft()\">Save As Draft</button> -->\r\n <button class=\"btn-submit\" (click)=\"submit()\">Submit</button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Form Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"form-body\">\r\n\r\n <!-- Cohort Name -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Cohort Name</label>\r\n <input type=\"text\" class=\"form-input\" placeholder=\"Enter Cohort Name\" [(ngModel)]=\"cohortName\"\r\n [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Cohort Description -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Cohort Description</label>\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Cohort description...\"\r\n [(ngModel)]=\"cohortDescription\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Source Multi-select Dropdown -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Select Source</label>\r\n <div class=\"multi-select-container w-50\" [class.view-disabled]=\"isViewMode\">\r\n <div class=\"multi-select-trigger\" (click)=\"!isViewMode && toggleSourceDropdown()\">\r\n <span>{{ sourceDisplay }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n [class.rotate]=\"isSourceDropdownOpen\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"multi-select-dropdown\" *ngIf=\"isSourceDropdownOpen\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"search-box p-2\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Source...\"\r\n [(ngModel)]=\"sourceSearchText\" (ngModelChange)=\"filterSources()\" />\r\n </div>\r\n <div class=\"multi-select-option\" (click)=\"selectAllSources()\">\r\n <input type=\"checkbox\" [checked]=\"selectedSources.length === sourceOptions.length\" readonly />\r\n <span>Select All</span>\r\n </div>\r\n <div class=\"multi-select-option\" *ngFor=\"let s of filteredSourceOptions\" (click)=\"toggleSource(s)\">\r\n <input type=\"checkbox\" [checked]=\"isSourceSelected(s)\" readonly />\r\n <span>{{ s.label }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Metrics \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"metric-card\" *ngFor=\"let metric of metrics; let mi = index\">\r\n\r\n <div class=\"metric-header-row\">\r\n <h5 class=\"metric-title\">Metric {{ mi + 1 }}</h5>\r\n\r\n </div>\r\n\r\n <!-- Metric Name -->\r\n <div class=\"form-field\">\r\n <input type=\"text\" class=\"form-input\" placeholder=\"Enter Metric Name\" [(ngModel)]=\"metric.name\"\r\n [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Metric Description -->\r\n <div class=\"form-field\">\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Description...\"\r\n [(ngModel)]=\"metric.description\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Provide Context Header -->\r\n <div class=\"context-header\">\r\n <div class=\"context-header-left\">\r\n <span class=\"context-label\">Provide Context</span>\r\n <span class=\"context-sublabel\">Check whether the following are discussed</span>\r\n </div>\r\n <div class=\"context-header-right\">\r\n <label class=\"toggle-label\">\r\n <span class=\"toggle-text\">Numerical Value</span>\r\n <label class=\"toggle-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"metric.numericalValue\" [disabled]=\"isViewMode\"\r\n (ngModelChange)=\"onNumericalToggle(mi)\" />\r\n <span class=\"toggle-slider\"></span>\r\n </label>\r\n </label>\r\n <button class=\"btn-add-context\" (click)=\"addContext(mi)\" [disabled]=\"isViewMode || metric.numericalValue\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33337V12.6667M3.33334 8.00004H12.6667\" stroke=\"#344054\" stroke-width=\"1.33\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n Add New\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Numerical Section (shown when toggle is ON) \u2500\u2500 -->\r\n <ng-container *ngIf=\"metric.numericalValue\">\r\n <div class=\"min-max-checkbox\">\r\n <label class=\"checkbox-label\">\r\n <input type=\"checkbox\" [(ngModel)]=\"metric.minMaxEnabled\" [disabled]=\"isViewMode\" />\r\n <span>Min and Max Range Validation</span>\r\n </label>\r\n </div>\r\n <div class=\"numerical-section\" *ngIf=\"metric.minMaxEnabled\">\r\n <div class=\"stepper-group\">\r\n <span class=\"stepper-label\">Min Value</span>\r\n <div class=\"stepper-control\">\r\n <button class=\"stepper-btn\" (click)=\"decrementMin(mi)\" [disabled]=\"isViewMode\">\u2014</button>\r\n <span class=\"stepper-value\">{{ metric.minValue }}</span>\r\n <button class=\"stepper-btn\" (click)=\"incrementMin(mi)\" [disabled]=\"isViewMode\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"stepper-group\">\r\n <span class=\"stepper-label\">Max Value</span>\r\n <div class=\"stepper-control\">\r\n <button class=\"stepper-btn\" (click)=\"decrementMax(mi)\" [disabled]=\"isViewMode\">\u2014</button>\r\n <span class=\"stepper-value\">{{ metric.maxValue }}</span>\r\n <button class=\"stepper-btn\" (click)=\"incrementMax(mi)\" [disabled]=\"isViewMode\">+</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Context Items (hidden when numerical value is ON) -->\r\n <ng-container *ngIf=\"!metric.numericalValue\">\r\n <div class=\"context-item-container\" *ngFor=\"let ctx of metric.contexts; let ci = index\">\r\n <div class=\"context-item\">\r\n <div class=\"context-item-header\">\r\n <span class=\"context-item-title\">Context {{ ci + 1 }} Details</span>\r\n <button class=\"context-remove-btn\" (click)=\"removeContext(mi, ci)\" title=\"Remove context\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"context-fields\">\r\n <div class=\"context-row\">\r\n <input type=\"text\" class=\"form-input context-input\" placeholder=\"Enter Context\"\r\n [(ngModel)]=\"ctx.context\" [disabled]=\"isViewMode\"\r\n (keyup.enter)=\"fetchSuggestions(mi, ci)\" />\r\n\r\n <!-- Custom Single-select Weightage -->\r\n <div class=\"custom-select-container w-25 context-select\" [class.view-disabled]=\"isViewMode\"\r\n [class.is-invalid]=\"ctx.weightageError\">\r\n <div class=\"custom-select-trigger\"\r\n (click)=\"!isViewMode && toggleWeightageDropdown(mi, ci)\">\r\n <span>{{ ctx.weightage || 'Select Weightage' }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\" [class.rotate]=\"ctx.isWeightageOpen\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"custom-select-dropdown\" *ngIf=\"ctx.isWeightageOpen\">\r\n <div class=\"custom-select-option\" *ngFor=\"let w of weightageOptions\"\r\n (click)=\"selectWeightage(mi, ci, w)\">\r\n <span>{{ w }}</span>\r\n </div>\r\n </div>\r\n <span class=\"field-error mt-2\" *ngIf=\"ctx.weightageError\">Weightage is required.</span>\r\n </div>\r\n </div>\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Description\"\r\n [(ngModel)]=\"ctx.description\" (keyup.enter)=\"fetchSuggestions(mi, ci)\"\r\n [disabled]=\"isViewMode\" [class.is-invalid]=\"ctx.descriptionError\"\r\n (ngModelChange)=\"ctx.descriptionError = false\" />\r\n <span class=\"field-error\" *ngIf=\"ctx.descriptionError\">Description is required.</span>\r\n </div>\r\n\r\n <!-- Suggested Descriptions Section (hidden in view mode) -->\r\n <div class=\"suggested-desc-section mt-3\" *ngIf=\"!isViewMode && (ctx.isSuggestionLoading || (ctx.suggestions && ctx.suggestions.length > 0))\">\r\n <p class=\"suggested-title\">Try the suggested descriptions</p>\r\n <div class=\"suggested-chips\" *ngIf=\"ctx.isSuggestionLoading\">\r\n <span class=\"suggested-chip loading\">Loading...</span>\r\n </div>\r\n <div class=\"suggested-chips\" *ngIf=\"!ctx.isSuggestionLoading && ctx.suggestions && ctx.suggestions.length > 0\">\r\n <span class=\"suggested-chip\" *ngFor=\"let suggestion of ctx.suggestions\"\r\n (click)=\"patchSuggestedDescription(mi, ci, suggestion.text)\"\r\n [title]=\"suggestion.category\">\r\n {{ suggestion.text }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Metric Footer Actions -->\r\n <div class=\"metric-footer\">\r\n <button class=\"metric-action-btn\" title=\"Duplicate Metric\" (click)=\"duplicateMetric(mi)\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <rect x=\"6.66669\" y=\"6.66663\" width=\"11.6667\" height=\"11.6667\" rx=\"2\" stroke=\"#667085\"\r\n stroke-width=\"1.5\" />\r\n <path\r\n d=\"M3.33331 13.3333H2.49998C2.05795 13.3333 1.63403 13.1577 1.32147 12.8452C1.00891 12.5326 0.833313 12.1087 0.833313 11.6666V2.49996C0.833313 2.05793 1.00891 1.63401 1.32147 1.32145C1.63403 1.00889 2.05795 0.833293 2.49998 0.833293H11.6666C12.1087 0.833293 12.5326 1.00889 12.8452 1.32145C13.1577 1.63401 13.3333 2.05793 13.3333 2.49996V3.33329\"\r\n stroke=\"#667085\" stroke-width=\"1.5\" />\r\n </svg>\r\n </button>\r\n <button class=\"metric-action-btn metric-delete-btn\" title=\"Delete Metric\" (click)=\"removeMetric(mi)\"\r\n [disabled]=\"isViewMode || metrics.length <= 1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M2.5 5H4.16667H17.5\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M6.66669 5.00004V3.33337C6.66669 2.89135 6.84228 2.46742 7.15484 2.15486C7.4674 1.8423 7.89133 1.66671 8.33335 1.66671H11.6667C12.1087 1.66671 12.5326 1.8423 12.8452 2.15486C13.1578 2.46742 13.3334 2.89135 13.3334 3.33337V5.00004M15.8334 5.00004V16.6667C15.8334 17.1087 15.6578 17.5327 15.3452 17.8452C15.0326 18.1578 14.6087 18.3334 14.1667 18.3334H5.83335C5.39133 18.3334 4.9674 18.1578 4.65484 17.8452C4.34228 17.5327 4.16669 17.1087 4.16669 16.6667V5.00004H15.8334Z\"\r\n stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Add New Metric Button -->\r\n <button class=\"btn-add-metric\" (click)=\"addMetric()\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10 4.16699V15.8337M4.16669 10.0003H15.8334\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n Add New Metric\r\n </button>\r\n\r\n </div>\r\n\r\n</div>\r\n", styles: [".add-manage-cohort{padding:24px;background-color:#f5f7fa;min-height:100vh;position:relative}.add-manage-cohort .confirm-modal-overlay{position:fixed;inset:0;background:#10182880;z-index:9999;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:fadeIn .2s ease}.add-manage-cohort .confirm-modal{background:#fff;border-radius:16px;padding:36px 32px;max-width:440px;width:90%;box-shadow:0 24px 48px -12px #1018282e;text-align:center;animation:slideUp .25s ease}.add-manage-cohort .confirm-modal .confirm-modal-icon{margin-bottom:20px}.add-manage-cohort .confirm-modal .confirm-modal-title{font-size:20px;font-weight:700;color:#101828;margin-bottom:8px}.add-manage-cohort .confirm-modal .confirm-modal-message{font-size:14px;color:#667085;line-height:22px;margin-bottom:28px}.add-manage-cohort .confirm-modal .confirm-modal-actions{display:flex;gap:12px;justify-content:center}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-cancel-modal{flex:1;padding:10px 20px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-cancel-modal:hover{background:#f5f7fa}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-confirm-modal{flex:1;padding:10px 20px;border:none;border-radius:8px;background:#2196f3;font-size:14px;font-weight:600;color:#fff;cursor:pointer;transition:background .2s}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-confirm-modal:hover{background:#1976d2}.add-manage-cohort .cohort-toast{position:fixed;bottom:32px;right:32px;z-index:10000;display:flex;align-items:center;gap:10px;padding:14px 20px;border-radius:10px;background:#12b76a;color:#fff;font-size:14px;font-weight:600;box-shadow:0 8px 24px #00000026;opacity:0;transform:translateY(12px);transition:opacity .3s ease,transform .3s ease;pointer-events:none}.add-manage-cohort .cohort-toast.visible{opacity:1;transform:translateY(0);pointer-events:auto}.add-manage-cohort .view-disabled{opacity:.7;pointer-events:none;cursor:not-allowed}.add-manage-cohort input:disabled,.add-manage-cohort input[disabled]{background:#f9fafb!important;color:#667085!important;cursor:not-allowed;border-color:#eaecf0!important}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{transform:translateY(16px);opacity:0}to{transform:translateY(0);opacity:1}}.add-manage-cohort .top-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:24px;background:#fff;border:1px solid #e8edf3;border-radius:8px;padding:16px 24px}.add-manage-cohort .top-header-left{display:flex;align-items:center;gap:12px}.add-manage-cohort .top-header-left .header-badge{font-size:12px;font-weight:500;color:#667085}.add-manage-cohort .top-header-left .header-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#667085}.add-manage-cohort .top-header-left .header-subtitle{font-size:14px;color:#667085;margin:0}.add-manage-cohort .btn-back{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid #d0d5dd;border-radius:8px;background:#fff;cursor:pointer;flex-shrink:0}.add-manage-cohort .btn-back:hover{background:#f9fafb;border-color:#98a2b3}.add-manage-cohort .top-header-actions{display:flex;align-items:center;gap:10px}.add-manage-cohort .btn-draft{padding:8px 20px;border:1px solid #d0d5dd;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s;white-space:nowrap}.add-manage-cohort .btn-draft:hover{background:#f5f7fa}.add-manage-cohort .btn-submit{padding:8px 24px;border:none;border-radius:8px;background:#2196f3;font-size:14px;font-weight:600;color:#fff;cursor:pointer;transition:background .2s;white-space:nowrap}.add-manage-cohort .btn-submit:hover{background:#1976d2}.add-manage-cohort .form-body{opacity:1;gap:24px;border-radius:16px;padding:24px;background:#fff;margin:0 auto}.add-manage-cohort .form-field{margin-bottom:20px}.add-manage-cohort .form-field .field-label{display:block;font-size:14px;font-weight:600;color:#344054;margin-bottom:6px}.add-manage-cohort .form-input{width:100%;padding:12px 16px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;color:#1a2b4b;background:#fff;outline:none;transition:border-color .2s}.add-manage-cohort .form-input::placeholder{color:#98a2b3}.add-manage-cohort .form-input:focus{border-color:#2196f3}.add-manage-cohort .form-input--indent{padding-left:24px}.add-manage-cohort .form-select-custom{padding:12px 16px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;color:#1a2b4b;background:#fff;outline:none;min-width:240px;cursor:pointer;transition:border-color .2s;appearance:auto}.add-manage-cohort .form-select-custom:focus{border-color:#2196f3}.add-manage-cohort .multi-select-container{position:relative;width:100%}.add-manage-cohort .multi-select-container .multi-select-trigger{display:flex;justify-content:space-between;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:12px 16px;cursor:pointer;font-size:14px;color:#101828;box-shadow:0 1px 2px #1018280d}.add-manage-cohort .multi-select-container .multi-select-trigger svg{transition:transform .2s ease}.add-manage-cohort .multi-select-container .multi-select-trigger svg.rotate{transform:rotate(180deg)}.add-manage-cohort .multi-select-container .multi-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:100;background:#fff;border:1px solid #D0D5DD;border-radius:8px;margin-top:4px;padding:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box{padding:8px;border-bottom:1px solid #F2F4F7;margin-bottom:4px}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box input{width:100%;height:36px;padding:8px 12px;border:1px solid #D0D5DD;border-radius:6px;font-size:13px;outline:none}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box input:focus{border-color:#00a3ff;box-shadow:0 0 0 2px #00a3ff1a}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:6px;cursor:pointer;transition:background .2s}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option:hover{background:#f9fafb}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option input[type=checkbox]{width:18px!important;height:18px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--primary-600, #00A3FF)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:var(--primary-50, #EAF8FF);position:relative}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option input[type=checkbox]:checked:after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:block;width:5px;height:10px;margin:0;padding:0;box-sizing:border-box}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option span{font-size:14px;color:#344054}.add-manage-cohort .custom-select-container{position:relative;width:100%}.add-manage-cohort .custom-select-container .custom-select-trigger{display:flex;justify-content:space-between;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:12px 16px;cursor:pointer;font-size:14px;color:#101828;box-shadow:0 1px 2px #1018280d}.add-manage-cohort .custom-select-container .custom-select-trigger svg{transition:transform .2s ease}.add-manage-cohort .custom-select-container .custom-select-trigger svg.rotate{transform:rotate(180deg)}.add-manage-cohort .custom-select-container .custom-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:100;background:#fff;border:1px solid #D0D5DD;border-radius:8px;margin-top:4px;padding:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:6px;cursor:pointer;transition:background .2s}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option:hover{background:#f9fafb}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option span{font-size:14px;color:#344054}.add-manage-cohort .metric-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px 24px;margin-bottom:16px;margin-top:20px}.add-manage-cohort .metric-header-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:12px;border-bottom:1px solid #eaecf0}.add-manage-cohort .metric-header-row .metric-title{margin:0;font-size:18px;font-weight:600;color:#101828;border-bottom:none;padding-bottom:0}.add-manage-cohort .metric-title{font-size:16px;font-weight:700;color:#1a2b4b;margin:0 0 16px;padding-bottom:12px;border-bottom:1px solid #eaecf0}.add-manage-cohort .context-header{display:flex;align-items:flex-start;justify-content:space-between;margin-top:16px;margin-bottom:16px;padding-top:12px;border-top:1px solid #eaecf0;flex-wrap:wrap;gap:12px}.add-manage-cohort .context-header-left .context-label{font-size:14px;font-weight:700;color:#1a2b4b;display:block;margin-bottom:2px}.add-manage-cohort .context-header-left .context-sublabel{font-size:12px;color:#667085}.add-manage-cohort .context-header-right{display:flex;align-items:center;gap:16px}.add-manage-cohort .toggle-label{display:flex;align-items:center;gap:8px;cursor:pointer}.add-manage-cohort .toggle-label .toggle-text{font-size:13px;color:#667085;font-weight:500}.add-manage-cohort .toggle-switch{position:relative;display:inline-block;width:36px;height:20px}.add-manage-cohort .toggle-switch input{opacity:0;width:0;height:0}.add-manage-cohort .toggle-switch .toggle-slider{position:absolute;cursor:pointer;inset:0;background-color:#d0d5dd;border-radius:20px;transition:.3s}.add-manage-cohort .toggle-switch .toggle-slider:before{content:\"\";position:absolute;height:16px;width:16px;left:2px;bottom:2px;background-color:#fff;border-radius:50%;transition:.3s}.add-manage-cohort .toggle-switch input:checked+.toggle-slider{background-color:#2196f3}.add-manage-cohort .toggle-switch input:checked+.toggle-slider:before{transform:translate(16px)}.add-manage-cohort .btn-add-context{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;border:1px solid #d0d5dd;border-radius:6px;background:#fff;font-size:13px;font-weight:500;color:#344054;cursor:pointer;transition:background .2s,opacity .2s}.add-manage-cohort .btn-add-context:hover:not(:disabled){background:#f5f7fa}.add-manage-cohort .btn-add-context:disabled{opacity:.45;cursor:not-allowed}.add-manage-cohort .min-max-checkbox{margin:12px 0}.add-manage-cohort .min-max-checkbox .checkbox-label{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:14px;font-weight:500;color:#344054}.add-manage-cohort .min-max-checkbox .checkbox-label input[type=checkbox]{width:18px!important;height:18px!important;margin:-4px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--primary-600, #00A3FF)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:var(--primary-50, #EAF8FF);position:relative}.add-manage-cohort .min-max-checkbox .checkbox-label input[type=checkbox]:checked:after{content:\"\";position:absolute;left:50%;top:40%;transform:translate(-50%,-50%) rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:block;width:5px;height:10px;margin:0;padding:0;box-sizing:border-box}.add-manage-cohort .numerical-section{display:flex;gap:24px;margin-bottom:16px;padding:12px 0}.add-manage-cohort .stepper-group .stepper-label{display:block;font-size:12px;font-weight:500;color:#667085;margin-bottom:6px}.add-manage-cohort .stepper-control{display:inline-flex;align-items:center;border:1px solid #d0d5dd;border-radius:8px;overflow:hidden;background:#fff}.add-manage-cohort .stepper-btn{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border:none;background:#fff;font-size:16px;font-weight:500;color:#344054;cursor:pointer;transition:background .15s}.add-manage-cohort .stepper-btn:hover{background:#f2f4f7}.add-manage-cohort .stepper-value{min-width:40px;text-align:center;font-size:14px;font-weight:600;color:#1a2b4b;padding:0 4px}.add-manage-cohort .context-item-container{margin-bottom:20px}.add-manage-cohort .context-item{border:1px solid #e8edf3;border-radius:12px;padding:24px;margin-bottom:12px;background:#fff;box-shadow:0 1px 3px #1018281a}.add-manage-cohort .context-item-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.add-manage-cohort .context-item-title{font-size:14px;font-weight:700;color:#1a2b4b}.add-manage-cohort .context-remove-btn{background:none;border:none;padding:2px;cursor:pointer;color:#667085;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:background .15s}.add-manage-cohort .context-remove-btn:hover{background:#f2f4f7}.add-manage-cohort .context-fields{display:flex;flex-direction:column;gap:10px}.add-manage-cohort .context-fields .field-error{font-size:12px;color:#d92d20;margin-top:-6px}.add-manage-cohort .context-fields .form-input.is-invalid,.add-manage-cohort .context-fields .custom-select-container.is-invalid .custom-select-trigger{border-color:#d92d20!important}.add-manage-cohort .context-row{display:flex;gap:12px;align-items:center}.add-manage-cohort .context-input{flex:1}.add-manage-cohort .context-select{min-width:180px}.add-manage-cohort .suggested-desc-section{background:#f9fafb;border-radius:8px;padding:16px;margin-top:20px}.add-manage-cohort .suggested-desc-section .suggested-title{font-size:13px;font-weight:600;color:#475467;margin-bottom:12px}.add-manage-cohort .suggested-desc-section .suggested-chips{display:flex;flex-wrap:wrap;gap:8px}.add-manage-cohort .suggested-desc-section .suggested-chips .suggested-chip{background:#fff;border:1px solid #D0D5DD;border-radius:6px;padding:6px 12px;font-size:12px;color:#344054;cursor:pointer;transition:all .2s}.add-manage-cohort .suggested-desc-section .suggested-chips .suggested-chip:hover{border-color:#00a3ff;color:#00a3ff;background:#eaf8ff}.add-manage-cohort .metric-footer{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid #eaecf0}.add-manage-cohort .metric-action-btn{background:none;border:none;padding:6px;border-radius:6px;cursor:pointer;color:#667085;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.add-manage-cohort .metric-action-btn:hover{background:#f2f4f7;color:#344054}.add-manage-cohort .metric-action-btn:disabled{opacity:.35;cursor:not-allowed}.add-manage-cohort .metric-delete-btn:hover:not(:disabled){background:#fef3f2;color:#d92d20}.add-manage-cohort .metric-delete-btn:hover:not(:disabled) svg path{stroke:#d92d20}.add-manage-cohort .btn-add-metric{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:14px;border:1px dashed #d0d5dd;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s,border-color .2s;margin-top:8px}.add-manage-cohort .btn-add-metric:hover{border-color:#2196f3}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
425
473
  }
426
474
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddManageCohortComponent, decorators: [{
427
475
  type: Component,
428
- args: [{ selector: 'lib-add-manage-cohort', template: "<div class=\"add-manage-cohort\">\r\n\r\n <!-- \u2500\u2500 Numerical Confirm Modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"confirm-modal-overlay\" *ngIf=\"showNumericalConfirmModal\" (click)=\"cancelNumericalToggle()\">\r\n <div class=\"confirm-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"confirm-modal-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#FEF3C7\" />\r\n <path d=\"M20 13V21M20 27H20.01\" stroke=\"#D97706\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h3 class=\"confirm-modal-title\">Enable Numerical Value</h3>\r\n <p class=\"confirm-modal-message\">Context you added will be removed from the metric by enabling the numerical value. Are you sure to proceed?</p>\r\n <div class=\"confirm-modal-actions\">\r\n <button class=\"btn-cancel-modal\" (click)=\"cancelNumericalToggle()\">Cancel</button>\r\n <button class=\"btn-confirm-modal\" (click)=\"confirmNumericalToggle()\">Yes, Proceed</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Confirmation Modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"confirm-modal-overlay\" *ngIf=\"showConfirmModal\" (click)=\"cancelConfirm()\">\r\n <div class=\"confirm-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"confirm-modal-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#FEF3C7\" />\r\n <path d=\"M20 13V21M20 27H20.01\" stroke=\"#D97706\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h3 class=\"confirm-modal-title\">{{ confirmTitle }}</h3>\r\n <p class=\"confirm-modal-message\">{{ confirmMessage }}</p>\r\n <div class=\"confirm-modal-actions\">\r\n <button class=\"btn-cancel-modal\" (click)=\"cancelConfirm()\">Cancel</button>\r\n <button class=\"btn-confirm-modal\" (click)=\"confirmProceed()\">Yes, Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Toast Notification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"cohort-toast\" [class.visible]=\"toastVisible\" [class.toast-success]=\"toastType==='success'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M10 18.3333C14.6024 18.3333 18.3333 14.6024 18.3333 10C18.3333 5.39763 14.6024 1.66667 10 1.66667C5.39763 1.66667 1.66667 5.39763 1.66667 10C1.66667 14.6024 5.39763 18.3333 10 18.3333Z\"\r\n stroke=\"white\" stroke-width=\"1.66667\" />\r\n <path d=\"M7.5 10L9.16667 11.6667L12.5 8.33333\" stroke=\"white\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n {{ toastMessage }}\r\n </div>\r\n\r\n <!-- \u2500\u2500 Top Header Bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"top-header\">\r\n <div class=\"top-header-left\">\r\n <h4 class=\"header-title\">{{ headerTitle }}</h4>\r\n <p class=\"header-subtitle\">{{ headerSubtitle }}</p>\r\n </div>\r\n <div class=\"top-header-actions my-3\">\r\n <!-- View Mode: only show Edit button -->\r\n <ng-container *ngIf=\"isViewMode\">\r\n <button class=\"btn btn-outline btn-default\" (click)=\"switchToEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_2398_367)\">\r\n <path\r\n d=\"M14.168 2.49993C14.3868 2.28106 14.6467 2.10744 14.9326 1.98899C15.2186 1.87054 15.5251 1.80957 15.8346 1.80957C16.1442 1.80957 16.4507 1.87054 16.7366 1.98899C17.0226 2.10744 17.2824 2.28106 17.5013 2.49993C17.7202 2.7188 17.8938 2.97863 18.0122 3.2646C18.1307 3.55057 18.1917 3.85706 18.1917 4.16659C18.1917 4.47612 18.1307 4.78262 18.0122 5.06859C17.8938 5.35455 17.7202 5.61439 17.5013 5.83326L6.2513 17.0833L1.66797 18.3333L2.91797 13.7499L14.168 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2398_367\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit Cohort\r\n </button>\r\n </ng-container>\r\n <!-- Create / Edit Mode: Save Draft + Submit -->\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <!-- <button class=\"btn-draft\" (click)=\"saveDraft()\">Save As Draft</button> -->\r\n <button class=\"btn-submit\" (click)=\"submit()\">Submit</button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Form Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"form-body\">\r\n\r\n <!-- Cohort Name -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Cohort Name</label>\r\n <input type=\"text\" class=\"form-input\" placeholder=\"Enter Cohort Name\" [(ngModel)]=\"cohortName\"\r\n [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Cohort Description -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Cohort Description</label>\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Cohort description...\"\r\n [(ngModel)]=\"cohortDescription\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Source Multi-select Dropdown -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Select Source</label>\r\n <div class=\"multi-select-container w-50\" [class.view-disabled]=\"isViewMode\">\r\n <div class=\"multi-select-trigger\" (click)=\"!isViewMode && toggleSourceDropdown()\">\r\n <span>{{ sourceDisplay }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n [class.rotate]=\"isSourceDropdownOpen\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"multi-select-dropdown\" *ngIf=\"isSourceDropdownOpen\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"search-box p-2\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Source...\"\r\n [(ngModel)]=\"sourceSearchText\" (ngModelChange)=\"filterSources()\" />\r\n </div>\r\n <div class=\"multi-select-option\" (click)=\"selectAllSources()\">\r\n <input type=\"checkbox\" [checked]=\"selectedSources.length === sourceOptions.length\" readonly />\r\n <span>Select All</span>\r\n </div>\r\n <div class=\"multi-select-option\" *ngFor=\"let s of filteredSourceOptions\" (click)=\"toggleSource(s)\">\r\n <input type=\"checkbox\" [checked]=\"isSourceSelected(s)\" readonly />\r\n <span>{{ s.label }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Metrics \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"metric-card\" *ngFor=\"let metric of metrics; let mi = index\">\r\n\r\n <div class=\"metric-header-row\">\r\n <h5 class=\"metric-title\">Metric {{ mi + 1 }}</h5>\r\n\r\n </div>\r\n\r\n <!-- Metric Name -->\r\n <div class=\"form-field\">\r\n <input type=\"text\" class=\"form-input\" placeholder=\"Enter Metric Name\" [(ngModel)]=\"metric.name\"\r\n [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Metric Description -->\r\n <div class=\"form-field\">\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Description...\"\r\n [(ngModel)]=\"metric.description\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Provide Context Header -->\r\n <div class=\"context-header\">\r\n <div class=\"context-header-left\">\r\n <span class=\"context-label\">Provide Context</span>\r\n <span class=\"context-sublabel\">Check whether the following are discussed</span>\r\n </div>\r\n <div class=\"context-header-right\">\r\n <label class=\"toggle-label\">\r\n <span class=\"toggle-text\">Numerical Value</span>\r\n <label class=\"toggle-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"metric.numericalValue\" [disabled]=\"isViewMode\"\r\n (ngModelChange)=\"onNumericalToggle(mi)\" />\r\n <span class=\"toggle-slider\"></span>\r\n </label>\r\n </label>\r\n <button class=\"btn-add-context\" (click)=\"addContext(mi)\" [disabled]=\"isViewMode || metric.numericalValue\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33337V12.6667M3.33334 8.00004H12.6667\" stroke=\"#344054\" stroke-width=\"1.33\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n Add New\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Numerical Section (shown when toggle is ON) \u2500\u2500 -->\r\n <ng-container *ngIf=\"metric.numericalValue\">\r\n <div class=\"min-max-checkbox\">\r\n <label class=\"checkbox-label\">\r\n <input type=\"checkbox\" [(ngModel)]=\"metric.minMaxEnabled\" [disabled]=\"isViewMode\" />\r\n <span>Min and Max Range Validation</span>\r\n </label>\r\n </div>\r\n <div class=\"numerical-section\" *ngIf=\"metric.minMaxEnabled\">\r\n <div class=\"stepper-group\">\r\n <span class=\"stepper-label\">Min Value</span>\r\n <div class=\"stepper-control\">\r\n <button class=\"stepper-btn\" (click)=\"decrementMin(mi)\" [disabled]=\"isViewMode\">\u2014</button>\r\n <span class=\"stepper-value\">{{ metric.minValue }}</span>\r\n <button class=\"stepper-btn\" (click)=\"incrementMin(mi)\" [disabled]=\"isViewMode\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"stepper-group\">\r\n <span class=\"stepper-label\">Max Value</span>\r\n <div class=\"stepper-control\">\r\n <button class=\"stepper-btn\" (click)=\"decrementMax(mi)\" [disabled]=\"isViewMode\">\u2014</button>\r\n <span class=\"stepper-value\">{{ metric.maxValue }}</span>\r\n <button class=\"stepper-btn\" (click)=\"incrementMax(mi)\" [disabled]=\"isViewMode\">+</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Context Items (hidden when numerical value is ON) -->\r\n <ng-container *ngIf=\"!metric.numericalValue\">\r\n <div class=\"context-item-container\" *ngFor=\"let ctx of metric.contexts; let ci = index\">\r\n <div class=\"context-item\">\r\n <div class=\"context-item-header\">\r\n <span class=\"context-item-title\">Context {{ ci + 1 }} Details</span>\r\n <button class=\"context-remove-btn\" (click)=\"removeContext(mi, ci)\" title=\"Remove context\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"context-fields\">\r\n <div class=\"context-row\">\r\n <input type=\"text\" class=\"form-input context-input\" placeholder=\"Enter Context\"\r\n [(ngModel)]=\"ctx.context\" [disabled]=\"isViewMode\" />\r\n\r\n <!-- Custom Single-select Weightage -->\r\n <div class=\"custom-select-container w-25 context-select\" [class.view-disabled]=\"isViewMode\">\r\n <div class=\"custom-select-trigger\"\r\n (click)=\"!isViewMode && toggleWeightageDropdown(mi, ci)\">\r\n <span>{{ ctx.weightage || 'Select Weightage' }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\" [class.rotate]=\"ctx.isWeightageOpen\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"custom-select-dropdown\" *ngIf=\"ctx.isWeightageOpen\">\r\n <div class=\"custom-select-option\" *ngFor=\"let w of weightageOptions\"\r\n (click)=\"selectWeightage(mi, ci, w)\">\r\n <span>{{ w }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Description\"\r\n [(ngModel)]=\"ctx.description\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Suggested Descriptions Section (hidden in view mode) -->\r\n <div class=\"suggested-desc-section mt-3\" *ngIf=\"!isViewMode\">\r\n <p class=\"suggested-title\">Try the suggested descriptions</p>\r\n <div class=\"suggested-chips\">\r\n <span class=\"suggested-chip\"\r\n (click)=\"patchSuggestedDescription(mi, ci, 'If the conversation has been done with the greetings from the start and end, then it is true.')\">\r\n If the conversation has been done with the greetings from the start and end, then it is\r\n true.\r\n </span>\r\n <span class=\"suggested-chip\"\r\n (click)=\"patchSuggestedDescription(mi, ci, 'Lorem ipsum dolor sit amet consectetur.')\">\r\n Lorem ipsum dolor sit amet consectetur.\r\n </span>\r\n <span class=\"suggested-chip\"\r\n (click)=\"patchSuggestedDescription(mi, ci, 'Fringilla leo eget nam nec arcu tristique tristique.')\">\r\n Fringilla leo eget nam nec arcu tristique tristique.\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Metric Footer Actions -->\r\n <div class=\"metric-footer\">\r\n <button class=\"metric-action-btn\" title=\"Duplicate Metric\" (click)=\"duplicateMetric(mi)\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <rect x=\"6.66669\" y=\"6.66663\" width=\"11.6667\" height=\"11.6667\" rx=\"2\" stroke=\"#667085\"\r\n stroke-width=\"1.5\" />\r\n <path\r\n d=\"M3.33331 13.3333H2.49998C2.05795 13.3333 1.63403 13.1577 1.32147 12.8452C1.00891 12.5326 0.833313 12.1087 0.833313 11.6666V2.49996C0.833313 2.05793 1.00891 1.63401 1.32147 1.32145C1.63403 1.00889 2.05795 0.833293 2.49998 0.833293H11.6666C12.1087 0.833293 12.5326 1.00889 12.8452 1.32145C13.1577 1.63401 13.3333 2.05793 13.3333 2.49996V3.33329\"\r\n stroke=\"#667085\" stroke-width=\"1.5\" />\r\n </svg>\r\n </button>\r\n <button class=\"metric-action-btn metric-delete-btn\" title=\"Delete Metric\" (click)=\"removeMetric(mi)\"\r\n [disabled]=\"isViewMode || metrics.length <= 1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M2.5 5H4.16667H17.5\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M6.66669 5.00004V3.33337C6.66669 2.89135 6.84228 2.46742 7.15484 2.15486C7.4674 1.8423 7.89133 1.66671 8.33335 1.66671H11.6667C12.1087 1.66671 12.5326 1.8423 12.8452 2.15486C13.1578 2.46742 13.3334 2.89135 13.3334 3.33337V5.00004M15.8334 5.00004V16.6667C15.8334 17.1087 15.6578 17.5327 15.3452 17.8452C15.0326 18.1578 14.6087 18.3334 14.1667 18.3334H5.83335C5.39133 18.3334 4.9674 18.1578 4.65484 17.8452C4.34228 17.5327 4.16669 17.1087 4.16669 16.6667V5.00004H15.8334Z\"\r\n stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Add New Metric Button -->\r\n <button class=\"btn-add-metric\" (click)=\"addMetric()\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10 4.16699V15.8337M4.16669 10.0003H15.8334\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n Add New Metric\r\n </button>\r\n\r\n </div>\r\n\r\n</div>\r\n", styles: [".add-manage-cohort{padding:24px;background-color:#f5f7fa;min-height:100vh;position:relative}.add-manage-cohort .confirm-modal-overlay{position:fixed;inset:0;background:#10182880;z-index:9999;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:fadeIn .2s ease}.add-manage-cohort .confirm-modal{background:#fff;border-radius:16px;padding:36px 32px;max-width:440px;width:90%;box-shadow:0 24px 48px -12px #1018282e;text-align:center;animation:slideUp .25s ease}.add-manage-cohort .confirm-modal .confirm-modal-icon{margin-bottom:20px}.add-manage-cohort .confirm-modal .confirm-modal-title{font-size:20px;font-weight:700;color:#101828;margin-bottom:8px}.add-manage-cohort .confirm-modal .confirm-modal-message{font-size:14px;color:#667085;line-height:22px;margin-bottom:28px}.add-manage-cohort .confirm-modal .confirm-modal-actions{display:flex;gap:12px;justify-content:center}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-cancel-modal{flex:1;padding:10px 20px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-cancel-modal:hover{background:#f5f7fa}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-confirm-modal{flex:1;padding:10px 20px;border:none;border-radius:8px;background:#2196f3;font-size:14px;font-weight:600;color:#fff;cursor:pointer;transition:background .2s}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-confirm-modal:hover{background:#1976d2}.add-manage-cohort .cohort-toast{position:fixed;bottom:32px;right:32px;z-index:10000;display:flex;align-items:center;gap:10px;padding:14px 20px;border-radius:10px;background:#12b76a;color:#fff;font-size:14px;font-weight:600;box-shadow:0 8px 24px #00000026;opacity:0;transform:translateY(12px);transition:opacity .3s ease,transform .3s ease;pointer-events:none}.add-manage-cohort .cohort-toast.visible{opacity:1;transform:translateY(0);pointer-events:auto}.add-manage-cohort .view-disabled{opacity:.7;pointer-events:none;cursor:not-allowed}.add-manage-cohort input:disabled,.add-manage-cohort input[disabled]{background:#f9fafb!important;color:#667085!important;cursor:not-allowed;border-color:#eaecf0!important}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{transform:translateY(16px);opacity:0}to{transform:translateY(0);opacity:1}}.add-manage-cohort .top-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:24px;background:#fff;border:1px solid #e8edf3;border-radius:8px;padding:16px 24px}.add-manage-cohort .top-header-left .header-badge{font-size:12px;font-weight:500;color:#667085}.add-manage-cohort .top-header-left .header-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#667085}.add-manage-cohort .top-header-left .header-subtitle{font-size:14px;color:#667085;margin:0}.add-manage-cohort .top-header-actions{display:flex;align-items:center;gap:10px}.add-manage-cohort .btn-draft{padding:8px 20px;border:1px solid #d0d5dd;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s;white-space:nowrap}.add-manage-cohort .btn-draft:hover{background:#f5f7fa}.add-manage-cohort .btn-submit{padding:8px 24px;border:none;border-radius:8px;background:#2196f3;font-size:14px;font-weight:600;color:#fff;cursor:pointer;transition:background .2s;white-space:nowrap}.add-manage-cohort .btn-submit:hover{background:#1976d2}.add-manage-cohort .form-body{opacity:1;gap:24px;border-radius:16px;padding:24px;background:#fff;margin:0 auto}.add-manage-cohort .form-field{margin-bottom:20px}.add-manage-cohort .form-field .field-label{display:block;font-size:14px;font-weight:600;color:#344054;margin-bottom:6px}.add-manage-cohort .form-input{width:100%;padding:12px 16px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;color:#1a2b4b;background:#fff;outline:none;transition:border-color .2s}.add-manage-cohort .form-input::placeholder{color:#98a2b3}.add-manage-cohort .form-input:focus{border-color:#2196f3}.add-manage-cohort .form-input--indent{padding-left:24px}.add-manage-cohort .form-select-custom{padding:12px 16px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;color:#1a2b4b;background:#fff;outline:none;min-width:240px;cursor:pointer;transition:border-color .2s;appearance:auto}.add-manage-cohort .form-select-custom:focus{border-color:#2196f3}.add-manage-cohort .multi-select-container{position:relative;width:100%}.add-manage-cohort .multi-select-container .multi-select-trigger{display:flex;justify-content:space-between;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:12px 16px;cursor:pointer;font-size:14px;color:#101828;box-shadow:0 1px 2px #1018280d}.add-manage-cohort .multi-select-container .multi-select-trigger svg{transition:transform .2s ease}.add-manage-cohort .multi-select-container .multi-select-trigger svg.rotate{transform:rotate(180deg)}.add-manage-cohort .multi-select-container .multi-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:100;background:#fff;border:1px solid #D0D5DD;border-radius:8px;margin-top:4px;padding:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box{padding:8px;border-bottom:1px solid #F2F4F7;margin-bottom:4px}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box input{width:100%;height:36px;padding:8px 12px;border:1px solid #D0D5DD;border-radius:6px;font-size:13px;outline:none}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box input:focus{border-color:#00a3ff;box-shadow:0 0 0 2px #00a3ff1a}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:6px;cursor:pointer;transition:background .2s}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option:hover{background:#f9fafb}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option input[type=checkbox]{width:18px!important;height:18px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--primary-600, #00A3FF)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:var(--primary-50, #EAF8FF);position:relative}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option input[type=checkbox]:checked:after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:block;width:5px;height:10px;margin:0;padding:0;box-sizing:border-box}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option span{font-size:14px;color:#344054}.add-manage-cohort .custom-select-container{position:relative;width:100%}.add-manage-cohort .custom-select-container .custom-select-trigger{display:flex;justify-content:space-between;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:12px 16px;cursor:pointer;font-size:14px;color:#101828;box-shadow:0 1px 2px #1018280d}.add-manage-cohort .custom-select-container .custom-select-trigger svg{transition:transform .2s ease}.add-manage-cohort .custom-select-container .custom-select-trigger svg.rotate{transform:rotate(180deg)}.add-manage-cohort .custom-select-container .custom-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:100;background:#fff;border:1px solid #D0D5DD;border-radius:8px;margin-top:4px;padding:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:6px;cursor:pointer;transition:background .2s}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option:hover{background:#f9fafb}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option span{font-size:14px;color:#344054}.add-manage-cohort .metric-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px 24px;margin-bottom:16px;margin-top:20px}.add-manage-cohort .metric-header-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:12px;border-bottom:1px solid #eaecf0}.add-manage-cohort .metric-header-row .metric-title{margin:0;font-size:18px;font-weight:600;color:#101828;border-bottom:none;padding-bottom:0}.add-manage-cohort .metric-title{font-size:16px;font-weight:700;color:#1a2b4b;margin:0 0 16px;padding-bottom:12px;border-bottom:1px solid #eaecf0}.add-manage-cohort .context-header{display:flex;align-items:flex-start;justify-content:space-between;margin-top:16px;margin-bottom:16px;padding-top:12px;border-top:1px solid #eaecf0;flex-wrap:wrap;gap:12px}.add-manage-cohort .context-header-left .context-label{font-size:14px;font-weight:700;color:#1a2b4b;display:block;margin-bottom:2px}.add-manage-cohort .context-header-left .context-sublabel{font-size:12px;color:#667085}.add-manage-cohort .context-header-right{display:flex;align-items:center;gap:16px}.add-manage-cohort .toggle-label{display:flex;align-items:center;gap:8px;cursor:pointer}.add-manage-cohort .toggle-label .toggle-text{font-size:13px;color:#667085;font-weight:500}.add-manage-cohort .toggle-switch{position:relative;display:inline-block;width:36px;height:20px}.add-manage-cohort .toggle-switch input{opacity:0;width:0;height:0}.add-manage-cohort .toggle-switch .toggle-slider{position:absolute;cursor:pointer;inset:0;background-color:#d0d5dd;border-radius:20px;transition:.3s}.add-manage-cohort .toggle-switch .toggle-slider:before{content:\"\";position:absolute;height:16px;width:16px;left:2px;bottom:2px;background-color:#fff;border-radius:50%;transition:.3s}.add-manage-cohort .toggle-switch input:checked+.toggle-slider{background-color:#2196f3}.add-manage-cohort .toggle-switch input:checked+.toggle-slider:before{transform:translate(16px)}.add-manage-cohort .btn-add-context{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;border:1px solid #d0d5dd;border-radius:6px;background:#fff;font-size:13px;font-weight:500;color:#344054;cursor:pointer;transition:background .2s,opacity .2s}.add-manage-cohort .btn-add-context:hover:not(:disabled){background:#f5f7fa}.add-manage-cohort .btn-add-context:disabled{opacity:.45;cursor:not-allowed}.add-manage-cohort .min-max-checkbox{margin:12px 0}.add-manage-cohort .min-max-checkbox .checkbox-label{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:14px;font-weight:500;color:#344054}.add-manage-cohort .min-max-checkbox .checkbox-label input[type=checkbox]{width:18px!important;height:18px!important;margin:-4px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--primary-600, #00A3FF)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:var(--primary-50, #EAF8FF);position:relative}.add-manage-cohort .min-max-checkbox .checkbox-label input[type=checkbox]:checked:after{content:\"\";position:absolute;left:50%;top:40%;transform:translate(-50%,-50%) rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:block;width:5px;height:10px;margin:0;padding:0;box-sizing:border-box}.add-manage-cohort .numerical-section{display:flex;gap:24px;margin-bottom:16px;padding:12px 0}.add-manage-cohort .stepper-group .stepper-label{display:block;font-size:12px;font-weight:500;color:#667085;margin-bottom:6px}.add-manage-cohort .stepper-control{display:inline-flex;align-items:center;border:1px solid #d0d5dd;border-radius:8px;overflow:hidden;background:#fff}.add-manage-cohort .stepper-btn{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border:none;background:#fff;font-size:16px;font-weight:500;color:#344054;cursor:pointer;transition:background .15s}.add-manage-cohort .stepper-btn:hover{background:#f2f4f7}.add-manage-cohort .stepper-value{min-width:40px;text-align:center;font-size:14px;font-weight:600;color:#1a2b4b;padding:0 4px}.add-manage-cohort .context-item-container{margin-bottom:20px}.add-manage-cohort .context-item{border:1px solid #e8edf3;border-radius:12px;padding:24px;margin-bottom:12px;background:#fff;box-shadow:0 1px 3px #1018281a}.add-manage-cohort .context-item-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.add-manage-cohort .context-item-title{font-size:14px;font-weight:700;color:#1a2b4b}.add-manage-cohort .context-remove-btn{background:none;border:none;padding:2px;cursor:pointer;color:#667085;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:background .15s}.add-manage-cohort .context-remove-btn:hover{background:#f2f4f7}.add-manage-cohort .context-fields{display:flex;flex-direction:column;gap:10px}.add-manage-cohort .context-row{display:flex;gap:12px;align-items:center}.add-manage-cohort .context-input{flex:1}.add-manage-cohort .context-select{min-width:180px}.add-manage-cohort .suggested-desc-section{background:#f9fafb;border-radius:8px;padding:16px;margin-top:20px}.add-manage-cohort .suggested-desc-section .suggested-title{font-size:13px;font-weight:600;color:#475467;margin-bottom:12px}.add-manage-cohort .suggested-desc-section .suggested-chips{display:flex;flex-wrap:wrap;gap:8px}.add-manage-cohort .suggested-desc-section .suggested-chips .suggested-chip{background:#fff;border:1px solid #D0D5DD;border-radius:6px;padding:6px 12px;font-size:12px;color:#344054;cursor:pointer;transition:all .2s}.add-manage-cohort .suggested-desc-section .suggested-chips .suggested-chip:hover{border-color:#00a3ff;color:#00a3ff;background:#eaf8ff}.add-manage-cohort .metric-footer{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid #eaecf0}.add-manage-cohort .metric-action-btn{background:none;border:none;padding:6px;border-radius:6px;cursor:pointer;color:#667085;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.add-manage-cohort .metric-action-btn:hover{background:#f2f4f7;color:#344054}.add-manage-cohort .metric-action-btn:disabled{opacity:.35;cursor:not-allowed}.add-manage-cohort .metric-delete-btn:hover:not(:disabled){background:#fef3f2;color:#d92d20}.add-manage-cohort .metric-delete-btn:hover:not(:disabled) svg path{stroke:#d92d20}.add-manage-cohort .btn-add-metric{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:14px;border:1px dashed #d0d5dd;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s,border-color .2s;margin-top:8px}.add-manage-cohort .btn-add-metric:hover{border-color:#2196f3}\n"] }]
476
+ args: [{ selector: 'lib-add-manage-cohort', template: "<div class=\"add-manage-cohort\">\r\n\r\n <!-- \u2500\u2500 Numerical Confirm Modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"confirm-modal-overlay\" *ngIf=\"showNumericalConfirmModal\" (click)=\"cancelNumericalToggle()\">\r\n <div class=\"confirm-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"confirm-modal-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#FEF3C7\" />\r\n <path d=\"M20 13V21M20 27H20.01\" stroke=\"#D97706\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h3 class=\"confirm-modal-title\">Enable Numerical Value</h3>\r\n <p class=\"confirm-modal-message\">Context you added will be removed from the metric by enabling the numerical value. Are you sure to proceed?</p>\r\n <div class=\"confirm-modal-actions\">\r\n <button class=\"btn-cancel-modal\" (click)=\"cancelNumericalToggle()\">Cancel</button>\r\n <button class=\"btn-confirm-modal\" (click)=\"confirmNumericalToggle()\">Yes, Proceed</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Confirmation Modal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"confirm-modal-overlay\" *ngIf=\"showConfirmModal\" (click)=\"cancelConfirm()\">\r\n <div class=\"confirm-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"confirm-modal-icon\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <circle cx=\"20\" cy=\"20\" r=\"20\" fill=\"#FEF3C7\" />\r\n <path d=\"M20 13V21M20 27H20.01\" stroke=\"#D97706\" stroke-width=\"2.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <h3 class=\"confirm-modal-title\">{{ confirmTitle }}</h3>\r\n <p class=\"confirm-modal-message\">{{ confirmMessage }}</p>\r\n <div class=\"confirm-modal-actions\">\r\n <button class=\"btn-cancel-modal\" (click)=\"cancelConfirm()\">Cancel</button>\r\n <button class=\"btn-confirm-modal\" (click)=\"confirmProceed()\">Yes, Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Toast Notification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"cohort-toast\" [class.visible]=\"toastVisible\" [class.toast-success]=\"toastType==='success'\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M10 18.3333C14.6024 18.3333 18.3333 14.6024 18.3333 10C18.3333 5.39763 14.6024 1.66667 10 1.66667C5.39763 1.66667 1.66667 5.39763 1.66667 10C1.66667 14.6024 5.39763 18.3333 10 18.3333Z\"\r\n stroke=\"white\" stroke-width=\"1.66667\" />\r\n <path d=\"M7.5 10L9.16667 11.6667L12.5 8.33333\" stroke=\"white\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n {{ toastMessage }}\r\n </div>\r\n\r\n <!-- \u2500\u2500 Top Header Bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"top-header\">\r\n <div class=\"top-header-left\">\r\n <button class=\"btn-back\" (click)=\"goBack()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M15.8333 10H4.16667M4.16667 10L10 15.8333M4.16667 10L10 4.16667\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n <div>\r\n <h4 class=\"header-title\">{{ headerTitle }}</h4>\r\n <p class=\"header-subtitle\">{{ headerSubtitle }}</p>\r\n </div>\r\n </div>\r\n <div class=\"top-header-actions my-3\">\r\n <!-- View Mode: only show Edit button -->\r\n <ng-container *ngIf=\"isViewMode\">\r\n <button class=\"btn btn-outline btn-default\" (click)=\"switchToEdit()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <g clip-path=\"url(#clip0_2398_367)\">\r\n <path\r\n d=\"M14.168 2.49993C14.3868 2.28106 14.6467 2.10744 14.9326 1.98899C15.2186 1.87054 15.5251 1.80957 15.8346 1.80957C16.1442 1.80957 16.4507 1.87054 16.7366 1.98899C17.0226 2.10744 17.2824 2.28106 17.5013 2.49993C17.7202 2.7188 17.8938 2.97863 18.0122 3.2646C18.1307 3.55057 18.1917 3.85706 18.1917 4.16659C18.1917 4.47612 18.1307 4.78262 18.0122 5.06859C17.8938 5.35455 17.7202 5.61439 17.5013 5.83326L6.2513 17.0833L1.66797 18.3333L2.91797 13.7499L14.168 2.49993Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2398_367\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n Edit Cohort\r\n </button>\r\n </ng-container>\r\n <!-- Create / Edit Mode: Save Draft + Submit -->\r\n <ng-container *ngIf=\"!isViewMode\">\r\n <!-- <button class=\"btn-draft\" (click)=\"saveDraft()\">Save As Draft</button> -->\r\n <button class=\"btn-submit\" (click)=\"submit()\">Submit</button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Form Body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"form-body\">\r\n\r\n <!-- Cohort Name -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Cohort Name</label>\r\n <input type=\"text\" class=\"form-input\" placeholder=\"Enter Cohort Name\" [(ngModel)]=\"cohortName\"\r\n [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Cohort Description -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Cohort Description</label>\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Cohort description...\"\r\n [(ngModel)]=\"cohortDescription\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Source Multi-select Dropdown -->\r\n <div class=\"form-field\">\r\n <label class=\"field-label\">Select Source</label>\r\n <div class=\"multi-select-container w-50\" [class.view-disabled]=\"isViewMode\">\r\n <div class=\"multi-select-trigger\" (click)=\"!isViewMode && toggleSourceDropdown()\">\r\n <span>{{ sourceDisplay }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n [class.rotate]=\"isSourceDropdownOpen\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"multi-select-dropdown\" *ngIf=\"isSourceDropdownOpen\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"search-box p-2\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Source...\"\r\n [(ngModel)]=\"sourceSearchText\" (ngModelChange)=\"filterSources()\" />\r\n </div>\r\n <div class=\"multi-select-option\" (click)=\"selectAllSources()\">\r\n <input type=\"checkbox\" [checked]=\"selectedSources.length === sourceOptions.length\" readonly />\r\n <span>Select All</span>\r\n </div>\r\n <div class=\"multi-select-option\" *ngFor=\"let s of filteredSourceOptions\" (click)=\"toggleSource(s)\">\r\n <input type=\"checkbox\" [checked]=\"isSourceSelected(s)\" readonly />\r\n <span>{{ s.label }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Metrics \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\r\n <div class=\"metric-card\" *ngFor=\"let metric of metrics; let mi = index\">\r\n\r\n <div class=\"metric-header-row\">\r\n <h5 class=\"metric-title\">Metric {{ mi + 1 }}</h5>\r\n\r\n </div>\r\n\r\n <!-- Metric Name -->\r\n <div class=\"form-field\">\r\n <input type=\"text\" class=\"form-input\" placeholder=\"Enter Metric Name\" [(ngModel)]=\"metric.name\"\r\n [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Metric Description -->\r\n <div class=\"form-field\">\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Description...\"\r\n [(ngModel)]=\"metric.description\" [disabled]=\"isViewMode\" />\r\n </div>\r\n\r\n <!-- Provide Context Header -->\r\n <div class=\"context-header\">\r\n <div class=\"context-header-left\">\r\n <span class=\"context-label\">Provide Context</span>\r\n <span class=\"context-sublabel\">Check whether the following are discussed</span>\r\n </div>\r\n <div class=\"context-header-right\">\r\n <label class=\"toggle-label\">\r\n <span class=\"toggle-text\">Numerical Value</span>\r\n <label class=\"toggle-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"metric.numericalValue\" [disabled]=\"isViewMode\"\r\n (ngModelChange)=\"onNumericalToggle(mi)\" />\r\n <span class=\"toggle-slider\"></span>\r\n </label>\r\n </label>\r\n <button class=\"btn-add-context\" (click)=\"addContext(mi)\" [disabled]=\"isViewMode || metric.numericalValue\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 3.33337V12.6667M3.33334 8.00004H12.6667\" stroke=\"#344054\" stroke-width=\"1.33\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n Add New\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- \u2500\u2500 Numerical Section (shown when toggle is ON) \u2500\u2500 -->\r\n <ng-container *ngIf=\"metric.numericalValue\">\r\n <div class=\"min-max-checkbox\">\r\n <label class=\"checkbox-label\">\r\n <input type=\"checkbox\" [(ngModel)]=\"metric.minMaxEnabled\" [disabled]=\"isViewMode\" />\r\n <span>Min and Max Range Validation</span>\r\n </label>\r\n </div>\r\n <div class=\"numerical-section\" *ngIf=\"metric.minMaxEnabled\">\r\n <div class=\"stepper-group\">\r\n <span class=\"stepper-label\">Min Value</span>\r\n <div class=\"stepper-control\">\r\n <button class=\"stepper-btn\" (click)=\"decrementMin(mi)\" [disabled]=\"isViewMode\">\u2014</button>\r\n <span class=\"stepper-value\">{{ metric.minValue }}</span>\r\n <button class=\"stepper-btn\" (click)=\"incrementMin(mi)\" [disabled]=\"isViewMode\">+</button>\r\n </div>\r\n </div>\r\n <div class=\"stepper-group\">\r\n <span class=\"stepper-label\">Max Value</span>\r\n <div class=\"stepper-control\">\r\n <button class=\"stepper-btn\" (click)=\"decrementMax(mi)\" [disabled]=\"isViewMode\">\u2014</button>\r\n <span class=\"stepper-value\">{{ metric.maxValue }}</span>\r\n <button class=\"stepper-btn\" (click)=\"incrementMax(mi)\" [disabled]=\"isViewMode\">+</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Context Items (hidden when numerical value is ON) -->\r\n <ng-container *ngIf=\"!metric.numericalValue\">\r\n <div class=\"context-item-container\" *ngFor=\"let ctx of metric.contexts; let ci = index\">\r\n <div class=\"context-item\">\r\n <div class=\"context-item-header\">\r\n <span class=\"context-item-title\">Context {{ ci + 1 }} Details</span>\r\n <button class=\"context-remove-btn\" (click)=\"removeContext(mi, ci)\" title=\"Remove context\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"context-fields\">\r\n <div class=\"context-row\">\r\n <input type=\"text\" class=\"form-input context-input\" placeholder=\"Enter Context\"\r\n [(ngModel)]=\"ctx.context\" [disabled]=\"isViewMode\"\r\n (keyup.enter)=\"fetchSuggestions(mi, ci)\" />\r\n\r\n <!-- Custom Single-select Weightage -->\r\n <div class=\"custom-select-container w-25 context-select\" [class.view-disabled]=\"isViewMode\"\r\n [class.is-invalid]=\"ctx.weightageError\">\r\n <div class=\"custom-select-trigger\"\r\n (click)=\"!isViewMode && toggleWeightageDropdown(mi, ci)\">\r\n <span>{{ ctx.weightage || 'Select Weightage' }}</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\" [class.rotate]=\"ctx.isWeightageOpen\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"custom-select-dropdown\" *ngIf=\"ctx.isWeightageOpen\">\r\n <div class=\"custom-select-option\" *ngFor=\"let w of weightageOptions\"\r\n (click)=\"selectWeightage(mi, ci, w)\">\r\n <span>{{ w }}</span>\r\n </div>\r\n </div>\r\n <span class=\"field-error mt-2\" *ngIf=\"ctx.weightageError\">Weightage is required.</span>\r\n </div>\r\n </div>\r\n <input type=\"text\" class=\"form-input form-input--indent\" placeholder=\"Enter Description\"\r\n [(ngModel)]=\"ctx.description\" (keyup.enter)=\"fetchSuggestions(mi, ci)\"\r\n [disabled]=\"isViewMode\" [class.is-invalid]=\"ctx.descriptionError\"\r\n (ngModelChange)=\"ctx.descriptionError = false\" />\r\n <span class=\"field-error\" *ngIf=\"ctx.descriptionError\">Description is required.</span>\r\n </div>\r\n\r\n <!-- Suggested Descriptions Section (hidden in view mode) -->\r\n <div class=\"suggested-desc-section mt-3\" *ngIf=\"!isViewMode && (ctx.isSuggestionLoading || (ctx.suggestions && ctx.suggestions.length > 0))\">\r\n <p class=\"suggested-title\">Try the suggested descriptions</p>\r\n <div class=\"suggested-chips\" *ngIf=\"ctx.isSuggestionLoading\">\r\n <span class=\"suggested-chip loading\">Loading...</span>\r\n </div>\r\n <div class=\"suggested-chips\" *ngIf=\"!ctx.isSuggestionLoading && ctx.suggestions && ctx.suggestions.length > 0\">\r\n <span class=\"suggested-chip\" *ngFor=\"let suggestion of ctx.suggestions\"\r\n (click)=\"patchSuggestedDescription(mi, ci, suggestion.text)\"\r\n [title]=\"suggestion.category\">\r\n {{ suggestion.text }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Metric Footer Actions -->\r\n <div class=\"metric-footer\">\r\n <button class=\"metric-action-btn\" title=\"Duplicate Metric\" (click)=\"duplicateMetric(mi)\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <rect x=\"6.66669\" y=\"6.66663\" width=\"11.6667\" height=\"11.6667\" rx=\"2\" stroke=\"#667085\"\r\n stroke-width=\"1.5\" />\r\n <path\r\n d=\"M3.33331 13.3333H2.49998C2.05795 13.3333 1.63403 13.1577 1.32147 12.8452C1.00891 12.5326 0.833313 12.1087 0.833313 11.6666V2.49996C0.833313 2.05793 1.00891 1.63401 1.32147 1.32145C1.63403 1.00889 2.05795 0.833293 2.49998 0.833293H11.6666C12.1087 0.833293 12.5326 1.00889 12.8452 1.32145C13.1577 1.63401 13.3333 2.05793 13.3333 2.49996V3.33329\"\r\n stroke=\"#667085\" stroke-width=\"1.5\" />\r\n </svg>\r\n </button>\r\n <button class=\"metric-action-btn metric-delete-btn\" title=\"Delete Metric\" (click)=\"removeMetric(mi)\"\r\n [disabled]=\"isViewMode || metrics.length <= 1\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M2.5 5H4.16667H17.5\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M6.66669 5.00004V3.33337C6.66669 2.89135 6.84228 2.46742 7.15484 2.15486C7.4674 1.8423 7.89133 1.66671 8.33335 1.66671H11.6667C12.1087 1.66671 12.5326 1.8423 12.8452 2.15486C13.1578 2.46742 13.3334 2.89135 13.3334 3.33337V5.00004M15.8334 5.00004V16.6667C15.8334 17.1087 15.6578 17.5327 15.3452 17.8452C15.0326 18.1578 14.6087 18.3334 14.1667 18.3334H5.83335C5.39133 18.3334 4.9674 18.1578 4.65484 17.8452C4.34228 17.5327 4.16669 17.1087 4.16669 16.6667V5.00004H15.8334Z\"\r\n stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Add New Metric Button -->\r\n <button class=\"btn-add-metric\" (click)=\"addMetric()\" [disabled]=\"isViewMode\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10 4.16699V15.8337M4.16669 10.0003H15.8334\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n Add New Metric\r\n </button>\r\n\r\n </div>\r\n\r\n</div>\r\n", styles: [".add-manage-cohort{padding:24px;background-color:#f5f7fa;min-height:100vh;position:relative}.add-manage-cohort .confirm-modal-overlay{position:fixed;inset:0;background:#10182880;z-index:9999;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);animation:fadeIn .2s ease}.add-manage-cohort .confirm-modal{background:#fff;border-radius:16px;padding:36px 32px;max-width:440px;width:90%;box-shadow:0 24px 48px -12px #1018282e;text-align:center;animation:slideUp .25s ease}.add-manage-cohort .confirm-modal .confirm-modal-icon{margin-bottom:20px}.add-manage-cohort .confirm-modal .confirm-modal-title{font-size:20px;font-weight:700;color:#101828;margin-bottom:8px}.add-manage-cohort .confirm-modal .confirm-modal-message{font-size:14px;color:#667085;line-height:22px;margin-bottom:28px}.add-manage-cohort .confirm-modal .confirm-modal-actions{display:flex;gap:12px;justify-content:center}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-cancel-modal{flex:1;padding:10px 20px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-cancel-modal:hover{background:#f5f7fa}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-confirm-modal{flex:1;padding:10px 20px;border:none;border-radius:8px;background:#2196f3;font-size:14px;font-weight:600;color:#fff;cursor:pointer;transition:background .2s}.add-manage-cohort .confirm-modal .confirm-modal-actions .btn-confirm-modal:hover{background:#1976d2}.add-manage-cohort .cohort-toast{position:fixed;bottom:32px;right:32px;z-index:10000;display:flex;align-items:center;gap:10px;padding:14px 20px;border-radius:10px;background:#12b76a;color:#fff;font-size:14px;font-weight:600;box-shadow:0 8px 24px #00000026;opacity:0;transform:translateY(12px);transition:opacity .3s ease,transform .3s ease;pointer-events:none}.add-manage-cohort .cohort-toast.visible{opacity:1;transform:translateY(0);pointer-events:auto}.add-manage-cohort .view-disabled{opacity:.7;pointer-events:none;cursor:not-allowed}.add-manage-cohort input:disabled,.add-manage-cohort input[disabled]{background:#f9fafb!important;color:#667085!important;cursor:not-allowed;border-color:#eaecf0!important}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{transform:translateY(16px);opacity:0}to{transform:translateY(0);opacity:1}}.add-manage-cohort .top-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:24px;background:#fff;border:1px solid #e8edf3;border-radius:8px;padding:16px 24px}.add-manage-cohort .top-header-left{display:flex;align-items:center;gap:12px}.add-manage-cohort .top-header-left .header-badge{font-size:12px;font-weight:500;color:#667085}.add-manage-cohort .top-header-left .header-title{font-weight:600;font-size:18px;line-height:28px;letter-spacing:0%;color:#667085}.add-manage-cohort .top-header-left .header-subtitle{font-size:14px;color:#667085;margin:0}.add-manage-cohort .btn-back{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid #d0d5dd;border-radius:8px;background:#fff;cursor:pointer;flex-shrink:0}.add-manage-cohort .btn-back:hover{background:#f9fafb;border-color:#98a2b3}.add-manage-cohort .top-header-actions{display:flex;align-items:center;gap:10px}.add-manage-cohort .btn-draft{padding:8px 20px;border:1px solid #d0d5dd;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s;white-space:nowrap}.add-manage-cohort .btn-draft:hover{background:#f5f7fa}.add-manage-cohort .btn-submit{padding:8px 24px;border:none;border-radius:8px;background:#2196f3;font-size:14px;font-weight:600;color:#fff;cursor:pointer;transition:background .2s;white-space:nowrap}.add-manage-cohort .btn-submit:hover{background:#1976d2}.add-manage-cohort .form-body{opacity:1;gap:24px;border-radius:16px;padding:24px;background:#fff;margin:0 auto}.add-manage-cohort .form-field{margin-bottom:20px}.add-manage-cohort .form-field .field-label{display:block;font-size:14px;font-weight:600;color:#344054;margin-bottom:6px}.add-manage-cohort .form-input{width:100%;padding:12px 16px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;color:#1a2b4b;background:#fff;outline:none;transition:border-color .2s}.add-manage-cohort .form-input::placeholder{color:#98a2b3}.add-manage-cohort .form-input:focus{border-color:#2196f3}.add-manage-cohort .form-input--indent{padding-left:24px}.add-manage-cohort .form-select-custom{padding:12px 16px;border:1px solid #d0d5dd;border-radius:8px;font-size:14px;color:#1a2b4b;background:#fff;outline:none;min-width:240px;cursor:pointer;transition:border-color .2s;appearance:auto}.add-manage-cohort .form-select-custom:focus{border-color:#2196f3}.add-manage-cohort .multi-select-container{position:relative;width:100%}.add-manage-cohort .multi-select-container .multi-select-trigger{display:flex;justify-content:space-between;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:12px 16px;cursor:pointer;font-size:14px;color:#101828;box-shadow:0 1px 2px #1018280d}.add-manage-cohort .multi-select-container .multi-select-trigger svg{transition:transform .2s ease}.add-manage-cohort .multi-select-container .multi-select-trigger svg.rotate{transform:rotate(180deg)}.add-manage-cohort .multi-select-container .multi-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:100;background:#fff;border:1px solid #D0D5DD;border-radius:8px;margin-top:4px;padding:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box{padding:8px;border-bottom:1px solid #F2F4F7;margin-bottom:4px}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box input{width:100%;height:36px;padding:8px 12px;border:1px solid #D0D5DD;border-radius:6px;font-size:13px;outline:none}.add-manage-cohort .multi-select-container .multi-select-dropdown .search-box input:focus{border-color:#00a3ff;box-shadow:0 0 0 2px #00a3ff1a}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:6px;cursor:pointer;transition:background .2s}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option:hover{background:#f9fafb}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option input[type=checkbox]{width:18px!important;height:18px!important;margin:-2px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--primary-600, #00A3FF)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:var(--primary-50, #EAF8FF);position:relative}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option input[type=checkbox]:checked:after{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:block;width:5px;height:10px;margin:0;padding:0;box-sizing:border-box}.add-manage-cohort .multi-select-container .multi-select-dropdown .multi-select-option span{font-size:14px;color:#344054}.add-manage-cohort .custom-select-container{position:relative;width:100%}.add-manage-cohort .custom-select-container .custom-select-trigger{display:flex;justify-content:space-between;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:12px 16px;cursor:pointer;font-size:14px;color:#101828;box-shadow:0 1px 2px #1018280d}.add-manage-cohort .custom-select-container .custom-select-trigger svg{transition:transform .2s ease}.add-manage-cohort .custom-select-container .custom-select-trigger svg.rotate{transform:rotate(180deg)}.add-manage-cohort .custom-select-container .custom-select-dropdown{position:absolute;top:100%;left:0;right:0;z-index:100;background:#fff;border:1px solid #D0D5DD;border-radius:8px;margin-top:4px;padding:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option{display:flex;align-items:center;gap:8px;padding:10px 12px;border-radius:6px;cursor:pointer;transition:background .2s}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option:hover{background:#f9fafb}.add-manage-cohort .custom-select-container .custom-select-dropdown .custom-select-option span{font-size:14px;color:#344054}.add-manage-cohort .metric-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px 24px;margin-bottom:16px;margin-top:20px}.add-manage-cohort .metric-header-row{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:12px;border-bottom:1px solid #eaecf0}.add-manage-cohort .metric-header-row .metric-title{margin:0;font-size:18px;font-weight:600;color:#101828;border-bottom:none;padding-bottom:0}.add-manage-cohort .metric-title{font-size:16px;font-weight:700;color:#1a2b4b;margin:0 0 16px;padding-bottom:12px;border-bottom:1px solid #eaecf0}.add-manage-cohort .context-header{display:flex;align-items:flex-start;justify-content:space-between;margin-top:16px;margin-bottom:16px;padding-top:12px;border-top:1px solid #eaecf0;flex-wrap:wrap;gap:12px}.add-manage-cohort .context-header-left .context-label{font-size:14px;font-weight:700;color:#1a2b4b;display:block;margin-bottom:2px}.add-manage-cohort .context-header-left .context-sublabel{font-size:12px;color:#667085}.add-manage-cohort .context-header-right{display:flex;align-items:center;gap:16px}.add-manage-cohort .toggle-label{display:flex;align-items:center;gap:8px;cursor:pointer}.add-manage-cohort .toggle-label .toggle-text{font-size:13px;color:#667085;font-weight:500}.add-manage-cohort .toggle-switch{position:relative;display:inline-block;width:36px;height:20px}.add-manage-cohort .toggle-switch input{opacity:0;width:0;height:0}.add-manage-cohort .toggle-switch .toggle-slider{position:absolute;cursor:pointer;inset:0;background-color:#d0d5dd;border-radius:20px;transition:.3s}.add-manage-cohort .toggle-switch .toggle-slider:before{content:\"\";position:absolute;height:16px;width:16px;left:2px;bottom:2px;background-color:#fff;border-radius:50%;transition:.3s}.add-manage-cohort .toggle-switch input:checked+.toggle-slider{background-color:#2196f3}.add-manage-cohort .toggle-switch input:checked+.toggle-slider:before{transform:translate(16px)}.add-manage-cohort .btn-add-context{display:inline-flex;align-items:center;gap:4px;padding:6px 12px;border:1px solid #d0d5dd;border-radius:6px;background:#fff;font-size:13px;font-weight:500;color:#344054;cursor:pointer;transition:background .2s,opacity .2s}.add-manage-cohort .btn-add-context:hover:not(:disabled){background:#f5f7fa}.add-manage-cohort .btn-add-context:disabled{opacity:.45;cursor:not-allowed}.add-manage-cohort .min-max-checkbox{margin:12px 0}.add-manage-cohort .min-max-checkbox .checkbox-label{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:14px;font-weight:500;color:#344054}.add-manage-cohort .min-max-checkbox .checkbox-label input[type=checkbox]{width:18px!important;height:18px!important;margin:-4px 5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--primary-600, #00A3FF)!important;box-shadow:none;font-size:.5em;text-align:center;line-height:1em;background:var(--primary-50, #EAF8FF);position:relative}.add-manage-cohort .min-max-checkbox .checkbox-label input[type=checkbox]:checked:after{content:\"\";position:absolute;left:50%;top:40%;transform:translate(-50%,-50%) rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:block;width:5px;height:10px;margin:0;padding:0;box-sizing:border-box}.add-manage-cohort .numerical-section{display:flex;gap:24px;margin-bottom:16px;padding:12px 0}.add-manage-cohort .stepper-group .stepper-label{display:block;font-size:12px;font-weight:500;color:#667085;margin-bottom:6px}.add-manage-cohort .stepper-control{display:inline-flex;align-items:center;border:1px solid #d0d5dd;border-radius:8px;overflow:hidden;background:#fff}.add-manage-cohort .stepper-btn{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border:none;background:#fff;font-size:16px;font-weight:500;color:#344054;cursor:pointer;transition:background .15s}.add-manage-cohort .stepper-btn:hover{background:#f2f4f7}.add-manage-cohort .stepper-value{min-width:40px;text-align:center;font-size:14px;font-weight:600;color:#1a2b4b;padding:0 4px}.add-manage-cohort .context-item-container{margin-bottom:20px}.add-manage-cohort .context-item{border:1px solid #e8edf3;border-radius:12px;padding:24px;margin-bottom:12px;background:#fff;box-shadow:0 1px 3px #1018281a}.add-manage-cohort .context-item-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.add-manage-cohort .context-item-title{font-size:14px;font-weight:700;color:#1a2b4b}.add-manage-cohort .context-remove-btn{background:none;border:none;padding:2px;cursor:pointer;color:#667085;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:background .15s}.add-manage-cohort .context-remove-btn:hover{background:#f2f4f7}.add-manage-cohort .context-fields{display:flex;flex-direction:column;gap:10px}.add-manage-cohort .context-fields .field-error{font-size:12px;color:#d92d20;margin-top:-6px}.add-manage-cohort .context-fields .form-input.is-invalid,.add-manage-cohort .context-fields .custom-select-container.is-invalid .custom-select-trigger{border-color:#d92d20!important}.add-manage-cohort .context-row{display:flex;gap:12px;align-items:center}.add-manage-cohort .context-input{flex:1}.add-manage-cohort .context-select{min-width:180px}.add-manage-cohort .suggested-desc-section{background:#f9fafb;border-radius:8px;padding:16px;margin-top:20px}.add-manage-cohort .suggested-desc-section .suggested-title{font-size:13px;font-weight:600;color:#475467;margin-bottom:12px}.add-manage-cohort .suggested-desc-section .suggested-chips{display:flex;flex-wrap:wrap;gap:8px}.add-manage-cohort .suggested-desc-section .suggested-chips .suggested-chip{background:#fff;border:1px solid #D0D5DD;border-radius:6px;padding:6px 12px;font-size:12px;color:#344054;cursor:pointer;transition:all .2s}.add-manage-cohort .suggested-desc-section .suggested-chips .suggested-chip:hover{border-color:#00a3ff;color:#00a3ff;background:#eaf8ff}.add-manage-cohort .metric-footer{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid #eaecf0}.add-manage-cohort .metric-action-btn{background:none;border:none;padding:6px;border-radius:6px;cursor:pointer;color:#667085;display:inline-flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.add-manage-cohort .metric-action-btn:hover{background:#f2f4f7;color:#344054}.add-manage-cohort .metric-action-btn:disabled{opacity:.35;cursor:not-allowed}.add-manage-cohort .metric-delete-btn:hover:not(:disabled){background:#fef3f2;color:#d92d20}.add-manage-cohort .metric-delete-btn:hover:not(:disabled) svg path{stroke:#d92d20}.add-manage-cohort .btn-add-metric{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:14px;border:1px dashed #d0d5dd;border-radius:8px;background:#fff;font-size:14px;font-weight:600;color:#344054;cursor:pointer;transition:background .2s,border-color .2s;margin-top:8px}.add-manage-cohort .btn-add-metric:hover{border-color:#2196f3}\n"] }]
429
477
  }], ctorParameters: () => [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.PageInfoService }, { type: i3.AudioService }], propDecorators: { onDocumentClick: [{
430
478
  type: HostListener,
431
479
  args: ['document:click', ['$event']]
432
480
  }] } });
433
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW1hbmFnZS1jb2hvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYWktYXVkaW8vc3JjL2xpYi9jb21wb25lbnRzL2FkZC1tYW5hZ2UtY29ob3J0L2FkZC1tYW5hZ2UtY29ob3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFpLWF1ZGlvL3NyYy9saWIvY29tcG9uZW50cy9hZGQtbWFuYWdlLWNvaG9ydC9hZGQtbWFuYWdlLWNvaG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQWlDaEUsTUFBTSxPQUFPLHdCQUF3QjtJQThEekI7SUFDQTtJQUNBO0lBQ0E7SUFoRVYsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRW5CLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDcEIsYUFBYSxHQUE4QixJQUFJLENBQUM7SUFFaEQseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLDJCQUEyQixHQUFrQixJQUFJLENBQUM7SUFFbEQsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLFNBQVMsR0FBb0MsU0FBUyxDQUFDO0lBRXZELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFbEIsUUFBUSxHQUFrQixJQUFJLENBQUM7SUFDL0IsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNoQixpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFFdkIsZUFBZSxHQUFhLEVBQUUsQ0FBQztJQUMvQixvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDN0IsZ0JBQWdC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LENBQUM7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ3RCLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDdEQsbUJBQW1CLEVBQUUsT0FBTztTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7d0dBaGRVLHdCQUF3Qjs0RkFBeEIsd0JBQXdCLG1JQ2pDckMsdzhwQkFrVEE7OzRGRGpSYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0UsdUJBQXVCO2lLQXlEakMsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcbmltcG9ydCB7IEF1ZGlvU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1ZGlvLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvaG9ydENvbnRleHQge1xuICBjb250ZXh0OiBzdHJpbmc7XG4gIHdlaWdodGFnZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpc1dlaWdodGFnZU9wZW4/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvaG9ydE1ldHJpYyB7XG4gIG1ldHJpY0lkPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIG51bWVyaWNhbFZhbHVlOiBib29sZWFuO1xuICBtaW5NYXhFbmFibGVkOiBib29sZWFuO1xuICBtaW5WYWx1ZTogbnVtYmVyO1xuICBtYXhWYWx1ZTogbnVtYmVyO1xuICBjb250ZXh0czogQ29ob3J0Q29udGV4dFtdO1xufVxuXG5pbnRlcmZhY2UgU291cmNlT3B0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWFkZC1tYW5hZ2UtY29ob3J0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1tYW5hZ2UtY29ob3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWRkLW1hbmFnZS1jb2hvcnQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBZGRNYW5hZ2VDb2hvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBpc1ZpZXdNb2RlID0gZmFsc2U7XG4gIGlzRWRpdE1vZGUgPSBmYWxzZTtcblxuICBzaG93Q29uZmlybU1vZGFsID0gZmFsc2U7XG4gIGNvbmZpcm1UaXRsZSA9ICcnO1xuICBjb25maXJtTWVzc2FnZSA9ICcnO1xuICBjb25maXJtQWN0aW9uOiAnZHJhZnQnIHwgJ3N1Ym1pdCcgfCBudWxsID0gbnVsbDtcblxuICBzaG93TnVtZXJpY2FsQ29uZmlybU1vZGFsID0gZmFsc2U7XG4gIHBlbmRpbmdOdW1lcmljYWxNZXRyaWNJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgdG9hc3RWaXNpYmxlID0gZmFsc2U7XG4gIHRvYXN0TWVzc2FnZSA9ICcnO1xuICB0b2FzdFR5cGU6ICdzdWNjZXNzJyB8ICd3YXJuaW5nJyB8ICdlcnJvcicgPSAnc3VjY2Vzcyc7XG5cbiAgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgY29ob3J0SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBjb2hvcnROYW1lID0gJyc7XG4gIGNvaG9ydERlc2NyaXB0aW9uID0gJyc7XG5cbiAgc2VsZWN0ZWRTb3VyY2VzOiBzdHJpbmdbXSA9IFtdO1xuICBpc1NvdXJjZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICBzb3VyY2VTZWFyY2hUZXh0ID0gJyc7XG4gIGZpbHRlcmVkU291cmNlT3B0aW9uczogU291cmNlT3B0aW9uW10gPSBbXTtcblxuICBoZWFkZXJUaXRsZSA9ICdDcmVhdGUgTmV3IENvaG9ydCc7XG4gIGhlYWRlclN1YnRpdGxlID0gJ0RlZmluZSB5b3VyIGNvaG9ydCBtZXRyaWNzIGFuZCBjb250ZXh0IHRvIGFuYWx5emUgY29udmVyc2F0aW9ucy4nO1xuXG4gIHdlaWdodGFnZU9wdGlvbnMgPSBbJ0xvdycsICdNZWRpdW0nLCAnSGlnaCcsICdDcml0aWNhbCddO1xuICBzb3VyY2VPcHRpb25zOiBTb3VyY2VPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnMScsIGxhYmVsOiAnQ29ubmVjdCcgfSxcbiAgICB7IGlkOiAnMicsIGxhYmVsOiAnUG93ZXIgQmFuaycgfSxcbiAgICB7IGlkOiAnMycsIGxhYmVsOiAnSE9QJyB9LFxuICAgIHsgaWQ6ICc0JywgbGFiZWw6ICdGbG93IEFwcCcgfVxuICBdO1xuXG4gIG1ldHJpY3M6IENvaG9ydE1ldHJpY1tdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgbnVtZXJpY2FsVmFsdWU6IGZhbHNlLFxuICAgICAgbWluTWF4RW5hYmxlZDogZmFsc2UsXG4gICAgICBtaW5WYWx1ZTogMCxcbiAgICAgIG1heFZhbHVlOiAwLFxuICAgICAgY29udGV4dHM6IFtcbiAgICAgICAgeyBjb250ZXh0OiAnJywgd2VpZ2h0YWdlOiAnJywgZGVzY3JpcHRpb246ICcnIH1cbiAgICAgIF1cbiAgICB9XG4gIF07XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCF0YXJnZXQuY2xvc2VzdCgnLm11bHRpLXNlbGVjdC1jb250YWluZXInKSAmJiAhdGFyZ2V0LmNsb3Nlc3QoJy5jdXN0b20tc2VsZWN0LWNvbnRhaW5lcicpKSB7XG4gICAgICB0aGlzLmlzU291cmNlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLm1ldHJpY3MuZm9yRWFjaChtID0+IG0uY29udGV4dHMuZm9yRWFjaChjID0+IGMuaXNXZWlnaHRhZ2VPcGVuID0gZmFsc2UpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcbiAgICBwcml2YXRlIGF1ZGlvU2VydmljZTogQXVkaW9TZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IG5hdmlnYXRpb24gPSB0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpO1xuICAgIGNvbnN0IG1vZGUgPSBuYXZpZ2F0aW9uPy5leHRyYXMuc3RhdGU/LlsnbW9kZSddIGFzIHN0cmluZztcbiAgICB0aGlzLmFwcGx5TW9kZShtb2RlIHx8ICdjcmVhdGUnKTtcblxuICAgIGlmIChuYXZpZ2F0aW9uPy5leHRyYXMuc3RhdGU/LlsnY29ob3J0J10pIHtcbiAgICAgIHRoaXMubG9hZENvaG9ydChuYXZpZ2F0aW9uLmV4dHJhcy5zdGF0ZVsnY29ob3J0J10pO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcmVkU291cmNlT3B0aW9ucyA9IFsuLi50aGlzLnNvdXJjZU9wdGlvbnNdO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xuICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IG1vZGUgPSBwYXJhbXNbJ21vZGUnXSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBjb2hvcnRJZCA9IHBhcmFtc1snY29ob3J0SWQnXSBhcyBzdHJpbmc7XG5cbiAgICAgIGlmIChtb2RlKSB7XG4gICAgICAgIHRoaXMuYXBwbHlNb2RlKG1vZGUpO1xuICAgICAgfVxuICAgICAgaWYgKGNvaG9ydElkICYmIGNvaG9ydElkICE9PSB0aGlzLmNvaG9ydElkKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hDb2hvcnRCeUlkKGNvaG9ydElkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3TW9kZSA9IG1vZGUgPT09ICd2aWV3JztcbiAgICB0aGlzLmlzRWRpdE1vZGUgPSBtb2RlID09PSAnZWRpdCc7XG4gICAgaWYgKHRoaXMuaXNWaWV3TW9kZSkge1xuICAgICAgdGhpcy5oZWFkZXJUaXRsZSA9ICdWaWV3IENvaG9ydCc7XG4gICAgICB0aGlzLmhlYWRlclN1YnRpdGxlID0gJ1JldmlldyB0aGUgY29ob3J0IGRldGFpbHMgYmVsb3cuJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNFZGl0TW9kZSkge1xuICAgICAgdGhpcy5oZWFkZXJUaXRsZSA9ICdFZGl0IENvaG9ydCc7XG4gICAgICB0aGlzLmhlYWRlclN1YnRpdGxlID0gJ1VwZGF0ZSB5b3VyIGNvaG9ydCBtZXRyaWNzIGFuZCBjb250ZXh0Lic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyVGl0bGUgPSAnQ3JlYXRlIE5ldyBDb2hvcnQnO1xuICAgICAgdGhpcy5oZWFkZXJTdWJ0aXRsZSA9ICdEZWZpbmUgeW91ciBjb2hvcnQgbWV0cmljcyBhbmQgY29udGV4dCB0byBhbmFseXplIGNvbnZlcnNhdGlvbnMuJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZldGNoQ29ob3J0QnlJZChjb2hvcnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvaG9ydChjb2hvcnRJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZENvaG9ydChyZXNwb25zZT8uZGF0YSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QoJ0ZhaWxlZCB0byBsb2FkIGNvaG9ydCBkZXRhaWxzLiBQbGVhc2UgdHJ5IGFnYWluLicsICd3YXJuaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXRQYWdlRGF0YSgpIHtcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKCdNYW5hZ2UgQ29ob3J0cycpO1xuICAgIHRoaXMucGFnZUluZm8uc2V0RGVzY3JpcHRpb24oJ1RvIG9wdGltaXplIGFuZCBpbXByb3ZlIGV4aXN0aW5nIGFsZ29yaXRobScpO1xuICAgIHRoaXMucGFnZUluZm8uc2V0QnJlYWRjcnVtYnMoW1xuICAgICAgeyB0aXRsZTogJ0F1ZGlvJywgcGF0aDogJy9tYW5hZ2UvYWktYXVkaW8vYXVkaW8nLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiBmYWxzZSB9LFxuICAgICAgeyB0aXRsZTogJ01hbmFnZSBDb2hvcnRzJywgcGF0aDogJycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IHRydWUgfSxcbiAgICBdKTtcbiAgfVxuXG4gIGxvYWRDb2hvcnQoZGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb2hvcnRJZCA9IGRhdGEuY29ob3J0SWQgfHwgZGF0YS5pZCB8fCBudWxsO1xuICAgIHRoaXMuY29ob3J0TmFtZSA9IGRhdGEuY29ob3J0TmFtZSB8fCBkYXRhLm5hbWUgfHwgJyc7XG4gICAgdGhpcy5jb2hvcnREZXNjcmlwdGlvbiA9IGRhdGEuY29ob3J0RGVzY3JpcHRpb24gfHwgZGF0YS5kZXNjcmlwdGlvbiB8fCAnJztcbiAgICB0aGlzLnNlbGVjdGVkU291cmNlcyA9IEFycmF5LmlzQXJyYXkoZGF0YS5zb3VyY2UpXG4gICAgICA/IGRhdGEuc291cmNlLm1hcCgoczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKHMpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoZWQgPSB0aGlzLnNvdXJjZU9wdGlvbnMuZmluZChcbiAgICAgICAgICAob3B0KSA9PiBvcHQubGFiZWwudG9Mb3dlckNhc2UoKSA9PT0gdmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZWQgPyBtYXRjaGVkLmxhYmVsIDogU3RyaW5nKHMpO1xuICAgICAgfSlcbiAgICAgIDogW107XG4gICAgY29uc3QgbG9hZGVkTWV0cmljcyA9IEFycmF5LmlzQXJyYXkoZGF0YS5tZXRyaWNzKSA/IGRhdGEubWV0cmljcyA6IFtdO1xuICAgIHRoaXMubWV0cmljcyA9IGxvYWRlZE1ldHJpY3MubGVuZ3RoXG4gICAgICA/IGxvYWRlZE1ldHJpY3MubWFwKChtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbnVtZXJpY2FsVmFsdWUgPSBtLmlzTnVtZXJpYyA/PyBtLm51bWVyaWNhbFZhbHVlID8/IGZhbHNlO1xuICAgICAgICBjb25zdCBjb250ZXh0cyA9IEFycmF5LmlzQXJyYXkobS5jb250ZXh0cylcbiAgICAgICAgICA/IG0uY29udGV4dHMubWFwKChjOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBjb250ZXh0OiBjLmNvbnRleHROYW1lIHx8IGMuY29udGV4dCB8fCAnJyxcbiAgICAgICAgICAgIHdlaWdodGFnZTogYy53ZWlnaHRhZ2UgfHwgdGhpcy5wcmlvcml0eVRvV2VpZ2h0YWdlKGMucHJpb3JpdHkpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGMuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgICAgICBpc1dlaWdodGFnZU9wZW46IGZhbHNlXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgOiBbXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldHJpY0lkOiBtLm1ldHJpY0lkLFxuICAgICAgICAgIG5hbWU6IG0ubWV0cmljTmFtZSB8fCBtLm5hbWUgfHwgJycsXG4gICAgICAgICAgZGVzY3JpcHRpb246IG0ubWV0cmljRGVzY3JpcHRpb24gfHwgbS5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICBudW1lcmljYWxWYWx1ZSxcbiAgICAgICAgICBtaW5NYXhFbmFibGVkOiBtLm1pbk1heEVuYWJsZWQgPz8gKG51bWVyaWNhbFZhbHVlICYmIChtLm1pblZhbHVlICE9PSB1bmRlZmluZWQgfHwgbS5tYXhWYWx1ZSAhPT0gdW5kZWZpbmVkKSksXG4gICAgICAgICAgbWluVmFsdWU6IG0ubWluVmFsdWUgPz8gMCxcbiAgICAgICAgICBtYXhWYWx1ZTogbS5tYXhWYWx1ZSA/PyAwLFxuICAgICAgICAgIGNvbnRleHRzXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgbnVtZXJpY2FsVmFsdWU6IGZhbHNlLFxuICAgICAgICAgIG1pbk1heEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIG1pblZhbHVlOiAwLFxuICAgICAgICAgIG1heFZhbHVlOiAwLFxuICAgICAgICAgIGNvbnRleHRzOiBbeyBjb250ZXh0OiAnJywgd2VpZ2h0YWdlOiAnJywgZGVzY3JpcHRpb246ICcnIH1dXG4gICAgICAgIH1cbiAgICAgIF07XG5cbiAgICB0aGlzLmFwcGx5TW9kZSh0aGlzLmlzVmlld01vZGUgPyAndmlldycgOiB0aGlzLmlzRWRpdE1vZGUgPyAnZWRpdCcgOiAnY3JlYXRlJyk7XG4gIH1cblxuICB0b2dnbGVTb3VyY2VEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzU291cmNlRHJvcGRvd25PcGVuID0gIXRoaXMuaXNTb3VyY2VEcm9wZG93bk9wZW47XG4gIH1cblxuICBpc1NvdXJjZVNlbGVjdGVkKHM6IFNvdXJjZU9wdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkU291cmNlcy5pbmNsdWRlcyhzLmxhYmVsKTtcbiAgfVxuXG4gIHRvZ2dsZVNvdXJjZShzOiBTb3VyY2VPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLnNlbGVjdGVkU291cmNlcy5pbmRleE9mKHMubGFiZWwpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTb3VyY2VzLnB1c2gocy5sYWJlbCk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0QWxsU291cmNlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFNvdXJjZXMubGVuZ3RoID09PSB0aGlzLnNvdXJjZU9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU291cmNlcyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU291cmNlcyA9IHRoaXMuc291cmNlT3B0aW9ucy5tYXAocyA9PiBzLmxhYmVsKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc291cmNlRGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybiAnU2VsZWN0IHRoZSBTb3VyY2UnO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkU291cmNlcy5sZW5ndGggPT09IHRoaXMuc291cmNlT3B0aW9ucy5sZW5ndGgpIHJldHVybiAnQWxsIFNlbGVjdGVkJztcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFNvdXJjZXMuam9pbignLCAnKTtcbiAgfVxuXG4gIGZpbHRlclNvdXJjZXMoKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9ICh0aGlzLnNvdXJjZVNlYXJjaFRleHQgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5maWx0ZXJlZFNvdXJjZU9wdGlvbnMgPSB0aGlzLnNvdXJjZU9wdGlvbnMuZmlsdGVyKHMgPT5cbiAgICAgIHMubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXh0KVxuICAgICk7XG4gIH1cblxuICBhZGRNZXRyaWMoKTogdm9pZCB7XG4gICAgdGhpcy5tZXRyaWNzLnB1c2goe1xuICAgICAgbmFtZTogJycsXG4gICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICBudW1lcmljYWxWYWx1ZTogZmFsc2UsXG4gICAgICBtaW5NYXhFbmFibGVkOiBmYWxzZSxcbiAgICAgIG1pblZhbHVlOiAwLFxuICAgICAgbWF4VmFsdWU6IDAsXG4gICAgICBjb250ZXh0czogW3sgY29udGV4dDogJycsIHdlaWdodGFnZTogJycsIGRlc2NyaXB0aW9uOiAnJywgaXNXZWlnaHRhZ2VPcGVuOiBmYWxzZSB9XVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlTWV0cmljKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXRyaWNzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMubWV0cmljcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIGR1cGxpY2F0ZU1ldHJpYyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLm1ldHJpY3NbaW5kZXhdO1xuICAgIGNvbnN0IGNvcHk6IENvaG9ydE1ldHJpYyA9IHtcbiAgICAgIG1ldHJpY0lkOiB1bmRlZmluZWQsXG4gICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG9yaWdpbmFsLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtZXJpY2FsVmFsdWU6IG9yaWdpbmFsLm51bWVyaWNhbFZhbHVlLFxuICAgICAgbWluTWF4RW5hYmxlZDogb3JpZ2luYWwubWluTWF4RW5hYmxlZCxcbiAgICAgIG1pblZhbHVlOiBvcmlnaW5hbC5taW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlOiBvcmlnaW5hbC5tYXhWYWx1ZSxcbiAgICAgIGNvbnRleHRzOiBvcmlnaW5hbC5jb250ZXh0cy5tYXAoYyA9PiAoeyAuLi5jIH0pKVxuICAgIH07XG4gICAgdGhpcy5tZXRyaWNzLnNwbGljZShpbmRleCArIDEsIDAsIGNvcHkpO1xuICB9XG5cbiAgb25OdW1lcmljYWxUb2dnbGUobWk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG1ldHJpYyA9IHRoaXMubWV0cmljc1ttaV07XG4gICAgaWYgKG1ldHJpYy5udW1lcmljYWxWYWx1ZSkge1xuICAgICAgbWV0cmljLm51bWVyaWNhbFZhbHVlID0gZmFsc2U7XG4gICAgICB0aGlzLnBlbmRpbmdOdW1lcmljYWxNZXRyaWNJbmRleCA9IG1pO1xuICAgICAgdGhpcy5zaG93TnVtZXJpY2FsQ29uZmlybU1vZGFsID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWV0cmljLm1pbk1heEVuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjb25maXJtTnVtZXJpY2FsVG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBlbmRpbmdOdW1lcmljYWxNZXRyaWNJbmRleCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0cmljID0gdGhpcy5tZXRyaWNzW3RoaXMucGVuZGluZ051bWVyaWNhbE1ldHJpY0luZGV4XTtcbiAgICAgIG1ldHJpYy5udW1lcmljYWxWYWx1ZSA9IHRydWU7XG4gICAgICBtZXRyaWMubWluTWF4RW5hYmxlZCA9IHRydWU7XG4gICAgICBtZXRyaWMuY29udGV4dHMgPSBbeyBjb250ZXh0OiAnJywgd2VpZ2h0YWdlOiAnJywgZGVzY3JpcHRpb246ICcnLCBpc1dlaWdodGFnZU9wZW46IGZhbHNlIH1dO1xuICAgIH1cbiAgICB0aGlzLnNob3dOdW1lcmljYWxDb25maXJtTW9kYWwgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdOdW1lcmljYWxNZXRyaWNJbmRleCA9IG51bGw7XG4gIH1cblxuICBjYW5jZWxOdW1lcmljYWxUb2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TnVtZXJpY2FsQ29uZmlybU1vZGFsID0gZmFsc2U7XG4gICAgdGhpcy5wZW5kaW5nTnVtZXJpY2FsTWV0cmljSW5kZXggPSBudWxsO1xuICB9XG5cbiAgaW5jcmVtZW50TWluKG1pOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1ldHJpY3NbbWldLm1pblZhbHVlKys7XG4gIH1cblxuICBkZWNyZW1lbnRNaW4obWk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLm1ldHJpY3NbbWldLm1pblZhbHVlID4gMCkge1xuICAgICAgdGhpcy5tZXRyaWNzW21pXS5taW5WYWx1ZS0tO1xuICAgIH1cbiAgfVxuXG4gIGluY3JlbWVudE1heChtaTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tZXRyaWNzW21pXS5tYXhWYWx1ZSsrO1xuICB9XG5cbiAgZGVjcmVtZW50TWF4KG1pOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXRyaWNzW21pXS5tYXhWYWx1ZSA+IDApIHtcbiAgICAgIHRoaXMubWV0cmljc1ttaV0ubWF4VmFsdWUtLTtcbiAgICB9XG4gIH1cblxuICBhZGRDb250ZXh0KG1ldHJpY0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1ldHJpY3NbbWV0cmljSW5kZXhdLmNvbnRleHRzLnB1c2goe1xuICAgICAgY29udGV4dDogJycsXG4gICAgICB3ZWlnaHRhZ2U6ICcnLFxuICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgaXNXZWlnaHRhZ2VPcGVuOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlV2VpZ2h0YWdlRHJvcGRvd24obWk6IG51bWJlciwgY2k6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMubWV0cmljc1ttaV0uY29udGV4dHNbY2ldLmlzV2VpZ2h0YWdlT3BlbjtcbiAgICB0aGlzLm1ldHJpY3MuZm9yRWFjaChtID0+IG0uY29udGV4dHMuZm9yRWFjaChjID0+IGMuaXNXZWlnaHRhZ2VPcGVuID0gZmFsc2UpKTtcbiAgICB0aGlzLmlzU291cmNlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgdGhpcy5tZXRyaWNzW21pXS5jb250ZXh0c1tjaV0uaXNXZWlnaHRhZ2VPcGVuID0gIWN1cnJlbnRTdGF0ZTtcbiAgfVxuXG4gIHNlbGVjdFdlaWdodGFnZShtaTogbnVtYmVyLCBjaTogbnVtYmVyLCB3ZWlnaHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWV0cmljc1ttaV0uY29udGV4dHNbY2ldLndlaWdodGFnZSA9IHdlaWdodDtcbiAgICB0aGlzLm1ldHJpY3NbbWldLmNvbnRleHRzW2NpXS5pc1dlaWdodGFnZU9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHJlbW92ZUNvbnRleHQobWV0cmljSW5kZXg6IG51bWJlciwgY29udGV4dEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXRyaWNzW21ldHJpY0luZGV4XS5jb250ZXh0cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLm1ldHJpY3NbbWV0cmljSW5kZXhdLmNvbnRleHRzLnNwbGljZShjb250ZXh0SW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHBhdGNoU3VnZ2VzdGVkRGVzY3JpcHRpb24obWk6IG51bWJlciwgY2k6IG51bWJlciwgdGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tZXRyaWNzW21pXS5jb250ZXh0c1tjaV0uZGVzY3JpcHRpb24gPSB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSB3ZWlnaHRhZ2VUb1ByaW9yaXR5KHdlaWdodGFnZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7ICdMb3cnOiAwLCAnTWVkaXVtJzogMSwgJ0hpZ2gnOiAyLCAnQ3JpdGljYWwnOiAzIH07XG4gICAgcmV0dXJuIG1hcFt3ZWlnaHRhZ2VdID8/IDE7XG4gIH1cblxuICBwcml2YXRlIHByaW9yaXR5VG9XZWlnaHRhZ2UocHJpb3JpdHk6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0geyAwOiAnTG93JywgMTogJ01lZGl1bScsIDI6ICdIaWdoJywgMzogJ0NyaXRpY2FsJyB9O1xuICAgIHJldHVybiBtYXBbcHJpb3JpdHldID8/ICdNZWRpdW0nO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE1ldHJpY1BheWxvYWQoaW5jbHVkZU1ldHJpY0lkOiBib29sZWFuKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY3MubWFwKG0gPT4ge1xuICAgICAgY29uc3QgbWV0cmljOiBhbnkgPSB7XG4gICAgICAgIG1ldHJpY05hbWU6IG0ubmFtZSxcbiAgICAgICAgbWV0cmljRGVzY3JpcHRpb246IG0uZGVzY3JpcHRpb24sXG4gICAgICAgIGlzTnVtZXJpYzogbS5udW1lcmljYWxWYWx1ZSxcbiAgICAgIH07XG4gICAgICBpZiAoaW5jbHVkZU1ldHJpY0lkICYmIG0ubWV0cmljSWQpIHtcbiAgICAgICAgbWV0cmljLm1ldHJpY0lkID0gbS5tZXRyaWNJZDtcbiAgICAgIH1cbiAgICAgIGlmIChtLm51bWVyaWNhbFZhbHVlICYmIG0ubWluTWF4RW5hYmxlZCkge1xuICAgICAgICBtZXRyaWMubWluVmFsdWUgPSBtLm1pblZhbHVlO1xuICAgICAgICBtZXRyaWMubWF4VmFsdWUgPSBtLm1heFZhbHVlO1xuICAgICAgfSBlbHNlIGlmICghbS5udW1lcmljYWxWYWx1ZSAmJiBtLmNvbnRleHRzKSB7XG4gICAgICAgIG1ldHJpYy5jb250ZXh0cyA9IG0uY29udGV4dHMubWFwKGMgPT4gKHtcbiAgICAgICAgICBjb250ZXh0TmFtZTogYy5jb250ZXh0LFxuICAgICAgICAgIHByaW9yaXR5OiB0aGlzLndlaWdodGFnZVRvUHJpb3JpdHkoYy53ZWlnaHRhZ2UpLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBjLmRlc2NyaXB0aW9uXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldHJpYy5jb250ZXh0cyA9IFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ldHJpYztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDcmVhdGVQYXlsb2FkKCk6IGFueSB7XG4gICAgY29uc3QgdXNlcnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSBhcyBzdHJpbmcpO1xuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRJZDogdXNlcnM/LmNsaWVudElkIHx8ICcxMScsXG4gICAgICBjb2hvcnROYW1lOiB0aGlzLmNvaG9ydE5hbWUsXG4gICAgICBjb2hvcnREZXNjcmlwdGlvbjogdGhpcy5jb2hvcnREZXNjcmlwdGlvbixcbiAgICAgIHNvdXJjZTogdGhpcy5zZWxlY3RlZFNvdXJjZXMsXG4gICAgICBtZXRyaWNzOiB0aGlzLmJ1aWxkTWV0cmljUGF5bG9hZChmYWxzZSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFVwZGF0ZVBheWxvYWQoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29ob3J0SWQ6IHRoaXMuY29ob3J0SWQsXG4gICAgICBjb2hvcnROYW1lOiB0aGlzLmNvaG9ydE5hbWUsXG4gICAgICBjb2hvcnREZXNjcmlwdGlvbjogdGhpcy5jb2hvcnREZXNjcmlwdGlvbixcbiAgICAgIHNvdXJjZTogdGhpcy5zZWxlY3RlZFNvdXJjZXMsXG4gICAgICBtZXRyaWNzOiB0aGlzLmJ1aWxkTWV0cmljUGF5bG9hZCh0cnVlKVxuICAgIH07XG4gIH1cblxuICBzYXZlRHJhZnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maXJtVGl0bGUgPSAnU2F2ZSBhcyBEcmFmdCc7XG4gICAgdGhpcy5jb25maXJtTWVzc2FnZSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2F2ZSB0aGlzIGNvaG9ydCBhcyBhIGRyYWZ0PyBZb3UgY2FuIGNvbnRpbnVlIGVkaXRpbmcgbGF0ZXIuJztcbiAgICB0aGlzLmNvbmZpcm1BY3Rpb24gPSAnZHJhZnQnO1xuICAgIHRoaXMuc2hvd0NvbmZpcm1Nb2RhbCA9IHRydWU7XG4gIH1cblxuICBzdWJtaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maXJtVGl0bGUgPSAnU3VibWl0IENvaG9ydCc7XG4gICAgdGhpcy5jb25maXJtTWVzc2FnZSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc3VibWl0IHRoaXMgY29ob3J0PyBPbmNlIHN1Ym1pdHRlZCBpdCB3aWxsIGJlIGFjdGl2YXRlZC4nO1xuICAgIHRoaXMuY29uZmlybUFjdGlvbiA9ICdzdWJtaXQnO1xuICAgIHRoaXMuc2hvd0NvbmZpcm1Nb2RhbCA9IHRydWU7XG4gIH1cblxuICBjb25maXJtUHJvY2VlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDb25maXJtTW9kYWwgPSBmYWxzZTtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNvbmZpcm1BY3Rpb247XG4gICAgdGhpcy5jb25maXJtQWN0aW9uID0gbnVsbDtcblxuICAgIGNvbnN0IGlzVXBkYXRlRmxvdyA9IHRoaXMuaXNFZGl0TW9kZSAmJiAhIXRoaXMuY29ob3J0SWQ7XG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSAmJiAhdGhpcy5jb2hvcnRJZCkge1xuICAgICAgdGhpcy5zaG93VG9hc3QoJ01pc3NpbmcgY29ob3J0SWQuIFVuYWJsZSB0byB1cGRhdGUgY29ob3J0LicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IGlzVXBkYXRlRmxvdyA/IHRoaXMuYnVpbGRVcGRhdGVQYXlsb2FkKCkgOiB0aGlzLmJ1aWxkQ3JlYXRlUGF5bG9hZCgpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJlcXVlc3QkID0gaXNVcGRhdGVGbG93XG4gICAgICA/IHRoaXMuYXVkaW9TZXJ2aWNlLnVwZGF0ZUNvaG9ydChwYXlsb2FkKVxuICAgICAgOiB0aGlzLmF1ZGlvU2VydmljZS5jcmVhdGVDb2hvcnQocGF5bG9hZCk7XG5cbiAgICByZXF1ZXN0JC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoYWN0aW9uID09PSAnZHJhZnQnKSB7XG4gICAgICAgICAgdGhpcy5zaG93VG9hc3QoaXNVcGRhdGVGbG93ID8gJ0NvaG9ydCB1cGRhdGVkIGFzIGRyYWZ0IHN1Y2Nlc3NmdWxseSEnIDogJ0NvaG9ydCBzYXZlZCBhcyBkcmFmdCBzdWNjZXNzZnVsbHkhJywgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdzdWJtaXQnKSB7XG4gICAgICAgICAgdGhpcy5zaG93VG9hc3QoaXNVcGRhdGVGbG93ID8gJ0NvaG9ydCB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnIDogJ0NvaG9ydCBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvYWktYXVkaW8vbWFuYWdlLWNvaG9ydCddKSwgMTgwMCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QoaXNVcGRhdGVGbG93ID8gJ0ZhaWxlZCB0byB1cGRhdGUgY29ob3J0LiBQbGVhc2UgdHJ5IGFnYWluLicgOiAnRmFpbGVkIHRvIHNhdmUgY29ob3J0LiBQbGVhc2UgdHJ5IGFnYWluLicsICd3YXJuaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjYW5jZWxDb25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbmZpcm1Nb2RhbCA9IGZhbHNlO1xuICAgIHRoaXMuY29uZmlybUFjdGlvbiA9IG51bGw7XG4gIH1cblxuICBzaG93VG9hc3QobWVzc2FnZTogc3RyaW5nLCB0eXBlOiAnc3VjY2VzcycgfCAnd2FybmluZycgfCAnZXJyb3InKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMudG9hc3RUeXBlID0gdHlwZTtcbiAgICB0aGlzLnRvYXN0VmlzaWJsZSA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMudG9hc3RWaXNpYmxlID0gZmFsc2U7IH0sIDMwMDApO1xuICB9XG5cbiAgc3dpdGNoVG9FZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuYXBwbHlNb2RlKCdlZGl0Jyk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICBxdWVyeVBhcmFtczogeyBtb2RlOiAnZWRpdCcsIGNvaG9ydElkOiB0aGlzLmNvaG9ydElkIH0sXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXG4gICAgfSk7XG4gIH1cblxuICBnb0JhY2soKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvdGFuZ28tYWktYXVkaW8vbWFuYWdlLWNvaG9ydCddKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFkZC1tYW5hZ2UtY29ob3J0XCI+XHJcblxyXG4gICAgPCEtLSDilIDilIAgTnVtZXJpY2FsIENvbmZpcm0gTW9kYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbmZpcm0tbW9kYWwtb3ZlcmxheVwiICpuZ0lmPVwic2hvd051bWVyaWNhbENvbmZpcm1Nb2RhbFwiIChjbGljayk9XCJjYW5jZWxOdW1lcmljYWxUb2dnbGUoKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLW1vZGFsXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlybS1tb2RhbC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjBcIiBjeT1cIjIwXCIgcj1cIjIwXCIgZmlsbD1cIiNGRUYzQzdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjAgMTNWMjFNMjAgMjdIMjAuMDFcIiBzdHJva2U9XCIjRDk3NzA2XCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGgzIGNsYXNzPVwiY29uZmlybS1tb2RhbC10aXRsZVwiPkVuYWJsZSBOdW1lcmljYWwgVmFsdWU8L2gzPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImNvbmZpcm0tbW9kYWwtbWVzc2FnZVwiPkNvbnRleHQgeW91IGFkZGVkIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtZXRyaWMgYnkgZW5hYmxpbmcgdGhlIG51bWVyaWNhbCB2YWx1ZS4gQXJlIHlvdSBzdXJlIHRvIHByb2NlZWQ/PC9wPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlybS1tb2RhbC1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNhbmNlbC1tb2RhbFwiIChjbGljayk9XCJjYW5jZWxOdW1lcmljYWxUb2dnbGUoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1jb25maXJtLW1vZGFsXCIgKGNsaWNrKT1cImNvbmZpcm1OdW1lcmljYWxUb2dnbGUoKVwiPlllcywgUHJvY2VlZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0g4pSA4pSAIENvbmZpcm1hdGlvbiBNb2RhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29uZmlybS1tb2RhbC1vdmVybGF5XCIgKm5nSWY9XCJzaG93Q29uZmlybU1vZGFsXCIgKGNsaWNrKT1cImNhbmNlbENvbmZpcm0oKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLW1vZGFsXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlybS1tb2RhbC1pY29uXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQwXCIgaGVpZ2h0PVwiNDBcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjBcIiBjeT1cIjIwXCIgcj1cIjIwXCIgZmlsbD1cIiNGRUYzQzdcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjAgMTNWMjFNMjAgMjdIMjAuMDFcIiBzdHJva2U9XCIjRDk3NzA2XCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGgzIGNsYXNzPVwiY29uZmlybS1tb2RhbC10aXRsZVwiPnt7IGNvbmZpcm1UaXRsZSB9fTwvaDM+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiY29uZmlybS1tb2RhbC1tZXNzYWdlXCI+e3sgY29uZmlybU1lc3NhZ2UgfX08L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLW1vZGFsLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tY2FuY2VsLW1vZGFsXCIgKGNsaWNrKT1cImNhbmNlbENvbmZpcm0oKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1jb25maXJtLW1vZGFsXCIgKGNsaWNrKT1cImNvbmZpcm1Qcm9jZWVkKClcIj5ZZXMsIENvbmZpcm08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIOKUgOKUgCBUb2FzdCBOb3RpZmljYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvaG9ydC10b2FzdFwiIFtjbGFzcy52aXNpYmxlXT1cInRvYXN0VmlzaWJsZVwiIFtjbGFzcy50b2FzdC1zdWNjZXNzXT1cInRvYXN0VHlwZT09PSdzdWNjZXNzJ1wiPlxyXG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xMCAxOC4zMzMzQzE0LjYwMjQgMTguMzMzMyAxOC4zMzMzIDE0LjYwMjQgMTguMzMzMyAxMEMxOC4zMzMzIDUuMzk3NjMgMTQuNjAyNCAxLjY2NjY3IDEwIDEuNjY2NjdDNS4zOTc2MyAxLjY2NjY3IDEuNjY2NjcgNS4zOTc2MyAxLjY2NjY3IDEwQzEuNjY2NjcgMTQuNjAyNCA1LjM5NzYzIDE4LjMzMzMgMTAgMTguMzMzM1pcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgLz5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjUgMTBMOS4xNjY2NyAxMS42NjY3TDEyLjUgOC4zMzMzM1wiIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIHt7IHRvYXN0TWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSDilIDilIAgVG9wIEhlYWRlciBCYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvcC1oZWFkZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLWhlYWRlci1sZWZ0XCI+XHJcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cImhlYWRlci10aXRsZVwiPnt7IGhlYWRlclRpdGxlIH19PC9oND5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJoZWFkZXItc3VidGl0bGVcIj57eyBoZWFkZXJTdWJ0aXRsZSB9fTwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLWhlYWRlci1hY3Rpb25zIG15LTNcIj5cclxuICAgICAgICAgICAgPCEtLSBWaWV3IE1vZGU6IG9ubHkgc2hvdyBFZGl0IGJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVmlld01vZGVcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwic3dpdGNoVG9FZGl0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8yMzk4XzM2NylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC4xNjggMi40OTk5M0MxNC4zODY4IDIuMjgxMDYgMTQuNjQ2NyAyLjEwNzQ0IDE0LjkzMjYgMS45ODg5OUMxNS4yMTg2IDEuODcwNTQgMTUuNTI1MSAxLjgwOTU3IDE1LjgzNDYgMS44MDk1N0MxNi4xNDQyIDEuODA5NTcgMTYuNDUwNyAxLjg3MDU0IDE2LjczNjYgMS45ODg5OUMxNy4wMjI2IDIuMTA3NDQgMTcuMjgyNCAyLjI4MTA2IDE3LjUwMTMgMi40OTk5M0MxNy43MjAyIDIuNzE4OCAxNy44OTM4IDIuOTc4NjMgMTguMDEyMiAzLjI2NDZDMTguMTMwNyAzLjU1MDU3IDE4LjE5MTcgMy44NTcwNiAxOC4xOTE3IDQuMTY2NTlDMTguMTkxNyA0LjQ3NjEyIDE4LjEzMDcgNC43ODI2MiAxOC4wMTIyIDUuMDY4NTlDMTcuODkzOCA1LjM1NDU1IDE3LjcyMDIgNS42MTQzOSAxNy41MDEzIDUuODMzMjZMNi4yNTEzIDE3LjA4MzNMMS42Njc5NyAxOC4zMzMzTDIuOTE3OTcgMTMuNzQ5OUwxNC4xNjggMi40OTk5M1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzIzOThfMzY3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBFZGl0IENvaG9ydFxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8IS0tIENyZWF0ZSAvIEVkaXQgTW9kZTogU2F2ZSBEcmFmdCArIFN1Ym1pdCAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1ZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJidG4tZHJhZnRcIiAoY2xpY2spPVwic2F2ZURyYWZ0KClcIj5TYXZlIEFzIERyYWZ0PC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zdWJtaXRcIiAoY2xpY2spPVwic3VibWl0KClcIj5TdWJtaXQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIOKUgOKUgCBGb3JtIEJvZHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tYm9keVwiPlxyXG5cclxuICAgICAgICA8IS0tIENvaG9ydCBOYW1lIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+Q29ob3J0IE5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0taW5wdXRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIENvaG9ydCBOYW1lXCIgWyhuZ01vZGVsKV09XCJjb2hvcnROYW1lXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBDb2hvcnQgRGVzY3JpcHRpb24gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5Db2hvcnQgRGVzY3JpcHRpb248L2xhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0taW5wdXQgZm9ybS1pbnB1dC0taW5kZW50XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb2hvcnQgZGVzY3JpcHRpb24uLi5cIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2hvcnREZXNjcmlwdGlvblwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTb3VyY2UgTXVsdGktc2VsZWN0IERyb3Bkb3duIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+U2VsZWN0IFNvdXJjZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3QtY29udGFpbmVyIHctNTBcIiBbY2xhc3Mudmlldy1kaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktc2VsZWN0LXRyaWdnZXJcIiAoY2xpY2spPVwiIWlzVmlld01vZGUgJiYgdG9nZ2xlU291cmNlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNvdXJjZURpc3BsYXkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZV09XCJpc1NvdXJjZURyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41TDEwIDEyLjVMMTUgNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC1kcm9wZG93blwiICpuZ0lmPVwiaXNTb3VyY2VEcm9wZG93bk9wZW5cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1ib3ggcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggU291cmNlLi4uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic291cmNlU2VhcmNoVGV4dFwiIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlclNvdXJjZXMoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC1vcHRpb25cIiAoY2xpY2spPVwic2VsZWN0QWxsU291cmNlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJzZWxlY3RlZFNvdXJjZXMubGVuZ3RoID09PSBzb3VyY2VPcHRpb25zLmxlbmd0aFwiIHJlYWRvbmx5IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlNlbGVjdCBBbGw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgcyBvZiBmaWx0ZXJlZFNvdXJjZU9wdGlvbnNcIiAoY2xpY2spPVwidG9nZ2xlU291cmNlKHMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1NvdXJjZVNlbGVjdGVkKHMpXCIgcmVhZG9ubHkgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSDilIDilIAgTWV0cmljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkXCIgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiBtZXRyaWNzOyBsZXQgbWkgPSBpbmRleFwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1oZWFkZXItcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtZXRyaWMtdGl0bGVcIj5NZXRyaWMge3sgbWkgKyAxIH19PC9oNT5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBNZXRyaWMgTmFtZSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgTWV0cmljIE5hbWVcIiBbKG5nTW9kZWwpXT1cIm1ldHJpYy5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBNZXRyaWMgRGVzY3JpcHRpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0taW5wdXQgZm9ybS1pbnB1dC0taW5kZW50XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBEZXNjcmlwdGlvbi4uLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtZXRyaWMuZGVzY3JpcHRpb25cIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBQcm92aWRlIENvbnRleHQgSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LWhlYWRlci1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250ZXh0LWxhYmVsXCI+UHJvdmlkZSBDb250ZXh0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udGV4dC1zdWJsYWJlbFwiPkNoZWNrIHdoZXRoZXIgdGhlIGZvbGxvd2luZyBhcmUgZGlzY3Vzc2VkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1oZWFkZXItcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtdGV4dFwiPk51bWVyaWNhbCBWYWx1ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwibWV0cmljLm51bWVyaWNhbFZhbHVlXCIgW2Rpc2FibGVkXT1cImlzVmlld01vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTnVtZXJpY2FsVG9nZ2xlKG1pKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1zbGlkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFkZC1jb250ZXh0XCIgKGNsaWNrKT1cImFkZENvbnRleHQobWkpXCIgW2Rpc2FibGVkXT1cImlzVmlld01vZGUgfHwgbWV0cmljLm51bWVyaWNhbFZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDMuMzMzMzdWMTIuNjY2N00zLjMzMzM0IDguMDAwMDRIMTIuNjY2N1wiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjMzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkIE5ld1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSDilIDilIAgTnVtZXJpY2FsIFNlY3Rpb24gKHNob3duIHdoZW4gdG9nZ2xlIGlzIE9OKSDilIDilIAgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXRyaWMubnVtZXJpY2FsVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW4tbWF4LWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwibWV0cmljLm1pbk1heEVuYWJsZWRcIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1pbiBhbmQgTWF4IFJhbmdlIFZhbGlkYXRpb248L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm51bWVyaWNhbC1zZWN0aW9uXCIgKm5nSWY9XCJtZXRyaWMubWluTWF4RW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwcGVyLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RlcHBlci1sYWJlbFwiPk1pbiBWYWx1ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXBwZXItY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0ZXBwZXItYnRuXCIgKGNsaWNrKT1cImRlY3JlbWVudE1pbihtaSlcIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiPuKAlDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwcGVyLXZhbHVlXCI+e3sgbWV0cmljLm1pblZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0ZXBwZXItYnRuXCIgKGNsaWNrKT1cImluY3JlbWVudE1pbihtaSlcIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiPis8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXBwZXItZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwcGVyLWxhYmVsXCI+TWF4IFZhbHVlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcHBlci1jb250cm9sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RlcHBlci1idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50TWF4KG1pKVwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCI+4oCUPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ZXBwZXItdmFsdWVcIj57eyBtZXRyaWMubWF4VmFsdWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RlcHBlci1idG5cIiAoY2xpY2spPVwiaW5jcmVtZW50TWF4KG1pKVwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCI+KzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQ29udGV4dCBJdGVtcyAoaGlkZGVuIHdoZW4gbnVtZXJpY2FsIHZhbHVlIGlzIE9OKSAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZXRyaWMubnVtZXJpY2FsVmFsdWVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtaXRlbS1jb250YWluZXJcIiAqbmdGb3I9XCJsZXQgY3R4IG9mIG1ldHJpYy5jb250ZXh0czsgbGV0IGNpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1pdGVtLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRleHQtaXRlbS10aXRsZVwiPkNvbnRleHQge3sgY2kgKyAxIH19IERldGFpbHM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250ZXh0LXJlbW92ZS1idG5cIiAoY2xpY2spPVwicmVtb3ZlQ29udGV4dChtaSwgY2kpXCIgdGl0bGU9XCJSZW1vdmUgY29udGV4dFwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUgNUw1IDE1TTUgNUwxNSAxNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1maWVsZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0taW5wdXQgY29udGV4dC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdHguY29udGV4dFwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEN1c3RvbSBTaW5nbGUtc2VsZWN0IFdlaWdodGFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0LWNvbnRhaW5lciB3LTI1IGNvbnRleHQtc2VsZWN0XCIgW2NsYXNzLnZpZXctZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0LXRyaWdnZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiIWlzVmlld01vZGUgJiYgdG9nZ2xlV2VpZ2h0YWdlRHJvcGRvd24obWksIGNpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjdHgud2VpZ2h0YWdlIHx8ICdTZWxlY3QgV2VpZ2h0YWdlJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIFtjbGFzcy5yb3RhdGVdPVwiY3R4LmlzV2VpZ2h0YWdlT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDcuNUwxMCAxMi41TDE1IDcuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXNlbGVjdC1kcm9wZG93blwiICpuZ0lmPVwiY3R4LmlzV2VpZ2h0YWdlT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgdyBvZiB3ZWlnaHRhZ2VPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RXZWlnaHRhZ2UobWksIGNpLCB3KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1pbnB1dCBmb3JtLWlucHV0LS1pbmRlbnRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIERlc2NyaXB0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3R4LmRlc2NyaXB0aW9uXCIgW2Rpc2FibGVkXT1cImlzVmlld01vZGVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIFN1Z2dlc3RlZCBEZXNjcmlwdGlvbnMgU2VjdGlvbiAoaGlkZGVuIGluIHZpZXcgbW9kZSkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Z2dlc3RlZC1kZXNjLXNlY3Rpb24gbXQtM1wiICpuZ0lmPVwiIWlzVmlld01vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzdWdnZXN0ZWQtdGl0bGVcIj5UcnkgdGhlIHN1Z2dlc3RlZCBkZXNjcmlwdGlvbnM8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWdnZXN0ZWQtY2hpcHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VnZ2VzdGVkLWNoaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXRjaFN1Z2dlc3RlZERlc2NyaXB0aW9uKG1pLCBjaSwgJ0lmIHRoZSBjb252ZXJzYXRpb24gaGFzIGJlZW4gZG9uZSB3aXRoIHRoZSBncmVldGluZ3MgZnJvbSB0aGUgc3RhcnQgYW5kIGVuZCwgdGhlbiBpdCBpcyB0cnVlLicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGNvbnZlcnNhdGlvbiBoYXMgYmVlbiBkb25lIHdpdGggdGhlIGdyZWV0aW5ncyBmcm9tIHRoZSBzdGFydCBhbmQgZW5kLCB0aGVuIGl0IGlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VnZ2VzdGVkLWNoaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXRjaFN1Z2dlc3RlZERlc2NyaXB0aW9uKG1pLCBjaSwgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0IGNvbnNlY3RldHVyLicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQgY29uc2VjdGV0dXIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Z2dlc3RlZC1jaGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicGF0Y2hTdWdnZXN0ZWREZXNjcmlwdGlvbihtaSwgY2ksICdGcmluZ2lsbGEgbGVvIGVnZXQgbmFtIG5lYyBhcmN1IHRyaXN0aXF1ZSB0cmlzdGlxdWUuJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmluZ2lsbGEgbGVvIGVnZXQgbmFtIG5lYyBhcmN1IHRyaXN0aXF1ZSB0cmlzdGlxdWUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gTWV0cmljIEZvb3RlciBBY3Rpb25zIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1ldHJpYy1hY3Rpb24tYnRuXCIgdGl0bGU9XCJEdXBsaWNhdGUgTWV0cmljXCIgKGNsaWNrKT1cImR1cGxpY2F0ZU1ldHJpYyhtaSlcIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNi42NjY2OVwiIHk9XCI2LjY2NjYzXCIgd2lkdGg9XCIxMS42NjY3XCIgaGVpZ2h0PVwiMTEuNjY2N1wiIHJ4PVwiMlwiIHN0cm9rZT1cIiM2NjcwODVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy4zMzMzMSAxMy4zMzMzSDIuNDk5OThDMi4wNTc5NSAxMy4zMzMzIDEuNjM0MDMgMTMuMTU3NyAxLjMyMTQ3IDEyLjg0NTJDMS4wMDg5MSAxMi41MzI2IDAuODMzMzEzIDEyLjEwODcgMC44MzMzMTMgMTEuNjY2NlYyLjQ5OTk2QzAuODMzMzEzIDIuMDU3OTMgMS4wMDg5MSAxLjYzNDAxIDEuMzIxNDcgMS4zMjE0NUMxLjYzNDAzIDEuMDA4ODkgMi4wNTc5NSAwLjgzMzI5MyAyLjQ5OTk4IDAuODMzMjkzSDExLjY2NjZDMTIuMTA4NyAwLjgzMzI5MyAxMi41MzI2IDEuMDA4ODkgMTIuODQ1MiAxLjMyMTQ1QzEzLjE1NzcgMS42MzQwMSAxMy4zMzMzIDIuMDU3OTMgMTMuMzMzMyAyLjQ5OTk2VjMuMzMzMjlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJtZXRyaWMtYWN0aW9uLWJ0biBtZXRyaWMtZGVsZXRlLWJ0blwiIHRpdGxlPVwiRGVsZXRlIE1ldHJpY1wiIChjbGljayk9XCJyZW1vdmVNZXRyaWMobWkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZSB8fCBtZXRyaWNzLmxlbmd0aCA8PSAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMi41IDVINC4xNjY2N0gxNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02LjY2NjY5IDUuMDAwMDRWMy4zMzMzN0M2LjY2NjY5IDIuODkxMzUgNi44NDIyOCAyLjQ2NzQyIDcuMTU0ODQgMi4xNTQ4NkM3LjQ2NzQgMS44NDIzIDcuODkxMzMgMS42NjY3MSA4LjMzMzM1IDEuNjY2NzFIMTEuNjY2N0MxMi4xMDg3IDEuNjY2NzEgMTIuNTMyNiAxLjg0MjMgMTIuODQ1MiAyLjE1NDg2QzEzLjE1NzggMi40Njc0MiAxMy4zMzM0IDIuODkxMzUgMTMuMzMzNCAzLjMzMzM3VjUuMDAwMDRNMTUuODMzNCA1LjAwMDA0VjE2LjY2NjdDMTUuODMzNCAxNy4xMDg3IDE1LjY1NzggMTcuNTMyNyAxNS4zNDUyIDE3Ljg0NTJDMTUuMDMyNiAxOC4xNTc4IDE0LjYwODcgMTguMzMzNCAxNC4xNjY3IDE4LjMzMzRINS44MzMzNUM1LjM5MTMzIDE4LjMzMzQgNC45Njc0IDE4LjE1NzggNC42NTQ4NCAxNy44NDUyQzQuMzQyMjggMTcuNTMyNyA0LjE2NjY5IDE3LjEwODcgNC4xNjY2OSAxNi42NjY3VjUuMDAwMDRIMTUuODMzNFpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEFkZCBOZXcgTWV0cmljIEJ1dHRvbiAtLT5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFkZC1tZXRyaWNcIiAgKGNsaWNrKT1cImFkZE1ldHJpYygpXCIgW2Rpc2FibGVkXT1cImlzVmlld01vZGVcIj5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDQuMTY2OTlWMTUuODMzN000LjE2NjY5IDEwLjAwMDNIMTUuODMzNFwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgQWRkIE5ldyBNZXRyaWNcclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
481
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW1hbmFnZS1jb2hvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYWktYXVkaW8vc3JjL2xpYi9jb21wb25lbnRzL2FkZC1tYW5hZ2UtY29ob3J0L2FkZC1tYW5hZ2UtY29ob3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFpLWF1ZGlvL3NyYy9saWIvY29tcG9uZW50cy9hZGQtbWFuYWdlLWNvaG9ydC9hZGQtbWFuYWdlLWNvaG9ydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQXNDaEUsTUFBTSxPQUFPLHdCQUF3QjtJQThEekI7SUFDQTtJQUNBO0lBQ0E7SUFoRVYsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRW5CLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDcEIsYUFBYSxHQUF1QyxJQUFJLENBQUM7SUFFekQseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLDJCQUEyQixHQUFrQixJQUFJLENBQUM7SUFFbEQsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLFNBQVMsR0FBb0MsU0FBUyxDQUFDO0lBRXZELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFbEIsUUFBUSxHQUFrQixJQUFJLENBQUM7SUFDL0IsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNoQixpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFFdkIsZUFBZSxHQUFhLEVBQUUsQ0FBQztJQUMvQixvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFDN0IsZ0JBQWdC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LENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDdEIsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN0RCxtQkFBbUIsRUFBRSxPQUFPO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxxRUFBcUUsQ0FBQztRQUM1RixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7d0dBamdCVSx3QkFBd0I7NEZBQXhCLHdCQUF3QixtSUN0Q3JDLDB0ckJBMlRBOzs0RkRyUmEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHVCQUF1QjtpS0F5RGpDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XG5pbXBvcnQgeyBBdWRpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdWRpby5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBDb2hvcnRDb250ZXh0IHtcbiAgY29udGV4dDogc3RyaW5nO1xuICB3ZWlnaHRhZ2U6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgaXNXZWlnaHRhZ2VPcGVuPzogYm9vbGVhbjtcbiAgc3VnZ2VzdGlvbnM/OiBBcnJheTx7IGlkOiBudW1iZXI7IHRleHQ6IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZyB9PjtcbiAgaXNTdWdnZXN0aW9uTG9hZGluZz86IGJvb2xlYW47XG4gIHdlaWdodGFnZUVycm9yPzogYm9vbGVhbjtcbiAgZGVzY3JpcHRpb25FcnJvcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ob3J0TWV0cmljIHtcbiAgbWV0cmljSWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgbnVtZXJpY2FsVmFsdWU6IGJvb2xlYW47XG4gIG1pbk1heEVuYWJsZWQ6IGJvb2xlYW47XG4gIG1pblZhbHVlOiBudW1iZXI7XG4gIG1heFZhbHVlOiBudW1iZXI7XG4gIGNvbnRleHRzOiBDb2hvcnRDb250ZXh0W107XG4gIF9zYXZlZENvbnRleHRzPzogQ29ob3J0Q29udGV4dFtdO1xufVxuXG5pbnRlcmZhY2UgU291cmNlT3B0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWFkZC1tYW5hZ2UtY29ob3J0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1tYW5hZ2UtY29ob3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWRkLW1hbmFnZS1jb2hvcnQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBZGRNYW5hZ2VDb2hvcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBpc1ZpZXdNb2RlID0gZmFsc2U7XG4gIGlzRWRpdE1vZGUgPSBmYWxzZTtcblxuICBzaG93Q29uZmlybU1vZGFsID0gZmFsc2U7XG4gIGNvbmZpcm1UaXRsZSA9ICcnO1xuICBjb25maXJtTWVzc2FnZSA9ICcnO1xuICBjb25maXJtQWN0aW9uOiAnZHJhZnQnIHwgJ3N1Ym1pdCcgfCAnYmFjaycgfCBudWxsID0gbnVsbDtcblxuICBzaG93TnVtZXJpY2FsQ29uZmlybU1vZGFsID0gZmFsc2U7XG4gIHBlbmRpbmdOdW1lcmljYWxNZXRyaWNJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgdG9hc3RWaXNpYmxlID0gZmFsc2U7XG4gIHRvYXN0TWVzc2FnZSA9ICcnO1xuICB0b2FzdFR5cGU6ICdzdWNjZXNzJyB8ICd3YXJuaW5nJyB8ICdlcnJvcicgPSAnc3VjY2Vzcyc7XG5cbiAgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgY29ob3J0SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBjb2hvcnROYW1lID0gJyc7XG4gIGNvaG9ydERlc2NyaXB0aW9uID0gJyc7XG5cbiAgc2VsZWN0ZWRTb3VyY2VzOiBzdHJpbmdbXSA9IFtdO1xuICBpc1NvdXJjZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICBzb3VyY2VTZWFyY2hUZXh0ID0gJyc7XG4gIGZpbHRlcmVkU291cmNlT3B0aW9uczogU291cmNlT3B0aW9uW10gPSBbXTtcblxuICBoZWFkZXJUaXRsZSA9ICdDcmVhdGUgTmV3IENvaG9ydCc7XG4gIGhlYWRlclN1YnRpdGxlID0gJ0RlZmluZSB5b3VyIGNvaG9ydCBtZXRyaWNzIGFuZCBjb250ZXh0IHRvIGFuYWx5emUgY29udmVyc2F0aW9ucy4nO1xuXG4gIHdlaWdodGFnZU9wdGlvbnMgPSBbJ0xvdycsICdNZWRpdW0nLCAnSGlnaCcsICdDcml0aWNhbCddO1xuICBzb3VyY2VPcHRpb25zOiBTb3VyY2VPcHRpb25bXSA9IFtcbiAgICB7IGlkOiAnMScsIGxhYmVsOiAnQ29ubmVjdCcgfSxcbiAgICB7IGlkOiAnMicsIGxhYmVsOiAnUG93ZXIgQmFuaycgfSxcbiAgICB7IGlkOiAnMycsIGxhYmVsOiAnSE9QJyB9LFxuICAgIHsgaWQ6ICc0JywgbGFiZWw6ICdGbG93IEFwcCcgfVxuICBdO1xuXG4gIG1ldHJpY3M6IENvaG9ydE1ldHJpY1tdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgbnVtZXJpY2FsVmFsdWU6IGZhbHNlLFxuICAgICAgbWluTWF4RW5hYmxlZDogZmFsc2UsXG4gICAgICBtaW5WYWx1ZTogMCxcbiAgICAgIG1heFZhbHVlOiAwLFxuICAgICAgY29udGV4dHM6IFtcbiAgICAgICAgeyBjb250ZXh0OiAnJywgd2VpZ2h0YWdlOiAnJywgZGVzY3JpcHRpb246ICcnIH1cbiAgICAgIF1cbiAgICB9XG4gIF07XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCF0YXJnZXQuY2xvc2VzdCgnLm11bHRpLXNlbGVjdC1jb250YWluZXInKSAmJiAhdGFyZ2V0LmNsb3Nlc3QoJy5jdXN0b20tc2VsZWN0LWNvbnRhaW5lcicpKSB7XG4gICAgICB0aGlzLmlzU291cmNlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLm1ldHJpY3MuZm9yRWFjaChtID0+IG0uY29udGV4dHMuZm9yRWFjaChjID0+IGMuaXNXZWlnaHRhZ2VPcGVuID0gZmFsc2UpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcGFnZUluZm86IFBhZ2VJbmZvU2VydmljZSxcbiAgICBwcml2YXRlIGF1ZGlvU2VydmljZTogQXVkaW9TZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IG5hdmlnYXRpb24gPSB0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpO1xuICAgIGNvbnN0IG1vZGUgPSBuYXZpZ2F0aW9uPy5leHRyYXMuc3RhdGU/LlsnbW9kZSddIGFzIHN0cmluZztcbiAgICB0aGlzLmFwcGx5TW9kZShtb2RlIHx8ICdjcmVhdGUnKTtcblxuICAgIGlmIChuYXZpZ2F0aW9uPy5leHRyYXMuc3RhdGU/LlsnY29ob3J0J10pIHtcbiAgICAgIHRoaXMubG9hZENvaG9ydChuYXZpZ2F0aW9uLmV4dHJhcy5zdGF0ZVsnY29ob3J0J10pO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcmVkU291cmNlT3B0aW9ucyA9IFsuLi50aGlzLnNvdXJjZU9wdGlvbnNdO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYWdlRGF0YSgpO1xuICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IG1vZGUgPSBwYXJhbXNbJ21vZGUnXSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBjb2hvcnRJZCA9IHBhcmFtc1snY29ob3J0SWQnXSBhcyBzdHJpbmc7XG5cbiAgICAgIGlmIChtb2RlKSB7XG4gICAgICAgIHRoaXMuYXBwbHlNb2RlKG1vZGUpO1xuICAgICAgfVxuICAgICAgaWYgKGNvaG9ydElkICYmIGNvaG9ydElkICE9PSB0aGlzLmNvaG9ydElkKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hDb2hvcnRCeUlkKGNvaG9ydElkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlNb2RlKG1vZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWV3TW9kZSA9IG1vZGUgPT09ICd2aWV3JztcbiAgICB0aGlzLmlzRWRpdE1vZGUgPSBtb2RlID09PSAnZWRpdCc7XG4gICAgaWYgKHRoaXMuaXNWaWV3TW9kZSkge1xuICAgICAgdGhpcy5oZWFkZXJUaXRsZSA9ICdWaWV3IENvaG9ydCc7XG4gICAgICB0aGlzLmhlYWRlclN1YnRpdGxlID0gJ1JldmlldyB0aGUgY29ob3J0IGRldGFpbHMgYmVsb3cuJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNFZGl0TW9kZSkge1xuICAgICAgdGhpcy5oZWFkZXJUaXRsZSA9ICdFZGl0IENvaG9ydCc7XG4gICAgICB0aGlzLmhlYWRlclN1YnRpdGxlID0gJ1VwZGF0ZSB5b3VyIGNvaG9ydCBtZXRyaWNzIGFuZCBjb250ZXh0Lic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyVGl0bGUgPSAnQ3JlYXRlIE5ldyBDb2hvcnQnO1xuICAgICAgdGhpcy5oZWFkZXJTdWJ0aXRsZSA9ICdEZWZpbmUgeW91ciBjb2hvcnQgbWV0cmljcyBhbmQgY29udGV4dCB0byBhbmFseXplIGNvbnZlcnNhdGlvbnMuJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZldGNoQ29ob3J0QnlJZChjb2hvcnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvaG9ydChjb2hvcnRJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZENvaG9ydChyZXNwb25zZT8uZGF0YSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhZ2VEYXRhKCkge1xuICAgIHRoaXMucGFnZUluZm8uc2V0VGl0bGUoJ01hbmFnZSBDb2hvcnRzJyk7XG4gICAgdGhpcy5wYWdlSW5mby5zZXREZXNjcmlwdGlvbignVG8gb3B0aW1pemUgYW5kIGltcHJvdmUgZXhpc3RpbmcgYWxnb3JpdGhtJyk7XG4gICAgdGhpcy5wYWdlSW5mby5zZXRCcmVhZGNydW1icyhbXG4gICAgICB7IHRpdGxlOiAnQXVkaW8nLCBwYXRoOiAnL21hbmFnZS9haS1hdWRpby9hdWRpbycsIGlzQWN0aXZlOiBmYWxzZSwgaXNTZXBhcmF0b3I6IGZhbHNlIH0sXG4gICAgICB7IHRpdGxlOiAnTWFuYWdlIENvaG9ydHMnLCBwYXRoOiAnJywgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogdHJ1ZSB9LFxuICAgIF0pO1xuICB9XG5cbiAgbG9hZENvaG9ydChkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvaG9ydElkID0gZGF0YS5jb2hvcnRJZCB8fCBkYXRhLmlkIHx8IG51bGw7XG4gICAgdGhpcy5jb2hvcnROYW1lID0gZGF0YS5jb2hvcnROYW1lIHx8IGRhdGEubmFtZSB8fCAnJztcbiAgICB0aGlzLmNvaG9ydERlc2NyaXB0aW9uID0gZGF0YS5jb2hvcnREZXNjcmlwdGlvbiB8fCBkYXRhLmRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRTb3VyY2VzID0gQXJyYXkuaXNBcnJheShkYXRhLnNvdXJjZSlcbiAgICAgID8gZGF0YS5zb3VyY2UubWFwKChzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcocykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZCA9IHRoaXMuc291cmNlT3B0aW9ucy5maW5kKFxuICAgICAgICAgIChvcHQpID0+IG9wdC5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbWF0Y2hlZCA/IG1hdGNoZWQubGFiZWwgOiBTdHJpbmcocyk7XG4gICAgICB9KVxuICAgICAgOiBbXTtcbiAgICBjb25zdCBsb2FkZWRNZXRyaWNzID0gQXJyYXkuaXNBcnJheShkYXRhLm1ldHJpY3MpID8gZGF0YS5tZXRyaWNzIDogW107XG4gICAgdGhpcy5tZXRyaWNzID0gbG9hZGVkTWV0cmljcy5sZW5ndGhcbiAgICAgID8gbG9hZGVkTWV0cmljcy5tYXAoKG06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBudW1lcmljYWxWYWx1ZSA9IG0uaXNOdW1lcmljID8/IG0ubnVtZXJpY2FsVmFsdWUgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvbnRleHRzID0gQXJyYXkuaXNBcnJheShtLmNvbnRleHRzKVxuICAgICAgICAgID8gbS5jb250ZXh0cy5tYXAoKGM6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGNvbnRleHQ6IGMuY29udGV4dE5hbWUgfHwgYy5jb250ZXh0IHx8ICcnLFxuICAgICAgICAgICAgd2VpZ2h0YWdlOiBjLndlaWdodGFnZSB8fCB0aGlzLnByaW9yaXR5VG9XZWlnaHRhZ2UoYy5wcmlvcml0eSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYy5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICAgIGlzV2VpZ2h0YWdlT3BlbjogZmFsc2VcbiAgICAgICAgICB9KSlcbiAgICAgICAgICA6IFtdO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWV0cmljSWQ6IG0ubWV0cmljSWQsXG4gICAgICAgICAgbmFtZTogbS5tZXRyaWNOYW1lIHx8IG0ubmFtZSB8fCAnJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogbS5tZXRyaWNEZXNjcmlwdGlvbiB8fCBtLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgIG51bWVyaWNhbFZhbHVlLFxuICAgICAgICAgIG1pbk1heEVuYWJsZWQ6IG0ubWluTWF4RW5hYmxlZCA/PyAobnVtZXJpY2FsVmFsdWUgJiYgKG0ubWluVmFsdWUgIT09IHVuZGVmaW5lZCB8fCBtLm1heFZhbHVlICE9PSB1bmRlZmluZWQpKSxcbiAgICAgICAgICBtaW5WYWx1ZTogbS5taW5WYWx1ZSA/PyAwLFxuICAgICAgICAgIG1heFZhbHVlOiBtLm1heFZhbHVlID8/IDAsXG4gICAgICAgICAgY29udGV4dHNcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICA6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICBudW1lcmljYWxWYWx1ZTogZmFsc2UsXG4gICAgICAgICAgbWluTWF4RW5hYmxlZDogZmFsc2UsXG4gICAgICAgICAgbWluVmFsdWU6IDAsXG4gICAgICAgICAgbWF4VmFsdWU6IDAsXG4gICAgICAgICAgY29udGV4dHM6IFt7IGNvbnRleHQ6ICcnLCB3ZWlnaHRhZ2U6ICcnLCBkZXNjcmlwdGlvbjogJycgfV1cbiAgICAgICAgfVxuICAgICAgXTtcblxuICAgIHRoaXMuYXBwbHlNb2RlKHRoaXMuaXNWaWV3TW9kZSA/ICd2aWV3JyA6IHRoaXMuaXNFZGl0TW9kZSA/ICdlZGl0JyA6ICdjcmVhdGUnKTtcbiAgfVxuXG4gIHRvZ2dsZVNvdXJjZURyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuaXNTb3VyY2VEcm9wZG93bk9wZW4gPSAhdGhpcy5pc1NvdXJjZURyb3Bkb3duT3BlbjtcbiAgfVxuXG4gIGlzU291cmNlU2VsZWN0ZWQoczogU291cmNlT3B0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRTb3VyY2VzLmluY2x1ZGVzKHMubGFiZWwpO1xuICB9XG5cbiAgdG9nZ2xlU291cmNlKHM6IFNvdXJjZU9wdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuc2VsZWN0ZWRTb3VyY2VzLmluZGV4T2Yocy5sYWJlbCk7XG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU291cmNlcy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFNvdXJjZXMucHVzaChzLmxhYmVsKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RBbGxTb3VyY2VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkU291cmNlcy5sZW5ndGggPT09IHRoaXMuc291cmNlT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTb3VyY2VzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTb3VyY2VzID0gdGhpcy5zb3VyY2VPcHRpb25zLm1hcChzID0+IHMubGFiZWwpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzb3VyY2VEaXNwbGF5KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdTZWxlY3QgdGhlIFNvdXJjZSc7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTb3VyY2VzLmxlbmd0aCA9PT0gdGhpcy5zb3VyY2VPcHRpb25zLmxlbmd0aCkgcmV0dXJuICdBbGwgU2VsZWN0ZWQnO1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkU291cmNlcy5qb2luKCcsICcpO1xuICB9XG5cbiAgZmlsdGVyU291cmNlcygpOiB2b2lkIHtcbiAgICBjb25zdCB0ZXh0ID0gKHRoaXMuc291cmNlU2VhcmNoVGV4dCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLmZpbHRlcmVkU291cmNlT3B0aW9ucyA9IHRoaXMuc291cmNlT3B0aW9ucy5maWx0ZXIocyA9PlxuICAgICAgcy5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpXG4gICAgKTtcbiAgfVxuXG4gIGFkZE1ldHJpYygpOiB2b2lkIHtcbiAgICB0aGlzLm1ldHJpY3MucHVzaCh7XG4gICAgICBuYW1lOiAnJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgIG51bWVyaWNhbFZhbHVlOiBmYWxzZSxcbiAgICAgIG1pbk1heEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgbWluVmFsdWU6IDAsXG4gICAgICBtYXhWYWx1ZTogMCxcbiAgICAgIGNvbnRleHRzOiBbeyBjb250ZXh0OiAnJywgd2VpZ2h0YWdlOiAnJywgZGVzY3JpcHRpb246ICcnLCBpc1dlaWdodGFnZU9wZW46IGZhbHNlIH1dXG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVNZXRyaWMoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLm1ldHJpY3MubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5tZXRyaWNzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgZHVwbGljYXRlTWV0cmljKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMubWV0cmljc1tpbmRleF07XG4gICAgY29uc3QgY29weTogQ29ob3J0TWV0cmljID0ge1xuICAgICAgbWV0cmljSWQ6IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogb3JpZ2luYWwuZGVzY3JpcHRpb24sXG4gICAgICBudW1lcmljYWxWYWx1ZTogb3JpZ2luYWwubnVtZXJpY2FsVmFsdWUsXG4gICAgICBtaW5NYXhFbmFibGVkOiBvcmlnaW5hbC5taW5NYXhFbmFibGVkLFxuICAgICAgbWluVmFsdWU6IG9yaWdpbmFsLm1pblZhbHVlLFxuICAgICAgbWF4VmFsdWU6IG9yaWdpbmFsLm1heFZhbHVlLFxuICAgICAgY29udGV4dHM6IG9yaWdpbmFsLmNvbnRleHRzLm1hcChjID0+ICh7IC4uLmMgfSkpXG4gICAgfTtcbiAgICB0aGlzLm1ldHJpY3Muc3BsaWNlKGluZGV4ICsgMSwgMCwgY29weSk7XG4gIH1cblxuICBvbk51bWVyaWNhbFRvZ2dsZShtaTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbWV0cmljID0gdGhpcy5tZXRyaWNzW21pXTtcbiAgICBpZiAobWV0cmljLm51bWVyaWNhbFZhbHVlKSB7XG4gICAgICAvLyBVc2VyIGNsaWNrZWQgT04g4oaSIHNhdmUgY3VycmVudCBjb250ZXh0cywgcmV2ZXJ0IHVudGlsIGNvbmZpcm1lZFxuICAgICAgbWV0cmljLl9zYXZlZENvbnRleHRzID0gbWV0cmljLmNvbnRleHRzLm1hcChjID0+ICh7IC4uLmMgfSkpO1xuICAgICAgbWV0cmljLm51bWVyaWNhbFZhbHVlID0gZmFsc2U7XG4gICAgICB0aGlzLnBlbmRpbmdOdW1lcmljYWxNZXRyaWNJbmRleCA9IG1pO1xuICAgICAgdGhpcy5zaG93TnVtZXJpY2FsQ29uZmlybU1vZGFsID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlciBjbGlja2VkIE9GRiDihpIgcmVzdG9yZSBzYXZlZCBjb250ZXh0cyBvciBhZGQgYSBmcmVzaCBvbmVcbiAgICAgIG1ldHJpYy5taW5NYXhFbmFibGVkID0gZmFsc2U7XG4gICAgICBtZXRyaWMuY29udGV4dHMgPSBtZXRyaWMuX3NhdmVkQ29udGV4dHMgJiYgbWV0cmljLl9zYXZlZENvbnRleHRzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBtZXRyaWMuX3NhdmVkQ29udGV4dHMubWFwKGMgPT4gKHsgLi4uYywgaXNXZWlnaHRhZ2VPcGVuOiBmYWxzZSB9KSlcbiAgICAgICAgOiBbeyBjb250ZXh0OiAnJywgd2VpZ2h0YWdlOiAnJywgZGVzY3JpcHRpb246ICcnLCBpc1dlaWdodGFnZU9wZW46IGZhbHNlIH1dO1xuICAgICAgbWV0cmljLl9zYXZlZENvbnRleHRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbmZpcm1OdW1lcmljYWxUb2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGVuZGluZ051bWVyaWNhbE1ldHJpY0luZGV4ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBtZXRyaWMgPSB0aGlzLm1ldHJpY3NbdGhpcy5wZW5kaW5nTnVtZXJpY2FsTWV0cmljSW5kZXhdO1xuICAgICAgbWV0cmljLm51bWVyaWNhbFZhbHVlID0gdHJ1ZTtcbiAgICAgIG1ldHJpYy5taW5NYXhFbmFibGVkID0gdHJ1ZTtcbiAgICAgIC8vIGNvbnRleHRzIGFscmVhZHkgc2F2ZWQgaW4gX3NhdmVkQ29udGV4dHM7IGNsZWFyIGFjdGl2ZSBjb250ZXh0c1xuICAgICAgbWV0cmljLmNvbnRleHRzID0gW107XG4gICAgfVxuICAgIHRoaXMuc2hvd051bWVyaWNhbENvbmZpcm1Nb2RhbCA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ051bWVyaWNhbE1ldHJpY0luZGV4ID0gbnVsbDtcbiAgfVxuXG4gIGNhbmNlbE51bWVyaWNhbFRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nTnVtZXJpY2FsTWV0cmljSW5kZXggIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldHJpYyA9IHRoaXMubWV0cmljc1t0aGlzLnBlbmRpbmdOdW1lcmljYWxNZXRyaWNJbmRleF07XG4gICAgICAvLyBSZXN0b3JlIGNvbnRleHRzIHRoYXQgd2VyZSBzYXZlZCBiZWZvcmUgdGhlIHRvZ2dsZSBjbGlja1xuICAgICAgaWYgKG1ldHJpYy5fc2F2ZWRDb250ZXh0cykge1xuICAgICAgICBtZXRyaWMuY29udGV4dHMgPSBtZXRyaWMuX3NhdmVkQ29udGV4dHMubWFwKGMgPT4gKHsgLi4uYywgaXNXZWlnaHRhZ2VPcGVuOiBmYWxzZSB9KSk7XG4gICAgICAgIG1ldHJpYy5fc2F2ZWRDb250ZXh0cyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIG1ldHJpYy5udW1lcmljYWxWYWx1ZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnNob3dOdW1lcmljYWxDb25maXJtTW9kYWwgPSBmYWxzZTtcbiAgICB0aGlzLnBlbmRpbmdOdW1lcmljYWxNZXRyaWNJbmRleCA9IG51bGw7XG4gIH1cblxuICBpbmNyZW1lbnRNaW4obWk6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWV0cmljc1ttaV0ubWluVmFsdWUrKztcbiAgfVxuXG4gIGRlY3JlbWVudE1pbihtaTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWV0cmljc1ttaV0ubWluVmFsdWUgPiAwKSB7XG4gICAgICB0aGlzLm1ldHJpY3NbbWldLm1pblZhbHVlLS07XG4gICAgfVxuICB9XG5cbiAgaW5jcmVtZW50TWF4KG1pOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1ldHJpY3NbbWldLm1heFZhbHVlKys7XG4gIH1cblxuICBkZWNyZW1lbnRNYXgobWk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLm1ldHJpY3NbbWldLm1heFZhbHVlID4gMCkge1xuICAgICAgdGhpcy5tZXRyaWNzW21pXS5tYXhWYWx1ZS0tO1xuICAgIH1cbiAgfVxuXG4gIGFkZENvbnRleHQobWV0cmljSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubWV0cmljc1ttZXRyaWNJbmRleF0uY29udGV4dHMucHVzaCh7XG4gICAgICBjb250ZXh0OiAnJyxcbiAgICAgIHdlaWdodGFnZTogJycsXG4gICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICBpc1dlaWdodGFnZU9wZW46IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVXZWlnaHRhZ2VEcm9wZG93bihtaTogbnVtYmVyLCBjaTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5tZXRyaWNzW21pXS5jb250ZXh0c1tjaV0uaXNXZWlnaHRhZ2VPcGVuO1xuICAgIHRoaXMubWV0cmljcy5mb3JFYWNoKG0gPT4gbS5jb250ZXh0cy5mb3JFYWNoKGMgPT4gYy5pc1dlaWdodGFnZU9wZW4gPSBmYWxzZSkpO1xuICAgIHRoaXMuaXNTb3VyY2VEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLm1ldHJpY3NbbWldLmNvbnRleHRzW2NpXS5pc1dlaWdodGFnZU9wZW4gPSAhY3VycmVudFN0YXRlO1xuICB9XG5cbiAgc2VsZWN0V2VpZ2h0YWdlKG1pOiBudW1iZXIsIGNpOiBudW1iZXIsIHdlaWdodDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tZXRyaWNzW21pXS5jb250ZXh0c1tjaV0ud2VpZ2h0YWdlID0gd2VpZ2h0O1xuICAgIHRoaXMubWV0cmljc1ttaV0uY29udGV4dHNbY2ldLmlzV2VpZ2h0YWdlT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMubWV0cmljc1ttaV0uY29udGV4dHNbY2ldLndlaWdodGFnZUVycm9yID0gZmFsc2U7XG4gIH1cblxuICByZW1vdmVDb250ZXh0KG1ldHJpY0luZGV4OiBudW1iZXIsIGNvbnRleHRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWV0cmljc1ttZXRyaWNJbmRleF0uY29udGV4dHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5tZXRyaWNzW21ldHJpY0luZGV4XS5jb250ZXh0cy5zcGxpY2UoY29udGV4dEluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICBwYXRjaFN1Z2dlc3RlZERlc2NyaXB0aW9uKG1pOiBudW1iZXIsIGNpOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWV0cmljc1ttaV0uY29udGV4dHNbY2ldLmRlc2NyaXB0aW9uID0gdGV4dDtcbiAgfVxuXG4gIGZldGNoU3VnZ2VzdGlvbnMobWk6IG51bWJlciwgY2k6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMubWV0cmljc1ttaV0uY29udGV4dHNbY2ldO1xuICAgIGlmICghY3R4LmNvbnRleHQpIHJldHVybjtcbiAgICBjdHguaXNTdWdnZXN0aW9uTG9hZGluZyA9IHRydWU7XG4gICAgY3R4LnN1Z2dlc3Rpb25zID0gW107XG4gICAgdGhpcy5hdWRpb1NlcnZpY2UuZ2V0R2VtaW5pU3VnZ2VzdGlvbnMoY3R4LmNvbnRleHQsIGN0eC5kZXNjcmlwdGlvbikuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGN0eC5zdWdnZXN0aW9ucyA9IHJlc3BvbnNlPy5kYXRhPy5zdWdnZXN0aW9ucyB8fCBbXTtcbiAgICAgICAgY3R4LmlzU3VnZ2VzdGlvbkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICBjdHguaXNTdWdnZXN0aW9uTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3ZWlnaHRhZ2VUb1ByaW9yaXR5KHdlaWdodGFnZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7ICdMb3cnOiAwLCAnTWVkaXVtJzogMSwgJ0hpZ2gnOiAyLCAnQ3JpdGljYWwnOiAzIH07XG4gICAgcmV0dXJuIG1hcFt3ZWlnaHRhZ2VdID8/IDE7XG4gIH1cblxuICBwcml2YXRlIHByaW9yaXR5VG9XZWlnaHRhZ2UocHJpb3JpdHk6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0geyAwOiAnTG93JywgMTogJ01lZGl1bScsIDI6ICdIaWdoJywgMzogJ0NyaXRpY2FsJyB9O1xuICAgIHJldHVybiBtYXBbcHJpb3JpdHldID8/ICdNZWRpdW0nO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE1ldHJpY1BheWxvYWQoaW5jbHVkZU1ldHJpY0lkOiBib29sZWFuKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY3MubWFwKG0gPT4ge1xuICAgICAgY29uc3QgbWV0cmljOiBhbnkgPSB7XG4gICAgICAgIG1ldHJpY05hbWU6IG0ubmFtZSxcbiAgICAgICAgbWV0cmljRGVzY3JpcHRpb246IG0uZGVzY3JpcHRpb24sXG4gICAgICAgIGlzTnVtZXJpYzogbS5udW1lcmljYWxWYWx1ZSxcbiAgICAgIH07XG4gICAgICBpZiAoaW5jbHVkZU1ldHJpY0lkICYmIG0ubWV0cmljSWQpIHtcbiAgICAgICAgbWV0cmljLm1ldHJpY0lkID0gbS5tZXRyaWNJZDtcbiAgICAgIH1cbiAgICAgIGlmIChtLm51bWVyaWNhbFZhbHVlICYmIG0ubWluTWF4RW5hYmxlZCkge1xuICAgICAgICBtZXRyaWMubWluVmFsdWUgPSBtLm1pblZhbHVlO1xuICAgICAgICBtZXRyaWMubWF4VmFsdWUgPSBtLm1heFZhbHVlO1xuICAgICAgfSBlbHNlIGlmICghbS5udW1lcmljYWxWYWx1ZSAmJiBtLmNvbnRleHRzKSB7XG4gICAgICAgIG1ldHJpYy5jb250ZXh0cyA9IG0uY29udGV4dHMubWFwKGMgPT4gKHtcbiAgICAgICAgICBjb250ZXh0TmFtZTogYy5jb250ZXh0LFxuICAgICAgICAgIHByaW9yaXR5OiB0aGlzLndlaWdodGFnZVRvUHJpb3JpdHkoYy53ZWlnaHRhZ2UpLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBjLmRlc2NyaXB0aW9uXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldHJpYy5jb250ZXh0cyA9IFtdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ldHJpYztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDcmVhdGVQYXlsb2FkKCk6IGFueSB7XG4gICAgY29uc3QgdXNlcnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSBhcyBzdHJpbmcpO1xuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRJZDogdXNlcnM/LmNsaWVudElkIHx8ICcxMScsXG4gICAgICBjb2hvcnROYW1lOiB0aGlzLmNvaG9ydE5hbWUsXG4gICAgICBjb2hvcnREZXNjcmlwdGlvbjogdGhpcy5jb2hvcnREZXNjcmlwdGlvbixcbiAgICAgIHNvdXJjZTogdGhpcy5zZWxlY3RlZFNvdXJjZXMsXG4gICAgICBtZXRyaWNzOiB0aGlzLmJ1aWxkTWV0cmljUGF5bG9hZChmYWxzZSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFVwZGF0ZVBheWxvYWQoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgY29ob3J0SWQ6IHRoaXMuY29ob3J0SWQsXG4gICAgICBjb2hvcnROYW1lOiB0aGlzLmNvaG9ydE5hbWUsXG4gICAgICBjb2hvcnREZXNjcmlwdGlvbjogdGhpcy5jb2hvcnREZXNjcmlwdGlvbixcbiAgICAgIHNvdXJjZTogdGhpcy5zZWxlY3RlZFNvdXJjZXMsXG4gICAgICBtZXRyaWNzOiB0aGlzLmJ1aWxkTWV0cmljUGF5bG9hZCh0cnVlKVxuICAgIH07XG4gIH1cblxuICBzYXZlRHJhZnQoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maXJtVGl0bGUgPSAnU2F2ZSBhcyBEcmFmdCc7XG4gICAgdGhpcy5jb25maXJtTWVzc2FnZSA9ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gc2F2ZSB0aGlzIGNvaG9ydCBhcyBhIGRyYWZ0PyBZb3UgY2FuIGNvbnRpbnVlIGVkaXRpbmcgbGF0ZXIuJztcbiAgICB0aGlzLmNvbmZpcm1BY3Rpb24gPSAnZHJhZnQnO1xuICAgIHRoaXMuc2hvd0NvbmZpcm1Nb2RhbCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQ29udGV4dEZpZWxkcygpOiBib29sZWFuIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIHRoaXMubWV0cmljcy5mb3JFYWNoKG0gPT4ge1xuICAgICAgaWYgKCFtLm51bWVyaWNhbFZhbHVlKSB7XG4gICAgICAgIG0uY29udGV4dHMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICBjLndlaWdodGFnZUVycm9yID0gISFjLmNvbnRleHQgJiYgIWMud2VpZ2h0YWdlO1xuICAgICAgICAgIGMuZGVzY3JpcHRpb25FcnJvciA9ICEhYy5jb250ZXh0ICYmICFjLmRlc2NyaXB0aW9uO1xuICAgICAgICAgIGlmIChjLndlaWdodGFnZUVycm9yIHx8IGMuZGVzY3JpcHRpb25FcnJvcikgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgc3VibWl0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52YWxpZGF0ZUNvbnRleHRGaWVsZHMoKSkgcmV0dXJuO1xuICAgIHRoaXMuY29uZmlybVRpdGxlID0gJ1N1Ym1pdCBDb2hvcnQnO1xuICAgIHRoaXMuY29uZmlybU1lc3NhZ2UgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHN1Ym1pdCB0aGlzIGNvaG9ydD8gT25jZSBzdWJtaXR0ZWQgaXQgd2lsbCBiZSBhY3RpdmF0ZWQuJztcbiAgICB0aGlzLmNvbmZpcm1BY3Rpb24gPSAnc3VibWl0JztcbiAgICB0aGlzLnNob3dDb25maXJtTW9kYWwgPSB0cnVlO1xuICB9XG5cbiAgY29uZmlybVByb2NlZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93Q29uZmlybU1vZGFsID0gZmFsc2U7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jb25maXJtQWN0aW9uO1xuICAgIHRoaXMuY29uZmlybUFjdGlvbiA9IG51bGw7XG5cbiAgICBpZiAoYWN0aW9uID09PSAnYmFjaycpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS9haS1hdWRpby9tYW5hZ2UtY29ob3J0J10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzVXBkYXRlRmxvdyA9IHRoaXMuaXNFZGl0TW9kZSAmJiAhIXRoaXMuY29ob3J0SWQ7XG4gICAgaWYgKHRoaXMuaXNFZGl0TW9kZSAmJiAhdGhpcy5jb2hvcnRJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQgPSBpc1VwZGF0ZUZsb3cgPyB0aGlzLmJ1aWxkVXBkYXRlUGF5bG9hZCgpIDogdGhpcy5idWlsZENyZWF0ZVBheWxvYWQoKTtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICBjb25zdCByZXF1ZXN0JCA9IGlzVXBkYXRlRmxvd1xuICAgICAgPyB0aGlzLmF1ZGlvU2VydmljZS51cGRhdGVDb2hvcnQocGF5bG9hZClcbiAgICAgIDogdGhpcy5hdWRpb1NlcnZpY2UuY3JlYXRlQ29ob3J0KHBheWxvYWQpO1xuXG4gICAgcmVxdWVzdCQuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL2FpLWF1ZGlvL21hbmFnZS1jb2hvcnQnXSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNhbmNlbENvbmZpcm0oKTogdm9pZCB7XG4gICAgdGhpcy5zaG93Q29uZmlybU1vZGFsID0gZmFsc2U7XG4gICAgdGhpcy5jb25maXJtQWN0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHNob3dUb2FzdChtZXNzYWdlOiBzdHJpbmcsIHR5cGU6ICdzdWNjZXNzJyB8ICd3YXJuaW5nJyB8ICdlcnJvcicpOiB2b2lkIHtcbiAgICB0aGlzLnRvYXN0TWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy50b2FzdFR5cGUgPSB0eXBlO1xuICAgIHRoaXMudG9hc3RWaXNpYmxlID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy50b2FzdFZpc2libGUgPSBmYWxzZTsgfSwgMzAwMCk7XG4gIH1cblxuICBzd2l0Y2hUb0VkaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseU1vZGUoJ2VkaXQnKTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7IG1vZGU6ICdlZGl0JywgY29ob3J0SWQ6IHRoaXMuY29ob3J0SWQgfSxcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZSdcbiAgICB9KTtcbiAgfVxuXG4gIGdvQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpcm1UaXRsZSA9ICdHbyBCYWNrJztcbiAgICB0aGlzLmNvbmZpcm1NZXNzYWdlID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBnbyBiYWNrPyBBbnkgdW5zYXZlZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4nO1xuICAgIHRoaXMuY29uZmlybUFjdGlvbiA9ICdiYWNrJztcbiAgICB0aGlzLnNob3dDb25maXJtTW9kYWwgPSB0cnVlO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYWRkLW1hbmFnZS1jb2hvcnRcIj5cclxuXHJcbiAgICA8IS0tIOKUgOKUgCBOdW1lcmljYWwgQ29uZmlybSBNb2RhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29uZmlybS1tb2RhbC1vdmVybGF5XCIgKm5nSWY9XCJzaG93TnVtZXJpY2FsQ29uZmlybU1vZGFsXCIgKGNsaWNrKT1cImNhbmNlbE51bWVyaWNhbFRvZ2dsZSgpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpcm0tbW9kYWxcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLW1vZGFsLWljb25cIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyMFwiIGN5PVwiMjBcIiByPVwiMjBcIiBmaWxsPVwiI0ZFRjNDN1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMCAxM1YyMU0yMCAyN0gyMC4wMVwiIHN0cm9rZT1cIiNEOTc3MDZcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJjb25maXJtLW1vZGFsLXRpdGxlXCI+RW5hYmxlIE51bWVyaWNhbCBWYWx1ZTwvaDM+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiY29uZmlybS1tb2RhbC1tZXNzYWdlXCI+Q29udGV4dCB5b3UgYWRkZWQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIG1ldHJpYyBieSBlbmFibGluZyB0aGUgbnVtZXJpY2FsIHZhbHVlLiBBcmUgeW91IHN1cmUgdG8gcHJvY2VlZD88L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLW1vZGFsLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tY2FuY2VsLW1vZGFsXCIgKGNsaWNrKT1cImNhbmNlbE51bWVyaWNhbFRvZ2dsZSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNvbmZpcm0tbW9kYWxcIiAoY2xpY2spPVwiY29uZmlybU51bWVyaWNhbFRvZ2dsZSgpXCI+WWVzLCBQcm9jZWVkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSDilIDilIAgQ29uZmlybWF0aW9uIE1vZGFsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLW1vZGFsLW92ZXJsYXlcIiAqbmdJZj1cInNob3dDb25maXJtTW9kYWxcIiAoY2xpY2spPVwiY2FuY2VsQ29uZmlybSgpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpcm0tbW9kYWxcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLW1vZGFsLWljb25cIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHZpZXdCb3g9XCIwIDAgNDAgNDBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyMFwiIGN5PVwiMjBcIiByPVwiMjBcIiBmaWxsPVwiI0ZFRjNDN1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMCAxM1YyMU0yMCAyN0gyMC4wMVwiIHN0cm9rZT1cIiNEOTc3MDZcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJjb25maXJtLW1vZGFsLXRpdGxlXCI+e3sgY29uZmlybVRpdGxlIH19PC9oMz5cclxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjb25maXJtLW1vZGFsLW1lc3NhZ2VcIj57eyBjb25maXJtTWVzc2FnZSB9fTwvcD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpcm0tbW9kYWwtYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1jYW5jZWwtbW9kYWxcIiAoY2xpY2spPVwiY2FuY2VsQ29uZmlybSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWNvbmZpcm0tbW9kYWxcIiAoY2xpY2spPVwiY29uZmlybVByb2NlZWQoKVwiPlllcywgQ29uZmlybTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0g4pSA4pSAIFRvYXN0IE5vdGlmaWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LXRvYXN0XCIgW2NsYXNzLnZpc2libGVdPVwidG9hc3RWaXNpYmxlXCIgW2NsYXNzLnRvYXN0LXN1Y2Nlc3NdPVwidG9hc3RUeXBlPT09J3N1Y2Nlc3MnXCI+XHJcbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTEwIDE4LjMzMzNDMTQuNjAyNCAxOC4zMzMzIDE4LjMzMzMgMTQuNjAyNCAxOC4zMzMzIDEwQzE4LjMzMzMgNS4zOTc2MyAxNC42MDI0IDEuNjY2NjcgMTAgMS42NjY2N0M1LjM5NzYzIDEuNjY2NjcgMS42NjY2NyA1LjM5NzYzIDEuNjY2NjcgMTBDMS42NjY2NyAxNC42MDI0IDUuMzk3NjMgMTguMzMzMyAxMCAxOC4zMzMzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiAvPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcuNSAxMEw5LjE2NjY3IDExLjY2NjdMMTIuNSA4LjMzMzMzXCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAge3sgdG9hc3RNZXNzYWdlIH19XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIOKUgOKUgCBUb3AgSGVhZGVyIEJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwidG9wLWhlYWRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtaGVhZGVyLWxlZnRcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1iYWNrXCIgKGNsaWNrKT1cImdvQmFjaygpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1LjgzMzMgMTBINC4xNjY2N000LjE2NjY3IDEwTDEwIDE1LjgzMzNNNC4xNjY2NyAxMEwxMCA0LjE2NjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj57eyBoZWFkZXJUaXRsZSB9fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhlYWRlci1zdWJ0aXRsZVwiPnt7IGhlYWRlclN1YnRpdGxlIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLWhlYWRlci1hY3Rpb25zIG15LTNcIj5cclxuICAgICAgICAgICAgPCEtLSBWaWV3IE1vZGU6IG9ubHkgc2hvdyBFZGl0IGJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVmlld01vZGVcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwic3dpdGNoVG9FZGl0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF8yMzk4XzM2NylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNC4xNjggMi40OTk5M0MxNC4zODY4IDIuMjgxMDYgMTQuNjQ2NyAyLjEwNzQ0IDE0LjkzMjYgMS45ODg5OUMxNS4yMTg2IDEuODcwNTQgMTUuNTI1MSAxLjgwOTU3IDE1LjgzNDYgMS44MDk1N0MxNi4xNDQyIDEuODA5NTcgMTYuNDUwNyAxLjg3MDU0IDE2LjczNjYgMS45ODg5OUMxNy4wMjI2IDIuMTA3NDQgMTcuMjgyNCAyLjI4MTA2IDE3LjUwMTMgMi40OTk5M0MxNy43MjAyIDIuNzE4OCAxNy44OTM4IDIuOTc4NjMgMTguMDEyMiAzLjI2NDZDMTguMTMwNyAzLjU1MDU3IDE4LjE5MTcgMy44NTcwNiAxOC4xOTE3IDQuMTY2NTlDMTguMTkxNyA0LjQ3NjEyIDE4LjEzMDcgNC43ODI2MiAxOC4wMTIyIDUuMDY4NTlDMTcuODkzOCA1LjM1NDU1IDE3LjcyMDIgNS42MTQzOSAxNy41MDEzIDUuODMzMjZMNi4yNTEzIDE3LjA4MzNMMS42Njc5NyAxOC4zMzMzTDIuOTE3OTcgMTMuNzQ5OUwxNC4xNjggMi40OTk5M1pcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzIzOThfMzY3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgZmlsbD1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBFZGl0IENvaG9ydFxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8IS0tIENyZWF0ZSAvIEVkaXQgTW9kZTogU2F2ZSBEcmFmdCArIFN1Ym1pdCAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1ZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJidG4tZHJhZnRcIiAoY2xpY2spPVwic2F2ZURyYWZ0KClcIj5TYXZlIEFzIERyYWZ0PC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0bi1zdWJtaXRcIiAoY2xpY2spPVwic3VibWl0KClcIj5TdWJtaXQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIOKUgOKUgCBGb3JtIEJvZHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tYm9keVwiPlxyXG5cclxuICAgICAgICA8IS0tIENvaG9ydCBOYW1lIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+Q29ob3J0IE5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0taW5wdXRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIENvaG9ydCBOYW1lXCIgWyhuZ01vZGVsKV09XCJjb2hvcnROYW1lXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBDb2hvcnQgRGVzY3JpcHRpb24gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5Db2hvcnQgRGVzY3JpcHRpb248L2xhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0taW5wdXQgZm9ybS1pbnB1dC0taW5kZW50XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb2hvcnQgZGVzY3JpcHRpb24uLi5cIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2hvcnREZXNjcmlwdGlvblwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTb3VyY2UgTXVsdGktc2VsZWN0IERyb3Bkb3duIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+U2VsZWN0IFNvdXJjZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3QtY29udGFpbmVyIHctNTBcIiBbY2xhc3Mudmlldy1kaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktc2VsZWN0LXRyaWdnZXJcIiAoY2xpY2spPVwiIWlzVmlld01vZGUgJiYgdG9nZ2xlU291cmNlRHJvcGRvd24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHNvdXJjZURpc3BsYXkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJvdGF0ZV09XCJpc1NvdXJjZURyb3Bkb3duT3BlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41TDEwIDEyLjVMMTUgNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC1kcm9wZG93blwiICpuZ0lmPVwiaXNTb3VyY2VEcm9wZG93bk9wZW5cIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1ib3ggcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggU291cmNlLi4uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic291cmNlU2VhcmNoVGV4dFwiIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlclNvdXJjZXMoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC1vcHRpb25cIiAoY2xpY2spPVwic2VsZWN0QWxsU291cmNlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJzZWxlY3RlZFNvdXJjZXMubGVuZ3RoID09PSBzb3VyY2VPcHRpb25zLmxlbmd0aFwiIHJlYWRvbmx5IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlNlbGVjdCBBbGw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXNlbGVjdC1vcHRpb25cIiAqbmdGb3I9XCJsZXQgcyBvZiBmaWx0ZXJlZFNvdXJjZU9wdGlvbnNcIiAoY2xpY2spPVwidG9nZ2xlU291cmNlKHMpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc1NvdXJjZVNlbGVjdGVkKHMpXCIgcmVhZG9ubHkgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSDilIDilIAgTWV0cmljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkXCIgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiBtZXRyaWNzOyBsZXQgbWkgPSBpbmRleFwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1oZWFkZXItcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtZXRyaWMtdGl0bGVcIj5NZXRyaWMge3sgbWkgKyAxIH19PC9oNT5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBNZXRyaWMgTmFtZSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgTWV0cmljIE5hbWVcIiBbKG5nTW9kZWwpXT1cIm1ldHJpYy5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBNZXRyaWMgRGVzY3JpcHRpb24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0taW5wdXQgZm9ybS1pbnB1dC0taW5kZW50XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBEZXNjcmlwdGlvbi4uLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtZXRyaWMuZGVzY3JpcHRpb25cIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBQcm92aWRlIENvbnRleHQgSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LWhlYWRlci1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250ZXh0LWxhYmVsXCI+UHJvdmlkZSBDb250ZXh0PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udGV4dC1zdWJsYWJlbFwiPkNoZWNrIHdoZXRoZXIgdGhlIGZvbGxvd2luZyBhcmUgZGlzY3Vzc2VkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1oZWFkZXItcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtdGV4dFwiPk51bWVyaWNhbCBWYWx1ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLXN3aXRjaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwibWV0cmljLm51bWVyaWNhbFZhbHVlXCIgW2Rpc2FibGVkXT1cImlzVmlld01vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTnVtZXJpY2FsVG9nZ2xlKG1pKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS1zbGlkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuLWFkZC1jb250ZXh0XCIgKGNsaWNrKT1cImFkZENvbnRleHQobWkpXCIgW2Rpc2FibGVkXT1cImlzVmlld01vZGUgfHwgbWV0cmljLm51bWVyaWNhbFZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDMuMzMzMzdWMTIuNjY2N00zLjMzMzM0IDguMDAwMDRIMTIuNjY2N1wiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjMzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQWRkIE5ld1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSDilIDilIAgTnVtZXJpY2FsIFNlY3Rpb24gKHNob3duIHdoZW4gdG9nZ2xlIGlzIE9OKSDilIDilIAgLS0+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXRyaWMubnVtZXJpY2FsVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW4tbWF4LWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwibWV0cmljLm1pbk1heEVuYWJsZWRcIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1pbiBhbmQgTWF4IFJhbmdlIFZhbGlkYXRpb248L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm51bWVyaWNhbC1zZWN0aW9uXCIgKm5nSWY9XCJtZXRyaWMubWluTWF4RW5hYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGVwcGVyLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RlcHBlci1sYWJlbFwiPk1pbiBWYWx1ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXBwZXItY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0ZXBwZXItYnRuXCIgKGNsaWNrKT1cImRlY3JlbWVudE1pbihtaSlcIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiPuKAlDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwcGVyLXZhbHVlXCI+e3sgbWV0cmljLm1pblZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0ZXBwZXItYnRuXCIgKGNsaWNrKT1cImluY3JlbWVudE1pbihtaSlcIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiPis8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0ZXBwZXItZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwcGVyLWxhYmVsXCI+TWF4IFZhbHVlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RlcHBlci1jb250cm9sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RlcHBlci1idG5cIiAoY2xpY2spPVwiZGVjcmVtZW50TWF4KG1pKVwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCI+4oCUPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0ZXBwZXItdmFsdWVcIj57eyBtZXRyaWMubWF4VmFsdWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RlcHBlci1idG5cIiAoY2xpY2spPVwiaW5jcmVtZW50TWF4KG1pKVwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCI+KzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQ29udGV4dCBJdGVtcyAoaGlkZGVuIHdoZW4gbnVtZXJpY2FsIHZhbHVlIGlzIE9OKSAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZXRyaWMubnVtZXJpY2FsVmFsdWVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtaXRlbS1jb250YWluZXJcIiAqbmdGb3I9XCJsZXQgY3R4IG9mIG1ldHJpYy5jb250ZXh0czsgbGV0IGNpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZXh0LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1pdGVtLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRleHQtaXRlbS10aXRsZVwiPkNvbnRleHQge3sgY2kgKyAxIH19IERldGFpbHM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250ZXh0LXJlbW92ZS1idG5cIiAoY2xpY2spPVwicmVtb3ZlQ29udGV4dChtaSwgY2kpXCIgdGl0bGU9XCJSZW1vdmUgY29udGV4dFwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUgNUw1IDE1TTUgNUwxNSAxNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGV4dC1maWVsZHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRleHQtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0taW5wdXQgY29udGV4dC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgQ29udGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdHguY29udGV4dFwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiZmV0Y2hTdWdnZXN0aW9ucyhtaSwgY2kpXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEN1c3RvbSBTaW5nbGUtc2VsZWN0IFdlaWdodGFnZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0LWNvbnRhaW5lciB3LTI1IGNvbnRleHQtc2VsZWN0XCIgW2NsYXNzLnZpZXctZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiY3R4LndlaWdodGFnZUVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1zZWxlY3QtdHJpZ2dlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIhaXNWaWV3TW9kZSAmJiB0b2dnbGVXZWlnaHRhZ2VEcm9wZG93bihtaSwgY2kpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGN0eC53ZWlnaHRhZ2UgfHwgJ1NlbGVjdCBXZWlnaHRhZ2UnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgW2NsYXNzLnJvdGF0ZV09XCJjdHguaXNXZWlnaHRhZ2VPcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41TDEwIDEyLjVMMTUgNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0LWRyb3Bkb3duXCIgKm5nSWY9XCJjdHguaXNXZWlnaHRhZ2VPcGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0LW9wdGlvblwiICpuZ0Zvcj1cImxldCB3IG9mIHdlaWdodGFnZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFdlaWdodGFnZShtaSwgY2ksIHcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyB3IH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAgY2xhc3M9XCJmaWVsZC1lcnJvciBtdC0yXCIgKm5nSWY9XCJjdHgud2VpZ2h0YWdlRXJyb3JcIj5XZWlnaHRhZ2UgaXMgcmVxdWlyZWQuPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0taW5wdXQgZm9ybS1pbnB1dC0taW5kZW50XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBEZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN0eC5kZXNjcmlwdGlvblwiIChrZXl1cC5lbnRlcik9XCJmZXRjaFN1Z2dlc3Rpb25zKG1pLCBjaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzVmlld01vZGVcIiBbY2xhc3MuaXMtaW52YWxpZF09XCJjdHguZGVzY3JpcHRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjdHguZGVzY3JpcHRpb25FcnJvciA9IGZhbHNlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1lcnJvclwiICpuZ0lmPVwiY3R4LmRlc2NyaXB0aW9uRXJyb3JcIj5EZXNjcmlwdGlvbiBpcyByZXF1aXJlZC48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU3VnZ2VzdGVkIERlc2NyaXB0aW9ucyBTZWN0aW9uIChoaWRkZW4gaW4gdmlldyBtb2RlKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VnZ2VzdGVkLWRlc2Mtc2VjdGlvbiBtdC0zXCIgKm5nSWY9XCIhaXNWaWV3TW9kZSAmJiAoY3R4LmlzU3VnZ2VzdGlvbkxvYWRpbmcgfHwgKGN0eC5zdWdnZXN0aW9ucyAmJiBjdHguc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3VnZ2VzdGVkLXRpdGxlXCI+VHJ5IHRoZSBzdWdnZXN0ZWQgZGVzY3JpcHRpb25zPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VnZ2VzdGVkLWNoaXBzXCIgKm5nSWY9XCJjdHguaXNTdWdnZXN0aW9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWdnZXN0ZWQtY2hpcCBsb2FkaW5nXCI+TG9hZGluZy4uLjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWdnZXN0ZWQtY2hpcHNcIiAqbmdJZj1cIiFjdHguaXNTdWdnZXN0aW9uTG9hZGluZyAmJiBjdHguc3VnZ2VzdGlvbnMgJiYgY3R4LnN1Z2dlc3Rpb25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VnZ2VzdGVkLWNoaXBcIiAqbmdGb3I9XCJsZXQgc3VnZ2VzdGlvbiBvZiBjdHguc3VnZ2VzdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwYXRjaFN1Z2dlc3RlZERlc2NyaXB0aW9uKG1pLCBjaSwgc3VnZ2VzdGlvbi50ZXh0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInN1Z2dlc3Rpb24uY2F0ZWdvcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzdWdnZXN0aW9uLnRleHQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBNZXRyaWMgRm9vdGVyIEFjdGlvbnMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwibWV0cmljLWFjdGlvbi1idG5cIiB0aXRsZT1cIkR1cGxpY2F0ZSBNZXRyaWNcIiAoY2xpY2spPVwiZHVwbGljYXRlTWV0cmljKG1pKVwiIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI2LjY2NjY5XCIgeT1cIjYuNjY2NjNcIiB3aWR0aD1cIjExLjY2NjdcIiBoZWlnaHQ9XCIxMS42NjY3XCIgcng9XCIyXCIgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjMzMzMxIDEzLjMzMzNIMi40OTk5OEMyLjA1Nzk1IDEzLjMzMzMgMS42MzQwMyAxMy4xNTc3IDEuMzIxNDcgMTIuODQ1MkMxLjAwODkxIDEyLjUzMjYgMC44MzMzMTMgMTIuMTA4NyAwLjgzMzMxMyAxMS42NjY2VjIuNDk5OTZDMC44MzMzMTMgMi4wNTc5MyAxLjAwODkxIDEuNjM0MDEgMS4zMjE0NyAxLjMyMTQ1QzEuNjM0MDMgMS4wMDg4OSAyLjA1Nzk1IDAuODMzMjkzIDIuNDk5OTggMC44MzMyOTNIMTEuNjY2NkMxMi4xMDg3IDAuODMzMjkzIDEyLjUzMjYgMS4wMDg4OSAxMi44NDUyIDEuMzIxNDVDMTMuMTU3NyAxLjYzNDAxIDEzLjMzMzMgMi4wNTc5MyAxMy4zMzMzIDIuNDk5OTZWMy4zMzMyOVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1ldHJpYy1hY3Rpb24tYnRuIG1ldHJpYy1kZWxldGUtYnRuXCIgdGl0bGU9XCJEZWxldGUgTWV0cmljXCIgKGNsaWNrKT1cInJlbW92ZU1ldHJpYyhtaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1ZpZXdNb2RlIHx8IG1ldHJpY3MubGVuZ3RoIDw9IDFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yLjUgNUg0LjE2NjY3SDE3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTYuNjY2NjkgNS4wMDAwNFYzLjMzMzM3QzYuNjY2NjkgMi44OTEzNSA2Ljg0MjI4IDIuNDY3NDIgNy4xNTQ4NCAyLjE1NDg2QzcuNDY3NCAxLjg0MjMgNy44OTEzMyAxLjY2NjcxIDguMzMzMzUgMS42NjY3MUgxMS42NjY3QzEyLjEwODcgMS42NjY3MSAxMi41MzI2IDEuODQyMyAxMi44NDUyIDIuMTU0ODZDMTMuMTU3OCAyLjQ2NzQyIDEzLjMzMzQgMi44OTEzNSAxMy4zMzM0IDMuMzMzMzdWNS4wMDAwNE0xNS44MzM0IDUuMDAwMDRWMTYuNjY2N0MxNS44MzM0IDE3LjEwODcgMTUuNjU3OCAxNy41MzI3IDE1LjM0NTIgMTcuODQ1MkMxNS4wMzI2IDE4LjE1NzggMTQuNjA4NyAxOC4zMzM0IDE0LjE2NjcgMTguMzMzNEg1LjgzMzM1QzUuMzkxMzMgMTguMzMzNCA0Ljk2NzQgMTguMTU3OCA0LjY1NDg0IDE3Ljg0NTJDNC4zNDIyOCAxNy41MzI3IDQuMTY2NjkgMTcuMTA4NyA0LjE2NjY5IDE2LjY2NjdWNS4wMDAwNEgxNS44MzM0WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQWRkIE5ldyBNZXRyaWMgQnV0dG9uIC0tPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4tYWRkLW1ldHJpY1wiICAoY2xpY2spPVwiYWRkTWV0cmljKClcIiBbZGlzYWJsZWRdPVwiaXNWaWV3TW9kZVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAgNC4xNjY5OVYxNS44MzM3TTQuMTY2NjkgMTAuMDAwM0gxNS44MzM0XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICBBZGQgTmV3IE1ldHJpY1xyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==