@stratio/egeo
Version:
611 lines • 44.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/st-table/st-table.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*
* © 2017 Stratio Big Data Inc., Sucursal en España.
*
* This software is licensed under the Apache License, Version 2.0.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the terms of the License for more details.
*
* SPDX-License-Identifier: Apache-2.0.
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, OnInit, Output, TemplateRef } from '@angular/core';
import { StEgeo, StRequired } from '../decorators/require-decorators';
import { Order, ORDER_TYPE } from './shared/order';
import { cloneDeep as _cloneDeep, get as _get } from 'lodash';
import { StTableIconClasses } from './st-table.interface';
/**
* \@description {Component} [Table]
*
* The table component has been designed to display any content like images, text, graphs, etc.
*
* * \@model
*
* [StTableHeader] {./shared/table-header.interface.ts#StTableHeader}
* [StDynamicTableHeader] {./shared/table-header.interface.ts#StFilterElement}
* [StFilterHeader] {./shared/table-header.interface.ts#StFilterHeader}
* [StTableFilterIconClasses] {./st-table.interface.ts#StTableFilterIconClasses}
* [StTableIconClasses] {./st-table.interface.ts#StTableIconClasses}
*
* \@example
*
* {html}
*
* ```
* <st-table [fields]="fields" [sortable]="true" (changeOrder)="yourFunctionToOrder($event)">
* <tr st-table-row *ngFor="let userData of data">
* <td st-table-cell st-table-row-content>
* <label >{{userData.id}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.name}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.lastName}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.phone}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.company}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.completedProfile}}</label>
* </td>
* <td st-table-row-hover>
* <i class="icon icon-arrow2_right"></i>
* </td>
* </tr>
* </st-table>
* ```
*
*/
var StTableComponent = /** @class */ (function () {
function StTableComponent(_cd) {
this._cd = _cd;
/**
* \@Input {boolean} [header=true] Boolean to show or hide the header
*/
this.header = true;
/**
* \@Input {boolean} [sortable=true] Boolean to make sortable the table, To enable sorting of columns use
* the new "sortable" field inside stTableHeader model
*/
this.sortable = true;
/**
* \@Input {boolean} [filterable=true] Boolean to make filterable the table, To enable filtering of columns use
* the new "filterable" field inside stTableHeader model (necessary define filterConfig).
*/
this.filterable = false;
/**
* \@Input {boolean} [selectableAll=false] Boolean to show or hide a checkbox in the header to select or
* deselect all rows
*/
this.selectableAll = false;
/**
* \@Input {StTableIconClasses} [iconClasses=''] List of icon classes
*/
this.iconClasses = new StTableIconClasses();
/**
* \@Output {Order} [changeOrder=''] Event emitted with the new order which has to be applied to the table rows
*/
this.changeOrder = new EventEmitter();
/**
* \@Output {boolean} [selectAll=''] Event emitted when user interacts with the checkbox to select or deselect
* all rows
*/
this.selectAll = new EventEmitter();
/**
* \@Output {string} [clickFilter=] Event emitted when clicking on filters icon
*/
this.clickFilter = new EventEmitter();
/**
* \@Output {StTableHeader[]} [selectFilters=''] Event emitted when user interacts with filter button without a custom template
*/
this.selectFilters = new EventEmitter();
this.tableClasses = {};
this.visibleFilter = -1;
this._fixedHeader = false;
this._stickyHoverMenu = false;
this._hasHoverMenu = false;
}
Object.defineProperty(StTableComponent.prototype, "fixedHeader", {
/** @Input {boolean} [fixedHeader=false] Boolean to fix the table header */
get: /**
* \@Input {boolean} [fixedHeader=false] Boolean to fix the table header
* @return {?}
*/
function () {
return this._fixedHeader;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this._fixedHeader = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StTableComponent.prototype, "stickyHoverMenu", {
/** @Input {boolean} [stickyHoverMenu=false] Boolean to fix hover menu always visible */
get: /**
* \@Input {boolean} [stickyHoverMenu=false] Boolean to fix hover menu always visible
* @return {?}
*/
function () {
return this._stickyHoverMenu;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this._stickyHoverMenu = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StTableComponent.prototype, "customClasses", {
/** @Input {string} [customClasses=] Classes for adding styles to table tag from outside. These can be: separated-rows */
get: /**
* \@Input {string} [customClasses=] Classes for adding styles to table tag from outside. These can be: separated-rows
* @return {?}
*/
function () {
return this._customClasses;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this.tableClasses[this._customClasses] = undefined;
this._customClasses = newValue;
this.tableClasses[this._customClasses] = this._customClasses;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StTableComponent.prototype, "selectedAll", {
/** @Input {boolean} [selectedAll=false] It specifies if all rows are selected */
get: /**
* \@Input {boolean} [selectedAll=false] It specifies if all rows are selected
* @return {?}
*/
function () {
return this._selectedAll;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this._selectedAll = newValue;
this._cd.markForCheck();
},
enumerable: true,
configurable: true
});
Object.defineProperty(StTableComponent.prototype, "hasHoverMenu", {
/** @Input {boolean} [hasHoverMenu=false] It specifies if a menu has to be displayed when user puts the mouse over
* the rows. Remember to add a cell with the selector st-table-row-hover for adding content to the menu
*/
get: /**
* \@Input {boolean} [hasHoverMenu=false] It specifies if a menu has to be displayed when user puts the mouse over
* the rows. Remember to add a cell with the selector st-table-row-hover for adding content to the menu
* @return {?}
*/
function () {
return this._hasHoverMenu;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
this._hasHoverMenu = newValue;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
StTableComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.filterable && !this.statusFilter) {
this.statusFilter = new Array(this.fields.length);
this.statusFilter.fill(false);
}
};
/**
* @param {?} field
* @return {?}
*/
StTableComponent.prototype.getHeaderItemClass = /**
* @param {?} field
* @return {?}
*/
function (field) {
/** @type {?} */
var isOrderAsc = this.isSortedByFieldAndDirection(field, ORDER_TYPE.ASC);
return isOrderAsc ? this.iconClasses.sort.asc : this.iconClasses.sort.desc;
};
/**
* @param {?} field
* @return {?}
*/
StTableComponent.prototype.isSortable = /**
* @param {?} field
* @return {?}
*/
function (field) {
return field && field.sortable !== undefined ? field.sortable : this.sortable;
};
/**
* @param {?} field
* @return {?}
*/
StTableComponent.prototype.isSortedByField = /**
* @param {?} field
* @return {?}
*/
function (field) {
return this.currentOrder && this.currentOrder.orderBy === field.id;
};
/**
* @param {?} field
* @return {?}
*/
StTableComponent.prototype.isFilterable = /**
* @param {?} field
* @return {?}
*/
function (field) {
return this.filterable && ((_get(field, 'filters.filterConfig')) ||
(this.templateContentFilter && _get(field, 'filters')) ||
_get(field, 'filters.templateRef'));
};
/**
* @return {?}
*/
StTableComponent.prototype.onHideFilterMenu = /**
* @return {?}
*/
function () {
this.visibleFilter = -1;
this._cd.markForCheck();
};
/**
* @param {?} field
* @return {?}
*/
StTableComponent.prototype.onChangeOrder = /**
* @param {?} field
* @return {?}
*/
function (field) {
/** @type {?} */
var _currentOrder;
if (field && this.isSortable(field)) {
if (this.currentOrder && this.currentOrder.orderBy === field.id) {
_currentOrder = this.changeOrderDirection();
}
else {
_currentOrder = new Order(field.id, ORDER_TYPE.ASC);
}
this.changeOrder.emit(_currentOrder);
}
};
/**
* @param {?} event
* @return {?}
*/
StTableComponent.prototype.onSelectAll = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.selectAll.emit(event.checked);
};
/**
* @return {?}
*/
StTableComponent.prototype.onSelectFilters = /**
* @return {?}
*/
function () {
/** @type {?} */
var selectedFilters = _cloneDeep(this.fields);
selectedFilters = selectedFilters.filter((/**
* @param {?} field
* @return {?}
*/
function (field) {
if (_get(field, 'filters.filterConfig')) {
field.filters.filterConfig = field.filters.filterConfig.filter((/**
* @param {?} conf
* @return {?}
*/
function (conf) { return conf.selected; }));
if (field.filters.filterConfig.length > 0) {
return field;
}
}
}));
this.selectFilters.emit(selectedFilters);
};
/**
* @param {?} event
* @param {?} index
* @param {?} field
* @return {?}
*/
StTableComponent.prototype.onChangeFilterVisibility = /**
* @param {?} event
* @param {?} index
* @param {?} field
* @return {?}
*/
function (event, index, field) {
event.stopPropagation();
this.visibleFilter = this.visibleFilter === index ? undefined : index;
this.clickFilter.emit(field);
this._cd.markForCheck();
};
/**
* @param {?} position
* @return {?}
*/
StTableComponent.prototype.getFilterIconClasses = /**
* @param {?} position
* @return {?}
*/
function (position) {
/** @type {?} */
var classes = {};
classes['st-table__filter-arrow'] = true;
classes[this.statusFilter[position] ? this.iconClasses.filter.selected : this.iconClasses.filter.enabled] = true;
return classes;
};
/**
* @private
* @return {?}
*/
StTableComponent.prototype.changeOrderDirection = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var newDirection = this.currentOrder.type === ORDER_TYPE.ASC ? ORDER_TYPE.DESC : ORDER_TYPE.ASC;
return new Order(this.currentOrder.orderBy, newDirection);
};
/**
* @private
* @param {?} field
* @param {?} orderType
* @return {?}
*/
StTableComponent.prototype.isSortedByFieldAndDirection = /**
* @private
* @param {?} field
* @param {?} orderType
* @return {?}
*/
function (field, orderType) {
return this.isSortedByField(field) && this.currentOrder.type === orderType;
};
StTableComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef }
]; };
StTableComponent.decorators = [
{ type: Component, args: [{
selector: 'st-table',
template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<table class='st-table' [ngClass]=\"tableClasses\" [attr.id]='qaTag'>\n <thead>\n <tr *ngIf=\"header\" class='st-table__header'>\n\n <th *ngFor='let field of fields; let i = index' class='st-table__header-item' [ngClass]=\"{\n 'st-table__header-item--selected': isSortedByField(field),\n 'st-table__header-item--sortable': isSortable(field),\n 'st-table__header-item--filterable': isFilterable(field)}\">\n <st-checkbox *ngIf=\"i == 0 && selectableAll\" qaTag=\"select-all-checkbox\" class=\"st-table__checkbox\"\n name=\"selectAll\"\n [checked]=\"selectedAll\" (change)=\"onSelectAll($event)\">\n </st-checkbox>\n <label class='st-table__header-text' (click)=\"onChangeOrder(field)\">\n <i *ngIf=\"isSortedByField(field)\" class='st-table__order-arrow' [ngClass]=\"getHeaderItemClass(field)\">\n </i>\n {{field.label}}\n </label>\n <st-popover-filter *ngIf=\"isFilterable(field)\"\n [field]=\"field\"\n [index]=\"i\"\n [templateContentFilter]=\"templateContentFilter\"\n [hidden]=\"visibleFilter !== i\"\n (filter)=\"onSelectFilters()\"\n (close)=\"onHideFilterMenu()\">\n <i popover-filter-button\n [ngClass]=\"getFilterIconClasses(i)\"\n (click)=\"onChangeFilterVisibility($event, i, field)\">\n </i>\n </st-popover-filter>\n </th>\n <th *ngIf=\"hasHoverMenu\"></th> <!-- For hover cell -->\n </tr>\n </thead>\n <ng-content></ng-content>\n</table>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: ["@charset \"UTF-8\";.st-table{width:100%}.st-table__header-item{text-transform:capitalize;position:relative;vertical-align:bottom}.st-table__header-text{position:relative;height:100%;display:inline-flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:flex-start;cursor:inherit}"]
}] }
];
/** @nocollapse */
StTableComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef }
]; };
StTableComponent.propDecorators = {
fields: [{ type: Input }],
qaTag: [{ type: Input }],
header: [{ type: Input }],
sortable: [{ type: Input }],
filterable: [{ type: Input }],
selectableAll: [{ type: Input }],
currentOrder: [{ type: Input }],
templateContentFilter: [{ type: Input }],
statusFilter: [{ type: Input }],
iconClasses: [{ type: Input }],
fixedHeader: [{ type: Input }, { type: HostBinding, args: ['class.st-custom-scrollbar',] }, { type: HostBinding, args: ['class.fixed-header',] }],
stickyHoverMenu: [{ type: Input }, { type: HostBinding, args: ['class.sticky-hover-menu',] }],
customClasses: [{ type: Input }],
selectedAll: [{ type: Input }],
hasHoverMenu: [{ type: Input }],
changeOrder: [{ type: Output }],
selectAll: [{ type: Output }],
clickFilter: [{ type: Output }],
selectFilters: [{ type: Output }]
};
tslib_1.__decorate([
StRequired(),
tslib_1.__metadata("design:type", Array)
], StTableComponent.prototype, "fields", void 0);
/**
* \@description {Component} [Table]
*
* The table component has been designed to display any content like images, text, graphs, etc.
*
* * \@model
*
* [StTableHeader] {./shared/table-header.interface.ts#StTableHeader}
* [StDynamicTableHeader] {./shared/table-header.interface.ts#StFilterElement}
* [StFilterHeader] {./shared/table-header.interface.ts#StFilterHeader}
* [StTableFilterIconClasses] {./st-table.interface.ts#StTableFilterIconClasses}
* [StTableIconClasses] {./st-table.interface.ts#StTableIconClasses}
*
* \@example
*
* {html}
*
* ```
* <st-table [fields]="fields" [sortable]="true" (changeOrder)="yourFunctionToOrder($event)">
* <tr st-table-row *ngFor="let userData of data">
* <td st-table-cell st-table-row-content>
* <label >{{userData.id}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.name}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.lastName}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.phone}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.company}}</label>
* </td>
* <td st-table-cell st-table-row-content>
* <label >{{userData.completedProfile}}</label>
* </td>
* <td st-table-row-hover>
* <i class="icon icon-arrow2_right"></i>
* </td>
* </tr>
* </st-table>
* ```
*
*/
StTableComponent = tslib_1.__decorate([
StEgeo(),
tslib_1.__metadata("design:paramtypes", [ChangeDetectorRef])
], StTableComponent);
return StTableComponent;
}());
export { StTableComponent };
if (false) {
/**
* \@Input {StTableHeader[]} [fields=''] List of field displayed in the header
* @type {?}
*/
StTableComponent.prototype.fields;
/**
* \@Input {string} [qaTag=''] Prefix used to generate the id values for qa tests
* @type {?}
*/
StTableComponent.prototype.qaTag;
/**
* \@Input {boolean} [header=true] Boolean to show or hide the header
* @type {?}
*/
StTableComponent.prototype.header;
/**
* \@Input {boolean} [sortable=true] Boolean to make sortable the table, To enable sorting of columns use
* the new "sortable" field inside stTableHeader model
* @type {?}
*/
StTableComponent.prototype.sortable;
/**
* \@Input {boolean} [filterable=true] Boolean to make filterable the table, To enable filtering of columns use
* the new "filterable" field inside stTableHeader model (necessary define filterConfig).
* @type {?}
*/
StTableComponent.prototype.filterable;
/**
* \@Input {boolean} [selectableAll=false] Boolean to show or hide a checkbox in the header to select or
* deselect all rows
* @type {?}
*/
StTableComponent.prototype.selectableAll;
/**
* \@Input {Order} [currentOrder=''] It specifies what is the current order applied to the table
* @type {?}
*/
StTableComponent.prototype.currentOrder;
/**
* \@Input {TemplateRef} [templateContentFilter=undefined] Reference to paint a custom template inside popover content
* @type {?}
*/
StTableComponent.prototype.templateContentFilter;
/**
* \@Input {boolean[]} [statusFilter=''] List of status filter by column, needed with templateContentFilter
* @type {?}
*/
StTableComponent.prototype.statusFilter;
/**
* \@Input {StTableIconClasses} [iconClasses=''] List of icon classes
* @type {?}
*/
StTableComponent.prototype.iconClasses;
/**
* \@Output {Order} [changeOrder=''] Event emitted with the new order which has to be applied to the table rows
* @type {?}
*/
StTableComponent.prototype.changeOrder;
/**
* \@Output {boolean} [selectAll=''] Event emitted when user interacts with the checkbox to select or deselect
* all rows
* @type {?}
*/
StTableComponent.prototype.selectAll;
/**
* \@Output {string} [clickFilter=] Event emitted when clicking on filters icon
* @type {?}
*/
StTableComponent.prototype.clickFilter;
/**
* \@Output {StTableHeader[]} [selectFilters=''] Event emitted when user interacts with filter button without a custom template
* @type {?}
*/
StTableComponent.prototype.selectFilters;
/** @type {?} */
StTableComponent.prototype.tableClasses;
/** @type {?} */
StTableComponent.prototype.visibleFilter;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._fixedHeader;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._stickyHoverMenu;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._selectedAll;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._hasHoverMenu;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._customClasses;
/**
* @type {?}
* @private
*/
StTableComponent.prototype._cd;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC10YWJsZS9zdC10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckosT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxTQUFTLElBQUksVUFBVSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTJLdkQsMEJBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1COzs7O1FBN0dqQyxXQUFNLEdBQVksSUFBSSxDQUFDOzs7OztRQUt2QixhQUFRLEdBQVksSUFBSSxDQUFDOzs7OztRQUt6QixlQUFVLEdBQVksS0FBSyxDQUFDOzs7OztRQUs1QixrQkFBYSxHQUFZLEtBQUssQ0FBQzs7OztRQVkvQixnQkFBVyxHQUF3QixJQUFJLGtCQUFrQixFQUFFLENBQUM7Ozs7UUE2RDNELGdCQUFXLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7Ozs7O1FBSXRELGNBQVMsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7OztRQUd0RCxnQkFBVyxHQUFnQyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FB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LFlBQ0wsV0FBVyxTQUFDLHlCQUF5QjtnQ0FVckMsS0FBSzs4QkFZTCxLQUFLOytCQWFMLEtBQUs7OEJBVUwsTUFBTTs0QkFJTixNQUFNOzhCQUdOLE1BQU07Z0NBR04sTUFBTTs7SUF0R2dCO1FBQWIsVUFBVSxFQUFFOztvREFBeUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRnJDLGdCQUFnQjtRQVI1QixNQUFNLEVBQUU7aURBMkhtQixpQkFBaUI7T0FuSGhDLGdCQUFnQixDQXlNNUI7SUFBRCx1QkFBQztDQUFBLElBQUE7U0F6TVksZ0JBQWdCOzs7Ozs7SUFFMUIsa0NBQStDOzs7OztJQUUvQyxpQ0FBdUI7Ozs7O0lBRXZCLGtDQUFnQzs7Ozs7O0lBS2hDLG9DQUFrQzs7Ozs7O0lBS2xDLHNDQUFxQzs7Ozs7O0lBS3JDLHlDQUF3Qzs7Ozs7SUFHeEMsd0NBQTZCOzs7OztJQUc3QixpREFBa0Q7Ozs7O0lBR2xELHdDQUFrQzs7Ozs7SUFHbEMsdUNBQXFFOzs7OztJQTZEckUsdUNBQWdFOzs7Ozs7SUFJaEUscUNBQWdFOzs7OztJQUdoRSx1Q0FBd0U7Ozs7O0lBR3hFLHlDQUE0RTs7SUFFNUUsd0NBQThCOztJQUM5Qix5Q0FBa0M7Ozs7O0lBRWxDLHdDQUFzQzs7Ozs7SUFDdEMsNENBQTBDOzs7OztJQUMxQyx3Q0FBOEI7Ozs7O0lBQzlCLHlDQUF1Qzs7Ozs7SUFDdkMsMENBQStCOzs7OztJQUVuQiwrQkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogwqkgMjAxNyBTdHJhdGlvIEJpZyBEYXRhIEluYy4sIFN1Y3Vyc2FsIGVuIEVzcGHDsWEuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTtcbiAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4gKiBTZWUgdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAuXG4gKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN0RWdlbywgU3RSZXF1aXJlZCB9IGZyb20gJy4uL2RlY29yYXRvcnMvcmVxdWlyZS1kZWNvcmF0b3JzJztcbmltcG9ydCB7IE9yZGVyLCBPUkRFUl9UWVBFIH0gZnJvbSAnLi9zaGFyZWQvb3JkZXInO1xuaW1wb3J0IHsgU3RUYWJsZUhlYWRlciB9IGZyb20gJy4vc2hhcmVkL3RhYmxlLWhlYWRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIGFzIF9jbG9uZURlZXAsIGdldCBhcyBfZ2V0IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFN0VGFibGVJY29uQ2xhc3NlcyB9IGZyb20gJy4vc3QtdGFibGUuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24ge0NvbXBvbmVudH0gW1RhYmxlXVxuICpcbiAqIFRoZSB0YWJsZSBjb21wb25lbnQgaGFzIGJlZW4gZGVzaWduZWQgdG8gZGlzcGxheSBhbnkgY29udGVudCBsaWtlIGltYWdlcywgdGV4dCwgZ3JhcGhzLCBldGMuXG4gKlxuICogKiBAbW9kZWxcbiAqXG4gKiAgIFtTdFRhYmxlSGVhZGVyXSB7Li9zaGFyZWQvdGFibGUtaGVhZGVyLmludGVyZmFjZS50cyNTdFRhYmxlSGVhZGVyfVxuICogICBbU3REeW5hbWljVGFibGVIZWFkZXJdIHsuL3NoYXJlZC90YWJsZS1oZWFkZXIuaW50ZXJmYWNlLnRzI1N0RmlsdGVyRWxlbWVudH1cbiAqICAgW1N0RmlsdGVySGVhZGVyXSB7Li9zaGFyZWQvdGFibGUtaGVhZGVyLmludGVyZmFjZS50cyNTdEZpbHRlckhlYWRlcn1cbiAqICAgW1N0VGFibGVGaWx0ZXJJY29uQ2xhc3Nlc10gey4vc3QtdGFibGUuaW50ZXJmYWNlLnRzI1N0VGFibGVGaWx0ZXJJY29uQ2xhc3Nlc31cbiAqICAgW1N0VGFibGVJY29uQ2xhc3Nlc10gey4vc3QtdGFibGUuaW50ZXJmYWNlLnRzI1N0VGFibGVJY29uQ2xhc3Nlc31cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIHtodG1sfVxuICpcbiAqIGBgYFxuICogPHN0LXRhYmxlIFtmaWVsZHNdPVwiZmllbGRzXCIgW3NvcnRhYmxlXT1cInRydWVcIiAoY2hhbmdlT3JkZXIpPVwieW91ckZ1bmN0aW9uVG9PcmRlcigkZXZlbnQpXCI+XG4gKiA8dHIgc3QtdGFibGUtcm93ICpuZ0Zvcj1cImxldCB1c2VyRGF0YSBvZiBkYXRhXCI+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5pZH19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtY2VsbCBzdC10YWJsZS1yb3ctY29udGVudD5cbiAqICAgIDxsYWJlbCA+e3t1c2VyRGF0YS5uYW1lfX08L2xhYmVsPlxuICogPC90ZD5cbiAqIDx0ZCBzdC10YWJsZS1jZWxsIHN0LXRhYmxlLXJvdy1jb250ZW50PlxuICogICAgPGxhYmVsID57e3VzZXJEYXRhLmxhc3ROYW1lfX08L2xhYmVsPlxuICogPC90ZD5cbiAqIDx0ZCBzdC10YWJsZS1jZWxsIHN0LXRhYmxlLXJvdy1jb250ZW50PlxuICogICAgPGxhYmVsID57e3VzZXJEYXRhLnBob25lfX08L2xhYmVsPlxuICogPC90ZD5cbiAqIDx0ZCBzdC10YWJsZS1jZWxsIHN0LXRhYmxlLXJvdy1jb250ZW50PlxuICogICAgPGxhYmVsID57e3VzZXJEYXRhLmNvbXBhbnl9fTwvbGFiZWw+XG4gKiA8L3RkPlxuICogPHRkIHN0LXRhYmxlLWNlbGwgc3QtdGFibGUtcm93LWNvbnRlbnQ+XG4gKiAgICA8bGFiZWwgPnt7dXNlckRhdGEuY29tcGxldGVkUHJvZmlsZX19PC9sYWJlbD5cbiAqIDwvdGQ+XG4gKiA8dGQgc3QtdGFibGUtcm93LWhvdmVyPlxuICogICAgPGkgY2xhc3M9XCJpY29uIGljb24tYXJyb3cyX3JpZ2h0XCI+PC9pPlxuICogPC90ZD5cbiAqIDwvdHI+XG4gKiA8L3N0LXRhYmxlPlxuICogYGBgXG4gKlxuICovXG5AU3RFZ2VvKClcbkBDb21wb25lbnQoe1xuICAgc2VsZWN0b3I6ICdzdC10YWJsZScsXG4gICB0ZW1wbGF0ZVVybDogJy4vc3QtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICAgc3R5bGVVcmxzOiBbJy4vc3QtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuXG5leHBvcnQgY2xhc3MgU3RUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAvKiogQElucHV0IHtTdFRhYmxlSGVhZGVyW119IFtmaWVsZHM9JyddIExpc3Qgb2YgZmllbGQgZGlzcGxheWVkIGluIHRoZSBoZWFkZXIgKi9cbiAgIEBJbnB1dCgpIEBTdFJlcXVpcmVkKCkgZmllbGRzOiBTdFRhYmxlSGVhZGVyW107XG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtxYVRhZz0nJ10gUHJlZml4IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGlkIHZhbHVlcyBmb3IgcWEgdGVzdHMgKi9cbiAgIEBJbnB1dCgpIHFhVGFnOiBzdHJpbmc7XG4gICAvKiogQElucHV0IHtib29sZWFufSBbaGVhZGVyPXRydWVdIEJvb2xlYW4gdG8gc2hvdyBvciBoaWRlIHRoZSBoZWFkZXIgKi9cbiAgIEBJbnB1dCgpIGhlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gICAvKipcbiAgICAqIEBJbnB1dCB7Ym9vbGVhbn0gW3NvcnRhYmxlPXRydWVdIEJvb2xlYW4gdG8gbWFrZSBzb3J0YWJsZSB0aGUgdGFibGUsIFRvIGVuYWJsZSBzb3J0aW5nIG9mIGNvbHVtbnMgdXNlXG4gICAgKiB0aGUgbmV3IFwic29ydGFibGVcIiBmaWVsZCBpbnNpZGUgc3RUYWJsZUhlYWRlciBtb2RlbFxuICAgICovXG4gICBASW5wdXQoKSBzb3J0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gICAvKipcbiAgICAqIEBJbnB1dCB7Ym9vbGVhbn0gW2ZpbHRlcmFibGU9dHJ1ZV0gQm9vbGVhbiB0byBtYWtlIGZpbHRlcmFibGUgdGhlIHRhYmxlLCBUbyBlbmFibGUgZmlsdGVyaW5nIG9mIGNvbHVtbnMgdXNlXG4gICAgKiB0aGUgbmV3IFwiZmlsdGVyYWJsZVwiIGZpZWxkIGluc2lkZSBzdFRhYmxlSGVhZGVyIG1vZGVsIChuZWNlc3NhcnkgZGVmaW5lIGZpbHRlckNvbmZpZykuXG4gICAgKi9cbiAgIEBJbnB1dCgpIGZpbHRlcmFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgIC8qKlxuICAgICogQElucHV0IHtib29sZWFufSBbc2VsZWN0YWJsZUFsbD1mYWxzZV0gQm9vbGVhbiB0byBzaG93IG9yIGhpZGUgYSBjaGVja2JveCBpbiB0aGUgaGVhZGVyIHRvIHNlbGVjdCBvclxuICAgICogIGRlc2VsZWN0IGFsbCByb3dzXG4gICAgKi9cbiAgIEBJbnB1dCgpIHNlbGVjdGFibGVBbGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgLyoqIEBJbnB1dCB7T3JkZXJ9IFtjdXJyZW50T3JkZXI9JyddIEl0IHNwZWNpZmllcyB3aGF0IGlzIHRoZSBjdXJyZW50IG9yZGVyIGFwcGxpZWQgdG8gdGhlIHRhYmxlICovXG4gICBASW5wdXQoKSBjdXJyZW50T3JkZXI6IE9yZGVyO1xuXG4gICAvKiogQElucHV0IHtUZW1wbGF0ZVJlZn0gW3RlbXBsYXRlQ29udGVudEZpbHRlcj11bmRlZmluZWRdIFJlZmVyZW5jZSB0byBwYWludCBhIGN1c3RvbSB0ZW1wbGF0ZSBpbnNpZGUgcG9wb3ZlciBjb250ZW50ICovXG4gICBASW5wdXQoKSB0ZW1wbGF0ZUNvbnRlbnRGaWx0ZXI/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAvKiogQElucHV0IHtib29sZWFuW119IFtzdGF0dXNGaWx0ZXI9JyddIExpc3Qgb2Ygc3RhdHVzIGZpbHRlciBieSBjb2x1bW4sIG5lZWRlZCB3aXRoIHRlbXBsYXRlQ29udGVudEZpbHRlciAqL1xuICAgQElucHV0KCkgc3RhdHVzRmlsdGVyPzogYm9vbGVhbltdO1xuXG4gICAvKiogQElucHV0IHtTdFRhYmxlSWNvbkNsYXNzZXN9IFtpY29uQ2xhc3Nlcz0nJ10gTGlzdCBvZiBpY29uIGNsYXNzZXMgKi9cbiAgIEBJbnB1dCgpIGljb25DbGFzc2VzPzogU3RUYWJsZUljb25DbGFzc2VzID0gbmV3IFN0VGFibGVJY29uQ2xhc3NlcygpO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbZml4ZWRIZWFkZXI9ZmFsc2VdIEJvb2xlYW4gdG8gZml4IHRoZSB0YWJsZSBoZWFkZXIgKi9cbiAgIEBJbnB1dCgpXG4gICBASG9zdEJpbmRpbmcoJ2NsYXNzLnN0LWN1c3RvbS1zY3JvbGxiYXInKVxuICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5maXhlZC1oZWFkZXInKVxuICAgZ2V0IGZpeGVkSGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpeGVkSGVhZGVyO1xuICAgfVxuXG4gICBzZXQgZml4ZWRIZWFkZXIobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuX2ZpeGVkSGVhZGVyID0gbmV3VmFsdWU7XG4gICB9XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtzdGlja3lIb3Zlck1lbnU9ZmFsc2VdIEJvb2xlYW4gdG8gZml4IGhvdmVyIG1lbnUgYWx3YXlzIHZpc2libGUgKi9cbiAgIEBJbnB1dCgpXG4gICBASG9zdEJpbmRpbmcoJ2NsYXNzLnN0aWNreS1ob3Zlci1tZW51JylcbiAgIGdldCBzdGlja3lIb3Zlck1lbnUoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RpY2t5SG92ZXJNZW51O1xuICAgfVxuXG4gICBzZXQgc3RpY2t5SG92ZXJNZW51KG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9zdGlja3lIb3Zlck1lbnUgPSBuZXdWYWx1ZTtcbiAgIH1cblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbY3VzdG9tQ2xhc3Nlcz1dIENsYXNzZXMgZm9yIGFkZGluZyBzdHlsZXMgdG8gdGFibGUgdGFnIGZyb20gb3V0c2lkZS4gVGhlc2UgY2FuIGJlOiBzZXBhcmF0ZWQtcm93cyAqL1xuICAgQElucHV0KClcbiAgIGdldCBjdXN0b21DbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VzdG9tQ2xhc3NlcztcbiAgIH1cblxuICAgc2V0IGN1c3RvbUNsYXNzZXMobmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy50YWJsZUNsYXNzZXNbdGhpcy5fY3VzdG9tQ2xhc3Nlc10gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jdXN0b21DbGFzc2VzID0gbmV3VmFsdWU7XG4gICAgICB0aGlzLnRhYmxlQ2xhc3Nlc1t0aGlzLl9jdXN0b21DbGFzc2VzXSA9IHRoaXMuX2N1c3RvbUNsYXNzZXM7XG4gICB9XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtzZWxlY3RlZEFsbD1mYWxzZV0gSXQgc3BlY2lmaWVzIGlmIGFsbCByb3dzIGFyZSBzZWxlY3RlZCAqL1xuICAgQElucHV0KClcbiAgIGdldCBzZWxlY3RlZEFsbCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEFsbDtcbiAgIH1cblxuICAgc2V0IHNlbGVjdGVkQWxsKG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZEFsbCA9IG5ld1ZhbHVlO1xuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtoYXNIb3Zlck1lbnU9ZmFsc2VdIEl0IHNwZWNpZmllcyBpZiBhIG1lbnUgaGFzIHRvIGJlIGRpc3BsYXllZCB3aGVuIHVzZXIgcHV0cyB0aGUgbW91c2Ugb3ZlclxuICAgICogdGhlIHJvd3MuIFJlbWVtYmVyIHRvIGFkZCBhIGNlbGwgd2l0aCB0aGUgc2VsZWN0b3Igc3QtdGFibGUtcm93LWhvdmVyIGZvciBhZGRpbmcgY29udGVudCB0byB0aGUgbWVudVxuICAgICovXG4gICBASW5wdXQoKVxuICAgZ2V0IGhhc0hvdmVyTWVudSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYXNIb3Zlck1lbnU7XG4gICB9XG5cbiAgIHNldCBoYXNIb3Zlck1lbnUobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuX2hhc0hvdmVyTWVudSA9IG5ld1ZhbHVlO1xuICAgfVxuXG4gICAvKiogQE91dHB1dCB7T3JkZXJ9IFtjaGFuZ2VPcmRlcj0nJ10gRXZlbnQgZW1pdHRlZCB3aXRoIHRoZSBuZXcgb3JkZXIgd2hpY2ggaGFzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHRhYmxlIHJvd3MgKi9cbiAgIEBPdXRwdXQoKSBjaGFuZ2VPcmRlcjogRXZlbnRFbWl0dGVyPE9yZGVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgIC8qKiBAT3V0cHV0IHtib29sZWFufSBbc2VsZWN0QWxsPScnXSBFdmVudCBlbWl0dGVkIHdoZW4gdXNlciBpbnRlcmFjdHMgd2l0aCB0aGUgY2hlY2tib3ggdG8gc2VsZWN0IG9yIGRlc2VsZWN0XG4gICAgKiBhbGwgcm93c1xuICAgICovXG4gICBAT3V0cHV0KCkgc2VsZWN0QWxsOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgIC8qKiBAT3V0cHV0IHtzdHJpbmd9IFtjbGlja0ZpbHRlcj1dIEV2ZW50IGVtaXR0ZWQgd2hlbiBjbGlja2luZyBvbiBmaWx0ZXJzIGljb24gICovXG4gICBAT3V0cHV0KCkgY2xpY2tGaWx0ZXI6IEV2ZW50RW1pdHRlcjxTdFRhYmxlSGVhZGVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgLyoqIEBPdXRwdXQge1N0VGFibGVIZWFkZXJbXX0gW3NlbGVjdEZpbHRlcnM9JyddIEV2ZW50IGVtaXR0ZWQgIHdoZW4gdXNlciBpbnRlcmFjdHMgd2l0aCBmaWx0ZXIgYnV0dG9uIHdpdGhvdXQgYSBjdXN0b20gdGVtcGxhdGUgKi9cbiAgIEBPdXRwdXQoKSBzZWxlY3RGaWx0ZXJzOiBFdmVudEVtaXR0ZXI8U3RUYWJsZUhlYWRlcltdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgcHVibGljIHRhYmxlQ2xhc3NlczogYW55ID0ge307XG4gICBwdWJsaWMgdmlzaWJsZUZpbHRlcjogbnVtYmVyID0gLTE7XG5cbiAgIHByaXZhdGUgX2ZpeGVkSGVhZGVyOiBib29sZWFuID0gZmFsc2U7XG4gICBwcml2YXRlIF9zdGlja3lIb3Zlck1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgIHByaXZhdGUgX3NlbGVjdGVkQWxsOiBib29sZWFuO1xuICAgcHJpdmF0ZSBfaGFzSG92ZXJNZW51OiBib29sZWFuID0gZmFsc2U7XG4gICBwcml2YXRlIF9jdXN0b21DbGFzc2VzOiBzdHJpbmc7XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgfVxuXG4gICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcmFibGUgJiYgIXRoaXMuc3RhdHVzRmlsdGVyKSB7XG4gICAgICAgICB0aGlzLnN0YXR1c0ZpbHRlciA9IG5ldyBBcnJheSh0aGlzLmZpZWxkcy5sZW5ndGgpO1xuICAgICAgICAgdGhpcy5zdGF0dXNGaWx0ZXIuZmlsbChmYWxzZSk7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBnZXRIZWFkZXJJdGVtQ2xhc3MoZmllbGQ6IFN0VGFibGVIZWFkZXIpOiBzdHJpbmcge1xuICAgICAgbGV0IGlzT3JkZXJBc2MgPSB0aGlzLmlzU29ydGVkQnlGaWVsZEFuZERpcmVjdGlvbihmaWVsZCwgT1JERVJfVFlQRS5BU0MpO1xuICAgICAgcmV0dXJuIGlzT3JkZXJBc2MgPyB0aGlzLmljb25DbGFzc2VzLnNvcnQuYXNjIDogdGhpcy5pY29uQ2xhc3Nlcy5zb3J0LmRlc2M7XG4gICB9XG5cbiAgIHB1YmxpYyBpc1NvcnRhYmxlKGZpZWxkOiBTdFRhYmxlSGVhZGVyKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZmllbGQgJiYgZmllbGQuc29ydGFibGUgIT09IHVuZGVmaW5lZCA/IGZpZWxkLnNvcnRhYmxlIDogdGhpcy5zb3J0YWJsZTtcbiAgIH1cblxuICAgcHVibGljIGlzU29ydGVkQnlGaWVsZChmaWVsZDogU3RUYWJsZUhlYWRlcik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudE9yZGVyICYmIHRoaXMuY3VycmVudE9yZGVyLm9yZGVyQnkgPT09IGZpZWxkLmlkO1xuICAgfVxuXG4gICBwdWJsaWMgaXNGaWx0ZXJhYmxlKGZpZWxkOiBTdFRhYmxlSGVhZGVyKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJhYmxlICYmICgoX2dldChmaWVsZCwgJ2ZpbHRlcnMuZmlsdGVyQ29uZmlnJykpIHx8XG4gICAgICAgICAodGhpcy50ZW1wbGF0ZUNvbnRlbnRGaWx0ZXIgJiYgX2dldChmaWVsZCwgJ2ZpbHRlcnMnKSkgfHxcbiAgICAgICAgIF9nZXQoZmllbGQsICdmaWx0ZXJzLnRlbXBsYXRlUmVmJykpO1xuICAgfVxuXG4gICBwdWJsaWMgb25IaWRlRmlsdGVyTWVudSgpOiB2b2lkIHtcbiAgICAgIHRoaXMudmlzaWJsZUZpbHRlciA9IC0xO1xuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIHB1YmxpYyBvbkNoYW5nZU9yZGVyKGZpZWxkOiBTdFRhYmxlSGVhZGVyKTogdm9pZCB7XG4gICAgICBsZXQgX2N1cnJlbnRPcmRlcjogT3JkZXI7XG4gICAgICBpZiAoZmllbGQgJiYgdGhpcy5pc1NvcnRhYmxlKGZpZWxkKSkge1xuICAgICAgICAgaWYgKHRoaXMuY3VycmVudE9yZGVyICYmIHRoaXMuY3VycmVudE9yZGVyLm9yZGVyQnkgPT09IGZpZWxkLmlkKSB7XG4gICAgICAgICAgICBfY3VycmVudE9yZGVyID0gdGhpcy5jaGFuZ2VPcmRlckRpcmVjdGlvbigpO1xuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9jdXJyZW50T3JkZXIgPSBuZXcgT3JkZXIoZmllbGQuaWQsIE9SREVSX1RZUEUuQVNDKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuY2hhbmdlT3JkZXIuZW1pdChfY3VycmVudE9yZGVyKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIG9uU2VsZWN0QWxsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgIHRoaXMuc2VsZWN0QWxsLmVtaXQoZXZlbnQuY2hlY2tlZCk7XG4gICB9XG5cbiAgIHB1YmxpYyBvblNlbGVjdEZpbHRlcnMoKTogdm9pZCB7XG4gICAgICBsZXQgc2VsZWN0ZWRGaWx0ZXJzID0gX2Nsb25lRGVlcCh0aGlzLmZpZWxkcyk7XG4gICAgICBzZWxlY3RlZEZpbHRlcnMgPSBzZWxlY3RlZEZpbHRlcnMuZmlsdGVyKChmaWVsZCkgPT4ge1xuICAgICAgICAgaWYgKF9nZXQoZmllbGQsICdmaWx0ZXJzLmZpbHRlckNvbmZpZycpKSB7XG4gICAgICAgICAgICBmaWVsZC5maWx0ZXJzLmZpbHRlckNvbmZpZyA9IGZpZWxkLmZpbHRlcnMuZmlsdGVyQ29uZmlnLmZpbHRlcigoY29uZikgPT4gY29uZi5zZWxlY3RlZCk7XG4gICAgICAgICAgICBpZiAoZmllbGQuZmlsdGVycy5maWx0ZXJDb25maWcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnNlbGVjdEZpbHRlcnMuZW1pdChzZWxlY3RlZEZpbHRlcnMpO1xuICAgfVxuXG4gICBwdWJsaWMgb25DaGFuZ2VGaWx0ZXJWaXNpYmlsaXR5KGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyLCBmaWVsZDogU3RUYWJsZUhlYWRlcik6IHZvaWQge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLnZpc2libGVGaWx0ZXIgPSB0aGlzLnZpc2libGVGaWx0ZXIgPT09IGluZGV4ID8gdW5kZWZpbmVkIDogaW5kZXg7XG4gICAgICB0aGlzLmNsaWNrRmlsdGVyLmVtaXQoZmllbGQpO1xuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIHB1YmxpYyBnZXRGaWx0ZXJJY29uQ2xhc3Nlcyhwb3NpdGlvbjogbnVtYmVyKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0ge1xuICAgICAgY29uc3QgY2xhc3NlczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICAgIGNsYXNzZXNbJ3N0LXRhYmxlX19maWx0ZXItYXJyb3cnXSA9IHRydWU7XG4gICAgICBjbGFzc2VzW3RoaXMuc3RhdHVzRmlsdGVyW3Bvc2l0aW9uXSA/IHRoaXMuaWNvbkNsYXNzZXMuZmlsdGVyLnNlbGVjdGVkIDogdGhpcy5pY29uQ2xhc3Nlcy5maWx0ZXIuZW5hYmxlZF0gPSB0cnVlO1xuXG4gICAgICByZXR1cm4gY2xhc3NlcztcbiAgIH1cblxuICAgcHJpdmF0ZSBjaGFuZ2VPcmRlckRpcmVjdGlvbigpOiBPcmRlciB7XG4gICAgICBsZXQgbmV3RGlyZWN0aW9uID0gdGhpcy5jdXJyZW50T3JkZXIudHlwZSA9PT0gT1JERVJfVFlQRS5BU0MgPyBPUkRFUl9UWVBFLkRFU0MgOiBPUkRFUl9UWVBFLkFTQztcbiAgICAgIHJldHVybiBuZXcgT3JkZXIodGhpcy5jdXJyZW50T3JkZXIub3JkZXJCeSwgbmV3RGlyZWN0aW9uKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBpc1NvcnRlZEJ5RmllbGRBbmREaXJlY3Rpb24oZmllbGQ6IFN0VGFibGVIZWFkZXIsIG9yZGVyVHlwZTogT1JERVJfVFlQRSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaXNTb3J0ZWRCeUZpZWxkKGZpZWxkKSAmJiB0aGlzLmN1cnJlbnRPcmRlci50eXBlID09PSBvcmRlclR5cGU7XG4gICB9XG59XG4iXX0=