@seniorsistemas/tmsx-angular-components 0.0.0-beta-ac3b5dbe

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 (39) hide show
  1. package/commons/field-type/field-type.d.ts +76 -0
  2. package/commons/field-type/index.d.ts +1 -0
  3. package/commons/index.d.ts +1 -0
  4. package/components/grid-editable-nested/grid-editable-nested.component.d.ts +81 -0
  5. package/components/grid-editable-nested/grid-editable-nested.module.d.ts +33 -0
  6. package/components/grid-editable-nested/grid.interface.d.ts +43 -0
  7. package/components/grid-editable-nested/index.d.ts +2 -0
  8. package/components/index.d.ts +2 -0
  9. package/components/painel-processamento/index.d.ts +2 -0
  10. package/components/painel-processamento/painel-processamento.component.d.ts +43 -0
  11. package/components/painel-processamento/painel-processamento.module.d.ts +15 -0
  12. package/components/painel-processamento/processamento.d.ts +24 -0
  13. package/esm2022/commons/field-type/field-type.mjs +76 -0
  14. package/esm2022/commons/field-type/index.mjs +2 -0
  15. package/esm2022/commons/index.mjs +2 -0
  16. package/esm2022/components/grid-editable-nested/grid-editable-nested.component.mjs +261 -0
  17. package/esm2022/components/grid-editable-nested/grid-editable-nested.module.mjs +133 -0
  18. package/esm2022/components/grid-editable-nested/grid.interface.mjs +9 -0
  19. package/esm2022/components/grid-editable-nested/index.mjs +3 -0
  20. package/esm2022/components/index.mjs +3 -0
  21. package/esm2022/components/painel-processamento/index.mjs +3 -0
  22. package/esm2022/components/painel-processamento/painel-processamento.component.mjs +226 -0
  23. package/esm2022/components/painel-processamento/painel-processamento.module.mjs +53 -0
  24. package/esm2022/components/painel-processamento/processamento.mjs +14 -0
  25. package/esm2022/locale/fallback.mjs +39 -0
  26. package/esm2022/public-api.mjs +6 -0
  27. package/esm2022/seniorsistemas-tmsx-angular-components.mjs +5 -0
  28. package/esm2022/tmsx-angular-components.module.mjs +24 -0
  29. package/esm2022/utils/index.mjs +2 -0
  30. package/esm2022/utils/services/utils.service.mjs +192 -0
  31. package/fesm2022/seniorsistemas-tmsx-angular-components.mjs +992 -0
  32. package/fesm2022/seniorsistemas-tmsx-angular-components.mjs.map +1 -0
  33. package/index.d.ts +5 -0
  34. package/locale/fallback.d.ts +1 -0
  35. package/package.json +21 -0
  36. package/public-api.d.ts +5 -0
  37. package/tmsx-angular-components.module.d.ts +13 -0
  38. package/utils/index.d.ts +1 -0
  39. package/utils/services/utils.service.d.ts +35 -0
@@ -0,0 +1,192 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@ngx-translate/core";
4
+ import * as i2 from "@seniorsistemas/angular-components/locale";
5
+ export class UtilsService {
6
+ translate;
7
+ dataPipe;
8
+ constructor(translate, dataPipe) {
9
+ this.translate = translate;
10
+ this.dataPipe = dataPipe;
11
+ }
12
+ getAuditCreatedBy(createdBy, createdDate) {
13
+ if (!createdBy || !createdDate) {
14
+ return '';
15
+ }
16
+ let date = '';
17
+ this.dataPipe.transform(createdDate).subscribe((item) => date = item.split(' '));
18
+ return this.translate.instant('tmsx_fnd.tmsx_angular_components.audit_created_by', { nome: createdBy, data: date[0], hora: date[1] });
19
+ }
20
+ getAuditModifiedBy(modifiedBy, modifiedDate) {
21
+ if (!modifiedBy || !modifiedDate) {
22
+ return '';
23
+ }
24
+ let date = '';
25
+ this.dataPipe.transform(modifiedDate).subscribe((item) => date = item.split(' '));
26
+ return this.translate.instant('tmsx_fnd.tmsx_angular_components.audit_modified_by', { nome: modifiedBy, data: date[0], hora: date[1] });
27
+ }
28
+ getAuditInactivatedBy(inactivatedBy, inactivatedDate) {
29
+ if (!inactivatedBy || !inactivatedDate) {
30
+ return '';
31
+ }
32
+ let date = '';
33
+ this.dataPipe.transform(inactivatedDate).subscribe((item) => date = item.split(' '));
34
+ return this.translate.instant('tmsx_fnd.tmsx_angular_components.audit_inactivated_by', { nome: inactivatedBy, data: date[0], hora: date[1] });
35
+ }
36
+ /* usage: [innerHTML]="getProp(rowData, 'nome')" */
37
+ getProp(obj, path, type) {
38
+ let value = path.split('.').reduce((result, prop) => (result[prop] === undefined ? '' : result[prop]), obj);
39
+ if (value || value === 0) {
40
+ if (type) {
41
+ value = this.formatType(value, type);
42
+ }
43
+ return `<span>${value}</span>`;
44
+ }
45
+ return `<span class="empty-grid">${this.translate.instant('tmsx_fnd.tmsx_angular_components.list_grid_empty_field')}</span>`;
46
+ }
47
+ formatType(value, type) {
48
+ if (value) {
49
+ if (type === 'date') {
50
+ let date = '';
51
+ this.dataPipe.transform(value).subscribe((item) => date = item.split(' '));
52
+ return date[0];
53
+ }
54
+ if (type === 'datetime') {
55
+ let date = '';
56
+ this.dataPipe.transform(value).subscribe((item) => date = item);
57
+ return date;
58
+ }
59
+ if (type === 'decimal') {
60
+ if (typeof value === 'string') {
61
+ value = Number(value);
62
+ }
63
+ return value.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
64
+ }
65
+ if (type === 'currency') {
66
+ return value.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' });
67
+ }
68
+ if (type === 'cep') {
69
+ return value.replace(/^(\d{2})(\d{3})(\d{3})/, '$1.$2-$3');
70
+ }
71
+ }
72
+ return value;
73
+ }
74
+ /* usage: [ngClass]="emptyGridClass(value)" */
75
+ emptyGridClass(value) {
76
+ if (!value || value === this.translate.instant('tmsx_fnd.replicacao.list_grid_empty_field')) {
77
+ return 'empty-grid';
78
+ }
79
+ return '';
80
+ }
81
+ infoContent(entity) {
82
+ let text = '';
83
+ if (!entity) {
84
+ return this.translate.instant("tmsx_fnd.tmsx_angular_components.condicao_valor_lookup_condicional_no_audit");
85
+ }
86
+ text += this.getAuditCreatedBy(entity.createdBy, entity.createdDate);
87
+ if (text) {
88
+ text += '\n';
89
+ }
90
+ text += this.getAuditModifiedBy(entity.lastModifiedBy, entity.lastModifiedDate);
91
+ return text;
92
+ }
93
+ formatCurrency(value) {
94
+ return value.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' });
95
+ }
96
+ getAtivoTokenLabel(formField, value, translate) {
97
+ const { name, type, label } = formField;
98
+ if (type === 'radio') {
99
+ const labelValue = value
100
+ ? translate.instant('tmsx_fnd.tmsx_angular_components.situacao_ativo_true')
101
+ : translate.instant('tmsx_fnd.tmsx_angular_components.situacao_ativo_false');
102
+ return { id: name, label: `${label}: ${labelValue}` };
103
+ }
104
+ return this.createFilterTokens(formField, value, translate);
105
+ }
106
+ getUtilsProp(obj, path) {
107
+ return path.split('.').reduce((result, prop) => (result[prop] === undefined ? '' : result[prop]), obj);
108
+ }
109
+ createFilterTokens(formField, value, translate) {
110
+ const { name, type, label, searchFields, options } = formField;
111
+ const labelValue = this.getLabelValueByType(type, value, searchFields, options, translate);
112
+ return { id: name, label: `${label}: ${labelValue}` };
113
+ }
114
+ getLabelValueByType(type, value, searchFields, options, translate) {
115
+ switch (type) {
116
+ case 'date':
117
+ return this.getDateLabel(value);
118
+ case 'time':
119
+ return this.getTimeFromDate(value);
120
+ case 'localdatetime':
121
+ case 'datetime':
122
+ return this.getDateTimeFromDate(value);
123
+ case 'lookup':
124
+ return this.getLookupLabel(value, searchFields);
125
+ case 'enum':
126
+ return this.getEnumLabel(value, options);
127
+ case 'boolean':
128
+ return this.getBooleanLabel(value, translate);
129
+ default:
130
+ return value;
131
+ }
132
+ }
133
+ getDateLabel(value) {
134
+ const dateObj = value instanceof Date ? value : new Date(value);
135
+ return !isNaN(dateObj.getTime()) ? dateObj.toLocaleDateString('pt-BR') : value;
136
+ }
137
+ getLookupLabel(value, searchFields) {
138
+ return searchFields.map((field) => this.getUtilsProp(value, field.name)).join(' - ');
139
+ }
140
+ getEnumLabel(value, options) {
141
+ const option = options.find((opt) => opt.value === value);
142
+ return option ? option.label : value;
143
+ }
144
+ getBooleanLabel(value, translate) {
145
+ return value
146
+ ? translate.instant('tmsx_fnd.tmsx_angular_components.list_grid_boolean_true')
147
+ : translate.instant('tmsx_fnd.tmsx_angular_components.list_grid_boolean_false');
148
+ }
149
+ getTimeFromDate(value) {
150
+ let dateObj;
151
+ if (typeof value === 'string' && /^\d{2}:\d{2}(:\d{2})?$/.test(value)) {
152
+ const [h, m, s = '00'] = value.split(':');
153
+ dateObj = new Date();
154
+ dateObj.setHours(+h, +m, +s, 0);
155
+ }
156
+ else {
157
+ dateObj = value instanceof Date ? value : new Date(value);
158
+ }
159
+ if (!isNaN(dateObj.getTime())) {
160
+ return dateObj.toLocaleTimeString('pt-BR', {
161
+ hour: '2-digit',
162
+ minute: '2-digit',
163
+ second: '2-digit',
164
+ hour12: false
165
+ }); // HH:mm:ss
166
+ }
167
+ return value;
168
+ }
169
+ getDateTimeFromDate(value) {
170
+ const dateObj = value instanceof Date ? value : new Date(value);
171
+ if (!isNaN(dateObj.getTime())) {
172
+ const datePart = dateObj.toLocaleDateString('pt-BR'); // DD/MM/AAAA
173
+ const timePart = dateObj.toLocaleTimeString('pt-BR', {
174
+ hour: '2-digit',
175
+ minute: '2-digit',
176
+ second: '2-digit',
177
+ hour12: false
178
+ }); // HH:mm:ss
179
+ return `${datePart} ${timePart}`;
180
+ }
181
+ return value;
182
+ }
183
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UtilsService, deps: [{ token: i1.TranslateService }, { token: i2.LocalizedDatePipe }], target: i0.ɵɵFactoryTarget.Injectable });
184
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UtilsService, providedIn: 'root' });
185
+ }
186
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UtilsService, decorators: [{
187
+ type: Injectable,
188
+ args: [{
189
+ providedIn: 'root'
190
+ }]
191
+ }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.LocalizedDatePipe }] });
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9zcmMvdXRpbHMvc2VydmljZXMvdXRpbHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBUTNDLE1BQU0sT0FBTyxZQUFZO0lBR0E7SUFDQTtJQUZyQixZQUNxQixTQUEyQixFQUMzQixRQUEyQjtRQUQzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixhQUFRLEdBQVIsUUFBUSxDQUFtQjtJQUM1QyxDQUFDO0lBRUUsaUJBQWlCLENBQUMsU0FBaUIsRUFBRSxXQUFpQjtRQUN6RCxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDL0IsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsbURBQW1ELEVBQUUsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUVNLGtCQUFrQixDQUFDLFVBQWtCLEVBQUUsWUFBa0I7UUFDNUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztR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LE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUNuRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFO2dCQUNuRCxJQUFJLEVBQUUsU0FBUztnQkFDZixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxLQUFLO2FBQ2QsQ0FBQyxDQUFDLENBQUMsV0FBVztZQUNmLE9BQU8sR0FBRyxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7d0dBdk1RLFlBQVk7NEdBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvZHluYW1pYy1mb3JtJztcbmltcG9ydCB7IExvY2FsaXplZERhdGVQaXBlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9sb2NhbGUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBVdGlsc1NlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGFQaXBlOiBMb2NhbGl6ZWREYXRlUGlwZVxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgZ2V0QXVkaXRDcmVhdGVkQnkoY3JlYXRlZEJ5OiBzdHJpbmcsIGNyZWF0ZWREYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFjcmVhdGVkQnkgfHwgIWNyZWF0ZWREYXRlKSB7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkYXRlID0gJyc7XG4gICAgICAgIHRoaXMuZGF0YVBpcGUudHJhbnNmb3JtKGNyZWF0ZWREYXRlKS5zdWJzY3JpYmUoKGl0ZW06IGFueSkgPT4gZGF0ZSA9IGl0ZW0uc3BsaXQoJyAnKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd0bXN4X2ZuZC50bXN4X2FuZ3VsYXJfY29tcG9uZW50cy5hdWRpdF9jcmVhdGVkX2J5Jywge25vbWU6IGNyZWF0ZWRCeSwgZGF0YTogZGF0ZVswXSwgaG9yYTogZGF0ZVsxXX0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBdWRpdE1vZGlmaWVkQnkobW9kaWZpZWRCeTogc3RyaW5nLCBtb2RpZmllZERhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIW1vZGlmaWVkQnkgfHwgIW1vZGlmaWVkRGF0ZSkge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGF0ZSA9ICcnO1xuICAgICAgICB0aGlzLmRhdGFQaXBlLnRyYW5zZm9ybShtb2RpZmllZERhdGUpLnN1YnNjcmliZSgoaXRlbTogYW55KSA9PiBkYXRlID0gaXRlbS5zcGxpdCgnICcpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3Rtc3hfZm5kLnRtc3hfYW5ndWxhcl9jb21wb25lbnRzLmF1ZGl0X21vZGlmaWVkX2J5Jywge25vbWU6IG1vZGlmaWVkQnksIGRhdGE6IGRhdGVbMF0sIGhvcmE6IGRhdGVbMV19KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXVkaXRJbmFjdGl2YXRlZEJ5KGluYWN0aXZhdGVkQnk6IHN0cmluZywgaW5hY3RpdmF0ZWREYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFpbmFjdGl2YXRlZEJ5IHx8ICFpbmFjdGl2YXRlZERhdGUpIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRhdGUgPSAnJztcbiAgICAgICAgdGhpcy5kYXRhUGlwZS50cmFuc2Zvcm0oaW5hY3RpdmF0ZWREYXRlKS5zdWJzY3JpYmUoKGl0ZW06IGFueSkgPT4gZGF0ZSA9IGl0ZW0uc3BsaXQoJyAnKSk7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd0bXN4X2ZuZC50bXN4X2FuZ3VsYXJfY29tcG9uZW50cy5hdWRpdF9pbmFjdGl2YXRlZF9ieScsIHtub21lOiBpbmFjdGl2YXRlZEJ5LCBkYXRhOiBkYXRlWzBdLCBob3JhOiBkYXRlWzFdfSk7XG4gICAgfVxuXG4gICAgLyogdXNhZ2U6IFtpbm5lckhUTUxdPVwiZ2V0UHJvcChyb3dEYXRhLCAnbm9tZScpXCIgKi9cbiAgICBwdWJsaWMgZ2V0UHJvcChvYmo6IGFueSwgcGF0aDogYW55LCB0eXBlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHZhbHVlID0gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgocmVzdWx0OiBhbnksIHByb3A6IGFueSkgPT4gKHJlc3VsdFtwcm9wXSA9PT0gdW5kZWZpbmVkID8gJycgOiByZXN1bHRbcHJvcF0pLCBvYmopO1xuICAgICAgICBpZiAodmFsdWUgfHwgdmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdFR5cGUodmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGA8c3Bhbj4ke3ZhbHVlfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9XCJlbXB0eS1ncmlkXCI+JHt0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd0bXN4X2ZuZC50bXN4X2FuZ3VsYXJfY29tcG9uZW50cy5saXN0X2dyaWRfZW1wdHlfZmllbGQnKX08L3NwYW4+YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0VHlwZSh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnZGF0ZScpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVBpcGUudHJhbnNmb3JtKHZhbHVlKS5zdWJzY3JpYmUoKGl0ZW06IGFueSkgPT4gZGF0ZSA9IGl0ZW0uc3BsaXQoJyAnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGVbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgICAgIGxldCBkYXRlID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhUGlwZS50cmFuc2Zvcm0odmFsdWUpLnN1YnNjcmliZSgoaXRlbTogYW55KSA9PiBkYXRlID0gaXRlbSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2RlY2ltYWwnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9Mb2NhbGVTdHJpbmcoJ3B0LUJSJywgeyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDIsIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnY3VycmVuY3knKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvTG9jYWxlU3RyaW5nKCdwdC1CUicsIHsgc3R5bGU6ICdjdXJyZW5jeScsIGN1cnJlbmN5OiAnQlJMJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnY2VwJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9eKFxcZHsyfSkoXFxkezN9KShcXGR7M30pLywgJyQxLiQyLSQzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qIHVzYWdlOiBbbmdDbGFzc109XCJlbXB0eUdyaWRDbGFzcyh2YWx1ZSlcIiAqL1xuICAgIHB1YmxpYyBlbXB0eUdyaWRDbGFzcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZSA9PT0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgndG1zeF9mbmQucmVwbGljYWNhby5saXN0X2dyaWRfZW1wdHlfZmllbGQnKSkge1xuICAgICAgICAgICAgcmV0dXJuICdlbXB0eS1ncmlkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHVibGljIGluZm9Db250ZW50KGVudGl0eT86IGFueSkge1xuICAgICAgICBsZXQgdGV4dCA9ICcnO1xuICAgICAgICBpZiAoIWVudGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJ0bXN4X2ZuZC50bXN4X2FuZ3VsYXJfY29tcG9uZW50cy5jb25kaWNhb192YWxvcl9sb29rdXBfY29uZGljaW9uYWxfbm9fYXVkaXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dCArPSB0aGlzLmdldEF1ZGl0Q3JlYXRlZEJ5KGVudGl0eS5jcmVhdGVkQnksIGVudGl0eS5jcmVhdGVkRGF0ZSk7XG4gICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgdGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB0ZXh0ICs9IHRoaXMuZ2V0QXVkaXRNb2RpZmllZEJ5KGVudGl0eS5sYXN0TW9kaWZpZWRCeSwgZW50aXR5Lmxhc3RNb2RpZmllZERhdGUpO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0Q3VycmVuY3kodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b0xvY2FsZVN0cmluZygncHQtQlInLCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogJ0JSTCcgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEF0aXZvVG9rZW5MYWJlbChmb3JtRmllbGQ6IEZpZWxkQ29uZmlnLCB2YWx1ZTogYW55LCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCB0eXBlLCBsYWJlbCB9ID0gZm9ybUZpZWxkIGFzIGFueTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsVmFsdWUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgID8gdHJhbnNsYXRlLmluc3RhbnQoJ3Rtc3hfZm5kLnRtc3hfYW5ndWxhcl9jb21wb25lbnRzLnNpdHVhY2FvX2F0aXZvX3RydWUnKVxuICAgICAgICAgICAgICAgIDogdHJhbnNsYXRlLmluc3RhbnQoJ3Rtc3hfZm5kLnRtc3hfYW5ndWxhcl9jb21wb25lbnRzLnNpdHVhY2FvX2F0aXZvX2ZhbHNlJyk7XG4gICAgICAgICAgICByZXR1cm4geyBpZDogbmFtZSwgbGFiZWw6IGAke2xhYmVsfTogJHtsYWJlbFZhbHVlfWAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGaWx0ZXJUb2tlbnMoZm9ybUZpZWxkLCB2YWx1ZSwgdHJhbnNsYXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VXRpbHNQcm9wKG9iajogYW55LCBwYXRoOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKHJlc3VsdDogYW55LCBwcm9wOiBhbnkpID0+IChyZXN1bHRbcHJvcF0gPT09IHVuZGVmaW5lZCA/ICcnIDogcmVzdWx0W3Byb3BdKSwgb2JqKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlRmlsdGVyVG9rZW5zKGZvcm1GaWVsZDogRmllbGRDb25maWcsIHZhbHVlOiBhbnksIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkge1xuICAgICAgY29uc3QgeyBuYW1lLCB0eXBlLCBsYWJlbCwgc2VhcmNoRmllbGRzLCBvcHRpb25zIH0gPSBmb3JtRmllbGQgYXMgYW55O1xuICAgICAgY29uc3QgbGFiZWxWYWx1ZSA9IHRoaXMuZ2V0TGFiZWxWYWx1ZUJ5VHlwZSh0eXBlLCB2YWx1ZSwgc2VhcmNoRmllbGRzLCBvcHRpb25zLCB0cmFuc2xhdGUpO1xuICAgICAgcmV0dXJuIHsgaWQ6IG5hbWUsIGxhYmVsOiBgJHtsYWJlbH06ICR7bGFiZWxWYWx1ZX1gIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRMYWJlbFZhbHVlQnlUeXBlKFxuICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgdmFsdWU6IGFueSxcbiAgICAgIHNlYXJjaEZpZWxkczogRmllbGRDb25maWdbXSxcbiAgICAgIG9wdGlvbnM6IFNlbGVjdE9wdGlvbltdLFxuICAgICAgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRlTGFiZWwodmFsdWUpO1xuICAgICAgICBjYXNlICd0aW1lJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUaW1lRnJvbURhdGUodmFsdWUpO1xuICAgICAgICBjYXNlICdsb2NhbGRhdGV0aW1lJzpcbiAgICAgICAgY2FzZSAnZGF0ZXRpbWUnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGVUaW1lRnJvbURhdGUodmFsdWUpO1xuICAgICAgICBjYXNlICdsb29rdXAnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldExvb2t1cExhYmVsKHZhbHVlLCBzZWFyY2hGaWVsZHMpO1xuICAgICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRFbnVtTGFiZWwodmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuTGFiZWwodmFsdWUsIHRyYW5zbGF0ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0ZUxhYmVsKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgICAgY29uc3QgZGF0ZU9iaiA9IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IHZhbHVlIDogbmV3IERhdGUodmFsdWUpO1xuICAgICAgcmV0dXJuICFpc05hTihkYXRlT2JqLmdldFRpbWUoKSkgPyBkYXRlT2JqLnRvTG9jYWxlRGF0ZVN0cmluZygncHQtQlInKSA6IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TG9va3VwTGFiZWwodmFsdWU6IGFueSwgc2VhcmNoRmllbGRzOiBGaWVsZENvbmZpZ1tdKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBzZWFyY2hGaWVsZHMubWFwKChmaWVsZDogRmllbGRDb25maWcpID0+IHRoaXMuZ2V0VXRpbHNQcm9wKHZhbHVlLCBmaWVsZC5uYW1lKSkuam9pbignIC0gJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFbnVtTGFiZWwodmFsdWU6IGFueSwgb3B0aW9uczogU2VsZWN0T3B0aW9uW10pOiBzdHJpbmcge1xuICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChvcHQ6IFNlbGVjdE9wdGlvbikgPT4gb3B0LnZhbHVlID09PSB2YWx1ZSk7XG4gICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uLmxhYmVsIDogdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCb29sZWFuTGFiZWwodmFsdWU6IGFueSwgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgPyB0cmFuc2xhdGUuaW5zdGFudCgndG1zeF9mbmQudG1zeF9hbmd1bGFyX2NvbXBvbmVudHMubGlzdF9ncmlkX2Jvb2xlYW5fdHJ1ZScpXG4gICAgICAgICAgICA6IHRyYW5zbGF0ZS5pbnN0YW50KCd0bXN4X2ZuZC50bXN4X2FuZ3VsYXJfY29tcG9uZW50cy5saXN0X2dyaWRfYm9vbGVhbl9mYWxzZScpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUaW1lRnJvbURhdGUodmFsdWU6IGFueSkge1xuICAgICAgIGxldCBkYXRlT2JqOiBEYXRlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAvXlxcZHsyfTpcXGR7Mn0oOlxcZHsyfSk/JC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBbaCwgbSwgcyA9ICcwMCddID0gdmFsdWUuc3BsaXQoJzonKTtcbiAgICAgICAgICBkYXRlT2JqID0gbmV3IERhdGUoKTtcbiAgICAgICAgICBkYXRlT2JqLnNldEhvdXJzKCtoLCArbSwgK3MsIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGVPYmogPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzTmFOKGRhdGVPYmouZ2V0VGltZSgpKSkge1xuICAgICAgICAgIHJldHVybiBkYXRlT2JqLnRvTG9jYWxlVGltZVN0cmluZygncHQtQlInLCB7XG4gICAgICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgICAgICAgICAgaG91cjEyOiBmYWxzZVxuICAgICAgICAgIH0pOyAvLyBISDptbTpzc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGF0ZVRpbWVGcm9tRGF0ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGRhdGVPYmogPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgaWYgKCFpc05hTihkYXRlT2JqLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXRlUGFydCA9IGRhdGVPYmoudG9Mb2NhbGVEYXRlU3RyaW5nKCdwdC1CUicpOyAvLyBERC9NTS9BQUFBXG4gICAgICAgICAgY29uc3QgdGltZVBhcnQgPSBkYXRlT2JqLnRvTG9jYWxlVGltZVN0cmluZygncHQtQlInLCB7XG4gICAgICAgICAgICBob3VyOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICBtaW51dGU6ICcyLWRpZ2l0JyxcbiAgICAgICAgICAgIHNlY29uZDogJzItZGlnaXQnLFxuICAgICAgICAgICAgaG91cjEyOiBmYWxzZVxuICAgICAgICAgIH0pOyAvLyBISDptbTpzc1xuICAgICAgICAgIHJldHVybiBgJHtkYXRlUGFydH0gJHt0aW1lUGFydH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG59XG4iXX0=