simpo-component-library 3.6.948 → 3.6.950

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.
@@ -3,6 +3,8 @@ import { CommonModule } from '@angular/common';
3
3
  import { MatIconModule } from '@angular/material/icon';
4
4
  import { MessageService } from 'primeng/api';
5
5
  import { ToastModule } from 'primeng/toast';
6
+ import { forkJoin, of } from 'rxjs';
7
+ import { catchError } from 'rxjs/operators';
6
8
  import * as i0 from "@angular/core";
7
9
  import * as i1 from "../../services/rest.service";
8
10
  import * as i2 from "../../services/storage.service";
@@ -12,8 +14,9 @@ import * as i5 from "@angular/material/icon";
12
14
  import * as i6 from "primeng/toast";
13
15
  /**
14
16
  * "My Bookings" - a customer's own booking history (Upcoming/Past), a detail view per booking,
15
- * and cancellation. The list endpoint already returns full BookingGroup records, so the detail
16
- * view never needs a second fetch - see BookingController's GET /booking/group/my.
17
+ * and cancellation. The list endpoint returns full BookingGroup records - enough for
18
+ * date/status/address/products - but services booked aren't on that record (see BookingRow.services
19
+ * above), so load() issues one extra GET .../lines call per row to fill them in.
17
20
  */
18
21
  export class MyBookingsComponent {
19
22
  constructor(restService, storageService, messageService) {
@@ -45,6 +48,7 @@ export class MyBookingsComponent {
45
48
  this.allBookings = (res ?? []);
46
49
  this.splitBookings();
47
50
  this.loading = false;
51
+ this.loadServiceLines();
48
52
  }, () => {
49
53
  this.loading = false;
50
54
  });
@@ -63,6 +67,21 @@ export class MyBookingsComponent {
63
67
  this.upcoming = this.allBookings.filter((b) => this.isUpcoming(b));
64
68
  this.past = this.allBookings.filter((b) => !this.isUpcoming(b));
65
69
  }
70
+ /** One booking history load, bounded to this customer's own bookings - a per-row call here is
71
+ * fine, unlike an unbounded/paginated list. Failures are swallowed per-row (falls back to no
72
+ * service names for that row) rather than blocking the whole page on one bad group. */
73
+ loadServiceLines() {
74
+ if (!this.allBookings.length)
75
+ return;
76
+ forkJoin(this.allBookings.map((b) => this.restService.getGroupLines(b.groupId).pipe(catchError(() => of([]))))).subscribe((allLines) => {
77
+ this.allBookings.forEach((b, i) => {
78
+ const lines = allLines[i] ?? [];
79
+ b.services = lines.flatMap((l) => (l.services ?? []).map((s) => ({
80
+ name: s.name, durationMinutes: s.durationMinutes, price: s.price
81
+ })));
82
+ });
83
+ });
84
+ }
66
85
  get rows() {
67
86
  return this.profTab === 'upcoming' ? this.upcoming : this.past;
68
87
  }
@@ -75,10 +94,13 @@ export class MyBookingsComponent {
75
94
  productNames(b) {
76
95
  return (b.productLines ?? []).map((p) => p.itemName).filter(Boolean).join(', ');
77
96
  }
97
+ serviceNames(b) {
98
+ return (b.services ?? []).map((s) => s.name).filter(Boolean).join(', ');
99
+ }
78
100
  title(b) {
79
101
  const modeLabel = b.mode === 'HOME_VISIT' ? 'Home Visit' : b.mode === 'VIDEO_CALL' ? 'Video Call' : 'Store Visit';
80
- const products = this.productNames(b);
81
- return products ? `${modeLabel} · ${products}` : modeLabel;
102
+ const items = [this.serviceNames(b), this.productNames(b)].filter(Boolean).join(', ');
103
+ return items ? `${modeLabel} · ${items}` : modeLabel;
82
104
  }
83
105
  when(b) {
84
106
  const date = new Date(b.bookingDate).toLocaleDateString('en-IN', { weekday: 'short', day: 'numeric', month: 'short', year: 'numeric' });
@@ -135,10 +157,10 @@ export class MyBookingsComponent {
135
157
  });
136
158
  }
137
159
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MyBookingsComponent, deps: [{ token: i1.RestService }, { token: i2.StorageServiceService }, { token: i3.MessageService }], target: i0.ɵɵFactoryTarget.Component }); }
138
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MyBookingsComponent, isStandalone: true, selector: "simpo-my-bookings", providers: [MessageService], ngImport: i0, template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <ng-container *ngIf=\"canCancelSelected\">\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n <button type=\"button\" class=\"mb-cancel-btn\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </ng-container>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid #E3CFC9;border-radius:8px;background:#fff;color:#b4432e;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i6.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
160
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MyBookingsComponent, isStandalone: true, selector: "simpo-my-bookings", providers: [MessageService], ngImport: i0, template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\n <div class=\"mb-detail-k\">Services</div>\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <ng-container *ngIf=\"canCancelSelected\">\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n <button type=\"button\" class=\"mb-cancel-btn\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </ng-container>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid #E3CFC9;border-radius:8px;background:#fff;color:#b4432e;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i6.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
139
161
  }
140
162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MyBookingsComponent, decorators: [{
141
163
  type: Component,
142
- args: [{ selector: 'simpo-my-bookings', standalone: true, imports: [CommonModule, MatIconModule, ToastModule], providers: [MessageService], template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <ng-container *ngIf=\"canCancelSelected\">\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n <button type=\"button\" class=\"mb-cancel-btn\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </ng-container>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid #E3CFC9;border-radius:8px;background:#fff;color:#b4432e;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}\n"] }]
164
+ args: [{ selector: 'simpo-my-bookings', standalone: true, imports: [CommonModule, MatIconModule, ToastModule], providers: [MessageService], template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\n <div class=\"mb-detail-k\">Services</div>\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <ng-container *ngIf=\"canCancelSelected\">\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n <button type=\"button\" class=\"mb-cancel-btn\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </ng-container>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid #E3CFC9;border-radius:8px;background:#fff;color:#b4432e;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}\n"] }]
143
165
  }], ctorParameters: () => [{ type: i1.RestService }, { type: i2.StorageServiceService }, { type: i3.MessageService }] });
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktYm9va2luZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9teS1ib29raW5ncy9teS1ib29raW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL215LWJvb2tpbmdzL215LWJvb2tpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBb0I1Qzs7OztHQUlHO0FBU0gsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUNtQixXQUF3QixFQUN4QixjQUFxQyxFQUNyQyxjQUE4QjtRQUY5QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDckMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBR2pELGVBQVUsR0FBc0IsTUFBTSxDQUFDO1FBQ3ZDLFlBQU8sR0FBd0IsVUFBVSxDQUFDO1FBQzFDLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRVgsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQ3ZDLGFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBQzVCLFNBQUksR0FBaUIsRUFBRSxDQUFDO1FBQ3hCLGFBQVEsR0FBc0IsSUFBSSxDQUFDO1FBQ25DLHVCQUFrQixHQUFvRCxJQUFJLENB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MEJDakM3Qix3c0lBdUZBLHU0R0R2RFksWUFBWSw2VkFBRSxhQUFhLG1MQUFFLFdBQVc7OzRGQUt2QyxtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLGFBQ3hDLENBQUMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL2Vjb21tZXJjZS9zdHlsZXMvdXNlci5tb2RhbCc7XG5cbmludGVyZmFjZSBCb29raW5nUm93IHtcbiAgZ3JvdXBJZDogc3RyaW5nO1xuICBtb2RlOiAnU1RPUkVfVklTSVQnIHwgJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnO1xuICBib29raW5nRGF0ZTogc3RyaW5nO1xuICBzdGFydFRpbWU/OiBzdHJpbmc7XG4gIGVuZFRpbWU/OiBzdHJpbmc7XG4gIHN0YXR1czogJ1BFTkRJTkcnIHwgJ0JPT0tFRCcgfCAnSE9MRCcgfCAnQ09NUExFVEVEJyB8ICdDQU5DRUxMRUQnO1xuICBzdG9yZU5hbWU/OiBzdHJpbmc7XG4gIGN1c3RvbWVyRGV0YWlsPzogeyBuYW1lOiBzdHJpbmc7IHBob25lTnVtYmVyOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfTtcbiAgYWRkcmVzc0RldGFpbHM/OiB7IHJlY2VpdmVyTmFtZTogc3RyaW5nOyByZWNlaXZlclBob25lOiBzdHJpbmc7IGFkZHJlc3NMaW5lMTogc3RyaW5nOyBhZGRyZXNzTGluZTI/OiBzdHJpbmc7IGNpdHk6IHN0cmluZzsgc3RhdGU6IHN0cmluZzsgemlwQ29kZTogc3RyaW5nIH07XG4gIHByb2R1Y3RMaW5lcz86IHsgaXRlbU5hbWU6IHN0cmluZzsgcXVhbnRpdHk6IG51bWJlciB9W107XG4gIHZpZGVvQ2FsbExpbms/OiBzdHJpbmc7XG4gIHRvdGFsQ29sbGVjdGVkQXRCb29raW5nPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFwiTXkgQm9va2luZ3NcIiAtIGEgY3VzdG9tZXIncyBvd24gYm9va2luZyBoaXN0b3J5IChVcGNvbWluZy9QYXN0KSwgYSBkZXRhaWwgdmlldyBwZXIgYm9va2luZyxcbiAqIGFuZCBjYW5jZWxsYXRpb24uIFRoZSBsaXN0IGVuZHBvaW50IGFscmVhZHkgcmV0dXJucyBmdWxsIEJvb2tpbmdHcm91cCByZWNvcmRzLCBzbyB0aGUgZGV0YWlsXG4gKiB2aWV3IG5ldmVyIG5lZWRzIGEgc2Vjb25kIGZldGNoIC0gc2VlIEJvb2tpbmdDb250cm9sbGVyJ3MgR0VUIC9ib29raW5nL2dyb3VwL215LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaW1wby1teS1ib29raW5ncycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIFRvYXN0TW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vbXktYm9va2luZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbXktYm9va2luZ3MuY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgTXlCb29raW5nc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgKSB7IH1cblxuICBjdXJyZW50VGFiOiAnTElTVCcgfCAnREVUQUlMJyA9ICdMSVNUJztcbiAgcHJvZlRhYjogJ3VwY29taW5nJyB8ICdwYXN0JyA9ICd1cGNvbWluZyc7XG4gIGxvYWRpbmcgPSB0cnVlO1xuICBjYW5jZWxsaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBhbGxCb29raW5nczogQm9va2luZ1Jvd1tdID0gW107XG4gIHVwY29taW5nOiBCb29raW5nUm93W10gPSBbXTtcbiAgcGFzdDogQm9va2luZ1Jvd1tdID0gW107XG4gIHNlbGVjdGVkOiBCb29raW5nUm93IHwgbnVsbCA9IG51bGw7XG4gIGNhbmNlbGxhdGlvblBvbGljeTogeyB0aXRsZTogc3RyaW5nOyBwb2xpY3lEZXRhaWxzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubG9hZCgpO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpID8/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiSWQnKSA/PyAnJztcbiAgICBjb25zdCB1c2VySWQgPSAodGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkgYXMgVXNlcik/LnVzZXJJZCA/PyAnJztcbiAgICBpZiAoIWJ1c2luZXNzSWQgfHwgIXVzZXJJZCkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0TXlCb29raW5ncyhidXNpbmVzc0lkLCB1c2VySWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWxsQm9va2luZ3MgPSAocmVzID8/IFtdKSBhcyBCb29raW5nUm93W107XG4gICAgICB0aGlzLnNwbGl0Qm9va2luZ3MoKTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH0sICgpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRDYW5jZWxsYXRpb25Qb2xpY3koYnVzaW5lc3NJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsYXRpb25Qb2xpY3kgPSAocmVzID8/IFtdKVswXSA/PyBudWxsO1xuICAgIH0sICgpID0+IHtcbiAgICAgIC8vIE5vbi1mYXRhbCAtIHRoZSBkZXRhaWwgdmlldyBqdXN0IHdvbid0IHNob3cgYSBwb2xpY3kgbm90ZS5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNVcGNvbWluZyhiOiBCb29raW5nUm93KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiAoYi5zdGF0dXMgPT09ICdIT0xEJyB8fCBiLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgYi5zdGF0dXMgPT09ICdQRU5ESU5HJykgJiYgbmV3IERhdGUoYi5ib29raW5nRGF0ZSkgPj0gdG9kYXk7XG4gIH1cblxuICBwcml2YXRlIHNwbGl0Qm9va2luZ3MoKSB7XG4gICAgdGhpcy51cGNvbWluZyA9IHRoaXMuYWxsQm9va2luZ3MuZmlsdGVyKChiKSA9PiB0aGlzLmlzVXBjb21pbmcoYikpO1xuICAgIHRoaXMucGFzdCA9IHRoaXMuYWxsQm9va2luZ3MuZmlsdGVyKChiKSA9PiAhdGhpcy5pc1VwY29taW5nKGIpKTtcbiAgfVxuXG4gIGdldCByb3dzKCk6IEJvb2tpbmdSb3dbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZlRhYiA9PT0gJ3VwY29taW5nJyA/IHRoaXMudXBjb21pbmcgOiB0aGlzLnBhc3Q7XG4gIH1cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmxvYWRpbmcgJiYgdGhpcy5yb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHNldFByb2ZUYWIodGFiOiAndXBjb21pbmcnIHwgJ3Bhc3QnKSB7XG4gICAgdGhpcy5wcm9mVGFiID0gdGFiO1xuICB9XG5cbiAgcHJvZHVjdE5hbWVzKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIHJldHVybiAoYi5wcm9kdWN0TGluZXMgPz8gW10pLm1hcCgocCkgPT4gcC5pdGVtTmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7XG4gIH1cbiAgdGl0bGUoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9kZUxhYmVsID0gYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgPyAnSG9tZSBWaXNpdCcgOiBiLm1vZGUgPT09ICdWSURFT19DQUxMJyA/ICdWaWRlbyBDYWxsJyA6ICdTdG9yZSBWaXNpdCc7XG4gICAgY29uc3QgcHJvZHVjdHMgPSB0aGlzLnByb2R1Y3ROYW1lcyhiKTtcbiAgICByZXR1cm4gcHJvZHVjdHMgPyBgJHttb2RlTGFiZWx9IMK3ICR7cHJvZHVjdHN9YCA6IG1vZGVMYWJlbDtcbiAgfVxuICB3aGVuKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShiLmJvb2tpbmdEYXRlKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUlOJywgeyB3ZWVrZGF5OiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIHllYXI6ICdudW1lcmljJyB9KTtcbiAgICByZXR1cm4gYi5zdGFydFRpbWUgPyBgJHtkYXRlfSDCtyAke2Iuc3RhcnRUaW1lfWAgOiBkYXRlO1xuICB9XG4gIGRldGFpbChiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICBpZiAoYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgJiYgYi5hZGRyZXNzRGV0YWlscykgcmV0dXJuIGAke2IuYWRkcmVzc0RldGFpbHMuY2l0eX0sICR7Yi5hZGRyZXNzRGV0YWlscy5zdGF0ZX1gO1xuICAgIGlmIChiLm1vZGUgPT09ICdTVE9SRV9WSVNJVCcgJiYgYi5zdG9yZU5hbWUpIHJldHVybiBiLnN0b3JlTmFtZTtcbiAgICByZXR1cm4gYi5jdXN0b21lckRldGFpbD8ubmFtZSA/PyAnJztcbiAgfVxuICBzdGF0dXNMYWJlbChzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiAnQ29tcGxldGVkJztcbiAgICBpZiAoc3RhdHVzID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuICdDYW5jZWxsZWQnO1xuICAgIHJldHVybiAnQ29uZmlybWVkJztcbiAgfVxuICBzdGF0dXNDbGFzcyhzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiAnc3RhdHVzLWNvbXBsZXRlZCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiAnc3RhdHVzLWNhbmNlbGxlZCc7XG4gICAgcmV0dXJuICdzdGF0dXMtY29uZmlybWVkJztcbiAgfVxuICBwYWlkTGFiZWwoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGIudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmcgJiYgYi50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA+IDAgPyBg4oK5JHtiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nfWAgOiAnTm90aGluZyDigJQgZnJlZSc7XG4gIH1cbiAgZ2V0IGNhbkNhbmNlbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc2VsZWN0ZWQgJiYgKHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnSE9MRCcgfHwgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdCT09LRUQnIHx8IHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnUEVORElORycpO1xuICB9XG5cbiAgdmlld0Jvb2tpbmdEZXRhaWwoYjogQm9va2luZ1Jvdykge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBiO1xuICAgIHRoaXMuY3VycmVudFRhYiA9ICdERVRBSUwnO1xuICB9XG4gIGJhY2tUb0xpc3QoKSB7XG4gICAgdGhpcy5jdXJyZW50VGFiID0gJ0xJU1QnO1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xuICB9XG5cbiAgY2FuY2VsQm9va2luZygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5jYW5jZWxsaW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNhbmNlbEJvb2tpbmdHcm91cCh0aGlzLnNlbGVjdGVkLmdyb3VwSWQsICdDYW5jZWxsZWQgYnkgY3VzdG9tZXInKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsaW5nID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZCkgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPSAnQ0FOQ0VMTEVEJztcbiAgICAgIHRoaXMuc3BsaXRCb29raW5ncygpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnQm9va2luZyBjYW5jZWxsZWQnIH0pO1xuICAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbGxpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogZXJyb3I/LmVycm9yPy5kZXRhaWwgPz8gJ0NvdWxkIG5vdCBjYW5jZWwgdGhpcyBib29raW5nJyB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPHAtdG9hc3QgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIj48L3AtdG9hc3Q+XG5cbjxkaXYgY2xhc3M9XCJtYi1yb290XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VGFiID09PSAnTElTVCdcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItdGl0bGVcIj5NeSBCb29raW5nczwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLXRhYnNcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJwcm9mVGFiID09PSAndXBjb21pbmcnXCIgKGNsaWNrKT1cInNldFByb2ZUYWIoJ3VwY29taW5nJylcIj5VcGNvbWluZzwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi10YWJcIiBbY2xhc3MuYWN0aXZlXT1cInByb2ZUYWIgPT09ICdwYXN0J1wiIChjbGljayk9XCJzZXRQcm9mVGFiKCdwYXN0JylcIj5QYXN0PC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItbG9hZGluZ1wiICpuZ0lmPVwibG9hZGluZ1wiPkxvYWRpbmcgeW91ciBib29raW5nc+KApjwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLXJvd3NcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFpc0VtcHR5XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJvd1wiICpuZ0Zvcj1cImxldCBiIG9mIHJvd3NcIiAoY2xpY2spPVwidmlld0Jvb2tpbmdEZXRhaWwoYilcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1zdHJpcGVcIiBbbmdDbGFzc109XCJiLm1vZGUgPT09ICdIT01FX1ZJU0lUJyA/ICdzdHJpcGUtaG9tZScgOiBiLm1vZGUgPT09ICdWSURFT19DQUxMJyA/ICdzdHJpcGUtdmlkZW8nIDogJ3N0cmlwZS1zdG9yZSdcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1pbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy10b3BcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctdGl0bGVcIj57e3RpdGxlKGIpfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LXdoZW5cIj57e3doZW4oYil9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctZGV0YWlsXCI+e3tkZXRhaWwoYil9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1lbmRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLXN0YXR1c1wiIFtuZ0NsYXNzXT1cInN0YXR1c0NsYXNzKGIuc3RhdHVzKVwiPnt7c3RhdHVzTGFiZWwoYi5zdGF0dXMpfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItZW1wdHlcIiAqbmdJZj1cImlzRW1wdHlcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1iLWVtcHR5LWljb25cIj5ldmVudF9idXN5PC9tYXQtaWNvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1lbXB0eS10aXRsZVwiPk5vIHt7cHJvZlRhYn19IGJvb2tpbmdzIHlldC48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRUYWIgPT09ICdERVRBSUwnICYmIHNlbGVjdGVkXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1iYWNrXCIgKGNsaWNrKT1cImJhY2tUb0xpc3QoKVwiPlxuICAgICAgPG1hdC1pY29uPmFycm93X2JhY2s8L21hdC1pY29uPiBCYWNrIHRvIE15IEJvb2tpbmdzXG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdGl0bGUtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC10aXRsZVwiPnt7dGl0bGUoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLXN0YXR1c1wiIFtuZ0NsYXNzXT1cInN0YXR1c0NsYXNzKHNlbGVjdGVkLnN0YXR1cylcIj57e3N0YXR1c0xhYmVsKHNlbGVjdGVkLnN0YXR1cyl9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtd2hlblwiPnt7d2hlbihzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQucHJvZHVjdExpbmVzPy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Qcm9kdWN0czwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7cHJvZHVjdE5hbWVzKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuY3VzdG9tZXJEZXRhaWxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Db250YWN0PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8ubmFtZX19IMK3IHt7c2VsZWN0ZWQuY3VzdG9tZXJEZXRhaWw/LnBob25lTnVtYmVyfX0gwrcge3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8uZW1haWx9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLm1vZGUgPT09ICdIT01FX1ZJU0lUJyAmJiBzZWxlY3RlZC5hZGRyZXNzRGV0YWlsc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkFkZHJlc3M8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj57e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5hZGRyZXNzTGluZTF9fSwge3tzZWxlY3RlZC5hZGRyZXNzRGV0YWlscz8uY2l0eX19LCB7e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5zdGF0ZX19IHt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LnppcENvZGV9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5QYWlkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3twYWlkTGFiZWwoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXZpZGVvLWxpbmtcIiAqbmdJZj1cInNlbGVjdGVkLm1vZGUgPT09ICdWSURFT19DQUxMJyAmJiBzZWxlY3RlZC52aWRlb0NhbGxMaW5rICYmIHNlbGVjdGVkLnN0YXR1cyAhPT0gJ0NBTkNFTExFRCdcIj5cbiAgICAgICAgPG1hdC1pY29uPnZpZGVvY2FtPC9tYXQtaWNvbj5cbiAgICAgICAgPGEgW2hyZWZdPVwic2VsZWN0ZWQudmlkZW9DYWxsTGlua1wiIHRhcmdldD1cIl9ibGFua1wiPnt7c2VsZWN0ZWQudmlkZW9DYWxsTGlua319PC9hPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYW5DYW5jZWxTZWxlY3RlZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5XCIgKm5nSWY9XCJjYW5jZWxsYXRpb25Qb2xpY3lcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRpdGxlXCI+e3tjYW5jZWxsYXRpb25Qb2xpY3kudGl0bGV9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGV4dFwiPnt7Y2FuY2VsbGF0aW9uUG9saWN5LnBvbGljeURldGFpbHN9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1jYW5jZWwtYnRuXCIgW2Rpc2FibGVkXT1cImNhbmNlbGxpbmdcIiAoY2xpY2spPVwiY2FuY2VsQm9va2luZygpXCI+XG4gICAgICAgICAge3tjYW5jZWxsaW5nID8gJ0NhbmNlbGxpbmfigKYnIDogJ0NhbmNlbCBib29raW5nJ319XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1jYW5jZWxsZWQtbm90ZVwiICpuZ0lmPVwic2VsZWN0ZWQuc3RhdHVzID09PSAnQ0FOQ0VMTEVEJ1wiPlRoaXMgYm9va2luZyBoYXMgYmVlbiBjYW5jZWxsZWQuPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktYm9va2luZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9teS1ib29raW5ncy9teS1ib29raW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL215LWJvb2tpbmdzL215LWJvb2tpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQXdCNUM7Ozs7O0dBS0c7QUFTSCxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLFlBQ21CLFdBQXdCLEVBQ3hCLGNBQXFDLEVBQ3JDLGNBQThCO1FBRjlCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFHakQsZUFBVSxHQUFzQixNQUFNLENBQUM7UUFDdkMsWUFBTyxHQUF3QixVQUFVLENBQUM7UUFDMUMsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFWCxnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDdkMsYUFBUSxHQUFpQixFQUFFLENBQUM7UUFDNUIsU0FBSSxHQUFpQixFQUFFLENBQUM7UUFDeEIsYUFBUSxHQUFzQixJQUFJLENBQUM7UUFDbkMsdUJBQWtCLEdBQW9ELElBQUksQ0FBQztJQVh2RSxDQUFDO0lBYUwsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRixNQUFNLE1BQU0sR0FBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBVyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDckUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3hFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFpQixDQUFDO1lBQy9DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixDQUFDLEVBQUUsR0FBRyxFQUFFO1lBQ04sSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3hFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDbkQsQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUNOLDZEQUE2RDtRQUMvRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVLENBQUMsQ0FBYTtRQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUN0SCxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzsyRkFFdUY7SUFDL0UsZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3JDLFFBQVEsQ0FDTixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ3pFLENBQ0YsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFlLEVBQUUsRUFBRTtZQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDaEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUN6RSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7aUJBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksT0FBTztRQUNULE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQXdCO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxZQUFZLENBQUMsQ0FBYTtRQUN4QixPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFDRCxZQUFZLENBQUMsQ0FBYTtRQUN4QixPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxLQUFLLENBQUMsQ0FBYTtRQUNqQixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDbEgsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RGLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBYTtRQUNoQixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDeEksT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBQ0QsTUFBTSxDQUFDLENBQWE7UUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsY0FBYztZQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlHLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksQ0FBQyxDQUFDLFNBQVM7WUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDaEUsT0FBTyxDQUFDLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLElBQUksTUFBTSxLQUFLLFdBQVc7WUFBRSxPQUFPLFdBQVcsQ0FBQztRQUMvQyxJQUFJLE1BQU0sS0FBSyxXQUFXO1lBQUUsT0FBTyxXQUFXLENBQUM7UUFDL0MsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLElBQUksTUFBTSxLQUFLLFdBQVc7WUFBRSxPQUFPLGtCQUFrQixDQUFDO1FBQ3RELElBQUksTUFBTSxLQUFLLFdBQVc7WUFBRSxPQUFPLGtCQUFrQixDQUFDO1FBQ3RELE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUNELFNBQVMsQ0FBQyxDQUFhO1FBQ3JCLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixJQUFJLENBQUMsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO0lBQ3pILENBQUM7SUFDRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQztJQUN6SSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsQ0FBYTtRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztJQUM3QixDQUFDO0lBQ0QsVUFBVTtRQUNSLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBQzlDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2pHLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQ3RELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztRQUNqRixDQUFDLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksK0JBQStCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BJLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FqSlUsbUJBQW1CO21HQUFuQixtQkFBbUIsZ0VBSm5CLENBQUMsY0FBYyxDQUFDLDBCQ3hDN0IsKzVJQTJGQSx1NEdEcERZLFlBQVksNlZBQUUsYUFBYSxtTEFBRSxXQUFXOzs0RkFLdkMsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUN4QyxDQUFDLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9hc3QnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi9lY29tbWVyY2Uvc3R5bGVzL3VzZXIubW9kYWwnO1xuXG5pbnRlcmZhY2UgQm9va2luZ1JvdyB7XG4gIGdyb3VwSWQ6IHN0cmluZztcbiAgbW9kZTogJ1NUT1JFX1ZJU0lUJyB8ICdIT01FX1ZJU0lUJyB8ICdWSURFT19DQUxMJztcbiAgYm9va2luZ0RhdGU6IHN0cmluZztcbiAgc3RhcnRUaW1lPzogc3RyaW5nO1xuICBlbmRUaW1lPzogc3RyaW5nO1xuICBzdGF0dXM6ICdQRU5ESU5HJyB8ICdCT09LRUQnIHwgJ0hPTEQnIHwgJ0NPTVBMRVRFRCcgfCAnQ0FOQ0VMTEVEJztcbiAgc3RvcmVOYW1lPzogc3RyaW5nO1xuICBjdXN0b21lckRldGFpbD86IHsgbmFtZTogc3RyaW5nOyBwaG9uZU51bWJlcjogc3RyaW5nOyBlbWFpbDogc3RyaW5nIH07XG4gIGFkZHJlc3NEZXRhaWxzPzogeyByZWNlaXZlck5hbWU6IHN0cmluZzsgcmVjZWl2ZXJQaG9uZTogc3RyaW5nOyBhZGRyZXNzTGluZTE6IHN0cmluZzsgYWRkcmVzc0xpbmUyPzogc3RyaW5nOyBjaXR5OiBzdHJpbmc7IHN0YXRlOiBzdHJpbmc7IHppcENvZGU6IHN0cmluZyB9O1xuICBwcm9kdWN0TGluZXM/OiB7IGl0ZW1OYW1lOiBzdHJpbmc7IHF1YW50aXR5OiBudW1iZXIgfVtdO1xuICAvKiogTm90IHBhcnQgb2YgdGhlIEdFVCAvYm9va2luZy9ncm91cC9teSByZXNwb25zZSAtIHNlcnZpY2VzIGxpdmUgb24gdGhlIHNlcGFyYXRlXG4gICAqIEJvb2tpbmdEZXRhaWwgY29sbGVjdGlvbiAoRksnZCB2aWEgc2VydmljZUxpbmVJZHMsIG5vdCBkZW5vcm1hbGl6ZWQgb250byBCb29raW5nR3JvdXApLCBzb1xuICAgKiB0aGlzIGlzIGZpbGxlZCBpbiBjbGllbnQtc2lkZSBhZnRlciBsb2FkKCkgdmlhIGEgcGVyLXJvdyBHRVQgLi4uL2xpbmVzIGNhbGwuICovXG4gIHNlcnZpY2VzPzogeyBuYW1lOiBzdHJpbmc7IGR1cmF0aW9uTWludXRlczogbnVtYmVyOyBwcmljZTogbnVtYmVyIH1bXTtcbiAgdmlkZW9DYWxsTGluaz86IHN0cmluZztcbiAgdG90YWxDb2xsZWN0ZWRBdEJvb2tpbmc/OiBudW1iZXI7XG59XG5cbi8qKlxuICogXCJNeSBCb29raW5nc1wiIC0gYSBjdXN0b21lcidzIG93biBib29raW5nIGhpc3RvcnkgKFVwY29taW5nL1Bhc3QpLCBhIGRldGFpbCB2aWV3IHBlciBib29raW5nLFxuICogYW5kIGNhbmNlbGxhdGlvbi4gVGhlIGxpc3QgZW5kcG9pbnQgcmV0dXJucyBmdWxsIEJvb2tpbmdHcm91cCByZWNvcmRzIC0gZW5vdWdoIGZvclxuICogZGF0ZS9zdGF0dXMvYWRkcmVzcy9wcm9kdWN0cyAtIGJ1dCBzZXJ2aWNlcyBib29rZWQgYXJlbid0IG9uIHRoYXQgcmVjb3JkIChzZWUgQm9va2luZ1Jvdy5zZXJ2aWNlc1xuICogYWJvdmUpLCBzbyBsb2FkKCkgaXNzdWVzIG9uZSBleHRyYSBHRVQgLi4uL2xpbmVzIGNhbGwgcGVyIHJvdyB0byBmaWxsIHRoZW0gaW4uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbXBvLW15LWJvb2tpbmdzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgVG9hc3RNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9teS1ib29raW5ncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9teS1ib29raW5ncy5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBNeUJvb2tpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICApIHsgfVxuXG4gIGN1cnJlbnRUYWI6ICdMSVNUJyB8ICdERVRBSUwnID0gJ0xJU1QnO1xuICBwcm9mVGFiOiAndXBjb21pbmcnIHwgJ3Bhc3QnID0gJ3VwY29taW5nJztcbiAgbG9hZGluZyA9IHRydWU7XG4gIGNhbmNlbGxpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIGFsbEJvb2tpbmdzOiBCb29raW5nUm93W10gPSBbXTtcbiAgdXBjb21pbmc6IEJvb2tpbmdSb3dbXSA9IFtdO1xuICBwYXN0OiBCb29raW5nUm93W10gPSBbXTtcbiAgc2VsZWN0ZWQ6IEJvb2tpbmdSb3cgfCBudWxsID0gbnVsbDtcbiAgY2FuY2VsbGF0aW9uUG9saWN5OiB7IHRpdGxlOiBzdHJpbmc7IHBvbGljeURldGFpbHM6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgYnVzaW5lc3NJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJykgPz8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JJZCcpID8/ICcnO1xuICAgIGNvbnN0IHVzZXJJZCA9ICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSBhcyBVc2VyKT8udXNlcklkID8/ICcnO1xuICAgIGlmICghYnVzaW5lc3NJZCB8fCAhdXNlcklkKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRNeUJvb2tpbmdzKGJ1c2luZXNzSWQsIHVzZXJJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5hbGxCb29raW5ncyA9IChyZXMgPz8gW10pIGFzIEJvb2tpbmdSb3dbXTtcbiAgICAgIHRoaXMuc3BsaXRCb29raW5ncygpO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmxvYWRTZXJ2aWNlTGluZXMoKTtcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0Q2FuY2VsbGF0aW9uUG9saWN5KGJ1c2luZXNzSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsbGF0aW9uUG9saWN5ID0gKHJlcyA/PyBbXSlbMF0gPz8gbnVsbDtcbiAgICB9LCAoKSA9PiB7XG4gICAgICAvLyBOb24tZmF0YWwgLSB0aGUgZGV0YWlsIHZpZXcganVzdCB3b24ndCBzaG93IGEgcG9saWN5IG5vdGUuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzVXBjb21pbmcoYjogQm9va2luZ1Jvdyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gKGIuc3RhdHVzID09PSAnSE9MRCcgfHwgYi5zdGF0dXMgPT09ICdCT09LRUQnIHx8IGIuc3RhdHVzID09PSAnUEVORElORycpICYmIG5ldyBEYXRlKGIuYm9va2luZ0RhdGUpID49IHRvZGF5O1xuICB9XG5cbiAgcHJpdmF0ZSBzcGxpdEJvb2tpbmdzKCkge1xuICAgIHRoaXMudXBjb21pbmcgPSB0aGlzLmFsbEJvb2tpbmdzLmZpbHRlcigoYikgPT4gdGhpcy5pc1VwY29taW5nKGIpKTtcbiAgICB0aGlzLnBhc3QgPSB0aGlzLmFsbEJvb2tpbmdzLmZpbHRlcigoYikgPT4gIXRoaXMuaXNVcGNvbWluZyhiKSk7XG4gIH1cblxuICAvKiogT25lIGJvb2tpbmcgaGlzdG9yeSBsb2FkLCBib3VuZGVkIHRvIHRoaXMgY3VzdG9tZXIncyBvd24gYm9va2luZ3MgLSBhIHBlci1yb3cgY2FsbCBoZXJlIGlzXG4gICAqIGZpbmUsIHVubGlrZSBhbiB1bmJvdW5kZWQvcGFnaW5hdGVkIGxpc3QuIEZhaWx1cmVzIGFyZSBzd2FsbG93ZWQgcGVyLXJvdyAoZmFsbHMgYmFjayB0byBub1xuICAgKiBzZXJ2aWNlIG5hbWVzIGZvciB0aGF0IHJvdykgcmF0aGVyIHRoYW4gYmxvY2tpbmcgdGhlIHdob2xlIHBhZ2Ugb24gb25lIGJhZCBncm91cC4gKi9cbiAgcHJpdmF0ZSBsb2FkU2VydmljZUxpbmVzKCkge1xuICAgIGlmICghdGhpcy5hbGxCb29raW5ncy5sZW5ndGgpIHJldHVybjtcbiAgICBmb3JrSm9pbihcbiAgICAgIHRoaXMuYWxsQm9va2luZ3MubWFwKChiKSA9PlxuICAgICAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEdyb3VwTGluZXMoYi5ncm91cElkKS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSlcbiAgICAgIClcbiAgICApLnN1YnNjcmliZSgoYWxsTGluZXM6IGFueVtdKSA9PiB7XG4gICAgICB0aGlzLmFsbEJvb2tpbmdzLmZvckVhY2goKGIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBhbGxMaW5lc1tpXSA/PyBbXTtcbiAgICAgICAgYi5zZXJ2aWNlcyA9IGxpbmVzLmZsYXRNYXAoKGw6IGFueSkgPT4gKGwuc2VydmljZXMgPz8gW10pLm1hcCgoczogYW55KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHMubmFtZSwgZHVyYXRpb25NaW51dGVzOiBzLmR1cmF0aW9uTWludXRlcywgcHJpY2U6IHMucHJpY2VcbiAgICAgICAgfSkpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHJvd3MoKTogQm9va2luZ1Jvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9mVGFiID09PSAndXBjb21pbmcnID8gdGhpcy51cGNvbWluZyA6IHRoaXMucGFzdDtcbiAgfVxuICBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZyAmJiB0aGlzLnJvd3MubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgc2V0UHJvZlRhYih0YWI6ICd1cGNvbWluZycgfCAncGFzdCcpIHtcbiAgICB0aGlzLnByb2ZUYWIgPSB0YWI7XG4gIH1cblxuICBwcm9kdWN0TmFtZXMoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChiLnByb2R1Y3RMaW5lcyA/PyBbXSkubWFwKChwKSA9PiBwLml0ZW1OYW1lKS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcbiAgfVxuICBzZXJ2aWNlTmFtZXMoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChiLnNlcnZpY2VzID8/IFtdKS5tYXAoKHMpID0+IHMubmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7XG4gIH1cbiAgdGl0bGUoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9kZUxhYmVsID0gYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgPyAnSG9tZSBWaXNpdCcgOiBiLm1vZGUgPT09ICdWSURFT19DQUxMJyA/ICdWaWRlbyBDYWxsJyA6ICdTdG9yZSBWaXNpdCc7XG4gICAgY29uc3QgaXRlbXMgPSBbdGhpcy5zZXJ2aWNlTmFtZXMoYiksIHRoaXMucHJvZHVjdE5hbWVzKGIpXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcbiAgICByZXR1cm4gaXRlbXMgPyBgJHttb2RlTGFiZWx9IMK3ICR7aXRlbXN9YCA6IG1vZGVMYWJlbDtcbiAgfVxuICB3aGVuKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShiLmJvb2tpbmdEYXRlKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUlOJywgeyB3ZWVrZGF5OiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIHllYXI6ICdudW1lcmljJyB9KTtcbiAgICByZXR1cm4gYi5zdGFydFRpbWUgPyBgJHtkYXRlfSDCtyAke2Iuc3RhcnRUaW1lfWAgOiBkYXRlO1xuICB9XG4gIGRldGFpbChiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICBpZiAoYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgJiYgYi5hZGRyZXNzRGV0YWlscykgcmV0dXJuIGAke2IuYWRkcmVzc0RldGFpbHMuY2l0eX0sICR7Yi5hZGRyZXNzRGV0YWlscy5zdGF0ZX1gO1xuICAgIGlmIChiLm1vZGUgPT09ICdTVE9SRV9WSVNJVCcgJiYgYi5zdG9yZU5hbWUpIHJldHVybiBiLnN0b3JlTmFtZTtcbiAgICByZXR1cm4gYi5jdXN0b21lckRldGFpbD8ubmFtZSA/PyAnJztcbiAgfVxuICBzdGF0dXNMYWJlbChzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiAnQ29tcGxldGVkJztcbiAgICBpZiAoc3RhdHVzID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuICdDYW5jZWxsZWQnO1xuICAgIHJldHVybiAnQ29uZmlybWVkJztcbiAgfVxuICBzdGF0dXNDbGFzcyhzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiAnc3RhdHVzLWNvbXBsZXRlZCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiAnc3RhdHVzLWNhbmNlbGxlZCc7XG4gICAgcmV0dXJuICdzdGF0dXMtY29uZmlybWVkJztcbiAgfVxuICBwYWlkTGFiZWwoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGIudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmcgJiYgYi50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA+IDAgPyBg4oK5JHtiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nfWAgOiAnTm90aGluZyDigJQgZnJlZSc7XG4gIH1cbiAgZ2V0IGNhbkNhbmNlbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc2VsZWN0ZWQgJiYgKHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnSE9MRCcgfHwgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdCT09LRUQnIHx8IHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnUEVORElORycpO1xuICB9XG5cbiAgdmlld0Jvb2tpbmdEZXRhaWwoYjogQm9va2luZ1Jvdykge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBiO1xuICAgIHRoaXMuY3VycmVudFRhYiA9ICdERVRBSUwnO1xuICB9XG4gIGJhY2tUb0xpc3QoKSB7XG4gICAgdGhpcy5jdXJyZW50VGFiID0gJ0xJU1QnO1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xuICB9XG5cbiAgY2FuY2VsQm9va2luZygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5jYW5jZWxsaW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNhbmNlbEJvb2tpbmdHcm91cCh0aGlzLnNlbGVjdGVkLmdyb3VwSWQsICdDYW5jZWxsZWQgYnkgY3VzdG9tZXInKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsaW5nID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZCkgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPSAnQ0FOQ0VMTEVEJztcbiAgICAgIHRoaXMuc3BsaXRCb29raW5ncygpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnQm9va2luZyBjYW5jZWxsZWQnIH0pO1xuICAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbGxpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogZXJyb3I/LmVycm9yPy5kZXRhaWwgPz8gJ0NvdWxkIG5vdCBjYW5jZWwgdGhpcyBib29raW5nJyB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPHAtdG9hc3QgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIj48L3AtdG9hc3Q+XG5cbjxkaXYgY2xhc3M9XCJtYi1yb290XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VGFiID09PSAnTElTVCdcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItdGl0bGVcIj5NeSBCb29raW5nczwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLXRhYnNcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJwcm9mVGFiID09PSAndXBjb21pbmcnXCIgKGNsaWNrKT1cInNldFByb2ZUYWIoJ3VwY29taW5nJylcIj5VcGNvbWluZzwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi10YWJcIiBbY2xhc3MuYWN0aXZlXT1cInByb2ZUYWIgPT09ICdwYXN0J1wiIChjbGljayk9XCJzZXRQcm9mVGFiKCdwYXN0JylcIj5QYXN0PC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItbG9hZGluZ1wiICpuZ0lmPVwibG9hZGluZ1wiPkxvYWRpbmcgeW91ciBib29raW5nc+KApjwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLXJvd3NcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFpc0VtcHR5XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJvd1wiICpuZ0Zvcj1cImxldCBiIG9mIHJvd3NcIiAoY2xpY2spPVwidmlld0Jvb2tpbmdEZXRhaWwoYilcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1zdHJpcGVcIiBbbmdDbGFzc109XCJiLm1vZGUgPT09ICdIT01FX1ZJU0lUJyA/ICdzdHJpcGUtaG9tZScgOiBiLm1vZGUgPT09ICdWSURFT19DQUxMJyA/ICdzdHJpcGUtdmlkZW8nIDogJ3N0cmlwZS1zdG9yZSdcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1pbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy10b3BcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctdGl0bGVcIj57e3RpdGxlKGIpfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LXdoZW5cIj57e3doZW4oYil9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctZGV0YWlsXCI+e3tkZXRhaWwoYil9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1lbmRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLXN0YXR1c1wiIFtuZ0NsYXNzXT1cInN0YXR1c0NsYXNzKGIuc3RhdHVzKVwiPnt7c3RhdHVzTGFiZWwoYi5zdGF0dXMpfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItZW1wdHlcIiAqbmdJZj1cImlzRW1wdHlcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1iLWVtcHR5LWljb25cIj5ldmVudF9idXN5PC9tYXQtaWNvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1lbXB0eS10aXRsZVwiPk5vIHt7cHJvZlRhYn19IGJvb2tpbmdzIHlldC48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRUYWIgPT09ICdERVRBSUwnICYmIHNlbGVjdGVkXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1iYWNrXCIgKGNsaWNrKT1cImJhY2tUb0xpc3QoKVwiPlxuICAgICAgPG1hdC1pY29uPmFycm93X2JhY2s8L21hdC1pY29uPiBCYWNrIHRvIE15IEJvb2tpbmdzXG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdGl0bGUtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC10aXRsZVwiPnt7dGl0bGUoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLXN0YXR1c1wiIFtuZ0NsYXNzXT1cInN0YXR1c0NsYXNzKHNlbGVjdGVkLnN0YXR1cylcIj57e3N0YXR1c0xhYmVsKHNlbGVjdGVkLnN0YXR1cyl9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtd2hlblwiPnt7d2hlbihzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuc2VydmljZXM/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlNlcnZpY2VzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3tzZXJ2aWNlTmFtZXMoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJzZWxlY3RlZC5wcm9kdWN0TGluZXM/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlByb2R1Y3RzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3twcm9kdWN0TmFtZXMoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJzZWxlY3RlZC5jdXN0b21lckRldGFpbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkNvbnRhY3Q8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj57e3NlbGVjdGVkLmN1c3RvbWVyRGV0YWlsPy5uYW1lfX0gwrcge3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8ucGhvbmVOdW1iZXJ9fSDCtyB7e3NlbGVjdGVkLmN1c3RvbWVyRGV0YWlsPy5lbWFpbH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQubW9kZSA9PT0gJ0hPTUVfVklTSVQnICYmIHNlbGVjdGVkLmFkZHJlc3NEZXRhaWxzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+QWRkcmVzczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LmFkZHJlc3NMaW5lMX19LCB7e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5jaXR5fX0sIHt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LnN0YXRlfX0ge3tzZWxlY3RlZC5hZGRyZXNzRGV0YWlscz8uemlwQ29kZX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlBhaWQ8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj57e3BhaWRMYWJlbChzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItdmlkZW8tbGlua1wiICpuZ0lmPVwic2VsZWN0ZWQubW9kZSA9PT0gJ1ZJREVPX0NBTEwnICYmIHNlbGVjdGVkLnZpZGVvQ2FsbExpbmsgJiYgc2VsZWN0ZWQuc3RhdHVzICE9PSAnQ0FOQ0VMTEVEJ1wiPlxuICAgICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPlxuICAgICAgICA8YSBbaHJlZl09XCJzZWxlY3RlZC52aWRlb0NhbGxMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3tzZWxlY3RlZC52aWRlb0NhbGxMaW5rfX08L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbkNhbmNlbFNlbGVjdGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3lcIiAqbmdJZj1cImNhbmNlbGxhdGlvblBvbGljeVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGl0bGVcIj57e2NhbmNlbGxhdGlvblBvbGljeS50aXRsZX19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeS10ZXh0XCI+e3tjYW5jZWxsYXRpb25Qb2xpY3kucG9saWN5RGV0YWlsc319PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLWNhbmNlbC1idG5cIiBbZGlzYWJsZWRdPVwiY2FuY2VsbGluZ1wiIChjbGljayk9XCJjYW5jZWxCb29raW5nKClcIj5cbiAgICAgICAgICB7e2NhbmNlbGxpbmcgPyAnQ2FuY2VsbGluZ+KApicgOiAnQ2FuY2VsIGJvb2tpbmcnfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLWNhbmNlbGxlZC1ub3RlXCIgKm5nSWY9XCJzZWxlY3RlZC5zdGF0dXMgPT09ICdDQU5DRUxMRUQnXCI+VGhpcyBib29raW5nIGhhcyBiZWVuIGNhbmNlbGxlZC48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==