devextreme-angular
Version:
Angular UI and visualization components based on DevExtreme widgets
710 lines (677 loc) • 83.2 kB
JavaScript
/*!
* devextreme-angular
* Version: 22.1.14
* Build date: Mon Apr 29 2024
*
* Copyright (c) 2012 - 2024 Developer Express Inc. ALL RIGHTS RESERVED
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file in the root of the project for details.
*
* https://github.com/DevExpress/devextreme-angular
*/
/* tslint:disable:max-line-length */
import { BrowserTransferStateModule } from '@angular/platform-browser';
import { Component, NgModule, PLATFORM_ID, Inject, Input, Output } from '@angular/core';
import DxPivotGrid from 'devextreme/ui/pivot_grid';
import { DxComponent, DxTemplateHost, DxIntegrationModule, DxTemplateModule, NestedOptionHost, IterableDifferHelper, WatcherHelper } from 'devextreme-angular/core';
import { DxoDataSourceModule } from 'devextreme-angular/ui/nested';
import { DxiFieldModule } from 'devextreme-angular/ui/nested';
import { DxoFormatModule } from 'devextreme-angular/ui/nested';
import { DxoHeaderFilterModule } from 'devextreme-angular/ui/nested';
import { DxoStoreModule } from 'devextreme-angular/ui/nested';
import { DxoExportModule } from 'devextreme-angular/ui/nested';
import { DxoFieldChooserModule } from 'devextreme-angular/ui/nested';
import { DxoTextsModule } from 'devextreme-angular/ui/nested';
import { DxoFieldPanelModule } from 'devextreme-angular/ui/nested';
import { DxoLoadPanelModule } from 'devextreme-angular/ui/nested';
import { DxoScrollingModule } from 'devextreme-angular/ui/nested';
import { DxoStateStoringModule } from 'devextreme-angular/ui/nested';
import * as i0 from "@angular/core";
import * as i1 from "devextreme-angular/core";
import * as i2 from "@angular/platform-browser";
/**
* The PivotGrid is a UI component that allows you to display and analyze multi-dimensional data from a local storage or an OLAP cube.
*/
export class DxPivotGridComponent extends DxComponent {
constructor(elementRef, ngZone, templateHost, _watcherHelper, _idh, optionHost, transferState, platformId) {
super(elementRef, ngZone, templateHost, _watcherHelper, transferState, platformId);
this._watcherHelper = _watcherHelper;
this._idh = _idh;
this._createEventEmitters([
{ subscribe: 'cellClick', emit: 'onCellClick' },
{ subscribe: 'cellPrepared', emit: 'onCellPrepared' },
{ subscribe: 'contentReady', emit: 'onContentReady' },
{ subscribe: 'contextMenuPreparing', emit: 'onContextMenuPreparing' },
{ subscribe: 'disposing', emit: 'onDisposing' },
{ subscribe: 'exported', emit: 'onExported' },
{ subscribe: 'exporting', emit: 'onExporting' },
{ subscribe: 'fileSaving', emit: 'onFileSaving' },
{ subscribe: 'initialized', emit: 'onInitialized' },
{ subscribe: 'optionChanged', emit: 'onOptionChanged' },
{ emit: 'allowExpandAllChange' },
{ emit: 'allowFilteringChange' },
{ emit: 'allowSortingChange' },
{ emit: 'allowSortingBySummaryChange' },
{ emit: 'dataFieldAreaChange' },
{ emit: 'dataSourceChange' },
{ emit: 'disabledChange' },
{ emit: 'elementAttrChange' },
{ emit: 'encodeHtmlChange' },
{ emit: 'exportChange' },
{ emit: 'fieldChooserChange' },
{ emit: 'fieldPanelChange' },
{ emit: 'headerFilterChange' },
{ emit: 'heightChange' },
{ emit: 'hideEmptySummaryCellsChange' },
{ emit: 'hintChange' },
{ emit: 'loadPanelChange' },
{ emit: 'rowHeaderLayoutChange' },
{ emit: 'rtlEnabledChange' },
{ emit: 'scrollingChange' },
{ emit: 'showBordersChange' },
{ emit: 'showColumnGrandTotalsChange' },
{ emit: 'showColumnTotalsChange' },
{ emit: 'showRowGrandTotalsChange' },
{ emit: 'showRowTotalsChange' },
{ emit: 'showTotalsPriorChange' },
{ emit: 'stateStoringChange' },
{ emit: 'tabIndexChange' },
{ emit: 'textsChange' },
{ emit: 'visibleChange' },
{ emit: 'widthChange' },
{ emit: 'wordWrapEnabledChange' }
]);
this._idh.setHost(this);
optionHost.setHost(this);
}
/**
* Allows users to expand/collapse all header items within the same header level. Ignored if the PivotGridDataSource's paginate property is true.
*/
get allowExpandAll() {
return this._getOption('allowExpandAll');
}
set allowExpandAll(value) {
this._setOption('allowExpandAll', value);
}
/**
* Allows a user to filter fields by selecting or deselecting values in the popup menu.
*/
get allowFiltering() {
return this._getOption('allowFiltering');
}
set allowFiltering(value) {
this._setOption('allowFiltering', value);
}
/**
* Allows an end user to change sorting properties.
*/
get allowSorting() {
return this._getOption('allowSorting');
}
set allowSorting(value) {
this._setOption('allowSorting', value);
}
/**
* Allows users to sort the pivot grid by summary values instead of field values. Ignored if the PivotGridDataSource's paginate property is true.
*/
get allowSortingBySummary() {
return this._getOption('allowSortingBySummary');
}
set allowSortingBySummary(value) {
this._setOption('allowSortingBySummary', value);
}
/**
* Specifies the area to which data field headers must belong.
*/
get dataFieldArea() {
return this._getOption('dataFieldArea');
}
set dataFieldArea(value) {
this._setOption('dataFieldArea', value);
}
/**
* Binds the UI component to data.
*/
get dataSource() {
return this._getOption('dataSource');
}
set dataSource(value) {
this._setOption('dataSource', value);
}
/**
* Specifies whether the UI component responds to user interaction.
*/
get disabled() {
return this._getOption('disabled');
}
set disabled(value) {
this._setOption('disabled', value);
}
/**
* Specifies the global attributes to be attached to the UI component's container element.
*/
get elementAttr() {
return this._getOption('elementAttr');
}
set elementAttr(value) {
this._setOption('elementAttr', value);
}
/**
* Specifies whether HTML tags are displayed as plain text or applied to cell values.
*/
get encodeHtml() {
return this._getOption('encodeHtml');
}
set encodeHtml(value) {
this._setOption('encodeHtml', value);
}
/**
* Configures client-side exporting.
*/
get export() {
return this._getOption('export');
}
set export(value) {
this._setOption('export', value);
}
/**
* The Field Chooser configuration properties.
*/
get fieldChooser() {
return this._getOption('fieldChooser');
}
set fieldChooser(value) {
this._setOption('fieldChooser', value);
}
/**
* Configures the field panel.
*/
get fieldPanel() {
return this._getOption('fieldPanel');
}
set fieldPanel(value) {
this._setOption('fieldPanel', value);
}
/**
* Configures the header filter feature.
*/
get headerFilter() {
return this._getOption('headerFilter');
}
set headerFilter(value) {
this._setOption('headerFilter', value);
}
/**
* Specifies the UI component's height.
*/
get height() {
return this._getOption('height');
}
set height(value) {
this._setOption('height', value);
}
/**
* Specifies whether or not to hide rows and columns with no data.
*/
get hideEmptySummaryCells() {
return this._getOption('hideEmptySummaryCells');
}
set hideEmptySummaryCells(value) {
this._setOption('hideEmptySummaryCells', value);
}
/**
* Specifies text for a hint that appears when a user pauses on the UI component.
*/
get hint() {
return this._getOption('hint');
}
set hint(value) {
this._setOption('hint', value);
}
/**
* Specifies properties configuring the load panel.
*/
get loadPanel() {
return this._getOption('loadPanel');
}
set loadPanel(value) {
this._setOption('loadPanel', value);
}
/**
* Specifies the layout of items in the row header.
*/
get rowHeaderLayout() {
return this._getOption('rowHeaderLayout');
}
set rowHeaderLayout(value) {
this._setOption('rowHeaderLayout', value);
}
/**
* Switches the UI component to a right-to-left representation.
*/
get rtlEnabled() {
return this._getOption('rtlEnabled');
}
set rtlEnabled(value) {
this._setOption('rtlEnabled', value);
}
/**
* A configuration object specifying scrolling properties.
*/
get scrolling() {
return this._getOption('scrolling');
}
set scrolling(value) {
this._setOption('scrolling', value);
}
/**
* Specifies whether the outer borders of the grid are visible or not.
*/
get showBorders() {
return this._getOption('showBorders');
}
set showBorders(value) {
this._setOption('showBorders', value);
}
/**
* Specifies whether to display the Grand Total column.
*/
get showColumnGrandTotals() {
return this._getOption('showColumnGrandTotals');
}
set showColumnGrandTotals(value) {
this._setOption('showColumnGrandTotals', value);
}
/**
* Specifies whether to display the Total columns.
*/
get showColumnTotals() {
return this._getOption('showColumnTotals');
}
set showColumnTotals(value) {
this._setOption('showColumnTotals', value);
}
/**
* Specifies whether to display the Grand Total row.
*/
get showRowGrandTotals() {
return this._getOption('showRowGrandTotals');
}
set showRowGrandTotals(value) {
this._setOption('showRowGrandTotals', value);
}
/**
* Specifies whether to display the Total rows. Applies only if rowHeaderLayout is 'standard'.
*/
get showRowTotals() {
return this._getOption('showRowTotals');
}
set showRowTotals(value) {
this._setOption('showRowTotals', value);
}
/**
* Specifies where to show the total rows or columns.
*/
get showTotalsPrior() {
return this._getOption('showTotalsPrior');
}
set showTotalsPrior(value) {
this._setOption('showTotalsPrior', value);
}
/**
* A configuration object specifying properties related to state storing.
*/
get stateStoring() {
return this._getOption('stateStoring');
}
set stateStoring(value) {
this._setOption('stateStoring', value);
}
/**
* Specifies the number of the element when the Tab key is used for navigating.
*/
get tabIndex() {
return this._getOption('tabIndex');
}
set tabIndex(value) {
this._setOption('tabIndex', value);
}
/**
* Strings that can be changed or localized in the PivotGrid UI component.
*/
get texts() {
return this._getOption('texts');
}
set texts(value) {
this._setOption('texts', value);
}
/**
* Specifies whether the UI component is visible.
*/
get visible() {
return this._getOption('visible');
}
set visible(value) {
this._setOption('visible', value);
}
/**
* Specifies the UI component's width.
*/
get width() {
return this._getOption('width');
}
set width(value) {
this._setOption('width', value);
}
/**
* Specifies whether long text in header items should be wrapped.
*/
get wordWrapEnabled() {
return this._getOption('wordWrapEnabled');
}
set wordWrapEnabled(value) {
this._setOption('wordWrapEnabled', value);
}
_createInstance(element, options) {
return new DxPivotGrid(element, options);
}
ngOnDestroy() {
this._destroyWidget();
}
ngOnChanges(changes) {
super.ngOnChanges(changes);
this.setupChanges('dataSource', changes);
}
setupChanges(prop, changes) {
if (!(prop in this._optionsToUpdate)) {
this._idh.setup(prop, changes);
}
}
ngDoCheck() {
this._idh.doCheck('dataSource');
this._watcherHelper.checkWatchers();
super.ngDoCheck();
super.clearChangedOptions();
}
_setOption(name, value) {
let isSetup = this._idh.setupSingle(name, value);
let isChanged = this._idh.getChanges(name, value) !== null;
if (isSetup || isChanged) {
super._setOption(name, value);
}
}
}
/** @nocollapse */ DxPivotGridComponent.ɵfac = function DxPivotGridComponent_Factory(t) { return new (t || DxPivotGridComponent)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i1.DxTemplateHost), i0.ɵɵdirectiveInject(i1.WatcherHelper), i0.ɵɵdirectiveInject(i1.IterableDifferHelper), i0.ɵɵdirectiveInject(i1.NestedOptionHost), i0.ɵɵdirectiveInject(i2.TransferState), i0.ɵɵdirectiveInject(PLATFORM_ID)); };
/** @nocollapse */ DxPivotGridComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DxPivotGridComponent, selectors: [["dx-pivot-grid"]], inputs: { allowExpandAll: "allowExpandAll", allowFiltering: "allowFiltering", allowSorting: "allowSorting", allowSortingBySummary: "allowSortingBySummary", dataFieldArea: "dataFieldArea", dataSource: "dataSource", disabled: "disabled", elementAttr: "elementAttr", encodeHtml: "encodeHtml", export: "export", fieldChooser: "fieldChooser", fieldPanel: "fieldPanel", headerFilter: "headerFilter", height: "height", hideEmptySummaryCells: "hideEmptySummaryCells", hint: "hint", loadPanel: "loadPanel", rowHeaderLayout: "rowHeaderLayout", rtlEnabled: "rtlEnabled", scrolling: "scrolling", showBorders: "showBorders", showColumnGrandTotals: "showColumnGrandTotals", showColumnTotals: "showColumnTotals", showRowGrandTotals: "showRowGrandTotals", showRowTotals: "showRowTotals", showTotalsPrior: "showTotalsPrior", stateStoring: "stateStoring", tabIndex: "tabIndex", texts: "texts", visible: "visible", width: "width", wordWrapEnabled: "wordWrapEnabled" }, outputs: { onCellClick: "onCellClick", onCellPrepared: "onCellPrepared", onContentReady: "onContentReady", onContextMenuPreparing: "onContextMenuPreparing", onDisposing: "onDisposing", onExported: "onExported", onExporting: "onExporting", onFileSaving: "onFileSaving", onInitialized: "onInitialized", onOptionChanged: "onOptionChanged", allowExpandAllChange: "allowExpandAllChange", allowFilteringChange: "allowFilteringChange", allowSortingChange: "allowSortingChange", allowSortingBySummaryChange: "allowSortingBySummaryChange", dataFieldAreaChange: "dataFieldAreaChange", dataSourceChange: "dataSourceChange", disabledChange: "disabledChange", elementAttrChange: "elementAttrChange", encodeHtmlChange: "encodeHtmlChange", exportChange: "exportChange", fieldChooserChange: "fieldChooserChange", fieldPanelChange: "fieldPanelChange", headerFilterChange: "headerFilterChange", heightChange: "heightChange", hideEmptySummaryCellsChange: "hideEmptySummaryCellsChange", hintChange: "hintChange", loadPanelChange: "loadPanelChange", rowHeaderLayoutChange: "rowHeaderLayoutChange", rtlEnabledChange: "rtlEnabledChange", scrollingChange: "scrollingChange", showBordersChange: "showBordersChange", showColumnGrandTotalsChange: "showColumnGrandTotalsChange", showColumnTotalsChange: "showColumnTotalsChange", showRowGrandTotalsChange: "showRowGrandTotalsChange", showRowTotalsChange: "showRowTotalsChange", showTotalsPriorChange: "showTotalsPriorChange", stateStoringChange: "stateStoringChange", tabIndexChange: "tabIndexChange", textsChange: "textsChange", visibleChange: "visibleChange", widthChange: "widthChange", wordWrapEnabledChange: "wordWrapEnabledChange" }, features: [i0.ɵɵProvidersFeature([
DxTemplateHost,
WatcherHelper,
NestedOptionHost,
IterableDifferHelper
]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 0, vars: 0, template: function DxPivotGridComponent_Template(rf, ctx) { }, encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DxPivotGridComponent, [{
type: Component,
args: [{
selector: 'dx-pivot-grid',
template: '',
providers: [
DxTemplateHost,
WatcherHelper,
NestedOptionHost,
IterableDifferHelper
]
}]
}], function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i1.DxTemplateHost }, { type: i1.WatcherHelper }, { type: i1.IterableDifferHelper }, { type: i1.NestedOptionHost }, { type: i2.TransferState }, { type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }]; }, { allowExpandAll: [{
type: Input
}], allowFiltering: [{
type: Input
}], allowSorting: [{
type: Input
}], allowSortingBySummary: [{
type: Input
}], dataFieldArea: [{
type: Input
}], dataSource: [{
type: Input
}], disabled: [{
type: Input
}], elementAttr: [{
type: Input
}], encodeHtml: [{
type: Input
}], export: [{
type: Input
}], fieldChooser: [{
type: Input
}], fieldPanel: [{
type: Input
}], headerFilter: [{
type: Input
}], height: [{
type: Input
}], hideEmptySummaryCells: [{
type: Input
}], hint: [{
type: Input
}], loadPanel: [{
type: Input
}], rowHeaderLayout: [{
type: Input
}], rtlEnabled: [{
type: Input
}], scrolling: [{
type: Input
}], showBorders: [{
type: Input
}], showColumnGrandTotals: [{
type: Input
}], showColumnTotals: [{
type: Input
}], showRowGrandTotals: [{
type: Input
}], showRowTotals: [{
type: Input
}], showTotalsPrior: [{
type: Input
}], stateStoring: [{
type: Input
}], tabIndex: [{
type: Input
}], texts: [{
type: Input
}], visible: [{
type: Input
}], width: [{
type: Input
}], wordWrapEnabled: [{
type: Input
}], onCellClick: [{
type: Output
}], onCellPrepared: [{
type: Output
}], onContentReady: [{
type: Output
}], onContextMenuPreparing: [{
type: Output
}], onDisposing: [{
type: Output
}], onExported: [{
type: Output
}], onExporting: [{
type: Output
}], onFileSaving: [{
type: Output
}], onInitialized: [{
type: Output
}], onOptionChanged: [{
type: Output
}], allowExpandAllChange: [{
type: Output
}], allowFilteringChange: [{
type: Output
}], allowSortingChange: [{
type: Output
}], allowSortingBySummaryChange: [{
type: Output
}], dataFieldAreaChange: [{
type: Output
}], dataSourceChange: [{
type: Output
}], disabledChange: [{
type: Output
}], elementAttrChange: [{
type: Output
}], encodeHtmlChange: [{
type: Output
}], exportChange: [{
type: Output
}], fieldChooserChange: [{
type: Output
}], fieldPanelChange: [{
type: Output
}], headerFilterChange: [{
type: Output
}], heightChange: [{
type: Output
}], hideEmptySummaryCellsChange: [{
type: Output
}], hintChange: [{
type: Output
}], loadPanelChange: [{
type: Output
}], rowHeaderLayoutChange: [{
type: Output
}], rtlEnabledChange: [{
type: Output
}], scrollingChange: [{
type: Output
}], showBordersChange: [{
type: Output
}], showColumnGrandTotalsChange: [{
type: Output
}], showColumnTotalsChange: [{
type: Output
}], showRowGrandTotalsChange: [{
type: Output
}], showRowTotalsChange: [{
type: Output
}], showTotalsPriorChange: [{
type: Output
}], stateStoringChange: [{
type: Output
}], tabIndexChange: [{
type: Output
}], textsChange: [{
type: Output
}], visibleChange: [{
type: Output
}], widthChange: [{
type: Output
}], wordWrapEnabledChange: [{
type: Output
}] }); })();
export class DxPivotGridModule {
}
/** @nocollapse */ DxPivotGridModule.ɵfac = function DxPivotGridModule_Factory(t) { return new (t || DxPivotGridModule)(); };
/** @nocollapse */ DxPivotGridModule.ɵmod = /** @pureOrBreakMyCode */ i0.ɵɵdefineNgModule({ type: DxPivotGridModule });
/** @nocollapse */ DxPivotGridModule.ɵinj = /** @pureOrBreakMyCode */ i0.ɵɵdefineInjector({ imports: [[
DxoDataSourceModule,
DxiFieldModule,
DxoFormatModule,
DxoHeaderFilterModule,
DxoStoreModule,
DxoExportModule,
DxoFieldChooserModule,
DxoTextsModule,
DxoFieldPanelModule,
DxoLoadPanelModule,
DxoScrollingModule,
DxoStateStoringModule,
DxIntegrationModule,
DxTemplateModule,
BrowserTransferStateModule
], DxoDataSourceModule,
DxiFieldModule,
DxoFormatModule,
DxoHeaderFilterModule,
DxoStoreModule,
DxoExportModule,
DxoFieldChooserModule,
DxoTextsModule,
DxoFieldPanelModule,
DxoLoadPanelModule,
DxoScrollingModule,
DxoStateStoringModule,
DxTemplateModule] });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DxPivotGridModule, [{
type: NgModule,
args: [{
imports: [
DxoDataSourceModule,
DxiFieldModule,
DxoFormatModule,
DxoHeaderFilterModule,
DxoStoreModule,
DxoExportModule,
DxoFieldChooserModule,
DxoTextsModule,
DxoFieldPanelModule,
DxoLoadPanelModule,
DxoScrollingModule,
DxoStateStoringModule,
DxIntegrationModule,
DxTemplateModule,
BrowserTransferStateModule
],
declarations: [
DxPivotGridComponent
],
exports: [
DxPivotGridComponent,
DxoDataSourceModule,
DxiFieldModule,
DxoFormatModule,
DxoHeaderFilterModule,
DxoStoreModule,
DxoExportModule,
DxoFieldChooserModule,
DxoTextsModule,
DxoFieldPanelModule,
DxoLoadPanelModule,
DxoScrollingModule,
DxoStateStoringModule,
DxTemplateModule
]
}]
}], null, null); })();
(function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(DxPivotGridModule, { declarations: [DxPivotGridComponent], imports: [DxoDataSourceModule,
DxiFieldModule,
DxoFormatModule,
DxoHeaderFilterModule,
DxoStoreModule,
DxoExportModule,
DxoFieldChooserModule,
DxoTextsModule,
DxoFieldPanelModule,
DxoLoadPanelModule,
DxoScrollingModule,
DxoStateStoringModule,
DxIntegrationModule,
DxTemplateModule,
BrowserTransferStateModule], exports: [DxPivotGridComponent, DxoDataSourceModule,
DxiFieldModule,
DxoFormatModule,
DxoHeaderFilterModule,
DxoStoreModule,
DxoExportModule,
DxoFieldChooserModule,
DxoTextsModule,
DxoFieldPanelModule,
DxoLoadPanelModule,
DxoScrollingModule,
DxoStateStoringModule,
DxTemplateModule] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9kaXN0L3VpL3Bpdm90LWdyaWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxvQ0FBb0M7QUFHcEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFHdkUsT0FBTyxFQUNILFNBQVMsRUFDVCxRQUFRLEVBR1IsV0FBVyxFQUNYLE1BQU0sRUFFTixLQUFLLEVBQ0wsTUFBTSxFQU1ULE1BQU0sZUFBZSxDQUFDO0FBS3ZCLE9BQU8sV0FBVyxNQUFNLDBCQUEwQixDQUFDO0FBR25ELE9BQU8sRUFDSCxXQUFXLEVBQ1gsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixhQUFhLEVBQ2hCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUs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Z0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGRldmV4dHJlbWUtYW5ndWxhclxuICogVmVyc2lvbjogMjIuMS4xNFxuICogQnVpbGQgZGF0ZTogTW9uIEFwciAyOSAyMDI0XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEyIC0gMjAyNCBEZXZlbG9wZXIgRXhwcmVzcyBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRURcbiAqXG4gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zXG4gKiBvZiB0aGUgTUlUIGxpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBwcm9qZWN0IGZvciBkZXRhaWxzLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9EZXZFeHByZXNzL2RldmV4dHJlbWUtYW5ndWxhclxuICovXG5cbi8qIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCAqL1xyXG5cclxuXHJcbmltcG9ydCB7IEJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFRyYW5zZmVyU3RhdGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBOZ01vZHVsZSxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBQTEFURk9STV9JRCxcclxuICAgIEluamVjdCxcclxuXHJcbiAgICBJbnB1dCxcclxuICAgIE91dHB1dCxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIE9uQ2hhbmdlcyxcclxuICAgIERvQ2hlY2ssXHJcbiAgICBTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5cclxuaW1wb3J0IFBpdm90R3JpZERhdGFTb3VyY2UsIHsgT3B0aW9ucyBhcyBQaXZvdEdyaWREYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJ2RldmV4dHJlbWUvdWkvcGl2b3RfZ3JpZC9kYXRhX3NvdXJjZSc7XHJcblxyXG5pbXBvcnQgRHhQaXZvdEdyaWQgZnJvbSAnZGV2ZXh0cmVtZS91aS9waXZvdF9ncmlkJztcclxuXHJcblxyXG5pbXBvcnQge1xyXG4gICAgRHhDb21wb25lbnQsXHJcbiAgICBEeFRlbXBsYXRlSG9zdCxcclxuICAgIER4SW50ZWdyYXRpb25Nb2R1bGUsXHJcbiAgICBEeFRlbXBsYXRlTW9kdWxlLFxyXG4gICAgTmVzdGVkT3B0aW9uSG9zdCxcclxuICAgIEl0ZXJhYmxlRGlmZmVySGVscGVyLFxyXG4gICAgV2F0Y2hlckhlbHBlclxyXG59IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IER4b0RhdGFTb3VyY2VNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhpRmllbGRNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvRm9ybWF0TW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcbmltcG9ydCB7IER4b0hlYWRlckZpbHRlck1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5pbXBvcnQgeyBEeG9TdG9yZU1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5pbXBvcnQgeyBEeG9FeHBvcnRNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvRmllbGRDaG9vc2VyTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcbmltcG9ydCB7IER4b1RleHRzTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcbmltcG9ydCB7IER4b0ZpZWxkUGFuZWxNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuaW1wb3J0IHsgRHhvTG9hZFBhbmVsTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL25lc3RlZCc7XHJcbmltcG9ydCB7IER4b1Njcm9sbGluZ01vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5pbXBvcnQgeyBEeG9TdGF0ZVN0b3JpbmdNb2R1bGUgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXIvdWkvbmVzdGVkJztcclxuXHJcblxyXG5cclxuXHJcbi8qKlxyXG4gKiBbZGVzY3I6ZHhQaXZvdEdyaWRdXHJcblxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2R4LXBpdm90LWdyaWQnLFxyXG4gICAgdGVtcGxhdGU6ICcnLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgRHhUZW1wbGF0ZUhvc3QsXHJcbiAgICAgICAgV2F0Y2hlckhlbHBlcixcclxuICAgICAgICBOZXN0ZWRPcHRpb25Ib3N0LFxyXG4gICAgICAgIEl0ZXJhYmxlRGlmZmVySGVscGVyXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEeFBpdm90R3JpZENvbXBvbmVudCBleHRlbmRzIER4Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMsIERvQ2hlY2sge1xyXG4gICAgaW5zdGFuY2U6IER4UGl2b3RHcmlkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOmR4UGl2b3RHcmlkT3B0aW9ucy5hbGxvd0V4cGFuZEFsbF1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGFsbG93RXhwYW5kQWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRPcHRpb24oJ2FsbG93RXhwYW5kQWxsJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgYWxsb3dFeHBhbmRBbGwodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2FsbG93RXhwYW5kQWxsJywgdmFsdWUpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFtkZXNjcjpkeFBpdm90R3JpZE9wdGlvbnMuYWxsb3dGaWx0ZXJpbmddXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBhbGxvd0ZpbHRlcmluZygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdhbGxvd0ZpbHRlcmluZycpO1xyXG4gICAgfVxyXG4gICAgc2V0IGFsbG93RmlsdGVyaW5nKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdhbGxvd0ZpbHRlcmluZycsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhQaXZvdEdyaWRPcHRpb25zLmFsbG93U29ydGluZ11cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGFsbG93U29ydGluZygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdhbGxvd1NvcnRpbmcnKTtcclxuICAgIH1cclxuICAgIHNldCBhbGxvd1NvcnRpbmcodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2FsbG93U29ydGluZycsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhQaXZvdEdyaWRPcHRpb25zLmFsbG93U29ydGluZ0J5U3VtbWFyeV1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGFsbG93U29ydGluZ0J5U3VtbWFyeSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdhbGxvd1NvcnRpbmdCeVN1bW1hcnknKTtcclxuICAgIH1cclxuICAgIHNldCBhbGxvd1NvcnRpbmdCeVN1bW1hcnkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2FsbG93U29ydGluZ0J5U3VtbWFyeScsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhQaXZvdEdyaWRPcHRpb25zLmRhdGFGaWVsZEFyZWFdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBkYXRhRmllbGRBcmVhKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignZGF0YUZpZWxkQXJlYScpO1xyXG4gICAgfVxyXG4gICAgc2V0IGRhdGFGaWVsZEFyZWEodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3NldE9wdGlvbignZGF0YUZpZWxkQXJlYScsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhQaXZvdEdyaWRPcHRpb25zLmRhdGFTb3VyY2VdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBkYXRhU291cmNlKCk6IFBpdm90R3JpZERhdGFTb3VyY2UgfCBQaXZvdEdyaWREYXRhU291cmNlT3B0aW9ucyB8IG51bGwgfCBBcnJheTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdkYXRhU291cmNlJyk7XHJcbiAgICB9XHJcbiAgICBzZXQgZGF0YVNvdXJjZSh2YWx1ZTogUGl2b3RHcmlkRGF0YVNvdXJjZSB8IFBpdm90R3JpZERhdGFTb3VyY2VPcHRpb25zIHwgbnVsbCB8IEFycmF5PGFueT4pIHtcclxuICAgICAgICB0aGlzLl9zZXRPcHRpb24oJ2RhdGFTb3VyY2UnLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogW2Rlc2NyOldpZGdldE9wdGlvbnMuZGlzYWJsZWRdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3B0aW9uKCdkaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdkaXNhYmxlZCcsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6RE9NQ29tcG9uZW50T3B0aW9ucy5lbGVtZW50QXR0cl1cclxuICAgIFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGVsZW1lbnRBdHRyKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9wdGlvbignZWxlbWVudEF0dHInKTtcclxuICAgIH1cclxuICAgIHNldCBlbGVtZW50QXR0cih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5fc2V0T3B0aW9uKCdlbGVtZW50QXR0cicsIHZhbHVlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBbZGVzY3I6ZHhQaXZvdEdyaWRPcHRpb25zLmVuY29kZUh0bWxdXHJcbiAgICBcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBlbm