UNPKG

xui

Version:

xUI Components for Angular

194 lines 24.9 kB
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=