@smartbit4all/ng-client 4.2.113 → 4.2.115

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 (34) hide show
  1. package/esm2022/lib/smart-client/smart-component-api-client.mjs +34 -2
  2. package/esm2022/lib/smart-form/api/model/fileUploaderProperties.mjs +2 -0
  3. package/esm2022/lib/smart-form/api/model/models.mjs +2 -1
  4. package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +2 -5
  5. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +126 -29
  6. package/esm2022/lib/smart-form/smartform.form-model.mjs +1 -1
  7. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +18 -13
  8. package/esm2022/lib/view-context/projects.mjs +4 -3
  9. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +198 -0
  10. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.mjs +118 -0
  11. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +186 -0
  12. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +15 -104
  13. package/esm2022/lib/view-context/smart-view-context.module.mjs +18 -13
  14. package/esm2022/lib/view-context/smart-view-context.service.mjs +2 -2
  15. package/fesm2022/smartbit4all-ng-client.mjs +1178 -1024
  16. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  17. package/lib/smart-client/smart-component-api-client.d.ts +2 -0
  18. package/lib/smart-form/api/model/fileUploaderProperties.d.ts +17 -0
  19. package/lib/smart-form/api/model/models.d.ts +1 -0
  20. package/lib/smart-form/smartfileuploader/smartfileuploader.component.d.ts +15 -2
  21. package/lib/smart-form/smartform.form-model.d.ts +2 -2
  22. package/lib/smart-form/widgets/smartformwidget/smartformwidget.component.d.ts +10 -2
  23. package/lib/view-context/projects.d.ts +3 -2
  24. package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.d.ts +38 -0
  25. package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.d.ts +2 -19
  26. package/lib/view-context/smart-view-context.module.d.ts +50 -49
  27. package/lib/view-context/smart-view-context.service.d.ts +1 -1
  28. package/package.json +1 -1
  29. package/smartbit4all-ng-client-4.2.115.tgz +0 -0
  30. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/photo-capture-widget/photo-capture-widget.component.mjs +0 -198
  31. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/voice-record-widget/voice-record-widget.component.mjs +0 -186
  32. package/smartbit4all-ng-client-4.2.113.tgz +0 -0
  33. /package/lib/view-context/smart-ui-action/{dialogs/ui-action-file-upload-dialog → components/upload-widget}/photo-capture-widget/photo-capture-widget.component.d.ts +0 -0
  34. /package/lib/view-context/smart-ui-action/{dialogs/ui-action-file-upload-dialog → components/upload-widget}/voice-record-widget/voice-record-widget.component.d.ts +0 -0
@@ -0,0 +1,186 @@
1
+ import { Component, ViewChild, Inject, Optional, EventEmitter, Output, } from '@angular/core';
2
+ import WaveSurfer from 'wavesurfer.js';
3
+ import RecordPlugin from 'wavesurfer.js/dist/plugins/record.js';
4
+ import { COMPONENT_LIBRARY, ComponentLibrary } from '../../../../utility/componentLibrary';
5
+ import { IconPosition, UiActionButtonType } from '../../../../api';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "../../../ui-action-button/ui-action-button.component";
9
+ import * as i3 from "../../../../utility/componentLibrary";
10
+ export class VoiceRecordWidgetComponent {
11
+ constructor(compLib) {
12
+ this.recordingSaved = new EventEmitter();
13
+ this.componentLibrary = ComponentLibrary;
14
+ this.isRecording = false;
15
+ this.recordedBlob = null;
16
+ this.time = '00:00';
17
+ this.isPlaying = false;
18
+ this.micButton = {
19
+ title: '',
20
+ type: UiActionButtonType.ICON,
21
+ icon: 'microphone',
22
+ iconPosition: IconPosition.PRE,
23
+ color: 'primary',
24
+ };
25
+ this.stopButton = {
26
+ title: '',
27
+ type: UiActionButtonType.ICON,
28
+ icon: 'stop-circle',
29
+ iconPosition: IconPosition.PRE,
30
+ iconColor: 'red',
31
+ color: 'primary',
32
+ };
33
+ this.saveButton = {
34
+ title: '',
35
+ type: UiActionButtonType.ICON,
36
+ icon: 'save',
37
+ iconPosition: IconPosition.PRE,
38
+ color: 'primary',
39
+ };
40
+ this.compLib = compLib ?? ComponentLibrary.PRIMENG;
41
+ }
42
+ ngOnInit() {
43
+ this.playButton = {
44
+ title: '',
45
+ type: UiActionButtonType.ICON,
46
+ icon: this.compLib === ComponentLibrary.PRIMENG ? 'play-circle' : 'play_circle',
47
+ iconPosition: IconPosition.PRE,
48
+ color: 'primary',
49
+ };
50
+ this.stopPlaybackButton = {
51
+ title: '',
52
+ type: UiActionButtonType.ICON,
53
+ icon: this.compLib === ComponentLibrary.PRIMENG ? 'stop-circle' : 'stop_circle',
54
+ iconPosition: IconPosition.PRE,
55
+ color: 'red',
56
+ };
57
+ }
58
+ ngAfterViewInit() {
59
+ let body = document.querySelector('body');
60
+ let primaryColor = getComputedStyle(body).getPropertyValue('--primary-color').trim();
61
+ this.wavesurfer = WaveSurfer.create({
62
+ container: this.waveformRef.nativeElement,
63
+ waveColor: primaryColor,
64
+ progressColor: this.addAlphaToColor(primaryColor, 0.5),
65
+ height: 45,
66
+ barWidth: 5,
67
+ barGap: 1,
68
+ barRadius: 5,
69
+ plugins: [
70
+ RecordPlugin.create({
71
+ renderRecordedAudio: true,
72
+ scrollingWaveform: true,
73
+ mimeType: 'audio/webm',
74
+ }),
75
+ ],
76
+ });
77
+ this.wavesurfer.setVolume(1);
78
+ this.record = this.wavesurfer.registerPlugin(RecordPlugin.create({
79
+ renderRecordedAudio: true,
80
+ scrollingWaveform: true,
81
+ continuousWaveform: false,
82
+ continuousWaveformDuration: 15,
83
+ }));
84
+ this.wavesurfer.on('dblclick', () => {
85
+ this.wavesurfer.play();
86
+ this.isPlaying = true;
87
+ });
88
+ this.record.on('record-end', (blob) => {
89
+ this.recordedBlob = blob;
90
+ });
91
+ this.record.on('record-progress', (time) => {
92
+ this.updateProgress(time);
93
+ });
94
+ this.wavesurfer.on('finish', () => {
95
+ this.isPlaying = false;
96
+ });
97
+ }
98
+ async startRecording() {
99
+ const confirmed = await this.checkHasRecorded();
100
+ if (!confirmed)
101
+ return;
102
+ if (this.record && !this.isRecording) {
103
+ this.record.startRecording();
104
+ this.isRecording = true;
105
+ }
106
+ }
107
+ async checkHasRecorded() {
108
+ if (this.recordedBlob) {
109
+ }
110
+ return true;
111
+ }
112
+ updateProgress(time) {
113
+ let formattedTime = [Math.floor((time % 3600000) / 60000), Math.floor((time % 60000) / 1000)]
114
+ .map((v) => (v < 10 ? '0' + v : v))
115
+ .join(':');
116
+ this.time = formattedTime;
117
+ }
118
+ stopRecording() {
119
+ if (this.record && this.isRecording) {
120
+ this.record.stopRecording();
121
+ this.isRecording = false;
122
+ }
123
+ }
124
+ saveRecording() {
125
+ if (this.recordedBlob) {
126
+ const now = new Date();
127
+ const formattedDate = now.toLocaleString('sv-SE').replace(' ', '_').replace(/:/g, '-');
128
+ const fileName = `recording_${formattedDate}.webm`;
129
+ const file = new File([this.recordedBlob], fileName, { type: 'audio/webm' });
130
+ this.recordingSaved.emit(file);
131
+ this.recordedBlob = null;
132
+ this.time = '00:00';
133
+ this.isPlaying = false;
134
+ this.wavesurfer.empty();
135
+ }
136
+ }
137
+ replayRecording() {
138
+ if (this.recordedBlob) {
139
+ this.isPlaying = !this.isPlaying;
140
+ this.wavesurfer.playPause();
141
+ }
142
+ }
143
+ ngOnDestroy() {
144
+ if (this.wavesurfer) {
145
+ this.wavesurfer.destroy();
146
+ }
147
+ }
148
+ addAlphaToColor(hexColor, alpha) {
149
+ if (/^#([a-f\d])([a-f\d])([a-f\d])$/i.test(hexColor)) {
150
+ hexColor = hexColor.replace(/^#([a-f\d])([a-f\d])([a-f\d])$/i, (_, r, g, b) => `#${r}${r}${g}${g}${b}${b}`);
151
+ }
152
+ const hexMatch = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexColor);
153
+ if (hexMatch) {
154
+ const [, r, g, b] = hexMatch;
155
+ return `rgba(${parseInt(r, 16)}, ${parseInt(g, 16)}, ${parseInt(b, 16)}, ${alpha})`;
156
+ }
157
+ const ctx = document.createElement('canvas').getContext('2d');
158
+ if (ctx) {
159
+ ctx.fillStyle = hexColor;
160
+ const parsed = ctx.fillStyle;
161
+ const rgbMatch = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/.exec(parsed);
162
+ if (rgbMatch) {
163
+ const [, r, g, b] = rgbMatch;
164
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
165
+ }
166
+ }
167
+ return hexColor;
168
+ }
169
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: VoiceRecordWidgetComponent, deps: [{ token: COMPONENT_LIBRARY, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
170
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: VoiceRecordWidgetComponent, selector: "voice-record-widget", outputs: { recordingSaved: "recordingSaved" }, viewQueries: [{ propertyName: "waveformRef", first: true, predicate: ["waveform"], descendants: true }], ngImport: i0, template: "<div class=\"recorderContainer\">\r\n <div class=\"recorderToolbar\">\r\n <!-- Start Recording -->\r\n <ui-action-button\r\n *ngIf=\"!isRecording\"\r\n [descriptor]=\"micButton\"\r\n (actionClick)=\"startRecording()\"\r\n >\r\n </ui-action-button>\r\n\r\n <!-- Stop Recording -->\r\n <ui-action-button *ngIf=\"isRecording\" [descriptor]=\"stopButton\" (actionClick)=\"stopRecording()\">\r\n </ui-action-button>\r\n\r\n <div class=\"progress\">{{ time }}</div>\r\n </div>\r\n <div class=\"waveform\" #waveform></div>\r\n <div class=\"endBar\">\r\n <!-- Save Recording -->\r\n <ui-action-button\r\n *ngIf=\"recordedBlob\"\r\n [descriptor]=\"saveButton\"\r\n (actionClick)=\"saveRecording()\"\r\n >\r\n </ui-action-button>\r\n\r\n <!-- Start Play -->\r\n <ui-action-button\r\n *ngIf=\"recordedBlob && !isPlaying\"\r\n [descriptor]=\"playButton\"\r\n (actionClick)=\"replayRecording()\"\r\n ></ui-action-button>\r\n\r\n <!-- Stop Play -->\r\n <ui-action-button\r\n *ngIf=\"recordedBlob && isPlaying\"\r\n [descriptor]=\"stopPlaybackButton\"\r\n (actionClick)=\"replayRecording()\"\r\n ></ui-action-button>\r\n </div>\r\n</div>\r\n", styles: [".recorderContainer{border:1px solid #dee2e6;background:#fff;border-radius:5px;display:flex;flex-direction:row;padding:.2rem;align-items:center}.waveform{flex:1;align-content:center;padding-right:1rem}.recorderToolbar{display:flex;flex-direction:row;gap:.2rem;padding:0 .5rem;align-items:center}.recorderToolbar ::ng-deep .p-button.p-button-icon-only{width:fit-content;padding:.2rem}.recorderToolbar ::ng-deep .mdc-button{min-width:unset;font-size:1.5rem;margin:unset}.recorderToolbar ::ng-deep .mat-mdc-button>.mat-icon{font-size:unset;width:unset;height:unset;padding:.2rem;margin:unset}.recorderToolbar ::ng-deep .p-button-text{background-color:transparent;border:unset;box-shadow:unset;padding:.2rem}.progress{align-content:center;font-size:1rem;height:100%;color:#6b7280}.recorderToolbar ::ng-deep .p-button-primary{color:var(--primary-color);border:unset}.endBar{display:flex;flex-direction:row;align-items:center;padding:unset;border-radius:5px;height:fit-content;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.endBar ::ng-deep button{background-color:transparent;border:unset;padding:.5rem;box-shadow:unset}.endBar ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.1)}.endBar>:first-child ::ng-deep button{border-radius:5px;border-top-right-radius:unset;border-bottom-right-radius:unset;border-right:1px solid #dee2e6;color:var(--primary-color)}.endBar>:last-child ::ng-deep button{border-radius:5px;border-top-left-radius:unset;border-bottom-left-radius:unset;color:var(--primary-color)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass"], outputs: ["actionClick", "actionDoubleClick"] }] }); }
171
+ }
172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: VoiceRecordWidgetComponent, decorators: [{
173
+ type: Component,
174
+ args: [{ selector: 'voice-record-widget', template: "<div class=\"recorderContainer\">\r\n <div class=\"recorderToolbar\">\r\n <!-- Start Recording -->\r\n <ui-action-button\r\n *ngIf=\"!isRecording\"\r\n [descriptor]=\"micButton\"\r\n (actionClick)=\"startRecording()\"\r\n >\r\n </ui-action-button>\r\n\r\n <!-- Stop Recording -->\r\n <ui-action-button *ngIf=\"isRecording\" [descriptor]=\"stopButton\" (actionClick)=\"stopRecording()\">\r\n </ui-action-button>\r\n\r\n <div class=\"progress\">{{ time }}</div>\r\n </div>\r\n <div class=\"waveform\" #waveform></div>\r\n <div class=\"endBar\">\r\n <!-- Save Recording -->\r\n <ui-action-button\r\n *ngIf=\"recordedBlob\"\r\n [descriptor]=\"saveButton\"\r\n (actionClick)=\"saveRecording()\"\r\n >\r\n </ui-action-button>\r\n\r\n <!-- Start Play -->\r\n <ui-action-button\r\n *ngIf=\"recordedBlob && !isPlaying\"\r\n [descriptor]=\"playButton\"\r\n (actionClick)=\"replayRecording()\"\r\n ></ui-action-button>\r\n\r\n <!-- Stop Play -->\r\n <ui-action-button\r\n *ngIf=\"recordedBlob && isPlaying\"\r\n [descriptor]=\"stopPlaybackButton\"\r\n (actionClick)=\"replayRecording()\"\r\n ></ui-action-button>\r\n </div>\r\n</div>\r\n", styles: [".recorderContainer{border:1px solid #dee2e6;background:#fff;border-radius:5px;display:flex;flex-direction:row;padding:.2rem;align-items:center}.waveform{flex:1;align-content:center;padding-right:1rem}.recorderToolbar{display:flex;flex-direction:row;gap:.2rem;padding:0 .5rem;align-items:center}.recorderToolbar ::ng-deep .p-button.p-button-icon-only{width:fit-content;padding:.2rem}.recorderToolbar ::ng-deep .mdc-button{min-width:unset;font-size:1.5rem;margin:unset}.recorderToolbar ::ng-deep .mat-mdc-button>.mat-icon{font-size:unset;width:unset;height:unset;padding:.2rem;margin:unset}.recorderToolbar ::ng-deep .p-button-text{background-color:transparent;border:unset;box-shadow:unset;padding:.2rem}.progress{align-content:center;font-size:1rem;height:100%;color:#6b7280}.recorderToolbar ::ng-deep .p-button-primary{color:var(--primary-color);border:unset}.endBar{display:flex;flex-direction:row;align-items:center;padding:unset;border-radius:5px;height:fit-content;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.endBar ::ng-deep button{background-color:transparent;border:unset;padding:.5rem;box-shadow:unset}.endBar ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.1)}.endBar>:first-child ::ng-deep button{border-radius:5px;border-top-right-radius:unset;border-bottom-right-radius:unset;border-right:1px solid #dee2e6;color:var(--primary-color)}.endBar>:last-child ::ng-deep button{border-radius:5px;border-top-left-radius:unset;border-bottom-left-radius:unset;color:var(--primary-color)}\n"] }]
175
+ }], ctorParameters: () => [{ type: i3.ComponentLibrary, decorators: [{
176
+ type: Inject,
177
+ args: [COMPONENT_LIBRARY]
178
+ }, {
179
+ type: Optional
180
+ }] }], propDecorators: { waveformRef: [{
181
+ type: ViewChild,
182
+ args: ['waveform']
183
+ }], recordingSaved: [{
184
+ type: Output
185
+ }] } });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtcmVjb3JkLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdWktYWN0aW9uL2NvbXBvbmVudHMvdXBsb2FkLXdpZGdldC92b2ljZS1yZWNvcmQtd2lkZ2V0L3ZvaWNlLXJlY29yZC13aWRnZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvdmlldy1jb250ZXh0L3NtYXJ0LXVpLWFjdGlvbi9jb21wb25lbnRzL3VwbG9hZC13aWRnZXQvdm9pY2UtcmVjb3JkLXdpZGdldC92b2ljZS1yZWNvcmQtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsU0FBUyxFQUdULE1BQU0sRUFDTixRQUFRLEVBQ1IsWUFBWSxFQUNaLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxZQUFZLE1BQU0sc0NBQXNDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFPdkYsTUFBTSxPQUFPLDBCQUEwQjtJQTRDckMsWUFBbUQsT0FBMEI7UUF6Q25FLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQU1wRCxxQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUVwQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixpQkFBWSxHQUFnQixJQUFJLENBQUM7UUFDakMsU0FBSSxHQUFXLE9B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bnRSZWYsXHJcbiAgT25EZXN0cm95LFxyXG4gIFZpZXdDaGlsZCxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIElucHV0LFxyXG4gIEluamVjdCxcclxuICBPcHRpb25hbCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIE9uSW5pdCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IFdhdmVTdXJmZXIgZnJvbSAnd2F2ZXN1cmZlci5qcyc7XHJcbmltcG9ydCBSZWNvcmRQbHVnaW4gZnJvbSAnd2F2ZXN1cmZlci5qcy9kaXN0L3BsdWdpbnMvcmVjb3JkLmpzJztcclxuaW1wb3J0IHsgQ09NUE9ORU5UX0xJQlJBUlksIENvbXBvbmVudExpYnJhcnkgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsaXR5L2NvbXBvbmVudExpYnJhcnknO1xyXG5pbXBvcnQgeyBVaUFjdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vdWktYWN0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgSWNvblBvc2l0aW9uLCBVaUFjdGlvbkJ1dHRvblR5cGUsIFVpQWN0aW9uRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uLy4uLy4uL2FwaSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3ZvaWNlLXJlY29yZC13aWRnZXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi92b2ljZS1yZWNvcmQtd2lkZ2V0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi92b2ljZS1yZWNvcmQtd2lkZ2V0LmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFZvaWNlUmVjb3JkV2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoJ3dhdmVmb3JtJykgd2F2ZWZvcm1SZWYhOiBFbGVtZW50UmVmO1xyXG5cclxuICBAT3V0cHV0KCkgcmVjb3JkaW5nU2F2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEJsb2I+KCk7XHJcblxyXG4gIHByaXZhdGUgd2F2ZXN1cmZlciE6IFdhdmVTdXJmZXI7XHJcbiAgcHJpdmF0ZSByZWNvcmQhOiBSZWNvcmRQbHVnaW47XHJcblxyXG4gIGNvbXBMaWI6IENvbXBvbmVudExpYnJhcnk7XHJcbiAgY29tcG9uZW50TGlicmFyeSA9IENvbXBvbmVudExpYnJhcnk7XHJcblxyXG4gIGlzUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgcmVjb3JkZWRCbG9iOiBCbG9iIHwgbnVsbCA9IG51bGw7XHJcbiAgdGltZTogc3RyaW5nID0gJzAwOjAwJztcclxuICBpc1BsYXlpbmcgPSBmYWxzZTtcclxuXHJcbiAgbWljQnV0dG9uOiBVaUFjdGlvbkRlc2NyaXB0b3IgPSB7XHJcbiAgICB0aXRsZTogJycsXHJcbiAgICB0eXBlOiBVaUFjdGlvbkJ1dHRvblR5cGUuSUNPTixcclxuICAgIGljb246ICdtaWNyb3Bob25lJyxcclxuICAgIGljb25Qb3NpdGlvbjogSWNvblBvc2l0aW9uLlBSRSxcclxuICAgIGNvbG9yOiAncHJpbWFyeScsXHJcbiAgfTtcclxuXHJcbiAgc3RvcEJ1dHRvbjogVWlBY3Rpb25EZXNjcmlwdG9yID0ge1xyXG4gICAgdGl0bGU6ICcnLFxyXG4gICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLklDT04sXHJcbiAgICBpY29uOiAnc3RvcC1jaXJjbGUnLFxyXG4gICAgaWNvblBvc2l0aW9uOiBJY29uUG9zaXRpb24uUFJFLFxyXG4gICAgaWNvbkNvbG9yOiAncmVkJyxcclxuICAgIGNvbG9yOiAncHJpbWFyeScsXHJcbiAgfTtcclxuXHJcbiAgc2F2ZUJ1dHRvbjogVWlBY3Rpb25EZXNjcmlwdG9yID0ge1xyXG4gICAgdGl0bGU6ICcnLFxyXG4gICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLklDT04sXHJcbiAgICBpY29uOiAnc2F2ZScsXHJcbiAgICBpY29uUG9zaXRpb246IEljb25Qb3NpdGlvbi5QUkUsXHJcbiAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gIH07XHJcblxyXG4gIHBsYXlCdXR0b24hOiBVaUFjdGlvbkRlc2NyaXB0b3I7XHJcbiAgc3RvcFBsYXliYWNrQnV0dG9uITogVWlBY3Rpb25EZXNjcmlwdG9yO1xyXG5cclxuICBjb25zdHJ1Y3RvcihASW5qZWN0KENPTVBPTkVOVF9MSUJSQVJZKSBAT3B0aW9uYWwoKSBjb21wTGliPzogQ29tcG9uZW50TGlicmFyeSkge1xyXG4gICAgdGhpcy5jb21wTGliID0gY29tcExpYiA/PyBDb21wb25lbnRMaWJyYXJ5LlBSSU1FTkc7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5wbGF5QnV0dG9uID0ge1xyXG4gICAgICB0aXRsZTogJycsXHJcbiAgICAgIHR5cGU6IFVpQWN0aW9uQnV0dG9uVHlwZS5JQ09OLFxyXG4gICAgICBpY29uOiB0aGlzLmNvbXBMaWIgPT09IENvbXBvbmVudExpYnJhcnkuUFJJTUVORyA/ICdwbGF5LWNpcmNsZScgOiAncGxheV9jaXJjbGUnLFxyXG4gICAgICBpY29uUG9zaXRpb246IEljb25Qb3NpdGlvbi5QUkUsXHJcbiAgICAgIGNvbG9yOiAncHJpbWFyeScsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zdG9wUGxheWJhY2tCdXR0b24gPSB7XHJcbiAgICAgIHRpdGxlOiAnJyxcclxuICAgICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLklDT04sXHJcbiAgICAgIGljb246IHRoaXMuY29tcExpYiA9PT0gQ29tcG9uZW50TGlicmFyeS5QUklNRU5HID8gJ3N0b3AtY2lyY2xlJyA6ICdzdG9wX2NpcmNsZScsXHJcbiAgICAgIGljb25Qb3NpdGlvbjogSWNvblBvc2l0aW9uLlBSRSxcclxuICAgICAgY29sb3I6ICdyZWQnLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGxldCBib2R5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpO1xyXG4gICAgbGV0IHByaW1hcnlDb2xvciA9IGdldENvbXB1dGVkU3R5bGUoYm9keSEpLmdldFByb3BlcnR5VmFsdWUoJy0tcHJpbWFyeS1jb2xvcicpLnRyaW0oKTtcclxuXHJcbiAgICB0aGlzLndhdmVzdXJmZXIgPSBXYXZlU3VyZmVyLmNyZWF0ZSh7XHJcbiAgICAgIGNvbnRhaW5lcjogdGhpcy53YXZlZm9ybVJlZi5uYXRpdmVFbGVtZW50LFxyXG4gICAgICB3YXZlQ29sb3I6IHByaW1hcnlDb2xvcixcclxuICAgICAgcHJvZ3Jlc3NDb2xvcjogdGhpcy5hZGRBbHBoYVRvQ29sb3IocHJpbWFyeUNvbG9yISwgMC41KSxcclxuICAgICAgaGVpZ2h0OiA0NSxcclxuICAgICAgYmFyV2lkdGg6IDUsXHJcbiAgICAgIGJhckdhcDogMSxcclxuICAgICAgYmFyUmFkaXVzOiA1LFxyXG4gICAgICBwbHVnaW5zOiBbXHJcbiAgICAgICAgUmVjb3JkUGx1Z2luLmNyZWF0ZSh7XHJcbiAgICAgICAgICByZW5kZXJSZWNvcmRlZEF1ZGlvOiB0cnVlLFxyXG4gICAgICAgICAgc2Nyb2xsaW5nV2F2ZWZvcm06IHRydWUsXHJcbiAgICAgICAgICBtaW1lVHlwZTogJ2F1ZGlvL3dlYm0nLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICBdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy53YXZlc3VyZmVyLnNldFZvbHVtZSgxKTtcclxuXHJcbiAgICB0aGlzLnJlY29yZCA9IHRoaXMud2F2ZXN1cmZlci5yZWdpc3RlclBsdWdpbihcclxuICAgICAgUmVjb3JkUGx1Z2luLmNyZWF0ZSh7XHJcbiAgICAgICAgcmVuZGVyUmVjb3JkZWRBdWRpbzogdHJ1ZSxcclxuICAgICAgICBzY3JvbGxpbmdXYXZlZm9ybTogdHJ1ZSxcclxuICAgICAgICBjb250aW51b3VzV2F2ZWZvcm06IGZhbHNlLFxyXG4gICAgICAgIGNvbnRpbnVvdXNXYXZlZm9ybUR1cmF0aW9uOiAxNSxcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy53YXZlc3VyZmVyLm9uKCdkYmxjbGljaycsICgpID0+IHtcclxuICAgICAgdGhpcy53YXZlc3VyZmVyLnBsYXkoKTtcclxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlY29yZC5vbigncmVjb3JkLWVuZCcsIChibG9iOiBCbG9iKSA9PiB7XHJcbiAgICAgIHRoaXMucmVjb3JkZWRCbG9iID0gYmxvYjtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yZWNvcmQub24oJ3JlY29yZC1wcm9ncmVzcycsICh0aW1lKSA9PiB7XHJcbiAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3ModGltZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMud2F2ZXN1cmZlci5vbignZmluaXNoJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzdGFydFJlY29yZGluZygpIHtcclxuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHRoaXMuY2hlY2tIYXNSZWNvcmRlZCgpO1xyXG4gICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5yZWNvcmQgJiYgIXRoaXMuaXNSZWNvcmRpbmcpIHtcclxuICAgICAgdGhpcy5yZWNvcmQuc3RhcnRSZWNvcmRpbmcoKTtcclxuICAgICAgdGhpcy5pc1JlY29yZGluZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tIYXNSZWNvcmRlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLnJlY29yZGVkQmxvYikge1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUHJvZ3Jlc3ModGltZTogbnVtYmVyKSB7XHJcbiAgICBsZXQgZm9ybWF0dGVkVGltZSA9IFtNYXRoLmZsb29yKCh0aW1lICUgMzYwMDAwMCkgLyA2MDAwMCksIE1hdGguZmxvb3IoKHRpbWUgJSA2MDAwMCkgLyAxMDAwKV1cclxuICAgICAgLm1hcCgodikgPT4gKHYgPCAxMCA/ICcwJyArIHYgOiB2KSlcclxuICAgICAgLmpvaW4oJzonKTtcclxuICAgIHRoaXMudGltZSA9IGZvcm1hdHRlZFRpbWU7XHJcbiAgfVxyXG5cclxuICBzdG9wUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMucmVjb3JkICYmIHRoaXMuaXNSZWNvcmRpbmcpIHtcclxuICAgICAgdGhpcy5yZWNvcmQuc3RvcFJlY29yZGluZygpO1xyXG4gICAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzYXZlUmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMucmVjb3JkZWRCbG9iKSB7XHJcbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSBub3cudG9Mb2NhbGVTdHJpbmcoJ3N2LVNFJykucmVwbGFjZSgnICcsICdfJykucmVwbGFjZSgvOi9nLCAnLScpO1xyXG5cclxuICAgICAgY29uc3QgZmlsZU5hbWUgPSBgcmVjb3JkaW5nXyR7Zm9ybWF0dGVkRGF0ZX0ud2VibWA7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbdGhpcy5yZWNvcmRlZEJsb2JdLCBmaWxlTmFtZSwgeyB0eXBlOiAnYXVkaW8vd2VibScgfSk7XHJcblxyXG4gICAgICB0aGlzLnJlY29yZGluZ1NhdmVkLmVtaXQoZmlsZSk7XHJcblxyXG4gICAgICB0aGlzLnJlY29yZGVkQmxvYiA9IG51bGw7XHJcbiAgICAgIHRoaXMudGltZSA9ICcwMDowMCc7XHJcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMud2F2ZXN1cmZlci5lbXB0eSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVwbGF5UmVjb3JkaW5nKCkge1xyXG4gICAgaWYgKHRoaXMucmVjb3JkZWRCbG9iKSB7XHJcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gIXRoaXMuaXNQbGF5aW5nO1xyXG4gICAgICB0aGlzLndhdmVzdXJmZXIucGxheVBhdXNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLndhdmVzdXJmZXIpIHtcclxuICAgICAgdGhpcy53YXZlc3VyZmVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkQWxwaGFUb0NvbG9yKGhleENvbG9yOiBzdHJpbmcsIGFscGhhOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKC9eIyhbYS1mXFxkXSkoW2EtZlxcZF0pKFthLWZcXGRdKSQvaS50ZXN0KGhleENvbG9yKSkge1xyXG4gICAgICBoZXhDb2xvciA9IGhleENvbG9yLnJlcGxhY2UoXHJcbiAgICAgICAgL14jKFthLWZcXGRdKShbYS1mXFxkXSkoW2EtZlxcZF0pJC9pLFxyXG4gICAgICAgIChfLCByLCBnLCBiKSA9PiBgIyR7cn0ke3J9JHtnfSR7Z30ke2J9JHtifWBcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoZXhNYXRjaCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXhDb2xvcik7XHJcbiAgICBpZiAoaGV4TWF0Y2gpIHtcclxuICAgICAgY29uc3QgWywgciwgZywgYl0gPSBoZXhNYXRjaDtcclxuICAgICAgcmV0dXJuIGByZ2JhKCR7cGFyc2VJbnQociwgMTYpfSwgJHtwYXJzZUludChnLCAxNil9LCAke3BhcnNlSW50KGIsIDE2KX0sICR7YWxwaGF9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY3R4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIGlmIChjdHgpIHtcclxuICAgICAgY3R4LmZpbGxTdHlsZSA9IGhleENvbG9yO1xyXG4gICAgICBjb25zdCBwYXJzZWQgPSBjdHguZmlsbFN0eWxlO1xyXG4gICAgICBjb25zdCByZ2JNYXRjaCA9IC9ecmdiXFwoKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrKVxcKSQvLmV4ZWMocGFyc2VkKTtcclxuICAgICAgaWYgKHJnYk1hdGNoKSB7XHJcbiAgICAgICAgY29uc3QgWywgciwgZywgYl0gPSByZ2JNYXRjaDtcclxuICAgICAgICByZXR1cm4gYHJnYmEoJHtyfSwgJHtnfSwgJHtifSwgJHthbHBoYX0pYDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBoZXhDb2xvcjtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInJlY29yZGVyQ29udGFpbmVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cInJlY29yZGVyVG9vbGJhclwiPlxyXG4gICAgPCEtLSBTdGFydCBSZWNvcmRpbmcgLS0+XHJcbiAgICA8dWktYWN0aW9uLWJ1dHRvblxyXG4gICAgICAqbmdJZj1cIiFpc1JlY29yZGluZ1wiXHJcbiAgICAgIFtkZXNjcmlwdG9yXT1cIm1pY0J1dHRvblwiXHJcbiAgICAgIChhY3Rpb25DbGljayk9XCJzdGFydFJlY29yZGluZygpXCJcclxuICAgID5cclxuICAgIDwvdWktYWN0aW9uLWJ1dHRvbj5cclxuXHJcbiAgICA8IS0tIFN0b3AgUmVjb3JkaW5nIC0tPlxyXG4gICAgPHVpLWFjdGlvbi1idXR0b24gKm5nSWY9XCJpc1JlY29yZGluZ1wiIFtkZXNjcmlwdG9yXT1cInN0b3BCdXR0b25cIiAoYWN0aW9uQ2xpY2spPVwic3RvcFJlY29yZGluZygpXCI+XHJcbiAgICA8L3VpLWFjdGlvbi1idXR0b24+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCI+e3sgdGltZSB9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJ3YXZlZm9ybVwiICN3YXZlZm9ybT48L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiZW5kQmFyXCI+XHJcbiAgICA8IS0tIFNhdmUgUmVjb3JkaW5nIC0tPlxyXG4gICAgPHVpLWFjdGlvbi1idXR0b25cclxuICAgICAgKm5nSWY9XCJyZWNvcmRlZEJsb2JcIlxyXG4gICAgICBbZGVzY3JpcHRvcl09XCJzYXZlQnV0dG9uXCJcclxuICAgICAgKGFjdGlvbkNsaWNrKT1cInNhdmVSZWNvcmRpbmcoKVwiXHJcbiAgICA+XHJcbiAgICA8L3VpLWFjdGlvbi1idXR0b24+XHJcblxyXG4gICAgPCEtLSBTdGFydCBQbGF5ICAtLT5cclxuICAgIDx1aS1hY3Rpb24tYnV0dG9uXHJcbiAgICAgICpuZ0lmPVwicmVjb3JkZWRCbG9iICYmICFpc1BsYXlpbmdcIlxyXG4gICAgICBbZGVzY3JpcHRvcl09XCJwbGF5QnV0dG9uXCJcclxuICAgICAgKGFjdGlvbkNsaWNrKT1cInJlcGxheVJlY29yZGluZygpXCJcclxuICAgID48L3VpLWFjdGlvbi1idXR0b24+XHJcblxyXG4gICAgPCEtLSBTdG9wIFBsYXkgIC0tPlxyXG4gICAgPHVpLWFjdGlvbi1idXR0b25cclxuICAgICAgKm5nSWY9XCJyZWNvcmRlZEJsb2IgJiYgaXNQbGF5aW5nXCJcclxuICAgICAgW2Rlc2NyaXB0b3JdPVwic3RvcFBsYXliYWNrQnV0dG9uXCJcclxuICAgICAgKGFjdGlvbkNsaWNrKT1cInJlcGxheVJlY29yZGluZygpXCJcclxuICAgID48L3VpLWFjdGlvbi1idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -1,20 +1,15 @@
1
1
  import { Component, Inject, ViewChild } from '@angular/core';
2
- import { IconPosition, UiActionButtonType, UploadWidgetType, } from '../../../api';
2
+ import { IconPosition, UiActionButtonType } from '../../../api';
3
3
  import { COMPONENT_LIBRARY, ComponentLibrary } from '../../../projects';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "../../ui-action.descriptor.service";
6
- import * as i2 from "@angular/common";
7
- import * as i3 from "@angular/material/button";
8
- import * as i4 from "primeng/button";
9
- import * as i5 from "primeng/api";
10
- import * as i6 from "../../../../smart-icon/smart-icon/smart-icon.component";
11
- import * as i7 from "primeng/fileupload";
12
- import * as i8 from "../../../../smart-form/smartfileuploader/smartfileuploader.component";
13
- import * as i9 from "./voice-record-widget/voice-record-widget.component";
14
- import * as i10 from "./photo-capture-widget/photo-capture-widget.component";
15
- import * as i11 from "../../ui-action-button/ui-action-button.component";
16
- import * as i12 from "./ui-action-file-upload-dialog.service";
17
- import * as i13 from "../../../projects";
6
+ import * as i2 from "@angular/material/button";
7
+ import * as i3 from "primeng/button";
8
+ import * as i4 from "../../../../smart-icon/smart-icon/smart-icon.component";
9
+ import * as i5 from "../../ui-action-button/ui-action-button.component";
10
+ import * as i6 from "../../components/upload-widget/upload-widget.component";
11
+ import * as i7 from "./ui-action-file-upload-dialog.service";
12
+ import * as i8 from "../../../projects";
18
13
  export class UiActionFileUploadDialogComponent {
19
14
  constructor(service, compLib, manager, cdr) {
20
15
  this.service = service;
@@ -22,9 +17,6 @@ export class UiActionFileUploadDialogComponent {
22
17
  this.manager = manager;
23
18
  this.cdr = cdr;
24
19
  this.componentLibrary = ComponentLibrary;
25
- this.uploadWidgetType = UploadWidgetType;
26
- this.maxSizeMb = 25;
27
- this.uploadedFiles = [];
28
20
  this.code = this.service.action.code;
29
21
  this.setUp();
30
22
  }
@@ -45,19 +37,6 @@ export class UiActionFileUploadDialogComponent {
45
37
  };
46
38
  this.descriptor = await this.manager.getActionDescriptor(this.service.action);
47
39
  this.isMultiple = this.service.isMultiple;
48
- this.maxSizeMb = Number(this.descriptor.upload?.maxSize);
49
- if (this.descriptor?.upload?.formats) {
50
- this.fileFormats = [this.descriptor.upload.formats];
51
- }
52
- // fileFormats = this.descriptor.upload?.formats;
53
- this.i18n = {
54
- addFile: this.descriptor.upload?.title ?? 'dokumentum hozzáadása',
55
- browseOrDrag: this.descriptor.upload?.description ?? 'tallózás vagy behúzás',
56
- formats: this.descriptor.upload?.formats ?? '',
57
- maxSize: this.descriptor.upload?.maxSize ?? '',
58
- upload: this.descriptor.upload?.uploadButtonTitle,
59
- };
60
- // TODO set max size and file formats by UiAction.params
61
40
  if (this.descriptor[this.service.inputTypeName]) {
62
41
  this.dialogType = this.service.inputTypeName;
63
42
  }
@@ -102,90 +81,22 @@ export class UiActionFileUploadDialogComponent {
102
81
  }
103
82
  return '';
104
83
  }
105
- upload(files) {
106
- this.service.onSave(files);
107
- }
108
- onSelect(event) {
109
- this.uploadedFiles = [];
110
- for (let file of event.files) {
111
- this.uploadedFiles.push(file);
112
- }
113
- this.hasFiles = true;
114
- }
115
- onRemove(event) {
116
- this.uploadedFiles = [];
117
- this.hasFiles = false;
118
- }
119
- uploadFiles(event) {
120
- this.service.onSave(this.uploadedFiles);
84
+ upload(event) {
85
+ this.service.onSave(event.files);
121
86
  }
122
87
  cancel() {
123
88
  this.service.cancel();
124
89
  }
125
- uploadRecording(file) {
126
- this.loadFilesIntoWidget([file]);
127
- this.hasFiles = true;
128
- }
129
- uploadImage(files) {
130
- this.loadFilesIntoWidget(files);
131
- this.hasFiles = true;
132
- }
133
- loadFilesIntoWidget(files) {
134
- if (ComponentLibrary.PRIMENG === this.compLib) {
135
- const dataTransfer = new DataTransfer();
136
- const existingFiles = Array.from(this.fileUploadPrime.files);
137
- existingFiles.forEach((file) => {
138
- dataTransfer.items.add(file);
139
- });
140
- for (const file of files) {
141
- dataTransfer.items.add(file);
142
- }
143
- const fileList = dataTransfer.files;
144
- const fakeEvent = {
145
- target: {
146
- files: fileList,
147
- },
148
- type: 'change',
149
- };
150
- this.fileUploadPrime.onFileSelect(fakeEvent);
151
- }
152
- else {
153
- this.fileUploadMaterial.files.push(...files);
154
- }
155
- }
156
- widgetNeeded(type) {
157
- return this.descriptor?.upload?.uploadWidgets?.includes(type) ?? false;
158
- }
159
- downloadFile(file) {
160
- const url = window.URL.createObjectURL(file);
161
- const a = document.createElement('a');
162
- a.href = url;
163
- a.download = file.name;
164
- a.click();
165
- window.URL.revokeObjectURL(url);
166
- }
167
- removeFile(index) {
168
- this.fileUploadPrime.removeUploadedFile(index);
169
- }
170
- formatSize(bytes) {
171
- if (bytes === 0)
172
- return '0 B';
173
- const k = 1024;
174
- const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
175
- const i = Math.floor(Math.log(bytes) / Math.log(k));
176
- const value = parseFloat((bytes / Math.pow(k, i)).toFixed(1));
177
- return `${value} ${sizes[i]}`;
178
- }
179
90
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: UiActionFileUploadDialogComponent, deps: [{ token: 'fileUploadDialogService' }, { token: COMPONENT_LIBRARY }, { token: i1.UiActionDescriptorService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
180
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: UiActionFileUploadDialogComponent, selector: "lib-ui-action-file-upload-dialog", viewQueries: [{ propertyName: "fileUploadPrime", first: true, predicate: ["fileUploadPrimeNg"], descendants: true }, { propertyName: "fileUploadMaterial", first: true, predicate: ["fileUploadMaterial"], descendants: true }], ngImport: i0, template: "<div class=\"folderNameDialogContainer\">\r\n <div class=\"headerContainer\">\r\n <h3 class=\"color-accent-700\">\r\n {{ getTitle() }}\r\n </h3>\r\n @if(compLib === componentLibrary.MATERIAL) {\r\n <button mat-icon-button (click)=\"cancel()\">\r\n <smart-icon [color]=\"'primary'\" [icon]=\"'X'\"></smart-icon>\r\n </button>\r\n }@else {\r\n <p-button icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" (click)=\"cancel()\" />\r\n }\r\n </div>\r\n <p>\r\n {{ getText() }}\r\n </p>\r\n\r\n <!-- IMAGE TYPE WIDGET -->\r\n <ng-container *ngIf=\"widgetNeeded(uploadWidgetType.IMAGE) || widgetNeeded(uploadWidgetType.ALL)\">\r\n <photo-capture-widget\r\n [maxFileSize]=\"maxSizeMb * 1024 * 1024\"\r\n (photoCaptured)=\"uploadImage($event)\"\r\n >\r\n </photo-capture-widget>\r\n </ng-container>\r\n\r\n <!-- SOUND TYPE WIDGET -->\r\n <ng-container *ngIf=\"widgetNeeded(uploadWidgetType.SOUND) || widgetNeeded(uploadWidgetType.ALL)\">\r\n <voice-record-widget (recordingSaved)=\"uploadRecording($event)\"> </voice-record-widget>\r\n </ng-container>\r\n\r\n @if(compLib === componentLibrary.PRIMENG) {\r\n\r\n <p-fileUpload\r\n #fileUploadPrimeNg\r\n name=\"files[]\"\r\n url=\"\"\r\n (onSend)=\"uploadFiles($event)\"\r\n (onSelect)=\"onSelect($event)\"\r\n (onRemove)=\"onRemove($event)\"\r\n [multiple]=\"isMultiple\"\r\n [accept]=\"this.descriptor?.upload?.formats ?? ''\"\r\n [maxFileSize]=\"maxSizeMb * 1024 * 1024\"\r\n uploadLabel=\"Felt\u00F6lt\u00E9s\"\r\n cancelLabel=\"M\u00E9gsem\"\r\n chooseLabel=\"V\u00E1laszt\u00E1s\"\r\n >\r\n <ng-template pTemplate=\"content\" *ngIf=\"!hasFiles && !isMobile()\">\r\n <div class=\"uploadField\">\r\n <smart-icon [icon]=\"'upload'\"></smart-icon>\r\n <span class=\"message\">H\u00FAzza ide a f\u00E1jlokat.</span>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"file\" let-file let-i=\"index\">\r\n <div class=\"p-fileupload-file\">\r\n @if(file.objectURL){\r\n <img role=\"presentation\" [alt]=\"file.name\" [src]=\"file.objectURL\" width=\"50\" height=\"50\" />\r\n }@else {\r\n <i class=\"pi pi-file\" style=\"font-size: 2rem\"></i>\r\n }\r\n\r\n <div class=\"p-file-data\">\r\n <div class=\"fileData\">\r\n <span class=\"fileName\">{{ file.name }}</span>\r\n <span class=\"fileSize\">{{ formatSize(file.size) }}</span>\r\n </div>\r\n <button\r\n pButton\r\n icon=\"pi pi-download\"\r\n class=\"p-button-text file-action\"\r\n (click)=\"downloadFile(file)\"\r\n aria-label=\"Download\"\r\n style=\"color: var(--primary-color)\"\r\n ></button>\r\n <button\r\n pButton\r\n icon=\"pi pi-times\"\r\n class=\"p-button-text file-action\"\r\n (click)=\"removeFile(i)\"\r\n aria-label=\"Remove\"\r\n style=\"color: rgb(239, 68, 68)\"\r\n ></button\r\n ></div>\r\n </div>\r\n </ng-template>\r\n </p-fileUpload>\r\n\r\n }@else{\r\n\r\n <smartfileuploader\r\n #fileUploadMaterial\r\n [i18n]=\"i18n\"\r\n [fileFormats]=\"fileFormats\"\r\n [maxSizeMb]=\"maxSizeMb\"\r\n [uploadCallback]=\"upload.bind(this)\"\r\n [isMultiple]=\"isMultiple\"\r\n ></smartfileuploader>\r\n }\r\n\r\n <div class=\"folderNameDialogButtonsContainer\">\r\n <ui-action-button [descriptor]=\"cancelButton\" (actionClick)=\"cancel()\"></ui-action-button>\r\n </div>\r\n</div>\r\n", styles: [".folderNameDialogContainer{display:flex;flex-direction:column;justify-content:center;gap:1rem;min-width:30vw}photo-capture-widget{width:100%;max-width:100%;overflow:hidden;display:flex;flex-direction:column;align-items:center}.headerContainer{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding-top:1rem}.headerContainer ::ng-deep button{color:var(--primary-color)}.headerContainer h3{margin:0}.folderNameDialogButtonsContainer{display:flex;flex-direction:row;justify-content:flex-end;gap:.5rem}.folderNameDialogButtonsContainer ::ng-deep button{border-radius:3px}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-buttonbar{display:flex!important;flex-direction:row;justify-content:center;flex-wrap:wrap;gap:1rem}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-row>div{width:fit-content}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-content{padding:unset;align-content:center;text-align:center}.message{text-align:center;color:#6b7280}.uploadField{display:flex;flex-direction:row;justify-content:center;align-items:center;gap:1rem;padding:1rem}.folderNameDialogContainer ::ng-deep .p-fileupload-row{border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.folderNameDialogContainer ::ng-deep .p-fileupload-choose,.folderNameDialogContainer ::ng-deep .p-fileupload-row ::ng-deep button,.folderNameDialogContainer ::ng-deep .p-fileupload-buttonbar ::ng-deep button{background-color:var(--primary-color);border-color:var(--primary-color)}.folderNameDialogContainer ::ng-deep .p-fileupload-choose:hover,.folderNameDialogContainer ::ng-deep .p-fileupload-row ::ng-deep button:hover,.folderNameDialogContainer ::ng-deep .p-fileupload-buttonbar ::ng-deep button:hover,.folderNameDialogButtonsContainer ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.8)}.headerContainer ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.1)}@media (max-width: 900px){.folderNameDialogContainer{width:100%}}.p-fileupload-file{display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:1rem;padding:1rem;border:1px solid #dee2e6}.p-file-data{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.fileSize{padding-left:1rem;display:flex;justify-content:flex-end}.fileData{display:flex;flex-direction:column;justify-content:flex-end;padding-right:1rem}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i7.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "component", type: i8.SmartfileuploaderComponent, selector: "smartfileuploader", inputs: ["uploadCallback", "fileFormats", "maxSizeMb", "i18n", "useIconButton", "isMultiple"] }, { kind: "component", type: i9.VoiceRecordWidgetComponent, selector: "voice-record-widget", outputs: ["recordingSaved"] }, { kind: "component", type: i10.PhotoCaptureWidgetComponent, selector: "photo-capture-widget", inputs: ["maxFileSize"], outputs: ["photoCaptured"] }, { kind: "component", type: i11.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass"], outputs: ["actionClick", "actionDoubleClick"] }] }); }
91
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: UiActionFileUploadDialogComponent, selector: "lib-ui-action-file-upload-dialog", viewQueries: [{ propertyName: "fileUploadPrime", first: true, predicate: ["fileUploadPrimeNg"], descendants: true }, { propertyName: "fileUploadMaterial", first: true, predicate: ["fileUploadMaterial"], descendants: true }], ngImport: i0, template: "<div class=\"folderNameDialogContainer\">\r\n <div class=\"headerContainer\">\r\n <h3 class=\"color-accent-700\">\r\n {{ getTitle() }}\r\n </h3>\r\n @if(compLib === componentLibrary.MATERIAL) {\r\n <button mat-icon-button (click)=\"cancel()\">\r\n <smart-icon [color]=\"'primary'\" [icon]=\"'X'\"></smart-icon>\r\n </button>\r\n }@else {\r\n <p-button icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" (click)=\"cancel()\" />\r\n }\r\n </div>\r\n <p>\r\n {{ getText() }}\r\n </p>\r\n\r\n @if(descriptor?.upload) {\r\n <smart-upload-widget\r\n [uploadDescriptor]=\"descriptor?.upload!\"\r\n [isMultiple]=\"isMultiple ?? true\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n }\r\n\r\n <div class=\"folderNameDialogButtonsContainer\">\r\n <ui-action-button [descriptor]=\"cancelButton\" (actionClick)=\"cancel()\"></ui-action-button>\r\n </div>\r\n</div>\r\n", styles: [".folderNameDialogContainer{display:flex;flex-direction:column;justify-content:center;gap:1rem;min-width:30vw}photo-capture-widget{width:100%;max-width:100%;overflow:hidden;display:flex;flex-direction:column;align-items:center}.headerContainer{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding-top:1rem}.headerContainer ::ng-deep button{color:var(--primary-color)}.headerContainer h3{margin:0}.folderNameDialogButtonsContainer{display:flex;flex-direction:row;justify-content:flex-end;gap:.5rem}.folderNameDialogButtonsContainer ::ng-deep button{border-radius:3px}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-buttonbar{display:flex!important;flex-direction:row;justify-content:center;flex-wrap:wrap;gap:1rem}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-row>div{width:fit-content}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-content{padding:unset;align-content:center;text-align:center}.message{text-align:center;color:#6b7280}.uploadField{display:flex;flex-direction:row;justify-content:center;align-items:center;gap:1rem;padding:1rem}.folderNameDialogContainer ::ng-deep .p-fileupload-row{border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.folderNameDialogContainer ::ng-deep .p-fileupload-choose,.folderNameDialogContainer ::ng-deep .p-fileupload-row ::ng-deep button,.folderNameDialogContainer ::ng-deep .p-fileupload-buttonbar ::ng-deep button{background-color:var(--primary-color);border-color:var(--primary-color)}.folderNameDialogContainer ::ng-deep .p-fileupload-choose:hover,.folderNameDialogContainer ::ng-deep .p-fileupload-row ::ng-deep button:hover,.folderNameDialogContainer ::ng-deep .p-fileupload-buttonbar ::ng-deep button:hover,.folderNameDialogButtonsContainer ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.8)}.headerContainer ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.1)}@media (max-width: 900px){.folderNameDialogContainer{width:100%}}.p-fileupload-file{display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:1rem;padding:1rem;border:1px solid #dee2e6}.p-file-data{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.fileSize{padding-left:1rem;display:flex;justify-content:flex-end}.fileData{display:flex;flex-direction:column;justify-content:flex-end;padding-right:1rem}\n"], dependencies: [{ kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i4.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i5.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: i6.UploadWidgetComponent, selector: "smart-upload-widget", inputs: ["uploadDescriptor", "isMultiple"], outputs: ["uploadFilesEvent"] }] }); }
181
92
  }
182
93
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: UiActionFileUploadDialogComponent, decorators: [{
183
94
  type: Component,
184
- args: [{ selector: 'lib-ui-action-file-upload-dialog', template: "<div class=\"folderNameDialogContainer\">\r\n <div class=\"headerContainer\">\r\n <h3 class=\"color-accent-700\">\r\n {{ getTitle() }}\r\n </h3>\r\n @if(compLib === componentLibrary.MATERIAL) {\r\n <button mat-icon-button (click)=\"cancel()\">\r\n <smart-icon [color]=\"'primary'\" [icon]=\"'X'\"></smart-icon>\r\n </button>\r\n }@else {\r\n <p-button icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" (click)=\"cancel()\" />\r\n }\r\n </div>\r\n <p>\r\n {{ getText() }}\r\n </p>\r\n\r\n <!-- IMAGE TYPE WIDGET -->\r\n <ng-container *ngIf=\"widgetNeeded(uploadWidgetType.IMAGE) || widgetNeeded(uploadWidgetType.ALL)\">\r\n <photo-capture-widget\r\n [maxFileSize]=\"maxSizeMb * 1024 * 1024\"\r\n (photoCaptured)=\"uploadImage($event)\"\r\n >\r\n </photo-capture-widget>\r\n </ng-container>\r\n\r\n <!-- SOUND TYPE WIDGET -->\r\n <ng-container *ngIf=\"widgetNeeded(uploadWidgetType.SOUND) || widgetNeeded(uploadWidgetType.ALL)\">\r\n <voice-record-widget (recordingSaved)=\"uploadRecording($event)\"> </voice-record-widget>\r\n </ng-container>\r\n\r\n @if(compLib === componentLibrary.PRIMENG) {\r\n\r\n <p-fileUpload\r\n #fileUploadPrimeNg\r\n name=\"files[]\"\r\n url=\"\"\r\n (onSend)=\"uploadFiles($event)\"\r\n (onSelect)=\"onSelect($event)\"\r\n (onRemove)=\"onRemove($event)\"\r\n [multiple]=\"isMultiple\"\r\n [accept]=\"this.descriptor?.upload?.formats ?? ''\"\r\n [maxFileSize]=\"maxSizeMb * 1024 * 1024\"\r\n uploadLabel=\"Felt\u00F6lt\u00E9s\"\r\n cancelLabel=\"M\u00E9gsem\"\r\n chooseLabel=\"V\u00E1laszt\u00E1s\"\r\n >\r\n <ng-template pTemplate=\"content\" *ngIf=\"!hasFiles && !isMobile()\">\r\n <div class=\"uploadField\">\r\n <smart-icon [icon]=\"'upload'\"></smart-icon>\r\n <span class=\"message\">H\u00FAzza ide a f\u00E1jlokat.</span>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"file\" let-file let-i=\"index\">\r\n <div class=\"p-fileupload-file\">\r\n @if(file.objectURL){\r\n <img role=\"presentation\" [alt]=\"file.name\" [src]=\"file.objectURL\" width=\"50\" height=\"50\" />\r\n }@else {\r\n <i class=\"pi pi-file\" style=\"font-size: 2rem\"></i>\r\n }\r\n\r\n <div class=\"p-file-data\">\r\n <div class=\"fileData\">\r\n <span class=\"fileName\">{{ file.name }}</span>\r\n <span class=\"fileSize\">{{ formatSize(file.size) }}</span>\r\n </div>\r\n <button\r\n pButton\r\n icon=\"pi pi-download\"\r\n class=\"p-button-text file-action\"\r\n (click)=\"downloadFile(file)\"\r\n aria-label=\"Download\"\r\n style=\"color: var(--primary-color)\"\r\n ></button>\r\n <button\r\n pButton\r\n icon=\"pi pi-times\"\r\n class=\"p-button-text file-action\"\r\n (click)=\"removeFile(i)\"\r\n aria-label=\"Remove\"\r\n style=\"color: rgb(239, 68, 68)\"\r\n ></button\r\n ></div>\r\n </div>\r\n </ng-template>\r\n </p-fileUpload>\r\n\r\n }@else{\r\n\r\n <smartfileuploader\r\n #fileUploadMaterial\r\n [i18n]=\"i18n\"\r\n [fileFormats]=\"fileFormats\"\r\n [maxSizeMb]=\"maxSizeMb\"\r\n [uploadCallback]=\"upload.bind(this)\"\r\n [isMultiple]=\"isMultiple\"\r\n ></smartfileuploader>\r\n }\r\n\r\n <div class=\"folderNameDialogButtonsContainer\">\r\n <ui-action-button [descriptor]=\"cancelButton\" (actionClick)=\"cancel()\"></ui-action-button>\r\n </div>\r\n</div>\r\n", styles: [".folderNameDialogContainer{display:flex;flex-direction:column;justify-content:center;gap:1rem;min-width:30vw}photo-capture-widget{width:100%;max-width:100%;overflow:hidden;display:flex;flex-direction:column;align-items:center}.headerContainer{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding-top:1rem}.headerContainer ::ng-deep button{color:var(--primary-color)}.headerContainer h3{margin:0}.folderNameDialogButtonsContainer{display:flex;flex-direction:row;justify-content:flex-end;gap:.5rem}.folderNameDialogButtonsContainer ::ng-deep button{border-radius:3px}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-buttonbar{display:flex!important;flex-direction:row;justify-content:center;flex-wrap:wrap;gap:1rem}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-row>div{width:fit-content}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-content{padding:unset;align-content:center;text-align:center}.message{text-align:center;color:#6b7280}.uploadField{display:flex;flex-direction:row;justify-content:center;align-items:center;gap:1rem;padding:1rem}.folderNameDialogContainer ::ng-deep .p-fileupload-row{border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.folderNameDialogContainer ::ng-deep .p-fileupload-choose,.folderNameDialogContainer ::ng-deep .p-fileupload-row ::ng-deep button,.folderNameDialogContainer ::ng-deep .p-fileupload-buttonbar ::ng-deep button{background-color:var(--primary-color);border-color:var(--primary-color)}.folderNameDialogContainer ::ng-deep .p-fileupload-choose:hover,.folderNameDialogContainer ::ng-deep .p-fileupload-row ::ng-deep button:hover,.folderNameDialogContainer ::ng-deep .p-fileupload-buttonbar ::ng-deep button:hover,.folderNameDialogButtonsContainer ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.8)}.headerContainer ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.1)}@media (max-width: 900px){.folderNameDialogContainer{width:100%}}.p-fileupload-file{display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:1rem;padding:1rem;border:1px solid #dee2e6}.p-file-data{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.fileSize{padding-left:1rem;display:flex;justify-content:flex-end}.fileData{display:flex;flex-direction:column;justify-content:flex-end;padding-right:1rem}\n"] }]
185
- }], ctorParameters: () => [{ type: i12.UiActionFileUploadDialogService, decorators: [{
95
+ args: [{ selector: 'lib-ui-action-file-upload-dialog', template: "<div class=\"folderNameDialogContainer\">\r\n <div class=\"headerContainer\">\r\n <h3 class=\"color-accent-700\">\r\n {{ getTitle() }}\r\n </h3>\r\n @if(compLib === componentLibrary.MATERIAL) {\r\n <button mat-icon-button (click)=\"cancel()\">\r\n <smart-icon [color]=\"'primary'\" [icon]=\"'X'\"></smart-icon>\r\n </button>\r\n }@else {\r\n <p-button icon=\"pi pi-times\" [rounded]=\"true\" [text]=\"true\" (click)=\"cancel()\" />\r\n }\r\n </div>\r\n <p>\r\n {{ getText() }}\r\n </p>\r\n\r\n @if(descriptor?.upload) {\r\n <smart-upload-widget\r\n [uploadDescriptor]=\"descriptor?.upload!\"\r\n [isMultiple]=\"isMultiple ?? true\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n }\r\n\r\n <div class=\"folderNameDialogButtonsContainer\">\r\n <ui-action-button [descriptor]=\"cancelButton\" (actionClick)=\"cancel()\"></ui-action-button>\r\n </div>\r\n</div>\r\n", styles: [".folderNameDialogContainer{display:flex;flex-direction:column;justify-content:center;gap:1rem;min-width:30vw}photo-capture-widget{width:100%;max-width:100%;overflow:hidden;display:flex;flex-direction:column;align-items:center}.headerContainer{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding-top:1rem}.headerContainer ::ng-deep button{color:var(--primary-color)}.headerContainer h3{margin:0}.folderNameDialogButtonsContainer{display:flex;flex-direction:row;justify-content:flex-end;gap:.5rem}.folderNameDialogButtonsContainer ::ng-deep button{border-radius:3px}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-buttonbar{display:flex!important;flex-direction:row;justify-content:center;flex-wrap:wrap;gap:1rem}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-row>div{width:fit-content}.folderNameDialogContainer ::ng-deep .p-fileupload .p-fileupload-content{padding:unset;align-content:center;text-align:center}.message{text-align:center;color:#6b7280}.uploadField{display:flex;flex-direction:row;justify-content:center;align-items:center;gap:1rem;padding:1rem}.folderNameDialogContainer ::ng-deep .p-fileupload-row{border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.folderNameDialogContainer ::ng-deep .p-fileupload-choose,.folderNameDialogContainer ::ng-deep .p-fileupload-row ::ng-deep button,.folderNameDialogContainer ::ng-deep .p-fileupload-buttonbar ::ng-deep button{background-color:var(--primary-color);border-color:var(--primary-color)}.folderNameDialogContainer ::ng-deep .p-fileupload-choose:hover,.folderNameDialogContainer ::ng-deep .p-fileupload-row ::ng-deep button:hover,.folderNameDialogContainer ::ng-deep .p-fileupload-buttonbar ::ng-deep button:hover,.folderNameDialogButtonsContainer ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.8)}.headerContainer ::ng-deep button:hover{background-color:rgba(from var(--primary-color) r g b/.1)}@media (max-width: 900px){.folderNameDialogContainer{width:100%}}.p-fileupload-file{display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:1rem;padding:1rem;border:1px solid #dee2e6}.p-file-data{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.fileSize{padding-left:1rem;display:flex;justify-content:flex-end}.fileData{display:flex;flex-direction:column;justify-content:flex-end;padding-right:1rem}\n"] }]
96
+ }], ctorParameters: () => [{ type: i7.UiActionFileUploadDialogService, decorators: [{
186
97
  type: Inject,
187
98
  args: ['fileUploadDialogService']
188
- }] }, { type: i13.ComponentLibrary, decorators: [{
99
+ }] }, { type: i8.ComponentLibrary, decorators: [{
189
100
  type: Inject,
190
101
  args: [COMPONENT_LIBRARY]
191
102
  }] }, { type: i1.UiActionDescriptorService }, { type: i0.ChangeDetectorRef }], propDecorators: { fileUploadPrime: [{
@@ -195,4 +106,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
195
106
  type: ViewChild,
196
107
  args: ['fileUploadMaterial']
197
108
  }] } });
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktYWN0aW9uLWZpbGUtdXBsb2FkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdWktYWN0aW9uL2RpYWxvZ3MvdWktYWN0aW9uLWZpbGUtdXBsb2FkLWRpYWxvZy91aS1hY3Rpb24tZmlsZS11cGxvYWQtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3ZpZXctY29udGV4dC9zbWFydC11aS1hY3Rpb24vZGlhbG9ncy91aS1hY3Rpb24tZmlsZS11cGxvYWQtZGlhbG9nL3VpLWFjdGlvbi1maWxlLXVwbG9hZC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQ0wsWUFBWSxFQUNaLGtCQUFrQixFQUVsQixnQkFBZ0IsR0FDakIsTUFBTSxjQUFjLENBQUM7QUFJdEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVN4RSxNQUFNLE9BQU8saUNBQWlDO0lBbUI1QyxZQUM2QyxPQUF3QyxFQUNqRCxPQUF5QixFQUNuRCxPQUFrQyxFQUNsQyxHQUFzQjtRQUhhLFlBQU8sR0FBUCxPQUFPLENBQWlDO1FBQ2pELFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ25ELFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBQ2xDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBZmhDLHFCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3BDLHFCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBRXBD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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3QsIE9uRGVzdHJveSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgSWNvblBvc2l0aW9uLFxyXG4gIFVpQWN0aW9uQnV0dG9uVHlwZSxcclxuICBVaUFjdGlvbkRlc2NyaXB0b3IsXHJcbiAgVXBsb2FkV2lkZ2V0VHlwZSxcclxufSBmcm9tICcuLi8uLi8uLi9hcGknO1xyXG5pbXBvcnQgeyBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdWktYWN0aW9uLmRlc2NyaXB0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IFVpQWN0aW9uRmlsZVVwbG9hZERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL3VpLWFjdGlvbi1maWxlLXVwbG9hZC1kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IFNtYXJ0RmlsZVVwbG9hZGVySTE4biB9IGZyb20gJy4uLy4uLy4uLy4uL3NtYXJ0LWZvcm0vc21hcnRmaWxldXBsb2FkZXIvc21hcnRmaWxldXBsb2FkZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBDT01QT05FTlRfTElCUkFSWSwgQ29tcG9uZW50TGlicmFyeSB9IGZyb20gJy4uLy4uLy4uL3Byb2plY3RzJztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZCB9IGZyb20gJ3ByaW1lbmcvZmlsZXVwbG9hZCc7XHJcbmltcG9ydCB7IFNtYXJ0ZmlsZXVwbG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vc21hcnQtZm9ybS9zbWFydGZpbGV1cGxvYWRlci9zbWFydGZpbGV1cGxvYWRlci5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItdWktYWN0aW9uLWZpbGUtdXBsb2FkLWRpYWxvZycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VpLWFjdGlvbi1maWxlLXVwbG9hZC1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3VpLWFjdGlvbi1maWxlLXVwbG9hZC1kaWFsb2cuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlBY3Rpb25GaWxlVXBsb2FkRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKCdmaWxlVXBsb2FkUHJpbWVOZycpIGZpbGVVcGxvYWRQcmltZSE6IEZpbGVVcGxvYWQ7XHJcbiAgQFZpZXdDaGlsZCgnZmlsZVVwbG9hZE1hdGVyaWFsJykgZmlsZVVwbG9hZE1hdGVyaWFsITogU21hcnRmaWxldXBsb2FkZXJDb21wb25lbnQ7XHJcblxyXG4gIGNvZGUhOiBzdHJpbmc7XHJcbiAgZGlhbG9nVHlwZSE6ICdkaWFsb2cnIHwgJ2lucHV0RGlhbG9nJyB8ICdpbnB1dDJEaWFsb2cnO1xyXG5cclxuICBkZXNjcmlwdG9yPzogVWlBY3Rpb25EZXNjcmlwdG9yO1xyXG4gIGNvbXBvbmVudExpYnJhcnkgPSBDb21wb25lbnRMaWJyYXJ5O1xyXG4gIHVwbG9hZFdpZGdldFR5cGUgPSBVcGxvYWRXaWRnZXRUeXBlO1xyXG4gIGkxOG4/OiBTbWFydEZpbGVVcGxvYWRlckkxOG47XHJcbiAgbWF4U2l6ZU1iOiBudW1iZXIgPSAyNTtcclxuICBmaWxlRm9ybWF0cz86IHN0cmluZ1tdO1xyXG4gIGlzTXVsdGlwbGU/OiBib29sZWFuO1xyXG4gIGhhc0ZpbGVzPzogYm9vbGVhbjtcclxuXHJcbiAgdXBsb2FkZWRGaWxlczogYW55W10gPSBbXTtcclxuICBjYW5jZWxCdXR0b24hOiBVaUFjdGlvbkRlc2NyaXB0b3I7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnZmlsZVVwbG9hZERpYWxvZ1NlcnZpY2UnKSBwcml2YXRlIHNlcnZpY2U6IFVpQWN0aW9uRmlsZVVwbG9hZERpYWxvZ1NlcnZpY2UsXHJcbiAgICBASW5qZWN0KENPTVBPTkVOVF9MSUJSQVJZKSBwdWJsaWMgY29tcExpYjogQ29tcG9uZW50TGlicmFyeSxcclxuICAgIHByaXZhdGUgbWFuYWdlcjogVWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge1xyXG4gICAgdGhpcy5jb2RlID0gdGhpcy5zZXJ2aWNlLmFjdGlvbi5jb2RlITtcclxuICAgIHRoaXMuc2V0VXAoKTtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlcnZpY2UuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuY2FuY2VsKCk7XHJcbiAgfVxyXG5cclxuICBpc01vYmlsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAvaVBob25lfGlQYWR8aVBvZHxBbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNldFVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5jYW5jZWxCdXR0b24gPSB7XHJcbiAgICAgIHRpdGxlOiAnTcOpZ3NlJyxcclxuICAgICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLlJBSVNFRCxcclxuICAgICAgaWNvbjogdGhpcy5jb21wTGliID09PSBDb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcgPyAndGltZXMnIDogJ2Nsb3NlJyxcclxuICAgICAgaWNvblBvc2l0aW9uOiBJY29uUG9zaXRpb24uUFJFLFxyXG4gICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmRlc2NyaXB0b3IgPSBhd2FpdCB0aGlzLm1hbmFnZXIuZ2V0QWN0aW9uRGVzY3JpcHRvcih0aGlzLnNlcnZpY2UuYWN0aW9uKTtcclxuXHJcbiAgICB0aGlzLmlzTXVsdGlwbGUgPSB0aGlzLnNlcnZpY2UuaXNNdWx0aXBsZTtcclxuICAgIHRoaXMubWF4U2l6ZU1iID0gTnVtYmVyKHRoaXMuZGVzY3JpcHRvci51cGxvYWQ/Lm1heFNpemUpO1xyXG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvcj8udXBsb2FkPy5mb3JtYXRzKSB7XHJcbiAgICAgIHRoaXMuZmlsZUZvcm1hdHMgPSBbdGhpcy5kZXNjcmlwdG9yLnVwbG9hZC5mb3JtYXRzXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmaWxlRm9ybWF0cyA9IHRoaXMuZGVzY3JpcHRvci51cGxvYWQ/LmZvcm1hdHM7XHJcbiAgICB0aGlzLmkxOG4gPSB7XHJcbiAgICAgIGFkZEZpbGU6IHRoaXMuZGVzY3JpcHRvci51cGxvYWQ/LnRpdGxlID8/ICdkb2t1bWVudHVtIGhvenrDoWFkw6FzYScsXHJcbiAgICAgIGJyb3dzZU9yRHJhZzogdGhpcy5kZXNjcmlwdG9yLnVwbG9hZD8uZGVzY3JpcHRpb24gPz8gJ3RhbGzDs3rDoXMgdmFneSBiZWjDunrDoXMnLFxyXG4gICAgICBmb3JtYXRzOiB0aGlzLmRlc2NyaXB0b3IudXBsb2FkPy5mb3JtYXRzID8/ICcnLFxyXG4gICAgICBtYXhTaXplOiB0aGlzLmRlc2NyaXB0b3IudXBsb2FkPy5tYXhTaXplID8/ICcnLFxyXG4gICAgICB1cGxvYWQ6IHRoaXMuZGVzY3JpcHRvci51cGxvYWQ/LnVwbG9hZEJ1dHRvblRpdGxlLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBUT0RPIHNldCBtYXggc2l6ZSBhbmQgZmlsZSBmb3JtYXRzIGJ5IFVpQWN0aW9uLnBhcmFtc1xyXG5cclxuICAgIGlmICh0aGlzLmRlc2NyaXB0b3JbdGhpcy5zZXJ2aWNlLmlucHV0VHlwZU5hbWVdKSB7XHJcbiAgICAgIHRoaXMuZGlhbG9nVHlwZSA9IHRoaXMuc2VydmljZS5pbnB1dFR5cGVOYW1lO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaWFsb2dUeXBlID0gdGhpcy5kZXNjcmlwdG9yLmlucHV0RGlhbG9nID8gJ2lucHV0RGlhbG9nJyA6ICdkaWFsb2cnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGl0bGUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvclt0aGlzLmRpYWxvZ1R5cGVdPy50aXRsZSA/PyAnRsOhamwgaG96esOhYWTDoXNhJztcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGdldFRleHQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvclt0aGlzLmRpYWxvZ1R5cGVdPy50ZXh0ID8/ICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuICBnZXRBY3Rpb25CdXR0b25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yW3RoaXMuZGlhbG9nVHlwZV0/LmFjdGlvbkJ1dHRvbi5jYXB0aW9uID8/ICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuICBnZXRBY3Rpb25CdXR0b25Db2xvcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZGVzY3JpcHRvcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yW3RoaXMuZGlhbG9nVHlwZV0/LmFjdGlvbkJ1dHRvbi5jb2xvciA/PyAnJztcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcbiAgZ2V0Q2FuY2VsQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvclt0aGlzLmRpYWxvZ1R5cGVdPy5jYW5jZWxCdXR0b24uY2FwdGlvbiA/PyAnJztcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcbiAgZ2V0Q2FuY2VsQnV0dG9uQ29sb3IoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvclt0aGlzLmRpYWxvZ1R5cGVdPy5jYW5jZWxCdXR0b24uY29sb3IgPz8gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICB1cGxvYWQoZmlsZXM6IGFueVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlcnZpY2Uub25TYXZlKGZpbGVzKTtcclxuICB9XHJcbiAgb25TZWxlY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy51cGxvYWRlZEZpbGVzID0gW107XHJcbiAgICBmb3IgKGxldCBmaWxlIG9mIGV2ZW50LmZpbGVzKSB7XHJcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKGZpbGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5oYXNGaWxlcyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBvblJlbW92ZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnVwbG9hZGVkRmlsZXMgPSBbXTtcclxuICAgIHRoaXMuaGFzRmlsZXMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHVwbG9hZEZpbGVzKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VydmljZS5vblNhdmUodGhpcy51cGxvYWRlZEZpbGVzKTtcclxuICB9XHJcblxyXG4gIGNhbmNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VydmljZS5jYW5jZWwoKTtcclxuICB9XHJcblxyXG4gIHVwbG9hZFJlY29yZGluZyhmaWxlOiBhbnkpIHtcclxuICAgIHRoaXMubG9hZEZpbGVzSW50b1dpZGdldChbZmlsZV0pO1xyXG4gICAgdGhpcy5oYXNGaWxlcyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRJbWFnZShmaWxlczogYW55KSB7XHJcbiAgICB0aGlzLmxvYWRGaWxlc0ludG9XaWRnZXQoZmlsZXMpO1xyXG4gICAgdGhpcy5oYXNGaWxlcyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBsb2FkRmlsZXNJbnRvV2lkZ2V0KGZpbGVzOiBGaWxlW10pIHtcclxuICAgIGlmIChDb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcgPT09IHRoaXMuY29tcExpYikge1xyXG4gICAgICBjb25zdCBkYXRhVHJhbnNmZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XHJcbiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZXMgPSBBcnJheS5mcm9tKHRoaXMuZmlsZVVwbG9hZFByaW1lLmZpbGVzKTtcclxuXHJcbiAgICAgIGV4aXN0aW5nRmlsZXMuZm9yRWFjaCgoZmlsZSkgPT4ge1xyXG4gICAgICAgIGRhdGFUcmFuc2Zlci5pdGVtcy5hZGQoZmlsZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgZGF0YVRyYW5zZmVyLml0ZW1zLmFkZChmaWxlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZmlsZUxpc3Q6IEZpbGVMaXN0ID0gZGF0YVRyYW5zZmVyLmZpbGVzO1xyXG5cclxuICAgICAgY29uc3QgZmFrZUV2ZW50ID0ge1xyXG4gICAgICAgIHRhcmdldDoge1xyXG4gICAgICAgICAgZmlsZXM6IGZpbGVMaXN0LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHlwZTogJ2NoYW5nZScsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLmZpbGVVcGxvYWRQcmltZS5vbkZpbGVTZWxlY3QoZmFrZUV2ZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsZVVwbG9hZE1hdGVyaWFsLmZpbGVzLnB1c2goLi4uZmlsZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd2lkZ2V0TmVlZGVkKHR5cGU6IFVwbG9hZFdpZGdldFR5cGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3I/LnVwbG9hZD8udXBsb2FkV2lkZ2V0cz8uaW5jbHVkZXModHlwZSkgPz8gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZEZpbGUoZmlsZTogRmlsZSkge1xyXG4gICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gdXJsO1xyXG4gICAgYS5kb3dubG9hZCA9IGZpbGUubmFtZTtcclxuICAgIGEuY2xpY2soKTtcclxuICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XHJcbiAgfVxyXG4gIHJlbW92ZUZpbGUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5maWxlVXBsb2FkUHJpbWUucmVtb3ZlVXBsb2FkZWRGaWxlKGluZGV4KTtcclxuICB9XHJcblxyXG4gIGZvcm1hdFNpemUoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCJztcclxuICAgIGNvbnN0IGsgPSAxMDI0O1xyXG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTtcclxuICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTtcclxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgxKSk7XHJcbiAgICByZXR1cm4gYCR7dmFsdWV9ICR7c2l6ZXNbaV19YDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZvbGRlck5hbWVEaWFsb2dDb250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyQ29udGFpbmVyXCI+XHJcbiAgICA8aDMgY2xhc3M9XCJjb2xvci1hY2NlbnQtNzAwXCI+XHJcbiAgICAgIHt7IGdldFRpdGxlKCkgfX1cclxuICAgIDwvaDM+XHJcbiAgICBAaWYoY29tcExpYiA9PT0gY29tcG9uZW50TGlicmFyeS5NQVRFUklBTCkge1xyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImNhbmNlbCgpXCI+XHJcbiAgICAgIDxzbWFydC1pY29uIFtjb2xvcl09XCIncHJpbWFyeSdcIiBbaWNvbl09XCInWCdcIj48L3NtYXJ0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1AZWxzZSB7XHJcbiAgICA8cC1idXR0b24gaWNvbj1cInBpIHBpLXRpbWVzXCIgW3JvdW5kZWRdPVwidHJ1ZVwiIFt0ZXh0XT1cInRydWVcIiAoY2xpY2spPVwiY2FuY2VsKClcIiAvPlxyXG4gICAgfVxyXG4gIDwvZGl2PlxyXG4gIDxwPlxyXG4gICAge3sgZ2V0VGV4dCgpIH19XHJcbiAgPC9wPlxyXG5cclxuICA8IS0tIElNQUdFIFRZUEUgV0lER0VUIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3aWRnZXROZWVkZWQodXBsb2FkV2lkZ2V0VHlwZS5JTUFHRSkgfHwgd2lkZ2V0TmVlZGVkKHVwbG9hZFdpZGdldFR5cGUuQUxMKVwiPlxyXG4gICAgPHBob3RvLWNhcHR1cmUtd2lkZ2V0XHJcbiAgICAgIFttYXhGaWxlU2l6ZV09XCJtYXhTaXplTWIgKiAxMDI0ICogMTAyNFwiXHJcbiAgICAgIChwaG90b0NhcHR1cmVkKT1cInVwbG9hZEltYWdlKCRldmVudClcIlxyXG4gICAgPlxyXG4gICAgPC9waG90by1jYXB0dXJlLXdpZGdldD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSBTT1VORCBUWVBFIFdJREdFVCAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwid2lkZ2V0TmVlZGVkKHVwbG9hZFdpZGdldFR5cGUuU09VTkQpIHx8IHdpZGdldE5lZWRlZCh1cGxvYWRXaWRnZXRUeXBlLkFMTClcIj5cclxuICAgIDx2b2ljZS1yZWNvcmQtd2lkZ2V0IChyZWNvcmRpbmdTYXZlZCk9XCJ1cGxvYWRSZWNvcmRpbmcoJGV2ZW50KVwiPiA8L3ZvaWNlLXJlY29yZC13aWRnZXQ+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIEBpZihjb21wTGliID09PSBjb21wb25lbnRMaWJyYXJ5LlBSSU1FTkcpIHtcclxuXHJcbiAgPHAtZmlsZVVwbG9hZFxyXG4gICAgI2ZpbGVVcGxvYWRQcmltZU5nXHJcbiAgICBuYW1lPVwiZmlsZXNbXVwiXHJcbiAgICB1cmw9XCJcIlxyXG4gICAgKG9uU2VuZCk9XCJ1cGxvYWRGaWxlcygkZXZlbnQpXCJcclxuICAgIChvblNlbGVjdCk9XCJvblNlbGVjdCgkZXZlbnQpXCJcclxuICAgIChvblJlbW92ZSk9XCJvblJlbW92ZSgkZXZlbnQpXCJcclxuICAgIFttdWx0aXBsZV09XCJpc011bHRpcGxlXCJcclxuICAgIFthY2NlcHRdPVwidGhpcy5kZXNjcmlwdG9yPy51cGxvYWQ/LmZvcm1hdHMgPz8gJydcIlxyXG4gICAgW21heEZpbGVTaXplXT1cIm1heFNpemVNYiAqIDEwMjQgKiAxMDI0XCJcclxuICAgIHVwbG9hZExhYmVsPVwiRmVsdMO2bHTDqXNcIlxyXG4gICAgY2FuY2VsTGFiZWw9XCJNw6lnc2VtXCJcclxuICAgIGNob29zZUxhYmVsPVwiVsOhbGFzenTDoXNcIlxyXG4gID5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb250ZW50XCIgKm5nSWY9XCIhaGFzRmlsZXMgJiYgIWlzTW9iaWxlKClcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZEZpZWxkXCI+XHJcbiAgICAgICAgPHNtYXJ0LWljb24gW2ljb25dPVwiJ3VwbG9hZCdcIj48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXNzYWdlXCI+SMO6enphIGlkZSBhIGbDoWpsb2thdC48L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmaWxlXCIgbGV0LWZpbGUgbGV0LWk9XCJpbmRleFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicC1maWxldXBsb2FkLWZpbGVcIj5cclxuICAgICAgICBAaWYoZmlsZS5vYmplY3RVUkwpe1xyXG4gICAgICAgIDxpbWcgcm9sZT1cInByZXNlbnRhdGlvblwiIFthbHRdPVwiZmlsZS5uYW1lXCIgW3NyY109XCJmaWxlLm9iamVjdFVSTFwiIHdpZHRoPVwiNTBcIiBoZWlnaHQ9XCI1MFwiIC8+XHJcbiAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWZpbGVcIiBzdHlsZT1cImZvbnQtc2l6ZTogMnJlbVwiPjwvaT5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLWZpbGUtZGF0YVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVEYXRhXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZU5hbWVcIj57eyBmaWxlLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsZVNpemVcIj57eyBmb3JtYXRTaXplKGZpbGUuc2l6ZSkgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZG93bmxvYWRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgZmlsZS1hY3Rpb25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRGaWxlKGZpbGUpXCJcclxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkRvd25sb2FkXCJcclxuICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcilcIlxyXG4gICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dCBmaWxlLWFjdGlvblwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWxlKGkpXCJcclxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZVwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6IHJnYigyMzksIDY4LCA2OClcIlxyXG4gICAgICAgICAgPjwvYnV0dG9uXHJcbiAgICAgICAgPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9wLWZpbGVVcGxvYWQ+XHJcblxyXG4gIH1AZWxzZXtcclxuXHJcbiAgPHNtYXJ0ZmlsZXVwbG9hZGVyXHJcbiAgICAjZmlsZVVwbG9hZE1hdGVyaWFsXHJcbiAgICBbaTE4bl09XCJpMThuXCJcclxuICAgIFtmaWxlRm9ybWF0c109XCJmaWxlRm9ybWF0c1wiXHJcbiAgICBbbWF4U2l6ZU1iXT1cIm1heFNpemVNYlwiXHJcbiAgICBbdXBsb2FkQ2FsbGJhY2tdPVwidXBsb2FkLmJpbmQodGhpcylcIlxyXG4gICAgW2lzTXVsdGlwbGVdPVwiaXNNdWx0aXBsZVwiXHJcbiAgPjwvc21hcnRmaWxldXBsb2FkZXI+XHJcbiAgfVxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZm9sZGVyTmFtZURpYWxvZ0J1dHRvbnNDb250YWluZXJcIj5cclxuICAgIDx1aS1hY3Rpb24tYnV0dG9uIFtkZXNjcmlwdG9yXT1cImNhbmNlbEJ1dHRvblwiIChhY3Rpb25DbGljayk9XCJjYW5jZWwoKVwiPjwvdWktYWN0aW9uLWJ1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktYWN0aW9uLWZpbGUtdXBsb2FkLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdWktYWN0aW9uL2RpYWxvZ3MvdWktYWN0aW9uLWZpbGUtdXBsb2FkLWRpYWxvZy91aS1hY3Rpb24tZmlsZS11cGxvYWQtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3ZpZXctY29udGV4dC9zbWFydC11aS1hY3Rpb24vZGlhbG9ncy91aS1hY3Rpb24tZmlsZS11cGxvYWQtZGlhbG9nL3VpLWFjdGlvbi1maWxlLXVwbG9hZC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFzQixNQUFNLGNBQWMsQ0FBQztBQUdwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7OztBQVN4RSxNQUFNLE9BQU8saUNBQWlDO0lBYTVDLFlBQzZDLE9BQXdDLEVBQ2pELE9BQXlCLEVBQ25ELE9BQWtDLEVBQ2xDLEdBQXNCO1FBSGEsWUFBTyxHQUFQLE9BQU8sQ0FBaUM7UUFDakQsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDbkQsWUFBTyxHQUFQLE9BQU8sQ0FBMkI7UUFDbEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFUaEMscUJBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFXbEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FB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LG9CQUFvQjtRQUNsQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBVTtRQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsTUFBTTtRQUNKLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0E5RlUsaUNBQWlDLGtCQWNsQyx5QkFBeUIsYUFDekIsaUJBQWlCO21HQWZoQixpQ0FBaUMseVNDYjlDLGc2QkE2QkE7OzRGRGhCYSxpQ0FBaUM7a0JBTDdDLFNBQVM7K0JBQ0Usa0NBQWtDOzswQkFrQnpDLE1BQU07MkJBQUMseUJBQXlCOzswQkFDaEMsTUFBTTsyQkFBQyxpQkFBaUI7aUhBZEssZUFBZTtzQkFBOUMsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBQ0csa0JBQWtCO3NCQUFsRCxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSWNvblBvc2l0aW9uLCBVaUFjdGlvbkJ1dHRvblR5cGUsIFVpQWN0aW9uRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uLy4uL2FwaSc7XHJcbmltcG9ydCB7IFVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi91aS1hY3Rpb24uZGVzY3JpcHRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVWlBY3Rpb25GaWxlVXBsb2FkRGlhbG9nU2VydmljZSB9IGZyb20gJy4vdWktYWN0aW9uLWZpbGUtdXBsb2FkLWRpYWxvZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ09NUE9ORU5UX0xJQlJBUlksIENvbXBvbmVudExpYnJhcnkgfSBmcm9tICcuLi8uLi8uLi9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWQgfSBmcm9tICdwcmltZW5nL2ZpbGV1cGxvYWQnO1xyXG5pbXBvcnQgeyBTbWFydGZpbGV1cGxvYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3NtYXJ0LWZvcm0vc21hcnRmaWxldXBsb2FkZXIvc21hcnRmaWxldXBsb2FkZXIuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXVpLWFjdGlvbi1maWxlLXVwbG9hZC1kaWFsb2cnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91aS1hY3Rpb24tZmlsZS11cGxvYWQtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi91aS1hY3Rpb24tZmlsZS11cGxvYWQtZGlhbG9nLmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpQWN0aW9uRmlsZVVwbG9hZERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZCgnZmlsZVVwbG9hZFByaW1lTmcnKSBmaWxlVXBsb2FkUHJpbWUhOiBGaWxlVXBsb2FkO1xyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVVcGxvYWRNYXRlcmlhbCcpIGZpbGVVcGxvYWRNYXRlcmlhbCE6IFNtYXJ0ZmlsZXVwbG9hZGVyQ29tcG9uZW50O1xyXG5cclxuICBjb2RlITogc3RyaW5nO1xyXG4gIGRpYWxvZ1R5cGUhOiAnZGlhbG9nJyB8ICdpbnB1dERpYWxvZycgfCAnaW5wdXQyRGlhbG9nJztcclxuXHJcbiAgZGVzY3JpcHRvcj86IFVpQWN0aW9uRGVzY3JpcHRvcjtcclxuICBjb21wb25lbnRMaWJyYXJ5ID0gQ29tcG9uZW50TGlicmFyeTtcclxuICBpc011bHRpcGxlPzogYm9vbGVhbjtcclxuXHJcbiAgY2FuY2VsQnV0dG9uITogVWlBY3Rpb25EZXNjcmlwdG9yO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoJ2ZpbGVVcGxvYWREaWFsb2dTZXJ2aWNlJykgcHJpdmF0ZSBzZXJ2aWNlOiBVaUFjdGlvbkZpbGVVcGxvYWREaWFsb2dTZXJ2aWNlLFxyXG4gICAgQEluamVjdChDT01QT05FTlRfTElCUkFSWSkgcHVibGljIGNvbXBMaWI6IENvbXBvbmVudExpYnJhcnksXHJcbiAgICBwcml2YXRlIG1hbmFnZXI6IFVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICAgIHRoaXMuY29kZSA9IHRoaXMuc2VydmljZS5hY3Rpb24uY29kZSE7XHJcbiAgICB0aGlzLnNldFVwKCk7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXJ2aWNlLl9kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmNhbmNlbCgpO1xyXG4gIH1cclxuXHJcbiAgaXNNb2JpbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gL2lQaG9uZXxpUGFkfGlQb2R8QW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzZXRVcCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuY2FuY2VsQnV0dG9uID0ge1xyXG4gICAgICB0aXRsZTogJ03DqWdzZScsXHJcbiAgICAgIHR5cGU6IFVpQWN0aW9uQnV0dG9uVHlwZS5SQUlTRUQsXHJcbiAgICAgIGljb246IHRoaXMuY29tcExpYiA9PT0gQ29tcG9uZW50TGlicmFyeS5QUklNRU5HID8gJ3RpbWVzJyA6ICdjbG9zZScsXHJcbiAgICAgIGljb25Qb3NpdGlvbjogSWNvblBvc2l0aW9uLlBSRSxcclxuICAgICAgY29sb3I6ICdwcmltYXJ5JyxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5kZXNjcmlwdG9yID0gYXdhaXQgdGhpcy5tYW5hZ2VyLmdldEFjdGlvbkRlc2NyaXB0b3IodGhpcy5zZXJ2aWNlLmFjdGlvbik7XHJcbiAgICB0aGlzLmlzTXVsdGlwbGUgPSB0aGlzLnNlcnZpY2UuaXNNdWx0aXBsZTtcclxuXHJcbiAgICBpZiAodGhpcy5kZXNjcmlwdG9yW3RoaXMuc2VydmljZS5pbnB1dFR5cGVOYW1lXSkge1xyXG4gICAgICB0aGlzLmRpYWxvZ1R5cGUgPSB0aGlzLnNlcnZpY2UuaW5wdXRUeXBlTmFtZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlhbG9nVHlwZSA9IHRoaXMuZGVzY3JpcHRvci5pbnB1dERpYWxvZyA/ICdpbnB1dERpYWxvZycgOiAnZGlhbG9nJztcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIGdldFRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5kZXNjcmlwdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3JbdGhpcy5kaWFsb2dUeXBlXT8udGl0bGUgPz8gJ0bDoWpsIGhvenrDoWFkw6FzYSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBnZXRUZXh0KCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5kZXNjcmlwdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3JbdGhpcy5kaWFsb2dUeXBlXT8udGV4dCA/PyAnJztcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcbiAgZ2V0QWN0aW9uQnV0dG9uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvclt0aGlzLmRpYWxvZ1R5cGVdPy5hY3Rpb25CdXR0b24uY2FwdGlvbiA/PyAnJztcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcbiAgZ2V0QWN0aW9uQnV0dG9uQ29sb3IoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRlc2NyaXB0b3IpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvclt0aGlzLmRpYWxvZ1R5cGVdPy5hY3Rpb25CdXR0b24uY29sb3IgPz8gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG4gIGdldENhbmNlbEJ1dHRvbkxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5kZXNjcmlwdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3JbdGhpcy5kaWFsb2dUeXBlXT8uY2FuY2VsQnV0dG9uLmNhcHRpb24gPz8gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG4gIGdldENhbmNlbEJ1dHRvbkNvbG9yKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5kZXNjcmlwdG9yKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3JbdGhpcy5kaWFsb2dUeXBlXT8uY2FuY2VsQnV0dG9uLmNvbG9yID8/ICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VydmljZS5vblNhdmUoZXZlbnQuZmlsZXMpO1xyXG4gIH1cclxuICBjYW5jZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlcnZpY2UuY2FuY2VsKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb2xkZXJOYW1lRGlhbG9nQ29udGFpbmVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlckNvbnRhaW5lclwiPlxyXG4gICAgPGgzIGNsYXNzPVwiY29sb3ItYWNjZW50LTcwMFwiPlxyXG4gICAgICB7eyBnZXRUaXRsZSgpIH19XHJcbiAgICA8L2gzPlxyXG4gICAgQGlmKGNvbXBMaWIgPT09IGNvbXBvbmVudExpYnJhcnkuTUFURVJJQUwpIHtcclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJjYW5jZWwoKVwiPlxyXG4gICAgICA8c21hcnQtaWNvbiBbY29sb3JdPVwiJ3ByaW1hcnknXCIgW2ljb25dPVwiJ1gnXCI+PC9zbWFydC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICB9QGVsc2Uge1xyXG4gICAgPHAtYnV0dG9uIGljb249XCJwaSBwaS10aW1lc1wiIFtyb3VuZGVkXT1cInRydWVcIiBbdGV4dF09XCJ0cnVlXCIgKGNsaWNrKT1cImNhbmNlbCgpXCIgLz5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuICA8cD5cclxuICAgIHt7IGdldFRleHQoKSB9fVxyXG4gIDwvcD5cclxuXHJcbiAgQGlmKGRlc2NyaXB0b3I/LnVwbG9hZCkge1xyXG4gIDxzbWFydC11cGxvYWQtd2lkZ2V0XHJcbiAgICBbdXBsb2FkRGVzY3JpcHRvcl09XCJkZXNjcmlwdG9yPy51cGxvYWQhXCJcclxuICAgIFtpc011bHRpcGxlXT1cImlzTXVsdGlwbGUgPz8gdHJ1ZVwiXHJcbiAgICAodXBsb2FkRmlsZXNFdmVudCk9XCJ1cGxvYWQoJGV2ZW50KVwiXHJcbiAgLz5cclxuICB9XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmb2xkZXJOYW1lRGlhbG9nQnV0dG9uc0NvbnRhaW5lclwiPlxyXG4gICAgPHVpLWFjdGlvbi1idXR0b24gW2Rlc2NyaXB0b3JdPVwiY2FuY2VsQnV0dG9uXCIgKGFjdGlvbkNsaWNrKT1cImNhbmNlbCgpXCI+PC91aS1hY3Rpb24tYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19