simpo-component-library 3.6.996 → 3.6.999

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.
@@ -100,7 +100,7 @@ export class MyBookingsComponent {
100
100
  isUpcoming(b) {
101
101
  const today = new Date();
102
102
  today.setHours(0, 0, 0, 0);
103
- return (b.status === 'HOLD' || b.status === 'BOOKED' || b.status === 'PENDING') && new Date(b.bookingDate) >= today;
103
+ return (b.status === 'HOLD' || b.status === 'BOOKED' || b.status === 'PENDING' || b.status === 'ONGOING') && new Date(b.bookingDate) >= today;
104
104
  }
105
105
  splitBookings() {
106
106
  this.upcoming = this.allBookings.filter((b) => this.isUpcoming(b));
@@ -159,6 +159,8 @@ export class MyBookingsComponent {
159
159
  return 'Cancelled';
160
160
  if (status === 'HOLD' || status === 'PENDING')
161
161
  return 'Payment Pending';
162
+ if (status === 'ONGOING')
163
+ return 'In Progress';
162
164
  return 'Confirmed';
163
165
  }
164
166
  statusClass(status) {
@@ -168,6 +170,8 @@ export class MyBookingsComponent {
168
170
  return 'status-cancelled';
169
171
  if (status === 'HOLD' || status === 'PENDING')
170
172
  return 'status-pending';
173
+ if (status === 'ONGOING')
174
+ return 'status-ongoing';
171
175
  return 'status-confirmed';
172
176
  }
173
177
  paidLabel(b) {
@@ -300,15 +304,15 @@ export class MyBookingsComponent {
300
304
  });
301
305
  }
302
306
  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 }); }
303
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MyBookingsComponent, isStandalone: true, selector: "simpo-my-bookings", inputs: { data: "data" }, providers: [MessageService], viewQueries: [{ propertyName: "reschDayStripRef", first: true, predicate: ["reschDayStrip"], descendants: true }], 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\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</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 class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(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 <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"cancelBooking()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date &amp; time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\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}.status-pending{background:#fdf3e3;color:#b36b00}.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;border-radius:8px;background:#fff;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}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\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"] }] }); }
307
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MyBookingsComponent, isStandalone: true, selector: "simpo-my-bookings", inputs: { data: "data" }, providers: [MessageService], viewQueries: [{ propertyName: "reschDayStripRef", first: true, predicate: ["reschDayStrip"], descendants: true }], 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\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</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 class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(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 <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"cancelBooking()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date &amp; time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\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}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.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;border-radius:8px;background:#fff;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}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\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"] }] }); }
304
308
  }
305
309
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MyBookingsComponent, decorators: [{
306
310
  type: Component,
307
- 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\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</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 class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(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 <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"cancelBooking()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date &amp; time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\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}.status-pending{background:#fdf3e3;color:#b36b00}.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;border-radius:8px;background:#fff;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}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
311
+ 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\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</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 class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(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 <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"cancelBooking()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date &amp; time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\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}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.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;border-radius:8px;background:#fff;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}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
308
312
  }], ctorParameters: () => [{ type: i1.RestService }, { type: i2.StorageServiceService }, { type: i3.MessageService }], propDecorators: { data: [{
309
313
  type: Input
310
314
  }], reschDayStripRef: [{
311
315
  type: ViewChild,
312
316
  args: ['reschDayStrip']
313
317
  }] } });
314
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktYm9va2luZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9teS1ib29raW5ncy9teS1ib29raW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL215LWJvb2tpbmdzL215LWJvb2tpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBNkI1Qzs7Ozs7R0FLRztBQVNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsWUFDbUIsV0FBd0IsRUFDeEIsY0FBcUMsRUFDckMsY0FBOEI7UUFGOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTJCakQsZUFBVSxHQUFzQixNQUFNLENBQUM7UUFDdkMsWUFBTyxHQUF3QixVQUFVLENBQUM7UUFDMUMsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFWCxnQkFBVyxHQUFpQixF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QUUsQ0FBQztZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztRQUNqRixDQUFDLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksK0JBQStCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BJLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F4U1UsbUJBQW1CO21HQUFuQixtQkFBbUIsMEZBSm5CLENBQUMsY0FBYyxDQUFDLDZJQzdDN0IsczVUQW1NQSxrcU1EdkpZLFlBQVksNlZBQUUsYUFBYSxtTEFBRSxXQUFXOzs0RkFLdkMsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUN4QyxDQUFDLGNBQWMsQ0FBQztpSkFXbEIsSUFBSTtzQkFBWixLQUFLO2dCQXFDc0IsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RvYXN0JztcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vZWNvbW1lcmNlL3N0eWxlcy91c2VyLm1vZGFsJztcblxuaW50ZXJmYWNlIEJvb2tpbmdSb3cge1xuICBncm91cElkOiBzdHJpbmc7XG4gIG1vZGU6ICdTVE9SRV9WSVNJVCcgfCAnSE9NRV9WSVNJVCcgfCAnVklERU9fQ0FMTCc7XG4gIGJvb2tpbmdEYXRlOiBzdHJpbmc7XG4gIHN0YXJ0VGltZT86IHN0cmluZztcbiAgZW5kVGltZT86IHN0cmluZztcbiAgc3RhdHVzOiAnUEVORElORycgfCAnQk9PS0VEJyB8ICdIT0xEJyB8ICdDT01QTEVURUQnIHwgJ0NBTkNFTExFRCc7XG4gIHN0b3JlTmFtZT86IHN0cmluZztcbiAgY3VzdG9tZXJEZXRhaWw/OiB7IG5hbWU6IHN0cmluZzsgcGhvbmVOdW1iZXI6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9O1xuICBhZGRyZXNzRGV0YWlscz86IHsgcmVjZWl2ZXJOYW1lOiBzdHJpbmc7IHJlY2VpdmVyUGhvbmU6IHN0cmluZzsgYWRkcmVzc0xpbmUxOiBzdHJpbmc7IGFkZHJlc3NMaW5lMj86IHN0cmluZzsgY2l0eTogc3RyaW5nOyBzdGF0ZTogc3RyaW5nOyB6aXBDb2RlOiBzdHJpbmcgfTtcbiAgcHJvZHVjdExpbmVzPzogeyBpdGVtTmFtZTogc3RyaW5nOyBxdWFudGl0eTogbnVtYmVyIH1bXTtcbiAgLyoqIE5vdCBwYXJ0IG9mIHRoZSBHRVQgL2Jvb2tpbmcvZ3JvdXAvbXkgcmVzcG9uc2UgLSBzZXJ2aWNlcyBsaXZlIG9uIHRoZSBzZXBhcmF0ZVxuICAgKiBCb29raW5nRGV0YWlsIGNvbGxlY3Rpb24gKEZLJ2QgdmlhIHNlcnZpY2VMaW5lSWRzLCBub3QgZGVub3JtYWxpemVkIG9udG8gQm9va2luZ0dyb3VwKSwgc29cbiAgICogdGhpcyBpcyBmaWxsZWQgaW4gY2xpZW50LXNpZGUgYWZ0ZXIgbG9hZCgpIHZpYSBhIHBlci1yb3cgR0VUIC4uLi9saW5lcyBjYWxsLiAqL1xuICBzZXJ2aWNlcz86IHsgbmFtZTogc3RyaW5nOyBkdXJhdGlvbk1pbnV0ZXM6IG51bWJlcjsgcHJpY2U6IG51bWJlciB9W107XG4gIHZpZGVvQ2FsbExpbms/OiBzdHJpbmc7XG4gIHRvdGFsQ29sbGVjdGVkQXRCb29raW5nPzogbnVtYmVyO1xuICB0b3RhbFBheWFibGU/OiBudW1iZXI7XG4gIGhvbWVWaXNpdENoYXJnZT86IG51bWJlcjtcbiAgLyoqIFRyYW5zaWVudCwgY29tcHV0ZWQgb24gZXZlcnkgYmFja2VuZCByZWFkIG9mIHRoaXMgZ3JvdXAgLSBzZWUgQm9va2luZ0dyb3VwI2NhblJlc2NoZWR1bGUuICovXG4gIGNhblJlc2NoZWR1bGU/OiBib29sZWFuO1xuICByZXNjaGVkdWxlQmxvY2tlZFJlYXNvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBcIk15IEJvb2tpbmdzXCIgLSBhIGN1c3RvbWVyJ3Mgb3duIGJvb2tpbmcgaGlzdG9yeSAoVXBjb21pbmcvUGFzdCksIGEgZGV0YWlsIHZpZXcgcGVyIGJvb2tpbmcsXG4gKiBhbmQgY2FuY2VsbGF0aW9uLiBUaGUgbGlzdCBlbmRwb2ludCByZXR1cm5zIGZ1bGwgQm9va2luZ0dyb3VwIHJlY29yZHMgLSBlbm91Z2ggZm9yXG4gKiBkYXRlL3N0YXR1cy9hZGRyZXNzL3Byb2R1Y3RzIC0gYnV0IHNlcnZpY2VzIGJvb2tlZCBhcmVuJ3Qgb24gdGhhdCByZWNvcmQgKHNlZSBCb29raW5nUm93LnNlcnZpY2VzXG4gKiBhYm92ZSksIHNvIGxvYWQoKSBpc3N1ZXMgb25lIGV4dHJhIEdFVCAuLi4vbGluZXMgY2FsbCBwZXIgcm93IHRvIGZpbGwgdGhlbSBpbi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2ltcG8tbXktYm9va2luZ3MnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBUb2FzdE1vZHVsZV0sXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL215LWJvb2tpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL215LWJvb2tpbmdzLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIE15Qm9va2luZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3RTZXJ2aWNlOiBSZXN0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICkgeyB9XG5cbiAgQElucHV0KCkgZGF0YTogYW55O1xuICBzdHlsZXM6IGFueTtcblxuICAvKiogU2FtZSBjb250cmFzdCBhbGdvcml0aG0gYXMgQ29sb3JEaXJlY3RpdmUgKGRpcmVjdGl2ZS9jb2xvci5kaXJlY3RpdmUudHMpIC0gcmVpbXBsZW1lbnRlZCBhc1xuICAgKiBhIHB1cmUgZ2V0dGVyIHJhdGhlciB0aGFuIHJldXNpbmcgdGhhdCBkaXJlY3RpdmUgZGlyZWN0bHksIHNpbmNlIGl0cyBbc2ltcG9Db2xvcl0gb25seSBldmVyXG4gICAqICpzZXRzKiBhIGNvbXB1dGVkIGNvbG9yIGFuZCBuZXZlciBjbGVhcnMgaXQsIHdoaWNoIHdvdWxkIGxlYXZlIGEgc3RhbGUgY29sb3Igc3R1Y2sgb24gYVxuICAgKiBjaGlwIGFmdGVyIGl0IHRvZ2dsZXMgZnJvbSBhY3RpdmUgYmFjayB0byBpbmFjdGl2ZS4gRXZlcnkgYWNjZW50LWNvbG9yZWQgZWxlbWVudCBoZXJlIGlzXG4gICAqIGVpdGhlciBhbHdheXMtb24gKG5ldmVyIHRvZ2dsZXMpIG9yIGRyaXZlbiBieSB0aGlzIHNhbWUgZ2V0dGVyLCBzbyB0aGVyZSdzIGV4YWN0bHkgb25lXG4gICAqIGRlZmluaXRpb24gb2YgXCJ3aGF0IHRleHQgY29sb3IgZ29lcyBvbiB0aGUgYWNjZW50IGNvbG9yXCIgaW4gdGhpcyBmaWxlLiAqL1xuICBnZXQgY29udHJhc3RDb2xvcigpOiBzdHJpbmcge1xuICAgIGxldCBoZXggPSB0aGlzLnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3I7XG4gICAgaWYgKCFoZXgpIHJldHVybiAnI2ZmZmZmZic7XG4gICAgaWYgKGhleC5sZW5ndGggPCA2KSB7XG4gICAgICBsZXQgZXhwYW5kZWQgPSAnIyc7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGhleC5sZW5ndGg7IGkrKykgZXhwYW5kZWQgKz0gaGV4W2ldICsgaGV4W2ldO1xuICAgICAgaGV4ID0gZXhwYW5kZWQ7XG4gICAgfVxuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc2xpY2UoMSwgMyksIDE2KTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnNsaWNlKDMsIDUpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zbGljZSg1LCA3KSwgMTYpO1xuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAxMzAgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XG4gIH1cblxuICBjdXJyZW50VGFiOiAnTElTVCcgfCAnREVUQUlMJyA9ICdMSVNUJztcbiAgcHJvZlRhYjogJ3VwY29taW5nJyB8ICdwYXN0JyA9ICd1cGNvbWluZyc7XG4gIGxvYWRpbmcgPSB0cnVlO1xuICBjYW5jZWxsaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBhbGxCb29raW5nczogQm9va2luZ1Jvd1tdID0gW107XG4gIHVwY29taW5nOiBCb29raW5nUm93W10gPSBbXTtcbiAgcGFzdDogQm9va2luZ1Jvd1tdID0gW107XG4gIHNlbGVjdGVkOiBCb29raW5nUm93IHwgbnVsbCA9IG51bGw7XG4gIGNhbmNlbGxhdGlvblBvbGljeTogeyB0aXRsZTogc3RyaW5nOyBwb2xpY3lEZXRhaWxzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICByZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPSAyNDtcblxuICAvLyBSZXNjaGVkdWxlIHBhbmVsIC0gZGF0ZSBzdHJpcCArIHNsb3QgZ3JpZCwgbWF0Y2hpbmcgdGhlIGFkbWluIHNpZGUncyBSZXNjaGVkdWxlQXBwb2ludG1lbnRDb21wb25lbnQuXG4gIEBWaWV3Q2hpbGQoJ3Jlc2NoRGF5U3RyaXAnKSByZXNjaERheVN0cmlwUmVmPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIHJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgcmVzY2hEYXlzOiB7IGlzbzogc3RyaW5nOyBkb3c6IHN0cmluZzsgbnVtOiBzdHJpbmcgfVtdID0gW107XG4gIHJlc2NoU2VsZWN0ZWRJc28gPSAnJztcbiAgcmVzY2hTZWxlY3RlZFRpbWUgPSAnJztcbiAgcmVzY2hTbG90czogc3RyaW5nW10gPSBbXTtcbiAgcmVzY2hMb2FkaW5nU2xvdHMgPSBmYWxzZTtcbiAgcmVzY2hDb25maXJtaW5nID0gZmFsc2U7XG4gIHJlc2NoRXJyb3IgPSAnJztcbiAgcmVzY2hOb1Nsb3RzID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIGxvYWQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBidXNpbmVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA/PyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYklkJykgPz8gJyc7XG4gICAgY29uc3QgdXNlcklkID0gKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXIpPy51c2VySWQgPz8gJyc7XG4gICAgaWYgKCFidXNpbmVzc0lkIHx8ICF1c2VySWQpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldE15Qm9va2luZ3MoYnVzaW5lc3NJZCwgdXNlcklkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLmFsbEJvb2tpbmdzID0gKHJlcyA/PyBbXSkgYXMgQm9va2luZ1Jvd1tdO1xuICAgICAgdGhpcy5zcGxpdEJvb2tpbmdzKCk7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubG9hZFNlcnZpY2VMaW5lcygpO1xuICAgIH0sICgpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRDYW5jZWxsYXRpb25Qb2xpY3koYnVzaW5lc3NJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsYXRpb25Qb2xpY3kgPSAocmVzID8/IFtdKVswXSA/PyBudWxsO1xuICAgIH0sICgpID0+IHtcbiAgICAgIC8vIE5vbi1mYXRhbCAtIHRoZSBkZXRhaWwgdmlldyBqdXN0IHdvbid0IHNob3cgYSBwb2xpY3kgbm90ZS5cbiAgICB9KTtcblxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QnVzaW5lc3NBcHBvaW50bWVudFNldHRpbmdzKGJ1c2luZXNzSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzY2hlZHVsZUN1dG9mZkhvdXJzID0gcmVzPy5yZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPz8gMjQ7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgLy8gTm9uLWZhdGFsIC0gZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCBjdXRvZmYgdXNlZCBmb3IgZGlzcGxheSBvbmx5OyB0aGUgYmFja2VuZCBpcyB0aGVcbiAgICAgIC8vIHJlYWwgc291cmNlIG9mIHRydXRoIGFuZCBlbmZvcmNlcyBpdHMgb3duIGFjdHVhbCBjb25maWd1cmVkIHZhbHVlIHJlZ2FyZGxlc3MuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzVXBjb21pbmcoYjogQm9va2luZ1Jvdyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gKGIuc3RhdHVzID09PSAnSE9MRCcgfHwgYi5zdGF0dXMgPT09ICdCT09LRUQnIHx8IGIuc3RhdHVzID09PSAnUEVORElORycpICYmIG5ldyBEYXRlKGIuYm9va2luZ0RhdGUpID49IHRvZGF5O1xuICB9XG5cbiAgcHJpdmF0ZSBzcGxpdEJvb2tpbmdzKCkge1xuICAgIHRoaXMudXBjb21pbmcgPSB0aGlzLmFsbEJvb2tpbmdzLmZpbHRlcigoYikgPT4gdGhpcy5pc1VwY29taW5nKGIpKTtcbiAgICB0aGlzLnBhc3QgPSB0aGlzLmFsbEJvb2tpbmdzLmZpbHRlcigoYikgPT4gIXRoaXMuaXNVcGNvbWluZyhiKSk7XG4gIH1cblxuICAvKiogT25lIGJvb2tpbmcgaGlzdG9yeSBsb2FkLCBib3VuZGVkIHRvIHRoaXMgY3VzdG9tZXIncyBvd24gYm9va2luZ3MgLSBhIHBlci1yb3cgY2FsbCBoZXJlIGlzXG4gICAqIGZpbmUsIHVubGlrZSBhbiB1bmJvdW5kZWQvcGFnaW5hdGVkIGxpc3QuIEZhaWx1cmVzIGFyZSBzd2FsbG93ZWQgcGVyLXJvdyAoZmFsbHMgYmFjayB0byBub1xuICAgKiBzZXJ2aWNlIG5hbWVzIGZvciB0aGF0IHJvdykgcmF0aGVyIHRoYW4gYmxvY2tpbmcgdGhlIHdob2xlIHBhZ2Ugb24gb25lIGJhZCBncm91cC4gKi9cbiAgcHJpdmF0ZSBsb2FkU2VydmljZUxpbmVzKCkge1xuICAgIGlmICghdGhpcy5hbGxCb29raW5ncy5sZW5ndGgpIHJldHVybjtcbiAgICBmb3JrSm9pbihcbiAgICAgIHRoaXMuYWxsQm9va2luZ3MubWFwKChiKSA9PlxuICAgICAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEdyb3VwTGluZXMoYi5ncm91cElkKS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSlcbiAgICAgIClcbiAgICApLnN1YnNjcmliZSgoYWxsTGluZXM6IGFueVtdKSA9PiB7XG4gICAgICB0aGlzLmFsbEJvb2tpbmdzLmZvckVhY2goKGIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBhbGxMaW5lc1tpXSA/PyBbXTtcbiAgICAgICAgYi5zZXJ2aWNlcyA9IGxpbmVzLmZsYXRNYXAoKGw6IGFueSkgPT4gKGwuc2VydmljZXMgPz8gW10pLm1hcCgoczogYW55KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHMubmFtZSwgZHVyYXRpb25NaW51dGVzOiBzLmR1cmF0aW9uTWludXRlcywgcHJpY2U6IHMucHJpY2VcbiAgICAgICAgfSkpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHJvd3MoKTogQm9va2luZ1Jvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9mVGFiID09PSAndXBjb21pbmcnID8gdGhpcy51cGNvbWluZyA6IHRoaXMucGFzdDtcbiAgfVxuICBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZyAmJiB0aGlzLnJvd3MubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgc2V0UHJvZlRhYih0YWI6ICd1cGNvbWluZycgfCAncGFzdCcpIHtcbiAgICB0aGlzLnByb2ZUYWIgPSB0YWI7XG4gIH1cblxuICBwcm9kdWN0TmFtZXMoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChiLnByb2R1Y3RMaW5lcyA/PyBbXSkubWFwKChwKSA9PiBwLml0ZW1OYW1lKS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcbiAgfVxuICBzZXJ2aWNlTmFtZXMoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChiLnNlcnZpY2VzID8/IFtdKS5tYXAoKHMpID0+IHMubmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7XG4gIH1cbiAgdGl0bGUoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9kZUxhYmVsID0gYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgPyAnSG9tZSBWaXNpdCcgOiBiLm1vZGUgPT09ICdWSURFT19DQUxMJyA/ICdWaWRlbyBDYWxsJyA6ICdTdG9yZSBWaXNpdCc7XG4gICAgY29uc3QgaXRlbXMgPSBbdGhpcy5zZXJ2aWNlTmFtZXMoYiksIHRoaXMucHJvZHVjdE5hbWVzKGIpXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcbiAgICByZXR1cm4gaXRlbXMgPyBgJHttb2RlTGFiZWx9IMK3ICR7aXRlbXN9YCA6IG1vZGVMYWJlbDtcbiAgfVxuICB3aGVuKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShiLmJvb2tpbmdEYXRlKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUlOJywgeyB3ZWVrZGF5OiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIHllYXI6ICdudW1lcmljJyB9KTtcbiAgICByZXR1cm4gYi5zdGFydFRpbWUgPyBgJHtkYXRlfSDCtyAke2Iuc3RhcnRUaW1lfWAgOiBkYXRlO1xuICB9XG4gIGRldGFpbChiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICBpZiAoYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgJiYgYi5hZGRyZXNzRGV0YWlscykgcmV0dXJuIGAke2IuYWRkcmVzc0RldGFpbHMuY2l0eX0sICR7Yi5hZGRyZXNzRGV0YWlscy5zdGF0ZX1gO1xuICAgIGlmIChiLm1vZGUgPT09ICdTVE9SRV9WSVNJVCcgJiYgYi5zdG9yZU5hbWUpIHJldHVybiBiLnN0b3JlTmFtZTtcbiAgICByZXR1cm4gYi5jdXN0b21lckRldGFpbD8ubmFtZSA/PyAnJztcbiAgfVxuICBzdGF0dXNMYWJlbChzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiAnQ29tcGxldGVkJztcbiAgICBpZiAoc3RhdHVzID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuICdDYW5jZWxsZWQnO1xuICAgIGlmIChzdGF0dXMgPT09ICdIT0xEJyB8fCBzdGF0dXMgPT09ICdQRU5ESU5HJykgcmV0dXJuICdQYXltZW50IFBlbmRpbmcnO1xuICAgIHJldHVybiAnQ29uZmlybWVkJztcbiAgfVxuICBzdGF0dXNDbGFzcyhzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiAnc3RhdHVzLWNvbXBsZXRlZCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiAnc3RhdHVzLWNhbmNlbGxlZCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0hPTEQnIHx8IHN0YXR1cyA9PT0gJ1BFTkRJTkcnKSByZXR1cm4gJ3N0YXR1cy1wZW5kaW5nJztcbiAgICByZXR1cm4gJ3N0YXR1cy1jb25maXJtZWQnO1xuICB9XG4gIHBhaWRMYWJlbChiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYi50b3RhbENvbGxlY3RlZEF0Qm9va2luZyAmJiBiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nID4gMCA/IGDigrkke2IudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmd9YCA6ICdOb3RoaW5nIOKAlCBmcmVlJztcbiAgfVxuICBzZXJ2aWNlUHJpY2VUb3RhbChiOiBCb29raW5nUm93KTogbnVtYmVyIHtcbiAgICByZXR1cm4gKGIuc2VydmljZXMgPz8gW10pLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyAocy5wcmljZSB8fCAwKSwgMCk7XG4gIH1cbiAgdG90YWxEdWUoYjogQm9va2luZ1Jvdyk6IG51bWJlciB7XG4gICAgcmV0dXJuIChiLnRvdGFsUGF5YWJsZSA/PyAwKSArIChiLmhvbWVWaXNpdENoYXJnZSA/PyAwKTtcbiAgfVxuICBwZW5kaW5nQW1vdW50KGI6IEJvb2tpbmdSb3cpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLnRvdGFsRHVlKGIpIC0gKGIudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmcgPz8gMCkpO1xuICB9XG4gIGdldCBjYW5DYW5jZWxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkICYmICh0aGlzLnNlbGVjdGVkLnN0YXR1cyA9PT0gJ0hPTEQnIHx8IHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJyB8fCB0aGlzLnNlbGVjdGVkLnN0YXR1cyA9PT0gJ1BFTkRJTkcnKTtcbiAgfVxuICBnZXQgY2FuUmVzY2hlZHVsZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdCT09LRUQnICYmICEhdGhpcy5zZWxlY3RlZC5jYW5SZXNjaGVkdWxlO1xuICB9XG5cbiAgdmlld0Jvb2tpbmdEZXRhaWwoYjogQm9va2luZ1Jvdykge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBiO1xuICAgIHRoaXMuY3VycmVudFRhYiA9ICdERVRBSUwnO1xuICAgIHRoaXMucmVzY2hlZHVsZVBhbmVsT3BlbiA9IGZhbHNlO1xuICB9XG4gIGJhY2tUb0xpc3QoKSB7XG4gICAgdGhpcy5jdXJyZW50VGFiID0gJ0xJU1QnO1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xuICAgIHRoaXMucmVzY2hlZHVsZVBhbmVsT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlc2NoZWR1bGVcblxuICBvcGVuUmVzY2hlZHVsZVBhbmVsKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCkgcmV0dXJuO1xuICAgIHRoaXMucmVzY2hlZHVsZVBhbmVsT3BlbiA9IHRydWU7XG4gICAgdGhpcy5yZXNjaFNlbGVjdGVkVGltZSA9ICcnO1xuICAgIHRoaXMucmVzY2hFcnJvciA9ICcnO1xuICAgIHRoaXMuYnVpbGRSZXNjaERheVN0cmlwKCk7XG4gICAgaWYgKHRoaXMucmVzY2hEYXlzLmxlbmd0aCkgdGhpcy5zZWxlY3RSZXNjaERheSh0aGlzLnJlc2NoRGF5c1swXSk7XG4gIH1cbiAgY2xvc2VSZXNjaGVkdWxlUGFuZWwoKSB7XG4gICAgdGhpcy5yZXNjaGVkdWxlUGFuZWxPcGVuID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUmVzY2hEYXlTdHJpcCgpIHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgdGhpcy5yZXNjaERheXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE0OyBpKyspIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgICBkLnNldERhdGUoZC5nZXREYXRlKCkgKyBpKTtcbiAgICAgIHRoaXMucmVzY2hEYXlzLnB1c2goe1xuICAgICAgICBpc286IGQudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZG93OiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSksXG4gICAgICAgIG51bTogZC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUlOJywgeyBkYXk6ICdudW1lcmljJyB9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBNb3VzZSB1c2VycyBoYXZlIG5vIHN3aXBlL3RyYWNrcGFkIGdlc3R1cmUgZm9yIHRoZSBob3Jpem9udGFsbHktc2Nyb2xsaW5nIGRheSBzdHJpcCAtIGdpdmVcbiAgICogdGhlbSBleHBsaWNpdCBwcmV2L25leHQgYXJyb3dzIGluc3RlYWQgb2YgcmVseWluZyBvbiBzaGlmdCt3aGVlbCAobWF0Y2hlcyB0aGUgYWRtaW4gc2lkZSdzXG4gICAqIFJlc2NoZWR1bGVBcHBvaW50bWVudENvbXBvbmVudCNzY3JvbGxEYXlzKS4gKi9cbiAgc2Nyb2xsUmVzY2hEYXlzKGRpcmVjdGlvbjogbnVtYmVyKSB7XG4gICAgY29uc3QgZWwgPSB0aGlzLnJlc2NoRGF5U3RyaXBSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGVsLnNjcm9sbEJ5KHsgbGVmdDogZGlyZWN0aW9uICogMTYwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gIH1cblxuICBzZWxlY3RSZXNjaERheShkYXk6IHsgaXNvOiBzdHJpbmcgfSkge1xuICAgIHRoaXMucmVzY2hTZWxlY3RlZElzbyA9IGRheS5pc287XG4gICAgdGhpcy5yZXNjaFNlbGVjdGVkVGltZSA9ICcnO1xuICAgIHRoaXMucmVzY2hFcnJvciA9ICcnO1xuICAgIHRoaXMuZmV0Y2hSZXNjaFNsb3RzKCk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoUmVzY2hTbG90cygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQpIHJldHVybjtcbiAgICB0aGlzLnJlc2NoTG9hZGluZ1Nsb3RzID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2NoTm9TbG90cyA9IGZhbHNlO1xuICAgIHRoaXMucmVzY2hTbG90cyA9IFtdO1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmVzY2hlZHVsZVNsb3RzKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCwgdGhpcy5yZXNjaFNlbGVjdGVkSXNvKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlc2NoTG9hZGluZ1Nsb3RzID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2NoU2xvdHMgPSByZXMgPz8gW107XG4gICAgICB0aGlzLnJlc2NoTm9TbG90cyA9IHRoaXMucmVzY2hTbG90cy5sZW5ndGggPT09IDA7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgdGhpcy5yZXNjaExvYWRpbmdTbG90cyA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNjaE5vU2xvdHMgPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0UmVzY2hUaW1lKHRpbWU6IHN0cmluZykge1xuICAgIHRoaXMucmVzY2hTZWxlY3RlZFRpbWUgPSB0aW1lO1xuICB9XG5cbiAgZ2V0IHJlc2NoSW52YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMucmVzY2hTZWxlY3RlZElzbyB8fCAhdGhpcy5yZXNjaFNlbGVjdGVkVGltZSB8fCB0aGlzLnJlc2NoQ29uZmlybWluZztcbiAgfVxuXG4gIGNvbmZpcm1SZXNjaGVkdWxlKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCB8fCB0aGlzLnJlc2NoSW52YWxpZCkgcmV0dXJuO1xuICAgIHRoaXMucmVzY2hDb25maXJtaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2NoRXJyb3IgPSAnJztcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnJlc2NoZWR1bGVCb29raW5nKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCwgdGhpcy5yZXNjaFNlbGVjdGVkSXNvLCB0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lKS5zdWJzY3JpYmUoKGdyb3VwOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzY2hDb25maXJtaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuYm9va2luZ0RhdGUgPSBncm91cD8uYm9va2luZ0RhdGUgPz8gdGhpcy5yZXNjaFNlbGVjdGVkSXNvO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnN0YXJ0VGltZSA9IGdyb3VwPy5zdGFydFRpbWUgPz8gdGhpcy5zZWxlY3RlZC5zdGFydFRpbWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuZW5kVGltZSA9IGdyb3VwPy5lbmRUaW1lID8/IHRoaXMuc2VsZWN0ZWQuZW5kVGltZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5jYW5SZXNjaGVkdWxlID0gZ3JvdXA/LmNhblJlc2NoZWR1bGUgPz8gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQucmVzY2hlZHVsZUJsb2NrZWRSZWFzb24gPSBncm91cD8ucmVzY2hlZHVsZUJsb2NrZWRSZWFzb24gPz8gJyc7XG4gICAgICB9XG4gICAgICB0aGlzLnNwbGl0Qm9va2luZ3MoKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ0Jvb2tpbmcgcmVzY2hlZHVsZWQnIH0pO1xuICAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlc2NoQ29uZmlybWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNjaEVycm9yID0gZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8IGVycm9yPy5lcnJvcj8uZGV0YWlsIHx8ICdVbmFibGUgdG8gcmVzY2hlZHVsZSB0aGlzIGJvb2tpbmcnO1xuICAgIH0pO1xuICB9XG5cbiAgY2FuY2VsQm9va2luZygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5jYW5jZWxsaW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNhbmNlbEJvb2tpbmdHcm91cCh0aGlzLnNlbGVjdGVkLmdyb3VwSWQsICdDYW5jZWxsZWQgYnkgY3VzdG9tZXInKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsaW5nID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZCkgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPSAnQ0FOQ0VMTEVEJztcbiAgICAgIHRoaXMuc3BsaXRCb29raW5ncygpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnQm9va2luZyBjYW5jZWxsZWQnIH0pO1xuICAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbGxpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogZXJyb3I/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+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VydmljZVByaWNlVG90YWwoc2VsZWN0ZWQpID4gMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlNlcnZpY2UgcHJpY2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj7igrl7e3NlcnZpY2VQcmljZVRvdGFsKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuaG9tZVZpc2l0Q2hhcmdlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+SG9tZSB2aXNpdCBjaGFyZ2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj7igrl7e3NlbGVjdGVkLmhvbWVWaXNpdENoYXJnZX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlRvdGFsPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3t0b3RhbER1ZShzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5QYWlkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3twYWlkTGFiZWwoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJwZW5kaW5nQW1vdW50KHNlbGVjdGVkKSA+IDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5QZW5kaW5nIGF0IGFwcG9pbnRtZW50PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3twZW5kaW5nQW1vdW50KHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi12aWRlby1saW5rXCIgKm5nSWY9XCJzZWxlY3RlZC5tb2RlID09PSAnVklERU9fQ0FMTCcgJiYgc2VsZWN0ZWQudmlkZW9DYWxsTGluayAmJiBzZWxlY3RlZC5zdGF0dXMgIT09ICdDQU5DRUxMRUQnXCI+XG4gICAgICAgIDxtYXQtaWNvbj52aWRlb2NhbTwvbWF0LWljb24+XG4gICAgICAgIDxhIFtocmVmXT1cInNlbGVjdGVkLnZpZGVvQ2FsbExpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj57e3NlbGVjdGVkLnZpZGVvQ2FsbExpbmt9fTwvYT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5XCIgKm5nSWY9XCJjYW5SZXNjaGVkdWxlU2VsZWN0ZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeS10aXRsZVwiPlJlc2NoZWR1bGUgcG9saWN5PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGV4dFwiPllvdSBjYW4gcmVzY2hlZHVsZSB0aGlzIGJvb2tpbmcgdXAgdG8ge3tyZXNjaGVkdWxlQ3V0b2ZmSG91cnN9fSBob3Vye3tyZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPT09IDEgPyAnJyA6ICdzJ319IGJlZm9yZSB0aGUgYXBwb2ludG1lbnQgdGltZS48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeVwiICpuZ0lmPVwiY2FuQ2FuY2VsU2VsZWN0ZWQgJiYgY2FuY2VsbGF0aW9uUG9saWN5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGl0bGVcIj57e2NhbmNlbGxhdGlvblBvbGljeS50aXRsZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGV4dFwiPnt7Y2FuY2VsbGF0aW9uUG9saWN5LnBvbGljeURldGFpbHN9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1hY3Rpb25zLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJyB8fCBjYW5DYW5jZWxTZWxlY3RlZFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaGVkdWxlLWJ0blwiXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZC5zdGF0dXMgPT09ICdCT09LRUQnXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhblJlc2NoZWR1bGVTZWxlY3RlZFwiXG4gICAgICAgICAgW3RpdGxlXT1cIiFjYW5SZXNjaGVkdWxlU2VsZWN0ZWQgPyBzZWxlY3RlZC5yZXNjaGVkdWxlQmxvY2tlZFJlYXNvbiA6ICcnXCJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIChjbGljayk9XCJvcGVuUmVzY2hlZHVsZVBhbmVsKClcIlxuICAgICAgICA+UmVzY2hlZHVsZSBib29raW5nPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cIm1iLWNhbmNlbC1idG5cIlxuICAgICAgICAgICpuZ0lmPVwiY2FuQ2FuY2VsU2VsZWN0ZWRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJjYW5jZWxsaW5nXCJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIChjbGljayk9XCJjYW5jZWxCb29raW5nKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3tjYW5jZWxsaW5nID8gJ0NhbmNlbGxpbmfigKYnIDogJ0NhbmNlbCBib29raW5nJ319XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1jYW5jZWxsZWQtbm90ZVwiICpuZ0lmPVwic2VsZWN0ZWQuc3RhdHVzID09PSAnQ0FOQ0VMTEVEJ1wiPlRoaXMgYm9va2luZyBoYXMgYmVlbiBjYW5jZWxsZWQuPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1iYWNrZHJvcFwiICpuZ0lmPVwicmVzY2hlZHVsZVBhbmVsT3BlblwiIChjbGljayk9XCJjbG9zZVJlc2NoZWR1bGVQYW5lbCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXBhbmVsXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtdGl0bGVcIj5DaG9vc2UgYSBuZXcgZGF0ZSAmYW1wOyB0aW1lPC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZGF5c3RyaXAtcm93XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1uYXZcIiAoY2xpY2spPVwic2Nyb2xsUmVzY2hEYXlzKC0xKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTE1IDE4bC02LTYgNi02XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1kYXlzdHJpcFwiICNyZXNjaERheVN0cmlwPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1kYXlcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIHJlc2NoRGF5c1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZGF5LmlzbyA9PT0gcmVzY2hTZWxlY3RlZElzb1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRheS5pc28gPT09IHJlc2NoU2VsZWN0ZWRJc28gPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6IG51bGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UmVzY2hEYXkoZGF5KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItcmVzY2gtZGF5LWRvd1wiIFtzdHlsZS5jb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gY29udHJhc3RDb2xvciA6IG51bGxcIj57e2RheS5kb3d9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1yZXNjaC1kYXktbnVtXCIgW3N0eWxlLmNvbG9yXT1cImRheS5pc28gPT09IHJlc2NoU2VsZWN0ZWRJc28gPyBjb250cmFzdENvbG9yIDogbnVsbFwiPnt7ZGF5Lm51bX19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1uYXZcIiAoY2xpY2spPVwic2Nyb2xsUmVzY2hEYXlzKDEpXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNOSAxOGw2LTYtNi02XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHMtbG9hZGluZ1wiICpuZ0lmPVwicmVzY2hMb2FkaW5nU2xvdHNcIj5Mb2FkaW5nIGF2YWlsYWJsZSB0aW1lc+KApjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHMtZW1wdHlcIiAqbmdJZj1cIiFyZXNjaExvYWRpbmdTbG90cyAmJiByZXNjaE5vU2xvdHNcIj5ObyBzbG90cyBhdmFpbGFibGUgb24gdGhpcyBkYXRlLiBUcnkgYW5vdGhlciBkYXRlLjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHNcIiAqbmdJZj1cIiFyZXNjaExvYWRpbmdTbG90cyAmJiByZXNjaFNsb3RzLmxlbmd0aFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1zbG90XCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbG90IG9mIHJlc2NoU2xvdHNcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZVwiXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IGNvbnRyYXN0Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSZXNjaFRpbWUoc2xvdClcIlxuICAgICAgICAgID57e3Nsb3R9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZXJyb3JcIiAqbmdJZj1cInJlc2NoRXJyb3JcIj57e3Jlc2NoRXJyb3J9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1jYW5jZWxcIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1jb25maXJtXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicmVzY2hJbnZhbGlkXCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJyZXNjaEludmFsaWQgPyBudWxsIDogc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInJlc2NoSW52YWxpZCA/IG51bGwgOiBjb250cmFzdENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwiY29uZmlybVJlc2NoZWR1bGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7e3Jlc2NoQ29uZmlybWluZyA/ICdDb25maXJtaW5n4oCmJyA6ICdDb25maXJtIG5ldyBzbG90J319XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
318
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktYm9va2luZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9teS1ib29raW5ncy9teS1ib29raW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL215LWJvb2tpbmdzL215LWJvb2tpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBNkI1Qzs7Ozs7R0FLRztBQVNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsWUFDbUIsV0FBd0IsRUFDeEIsY0FBcUMsRUFDckMsY0FBOEI7UUFGOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTJCakQsZUFBVSxHQUFzQixNQUFNLENBQUM7UUFDdkMsWUFBTyxHQUF3QixVQUFVLENBQUM7UUFDMUMsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFWCxnQkFBVyxHQUFpQixF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QUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLElBQUksQ0FBQyxRQUFRO2dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztZQUN0RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7UUFDakYsQ0FBQyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxJQUFJLCtCQUErQixFQUFFLENBQUMsQ0FBQztRQUNwSSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBMVNVLG1CQUFtQjttR0FBbkIsbUJBQW1CLDBGQUpuQixDQUFDLGNBQWMsQ0FBQyw2SUM3QzdCLHM1VEFtTUEscXVNRHZKWSxZQUFZLDZWQUFFLGFBQWEsbUxBQUUsV0FBVzs7NEZBS3ZDLG1CQUFtQjtrQkFSL0IsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsYUFDeEMsQ0FBQyxjQUFjLENBQUM7aUpBV2xCLElBQUk7c0JBQVosS0FBSztnQkFxQ3NCLGdCQUFnQjtzQkFBM0MsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3Quc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL2Vjb21tZXJjZS9zdHlsZXMvdXNlci5tb2RhbCc7XG5cbmludGVyZmFjZSBCb29raW5nUm93IHtcbiAgZ3JvdXBJZDogc3RyaW5nO1xuICBtb2RlOiAnU1RPUkVfVklTSVQnIHwgJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnO1xuICBib29raW5nRGF0ZTogc3RyaW5nO1xuICBzdGFydFRpbWU/OiBzdHJpbmc7XG4gIGVuZFRpbWU/OiBzdHJpbmc7XG4gIHN0YXR1czogJ1BFTkRJTkcnIHwgJ0JPT0tFRCcgfCAnSE9MRCcgfCAnT05HT0lORycgfCAnQ09NUExFVEVEJyB8ICdDQU5DRUxMRUQnO1xuICBzdG9yZU5hbWU/OiBzdHJpbmc7XG4gIGN1c3RvbWVyRGV0YWlsPzogeyBuYW1lOiBzdHJpbmc7IHBob25lTnVtYmVyOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfTtcbiAgYWRkcmVzc0RldGFpbHM/OiB7IHJlY2VpdmVyTmFtZTogc3RyaW5nOyByZWNlaXZlclBob25lOiBzdHJpbmc7IGFkZHJlc3NMaW5lMTogc3RyaW5nOyBhZGRyZXNzTGluZTI/OiBzdHJpbmc7IGNpdHk6IHN0cmluZzsgc3RhdGU6IHN0cmluZzsgemlwQ29kZTogc3RyaW5nIH07XG4gIHByb2R1Y3RMaW5lcz86IHsgaXRlbU5hbWU6IHN0cmluZzsgcXVhbnRpdHk6IG51bWJlciB9W107XG4gIC8qKiBOb3QgcGFydCBvZiB0aGUgR0VUIC9ib29raW5nL2dyb3VwL215IHJlc3BvbnNlIC0gc2VydmljZXMgbGl2ZSBvbiB0aGUgc2VwYXJhdGVcbiAgICogQm9va2luZ0RldGFpbCBjb2xsZWN0aW9uIChGSydkIHZpYSBzZXJ2aWNlTGluZUlkcywgbm90IGRlbm9ybWFsaXplZCBvbnRvIEJvb2tpbmdHcm91cCksIHNvXG4gICAqIHRoaXMgaXMgZmlsbGVkIGluIGNsaWVudC1zaWRlIGFmdGVyIGxvYWQoKSB2aWEgYSBwZXItcm93IEdFVCAuLi4vbGluZXMgY2FsbC4gKi9cbiAgc2VydmljZXM/OiB7IG5hbWU6IHN0cmluZzsgZHVyYXRpb25NaW51dGVzOiBudW1iZXI7IHByaWNlOiBudW1iZXIgfVtdO1xuICB2aWRlb0NhbGxMaW5rPzogc3RyaW5nO1xuICB0b3RhbENvbGxlY3RlZEF0Qm9va2luZz86IG51bWJlcjtcbiAgdG90YWxQYXlhYmxlPzogbnVtYmVyO1xuICBob21lVmlzaXRDaGFyZ2U/OiBudW1iZXI7XG4gIC8qKiBUcmFuc2llbnQsIGNvbXB1dGVkIG9uIGV2ZXJ5IGJhY2tlbmQgcmVhZCBvZiB0aGlzIGdyb3VwIC0gc2VlIEJvb2tpbmdHcm91cCNjYW5SZXNjaGVkdWxlLiAqL1xuICBjYW5SZXNjaGVkdWxlPzogYm9vbGVhbjtcbiAgcmVzY2hlZHVsZUJsb2NrZWRSZWFzb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogXCJNeSBCb29raW5nc1wiIC0gYSBjdXN0b21lcidzIG93biBib29raW5nIGhpc3RvcnkgKFVwY29taW5nL1Bhc3QpLCBhIGRldGFpbCB2aWV3IHBlciBib29raW5nLFxuICogYW5kIGNhbmNlbGxhdGlvbi4gVGhlIGxpc3QgZW5kcG9pbnQgcmV0dXJucyBmdWxsIEJvb2tpbmdHcm91cCByZWNvcmRzIC0gZW5vdWdoIGZvclxuICogZGF0ZS9zdGF0dXMvYWRkcmVzcy9wcm9kdWN0cyAtIGJ1dCBzZXJ2aWNlcyBib29rZWQgYXJlbid0IG9uIHRoYXQgcmVjb3JkIChzZWUgQm9va2luZ1Jvdy5zZXJ2aWNlc1xuICogYWJvdmUpLCBzbyBsb2FkKCkgaXNzdWVzIG9uZSBleHRyYSBHRVQgLi4uL2xpbmVzIGNhbGwgcGVyIHJvdyB0byBmaWxsIHRoZW0gaW4uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbXBvLW15LWJvb2tpbmdzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgVG9hc3RNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9teS1ib29raW5ncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9teS1ib29raW5ncy5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBNeUJvb2tpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICApIHsgfVxuXG4gIEBJbnB1dCgpIGRhdGE6IGFueTtcbiAgc3R5bGVzOiBhbnk7XG5cbiAgLyoqIFNhbWUgY29udHJhc3QgYWxnb3JpdGhtIGFzIENvbG9yRGlyZWN0aXZlIChkaXJlY3RpdmUvY29sb3IuZGlyZWN0aXZlLnRzKSAtIHJlaW1wbGVtZW50ZWQgYXNcbiAgICogYSBwdXJlIGdldHRlciByYXRoZXIgdGhhbiByZXVzaW5nIHRoYXQgZGlyZWN0aXZlIGRpcmVjdGx5LCBzaW5jZSBpdHMgW3NpbXBvQ29sb3JdIG9ubHkgZXZlclxuICAgKiAqc2V0cyogYSBjb21wdXRlZCBjb2xvciBhbmQgbmV2ZXIgY2xlYXJzIGl0LCB3aGljaCB3b3VsZCBsZWF2ZSBhIHN0YWxlIGNvbG9yIHN0dWNrIG9uIGFcbiAgICogY2hpcCBhZnRlciBpdCB0b2dnbGVzIGZyb20gYWN0aXZlIGJhY2sgdG8gaW5hY3RpdmUuIEV2ZXJ5IGFjY2VudC1jb2xvcmVkIGVsZW1lbnQgaGVyZSBpc1xuICAgKiBlaXRoZXIgYWx3YXlzLW9uIChuZXZlciB0b2dnbGVzKSBvciBkcml2ZW4gYnkgdGhpcyBzYW1lIGdldHRlciwgc28gdGhlcmUncyBleGFjdGx5IG9uZVxuICAgKiBkZWZpbml0aW9uIG9mIFwid2hhdCB0ZXh0IGNvbG9yIGdvZXMgb24gdGhlIGFjY2VudCBjb2xvclwiIGluIHRoaXMgZmlsZS4gKi9cbiAgZ2V0IGNvbnRyYXN0Q29sb3IoKTogc3RyaW5nIHtcbiAgICBsZXQgaGV4ID0gdGhpcy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yO1xuICAgIGlmICghaGV4KSByZXR1cm4gJyNmZmZmZmYnO1xuICAgIGlmIChoZXgubGVuZ3RoIDwgNikge1xuICAgICAgbGV0IGV4cGFuZGVkID0gJyMnO1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBoZXgubGVuZ3RoOyBpKyspIGV4cGFuZGVkICs9IGhleFtpXSArIGhleFtpXTtcbiAgICAgIGhleCA9IGV4cGFuZGVkO1xuICAgIH1cbiAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4LnNsaWNlKDEsIDMpLCAxNik7XG4gICAgY29uc3QgZyA9IHBhcnNlSW50KGhleC5zbGljZSgzLCA1KSwgMTYpO1xuICAgIGNvbnN0IGIgPSBwYXJzZUludChoZXguc2xpY2UoNSwgNyksIDE2KTtcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xuICAgIHJldHVybiBicmlnaHRuZXNzID4gMTMwID8gJyMwMDAwMDAnIDogJyNmZmZmZmYnO1xuICB9XG5cbiAgY3VycmVudFRhYjogJ0xJU1QnIHwgJ0RFVEFJTCcgPSAnTElTVCc7XG4gIHByb2ZUYWI6ICd1cGNvbWluZycgfCAncGFzdCcgPSAndXBjb21pbmcnO1xuICBsb2FkaW5nID0gdHJ1ZTtcbiAgY2FuY2VsbGluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgYWxsQm9va2luZ3M6IEJvb2tpbmdSb3dbXSA9IFtdO1xuICB1cGNvbWluZzogQm9va2luZ1Jvd1tdID0gW107XG4gIHBhc3Q6IEJvb2tpbmdSb3dbXSA9IFtdO1xuICBzZWxlY3RlZDogQm9va2luZ1JvdyB8IG51bGwgPSBudWxsO1xuICBjYW5jZWxsYXRpb25Qb2xpY3k6IHsgdGl0bGU6IHN0cmluZzsgcG9saWN5RGV0YWlsczogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgcmVzY2hlZHVsZUN1dG9mZkhvdXJzID0gMjQ7XG5cbiAgLy8gUmVzY2hlZHVsZSBwYW5lbCAtIGRhdGUgc3RyaXAgKyBzbG90IGdyaWQsIG1hdGNoaW5nIHRoZSBhZG1pbiBzaWRlJ3MgUmVzY2hlZHVsZUFwcG9pbnRtZW50Q29tcG9uZW50LlxuICBAVmlld0NoaWxkKCdyZXNjaERheVN0cmlwJykgcmVzY2hEYXlTdHJpcFJlZj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICByZXNjaGVkdWxlUGFuZWxPcGVuID0gZmFsc2U7XG4gIHJlc2NoRGF5czogeyBpc286IHN0cmluZzsgZG93OiBzdHJpbmc7IG51bTogc3RyaW5nIH1bXSA9IFtdO1xuICByZXNjaFNlbGVjdGVkSXNvID0gJyc7XG4gIHJlc2NoU2VsZWN0ZWRUaW1lID0gJyc7XG4gIHJlc2NoU2xvdHM6IHN0cmluZ1tdID0gW107XG4gIHJlc2NoTG9hZGluZ1Nsb3RzID0gZmFsc2U7XG4gIHJlc2NoQ29uZmlybWluZyA9IGZhbHNlO1xuICByZXNjaEVycm9yID0gJyc7XG4gIHJlc2NoTm9TbG90cyA9IGZhbHNlO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc3R5bGVzID0gdGhpcy5kYXRhPy5zdHlsZXM7XG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgYnVzaW5lc3NJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJykgPz8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JJZCcpID8/ICcnO1xuICAgIGNvbnN0IHVzZXJJZCA9ICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSBhcyBVc2VyKT8udXNlcklkID8/ICcnO1xuICAgIGlmICghYnVzaW5lc3NJZCB8fCAhdXNlcklkKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRNeUJvb2tpbmdzKGJ1c2luZXNzSWQsIHVzZXJJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5hbGxCb29raW5ncyA9IChyZXMgPz8gW10pIGFzIEJvb2tpbmdSb3dbXTtcbiAgICAgIHRoaXMuc3BsaXRCb29raW5ncygpO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmxvYWRTZXJ2aWNlTGluZXMoKTtcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0Q2FuY2VsbGF0aW9uUG9saWN5KGJ1c2luZXNzSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsbGF0aW9uUG9saWN5ID0gKHJlcyA/PyBbXSlbMF0gPz8gbnVsbDtcbiAgICB9LCAoKSA9PiB7XG4gICAgICAvLyBOb24tZmF0YWwgLSB0aGUgZGV0YWlsIHZpZXcganVzdCB3b24ndCBzaG93IGEgcG9saWN5IG5vdGUuXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEJ1c2luZXNzQXBwb2ludG1lbnRTZXR0aW5ncyhidXNpbmVzc0lkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlc2NoZWR1bGVDdXRvZmZIb3VycyA9IHJlcz8ucmVzY2hlZHVsZUN1dG9mZkhvdXJzID8/IDI0O1xuICAgIH0sICgpID0+IHtcbiAgICAgIC8vIE5vbi1mYXRhbCAtIGZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHQgY3V0b2ZmIHVzZWQgZm9yIGRpc3BsYXkgb25seTsgdGhlIGJhY2tlbmQgaXMgdGhlXG4gICAgICAvLyByZWFsIHNvdXJjZSBvZiB0cnV0aCBhbmQgZW5mb3JjZXMgaXRzIG93biBhY3R1YWwgY29uZmlndXJlZCB2YWx1ZSByZWdhcmRsZXNzLlxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1VwY29taW5nKGI6IEJvb2tpbmdSb3cpOiBib29sZWFuIHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIChiLnN0YXR1cyA9PT0gJ0hPTEQnIHx8IGIuc3RhdHVzID09PSAnQk9PS0VEJyB8fCBiLnN0YXR1cyA9PT0gJ1BFTkRJTkcnIHx8IGIuc3RhdHVzID09PSAnT05HT0lORycpICYmIG5ldyBEYXRlKGIuYm9va2luZ0RhdGUpID49IHRvZGF5O1xuICB9XG5cbiAgcHJpdmF0ZSBzcGxpdEJvb2tpbmdzKCkge1xuICAgIHRoaXMudXBjb21pbmcgPSB0aGlzLmFsbEJvb2tpbmdzLmZpbHRlcigoYikgPT4gdGhpcy5pc1VwY29taW5nKGIpKTtcbiAgICB0aGlzLnBhc3QgPSB0aGlzLmFsbEJvb2tpbmdzLmZpbHRlcigoYikgPT4gIXRoaXMuaXNVcGNvbWluZyhiKSk7XG4gIH1cblxuICAvKiogT25lIGJvb2tpbmcgaGlzdG9yeSBsb2FkLCBib3VuZGVkIHRvIHRoaXMgY3VzdG9tZXIncyBvd24gYm9va2luZ3MgLSBhIHBlci1yb3cgY2FsbCBoZXJlIGlzXG4gICAqIGZpbmUsIHVubGlrZSBhbiB1bmJvdW5kZWQvcGFnaW5hdGVkIGxpc3QuIEZhaWx1cmVzIGFyZSBzd2FsbG93ZWQgcGVyLXJvdyAoZmFsbHMgYmFjayB0byBub1xuICAgKiBzZXJ2aWNlIG5hbWVzIGZvciB0aGF0IHJvdykgcmF0aGVyIHRoYW4gYmxvY2tpbmcgdGhlIHdob2xlIHBhZ2Ugb24gb25lIGJhZCBncm91cC4gKi9cbiAgcHJpdmF0ZSBsb2FkU2VydmljZUxpbmVzKCkge1xuICAgIGlmICghdGhpcy5hbGxCb29raW5ncy5sZW5ndGgpIHJldHVybjtcbiAgICBmb3JrSm9pbihcbiAgICAgIHRoaXMuYWxsQm9va2luZ3MubWFwKChiKSA9PlxuICAgICAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEdyb3VwTGluZXMoYi5ncm91cElkKS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSlcbiAgICAgIClcbiAgICApLnN1YnNjcmliZSgoYWxsTGluZXM6IGFueVtdKSA9PiB7XG4gICAgICB0aGlzLmFsbEJvb2tpbmdzLmZvckVhY2goKGIsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBhbGxMaW5lc1tpXSA/PyBbXTtcbiAgICAgICAgYi5zZXJ2aWNlcyA9IGxpbmVzLmZsYXRNYXAoKGw6IGFueSkgPT4gKGwuc2VydmljZXMgPz8gW10pLm1hcCgoczogYW55KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHMubmFtZSwgZHVyYXRpb25NaW51dGVzOiBzLmR1cmF0aW9uTWludXRlcywgcHJpY2U6IHMucHJpY2VcbiAgICAgICAgfSkpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHJvd3MoKTogQm9va2luZ1Jvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9mVGFiID09PSAndXBjb21pbmcnID8gdGhpcy51cGNvbWluZyA6IHRoaXMucGFzdDtcbiAgfVxuICBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZyAmJiB0aGlzLnJvd3MubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgc2V0UHJvZlRhYih0YWI6ICd1cGNvbWluZycgfCAncGFzdCcpIHtcbiAgICB0aGlzLnByb2ZUYWIgPSB0YWI7XG4gIH1cblxuICBwcm9kdWN0TmFtZXMoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChiLnByb2R1Y3RMaW5lcyA/PyBbXSkubWFwKChwKSA9PiBwLml0ZW1OYW1lKS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcbiAgfVxuICBzZXJ2aWNlTmFtZXMoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIChiLnNlcnZpY2VzID8/IFtdKS5tYXAoKHMpID0+IHMubmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7XG4gIH1cbiAgdGl0bGUoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9kZUxhYmVsID0gYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgPyAnSG9tZSBWaXNpdCcgOiBiLm1vZGUgPT09ICdWSURFT19DQUxMJyA/ICdWaWRlbyBDYWxsJyA6ICdTdG9yZSBWaXNpdCc7XG4gICAgY29uc3QgaXRlbXMgPSBbdGhpcy5zZXJ2aWNlTmFtZXMoYiksIHRoaXMucHJvZHVjdE5hbWVzKGIpXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcbiAgICByZXR1cm4gaXRlbXMgPyBgJHttb2RlTGFiZWx9IMK3ICR7aXRlbXN9YCA6IG1vZGVMYWJlbDtcbiAgfVxuICB3aGVuKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShiLmJvb2tpbmdEYXRlKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUlOJywgeyB3ZWVrZGF5OiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIHllYXI6ICdudW1lcmljJyB9KTtcbiAgICByZXR1cm4gYi5zdGFydFRpbWUgPyBgJHtkYXRlfSDCtyAke2Iuc3RhcnRUaW1lfWAgOiBkYXRlO1xuICB9XG4gIGRldGFpbChiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICBpZiAoYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgJiYgYi5hZGRyZXNzRGV0YWlscykgcmV0dXJuIGAke2IuYWRkcmVzc0RldGFpbHMuY2l0eX0sICR7Yi5hZGRyZXNzRGV0YWlscy5zdGF0ZX1gO1xuICAgIGlmIChiLm1vZGUgPT09ICdTVE9SRV9WSVNJVCcgJiYgYi5zdG9yZU5hbWUpIHJldHVybiBiLnN0b3JlTmFtZTtcbiAgICByZXR1cm4gYi5jdXN0b21lckRldGFpbD8ubmFtZSA/PyAnJztcbiAgfVxuICBzdGF0dXNMYWJlbChzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiAnQ29tcGxldGVkJztcbiAgICBpZiAoc3RhdHVzID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuICdDYW5jZWxsZWQnO1xuICAgIGlmIChzdGF0dXMgPT09ICdIT0xEJyB8fCBzdGF0dXMgPT09ICdQRU5ESU5HJykgcmV0dXJuICdQYXltZW50IFBlbmRpbmcnO1xuICAgIGlmIChzdGF0dXMgPT09ICdPTkdPSU5HJykgcmV0dXJuICdJbiBQcm9ncmVzcyc7XG4gICAgcmV0dXJuICdDb25maXJtZWQnO1xuICB9XG4gIHN0YXR1c0NsYXNzKHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc3RhdHVzID09PSAnQ09NUExFVEVEJykgcmV0dXJuICdzdGF0dXMtY29tcGxldGVkJztcbiAgICBpZiAoc3RhdHVzID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuICdzdGF0dXMtY2FuY2VsbGVkJztcbiAgICBpZiAoc3RhdHVzID09PSAnSE9MRCcgfHwgc3RhdHVzID09PSAnUEVORElORycpIHJldHVybiAnc3RhdHVzLXBlbmRpbmcnO1xuICAgIGlmIChzdGF0dXMgPT09ICdPTkdPSU5HJykgcmV0dXJuICdzdGF0dXMtb25nb2luZyc7XG4gICAgcmV0dXJuICdzdGF0dXMtY29uZmlybWVkJztcbiAgfVxuICBwYWlkTGFiZWwoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGIudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmcgJiYgYi50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA+IDAgPyBg4oK5JHtiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nfWAgOiAnTm90aGluZyDigJQgZnJlZSc7XG4gIH1cbiAgc2VydmljZVByaWNlVG90YWwoYjogQm9va2luZ1Jvdyk6IG51bWJlciB7XG4gICAgcmV0dXJuIChiLnNlcnZpY2VzID8/IFtdKS5yZWR1Y2UoKHN1bSwgcykgPT4gc3VtICsgKHMucHJpY2UgfHwgMCksIDApO1xuICB9XG4gIHRvdGFsRHVlKGI6IEJvb2tpbmdSb3cpOiBudW1iZXIge1xuICAgIHJldHVybiAoYi50b3RhbFBheWFibGUgPz8gMCkgKyAoYi5ob21lVmlzaXRDaGFyZ2UgPz8gMCk7XG4gIH1cbiAgcGVuZGluZ0Ftb3VudChiOiBCb29raW5nUm93KTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy50b3RhbER1ZShiKSAtIChiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nID8/IDApKTtcbiAgfVxuICBnZXQgY2FuQ2FuY2VsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zZWxlY3RlZCAmJiAodGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdIT0xEJyB8fCB0aGlzLnNlbGVjdGVkLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdQRU5ESU5HJyk7XG4gIH1cbiAgZ2V0IGNhblJlc2NoZWR1bGVTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJyAmJiAhIXRoaXMuc2VsZWN0ZWQuY2FuUmVzY2hlZHVsZTtcbiAgfVxuXG4gIHZpZXdCb29raW5nRGV0YWlsKGI6IEJvb2tpbmdSb3cpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gYjtcbiAgICB0aGlzLmN1cnJlbnRUYWIgPSAnREVUQUlMJztcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgfVxuICBiYWNrVG9MaXN0KCkge1xuICAgIHRoaXMuY3VycmVudFRhYiA9ICdMSVNUJztcbiAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNjaGVkdWxlXG5cbiAgb3BlblJlc2NoZWR1bGVQYW5lbCgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQpIHJldHVybjtcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMucmVzY2hTZWxlY3RlZFRpbWUgPSAnJztcbiAgICB0aGlzLnJlc2NoRXJyb3IgPSAnJztcbiAgICB0aGlzLmJ1aWxkUmVzY2hEYXlTdHJpcCgpO1xuICAgIGlmICh0aGlzLnJlc2NoRGF5cy5sZW5ndGgpIHRoaXMuc2VsZWN0UmVzY2hEYXkodGhpcy5yZXNjaERheXNbMF0pO1xuICB9XG4gIGNsb3NlUmVzY2hlZHVsZVBhbmVsKCkge1xuICAgIHRoaXMucmVzY2hlZHVsZVBhbmVsT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlc2NoRGF5U3RyaXAoKSB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHRoaXMucmVzY2hEYXlzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpICsgaSk7XG4gICAgICB0aGlzLnJlc2NoRGF5cy5wdXNoKHtcbiAgICAgICAgaXNvOiBkLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGRvdzogZC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUlOJywgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pLFxuICAgICAgICBudW06IGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1JTicsIHsgZGF5OiAnbnVtZXJpYycgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogTW91c2UgdXNlcnMgaGF2ZSBubyBzd2lwZS90cmFja3BhZCBnZXN0dXJlIGZvciB0aGUgaG9yaXpvbnRhbGx5LXNjcm9sbGluZyBkYXkgc3RyaXAgLSBnaXZlXG4gICAqIHRoZW0gZXhwbGljaXQgcHJldi9uZXh0IGFycm93cyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gc2hpZnQrd2hlZWwgKG1hdGNoZXMgdGhlIGFkbWluIHNpZGUnc1xuICAgKiBSZXNjaGVkdWxlQXBwb2ludG1lbnRDb21wb25lbnQjc2Nyb2xsRGF5cykuICovXG4gIHNjcm9sbFJlc2NoRGF5cyhkaXJlY3Rpb246IG51bWJlcikge1xuICAgIGNvbnN0IGVsID0gdGhpcy5yZXNjaERheVN0cmlwUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC5zY3JvbGxCeSh7IGxlZnQ6IGRpcmVjdGlvbiAqIDE2MCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICB9XG5cbiAgc2VsZWN0UmVzY2hEYXkoZGF5OiB7IGlzbzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnJlc2NoU2VsZWN0ZWRJc28gPSBkYXkuaXNvO1xuICAgIHRoaXMucmVzY2hTZWxlY3RlZFRpbWUgPSAnJztcbiAgICB0aGlzLnJlc2NoRXJyb3IgPSAnJztcbiAgICB0aGlzLmZldGNoUmVzY2hTbG90cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFJlc2NoU2xvdHMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5yZXNjaExvYWRpbmdTbG90cyA9IHRydWU7XG4gICAgdGhpcy5yZXNjaE5vU2xvdHMgPSBmYWxzZTtcbiAgICB0aGlzLnJlc2NoU2xvdHMgPSBbXTtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFJlc2NoZWR1bGVTbG90cyh0aGlzLnNlbGVjdGVkLmdyb3VwSWQsIHRoaXMucmVzY2hTZWxlY3RlZElzbykuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXNjaExvYWRpbmdTbG90cyA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNjaFNsb3RzID0gcmVzID8/IFtdO1xuICAgICAgdGhpcy5yZXNjaE5vU2xvdHMgPSB0aGlzLnJlc2NoU2xvdHMubGVuZ3RoID09PSAwO1xuICAgIH0sICgpID0+IHtcbiAgICAgIHRoaXMucmVzY2hMb2FkaW5nU2xvdHMgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzY2hOb1Nsb3RzID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdFJlc2NoVGltZSh0aW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lID0gdGltZTtcbiAgfVxuXG4gIGdldCByZXNjaEludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnJlc2NoU2VsZWN0ZWRJc28gfHwgIXRoaXMucmVzY2hTZWxlY3RlZFRpbWUgfHwgdGhpcy5yZXNjaENvbmZpcm1pbmc7XG4gIH1cblxuICBjb25maXJtUmVzY2hlZHVsZSgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5yZXNjaEludmFsaWQpIHJldHVybjtcbiAgICB0aGlzLnJlc2NoQ29uZmlybWluZyA9IHRydWU7XG4gICAgdGhpcy5yZXNjaEVycm9yID0gJyc7XG4gICAgdGhpcy5yZXN0U2VydmljZS5yZXNjaGVkdWxlQm9va2luZyh0aGlzLnNlbGVjdGVkLmdyb3VwSWQsIHRoaXMucmVzY2hTZWxlY3RlZElzbywgdGhpcy5yZXNjaFNlbGVjdGVkVGltZSkuc3Vic2NyaWJlKChncm91cDogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlc2NoQ29uZmlybWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNjaGVkdWxlUGFuZWxPcGVuID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmJvb2tpbmdEYXRlID0gZ3JvdXA/LmJvb2tpbmdEYXRlID8/IHRoaXMucmVzY2hTZWxlY3RlZElzbztcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zdGFydFRpbWUgPSBncm91cD8uc3RhcnRUaW1lID8/IHRoaXMuc2VsZWN0ZWQuc3RhcnRUaW1lO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVuZFRpbWUgPSBncm91cD8uZW5kVGltZSA/PyB0aGlzLnNlbGVjdGVkLmVuZFRpbWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuY2FuUmVzY2hlZHVsZSA9IGdyb3VwPy5jYW5SZXNjaGVkdWxlID8/IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnJlc2NoZWR1bGVCbG9ja2VkUmVhc29uID0gZ3JvdXA/LnJlc2NoZWR1bGVCbG9ja2VkUmVhc29uID8/ICcnO1xuICAgICAgfVxuICAgICAgdGhpcy5zcGxpdEJvb2tpbmdzKCk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdCb29raW5nIHJlc2NoZWR1bGVkJyB9KTtcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXNjaENvbmZpcm1pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzY2hFcnJvciA9IGVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8uZXJyb3I/LmRldGFpbCB8fCAnVW5hYmxlIHRvIHJlc2NoZWR1bGUgdGhpcyBib29raW5nJztcbiAgICB9KTtcbiAgfVxuXG4gIGNhbmNlbEJvb2tpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkIHx8IHRoaXMuY2FuY2VsbGluZykgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsbGluZyA9IHRydWU7XG4gICAgdGhpcy5yZXN0U2VydmljZS5jYW5jZWxCb29raW5nR3JvdXAodGhpcy5zZWxlY3RlZC5ncm91cElkLCAnQ2FuY2VsbGVkIGJ5IGN1c3RvbWVyJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsbGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHRoaXMuc2VsZWN0ZWQuc3RhdHVzID0gJ0NBTkNFTExFRCc7XG4gICAgICB0aGlzLnNwbGl0Qm9va2luZ3MoKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ0Jvb2tpbmcgY2FuY2VsbGVkJyB9KTtcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycm9yPy5lcnJvcj8uZGV0YWlsID8/ICdDb3VsZCBub3QgY2FuY2VsIHRoaXMgYm9va2luZycgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCI+PC9wLXRvYXN0PlxuXG48ZGl2IGNsYXNzPVwibWItcm9vdFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFRhYiA9PT0gJ0xJU1QnXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1iLXRpdGxlXCI+TXkgQm9va2luZ3M8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYi10YWJzXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwicHJvZlRhYiA9PT0gJ3VwY29taW5nJ1wiIChjbGljayk9XCJzZXRQcm9mVGFiKCd1cGNvbWluZycpXCI+VXBjb21pbmc8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJwcm9mVGFiID09PSAncGFzdCdcIiAoY2xpY2spPVwic2V0UHJvZlRhYigncGFzdCcpXCI+UGFzdDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLWxvYWRpbmdcIiAqbmdJZj1cImxvYWRpbmdcIj5Mb2FkaW5nIHlvdXIgYm9va2luZ3PigKY8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYi1yb3dzXCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhaXNFbXB0eVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yb3dcIiAqbmdGb3I9XCJsZXQgYiBvZiByb3dzXCIgKGNsaWNrKT1cInZpZXdCb29raW5nRGV0YWlsKGIpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctc3RyaXBlXCIgW25nQ2xhc3NdPVwiYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgPyAnc3RyaXBlLWhvbWUnIDogYi5tb2RlID09PSAnVklERU9fQ0FMTCcgPyAnc3RyaXBlLXZpZGVvJyA6ICdzdHJpcGUtc3RvcmUnXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctaW5mb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctdG9wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LXRpdGxlXCI+e3t0aXRsZShiKX19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy13aGVuXCI+e3t3aGVuKGIpfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LWRldGFpbFwiPnt7ZGV0YWlsKGIpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctZW5kXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1zdGF0dXNcIiBbbmdDbGFzc109XCJzdGF0dXNDbGFzcyhiLnN0YXR1cylcIj57e3N0YXR1c0xhYmVsKGIuc3RhdHVzKX19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLWVtcHR5XCIgKm5nSWY9XCJpc0VtcHR5XCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYi1lbXB0eS1pY29uXCI+ZXZlbnRfYnVzeTwvbWF0LWljb24+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItZW1wdHktdGl0bGVcIj5ObyB7e3Byb2ZUYWJ9fSBib29raW5ncyB5ZXQuPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VGFiID09PSAnREVUQUlMJyAmJiBzZWxlY3RlZFwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItYmFja1wiIChjbGljayk9XCJiYWNrVG9MaXN0KClcIj5cbiAgICAgIDxtYXQtaWNvbj5hcnJvd19iYWNrPC9tYXQtaWNvbj4gQmFjayB0byBNeSBCb29raW5nc1xuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXRpdGxlLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdGl0bGVcIj57e3RpdGxlKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1zdGF0dXNcIiBbbmdDbGFzc109XCJzdGF0dXNDbGFzcyhzZWxlY3RlZC5zdGF0dXMpXCI+e3tzdGF0dXNMYWJlbChzZWxlY3RlZC5zdGF0dXMpfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXdoZW5cIj57e3doZW4oc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLnNlcnZpY2VzPy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7c2VydmljZU5hbWVzKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQucHJvZHVjdExpbmVzPy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Qcm9kdWN0czwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7cHJvZHVjdE5hbWVzKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuY3VzdG9tZXJEZXRhaWxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Db250YWN0PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8ubmFtZX19IMK3IHt7c2VsZWN0ZWQuY3VzdG9tZXJEZXRhaWw/LnBob25lTnVtYmVyfX0gwrcge3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8uZW1haWx9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLm1vZGUgPT09ICdIT01FX1ZJU0lUJyAmJiBzZWxlY3RlZC5hZGRyZXNzRGV0YWlsc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkFkZHJlc3M8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj57e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5hZGRyZXNzTGluZTF9fSwge3tzZWxlY3RlZC5hZGRyZXNzRGV0YWlscz8uY2l0eX19LCB7e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5zdGF0ZX19IHt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LnppcENvZGV9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlcnZpY2VQcmljZVRvdGFsKHNlbGVjdGVkKSA+IDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5TZXJ2aWNlIHByaWNlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3tzZXJ2aWNlUHJpY2VUb3RhbChzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLmhvbWVWaXNpdENoYXJnZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkhvbWUgdmlzaXQgY2hhcmdlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3tzZWxlY3RlZC5ob21lVmlzaXRDaGFyZ2V9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Ub3RhbDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPuKCuXt7dG90YWxEdWUoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+UGFpZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7cGFpZExhYmVsKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwicGVuZGluZ0Ftb3VudChzZWxlY3RlZCkgPiAwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+UGVuZGluZyBhdCBhcHBvaW50bWVudDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPuKCuXt7cGVuZGluZ0Ftb3VudChzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItdmlkZW8tbGlua1wiICpuZ0lmPVwic2VsZWN0ZWQubW9kZSA9PT0gJ1ZJREVPX0NBTEwnICYmIHNlbGVjdGVkLnZpZGVvQ2FsbExpbmsgJiYgc2VsZWN0ZWQuc3RhdHVzICE9PSAnQ0FOQ0VMTEVEJ1wiPlxuICAgICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPlxuICAgICAgICA8YSBbaHJlZl09XCJzZWxlY3RlZC52aWRlb0NhbGxMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3tzZWxlY3RlZC52aWRlb0NhbGxMaW5rfX08L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeVwiICpuZ0lmPVwiY2FuUmVzY2hlZHVsZVNlbGVjdGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGl0bGVcIj5SZXNjaGVkdWxlIHBvbGljeTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj5Zb3UgY2FuIHJlc2NoZWR1bGUgdGhpcyBib29raW5nIHVwIHRvIHt7cmVzY2hlZHVsZUN1dG9mZkhvdXJzfX0gaG91cnt7cmVzY2hlZHVsZUN1dG9mZkhvdXJzID09PSAxID8gJycgOiAncyd9fSBiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHRpbWUuPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3lcIiAqbmdJZj1cImNhbkNhbmNlbFNlbGVjdGVkICYmIGNhbmNlbGxhdGlvblBvbGljeVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRpdGxlXCI+e3tjYW5jZWxsYXRpb25Qb2xpY3kudGl0bGV9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj57e2NhbmNlbGxhdGlvblBvbGljeS5wb2xpY3lEZXRhaWxzfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItYWN0aW9ucy1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgY2FuQ2FuY2VsU2VsZWN0ZWRcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwibWItcmVzY2hlZHVsZS1idG5cIlxuICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJ1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5SZXNjaGVkdWxlU2VsZWN0ZWRcIlxuICAgICAgICAgIFt0aXRsZV09XCIhY2FuUmVzY2hlZHVsZVNlbGVjdGVkID8gc2VsZWN0ZWQucmVzY2hlZHVsZUJsb2NrZWRSZWFzb24gOiAnJ1wiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlblJlc2NoZWR1bGVQYW5lbCgpXCJcbiAgICAgICAgPlJlc2NoZWR1bGUgYm9va2luZzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1jYW5jZWwtYnRuXCJcbiAgICAgICAgICAqbmdJZj1cImNhbkNhbmNlbFNlbGVjdGVkXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiY2FuY2VsbGluZ1wiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsQm9va2luZygpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7Y2FuY2VsbGluZyA/ICdDYW5jZWxsaW5n4oCmJyA6ICdDYW5jZWwgYm9va2luZyd9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItY2FuY2VsbGVkLW5vdGVcIiAqbmdJZj1cInNlbGVjdGVkLnN0YXR1cyA9PT0gJ0NBTkNFTExFRCdcIj5UaGlzIGJvb2tpbmcgaGFzIGJlZW4gY2FuY2VsbGVkLjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYmFja2Ryb3BcIiAqbmdJZj1cInJlc2NoZWR1bGVQYW5lbE9wZW5cIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1wYW5lbFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXRpdGxlXCI+Q2hvb3NlIGEgbmV3IGRhdGUgJmFtcDsgdGltZTwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlUmVzY2hlZHVsZVBhbmVsKClcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWJvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWRheXN0cmlwLXJvd1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtbmF2XCIgKGNsaWNrKT1cInNjcm9sbFJlc2NoRGF5cygtMSlcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0xNSAxOGwtNi02IDYtNlwiPjwvcGF0aD48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZGF5c3RyaXBcIiAjcmVzY2hEYXlTdHJpcD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWItcmVzY2gtZGF5XCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiByZXNjaERheXNcIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImRheS5pc28gPT09IHJlc2NoU2VsZWN0ZWRJc29cIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6IG51bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF5LmlzbyA9PT0gcmVzY2hTZWxlY3RlZElzbyA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFJlc2NoRGF5KGRheSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLXJlc2NoLWRheS1kb3dcIiBbc3R5bGUuY29sb3JdPVwiZGF5LmlzbyA9PT0gcmVzY2hTZWxlY3RlZElzbyA/IGNvbnRyYXN0Q29sb3IgOiBudWxsXCI+e3tkYXkuZG93fX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItcmVzY2gtZGF5LW51bVwiIFtzdHlsZS5jb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gY29udHJhc3RDb2xvciA6IG51bGxcIj57e2RheS5udW19fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtbmF2XCIgKGNsaWNrKT1cInNjcm9sbFJlc2NoRGF5cygxKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTkgMThsNi02LTYtNlwiPjwvcGF0aD48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXNsb3RzLWxvYWRpbmdcIiAqbmdJZj1cInJlc2NoTG9hZGluZ1Nsb3RzXCI+TG9hZGluZyBhdmFpbGFibGUgdGltZXPigKY8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXNsb3RzLWVtcHR5XCIgKm5nSWY9XCIhcmVzY2hMb2FkaW5nU2xvdHMgJiYgcmVzY2hOb1Nsb3RzXCI+Tm8gc2xvdHMgYXZhaWxhYmxlIG9uIHRoaXMgZGF0ZS4gVHJ5IGFub3RoZXIgZGF0ZS48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXNsb3RzXCIgKm5nSWY9XCIhcmVzY2hMb2FkaW5nU2xvdHMgJiYgcmVzY2hTbG90cy5sZW5ndGhcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibWItcmVzY2gtc2xvdFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2xvdCBvZiByZXNjaFNsb3RzXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2xvdCA9PT0gcmVzY2hTZWxlY3RlZFRpbWVcIlxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2xvdCA9PT0gcmVzY2hTZWxlY3RlZFRpbWUgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogbnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwic2xvdCA9PT0gcmVzY2hTZWxlY3RlZFRpbWUgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogbnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2xvdCA9PT0gcmVzY2hTZWxlY3RlZFRpbWUgPyBjb250cmFzdENvbG9yIDogbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UmVzY2hUaW1lKHNsb3QpXCJcbiAgICAgICAgICA+e3tzbG90fX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWVycm9yXCIgKm5nSWY9XCJyZXNjaEVycm9yXCI+e3tyZXNjaEVycm9yfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZm9vdGVyXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2FuY2VsXCIgKGNsaWNrKT1cImNsb3NlUmVzY2hlZHVsZVBhbmVsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwibWItcmVzY2gtY29uZmlybVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInJlc2NoSW52YWxpZFwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwicmVzY2hJbnZhbGlkID8gbnVsbCA6IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJyZXNjaEludmFsaWQgPyBudWxsIDogY29udHJhc3RDb2xvclwiXG4gICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1SZXNjaGVkdWxlKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3tyZXNjaENvbmZpcm1pbmcgPyAnQ29uZmlybWluZ+KApicgOiAnQ29uZmlybSBuZXcgc2xvdCd9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19