@bimeister/pupakit.calendar
Version:
PupaKit Calendar
77 lines • 18.3 kB
JavaScript
import { CdkVirtualScrollViewport, VIRTUAL_SCROLL_STRATEGY } from '@angular/cdk/scrolling';
import { ChangeDetectionStrategy, Component, ViewChild, ViewEncapsulation } from '@angular/core';
import 'rxjs';
import { map } from 'rxjs/operators';
import { CalendarVirtualScrollStrategy } from '../../declarations/classes/calendar-virtual-scroll-strategy.class';
import { MONTHS_IN_YEAR } from '../../declarations/constants/months-in-year.const';
import '../../declarations/enums/day-of-week.enum';
import '../../declarations/enums/month-index.enum';
import '../../declarations/interfaces/calendar-month.interface';
import '../../declarations/interfaces/calendar-translation.interface';
import { CalendarConfigService } from '../../services/calendar-config.service';
import { CalendarManipulatorService } from '../../services/calendar-manipulator.service';
import { CalendarStateService } from '../../services/calendar-state.service';
import { CalendarTranslationService } from '../../services/calendar-translation.service';
import * as i0 from "@angular/core";
import * as i1 from "../../services/calendar-config.service";
import * as i2 from "../../services/calendar-translation.service";
import * as i3 from "../../services/calendar-manipulator.service";
import * as i4 from "../../services/calendar-state.service";
import * as i5 from "@angular/common";
import * as i6 from "@bimeister/pupakit.kit";
import * as i7 from "@bimeister/pupakit.common";
import * as i8 from "@angular/cdk/scrolling";
import * as i9 from "../calendar-label/calendar-label.component";
import * as i10 from "../calendar-month/calendar-month.component";
import * as i11 from "../../pipes/is-current-calendar-month.pipe";
import * as i12 from "../../pipes/next-calendar-month.pipe";
export function calendarVirtualScrollStrategyFactory({ virtualScrollConfig, }) {
return new CalendarVirtualScrollStrategy(virtualScrollConfig);
}
export class CalendarScrollerComponent {
constructor(calendarConfigService, calendarTranslationService, calendarManipulatorService, calendarStateService) {
this.calendarConfigService = calendarConfigService;
this.calendarTranslationService = calendarTranslationService;
this.calendarManipulatorService = calendarManipulatorService;
this.calendarStateService = calendarStateService;
this.calendarMonths = Array.from({ length: this.calendarConfigService.yearsRange * MONTHS_IN_YEAR }, (_, monthGlobalIndex) => this.getCalendarMonthByMonthGlobalIndex(monthGlobalIndex));
this.monthNameByIndex$ = this.calendarTranslationService.translation$.pipe(map((translation) => translation.months));
this.selectedDates$ = this.calendarStateService.selectedDates$;
this.startWeekday = this.calendarConfigService.startWeekday;
}
ngAfterViewInit() {
this.calendarManipulatorService.setVirtualScrollViewport(this.virtualScrollViewport);
this.calendarManipulatorService.resetScroll('auto');
}
addSelectedDate(date) {
this.calendarStateService.addSelectedDate(date);
}
getCalendarMonthByMonthGlobalIndex(index) {
return {
year: Math.floor(index / MONTHS_IN_YEAR) + this.calendarConfigService.startYear,
month: index % MONTHS_IN_YEAR,
};
}
}
CalendarScrollerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CalendarScrollerComponent, deps: [{ token: i1.CalendarConfigService }, { token: i2.CalendarTranslationService }, { token: i3.CalendarManipulatorService }, { token: i4.CalendarStateService }], target: i0.ɵɵFactoryTarget.Component });
CalendarScrollerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CalendarScrollerComponent, selector: "pupa-calendar-scroller", providers: [
{
provide: VIRTUAL_SCROLL_STRATEGY,
useFactory: calendarVirtualScrollStrategyFactory,
deps: [CalendarConfigService],
},
], viewQueries: [{ propertyName: "virtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], ngImport: i0, template: "<cdk-virtual-scroll-viewport\n pupaScrollableContent\n class=\"scroller\"\n *pupaLet=\"\n {\n monthNameByIndex: monthNameByIndex$ | async,\n selectedDates: selectedDates$ | async\n };\n let monthNameByIndex = monthNameByIndex;\n let selectedDates = selectedDates\n \"\n>\n <div class=\"scroller__item\" *cdkVirtualFor=\"let month of calendarMonths; templateCacheSize: 10; let isLast = last\">\n <pupa-calendar-month\n [calendarMonth]=\"month\"\n [isCurrent]=\"month | isCurrentCalendarMonth\"\n (selectDate)=\"addSelectedDate($event)\"\n [selectedDates]=\"selectedDates\"\n ></pupa-calendar-month>\n\n <ng-container *ngIf=\"!isLast\">\n <div class=\"scroller__divider\"></div>\n\n <pupa-calendar-label *pupaLet=\"month | nextCalendarMonth as nextMonth\">\n {{ nextMonth.year }} {{ monthNameByIndex[nextMonth.month] }}\n </pupa-calendar-label>\n\n <div class=\"scroller__divider\"></div>\n </ng-container>\n </div>\n</cdk-virtual-scroll-viewport>\n", styles: [":host{display:block;height:100%;width:100%;box-sizing:border-box;padding:4rem 0 0}.scroller{height:100%;width:100%;display:block;box-sizing:border-box}.scroller__item{display:block;box-sizing:border-box;width:100%;padding:0 4rem}.scroller__divider{display:block;width:100%;height:3rem}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ScrollableContentDirective, selector: "[pupaScrollableContent]" }, { kind: "directive", type: i7.LetDirective, selector: "[pupaLet]", inputs: ["pupaLet"] }, { kind: "directive", type: i8.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i8.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i9.CalendarLabelComponent, selector: "pupa-calendar-label" }, { kind: "component", type: i10.CalendarMonthComponent, selector: "pupa-calendar-month", inputs: ["calendarMonth", "isCurrent", "selectedDates"], outputs: ["selectDate"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i11.IsCurrentCalendarMonthPipe, name: "isCurrentCalendarMonth" }, { kind: "pipe", type: i12.NextCalendarMonthPipe, name: "nextCalendarMonth" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CalendarScrollerComponent, decorators: [{
type: Component,
args: [{ selector: 'pupa-calendar-scroller', encapsulation: ViewEncapsulation.Emulated, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
{
provide: VIRTUAL_SCROLL_STRATEGY,
useFactory: calendarVirtualScrollStrategyFactory,
deps: [CalendarConfigService],
},
], template: "<cdk-virtual-scroll-viewport\n pupaScrollableContent\n class=\"scroller\"\n *pupaLet=\"\n {\n monthNameByIndex: monthNameByIndex$ | async,\n selectedDates: selectedDates$ | async\n };\n let monthNameByIndex = monthNameByIndex;\n let selectedDates = selectedDates\n \"\n>\n <div class=\"scroller__item\" *cdkVirtualFor=\"let month of calendarMonths; templateCacheSize: 10; let isLast = last\">\n <pupa-calendar-month\n [calendarMonth]=\"month\"\n [isCurrent]=\"month | isCurrentCalendarMonth\"\n (selectDate)=\"addSelectedDate($event)\"\n [selectedDates]=\"selectedDates\"\n ></pupa-calendar-month>\n\n <ng-container *ngIf=\"!isLast\">\n <div class=\"scroller__divider\"></div>\n\n <pupa-calendar-label *pupaLet=\"month | nextCalendarMonth as nextMonth\">\n {{ nextMonth.year }} {{ monthNameByIndex[nextMonth.month] }}\n </pupa-calendar-label>\n\n <div class=\"scroller__divider\"></div>\n </ng-container>\n </div>\n</cdk-virtual-scroll-viewport>\n", styles: [":host{display:block;height:100%;width:100%;box-sizing:border-box;padding:4rem 0 0}.scroller{height:100%;width:100%;display:block;box-sizing:border-box}.scroller__item{display:block;box-sizing:border-box;width:100%;padding:0 4rem}.scroller__divider{display:block;width:100%;height:3rem}\n"] }]
}], ctorParameters: function () { return [{ type: i1.CalendarConfigService }, { type: i2.CalendarTranslationService }, { type: i3.CalendarManipulatorService }, { type: i4.CalendarStateService }]; }, propDecorators: { virtualScrollViewport: [{
type: ViewChild,
args: [CdkVirtualScrollViewport]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItc2Nyb2xsZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2FsZW5kYXItc2Nyb2xsZXIvY2FsZW5kYXItc2Nyb2xsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2FsZW5kYXItc2Nyb2xsZXIvY2FsZW5kYXItc2Nyb2xsZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0YsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQTJCLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbUVBQW1FLENBQUM7QUFDbEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ25GLE9BQTBCLDJDQUEyQyxDQUFDO0FBQ3RFLE9BQTJCLDJDQUEyQyxDQUFDO0FBQ3ZFLE9BQThCLHdEQUF3RCxDQUFDO0FBQ3ZGLE9BQW9DLDhEQUE4RCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQUV6RixNQUFNLFVBQVUsb0NBQW9DLENBQUMsRUFDbkQsbUJBQW1CLEdBQ0c7SUFDdEIsT0FBTyxJQUFJLDZCQUE2QixDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQWdCRCxNQUFNLE9BQU8seUJBQXlCO0lBZ0JwQyxZQUNtQixxQkFBNEMsRUFDNUMsMEJBQXNELEVBQ3RELDBCQUFzRCxFQUN0RCxvQkFBMEM7UUFIMUMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QywrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBQ3RELCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7UUFDdEQseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQWhCN0MsbUJBQWMsR0FBb0IsS0FBSyxDQUFDLElBQUksQ0FDMUQsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsR0FBRyxjQUFjLEVBQUUsRUFDbEUsQ0FBQyxDQUFVLEVBQUUsZ0JBQXdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUNwRyxDQUFDO1FBRWMsc0JBQWlCLEdBQy9CLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQWdDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRW5HLG1CQUFjLEdBQXVCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUM7UUFFOUUsaUJBQVksR0FBYyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDO0lBTy9FLENBQUM7SUFFRyxlQUFlO1FBQ3BCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsMEJBQTBCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTSxlQUFlLENBQUMsSUFBVTtRQUMvQixJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxrQ0FBa0MsQ0FBQyxLQUFhO1FBQ3RELE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVM7WUFDL0UsS0FBSyxFQUFFLEtBQUssR0FBRyxjQUFjO1NBQzlCLENBQUM7SUFDSixDQUFDOzt1SEFyQ1UseUJBQXlCOzJHQUF6Qix5QkFBeUIsaURBUnpCO1FBQ1Q7WUFDRSxPQUFPLEVBQUUsdUJBQXVCO1lBQ2hDLFVBQVUsRUFBRSxvQ0FBb0M7WUFDaEQsSUFBSSxFQUFFLENBQUMscUJBQXFCLENBQUM7U0FDOUI7S0FDRixpRkFHVSx3QkFBd0IsZ0RDcENyQyw0Z0NBK0JBOzRGRElhLHlCQUF5QjtrQkFkckMsU0FBUzsrQkFDRSx3QkFBd0IsaUJBR25CLGlCQUFpQixDQUFDLFFBQVEsbUJBQ3hCLHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLHVCQUF1Qjs0QkFDaEMsVUFBVSxFQUFFLG9DQUFvQzs0QkFDaEQsSUFBSSxFQUFFLENBQUMscUJBQXFCLENBQUM7eUJBQzlCO3FCQUNGO2lPQUlnQixxQkFBcUI7c0JBRHJDLFNBQVM7dUJBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9kZWNsYXJhdGlvbnMvY2xhc3Nlcy9jYWxlbmRhci12aXJ0dWFsLXNjcm9sbC1zdHJhdGVneS5jbGFzcyc7XG5pbXBvcnQgeyBNT05USFNfSU5fWUVBUiB9IGZyb20gJy4uLy4uL2RlY2xhcmF0aW9ucy9jb25zdGFudHMvbW9udGhzLWluLXllYXIuY29uc3QnO1xuaW1wb3J0IHsgRGF5T2ZXZWVrIH0gZnJvbSAnLi4vLi4vZGVjbGFyYXRpb25zL2VudW1zL2RheS1vZi13ZWVrLmVudW0nO1xuaW1wb3J0IHsgTW9udGhJbmRleCB9IGZyb20gJy4uLy4uL2RlY2xhcmF0aW9ucy9lbnVtcy9tb250aC1pbmRleC5lbnVtJztcbmltcG9ydCB7IENhbGVuZGFyTW9udGggfSBmcm9tICcuLi8uLi9kZWNsYXJhdGlvbnMvaW50ZXJmYWNlcy9jYWxlbmRhci1tb250aC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJUcmFuc2xhdGlvbiB9IGZyb20gJy4uLy4uL2RlY2xhcmF0aW9ucy9pbnRlcmZhY2VzL2NhbGVuZGFyLXRyYW5zbGF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDYWxlbmRhckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDYWxlbmRhck1hbmlwdWxhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NhbGVuZGFyLW1hbmlwdWxhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENhbGVuZGFyVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2FsZW5kYXItdHJhbnNsYXRpb24uc2VydmljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclZpcnR1YWxTY3JvbGxTdHJhdGVneUZhY3Rvcnkoe1xuICB2aXJ0dWFsU2Nyb2xsQ29uZmlnLFxufTogQ2FsZW5kYXJDb25maWdTZXJ2aWNlKTogQ2FsZW5kYXJWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kge1xuICByZXR1cm4gbmV3IENhbGVuZGFyVmlydHVhbFNjcm9sbFN0cmF0ZWd5KHZpcnR1YWxTY3JvbGxDb25maWcpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwdXBhLWNhbGVuZGFyLXNjcm9sbGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLXNjcm9sbGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItc2Nyb2xsZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWQsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSxcbiAgICAgIHVzZUZhY3Rvcnk6IGNhbGVuZGFyVmlydHVhbFNjcm9sbFN0cmF0ZWd5RmFjdG9yeSxcbiAgICAgIGRlcHM6IFtDYWxlbmRhckNvbmZpZ1NlcnZpY2VdLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyU2Nyb2xsZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgQFZpZXdDaGlsZChDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlydHVhbFNjcm9sbFZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhbGVuZGFyTW9udGhzOiBDYWxlbmRhck1vbnRoW10gPSBBcnJheS5mcm9tKFxuICAgIHsgbGVuZ3RoOiB0aGlzLmNhbGVuZGFyQ29uZmlnU2VydmljZS55ZWFyc1JhbmdlICogTU9OVEhTX0lOX1lFQVIgfSxcbiAgICAoXzogdW5rbm93biwgbW9udGhHbG9iYWxJbmRleDogbnVtYmVyKSA9PiB0aGlzLmdldENhbGVuZGFyTW9udGhCeU1vbnRoR2xvYmFsSW5kZXgobW9udGhHbG9iYWxJbmRleClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbW9udGhOYW1lQnlJbmRleCQ6IE9ic2VydmFibGU8UmVjb3JkPE1vbnRoSW5kZXgsIHN0cmluZz4+ID1cbiAgICB0aGlzLmNhbGVuZGFyVHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0aW9uJC5waXBlKG1hcCgodHJhbnNsYXRpb246IENhbGVuZGFyVHJhbnNsYXRpb24pID0+IHRyYW5zbGF0aW9uLm1vbnRocykpO1xuXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZERhdGVzJDogT2JzZXJ2YWJsZTxEYXRlW10+ID0gdGhpcy5jYWxlbmRhclN0YXRlU2VydmljZS5zZWxlY3RlZERhdGVzJDtcblxuICBwdWJsaWMgcmVhZG9ubHkgc3RhcnRXZWVrZGF5OiBEYXlPZldlZWsgPSB0aGlzLmNhbGVuZGFyQ29uZmlnU2VydmljZS5zdGFydFdlZWtkYXk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWxlbmRhckNvbmZpZ1NlcnZpY2U6IENhbGVuZGFyQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbGVuZGFyVHJhbnNsYXRpb25TZXJ2aWNlOiBDYWxlbmRhclRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbGVuZGFyTWFuaXB1bGF0b3JTZXJ2aWNlOiBDYWxlbmRhck1hbmlwdWxhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbGVuZGFyU3RhdGVTZXJ2aWNlOiBDYWxlbmRhclN0YXRlU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGVuZGFyTWFuaXB1bGF0b3JTZXJ2aWNlLnNldFZpcnR1YWxTY3JvbGxWaWV3cG9ydCh0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydCk7XG4gICAgdGhpcy5jYWxlbmRhck1hbmlwdWxhdG9yU2VydmljZS5yZXNldFNjcm9sbCgnYXV0bycpO1xuICB9XG5cbiAgcHVibGljIGFkZFNlbGVjdGVkRGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5jYWxlbmRhclN0YXRlU2VydmljZS5hZGRTZWxlY3RlZERhdGUoZGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldENhbGVuZGFyTW9udGhCeU1vbnRoR2xvYmFsSW5kZXgoaW5kZXg6IG51bWJlcik6IENhbGVuZGFyTW9udGgge1xuICAgIHJldHVybiB7XG4gICAgICB5ZWFyOiBNYXRoLmZsb29yKGluZGV4IC8gTU9OVEhTX0lOX1lFQVIpICsgdGhpcy5jYWxlbmRhckNvbmZpZ1NlcnZpY2Uuc3RhcnRZZWFyLFxuICAgICAgbW9udGg6IGluZGV4ICUgTU9OVEhTX0lOX1lFQVIsXG4gICAgfTtcbiAgfVxufVxuIiwiPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICBwdXBhU2Nyb2xsYWJsZUNvbnRlbnRcbiAgY2xhc3M9XCJzY3JvbGxlclwiXG4gICpwdXBhTGV0PVwiXG4gICAge1xuICAgICAgbW9udGhOYW1lQnlJbmRleDogbW9udGhOYW1lQnlJbmRleCQgfCBhc3luYyxcbiAgICAgIHNlbGVjdGVkRGF0ZXM6IHNlbGVjdGVkRGF0ZXMkIHwgYXN5bmNcbiAgICB9O1xuICAgIGxldCBtb250aE5hbWVCeUluZGV4ID0gbW9udGhOYW1lQnlJbmRleDtcbiAgICBsZXQgc2VsZWN0ZWREYXRlcyA9IHNlbGVjdGVkRGF0ZXNcbiAgXCJcbj5cbiAgPGRpdiBjbGFzcz1cInNjcm9sbGVyX19pdGVtXCIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgbW9udGggb2YgY2FsZW5kYXJNb250aHM7IHRlbXBsYXRlQ2FjaGVTaXplOiAxMDsgbGV0IGlzTGFzdCA9IGxhc3RcIj5cbiAgICA8cHVwYS1jYWxlbmRhci1tb250aFxuICAgICAgW2NhbGVuZGFyTW9udGhdPVwibW9udGhcIlxuICAgICAgW2lzQ3VycmVudF09XCJtb250aCB8IGlzQ3VycmVudENhbGVuZGFyTW9udGhcIlxuICAgICAgKHNlbGVjdERhdGUpPVwiYWRkU2VsZWN0ZWREYXRlKCRldmVudClcIlxuICAgICAgW3NlbGVjdGVkRGF0ZXNdPVwic2VsZWN0ZWREYXRlc1wiXG4gICAgPjwvcHVwYS1jYWxlbmRhci1tb250aD5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMYXN0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJfX2RpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgPHB1cGEtY2FsZW5kYXItbGFiZWwgKnB1cGFMZXQ9XCJtb250aCB8IG5leHRDYWxlbmRhck1vbnRoIGFzIG5leHRNb250aFwiPlxuICAgICAgICB7eyBuZXh0TW9udGgueWVhciB9fSB7eyBtb250aE5hbWVCeUluZGV4W25leHRNb250aC5tb250aF0gfX1cbiAgICAgIDwvcHVwYS1jYWxlbmRhci1sYWJlbD5cblxuICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyX19kaXZpZGVyXCI+PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4iXX0=