@taiga-ui/kit
Version:
Taiga UI Angular main components kit
84 lines • 20.9 kB
JavaScript
import { AsyncPipe, NgIf, PercentPipe } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { TUI_FALSE_HANDLER } from '@taiga-ui/cdk/constants';
import { TuiLet } from '@taiga-ui/cdk/directives/let';
import { tuiClamp } from '@taiga-ui/cdk/utils/math';
import { TuiButton } from '@taiga-ui/core/components/button';
import { TuiHint } from '@taiga-ui/core/directives/hint';
import { TuiSlider } from '@taiga-ui/kit/components/slider';
import { TUI_PREVIEW_ICONS, TUI_PREVIEW_ZOOM_TEXTS } from '@taiga-ui/kit/tokens';
import { map, merge, of, startWith, switchMap, timer } from 'rxjs';
import { TuiPreviewAction } from '../action/preview-action.directive';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@taiga-ui/core/directives/hint";
import * as i3 from "@taiga-ui/kit/components/slider";
const STEP = 0.5;
class TuiPreviewZoom {
constructor() {
this.icons = inject(TUI_PREVIEW_ICONS);
this.zoomTexts$ = inject(TUI_PREVIEW_ZOOM_TEXTS);
this.sliderLabel$ = this.zoomTexts$.pipe(map((texts) => `${texts.zoomOut} / ${texts.zoomIn}`));
this.min = 0.5;
this.max = 2;
this.value = 1;
this.valueChange = new EventEmitter();
this.reset = new EventEmitter();
this.hintShow$ = this.valueChange.pipe(switchMap(() => merge(of(true), timer(1000).pipe(map(TUI_FALSE_HANDLER)))), startWith(false));
}
get leftButtonDisabled() {
return this.value === this.min;
}
get rightButtonDisabled() {
return this.value === this.max;
}
get collapseVisible() {
return this.value > this.min;
}
onModelChange(value) {
const clamped = tuiClamp(value, this.min, this.max);
if (clamped === this.value) {
return;
}
this.value = clamped;
this.valueChange.emit(clamped);
}
onReset() {
this.reset.emit();
}
onMinus() {
this.onModelChange(this.value - STEP);
}
onPlus() {
this.onModelChange(this.value < 1 ? 1 : this.value + STEP);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPreviewZoom, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiPreviewZoom, isStandalone: true, selector: "tui-preview-zoom", inputs: { min: "min", max: "max", value: "value" }, outputs: { valueChange: "valueChange", reset: "reset" }, ngImport: i0, template: "<ng-container *ngIf=\"zoomTexts$ | async as texts\">\n <section class=\"t-zoom\">\n <button\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-sign_minus\"\n [disabled]=\"leftButtonDisabled\"\n [iconStart]=\"icons.zoomOut\"\n (click)=\"onMinus()\"\n >\n {{ texts.zoomOut }}\n </button>\n <label\n *tuiLet=\"value | percent as sliderValueText\"\n tuiSliderThumbLabel\n >\n <div\n [tuiHint]=\"sliderValueText\"\n [tuiHintManual]=\"!!(hintShow$ | async)\"\n ></div>\n\n <input\n step=\"any\"\n tuiSlider\n tuiTheme=\"dark\"\n type=\"range\"\n class=\"t-slider\"\n [attr.aria-label]=\"sliderLabel$ | async\"\n [attr.aria-valuetext]=\"sliderValueText\"\n [max]=\"max\"\n [min]=\"min\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onModelChange($event)\"\n />\n </label>\n <button\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-sign_plus\"\n [disabled]=\"rightButtonDisabled\"\n [iconStart]=\"icons.zoomIn\"\n (click)=\"onPlus()\"\n >\n {{ texts.zoomIn }}\n </button>\n </section>\n\n <button\n tuiHintAppearance=\"dark\"\n tuiHintDescribe\n tuiHintDirection=\"top-right\"\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-reset-button\"\n [class.t-invisible]=\"!collapseVisible\"\n [iconStart]=\"icons.zoomReset\"\n [tuiHint]=\"texts.reset\"\n (click)=\"onReset()\"\n >\n {{ texts.reset }}\n </button>\n</ng-container>\n", styles: [":host{position:relative;display:flex}.t-zoom{border-radius:1rem;background:#686868f5;color:#fff;display:flex;font:var(--tui-font-text-s);justify-content:space-between;align-items:center;inline-size:12rem}.t-slider{inline-size:7.5rem}.t-sign_minus{border-top-right-radius:0;border-bottom-right-radius:0}.t-sign_plus{border-top-left-radius:0;border-bottom-left-radius:0}.t-invisible{visibility:hidden}.t-reset-button{margin-inline-start:.3125rem}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: PercentPipe, name: "percent" }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i2.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"], outputs: ["tuiHintVisible"] }, { kind: "directive", type: i2.TuiHintDescribe, selector: "[tuiHintDescribe]", inputs: ["tuiHintDescribe"] }, { kind: "directive", type: i2.TuiHintManual, selector: "[tuiHint][tuiHintManual]", inputs: ["tuiHintManual"] }, { kind: "directive", type: TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: TuiPreviewAction, selector: "[tuiPreviewAction]" }, { kind: "component", type: i3.TuiSliderComponent, selector: "input[type=range][tuiSlider]", inputs: ["size", "segments"] }, { kind: "component", type: i3.TuiSliderThumbLabel, selector: "[tuiSliderThumbLabel]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiPreviewZoom };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPreviewZoom, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-preview-zoom', imports: [
AsyncPipe,
FormsModule,
NgIf,
PercentPipe,
TuiButton,
TuiHint,
TuiLet,
TuiPreviewAction,
TuiSlider,
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"zoomTexts$ | async as texts\">\n <section class=\"t-zoom\">\n <button\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-sign_minus\"\n [disabled]=\"leftButtonDisabled\"\n [iconStart]=\"icons.zoomOut\"\n (click)=\"onMinus()\"\n >\n {{ texts.zoomOut }}\n </button>\n <label\n *tuiLet=\"value | percent as sliderValueText\"\n tuiSliderThumbLabel\n >\n <div\n [tuiHint]=\"sliderValueText\"\n [tuiHintManual]=\"!!(hintShow$ | async)\"\n ></div>\n\n <input\n step=\"any\"\n tuiSlider\n tuiTheme=\"dark\"\n type=\"range\"\n class=\"t-slider\"\n [attr.aria-label]=\"sliderLabel$ | async\"\n [attr.aria-valuetext]=\"sliderValueText\"\n [max]=\"max\"\n [min]=\"min\"\n [ngModel]=\"value\"\n [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onModelChange($event)\"\n />\n </label>\n <button\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-sign_plus\"\n [disabled]=\"rightButtonDisabled\"\n [iconStart]=\"icons.zoomIn\"\n (click)=\"onPlus()\"\n >\n {{ texts.zoomIn }}\n </button>\n </section>\n\n <button\n tuiHintAppearance=\"dark\"\n tuiHintDescribe\n tuiHintDirection=\"top-right\"\n tuiIconButton\n tuiPreviewAction\n type=\"button\"\n class=\"t-reset-button\"\n [class.t-invisible]=\"!collapseVisible\"\n [iconStart]=\"icons.zoomReset\"\n [tuiHint]=\"texts.reset\"\n (click)=\"onReset()\"\n >\n {{ texts.reset }}\n </button>\n</ng-container>\n", styles: [":host{position:relative;display:flex}.t-zoom{border-radius:1rem;background:#686868f5;color:#fff;display:flex;font:var(--tui-font-text-s);justify-content:space-between;align-items:center;inline-size:12rem}.t-slider{inline-size:7.5rem}.t-sign_minus{border-top-right-radius:0;border-bottom-right-radius:0}.t-sign_plus{border-top-left-radius:0;border-bottom-left-radius:0}.t-invisible{visibility:hidden}.t-reset-button{margin-inline-start:.3125rem}\n"] }]
}], propDecorators: { min: [{
type: Input
}], max: [{
type: Input
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], reset: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy16b29tLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL3ByZXZpZXcvem9vbS9wcmV2aWV3LXpvb20uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvcHJldmlldy96b29tL3ByZXZpZXctem9vbS50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDM0QsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRSxPQUFPLEVBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFakUsT0FBTyxFQUFDLGdCQUFnQixFQUFD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QyxHQUFHO3NCQURULEtBQUs7Z0JBSUMsS0FBSztzQkFEWCxLQUFLO2dCQUlVLFdBQVc7c0JBRDFCLE1BQU07Z0JBSVMsS0FBSztzQkFEcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNQaXBlLCBOZ0lmLCBQZXJjZW50UGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybXNNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7VFVJX0ZBTFNFX0hBTkRMRVJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvY29uc3RhbnRzJztcbmltcG9ydCB7VHVpTGV0fSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvbGV0JztcbmltcG9ydCB7dHVpQ2xhbXB9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWF0aCc7XG5pbXBvcnQge1R1aUJ1dHRvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHtUdWlIaW50fSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2hpbnQnO1xuaW1wb3J0IHtUdWlTbGlkZXJ9IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9zbGlkZXInO1xuaW1wb3J0IHtUVUlfUFJFVklFV19JQ09OUywgVFVJX1BSRVZJRVdfWk9PTV9URVhUU30gZnJvbSAnQHRhaWdhLXVpL2tpdC90b2tlbnMnO1xuaW1wb3J0IHttYXAsIG1lcmdlLCBvZiwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRpbWVyfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtUdWlQcmV2aWV3QWN0aW9ufSBmcm9tICcuLi9hY3Rpb24vcHJldmlldy1hY3Rpb24uZGlyZWN0aXZlJztcblxuY29uc3QgU1RFUCA9IDAuNTtcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS1wcmV2aWV3LXpvb20nLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgTmdJZixcbiAgICAgICAgUGVyY2VudFBpcGUsXG4gICAgICAgIFR1aUJ1dHRvbixcbiAgICAgICAgVHVpSGludCxcbiAgICAgICAgVHVpTGV0LFxuICAgICAgICBUdWlQcmV2aWV3QWN0aW9uLFxuICAgICAgICBUdWlTbGlkZXIsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy16b29tLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3ByZXZpZXctem9vbS5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFR1aVByZXZpZXdab29tIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaWNvbnMgPSBpbmplY3QoVFVJX1BSRVZJRVdfSUNPTlMpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB6b29tVGV4dHMkID0gaW5qZWN0KFRVSV9QUkVWSUVXX1pPT01fVEVYVFMpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzbGlkZXJMYWJlbCQgPSB0aGlzLnpvb21UZXh0cyQucGlwZShcbiAgICAgICAgbWFwKCh0ZXh0cykgPT4gYCR7dGV4dHMuem9vbU91dH0gLyAke3RleHRzLnpvb21Jbn1gKSxcbiAgICApO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWluID0gMC41O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4ID0gMjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHZhbHVlID0gMTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGhpbnRTaG93JCA9IHRoaXMudmFsdWVDaGFuZ2UucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IG1lcmdlKG9mKHRydWUpLCB0aW1lcigxMDAwKS5waXBlKG1hcChUVUlfRkFMU0VfSEFORExFUikpKSksXG4gICAgICAgIHN0YXJ0V2l0aChmYWxzZSksXG4gICAgKTtcblxuICAgIHByb3RlY3RlZCBnZXQgbGVmdEJ1dHRvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5taW47XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCByaWdodEJ1dHRvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5tYXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBjb2xsYXBzZVZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlID4gdGhpcy5taW47XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uTW9kZWxDaGFuZ2UodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGFtcGVkID0gdHVpQ2xhbXAodmFsdWUsIHRoaXMubWluLCB0aGlzLm1heCk7XG5cbiAgICAgICAgaWYgKGNsYW1wZWQgPT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFsdWUgPSBjbGFtcGVkO1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoY2xhbXBlZCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uUmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzZXQuZW1pdCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbk1pbnVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy52YWx1ZSAtIFNURVApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblBsdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZSh0aGlzLnZhbHVlIDwgMSA/IDEgOiB0aGlzLnZhbHVlICsgU1RFUCk7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cInpvb21UZXh0cyQgfCBhc3luYyBhcyB0ZXh0c1wiPlxuICAgIDxzZWN0aW9uIGNsYXNzPVwidC16b29tXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgIHR1aVByZXZpZXdBY3Rpb25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJ0LXNpZ25fbWludXNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxlZnRCdXR0b25EaXNhYmxlZFwiXG4gICAgICAgICAgICBbaWNvblN0YXJ0XT1cImljb25zLnpvb21PdXRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWludXMoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IHRleHRzLnpvb21PdXQgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgKnR1aUxldD1cInZhbHVlIHwgcGVyY2VudCBhcyBzbGlkZXJWYWx1ZVRleHRcIlxuICAgICAgICAgICAgdHVpU2xpZGVyVGh1bWJMYWJlbFxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW3R1aUhpbnRdPVwic2xpZGVyVmFsdWVUZXh0XCJcbiAgICAgICAgICAgICAgICBbdHVpSGludE1hbnVhbF09XCIhIShoaW50U2hvdyQgfCBhc3luYylcIlxuICAgICAgICAgICAgPjwvZGl2PlxuXG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBzdGVwPVwiYW55XCJcbiAgICAgICAgICAgICAgICB0dWlTbGlkZXJcbiAgICAgICAgICAgICAgICB0dWlUaGVtZT1cImRhcmtcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0LXNsaWRlclwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJzbGlkZXJMYWJlbCQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZXRleHRdPVwic2xpZGVyVmFsdWVUZXh0XCJcbiAgICAgICAgICAgICAgICBbbWF4XT1cIm1heFwiXG4gICAgICAgICAgICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgICAgICAgdHVpUHJldmlld0FjdGlvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInQtc2lnbl9wbHVzXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyaWdodEJ1dHRvbkRpc2FibGVkXCJcbiAgICAgICAgICAgIFtpY29uU3RhcnRdPVwiaWNvbnMuem9vbUluXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblBsdXMoKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IHRleHRzLnpvb21JbiB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L3NlY3Rpb24+XG5cbiAgICA8YnV0dG9uXG4gICAgICAgIHR1aUhpbnRBcHBlYXJhbmNlPVwiZGFya1wiXG4gICAgICAgIHR1aUhpbnREZXNjcmliZVxuICAgICAgICB0dWlIaW50RGlyZWN0aW9uPVwidG9wLXJpZ2h0XCJcbiAgICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgICB0dWlQcmV2aWV3QWN0aW9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cInQtcmVzZXQtYnV0dG9uXCJcbiAgICAgICAgW2NsYXNzLnQtaW52aXNpYmxlXT1cIiFjb2xsYXBzZVZpc2libGVcIlxuICAgICAgICBbaWNvblN0YXJ0XT1cImljb25zLnpvb21SZXNldFwiXG4gICAgICAgIFt0dWlIaW50XT1cInRleHRzLnJlc2V0XCJcbiAgICAgICAgKGNsaWNrKT1cIm9uUmVzZXQoKVwiXG4gICAgPlxuICAgICAgICB7eyB0ZXh0cy5yZXNldCB9fVxuICAgIDwvYnV0dG9uPlxuPC9uZy1jb250YWluZXI+XG4iXX0=