UNPKG

angular-bootstrap-datetimepicker

Version:

Native Angular (8+) datetime picker component styled by Twitter Bootstrap 4.

181 lines 20.5 kB
var DlDateTimeInputDirective_1; import * as tslib_1 from "tslib"; import { Directive, ElementRef, EventEmitter, forwardRef, HostListener, Inject, Input, Output, Renderer2 } from '@angular/core'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators, } from '@angular/forms'; import * as _moment from 'moment'; import { DL_DATE_TIME_DISPLAY_FORMAT, DL_DATE_TIME_INPUT_FORMATS, DlDateAdapter } from '../core/public-api'; import { DlDateTimeInputChange } from './dl-date-time-input-change'; /** * @internal */ const moment = _moment; /** * This directive allows the user to enter dates, using the keyboard, into an input box and * angular will then store a date value in the model. * * The input format(s), display format, and model format are independent and fully customizable. */ let DlDateTimeInputDirective = DlDateTimeInputDirective_1 = class DlDateTimeInputDirective { /** * Constructs a new instance of this directive. * @param _renderer * reference to the renderer. * @param _elementRef * reference to this element. * @param _dateAdapter * date adapter for the date type in the model. * @param _displayFormat * from `DL_DATE_TIME_DISPLAY_FORMAT`, which defines the format to use for a valid date/time value. * @param _inputFormats * from `DL_DATE_TIME_INPUT_FORMATS`, which defines the input formats that allowed as valid date/time values. * NB: moment is always in strict parse mode for this directive. */ constructor(_renderer, _elementRef, _dateAdapter, _displayFormat, _inputFormats) { this._renderer = _renderer; this._elementRef = _elementRef; this._dateAdapter = _dateAdapter; this._displayFormat = _displayFormat; this._inputFormats = _inputFormats; /* tslint:disable:member-ordering */ this._filterValidator = (control) => { // @ts-ignore return (this._inputFilter || ((value) => true))(this._value) ? null : { 'dlDateTimeInputFilter': { 'value': control.value } }; }; this._inputFilter = () => true; this._isValid = true; this._parseValidator = () => { return this._isValid ? null : { 'dlDateTimeInputParse': { 'text': this._elementRef.nativeElement.value } }; }; this._changed = []; this._touched = []; this._validator = Validators.compose([this._parseValidator, this._filterValidator]); this._validatorOnChange = () => { }; this._value = undefined; /** * Emits when a `change` event when date/time is selected or * the value of the date/time picker changes. **/ this.dateChange = new EventEmitter(); } /** * Set a function used to determine whether or not the `value` entered by the user is allowed. * @param inputFilterFunction * a function that returns `true` if the `value` entered by the user is allowed, otherwise `false`. */ set dlDateTimeInputFilter(inputFilterFunction) { this._inputFilter = inputFilterFunction; this._validatorOnChange(); } /* tslint:enable:member-ordering */ /** * Returns `D` value of the date/time input or `undefined` | `null` if no value is set. **/ get value() { return this._value; } /** * Emit a `change` event when the value of the input changes. */ _onChange() { this.dateChange.emit(new DlDateTimeInputChange(this._value)); } /** * Format the input text using {@link DL_DATE_TIME_DISPLAY_FORMAT} and mark the control as touched. */ _onBlur() { if (this._value) { this.writeValue(this._value); } this._touched.forEach(onTouched => onTouched()); } /** * Parse the user input into a possibly valid date. * The model value is not set if the input is NOT one of the {@link DL_DATE_TIME_INPUT_FORMATS}. * @param value * Value of the input control. */ _onInput(value) { const testDate = value === null || value === undefined || value === '' ? undefined : moment(value, this._inputFormats, true); this._isValid = testDate && testDate.isValid(); this._value = this._isValid ? this._dateAdapter.fromMilliseconds(testDate.valueOf()) : undefined; this._changed.forEach(onChanged => onChanged(this._value)); } /** * @internal */ registerOnChange(onChange) { this._changed.push(onChange); } /** * @internal */ registerOnTouched(onTouched) { this._touched.push(onTouched); } /** * @internal */ registerOnValidatorChange(validatorOnChange) { this._validatorOnChange = validatorOnChange; } /** * @internal */ setDisabledState(isDisabled) { this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled); } /** * @internal */ validate(control) { return this._validator(control); } /** * @internal */ writeValue(value) { const normalizedValue = value === null || value === undefined ? '' : moment(value).format(this._displayFormat); this._renderer.setProperty(this._elementRef.nativeElement, 'value', normalizedValue); } }; DlDateTimeInputDirective.ctorParameters = () => [ { type: Renderer2 }, { type: ElementRef }, { type: DlDateAdapter }, { type: String, decorators: [{ type: Inject, args: [DL_DATE_TIME_DISPLAY_FORMAT,] }] }, { type: Array, decorators: [{ type: Inject, args: [DL_DATE_TIME_INPUT_FORMATS,] }] } ]; tslib_1.__decorate([ Output() ], DlDateTimeInputDirective.prototype, "dateChange", void 0); tslib_1.__decorate([ Input() ], DlDateTimeInputDirective.prototype, "dlDateTimeInputFilter", null); tslib_1.__decorate([ HostListener('change') ], DlDateTimeInputDirective.prototype, "_onChange", null); tslib_1.__decorate([ HostListener('blur') ], DlDateTimeInputDirective.prototype, "_onBlur", null); tslib_1.__decorate([ HostListener('input', ['$event.target.value']) ], DlDateTimeInputDirective.prototype, "_onInput", null); DlDateTimeInputDirective = DlDateTimeInputDirective_1 = tslib_1.__decorate([ Directive({ selector: 'input[dlDateTimeInput]', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DlDateTimeInputDirective_1), multi: true }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => DlDateTimeInputDirective_1), multi: true } ] }), tslib_1.__param(3, Inject(DL_DATE_TIME_DISPLAY_FORMAT)), tslib_1.__param(4, Inject(DL_DATE_TIME_INPUT_FORMATS)) ], DlDateTimeInputDirective); export { DlDateTimeInputDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGwtZGF0ZS10aW1lLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyIsInNvdXJjZXMiOlsiZGwtZGF0ZS10aW1lLWlucHV0L2RsLWRhdGUtdGltZS1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUgsT0FBTyxFQUdMLGFBQWEsRUFDYixpQkFBaUIsRUFJakIsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxFQUFDLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLGFBQWEsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzFHLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRWxFOztHQUVHO0FBQ0gsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBRXZCOzs7OztHQUtHO0FBUUgsSUFBYSx3QkFBd0IsZ0NBQXJDLE1BQWEsd0JBQXdCO0lBMkJuQzs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsWUFDVSxTQUFvQixFQUNwQixXQUF1QixFQUN2QixZQUE4QixFQUNnQixjQUFzQixFQUN2QixhQUF1QjtRQUpwRSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUNnQixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN2QixrQkFBYSxHQUFiLGFBQWEsQ0FBVTtRQTVDOUUsb0NBQW9DO1FBQzVCLHFCQUFnQixHQUFnQixDQUFDLE9BQXdCLEVBQTJCLEVB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RDtBQThCbkU7SUFEQyxLQUFLLEVBQUU7cUVBSVA7QUFjdUI7SUFBdkIsWUFBWSxDQUFDLFFBQVEsQ0FBQzt5REFFdEI7QUFLcUI7SUFBckIsWUFBWSxDQUFDLE1BQU0sQ0FBQzt1REFLcEI7QUFRK0M7SUFBL0MsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7d0RBUTlDO0FBcEdVLHdCQUF3QjtJQVBwQyxTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLFNBQVMsRUFBRTtZQUNULEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMEJBQXdCLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO1lBQ2xHLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDBCQUF3QixDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztTQUMvRjtLQUNGLENBQUM7SUE4Q0csbUJBQUEsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDbkMsbUJBQUEsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUE7R0E5QzFCLHdCQUF3QixDQWtKcEM7U0FsSlksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPdXRwdXQsIFJlbmRlcmVyMn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0ICogYXMgX21vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtETF9EQVRFX1RJTUVfRElTUExBWV9GT1JNQVQsIERMX0RBVEVfVElNRV9JTlBVVF9GT1JNQVRTLCBEbERhdGVBZGFwdGVyfSBmcm9tICcuLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHtEbERhdGVUaW1lSW5wdXRDaGFuZ2V9IGZyb20gJy4vZGwtZGF0ZS10aW1lLWlucHV0LWNoYW5nZSc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IG1vbWVudCA9IF9tb21lbnQ7XG5cbi8qKlxuICogIFRoaXMgZGlyZWN0aXZlIGFsbG93cyB0aGUgdXNlciB0byBlbnRlciBkYXRlcywgdXNpbmcgdGhlIGtleWJvYXJkLCBpbnRvIGFuIGlucHV0IGJveCBhbmRcbiAqICBhbmd1bGFyIHdpbGwgdGhlbiBzdG9yZSBhIGRhdGUgdmFsdWUgaW4gdGhlIG1vZGVsLlxuICpcbiAqICBUaGUgaW5wdXQgZm9ybWF0KHMpLCBkaXNwbGF5IGZvcm1hdCwgYW5kIG1vZGVsIGZvcm1hdCBhcmUgaW5kZXBlbmRlbnQgYW5kIGZ1bGx5IGN1c3RvbWl6YWJsZS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbZGxEYXRlVGltZUlucHV0XScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGxEYXRlVGltZUlucHV0RGlyZWN0aXZlKSwgbXVsdGk6IHRydWV9LFxuICAgIHtwcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEbERhdGVUaW1lSW5wdXREaXJlY3RpdmUpLCBtdWx0aTogdHJ1ZX1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEbERhdGVUaW1lSW5wdXREaXJlY3RpdmU8RD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yIHtcblxuICAvKiB0c2xpbnQ6ZGlzYWJsZTptZW1iZXItb3JkZXJpbmcgKi9cbiAgcHJpdmF0ZSBfZmlsdGVyVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiAodGhpcy5faW5wdXRGaWx0ZXIgfHwgKCh2YWx1ZTogYW55KSA9PiB0cnVlKSkodGhpcy5fdmFsdWUpID9cbiAgICAgIG51bGwgOiB7J2RsRGF0ZVRpbWVJbnB1dEZpbHRlcic6IHsndmFsdWUnOiBjb250cm9sLnZhbHVlfX07XG4gIH1cbiAgcHJpdmF0ZSBfaW5wdXRGaWx0ZXI6ICh2YWx1ZTogKEQgfCBudWxsKSkgPT4gYm9vbGVhbiA9ICgpID0+IHRydWU7XG4gIHByaXZhdGUgX2lzVmFsaWQgPSB0cnVlO1xuICBwcml2YXRlIF9wYXJzZVZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkID9cbiAgICAgIG51bGwgOiB7J2RsRGF0ZVRpbWVJbnB1dFBhcnNlJzogeyd0ZXh0JzogdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlfX07XG4gIH1cbiAgcHJpdmF0ZSBfY2hhbmdlZDogKCh2YWx1ZTogRCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIF90b3VjaGVkOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIF92YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW3RoaXMuX3BhcnNlVmFsaWRhdG9yLCB0aGlzLl9maWx0ZXJWYWxpZGF0b3JdKTtcbiAgcHJpdmF0ZSBfdmFsaWRhdG9yT25DaGFuZ2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBfdmFsdWU6IEQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYSBgY2hhbmdlYCBldmVudCB3aGVuIGRhdGUvdGltZSBpcyBzZWxlY3RlZCBvclxuICAgKiB0aGUgdmFsdWUgb2YgdGhlIGRhdGUvdGltZSBwaWNrZXIgY2hhbmdlcy5cbiAgICoqL1xuICBAT3V0cHV0KClcbiAgcmVhZG9ubHkgZGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGxEYXRlVGltZUlucHV0Q2hhbmdlPEQ+PigpO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgZGlyZWN0aXZlLlxuICAgKiBAcGFyYW0gX3JlbmRlcmVyXG4gICAqICByZWZlcmVuY2UgdG8gdGhlIHJlbmRlcmVyLlxuICAgKiBAcGFyYW0gX2VsZW1lbnRSZWZcbiAgICogIHJlZmVyZW5jZSB0byB0aGlzIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBfZGF0ZUFkYXB0ZXJcbiAgICogIGRhdGUgYWRhcHRlciBmb3IgdGhlIGRhdGUgdHlwZSBpbiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSBfZGlzcGxheUZvcm1hdFxuICAgKiAgZnJvbSBgRExfREFURV9USU1FX0RJU1BMQVlfRk9STUFUYCwgd2hpY2ggZGVmaW5lcyB0aGUgZm9ybWF0IHRvIHVzZSBmb3IgYSB2YWxpZCBkYXRlL3RpbWUgdmFsdWUuXG4gICAqIEBwYXJhbSBfaW5wdXRGb3JtYXRzXG4gICAqICBmcm9tIGBETF9EQVRFX1RJTUVfSU5QVVRfRk9STUFUU2AsIHdoaWNoIGRlZmluZXMgdGhlIGlucHV0IGZvcm1hdHMgdGhhdCBhbGxvd2VkIGFzIHZhbGlkIGRhdGUvdGltZSB2YWx1ZXMuXG4gICAqICBOQjogbW9tZW50IGlzIGFsd2F5cyBpbiBzdHJpY3QgcGFyc2UgbW9kZSBmb3IgdGhpcyBkaXJlY3RpdmUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfZGF0ZUFkYXB0ZXI6IERsRGF0ZUFkYXB0ZXI8RD4sXG4gICAgQEluamVjdChETF9EQVRFX1RJTUVfRElTUExBWV9GT1JNQVQpIHByaXZhdGUgcmVhZG9ubHkgX2Rpc3BsYXlGb3JtYXQ6IHN0cmluZyxcbiAgICBASW5qZWN0KERMX0RBVEVfVElNRV9JTlBVVF9GT1JNQVRTKSBwcml2YXRlIHJlYWRvbmx5IF9pbnB1dEZvcm1hdHM6IHN0cmluZ1tdXG4gICkge31cblxuICAvKipcbiAgICogU2V0IGEgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGB2YWx1ZWAgZW50ZXJlZCBieSB0aGUgdXNlciBpcyBhbGxvd2VkLlxuICAgKiBAcGFyYW0gaW5wdXRGaWx0ZXJGdW5jdGlvblxuICAgKiAgIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYHZhbHVlYCBlbnRlcmVkIGJ5IHRoZSB1c2VyIGlzIGFsbG93ZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGRsRGF0ZVRpbWVJbnB1dEZpbHRlcihpbnB1dEZpbHRlckZ1bmN0aW9uOiAodmFsdWU6IEQgfCBudWxsKSA9PiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5wdXRGaWx0ZXIgPSBpbnB1dEZpbHRlckZ1bmN0aW9uO1xuICAgIHRoaXMuX3ZhbGlkYXRvck9uQ2hhbmdlKCk7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZW5hYmxlOm1lbWJlci1vcmRlcmluZyAqL1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGBEYCB2YWx1ZSBvZiB0aGUgZGF0ZS90aW1lIGlucHV0IG9yIGB1bmRlZmluZWRgIHwgYG51bGxgIGlmIG5vIHZhbHVlIGlzIHNldC5cbiAgICoqL1xuICBnZXQgdmFsdWUoKTogRCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYSBgY2hhbmdlYCBldmVudCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgY2hhbmdlcy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScpIF9vbkNoYW5nZSgpIHtcbiAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdChuZXcgRGxEYXRlVGltZUlucHV0Q2hhbmdlKHRoaXMuX3ZhbHVlKSk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHRoZSBpbnB1dCB0ZXh0IHVzaW5nIHtAbGluayBETF9EQVRFX1RJTUVfRElTUExBWV9GT1JNQVR9IGFuZCBtYXJrIHRoZSBjb250cm9sIGFzIHRvdWNoZWQuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdibHVyJykgX29uQmx1cigpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuX3RvdWNoZWQuZm9yRWFjaChvblRvdWNoZWQgPT4gb25Ub3VjaGVkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSB1c2VyIGlucHV0IGludG8gYSBwb3NzaWJseSB2YWxpZCBkYXRlLlxuICAgKiBUaGUgbW9kZWwgdmFsdWUgaXMgbm90IHNldCBpZiB0aGUgaW5wdXQgaXMgTk9UIG9uZSBvZiB0aGUge0BsaW5rIERMX0RBVEVfVElNRV9JTlBVVF9GT1JNQVRTfS5cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqICAgVmFsdWUgb2YgdGhlIGlucHV0IGNvbnRyb2wuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50LnRhcmdldC52YWx1ZSddKSBfb25JbnB1dCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IHRlc3REYXRlID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJydcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IG1vbWVudCh2YWx1ZSwgdGhpcy5faW5wdXRGb3JtYXRzLCB0cnVlKTtcblxuICAgIHRoaXMuX2lzVmFsaWQgPSB0ZXN0RGF0ZSAmJiB0ZXN0RGF0ZS5pc1ZhbGlkKCk7XG4gICAgdGhpcy5fdmFsdWUgPSB0aGlzLl9pc1ZhbGlkID8gdGhpcy5fZGF0ZUFkYXB0ZXIuZnJvbU1pbGxpc2Vjb25kcyh0ZXN0RGF0ZS52YWx1ZU9mKCkpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NoYW5nZWQuZm9yRWFjaChvbkNoYW5nZWQgPT4gb25DaGFuZ2VkKHRoaXMuX3ZhbHVlKSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX2NoYW5nZWQucHVzaChvbkNoYW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl90b3VjaGVkLnB1c2gob25Ub3VjaGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UodmFsaWRhdG9yT25DaGFuZ2U6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl92YWxpZGF0b3JPbkNoYW5nZSA9IHZhbGlkYXRvck9uQ2hhbmdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yKGNvbnRyb2wpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRCk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gJydcbiAgICAgIDogbW9tZW50KHZhbHVlKS5mb3JtYXQodGhpcy5fZGlzcGxheUZvcm1hdCk7XG4gICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBub3JtYWxpemVkVmFsdWUpO1xuICB9XG59XG4iXX0=