UNPKG

angular-schedule

Version:

A simple and light schedule package for angular.

910 lines (894 loc) 66.2 kB
/** * @fileoverview added by tsickle * Generated from: lib/scheduler.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChild, ElementRef, Input, Output, EventEmitter, ViewChildren, QueryList, ChangeDetectionStrategy, Inject, TemplateRef, ViewContainerRef, } from '@angular/core'; import { USER_OPTIONS } from './lib.config.token'; import { fromEvent } from 'rxjs'; import { Overlay } from '@angular/cdk/overlay'; import { TemplatePortal } from '@angular/cdk/portal'; import { take, filter } from 'rxjs/operators'; export class SchedulerComponent { /** * @param {?} libConfig * @param {?} elementRef * @param {?} overlay * @param {?} viewContainerRef */ constructor(libConfig, elementRef, overlay, viewContainerRef) { this.libConfig = libConfig; this.elementRef = elementRef; this.overlay = overlay; this.viewContainerRef = viewContainerRef; this.isSelecting = false; this.finishedSelecting = new EventEmitter(); this.editInfo = new EventEmitter(); this.excludedDay = new EventEmitter(); this.includedDay = new EventEmitter(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.showBy) { this.generateAllDates(); } } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ ngAfterViewInit() { this.scrollToToday(); } /** * @return {?} */ generateAllDates() { /** @type {?} */ const CURRENT_MONTH = new Date().getMonth(); /** @type {?} */ const CURRENT_YEAR = new Date().getFullYear(); /** @type {?} */ const MONTHS_IN_PAST = this.libConfig.monthsInPast || 4; /** @type {?} */ const MONTHS_IN_FUTURE = this.libConfig.monthsInFuture || 12; /** @type {?} */ let pastMonth = CURRENT_MONTH - MONTHS_IN_PAST < 0 ? CURRENT_MONTH - MONTHS_IN_PAST + 12 : CURRENT_MONTH - MONTHS_IN_PAST; /** @type {?} */ let pastYear = pastMonth >= 9 ? CURRENT_YEAR - 1 : CURRENT_YEAR; /** @type {?} */ const TO_DATE = this.calculateToDate(CURRENT_YEAR, CURRENT_MONTH, MONTHS_IN_FUTURE); /** @type {?} */ const DATEOBJ = []; while (pastYear <= TO_DATE.getFullYear()) { /** @type {?} */ const FRAME = pastYear === TO_DATE.getFullYear() ? TO_DATE.getMonth() : 11; if (this.showBy === 'day') { for (let index = pastMonth; index <= FRAME; index++) { DATEOBJ.push({ month: new Date(Date.UTC(pastYear, pastMonth, 1)), weekDays: this.generateDates(pastYear, pastMonth), }); pastMonth = pastMonth === 11 ? 0 : pastMonth + 1; } } else { DATEOBJ.push({ month: new Date(Date.UTC(pastYear, pastMonth, 1)), weekDays: this.generateMonths(pastYear, pastMonth, FRAME), }); for (let index = pastMonth; index <= FRAME; index++) { pastMonth = pastMonth === 11 ? 0 : pastMonth + 1; } } pastYear += 1; } this.days = DATEOBJ; } /** * @param {?} year * @param {?} month * @param {?} toMonths * @return {?} */ calculateToDate(year, month, toMonths) { /** @type {?} */ const NEW_MONTH = month + toMonths > 12 ? (month + toMonths) % 12 : month + toMonths; /** @type {?} */ const ADD_TO_YEAR = month + toMonths > 12 ? Math.floor((month + toMonths) / 12) : 0; return new Date(Date.UTC(year + ADD_TO_YEAR, NEW_MONTH, 1)); } /** * @param {?} year * @param {?} month * @return {?} */ generateDates(year, month) { /** @type {?} */ const DATEOBJ = new Date(Date.UTC(year, month, 1)); /** @type {?} */ const WEEKDAYS = []; while (DATEOBJ.getMonth() === month) { WEEKDAYS.push(new Date(DATEOBJ)); DATEOBJ.setDate(DATEOBJ.getDate() + 1); } return WEEKDAYS; } /** * @param {?} day * @return {?} */ excludeIncludeCheck(day) { return false; } /** * @param {?} start * @param {?} end * @param {?} current * @return {?} */ calculateFromTo(start, end, current) { /** @type {?} */ const FROM = new Date(start); /** @type {?} */ const TO = new Date(end); /** @type {?} */ const CHECK = new Date(current); /** @type {?} */ const SKIP_DAYS = this.libConfig.skipDays || [0, 6]; if (this.showBy === 'day') { return (CHECK >= FROM && CHECK <= TO && !SKIP_DAYS.includes(CHECK.getDay())); } return CHECK >= FROM && CHECK <= TO; } /** * @param {?} start * @param {?} end * @param {?} current * @return {?} */ isDayOff(start, end, current) { /** @type {?} */ const FROM = new Date(start); /** @type {?} */ const TO = new Date(end); /** @type {?} */ const CHECK = new Date(current); /** @type {?} */ const SKIP_DAYS = this.libConfig.skipDays || [0, 6]; return (CHECK >= FROM && CHECK <= TO && SKIP_DAYS.includes(CHECK.getDay()) && this.showBy !== 'month'); } /** * @param {?} ev * @return {?} */ enter(ev) { if (this.isSelecting) { if (ev.target.classList.contains('selected')) { ev.target.classList.remove('selected'); if (ev.target.parentNode.nextSibling.lastChild.classList.contains('selected')) { ev.target.parentNode.nextSibling.lastChild.classList.remove('selected'); } } else { ev.target.classList.add('selected'); if (!ev.target.parentNode.previousSibling.lastChild.classList.contains('selected')) { ev.target.parentNode.previousSibling.lastChild.classList.add('selected'); } } } } /** * @param {?} ev * @param {?} day * @param {?} user * @return {?} */ startSelect(ev, day, user) { // tslint:disable-next-line:curly if (ev.button !== 0) return; this.startUser = user; this.isSelecting = true; ev.target.classList.add('selected'); this.startDay = day; } /** * @param {?} ev * @param {?} endDay * @param {?} user * @return {?} */ endSelect(ev, endDay, user) { if (this.startUser !== user) { throw "Start and end row doesn't match! You might have started selecting in one row and ended up in another one."; } // tslint:disable-next-line:curly if (ev.button !== 0) return; ev.target.classList.add('selected'); this.isSelecting = false; this.selections.forEach((/** * @param {?} el * @return {?} */ (el) => el.nativeElement.classList.remove('selected'))); /** @type {?} */ const DATA = { endDay: ((/** @type {?} */ (endDay))).toISOString(), user, startDay: this.startDay.toISOString(), }; this.finishedSelecting.emit(DATA); } /** * @param {?} ev * @return {?} */ reCalc(ev) { if (this.isSelecting) { /** @type {?} */ const RECT = this.container.nativeElement.getBoundingClientRect(); /** @type {?} */ const X = ev.clientX - RECT.left; if (X > 1000) { this.container.nativeElement.scrollLeft += 40; } } } /** * @return {?} */ scrollToToday() { /** @type {?} */ const ELEM = (/** @type {?} */ (this.elementRef.nativeElement.querySelector('.bottomData__title.today'))); ELEM.scrollIntoView(); } /** * @param {?} year * @param {?} month * @param {?} toMonth * @return {?} */ generateMonths(year, month, toMonth) { /** @type {?} */ let counter = month; /** @type {?} */ let months = []; while (counter <= toMonth) { ((/** @type {?} */ (months))) = [...months, new Date(Date.UTC(year, counter, 1))]; counter++; } return months; } /** * @param {?} ev * @param {?} user * @param {?} project * @param {?} weekday * @return {?} */ open(ev, user, project, weekday) { if (this.showBy === 'day') { const { x, y } = ev; ev.preventDefault(); this.close(); /** @type {?} */ const positionStrategy = this.overlay .position() .flexibleConnectedTo({ x, y }) .withPositions([ { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', }, ]); this.overlayRef = this.overlay.create({ positionStrategy, scrollStrategy: this.overlay.scrollStrategies.close(), }); this.overlayRef.attach(new TemplatePortal(this.userMenu, this.viewContainerRef, { $implicit: { user, project, weekday }, })); this.sub = fromEvent(document, 'click') .pipe(filter((/** * @param {?} event * @return {?} */ (event) => { /** @type {?} */ const clickTarget = (/** @type {?} */ (event.target)); return (!!this.overlayRef && !this.overlayRef.overlayElement.contains(clickTarget)); })), take(1)) .subscribe((/** * @return {?} */ () => this.close())); } } /** * @return {?} */ close() { this.sub && this.sub.unsubscribe(); if (this.overlayRef) { this.overlayRef.dispose(); this.overlayRef = null; } } /** * @param {?} data * @return {?} */ excludeDay(data) { this.close(); this.excludedDay.emit(data); } /** * @param {?} data * @return {?} */ includeDay(data) { this.close(); this.includedDay.emit(data); } /** * @param {?} day * @return {?} */ isToday(day) { return new Date(day).toDateString() === new Date().toDateString(); } /** * @param {?} index * @param {?} el * @return {?} */ trackPersons(index, el) { return el.id; } /** * @param {?} index * @return {?} */ trackMonths(index) { return index; } /** * @param {?} index * @return {?} */ trackDays(index) { return index; } /** * @param {?} index * @param {?} el * @return {?} */ trackData(index, el) { return el.id; } } SchedulerComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-scheduler', template: ` <button *ngIf="libConfig?.showToday" class="scrollToToday" (click)="scrollToToday()" > {{ todayButtonLabel || 'Today' }} </button> <div class="table"> <div class="left"> <div class="spacer"></div> <div *ngFor="let person of persons; trackBy: trackPersons" [ngStyle]="{ height: person.data.length * 30 >= 60 ? (person?.data.length + 3) * 30 + 'px' : '100px' }" class="who" > <strong>{{ person?.name }}</strong> <br /> <small [innerText]="person?.departments || ''"></small> </div> </div> <div #container class="right"> <div class="header"> <div *ngFor="let day of days; trackBy: trackMonths" class="headerData" > <div class="topData"> <strong >{{ showBy === 'day' ? (day.month | date: 'MMM yyyy') : (day.month | date: 'yyyy') }} </strong> </div> <div class="bottomData"> <div class="bottomData__title" *ngFor="let weekday of day?.weekDays; trackBy: trackDays" [class.today]="isToday(weekday)" > <strong>{{ showBy === 'day' ? (weekday | date: 'dd EEE') : (weekday | date: 'MMMM') }}</strong> </div> </div> </div> </div> <div> <div class="pos-rel" *ngFor="let person of persons; let i = index; trackBy: trackPersons" > <div *ngFor="let day of days; trackBy: trackMonths" class="body"> <div class="bodyData" [ngStyle]="{ height: person?.data.length * 30 >= 60 ? (person?.data.length + 3) * 30 + 'px' : '100px', 'background-color': isToday(weekday) ? 'rgba(241, 229, 188, .5)' : '#fff' }" *ngFor="let weekday of day?.weekDays; trackBy: trackDays" > <label class="projectLabel" *ngFor="let project of person?.data; trackBy: trackData" > <span (contextmenu)="open($event, person.id, project, weekday)" [showTooltip]="libConfig?.showTooltip" [tooltip]="project?.description || ''" [placement]="placement" [delay]="delay" [ngStyle]="{ backgroundColor: project?.color }" *ngIf=" (calculateFromTo(project?.from, project?.to, weekday) && !project?.excludeDays.includes(weekday)) || project?.includeDays.includes(weekday) " (click)=" editInfo.emit({ person: person?.id, project: project }) " >{{ project?.name }} {{ project?.hours }}</span > <span (contextmenu)=" open($event, person.id, project, weekday); $event.preventDefault() " *ngIf=" (isDayOff(project?.from, project?.to, weekday) && !project?.includeDays.includes(weekday)) || project?.excludeDays.includes(weekday) " class="dayOff" > {{ dayOffLabel || 'Day off' }}</span > </label> <div #selectionDiv class="selectionDiv" (mousedown)="startSelect($event, weekday, person?.id)" (mouseenter)="enter($event)" (mousemove)="reCalc($event)" (mouseup)="endSelect($event, weekday, person?.id)" [ngStyle]="{ width: '100%', height: person.data.length * 30 >= 60 ? (person?.data.length + 3) * 30 - person?.data.length * 30 + 'px' : 100 - person?.data.length * 30 + 'px' }" ></div> </div> </div> </div> </div> </div> </div> <ng-template #userMenu let-data> <section class="user-menu"> <div *ngIf=" (calculateFromTo( data?.project?.from, data?.project?.to, data?.weekday ) && !data?.project?.excludeDays.includes(data?.weekday)) || data?.project?.includeDays.includes(data?.weekday) " (click)="excludeDay(data)" > Exclude day </div> <div *ngIf=" (isDayOff(data?.project?.from, data?.project?.to, data?.weekday) && !data?.project?.includeDays.includes(data?.weekday)) || data?.project?.excludeDays.includes(data?.weekday) " (click)="includeDay(data)" > Include day </div> </section> </ng-template> `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [` * { box-sizing: border-box; border-collapse: collapse; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .table { border: 1px solid #d5d5d5; background-color: #f5f5f5; border-spacing: 0; display: flex; } .table .spacer { width: 300px; height: 70px; border: 1px solid #d5d5d5; } .table .who { height: 100px; padding: 8px 16px; border: 1px solid #d5d5d5; background-color: #fff; } .table .who strong { font-size: 16px; color: #1a1a1a; } .table .right { overflow-x: auto; overflow-y: hidden; } .table .right .header { display: flex; } .table .right .header .topData { height: 40px; display: flex; align-items: center; justify-content: center; border-right: 1px solid #d5d5d5; border-left: 1px solid #d5d5d5; } .table .right .header .bottomData { height: 30px; display: flex; } .table .right .header .bottomData__title { font-size: 12px; font-weight: 600; color: #1a1a1a; border: 1px solid #d5d5d5; width: 100px; min-width: 100px; padding: 9px; text-align: left; } .pos-rel { display: flex; } .selected { background-color: #f7f9fa; border-bottom: 2px solid #dce2e6; border-top: 2px solid #dce2e6; border-left-color: transparent; border-right-color: transparent; } .selected:first-of-type { border-left-color: #dce2e6; } .body { display: flex; position: relative; } .bodyData { background-color: #fff; border: 1px solid #d5d5d5; height: 100px; width: 100px; min-width: 100px; } .projectLabel { position: relative; margin-bottom: 5px; display: block; height: 25px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .projectLabel span { color: #fff; width: 100%; display: block; padding: 5px; font-size: 12px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: relative; } .dayOff { background: #f2f0eb 0% 0% no-repeat padding-box; color: #27241d !important; } .today { background-color: rgba(241, 229, 188, 0.5); } .scrollToToday { background: #f2f0eb 0% 0% no-repeat padding-box; border-radius: 4px; border: 0; height: 36px; display: flex; align-items: center; justify-content: center; letter-spacing: 0px; color: #27241d; font-size: 14px; line-height: 21px; padding: 0 15px; margin-bottom: 10px; } .ng-tooltip { position: absolute; max-width: 150px; font-size: 14px; text-align: center; color: #f8f8f2; padding: 3px 8px; background: #282a36; border-radius: 4px; z-index: 1000; opacity: 0; } .ng-tooltip:after { content: ''; position: absolute; border-style: solid; } .ng-tooltip-top:after { top: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-color: black transparent transparent transparent; } .ng-tooltip-bottom:after { bottom: 100%; left: 50%; margin-left: -5px; border-width: 5px; border-color: transparent transparent black transparent; } .ng-tooltip-left:after { top: 50%; left: 100%; margin-top: -5px; border-width: 5px; border-color: transparent transparent transparent black; } .ng-tooltip-right:after { top: 50%; right: 100%; margin-top: -5px; border-width: 5px; border-color: transparent black transparent transparent; } .ng-tooltip-show { opacity: 1; } .my-menu { background-color: #fff; border: 1px solid rosybrown; padding: 20px; } .user-menu { background-color: #fafafa; padding: 4pt; font-size: 10pt; z-index: 1000; box-shadow: 0 0 12pt rgba(0, 0, 0, 0.25); border-radius: 4pt; padding: 0.5em 0 0.5em 0; animation: fadeIn 0.1s ease-out; opacity: 1; display: block; } .user-menu hr { border: none; border-bottom: 1px solid #eee; } .user-menu div { cursor: pointer; display: block; text-decoration: none; color: #333; padding: 0.5em 2em 0.5em 0.75em; max-width: 18em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .user-menu div:hover { background-color: #333; color: #fff; } .user-menu div::before { content: ''; float: left; margin-right: 0.75em; width: 0.5em; height: 1em; display: inline-block; } /* Animatinons */ @-webkit-keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @-webkit-keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } .is-fadingIn { -webkit-animation: fadeIn 0.1s ease-out; animation: fadeIn 0.1s ease-out; opacity: 1; display: block; } .is-fadingOut { -webkit-animation: fadeOut 0.1s ease-out; animation: fadeOut 0.1s ease-out; opacity: 0; display: block; } `] }] } ]; /** @nocollapse */ SchedulerComponent.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [USER_OPTIONS,] }] }, { type: ElementRef }, { type: Overlay }, { type: ViewContainerRef } ]; SchedulerComponent.propDecorators = { container: [{ type: ViewChild, args: ['container', { static: true },] }], userMenu: [{ type: ViewChild, args: ['userMenu', { static: true },] }], selections: [{ type: ViewChildren, args: ['selectionDiv',] }], persons: [{ type: Input }], showBy: [{ type: Input }], delay: [{ type: Input }], dayOffLabel: [{ type: Input }], todayButtonLabel: [{ type: Input }], placement: [{ type: Input }], finishedSelecting: [{ type: Output }], editInfo: [{ type: Output }], excludedDay: [{ type: Output }], includedDay: [{ type: Output }] }; if (false) { /** @type {?} */ SchedulerComponent.prototype.days; /** @type {?} */ SchedulerComponent.prototype.isSelecting; /** @type {?} */ SchedulerComponent.prototype.startDay; /** @type {?} */ SchedulerComponent.prototype.startUser; /** @type {?} */ SchedulerComponent.prototype.sub; /** @type {?} */ SchedulerComponent.prototype.overlayRef; /** @type {?} */ SchedulerComponent.prototype.container; /** @type {?} */ SchedulerComponent.prototype.userMenu; /** @type {?} */ SchedulerComponent.prototype.selections; /** @type {?} */ SchedulerComponent.prototype.persons; /** @type {?} */ SchedulerComponent.prototype.showBy; /** @type {?} */ SchedulerComponent.prototype.delay; /** @type {?} */ SchedulerComponent.prototype.dayOffLabel; /** @type {?} */ SchedulerComponent.prototype.todayButtonLabel; /** @type {?} */ SchedulerComponent.prototype.placement; /** @type {?} */ SchedulerComponent.prototype.finishedSelecting; /** @type {?} */ SchedulerComponent.prototype.editInfo; /** @type {?} */ SchedulerComponent.prototype.excludedDay; /** @type {?} */ SchedulerComponent.prototype.includedDay; /** @type {?} */ SchedulerComponent.prototype.libConfig; /** * @type {?} * @private */ SchedulerComponent.prototype.elementRef; /** @type {?} */ SchedulerComponent.prototype.overlay; /** @type {?} */ SchedulerComponent.prototype.viewContainerRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItc2NoZWR1bGUvIiwic291cmNlcyI6WyJsaWIvc2NoZWR1bGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULHVCQUF1QixFQUV2QixNQUFNLEVBR04sV0FBVyxFQUNYLGdCQUFnQixHQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBcWM5QyxNQUFNLE9BQU8sa0JBQWtCOzs7Ozs7O0lBcUI5QixZQUM4QixTQUFvQixFQUN6QyxVQUFzQixFQUN2QixPQUFnQixFQUNoQixnQkFBa0M7UUFIWixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3pDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdkIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBdkIxQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQWNWLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc1JDO2FBR0Y7Ozs7NENBdUJFLE1BQU0sU0FBQyxZQUFZO1lBN2VyQixVQUFVO1lBZ0JVLE9BQU87WUFKM0IsZ0JBQWdCOzs7d0JBa2RmLFNBQVMsU0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3VCQUN2QyxTQUFTLFNBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTt5QkFDdEMsWUFBWSxTQUFDLGNBQWM7c0JBQzNCLEtBQUs7cUJBQ0wsS0FBSztvQkFDTCxLQUFLOzBCQUNMLEtBQUs7K0JBQ0wsS0FBSzt3QkFDTCxLQUFLO2dDQUNMLE1BQU07dUJBQ04sTUFBTTswQkFDTixNQUFNOzBCQUNOLE1BQU07Ozs7SUFsQlAsa0NBQVk7O0lBQ1oseUNBQW9COztJQUNwQixzQ0FBZTs7SUFDZix1Q0FBa0I7O0lBQ2xCLGlDQUFrQjs7SUFDbEIsd0NBQThCOztJQUM5Qix1Q0FBZ0U7O0lBQ2hFLHNDQUFvRTs7SUFDcEUsd0NBQXlEOztJQUN6RCxxQ0FBMkI7O0lBQzNCLG9DQUFpQzs7SUFDakMsbUNBQXVCOztJQUN2Qix5Q0FBNkI7O0lBQzdCLDhDQUFrQzs7SUFDbEMsdUNBQXVDOztJQUN2QywrQ0FBaUQ7O0lBQ2pELHNDQUF3Qzs7SUFDeEMseUNBQTJDOztJQUMzQyx5Q0FBMkM7O0lBRzFDLHVDQUFpRDs7Ozs7SUFDakQsd0NBQThCOztJQUM5QixxQ0FBdUI7O0lBQ3ZCLDhDQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0T25Jbml0LFxuXHRWaWV3Q2hpbGQsXG5cdEVsZW1lbnRSZWYsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0Vmlld0NoaWxkcmVuLFxuXHRRdWVyeUxpc3QsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRBZnRlclZpZXdJbml0LFxuXHRJbmplY3QsXG5cdE9uQ2hhbmdlcyxcblx0U2ltcGxlQ2hhbmdlcyxcblx0VGVtcGxhdGVSZWYsXG5cdFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVVNFUl9PUFRJT05TIH0gZnJvbSAnLi9saWIuY29uZmlnLnRva2VuJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPdmVybGF5UmVmLCBPdmVybGF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IHRha2UsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERheSwgUGVyc29uLCBTaG93QnksIFBsYWNlbWVudCwgTGliQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd4LXNjaGVkdWxlcicsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGJ1dHRvblxuXHRcdFx0Km5nSWY9XCJsaWJDb25maWc/LnNob3dUb2RheVwiXG5cdFx0XHRjbGFzcz1cInNjcm9sbFRvVG9kYXlcIlxuXHRcdFx0KGNsaWNrKT1cInNjcm9sbFRvVG9kYXkoKVwiXG5cdFx0PlxuXHRcdFx0e3sgdG9kYXlCdXR0b25MYWJlbCB8fCAnVG9kYXknIH19XG5cdFx0PC9idXR0b24+XG5cdFx0PGRpdiBjbGFzcz1cInRhYmxlXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibGVmdFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XG5cdFx0XHRcdDxkaXZcblx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgcGVyc29uIG9mIHBlcnNvbnM7IHRyYWNrQnk6IHRyYWNrUGVyc29uc1wiXG5cdFx0XHRcdFx0W25nU3R5bGVdPVwie1xuXHRcdFx0XHRcdFx0aGVpZ2h0OlxuXHRcdFx0XHRcdFx0XHRwZXJzb24uZGF0YS5sZW5ndGggKiAzMCA+PSA2MFxuXHRcdFx0XHRcdFx0XHRcdD8gKHBlcnNvbj8uZGF0YS5sZW5ndGggKyAzKSAqIDMwICsgJ3B4J1xuXHRcdFx0XHRcdFx0XHRcdDogJzEwMHB4J1xuXHRcdFx0XHRcdH1cIlxuXHRcdFx0XHRcdGNsYXNzPVwid2hvXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxzdHJvbmc+e3sgcGVyc29uPy5uYW1lIH19PC9zdHJvbmc+XG5cdFx0XHRcdFx0PGJyIC8+XG5cdFx0XHRcdFx0PHNtYWxsIFtpbm5lclRleHRdPVwicGVyc29uPy5kZXBhcnRtZW50cyB8fCAnJ1wiPjwvc21hbGw+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2ICNjb250YWluZXIgY2xhc3M9XCJyaWdodFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG5cdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IGRheSBvZiBkYXlzOyB0cmFja0J5OiB0cmFja01vbnRoc1wiXG5cdFx0XHRcdFx0XHRjbGFzcz1cImhlYWRlckRhdGFcIlxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0b3BEYXRhXCI+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmdcblx0XHRcdFx0XHRcdFx0XHQ+e3tcblx0XHRcdFx0XHRcdFx0XHRcdHNob3dCeSA9PT0gJ2RheSdcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoZGF5Lm1vbnRoIHwgZGF0ZTogJ01NTSB5eXl5Jylcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiAoZGF5Lm1vbnRoIHwgZGF0ZTogJ3l5eXknKVxuXHRcdFx0XHRcdFx0XHRcdH19XG5cdFx0XHRcdFx0XHRcdDwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYm90dG9tRGF0YVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJib3R0b21EYXRhX190aXRsZVwiXG5cdFx0XHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHdlZWtkYXkgb2YgZGF5Py53ZWVrRGF5czsgdHJhY2tCeTogdHJhY2tEYXlzXCJcblx0XHRcdFx0XHRcdFx0XHRbY2xhc3MudG9kYXldPVwiaXNUb2RheSh3ZWVrZGF5KVwiXG5cdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHQ8c3Ryb25nPnt7XG5cdFx0XHRcdFx0XHRcdFx0XHRzaG93QnkgPT09ICdkYXknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gKHdlZWtkYXkgfCBkYXRlOiAnZGQgRUVFJylcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiAod2Vla2RheSB8IGRhdGU6ICdNTU1NJylcblx0XHRcdFx0XHRcdFx0XHR9fTwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRjbGFzcz1cInBvcy1yZWxcIlxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHBlcnNvbiBvZiBwZXJzb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja1BlcnNvbnNcIlxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzOyB0cmFja0J5OiB0cmFja01vbnRoc1wiIGNsYXNzPVwiYm9keVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJib2R5RGF0YVwiXG5cdFx0XHRcdFx0XHRcdFx0W25nU3R5bGVdPVwie1xuXHRcdFx0XHRcdFx0XHRcdFx0aGVpZ2h0OlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwZXJzb24/LmRhdGEubGVuZ3RoICogMzAgPj0gNjBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChwZXJzb24/LmRhdGEubGVuZ3RoICsgMykgKiAzMCArICdweCdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6ICcxMDBweCcsXG5cdFx0XHRcdFx0XHRcdFx0XHQnYmFja2dyb3VuZC1jb2xvcic6IGlzVG9kYXkod2Vla2RheSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAncmdiYSgyNDEsIDIyOSwgMTg4LCAuNSknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogJyNmZmYnXG5cdFx0XHRcdFx0XHRcdFx0fVwiXG5cdFx0XHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHdlZWtkYXkgb2YgZGF5Py53ZWVrRGF5czsgdHJhY2tCeTogdHJhY2tEYXlzXCJcblx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdDxsYWJlbFxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJwcm9qZWN0TGFiZWxcIlxuXHRcdFx0XHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHByb2plY3Qgb2YgcGVyc29uPy5kYXRhOyB0cmFja0J5OiB0cmFja0RhdGFcIlxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChjb250ZXh0bWVudSk9XCJvcGVuKCRldmVudCwgcGVyc29uLmlkLCBwcm9qZWN0LCB3ZWVrZGF5KVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtzaG93VG9vbHRpcF09XCJsaWJDb25maWc/LnNob3dUb29sdGlwXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W3Rvb2x0aXBdPVwicHJvamVjdD8uZGVzY3JpcHRpb24gfHwgJydcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbcGxhY2VtZW50XT1cInBsYWNlbWVudFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtkZWxheV09XCJkZWxheVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZENvbG9yOiBwcm9qZWN0Py5jb2xvciB9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Km5nSWY9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoY2FsY3VsYXRlRnJvbVRvKHByb2plY3Q/LmZyb20sIHByb2plY3Q/LnRvLCB3ZWVrZGF5KSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IXByb2plY3Q/LmV4Y2x1ZGVEYXlzLmluY2x1ZGVzKHdlZWtkYXkpKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2plY3Q/LmluY2x1ZGVEYXlzLmluY2x1ZGVzKHdlZWtkYXkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0SW5mby5lbWl0KHsgcGVyc29uOiBwZXJzb24/LmlkLCBwcm9qZWN0OiBwcm9qZWN0IH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD57eyBwcm9qZWN0Py5uYW1lIH19IHt7IHByb2plY3Q/LmhvdXJzIH19PC9zcGFuXG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChjb250ZXh0bWVudSk9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvcGVuKCRldmVudCwgcGVyc29uLmlkLCBwcm9qZWN0LCB3ZWVrZGF5KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkZXZlbnQucHJldmVudERlZmF1bHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQqbmdJZj1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdChpc0RheU9mZihwcm9qZWN0Py5mcm9tLCBwcm9qZWN0Py50bywgd2Vla2RheSkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCFwcm9qZWN0Py5pbmNsdWRlRGF5cy5pbmNsdWRlcyh3ZWVrZGF5KSkgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9qZWN0Py5leGNsdWRlRGF5cy5pbmNsdWRlcyh3ZWVrZGF5KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImRheU9mZlwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7IGRheU9mZkxhYmVsIHx8ICdEYXkgb2ZmJyB9fTwvc3BhblxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdDwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0I3NlbGVjdGlvbkRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJzZWxlY3Rpb25EaXZcIlxuXHRcdFx0XHRcdFx0XHRcdFx0KG1vdXNlZG93bik9XCJzdGFydFNlbGVjdCgkZXZlbnQsIHdlZWtkYXksIHBlcnNvbj8uaWQpXCJcblx0XHRcdFx0XHRcdFx0XHRcdChtb3VzZWVudGVyKT1cImVudGVyKCRldmVudClcIlxuXHRcdFx0XHRcdFx0XHRcdFx0KG1vdXNlbW92ZSk9XCJyZUNhbGMoJGV2ZW50KVwiXG5cdFx0XHRcdFx0XHRcdFx0XHQobW91c2V1cCk9XCJlbmRTZWxlY3QoJGV2ZW50LCB3ZWVrZGF5LCBwZXJzb24/LmlkKVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRbbmdTdHlsZV09XCJ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpZHRoOiAnMTAwJScsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhlaWdodDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwZXJzb24uZGF0YS5sZW5ndGggKiAzMCA+PSA2MFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAocGVyc29uPy5kYXRhLmxlbmd0aCArIDMpICogMzAgLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBwZXJzb24/LmRhdGEubGVuZ3RoICogMzAgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICAncHgnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IDEwMCAtIHBlcnNvbj8uZGF0YS5sZW5ndGggKiAzMCArICdweCdcblx0XHRcdFx0XHRcdFx0XHRcdH1cIlxuXHRcdFx0XHRcdFx0XHRcdD48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblxuXHRcdDxuZy10ZW1wbGF0ZSAjdXNlck1lbnUgbGV0LWRhdGE+XG5cdFx0XHQ8c2VjdGlvbiBjbGFzcz1cInVzZXItbWVudVwiPlxuXHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0Km5nSWY9XCJcblx0XHRcdFx0XHRcdChjYWxjdWxhdGVGcm9tVG8oXG5cdFx0XHRcdFx0XHRcdGRhdGE/LnByb2plY3Q/LmZyb20sXG5cdFx0XHRcdFx0XHRcdGRhdGE/LnByb2plY3Q/LnRvLFxuXHRcdFx0XHRcdFx0XHRkYXRhPy53ZWVrZGF5XG5cdFx0XHRcdFx0XHQpICYmXG5cdFx0XHRcdFx0XHRcdCFkYXRhPy5wcm9qZWN0Py5leGNsdWRlRGF5cy5pbmNsdWRlcyhkYXRhPy53ZWVrZGF5KSkgfHxcblx0XHRcdFx0XHRcdGRhdGE/LnByb2plY3Q/LmluY2x1ZGVEYXlzLmluY2x1ZGVzKGRhdGE/LndlZWtkYXkpXG5cdFx0XHRcdFx0XCJcblx0XHRcdFx0XHQoY2xpY2spPVwiZXhjbHVkZURheShkYXRhKVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHRFeGNsdWRlIGRheVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdCpuZ0lmPVwiXG5cdFx0XHRcdFx0XHQoaXNEYXlPZmYoZGF0YT8ucHJvamVjdD8uZnJvbSwgZGF0YT8ucHJvamVjdD8udG8sIGRhdGE/LndlZWtkYXkpICYmXG5cdFx0XHRcdFx0XHRcdCFkYXRhPy5wcm9qZWN0Py5pbmNsdWRlRGF5cy5pbmNsdWRlcyhkYXRhPy53ZWVrZGF5KSkgfHxcblx0XHRcdFx0XHRcdGRhdGE/LnByb2plY3Q/LmV4Y2x1ZGVEYXlzLmluY2x1ZGVzKGRhdGE/LndlZWtkYXkpXG5cdFx0XHRcdFx0XCJcblx0XHRcdFx0XHQoY2xpY2spPVwiaW5jbHVkZURheShkYXRhKVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHRJbmNsdWRlIGRheVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvc2VjdGlvbj5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXHRgLFxuXHRzdHlsZXM6IFtcblx0XHRgXG5cdFx0XHQqIHtcblx0XHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRcdFx0Ym9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcblx0XHRcdFx0LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0LW1vei11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0LW1zLXVzZXItc2VsZWN0OiBub25lO1xuXHRcdFx0XHR1c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdH1cblx0XHRcdC50YWJsZSB7XG5cdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG5cdFx0XHRcdGJvcmRlci1zcGFjaW5nOiAwO1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0fVxuXHRcdFx0LnRhYmxlIC5zcGFjZXIge1xuXHRcdFx0XHR3aWR0aDogMzAwcHg7XG5cdFx0XHRcdGhlaWdodDogNzBweDtcblx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgI2Q1ZDVkNTtcblx0XHRcdH1cblx0XHRcdC50YWJsZSAud2hvIHtcblx0XHRcdFx0aGVpZ2h0OiAxMDBweDtcblx0XHRcdFx0cGFkZGluZzogOHB4IDE2cHg7XG5cdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0XHR9XG5cdFx0XHQudGFibGUgLndobyBzdHJvbmcge1xuXHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdGNvbG9yOiAjMWExYTFhO1xuXHRcdFx0fVxuXG5cdFx0XHQudGFibGUgLnJpZ2h0IHtcblx0XHRcdFx0b3ZlcmZsb3cteDogYXV0bztcblx0XHRcdFx0b3ZlcmZsb3cteTogaGlkZGVuO1xuXHRcdFx0fVxuXHRcdFx0LnRhYmxlIC5yaWdodCAuaGVhZGVyIHtcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdH1cblx0XHRcdC50YWJsZSAucmlnaHQgLmhlYWRlciAudG9wRGF0YSB7XG5cdFx0XHRcdGhlaWdodDogNDBweDtcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdFx0XHRcdGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkNWQ1ZDU7XG5cdFx0XHRcdGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2Q1ZDVkNTtcblx0XHRcdH1cblx0XHRcdC50YWJsZSAucmlnaHQgLmhlYWRlciAuYm90dG9tRGF0YSB7XG5cdFx0XHRcdGhlaWdodDogMzBweDtcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdH1cblx0XHRcdC50YWJsZSAucmlnaHQgLmhlYWRlciAuYm90dG9tRGF0YV9fdGl0bGUge1xuXHRcdFx0XHRmb250LXNpemU6IDEycHg7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHRcdGNvbG9yOiAjMWExYTFhO1xuXHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1O1xuXHRcdFx0XHR3aWR0aDogMTAwcHg7XG5cdFx0XHRcdG1pbi13aWR0aDogMTAwcHg7XG5cdFx0XHRcdHBhZGRpbmc6IDlweDtcblx0XHRcdFx0dGV4dC1hbGlnbjogbGVmdDtcblx0XHRcdH1cblxuXHRcdFx0LnBvcy1yZWwge1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0fVxuXHRcdFx0LnNlbGVjdGVkIHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2Y3ZjlmYTtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNkY2UyZTY7XG5cdFx0XHRcdGJvcmRlci10b3A6IDJweCBzb2xpZCAjZGNlMmU2O1xuXHRcdFx0XHRib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0XHRcdGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0XHR9XG5cdFx0XHQuc2VsZWN0ZWQ6Zmlyc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdGJvcmRlci1sZWZ0LWNvbG9yOiAjZGNlMmU2O1xuXHRcdFx0fVxuXHRcdFx0LmJvZHkge1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHR9XG5cdFx0XHQuYm9keURhdGEge1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1O1xuXHRcdFx0XHRoZWlnaHQ6IDEwMHB4O1xuXHRcdFx0XHR3aWR0aDogMTAwcHg7XG5cdFx0XHRcdG1pbi13aWR0aDogMTAwcHg7XG5cdFx0XHR9XG5cdFx0XHQucHJvamVjdExhYmVsIHtcblx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiA1cHg7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRoZWlnaHQ6IDI1cHg7XG5cdFx0XHRcdC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG5cdFx0XHRcdC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG5cdFx0XHRcdC1tcy11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0dXNlci1zZWxlY3Q6IG5vbmU7XG5cdFx0XHR9XG5cdFx0XHQucHJvamVjdExhYmVsIHNwYW4ge1xuXHRcdFx0XHRjb2xvcjogI2ZmZjtcblx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRwYWRkaW5nOiA1cHg7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMTJweDtcblx0XHRcdFx0LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0LW1vei11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0LW1zLXVzZXItc2VsZWN0OiBub25lO1xuXHRcdFx0XHR1c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0fVxuXHRcdFx0LmRheU9mZiB7XG5cdFx0XHRcdGJhY2tncm91bmQ6ICNmMmYwZWIgMCUgMCUgbm8tcmVwZWF0IHBhZGRpbmctYm94O1xuXHRcdFx0XHRjb2xvcjogIzI3MjQxZCAhaW1wb3J0YW50O1xuXHRcdFx0fVxuXHRcdFx0LnRvZGF5IHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDEsIDIyOSwgMTg4LCAwLjUpO1xuXHRcdFx0fVxuXHRcdFx0LnNjcm9sbFRvVG9kYXkge1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiAjZjJmMGViIDAlIDAlIG5vLXJlcGVhdCBwYWRkaW5nLWJveDtcblx0XHRcdFx0Ym9yZGVyLXJhZGl1czogNHB4O1xuXHRcdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRcdGhlaWdodDogMzZweDtcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdFx0YWxpZ24taXRlbXM6I