speechrecorderng 3.10.13 → 3.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/speechrecorderng.mjs +204 -201
  3. package/fesm2022/speechrecorderng.mjs.map +1 -1
  4. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
  5. package/lib/spr.module.version.d.ts +1 -1
  6. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  7. package/lib/ui/responsive_component.d.ts +1 -1
  8. package/package.json +13 -15
  9. package/esm2022/lib/action/action.mjs +0 -73
  10. package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
  11. package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
  12. package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
  13. package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
  14. package/esm2022/lib/audio/audio_display.mjs +0 -118
  15. package/esm2022/lib/audio/audio_player.mjs +0 -238
  16. package/esm2022/lib/audio/capture/capture.mjs +0 -855
  17. package/esm2022/lib/audio/context.mjs +0 -79
  18. package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
  19. package/esm2022/lib/audio/format.mjs +0 -20
  20. package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
  21. package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
  22. package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
  23. package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
  24. package/esm2022/lib/audio/io/stream.mjs +0 -59
  25. package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
  26. package/esm2022/lib/audio/persistor.mjs +0 -81
  27. package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
  28. package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
  29. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  30. package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
  31. package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
  32. package/esm2022/lib/audio/playback/player.mjs +0 -402
  33. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  34. package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
  35. package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
  36. package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
  37. package/esm2022/lib/audio/ui/common.mjs +0 -19
  38. package/esm2022/lib/audio/ui/container.mjs +0 -414
  39. package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
  40. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  41. package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
  42. package/esm2022/lib/db/inddb.mjs +0 -120
  43. package/esm2022/lib/dsp/utils.mjs +0 -48
  44. package/esm2022/lib/environment/environment.defaults.mjs +0 -9
  45. package/esm2022/lib/io/BinaryReader.mjs +0 -93
  46. package/esm2022/lib/io/BinaryWriter.mjs +0 -80
  47. package/esm2022/lib/io/stream.mjs +0 -259
  48. package/esm2022/lib/math/2d/geometry.mjs +0 -28
  49. package/esm2022/lib/math/complex.mjs +0 -58
  50. package/esm2022/lib/math/dft.mjs +0 -196
  51. package/esm2022/lib/media/utils.mjs +0 -14
  52. package/esm2022/lib/net/uploader.mjs +0 -367
  53. package/esm2022/lib/recorder_component.mjs +0 -65
  54. package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
  55. package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
  56. package/esm2022/lib/speechrecorder/recording.mjs +0 -124
  57. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
  58. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  59. package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
  60. package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
  61. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  62. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
  63. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
  64. package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
  65. package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
  66. package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
  67. package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
  68. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  69. package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
  70. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
  71. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
  72. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
  73. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
  74. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
  75. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  76. package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
  77. package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
  78. package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
  79. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
  80. package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
  81. package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
  82. package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
  83. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  84. package/esm2022/lib/speechrecorderng.component.mjs +0 -392
  85. package/esm2022/lib/speechrecorderng.module.mjs +0 -97
  86. package/esm2022/lib/spr.config.mjs +0 -27
  87. package/esm2022/lib/spr.module.version.mjs +0 -2
  88. package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
  89. package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
  90. package/esm2022/lib/ui/message_dialog.mjs +0 -51
  91. package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
  92. package/esm2022/lib/ui/responsive_component.mjs +0 -24
  93. package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
  94. package/esm2022/lib/utils/ua-parser.mjs +0 -190
  95. package/esm2022/lib/utils/utils.mjs +0 -132
  96. package/esm2022/lib/utils/wake_lock.mjs +0 -114
  97. package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
  98. package/esm2022/public-api.mjs +0 -35
  99. package/esm2022/speechrecorderng.mjs +0 -5
@@ -1,79 +0,0 @@
1
- export class AudioContextProvider {
2
- static { this._audioContext = null; }
3
- static { this._offlineAudioContext = null; }
4
- static audioContextInstance() {
5
- if (!this._audioContext) {
6
- let debugFail = false;
7
- if (!window.AudioContext || typeof window.AudioContext !== 'function' || debugFail) {
8
- this._audioContext = null;
9
- throw new Error('Browser does not support Web Audio API!');
10
- }
11
- else {
12
- console.debug("Get new audio context...");
13
- this._audioContext = new window.AudioContext();
14
- console.debug("Created new audio context.");
15
- this._audioContext.addEventListener('statechange', () => {
16
- console.debug("Audio context state changed: " + this._audioContext?.state);
17
- });
18
- console.debug("Created new audio context with state: " + this._audioContext?.state);
19
- }
20
- }
21
- return this._audioContext;
22
- }
23
- // public static audioContextInstanceRunning(audioContext?:AudioContext):Promise<AudioContext>{
24
- //
25
- // return new Promise<AudioContext>((resolve,reject)=>{
26
- // let aCtx=audioContext?audioContext:AudioContextProvider.audioContextInstance();
27
- // if(aCtx) {
28
- // if(aCtx.state==='closed') {
29
- // reject(new Error('Audio context already closed.'));
30
- // }else if(aCtx.state==='running') {
31
- // resolve(aCtx);
32
- // }else{
33
- // aCtx.resume().then(() => {
34
- // if(aCtx) {
35
- // resolve(aCtx);
36
- // }else{
37
- // reject(new Error('Could not get audio context'));
38
- // }
39
- // }).catch(() => {
40
- // reject(new Error('Could not resume audio context'));
41
- // })
42
- // }
43
- // }else{
44
- // reject(new Error('Could not get audio context from browser'));
45
- // }
46
- // });
47
- // }
48
- // public static decodeAudioData(data:ArrayBuffer,audioContext?:AudioContext):Promise<AudioBuffer>{
49
- // return new Promise<AudioBuffer>((resolve,reject)=>{
50
- // // decodeAudioData requires an audio context in running state
51
- // AudioContextProvider.audioContextInstanceRunning(audioContext).then(
52
- // (aCtx)=>{
53
- // // Do not use Promise version, which does not work with Safari 13
54
- // aCtx.decodeAudioData(data,decodedData => {
55
- // resolve(decodedData);
56
- // },(reason) => {
57
- // reject(reason);
58
- // });
59
- // }
60
- // ).catch((reason)=>{
61
- // reject(reason);
62
- // })
63
- // })
64
- // }
65
- static decodeAudioData(data) {
66
- return new Promise((resolve, reject) => {
67
- if (!this._offlineAudioContext) {
68
- this._offlineAudioContext = new OfflineAudioContext(1, 44100, 44100);
69
- }
70
- // Do not use Promise version, which does not work with Safari 13
71
- this._offlineAudioContext.decodeAudioData(data, decodedData => {
72
- resolve(decodedData);
73
- }, (reason) => {
74
- reject(reason);
75
- });
76
- });
77
- }
78
- }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE1BQU0sT0FBTyxvQkFBb0I7YUFFaEIsa0JBQWEsR0FBb0IsSUFBSSxDQUFDO2FBQ3RDLHlCQUFvQixHQUEwQixJQUFJLENBQUM7SUFFM0QsTUFBTSxDQUFDLG9CQUFvQjtRQUVoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxPQUFPLE1BQU0sQ0FBQyxZQUFZLEtBQUssVUFBVSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNuRixJQUFJLENBQUMsYUFBYSxHQUFDLElBQUksQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1lBQzdELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxhQUFhLEdBQUUsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzlDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO29CQUN0RCxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixHQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzNFLENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEdBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsK0ZBQStGO0lBQy9GLEVBQUU7SUFDRiwyREFBMkQ7SUFDM0Qsd0ZBQXdGO0lBQ3hGLG1CQUFtQjtJQUNuQixzQ0FBc0M7SUFDdEMsZ0VBQWdFO0lBQ2hFLDZDQUE2QztJQUM3QywyQkFBMkI7SUFDM0IsaUJBQWlCO0lBQ2pCLHVDQUF1QztJQUN2Qyx5QkFBeUI7SUFDekIsK0JBQStCO0lBQy9CLHFCQUFxQjtJQUNyQixrRUFBa0U7SUFDbEUsZ0JBQWdCO0lBQ2hCLDZCQUE2QjtJQUM3QixtRUFBbUU7SUFDbkUsZUFBZTtJQUNmLFlBQVk7SUFDWixlQUFlO0lBQ2YseUVBQXlFO0lBQ3pFLFVBQVU7SUFDVixRQUFRO0lBQ1IsSUFBSTtJQUVKLG1HQUFtRztJQUNuRyx3REFBd0Q7SUFDeEQsb0VBQW9FO0lBQ3BFLDJFQUEyRTtJQUMzRSxrQkFBa0I7SUFDbEIsNEVBQTRFO0lBQzVFLHFEQUFxRDtJQUNyRCxrQ0FBa0M7SUFDbEMsMEJBQTBCO0lBQzFCLDRCQUE0QjtJQUM1QixjQUFjO0lBQ2QsVUFBVTtJQUNWLDBCQUEwQjtJQUMxQix3QkFBd0I7SUFDeEIsU0FBUztJQUNULE9BQU87SUFDUCxJQUFJO0lBR0csTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFnQjtRQUMxQyxPQUFPLElBQUksT0FBTyxDQUFjLENBQUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ2hELElBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksbUJBQW1CLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6RSxDQUFDO1lBQ0MsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUMzRCxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ1gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUNGLENBQUE7SUFFTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NvbnRleHRQcm92aWRlclxyXG57XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2F1ZGlvQ29udGV4dDpBdWRpb0NvbnRleHR8IG51bGw9bnVsbDtcclxuICBwcml2YXRlIHN0YXRpYyBfb2ZmbGluZUF1ZGlvQ29udGV4dDpPZmZsaW5lQXVkaW9Db250ZXh0fG51bGw9bnVsbDtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBhdWRpb0NvbnRleHRJbnN0YW5jZSgpOkF1ZGlvQ29udGV4dHxudWxsXHJcbiAge1xyXG4gICAgaWYgKCF0aGlzLl9hdWRpb0NvbnRleHQpIHtcclxuICAgICAgbGV0IGRlYnVnRmFpbCA9IGZhbHNlO1xyXG4gICAgICBpZiAoIXdpbmRvdy5BdWRpb0NvbnRleHQgfHwgdHlwZW9mIHdpbmRvdy5BdWRpb0NvbnRleHQgIT09ICdmdW5jdGlvbicgfHwgZGVidWdGYWlsKSB7XHJcbiAgICAgICAgdGhpcy5fYXVkaW9Db250ZXh0PW51bGw7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViIEF1ZGlvIEFQSSEnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiR2V0IG5ldyBhdWRpbyBjb250ZXh0Li4uXCIpO1xyXG4gICAgICAgIHRoaXMuX2F1ZGlvQ29udGV4dD0gbmV3IHdpbmRvdy5BdWRpb0NvbnRleHQoKTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiQ3JlYXRlZCBuZXcgYXVkaW8gY29udGV4dC5cIik7XHJcbiAgICAgICAgdGhpcy5fYXVkaW9Db250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXRlY2hhbmdlJywgKCkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGNvbnRleHQgc3RhdGUgY2hhbmdlZDogXCIrdGhpcy5fYXVkaW9Db250ZXh0Py5zdGF0ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkNyZWF0ZWQgbmV3IGF1ZGlvIGNvbnRleHQgd2l0aCBzdGF0ZTogXCIrdGhpcy5fYXVkaW9Db250ZXh0Py5zdGF0ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9hdWRpb0NvbnRleHQ7XHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgc3RhdGljIGF1ZGlvQ29udGV4dEluc3RhbmNlUnVubmluZyhhdWRpb0NvbnRleHQ/OkF1ZGlvQ29udGV4dCk6UHJvbWlzZTxBdWRpb0NvbnRleHQ+e1xyXG4gIC8vXHJcbiAgLy8gICAgIHJldHVybiBuZXcgUHJvbWlzZTxBdWRpb0NvbnRleHQ+KChyZXNvbHZlLHJlamVjdCk9PntcclxuICAvLyAgICAgICBsZXQgYUN0eD1hdWRpb0NvbnRleHQ/YXVkaW9Db250ZXh0OkF1ZGlvQ29udGV4dFByb3ZpZGVyLmF1ZGlvQ29udGV4dEluc3RhbmNlKCk7XHJcbiAgLy8gICAgICAgaWYoYUN0eCkge1xyXG4gIC8vICAgICAgICAgaWYoYUN0eC5zdGF0ZT09PSdjbG9zZWQnKSB7XHJcbiAgLy8gICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0F1ZGlvIGNvbnRleHQgYWxyZWFkeSBjbG9zZWQuJykpO1xyXG4gIC8vICAgICAgICAgfWVsc2UgaWYoYUN0eC5zdGF0ZT09PSdydW5uaW5nJykge1xyXG4gIC8vICAgICAgICAgICByZXNvbHZlKGFDdHgpO1xyXG4gIC8vICAgICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICAgIGFDdHgucmVzdW1lKCkudGhlbigoKSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgaWYoYUN0eCkge1xyXG4gIC8vICAgICAgICAgICAgICAgcmVzb2x2ZShhQ3R4KTtcclxuICAvLyAgICAgICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgYXVkaW8gY29udGV4dCcpKTtcclxuICAvLyAgICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAvLyAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgcmVzdW1lIGF1ZGlvIGNvbnRleHQnKSk7XHJcbiAgLy8gICAgICAgICAgIH0pXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfWVsc2V7XHJcbiAgLy8gICAgICAgICByZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgZ2V0IGF1ZGlvIGNvbnRleHQgZnJvbSBicm93c2VyJykpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHVibGljIHN0YXRpYyBkZWNvZGVBdWRpb0RhdGEoZGF0YTpBcnJheUJ1ZmZlcixhdWRpb0NvbnRleHQ/OkF1ZGlvQ29udGV4dCk6UHJvbWlzZTxBdWRpb0J1ZmZlcj57XHJcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2U8QXVkaW9CdWZmZXI+KChyZXNvbHZlLHJlamVjdCk9PntcclxuICAvLyAgICAgLy8gZGVjb2RlQXVkaW9EYXRhIHJlcXVpcmVzIGFuIGF1ZGlvIGNvbnRleHQgaW4gcnVubmluZyBzdGF0ZVxyXG4gIC8vICAgICBBdWRpb0NvbnRleHRQcm92aWRlci5hdWRpb0NvbnRleHRJbnN0YW5jZVJ1bm5pbmcoYXVkaW9Db250ZXh0KS50aGVuKFxyXG4gIC8vICAgICAgIChhQ3R4KT0+e1xyXG4gIC8vICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTNcclxuICAvLyAgICAgICAgIGFDdHguZGVjb2RlQXVkaW9EYXRhKGRhdGEsZGVjb2RlZERhdGEgPT4ge1xyXG4gIC8vICAgICAgICAgICByZXNvbHZlKGRlY29kZWREYXRhKTtcclxuICAvLyAgICAgICAgIH0sKHJlYXNvbikgPT4ge1xyXG4gIC8vICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgKS5jYXRjaCgocmVhc29uKT0+e1xyXG4gIC8vICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgfSlcclxuICAvLyB9XHJcblxyXG5cclxuICBwdWJsaWMgc3RhdGljIGRlY29kZUF1ZGlvRGF0YShkYXRhOkFycmF5QnVmZmVyKTpQcm9taXNlPEF1ZGlvQnVmZmVyPntcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEF1ZGlvQnVmZmVyPigocmVzb2x2ZSxyZWplY3QpPT57XHJcbiAgICAgICAgaWYoIXRoaXMuX29mZmxpbmVBdWRpb0NvbnRleHQpIHtcclxuICAgICAgICAgICAgdGhpcy5fb2ZmbGluZUF1ZGlvQ29udGV4dCA9IG5ldyBPZmZsaW5lQXVkaW9Db250ZXh0KDEsIDQ0MTAwLCA0NDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTNcclxuICAgICAgICAgIHRoaXMuX29mZmxpbmVBdWRpb0NvbnRleHQuZGVjb2RlQXVkaW9EYXRhKGRhdGEsZGVjb2RlZERhdGEgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKGRlY29kZWREYXRhKTtcclxuICAgICAgICAgIH0sKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG5cclxuICB9XHJcblxyXG59XHJcbiJdfQ==