speechrecorderng 3.10.13 → 3.11.1

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 (99) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/speechrecorderng.mjs +204 -201
  3. package/fesm2022/speechrecorderng.mjs.map +1 -1
  4. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
  5. package/lib/spr.module.version.d.ts +1 -1
  6. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  7. package/lib/ui/responsive_component.d.ts +1 -1
  8. package/package.json +13 -15
  9. package/esm2022/lib/action/action.mjs +0 -73
  10. package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
  11. package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
  12. package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
  13. package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
  14. package/esm2022/lib/audio/audio_display.mjs +0 -118
  15. package/esm2022/lib/audio/audio_player.mjs +0 -238
  16. package/esm2022/lib/audio/capture/capture.mjs +0 -855
  17. package/esm2022/lib/audio/context.mjs +0 -79
  18. package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
  19. package/esm2022/lib/audio/format.mjs +0 -20
  20. package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
  21. package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
  22. package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
  23. package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
  24. package/esm2022/lib/audio/io/stream.mjs +0 -59
  25. package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
  26. package/esm2022/lib/audio/persistor.mjs +0 -81
  27. package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
  28. package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
  29. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  30. package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
  31. package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
  32. package/esm2022/lib/audio/playback/player.mjs +0 -402
  33. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  34. package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
  35. package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
  36. package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
  37. package/esm2022/lib/audio/ui/common.mjs +0 -19
  38. package/esm2022/lib/audio/ui/container.mjs +0 -414
  39. package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
  40. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  41. package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
  42. package/esm2022/lib/db/inddb.mjs +0 -120
  43. package/esm2022/lib/dsp/utils.mjs +0 -48
  44. package/esm2022/lib/environment/environment.defaults.mjs +0 -9
  45. package/esm2022/lib/io/BinaryReader.mjs +0 -93
  46. package/esm2022/lib/io/BinaryWriter.mjs +0 -80
  47. package/esm2022/lib/io/stream.mjs +0 -259
  48. package/esm2022/lib/math/2d/geometry.mjs +0 -28
  49. package/esm2022/lib/math/complex.mjs +0 -58
  50. package/esm2022/lib/math/dft.mjs +0 -196
  51. package/esm2022/lib/media/utils.mjs +0 -14
  52. package/esm2022/lib/net/uploader.mjs +0 -367
  53. package/esm2022/lib/recorder_component.mjs +0 -65
  54. package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
  55. package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
  56. package/esm2022/lib/speechrecorder/recording.mjs +0 -124
  57. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
  58. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  59. package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
  60. package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
  61. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  62. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
  63. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
  64. package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
  65. package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
  66. package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
  67. package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
  68. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  69. package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
  70. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
  71. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
  72. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
  73. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
  74. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
  75. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  76. package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
  77. package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
  78. package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
  79. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
  80. package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
  81. package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
  82. package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
  83. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  84. package/esm2022/lib/speechrecorderng.component.mjs +0 -392
  85. package/esm2022/lib/speechrecorderng.module.mjs +0 -97
  86. package/esm2022/lib/spr.config.mjs +0 -27
  87. package/esm2022/lib/spr.module.version.mjs +0 -2
  88. package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
  89. package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
  90. package/esm2022/lib/ui/message_dialog.mjs +0 -51
  91. package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
  92. package/esm2022/lib/ui/responsive_component.mjs +0 -24
  93. package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
  94. package/esm2022/lib/utils/ua-parser.mjs +0 -190
  95. package/esm2022/lib/utils/utils.mjs +0 -132
  96. package/esm2022/lib/utils/wake_lock.mjs +0 -114
  97. package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
  98. package/esm2022/public-api.mjs +0 -35
  99. package/esm2022/speechrecorderng.mjs +0 -5
@@ -1,264 +0,0 @@
1
- import { Observable } from "rxjs";
2
- export class BasicAudioSource {
3
- constructor() {
4
- this._ready = false;
5
- this.onReadyListeners = new Array();
6
- }
7
- addOnReadyListener(onReady) {
8
- // let alreadyAdded=false;
9
- // for(let or of this.onReadyListeners){
10
- // if(or===onReady){
11
- // alreadyAdded=true;
12
- // break;
13
- // }
14
- // }
15
- // if(!alreadyAdded) {
16
- // this.onReadyListeners.push(onReady);
17
- // }
18
- if (!(this.onReadyListeners.find((or) => or === onReady))) {
19
- this.onReadyListeners.push(onReady);
20
- }
21
- if (this._ready) {
22
- onReady();
23
- }
24
- }
25
- removeOnReadyListener(onReady) {
26
- this.onReadyListeners = this.onReadyListeners.filter((or) => or !== onReady);
27
- }
28
- ready() {
29
- this._ready = true;
30
- for (let onReady of this.onReadyListeners) {
31
- onReady.call(this);
32
- }
33
- }
34
- }
35
- export class AudioBufferSource extends BasicAudioSource {
36
- constructor(_audioBuffer) {
37
- super();
38
- this._audioBuffer = _audioBuffer;
39
- this._duration = this._audioBuffer.length / this._audioBuffer.sampleRate;
40
- this.ready();
41
- }
42
- get audioBuffer() {
43
- return this._audioBuffer;
44
- }
45
- get duration() {
46
- return this._duration;
47
- }
48
- get sampleRate() {
49
- return this._audioBuffer.sampleRate;
50
- }
51
- get numberOfChannels() {
52
- return this._audioBuffer.numberOfChannels;
53
- }
54
- get frameLen() {
55
- return this._audioBuffer.length;
56
- }
57
- sampleCounts() {
58
- return this._audioBuffer.numberOfChannels * this._audioBuffer.length;
59
- }
60
- audioInputStream() {
61
- return new AudioBufferInputStream(this._audioBuffer);
62
- }
63
- asyncAudioInputStream() {
64
- return null;
65
- }
66
- releaseAudioData() {
67
- return new Observable(subscriber => {
68
- subscriber.next();
69
- subscriber.complete();
70
- });
71
- }
72
- randomAccessAudioStream() {
73
- return new RandomAccessAudioBufferStream(this._audioBuffer);
74
- }
75
- }
76
- export class AudioDataHolder {
77
- get audioSource() {
78
- return this._audioSource;
79
- }
80
- get duration() {
81
- return this._duration;
82
- }
83
- constructor(_audioSource) {
84
- this._audioSource = _audioSource;
85
- this._numberOfChannels = 0;
86
- this._sampleRate = 0;
87
- this._frameLen = 0;
88
- this._duration = 0;
89
- if (this._audioSource) {
90
- this._numberOfChannels = this._audioSource.numberOfChannels;
91
- this._sampleRate = this._audioSource.sampleRate;
92
- this._frameLen = this._audioSource.frameLen;
93
- this._duration = this._frameLen / this._sampleRate;
94
- }
95
- }
96
- addOnReadyListener(onReady) {
97
- this._audioSource?.addOnReadyListener(onReady);
98
- }
99
- get sampleRate() {
100
- return this._sampleRate;
101
- }
102
- get numberOfChannels() {
103
- return this._numberOfChannels;
104
- }
105
- get frameLen() {
106
- return this._frameLen;
107
- }
108
- sampleCounts() {
109
- return this._numberOfChannels * this._frameLen;
110
- }
111
- randomAccessAudioStream() {
112
- if (this._audioSource) {
113
- return this._audioSource.randomAccessAudioStream();
114
- }
115
- else {
116
- throw Error('No audio source set');
117
- }
118
- }
119
- // private frames(framePos:number,frameLen:number,bufs:Float32Array[]):number{
120
- // let read=0;
121
- // if(this._buffer){
122
- // let toRead=frameLen;
123
- // if(this._buffer.length<framePos+frameLen){
124
- // toRead=this._buffer.length-framePos;
125
- // }
126
- // for(let ch=0;ch<bufs.length;ch++){
127
- // let chData=this._buffer.getChannelData(ch);
128
- // for(let i=0;i<toRead;i++){
129
- // bufs[ch][i]=chData[framePos+i];
130
- // }
131
- // }
132
- // read=toRead;
133
- // }else if(this._arrayBuffer){
134
- // read=this._arrayBuffer.frames(framePos,frameLen,bufs);
135
- // }
136
- // return read;
137
- // }
138
- audioInputStream() {
139
- // if(this._buffer){
140
- // return new AudioBufferInputStream(this._buffer);
141
- // }
142
- // if(this._arrayBuffer){
143
- // return new ArrayAudioBufferInputStream(this._arrayBuffer);
144
- // }
145
- // return null;
146
- if (this._audioSource) {
147
- return this._audioSource.audioInputStream();
148
- }
149
- else {
150
- return null;
151
- }
152
- }
153
- asyncAudioInputStream() {
154
- // if(this._inddbAudioBuffer){
155
- // return new IndexedDbAudioInputStream(this._inddbAudioBuffer);
156
- // }else if(this._netAudioBuffer){
157
- // return new NetAudioInputStream(this._netAudioBuffer);
158
- // }
159
- // return null;
160
- if (this._audioSource) {
161
- return this._audioSource.asyncAudioInputStream();
162
- }
163
- else {
164
- return null;
165
- }
166
- }
167
- // get buffer(): AudioBuffer | null {
168
- // return this._buffer;
169
- // }
170
- //
171
- // get arrayBuffer(): ArrayAudioBuffer | null {
172
- // return this._arrayBuffer;
173
- // }
174
- //
175
- // get inddbBuffer():IndexedDbAudioBuffer|null{
176
- // return this._inddbAudioBuffer;
177
- // }
178
- //
179
- // get netBuffer():NetAudioBuffer|null{
180
- // return this._netAudioBuffer;
181
- // }
182
- releaseAudioData() {
183
- return new Observable(subscriber => {
184
- //if (this._audioSource instanceof IndexedDbAudioBuffer) {
185
- if (this._audioSource) {
186
- this._audioSource.releaseAudioData().subscribe({
187
- next: () => {
188
- subscriber.next();
189
- },
190
- complete: () => {
191
- this._audioSource = null;
192
- subscriber.complete();
193
- }, error: (err) => {
194
- subscriber.error(err);
195
- }
196
- });
197
- }
198
- else {
199
- subscriber.next();
200
- subscriber.complete();
201
- }
202
- // }else{
203
- // // Others have no persistent respectively async deletable storage, they should be finally removed by the GC
204
- // //this._buffer=null;
205
- // //this._arrayBuffer=null;
206
- // this._audioSource=null;
207
- // subscriber.next();
208
- // subscriber.complete();
209
- // }
210
- });
211
- }
212
- }
213
- export class RandomAccessAudioBufferStream {
214
- constructor(_buffer) {
215
- this._buffer = _buffer;
216
- }
217
- close() {
218
- }
219
- framesObs(framePos, frameLen, bufs) {
220
- return new Observable(subscriber => {
221
- let read = 0;
222
- let toRead = frameLen;
223
- if (this._buffer.length < framePos + frameLen) {
224
- toRead = this._buffer.length - framePos;
225
- }
226
- for (let ch = 0; ch < bufs.length; ch++) {
227
- let chData = this._buffer.getChannelData(ch);
228
- for (let i = 0; i < toRead; i++) {
229
- bufs[ch][i] = chData[framePos + i];
230
- }
231
- }
232
- read = toRead;
233
- subscriber.next(read);
234
- subscriber.complete();
235
- });
236
- }
237
- }
238
- export class AudioBufferInputStream {
239
- constructor(audioBuffer) {
240
- this.audioBuffer = audioBuffer;
241
- this.framePos = 0;
242
- }
243
- close() {
244
- }
245
- skipFrames(n) {
246
- this.framePos += n;
247
- }
248
- read(buffers) {
249
- let read = 0;
250
- let toRead = buffers[0].length;
251
- if (this.framePos + toRead > this.audioBuffer.length) {
252
- toRead = this.audioBuffer.length - this.framePos;
253
- }
254
- for (let ch = 0; ch < buffers.length; ch++) {
255
- for (let i = 0; i < toRead; i++) {
256
- buffers[ch][i] = this.audioBuffer.getChannelData(ch)[this.framePos + i];
257
- }
258
- }
259
- read = toRead;
260
- this.framePos += toRead;
261
- return read;
262
- }
263
- }
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fZGF0YV9ob2xkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vYXVkaW9fZGF0YV9ob2xkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQWlCaEMsTUFBTSxPQUFnQixnQkFBZ0I7SUFBdEM7UUFDWSxXQUFNLEdBQVMsS0FBSyxDQUFDO1FBQ3JCLHFCQUFnQixHQUFxQixJQUFJLEtBQUssRUFBYyxDQUFDO0lBbUR6RSxDQUFDO0lBakRDLGtCQUFrQixDQUFDLE9BQXFCO1FBQ3RDLDBCQUEwQjtRQUMxQix3Q0FBd0M7UUFDeEMsc0JBQXNCO1FBQ3RCLHlCQUF5QjtRQUN6QixhQUFhO1FBQ2IsTUFBTTtRQUNOLElBQUk7UUFDSixzQkFBc0I7UUFDdEIseUNBQXlDO1FBQ3pDLElBQUk7UUFFSixJQUFHLENBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQSxFQUFFLEtBQUcsT0FBTyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUcsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFDO1lBQ2QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLE9BQXFCO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQSxFQUFFLEtBQUcsT0FBTyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxHQUFDLElBQUksQ0FB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QUFJLENBQUM7SUFDZCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW0sIEZsb2F0MzJBcnJheUlucHV0U3RyZWFtfSBmcm9tIFwiLi4vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9Tb3VyY2Uge1xyXG4gIGdldCBkdXJhdGlvbigpOm51bWJlcjtcclxuICBnZXQgc2FtcGxlUmF0ZSgpOiBudW1iZXI7XHJcbiAgZ2V0IG51bWJlck9mQ2hhbm5lbHMoKTogbnVtYmVyO1xyXG4gIGdldCBmcmFtZUxlbigpOiBudW1iZXI7XHJcbiAgc2FtcGxlQ291bnRzKCk6IG51bWJlcjtcclxuICBhdWRpb0lucHV0U3RyZWFtKCk6IEZsb2F0MzJBcnJheUlucHV0U3RyZWFtIHwgbnVsbDtcclxuICBhc3luY0F1ZGlvSW5wdXRTdHJlYW0oKTogQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGw7XHJcbiAgcmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0oKTpSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbTtcclxuICByZWxlYXNlQXVkaW9EYXRhKCk6IE9ic2VydmFibGU8dm9pZD47XHJcbiAgYWRkT25SZWFkeUxpc3RlbmVyKG9uUmVhZHk6KCgpPT52b2lkKXxudWxsKTp2b2lkO1xyXG4gIHJlbW92ZU9uUmVhZHlMaXN0ZW5lcihvblJlYWR5OigoKT0+dm9pZCl8bnVsbCk6dm9pZDtcclxuICByZWFkeSgpOnZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNpY0F1ZGlvU291cmNlIGltcGxlbWVudHMgQXVkaW9Tb3VyY2V7XHJcbiAgcHJvdGVjdGVkIF9yZWFkeTpib29sZWFuPWZhbHNlO1xyXG4gIHByb3RlY3RlZCBvblJlYWR5TGlzdGVuZXJzOkFycmF5PCgoKSA9PiB2b2lkKT49bmV3IEFycmF5PCgpID0+IHZvaWQ+KCk7XHJcblxyXG4gIGFkZE9uUmVhZHlMaXN0ZW5lcihvblJlYWR5OiAoKCkgPT4gdm9pZCkpOiB2b2lkIHtcclxuICAgIC8vIGxldCBhbHJlYWR5QWRkZWQ9ZmFsc2U7XHJcbiAgICAvLyBmb3IobGV0IG9yIG9mIHRoaXMub25SZWFkeUxpc3RlbmVycyl7XHJcbiAgICAvLyAgIGlmKG9yPT09b25SZWFkeSl7XHJcbiAgICAvLyAgICAgYWxyZWFkeUFkZGVkPXRydWU7XHJcbiAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGlmKCFhbHJlYWR5QWRkZWQpIHtcclxuICAgIC8vICAgdGhpcy5vblJlYWR5TGlzdGVuZXJzLnB1c2gob25SZWFkeSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgaWYoISAodGhpcy5vblJlYWR5TGlzdGVuZXJzLmZpbmQoKG9yKT0+b3I9PT1vblJlYWR5KSkpe1xyXG4gICAgICB0aGlzLm9uUmVhZHlMaXN0ZW5lcnMucHVzaChvblJlYWR5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLl9yZWFkeSl7XHJcbiAgICAgIG9uUmVhZHkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZU9uUmVhZHlMaXN0ZW5lcihvblJlYWR5OiAoKCkgPT4gdm9pZCkpOnZvaWQge1xyXG4gICAgdGhpcy5vblJlYWR5TGlzdGVuZXJzPXRoaXMub25SZWFkeUxpc3RlbmVycy5maWx0ZXIoKG9yKT0+b3IhPT1vblJlYWR5KTtcclxuICB9XHJcblxyXG4gIHJlYWR5KCk6dm9pZHtcclxuICAgIHRoaXMuX3JlYWR5PXRydWU7XHJcbiAgICBmb3IobGV0IG9uUmVhZHkgb2YgdGhpcy5vblJlYWR5TGlzdGVuZXJzKXtcclxuICAgICAgb25SZWFkeS5jYWxsKHRoaXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWJzdHJhY3QgYXN5bmNBdWRpb0lucHV0U3RyZWFtKCk6IEFzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW0gfCBudWxsO1xyXG5cclxuICBhYnN0cmFjdCBhdWRpb0lucHV0U3RyZWFtKCk6IEZsb2F0MzJBcnJheUlucHV0U3RyZWFtIHwgbnVsbDtcclxuXHJcbiAgYWJzdHJhY3QgIGdldCBkdXJhdGlvbigpOiBudW1iZXI7XHJcblxyXG4gIGFic3RyYWN0IGdldCBmcmFtZUxlbigpOiBudW1iZXI7XHJcblxyXG4gIGFic3RyYWN0IGdldCBudW1iZXJPZkNoYW5uZWxzKCk6IG51bWJlcjtcclxuXHJcbiAgYWJzdHJhY3QgcmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0oKTogUmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0gO1xyXG5cclxuICBhYnN0cmFjdCByZWxlYXNlQXVkaW9EYXRhKCk6IE9ic2VydmFibGU8dm9pZD4gO1xyXG5cclxuICBhYnN0cmFjdCBzYW1wbGVDb3VudHMoKTogbnVtYmVyO1xyXG5cclxuICBhYnN0cmFjdCBnZXQgc2FtcGxlUmF0ZSgpOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0J1ZmZlclNvdXJjZSBleHRlbmRzIEJhc2ljQXVkaW9Tb3VyY2V7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfZHVyYXRpb246bnVtYmVyO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2F1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5fZHVyYXRpb249dGhpcy5fYXVkaW9CdWZmZXIubGVuZ3RoL3RoaXMuX2F1ZGlvQnVmZmVyLnNhbXBsZVJhdGU7XHJcbiAgICB0aGlzLnJlYWR5KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaW9CdWZmZXIoKTogQXVkaW9CdWZmZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1ZGlvQnVmZmVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGR1cmF0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcclxuICAgIH1cclxuICAgIGdldCBzYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1ZGlvQnVmZmVyLnNhbXBsZVJhdGU7XHJcbiAgICB9XHJcbiAgICBnZXQgbnVtYmVyT2ZDaGFubmVscygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzO1xyXG4gICAgfVxyXG4gICAgZ2V0IGZyYW1lTGVuKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1ZGlvQnVmZmVyLmxlbmd0aDtcclxuICAgIH1cclxuICAgIHNhbXBsZUNvdW50cygpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gdGhpcy5fYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyp0aGlzLl9hdWRpb0J1ZmZlci5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBhdWRpb0lucHV0U3RyZWFtKCk6IEZsb2F0MzJBcnJheUlucHV0U3RyZWFtIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBBdWRpb0J1ZmZlcklucHV0U3RyZWFtKHRoaXMuX2F1ZGlvQnVmZmVyKTtcclxuICAgIH1cclxuICAgIGFzeW5jQXVkaW9JbnB1dFN0cmVhbSgpOiBBc3luY0Zsb2F0MzJBcnJheUlucHV0U3RyZWFtIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZWxlYXNlQXVkaW9EYXRhKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4ge1xyXG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgcmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0oKTogUmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0ge1xyXG4gICAgcmV0dXJuIG5ldyBSYW5kb21BY2Nlc3NBdWRpb0J1ZmZlclN0cmVhbSh0aGlzLl9hdWRpb0J1ZmZlcik7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFte1xyXG4gIGZyYW1lc09icyhmcmFtZVBvczpudW1iZXIsZnJhbWVMZW46bnVtYmVyLGJ1ZnM6RmxvYXQzMkFycmF5W10pOk9ic2VydmFibGU8bnVtYmVyPjtcclxuICBjbG9zZSgpOnZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0RhdGFIb2xkZXJ7XHJcbiAgZ2V0IGF1ZGlvU291cmNlKCk6IEF1ZGlvU291cmNlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXVkaW9Tb3VyY2U7XHJcbiAgfVxyXG4gIGdldCBkdXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfbnVtYmVyT2ZDaGFubmVsczpudW1iZXI9MDtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9zYW1wbGVSYXRlOm51bWJlcj0wO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZyYW1lTGVuOm51bWJlcj0wO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2R1cmF0aW9uOm51bWJlcj0wO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hdWRpb1NvdXJjZTpBdWRpb1NvdXJjZXxudWxsKSB7XHJcbiAgICBpZih0aGlzLl9hdWRpb1NvdXJjZSkge1xyXG4gICAgICB0aGlzLl9udW1iZXJPZkNoYW5uZWxzID0gdGhpcy5fYXVkaW9Tb3VyY2UubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgdGhpcy5fc2FtcGxlUmF0ZSA9IHRoaXMuX2F1ZGlvU291cmNlLnNhbXBsZVJhdGU7XHJcbiAgICAgIHRoaXMuX2ZyYW1lTGVuID0gdGhpcy5fYXVkaW9Tb3VyY2UuZnJhbWVMZW47XHJcbiAgICAgIHRoaXMuX2R1cmF0aW9uID0gdGhpcy5fZnJhbWVMZW4gLyB0aGlzLl9zYW1wbGVSYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkT25SZWFkeUxpc3RlbmVyKG9uUmVhZHk6KCgpPT52b2lkKXxudWxsKTp2b2lke1xyXG4gICAgdGhpcy5fYXVkaW9Tb3VyY2U/LmFkZE9uUmVhZHlMaXN0ZW5lcihvblJlYWR5KTtcclxuICB9XHJcblxyXG4gIGdldCBzYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcbiAgZ2V0IG51bWJlck9mQ2hhbm5lbHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9udW1iZXJPZkNoYW5uZWxzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZyYW1lTGVuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZnJhbWVMZW47XHJcbiAgfVxyXG5cclxuICBzYW1wbGVDb3VudHMoKTpudW1iZXJ7XHJcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZDaGFubmVscyp0aGlzLl9mcmFtZUxlbjtcclxuICB9XHJcblxyXG4gIHJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtKCk6UmFuZG9tQWNjZXNzQXVkaW9TdHJlYW17XHJcblxyXG4gICAgICBpZih0aGlzLl9hdWRpb1NvdXJjZSl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1ZGlvU291cmNlLnJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtKCk7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICB0aHJvdyBFcnJvcignTm8gYXVkaW8gc291cmNlIHNldCcpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gcHJpdmF0ZSBmcmFtZXMoZnJhbWVQb3M6bnVtYmVyLGZyYW1lTGVuOm51bWJlcixidWZzOkZsb2F0MzJBcnJheVtdKTpudW1iZXJ7XHJcbiAgLy8gICBsZXQgcmVhZD0wO1xyXG4gIC8vICAgaWYodGhpcy5fYnVmZmVyKXtcclxuICAvLyAgICAgbGV0IHRvUmVhZD1mcmFtZUxlbjtcclxuICAvLyAgICAgaWYodGhpcy5fYnVmZmVyLmxlbmd0aDxmcmFtZVBvcytmcmFtZUxlbil7XHJcbiAgLy8gICAgICAgdG9SZWFkPXRoaXMuX2J1ZmZlci5sZW5ndGgtZnJhbWVQb3M7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgZm9yKGxldCBjaD0wO2NoPGJ1ZnMubGVuZ3RoO2NoKyspe1xyXG4gIC8vICAgICAgIGxldCBjaERhdGE9dGhpcy5fYnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKTtcclxuICAvLyAgICAgICBmb3IobGV0IGk9MDtpPHRvUmVhZDtpKyspe1xyXG4gIC8vICAgICAgICAgYnVmc1tjaF1baV09Y2hEYXRhW2ZyYW1lUG9zK2ldO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgICByZWFkPXRvUmVhZDtcclxuICAvLyAgIH1lbHNlIGlmKHRoaXMuX2FycmF5QnVmZmVyKXtcclxuICAvLyAgICAgcmVhZD10aGlzLl9hcnJheUJ1ZmZlci5mcmFtZXMoZnJhbWVQb3MsZnJhbWVMZW4sYnVmcyk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gcmVhZDtcclxuICAvLyB9XHJcblxyXG4gIGF1ZGlvSW5wdXRTdHJlYW0oKTpGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbXxudWxse1xyXG4gICAgLy8gaWYodGhpcy5fYnVmZmVyKXtcclxuICAgIC8vICAgcmV0dXJuIG5ldyBBdWRpb0J1ZmZlcklucHV0U3RyZWFtKHRoaXMuX2J1ZmZlcik7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBpZih0aGlzLl9hcnJheUJ1ZmZlcil7XHJcbiAgICAvLyAgIHJldHVybiBuZXcgQXJyYXlBdWRpb0J1ZmZlcklucHV0U3RyZWFtKHRoaXMuX2FycmF5QnVmZmVyKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHJldHVybiBudWxsO1xyXG4gICAgaWYodGhpcy5fYXVkaW9Tb3VyY2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2F1ZGlvU291cmNlLmF1ZGlvSW5wdXRTdHJlYW0oKTtcclxuICAgIH1lbHNle1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jQXVkaW9JbnB1dFN0cmVhbSgpOiBBc3luY0Zsb2F0MzJBcnJheUlucHV0U3RyZWFtfG51bGx7XHJcbiAgICAvLyBpZih0aGlzLl9pbmRkYkF1ZGlvQnVmZmVyKXtcclxuICAgIC8vICAgcmV0dXJuIG5ldyBJbmRleGVkRGJBdWRpb0lucHV0U3RyZWFtKHRoaXMuX2luZGRiQXVkaW9CdWZmZXIpO1xyXG4gICAgLy8gfWVsc2UgaWYodGhpcy5fbmV0QXVkaW9CdWZmZXIpe1xyXG4gICAgLy8gICByZXR1cm4gbmV3IE5ldEF1ZGlvSW5wdXRTdHJlYW0odGhpcy5fbmV0QXVkaW9CdWZmZXIpO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gcmV0dXJuIG51bGw7XHJcblxyXG4gICAgaWYodGhpcy5fYXVkaW9Tb3VyY2UpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2F1ZGlvU291cmNlLmFzeW5jQXVkaW9JbnB1dFN0cmVhbSgpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IGJ1ZmZlcigpOiBBdWRpb0J1ZmZlciB8IG51bGwge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2J1ZmZlcjtcclxuICAvLyB9XHJcbiAgLy9cclxuICAvLyBnZXQgYXJyYXlCdWZmZXIoKTogQXJyYXlBdWRpb0J1ZmZlciB8IG51bGwge1xyXG4gIC8vICAgcmV0dXJuIHRoaXMuX2FycmF5QnVmZmVyO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGdldCBpbmRkYkJ1ZmZlcigpOkluZGV4ZWREYkF1ZGlvQnVmZmVyfG51bGx7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5faW5kZGJBdWRpb0J1ZmZlcjtcclxuICAvLyB9XHJcbiAgLy9cclxuICAvLyBnZXQgbmV0QnVmZmVyKCk6TmV0QXVkaW9CdWZmZXJ8bnVsbHtcclxuICAvLyAgIHJldHVybiB0aGlzLl9uZXRBdWRpb0J1ZmZlcjtcclxuICAvLyB9XHJcblxyXG4gIHJlbGVhc2VBdWRpb0RhdGEoKTpPYnNlcnZhYmxlPHZvaWQ+e1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHZvaWQ+KHN1YnNjcmliZXIgPT4ge1xyXG4gICAgICAvL2lmICh0aGlzLl9hdWRpb1NvdXJjZSBpbnN0YW5jZW9mICBJbmRleGVkRGJBdWRpb0J1ZmZlcikge1xyXG4gICAgICBpZih0aGlzLl9hdWRpb1NvdXJjZSkge1xyXG4gICAgICAgIHRoaXMuX2F1ZGlvU291cmNlLnJlbGVhc2VBdWRpb0RhdGEoKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9hdWRpb1NvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIH0sIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIH1lbHNle1xyXG4gICAgICAvLyAgIC8vIE90aGVycyBoYXZlIG5vIHBlcnNpc3RlbnQgcmVzcGVjdGl2ZWx5IGFzeW5jIGRlbGV0YWJsZSBzdG9yYWdlLCB0aGV5IHNob3VsZCBiZSBmaW5hbGx5IHJlbW92ZWQgYnkgdGhlIEdDXHJcbiAgICAgIC8vICAgLy90aGlzLl9idWZmZXI9bnVsbDtcclxuICAgICAgLy8gICAvL3RoaXMuX2FycmF5QnVmZmVyPW51bGw7XHJcbiAgICAgIC8vICAgdGhpcy5fYXVkaW9Tb3VyY2U9bnVsbDtcclxuICAgICAgLy8gICBzdWJzY3JpYmVyLm5leHQoKTtcclxuICAgICAgLy8gICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgIC8vIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSYW5kb21BY2Nlc3NBdWRpb0J1ZmZlclN0cmVhbSBpbXBsZW1lbnRzIFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFte1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9idWZmZXI6QXVkaW9CdWZmZXIpIHtcclxuICB9XHJcblxyXG4gIGNsb3NlKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgZnJhbWVzT2JzKGZyYW1lUG9zOiBudW1iZXIsIGZyYW1lTGVuOiBudW1iZXIsIGJ1ZnM6IEZsb2F0MzJBcnJheVtdKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuXHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8bnVtYmVyPihzdWJzY3JpYmVyID0+IHtcclxuICAgICAgbGV0IHJlYWQ9MDtcclxuICAgICAgICBsZXQgdG9SZWFkPWZyYW1lTGVuO1xyXG4gICAgICAgIGlmKHRoaXMuX2J1ZmZlci5sZW5ndGg8ZnJhbWVQb3MrZnJhbWVMZW4pe1xyXG4gICAgICAgICAgdG9SZWFkPXRoaXMuX2J1ZmZlci5sZW5ndGgtZnJhbWVQb3M7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvcihsZXQgY2g9MDtjaDxidWZzLmxlbmd0aDtjaCsrKXtcclxuICAgICAgICAgIGxldCBjaERhdGE9dGhpcy5fYnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKTtcclxuICAgICAgICAgIGZvcihsZXQgaT0wO2k8dG9SZWFkO2krKyl7XHJcbiAgICAgICAgICAgIGJ1ZnNbY2hdW2ldPWNoRGF0YVtmcmFtZVBvcytpXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmVhZD10b1JlYWQ7XHJcblxyXG4gICAgICAgIHN1YnNjcmliZXIubmV4dChyZWFkKTtcclxuICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0J1ZmZlcklucHV0U3RyZWFtIGltcGxlbWVudHMgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcbiAgcHJpdmF0ZSBmcmFtZVBvcz0wO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyKSB7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHNraXBGcmFtZXMobjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmZyYW1lUG9zKz1uO1xyXG4gIH1cclxuXHJcbiAgcmVhZChidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogbnVtYmVyIHtcclxuICAgIGxldCByZWFkPTA7XHJcbiAgICBsZXQgdG9SZWFkPWJ1ZmZlcnNbMF0ubGVuZ3RoO1xyXG4gICAgaWYodGhpcy5mcmFtZVBvcyt0b1JlYWQ+dGhpcy5hdWRpb0J1ZmZlci5sZW5ndGgpe1xyXG4gICAgICB0b1JlYWQ9dGhpcy5hdWRpb0J1ZmZlci5sZW5ndGgtdGhpcy5mcmFtZVBvcztcclxuICAgIH1cclxuICAgIGZvcihsZXQgY2g9MDtjaDxidWZmZXJzLmxlbmd0aDtjaCsrKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9SZWFkOyBpKyspIHtcclxuICAgICAgICBidWZmZXJzW2NoXVtpXT10aGlzLmF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKVt0aGlzLmZyYW1lUG9zK2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZWFkPXRvUmVhZDtcclxuICAgIHRoaXMuZnJhbWVQb3MrPXRvUmVhZDtcclxuICAgIHJldHVybiByZWFkO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -1,118 +0,0 @@
1
- import { Component, ViewChild, Input, } from '@angular/core';
2
- import { Action } from "../action/action";
3
- import { AudioDisplayScrollPane } from "./ui/audio_display_scroll_pane";
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "./ui/audio_display_scroll_pane";
6
- import * as i2 from "./ui/audio_display_control";
7
- export class AudioDisplay {
8
- constructor(ref, eRef) {
9
- this.ref = ref;
10
- this.eRef = eRef;
11
- this._audioClip = null;
12
- //console.log("constructor: "+this.ac);
13
- this.parentE = this.eRef.nativeElement;
14
- this.playStartAction = new Action("Start");
15
- this.playSelectionAction = new Action("Play selected");
16
- this.playStopAction = new Action("Stop");
17
- this.status = "Player created.";
18
- }
19
- ngOnInit() {
20
- this.zoomSelectedAction = this.audioDisplayScrollPane.zoomSelectedAction;
21
- this.zoomFitToPanelAction = this.audioDisplayScrollPane.zoomFitToPanelAction;
22
- this.zoomOutAction = this.audioDisplayScrollPane.zoomOutAction;
23
- this.zoomInAction = this.audioDisplayScrollPane.zoomInAction;
24
- }
25
- ngAfterViewInit() {
26
- this.layout();
27
- let heightListener = new MutationObserver((mrs, mo) => {
28
- mrs.forEach((mr) => {
29
- if ('attributes' === mr.type && ('class' === mr.attributeName || 'style' === mr.attributeName)) {
30
- this.layout();
31
- }
32
- });
33
- });
34
- heightListener.observe(this.parentE, { attributes: true, childList: true, characterData: true });
35
- }
36
- layout() {
37
- this.audioDisplayScrollPane.layout();
38
- }
39
- started() {
40
- console.log("Play started");
41
- this.status = 'Playing...';
42
- }
43
- set audioData(audioData) {
44
- this.audioDisplayScrollPane.audioData = audioData;
45
- if (this.playStartAction) {
46
- console.debug("Play start action (by AudioDisplay::set audioData) disabled: " + (audioData == null));
47
- this.playStartAction.disabled = (audioData == null);
48
- }
49
- }
50
- set audioClip(audioClip) {
51
- //let audioData:AudioBuffer|null=null;
52
- let sel = null;
53
- if (audioClip) {
54
- //audioData=audioClip.audioDataHolder.buffer;
55
- sel = audioClip.selection;
56
- }
57
- this._audioClip = audioClip;
58
- this.audioDisplayScrollPane.audioClip = audioClip;
59
- //this.playStartAction.disabled = (audioData!==null)
60
- }
61
- get audioClip() {
62
- return this._audioClip;
63
- }
64
- set playFramePosition(playFramePosition) {
65
- this.audioDisplayScrollPane.playFramePosition = playFramePosition;
66
- }
67
- error() {
68
- this.status = 'ERROR';
69
- }
70
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplay, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
71
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: AudioDisplay, selector: "app-audiodisplay", inputs: { playStartAction: "playStartAction", playStopAction: "playStopAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", audioData: "audioData", audioClip: "audioClip" }, viewQueries: [{ propertyName: "audioDisplayScrollPane", first: true, predicate: AudioDisplayScrollPane, descendants: true, static: true }], ngImport: i0, template: `
72
-
73
- <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
74
-
75
- <audio-display-control [audioClip]="audioClip"
76
- [playStartAction]="playStartAction"
77
- [playSelectionAction]="playSelectionAction"
78
- [playStopAction]="playStopAction"
79
- [autoPlayOnSelectToggleAction]="autoPlayOnSelectToggleAction"
80
- [zoomInAction]="zoomInAction"
81
- [zoomOutAction]="zoomOutAction"
82
- [zoomSelectedAction]="zoomSelectedAction"
83
- [zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control>
84
- `, isInline: true, styles: [":host{display:flex;flex-direction:column;position:absolute;bottom:0;height:100%;width:100%;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#e6e6e6}\n", "legend{margin-left:1em;padding:.2em .8em;font-size:.8em}\n", "fieldset{border:1px darkgray solid}\n"], dependencies: [{ kind: "component", type: i1.AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { kind: "component", type: i2.AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }] }); }
85
- }
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplay, decorators: [{
87
- type: Component,
88
- args: [{ selector: 'app-audiodisplay', template: `
89
-
90
- <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
91
-
92
- <audio-display-control [audioClip]="audioClip"
93
- [playStartAction]="playStartAction"
94
- [playSelectionAction]="playSelectionAction"
95
- [playStopAction]="playStopAction"
96
- [autoPlayOnSelectToggleAction]="autoPlayOnSelectToggleAction"
97
- [zoomInAction]="zoomInAction"
98
- [zoomOutAction]="zoomOutAction"
99
- [zoomSelectedAction]="zoomSelectedAction"
100
- [zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control>
101
- `, styles: [":host{display:flex;flex-direction:column;position:absolute;bottom:0;height:100%;width:100%;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#e6e6e6}\n", "legend{margin-left:1em;padding:.2em .8em;font-size:.8em}\n", "fieldset{border:1px darkgray solid}\n"] }]
102
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { playStartAction: [{
103
- type: Input
104
- }], playStopAction: [{
105
- type: Input
106
- }], playSelectionAction: [{
107
- type: Input
108
- }], autoPlayOnSelectToggleAction: [{
109
- type: Input
110
- }], audioDisplayScrollPane: [{
111
- type: ViewChild,
112
- args: [AudioDisplayScrollPane, { static: true }]
113
- }], audioData: [{
114
- type: Input
115
- }], audioClip: [{
116
- type: Input
117
- }] } });
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fZGlzcGxheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9hdWRpb19kaXNwbGF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUVNLEtBQUssR0FDdkIsTUFBTSxlQUFlLENBQUE7QUFHdEIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDOzs7O0FBNEN0RSxNQUFNLE9BQU8sWUFBWTtJQTRCdkIsWUFBb0IsR0FBc0IsRUFBUyxJQUFlO1FBQTlDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBVztRQXpCMUQsZUFBVSxHQUFnQixJQUFJLENBQUE7UUEwQnBDLHVDQUF1QztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLG1CQUFtQixHQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBQyxpQkFBaUIsQ0FBQztJQUVoQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsR0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLENBQUE7UUFDdEUsSUFBSSxDQUFDLG9CQUFvQixHQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQTtRQUMxRSxJQUFJLENBQUMsYUFBYSxHQUFDLElBQUks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QVM7c0JBRFosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIEFmdGVyVmlld0luaXQsIElucHV0LCBPbkluaXQsIEVsZW1lbnRSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuXHJcbmltcG9ydCB7QXVkaW9DbGlwLCBTZWxlY3Rpb259IGZyb20gJy4vcGVyc2lzdG9yJ1xyXG5pbXBvcnQge0FjdGlvbn0gZnJvbSBcIi4uL2FjdGlvbi9hY3Rpb25cIjtcclxuaW1wb3J0IHtBdWRpb0Rpc3BsYXlTY3JvbGxQYW5lfSBmcm9tIFwiLi91aS9hdWRpb19kaXNwbGF5X3Njcm9sbF9wYW5lXCI7XHJcbmltcG9ydCB7QXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvZGlzcGxheScsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcblxyXG4gICAgPGF1ZGlvLWRpc3BsYXktc2Nyb2xsLXBhbmUgI2F1ZGlvRGlzcGxheVNjcm9sbFBhbmU+PC9hdWRpby1kaXNwbGF5LXNjcm9sbC1wYW5lPlxyXG5cclxuICAgIDxhdWRpby1kaXNwbGF5LWNvbnRyb2wgW2F1ZGlvQ2xpcF09XCJhdWRpb0NsaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwicGxheVN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVNlbGVjdGlvbkFjdGlvbl09XCJwbGF5U2VsZWN0aW9uQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJwbGF5U3RvcEFjdGlvblwiXHJcbiAgICBbYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbl09XCJhdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXCJcclxuICAgIFt6b29tSW5BY3Rpb25dPVwiem9vbUluQWN0aW9uXCJcclxuICAgIFt6b29tT3V0QWN0aW9uXT1cInpvb21PdXRBY3Rpb25cIlxyXG4gICAgW3pvb21TZWxlY3RlZEFjdGlvbl09XCJ6b29tU2VsZWN0ZWRBY3Rpb25cIlxyXG4gICAgW3pvb21GaXRUb1BhbmVsQWN0aW9uXT1cInpvb21GaXRUb1BhbmVsQWN0aW9uXCI+PC9hdWRpby1kaXNwbGF5LWNvbnRyb2w+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgICAgYDpob3N0IHtcclxuICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgICAgICAgYm90dG9tOiAwcHg7XHJcbiAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgICAgICAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgICAgICAgICAgei1pbmRleDogNTtcclxuICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIzMCwgMjMwLCAyMzAsIDEuMClcclxuICAgICAgICAgICB9YCxgXHJcbiAgICAgICAgICBsZWdlbmR7XHJcbiAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDFlbTsgcGFkZGluZzogMC4yZW0gMC44ZW07Zm9udC1zaXplOiAwLjhlbTtcclxuICAgICAgfWAsYFxyXG4gICAgICAgIGZpZWxkc2V0e1xyXG4gICAgICAgICAgICBib3JkZXI6IDFweCBkYXJrZ3JheSBzb2xpZFxyXG4gICAgICB9XHJcbiAgICAgIGBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaW9EaXNwbGF5IGltcGxlbWVudHMgT25Jbml0LEFmdGVyVmlld0luaXQge1xyXG5cclxuICBwYXJlbnRFOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIF9hdWRpb0NsaXA6QXVkaW9DbGlwfG51bGw9bnVsbFxyXG5cclxuICBASW5wdXQoKVxyXG4gIHBsYXlTdGFydEFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKVxyXG4gIHBsYXlTdG9wQWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpXHJcbiAgcGxheVNlbGVjdGlvbkFjdGlvbjpBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpXHJcbiAgYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbiE6QWN0aW9uPGJvb2xlYW4+fHVuZGVmaW5lZDtcclxuXHJcbiAgem9vbUZpdFRvUGFuZWxBY3Rpb24hOkFjdGlvbjx2b2lkPjtcclxuICB6b29tU2VsZWN0ZWRBY3Rpb24hOkFjdGlvbjx2b2lkPlxyXG4gIHpvb21JbkFjdGlvbiE6QWN0aW9uPHZvaWQ+O1xyXG4gIHpvb21PdXRBY3Rpb24hOkFjdGlvbjx2b2lkPjtcclxuXHJcbiAgY2xlYXJTZWxlY3Rpb25BY3Rpb24hOkFjdGlvbjx2b2lkPlxyXG5cclxuICBzdGF0dXM6IHN0cmluZztcclxuXHJcbiAgYXVkaW86IGFueTtcclxuXHJcbiAgQFZpZXdDaGlsZChBdWRpb0Rpc3BsYXlTY3JvbGxQYW5lLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIGF1ZGlvRGlzcGxheVNjcm9sbFBhbmUhOiBBdWRpb0Rpc3BsYXlTY3JvbGxQYW5lO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYscHJpdmF0ZSBlUmVmOkVsZW1lbnRSZWYpIHtcclxuICAgIC8vY29uc29sZS5sb2coXCJjb25zdHJ1Y3RvcjogXCIrdGhpcy5hYyk7XHJcbiAgICAgIHRoaXMucGFyZW50RT10aGlzLmVSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uID0gbmV3IEFjdGlvbihcIlN0YXJ0XCIpO1xyXG4gICAgdGhpcy5wbGF5U2VsZWN0aW9uQWN0aW9uPW5ldyBBY3Rpb24oXCJQbGF5IHNlbGVjdGVkXCIpO1xyXG4gICAgdGhpcy5wbGF5U3RvcEFjdGlvbiA9IG5ldyBBY3Rpb24oXCJTdG9wXCIpO1xyXG4gICAgdGhpcy5zdGF0dXM9XCJQbGF5ZXIgY3JlYXRlZC5cIjtcclxuXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpe1xyXG4gICAgdGhpcy56b29tU2VsZWN0ZWRBY3Rpb249dGhpcy5hdWRpb0Rpc3BsYXlTY3JvbGxQYW5lLnpvb21TZWxlY3RlZEFjdGlvblxyXG4gICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbj10aGlzLmF1ZGlvRGlzcGxheVNjcm9sbFBhbmUuem9vbUZpdFRvUGFuZWxBY3Rpb25cclxuICAgIHRoaXMuem9vbU91dEFjdGlvbj10aGlzLmF1ZGlvRGlzcGxheVNjcm9sbFBhbmUuem9vbU91dEFjdGlvblxyXG4gICAgdGhpcy56b29tSW5BY3Rpb249dGhpcy5hdWRpb0Rpc3BsYXlTY3JvbGxQYW5lLnpvb21JbkFjdGlvblxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG5cclxuICAgICAgdGhpcy5sYXlvdXQoKTtcclxuICAgICAgbGV0IGhlaWdodExpc3RlbmVyPW5ldyBNdXRhdGlvbk9ic2VydmVyKChtcnM6QXJyYXk8TXV0YXRpb25SZWNvcmQ+LG1vOk11dGF0aW9uT2JzZXJ2ZXIpPT57XHJcbiAgICAgICAgICBtcnMuZm9yRWFjaCgobXI6TXV0YXRpb25SZWNvcmQpPT57XHJcbiAgICAgICAgICAgICAgaWYoJ2F0dHJpYnV0ZXMnPT09bXIudHlwZSAmJiAoJ2NsYXNzJz09PW1yLmF0dHJpYnV0ZU5hbWUgfHwgJ3N0eWxlJz09PW1yLmF0dHJpYnV0ZU5hbWUpKXtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICB9KTtcclxuICAgICAgaGVpZ2h0TGlzdGVuZXIub2JzZXJ2ZSh0aGlzLnBhcmVudEUse2F0dHJpYnV0ZXM6IHRydWUsY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbGF5b3V0KCl7XHJcbiAgICB0aGlzLmF1ZGlvRGlzcGxheVNjcm9sbFBhbmUubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhcnRlZCgpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiUGxheSBzdGFydGVkXCIpO1xyXG4gICAgdGhpcy5zdGF0dXMgPSAnUGxheWluZy4uLic7XHJcbiAgfVxyXG5cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYXVkaW9EYXRhKGF1ZGlvRGF0YTogQXVkaW9EYXRhSG9sZGVyKXtcclxuICAgICAgdGhpcy5hdWRpb0Rpc3BsYXlTY3JvbGxQYW5lLmF1ZGlvRGF0YSA9IGF1ZGlvRGF0YTtcclxuICAgICAgaWYodGhpcy5wbGF5U3RhcnRBY3Rpb24pIHtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiUGxheSBzdGFydCBhY3Rpb24gKGJ5IEF1ZGlvRGlzcGxheTo6c2V0IGF1ZGlvRGF0YSkgZGlzYWJsZWQ6IFwiKyhhdWRpb0RhdGE9PW51bGwpKTtcclxuICAgICAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gKGF1ZGlvRGF0YSA9PSBudWxsKVxyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYXVkaW9DbGlwKGF1ZGlvQ2xpcDogQXVkaW9DbGlwIHwgbnVsbCkge1xyXG5cclxuICAgIC8vbGV0IGF1ZGlvRGF0YTpBdWRpb0J1ZmZlcnxudWxsPW51bGw7XHJcbiAgICBsZXQgc2VsOlNlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgICBpZihhdWRpb0NsaXApe1xyXG4gICAgICAvL2F1ZGlvRGF0YT1hdWRpb0NsaXAuYXVkaW9EYXRhSG9sZGVyLmJ1ZmZlcjtcclxuICAgICAgc2VsPWF1ZGlvQ2xpcC5zZWxlY3Rpb247XHJcbiAgICAgIH1cclxuICAgIHRoaXMuX2F1ZGlvQ2xpcD1hdWRpb0NsaXBcclxuICAgIHRoaXMuYXVkaW9EaXNwbGF5U2Nyb2xsUGFuZS5hdWRpb0NsaXAgPSBhdWRpb0NsaXA7XHJcbiAgICAvL3RoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gKGF1ZGlvRGF0YSE9PW51bGwpXHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaW9DbGlwKCk6QXVkaW9DbGlwfG51bGx7XHJcbiAgICByZXR1cm4gdGhpcy5fYXVkaW9DbGlwXHJcbiAgfVxyXG5cclxuICBzZXQgcGxheUZyYW1lUG9zaXRpb24ocGxheUZyYW1lUG9zaXRpb246bnVtYmVyKXtcclxuICAgICAgdGhpcy5hdWRpb0Rpc3BsYXlTY3JvbGxQYW5lLnBsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb25cclxuICB9XHJcblxyXG4gIGVycm9yKCkge1xyXG4gICAgdGhpcy5zdGF0dXMgPSAnRVJST1InO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbiJdfQ==