@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
324 lines • 41.4 kB
JavaScript
import { __decorate, __metadata, __param } from "tslib";
import { ChangeDetectorRef, Component, HostBinding, Input, Optional, ViewChild, Inject, TemplateRef } from '@angular/core';
import { DisplayDensityToken, DisplayDensityBase } from '../../core/displayDensity';
import { CsvFileTypes, IgxBaseExporter, IgxCsvExporterOptions, IgxCsvExporterService, IgxExcelExporterOptions, IgxExcelExporterService, AbsoluteScrollStrategy } from '../../services/index';
import { GridBaseAPIService } from '../api.service';
import { IgxButtonDirective } from '../../directives/button/button.directive';
import { IgxDropDownComponent } from '../../drop-down/drop-down.component';
import { IgxColumnHidingComponent } from '../hiding/column-hiding.component';
import { IgxColumnPinningComponent } from '../pinning/column-pinning.component';
import { HorizontalAlignment, VerticalAlignment } from '../../services/overlay/utilities';
import { ConnectedPositioningStrategy } from '../../services/overlay/position';
/**
* This class encapsulates the Toolbar's logic and is internally used by
* the `IgxGridComponent`, `IgxTreeGridComponent` and `IgxHierarchicalGridComponent`.
*/
let IgxGridToolbarComponent = class IgxGridToolbarComponent extends DisplayDensityBase {
constructor(gridAPI, cdr, excelExporter, csvExporter, _displayDensityOptions) {
super(_displayDensityOptions);
this.gridAPI = gridAPI;
this.cdr = cdr;
this.excelExporter = excelExporter;
this.csvExporter = csvExporter;
this._displayDensityOptions = _displayDensityOptions;
this._filterColumnsPrompt = 'Filter columns list ...';
this._positionSettings = {
horizontalDirection: HorizontalAlignment.Left,
horizontalStartPoint: HorizontalAlignment.Right,
verticalDirection: VerticalAlignment.Bottom,
verticalStartPoint: VerticalAlignment.Bottom
};
this._overlaySettings = {
positionStrategy: new ConnectedPositioningStrategy(this._positionSettings),
scrollStrategy: new AbsoluteScrollStrategy(),
modal: false,
closeOnOutsideClick: true,
excludePositionTarget: true
};
}
/**
* Gets the default text shown in the filtering box.
* ```typescript
* const filterPrompt = this.grid.toolbar.filterColumnsPrompt;
* ```
*/
get filterColumnsPrompt() {
return this._filterColumnsPrompt;
}
/**
* Sets the default text shown in the filtering box.
* ```typescript
* this.grid.toolbar.filterColumnsPrompt('Filter columns ...');
* ```
*/
set filterColumnsPrompt(value) {
this._filterColumnsPrompt = value;
}
/**
* Gets the height for the `IgxGridToolbarComponent`'s drop down panels.
* ```typescript
* const dropdownHeight = this.grid.toolbar.defaultDropDownsMaxHeight;
* ```
*/
get defaultDropDownsMaxHeight() {
const gridHeight = this.grid.calcHeight;
return (gridHeight) ? gridHeight * 0.7 + 'px' : '100%';
}
/**
* Returns a reference to the `IgxGridComponent` component, hosting the `IgxGridToolbarComponent`.
* ```typescript
* const grid = this.igxGrid1.toolbar.grid;
* ```
*/
get grid() {
return this.gridAPI.grid;
}
/**
* Returns whether the `IgxGridComponent` renders an export button.
* ```typescript
* const exportButton = this.igxGrid1.toolbar.shouldShowExportButton;
* ```
*/
get shouldShowExportButton() {
return (this.grid != null && (this.grid.exportExcel || this.grid.exportCsv));
}
/**
* Returns whether the `IgxGridComponent` renders an Excel export button.
* ```typescript
* const exportExcelButton = this.igxGrid1.toolbar.shouldShowExportExcelButton;
* ```
*/
get shouldShowExportExcelButton() {
return (this.grid != null && this.grid.exportExcel);
}
/**
* Returns whether the `IgxGridComponent` renders an CSV export button.
* ```typescript
* const exportCSVButton = this.igxGrid1.toolbar.shouldShowExportCsvButton;
* ```
*/
get shouldShowExportCsvButton() {
return (this.grid != null && this.grid.exportCsv);
}
/**
* Returns how many columns are pinned.
* ```typescript
* const pinnedCount = this.igxGrid1.toolbar.pinnedColumnsCount;
* ```
*/
get pinnedColumnsCount() {
return this.grid.pinnedColumns.filter(col => !col.columnLayout).length;
}
/**
* Returns the theme of the `IgxGridToolbarComponent`.
* ```typescript
* const toolbarTheme = this.grid.toolbar.hostClass;
* ```
*/
get hostClass() {
return this.getComponentDensityClass('igx-grid-toolbar');
}
/**
* Returns the title of `IgxGridToolbarComponent`.
* ```typescript
* const toolbarTitle = this.igxGrid1.toolbar.getTitle();
* ```
*/
getTitle() {
return this.grid != null ? this.grid.toolbarTitle : '';
}
/**
* Returns the text of the export button of the `IgxGridToolbarComponent`.
* ```typescript
* const toolbarExportText = this.igxGrid1.toolbar.getTitle();
* ```
*/
getExportText() {
return this.grid != null ? this.grid.exportText : '';
}
/**
* Returns the text of the Excel export button of the `IgxGridToolbarComponent`.
* ```typescript
* const toolbarExcelText = this.igxGrid1.toolbar.getExportExcelText();
* ```
*/
getExportExcelText() {
return this.grid != null ? this.grid.exportExcelText : '';
}
/**
* Returns the text of the CSV export button of the `IgxGridToolbarComponent`.
* ```typescript
* const toolbarCSVText = this.igxGrid1.toolbar.getExportCsvText();
* ```
*/
getExportCsvText() {
return this.grid != null ? this.grid.exportCsvText : '';
}
/**
* Toggles the export button's dropdown menu.
* ```typescript
* this.igxGrid1.toolbar.exportClicked();
* ```
*/
exportClicked() {
this._overlaySettings.positionStrategy.settings.target = this.exportButton.nativeElement;
this._overlaySettings.outlet = this.grid.outletDirective;
this.exportDropdown.toggle(this._overlaySettings);
}
/**
* Exports the grid to excel.
* ```typescript
* this.igxGrid1.toolbar.exportToExcelClicked();
* ```
*/
exportToExcelClicked() {
this.performExport(this.excelExporter, 'excel');
}
/**
* Exports the grid to CSV.
* ```typescript
* this.igxGrid1.toolbar.exportToCsvClicked();
* ```
*/
exportToCsvClicked() {
this.performExport(this.csvExporter, 'csv');
}
performExport(exp, exportType) {
this.exportClicked();
const fileName = 'ExportedData';
const options = exportType === 'excel' ?
new IgxExcelExporterOptions(fileName) :
new IgxCsvExporterOptions(fileName, CsvFileTypes.CSV);
const args = { grid: this.grid, exporter: exp, options: options, cancel: false };
this.grid.onToolbarExporting.emit(args);
if (args.cancel) {
return;
}
exp.export(this.grid, options);
}
/**
* Toggles the Column Hiding UI.
* ```typescript
* this.grid1.toolbar.toggleColumnHidingUI();
* ```
*/
toggleColumnHidingUI() {
this._overlaySettings.positionStrategy.settings.target = this.columnHidingButton.nativeElement;
this._overlaySettings.outlet = this.grid.outletDirective;
this.columnHidingDropdown.toggle(this._overlaySettings);
}
/**
* Toggles the Column Pinning UI.
* ```typescript
* this.grid1.toolbar.toggleColumnPinningUI();
* ```
*/
toggleColumnPinningUI() {
this._overlaySettings.positionStrategy.settings.target = this.columnPinningButton.nativeElement;
this._overlaySettings.outlet = this.grid.outletDirective;
this.columnPinningDropdown.toggle(this._overlaySettings);
}
/**
* @hidden @internal
*/
showAdvancedFilteringUI() {
this.grid.openAdvancedFilteringDialog();
}
/**
* Returns the `context` object which represents the `template context` binding into the
* `toolbar custom container` by providing references to the parent IgxGird and the toolbar itself.
* ```typescript
* const context = this.igxGrid.toolbar.context;
* ```
*/
get context() {
return {
// $implicit: this
grid: this.grid,
toolbar: this
};
}
/** @hidden */
get customContentTemplate() {
if (this.grid != null && this.grid.toolbarCustomContentTemplate != null) {
return this.grid.toolbarCustomContentTemplate.template;
}
else {
return null;
}
}
};
IgxGridToolbarComponent.ctorParameters = () => [
{ type: GridBaseAPIService },
{ type: ChangeDetectorRef },
{ type: IgxExcelExporterService, decorators: [{ type: Optional }] },
{ type: IgxCsvExporterService, decorators: [{ type: Optional }] },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] }
];
__decorate([
HostBinding('class.igx-grid-toolbar'),
Input(),
__metadata("design:type", String)
], IgxGridToolbarComponent.prototype, "gridID", void 0);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxGridToolbarComponent.prototype, "filterColumnsPrompt", null);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [])
], IgxGridToolbarComponent.prototype, "defaultDropDownsMaxHeight", null);
__decorate([
ViewChild('columnHidingDropdown', { read: IgxDropDownComponent }),
__metadata("design:type", IgxDropDownComponent)
], IgxGridToolbarComponent.prototype, "columnHidingDropdown", void 0);
__decorate([
ViewChild(IgxColumnHidingComponent),
__metadata("design:type", IgxColumnHidingComponent)
], IgxGridToolbarComponent.prototype, "columnHidingUI", void 0);
__decorate([
ViewChild('columnHidingButton', { read: IgxButtonDirective }),
__metadata("design:type", IgxButtonDirective)
], IgxGridToolbarComponent.prototype, "columnHidingButton", void 0);
__decorate([
ViewChild('exportDropdown', { read: IgxDropDownComponent }),
__metadata("design:type", IgxDropDownComponent)
], IgxGridToolbarComponent.prototype, "exportDropdown", void 0);
__decorate([
ViewChild('btnExport', { read: IgxButtonDirective }),
__metadata("design:type", IgxButtonDirective)
], IgxGridToolbarComponent.prototype, "exportButton", void 0);
__decorate([
ViewChild('columnPinningDropdown', { read: IgxDropDownComponent }),
__metadata("design:type", IgxDropDownComponent)
], IgxGridToolbarComponent.prototype, "columnPinningDropdown", void 0);
__decorate([
ViewChild(IgxColumnPinningComponent),
__metadata("design:type", IgxColumnPinningComponent)
], IgxGridToolbarComponent.prototype, "columnPinningUI", void 0);
__decorate([
ViewChild('columnPinningButton', { read: IgxButtonDirective }),
__metadata("design:type", IgxButtonDirective)
], IgxGridToolbarComponent.prototype, "columnPinningButton", void 0);
__decorate([
HostBinding('attr.class'),
__metadata("design:type", String),
__metadata("design:paramtypes", [])
], IgxGridToolbarComponent.prototype, "hostClass", null);
IgxGridToolbarComponent = __decorate([
Component({
selector: 'igx-grid-toolbar',
template: "<span class=\"igx-grid-toolbar__title\" *ngIf=\"getTitle()\">\n {{ getTitle() }}\n</span>\n\n<div class=\"igx-grid-toolbar__custom-content\" *ngIf=\"customContentTemplate != null\">\n <ng-container *ngTemplateOutlet=\"customContentTemplate; context: context\">\n </ng-container>\n</div>\n\n<div class=\"igx-grid-toolbar__actions\">\n <div *ngIf=\"grid.allowAdvancedFiltering\">\n <button igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" #advancedFilteringButton name=\"btnAdvancedFiltering\" igxRipple\n (click)=\"showAdvancedFilteringUI()\"\n [ngClass]=\"grid.advancedFilteringExpressionsTree ? 'igx-grid-toolbar__adv-filter--filtered' : 'igx-grid-toolbar__adv-filter'\">\n <div class=\"igx-grid-toolbar__button-space\">\n <igx-icon>\n filter_list\n </igx-icon>\n <span>{{grid.resourceStrings.igx_grid_advanced_filter_title}}</span>\n </div>\n </button>\n </div>\n\n <div *ngIf=\"grid.columnHiding\">\n <button igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" #columnHidingButton name=\"btnColumnHiding\" igxRipple\n (click)=\"toggleColumnHidingUI()\">\n <div class=\"igx-grid-toolbar__button-space\">\n <igx-icon *ngIf=\"grid.hiddenColumnsCount > 0\">visibility_off</igx-icon>\n <igx-icon *ngIf=\"grid.hiddenColumnsCount === 0\">visibility</igx-icon>\n <span>{{ grid.hiddenColumnsCount }}</span>\n <span>{{ grid.hiddenColumnsText }}</span>\n </div>\n </button>\n <igx-drop-down #columnHidingDropdown>\n <igx-column-hiding\n [columns]=\"grid.columns\"\n [title]=\"grid.columnHidingTitle\"\n [filterColumnsPrompt]=\"filterColumnsPrompt\"\n [columnsAreaMaxHeight]=\"defaultDropDownsMaxHeight\"\n (onColumnVisibilityChanged)=\"grid.toggleColumnVisibility($event)\">\n </igx-column-hiding>\n </igx-drop-down>\n </div>\n <div *ngIf=\"grid.columnPinning\">\n <button igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" #columnPinningButton name=\"btnColumnPinning\" igxRipple\n (click)=\"toggleColumnPinningUI()\">\n <div class=\"igx-grid-toolbar__button-space\">\n <igx-icon *ngIf=\"pinnedColumnsCount > 0\">lock</igx-icon>\n <igx-icon *ngIf=\"pinnedColumnsCount === 0\">lock_open</igx-icon>\n <span>{{ pinnedColumnsCount }}</span>\n <span>{{ grid.pinnedColumnsText }}</span>\n <span></span>\n </div>\n </button>\n <igx-drop-down #columnPinningDropdown>\n <igx-column-pinning\n [columns]=\"grid.columns\"\n [title]=\"grid.columnPinningTitle\"\n [filterColumnsPrompt]=\"filterColumnsPrompt\"\n [columnsAreaMaxHeight]=\"defaultDropDownsMaxHeight\"></igx-column-pinning>\n </igx-drop-down>\n </div>\n\n <div class=\"igx-grid-toolbar__dropdown\" *ngIf=\"shouldShowExportButton\" id=\"btnExport\">\n <button igxButton=\"outlined\" [displayDensity]=\"grid.displayDensity\" igxRipple #btnExport\n (click)=\"exportClicked()\">\n <span class=\"igx-grid-toolbar__button-space\">\n <igx-icon fontSet=\"material\">import_export</igx-icon>\n <span>{{ getExportText() }}</span>\n <igx-icon fontSet=\"material\">arrow_drop_down</igx-icon>\n </span>\n </button>\n\n <igx-drop-down #exportDropdown>\n <ul class=\"igx-grid-toolbar__dd-list\">\n <li class=\"igx-grid-toolbar__dd-list-items\" igxRipple *ngIf=\"shouldShowExportExcelButton\" id=\"btnExportExcel\"\n (click)=\"exportToExcelClicked()\">{{ getExportExcelText() }}</li>\n <li class=\"igx-grid-toolbar__dd-list-items\" igxRipple *ngIf=\"shouldShowExportCsvButton\" id=\"btnExportCsv\"\n (click)=\"exportToCsvClicked()\">{{ getExportCsvText() }}</li>\n </ul>\n </igx-drop-down>\n </div>\n</div>\n"
}),
__param(2, Optional()),
__param(3, Optional()),
__param(4, Optional()), __param(4, Inject(DisplayDensityToken)),
__metadata("design:paramtypes", [GridBaseAPIService,
ChangeDetectorRef,
IgxExcelExporterService,
IgxCsvExporterService, Object])
], IgxGridToolbarComponent);
export { IgxGridToolbarComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHMvdG9vbGJhci9ncmlkLXRvb2xiYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsTUFBTSxFQUNOLFdBQVcsRUFDZCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQTBCLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUcsT0FBTyxFQUNILFlBQVksRUFDWixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN6QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hGLE9BQU8sRUFBcUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM3SCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRTs7O0dBR0c7QUFLSCxJQUFhLHVCQUF1QixHQUFwQyxNQUFhLHVCQUF3QixTQUFRLGtCQUFrQjtJQWlMM0QsWUFBbUIsT0FBNEQsRUFDcEUsR0FBc0IsRUFDVixhQUFzQyxFQUN0QyxXQUFrQyxF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QUF3QjsrREFBQztBQVNoRDtJQURDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDOzhCQUNuQyxrQkFBa0I7bUVBQUM7QUFTOUM7SUFEQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQzs4QkFDckMsb0JBQW9COytEQUFDO0FBUzVDO0lBREMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDOzhCQUNoQyxrQkFBa0I7NkRBQUM7QUFTeEM7SUFEQyxTQUFTLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQzs4QkFDckMsb0JBQW9CO3NFQUFDO0FBU25EO0lBREMsU0FBUyxDQUFDLHlCQUF5QixDQUFDOzhCQUNiLHlCQUF5QjtnRUFBQztBQVNsRDtJQURDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDOzhCQUNuQyxrQkFBa0I7b0VBQUM7QUE0RC9DO0lBREMsV0FBVyxDQUFDLFlBQVksQ0FBQzs7O3dEQUd6QjtBQS9LUSx1QkFBdUI7SUFKbkMsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGtCQUFrQjtRQUM1Qix3cUlBQTRDO0tBQy9DLENBQUM7SUFvTE8sV0FBQSxRQUFRLEVBQUUsQ0FBQTtJQUNWLFdBQUEsUUFBUSxFQUFFLENBQUE7SUFDVixXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtxQ0FKaEIsa0JBQWtCO1FBQzlCLGlCQUFpQjtRQUNLLHVCQUF1QjtRQUN6QixxQkFBcUI7R0FwTGhELHVCQUF1QixDQXVWbkM7U0F2VlksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgT3B0aW9uYWwsXG4gICAgVmlld0NoaWxkLFxuICAgIEluamVjdCxcbiAgICBUZW1wbGF0ZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSURpc3BsYXlEZW5zaXR5T3B0aW9ucywgRGlzcGxheURlbnNpdHlUb2tlbiwgRGlzcGxheURlbnNpdHlCYXNlIH0gZnJvbSAnLi4vLi4vY29yZS9kaXNwbGF5RGVuc2l0eSc7XG5pbXBvcnQge1xuICAgIENzdkZpbGVUeXBlcyxcbiAgICBJZ3hCYXNlRXhwb3J0ZXIsXG4gICAgSWd4Q3N2RXhwb3J0ZXJPcHRpb25zLFxuICAgIElneENzdkV4cG9ydGVyU2VydmljZSxcbiAgICBJZ3hFeGNlbEV4cG9ydGVyT3B0aW9ucyxcbiAgICBJZ3hFeGNlbEV4cG9ydGVyU2VydmljZSxcbiAgICBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5XG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2luZGV4JztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IElneEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvYnV0dG9uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9ncmlkLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneERyb3BEb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZHJvcC1kb3duL2Ryb3AtZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4Q29sdW1uSGlkaW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vaGlkaW5nL2NvbHVtbi1oaWRpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IElneENvbHVtblBpbm5pbmdDb21wb25lbnQgfSBmcm9tICcuLi9waW5uaW5nL2NvbHVtbi1waW5uaW5nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPdmVybGF5U2V0dGluZ3MsIFBvc2l0aW9uU2V0dGluZ3MsIEhvcml6b250YWxBbGlnbm1lbnQsIFZlcnRpY2FsQWxpZ25tZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvcG9zaXRpb24nO1xuaW1wb3J0IHsgR3JpZFR5cGUgfSBmcm9tICcuLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBUb29sYmFyJ3MgbG9naWMgYW5kIGlzIGludGVybmFsbHkgdXNlZCBieVxuICogdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCwgYElneFRyZWVHcmlkQ29tcG9uZW50YCBhbmQgYElneEhpZXJhcmNoaWNhbEdyaWRDb21wb25lbnRgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1ncmlkLXRvb2xiYXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncmlkLXRvb2xiYXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneEdyaWRUb29sYmFyQ29tcG9uZW50IGV4dGVuZHMgRGlzcGxheURlbnNpdHlCYXNlIHtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZ3JpZC10b29sYmFyJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBncmlkSUQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRlZmF1bHQgdGV4dCBzaG93biBpbiB0aGUgZmlsdGVyaW5nIGJveC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZmlsdGVyUHJvbXB0ID0gdGhpcy5ncmlkLnRvb2xiYXIuZmlsdGVyQ29sdW1uc1Byb21wdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyQ29sdW1uc1Byb21wdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNvbHVtbnNQcm9tcHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGVmYXVsdCB0ZXh0IHNob3duIGluIHRoZSBmaWx0ZXJpbmcgYm94LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQudG9vbGJhci5maWx0ZXJDb2x1bW5zUHJvbXB0KCdGaWx0ZXIgY29sdW1ucyAuLi4nKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGZpbHRlckNvbHVtbnNQcm9tcHQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9maWx0ZXJDb2x1bW5zUHJvbXB0ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmlsdGVyQ29sdW1uc1Byb21wdCA9ICdGaWx0ZXIgY29sdW1ucyBsaXN0IC4uLic7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoZWlnaHQgZm9yIHRoZSBgSWd4R3JpZFRvb2xiYXJDb21wb25lbnRgJ3MgZHJvcCBkb3duIHBhbmVscy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZHJvcGRvd25IZWlnaHQgPSB0aGlzLmdyaWQudG9vbGJhci5kZWZhdWx0RHJvcERvd25zTWF4SGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRlZmF1bHREcm9wRG93bnNNYXhIZWlnaHQoKSB7XG4gICAgICAgIGNvbnN0IGdyaWRIZWlnaHQgPSB0aGlzLmdyaWQuY2FsY0hlaWdodDtcbiAgICAgICAgcmV0dXJuIChncmlkSGVpZ2h0KSA/IGdyaWRIZWlnaHQgKiAwLjcgKyAncHgnIDogJzEwMCUnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4RHJvcERvd25Db21wb25lbnRgIG9mIHRoZSBDb2x1bW4gSGlkaW5nIFVJLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBkcm9wZG93bkhpZGluZyA9IHRoaXMuZ3JpZC50b29sYmFyLmNvbHVtbkhpZGluZ0Ryb3Bkb3duO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkhpZGluZ0Ryb3Bkb3duJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBjb2x1bW5IaWRpbmdEcm9wZG93bjogSWd4RHJvcERvd25Db21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgYElneENvbHVtbkhpZGluZ0NvbXBvbmVudGAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGhpZGluZ1VJID0gdGhpcy5ncmlkLnRvb2xiYXIuY29sdW1uSGlkaW5nVUk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hDb2x1bW5IaWRpbmdDb21wb25lbnQpXG4gICAgcHVibGljIGNvbHVtbkhpZGluZ1VJOiBJZ3hDb2x1bW5IaWRpbmdDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgQ29sdW1uIEhpZGluZyBidXR0b24uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGhpZGluZ0J1dHRvbiA9IHRoaXMuZ3JpZC50b29sYmFyLmNvbHVtbkhpZGluZ0J1dHRvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdjb2x1bW5IaWRpbmdCdXR0b24nLCB7IHJlYWQ6IElneEJ1dHRvbkRpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyBjb2x1bW5IaWRpbmdCdXR0b246IElneEJ1dHRvbkRpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSBgSWd4RHJvcERvd25Db21wb25lbnRgIG9mIHRoZSBFeHBvcnQgYnV0dG9uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBvcnREcm9wZG93biA9IHRoaXMuZ3JpZC50b29sYmFyLmV4cG9ydERyb3Bkb3duO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2V4cG9ydERyb3Bkb3duJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBleHBvcnREcm9wZG93bjogSWd4RHJvcERvd25Db21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgRXhwb3J0IGJ1dHRvbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZXhwb3J0QnRuID0gdGhpcy5ncmlkLnRvb2xiYXIuZXhwb3J0QnV0dG9uO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2J0bkV4cG9ydCcsIHsgcmVhZDogSWd4QnV0dG9uRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIGV4cG9ydEJ1dHRvbjogSWd4QnV0dG9uRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gdGhlIGBJZ3hEcm9wRG93bkNvbXBvbmVudGAgb2YgdGhlIENvbHVtbiBQaW5uaW5nIFVJLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBkcm9wZG93blBpbm5pbmcgPSB0aGlzLmdyaWQudG9vbGJhci5jb2x1bW5QaW5uaW5nRHJvcGRvd247XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnY29sdW1uUGlubmluZ0Ryb3Bkb3duJywgeyByZWFkOiBJZ3hEcm9wRG93bkNvbXBvbmVudCB9KVxuICAgIHB1YmxpYyBjb2x1bW5QaW5uaW5nRHJvcGRvd246IElneERyb3BEb3duQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gdGhlIGBJZ3hDb2x1bW5QaW5uaW5nQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmluZ1VJID0gdGhpcy5ncmlkLnRvb2xiYXIuY29sdW1uUGlubmluZ0Ryb3Bkb3duO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoSWd4Q29sdW1uUGlubmluZ0NvbXBvbmVudClcbiAgICBwdWJsaWMgY29sdW1uUGlubmluZ1VJOiBJZ3hDb2x1bW5QaW5uaW5nQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gdGhlIENvbHVtbiBQaW5uaW5nIGJ1dHRvbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmluZ0J1dHRvbiA9IHRoaXMuZ3JpZC50b29sYmFyLmNvbHVtblBpbm5pbmdCdXR0b247XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnY29sdW1uUGlubmluZ0J1dHRvbicsIHsgcmVhZDogSWd4QnV0dG9uRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIGNvbHVtblBpbm5pbmdCdXR0b246IElneEJ1dHRvbkRpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCBjb21wb25lbnQsIGhvc3RpbmcgdGhlIGBJZ3hHcmlkVG9vbGJhckNvbXBvbmVudGAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGdyaWQgPSB0aGlzLmlneEdyaWQxLnRvb2xiYXIuZ3JpZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGdyaWQoKTogSWd4R3JpZEJhc2VEaXJlY3RpdmUge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkQVBJLmdyaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgcmVuZGVycyBhbiBleHBvcnQgYnV0dG9uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBvcnRCdXR0b24gPSB0aGlzLmlneEdyaWQxLnRvb2xiYXIuc2hvdWxkU2hvd0V4cG9ydEJ1dHRvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3VsZFNob3dFeHBvcnRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5ncmlkICE9IG51bGwgJiYgKHRoaXMuZ3JpZC5leHBvcnRFeGNlbCB8fCB0aGlzLmdyaWQuZXhwb3J0Q3N2KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgcmVuZGVycyBhbiBFeGNlbCBleHBvcnQgYnV0dG9uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBvcnRFeGNlbEJ1dHRvbiA9IHRoaXMuaWd4R3JpZDEudG9vbGJhci5zaG91bGRTaG93RXhwb3J0RXhjZWxCdXR0b247XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG91bGRTaG93RXhwb3J0RXhjZWxCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5ncmlkICE9IG51bGwgJiYgdGhpcy5ncmlkLmV4cG9ydEV4Y2VsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGBJZ3hHcmlkQ29tcG9uZW50YCByZW5kZXJzIGFuIENTViBleHBvcnQgYnV0dG9uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBleHBvcnRDU1ZCdXR0b24gPSB0aGlzLmlneEdyaWQxLnRvb2xiYXIuc2hvdWxkU2hvd0V4cG9ydENzdkJ1dHRvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3VsZFNob3dFeHBvcnRDc3ZCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5ncmlkICE9IG51bGwgJiYgdGhpcy5ncmlkLmV4cG9ydENzdik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBob3cgbWFueSBjb2x1bW5zIGFyZSBwaW5uZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHBpbm5lZENvdW50ID0gdGhpcy5pZ3hHcmlkMS50b29sYmFyLnBpbm5lZENvbHVtbnNDb3VudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZENvbHVtbnNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5MYXlvdXQpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0aGVtZSBvZiB0aGUgYElneEdyaWRUb29sYmFyQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgdG9vbGJhclRoZW1lID0gdGhpcy5ncmlkLnRvb2xiYXIuaG9zdENsYXNzO1xuICAgICAqIGBgYFxuICAgICAqL1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmNsYXNzJylcbiAgICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudERlbnNpdHlDbGFzcygnaWd4LWdyaWQtdG9vbGJhcicpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4sXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgZXhjZWxFeHBvcnRlcjogSWd4RXhjZWxFeHBvcnRlclNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBjc3ZFeHBvcnRlcjogSWd4Q3N2RXhwb3J0ZXJTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERpc3BsYXlEZW5zaXR5VG9rZW4pIHByb3RlY3RlZCBfZGlzcGxheURlbnNpdHlPcHRpb25zOiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wb3NpdGlvblNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzID0ge1xuICAgICAgICBob3Jpem9udGFsRGlyZWN0aW9uOiBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQsXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LlJpZ2h0LFxuICAgICAgICB2ZXJ0aWNhbERpcmVjdGlvbjogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbVxuICAgIH07XG5cbiAgICBwcml2YXRlIF9vdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fcG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSgpLFxuICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgIGV4Y2x1ZGVQb3NpdGlvblRhcmdldDogdHJ1ZVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0aXRsZSBvZiBgSWd4R3JpZFRvb2xiYXJDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b29sYmFyVGl0bGUgPSB0aGlzLmlneEdyaWQxLnRvb2xiYXIuZ2V0VGl0bGUoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZCAhPSBudWxsID8gdGhpcy5ncmlkLnRvb2xiYXJUaXRsZSA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGV4cG9ydCBidXR0b24gb2YgdGhlIGBJZ3hHcmlkVG9vbGJhckNvbXBvbmVudGAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHRvb2xiYXJFeHBvcnRUZXh0ID0gdGhpcy5pZ3hHcmlkMS50b29sYmFyLmdldFRpdGxlKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldEV4cG9ydFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZCAhPSBudWxsID8gdGhpcy5ncmlkLmV4cG9ydFRleHQgOiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBFeGNlbCBleHBvcnQgYnV0dG9uIG9mIHRoZSBgSWd4R3JpZFRvb2xiYXJDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b29sYmFyRXhjZWxUZXh0ID0gdGhpcy5pZ3hHcmlkMS50b29sYmFyLmdldEV4cG9ydEV4Y2VsVGV4dCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFeHBvcnRFeGNlbFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZCAhPSBudWxsID8gdGhpcy5ncmlkLmV4cG9ydEV4Y2VsVGV4dCA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIENTViBleHBvcnQgYnV0dG9uIG9mIHRoZSBgSWd4R3JpZFRvb2xiYXJDb21wb25lbnRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b29sYmFyQ1NWVGV4dCA9IHRoaXMuaWd4R3JpZDEudG9vbGJhci5nZXRFeHBvcnRDc3ZUZXh0KCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldEV4cG9ydENzdlRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZCAhPSBudWxsID8gdGhpcy5ncmlkLmV4cG9ydENzdlRleHQgOiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBleHBvcnQgYnV0dG9uJ3MgZHJvcGRvd24gbWVudS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hHcmlkMS50b29sYmFyLmV4cG9ydENsaWNrZWQoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwb3J0Q2xpY2tlZCgpIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5leHBvcnRCdXR0b24ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMuZ3JpZC5vdXRsZXREaXJlY3RpdmU7XG4gICAgICAgIHRoaXMuZXhwb3J0RHJvcGRvd24udG9nZ2xlKHRoaXMuX292ZXJsYXlTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhwb3J0cyB0aGUgZ3JpZCB0byBleGNlbC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hHcmlkMS50b29sYmFyLmV4cG9ydFRvRXhjZWxDbGlja2VkKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGV4cG9ydFRvRXhjZWxDbGlja2VkKCkge1xuICAgICAgICB0aGlzLnBlcmZvcm1FeHBvcnQodGhpcy5leGNlbEV4cG9ydGVyLCAnZXhjZWwnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBvcnRzIHRoZSBncmlkIHRvIENTVi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hHcmlkMS50b29sYmFyLmV4cG9ydFRvQ3N2Q2xpY2tlZCgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBleHBvcnRUb0NzdkNsaWNrZWQoKSB7XG4gICAgICAgIHRoaXMucGVyZm9ybUV4cG9ydCh0aGlzLmNzdkV4cG9ydGVyLCAnY3N2Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwZXJmb3JtRXhwb3J0KGV4cDogSWd4QmFzZUV4cG9ydGVyLCBleHBvcnRUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5leHBvcnRDbGlja2VkKCk7XG5cbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSAnRXhwb3J0ZWREYXRhJztcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGV4cG9ydFR5cGUgPT09ICdleGNlbCcgP1xuICAgICAgICAgICAgbmV3IElneEV4Y2VsRXhwb3J0ZXJPcHRpb25zKGZpbGVOYW1lKSA6XG4gICAgICAgICAgICBuZXcgSWd4Q3N2RXhwb3J0ZXJPcHRpb25zKGZpbGVOYW1lLCBDc3ZGaWxlVHlwZXMuQ1NWKTtcblxuICAgICAgICBjb25zdCBhcmdzID0geyBncmlkOiB0aGlzLmdyaWQsIGV4cG9ydGVyOiBleHAsIG9wdGlvbnM6IG9wdGlvbnMsIGNhbmNlbDogZmFsc2UgfTtcblxuICAgICAgICB0aGlzLmdyaWQub25Ub29sYmFyRXhwb3J0aW5nLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV4cC5leHBvcnQodGhpcy5ncmlkLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBDb2x1bW4gSGlkaW5nIFVJLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnRvb2xiYXIudG9nZ2xlQ29sdW1uSGlkaW5nVUkoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQ29sdW1uSGlkaW5nVUkoKSB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy5wb3NpdGlvblN0cmF0ZWd5LnNldHRpbmdzLnRhcmdldCA9IHRoaXMuY29sdW1uSGlkaW5nQnV0dG9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLmdyaWQub3V0bGV0RGlyZWN0aXZlO1xuICAgICAgICB0aGlzLmNvbHVtbkhpZGluZ0Ryb3Bkb3duLnRvZ2dsZSh0aGlzLl9vdmVybGF5U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIENvbHVtbiBQaW5uaW5nIFVJLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQxLnRvb2xiYXIudG9nZ2xlQ29sdW1uUGlubmluZ1VJKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZUNvbHVtblBpbm5pbmdVSSgpIHtcbiAgICAgICAgdGhpcy5fb3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3MudGFyZ2V0ID0gdGhpcy5jb2x1bW5QaW5uaW5nQnV0dG9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLmdyaWQub3V0bGV0RGlyZWN0aXZlO1xuICAgICAgICB0aGlzLmNvbHVtblBpbm5pbmdEcm9wZG93bi50b2dnbGUodGhpcy5fb3ZlcmxheVNldHRpbmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93QWR2YW5jZWRGaWx0ZXJpbmdVSSgpIHtcbiAgICAgICAgdGhpcy5ncmlkLm9wZW5BZHZhbmNlZEZpbHRlcmluZ0RpYWxvZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBjb250ZXh0YCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgYHRlbXBsYXRlIGNvbnRleHRgIGJpbmRpbmcgaW50byB0aGVcbiAgICAgKiBgdG9vbGJhciBjdXN0b20gY29udGFpbmVyYCBieSBwcm92aWRpbmcgcmVmZXJlbmNlcyB0byB0aGUgcGFyZW50IElneEdpcmQgYW5kIHRoZSB0b29sYmFyIGl0c2VsZi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29udGV4dCA9ICB0aGlzLmlneEdyaWQudG9vbGJhci5jb250ZXh0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29udGV4dCgpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLy8gJGltcGxpY2l0OiB0aGlzXG4gICAgICAgICAgICBncmlkOiB0aGlzLmdyaWQsXG4gICAgICAgICAgICB0b29sYmFyOiB0aGlzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwdWJsaWMgZ2V0IGN1c3RvbUNvbnRlbnRUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZCAhPSBudWxsICYmIHRoaXMuZ3JpZC50b29sYmFyQ3VzdG9tQ29udGVudFRlbXBsYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQudG9vbGJhckN1c3RvbUNvbnRlbnRUZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19