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,259 +0,0 @@
|
|
|
1
|
-
import { Observable } from "rxjs";
|
|
2
|
-
export class EditFloat32ArrayInputStream {
|
|
3
|
-
constructor(_srcInputStream, offset = 0, length) {
|
|
4
|
-
this._srcInputStream = _srcInputStream;
|
|
5
|
-
this.offset = offset;
|
|
6
|
-
this.length = length;
|
|
7
|
-
this.framePos = 0;
|
|
8
|
-
this.readFrames = 0;
|
|
9
|
-
if (this.offset < 0) {
|
|
10
|
-
throw Error('Parameter offset must be undefined or greater or equal zero.');
|
|
11
|
-
}
|
|
12
|
-
if (this.length !== undefined && this.length < 0) {
|
|
13
|
-
throw Error('Parameter length must be undefined or greater or equal zero.');
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
skipToOffset() {
|
|
17
|
-
if (this.framePos == 0 && this.offset > 0) {
|
|
18
|
-
this._srcInputStream.skipFrames(this.offset);
|
|
19
|
-
this.framePos += this.offset;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
read(buffers) {
|
|
23
|
-
this.skipToOffset();
|
|
24
|
-
let read = 0;
|
|
25
|
-
if (this.length === undefined) {
|
|
26
|
-
read = this._srcInputStream.read(buffers);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
if (buffers.length > 0) {
|
|
30
|
-
let bufsCh0 = buffers[0];
|
|
31
|
-
let bufsLen = bufsCh0.length;
|
|
32
|
-
let avail = this.length - this.readFrames;
|
|
33
|
-
if (avail > 0) {
|
|
34
|
-
if (avail > bufsLen) {
|
|
35
|
-
read = this._srcInputStream.read(buffers);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
// temporary buffers required
|
|
39
|
-
let tmpBufs = new Array(buffers.length);
|
|
40
|
-
for (let ch = 0; ch < buffers.length; ch++) {
|
|
41
|
-
tmpBufs[ch] = new Float32Array(avail);
|
|
42
|
-
}
|
|
43
|
-
read = this._srcInputStream.read(tmpBufs);
|
|
44
|
-
for (let ch = 0; ch < buffers.length; ch++) {
|
|
45
|
-
buffers[ch].set(tmpBufs[ch]);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
this.readFrames += read;
|
|
52
|
-
this.framePos += read;
|
|
53
|
-
return read;
|
|
54
|
-
}
|
|
55
|
-
skipFrames(n) {
|
|
56
|
-
this.skipToOffset();
|
|
57
|
-
if (this.length === undefined) {
|
|
58
|
-
this._srcInputStream.skipFrames(n);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
let avail = this.length - this.readFrames;
|
|
62
|
-
if (avail > 0) {
|
|
63
|
-
if (avail >= n) {
|
|
64
|
-
this._srcInputStream.skipFrames(n);
|
|
65
|
-
this.readFrames += n;
|
|
66
|
-
this.framePos += n;
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
throw Error('Tried to skip out of bounds.');
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
close() {
|
|
75
|
-
this._srcInputStream.close();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
export class AsyncEditFloat32ArrayInputStream {
|
|
79
|
-
constructor(_srcInputStream, offset = 0, length) {
|
|
80
|
-
this._srcInputStream = _srcInputStream;
|
|
81
|
-
this.offset = offset;
|
|
82
|
-
this.length = length;
|
|
83
|
-
this.framePos = 0;
|
|
84
|
-
this.readFrames = 0;
|
|
85
|
-
if (this.offset < 0) {
|
|
86
|
-
throw Error('Parameter offset must be undefined or greater or equal zero.');
|
|
87
|
-
}
|
|
88
|
-
if (this.length !== undefined && this.length < 0) {
|
|
89
|
-
throw Error('Parameter length must be undefined or greater or equal zero.');
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
skipToOffset() {
|
|
93
|
-
if (this.framePos == 0 && this.offset > 0) {
|
|
94
|
-
this._srcInputStream.skipFrames(this.offset);
|
|
95
|
-
this.framePos += this.offset;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
readObs(buffers) {
|
|
99
|
-
return new Observable(subscriber => {
|
|
100
|
-
this.skipToOffset();
|
|
101
|
-
if (this.length === undefined) {
|
|
102
|
-
this._srcInputStream.readObs(buffers).subscribe(subscriber);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
if (buffers.length > 0) {
|
|
106
|
-
let bufsCh0 = buffers[0];
|
|
107
|
-
let bufsLen = bufsCh0.length;
|
|
108
|
-
let avail = this.length - this.readFrames;
|
|
109
|
-
if (avail > 0) {
|
|
110
|
-
if (avail > bufsLen) {
|
|
111
|
-
this._srcInputStream.readObs(buffers).subscribe({
|
|
112
|
-
next: (read) => {
|
|
113
|
-
this.readFrames += read;
|
|
114
|
-
this.framePos += read;
|
|
115
|
-
subscriber.next(read);
|
|
116
|
-
}, complete: () => {
|
|
117
|
-
subscriber.complete();
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
// temporary buffers required
|
|
123
|
-
let tmpBufs = new Array(buffers.length);
|
|
124
|
-
for (let ch = 0; ch < buffers.length; ch++) {
|
|
125
|
-
tmpBufs[ch] = new Float32Array(avail);
|
|
126
|
-
}
|
|
127
|
-
this._srcInputStream.readObs(tmpBufs).subscribe({
|
|
128
|
-
next: (read) => {
|
|
129
|
-
for (let ch = 0; ch < buffers.length; ch++) {
|
|
130
|
-
buffers[ch].set(tmpBufs[ch]);
|
|
131
|
-
}
|
|
132
|
-
this.readFrames += read;
|
|
133
|
-
this.framePos += read;
|
|
134
|
-
subscriber.next(read);
|
|
135
|
-
}, complete: () => {
|
|
136
|
-
subscriber.complete();
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
// end of stream
|
|
143
|
-
subscriber.next(0);
|
|
144
|
-
subscriber.complete();
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
subscriber.next(0);
|
|
149
|
-
subscriber.complete();
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
skipFrames(n) {
|
|
155
|
-
this.skipToOffset();
|
|
156
|
-
if (this.length === undefined) {
|
|
157
|
-
this._srcInputStream.skipFrames(n);
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
let avail = this.length - this.readFrames;
|
|
161
|
-
if (avail > 0) {
|
|
162
|
-
if (avail >= n) {
|
|
163
|
-
this._srcInputStream.skipFrames(n);
|
|
164
|
-
this.readFrames += n;
|
|
165
|
-
this.framePos += n;
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
throw Error('Tried to skip out of bounds.');
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
close() {
|
|
174
|
-
this._srcInputStream.close();
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
export class Float32ArrayChunkerOutStream {
|
|
178
|
-
constructor(outStream) {
|
|
179
|
-
this.outStream = outStream;
|
|
180
|
-
this.bufs = new Array();
|
|
181
|
-
this._channels = 0;
|
|
182
|
-
this._chunkSize = 0;
|
|
183
|
-
this.filled = 0;
|
|
184
|
-
this.receivedFrames = 0;
|
|
185
|
-
this.sentFrames = 0;
|
|
186
|
-
}
|
|
187
|
-
createBuffers() {
|
|
188
|
-
this.bufs = new Array(this._channels);
|
|
189
|
-
for (let ch = 0; ch < this._channels; ch++) {
|
|
190
|
-
this.bufs[ch] = new Float32Array(this._chunkSize);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
set chunkSize(chunkSize) {
|
|
194
|
-
this._chunkSize = chunkSize;
|
|
195
|
-
this.createBuffers();
|
|
196
|
-
}
|
|
197
|
-
get chunkSize() {
|
|
198
|
-
return this._chunkSize;
|
|
199
|
-
}
|
|
200
|
-
set channels(channels) {
|
|
201
|
-
this._channels = channels;
|
|
202
|
-
this.createBuffers();
|
|
203
|
-
}
|
|
204
|
-
get channels() {
|
|
205
|
-
return this._channels;
|
|
206
|
-
}
|
|
207
|
-
available() {
|
|
208
|
-
return this._chunkSize - this.filled;
|
|
209
|
-
}
|
|
210
|
-
write(buffers) {
|
|
211
|
-
let copied = 0;
|
|
212
|
-
if (buffers.length > 0) {
|
|
213
|
-
let buffersLen = buffers[0].length;
|
|
214
|
-
this.receivedFrames += buffersLen;
|
|
215
|
-
let avail = buffersLen;
|
|
216
|
-
// Fill out buffers until all values copied
|
|
217
|
-
while (avail > 0) {
|
|
218
|
-
let toFill = this._chunkSize - this.filled;
|
|
219
|
-
if (toFill > avail) {
|
|
220
|
-
toFill = avail;
|
|
221
|
-
}
|
|
222
|
-
let sliceEnd = copied + toFill;
|
|
223
|
-
// Firefox on Android sends only the first channel
|
|
224
|
-
for (let ch = 0; ch < buffersLen; ch++) {
|
|
225
|
-
if (buffers[ch]) {
|
|
226
|
-
let cpPrt = buffers[ch].slice(copied, sliceEnd);
|
|
227
|
-
let buf = this.bufs[ch];
|
|
228
|
-
buf.set(cpPrt, this.filled);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
copied += toFill;
|
|
232
|
-
avail -= toFill;
|
|
233
|
-
this.filled += toFill;
|
|
234
|
-
if (this.filled == this._chunkSize) {
|
|
235
|
-
this.outStream.write(this.bufs);
|
|
236
|
-
this.sentFrames += this.filled;
|
|
237
|
-
this.filled = 0;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
return copied;
|
|
242
|
-
}
|
|
243
|
-
flush() {
|
|
244
|
-
if (this.filled > 0) {
|
|
245
|
-
let restBufs = new Array(this._channels);
|
|
246
|
-
for (let ch = 0; ch < this._channels; ch++) {
|
|
247
|
-
restBufs[ch] = this.bufs[ch].slice(0, this.filled);
|
|
248
|
-
}
|
|
249
|
-
this.outStream.write(restBufs);
|
|
250
|
-
this.outStream.flush();
|
|
251
|
-
this.sentFrames += this.filled;
|
|
252
|
-
this.filled = 0;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
close() {
|
|
256
|
-
this.outStream.close();
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2lvL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBY2hDLE1BQU0sT0FBTywyQkFBMkI7SUFHdEMsWUFBb0IsZUFBdUMsRUFBUyxTQUFjLENBQUMsRUFBUyxNQUF3QjtRQUFoRyxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFGNUcsYUFBUSxHQUFDLENBQUMsQ0FBQztRQUNYLGVBQVUsR0FBQyxDQUFDLENBQUM7UUFFbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQyxDQUFDO1lBQ2YsTUFBTSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQyxDQUFDO1lBQzVDLE1BQU0sS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDOUUsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUcsSUFBSSxDQUFDLFFBQVEsSUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLFFBQVEsSUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQTRCO1FBQy9CLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksR0FBQyxD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Q0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFHRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBR0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZsb2F0MzJBcnJheUlucHV0U3RyZWFte1xyXG4gIHJlYWQoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IG51bWJlcjtcclxuICBza2lwRnJhbWVzKG46bnVtYmVyKTp2b2lkO1xyXG4gIGNsb3NlKCk6dm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBc3luY0Zsb2F0MzJBcnJheUlucHV0U3RyZWFte1xyXG4gIHJlYWRPYnMoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6T2JzZXJ2YWJsZTxudW1iZXI+O1xyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpOnZvaWQ7XHJcbiAgY2xvc2UoKTp2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRWRpdEZsb2F0MzJBcnJheUlucHV0U3RyZWFtIGltcGxlbWVudHMgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcbiAgcHJpdmF0ZSBmcmFtZVBvcz0wO1xyXG4gIHByaXZhdGUgcmVhZEZyYW1lcz0wO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NyY0lucHV0U3RyZWFtOkZsb2F0MzJBcnJheUlucHV0U3RyZWFtLHByaXZhdGUgb2Zmc2V0Om51bWJlcj0wLHByaXZhdGUgbGVuZ3RoPzpudW1iZXJ8dW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhpcy5vZmZzZXQ8MCl7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1BhcmFtZXRlciBvZmZzZXQgbXVzdCBiZSB1bmRlZmluZWQgb3IgZ3JlYXRlciBvciBlcXVhbCB6ZXJvLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGVuZ3RoIT09dW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoPDApe1xyXG4gICAgICB0aHJvdyBFcnJvcignUGFyYW1ldGVyIGxlbmd0aCBtdXN0IGJlIHVuZGVmaW5lZCBvciBncmVhdGVyIG9yIGVxdWFsIHplcm8uJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNraXBUb09mZnNldCgpe1xyXG4gICAgaWYodGhpcy5mcmFtZVBvcz09MCAmJiB0aGlzLm9mZnNldD4wKXtcclxuICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uc2tpcEZyYW1lcyh0aGlzLm9mZnNldCk7XHJcbiAgICAgIHRoaXMuZnJhbWVQb3MrPXRoaXMub2Zmc2V0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVhZChidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogbnVtYmVye1xyXG4gICAgdGhpcy5za2lwVG9PZmZzZXQoKTtcclxuICAgIGxldCByZWFkPTA7XHJcbiAgICBpZih0aGlzLmxlbmd0aD09PXVuZGVmaW5lZCl7XHJcbiAgICAgIHJlYWQgPSB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcnMpO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBpZiAoYnVmZmVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IGJ1ZnNDaDAgPSBidWZmZXJzWzBdO1xyXG4gICAgICAgIGxldCBidWZzTGVuID0gYnVmc0NoMC5sZW5ndGg7XHJcbiAgICAgICAgbGV0IGF2YWlsID0gdGhpcy5sZW5ndGggLSB0aGlzLnJlYWRGcmFtZXM7XHJcbiAgICAgICAgaWYgKGF2YWlsID4gMCkge1xyXG4gICAgICAgICAgaWYgKGF2YWlsID4gYnVmc0xlbikge1xyXG4gICAgICAgICAgICByZWFkID0gdGhpcy5fc3JjSW5wdXRTdHJlYW0ucmVhZChidWZmZXJzKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHRlbXBvcmFyeSBidWZmZXJzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgIGxldCB0bXBCdWZzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oYnVmZmVycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgYnVmZmVycy5sZW5ndGg7IGNoKyspIHtcclxuICAgICAgICAgICAgICB0bXBCdWZzW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoYXZhaWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlYWQgPSB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkKHRtcEJ1ZnMpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgYnVmZmVycy5sZW5ndGg7IGNoKyspIHtcclxuICAgICAgICAgICAgICBidWZmZXJzW2NoXS5zZXQodG1wQnVmc1tjaF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlYWRGcmFtZXMrPXJlYWQ7XHJcbiAgICB0aGlzLmZyYW1lUG9zKz1yZWFkO1xyXG4gICAgcmV0dXJuIHJlYWQ7XHJcbiAgfVxyXG5cclxuICBza2lwRnJhbWVzKG46bnVtYmVyKTp2b2lke1xyXG4gICAgdGhpcy5za2lwVG9PZmZzZXQoKTtcclxuICAgIGlmKHRoaXMubGVuZ3RoPT09dW5kZWZpbmVkKXtcclxuICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uc2tpcEZyYW1lcyhuKTtcclxuICAgIH1lbHNlIHtcclxuICAgICAgbGV0IGF2YWlsID0gdGhpcy5sZW5ndGggLSB0aGlzLnJlYWRGcmFtZXM7XHJcbiAgICAgIGlmIChhdmFpbCA+IDApIHtcclxuICAgICAgICBpZiAoYXZhaWwgPj0gbikge1xyXG4gICAgICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uc2tpcEZyYW1lcyhuKTtcclxuICAgICAgICAgIHRoaXMucmVhZEZyYW1lcyArPSBuO1xyXG4gICAgICAgICAgdGhpcy5mcmFtZVBvcyArPSBuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBFcnJvcignVHJpZWQgdG8gc2tpcCBvdXQgb2YgYm91bmRzLicpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOnZvaWR7XHJcbiAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5jbG9zZSgpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBBc3luY0VkaXRGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIEFzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcbiAgcHJpdmF0ZSBmcmFtZVBvcz0wO1xyXG4gIHByaXZhdGUgcmVhZEZyYW1lcz0wO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NyY0lucHV0U3RyZWFtOkFzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW0scHJpdmF0ZSBvZmZzZXQ6bnVtYmVyPTAscHJpdmF0ZSBsZW5ndGg/Om51bWJlcnx1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLm9mZnNldDwwKXtcclxuICAgICAgdGhyb3cgRXJyb3IoJ1BhcmFtZXRlciBvZmZzZXQgbXVzdCBiZSB1bmRlZmluZWQgb3IgZ3JlYXRlciBvciBlcXVhbCB6ZXJvLicpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGVuZ3RoIT09dW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoPDApe1xyXG4gICAgICB0aHJvdyBFcnJvcignUGFyYW1ldGVyIGxlbmd0aCBtdXN0IGJlIHVuZGVmaW5lZCBvciBncmVhdGVyIG9yIGVxdWFsIHplcm8uJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNraXBUb09mZnNldCgpe1xyXG4gICAgaWYodGhpcy5mcmFtZVBvcz09MCAmJiB0aGlzLm9mZnNldD4wKXtcclxuICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uc2tpcEZyYW1lcyh0aGlzLm9mZnNldCk7XHJcbiAgICAgIHRoaXMuZnJhbWVQb3MrPXRoaXMub2Zmc2V0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVhZE9icyhidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxudW1iZXI+KHN1YnNjcmliZXI9PntcclxuICAgICAgdGhpcy5za2lwVG9PZmZzZXQoKTtcclxuICAgICAgaWYodGhpcy5sZW5ndGg9PT11bmRlZmluZWQpe1xyXG4gICAgICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLnJlYWRPYnMoYnVmZmVycykuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGJ1ZnNDaDAgPSBidWZmZXJzWzBdO1xyXG4gICAgICAgICAgbGV0IGJ1ZnNMZW4gPSBidWZzQ2gwLmxlbmd0aDtcclxuICAgICAgICAgIGxldCBhdmFpbCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5yZWFkRnJhbWVzO1xyXG4gICAgICAgICAgaWYgKGF2YWlsID4gMCkge1xyXG4gICAgICAgICAgICBpZiAoYXZhaWwgPiBidWZzTGVuKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0ucmVhZE9icyhidWZmZXJzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogKHJlYWQpPT57XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVhZEZyYW1lcys9cmVhZDtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZVBvcys9cmVhZDtcclxuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlYWQpO1xyXG4gICAgICAgICAgICAgICAgfSxjb21wbGV0ZTooKT0+e1xyXG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyB0ZW1wb3JhcnkgYnVmZmVycyByZXF1aXJlZFxyXG4gICAgICAgICAgICAgIGxldCB0bXBCdWZzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oYnVmZmVycy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgdG1wQnVmc1tjaF0gPSBuZXcgRmxvYXQzMkFycmF5KGF2YWlsKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0ucmVhZE9icyh0bXBCdWZzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDoocmVhZCk9PntcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICBidWZmZXJzW2NoXS5zZXQodG1wQnVmc1tjaF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkRnJhbWVzKz1yZWFkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFtZVBvcys9cmVhZDtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChyZWFkKTtcclxuICAgICAgICAgICAgICB9LGNvbXBsZXRlOigpPT57XHJcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vIGVuZCBvZiBzdHJlYW1cclxuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KDApO1xyXG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoMCk7XHJcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpOnZvaWR7XHJcbiAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgaWYodGhpcy5sZW5ndGg9PT11bmRlZmluZWQpe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBsZXQgYXZhaWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMucmVhZEZyYW1lcztcclxuICAgICAgaWYgKGF2YWlsID4gMCkge1xyXG4gICAgICAgIGlmIChhdmFpbCA+PSBuKSB7XHJcbiAgICAgICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgICAgICAgdGhpcy5yZWFkRnJhbWVzICs9IG47XHJcbiAgICAgICAgICB0aGlzLmZyYW1lUG9zICs9IG47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBza2lwIG91dCBvZiBib3VuZHMuJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlKCk6dm9pZHtcclxuICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmxvYXQzMkFycmF5T3V0U3RyZWFtIHtcclxuXHJcbiAgd3JpdGUoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IG51bWJlcjtcclxuXHJcbiAgZmx1c2goKTogdm9pZDtcclxuXHJcbiAgY2xvc2UoKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEZsb2F0MzJBcnJheUNodW5rZXJPdXRTdHJlYW0gaW1wbGVtZW50cyBGbG9hdDMyQXJyYXlPdXRTdHJlYW0ge1xyXG5cclxuICBwcml2YXRlIGJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpO1xyXG4gIHByaXZhdGUgZmlsbGVkOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgX2NoYW5uZWxzOiBudW1iZXI9MDtcclxuICBwcml2YXRlIF9jaHVua1NpemU6IG51bWJlcj0wO1xyXG5cclxuICBwcml2YXRlIHJlY2VpdmVkRnJhbWVzOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBzZW50RnJhbWVzOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb3V0U3RyZWFtOiBGbG9hdDMyQXJyYXlPdXRTdHJlYW0pIHtcclxuICAgIHRoaXMuZmlsbGVkID0gMDtcclxuICAgIHRoaXMucmVjZWl2ZWRGcmFtZXMgPSAwO1xyXG4gICAgdGhpcy5zZW50RnJhbWVzID0gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQnVmZmVycygpIHtcclxuICAgIHRoaXMuYnVmcyA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KHRoaXMuX2NoYW5uZWxzKTtcclxuICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLl9jaGFubmVsczsgY2grKykge1xyXG4gICAgICB0aGlzLmJ1ZnNbY2hdID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLl9jaHVua1NpemUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IGNodW5rU2l6ZShjaHVua1NpemU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY2h1bmtTaXplID0gY2h1bmtTaXplO1xyXG4gICAgdGhpcy5jcmVhdGVCdWZmZXJzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2h1bmtTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtTaXplO1xyXG4gIH1cclxuXHJcbiAgc2V0IGNoYW5uZWxzKGNoYW5uZWxzOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2NoYW5uZWxzID0gY2hhbm5lbHM7XHJcbiAgICB0aGlzLmNyZWF0ZUJ1ZmZlcnMoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaGFubmVscygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxzO1xyXG4gIH1cclxuXHJcblxyXG4gIGF2YWlsYWJsZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NodW5rU2l6ZS10aGlzLmZpbGxlZDtcclxuICB9XHJcblxyXG4gIHdyaXRlKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBudW1iZXIge1xyXG5cclxuICAgIGxldCBjb3BpZWQgPSAwO1xyXG4gICAgaWYoYnVmZmVycy5sZW5ndGg+MCkge1xyXG4gICAgICBsZXQgYnVmZmVyc0xlbiA9IGJ1ZmZlcnNbMF0ubGVuZ3RoO1xyXG4gICAgICB0aGlzLnJlY2VpdmVkRnJhbWVzICs9IGJ1ZmZlcnNMZW47XHJcbiAgICAgIGxldCBhdmFpbCA9IGJ1ZmZlcnNMZW47XHJcbiAgICAgIC8vIEZpbGwgb3V0IGJ1ZmZlcnMgdW50aWwgYWxsIHZhbHVlcyBjb3BpZWRcclxuXHJcbiAgICAgIHdoaWxlIChhdmFpbCA+IDApIHtcclxuICAgICAgICBsZXQgdG9GaWxsID0gdGhpcy5fY2h1bmtTaXplIC0gdGhpcy5maWxsZWQ7XHJcbiAgICAgICAgaWYgKHRvRmlsbCA+IGF2YWlsKSB7XHJcbiAgICAgICAgICB0b0ZpbGwgPSBhdmFpbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNsaWNlRW5kID0gY29waWVkICsgdG9GaWxsO1xyXG5cclxuICAgICAgICAvLyBGaXJlZm94IG9uIEFuZHJvaWQgc2VuZHMgb25seSB0aGUgZmlyc3QgY2hhbm5lbFxyXG4gICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzTGVuOyBjaCsrKSB7XHJcbiAgICAgICAgICBpZihidWZmZXJzW2NoXSkge1xyXG4gICAgICAgICAgICBsZXQgY3BQcnQgPSBidWZmZXJzW2NoXS5zbGljZShjb3BpZWQsIHNsaWNlRW5kKTtcclxuICAgICAgICAgICAgbGV0IGJ1ZiA9IHRoaXMuYnVmc1tjaF07XHJcbiAgICAgICAgICAgIGJ1Zi5zZXQoY3BQcnQsIHRoaXMuZmlsbGVkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29waWVkICs9IHRvRmlsbDtcclxuICAgICAgICBhdmFpbCAtPSB0b0ZpbGw7XHJcbiAgICAgICAgdGhpcy5maWxsZWQgKz0gdG9GaWxsO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbGxlZCA9PSB0aGlzLl9jaHVua1NpemUpIHtcclxuICAgICAgICAgIHRoaXMub3V0U3RyZWFtLndyaXRlKHRoaXMuYnVmcyk7XHJcbiAgICAgICAgICB0aGlzLnNlbnRGcmFtZXMgKz0gdGhpcy5maWxsZWQ7XHJcbiAgICAgICAgICB0aGlzLmZpbGxlZCA9IDA7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvcGllZDtcclxuICB9XHJcblxyXG4gIGZsdXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmlsbGVkID4gMCkge1xyXG4gICAgICBsZXQgcmVzdEJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5Pih0aGlzLl9jaGFubmVscyk7XHJcbiAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLl9jaGFubmVsczsgY2grKykge1xyXG4gICAgICAgIHJlc3RCdWZzW2NoXSA9IHRoaXMuYnVmc1tjaF0uc2xpY2UoMCwgdGhpcy5maWxsZWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub3V0U3RyZWFtLndyaXRlKHJlc3RCdWZzKTtcclxuICAgICAgdGhpcy5vdXRTdHJlYW0uZmx1c2goKTtcclxuICAgICAgdGhpcy5zZW50RnJhbWVzICs9IHRoaXMuZmlsbGVkO1xyXG4gICAgICB0aGlzLmZpbGxlZCA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLm91dFN0cmVhbS5jbG9zZSgpO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiJdfQ==
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export class Position {
|
|
2
|
-
constructor(left, top) {
|
|
3
|
-
this.left = left;
|
|
4
|
-
this.top = top;
|
|
5
|
-
}
|
|
6
|
-
toString() {
|
|
7
|
-
return this.left + "," + this.top;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export class Dimension {
|
|
11
|
-
constructor(width, height) {
|
|
12
|
-
this.width = width;
|
|
13
|
-
this.height = height;
|
|
14
|
-
}
|
|
15
|
-
toString() {
|
|
16
|
-
return this.width + "x" + this.height;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export class Rectangle {
|
|
20
|
-
constructor(position, dimension) {
|
|
21
|
-
this.position = position;
|
|
22
|
-
this.dimension = dimension;
|
|
23
|
-
}
|
|
24
|
-
toString() {
|
|
25
|
-
return this.position + ":" + this.dimension;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbWF0aC8yZC9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sUUFBUTtJQUNuQixZQUFtQixJQUFXLEVBQVEsR0FBVTtRQUE3QixTQUFJLEdBQUosSUFBSSxDQUFPO1FBQVEsUUFBRyxHQUFILEdBQUcsQ0FBTztJQUVoRCxDQUFDO0lBQ0QsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksR0FBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQTtJQUMvQixDQUFDO0NBQ0Y7QUFHRCxNQUFNLE9BQU8sU0FBUztJQUNwQixZQUFtQixLQUFZLEVBQVEsTUFBYTtRQUFqQyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQVEsV0FBTSxHQUFOLE1BQU0sQ0FBTztJQUVwRCxDQUFDO0lBQ0QsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssR0FBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUNuQyxDQUFDO0NBQ0Y7QUFHRCxNQUFNLE9BQU8sU0FBUztJQUVwQixZQUFtQixRQUFpQixFQUFRLFNBQW1CO1FBQTVDLGFBQVEsR0FBUixRQUFRLENBQVM7UUFBUSxjQUFTLEdBQVQsU0FBUyxDQUFVO0lBRS9ELENBQUM7SUFDRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxHQUFDLEdBQUcsR0FBQyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQ3pDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBQb3NpdGlvbntcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbGVmdDpudW1iZXIscHVibGljIHRvcDpudW1iZXIpe1xyXG5cclxuICB9XHJcbiAgdG9TdHJpbmcoKTpzdHJpbmd7XHJcbiAgICByZXR1cm4gdGhpcy5sZWZ0K1wiLFwiK3RoaXMudG9wXHJcbiAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIERpbWVuc2lvbiB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHdpZHRoOm51bWJlcixwdWJsaWMgaGVpZ2h0Om51bWJlcil7XHJcblxyXG4gIH1cclxuICB0b1N0cmluZygpOnN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLndpZHRoK1wieFwiK3RoaXMuaGVpZ2h0XHJcbiAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY3RhbmdsZXtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHBvc2l0aW9uOlBvc2l0aW9uLHB1YmxpYyBkaW1lbnNpb246RGltZW5zaW9uKXtcclxuXHJcbiAgfVxyXG4gIHRvU3RyaW5nKCk6c3RyaW5ne1xyXG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb24rXCI6XCIrdGhpcy5kaW1lbnNpb25cclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
export class Complex {
|
|
2
|
-
static fromPolarForm(magnitude, argument) {
|
|
3
|
-
const r = Math.cos(argument) * magnitude;
|
|
4
|
-
const i = Math.sin(argument) * magnitude;
|
|
5
|
-
return new Complex(r, i);
|
|
6
|
-
}
|
|
7
|
-
constructor(real, img) {
|
|
8
|
-
this.real = real;
|
|
9
|
-
this.img = img;
|
|
10
|
-
}
|
|
11
|
-
magnitude() {
|
|
12
|
-
return Math.sqrt((this.real * this.real) + (this.img * this.img));
|
|
13
|
-
}
|
|
14
|
-
argument() {
|
|
15
|
-
return Math.atan2(this.img, this.real);
|
|
16
|
-
}
|
|
17
|
-
add(addC) {
|
|
18
|
-
return new Complex(this.real + addC.real, this.img + addC.img);
|
|
19
|
-
}
|
|
20
|
-
sub(subC) {
|
|
21
|
-
return new Complex(this.real - subC.real, this.img - subC.img);
|
|
22
|
-
}
|
|
23
|
-
mult(multC) {
|
|
24
|
-
const multR = (this.real * multC.real) - (this.img * multC.img);
|
|
25
|
-
const multI = (this.real * multC.img) + (multC.real * this.img);
|
|
26
|
-
return new Complex(multR, multI);
|
|
27
|
-
}
|
|
28
|
-
multReal(multF) {
|
|
29
|
-
return new Complex(this.real * multF, this.img * multF);
|
|
30
|
-
}
|
|
31
|
-
div(divisor) {
|
|
32
|
-
const divReal = divisor.real;
|
|
33
|
-
const divImg = divisor.img;
|
|
34
|
-
const div = (divReal * divReal) + (divImg * divImg);
|
|
35
|
-
const divisionReal = ((this.real * divReal) + (this.img * divImg)) / div;
|
|
36
|
-
const divisionImg = ((divReal * this.img) - (this.real * divImg)) / div;
|
|
37
|
-
return new Complex(divisionReal, divisionImg);
|
|
38
|
-
}
|
|
39
|
-
divReal(divisor) {
|
|
40
|
-
const div = divisor * divisor;
|
|
41
|
-
const divsionReal = (this.real * divisor) / div;
|
|
42
|
-
const divsionImg = (divisor * this.img) / div;
|
|
43
|
-
return new Complex(divsionReal, divsionImg);
|
|
44
|
-
}
|
|
45
|
-
conjugate() {
|
|
46
|
-
return new Complex(this.real, -this.img);
|
|
47
|
-
}
|
|
48
|
-
equals(c) {
|
|
49
|
-
if (c === null) {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
return (this.real === c.real && this.img === c.img);
|
|
53
|
-
}
|
|
54
|
-
toString() {
|
|
55
|
-
return 'Real: ' + this.real + ', Img: ' + this.img;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9tYXRoL2NvbXBsZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0ksTUFBTSxPQUFPLE9BQU87SUFLVCxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQWlCLEVBQUUsUUFBZ0I7UUFDM0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDekMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDekMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNELFlBQVksSUFBWSxFQUFFLEdBQVc7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUNNLFNBQVM7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVNLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLEdBQUcsQ0FBQyxJQUFhO1FBQ3BCLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lB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ICAgICAgcmVhbDogbnVtYmVyO1xyXG4gICAgICAgIGltZzogbnVtYmVyO1xyXG5cclxuICAgICAgICBwdWJsaWMgc3RhdGljIGZyb21Qb2xhckZvcm0obWFnbml0dWRlOiBudW1iZXIsIGFyZ3VtZW50OiBudW1iZXIpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgY29uc3QgciA9IE1hdGguY29zKGFyZ3VtZW50KSAqIG1hZ25pdHVkZTtcclxuICAgICAgICAgICAgY29uc3QgaSA9IE1hdGguc2luKGFyZ3VtZW50KSAqIG1hZ25pdHVkZTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHIsIGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdHJ1Y3RvcihyZWFsOiBudW1iZXIsIGltZzogbnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVhbCA9IHJlYWw7XHJcbiAgICAgICAgICAgIHRoaXMuaW1nID0gaW1nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwdWJsaWMgbWFnbml0dWRlKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoKHRoaXMucmVhbCAqIHRoaXMucmVhbCkgKyAodGhpcy5pbWcgKiB0aGlzLmltZykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIGFyZ3VtZW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMuaW1nLCB0aGlzLnJlYWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIGFkZChhZGRDOiBDb21wbGV4KTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwgKyBhZGRDLnJlYWwsIHRoaXMuaW1nICsgYWRkQy5pbWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIHN1YihzdWJDOiBDb21wbGV4KTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwgLSBzdWJDLnJlYWwsIHRoaXMuaW1nIC0gc3ViQy5pbWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIG11bHQobXVsdEM6IENvbXBsZXgpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgY29uc3QgbXVsdFIgPSAodGhpcy5yZWFsICogbXVsdEMucmVhbCkgLSAodGhpcy5pbWcgKiBtdWx0Qy5pbWcpO1xyXG4gICAgICAgICAgICBjb25zdCBtdWx0SSA9ICh0aGlzLnJlYWwgKiBtdWx0Qy5pbWcpICsgKG11bHRDLnJlYWwgKiB0aGlzLmltZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleChtdWx0UiwgbXVsdEkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIG11bHRSZWFsKG11bHRGOiBudW1iZXIpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHRoaXMucmVhbCAqIG11bHRGLCB0aGlzLmltZyAqIG11bHRGKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBkaXYoZGl2aXNvcjogQ29tcGxleCk6IENvbXBsZXgge1xyXG4gICAgICAgICAgICBjb25zdCBkaXZSZWFsID0gZGl2aXNvci5yZWFsO1xyXG4gICAgICAgICAgICBjb25zdCBkaXZJbWcgPSBkaXZpc29yLmltZztcclxuICAgICAgICAgICAgY29uc3QgZGl2ID0gKGRpdlJlYWwgKiBkaXZSZWFsKSArIChkaXZJbWcgKiBkaXZJbWcpO1xyXG4gICAgICAgICAgICBjb25zdCBkaXZpc2lvblJlYWwgPSAoKHRoaXMucmVhbCAqIGRpdlJlYWwpICsgKHRoaXMuaW1nICogZGl2SW1nKSkgLyBkaXY7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpdmlzaW9uSW1nID0gKChkaXZSZWFsICogdGhpcy5pbWcpIC0gKHRoaXMucmVhbCAqIGRpdkltZykpIC8gZGl2O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KGRpdmlzaW9uUmVhbCwgZGl2aXNpb25JbWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIGRpdlJlYWwoZGl2aXNvcjogbnVtYmVyKTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRpdmlzb3IgKiBkaXZpc29yO1xyXG4gICAgICAgICAgICBjb25zdCBkaXZzaW9uUmVhbCA9ICh0aGlzLnJlYWwgKiBkaXZpc29yKSAvIGRpdjtcclxuICAgICAgICAgICAgY29uc3QgZGl2c2lvbkltZyA9IChkaXZpc29yICogdGhpcy5pbWcpIC8gZGl2O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KGRpdnNpb25SZWFsLCBkaXZzaW9uSW1nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBjb25qdWdhdGUoKTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwsIC10aGlzLmltZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgZXF1YWxzKGM6IENvbXBsZXgpOiBib29sZWFuIHtcclxuICAgICAgICAgICAgaWYgKGMgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMucmVhbCA9PT0gYy5yZWFsICYmIHRoaXMuaW1nID09PSBjLmltZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgICAgICAgcmV0dXJuICdSZWFsOiAnICsgdGhpcy5yZWFsICsgJywgSW1nOiAnICsgdGhpcy5pbWc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4iXX0=
|
package/esm2022/lib/math/dft.mjs
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { Complex } from './complex';
|
|
2
|
-
export class DFTFloat32 {
|
|
3
|
-
constructor(n) {
|
|
4
|
-
this.n = n;
|
|
5
|
-
this.m = Math.log(n) / Math.log(2);
|
|
6
|
-
// if(n != (1 << m))throw new RuntimeException("length N must be power of 2");
|
|
7
|
-
// lookup tables
|
|
8
|
-
this.cosLookup = new Float32Array(n / 2);
|
|
9
|
-
this.sinLookup = new Float32Array(n / 2);
|
|
10
|
-
for (let i = 0; i < n / 2; i++) {
|
|
11
|
-
const arc = (-2 * Math.PI * i) / n;
|
|
12
|
-
this.cosLookup[i] = Math.cos(arc);
|
|
13
|
-
this.sinLookup[i] = Math.sin(arc);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
processReal(srcBuf) {
|
|
17
|
-
const x = srcBuf.slice();
|
|
18
|
-
const y = new Float32Array(srcBuf.length);
|
|
19
|
-
for (let yi = 0; yi < y.length; yi++) {
|
|
20
|
-
y[yi] = 0.0;
|
|
21
|
-
}
|
|
22
|
-
this.fftCooleyTukey(x, y);
|
|
23
|
-
const rc = new Array(x.length);
|
|
24
|
-
for (let i = 0; i < x.length; i++) {
|
|
25
|
-
rc[i] = new Complex(x[i], y[i]);
|
|
26
|
-
}
|
|
27
|
-
return rc;
|
|
28
|
-
}
|
|
29
|
-
processRealMagnitude(srcBuf) {
|
|
30
|
-
const x = srcBuf.slice();
|
|
31
|
-
const y = new Float32Array(srcBuf.length);
|
|
32
|
-
for (let yi = 0; yi < y.length; yi++) {
|
|
33
|
-
y[yi] = 0.0;
|
|
34
|
-
}
|
|
35
|
-
this.fftCooleyTukey(x, y);
|
|
36
|
-
const rc = new Float32Array(x.length);
|
|
37
|
-
for (let i = 0; i < x.length; i++) {
|
|
38
|
-
const rcc = new Complex(x[i], y[i]);
|
|
39
|
-
rc[i] = rcc.magnitude();
|
|
40
|
-
}
|
|
41
|
-
return rc;
|
|
42
|
-
}
|
|
43
|
-
fftCooleyTukey(real, img) {
|
|
44
|
-
let i;
|
|
45
|
-
let j = 0;
|
|
46
|
-
let k;
|
|
47
|
-
let n1;
|
|
48
|
-
let n2 = this.n / 2;
|
|
49
|
-
let a;
|
|
50
|
-
let c;
|
|
51
|
-
let s;
|
|
52
|
-
let t1;
|
|
53
|
-
let t2;
|
|
54
|
-
for (i = 1; i < this.n - 1; i++) {
|
|
55
|
-
n1 = n2;
|
|
56
|
-
while (j >= n1) {
|
|
57
|
-
j = j - n1;
|
|
58
|
-
n1 = n1 / 2;
|
|
59
|
-
}
|
|
60
|
-
j = j + n1;
|
|
61
|
-
if (i < j) {
|
|
62
|
-
t1 = real[i];
|
|
63
|
-
real[i] = real[j];
|
|
64
|
-
real[j] = t1;
|
|
65
|
-
t1 = img[i];
|
|
66
|
-
img[i] = img[j];
|
|
67
|
-
img[j] = t1;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
n1 = 0;
|
|
71
|
-
n2 = 1;
|
|
72
|
-
for (i = 0; i < this.m; i++) {
|
|
73
|
-
n1 = n2;
|
|
74
|
-
n2 = n2 + n2;
|
|
75
|
-
a = 0;
|
|
76
|
-
for (j = 0; j < n1; j++) {
|
|
77
|
-
c = this.cosLookup[a];
|
|
78
|
-
s = this.sinLookup[a];
|
|
79
|
-
a += (1 << (this.m - i - 1));
|
|
80
|
-
for (k = j; k < this.n; k = k + n2) {
|
|
81
|
-
t1 = c * real[k + n1] - s * img[k + n1];
|
|
82
|
-
t2 = s * real[k + n1] + c * img[k + n1];
|
|
83
|
-
real[k + n1] = real[k] - t1;
|
|
84
|
-
img[k + n1] = img[k] - t2;
|
|
85
|
-
real[k] = real[k] + t1;
|
|
86
|
-
img[k] = img[k] + t2;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
process(t) {
|
|
92
|
-
const reals = new Float32Array(this.n);
|
|
93
|
-
const imgs = new Float32Array(this.n);
|
|
94
|
-
const trans = new Array(this.n);
|
|
95
|
-
for (let i = 0; i < this.n; i++) {
|
|
96
|
-
reals[i] = t[i].real;
|
|
97
|
-
imgs[i] = t[i].img;
|
|
98
|
-
}
|
|
99
|
-
this.fftCooleyTukey(reals, imgs);
|
|
100
|
-
for (let i = 0; i < this.n; i++) {
|
|
101
|
-
trans[i] = new Complex(reals[i], imgs[i]);
|
|
102
|
-
}
|
|
103
|
-
return trans;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
export class DFT {
|
|
107
|
-
constructor(n) {
|
|
108
|
-
this.n = n;
|
|
109
|
-
this.m = Math.log(n) / Math.log(2);
|
|
110
|
-
// if(n != (1 << m))throw new RuntimeException("length N must be power of 2");
|
|
111
|
-
// lookup tables
|
|
112
|
-
this.cosLookup = new Array(n / 2);
|
|
113
|
-
this.sinLookup = new Array(n / 2);
|
|
114
|
-
for (let i = 0; i < n / 2; i++) {
|
|
115
|
-
const arc = (-2 * Math.PI * i) / n;
|
|
116
|
-
this.cosLookup[i] = Math.cos(arc);
|
|
117
|
-
this.sinLookup[i] = Math.sin(arc);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
processReal(srcBuf) {
|
|
121
|
-
const x = srcBuf.slice();
|
|
122
|
-
const y = new Array(srcBuf.length);
|
|
123
|
-
for (let yi = 0; yi < y.length; yi++) {
|
|
124
|
-
y[yi] = 0.0;
|
|
125
|
-
}
|
|
126
|
-
this.fftCooleyTukey(x, y);
|
|
127
|
-
const rc = new Array(x.length);
|
|
128
|
-
for (let i = 0; i < x.length; i++) {
|
|
129
|
-
rc[i] = new Complex(x[i], y[i]);
|
|
130
|
-
}
|
|
131
|
-
return rc;
|
|
132
|
-
}
|
|
133
|
-
fftCooleyTukey(real, img) {
|
|
134
|
-
let i;
|
|
135
|
-
let j = 0;
|
|
136
|
-
let k;
|
|
137
|
-
let n1;
|
|
138
|
-
let n2 = this.n / 2;
|
|
139
|
-
let a;
|
|
140
|
-
let c;
|
|
141
|
-
let s;
|
|
142
|
-
let t1;
|
|
143
|
-
let t2;
|
|
144
|
-
for (i = 1; i < this.n - 1; i++) {
|
|
145
|
-
n1 = n2;
|
|
146
|
-
while (j >= n1) {
|
|
147
|
-
j = j - n1;
|
|
148
|
-
n1 = n1 / 2;
|
|
149
|
-
}
|
|
150
|
-
j = j + n1;
|
|
151
|
-
if (i < j) {
|
|
152
|
-
t1 = real[i];
|
|
153
|
-
real[i] = real[j];
|
|
154
|
-
real[j] = t1;
|
|
155
|
-
t1 = img[i];
|
|
156
|
-
img[i] = img[j];
|
|
157
|
-
img[j] = t1;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
n1 = 0;
|
|
161
|
-
n2 = 1;
|
|
162
|
-
for (i = 0; i < this.m; i++) {
|
|
163
|
-
n1 = n2;
|
|
164
|
-
n2 = n2 + n2;
|
|
165
|
-
a = 0;
|
|
166
|
-
for (j = 0; j < n1; j++) {
|
|
167
|
-
c = this.cosLookup[a];
|
|
168
|
-
s = this.sinLookup[a];
|
|
169
|
-
a += 1 << (this.m - i - 1);
|
|
170
|
-
for (k = j; k < this.n; k = k + n2) {
|
|
171
|
-
t1 = c * real[k + n1] - s * img[k + n1];
|
|
172
|
-
t2 = s * real[k + n1] + c * img[k + n1];
|
|
173
|
-
real[k + n1] = real[k] - t1;
|
|
174
|
-
img[k + n1] = img[k] - t2;
|
|
175
|
-
real[k] = real[k] + t1;
|
|
176
|
-
img[k] = img[k] + t2;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
process(t) {
|
|
182
|
-
const reals = new Array(this.n);
|
|
183
|
-
const imgs = new Array(this.n);
|
|
184
|
-
const trans = new Array(this.n);
|
|
185
|
-
for (let i = 0; i < this.n; i++) {
|
|
186
|
-
reals[i] = t[i].real;
|
|
187
|
-
imgs[i] = t[i].img;
|
|
188
|
-
}
|
|
189
|
-
this.fftCooleyTukey(reals, imgs);
|
|
190
|
-
for (let i = 0; i < this.n; i++) {
|
|
191
|
-
trans[i] = new Complex(reals[i], imgs[i]);
|
|
192
|
-
}
|
|
193
|
-
return trans;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGZ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL21hdGgvZGZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEMsTUFBTSxPQUFPLFVBQVU7SUFRbkIsWUFBWSxDQUFTO1FBQ2pCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkMsOEVBQThFO1FBRTlFLGdCQUFnQjtRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFdBQVcsQ0FBQyxNQUFvQjtRQUNuQyxNQUFNLENBQUMsR0FBRyxNQUFN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LENBQWlCO1FBQzVCLE1BQU0sS0FBSyxHQUFrQixJQUFJLEtBQUssQ0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQWtCLElBQUksS0FBSyxDQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLEtBQUssR0FBbUIsSUFBSSxLQUFLLENBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGxleCB9IGZyb20gJy4vY29tcGxleCc7XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIERGVEZsb2F0MzIge1xyXG5cclxuICAgICAgICBwcml2YXRlIG46IG51bWJlcjtcclxuICAgICAgICBwcml2YXRlIG06IG51bWJlcjtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSBjb3NMb29rdXA6IEZsb2F0MzJBcnJheTtcclxuICAgICAgICBwcml2YXRlIHNpbkxvb2t1cDogRmxvYXQzMkFycmF5O1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3RvcihuOiBudW1iZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5uID0gbjtcclxuICAgICAgICAgICAgdGhpcy5tID0gTWF0aC5sb2cobikgLyBNYXRoLmxvZygyKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmKG4gIT0gKDEgPDwgbSkpdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJsZW5ndGggTiBtdXN0IGJlIHBvd2VyIG9mIDJcIik7XHJcblxyXG4gICAgICAgICAgICAvLyBsb29rdXAgdGFibGVzXHJcbiAgICAgICAgICAgIHRoaXMuY29zTG9va3VwID0gbmV3IEZsb2F0MzJBcnJheShuIC8gMik7XHJcbiAgICAgICAgICAgIHRoaXMuc2luTG9va3VwID0gbmV3IEZsb2F0MzJBcnJheShuIC8gMik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLyAyOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFyYyA9ICgtMiAqIE1hdGguUEkgKiBpKSAvIG47XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvc0xvb2t1cFtpXSA9IE1hdGguY29zKGFyYyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbkxvb2t1cFtpXSA9IE1hdGguc2luKGFyYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBwcm9jZXNzUmVhbChzcmNCdWY6IEZsb2F0MzJBcnJheSk6IEFycmF5PENvbXBsZXg+IHtcclxuICAgICAgICAgICAgY29uc3QgeCA9IHNyY0J1Zi5zbGljZSgpO1xyXG4gICAgICAgICAgICBjb25zdCB5ID0gbmV3IEZsb2F0MzJBcnJheShzcmNCdWYubGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgeWkgPSAwOyB5aSA8IHkubGVuZ3RoOyB5aSsrKSB7XHJcbiAgICAgICAgICAgICAgICB5W3lpXSA9IDAuMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmZmdENvb2xleVR1a2V5KHgsIHkpO1xyXG4gICAgICAgICAgICBjb25zdCByYyA9IG5ldyBBcnJheTxDb21wbGV4Pih4Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmNbaV0gPSBuZXcgQ29tcGxleCh4W2ldLCB5W2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgcHJvY2Vzc1JlYWxNYWduaXR1ZGUoc3JjQnVmOiBGbG9hdDMyQXJyYXkpOiBGbG9hdDMyQXJyYXkge1xyXG4gICAgICAgICAgICBjb25zdCB4ID0gc3JjQnVmLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSBuZXcgRmxvYXQzMkFycmF5KHNyY0J1Zi5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCB5aSA9IDA7IHlpIDwgeS5sZW5ndGg7IHlpKyspIHtcclxuICAgICAgICAgICAgICAgIHlbeWldID0gMC4wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZmZ0Q29vbGV5VHVrZXkoeCwgeSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJjID0gbmV3IEZsb2F0MzJBcnJheSh4Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmNjID0gbmV3IENvbXBsZXgoeFtpXSwgeVtpXSk7XHJcbiAgICAgICAgICAgICAgICByY1tpXSA9IHJjYy5tYWduaXR1ZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgZmZ0Q29vbGV5VHVrZXkocmVhbDogRmxvYXQzMkFycmF5LCBpbWc6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xyXG4gICAgICAgICAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgaiA9IDA7XHJcbiAgICAgICAgICAgIGxldCBrOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCBuMTogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgbjI6IG51bWJlciA9IHRoaXMubiAvIDI7XHJcbiAgICAgICAgICAgIGxldCBhOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCBjOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCBzOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCB0MTogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdDI6IG51bWJlcjtcclxuXHJcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCB0aGlzLm4gLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG4xID0gbjI7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaiA+PSBuMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGogPSBqIC0gbjE7XHJcbiAgICAgICAgICAgICAgICAgICAgbjEgPSBuMSAvIDI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBqID0gaiArIG4xO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpIDwgaikge1xyXG4gICAgICAgICAgICAgICAgICAgIHQxID0gcmVhbFtpXTtcclxuICAgICAgICAgICAgICAgICAgICByZWFsW2ldID0gcmVhbFtqXTtcclxuICAgICAgICAgICAgICAgICAgICByZWFsW2pdID0gdDE7XHJcbiAgICAgICAgICAgICAgICAgICAgdDEgPSBpbWdbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaW1nW2ldID0gaW1nW2pdO1xyXG4gICAgICAgICAgICAgICAgICAgIGltZ1tqXSA9IHQxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBuMSA9IDA7XHJcbiAgICAgICAgICAgIG4yID0gMTtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMubTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBuMSA9IG4yO1xyXG4gICAgICAgICAgICAgICAgbjIgPSBuMiArIG4yO1xyXG4gICAgICAgICAgICAgICAgYSA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjE7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGMgPSB0aGlzLmNvc0xvb2t1cFthXTtcclxuICAgICAgICAgICAgICAgICAgICBzID0gdGhpcy5zaW5Mb29rdXBbYV07XHJcbiAgICAgICAgICAgICAgICAgICAgYSArPSAoIDEgPDwgKHRoaXMubSAtIGkgLSAxKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IGo7IGsgPCB0aGlzLm47IGsgPSBrICsgbjIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdDEgPSBjICogcmVhbFtrICsgbjFdIC0gcyAqIGltZ1trICsgbjFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0MiA9IHMgKiByZWFsW2sgKyBuMV0gKyBjICogaW1nW2sgKyBuMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxbayArIG4xXSA9IHJlYWxba10gLSB0MTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nW2sgKyBuMV0gPSBpbWdba10gLSB0MjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFtrXSA9IHJlYWxba10gKyB0MTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nW2tdID0gaW1nW2tdICsgdDI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgcHVibGljIHByb2Nlc3ModDogQXJyYXk8Q29tcGxleD4pOiBBcnJheTxDb21wbGV4PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlYWxzOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMubik7XHJcbiAgICAgICAgICAgIGNvbnN0IGltZ3M6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5uKTtcclxuICAgICAgICAgICAgY29uc3QgdHJhbnM6IEFycmF5PENvbXBsZXg+ID0gbmV3IEFycmF5PENvbXBsZXg+KHRoaXMubik7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlYWxzW2ldID0gdFtpXS5yZWFsO1xyXG4gICAgICAgICAgICAgICAgaW1nc1tpXSA9IHRbaV0uaW1nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZmZ0Q29vbGV5VHVrZXkocmVhbHMsIGltZ3MpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc1tpXSA9IG5ldyBDb21wbGV4KHJlYWxzW2ldLCBpbWdzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJhbnM7XHJcblxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgZXhwb3J0IGNsYXNzIERGVCB7XHJcblxyXG4gICAgICAgIHByaXZhdGUgbjogbnVtYmVyO1xyXG4gICAgICAgIHByaXZhdGUgbTogbnVtYmVyO1xyXG5cclxuICAgICAgICBwcml2YXRlIGNvc0xvb2t1cDogQXJyYXk8bnVtYmVyPjtcclxuICAgICAgICBwcml2YXRlIHNpbkxvb2t1cDogQXJyYXk8bnVtYmVyPjtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IobjogbnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMubiA9IG47XHJcbiAgICAgICAgICAgIHRoaXMubSA9IE1hdGgubG9nKG4pIC8gTWF0aC5sb2coMik7XHJcblxyXG4gICAgICAgICAgICAvLyBpZihuICE9ICgxIDw8IG0pKXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwibGVuZ3RoIE4gbXVzdCBiZSBwb3dlciBvZiAyXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gbG9va3VwIHRhYmxlc1xyXG4gICAgICAgICAgICB0aGlzLmNvc0xvb2t1cCA9IG5ldyBBcnJheTxudW1iZXI+KG4gLyAyKTtcclxuICAgICAgICAgICAgdGhpcy5zaW5Mb29rdXAgPSBuZXcgQXJyYXk8bnVtYmVyPihuIC8gMik7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLyAyOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFyYyA9ICgtMiAqIE1hdGguUEkgKiBpKSAvIG47XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvc0xvb2t1cFtpXSA9IE1hdGguY29zKGFyYyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbkxvb2t1cFtpXSA9IE1hdGguc2luKGFyYyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBwcm9jZXNzUmVhbChzcmNCdWY6IEFycmF5PG51bWJlcj4pOiBBcnJheTxDb21wbGV4PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHggPSBzcmNCdWYuc2xpY2UoKTtcclxuICAgICAgICAgICAgY29uc3QgeSA9IG5ldyBBcnJheTxudW1iZXI+KHNyY0J1Zi5sZW5ndGgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCB5aSA9IDA7IHlpIDwgeS5sZW5ndGg7IHlpKyspIHtcclxuICAgICAgICAgICAgICAgIHlbeWldID0gMC4wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZmZ0Q29vbGV5VHVrZXkoeCwgeSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJjID0gbmV3IEFycmF5PENvbXBsZXg+KHgubGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByY1tpXSA9IG5ldyBDb21wbGV4KHhbaV0sIHlbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByYztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBmZnRDb29sZXlUdWtleShyZWFsOiBBcnJheTxudW1iZXI+LCBpbWc6IEFycmF5PG51bWJlcj4pOiB2b2lkIHtcclxuICAgICAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IGogPSAwO1xyXG4gICAgICAgICAgICBsZXQgazogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgbjE6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IG4yOiBudW1iZXIgPSB0aGlzLm4gLyAyO1xyXG4gICAgICAgICAgICBsZXQgYTogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgYzogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgczogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdDE6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IHQyOiBudW1iZXI7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgdGhpcy5uIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBuMSA9IG4yO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPj0gbjEpIHtcclxuICAgICAgICAgICAgICAgICAgICBqID0gaiAtIG4xO1xyXG4gICAgICAgICAgICAgICAgICAgIG4xID0gbjEgLyAyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaiA9IGogKyBuMTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGopIHtcclxuICAgICAgICAgICAgICAgICAgICB0MSA9IHJlYWxbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhbFtpXSA9IHJlYWxbal07XHJcbiAgICAgICAgICAgICAgICAgICAgcmVhbFtqXSA9IHQxO1xyXG4gICAgICAgICAgICAgICAgICAgIHQxID0gaW1nW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGltZ1tpXSA9IGltZ1tqXTtcclxuICAgICAgICAgICAgICAgICAgICBpbWdbal0gPSB0MTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbjEgPSAwO1xyXG4gICAgICAgICAgICBuMiA9IDE7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLm07IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbjEgPSBuMjtcclxuICAgICAgICAgICAgICAgIG4yID0gbjIgKyBuMjtcclxuICAgICAgICAgICAgICAgIGEgPSAwO1xyXG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG4xOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5jb3NMb29rdXBbYV07XHJcbiAgICAgICAgICAgICAgICAgICAgcyA9IHRoaXMuc2luTG9va3VwW2FdO1xyXG4gICAgICAgICAgICAgICAgICAgIGEgKz0gMSA8PCAodGhpcy5tIC0gaSAtIDEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSBqOyBrIDwgdGhpcy5uOyBrID0gayArIG4yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gYyAqIHJlYWxbayArIG4xXSAtIHMgKiBpbWdbayArIG4xXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdDIgPSBzICogcmVhbFtrICsgbjFdICsgYyAqIGltZ1trICsgbjFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFsW2sgKyBuMV0gPSByZWFsW2tdIC0gdDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZ1trICsgbjFdID0gaW1nW2tdIC0gdDI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxba10gPSByZWFsW2tdICsgdDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGltZ1trXSA9IGltZ1trXSArIHQyO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHB1YmxpYyBwcm9jZXNzKHQ6IEFycmF5PENvbXBsZXg+KTogQXJyYXk8Q29tcGxleD4ge1xyXG4gICAgICAgICAgICBjb25zdCByZWFsczogQXJyYXk8bnVtYmVyPiA9IG5ldyBBcnJheTxudW1iZXI+KHRoaXMubik7XHJcbiAgICAgICAgICAgIGNvbnN0IGltZ3M6IEFycmF5PG51bWJlcj4gPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLm4pO1xyXG4gICAgICAgICAgICBjb25zdCB0cmFuczogQXJyYXk8Q29tcGxleD4gPSBuZXcgQXJyYXk8Q29tcGxleD4odGhpcy5uKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVhbHNbaV0gPSB0W2ldLnJlYWw7XHJcbiAgICAgICAgICAgICAgICBpbWdzW2ldID0gdFtpXS5pbWc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5mZnRDb29sZXlUdWtleShyZWFscywgaW1ncyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zW2ldID0gbmV3IENvbXBsZXgocmVhbHNbaV0sIGltZ3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cmFucztcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuIl19
|