xui
Version:
xUI Components for Angular
194 lines • 24.9 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener, Input, Optional, Self, ViewChild } from '@angular/core';
import { NgControl } from '@angular/forms';
import { TooltipComponent } from '../tooltip/tooltip.component';
import { inNextTick, InputBoolean, InputNumber } from '../utils';
import { BehaviorSubject, map } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/common";
import * as i3 from "../tooltip/tooltip.directive";
import * as i4 from "@angular/cdk/drag-drop";
export class SliderComponent {
get value() {
return this._value ?? this.min;
}
set value(v) {
if (this._value !== v) {
this._value = v;
this.onChange?.(v);
}
}
get percentage() {
return this.getPercentage(this.value);
}
get width() {
return 100 - this.percentage;
}
get tooltip() {
return String(this.tipFormatter ? this.tipFormatter(this.value) : this.value);
}
getColor(color) {
return `x-slider-${color}`;
}
getPercentage(absolute) {
return ((absolute - this.min) / (this.max - this.min)) * 100;
}
constructor(cdr, control) {
this.cdr = cdr;
this.control = control;
this._posX = new BehaviorSubject(0);
this._value = null;
this.position$ = this._posX.pipe(map(x => ({ x, y: 0 })));
this.disabled = false;
this.tooltipDisabled = false;
this.color = 'primary';
this.min = 0;
this.max = 100;
this.step = 1;
this.range = false;
if (this.control) {
this.control.valueAccessor = this;
}
}
ngOnInit() {
this.control?.statusChanges?.subscribe(() => {
this.setPositionByPercentage(this.percentage);
this.cdr.markForCheck();
});
}
async ngAfterViewInit() {
await inNextTick();
this.setPositionByPercentage(this.percentage);
}
ngOnChanges(changes) {
if (changes['value']) {
this.setPositionByPercentage(this.percentage);
}
}
writeValue(source) {
this.value = source;
}
registerOnChange(onChange) {
this.onChange = onChange;
}
registerOnTouched(onTouched) {
this.onTouched = onTouched;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
_focusOut() {
this.onTouched?.();
}
_decreaseKey() {
this.value = Math.min(Math.max(this.value - this.step, this.min), this.max);
this.setPositionByPercentage(this.percentage);
}
_increaseKey() {
this.value = Math.min(Math.max(this.value + this.step, this.min), this.max);
this.setPositionByPercentage(this.percentage);
}
async move(screenX) {
if (this.disabled) {
return;
}
const cursorOffset = 5;
const rect = this.hostRect;
const width = rect.width - 10;
const pos = Math.min(Math.max(screenX - rect.x - cursorOffset, 0), width);
const value = (pos / width) * (this.max - this.min); // 0 <-> max - min
const newValue = Math.round(value / this.step) * this.step;
this.value = newValue + this.min;
this.setPositionByPercentage(this.percentage);
await inNextTick();
this.tooltipRef.show(0);
}
get hostRect() {
return this.trackElm.nativeElement.getBoundingClientRect();
}
setPositionByPercentage(value) {
this._posX.next((value / 100) * this.hostRect.width - 5);
this.cdr.markForCheck();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: SliderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.1", type: SliderComponent, selector: "xui-slider", inputs: { disabled: "disabled", tooltipDisabled: "tooltipDisabled", color: "color", secondColor: "secondColor", min: "min", max: "max", step: "step", tipFormatter: "tipFormatter", marks: "marks", range: "range", value: "value" }, host: { listeners: { "focusout": "_focusOut()", "keydown.arrowLeft": "_decreaseKey()", "keydown.arrowRight": "_increaseKey()", "click": "move($event.x)" } }, viewQueries: [{ propertyName: "trackElm", first: true, predicate: ["track"], descendants: true, static: true }, { propertyName: "tooltipRef", first: true, predicate: ["tooltipRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"x-slider\" [class.x-slider-disabled]=\"disabled\">\n <div [class]=\"'x-slider-track ' + getColor(color)\">\n <div [style.width.%]=\"width\" [class]=\"'x-slider-track-half ' + getColor(secondColor ?? 'none')\"></div>\n </div>\n\n <div class=\"x-slider-container\" #track>\n <div\n [tabindex]=\"disabled ? -1 : 0\"\n cdkDrag\n [cdkDragDisabled]=\"disabled\"\n [cdkDragFreeDragPosition]=\"(position$ | async) ?? { x: 0, y: 0 }\"\n (cdkDragMoved)=\"move($event.pointerPosition.x)\"\n class=\"x-slider-thumb\"\n xuiTooltipPosition=\"above\"\n [xuiTooltip]=\"tooltip\"\n [matTooltipDisabled]=\"tooltipDisabled\"\n #tooltipRef=\"xuiTooltip\"\n ></div>\n\n <div\n *ngFor=\"let mark of marks\"\n [style.left.%]=\"getPercentage(mark.value)\"\n class=\"x-slider-mark\"\n [class]=\"mark.color ? 'x-slider-mark-' + mark.color : ''\"\n >\n <div class=\"x-slider-mark-label\">{{ mark.label }}</div>\n <div class=\"x-slider-mark-dash\"></div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.TooltipDirective, selector: "[xuiTooltip]", inputs: ["xuiTooltip", "xuiTooltipPosition"], exportAs: ["xuiTooltip"] }, { kind: "directive", type: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], SliderComponent.prototype, "disabled", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], SliderComponent.prototype, "tooltipDisabled", void 0);
__decorate([
InputNumber(),
__metadata("design:type", Object)
], SliderComponent.prototype, "min", void 0);
__decorate([
InputNumber(),
__metadata("design:type", Object)
], SliderComponent.prototype, "max", void 0);
__decorate([
InputNumber(),
__metadata("design:type", Object)
], SliderComponent.prototype, "step", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], SliderComponent.prototype, "range", void 0);
__decorate([
InputNumber(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], SliderComponent.prototype, "value", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: SliderComponent, decorators: [{
type: Component,
args: [{ selector: 'xui-slider', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"x-slider\" [class.x-slider-disabled]=\"disabled\">\n <div [class]=\"'x-slider-track ' + getColor(color)\">\n <div [style.width.%]=\"width\" [class]=\"'x-slider-track-half ' + getColor(secondColor ?? 'none')\"></div>\n </div>\n\n <div class=\"x-slider-container\" #track>\n <div\n [tabindex]=\"disabled ? -1 : 0\"\n cdkDrag\n [cdkDragDisabled]=\"disabled\"\n [cdkDragFreeDragPosition]=\"(position$ | async) ?? { x: 0, y: 0 }\"\n (cdkDragMoved)=\"move($event.pointerPosition.x)\"\n class=\"x-slider-thumb\"\n xuiTooltipPosition=\"above\"\n [xuiTooltip]=\"tooltip\"\n [matTooltipDisabled]=\"tooltipDisabled\"\n #tooltipRef=\"xuiTooltip\"\n ></div>\n\n <div\n *ngFor=\"let mark of marks\"\n [style.left.%]=\"getPercentage(mark.value)\"\n class=\"x-slider-mark\"\n [class]=\"mark.color ? 'x-slider-mark-' + mark.color : ''\"\n >\n <div class=\"x-slider-mark-label\">{{ mark.label }}</div>\n <div class=\"x-slider-mark-dash\"></div>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NgControl, decorators: [{
type: Self
}, {
type: Optional
}] }]; }, propDecorators: { trackElm: [{
type: ViewChild,
args: ['track', { static: true }]
}], tooltipRef: [{
type: ViewChild,
args: ['tooltipRef']
}], disabled: [{
type: Input
}], tooltipDisabled: [{
type: Input
}], color: [{
type: Input
}], secondColor: [{
type: Input
}], min: [{
type: Input
}], max: [{
type: Input
}], step: [{
type: Input
}], tipFormatter: [{
type: Input
}], marks: [{
type: Input
}], range: [{
type: Input
}], value: [{
type: Input
}], _focusOut: [{
type: HostListener,
args: ['focusout']
}], _decreaseKey: [{
type: HostListener,
args: ['keydown.arrowLeft']
}], _increaseKey: [{
type: HostListener,
args: ['keydown.arrowRight']
}], move: [{
type: HostListener,
args: ['click', ['$event.x']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMveHVpL3NyYy9zbGlkZXIvc2xpZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMveHVpL3NyYy9zbGlkZXIvc2xpZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsUUFBUSxFQUNSLElBQUksRUFFSixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVM1QyxNQUFNLE9BQU8sZUFBZTtJQTRCMUIsSUFFSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLENBQUM7UUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBRWhCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCxJQUFZLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSxLQUFL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Z0JBQ1gsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUVFLFFBQVE7c0JBQWhDLEtBQUs7Z0JBQ21CLGVBQWU7c0JBQXZDLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRWtCLEdBQUc7c0JBQTFCLEtBQUs7Z0JBQ2tCLEdBQUc7c0JBQTFCLEtBQUs7Z0JBQ2tCLElBQUk7c0JBQTNCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ21CLEtBQUs7c0JBQTdCLEtBQUs7Z0JBSUYsS0FBSztzQkFGUixLQUFLO2dCQTJFRSxTQUFTO3NCQURoQixZQUFZO3VCQUFDLFVBQVU7Z0JBTWhCLFlBQVk7c0JBRG5CLFlBQVk7dUJBQUMsbUJBQW1CO2dCQU96QixZQUFZO3NCQURuQixZQUFZO3VCQUFDLG9CQUFvQjtnQkFPNUIsSUFBSTtzQkFEVCxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFNlbGYsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUb29sdGlwQ29tcG9uZW50IH0gZnJvbSAnLi4vdG9vbHRpcC90b29sdGlwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBpbk5leHRUaWNrLCBJbnB1dEJvb2xlYW4sIElucHV0TnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNsaWRlckNvbG9yLCBTbGlkZXJNYXJrIH0gZnJvbSAnLi9zbGlkZXIudHlwZXMnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBOdW1iZXJJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3h1aS1zbGlkZXInLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICdzbGlkZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFNsaWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV92YWx1ZTogTnVtYmVySW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9yYW5nZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfdG9vbHRpcERpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZT86IChzb3VyY2U6IG51bWJlcikgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgX3Bvc1ggPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBwb3NpdGlvbiQgPSB0aGlzLl9wb3NYLnBpcGUobWFwKHggPT4gKHsgeCwgeTogMCB9KSkpO1xuXG4gIEBWaWV3Q2hpbGQoJ3RyYWNrJywgeyBzdGF0aWM6IHRydWUgfSkgdHJhY2tFbG0hOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0b29sdGlwUmVmJykgdG9vbHRpcFJlZiE6IFRvb2x0aXBDb21wb25lbnQ7XG5cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSB0b29sdGlwRGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgY29sb3I6IFNsaWRlckNvbG9yID0gJ3ByaW1hcnknO1xuICBASW5wdXQoKSBzZWNvbmRDb2xvcj86IFNsaWRlckNvbG9yO1xuXG4gIEBJbnB1dCgpIEBJbnB1dE51bWJlcigpIG1pbiA9IDA7XG4gIEBJbnB1dCgpIEBJbnB1dE51bWJlcigpIG1heCA9IDEwMDtcbiAgQElucHV0KCkgQElucHV0TnVtYmVyKCkgc3RlcCA9IDE7XG4gIEBJbnB1dCgpIHRpcEZvcm1hdHRlcj86ICh2YWx1ZTogbnVtYmVyKSA9PiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1hcmtzPzogU2xpZGVyTWFya1tdO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgcmFuZ2UgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBASW5wdXROdW1iZXIoKVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8/IHRoaXMubWluO1xuICB9XG5cbiAgc2V0IHZhbHVlKHYpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IHYpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcblxuICAgICAgdGhpcy5vbkNoYW5nZT8uKHYpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHBlcmNlbnRhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGVyY2VudGFnZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGdldCB3aWR0aCgpIHtcbiAgICByZXR1cm4gMTAwIC0gdGhpcy5wZXJjZW50YWdlO1xuICB9XG5cbiAgZ2V0IHRvb2x0aXAoKSB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLnRpcEZvcm1hdHRlciA/IHRoaXMudGlwRm9ybWF0dGVyKHRoaXMudmFsdWUpIDogdGhpcy52YWx1ZSk7XG4gIH1cblxuICBnZXRDb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGB4LXNsaWRlci0ke2NvbG9yfWA7XG4gIH1cblxuICBnZXRQZXJjZW50YWdlKGFic29sdXRlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKChhYnNvbHV0ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSkgKiAxMDA7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIGNvbnRyb2w/OiBOZ0NvbnRyb2wpIHtcbiAgICBpZiAodGhpcy5jb250cm9sKSB7XG4gICAgICB0aGlzLmNvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jb250cm9sPy5zdGF0dXNDaGFuZ2VzPy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRQb3NpdGlvbkJ5UGVyY2VudGFnZSh0aGlzLnBlcmNlbnRhZ2UpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgYXdhaXQgaW5OZXh0VGljaygpO1xuICAgIHRoaXMuc2V0UG9zaXRpb25CeVBlcmNlbnRhZ2UodGhpcy5wZXJjZW50YWdlKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1sndmFsdWUnXSkge1xuICAgICAgdGhpcy5zZXRQb3NpdGlvbkJ5UGVyY2VudGFnZSh0aGlzLnBlcmNlbnRhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUoc291cmNlOiBudW1iZXIpIHtcbiAgICB0aGlzLnZhbHVlID0gc291cmNlO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHNvdXJjZTogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3Vzb3V0JylcbiAgcHJpdmF0ZSBfZm9jdXNPdXQoKSB7XG4gICAgdGhpcy5vblRvdWNoZWQ/LigpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd0xlZnQnKVxuICBwcml2YXRlIF9kZWNyZWFzZUtleSgpIHtcbiAgICB0aGlzLnZhbHVlID0gTWF0aC5taW4oTWF0aC5tYXgodGhpcy52YWx1ZSAtIHRoaXMuc3RlcCwgdGhpcy5taW4pLCB0aGlzLm1heCk7XG4gICAgdGhpcy5zZXRQb3NpdGlvbkJ5UGVyY2VudGFnZSh0aGlzLnBlcmNlbnRhZ2UpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd1JpZ2h0JylcbiAgcHJpdmF0ZSBfaW5jcmVhc2VLZXkoKSB7XG4gICAgdGhpcy52YWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMudmFsdWUgKyB0aGlzLnN0ZXAsIHRoaXMubWluKSwgdGhpcy5tYXgpO1xuICAgIHRoaXMuc2V0UG9zaXRpb25CeVBlcmNlbnRhZ2UodGhpcy5wZXJjZW50YWdlKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQueCddKVxuICBhc3luYyBtb3ZlKHNjcmVlblg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yT2Zmc2V0ID0gNTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5ob3N0UmVjdDtcbiAgICBjb25zdCB3aWR0aCA9IHJlY3Qud2lkdGggLSAxMDtcblxuICAgIGNvbnN0IHBvcyA9IE1hdGgubWluKE1hdGgubWF4KHNjcmVlblggLSByZWN0LnggLSBjdXJzb3JPZmZzZXQsIDApLCB3aWR0aCk7XG4gICAgY29uc3QgdmFsdWUgPSAocG9zIC8gd2lkdGgpICogKHRoaXMubWF4IC0gdGhpcy5taW4pOyAvLyAwIDwtPiBtYXggLSBtaW5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyB0aGlzLnN0ZXApICogdGhpcy5zdGVwO1xuXG4gICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlICsgdGhpcy5taW47XG4gICAgdGhpcy5zZXRQb3NpdGlvbkJ5UGVyY2VudGFnZSh0aGlzLnBlcmNlbnRhZ2UpO1xuICAgIGF3YWl0IGluTmV4dFRpY2soKTtcblxuICAgIHRoaXMudG9vbHRpcFJlZi5zaG93KDApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaG9zdFJlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tFbG0ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSBhcyBET01SZWN0O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQb3NpdGlvbkJ5UGVyY2VudGFnZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fcG9zWC5uZXh0KCh2YWx1ZSAvIDEwMCkgKiB0aGlzLmhvc3RSZWN0LndpZHRoIC0gNSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ4LXNsaWRlclwiIFtjbGFzcy54LXNsaWRlci1kaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICA8ZGl2IFtjbGFzc109XCIneC1zbGlkZXItdHJhY2sgJyArIGdldENvbG9yKGNvbG9yKVwiPlxuICAgIDxkaXYgW3N0eWxlLndpZHRoLiVdPVwid2lkdGhcIiBbY2xhc3NdPVwiJ3gtc2xpZGVyLXRyYWNrLWhhbGYgJyArIGdldENvbG9yKHNlY29uZENvbG9yID8/ICdub25lJylcIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIngtc2xpZGVyLWNvbnRhaW5lclwiICN0cmFjaz5cbiAgICA8ZGl2XG4gICAgICBbdGFiaW5kZXhdPVwiZGlzYWJsZWQgPyAtMSA6IDBcIlxuICAgICAgY2RrRHJhZ1xuICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbY2RrRHJhZ0ZyZWVEcmFnUG9zaXRpb25dPVwiKHBvc2l0aW9uJCB8IGFzeW5jKSA/PyB7IHg6IDAsIHk6IDAgfVwiXG4gICAgICAoY2RrRHJhZ01vdmVkKT1cIm1vdmUoJGV2ZW50LnBvaW50ZXJQb3NpdGlvbi54KVwiXG4gICAgICBjbGFzcz1cIngtc2xpZGVyLXRodW1iXCJcbiAgICAgIHh1aVRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgIFt4dWlUb29sdGlwXT1cInRvb2x0aXBcIlxuICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09XCJ0b29sdGlwRGlzYWJsZWRcIlxuICAgICAgI3Rvb2x0aXBSZWY9XCJ4dWlUb29sdGlwXCJcbiAgICA+PC9kaXY+XG5cbiAgICA8ZGl2XG4gICAgICAqbmdGb3I9XCJsZXQgbWFyayBvZiBtYXJrc1wiXG4gICAgICBbc3R5bGUubGVmdC4lXT1cImdldFBlcmNlbnRhZ2UobWFyay52YWx1ZSlcIlxuICAgICAgY2xhc3M9XCJ4LXNsaWRlci1tYXJrXCJcbiAgICAgIFtjbGFzc109XCJtYXJrLmNvbG9yID8gJ3gtc2xpZGVyLW1hcmstJyArIG1hcmsuY29sb3IgOiAnJ1wiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cIngtc2xpZGVyLW1hcmstbGFiZWxcIj57eyBtYXJrLmxhYmVsIH19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwieC1zbGlkZXItbWFyay1kYXNoXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=