com.phloxui
Version:
PhloxUI Ng2+ Framework
396 lines (395 loc) • 32.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, ViewChild, HostListener, ElementRef } from '@angular/core';
import { AbstractHasDataHelp } from '../AbstractHasDataHelp';
import { AbstractDataEditor } from './AbstractDataEditor';
import { DefaultEntryEditorPopover } from './DefaultEntryEditorPopover.component';
import { EllipsisButton } from '../../component/EllipsisButton.component';
import { ComponentCalendarEntryModel } from '../model/ComponentCalendarEntryModel';
import { Option } from '../../decorator/decorators';
const /** @type {?} */ TYPE_NAME = "phx-default-component-calendar-entry";
DefaultEntryEditorPopover;
export class DefaultComponentCalendarEntry extends AbstractHasDataHelp {
/**
* @param {?} elementRef
*/
constructor(elementRef) {
super(elementRef);
this.componentType = DefaultEntryEditorPopover;
this.selectedHeaderTitle = "";
this.selectedData = null;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
if (this.editor !== null && typeof this.editor !== 'undefined') {
this.menuFactory = this.editor.getMenuModelFactory();
}
this.componentHandler = (result) => {
let /** @type {?} */ comInstance = null;
if (result !== null && typeof result !== 'undefined') {
comInstance = result.instance;
}
if (this.data !== null && typeof this.data !== 'undefined' && comInstance !== null) {
if (typeof comInstance.setData === 'function') {
comInstance.setData(this.data);
}
}
if (typeof comInstance.setCalendarEntryMapper === 'function') {
comInstance.setCalendarEntryMapper(this.entryMapper);
}
if (typeof comInstance.setEditor === 'function') {
comInstance.setEditor(this.editor);
}
this.compoWrapInstance = comInstance;
};
if (this.dataParent !== null && typeof this.dataParent !== 'undefined') {
let /** @type {?} */ parent = this.dataParent;
if (typeof parent.getHideEvent === 'function') {
let /** @type {?} */ hideEvent = parent.getHideEvent();
if (hideEvent !== null && (typeof hideEvent !== 'undefined')) {
hideEvent.subscribe((event) => {
// hide more menu
if (this.ellipsisButton !== null && typeof this.ellipsisButton !== 'undefined') {
this.ellipsisButton.hideMenu();
}
});
}
}
}
}
/**
* @param {?} data
* @return {?}
*/
getCalendarEntry(data) {
if (this.entryMapper !== null && typeof this.entryMapper !== 'undefined') {
return this.entryMapper.getCalendarEntry(data);
}
return null;
}
/**
* @return {?}
*/
_getComponentHandler() {
return this.componentHandler;
}
/**
* @param {?} $event
* @return {?}
*/
onClick($event) {
if (this.ellipsisButton !== null && typeof this.ellipsisButton !== 'undefined') {
if (this.ellipsisButton.isShowMenu()) {
this.ellipsisButton.hideMenu();
}
}
}
/**
* @return {?}
*/
getTitle() {
if (this.model !== null && typeof this.model !== 'undefined') {
return this.model.title;
}
return "";
}
/**
* @return {?}
*/
getDescription() {
if (this.model !== null && typeof this.model !== 'undefined') {
return this.model.description;
}
return "";
}
/**
* @param {?} data
* @return {?}
*/
setData(data) {
super.setData(data);
}
/**
* @param {?} entryMapper
* @return {?}
*/
setCalendarEntryMapper(entryMapper) {
this.entryMapper = entryMapper;
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.setCalendarEntryMapper === 'function') {
this.compoWrapInstance.setCalendarEntryMapper(this.entryMapper);
}
}
}
/**
* @param {?} editor
* @return {?}
*/
setEditor(editor) {
this.editor = editor;
}
/**
* @return {?}
*/
isSelfDataDirty() {
return false;
}
/**
* @param {?} data
* @return {?}
*/
selfSaveData(data) {
}
/**
* @return {?}
*/
selfResetData() {
}
/**
* @return {?}
*/
getModel() {
return this.model;
}
/**
* @param {?} model
* @return {?}
*/
setModel(model) {
this.model = model;
if (this.model !== null && typeof this.model !== 'undefined') {
this.componentType = this.model.type;
}
if (this.componentType === null || typeof this.componentType === 'undefined') {
this.componentType = DefaultEntryEditorPopover;
}
}
/**
* @return {?}
*/
getMenuModelFactory() {
return this.menuFactory;
}
/**
* @return {?}
*/
getComponentType() {
return this.componentType;
}
/**
* @return {?}
*/
doPreload() { return new Promise((resolve, reject) => { resolve(null); }); }
/**
* @return {?}
*/
doLoaded() {
}
/**
* @param {?} $event
* @return {?}
*/
onPopoverClosed($event) {
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.onPopoverClosed === 'function') {
this.compoWrapInstance.onPopoverClosed($event);
}
}
}
/**
* @param {?} $event
* @return {?}
*/
onAutoSaved($event) {
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.onAutoSaved === 'function') {
this.compoWrapInstance.onAutoSaved($event);
}
}
}
/**
* @return {?}
*/
isAutoSave() {
if (this.compoWrapInstance !== null && typeof this.compoWrapInstance !== 'undefined') {
if (typeof this.compoWrapInstance.isAutoSave === 'function') {
return this.compoWrapInstance.isAutoSave();
}
}
return false;
}
}
DefaultComponentCalendarEntry.TYPE_NAME = TYPE_NAME;
DefaultComponentCalendarEntry.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-default-component-calendar-entry">
<div class="header">
<div class="wrapper">
<div>
<div class="info">
<div>
<div class="table-wrapper fluid">
<div class="table-cell-wrapper middle">{{getTitle()}}</div>
</div>
</div>
</div>
<div class="more">
<div class="table-wrapper fluid">
<div class="table-cell-wrapper middle"><phx-ellipsis-btn #ellipsisButton [menuFactory]="getMenuModelFactory()" [data]="getData()"></phx-ellipsis-btn></div>
</div>
</div>
</div>
</div>
</div>
<div class="body">
<div class="wrapper">
<div class="description">
{{getDescription()}}
</div>
<div class="content">
<phx-component-wrapper [type]="getComponentType()" [data]="getData()" [handler]="_getComponentHandler()" [dataParent]="this"></phx-component-wrapper>
</div>
</div>
</div>
</div>
`
},] },
];
/** @nocollapse */
DefaultComponentCalendarEntry.ctorParameters = () => [
{ type: ElementRef, },
];
DefaultComponentCalendarEntry.propDecorators = {
"data": [{ type: Input },],
"dataParent": [{ 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 },],
"entryMapper": [{ type: Input },],
"editor": [{ type: Input },],
"model": [{ type: Input },],
"ellipsisButton": [{ type: ViewChild, args: ['ellipsisButton',] },],
"onClick": [{ type: HostListener, args: ['click', ['$event'],] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], DefaultComponentCalendarEntry.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], DefaultComponentCalendarEntry.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], DefaultComponentCalendarEntry.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], DefaultComponentCalendarEntry.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], DefaultComponentCalendarEntry.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], DefaultComponentCalendarEntry.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], DefaultComponentCalendarEntry.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], DefaultComponentCalendarEntry.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], DefaultComponentCalendarEntry.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], DefaultComponentCalendarEntry.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], DefaultComponentCalendarEntry.prototype, "entryMapper", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", AbstractDataEditor)
], DefaultComponentCalendarEntry.prototype, "editor", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", ComponentCalendarEntryModel)
], DefaultComponentCalendarEntry.prototype, "model", void 0);
function DefaultComponentCalendarEntry_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
DefaultComponentCalendarEntry.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
DefaultComponentCalendarEntry.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
DefaultComponentCalendarEntry.propDecorators;
/** @type {?} */
DefaultComponentCalendarEntry.TYPE_NAME;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.data;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.dataParent;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.ignoreParentData;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.ignoreParentDisabled;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.delegateHistory;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.onDisabled;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.onEnabled;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.loadingEnabled;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.i18nKey;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.bypass;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.options;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.entryMapper;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.editor;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.model;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.ellipsisButton;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.componentType;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.componentHandler;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.compoWrapInstance;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.selectedHeaderTitle;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.selectedData;
/** @type {?} */
DefaultComponentCalendarEntry.prototype.menuFactory;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdENvbXBvbmVudENhbGVuZGFyRW50cnkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2VkaXRvci9EZWZhdWx0Q29tcG9uZW50Q2FsZW5kYXJFbnRyeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBUSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQU03RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUVsRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDMUUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBSXBELHVCQUFNLFNBQVMsR0FBVyxzQ0FBc0MsQ0FBQztBQUNqRSx5QkFBeUIsQ0FBQTtBQW9DekIsTUFBTSxvQ0FBcUMsU0FBUSxtQkFBbUI7Ozs7SUF1RHBFLFlBQVksVUFBc0I7UUFDaEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcseUJBQXlCLENBQUM7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztLQUMxQjs7OztJQUVNLFFBQVE7UUFDYixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFakIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksT0FB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QUs7Z0NBR0wsS0FBSzsyQkFHTCxLQUFLOzBCQUdMLEtBQUs7K0JBR0wsS0FBSzt3QkFHTCxLQUFLO3VCQUdMLEtBQUssU0FBQyxZQUFZO3dCQUdsQixLQUFLOzRCQUVMLEtBQUs7dUJBR0wsS0FBSztzQkFHTCxLQUFLOytCQUdMLFNBQVMsU0FBQyxnQkFBZ0I7d0JBdUUxQixZQUFZLFNBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDOzs7SUEvR2hDLE1BQU0sRUFBRTs7OztJQUdSLE1BQU0sRUFBRTs7OztJQUdSLE1BQU0sRUFBRTs7OztJQUdSLE1BQU0sRUFBRTs7OztJQUdSLE1BQU0sRUFBRTs7OztJQUdSLE1BQU0sRUFBRTtzQ0FDYSxRQUFROzs7SUFFN0IsTUFBTSxFQUFFO3NDQUNZLFFBQVE7OztJQUU1QixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLENBQUMsWUFBWSxDQUFDOzs7O0lBS3BCLE1BQU0sRUFBRTs7OztJQUdSLE1BQU0sRUFBRTtzQ0FDTyxrQkFBa0I7OztJQUVqQyxNQUFNLEVBQUU7c0NBQ00sMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBUeXBlLCBWaWV3Q2hpbGQsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RIYXNEYXRhSGVscCB9IGZyb20gJy4uL0Fic3RyYWN0SGFzRGF0YUhlbHAnO1xuaW1wb3J0IHsgSUhhc01vZGVsIH0gZnJvbSAnLi4vSUhhc01vZGVsJztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vSUhhc0RhdGEnO1xuaW1wb3J0IHsgQ2FsZW5kYXJFbnRyeSB9IGZyb20gJy4uL21vZGVsL0NhbGVuZGFyRW50cnknO1xuaW1wb3J0IHsgSUNhbGVuZGFyRW50cnlNYXBwZXIgfSBmcm9tICcuL0lDYWxlbmRhckVudHJ5TWFwcGVyJztcbmltcG9ydCB7IElDYWxlbmRhckVudHJ5UG9wb3ZlckNvbnRlbnQgfSBmcm9tICcuL0lDYWxlbmRhckVudHJ5UG9wb3ZlckNvbnRlbnQnO1xuaW1wb3J0IHsgQWJzdHJhY3REYXRhRWRpdG9yIH0gZnJvbSAnLi9BYnN0cmFjdERhdGFFZGl0b3InO1xuaW1wb3J0IHsgRGVmYXVsdEVudHJ5RWRpdG9yUG9wb3ZlciB9IGZyb20gJy4vRGVmYXVsdEVudHJ5RWRpdG9yUG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSU1lbnVNb2RlbEZhY3RvcnkgfSBmcm9tICcuLi8uLi9jb21wb25lbnQvSU1lbnVNb2RlbEZhY3RvcnknO1xuaW1wb3J0IHsgRWxsaXBzaXNCdXR0b24gfSBmcm9tICcuLi8uLi9jb21wb25lbnQvRWxsaXBzaXNCdXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudENhbGVuZGFyRW50cnlNb2RlbCB9IGZyb20gJy4uL21vZGVsL0NvbXBvbmVudENhbGVuZGFyRW50cnlNb2RlbCc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi9kZWNvcmF0b3IvZGVjb3JhdG9ycyc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1kZWZhdWx0LWNvbXBvbmVudC1jYWxlbmRhci1lbnRyeVwiO1xuRGVmYXVsdEVudHJ5RWRpdG9yUG9wb3ZlclxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1kZWZhdWx0LWNvbXBvbmVudC1jYWxlbmRhci1lbnRyeVwiPlxuXHQ8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG5cdFx0PGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cblx0XHRcdDxkaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJpbmZvXCI+XG5cdFx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGZsdWlkXCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsLXdyYXBwZXIgbWlkZGxlXCI+e3tnZXRUaXRsZSgpfX08L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vcmVcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtd3JhcHBlciBmbHVpZFwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj48cGh4LWVsbGlwc2lzLWJ0biAjZWxsaXBzaXNCdXR0b24gW21lbnVGYWN0b3J5XT1cImdldE1lbnVNb2RlbEZhY3RvcnkoKVwiIFtkYXRhXT1cImdldERhdGEoKVwiPjwvcGh4LWVsbGlwc2lzLWJ0bj48L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJib2R5XCI+XG5cdFx0PGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPlxuXHRcdFx0XHR7e2dldERlc2NyaXB0aW9uKCl9fVxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuXHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyICBbdHlwZV09XCJnZXRDb21wb25lbnRUeXBlKClcIiBbZGF0YV09XCJnZXREYXRhKClcIiBbaGFuZGxlcl09XCJfZ2V0Q29tcG9uZW50SGFuZGxlcigpXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIERlZmF1bHRDb21wb25lbnRDYWxlbmRhckVudHJ5IGV4dGVuZHMgQWJzdHJhY3RIYXNEYXRhSGVscCBpbXBsZW1lbnRzIE9uSW5pdCwgSUNhbGVuZGFyRW50cnlQb3BvdmVyQ29udGVudCwgSUhhc01vZGVsIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YTogYW55O1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERhdGE6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgZW50cnlNYXBwZXI6IElDYWxlbmRhckVudHJ5TWFwcGVyO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJpdmF0ZSBlZGl0b3I6IEFic3RyYWN0RGF0YUVkaXRvcjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgbW9kZWw6IENvbXBvbmVudENhbGVuZGFyRW50cnlNb2RlbDtcbiAgQFZpZXdDaGlsZCgnZWxsaXBzaXNCdXR0b24nKVxuICBwcml2YXRlIGVsbGlwc2lzQnV0dG9uOiBFbGxpcHNpc0J1dHRvbjtcbiAgXG4gIHByaXZhdGUgY29tcG9uZW50VHlwZTogVHlwZTxhbnk+O1xuICBwcml2YXRlIGNvbXBvbmVudEhhbmRsZXI6IEZ1bmN0aW9uO1xuICBwcml2YXRlIGNvbXBvV3JhcEluc3RhbmNlOiBhbnk7XG4gIHByaXZhdGUgc2VsZWN0ZWRIZWFkZXJUaXRsZTogc3RyaW5nO1xuICBwcml2YXRlIHNlbGVjdGVkRGF0YTogYW55O1xuICBwcml2YXRlIG1lbnVGYWN0b3J5OiBJTWVudU1vZGVsRmFjdG9yeTtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZik7XG4gICAgdGhpcy5jb21wb25lbnRUeXBlID0gRGVmYXVsdEVudHJ5RWRpdG9yUG9wb3ZlcjtcbiAgICB0aGlzLnNlbGVjdGVkSGVhZGVyVGl0bGUgPSBcIlwiO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRhID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgaWYgKHRoaXMuZWRpdG9yICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVkaXRvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubWVudUZhY3RvcnkgPSB0aGlzLmVkaXRvci5nZXRNZW51TW9kZWxGYWN0b3J5KCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb21wb25lbnRIYW5kbGVyID0gKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBsZXQgY29tSW5zdGFuY2UgPSBudWxsO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb21JbnN0YW5jZSA9IHJlc3VsdC5pbnN0YW5jZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRhdGEgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29tSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb21JbnN0YW5jZS5zZXREYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29tSW5zdGFuY2Uuc2V0RGF0YSh0aGlzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNvbUluc3RhbmNlLnNldENhbGVuZGFyRW50cnlNYXBwZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29tSW5zdGFuY2Uuc2V0Q2FsZW5kYXJFbnRyeU1hcHBlcih0aGlzLmVudHJ5TWFwcGVyKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY29tSW5zdGFuY2Uuc2V0RWRpdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbUluc3RhbmNlLnNldEVkaXRvcih0aGlzLmVkaXRvcik7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbXBvV3JhcEluc3RhbmNlID0gY29tSW5zdGFuY2U7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLmRhdGFQYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGF0YVBhcmVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMuZGF0YVBhcmVudDtcbiAgICAgIGlmICh0eXBlb2YgcGFyZW50LmdldEhpZGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBsZXQgaGlkZUV2ZW50ID0gcGFyZW50LmdldEhpZGVFdmVudCgpO1xuXG4gICAgICAgIGlmIChoaWRlRXZlbnQgIT09IG51bGwgJiYgKHR5cGVvZiBoaWRlRXZlbnQgIT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgIGhpZGVFdmVudC5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIGhpZGUgbW9yZSBtZW51XG4gICAgICAgICAgICBpZiAodGhpcy5lbGxpcHNpc0J1dHRvbiAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5lbGxpcHNpc0J1dHRvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgdGhpcy5lbGxpcHNpc0J1dHRvbi5oaWRlTWVudSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWxlbmRhckVudHJ5KGRhdGE6IGFueSk6IENhbGVuZGFyRW50cnkge1xuICAgIGlmICh0aGlzLmVudHJ5TWFwcGVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVudHJ5TWFwcGVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZW50cnlNYXBwZXIuZ2V0Q2FsZW5kYXJFbnRyeShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgX2dldENvbXBvbmVudEhhbmRsZXIoKTogRnVuY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEhhbmRsZXI7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbkNsaWNrKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVsbGlwc2lzQnV0dG9uICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVsbGlwc2lzQnV0dG9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHRoaXMuZWxsaXBzaXNCdXR0b24uaXNTaG93TWVudSgpKSB7XG4gICAgICAgIHRoaXMuZWxsaXBzaXNCdXR0b24uaGlkZU1lbnUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VGl0bGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsLnRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm1vZGVsICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgcHVibGljIHNldERhdGEoZGF0YTogYW55KTogdm9pZCB7XG4gICAgc3VwZXIuc2V0RGF0YShkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDYWxlbmRhckVudHJ5TWFwcGVyKGVudHJ5TWFwcGVyOiBJQ2FsZW5kYXJFbnRyeU1hcHBlcik6IHZvaWQge1xuICAgIHRoaXMuZW50cnlNYXBwZXIgPSBlbnRyeU1hcHBlcjtcblxuICAgIGlmICh0aGlzLmNvbXBvV3JhcEluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbXBvV3JhcEluc3RhbmNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvV3JhcEluc3RhbmNlLnNldENhbGVuZGFyRW50cnlNYXBwZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5zZXRDYWxlbmRhckVudHJ5TWFwcGVyKHRoaXMuZW50cnlNYXBwZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRFZGl0b3IoZWRpdG9yOiBBYnN0cmFjdERhdGFFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBpc1NlbGZEYXRhRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIHNlbGZSZXNldERhdGEoKTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXRNb2RlbCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICB9XG5cbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG5cbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IHRoaXMubW9kZWwudHlwZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb21wb25lbnRUeXBlID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmNvbXBvbmVudFR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSBEZWZhdWx0RW50cnlFZGl0b3JQb3BvdmVyO1xuXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1lbnVNb2RlbEZhY3RvcnkoKTogSU1lbnVNb2RlbEZhY3Rvcnkge1xuICAgIHJldHVybiB0aGlzLm1lbnVGYWN0b3J5O1xuICB9XG5cbiAgcHVibGljIGdldENvbXBvbmVudFR5cGUoKTogVHlwZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRUeXBlO1xuICB9XG5cbiAgcHVibGljIGRvUHJlbG9hZCgpOiBQcm9taXNlPGFueT4geyAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsgICAgICAgcmVzb2x2ZShudWxsKTsgICAgIH0pOyAgIH0gIHB1YmxpYyBkb0xvYWRlZCgpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIG9uUG9wb3ZlckNsb3NlZCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9XcmFwSW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9XcmFwSW5zdGFuY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29tcG9XcmFwSW5zdGFuY2Uub25Qb3BvdmVyQ2xvc2VkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuY29tcG9XcmFwSW5zdGFuY2Uub25Qb3BvdmVyQ2xvc2VkKCRldmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQXV0b1NhdmVkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5vbkF1dG9TYXZlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLmNvbXBvV3JhcEluc3RhbmNlLm9uQXV0b1NhdmVkKCRldmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzQXV0b1NhdmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY29tcG9XcmFwSW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9XcmFwSW5zdGFuY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29tcG9XcmFwSW5zdGFuY2UuaXNBdXRvU2F2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wb1dyYXBJbnN0YW5jZS5pc0F1dG9TYXZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19