com.phloxui
Version:
PhloxUI Ng2+ Framework
561 lines (560 loc) • 46.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core';
import { TimePicker } from '../../../../../component/dataview/input/TimePicker.component';
import { NeedFocusService } from '../../../../../service/NeedFocusService.service';
import { I18N } from '../../../../../decorator/I18N.decorator';
import { Option } from '../../../../../decorator/Option.decorator';
import { FormatterFactory } from '../../../../../service/FormatterFactory.service';
import { PhloxAppInfoService } from '../../../../../service/PhloxAppInfoService.service';
const /** @type {?} */ TYPE_NAME = "material-time-picker";
const /** @type {?} */ DEFAULT_BUTTON_ICON = 'access_time';
const /** @type {?} */ DEFAULT_BUTTON_POSITION = 'suffix';
export class MaterialTimePicker extends TimePicker {
/**
* @param {?} elementRef
* @param {?} needFocusService
* @param {?} formatterFactory
* @param {?} phloxAppInfoService
*/
constructor(elementRef, needFocusService, formatterFactory, phloxAppInfoService) {
super(elementRef, needFocusService, formatterFactory, phloxAppInfoService);
this.buttonIcon = DEFAULT_BUTTON_ICON;
this.buttonPosition = DEFAULT_BUTTON_POSITION;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
}
/**
* @return {?}
*/
getClassMatFocused() {
return this.isReadOnly() ? { 'mat-focused': this.isClassFocused() } : {};
}
/**
* @param {?} $event
* @return {?}
*/
doLostFocus($event) {
// Super will always hide popup in doLostFocus().
super.doLostFocus($event);
this._classFocused = false;
}
/**
* @param {?} $event
* @return {?}
*/
onClick($event) {
this._btnIconClick = true;
}
/**
* @param {?} event
* @return {?}
*/
onFocus(event) {
super.onFocus(event);
this._classFocused = true;
}
/**
* @param {?} $event
* @return {?}
*/
onFocusing($event) {
if (this._btnIconClick) {
super.onFocusing($event);
}
}
/**
* @param {?} $event
* @return {?}
*/
onLostFocusing($event) {
if (this._btnIconClick || this.isActive()) {
this._btnIconClick = false;
super.onLostFocusing($event);
}
}
/**
* @return {?}
*/
isClassFocused() {
return this._classFocused;
}
/**
* @return {?}
*/
getButtonIcon() {
return (!this.buttonIcon ? DEFAULT_BUTTON_ICON : this.buttonIcon);
;
}
/**
* @param {?} buttonIcon
* @return {?}
*/
setButtonIcon(buttonIcon) {
this.buttonIcon = buttonIcon;
}
/**
* @return {?}
*/
getButtonPosition() {
return (!this.buttonPosition ? DEFAULT_BUTTON_POSITION : this.buttonPosition);
}
/**
* @param {?} buttonPosition
* @return {?}
*/
setButtonPosition(buttonPosition) {
this.buttonPosition = buttonPosition;
}
/**
* @return {?}
*/
getLabel() {
return this.label;
}
/**
* @param {?} label
* @return {?}
*/
setLabel(label) {
this.label = label;
}
/**
* @return {?}
*/
getDescription() {
return this.description;
}
/**
* @param {?} description
* @return {?}
*/
setDescription(description) {
this.description = description;
}
}
MaterialTimePicker.TYPE_NAME = TYPE_NAME;
MaterialTimePicker.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="material-input material-time-picker" [style.width]="getWidth()" [style.height]="getHeight()">
<div class="time-picker-wrapper" [class.active]="isActive()">
<div class="time-picker-table">
<div>
<div class="table-wrapper">
<mat-form-field [ngClass]="getClassMatFocused()">
<input matInput type="text" placeholder="{{getLabel() | phx_text}}" class="form-control" [class.focus]="isActive()" [disabled]="isDisabled()"
[class.dirty]="isDataDirty()" [readonly]="isReadOnly()" [value]="formattedData | phx_text" (focus)="onFocusing($event)" (blur)="onLostFocusing($event)"
(change)="onValueChanged($event)" [class.normal]="isNormal()" [class.success]="isSuccess()" [class.warning]="isWarning()" [class.error]="isError()">
<button mat-button *ngIf="getButtonIcon() && (formattedData && getButtonPosition() === 'suffix' && !(isDisabled() || isReadOnly()))" (click)="onClick($event)" matSuffix mat-icon-button>
<mat-icon>{{getButtonIcon()}}</mat-icon>
</button>
<button mat-button *ngIf="getButtonIcon() && (formattedData && getButtonPosition() === 'prefix' && !(isDisabled() || isReadOnly()))" (click)="onClick($event)" matPrefix mat-icon-button>
<mat-icon>{{getButtonIcon()}}</mat-icon>
</button>
<button mat-button *ngIf="getButtonIcon() && (formattedData && getButtonPosition() === 'suffix' && (isDisabled() || isReadOnly()))" (click)="onClick($event)" disabled matSuffix mat-icon-button>
<mat-icon>{{getButtonIcon()}}</mat-icon>
</button>
<button mat-button *ngIf="getButtonIcon() && (formattedData && getButtonPosition() === 'prefix' && (isDisabled() || isReadOnly()))" (click)="onClick($event)" disabled matPrefix mat-icon-button>
<mat-icon>{{getButtonIcon()}}</mat-icon>
</button>
</mat-form-field>
<div class="time-picker-view" [class.show]="isActive()" [style.top]="getPopupPositionTop() ? getPopupPositionTop() + 'px' : undefined" [style.left]="getPopupPositionLeft() ? getPopupPositionLeft() + 'px' : undefined">
<div class="time-view-wrapper">
<div class="time-view" [class.not-open-sec]="_isNotOpenSecShow()">
<div class="icon-arrow-up" (mousedown)="onUpArrow($event, HOUR)"></div>
<div *ngFor="let hour of getRangeHour(); let i = index;" class="time-number" [class.selected]="_isCurrentHourTime(hour)" (mousedown)="onTimeClicked($event, hour, HOUR)">
{{hour | number:'2.0-0'}}
</div>
<div class="icon-arrow-down" (mousedown)="onDownArrow($event, HOUR)"></div>
</div>
<div class="time-view" [class.not-open-sec]="_isNotOpenSecShow()">
<div class="icon-arrow-up" (mousedown)="onUpArrow($event, MIN)"></div>
<div *ngFor="let min of getRangeMin(); let i = index;" class="time-number" [class.selected]="_isCurrentMinTime(min)" (mousedown)="onTimeClicked($event, min, MIN)">
{{min | number:'2.0-0'}}
</div>
<div class="icon-arrow-down" (mousedown)="onDownArrow($event, MIN)"></div>
</div>
<div class="time-view" [class.not-open-sec]="_isNotOpenSecShow()">
<div class="icon-arrow-up" (mousedown)="onUpArrow($event, SEC)"></div>
<div *ngFor="let sec of getRangeSec(); let i = index;" class="time-number" [class.selected]="_isCurrentSecTime(sec)" (mousedown)="onTimeClicked($event, sec, SEC)">
{{sec | number:'2.0-0'}}
</div>
<div class="icon-arrow-down" (mousedown)="onDownArrow($event, SEC)"></div>
</div>
</div>
</div>
</div>
</div>
<div>
<div class="table-wrapper description-wrapper">
<div class="validation" [style.display]="getValidationResultMessage() ? undefined : 'none'" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()">
<ng-template [ngIf]="getValidationResultMessage()" [ngIfElse]="validation_else">
{{getValidationResultMessage() | phx_text}}
</ng-template>
<ng-template #validation_else>
<!-- We've to put whitespace if there is no validation msg to prevent empty dom -->
<!-- since if validate msg's <div> dom is empty, the component positioning -->
<!-- will be misplaced. -->
{{ ' ' }}
</ng-template>
</div>
<div class="description" [style.display]="getValidationResultMessage() ? 'none' : undefined" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()">
<ng-template [ngIf]="getDescription()" [ngIfElse]="description_else">
{{ getDescription() | phx_text }}
</ng-template>
<ng-template #description_else>
<!-- We've to put whitespace if there is no description to prevent empty dom -->
<!-- since if description's <div> dom is empty, the component positioning -->
<!-- will be misplaced. -->
{{ ' ' }}
</ng-template>
</div>
</div>
</div>
<div>
<div class="table-wrapper help-wrapper">
<div class="help">{{getHelp() | phx_text}}</div>
</div>
</div>
</div>
</div>
</div>
`
},] },
];
/** @nocollapse */
MaterialTimePicker.ctorParameters = () => [
{ type: ElementRef, },
{ type: NeedFocusService, },
{ type: FormatterFactory, },
{ type: PhloxAppInfoService, },
];
MaterialTimePicker.propDecorators = {
"dataParent": [{ type: Input },],
"ignoreParentData": [{ type: Input },],
"data": [{ type: Input },],
"ignoreParentDisabled": [{ type: Input },],
"delegateHistory": [{ type: Input },],
"onDisabled": [{ type: Input },],
"onEnabled": [{ type: Input },],
"loadingEnabled": [{ type: Input },],
"i18nKey": [{ type: Input },],
"bypass": [{ type: Input, args: ['i18nBypass',] },],
"options": [{ type: Input },],
"disabled": [{ type: Input },],
"field": [{ type: Input },],
"name": [{ type: Input },],
"typeOfData": [{ type: Input },],
"readOnly": [{ type: Input },],
"help": [{ type: Input },],
"formatter": [{ type: Input, args: ['formatter',] },],
"formatterName": [{ type: Input, args: ['formatterName',] },],
"formatterOptions": [{ type: Input, args: ['formatterOptions',] },],
"formatterUsePropertyValue": [{ type: Input, args: ['formatterUsePropertyValue',] },],
"dataPattern": [{ type: Input },],
"range": [{ type: Input },],
"hideSecond": [{ type: Input },],
"width": [{ type: Input },],
"height": [{ type: Input },],
"label": [{ type: Input },],
"description": [{ type: Input },],
"buttonIcon": [{ type: Input },],
"buttonPosition": [{ type: Input },],
"loadEvent": [{ type: Output, args: ['phxLoad',] },],
"startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },],
"endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },],
"beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },],
"focusEvent": [{ type: Output, args: ['phxFocus',] },],
"beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },],
"lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },],
"beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },],
"changeEvent": [{ type: Output, args: ['phxChange',] },],
"beforeViewShowEvent": [{ type: Output, args: ['phxBeforeViewShow',] },],
"viewShowEvent": [{ type: Output, args: ['phxViewShow',] },],
"beforeViewHideEvent": [{ type: Output, args: ['phxBeforeViewHide',] },],
"viewHideEvent": [{ type: Output, args: ['phxViewHide',] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], MaterialTimePicker.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialTimePicker.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], MaterialTimePicker.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialTimePicker.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialTimePicker.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], MaterialTimePicker.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], MaterialTimePicker.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialTimePicker.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], MaterialTimePicker.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialTimePicker.prototype, "disabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "field", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "name", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "typeOfData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialTimePicker.prototype, "readOnly", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], MaterialTimePicker.prototype, "help", void 0);
tslib_1.__decorate([
Option('formatter.instance'),
tslib_1.__metadata("design:type", Object)
], MaterialTimePicker.prototype, "formatter", void 0);
tslib_1.__decorate([
Option('formatter.name'),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "formatterName", void 0);
tslib_1.__decorate([
Option('formatter.options'),
tslib_1.__metadata("design:type", Object)
], MaterialTimePicker.prototype, "formatterOptions", void 0);
tslib_1.__decorate([
Option('formatter.usePropertyValue'),
tslib_1.__metadata("design:type", Boolean)
], MaterialTimePicker.prototype, "formatterUsePropertyValue", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "dataPattern", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Number)
], MaterialTimePicker.prototype, "range", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MaterialTimePicker.prototype, "hideSecond", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "width", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "height", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "label", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "description", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "buttonIcon", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], MaterialTimePicker.prototype, "buttonPosition", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('startValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "startValidateEvent", void 0);
tslib_1.__decorate([
Option('endValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "endValidateEvent", void 0);
tslib_1.__decorate([
Option('beforeFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "beforeFocusEvent", void 0);
tslib_1.__decorate([
Option('focus'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "focusEvent", void 0);
tslib_1.__decorate([
Option('beforeLostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "beforeLostFocusEvent", void 0);
tslib_1.__decorate([
Option('lostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "lostFocusEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "beforeChangeEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "changeEvent", void 0);
tslib_1.__decorate([
Option('beforeViewShow'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "beforeViewShowEvent", void 0);
tslib_1.__decorate([
Option('viewShow'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "viewShowEvent", void 0);
tslib_1.__decorate([
Option('beforeViewHide'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "beforeViewHideEvent", void 0);
tslib_1.__decorate([
Option('viewHide'),
tslib_1.__metadata("design:type", EventEmitter)
], MaterialTimePicker.prototype, "viewHideEvent", void 0);
function MaterialTimePicker_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
MaterialTimePicker.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
MaterialTimePicker.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
MaterialTimePicker.propDecorators;
/** @type {?} */
MaterialTimePicker.TYPE_NAME;
/** @type {?} */
MaterialTimePicker.prototype.dataParent;
/** @type {?} */
MaterialTimePicker.prototype.ignoreParentData;
/** @type {?} */
MaterialTimePicker.prototype.data;
/** @type {?} */
MaterialTimePicker.prototype.ignoreParentDisabled;
/** @type {?} */
MaterialTimePicker.prototype.delegateHistory;
/** @type {?} */
MaterialTimePicker.prototype.onDisabled;
/** @type {?} */
MaterialTimePicker.prototype.onEnabled;
/** @type {?} */
MaterialTimePicker.prototype.loadingEnabled;
/** @type {?} */
MaterialTimePicker.prototype.i18nKey;
/** @type {?} */
MaterialTimePicker.prototype.bypass;
/** @type {?} */
MaterialTimePicker.prototype.options;
/** @type {?} */
MaterialTimePicker.prototype.disabled;
/** @type {?} */
MaterialTimePicker.prototype.field;
/** @type {?} */
MaterialTimePicker.prototype.name;
/** @type {?} */
MaterialTimePicker.prototype.typeOfData;
/** @type {?} */
MaterialTimePicker.prototype.readOnly;
/** @type {?} */
MaterialTimePicker.prototype.help;
/** @type {?} */
MaterialTimePicker.prototype.formatter;
/** @type {?} */
MaterialTimePicker.prototype.formatterName;
/** @type {?} */
MaterialTimePicker.prototype.formatterOptions;
/** @type {?} */
MaterialTimePicker.prototype.formatterUsePropertyValue;
/** @type {?} */
MaterialTimePicker.prototype.dataPattern;
/** @type {?} */
MaterialTimePicker.prototype.range;
/** @type {?} */
MaterialTimePicker.prototype.hideSecond;
/** @type {?} */
MaterialTimePicker.prototype.width;
/** @type {?} */
MaterialTimePicker.prototype.height;
/** @type {?} */
MaterialTimePicker.prototype.label;
/** @type {?} */
MaterialTimePicker.prototype.description;
/** @type {?} */
MaterialTimePicker.prototype.buttonIcon;
/** @type {?} */
MaterialTimePicker.prototype.buttonPosition;
/** @type {?} */
MaterialTimePicker.prototype.loadEvent;
/** @type {?} */
MaterialTimePicker.prototype.startValidateEvent;
/** @type {?} */
MaterialTimePicker.prototype.endValidateEvent;
/** @type {?} */
MaterialTimePicker.prototype.beforeFocusEvent;
/** @type {?} */
MaterialTimePicker.prototype.focusEvent;
/** @type {?} */
MaterialTimePicker.prototype.beforeLostFocusEvent;
/** @type {?} */
MaterialTimePicker.prototype.lostFocusEvent;
/** @type {?} */
MaterialTimePicker.prototype.beforeChangeEvent;
/** @type {?} */
MaterialTimePicker.prototype.changeEvent;
/** @type {?} */
MaterialTimePicker.prototype.beforeViewShowEvent;
/** @type {?} */
MaterialTimePicker.prototype.viewShowEvent;
/** @type {?} */
MaterialTimePicker.prototype.beforeViewHideEvent;
/** @type {?} */
MaterialTimePicker.prototype.viewHideEvent;
/** @type {?} */
MaterialTimePicker.prototype._classFocused;
/** @type {?} */
MaterialTimePicker.prototype._btnIconClick;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0ZXJpYWxUaW1lUGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3RoZW1lL21hdGVyaWFsL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NYXRlcmlhbFRpbWVQaWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBRTFGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRW5GLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFekYsdUJBQU0sU0FBUyxHQUFXLHNCQUFzQixDQUFDO0FBRWpELHVCQUFNLG1CQUFtQixHQUFHLGFBQWEsQ0FBQztBQUMxQyx1QkFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUM7QUEyRnpDLE1BQU0seUJBQTBCLFNBQVEsVUFBVTs7Ozs7OztJQTJKaEQsWUFBWSxVQUFzQixFQUFFLGdCQUFrQyxFQUFFLGdCQUFrQyxFQUFFLG1CQUF3QztRQUNsSixLQUFLLENBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFFM0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQztRQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLHVCQUF1QixDQUFDO0tBQy9DOzs7O0lBRU0sUUFB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QUM7Ozs7SUFHNUIsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7O0lBR3hCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQzs7OztJQUczQixNQUFNLENBQUMsNEJBQTRCLENBQUM7Ozs7SUFJcEMsTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBSVIsSUFBSSxFQUFFO0lBQ04sTUFBTSxFQUFFOzs7O0lBR1IsSUFBSSxFQUFFO0lBQ04sTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBTVIsTUFBTSxDQUFDLE1BQU0sQ0FBQztzQ0FDTSxZQUFZOzs7SUFJaEMsTUFBTSxDQUFDLGVBQWUsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFekMsTUFBTSxDQUFDLGFBQWEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFdkMsTUFBTSxDQUFDLGFBQWEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQztzQ0FDTSxZQUFZOzs7SUFFakMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO3NDQUNNLFlBQVk7OztJQUUzQyxNQUFNLENBQUMsV0FBVyxDQUFDO3NDQUNNLFlBQVk7OztJQUVyQyxNQUFNLENBQUMsY0FBYyxDQUFDO3NDQUNNLFlBQVk7OztJQUV4QyxNQUFNLENBQUMsUUFBUSxDQUFDO3NDQUNNLFlBQVk7OztJQUlsQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7c0NBQ00sWUFBWTs7O0lBRTFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7c0NBQ00sWUFBWTs7O0lBRXBDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFMUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztzQ0FDTSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUaW1lUGlja2VyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L1RpbWVQaWNrZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9JTmVlZEZvY3VzJztcclxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSUZvcm1hdHRlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL2Zvcm1hdHRlci9JRm9ybWF0dGVyJztcclxuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb21wb25lbnQvSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBGb3JtYXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZS9Gb3JtYXR0ZXJGYWN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQaGxveEFwcEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2VydmljZS9QaGxveEFwcEluZm9TZXJ2aWNlLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcIm1hdGVyaWFsLXRpbWUtcGlja2VyXCI7XHJcblxyXG5jb25zdCBERUZBVUxUX0JVVFRPTl9JQ09OID0gJ2FjY2Vzc190aW1lJztcclxuY29uc3QgREVGQVVMVF9CVVRUT05fUE9TSVRJT04gPSAnc3VmZml4JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dCBtYXRlcmlhbC10aW1lLXBpY2tlclwiIFtzdHlsZS53aWR0aF09XCJnZXRXaWR0aCgpXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIZWlnaHQoKVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci13cmFwcGVyXCIgW2NsYXNzLmFjdGl2ZV09XCJpc0FjdGl2ZSgpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItdGFibGVcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlclwiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtuZ0NsYXNzXT1cImdldENsYXNzTWF0Rm9jdXNlZCgpXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwie3tnZXRMYWJlbCgpIHwgcGh4X3RleHR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW2NsYXNzLmZvY3VzXT1cImlzQWN0aXZlKClcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgW2NsYXNzLmRpcnR5XT1cImlzRGF0YURpcnR5KClcIiBbcmVhZG9ubHldPVwiaXNSZWFkT25seSgpXCIgW3ZhbHVlXT1cImZvcm1hdHRlZERhdGEgfCBwaHhfdGV4dFwiIChmb2N1cyk9XCJvbkZvY3VzaW5nKCRldmVudClcIiAoYmx1cik9XCJvbkxvc3RGb2N1c2luZygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKClcIiBbY2xhc3Muc3VjY2Vzc109XCJpc1N1Y2Nlc3MoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpXCIgW2NsYXNzLmVycm9yXT1cImlzRXJyb3IoKVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cImdldEJ1dHRvbkljb24oKSAmJiAoZm9ybWF0dGVkRGF0YSAmJiBnZXRCdXR0b25Qb3NpdGlvbigpID09PSAnc3VmZml4JyAmJiAhKGlzRGlzYWJsZWQoKSB8fCBpc1JlYWRPbmx5KCkpKVwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgXHRcdFx0PG1hdC1pY29uPnt7Z2V0QnV0dG9uSWNvbigpfX08L21hdC1pY29uPlxyXG4gICAgICBcdFx0XHRcdDwvYnV0dG9uPlxyXG4gICAgICBcdFx0XHRcdDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cImdldEJ1dHRvbkljb24oKSAmJiAoZm9ybWF0dGVkRGF0YSAmJiBnZXRCdXR0b25Qb3NpdGlvbigpID09PSAncHJlZml4JyAmJiAhKGlzRGlzYWJsZWQoKSB8fCBpc1JlYWRPbmx5KCkpKVwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiBtYXRQcmVmaXggbWF0LWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgXHRcdFx0PG1hdC1pY29uPnt7Z2V0QnV0dG9uSWNvbigpfX08L21hdC1pY29uPlxyXG4gICAgICBcdFx0XHRcdDwvYnV0dG9uPlxyXG4gICAgICBcdFx0XHRcdDxidXR0b24gbWF0LWJ1dHRvbiAqbmdJZj1cImdldEJ1dHRvbkljb24oKSAmJiAoZm9ybWF0dGVkRGF0YSAmJiBnZXRCdXR0b25Qb3NpdGlvbigpID09PSAnc3VmZml4JyAmJiAoaXNEaXNhYmxlZCgpIHx8IGlzUmVhZE9ubHkoKSkpXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiIGRpc2FibGVkIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICBcdFx0XHQ8bWF0LWljb24+e3tnZXRCdXR0b25JY29uKCl9fTwvbWF0LWljb24+XHJcbiAgICAgIFx0XHRcdFx0PC9idXR0b24+XHJcbiAgICAgIFx0XHRcdFx0PGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwiZ2V0QnV0dG9uSWNvbigpICYmIChmb3JtYXR0ZWREYXRhICYmIGdldEJ1dHRvblBvc2l0aW9uKCkgPT09ICdwcmVmaXgnICYmIChpc0Rpc2FibGVkKCkgfHwgaXNSZWFkT25seSgpKSlcIiAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCIgZGlzYWJsZWQgbWF0UHJlZml4IG1hdC1pY29uLWJ1dHRvbj5cclxuICAgICAgICAgIFx0XHRcdDxtYXQtaWNvbj57e2dldEJ1dHRvbkljb24oKX19PC9tYXQtaWNvbj5cclxuICAgICAgXHRcdFx0XHQ8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItdmlld1wiIFtjbGFzcy5zaG93XT1cImlzQWN0aXZlKClcIiBbc3R5bGUudG9wXT1cImdldFBvcHVwUG9zaXRpb25Ub3AoKSA/IGdldFBvcHVwUG9zaXRpb25Ub3AoKSArICdweCcgOiB1bmRlZmluZWRcIiBbc3R5bGUubGVmdF09XCJnZXRQb3B1cFBvc2l0aW9uTGVmdCgpID8gZ2V0UG9wdXBQb3NpdGlvbkxlZnQoKSArICdweCcgOiB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlldy13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlld1wiIFtjbGFzcy5ub3Qtb3Blbi1zZWNdPVwiX2lzTm90T3BlblNlY1Nob3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctdXBcIiAobW91c2Vkb3duKT1cIm9uVXBBcnJvdygkZXZlbnQsIEhPVVIpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBob3VyIG9mIGdldFJhbmdlSG91cigpOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwidGltZS1udW1iZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiX2lzQ3VycmVudEhvdXJUaW1lKGhvdXIpXCIgKG1vdXNlZG93bik9XCJvblRpbWVDbGlja2VkKCRldmVudCwgaG91ciwgSE9VUilcIj5cclxuICAgICAgICAgICAgICAgICAge3tob3VyIHwgbnVtYmVyOicyLjAtMCd9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1hcnJvdy1kb3duXCIgKG1vdXNlZG93bik9XCJvbkRvd25BcnJvdygkZXZlbnQsIEhPVVIpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlld1wiIFtjbGFzcy5ub3Qtb3Blbi1zZWNdPVwiX2lzTm90T3BlblNlY1Nob3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctdXBcIiAobW91c2Vkb3duKT1cIm9uVXBBcnJvdygkZXZlbnQsIE1JTilcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG1pbiBvZiBnZXRSYW5nZU1pbigpOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwidGltZS1udW1iZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiX2lzQ3VycmVudE1pblRpbWUobWluKVwiIChtb3VzZWRvd24pPVwib25UaW1lQ2xpY2tlZCgkZXZlbnQsIG1pbiwgTUlOKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e21pbiB8IG51bWJlcjonMi4wLTAnfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiIChtb3VzZWRvd24pPVwib25Eb3duQXJyb3coJGV2ZW50LCBNSU4pXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtdmlld1wiIFtjbGFzcy5ub3Qtb3Blbi1zZWNdPVwiX2lzTm90T3BlblNlY1Nob3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctdXBcIiAobW91c2Vkb3duKT1cIm9uVXBBcnJvdygkZXZlbnQsIFNFQylcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNlYyBvZiBnZXRSYW5nZVNlYygpOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwidGltZS1udW1iZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiX2lzQ3VycmVudFNlY1RpbWUoc2VjKVwiIChtb3VzZWRvd24pPVwib25UaW1lQ2xpY2tlZCgkZXZlbnQsIHNlYywgU0VDKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3NlYyB8IG51bWJlcjonMi4wLTAnfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiIChtb3VzZWRvd24pPVwib25Eb3duQXJyb3coJGV2ZW50LCBTRUMpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGRlc2NyaXB0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWxpZGF0aW9uXCIgW3N0eWxlLmRpc3BsYXldPVwiZ2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSA/IHVuZGVmaW5lZCA6ICdub25lJ1wiIFtjbGFzcy5ub3JtYWxdPVwiaXNOb3JtYWwoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLnN1Y2Nlc3NdPVwiaXNTdWNjZXNzKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3MuZXJyb3JdPVwiaXNFcnJvcigpICYmICFpc0Rpc2FibGVkKClcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKClcIiBbbmdJZkVsc2VdPVwidmFsaWRhdGlvbl9lbHNlXCI+XHJcbiAgICAgICAgICAgICAge3tnZXRWYWxpZGF0aW9uUmVzdWx0TWVzc2FnZSgpIHwgcGh4X3RleHR9fVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3ZhbGlkYXRpb25fZWxzZT5cclxuICAgICAgICAgICAgICA8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gbXNnIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gc2luY2UgaWYgdmFsaWRhdGUgbXNnJ3MgPGRpdj4gZG9tIGlzIGVtcHR5LCB0aGUgY29tcG9uZW50IHBvc2l0aW9uaW5nIC0tPlxyXG4gICAgICAgICAgICAgIDwhLS0gd2lsbCBiZSBtaXNwbGFjZWQuIC0tPlxyXG4gICAgICAgICAgICAgIHt7ICcmbmJzcDsnIH19XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiIFtzdHlsZS5kaXNwbGF5XT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKCkgPyAnbm9uZScgOiB1bmRlZmluZWRcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5zdWNjZXNzXT1cImlzU3VjY2VzcygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3Mud2FybmluZ109XCJpc1dhcm5pbmcoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLmVycm9yXT1cImlzRXJyb3IoKSAmJiAhaXNEaXNhYmxlZCgpXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXREZXNjcmlwdGlvbigpXCIgW25nSWZFbHNlXT1cImRlc2NyaXB0aW9uX2Vsc2VcIj5cclxuICAgICAgICAgICAgICB7eyBnZXREZXNjcmlwdGlvbigpIHwgcGh4X3RleHQgfX1cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZXNjcmlwdGlvbl9lbHNlPlxyXG4gICAgICAgICAgICAgIDwhLS0gV2UndmUgdG8gcHV0IHdoaXRlc3BhY2UgaWYgdGhlcmUgaXMgbm8gZGVzY3JpcHRpb24gdG8gcHJldmVudCBlbXB0eSBkb20gLS0+XHJcbiAgICAgICAgICAgICAgPCEtLSBzaW5jZSBpZiBkZXNjcmlwdGlvbidzIDxkaXY+IGRvbSBpcyBlbXB0eSwgdGhlIGNvbXBvbmVudCBwb3NpdGlvbmluZyAtLT5cclxuICAgICAgICAgICAgICA8IS0tIHdpbGwgYmUgbWlzcGxhY2VkLiAtLT5cclxuICAgICAgICAgICAgICB7eyAnJm5ic3A7JyB9fVxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGhlbHAtd3JhcHBlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlbHBcIj57e2dldEhlbHAoKSB8IHBoeF90ZXh0fX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbmBcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNYXRlcmlhbFRpbWVQaWNrZXIgZXh0ZW5kcyBUaW1lUGlja2VyIGltcGxlbWVudHMgT25Jbml0LCBJTmVlZEZvY3VzIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25EaXNhYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25FbmFibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpMThuS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCdpMThuQnlwYXNzJylcclxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcclxuICBwcm90ZWN0ZWQgYnlwYXNzOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFWaWV3XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdElucHV0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBuYW1lOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdHlwZU9mRGF0YTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIHJlYWRPbmx5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQEkxOE4oKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNGb3JtYXR0ZXJJbnB1dERhdGFWaWV3XHJcbiAgQElucHV0KCdmb3JtYXR0ZXInKVxyXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5pbnN0YW5jZScpXHJcbiAgcHJvdGVjdGVkIGZvcm1hdHRlcjogSUZvcm1hdHRlcjtcclxuICBASW5wdXQoJ2Zvcm1hdHRlck5hbWUnKVxyXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5uYW1lJylcclxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyTmFtZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnZm9ybWF0dGVyT3B0aW9ucycpXHJcbiAgQE9wdGlvbignZm9ybWF0dGVyLm9wdGlvbnMnKVxyXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXJPcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KCdmb3JtYXR0ZXJVc2VQcm9wZXJ0eVZhbHVlJylcclxuICBAT3B0aW9uKCdmb3JtYXR0ZXIudXNlUHJvcGVydHlWYWx1ZScpXHJcbiAgcHJvdGVjdGVkIGZvcm1hdHRlclVzZVByb3BlcnR5VmFsdWU6IGJvb2xlYW47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRlVGltZVBpY2tlciBcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGF0dGVybjogc3RyaW5nO1xyXG4gIC8vIC0tLSBmcm9tIFRpbWVQaWNrZXJcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCByYW5nZTogbnVtYmVyO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGhpZGVTZWNvbmQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgd2lkdGg6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWlnaHQ6IHN0cmluZztcclxuXHJcbiAgLy8gLS0tIHNlbGZcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgbGFiZWw6IHN0cmluZztcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgZGVzY3JpcHRpb246IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBidXR0b25JY29uOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgYnV0dG9uUG9zaXRpb246IHN0cmluZztcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQE91dHB1dCgncGh4TG9hZCcpXHJcbiAgQE9wdGlvbignbG9hZCcpXHJcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xyXG4gIEBPdXRwdXQoJ3BoeFN0YXJ0VmFsaWRhdGUnKVxyXG4gIEBPcHRpb24oJ3N0YXJ0VmFsaWRhdGUnKVxyXG4gIHByb3RlY3RlZCBzdGFydFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEVuZFZhbGlkYXRlJylcclxuICBAT3B0aW9uKCdlbmRWYWxpZGF0ZScpXHJcbiAgcHJvdGVjdGVkIGVuZFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUZvY3VzJylcclxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEZvY3VzJylcclxuICBAT3B0aW9uKCdmb2N1cycpXHJcbiAgcHJvdGVjdGVkIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUxvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignYmVmb3JlTG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlTG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeExvc3RGb2N1cycpXHJcbiAgQE9wdGlvbignbG9zdEZvY3VzJylcclxuICBwcm90ZWN0ZWQgbG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhbmdlJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpXHJcbiAgQE9wdGlvbignY2hhbmdlJylcclxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0ZVRpbWVQaWNrZXJcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVWaWV3U2hvdycpXHJcbiAgQE9wdGlvbignYmVmb3JlVmlld1Nob3cnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3U2hvd0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhWaWV3U2hvdycpXHJcbiAgQE9wdGlvbigndmlld1Nob3cnKVxyXG4gIHByb3RlY3RlZCB2aWV3U2hvd0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVWaWV3SGlkZScpXHJcbiAgQE9wdGlvbignYmVmb3JlVmlld0hpZGUnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3SGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhWaWV3SGlkZScpXHJcbiAgQE9wdGlvbigndmlld0hpZGUnKVxyXG4gIHByb3RlY3RlZCB2aWV3SGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBfY2xhc3NGb2N1c2VkOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2J0bkljb25DbGljazogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSwgZm9ybWF0dGVyRmFjdG9yeTogRm9ybWF0dGVyRmFjdG9yeSwgcGhsb3hBcHBJbmZvU2VydmljZTogUGhsb3hBcHBJbmZvU2VydmljZSkge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZSwgZm9ybWF0dGVyRmFjdG9yeSwgcGhsb3hBcHBJbmZvU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5idXR0b25JY29uID0gREVGQVVMVF9CVVRUT05fSUNPTjtcclxuICAgIHRoaXMuYnV0dG9uUG9zaXRpb24gPSBERUZBVUxUX0JVVFRPTl9QT1NJVElPTjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgfSBcclxuXHJcbiAgcHVibGljIGdldENsYXNzTWF0Rm9jdXNlZCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkT25seSgpID8geyAnbWF0LWZvY3VzZWQnOiB0aGlzLmlzQ2xhc3NGb2N1c2VkKCkgfSA6IHt9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvTG9zdEZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIFN1cGVyIHdpbGwgYWx3YXlzIGhpZGUgcG9wdXAgaW4gZG9Mb3N0Rm9jdXMoKS5cclxuICAgIHN1cGVyLmRvTG9zdEZvY3VzKCRldmVudCk7XHJcbiAgICB0aGlzLl9jbGFzc0ZvY3VzZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsaWNrKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX2J0bkljb25DbGljayA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBzdXBlci5vbkZvY3VzKGV2ZW50KTtcclxuICAgIHRoaXMuX2NsYXNzRm9jdXNlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1c2luZygkZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2J0bkljb25DbGljaykge1xyXG4gICAgICBzdXBlci5vbkZvY3VzaW5nKCRldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9idG5JY29uQ2xpY2sgfHwgdGhpcy5pc0FjdGl2ZSgpKSB7XHJcbiAgICAgIHRoaXMuX2J0bkljb25DbGljayA9IGZhbHNlO1xyXG5cclxuICAgICAgc3VwZXIub25Mb3N0Rm9jdXNpbmcoJGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0NsYXNzRm9jdXNlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jbGFzc0ZvY3VzZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QnV0dG9uSWNvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICghdGhpcy5idXR0b25JY29uID8gREVGQVVMVF9CVVRUT05fSUNPTiA6IHRoaXMuYnV0dG9uSWNvbik7O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJ1dHRvbkljb24oYnV0dG9uSWNvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1dHRvbkljb24gPSBidXR0b25JY29uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEJ1dHRvblBvc2l0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKCF0aGlzLmJ1dHRvblBvc2l0aW9uID8gREVGQVVMVF9CVVRUT05fUE9TSVRJT04gOiB0aGlzLmJ1dHRvblBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRCdXR0b25Qb3NpdGlvbihidXR0b25Qb3NpdGlvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmJ1dHRvblBvc2l0aW9uID0gYnV0dG9uUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxhYmVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xyXG4gIH1cclxufVxyXG4iXX0=