@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,387 +0,0 @@
|
|
|
1
|
-
import { Directive, HostBinding } from '@angular/core';
|
|
2
|
-
import { UntypedFormGroup } from '@angular/forms';
|
|
3
|
-
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
|
4
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
-
import { lastValueFrom, ReplaySubject, Subject } from 'rxjs';
|
|
6
|
-
import { filter, take, takeUntil } from 'rxjs/operators';
|
|
7
|
-
import { ErrorService } from '../../../core/error.service';
|
|
8
|
-
import { RouterHelper } from '../../../core/router-helper.service';
|
|
9
|
-
import { ScrollService } from '../../../core/scroll.service';
|
|
10
|
-
import { DialogService } from '../../../display/dialog/dialog.service';
|
|
11
|
-
import { SplashService } from '../../../display/splash/splash.service';
|
|
12
|
-
import { Overlay } from '../../../display/view-overlay/view-overlay.component';
|
|
13
|
-
import { PageStatus, PageStatuses } from '../page-statuses';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
export class PageInitResult {
|
|
16
|
-
constructor() {
|
|
17
|
-
this.title = '';
|
|
18
|
-
this.subTitle = '';
|
|
19
|
-
this.subTitleUrl = '';
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
export class PageBaseComponent {
|
|
23
|
-
constructor(injector) {
|
|
24
|
-
/** Default css classes applied to host element */
|
|
25
|
-
this.classList = 'd-flex flex-grow';
|
|
26
|
-
/**
|
|
27
|
-
* Title for the page displayed in the header
|
|
28
|
-
*/
|
|
29
|
-
this.title = '';
|
|
30
|
-
/**
|
|
31
|
-
* Sub title for the page displayed in the header
|
|
32
|
-
*/
|
|
33
|
-
this.subTitle = '';
|
|
34
|
-
/**
|
|
35
|
-
* Sub title url for the page displayed in the header
|
|
36
|
-
*/
|
|
37
|
-
this.subTitleUrl = '';
|
|
38
|
-
/**
|
|
39
|
-
* Status overlay for the page
|
|
40
|
-
*/
|
|
41
|
-
this.status = new Overlay('pending', 'Loading');
|
|
42
|
-
/**
|
|
43
|
-
* Form group to be used if needed by the page
|
|
44
|
-
*/
|
|
45
|
-
this.formGroup = new UntypedFormGroup({});
|
|
46
|
-
/**
|
|
47
|
-
* Default invalid form message, override if a more specific message is needed
|
|
48
|
-
*/
|
|
49
|
-
this.defaultInvalidFormMessage = 'PleaseCorrectForm_SC';
|
|
50
|
-
/**
|
|
51
|
-
* Default unknown save error message, override if a more specific message is needed
|
|
52
|
-
*/
|
|
53
|
-
this.defaultUnknownSaveError = 'PageBaseUnknownSaveError_SC';
|
|
54
|
-
/**
|
|
55
|
-
* Used to opt out of hiding the splash screen when the page is loaded
|
|
56
|
-
*/
|
|
57
|
-
this.skipHideSplashOnComplete = false;
|
|
58
|
-
/**
|
|
59
|
-
* When set to true any navigation end events that are strictly query param changes will
|
|
60
|
-
* not call the onNavigationEnd function. This allows pages to change the view with query
|
|
61
|
-
* params and not trigger a full refresh.
|
|
62
|
-
*/
|
|
63
|
-
this.ignoreQueryParamsOnNavigationChange = false;
|
|
64
|
-
this.previousUrl = "";
|
|
65
|
-
/**
|
|
66
|
-
* Used to unsubscribe from observables
|
|
67
|
-
*/
|
|
68
|
-
this.destroyed = new Subject();
|
|
69
|
-
/**
|
|
70
|
-
* Used to know when the page has been loaded, this will be completed
|
|
71
|
-
* after onAfterViewInit
|
|
72
|
-
*/
|
|
73
|
-
this._afterViewInitComplete = new ReplaySubject();
|
|
74
|
-
this.afterViewInitComplete = this._afterViewInitComplete;
|
|
75
|
-
/**
|
|
76
|
-
* Errors to be shown for the component.
|
|
77
|
-
* Automatically populated on promise rejection from save and shared with the UI.
|
|
78
|
-
*/
|
|
79
|
-
this._errors = '';
|
|
80
|
-
this.errorService = injector.get(ErrorService);
|
|
81
|
-
this.translateService = injector.get(TranslateService);
|
|
82
|
-
this.scrollService = injector.get(ScrollService);
|
|
83
|
-
this.router = injector.get(Router);
|
|
84
|
-
this.activatedRoute = injector.get(ActivatedRoute);
|
|
85
|
-
this.dialogService = injector.get(DialogService);
|
|
86
|
-
this.splashService = injector.get(SplashService);
|
|
87
|
-
this.routerHelper = injector.get(RouterHelper);
|
|
88
|
-
}
|
|
89
|
-
get errors() {
|
|
90
|
-
return this._errors;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Optional lifecycle hook that is called as part of the Angular ngOnInit lifecycle hook.
|
|
94
|
-
* Called before onInit is called for the first time. Add setup logic here that does
|
|
95
|
-
* not need to be run on every reload.
|
|
96
|
-
*/
|
|
97
|
-
onFirstInit() { }
|
|
98
|
-
async ngOnInit() {
|
|
99
|
-
try {
|
|
100
|
-
this.showStatus(PageStatus.Loading);
|
|
101
|
-
this.setUpRouterSubscriptions();
|
|
102
|
-
this.onFirstInit();
|
|
103
|
-
this.initPromise = this.onInit();
|
|
104
|
-
await this.initPromise;
|
|
105
|
-
}
|
|
106
|
-
catch (error) {
|
|
107
|
-
this.splashService.hideSplash();
|
|
108
|
-
this.onError(error);
|
|
109
|
-
}
|
|
110
|
-
;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* This method is called just after the Angular Lifecycle event ngOnAfterViewInit.
|
|
114
|
-
* It fires after all sub-components have gone through their initialization phase.
|
|
115
|
-
* It is in this phase that the view components should already exist, so a derived class should
|
|
116
|
-
* load data from the API to populate any view components. The promise that
|
|
117
|
-
* is returned must not resolve until all required data has completely loaded
|
|
118
|
-
*/
|
|
119
|
-
async onAfterViewInit() { }
|
|
120
|
-
;
|
|
121
|
-
async ngAfterViewInit() {
|
|
122
|
-
try {
|
|
123
|
-
const initResult = await this.initPromise;
|
|
124
|
-
this.parseInitResult(initResult);
|
|
125
|
-
await this.onAfterViewInit();
|
|
126
|
-
this._afterViewInitComplete.next();
|
|
127
|
-
this._afterViewInitComplete.complete();
|
|
128
|
-
await this.onFormLoadComplete();
|
|
129
|
-
if (this.status.status === 'pending') {
|
|
130
|
-
this.showStatus(PageStatus.Loaded);
|
|
131
|
-
}
|
|
132
|
-
if (!this.skipHideSplashOnComplete) {
|
|
133
|
-
this.splashService.hideSplash();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
catch (error) {
|
|
137
|
-
this.splashService.hideSplash();
|
|
138
|
-
this.onError(error);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* A lifecycle method that executes once all data has been loaded
|
|
143
|
-
* through ngAfterViewInit and from local storage if required.
|
|
144
|
-
* It is at this point that you can subscribe to changes on the form
|
|
145
|
-
* reliably
|
|
146
|
-
*
|
|
147
|
-
* @protected
|
|
148
|
-
* @memberof PageBaseComponent
|
|
149
|
-
*/
|
|
150
|
-
async onFormLoadComplete() { }
|
|
151
|
-
/**
|
|
152
|
-
* A lifecycle hook that is called after every NavigationEnd event.
|
|
153
|
-
*/
|
|
154
|
-
onNavigationEnd() { }
|
|
155
|
-
/**
|
|
156
|
-
* Reload the component kicking off the ngOnInit and ngAfterViewInit lifecycle hooks.
|
|
157
|
-
* Any state that needs to be reset should be done so before calling this method.
|
|
158
|
-
*/
|
|
159
|
-
reload() {
|
|
160
|
-
this._afterViewInitComplete = new ReplaySubject();
|
|
161
|
-
this.showStatus(PageStatus.Loading);
|
|
162
|
-
this.initPromise = this.onInit();
|
|
163
|
-
this.ngAfterViewInit();
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* When overridden in a derived class this method will sync the form state
|
|
167
|
-
* into the object that will be persisted to the API. The value should not
|
|
168
|
-
* actually be sent to the API yet.
|
|
169
|
-
*/
|
|
170
|
-
async applyModelUpdates() { }
|
|
171
|
-
;
|
|
172
|
-
/**
|
|
173
|
-
* Save the model state to the API and return a promise that
|
|
174
|
-
* contains the updated entityID. The promise should be rejected
|
|
175
|
-
* if the save fails and errors and the overlay status will be updated
|
|
176
|
-
* accordingly
|
|
177
|
-
*/
|
|
178
|
-
async saveToApi() { }
|
|
179
|
-
;
|
|
180
|
-
/**
|
|
181
|
-
* Called after the save has completed successfully.
|
|
182
|
-
* It is the responsibility of the derived class to navigate
|
|
183
|
-
* to a properties/status page or emit appropriately if within a dialog
|
|
184
|
-
* @param entityId
|
|
185
|
-
*/
|
|
186
|
-
onSaveComplete(entityId) { }
|
|
187
|
-
;
|
|
188
|
-
/**
|
|
189
|
-
* Function called when the user clicks save. We will first touch all controls to show validation messages
|
|
190
|
-
* if the form is invalid. If the form is valid we will attempt to save and any errors will be reported
|
|
191
|
-
* back to the user
|
|
192
|
-
* @param event
|
|
193
|
-
*/
|
|
194
|
-
async onSave(event) {
|
|
195
|
-
this.formGroup.markAllAsTouched();
|
|
196
|
-
// If the form has pending async validators, wait for it them to complete before proceeding
|
|
197
|
-
if (this.formGroup.pending) {
|
|
198
|
-
// Show the saving overlay when the form has pending async validators
|
|
199
|
-
this.showStatus(PageStatus.Saving);
|
|
200
|
-
await lastValueFrom(this.formGroup.statusChanges.pipe(filter(status => status !== 'PENDING'), take(1), takeUntil(this.destroyed)));
|
|
201
|
-
}
|
|
202
|
-
if (this.formGroup.valid) {
|
|
203
|
-
await this.save();
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
// Remove the saving overlay to display any errors
|
|
207
|
-
this.showStatus(PageStatus.Loaded);
|
|
208
|
-
// Only show the banner with the generic message if the parent component hasn't already set one
|
|
209
|
-
// by implementing onSave for additional validation
|
|
210
|
-
if (this.errors === '') {
|
|
211
|
-
this.showErrorBanner(this.defaultInvalidFormMessage);
|
|
212
|
-
}
|
|
213
|
-
if (this.scrollContainerSelector) {
|
|
214
|
-
setTimeout(() => {
|
|
215
|
-
this.scrollService.scrollToItem(this.scrollContainerSelector, ".ng-invalid");
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Function available to trigger a save and bypass the form validation checks.
|
|
222
|
-
* This is useful if the user chooses a remove action from within an edit dialog. If the dialog form is invalid
|
|
223
|
-
* that is no concern to the user if they wish to remove the item they are editing.
|
|
224
|
-
* @param event
|
|
225
|
-
*/
|
|
226
|
-
async onSaveWithoutValidate(event) {
|
|
227
|
-
await this.save();
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Function called when the component is destroyed
|
|
231
|
-
*/
|
|
232
|
-
ngOnDestroy() {
|
|
233
|
-
this.destroyed.next();
|
|
234
|
-
this.destroyed.unsubscribe();
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Function that will log an error that is passed in to the console
|
|
238
|
-
* @param e
|
|
239
|
-
*/
|
|
240
|
-
onError(error) {
|
|
241
|
-
this.errorService.logConsoleError(error);
|
|
242
|
-
this.showErrorOverlay(error);
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Show an error message in a whole-page overlay. This will prevent any more
|
|
246
|
-
* interactions with the page. It can take a string error message or a raw API
|
|
247
|
-
* error that needs to be parsed. If the API error isn't something we can handle
|
|
248
|
-
* a generic message is shown instead
|
|
249
|
-
* @param {(Error | string)} error
|
|
250
|
-
*/
|
|
251
|
-
showErrorOverlay(error) {
|
|
252
|
-
this.getErrorMessage(error).subscribe((translatedMessage) => {
|
|
253
|
-
this.status.setStatus('error', translatedMessage);
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
* Show an error in the banner at the top of the screen. This will not produce a
|
|
258
|
-
* whole-page overlay like the function showError will. It can take a string error message
|
|
259
|
-
* or raw API error that needs to be parsed. If the API error isn't something we can handle,
|
|
260
|
-
* a generic message (customizable via unknownErrorDefault) is shown instead.
|
|
261
|
-
* @param error
|
|
262
|
-
* @param unknownErrorDefault
|
|
263
|
-
*/
|
|
264
|
-
showErrorBanner(error, unknownErrorDefault) {
|
|
265
|
-
this.getErrorMessage(error, unknownErrorDefault).subscribe((translatedMessage) => {
|
|
266
|
-
this._errors = translatedMessage;
|
|
267
|
-
this.showStatus(PageStatus.Loaded);
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Parses and translates an API error or error string.
|
|
272
|
-
* @param e
|
|
273
|
-
* @param unknownErrorDefault
|
|
274
|
-
*/
|
|
275
|
-
getErrorMessage(e, unknownErrorDefault) {
|
|
276
|
-
let extractedMessage = this.errorService.parseApiError(e, unknownErrorDefault);
|
|
277
|
-
return this.translateService.get(extractedMessage);
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* Clear the errors to hide the errors banner.
|
|
281
|
-
*/
|
|
282
|
-
hideErrorBanner() {
|
|
283
|
-
this._errors = '';
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Change the display status to overlay the whole page while loading or saving
|
|
287
|
-
* and clear it when the form is ready
|
|
288
|
-
* @protected
|
|
289
|
-
* @param {PageStatus} status
|
|
290
|
-
* @memberof FormBaseComponent
|
|
291
|
-
*/
|
|
292
|
-
showStatus(status) {
|
|
293
|
-
let knownStatus = PageStatuses[status];
|
|
294
|
-
if (knownStatus) {
|
|
295
|
-
this.status.setStatus(knownStatus.status, knownStatus.message, undefined, knownStatus.noDataTemplate, knownStatus.overlayClassList);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* Allows the component to enter a pending status and execute a function that on completion will return the status
|
|
300
|
-
* to hasData. If an error occurs within the callback an error banner can be shown.
|
|
301
|
-
* @param callback
|
|
302
|
-
* @param pendingMessage - optional custom pending message
|
|
303
|
-
* @returns
|
|
304
|
-
*/
|
|
305
|
-
async runBlockingAction(callback, pendingMessage) {
|
|
306
|
-
this.hideErrorBanner();
|
|
307
|
-
this.status.setStatus('pending', pendingMessage);
|
|
308
|
-
return callback().catch(error => {
|
|
309
|
-
this.showErrorBanner(error);
|
|
310
|
-
// Throw the error for any downstream components that may be listening and need to react
|
|
311
|
-
// to any errors happening within this callback
|
|
312
|
-
throw (error);
|
|
313
|
-
}).finally(() => {
|
|
314
|
-
this.showStatus(PageStatus.Loaded);
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
;
|
|
318
|
-
/**
|
|
319
|
-
* Parses the page init result and sets the necessary properties on the page
|
|
320
|
-
* @param result
|
|
321
|
-
*/
|
|
322
|
-
parseInitResult(result) {
|
|
323
|
-
this.initResult = result;
|
|
324
|
-
this.title = result.title;
|
|
325
|
-
this.subTitle = result.subTitle;
|
|
326
|
-
this.subTitleUrl = result.subTitleUrl;
|
|
327
|
-
this.breadcrumbs = result.breadcrumbs;
|
|
328
|
-
this.help = result.help;
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* Controls the page status, triggers the save action and handles errors thrown.
|
|
332
|
-
*/
|
|
333
|
-
async save() {
|
|
334
|
-
this.showStatus(PageStatus.Saving);
|
|
335
|
-
try {
|
|
336
|
-
await this.applyModelUpdates();
|
|
337
|
-
let entityId = await this.saveToApi() || -1;
|
|
338
|
-
this._errors = '';
|
|
339
|
-
this.onSaveComplete(entityId);
|
|
340
|
-
}
|
|
341
|
-
catch (error) {
|
|
342
|
-
//clear the "saving" overlay and show the message at the top of the view through the errors property
|
|
343
|
-
this.showErrorBanner(error, this.defaultUnknownSaveError);
|
|
344
|
-
this.splashService.hideSplash();
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Sets up the router event subscriptions
|
|
349
|
-
*/
|
|
350
|
-
setUpRouterSubscriptions() {
|
|
351
|
-
if (!this.navigationEndSubscription && !this.destroyed.closed) {
|
|
352
|
-
this.previousUrl = this.router.url;
|
|
353
|
-
// React to navigation events
|
|
354
|
-
this.navigationEndSubscription = this.router.events.pipe(takeUntil(this.destroyed), filter(e => e instanceof NavigationEnd)).subscribe(e => {
|
|
355
|
-
try {
|
|
356
|
-
let currentUrl = e.url;
|
|
357
|
-
if (this.ignoreQueryParamsOnNavigationChange) {
|
|
358
|
-
if (this.previousUrl.split('?')[0] !== currentUrl.split('?')[0]) {
|
|
359
|
-
this.navigationEndHandler(e.url);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
else {
|
|
363
|
-
if (this.previousUrl !== currentUrl) {
|
|
364
|
-
this.navigationEndHandler(e.url);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
catch (error) {
|
|
369
|
-
this.onError(error);
|
|
370
|
-
}
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
navigationEndHandler(url) {
|
|
375
|
-
this.previousUrl = url;
|
|
376
|
-
this.onNavigationEnd();
|
|
377
|
-
}
|
|
378
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PageBaseComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
379
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: PageBaseComponent, host: { properties: { "class": "this.classList" } }, ngImport: i0 }); }
|
|
380
|
-
}
|
|
381
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PageBaseComponent, decorators: [{
|
|
382
|
-
type: Directive
|
|
383
|
-
}], ctorParameters: () => [{ type: i0.Injector }], propDecorators: { classList: [{
|
|
384
|
-
type: HostBinding,
|
|
385
|
-
args: ['class']
|
|
386
|
-
}] } });
|
|
387
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLWJhc2UvcGFnZS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxXQUFXLEVBQStCLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFNUQsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFDRSxVQUFLLEdBQVksRUFBRSxDQUFDO1FBQ3BCLGFBQVEsR0FB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QUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEdBQVc7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7K0dBaGNtQixpQkFBaUI7bUdBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFEdEMsU0FBUzs2RUFHd0IsU0FBUztzQkFBeEMsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBIb3N0QmluZGluZywgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBsYXN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTmF2SXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbnRyb2xzL25hdmlnYXRpb24vbmF2LWl0ZW0nO1xuaW1wb3J0IHsgRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlckhlbHBlciB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcm91dGVyLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNjcm9sbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3Njcm9sbC5zZXJ2aWNlJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9kaXNwbGF5L2RpYWxvZy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBIZWxwIH0gZnJvbSAnLi4vLi4vLi4vZGlzcGxheS9oZWxwL2hlbHAtdHlwZXMnO1xuaW1wb3J0IHsgU3BsYXNoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2Rpc3BsYXkvc3BsYXNoL3NwbGFzaC5zZXJ2aWNlJztcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICcuLi8uLi8uLi9kaXNwbGF5L3ZpZXctb3ZlcmxheS92aWV3LW92ZXJsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2VTdGF0dXMsIFBhZ2VTdGF0dXNlcyB9IGZyb20gJy4uL3BhZ2Utc3RhdHVzZXMnO1xuXG5leHBvcnQgY2xhc3MgUGFnZUluaXRSZXN1bHQge1xuICB0aXRsZT86IHN0cmluZyA9ICcnO1xuICBzdWJUaXRsZT86IHN0cmluZyA9ICcnO1xuICBzdWJUaXRsZVVybD86IHN0cmluZyA9ICcnO1xuICBicmVhZGNydW1icz86IE5hdkl0ZW1bXTtcbiAgaGVscD86IEhlbHA7XG59XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBhZ2VCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogRGVmYXVsdCBjc3MgY2xhc3NlcyBhcHBsaWVkIHRvIGhvc3QgZWxlbWVudCAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgcHJvdGVjdGVkIGNsYXNzTGlzdCA9ICdkLWZsZXggZmxleC1ncm93JztcblxuICAvKipcbiAgICogVGl0bGUgZm9yIHRoZSBwYWdlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyXG4gICAqL1xuICBwdWJsaWMgdGl0bGU/OiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogU3ViIHRpdGxlIGZvciB0aGUgcGFnZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxuICAgKi9cbiAgcHVibGljIHN1YlRpdGxlPzogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIFN1YiB0aXRsZSB1cmwgZm9yIHRoZSBwYWdlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyXG4gICAqL1xuICBwdWJsaWMgc3ViVGl0bGVVcmw/OiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogU3RhdHVzIG92ZXJsYXkgZm9yIHRoZSBwYWdlXG4gICAqL1xuICBwdWJsaWMgc3RhdHVzOiBPdmVybGF5ID0gbmV3IE92ZXJsYXkoJ3BlbmRpbmcnLCAnTG9hZGluZycpO1xuXG4gIC8qKlxuICAgKiBCcmVhZGNydW1icyBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxuICAgKi9cbiAgcHVibGljIGJyZWFkY3J1bWJzPzogTmF2SXRlbVtdO1xuXG4gIC8qKlxuICAgKiBSZXN1bHQgcmV0dXJuZWQgZnJvbSB0aGUgb25Jbml0IGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgaW5pdFJlc3VsdCE6IFBhZ2VJbml0UmVzdWx0O1xuXG4gIC8qKlxuICAgKiBIZWxwIGluZm9ybWF0aW9uIGZvciB0aGUgY29tcG9uZW50LCB3aGljaCBjYW4gb25seSBiZSBzZXQgdGhyb3VnaCBvbkluaXRcbiAgICovXG4gIHB1YmxpYyBoZWxwOiBIZWxwIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBGb3JtIGdyb3VwIHRvIGJlIHVzZWQgaWYgbmVlZGVkIGJ5IHRoZSBwYWdlXG4gICAqL1xuICBwdWJsaWMgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe30pO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGludmFsaWQgZm9ybSBtZXNzYWdlLCBvdmVycmlkZSBpZiBhIG1vcmUgc3BlY2lmaWMgbWVzc2FnZSBpcyBuZWVkZWRcbiAgICovXG4gIHB1YmxpYyBkZWZhdWx0SW52YWxpZEZvcm1NZXNzYWdlOiBzdHJpbmcgPSAnUGxlYXNlQ29ycmVjdEZvcm1fU0MnO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHVua25vd24gc2F2ZSBlcnJvciBtZXNzYWdlLCBvdmVycmlkZSBpZiBhIG1vcmUgc3BlY2lmaWMgbWVzc2FnZSBpcyBuZWVkZWRcbiAgICovXG4gIHB1YmxpYyBkZWZhdWx0VW5rbm93blNhdmVFcnJvcjogc3RyaW5nID0gJ1BhZ2VCYXNlVW5rbm93blNhdmVFcnJvcl9TQyc7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gb3B0IG91dCBvZiBoaWRpbmcgdGhlIHNwbGFzaCBzY3JlZW4gd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWRcbiAgICovXG4gIHB1YmxpYyBza2lwSGlkZVNwbGFzaE9uQ29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hlbiBzZXQgdG8gdHJ1ZSBhbnkgbmF2aWdhdGlvbiBlbmQgZXZlbnRzIHRoYXQgYXJlIHN0cmljdGx5IHF1ZXJ5IHBhcmFtIGNoYW5nZXMgd2lsbFxuICAgKiBub3QgY2FsbCB0aGUgb25OYXZpZ2F0aW9uRW5kIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyBwYWdlcyB0byBjaGFuZ2UgdGhlIHZpZXcgd2l0aCBxdWVyeVxuICAgKiBwYXJhbXMgYW5kIG5vdCB0cmlnZ2VyIGEgZnVsbCByZWZyZXNoLlxuICAgKi9cbiAgcHVibGljIGlnbm9yZVF1ZXJ5UGFyYW1zT25OYXZpZ2F0aW9uQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBwcmV2aW91c1VybDogc3RyaW5nID0gXCJcIjtcblxuICAvKipcbiAgICogVXNlZCB0byB1bnN1YnNjcmliZSBmcm9tIG9ic2VydmFibGVzXG4gICAqL1xuICBwdWJsaWMgZGVzdHJveWVkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKipcbiAgICogVXNlZCB0byBrbm93IHdoZW4gdGhlIHBhZ2UgaGFzIGJlZW4gbG9hZGVkLCB0aGlzIHdpbGwgYmUgY29tcGxldGVkXG4gICAqIGFmdGVyIG9uQWZ0ZXJWaWV3SW5pdFxuICAgKi9cbiAgcHJpdmF0ZSBfYWZ0ZXJWaWV3SW5pdENvbXBsZXRlOiBSZXBsYXlTdWJqZWN0PHZvaWQ+ID0gbmV3IFJlcGxheVN1YmplY3QoKTtcbiAgcHVibGljIGFmdGVyVmlld0luaXRDb21wbGV0ZTogT2JzZXJ2YWJsZTx2b2lkPiA9IHRoaXMuX2FmdGVyVmlld0luaXRDb21wbGV0ZTtcblxuICAvKipcbiAgICogSWYgZGVmaW5lZCB0aGUgZm9ybSB3aWxsIGF1dG9tYXRpY2FsbHkgc2Nyb2xsIHRvIHRoZSBmaXJzdCBpbnZhbGlkIGZvcm0gY29udHJvbFxuICAgKiBpZiBpdCdzIG91dHNpZGUgb2YgdGhlIHZpZXdcbiAgICovXG4gIHByb3RlY3RlZCBzY3JvbGxDb250YWluZXJTZWxlY3Rvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIHJvdXRlciBldmVudHMgTmF2aWdhdGlvbkVuZFxuICAgKiBVc2VkIHRvIGtub3cgaWYgYWxyZWFkeSBzdWJzY3JpYmVkIHRvXG4gICAqL1xuICBwcml2YXRlIG5hdmlnYXRpb25FbmRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqXG4gICAqIENvbW1vbiBzZXJ2aWNlcyB1c2VkIGJ5IHBhZ2UtYmFzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZTtcbiAgcHJvdGVjdGVkIHNjcm9sbFNlcnZpY2U6IFNjcm9sbFNlcnZpY2U7XG4gIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcjtcbiAgcHJvdGVjdGVkIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZTtcbiAgcHJvdGVjdGVkIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2U7XG4gIHByb3RlY3RlZCBzcGxhc2hTZXJ2aWNlOiBTcGxhc2hTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcm91dGVySGVscGVyOiBSb3V0ZXJIZWxwZXI7XG5cbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5lcnJvclNlcnZpY2UgPSBpbmplY3Rvci5nZXQoRXJyb3JTZXJ2aWNlKTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgdGhpcy5zY3JvbGxTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFNjcm9sbFNlcnZpY2UpO1xuICAgIHRoaXMucm91dGVyID0gaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZSA9IGluamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSk7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KERpYWxvZ1NlcnZpY2UpO1xuICAgIHRoaXMuc3BsYXNoU2VydmljZSA9IGluamVjdG9yLmdldChTcGxhc2hTZXJ2aWNlKTtcbiAgICB0aGlzLnJvdXRlckhlbHBlciA9IGluamVjdG9yLmdldChSb3V0ZXJIZWxwZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVycm9ycyB0byBiZSBzaG93biBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQXV0b21hdGljYWxseSBwb3B1bGF0ZWQgb24gcHJvbWlzZSByZWplY3Rpb24gZnJvbSBzYXZlIGFuZCBzaGFyZWQgd2l0aCB0aGUgVUkuXG4gICAqL1xuICBwcml2YXRlIF9lcnJvcnM6IHN0cmluZyA9ICcnO1xuICBwdWJsaWMgZ2V0IGVycm9ycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9lcnJvcnM7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW9uYWwgbGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgQW5ndWxhciBuZ09uSW5pdCBsaWZlY3ljbGUgaG9vay5cbiAgICogQ2FsbGVkIGJlZm9yZSBvbkluaXQgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZS4gQWRkIHNldHVwIGxvZ2ljIGhlcmUgdGhhdCBkb2VzXG4gICAqIG5vdCBuZWVkIHRvIGJlIHJ1biBvbiBldmVyeSByZWxvYWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25GaXJzdEluaXQoKTogdm9pZCB7IH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHRoZSBkZXJpdmVkIGNsYXNzIGFzIHBhcnQgb2YgdGhlIEFuZ3VsYXIgbmdPbkluaXRcbiAgICogbGlmZWN5Y2xlIGhvb2suIEl0IG11c3QgcHJvdmlkZSBhIFBhZ2VJbml0UmVzdWx0IGJhY2sgdG8gdGhlIGJhc2UgY2xhc3MgdG8gcHJvcGVybHlcbiAgICogc2V0IHVwIHRoZSBwYWdlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG9uSW5pdCgpOiBQcm9taXNlPFBhZ2VJbml0UmVzdWx0PjtcbiAgcHJvdGVjdGVkIGluaXRQcm9taXNlITogUHJvbWlzZTxQYWdlSW5pdFJlc3VsdD47XG5cbiAgcHVibGljIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNob3dTdGF0dXMoUGFnZVN0YXR1cy5Mb2FkaW5nKTtcbiAgICAgIHRoaXMuc2V0VXBSb3V0ZXJTdWJzY3JpcHRpb25zKCk7XG4gICAgICB0aGlzLm9uRmlyc3RJbml0KCk7XG4gICAgICB0aGlzLmluaXRQcm9taXNlID0gdGhpcy5vbkluaXQoKTtcblxuICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zcGxhc2hTZXJ2aWNlLmhpZGVTcGxhc2goKTtcbiAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBhZnRlciB0aGUgQW5ndWxhciBMaWZlY3ljbGUgZXZlbnQgbmdPbkFmdGVyVmlld0luaXQuXG4gICAqIEl0IGZpcmVzIGFmdGVyIGFsbCBzdWItY29tcG9uZW50cyBoYXZlIGdvbmUgdGhyb3VnaCB0aGVpciBpbml0aWFsaXphdGlvbiBwaGFzZS5cbiAgICogSXQgaXMgaW4gdGhpcyBwaGFzZSB0aGF0IHRoZSB2aWV3IGNvbXBvbmVudHMgc2hvdWxkIGFscmVhZHkgZXhpc3QsIHNvIGEgZGVyaXZlZCBjbGFzcyBzaG91bGRcbiAgICogbG9hZCBkYXRhIGZyb20gdGhlIEFQSSB0byBwb3B1bGF0ZSBhbnkgdmlldyBjb21wb25lbnRzLiBUaGUgcHJvbWlzZSB0aGF0XG4gICAqIGlzIHJldHVybmVkIG11c3Qgbm90IHJlc29sdmUgdW50aWwgYWxsIHJlcXVpcmVkIGRhdGEgaGFzIGNvbXBsZXRlbHkgbG9hZGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25BZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4geyB9O1xuICBwdWJsaWMgYXN5bmMgbmdBZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbml0UmVzdWx0ID0gYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICAgIHRoaXMucGFyc2VJbml0UmVzdWx0KGluaXRSZXN1bHQpO1xuXG4gICAgICBhd2FpdCB0aGlzLm9uQWZ0ZXJWaWV3SW5pdCgpO1xuXG4gICAgICB0aGlzLl9hZnRlclZpZXdJbml0Q29tcGxldGUubmV4dCgpO1xuICAgICAgdGhpcy5fYWZ0ZXJWaWV3SW5pdENvbXBsZXRlLmNvbXBsZXRlKCk7XG5cbiAgICAgIGF3YWl0IHRoaXMub25Gb3JtTG9hZENvbXBsZXRlKCk7XG5cbiAgICAgIGlmICh0aGlzLnN0YXR1cy5zdGF0dXMgPT09ICdwZW5kaW5nJykge1xuICAgICAgICB0aGlzLnNob3dTdGF0dXMoUGFnZVN0YXR1cy5Mb2FkZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2tpcEhpZGVTcGxhc2hPbkNvbXBsZXRlKSB7XG4gICAgICAgIHRoaXMuc3BsYXNoU2VydmljZS5oaWRlU3BsYXNoKCk7XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zcGxhc2hTZXJ2aWNlLmhpZGVTcGxhc2goKTtcbiAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgbGlmZWN5Y2xlIG1ldGhvZCB0aGF0IGV4ZWN1dGVzIG9uY2UgYWxsIGRhdGEgaGFzIGJlZW4gbG9hZGVkXG4gICAqIHRocm91Z2ggbmdBZnRlclZpZXdJbml0IGFuZCBmcm9tIGxvY2FsIHN0b3JhZ2UgaWYgcmVxdWlyZWQuXG4gICAqIEl0IGlzIGF0IHRoaXMgcG9pbnQgdGhhdCB5b3UgY2FuIHN1YnNjcmliZSB0byBjaGFuZ2VzIG9uIHRoZSBmb3JtXG4gICAqIHJlbGlhYmx5XG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQG1lbWJlcm9mIFBhZ2VCYXNlQ29tcG9uZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Gb3JtTG9hZENvbXBsZXRlKCk6IFByb21pc2U8YW55PiB7IH1cblxuICAvKipcbiAgICogQSBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBldmVyeSBOYXZpZ2F0aW9uRW5kIGV2ZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uTmF2aWdhdGlvbkVuZCgpOiB2b2lkIHsgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWQgdGhlIGNvbXBvbmVudCBraWNraW5nIG9mZiB0aGUgbmdPbkluaXQgYW5kIG5nQWZ0ZXJWaWV3SW5pdCBsaWZlY3ljbGUgaG9va3MuXG4gICAqIEFueSBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHJlc2V0IHNob3VsZCBiZSBkb25lIHNvIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxuICAgKi9cbiAgcHVibGljIHJlbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9hZnRlclZpZXdJbml0Q29tcGxldGUgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xuXG4gICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGluZyk7XG4gICAgdGhpcy5pbml0UHJvbWlzZSA9IHRoaXMub25Jbml0KCk7XG4gICAgdGhpcy5uZ0FmdGVyVmlld0luaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzIHRoaXMgbWV0aG9kIHdpbGwgc3luYyB0aGUgZm9ybSBzdGF0ZVxuICAgKiBpbnRvIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgQVBJLiBUaGUgdmFsdWUgc2hvdWxkIG5vdFxuICAgKiBhY3R1YWxseSBiZSBzZW50IHRvIHRoZSBBUEkgeWV0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGFwcGx5TW9kZWxVcGRhdGVzKCk6IFByb21pc2U8dm9pZD4geyB9O1xuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBtb2RlbCBzdGF0ZSB0byB0aGUgQVBJIGFuZCByZXR1cm4gYSBwcm9taXNlIHRoYXRcbiAgICogY29udGFpbnMgdGhlIHVwZGF0ZWQgZW50aXR5SUQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZWplY3RlZFxuICAgKiBpZiB0aGUgc2F2ZSBmYWlscyBhbmQgZXJyb3JzIGFuZCB0aGUgb3ZlcmxheSBzdGF0dXMgd2lsbCBiZSB1cGRhdGVkXG4gICAqIGFjY29yZGluZ2x5XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZVRvQXBpKCk6IFByb21pc2U8bnVtYmVyIHwgdm9pZD4geyB9O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIHNhdmUgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgZGVyaXZlZCBjbGFzcyB0byBuYXZpZ2F0ZVxuICAgKiB0byBhIHByb3BlcnRpZXMvc3RhdHVzIHBhZ2Ugb3IgZW1pdCBhcHByb3ByaWF0ZWx5IGlmIHdpdGhpbiBhIGRpYWxvZ1xuICAgKiBAcGFyYW0gZW50aXR5SWRcbiAgICovXG4gIHByb3RlY3RlZCBvblNhdmVDb21wbGV0ZShlbnRpdHlJZD86IG51bWJlcik6IHZvaWQgeyB9O1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgc2F2ZS4gIFdlIHdpbGwgZmlyc3QgdG91Y2ggYWxsIGNvbnRyb2xzIHRvIHNob3cgdmFsaWRhdGlvbiBtZXNzYWdlc1xuICAgKiBpZiB0aGUgZm9ybSBpcyBpbnZhbGlkLiAgSWYgdGhlIGZvcm0gaXMgdmFsaWQgd2Ugd2lsbCBhdHRlbXB0IHRvIHNhdmUgYW5kIGFueSBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZFxuICAgKiBiYWNrIHRvIHRoZSB1c2VyXG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIG9uU2F2ZShldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XG5cbiAgICAvLyBJZiB0aGUgZm9ybSBoYXMgcGVuZGluZyBhc3luYyB2YWxpZGF0b3JzLCB3YWl0IGZvciBpdCB0aGVtIHRvIGNvbXBsZXRlIGJlZm9yZSBwcm9jZWVkaW5nXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLnBlbmRpbmcpIHtcbiAgICAgIC8vIFNob3cgdGhlIHNhdmluZyBvdmVybGF5IHdoZW4gdGhlIGZvcm0gaGFzIHBlbmRpbmcgYXN5bmMgdmFsaWRhdG9yc1xuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuU2F2aW5nKTtcbiAgICAgIGF3YWl0IGxhc3RWYWx1ZUZyb20odGhpcy5mb3JtR3JvdXAuc3RhdHVzQ2hhbmdlcy5waXBlKGZpbHRlcihzdGF0dXMgPT4gc3RhdHVzICE9PSAnUEVORElORycpLCB0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBzYXZpbmcgb3ZlcmxheSB0byBkaXNwbGF5IGFueSBlcnJvcnNcbiAgICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLkxvYWRlZCk7XG4gICAgICBcbiAgICAgIC8vIE9ubHkgc2hvdyB0aGUgYmFubmVyIHdpdGggdGhlIGdlbmVyaWMgbWVzc2FnZSBpZiB0aGUgcGFyZW50IGNvbXBvbmVudCBoYXNuJ3QgYWxyZWFkeSBzZXQgb25lXG4gICAgICAvLyBieSBpbXBsZW1lbnRpbmcgb25TYXZlIGZvciBhZGRpdGlvbmFsIHZhbGlkYXRpb25cbiAgICAgIGlmICh0aGlzLmVycm9ycyA9PT0gJycpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3JCYW5uZXIodGhpcy5kZWZhdWx0SW52YWxpZEZvcm1NZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3IpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbFRvSXRlbSh0aGlzLnNjcm9sbENvbnRhaW5lclNlbGVjdG9yISwgXCIubmctaW52YWxpZFwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGF2YWlsYWJsZSB0byB0cmlnZ2VyIGEgc2F2ZSBhbmQgYnlwYXNzIHRoZSBmb3JtIHZhbGlkYXRpb24gY2hlY2tzLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgdXNlciBjaG9vc2VzIGEgcmVtb3ZlIGFjdGlvbiBmcm9tIHdpdGhpbiBhbiBlZGl0IGRpYWxvZy4gSWYgdGhlIGRpYWxvZyBmb3JtIGlzIGludmFsaWRcbiAgICogdGhhdCBpcyBubyBjb25jZXJuIHRvIHRoZSB1c2VyIGlmIHRoZXkgd2lzaCB0byByZW1vdmUgdGhlIGl0ZW0gdGhleSBhcmUgZWRpdGluZy5cbiAgICogQHBhcmFtIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgb25TYXZlV2l0aG91dFZhbGlkYXRlKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gICAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gdGhhdCB3aWxsIGxvZyBhbiBlcnJvciB0aGF0IGlzIHBhc3NlZCBpbiB0byB0aGUgY29uc29sZVxuICAgKiBAcGFyYW0gZVxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5lcnJvclNlcnZpY2UubG9nQ29uc29sZUVycm9yKGVycm9yKTtcbiAgICB0aGlzLnNob3dFcnJvck92ZXJsYXkoZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgYW4gZXJyb3IgbWVzc2FnZSBpbiBhIHdob2xlLXBhZ2Ugb3ZlcmxheS4gVGhpcyB3aWxsIHByZXZlbnQgYW55IG1vcmVcbiAgICogaW50ZXJhY3Rpb25zIHdpdGggdGhlIHBhZ2UuIEl0IGNhbiB0YWtlIGEgc3RyaW5nIGVycm9yIG1lc3NhZ2Ugb3IgYSByYXcgQVBJXG4gICAqIGVycm9yIHRoYXQgbmVlZHMgdG8gYmUgcGFyc2VkLiBJZiB0aGUgQVBJIGVycm9yIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlXG4gICAqIGEgZ2VuZXJpYyBtZXNzYWdlIGlzIHNob3duIGluc3RlYWRcbiAgICogQHBhcmFtIHsoRXJyb3IgfCBzdHJpbmcpfSBlcnJvclxuICAgKi9cbiAgcHJvdGVjdGVkIHNob3dFcnJvck92ZXJsYXkoZXJyb3I6IEVycm9yIHwgc3RyaW5nKSB7XG4gICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpLnN1YnNjcmliZSgodHJhbnNsYXRlZE1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdlcnJvcicsIHRyYW5zbGF0ZWRNZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IGFuIGVycm9yIGluIHRoZSBiYW5uZXIgYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuLiAgVGhpcyB3aWxsIG5vdCBwcm9kdWNlIGFcbiAgICogd2hvbGUtcGFnZSBvdmVybGF5IGxpa2UgdGhlIGZ1bmN0aW9uIHNob3dFcnJvciB3aWxsLiAgSXQgY2FuIHRha2UgYSBzdHJpbmcgZXJyb3IgbWVzc2FnZVxuICAgKiBvciByYXcgQVBJIGVycm9yIHRoYXQgbmVlZHMgdG8gYmUgcGFyc2VkLiAgSWYgdGhlIEFQSSBlcnJvciBpc24ndCBzb21ldGhpbmcgd2UgY2FuIGhhbmRsZSxcbiAgICogYSBnZW5lcmljIG1lc3NhZ2UgKGN1c3RvbWl6YWJsZSB2aWEgdW5rbm93bkVycm9yRGVmYXVsdCkgaXMgc2hvd24gaW5zdGVhZC5cbiAgICogQHBhcmFtIGVycm9yXG4gICAqIEBwYXJhbSB1bmtub3duRXJyb3JEZWZhdWx0XG4gICAqL1xuICBwcm90ZWN0ZWQgc2hvd0Vycm9yQmFubmVyKGVycm9yOiBFcnJvciB8IHN0cmluZywgdW5rbm93bkVycm9yRGVmYXVsdD86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yLCB1bmtub3duRXJyb3JEZWZhdWx0KS5zdWJzY3JpYmUoKHRyYW5zbGF0ZWRNZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuX2Vycm9ycyA9IHRyYW5zbGF0ZWRNZXNzYWdlO1xuICAgICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW5kIHRyYW5zbGF0ZXMgYW4gQVBJIGVycm9yIG9yIGVycm9yIHN0cmluZy5cbiAgICogQHBhcmFtIGVcbiAgICogQHBhcmFtIHVua25vd25FcnJvckRlZmF1bHRcbiAgICovXG4gIHByb3RlY3RlZCBnZXRFcnJvck1lc3NhZ2UoZTogRXJyb3IgfCBzdHJpbmcsIHVua25vd25FcnJvckRlZmF1bHQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGxldCBleHRyYWN0ZWRNZXNzYWdlID0gdGhpcy5lcnJvclNlcnZpY2UucGFyc2VBcGlFcnJvcihlLCB1bmtub3duRXJyb3JEZWZhdWx0KTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChleHRyYWN0ZWRNZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgZXJyb3JzIHRvIGhpZGUgdGhlIGVycm9ycyBiYW5uZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgaGlkZUVycm9yQmFubmVyKCk6IHZvaWQge1xuICAgIHRoaXMuX2Vycm9ycyA9ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgZGlzcGxheSBzdGF0dXMgdG8gb3ZlcmxheSB0aGUgd2hvbGUgcGFnZSB3aGlsZSBsb2FkaW5nIG9yIHNhdmluZ1xuICAgKiBhbmQgY2xlYXIgaXQgd2hlbiB0aGUgZm9ybSBpcyByZWFkeVxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB7UGFnZVN0YXR1c30gc3RhdHVzXG4gICAqIEBtZW1iZXJvZiBGb3JtQmFzZUNvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHNob3dTdGF0dXMoc3RhdHVzOiBQYWdlU3RhdHVzKSB7XG4gICAgbGV0IGtub3duU3RhdHVzID0gUGFnZVN0YXR1c2VzW3N0YXR1c107XG4gICAgaWYgKGtub3duU3RhdHVzKSB7XG4gICAgICB0aGlzLnN0YXR1cy5zZXRTdGF0dXMoa25vd25TdGF0dXMuc3RhdHVzLCBrbm93blN0YXR1cy5tZXNzYWdlLCB1bmRlZmluZWQsIGtub3duU3RhdHVzLm5vRGF0YVRlbXBsYXRlLCBrbm93blN0YXR1cy5vdmVybGF5Q2xhc3NMaXN0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIHRoZSBjb21wb25lbnQgdG8gZW50ZXIgYSBwZW5kaW5nIHN0YXR1cyBhbmQgZXhlY3V0ZSBhIGZ1bmN0aW9uIHRoYXQgb24gY29tcGxldGlvbiB3aWxsIHJldHVybiB0aGUgc3RhdHVzXG4gICAqIHRvIGhhc0RhdGEuIElmIGFuIGVycm9yIG9jY3VycyB3aXRoaW4gdGhlIGNhbGxiYWNrIGFuIGVycm9yIGJhbm5lciBjYW4gYmUgc2hvd24uXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gcGVuZGluZ01lc3NhZ2UgLSBvcHRpb25hbCBjdXN0b20gcGVuZGluZyBtZXNzYWdlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcnVuQmxvY2tpbmdBY3Rpb24oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8YW55PiwgcGVuZGluZ01lc3NhZ2U/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHRoaXMuaGlkZUVycm9yQmFubmVyKCk7XG4gICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdwZW5kaW5nJywgcGVuZGluZ01lc3NhZ2UpO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgdGhpcy5zaG93RXJyb3JCYW5uZXIoZXJyb3IpO1xuICAgICAgLy8gVGhyb3cgdGhlIGVycm9yIGZvciBhbnkgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoYXQgbWF5IGJlIGxpc3RlbmluZyBhbmQgbmVlZCB0byByZWFjdFxuICAgICAgLy8gdG8gYW55IGVycm9ycyBoYXBwZW5pbmcgd2l0aGluIHRoaXMgY2FsbGJhY2tcbiAgICAgIHRocm93IChlcnJvcik7XG4gICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnNob3dTdGF0dXMoUGFnZVN0YXR1cy5Mb2FkZWQpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIHBhZ2UgaW5pdCByZXN1bHQgYW5kIHNldHMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzIG9uIHRoZSBwYWdlXG4gICAqIEBwYXJhbSByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgcGFyc2VJbml0UmVzdWx0KHJlc3VsdDogUGFnZUluaXRSZXN1bHQpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRSZXN1bHQgPSByZXN1bHQ7XG4gICAgdGhpcy50aXRsZSA9IHJlc3VsdC50aXRsZTtcbiAgICB0aGlzLnN1YlRpdGxlID0gcmVzdWx0LnN1YlRpdGxlO1xuICAgIHRoaXMuc3ViVGl0bGVVcmwgPSByZXN1bHQuc3ViVGl0bGVVcmw7XG4gICAgdGhpcy5icmVhZGNydW1icyA9IHJlc3VsdC5icmVhZGNydW1icztcbiAgICB0aGlzLmhlbHAgPSByZXN1bHQuaGVscDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyB0aGUgcGFnZSBzdGF0dXMsIHRyaWdnZXJzIHRoZSBzYXZlIGFjdGlvbiBhbmQgaGFuZGxlcyBlcnJvcnMgdGhyb3duLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLlNhdmluZyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseU1vZGVsVXBkYXRlcygpO1xuICAgICAgbGV0IGVudGl0eUlkID0gYXdhaXQgdGhpcy5zYXZlVG9BcGkoKSB8fCAtMTtcblxuICAgICAgdGhpcy5fZXJyb3JzID0gJyc7XG5cbiAgICAgIHRoaXMub25TYXZlQ29tcGxldGUoZW50aXR5SWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvL2NsZWFyIHRoZSBcInNhdmluZ1wiIG92ZXJsYXkgYW5kIHNob3cgdGhlIG1lc3NhZ2UgYXQgdGhlIHRvcCBvZiB0aGUgdmlldyB0aHJvdWdoIHRoZSBlcnJvcnMgcHJvcGVydHlcbiAgICAgIHRoaXMuc2hvd0Vycm9yQmFubmVyKGVycm9yLCB0aGlzLmRlZmF1bHRVbmtub3duU2F2ZUVycm9yKTtcbiAgICAgIHRoaXMuc3BsYXNoU2VydmljZS5oaWRlU3BsYXNoKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdGhlIHJvdXRlciBldmVudCBzdWJzY3JpcHRpb25zXG4gICAqL1xuICBwcml2YXRlIHNldFVwUm91dGVyU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubmF2aWdhdGlvbkVuZFN1YnNjcmlwdGlvbiAmJiAhdGhpcy5kZXN0cm95ZWQuY2xvc2VkKSB7XG4gICAgICB0aGlzLnByZXZpb3VzVXJsID0gdGhpcy5yb3V0ZXIudXJsO1xuXG4gICAgICAvLyBSZWFjdCB0byBuYXZpZ2F0aW9uIGV2ZW50c1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uRW5kU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCksXG4gICAgICAgIGZpbHRlcihlID0+IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgICkuc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCBjdXJyZW50VXJsOiBzdHJpbmcgPSAoPE5hdmlnYXRpb25FbmQ+ZSkudXJsO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaWdub3JlUXVlcnlQYXJhbXNPbk5hdmlnYXRpb25DaGFuZ2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzVXJsLnNwbGl0KCc/JylbMF0gIT09IGN1cnJlbnRVcmwuc3BsaXQoJz8nKVswXSkge1xuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25FbmRIYW5kbGVyKCg8TmF2aWdhdGlvbkVuZD5lKS51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c1VybCAhPT0gY3VycmVudFVybCkge1xuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25FbmRIYW5kbGVyKCg8TmF2aWdhdGlvbkVuZD5lKS51cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5hdmlnYXRpb25FbmRIYW5kbGVyKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmV2aW91c1VybCA9IHVybDtcbiAgICB0aGlzLm9uTmF2aWdhdGlvbkVuZCgpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export var PageStatus;
|
|
2
|
-
(function (PageStatus) {
|
|
3
|
-
PageStatus["Loading"] = "loading";
|
|
4
|
-
PageStatus["Loaded"] = "loaded";
|
|
5
|
-
PageStatus["Saving"] = "saving";
|
|
6
|
-
PageStatus["NoData"] = "noData";
|
|
7
|
-
})(PageStatus || (PageStatus = {}));
|
|
8
|
-
;
|
|
9
|
-
export class PageStatuses {
|
|
10
|
-
static get loading() {
|
|
11
|
-
return { status: "pending", message: "Loading" };
|
|
12
|
-
}
|
|
13
|
-
static get loaded() {
|
|
14
|
-
return { status: "hasData", message: "" };
|
|
15
|
-
}
|
|
16
|
-
static get saving() {
|
|
17
|
-
return { status: "pending", message: "Saving" };
|
|
18
|
-
}
|
|
19
|
-
static get noData() {
|
|
20
|
-
return { status: "noData", message: "No data is available" };
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1zdGF0dXNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLXN0YXR1c2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBTixJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIsaUNBQW1CLENBQUE7SUFDbkIsK0JBQWlCLENBQUE7SUFDakIsK0JBQWlCLENBQUE7SUFDakIsK0JBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUxXLFVBQVUsS0FBVixVQUFVLFFBS3JCO0FBQUEsQ0FBQztBQUVGLE1BQU0sT0FBTyxZQUFZO0lBQ2hCLE1BQU0sS0FBSyxPQUFPO1FBQ3ZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRU0sTUFBTSxLQUFLLE1BQU07UUFDdEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFTSxNQUFNLEtBQUssTUFBTTtRQUN0QixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVNLE1BQU0sS0FBSyxNQUFNO1FBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxDQUFDO0lBQy9ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpc3BsYXlTdGF0dXMgfSBmcm9tICcuLi9kaXNwbGF5J1xuXG5leHBvcnQgZW51bSBQYWdlU3RhdHVzIHtcbiAgTG9hZGluZyA9ICdsb2FkaW5nJyxcbiAgTG9hZGVkID0gJ2xvYWRlZCcsXG4gIFNhdmluZyA9ICdzYXZpbmcnLFxuICBOb0RhdGEgPSAnbm9EYXRhJ1xufTtcblxuZXhwb3J0IGNsYXNzIFBhZ2VTdGF0dXNlcyB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGxvYWRpbmcoKTogRGlzcGxheVN0YXR1cyB7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiBcInBlbmRpbmdcIiwgbWVzc2FnZTogXCJMb2FkaW5nXCIgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGxvYWRlZCgpOiBEaXNwbGF5U3RhdHVzIHtcbiAgICByZXR1cm4geyBzdGF0dXM6IFwiaGFzRGF0YVwiLCBtZXNzYWdlOiBcIlwiIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBzYXZpbmcoKTogRGlzcGxheVN0YXR1cyB7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiBcInBlbmRpbmdcIiwgbWVzc2FnZTogXCJTYXZpbmdcIiB9O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXQgbm9EYXRhKCk6IERpc3BsYXlTdGF0dXMge1xuICAgIHJldHVybiB7IHN0YXR1czogXCJub0RhdGFcIiwgbWVzc2FnZTogXCJObyBkYXRhIGlzIGF2YWlsYWJsZVwiIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@angular/common";
|
|
4
|
-
import * as i2 from "@angular/router";
|
|
5
|
-
export class PageTitleComponent {
|
|
6
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PageTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PageTitleComponent, selector: "app-page-title", inputs: { title: "title", titleIcon: "titleIcon", subTitle: "subTitle", subTitleUrl: "subTitleUrl" }, host: { classAttribute: "d-flex" }, ngImport: i0, template: "<i *ngIf=\"titleIcon\"\n class=\"flex-shrink mr-1 my-1 ec-icon ec-icon-md {{titleIcon}}\"></i>\n<div class=\"text-truncate\">\n <h1 *ngIf=\"title\"\n class=\"text-title-1 mb-0 py-1 text-truncate\"\n title=\"{{title}}\">{{title}}</h1>\n <p *ngIf=\"subTitle && !subTitleUrl\"\n class=\"text-caption-1 mb-0 mt-n1 text-truncate\">{{subTitle}}</p>\n <a *ngIf=\"subTitle && subTitleUrl\"\n id=\"subTitle_link\"\n class=\"d-block text-truncate mb-0 mt-n1 font-size-small\"\n routerLink=\"{{subTitleUrl}}\"\n target=\"_self\">\n {{subTitle}}\n </a>\n</div>", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
|
|
8
|
-
}
|
|
9
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PageTitleComponent, decorators: [{
|
|
10
|
-
type: Component,
|
|
11
|
-
args: [{ selector: 'app-page-title', host: {
|
|
12
|
-
class: 'd-flex'
|
|
13
|
-
}, template: "<i *ngIf=\"titleIcon\"\n class=\"flex-shrink mr-1 my-1 ec-icon ec-icon-md {{titleIcon}}\"></i>\n<div class=\"text-truncate\">\n <h1 *ngIf=\"title\"\n class=\"text-title-1 mb-0 py-1 text-truncate\"\n title=\"{{title}}\">{{title}}</h1>\n <p *ngIf=\"subTitle && !subTitleUrl\"\n class=\"text-caption-1 mb-0 mt-n1 text-truncate\">{{subTitle}}</p>\n <a *ngIf=\"subTitle && subTitleUrl\"\n id=\"subTitle_link\"\n class=\"d-block text-truncate mb-0 mt-n1 font-size-small\"\n routerLink=\"{{subTitleUrl}}\"\n target=\"_self\">\n {{subTitle}}\n </a>\n</div>" }]
|
|
14
|
-
}], propDecorators: { title: [{
|
|
15
|
-
type: Input
|
|
16
|
-
}], titleIcon: [{
|
|
17
|
-
type: Input
|
|
18
|
-
}], subTitle: [{
|
|
19
|
-
type: Input
|
|
20
|
-
}], subTitleUrl: [{
|
|
21
|
-
type: Input
|
|
22
|
-
}] } });
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS10aXRsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL3BhZ2UvcGFnZS10aXRsZS9wYWdlLXRpdGxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLXRpdGxlL3BhZ2UtdGl0bGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFTakQsTUFBTSxPQUFPLGtCQUFrQjsrR0FBbEIsa0JBQWtCO21HQUFsQixrQkFBa0IsZ01DVC9CLDBsQkFlTTs7NEZETk8sa0JBQWtCO2tCQVA5QixTQUFTOytCQUNFLGdCQUFnQixRQUVwQjt3QkFDSixLQUFLLEVBQUUsUUFBUTtxQkFDaEI7OEJBR2UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXBhZ2UtdGl0bGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnZS10aXRsZS5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2QtZmxleCdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBQYWdlVGl0bGVDb21wb25lbnQge1xuICBASW5wdXQoKSBwdWJsaWMgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyB0aXRsZUljb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBzdWJUaXRsZT86IHN0cmluZzsgXG4gIEBJbnB1dCgpIHB1YmxpYyBzdWJUaXRsZVVybD86IHN0cmluZzsgXG59XG4iLCI8aSAqbmdJZj1cInRpdGxlSWNvblwiXG4gICBjbGFzcz1cImZsZXgtc2hyaW5rIG1yLTEgbXktMSBlYy1pY29uIGVjLWljb24tbWQge3t0aXRsZUljb259fVwiPjwvaT5cbjxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICA8aDEgKm5nSWY9XCJ0aXRsZVwiXG4gICAgICAgY2xhc3M9XCJ0ZXh0LXRpdGxlLTEgbWItMCBweS0xIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgIHRpdGxlPVwie3t0aXRsZX19XCI+e3t0aXRsZX19PC9oMT5cbiAgIDxwICpuZ0lmPVwic3ViVGl0bGUgJiYgIXN1YlRpdGxlVXJsXCJcbiAgICAgIGNsYXNzPVwidGV4dC1jYXB0aW9uLTEgbWItMCBtdC1uMSB0ZXh0LXRydW5jYXRlXCI+e3tzdWJUaXRsZX19PC9wPlxuICAgPGEgKm5nSWY9XCJzdWJUaXRsZSAmJiBzdWJUaXRsZVVybFwiXG4gICAgICBpZD1cInN1YlRpdGxlX2xpbmtcIlxuICAgICAgY2xhc3M9XCJkLWJsb2NrIHRleHQtdHJ1bmNhdGUgbWItMCBtdC1uMSBmb250LXNpemUtc21hbGxcIlxuICAgICAgcm91dGVyTGluaz1cInt7c3ViVGl0bGVVcmx9fVwiXG4gICAgICB0YXJnZXQ9XCJfc2VsZlwiPlxuICAgICAge3tzdWJUaXRsZX19XG4gICA8L2E+XG48L2Rpdj4iXX0=
|