@hxui/angular
Version:
* * *
733 lines • 68.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, ElementRef, EventEmitter, forwardRef, NgZone, ComponentFactoryResolver, ViewContainerRef, Optional } from '@angular/core';
import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
import { Overlay, ScrollDispatcher } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { Subject } from 'rxjs/index';
import { DatepickerComponent } from './datepicker.component';
import { take, takeUntil } from 'rxjs/operators';
import { Directionality } from '@angular/cdk/bidi';
import { DatepickerConfig } from './datepicker.config';
var DatepickerFormComponent = /** @class */ (function () {
function DatepickerFormComponent(_elementRef, _viewContainerRef, overlay, _ngZone, _scrollDispatcher, _componentFactoryResolver, _config, _dir) {
var _this = this;
this._elementRef = _elementRef;
this._viewContainerRef = _viewContainerRef;
this.overlay = overlay;
this._ngZone = _ngZone;
this._scrollDispatcher = _scrollDispatcher;
this._componentFactoryResolver = _componentFactoryResolver;
this._config = _config;
this._dir = _dir;
this._destroyed = new Subject();
this.disabled = false;
this.readonly = false;
this.required = false;
this.defaultToPresentDate = true;
this.allowPreviousDates = true;
this.allowFutureDates = true;
this.dateFormat = 'dd/MM/y';
this.placeholder = 'Date';
this.helpText = 'Please select a date';
this.icon = 'hx-icon icon-calendar';
this.iconPlacement = 'right';
this.placement = 'bottom';
this.showDelay = this._config.showDelay;
this.hideDelay = this._config.hideDelay;
this.from = '';
this.to = '';
this.interval = false;
this.dueDateInterval = '0 day(s)'; // '1 week(s)' | '2 month(s)' | '3 year(s)'
// '1 week(s)' | '2 month(s)' | '3 year(s)'
this.onDateChange = new EventEmitter();
this.visible = false;
this.dateValidators = new Array();
this.onChanged = new Array();
this.onTouched = new Array();
this.onDateSelectEvent = function (inputDate) {
_this._hide();
_this.setDate(inputDate);
};
// get input reference
this._elementHtmlCollection = this._elementRef.nativeElement.getElementsByTagName('input');
}
/**
* Dispose the tooltip when destroyed.
*/
/**
* Dispose the tooltip when destroyed.
* @return {?}
*/
DatepickerFormComponent.prototype.ngOnDestroy = /**
* Dispose the tooltip when destroyed.
* @return {?}
*/
function () {
if (this._overlayRef) {
this._overlayRef.dispose();
this._calendarInstance = null;
}
this._destroyed.next();
this._destroyed.complete();
};
/**
* @return {?}
*/
DatepickerFormComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
// set element ref which will be used for dropdown positioning
this._elementHtmlRef = this._elementHtmlCollection.item(0);
/** @type {?} */
var date = new Date();
this.presentDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
if (this.defaultToPresentDate) {
setTimeout(function () {
_this.setDate(_this.presentDate);
});
}
// Close to the minimum and maxium possible dates, but still normalisable
// http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.1
/** @type {?} */
var from = this.parseDate(this.from) || new Date(-8630000000000000);
/** @type {?} */
var to = this.parseDate(this.to) || new Date(8630000000000000);
if (!!this.from || !!this.to) {
this.validateDateRange = this.createDateRangeValidator(from, to);
this.dateValidators.push(this.validateDateRange.bind(this));
}
if (!this.allowPreviousDates) {
this.dateValidators.push(this.validateIsNotBeforeDate.bind(this));
}
if (!this.allowFutureDates) {
this.dateValidators.push(this.validateIsNotAfterDate.bind(this));
}
};
/**
* @param {?} date
* @return {?}
*/
DatepickerFormComponent.prototype.setDate = /**
* @param {?} date
* @return {?}
*/
function (date) {
this.date = date;
this.onDateChange.emit(date);
this.propogateChange(date);
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerFormComponent.prototype.onChange = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
/** @type {?} */
var date = this.parseDate(inputDate);
if (inputDate === '') {
this.setDate(null);
}
else if (!!date) {
this.setDate(date);
}
else {
this.propogateChange(inputDate);
}
};
/**
* @return {?}
*/
DatepickerFormComponent.prototype.onFocus = /**
* @return {?}
*/
function () {
this._show();
this.propogateTouched();
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerFormComponent.prototype.onTab = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
this.onChange(inputDate);
this._hide();
this.propogateTouched();
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerFormComponent.prototype.parseDate = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
// Since Date.Parse() only acceps m/d/y dates, we have to swap the day and month
/** @type {?} */
var dateArray = inputDate.split(/[.,\/ -]/);
if (dateArray.length === 3 && dateArray[2].length !== 0) {
/** @type {?} */
var day = dateArray.shift();
dateArray.splice(1, 0, day);
/** @type {?} */
var parseInput = Date.parse(dateArray.join('/'));
if (!isNaN(parseInput)) {
return new Date(parseInput);
}
}
return null;
};
/**
* @param {?} date
* @return {?}
*/
DatepickerFormComponent.prototype.validateIsNotBeforeDate = /**
* @param {?} date
* @return {?}
*/
function (date) {
/** @type {?} */
var normalisedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
return normalisedDate.getTime() <= this.presentDate.getTime();
};
/**
* @param {?} date
* @return {?}
*/
DatepickerFormComponent.prototype.validateIsNotAfterDate = /**
* @param {?} date
* @return {?}
*/
function (date) {
/** @type {?} */
var normalisedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
return normalisedDate.getTime() >= this.presentDate.getTime();
};
/**
* @param {?} from
* @param {?} to
* @return {?}
*/
DatepickerFormComponent.prototype.createDateRangeValidator = /**
* @param {?} from
* @param {?} to
* @return {?}
*/
function (from, to) {
/** @type {?} */
var normalisedFromDate = new Date(from.getFullYear(), from.getMonth(), from.getDate());
/** @type {?} */
var normalisedToDate = new Date(to.getFullYear(), to.getMonth(), to.getDate());
return function (date) {
/** @type {?} */
var normalisedDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
return !(normalisedFromDate.getTime() <= normalisedDate.getTime() &&
normalisedDate.getTime() <= normalisedToDate.getTime());
};
};
/**
* @param {?} value
* @return {?}
*/
DatepickerFormComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== this.date) {
this.setDate(value);
}
};
/**
* @param {?} fn
* @return {?}
*/
DatepickerFormComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChanged.push(fn);
};
/**
* @param {?} fn
* @return {?}
*/
DatepickerFormComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched.push(fn);
};
/**
* @return {?}
*/
DatepickerFormComponent.prototype.propogateTouched = /**
* @return {?}
*/
function () {
this.onTouched.forEach(function (fn) { return fn(); });
};
/**
* @param {?} value
* @return {?}
*/
DatepickerFormComponent.prototype.propogateChange = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.onChanged.forEach(function (fn) { return fn(value); });
};
/**
* @param {?} control
* @return {?}
*/
DatepickerFormComponent.prototype.validate = /**
* @param {?} control
* @return {?}
*/
function (control) {
/** @type {?} */
var date = Date.parse(control.value);
if (!this.required && (control.value === null || control.value === undefined)) {
this.isValid = true;
return null;
}
if (isNaN(date)) {
this.isValid = false;
return {
dateParseError: {
valid: false
}
};
}
if (!this.allowPreviousDates && this.validateIsNotBeforeDate(this.date)) {
this.isValid = false;
return {
previousDateError: {
valid: false
}
};
}
if (!this.allowFutureDates && this.validateIsNotAfterDate(this.date)) {
this.isValid = false;
return {
futureDateError: {
valid: false
}
};
}
if (this.validateDateRange && this.validateDateRange(this.date)) {
this.isValid = false;
return {
dateRangeError: {
valid: false
}
};
}
if (this.required && !this.date) {
this.isValid = false;
return {
dateRequiredError: {
valid: false
}
};
}
this.isValid = true;
return null;
};
/**
* @param {?=} delay
* @return {?}
*/
DatepickerFormComponent.prototype._show = /**
* @param {?=} delay
* @return {?}
*/
function (delay) {
var _this = this;
if (delay === void 0) { delay = this.showDelay; }
if (this.disabled) {
return;
}
/** @type {?} */
var overlayRef = this._createOverlay();
this._detach();
this._portal = this._portal || new ComponentPortal(DatepickerComponent, this._viewContainerRef);
this._calendarInstance = overlayRef.attach(this._portal).instance;
this._calendarInstance.afterHidden()
.pipe(takeUntil(this._destroyed))
.subscribe(function () { return _this._detach(); });
this._updateTooltipContent();
(/** @type {?} */ (this._calendarInstance)).show(delay);
};
/**
* @param {?=} delay
* @return {?}
*/
DatepickerFormComponent.prototype._hide = /**
* @param {?=} delay
* @return {?}
*/
function (delay) {
if (delay === void 0) { delay = this.hideDelay; }
if (this._calendarInstance) {
this._calendarInstance.hide(delay);
}
};
/**
* @return {?}
*/
DatepickerFormComponent.prototype._createOverlay = /**
* @return {?}
*/
function () {
var _this = this;
if (this._overlayRef) {
return this._overlayRef;
}
/** @type {?} */
var positionStrategy = this.overlay.position()
.flexibleConnectedTo((/** @type {?} */ (this._elementHtmlRef)))
.withTransformOriginOn('.hxa-datepicker-control')
.withFlexibleDimensions(false);
this._overlayRef = this.overlay.create({
positionStrategy: positionStrategy,
panelClass: 'hxa-datepicker-calendar',
hasBackdrop: true,
backdropClass: 'cdk-overlay-transparent-backdrop',
scrollStrategy: this.overlay.scrollStrategies.reposition()
});
this._updatePosition();
this._overlayRef.detachments()
.pipe(takeUntil(this._destroyed))
.subscribe(function () { return _this._detach(); });
this._overlayRef.backdropClick().
subscribe(function () { return _this._hide(); });
/** @type {?} */
var position = (/** @type {?} */ (this._overlayRef.getConfig().positionStrategy));
position.positionChanges
.pipe(takeUntil(this._destroyed))
.subscribe(function (pos) {
if (pos.connectionPair.originX === 'start') {
_this.placement = 'left';
}
else if (pos.connectionPair.originX === 'end') {
_this.placement = 'right';
}
_this._updateTooltipContent();
});
return this._overlayRef;
};
/**
* @return {?}
*/
DatepickerFormComponent.prototype._updatePosition = /**
* @return {?}
*/
function () {
/** @type {?} */
var position = (/** @type {?} */ ((/** @type {?} */ (this._overlayRef)).getConfig().positionStrategy));
/** @type {?} */
var origin = this._getOrigin();
/** @type {?} */
var overlay = this._getOverlayPosition();
position.withPositions([
tslib_1.__assign({}, origin.main, overlay.main),
tslib_1.__assign({}, origin.fallback, overlay.fallback)
]);
};
/**
* Returns the origin position and a fallback position based on the user's position preference.
* The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`).
*/
/**
* Returns the origin position and a fallback position based on the user's position preference.
* The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`).
* @return {?}
*/
DatepickerFormComponent.prototype._getOrigin = /**
* Returns the origin position and a fallback position based on the user's position preference.
* The fallback position is the inverse of the origin (e.g. `'bottom' -> 'top'`).
* @return {?}
*/
function () {
/** @type {?} */
var placement = this.placement;
/** @type {?} */
var originPlacement;
if (placement === 'top' || placement === 'bottom') {
originPlacement = { originX: 'start', originY: placement === 'top' ? 'top' : 'bottom' };
}
else if (placement === 'left') {
originPlacement = { originX: 'start', originY: 'center' };
}
else if (placement === 'right') {
originPlacement = { originX: 'end', originY: 'center' };
}
else {
console.error('Position error', placement);
}
var _a = this._invertPosition(originPlacement.originX, originPlacement.originY), x = _a.x, y = _a.y;
return {
main: originPlacement,
fallback: { originX: x, originY: y }
};
};
/** Returns the overlay position and a fallback position based on the user's preference */
/**
* Returns the overlay position and a fallback position based on the user's preference
* @return {?}
*/
DatepickerFormComponent.prototype._getOverlayPosition = /**
* Returns the overlay position and a fallback position based on the user's preference
* @return {?}
*/
function () {
/** @type {?} */
var placement = this.placement;
/** @type {?} */
var overlayPlacement;
if (placement === 'top') {
overlayPlacement = { overlayX: 'start', overlayY: 'bottom' };
}
else if (placement === 'bottom') {
overlayPlacement = { overlayX: 'start', overlayY: 'top' };
}
else if (placement === 'left') {
overlayPlacement = { overlayX: 'end', overlayY: 'center' };
}
else if (placement === 'right') {
overlayPlacement = { overlayX: 'start', overlayY: 'center' };
}
else {
console.error('Could not find a position', placement);
}
var _a = this._invertPosition(overlayPlacement.overlayX, overlayPlacement.overlayY), x = _a.x, y = _a.y;
return {
main: overlayPlacement,
fallback: { overlayX: x, overlayY: y }
};
};
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
DatepickerFormComponent.prototype._invertPosition = /**
* @param {?} x
* @param {?} y
* @return {?}
*/
function (x, y) {
if (this.placement === 'top' || this.placement === 'bottom') {
if (y === 'top') {
y = 'bottom';
}
else if (y === 'bottom') {
y = 'top';
}
}
else {
if (x === 'end') {
x = 'start';
}
else if (x === 'start') {
x = 'end';
}
}
return { x: x, y: y };
};
/**
* @return {?}
*/
DatepickerFormComponent.prototype._detach = /**
* @return {?}
*/
function () {
if (this._overlayRef && this._overlayRef.hasAttached()) {
this._overlayRef.detach();
}
this._calendarInstance = null;
};
/** Updates the tooltip content and repositions the overlay according to the new content length */
/**
* Updates the tooltip content and repositions the overlay according to the new content length
* @return {?}
*/
DatepickerFormComponent.prototype._updateTooltipContent = /**
* Updates the tooltip content and repositions the overlay according to the new content length
* @return {?}
*/
function () {
var _this = this;
// Must wait for the content to be painted to the tooltip so that the overlay can properly
// calculate the correct positioning based on the size of its contents.
if (this._calendarInstance) {
this._calendarInstance.selectedDate = this.date;
this._calendarInstance.placement = this.placement;
this._calendarInstance.validators = this.dateValidators;
this._calendarInstance.onDateSelected = this.onDateSelectEvent;
this._calendarInstance.allowInterval = this.interval;
this._calendarInstance.selectedDueDateInterval = this.dueDateInterval;
this._ngZone.onMicrotaskEmpty.asObservable().pipe(take(1), takeUntil(this._destroyed)).subscribe(function () {
if (_this._calendarInstance) {
(/** @type {?} */ (_this._overlayRef)).updatePosition();
}
});
}
};
DatepickerFormComponent.decorators = [
{ type: Component, args: [{
selector: 'hxa-datepicker-input, hxa-datepicker-form',
template: "<div class=\"hx-input-group hxa-datepicker-form\">\n <i class=\"{{icon}}\" *ngIf=\"iconPlacement === 'left'\"></i>\n <div class=\"hx-input-control hxa-datepicker-control\" [ngClass]=\"{'is-danger': !isValid && datePickerForm.touched}\">\n <input class=\"hx-input\" type=\"text\" #datePickerForm=\"ngModel\"\n [required]=\"required ? true : null\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly ? true : null\"\n [ngModel]=\"date | date:dateFormat\"\n (change)=\"onChange(datePickerForm.value)\"\n (focus)=\"onFocus()\"\n (keydown.Tab)=\"onTab(datePickerForm.value)\">\n <label class=\"hx-label\" *ngIf=\"placeholder\">{{placeholder}} <sup *ngIf=\"required\">*</sup></label>\n <div class=\"hx-help\">{{helpText}}</div>\n </div>\n <i class=\"{{icon}}\" *ngIf=\"iconPlacement === 'right'\"></i>\n</div>\n",
styles: [".hxa-datepicker-form{position:relative;max-width:19rem}.hxa-datepicker-control{margin:0}.hxa-datepicker-calendar{position:absolute;z-index:99;left:0;max-width:19rem}.hxa-datepicker-calendar-top{bottom:100%}.hxa-datepicker-calendar-bottom{top:70%}.hxa-datepicker-calendar hxa-datepicker{max-width:19rem}.hxa-datepicker-help{font-size:.75rem;margin-top:.25rem;color:#63605f}.hxa-datepicker-form input[readonly]~.hx-label{top:-.5rem;font-size:.75rem;color:#41b987}hxa-datepicker{border:1px solid #d3d3d3;max-width:19rem}"],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return DatepickerFormComponent; }),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(function () { return DatepickerFormComponent; }),
multi: true,
}]
},] },
];
/** @nocollapse */
DatepickerFormComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: Overlay },
{ type: NgZone },
{ type: ScrollDispatcher },
{ type: ComponentFactoryResolver },
{ type: DatepickerConfig },
{ type: Directionality, decorators: [{ type: Optional }] }
]; };
DatepickerFormComponent.propDecorators = {
disabled: [{ type: Input }],
readonly: [{ type: Input }],
required: [{ type: Input }],
defaultToPresentDate: [{ type: Input }],
allowPreviousDates: [{ type: Input }],
allowFutureDates: [{ type: Input }],
dateFormat: [{ type: Input }],
placeholder: [{ type: Input }],
helpText: [{ type: Input }],
icon: [{ type: Input }],
iconPlacement: [{ type: Input }],
placement: [{ type: Input }],
showDelay: [{ type: Input }],
hideDelay: [{ type: Input }],
from: [{ type: Input }],
to: [{ type: Input }],
interval: [{ type: Input }],
dueDateInterval: [{ type: Input }],
onDateChange: [{ type: Output }]
};
return DatepickerFormComponent;
}());
export { DatepickerFormComponent };
if (false) {
/** @type {?} */
DatepickerFormComponent.prototype._overlayRef;
/** @type {?} */
DatepickerFormComponent.prototype._calendarInstance;
/** @type {?} */
DatepickerFormComponent.prototype._portal;
/** @type {?} */
DatepickerFormComponent.prototype._destroyed;
/** @type {?} */
DatepickerFormComponent.prototype.disabled;
/** @type {?} */
DatepickerFormComponent.prototype.readonly;
/** @type {?} */
DatepickerFormComponent.prototype.required;
/** @type {?} */
DatepickerFormComponent.prototype.defaultToPresentDate;
/** @type {?} */
DatepickerFormComponent.prototype.allowPreviousDates;
/** @type {?} */
DatepickerFormComponent.prototype.allowFutureDates;
/** @type {?} */
DatepickerFormComponent.prototype.dateFormat;
/** @type {?} */
DatepickerFormComponent.prototype.placeholder;
/** @type {?} */
DatepickerFormComponent.prototype.helpText;
/** @type {?} */
DatepickerFormComponent.prototype.icon;
/** @type {?} */
DatepickerFormComponent.prototype.iconPlacement;
/** @type {?} */
DatepickerFormComponent.prototype.placement;
/** @type {?} */
DatepickerFormComponent.prototype.showDelay;
/** @type {?} */
DatepickerFormComponent.prototype.hideDelay;
/** @type {?} */
DatepickerFormComponent.prototype.from;
/** @type {?} */
DatepickerFormComponent.prototype.to;
/** @type {?} */
DatepickerFormComponent.prototype.interval;
/** @type {?} */
DatepickerFormComponent.prototype.dueDateInterval;
/** @type {?} */
DatepickerFormComponent.prototype.onDateChange;
/** @type {?} */
DatepickerFormComponent.prototype.date;
/** @type {?} */
DatepickerFormComponent.prototype.visible;
/** @type {?} */
DatepickerFormComponent.prototype.presentDate;
/** @type {?} */
DatepickerFormComponent.prototype.isValid;
/** @type {?} */
DatepickerFormComponent.prototype.dateValidators;
/** @type {?} */
DatepickerFormComponent.prototype.onChanged;
/** @type {?} */
DatepickerFormComponent.prototype.onTouched;
/** @type {?} */
DatepickerFormComponent.prototype.validateDateRange;
/** @type {?} */
DatepickerFormComponent.prototype._elementHtmlRef;
/** @type {?} */
DatepickerFormComponent.prototype._elementHtmlCollection;
/** @type {?} */
DatepickerFormComponent.prototype.onDateSelectEvent;
/** @type {?} */
DatepickerFormComponent.prototype._elementRef;
/** @type {?} */
DatepickerFormComponent.prototype._viewContainerRef;
/** @type {?} */
DatepickerFormComponent.prototype.overlay;
/** @type {?} */
DatepickerFormComponent.prototype._ngZone;
/** @type {?} */
DatepickerFormComponent.prototype._scrollDispatcher;
/** @type {?} */
DatepickerFormComponent.prototype._componentFactoryResolver;
/** @type {?} */
DatepickerFormComponent.prototype._config;
/** @type {?} */
DatepickerFormComponent.prototype._dir;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLWZvcm0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFVLFVBQVUsRUFBZ0IsWUFBWSxFQUFFLFVBQVUsRUFDekUsTUFBTSxFQUFFLHdCQUF3QixFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFDeEUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBb0QsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwSCxPQUFPLEVBR3FCLE9BQU8sRUFDakMsZ0JBQWdCLEVBQ2pCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQ7SUEyR0UsaUNBQW9CLFdBQXVCLEVBQ3ZCLGlCQUFtQyxFQUNwQyxPQUFnQixFQUNmLE9BQWUsRUFDZixpQkFBbUMsRUFDbkMseUJBQW1ELEVBQ25ELE9BQXlCLEVBQ2IsSUFBb0I7UUFQcEQsaUJBV0M7UUFYbUIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FB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Q3pCLDBDQUF3Qjs7SUFDeEIsaURBQTZEOztJQUM3RCw0Q0FBdUQ7O0lBQ3ZELDRDQUE0Qzs7SUFFNUMsb0RBQW1EOztJQUNuRCxrREFBaUM7O0lBQ2pDLHlEQUErQzs7SUFrRS9DLG9EQUdDOztJQW5FVyw4Q0FBK0I7O0lBQy9CLG9EQUEyQzs7SUFDM0MsMENBQXVCOztJQUN2QiwwQ0FBdUI7O0lBQ3ZCLG9EQUEyQzs7SUFDM0MsNERBQTJEOztJQUMzRCwwQ0FBaUM7O0lBQ2pDLHVDQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBPbkluaXQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLFxyXG4gIE9uRGVzdHJveSwgTmdab25lLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIFZpZXdDb250YWluZXJSZWYsIE9wdGlvbmFsLCBWaWV3Q2hpbGQsIENvbnRlbnRDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgTkdfVkFMSURBVE9SUywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1xyXG4gIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSxcclxuICBIb3Jpem9udGFsQ29ubmVjdGlvblBvcyxcclxuICBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb24sIE92ZXJsYXlSZWYsXHJcbiAgU2Nyb2xsRGlzcGF0Y2hlciwgVmVydGljYWxDb25uZWN0aW9uUG9zXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQge0NvbXBvbmVudFBvcnRhbH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9pbmRleCc7XHJcbmltcG9ydCB7RGF0ZXBpY2tlckNvbXBvbmVudH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7dGFrZSwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcclxuaW1wb3J0IHtEYXRlcGlja2VyQ29uZmlnfSBmcm9tICcuL2RhdGVwaWNrZXIuY29uZmlnJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaHhhLWRhdGVwaWNrZXItaW5wdXQsIGh4YS1kYXRlcGlja2VyLWZvcm0nLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImh4LWlucHV0LWdyb3VwIGh4YS1kYXRlcGlja2VyLWZvcm1cIj5cclxuICA8aSBjbGFzcz1cInt7aWNvbn19XCIgKm5nSWY9XCJpY29uUGxhY2VtZW50ID09PSAnbGVmdCdcIj48L2k+XHJcbiAgPGRpdiBjbGFzcz1cImh4LWlucHV0LWNvbnRyb2wgaHhhLWRhdGVwaWNrZXItY29udHJvbFwiIFtuZ0NsYXNzXT1cInsnaXMtZGFuZ2VyJzogIWlzVmFsaWQgJiYgZGF0ZVBpY2tlckZvcm0udG91Y2hlZH1cIj5cclxuICAgIDxpbnB1dCBjbGFzcz1cImh4LWlucHV0XCIgdHlwZT1cInRleHRcIiAjZGF0ZVBpY2tlckZvcm09XCJuZ01vZGVsXCJcclxuICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkID8gdHJ1ZSA6IG51bGxcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkgPyB0cnVlIDogbnVsbFwiXHJcbiAgICAgIFtuZ01vZGVsXT1cImRhdGUgfCBkYXRlOmRhdGVGb3JtYXRcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKGRhdGVQaWNrZXJGb3JtLnZhbHVlKVwiXHJcbiAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAoa2V5ZG93bi5UYWIpPVwib25UYWIoZGF0ZVBpY2tlckZvcm0udmFsdWUpXCI+XHJcbiAgICA8bGFiZWwgY2xhc3M9XCJoeC1sYWJlbFwiICpuZ0lmPVwicGxhY2Vob2xkZXJcIj57e3BsYWNlaG9sZGVyfX0gPHN1cCAqbmdJZj1cInJlcXVpcmVkXCI+Kjwvc3VwPjwvbGFiZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaHgtaGVscFwiPnt7aGVscFRleHR9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxpIGNsYXNzPVwie3tpY29ufX1cIiAqbmdJZj1cImljb25QbGFjZW1lbnQgPT09ICdyaWdodCdcIj48L2k+XHJcbjwvZGl2PlxyXG5gLFxyXG4gIHN0eWxlczogW2AuaHhhLWRhdGVwaWNrZXItZm9ybXtwb3NpdGlvbjpyZWxhdGl2ZTttYXgtd2lkdGg6MTlyZW19Lmh4YS1kYXRlcGlja2VyLWNvbnRyb2x7bWFyZ2luOjB9Lmh4YS1kYXRlcGlja2VyLWNhbGVuZGFye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6OTk7bGVmdDowO21heC13aWR0aDoxOXJlbX0uaHhhLWRhdGVwaWNrZXItY2FsZW5kYXItdG9we2JvdHRvbToxMDAlfS5oeGEtZGF0ZXBpY2tlci1jYWxlbmRhci1ib3R0b217dG9wOjcwJX0uaHhhLWRhdGVwaWNrZXItY2FsZW5kYXIgaHhhLWRhdGVwaWNrZXJ7bWF4LXdpZHRoOjE5cmVtfS5oeGEtZGF0ZXBpY2tlci1oZWxwe2ZvbnQtc2l6ZTouNzVyZW07bWFyZ2luLXRvcDouMjVyZW07Y29sb3I6IzYzNjA1Zn0uaHhhLWRhdGVwaWNrZXItZm9ybSBpbnB1dFtyZWFkb25seV1+Lmh4LWxhYmVse3RvcDotLjVyZW07Zm9udC1zaXplOi43NXJlbTtjb2xvcjojNDFiOTg3fWh4YS1kYXRlcGlja2Vye2JvcmRlcjoxcHggc29saWQgI2QzZDNkMzttYXgtd2lkdGg6MTlyZW19YF0sXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlcGlja2VyRm9ybUNvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH0sXHJcbiAge1xyXG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVwaWNrZXJGb3JtQ29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcclxuXHJcbiAgX292ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsO1xyXG4gIF9jYWxlbmRhckluc3RhbmNlOiBEYXRlcGlja2VyQ29tcG9uZW50IHwgbnVsbDtcclxuICBwcml2YXRlIF9wb3J0YWw6IENvbXBvbmVudFBvcnRhbDxEYXRlcGlja2VyQ29tcG9uZW50PjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcmVhZG9ubHkgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICByZXF1aXJlZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRlZmF1bHRUb1ByZXNlbnREYXRlID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBhbGxvd1ByZXZpb3VzRGF0ZXMgPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGFsbG93RnV0dXJlRGF0ZXMgPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGRhdGVGb3JtYXQgPSAnZGQvTU0veSc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcGxhY2Vob2xkZXIgPSAnRGF0ZSc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaGVscFRleHQgPSAnUGxlYXNlIHNlbGVjdCBhIGRhdGUnO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGljb24gPSAnaHgtaWNvbiBpY29uLWNhbGVuZGFyJztcclxuXHJcbiAgQElucHV0KClcclxuICBpY29uUGxhY2VtZW50ID0gJ3JpZ2h0JztcclxuXHJcb