@ng-matero/extensions 18.4.1 → 19.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_index.scss +3 -1
- package/alert/_alert-theme.scss +19 -8
- package/alert/alert.d.ts +1 -2
- package/button/button-loading.d.ts +1 -2
- package/checkbox-group/checkbox-group.d.ts +12 -4
- package/colorpicker/_colorpicker-theme.scss +19 -8
- package/colorpicker/colorpicker-input.d.ts +1 -3
- package/colorpicker/colorpicker-toggle.d.ts +3 -3
- package/colorpicker/colorpicker.d.ts +4 -7
- package/column-resize/column-resize-directives/column-resize-flex.d.ts +2 -1
- package/column-resize/column-resize-directives/column-resize.d.ts +2 -1
- package/column-resize/column-resize-notifier.d.ts +0 -1
- package/column-resize/column-resize.d.ts +1 -1
- package/column-resize/event-dispatcher.d.ts +0 -9
- package/column-resize/overlay-handle.d.ts +1 -1
- package/column-resize/resizable.d.ts +1 -1
- package/column-resize/resize-strategy.d.ts +4 -4
- package/core/datetime/datetime-adapter.d.ts +1 -2
- package/core/datetime/native-datetime-adapter.d.ts +3 -3
- package/core/style/_button-common.scss +18 -0
- package/core/theming/_config-validation.scss +4 -4
- package/core/theming/_definition.scss +12 -2
- package/core/theming/prebuilt/azure-blue.scss +10 -22
- package/core/theming/prebuilt/cyan-orange.scss +10 -22
- package/core/theming/prebuilt/magenta-violet.scss +10 -22
- package/core/theming/prebuilt/rose-red.scss +10 -22
- package/core/tokens/_m3-system.scss +273 -0
- package/core/tokens/_m3-tokens.scss +8 -151
- package/core/tokens/_token-utils.scss +102 -43
- package/core/tokens/m2/_index.scss +2 -0
- package/core/tokens/m3/definitions/_index.scss +1 -0
- package/core/tokens/m3/definitions/_md-comp-plain-tooltip.scss +51 -0
- package/core/tokens/m3/index.scss +2 -0
- package/core/tokens/m3/mdc/_plain-tooltip.scss +15 -0
- package/core/tokens/m3/mtx/_alert.scss +14 -14
- package/core/tokens/m3/mtx/_colorpicker.scss +2 -2
- package/core/tokens/m3/mtx/_datetimepicker.scss +2 -2
- package/core/tokens/m3/mtx/_drawer.scss +2 -2
- package/core/tokens/m3/mtx/_grid.scss +2 -2
- package/core/tokens/m3/mtx/_loader.scss +2 -2
- package/core/tokens/m3/mtx/_popover.scss +2 -2
- package/core/tokens/m3/mtx/_progress.scss +2 -2
- package/core/tokens/m3/mtx/_select.scss +2 -2
- package/core/tokens/m3/mtx/_split.scss +2 -2
- package/datetimepicker/_datetimepicker-theme.scss +23 -10
- package/datetimepicker/calendar-body.d.ts +26 -4
- package/datetimepicker/calendar-body.scss +58 -9
- package/datetimepicker/calendar.d.ts +31 -31
- package/datetimepicker/clock.d.ts +11 -5
- package/datetimepicker/datetimepicker-actions.d.ts +9 -5
- package/datetimepicker/datetimepicker-content.scss +15 -0
- package/datetimepicker/datetimepicker-input.d.ts +4 -5
- package/datetimepicker/datetimepicker-module.d.ts +2 -2
- package/datetimepicker/datetimepicker-toggle.d.ts +4 -3
- package/datetimepicker/datetimepicker.d.ts +12 -8
- package/datetimepicker/month-view.d.ts +22 -7
- package/datetimepicker/multi-year-view.d.ts +20 -20
- package/datetimepicker/public-api.d.ts +2 -2
- package/datetimepicker/{time.d.ts → time-view.d.ts} +21 -9
- package/datetimepicker/{time.scss → time-view.scss} +1 -1
- package/datetimepicker/year-view.d.ts +21 -11
- package/dialog/dialog-container.d.ts +1 -2
- package/dialog/dialog.d.ts +0 -1
- package/drawer/_drawer-theme.scss +19 -8
- package/drawer/drawer-container.d.ts +2 -5
- package/drawer/drawer.d.ts +3 -5
- package/fesm2022/mtxAlert.mjs +15 -15
- package/fesm2022/mtxAlert.mjs.map +1 -1
- package/fesm2022/mtxButton.mjs +13 -14
- package/fesm2022/mtxButton.mjs.map +1 -1
- package/fesm2022/mtxCheckboxGroup.mjs +51 -31
- package/fesm2022/mtxCheckboxGroup.mjs.map +1 -1
- package/fesm2022/mtxColorpicker.mjs +91 -109
- package/fesm2022/mtxColorpicker.mjs.map +1 -1
- package/fesm2022/mtxColumnResize.mjs +79 -96
- package/fesm2022/mtxColumnResize.mjs.map +1 -1
- package/fesm2022/mtxCore.mjs +31 -36
- package/fesm2022/mtxCore.mjs.map +1 -1
- package/fesm2022/mtxDatetimepicker.mjs +1181 -1093
- package/fesm2022/mtxDatetimepicker.mjs.map +1 -1
- package/fesm2022/mtxDialog.mjs +30 -41
- package/fesm2022/mtxDialog.mjs.map +1 -1
- package/fesm2022/mtxDrawer.mjs +36 -52
- package/fesm2022/mtxDrawer.mjs.map +1 -1
- package/fesm2022/mtxGrid.mjs +168 -204
- package/fesm2022/mtxGrid.mjs.map +1 -1
- package/fesm2022/mtxLoader.mjs +12 -12
- package/fesm2022/mtxLoader.mjs.map +1 -1
- package/fesm2022/mtxPhotoviewer.mjs +11 -12
- package/fesm2022/mtxPhotoviewer.mjs.map +1 -1
- package/fesm2022/mtxPopover.mjs +106 -119
- package/fesm2022/mtxPopover.mjs.map +1 -1
- package/fesm2022/mtxProgress.mjs +8 -8
- package/fesm2022/mtxProgress.mjs.map +1 -1
- package/fesm2022/mtxSelect.mjs +157 -169
- package/fesm2022/mtxSelect.mjs.map +1 -1
- package/fesm2022/mtxSplit.mjs +39 -40
- package/fesm2022/mtxSplit.mjs.map +1 -1
- package/fesm2022/mtxTooltip.mjs +105 -91
- package/fesm2022/mtxTooltip.mjs.map +1 -1
- package/grid/_grid-theme.scss +23 -10
- package/grid/cell.d.ts +1 -4
- package/grid/column-resize/column-resize-directives/column-resize-flex.d.ts +0 -1
- package/grid/column-resize/column-resize-directives/column-resize.d.ts +0 -1
- package/grid/column-resize/overlay-handle.d.ts +1 -2
- package/grid/column-resize/resizable-directives/resizable.d.ts +2 -3
- package/grid/column-resize/resize-strategy.d.ts +2 -4
- package/grid/grid-pipes.d.ts +0 -2
- package/grid/grid.d.ts +5 -5
- package/grid/grid.scss +5 -6
- package/loader/_loader-theme.scss +19 -8
- package/loader/loader.d.ts +0 -2
- package/package.json +11 -47
- package/photoviewer/photoviewer.d.ts +1 -2
- package/popover/_popover-theme.scss +19 -8
- package/popover/popover-content.d.ts +1 -1
- package/popover/popover-target.d.ts +1 -2
- package/popover/popover-trigger.d.ts +5 -6
- package/popover/popover.d.ts +1 -2
- package/prebuilt-themes/azure-blue.css +1 -1
- package/prebuilt-themes/cyan-orange.css +1 -1
- package/prebuilt-themes/deeppurple-amber.css +1 -1
- package/prebuilt-themes/indigo-pink.css +1 -1
- package/prebuilt-themes/magenta-violet.css +1 -1
- package/prebuilt-themes/pink-bluegrey.css +1 -1
- package/prebuilt-themes/purple-green.css +1 -1
- package/prebuilt-themes/rose-red.css +1 -1
- package/progress/_progress-theme.scss +23 -10
- package/select/_select-theme.scss +23 -10
- package/select/option.d.ts +0 -1
- package/select/select-intl.d.ts +2 -4
- package/select/select.d.ts +8 -7
- package/select/select.scss +3 -3
- package/select/templates.d.ts +0 -12
- package/split/_split-theme.scss +19 -8
- package/split/split-pane.d.ts +3 -4
- package/split/split.d.ts +4 -4
- package/split/split.scss +1 -1
- package/tooltip/_tooltip-theme.scss +11 -4
- package/tooltip/tooltip.d.ts +17 -9
- package/tooltip/tooltip.scss +8 -3
- package/esm2022/alert/alert-module.mjs +0 -17
- package/esm2022/alert/alert.mjs +0 -46
- package/esm2022/alert/mtxAlert.mjs +0 -5
- package/esm2022/alert/public-api.mjs +0 -3
- package/esm2022/button/button-loading.mjs +0 -66
- package/esm2022/button/button-module.mjs +0 -19
- package/esm2022/button/mtxButton.mjs +0 -5
- package/esm2022/button/public-api.mjs +0 -3
- package/esm2022/checkbox-group/checkbox-group-module.mjs +0 -20
- package/esm2022/checkbox-group/checkbox-group.mjs +0 -222
- package/esm2022/checkbox-group/interfaces.mjs +0 -2
- package/esm2022/checkbox-group/mtxCheckboxGroup.mjs +0 -5
- package/esm2022/checkbox-group/public-api.mjs +0 -4
- package/esm2022/colorpicker/colorpicker-animations.mjs +0 -16
- package/esm2022/colorpicker/colorpicker-input.mjs +0 -228
- package/esm2022/colorpicker/colorpicker-module.mjs +0 -64
- package/esm2022/colorpicker/colorpicker-toggle.mjs +0 -102
- package/esm2022/colorpicker/colorpicker.mjs +0 -363
- package/esm2022/colorpicker/mtxColorpicker.mjs +0 -5
- package/esm2022/colorpicker/public-api.mjs +0 -6
- package/esm2022/column-resize/column-resize-directives/column-resize-flex.mjs +0 -40
- package/esm2022/column-resize/column-resize-directives/column-resize.mjs +0 -40
- package/esm2022/column-resize/column-resize-directives/constants.mjs +0 -21
- package/esm2022/column-resize/column-resize-module.mjs +0 -28
- package/esm2022/column-resize/column-resize-notifier.mjs +0 -52
- package/esm2022/column-resize/column-resize.mjs +0 -82
- package/esm2022/column-resize/column-size-store.mjs +0 -20
- package/esm2022/column-resize/event-dispatcher.mjs +0 -70
- package/esm2022/column-resize/mtxColumnResize.mjs +0 -5
- package/esm2022/column-resize/overlay-handle.mjs +0 -146
- package/esm2022/column-resize/polyfill.mjs +0 -19
- package/esm2022/column-resize/public-api.mjs +0 -13
- package/esm2022/column-resize/resizable.mjs +0 -199
- package/esm2022/column-resize/resize-ref.mjs +0 -17
- package/esm2022/column-resize/resize-strategy.mjs +0 -238
- package/esm2022/column-resize/selectors.mjs +0 -13
- package/esm2022/core/datetime/datetime-adapter.mjs +0 -132
- package/esm2022/core/datetime/datetime-formats.mjs +0 -3
- package/esm2022/core/datetime/datetime.module.mjs +0 -38
- package/esm2022/core/datetime/index.mjs +0 -6
- package/esm2022/core/datetime/native-datetime-adapter.mjs +0 -138
- package/esm2022/core/datetime/native-datetime-formats.mjs +0 -20
- package/esm2022/core/mtxCore.mjs +0 -5
- package/esm2022/core/pipes/index.mjs +0 -4
- package/esm2022/core/pipes/is-template-ref.pipe.mjs +0 -14
- package/esm2022/core/pipes/pipes.module.mjs +0 -18
- package/esm2022/core/pipes/to-observable.pipe.mjs +0 -15
- package/esm2022/core/public-api.mjs +0 -3
- package/esm2022/datetimepicker/calendar-body.mjs +0 -77
- package/esm2022/datetimepicker/calendar.mjs +0 -661
- package/esm2022/datetimepicker/clock.mjs +0 -362
- package/esm2022/datetimepicker/datetimepicker-actions.mjs +0 -88
- package/esm2022/datetimepicker/datetimepicker-animations.mjs +0 -44
- package/esm2022/datetimepicker/datetimepicker-errors.mjs +0 -8
- package/esm2022/datetimepicker/datetimepicker-filtertype.mjs +0 -7
- package/esm2022/datetimepicker/datetimepicker-input.mjs +0 -349
- package/esm2022/datetimepicker/datetimepicker-intl.mjs +0 -63
- package/esm2022/datetimepicker/datetimepicker-module.mjs +0 -116
- package/esm2022/datetimepicker/datetimepicker-toggle.mjs +0 -105
- package/esm2022/datetimepicker/datetimepicker-types.mjs +0 -2
- package/esm2022/datetimepicker/datetimepicker.mjs +0 -580
- package/esm2022/datetimepicker/month-view.mjs +0 -148
- package/esm2022/datetimepicker/mtxDatetimepicker.mjs +0 -5
- package/esm2022/datetimepicker/multi-year-view.mjs +0 -215
- package/esm2022/datetimepicker/public-api.mjs +0 -17
- package/esm2022/datetimepicker/time.mjs +0 -470
- package/esm2022/datetimepicker/year-view.mjs +0 -139
- package/esm2022/dialog/dialog-config.mjs +0 -2
- package/esm2022/dialog/dialog-container.mjs +0 -43
- package/esm2022/dialog/dialog-module.mjs +0 -40
- package/esm2022/dialog/dialog.mjs +0 -75
- package/esm2022/dialog/mtxDialog.mjs +0 -5
- package/esm2022/dialog/public-api.mjs +0 -5
- package/esm2022/drawer/drawer-animations.mjs +0 -18
- package/esm2022/drawer/drawer-config.mjs +0 -35
- package/esm2022/drawer/drawer-container.mjs +0 -88
- package/esm2022/drawer/drawer-module.mjs +0 -21
- package/esm2022/drawer/drawer-ref.mjs +0 -99
- package/esm2022/drawer/drawer.mjs +0 -144
- package/esm2022/drawer/mtxDrawer.mjs +0 -5
- package/esm2022/drawer/public-api.mjs +0 -7
- package/esm2022/grid/cell.mjs +0 -132
- package/esm2022/grid/column-menu.mjs +0 -133
- package/esm2022/grid/column-resize/column-resize-directives/column-resize-flex.mjs +0 -38
- package/esm2022/grid/column-resize/column-resize-directives/column-resize.mjs +0 -38
- package/esm2022/grid/column-resize/column-resize-directives/common.mjs +0 -27
- package/esm2022/grid/column-resize/column-resize-module.mjs +0 -42
- package/esm2022/grid/column-resize/index.mjs +0 -8
- package/esm2022/grid/column-resize/overlay-handle.mjs +0 -66
- package/esm2022/grid/column-resize/resizable-directives/common.mjs +0 -29
- package/esm2022/grid/column-resize/resizable-directives/resizable.mjs +0 -64
- package/esm2022/grid/column-resize/resize-strategy.mjs +0 -47
- package/esm2022/grid/expansion-toggle.mjs +0 -65
- package/esm2022/grid/grid-module.mjs +0 -151
- package/esm2022/grid/grid-pipes.mjs +0 -129
- package/esm2022/grid/grid-utils.mjs +0 -56
- package/esm2022/grid/grid.mjs +0 -644
- package/esm2022/grid/interfaces.mjs +0 -2
- package/esm2022/grid/mtxGrid.mjs +0 -5
- package/esm2022/grid/public-api.mjs +0 -18
- package/esm2022/grid/selectable-cell.mjs +0 -53
- package/esm2022/loader/loader-module.mjs +0 -19
- package/esm2022/loader/loader.mjs +0 -57
- package/esm2022/loader/mtxLoader.mjs +0 -5
- package/esm2022/loader/public-api.mjs +0 -3
- package/esm2022/ng-matero-extensions.mjs +0 -5
- package/esm2022/photoviewer/mtxPhotoviewer.mjs +0 -5
- package/esm2022/photoviewer/photoviewer-module.mjs +0 -16
- package/esm2022/photoviewer/photoviewer.mjs +0 -64
- package/esm2022/photoviewer/public-api.mjs +0 -3
- package/esm2022/popover/mtxPopover.mjs +0 -5
- package/esm2022/popover/popover-animations.mjs +0 -25
- package/esm2022/popover/popover-content.mjs +0 -91
- package/esm2022/popover/popover-errors.mjs +0 -27
- package/esm2022/popover/popover-interfaces.mjs +0 -2
- package/esm2022/popover/popover-module.mjs +0 -39
- package/esm2022/popover/popover-target.mjs +0 -18
- package/esm2022/popover/popover-trigger.mjs +0 -480
- package/esm2022/popover/popover-types.mjs +0 -2
- package/esm2022/popover/popover.mjs +0 -325
- package/esm2022/popover/public-api.mjs +0 -9
- package/esm2022/progress/mtxProgress.mjs +0 -5
- package/esm2022/progress/progress-module.mjs +0 -17
- package/esm2022/progress/progress.mjs +0 -43
- package/esm2022/progress/public-api.mjs +0 -3
- package/esm2022/public-api.mjs +0 -5
- package/esm2022/select/mtxSelect.mjs +0 -5
- package/esm2022/select/option.mjs +0 -52
- package/esm2022/select/public-api.mjs +0 -6
- package/esm2022/select/select-intl.mjs +0 -32
- package/esm2022/select/select-module.mjs +0 -89
- package/esm2022/select/select.mjs +0 -611
- package/esm2022/select/templates.mjs +0 -135
- package/esm2022/split/interfaces.mjs +0 -2
- package/esm2022/split/mtxSplit.mjs +0 -5
- package/esm2022/split/public-api.mjs +0 -6
- package/esm2022/split/split-module.mjs +0 -18
- package/esm2022/split/split-pane.mjs +0 -161
- package/esm2022/split/split.mjs +0 -634
- package/esm2022/split/utils.mjs +0 -219
- package/esm2022/tooltip/mtxTooltip.mjs +0 -5
- package/esm2022/tooltip/public-api.mjs +0 -4
- package/esm2022/tooltip/tooltip-animations.mjs +0 -17
- package/esm2022/tooltip/tooltip-module.mjs +0 -41
- package/esm2022/tooltip/tooltip.mjs +0 -915
package/esm2022/grid/grid.mjs
DELETED
|
@@ -1,644 +0,0 @@
|
|
|
1
|
-
import { animate, state, style, transition, trigger } from '@angular/animations';
|
|
2
|
-
import { SelectionModel } from '@angular/cdk/collections';
|
|
3
|
-
import { AsyncPipe, NgTemplateOutlet } from '@angular/common';
|
|
4
|
-
import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Inject, InjectionToken, Input, Optional, Output, ViewChild, ViewEncapsulation, booleanAttribute, } from '@angular/core';
|
|
5
|
-
import { MatIconButton } from '@angular/material/button';
|
|
6
|
-
import { MatCheckbox } from '@angular/material/checkbox';
|
|
7
|
-
import { MatPaginator } from '@angular/material/paginator';
|
|
8
|
-
import { MatProgressBar } from '@angular/material/progress-bar';
|
|
9
|
-
import { MatSort, MatSortHeader } from '@angular/material/sort';
|
|
10
|
-
import { MatCell, MatCellDef, MatColumnDef, MatFooterCell, MatFooterCellDef, MatFooterRow, MatFooterRowDef, MatHeaderCell, MatHeaderCellDef, MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable, MatTableDataSource, } from '@angular/material/table';
|
|
11
|
-
import { MtxIsTemplateRefPipe, MtxToObservablePipe } from '@ng-matero/extensions/core';
|
|
12
|
-
import { MtxGridCell } from './cell';
|
|
13
|
-
import { MtxGridColumnMenu } from './column-menu';
|
|
14
|
-
import { MatColumnResize, MatResizable } from './column-resize';
|
|
15
|
-
import { MtxGridExpansionToggle } from './expansion-toggle';
|
|
16
|
-
import { MtxGridColClassPipe, MtxGridRowClassPipe } from './grid-pipes';
|
|
17
|
-
import { MtxGridSelectableCell } from './selectable-cell';
|
|
18
|
-
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "./grid-utils";
|
|
20
|
-
/** Injection token that can be used to specify default grid options. */
|
|
21
|
-
export const MTX_GRID_DEFAULT_OPTIONS = new InjectionToken('mtx-grid-default-options');
|
|
22
|
-
export class MtxGrid {
|
|
23
|
-
get _hasNoResult() {
|
|
24
|
-
return (!this.dataSource.data || this.dataSource.data.length === 0) && !this.loading;
|
|
25
|
-
}
|
|
26
|
-
// TODO: Summary display conditions
|
|
27
|
-
get _whetherShowSummary() {
|
|
28
|
-
return this.showSummary;
|
|
29
|
-
}
|
|
30
|
-
constructor(_utils, _changeDetectorRef, _defaultOptions) {
|
|
31
|
-
this._utils = _utils;
|
|
32
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
33
|
-
this._defaultOptions = _defaultOptions;
|
|
34
|
-
this.dataSource = new MatTableDataSource();
|
|
35
|
-
/** The grid's displayed columns. */
|
|
36
|
-
this.displayedColumns = [];
|
|
37
|
-
/** The grid's columns. */
|
|
38
|
-
this.columns = [];
|
|
39
|
-
/** The grid's data. */
|
|
40
|
-
this.data = [];
|
|
41
|
-
/** The total number of the data. */
|
|
42
|
-
this.length = 0;
|
|
43
|
-
/** Whether the grid is loading. */
|
|
44
|
-
this.loading = false;
|
|
45
|
-
/** Whether the column is resizable. */
|
|
46
|
-
this.columnResizable = this._defaultOptions?.columnResizable ?? false;
|
|
47
|
-
/** Placeholder for the empty value (`null`, `''`, `[]`). */
|
|
48
|
-
this.emptyValuePlaceholder = this._defaultOptions?.emptyValuePlaceholder ?? '--';
|
|
49
|
-
// ===== Page =====
|
|
50
|
-
/** Whether to paginate the data on front end. */
|
|
51
|
-
this.pageOnFront = this._defaultOptions?.pageOnFront ?? true;
|
|
52
|
-
/** Whether to show the paginator. */
|
|
53
|
-
this.showPaginator = this._defaultOptions?.showPaginator ?? true;
|
|
54
|
-
/** Whether the paginator is disabled. */
|
|
55
|
-
this.pageDisabled = this._defaultOptions?.pageDisabled ?? false;
|
|
56
|
-
/** Whether to show the first/last buttons UI to the user. */
|
|
57
|
-
this.showFirstLastButtons = this._defaultOptions?.showFirstLastButtons ?? true;
|
|
58
|
-
/** The zero-based page index of the displayed list of items. */
|
|
59
|
-
this.pageIndex = this._defaultOptions?.pageIndex ?? 0;
|
|
60
|
-
/** Number of items to display on a page. */
|
|
61
|
-
this.pageSize = this._defaultOptions?.pageSize ?? 10;
|
|
62
|
-
/** The set of provided page size options to display to the user. */
|
|
63
|
-
this.pageSizeOptions = this._defaultOptions?.pageSizeOptions ?? [10, 50, 100];
|
|
64
|
-
/** Whether to hide the page size selection UI from the user. */
|
|
65
|
-
this.hidePageSize = this._defaultOptions?.hidePageSize ?? false;
|
|
66
|
-
/** Event emitted when the paginator changes the page size or page index. */
|
|
67
|
-
this.page = new EventEmitter();
|
|
68
|
-
// ===== Sort =====
|
|
69
|
-
/** Whether to sort the data on front end. */
|
|
70
|
-
this.sortOnFront = this._defaultOptions?.sortOnFront ?? true;
|
|
71
|
-
/** The id of the most recently sorted MatSortable. */
|
|
72
|
-
this.sortActive = this._defaultOptions?.sortActive ?? '';
|
|
73
|
-
/** The sort direction of the currently active MatSortable. */
|
|
74
|
-
this.sortDirection = this._defaultOptions?.sortDirection ?? '';
|
|
75
|
-
/**
|
|
76
|
-
* Whether to disable the user from clearing the sort by finishing the sort direction cycle.
|
|
77
|
-
* May be overriden by the column's `disableClear` in `sortProp`.
|
|
78
|
-
*/
|
|
79
|
-
this.sortDisableClear = this._defaultOptions?.sortDisableClear ?? false;
|
|
80
|
-
/** Whether the sort is disabled. */
|
|
81
|
-
this.sortDisabled = this._defaultOptions?.sortDisabled ?? false;
|
|
82
|
-
/**
|
|
83
|
-
* The direction to set when an MatSortable is initially sorted.
|
|
84
|
-
* May be overriden by the column's `start` in `sortProp`.
|
|
85
|
-
*/
|
|
86
|
-
this.sortStart = this._defaultOptions?.sortStart ?? 'asc';
|
|
87
|
-
/** Event emitted when the user changes either the active sort or sort direction. */
|
|
88
|
-
this.sortChange = new EventEmitter();
|
|
89
|
-
// ===== Row =====
|
|
90
|
-
/** Whether to use the row hover style. */
|
|
91
|
-
this.rowHover = this._defaultOptions?.rowHover ?? false;
|
|
92
|
-
/** Whether to use the row striped style. */
|
|
93
|
-
this.rowStriped = this._defaultOptions?.rowStriped ?? false;
|
|
94
|
-
/** Event emitted when the user clicks the row. */
|
|
95
|
-
this.rowClick = new EventEmitter();
|
|
96
|
-
/** Event emitted when the user attempts to open a context menu. */
|
|
97
|
-
this.rowContextMenu = new EventEmitter();
|
|
98
|
-
// ===== Expandable Row =====
|
|
99
|
-
this.expansionRowStates = [];
|
|
100
|
-
/** Whether the row is expandable. */
|
|
101
|
-
this.expandable = false;
|
|
102
|
-
/** Event emitted when the user toggles the expandable row. */
|
|
103
|
-
this.expansionChange = new EventEmitter();
|
|
104
|
-
// ===== Row Selection =====
|
|
105
|
-
this.rowSelection = new SelectionModel(true, []);
|
|
106
|
-
/** Whether to support multiple row/cell selection. */
|
|
107
|
-
this.multiSelectable = this._defaultOptions?.multiSelectable ?? true;
|
|
108
|
-
/** Whether the user can select multiple rows with click. */
|
|
109
|
-
this.multiSelectionWithClick = this._defaultOptions?.multiSelectionWithClick ?? false;
|
|
110
|
-
/** Whether the row is selectable. */
|
|
111
|
-
this.rowSelectable = this._defaultOptions?.rowSelectable ?? false;
|
|
112
|
-
/** Whether to hide the row selection checkbox. */
|
|
113
|
-
this.hideRowSelectionCheckbox = this._defaultOptions?.hideRowSelectionCheckbox ?? false;
|
|
114
|
-
/** Whether disable rows to be selected when clicked. */
|
|
115
|
-
this.disableRowClickSelection = this._defaultOptions?.disableRowClickSelection ?? false;
|
|
116
|
-
/** The formatter to disable the row selection or hide the row's checkbox. */
|
|
117
|
-
this.rowSelectionFormatter = {};
|
|
118
|
-
/** The selected row items. */
|
|
119
|
-
this.rowSelected = [];
|
|
120
|
-
/** Event emitted when the row is selected. */
|
|
121
|
-
this.rowSelectedChange = new EventEmitter();
|
|
122
|
-
// ===== Cell Selection =====
|
|
123
|
-
this.cellSelection = [];
|
|
124
|
-
/** Whether the cell is selectable. */
|
|
125
|
-
this.cellSelectable = this._defaultOptions?.cellSelectable ?? true;
|
|
126
|
-
/** Event emitted when the cell is selected. */
|
|
127
|
-
this.cellSelectedChange = new EventEmitter();
|
|
128
|
-
// ===== Toolbar =====
|
|
129
|
-
/** Whether to show the toolbar. */
|
|
130
|
-
this.showToolbar = this._defaultOptions?.showToolbar ?? false;
|
|
131
|
-
/** The text of the toolbar's title. */
|
|
132
|
-
this.toolbarTitle = this._defaultOptions?.toolbarTitle ?? '';
|
|
133
|
-
// ===== Column Menu =====
|
|
134
|
-
/** Whether the column is hideable. */
|
|
135
|
-
this.columnHideable = this._defaultOptions?.columnHideable ?? true;
|
|
136
|
-
/** Hide or show when the column's checkbox is checked. */
|
|
137
|
-
this.columnHideableChecked = this._defaultOptions?.columnHideableChecked ?? 'show';
|
|
138
|
-
/** Whether the column is sortable. */
|
|
139
|
-
this.columnSortable = this._defaultOptions?.columnSortable ?? true;
|
|
140
|
-
/** Whether the column is pinnable. */
|
|
141
|
-
this.columnPinnable = this._defaultOptions?.columnPinnable ?? true;
|
|
142
|
-
/** Event emitted when the column is hided or is sorted. */
|
|
143
|
-
this.columnChange = new EventEmitter();
|
|
144
|
-
/** The options for the column pin list. */
|
|
145
|
-
this.columnPinOptions = this._defaultOptions?.columnPinOptions ?? [];
|
|
146
|
-
/** Whether to show the column menu button. */
|
|
147
|
-
this.showColumnMenuButton = this._defaultOptions?.showColumnMenuButton ?? true;
|
|
148
|
-
/** The text for the column menu button. */
|
|
149
|
-
this.columnMenuButtonText = this._defaultOptions?.columnMenuButtonText ?? '';
|
|
150
|
-
/** The type for the column menu button. */
|
|
151
|
-
this.columnMenuButtonType = this._defaultOptions?.columnMenuButtonType ?? 'stroked';
|
|
152
|
-
/** The color for the column menu button. */
|
|
153
|
-
this.columnMenuButtonColor = this._defaultOptions?.columnMenuButtonColor;
|
|
154
|
-
/** The class for the column menu button. */
|
|
155
|
-
this.columnMenuButtonClass = this._defaultOptions?.columnMenuButtonClass ?? '';
|
|
156
|
-
/** The icon for the column menu button. */
|
|
157
|
-
this.columnMenuButtonIcon = this._defaultOptions?.columnMenuButtonIcon ?? '';
|
|
158
|
-
/** Whether to show the column-menu's header. */
|
|
159
|
-
this.showColumnMenuHeader = this._defaultOptions?.showColumnMenuHeader ?? false;
|
|
160
|
-
/** The text for the column-menu's header. */
|
|
161
|
-
this.columnMenuHeaderText = this._defaultOptions?.columnMenuHeaderText ?? 'Columns Header';
|
|
162
|
-
/** Whether to show the the column-menu's footer. */
|
|
163
|
-
this.showColumnMenuFooter = this._defaultOptions?.showColumnMenuFooter ?? false;
|
|
164
|
-
/** The text for the column-menu's footer. */
|
|
165
|
-
this.columnMenuFooterText = this._defaultOptions?.columnMenuFooterText ?? 'Columns Footer';
|
|
166
|
-
// ===== No Result =====
|
|
167
|
-
/** The displayed text for the empty data. */
|
|
168
|
-
this.noResultText = this._defaultOptions?.noResultText ?? 'No records found';
|
|
169
|
-
// ===== Row Templates =====
|
|
170
|
-
/** Whether to use custom row template. If true, you should define a matRowDef. */
|
|
171
|
-
this.useContentRowTemplate = false;
|
|
172
|
-
// TODO: It can't use together with `useContentRowTemplate`
|
|
173
|
-
this.useContentHeaderRowTemplate = false;
|
|
174
|
-
// TODO: It's not working
|
|
175
|
-
this.useContentFooterRowTemplate = false;
|
|
176
|
-
// ===== Summary =====
|
|
177
|
-
/** Whether to show the summary. */
|
|
178
|
-
this.showSummary = false;
|
|
179
|
-
// ===== Side Bar =====
|
|
180
|
-
/** Whether to show the sidebar. */
|
|
181
|
-
this.showSidebar = false;
|
|
182
|
-
// ===== Status Bar =====
|
|
183
|
-
/** Whether to show the status bar. */
|
|
184
|
-
this.showStatusbar = false;
|
|
185
|
-
}
|
|
186
|
-
detectChanges() {
|
|
187
|
-
this._changeDetectorRef.detectChanges();
|
|
188
|
-
}
|
|
189
|
-
_getColData(data, colDef) {
|
|
190
|
-
return this._utils.getColData(data, colDef);
|
|
191
|
-
}
|
|
192
|
-
_isColumnHide(item) {
|
|
193
|
-
return item.hide !== undefined ? item.hide : item.show !== undefined ? !item.show : false;
|
|
194
|
-
}
|
|
195
|
-
// Waiting for async data
|
|
196
|
-
ngOnChanges(changes) {
|
|
197
|
-
this._countPinnedPosition();
|
|
198
|
-
this.displayedColumns = this.columns
|
|
199
|
-
.filter(item => !this._isColumnHide(item))
|
|
200
|
-
.map(item => item.field);
|
|
201
|
-
if (this.showColumnMenuButton) {
|
|
202
|
-
this.columns.forEach(item => {
|
|
203
|
-
item.hide = this._isColumnHide(item);
|
|
204
|
-
item.show = !item.hide;
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
if (this.rowSelectable && !this.hideRowSelectionCheckbox) {
|
|
208
|
-
this.displayedColumns.unshift('MtxGridCheckboxColumnDef');
|
|
209
|
-
}
|
|
210
|
-
// We should copy each item of data for expansion data
|
|
211
|
-
if (this.expandable) {
|
|
212
|
-
this.expansionRowStates = []; // reset
|
|
213
|
-
this.data?.forEach(_ => {
|
|
214
|
-
this.expansionRowStates.push({ expanded: false });
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
if (this.rowSelectable) {
|
|
218
|
-
this.rowSelection = new SelectionModel(this.multiSelectable, this.rowSelected);
|
|
219
|
-
}
|
|
220
|
-
this.dataSource = new MatTableDataSource(this.data);
|
|
221
|
-
this.dataSource.paginator = this.pageOnFront ? this.paginator : null;
|
|
222
|
-
this.dataSource.sort = this.sortOnFront ? this.sort : null;
|
|
223
|
-
// Only scroll top with data change
|
|
224
|
-
if (changes.data) {
|
|
225
|
-
this.scrollTop(0);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
ngAfterViewInit() {
|
|
229
|
-
if (this.pageOnFront) {
|
|
230
|
-
this.dataSource.paginator = this.paginator;
|
|
231
|
-
}
|
|
232
|
-
if (this.sortOnFront) {
|
|
233
|
-
this.dataSource.sort = this.sort;
|
|
234
|
-
}
|
|
235
|
-
if (this.rowDefs?.length > 0 && this.useContentRowTemplate) {
|
|
236
|
-
this.rowDefs.forEach(rowDef => this.table.addRowDef(rowDef));
|
|
237
|
-
}
|
|
238
|
-
if (this.headerRowDefs?.length > 0 && this.useContentHeaderRowTemplate) {
|
|
239
|
-
this.headerRowDefs.forEach(headerRowDef => this.table.addHeaderRowDef(headerRowDef));
|
|
240
|
-
}
|
|
241
|
-
if (this.footerRowDefs?.length > 0 && this.useContentFooterRowTemplate) {
|
|
242
|
-
this.footerRowDefs.forEach(footerRowDef => this.table.addFooterRowDef(footerRowDef));
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
ngOnDestroy() { }
|
|
246
|
-
_countPinnedPosition() {
|
|
247
|
-
const count = (acc, cur) => acc + parseFloat(cur.width || '80px');
|
|
248
|
-
const pinnedLeftCols = this.columns.filter(col => col.pinned && col.pinned === 'left');
|
|
249
|
-
pinnedLeftCols.forEach((item, idx) => {
|
|
250
|
-
item.left = pinnedLeftCols.slice(0, idx).reduce(count, 0) + 'px';
|
|
251
|
-
});
|
|
252
|
-
const pinnedRightCols = this.columns
|
|
253
|
-
.filter(col => col.pinned && col.pinned === 'right')
|
|
254
|
-
.reverse();
|
|
255
|
-
pinnedRightCols.forEach((item, idx) => {
|
|
256
|
-
item.right = pinnedRightCols.slice(0, idx).reduce(count, 0) + 'px';
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
_getIndex(index, dataIndex) {
|
|
260
|
-
return index === undefined ? dataIndex : index;
|
|
261
|
-
}
|
|
262
|
-
_onSortChange(sort) {
|
|
263
|
-
this.sortChange.emit(sort);
|
|
264
|
-
}
|
|
265
|
-
_onRowDataChange(record) {
|
|
266
|
-
this.rowChangeRecord = record;
|
|
267
|
-
this._changeDetectorRef.markForCheck();
|
|
268
|
-
}
|
|
269
|
-
/** Expansion change event */
|
|
270
|
-
_onExpansionChange(expansionRef, rowData, column, index) {
|
|
271
|
-
this.expansionChange.emit({ expanded: expansionRef.expanded, data: rowData, index, column });
|
|
272
|
-
}
|
|
273
|
-
/** Cell select event */
|
|
274
|
-
_selectCell(cellRef, rowData, colDef) {
|
|
275
|
-
// If not the same cell
|
|
276
|
-
if (this._selectedCell !== cellRef) {
|
|
277
|
-
const colValue = this._utils.getCellValue(rowData, colDef);
|
|
278
|
-
this.cellSelection = []; // reset
|
|
279
|
-
this.cellSelection.push({ cellData: colValue, rowData, colDef });
|
|
280
|
-
this.cellSelectedChange.emit(this.cellSelection);
|
|
281
|
-
if (this._selectedCell) {
|
|
282
|
-
this._selectedCell.deselect(); // the selectedCell will be undefined
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
this._selectedCell = cellRef.selected ? cellRef : undefined;
|
|
286
|
-
}
|
|
287
|
-
/** Row select event */
|
|
288
|
-
_selectRow(event, rowData, index) {
|
|
289
|
-
if (this.rowSelectable &&
|
|
290
|
-
!this.rowSelectionFormatter.disabled?.(rowData, index) &&
|
|
291
|
-
!this.rowSelectionFormatter.hideCheckbox?.(rowData, index) &&
|
|
292
|
-
!this.disableRowClickSelection) {
|
|
293
|
-
// metaKey -> command key
|
|
294
|
-
if (!this.multiSelectionWithClick && !event.ctrlKey && !event.metaKey) {
|
|
295
|
-
this.rowSelection.clear();
|
|
296
|
-
}
|
|
297
|
-
this._toggleNormalCheckbox(rowData);
|
|
298
|
-
}
|
|
299
|
-
this.rowClick.emit({ event, rowData, index });
|
|
300
|
-
}
|
|
301
|
-
/** Whether the number of selected elements matches the total number of rows. */
|
|
302
|
-
_isAllSelected() {
|
|
303
|
-
const numSelected = this.rowSelection.selected.length;
|
|
304
|
-
const numRows = this.dataSource.data.filter((row, index) => !this.rowSelectionFormatter.disabled?.(row, index)).length;
|
|
305
|
-
return numSelected === numRows;
|
|
306
|
-
}
|
|
307
|
-
/** Select all rows if they are not all selected; otherwise clear selection. */
|
|
308
|
-
_toggleMasterCheckbox() {
|
|
309
|
-
this._isAllSelected()
|
|
310
|
-
? this.rowSelection.clear()
|
|
311
|
-
: this.dataSource.data.forEach((row, index) => {
|
|
312
|
-
if (!this.rowSelectionFormatter.disabled?.(row, index)) {
|
|
313
|
-
this.rowSelection.select(row);
|
|
314
|
-
}
|
|
315
|
-
});
|
|
316
|
-
this.rowSelectedChange.emit(this.rowSelection.selected);
|
|
317
|
-
}
|
|
318
|
-
/** Select normal row */
|
|
319
|
-
_toggleNormalCheckbox(row) {
|
|
320
|
-
this.rowSelection.toggle(row);
|
|
321
|
-
this.rowSelectedChange.emit(this.rowSelection.selected);
|
|
322
|
-
}
|
|
323
|
-
/** Column change event */
|
|
324
|
-
_onColumnChange(columns) {
|
|
325
|
-
this.columnChange.emit(columns);
|
|
326
|
-
this.displayedColumns = Object.assign([], this.getDisplayedColumnFields(columns));
|
|
327
|
-
if (this.rowSelectable && !this.hideRowSelectionCheckbox) {
|
|
328
|
-
this.displayedColumns.unshift('MtxGridCheckboxColumnDef');
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
getDisplayedColumnFields(columns) {
|
|
332
|
-
const fields = columns
|
|
333
|
-
.filter(item => (this.columnHideableChecked === 'show' ? item.show : !item.hide))
|
|
334
|
-
.map(item => item.field);
|
|
335
|
-
return fields;
|
|
336
|
-
}
|
|
337
|
-
/** Customize expansion event */
|
|
338
|
-
toggleExpansion(index) {
|
|
339
|
-
if (!this.expandable) {
|
|
340
|
-
throw new Error('The `expandable` should be set true.');
|
|
341
|
-
}
|
|
342
|
-
this.expansionRowStates[index].expanded = !this.expansionRowStates[index].expanded;
|
|
343
|
-
return this.expansionRowStates[index].expanded;
|
|
344
|
-
}
|
|
345
|
-
/** Scroll to top when turn to the next page. */
|
|
346
|
-
_onPage(e) {
|
|
347
|
-
if (this.pageOnFront) {
|
|
348
|
-
this.scrollTop(0);
|
|
349
|
-
}
|
|
350
|
-
this.page.emit(e);
|
|
351
|
-
}
|
|
352
|
-
scrollTop(value) {
|
|
353
|
-
if (value == null) {
|
|
354
|
-
return this.tableContainer?.nativeElement.scrollTop;
|
|
355
|
-
}
|
|
356
|
-
if (this.tableContainer && !this.loading) {
|
|
357
|
-
this.tableContainer.nativeElement.scrollTop = value;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
scrollLeft(value) {
|
|
361
|
-
if (value == null) {
|
|
362
|
-
return this.tableContainer?.nativeElement.scrollLeft;
|
|
363
|
-
}
|
|
364
|
-
if (this.tableContainer && !this.loading) {
|
|
365
|
-
this.tableContainer.nativeElement.scrollLeft = value;
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
_contextmenu(event, rowData, index) {
|
|
369
|
-
this.rowContextMenu.emit({ event, rowData, index });
|
|
370
|
-
}
|
|
371
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxGrid, deps: [{ token: i1.MtxGridUtils }, { token: i0.ChangeDetectorRef }, { token: MTX_GRID_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
372
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: MtxGrid, isStandalone: true, selector: "mtx-grid", inputs: { displayedColumns: "displayedColumns", columns: "columns", data: "data", length: "length", loading: ["loading", "loading", booleanAttribute], trackBy: "trackBy", columnResizable: ["columnResizable", "columnResizable", booleanAttribute], emptyValuePlaceholder: "emptyValuePlaceholder", pageOnFront: ["pageOnFront", "pageOnFront", booleanAttribute], showPaginator: ["showPaginator", "showPaginator", booleanAttribute], pageDisabled: ["pageDisabled", "pageDisabled", booleanAttribute], showFirstLastButtons: ["showFirstLastButtons", "showFirstLastButtons", booleanAttribute], pageIndex: "pageIndex", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", hidePageSize: ["hidePageSize", "hidePageSize", booleanAttribute], paginationTemplate: "paginationTemplate", sortOnFront: ["sortOnFront", "sortOnFront", booleanAttribute], sortActive: "sortActive", sortDirection: "sortDirection", sortDisableClear: ["sortDisableClear", "sortDisableClear", booleanAttribute], sortDisabled: ["sortDisabled", "sortDisabled", booleanAttribute], sortStart: "sortStart", rowHover: ["rowHover", "rowHover", booleanAttribute], rowStriped: ["rowStriped", "rowStriped", booleanAttribute], expandable: ["expandable", "expandable", booleanAttribute], expansionTemplate: "expansionTemplate", multiSelectable: ["multiSelectable", "multiSelectable", booleanAttribute], multiSelectionWithClick: ["multiSelectionWithClick", "multiSelectionWithClick", booleanAttribute], rowSelectable: ["rowSelectable", "rowSelectable", booleanAttribute], hideRowSelectionCheckbox: ["hideRowSelectionCheckbox", "hideRowSelectionCheckbox", booleanAttribute], disableRowClickSelection: ["disableRowClickSelection", "disableRowClickSelection", booleanAttribute], rowSelectionFormatter: "rowSelectionFormatter", rowClassFormatter: "rowClassFormatter", rowSelected: "rowSelected", cellSelectable: ["cellSelectable", "cellSelectable", booleanAttribute], showToolbar: ["showToolbar", "showToolbar", booleanAttribute], toolbarTitle: "toolbarTitle", toolbarTemplate: "toolbarTemplate", columnHideable: ["columnHideable", "columnHideable", booleanAttribute], columnHideableChecked: "columnHideableChecked", columnSortable: ["columnSortable", "columnSortable", booleanAttribute], columnPinnable: ["columnPinnable", "columnPinnable", booleanAttribute], columnPinOptions: "columnPinOptions", showColumnMenuButton: ["showColumnMenuButton", "showColumnMenuButton", booleanAttribute], columnMenuButtonText: "columnMenuButtonText", columnMenuButtonType: "columnMenuButtonType", columnMenuButtonColor: "columnMenuButtonColor", columnMenuButtonClass: "columnMenuButtonClass", columnMenuButtonIcon: "columnMenuButtonIcon", showColumnMenuHeader: ["showColumnMenuHeader", "showColumnMenuHeader", booleanAttribute], columnMenuHeaderText: "columnMenuHeaderText", columnMenuHeaderTemplate: "columnMenuHeaderTemplate", showColumnMenuFooter: ["showColumnMenuFooter", "showColumnMenuFooter", booleanAttribute], columnMenuFooterText: "columnMenuFooterText", columnMenuFooterTemplate: "columnMenuFooterTemplate", noResultText: "noResultText", noResultTemplate: "noResultTemplate", headerTemplate: "headerTemplate", headerExtraTemplate: "headerExtraTemplate", cellTemplate: "cellTemplate", useContentRowTemplate: ["useContentRowTemplate", "useContentRowTemplate", booleanAttribute], useContentHeaderRowTemplate: ["useContentHeaderRowTemplate", "useContentHeaderRowTemplate", booleanAttribute], useContentFooterRowTemplate: ["useContentFooterRowTemplate", "useContentFooterRowTemplate", booleanAttribute], showSummary: ["showSummary", "showSummary", booleanAttribute], summaryTemplate: "summaryTemplate", showSidebar: ["showSidebar", "showSidebar", booleanAttribute], sidebarTemplate: "sidebarTemplate", showStatusbar: ["showStatusbar", "showStatusbar", booleanAttribute], statusbarTemplate: "statusbarTemplate" }, outputs: { page: "page", sortChange: "sortChange", rowClick: "rowClick", rowContextMenu: "rowContextMenu", expansionChange: "expansionChange", rowSelectedChange: "rowSelectedChange", cellSelectedChange: "cellSelectedChange", columnChange: "columnChange" }, host: { classAttribute: "mtx-grid" }, queries: [{ propertyName: "rowDefs", predicate: MatRowDef }, { propertyName: "headerRowDefs", predicate: MatHeaderRowDef }, { propertyName: "footerRowDefs", predicate: MatFooterRow }], viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "columnMenu", first: true, predicate: ["columnMenu"], descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], exportAs: ["mtxGrid"], usesOnChanges: true, ngImport: i0, template: "<!-- Progress bar-->\n@if (loading) {\n <div class=\"mtx-grid-progress\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n}\n\n<!-- Toolbar -->\n@if (showToolbar) {\n <div class=\"mtx-grid-toolbar\">\n <div class=\"mtx-grid-toolbar-content\">\n @if (toolbarTemplate) {\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate\"></ng-template>\n } @else {\n @if (toolbarTitle) {\n <div class=\"mtx-grid-toolbar-title\">{{toolbarTitle}}</div>\n }\n }\n </div>\n <div class=\"mtx-grid-toolbar-actions\">\n @if (showColumnMenuButton) {\n <mtx-grid-column-menu #columnMenu\n [columns]=\"columns\"\n [buttonText]=\"columnMenuButtonText\"\n [buttonType]=\"columnMenuButtonType\"\n [buttonColor]=\"columnMenuButtonColor\"\n [buttonClass]=\"columnMenuButtonClass\"\n [buttonIcon]=\"columnMenuButtonIcon\"\n [selectable]=\"columnHideable\"\n [selectableChecked]=\"columnHideableChecked\"\n [sortable]=\"columnSortable\"\n [pinnable]=\"columnPinnable\"\n [showHeader]=\"showColumnMenuHeader\"\n [headerText]=\"columnMenuHeaderText\"\n [headerTemplate]=\"columnMenuHeaderTemplate\"\n [showFooter]=\"showColumnMenuFooter\"\n [footerText]=\"columnMenuFooterText\"\n [footerTemplate]=\"columnMenuFooterTemplate\"\n [pinOptions]=\"columnPinOptions\"\n (columnChange)=\"_onColumnChange($event)\">\n </mtx-grid-column-menu>\n }\n </div>\n </div>\n}\n\n<div class=\"mtx-grid-main mtx-grid-layout\">\n <!-- Table content -->\n <div class=\"mtx-grid-content mtx-grid-layout\">\n <div #tableContainer class=\"mat-table-container\" [class.mat-table-with-data]=\"!_hasNoResult\">\n @if (!columnResizable) {\n <table mat-table\n [class]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\n matSort\n [matSortActive]=\"sortActive\"\n [matSortDirection]=\"sortDirection\"\n [matSortDisableClear]=\"sortDisableClear\"\n [matSortDisabled]=\"sortDisabled\"\n [matSortStart]=\"sortStart\"\n (matSortChange)=\"_onSortChange($event)\"\n [trackBy]=\"trackBy\">\n @if (rowSelectable && !hideRowSelectionCheckbox) {\n <ng-container matColumnDef=\"MtxGridCheckboxColumnDef\">\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\n @if (multiSelectable) {\n <mat-checkbox\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\n </mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\n class=\"mtx-grid-checkbox-cell\">\n @if (!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))) {\n <mat-checkbox\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\n [checked]=\"rowSelection.isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\n </mat-checkbox>\n }\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\n </ng-container>\n }\n @for (col of columns; track col) {\n <ng-container [matColumnDef]=\"col.field\"\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\n <th mat-header-cell *matHeaderCellDef\n [class]=\"col | colClass\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\n <div class=\"mat-header-cell-inner\">\n @if (headerTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(headerTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\n [disabled]=\"!col.sortable\"\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\n [start]=\"col.sortProp?.start!\">\n @if (col.showExpand) {\n <span class=\"mtx-grid-expansion-placeholder\"></span>\n }\n <span>{{col.header | toObservable | async}}</span>\n @if (col.sortable) {\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" viewBox=\"0 0 24 24\"\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\" />\n </svg>\n }\n </div>\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\n </ng-template>\n }\n }\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\n [class]=\"col | colClass: row: rowChangeRecord: rowChangeRecord?.currentValue\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\"\n mtx-grid-selectable-cell [cellSelectable]=\"cellSelectable\"\n (cellSelectedChange)=\"_selectCell($event, row, col)\">\n @if (cellTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(cellTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if (col.cellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.cellTemplate!\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if (col.showExpand) {\n <button class=\"mtx-grid-row-expand-button\"\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n }\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\n (rowDataChange)=\"_onRowDataChange($event)\"></mtx-grid-cell>\n }\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\n @if (col.showExpand) {\n <span class=\"mtx-grid-expansion-placeholder\"></span>\n }\n @if (summaryTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\n </ng-template>\n } @else {\n @if ($any(summaryTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\n </ng-template>\n } @else {\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder\"></mtx-grid-cell>\n }\n }\n </td>\n </ng-container>\n }\n @if (!useContentHeaderRowTemplate) {\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n }\n @if (!useContentRowTemplate) {\n <tr mat-row\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\n [class.selected]=\"rowSelection.isSelected(row)\"\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\"\n (contextmenu)=\"_contextmenu($event, row, _getIndex(index, dataIndex))\">\n </tr>\n }\n @if (_whetherShowSummary) {\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\n }\n @if (expandable) {\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\n [attr.colspan]=\"displayedColumns.length\">\n <div class=\"mtx-grid-expansion-detail\"\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\n </ng-template>\n </div>\n </td>\n </ng-container>\n <tr mat-row\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\n class=\"mtx-grid-expansion\"\n [class]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\n </tr>\n }\n </table>\n } @else {\n <!-- TODO: Use flexbox-based mat-table -->\n <table mat-table\n columnResize\n [class]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\n matSort\n [matSortActive]=\"sortActive\"\n [matSortDirection]=\"sortDirection\"\n [matSortDisableClear]=\"sortDisableClear\"\n [matSortDisabled]=\"sortDisabled\"\n [matSortStart]=\"sortStart\"\n (matSortChange)=\"_onSortChange($event)\"\n [trackBy]=\"trackBy\">\n @if (rowSelectable && !hideRowSelectionCheckbox) {\n <ng-container matColumnDef=\"MtxGridCheckboxColumnDef\">\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\n @if (multiSelectable) {\n <mat-checkbox\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\n </mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\n class=\"mtx-grid-checkbox-cell\">\n @if (!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))) {\n <mat-checkbox\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\n [checked]=\"rowSelection.isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\n </mat-checkbox>\n }\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\n </ng-container>\n }\n @for (col of columns; track col) {\n <ng-container [matColumnDef]=\"col.field\"\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\n <th mat-header-cell *matHeaderCellDef\n [class]=\"col | colClass\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\n [resizable]=\"col.resizable\"\n [matResizableMinWidthPx]=\"col.minWidth\" [matResizableMaxWidthPx]=\"col.maxWidth\">\n <div class=\"mat-header-cell-inner\">\n @if (headerTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(headerTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\n [disabled]=\"!col.sortable\"\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\n [start]=\"col.sortProp?.start!\">\n @if (col.showExpand) {\n <span class=\"mtx-grid-expansion-placeholder\"></span>\n }\n <span>{{col.header | toObservable | async}}</span>\n @if (col.sortable) {\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" viewBox=\"0 0 24 24\"\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\" />\n </svg>\n }\n </div>\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\n </ng-template>\n }\n }\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\n [class]=\"col | colClass: row: rowChangeRecord :rowChangeRecord?.currentValue\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\n mtx-grid-selectable-cell [cellSelectable]=\"cellSelectable\"\n (cellSelectedChange)=\"_selectCell($event, row, col)\">\n @if (cellTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(cellTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if (col.cellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.cellTemplate!\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if (col.showExpand) {\n <button class=\"mtx-grid-row-expand-button\"\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n }\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\n (rowDataChange)=\"_onRowDataChange($event)\"></mtx-grid-cell>\n }\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'left': col.left, 'right': col.right}\">\n @if (col.showExpand) {\n <span class=\"mtx-grid-expansion-placeholder\"></span>\n }\n @if (summaryTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\n </ng-template>\n } @else {\n @if ($any(summaryTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\n </ng-template>\n } @else {\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder\"></mtx-grid-cell>\n }\n }\n </td>\n </ng-container>\n }\n @if (!useContentHeaderRowTemplate) {\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n }\n @if (!useContentRowTemplate) {\n <tr mat-row\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\n [class.selected]=\"rowSelection.isSelected(row)\"\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\"\n (contextmenu)=\"_contextmenu($event, row, _getIndex(index, dataIndex))\">\n </tr>\n }\n @if (_whetherShowSummary) {\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\n }\n @if (expandable) {\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\n [attr.colspan]=\"displayedColumns.length\">\n <div class=\"mtx-grid-expansion-detail\"\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\n </ng-template>\n </div>\n </td>\n </ng-container>\n <tr mat-row\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\n class=\"mtx-grid-expansion\"\n [class]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\n </tr>\n }\n </table>\n }\n </div>\n\n <!-- No result -->\n @if (_hasNoResult) {\n <div class=\"mtx-grid-no-result\">\n @if (noResultTemplate) {\n <ng-template [ngTemplateOutlet]=\"noResultTemplate\"></ng-template>\n } @else {\n {{noResultText}}\n }\n </div>\n }\n </div>\n\n <!-- Tool sidebar -->\n @if (showSidebar) {\n <div class=\"mtx-grid-sidebar\">\n @if (sidebarTemplate) {\n <ng-template [ngTemplateOutlet]=\"sidebarTemplate\"></ng-template>\n }\n </div>\n }\n</div>\n\n<div class=\"mtx-grid-footer\">\n <!-- Status Bar -->\n @if (showStatusbar) {\n <div class=\"mtx-grid-statusbar\">\n @if (statusbarTemplate) {\n <ng-template [ngTemplateOutlet]=\"statusbarTemplate\"></ng-template>\n }\n </div>\n }\n\n <!-- Pagination -->\n <div class=\"mtx-grid-pagination\">\n @if (paginationTemplate) {\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\n } @else {\n <mat-paginator [class.mat-paginator-hidden]=\"!showPaginator\"\n [showFirstLastButtons]=\"showFirstLastButtons\"\n [length]=\"length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [hidePageSize]=\"hidePageSize\"\n (page)=\"_onPage($event)\"\n [disabled]=\"pageDisabled\">\n </mat-paginator>\n }\n </div>\n</div>\n\n<!-- Header template for extra content -->\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\n @if (headerExtraTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(headerExtraTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n }\n }\n</ng-template>\n", styles: [".mtx-grid{position:relative;display:flex;flex-direction:column;width:100%;overflow:hidden;border:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant));border-radius:var(--mtx-grid-container-shape, var(--mat-app-corner-medium))}.mtx-grid .mat-mdc-table{--mat-table-row-item-outline-color: var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}.mtx-grid .mat-mdc-table.mat-table-striped .mat-row-odd{background-color:var(--mtx-grid-table-row-striped-background-color, var(--mat-app-surface-container))}.mtx-grid .mat-mdc-table.mat-table-hover .mat-mdc-row:hover{background-color:var(--mtx-grid-table-row-hover-background-color, var(--mat-app-secondary-container))}.mtx-grid .mat-mdc-table.mat-table-hover .mat-mdc-row.selected:hover{background-color:var(--mtx-grid-table-row-selected-hover-background-color, var(--mat-app-primary-container))}.mtx-grid .mat-mdc-table .mat-mdc-row.selected{background-color:var(--mtx-grid-table-row-selected-background-color, var(--mat-app-secondary-container))}.mtx-grid .mat-mdc-table .mat-mdc-cell.selected{box-shadow:inset 0 0 0 1px var(--mtx-grid-table-cell-selected-outline-color, var(--mat-app-primary))}.mtx-grid .mat-table-container{overflow:auto}.mtx-grid .mat-table-container.mat-table-with-data{flex:1}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-header-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-footer-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-cell:not(.mtx-grid-checkbox-cell){min-width:var(--mtx-grid-table-cell-min-width)}.mtx-grid .mat-table-sticky-left{border-right:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .mtx-grid .mat-table-sticky-left{border-right-width:0;border-left:1px solid var(--mat-table-row-item-outline-color)}.mtx-grid .mat-table-sticky-right{border-left:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .mtx-grid .mat-table-sticky-right{border-left-width:0;border-right:1px solid var(--mat-table-row-item-outline-color)}.mtx-grid .mat-mdc-footer-cell{border-top:1px solid var(--mat-table-row-item-outline-color);background-color:var(--mtx-grid-table-footer-background-color, var(--mat-app-surface-container))}.mtx-grid .mat-mdc-row.mtx-grid-expansion{height:0;overflow:hidden}.mtx-grid .mat-mdc-row.mtx-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.mtx-grid .mat-mdc-row.mtx-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.mtx-grid .mat-sort-header-icon{margin-left:4px}[dir=rtl] .mtx-grid .mat-sort-header-icon{margin-left:0;margin-right:4px}.mtx-grid .mat-header-cell-inner{display:inline-flex;align-items:center;vertical-align:middle}.mtx-grid .mat-mdc-paginator{border-top:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant));border-bottom-left-radius:var(--mtx-grid-container-shape, var(--mat-app-corner-medium));border-bottom-right-radius:var(--mtx-grid-container-shape, var(--mat-app-corner-medium))}.mtx-grid .mat-paginator-hidden{display:none}.mtx-grid .mtx-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mdc-checkbox-state-layer-size)) / 2)}.mtx-grid-progress{position:absolute;top:0;z-index:120;width:100%}.mtx-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:var(--mat-table-header-container-height);padding:8px;box-sizing:border-box;border-bottom:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}.mtx-grid-toolbar-content{flex:1;width:0;padding:0 8px}.mtx-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.mtx-grid-content{flex-direction:column;width:0}.mtx-grid-sidebar{max-width:50%;border-left:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}[dir=rtl] .mtx-grid-sidebar{border-left-width:0;border-right:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}.mtx-grid-footer{position:relative;z-index:1}.mtx-grid-statusbar{display:flex;align-items:center;min-height:var(--mat-table-header-container-height);padding:8px;box-sizing:border-box;border-top:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}.mtx-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.mtx-grid-expansion-placeholder{display:inline-block;vertical-align:middle;width:var(--mdc-icon-button-state-layer-size, var(--mtx-grid-row-expand-button-size));height:var(--mdc-icon-button-state-layer-size, var(--mtx-grid-row-expand-button-size))}.mtx-grid-expansion-detail{display:flex;align-items:center;min-height:var(--mat-table-row-item-container-height);overflow:hidden}.mtx-grid-row-expand-button.expanded .mtx-grid-row-expand-icon{transform:rotate(90deg)}.mtx-grid-row-expand-button.mat-mdc-icon-button,.mtx-grid-row-expand-button+mtx-grid-cell{vertical-align:middle}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "component", type: MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "directive", type: MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: MatResizable, selector: "mat-header-cell[resizable], th[mat-header-cell][resizable]", inputs: ["matResizableMinWidthPx", "matResizableMaxWidthPx", "resizable"] }, { kind: "directive", type: MatColumnResize, selector: "table[mat-table][columnResize]" }, { kind: "component", type: MtxGridCell, selector: "mtx-grid-cell", inputs: ["rowData", "colDef", "data", "summary", "placeholder"], outputs: ["rowDataChange"], exportAs: ["mtxGridCell"] }, { kind: "component", type: MtxGridColumnMenu, selector: "mtx-grid-column-menu", inputs: ["columns", "selectable", "selectableChecked", "sortable", "pinnable", "buttonText", "buttonType", "buttonColor", "buttonClass", "buttonIcon", "showHeader", "headerText", "headerTemplate", "showFooter", "footerText", "footerTemplate", "pinOptions"], outputs: ["columnChange"], exportAs: ["mtxGridColumnMenu"] }, { kind: "directive", type: MtxGridSelectableCell, selector: "[mtx-grid-selectable-cell]", inputs: ["cellSelectable"], outputs: ["cellSelectedChange"] }, { kind: "directive", type: MtxGridExpansionToggle, selector: "[mtx-grid-expansion-toggle]", inputs: ["opened", "expandableRow", "expansionRowTpl"], outputs: ["openedChange", "toggleChange"] }, { kind: "pipe", type: MtxIsTemplateRefPipe, name: "isTemplateRef" }, { kind: "pipe", type: MtxGridColClassPipe, name: "colClass" }, { kind: "pipe", type: MtxGridRowClassPipe, name: "rowClass" }, { kind: "pipe", type: MtxToObservablePipe, name: "toObservable" }], animations: [
|
|
373
|
-
trigger('expansion', [
|
|
374
|
-
state('collapsed, void', style({ height: '0', minHeight: '0', visibility: 'hidden' })),
|
|
375
|
-
state('expanded', style({ height: '*', visibility: 'visible' })),
|
|
376
|
-
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
377
|
-
transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
378
|
-
]),
|
|
379
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
380
|
-
}
|
|
381
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MtxGrid, decorators: [{
|
|
382
|
-
type: Component,
|
|
383
|
-
args: [{ selector: 'mtx-grid', exportAs: 'mtxGrid', host: {
|
|
384
|
-
class: 'mtx-grid',
|
|
385
|
-
}, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, animations: [
|
|
386
|
-
trigger('expansion', [
|
|
387
|
-
state('collapsed, void', style({ height: '0', minHeight: '0', visibility: 'hidden' })),
|
|
388
|
-
state('expanded', style({ height: '*', visibility: 'visible' })),
|
|
389
|
-
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
390
|
-
transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
391
|
-
]),
|
|
392
|
-
], standalone: true, imports: [
|
|
393
|
-
AsyncPipe,
|
|
394
|
-
NgTemplateOutlet,
|
|
395
|
-
MatProgressBar,
|
|
396
|
-
MatIconButton,
|
|
397
|
-
MatCheckbox,
|
|
398
|
-
MatTable,
|
|
399
|
-
MatColumnDef,
|
|
400
|
-
MatHeaderRowDef,
|
|
401
|
-
MatHeaderRow,
|
|
402
|
-
MatRowDef,
|
|
403
|
-
MatRow,
|
|
404
|
-
MatFooterRowDef,
|
|
405
|
-
MatFooterRow,
|
|
406
|
-
MatHeaderCellDef,
|
|
407
|
-
MatHeaderCell,
|
|
408
|
-
MatCellDef,
|
|
409
|
-
MatCell,
|
|
410
|
-
MatFooterCellDef,
|
|
411
|
-
MatFooterCell,
|
|
412
|
-
MatSort,
|
|
413
|
-
MatSortHeader,
|
|
414
|
-
MatPaginator,
|
|
415
|
-
MatResizable,
|
|
416
|
-
MatColumnResize,
|
|
417
|
-
MtxGridCell,
|
|
418
|
-
MtxGridColumnMenu,
|
|
419
|
-
MtxGridSelectableCell,
|
|
420
|
-
MtxGridExpansionToggle,
|
|
421
|
-
MtxIsTemplateRefPipe,
|
|
422
|
-
MtxGridColClassPipe,
|
|
423
|
-
MtxGridRowClassPipe,
|
|
424
|
-
MtxToObservablePipe,
|
|
425
|
-
], template: "<!-- Progress bar-->\n@if (loading) {\n <div class=\"mtx-grid-progress\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n}\n\n<!-- Toolbar -->\n@if (showToolbar) {\n <div class=\"mtx-grid-toolbar\">\n <div class=\"mtx-grid-toolbar-content\">\n @if (toolbarTemplate) {\n <ng-template [ngTemplateOutlet]=\"toolbarTemplate\"></ng-template>\n } @else {\n @if (toolbarTitle) {\n <div class=\"mtx-grid-toolbar-title\">{{toolbarTitle}}</div>\n }\n }\n </div>\n <div class=\"mtx-grid-toolbar-actions\">\n @if (showColumnMenuButton) {\n <mtx-grid-column-menu #columnMenu\n [columns]=\"columns\"\n [buttonText]=\"columnMenuButtonText\"\n [buttonType]=\"columnMenuButtonType\"\n [buttonColor]=\"columnMenuButtonColor\"\n [buttonClass]=\"columnMenuButtonClass\"\n [buttonIcon]=\"columnMenuButtonIcon\"\n [selectable]=\"columnHideable\"\n [selectableChecked]=\"columnHideableChecked\"\n [sortable]=\"columnSortable\"\n [pinnable]=\"columnPinnable\"\n [showHeader]=\"showColumnMenuHeader\"\n [headerText]=\"columnMenuHeaderText\"\n [headerTemplate]=\"columnMenuHeaderTemplate\"\n [showFooter]=\"showColumnMenuFooter\"\n [footerText]=\"columnMenuFooterText\"\n [footerTemplate]=\"columnMenuFooterTemplate\"\n [pinOptions]=\"columnPinOptions\"\n (columnChange)=\"_onColumnChange($event)\">\n </mtx-grid-column-menu>\n }\n </div>\n </div>\n}\n\n<div class=\"mtx-grid-main mtx-grid-layout\">\n <!-- Table content -->\n <div class=\"mtx-grid-content mtx-grid-layout\">\n <div #tableContainer class=\"mat-table-container\" [class.mat-table-with-data]=\"!_hasNoResult\">\n @if (!columnResizable) {\n <table mat-table\n [class]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\n matSort\n [matSortActive]=\"sortActive\"\n [matSortDirection]=\"sortDirection\"\n [matSortDisableClear]=\"sortDisableClear\"\n [matSortDisabled]=\"sortDisabled\"\n [matSortStart]=\"sortStart\"\n (matSortChange)=\"_onSortChange($event)\"\n [trackBy]=\"trackBy\">\n @if (rowSelectable && !hideRowSelectionCheckbox) {\n <ng-container matColumnDef=\"MtxGridCheckboxColumnDef\">\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\n @if (multiSelectable) {\n <mat-checkbox\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\n </mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\n class=\"mtx-grid-checkbox-cell\">\n @if (!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))) {\n <mat-checkbox\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\n [checked]=\"rowSelection.isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\n </mat-checkbox>\n }\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\n </ng-container>\n }\n @for (col of columns; track col) {\n <ng-container [matColumnDef]=\"col.field\"\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\n <th mat-header-cell *matHeaderCellDef\n [class]=\"col | colClass\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\n <div class=\"mat-header-cell-inner\">\n @if (headerTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(headerTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\n [disabled]=\"!col.sortable\"\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\n [start]=\"col.sortProp?.start!\">\n @if (col.showExpand) {\n <span class=\"mtx-grid-expansion-placeholder\"></span>\n }\n <span>{{col.header | toObservable | async}}</span>\n @if (col.sortable) {\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" viewBox=\"0 0 24 24\"\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\" />\n </svg>\n }\n </div>\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\n </ng-template>\n }\n }\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\n [class]=\"col | colClass: row: rowChangeRecord: rowChangeRecord?.currentValue\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\"\n mtx-grid-selectable-cell [cellSelectable]=\"cellSelectable\"\n (cellSelectedChange)=\"_selectCell($event, row, col)\">\n @if (cellTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(cellTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if (col.cellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.cellTemplate!\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if (col.showExpand) {\n <button class=\"mtx-grid-row-expand-button\"\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n }\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\n (rowDataChange)=\"_onRowDataChange($event)\"></mtx-grid-cell>\n }\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'min-width': col.width, 'left': col.left, 'right': col.right}\">\n @if (col.showExpand) {\n <span class=\"mtx-grid-expansion-placeholder\"></span>\n }\n @if (summaryTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\n </ng-template>\n } @else {\n @if ($any(summaryTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\n </ng-template>\n } @else {\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder\"></mtx-grid-cell>\n }\n }\n </td>\n </ng-container>\n }\n @if (!useContentHeaderRowTemplate) {\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n }\n @if (!useContentRowTemplate) {\n <tr mat-row\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\n [class.selected]=\"rowSelection.isSelected(row)\"\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\"\n (contextmenu)=\"_contextmenu($event, row, _getIndex(index, dataIndex))\">\n </tr>\n }\n @if (_whetherShowSummary) {\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\n }\n @if (expandable) {\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\n [attr.colspan]=\"displayedColumns.length\">\n <div class=\"mtx-grid-expansion-detail\"\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\n </ng-template>\n </div>\n </td>\n </ng-container>\n <tr mat-row\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\n class=\"mtx-grid-expansion\"\n [class]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\n </tr>\n }\n </table>\n } @else {\n <!-- TODO: Use flexbox-based mat-table -->\n <table mat-table\n columnResize\n [class]=\"{'mat-table-hover': rowHover, 'mat-table-striped': rowStriped, 'mat-table-expandable': expandable}\"\n [dataSource]=\"dataSource\" [multiTemplateDataRows]=\"expandable\"\n matSort\n [matSortActive]=\"sortActive\"\n [matSortDirection]=\"sortDirection\"\n [matSortDisableClear]=\"sortDisableClear\"\n [matSortDisabled]=\"sortDisabled\"\n [matSortStart]=\"sortStart\"\n (matSortChange)=\"_onSortChange($event)\"\n [trackBy]=\"trackBy\">\n @if (rowSelectable && !hideRowSelectionCheckbox) {\n <ng-container matColumnDef=\"MtxGridCheckboxColumnDef\">\n <th mat-header-cell *matHeaderCellDef class=\"mtx-grid-checkbox-cell\">\n @if (multiSelectable) {\n <mat-checkbox\n [checked]=\"rowSelection.hasValue() && _isAllSelected()\"\n [indeterminate]=\"rowSelection.hasValue() && !_isAllSelected()\"\n (change)=\"$event ? _toggleMasterCheckbox() : null\">\n </mat-checkbox>\n }\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\n class=\"mtx-grid-checkbox-cell\">\n @if (!(rowSelectionFormatter.hideCheckbox && rowSelectionFormatter.hideCheckbox(row, _getIndex(index, dataIndex)))) {\n <mat-checkbox\n [disabled]=\"rowSelectionFormatter.disabled && rowSelectionFormatter.disabled(row, _getIndex(index, dataIndex))\"\n [checked]=\"rowSelection.isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? _toggleNormalCheckbox(row) : null\">\n </mat-checkbox>\n }\n </td>\n <td mat-footer-cell *matFooterCellDef class=\"mtx-grid-checkbox-cell\"></td>\n </ng-container>\n }\n @for (col of columns; track col) {\n <ng-container [matColumnDef]=\"col.field\"\n [sticky]=\"col.pinned==='left'\" [stickyEnd]=\"col.pinned==='right'\">\n <th mat-header-cell *matHeaderCellDef\n [class]=\"col | colClass\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\n [resizable]=\"col.resizable\"\n [matResizableMinWidthPx]=\"col.minWidth\" [matResizableMaxWidthPx]=\"col.maxWidth\">\n <div class=\"mat-header-cell-inner\">\n @if (headerTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(headerTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(headerTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n <div [mat-sort-header]=\"col.sortProp?.id || col.field\"\n [disabled]=\"!col.sortable\"\n [disableClear]=\"col.sortProp?.disableClear ?? sortDisableClear\"\n [arrowPosition]=\"col.sortProp?.arrowPosition!\"\n [start]=\"col.sortProp?.start!\">\n @if (col.showExpand) {\n <span class=\"mtx-grid-expansion-placeholder\"></span>\n }\n <span>{{col.header | toObservable | async}}</span>\n @if (col.sortable) {\n <svg class=\"mtx-grid-icon mat-sort-header-icon\" viewBox=\"0 0 24 24\"\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path d=\"M3,13H15V11H3M3,6V8H21V6M3,18H9V16H3V18Z\" />\n </svg>\n }\n </div>\n <ng-template [ngTemplateOutlet]=\"headerExtraTplBase\"\n [ngTemplateOutletContext]=\"{ $implicit: headerExtraTemplate, colDef: col }\">\n </ng-template>\n }\n }\n </div>\n </th>\n <td mat-cell *matCellDef=\"let row; let index = index; let dataIndex = dataIndex;\"\n [class]=\"col | colClass: row: rowChangeRecord :rowChangeRecord?.currentValue\"\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'left': col.left, 'right': col.right}\"\n mtx-grid-selectable-cell [cellSelectable]=\"cellSelectable\"\n (cellSelectedChange)=\"_selectCell($event, row, col)\">\n @if (cellTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(cellTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(cellTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if (col.cellTemplate) {\n <ng-template\n [ngTemplateOutlet]=\"col.cellTemplate!\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: _getIndex(index, dataIndex), colDef: col }\">\n </ng-template>\n } @else {\n @if (col.showExpand) {\n <button class=\"mtx-grid-row-expand-button\"\n mat-icon-button mtx-grid-expansion-toggle type=\"button\"\n [(opened)]=\"expansionRowStates[dataIndex].expanded\"\n (toggleChange)=\"_onExpansionChange($event, row, col, dataIndex);\">\n <svg class=\"mtx-grid-icon mtx-grid-row-expand-icon\" viewBox=\"0 0 24 24\"\n width=\"24px\" height=\"24px\" fill=\"currentColor\" focusable=\"false\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n }\n <mtx-grid-cell [rowData]=\"row\" [colDef]=\"col\" [placeholder]=\"emptyValuePlaceholder\"\n (rowDataChange)=\"_onRowDataChange($event)\"></mtx-grid-cell>\n }\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef\n [class.mat-table-sticky-left]=\"col.pinned === 'left'\"\n [class.mat-table-sticky-right]=\"col.pinned === 'right'\"\n [style]=\"{'width': col.width, 'left': col.left, 'right': col.right}\">\n @if (col.showExpand) {\n <span class=\"mtx-grid-expansion-placeholder\"></span>\n }\n @if (summaryTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col, data: data }\">\n </ng-template>\n } @else {\n @if ($any(summaryTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"$any(summaryTemplate)[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: _getColData(data, col), colData: _getColData(data, col), colDef: col }\">\n </ng-template>\n } @else {\n <mtx-grid-cell [summary]=\"true\" [data]=\"data\" [colDef]=\"col\"\n [placeholder]=\"emptyValuePlaceholder\"></mtx-grid-cell>\n }\n }\n </td>\n </ng-container>\n }\n @if (!useContentHeaderRowTemplate) {\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n }\n @if (!useContentRowTemplate) {\n <tr mat-row\n *matRowDef=\"let row; let index = index; let dataIndex = dataIndex; columns: displayedColumns;\"\n [class]=\"row | rowClass: index: dataIndex: rowClassFormatter\"\n [class.selected]=\"rowSelection.isSelected(row)\"\n (click)=\"_selectRow($event, row, _getIndex(index, dataIndex))\"\n (contextmenu)=\"_contextmenu($event, row, _getIndex(index, dataIndex))\">\n </tr>\n }\n @if (_whetherShowSummary) {\n <tr mat-footer-row *matFooterRowDef=\"displayedColumns; sticky: true\"></tr>\n }\n @if (expandable) {\n <!-- Expanded Content Column - The expandable row is made up of this one column that spans across all columns -->\n <ng-container matColumnDef=\"MtxGridExpansionColumnDef\">\n <td mat-cell *matCellDef=\"let row; let dataIndex = dataIndex\"\n [attr.colspan]=\"displayedColumns.length\">\n <div class=\"mtx-grid-expansion-detail\"\n [@expansion]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\n <ng-template [ngTemplateOutlet]=\"expansionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row, rowData: row, index: dataIndex, expanded: expansionRowStates[dataIndex].expanded }\">\n </ng-template>\n </div>\n </td>\n </ng-container>\n <tr mat-row\n *matRowDef=\"let row; columns: ['MtxGridExpansionColumnDef']; let dataIndex = dataIndex\"\n class=\"mtx-grid-expansion\"\n [class]=\"expansionRowStates[dataIndex].expanded ? 'expanded' : 'collapsed'\">\n </tr>\n }\n </table>\n }\n </div>\n\n <!-- No result -->\n @if (_hasNoResult) {\n <div class=\"mtx-grid-no-result\">\n @if (noResultTemplate) {\n <ng-template [ngTemplateOutlet]=\"noResultTemplate\"></ng-template>\n } @else {\n {{noResultText}}\n }\n </div>\n }\n </div>\n\n <!-- Tool sidebar -->\n @if (showSidebar) {\n <div class=\"mtx-grid-sidebar\">\n @if (sidebarTemplate) {\n <ng-template [ngTemplateOutlet]=\"sidebarTemplate\"></ng-template>\n }\n </div>\n }\n</div>\n\n<div class=\"mtx-grid-footer\">\n <!-- Status Bar -->\n @if (showStatusbar) {\n <div class=\"mtx-grid-statusbar\">\n @if (statusbarTemplate) {\n <ng-template [ngTemplateOutlet]=\"statusbarTemplate\"></ng-template>\n }\n </div>\n }\n\n <!-- Pagination -->\n <div class=\"mtx-grid-pagination\">\n @if (paginationTemplate) {\n <ng-template [ngTemplateOutlet]=\"paginationTemplate\"></ng-template>\n } @else {\n <mat-paginator [class.mat-paginator-hidden]=\"!showPaginator\"\n [showFirstLastButtons]=\"showFirstLastButtons\"\n [length]=\"length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [hidePageSize]=\"hidePageSize\"\n (page)=\"_onPage($event)\"\n [disabled]=\"pageDisabled\">\n </mat-paginator>\n }\n </div>\n</div>\n\n<!-- Header template for extra content -->\n<ng-template #headerExtraTplBase let-headerExtraTemplate let-col=\"colDef\">\n @if (headerExtraTemplate | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n } @else {\n @if ($any(headerExtraTemplate)?.[col.field] | isTemplateRef) {\n <ng-template [ngTemplateOutlet]=\"headerExtraTemplate[col.field]\"\n [ngTemplateOutletContext]=\"{ $implicit: col, colDef: col }\">\n </ng-template>\n }\n }\n</ng-template>\n", styles: [".mtx-grid{position:relative;display:flex;flex-direction:column;width:100%;overflow:hidden;border:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant));border-radius:var(--mtx-grid-container-shape, var(--mat-app-corner-medium))}.mtx-grid .mat-mdc-table{--mat-table-row-item-outline-color: var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}.mtx-grid .mat-mdc-table.mat-table-striped .mat-row-odd{background-color:var(--mtx-grid-table-row-striped-background-color, var(--mat-app-surface-container))}.mtx-grid .mat-mdc-table.mat-table-hover .mat-mdc-row:hover{background-color:var(--mtx-grid-table-row-hover-background-color, var(--mat-app-secondary-container))}.mtx-grid .mat-mdc-table.mat-table-hover .mat-mdc-row.selected:hover{background-color:var(--mtx-grid-table-row-selected-hover-background-color, var(--mat-app-primary-container))}.mtx-grid .mat-mdc-table .mat-mdc-row.selected{background-color:var(--mtx-grid-table-row-selected-background-color, var(--mat-app-secondary-container))}.mtx-grid .mat-mdc-table .mat-mdc-cell.selected{box-shadow:inset 0 0 0 1px var(--mtx-grid-table-cell-selected-outline-color, var(--mat-app-primary))}.mtx-grid .mat-table-container{overflow:auto}.mtx-grid .mat-table-container.mat-table-with-data{flex:1}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table){min-width:100%;border-collapse:separate}.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-header-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-footer-cell:not(.mtx-grid-checkbox-cell),.mtx-grid .mat-mdc-table:not(.mat-column-resize-table) .mat-mdc-cell:not(.mtx-grid-checkbox-cell){min-width:var(--mtx-grid-table-cell-min-width)}.mtx-grid .mat-table-sticky-left{border-right:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .mtx-grid .mat-table-sticky-left{border-right-width:0;border-left:1px solid var(--mat-table-row-item-outline-color)}.mtx-grid .mat-table-sticky-right{border-left:1px solid var(--mat-table-row-item-outline-color)}[dir=rtl] .mtx-grid .mat-table-sticky-right{border-left-width:0;border-right:1px solid var(--mat-table-row-item-outline-color)}.mtx-grid .mat-mdc-footer-cell{border-top:1px solid var(--mat-table-row-item-outline-color);background-color:var(--mtx-grid-table-footer-background-color, var(--mat-app-surface-container))}.mtx-grid .mat-mdc-row.mtx-grid-expansion{height:0;overflow:hidden}.mtx-grid .mat-mdc-row.mtx-grid-expansion .mat-mdc-cell{padding-top:0;padding-bottom:0}.mtx-grid .mat-mdc-row.mtx-grid-expansion.collapsed .mat-mdc-cell{border-bottom-width:0}.mtx-grid .mat-sort-header-icon{margin-left:4px}[dir=rtl] .mtx-grid .mat-sort-header-icon{margin-left:0;margin-right:4px}.mtx-grid .mat-header-cell-inner{display:inline-flex;align-items:center;vertical-align:middle}.mtx-grid .mat-mdc-paginator{border-top:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant));border-bottom-left-radius:var(--mtx-grid-container-shape, var(--mat-app-corner-medium));border-bottom-right-radius:var(--mtx-grid-container-shape, var(--mat-app-corner-medium))}.mtx-grid .mat-paginator-hidden{display:none}.mtx-grid .mtx-grid-checkbox-cell{width:60px;min-width:60px;padding:0 calc((60px - var(--mdc-checkbox-state-layer-size)) / 2)}.mtx-grid-progress{position:absolute;top:0;z-index:120;width:100%}.mtx-grid-toolbar{display:flex;justify-content:space-between;align-items:center;min-height:var(--mat-table-header-container-height);padding:8px;box-sizing:border-box;border-bottom:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}.mtx-grid-toolbar-content{flex:1;width:0;padding:0 8px}.mtx-grid-layout{display:flex;flex:1 1 auto;overflow:auto}.mtx-grid-content{flex-direction:column;width:0}.mtx-grid-sidebar{max-width:50%;border-left:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}[dir=rtl] .mtx-grid-sidebar{border-left-width:0;border-right:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}.mtx-grid-footer{position:relative;z-index:1}.mtx-grid-statusbar{display:flex;align-items:center;min-height:var(--mat-table-header-container-height);padding:8px;box-sizing:border-box;border-top:1px solid var(--mtx-grid-outline-color, var(--mat-app-outline-variant))}.mtx-grid-no-result{display:flex;justify-content:center;align-items:center;flex:1;min-height:150px}.mtx-grid-expansion-placeholder{display:inline-block;vertical-align:middle;width:var(--mdc-icon-button-state-layer-size, var(--mtx-grid-row-expand-button-size));height:var(--mdc-icon-button-state-layer-size, var(--mtx-grid-row-expand-button-size))}.mtx-grid-expansion-detail{display:flex;align-items:center;min-height:var(--mat-table-row-item-container-height);overflow:hidden}.mtx-grid-row-expand-button.expanded .mtx-grid-row-expand-icon{transform:rotate(90deg)}.mtx-grid-row-expand-button.mat-mdc-icon-button,.mtx-grid-row-expand-button+mtx-grid-cell{vertical-align:middle}\n"] }]
|
|
426
|
-
}], ctorParameters: () => [{ type: i1.MtxGridUtils }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
|
427
|
-
type: Optional
|
|
428
|
-
}, {
|
|
429
|
-
type: Inject,
|
|
430
|
-
args: [MTX_GRID_DEFAULT_OPTIONS]
|
|
431
|
-
}] }], propDecorators: { table: [{
|
|
432
|
-
type: ViewChild,
|
|
433
|
-
args: [MatTable]
|
|
434
|
-
}], paginator: [{
|
|
435
|
-
type: ViewChild,
|
|
436
|
-
args: [MatPaginator]
|
|
437
|
-
}], sort: [{
|
|
438
|
-
type: ViewChild,
|
|
439
|
-
args: [MatSort]
|
|
440
|
-
}], rowDefs: [{
|
|
441
|
-
type: ContentChildren,
|
|
442
|
-
args: [MatRowDef]
|
|
443
|
-
}], headerRowDefs: [{
|
|
444
|
-
type: ContentChildren,
|
|
445
|
-
args: [MatHeaderRowDef]
|
|
446
|
-
}], footerRowDefs: [{
|
|
447
|
-
type: ContentChildren,
|
|
448
|
-
args: [MatFooterRow]
|
|
449
|
-
}], columnMenu: [{
|
|
450
|
-
type: ViewChild,
|
|
451
|
-
args: ['columnMenu']
|
|
452
|
-
}], tableContainer: [{
|
|
453
|
-
type: ViewChild,
|
|
454
|
-
args: ['tableContainer']
|
|
455
|
-
}], displayedColumns: [{
|
|
456
|
-
type: Input
|
|
457
|
-
}], columns: [{
|
|
458
|
-
type: Input
|
|
459
|
-
}], data: [{
|
|
460
|
-
type: Input
|
|
461
|
-
}], length: [{
|
|
462
|
-
type: Input
|
|
463
|
-
}], loading: [{
|
|
464
|
-
type: Input,
|
|
465
|
-
args: [{ transform: booleanAttribute }]
|
|
466
|
-
}], trackBy: [{
|
|
467
|
-
type: Input
|
|
468
|
-
}], columnResizable: [{
|
|
469
|
-
type: Input,
|
|
470
|
-
args: [{ transform: booleanAttribute }]
|
|
471
|
-
}], emptyValuePlaceholder: [{
|
|
472
|
-
type: Input
|
|
473
|
-
}], pageOnFront: [{
|
|
474
|
-
type: Input,
|
|
475
|
-
args: [{ transform: booleanAttribute }]
|
|
476
|
-
}], showPaginator: [{
|
|
477
|
-
type: Input,
|
|
478
|
-
args: [{ transform: booleanAttribute }]
|
|
479
|
-
}], pageDisabled: [{
|
|
480
|
-
type: Input,
|
|
481
|
-
args: [{ transform: booleanAttribute }]
|
|
482
|
-
}], showFirstLastButtons: [{
|
|
483
|
-
type: Input,
|
|
484
|
-
args: [{ transform: booleanAttribute }]
|
|
485
|
-
}], pageIndex: [{
|
|
486
|
-
type: Input
|
|
487
|
-
}], pageSize: [{
|
|
488
|
-
type: Input
|
|
489
|
-
}], pageSizeOptions: [{
|
|
490
|
-
type: Input
|
|
491
|
-
}], hidePageSize: [{
|
|
492
|
-
type: Input,
|
|
493
|
-
args: [{ transform: booleanAttribute }]
|
|
494
|
-
}], page: [{
|
|
495
|
-
type: Output
|
|
496
|
-
}], paginationTemplate: [{
|
|
497
|
-
type: Input
|
|
498
|
-
}], sortOnFront: [{
|
|
499
|
-
type: Input,
|
|
500
|
-
args: [{ transform: booleanAttribute }]
|
|
501
|
-
}], sortActive: [{
|
|
502
|
-
type: Input
|
|
503
|
-
}], sortDirection: [{
|
|
504
|
-
type: Input
|
|
505
|
-
}], sortDisableClear: [{
|
|
506
|
-
type: Input,
|
|
507
|
-
args: [{ transform: booleanAttribute }]
|
|
508
|
-
}], sortDisabled: [{
|
|
509
|
-
type: Input,
|
|
510
|
-
args: [{ transform: booleanAttribute }]
|
|
511
|
-
}], sortStart: [{
|
|
512
|
-
type: Input
|
|
513
|
-
}], sortChange: [{
|
|
514
|
-
type: Output
|
|
515
|
-
}], rowHover: [{
|
|
516
|
-
type: Input,
|
|
517
|
-
args: [{ transform: booleanAttribute }]
|
|
518
|
-
}], rowStriped: [{
|
|
519
|
-
type: Input,
|
|
520
|
-
args: [{ transform: booleanAttribute }]
|
|
521
|
-
}], rowClick: [{
|
|
522
|
-
type: Output
|
|
523
|
-
}], rowContextMenu: [{
|
|
524
|
-
type: Output
|
|
525
|
-
}], expandable: [{
|
|
526
|
-
type: Input,
|
|
527
|
-
args: [{ transform: booleanAttribute }]
|
|
528
|
-
}], expansionTemplate: [{
|
|
529
|
-
type: Input
|
|
530
|
-
}], expansionChange: [{
|
|
531
|
-
type: Output
|
|
532
|
-
}], multiSelectable: [{
|
|
533
|
-
type: Input,
|
|
534
|
-
args: [{ transform: booleanAttribute }]
|
|
535
|
-
}], multiSelectionWithClick: [{
|
|
536
|
-
type: Input,
|
|
537
|
-
args: [{ transform: booleanAttribute }]
|
|
538
|
-
}], rowSelectable: [{
|
|
539
|
-
type: Input,
|
|
540
|
-
args: [{ transform: booleanAttribute }]
|
|
541
|
-
}], hideRowSelectionCheckbox: [{
|
|
542
|
-
type: Input,
|
|
543
|
-
args: [{ transform: booleanAttribute }]
|
|
544
|
-
}], disableRowClickSelection: [{
|
|
545
|
-
type: Input,
|
|
546
|
-
args: [{ transform: booleanAttribute }]
|
|
547
|
-
}], rowSelectionFormatter: [{
|
|
548
|
-
type: Input
|
|
549
|
-
}], rowClassFormatter: [{
|
|
550
|
-
type: Input
|
|
551
|
-
}], rowSelected: [{
|
|
552
|
-
type: Input
|
|
553
|
-
}], rowSelectedChange: [{
|
|
554
|
-
type: Output
|
|
555
|
-
}], cellSelectable: [{
|
|
556
|
-
type: Input,
|
|
557
|
-
args: [{ transform: booleanAttribute }]
|
|
558
|
-
}], cellSelectedChange: [{
|
|
559
|
-
type: Output
|
|
560
|
-
}], showToolbar: [{
|
|
561
|
-
type: Input,
|
|
562
|
-
args: [{ transform: booleanAttribute }]
|
|
563
|
-
}], toolbarTitle: [{
|
|
564
|
-
type: Input
|
|
565
|
-
}], toolbarTemplate: [{
|
|
566
|
-
type: Input
|
|
567
|
-
}], columnHideable: [{
|
|
568
|
-
type: Input,
|
|
569
|
-
args: [{ transform: booleanAttribute }]
|
|
570
|
-
}], columnHideableChecked: [{
|
|
571
|
-
type: Input
|
|
572
|
-
}], columnSortable: [{
|
|
573
|
-
type: Input,
|
|
574
|
-
args: [{ transform: booleanAttribute }]
|
|
575
|
-
}], columnPinnable: [{
|
|
576
|
-
type: Input,
|
|
577
|
-
args: [{ transform: booleanAttribute }]
|
|
578
|
-
}], columnChange: [{
|
|
579
|
-
type: Output
|
|
580
|
-
}], columnPinOptions: [{
|
|
581
|
-
type: Input
|
|
582
|
-
}], showColumnMenuButton: [{
|
|
583
|
-
type: Input,
|
|
584
|
-
args: [{ transform: booleanAttribute }]
|
|
585
|
-
}], columnMenuButtonText: [{
|
|
586
|
-
type: Input
|
|
587
|
-
}], columnMenuButtonType: [{
|
|
588
|
-
type: Input
|
|
589
|
-
}], columnMenuButtonColor: [{
|
|
590
|
-
type: Input
|
|
591
|
-
}], columnMenuButtonClass: [{
|
|
592
|
-
type: Input
|
|
593
|
-
}], columnMenuButtonIcon: [{
|
|
594
|
-
type: Input
|
|
595
|
-
}], showColumnMenuHeader: [{
|
|
596
|
-
type: Input,
|
|
597
|
-
args: [{ transform: booleanAttribute }]
|
|
598
|
-
}], columnMenuHeaderText: [{
|
|
599
|
-
type: Input
|
|
600
|
-
}], columnMenuHeaderTemplate: [{
|
|
601
|
-
type: Input
|
|
602
|
-
}], showColumnMenuFooter: [{
|
|
603
|
-
type: Input,
|
|
604
|
-
args: [{ transform: booleanAttribute }]
|
|
605
|
-
}], columnMenuFooterText: [{
|
|
606
|
-
type: Input
|
|
607
|
-
}], columnMenuFooterTemplate: [{
|
|
608
|
-
type: Input
|
|
609
|
-
}], noResultText: [{
|
|
610
|
-
type: Input
|
|
611
|
-
}], noResultTemplate: [{
|
|
612
|
-
type: Input
|
|
613
|
-
}], headerTemplate: [{
|
|
614
|
-
type: Input
|
|
615
|
-
}], headerExtraTemplate: [{
|
|
616
|
-
type: Input
|
|
617
|
-
}], cellTemplate: [{
|
|
618
|
-
type: Input
|
|
619
|
-
}], useContentRowTemplate: [{
|
|
620
|
-
type: Input,
|
|
621
|
-
args: [{ transform: booleanAttribute }]
|
|
622
|
-
}], useContentHeaderRowTemplate: [{
|
|
623
|
-
type: Input,
|
|
624
|
-
args: [{ transform: booleanAttribute }]
|
|
625
|
-
}], useContentFooterRowTemplate: [{
|
|
626
|
-
type: Input,
|
|
627
|
-
args: [{ transform: booleanAttribute }]
|
|
628
|
-
}], showSummary: [{
|
|
629
|
-
type: Input,
|
|
630
|
-
args: [{ transform: booleanAttribute }]
|
|
631
|
-
}], summaryTemplate: [{
|
|
632
|
-
type: Input
|
|
633
|
-
}], showSidebar: [{
|
|
634
|
-
type: Input,
|
|
635
|
-
args: [{ transform: booleanAttribute }]
|
|
636
|
-
}], sidebarTemplate: [{
|
|
637
|
-
type: Input
|
|
638
|
-
}], showStatusbar: [{
|
|
639
|
-
type: Input,
|
|
640
|
-
args: [{ transform: booleanAttribute }]
|
|
641
|
-
}], statusbarTemplate: [{
|
|
642
|
-
type: Input
|
|
643
|
-
}] } });
|
|
644
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvZ3JpZC9ncmlkLnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9ncmlkL2dyaWQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixNQUFNLEVBQ04sY0FBYyxFQUNkLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUtOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsT0FBTyxFQUFFLFlBQVksRUFBYSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBdUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRixPQUFPLEVBQ0wsT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZUFBZSxFQUNmLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGVBQWUsRUFDZixNQUFNLEVBQ04sU0FBUyxFQUNULFFBQVEs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QkFBbEUsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFLRSxXQUFXO3NCQUFsRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUU3QixlQUFlO3NCQUF2QixLQUFLO2dCQVVrQyxXQUFXO3NCQUFsRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUU3QixlQUFlO3NCQUF2QixLQUFLO2dCQUtrQyxhQUFhO3NCQUFwRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUU3QixpQkFBaUI7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIElucHV0LFxuICBLZXlWYWx1ZUNoYW5nZVJlY29yZCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFRyYWNrQnlGdW5jdGlvbixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdENoZWNrYm94IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBNYXRTb3J0LCBNYXRTb3J0SGVhZGVyLCBTb3J0LCBTb3J0RGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQge1xuICBNYXRDZWxsLFxuICBNYXRDZWxsRGVmLFxuICBNYXRDb2x1bW5EZWYsXG4gIE1hdEZvb3RlckNlbGwsXG4gIE1hdEZvb3RlckNlbGxEZWYsXG4gIE1hdEZvb3RlclJvdyxcbiAgTWF0Rm9vdGVyUm93RGVmLFxuICBNYXRIZWFkZXJDZWxsLFxuICBNYXRIZWFkZXJDZWxsRGVmLFxuICBNYXRIZWFkZXJSb3csXG4gIE1hdEhlYWRlclJvd0RlZixcbiAgTWF0Um93LFxuICBNYXRSb3dEZWYsXG4gIE1hdFRhYmxlLFxuICBNYXRUYWJsZURhdGFTb3VyY2UsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcblxuaW1wb3J0IHsgTXR4SXNUZW1wbGF0ZVJlZlBpcGUsIE10eFRvT2JzZXJ2YWJsZVBpcGUgfSBmcm9tICdAbmctbWF0ZXJvL2V4dGVuc2lvbnMvY29yZSc7XG5pbXBvcnQgeyBNdHhHcmlkQ2VsbCB9IGZyb20gJy4vY2VsbCc7XG5pbXBvcnQgeyBNdHhHcmlkQ29sdW1uTWVudSB9IGZyb20gJy4vY29sdW1uLW1lbnUnO1xuaW1wb3J0IHsgTWF0Q29sdW1uUmVzaXplLCBNYXRSZXNpemFibGUgfSBmcm9tICcuL2NvbHVtbi1yZXNpemUnO1xuaW1wb3J0IHsgTXR4R3JpZEV4cGFuc2lvblRvZ2dsZSB9IGZyb20gJy4vZXhwYW5zaW9uLXRvZ2dsZSc7XG5pbXBvcnQgeyBNdHhHcmlkQ29sQ2xhc3NQaXBlLCBNdHhHcmlkUm93Q2xhc3NQaXBlIH0gZnJvbSAnLi9ncmlkLXBpcGVzJztcbmltcG9ydCB7IE10eEdyaWRVdGlscyB9IGZyb20gJy4vZ3JpZC11dGlscyc7XG5pbXBvcnQge1xuICBNdHhHcmlkQnV0dG9uVHlwZSxcbiAgTXR4R3JpZENlbGxUZW1wbGF0ZSxcbiAgTXR4R3JpZENvbHVtbixcbiAgTXR4R3JpZENvbHVtblBpbk9wdGlvbixcbiAgTXR4R3JpZERlZmF1bHRPcHRpb25zLFxuICBNdHhHcmlkUm93Q2xhc3NGb3JtYXR0ZXIsXG4gIE10eEdyaWRSb3dTZWxlY3Rpb25Gb3JtYXR0ZXIsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNdHhHcmlkU2VsZWN0YWJsZUNlbGwgfSBmcm9tICcuL3NlbGVjdGFibGUtY2VsbCc7XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGRlZmF1bHQgZ3JpZCBvcHRpb25zLiAqL1xuZXhwb3J0IGNvbnN0IE1UWF9HUklEX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNdHhHcmlkRGVmYXVsdE9wdGlvbnM+KFxuICAnbXR4LWdyaWQtZGVmYXVsdC1vcHRpb25zJ1xuKTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXR4LWdyaWQnLFxuICBleHBvcnRBczogJ210eEdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2dyaWQuc2NzcycsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ210eC1ncmlkJyxcbiAgfSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdleHBhbnNpb24nLCBbXG4gICAgICBzdGF0ZSgnY29sbGFwc2VkLCB2b2lkJywgc3R5bGUoeyBoZWlnaHQ6ICcwJywgbWluSGVpZ2h0OiAnMCcsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH0pKSxcbiAgICAgIHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiAnKicsIHZpc2liaWxpdHk6ICd2aXNpYmxlJyB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgICAgdHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IHZvaWQnLCBhbmltYXRlKCcyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknKSksXG4gICAgXSksXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBBc3luY1BpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBNYXRQcm9ncmVzc0JhcixcbiAgICBNYXRJY29uQnV0dG9uLFxuICAgIE1hdENoZWNrYm94LFxuICAgIE1hdFRhYmxlLFxuICAgIE1hdENvbHVtbkRlZixcbiAgICBNYXRIZWFkZXJSb3dEZWYsXG4gICAgTWF0SGVhZGVyUm93LFxuICAgIE1hdFJvd0RlZixcbiAgICBNYXRSb3csXG4gICAgTWF0Rm9vdGVyUm93RGVmLFxuICAgIE1hdEZvb3RlclJvdyxcbiAgICBNYXRIZWFkZXJDZWxsRGVmLFxuICAgIE1hdEhlYWRlckNlbGwsXG4gICAgTWF0Q2VsbERlZixcbiAgICBNYXRDZWxsLFxuICAgIE1hdEZvb3RlckNlbGxEZWYsXG4gICAgTWF0Rm9vdGVyQ2VsbCxcbiAgICBNYXRTb3J0LFxuICAgIE1hdFNvcnRIZWFkZXIsXG4gICAgTWF0UGFnaW5hdG9yLFxuICAgIE1hdFJlc2l6YWJsZSxcbiAgICBNYXRDb2x1bW5SZXNpemUsXG4gICAgTXR4R3JpZENlbGwsXG4gICAgTXR4R3JpZENvbHVtbk1lbnUsXG4gICAgTXR4R3JpZFNlbGVjdGFibGVDZWxsLFxuICAgIE10eEdyaWRFeHBhbnNpb25Ub2dnbGUsXG4gICAgTXR4SXNUZW1wbGF0ZVJlZlBpcGUsXG4gICAgTXR4R3JpZENvbENsYXNzUGlwZSxcbiAgICBNdHhHcmlkUm93Q2xhc3NQaXBlLFxuICAgIE10eFRvT2JzZXJ2YWJsZVBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE10eEdyaWQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUpIHRhYmxlITogTWF0VGFibGU8YW55PjtcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0ITogTWF0U29ydDtcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRSb3dEZWYpIHJvd0RlZnMhOiBRdWVyeUxpc3Q8TWF0Um93RGVmPGFueT4+O1xuICBAQ29udGVudENoaWxkcmVuKE1hdEhlYWRlclJvd0RlZikgaGVhZGVyUm93RGVmcyE6IFF1ZXJ5TGlzdDxNYXRIZWFkZXJSb3dEZWY+O1xuICBAQ29udGVudENoaWxkcmVuKE1hdEZvb3RlclJvdykgZm9vdGVyUm93RGVmcyE6IFF1ZXJ5TGlzdDxNYXRGb290ZXJSb3dEZWY+O1xuICBAVmlld0NoaWxkKCdjb2x1bW5NZW51JykgY29sdW1uTWVudSE6IE10eEdyaWRDb2x1bW5NZW51O1xuICBAVmlld0NoaWxkKCd0YWJsZUNvbnRhaW5lcicpIHRhYmxlQ29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcblxuICAvKiogVGhlIGdyaWQncyBkaXNwbGF5ZWQgY29sdW1ucy4gKi9cbiAgQElucHV0KCkgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIFRoZSBncmlkJ3MgY29sdW1ucy4gKi9cbiAgQElucHV0KCkgY29sdW1uczogTXR4R3JpZENvbHVtbltdID0gW107XG4gIC8qKiBUaGUgZ3JpZCdzIGRhdGEuICovXG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107XG4gIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRoZSBkYXRhLiAqL1xuICBASW5wdXQoKSBsZW5ndGggPSAwO1xuICAvKiogV2hldGhlciB0aGUgZ3JpZCBpcyBsb2FkaW5nLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbG9hZGluZyA9IGZhbHNlO1xuICAvKiogVHJhY2tpbmcgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY2hlY2sgdGhlIGRpZmZlcmVuY2VzIGluIGRhdGEgY2hhbmdlcy4gKi9cbiAgQElucHV0KCkgdHJhY2tCeSE6IFRyYWNrQnlGdW5jdGlvbjxhbnk+O1xuICAvKiogV2hldGhlciB0aGUgY29sdW1uIGlzIHJlc2l6YWJsZS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGNvbHVtblJlc2l6YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5SZXNpemFibGUgPz8gZmFsc2U7XG4gIC8qKiBQbGFjZWhvbGRlciBmb3IgdGhlIGVtcHR5IHZhbHVlIChgbnVsbGAsIGAnJ2AsIGBbXWApLiAqL1xuICBASW5wdXQoKSBlbXB0eVZhbHVlUGxhY2Vob2xkZXIgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uZW1wdHlWYWx1ZVBsYWNlaG9sZGVyID8/ICctLSc7XG5cbiAgLy8gPT09PT0gUGFnZSA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHBhZ2luYXRlIHRoZSBkYXRhIG9uIGZyb250IGVuZC4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHBhZ2VPbkZyb250ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnBhZ2VPbkZyb250ID8/IHRydWU7XG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHBhZ2luYXRvci4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHNob3dQYWdpbmF0b3IgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc2hvd1BhZ2luYXRvciA/PyB0cnVlO1xuICAvKiogV2hldGhlciB0aGUgcGFnaW5hdG9yIGlzIGRpc2FibGVkLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcGFnZURpc2FibGVkID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnBhZ2VEaXNhYmxlZCA/PyBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgZmlyc3QvbGFzdCBidXR0b25zIFVJIHRvIHRoZSB1c2VyLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgPz8gdHJ1ZTtcbiAgLyoqIFRoZSB6ZXJvLWJhc2VkIHBhZ2UgaW5kZXggb2YgdGhlIGRpc3BsYXllZCBsaXN0IG9mIGl0ZW1zLiAqL1xuICBASW5wdXQoKSBwYWdlSW5kZXggPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucGFnZUluZGV4ID8/IDA7XG4gIC8qKiBOdW1iZXIgb2YgaXRlbXMgdG8gZGlzcGxheSBvbiBhIHBhZ2UuICovXG4gIEBJbnB1dCgpIHBhZ2VTaXplID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnBhZ2VTaXplID8/IDEwO1xuICAvKiogVGhlIHNldCBvZiBwcm92aWRlZCBwYWdlIHNpemUgb3B0aW9ucyB0byBkaXNwbGF5IHRvIHRoZSB1c2VyLiAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnMgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8ucGFnZVNpemVPcHRpb25zID8/IFsxMCwgNTAsIDEwMF07XG4gIC8qKiBXaGV0aGVyIHRvIGhpZGUgdGhlIHBhZ2Ugc2l6ZSBzZWxlY3Rpb24gVUkgZnJvbSB0aGUgdXNlci4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGhpZGVQYWdlU2l6ZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5oaWRlUGFnZVNpemUgPz8gZmFsc2U7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHBhZ2luYXRvciBjaGFuZ2VzIHRoZSBwYWdlIHNpemUgb3IgcGFnZSBpbmRleC4gKi9cbiAgQE91dHB1dCgpIHBhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFBhZ2VFdmVudD4oKTtcbiAgLyoqIFRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHBhZ2luYXRpb24uICovXG4gIEBJbnB1dCgpIHBhZ2luYXRpb25UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gPT09PT0gU29ydCA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNvcnQgdGhlIGRhdGEgb24gZnJvbnQgZW5kLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgc29ydE9uRnJvbnQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc29ydE9uRnJvbnQgPz8gdHJ1ZTtcbiAgLyoqIFRoZSBpZCBvZiB0aGUgbW9zdCByZWNlbnRseSBzb3J0ZWQgTWF0U29ydGFibGUuICovXG4gIEBJbnB1dCgpIHNvcnRBY3RpdmUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc29ydEFjdGl2ZSA/PyAnJztcbiAgLyoqIFRoZSBzb3J0IGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBNYXRTb3J0YWJsZS4gKi9cbiAgQElucHV0KCkgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbiA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zb3J0RGlyZWN0aW9uID8/ICcnO1xuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSB1c2VyIGZyb20gY2xlYXJpbmcgdGhlIHNvcnQgYnkgZmluaXNoaW5nIHRoZSBzb3J0IGRpcmVjdGlvbiBjeWNsZS5cbiAgICogTWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgY29sdW1uJ3MgYGRpc2FibGVDbGVhcmAgaW4gYHNvcnRQcm9wYC5cbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzb3J0RGlzYWJsZUNsZWFyID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNvcnREaXNhYmxlQ2xlYXIgPz8gZmFsc2U7XG4gIC8qKiBXaGV0aGVyIHRoZSBzb3J0IGlzIGRpc2FibGVkLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgc29ydERpc2FibGVkID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNvcnREaXNhYmxlZCA/PyBmYWxzZTtcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rpb24gdG8gc2V0IHdoZW4gYW4gTWF0U29ydGFibGUgaXMgaW5pdGlhbGx5IHNvcnRlZC5cbiAgICogTWF5IGJlIG92ZXJyaWRlbiBieSB0aGUgY29sdW1uJ3MgYHN0YXJ0YCBpbiBgc29ydFByb3BgLlxuICAgKi9cbiAgQElucHV0KCkgc29ydFN0YXJ0OiAnYXNjJyB8ICdkZXNjJyA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zb3J0U3RhcnQgPz8gJ2FzYyc7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyBlaXRoZXIgdGhlIGFjdGl2ZSBzb3J0IG9yIHNvcnQgZGlyZWN0aW9uLiAqL1xuICBAT3V0cHV0KCkgc29ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ydD4oKTtcblxuICAvLyA9PT09PSBSb3cgPT09PT1cblxuICAvKiogV2hldGhlciB0byB1c2UgdGhlIHJvdyBob3ZlciBzdHlsZS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHJvd0hvdmVyID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnJvd0hvdmVyID8/IGZhbHNlO1xuICAvKiogV2hldGhlciB0byB1c2UgdGhlIHJvdyBzdHJpcGVkIHN0eWxlLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcm93U3RyaXBlZCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5yb3dTdHJpcGVkID8/IGZhbHNlO1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdXNlciBhdHRlbXB0cyB0byBvcGVuIGEgY29udGV4dCBtZW51LiAqL1xuICBAT3V0cHV0KCkgcm93Q29udGV4dE1lbnUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvLyA9PT09PSBFeHBhbmRhYmxlIFJvdyA9PT09PVxuXG4gIGV4cGFuc2lvblJvd1N0YXRlczogYW55W10gPSBbXTtcblxuICAvKiogV2hldGhlciB0aGUgcm93IGlzIGV4cGFuZGFibGUuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBleHBhbmRhYmxlID0gZmFsc2U7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBleHBhbmRhYmxlIHJvdy4gKi9cbiAgQElucHV0KCkgZXhwYW5zaW9uVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSB1c2VyIHRvZ2dsZXMgdGhlIGV4cGFuZGFibGUgcm93LiAqL1xuICBAT3V0cHV0KCkgZXhwYW5zaW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLy8gPT09PT0gUm93IFNlbGVjdGlvbiA9PT09PVxuXG4gIHJvd1NlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8YW55PiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTtcblxuICAvKiogV2hldGhlciB0byBzdXBwb3J0IG11bHRpcGxlIHJvdy9jZWxsIHNlbGVjdGlvbi4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIG11bHRpU2VsZWN0YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5tdWx0aVNlbGVjdGFibGUgPz8gdHJ1ZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgY2FuIHNlbGVjdCBtdWx0aXBsZSByb3dzIHdpdGggY2xpY2suICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBtdWx0aVNlbGVjdGlvbldpdGhDbGljayA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5tdWx0aVNlbGVjdGlvbldpdGhDbGljayA/PyBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHJvdyBpcyBzZWxlY3RhYmxlLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcm93U2VsZWN0YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5yb3dTZWxlY3RhYmxlID8/IGZhbHNlO1xuICAvKiogV2hldGhlciB0byBoaWRlIHRoZSByb3cgc2VsZWN0aW9uIGNoZWNrYm94LiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgaGlkZVJvd1NlbGVjdGlvbkNoZWNrYm94ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmhpZGVSb3dTZWxlY3Rpb25DaGVja2JveCA/PyBmYWxzZTtcbiAgLyoqIFdoZXRoZXIgZGlzYWJsZSByb3dzIHRvIGJlIHNlbGVjdGVkIHdoZW4gY2xpY2tlZC4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGRpc2FibGVSb3dDbGlja1NlbGVjdGlvbiA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5kaXNhYmxlUm93Q2xpY2tTZWxlY3Rpb24gPz8gZmFsc2U7XG4gIC8qKiBUaGUgZm9ybWF0dGVyIHRvIGRpc2FibGUgdGhlIHJvdyBzZWxlY3Rpb24gb3IgaGlkZSB0aGUgcm93J3MgY2hlY2tib3guICovXG4gIEBJbnB1dCgpIHJvd1NlbGVjdGlvbkZvcm1hdHRlcjogTXR4R3JpZFJvd1NlbGVjdGlvbkZvcm1hdHRlciA9IHt9O1xuICAvKiogVGhlIGZvcm1hdHRlciB0byBzZXQgdGhlIHJvdydzIGNsYXNzLiAqL1xuICBASW5wdXQoKSByb3dDbGFzc0Zvcm1hdHRlcj86IE10eEdyaWRSb3dDbGFzc0Zvcm1hdHRlcjtcbiAgLyoqIFRoZSBzZWxlY3RlZCByb3cgaXRlbXMuICovXG4gIEBJbnB1dCgpIHJvd1NlbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSByb3cgaXMgc2VsZWN0ZWQuICovXG4gIEBPdXRwdXQoKSByb3dTZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgLy8gPT09PT0gQ2VsbCBTZWxlY3Rpb24gPT09PT1cblxuICBjZWxsU2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBjZWxsIGlzIHNlbGVjdGFibGUuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBjZWxsU2VsZWN0YWJsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jZWxsU2VsZWN0YWJsZSA/PyB0cnVlO1xuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBjZWxsIGlzIHNlbGVjdGVkLiAqL1xuICBAT3V0cHV0KCkgY2VsbFNlbGVjdGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICBwcml2YXRlIF9zZWxlY3RlZENlbGw/OiBNdHhHcmlkU2VsZWN0YWJsZUNlbGw7XG5cbiAgLy8gPT09PT0gVG9vbGJhciA9PT09PVxuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIHRvb2xiYXIuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzaG93VG9vbGJhciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93VG9vbGJhciA/PyBmYWxzZTtcbiAgLyoqIFRoZSB0ZXh0IG9mIHRoZSB0b29sYmFyJ3MgdGl0bGUuICovXG4gIEBJbnB1dCgpIHRvb2xiYXJUaXRsZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy50b29sYmFyVGl0bGUgPz8gJyc7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSB0b29sYmFyLiAqL1xuICBASW5wdXQoKSB0b29sYmFyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8vID09PT09IENvbHVtbiBNZW51ID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBoaWRlYWJsZS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGNvbHVtbkhpZGVhYmxlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbkhpZGVhYmxlID8/IHRydWU7XG4gIC8qKiBIaWRlIG9yIHNob3cgd2hlbiB0aGUgY29sdW1uJ3MgY2hlY2tib3ggaXMgY2hlY2tlZC4gKi9cbiAgQElucHV0KCkgY29sdW1uSGlkZWFibGVDaGVja2VkOiAnc2hvdycgfCAnaGlkZScgPVxuICAgIHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5IaWRlYWJsZUNoZWNrZWQgPz8gJ3Nob3cnO1xuICAvKiogV2hldGhlciB0aGUgY29sdW1uIGlzIHNvcnRhYmxlLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgY29sdW1uU29ydGFibGUgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uU29ydGFibGUgPz8gdHJ1ZTtcbiAgLyoqIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwaW5uYWJsZS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIGNvbHVtblBpbm5hYmxlID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtblBpbm5hYmxlID8/IHRydWU7XG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGNvbHVtbiBpcyBoaWRlZCBvciBpcyBzb3J0ZWQuICovXG4gIEBPdXRwdXQoKSBjb2x1bW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE10eEdyaWRDb2x1bW5bXT4oKTtcbiAgLyoqIFRoZSBvcHRpb25zIGZvciB0aGUgY29sdW1uIHBpbiBsaXN0LiAqL1xuICBASW5wdXQoKSBjb2x1bW5QaW5PcHRpb25zOiBNdHhHcmlkQ29sdW1uUGluT3B0aW9uW10gPVxuICAgIHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5QaW5PcHRpb25zID8/IFtdO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGNvbHVtbiBtZW51IGJ1dHRvbi4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHNob3dDb2x1bW5NZW51QnV0dG9uID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnNob3dDb2x1bW5NZW51QnV0dG9uID8/IHRydWU7XG4gIC8qKiBUaGUgdGV4dCBmb3IgdGhlIGNvbHVtbiBtZW51IGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUJ1dHRvblRleHQgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uTWVudUJ1dHRvblRleHQgPz8gJyc7XG4gIC8qKiBUaGUgdHlwZSBmb3IgdGhlIGNvbHVtbiBtZW51IGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUJ1dHRvblR5cGU6IE10eEdyaWRCdXR0b25UeXBlID1cbiAgICB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uTWVudUJ1dHRvblR5cGUgPz8gJ3N0cm9rZWQnO1xuICAvKiogVGhlIGNvbG9yIGZvciB0aGUgY29sdW1uIG1lbnUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBjb2x1bW5NZW51QnV0dG9uQ29sb3I6IFRoZW1lUGFsZXR0ZSA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5NZW51QnV0dG9uQ29sb3I7XG4gIC8qKiBUaGUgY2xhc3MgZm9yIHRoZSBjb2x1bW4gbWVudSBidXR0b24uICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVCdXR0b25DbGFzcyA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5NZW51QnV0dG9uQ2xhc3MgPz8gJyc7XG4gIC8qKiBUaGUgaWNvbiBmb3IgdGhlIGNvbHVtbiBtZW51IGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUJ1dHRvbkljb24gPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uY29sdW1uTWVudUJ1dHRvbkljb24gPz8gJyc7XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgY29sdW1uLW1lbnUncyBoZWFkZXIuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzaG93Q29sdW1uTWVudUhlYWRlciA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5zaG93Q29sdW1uTWVudUhlYWRlciA/PyBmYWxzZTtcbiAgLyoqIFRoZSB0ZXh0IGZvciB0aGUgY29sdW1uLW1lbnUncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVIZWFkZXJUZXh0ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNvbHVtbk1lbnVIZWFkZXJUZXh0ID8/ICdDb2x1bW5zIEhlYWRlcic7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBjb2x1bW4tbWVudSdzIGhlYWRlci4gKi9cbiAgQElucHV0KCkgY29sdW1uTWVudUhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgdGhlIGNvbHVtbi1tZW51J3MgZm9vdGVyLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgc2hvd0NvbHVtbk1lbnVGb290ZXIgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc2hvd0NvbHVtbk1lbnVGb290ZXIgPz8gZmFsc2U7XG4gIC8qKiBUaGUgdGV4dCBmb3IgdGhlIGNvbHVtbi1tZW51J3MgZm9vdGVyLiAqL1xuICBASW5wdXQoKSBjb2x1bW5NZW51Rm9vdGVyVGV4dCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5jb2x1bW5NZW51Rm9vdGVyVGV4dCA/PyAnQ29sdW1ucyBGb290ZXInO1xuICAvKiogVGhlIHRlbXBsYXRlIGZvciB0aGUgY29sdW1uLW1lbnUncyBmb290ZXIuICovXG4gIEBJbnB1dCgpIGNvbHVtbk1lbnVGb290ZXJUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gPT09PT0gTm8gUmVzdWx0ID09PT09XG5cbiAgLyoqIFRoZSBkaXNwbGF5ZWQgdGV4dCBmb3IgdGhlIGVtcHR5IGRhdGEuICovXG4gIEBJbnB1dCgpIG5vUmVzdWx0VGV4dCA9IHRoaXMuX2RlZmF1bHRPcHRpb25zPy5ub1Jlc3VsdFRleHQgPz8gJ05vIHJlY29yZHMgZm91bmQnO1xuICAvKiogVGhlIHRlbXBsYXRlIGZvciB0aGUgZW1wdHkgZGF0YS4gKi9cbiAgQElucHV0KCkgbm9SZXN1bHRUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgZ2V0IF9oYXNOb1Jlc3VsdCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmRhdGFTb3VyY2UuZGF0YSB8fCB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IDApICYmICF0aGlzLmxvYWRpbmc7XG4gIH1cblxuICAvLyA9PT09PSBDZWxsIFRlbXBsYXRlcyA9PT09PVxuXG4gIC8qKiBUaGUgaGVhZGVyJ3MgY2VsbCB0ZW1wbGF0ZSBmb3IgdGhlIGdyaWQuICovXG4gIEBJbnB1dCgpIGhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PiB8IE10eEdyaWRDZWxsVGVtcGxhdGU7XG4gIC8qKiBUaGUgaGVhZGVyJ3MgY2VsbCB0ZW1wbGF0ZSBmb3IgdGhlIGdyaWQgZXhjbHVkZSBzb3J0LiAqL1xuICBASW5wdXQoKSBoZWFkZXJFeHRyYVRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PiB8IE10eEdyaWRDZWxsVGVtcGxhdGU7XG4gIC8qKiBUaGUgY2VsbCB0ZW1wbGF0ZSBmb3IgdGhlIGdyaWQuICovXG4gIEBJbnB1dCgpIGNlbGxUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT4gfCBNdHhHcmlkQ2VsbFRlbXBsYXRlO1xuXG4gIC8vID09PT09IFJvdyBUZW1wbGF0ZXMgPT09PT1cblxuICAvKiogV2hldGhlciB0byB1c2UgY3VzdG9tIHJvdyB0ZW1wbGF0ZS4gSWYgdHJ1ZSwgeW91IHNob3VsZCBkZWZpbmUgYSBtYXRSb3dEZWYuICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSB1c2VDb250ZW50Um93VGVtcGxhdGUgPSBmYWxzZTtcbiAgLy8gVE9ETzogSXQgY2FuJ3QgdXNlIHRvZ2V0aGVyIHdpdGggYHVzZUNvbnRlbnRSb3dUZW1wbGF0ZWBcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHVzZUNvbnRlbnRIZWFkZXJSb3dUZW1wbGF0ZSA9IGZhbHNlO1xuICAvLyBUT0RPOiBJdCdzIG5vdCB3b3JraW5nXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSB1c2VDb250ZW50Rm9vdGVyUm93VGVtcGxhdGUgPSBmYWxzZTtcblxuICAvLyA9PT09PSBTdW1tYXJ5ID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgc3VtbWFyeS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dTdW1tYXJ5ID0gZmFsc2U7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBzdW1tYXJ5LiAqL1xuICBASW5wdXQoKSBzdW1tYXJ5VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+IHwgTXR4R3JpZENlbGxUZW1wbGF0ZTtcblxuICAvLyBUT0RPOiBTdW1tYXJ5IGRpc3BsYXkgY29uZGl0aW9uc1xuICBnZXQgX3doZXRoZXJTaG93U3VtbWFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93U3VtbWFyeTtcbiAgfVxuXG4gIC8vID09PT09IFNpZGUgQmFyID09PT09XG5cbiAgLyoqIFdoZXRoZXIgdG8gc2hvdyB0aGUgc2lkZWJhci4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHNob3dTaWRlYmFyID0gZmFsc2U7XG4gIC8qKiBUaGUgdGVtcGxhdGUgZm9yIHRoZSBzaWRlYmFyLiAqL1xuICBASW5wdXQoKSBzaWRlYmFyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8vID09PT09IFN0YXR1cyBCYXIgPT09PT1cblxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBzdGF0dXMgYmFyLiAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgc2hvd1N0YXR1c2JhciA9IGZhbHNlO1xuICAvKiogVGhlIHRlbXBsYXRlIGZvciB0aGUgc3RhdHVzIGJhci4gKi9cbiAgQElucHV0KCkgc3RhdHVzYmFyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKiBUaGUgY2hhbmdlZCByZWNvcmQgb2Ygcm93IGRhdGEuICovXG4gIHJvd0NoYW5nZVJlY29yZD86IEtleVZhbHVlQ2hhbmdlUmVjb3JkPHN0cmluZywgYW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF91dGlsczogTXR4R3JpZFV0aWxzLFxuICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoTVRYX0dSSURfREVGQVVMVF9PUFRJT05TKVxuICAgIHByaXZhdGUgX2RlZmF1bHRPcHRpb25zPzogTXR4R3JpZERlZmF1bHRPcHRpb25zXG4gICkge31cblxuICBkZXRlY3RDaGFuZ2VzKCkge1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIF9nZXRDb2xEYXRhKGRhdGE6IGFueVtdLCBjb2xEZWY6IE10eEdyaWRDb2x1bW4pIHtcbiAgICByZXR1cm4gdGhpcy5fdXRpbHMuZ2V0Q29sRGF0YShkYXRhLCBjb2xEZWYpO1xuICB9XG5cbiAgX2lzQ29sdW1uSGlkZShpdGVtOiBNdHhHcmlkQ29sdW1uKSB7XG4gICAgcmV0dXJuIGl0ZW0uaGlkZSAhPT0gdW5kZWZpbmVkID8gaXRlbS5oaWRlIDogaXRlbS5zaG93ICE9PSB1bmRlZmluZWQgPyAhaXRlbS5zaG93IDogZmFsc2U7XG4gIH1cblxuICAvLyBXYWl0aW5nIGZvciBhc3luYyBkYXRhXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLl9jb3VudFBpbm5lZFBvc2l0aW9uKCk7XG5cbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiAhdGhpcy5faXNDb2x1bW5IaWRlKGl0ZW0pKVxuICAgICAgLm1hcChpdGVtID0+IGl0ZW0uZmllbGQpO1xuXG4gICAgaWYgKHRoaXMuc2hvd0NvbHVtbk1lbnVCdXR0b24pIHtcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpdGVtLmhpZGUgPSB0aGlzLl9pc0NvbHVtbkhpZGUoaXRlbSk7XG4gICAgICAgIGl0ZW0uc2hvdyA9ICFpdGVtLmhpZGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dTZWxlY3RhYmxlICYmICF0aGlzLmhpZGVSb3dTZWxlY3Rpb25DaGVja2JveCkge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnVuc2hpZnQoJ010eEdyaWRDaGVja2JveENvbHVtbkRlZicpO1xuICAgIH1cblxuICAgIC8vIFdlIHNob3VsZCBjb3B5IGVhY2ggaXRlbSBvZiBkYXRhIGZvciBleHBhbnNpb24gZGF0YVxuICAgIGlmICh0aGlzLmV4cGFuZGFibGUpIHtcbiAgICAgIHRoaXMuZXhwYW5zaW9uUm93U3RhdGVzID0gW107IC8vIHJlc2V0XG5cbiAgICAgIHRoaXMuZGF0YT8uZm9yRWFjaChfID0+IHtcbiAgICAgICAgdGhpcy5leHBhbnNpb25Sb3dTdGF0ZXMucHVzaCh7IGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJvd1NlbGVjdGFibGUpIHtcbiAgICAgIHRoaXMucm93U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odGhpcy5tdWx0aVNlbGVjdGFibGUsIHRoaXMucm93U2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5kYXRhKTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2VPbkZyb250ID8gdGhpcy5wYWdpbmF0b3IgOiBudWxsO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0T25Gcm9udCA/IHRoaXMuc29ydCA6IG51bGw7XG5cbiAgICAvLyBPbmx5IHNjcm9sbCB0b3Agd2l0aCBkYXRhIGNoYW5nZVxuICAgIGlmIChjaGFuZ2VzLmRhdGEpIHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9wKDApO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5wYWdlT25Gcm9udCkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRPbkZyb250KSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dEZWZzPy5sZW5ndGggPiAwICYmIHRoaXMudXNlQ29udGVudFJvd1RlbXBsYXRlKSB7XG4gICAgICB0aGlzLnJvd0RlZnMuZm9yRWFjaChyb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRSb3dEZWYocm93RGVmKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhlYWRlclJvd0RlZnM/Lmxlbmd0aCA+IDAgJiYgdGhpcy51c2VDb250ZW50SGVhZGVyUm93VGVtcGxhdGUpIHtcbiAgICAgIHRoaXMuaGVhZGVyUm93RGVmcy5mb3JFYWNoKGhlYWRlclJvd0RlZiA9PiB0aGlzLnRhYmxlLmFkZEhlYWRlclJvd0RlZihoZWFkZXJSb3dEZWYpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9vdGVyUm93RGVmcz8ubGVuZ3RoID4gMCAmJiB0aGlzLnVzZUNvbnRlbnRGb290ZXJSb3dUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5mb290ZXJSb3dEZWZzLmZvckVhY2goZm9vdGVyUm93RGVmID0+IHRoaXMudGFibGUuYWRkRm9vdGVyUm93RGVmKGZvb3RlclJvd0RlZikpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge31cblxuICBfY291bnRQaW5uZWRQb3NpdGlvbigpIHtcbiAgICBjb25zdCBjb3VudCA9IChhY2M6IG51bWJlciwgY3VyOiBNdHhHcmlkQ29sdW1uKSA9PiBhY2MgKyBwYXJzZUZsb2F0KGN1ci53aWR0aCB8fCAnODBweCcpO1xuXG4gICAgY29uc3QgcGlubmVkTGVmdENvbHMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wucGlubmVkICYmIGNvbC5waW5uZWQgPT09ICdsZWZ0Jyk7XG4gICAgcGlubmVkTGVmdENvbHMuZm9yRWFjaCgoaXRlbSwgaWR4KSA9PiB7XG4gICAgICBpdGVtLmxlZnQgPSBwaW5uZWRMZWZ0Q29scy5zbGljZSgwLCBpZHgpLnJlZHVjZShjb3VudCwgMCkgKyAncHgnO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcGlubmVkUmlnaHRDb2xzID0gdGhpcy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKGNvbCA9PiBjb2wucGlubmVkICYmIGNvbC5waW5uZWQgPT09ICdyaWdodCcpXG4gICAgICAucmV2ZXJzZSgpO1xuICAgIHBpbm5lZFJpZ2h0Q29scy5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgIGl0ZW0ucmlnaHQgPSBwaW5uZWRSaWdodENvbHMuc2xpY2UoMCwgaWR4KS5yZWR1Y2UoY291bnQsIDApICsgJ3B4JztcbiAgICB9KTtcbiAgfVxuXG4gIF9nZXRJbmRleChpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLCBkYXRhSW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBpbmRleCA9PT0gdW5kZWZpbmVkID8gZGF0YUluZGV4IDogaW5kZXg7XG4gIH1cblxuICBfb25Tb3J0Q2hhbmdlKHNvcnQ6IFNvcnQpIHtcbiAgICB0aGlzLnNvcnRDaGFuZ2UuZW1pdChzb3J0KTtcbiAgfVxuXG4gIF9vblJvd0RhdGFDaGFuZ2UocmVjb3JkOiBLZXlWYWx1ZUNoYW5nZVJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnJvd0NoYW5nZVJlY29yZCA9IHJlY29yZDtcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBFeHBhbnNpb24gY2hhbmdlIGV2ZW50ICovXG4gIF9vbkV4cGFuc2lvbkNoYW5nZShcbiAgICBleHBhbnNpb25SZWY6IE10eEdyaWRFeHBhbnNpb25Ub2dnbGUsXG4gICAgcm93RGF0YTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb2x1bW46IE10eEdyaWRDb2x1bW4sXG4gICAgaW5kZXg6IG51bWJlclxuICApIHtcbiAgICB0aGlzLmV4cGFuc2lvbkNoYW5nZS5lbWl0KHsgZXhwYW5kZWQ6IGV4cGFuc2lvblJlZi5leHBhbmRlZCwgZGF0YTogcm93RGF0YSwgaW5kZXgsIGNvbHVtbiB9KTtcbiAgfVxuXG4gIC8qKiBDZWxsIHNlbGVjdCBldmVudCAqL1xuICBfc2VsZWN0Q2VsbChcbiAgICBjZWxsUmVmOiBNdHhHcmlkU2VsZWN0YWJsZUNlbGwsXG4gICAgcm93RGF0YTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb2xEZWY6IE10eEdyaWRDb2x1bW5cbiAgKTogdm9pZCB7XG4gICAgLy8gSWYgbm90IHRoZSBzYW1lIGNlbGxcbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRDZWxsICE9PSBjZWxsUmVmKSB7XG4gICAgICBjb25zdCBjb2xWYWx1ZSA9IHRoaXMuX3V0aWxzLmdldENlbGxWYWx1ZShyb3dEYXRhLCBjb2xEZWYpO1xuICAgICAgdGhpcy5jZWxsU2VsZWN0aW9uID0gW107IC8vIHJlc2V0XG4gICAgICB0aGlzLmNlbGxTZWxlY3Rpb24ucHVzaCh7IGNlbGxEYXRhOiBjb2xWYWx1ZSwgcm93RGF0YSwgY29sRGVmIH0pO1xuXG4gICAgICB0aGlzLmNlbGxTZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMuY2VsbFNlbGVjdGlvbik7XG5cbiAgICAgIGlmICh0aGlzLl9zZWxlY3RlZENlbGwpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRDZWxsLmRlc2VsZWN0KCk7IC8vIHRoZSBzZWxlY3RlZENlbGwgd2lsbCBiZSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9zZWxlY3RlZENlbGwgPSBjZWxsUmVmLnNlbGVjdGVkID8gY2VsbFJlZiA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSb3cgc2VsZWN0IGV2ZW50ICovXG4gIF9zZWxlY3RSb3coZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJvd1NlbGVjdGFibGUgJiZcbiAgICAgICF0aGlzLnJvd1NlbGVjdGlvbkZvcm1hdHRlci5kaXNhYmxlZD8uKHJvd0RhdGEsIGluZGV4KSAmJlxuICAgICAgIXRoaXMucm93U2VsZWN0aW9uRm9ybWF0dGVyLmhpZGVDaGVja2JveD8uKHJvd0RhdGEsIGluZGV4KSAmJlxuICAgICAgIXRoaXMuZGlzYWJsZVJvd0NsaWNrU2VsZWN0aW9uXG4gICAgKSB7XG4gICAgICAvLyBtZXRhS2V5IC0+IGNvbW1hbmQga2V5XG4gICAgICBpZiAoIXRoaXMubXVsdGlTZWxlY3Rpb25XaXRoQ2xpY2sgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgdGhpcy5yb3dTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdG9nZ2xlTm9ybWFsQ2hlY2tib3gocm93RGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHsgZXZlbnQsIHJvd0RhdGEsIGluZGV4IH0pO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbGVtZW50cyBtYXRjaGVzIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cy4gKi9cbiAgX2lzQWxsU2VsZWN0ZWQoKSB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnJvd1NlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZpbHRlcihcbiAgICAgIChyb3csIGluZGV4KSA9PiAhdGhpcy5yb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQ/Lihyb3csIGluZGV4KVxuICAgICkubGVuZ3RoO1xuICAgIHJldHVybiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcbiAgfVxuXG4gIC8qKiBTZWxlY3QgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cbiAgX3RvZ2dsZU1hc3RlckNoZWNrYm94KCkge1xuICAgIHRoaXMuX2lzQWxsU2VsZWN0ZWQoKVxuICAgICAgPyB0aGlzLnJvd1NlbGVjdGlvbi5jbGVhcigpXG4gICAgICA6IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMucm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkPy4ocm93LCBpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0aW9uLnNlbGVjdChyb3cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMucm93U2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKiBTZWxlY3Qgbm9ybWFsIHJvdyAqL1xuICBfdG9nZ2xlTm9ybWFsQ2hlY2tib3gocm93OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgdGhpcy5yb3dTZWxlY3Rpb24udG9nZ2xlKHJvdyk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZENoYW5nZS5lbWl0KHRoaXMucm93U2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgfVxuXG4gIC8qKiBDb2x1bW4gY2hhbmdlIGV2ZW50ICovXG4gIF9vbkNvbHVtbkNoYW5nZShjb2x1bW5zOiBNdHhHcmlkQ29sdW1uW10pIHtcbiAgICB0aGlzLmNvbHVtbkNoYW5nZS5lbWl0KGNvbHVtbnMpO1xuXG4gICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gT2JqZWN0LmFzc2lnbihbXSwgdGhpcy5nZXREaXNwbGF5ZWRDb2x1bW5GaWVsZHMoY29sdW1ucykpO1xuXG4gICAgaWYgKHRoaXMucm93U2VsZWN0YWJsZSAmJiAhdGhpcy5oaWRlUm93U2VsZWN0aW9uQ2hlY2tib3gpIHtcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy51bnNoaWZ0KCdNdHhHcmlkQ2hlY2tib3hDb2x1bW5EZWYnKTtcbiAgICB9XG4gIH1cblxuICBnZXREaXNwbGF5ZWRDb2x1bW5GaWVsZHMoY29sdW1uczogTXR4R3JpZENvbHVtbltdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpZWxkcyA9IGNvbHVtbnNcbiAgICAgIC5maWx0ZXIoaXRlbSA9PiAodGhpcy5jb2x1bW5IaWRlYWJsZUNoZWNrZWQgPT09ICdzaG93JyA/IGl0ZW0uc2hvdyA6ICFpdGVtLmhpZGUpKVxuICAgICAgLm1hcChpdGVtID0+IGl0ZW0uZmllbGQpO1xuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKiogQ3VzdG9taXplIGV4cGFuc2lvbiBldmVudCAqL1xuICB0b2dnbGVFeHBhbnNpb24oaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5leHBhbmRhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgZXhwYW5kYWJsZWAgc2hvdWxkIGJlIHNldCB0cnVlLicpO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuc2lvblJvd1N0YXRlc1tpbmRleF0uZXhwYW5kZWQgPSAhdGhpcy5leHBhbnNpb25Sb3dTdGF0ZXNbaW5kZXhdLmV4cGFuZGVkO1xuICAgIHJldHVybiB0aGlzLmV4cGFuc2lvblJvd1N0YXRlc1tpbmRleF0uZXhwYW5kZWQ7XG4gIH1cblxuICAvKiogU2Nyb2xsIHRvIHRvcCB3aGVuIHR1cm4gdG8gdGhlIG5leHQgcGFnZS4gKi9cbiAgX29uUGFnZShlOiBQYWdlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5wYWdlT25Gcm9udCkge1xuICAgICAgdGhpcy5zY3JvbGxUb3AoMCk7XG4gICAgfVxuICAgIHRoaXMucGFnZS5lbWl0KGUpO1xuICB9XG5cbiAgc2Nyb2xsVG9wKHZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHwgdm9pZCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnRhYmxlQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVDb250YWluZXIgJiYgIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbExlZnQodmFsdWU/OiBudW1iZXIpOiBudW1iZXIgfCB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFibGVDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgaWYgKHRoaXMudGFibGVDb250YWluZXIgJiYgIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBfY29udGV4dG1lbnUoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvd0RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnJvd0NvbnRleHRNZW51LmVtaXQoeyBldmVudCwgcm93RGF0YSwgaW5kZXggfSk7XG4gIH1cbn1cbiIsIjwhLS0gUHJvZ3Jlc3MgYmFyLS0+XG5AaWYgKGxvYWRpbmcpIHtcbiAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLXByb2dyZXNzXCI+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gIDwvZGl2PlxufVxuXG48IS0tIFRvb2xiYXIgLS0+XG5AaWYgKHNob3dUb29sYmFyKSB7XG4gIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyXCI+XG4gICAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLXRvb2xiYXItY29udGVudFwiPlxuICAgICAgQGlmICh0b29sYmFyVGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRvb2xiYXJUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgQGlmICh0b29sYmFyVGl0bGUpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtdG9vbGJhci10aXRsZVwiPnt7dG9vbGJhclRpdGxlfX08L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC10b29sYmFyLWFjdGlvbnNcIj5cbiAgICAgIEBpZiAoc2hvd0NvbHVtbk1lbnVCdXR0b24pIHtcbiAgICAgICAgPG10eC1ncmlkLWNvbHVtbi1tZW51ICNjb2x1bW5NZW51XG4gICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgICAgICAgW2J1dHRvblRleHRdPVwiY29sdW1uTWVudUJ1dHRvblRleHRcIlxuICAgICAgICAgIFtidXR0b25UeXBlXT1cImNvbHVtbk1lbnVCdXR0b25UeXBlXCJcbiAgICAgICAgICBbYnV0dG9uQ29sb3JdPVwiY29sdW1uTWVudUJ1dHRvbkNvbG9yXCJcbiAgICAgICAgICBbYnV0dG9uQ2xhc3NdPVwiY29sdW1uTWVudUJ1dHRvbkNsYXNzXCJcbiAgICAgICAgICBbYnV0dG9uSWNvbl09XCJjb2x1bW5NZW51QnV0dG9uSWNvblwiXG4gICAgICAgICAgW3NlbGVjdGFibGVdPVwiY29sdW1uSGlkZWFibGVcIlxuICAgICAgICAgIFtzZWxlY3RhYmxlQ2hlY2tlZF09XCJjb2x1bW5IaWRlYWJsZUNoZWNrZWRcIlxuICAgICAgICAgIFtzb3J0YWJsZV09XCJjb2x1bW5Tb3J0YWJsZVwiXG4gICAgICAgICAgW3Bpbm5hYmxlXT1cImNvbHVtblBpbm5hYmxlXCJcbiAgICAgICAgICBbc2hvd0hlYWRlcl09XCJzaG93Q29sdW1uTWVudUhlYWRlclwiXG4gICAgICAgICAgW2hlYWRlclRleHRdPVwiY29sdW1uTWVudUhlYWRlclRleHRcIlxuICAgICAgICAgIFtoZWFkZXJUZW1wbGF0ZV09XCJjb2x1bW5NZW51SGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICAgIFtzaG93Rm9vdGVyXT1cInNob3dDb2x1bW5NZW51Rm9vdGVyXCJcbiAgICAgICAgICBbZm9vdGVyVGV4dF09XCJjb2x1bW5NZW51Rm9vdGVyVGV4dFwiXG4gICAgICAgICAgW2Zvb3RlclRlbXBsYXRlXT1cImNvbHVtbk1lbnVGb290ZXJUZW1wbGF0ZVwiXG4gICAgICAgICAgW3Bpbk9wdGlvbnNdPVwiY29sdW1uUGluT3B0aW9uc1wiXG4gICAgICAgICAgKGNvbHVtbkNoYW5nZSk9XCJfb25Db2x1bW5DaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICA8L210eC1ncmlkLWNvbHVtbi1tZW51PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cblxuPGRpdiBjbGFzcz1cIm10eC1ncmlkLW1haW4gbXR4LWdyaWQtbGF5b3V0XCI+XG4gIDwhLS0gVGFibGUgY29udGVudCAtLT5cbiAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLWNvbnRlbnQgbXR4LWdyaWQtbGF5b3V0XCI+XG4gICAgPGRpdiAjdGFibGVDb250YWluZXIgY2xhc3M9XCJtYXQtdGFibGUtY29udGFpbmVyXCIgW2NsYXNzLm1hdC10YWJsZS13aXRoLWRhdGFdPVwiIV9oYXNOb1Jlc3VsdFwiPlxuICAgICAgQGlmICghY29sdW1uUmVzaXphYmxlKSB7XG4gICAgICAgIDx0YWJsZSBtYXQtdGFibGVcbiAgICAgICAgICBbY2xhc3NdPVwieydtYXQtdGFibGUtaG92ZXInOiByb3dIb3ZlciwgJ21hdC10YWJsZS1zdHJpcGVkJzogcm93U3RyaXBlZCwgJ21hdC10YWJsZS1leHBhbmRhYmxlJzogZXhwYW5kYWJsZX1cIlxuICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT1cImV4cGFuZGFibGVcIlxuICAgICAgICAgIG1hdFNvcnRcbiAgICAgICAgICBbbWF0U29ydEFjdGl2ZV09XCJzb3J0QWN0aXZlXCJcbiAgICAgICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcbiAgICAgICAgICBbbWF0U29ydERpc2FibGVDbGVhcl09XCJzb3J0RGlzYWJsZUNsZWFyXCJcbiAgICAgICAgICBbbWF0U29ydERpc2FibGVkXT1cInNvcnREaXNhYmxlZFwiXG4gICAgICAgICAgW21hdFNvcnRTdGFydF09XCJzb3J0U3RhcnRcIlxuICAgICAgICAgIChtYXRTb3J0Q2hhbmdlKT1cIl9vblNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiPlxuICAgICAgICAgIEBpZiAocm93U2VsZWN0YWJsZSAmJiAhaGlkZVJvd1NlbGVjdGlvbkNoZWNrYm94KSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIk10eEdyaWRDaGVja2JveENvbHVtbkRlZlwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPlxuICAgICAgICAgICAgICAgIEBpZiAobXVsdGlTZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvd1NlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIF9pc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJyb3dTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhX2lzQWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gX3RvZ2dsZU1hc3RlckNoZWNrYm94KCkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4O1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtdHgtZ3JpZC1jaGVja2JveC1jZWxsXCI+XG4gICAgICAgICAgICAgICAgQGlmICghKHJvd1NlbGVjdGlvbkZvcm1hdHRlci5oaWRlQ2hlY2tib3ggJiYgcm93U2VsZWN0aW9uRm9ybWF0dGVyLmhpZGVDaGVja2JveChyb3csIF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSkpKSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQgJiYgcm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkKHJvdywgX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvd1NlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBfdG9nZ2xlTm9ybWFsQ2hlY2tib3gocm93KSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cIm10eC1ncmlkLWNoZWNrYm94LWNlbGxcIj48L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2wuZmllbGRcIlxuICAgICAgICAgICAgICBbc3RpY2t5XT1cImNvbC5waW5uZWQ9PT0nbGVmdCdcIiBbc3RpY2t5RW5kXT1cImNvbC5waW5uZWQ9PT0ncmlnaHQnXCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sIHwgY29sQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtdGFibGUtc3RpY2t5LWxlZnRdPVwiY29sLnBpbm5lZCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWF0LXRhYmxlLXN0aWNreS1yaWdodF09XCJjb2wucGlubmVkID09PSAncmlnaHQnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyd3aWR0aCc6IGNvbC53aWR0aCwgJ21pbi13aWR0aCc6IGNvbC53aWR0aCwgJ2xlZnQnOiBjb2wubGVmdCwgJ3JpZ2h0JzogY29sLnJpZ2h0fVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtaGVhZGVyLWNlbGwtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoaGVhZGVyVGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGhlYWRlclRlbXBsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKCRhbnkoaGVhZGVyVGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShoZWFkZXJUZW1wbGF0ZSlbY29sLmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbCwgY29sRGVmOiBjb2wgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW21hdC1zb3J0LWhlYWRlcl09XCJjb2wuc29ydFByb3A/LmlkIHx8IGNvbC5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvbC5zb3J0YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZUNsZWFyXT1cImNvbC5zb3J0UHJvcD8uZGlzYWJsZUNsZWFyID8/IHNvcnREaXNhYmxlQ2xlYXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sLnNvcnRQcm9wPy5hcnJvd1Bvc2l0aW9uIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RhcnRdPVwiY29sLnNvcnRQcm9wPy5zdGFydCFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnNob3dFeHBhbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdHgtZ3JpZC1leHBhbnNpb24tcGxhY2Vob2xkZXJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2NvbC5oZWFkZXIgfCB0b09ic2VydmFibGUgfCBhc3luY319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuc29ydGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm10eC1ncmlkLWljb24gbWF0LXNvcnQtaGVhZGVyLWljb25cIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGZvY3VzYWJsZT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zLDEzSDE1VjExSDNNMyw2VjhIMjFWNk0zLDE4SDlWMTZIM1YxOFpcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyRXh0cmFUcGxCYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaGVhZGVyRXh0cmFUZW1wbGF0ZSwgY29sRGVmOiBjb2wgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGluZGV4ID0gaW5kZXg7IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXg7XCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sIHwgY29sQ2xhc3M6IHJvdzogcm93Q2hhbmdlUmVjb3JkOiByb3dDaGFuZ2VSZWNvcmQ/LmN1cnJlbnRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm1hdC10YWJsZS1zdGlja3ktbGVmdF09XCJjb2wucGlubmVkID09PSAnbGVmdCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtdGFibGUtc3RpY2t5LXJpZ2h0XT1cImNvbC5waW5uZWQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7J3dpZHRoJzogY29sLndpZHRoLCAnbWluLXdpZHRoJzogY29sLndpZHRoLCAnbGVmdCc6IGNvbC5sZWZ0LCAncmlnaHQnOiBjb2wucmlnaHR9XCJcbiAgICAgICAgICAgICAgICBtdHgtZ3JpZC1zZWxlY3RhYmxlLWNlbGwgW2NlbGxTZWxlY3RhYmxlXT1cImNlbGxTZWxlY3RhYmxlXCJcbiAgICAgICAgICAgICAgICAoY2VsbFNlbGVjdGVkQ2hhbmdlKT1cIl9zZWxlY3RDZWxsKCRldmVudCwgcm93LCBjb2wpXCI+XG4gICAgICAgICAgICAgICAgQGlmIChjZWxsVGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShjZWxsVGVtcGxhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoJGFueShjZWxsVGVtcGxhdGUpPy5bY29sLmZpZWxkXSB8IGlzVGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoY2VsbFRlbXBsYXRlKVtjb2wuZmllbGRdXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpLCBjb2xEZWY6IGNvbCB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuY2VsbFRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2wuY2VsbFRlbXBsYXRlIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpLCBjb2xEZWY6IGNvbCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wuc2hvd0V4cGFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm10eC1ncmlkLXJvdy1leHBhbmQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIG10eC1ncmlkLWV4cGFuc2lvbi10b2dnbGUgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsob3BlbmVkKV09XCJleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0b2dnbGVDaGFuZ2UpPVwiX29uRXhwYW5zaW9uQ2hhbmdlKCRldmVudCwgcm93LCBjb2wsIGRhdGFJbmRleCk7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJtdHgtZ3JpZC1pY29uIG10eC1ncmlkLXJvdy1leHBhbmQtaWNvblwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRweFwiIGhlaWdodD1cIjI0cHhcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZm9jdXNhYmxlPVwiZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02elwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDxtdHgtZ3JpZC1jZWxsIFtyb3dEYXRhXT1cInJvd1wiIFtjb2xEZWZdPVwiY29sXCIgW3BsYWNlaG9sZGVyXT1cImVtcHR5VmFsdWVQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAocm93RGF0YUNoYW5nZSk9XCJfb25Sb3dEYXRhQ2hhbmdlKCRldmVudClcIj48L210eC1ncmlkLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWZcbiAgICAgICAgICAgICAgICBbY2xhc3MubWF0LXRhYmxlLXN0aWNreS1sZWZ0XT1cImNvbC5waW5uZWQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm1hdC10YWJsZS1zdGlja3ktcmlnaHRdPVwiY29sLnBpbm5lZCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgW3N0eWxlXT1cInsnd2lkdGgnOiBjb2wud2lkdGgsICdtaW4td2lkdGgnOiBjb2wud2lkdGgsICdsZWZ0JzogY29sLmxlZnQsICdyaWdodCc6IGNvbC5yaWdodH1cIj5cbiAgICAgICAgICAgICAgICBAaWYgKGNvbC5zaG93RXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvbi1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChzdW1tYXJ5VGVtcGxhdGUgfCBpc1RlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShzdW1tYXJ5VGVtcGxhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sLCBkYXRhOiBkYXRhIH1cIj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICBAaWYgKCRhbnkoc3VtbWFyeVRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KHN1bW1hcnlUZW1wbGF0ZSlbY29sLmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBfZ2V0Q29sRGF0YShkYXRhLCBjb2wpLCBjb2xEYXRhOiBfZ2V0Q29sRGF0YShkYXRhLCBjb2wpLCBjb2xEZWY6IGNvbCB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPG10eC1ncmlkLWNlbGwgW3N1bW1hcnldPVwidHJ1ZVwiIFtkYXRhXT1cImRhdGFcIiBbY29sRGVmXT1cImNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVtcHR5VmFsdWVQbGFjZWhvbGRlclwiPjwvbXR4LWdyaWQtY2VsbD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmICghdXNlQ29udGVudEhlYWRlclJvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoIXVzZUNvbnRlbnRSb3dUZW1wbGF0ZSkge1xuICAgICAgICAgICAgPHRyIG1hdC1yb3dcbiAgICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJyb3cgfCByb3dDbGFzczogaW5kZXg6IGRhdGFJbmRleDogcm93Q2xhc3NGb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwicm93U2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJfc2VsZWN0Um93KCRldmVudCwgcm93LCBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCkpXCJcbiAgICAgICAgICAgICAgKGNvbnRleHRtZW51KT1cIl9jb250ZXh0bWVudSgkZXZlbnQsIHJvdywgX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpKVwiPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChfd2hldGhlclNob3dTdW1tYXJ5KSB7XG4gICAgICAgICAgICA8dHIgbWF0LWZvb3Rlci1yb3cgKm1hdEZvb3RlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoZXhwYW5kYWJsZSkge1xuICAgICAgICAgICAgPCEtLSBFeHBhbmRlZCBDb250ZW50IENvbHVtbiAtIFRoZSBleHBhbmRhYmxlIHJvdyBpcyBtYWRlIHVwIG9mIHRoaXMgb25lIGNvbHVtbiB0aGF0IHNwYW5zIGFjcm9zcyBhbGwgY29sdW1ucyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiTXR4R3JpZEV4cGFuc2lvbkNvbHVtbkRlZlwiPlxuICAgICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5jb2xzcGFuXT1cImRpc3BsYXllZENvbHVtbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvbi1kZXRhaWxcIlxuICAgICAgICAgICAgICAgICAgW0BleHBhbnNpb25dPVwiZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWQgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJleHBhbnNpb25UZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93LCByb3dEYXRhOiByb3csIGluZGV4OiBkYXRhSW5kZXgsIGV4cGFuZGVkOiBleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZCB9XCI+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8dHIgbWF0LXJvd1xuICAgICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydNdHhHcmlkRXhwYW5zaW9uQ29sdW1uRGVmJ107IGxldCBkYXRhSW5kZXggPSBkYXRhSW5kZXhcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm10eC1ncmlkLWV4cGFuc2lvblwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJleHBhbnNpb25Sb3dTdGF0ZXNbZGF0YUluZGV4XS5leHBhbmRlZCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPCEtLSBUT0RPOiBVc2UgZmxleGJveC1iYXNlZCBtYXQtdGFibGUgLS0+XG4gICAgICAgIDx0YWJsZSBtYXQtdGFibGVcbiAgICAgICAgICBjb2x1bW5SZXNpemVcbiAgICAgICAgICBbY2xhc3NdPVwieydtYXQtdGFibGUtaG92ZXInOiByb3dIb3ZlciwgJ21hdC10YWJsZS1zdHJpcGVkJzogcm93U3RyaXBlZCwgJ21hdC10YWJsZS1leHBhbmRhYmxlJzogZXhwYW5kYWJsZX1cIlxuICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT1cImV4cGFuZGFibGVcIlxuICAgICAgICAgIG1hdFNvcnRcbiAgICAgICAgICBbbWF0U29ydEFjdGl2ZV09XCJzb3J0QWN0aXZlXCJcbiAgICAgICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcbiAgICAgICAgICBbbWF0U29ydERpc2FibGVDbGVhcl09XCJzb3J0RGlzYWJsZUNsZWFyXCJcbiAgICAgICAgICBbbWF0U29ydERpc2FibGVkXT1cInNvcnREaXNhYmxlZFwiXG4gICAgICAgICAgW21hdFNvcnRTdGFydF09XCJzb3J0U3RhcnRcIlxuICAgICAgICAgIChtYXRTb3J0Q2hhbmdlKT1cIl9vblNvcnRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiPlxuICAgICAgICAgIEBpZiAocm93U2VsZWN0YWJsZSAmJiAhaGlkZVJvd1NlbGVjdGlvbkNoZWNrYm94KSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIk10eEdyaWRDaGVja2JveENvbHVtbkRlZlwiPlxuICAgICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwibXR4LWdyaWQtY2hlY2tib3gtY2VsbFwiPlxuICAgICAgICAgICAgICAgIEBpZiAobXVsdGlTZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvd1NlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIF9pc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJyb3dTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhX2lzQWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gX3RvZ2dsZU1hc3RlckNoZWNrYm94KCkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4O1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtdHgtZ3JpZC1jaGVja2JveC1jZWxsXCI+XG4gICAgICAgICAgICAgICAgQGlmICghKHJvd1NlbGVjdGlvbkZvcm1hdHRlci5oaWRlQ2hlY2tib3ggJiYgcm93U2VsZWN0aW9uRm9ybWF0dGVyLmhpZGVDaGVja2JveChyb3csIF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSkpKSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyb3dTZWxlY3Rpb25Gb3JtYXR0ZXIuZGlzYWJsZWQgJiYgcm93U2VsZWN0aW9uRm9ybWF0dGVyLmRpc2FibGVkKHJvdywgX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvd1NlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBfdG9nZ2xlTm9ybWFsQ2hlY2tib3gocm93KSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZiBjbGFzcz1cIm10eC1ncmlkLWNoZWNrYm94LWNlbGxcIj48L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyB0cmFjayBjb2wpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2wuZmllbGRcIlxuICAgICAgICAgICAgICBbc3RpY2t5XT1cImNvbC5waW5uZWQ9PT0nbGVmdCdcIiBbc3RpY2t5RW5kXT1cImNvbC5waW5uZWQ9PT0ncmlnaHQnXCI+XG4gICAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWZcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY29sIHwgY29sQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtdGFibGUtc3RpY2t5LWxlZnRdPVwiY29sLnBpbm5lZCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWF0LXRhYmxlLXN0aWNreS1yaWdodF09XCJjb2wucGlubmVkID09PSAncmlnaHQnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyd3aWR0aCc6IGNvbC53aWR0aCwgJ2xlZnQnOiBjb2wubGVmdCwgJ3JpZ2h0JzogY29sLnJpZ2h0fVwiXG4gICAgICAgICAgICAgICAgW3Jlc2l6YWJsZV09XCJjb2wucmVzaXphYmxlXCJcbiAgICAgICAgICAgICAgICBbbWF0UmVzaXphYmxlTWluV2lkdGhQeF09XCJjb2wubWluV2lkdGhcIiBbbWF0UmVzaXphYmxlTWF4V2lkdGhQeF09XCJjb2wubWF4V2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWhlYWRlci1jZWxsLWlubmVyXCI+XG4gICAgICAgICAgICAgICAgICBAaWYgKGhlYWRlclRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShoZWFkZXJUZW1wbGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmICgkYW55KGhlYWRlclRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoaGVhZGVyVGVtcGxhdGUpW2NvbC5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFttYXQtc29ydC1oZWFkZXJdPVwiY29sLnNvcnRQcm9wPy5pZCB8fCBjb2wuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjb2wuc29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVDbGVhcl09XCJjb2wuc29ydFByb3A/LmRpc2FibGVDbGVhciA/PyBzb3J0RGlzYWJsZUNsZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcnJvd1Bvc2l0aW9uXT1cImNvbC5zb3J0UHJvcD8uYXJyb3dQb3NpdGlvbiFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0YXJ0XT1cImNvbC5zb3J0UHJvcD8uc3RhcnQhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5zaG93RXhwYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXR4LWdyaWQtZXhwYW5zaW9uLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tjb2wuaGVhZGVyIHwgdG9PYnNlcnZhYmxlIHwgYXN5bmN9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnNvcnRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJtdHgtZ3JpZC1pY29uIG1hdC1zb3J0LWhlYWRlci1pY29uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIyNHB4XCIgaGVpZ2h0PVwiMjRweFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBmb2N1c2FibGU9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMywxM0gxNVYxMUgzTTMsNlY4SDIxVjZNMywxOEg5VjE2SDNWMThaXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlckV4dHJhVHBsQmFzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGhlYWRlckV4dHJhVGVtcGxhdGUsIGNvbERlZjogY29sIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4OyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4O1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNvbCB8IGNvbENsYXNzOiByb3c6IHJvd0NoYW5nZVJlY29yZCA6cm93Q2hhbmdlUmVjb3JkPy5jdXJyZW50VmFsdWVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtdGFibGUtc3RpY2t5LWxlZnRdPVwiY29sLnBpbm5lZCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWF0LXRhYmxlLXN0aWNreS1yaWdodF09XCJjb2wucGlubmVkID09PSAncmlnaHQnXCJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyd3aWR0aCc6IGNvbC53aWR0aCwgJ2xlZnQnOiBjb2wubGVmdCwgJ3JpZ2h0JzogY29sLnJpZ2h0fVwiXG4gICAgICAgICAgICAgICAgbXR4LWdyaWQtc2VsZWN0YWJsZS1jZWxsIFtjZWxsU2VsZWN0YWJsZV09XCJjZWxsU2VsZWN0YWJsZVwiXG4gICAgICAgICAgICAgICAgKGNlbGxTZWxlY3RlZENoYW5nZSk9XCJfc2VsZWN0Q2VsbCgkZXZlbnQsIHJvdywgY29sKVwiPlxuICAgICAgICAgICAgICAgIEBpZiAoY2VsbFRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoY2VsbFRlbXBsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93LCByb3dEYXRhOiByb3csIGluZGV4OiBfZ2V0SW5kZXgoaW5kZXgsIGRhdGFJbmRleCksIGNvbERlZjogY29sIH1cIj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICBAaWYgKCRhbnkoY2VsbFRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCIkYW55KGNlbGxUZW1wbGF0ZSlbY29sLmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLmNlbGxUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sLmNlbGxUZW1wbGF0ZSFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3csIHJvd0RhdGE6IHJvdywgaW5kZXg6IF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSwgY29sRGVmOiBjb2wgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sLnNob3dFeHBhbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJtdHgtZ3JpZC1yb3ctZXhwYW5kLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvbiBtdHgtZ3JpZC1leHBhbnNpb24tdG9nZ2xlIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG9wZW5lZCldPVwiZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodG9nZ2xlQ2hhbmdlKT1cIl9vbkV4cGFuc2lvbkNoYW5nZSgkZXZlbnQsIHJvdywgY29sLCBkYXRhSW5kZXgpO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwibXR4LWdyaWQtaWNvbiBtdHgtZ3JpZC1yb3ctZXhwYW5kLWljb25cIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGZvY3VzYWJsZT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnpcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8bXR4LWdyaWQtY2VsbCBbcm93RGF0YV09XCJyb3dcIiBbY29sRGVmXT1cImNvbFwiIFtwbGFjZWhvbGRlcl09XCJlbXB0eVZhbHVlUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHJvd0RhdGFDaGFuZ2UpPVwiX29uUm93RGF0YUNoYW5nZSgkZXZlbnQpXCI+PC9tdHgtZ3JpZC1jZWxsPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQgbWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmXG4gICAgICAgICAgICAgICAgW2NsYXNzLm1hdC10YWJsZS1zdGlja3ktbGVmdF09XCJjb2wucGlubmVkID09PSAnbGVmdCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtdGFibGUtc3RpY2t5LXJpZ2h0XT1cImNvbC5waW5uZWQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7J3dpZHRoJzogY29sLndpZHRoLCAnbGVmdCc6IGNvbC5sZWZ0LCAncmlnaHQnOiBjb2wucmlnaHR9XCI+XG4gICAgICAgICAgICAgICAgQGlmIChjb2wuc2hvd0V4cGFuZCkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtdHgtZ3JpZC1leHBhbnNpb24tcGxhY2Vob2xkZXJcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoc3VtbWFyeVRlbXBsYXRlIHwgaXNUZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoc3VtbWFyeVRlbXBsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sLCBjb2xEZWY6IGNvbCwgZGF0YTogZGF0YSB9XCI+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgQGlmICgkYW55KHN1bW1hcnlUZW1wbGF0ZSk/Lltjb2wuZmllbGRdIHwgaXNUZW1wbGF0ZVJlZikge1xuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueShzdW1tYXJ5VGVtcGxhdGUpW2NvbC5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogX2dldENvbERhdGEoZGF0YSwgY29sKSwgY29sRGF0YTogX2dldENvbERhdGEoZGF0YSwgY29sKSwgY29sRGVmOiBjb2wgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxtdHgtZ3JpZC1jZWxsIFtzdW1tYXJ5XT1cInRydWVcIiBbZGF0YV09XCJkYXRhXCIgW2NvbERlZl09XCJjb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJlbXB0eVZhbHVlUGxhY2Vob2xkZXJcIj48L210eC1ncmlkLWNlbGw+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoIXVzZUNvbnRlbnRIZWFkZXJSb3dUZW1wbGF0ZSkge1xuICAgICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKCF1c2VDb250ZW50Um93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgIDx0ciBtYXQtcm93XG4gICAgICAgICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBsZXQgaW5kZXggPSBpbmRleDsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleDsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwicm93IHwgcm93Q2xhc3M6IGluZGV4OiBkYXRhSW5kZXg6IHJvd0NsYXNzRm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInJvd1NlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiX3NlbGVjdFJvdygkZXZlbnQsIHJvdywgX2dldEluZGV4KGluZGV4LCBkYXRhSW5kZXgpKVwiXG4gICAgICAgICAgICAgIChjb250ZXh0bWVudSk9XCJfY29udGV4dG1lbnUoJGV2ZW50LCByb3csIF9nZXRJbmRleChpbmRleCwgZGF0YUluZGV4KSlcIj5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoX3doZXRoZXJTaG93U3VtbWFyeSkge1xuICAgICAgICAgICAgPHRyIG1hdC1mb290ZXItcm93ICptYXRGb290ZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGV4cGFuZGFibGUpIHtcbiAgICAgICAgICAgIDwhLS0gRXhwYW5kZWQgQ29udGVudCBDb2x1bW4gLSBUaGUgZXhwYW5kYWJsZSByb3cgaXMgbWFkZSB1cCBvZiB0aGlzIG9uZSBjb2x1bW4gdGhhdCBzcGFucyBhY3Jvc3MgYWxsIGNvbHVtbnMgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIk10eEdyaWRFeHBhbnNpb25Db2x1bW5EZWZcIj5cbiAgICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdzsgbGV0IGRhdGFJbmRleCA9IGRhdGFJbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJkaXNwbGF5ZWRDb2x1bW5zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1leHBhbnNpb24tZGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgIFtAZXhwYW5zaW9uXT1cImV4cGFuc2lvblJvd1N0YXRlc1tkYXRhSW5kZXhdLmV4cGFuZGVkID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiZXhwYW5zaW9uVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvdywgcm93RGF0YTogcm93LCBpbmRleDogZGF0YUluZGV4LCBleHBhbmRlZDogZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWQgfVwiPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHRyIG1hdC1yb3dcbiAgICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnTXR4R3JpZEV4cGFuc2lvbkNvbHVtbkRlZiddOyBsZXQgZGF0YUluZGV4ID0gZGF0YUluZGV4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtdHgtZ3JpZC1leHBhbnNpb25cIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZXhwYW5zaW9uUm93U3RhdGVzW2RhdGFJbmRleF0uZXhwYW5kZWQgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCdcIj5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICA8L3RhYmxlPlxuICAgICAgfVxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBObyByZXN1bHQgLS0+XG4gICAgQGlmIChfaGFzTm9SZXN1bHQpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJtdHgtZ3JpZC1uby1yZXN1bHRcIj5cbiAgICAgICAgQGlmIChub1Jlc3VsdFRlbXBsYXRlKSB7XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vUmVzdWx0VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICB7e25vUmVzdWx0VGV4dH19XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPCEtLSBUb29sIHNpZGViYXIgLS0+XG4gIEBpZiAoc2hvd1NpZGViYXIpIHtcbiAgICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtc2lkZWJhclwiPlxuICAgICAgQGlmIChzaWRlYmFyVGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNpZGViYXJUZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwibXR4LWdyaWQtZm9vdGVyXCI+XG4gIDwhLS0gU3RhdHVzIEJhciAtLT5cbiAgQGlmIChzaG93U3RhdHVzYmFyKSB7XG4gICAgPGRpdiBjbGFzcz1cIm10eC1ncmlkLXN0YXR1c2JhclwiPlxuICAgICAgQGlmIChzdGF0dXNiYXJUZW1wbGF0ZSkge1xuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RhdHVzYmFyVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG5cbiAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICA8ZGl2IGNsYXNzPVwibXR4LWdyaWQtcGFnaW5hdGlvblwiPlxuICAgIEBpZiAocGFnaW5hdGlvblRlbXBsYXRlKSB7XG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwicGFnaW5hdGlvblRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxtYXQtcGFnaW5hdG9yIFtjbGFzcy5tYXQtcGFnaW5hdG9yLWhpZGRlbl09XCIhc2hvd1BhZ2luYXRvclwiXG4gICAgICAgIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJzaG93Rmlyc3RMYXN0QnV0dG9uc1wiXG4gICAgICAgIFtsZW5ndGhdPVwibGVuZ3RoXCJcbiAgICAgICAgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIlxuICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgIFtoaWRlUGFnZVNpemVdPVwiaGlkZVBhZ2VTaXplXCJcbiAgICAgICAgKHBhZ2UpPVwiX29uUGFnZSgkZXZlbnQpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInBhZ2VEaXNhYmxlZFwiPlxuICAgICAgPC9tYXQtcGFnaW5hdG9yPlxuICAgIH1cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBIZWFkZXIgdGVtcGxhdGUgZm9yIGV4dHJhIGNvbnRlbnQgLS0+XG48bmctdGVtcGxhdGUgI2hlYWRlckV4dHJhVHBsQmFzZSBsZXQtaGVhZGVyRXh0cmFUZW1wbGF0ZSBsZXQtY29sPVwiY29sRGVmXCI+XG4gIEBpZiAoaGVhZGVyRXh0cmFUZW1wbGF0ZSB8IGlzVGVtcGxhdGVSZWYpIHtcbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyRXh0cmFUZW1wbGF0ZVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbCwgY29sRGVmOiBjb2wgfVwiPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIH0gQGVsc2Uge1xuICAgIEBpZiAoJGFueShoZWFkZXJFeHRyYVRlbXBsYXRlKT8uW2NvbC5maWVsZF0gfCBpc1RlbXBsYXRlUmVmKSB7XG4gICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyRXh0cmFUZW1wbGF0ZVtjb2wuZmllbGRdXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2wsIGNvbERlZjogY29sIH1cIj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgfVxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|