@firestitch/system 15.0.0 → 17.0.0

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.
Files changed (94) hide show
  1. package/app/modules/query-logs/components/query-logs/query-logs.component.d.ts +1 -1
  2. package/app/modules/system/components/api-logs/api-logs.component.d.ts +1 -1
  3. package/app/modules/system/components/cron-next-run/cron-next-run.component.d.ts +1 -1
  4. package/app/modules/system/components/crons/crons.component.d.ts +1 -1
  5. package/app/modules/system/components/dashboard/dashboard.component.d.ts +1 -1
  6. package/app/modules/system/components/info/info.component.d.ts +1 -1
  7. package/app/modules/system/components/processes/processes.component.d.ts +1 -1
  8. package/app/modules/system/components/server-logs/server-logs.component.d.ts +1 -1
  9. package/app/modules/system/components/settings/settings.component.d.ts +1 -1
  10. package/app/modules/system/components/upgrade-logs/upgrade-logs.component.d.ts +1 -1
  11. package/esm2022/app/modules/query-logs/components/explain/explain.component.mjs +26 -0
  12. package/esm2022/app/modules/query-logs/components/query-log/query-log.component.mjs +61 -0
  13. package/esm2022/app/modules/query-logs/components/query-logs/query-logs.component.mjs +89 -0
  14. package/{esm2020 → esm2022}/app/modules/query-logs/query-logs.module.mjs +35 -35
  15. package/esm2022/app/modules/system/components/api-log/api-log.component.mjs +38 -0
  16. package/esm2022/app/modules/system/components/api-logs/api-logs.component.mjs +72 -0
  17. package/esm2022/app/modules/system/components/cron/cron.component.mjs +111 -0
  18. package/esm2022/app/modules/system/components/cron-log/cron-log.component.mjs +39 -0
  19. package/esm2022/app/modules/system/components/cron-next-run/cron-next-run.component.mjs +102 -0
  20. package/esm2022/app/modules/system/components/crons/crons.component.mjs +249 -0
  21. package/esm2022/app/modules/system/components/dashboard/dashboard.component.mjs +92 -0
  22. package/esm2022/app/modules/system/components/info/info.component.mjs +33 -0
  23. package/esm2022/app/modules/system/components/process/process.component.mjs +103 -0
  24. package/esm2022/app/modules/system/components/processes/processes.component.mjs +188 -0
  25. package/esm2022/app/modules/system/components/server-log/server-log.component.mjs +40 -0
  26. package/esm2022/app/modules/system/components/server-logs/server-logs.component.mjs +56 -0
  27. package/esm2022/app/modules/system/components/settings/settings.component.mjs +144 -0
  28. package/esm2022/app/modules/system/components/upgrade-logs/upgrade-logs.component.mjs +44 -0
  29. package/{esm2020 → esm2022}/app/modules/system/fs-system.module.mjs +70 -70
  30. package/{esm2020 → esm2022}/app/modules/system/pipes/key-name-value.pipe.mjs +5 -5
  31. package/{fesm2020 → fesm2022}/firestitch-system.mjs +315 -238
  32. package/fesm2022/firestitch-system.mjs.map +1 -0
  33. package/package.json +5 -11
  34. package/esm2020/app/modules/query-logs/components/explain/explain.component.mjs +0 -24
  35. package/esm2020/app/modules/query-logs/components/query-log/query-log.component.mjs +0 -58
  36. package/esm2020/app/modules/query-logs/components/query-logs/query-logs.component.mjs +0 -84
  37. package/esm2020/app/modules/system/components/api-log/api-log.component.mjs +0 -34
  38. package/esm2020/app/modules/system/components/api-logs/api-logs.component.mjs +0 -69
  39. package/esm2020/app/modules/system/components/cron/cron.component.mjs +0 -105
  40. package/esm2020/app/modules/system/components/cron-log/cron-log.component.mjs +0 -37
  41. package/esm2020/app/modules/system/components/cron-next-run/cron-next-run.component.mjs +0 -99
  42. package/esm2020/app/modules/system/components/crons/crons.component.mjs +0 -236
  43. package/esm2020/app/modules/system/components/dashboard/dashboard.component.mjs +0 -84
  44. package/esm2020/app/modules/system/components/info/info.component.mjs +0 -31
  45. package/esm2020/app/modules/system/components/process/process.component.mjs +0 -98
  46. package/esm2020/app/modules/system/components/processes/processes.component.mjs +0 -178
  47. package/esm2020/app/modules/system/components/server-log/server-log.component.mjs +0 -38
  48. package/esm2020/app/modules/system/components/server-logs/server-logs.component.mjs +0 -53
  49. package/esm2020/app/modules/system/components/settings/settings.component.mjs +0 -138
  50. package/esm2020/app/modules/system/components/upgrade-logs/upgrade-logs.component.mjs +0 -44
  51. package/fesm2015/firestitch-system.mjs +0 -1600
  52. package/fesm2015/firestitch-system.mjs.map +0 -1
  53. package/fesm2020/firestitch-system.mjs.map +0 -1
  54. /package/{esm2020 → esm2022}/app/modules/query-logs/components/explain/index.mjs +0 -0
  55. /package/{esm2020 → esm2022}/app/modules/query-logs/components/index.mjs +0 -0
  56. /package/{esm2020 → esm2022}/app/modules/query-logs/components/query-log/index.mjs +0 -0
  57. /package/{esm2020 → esm2022}/app/modules/query-logs/components/query-logs/index.mjs +0 -0
  58. /package/{esm2020 → esm2022}/app/modules/system/components/api-log/index.mjs +0 -0
  59. /package/{esm2020 → esm2022}/app/modules/system/components/api-logs/index.mjs +0 -0
  60. /package/{esm2020 → esm2022}/app/modules/system/components/cron/index.mjs +0 -0
  61. /package/{esm2020 → esm2022}/app/modules/system/components/cron-log/index.mjs +0 -0
  62. /package/{esm2020 → esm2022}/app/modules/system/components/cron-next-run/index.mjs +0 -0
  63. /package/{esm2020 → esm2022}/app/modules/system/components/crons/index.mjs +0 -0
  64. /package/{esm2020 → esm2022}/app/modules/system/components/dashboard/index.mjs +0 -0
  65. /package/{esm2020 → esm2022}/app/modules/system/components/info/index.mjs +0 -0
  66. /package/{esm2020 → esm2022}/app/modules/system/components/process/index.mjs +0 -0
  67. /package/{esm2020 → esm2022}/app/modules/system/components/processes/index.mjs +0 -0
  68. /package/{esm2020 → esm2022}/app/modules/system/components/server-log/index.mjs +0 -0
  69. /package/{esm2020 → esm2022}/app/modules/system/components/server-logs/index.mjs +0 -0
  70. /package/{esm2020 → esm2022}/app/modules/system/components/settings/index.mjs +0 -0
  71. /package/{esm2020 → esm2022}/app/modules/system/components/upgrade-logs/index.mjs +0 -0
  72. /package/{esm2020 → esm2022}/app/modules/system/consts/api-log-states.const.mjs +0 -0
  73. /package/{esm2020 → esm2022}/app/modules/system/consts/cron-log-states.const.mjs +0 -0
  74. /package/{esm2020 → esm2022}/app/modules/system/consts/cron-process-states.const.mjs +0 -0
  75. /package/{esm2020 → esm2022}/app/modules/system/consts/cron-states.const.mjs +0 -0
  76. /package/{esm2020 → esm2022}/app/modules/system/consts/index.mjs +0 -0
  77. /package/{esm2020 → esm2022}/app/modules/system/consts/process-process-states.const.mjs +0 -0
  78. /package/{esm2020 → esm2022}/app/modules/system/consts/process-states.const.mjs +0 -0
  79. /package/{esm2020 → esm2022}/app/modules/system/consts/setting-interface-types.const.mjs +0 -0
  80. /package/{esm2020 → esm2022}/app/modules/system/enums/api-log-state.enum.mjs +0 -0
  81. /package/{esm2020 → esm2022}/app/modules/system/enums/cron-log-state.enum.mjs +0 -0
  82. /package/{esm2020 → esm2022}/app/modules/system/enums/cron-state.enum.mjs +0 -0
  83. /package/{esm2020 → esm2022}/app/modules/system/enums/index.mjs +0 -0
  84. /package/{esm2020 → esm2022}/app/modules/system/enums/process-state.enum.mjs +0 -0
  85. /package/{esm2020 → esm2022}/app/modules/system/enums/setting-interface-type.enum.mjs +0 -0
  86. /package/{esm2020 → esm2022}/app/modules/system/helpers/index-name-value.mjs +0 -0
  87. /package/{esm2020 → esm2022}/app/modules/system/injectors/system-config.injector.mjs +0 -0
  88. /package/{esm2020 → esm2022}/app/modules/system/interfaces/dashboard-action.mjs +0 -0
  89. /package/{esm2020 → esm2022}/app/modules/system/interfaces/index.mjs +0 -0
  90. /package/{esm2020 → esm2022}/app/modules/system/interfaces/process-action.mjs +0 -0
  91. /package/{esm2020 → esm2022}/app/modules/system/interfaces/process.mjs +0 -0
  92. /package/{esm2020 → esm2022}/app/modules/system/interfaces/system-config.mjs +0 -0
  93. /package/{esm2020 → esm2022}/firestitch-system.mjs +0 -0
  94. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
@@ -0,0 +1,249 @@
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import { MatDialog } from '@angular/material/dialog';
3
+ import { parse } from '@firestitch/date';
4
+ import { ItemType } from '@firestitch/filter';
5
+ import { FsListComponent } from '@firestitch/list';
6
+ import { FsMessage } from '@firestitch/message';
7
+ import { FsPrompt } from '@firestitch/prompt';
8
+ import { SelectionActionType } from '@firestitch/selection';
9
+ import { Subject } from 'rxjs';
10
+ import { map, switchMap, takeUntil, tap } from 'rxjs/operators';
11
+ import { differenceInSeconds } from 'date-fns';
12
+ import { CronProcessStates, CronStates } from '../../consts';
13
+ import { CronState } from '../../enums';
14
+ import { indexNameValue } from '../../helpers/index-name-value';
15
+ import { CronComponent } from '../cron/cron.component';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "@firestitch/message";
18
+ import * as i2 from "@angular/material/dialog";
19
+ import * as i3 from "@firestitch/prompt";
20
+ import * as i4 from "@angular/common";
21
+ import * as i5 from "@firestitch/date";
22
+ import * as i6 from "@firestitch/list";
23
+ import * as i7 from "@firestitch/popover";
24
+ import * as i8 from "../cron-next-run/cron-next-run.component";
25
+ export class CronsComponent {
26
+ _message;
27
+ _dialog;
28
+ _prompt;
29
+ list;
30
+ enable;
31
+ disable;
32
+ kill;
33
+ queue;
34
+ run;
35
+ loadCrons;
36
+ loadCron;
37
+ loadCronLogs;
38
+ bulk;
39
+ config = null;
40
+ CronStates = indexNameValue(CronStates);
41
+ CronProcessStates = indexNameValue(CronProcessStates);
42
+ CronState = CronState;
43
+ _destroy$ = new Subject();
44
+ constructor(_message, _dialog, _prompt) {
45
+ this._message = _message;
46
+ this._dialog = _dialog;
47
+ this._prompt = _prompt;
48
+ }
49
+ ngOnInit() {
50
+ this._configList();
51
+ }
52
+ open(cron) {
53
+ this._dialog.open(CronComponent, {
54
+ data: {
55
+ cron,
56
+ loadCronLogs: this.loadCronLogs,
57
+ loadCron: this.loadCron,
58
+ cronActions: this.getCronActions(),
59
+ },
60
+ width: '85%',
61
+ });
62
+ }
63
+ getCronActions() {
64
+ return [
65
+ {
66
+ action: (data) => {
67
+ return this.queue(data)
68
+ .pipe(tap(() => {
69
+ this._message.success('Queued cron');
70
+ this.list.reload();
71
+ }));
72
+ },
73
+ label: 'Queue',
74
+ show: (cron) => {
75
+ return cron.state === CronState.Idle || cron.state === CronState.Failed;
76
+ },
77
+ },
78
+ {
79
+ action: (data) => {
80
+ return this.run(data)
81
+ .pipe(tap(() => {
82
+ this._message.success('Cron ran');
83
+ this.list.reload();
84
+ }));
85
+ },
86
+ label: 'Run',
87
+ show: (cron) => {
88
+ return cron.state === CronState.Idle || cron.state === CronState.Failed;
89
+ },
90
+ },
91
+ {
92
+ action: (data) => {
93
+ return this.enable(data)
94
+ .pipe(tap(() => {
95
+ this._message.success('Enabled cron');
96
+ this.list.reload();
97
+ }));
98
+ },
99
+ label: 'Enable',
100
+ show: (cron) => {
101
+ return cron.state === CronState.Disabled;
102
+ },
103
+ },
104
+ {
105
+ action: (data) => {
106
+ return this.disable(data)
107
+ .pipe(tap(() => {
108
+ this._message.success('Disabled cron');
109
+ this.list.reload();
110
+ }));
111
+ },
112
+ label: 'Disable',
113
+ show: (cron) => {
114
+ return cron.state === CronState.Idle || cron.state === CronState.Failed;
115
+ },
116
+ },
117
+ {
118
+ action: (data) => {
119
+ return this._prompt.confirm({
120
+ title: 'Confirm',
121
+ template: 'Are you sure you would like to kill the cron?',
122
+ })
123
+ .pipe(switchMap(() => {
124
+ return this.kill(data);
125
+ }), tap(() => {
126
+ this._message.success('Killed cron');
127
+ this.list.reload();
128
+ }), takeUntil(this._destroy$));
129
+ },
130
+ label: 'Kill',
131
+ show: (cron) => {
132
+ return cron.state === CronState.Running;
133
+ },
134
+ },
135
+ {
136
+ action: (data) => {
137
+ return this._prompt.confirm({
138
+ title: 'Confirm',
139
+ template: 'Are you sure you would like to reset the cron?',
140
+ })
141
+ .pipe(switchMap(() => {
142
+ return this.enable(data);
143
+ }), tap(() => {
144
+ this._message.success('Reset cron');
145
+ this.list.reload();
146
+ }), takeUntil(this._destroy$));
147
+ },
148
+ label: 'Reset',
149
+ show: (cron) => {
150
+ return cron.state === CronState.Killing || cron.state === CronState.Running || cron.state === CronState.Failed || cron.state === CronState.Queued;
151
+ },
152
+ },
153
+ ];
154
+ }
155
+ ngOnDestroy() {
156
+ this._destroy$.next(null);
157
+ this._destroy$.complete();
158
+ }
159
+ _configList() {
160
+ this.config = {
161
+ paging: false,
162
+ filters: [
163
+ {
164
+ type: ItemType.Keyword,
165
+ name: 'keyword',
166
+ label: 'Search',
167
+ },
168
+ ],
169
+ rowActions: this.getCronActions()
170
+ .map((rowAction) => {
171
+ return {
172
+ ...rowAction,
173
+ click: (cron) => {
174
+ rowAction.action(cron)
175
+ .subscribe();
176
+ },
177
+ };
178
+ }),
179
+ fetch: (query) => {
180
+ query = {
181
+ ...query,
182
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
183
+ };
184
+ return this.loadCrons(query)
185
+ .pipe(map((crons) => ({
186
+ data: crons
187
+ .map((cron) => {
188
+ return {
189
+ ...cron,
190
+ runningDuration: differenceInSeconds(parse(cron.createDate), new Date()),
191
+ };
192
+ }),
193
+ })));
194
+ },
195
+ };
196
+ if (this.bulk) {
197
+ this.config.selection = {
198
+ selectAll: false,
199
+ actions: [
200
+ {
201
+ type: SelectionActionType.Action,
202
+ name: 'disable',
203
+ label: 'Disable',
204
+ },
205
+ {
206
+ type: SelectionActionType.Action,
207
+ name: 'enable',
208
+ label: 'Enable',
209
+ },
210
+ ],
211
+ actionSelected: (action) => {
212
+ return this.bulk(action.action.name, action.selected)
213
+ .pipe(tap(() => {
214
+ this.list.reload();
215
+ this._message.success('Applied Changes');
216
+ }));
217
+ },
218
+ };
219
+ }
220
+ }
221
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CronsComponent, deps: [{ token: i1.FsMessage }, { token: i2.MatDialog }, { token: i3.FsPrompt }], target: i0.ɵɵFactoryTarget.Component });
222
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CronsComponent, selector: "fs-system-crons", inputs: { enable: "enable", disable: "disable", kill: "kill", queue: "queue", run: "run", loadCrons: "loadCrons", loadCron: "loadCron", loadCronLogs: "loadCronLogs", bulk: "bulk" }, viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true, static: true }], ngImport: i0, template: "<fs-list [config]=\"config\">\n <fs-list-column>\n <ng-template fs-list-header>Name</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <a (click)=\"open(row)\">{{row.name}}</a>\n <div *ngIf=\"row.cronSetting\">\n <small>{{row.cronSetting.summary}}</small>\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column align=\"center\">\n <ng-template fs-list-header>Status</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.host || row.processId; else status\">\n <fs-popover \n [maxWidth]=\"null\"\n [template]=\"statusPopover\" \n [indication]=\"true\"\n size=\"small\">\n <ng-container *ngTemplateOutlet=\"status\"></ng-container>\n </fs-popover>\n <ng-template #statusPopover>\n <div *ngIf=\"row.host\">Host: {{row.host}}</div>\n <div *ngIf=\"row.processId\">Process ID: {{row.processId}}</div>\n <div *ngIf=\"row.processState\">Process State: {{CronProcessStates[row.processState]}}</div>\n </ng-template>\n </ng-container>\n <ng-template #status>\n {{CronStates[row.state]}}\n </ng-template>\n <ng-container *ngIf=\"row.state === CronState.Running\">\n <div class=\"small\">\n Duration: {{ row.runningDuration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-container> \n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Last Ran</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.duration===null; else lastRan\">\n Never\n </ng-container>\n <ng-template #lastRan>\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n <div class=\"small\" *ngIf=\"row.duration\">\n Duration: {{ row.duration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-template>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Next Run</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.state !== CronState.Disabled\">\n <app-next-run [cron]=\"row\"></app-next-run>\n </ng-container>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Timeout Hours</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.cronSetting.timeout}}\n </ng-template>\n </fs-list-column>\n</fs-list>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.FsDateAgoComponent, selector: "fs-date-ago", inputs: ["date", "showTime", "format", "showTooltip", "tooltipDateFormat"] }, { kind: "component", type: i6.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i6.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i6.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: i6.FsListHeaderDirective, selector: "[fs-list-header]", inputs: ["colspan", "align", "class"] }, { kind: "component", type: i7.FsPopoverComponent, selector: "fs-popover" }, { kind: "component", type: i8.CronNextRunComponent, selector: "app-next-run", inputs: ["cron"] }, { kind: "pipe", type: i5.FsDateDurationPipe, name: "fsDateDuration" }] });
223
+ }
224
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CronsComponent, decorators: [{
225
+ type: Component,
226
+ args: [{ selector: 'fs-system-crons', template: "<fs-list [config]=\"config\">\n <fs-list-column>\n <ng-template fs-list-header>Name</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <a (click)=\"open(row)\">{{row.name}}</a>\n <div *ngIf=\"row.cronSetting\">\n <small>{{row.cronSetting.summary}}</small>\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column align=\"center\">\n <ng-template fs-list-header>Status</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.host || row.processId; else status\">\n <fs-popover \n [maxWidth]=\"null\"\n [template]=\"statusPopover\" \n [indication]=\"true\"\n size=\"small\">\n <ng-container *ngTemplateOutlet=\"status\"></ng-container>\n </fs-popover>\n <ng-template #statusPopover>\n <div *ngIf=\"row.host\">Host: {{row.host}}</div>\n <div *ngIf=\"row.processId\">Process ID: {{row.processId}}</div>\n <div *ngIf=\"row.processState\">Process State: {{CronProcessStates[row.processState]}}</div>\n </ng-template>\n </ng-container>\n <ng-template #status>\n {{CronStates[row.state]}}\n </ng-template>\n <ng-container *ngIf=\"row.state === CronState.Running\">\n <div class=\"small\">\n Duration: {{ row.runningDuration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-container> \n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Last Ran</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.duration===null; else lastRan\">\n Never\n </ng-container>\n <ng-template #lastRan>\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n <div class=\"small\" *ngIf=\"row.duration\">\n Duration: {{ row.duration | fsDateDuration: { hours: true, minutes: true, seconds: true } }}\n </div>\n </ng-template>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Next Run</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.state !== CronState.Disabled\">\n <app-next-run [cron]=\"row\"></app-next-run>\n </ng-container>\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>Timeout Hours</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.cronSetting.timeout}}\n </ng-template>\n </fs-list-column>\n</fs-list>\n" }]
227
+ }], ctorParameters: () => [{ type: i1.FsMessage }, { type: i2.MatDialog }, { type: i3.FsPrompt }], propDecorators: { list: [{
228
+ type: ViewChild,
229
+ args: [FsListComponent, { static: true }]
230
+ }], enable: [{
231
+ type: Input
232
+ }], disable: [{
233
+ type: Input
234
+ }], kill: [{
235
+ type: Input
236
+ }], queue: [{
237
+ type: Input
238
+ }], run: [{
239
+ type: Input
240
+ }], loadCrons: [{
241
+ type: Input
242
+ }], loadCron: [{
243
+ type: Input
244
+ }], loadCronLogs: [{
245
+ type: Input
246
+ }], bulk: [{
247
+ type: Input
248
+ }] } });
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL3N5c3RlbS9jb21wb25lbnRzL2Nyb25zL2Nyb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9jcm9ucy9jcm9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBd0IsZUFBZSxFQUFnQixNQUFNLGtCQUFrQixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsY0FBYyxFQUFF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QUFlLDhEQzdCNUIsc2lGQWtFQTs7NEZEdkNhLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0UsaUJBQWlCOzZIQU0wQixJQUFJO3NCQUF4RCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTVCLE1BQU07c0JBQXJCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsR0FBRztzQkFBbEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNMaXN0QWN0aW9uU2VsZWN0ZWQsIEZzTGlzdENvbXBvbmVudCwgRnNMaXN0Q29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IEZzUHJvbXB0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvbXB0JztcbmltcG9ydCB7IFNlbGVjdGlvbkFjdGlvblR5cGUgfSBmcm9tICdAZmlyZXN0aXRjaC9zZWxlY3Rpb24nO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGRpZmZlcmVuY2VJblNlY29uZHMgfSBmcm9tICdkYXRlLWZucyc7XG5cbmltcG9ydCB7IENyb25Qcm9jZXNzU3RhdGVzLCBDcm9uU3RhdGVzIH0gZnJvbSAnLi4vLi4vY29uc3RzJztcbmltcG9ydCB7IENyb25TdGF0ZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IGluZGV4TmFtZVZhbHVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9pbmRleC1uYW1lLXZhbHVlJztcbmltcG9ydCB7IENyb25Db21wb25lbnQgfSBmcm9tICcuLi9jcm9uL2Nyb24uY29tcG9uZW50JztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1zeXN0ZW0tY3JvbnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3JvbnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jcm9ucy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDcm9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKEZzTGlzdENvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGxpc3Q6IEZzTGlzdENvbXBvbmVudDtcblxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlOiAoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIEBJbnB1dCgpIHB1YmxpYyBkaXNhYmxlOiAoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIEBJbnB1dCgpIHB1YmxpYyBraWxsOiAoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIEBJbnB1dCgpIHB1YmxpYyBxdWV1ZTogKGRhdGE6IGFueSkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBASW5wdXQoKSBwdWJsaWMgcnVuOiAoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkQ3JvbnM6IChkYXRhOiBhbnkpID0+IE9ic2VydmFibGU8YW55W10+O1xuICBASW5wdXQoKSBwdWJsaWMgbG9hZENyb246IChkYXRhOiBhbnkpID0+IE9ic2VydmFibGU8YW55PjtcbiAgQElucHV0KCkgcHVibGljIGxvYWRDcm9uTG9nczogKGRhdGE6IGFueSkgPT4gT2JzZXJ2YWJsZTx7IGRhdGE6IGFueVtdOyBwYWdpbmc6IGFueSB9PjtcbiAgQElucHV0KCkgcHVibGljIGJ1bGs6IChhY3Rpb25OYW1lOiBzdHJpbmcsIGRhdGE6IGFueVtdKSA9PiBPYnNlcnZhYmxlPGFueT47XG5cbiAgcHVibGljIGNvbmZpZzogRnNMaXN0Q29uZmlnID0gbnVsbDtcbiAgcHVibGljIENyb25TdGF0ZXMgPSBpbmRleE5hbWVWYWx1ZShDcm9uU3RhdGVzKTtcbiAgcHVibGljIENyb25Qcm9jZXNzU3RhdGVzID0gaW5kZXhOYW1lVmFsdWUoQ3JvblByb2Nlc3NTdGF0ZXMpO1xuICBwdWJsaWMgQ3JvblN0YXRlID0gQ3JvblN0YXRlO1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9tZXNzYWdlOiBGc01lc3NhZ2UsXG4gICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBfcHJvbXB0OiBGc1Byb21wdCxcbiAgKSB7IH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY29uZmlnTGlzdCgpO1xuICB9XG5cbiAgcHVibGljIG9wZW4oY3Jvbikge1xuICAgIHRoaXMuX2RpYWxvZy5vcGVuKENyb25Db21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY3JvbixcbiAgICAgICAgbG9hZENyb25Mb2dzOiB0aGlzLmxvYWRDcm9uTG9ncyxcbiAgICAgICAgbG9hZENyb246IHRoaXMubG9hZENyb24sXG4gICAgICAgIGNyb25BY3Rpb25zOiB0aGlzLmdldENyb25BY3Rpb25zKCksXG4gICAgICB9LFxuICAgICAgd2lkdGg6ICc4NSUnLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENyb25BY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGFjdGlvbjogKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZShkYXRhKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdRdWV1ZWQgY3JvbicpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdC5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBsYWJlbDogJ1F1ZXVlJyxcbiAgICAgICAgc2hvdzogKGNyb24pID0+IHtcbiAgICAgICAgICByZXR1cm4gY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLklkbGUgfHwgY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLkZhaWxlZDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGFjdGlvbjogKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5ydW4oZGF0YSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQ3JvbiByYW4nKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3QucmVsb2FkKCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGFiZWw6ICdSdW4nLFxuICAgICAgICBzaG93OiAoY3JvbikgPT4ge1xuICAgICAgICAgIHJldHVybiBjcm9uLnN0YXRlID09PSBDcm9uU3RhdGUuSWRsZSB8fCBjcm9uLnN0YXRlID09PSBDcm9uU3RhdGUuRmFpbGVkO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYWN0aW9uOiAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVuYWJsZShkYXRhKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdFbmFibGVkIGNyb24nKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3QucmVsb2FkKCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGFiZWw6ICdFbmFibGUnLFxuICAgICAgICBzaG93OiAoY3JvbikgPT4ge1xuICAgICAgICAgIHJldHVybiBjcm9uLnN0YXRlID09PSBDcm9uU3RhdGUuRGlzYWJsZWQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhY3Rpb246IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZShkYXRhKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdEaXNhYmxlZCBjcm9uJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0LnJlbG9hZCgpO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGxhYmVsOiAnRGlzYWJsZScsXG4gICAgICAgIHNob3c6IChjcm9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNyb24uc3RhdGUgPT09IENyb25TdGF0ZS5JZGxlIHx8IGNyb24uc3RhdGUgPT09IENyb25TdGF0ZS5GYWlsZWQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhY3Rpb246IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21wdC5jb25maXJtKHtcbiAgICAgICAgICAgIHRpdGxlOiAnQ29uZmlybScsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byBraWxsIHRoZSBjcm9uPycsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmtpbGwoZGF0YSk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnS2lsbGVkIGNyb24nKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3QucmVsb2FkKCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGFiZWw6ICdLaWxsJyxcbiAgICAgICAgc2hvdzogKGNyb24pID0+IHtcbiAgICAgICAgICByZXR1cm4gY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLlJ1bm5pbmc7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhY3Rpb246IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21wdC5jb25maXJtKHtcbiAgICAgICAgICAgIHRpdGxlOiAnQ29uZmlybScsXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byByZXNldCB0aGUgY3Jvbj8nLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmFibGUoZGF0YSk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnUmVzZXQgY3JvbicpO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdC5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBsYWJlbDogJ1Jlc2V0JyxcbiAgICAgICAgc2hvdzogKGNyb24pID0+IHtcbiAgICAgICAgICByZXR1cm4gY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLktpbGxpbmcgfHwgY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLlJ1bm5pbmcgfHwgY3Jvbi5zdGF0ZSA9PT0gQ3JvblN0YXRlLkZhaWxlZCB8fCBjcm9uLnN0YXRlID09PSBDcm9uU3RhdGUuUXVldWVkO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbmZpZ0xpc3QoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBwYWdpbmc6IGZhbHNlLFxuICAgICAgZmlsdGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICAgICAgICBuYW1lOiAna2V5d29yZCcsXG4gICAgICAgICAgbGFiZWw6ICdTZWFyY2gnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHJvd0FjdGlvbnM6IHRoaXMuZ2V0Q3JvbkFjdGlvbnMoKVxuICAgICAgICAubWFwKChyb3dBY3Rpb24pID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucm93QWN0aW9uLFxuICAgICAgICAgICAgY2xpY2s6IChjcm9uKSA9PiB7XG4gICAgICAgICAgICAgIHJvd0FjdGlvbi5hY3Rpb24oY3JvbilcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgZmV0Y2g6IChxdWVyeSkgPT4ge1xuICAgICAgICBxdWVyeSA9IHsgXG4gICAgICAgICAgLi4ucXVlcnksXG4gICAgICAgICAgdGltZXpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ3JvbnMocXVlcnkpXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGNyb25zKSA9PiAoe1xuICAgICAgICAgICAgICBkYXRhOiBjcm9uc1xuICAgICAgICAgICAgICAgIC5tYXAoKGNyb24pID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNyb24sXG4gICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdEdXJhdGlvbjogZGlmZmVyZW5jZUluU2Vjb25kcyhwYXJzZShjcm9uLmNyZWF0ZURhdGUpLCBuZXcgRGF0ZSgpKSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmKHRoaXMuYnVsaykge1xuICAgICAgdGhpcy5jb25maWcuc2VsZWN0aW9uID0ge1xuICAgICAgICBzZWxlY3RBbGw6IGZhbHNlLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogU2VsZWN0aW9uQWN0aW9uVHlwZS5BY3Rpb24sXG4gICAgICAgICAgICBuYW1lOiAnZGlzYWJsZScsXG4gICAgICAgICAgICBsYWJlbDogJ0Rpc2FibGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogU2VsZWN0aW9uQWN0aW9uVHlwZS5BY3Rpb24sXG4gICAgICAgICAgICBuYW1lOiAnZW5hYmxlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnRW5hYmxlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhY3Rpb25TZWxlY3RlZDogKGFjdGlvbjogRnNMaXN0QWN0aW9uU2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWxrKGFjdGlvbi5hY3Rpb24ubmFtZSwgYWN0aW9uLnNlbGVjdGVkKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0LnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnQXBwbGllZCBDaGFuZ2VzJyk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iLCI8ZnMtbGlzdCBbY29uZmlnXT1cImNvbmZpZ1wiPlxuICA8ZnMtbGlzdC1jb2x1bW4+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtaGVhZGVyPk5hbWU8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWNlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgPGEgKGNsaWNrKT1cIm9wZW4ocm93KVwiPnt7cm93Lm5hbWV9fTwvYT5cbiAgICAgIDxkaXYgKm5nSWY9XCJyb3cuY3JvblNldHRpbmdcIj5cbiAgICAgICAgPHNtYWxsPnt7cm93LmNyb25TZXR0aW5nLnN1bW1hcnl9fTwvc21hbGw+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2ZzLWxpc3QtY29sdW1uPlxuICA8ZnMtbGlzdC1jb2x1bW4gYWxpZ249XCJjZW50ZXJcIj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+U3RhdHVzPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cuaG9zdCB8fCByb3cucHJvY2Vzc0lkOyBlbHNlIHN0YXR1c1wiPlxuICAgICAgICA8ZnMtcG9wb3ZlciBcbiAgICAgICAgICAgIFttYXhXaWR0aF09XCJudWxsXCJcbiAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJzdGF0dXNQb3BvdmVyXCIgXG4gICAgICAgICAgICBbaW5kaWNhdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0dXNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mcy1wb3BvdmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3N0YXR1c1BvcG92ZXI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJvdy5ob3N0XCI+SG9zdDoge3tyb3cuaG9zdH19PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJvdy5wcm9jZXNzSWRcIj5Qcm9jZXNzIElEOiB7e3Jvdy5wcm9jZXNzSWR9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJyb3cucHJvY2Vzc1N0YXRlXCI+UHJvY2VzcyBTdGF0ZToge3tDcm9uUHJvY2Vzc1N0YXRlc1tyb3cucHJvY2Vzc1N0YXRlXX19PC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdHVzPlxuICAgICAgICB7e0Nyb25TdGF0ZXNbcm93LnN0YXRlXX19XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy5zdGF0ZSA9PT0gQ3JvblN0YXRlLlJ1bm5pbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCI+XG4gICAgICAgICAgRHVyYXRpb246IHt7IHJvdy5ydW5uaW5nRHVyYXRpb24gfCBmc0RhdGVEdXJhdGlvbjogeyBob3VyczogdHJ1ZSwgbWludXRlczogdHJ1ZSwgc2Vjb25kczogdHJ1ZSB9IH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+ICAgICAgXG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cbiAgPGZzLWxpc3QtY29sdW1uPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5MYXN0IFJhbjwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LmR1cmF0aW9uPT09bnVsbDsgZWxzZSBsYXN0UmFuXCI+XG4gICAgICAgIE5ldmVyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbGFzdFJhbj5cbiAgICAgICAgPGZzLWRhdGUtYWdvIFtkYXRlXT1cInJvdy5jcmVhdGVEYXRlXCI+PC9mcy1kYXRlLWFnbz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCIgKm5nSWY9XCJyb3cuZHVyYXRpb25cIj5cbiAgICAgICAgICBEdXJhdGlvbjoge3sgcm93LmR1cmF0aW9uIHwgZnNEYXRlRHVyYXRpb246IHsgaG91cnM6IHRydWUsIG1pbnV0ZXM6IHRydWUsIHNlY29uZHM6IHRydWUgfSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cbiAgPGZzLWxpc3QtY29sdW1uPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5OZXh0IFJ1bjwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LnN0YXRlICE9PSBDcm9uU3RhdGUuRGlzYWJsZWRcIj5cbiAgICAgICAgPGFwcC1uZXh0LXJ1biBbY3Jvbl09XCJyb3dcIj48L2FwcC1uZXh0LXJ1bj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG4gIDxmcy1saXN0LWNvbHVtbj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+VGltZW91dCBIb3VyczwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICB7e3Jvdy5jcm9uU2V0dGluZy50aW1lb3V0fX1cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2ZzLWxpc3QtY29sdW1uPlxuPC9mcy1saXN0PlxuIl19
@@ -0,0 +1,92 @@
1
+ import { Component, ChangeDetectionStrategy, Input, ChangeDetectorRef } from '@angular/core';
2
+ import { FsMessage } from '@firestitch/message';
3
+ import { FsBuildService } from '@firestitch/build';
4
+ import { takeUntil } from 'rxjs/operators';
5
+ import { Subject } from 'rxjs';
6
+ import { differenceInMinutes } from 'date-fns';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@firestitch/message";
9
+ import * as i2 from "@firestitch/build";
10
+ import * as i3 from "@angular/common";
11
+ import * as i4 from "@angular/material/button";
12
+ import * as i5 from "@angular/material/tooltip";
13
+ import * as i6 from "@angular/material/icon";
14
+ import * as i7 from "@firestitch/skeleton";
15
+ import * as i8 from "@firestitch/label";
16
+ import * as i9 from "@firestitch/menu";
17
+ import * as i10 from "@firestitch/date";
18
+ export class DashboardComponent {
19
+ _message;
20
+ _cdRef;
21
+ _buildService;
22
+ dashboard;
23
+ buttonActions = [];
24
+ build;
25
+ menuActions = [];
26
+ _destroy$ = new Subject();
27
+ init;
28
+ upgrade;
29
+ load;
30
+ actions = [];
31
+ constructor(_message, _cdRef, _buildService) {
32
+ this._message = _message;
33
+ this._cdRef = _cdRef;
34
+ this._buildService = _buildService;
35
+ }
36
+ ngOnInit() {
37
+ this._load();
38
+ this.buttonActions = this.actions.filter(item => { return !item.menu; });
39
+ this.menuActions = this.actions.filter(item => { return item.menu; });
40
+ this.build = this._buildService.build;
41
+ this._buildService.build$
42
+ .pipe(takeUntil(this._destroy$))
43
+ .subscribe((build) => {
44
+ this.build = build;
45
+ this._cdRef.markForCheck();
46
+ });
47
+ }
48
+ _load() {
49
+ this.load()
50
+ .subscribe((dashboard) => {
51
+ this.dashboard = dashboard;
52
+ this.dashboard.cronRanAttention = !dashboard.cronRan ||
53
+ differenceInMinutes(new Date(), new Date(dashboard.cronRan)) > 15;
54
+ this._cdRef.markForCheck();
55
+ });
56
+ }
57
+ ngOnDestroy() {
58
+ this._destroy$.next(null);
59
+ this._destroy$.complete();
60
+ }
61
+ actionClick(action) {
62
+ action.click();
63
+ }
64
+ initClick() {
65
+ this.init()
66
+ .subscribe(() => {
67
+ this._message.success('Successfully initialized the system');
68
+ });
69
+ }
70
+ upgradeClick() {
71
+ this.upgrade()
72
+ .subscribe(() => {
73
+ this._load();
74
+ this._message.success('Successfully upgraded the system');
75
+ });
76
+ }
77
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DashboardComponent, deps: [{ token: i1.FsMessage }, { token: i0.ChangeDetectorRef }, { token: i2.FsBuildService }], target: i0.ɵɵFactoryTarget.Component });
78
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DashboardComponent, selector: "fs-system-dashboard", inputs: { init: "init", upgrade: "upgrade", load: "load", actions: "actions" }, ngImport: i0, template: "<div *fsSkeleton=\"dashboard\">\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <div>\n <h2>Server</h2>\n\n <fs-label-field>\n <fs-label>Date/Time</fs-label>\n {{dashboard.serverTime | fsDateFormat: 'date-time'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Timezone</fs-label>\n {{dashboard.serverTimezone}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Hostname</fs-label>\n {{dashboard.serverHostname}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Directory</fs-label>\n {{dashboard.appDirectory}}\n </fs-label-field>\n </div>\n\n <div>\n <h2>System</h2>\n <fs-label-field>\n <fs-label>Mode</fs-label>\n {{dashboard.appMode}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Notification Recipients</fs-label>\n {{dashboard.notifyRecipients.join(', ')}}\n </fs-label-field>\n </div>\n\n <div>\n <h2>Database</h2>\n\n <fs-label-field>\n <fs-label>Name</fs-label>\n {{dashboard.databaseName}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Date/Time</fs-label>\n {{dashboard.databaseTime | fsDateFormat: 'date-time'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Timezone</fs-label>\n {{dashboard.databaseTimezone}}\n </fs-label-field>\n </div>\n\n <div *ngIf=\"build || dashboard.upgrades.length\">\n <ng-container *ngIf=\"build\">\n <h2>Build</h2>\n <fs-label-field>\n <fs-label>Version</fs-label>\n {{build.version || 'Unknown'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Date</fs-label>\n {{ (build.date | fsDateFormat: 'date-time') || 'Unknown' }}\n </fs-label-field>\n </ng-container>\n\n <fs-label-field *ngIf=\"dashboard.upgrades.length\">\n <fs-label>Pending Upgrades</fs-label>\n <span class=\"attention\" [ngClass]=\"{ 'needs-attention': !!dashboard.upgrades.length }\">\n {{dashboard.upgrades.length}}\n <mat-icon\n [matTooltip]=\"dashboard.upgrades.join('\\n')\"\n matTooltipClass=\"tooltip-pending-upgrades\"\n >\n warning\n </mat-icon>\n </span>\n </fs-label-field>\n </div>\n\n <div>\n <h2>Cron</h2>\n\n <fs-label-field>\n <fs-label>Last Ran</fs-label>\n <span class=\"attention\" [ngClass]=\"{ 'needs-attention': dashboard.cronRanAttention }\">\n <span *ngIf=\"!dashboard.cronRan\">Never</span>\n <span *ngIf=\"dashboard.cronRan\">{{dashboard.cronRan | fsDateFormat: 'date-time'}}</span>\n <mat-icon>warning</mat-icon>\n </span>\n </fs-label-field>\n </div>\n </div>\n \n\n <div>\n <div class=\"actions\">\n <button mat-raised-button (click)=\"upgradeClick()\">Run Upgrades</button>\n <button mat-raised-button (click)=\"initClick()\">Init System</button>\n <button\n *ngFor=\"let action of buttonActions\"\n mat-raised-button\n (click)=\"actionClick(action)\">\n {{action.label}}\n </button>\n\n <ng-container *ngIf=\"menuActions.length\">\n <fs-menu buttonClass=\"mat-raised-button menu-button\">\n <ng-template\n *ngFor=\"let action of menuActions\"\n fs-menu-item\n (click)=\"actionClick(action)\">\n {{action.label}}\n </ng-template>\n </fs-menu>\n </ng-container>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep .menu-button{box-shadow:none}h2{margin-top:0}.actions{display:flex;align-items:center;flex-wrap:wrap}.actions button,.actions fs-menu{margin-bottom:10px;margin-right:5px}table td{padding:3px}.attention{display:flex;align-items:center}.attention mat-icon{display:none;margin-left:2px}.attention.needs-attention{color:#c00}.attention.needs-attention mat-icon{display:inline}::ng-deep .tooltip-pending-upgrades{white-space:pre-line}@media (max-width: 1000px){:host ::ng-deep .menu-button{width:100%;border-radius:4px}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }, { kind: "component", type: i8.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i8.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { kind: "component", type: i9.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i9.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "pipe", type: i10.FsDateFormatPipe, name: "fsDateFormat" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
79
+ }
80
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DashboardComponent, decorators: [{
81
+ type: Component,
82
+ args: [{ selector: 'fs-system-dashboard', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *fsSkeleton=\"dashboard\">\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <div>\n <h2>Server</h2>\n\n <fs-label-field>\n <fs-label>Date/Time</fs-label>\n {{dashboard.serverTime | fsDateFormat: 'date-time'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Timezone</fs-label>\n {{dashboard.serverTimezone}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Hostname</fs-label>\n {{dashboard.serverHostname}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Directory</fs-label>\n {{dashboard.appDirectory}}\n </fs-label-field>\n </div>\n\n <div>\n <h2>System</h2>\n <fs-label-field>\n <fs-label>Mode</fs-label>\n {{dashboard.appMode}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Notification Recipients</fs-label>\n {{dashboard.notifyRecipients.join(', ')}}\n </fs-label-field>\n </div>\n\n <div>\n <h2>Database</h2>\n\n <fs-label-field>\n <fs-label>Name</fs-label>\n {{dashboard.databaseName}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Date/Time</fs-label>\n {{dashboard.databaseTime | fsDateFormat: 'date-time'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Timezone</fs-label>\n {{dashboard.databaseTimezone}}\n </fs-label-field>\n </div>\n\n <div *ngIf=\"build || dashboard.upgrades.length\">\n <ng-container *ngIf=\"build\">\n <h2>Build</h2>\n <fs-label-field>\n <fs-label>Version</fs-label>\n {{build.version || 'Unknown'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Date</fs-label>\n {{ (build.date | fsDateFormat: 'date-time') || 'Unknown' }}\n </fs-label-field>\n </ng-container>\n\n <fs-label-field *ngIf=\"dashboard.upgrades.length\">\n <fs-label>Pending Upgrades</fs-label>\n <span class=\"attention\" [ngClass]=\"{ 'needs-attention': !!dashboard.upgrades.length }\">\n {{dashboard.upgrades.length}}\n <mat-icon\n [matTooltip]=\"dashboard.upgrades.join('\\n')\"\n matTooltipClass=\"tooltip-pending-upgrades\"\n >\n warning\n </mat-icon>\n </span>\n </fs-label-field>\n </div>\n\n <div>\n <h2>Cron</h2>\n\n <fs-label-field>\n <fs-label>Last Ran</fs-label>\n <span class=\"attention\" [ngClass]=\"{ 'needs-attention': dashboard.cronRanAttention }\">\n <span *ngIf=\"!dashboard.cronRan\">Never</span>\n <span *ngIf=\"dashboard.cronRan\">{{dashboard.cronRan | fsDateFormat: 'date-time'}}</span>\n <mat-icon>warning</mat-icon>\n </span>\n </fs-label-field>\n </div>\n </div>\n \n\n <div>\n <div class=\"actions\">\n <button mat-raised-button (click)=\"upgradeClick()\">Run Upgrades</button>\n <button mat-raised-button (click)=\"initClick()\">Init System</button>\n <button\n *ngFor=\"let action of buttonActions\"\n mat-raised-button\n (click)=\"actionClick(action)\">\n {{action.label}}\n </button>\n\n <ng-container *ngIf=\"menuActions.length\">\n <fs-menu buttonClass=\"mat-raised-button menu-button\">\n <ng-template\n *ngFor=\"let action of menuActions\"\n fs-menu-item\n (click)=\"actionClick(action)\">\n {{action.label}}\n </ng-template>\n </fs-menu>\n </ng-container>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep .menu-button{box-shadow:none}h2{margin-top:0}.actions{display:flex;align-items:center;flex-wrap:wrap}.actions button,.actions fs-menu{margin-bottom:10px;margin-right:5px}table td{padding:3px}.attention{display:flex;align-items:center}.attention mat-icon{display:none;margin-left:2px}.attention.needs-attention{color:#c00}.attention.needs-attention mat-icon{display:inline}::ng-deep .tooltip-pending-upgrades{white-space:pre-line}@media (max-width: 1000px){:host ::ng-deep .menu-button{width:100%;border-radius:4px}}\n"] }]
83
+ }], ctorParameters: () => [{ type: i1.FsMessage }, { type: i0.ChangeDetectorRef }, { type: i2.FsBuildService }], propDecorators: { init: [{
84
+ type: Input
85
+ }], upgrade: [{
86
+ type: Input
87
+ }], load: [{
88
+ type: Input
89
+ }], actions: [{
90
+ type: Input
91
+ }] } });
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQWEsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7QUFXL0MsTUFBTSxPQUFPLGtCQUFrQjtJQWdCbkI7SUFDQTtJQUNBO0lBaEJILFNBQVMsQ0FBQztJQUNWLGFBQWEsR0FBc0IsRUFBRSxDQUFDO0lBQ3RDLEtBQUssQ0FBWTtJQUNqQixXQUFXLEdBQXNCLEVBQUUsQ0FBQztJQUVuQyxTQUFTLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUV6QixJQUFJLENBQVc7SUFDZixPQUFPLENBQVc7SUFDbEIsSUFBSSxDQUFXO0lBRWYsT0FBTyxHQUFzQixFQUFFLENBQUM7SUFFekMsWUFDVSxRQUFtQixFQUNuQixNQUF5QixFQUN6QixhQUE2QjtRQUY3QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBQ3pCLGtCQUFhLEdBQWIsYUFBYSxDQUFnQjtJQUNuQyxDQUFDO0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTTthQUN4QixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUMsQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLO1FBQ1gsSUFBSSxDQUFDLElBQUksRUFBRTthQUNWLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTztnQkFDakQsbUJBQW1CLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLFdBQVcsQ0FBQyxNQUFNO1FBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksQ0FBQyxJQUFJLEVBQUU7YUFDVixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxZQUFZO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEVBQUU7YUFDYixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBckVVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLDJJQ25CL0Isb2pIQTZIQTs7NEZEMUdhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDRSxxQkFBcUIsbUJBR2QsdUJBQXVCLENBQUMsTUFBTTsySUFXdEMsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBCdWlsZERhdGEsIEZzQnVpbGRTZXJ2aWNlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvYnVpbGQnO1xuXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGRpZmZlcmVuY2VJbk1pbnV0ZXMgfSBmcm9tICdkYXRlLWZucyc7XG5cbmltcG9ydCB7IERhc2hib2FyZEFjdGlvbiB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9kYXNoYm9hcmQtYWN0aW9uJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1zeXN0ZW0tZGFzaGJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICdkYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsgJ2Rhc2hib2FyZC5jb21wb25lbnQuc2NzcycgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIGRhc2hib2FyZDtcbiAgcHVibGljIGJ1dHRvbkFjdGlvbnM6IERhc2hib2FyZEFjdGlvbltdID0gW107XG4gIHB1YmxpYyBidWlsZDogQnVpbGREYXRhO1xuICBwdWJsaWMgbWVudUFjdGlvbnM6IERhc2hib2FyZEFjdGlvbltdID0gW107XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIEBJbnB1dCgpIGluaXQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKSB1cGdyYWRlOiBGdW5jdGlvbjtcbiAgQElucHV0KCkgbG9hZDogRnVuY3Rpb247XG5cbiAgQElucHV0KCkgYWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9tZXNzYWdlOiBGc01lc3NhZ2UsXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgX2J1aWxkU2VydmljZTogRnNCdWlsZFNlcnZpY2UsXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fbG9hZCgpO1xuICAgIHRoaXMuYnV0dG9uQWN0aW9ucyA9IHRoaXMuYWN0aW9ucy5maWx0ZXIoaXRlbSA9PiB7IHJldHVybiAhaXRlbS5tZW51OyB9KTtcbiAgICB0aGlzLm1lbnVBY3Rpb25zID0gdGhpcy5hY3Rpb25zLmZpbHRlcihpdGVtID0+IHsgcmV0dXJuIGl0ZW0ubWVudTsgfSk7XG5cbiAgICB0aGlzLmJ1aWxkID0gdGhpcy5fYnVpbGRTZXJ2aWNlLmJ1aWxkO1xuICAgIHRoaXMuX2J1aWxkU2VydmljZS5idWlsZCRcbiAgICAucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICApXG4gICAgLnN1YnNjcmliZSgoYnVpbGQ6IEJ1aWxkRGF0YSkgPT4ge1xuICAgICAgdGhpcy5idWlsZCA9IGJ1aWxkO1xuICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkKCkge1xuICAgIHRoaXMubG9hZCgpXG4gICAgLnN1YnNjcmliZSgoZGFzaGJvYXJkKSA9PiB7XG4gICAgICB0aGlzLmRhc2hib2FyZCA9IGRhc2hib2FyZDtcbiAgICAgIHRoaXMuZGFzaGJvYXJkLmNyb25SYW5BdHRlbnRpb24gPSAhZGFzaGJvYXJkLmNyb25SYW4gfHxcbiAgICAgICAgIGRpZmZlcmVuY2VJbk1pbnV0ZXMobmV3IERhdGUoKSwgbmV3IERhdGUoZGFzaGJvYXJkLmNyb25SYW4pKSA+IDE1O1xuICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dChudWxsKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGFjdGlvbkNsaWNrKGFjdGlvbikge1xuICAgIGFjdGlvbi5jbGljaygpO1xuICB9XG5cbiAgcHVibGljIGluaXRDbGljaygpIHtcbiAgICB0aGlzLmluaXQoKVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgdGhlIHN5c3RlbScpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVDbGljaygpIHtcbiAgICB0aGlzLnVwZ3JhZGUoKVxuICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fbG9hZCgpO1xuICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTdWNjZXNzZnVsbHkgdXBncmFkZWQgdGhlIHN5c3RlbScpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2ICpmc1NrZWxldG9uPVwiZGFzaGJvYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJmcy1yb3cuZ2FwLWxnLndyYXAuYWxpZ24tc3RhcnRcIj5cbiAgICA8ZGl2PlxuICAgICAgPGgyPlNlcnZlcjwvaDI+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPkRhdGUvVGltZTwvZnMtbGFiZWw+XG4gICAgICAgIHt7ZGFzaGJvYXJkLnNlcnZlclRpbWUgfCBmc0RhdGVGb3JtYXQ6ICdkYXRlLXRpbWUnfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlRpbWV6b25lPC9mcy1sYWJlbD5cbiAgICAgICAge3tkYXNoYm9hcmQuc2VydmVyVGltZXpvbmV9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+SG9zdG5hbWU8L2ZzLWxhYmVsPlxuICAgICAgICB7e2Rhc2hib2FyZC5zZXJ2ZXJIb3N0bmFtZX19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5EaXJlY3Rvcnk8L2ZzLWxhYmVsPlxuICAgICAgICB7e2Rhc2hib2FyZC5hcHBEaXJlY3Rvcnl9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXY+XG4gICAgICA8aDI+U3lzdGVtPC9oMj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPk1vZGU8L2ZzLWxhYmVsPlxuICAgICAgICB7e2Rhc2hib2FyZC5hcHBNb2RlfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPk5vdGlmaWNhdGlvbiBSZWNpcGllbnRzPC9mcy1sYWJlbD5cbiAgICAgICAge3tkYXNoYm9hcmQubm90aWZ5UmVjaXBpZW50cy5qb2luKCcsICcpfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2PlxuICAgICAgPGgyPkRhdGFiYXNlPC9oMj5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+TmFtZTwvZnMtbGFiZWw+XG4gICAgICAgIHt7ZGFzaGJvYXJkLmRhdGFiYXNlTmFtZX19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5EYXRlL1RpbWU8L2ZzLWxhYmVsPlxuICAgICAgICB7e2Rhc2hib2FyZC5kYXRhYmFzZVRpbWUgfCBmc0RhdGVGb3JtYXQ6ICdkYXRlLXRpbWUnfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlRpbWV6b25lPC9mcy1sYWJlbD5cbiAgICAgICAge3tkYXNoYm9hcmQuZGF0YWJhc2VUaW1lem9uZX19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cImJ1aWxkIHx8IGRhc2hib2FyZC51cGdyYWRlcy5sZW5ndGhcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJidWlsZFwiPlxuICAgICAgICA8aDI+QnVpbGQ8L2gyPlxuICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgPGZzLWxhYmVsPlZlcnNpb248L2ZzLWxhYmVsPlxuICAgICAgICAgIHt7YnVpbGQudmVyc2lvbiB8fCAnVW5rbm93bid9fVxuICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICA8ZnMtbGFiZWw+RGF0ZTwvZnMtbGFiZWw+XG4gICAgICAgICAge3sgKGJ1aWxkLmRhdGUgfCBmc0RhdGVGb3JtYXQ6ICdkYXRlLXRpbWUnKSB8fCAnVW5rbm93bicgfX1cbiAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJkYXNoYm9hcmQudXBncmFkZXMubGVuZ3RoXCI+XG4gICAgICAgIDxmcy1sYWJlbD5QZW5kaW5nIFVwZ3JhZGVzPC9mcy1sYWJlbD5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRlbnRpb25cIiBbbmdDbGFzc109XCJ7ICduZWVkcy1hdHRlbnRpb24nOiAhIWRhc2hib2FyZC51cGdyYWRlcy5sZW5ndGggfVwiPlxuICAgICAgICAgIHt7ZGFzaGJvYXJkLnVwZ3JhZGVzLmxlbmd0aH19XG4gICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImRhc2hib2FyZC51cGdyYWRlcy5qb2luKCdcXG4nKVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBDbGFzcz1cInRvb2x0aXAtcGVuZGluZy11cGdyYWRlc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIHdhcm5pbmdcbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdj5cbiAgICAgIDxoMj5Dcm9uPC9oMj5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+TGFzdCBSYW48L2ZzLWxhYmVsPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImF0dGVudGlvblwiIFtuZ0NsYXNzXT1cInsgJ25lZWRzLWF0dGVudGlvbic6IGRhc2hib2FyZC5jcm9uUmFuQXR0ZW50aW9uIH1cIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFkYXNoYm9hcmQuY3JvblJhblwiPk5ldmVyPC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZGFzaGJvYXJkLmNyb25SYW5cIj57e2Rhc2hib2FyZC5jcm9uUmFuIHwgZnNEYXRlRm9ybWF0OiAnZGF0ZS10aW1lJ319PC9zcGFuPlxuICAgICAgICAgIDxtYXQtaWNvbj53YXJuaW5nPC9tYXQtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIFxuXG4gIDxkaXY+XG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cInVwZ3JhZGVDbGljaygpXCI+UnVuIFVwZ3JhZGVzPC9idXR0b24+XG4gICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJpbml0Q2xpY2soKVwiPkluaXQgU3lzdGVtPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYnV0dG9uQWN0aW9uc1wiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJhY3Rpb25DbGljayhhY3Rpb24pXCI+XG4gICAgICAgIHt7YWN0aW9uLmxhYmVsfX1cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWVudUFjdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgIDxmcy1tZW51IGJ1dHRvbkNsYXNzPVwibWF0LXJhaXNlZC1idXR0b24gbWVudS1idXR0b25cIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBtZW51QWN0aW9uc1wiXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ2xpY2soYWN0aW9uKVwiPlxuICAgICAgICAgICAge3thY3Rpb24ubGFiZWx9fVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZnMtbWVudT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,33 @@
1
+ import { Component, ChangeDetectionStrategy, Input, ElementRef, ViewChild } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class InfoComponent {
4
+ iframe;
5
+ load;
6
+ ngAfterViewInit() {
7
+ this._load();
8
+ }
9
+ _load() {
10
+ this.load()
11
+ .subscribe((info) => {
12
+ info += '<style>body { background: transparent; }</style>';
13
+ const doc = this.iframe.nativeElement.contentDocument || this.iframe.nativeElement.contentWindow;
14
+ doc.open();
15
+ doc.write(info);
16
+ doc.close();
17
+ const scrollHeight = (this.iframe.nativeElement.contentWindow.document.documentElement.scrollHeight + 100);
18
+ this.iframe.nativeElement.style.height = `${scrollHeight}px`;
19
+ });
20
+ }
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
22
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InfoComponent, selector: "fs-system-info", inputs: { load: "load" }, viewQueries: [{ propertyName: "iframe", first: true, predicate: ["iframe"], descendants: true }], ngImport: i0, template: "<iframe #iframe></iframe>\n", styles: ["iframe{width:100%;border:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InfoComponent, decorators: [{
25
+ type: Component,
26
+ args: [{ selector: 'fs-system-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<iframe #iframe></iframe>\n", styles: ["iframe{width:100%;border:0}\n"] }]
27
+ }], propDecorators: { iframe: [{
28
+ type: ViewChild,
29
+ args: ['iframe']
30
+ }], load: [{
31
+ type: Input
32
+ }] } });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvaW5mby9pbmZvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9pbmZvL2luZm8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBVWpILE1BQU0sT0FBTyxhQUFhO0lBR2pCLE1BQU0sQ0FBYTtJQUVWLElBQUksQ0FBd0I7SUFFNUMsZUFBZTtRQUNiLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFTyxLQUFLO1FBQ1gsSUFBSSxDQUFDLElBQUksRUFBRTthQUNWLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBRWxCLElBQUksSUFBSSxrREFBa0QsQ0FBQztZQUUzRCxNQUFNLEdBQUcsR0FBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDO1lBQ2xHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNYLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1osTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDM0csSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLFlBQVksSUFBSSxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F4QlUsYUFBYTs0RkFBYixhQUFhLGtMQ1YxQiw2QkFDQTs7NEZEU2EsYUFBYTtrQkFOekIsU0FBUzsrQkFDRSxnQkFBZ0IsbUJBR1QsdUJBQXVCLENBQUMsTUFBTTs4QkFLeEMsTUFBTTtzQkFEWixTQUFTO3VCQUFDLFFBQVE7Z0JBR0gsSUFBSTtzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksICBJbnB1dCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtc3lzdGVtLWluZm8nLFxuICB0ZW1wbGF0ZVVybDogJ2luZm8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsgJ2luZm8uY29tcG9uZW50LnNjc3MnIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBJbmZvQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQFZpZXdDaGlsZCgnaWZyYW1lJykgXG4gIHB1YmxpYyBpZnJhbWU6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgcHVibGljIGxvYWQ6ICgpID0+IE9ic2VydmFibGU8YW55PjtcblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5fbG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZCgpIHtcbiAgICB0aGlzLmxvYWQoKVxuICAgIC5zdWJzY3JpYmUoKGluZm8pID0+IHtcblxuICAgICAgaW5mbyArPSAnPHN0eWxlPmJvZHkgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfTwvc3R5bGU+JztcblxuICAgICAgY29uc3QgZG9jID0gIHRoaXMuaWZyYW1lLm5hdGl2ZUVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IHRoaXMuaWZyYW1lLm5hdGl2ZUVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgIGRvYy5vcGVuKCk7XG4gICAgICBkb2Mud3JpdGUoaW5mbyk7XG4gICAgICBkb2MuY2xvc2UoKTtcbiAgICAgIGNvbnN0IHNjcm9sbEhlaWdodCA9ICh0aGlzLmlmcmFtZS5uYXRpdmVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCArIDEwMCk7XG4gICAgICB0aGlzLmlmcmFtZS5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3Njcm9sbEhlaWdodH1weGA7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxpZnJhbWUgI2lmcmFtZT48L2lmcmFtZT5cbiJdfQ==