UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

715 lines 48 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { Component, ComponentFactoryResolver, EventEmitter, Inject, Input, Output, Type, } from '@angular/core'; import { takeWhile } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { NbAdjustment, NbComponentPortal, NbOverlayService, NbPosition, NbPositionBuilderService, NbTrigger, NbTriggerStrategyBuilder, patch, } from '../cdk'; import { NbDatepickerContainerComponent } from './datepicker-container.component'; import { NB_DOCUMENT } from '../../theme.options'; import { NbCalendarRangeComponent } from '../calendar/calendar-range.component'; import { NbCalendarComponent } from '../calendar/calendar.component'; import { NbCalendarSize, NbCalendarViewMode, NbDateService, NbNativeDateService, } from '../calendar-kit'; import { NbDatepicker } from './datepicker.directive'; /* * The `NbBasePicker` component concentrates overlay manipulation logic. * */ /** * @abstract * @template D, T, P */ var NbBasePicker = /** @class */ (function (_super) { tslib_1.__extends(NbBasePicker, _super); function NbBasePicker(document, positionBuilder, overlay, cfr, dateService) { var _this = _super.call(this) || this; _this.document = document; _this.positionBuilder = positionBuilder; _this.overlay = overlay; _this.cfr = cfr; _this.dateService = dateService; /* * Defines if we should render previous and next months * in the current month view. * */ _this.boundingMonth = true; /* * Defines starting view for calendar. * */ _this.startView = NbCalendarViewMode.DATE; /* * Size of the calendar and entire components. * Can be 'medium' which is default or 'large'. * */ _this.size = NbCalendarSize.MEDIUM; /* * Hide picker when a date or a range is selected, `true` by default * @type {boolean} */ _this.hideOnSelect = true; /* * Stream of picker changes. Required to be the subject because picker hides and shows and picker * change stream becomes recreated. * */ _this.onChange$ = new Subject(); _this.alive = true; _this.blur$ = new Subject(); return _this; } Object.defineProperty(NbBasePicker.prototype, "picker", { /* * Returns picker instance. * */ get: /* * Returns picker instance. * */ /** * @return {?} */ function () { return this.pickerRef && this.pickerRef.instance; }, enumerable: true, configurable: true }); Object.defineProperty(NbBasePicker.prototype, "valueChange", { /* * Stream of picker value changes. * */ get: /* * Stream of picker value changes. * */ /** * @return {?} */ function () { return this.onChange$.asObservable(); }, enumerable: true, configurable: true }); Object.defineProperty(NbBasePicker.prototype, "isShown", { get: /** * @return {?} */ function () { return this.ref && this.ref.hasAttached(); }, enumerable: true, configurable: true }); Object.defineProperty(NbBasePicker.prototype, "blur", { /* * Emits when datepicker looses focus. */ get: /* * Emits when datepicker looses focus. */ /** * @return {?} */ function () { return this.blur$.asObservable(); }, enumerable: true, configurable: true }); /** * @return {?} */ NbBasePicker.prototype.ngOnChanges = /** * @return {?} */ function () { if (this.dateService instanceof NbNativeDateService && this.format) { throw new Error('Can\'t format native date. To use custom formatting you have to install @nebular/moment or ' + '@nebular/date-fns package and import NbMomentDateModule or NbDateFnsDateModule accordingly.' + 'More information at "Formatting issue" ' + 'https://akveo.github.io/nebular/docs/components/datepicker/overview#nbdatepickercomponent'); } }; /** * @return {?} */ NbBasePicker.prototype.ngOnDestroy = /** * @return {?} */ function () { this.alive = false; this.hide(); this.ref.dispose(); }; /* * Datepicker knows nothing about host html input element. * So, attach method attaches datepicker to the host input element. * */ /* * Datepicker knows nothing about host html input element. * So, attach method attaches datepicker to the host input element. * */ /** * @param {?} hostRef * @return {?} */ NbBasePicker.prototype.attach = /* * Datepicker knows nothing about host html input element. * So, attach method attaches datepicker to the host input element. * */ /** * @param {?} hostRef * @return {?} */ function (hostRef) { this.hostRef = hostRef; this.positionStrategy = this.createPositionStrategy(); this.ref = this.overlay.create({ positionStrategy: this.positionStrategy, scrollStrategy: this.overlay.scrollStrategies.reposition(), }); this.subscribeOnPositionChange(); this.subscribeOnTriggers(); }; /** * @return {?} */ NbBasePicker.prototype.getValidatorConfig = /** * @return {?} */ function () { return { min: this.min, max: this.max, filter: this.filter }; }; /** * @return {?} */ NbBasePicker.prototype.show = /** * @return {?} */ function () { this.container = this.ref.attach(new NbComponentPortal(NbDatepickerContainerComponent, null, null, this.cfr)); this.instantiatePicker(); this.subscribeOnValueChange(); this.writeQueue(); this.patchWithInputs(); }; /** * @return {?} */ NbBasePicker.prototype.shouldHide = /** * @return {?} */ function () { return this.hideOnSelect && !!this.value; }; /** * @return {?} */ NbBasePicker.prototype.hide = /** * @return {?} */ function () { this.ref.detach(); // save current value if picker was rendered if (this.picker) { this.queue = this.value; this.pickerRef.destroy(); this.pickerRef = null; this.container = null; } }; /** * @protected * @return {?} */ NbBasePicker.prototype.createPositionStrategy = /** * @protected * @return {?} */ function () { return this.positionBuilder .connectedTo(this.hostRef) .position(NbPosition.BOTTOM) .adjustment(NbAdjustment.COUNTERCLOCKWISE); }; /** * @protected * @return {?} */ NbBasePicker.prototype.subscribeOnPositionChange = /** * @protected * @return {?} */ function () { var _this = this; this.positionStrategy.positionChange .pipe(takeWhile(function () { return _this.alive; })) .subscribe(function (position) { return patch(_this.container, { position: position }); }); }; /** * @protected * @return {?} */ NbBasePicker.prototype.createTriggerStrategy = /** * @protected * @return {?} */ function () { var _this = this; return new NbTriggerStrategyBuilder() .document(this.document) .trigger(NbTrigger.FOCUS) .host(this.hostRef.nativeElement) .container(function () { return _this.container; }) .build(); }; /** * @protected * @return {?} */ NbBasePicker.prototype.subscribeOnTriggers = /** * @protected * @return {?} */ function () { var _this = this; /** @type {?} */ var triggerStrategy = this.createTriggerStrategy(); triggerStrategy.show$.pipe(takeWhile(function () { return _this.alive; })).subscribe(function () { return _this.show(); }); triggerStrategy.hide$.pipe(takeWhile(function () { return _this.alive; })).subscribe(function () { _this.blur$.next(); _this.hide(); }); }; /** * @protected * @return {?} */ NbBasePicker.prototype.instantiatePicker = /** * @protected * @return {?} */ function () { this.pickerRef = this.container.instance.attach(new NbComponentPortal(this.pickerClass, null, null, this.cfr)); }; /* * Subscribes on picker value changes and emit data through this.onChange$ subject. * */ /* * Subscribes on picker value changes and emit data through this.onChange$ subject. * */ /** * @protected * @return {?} */ NbBasePicker.prototype.subscribeOnValueChange = /* * Subscribes on picker value changes and emit data through this.onChange$ subject. * */ /** * @protected * @return {?} */ function () { var _this = this; this.pickerValueChange.subscribe(function (date) { _this.onChange$.next(date); }); }; /** * @protected * @return {?} */ NbBasePicker.prototype.patchWithInputs = /** * @protected * @return {?} */ function () { this.picker.boundingMonth = this.boundingMonth; this.picker.startView = this.startView; this.picker.min = this.min; this.picker.max = this.max; this.picker.filter = this.filter; this.picker._cellComponent = this.dayCellComponent; this.picker.monthCellComponent = this.monthCellComponent; this.picker._yearCellComponent = this.yearCellComponent; this.picker.size = this.size; this.picker.visibleDate = this.visibleDate; }; /** @nocollapse */ NbBasePicker.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] }, { type: NbPositionBuilderService }, { type: NbOverlayService }, { type: ComponentFactoryResolver }, { type: NbDateService } ]; }; NbBasePicker.propDecorators = { format: [{ type: Input }], boundingMonth: [{ type: Input }], startView: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], filter: [{ type: Input }], dayCellComponent: [{ type: Input }], monthCellComponent: [{ type: Input }], yearCellComponent: [{ type: Input }], size: [{ type: Input }], visibleDate: [{ type: Input }], hideOnSelect: [{ type: Input }] }; return NbBasePicker; }(NbDatepicker)); export { NbBasePicker }; if (false) { /** @type {?} */ NbBasePicker.prototype.format; /** @type {?} */ NbBasePicker.prototype.boundingMonth; /** @type {?} */ NbBasePicker.prototype.startView; /** @type {?} */ NbBasePicker.prototype.min; /** @type {?} */ NbBasePicker.prototype.max; /** @type {?} */ NbBasePicker.prototype.filter; /** @type {?} */ NbBasePicker.prototype.dayCellComponent; /** @type {?} */ NbBasePicker.prototype.monthCellComponent; /** @type {?} */ NbBasePicker.prototype.yearCellComponent; /** @type {?} */ NbBasePicker.prototype.size; /** @type {?} */ NbBasePicker.prototype.visibleDate; /** @type {?} */ NbBasePicker.prototype.hideOnSelect; /** * @type {?} * @protected */ NbBasePicker.prototype.pickerClass; /** * @type {?} * @protected */ NbBasePicker.prototype.ref; /** * @type {?} * @protected */ NbBasePicker.prototype.container; /** * @type {?} * @protected */ NbBasePicker.prototype.positionStrategy; /** * @type {?} * @protected */ NbBasePicker.prototype.hostRef; /** * @type {?} * @protected */ NbBasePicker.prototype.onChange$; /** * @type {?} * @protected */ NbBasePicker.prototype.pickerRef; /** * @type {?} * @protected */ NbBasePicker.prototype.alive; /** * @type {?} * @protected */ NbBasePicker.prototype.queue; /** * @type {?} * @protected */ NbBasePicker.prototype.blur$; /** * @type {?} * @protected */ NbBasePicker.prototype.document; /** * @type {?} * @protected */ NbBasePicker.prototype.positionBuilder; /** * @type {?} * @protected */ NbBasePicker.prototype.overlay; /** * @type {?} * @protected */ NbBasePicker.prototype.cfr; /** * @type {?} * @protected */ NbBasePicker.prototype.dateService; /** * @abstract * @protected * @return {?} */ NbBasePicker.prototype.pickerValueChange = function () { }; /** * @abstract * @protected * @return {?} */ NbBasePicker.prototype.writeQueue = function () { }; } /* * The DatePicker components itself. * Provides a proxy to `NbCalendar` options as well as custom picker options. */ /** * @template D */ var NbDatepickerComponent = /** @class */ (function (_super) { tslib_1.__extends(NbDatepickerComponent, _super); function NbDatepickerComponent() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.pickerClass = NbCalendarComponent; return _this; } Object.defineProperty(NbDatepickerComponent.prototype, "date", { /* * Date which will be rendered as selected. * */ set: /* * Date which will be rendered as selected. * */ /** * @param {?} date * @return {?} */ function (date) { this.value = date; }, enumerable: true, configurable: true }); Object.defineProperty(NbDatepickerComponent.prototype, "dateChange", { /* * Emits date when selected. * */ get: /* * Emits date when selected. * */ /** * @return {?} */ function () { return (/** @type {?} */ (this.valueChange)); }, enumerable: true, configurable: true }); Object.defineProperty(NbDatepickerComponent.prototype, "value", { get: /** * @return {?} */ function () { return this.picker.date; }, set: /** * @param {?} date * @return {?} */ function (date) { if (!this.picker) { this.queue = date; return; } if (date) { this.picker.visibleDate = date; this.picker.date = date; } }, enumerable: true, configurable: true }); Object.defineProperty(NbDatepickerComponent.prototype, "pickerValueChange", { get: /** * @protected * @return {?} */ function () { return this.picker.dateChange; }, enumerable: true, configurable: true }); /** * @protected * @return {?} */ NbDatepickerComponent.prototype.writeQueue = /** * @protected * @return {?} */ function () { this.value = this.queue; }; NbDatepickerComponent.decorators = [ { type: Component, args: [{ selector: 'nb-datepicker', template: '' }] } ]; NbDatepickerComponent.propDecorators = { date: [{ type: Input }], dateChange: [{ type: Output }] }; return NbDatepickerComponent; }(NbBasePicker)); export { NbDatepickerComponent }; if (false) { /** * @type {?} * @protected */ NbDatepickerComponent.prototype.pickerClass; } /* * The RangeDatePicker components itself. * Provides a proxy to `NbCalendarRange` options as well as custom picker options. */ /** * @template D */ var NbRangepickerComponent = /** @class */ (function (_super) { tslib_1.__extends(NbRangepickerComponent, _super); function NbRangepickerComponent() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.pickerClass = NbCalendarRangeComponent; return _this; } Object.defineProperty(NbRangepickerComponent.prototype, "range", { /* * Range which will be rendered as selected. * */ set: /* * Range which will be rendered as selected. * */ /** * @param {?} range * @return {?} */ function (range) { this.value = range; }, enumerable: true, configurable: true }); Object.defineProperty(NbRangepickerComponent.prototype, "rangeChange", { /* * Emits range when start selected and emits again when end selected. * */ get: /* * Emits range when start selected and emits again when end selected. * */ /** * @return {?} */ function () { return (/** @type {?} */ (this.valueChange)); }, enumerable: true, configurable: true }); Object.defineProperty(NbRangepickerComponent.prototype, "value", { get: /** * @return {?} */ function () { return this.picker.range; }, set: /** * @param {?} range * @return {?} */ function (range) { if (!this.picker) { this.queue = range; return; } if (range) { this.picker.visibleDate = range && range.start; this.picker.range = range; } }, enumerable: true, configurable: true }); Object.defineProperty(NbRangepickerComponent.prototype, "pickerValueChange", { get: /** * @protected * @return {?} */ function () { return this.picker.rangeChange; }, enumerable: true, configurable: true }); /** * @return {?} */ NbRangepickerComponent.prototype.shouldHide = /** * @return {?} */ function () { return _super.prototype.shouldHide.call(this) && !!(this.value.start && this.value.end); }; /** * @protected * @return {?} */ NbRangepickerComponent.prototype.writeQueue = /** * @protected * @return {?} */ function () { this.value = this.queue; }; NbRangepickerComponent.decorators = [ { type: Component, args: [{ selector: 'nb-rangepicker', template: '' }] } ]; NbRangepickerComponent.propDecorators = { range: [{ type: Input }], rangeChange: [{ type: Output }] }; return NbRangepickerComponent; }(NbBasePicker)); export { NbRangepickerComponent }; if (false) { /** * @type {?} * @protected */ NbRangepickerComponent.prototype.pickerClass; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHdCQUF3QixFQUl4QixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sSUFBSSxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFFTCxZQUFZLEVBQ1osaUJBQWlCLEVBRWpCLGdCQUFnQixFQUNoQixVQUFVLEVBQ1Ysd0JBQXdCLEVBQ3hCLFNBQVMsRUFFVCx3QkFBd0IsRUFDeEIsS0FBSyxHQUNOLE1BQU0sUUFBUSxDQUFDO0FBQ2hCLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQW1CLHdCQUF3QixFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDaEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUVMLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLG1CQUFtQixHQUNwQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxZQUFZLEVBQTJCLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7O0FBTS9FO0lBQW9ELHdDQUFlO0lBK0dqRSxzQkFBMkMsUUFBUSxFQUM3QixlQUF5QyxFQUN6QyxPQUF5QixFQUN6QixHQUE2QixFQUM3QixXQUE2QjtRQUpuRCxZQU1FLGlCQUFPLFNBQ1I7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LEFBaERELENBSStDLFlBQVksR0E0QzFEO1NBNUNZLHNCQUFzQjs7Ozs7O0lBQ2pDLDZDQUFvRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBUeXBlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7XHJcbiAgTmJBZGp1c3RhYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcclxuICBOYkFkanVzdG1lbnQsXHJcbiAgTmJDb21wb25lbnRQb3J0YWwsXHJcbiAgTmJPdmVybGF5UmVmLFxyXG4gIE5iT3ZlcmxheVNlcnZpY2UsXHJcbiAgTmJQb3NpdGlvbixcclxuICBOYlBvc2l0aW9uQnVpbGRlclNlcnZpY2UsXHJcbiAgTmJUcmlnZ2VyLFxyXG4gIE5iVHJpZ2dlclN0cmF0ZWd5LFxyXG4gIE5iVHJpZ2dlclN0cmF0ZWd5QnVpbGRlcixcclxuICBwYXRjaCxcclxufSBmcm9tICcuLi9jZGsnO1xyXG5pbXBvcnQgeyBOYkRhdGVwaWNrZXJDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGVwaWNrZXItY29udGFpbmVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5CX0RPQ1VNRU5UIH0gZnJvbSAnLi4vLi4vdGhlbWUub3B0aW9ucyc7XHJcbmltcG9ydCB7IE5iQ2FsZW5kYXJSYW5nZSwgTmJDYWxlbmRhclJhbmdlQ29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXIvY2FsZW5kYXItcmFuZ2UuY29tcG9uZW50J1xyXG5pbXBvcnQgeyBOYkNhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY2FsZW5kYXIvY2FsZW5kYXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBOYkNhbGVuZGFyQ2VsbCxcclxuICBOYkNhbGVuZGFyU2l6ZSxcclxuICBOYkNhbGVuZGFyVmlld01vZGUsXHJcbiAgTmJEYXRlU2VydmljZSxcclxuICBOYk5hdGl2ZURhdGVTZXJ2aWNlLFxyXG59IGZyb20gJy4uL2NhbGVuZGFyLWtpdCc7XHJcbmltcG9ydCB7IE5iRGF0ZXBpY2tlciwgTmJQaWNrZXJWYWxpZGF0b3JDb25maWcgfSBmcm9tICcuL2RhdGVwaWNrZXIuZGlyZWN0aXZlJztcclxuXHJcblxyXG4vKlxyXG4gKiBUaGUgYE5iQmFzZVBpY2tlcmAgY29tcG9uZW50IGNvbmNlbnRyYXRlcyBvdmVybGF5IG1hbmlwdWxhdGlvbiBsb2dpYy5cclxuICogKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5iQmFzZVBpY2tlcjxELCBULCBQPiBleHRlbmRzIE5iRGF0ZXBpY2tlcjxUPiBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICAvKlxyXG4gICAqIERhdGVwaWNrZXIgZGF0ZSBmb3JtYXQuIENhbiBiZSB1c2VkIG9ubHkgd2l0aCBkYXRlIGFkYXB0ZXJzIChtb21lbnQsIGRhdGUtZm5zKSBzaW5jZSBuYXRpdmUgZGF0ZVxyXG4gICAqIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgZm9ybWF0dGluZy5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgpIGZvcm1hdDogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIERlZmluZXMgaWYgd2Ugc2hvdWxkIHJlbmRlciBwcmV2aW91cyBhbmQgbmV4dCBtb250aHNcclxuICAgKiBpbiB0aGUgY3VycmVudCBtb250aCB2aWV3LlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgYm91bmRpbmdNb250aDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qXHJcbiAgICogRGVmaW5lcyBzdGFydGluZyB2aWV3IGZvciBjYWxlbmRhci5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgpIHN0YXJ0VmlldzogTmJDYWxlbmRhclZpZXdNb2RlID0gTmJDYWxlbmRhclZpZXdNb2RlLkRBVEU7XHJcblxyXG4gIC8qXHJcbiAgICogTWluaW11bSBhdmFpbGFibGUgZGF0ZSBmb3Igc2VsZWN0aW9uLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgbWluOiBUO1xyXG5cclxuICAvKlxyXG4gICAqIE1heGltdW0gYXZhaWxhYmxlIGRhdGUgZm9yIHNlbGVjdGlvbi5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgpIG1heDogVDtcclxuXHJcbiAgLypcclxuICAgKiBQcmVkaWNhdGUgdGhhdCBkZWNpZGVzIHdoaWNoIGNlbGxzIHdpbGwgYmUgZGlzYWJsZWQuXHJcbiAgICogKi9cclxuICBASW5wdXQoKSBmaWx0ZXI6IChUKSA9PiBib29sZWFuO1xyXG5cclxuICAvKlxyXG4gICAqIEN1c3RvbSBkYXkgY2VsbCBjb21wb25lbnQuIEhhdmUgdG8gaW1wbGVtZW50IGBOYkNhbGVuZGFyQ2VsbGAgaW50ZXJmYWNlLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgZGF5Q2VsbENvbXBvbmVudDogVHlwZTxOYkNhbGVuZGFyQ2VsbDxELCBUPj47XHJcblxyXG4gIC8qXHJcbiAgICogQ3VzdG9tIG1vbnRoIGNlbGwgY29tcG9uZW50LiBIYXZlIHRvIGltcGxlbWVudCBgTmJDYWxlbmRhckNlbGxgIGludGVyZmFjZS5cclxuICAgKiAqL1xyXG4gIEBJbnB1dCgpIG1vbnRoQ2VsbENvbXBvbmVudDogVHlwZTxOYkNhbGVuZGFyQ2VsbDxELCBUPj47XHJcblxyXG4gIC8qXHJcbiAgICogQ3VzdG9tIHllYXIgY2VsbCBjb21wb25lbnQuIEhhdmUgdG8gaW1wbGVtZW50IGBOYkNhbGVuZGFyQ2VsbGAgaW50ZXJmYWNlLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgeWVhckNlbGxDb21wb25lbnQ6IFR5cGU8TmJDYWxlbmRhckNlbGw8RCwgVD4+O1xyXG5cclxuICAvKlxyXG4gICAqIFNpemUgb2YgdGhlIGNhbGVuZGFyIGFuZCBlbnRpcmUgY29tcG9uZW50cy5cclxuICAgKiBDYW4gYmUgJ21lZGl1bScgd2hpY2ggaXMgZGVmYXVsdCBvciAnbGFyZ2UnLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgc2l6ZTogTmJDYWxlbmRhclNpemUgPSBOYkNhbGVuZGFyU2l6ZS5NRURJVU07XHJcblxyXG4gIC8qXHJcbiAgICogRGVwZW5kaW5nIG9uIHRoaXMgZGF0ZSBhIHBhcnRpY3VsYXIgbW9udGggaXMgc2VsZWN0ZWQgaW4gdGhlIGNhbGVuZGFyXHJcbiAgICovXHJcbiAgQElucHV0KCkgdmlzaWJsZURhdGU6IEQ7XHJcblxyXG4gIC8qXHJcbiAgICogSGlkZSBwaWNrZXIgd2hlbiBhIGRhdGUgb3IgYSByYW5nZSBpcyBzZWxlY3RlZCwgYHRydWVgIGJ5IGRlZmF1bHRcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBASW5wdXQoKSBoaWRlT25TZWxlY3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKlxyXG4gICAqIENhbGVuZGFyIGNvbXBvbmVudCBjbGFzcyB0aGF0IGhhcyB0byBiZSBpbnN0YW50aWF0ZWQgaW5zaWRlIG92ZXJsYXkuXHJcbiAgICogKi9cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcGlja2VyQ2xhc3M6IFR5cGU8UD47XHJcblxyXG4gIC8qXHJcbiAgICogT3ZlcmxheSByZWZlcmVuY2Ugb2JqZWN0LlxyXG4gICAqICovXHJcbiAgcHJvdGVjdGVkIHJlZjogTmJPdmVybGF5UmVmO1xyXG5cclxuICAvKlxyXG4gICAqIERhdGVwaWNrZXIgY29udGFpbmVyIHRoYXQgY29udGFpbnMgaW5zdGFudGlhdGVkIHBpY2tlci5cclxuICAgKiAqL1xyXG4gIHByb3RlY3RlZCBjb250YWluZXI6IENvbXBvbmVudFJlZjxOYkRhdGVwaWNrZXJDb250YWluZXJDb21wb25lbnQ+O1xyXG5cclxuICAvKlxyXG4gICAqIFBvc2l0aW9uaW5nIHN0cmF0ZWd5IHVzZWQgYnkgb3ZlcmxheS5cclxuICAgKiAqL1xyXG4gIHByb3RlY3RlZCBwb3NpdGlvblN0cmF0ZWd5OiBOYkFkanVzdGFibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5O1xyXG5cclxuICAvKlxyXG4gICAqIEhUTUwgaW5wdXQgcmVmZXJlbmNlIHRvIHdoaWNoIGRhdGVwaWNrZXIgY29ubmVjdGVkLlxyXG4gICAqICovXHJcbiAgcHJvdGVjdGVkIGhvc3RSZWY6IEVsZW1lbnRSZWY7XHJcblxyXG4gIC8qXHJcbiAgICogU3RyZWFtIG9mIHBpY2tlciBjaGFuZ2VzLiBSZXF1aXJlZCB0byBiZSB0aGUgc3ViamVjdCBiZWNhdXNlIHBpY2tlciBoaWRlcyBhbmQgc2hvd3MgYW5kIHBpY2tlclxyXG4gICAqIGNoYW5nZSBzdHJlYW0gYmVjb21lcyByZWNyZWF0ZWQuXHJcbiAgICogKi9cclxuICBwcm90ZWN0ZWQgb25DaGFuZ2UkOiBTdWJqZWN0PFQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgLypcclxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIHBpY2tlciBpbnN0YW5jZSBpdHNlbGYuXHJcbiAgICogKi9cclxuICBwcm90ZWN0ZWQgcGlja2VyUmVmOiBDb21wb25lbnRSZWY8YW55PjtcclxuXHJcbiAgcHJvdGVjdGVkIGFsaXZlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLypcclxuICAgKiBRdWV1ZSBjb250YWlucyB0aGUgbGFzdCB2YWx1ZSB0aGF0IHdhcyBhcHBsaWVkIHRvIHRoZSBwaWNrZXIgd2hlbiBpdCB3YXMgaGlkZGVuLlxyXG4gICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHBpY2tlciBhcyBzb29uIGFzIGl0IHNob3duLlxyXG4gICAqICovXHJcbiAgcHJvdGVjdGVkIHF1ZXVlOiBUO1xyXG5cclxuICBwcm90ZWN0ZWQgYmx1ciQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE5CX0RPQ1VNRU5UKSBwcm90ZWN0ZWQgZG9jdW1lbnQsXHJcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHBvc2l0aW9uQnVpbGRlcjogTmJQb3NpdGlvbkJ1aWxkZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBvdmVybGF5OiBOYk92ZXJsYXlTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgZGF0ZVNlcnZpY2U6IE5iRGF0ZVNlcnZpY2U8RD4sXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBSZXR1cm5zIHBpY2tlciBpbnN0YW5jZS5cclxuICAgKiAqL1xyXG4gIGdldCBwaWNrZXIoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnBpY2tlclJlZiAmJiB0aGlzLnBpY2tlclJlZi5pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogU3RyZWFtIG9mIHBpY2tlciB2YWx1ZSBjaGFuZ2VzLlxyXG4gICAqICovXHJcbiAgZ2V0IHZhbHVlQ2hhbmdlKCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMub25DaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzU2hvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWYgJiYgdGhpcy5yZWYuaGFzQXR0YWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogRW1pdHMgd2hlbiBkYXRlcGlja2VyIGxvb3NlcyBmb2N1cy5cclxuICAgKi9cclxuICBnZXQgYmx1cigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLmJsdXIkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCBwaWNrZXJWYWx1ZUNoYW5nZSgpOiBPYnNlcnZhYmxlPFQ+O1xyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGlmICh0aGlzLmRhdGVTZXJ2aWNlIGluc3RhbmNlb2YgTmJOYXRpdmVEYXRlU2VydmljZSAmJiB0aGlzLmZvcm1hdCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZm9ybWF0IG5hdGl2ZSBkYXRlLiBUbyB1c2UgY3VzdG9tIGZvcm1hdHRpbmcgeW91IGhhdmUgdG8gaW5zdGFsbCBAbmVidWxhci9tb21lbnQgb3IgJyArXHJcbiAgICAgICdAbmVidWxhci9kYXRlLWZucyBwYWNrYWdlIGFuZCBpbXBvcnQgTmJNb21lbnREYXRlTW9kdWxlIG9yIE5iRGF0ZUZuc0RhdGVNb2R1bGUgYWNjb3JkaW5nbHkuJyArXHJcbiAgICAgICdNb3JlIGluZm9ybWF0aW9uIGF0IFwiRm9ybWF0dGluZyBpc3N1ZVwiICcgK1xyXG4gICAgICAnaHR0cHM6Ly9ha3Zlby5naXRodWIuaW8vbmVidWxhci9kb2NzL2NvbXBvbmVudHMvZGF0ZXBpY2tlci9vdmVydmlldyNuYmRhdGVwaWNrZXJjb21wb25lbnQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5oaWRlKCk7XHJcbiAgICB0aGlzLnJlZi5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIERhdGVwaWNrZXIga25vd3Mgbm90aGluZyBhYm91dCBob3N0IGh0bWwgaW5wdXQgZWxlbWVudC5cclxuICAgKiBTbywgYXR0YWNoIG1ldGhvZCBhdHRhY2hlcyBkYXRlcGlja2VyIHRvIHRoZSBob3N0IGlucHV0IGVsZW1lbnQuXHJcbiAgICogKi9cclxuICBhdHRhY2goaG9zdFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgdGhpcy5ob3N0UmVmID0gaG9zdFJlZjtcclxuXHJcbiAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKTtcclxuICAgIHRoaXMucmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XHJcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucG9zaXRpb25TdHJhdGVneSxcclxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVPblBvc2l0aW9uQ2hhbmdlKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZU9uVHJpZ2dlcnMoKTtcclxuICB9XHJcblxyXG4gIGdldFZhbGlkYXRvckNvbmZpZygpOiBOYlBpY2tlclZhbGlkYXRvckNvbmZpZzxUPiB7XHJcbiAgICByZXR1cm4geyBtaW46IHRoaXMubWluLCBtYXg6IHRoaXMubWF4LCBmaWx0ZXI6IHRoaXMuZmlsdGVyIH07XHJcbiAgfVxyXG5cclxuICBzaG93KCkge1xyXG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnJlZi5hdHRhY2gobmV3IE5iQ29tcG9uZW50UG9ydGFsKE5iRGF0ZXBpY2tlckNvbnRhaW5lckNvbXBvbmVudCwgbnVsbCwgbnVsbCwgdGhpcy5jZnIpKTtcclxuICAgIHRoaXMuaW5zdGFudGlhdGVQaWNrZXIoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlT25WYWx1ZUNoYW5nZSgpO1xyXG4gICAgdGhpcy53cml0ZVF1ZXVlKCk7XHJcbiAgICB0aGlzLnBhdGNoV2l0aElucHV0cygpO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkSGlkZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhpZGVPblNlbGVjdCAmJiAhIXRoaXMudmFsdWU7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgdGhpcy5yZWYuZGV0YWNoKCk7XHJcbiAgICAvLyBzYXZlIGN1cnJlbnQgdmFsdWUgaWYgcGlja2VyIHdhcyByZW5kZXJlZFxyXG4gICAgaWYgKHRoaXMucGlja2VyKSB7XHJcbiAgICAgIHRoaXMucXVldWUgPSB0aGlzLnZhbHVlO1xyXG4gICAgICB0aGlzLnBpY2tlclJlZi5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMucGlja2VyUmVmID0gbnVsbDtcclxuICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHdyaXRlUXVldWUoKTtcclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKTogTmJBZGp1c3RhYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XHJcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbkJ1aWxkZXJcclxuICAgICAgLmNvbm5lY3RlZFRvKHRoaXMuaG9zdFJlZilcclxuICAgICAgLnBvc2l0aW9uKE5iUG9zaXRpb24uQk9UVE9NKVxyXG4gICAgICAuYWRqdXN0bWVudChOYkFkanVzdG1lbnQuQ09VTlRFUkNMT0NLV0lTRSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc3Vic2NyaWJlT25Qb3NpdGlvbkNoYW5nZSgpIHtcclxuICAgIHRoaXMucG9zaXRpb25TdHJhdGVneS5wb3NpdGlvbkNoYW5nZVxyXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHBvc2l0aW9uOiBOYlBvc2l0aW9uKSA9PiBwYXRjaCh0aGlzLmNvbnRhaW5lciwgeyBwb3NpdGlvbiB9KSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlVHJpZ2dlclN0cmF0ZWd5KCk6IE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuICAgIHJldHVybiBuZXcgTmJUcmlnZ2VyU3RyYXRlZ3lCdWlsZGVyKClcclxuICAgICAgLmRvY3VtZW50KHRoaXMuZG9jdW1lbnQpXHJcbiAgICAgIC50cmlnZ2VyKE5iVHJpZ2dlci5GT0NVUylcclxuICAgICAgLmhvc3QodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpXHJcbiAgICAgIC5jb250YWluZXIoKCkgPT4gdGhpcy5jb250YWluZXIpXHJcbiAgICAgIC5idWlsZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHN1YnNjcmliZU9uVHJpZ2dlcnMoKSB7XHJcbiAgICBjb25zdCB0cmlnZ2VyU3RyYXRlZ3kgPSB0aGlzLmNyZWF0ZVRyaWdnZXJTdHJhdGVneSgpO1xyXG4gICAgdHJpZ2dlclN0cmF0ZWd5LnNob3ckLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93KCkpO1xyXG4gICAgdHJpZ2dlclN0cmF0ZWd5LmhpZGUkLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuYWxpdmUpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmJsdXIkLm5leHQoKTtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpbnN0YW50aWF0ZVBpY2tlcigpIHtcclxuICAgIHRoaXMucGlja2VyUmVmID0gdGhpcy5jb250YWluZXIuaW5zdGFuY2UuYXR0YWNoKG5ldyBOYkNvbXBvbmVudFBvcnRhbCh0aGlzLnBpY2tlckNsYXNzLCBudWxsLCBudWxsLCB0aGlzLmNmcikpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTdWJzY3JpYmVzIG9uIHBpY2tlciB2YWx1ZSBjaGFuZ2VzIGFuZCBlbWl0IGRhdGEgdGhyb3VnaCB0aGlzLm9uQ2hhbmdlJCBzdWJqZWN0LlxyXG4gICAqICovXHJcbiAgcHJvdGVjdGVkIHN1YnNjcmliZU9uVmFsdWVDaGFuZ2UoKSB7XHJcbiAgICB0aGlzLnBpY2tlclZhbHVlQ2hhbmdlLnN1YnNjcmliZShkYXRlID0+IHtcclxuICAgICAgdGhpcy5vbkNoYW5nZSQubmV4dChkYXRlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHBhdGNoV2l0aElucHV0cygpIHtcclxuICAgIHRoaXMucGlja2VyLmJvdW5kaW5nTW9udGggPSB0aGlzLmJvdW5kaW5nTW9udGg7XHJcbiAgICB0aGlzLnBpY2tlci5zdGFydFZpZXcgPSB0aGlzLnN0YXJ0VmlldztcclxuICAgIHRoaXMucGlja2VyLm1pbiA9IHRoaXMubWluO1xyXG4gICAgdGhpcy5waWNrZXIubWF4ID0gdGhpcy5tYXg7XHJcbiAgICB0aGlzLnBpY2tlci5maWx0ZXIgPSB0aGlzLmZpbHRlcjtcclxuICAgIHRoaXMucGlja2VyLl9jZWxsQ29tcG9uZW50ID0gdGhpcy5kYXlDZWxsQ29tcG9uZW50O1xyXG4gICAgdGhpcy5waWNrZXIubW9udGhDZWxsQ29tcG9uZW50ID0gdGhpcy5tb250aENlbGxDb21wb25lbnQ7XHJcbiAgICB0aGlzLnBpY2tlci5feWVhckNlbGxDb21wb25lbnQgPSB0aGlzLnllYXJDZWxsQ29tcG9uZW50O1xyXG4gICAgdGhpcy5waWNrZXIuc2l6ZSA9IHRoaXMuc2l6ZTtcclxuICAgIHRoaXMucGlja2VyLnZpc2libGVEYXRlID0gdGhpcy52aXNpYmxlRGF0ZTtcclxuICB9XHJcbn1cclxuXHJcbi8qXHJcbiAqIFRoZSBEYXRlUGlja2VyIGNvbXBvbmVudHMgaXRzZWxmLlxyXG4gKiBQcm92aWRlcyBhIHByb3h5IHRvIGBOYkNhbGVuZGFyYCBvcHRpb25zIGFzIHdlbGwgYXMgY3VzdG9tIHBpY2tlciBvcHRpb25zLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYi1kYXRlcGlja2VyJyxcclxuICB0ZW1wbGF0ZTogJycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYkRhdGVwaWNrZXJDb21wb25lbnQ8RD4gZXh0ZW5kcyBOYkJhc2VQaWNrZXI8RCwgRCwgTmJDYWxlbmRhckNvbXBvbmVudDxEPj4ge1xyXG4gIHByb3RlY3RlZCBwaWNrZXJDbGFzczogVHlwZTxOYkNhbGVuZGFyQ29tcG9uZW50PEQ+PiA9IE5iQ2FsZW5kYXJDb21wb25lbnQ7XHJcblxyXG4gIC8qXHJcbiAgICogRGF0ZSB3aGljaCB3aWxsIGJlIHJlbmRlcmVkIGFzIHNlbGVjdGVkLlxyXG4gICAqICovXHJcbiAgQElucHV0KCkgc2V0IGRhdGUoZGF0ZTogRCkge1xyXG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEVtaXRzIGRhdGUgd2hlbiBzZWxlY3RlZC5cclxuICAgKiAqL1xyXG4gIEBPdXRwdXQoKSBnZXQgZGF0ZUNoYW5nZSgpOiBFdmVudEVtaXR0ZXI8RD4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVDaGFuZ2UgYXMgRXZlbnRFbWl0dGVyPEQ+O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IEQge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja2VyLmRhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgdmFsdWUoZGF0ZTogRCkge1xyXG4gICAgaWYgKCF0aGlzLnBpY2tlcikge1xyXG4gICAgICB0aGlzLnF1ZXVlID0gZGF0ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChkYXRlKSB7XHJcbiAgICAgIHRoaXMucGlja2VyLnZpc2libGVEYXRlID0gZGF0ZTtcclxuICAgICAgdGhpcy5waWNrZXIuZGF0ZSA9IGRhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IHBpY2tlclZhbHVlQ2hhbmdlKCk6IE9ic2VydmFibGU8RD4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja2VyLmRhdGVDaGFuZ2U7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgd3JpdGVRdWV1ZSgpIHtcclxuICAgIHRoaXMudmFsdWUgPSB0aGlzLnF1ZXVlO1xyXG4gIH1cclxufVxyXG5cclxuLypcclxuICogVGhlIFJhbmdlRGF0ZVBpY2tlciBjb21wb25lbnRzIGl0c2VsZi5cclxuICogUHJvdmlkZXMgYSBwcm94eSB0byBgTmJDYWxlbmRhclJhbmdlYCBvcHRpb25zIGFzIHdlbGwgYXMgY3VzdG9tIHBpY2tlciBvcHRpb25zLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYi1yYW5nZXBpY2tlcicsXHJcbiAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJSYW5nZXBpY2tlckNvbXBvbmVudDxEPiBleHRlbmRzIE5iQmFzZVBpY2tlcjxELCBOYkNhbGVuZGFyUmFuZ2U8RD4sIE5iQ2FsZW5kYXJSYW5nZUNvbXBvbmVudDxEPj4ge1xyXG4gIHByb3RlY3RlZCBwaWNrZXJDbGFzczogVHlwZTxOYkNhbGVuZGFyUmFuZ2VDb21wb25lbnQ8RD4+ID0gTmJDYWxlbmRhclJhbmdlQ29tcG9uZW50O1xyXG5cclxuICAvKlxyXG4gICAqIFJhbmdlIHdoaWNoIHdpbGwgYmUgcmVuZGVyZWQgYXMgc2VsZWN0ZWQuXHJcbiAgICogKi9cclxuICBASW5wdXQoKSBzZXQgcmFuZ2UocmFuZ2U6IE5iQ2FsZW5kYXJSYW5nZTxEPikge1xyXG4gICAgdGhpcy52YWx1ZSA9IHJhbmdlO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBFbWl0cyByYW5nZSB3aGVuIHN0YXJ0IHNlbGVjdGVkIGFuZCBlbWl0cyBhZ2FpbiB3aGVuIGVuZCBzZWxlY3RlZC5cclxuICAgKiAqL1xyXG4gIEBPdXRwdXQoKSBnZXQgcmFuZ2VDaGFuZ2UoKTogRXZlbnRFbWl0dGVyPE5iQ2FsZW5kYXJSYW5nZTxEPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVDaGFuZ2UgYXMgRXZlbnRFbWl0dGVyPE5iQ2FsZW5kYXJSYW5nZTxEPj47XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogTmJDYWxlbmRhclJhbmdlPEQ+IHtcclxuICAgIHJldHVybiB0aGlzLnBpY2tlci5yYW5nZTtcclxuICB9XHJcblxyXG4gIHNldCB2YWx1ZShyYW5nZTogTmJDYWxlbmRhclJhbmdlPEQ+KSB7XHJcbiAgICBpZiAoIXRoaXMucGlja2VyKSB7XHJcbiAgICAgIHRoaXMucXVldWUgPSByYW5nZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyYW5nZSkge1xyXG4gICAgICB0aGlzLnBpY2tlci52aXNpYmxlRGF0ZSA9IHJhbmdlICYmIHJhbmdlLnN0YXJ0O1xyXG4gICAgICB0aGlzLnBpY2tlci5yYW5nZSA9IHJhbmdlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBwaWNrZXJWYWx1ZUNoYW5nZSgpOiBPYnNlcnZhYmxlPE5iQ2FsZW5kYXJSYW5nZTxEPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGlja2VyLnJhbmdlQ2hhbmdlO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkSGlkZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdXBlci5zaG91bGRIaWRlKCkgJiYgISEodGhpcy52YWx1ZS5zdGFydCAmJiB0aGlzLnZhbHVlLmVuZCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgd3JpdGVRdWV1ZSgpIHtcclxuICAgIHRoaXMudmFsdWUgPSB0aGlzLnF1ZXVlO1xyXG4gIH1cclxufVxyXG4iXX0=