com.phloxui
Version:
PhloxUI Ng2+ Framework
347 lines (346 loc) • 28.9 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 { AbstractSelectOneItem } from './AbstractSelectOneItem';
import { Option } from '../../../decorator/Option.decorator';
import { DefaultSelectItemModel } from '../../model/DefaultSelectItemModel';
import { NeedFocusService } from '../../../service/NeedFocusService.service';
import { EventUtils, BEFORE_CLICK_EVENT, CLICK_EVENT } from '../../../share/shares';
const /** @type {?} */ TYPE_NAME = "phx-multiple-state-checkbox";
const /** @type {?} */ DEFAULT_FIELD = "label";
export class MultipleStateCheckBox extends AbstractSelectOneItem {
/**
* @param {?} elementRef
* @param {?} needFocusService
*/
constructor(elementRef, needFocusService) {
super(elementRef, needFocusService);
this.beforeClickEvent = new EventEmitter();
this.clickEvent = new EventEmitter();
this.beforeFocusEvent = new EventEmitter();
this.focusEvent = new EventEmitter();
this.beforeLostFocusEvent = new EventEmitter();
this.lostFocusEvent = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
// if check null
if (this.states !== null && this.states !== undefined) {
if (Array.isArray(this.states)) {
let /** @type {?} */ selectItems = [];
let /** @type {?} */ label = 0;
for (let /** @type {?} */ item of this.states) {
selectItems.push(new DefaultSelectItemModel(label + "", item));
++label;
}
this.setItems(selectItems);
}
}
setTimeout(() => {
this.initEventHandlers();
}, 20);
}
/**
* @return {?}
*/
initEventHandlers() {
$(this.elementRef.nativeElement).find('button.fake').focus(($event) => {
this.onFocusing($event);
});
$(this.elementRef.nativeElement).find('button.fake').blur(($event) => {
this.onLostFocusing($event);
});
}
/**
* @return {?}
*/
getCurrentState() {
return this.getSelectedValue();
}
/**
* @return {?}
*/
toggleState() {
if (this.isDisabled()) {
return;
}
if (this.getSelectedIndex() === -1) {
this.setState(0);
}
// set current state index
if (this.getSelectedIndex() === this.getItems().length - 1) {
this.setState(0);
}
else {
this.setState((this.getSelectedIndex()) + 1);
}
}
/**
* @param {?} state
* @return {?}
*/
setState(state) {
this.setSelectedIndex(state);
}
/**
* @return {?}
*/
getStateStyleGenerater() {
return this.stateStyleGenerater;
}
/**
* @param {?} stateStyleGenerater
* @return {?}
*/
setStateStyleGenerater(stateStyleGenerater) {
this.stateStyleGenerater = stateStyleGenerater;
}
/**
* @param {?} $event
* @param {?=} fireEvent
* @return {?}
*/
onClick($event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
if (this.isReadOnly()) {
return;
}
EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, ($event) => {
// doEvent
this.toggleState();
}, ($event) => {
// emitBeforeEvent
this.emitBeforeClickEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitClickEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @param {?=} $event
* @return {?}
*/
emitBeforeClickEvent($event) {
let /** @type {?} */ eventData = null;
// emit event
let /** @type {?} */ data = eventData;
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event);
if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) {
this.beforeClickEvent.emit(ev);
}
}
/**
* @param {?=} $event
* @return {?}
*/
emitClickEvent($event) {
let /** @type {?} */ eventData = null;
// emit event
let /** @type {?} */ data = eventData;
let /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event);
if (this.clickEvent !== null && this.clickEvent !== undefined) {
this.clickEvent.emit(ev);
}
}
/**
* @param {?} $event
* @return {?}
*/
onFocusing($event) {
this.needFocusService.setFocusingComponent(this, $event);
}
/**
* @param {?} $event
* @return {?}
*/
onLostFocusing($event) {
this.needFocusService.resetFocusingComponent($event);
}
/**
* @param {?} $event
* @return {?}
*/
doFocus($event) {
if ($(this.elementRef.nativeElement).find('button.fake:focus').length > 0) {
$(this.elementRef.nativeElement).find('button.fake').focus();
}
}
/**
* @param {?} $event
* @return {?}
*/
doLostFocus($event) {
if ($(this.elementRef.nativeElement).find('button.fake:focus').length > 0) {
$(this.elementRef.nativeElement).find('button.fake').blur();
}
}
/**
* @param {?} inputValue
* @param {?} results
* @return {?}
*/
onValidationEnd(inputValue, results) {
//! do sthing
}
/**
* @param {?} data
* @param {?} inputVal
* @return {?}
*/
onDataChange(data, inputVal) {
}
/**
* @return {?}
*/
_getClassState() {
if (this.stateStyleGenerater !== null && typeof this.stateStyleGenerater !== 'undefined') {
return this.stateStyleGenerater.call(this, this.getCurrentState());
}
return "";
}
}
MultipleStateCheckBox.TYPE_NAME = TYPE_NAME;
MultipleStateCheckBox.DEFAULT_FIELD = DEFAULT_FIELD;
MultipleStateCheckBox.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-multiple-state-checkbox">
<button type="button" class="fake" (focusin)="onFocusing($event)" (blur)="onLostFocusing($event)"></button>
<div [ngClass]="_getClassState()" [class.disabled]="isDisabled()" (click)="onClick($event)">
</div>
</div>
`
},] },
];
/** @nocollapse */
MultipleStateCheckBox.ctorParameters = () => [
{ type: ElementRef, },
{ type: NeedFocusService, },
];
MultipleStateCheckBox.propDecorators = {
"beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },],
"clickEvent": [{ type: Output, args: ['phxClick',] },],
"beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },],
"focusEvent": [{ type: Output, args: ['phxFocus',] },],
"beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },],
"lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },],
"stateStyleGenerater": [{ type: Input },],
"states": [{ type: Input },],
"field": [{ type: Input },],
"data": [{ type: Input },],
"ignoreParentData": [{ 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 },],
"dataParent": [{ type: Input },],
};
tslib_1.__decorate([
Option('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], MultipleStateCheckBox.prototype, "beforeClickEvent", void 0);
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], MultipleStateCheckBox.prototype, "clickEvent", void 0);
tslib_1.__decorate([
Option('beforeFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], MultipleStateCheckBox.prototype, "beforeFocusEvent", void 0);
tslib_1.__decorate([
Option('focus'),
tslib_1.__metadata("design:type", EventEmitter)
], MultipleStateCheckBox.prototype, "focusEvent", void 0);
tslib_1.__decorate([
Option('beforeLostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], MultipleStateCheckBox.prototype, "beforeLostFocusEvent", void 0);
tslib_1.__decorate([
Option('lostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], MultipleStateCheckBox.prototype, "lostFocusEvent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], MultipleStateCheckBox.prototype, "stateStyleGenerater", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Array)
], MultipleStateCheckBox.prototype, "states", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], MultipleStateCheckBox.prototype, "disabled", void 0);
function MultipleStateCheckBox_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
MultipleStateCheckBox.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
MultipleStateCheckBox.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
MultipleStateCheckBox.propDecorators;
/** @type {?} */
MultipleStateCheckBox.TYPE_NAME;
/** @type {?} */
MultipleStateCheckBox.DEFAULT_FIELD;
/** @type {?} */
MultipleStateCheckBox.prototype.beforeClickEvent;
/** @type {?} */
MultipleStateCheckBox.prototype.clickEvent;
/** @type {?} */
MultipleStateCheckBox.prototype.beforeFocusEvent;
/** @type {?} */
MultipleStateCheckBox.prototype.focusEvent;
/** @type {?} */
MultipleStateCheckBox.prototype.beforeLostFocusEvent;
/** @type {?} */
MultipleStateCheckBox.prototype.lostFocusEvent;
/** @type {?} */
MultipleStateCheckBox.prototype.stateStyleGenerater;
/** @type {?} */
MultipleStateCheckBox.prototype.states;
/** @type {?} */
MultipleStateCheckBox.prototype.disabled;
/** @type {?} */
MultipleStateCheckBox.prototype.field;
/** @type {?} */
MultipleStateCheckBox.prototype.data;
/** @type {?} */
MultipleStateCheckBox.prototype.ignoreParentData;
/** @type {?} */
MultipleStateCheckBox.prototype.ignoreParentDisabled;
/** @type {?} */
MultipleStateCheckBox.prototype.delegateHistory;
/** @type {?} */
MultipleStateCheckBox.prototype.onDisabled;
/** @type {?} */
MultipleStateCheckBox.prototype.onEnabled;
/** @type {?} */
MultipleStateCheckBox.prototype.loadingEnabled;
/** @type {?} */
MultipleStateCheckBox.prototype.i18nKey;
/** @type {?} */
MultipleStateCheckBox.prototype.bypass;
/** @type {?} */
MultipleStateCheckBox.prototype.options;
/** @type {?} */
MultipleStateCheckBox.prototype.dataParent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlwbGVTdGF0ZUNoZWNrQm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NdWx0aXBsZVN0YXRlQ2hlY2tCb3guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTdELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEYsdUJBQU0sU0FBUyxHQUFXLDZCQUE2QixDQUFDO0FBRXhELHVCQUFNLGFBQWEsR0FBVyxPQUFPLENBQUM7QUFjdEMsTUFBTSw0QkFBNkIsU0FBUSxxQkFBcUI7Ozs7O0lBMEQ5RCxZQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQ3BFLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztLQUUxQzs7OztJQUVNLFFBQVE7UUFDYixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7O1FBSWpCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN0RCxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRS9CLHFCQUFJLFdBQVcsR0FBVSxFQUFFLENBQUM7Z0JBQzVCLHFCQUFJLEtBQUssR0FBVyxDQUFDLENBQUM7Z0JBRXRCLEdBQUcsQ0FBQyxDQUFDLHFCQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDN0IsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLHNCQUFzQixDQUFDLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDL0QsRUFBRSxLQUFLLENBQUM7aUJBQ1Q7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUM1QjtTQUNGO1FBRUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzFCLEVBQUUsRUFBRSxDQUFDLENBQUE7Ozs7O0lBR0EsaUJBQWlCO1FBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNwRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3pCLENBQUMsQ0FBQztRQUVILENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNuRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzdCLENBQUMsQ0FBQzs7Ozs7SUFHRSxlQUFlO1FBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7Ozs7SUFHMUIsV0FBVztRQUVoQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQztTQUNSO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7O1FBR0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzlDOzs7Ozs7SUFHSSxRQUFRLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7O0lBR3hCLHNCQUFzQjtRQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDOzs7Ozs7SUFHM0Isc0JBQXNCLENBQUMsbUJBQTZCO1FBQ3pELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQzs7Ozs7OztJQUcxQyxPQUFPLENBQUMsTUFBVyxFQUFFLFNBQW1CO1FBQzdDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxDQUFDO1NBQ1I7UUFFRCxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFM0YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFbkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ25DLEVBQUUsQ0FBQyxNQUFhLEVBQUUsTUFBVyxFQUFFLEVBQUU7O1lBRWhDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0IsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztTQUVwQixDQUFDLENBQUM7Ozs7OztJQUdLLG9CQUFvQixDQUFDLE1BQVk7UUFDekMscUJBQUksU0FBUyxHQUFRLElBQUksQ0FBQzs7UUFHMUIscUJBQUksSUFBSSxHQUFRLFNBQVMsQ0FBQztRQUMxQixxQkFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNoQztLQUNGOzs7OztJQUVTLGNBQWMsQ0FBQyxNQUFZO1FBQ25DLHFCQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7O1FBRzFCLHFCQUFJLElBQUksR0FBUSxTQUFTLENBQUM7UUFDMUIscUJBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFcEUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFCO0tBQ0Y7Ozs7O0lBRU0sVUFBVSxDQUFDLE1BQWE7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzs7Ozs7O0lBR3BELGNBQWMsQ0FBQyxNQUFhO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Ozs7O0lBRzdDLE9BQU8sQ0FBQyxNQUFhO1FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUM5RDtLQUNGOzs7OztJQUVTLFdBQVcsQ0FBQyxNQUFhO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUM3RDtLQUNGOzs7Ozs7SUFFTSxlQUFlLENBQUMsVUFBZSxFQUFFLE9BQTJCOzs7Ozs7OztJQUl6RCxZQUFZLENBQUMsSUFBUyxFQUFFLFFBQWE7S0FDOUM7Ozs7SUFHTSxjQUFjO1FBQ25CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsbUJBQW1CLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN6RixNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7U0FDcEU7UUFFRCxNQUFNLENBQUMsRUFBRSxDQUFDOzs7a0NBek4rQixTQUFTO3NDQUVMLGFBQWE7O1lBZDdELFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixRQUFRLEVBQUU7Ozs7O0NBS1g7YUFDQTs7OztZQXhCMkIsVUFBVTtZQU03QixnQkFBZ0I7OztpQ0F5QnRCLE1BQU0sU0FBQyxnQkFBZ0I7MkJBR3ZCLE1BQU0sU0FBQyxVQUFVO2lDQUdqQixNQUFNLFNBQUMsZ0JBQWdCOzJCQUd2QixNQUFNLFNBQUMsVUFBVTtxQ0FHakIsTUFBTSxTQUFDLG9CQUFvQjsrQkFHM0IsTUFBTSxTQUFDLGNBQWM7b0NBS3JCLEtBQUs7dUJBR0wsS0FBSztzQkFJTCxLQUFLO3FCQUVMLEtBQUs7aUNBRUwsS0FBSztxQ0FFTCxLQUFLO2dDQUVMLEtBQUs7MkJBRUwsS0FBSzswQkFFTCxLQUFLOytCQUVMLEtBQUs7d0JBRUwsS0FBSzt1QkFFTCxLQUFLLFNBQUMsWUFBWTt3QkFFbEIsS0FBSzsyQkFFTCxLQUFLOzs7SUFoREwsTUFBTSxDQUFDLGFBQWEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQztzQ0FDTSxZQUFZOzs7SUFFakMsTUFBTSxDQUFDLGFBQWEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQztzQ0FDTSxZQUFZOzs7SUFFakMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO3NDQUNNLFlBQVk7OztJQUUzQyxNQUFNLENBQUMsV0FBVyxDQUFDO3NDQUNNLFlBQVk7OztJQUVyQyxNQUFNLEVBQUU7c0NBRW1CLFFBQVE7OztJQUNuQyxNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0U2VsZWN0T25lSXRlbSB9IGZyb20gJy4vQWJzdHJhY3RTZWxlY3RPbmVJdGVtJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL21vZGVsL1ZhbGlkYXRpb25SZXN1bHQnO1xyXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbCc7XHJcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEV2ZW50VXRpbHMsIEJFRk9SRV9DTElDS19FVkVOVCwgQ0xJQ0tfRVZFTlQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9zaGFyZXMnO1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1tdWx0aXBsZS1zdGF0ZS1jaGVja2JveFwiO1xyXG5cclxuY29uc3QgREVGQVVMVF9GSUVMRDogc3RyaW5nID0gXCJsYWJlbFwiO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcclxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1tdWx0aXBsZS1zdGF0ZS1jaGVja2JveFwiPlxyXG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZmFrZVwiIChmb2N1c2luKT1cIm9uRm9jdXNpbmcoJGV2ZW50KVwiIChibHVyKT1cIm9uTG9zdEZvY3VzaW5nKCRldmVudClcIj48L2J1dHRvbj5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cIl9nZXRDbGFzc1N0YXRlKClcIiBbY2xhc3MuZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVTdGF0ZUNoZWNrQm94IGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RPbmVJdGVtIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0ZJRUxEOiBzdHJpbmcgPSBERUZBVUxUX0ZJRUxEO1xyXG5cclxuICBAT3V0cHV0KCdwaHhCZWZvcmVDbGljaycpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhDbGljaycpXHJcbiAgQE9wdGlvbignY2xpY2snKVxyXG4gIHByb3RlY3RlZCBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVGb2N1cycpXHJcbiAgQE9wdGlvbignYmVmb3JlRm9jdXMnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhGb2N1cycpXHJcbiAgQE9wdGlvbignZm9jdXMnKVxyXG4gIHByb3RlY3RlZCBmb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVMb3N0Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhMb3N0Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc3RhdGVTdHlsZUdlbmVyYXRlcjogRnVuY3Rpb247XHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc3RhdGVzOiBhbnlbXTtcclxuICBAT3B0aW9uKClcclxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb25EaXNhYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb25FbmFibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBpMThuS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCdpMThuQnlwYXNzJylcclxuICBwcm90ZWN0ZWQgYnlwYXNzOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5mb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVMb3N0Rm9jdXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMubG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAvLyBpZiBjaGVjayBudWxsXHJcblxyXG4gICAgaWYgKHRoaXMuc3RhdGVzICE9PSBudWxsICYmIHRoaXMuc3RhdGVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zdGF0ZXMpKSB7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RJdGVtczogYW55W10gPSBbXTtcclxuICAgICAgICBsZXQgbGFiZWw6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5zdGF0ZXMpIHtcclxuICAgICAgICAgIHNlbGVjdEl0ZW1zLnB1c2gobmV3IERlZmF1bHRTZWxlY3RJdGVtTW9kZWwobGFiZWwgKyBcIlwiLCBpdGVtKSk7XHJcbiAgICAgICAgICArK2xhYmVsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXRJdGVtcyhzZWxlY3RJdGVtcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pbml0RXZlbnRIYW5kbGVycygpO1xyXG4gICAgfSwgMjApXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xyXG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLmZha2UnKS5mb2N1cygoJGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMub25Gb2N1c2luZygkZXZlbnQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLmZha2UnKS5ibHVyKCgkZXZlbnQpID0+IHtcclxuICAgICAgdGhpcy5vbkxvc3RGb2N1c2luZygkZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3VycmVudFN0YXRlKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3RlZFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlU3RhdGUoKTogdm9pZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5nZXRTZWxlY3RlZEluZGV4KCkgPT09IC0xKSB7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2V0IGN1cnJlbnQgc3RhdGUgaW5kZXhcclxuICAgIGlmICh0aGlzLmdldFNlbGVjdGVkSW5kZXgoKSA9PT0gdGhpcy5nZXRJdGVtcygpLmxlbmd0aCAtIDEpIHtcclxuICAgICAgdGhpcy5zZXRTdGF0ZSgwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoKHRoaXMuZ2V0U2VsZWN0ZWRJbmRleCgpKSArIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFN0YXRlKHN0YXRlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0U2VsZWN0ZWRJbmRleChzdGF0ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U3RhdGVTdHlsZUdlbmVyYXRlcigpOiBGdW5jdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVN0eWxlR2VuZXJhdGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFN0YXRlU3R5bGVHZW5lcmF0ZXIoc3RhdGVTdHlsZUdlbmVyYXRlcjogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGVTdHlsZUdlbmVyYXRlciA9IHN0YXRlU3R5bGVHZW5lcmF0ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGljaygkZXZlbnQ6IGFueSwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUNsaWNrRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9FdmVudFxyXG4gICAgICB0aGlzLnRvZ2dsZVN0YXRlKCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdENsaWNrRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBldmVudERhdGE6IGFueSA9IG51bGw7XHJcblxyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIGlmICh0aGlzLmJlZm9yZUNsaWNrRXZlbnQgIT09IG51bGwgJiYgdGhpcy5iZWZvcmVDbGlja0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50LmVtaXQoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRDbGlja0V2ZW50KCRldmVudD86IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDTElDS19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5jbGlja0V2ZW50ICE9PSBudWxsICYmIHRoaXMuY2xpY2tFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5zZXRGb2N1c2luZ0NvbXBvbmVudCh0aGlzLCAkZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uTG9zdEZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KCRldmVudCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLmZha2U6Zm9jdXMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2J1dHRvbi5mYWtlJykuZm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkb0xvc3RGb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnYnV0dG9uLmZha2U6Zm9jdXMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2J1dHRvbi5mYWtlJykuYmx1cigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uVmFsaWRhdGlvbkVuZChpbnB1dFZhbHVlOiBhbnksIHJlc3VsdHM6IFZhbGlkYXRpb25SZXN1bHRbXSk6IHZvaWQge1xyXG4gICAgLy8hIGRvIHN0aGluZ1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgX2dldENsYXNzU3RhdGUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnN0YXRlU3R5bGVHZW5lcmF0ZXIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuc3RhdGVTdHlsZUdlbmVyYXRlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGVTdHlsZUdlbmVyYXRlci5jYWxsKHRoaXMsIHRoaXMuZ2V0Q3VycmVudFN0YXRlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxufVxyXG4iXX0=