speechrecorderng 3.10.13 → 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/fesm2022/speechrecorderng.mjs +204 -201
- package/fesm2022/speechrecorderng.mjs.map +1 -1
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +1 -1
- package/lib/ui/responsive_component.d.ts +1 -1
- package/package.json +13 -15
- package/esm2022/lib/action/action.mjs +0 -73
- package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
- package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
- package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
- package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2022/lib/audio/audio_display.mjs +0 -118
- package/esm2022/lib/audio/audio_player.mjs +0 -238
- package/esm2022/lib/audio/capture/capture.mjs +0 -855
- package/esm2022/lib/audio/context.mjs +0 -79
- package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
- package/esm2022/lib/audio/format.mjs +0 -20
- package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
- package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
- package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2022/lib/audio/io/stream.mjs +0 -59
- package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2022/lib/audio/persistor.mjs +0 -81
- package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
- package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
- package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
- package/esm2022/lib/audio/playback/player.mjs +0 -402
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
- package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
- package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
- package/esm2022/lib/audio/ui/common.mjs +0 -19
- package/esm2022/lib/audio/ui/container.mjs +0 -414
- package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2022/lib/db/inddb.mjs +0 -120
- package/esm2022/lib/dsp/utils.mjs +0 -48
- package/esm2022/lib/environment/environment.defaults.mjs +0 -9
- package/esm2022/lib/io/BinaryReader.mjs +0 -93
- package/esm2022/lib/io/BinaryWriter.mjs +0 -80
- package/esm2022/lib/io/stream.mjs +0 -259
- package/esm2022/lib/math/2d/geometry.mjs +0 -28
- package/esm2022/lib/math/complex.mjs +0 -58
- package/esm2022/lib/math/dft.mjs +0 -196
- package/esm2022/lib/media/utils.mjs +0 -14
- package/esm2022/lib/net/uploader.mjs +0 -367
- package/esm2022/lib/recorder_component.mjs +0 -65
- package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
- package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2022/lib/speechrecorder/recording.mjs +0 -124
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
- package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
- package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
- package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
- package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
- package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
- package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
- package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
- package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
- package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2022/lib/speechrecorderng.component.mjs +0 -392
- package/esm2022/lib/speechrecorderng.module.mjs +0 -97
- package/esm2022/lib/spr.config.mjs +0 -27
- package/esm2022/lib/spr.module.version.mjs +0 -2
- package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
- package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
- package/esm2022/lib/ui/message_dialog.mjs +0 -51
- package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2022/lib/ui/responsive_component.mjs +0 -24
- package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
- package/esm2022/lib/utils/ua-parser.mjs +0 -190
- package/esm2022/lib/utils/utils.mjs +0 -132
- package/esm2022/lib/utils/wake_lock.mjs +0 -114
- package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
- package/esm2022/public-api.mjs +0 -35
- package/esm2022/speechrecorderng.mjs +0 -5
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { Float32ArrayChunkerOutStream } from "../../io/stream";
|
|
2
|
-
export class SequenceAudioFloat32ChunkerOutStream extends Float32ArrayChunkerOutStream {
|
|
3
|
-
constructor(outStream, chunkDurationSeconds) {
|
|
4
|
-
super(outStream);
|
|
5
|
-
this.chunkDurationSeconds = chunkDurationSeconds;
|
|
6
|
-
this.sampleRate = null;
|
|
7
|
-
this.sequenceAudioFloat32OutStream = outStream;
|
|
8
|
-
}
|
|
9
|
-
setFormat(channels, sampleRate) {
|
|
10
|
-
//console.debug("SequenceAudioFloat32ChunkerOutStream:setFormat(channels: "+channels+",sampleRate: "+sampleRate+")")
|
|
11
|
-
this.channels = channels;
|
|
12
|
-
this.sampleRate = sampleRate;
|
|
13
|
-
this.chunkSize = Math.round(sampleRate * this.chunkDurationSeconds);
|
|
14
|
-
//console.debug("SequenceAudioFloat32ChunkerOutStream: chunkSize: "+this.chunkSize);
|
|
15
|
-
this.sequenceAudioFloat32OutStream.setFormat(channels, sampleRate);
|
|
16
|
-
}
|
|
17
|
-
nextStream() {
|
|
18
|
-
this.sequenceAudioFloat32OutStream.nextStream();
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Streams a SequenceAudioFloat32OutStream to multiple streams
|
|
23
|
-
*/
|
|
24
|
-
export class SequenceAudioFloat32OutStreamMultiplier {
|
|
25
|
-
constructor() {
|
|
26
|
-
this._sequenceAudioFloat32OutStreams = new Array();
|
|
27
|
-
}
|
|
28
|
-
get sequenceAudioFloat32OutStreams() {
|
|
29
|
-
return this._sequenceAudioFloat32OutStreams;
|
|
30
|
-
}
|
|
31
|
-
setFormat(channels, sampleRate) {
|
|
32
|
-
for (let os of this._sequenceAudioFloat32OutStreams) {
|
|
33
|
-
os.setFormat(channels, sampleRate);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
nextStream() {
|
|
37
|
-
for (let os of this._sequenceAudioFloat32OutStreams) {
|
|
38
|
-
os.nextStream();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
close() {
|
|
42
|
-
for (let os of this._sequenceAudioFloat32OutStreams) {
|
|
43
|
-
os.close();
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
flush() {
|
|
47
|
-
for (let os of this._sequenceAudioFloat32OutStreams) {
|
|
48
|
-
os.flush();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
write(buffers) {
|
|
52
|
-
let toWrite = buffers.length;
|
|
53
|
-
for (let os of this._sequenceAudioFloat32OutStreams) {
|
|
54
|
-
os.write(buffers);
|
|
55
|
-
}
|
|
56
|
-
return toWrite;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2lvL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsNEJBQTRCLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFVcEYsTUFBTSxPQUFPLG9DQUFxQyxTQUFRLDRCQUE0QjtJQUlwRixZQUFZLFNBQXVDLEVBQVUsb0JBQTJCO1FBQ3RGLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUQwQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQU87UUFGaEYsZUFBVSxHQUFhLElBQUksQ0FBQztRQUlsQyxJQUFJLENBQUMsNkJBQTZCLEdBQUMsU0FBUyxDQUFDO0lBQy9DLENBQUM7SUFFRCxTQUFTLENBQUMsUUFBZ0IsRUFBQyxVQUFpQjtRQUMxQyxvSEFBb0g7UUFDcEgsSUFBSSxDQUFDLFFBQVEsR0FBQyxRQUFRLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBQyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNoRSxvRkFBb0Y7UUFDcEYsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELFVBQVU7UUFDUixJQUFJLENBQUMsNkJBQTZCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbEQsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sdUNBQXVDO0lBSWxEO1FBQ0UsSUFBSSxDQUFDLCtCQUErQixHQUFDLElBQUksS0FBSyxFQUFpQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxJQUFJLDhCQUE4QjtRQUNoQyxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQsU0FBUyxDQUFDLFFBQWdCLEVBQUMsVUFBaUI7UUFDMUMsS0FBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsK0JBQStCLEVBQUMsQ0FBQztZQUNoRCxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBQyxVQUFVLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUNELFVBQVU7UUFDUixLQUFJLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBQyxDQUFDO1lBQ2xELEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxLQUFJLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBQyxDQUFDO1lBQ2xELEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILEtBQUksSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLCtCQUErQixFQUFDLENBQUM7WUFDbEQsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBNEI7UUFDaEMsSUFBSSxPQUFPLEdBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxLQUFLLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1lBQ3BELEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RmxvYXQzMkFycmF5Q2h1bmtlck91dFN0cmVhbSwgRmxvYXQzMkFycmF5T3V0U3RyZWFtfSBmcm9tIFwiLi4vLi4vaW8vc3RyZWFtXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvRmxvYXQzMk91dFN0cmVhbSBleHRlbmRzIEZsb2F0MzJBcnJheU91dFN0cmVhbXtcclxuICAgIHNldEZvcm1hdChjaGFubmVsczogbnVtYmVyLHNhbXBsZVJhdGU6bnVtYmVyKTp2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtIGV4dGVuZHMgQXVkaW9GbG9hdDMyT3V0U3RyZWFte1xyXG4gICAgbmV4dFN0cmVhbSgpOnZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTZXF1ZW5jZUF1ZGlvRmxvYXQzMkNodW5rZXJPdXRTdHJlYW0gZXh0ZW5kcyBGbG9hdDMyQXJyYXlDaHVua2VyT3V0U3RyZWFtIGltcGxlbWVudHMgU2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW17XHJcblxyXG4gIHByaXZhdGUgc2FtcGxlUmF0ZTpudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW06U2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW07XHJcbiAgY29uc3RydWN0b3Iob3V0U3RyZWFtOlNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtLCBwcml2YXRlIGNodW5rRHVyYXRpb25TZWNvbmRzOm51bWJlcil7XHJcbiAgICBzdXBlcihvdXRTdHJlYW0pO1xyXG4gICAgdGhpcy5zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbT1vdXRTdHJlYW07XHJcbiAgfVxyXG5cclxuICBzZXRGb3JtYXQoY2hhbm5lbHM6IG51bWJlcixzYW1wbGVSYXRlOm51bWJlcik6dm9pZHtcclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNlcXVlbmNlQXVkaW9GbG9hdDMyQ2h1bmtlck91dFN0cmVhbTpzZXRGb3JtYXQoY2hhbm5lbHM6IFwiK2NoYW5uZWxzK1wiLHNhbXBsZVJhdGU6IFwiK3NhbXBsZVJhdGUrXCIpXCIpXHJcbiAgICB0aGlzLmNoYW5uZWxzPWNoYW5uZWxzO1xyXG4gICAgdGhpcy5zYW1wbGVSYXRlPXNhbXBsZVJhdGU7XHJcbiAgICB0aGlzLmNodW5rU2l6ZT1NYXRoLnJvdW5kKHNhbXBsZVJhdGUqdGhpcy5jaHVua0R1cmF0aW9uU2Vjb25kcyk7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJTZXF1ZW5jZUF1ZGlvRmxvYXQzMkNodW5rZXJPdXRTdHJlYW06IGNodW5rU2l6ZTogXCIrdGhpcy5jaHVua1NpemUpO1xyXG4gICAgdGhpcy5zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbS5zZXRGb3JtYXQoY2hhbm5lbHMsc2FtcGxlUmF0ZSk7XHJcbiAgfVxyXG4gIG5leHRTdHJlYW0oKTp2b2lke1xyXG4gICAgdGhpcy5zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbS5uZXh0U3RyZWFtKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogU3RyZWFtcyBhIFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtIHRvIG11bHRpcGxlIHN0cmVhbXNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbU11bHRpcGxpZXIgaW1wbGVtZW50cyBTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1zITpBcnJheTxTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1zPW5ldyBBcnJheTxTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbT4oKTtcclxuICB9XHJcblxyXG4gIGdldCBzZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXMoKTogQXJyYXk8U2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW0+IHtcclxuICAgIHJldHVybiB0aGlzLl9zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXM7XHJcbiAgfVxyXG5cclxuICBzZXRGb3JtYXQoY2hhbm5lbHM6IG51bWJlcixzYW1wbGVSYXRlOm51bWJlcik6dm9pZHtcclxuICAgIGZvcihsZXQgb3Mgb2YgdGhpcy5fc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1zKXtcclxuICAgICAgICBvcy5zZXRGb3JtYXQoY2hhbm5lbHMsc2FtcGxlUmF0ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG5leHRTdHJlYW0oKTp2b2lke1xyXG4gICAgZm9yKGxldCBvcyBvZiB0aGlzLl9zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXMpe1xyXG4gICAgICBvcy5uZXh0U3RyZWFtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIGZvcihsZXQgb3Mgb2YgdGhpcy5fc2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW1zKXtcclxuICAgICAgb3MuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZsdXNoKCk6IHZvaWQge1xyXG4gICAgZm9yKGxldCBvcyBvZiB0aGlzLl9zZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbXMpe1xyXG4gICAgICBvcy5mbHVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGUoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IG51bWJlciB7XHJcbiAgICBsZXQgdG9Xcml0ZTpudW1iZXI9YnVmZmVycy5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IG9zIG9mIHRoaXMuX3NlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtcykge1xyXG4gICAgICAgIG9zLndyaXRlKGJ1ZmZlcnMpO1xyXG4gICAgICB9XHJcbiAgICByZXR1cm4gdG9Xcml0ZTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
import { Observable } from "rxjs";
|
|
2
|
-
import { BasicAudioSource } from "./audio_data_holder";
|
|
3
|
-
import { HttpErrorResponse } from "@angular/common/http";
|
|
4
|
-
export class NetAudioBuffer extends BasicAudioSource {
|
|
5
|
-
get orgFetchChunkFrameLen() {
|
|
6
|
-
return this._orgFetchChunkFrameLen;
|
|
7
|
-
}
|
|
8
|
-
get recFileService() {
|
|
9
|
-
return this._recFileService;
|
|
10
|
-
}
|
|
11
|
-
get baseUrl() {
|
|
12
|
-
return this._baseUrl;
|
|
13
|
-
}
|
|
14
|
-
get chunkFrameLen() {
|
|
15
|
-
return this._chunkFrameLen;
|
|
16
|
-
}
|
|
17
|
-
get uuid() {
|
|
18
|
-
return this._uuid;
|
|
19
|
-
}
|
|
20
|
-
constructor(_recFileService, _baseUrl, _channelCount, _sampleRate, _chunkFrameLen, _frameLen, _uuid = null, _orgFetchChunkFrameLen = _chunkFrameLen) {
|
|
21
|
-
super();
|
|
22
|
-
this._recFileService = _recFileService;
|
|
23
|
-
this._baseUrl = _baseUrl;
|
|
24
|
-
this._channelCount = _channelCount;
|
|
25
|
-
this._sampleRate = _sampleRate;
|
|
26
|
-
this._chunkFrameLen = _chunkFrameLen;
|
|
27
|
-
this._frameLen = _frameLen;
|
|
28
|
-
this._uuid = _uuid;
|
|
29
|
-
this._orgFetchChunkFrameLen = _orgFetchChunkFrameLen;
|
|
30
|
-
this._chunkCount = 0;
|
|
31
|
-
this._sealed = false;
|
|
32
|
-
}
|
|
33
|
-
get channelCount() {
|
|
34
|
-
return this._channelCount;
|
|
35
|
-
}
|
|
36
|
-
sealed() {
|
|
37
|
-
return this._sealed;
|
|
38
|
-
}
|
|
39
|
-
seal() {
|
|
40
|
-
this._sealed = true;
|
|
41
|
-
}
|
|
42
|
-
get sampleRate() {
|
|
43
|
-
return this._sampleRate;
|
|
44
|
-
}
|
|
45
|
-
get frameLen() {
|
|
46
|
-
return this._frameLen;
|
|
47
|
-
}
|
|
48
|
-
get chunkCount() {
|
|
49
|
-
return this._chunkCount;
|
|
50
|
-
}
|
|
51
|
-
releaseAudioData() {
|
|
52
|
-
return new Observable((subscriber) => {
|
|
53
|
-
// nothing to remove
|
|
54
|
-
subscriber.next();
|
|
55
|
-
subscriber.complete();
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
toString() {
|
|
59
|
-
return "Indexed db audio buffer. Channels: " + this.channelCount + ", sample rate: " + this.sampleRate + ", chunk frame length: " + this._chunkFrameLen + ", number of chunks: " + this.chunkCount + ", frame length: " + this.frameLen + ", sealed: " + this.sealed();
|
|
60
|
-
}
|
|
61
|
-
static fromChunkAudioBuffer(recordingsService, baseUrl, ab, frameLen, orgFetchChunkFrameLen = ab.length) {
|
|
62
|
-
let nab = new NetAudioBuffer(recordingsService, baseUrl, ab.numberOfChannels, ab.sampleRate, ab.length, frameLen, null, orgFetchChunkFrameLen);
|
|
63
|
-
nab.ready();
|
|
64
|
-
return nab;
|
|
65
|
-
}
|
|
66
|
-
asyncAudioInputStream() {
|
|
67
|
-
return new NetAudioInputStream(this);
|
|
68
|
-
}
|
|
69
|
-
audioInputStream() {
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
get duration() {
|
|
73
|
-
return this._frameLen / this._sampleRate;
|
|
74
|
-
}
|
|
75
|
-
get numberOfChannels() {
|
|
76
|
-
return this._channelCount;
|
|
77
|
-
}
|
|
78
|
-
sampleCounts() {
|
|
79
|
-
return this._channelCount * this._frameLen;
|
|
80
|
-
}
|
|
81
|
-
randomAccessAudioStream() {
|
|
82
|
-
return new NetRandomAccessAudioStream(this);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// export class NetAudioChunk{
|
|
86
|
-
//
|
|
87
|
-
// get orgSampleRate(): number {
|
|
88
|
-
// return this._orgSampleRate;
|
|
89
|
-
// }
|
|
90
|
-
//
|
|
91
|
-
// get orgFrameLen(): number {
|
|
92
|
-
// return this._orgFrameLen;
|
|
93
|
-
// }
|
|
94
|
-
// constructor(private _decodedBuffers:Float32Array[],private _orgSampleRate:number,private _orgFrameLen:number) {
|
|
95
|
-
// }
|
|
96
|
-
// }
|
|
97
|
-
export class NetRandomAccessAudioStream {
|
|
98
|
-
constructor(_netAb) {
|
|
99
|
-
this._netAb = _netAb;
|
|
100
|
-
this._currCi = 0;
|
|
101
|
-
this._ccCache = null;
|
|
102
|
-
}
|
|
103
|
-
chunk(baseUrl, ci, cb, errCb) {
|
|
104
|
-
let startFrame = ci * this._netAb.orgFetchChunkFrameLen;
|
|
105
|
-
this._netAb.recFileService.chunkAudioRequest(baseUrl, startFrame, this._netAb.orgFetchChunkFrameLen).subscribe({
|
|
106
|
-
next: (chDl) => {
|
|
107
|
-
if (chDl) {
|
|
108
|
-
const ab = chDl.decodedAudioBuffer;
|
|
109
|
-
const ccChs = ab.numberOfChannels;
|
|
110
|
-
let arrBuf = new Array();
|
|
111
|
-
for (let ch = 0; ch < ccChs; ch++) {
|
|
112
|
-
arrBuf.push(ab.getChannelData(ch));
|
|
113
|
-
}
|
|
114
|
-
cb(arrBuf, chDl.orgFrameLength);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
cb(null, null);
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
complete: () => { },
|
|
121
|
-
error: (errEv) => {
|
|
122
|
-
//NetRandomAccessAudioStream._runningRequests--;
|
|
123
|
-
if (errEv instanceof HttpErrorResponse) {
|
|
124
|
-
if (errEv.status === 404) {
|
|
125
|
-
cb(null, null);
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
console.error("Net audio buffer chunk audio request Http error event: " + errEv.status + ", " + errEv.name + ", " + errEv.message);
|
|
129
|
-
errCb(new Error(errEv.toString()));
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
console.error("Net audio buffer chunk audio request error event: " + errEv.message);
|
|
134
|
-
errCb(new Error(errEv.toString()));
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
_fillBufs(ccBufs, orgFrameLen, trgState, srcState) {
|
|
140
|
-
let ccBufsChs = ccBufs.length;
|
|
141
|
-
if (ccBufsChs > 0) {
|
|
142
|
-
let ccBuf0 = ccBufs[0];
|
|
143
|
-
let ccBufsLen = ccBuf0.length;
|
|
144
|
-
//console.debug('IndexedDbAudioBuffer::fillBufs framePos: '+framePos+', srcFramePos: '+srcFramePos+', ccBufsLen: '+ccBufsLen);
|
|
145
|
-
if (trgState.framePos >= srcState.srcFramePos + ccBufsLen) {
|
|
146
|
-
// target frame position is ahead, seek to next source buffer
|
|
147
|
-
//console.debug('IndexedDbAudioBuffer::fillBufs seek to next inddb buffer');
|
|
148
|
-
this._ccCache = null;
|
|
149
|
-
srcState.ci++;
|
|
150
|
-
srcState.ccPos = 0;
|
|
151
|
-
if (orgFrameLen === null) {
|
|
152
|
-
srcState.orgSrcFramePos += ccBufsLen;
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
srcState.orgSrcFramePos += orgFrameLen;
|
|
156
|
-
}
|
|
157
|
-
srcState.srcFramePos += ccBufsLen;
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
// Assuming target frame pos is inside current source buffer
|
|
161
|
-
srcState.ccPos = trgState.framePos - srcState.srcFramePos;
|
|
162
|
-
let ccAvail = ccBufsLen - srcState.ccPos;
|
|
163
|
-
let toCopy = ccBufsLen;
|
|
164
|
-
if (toCopy > ccAvail) {
|
|
165
|
-
toCopy = ccAvail;
|
|
166
|
-
}
|
|
167
|
-
if (toCopy > trgState.frameLen) {
|
|
168
|
-
toCopy = trgState.frameLen;
|
|
169
|
-
}
|
|
170
|
-
for (let ch = 0; ch < ccBufsChs; ch++) {
|
|
171
|
-
for (let si = 0; si < toCopy; si++) {
|
|
172
|
-
trgState.trgBufs[ch][trgState.filled + si] = ccBufs[ch][srcState.ccPos + si];
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
trgState.filled += toCopy;
|
|
176
|
-
trgState.frameLen -= toCopy;
|
|
177
|
-
trgState.framePos += toCopy;
|
|
178
|
-
srcState.ccPos += toCopy;
|
|
179
|
-
if (srcState.ccPos >= ccBufsLen) {
|
|
180
|
-
// Invalidate cache
|
|
181
|
-
this._ccCache = null;
|
|
182
|
-
srcState.ci++;
|
|
183
|
-
this._currCi = srcState.ci;
|
|
184
|
-
srcState.ccPos = 0;
|
|
185
|
-
if (orgFrameLen === null) {
|
|
186
|
-
srcState.orgSrcFramePos += ccBufsLen;
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
srcState.orgSrcFramePos += orgFrameLen;
|
|
190
|
-
}
|
|
191
|
-
srcState.srcFramePos += ccBufsLen;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr) {
|
|
197
|
-
//console.debug('IndexedDbAudioBuffer::fillBufs: framePos:'+framePos+', frameLen: '+frameLen+', filled: '+filled+', srcFramePos: '+srcFramePos+',ci: '+ci+', ccPos: '+ccPos);
|
|
198
|
-
if (this._ccCache) {
|
|
199
|
-
this._fillBufs(this._ccCache, orgFrameLen, trgState, srcState);
|
|
200
|
-
//console.debug('IndexedDbAudioBuffer::fillBufs frameLen: '+frameLen);
|
|
201
|
-
if (trgState.frameLen === 0) {
|
|
202
|
-
//console.debug('IndexedDbAudioBuffer::fillBufs (framelen==0) call: cbend '+filled);
|
|
203
|
-
cbEnd(trgState.filled);
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
this.fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
this.chunk(baseUrl, srcState.ci, (ccBufs, orgFrameLength) => {
|
|
211
|
-
if (ccBufs) {
|
|
212
|
-
this._currCi = srcState.ci;
|
|
213
|
-
this._ccCache = ccBufs;
|
|
214
|
-
this._fillBufs(ccBufs, orgFrameLength, trgState, srcState);
|
|
215
|
-
//console.debug('IndexedDbAudioBuffer::fillBufs frameLen: '+frameLen);
|
|
216
|
-
if (trgState.frameLen === 0) {
|
|
217
|
-
//console.debug('IndexedDbAudioBuffer::fillBufs (framelen==0) call: cbend '+filled);
|
|
218
|
-
cbEnd(trgState.filled);
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
this.fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
//console.debug('IndexedDbAudioBuffer::fillBufs (chunk not found) call: cbend '+filled);
|
|
226
|
-
cbEnd(trgState.filled);
|
|
227
|
-
}
|
|
228
|
-
}, (err) => {
|
|
229
|
-
cbErr(err);
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
framesObs(framePos, frameLen, bufs) {
|
|
234
|
-
return new Observable((subscriber) => {
|
|
235
|
-
// Positioning
|
|
236
|
-
let newCi = Math.floor(framePos / this._netAb.chunkFrameLen);
|
|
237
|
-
if (newCi !== this._currCi) {
|
|
238
|
-
this._currCi = newCi;
|
|
239
|
-
this._ccCache = null;
|
|
240
|
-
}
|
|
241
|
-
let srcFramePos = newCi * this._netAb.chunkFrameLen;
|
|
242
|
-
let trgState = { framePos: framePos, frameLen: frameLen, trgBufs: bufs, filled: 0 };
|
|
243
|
-
let srcState = { orgSrcFramePos: 0, srcFramePos: srcFramePos, ci: newCi, ccPos: 0, ccFilled: 0 };
|
|
244
|
-
this.fillBufs(this._netAb.baseUrl, this._netAb.orgFetchChunkFrameLen, trgState, srcState, (val) => { }, (filled) => {
|
|
245
|
-
subscriber.next(filled);
|
|
246
|
-
subscriber.complete();
|
|
247
|
-
}, err => {
|
|
248
|
-
subscriber.error(err);
|
|
249
|
-
});
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
close() {
|
|
253
|
-
this._currCi = 0;
|
|
254
|
-
this._ccCache = null;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
export class NetAudioInputStream {
|
|
258
|
-
constructor(netAb) {
|
|
259
|
-
this.netAb = netAb;
|
|
260
|
-
this.framePos = 0;
|
|
261
|
-
this.netAbStr = new NetRandomAccessAudioStream(netAb);
|
|
262
|
-
}
|
|
263
|
-
close() {
|
|
264
|
-
this.netAbStr.close();
|
|
265
|
-
}
|
|
266
|
-
readObs(buffers) {
|
|
267
|
-
return new Observable(subscr => {
|
|
268
|
-
if (buffers && buffers.length > 0) {
|
|
269
|
-
let fl = buffers[0].length;
|
|
270
|
-
this.netAbStr.framesObs(this.framePos, fl, buffers).subscribe({
|
|
271
|
-
next: (read) => {
|
|
272
|
-
this.framePos += read;
|
|
273
|
-
subscr.next(read);
|
|
274
|
-
},
|
|
275
|
-
complete: () => {
|
|
276
|
-
subscr.complete();
|
|
277
|
-
},
|
|
278
|
-
error: (err) => {
|
|
279
|
-
subscr.error(err);
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
subscr.next(0);
|
|
285
|
-
subscr.complete();
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
skipFrames(n) {
|
|
290
|
-
this.framePos += n;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0X2F1ZGlvX2J1ZmZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9uZXRfYXVkaW9fYnVmZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFaEMsT0FBTyxFQUFjLGdCQUFnQixFQUEwQixNQUFNLHFCQUFxQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXpELE1BQU0sT0FBTyxjQUFlLFNBQVEsZ0JBQWdCO0lBRWxELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFLRCxZQUNvQixlQUFxQyxFQUNyQyxRQUFlLEVBQ2YsYUFBcUIsRUFDckIsV0FBbUIsRUFDbkIsY0FBcUIsRUFDckIsU0FBZ0IsRUFDaEIsUUFBa0IsSUFBSSxFQUN0Qix5QkFBdUIsY0FBYztRQUN2RCxLQUFLLEVBQUUsQ0FBQztRQVJVLG9CQUFlLEdBQWYsZUFBZSxDQUFzQjtRQUNyQyxhQUFRLEdBQVIsUUFBUSxDQUFPO1FBQ2Ysa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDckIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQU87UUFDckIsY0FBUyxHQUFU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QkFBSSxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsQ0FBUztRQUNsQixJQUFJLENBQUMsUUFBUSxJQUFFLENBQUMsQ0FBQztJQUNuQixDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7QXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSwgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW19IGZyb20gXCIuLi9pby9zdHJlYW1cIjtcclxuaW1wb3J0IHtBdWRpb1NvdXJjZSwgQmFzaWNBdWRpb1NvdXJjZSwgUmFuZG9tQWNjZXNzQXVkaW9TdHJlYW19IGZyb20gXCIuL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7QmFzaWNSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi4vc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9iYXNpY19yZWNvcmRpbmcuc2VydmljZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBOZXRBdWRpb0J1ZmZlciBleHRlbmRzIEJhc2ljQXVkaW9Tb3VyY2UgaW1wbGVtZW50cyBBdWRpb1NvdXJjZXtcclxuXHJcbiAgZ2V0IG9yZ0ZldGNoQ2h1bmtGcmFtZUxlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yZ0ZldGNoQ2h1bmtGcmFtZUxlbjtcclxuICB9XHJcbiAgZ2V0IHJlY0ZpbGVTZXJ2aWNlKCk6IEJhc2ljUmVjb3JkaW5nU2VydmljZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjRmlsZVNlcnZpY2U7XHJcbiAgfVxyXG4gIGdldCBiYXNlVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmFzZVVybDtcclxuICB9XHJcbiAgZ2V0IGNodW5rRnJhbWVMZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua0ZyYW1lTGVuO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHV1aWQoKTogc3RyaW5nfG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3V1aWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaHVua0NvdW50PTA7XHJcbiAgcHJpdmF0ZSBfc2VhbGVkPWZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAgICAgICBwcml2YXRlIF9yZWNGaWxlU2VydmljZTpCYXNpY1JlY29yZGluZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfYmFzZVVybDpzdHJpbmcsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY2hhbm5lbENvdW50OiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfc2FtcGxlUmF0ZTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NodW5rRnJhbWVMZW46bnVtYmVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2ZyYW1lTGVuOm51bWJlcixcclxuICAgICAgICAgICAgICBwcml2YXRlIF91dWlkOnN0cmluZ3xudWxsPW51bGwsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfb3JnRmV0Y2hDaHVua0ZyYW1lTGVuPV9jaHVua0ZyYW1lTGVuKSB7XHJcbiAgICBzdXBlcigpO1xyXG5cclxuICB9XHJcblxyXG4gIGdldCBjaGFubmVsQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQ7XHJcbiAgfVxyXG5cclxuICBzZWFsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhbGVkO1xyXG4gIH1cclxuXHJcbiAgc2VhbCgpOnZvaWR7XHJcbiAgICB0aGlzLl9zZWFsZWQ9dHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldCBzYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBmcmFtZUxlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZyYW1lTGVuO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNodW5rQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua0NvdW50O1xyXG4gIH1cclxuXHJcbiAgcmVsZWFzZUF1ZGlvRGF0YSgpOk9ic2VydmFibGU8dm9pZD57XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8dm9pZD4oKHN1YnNjcmliZXIpPT57XHJcbiAgICAgICAgLy8gbm90aGluZyB0byByZW1vdmVcclxuICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcclxuICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6c3RyaW5ne1xyXG4gICAgcmV0dXJuIFwiSW5kZXhlZCBkYiBhdWRpbyBidWZmZXIuIENoYW5uZWxzOiBcIit0aGlzLmNoYW5uZWxDb3VudCtcIiwgc2FtcGxlIHJhdGU6IFwiK3RoaXMuc2FtcGxlUmF0ZStcIiwgY2h1bmsgZnJhbWUgbGVuZ3RoOiBcIit0aGlzLl9jaHVua0ZyYW1lTGVuK1wiLCBudW1iZXIgb2YgY2h1bmtzOiBcIit0aGlzLmNodW5rQ291bnQrXCIsIGZyYW1lIGxlbmd0aDogXCIrdGhpcy5mcmFtZUxlbitcIiwgc2VhbGVkOiBcIit0aGlzLnNlYWxlZCgpO1xyXG4gIH1cclxuXHJcbiAgICBzdGF0aWMgZnJvbUNodW5rQXVkaW9CdWZmZXIocmVjb3JkaW5nc1NlcnZpY2U6QmFzaWNSZWNvcmRpbmdTZXJ2aWNlLGJhc2VVcmw6c3RyaW5nLGFiOiBBdWRpb0J1ZmZlcixmcmFtZUxlbjpudW1iZXIsb3JnRmV0Y2hDaHVua0ZyYW1lTGVuOm51bWJlcj1hYi5sZW5ndGgpOk5ldEF1ZGlvQnVmZmVyIHtcclxuICAgICAgbGV0IG5hYj1uZXcgTmV0QXVkaW9CdWZmZXIocmVjb3JkaW5nc1NlcnZpY2UsYmFzZVVybCxhYi5udW1iZXJPZkNoYW5uZWxzLGFiLnNhbXBsZVJhdGUsYWIubGVuZ3RoLGZyYW1lTGVuLG51bGwsb3JnRmV0Y2hDaHVua0ZyYW1lTGVuKTtcclxuICAgICAgbmFiLnJlYWR5KCk7XHJcbiAgICAgIHJldHVybiBuYWI7XHJcbiAgfVxyXG5cclxuICBhc3luY0F1ZGlvSW5wdXRTdHJlYW0oKTogQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIG5ldyBOZXRBdWRpb0lucHV0U3RyZWFtKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgYXVkaW9JbnB1dFN0cmVhbSgpOiBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgZHVyYXRpb24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9mcmFtZUxlbi90aGlzLl9zYW1wbGVSYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG51bWJlck9mQ2hhbm5lbHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQ7XHJcbiAgfVxyXG5cclxuICBzYW1wbGVDb3VudHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQqdGhpcy5fZnJhbWVMZW47XHJcbiAgfVxyXG5cclxuICByYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSgpOiBSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSB7XHJcbiAgICByZXR1cm4gbmV3IE5ldFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtKHRoaXMpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gZXhwb3J0IGNsYXNzIE5ldEF1ZGlvQ2h1bmt7XHJcbi8vXHJcbi8vICAgZ2V0IG9yZ1NhbXBsZVJhdGUoKTogbnVtYmVyIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9vcmdTYW1wbGVSYXRlO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBnZXQgb3JnRnJhbWVMZW4oKTogbnVtYmVyIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9vcmdGcmFtZUxlbjtcclxuLy8gICB9XHJcbi8vICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGVjb2RlZEJ1ZmZlcnM6RmxvYXQzMkFycmF5W10scHJpdmF0ZSBfb3JnU2FtcGxlUmF0ZTpudW1iZXIscHJpdmF0ZSBfb3JnRnJhbWVMZW46bnVtYmVyKSB7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG5leHBvcnQgY2xhc3MgTmV0UmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0gaW1wbGVtZW50cyBSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbXtcclxuXHJcbiAgcHJpdmF0ZSBfY3VyckNpPTA7XHJcbiAgcHJpdmF0ZSBfY2NDYWNoZTpGbG9hdDMyQXJyYXlbXXxudWxsPW51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ldEFiOk5ldEF1ZGlvQnVmZmVyKSB7fVxyXG5cclxuICBwcml2YXRlIGNodW5rKGJhc2VVcmw6c3RyaW5nLGNpOm51bWJlcixjYjooYnVmczpBcnJheTxGbG9hdDMyQXJyYXk+fG51bGwsb3JnRnJhbWVMZW5ndGg6bnVtYmVyfG51bGwpPT52b2lkLGVyckNiOihlcnI6RXJyb3IpPT52b2lkKXtcclxuXHJcbiAgICBsZXQgc3RhcnRGcmFtZT1jaSp0aGlzLl9uZXRBYi5vcmdGZXRjaENodW5rRnJhbWVMZW47XHJcblxyXG4gICAgdGhpcy5fbmV0QWIucmVjRmlsZVNlcnZpY2UuY2h1bmtBdWRpb1JlcXVlc3QoYmFzZVVybCxzdGFydEZyYW1lLHRoaXMuX25ldEFiLm9yZ0ZldGNoQ2h1bmtGcmFtZUxlbikuc3Vic2NyaWJlKFxyXG4gICAgICB7XHJcblxyXG4gICAgICAgIG5leHQ6IChjaERsKT0+e1xyXG4gICAgICAgICAgaWYoY2hEbCl7XHJcbiAgICAgICAgICAgIGNvbnN0IGFiPWNoRGwuZGVjb2RlZEF1ZGlvQnVmZmVyO1xyXG4gICAgICAgICAgICBjb25zdCBjY0Nocz1hYi5udW1iZXJPZkNoYW5uZWxzO1xyXG4gICAgICAgICAgICBsZXQgYXJyQnVmPW5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KCk7XHJcbiAgICAgICAgICAgIGZvcihsZXQgY2g9MDtjaDxjY0NocztjaCsrKXtcclxuICAgICAgICAgICAgICBhcnJCdWYucHVzaChhYi5nZXRDaGFubmVsRGF0YShjaCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNiKGFyckJ1ZixjaERsLm9yZ0ZyYW1lTGVuZ3RoKTtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjYihudWxsLG51bGwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpPT57fSxcclxuICAgICAgICBlcnJvcjooZXJyRXYpPT57XHJcbiAgICAgICAgICAvL05ldFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtLl9ydW5uaW5nUmVxdWVzdHMtLTtcclxuICAgICAgICAgIGlmKGVyckV2IGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2Upe1xyXG4gICAgICAgICAgIGlmKGVyckV2LnN0YXR1cz09PTQwNCl7XHJcbiAgICAgICAgICAgICBjYihudWxsLG51bGwpO1xyXG4gICAgICAgICAgIH0gZWxzZXtcclxuICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOZXQgYXVkaW8gYnVmZmVyIGNodW5rIGF1ZGlvIHJlcXVlc3QgSHR0cCBlcnJvciBldmVudDogXCIrZXJyRXYuc3RhdHVzK1wiLCBcIitlcnJFdi5uYW1lK1wiLCBcIitlcnJFdi5tZXNzYWdlKTtcclxuICAgICAgICAgICAgIGVyckNiKG5ldyBFcnJvcihlcnJFdi50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTmV0IGF1ZGlvIGJ1ZmZlciBjaHVuayBhdWRpbyByZXF1ZXN0IGVycm9yIGV2ZW50OiBcIitlcnJFdi5tZXNzYWdlKTtcclxuICAgICAgICAgICAgZXJyQ2IobmV3IEVycm9yKGVyckV2LnRvU3RyaW5nKCkpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9maWxsQnVmcyhjY0J1ZnM6RmxvYXQzMkFycmF5W10sb3JnRnJhbWVMZW46bnVtYmVyfG51bGwsdHJnU3RhdGU6e2ZyYW1lUG9zOm51bWJlcixmcmFtZUxlbjpudW1iZXIsdHJnQnVmczpGbG9hdDMyQXJyYXlbXSxmaWxsZWQ6bnVtYmVyfSxzcmNTdGF0ZTp7b3JnU3JjRnJhbWVQb3M6bnVtYmVyLHNyY0ZyYW1lUG9zOm51bWJlcixjaTpudW1iZXIsY2NQb3M6bnVtYmVyfSl7XHJcbiAgICBsZXQgY2NCdWZzQ2hzPWNjQnVmcy5sZW5ndGg7XHJcbiAgICBpZihjY0J1ZnNDaHM+MCkge1xyXG4gICAgICBsZXQgY2NCdWYwID0gY2NCdWZzWzBdO1xyXG4gICAgICBsZXQgY2NCdWZzTGVuID0gY2NCdWYwLmxlbmd0aDtcclxuXHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIGZyYW1lUG9zOiAnK2ZyYW1lUG9zKycsIHNyY0ZyYW1lUG9zOiAnK3NyY0ZyYW1lUG9zKycsIGNjQnVmc0xlbjogJytjY0J1ZnNMZW4pO1xyXG4gICAgICBpZiAodHJnU3RhdGUuZnJhbWVQb3MgPj0gc3JjU3RhdGUuc3JjRnJhbWVQb3MgKyBjY0J1ZnNMZW4pIHtcclxuICAgICAgICAvLyB0YXJnZXQgZnJhbWUgcG9zaXRpb24gaXMgYWhlYWQsIHNlZWsgdG8gbmV4dCBzb3VyY2UgYnVmZmVyXHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgc2VlayB0byBuZXh0IGluZGRiIGJ1ZmZlcicpO1xyXG4gICAgICAgIHRoaXMuX2NjQ2FjaGU9bnVsbDtcclxuICAgICAgICBzcmNTdGF0ZS5jaSsrO1xyXG4gICAgICAgIHNyY1N0YXRlLmNjUG9zPTA7XHJcbiAgICAgICAgaWYob3JnRnJhbWVMZW49PT1udWxsKXtcclxuICAgICAgICAgIHNyY1N0YXRlLm9yZ1NyY0ZyYW1lUG9zKz1jY0J1ZnNMZW47XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBzcmNTdGF0ZS5vcmdTcmNGcmFtZVBvcys9b3JnRnJhbWVMZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNyY1N0YXRlLnNyY0ZyYW1lUG9zKz1jY0J1ZnNMZW47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQXNzdW1pbmcgdGFyZ2V0IGZyYW1lIHBvcyBpcyBpbnNpZGUgY3VycmVudCBzb3VyY2UgYnVmZmVyXHJcbiAgICAgICAgc3JjU3RhdGUuY2NQb3M9dHJnU3RhdGUuZnJhbWVQb3Mtc3JjU3RhdGUuc3JjRnJhbWVQb3M7XHJcbiAgICAgICAgbGV0IGNjQXZhaWwgPSBjY0J1ZnNMZW4gLSBzcmNTdGF0ZS5jY1BvcztcclxuICAgICAgICBsZXQgdG9Db3B5ID0gY2NCdWZzTGVuO1xyXG5cclxuICAgICAgICBpZiAodG9Db3B5ID4gY2NBdmFpbCkge1xyXG4gICAgICAgICAgdG9Db3B5ID0gY2NBdmFpbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRvQ29weSA+IHRyZ1N0YXRlLmZyYW1lTGVuKSB7XHJcbiAgICAgICAgICB0b0NvcHkgPSB0cmdTdGF0ZS5mcmFtZUxlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNjQnVmc0NoczsgY2grKykge1xyXG4gICAgICAgICAgZm9yIChsZXQgc2kgPSAwOyBzaSA8IHRvQ29weTsgc2krKykge1xyXG4gICAgICAgICAgICB0cmdTdGF0ZS50cmdCdWZzW2NoXVt0cmdTdGF0ZS5maWxsZWQrc2ldID0gY2NCdWZzW2NoXVtzcmNTdGF0ZS5jY1BvcytzaV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyZ1N0YXRlLmZpbGxlZCArPSB0b0NvcHk7XHJcbiAgICAgICAgdHJnU3RhdGUuZnJhbWVMZW4gLT0gdG9Db3B5O1xyXG4gICAgICAgIHRyZ1N0YXRlLmZyYW1lUG9zICs9IHRvQ29weTtcclxuICAgICAgICBzcmNTdGF0ZS5jY1BvcyArPSB0b0NvcHk7XHJcbiAgICAgICAgaWYgKHNyY1N0YXRlLmNjUG9zID49IGNjQnVmc0xlbikge1xyXG4gICAgICAgICAgLy8gSW52YWxpZGF0ZSBjYWNoZVxyXG4gICAgICAgICAgdGhpcy5fY2NDYWNoZT1udWxsO1xyXG4gICAgICAgICAgc3JjU3RhdGUuY2krKztcclxuICAgICAgICAgIHRoaXMuX2N1cnJDaT1zcmNTdGF0ZS5jaTtcclxuICAgICAgICAgIHNyY1N0YXRlLmNjUG9zID0gMDtcclxuICAgICAgICAgIGlmKG9yZ0ZyYW1lTGVuPT09bnVsbCl7XHJcbiAgICAgICAgICAgIHNyY1N0YXRlLm9yZ1NyY0ZyYW1lUG9zKz1jY0J1ZnNMZW47XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgc3JjU3RhdGUub3JnU3JjRnJhbWVQb3MrPW9yZ0ZyYW1lTGVuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgc3JjU3RhdGUuc3JjRnJhbWVQb3MrPWNjQnVmc0xlbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGxCdWZzKGJhc2VVcmw6c3RyaW5nLG9yZ0ZyYW1lTGVuOm51bWJlcnxudWxsLHRyZ1N0YXRlOntmcmFtZVBvczpudW1iZXIsZnJhbWVMZW46bnVtYmVyLHRyZ0J1ZnM6RmxvYXQzMkFycmF5W10sZmlsbGVkOm51bWJlcn0sc3JjU3RhdGU6e29yZ1NyY0ZyYW1lUG9zOm51bWJlcixzcmNGcmFtZVBvczpudW1iZXIsY2k6bnVtYmVyLGNjUG9zOm51bWJlcixjY0ZpbGxlZDpudW1iZXJ9LGNiOihmaWxsZWQ6bnVtYmVyKT0+dm9pZCxjYkVuZDooZmlsbGVkOm51bWJlcik9PnZvaWQsY2JFcnI6KGVycjpFcnJvcik9PnZvaWQpe1xyXG4gICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnM6IGZyYW1lUG9zOicrZnJhbWVQb3MrJywgZnJhbWVMZW46ICcrZnJhbWVMZW4rJywgZmlsbGVkOiAnK2ZpbGxlZCsnLCBzcmNGcmFtZVBvczogJytzcmNGcmFtZVBvcysnLGNpOiAnK2NpKycsIGNjUG9zOiAnK2NjUG9zKTtcclxuICAgIGlmKHRoaXMuX2NjQ2FjaGUpe1xyXG4gICAgICB0aGlzLl9maWxsQnVmcyh0aGlzLl9jY0NhY2hlLG9yZ0ZyYW1lTGVuLHRyZ1N0YXRlLHNyY1N0YXRlKTtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgZnJhbWVMZW46ICcrZnJhbWVMZW4pO1xyXG4gICAgICBpZih0cmdTdGF0ZS5mcmFtZUxlbj09PTApe1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIChmcmFtZWxlbj09MCkgY2FsbDogY2JlbmQgJytmaWxsZWQpO1xyXG4gICAgICAgIGNiRW5kKHRyZ1N0YXRlLmZpbGxlZCk7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICB0aGlzLmZpbGxCdWZzKGJhc2VVcmwsIG9yZ0ZyYW1lTGVuLHRyZ1N0YXRlLCBzcmNTdGF0ZSwgY2IsIGNiRW5kLCBjYkVycik7XHJcbiAgICAgIH1cclxuICAgIH1lbHNlIHtcclxuICAgICAgdGhpcy5jaHVuayhiYXNlVXJsLCBzcmNTdGF0ZS5jaSwgKGNjQnVmcyxvcmdGcmFtZUxlbmd0aCkgPT4ge1xyXG4gICAgICAgIGlmIChjY0J1ZnMpIHtcclxuICAgICAgICAgIHRoaXMuX2N1cnJDaSA9IHNyY1N0YXRlLmNpO1xyXG4gICAgICAgICAgdGhpcy5fY2NDYWNoZSA9IGNjQnVmcztcclxuXHJcbiAgICAgICAgICB0aGlzLl9maWxsQnVmcyhjY0J1ZnMsIG9yZ0ZyYW1lTGVuZ3RoLHRyZ1N0YXRlLCBzcmNTdGF0ZSk7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ0luZGV4ZWREYkF1ZGlvQnVmZmVyOjpmaWxsQnVmcyBmcmFtZUxlbjogJytmcmFtZUxlbik7XHJcbiAgICAgICAgICBpZiAodHJnU3RhdGUuZnJhbWVMZW4gPT09IDApIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgKGZyYW1lbGVuPT0wKSBjYWxsOiBjYmVuZCAnK2ZpbGxlZCk7XHJcbiAgICAgICAgICAgIGNiRW5kKHRyZ1N0YXRlLmZpbGxlZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpbGxCdWZzKGJhc2VVcmwsb3JnRnJhbWVMZW4sdHJnU3RhdGUsIHNyY1N0YXRlLCBjYiwgY2JFbmQsIGNiRXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgKGNodW5rIG5vdCBmb3VuZCkgY2FsbDogY2JlbmQgJytmaWxsZWQpO1xyXG4gICAgICAgICAgY2JFbmQodHJnU3RhdGUuZmlsbGVkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIChlcnIpID0+IHtcclxuICAgICAgICBjYkVycihlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBmcmFtZXNPYnMoZnJhbWVQb3M6bnVtYmVyLGZyYW1lTGVuOm51bWJlcixidWZzOkZsb2F0MzJBcnJheVtdKTpPYnNlcnZhYmxlPG51bWJlcj57XHJcblxyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPG51bWJlcj4oKHN1YnNjcmliZXIpPT57XHJcbiAgICAgIC8vIFBvc2l0aW9uaW5nXHJcbiAgICAgIGxldCBuZXdDaT1NYXRoLmZsb29yKGZyYW1lUG9zL3RoaXMuX25ldEFiLmNodW5rRnJhbWVMZW4pO1xyXG4gICAgICBpZihuZXdDaSE9PXRoaXMuX2N1cnJDaSl7XHJcbiAgICAgICAgdGhpcy5fY3VyckNpPW5ld0NpO1xyXG4gICAgICAgIHRoaXMuX2NjQ2FjaGU9bnVsbDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgc3JjRnJhbWVQb3M9bmV3Q2kqdGhpcy5fbmV0QWIuY2h1bmtGcmFtZUxlbjtcclxuICAgICAgbGV0IHRyZ1N0YXRlPXtmcmFtZVBvczpmcmFtZVBvcyxmcmFtZUxlbjpmcmFtZUxlbix0cmdCdWZzOmJ1ZnMsZmlsbGVkOjB9O1xyXG4gICAgICBsZXQgc3JjU3RhdGU9e29yZ1NyY0ZyYW1lUG9zOjAsc3JjRnJhbWVQb3M6c3JjRnJhbWVQb3MsY2k6bmV3Q2ksY2NQb3M6MCxjY0ZpbGxlZDowfTtcclxuICAgICAgdGhpcy5maWxsQnVmcyh0aGlzLl9uZXRBYi5iYXNlVXJsLHRoaXMuX25ldEFiLm9yZ0ZldGNoQ2h1bmtGcmFtZUxlbix0cmdTdGF0ZSxzcmNTdGF0ZSwodmFsKT0+e30sKGZpbGxlZDpudW1iZXIpPT57XHJcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGZpbGxlZCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9LGVyciA9PiB7XHJcbiAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2N1cnJDaT0wO1xyXG4gICAgdGhpcy5fY2NDYWNoZT1udWxsO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE5ldEF1ZGlvSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBBc3luY0Zsb2F0MzJBcnJheUlucHV0U3RyZWFte1xyXG5cclxuICBwcml2YXRlIGZyYW1lUG9zOm51bWJlcj0wO1xyXG4gIHByaXZhdGUgbmV0QWJTdHI6TmV0UmFuZG9tQWNjZXNzQXVkaW9TdHJlYW07XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZXRBYjpOZXRBdWRpb0J1ZmZlcikge1xyXG4gICAgICB0aGlzLm5ldEFiU3RyPW5ldyBOZXRSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbShuZXRBYik7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMubmV0QWJTdHIuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIHJlYWRPYnMoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8bnVtYmVyPihzdWJzY3I9PiB7XHJcbiAgICAgIGlmIChidWZmZXJzICYmIGJ1ZmZlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBmbCA9IGJ1ZmZlcnNbMF0ubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMubmV0QWJTdHIuZnJhbWVzT2JzKHRoaXMuZnJhbWVQb3MsIGZsLCBidWZmZXJzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlYWQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5mcmFtZVBvcyArPSByZWFkO1xyXG4gICAgICAgICAgICBzdWJzY3IubmV4dChyZWFkKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICBzdWJzY3IuY29tcGxldGUoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICBzdWJzY3IuZXJyb3IoZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBzdWJzY3IubmV4dCgwKTtcclxuICAgICAgICBzdWJzY3IuY29tcGxldGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBza2lwRnJhbWVzKG46IG51bWJlcik6dm9pZCB7XHJcbiAgICB0aGlzLmZyYW1lUG9zKz1uO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiJdfQ==
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
export class AudioClip {
|
|
2
|
-
constructor(_audioDataHolder) {
|
|
3
|
-
this._audioDataHolder = _audioDataHolder;
|
|
4
|
-
this._selection = null;
|
|
5
|
-
this._levelInfos = null;
|
|
6
|
-
this.selectionObservers = new Array();
|
|
7
|
-
}
|
|
8
|
-
get audioDataHolder() {
|
|
9
|
-
return this._audioDataHolder;
|
|
10
|
-
}
|
|
11
|
-
get selection() {
|
|
12
|
-
return this._selection;
|
|
13
|
-
}
|
|
14
|
-
set selection(value) {
|
|
15
|
-
this._selection = value;
|
|
16
|
-
// let obsCnt=this.selectionObservers.length
|
|
17
|
-
// this.selectionObservers.forEach((obs)=> {
|
|
18
|
-
// console.log("Calling observer")
|
|
19
|
-
// obs(this)
|
|
20
|
-
// });
|
|
21
|
-
for (let selObs of this.selectionObservers) {
|
|
22
|
-
selObs(this);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
get levelInfos() {
|
|
26
|
-
return this._levelInfos;
|
|
27
|
-
}
|
|
28
|
-
set levelInfos(value) {
|
|
29
|
-
this._levelInfos = value;
|
|
30
|
-
}
|
|
31
|
-
addSelectionObserver(selectionObserver, init = false) {
|
|
32
|
-
let obsAlreadyInList = this.selectionObservers.find((obs) => (obs === selectionObserver));
|
|
33
|
-
if (!obsAlreadyInList) {
|
|
34
|
-
this.selectionObservers.push(selectionObserver);
|
|
35
|
-
}
|
|
36
|
-
if (init) {
|
|
37
|
-
selectionObserver(this);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
removeSelectionObserver(selectionObserver) {
|
|
41
|
-
this.selectionObservers = this.selectionObservers.filter((obs) => obs !== selectionObserver);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// export interface Reader {
|
|
45
|
-
// read(data: Blob): AudioClip;
|
|
46
|
-
// }
|
|
47
|
-
// export interface Writer {
|
|
48
|
-
// write(audioData: AudioClip): Blob;
|
|
49
|
-
// }
|
|
50
|
-
export class Selection {
|
|
51
|
-
constructor(sampleRate, startFrame, endFrame) {
|
|
52
|
-
this._sampleRate = sampleRate;
|
|
53
|
-
this._startFrame = startFrame;
|
|
54
|
-
this._endFrame = endFrame;
|
|
55
|
-
}
|
|
56
|
-
get sampleRate() {
|
|
57
|
-
return this._sampleRate;
|
|
58
|
-
}
|
|
59
|
-
get endFrame() {
|
|
60
|
-
return this._endFrame;
|
|
61
|
-
}
|
|
62
|
-
get startFrame() {
|
|
63
|
-
return this._startFrame;
|
|
64
|
-
}
|
|
65
|
-
get leftFrame() {
|
|
66
|
-
return (this._startFrame <= this._endFrame) ? this._startFrame : this._endFrame;
|
|
67
|
-
}
|
|
68
|
-
get rightFrame() {
|
|
69
|
-
return (this._startFrame <= this._endFrame) ? this._endFrame : this._startFrame;
|
|
70
|
-
}
|
|
71
|
-
equals(otherSelection) {
|
|
72
|
-
if (otherSelection) {
|
|
73
|
-
return (this._sampleRate == otherSelection._sampleRate && this._startFrame === otherSelection._startFrame && this._endFrame === otherSelection._endFrame);
|
|
74
|
-
}
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
toString() {
|
|
78
|
-
return "Selection: from: " + this.leftFrame + " to: " + this.rightFrame + " frame. Refers to sample rate :" + this._sampleRate;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3BlcnNpc3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLE9BQU8sU0FBUztJQU1wQixZQUFvQixnQkFBZ0M7UUFBaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQjtRQUo1QyxlQUFVLEdBQWdCLElBQUksQ0FBQztRQUN6QixnQkFBVyxHQUFtQixJQUFJLENBQUM7UUFLL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFDLElBQUksS0FBSyxFQUErQixDQUFBO0lBQ2xFLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBcUI7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsNENBQTRDO1FBQzVDLDRDQUE0QztRQUM1QyxvQ0FBb0M7UUFDcEMsY0FBYztRQUNkLE1BQU07UUFDTixLQUFJLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxLQUF3QjtRQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsb0JBQW9CLENBQUMsaUJBQTZDLEVBQUMsSUFBSSxHQUFDLEtBQUs7UUFDM0UsSUFBSSxnQkFBZ0IsR0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFDLEVBQUUsQ0FBQSxDQUFDLEdBQUcsS0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7UUFDbkYsSUFBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1FBQ2pELENBQUM7UUFDRCxJQUFHLElBQUksRUFBQyxDQUFDO1lBQ1AsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxpQkFBNkM7UUFDbkUsSUFBSSxDQUFDLGtCQUFrQixHQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFBLEdBQUcsS0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7Q0FDRjtBQUVELDRCQUE0QjtBQUM1QixpQ0FBaUM7QUFDakMsSUFBSTtBQUNKLDRCQUE0QjtBQUM1Qix1Q0FBdUM7QUFDdkMsSUFBSTtBQUVKLE1BQU0sT0FBTyxTQUFTO0lBS3BCLFlBQVksVUFBaUIsRUFBQyxVQUFpQixFQUFDLFFBQWU7UUFDN0QsSUFBSSxDQUFDLFdBQVcsR0FBQyxVQUFVLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBQyxVQUFVLENBQUE7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBQyxRQUFRLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUNqRixDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFBO0lBQ2pGLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBdUM7UUFDNUMsSUFBRyxjQUFjLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxjQUFjLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssY0FBYyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1SixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sbUJBQW1CLEdBQUMsSUFBSSxDQUFDLFNBQVMsR0FBQyxPQUFPLEdBQUMsSUFBSSxDQUFDLFVBQVUsR0FBQyxpQ0FBaUMsR0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3ZILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TGV2ZWxJbmZvc30gZnJvbSBcIi4vZHNwL2xldmVsX21lYXN1cmVcIjtcclxuaW1wb3J0IHtBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXVkaW9DbGlwIHtcclxuXHJcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uOlNlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgICAgICAgcHJpdmF0ZSBfbGV2ZWxJbmZvczpMZXZlbEluZm9zIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgc2VsZWN0aW9uT2JzZXJ2ZXJzOkFycmF5PChhdWRpb0NsaXA6QXVkaW9DbGlwKT0+dm9pZD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2F1ZGlvRGF0YUhvbGRlcjpBdWRpb0RhdGFIb2xkZXIpIHtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGlvbk9ic2VydmVycz1uZXcgQXJyYXk8KGF1ZGlvQ2xpcDpBdWRpb0NsaXApPT52b2lkPigpXHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaW9EYXRhSG9sZGVyKCk6IEF1ZGlvRGF0YUhvbGRlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXVkaW9EYXRhSG9sZGVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlbGVjdGlvbigpOiBTZWxlY3Rpb258bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBzZXQgc2VsZWN0aW9uKHZhbHVlOiBTZWxlY3Rpb258bnVsbCkge1xyXG4gICAgdGhpcy5fc2VsZWN0aW9uID0gdmFsdWU7XHJcbiAgICAvLyBsZXQgb2JzQ250PXRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzLmxlbmd0aFxyXG4gICAgLy8gdGhpcy5zZWxlY3Rpb25PYnNlcnZlcnMuZm9yRWFjaCgob2JzKT0+IHtcclxuICAgIC8vICAgY29uc29sZS5sb2coXCJDYWxsaW5nIG9ic2VydmVyXCIpXHJcbiAgICAvLyAgIG9icyh0aGlzKVxyXG4gICAgLy8gfSk7XHJcbiAgICBmb3IobGV0IHNlbE9icyBvZiB0aGlzLnNlbGVjdGlvbk9ic2VydmVycyl7XHJcbiAgICAgIHNlbE9icyh0aGlzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxldmVsSW5mb3MoKTogTGV2ZWxJbmZvcyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xldmVsSW5mb3M7XHJcbiAgfVxyXG5cclxuICBzZXQgbGV2ZWxJbmZvcyh2YWx1ZTogTGV2ZWxJbmZvcyB8IG51bGwpIHtcclxuICAgIHRoaXMuX2xldmVsSW5mb3MgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGFkZFNlbGVjdGlvbk9ic2VydmVyKHNlbGVjdGlvbk9ic2VydmVyOihhdWRpb0NsaXA6QXVkaW9DbGlwKT0+dm9pZCxpbml0PWZhbHNlKXtcclxuICAgIGxldCBvYnNBbHJlYWR5SW5MaXN0PXRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzLmZpbmQoKG9icyk9PihvYnM9PT1zZWxlY3Rpb25PYnNlcnZlcikpXHJcbiAgICBpZighb2JzQWxyZWFkeUluTGlzdCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbk9ic2VydmVycy5wdXNoKHNlbGVjdGlvbk9ic2VydmVyKVxyXG4gICAgfVxyXG4gICAgaWYoaW5pdCl7XHJcbiAgICAgIHNlbGVjdGlvbk9ic2VydmVyKHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVTZWxlY3Rpb25PYnNlcnZlcihzZWxlY3Rpb25PYnNlcnZlcjooYXVkaW9DbGlwOkF1ZGlvQ2xpcCk9PnZvaWQpe1xyXG4gICAgdGhpcy5zZWxlY3Rpb25PYnNlcnZlcnM9dGhpcy5zZWxlY3Rpb25PYnNlcnZlcnMuZmlsdGVyKChvYnMpPT5vYnMhPT1zZWxlY3Rpb25PYnNlcnZlcik7XHJcbiAgfVxyXG59XHJcblxyXG4vLyBleHBvcnQgaW50ZXJmYWNlIFJlYWRlciB7XHJcbi8vICAgcmVhZChkYXRhOiBCbG9iKTogQXVkaW9DbGlwO1xyXG4vLyB9XHJcbi8vIGV4cG9ydCBpbnRlcmZhY2UgV3JpdGVyIHtcclxuLy8gICB3cml0ZShhdWRpb0RhdGE6IEF1ZGlvQ2xpcCk6IEJsb2I7XHJcbi8vIH1cclxuXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb257XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfc2FtcGxlUmF0ZTpudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhcnRGcmFtZTpudW1iZXI7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfZW5kRnJhbWU6bnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlOm51bWJlcixzdGFydEZyYW1lOm51bWJlcixlbmRGcmFtZTpudW1iZXIpe1xyXG4gICAgdGhpcy5fc2FtcGxlUmF0ZT1zYW1wbGVSYXRlO1xyXG4gICAgdGhpcy5fc3RhcnRGcmFtZT1zdGFydEZyYW1lXHJcbiAgICB0aGlzLl9lbmRGcmFtZT1lbmRGcmFtZTtcclxuICB9XHJcblxyXG4gIGdldCBzYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcbiAgZ2V0IGVuZEZyYW1lKCk6bnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZEZyYW1lO1xyXG4gIH1cclxuICBnZXQgc3RhcnRGcmFtZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0RnJhbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgbGVmdEZyYW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3N0YXJ0RnJhbWUgPD0gdGhpcy5fZW5kRnJhbWUpID8gdGhpcy5fc3RhcnRGcmFtZSA6IHRoaXMuX2VuZEZyYW1lXHJcbiAgfVxyXG4gIGdldCByaWdodEZyYW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3N0YXJ0RnJhbWUgPD0gdGhpcy5fZW5kRnJhbWUpID8gdGhpcy5fZW5kRnJhbWUgOiB0aGlzLl9zdGFydEZyYW1lXHJcbiAgfVxyXG5cclxuICBlcXVhbHMob3RoZXJTZWxlY3Rpb246U2VsZWN0aW9ufG51bGx8dW5kZWZpbmVkKTpib29sZWFue1xyXG4gICAgaWYob3RoZXJTZWxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuICh0aGlzLl9zYW1wbGVSYXRlID09IG90aGVyU2VsZWN0aW9uLl9zYW1wbGVSYXRlICYmIHRoaXMuX3N0YXJ0RnJhbWUgPT09IG90aGVyU2VsZWN0aW9uLl9zdGFydEZyYW1lICYmIHRoaXMuX2VuZEZyYW1lID09PSBvdGhlclNlbGVjdGlvbi5fZW5kRnJhbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKXtcclxuICAgIHJldHVybiBcIlNlbGVjdGlvbjogZnJvbTogXCIrdGhpcy5sZWZ0RnJhbWUrXCIgdG86IFwiK3RoaXMucmlnaHRGcmFtZStcIiBmcmFtZS4gUmVmZXJzIHRvIHNhbXBsZSByYXRlIDpcIit0aGlzLl9zYW1wbGVSYXRlO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdfQ==
|