@energycap/components 0.44.8 → 0.44.9-Angular19Upgrade.20260217-1620
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/fesm2022/energycap-components.mjs +379 -354
- package/fesm2022/energycap-components.mjs.map +1 -1
- package/lib/controls/button/copy-button-base.directive.d.ts +1 -1
- package/lib/controls/date-input/date-input.component.d.ts +1 -1
- package/lib/controls/form-control-base.d.ts +1 -1
- package/lib/core/date-time-helper.d.ts +2 -2
- package/lib/display/hierarchy/hierarchy-base.d.ts +1 -1
- package/lib/display/hierarchy/hierarchy-mocks.spec.d.ts +1 -1
- package/lib/display/resizable/resizable-base.d.ts +1 -1
- package/lib/shared/display/pipes/date-display.pipe.d.ts +1 -1
- package/lib/shared/page/page-base/page-base.component.d.ts +1 -1
- package/lib/shared/testing/public-mocks.spec.d.ts +1 -1
- package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +1 -1
- package/package.json +1 -3
- package/schematics/utilities/typescript.js +3 -4
- package/schematics/utilities/typescript.js.map +1 -1
- package/schematics/utilities/workspace.d.ts +0 -8
- package/schematics/utilities/workspace.js +48 -71
- package/schematics/utilities/workspace.js.map +1 -1
- package/esm2022/energycap-components.mjs +0 -5
- package/esm2022/lib/components.module.mjs +0 -425
- package/esm2022/lib/controls/banner/banner.component.mjs +0 -112
- package/esm2022/lib/controls/button/button.component.mjs +0 -114
- package/esm2022/lib/controls/button/copy-button-base.directive.mjs +0 -67
- package/esm2022/lib/controls/button/copy-button.directive.mjs +0 -28
- package/esm2022/lib/controls/button/copy-table-button.directive.mjs +0 -43
- package/esm2022/lib/controls/calendar/calendar-item.component.mjs +0 -91
- package/esm2022/lib/controls/calendar/calendar.component.mjs +0 -251
- package/esm2022/lib/controls/calendar/calendar.types.mjs +0 -2
- package/esm2022/lib/controls/checkbox/checkbox.component.mjs +0 -140
- package/esm2022/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +0 -38
- package/esm2022/lib/controls/combobox/combobox.component.mjs +0 -879
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/date-input-selection-strategy-base.mjs +0 -57
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/day-selection-strategy.mjs +0 -62
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-28-days-selection-strategy.mjs +0 -100
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/last-7-days-selection-strategy.mjs +0 -101
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/month-selection-strategy.mjs +0 -76
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/quarter-selection-strategy.mjs +0 -79
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/range-selection-strategy.mjs +0 -210
- package/esm2022/lib/controls/date-input/date-input-selection-strategies/year-selection-strategy.mjs +0 -81
- package/esm2022/lib/controls/date-input/date-input.component.mjs +0 -466
- package/esm2022/lib/controls/date-input/date-input.types.mjs +0 -44
- package/esm2022/lib/controls/dropdown/dropdown.component.mjs +0 -243
- package/esm2022/lib/controls/file-upload/file-upload.component.mjs +0 -261
- package/esm2022/lib/controls/form-control/form-control.component.mjs +0 -110
- package/esm2022/lib/controls/form-control-base.mjs +0 -151
- package/esm2022/lib/controls/form-control-label/form-control-label.component.mjs +0 -136
- package/esm2022/lib/controls/form-group/form-group.component.mjs +0 -261
- package/esm2022/lib/controls/help-popover/help-popover.component.mjs +0 -31
- package/esm2022/lib/controls/item-picker/item-picker.component.mjs +0 -329
- package/esm2022/lib/controls/link-button/link-button.component.mjs +0 -11
- package/esm2022/lib/controls/menu/menu.component.mjs +0 -485
- package/esm2022/lib/controls/navigation/link-item.mjs +0 -2
- package/esm2022/lib/controls/navigation/nav-group.mjs +0 -39
- package/esm2022/lib/controls/navigation/nav-item-active.directive.mjs +0 -92
- package/esm2022/lib/controls/navigation/nav-item.mjs +0 -2
- package/esm2022/lib/controls/numericbox/numericbox.component.mjs +0 -372
- package/esm2022/lib/controls/popover/popover.component.mjs +0 -117
- package/esm2022/lib/controls/radio-button/radio-button-option.mjs +0 -3
- package/esm2022/lib/controls/radio-button/radio-button.component.mjs +0 -82
- package/esm2022/lib/controls/select/select.component.mjs +0 -88
- package/esm2022/lib/controls/tabs/tabs.component.mjs +0 -47
- package/esm2022/lib/controls/textbox/textbox.component.mjs +0 -155
- package/esm2022/lib/core/cache.service.mjs +0 -105
- package/esm2022/lib/core/custom-validators.mjs +0 -29
- package/esm2022/lib/core/date-time-helper.mjs +0 -228
- package/esm2022/lib/core/error.service.mjs +0 -61
- package/esm2022/lib/core/router-helper.service.mjs +0 -111
- package/esm2022/lib/core/scroll.service.mjs +0 -89
- package/esm2022/lib/core/telemetry-tracker.service.mjs +0 -16
- package/esm2022/lib/core/telemetry.service.mjs +0 -38
- package/esm2022/lib/core/validation-message.service.mjs +0 -185
- package/esm2022/lib/core/validation-patterns.mjs +0 -31
- package/esm2022/lib/core/window.service.mjs +0 -186
- package/esm2022/lib/display/app-bar/app-bar.component.mjs +0 -49
- package/esm2022/lib/display/avatar/avatar.component.mjs +0 -67
- package/esm2022/lib/display/avatar/avatar.service.mjs +0 -64
- package/esm2022/lib/display/confirm/confirm.component.mjs +0 -168
- package/esm2022/lib/display/dialog/dialog-content.mjs +0 -2
- package/esm2022/lib/display/dialog/dialog-group/dialog-group.component.mjs +0 -63
- package/esm2022/lib/display/dialog/dialog-types.mjs +0 -77
- package/esm2022/lib/display/dialog/dialog.component.mjs +0 -287
- package/esm2022/lib/display/dialog/dialog.service.mjs +0 -71
- package/esm2022/lib/display/help/help-types.mjs +0 -2
- package/esm2022/lib/display/hierarchy/hierarchy-base.mjs +0 -111
- package/esm2022/lib/display/hierarchy/hierarchy-mocks.spec.mjs +0 -54
- package/esm2022/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +0 -65
- package/esm2022/lib/display/item-display/item-display.component.mjs +0 -83
- package/esm2022/lib/display/json-display/json-display.component.mjs +0 -47
- package/esm2022/lib/display/resizable/resizable-base.mjs +0 -120
- package/esm2022/lib/display/resizable/resizable.component.mjs +0 -57
- package/esm2022/lib/display/spinner/spinner.component.mjs +0 -12
- package/esm2022/lib/display/splash/splash.component.mjs +0 -61
- package/esm2022/lib/display/splash/splash.service.mjs +0 -35
- package/esm2022/lib/display/table/resizable-column.component.mjs +0 -20
- package/esm2022/lib/display/table/resizable-table.directive.mjs +0 -227
- package/esm2022/lib/display/table/searchable-table.component.mjs +0 -344
- package/esm2022/lib/display/table/table-detail-row.component.mjs +0 -28
- package/esm2022/lib/display/table/table-locked-column.component.mjs +0 -58
- package/esm2022/lib/display/table/table-master-header-row.component.mjs +0 -14
- package/esm2022/lib/display/table/table-master-row.component.mjs +0 -163
- package/esm2022/lib/display/table/table-pagination.component.mjs +0 -155
- package/esm2022/lib/display/table/table-selectable-row.component.mjs +0 -235
- package/esm2022/lib/display/table/table.component.mjs +0 -257
- package/esm2022/lib/display/tags/tag.mjs +0 -18
- package/esm2022/lib/display/tags/tags.component.mjs +0 -82
- package/esm2022/lib/display/toast/toast/toast.component.mjs +0 -77
- package/esm2022/lib/display/toast/toast-types.mjs +0 -8
- package/esm2022/lib/display/toast/toast.service.mjs +0 -35
- package/esm2022/lib/display/toast/toaster/toaster.component.mjs +0 -114
- package/esm2022/lib/display/tooltip/tooltip.component.mjs +0 -28
- package/esm2022/lib/display/tooltip/tooltip.service.mjs +0 -78
- package/esm2022/lib/display/tooltip-directive/tooltip.directive.mjs +0 -173
- package/esm2022/lib/display/tree/tree.component.mjs +0 -139
- package/esm2022/lib/display/view-overlay/view-overlay.component.mjs +0 -58
- package/esm2022/lib/shared/directives/click-area-for/click-area-for.directive.mjs +0 -32
- package/esm2022/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +0 -111
- package/esm2022/lib/shared/directives/keyboard-nav-container/keyboard-nav-container.directive.mjs +0 -103
- package/esm2022/lib/shared/directives/popup/popup-container.directive.mjs +0 -166
- package/esm2022/lib/shared/display/pipes/date-display-2.pipe.mjs +0 -39
- package/esm2022/lib/shared/display/pipes/date-display.pipe.mjs +0 -51
- package/esm2022/lib/shared/display/pipes/highlight-text.pipe.mjs +0 -30
- package/esm2022/lib/shared/display/pipes/relative-date.pipe.mjs +0 -62
- package/esm2022/lib/shared/display/pipes/row-count.pipe.mjs +0 -48
- package/esm2022/lib/shared/display/pipes/time-display.pipe.mjs +0 -41
- package/esm2022/lib/shared/display.mjs +0 -6
- package/esm2022/lib/shared/form-group.helper.mjs +0 -67
- package/esm2022/lib/shared/json-helper.mjs +0 -19
- package/esm2022/lib/shared/lodash-helper.mjs +0 -52
- package/esm2022/lib/shared/page/page-base/page-base.component.mjs +0 -387
- package/esm2022/lib/shared/page/page-statuses.mjs +0 -23
- package/esm2022/lib/shared/page/page-title/page-title.component.mjs +0 -23
- package/esm2022/lib/shared/page/page-view/page-view.component.mjs +0 -147
- package/esm2022/lib/shared/testing/copy-button-base-test-injector-factory.spec.mjs +0 -17
- package/esm2022/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs +0 -17
- package/esm2022/lib/shared/testing/page-base-component-test-helper.spec.mjs +0 -38
- package/esm2022/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs +0 -98
- package/esm2022/lib/shared/testing/public-mocks.spec.mjs +0 -148
- package/esm2022/lib/shared/testing/spy-factory.spec.mjs +0 -40
- package/esm2022/lib/shared/testing/translation-mocks.spec.mjs +0 -57
- package/esm2022/lib/shared/user-preference.service.mjs +0 -17
- package/esm2022/lib/shared/wizard/wizard-base/wizard-base.component.mjs +0 -246
- package/esm2022/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +0 -68
- package/esm2022/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +0 -18
- package/esm2022/public-api.mjs +0 -115
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, TemplateRef, ViewChild } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@angular/common";
|
|
4
|
-
import * as i2 from "../../controls/collapsible-toggle/collapsible-toggle.component";
|
|
5
|
-
import * as i3 from "./table-detail-row.component";
|
|
6
|
-
export class TableMasterRowComponent {
|
|
7
|
-
constructor(renderer, el, appRef) {
|
|
8
|
-
this.renderer = renderer;
|
|
9
|
-
this.el = el;
|
|
10
|
-
this.appRef = appRef;
|
|
11
|
-
/**
|
|
12
|
-
* Programmatically toggle the visibility of the detail row. Default is false.
|
|
13
|
-
*/
|
|
14
|
-
this.showDetails = false;
|
|
15
|
-
/**
|
|
16
|
-
* Emits an event when the value of `showDetails` changes.
|
|
17
|
-
*/
|
|
18
|
-
this.showDetailsChanged = new EventEmitter();
|
|
19
|
-
}
|
|
20
|
-
ngOnInit() {
|
|
21
|
-
if (!this.detailRowColSpan) {
|
|
22
|
-
console.error(`A value for [detailRowColSpan] is required to render a detail row correctly. This should be the number of columns TDs placed inside an tr[ecTableMasterRow].`);
|
|
23
|
-
}
|
|
24
|
-
this.parentNode = this.renderer.parentNode(this.el.nativeElement);
|
|
25
|
-
this.updateDetailRow();
|
|
26
|
-
}
|
|
27
|
-
ngOnChanges(changes) {
|
|
28
|
-
if (changes.hasDetails && !changes.hasDetails.firstChange && changes.hasDetails.currentValue !== undefined) {
|
|
29
|
-
this.updateDetailRow();
|
|
30
|
-
}
|
|
31
|
-
if (changes.showDetails && !changes.showDetails.firstChange && changes.showDetails.currentValue !== undefined) {
|
|
32
|
-
this.updateVisibility();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
ngOnDestroy() {
|
|
36
|
-
this.removeDetailView();
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* When the master row has details, create the detail row and update it's visibility. If the master
|
|
40
|
-
* has no details, remove the detail row
|
|
41
|
-
*/
|
|
42
|
-
updateDetailRow() {
|
|
43
|
-
if (this.hasDetails) {
|
|
44
|
-
if (!this.detailTemplate) {
|
|
45
|
-
console.error(`A value for the [detailTemplate] input is required when 'hasDetails' is true.`);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
// First check to see if the detailView is already present and if so, remove it so we don't get a
|
|
49
|
-
// duplicate detail view
|
|
50
|
-
if (this.detailView !== undefined) {
|
|
51
|
-
this.removeDetailView();
|
|
52
|
-
}
|
|
53
|
-
this.detailView = this.detailRowTemplate.createEmbeddedView({});
|
|
54
|
-
//solution to allowing change detection in embedded view adapted from here:
|
|
55
|
-
//https://github.com/angular/angular/issues/42977
|
|
56
|
-
this.appRef.attachView(this.detailView);
|
|
57
|
-
this.updateVisibility();
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
this.removeDetailView();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Show/hide the detail row
|
|
65
|
-
*/
|
|
66
|
-
toggleDetails(show) {
|
|
67
|
-
this.showDetails = show;
|
|
68
|
-
this.showDetailsChanged.emit(show);
|
|
69
|
-
this.updateVisibility();
|
|
70
|
-
}
|
|
71
|
-
updateVisibility() {
|
|
72
|
-
if (this.showDetails) {
|
|
73
|
-
this.show();
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
this.hide();
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Attach the detailView the change detection tree and insert the generated html
|
|
81
|
-
* of the detail row to DOM after the host element
|
|
82
|
-
*/
|
|
83
|
-
show() {
|
|
84
|
-
if (this.detailView) {
|
|
85
|
-
//The nextSibling may have changed, so update it. (This could happen if the table is embedded in a searchable table
|
|
86
|
-
// and a search is performed)
|
|
87
|
-
this.siblingNode = this.renderer.nextSibling(this.el.nativeElement);
|
|
88
|
-
this.detailView.reattach();
|
|
89
|
-
this.detailView.detectChanges();
|
|
90
|
-
this.detailView.rootNodes.forEach(node => {
|
|
91
|
-
this.renderer.insertBefore(this.parentNode, node, this.siblingNode);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Detach the detailView from the change detection tree and remove the generated
|
|
97
|
-
* html of the detail row from the DOM
|
|
98
|
-
*/
|
|
99
|
-
hide() {
|
|
100
|
-
if (this.detailView) {
|
|
101
|
-
this.detailView.detach();
|
|
102
|
-
this.removeDetailNodes();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Destroy the detailView and remove the generated html of the detail row from the DOM
|
|
107
|
-
*/
|
|
108
|
-
removeDetailView() {
|
|
109
|
-
if (this.detailView) {
|
|
110
|
-
this.detailView.destroy();
|
|
111
|
-
this.removeDetailNodes();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Remove the generated html of the detail row from the DOM
|
|
116
|
-
*/
|
|
117
|
-
removeDetailNodes() {
|
|
118
|
-
if (this.detailView) {
|
|
119
|
-
this.detailView.rootNodes.forEach(n => {
|
|
120
|
-
try {
|
|
121
|
-
this.renderer.removeChild(this.parentNode, n);
|
|
122
|
-
}
|
|
123
|
-
catch (err) {
|
|
124
|
-
// Ignore errors thrown by removing nodes that were never added to the DOM.
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableMasterRowComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
130
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TableMasterRowComponent, selector: "[ecTableMasterRow]", inputs: { id: "id", hasDetails: "hasDetails", showDetails: "showDetails", detailTemplate: "detailTemplate", detailContext: "detailContext", detailRowColSpan: "detailRowColSpan", detailRowClass: "detailRowClass", detailRowContentClass: "detailRowContentClass", detailRowMaxHeight: "detailRowMaxHeight", collapsibleToggleCellClass: "collapsibleToggleCellClass", hideTableMaster: "hideTableMaster" }, outputs: { showDetailsChanged: "showDetailsChanged" }, viewQueries: [{ propertyName: "detailRowTemplate", first: true, predicate: ["detailRow"], descendants: true, read: TemplateRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<td *ngIf=\"!hideTableMaster\" class=\"{{collapsibleToggleCellClass}}\">\n <ec-collapsible-toggle *ngIf=\"hasDetails\"\n id=\"{{id}}_toggle\"\n [expanded]=\"showDetails\"\n (expandedChange)=\"toggleDetails($event)\"></ec-collapsible-toggle>\n</td>\n<ng-content></ng-content>\n\n<ng-template #detailRow>\n <tr ecTableDetailRow class=\"{{detailRowClass}}\" [contentClass]=\"detailRowContentClass\" [contentColSpan]=\"detailRowColSpan\" [maxHeight]=\"detailRowMaxHeight\">\n <ng-container *ngTemplateOutlet=\"detailTemplate; context: {$implicit: detailContext}\"></ng-container>\n </tr>\n</ng-template>", styles: ["td{width:1.5rem;padding:.25rem 0!important;vertical-align:top}td ::ng-deep+td{padding-left:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CollapsibleToggleComponent, selector: "ec-collapsible-toggle", inputs: ["id", "expanded", "tabindex"], outputs: ["expandedChange"] }, { kind: "component", type: i3.TableDetailRowComponent, selector: "[ecTableDetailRow]", inputs: ["contentClass", "contentColSpan", "maxHeight"] }] }); }
|
|
131
|
-
}
|
|
132
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableMasterRowComponent, decorators: [{
|
|
133
|
-
type: Component,
|
|
134
|
-
args: [{ selector: '[ecTableMasterRow]', template: "<td *ngIf=\"!hideTableMaster\" class=\"{{collapsibleToggleCellClass}}\">\n <ec-collapsible-toggle *ngIf=\"hasDetails\"\n id=\"{{id}}_toggle\"\n [expanded]=\"showDetails\"\n (expandedChange)=\"toggleDetails($event)\"></ec-collapsible-toggle>\n</td>\n<ng-content></ng-content>\n\n<ng-template #detailRow>\n <tr ecTableDetailRow class=\"{{detailRowClass}}\" [contentClass]=\"detailRowContentClass\" [contentColSpan]=\"detailRowColSpan\" [maxHeight]=\"detailRowMaxHeight\">\n <ng-container *ngTemplateOutlet=\"detailTemplate; context: {$implicit: detailContext}\"></ng-container>\n </tr>\n</ng-template>", styles: ["td{width:1.5rem;padding:.25rem 0!important;vertical-align:top}td ::ng-deep+td{padding-left:0}\n"] }]
|
|
135
|
-
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ApplicationRef }], propDecorators: { id: [{
|
|
136
|
-
type: Input
|
|
137
|
-
}], hasDetails: [{
|
|
138
|
-
type: Input
|
|
139
|
-
}], showDetails: [{
|
|
140
|
-
type: Input
|
|
141
|
-
}], detailTemplate: [{
|
|
142
|
-
type: Input
|
|
143
|
-
}], detailContext: [{
|
|
144
|
-
type: Input
|
|
145
|
-
}], detailRowColSpan: [{
|
|
146
|
-
type: Input
|
|
147
|
-
}], detailRowClass: [{
|
|
148
|
-
type: Input
|
|
149
|
-
}], detailRowContentClass: [{
|
|
150
|
-
type: Input
|
|
151
|
-
}], detailRowMaxHeight: [{
|
|
152
|
-
type: Input
|
|
153
|
-
}], collapsibleToggleCellClass: [{
|
|
154
|
-
type: Input
|
|
155
|
-
}], hideTableMaster: [{
|
|
156
|
-
type: Input
|
|
157
|
-
}], showDetailsChanged: [{
|
|
158
|
-
type: Output
|
|
159
|
-
}], detailRowTemplate: [{
|
|
160
|
-
type: ViewChild,
|
|
161
|
-
args: ['detailRow', { read: TemplateRef, static: true }]
|
|
162
|
-
}] } });
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtbWFzdGVyLXJvdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvZGlzcGxheS90YWJsZS90YWJsZS1tYXN0ZXItcm93LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L3RhYmxlL3RhYmxlLW1hc3Rlci1yb3cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUF1RyxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFPcE0sTUFBTSxPQUFPLHVCQUF1QjtJQXlGbEMsWUFBb0IsUUFBbUIsRUFBVSxFQUFjLEVBQVUsTUFBc0I7UUFBM0UsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFVLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQTlFL0Y7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQWtEN0I7O1dBRUc7UUFDTyx1QkFBa0IsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQXNCMEIsQ0FBQztJQUVwRyxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsOEpBQThKLENBQUMsQ0FBQztRQUNoTCxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUV6QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FB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VyxFQUFFLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIFJlbmRlcmVyMiwgRW1iZWRkZWRWaWV3UmVmLCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBBcHBsaWNhdGlvblJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdbZWNUYWJsZU1hc3RlclJvd10nLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtbWFzdGVyLXJvdy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLW1hc3Rlci1yb3cuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZU1hc3RlclJvd0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogSWRlbnRpZmllciB0byBwYXNzIHRvIHRoZSBjb2xsYXBzaWJsZSB0b2dnbGVcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0aGUgdGFibGUgcm93IGhhcyBkZXRhaWxzIGFuZCBzaG93cyB0aGUgY29sbGFwc2libGUgdG9nZ2xlIGlmIGl0IGRvZXMuXG4gICAqL1xuICBASW5wdXQoKSBoYXNEZXRhaWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUHJvZ3JhbW1hdGljYWxseSB0b2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGRldGFpbCByb3cuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBASW5wdXQoKSBzaG93RGV0YWlscyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUZW1wbGF0ZSBmb3IgdGhlIGRldGFpbCByb3cgY29udGVudC4gR2VuZXJhdGVzIGFuIFtFbWJlZGRlZFZpZXdSZWZdKGh0dHBzOi8vYW5ndWxhci5pby9hcGkvY29yZS9FbWJlZGRlZFZpZXdSZWYpXG4gICAqIHdpdGggdGhlICdkZXRhaWxDb250ZXh0Jy4gUmVxdWlyZWQgaWYgaGFzRGV0YWlscyBpcyB0cnVlLlxuICAgKi9cbiAgQElucHV0KCkgZGV0YWlsVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjb250ZXh0IGJvdW5kIHRvIHRoZSAnZGV0YWlsVGVtcGxhdGUnLiBBdmFpbGFibGUgaW4gdGhlIHRlbXBsYXRlIGFzIHRoZSBkZWZhdWx0IGxvY2FsIHRlbXBsYXRlIGBsZXRgIGRlY2xhcmF0aW9uLlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDx0ciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiIGVjVGFibGVNYXN0ZXJSb3cgW2RldGFpbFRlbXBsYXRlXT1cIm15RGV0YWlsVGVtcGxhdGVcIiBbZGV0YWlsQ29udGV4dF09XCJpdGVtXCI+XG4gICAqICAuLi5cbiAgICogPC90cj5cbiAgICpcbiAgICogPG5nLXRlbXBsYXRlICNteURldGFpbFRlbXBsYXRlIGxldC1pdGVtPlxuICAgKiAgPHA+e3tpdGVtLmNvbW1lbnR9fTwvcD5cbiAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICovXG4gIEBJbnB1dCgpIGRldGFpbENvbnRleHQ/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB5b3VyIHRhYmxlIG1pbnVzIHRoZSBjb2x1bW4gdGhhdCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IHRoZVxuICAgKiBUYWJsZU1hc3RlclJvd0NvbXBvbmVudC4gUmVxdWlyZWQuXG4gICAqL1xuICBASW5wdXQoKSBkZXRhaWxSb3dDb2xTcGFuITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGFjZSBkZWxpbWl0ZWQgc3RyaW5nIGFkZGVkIHRvIHRoZSBjbGFzcyBhdHRyaWJ1dGUgb2YgZGV0YWlsIHJvdyBUUi5cbiAgICovXG4gIEBJbnB1dCgpIGRldGFpbFJvd0NsYXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGFjZSBkZWxpbWl0ZWQgc3RyaW5nIGFkZGVkIHRvIHRoZSBjbGFzcyBhdHRyaWJ1dGUgb2YgdGhlIFREIHRoYXQgY29udGFpbnMgdGhlIGRldGFpbCByb3cgY29udGVudFxuICAgKi9cbiAgQElucHV0KCkgZGV0YWlsUm93Q29udGVudENsYXNzPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGRldGFpbFJvd01heEhlaWdodD86IHN0cmluZztcblxuICAvKiogU3BhY2UgZGVsaW1pdGVkIHN0cmluZyBhZGRlZCB0byB0aGUgY2xhc3MgYXR0cmlidXRlIG9mIHRoZSBURCB0aGF0IGNvbnRhaW5zIHRoZSBjb2xsYXBzaWJsZSB0b2dnbGVcbiAgICogIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBjb2xsYXBzaWJsZVRvZ2dsZUNlbGxDbGFzcz86IHN0cmluZztcblxuICAvKiogVXNlZCB0byBoaWRlIHRoZSBjZWxsIGFkZGVkIHRvIHRoZSB0YWJsZS4gVXNlZnVsIGlmIGEgdGFibGUgaXMgc2hhcmVkIGJldHdlZW4gdmlld3MgYW5kIG5vdCBhbGxcbiAgICogIHN1cHBvcnQgdGhlIHRhYmxlIG1hc3RlciBzY2VuYXJpb1xuICAgKi9cbiAgIEBJbnB1dCgpIGhpZGVUYWJsZU1hc3Rlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHZhbHVlIG9mIGBzaG93RGV0YWlsc2AgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBzaG93RGV0YWlsc0NoYW5nZWQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIGZvciB0aGUgZGV0YWlsIHJvdywgaW5zZXJ0ZWQgaW4gdGhlIERPTSBhZnRlciB0aGUgbWFzdGVyIHJvdy5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2RldGFpbFJvdycsIHtyZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlfSkgZGV0YWlsUm93VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKlxuICAgKiBUaGUgdmlldyBjcmVhdGVkIGZyb20gdGhlIGBkZXRhaWxSb3dgIHRlbXBsYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRhaWxWaWV3PzogRW1iZWRkZWRWaWV3UmVmPGFueT47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgbm9kZSBvZiB0aGUgaG9zdCBlbGVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJlbnROb2RlOiBhbnk7XG5cbiAgLyoqXG4gICAqIFRoZSBzaWJsaW5nIG5vZGUgb2YgdGhlIGhvc3QgZWxlbWVudC5cbiAgICovXG4gIHByaXZhdGUgc2libGluZ05vZGU6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZikgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRldGFpbFJvd0NvbFNwYW4pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEEgdmFsdWUgZm9yIFtkZXRhaWxSb3dDb2xTcGFuXSBpcyByZXF1aXJlZCB0byByZW5kZXIgYSBkZXRhaWwgcm93IGNvcnJlY3RseS4gVGhpcyBzaG91bGQgYmUgdGhlIG51bWJlciBvZiBjb2x1bW5zIFREcyBwbGFjZWQgaW5zaWRlIGFuIHRyW2VjVGFibGVNYXN0ZXJSb3ddLmApO1xuICAgIH1cblxuICAgIHRoaXMucGFyZW50Tm9kZSA9IHRoaXMucmVuZGVyZXIucGFyZW50Tm9kZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMudXBkYXRlRGV0YWlsUm93KCk7XG5cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5oYXNEZXRhaWxzICYmICFjaGFuZ2VzLmhhc0RldGFpbHMuZmlyc3RDaGFuZ2UgJiYgY2hhbmdlcy5oYXNEZXRhaWxzLmN1cnJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZURldGFpbFJvdygpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLnNob3dEZXRhaWxzICYmICFjaGFuZ2VzLnNob3dEZXRhaWxzLmZpcnN0Q2hhbmdlICYmIGNoYW5nZXMuc2hvd0RldGFpbHMuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlRGV0YWlsVmlldygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIG1hc3RlciByb3cgaGFzIGRldGFpbHMsIGNyZWF0ZSB0aGUgZGV0YWlsIHJvdyBhbmQgdXBkYXRlIGl0J3MgdmlzaWJpbGl0eS4gSWYgdGhlIG1hc3RlclxuICAgKiBoYXMgbm8gZGV0YWlscywgcmVtb3ZlIHRoZSBkZXRhaWwgcm93XG4gICAqL1xuICB1cGRhdGVEZXRhaWxSb3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzRGV0YWlscykge1xuICAgICAgaWYgKCF0aGlzLmRldGFpbFRlbXBsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEEgdmFsdWUgZm9yIHRoZSBbZGV0YWlsVGVtcGxhdGVdIGlucHV0IGlzIHJlcXVpcmVkIHdoZW4gJ2hhc0RldGFpbHMnIGlzIHRydWUuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXRhaWxWaWV3IGlzIGFscmVhZHkgcHJlc2VudCBhbmQgaWYgc28sIHJlbW92ZSBpdCBzbyB3ZSBkb24ndCBnZXQgYSBcbiAgICAgIC8vIGR1cGxpY2F0ZSBkZXRhaWwgdmlld1xuICAgICAgaWYgKHRoaXMuZGV0YWlsVmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRGV0YWlsVmlldygpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRldGFpbFZpZXcgPSB0aGlzLmRldGFpbFJvd1RlbXBsYXRlLmNyZWF0ZUVtYmVkZGVkVmlldyh7fSk7XG5cbiAgICAgIC8vc29sdXRpb24gdG8gYWxsb3dpbmcgY2hhbmdlIGRldGVjdGlvbiBpbiBlbWJlZGRlZCB2aWV3IGFkYXB0ZWQgZnJvbSBoZXJlOlxuICAgICAgLy9odHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80Mjk3N1xuICAgICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyh0aGlzLmRldGFpbFZpZXcpO1xuICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlRGV0YWlsVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93L2hpZGUgdGhlIGRldGFpbCByb3dcbiAgICovXG4gIHRvZ2dsZURldGFpbHMoc2hvdzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RldGFpbHMgPSBzaG93O1xuICAgIHRoaXMuc2hvd0RldGFpbHNDaGFuZ2VkLmVtaXQoc2hvdyk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd0RldGFpbHMpIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIHRoZSBkZXRhaWxWaWV3IHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyZWUgYW5kIGluc2VydCB0aGUgZ2VuZXJhdGVkIGh0bWxcbiAgICogb2YgdGhlIGRldGFpbCByb3cgdG8gRE9NIGFmdGVyIHRoZSBob3N0IGVsZW1lbnRcbiAgICovXG4gIHByaXZhdGUgc2hvdygpIHtcbiAgICBpZiAodGhpcy5kZXRhaWxWaWV3KSB7XG4gICAgICAvL1RoZSBuZXh0U2libGluZyBtYXkgaGF2ZSBjaGFuZ2VkLCBzbyB1cGRhdGUgaXQuIChUaGlzIGNvdWxkIGhhcHBlbiBpZiB0aGUgdGFibGUgaXMgZW1iZWRkZWQgaW4gYSBzZWFyY2hhYmxlIHRhYmxlXG4gICAgICAvLyAgYW5kIGEgc2VhcmNoIGlzIHBlcmZvcm1lZClcbiAgICAgIHRoaXMuc2libGluZ05vZGUgPSB0aGlzLnJlbmRlcmVyLm5leHRTaWJsaW5nKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgICB0aGlzLmRldGFpbFZpZXcucmVhdHRhY2goKTtcbiAgICAgIHRoaXMuZGV0YWlsVmlldy5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmRldGFpbFZpZXcucm9vdE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHRoaXMucGFyZW50Tm9kZSwgbm9kZSwgdGhpcy5zaWJsaW5nTm9kZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0YWNoIHRoZSBkZXRhaWxWaWV3IGZyb20gdGhlIGNoYW5nZSBkZXRlY3Rpb24gdHJlZSBhbmQgcmVtb3ZlIHRoZSBnZW5lcmF0ZWRcbiAgICogaHRtbCBvZiB0aGUgZGV0YWlsIHJvdyBmcm9tIHRoZSBET01cbiAgICovXG4gIHByaXZhdGUgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5kZXRhaWxWaWV3KSB7XG4gICAgICB0aGlzLmRldGFpbFZpZXcuZGV0YWNoKCk7XG4gICAgICB0aGlzLnJlbW92ZURldGFpbE5vZGVzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIGRldGFpbFZpZXcgYW5kIHJlbW92ZSB0aGUgZ2VuZXJhdGVkIGh0bWwgb2YgdGhlIGRldGFpbCByb3cgZnJvbSB0aGUgRE9NXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZURldGFpbFZpZXcoKSB7XG4gICAgaWYgKHRoaXMuZGV0YWlsVmlldykge1xuICAgICAgdGhpcy5kZXRhaWxWaWV3LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMucmVtb3ZlRGV0YWlsTm9kZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBnZW5lcmF0ZWQgaHRtbCBvZiB0aGUgZGV0YWlsIHJvdyBmcm9tIHRoZSBET01cbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlRGV0YWlsTm9kZXMoKSB7XG4gICAgaWYgKHRoaXMuZGV0YWlsVmlldykge1xuICAgICAgdGhpcy5kZXRhaWxWaWV3LnJvb3ROb2Rlcy5mb3JFYWNoKG4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5wYXJlbnROb2RlLCBuKTtcbiAgICAgICAgfSBjYXRjaChlcnIpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIHRocm93biBieSByZW1vdmluZyBub2RlcyB0aGF0IHdlcmUgbmV2ZXIgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbn1cbiIsIjx0ZCAqbmdJZj1cIiFoaWRlVGFibGVNYXN0ZXJcIiBjbGFzcz1cInt7Y29sbGFwc2libGVUb2dnbGVDZWxsQ2xhc3N9fVwiPlxuICA8ZWMtY29sbGFwc2libGUtdG9nZ2xlICpuZ0lmPVwiaGFzRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZXhwYW5kZWRdPVwic2hvd0RldGFpbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChleHBhbmRlZENoYW5nZSk9XCJ0b2dnbGVEZXRhaWxzKCRldmVudClcIj48L2VjLWNvbGxhcHNpYmxlLXRvZ2dsZT5cbjwvdGQ+XG48bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbjxuZy10ZW1wbGF0ZSAjZGV0YWlsUm93PlxuICA8dHIgZWNUYWJsZURldGFpbFJvdyBjbGFzcz1cInt7ZGV0YWlsUm93Q2xhc3N9fVwiIFtjb250ZW50Q2xhc3NdPVwiZGV0YWlsUm93Q29udGVudENsYXNzXCIgW2NvbnRlbnRDb2xTcGFuXT1cImRldGFpbFJvd0NvbFNwYW5cIiBbbWF4SGVpZ2h0XT1cImRldGFpbFJvd01heEhlaWdodFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRldGFpbFRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBkZXRhaWxDb250ZXh0fVwiPjwvbmctY29udGFpbmVyPlxuICA8L3RyPlxuPC9uZy10ZW1wbGF0ZT4iXX0=
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { NavGroup } from '../../controls/navigation/nav-group';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/common";
|
|
5
|
-
import * as i2 from "../../controls/tabs/tabs.component";
|
|
6
|
-
import * as i3 from "../../controls/dropdown/dropdown.component";
|
|
7
|
-
export class TablePaginationComponent {
|
|
8
|
-
constructor(el) {
|
|
9
|
-
this.el = el;
|
|
10
|
-
/**
|
|
11
|
-
* Number of the current page.
|
|
12
|
-
* Initial value is 1, can be overridden to change the starting page number.
|
|
13
|
-
*/
|
|
14
|
-
this.pageNumber = 1;
|
|
15
|
-
/**
|
|
16
|
-
* Maximum number of page tabs to show
|
|
17
|
-
*/
|
|
18
|
-
this.maxTabs = 10;
|
|
19
|
-
/** When true the tabs and the more pages dropdown will be disabled */
|
|
20
|
-
this.disablePaginationControls = false;
|
|
21
|
-
/**
|
|
22
|
-
* Emits when the page changes.
|
|
23
|
-
*
|
|
24
|
-
* Bind to the event in a template using a function that uses the "skip" and "pageSize"
|
|
25
|
-
* properties to slice the new page from your data set.
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* //.html
|
|
29
|
-
* (pageChanged)="onPageChanged($event)"
|
|
30
|
-
* //.ts
|
|
31
|
-
* public onPageChanged(event: PagingInfo) {
|
|
32
|
-
* this.currentPageItems = this.paginatedTableItems.slice(event.skip, event.skip + event.pageSize);
|
|
33
|
-
* }
|
|
34
|
-
* //Since pageChanged doesn't emit for the initial page, onPageChanged should be manually called during initialization
|
|
35
|
-
* //using getPagingInfo:
|
|
36
|
-
* this.onPageChanged(TablePaginationComponent.getPagingInfo(this.startingPageNumber, this.pageSize));
|
|
37
|
-
*/
|
|
38
|
-
this.pageChanged = new EventEmitter();
|
|
39
|
-
/**
|
|
40
|
-
* All possible items in the dropdown menu.
|
|
41
|
-
*/
|
|
42
|
-
this.dropdownItems = [];
|
|
43
|
-
/**
|
|
44
|
-
* Current tabs being displayed.
|
|
45
|
-
*/
|
|
46
|
-
this.currentTabs = new NavGroup();
|
|
47
|
-
}
|
|
48
|
-
ngOnChanges() {
|
|
49
|
-
if (this.totalItems === 0) {
|
|
50
|
-
this.dropdownItems = [];
|
|
51
|
-
this.currentTabs = new NavGroup();
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
this.setDropdownItems();
|
|
55
|
-
//Find the menu item that the page corresponding to this.pageNumber lies in
|
|
56
|
-
let firstMenuItem = this.dropdownItems.find(item => {
|
|
57
|
-
return item.value.firstPage <= this.pageNumber && item.value.lastPage >= this.pageNumber;
|
|
58
|
-
});
|
|
59
|
-
if (!firstMenuItem) {
|
|
60
|
-
console.error(`Page ${this.pageNumber} does not exist. Setting the starting page number to 1.`);
|
|
61
|
-
firstMenuItem = this.dropdownItems[0];
|
|
62
|
-
this.pageNumber = 1;
|
|
63
|
-
}
|
|
64
|
-
//Set the tabs to those corresponding to the first menu item.
|
|
65
|
-
//Note that we dont emit a pageChanged event here because the consumer already knows what the first page is.
|
|
66
|
-
this.setTabs(firstMenuItem, this.pageNumber);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Given the number of a page and the pageSize, return the PagingInfo object for that page.
|
|
70
|
-
*/
|
|
71
|
-
static getPagingInfo(pageNumber, pageSize) {
|
|
72
|
-
return { skip: (pageNumber - 1) * pageSize, pageSize: pageSize, pageNumber: pageNumber };
|
|
73
|
-
}
|
|
74
|
-
onItemSelected(menuItem) {
|
|
75
|
-
this.setTabs(menuItem);
|
|
76
|
-
this.onPageChange(parseInt(this.currentTabs.selected.label));
|
|
77
|
-
//focus the currently selected tab to help keyboard navigation
|
|
78
|
-
this.el.nativeElement.querySelector('.tab.active').focus();
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Create a tab for each item in the range represented in the MenuItem
|
|
82
|
-
*/
|
|
83
|
-
setTabs(menuItem, pageNumber) {
|
|
84
|
-
let tabItems = [];
|
|
85
|
-
for (let i = menuItem.value.firstPage; i <= menuItem.value.lastPage; i++) {
|
|
86
|
-
tabItems.push({
|
|
87
|
-
label: `${i}`,
|
|
88
|
-
disabled: this.disablePaginationControls,
|
|
89
|
-
onClick: () => { this.onPageChange(i); }
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
//if a pageNumber is provided, select the tab with that page number.
|
|
93
|
-
//otherwise, select the first tab.
|
|
94
|
-
let selectedTab = pageNumber ? tabItems.find(tab => { return parseInt(tab.label) === pageNumber; })
|
|
95
|
-
: tabItems[0];
|
|
96
|
-
this.currentTabs = new NavGroup(tabItems, selectedTab);
|
|
97
|
-
}
|
|
98
|
-
onPageChange(pageNumber) {
|
|
99
|
-
this.pageNumber = pageNumber;
|
|
100
|
-
this.pageChanged.emit(TablePaginationComponent.getPagingInfo(pageNumber, this.pageSize));
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Create all the items for the dropdown menu.
|
|
104
|
-
* A dropdown item represents a page range (e.g. 1-10, 11-20, or 21-25).
|
|
105
|
-
* A single dropdown item can represent a range of up to 10 pages (the last item could have less than 10).
|
|
106
|
-
*/
|
|
107
|
-
setDropdownItems() {
|
|
108
|
-
this.dropdownItems = [];
|
|
109
|
-
//find the last page
|
|
110
|
-
let dividend = Math.floor(this.totalItems / this.pageSize);
|
|
111
|
-
let remainder = this.totalItems % this.pageSize;
|
|
112
|
-
const lastPage = (remainder === 0) ? dividend : dividend + 1;
|
|
113
|
-
//keep building menu items of the form 1-10, 11-20, 21-30, etc until
|
|
114
|
-
//end >= lastPage, which means we've found the range that contains the last page.
|
|
115
|
-
let start = 1;
|
|
116
|
-
let maxTabs = this.maxTabs || 10;
|
|
117
|
-
let end = maxTabs;
|
|
118
|
-
while (end < lastPage) {
|
|
119
|
-
this.dropdownItems.push({
|
|
120
|
-
label: `${start}-${end}`,
|
|
121
|
-
value: { firstPage: start, lastPage: end }
|
|
122
|
-
});
|
|
123
|
-
start = start + maxTabs;
|
|
124
|
-
end = end + maxTabs;
|
|
125
|
-
}
|
|
126
|
-
//add the menu item that contains the last page.
|
|
127
|
-
this.dropdownItems.push({
|
|
128
|
-
label: (start === lastPage) ? `${start}` : `${start}-${lastPage}`,
|
|
129
|
-
value: { firstPage: start, lastPage: lastPage }
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TablePaginationComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
133
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TablePaginationComponent, selector: "ec-table-pagination", inputs: { id: "id", totalItems: "totalItems", pageSize: "pageSize", pageNumber: "pageNumber", maxTabs: "maxTabs", disablePaginationControls: "disablePaginationControls" }, outputs: { pageChanged: "pageChanged" }, host: { classAttribute: "d-flex px-2 align-items-center" }, usesOnChanges: true, ngImport: i0, template: "<ec-tabs id=\"{{id}}_pages\"\n class=\"my-2 is-condensed\"\n [tabGroup]=\"currentTabs\"\n tabStyle=\"tiles\">\n</ec-tabs>\n<ec-dropdown id=\"{{id}}_morePages\"\n *ngIf=\"dropdownItems.length > 1\"\n class=\"my-1 ml-1\"\n menuTemplateType=\"label\"\n icon=\"icon-more\"\n menuPosition=\"left\"\n [menuMinWidth]=\"80\"\n [showArrow]=\"false\"\n [popupFixed]=\"true\"\n [items]=\"dropdownItems\"\n [disabled]=\"disablePaginationControls\"\n (itemSelected)=\"onItemSelected($event)\">\n</ec-dropdown>", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.TabsComponent, selector: "ec-tabs", inputs: ["id", "tabindex", "tabStyle", "tabGroup"] }, { kind: "component", type: i3.DropdownComponent, selector: "ec-dropdown", inputs: ["id", "autofocus", "status", "disabled", "label", "icon", "buttonType", "buttonAlignment", "buttonTitle", "tabindex", "showArrow", "items", "menuTemplateType", "menuTitle", "menuHeight", "menuWidth", "menuMinWidth", "menuPosition", "menuFooter", "popupFixed", "buttonCustomTemplate", "pending"], outputs: ["itemSelected", "popupOpened"] }] }); }
|
|
134
|
-
}
|
|
135
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TablePaginationComponent, decorators: [{
|
|
136
|
-
type: Component,
|
|
137
|
-
args: [{ selector: 'ec-table-pagination', host: {
|
|
138
|
-
class: 'd-flex px-2 align-items-center'
|
|
139
|
-
}, template: "<ec-tabs id=\"{{id}}_pages\"\n class=\"my-2 is-condensed\"\n [tabGroup]=\"currentTabs\"\n tabStyle=\"tiles\">\n</ec-tabs>\n<ec-dropdown id=\"{{id}}_morePages\"\n *ngIf=\"dropdownItems.length > 1\"\n class=\"my-1 ml-1\"\n menuTemplateType=\"label\"\n icon=\"icon-more\"\n menuPosition=\"left\"\n [menuMinWidth]=\"80\"\n [showArrow]=\"false\"\n [popupFixed]=\"true\"\n [items]=\"dropdownItems\"\n [disabled]=\"disablePaginationControls\"\n (itemSelected)=\"onItemSelected($event)\">\n</ec-dropdown>" }]
|
|
140
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { id: [{
|
|
141
|
-
type: Input
|
|
142
|
-
}], totalItems: [{
|
|
143
|
-
type: Input
|
|
144
|
-
}], pageSize: [{
|
|
145
|
-
type: Input
|
|
146
|
-
}], pageNumber: [{
|
|
147
|
-
type: Input
|
|
148
|
-
}], maxTabs: [{
|
|
149
|
-
type: Input
|
|
150
|
-
}], disablePaginationControls: [{
|
|
151
|
-
type: Input
|
|
152
|
-
}], pageChanged: [{
|
|
153
|
-
type: Output
|
|
154
|
-
}] } });
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvZGlzcGxheS90YWJsZS90YWJsZS1wYWdpbmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9kaXNwbGF5L3RhYmxlL3RhYmxlLXBhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBeUIsTUFBTSxlQUFlLENBQUM7QUFHOUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7OztBQXVCL0QsTUFBTSxPQUFPLHdCQUF3QjtJQTBEbkMsWUFBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUEzQ2xDOzs7V0FHRztRQUNNLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFFaEM7O1dBRUc7UUFDTSxZQUFPLEdBQVksRUFBRSxDQUFDO1FBRS9CLHNFQUFzRTtRQUM3RCw4QkFBeUIsR0FBYSxLQUFLLENBQUM7UUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7V0FnQkc7UUFDTyxnQkFBVyxHQUE2QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXJFOztXQUVHO1FBQ0ksa0JBQWEsR0FBMEIsRUFBRSxDQUFDO1FBRWpEOztXQUVHO1FBQ0ksZ0JBQVcsR0FBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBRVIsQ0FBQztJQUd2QyxXQUFXO1FBQ1QsSUFBRyxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNsQyxPQUFP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RSxLQUFLLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUM7U0FDOUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F6SlUsd0JBQXdCO21HQUF4Qix3QkFBd0IsaVdDMUJyQyw4b0JBaUJjOzs0RkRTRCx3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0UscUJBQXFCLFFBRXpCO3dCQUNKLEtBQUssRUFBRSxnQ0FBZ0M7cUJBQ3hDOytFQUlRLEVBQUU7c0JBQVYsS0FBSztnQkFNRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQW1CSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWVudUl0ZW0gfSBmcm9tICcuLi8uLi9jb250cm9scy9tZW51L21lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE5hdkl0ZW0gfSBmcm9tICcuLi8uLi9jb250cm9scy9uYXZpZ2F0aW9uL25hdi1pdGVtJztcbmltcG9ydCB7IE5hdkdyb3VwIH0gZnJvbSAnLi4vLi4vY29udHJvbHMvbmF2aWdhdGlvbi9uYXYtZ3JvdXAnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luZ0luZm8ge1xuICAvKipOdW1iZXIgb2YgaXRlbXMgdG8gc2tpcCB0byBnZXQgdG8gdGhpcyBwYWdlKi9cbiAgc2tpcDogbnVtYmVyLFxuICAvKipOdW1iZXIgb2YgaXRlbXMgaW4gdGhpcyBwYWdlKi9cbiAgcGFnZVNpemU6IG51bWJlcixcbiAgLyoqVGhlIG51bWJlciBvZiB0aGUgcGFnZSovXG4gIHBhZ2VOdW1iZXI6IG51bWJlclxufVxuXG5pbnRlcmZhY2UgUGFnZVJhbmdlIHtcbiAgZmlyc3RQYWdlOiBudW1iZXIsXG4gIGxhc3RQYWdlOiBudW1iZXJcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWMtdGFibGUtcGFnaW5hdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnZC1mbGV4IHB4LTIgYWxpZ24taXRlbXMtY2VudGVyJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlUGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiByb3dzIHRoYXQgd2UgbmVlZCB0byBwYWdlIHRocm91Z2guXG4gICAqIGkuZS4gdGhlIHN1bSBvZiBhbGwgcm93cyBvbiBhbGwgcGFnZXMuXG4gICAqL1xuICBASW5wdXQoKSB0b3RhbEl0ZW1zITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXggc2l6ZSBvZiBhIHBhZ2UuXG4gICAqL1xuICBASW5wdXQoKSBwYWdlU2l6ZSE6IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAqIEluaXRpYWwgdmFsdWUgaXMgMSwgY2FuIGJlIG92ZXJyaWRkZW4gdG8gY2hhbmdlIHRoZSBzdGFydGluZyBwYWdlIG51bWJlci5cbiAgICovXG4gIEBJbnB1dCgpIHBhZ2VOdW1iZXI6IG51bWJlciA9IDE7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIHBhZ2UgdGFicyB0byBzaG93XG4gICAqL1xuICBASW5wdXQoKSBtYXhUYWJzPzogbnVtYmVyID0gMTA7XG5cbiAgLyoqIFdoZW4gdHJ1ZSB0aGUgdGFicyBhbmQgdGhlIG1vcmUgcGFnZXMgZHJvcGRvd24gd2lsbCBiZSBkaXNhYmxlZCAqL1xuICBASW5wdXQoKSBkaXNhYmxlUGFnaW5hdGlvbkNvbnRyb2xzPzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSBwYWdlIGNoYW5nZXMuXG4gICAqIFxuICAgKiBCaW5kIHRvIHRoZSBldmVudCBpbiBhIHRlbXBsYXRlIHVzaW5nIGEgZnVuY3Rpb24gdGhhdCB1c2VzIHRoZSBcInNraXBcIiBhbmQgXCJwYWdlU2l6ZVwiXG4gICAqIHByb3BlcnRpZXMgdG8gc2xpY2UgdGhlIG5ldyBwYWdlIGZyb20geW91ciBkYXRhIHNldC5cbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIC8vLmh0bWxcbiAgICogKHBhZ2VDaGFuZ2VkKT1cIm9uUGFnZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAqIC8vLnRzXG4gICAqIHB1YmxpYyBvblBhZ2VDaGFuZ2VkKGV2ZW50OiBQYWdpbmdJbmZvKSB7XG4gICAqICB0aGlzLmN1cnJlbnRQYWdlSXRlbXMgPSB0aGlzLnBhZ2luYXRlZFRhYmxlSXRlbXMuc2xpY2UoZXZlbnQuc2tpcCwgZXZlbnQuc2tpcCArIGV2ZW50LnBhZ2VTaXplKTtcbiAgICogfVxuICAgKiAvL1NpbmNlIHBhZ2VDaGFuZ2VkIGRvZXNuJ3QgZW1pdCBmb3IgdGhlIGluaXRpYWwgcGFnZSwgb25QYWdlQ2hhbmdlZCBzaG91bGQgYmUgbWFudWFsbHkgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBcbiAgICogLy91c2luZyBnZXRQYWdpbmdJbmZvOlxuICAgKiB0aGlzLm9uUGFnZUNoYW5nZWQoVGFibGVQYWdpbmF0aW9uQ29tcG9uZW50LmdldFBhZ2luZ0luZm8odGhpcy5zdGFydGluZ1BhZ2VOdW1iZXIsIHRoaXMucGFnZVNpemUpKTtcbiAgICovXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPFBhZ2luZ0luZm8+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBBbGwgcG9zc2libGUgaXRlbXMgaW4gdGhlIGRyb3Bkb3duIG1lbnUuXG4gICAqL1xuICBwdWJsaWMgZHJvcGRvd25JdGVtczogTWVudUl0ZW08UGFnZVJhbmdlPltdID0gW107XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdGFicyBiZWluZyBkaXNwbGF5ZWQuXG4gICAqL1xuICBwdWJsaWMgY3VycmVudFRhYnM6IE5hdkdyb3VwID0gbmV3IE5hdkdyb3VwKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikgeyB9XG5cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZih0aGlzLnRvdGFsSXRlbXMgPT09IDApIHtcbiAgICAgIHRoaXMuZHJvcGRvd25JdGVtcyA9IFtdO1xuICAgICAgdGhpcy5jdXJyZW50VGFicyA9IG5ldyBOYXZHcm91cCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldERyb3Bkb3duSXRlbXMoKTtcblxuICAgIC8vRmluZCB0aGUgbWVudSBpdGVtIHRoYXQgdGhlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGlzLnBhZ2VOdW1iZXIgbGllcyBpblxuICAgIGxldCBmaXJzdE1lbnVJdGVtID0gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbmQoaXRlbSA9PiB7XG4gICAgICByZXR1cm4gaXRlbS52YWx1ZSEuZmlyc3RQYWdlIDw9IHRoaXMucGFnZU51bWJlciAmJiBpdGVtLnZhbHVlIS5sYXN0UGFnZSA+PSB0aGlzLnBhZ2VOdW1iZXI7XG4gICAgfSk7XG4gICAgaWYoIWZpcnN0TWVudUl0ZW0pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFBhZ2UgJHt0aGlzLnBhZ2VOdW1iZXJ9IGRvZXMgbm90IGV4aXN0LiBTZXR0aW5nIHRoZSBzdGFydGluZyBwYWdlIG51bWJlciB0byAxLmApO1xuICAgICAgZmlyc3RNZW51SXRlbSA9IHRoaXMuZHJvcGRvd25JdGVtc1swXTtcbiAgICAgIHRoaXMucGFnZU51bWJlciA9IDE7XG4gICAgfVxuICAgIC8vU2V0IHRoZSB0YWJzIHRvIHRob3NlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IG1lbnUgaXRlbS5cbiAgICAvL05vdGUgdGhhdCB3ZSBkb250IGVtaXQgYSBwYWdlQ2hhbmdlZCBldmVudCBoZXJlIGJlY2F1c2UgdGhlIGNvbnN1bWVyIGFscmVhZHkga25vd3Mgd2hhdCB0aGUgZmlyc3QgcGFnZSBpcy5cbiAgICB0aGlzLnNldFRhYnMoZmlyc3RNZW51SXRlbSwgdGhpcy5wYWdlTnVtYmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiB0aGUgbnVtYmVyIG9mIGEgcGFnZSBhbmQgdGhlIHBhZ2VTaXplLCByZXR1cm4gdGhlIFBhZ2luZ0luZm8gb2JqZWN0IGZvciB0aGF0IHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFBhZ2luZ0luZm8ocGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHsgc2tpcDogKHBhZ2VOdW1iZXIgLSAxKSpwYWdlU2l6ZSwgcGFnZVNpemU6IHBhZ2VTaXplLCBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyIH07XG4gIH1cblxuICBwdWJsaWMgb25JdGVtU2VsZWN0ZWQobWVudUl0ZW06IE1lbnVJdGVtPFBhZ2VSYW5nZT4pIHsgIFxuICAgIHRoaXMuc2V0VGFicyhtZW51SXRlbSk7XG4gICAgdGhpcy5vblBhZ2VDaGFuZ2UocGFyc2VJbnQodGhpcy5jdXJyZW50VGFicy5zZWxlY3RlZCEubGFiZWwhKSk7XG4gICAgLy9mb2N1cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhYiB0byBoZWxwIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnRhYi5hY3RpdmUnKS5mb2N1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRhYiBmb3IgZWFjaCBpdGVtIGluIHRoZSByYW5nZSByZXByZXNlbnRlZCBpbiB0aGUgTWVudUl0ZW1cbiAgICovXG4gIHByaXZhdGUgc2V0VGFicyhtZW51SXRlbTogTWVudUl0ZW08UGFnZVJhbmdlPiwgcGFnZU51bWJlcj86IG51bWJlcikge1xuICAgIGxldCB0YWJJdGVtczogTmF2SXRlbVtdID0gW107XG4gICAgZm9yKGxldCBpID0gbWVudUl0ZW0udmFsdWUhLmZpcnN0UGFnZTsgaSA8PSBtZW51SXRlbS52YWx1ZSEubGFzdFBhZ2U7IGkrKykge1xuICAgICAgdGFiSXRlbXMucHVzaCh7XG4gICAgICAgIGxhYmVsOiBgJHtpfWAsXG4gICAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVQYWdpbmF0aW9uQ29udHJvbHMsXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHt0aGlzLm9uUGFnZUNoYW5nZShpKX1cbiAgICAgIH0pO1xuICAgIH1cbiAgICAvL2lmIGEgcGFnZU51bWJlciBpcyBwcm92aWRlZCwgc2VsZWN0IHRoZSB0YWIgd2l0aCB0aGF0IHBhZ2UgbnVtYmVyLlxuICAgIC8vb3RoZXJ3aXNlLCBzZWxlY3QgdGhlIGZpcnN0IHRhYi5cbiAgICBsZXQgc2VsZWN0ZWRUYWI6IE5hdkl0ZW0gPSBwYWdlTnVtYmVyID8gdGFiSXRlbXMuZmluZCh0YWIgPT4ge3JldHVybiBwYXJzZUludCh0YWIubGFiZWwhKSA9PT0gcGFnZU51bWJlcn0pIVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0YWJJdGVtc1swXTtcbiAgICB0aGlzLmN1cnJlbnRUYWJzID0gbmV3IE5hdkdyb3VwKHRhYkl0ZW1zLCBzZWxlY3RlZFRhYik7XG4gIH1cblxuICBwcml2YXRlIG9uUGFnZUNoYW5nZShwYWdlTnVtYmVyOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2VOdW1iZXIgPSBwYWdlTnVtYmVyO1xuICAgIHRoaXMucGFnZUNoYW5nZWQuZW1pdChUYWJsZVBhZ2luYXRpb25Db21wb25lbnQuZ2V0UGFnaW5nSW5mbyhwYWdlTnVtYmVyLCB0aGlzLnBhZ2VTaXplKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYWxsIHRoZSBpdGVtcyBmb3IgdGhlIGRyb3Bkb3duIG1lbnUuXG4gICAqIEEgZHJvcGRvd24gaXRlbSByZXByZXNlbnRzIGEgcGFnZSByYW5nZSAoZS5nLiAxLTEwLCAxMS0yMCwgb3IgMjEtMjUpLlxuICAgKiBBIHNpbmdsZSBkcm9wZG93biBpdGVtIGNhbiByZXByZXNlbnQgYSByYW5nZSBvZiB1cCB0byAxMCBwYWdlcyAodGhlIGxhc3QgaXRlbSBjb3VsZCBoYXZlIGxlc3MgdGhhbiAxMCkuXG4gICAqL1xuICBwcml2YXRlIHNldERyb3Bkb3duSXRlbXMoKSB7XG4gICAgdGhpcy5kcm9wZG93bkl0ZW1zID0gW107XG4gICAgLy9maW5kIHRoZSBsYXN0IHBhZ2VcbiAgICBsZXQgZGl2aWRlbmQgPSBNYXRoLmZsb29yKHRoaXMudG90YWxJdGVtcyAvIHRoaXMucGFnZVNpemUpO1xuICAgIGxldCByZW1haW5kZXIgPSB0aGlzLnRvdGFsSXRlbXMgJSB0aGlzLnBhZ2VTaXplO1xuICAgIGNvbnN0IGxhc3RQYWdlID0gKHJlbWFpbmRlciA9PT0gMCkgPyBkaXZpZGVuZCA6IGRpdmlkZW5kICsgMTtcblxuICAgIC8va2VlcCBidWlsZGluZyBtZW51IGl0ZW1zIG9mIHRoZSBmb3JtIDEtMTAsIDExLTIwLCAyMS0zMCwgZXRjIHVudGlsICBcbiAgICAvL2VuZCA+PSBsYXN0UGFnZSwgd2hpY2ggbWVhbnMgd2UndmUgZm91bmQgdGhlIHJhbmdlIHRoYXQgY29udGFpbnMgdGhlIGxhc3QgcGFnZS5cbiAgICBsZXQgc3RhcnQgPSAxO1xuXG4gICAgbGV0IG1heFRhYnMgPSB0aGlzLm1heFRhYnMgfHwgMTA7XG4gICAgbGV0IGVuZCA9IG1heFRhYnM7XG5cbiAgICB3aGlsZShlbmQgPCBsYXN0UGFnZSkge1xuICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICBsYWJlbDogYCR7c3RhcnR9LSR7ZW5kfWAsXG4gICAgICAgIHZhbHVlOiB7Zmlyc3RQYWdlOiBzdGFydCwgbGFzdFBhZ2U6IGVuZH1cbiAgICAgIH0pO1xuICAgICAgc3RhcnQgPSBzdGFydCArIG1heFRhYnM7XG4gICAgICBlbmQgPSBlbmQgKyBtYXhUYWJzO1xuICAgIH1cbiAgICAvL2FkZCB0aGUgbWVudSBpdGVtIHRoYXQgY29udGFpbnMgdGhlIGxhc3QgcGFnZS5cbiAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICBsYWJlbDogKHN0YXJ0ID09PSBsYXN0UGFnZSkgPyBgJHtzdGFydH1gOiBgJHtzdGFydH0tJHtsYXN0UGFnZX1gLFxuICAgICAgdmFsdWU6IHtmaXJzdFBhZ2U6IHN0YXJ0LCBsYXN0UGFnZTogbGFzdFBhZ2V9XG4gICAgfSk7XG4gIH1cblxufSIsIjxlYy10YWJzIGlkPVwie3tpZH19X3BhZ2VzXCJcbiAgICAgICAgIGNsYXNzPVwibXktMiBpcy1jb25kZW5zZWRcIlxuICAgICAgICAgW3RhYkdyb3VwXT1cImN1cnJlbnRUYWJzXCJcbiAgICAgICAgIHRhYlN0eWxlPVwidGlsZXNcIj5cbjwvZWMtdGFicz5cbjxlYy1kcm9wZG93biBpZD1cInt7aWR9fV9tb3JlUGFnZXNcIlxuICAgICAgICAgICAgICpuZ0lmPVwiZHJvcGRvd25JdGVtcy5sZW5ndGggPiAxXCJcbiAgICAgICAgICAgICBjbGFzcz1cIm15LTEgbWwtMVwiXG4gICAgICAgICAgICAgbWVudVRlbXBsYXRlVHlwZT1cImxhYmVsXCJcbiAgICAgICAgICAgICBpY29uPVwiaWNvbi1tb3JlXCJcbiAgICAgICAgICAgICBtZW51UG9zaXRpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICBbbWVudU1pbldpZHRoXT1cIjgwXCJcbiAgICAgICAgICAgICBbc2hvd0Fycm93XT1cImZhbHNlXCJcbiAgICAgICAgICAgICBbcG9wdXBGaXhlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICBbaXRlbXNdPVwiZHJvcGRvd25JdGVtc1wiXG4gICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVQYWdpbmF0aW9uQ29udHJvbHNcIlxuICAgICAgICAgICAgIChpdGVtU2VsZWN0ZWQpPVwib25JdGVtU2VsZWN0ZWQoJGV2ZW50KVwiPlxuPC9lYy1kcm9wZG93bj4iXX0=
|