speechrecorderng 3.6.0 → 3.8.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.
Files changed (220) hide show
  1. package/esm2022/lib/action/action.mjs +73 -0
  2. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
  3. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
  4. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
  5. package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
  6. package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
  7. package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
  8. package/esm2022/lib/audio/capture/capture.mjs +855 -0
  9. package/esm2022/lib/audio/context.mjs +79 -0
  10. package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
  11. package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
  12. package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
  13. package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
  14. package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
  15. package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
  16. package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
  17. package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
  18. package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
  19. package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
  20. package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
  21. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  22. package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
  23. package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
  24. package/esm2022/lib/audio/playback/player.mjs +402 -0
  25. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
  26. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
  27. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
  28. package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
  29. package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
  30. package/esm2022/lib/audio/ui/container.mjs +414 -0
  31. package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
  32. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
  33. package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
  34. package/esm2022/lib/db/inddb.mjs +120 -0
  35. package/esm2022/lib/dsp/utils.mjs +48 -0
  36. package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
  37. package/esm2022/lib/io/BinaryWriter.mjs +74 -0
  38. package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
  39. package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
  40. package/esm2022/lib/math/complex.mjs +58 -0
  41. package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
  42. package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
  43. package/esm2022/lib/net/uploader.mjs +367 -0
  44. package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
  45. package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
  46. package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
  47. package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
  48. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
  49. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
  50. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
  51. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
  52. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
  53. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
  54. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
  55. package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
  56. package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
  57. package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
  58. package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
  59. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
  60. package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
  61. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
  62. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
  63. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
  64. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
  65. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
  66. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
  67. package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
  68. package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
  69. package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
  70. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
  71. package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
  72. package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
  73. package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
  74. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
  75. package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
  76. package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
  77. package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
  78. package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
  79. package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
  80. package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
  81. package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
  82. package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
  83. package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
  84. package/esm2022/lib/utils/ua-parser.mjs +190 -0
  85. package/esm2022/lib/utils/utils.mjs +105 -0
  86. package/esm2022/lib/utils/wake_lock.mjs +114 -0
  87. package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
  88. package/{esm2020 → esm2022}/public-api.mjs +33 -33
  89. package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
  90. package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
  91. package/fesm2022/speechrecorderng.mjs.map +1 -0
  92. package/index.d.ts +5 -5
  93. package/lib/action/action.d.ts +27 -27
  94. package/lib/audio/array_audio_buffer.d.ts +31 -31
  95. package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
  96. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
  97. package/lib/audio/audio_data_holder.d.ts +84 -84
  98. package/lib/audio/audio_display.d.ts +36 -36
  99. package/lib/audio/audio_player.d.ts +47 -47
  100. package/lib/audio/capture/capture.d.ts +67 -67
  101. package/lib/audio/context.d.ts +6 -6
  102. package/lib/audio/dsp/level_measure.d.ts +60 -60
  103. package/lib/audio/format.d.ts +11 -11
  104. package/lib/audio/impl/wavformat.d.ts +5 -5
  105. package/lib/audio/impl/wavreader.d.ts +16 -16
  106. package/lib/audio/impl/wavwriter.d.ts +13 -13
  107. package/lib/audio/inddb_audio_buffer.d.ts +68 -68
  108. package/lib/audio/io/stream.d.ts +28 -28
  109. package/lib/audio/net_audio_buffer.d.ts +57 -57
  110. package/lib/audio/persistor.d.ts +29 -29
  111. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
  112. package/lib/audio/playback/audio_source_node.d.ts +10 -10
  113. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
  114. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
  115. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
  116. package/lib/audio/playback/player.d.ts +65 -65
  117. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
  118. package/lib/audio/ui/audio_display_control.d.ts +25 -25
  119. package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
  120. package/lib/audio/ui/audiosignal.d.ts +30 -30
  121. package/lib/audio/ui/common.d.ts +11 -11
  122. package/lib/audio/ui/container.d.ts +63 -63
  123. package/lib/audio/ui/livelevel.d.ts +60 -60
  124. package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
  125. package/lib/audio/ui/sonagram.d.ts +37 -37
  126. package/lib/db/inddb.d.ts +21 -21
  127. package/lib/dsp/utils.d.ts +19 -19
  128. package/lib/io/BinaryReader.d.ts +18 -18
  129. package/lib/io/BinaryWriter.d.ts +15 -15
  130. package/lib/io/stream.d.ts +59 -59
  131. package/lib/math/2d/geometry.d.ts +18 -18
  132. package/lib/math/complex.d.ts +17 -17
  133. package/lib/math/dft.d.ts +22 -22
  134. package/lib/media/utils.d.ts +3 -3
  135. package/lib/net/uploader.d.ts +81 -81
  136. package/lib/recorder_component.d.ts +16 -16
  137. package/lib/speechrecorder/project/project.d.ts +59 -59
  138. package/lib/speechrecorder/project/project.service.d.ts +21 -21
  139. package/lib/speechrecorder/recording.d.ts +51 -51
  140. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
  141. package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
  142. package/lib/speechrecorder/script/script.d.ts +80 -79
  143. package/lib/speechrecorder/script/script.service.d.ts +16 -16
  144. package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
  145. package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
  146. package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
  147. package/lib/speechrecorder/session/item.d.ts +12 -12
  148. package/lib/speechrecorder/session/progress.d.ts +17 -17
  149. package/lib/speechrecorder/session/prompting.d.ts +121 -121
  150. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
  151. package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
  152. package/lib/speechrecorder/session/recording_list.d.ts +24 -24
  153. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
  154. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
  155. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
  156. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
  157. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
  158. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
  159. package/lib/speechrecorder/session/session.d.ts +15 -15
  160. package/lib/speechrecorder/session/session.service.d.ts +20 -20
  161. package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
  162. package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
  163. package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
  164. package/lib/speechrecorder/spruploader.d.ts +11 -11
  165. package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
  166. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
  167. package/lib/speechrecorderng.component.d.ts +61 -61
  168. package/lib/speechrecorderng.module.d.ts +56 -56
  169. package/lib/spr.config.d.ts +17 -17
  170. package/lib/spr.module.version.d.ts +1 -1
  171. package/lib/ui/canvas_layer_comp.d.ts +13 -13
  172. package/lib/ui/message_dialog.d.ts +10 -10
  173. package/lib/ui/recordingitem_display.d.ts +84 -84
  174. package/lib/ui/responsive_component.d.ts +9 -9
  175. package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
  176. package/lib/utils/ua-parser.d.ts +43 -43
  177. package/lib/utils/utils.d.ts +19 -19
  178. package/lib/utils/wake_lock.d.ts +23 -23
  179. package/lib/utils/wake_lock_media.d.ts +1 -1
  180. package/package.json +17 -23
  181. package/public-api.d.ts +33 -33
  182. package/esm2020/lib/action/action.mjs +0 -73
  183. package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
  184. package/esm2020/lib/audio/capture/capture.mjs +0 -855
  185. package/esm2020/lib/audio/context.mjs +0 -79
  186. package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
  187. package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
  188. package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
  189. package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
  190. package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
  191. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  192. package/esm2020/lib/audio/playback/player.mjs +0 -402
  193. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  194. package/esm2020/lib/audio/ui/container.mjs +0 -414
  195. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  196. package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
  197. package/esm2020/lib/db/inddb.mjs +0 -120
  198. package/esm2020/lib/dsp/utils.mjs +0 -48
  199. package/esm2020/lib/io/BinaryWriter.mjs +0 -74
  200. package/esm2020/lib/math/complex.mjs +0 -58
  201. package/esm2020/lib/net/uploader.mjs +0 -367
  202. package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
  203. package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
  204. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
  205. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  206. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  207. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
  208. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
  209. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  210. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  211. package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
  212. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
  213. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  214. package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
  215. package/esm2020/lib/utils/ua-parser.mjs +0 -190
  216. package/esm2020/lib/utils/utils.mjs +0 -105
  217. package/esm2020/lib/utils/wake_lock.mjs +0 -114
  218. package/fesm2015/speechrecorderng.mjs +0 -17708
  219. package/fesm2015/speechrecorderng.mjs.map +0 -1
  220. package/fesm2020/speechrecorderng.mjs.map +0 -1
@@ -1,120 +0,0 @@
1
- import { Injectable } from "@angular/core";
2
- import { Observable } from "rxjs";
3
- import * as i0 from "@angular/core";
4
- export class Sync {
5
- constructor(objectStoreName, objectId) {
6
- this._objectStoreName = objectStoreName;
7
- this._objectId = objectId;
8
- }
9
- get objectStoreName() {
10
- return this._objectStoreName;
11
- }
12
- get objectId() {
13
- return this._objectId;
14
- }
15
- }
16
- export class SprDb {
17
- constructor() {
18
- this._store = null;
19
- }
20
- static sprDbFactory() {
21
- let sprDb = new SprDb();
22
- return sprDb;
23
- }
24
- static prepare() {
25
- let obs = new Observable((subscriber) => {
26
- console.info("Prepare indexed database...");
27
- if (indexedDB) {
28
- let or;
29
- or = indexedDB.open(SprDb.dbName, SprDb.dbVersion);
30
- or.onupgradeneeded = (ev) => {
31
- let db = or.result;
32
- let tr = or.transaction;
33
- // if (!db.objectStoreNames.contains(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME)) {
34
- // db.createObjectStore(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME);
35
- // }
36
- // Future work towards a complete PWA which stores all clien data in indexed db and synchronizes to the server: See experimental Git branch "progressive_web_app"
37
- // if (!db.objectStoreNames.contains('_sync')) {
38
- // db.createObjectStore('_sync', {keyPath: 'id', autoIncrement:true});
39
- // }
40
- // if (!db.objectStoreNames.contains('project')) {
41
- // db.createObjectStore('project', {keyPath: 'name'});
42
- // }
43
- // if (!db.objectStoreNames.contains('session')) {
44
- // let sessStore=db.createObjectStore('session', {keyPath: 'sessionId'});
45
- // sessStore.createIndex('projectIdx', ['project'], {unique:false});
46
- // }else if(ev.oldVersion<5){
47
- //
48
- // let sessStore=tr.objectStore('session')
49
- // sessStore.createIndex('projectIdx', ['project'], {unique:false});
50
- // }
51
- //
52
- // if (!db.objectStoreNames.contains('script')) {
53
- // let scrStore=db.createObjectStore('script', {keyPath: 'scriptId'});
54
- // scrStore.createIndex('projectIdx', ['project'], {unique:false});
55
- // }
56
- //
57
- // if (!db.objectStoreNames.contains('recfile')) {
58
- // let rfStore=db.createObjectStore('recfile', {keyPath: 'uuid'});
59
- // rfStore.createIndex('sessIdIdx', ['sessionId'], {unique:false});
60
- // rfStore.createIndex('sessIdItemcodeIdx', ['sessionId','itemCode'], {unique:false});
61
- // }
62
- if (!db.objectStoreNames.contains(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME)) {
63
- let rfStore = db.createObjectStore(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME);
64
- }
65
- if (ev.oldVersion) {
66
- console.info("Upgraded indexed database " + SprDb.dbName + " schema from version " + ev.oldVersion + " to " + ev.newVersion);
67
- }
68
- else {
69
- console.info("Created indexed database " + SprDb.dbName + " schema version " + ev.newVersion);
70
- }
71
- };
72
- or.onsuccess = (ev) => {
73
- console.info("Opened indexed database");
74
- let db = or.result;
75
- // // iPad WEbKit workaround
76
- // does not help!
77
- // db.onclose=(ev)=>{
78
- // console.debug("DB closed...");
79
- //
80
- // }
81
- // console.debug("Close db.");
82
- // db.close();
83
- // let opaRq=indexedDB.open(SprDb.dbName, SprDb.dbVersion);
84
- // opaRq.onupgradeneeded=(ev)=>{}
85
- //
86
- // opaRq.onsuccess=(ev)=>{
87
- // console.debug("and opened again");
88
- // subscriber.next(opaRq.result);
89
- // subscriber.complete();
90
- // }
91
- // opaRq.onerror = (err) => {
92
- // console.error("Could not open indexed database: " + SprDb.dbName + ": " + err)
93
- // subscriber.error(err)
94
- // }
95
- subscriber.next(db);
96
- subscriber.complete();
97
- };
98
- or.onerror = (err) => {
99
- console.error("Could not open indexed database: " + SprDb.dbName + ": " + err);
100
- subscriber.error(err);
101
- };
102
- }
103
- else {
104
- console.info("Browser does not support indexed databases");
105
- subscriber.error();
106
- }
107
- });
108
- return obs;
109
- }
110
- }
111
- SprDb.dbName = 'speechrecorder';
112
- SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME = '_recording_file_cache';
113
- //public static RECORDING_FILE_CHUNKS_OBJECT_STORE_NAME='rec_file_chunks';
114
- SprDb.dbVersion = 1;
115
- SprDb.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SprDb, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
116
- SprDb.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SprDb });
117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SprDb, decorators: [{
118
- type: Injectable
119
- }], ctorParameters: function () { return []; } });
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvZGIvaW5kZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUdoQyxNQUFNLE9BQU8sSUFBSTtJQUtiLFlBQVksZUFBc0IsRUFBQyxRQUFzQjtRQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUMsZUFBZSxDQUFBO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUMsUUFBUSxDQUFBO0lBQzNCLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDaEIsT0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUE7SUFDaEMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUN6QixDQUFDO0NBQ0o7QUFHRCxNQUFNLE9BQU8sS0FBSztJQVNkO1FBRFEsV0FBTSxHQUFrQixJQUFJLENBQUE7SUFFcEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZO1FBQ2hCLElBQUksS0FBSyxHQUFDLElBQUksS0FBSyxFQUFFLENBQUM7UUFFckIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUlELE1BQU0sQ0FBQyxPQUFPO1FBQ1YsSUFBSSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQWMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUU3QyxPQUFPLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUE7WUFDM0MsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsSUFBSSxFQUFvQixDQUFDO2dCQUN6QixFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbkQsRUFBRSxDQUFDLGVBQWUs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QixDQUFBO0FBQzVFLDBFQUEwRTtBQUM3RCxlQUFTLEdBQUMsQ0FBRSxDQUFBO21HQU5qQixLQUFLO3VHQUFMLEtBQUs7NEZBQUwsS0FBSztrQkFEakIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBTeW5je1xyXG4gICAgaWQ/Om51bWJlcjtcclxuICAgIF9vYmplY3RTdG9yZU5hbWU6c3RyaW5nO1xyXG4gICAgX29iamVjdElkOnN0cmluZ3xudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3Iob2JqZWN0U3RvcmVOYW1lOnN0cmluZyxvYmplY3RJZDpzdHJpbmd8bnVtYmVyKXtcclxuICAgICAgICB0aGlzLl9vYmplY3RTdG9yZU5hbWU9b2JqZWN0U3RvcmVOYW1lXHJcbiAgICAgICAgdGhpcy5fb2JqZWN0SWQ9b2JqZWN0SWRcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb2JqZWN0U3RvcmVOYW1lKCk6c3RyaW5ne1xyXG4gICAgICAgcmV0dXJuICB0aGlzLl9vYmplY3RTdG9yZU5hbWVcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb2JqZWN0SWQoKTpzdHJpbmd8bnVtYmVye1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vYmplY3RJZFxyXG4gICAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTcHJEYiB7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBkYk5hbWU9J3NwZWVjaHJlY29yZGVyJ1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgUkVDT1JESU5HX0ZJTEVfQ0FDSEVfT0JKRUNUX1NUT1JFX05BTUU9J19yZWNvcmRpbmdfZmlsZV9jYWNoZSc7XHJcbiAgICAgLy9wdWJsaWMgc3RhdGljIFJFQ09SRElOR19GSUxFX0NIVU5LU19PQkpFQ1RfU1RPUkVfTkFNRT0ncmVjX2ZpbGVfY2h1bmtzJztcclxuICAgIHB1YmxpYyBzdGF0aWMgZGJWZXJzaW9uPTE7XHJcblxyXG4gICAgcHJpdmF0ZSBfc3RvcmU6SURCRGF0YWJhc2V8bnVsbD1udWxsXHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzcHJEYkZhY3RvcnkoKTpTcHJEYntcclxuICAgICAgIGxldCBzcHJEYj1uZXcgU3ByRGIoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNwckRiO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgc3RhdGljIHByZXBhcmUoKTpPYnNlcnZhYmxlPElEQkRhdGFiYXNlPiB7XHJcbiAgICAgICAgbGV0IG9icyA9IG5ldyBPYnNlcnZhYmxlPElEQkRhdGFiYXNlPigoc3Vic2NyaWJlcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlByZXBhcmUgaW5kZXhlZCBkYXRhYmFzZS4uLlwiKVxyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWREQikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBvcjogSURCT3BlbkRCUmVxdWVzdDtcclxuICAgICAgICAgICAgICAgICAgICBvciA9IGluZGV4ZWREQi5vcGVuKFNwckRiLmRiTmFtZSwgU3ByRGIuZGJWZXJzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICBvci5vbnVwZ3JhZGVuZWVkZWQgPSAoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRiID0gb3IucmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cj1vci50cmFuc2FjdGlvblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNwckRiLlJFQ09SRElOR19GSUxFX0NBQ0hFX09CSkVDVF9TVE9SRV9OQU1FKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShTcHJEYi5SRUNPUkRJTkdfRklMRV9DQUNIRV9PQkpFQ1RfU1RPUkVfTkFNRSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZ1dHVyZSB3b3JrIHRvd2FyZHMgYSBjb21wbGV0ZSBQV0Egd2hpY2ggc3RvcmVzIGFsbCBjbGllbiBkYXRhIGluIGluZGV4ZWQgZGIgYW5kIHN5bmNocm9uaXplcyB0byB0aGUgc2VydmVyOiBTZWUgZXhwZXJpbWVudGFsIEdpdCBicmFuY2ggXCJwcm9ncmVzc2l2ZV93ZWJfYXBwXCJcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucygnX3N5bmMnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoJ19zeW5jJywge2tleVBhdGg6ICdpZCcsIGF1dG9JbmNyZW1lbnQ6dHJ1ZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucygncHJvamVjdCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZSgncHJvamVjdCcsIHtrZXlQYXRoOiAnbmFtZSd9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoJ3Nlc3Npb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IHNlc3NTdG9yZT1kYi5jcmVhdGVPYmplY3RTdG9yZSgnc2Vzc2lvbicsIHtrZXlQYXRoOiAnc2Vzc2lvbklkJ30pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2Vzc1N0b3JlLmNyZWF0ZUluZGV4KCdwcm9qZWN0SWR4JywgWydwcm9qZWN0J10sIHt1bmlxdWU6ZmFsc2V9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfWVsc2UgaWYoZXYub2xkVmVyc2lvbjw1KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxldCBzZXNzU3RvcmU9dHIub2JqZWN0U3RvcmUoJ3Nlc3Npb24nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzZXNzU3RvcmUuY3JlYXRlSW5kZXgoJ3Byb2plY3RJZHgnLCBbJ3Byb2plY3QnXSwge3VuaXF1ZTpmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucygnc2NyaXB0JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxldCBzY3JTdG9yZT1kYi5jcmVhdGVPYmplY3RTdG9yZSgnc2NyaXB0Jywge2tleVBhdGg6ICdzY3JpcHRJZCd9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNjclN0b3JlLmNyZWF0ZUluZGV4KCdwcm9qZWN0SWR4JywgWydwcm9qZWN0J10sIHt1bmlxdWU6ZmFsc2V9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoJ3JlY2ZpbGUnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IHJmU3RvcmU9ZGIuY3JlYXRlT2JqZWN0U3RvcmUoJ3JlY2ZpbGUnLCB7a2V5UGF0aDogJ3V1aWQnfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZlN0b3JlLmNyZWF0ZUluZGV4KCdzZXNzSWRJZHgnLCBbJ3Nlc3Npb25JZCddLCB7dW5pcXVlOmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZlN0b3JlLmNyZWF0ZUluZGV4KCdzZXNzSWRJdGVtY29kZUlkeCcsIFsnc2Vzc2lvbklkJywnaXRlbUNvZGUnXSwge3VuaXF1ZTpmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU3ByRGIuUkVDT1JESU5HX0ZJTEVfQ0FDSEVfT0JKRUNUX1NUT1JFX05BTUUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmZTdG9yZT1kYi5jcmVhdGVPYmplY3RTdG9yZShTcHJEYi5SRUNPUkRJTkdfRklMRV9DQUNIRV9PQkpFQ1RfU1RPUkVfTkFNRSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2Lm9sZFZlcnNpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlVwZ3JhZGVkIGluZGV4ZWQgZGF0YWJhc2UgXCIgKyBTcHJEYi5kYk5hbWUgKyBcIiBzY2hlbWEgZnJvbSB2ZXJzaW9uIFwiICsgZXYub2xkVmVyc2lvbiArIFwiIHRvIFwiICsgZXYubmV3VmVyc2lvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkNyZWF0ZWQgaW5kZXhlZCBkYXRhYmFzZSBcIiArIFNwckRiLmRiTmFtZSArIFwiIHNjaGVtYSB2ZXJzaW9uIFwiICsgZXYubmV3VmVyc2lvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBvci5vbnN1Y2Nlc3MgPSAoZXYpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiT3BlbmVkIGluZGV4ZWQgZGF0YWJhc2VcIilcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZGI9b3IucmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAvLyBpUGFkIFdFYktpdCB3b3JrYXJvdW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBoZWxwIVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBkYi5vbmNsb3NlPShldik9PntcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmRlYnVnKFwiREIgY2xvc2VkLi4uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5kZWJ1ZyhcIkNsb3NlIGRiLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgZGIuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBvcGFScT1pbmRleGVkREIub3BlbihTcHJEYi5kYk5hbWUsIFNwckRiLmRiVmVyc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvcGFScS5vbnVwZ3JhZGVuZWVkZWQ9KGV2KT0+e31cclxuICAgICAgICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvcGFScS5vbnN1Y2Nlc3M9KGV2KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmRlYnVnKFwiYW5kIG9wZW5lZCBhZ2FpblwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgc3Vic2NyaWJlci5uZXh0KG9wYVJxLnJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9wYVJxLm9uZXJyb3IgPSAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3Qgb3BlbiBpbmRleGVkIGRhdGFiYXNlOiBcIiArIFNwckRiLmRiTmFtZSArIFwiOiBcIiArIGVycilcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgc3Vic2NyaWJlci5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGRiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIG9yLm9uZXJyb3IgPSAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3Qgb3BlbiBpbmRleGVkIGRhdGFiYXNlOiBcIiArIFNwckRiLmRiTmFtZSArIFwiOiBcIiArIGVycilcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgaW5kZXhlZCBkYXRhYmFzZXNcIilcclxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9icztcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -1,48 +0,0 @@
1
- export class DSPUtils {
2
- /**
3
- * Get normalized amplitude level in dB
4
- * @param linearLevel a normalized positive linear level (1.0 corresponds to 0dB)
5
- * @return level in dB
6
- */
7
- static toLevelInDB(linearLevel) {
8
- if (linearLevel < 0) {
9
- throw new RangeError('Linear level argument must be positive.');
10
- }
11
- return 10 * Math.log(linearLevel) / Math.log(10);
12
- }
13
- static toLinearLevel(dbLevel) {
14
- return Math.pow(10, (dbLevel / 10));
15
- }
16
- /**
17
- * Get normalized amplitude power level in dB
18
- * @param linearLevel a normalized positive linear level (1.0 corresponds to 0dB)
19
- * @return power level in dB
20
- */
21
- static toPowerLevelInDB(linearLevel) {
22
- if (linearLevel < 0) {
23
- throw new RangeError('Linear level argument must be positive.');
24
- }
25
- return 20 * Math.log(linearLevel) / Math.log(10);
26
- }
27
- static toPowerLinearLevel(dbLevel) {
28
- return Math.pow(10, (dbLevel / 20));
29
- }
30
- static toOctaves(fq) {
31
- return DSPUtils.OCTAVE_FACTOR * Math.log(fq) / Math.log(10);
32
- }
33
- static maxLevel(audioBuffer) {
34
- let ml = 0.0;
35
- for (let ch = 0; ch < audioBuffer.numberOfChannels; ch++) {
36
- const chArr = audioBuffer.getChannelData(ch);
37
- for (let s = 0; s < chArr.length; s++) {
38
- const l = Math.abs(chArr[s]);
39
- if (l > ml) {
40
- ml = l;
41
- }
42
- }
43
- }
44
- return ml;
45
- }
46
- }
47
- DSPUtils.OCTAVE_FACTOR = 1.0 / (Math.log(2) / Math.log(10));
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvZHNwL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNJLE1BQU0sT0FBTyxRQUFRO0lBSWpCOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQW1CO1FBQ3pDLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNqQixNQUFNLElBQUksVUFBVSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7U0FDbkU7UUFFRCxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUdNLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBZTtRQUN2QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBbUI7UUFDOUMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxVQUFVLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUNuRTtRQUNELE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLE9BQWU7UUFDNUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQVU7UUFDOUIsT0FBTyxRQUFRLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUF3QjtRQUMzQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDYixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ3hELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDVixFQUFFLEdBQUcsQ0FBQyxDQUFDO2lCQUNSO2FBQ0Y7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQzs7QUFwRGMsc0JBQWEsR0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4gICAgZXhwb3J0IGNsYXNzIERTUFV0aWxzIHtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgT0NUQVZFX0ZBQ1RPUjogbnVtYmVyID0gMS4wIC8gKE1hdGgubG9nKDIpIC8gTWF0aC5sb2coMTApKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogR2V0IG5vcm1hbGl6ZWQgYW1wbGl0dWRlIGxldmVsIGluIGRCXHJcbiAgICAgICAgICogQHBhcmFtIGxpbmVhckxldmVsIGEgbm9ybWFsaXplZCBwb3NpdGl2ZSBsaW5lYXIgbGV2ZWwgKDEuMCBjb3JyZXNwb25kcyB0byAwZEIpXHJcbiAgICAgICAgICogQHJldHVybiBsZXZlbCBpbiBkQlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgdG9MZXZlbEluREIobGluZWFyTGV2ZWw6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgICAgIGlmIChsaW5lYXJMZXZlbCA8IDApIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdMaW5lYXIgbGV2ZWwgYXJndW1lbnQgbXVzdCBiZSBwb3NpdGl2ZS4nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIDEwICogTWF0aC5sb2cobGluZWFyTGV2ZWwpIC8gTWF0aC5sb2coMTApO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgdG9MaW5lYXJMZXZlbChkYkxldmVsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5wb3coMTAsIChkYkxldmVsIC8gMTApKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdldCBub3JtYWxpemVkIGFtcGxpdHVkZSBwb3dlciBsZXZlbCBpbiBkQlxyXG4gICAgICAgICAqIEBwYXJhbSBsaW5lYXJMZXZlbCBhIG5vcm1hbGl6ZWQgcG9zaXRpdmUgbGluZWFyIGxldmVsICgxLjAgY29ycmVzcG9uZHMgdG8gMGRCKVxyXG4gICAgICAgICAqIEByZXR1cm4gcG93ZXIgbGV2ZWwgaW4gZEJcclxuICAgICAgICAgKi9cclxuICAgICAgICBwdWJsaWMgc3RhdGljIHRvUG93ZXJMZXZlbEluREIobGluZWFyTGV2ZWw6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgICAgIGlmIChsaW5lYXJMZXZlbCA8IDApIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdMaW5lYXIgbGV2ZWwgYXJndW1lbnQgbXVzdCBiZSBwb3NpdGl2ZS4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gMjAgKiBNYXRoLmxvZyhsaW5lYXJMZXZlbCkgLyBNYXRoLmxvZygxMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgc3RhdGljIHRvUG93ZXJMaW5lYXJMZXZlbChkYkxldmVsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5wb3coMTAsIChkYkxldmVsIC8gMjApKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgdG9PY3RhdmVzKGZxOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgICAgICByZXR1cm4gRFNQVXRpbHMuT0NUQVZFX0ZBQ1RPUiAqIE1hdGgubG9nKGZxKSAvIE1hdGgubG9nKDEwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgbWF4TGV2ZWwoYXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgbGV0IG1sID0gMC4wO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVsczsgY2grKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNoQXJyID0gYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgY2hBcnIubGVuZ3RoOyBzKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBNYXRoLmFicyhjaEFycltzXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAobCA+IG1sKSB7XHJcbiAgICAgICAgICAgICAgICAgIG1sID0gbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG1sO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbiJdfQ==
@@ -1,74 +0,0 @@
1
- export class BinaryByteWriter {
2
- constructor() {
3
- const size = BinaryByteWriter.DEFAULT_SIZE_INC;
4
- this.buf = new ArrayBuffer(size);
5
- this._pos = 0;
6
- }
7
- get pos() {
8
- return this._pos;
9
- }
10
- ensureCapacity(numBytes) {
11
- while (this._pos + numBytes >= this.buf.byteLength) {
12
- // buffer increment
13
- let inc = BinaryByteWriter.DEFAULT_SIZE_INC;
14
- if (inc < numBytes) {
15
- inc = numBytes;
16
- }
17
- const newSize = this.buf.byteLength + inc;
18
- const arrOld = new Uint8Array(this.buf, 0, this._pos);
19
- const arrNew = new Uint8Array(newSize);
20
- arrNew.set(arrOld);
21
- this.buf = arrNew.buffer;
22
- }
23
- }
24
- writeUint8(val) {
25
- this.ensureCapacity(1);
26
- const valView = new DataView(this.buf, this._pos, 1);
27
- valView.setUint8(0, val);
28
- this._pos++;
29
- }
30
- writeUint16(val, le) {
31
- this.ensureCapacity(2);
32
- const valView = new DataView(this.buf, this._pos, 2);
33
- valView.setUint16(0, val, le);
34
- this._pos += 2;
35
- }
36
- writeInt16(val, le) {
37
- this.ensureCapacity(2);
38
- const valView = new DataView(this.buf, this._pos, 2);
39
- valView.setInt16(0, val, le);
40
- this._pos += 2;
41
- }
42
- writeUint32(val, le) {
43
- this.ensureCapacity(4);
44
- const valView = new DataView(this.buf, this._pos, 4);
45
- valView.setUint32(0, val, le);
46
- this._pos += 4;
47
- }
48
- writeInt32(val, le) {
49
- this.ensureCapacity(4);
50
- const valView = new DataView(this.buf, this._pos, 4);
51
- valView.setInt32(0, val, le);
52
- this._pos += 4;
53
- }
54
- finish() {
55
- const finalArr = new Uint8Array(this._pos);
56
- const dv = new DataView(this.buf, 0, this._pos);
57
- for (let i = 0; i < this._pos; i++) {
58
- finalArr[i] = dv.getUint8(i);
59
- }
60
- return finalArr;
61
- }
62
- writeAscii(text) {
63
- let i;
64
- for (i = 0; i < text.length; i++) {
65
- const asciiCode = text.charCodeAt(i);
66
- if (asciiCode < 0 || asciiCode > 255) {
67
- throw new Error('Not an ASCII character at char ' + i + ' in ' + text);
68
- }
69
- this.writeUint8(asciiCode);
70
- }
71
- }
72
- }
73
- BinaryByteWriter.DEFAULT_SIZE_INC = 1024;
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluYXJ5V3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2lvL0JpbmFyeVdyaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDSSxNQUFNLE9BQU8sZ0JBQWdCO0lBS3pCO1FBQ0ksTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxjQUFjLENBQUMsUUFBZ0I7UUFFN0IsT0FBUSxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRztZQUNwRCxtQkFBbUI7WUFDakIsSUFBSSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7WUFDNUMsSUFBSSxHQUFHLEdBQUcsUUFBUSxFQUFFO2dCQUNoQixHQUFHLEdBQUcsUUFBUSxDQUFDO2FBQ2xCO1lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBRTVDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUMxQjtJ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TUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLEdBQUcsRUFBRTtnQkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO2FBQ3hFO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM1QjtJQUNMLENBQUM7O0FBcEZNLGlDQUFnQixHQUFHLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4gICAgZXhwb3J0IGNsYXNzIEJpbmFyeUJ5dGVXcml0ZXIge1xyXG4gICAgICAgIHN0YXRpYyBERUZBVUxUX1NJWkVfSU5DID0gMTAyNDtcclxuICAgICAgICBidWY6IEFycmF5QnVmZmVyO1xyXG4gICAgICAgIHByaXZhdGUgX3BvczogbnVtYmVyO1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IEJpbmFyeUJ5dGVXcml0ZXIuREVGQVVMVF9TSVpFX0lOQztcclxuICAgICAgICAgICAgdGhpcy5idWYgPSBuZXcgQXJyYXlCdWZmZXIoc2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcyA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgcG9zKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3M7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbnN1cmVDYXBhY2l0eShudW1CeXRlczogbnVtYmVyKSB7XHJcblxyXG4gICAgICAgICAgd2hpbGUgKCB0aGlzLl9wb3MgKyBudW1CeXRlcyA+PSB0aGlzLmJ1Zi5ieXRlTGVuZ3RoICkge1xyXG4gICAgICAgICAgICAvLyBidWZmZXIgaW5jcmVtZW50XHJcbiAgICAgICAgICAgICAgbGV0IGluYyA9IEJpbmFyeUJ5dGVXcml0ZXIuREVGQVVMVF9TSVpFX0lOQztcclxuICAgICAgICAgICAgICBpZiAoaW5jIDwgbnVtQnl0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgaW5jID0gbnVtQnl0ZXM7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNvbnN0IG5ld1NpemUgPSB0aGlzLmJ1Zi5ieXRlTGVuZ3RoICsgaW5jO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYXJyT2xkID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5idWYsIDAsIHRoaXMuX3Bvcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyck5ldyA9IG5ldyBVaW50OEFycmF5KG5ld1NpemUpO1xyXG4gICAgICAgICAgICBhcnJOZXcuc2V0KGFyck9sZCk7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYXJyTmV3LmJ1ZmZlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdyaXRlVWludDgodmFsOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICAgIHRoaXMuZW5zdXJlQ2FwYWNpdHkoMSk7XHJcbiAgICAgICAgICBjb25zdCB2YWxWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmLCB0aGlzLl9wb3MsIDEpO1xyXG4gICAgICAgICAgdmFsVmlldy5zZXRVaW50OCgwLCB2YWwpO1xyXG4gICAgICAgICAgdGhpcy5fcG9zKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgd3JpdGVVaW50MTYodmFsOiBudW1iZXIsIGxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbnN1cmVDYXBhY2l0eSgyKTtcclxuICAgICAgICBjb25zdCB2YWxWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmLCB0aGlzLl9wb3MsIDIpO1xyXG4gICAgICAgIHZhbFZpZXcuc2V0VWludDE2KDAsIHZhbCwgbGUpO1xyXG4gICAgICAgIHRoaXMuX3BvcyArPSAyO1xyXG5cclxuICAgICAgfVxyXG4gICAgICB3cml0ZUludDE2KHZhbDogbnVtYmVyLCBsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZW5zdXJlQ2FwYWNpdHkoMik7XHJcbiAgICAgICAgY29uc3QgdmFsVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZiwgdGhpcy5fcG9zLCAyKTtcclxuICAgICAgICB2YWxWaWV3LnNldEludDE2KDAsIHZhbCwgbGUpO1xyXG4gICAgICAgIHRoaXMuX3BvcyArPSAyO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgd3JpdGVVaW50MzIodmFsOiBudW1iZXIsIGxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbnN1cmVDYXBhY2l0eSg0KTtcclxuICAgICAgICBjb25zdCB2YWxWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmLCB0aGlzLl9wb3MsIDQpO1xyXG4gICAgICAgIHZhbFZpZXcuc2V0VWludDMyKDAsIHZhbCwgbGUpO1xyXG4gICAgICAgIHRoaXMuX3BvcyArPSA0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB3cml0ZUludDMyKHZhbDogbnVtYmVyLCBsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZW5zdXJlQ2FwYWNpdHkoNCk7XHJcbiAgICAgICAgY29uc3QgdmFsVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZiwgdGhpcy5fcG9zLCA0KTtcclxuICAgICAgICB2YWxWaWV3LnNldEludDMyKDAsIHZhbCwgbGUpO1xyXG4gICAgICAgIHRoaXMuX3BvcyArPSA0O1xyXG4gICAgICB9XHJcbiAgICAgICAgZmluaXNoKCk6IFVpbnQ4QXJyYXkge1xyXG4gICAgICAgICAgY29uc3QgZmluYWxBcnIgPSBuZXcgVWludDhBcnJheSh0aGlzLl9wb3MpO1xyXG4gICAgICAgICAgY29uc3QgZHYgPSBuZXcgRGF0YVZpZXcodGhpcy5idWYsIDAsIHRoaXMuX3Bvcyk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3BvczsgaSsrKSB7XHJcbiAgICAgICAgICAgIGZpbmFsQXJyW2ldID0gZHYuZ2V0VWludDgoaSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZmluYWxBcnI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3cml0ZUFzY2lpKHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgICAgICBsZXQgaTtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBhc2NpaUNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICAgICAgaWYgKGFzY2lpQ29kZSA8IDAgfHwgYXNjaWlDb2RlID4gMjU1KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhbiBBU0NJSSBjaGFyYWN0ZXIgYXQgY2hhciAnICsgaSArICcgaW4gJyArIHRleHQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLndyaXRlVWludDgoYXNjaWlDb2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4iXX0=
@@ -1,58 +0,0 @@
1
- export class Complex {
2
- constructor(real, img) {
3
- this.real = real;
4
- this.img = img;
5
- }
6
- static fromPolarForm(magnitude, argument) {
7
- const r = Math.cos(argument) * magnitude;
8
- const i = Math.sin(argument) * magnitude;
9
- return new Complex(r, i);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9tYXRoL2NvbXBsZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0ksTUFBTSxPQUFPLE9BQU87SUFVaEIsWUFBWSxJQUFZLEVBQUUsR0FBVztRQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBUk0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFpQixFQUFFLFFBQWdCO1FBQzNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFLTSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTSxRQUFRO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTSxHQUFHLENBQUMsSUFBYTtRQUNwQixPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sR0FBRyxDQUFDLElBQWE7UUFDcEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVNLElBQUksQ0FBQyxLQUFjO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRSxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFFBQVEsQ0FBQyxLQUFhO1FBQ3pCLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sR0FBRyxDQUFDLE9BQWdCO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRXhFLE9BQU8sSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxPQUFPLENBQUMsT0FBZTtRQUMxQixNQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzlCLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUU5QyxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU0sU0FBUztRQUNaLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU0sTUFBTSxDQUFDLENBQVU7UUFDcEIsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ1osT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTSxRQUFRO1FBQ1gsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN2RCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuICAgIGV4cG9ydCBjbGFzcyBDb21wbGV4IHtcclxuXHJcbiAgICAgICAgcmVhbDogbnVtYmVyO1xyXG4gICAgICAgIGltZzogbnVtYmVyO1xyXG5cclxuICAgICAgICBwdWJsaWMgc3RhdGljIGZyb21Qb2xhckZvcm0obWFnbml0dWRlOiBudW1iZXIsIGFyZ3VtZW50OiBudW1iZXIpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgY29uc3QgciA9IE1hdGguY29zKGFyZ3VtZW50KSAqIG1hZ25pdHVkZTtcclxuICAgICAgICAgICAgY29uc3QgaSA9IE1hdGguc2luKGFyZ3VtZW50KSAqIG1hZ25pdHVkZTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHIsIGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdHJ1Y3RvcihyZWFsOiBudW1iZXIsIGltZzogbnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVhbCA9IHJlYWw7XHJcbiAgICAgICAgICAgIHRoaXMuaW1nID0gaW1nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwdWJsaWMgbWFnbml0dWRlKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoKHRoaXMucmVhbCAqIHRoaXMucmVhbCkgKyAodGhpcy5pbWcgKiB0aGlzLmltZykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIGFyZ3VtZW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMuaW1nLCB0aGlzLnJlYWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIGFkZChhZGRDOiBDb21wbGV4KTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwgKyBhZGRDLnJlYWwsIHRoaXMuaW1nICsgYWRkQy5pbWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIHN1YihzdWJDOiBDb21wbGV4KTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwgLSBzdWJDLnJlYWwsIHRoaXMuaW1nIC0gc3ViQy5pbWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIG11bHQobXVsdEM6IENvbXBsZXgpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgY29uc3QgbXVsdFIgPSAodGhpcy5yZWFsICogbXVsdEMucmVhbCkgLSAodGhpcy5pbWcgKiBtdWx0Qy5pbWcpO1xyXG4gICAgICAgICAgICBjb25zdCBtdWx0SSA9ICh0aGlzLnJlYWwgKiBtdWx0Qy5pbWcpICsgKG11bHRDLnJlYWwgKiB0aGlzLmltZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleChtdWx0UiwgbXVsdEkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIG11bHRSZWFsKG11bHRGOiBudW1iZXIpOiBDb21wbGV4IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KHRoaXMucmVhbCAqIG11bHRGLCB0aGlzLmltZyAqIG11bHRGKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBkaXYoZGl2aXNvcjogQ29tcGxleCk6IENvbXBsZXgge1xyXG4gICAgICAgICAgICBjb25zdCBkaXZSZWFsID0gZGl2aXNvci5yZWFsO1xyXG4gICAgICAgICAgICBjb25zdCBkaXZJbWcgPSBkaXZpc29yLmltZztcclxuICAgICAgICAgICAgY29uc3QgZGl2ID0gKGRpdlJlYWwgKiBkaXZSZWFsKSArIChkaXZJbWcgKiBkaXZJbWcpO1xyXG4gICAgICAgICAgICBjb25zdCBkaXZpc2lvblJlYWwgPSAoKHRoaXMucmVhbCAqIGRpdlJlYWwpICsgKHRoaXMuaW1nICogZGl2SW1nKSkgLyBkaXY7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpdmlzaW9uSW1nID0gKChkaXZSZWFsICogdGhpcy5pbWcpIC0gKHRoaXMucmVhbCAqIGRpdkltZykpIC8gZGl2O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KGRpdmlzaW9uUmVhbCwgZGl2aXNpb25JbWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIGRpdlJlYWwoZGl2aXNvcjogbnVtYmVyKTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpdiA9IGRpdmlzb3IgKiBkaXZpc29yO1xyXG4gICAgICAgICAgICBjb25zdCBkaXZzaW9uUmVhbCA9ICh0aGlzLnJlYWwgKiBkaXZpc29yKSAvIGRpdjtcclxuICAgICAgICAgICAgY29uc3QgZGl2c2lvbkltZyA9IChkaXZpc29yICogdGhpcy5pbWcpIC8gZGl2O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4KGRpdnNpb25SZWFsLCBkaXZzaW9uSW1nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHB1YmxpYyBjb25qdWdhdGUoKTogQ29tcGxleCB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleCh0aGlzLnJlYWwsIC10aGlzLmltZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgZXF1YWxzKGM6IENvbXBsZXgpOiBib29sZWFuIHtcclxuICAgICAgICAgICAgaWYgKGMgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMucmVhbCA9PT0gYy5yZWFsICYmIHRoaXMuaW1nID09PSBjLmltZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcclxuICAgICAgICAgICAgcmV0dXJuICdSZWFsOiAnICsgdGhpcy5yZWFsICsgJywgSW1nOiAnICsgdGhpcy5pbWc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4iXX0=