@taiga-ui/kit
Version:
Taiga UI Angular main components kit
124 lines • 35 kB
JavaScript
import { ChangeDetectionStrategy, Component, computed, inject, Input, signal, } from '@angular/core';
import { NgControl, NgModel } from '@angular/forms';
import { tuiWatch } from '@taiga-ui/cdk/observables';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { tuiRound } from '@taiga-ui/cdk/utils/math';
import { tuiAsAuxiliary } from '@taiga-ui/core/tokens';
import { take } from 'rxjs';
import { TUI_FLOATING_PRECISION } from './helpers/key-steps';
import { TuiSliderKeyStepsBase } from './helpers/slider-key-steps.directive';
import { TUI_SLIDER_OPTIONS } from './slider.options';
import * as i0 from "@angular/core";
class TuiSliderComponent {
constructor() {
this.control = inject(NgControl, { self: true, optional: true });
this.options = inject(TUI_SLIDER_OPTIONS);
this.segments = signal([1]);
this.ticksGradient = computed((segments = this.segments()) => this.getTicksGradient(segments));
this.size = this.options.size;
this.el = tuiInjectElement();
this.keySteps = inject(TuiSliderKeyStepsBase, {
self: true,
optional: true,
});
if (this.control instanceof NgModel) {
/**
* The ValueAccessor.writeValue method is called twice on any value accessor during component initialization,
* when a control is bound using [(ngModel)], first time with a phantom null value.
* With `changeDetection: ChangeDetectionStrategy.OnPush` the second call of writeValue with real value don't re-render the view.
* ___
* See this {@link https://github.com/angular/angular/issues/14988 issue}
*/
this.control.valueChanges?.pipe(tuiWatch(), take(1)).subscribe();
}
}
// TODO(v5): use signal inputs
set segmentsSetter(segments) {
this.segments.set(segments);
}
get valueRatio() {
return (this.value - this.min) / (this.max - this.min) || 0;
}
get min() {
return Number(this.el.min);
}
set min(x) {
this.el.min = String(x);
}
get max() {
return Number(this.el.max || 100);
}
set max(x) {
this.el.max = String(x);
}
get step() {
if (!this.el.step) {
return 1;
}
return this.el.step === 'any' ? 0 : Number(this.el.step);
}
set step(x) {
this.el.step = String(x);
}
get value() {
/**
* If developer uses `[(ngModel)]` and programmatically change value,
* the `el.nativeElement.value` is equal to the previous value at this moment
* (it will be updated only in next microtask).
* @see https://github.com/angular/angular/issues/13568
*/
if (this.control instanceof NgModel) {
const transformer = this.keySteps?.transformer();
const value = transformer
? transformer.fromControlValue(this.control.value)
: this.control.viewModel;
return this.step
? tuiRound(Math.round(value / this.step) * this.step, TUI_FLOATING_PRECISION)
: value;
}
return Number(this.el.value) || 0;
}
set value(newValue) {
this.el.value = `${newValue}`;
}
getTicksGradient(segments) {
if (segments.length <= 1) {
return 'linear-gradient(to right, transparent 0 100%)';
}
const percentages = segments
.filter((segment) => segment > 0 && segment < 1)
.map((segment) => segment * 100);
return percentages.reduce((acc, segment, index) => `${acc}
var(--tui-text-tertiary) ${segment}% calc(${segment}% + var(--t-tick-thickness)),
transparent ${segment}% ${percentages[index + 1] ?? 100}%${percentages[index + 1] ? ',' : ')'}
`, `linear-gradient(to right, transparent 0 ${percentages[0]}%,`);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: TuiSliderComponent, isStandalone: true, selector: "input[type=range][tuiSlider]", inputs: { size: "size", segmentsSetter: ["segments", "segmentsSetter", (x) => Array.isArray(x) ? x : new Array(x).fill(null).map((_, i) => i / x)] }, host: { listeners: { "input": "0" }, properties: { "style.--tui-slider-track-color": "options.trackColor", "style.--tui-ticks-gradient": "ticksGradient()", "style.--tui-slider-fill-ratio": "valueRatio", "attr.data-size": "size" } }, providers: [tuiAsAuxiliary(TuiSliderComponent)], ngImport: i0, template: '', isInline: true, styles: [":host{--t-tick-thickness: .25rem;position:relative;display:block;inline-size:100%;color:var(--tui-background-accent-1);cursor:pointer;-webkit-appearance:none;appearance:none;block-size:.125rem;padding:.4375rem 0;background-color:transparent;background-clip:content-box;outline:none;border-radius:var(--tui-radius-m)}:host:active{cursor:ew-resize}:host:disabled{opacity:var(--tui-disabled-opacity);cursor:auto}:host[data-size=s]:not(:disabled):before{transition-property:transform,opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:absolute;top:.25rem;left:var(--t-left);inset-inline-start:var(--t-left);inline-size:.5rem;block-size:.5rem;border-radius:50%;transform:var(--tui-slider-thumb-transform, scale(1));--t-left: calc(var(--tui-slider-fill-ratio) * 100% - var(--tui-slider-fill-ratio) * .5rem);content:\"\";cursor:ew-resize;background:currentColor;opacity:0}:host[data-size=s]:active:before{opacity:.2;transform:var(--tui-slider-thumb-transform, scale(1)) scale(2.33)}:host[data-size=m]:not(:disabled):before{transition-property:transform,opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:absolute;top:.125rem;left:var(--t-left);inset-inline-start:var(--t-left);inline-size:.75rem;block-size:.75rem;border-radius:50%;transform:var(--tui-slider-thumb-transform, scale(1));--t-left: calc(var(--tui-slider-fill-ratio) * 100% - var(--tui-slider-fill-ratio) * .75rem);content:\"\";cursor:ew-resize;background:currentColor;opacity:0}:host[data-size=m]:active:before{opacity:.2;transform:var(--tui-slider-thumb-transform, scale(1)) scale(2.33)}:host::-webkit-slider-container{border-radius:inherit}:host[data-size=m]::-webkit-slider-runnable-track{block-size:.125rem;border-radius:inherit;background-repeat:no-repeat;background-color:var(--tui-slider-track-color);background-image:var(--tui-ticks-gradient),linear-gradient(to var(--tui-inline-end),currentColor calc(100% * var(--tui-slider-fill-ratio)),transparent calc(100% * var(--tui-slider-fill-ratio)));background-position-x:calc((.75rem - var(--t-tick-thickness)) / 2),0;background-size:calc(100% - .75rem),auto}:host[data-size=s]::-webkit-slider-runnable-track{block-size:.125rem;border-radius:inherit;background-repeat:no-repeat;background-color:var(--tui-slider-track-color);background-image:var(--tui-ticks-gradient),linear-gradient(to var(--tui-inline-end),currentColor calc(100% * var(--tui-slider-fill-ratio)),transparent calc(100% * var(--tui-slider-fill-ratio)));background-position-x:calc((.5rem - var(--t-tick-thickness)) / 2),0;background-size:calc(100% - .5rem),auto}:host[data-size=m]::-moz-range-track{block-size:.125rem;border-radius:inherit;background-repeat:no-repeat;background-color:var(--tui-slider-track-color);background-image:var(--tui-ticks-gradient);background-position-x:calc((.75rem - var(--t-tick-thickness)) / 2);background-size:calc(100% - .75rem)}:host[data-size=s]::-moz-range-track{block-size:.125rem;border-radius:inherit;background-repeat:no-repeat;background-color:var(--tui-slider-track-color);background-image:var(--tui-ticks-gradient);background-position-x:calc((.5rem - var(--t-tick-thickness)) / 2);background-size:calc(100% - .5rem)}:host[data-size=m]::-webkit-slider-thumb{-webkit-transition-property:transform;transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;isolation:isolate;-webkit-appearance:none;appearance:none;background-color:currentColor;box-shadow:none;border-radius:50%;block-size:.75rem;inline-size:.75rem;box-sizing:content-box;background-clip:content-box;border:.125rem solid transparent;border-inline-start:0;border-inline-end:0;transform:var(--tui-slider-thumb-transform, scale(1));margin-block-start:-.4375rem}:not(:disabled):host[data-size=m]::-webkit-slider-thumb{cursor:ew-resize}:not(:disabled):host[data-size=m]::-webkit-slider-thumb:hover,:active:not(:disabled):host[data-size=m]::-webkit-slider-thumb{transform:var(--tui-slider-thumb-transform, scale(1)) scale(1.333)}:focus-visible:host[data-size=m]::-webkit-slider-thumb{box-shadow:0 0 0 2px inset var(--tui-border-focus)}:host[data-size=s]::-webkit-slider-thumb{-webkit-transition-property:transform;transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;isolation:isolate;-webkit-appearance:none;appearance:none;background-color:currentColor;box-shadow:none;border-radius:50%;block-size:.5rem;inline-size:.5rem;box-sizing:content-box;background-clip:content-box;border:.25rem solid transparent;border-inline-start:0;border-inline-end:0;transform:var(--tui-slider-thumb-transform, scale(1));margin-block-start:-.4375rem}:not(:disabled):host[data-size=s]::-webkit-slider-thumb{cursor:ew-resize}:not(:disabled):host[data-size=s]::-webkit-slider-thumb:hover,:active:not(:disabled):host[data-size=s]::-webkit-slider-thumb{transform:var(--tui-slider-thumb-transform, scale(1)) scale(1.5)}:focus-visible:host[data-size=s]::-webkit-slider-thumb{box-shadow:0 0 0 2px inset var(--tui-border-focus)}:host[data-size=m]::-moz-range-thumb{-moz-transition-property:transform;transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;isolation:isolate;-webkit-appearance:none;appearance:none;background-color:currentColor;box-shadow:none;border-radius:50%;block-size:.75rem;inline-size:.75rem;box-sizing:content-box;background-clip:content-box;border:.125rem solid transparent;border-inline-start:0;border-inline-end:0;transform:var(--tui-slider-thumb-transform, scale(1))}:not(:disabled):host[data-size=m]::-moz-range-thumb{cursor:ew-resize}:not(:disabled):host[data-size=m]::-moz-range-thumb:hover,:active:not(:disabled):host[data-size=m]::-moz-range-thumb{transform:var(--tui-slider-thumb-transform, scale(1)) scale(1.333)}:focus-visible:host[data-size=m]::-moz-range-thumb{box-shadow:0 0 0 2px inset var(--tui-border-focus)}:host[data-size=s]::-moz-range-thumb{-moz-transition-property:transform;transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;isolation:isolate;-webkit-appearance:none;appearance:none;background-color:currentColor;box-shadow:none;border-radius:50%;block-size:.5rem;inline-size:.5rem;box-sizing:content-box;background-clip:content-box;border:.25rem solid transparent;border-inline-start:0;border-inline-end:0;transform:var(--tui-slider-thumb-transform, scale(1))}:not(:disabled):host[data-size=s]::-moz-range-thumb{cursor:ew-resize}:not(:disabled):host[data-size=s]::-moz-range-thumb:hover,:active:not(:disabled):host[data-size=s]::-moz-range-thumb{transform:var(--tui-slider-thumb-transform, scale(1)) scale(1.5)}:focus-visible:host[data-size=s]::-moz-range-thumb{box-shadow:0 0 0 2px inset var(--tui-border-focus)}:host::-moz-range-progress{border-radius:inherit}:host::-moz-range-progress{block-size:.125rem;background:currentColor;border-top-right-radius:0;border-bottom-right-radius:0}:host-context(tui-textfield) :host([type=\"range\"]){--tui-radius: var(--tui-radius-m);position:absolute;top:100%;left:calc(var(--tui-radius) / 2);right:calc(var(--tui-radius) / 2);inline-size:calc(100% - calc(var(--tui-radius) / 2) * 2);box-sizing:border-box;block-size:1rem;margin:-.5625rem 0 0;padding:0;border-top-left-radius:0;border-bottom-left-radius:calc(var(--tui-radius) * 10) calc(var(--tui-radius) * 2);pointer-events:auto}:host-context(tui-textfield[data-size=\"l\"]) :host([type=\"range\"]){--tui-radius: var(--tui-radius-l)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiSliderComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiSliderComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'input[type=range][tuiSlider]', template: '', changeDetection: ChangeDetectionStrategy.OnPush, providers: [tuiAsAuxiliary(TuiSliderComponent)], host: {
/**
* For change detection.
* Webkit does not have built-in method for customization of filling progress (as Firefox).
* We draw filling of progress by `background: linear-gradient(...)` of the track.
* This function triggers change detection (for {@link valueRatio} getter) when we drag thumb of the input.
*/
'(input)': '0',
'[style.--tui-slider-track-color]': 'options.trackColor',
'[style.--tui-ticks-gradient]': 'ticksGradient()',
'[style.--tui-slider-fill-ratio]': 'valueRatio',
'[attr.data-size]': 'size',
}, styles: [":host{--t-tick-thickness: .25rem;position:relative;display:block;inline-size:100%;color:var(--tui-background-accent-1);cursor:pointer;-webkit-appearance:none;appearance:none;block-size:.125rem;padding:.4375rem 0;background-color:transparent;background-clip:content-box;outline:none;border-radius:var(--tui-radius-m)}:host:active{cursor:ew-resize}:host:disabled{opacity:var(--tui-disabled-opacity);cursor:auto}:host[data-size=s]:not(:disabled):before{transition-property:transform,opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:absolute;top:.25rem;left:var(--t-left);inset-inline-start:var(--t-left);inline-size:.5rem;block-size:.5rem;border-radius:50%;transform:var(--tui-slider-thumb-transform, scale(1));--t-left: calc(var(--tui-slider-fill-ratio) * 100% - var(--tui-slider-fill-ratio) * .5rem);content:\"\";cursor:ew-resize;background:currentColor;opacity:0}:host[data-size=s]:active:before{opacity:.2;transform:var(--tui-slider-thumb-transform, scale(1)) scale(2.33)}:host[data-size=m]:not(:disabled):before{transition-property:transform,opacity;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:absolute;top:.125rem;left:var(--t-left);inset-inline-start:var(--t-left);inline-size:.75rem;block-size:.75rem;border-radius:50%;transform:var(--tui-slider-thumb-transform, scale(1));--t-left: calc(var(--tui-slider-fill-ratio) * 100% - var(--tui-slider-fill-ratio) * .75rem);content:\"\";cursor:ew-resize;background:currentColor;opacity:0}:host[data-size=m]:active:before{opacity:.2;transform:var(--tui-slider-thumb-transform, scale(1)) scale(2.33)}:host::-webkit-slider-container{border-radius:inherit}:host[data-size=m]::-webkit-slider-runnable-track{block-size:.125rem;border-radius:inherit;background-repeat:no-repeat;background-color:var(--tui-slider-track-color);background-image:var(--tui-ticks-gradient),linear-gradient(to var(--tui-inline-end),currentColor calc(100% * var(--tui-slider-fill-ratio)),transparent calc(100% * var(--tui-slider-fill-ratio)));background-position-x:calc((.75rem - var(--t-tick-thickness)) / 2),0;background-size:calc(100% - .75rem),auto}:host[data-size=s]::-webkit-slider-runnable-track{block-size:.125rem;border-radius:inherit;background-repeat:no-repeat;background-color:var(--tui-slider-track-color);background-image:var(--tui-ticks-gradient),linear-gradient(to var(--tui-inline-end),currentColor calc(100% * var(--tui-slider-fill-ratio)),transparent calc(100% * var(--tui-slider-fill-ratio)));background-position-x:calc((.5rem - var(--t-tick-thickness)) / 2),0;background-size:calc(100% - .5rem),auto}:host[data-size=m]::-moz-range-track{block-size:.125rem;border-radius:inherit;background-repeat:no-repeat;background-color:var(--tui-slider-track-color);background-image:var(--tui-ticks-gradient);background-position-x:calc((.75rem - var(--t-tick-thickness)) / 2);background-size:calc(100% - .75rem)}:host[data-size=s]::-moz-range-track{block-size:.125rem;border-radius:inherit;background-repeat:no-repeat;background-color:var(--tui-slider-track-color);background-image:var(--tui-ticks-gradient);background-position-x:calc((.5rem - var(--t-tick-thickness)) / 2);background-size:calc(100% - .5rem)}:host[data-size=m]::-webkit-slider-thumb{-webkit-transition-property:transform;transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;isolation:isolate;-webkit-appearance:none;appearance:none;background-color:currentColor;box-shadow:none;border-radius:50%;block-size:.75rem;inline-size:.75rem;box-sizing:content-box;background-clip:content-box;border:.125rem solid transparent;border-inline-start:0;border-inline-end:0;transform:var(--tui-slider-thumb-transform, scale(1));margin-block-start:-.4375rem}:not(:disabled):host[data-size=m]::-webkit-slider-thumb{cursor:ew-resize}:not(:disabled):host[data-size=m]::-webkit-slider-thumb:hover,:active:not(:disabled):host[data-size=m]::-webkit-slider-thumb{transform:var(--tui-slider-thumb-transform, scale(1)) scale(1.333)}:focus-visible:host[data-size=m]::-webkit-slider-thumb{box-shadow:0 0 0 2px inset var(--tui-border-focus)}:host[data-size=s]::-webkit-slider-thumb{-webkit-transition-property:transform;transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;isolation:isolate;-webkit-appearance:none;appearance:none;background-color:currentColor;box-shadow:none;border-radius:50%;block-size:.5rem;inline-size:.5rem;box-sizing:content-box;background-clip:content-box;border:.25rem solid transparent;border-inline-start:0;border-inline-end:0;transform:var(--tui-slider-thumb-transform, scale(1));margin-block-start:-.4375rem}:not(:disabled):host[data-size=s]::-webkit-slider-thumb{cursor:ew-resize}:not(:disabled):host[data-size=s]::-webkit-slider-thumb:hover,:active:not(:disabled):host[data-size=s]::-webkit-slider-thumb{transform:var(--tui-slider-thumb-transform, scale(1)) scale(1.5)}:focus-visible:host[data-size=s]::-webkit-slider-thumb{box-shadow:0 0 0 2px inset var(--tui-border-focus)}:host[data-size=m]::-moz-range-thumb{-moz-transition-property:transform;transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;isolation:isolate;-webkit-appearance:none;appearance:none;background-color:currentColor;box-shadow:none;border-radius:50%;block-size:.75rem;inline-size:.75rem;box-sizing:content-box;background-clip:content-box;border:.125rem solid transparent;border-inline-start:0;border-inline-end:0;transform:var(--tui-slider-thumb-transform, scale(1))}:not(:disabled):host[data-size=m]::-moz-range-thumb{cursor:ew-resize}:not(:disabled):host[data-size=m]::-moz-range-thumb:hover,:active:not(:disabled):host[data-size=m]::-moz-range-thumb{transform:var(--tui-slider-thumb-transform, scale(1)) scale(1.333)}:focus-visible:host[data-size=m]::-moz-range-thumb{box-shadow:0 0 0 2px inset var(--tui-border-focus)}:host[data-size=s]::-moz-range-thumb{-moz-transition-property:transform;transition-property:transform;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;isolation:isolate;-webkit-appearance:none;appearance:none;background-color:currentColor;box-shadow:none;border-radius:50%;block-size:.5rem;inline-size:.5rem;box-sizing:content-box;background-clip:content-box;border:.25rem solid transparent;border-inline-start:0;border-inline-end:0;transform:var(--tui-slider-thumb-transform, scale(1))}:not(:disabled):host[data-size=s]::-moz-range-thumb{cursor:ew-resize}:not(:disabled):host[data-size=s]::-moz-range-thumb:hover,:active:not(:disabled):host[data-size=s]::-moz-range-thumb{transform:var(--tui-slider-thumb-transform, scale(1)) scale(1.5)}:focus-visible:host[data-size=s]::-moz-range-thumb{box-shadow:0 0 0 2px inset var(--tui-border-focus)}:host::-moz-range-progress{border-radius:inherit}:host::-moz-range-progress{block-size:.125rem;background:currentColor;border-top-right-radius:0;border-bottom-right-radius:0}:host-context(tui-textfield) :host([type=\"range\"]){--tui-radius: var(--tui-radius-m);position:absolute;top:100%;left:calc(var(--tui-radius) / 2);right:calc(var(--tui-radius) / 2);inline-size:calc(100% - calc(var(--tui-radius) / 2) * 2);box-sizing:border-box;block-size:1rem;margin:-.5625rem 0 0;padding:0;border-top-left-radius:0;border-bottom-left-radius:calc(var(--tui-radius) * 10) calc(var(--tui-radius) * 2);pointer-events:auto}:host-context(tui-textfield[data-size=\"l\"]) :host([type=\"range\"]){--tui-radius: var(--tui-radius-l)}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { size: [{
type: Input
}], segmentsSetter: [{
type: Input,
args: [{
alias: 'segments',
transform: (x) => Array.isArray(x) ? x : new Array(x).fill(null).map((_, i) => i / x),
}]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL3NsaWRlci9zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFMUIsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7O0FBRXBELE1BcUJhLGtCQUFrQjtJQWtCM0I7UUFqQmlCLFlBQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUV4RCxZQUFPLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDckMsYUFBUSxHQUFHLE1BQU0sQ0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsa0JBQWEsR0FBRyxRQUFRLENBQUMsQ0FB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LENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyx5UEFsRGhFLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUMsMEJBSHJDLEVBQUU7O1NBa0JILGtCQUFrQjs0RkFBbEIsa0JBQWtCO2tCQXJCOUIsU0FBUztpQ0FDTSxJQUFJLFlBQ04sOEJBQThCLFlBQzlCLEVBQUUsbUJBRUssdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLGNBQWMsb0JBQW9CLENBQUMsUUFDekM7d0JBQ0Y7Ozs7OzJCQUtHO3dCQUNILFNBQVMsRUFBRSxHQUFHO3dCQUNkLGtDQUFrQyxFQUFFLG9CQUFvQjt3QkFDeEQsOEJBQThCLEVBQUUsaUJBQWlCO3dCQUNqRCxpQ0FBaUMsRUFBRSxZQUFZO3dCQUMvQyxrQkFBa0IsRUFBRSxNQUFNO3FCQUM3QjswRUFZTSxJQUFJO3NCQURWLEtBQUs7Z0JBNEJLLGNBQWM7c0JBTHhCLEtBQUs7dUJBQUM7d0JBQ0gsS0FBSyxFQUFFLFVBQVU7d0JBQ2pCLFNBQVMsRUFBRSxDQUFDLENBQW9CLEVBQUUsRUFBRSxDQUNoQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUMxRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOZ0NvbnRyb2wsIE5nTW9kZWx9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7dHVpV2F0Y2h9IGZyb20gJ0B0YWlnYS11aS9jZGsvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHt0dWlJbmplY3RFbGVtZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2RvbSc7XG5pbXBvcnQge3R1aVJvdW5kfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21hdGgnO1xuaW1wb3J0IHt0dWlBc0F1eGlsaWFyeX0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB0eXBlIHtUdWlTaXplU30gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHt0YWtlfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtUVUlfRkxPQVRJTkdfUFJFQ0lTSU9OfSBmcm9tICcuL2hlbHBlcnMva2V5LXN0ZXBzJztcbmltcG9ydCB7VHVpU2xpZGVyS2V5U3RlcHNCYXNlfSBmcm9tICcuL2hlbHBlcnMvc2xpZGVyLWtleS1zdGVwcy5kaXJlY3RpdmUnO1xuaW1wb3J0IHtUVUlfU0xJREVSX09QVElPTlN9IGZyb20gJy4vc2xpZGVyLm9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHlwZT1yYW5nZV1bdHVpU2xpZGVyXScsXG4gICAgdGVtcGxhdGU6ICcnLFxuICAgIHN0eWxlVXJsczogWycuL3NsaWRlci5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbdHVpQXNBdXhpbGlhcnkoVHVpU2xpZGVyQ29tcG9uZW50KV0sXG4gICAgaG9zdDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogRm9yIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICAgICAqIFdlYmtpdCBkb2VzIG5vdCBoYXZlIGJ1aWx0LWluIG1ldGhvZCBmb3IgY3VzdG9taXphdGlvbiBvZiBmaWxsaW5nIHByb2dyZXNzIChhcyBGaXJlZm94KS5cbiAgICAgICAgICogV2UgZHJhdyBmaWxsaW5nIG9mIHByb2dyZXNzIGJ5IGBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoLi4uKWAgb2YgdGhlIHRyYWNrLlxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gKGZvciB7QGxpbmsgdmFsdWVSYXRpb30gZ2V0dGVyKSB3aGVuIHdlIGRyYWcgdGh1bWIgb2YgdGhlIGlucHV0LlxuICAgICAgICAgKi9cbiAgICAgICAgJyhpbnB1dCknOiAnMCcsXG4gICAgICAgICdbc3R5bGUuLS10dWktc2xpZGVyLXRyYWNrLWNvbG9yXSc6ICdvcHRpb25zLnRyYWNrQ29sb3InLFxuICAgICAgICAnW3N0eWxlLi0tdHVpLXRpY2tzLWdyYWRpZW50XSc6ICd0aWNrc0dyYWRpZW50KCknLFxuICAgICAgICAnW3N0eWxlLi0tdHVpLXNsaWRlci1maWxsLXJhdGlvXSc6ICd2YWx1ZVJhdGlvJyxcbiAgICAgICAgJ1thdHRyLmRhdGEtc2l6ZV0nOiAnc2l6ZScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpU2xpZGVyQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2wgPSBpbmplY3QoTmdDb250cm9sLCB7c2VsZjogdHJ1ZSwgb3B0aW9uYWw6IHRydWV9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KFRVSV9TTElERVJfT1BUSU9OUyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlZ21lbnRzID0gc2lnbmFsPG51bWJlcltdPihbMV0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0aWNrc0dyYWRpZW50ID0gY29tcHV0ZWQoKHNlZ21lbnRzID0gdGhpcy5zZWdtZW50cygpKSA9PlxuICAgICAgICB0aGlzLmdldFRpY2tzR3JhZGllbnQoc2VnbWVudHMpLFxuICAgICk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaXplOiBUdWlTaXplUyA9IHRoaXMub3B0aW9ucy5zaXplO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGVsID0gdHVpSW5qZWN0RWxlbWVudDxIVE1MSW5wdXRFbGVtZW50PigpO1xuICAgIHB1YmxpYyByZWFkb25seSBrZXlTdGVwcyA9IGluamVjdChUdWlTbGlkZXJLZXlTdGVwc0Jhc2UsIHtcbiAgICAgICAgc2VsZjogdHJ1ZSxcbiAgICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbCBpbnN0YW5jZW9mIE5nTW9kZWwpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIFZhbHVlQWNjZXNzb3Iud3JpdGVWYWx1ZSBtZXRob2QgaXMgY2FsbGVkIHR3aWNlIG9uIGFueSB2YWx1ZSBhY2Nlc3NvciBkdXJpbmcgY29tcG9uZW50IGluaXRpYWxpemF0aW9uLFxuICAgICAgICAgICAgICogd2hlbiBhIGNvbnRyb2wgaXMgYm91bmQgdXNpbmcgWyhuZ01vZGVsKV0sIGZpcnN0IHRpbWUgd2l0aCBhIHBoYW50b20gbnVsbCB2YWx1ZS5cbiAgICAgICAgICAgICAqIFdpdGggYGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoYCB0aGUgc2Vjb25kIGNhbGwgb2Ygd3JpdGVWYWx1ZSB3aXRoIHJlYWwgdmFsdWUgZG9uJ3QgcmUtcmVuZGVyIHRoZSB2aWV3LlxuICAgICAgICAgICAgICogX19fXG4gICAgICAgICAgICAgKiBTZWUgdGhpcyB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQ5ODggaXNzdWV9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXM/LnBpcGUodHVpV2F0Y2goKSwgdGFrZSgxKSkuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dHNcbiAgICBASW5wdXQoe1xuICAgICAgICBhbGlhczogJ3NlZ21lbnRzJyxcbiAgICAgICAgdHJhbnNmb3JtOiAoeDogbnVtYmVyW10gfCBudW1iZXIpID0+XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHgpID8geCA6IG5ldyBBcnJheSh4KS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4gaSAvIHgpLFxuICAgIH0pXG4gICAgcHVibGljIHNldCBzZWdtZW50c1NldHRlcihzZWdtZW50czogbnVtYmVyW10pIHtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5zZXQoc2VnbWVudHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsdWVSYXRpbygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikgfHwgMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1pbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTnVtYmVyKHRoaXMuZWwubWluKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IG1pbih4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5lbC5taW4gPSBTdHJpbmcoeCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLmVsLm1heCB8fCAxMDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgbWF4KHg6IG51bWJlcikge1xuICAgICAgICB0aGlzLmVsLm1heCA9IFN0cmluZyh4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLmVsLnN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwuc3RlcCA9PT0gJ2FueScgPyAwIDogTnVtYmVyKHRoaXMuZWwuc3RlcCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzdGVwKHg6IG51bWJlcikge1xuICAgICAgICB0aGlzLmVsLnN0ZXAgPSBTdHJpbmcoeCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBudW1iZXIge1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgZGV2ZWxvcGVyIHVzZXMgYFsobmdNb2RlbCldYCBhbmQgcHJvZ3JhbW1hdGljYWxseSBjaGFuZ2UgdmFsdWUsXG4gICAgICAgICAqIHRoZSBgZWwubmF0aXZlRWxlbWVudC52YWx1ZWAgaXMgZXF1YWwgdG8gdGhlIHByZXZpb3VzIHZhbHVlIGF0IHRoaXMgbW9tZW50XG4gICAgICAgICAqIChpdCB3aWxsIGJlIHVwZGF0ZWQgb25seSBpbiBuZXh0IG1pY3JvdGFzaykuXG4gICAgICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM1NjhcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wgaW5zdGFuY2VvZiBOZ01vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IHRoaXMua2V5U3RlcHM/LnRyYW5zZm9ybWVyKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRyYW5zZm9ybWVyXG4gICAgICAgICAgICAgICAgPyB0cmFuc2Zvcm1lci5mcm9tQ29udHJvbFZhbHVlKHRoaXMuY29udHJvbC52YWx1ZSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuY29udHJvbC52aWV3TW9kZWw7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0ZXBcbiAgICAgICAgICAgICAgICA/IHR1aVJvdW5kKFxuICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodmFsdWUgLyB0aGlzLnN0ZXApICogdGhpcy5zdGVwLFxuICAgICAgICAgICAgICAgICAgICAgIFRVSV9GTE9BVElOR19QUkVDSVNJT04sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBOdW1iZXIodGhpcy5lbC52YWx1ZSkgfHwgMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHZhbHVlKG5ld1ZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5lbC52YWx1ZSA9IGAke25ld1ZhbHVlfWA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFRpY2tzR3JhZGllbnQoc2VnbWVudHM6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2xpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQgMCAxMDAlKSc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwZXJjZW50YWdlcyA9IHNlZ21lbnRzXG4gICAgICAgICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ID4gMCAmJiBzZWdtZW50IDwgMSlcbiAgICAgICAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQgKiAxMDApO1xuXG4gICAgICAgIHJldHVybiBwZXJjZW50YWdlcy5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjLCBzZWdtZW50LCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICBgJHthY2N9XG4gICAgICAgICAgICAgICAgdmFyKC0tdHVpLXRleHQtdGVydGlhcnkpICR7c2VnbWVudH0lIGNhbGMoJHtzZWdtZW50fSUgKyB2YXIoLS10LXRpY2stdGhpY2tuZXNzKSksXG4gICAgICAgICAgICAgICAgdHJhbnNwYXJlbnQgJHtzZWdtZW50fSUgJHtwZXJjZW50YWdlc1tpbmRleCArIDFdID8/IDEwMH0lJHtwZXJjZW50YWdlc1tpbmRleCArIDFdID8gJywnIDogJyknfVxuICAgICAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBgbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCAwICR7cGVyY2VudGFnZXNbMF19JSxgLFxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==