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,367 +0,0 @@
1
- import { timeout } from 'rxjs/operators';
2
- // state of an upload
3
- export var UploadStatus;
4
- (function (UploadStatus) {
5
- UploadStatus[UploadStatus["IDLE"] = 1] = "IDLE";
6
- UploadStatus[UploadStatus["UPLOADING"] = 2] = "UPLOADING";
7
- UploadStatus[UploadStatus["ABORT"] = 3] = "ABORT";
8
- UploadStatus[UploadStatus["DONE"] = 0] = "DONE";
9
- UploadStatus[UploadStatus["ERR"] = -1] = "ERR";
10
- })(UploadStatus || (UploadStatus = {}));
11
- // state of the uploader
12
- // TRY_UPLOADING is uploading state after an error (for example if disconnected from server)
13
- export var UploaderStatus;
14
- (function (UploaderStatus) {
15
- UploaderStatus[UploaderStatus["DONE"] = 0] = "DONE";
16
- UploaderStatus[UploaderStatus["UPLOADING"] = 1] = "UPLOADING";
17
- UploaderStatus[UploaderStatus["TRY_UPLOADING"] = 2] = "TRY_UPLOADING";
18
- UploaderStatus[UploaderStatus["NEXT"] = 3] = "NEXT";
19
- UploaderStatus[UploaderStatus["ERR"] = -1] = "ERR";
20
- })(UploaderStatus || (UploaderStatus = {}));
21
- export class UploaderStatusChangeEvent {
22
- constructor(sizeQueued, sizeDone, status) {
23
- this._sizeQueued = sizeQueued;
24
- this._sizeDone = sizeDone;
25
- this._status = status;
26
- }
27
- get sizeQueued() {
28
- return this._sizeQueued;
29
- }
30
- get sizeDone() {
31
- return this._sizeDone;
32
- }
33
- sizeInQueue() {
34
- return this._sizeQueued - this._sizeDone;
35
- }
36
- get status() {
37
- return this._status;
38
- }
39
- uploadDone() {
40
- return (this._sizeDone >= this._sizeQueued);
41
- }
42
- percentDone() {
43
- if (this._sizeQueued == 0) {
44
- // no data queued, we are "done"
45
- return 100;
46
- }
47
- let percent = Math.floor(this._sizeDone * 100 / this._sizeQueued);
48
- //console.log("Upload status: queued: "+this._sizeQueued+", done: "+this._sizeDone+", "+percent+"%")
49
- return percent;
50
- }
51
- }
52
- export class Upload {
53
- constructor(blob, url, _serverPersistable = null) {
54
- this._serverPersistable = _serverPersistable;
55
- this.onDone = null;
56
- this.toString = () => {
57
- let s = `Upload: Status: ${this.status}, URL: ${this._url}`;
58
- if (this._data instanceof Blob) {
59
- s = s + `, Size: ${this._data.size}`;
60
- }
61
- else if (this._data instanceof FormData) {
62
- // TODO (iterate through parts ??)
63
- }
64
- return s;
65
- };
66
- this._data = blob;
67
- this._url = url;
68
- this.status = UploadStatus.IDLE;
69
- }
70
- get serverPersistable() {
71
- return this._serverPersistable;
72
- }
73
- get url() {
74
- return this._url;
75
- }
76
- get data() {
77
- return this._data;
78
- }
79
- done() {
80
- this.status = UploadStatus.DONE;
81
- //console.debug("Single upload done.");
82
- if (this._serverPersistable) {
83
- this._serverPersistable.serverPersisted = true;
84
- //console.debug("Single upload set server persisted: "+this.serverPersistable);
85
- }
86
- else {
87
- //console.debug("Server persistable not set.");
88
- }
89
- if (this.onDone) {
90
- this.onDone(this);
91
- }
92
- }
93
- }
94
- export class UploadHolder {
95
- constructor() {
96
- this.onUploadSet = null;
97
- this._upload = null;
98
- }
99
- get upload() {
100
- return this._upload;
101
- }
102
- set upload(value) {
103
- this._upload = value;
104
- if (this._upload && this.onUploadSet) {
105
- this.onUploadSet(this._upload);
106
- }
107
- }
108
- }
109
- export class UploadSet {
110
- constructor() {
111
- this.uploads = new Array();
112
- this._complete = false;
113
- this._onDone = null;
114
- }
115
- add(upload) {
116
- if (this._complete) {
117
- throw new Error('Cannot add upload to upload set. Upload set already complete.');
118
- }
119
- if (upload instanceof UploadHolder) {
120
- upload.onUploadSet = (upl) => {
121
- upl.onDone = () => {
122
- this.checkUploadStates();
123
- };
124
- this.checkUploadStates();
125
- };
126
- }
127
- this.uploads.push(upload);
128
- }
129
- complete() {
130
- // Mark set as complete
131
- this._complete = true;
132
- // add listeners to each upload
133
- for (let upl of this.uploads) {
134
- if (upl instanceof Upload) {
135
- upl.onDone = (upl) => {
136
- this.checkUploadStates();
137
- };
138
- }
139
- else if (upl instanceof UploadHolder) {
140
- if (upl.upload) {
141
- upl.upload.onDone = (upl) => {
142
- this.checkUploadStates();
143
- };
144
- }
145
- }
146
- }
147
- // check immediately if already done
148
- this.checkUploadStates();
149
- }
150
- set onDone(value) {
151
- this._onDone = value;
152
- this.checkUploadStates();
153
- }
154
- checkUploadStates() {
155
- //console.debug("Check upload state...")
156
- if (this._complete) {
157
- if (this._onDone) {
158
- for (let upl of this.uploads) {
159
- if (upl instanceof Upload) {
160
- if (UploadStatus.DONE !== upl.status) {
161
- // At least this upload is not yet done
162
- // Do nothing
163
- //console.debug("Check upload state: Upload not done.")
164
- return;
165
- }
166
- }
167
- else if (upl instanceof UploadHolder) {
168
- if (upl.upload) {
169
- if (UploadStatus.DONE !== upl.upload.status) {
170
- // At least this upload is not yet done
171
- // Do nothing
172
- //console.debug("Check upload state: Upload (holder) not done.")
173
- return;
174
- }
175
- }
176
- else {
177
- // The actual upload is not yet set
178
- //console.debug("Check upload state: Upload (holder): upload not yet set.")
179
- return;
180
- }
181
- }
182
- }
183
- // set is complete and all upload parts are done, call done callback
184
- //console.debug("Check upload state: All done.")
185
- this._onDone(this);
186
- }
187
- }
188
- }
189
- }
190
- export class Uploader {
191
- constructor(http, withCredentials = false) {
192
- this.http = http;
193
- this.withCredentials = withCredentials;
194
- this.POST_MIN_TIMEOUT = 120000; // 2min plus ...
195
- this.POST_TIMEOUT_PER_KB = 1000; // ... 1s per kB
196
- this.RETRY_DELAY = 30000; // retry every 30s
197
- this.DEBUG_DELAY = 0;
198
- //DEBUG_DELAY:number=0;
199
- this.status = UploaderStatus.DONE;
200
- this.listener = null;
201
- this._sizeQueued = 0;
202
- this._sizeDone = 0;
203
- this.retryTimerRunning = false;
204
- this.retryTimerId = null;
205
- this.te = new TextEncoder();
206
- this.que = new Array();
207
- }
208
- dataSize(dt) {
209
- let si = 0;
210
- if (dt instanceof Blob) {
211
- si = dt.size;
212
- }
213
- else if (dt instanceof FormData) {
214
- dt.forEach((v, k) => {
215
- if (v instanceof File) {
216
- si += v.size;
217
- }
218
- else if (typeof v === 'string') {
219
- // encode to UTF-8 to get upload size
220
- si += this.te.encode().length;
221
- }
222
- });
223
- }
224
- return si;
225
- }
226
- uploadDone(ul) {
227
- ul.done();
228
- // remove upload from queue
229
- for (let i = 0; i < this.que.length; i++) {
230
- if (this.que[i] === ul) {
231
- // found, remove
232
- this.que.splice(i, 1);
233
- let ulSize = this.dataSize(ul.data);
234
- this._sizeDone += ulSize;
235
- break;
236
- }
237
- }
238
- // set to done for now...
239
- this.status = UploaderStatus.NEXT;
240
- // continue
241
- this.process();
242
- }
243
- startUpload(ul) {
244
- ul.status = UploadStatus.UPLOADING;
245
- if (UploaderStatus.ERR === this.status) {
246
- this.status = UploaderStatus.TRY_UPLOADING;
247
- }
248
- else {
249
- this.status = UploaderStatus.UPLOADING;
250
- }
251
- let dSize = this.dataSize(ul.data);
252
- let timeoutForDataSize = dSize * this.POST_TIMEOUT_PER_KB / 1000;
253
- let timeoVal = Math.round(this.POST_MIN_TIMEOUT + timeoutForDataSize);
254
- // pipe(timeout()) is not the same as xhr.timeout
255
- let uploadedUpload = null;
256
- //console.debug("Post upload: "+ul)
257
- this.http.post(ul.url, ul.data, { withCredentials: this.withCredentials }).pipe(timeout(timeoVal)).subscribe({
258
- next: (data) => {
259
- uploadedUpload = ul;
260
- //console.debug('Next method called for upload: '+uploadedUpload)
261
- },
262
- error: (err) => {
263
- if (err.error instanceof Error) {
264
- // A client-side or network error occurred. Handle it accordingly.
265
- console.error('Upload error occurred:', err.error.message);
266
- }
267
- else {
268
- // The backend returned an unsuccessful response code.
269
- // The response body may contain clues as to what went wrong,
270
- console.error(`Upload error: Server returned code ${err.status}`);
271
- }
272
- this.processError(ul);
273
- }, complete: () => {
274
- //console.debug('Upload complete method called')
275
- if (uploadedUpload) {
276
- if (this.DEBUG_DELAY > 0) {
277
- window.setTimeout(() => {
278
- this.uploadDone(ul);
279
- }, this.DEBUG_DELAY);
280
- }
281
- else {
282
- this.uploadDone(uploadedUpload);
283
- }
284
- }
285
- else {
286
- console.error('Upload post complete, but upload not set in next method!');
287
- }
288
- }
289
- });
290
- }
291
- processError(ul) {
292
- //console.debug("Process upload error...")
293
- ul.status = UploadStatus.ERR;
294
- this.status = UploaderStatus.ERR;
295
- let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);
296
- if (this.listener) {
297
- this.listener(ue);
298
- }
299
- // set retry timer
300
- this.retryTimerId = window.setTimeout(() => {
301
- this.retryTimerRunning = false;
302
- //console.debug("Upload retry timer expired. Continue processing...")
303
- this.process();
304
- }, this.RETRY_DELAY);
305
- this.retryTimerRunning = true;
306
- //console.debug("Started upload retry timer "+this.RETRY_DELAY+"ms ...")
307
- }
308
- process() {
309
- // clear retry timer if set
310
- if (this.retryTimerRunning) {
311
- if (this.retryTimerId) {
312
- window.clearTimeout(this.retryTimerId);
313
- }
314
- this.retryTimerRunning = false;
315
- //console.debug("Cleared retry timer.")
316
- }
317
- let pul = null;
318
- //console.debug("Uploader status: "+this.status)
319
- let s = this.que.length;
320
- //console.debug(s+" uploads are in the queue.")
321
- if (s > 0 && UploaderStatus.UPLOADING != this.status && UploaderStatus.TRY_UPLOADING != this.status) {
322
- for (let i = 0; i < s; i++) {
323
- let ul = this.que[i];
324
- //console.log("Upload "+ul+" status:"+ul.status)
325
- if (ul.status === UploadStatus.IDLE) {
326
- //console.log("Upload "+ul+" startUpload")
327
- this.startUpload(ul);
328
- pul = ul;
329
- break;
330
- }
331
- }
332
- if (!pul) {
333
- //console.log("Check ERR uploads...")
334
- // now failed uploads
335
- //console.debug("No regular upload found. Looking for error state uploads.")
336
- for (let i = 0; i < s; i++) {
337
- let ul = this.que[i];
338
- //console.log("Upload "+ul+" status:"+ul.status)
339
- if (ul.status === UploadStatus.ERR) {
340
- //console.log("Upload (ERR) "+ul+" startUpload")
341
- //console.debug("Start error state upload "+ul)
342
- this.startUpload(ul);
343
- pul = ul;
344
- break;
345
- }
346
- }
347
- }
348
- }
349
- if (s == 0) {
350
- //console.debug("Upload done.")
351
- this.status = UploaderStatus.DONE;
352
- }
353
- let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);
354
- if (this.listener) {
355
- this.listener(ue);
356
- }
357
- }
358
- queueUpload(ul) {
359
- if (ul) {
360
- let ulSize = this.dataSize(ul.data);
361
- this.que.push(ul);
362
- this._sizeQueued += ulSize;
363
- this.process();
364
- }
365
- }
366
- }
367
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbmV0L3VwbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVJLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV4QyxxQkFBcUI7QUFDckIsTUFBTSxDQUFOLElBQVksWUFBc0U7QUFBbEYsV0FBWSxZQUFZO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLHlEQUFhLENBQUE7SUFBRyxpREFBUyxDQUFBO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLDhDQUFRLENBQUE7QUFBQSxDQUFDLEVBQXRFLFlBQVksS0FBWixZQUFZLFFBQTBEO0FBRWxGLHdCQUF3QjtBQUN4Qiw0RkFBNEY7QUFDNUYsTUFBTSxDQUFOLElBQVksY0FBK0U7QUFBM0YsV0FBWSxjQUFjO0lBQUcsbURBQVEsQ0FBQTtJQUFFLDZEQUFhLENBQUE7SUFBRSxxRUFBaUIsQ0FBQTtJQUFDLG1EQUFRLENBQUE7SUFBRSxrREFBUSxDQUFBO0FBQUEsQ0FBQyxFQUEvRSxjQUFjLEtBQWQsY0FBYyxRQUFpRTtBQUUzRixNQUFNLE9BQU8seUJBQXlCO0lBTWxDLFlBQVksVUFBa0IsRUFBRSxRQUFnQixFQUFFLE1BQXNCO1FBQ3BFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsR0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELFVBQVU7UUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLGdDQUFnQztZQUNoQyxPQUFPLEdBQUcsQ0FBQztTQUNkO1FBQ0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEUsb0dBQW9HO1FBQ3BHLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7Q0FFSjtBQUVELE1BQU0sT0FBTyxNQUFNO0lBWWYsWUFBWSxJQUFrQixFQUFFLEdBQVUsRUFBUyxxQkFBMEMsSUFBSTtRQUE5Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTRCO1FBRmpHLFdBQU0sR0FBZ0MsSUFBSSxDQUFDO1FBZ0N0QyxhQUFRLEdBQUcsR0FBWSxFQUFFO1lBQzlCLElBQUksQ0FBQyxHQUFDLG1CQUFtQixJQUFJLENBQUMsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMxRCxJQUFHLElBQUksQ0FBQyxLQUFLLFlBQVksSUFBSSxFQUFDO2dCQUMxQixDQUFDLEdBQUMsQ0FBQyxHQUFDLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNwQztpQkFBSyxJQUFHLElBQUksQ0FBQyxLQUFLLFlBQWEsUUFBUSxFQUFDO2dCQUN0QyxrQ0FBa0M7YUFDcEM7WUFDRCxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUMsQ0FBQTtRQXJDSyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQWRILElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFjQyxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSTtRQUNBLElBQUksQ0FBQyxNQUFNLEdBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUM5Qix1Q0FBdUM7UUFDdkMsSUFBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDL0MsK0VBQStFO1NBQ2hGO2FBQUk7WUFDSCwrQ0FBK0M7U0FDaEQ7UUFDRCxJQUFHLElBQUksQ0FBQyxNQUFNLEVBQUM7WUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztDQWFKO0FBRUQsTUFBTSxPQUFPLFlBQVk7SUFBekI7UUFFRSxnQkFBVyxHQUE4QixJQUFJLENBQUM7UUFZdEMsWUFBTyxHQUFhLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBWEMsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFvQjtRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBQztZQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7Q0FFRjtBQUVELE1BQU0sT0FBTyxTQUFTO0lBQXRCO1FBRVUsWUFBTyxHQUE2QixJQUFJLEtBQUssRUFBdUIsQ0FBQztRQUNyRSxjQUFTLEdBQUMsS0FBSyxDQUFDO1FBRWhCLFlBQU8sR0FBb0MsSUFBSSxDQUFDO0lBZ0YxRCxDQUFDO0lBOUVDLEdBQUcsQ0FBQyxNQUEwQjtRQUM1QixJQUFHLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFBO1NBQ2pGO1FBQ0QsSUFBRyxNQUFNLFlBQVksWUFBWSxFQUFDO1lBQ2hDLE1BQU0sQ0FBQyxXQUFXLEdBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRTtnQkFDeEIsR0FBRyxDQUFDLE1BQU0sR0FBQyxHQUFFLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNCLENBQUMsQ0FBQTtnQkFDRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixDQUFDLENBQUE7U0FDRjtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVCLENBQUM7SUFFRCxRQUFRO1FBQ04sdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUMsSUFBSSxDQUFDO1FBRXBCLCtCQUErQjtRQUMvQixLQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUM7WUFDMUIsSUFBRyxHQUFHLFlBQVksTUFBTSxFQUFFO2dCQUN4QixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7b0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMzQixDQUFDLENBQUE7YUFDRjtpQkFBSyxJQUFHLEdBQUcsWUFBWSxZQUFZLEVBQUM7Z0JBQ25DLElBQUcsR0FBRyxDQUFDLE1BQU0sRUFBQztvQkFDWixHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFO3dCQUNsQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDM0IsQ0FBQyxDQUFBO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsS0FBOEM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLGlCQUFpQjtRQUN2Qix3Q0FBd0M7UUFDeEMsSUFBRyxJQUFJLENBQUMsU0FBUyxFQUFDO1lBRWhCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZixLQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUM7b0JBQzFCLElBQUcsR0FBRyxZQUFZLE1BQU0sRUFBRTt3QkFDeEIsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxNQUFNLEVBQUU7NEJBQ3BDLHVDQUF1Qzs0QkFDdkMsYUFBYTs0QkFDYix1REFBdUQ7NEJBQ3ZELE9BQU87eUJBQ1I7cUJBQ0Y7eUJBQUssSUFBRyxHQUFHLFlBQVksWUFBWSxFQUFDO3dCQUNuQyxJQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUM7NEJBQ1osSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO2dDQUMzQyx1Q0FBdUM7Z0NBQ3ZDLGFBQWE7Z0NBQ2IsZ0VBQWdFO2dDQUNoRSxPQUFPOzZCQUNSO3lCQUNGOzZCQUFJOzRCQUNILG1DQUFtQzs0QkFDbkMsMkVBQTJFOzRCQUMzRSxPQUFPO3lCQUNSO3FCQUNGO2lCQUNGO2dCQUNELG9FQUFvRTtnQkFDcEUsZ0RBQWdEO2dCQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1NBQ0Y7SUFDSCxDQUFDO0NBQ0Y7QUFNRCxNQUFNLE9BQU8sUUFBUTtJQWtCakIsWUFBb0IsSUFBZ0IsRUFBVSxrQkFBMkIsS0FBSztRQUExRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBakI5RSxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsQ0FBQyxnQkFBZ0I7UUFDM0Msd0JBQW1CLEdBQUcsSUFBSSxDQUFDLENBQUUsZ0JBQWdCO1FBRTdDLGdCQUFXLEdBQVcsS0FBSyxDQUFDLENBQUMsa0JBQWtCO1FBQy9DLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBQ3hCLHVCQUF1QjtRQUNmLFdBQU0sR0FBbUIsY0FBYyxDQUFDLElBQUksQ0FBQztRQUVyRCxhQUFRLEdBQXFELElBQUksQ0FBQztRQUMxRCxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUN4QixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBRXRCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFFbkMsT0FBRSxHQUFhLElBQUksV0FBVyxFQUFFLENBQUM7UUFHckMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQ25DLENBQUM7SUFFTyxRQUFRLENBQUMsRUFBZ0I7UUFDN0IsSUFBSSxFQUFFLEdBQUMsQ0FBQyxDQUFDO1FBQ1QsSUFBRyxFQUFFLFlBQVksSUFBSSxFQUFDO1lBQ2xCLEVBQUUsR0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO1NBQ2Q7YUFBSyxJQUFHLEVBQUUsWUFBYSxRQUFRLEVBQUM7WUFDN0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsRUFBRTtnQkFDZCxJQUFHLENBQUMsWUFBWSxJQUFJLEVBQUM7b0JBQ2pCLEVBQUUsSUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO2lCQUNkO3FCQUFLLElBQUcsT0FBTyxDQUFDLEtBQUksUUFBUSxFQUFDO29CQUMxQixxQ0FBcUM7b0JBQ3JDLEVBQUUsSUFBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztpQkFDaEM7WUFDTCxDQUFDLENBQUMsQ0FBQTtTQUNMO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRVEsVUFBVSxDQUFDLEVBQVM7UUFFekIsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRVYsMkJBQTJCO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNwQixnQkFBZ0I7Z0JBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDO2dCQUN6QixNQUFNO2FBQ1Q7U0FDSjtRQUNELHlCQUF5QjtRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFDbEMsV0FBVztRQUNYLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU8sV0FBVyxDQUFDLEVBQVM7UUFFekIsRUFBRSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQ25DLElBQUksY0FBYyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQztTQUM5QzthQUFNO1lBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO1NBQzFDO1FBRUQsSUFBSSxLQUFLLEdBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxrQkFBa0IsR0FBQyxLQUFLLEdBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFDLElBQUksQ0FBQztRQUMzRCxJQUFJLFFBQVEsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ3hFLGlEQUFpRDtRQUVuRCxJQUFJLGNBQWMsR0FBYSxJQUFJLENBQUM7UUFDbEMsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFDLElBQUksRUFBQyxFQUFDLGVBQWUsRUFBQyxJQUFJLENBQUMsZUFBZSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNuRztZQUNJLElBQUksRUFBRSxDQUFDLElBQUksRUFBQyxFQUFFO2dCQUVWLGNBQWMsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLGlFQUFpRTtZQUNyRSxDQUFDO1lBQ0MsS0FBSyxFQUFDLENBQUMsR0FBc0IsRUFBRSxFQUFFO2dCQUMvQixJQUFJLEdBQUcsQ0FBQyxLQUFLLFlBQVksS0FBSyxFQUFFO29CQUM1QixrRUFBa0U7b0JBQ2xFLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDOUQ7cUJBQU07b0JBQ0gsc0RBQXNEO29CQUN0RCw2REFBNkQ7b0JBQzdELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2lCQUNyRTtnQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3pCLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUNkLGdEQUFnRDtnQkFDaEQsSUFBSSxjQUFjLEVBQUU7b0JBQ2hCLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7d0JBQ3RCLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFOzRCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN4QixDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUN4Qjt5QkFBTTt3QkFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFBO3FCQUNsQztpQkFDSjtxQkFBTTtvQkFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUE7aUJBQzVFO1lBQ0wsQ0FBQztTQUNKLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxZQUFZLENBQUMsRUFBUztRQUMxQiwwQ0FBMEM7UUFDMUMsRUFBRSxDQUFDLE1BQU0sR0FBQyxZQUFZLENBQUMsR0FBRyxDQUFBO1FBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQztRQUVqQyxJQUFJLEVBQUUsR0FBRyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEYsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNyQjtRQUVELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsWUFBWSxHQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBQyxLQUFLLENBQUM7WUFDN0IscUVBQXFFO1lBQ3JFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXJCLElBQUksQ0FBQyxpQkFBaUIsR0FBQyxJQUFJLENBQUM7UUFDNUIsd0VBQXdFO0lBQzVFLENBQUM7SUFFSyxPQUFPO1FBQ2IsMkJBQTJCO1FBQzNCLElBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFDO1lBQ3RCLElBQUcsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDbEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7YUFDekM7WUFDSCxJQUFJLENBQUMsaUJBQWlCLEdBQUMsS0FBSyxDQUFBO1lBQzVCLHVDQUF1QztTQUN4QztRQUVELElBQUksR0FBRyxHQUFrQixJQUFJLENBQUM7UUFFOUIsZ0RBQWdEO1FBRWhELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3hCLCtDQUErQztRQUUvQyxJQUFJLENBQUMsR0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUVqRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixnREFBZ0Q7Z0JBQ2hELElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsSUFBSSxFQUFFO29CQUNuQywwQ0FBMEM7b0JBQzFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3JCLEdBQUcsR0FBRyxFQUFFLENBQUM7b0JBQ1QsTUFBTTtpQkFDUDthQUNGO1lBQ0QsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDUixxQ0FBcUM7Z0JBQ3JDLHFCQUFxQjtnQkFDckIsNEVBQTRFO2dCQUM1RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMxQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyQixnREFBZ0Q7b0JBQ2hELElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsR0FBRyxFQUFFO3dCQUNsQyxnREFBZ0Q7d0JBQ2hELCtDQUErQzt3QkFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDckIsR0FBRyxHQUFHLEVBQUUsQ0FBQzt3QkFDVCxNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELElBQUcsQ0FBQyxJQUFFLENBQUMsRUFBQztZQUNOLCtCQUErQjtZQUMvQixJQUFJLENBQUMsTUFBTSxHQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUE7U0FDaEM7UUFDRCxJQUFJLEVBQUUsR0FBRyxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEYsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRUMsV0FBVyxDQUFDLEVBQVU7UUFDbEIsSUFBSSxFQUFFLEVBQUU7WUFDSixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDbEI7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuICAgIGltcG9ydCB7SHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2V9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG4gICAgaW1wb3J0IHsgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5cclxuICAgIC8vIHN0YXRlIG9mIGFuIHVwbG9hZFxyXG4gICAgZXhwb3J0IGVudW0gVXBsb2FkU3RhdHVzIHtJRExFID0gMSwgVVBMT0FESU5HID0gMiwgIEFCT1JUID0gMywgRE9ORSA9IDAsIEVSUiA9IC0xfVxyXG5cclxuICAgIC8vIHN0YXRlIG9mIHRoZSB1cGxvYWRlclxyXG4gICAgLy8gVFJZX1VQTE9BRElORyBpcyB1cGxvYWRpbmcgc3RhdGUgYWZ0ZXIgYW4gZXJyb3IgKGZvciBleGFtcGxlIGlmIGRpc2Nvbm5lY3RlZCBmcm9tIHNlcnZlcilcclxuICAgIGV4cG9ydCBlbnVtIFVwbG9hZGVyU3RhdHVzIHsgRE9ORSA9IDAsIFVQTE9BRElORyA9IDEsIFRSWV9VUExPQURJTkcgPSAyLE5FWFQgPSAzLCBFUlIgPSAtMX1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCB7XHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfc2l6ZVF1ZXVlZDpudW1iZXI7XHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfc2l6ZURvbmU6bnVtYmVyO1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3N0YXR1czogVXBsb2FkZXJTdGF0dXM7XHJcblxyXG5cclxuICAgICAgICBjb25zdHJ1Y3RvcihzaXplUXVldWVkOiBudW1iZXIsIHNpemVEb25lOiBudW1iZXIsIHN0YXR1czogVXBsb2FkZXJTdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy5fc2l6ZVF1ZXVlZCA9IHNpemVRdWV1ZWQ7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpemVEb25lID0gc2l6ZURvbmU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IHN0YXR1cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBzaXplUXVldWVkKCk6bnVtYmVyIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpemVRdWV1ZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgc2l6ZURvbmUoKTpudW1iZXIge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZURvbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzaXplSW5RdWV1ZSgpe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3NpemVRdWV1ZWQtdGhpcy5fc2l6ZURvbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgc3RhdHVzKCk6IFVwbG9hZGVyU3RhdHVzIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHVwbG9hZERvbmUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5fc2l6ZURvbmUgPj0gdGhpcy5fc2l6ZVF1ZXVlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwZXJjZW50RG9uZSgpOiBudW1iZXIge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2l6ZVF1ZXVlZCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBubyBkYXRhIHF1ZXVlZCwgd2UgYXJlIFwiZG9uZVwiXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBwZXJjZW50ID0gTWF0aC5mbG9vcih0aGlzLl9zaXplRG9uZSAqIDEwMCAvIHRoaXMuX3NpemVRdWV1ZWQpO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiVXBsb2FkIHN0YXR1czogcXVldWVkOiBcIit0aGlzLl9zaXplUXVldWVkK1wiLCBkb25lOiBcIit0aGlzLl9zaXplRG9uZStcIiwgXCIrcGVyY2VudCtcIiVcIilcclxuICAgICAgICAgICAgcmV0dXJuIHBlcmNlbnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgVXBsb2FkIHtcclxuXHJcbiAgICAgIGdldCBzZXJ2ZXJQZXJzaXN0YWJsZSgpOiBTZXJ2ZXJQZXJzaXN0YWJsZSB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJQZXJzaXN0YWJsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9kYXRhOkJsb2J8Rm9ybURhdGE7XHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdXJsOnN0cmluZztcclxuXHJcbiAgICAgICAgc3RhdHVzOiBVcGxvYWRTdGF0dXM7XHJcbiAgICAgICAgb25Eb25lOigodXBsb2FkOlVwbG9hZCk9PnZvaWQpIHwgbnVsbD1udWxsO1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3RvcihibG9iOkJsb2J8Rm9ybURhdGEsIHVybDpzdHJpbmcscHJpdmF0ZSBfc2VydmVyUGVyc2lzdGFibGU6U2VydmVyUGVyc2lzdGFibGV8bnVsbD1udWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGEgPSBibG9iO1xyXG4gICAgICAgICAgICB0aGlzLl91cmwgPSB1cmw7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkU3RhdHVzLklETEU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgdXJsKCk6c3RyaW5nIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBkYXRhKCk6QmxvYnxGb3JtRGF0YSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZG9uZSgpe1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1cz1VcGxvYWRTdGF0dXMuRE9ORTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2luZ2xlIHVwbG9hZCBkb25lLlwiKTtcclxuICAgICAgICAgICAgaWYodGhpcy5fc2VydmVyUGVyc2lzdGFibGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9zZXJ2ZXJQZXJzaXN0YWJsZS5zZXJ2ZXJQZXJzaXN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNpbmdsZSB1cGxvYWQgc2V0IHNlcnZlciBwZXJzaXN0ZWQ6IFwiK3RoaXMuc2VydmVyUGVyc2lzdGFibGUpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTZXJ2ZXIgcGVyc2lzdGFibGUgbm90IHNldC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodGhpcy5vbkRvbmUpe1xyXG4gICAgICAgICAgICAgIHRoaXMub25Eb25lKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICBwdWJsaWMgdG9TdHJpbmcgPSAoKSA6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgbGV0IHM9YFVwbG9hZDogU3RhdHVzOiAke3RoaXMuc3RhdHVzfSwgVVJMOiAke3RoaXMuX3VybH1gO1xyXG4gICAgICAgIGlmKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBCbG9iKXtcclxuICAgICAgICAgICAgcz1zK2AsIFNpemU6ICR7dGhpcy5fZGF0YS5zaXplfWA7XHJcbiAgICAgICAgfWVsc2UgaWYodGhpcy5fZGF0YSBpbnN0YW5jZW9mICBGb3JtRGF0YSl7XHJcbiAgICAgICAgICAgLy8gVE9ETyAoaXRlcmF0ZSB0aHJvdWdoIHBhcnRzID8/KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBVcGxvYWRIb2xkZXJ7XHJcblxyXG4gICAgICBvblVwbG9hZFNldDooKHVwbG9hZDpVcGxvYWQpPT52b2lkKXxudWxsPW51bGw7XHJcblxyXG4gICAgICBnZXQgdXBsb2FkKCk6IFVwbG9hZCB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91cGxvYWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNldCB1cGxvYWQodmFsdWU6IFVwbG9hZCB8IG51bGwpIHtcclxuICAgICAgICB0aGlzLl91cGxvYWQgPSB2YWx1ZTtcclxuICAgICAgICBpZih0aGlzLl91cGxvYWQgJiYgdGhpcy5vblVwbG9hZFNldCl7XHJcbiAgICAgICAgICB0aGlzLm9uVXBsb2FkU2V0KHRoaXMuX3VwbG9hZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHByaXZhdGUgX3VwbG9hZDpVcGxvYWR8bnVsbD1udWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBVcGxvYWRTZXR7XHJcblxyXG4gICAgICBwcml2YXRlIHVwbG9hZHM6IEFycmF5PFVwbG9hZHxVcGxvYWRIb2xkZXI+PW5ldyBBcnJheTxVcGxvYWR8VXBsb2FkSG9sZGVyPigpO1xyXG4gICAgICBwcml2YXRlIF9jb21wbGV0ZT1mYWxzZTtcclxuXHJcbiAgICAgIHByaXZhdGUgX29uRG9uZTooKHVwbG9hZFNldDpVcGxvYWRTZXQpPT52b2lkKXxudWxsPW51bGw7XHJcblxyXG4gICAgICBhZGQodXBsb2FkOlVwbG9hZHxVcGxvYWRIb2xkZXIpe1xyXG4gICAgICAgIGlmKHRoaXMuX2NvbXBsZXRlKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgdXBsb2FkIHRvIHVwbG9hZCBzZXQuIFVwbG9hZCBzZXQgYWxyZWFkeSBjb21wbGV0ZS4nKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZih1cGxvYWQgaW5zdGFuY2VvZiBVcGxvYWRIb2xkZXIpe1xyXG4gICAgICAgICAgdXBsb2FkLm9uVXBsb2FkU2V0PSh1cGwpPT57XHJcbiAgICAgICAgICAgIHVwbC5vbkRvbmU9KCk9PntcclxuICAgICAgICAgICAgICB0aGlzLmNoZWNrVXBsb2FkU3RhdGVzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jaGVja1VwbG9hZFN0YXRlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwbG9hZHMucHVzaCh1cGxvYWQpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgY29tcGxldGUoKXtcclxuICAgICAgICAvLyBNYXJrIHNldCBhcyBjb21wbGV0ZVxyXG4gICAgICAgIHRoaXMuX2NvbXBsZXRlPXRydWU7XHJcblxyXG4gICAgICAgIC8vIGFkZCBsaXN0ZW5lcnMgdG8gZWFjaCB1cGxvYWRcclxuICAgICAgICBmb3IobGV0IHVwbCBvZiB0aGlzLnVwbG9hZHMpe1xyXG4gICAgICAgICAgaWYodXBsIGluc3RhbmNlb2YgVXBsb2FkKSB7XHJcbiAgICAgICAgICAgIHVwbC5vbkRvbmUgPSAodXBsOiBVcGxvYWQpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmNoZWNrVXBsb2FkU3RhdGVzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIGlmKHVwbCBpbnN0YW5jZW9mIFVwbG9hZEhvbGRlcil7XHJcbiAgICAgICAgICAgIGlmKHVwbC51cGxvYWQpe1xyXG4gICAgICAgICAgICAgIHVwbC51cGxvYWQub25Eb25lID0gKHVwbDogVXBsb2FkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVXBsb2FkU3RhdGVzKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBjaGVjayBpbW1lZGlhdGVseSBpZiBhbHJlYWR5IGRvbmVcclxuICAgICAgICB0aGlzLmNoZWNrVXBsb2FkU3RhdGVzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNldCBvbkRvbmUodmFsdWU6ICgodXBsb2FkU2V0OiBVcGxvYWRTZXQpID0+IHZvaWQpIHwgbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX29uRG9uZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuY2hlY2tVcGxvYWRTdGF0ZXMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHJpdmF0ZSBjaGVja1VwbG9hZFN0YXRlcygpe1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNoZWNrIHVwbG9hZCBzdGF0ZS4uLlwiKVxyXG4gICAgICAgIGlmKHRoaXMuX2NvbXBsZXRlKXtcclxuXHJcbiAgICAgICAgICBpZih0aGlzLl9vbkRvbmUpIHtcclxuICAgICAgICAgICAgZm9yKGxldCB1cGwgb2YgdGhpcy51cGxvYWRzKXtcclxuICAgICAgICAgICAgICBpZih1cGwgaW5zdGFuY2VvZiBVcGxvYWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChVcGxvYWRTdGF0dXMuRE9ORSAhPT0gdXBsLnN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAvLyBBdCBsZWFzdCB0aGlzIHVwbG9hZCBpcyBub3QgeWV0IGRvbmVcclxuICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZ1xyXG4gICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJDaGVjayB1cGxvYWQgc3RhdGU6IFVwbG9hZCBub3QgZG9uZS5cIilcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1lbHNlIGlmKHVwbCBpbnN0YW5jZW9mIFVwbG9hZEhvbGRlcil7XHJcbiAgICAgICAgICAgICAgICBpZih1cGwudXBsb2FkKXtcclxuICAgICAgICAgICAgICAgICAgaWYgKFVwbG9hZFN0YXR1cy5ET05FICE9PSB1cGwudXBsb2FkLnN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEF0IGxlYXN0IHRoaXMgdXBsb2FkIGlzIG5vdCB5ZXQgZG9uZVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmdcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJDaGVjayB1cGxvYWQgc3RhdGU6IFVwbG9hZCAoaG9sZGVyKSBub3QgZG9uZS5cIilcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIHVwbG9hZCBpcyBub3QgeWV0IHNldFxyXG4gICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJDaGVjayB1cGxvYWQgc3RhdGU6IFVwbG9hZCAoaG9sZGVyKTogdXBsb2FkIG5vdCB5ZXQgc2V0LlwiKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHNldCBpcyBjb21wbGV0ZSBhbmQgYWxsIHVwbG9hZCBwYXJ0cyBhcmUgZG9uZSwgY2FsbCBkb25lIGNhbGxiYWNrXHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNoZWNrIHVwbG9hZCBzdGF0ZTogQWxsIGRvbmUuXCIpXHJcbiAgICAgICAgICAgIHRoaXMuX29uRG9uZSh0aGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNlcnZlclBlcnNpc3RhYmxle1xyXG4gICAgICAgIHNlcnZlclBlcnNpc3RlZDpib29sZWFuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBVcGxvYWRlciB7XHJcbiAgICAgICAgUE9TVF9NSU5fVElNRU9VVCA9IDEyMDAwMDsgLy8gMm1pbiBwbHVzIC4uLlxyXG4gICAgICAgIFBPU1RfVElNRU9VVF9QRVJfS0IgPSAxMDAwOyAgLy8gLi4uIDFzIHBlciBrQlxyXG5cclxuICAgICAgICBSRVRSWV9ERUxBWTogbnVtYmVyID0gMzAwMDA7IC8vIHJldHJ5IGV2ZXJ5IDMwc1xyXG4gICAgICAgIERFQlVHX0RFTEFZOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIC8vREVCVUdfREVMQVk6bnVtYmVyPTA7XHJcbiAgICAgICAgcHJpdmF0ZSBzdGF0dXM6IFVwbG9hZGVyU3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuRE9ORTtcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHF1ZTogQXJyYXk8VXBsb2FkPjtcclxuICAgICAgICBsaXN0ZW5lcjogKCh1ZTogVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBwcml2YXRlIF9zaXplUXVldWVkOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIHByaXZhdGUgX3NpemVEb25lOiBudW1iZXIgPSAwO1xyXG5cclxuICAgICAgICBwcml2YXRlIHJldHJ5VGltZXJSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgcHJpdmF0ZSByZXRyeVRpbWVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICBwcml2YXRlIHRlOlRleHRFbmNvZGVyPW5ldyBUZXh0RW5jb2RlcigpO1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgd2l0aENyZWRlbnRpYWxzOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5xdWUgPSBuZXcgQXJyYXk8VXBsb2FkPigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBkYXRhU2l6ZShkdDpCbG9ifEZvcm1EYXRhKXtcclxuICAgICAgICAgICAgbGV0IHNpPTA7XHJcbiAgICAgICAgICAgIGlmKGR0IGluc3RhbmNlb2YgQmxvYil7XHJcbiAgICAgICAgICAgICAgICBzaT1kdC5zaXplO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZihkdCBpbnN0YW5jZW9mICBGb3JtRGF0YSl7XHJcbiAgICAgICAgICAgICAgICBkdC5mb3JFYWNoKCh2LGspPT57XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodiBpbnN0YW5jZW9mIEZpbGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaSs9di5zaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2ID09PSdzdHJpbmcnKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5jb2RlIHRvIFVURi04IHRvIGdldCB1cGxvYWQgc2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaSs9IHRoaXMudGUuZW5jb2RlKCkubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHNpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSAgdXBsb2FkRG9uZSh1bDpVcGxvYWQpIHtcclxuXHJcbiAgICAgICAgICAgIHVsLmRvbmUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSB1cGxvYWQgZnJvbSBxdWV1ZVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucXVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWVbaV0gPT09IHVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQsIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdWxTaXplID0gdGhpcy5kYXRhU2l6ZSh1bC5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaXplRG9uZSArPSB1bFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gc2V0IHRvIGRvbmUgZm9yIG5vdy4uLlxyXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLk5FWFQ7XHJcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIHRoaXMucHJvY2VzcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBzdGFydFVwbG9hZCh1bDpVcGxvYWQpIHtcclxuXHJcbiAgICAgICAgICAgIHVsLnN0YXR1cyA9IFVwbG9hZFN0YXR1cy5VUExPQURJTkc7XHJcbiAgICAgICAgICAgIGlmIChVcGxvYWRlclN0YXR1cy5FUlIgPT09IHRoaXMuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLlRSWV9VUExPQURJTkc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLlVQTE9BRElORztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGRTaXplPXRoaXMuZGF0YVNpemUodWwuZGF0YSk7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb3V0Rm9yRGF0YVNpemU9ZFNpemUqdGhpcy5QT1NUX1RJTUVPVVRfUEVSX0tCLzEwMDA7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb1ZhbDpudW1iZXI9TWF0aC5yb3VuZCh0aGlzLlBPU1RfTUlOX1RJTUVPVVQrdGltZW91dEZvckRhdGFTaXplKVxyXG4gICAgICAgICAgICAvLyBwaXBlKHRpbWVvdXQoKSkgaXMgbm90IHRoZSBzYW1lIGFzIHhoci50aW1lb3V0XHJcblxyXG4gICAgICAgICAgbGV0IHVwbG9hZGVkVXBsb2FkOlVwbG9hZHxudWxsPW51bGw7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlBvc3QgdXBsb2FkOiBcIit1bClcclxuICAgICAgICAgICAgdGhpcy5odHRwLnBvc3QodWwudXJsLHVsLmRhdGEse3dpdGhDcmVkZW50aWFsczp0aGlzLndpdGhDcmVkZW50aWFsc30pLnBpcGUodGltZW91dCh0aW1lb1ZhbCkpLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0OiAoZGF0YSk9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkZWRVcGxvYWQgPSB1bDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdOZXh0IG1ldGhvZCBjYWxsZWQgZm9yIHVwbG9hZDogJyt1cGxvYWRlZFVwbG9hZClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLCBlcnJvcjooZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY2xpZW50LXNpZGUgb3IgbmV0d29yayBlcnJvciBvY2N1cnJlZC4gSGFuZGxlIGl0IGFjY29yZGluZ2x5LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVXBsb2FkIGVycm9yIG9jY3VycmVkOicsIGVyci5lcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBiYWNrZW5kIHJldHVybmVkIGFuIHVuc3VjY2Vzc2Z1bCByZXNwb25zZSBjb2RlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlc3BvbnNlIGJvZHkgbWF5IGNvbnRhaW4gY2x1ZXMgYXMgdG8gd2hhdCB3ZW50IHdyb25nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgVXBsb2FkIGVycm9yOiBTZXJ2ZXIgcmV0dXJuZWQgY29kZSAke2Vyci5zdGF0dXN9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IodWwpXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdVcGxvYWQgY29tcGxldGUgbWV0aG9kIGNhbGxlZCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGxvYWRlZFVwbG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuREVCVUdfREVMQVkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZERvbmUodWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuREVCVUdfREVMQVkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZERvbmUodXBsb2FkZWRVcGxvYWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVcGxvYWQgcG9zdCBjb21wbGV0ZSwgYnV0IHVwbG9hZCBub3Qgc2V0IGluIG5leHQgbWV0aG9kIScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgcHJvY2Vzc0Vycm9yKHVsOlVwbG9hZCkge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJQcm9jZXNzIHVwbG9hZCBlcnJvci4uLlwiKVxyXG4gICAgICAgICAgICB1bC5zdGF0dXM9VXBsb2FkU3RhdHVzLkVSUlxyXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLkVSUjtcclxuXHJcbiAgICAgICAgICAgIGxldCB1ZSA9IG5ldyBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50KHRoaXMuX3NpemVRdWV1ZWQsIHRoaXMuX3NpemVEb25lLCB0aGlzLnN0YXR1cyk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyKHVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc2V0IHJldHJ5IHRpbWVyXHJcbiAgICAgICAgICAgIHRoaXMucmV0cnlUaW1lcklkPXdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmV0cnlUaW1lclJ1bm5pbmc9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGxvYWQgcmV0cnkgdGltZXIgZXhwaXJlZC4gQ29udGludWUgcHJvY2Vzc2luZy4uLlwiKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMuUkVUUllfREVMQVkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVyUnVubmluZz10cnVlO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdGFydGVkIHVwbG9hZCByZXRyeSB0aW1lciBcIit0aGlzLlJFVFJZX0RFTEFZK1wibXMgLi4uXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgcHJpdmF0ZSBwcm9jZXNzKCkge1xyXG4gICAgICAgIC8vIGNsZWFyIHJldHJ5IHRpbWVyIGlmIHNldFxyXG4gICAgICAgIGlmKHRoaXMucmV0cnlUaW1lclJ1bm5pbmcpe1xyXG4gICAgICAgICAgICBpZih0aGlzLnJldHJ5VGltZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZXJJZClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZXRyeVRpbWVyUnVubmluZz1mYWxzZVxyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2xlYXJlZCByZXRyeSB0aW1lci5cIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwdWw6IFVwbG9hZCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGxvYWRlciBzdGF0dXM6IFwiK3RoaXMuc3RhdHVzKVxyXG5cclxuICAgICAgICBsZXQgcyA9IHRoaXMucXVlLmxlbmd0aDtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcocytcIiB1cGxvYWRzIGFyZSBpbiB0aGUgcXVldWUuXCIpXHJcblxyXG4gICAgICAgIGlmIChzPjAgJiYgVXBsb2FkZXJTdGF0dXMuVVBMT0FESU5HICE9IHRoaXMuc3RhdHVzICYmIFVwbG9hZGVyU3RhdHVzLlRSWV9VUExPQURJTkcgIT0gdGhpcy5zdGF0dXMpIHtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHM7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdWwgPSB0aGlzLnF1ZVtpXTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCBcIit1bCtcIiBzdGF0dXM6XCIrdWwuc3RhdHVzKVxyXG4gICAgICAgICAgICBpZiAodWwuc3RhdHVzID09PSBVcGxvYWRTdGF0dXMuSURMRSkge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJVcGxvYWQgXCIrdWwrXCIgc3RhcnRVcGxvYWRcIilcclxuICAgICAgICAgICAgICB0aGlzLnN0YXJ0VXBsb2FkKHVsKTtcclxuICAgICAgICAgICAgICBwdWwgPSB1bDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCFwdWwpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkNoZWNrIEVSUiB1cGxvYWRzLi4uXCIpXHJcbiAgICAgICAgICAgIC8vIG5vdyBmYWlsZWQgdXBsb2Fkc1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyByZWd1bGFyIHVwbG9hZCBmb3VuZC4gTG9va2luZyBmb3IgZXJyb3Igc3RhdGUgdXBsb2Fkcy5cIilcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgdWwgPSB0aGlzLnF1ZVtpXTtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiVXBsb2FkIFwiK3VsK1wiIHN0YXR1czpcIit1bC5zdGF0dXMpXHJcbiAgICAgICAgICAgICAgaWYgKHVsLnN0YXR1cyA9PT0gVXBsb2FkU3RhdHVzLkVSUikge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCAoRVJSKSBcIit1bCtcIiBzdGFydFVwbG9hZFwiKVxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RhcnQgZXJyb3Igc3RhdGUgdXBsb2FkIFwiK3VsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFVwbG9hZCh1bCk7XHJcbiAgICAgICAgICAgICAgICBwdWwgPSB1bDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihzPT0wKXtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwbG9hZCBkb25lLlwiKVxyXG4gICAgICAgICAgdGhpcy5zdGF0dXM9VXBsb2FkZXJTdGF0dXMuRE9ORVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdWUgPSBuZXcgVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCh0aGlzLl9zaXplUXVldWVkLCB0aGlzLl9zaXplRG9uZSwgdGhpcy5zdGF0dXMpO1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICB0aGlzLmxpc3RlbmVyKHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICAgcXVldWVVcGxvYWQodWw6IFVwbG9hZCkge1xyXG4gICAgICAgICAgICBpZiAodWwpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bFNpemUgPSB0aGlzLmRhdGFTaXplKHVsLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5xdWUucHVzaCh1bCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaXplUXVldWVkICs9IHVsU2l6ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiJdfQ==
@@ -1,49 +0,0 @@
1
- export var ConstraintType;
2
- (function (ConstraintType) {
3
- ConstraintType["Exact"] = "EXACT";
4
- ConstraintType["Ideal"] = "IDEAL";
5
- })(ConstraintType || (ConstraintType = {}));
6
- ;
7
- export var Platform;
8
- (function (Platform) {
9
- Platform["Linux"] = "LINUX";
10
- Platform["macOS"] = "MACOS";
11
- Platform["Windows"] = "WINDOWS";
12
- Platform["Android"] = "ANDROID";
13
- })(Platform || (Platform = {}));
14
- export var BrowserBase;
15
- (function (BrowserBase) {
16
- BrowserBase["Chromium"] = "CHROMIUM";
17
- })(BrowserBase || (BrowserBase = {}));
18
- ;
19
- export var Browser;
20
- (function (Browser) {
21
- Browser["Firefox"] = "FIREFOX";
22
- Browser["Chromium"] = "CHROMIUM";
23
- Browser["Chrome"] = "CHROME";
24
- Browser["Edge"] = "EDGE";
25
- Browser["Opera"] = "OPERA";
26
- })(Browser || (Browser = {}));
27
- export var AudioStorageType;
28
- (function (AudioStorageType) {
29
- AudioStorageType["MEM_ENTIRE"] = "MEM_ENTIRE";
30
- AudioStorageType["MEM_CHUNKED"] = "MEM_CHUNKED";
31
- AudioStorageType["DB_CHUNKED"] = "DB_CHUNKED";
32
- AudioStorageType["NET_CHUNKED"] = "NET_CHUNKED";
33
- AudioStorageType["MEM_ENTIRE_AUTO_NET_CHUNKED"] = "MEM_ENTIRE_AUTO_NET_CHUNKED";
34
- AudioStorageType["MEM_CHUNKED_AUTO_NET_CHUNKED"] = "MEM_CHUNKED_AUTO_NET_CHUNKED";
35
- })(AudioStorageType || (AudioStorageType = {}));
36
- export class ProjectUtil {
37
- static audioChannelCount(project) {
38
- let chs = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
39
- if (project.mediaCaptureFormat) {
40
- chs = project.mediaCaptureFormat.audioChannelCount;
41
- }
42
- else if (project.audioFormat) {
43
- chs = project.audioFormat.channels;
44
- }
45
- return chs;
46
- }
47
- }
48
- ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT = 2;
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9wcm9qZWN0L3Byb2plY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE1BQU0sQ0FBTixJQUFZLGNBQTRDO0FBQXhELFdBQVksY0FBYztJQUFFLGlDQUFhLENBQUE7SUFBQyxpQ0FBYSxDQUFBO0FBQUEsQ0FBQyxFQUE1QyxjQUFjLEtBQWQsY0FBYyxRQUE4QjtBQUFBLENBQUM7QUFFekQsTUFBTSxDQUFOLElBQVksUUFBMEU7QUFBdEYsV0FBWSxRQUFRO0lBQUUsMkJBQWEsQ0FBQTtJQUFDLDJCQUFhLENBQUE7SUFBQywrQkFBaUIsQ0FBQTtJQUFDLCtCQUFpQixDQUFBO0FBQUEsQ0FBQyxFQUExRSxRQUFRLEtBQVIsUUFBUSxRQUFrRTtBQUN0RixNQUFNLENBQU4sSUFBWSxXQUFpQztBQUE3QyxXQUFZLFdBQVc7SUFBRSxvQ0FBbUIsQ0FBQTtBQUFBLENBQUMsRUFBakMsV0FBVyxLQUFYLFdBQVcsUUFBc0I7QUFBQSxDQUFDO0FBQzlDLE1BQU0sQ0FBTixJQUFZLE9BQXlGO0FBQXJHLFdBQVksT0FBTztJQUFFLDhCQUFpQixDQUFBO0lBQUMsZ0NBQW1CLENBQUE7SUFBQyw0QkFBZSxDQUFBO0lBQUMsd0JBQVcsQ0FBQTtJQUFDLDBCQUFhLENBQUE7QUFBQSxDQUFDLEVBQXpGLE9BQU8sS0FBUCxPQUFPLFFBQWtGO0FBRXJHLE1BQU0sQ0FBTixJQUFZLGdCQU9YO0FBUEQsV0FBWSxnQkFBZ0I7SUFDMUIsNkNBQXVCLENBQUE7SUFDdkIsK0NBQXlCLENBQUE7SUFDekIsNkNBQXVCLENBQUE7SUFDdkIsK0NBQXlCLENBQUE7SUFDekIsK0VBQXlELENBQUE7SUFDekQsaUZBQTJELENBQUE7QUFDN0QsQ0FBQyxFQVBXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFPM0I7QUF3QkQsTUFBTSxPQUFPLFdBQVc7SUFJdEIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQWU7UUFDdEMsSUFBSSxHQUFHLEdBQUMsV0FBVyxDQUFDLDJCQUEyQixDQUFDO1FBQ2hELElBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFDO1lBQzVCLEdBQUcsR0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUM7U0FDbEQ7YUFBSyxJQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUM7WUFDM0IsR0FBRyxHQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztBQVZzQix1Q0FBMkIsR0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuZXhwb3J0IGludGVyZmFjZSBBdWRpb0Zvcm1hdCB7XHJcbiAgY2hhbm5lbHM6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZWRpYUNhcHR1cmVGb3JtYXQge1xyXG4gIGF1ZGlvQ2hhbm5lbENvdW50OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9EZXZpY2Uge1xyXG4gIG5hbWUgOiBzdHJpbmcsXHJcbiAgcGxheWJhY2sgOiBib29sZWFuLFxyXG4gIHJlZ2V4IDogYm9vbGVhblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGVudW0gQ29uc3RyYWludFR5cGUge0V4YWN0PSdFWEFDVCcsSWRlYWw9J0lERUFMJ307XHJcblxyXG5leHBvcnQgZW51bSBQbGF0Zm9ybSB7TGludXg9J0xJTlVYJyxtYWNPUz0nTUFDT1MnLFdpbmRvd3M9J1dJTkRPV1MnLEFuZHJvaWQ9J0FORFJPSUQnfVxyXG5leHBvcnQgZW51bSBCcm93c2VyQmFzZSB7Q2hyb21pdW09J0NIUk9NSVVNJ307XHJcbmV4cG9ydCBlbnVtIEJyb3dzZXIge0ZpcmVmb3g9J0ZJUkVGT1gnLENocm9taXVtPSdDSFJPTUlVTScsQ2hyb21lPSdDSFJPTUUnLEVkZ2U9J0VER0UnLE9wZXJhPSdPUEVSQSd9XHJcblxyXG5leHBvcnQgZW51bSBBdWRpb1N0b3JhZ2VUeXBlIHtcclxuICBNRU1fRU5USVJFPSdNRU1fRU5USVJFJyxcclxuICBNRU1fQ0hVTktFRD0nTUVNX0NIVU5LRUQnLFxyXG4gIERCX0NIVU5LRUQ9J0RCX0NIVU5LRUQnLFxyXG4gIE5FVF9DSFVOS0VEPSdORVRfQ0hVTktFRCcsXHJcbiAgTUVNX0VOVElSRV9BVVRPX05FVF9DSFVOS0VEPSdNRU1fRU5USVJFX0FVVE9fTkVUX0NIVU5LRUQnLFxyXG4gIE1FTV9DSFVOS0VEX0FVVE9fTkVUX0NIVU5LRUQ9J01FTV9DSFVOS0VEX0FVVE9fTkVUX0NIVU5LRUQnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXV0b0dhaW5Db250cm9sQ29uZmlnIHtcclxuICB2YWx1ZTogYm9vbGVhbixcclxuICAvL2NvbnN0cmFpbnRUeXBlIDogQ29uc3RyYWludFR5cGUsXHJcbiAgcGxhdGZvcm06IFBsYXRmb3JtLFxyXG4gIC8vYnJvd3NlckJhc2U6QnJvd3NlckJhc2UsXHJcbiAgLy9icm93c2VyOkJyb3dzZXJcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0IHtcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgcmVjb3JkaW5nRGV2aWNlV2FrZUxvY2s/OmJvb2xlYW4sXHJcbiAgYXVkaW9Gb3JtYXQ/OiBBdWRpb0Zvcm1hdCxcclxuICBtZWRpYUNhcHR1cmVGb3JtYXQ/OiBNZWRpYUNhcHR1cmVGb3JtYXQsXHJcbiAgYXV0b0dhaW5Db250cm9sQ29uZmlncz86QXJyYXk8QXV0b0dhaW5Db250cm9sQ29uZmlnPixcclxuICBhbGxvd0VjaG9DYW5jZWxsYXRpb24/OmJvb2xlYW4sXHJcbiAgYXVkaW9EZXZpY2VzPzogQXJyYXk8QXVkaW9EZXZpY2U+LFxyXG4gIGNodW5rZWRSZWNvcmRpbmc/OiBib29sZWFuLFxyXG4gIGNsaWVudEF1ZGlvU3RvcmFnZVR5cGU/OkF1ZGlvU3RvcmFnZVR5cGUsXHJcbiAgc2hvd1Nlc3Npb25Db21wbGV0ZU1lc3NhZ2U/OmJvb2xlYW47XHJcbn1cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgUHJvamVjdFV0aWwge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQVVESU9fQ0hBTk5FTF9DT1VOVD0yO1xyXG5cclxuICBzdGF0aWMgYXVkaW9DaGFubmVsQ291bnQocHJvamVjdDpQcm9qZWN0KTogbnVtYmVye1xyXG4gICAgbGV0IGNocz1Qcm9qZWN0VXRpbC5ERUZBVUxUX0FVRElPX0NIQU5ORUxfQ09VTlQ7XHJcbiAgICBpZihwcm9qZWN0Lm1lZGlhQ2FwdHVyZUZvcm1hdCl7XHJcbiAgICAgIGNocz1wcm9qZWN0Lm1lZGlhQ2FwdHVyZUZvcm1hdC5hdWRpb0NoYW5uZWxDb3VudDtcclxuICAgIH1lbHNlIGlmKHByb2plY3QuYXVkaW9Gb3JtYXQpe1xyXG4gICAgICBjaHM9cHJvamVjdC5hdWRpb0Zvcm1hdC5jaGFubmVscztcclxuICAgIH1cclxuICAgIHJldHVybiBjaHM7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcblxyXG4iXX0=
@@ -1,64 +0,0 @@
1
- /**
2
- * Created by klausj on 17.06.2017.
3
- */
4
- import { Inject, Injectable } from '@angular/core';
5
- import { ApiType, SPEECHRECORDER_CONFIG } from "../../spr.config";
6
- import { UUID } from "../../utils/utils";
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common/http";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "../../spr.config";
11
- export class ProjectService {
12
- constructor(http, platformLocation, config) {
13
- this.http = http;
14
- this.platformLocation = platformLocation;
15
- this.config = config;
16
- this.withCredentials = false;
17
- console.log("Base Href: " + platformLocation.getBaseHrefFromDOM());
18
- let apiEndPoint = '';
19
- if (config && config.apiEndPoint) {
20
- apiEndPoint = config.apiEndPoint;
21
- }
22
- if (apiEndPoint !== '') {
23
- apiEndPoint = apiEndPoint + '/';
24
- }
25
- if (config != null && config.withCredentials != null) {
26
- this.withCredentials = config.withCredentials;
27
- }
28
- this.projectCtxUrl = apiEndPoint + ProjectService.PROJECT_API_CTX;
29
- }
30
- appendRequestUUIDForDevelopmentServer(url) {
31
- let resUrl = url;
32
- if (this.config && this.config.apiType === ApiType.FILES) {
33
- // for development and demo
34
- // append UUID to make request URL unique to avoid localhost server caching
35
- resUrl = resUrl + '.json?requestUUID=' + UUID.generate();
36
- }
37
- return resUrl;
38
- }
39
- projectUrl(id) {
40
- let encPrjId = encodeURIComponent(id);
41
- return this.appendRequestUUIDForDevelopmentServer(this.projectCtxUrl + '/' + encPrjId);
42
- }
43
- projectResourceUrl(projectId, relResourcePath) {
44
- let encPrjId = encodeURIComponent(projectId);
45
- // Use encodeURI here since the relatice resource path from recording scripts is already a URI
46
- // encodeURIComponent function would encode the slashes and fetching the resource would fail
47
- let encRelResPath = encodeURI(relResourcePath);
48
- return this.projectCtxUrl + '/' + encPrjId + '/' + encRelResPath;
49
- }
50
- projectObservable(id) {
51
- let prjUrl = this.projectUrl(id);
52
- return this.http.get(prjUrl, { withCredentials: this.withCredentials });
53
- }
54
- }
55
- ProjectService.PROJECT_API_CTX = 'project';
56
- ProjectService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ProjectService, deps: [{ token: i1.HttpClient }, { token: i2.PlatformLocation }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
57
- ProjectService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ProjectService });
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ProjectService, decorators: [{
59
- type: Injectable
60
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.PlatformLocation }, { type: i3.SpeechRecorderConfig, decorators: [{
61
- type: Inject,
62
- args: [SPEECHRECORDER_CONFIG]
63
- }] }]; } });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUV0RixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7Ozs7O0FBT3ZDLE1BQU0sT0FBTyxjQUFjO0lBS3pCLFlBQW9CLElBQWUsRUFBUyxnQkFBaUMsRUFBd0MsTUFBNEI7UUFBN0gsU0FBSSxHQUFKLElBQUksQ0FBVztRQUFTLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFBd0MsV0FBTSxHQUFOLE1BQU0sQ0FBc0I7UUFGaEksb0JBQWUsR0FBUyxLQUFLLENBQUM7UUFJN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBRWpFLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQTtRQUVwQixJQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQy9CLFdBQVcsR0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1NBQ2hDO1FBQ0QsSUFBRyxXQUFXLEtBQUssRUFBRSxFQUFDO1lBQ3BCLFdBQVcsR0FBQyxXQUFXLEdBQUMsR0FBRyxDQUFBO1NBQzVCO1FBQ0QsSUFBRyxNQUFNLElBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxlQUFlLElBQUUsSUFBSSxFQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLEdBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztTQUM3QztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxHQUFHLGNBQWMsQ0FBQyxlQUFlLENBQUM7SUFFcEUsQ0FBQztJQUVPLHFDQUFxQyxDQUFDLEdBQVU7UUFDdEQsSUFBSSxNQUFNLEdBQUMsR0FBRyxDQUFDO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDeEQsMkJBQTJCO1lBQzNCLDJFQUEyRTtZQUMzRSxNQUFNLEdBQUcsTUFBTSxHQUFHLG9CQUFvQixHQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN4RDtRQUNELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFTO1FBQ2xCLElBQUksUUFBUSxHQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxTQUFpQixFQUFDLGVBQXNCO1FBQ3pELElBQUksUUFBUSxHQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLDhGQUE4RjtRQUM5Riw0RkFBNEY7UUFDNUYsSUFBSSxhQUFhLEdBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLEdBQUcsUUFBUSxHQUFFLEdBQUcsR0FBQyxhQUFhLENBQUM7SUFDaEUsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQVM7UUFDekIsSUFBSSxNQUFNLEdBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFVLE1BQU0sRUFBQyxFQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFDLENBQUMsQ0FBQTtJQUMvRSxDQUFDOztBQWxEcUIsOEJBQWUsR0FBQyxTQUFTLENBQUE7NEdBRHJDLGNBQWMsNEVBSzZELHFCQUFxQjtnSEFMaEcsY0FBYzs0RkFBZCxjQUFjO2tCQUQxQixVQUFVOzswQkFNc0UsTUFBTTsyQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQ3JlYXRlZCBieSBrbGF1c2ogb24gMTcuMDYuMjAxNy5cclxuICovXHJcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtBcGlUeXBlLCBTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1Byb2plY3R9IGZyb20gXCIuL3Byb2plY3RcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1BsYXRmb3JtTG9jYXRpb259IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuXHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUHJvamVjdFNlcnZpY2Uge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPSkVDVF9BUElfQ1RYPSdwcm9qZWN0J1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdEN0eFVybDpzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aXRoQ3JlZGVudGlhbHM6Ym9vbGVhbj1mYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOkh0dHBDbGllbnQscHJpdmF0ZSBwbGF0Zm9ybUxvY2F0aW9uOlBsYXRmb3JtTG9jYXRpb24sQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByaXZhdGUgY29uZmlnPzpTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiQmFzZSBIcmVmOiBcIitwbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSgpKTtcclxuXHJcbiAgICBsZXQgYXBpRW5kUG9pbnQgPSAnJ1xyXG5cclxuICAgIGlmKGNvbmZpZyAmJiBjb25maWcuYXBpRW5kUG9pbnQpIHtcclxuICAgICAgYXBpRW5kUG9pbnQ9Y29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgfVxyXG4gICAgaWYoYXBpRW5kUG9pbnQgIT09ICcnKXtcclxuICAgICAgYXBpRW5kUG9pbnQ9YXBpRW5kUG9pbnQrJy8nXHJcbiAgICB9XHJcbiAgICBpZihjb25maWchPW51bGwgJiYgY29uZmlnLndpdGhDcmVkZW50aWFscyE9bnVsbCl7XHJcbiAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzPWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcm9qZWN0Q3R4VXJsID0gYXBpRW5kUG9pbnQgKyBQcm9qZWN0U2VydmljZS5QUk9KRUNUX0FQSV9DVFg7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRSZXF1ZXN0VVVJREZvckRldmVsb3BtZW50U2VydmVyKHVybDpzdHJpbmcpOnN0cmluZ3tcclxuICAgIGxldCByZXNVcmw9dXJsO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZXNVcmwgPSByZXNVcmwgKyAnLmpzb24/cmVxdWVzdFVVSUQ9JytVVUlELmdlbmVyYXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzVXJsXHJcbiAgfVxyXG5cclxuICBwcm9qZWN0VXJsKGlkOnN0cmluZyk6c3RyaW5ne1xyXG4gICAgbGV0IGVuY1ByaklkPWVuY29kZVVSSUNvbXBvbmVudChpZCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRSZXF1ZXN0VVVJREZvckRldmVsb3BtZW50U2VydmVyKHRoaXMucHJvamVjdEN0eFVybCArICcvJyArIGVuY1ByaklkKTtcclxuICB9XHJcblxyXG4gIHByb2plY3RSZXNvdXJjZVVybChwcm9qZWN0SWQ6IHN0cmluZyxyZWxSZXNvdXJjZVBhdGg6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICBsZXQgZW5jUHJqSWQ9ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RJZCk7XHJcbiAgICAvLyBVc2UgZW5jb2RlVVJJIGhlcmUgc2luY2UgdGhlIHJlbGF0aWNlIHJlc291cmNlIHBhdGggZnJvbSByZWNvcmRpbmcgc2NyaXB0cyBpcyBhbHJlYWR5IGEgVVJJXHJcbiAgICAvLyBlbmNvZGVVUklDb21wb25lbnQgZnVuY3Rpb24gd291bGQgZW5jb2RlIHRoZSBzbGFzaGVzIGFuZCBmZXRjaGluZyB0aGUgcmVzb3VyY2Ugd291bGQgZmFpbFxyXG4gICAgbGV0IGVuY1JlbFJlc1BhdGg9ZW5jb2RlVVJJKHJlbFJlc291cmNlUGF0aCk7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0Q3R4VXJsICsgJy8nICsgZW5jUHJqSWQgKycvJytlbmNSZWxSZXNQYXRoO1xyXG4gIH1cclxuXHJcbiAgcHJvamVjdE9ic2VydmFibGUoaWQ6c3RyaW5nKTpPYnNlcnZhYmxlPFByb2plY3Q+e1xyXG4gICAgbGV0IHByalVybD10aGlzLnByb2plY3RVcmwoaWQpO1xyXG4gICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFByb2plY3Q+KHByalVybCx7d2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFsc30pXHJcbiAgIH1cclxuXHJcbn1cclxuXHJcblxyXG4iXX0=