@taiga-ui/kit
Version:
Taiga UI Angular main components kit
186 lines • 42.8 kB
JavaScript
import { __decorate } from "tslib";
import { NgIf } from '@angular/common';
import { ChangeDetectionStrategy, Component, computed, EventEmitter, inject, Input, Output, signal, } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { TUI_FALSE_HANDLER } from '@taiga-ui/cdk/constants';
import { TUI_FIRST_DAY, TUI_LAST_DAY, TuiDay, TuiMonth, TuiMonthRange, TuiYear, } from '@taiga-ui/cdk/date-time';
import { TuiHovered } from '@taiga-ui/cdk/directives/hovered';
import { TuiLet } from '@taiga-ui/cdk/directives/let';
import { TuiRepeatTimes } from '@taiga-ui/cdk/directives/repeat-times';
import { tuiNullableSame, tuiPure } from '@taiga-ui/cdk/utils/miscellaneous';
import { TuiCalendarYear } from '@taiga-ui/core/components/calendar';
import { TuiLink } from '@taiga-ui/core/components/link';
import { TuiScrollbar } from '@taiga-ui/core/components/scrollbar';
import { TuiSpinButton } from '@taiga-ui/core/components/spin-button';
import { tuiAsAuxiliary } from '@taiga-ui/core/tokens';
import { TUI_CALENDAR_MONTHS } from '@taiga-ui/kit/tokens';
import { TUI_CALENDAR_MONTH_OPTIONS } from './calendar-month.options';
import * as i0 from "@angular/core";
const TODAY = TuiDay.currentLocal();
class TuiCalendarMonth {
constructor() {
this.isYearPickerShown = false;
this.months = toSignal(inject(TUI_CALENDAR_MONTHS));
this.isRangePicking = computed((x = this.value()) => (!this.options.rangeMode && x instanceof TuiMonthRange && x.isSingleMonth) || // TODO(v5): remove this condition
(this.options.rangeMode && x instanceof TuiMonth));
this.year = TODAY;
this.disabledItemHandler = TUI_FALSE_HANDLER;
this.minLength = null;
this.maxLength = null;
this.monthClick = new EventEmitter();
this.hoveredItemChange = new EventEmitter();
this.yearChange = new EventEmitter();
this.options = inject(TUI_CALENDAR_MONTH_OPTIONS);
this.min = signal(TUI_FIRST_DAY);
this.max = signal(TUI_LAST_DAY);
this.value = signal(null);
this.hoveredItem = null;
}
// TODO(v5): use signal inputs
set minSetter(x) {
this.min.set(x);
}
// TODO(v5): use signal inputs
set maxSetter(x) {
this.max.set(x);
}
// TODO(v5): use signal inputs
set valueSetter(x) {
this.value.set(x);
}
onNextYear() {
this.updateActiveYear(this.year.append({ year: 1 }));
}
onPreviousYear() {
this.updateActiveYear(this.year.append({ year: -1 }));
}
getItemRange(item) {
const value = this.value();
const { hoveredItem } = this;
if (!value) {
return null;
}
if (!this.options.rangeMode && value instanceof TuiMonth) {
return value?.monthSame(item) ? 'active' : null;
}
const selectedRange = value instanceof TuiMonth ? new TuiMonthRange(value, value) : value;
const months = item.month + item.year * 12;
const hovered = hoveredItem ? hoveredItem.month + hoveredItem.year * 12 : null;
const from = selectedRange.from.month + selectedRange.from.year * 12;
const to = selectedRange.to.month + selectedRange.to.year * 12;
const picking = this.isRangePicking() ? hovered : null;
const min = Math.min(from, to, picking ?? from);
const max = Math.max(from, to, picking ?? from);
if (min === max && min === months) {
return 'active';
}
if (min === months) {
return 'start';
}
if (max === months) {
return 'end';
}
return min < months && months < max ? 'middle' : null;
}
get disabledItemHandlerWithMinMax() {
return this.calculateDisabledItemHandlerWithMinMax(this.disabledItemHandler, this.value(), this.isRangePicking(), this.min(), this.max(), this.minLength, this.maxLength);
}
getTuiMonth(monthNumber, yearNumber) {
return new TuiMonth(yearNumber, monthNumber);
}
isItemToday(item) {
return TODAY.monthSame(item);
}
onPickerYearClick(year) {
this.isYearPickerShown = false;
if (this.year.year !== year) {
this.updateActiveYear(new TuiYear(year));
}
}
onItemClick(month) {
if (!this.disabledItemHandlerWithMinMax(month)) {
this.monthClick.emit(month);
}
}
onYearClick() {
this.isYearPickerShown = true;
}
onItemHovered(hovered, item) {
this.updateHoveredItem(hovered ? item : null);
}
// eslint-disable-next-line @typescript-eslint/max-params,max-params
calculateDisabledItemHandlerWithMinMax(disabledItemHandler, value, isRangePicking, min, max, minLength, maxLength) {
return (item) => {
const selectedMonth = value instanceof TuiMonthRange ? value.from : value;
const delta = isRangePicking && selectedMonth
? Math.abs(item.year * 12 +
item.month -
selectedMonth.year * 12 -
selectedMonth.month)
: 0;
const tooLong = delta && maxLength && delta > maxLength;
const tooShort = delta && minLength && delta < minLength;
return (tooLong ||
tooShort ||
item.monthBefore(min) ||
item.monthAfter(max) ||
disabledItemHandler(item));
};
}
updateHoveredItem(month) {
if (tuiNullableSame(this.hoveredItem, month, (a, b) => a.monthSame(b))) {
return;
}
this.hoveredItem = month;
this.hoveredItemChange.emit(month);
}
updateActiveYear(year) {
this.year = year;
this.yearChange.emit(year);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCalendarMonth, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: TuiCalendarMonth, isStandalone: true, selector: "tui-calendar-month", inputs: { year: "year", disabledItemHandler: "disabledItemHandler", minLength: "minLength", maxLength: "maxLength", minSetter: ["min", "minSetter", (x) => x ?? TUI_FIRST_DAY], maxSetter: ["max", "maxSetter", (x) => x ?? TUI_LAST_DAY], valueSetter: ["value", "valueSetter"] }, outputs: { monthClick: "monthClick", hoveredItemChange: "hoveredItemChange", yearChange: "yearChange" }, host: { properties: { "class._picking": "isRangePicking()" } }, providers: [tuiAsAuxiliary(TuiCalendarMonth)], ngImport: i0, template: "<tui-scrollbar\n *ngIf=\"isYearPickerShown; else monthSelect\"\n class=\"t-scrollbar\"\n>\n <tui-calendar-year\n [initialItem]=\"year.year\"\n [max]=\"max().year\"\n [min]=\"min().year\"\n [rangeMode]=\"options.rangeMode\"\n [value]=\"value()\"\n (yearClick)=\"onPickerYearClick($event)\"\n />\n</tui-scrollbar>\n<ng-template #monthSelect>\n <tui-spin-button\n class=\"t-spin\"\n [focusable]=\"false\"\n [leftDisabled]=\"year.yearSameOrBefore(min())\"\n [rightDisabled]=\"year.yearSameOrAfter(max())\"\n (leftClick)=\"onPreviousYear()\"\n (rightClick)=\"onNextYear()\"\n >\n <button\n automation-id=\"tui-calendar-month__active-year\"\n tabIndex=\"-1\"\n tuiLink\n type=\"button\"\n (click)=\"onYearClick()\"\n >\n {{ year.formattedYear }}\n </button>\n </tui-spin-button>\n <div\n *tuiRepeatTimes=\"let row of 3\"\n class=\"t-row\"\n >\n <ng-container *tuiRepeatTimes=\"let column of 4\">\n <div\n *tuiLet=\"getTuiMonth(row * 4 + column, year.year) as item\"\n class=\"t-cell\"\n [attr.data-range]=\"getItemRange(item)\"\n [class.t-cell_disabled]=\"disabledItemHandlerWithMinMax(item)\"\n [class.t-cell_today]=\"isItemToday(item)\"\n (click)=\"onItemClick(item)\"\n (tuiHoveredChange)=\"onItemHovered($event, item)\"\n >\n {{ months()?.[row * 4 + column] }}\n </div>\n </ng-container>\n </div>\n</ng-template>\n", styles: [".t-row{display:flex;justify-content:flex-start;font:var(--tui-font-text-m)}.t-row:first-child{justify-content:flex-end}.t-row:last-child{justify-content:flex-start}.t-cell{position:relative;display:flex;align-items:center;justify-content:center;line-height:2rem;isolation:isolate;cursor:pointer;overflow:hidden;border:.125rem solid transparent;box-sizing:border-box;-webkit-mask:linear-gradient(transparent calc(50% - 1rem),#000 calc(50% - 1rem),#000 calc(50% + 1rem),transparent calc(50% + 1rem));mask:linear-gradient(transparent calc(50% - 1rem),#000 calc(50% - 1rem),#000 calc(50% + 1rem),transparent calc(50% + 1rem))}.t-cell:first-child{border-inline-start-color:transparent!important}.t-cell:last-child{border-inline-end-color:transparent!important}.t-cell:before,.t-cell:after{position:absolute;top:0;left:0;bottom:0;right:0;content:\"\";z-index:-1;border-radius:var(--tui-radius-m)}.t-cell:after{-webkit-mask:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 32\"><path d=\"M0.2856 0L0.6763 0C2.9265 0 4.9876 1.259 6.0147 3.2611L10.2442 11.5048C11.5301 14.0113 11.5683 16.9754 10.3472 19.5141L5.9766 28.6007C4.9772 30.6786 2.8754 32 0.5696 32H0.285645V0Z\"></path></svg>') right / .75rem 100% no-repeat,linear-gradient(#000,#000) left / calc(100% - .7rem) 100% no-repeat;mask:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 32\"><path d=\"M0.2856 0L0.6763 0C2.9265 0 4.9876 1.259 6.0147 3.2611L10.2442 11.5048C11.5301 14.0113 11.5683 16.9754 10.3472 19.5141L5.9766 28.6007C4.9772 30.6786 2.8754 32 0.5696 32H0.285645V0Z\"></path></svg>') right / .75rem 100% no-repeat,linear-gradient(#000,#000) left / calc(100% - .7rem) 100% no-repeat}.t-cell[data-range]:before{background:var(--tui-background-neutral-1)}:host._picking .t-cell[data-range]:before{background:var(--tui-background-neutral-1-hover)}.t-cell[data-range=middle]{border-color:var(--tui-background-neutral-1)}:host._picking .t-cell[data-range=middle]{border-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=middle]:not(:first-child):before{border-top-left-radius:0;border-bottom-left-radius:0}.t-cell[data-range=middle]:not(:last-child):before{border-top-right-radius:0;border-bottom-right-radius:0}.t-cell[data-range=start]{border-inline-end-color:var(--tui-background-neutral-1);color:var(--tui-text-primary-on-accent-1)}:host._picking .t-cell[data-range=start]{border-inline-end-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=start]:not(:last-child):before{right:-1rem}.t-cell[data-range=start]:after{background:var(--tui-background-accent-1)}.t-cell[data-range=end]{border-inline-start-color:var(--tui-background-neutral-1);color:var(--tui-text-primary-on-accent-1)}:host._picking .t-cell[data-range=end]{border-inline-start-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=end]:not(:first-child):before{left:-1rem}.t-cell[data-range=end]:after{background:var(--tui-background-accent-1);transform:scaleX(-1)}.t-cell[data-range=active]{color:var(--tui-text-primary-on-accent-1)}.t-cell[data-range=active]:after{background:var(--tui-background-accent-1);-webkit-mask:none;mask:none}.t-cell_disabled{opacity:var(--tui-disabled-opacity);pointer-events:none}.t-cell_today{text-decoration:underline;text-underline-offset:.25rem}@media (hover: hover) and (pointer: fine){.t-cell:hover:not([data-range=start]):not([data-range=end]):before{background:var(--tui-background-neutral-1-hover)}.t-cell[data-range=start]:hover:after,.t-cell[data-range=end]:hover:after,.t-cell[data-range=active]:hover:after{background:var(--tui-background-accent-1-hover)}}:host{display:block;block-size:12rem;inline-size:16rem;padding:1.125rem;box-sizing:content-box}.t-spin{margin-block-end:1rem}.t-cell{inline-size:4rem;border-block-start-width:.75rem;border-block-end-width:.75rem}.t-scrollbar{block-size:inherit;inline-size:inherit}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TuiCalendarYear, selector: "tui-calendar-year", inputs: ["rangeMode", "disabledItemHandler", "initialItem", "min", "max", "value"], outputs: ["yearClick"] }, { kind: "directive", type: TuiHovered, selector: "[tuiHoveredChange]", outputs: ["tuiHoveredChange"] }, { kind: "directive", type: TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }, { kind: "component", type: TuiScrollbar, selector: "tui-scrollbar", inputs: ["hidden"] }, { kind: "component", type: TuiSpinButton, selector: "tui-spin-button", inputs: ["focusable", "disabled", "leftDisabled", "rightDisabled"], outputs: ["leftClick", "rightClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
__decorate([
tuiPure
], TuiCalendarMonth.prototype, "calculateDisabledItemHandlerWithMinMax", null);
export { TuiCalendarMonth };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiCalendarMonth, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-calendar-month', imports: [
NgIf,
TuiCalendarYear,
TuiHovered,
TuiLet,
TuiLink,
TuiRepeatTimes,
TuiScrollbar,
TuiSpinButton,
], changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiAsAuxiliary(TuiCalendarMonth)], host: {
'[class._picking]': 'isRangePicking()',
}, template: "<tui-scrollbar\n *ngIf=\"isYearPickerShown; else monthSelect\"\n class=\"t-scrollbar\"\n>\n <tui-calendar-year\n [initialItem]=\"year.year\"\n [max]=\"max().year\"\n [min]=\"min().year\"\n [rangeMode]=\"options.rangeMode\"\n [value]=\"value()\"\n (yearClick)=\"onPickerYearClick($event)\"\n />\n</tui-scrollbar>\n<ng-template #monthSelect>\n <tui-spin-button\n class=\"t-spin\"\n [focusable]=\"false\"\n [leftDisabled]=\"year.yearSameOrBefore(min())\"\n [rightDisabled]=\"year.yearSameOrAfter(max())\"\n (leftClick)=\"onPreviousYear()\"\n (rightClick)=\"onNextYear()\"\n >\n <button\n automation-id=\"tui-calendar-month__active-year\"\n tabIndex=\"-1\"\n tuiLink\n type=\"button\"\n (click)=\"onYearClick()\"\n >\n {{ year.formattedYear }}\n </button>\n </tui-spin-button>\n <div\n *tuiRepeatTimes=\"let row of 3\"\n class=\"t-row\"\n >\n <ng-container *tuiRepeatTimes=\"let column of 4\">\n <div\n *tuiLet=\"getTuiMonth(row * 4 + column, year.year) as item\"\n class=\"t-cell\"\n [attr.data-range]=\"getItemRange(item)\"\n [class.t-cell_disabled]=\"disabledItemHandlerWithMinMax(item)\"\n [class.t-cell_today]=\"isItemToday(item)\"\n (click)=\"onItemClick(item)\"\n (tuiHoveredChange)=\"onItemHovered($event, item)\"\n >\n {{ months()?.[row * 4 + column] }}\n </div>\n </ng-container>\n </div>\n</ng-template>\n", styles: [".t-row{display:flex;justify-content:flex-start;font:var(--tui-font-text-m)}.t-row:first-child{justify-content:flex-end}.t-row:last-child{justify-content:flex-start}.t-cell{position:relative;display:flex;align-items:center;justify-content:center;line-height:2rem;isolation:isolate;cursor:pointer;overflow:hidden;border:.125rem solid transparent;box-sizing:border-box;-webkit-mask:linear-gradient(transparent calc(50% - 1rem),#000 calc(50% - 1rem),#000 calc(50% + 1rem),transparent calc(50% + 1rem));mask:linear-gradient(transparent calc(50% - 1rem),#000 calc(50% - 1rem),#000 calc(50% + 1rem),transparent calc(50% + 1rem))}.t-cell:first-child{border-inline-start-color:transparent!important}.t-cell:last-child{border-inline-end-color:transparent!important}.t-cell:before,.t-cell:after{position:absolute;top:0;left:0;bottom:0;right:0;content:\"\";z-index:-1;border-radius:var(--tui-radius-m)}.t-cell:after{-webkit-mask:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 32\"><path d=\"M0.2856 0L0.6763 0C2.9265 0 4.9876 1.259 6.0147 3.2611L10.2442 11.5048C11.5301 14.0113 11.5683 16.9754 10.3472 19.5141L5.9766 28.6007C4.9772 30.6786 2.8754 32 0.5696 32H0.285645V0Z\"></path></svg>') right / .75rem 100% no-repeat,linear-gradient(#000,#000) left / calc(100% - .7rem) 100% no-repeat;mask:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 32\"><path d=\"M0.2856 0L0.6763 0C2.9265 0 4.9876 1.259 6.0147 3.2611L10.2442 11.5048C11.5301 14.0113 11.5683 16.9754 10.3472 19.5141L5.9766 28.6007C4.9772 30.6786 2.8754 32 0.5696 32H0.285645V0Z\"></path></svg>') right / .75rem 100% no-repeat,linear-gradient(#000,#000) left / calc(100% - .7rem) 100% no-repeat}.t-cell[data-range]:before{background:var(--tui-background-neutral-1)}:host._picking .t-cell[data-range]:before{background:var(--tui-background-neutral-1-hover)}.t-cell[data-range=middle]{border-color:var(--tui-background-neutral-1)}:host._picking .t-cell[data-range=middle]{border-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=middle]:not(:first-child):before{border-top-left-radius:0;border-bottom-left-radius:0}.t-cell[data-range=middle]:not(:last-child):before{border-top-right-radius:0;border-bottom-right-radius:0}.t-cell[data-range=start]{border-inline-end-color:var(--tui-background-neutral-1);color:var(--tui-text-primary-on-accent-1)}:host._picking .t-cell[data-range=start]{border-inline-end-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=start]:not(:last-child):before{right:-1rem}.t-cell[data-range=start]:after{background:var(--tui-background-accent-1)}.t-cell[data-range=end]{border-inline-start-color:var(--tui-background-neutral-1);color:var(--tui-text-primary-on-accent-1)}:host._picking .t-cell[data-range=end]{border-inline-start-color:var(--tui-background-neutral-1-hover)}.t-cell[data-range=end]:not(:first-child):before{left:-1rem}.t-cell[data-range=end]:after{background:var(--tui-background-accent-1);transform:scaleX(-1)}.t-cell[data-range=active]{color:var(--tui-text-primary-on-accent-1)}.t-cell[data-range=active]:after{background:var(--tui-background-accent-1);-webkit-mask:none;mask:none}.t-cell_disabled{opacity:var(--tui-disabled-opacity);pointer-events:none}.t-cell_today{text-decoration:underline;text-underline-offset:.25rem}@media (hover: hover) and (pointer: fine){.t-cell:hover:not([data-range=start]):not([data-range=end]):before{background:var(--tui-background-neutral-1-hover)}.t-cell[data-range=start]:hover:after,.t-cell[data-range=end]:hover:after,.t-cell[data-range=active]:hover:after{background:var(--tui-background-accent-1-hover)}}:host{display:block;block-size:12rem;inline-size:16rem;padding:1.125rem;box-sizing:content-box}.t-spin{margin-block-end:1rem}.t-cell{inline-size:4rem;border-block-start-width:.75rem;border-block-end-width:.75rem}.t-scrollbar{block-size:inherit;inline-size:inherit}\n"] }]
}], propDecorators: { year: [{
type: Input
}], disabledItemHandler: [{
type: Input
}], minLength: [{
type: Input
}], maxLength: [{
type: Input
}], monthClick: [{
type: Output
}], hoveredItemChange: [{
type: Output
}], yearChange: [{
type: Output
}], minSetter: [{
type: Input,
args: [{ alias: 'min', transform: (x) => x ?? TUI_FIRST_DAY }]
}], maxSetter: [{
type: Input,
args: [{ alias: 'max', transform: (x) => x ?? TUI_LAST_DAY }]
}], valueSetter: [{
type: Input,
args: ['value']
}], calculateDisabledItemHandlerWithMinMax: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItbW9udGgvY2FsZW5kYXItbW9udGguY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvY2FsZW5kYXItbW9udGgvY2FsZW5kYXItbW9udGgudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3JDLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQ0gsYUFBYSxFQUNiLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLGFBQWEsRUFDYixPQUFPLEdBQ1YsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDNUQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUVyRSxPQUFPLEVBQUMsZUFBZSxFQUFFLE9BQU8sRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFDLFlBQVksRUFB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QyxNQUFNLGFBQ3BDLENBQUMsY0FBYyxrQkFBa0IsQ0FBQyxRQUN2Qzt3QkFDRixrQkFBa0IsRUFBRSxrQkFBa0I7cUJBQ3pDOzhCQVlNLElBQUk7c0JBRFYsS0FBSztnQkFJQyxtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJVSxVQUFVO3NCQUR6QixNQUFNO2dCQUlTLGlCQUFpQjtzQkFEaEMsTUFBTTtnQkFJUyxVQUFVO3NCQUR6QixNQUFNO2dCQVdJLFNBQVM7c0JBRG5CLEtBQUs7dUJBQUMsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxhQUFhLEVBQUM7Z0JBT2pFLFNBQVM7c0JBRG5CLEtBQUs7dUJBQUMsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxZQUFZLEVBQUM7Z0JBT2hFLFdBQVc7c0JBRHJCLEtBQUs7dUJBQUMsT0FBTztnQkE4Rk4sc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtOZ0lmfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dG9TaWduYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7VFVJX0ZBTFNFX0hBTkRMRVJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gICAgVFVJX0ZJUlNUX0RBWSxcbiAgICBUVUlfTEFTVF9EQVksXG4gICAgVHVpRGF5LFxuICAgIFR1aU1vbnRoLFxuICAgIFR1aU1vbnRoUmFuZ2UsXG4gICAgVHVpWWVhcixcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9kYXRlLXRpbWUnO1xuaW1wb3J0IHtUdWlIb3ZlcmVkfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvaG92ZXJlZCc7XG5pbXBvcnQge1R1aUxldH0gZnJvbSAnQHRhaWdhLXVpL2Nkay9kaXJlY3RpdmVzL2xldCc7XG5pbXBvcnQge1R1aVJlcGVhdFRpbWVzfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvcmVwZWF0LXRpbWVzJztcbmltcG9ydCB0eXBlIHtUdWlCb29sZWFuSGFuZGxlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge3R1aU51bGxhYmxlU2FtZSwgdHVpUHVyZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7VHVpQ2FsZW5kYXJZZWFyfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2NhbGVuZGFyJztcbmltcG9ydCB7VHVpTGlua30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9saW5rJztcbmltcG9ydCB7VHVpU2Nyb2xsYmFyfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL3Njcm9sbGJhcic7XG5pbXBvcnQge1R1aVNwaW5CdXR0b259IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvc3Bpbi1idXR0b24nO1xuaW1wb3J0IHt0dWlBc0F1eGlsaWFyeX0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB7VFVJX0NBTEVOREFSX01PTlRIU30gZnJvbSAnQHRhaWdhLXVpL2tpdC90b2tlbnMnO1xuXG5pbXBvcnQge1RVSV9DQUxFTkRBUl9NT05USF9PUFRJT05TfSBmcm9tICcuL2NhbGVuZGFyLW1vbnRoLm9wdGlvbnMnO1xuXG5jb25zdCBUT0RBWSA9IFR1aURheS5jdXJyZW50TG9jYWwoKTtcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS1jYWxlbmRhci1tb250aCcsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBUdWlDYWxlbmRhclllYXIsXG4gICAgICAgIFR1aUhvdmVyZWQsXG4gICAgICAgIFR1aUxldCxcbiAgICAgICAgVHVpTGluayxcbiAgICAgICAgVHVpUmVwZWF0VGltZXMsXG4gICAgICAgIFR1aVNjcm9sbGJhcixcbiAgICAgICAgVHVpU3BpbkJ1dHRvbixcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1tb250aC50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1tb250aC5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbdHVpQXNBdXhpbGlhcnkoVHVpQ2FsZW5kYXJNb250aCldLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJ1tjbGFzcy5fcGlja2luZ10nOiAnaXNSYW5nZVBpY2tpbmcoKScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpQ2FsZW5kYXJNb250aCB7XG4gICAgcHJvdGVjdGVkIGlzWWVhclBpY2tlclNob3duID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRocyA9IHRvU2lnbmFsKGluamVjdChUVUlfQ0FMRU5EQVJfTU9OVEhTKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzUmFuZ2VQaWNraW5nID0gY29tcHV0ZWQoXG4gICAgICAgICh4ID0gdGhpcy52YWx1ZSgpKSA9PlxuICAgICAgICAgICAgKCF0aGlzLm9wdGlvbnMucmFuZ2VNb2RlICYmIHggaW5zdGFuY2VvZiBUdWlNb250aFJhbmdlICYmIHguaXNTaW5nbGVNb250aCkgfHwgLy8gVE9ETyh2NSk6IHJlbW92ZSB0aGlzIGNvbmRpdGlvblxuICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5yYW5nZU1vZGUgJiYgeCBpbnN0YW5jZW9mIFR1aU1vbnRoKSxcbiAgICApO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgeWVhcjogVHVpWWVhciA9IFRPREFZO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzYWJsZWRJdGVtSGFuZGxlcjogVHVpQm9vbGVhbkhhbmRsZXI8VHVpTW9udGg+ID0gVFVJX0ZBTFNFX0hBTkRMRVI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtaW5MZW5ndGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBtb250aENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxUdWlNb250aD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSBob3ZlcmVkSXRlbUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHVpTW9udGggfCBudWxsPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IHllYXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFR1aVllYXI+KCk7XG5cbiAgICBwdWJsaWMgb3B0aW9ucyA9IGluamVjdChUVUlfQ0FMRU5EQVJfTU9OVEhfT1BUSU9OUyk7XG4gICAgcHVibGljIHJlYWRvbmx5IG1pbiA9IHNpZ25hbDxUdWlNb250aD4oVFVJX0ZJUlNUX0RBWSk7XG4gICAgcHVibGljIHJlYWRvbmx5IG1heCA9IHNpZ25hbDxUdWlNb250aD4oVFVJX0xBU1RfREFZKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsdWUgPSBzaWduYWw8VHVpTW9udGggfCBUdWlNb250aFJhbmdlIHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIGhvdmVyZWRJdGVtOiBUdWlNb250aCB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gVE9ETyh2NSk6IHVzZSBzaWduYWwgaW5wdXRzXG4gICAgQElucHV0KHthbGlhczogJ21pbicsIHRyYW5zZm9ybTogKHg6IFR1aU1vbnRoIHwgbnVsbCkgPT4geCA/PyBUVUlfRklSU1RfREFZfSlcbiAgICBwdWJsaWMgc2V0IG1pblNldHRlcih4OiBUdWlNb250aCkge1xuICAgICAgICB0aGlzLm1pbi5zZXQoeCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyh2NSk6IHVzZSBzaWduYWwgaW5wdXRzXG4gICAgQElucHV0KHthbGlhczogJ21heCcsIHRyYW5zZm9ybTogKHg6IFR1aU1vbnRoIHwgbnVsbCkgPT4geCA/PyBUVUlfTEFTVF9EQVl9KVxuICAgIHB1YmxpYyBzZXQgbWF4U2V0dGVyKHg6IFR1aU1vbnRoKSB7XG4gICAgICAgIHRoaXMubWF4LnNldCh4KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dHNcbiAgICBASW5wdXQoJ3ZhbHVlJylcbiAgICBwdWJsaWMgc2V0IHZhbHVlU2V0dGVyKHg6IFR1aU1vbnRoIHwgVHVpTW9udGhSYW5nZSB8IG51bGwpIHtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQoeCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmV4dFllYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlWWVhcih0aGlzLnllYXIuYXBwZW5kKHt5ZWFyOiAxfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblByZXZpb3VzWWVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVZZWFyKHRoaXMueWVhci5hcHBlbmQoe3llYXI6IC0xfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVtUmFuZ2UoaXRlbTogVHVpTW9udGgpOiAnYWN0aXZlJyB8ICdlbmQnIHwgJ21pZGRsZScgfCAnc3RhcnQnIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICBjb25zdCB7aG92ZXJlZEl0ZW19ID0gdGhpcztcblxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJhbmdlTW9kZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIFR1aU1vbnRoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU/Lm1vbnRoU2FtZShpdGVtKSA/ICdhY3RpdmUnIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkUmFuZ2UgPVxuICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBUdWlNb250aCA/IG5ldyBUdWlNb250aFJhbmdlKHZhbHVlLCB2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgY29uc3QgbW9udGhzID0gaXRlbS5tb250aCArIGl0ZW0ueWVhciAqIDEyO1xuICAgICAgICBjb25zdCBob3ZlcmVkID0gaG92ZXJlZEl0ZW0gPyBob3ZlcmVkSXRlbS5tb250aCArIGhvdmVyZWRJdGVtLnllYXIgKiAxMiA6IG51bGw7XG4gICAgICAgIGNvbnN0IGZyb20gPSBzZWxlY3RlZFJhbmdlLmZyb20ubW9udGggKyBzZWxlY3RlZFJhbmdlLmZyb20ueWVhciAqIDEyO1xuICAgICAgICBjb25zdCB0byA9IHNlbGVjdGVkUmFuZ2UudG8ubW9udGggKyBzZWxlY3RlZFJhbmdlLnRvLnllYXIgKiAxMjtcbiAgICAgICAgY29uc3QgcGlja2luZyA9IHRoaXMuaXNSYW5nZVBpY2tpbmcoKSA/IGhvdmVyZWQgOiBudWxsO1xuICAgICAgICBjb25zdCBtaW4gPSBNYXRoLm1pbihmcm9tLCB0bywgcGlja2luZyA/PyBmcm9tKTtcbiAgICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoZnJvbSwgdG8sIHBpY2tpbmcgPz8gZnJvbSk7XG5cbiAgICAgICAgaWYgKG1pbiA9PT0gbWF4ICYmIG1pbiA9PT0gbW9udGhzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2FjdGl2ZSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWluID09PSBtb250aHMpIHtcbiAgICAgICAgICAgIHJldHVybiAnc3RhcnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heCA9PT0gbW9udGhzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2VuZCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWluIDwgbW9udGhzICYmIG1vbnRocyA8IG1heCA/ICdtaWRkbGUnIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGRpc2FibGVkSXRlbUhhbmRsZXJXaXRoTWluTWF4KCk6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aU1vbnRoPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZURpc2FibGVkSXRlbUhhbmRsZXJXaXRoTWluTWF4KFxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZEl0ZW1IYW5kbGVyLFxuICAgICAgICAgICAgdGhpcy52YWx1ZSgpLFxuICAgICAgICAgICAgdGhpcy5pc1JhbmdlUGlja2luZygpLFxuICAgICAgICAgICAgdGhpcy5taW4oKSxcbiAgICAgICAgICAgIHRoaXMubWF4KCksXG4gICAgICAgICAgICB0aGlzLm1pbkxlbmd0aCxcbiAgICAgICAgICAgIHRoaXMubWF4TGVuZ3RoLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRUdWlNb250aChtb250aE51bWJlcjogbnVtYmVyLCB5ZWFyTnVtYmVyOiBudW1iZXIpOiBUdWlNb250aCB7XG4gICAgICAgIHJldHVybiBuZXcgVHVpTW9udGgoeWVhck51bWJlciwgbW9udGhOdW1iZXIpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc0l0ZW1Ub2RheShpdGVtOiBUdWlNb250aCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gVE9EQVkubW9udGhTYW1lKGl0ZW0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblBpY2tlclllYXJDbGljayh5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1llYXJQaWNrZXJTaG93biA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLnllYXIueWVhciAhPT0geWVhcikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVZZWFyKG5ldyBUdWlZZWFyKHllYXIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkl0ZW1DbGljayhtb250aDogVHVpTW9udGgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkSXRlbUhhbmRsZXJXaXRoTWluTWF4KG1vbnRoKSkge1xuICAgICAgICAgICAgdGhpcy5tb250aENsaWNrLmVtaXQobW9udGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uWWVhckNsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzWWVhclBpY2tlclNob3duID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25JdGVtSG92ZXJlZChob3ZlcmVkOiBib29sZWFuLCBpdGVtOiBUdWlNb250aCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZUhvdmVyZWRJdGVtKGhvdmVyZWQgPyBpdGVtIDogbnVsbCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9tYXgtcGFyYW1zLG1heC1wYXJhbXNcbiAgICBAdHVpUHVyZVxuICAgIHByaXZhdGUgY2FsY3VsYXRlRGlzYWJsZWRJdGVtSGFuZGxlcldpdGhNaW5NYXgoXG4gICAgICAgIGRpc2FibGVkSXRlbUhhbmRsZXI6IFR1aUJvb2xlYW5IYW5kbGVyPFR1aU1vbnRoPixcbiAgICAgICAgdmFsdWU6IFR1aU1vbnRoIHwgVHVpTW9udGhSYW5nZSB8IG51bGwsXG4gICAgICAgIGlzUmFuZ2VQaWNraW5nOiBib29sZWFuLFxuICAgICAgICBtaW46IFR1aU1vbnRoLFxuICAgICAgICBtYXg6IFR1aU1vbnRoLFxuICAgICAgICBtaW5MZW5ndGg6IG51bWJlciB8IG51bGwsXG4gICAgICAgIG1heExlbmd0aDogbnVtYmVyIHwgbnVsbCxcbiAgICApOiBUdWlCb29sZWFuSGFuZGxlcjxUdWlNb250aD4ge1xuICAgICAgICByZXR1cm4gKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkTW9udGggPSB2YWx1ZSBpbnN0YW5jZW9mIFR1aU1vbnRoUmFuZ2UgPyB2YWx1ZS5mcm9tIDogdmFsdWU7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9XG4gICAgICAgICAgICAgICAgaXNSYW5nZVBpY2tpbmcgJiYgc2VsZWN0ZWRNb250aFxuICAgICAgICAgICAgICAgICAgICA/IE1hdGguYWJzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnllYXIgKiAxMiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1vbnRoIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTW9udGgueWVhciAqIDEyIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTW9udGgubW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IDA7XG5cbiAgICAgICAgICAgIGNvbnN0IHRvb0xvbmcgPSBkZWx0YSAmJiBtYXhMZW5ndGggJiYgZGVsdGEgPiBtYXhMZW5ndGg7XG4gICAgICAgICAgICBjb25zdCB0b29TaG9ydCA9IGRlbHRhICYmIG1pbkxlbmd0aCAmJiBkZWx0YSA8IG1pbkxlbmd0aDtcblxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0b29Mb25nIHx8XG4gICAgICAgICAgICAgICAgdG9vU2hvcnQgfHxcbiAgICAgICAgICAgICAgICBpdGVtLm1vbnRoQmVmb3JlKG1pbikgfHxcbiAgICAgICAgICAgICAgICBpdGVtLm1vbnRoQWZ0ZXIobWF4KSB8fFxuICAgICAgICAgICAgICAgIGRpc2FibGVkSXRlbUhhbmRsZXIoaXRlbSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVIb3ZlcmVkSXRlbShtb250aDogVHVpTW9udGggfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICh0dWlOdWxsYWJsZVNhbWUodGhpcy5ob3ZlcmVkSXRlbSwgbW9udGgsIChhLCBiKSA9PiBhLm1vbnRoU2FtZShiKSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW0gPSBtb250aDtcbiAgICAgICAgdGhpcy5ob3ZlcmVkSXRlbUNoYW5nZS5lbWl0KG1vbnRoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUFjdGl2ZVllYXIoeWVhcjogVHVpWWVhcik6IHZvaWQge1xuICAgICAgICB0aGlzLnllYXIgPSB5ZWFyO1xuICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh5ZWFyKTtcbiAgICB9XG59XG4iLCI8dHVpLXNjcm9sbGJhclxuICAgICpuZ0lmPVwiaXNZZWFyUGlja2VyU2hvd247IGVsc2UgbW9udGhTZWxlY3RcIlxuICAgIGNsYXNzPVwidC1zY3JvbGxiYXJcIlxuPlxuICAgIDx0dWktY2FsZW5kYXIteWVhclxuICAgICAgICBbaW5pdGlhbEl0ZW1dPVwieWVhci55ZWFyXCJcbiAgICAgICAgW21heF09XCJtYXgoKS55ZWFyXCJcbiAgICAgICAgW21pbl09XCJtaW4oKS55ZWFyXCJcbiAgICAgICAgW3JhbmdlTW9kZV09XCJvcHRpb25zLnJhbmdlTW9kZVwiXG4gICAgICAgIFt2YWx1ZV09XCJ2YWx1ZSgpXCJcbiAgICAgICAgKHllYXJDbGljayk9XCJvblBpY2tlclllYXJDbGljaygkZXZlbnQpXCJcbiAgICAvPlxuPC90dWktc2Nyb2xsYmFyPlxuPG5nLXRlbXBsYXRlICNtb250aFNlbGVjdD5cbiAgICA8dHVpLXNwaW4tYnV0dG9uXG4gICAgICAgIGNsYXNzPVwidC1zcGluXCJcbiAgICAgICAgW2ZvY3VzYWJsZV09XCJmYWxzZVwiXG4gICAgICAgIFtsZWZ0RGlzYWJsZWRdPVwieWVhci55ZWFyU2FtZU9yQmVmb3JlKG1pbigpKVwiXG4gICAgICAgIFtyaWdodERpc2FibGVkXT1cInllYXIueWVhclNhbWVPckFmdGVyKG1heCgpKVwiXG4gICAgICAgIChsZWZ0Q2xpY2spPVwib25QcmV2aW91c1llYXIoKVwiXG4gICAgICAgIChyaWdodENsaWNrKT1cIm9uTmV4dFllYXIoKVwiXG4gICAgPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBhdXRvbWF0aW9uLWlkPVwidHVpLWNhbGVuZGFyLW1vbnRoX19hY3RpdmUteWVhclwiXG4gICAgICAgICAgICB0YWJJbmRleD1cIi0xXCJcbiAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uWWVhckNsaWNrKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyB5ZWFyLmZvcm1hdHRlZFllYXIgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC90dWktc3Bpbi1idXR0b24+XG4gICAgPGRpdlxuICAgICAgICAqdHVpUmVwZWF0VGltZXM9XCJsZXQgcm93IG9mIDNcIlxuICAgICAgICBjbGFzcz1cInQtcm93XCJcbiAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKnR1aVJlcGVhdFRpbWVzPVwibGV0IGNvbHVtbiBvZiA0XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKnR1aUxldD1cImdldFR1aU1vbnRoKHJvdyAqIDQgKyBjb2x1bW4sIHllYXIueWVhcikgYXMgaXRlbVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0LWNlbGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtcmFuZ2VdPVwiZ2V0SXRlbVJhbmdlKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MudC1jZWxsX2Rpc2FibGVkXT1cImRpc2FibGVkSXRlbUhhbmRsZXJXaXRoTWluTWF4KGl0ZW0pXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MudC1jZWxsX3RvZGF5XT1cImlzSXRlbVRvZGF5KGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIlxuICAgICAgICAgICAgICAgICh0dWlIb3ZlcmVkQ2hhbmdlKT1cIm9uSXRlbUhvdmVyZWQoJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgbW9udGhzKCk/Lltyb3cgKiA0ICsgY29sdW1uXSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==