UNPKG

@taiga-ui/kit

Version:
266 lines • 32 kB
import { __decorate, __extends, __param } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, HostListener, Inject, Input, Optional, Self, ViewChild, } from '@angular/core'; import { NgControl } from '@angular/forms'; import { AbstractTuiNullableControl, TUI_FOCUSABLE_ITEM_ACCESSOR, tuiDefaultProp, } from '@taiga-ui/cdk'; import { formatNumber, maskedMoneyValueIsEmpty, maskedNumberStringToNumber, tuiCreateAutoCorrectedNumberPipe, tuiCreateNumberMask, TuiPrimitiveTextfieldComponent, } from '@taiga-ui/core'; var DEFAULT_MAX_LENGTH = 18; // @dynamic var TuiInputNumberComponent = /** @class */ (function (_super) { __extends(TuiInputNumberComponent, _super); function TuiInputNumberComponent(control, changeDetectorRef) { var _this = _super.call(this, control, changeDetectorRef) || this; _this.min = -Infinity; _this.max = Infinity; _this.decimal = "not-zero" /* NotZero */; _this.precision = 2; _this.postfix = ''; _this.mask = function (allowNegative, decimal, precision, nativeFocusableElement) { return ({ mask: tuiCreateNumberMask({ allowNegative: allowNegative, allowDecimal: decimal !== 'never', decimalLimit: precision, requireDecimal: decimal === 'always', }), pipe: tuiCreateAutoCorrectedNumberPipe(decimal === 'always' ? precision : 0, ',', nativeFocusableElement || undefined), guide: false, }); }; return _this; } TuiInputNumberComponent_1 = TuiInputNumberComponent; Object.defineProperty(TuiInputNumberComponent.prototype, "nativeFocusableElement", { get: function () { return !this.primitiveTextfield || this.computedDisabled ? null : this.primitiveTextfield.nativeFocusableElement; }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputNumberComponent.prototype, "focused", { get: function () { return !!this.primitiveTextfield && this.primitiveTextfield.focused; }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputNumberComponent.prototype, "isNegativeAllowed", { get: function () { return this.min < 0; }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputNumberComponent.prototype, "inputMode", { get: function () { return this.decimal === 'never' ? "numeric" /* Numeric */ : "decimal" /* Decimal */; }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputNumberComponent.prototype, "calculatedMaxLength", { get: function () { return (DEFAULT_MAX_LENGTH + (this.decimal !== "never" /* Never */ && this.nativeValue.includes(',') ? this.precision + 1 : 0)); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputNumberComponent.prototype, "formattedValue", { get: function () { var value = this.value || 0; var absValue = Math.abs(value); var hasFraction = absValue % 1 > 0; var limit = this.decimal === 'always' || hasFraction ? this.precision : 0; var fraction = hasFraction ? value.toString().split('.')[1].substr(0, this.precision) : ''; if (this.focused && this.decimal !== 'always') { limit = fraction.length; } return formatNumber(value, limit); }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputNumberComponent.prototype, "computedValue", { get: function () { if (this.focused || !this.isNativeValueInLimit) { return this.nativeValue; } if (this.value === null) { return maskedMoneyValueIsEmpty(this.nativeValue) ? this.nativeValue : ''; } return this.formattedValue; }, enumerable: true, configurable: true }); TuiInputNumberComponent.prototype.onValue = function (value) { if (maskedMoneyValueIsEmpty(value)) { this.updateValue(null); return; } if (this.isNativeValueNotFinished) { return; } var capped = this.absoluteCapInputValue(value); if (capped === null || isNaN(capped)) { return; } this.updateValue(capped); if (capped !== maskedNumberStringToNumber(value)) { this.nativeValue = this.formattedValue; } }; TuiInputNumberComponent.prototype.onKeyDown = function (event) { if (event.key !== ',' && event.key !== '.') { return; } if (this.decimal === 'never') { event.preventDefault(); return; } if (this.nativeValue.includes(',')) { event.preventDefault(); this.setCaretAfterComma(); } }; TuiInputNumberComponent.prototype.onFocused = function (focused) { this.updateFocused(focused); if (focused) { return; } var nativeNumberValue = maskedNumberStringToNumber(this.nativeValue); if (isNaN(nativeNumberValue)) { this.clear(); return; } var clamped = Math.min(this.max, Math.max(this.min, nativeNumberValue)); this.updateValue(clamped); this.nativeValue = this.formattedValue; }; TuiInputNumberComponent.prototype.onHovered = function (hovered) { this.updateHovered(hovered); }; TuiInputNumberComponent.prototype.onPressed = function (pressed) { this.updatePressed(pressed); }; TuiInputNumberComponent.prototype.onZero = function (event) { var decimal = this.nativeValue.split(',')[1] || ''; var nativeFocusableElement = this.nativeFocusableElement; if (decimal.length < this.precision || !nativeFocusableElement || !nativeFocusableElement.selectionStart || this.nativeValue[nativeFocusableElement.selectionStart] !== '0') { return; } event.preventDefault(); nativeFocusableElement.selectionStart++; }; Object.defineProperty(TuiInputNumberComponent.prototype, "isNativeValueInLimit", { get: function () { if (this.nativeValue === '') { return true; } var nativeNumberValue = maskedNumberStringToNumber(this.nativeValue); return nativeNumberValue >= this.min && nativeNumberValue <= this.max; }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputNumberComponent.prototype, "isNativeValueNotFinished", { get: function () { var nativeNumberValue = maskedNumberStringToNumber(this.nativeValue); return nativeNumberValue < 0 ? nativeNumberValue > this.max : nativeNumberValue < this.min; }, enumerable: true, configurable: true }); Object.defineProperty(TuiInputNumberComponent.prototype, "nativeValue", { get: function () { return this.nativeFocusableElement ? this.nativeFocusableElement.value : ''; }, set: function (value) { if (!this.primitiveTextfield || !this.nativeFocusableElement) { return; } this.primitiveTextfield.value = value; this.nativeFocusableElement.value = value; }, enumerable: true, configurable: true }); TuiInputNumberComponent.prototype.clear = function () { this.nativeValue = ''; this.updateValue(null); }; TuiInputNumberComponent.prototype.absoluteCapInputValue = function (inputValue) { var value = maskedNumberStringToNumber(inputValue); var capped = value < 0 ? Math.max(this.min, value) : Math.min(value, this.max); var ineligibleValue = isNaN(capped) || capped < this.min || capped > this.max; return ineligibleValue ? null : capped; }; TuiInputNumberComponent.prototype.setCaretAfterComma = function () { if (!this.nativeFocusableElement) { return; } var afterCommaPosition = this.nativeValue.length - this.precision; this.nativeFocusableElement.setSelectionRange(afterCommaPosition, afterCommaPosition); }; var TuiInputNumberComponent_1; TuiInputNumberComponent.ctorParameters = function () { return [ { type: NgControl, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgControl,] }] }, { type: ChangeDetectorRef, decorators: [{ type: Inject, args: [ChangeDetectorRef,] }] } ]; }; __decorate([ Input(), tuiDefaultProp() ], TuiInputNumberComponent.prototype, "min", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputNumberComponent.prototype, "max", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputNumberComponent.prototype, "decimal", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputNumberComponent.prototype, "precision", void 0); __decorate([ Input(), tuiDefaultProp() ], TuiInputNumberComponent.prototype, "postfix", void 0); __decorate([ ViewChild(TuiPrimitiveTextfieldComponent) ], TuiInputNumberComponent.prototype, "primitiveTextfield", void 0); __decorate([ HostListener('keydown.0', ['$event']) ], TuiInputNumberComponent.prototype, "onZero", null); TuiInputNumberComponent = TuiInputNumberComponent_1 = __decorate([ Component({ selector: 'tui-input-number', template: "<tui-primitive-textfield\n class=\"textfield\"\n tuiValueAccessor\n tuiTextfieldInputMode=\"decimal\"\n [pseudoHovered]=\"pseudoHovered\"\n [pseudoFocused]=\"computedFocused\"\n [invalid]=\"computedInvalid\"\n [tuiTextfieldMaxLength]=\"calculatedMaxLength\"\n [readOnly]=\"readOnly\"\n [disabled]=\"computedDisabled\"\n [textMask]=\"isNegativeAllowed | tuiMapper: mask:decimal:precision:nativeFocusableElement\"\n [value]=\"computedValue\"\n [postfix]=\"postfix\"\n [focusable]=\"focusable\"\n (valueChange)=\"onValue($event)\"\n (hoveredChange)=\"onHovered($event)\"\n (focusedChange)=\"onFocused($event)\"\n (pressedChange)=\"onPressed($event)\"\n (keydown)=\"onKeyDown($event)\"\n>\n <ng-content></ng-content>\n</tui-primitive-textfield>\n", changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: TUI_FOCUSABLE_ITEM_ACCESSOR, useExisting: forwardRef(function () { return TuiInputNumberComponent_1; }), }, ], styles: [":host{display:block;border-radius:var(--tui-radius-m)}.textfield{border-radius:inherit}"] }), __param(0, Optional()), __param(0, Self()), __param(0, Inject(NgControl)), __param(1, Inject(ChangeDetectorRef)) ], TuiInputNumberComponent); return TuiInputNumberComponent; }(AbstractTuiNullableControl)); export { TuiInputNumberComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9pbnB1dC1udW1iZXIvIiwic291cmNlcyI6WyJpbnB1dC1udW1iZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEVBQ0gsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQixjQUFjLEdBSWpCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLDBCQUEwQixFQUMxQixnQ0FBZ0MsRUFDaEMsbUJBQW1CLEVBRW5CLDhCQUE4QixHQUVqQyxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLElBQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTlCLFdBQVc7QUFhWDtJQUNZLDJDQUFrQztJQTZDMUMsaUNBSUksT0FBeUIsRUFDRSxpQkFBb0M7UUFMbkUsWUFPSSxrQkFBTSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsU0FDcEM7UUFqREQsU0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBSWhCLFNBQUcsR0FBRyxRQUFRLENBQUM7UUFJZixhQUFPLDRCQUFrQztRQUl6QyxlQUFTLEdBQUcsQ0FBQyxDQUFDO1FBSWQsYUFBTyxHQUFHLEVBQUUsQ0FBQztRQUViLFVBQUksR0FBMkMsVUFDM0MsYUFBc0IsRUFDdEIsT0FBbUIsRUFDbkIsU0FBaUIsRUFDakIsc0JBQStDLElBQzlDLE9BQUEsQ0FBQztZQUNGLElBQUksRUFBRSxtQkFBbUIsQ0FBQztnQkFD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QjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTt3REFDRDtJQUloQjtRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTt3REFDRjtJQUlmO1FBRkMsS0FBSyxFQUFFO1FBQ1AsY0FBYyxFQUFFOzREQUN3QjtJQUl6QztRQUZDLEtBQUssRUFBRTtRQUNQLGNBQWMsRUFBRTs4REFDSDtJQUlkO1FBRkMsS0FBSyxFQUFFO1FBQ1AsY0FBYyxFQUFFOzREQUNKO0lBdUJiO1FBREMsU0FBUyxDQUFDLDhCQUE4QixDQUFDO3VFQUMyQjtJQTJJckU7UUFEQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7eURBZ0JyQztJQXRNUSx1QkFBdUI7UUFabkMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QiwyeUJBQTJDO1lBRTNDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO1lBQy9DLFNBQVMsRUFBRTtnQkFDUDtvQkFDSSxPQUFPLEVBQUUsMkJBQTJCO29CQUNwQyxXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSx5QkFBdUIsRUFBdkIsQ0FBdUIsQ0FBQztpQkFDekQ7YUFDSjs7U0FDSixDQUFDO1FBZ0RPLFdBQUEsUUFBUSxFQUFFLENBQUE7UUFDVixXQUFBLElBQUksRUFBRSxDQUFBO1FBQ04sV0FBQSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFakIsV0FBQSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtPQW5EckIsdUJBQXVCLENBZ1FuQztJQUFELDhCQUFDO0NBQUEsQUFoUUQsQ0FDWSwwQkFBMEIsR0ErUHJDO1NBaFFZLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPcHRpb25hbCxcbiAgICBTZWxmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBBYnN0cmFjdFR1aU51bGxhYmxlQ29udHJvbCxcbiAgICBUVUlfRk9DVVNBQkxFX0lURU1fQUNDRVNTT1IsXG4gICAgdHVpRGVmYXVsdFByb3AsXG4gICAgVHVpRm9jdXNhYmxlRWxlbWVudEFjY2Vzc29yLFxuICAgIFR1aUlucHV0TW9kZSxcbiAgICBUdWlNYXBwZXIsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHtcbiAgICBmb3JtYXROdW1iZXIsXG4gICAgbWFza2VkTW9uZXlWYWx1ZUlzRW1wdHksXG4gICAgbWFza2VkTnVtYmVyU3RyaW5nVG9OdW1iZXIsXG4gICAgdHVpQ3JlYXRlQXV0b0NvcnJlY3RlZE51bWJlclBpcGUsXG4gICAgdHVpQ3JlYXRlTnVtYmVyTWFzayxcbiAgICBUdWlEZWNpbWFsLFxuICAgIFR1aVByaW1pdGl2ZVRleHRmaWVsZENvbXBvbmVudCxcbiAgICBUdWlUZXh0TWFza09wdGlvbnMsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcblxuY29uc3QgREVGQVVMVF9NQVhfTEVOR1RIID0gMTg7XG5cbi8vIEBkeW5hbWljXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3R1aS1pbnB1dC1udW1iZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC1udW1iZXIudGVtcGxhdGUuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtbnVtYmVyLnN0eWxlLmxlc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVFVJX0ZPQ1VTQUJMRV9JVEVNX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVHVpSW5wdXROdW1iZXJDb21wb25lbnQpLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFR1aUlucHV0TnVtYmVyQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBBYnN0cmFjdFR1aU51bGxhYmxlQ29udHJvbDxudW1iZXI+XG4gICAgaW1wbGVtZW50cyBUdWlGb2N1c2FibGVFbGVtZW50QWNjZXNzb3Ige1xuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBtaW4gPSAtSW5maW5pdHk7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgbWF4ID0gSW5maW5pdHk7XG5cbiAgICBASW5wdXQoKVxuICAgIEB0dWlEZWZhdWx0UHJvcCgpXG4gICAgZGVjaW1hbDogVHVpRGVjaW1hbCA9IFR1aURlY2ltYWwuTm90WmVybztcblxuICAgIEBJbnB1dCgpXG4gICAgQHR1aURlZmF1bHRQcm9wKClcbiAgICBwcmVjaXNpb24gPSAyO1xuXG4gICAgQElucHV0KClcbiAgICBAdHVpRGVmYXVsdFByb3AoKVxuICAgIHBvc3RmaXggPSAnJztcblxuICAgIG1hc2s6IFR1aU1hcHBlcjxib29sZWFuLCBUdWlUZXh0TWFza09wdGlvbnM+ID0gKFxuICAgICAgICBhbGxvd05lZ2F0aXZlOiBib29sZWFuLFxuICAgICAgICBkZWNpbWFsOiBUdWlEZWNpbWFsLFxuICAgICAgICBwcmVjaXNpb246IG51bWJlcixcbiAgICAgICAgbmF0aXZlRm9jdXNhYmxlRWxlbWVudDogSFRNTElucHV0RWxlbWVudCB8IG51bGwsXG4gICAgKSA9PiAoe1xuICAgICAgICBtYXNrOiB0dWlDcmVhdGVOdW1iZXJNYXNrKHtcbiAgICAgICAgICAgIGFsbG93TmVnYXRpdmU6IGFsbG93TmVnYXRpdmUsXG4gICAgICAgICAgICBhbGxvd0RlY2ltYWw6IGRlY2ltYWwgIT09ICduZXZlcicsXG4gICAgICAgICAgICBkZWNpbWFsTGltaXQ6IHByZWNpc2lvbixcbiAgICAgICAgICAgIHJlcXVpcmVEZWNpbWFsOiBkZWNpbWFsID09PSAnYWx3YXlzJyxcbiAgICAgICAgfSksXG4gICAgICAgIHBpcGU6IHR1aUNyZWF0ZUF1dG9Db3JyZWN0ZWROdW1iZXJQaXBlKFxuICAgICAgICAgICAgZGVjaW1hbCA9PT0gJ2Fsd2F5cycgPyBwcmVjaXNpb24gOiAwLFxuICAgICAgICAgICAgJywnLFxuICAgICAgICAgICAgbmF0aXZlRm9jdXNhYmxlRWxlbWVudCB8fCB1bmRlZmluZWQsXG4gICAgICAgICksXG4gICAgICAgIGd1aWRlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIEBWaWV3Q2hpbGQoVHVpUHJpbWl0aXZlVGV4dGZpZWxkQ29tcG9uZW50KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpbWl0aXZlVGV4dGZpZWxkPzogVHVpUHJpbWl0aXZlVGV4dGZpZWxkQ29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBTZWxmKClcbiAgICAgICAgQEluamVjdChOZ0NvbnRyb2wpXG4gICAgICAgIGNvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwsXG4gICAgICAgIEBJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoY29udHJvbCwgY2hhbmdlRGV0ZWN0b3JSZWYpO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVGb2N1c2FibGVFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByaW1pdGl2ZVRleHRmaWVsZCB8fCB0aGlzLmNvbXB1dGVkRGlzYWJsZWRcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiB0aGlzLnByaW1pdGl2ZVRleHRmaWVsZC5uYXRpdmVGb2N1c2FibGVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCBmb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnByaW1pdGl2ZVRleHRmaWVsZCAmJiB0aGlzLnByaW1pdGl2ZVRleHRmaWVsZC5mb2N1c2VkO1xuICAgIH1cblxuICAgIGdldCBpc05lZ2F0aXZlQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluIDwgMDtcbiAgICB9XG5cbiAgICBnZXQgaW5wdXRNb2RlKCk6IFR1aUlucHV0TW9kZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY2ltYWwgPT09ICduZXZlcicgPyBUdWlJbnB1dE1vZGUuTnVtZXJpYyA6IFR1aUlucHV0TW9kZS5EZWNpbWFsO1xuICAgIH1cblxuICAgIGdldCBjYWxjdWxhdGVkTWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBERUZBVUxUX01BWF9MRU5HVEggK1xuICAgICAgICAgICAgKHRoaXMuZGVjaW1hbCAhPT0gVHVpRGVjaW1hbC5OZXZlciAmJiB0aGlzLm5hdGl2ZVZhbHVlLmluY2x1ZGVzKCcsJylcbiAgICAgICAgICAgICAgICA/IHRoaXMucHJlY2lzaW9uICsgMVxuICAgICAgICAgICAgICAgIDogMClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXQgZm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlIHx8IDA7XG4gICAgICAgIGNvbnN0IGFic1ZhbHVlID0gTWF0aC5hYnModmFsdWUpO1xuICAgICAgICBjb25zdCBoYXNGcmFjdGlvbiA9IGFic1ZhbHVlICUgMSA+IDA7XG4gICAgICAgIGxldCBsaW1pdCA9IHRoaXMuZGVjaW1hbCA9PT0gJ2Fsd2F5cycgfHwgaGFzRnJhY3Rpb24gPyB0aGlzLnByZWNpc2lvbiA6IDA7XG5cbiAgICAgICAgY29uc3QgZnJhY3Rpb24gPSBoYXNGcmFjdGlvblxuICAgICAgICAgICAgPyB2YWx1ZS50b1N0cmluZygpLnNwbGl0KCcuJylbMV0uc3Vic3RyKDAsIHRoaXMucHJlY2lzaW9uKVxuICAgICAgICAgICAgOiAnJztcblxuICAgICAgICBpZiAodGhpcy5mb2N1c2VkICYmIHRoaXMuZGVjaW1hbCAhPT0gJ2Fsd2F5cycpIHtcbiAgICAgICAgICAgIGxpbWl0ID0gZnJhY3Rpb24ubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcih2YWx1ZSwgbGltaXQpO1xuICAgIH1cblxuICAgIGdldCBjb21wdXRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWQgfHwgIXRoaXMuaXNOYXRpdmVWYWx1ZUluTGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZVZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXNrZWRNb25leVZhbHVlSXNFbXB0eSh0aGlzLm5hdGl2ZVZhbHVlKSA/IHRoaXMubmF0aXZlVmFsdWUgOiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdHRlZFZhbHVlO1xuICAgIH1cblxuICAgIG9uVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAobWFza2VkTW9uZXlWYWx1ZUlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKG51bGwpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc05hdGl2ZVZhbHVlTm90RmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhcHBlZCA9IHRoaXMuYWJzb2x1dGVDYXBJbnB1dFZhbHVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY2FwcGVkID09PSBudWxsIHx8IGlzTmFOKGNhcHBlZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoY2FwcGVkKTtcblxuICAgICAgICBpZiAoY2FwcGVkICE9PSBtYXNrZWROdW1iZXJTdHJpbmdUb051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSB0aGlzLmZvcm1hdHRlZFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5rZXkgIT09ICcsJyAmJiBldmVudC5rZXkgIT09ICcuJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVjaW1hbCA9PT0gJ25ldmVyJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmF0aXZlVmFsdWUuaW5jbHVkZXMoJywnKSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FyZXRBZnRlckNvbW1hKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkZvY3VzZWQoZm9jdXNlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZUZvY3VzZWQoZm9jdXNlZCk7XG5cbiAgICAgICAgaWYgKGZvY3VzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hdGl2ZU51bWJlclZhbHVlID0gbWFza2VkTnVtYmVyU3RyaW5nVG9OdW1iZXIodGhpcy5uYXRpdmVWYWx1ZSk7XG5cbiAgICAgICAgaWYgKGlzTmFOKG5hdGl2ZU51bWJlclZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4odGhpcy5tYXgsIE1hdGgubWF4KHRoaXMubWluLCBuYXRpdmVOdW1iZXJWYWx1ZSkpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoY2xhbXBlZCk7XG4gICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSB0aGlzLmZvcm1hdHRlZFZhbHVlO1xuICAgIH1cblxuICAgIG9uSG92ZXJlZChob3ZlcmVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudXBkYXRlSG92ZXJlZChob3ZlcmVkKTtcbiAgICB9XG5cbiAgICBvblByZXNzZWQocHJlc3NlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnVwZGF0ZVByZXNzZWQocHJlc3NlZCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi4wJywgWyckZXZlbnQnXSlcbiAgICBvblplcm8oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgY29uc3QgZGVjaW1hbCA9IHRoaXMubmF0aXZlVmFsdWUuc3BsaXQoJywnKVsxXSB8fCAnJztcbiAgICAgICAgY29uc3Qge25hdGl2ZUZvY3VzYWJsZUVsZW1lbnR9ID0gdGhpcztcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWNpbWFsLmxlbmd0aCA8IHRoaXMucHJlY2lzaW9uIHx8XG4gICAgICAgICAgICAhbmF0aXZlRm9jdXNhYmxlRWxlbWVudCB8fFxuICAgICAgICAgICAgIW5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQgfHxcbiAgICAgICAgICAgIHRoaXMubmF0aXZlVmFsdWVbbmF0aXZlRm9jdXNhYmxlRWxlbWVudC5zZWxlY3Rpb25TdGFydF0gIT09ICcwJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQrKztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpc05hdGl2ZVZhbHVlSW5MaW1pdCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlVmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hdGl2ZU51bWJlclZhbHVlID0gbWFza2VkTnVtYmVyU3RyaW5nVG9OdW1iZXIodGhpcy5uYXRpdmVWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5hdGl2ZU51bWJlclZhbHVlID49IHRoaXMubWluICYmIG5hdGl2ZU51bWJlclZhbHVlIDw9IHRoaXMubWF4O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGlzTmF0aXZlVmFsdWVOb3RGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbmF0aXZlTnVtYmVyVmFsdWUgPSBtYXNrZWROdW1iZXJTdHJpbmdUb051bWJlcih0aGlzLm5hdGl2ZVZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmF0aXZlTnVtYmVyVmFsdWUgPCAwXG4gICAgICAgICAgICA/IG5hdGl2ZU51bWJlclZhbHVlID4gdGhpcy5tYXhcbiAgICAgICAgICAgIDogbmF0aXZlTnVtYmVyVmFsdWUgPCB0aGlzLm1pbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBuYXRpdmVWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50ID8gdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50LnZhbHVlIDogJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXQgbmF0aXZlVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMucHJpbWl0aXZlVGV4dGZpZWxkIHx8ICF0aGlzLm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJpbWl0aXZlVGV4dGZpZWxkLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMubmF0aXZlVmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFic29sdXRlQ2FwSW5wdXRWYWx1ZShpbnB1dFZhbHVlOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtYXNrZWROdW1iZXJTdHJpbmdUb051bWJlcihpbnB1dFZhbHVlKTtcbiAgICAgICAgY29uc3QgY2FwcGVkID0gdmFsdWUgPCAwID8gTWF0aC5tYXgodGhpcy5taW4sIHZhbHVlKSA6IE1hdGgubWluKHZhbHVlLCB0aGlzLm1heCk7XG4gICAgICAgIGNvbnN0IGluZWxpZ2libGVWYWx1ZSA9IGlzTmFOKGNhcHBlZCkgfHwgY2FwcGVkIDwgdGhpcy5taW4gfHwgY2FwcGVkID4gdGhpcy5tYXg7XG5cbiAgICAgICAgcmV0dXJuIGluZWxpZ2libGVWYWx1ZSA/IG51bGwgOiBjYXBwZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDYXJldEFmdGVyQ29tbWEoKSB7XG4gICAgICAgIGlmICghdGhpcy5uYXRpdmVGb2N1c2FibGVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZnRlckNvbW1hUG9zaXRpb24gPSB0aGlzLm5hdGl2ZVZhbHVlLmxlbmd0aCAtIHRoaXMucHJlY2lzaW9uO1xuXG4gICAgICAgIHRoaXMubmF0aXZlRm9jdXNhYmxlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgIGFmdGVyQ29tbWFQb3NpdGlvbixcbiAgICAgICAgICAgIGFmdGVyQ29tbWFQb3NpdGlvbixcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=