speechrecorderng 3.0.0 → 3.3.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 (142) hide show
  1. package/esm2020/lib/action/action.mjs +2 -1
  2. package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
  3. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
  4. package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
  5. package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
  6. package/esm2020/lib/audio/audio_display.mjs +10 -34
  7. package/esm2020/lib/audio/audio_player.mjs +18 -45
  8. package/esm2020/lib/audio/capture/capture.mjs +293 -69
  9. package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
  10. package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
  11. package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
  12. package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
  13. package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
  14. package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
  15. package/esm2020/lib/audio/persistor.mjs +8 -2
  16. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
  17. package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
  18. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  19. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
  20. package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
  21. package/esm2020/lib/audio/playback/player.mjs +190 -171
  22. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
  23. package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
  24. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
  25. package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
  26. package/esm2020/lib/audio/ui/container.mjs +40 -57
  27. package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
  28. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
  29. package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
  30. package/esm2020/lib/db/inddb.mjs +120 -0
  31. package/esm2020/lib/io/BinaryReader.mjs +85 -0
  32. package/esm2020/lib/io/stream.mjs +101 -1
  33. package/esm2020/lib/net/uploader.mjs +111 -5
  34. package/esm2020/lib/recorder_component.mjs +59 -1
  35. package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
  36. package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
  37. package/esm2020/lib/speechrecorder/recording.mjs +30 -6
  38. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
  39. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +732 -65
  40. package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
  41. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
  42. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
  43. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
  44. package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
  45. package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
  46. package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
  47. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
  48. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +28 -15
  49. package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
  50. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
  51. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
  52. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
  53. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
  54. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
  55. package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
  56. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  57. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
  58. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
  59. package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
  60. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
  61. package/esm2020/lib/speechrecorderng.component.mjs +42 -31
  62. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  63. package/esm2020/lib/spr.config.mjs +3 -3
  64. package/esm2020/lib/spr.module.version.mjs +2 -2
  65. package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
  66. package/esm2020/lib/ui/message_dialog.mjs +7 -7
  67. package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
  68. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  69. package/esm2020/lib/utils/ua-parser.mjs +28 -4
  70. package/esm2020/lib/utils/utils.mjs +29 -1
  71. package/fesm2015/speechrecorderng.mjs +12755 -9195
  72. package/fesm2015/speechrecorderng.mjs.map +1 -1
  73. package/fesm2020/speechrecorderng.mjs +12652 -9101
  74. package/fesm2020/speechrecorderng.mjs.map +1 -1
  75. package/{speechrecorderng.d.ts → index.d.ts} +0 -0
  76. package/lib/audio/array_audio_buffer.d.ts +17 -1
  77. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
  78. package/lib/audio/audio_data_holder.d.ts +69 -14
  79. package/lib/audio/audio_display.d.ts +1 -1
  80. package/lib/audio/audio_player.d.ts +3 -7
  81. package/lib/audio/capture/capture.d.ts +24 -4
  82. package/lib/audio/dsp/level_measure.d.ts +2 -23
  83. package/lib/audio/impl/wavformat.d.ts +3 -3
  84. package/lib/audio/impl/wavreader.d.ts +16 -0
  85. package/lib/audio/impl/wavwriter.d.ts +1 -4
  86. package/lib/audio/inddb_audio_buffer.d.ts +68 -0
  87. package/lib/audio/net_audio_buffer.d.ts +59 -0
  88. package/lib/audio/persistor.d.ts +3 -9
  89. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
  90. package/lib/audio/playback/audio_source_node.d.ts +10 -0
  91. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
  92. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
  93. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
  94. package/lib/audio/playback/player.d.ts +19 -16
  95. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
  96. package/lib/audio/ui/audio_display_control.d.ts +3 -6
  97. package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
  98. package/lib/audio/ui/audiosignal.d.ts +4 -3
  99. package/lib/audio/ui/container.d.ts +1 -1
  100. package/lib/audio/ui/livelevel.d.ts +11 -4
  101. package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
  102. package/lib/audio/ui/sonagram.d.ts +4 -3
  103. package/lib/db/inddb.d.ts +21 -0
  104. package/lib/io/BinaryReader.d.ts +18 -0
  105. package/lib/io/stream.d.ts +18 -0
  106. package/lib/net/uploader.d.ts +20 -2
  107. package/lib/recorder_component.d.ts +5 -0
  108. package/lib/speechrecorder/project/project.d.ts +9 -0
  109. package/lib/speechrecorder/recording.d.ts +8 -2
  110. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
  111. package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
  112. package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
  113. package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
  114. package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
  115. package/lib/speechrecorder/session/item.d.ts +1 -0
  116. package/lib/speechrecorder/session/progress.d.ts +2 -1
  117. package/lib/speechrecorder/session/prompting.d.ts +5 -5
  118. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
  119. package/lib/speechrecorder/session/recording_file_cache.d.ts +7 -4
  120. package/lib/speechrecorder/session/recording_list.d.ts +2 -1
  121. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
  122. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
  123. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
  124. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
  125. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
  126. package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
  127. package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
  128. package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
  129. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
  130. package/lib/speechrecorderng.component.d.ts +2 -1
  131. package/lib/spr.module.version.d.ts +1 -1
  132. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  133. package/lib/ui/message_dialog.d.ts +1 -1
  134. package/lib/ui/recordingitem_display.d.ts +3 -2
  135. package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
  136. package/lib/utils/ua-parser.d.ts +4 -1
  137. package/lib/utils/utils.d.ts +6 -0
  138. package/package.json +5 -4
  139. package/esm2020/lib/math/utils.mjs +0 -14
  140. package/esm2020/lib/utils/css_utils.mjs +0 -7
  141. package/lib/math/utils.d.ts +0 -3
  142. package/lib/utils/css_utils.d.ts +0 -3
@@ -1,5 +1,12 @@
1
1
  import { Action } from '../../action/action';
2
- import { ArrayAudioBufferSourceNode, AudioSourceWorkletModuleLoader } from "./array_audio_buffer_source_node";
2
+ import { ArrayAudioBuffer } from "../array_audio_buffer";
3
+ import { ArrayAudioBufferSourceNode } from "./array_audio_buffer_source_node";
4
+ import { IndexedDbAudioBuffer } from "../inddb_audio_buffer";
5
+ import { AudioSourceWorkletModuleLoader } from "./audio_source_worklet_module_loader";
6
+ import { IndexedDbAudioBufferSourceNode } from "./inddb_audio_buffer_source_node";
7
+ import { NetAudioBuffer } from "../net_audio_buffer";
8
+ import { NetAudioBufferSourceNode } from "./net_audio_buffer_source_node";
9
+ import { AudioBufferSource } from "../audio_data_holder";
3
10
  export var EventType;
4
11
  (function (EventType) {
5
12
  EventType[EventType["CLOSED"] = 0] = "CLOSED";
@@ -8,6 +15,7 @@ export var EventType;
8
15
  EventType[EventType["POS_UPDATE"] = 3] = "POS_UPDATE";
9
16
  EventType[EventType["STOPPED"] = 4] = "STOPPED";
10
17
  EventType[EventType["ENDED"] = 5] = "ENDED";
18
+ EventType[EventType["ERROR"] = 6] = "ERROR";
11
19
  })(EventType || (EventType = {}));
12
20
  export class AudioPlayerEvent {
13
21
  constructor(type, timePosition) {
@@ -24,19 +32,14 @@ export class AudioPlayerEvent {
24
32
  export class AudioPlayer {
25
33
  constructor(context, listener) {
26
34
  this.running = false;
35
+ this.ready = false;
27
36
  this._audioClip = null;
28
- this._audioBuffer = null;
29
- this._arrayAudioBuffer = null;
37
+ this._audioSource = null;
30
38
  this.sourceBufferNode = null;
31
39
  this.sourceAudioWorkletNode = null;
32
40
  this.playStartTime = null;
33
41
  this.timerVar = null;
34
42
  this.context = context;
35
- // AudioSourceWorkletModuleLoader.loadModule(this.context).then(()=>{
36
- // console.debug("Audio source worklet module loaded.");
37
- // }).catch((error: any)=>{
38
- // console.error('Could not add module '+error);
39
- // });
40
43
  this.listener = listener;
41
44
  this.bufSize = AudioPlayer.DEFAULT_BUFSIZE;
42
45
  this.n = navigator;
@@ -53,6 +56,11 @@ export class AudioPlayer {
53
56
  this._stopAction = new Action('Stop');
54
57
  this._stopAction.disabled = true;
55
58
  this._stopAction.onAction = () => this.stop();
59
+ this.context.addEventListener('statechange', (ev) => {
60
+ if (this.context.state !== 'running') {
61
+ this.stop();
62
+ }
63
+ });
56
64
  }
57
65
  get autoPlayOnSelectToggleAction() {
58
66
  return this._autoPlayOnSelectToggleAction;
@@ -78,12 +86,7 @@ export class AudioPlayer {
78
86
  // TODO exception
79
87
  }
80
88
  }
81
- if (audioDataHolder.buffer) {
82
- this.audioBuffer = audioDataHolder.buffer;
83
- }
84
- if (audioDataHolder.arrayBuffer) {
85
- this.arrayAudioBuffer = audioDataHolder.arrayBuffer;
86
- }
89
+ this.audioSource = audioDataHolder.audioSource;
87
90
  audioClip.addSelectionObserver((ac) => {
88
91
  this._startSelectionAction.disabled = this.startSelectionDisabled();
89
92
  if (!this.startSelectionAction.disabled && this._autoPlayOnSelectToggleAction.value) {
@@ -92,195 +95,212 @@ export class AudioPlayer {
92
95
  });
93
96
  }
94
97
  else {
95
- this.audioBuffer = null;
96
- //this.arrayAudioBuffer=null;
98
+ this.audioSource = null;
97
99
  }
98
100
  this._audioClip = audioClip;
99
101
  }
100
- set audioBuffer(audioBuffer) {
102
+ get audioSource() {
103
+ return this._audioSource;
104
+ }
105
+ set audioSource(value) {
101
106
  this.stop();
102
- this._audioBuffer = audioBuffer;
103
- this._arrayAudioBuffer = null;
104
- if (audioBuffer && this.context) {
105
- this._startAction.disabled = false;
106
- this._startSelectionAction.disabled = this.startSelectionDisabled();
107
- if (this.listener) {
108
- this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.READY));
107
+ this._audioSource = value;
108
+ if (this._audioSource && this.context) {
109
+ if (this._audioSource instanceof AudioBufferSource) {
110
+ this.ready = true;
111
+ this.updateStartActions();
112
+ if (this.listener) {
113
+ this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.READY));
114
+ }
115
+ }
116
+ else {
117
+ this._loadSourceWorkletAndInitStart();
109
118
  }
110
119
  }
111
120
  else {
112
- this._startAction.disabled = true;
113
- this._startSelectionAction.disabled = true;
121
+ this.ready = false;
122
+ this.updateStartActions();
114
123
  if (this.listener) {
115
124
  this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.CLOSED));
116
125
  }
117
126
  }
118
127
  }
119
- get audioBuffer() {
120
- return this._audioBuffer;
128
+ _loadSourceWorkletAndInitStart() {
129
+ AudioSourceWorkletModuleLoader.loadModule(this.context).then(() => {
130
+ //console.debug("Player ready. ( by Player::_loadSourceWorkletAndInitStart()");
131
+ this.ready = true;
132
+ this.updateStartActions();
133
+ if (this.listener) {
134
+ this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.READY));
135
+ }
136
+ }).catch((error) => {
137
+ this.ready = false;
138
+ this.updateStartActions();
139
+ if (this.listener) {
140
+ this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.CLOSED));
141
+ }
142
+ console.error('Could not add module ' + error);
143
+ });
121
144
  }
122
- set arrayAudioBuffer(arrayAudioBuffer) {
123
- this.stop();
124
- this._audioBuffer = null;
125
- this._arrayAudioBuffer = arrayAudioBuffer;
126
- if (arrayAudioBuffer && this.context) {
127
- AudioSourceWorkletModuleLoader.loadModule(this.context).then(() => {
128
- this._startAction.disabled = false;
129
- this._startSelectionAction.disabled = this.startSelectionDisabled();
130
- if (this.listener) {
131
- this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.READY));
145
+ _startAudioSourceWorkletNode() {
146
+ if (this.sourceAudioWorkletNode) {
147
+ this.sourceAudioWorkletNode.onprocessorerror = (ev) => {
148
+ let msg = 'Unknwon error';
149
+ if (ev instanceof ErrorEvent) {
150
+ msg = ev.message;
132
151
  }
133
- }).catch((error) => {
134
- this._startAction.disabled = true;
135
- this._startSelectionAction.disabled = true;
152
+ console.error("Audio source worklet error: " + msg);
136
153
  if (this.listener) {
137
- this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.CLOSED));
154
+ // TODO
155
+ // this.listener.error(msg);
156
+ // this.listener.audioPlayerUpdate(new AudioPlayerEvent());
138
157
  }
139
- console.error('Could not add module ' + error);
140
- });
141
- }
142
- else {
158
+ };
159
+ this.sourceAudioWorkletNode.connect(this.context.destination); // this already starts playing
160
+ this.sourceAudioWorkletNode.onended = () => this.onended();
161
+ this.running = true;
162
+ this.sourceAudioWorkletNode.start();
163
+ //console.debug("Playback start action enabled. ( by Player::_startAudioSourceWorkletNode()");
143
164
  this._startAction.disabled = true;
144
165
  this._startSelectionAction.disabled = true;
166
+ this._stopAction.disabled = false;
145
167
  if (this.listener) {
146
- this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.CLOSED));
168
+ this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));
147
169
  }
148
170
  }
149
171
  }
150
- get arrayAudioBuffer() {
151
- return this._arrayAudioBuffer;
152
- }
153
172
  start() {
154
173
  if (!this._startAction.disabled && !this.running) {
155
- this.context.resume();
156
- if (this._audioBuffer) {
157
- this.sourceBufferNode = this.context.createBufferSource();
158
- this.sourceBufferNode.buffer = this._audioBuffer;
159
- this.sourceBufferNode.connect(this.context.destination);
160
- this.sourceBufferNode.onended = () => this.onended();
161
- this.playStartTime = this.context.currentTime;
162
- this.running = true;
163
- this.sourceBufferNode.start();
164
- this.playStartTime = this.context.currentTime;
165
- this._startAction.disabled = true;
166
- this._startSelectionAction.disabled = true;
167
- this._stopAction.disabled = false;
168
- //this.timerVar = window.setInterval((e)=>this.updatePlayPosition(), 200);
169
- if (this.listener) {
170
- this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));
171
- }
174
+ if (this.context.state !== 'running') {
175
+ this.context.resume().then(() => {
176
+ this._start();
177
+ }).catch((reason) => {
178
+ console.error('Could not resume audio context: ' + reason);
179
+ });
172
180
  }
173
- else if (this._arrayAudioBuffer) {
174
- if (this._arrayAudioBuffer) {
175
- this.sourceAudioWorkletNode = new ArrayAudioBufferSourceNode(this.context);
176
- this.sourceAudioWorkletNode.onprocessorerror = (ev) => {
177
- let msg = 'Unknwon error';
178
- if (ev instanceof ErrorEvent) {
179
- msg = ev.message;
180
- }
181
- console.error("Audio source worklet error: " + msg);
182
- if (this.listener) {
183
- // TODO
184
- // this.listener.error(msg);
185
- // this.listener.audioPlayerUpdate(new AudioPlayerEvent());
186
- }
187
- };
188
- this.sourceAudioWorkletNode.arrayAudioBuffer = this._arrayAudioBuffer;
189
- this.sourceAudioWorkletNode.connect(this.context.destination); // this already starts playing
190
- this.sourceAudioWorkletNode.onended = () => this.onended();
191
- this.playStartTime = this.context.currentTime;
192
- this.running = true;
193
- this.sourceAudioWorkletNode.start();
194
- this.playStartTime = this.context.currentTime;
195
- this._startAction.disabled = true;
196
- this._startSelectionAction.disabled = true;
197
- this._stopAction.disabled = false;
198
- if (this.listener) {
199
- this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));
200
- }
181
+ else {
182
+ this._start();
183
+ }
184
+ }
185
+ }
186
+ updateStartActions() {
187
+ if (this.ready) {
188
+ if (this._audioSource instanceof AudioBufferSource || this._audioSource instanceof ArrayAudioBuffer || this._audioSource instanceof IndexedDbAudioBuffer) {
189
+ this._startAction.disabled = false;
190
+ this._startSelectionAction.disabled = this.startSelectionDisabled();
191
+ }
192
+ else {
193
+ if (this._audioSource instanceof NetAudioBuffer) {
194
+ this._audioSource.addOnReadyListener(() => {
195
+ this._startAction.disabled = false;
196
+ this._startSelectionAction.disabled = this.startSelectionDisabled();
197
+ });
201
198
  }
202
199
  }
203
200
  }
201
+ else {
202
+ this._startAction.disabled = true;
203
+ this._startSelectionAction.disabled = true;
204
+ }
204
205
  }
205
206
  startSelectionDisabled() {
206
207
  return !(this._audioClip && this.context && !this.startAction.disabled && this._audioClip.selection);
207
208
  }
208
- startSelected() {
209
- if (!this._startAction.disabled && !this.running) {
210
- this.context.resume();
211
- if (this._audioBuffer) {
212
- this.sourceBufferNode = this.context.createBufferSource();
213
- this.sourceBufferNode.buffer = this._audioBuffer;
214
- this.sourceBufferNode.connect(this.context.destination);
215
- this.sourceBufferNode.onended = () => this.onended();
216
- this.playStartTime = this.context.currentTime;
209
+ _start(playSelection = false) {
210
+ if (this._audioSource instanceof AudioBufferSource) {
211
+ this.sourceBufferNode = this.context.createBufferSource();
212
+ this.sourceBufferNode.buffer = this._audioSource.audioBuffer;
213
+ this.sourceBufferNode.connect(this.context.destination);
214
+ this.sourceBufferNode.onended = () => this.onended();
215
+ this.playStartTime = this.context.currentTime;
216
+ this.running = true;
217
+ // unfortunately Web Audio API uses time values not frames
218
+ const ac = this._audioClip;
219
+ let offset = 0;
220
+ if (playSelection && ac && ac.selection) {
221
+ const s = ac.selection;
222
+ const sr = ac.audioDataHolder.sampleRate;
223
+ offset = s.leftFrame / sr;
224
+ const stopPosInsecs = s.rightFrame / sr;
225
+ const dur = stopPosInsecs - offset;
226
+ this.sourceBufferNode.start(0, offset, dur);
227
+ }
228
+ else {
229
+ this.sourceBufferNode.start();
230
+ }
231
+ this.playStartTime = this.context.currentTime - offset;
232
+ this._startAction.disabled = true;
233
+ this._startSelectionAction.disabled = true;
234
+ this._stopAction.disabled = false;
235
+ if (this.listener) {
236
+ this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));
237
+ }
238
+ }
239
+ else if (this._audioSource instanceof ArrayAudioBuffer || this._audioSource instanceof IndexedDbAudioBuffer || this._audioSource instanceof NetAudioBuffer) {
240
+ this.playStartTime = null;
241
+ if (this._audioSource instanceof ArrayAudioBuffer) {
242
+ const aabsn = new ArrayAudioBufferSourceNode(this.context);
243
+ aabsn.arrayAudioBuffer = this._audioSource;
244
+ this.sourceAudioWorkletNode = aabsn;
245
+ }
246
+ else if (this._audioSource instanceof IndexedDbAudioBuffer) {
247
+ const iasn = new IndexedDbAudioBufferSourceNode(this.context);
248
+ iasn.inddbAudioBuffer = this._audioSource;
249
+ this.sourceAudioWorkletNode = iasn;
250
+ }
251
+ else if (this._audioSource instanceof NetAudioBuffer) {
252
+ const nabsn = new NetAudioBufferSourceNode(this.context);
253
+ nabsn.netAudioBuffer = this._audioSource;
254
+ this.sourceAudioWorkletNode = nabsn;
255
+ }
256
+ if (this.sourceAudioWorkletNode) {
257
+ this.sourceAudioWorkletNode.onprocessorerror = (ev) => {
258
+ let msg = 'Unknwon error';
259
+ if (ev instanceof ErrorEvent) {
260
+ msg = ev.message;
261
+ }
262
+ console.error("Audio source worklet error: " + msg);
263
+ if (this.listener) {
264
+ this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.ERROR));
265
+ }
266
+ };
267
+ this.sourceAudioWorkletNode.connect(this.context.destination); // this already starts playing
268
+ this.sourceAudioWorkletNode.onended = () => this.onended();
217
269
  this.running = true;
218
- // unfortunately Web Audio API uses time values not frames
219
- let ac = this._audioClip;
270
+ const ac = this._audioClip;
220
271
  let offset = 0;
221
- if (ac && ac.selection) {
222
- let s = ac.selection;
223
- let sr = ac.audioDataHolder.sampleRate;
272
+ if (playSelection && ac && ac.selection) {
273
+ const s = ac.selection;
274
+ const sr = ac.audioDataHolder.sampleRate;
224
275
  offset = s.leftFrame / sr;
225
- let stopPosInsecs = s.rightFrame / sr;
226
- let dur = stopPosInsecs - offset;
227
- // TODO check valid values
228
- this.sourceBufferNode.start(0, offset, dur);
276
+ const stopPosInsecs = s.rightFrame / sr;
277
+ const dur = stopPosInsecs - offset;
278
+ this.sourceAudioWorkletNode.start(0, offset, dur);
229
279
  }
230
280
  else {
231
- this.sourceBufferNode.start();
281
+ this.sourceAudioWorkletNode.start();
232
282
  }
233
- this.playStartTime = this.context.currentTime - offset;
283
+ //this.playStartTime = this.context.currentTime - offset;
234
284
  this._startAction.disabled = true;
235
285
  this._startSelectionAction.disabled = true;
236
286
  this._stopAction.disabled = false;
237
- //this.timerVar = window.setInterval((e)=>this.updatePlayPosition(), 200);
238
287
  if (this.listener) {
239
288
  this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));
240
289
  }
241
290
  }
242
- else if (this._arrayAudioBuffer) {
243
- if (this._arrayAudioBuffer) {
244
- let aabsn = new ArrayAudioBufferSourceNode(this.context);
245
- this.sourceAudioWorkletNode = aabsn;
246
- aabsn.onprocessorerror = (ev) => {
247
- let msg = 'Unknwon error';
248
- if (ev instanceof ErrorEvent) {
249
- msg = ev.message;
250
- }
251
- console.error("Audio source worklet error: " + msg);
252
- if (this.listener) {
253
- // TODO
254
- // this.listener.error(msg);
255
- // this.listener.audioPlayerUpdate(new AudioPlayerEvent());
256
- }
257
- };
258
- aabsn.arrayAudioBuffer = this._arrayAudioBuffer;
259
- aabsn.connect(this.context.destination); // this already starts playing
260
- aabsn.onended = () => this.onended();
261
- this.playStartTime = this.context.currentTime;
262
- this.running = true;
263
- let ac = this._audioClip;
264
- let offset = 0;
265
- if (ac && ac.selection) {
266
- let s = ac.selection;
267
- let sr = ac.audioDataHolder.sampleRate;
268
- offset = s.leftFrame / sr;
269
- let stopPosInsecs = s.rightFrame / sr;
270
- let dur = stopPosInsecs - offset;
271
- aabsn.start(0, offset, dur);
272
- }
273
- else {
274
- aabsn.start();
275
- }
276
- this.playStartTime = this.context.currentTime - offset;
277
- this._startAction.disabled = true;
278
- this._startSelectionAction.disabled = true;
279
- this._stopAction.disabled = false;
280
- if (this.listener) {
281
- this.listener.audioPlayerUpdate(new AudioPlayerEvent(EventType.STARTED));
282
- }
283
- }
291
+ }
292
+ }
293
+ startSelected() {
294
+ if (!this._startAction.disabled && !this.running) {
295
+ if (this.context.state !== 'running') {
296
+ this.context.resume().then(() => {
297
+ this._start(true);
298
+ }).catch((reason) => {
299
+ console.error('Could not resume audio context: ' + reason);
300
+ });
301
+ }
302
+ else {
303
+ this._start(true);
284
304
  }
285
305
  }
286
306
  }
@@ -305,7 +325,7 @@ export class AudioPlayer {
305
325
  if (this.timerVar != null) {
306
326
  window.clearInterval(this.timerVar);
307
327
  }
308
- this._startAction.disabled = !(this.audioBuffer || this.arrayAudioBuffer);
328
+ this._startAction.disabled = !this._audioSource;
309
329
  this._startSelectionAction.disabled = this.startSelectionDisabled();
310
330
  this._stopAction.disabled = true;
311
331
  this.running = false;
@@ -318,25 +338,24 @@ export class AudioPlayer {
318
338
  if (this.playStartTime !== null) {
319
339
  ppt = this.context.currentTime - this.playStartTime;
320
340
  }
341
+ else if (this.sourceAudioWorkletNode) {
342
+ ppt = this.sourceAudioWorkletNode.playPositionTime;
343
+ }
321
344
  return ppt;
322
345
  }
323
346
  get playPositionFrames() {
324
347
  let ppFrs = null;
325
- let sr = null;
326
- if (this._audioBuffer) {
327
- sr = this._audioBuffer.sampleRate;
328
- }
329
- else if (this._arrayAudioBuffer) {
330
- sr = this._arrayAudioBuffer.sampleRate;
331
- }
332
- if (sr) {
333
- let ppTime = this.playPositionTime;
334
- if (ppTime !== null) {
335
- ppFrs = sr * ppTime;
348
+ if (this._audioSource) {
349
+ let sr = this._audioSource.sampleRate;
350
+ if (sr) {
351
+ let ppTime = this.playPositionTime;
352
+ if (ppTime !== null) {
353
+ ppFrs = sr * ppTime;
354
+ }
336
355
  }
337
356
  }
338
357
  return ppFrs;
339
358
  }
340
359
  }
341
360
  AudioPlayer.DEFAULT_BUFSIZE = 8192;
342
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3BsYXliYWNrL3BsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFHNUMsT0FBTyxFQUFDLDBCQUEwQixFQUFFLDhCQUE4QixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFJeEcsTUFBTSxDQUFOLElBQWEsU0FBMkQ7QUFBeEUsV0FBYSxTQUFTO0lBQUUsNkNBQU0sQ0FBQTtJQUFDLDJDQUFLLENBQUE7SUFBQywrQ0FBTyxDQUFBO0lBQUMscURBQVUsQ0FBQTtJQUFFLCtDQUFPLENBQUE7SUFBRSwyQ0FBSyxDQUFBO0FBQUEsQ0FBQyxFQUEzRCxTQUFTLEtBQVQsU0FBUyxRQUFrRDtBQUV4RSxNQUFNLE9BQU8sZ0JBQWdCO0lBS3pCLFlBQVksSUFBYyxFQUFFLFlBQW9CO1FBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0NBQ0o7QUFLRCxNQUFNLE9BQU8sV0FBVztJQTBCcEIsWUFBWSxPQUFvQixFQUFFLFFBQTRCO1FBckJ0RCxZQUFPLEdBQUMsS0FBSyxDQUFDO1FBUXRCLGVBQVUsR0FBZ0IsSUFBSSxDQUFDO1FBQy9CLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUNyQyxzQkFBaUIsR0FBdUIsSUFBSSxDQUFDO1FBQzdDLHFCQUFnQixHQUE0QixJQUFJLENBQUM7UUFDakQsMkJBQXNCLEdBQWlDLElBQUks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ZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGlvbiB9IGZyb20gJy4uLy4uL2FjdGlvbi9hY3Rpb24nXHJcbmltcG9ydCB7IEF1ZGlvQ2xpcCB9IGZyb20gJy4uL3BlcnNpc3RvcidcclxuaW1wb3J0IHtBcnJheUF1ZGlvQnVmZmVyfSBmcm9tIFwiLi4vYXJyYXlfYXVkaW9fYnVmZmVyXCI7XHJcbmltcG9ydCB7QXJyYXlBdWRpb0J1ZmZlclNvdXJjZU5vZGUsIEF1ZGlvU291cmNlV29ya2xldE1vZHVsZUxvYWRlcn0gZnJvbSBcIi4vYXJyYXlfYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlXCI7XHJcblxyXG5cclxuXHJcbiAgICBleHBvcnQgZW51bSAgRXZlbnRUeXBlIHtDTE9TRUQsUkVBRFksU1RBUlRFRCxQT1NfVVBEQVRFLCBTVE9QUEVELCBFTkRFRH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgQXVkaW9QbGF5ZXJFdmVudHtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSBfdHlwZTpFdmVudFR5cGU7XHJcbiAgICAgICAgcHJpdmF0ZSBfdGltZVBvc2l0aW9uOm51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IodHlwZTpFdmVudFR5cGUsIHRpbWVQb3NpdGlvbj86bnVtYmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lUG9zaXRpb24gPSB0aW1lUG9zaXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgdHlwZSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgdGltZVBvc2l0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGltZVBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXVkaW9QbGF5ZXJMaXN0ZW5lciB7XHJcbiAgICAgICAgYXVkaW9QbGF5ZXJVcGRhdGUoZTpBdWRpb1BsYXllckV2ZW50KTp2b2lkO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBBdWRpb1BsYXllciB7XHJcbiAgICAgICAgZ2V0IGF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb24oKTogQWN0aW9uPGJvb2xlYW4+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9CVUZTSVpFOm51bWJlciA9IDgxOTI7XHJcbiAgICAgICAgcHJpdmF0ZSBydW5uaW5nPWZhbHNlO1xyXG4gICAgICAgIHByaXZhdGUgX3N0YXJ0QWN0aW9uOkFjdGlvbjx2b2lkPjtcclxuICAgICAgcHJpdmF0ZSBfc3RhcnRTZWxlY3Rpb25BY3Rpb246QWN0aW9uPHZvaWQ+O1xyXG4gICAgICAgIHByaXZhdGUgX2F1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb246QWN0aW9uPGJvb2xlYW4+XHJcbiAgICAgICAgcHJpdmF0ZSBfc3RvcEFjdGlvbjpBY3Rpb248dm9pZD47XHJcbiAgICAgICAgYnVmU2l6ZTpudW1iZXI7XHJcbiAgICAgICAgY29udGV4dDpBdWRpb0NvbnRleHQ7XHJcbiAgICAgICAgbGlzdGVuZXI6QXVkaW9QbGF5ZXJMaXN0ZW5lcjtcclxuICAgICAgICBfYXVkaW9DbGlwOkF1ZGlvQ2xpcHxudWxsPW51bGw7XHJcbiAgICAgICAgX2F1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyIHwgbnVsbD1udWxsO1xyXG4gICAgICAgIF9hcnJheUF1ZGlvQnVmZmVyOkFycmF5QXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG4gICAgICAgIHNvdXJjZUJ1ZmZlck5vZGU6QXVkaW9CdWZmZXJTb3VyY2VOb2RlfG51bGw9bnVsbDtcclxuICAgICAgICBzb3VyY2VBdWRpb1dvcmtsZXROb2RlOkFycmF5QXVkaW9CdWZmZXJTb3VyY2VOb2RlfG51bGw9bnVsbDtcclxuICAgICAgICBidWZmUG9zOm51bWJlcjtcclxuICAgICAgICBwcml2YXRlIHplcm9CdWZDbnQ6bnVtYmVyO1xyXG4gICAgICAgIG46YW55O1xyXG4gICAgICAgIHpiOkZsb2F0MzJBcnJheTtcclxuICAgICAgICBwcml2YXRlIHBsYXlTdGFydFRpbWU6bnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSB0aW1lclZhcjpudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OkF1ZGlvQ29udGV4dCwgbGlzdGVuZXI6QXVkaW9QbGF5ZXJMaXN0ZW5lcikge1xyXG4gICAgICAgICAgIHRoaXMuY29udGV4dD1jb250ZXh0O1xyXG4gICAgICAgICAgLy8gQXVkaW9Tb3VyY2VXb3JrbGV0TW9kdWxlTG9hZGVyLmxvYWRNb2R1bGUodGhpcy5jb250ZXh0KS50aGVuKCgpPT57XHJcbiAgICAgICAgICAvLyAgIGNvbnNvbGUuZGVidWcoXCJBdWRpbyBzb3VyY2Ugd29ya2xldCBtb2R1bGUgbG9hZGVkLlwiKTtcclxuICAgICAgICAgIC8vIH0pLmNhdGNoKChlcnJvcjogYW55KT0+e1xyXG4gICAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgYWRkIG1vZHVsZSAnK2Vycm9yKTtcclxuICAgICAgICAgIC8vIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyPWxpc3RlbmVyO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZlNpemUgPSBBdWRpb1BsYXllci5ERUZBVUxUX0JVRlNJWkU7XHJcbiAgICAgICAgICAgIHRoaXMubj1uYXZpZ2F0b3I7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmZlBvcz0wO1xyXG4gICAgICAgICAgICB0aGlzLnplcm9CdWZDbnQ9MDtcclxuICAgICAgICAgICAgdGhpcy56YiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5idWZTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRBY3Rpb24gPSBuZXcgQWN0aW9uKCdTdGFydCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0QWN0aW9uLm9uQWN0aW9uID0gKCk9PnRoaXMuc3RhcnQoKTtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRTZWxlY3Rpb25BY3Rpb249bmV3IEFjdGlvbignU3RhcnQgc2VsZWN0ZWQnKVxyXG4gICAgICAgICAgICB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10cnVlXHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLm9uQWN0aW9uID0gKCk9PnRoaXMuc3RhcnRTZWxlY3RlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9hdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uPW5ldyBBY3Rpb248Ym9vbGVhbj4oXCJBdXRvcGxheSBvbiBzZWxlY3RcIixmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b3BBY3Rpb24gPSBuZXcgQWN0aW9uKCdTdG9wJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9wQWN0aW9uLm9uQWN0aW9uID0gKCk9PnRoaXMuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHN0YXJ0QWN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRBY3Rpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgc3RhcnRTZWxlY3Rpb25BY3Rpb24oKXtcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHN0b3BBY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdG9wQWN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0IGF1ZGlvQ2xpcChhdWRpb0NsaXA6QXVkaW9DbGlwfCBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgbGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgbGV0IGNocyA9IDA7XHJcbiAgICAgICAgICAgIGlmIChhdWRpb0NsaXAgJiYgYXVkaW9DbGlwLmF1ZGlvRGF0YUhvbGRlcikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGF1ZGlvRGF0YUhvbGRlcj1hdWRpb0NsaXAuYXVkaW9EYXRhSG9sZGVyO1xyXG4gICAgICAgICAgICAgICAgY2hzID0gYXVkaW9EYXRhSG9sZGVyLm51bWJlck9mQ2hhbm5lbHNcclxuICAgICAgICAgICAgICAgIGlmIChjaHMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gYXVkaW9EYXRhSG9sZGVyLmZyYW1lTGVuO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHMgPiB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24ubWF4Q2hhbm5lbENvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gZXhjZXB0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoYXVkaW9EYXRhSG9sZGVyLmJ1ZmZlcil7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9CdWZmZXIgPSBhdWRpb0RhdGFIb2xkZXIuYnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYoYXVkaW9EYXRhSG9sZGVyLmFycmF5QnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXJyYXlBdWRpb0J1ZmZlciA9IGF1ZGlvRGF0YUhvbGRlci5hcnJheUJ1ZmZlcjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhdWRpb0NsaXAuYWRkU2VsZWN0aW9uT2JzZXJ2ZXIoKGFjKT0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZCA9IHRoaXMuc3RhcnRTZWxlY3Rpb25EaXNhYmxlZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkICYmIHRoaXMuX2F1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb24udmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZCgpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hdWRpb0J1ZmZlcj1udWxsO1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLmFycmF5QXVkaW9CdWZmZXI9bnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fYXVkaW9DbGlwPWF1ZGlvQ2xpcFxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldCBhdWRpb0J1ZmZlcihhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlciB8IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2F1ZGlvQnVmZmVyID0gYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgICAgIHRoaXMuX2FycmF5QXVkaW9CdWZmZXI9bnVsbDtcclxuICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyICYmIHRoaXMuY29udGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkPXRoaXMuc3RhcnRTZWxlY3Rpb25EaXNhYmxlZCgpXHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLmxpc3RlbmVyKXtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmF1ZGlvUGxheWVyVXBkYXRlKG5ldyBBdWRpb1BsYXllckV2ZW50KEV2ZW50VHlwZS5SRUFEWSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkPXRydWVcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMubGlzdGVuZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuYXVkaW9QbGF5ZXJVcGRhdGUobmV3IEF1ZGlvUGxheWVyRXZlbnQoRXZlbnRUeXBlLkNMT1NFRCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdldCBhdWRpb0J1ZmZlcigpOkF1ZGlvQnVmZmVyfCBudWxse1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgc2V0IGFycmF5QXVkaW9CdWZmZXIoYXJyYXlBdWRpb0J1ZmZlcjpBcnJheUF1ZGlvQnVmZmVyIHwgbnVsbCkge1xyXG4gICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgIHRoaXMuX2F1ZGlvQnVmZmVyPW51bGw7XHJcbiAgICAgICAgdGhpcy5fYXJyYXlBdWRpb0J1ZmZlcj1hcnJheUF1ZGlvQnVmZmVyO1xyXG4gICAgICAgIGlmIChhcnJheUF1ZGlvQnVmZmVyICYmIHRoaXMuY29udGV4dCkge1xyXG5cclxuICAgICAgICAgIEF1ZGlvU291cmNlV29ya2xldE1vZHVsZUxvYWRlci5sb2FkTW9kdWxlKHRoaXMuY29udGV4dCkudGhlbigoKT0+e1xyXG5cclxuICAgICAgICAgIHRoaXMuX3N0YXJ0QWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10aGlzLnN0YXJ0U2VsZWN0aW9uRGlzYWJsZWQoKVxyXG4gICAgICAgICAgaWYodGhpcy5saXN0ZW5lcil7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuYXVkaW9QbGF5ZXJVcGRhdGUobmV3IEF1ZGlvUGxheWVyRXZlbnQoRXZlbnRUeXBlLlJFQURZKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyb3I6IGFueSk9PntcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10cnVlXHJcbiAgICAgICAgICAgIGlmKHRoaXMubGlzdGVuZXIpe1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuYXVkaW9QbGF5ZXJVcGRhdGUobmV3IEF1ZGlvUGxheWVyRXZlbnQoRXZlbnRUeXBlLkNMT1NFRCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgYWRkIG1vZHVsZSAnK2Vycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuX3N0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkPXRydWVcclxuICAgICAgICAgIGlmKHRoaXMubGlzdGVuZXIpe1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmF1ZGlvUGxheWVyVXBkYXRlKG5ldyBBdWRpb1BsYXllckV2ZW50KEV2ZW50VHlwZS5DTE9TRUQpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdldCBhcnJheUF1ZGlvQnVmZmVyKCk6QXJyYXlBdWRpb0J1ZmZlcnwgbnVsbHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXJyYXlBdWRpb0J1ZmZlcjtcclxuICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgIHN0YXJ0KCkge1xyXG4gICAgICAgICAgICBpZighdGhpcy5fc3RhcnRBY3Rpb24uZGlzYWJsZWQgJiYgIXRoaXMucnVubmluZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3VtZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuX2F1ZGlvQnVmZmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQnVmZmVyTm9kZSA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXJOb2RlLmJ1ZmZlciA9IHRoaXMuX2F1ZGlvQnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlck5vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlck5vZGUub25lbmRlZCA9ICgpID0+IHRoaXMub25lbmRlZCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5U3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlck5vZGUuc3RhcnQoKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5U3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkPXRydWVcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAvL3RoaXMudGltZXJWYXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKGUpPT50aGlzLnVwZGF0ZVBsYXlQb3NpdGlvbigpLCAyMDApO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuYXVkaW9QbGF5ZXJVcGRhdGUobmV3IEF1ZGlvUGxheWVyRXZlbnQoRXZlbnRUeXBlLlNUQVJURUQpKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5fYXJyYXlBdWRpb0J1ZmZlcil7XHJcbiAgICAgICAgICAgICAgICAgIGlmKHRoaXMuX2FycmF5QXVkaW9CdWZmZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZT1uZXcgQXJyYXlBdWRpb0J1ZmZlclNvdXJjZU5vZGUodGhpcy5jb250ZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZS5vbnByb2Nlc3NvcmVycm9yID0gKGV2OiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gJ1Vua253b24gZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYgaW5zdGFuY2VvZiBFcnJvckV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gZXYubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXVkaW8gc291cmNlIHdvcmtsZXQgZXJyb3I6IFwiICsgbXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5saXN0ZW5lci5lcnJvcihtc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMubGlzdGVuZXIuYXVkaW9QbGF5ZXJVcGRhdGUobmV3IEF1ZGlvUGxheWVyRXZlbnQoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUF1ZGlvV29ya2xldE5vZGUuYXJyYXlBdWRpb0J1ZmZlcj10aGlzLl9hcnJheUF1ZGlvQnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VBdWRpb1dvcmtsZXROb2RlLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTsgLy8gdGhpcyBhbHJlYWR5IHN0YXJ0cyBwbGF5aW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUF1ZGlvV29ya2xldE5vZGUub25lbmRlZCA9ICgpID0+IHRoaXMub25lbmRlZCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheVN0YXJ0VGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VBdWRpb1dvcmtsZXROb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlTdGFydFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdG9wQWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudChFdmVudFR5cGUuU1RBUlRFRCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3RhcnRTZWxlY3Rpb25EaXNhYmxlZCgpe1xyXG4gICAgICAgICAgcmV0dXJuICEodGhpcy5fYXVkaW9DbGlwICYmIHRoaXMuY29udGV4dCAmJiAhdGhpcy5zdGFydEFjdGlvbi5kaXNhYmxlZCAmJiB0aGlzLl9hdWRpb0NsaXAuc2VsZWN0aW9uIClcclxuICAgICAgICB9XHJcblxyXG4gICAgICBzdGFydFNlbGVjdGVkKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLl9zdGFydEFjdGlvbi5kaXNhYmxlZCAmJiAhdGhpcy5ydW5uaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHQucmVzdW1lKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fYXVkaW9CdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXJOb2RlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlck5vZGUuYnVmZmVyID0gdGhpcy5fYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlQnVmZmVyTm9kZS5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlQnVmZmVyTm9kZS5vbmVuZGVkID0gKCkgPT4gdGhpcy5vbmVuZGVkKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBsYXlTdGFydFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWU7XHJcbiAgICAgICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIC8vIHVuZm9ydHVuYXRlbHkgV2ViIEF1ZGlvIEFQSSB1c2VzIHRpbWUgdmFsdWVzIG5vdCBmcmFtZXNcclxuICAgICAgICAgICAgbGV0IGFjID0gdGhpcy5fYXVkaW9DbGlwXHJcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSAwXHJcbiAgICAgICAgICAgIGlmIChhYyAmJiBhYy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICBsZXQgcyA9IGFjLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICBsZXQgc3IgPSBhYy5hdWRpb0RhdGFIb2xkZXIuc2FtcGxlUmF0ZTtcclxuICAgICAgICAgICAgICBvZmZzZXQgPSBzLmxlZnRGcmFtZSAvIHNyO1xyXG4gICAgICAgICAgICAgIGxldCBzdG9wUG9zSW5zZWNzID0gcy5yaWdodEZyYW1lIC8gc3I7XHJcbiAgICAgICAgICAgICAgbGV0IGR1ciA9IHN0b3BQb3NJbnNlY3MgLSBvZmZzZXRcclxuICAgICAgICAgICAgICAvLyBUT0RPIGNoZWNrIHZhbGlkIHZhbHVlc1xyXG4gICAgICAgICAgICAgIHRoaXMuc291cmNlQnVmZmVyTm9kZS5zdGFydCgwLCBvZmZzZXQsIGR1cilcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXJOb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5wbGF5U3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lIC0gb2Zmc2V0O1xyXG4gICAgICAgICAgICB0aGlzLl9zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgICAgICB0aGlzLl9zdG9wQWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vdGhpcy50aW1lclZhciA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoZSk9PnRoaXMudXBkYXRlUGxheVBvc2l0aW9uKCksIDIwMCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudChFdmVudFR5cGUuU1RBUlRFRCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZSBpZih0aGlzLl9hcnJheUF1ZGlvQnVmZmVyKXtcclxuICAgICAgICAgICAgaWYodGhpcy5fYXJyYXlBdWRpb0J1ZmZlcikge1xyXG4gICAgICAgICAgICAgIGxldCBhYWJzbj1uZXcgQXJyYXlBdWRpb0J1ZmZlclNvdXJjZU5vZGUodGhpcy5jb250ZXh0KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZT1hYWJzbjtcclxuICAgICAgICAgICAgICAgIGFhYnNuLm9ucHJvY2Vzc29yZXJyb3IgPSAoZXY6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSAnVW5rbndvbiBlcnJvcic7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChldiBpbnN0YW5jZW9mIEVycm9yRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBtc2cgPSBldi5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdWRpbyBzb3VyY2Ugd29ya2xldCBlcnJvcjogXCIgKyBtc2cpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE9cclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmxpc3RlbmVyLmVycm9yKG1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudCgpKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGFhYnNuLmFycmF5QXVkaW9CdWZmZXI9dGhpcy5fYXJyYXlBdWRpb0J1ZmZlcjtcclxuICAgICAgICAgICAgICAgIGFhYnNuLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTsgLy8gdGhpcyBhbHJlYWR5IHN0YXJ0cyBwbGF5aW5nXHJcbiAgICAgICAgICAgICAgICBhYWJzbi5vbmVuZGVkID0gKCkgPT4gdGhpcy5vbmVuZGVkKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5U3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgYWMgPSB0aGlzLl9hdWRpb0NsaXBcclxuICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSAwXHJcbiAgICAgICAgICAgICAgICBpZiAoYWMgJiYgYWMuc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBzID0gYWMuc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc3IgPSBhYy5hdWRpb0RhdGFIb2xkZXIuc2FtcGxlUmF0ZTtcclxuICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcy5sZWZ0RnJhbWUgLyBzcjtcclxuICAgICAgICAgICAgICAgICAgbGV0IHN0b3BQb3NJbnNlY3MgPSBzLnJpZ2h0RnJhbWUgLyBzcjtcclxuICAgICAgICAgICAgICAgICAgbGV0IGR1ciA9IHN0b3BQb3NJbnNlY3MgLSBvZmZzZXRcclxuICAgICAgICAgICAgICAgICAgYWFic24uc3RhcnQoMCwgb2Zmc2V0LCBkdXIpXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBhYWJzbi5zdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wbGF5U3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lIC0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRTZWxlY3Rpb25BY3Rpb24uZGlzYWJsZWQ9dHJ1ZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RvcEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuYXVkaW9QbGF5ZXJVcGRhdGUobmV3IEF1ZGlvUGxheWVyRXZlbnQoRXZlbnRUeXBlLlNUQVJURUQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0b3AoKXtcclxuICAgICAgICAgICAgaWYodGhpcy5ydW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VCdWZmZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXJOb2RlLnN0b3AoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZSl7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZS5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpbWVyVmFyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50aW1lclZhcik7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudChFdmVudFR5cGUuU1RPUFBFRCkpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvbmVuZGVkKCkge1xyXG4gICAgICAgICAgICBpZih0aGlzLnRpbWVyVmFyIT1udWxsKSB7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyVmFyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9zdGFydEFjdGlvbi5kaXNhYmxlZCA9ICEodGhpcy5hdWRpb0J1ZmZlciB8fCB0aGlzLmFycmF5QXVkaW9CdWZmZXIpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10aGlzLnN0YXJ0U2VsZWN0aW9uRGlzYWJsZWQoKVxyXG4gICAgICAgICAgICB0aGlzLl9zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ydW5uaW5nPWZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudChFdmVudFR5cGUuRU5ERUQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHBsYXlQb3NpdGlvblRpbWUoKTpudW1iZXJ8bnVsbCB7XHJcbiAgICAgICAgICAgIGxldCBwcHQ9bnVsbDtcclxuICAgICAgICAgICAgaWYodGhpcy5wbGF5U3RhcnRUaW1lIT09bnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcHB0PSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLnBsYXlTdGFydFRpbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHBwdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICBnZXQgcGxheVBvc2l0aW9uRnJhbWVzKCk6bnVtYmVyfG51bGwge1xyXG4gICAgICAgIGxldCBwcEZyczpudW1iZXJ8bnVsbD1udWxsO1xyXG4gICAgICAgIGxldCBzcjpudW1iZXJ8bnVsbD1udWxsO1xyXG4gICAgICAgIGlmKHRoaXMuX2F1ZGlvQnVmZmVyICkge1xyXG4gICAgICAgICAgc3I9dGhpcy5fYXVkaW9CdWZmZXIuc2FtcGxlUmF0ZTtcclxuICAgICAgICB9ZWxzZSBpZih0aGlzLl9hcnJheUF1ZGlvQnVmZmVyKXtcclxuICAgICAgICAgIHNyPXRoaXMuX2FycmF5QXVkaW9CdWZmZXIuc2FtcGxlUmF0ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoc3IgKSB7XHJcbiAgICAgICAgICBsZXQgcHBUaW1lID0gdGhpcy5wbGF5UG9zaXRpb25UaW1lO1xyXG4gICAgICAgICAgaWYocHBUaW1lIT09bnVsbCkge1xyXG4gICAgICAgICAgICBwcEZycyA9IHNyICogcHBUaW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHBGcnM7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4iXX0=
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3BsYXliYWNrL3BsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFFNUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFDcEYsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFFaEYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxpQkFBaUIsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBSWhFLE1BQU0sQ0FBTixJQUFhLFNBQWlFO0FBQTlFLFdBQWEsU0FBUztJQUFFLDZDQUFNLENBQUE7SUFBQywyQ0FBSyxDQUFBO0lBQUMsK0NBQU8sQ0FBQTtJQUFDLHFEQUFVLENBQUE7SUFBRSwrQ0FBTyxDQUFBO0lBQUUsMkNBQUssQ0FBQTtJQUFDLDJDQUFLLENBQUE7QUFBQSxDQUFDLEVBQWpFLFNBQVMsS0FBVCxTQUFTLFFBQXdEO0FBRTlFLE1BQU0sT0FBTyxnQkFBZ0I7SUFLekIsWUFBWSxJQUFjLEVBQUUsWUFBb0I7UUFDNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksSUFB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SUFBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUM7WUFDbkMsR0FBRyxHQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQztTQUNsRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVILElBQUksa0JBQWtCO1FBQ3BCLElBQUksS0FBSyxHQUFhLElBQUksQ0FBQztRQUM1QixJQUFHLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsSUFBSSxFQUFFLEdBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDcEMsSUFBSSxFQUFFLEVBQUU7Z0JBQ04sSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2dCQUNuQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7b0JBQ25CLEtBQUssR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO2lCQUNyQjthQUNGO1NBQ0Y7UUFDQSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O0FBdldlLDJCQUFlLEdBQVUsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnLi4vLi4vYWN0aW9uL2FjdGlvbidcclxuaW1wb3J0IHsgQXVkaW9DbGlwIH0gZnJvbSAnLi4vcGVyc2lzdG9yJ1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJ9IGZyb20gXCIuLi9hcnJheV9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtBcnJheUF1ZGlvQnVmZmVyU291cmNlTm9kZX0gZnJvbSBcIi4vYXJyYXlfYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlXCI7XHJcbmltcG9ydCB7SW5kZXhlZERiQXVkaW9CdWZmZXJ9IGZyb20gXCIuLi9pbmRkYl9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtBdWRpb1NvdXJjZVdvcmtsZXRNb2R1bGVMb2FkZXJ9IGZyb20gXCIuL2F1ZGlvX3NvdXJjZV93b3JrbGV0X21vZHVsZV9sb2FkZXJcIjtcclxuaW1wb3J0IHtJbmRleGVkRGJBdWRpb0J1ZmZlclNvdXJjZU5vZGV9IGZyb20gXCIuL2luZGRiX2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZVwiO1xyXG5pbXBvcnQge0F1ZGlvU291cmNlTm9kZX0gZnJvbSBcIi4vYXVkaW9fc291cmNlX25vZGVcIjtcclxuaW1wb3J0IHtOZXRBdWRpb0J1ZmZlcn0gZnJvbSBcIi4uL25ldF9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtOZXRBdWRpb0J1ZmZlclNvdXJjZU5vZGV9IGZyb20gXCIuL25ldF9hdWRpb19idWZmZXJfc291cmNlX25vZGVcIjtcclxuaW1wb3J0IHtBdWRpb0J1ZmZlclNvdXJjZSwgQXVkaW9Tb3VyY2V9IGZyb20gXCIuLi9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5cclxuXHJcblxyXG4gICAgZXhwb3J0IGVudW0gIEV2ZW50VHlwZSB7Q0xPU0VELFJFQURZLFNUQVJURUQsUE9TX1VQREFURSwgU1RPUFBFRCwgRU5ERUQsRVJST1J9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIEF1ZGlvUGxheWVyRXZlbnR7XHJcblxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3R5cGU6RXZlbnRUeXBlO1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3RpbWVQb3NpdGlvbjpudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGNvbnN0cnVjdG9yKHR5cGU6RXZlbnRUeXBlLCB0aW1lUG9zaXRpb24/Om51bWJlcikge1xyXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gdHlwZTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZVBvc2l0aW9uID0gdGltZVBvc2l0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHR5cGUoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHRpbWVQb3NpdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVQb3NpdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEF1ZGlvUGxheWVyTGlzdGVuZXIge1xyXG4gICAgICAgIGF1ZGlvUGxheWVyVXBkYXRlKGU6QXVkaW9QbGF5ZXJFdmVudCk6dm9pZDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgQXVkaW9QbGF5ZXIge1xyXG5cclxuICAgICAgICBnZXQgYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbigpOiBBY3Rpb248Ym9vbGVhbj4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHVibGljIHN0YXRpYyBERUZBVUxUX0JVRlNJWkU6bnVtYmVyID0gODE5MjtcclxuICAgICAgICBwcml2YXRlIHJ1bm5pbmc9ZmFsc2U7XHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfc3RhcnRBY3Rpb246QWN0aW9uPHZvaWQ+O1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3N0YXJ0U2VsZWN0aW9uQWN0aW9uOkFjdGlvbjx2b2lkPjtcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9hdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uOkFjdGlvbjxib29sZWFuPlxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3N0b3BBY3Rpb246QWN0aW9uPHZvaWQ+O1xyXG4gICAgICAgIGJ1ZlNpemU6bnVtYmVyO1xyXG4gICAgICAgIGNvbnRleHQ6QXVkaW9Db250ZXh0O1xyXG4gICAgICAgIHJlYWR5PWZhbHNlO1xyXG4gICAgICAgIGxpc3RlbmVyOkF1ZGlvUGxheWVyTGlzdGVuZXI7XHJcbiAgICAgICAgX2F1ZGlvQ2xpcDpBdWRpb0NsaXB8bnVsbD1udWxsO1xyXG4gICAgICAgIHByaXZhdGUgX2F1ZGlvU291cmNlOkF1ZGlvU291cmNlfG51bGw9bnVsbDtcclxuICAgICAgICBzb3VyY2VCdWZmZXJOb2RlOkF1ZGlvQnVmZmVyU291cmNlTm9kZXxudWxsPW51bGw7XHJcbiAgICAgICAgc291cmNlQXVkaW9Xb3JrbGV0Tm9kZTpBdWRpb1NvdXJjZU5vZGV8bnVsbD1udWxsO1xyXG5cclxuICAgICAgICBidWZmUG9zOm51bWJlcjtcclxuICAgICAgICBwcml2YXRlIHplcm9CdWZDbnQ6bnVtYmVyO1xyXG4gICAgICAgIG46YW55O1xyXG4gICAgICAgIHpiOkZsb2F0MzJBcnJheTtcclxuICAgICAgICBwcml2YXRlIHBsYXlTdGFydFRpbWU6bnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSB0aW1lclZhcjpudW1iZXJ8bnVsbD1udWxsO1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OkF1ZGlvQ29udGV4dCwgbGlzdGVuZXI6QXVkaW9QbGF5ZXJMaXN0ZW5lcikge1xyXG4gICAgICAgICAgIHRoaXMuY29udGV4dD1jb250ZXh0O1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyPWxpc3RlbmVyO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZlNpemUgPSBBdWRpb1BsYXllci5ERUZBVUxUX0JVRlNJWkU7XHJcbiAgICAgICAgICAgIHRoaXMubj1uYXZpZ2F0b3I7XHJcbiAgICAgICAgICAgIHRoaXMuYnVmZlBvcz0wO1xyXG4gICAgICAgICAgICB0aGlzLnplcm9CdWZDbnQ9MDtcclxuICAgICAgICAgICAgdGhpcy56YiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5idWZTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRBY3Rpb24gPSBuZXcgQWN0aW9uKCdTdGFydCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0QWN0aW9uLm9uQWN0aW9uID0gKCk9PnRoaXMuc3RhcnQoKTtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRTZWxlY3Rpb25BY3Rpb249bmV3IEFjdGlvbignU3RhcnQgc2VsZWN0ZWQnKVxyXG4gICAgICAgICAgICB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10cnVlXHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLm9uQWN0aW9uID0gKCk9PnRoaXMuc3RhcnRTZWxlY3RlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9hdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uPW5ldyBBY3Rpb248Ym9vbGVhbj4oXCJBdXRvcGxheSBvbiBzZWxlY3RcIixmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b3BBY3Rpb24gPSBuZXcgQWN0aW9uKCdTdG9wJyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9wQWN0aW9uLm9uQWN0aW9uID0gKCk9PnRoaXMuc3RvcCgpO1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXRlY2hhbmdlJywgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYodGhpcy5jb250ZXh0LnN0YXRlIT09J3J1bm5pbmcnKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBzdGFydEFjdGlvbigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0QWN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHN0YXJ0U2VsZWN0aW9uQWN0aW9uKCl7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWxlY3Rpb25BY3Rpb25cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBzdG9wQWN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RvcEFjdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldCBhdWRpb0NsaXAoYXVkaW9DbGlwOkF1ZGlvQ2xpcHwgbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBjaHMgPSAwO1xyXG4gICAgICAgICAgICBpZiAoYXVkaW9DbGlwICYmIGF1ZGlvQ2xpcC5hdWRpb0RhdGFIb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhdWRpb0RhdGFIb2xkZXI9YXVkaW9DbGlwLmF1ZGlvRGF0YUhvbGRlcjtcclxuICAgICAgICAgICAgICAgIGNocyA9IGF1ZGlvRGF0YUhvbGRlci5udW1iZXJPZkNoYW5uZWxzXHJcbiAgICAgICAgICAgICAgICBpZiAoY2hzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGF1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hzID4gdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uLm1heENoYW5uZWxDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGV4Y2VwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Tb3VyY2U9YXVkaW9EYXRhSG9sZGVyLmF1ZGlvU291cmNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGF1ZGlvQ2xpcC5hZGRTZWxlY3Rpb25PYnNlcnZlcigoYWMpPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkID0gdGhpcy5zdGFydFNlbGVjdGlvbkRpc2FibGVkKClcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3RhcnRTZWxlY3Rpb25BY3Rpb24uZGlzYWJsZWQgJiYgdGhpcy5fYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvbi52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkKClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvU291cmNlPW51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuX2F1ZGlvQ2xpcD1hdWRpb0NsaXBcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgZ2V0IGF1ZGlvU291cmNlKCk6IEF1ZGlvU291cmNlIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1ZGlvU291cmNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzZXQgYXVkaW9Tb3VyY2UodmFsdWU6IEF1ZGlvU291cmNlIHwgbnVsbCkge1xyXG4gICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgIHRoaXMuX2F1ZGlvU291cmNlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9hdWRpb1NvdXJjZSAmJiB0aGlzLmNvbnRleHQpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fYXVkaW9Tb3VyY2UgaW5zdGFuY2VvZiBBdWRpb0J1ZmZlclNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXJ0QWN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudChFdmVudFR5cGUuUkVBRFkpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZFNvdXJjZVdvcmtsZXRBbmRJbml0U3RhcnQoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGFydEFjdGlvbnMoKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudChFdmVudFR5cGUuQ0xPU0VEKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBfbG9hZFNvdXJjZVdvcmtsZXRBbmRJbml0U3RhcnQoKXtcclxuICAgICAgICAgIEF1ZGlvU291cmNlV29ya2xldE1vZHVsZUxvYWRlci5sb2FkTW9kdWxlKHRoaXMuY29udGV4dCkudGhlbigoKT0+e1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJQbGF5ZXIgcmVhZHkuICggYnkgUGxheWVyOjpfbG9hZFNvdXJjZVdvcmtsZXRBbmRJbml0U3RhcnQoKVwiKTtcclxuICAgICAgICAgICAgdGhpcy5yZWFkeT10cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXJ0QWN0aW9ucygpO1xyXG4gICAgICAgICAgICBpZih0aGlzLmxpc3RlbmVyKXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmF1ZGlvUGxheWVyVXBkYXRlKG5ldyBBdWRpb1BsYXllckV2ZW50KEV2ZW50VHlwZS5SRUFEWSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyb3I6IGFueSk9PntcclxuICAgICAgICAgICAgdGhpcy5yZWFkeT1mYWxzZTtcclxuICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhcnRBY3Rpb25zKCk7XHJcbiAgICAgICAgICAgIGlmKHRoaXMubGlzdGVuZXIpe1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuYXVkaW9QbGF5ZXJVcGRhdGUobmV3IEF1ZGlvUGxheWVyRXZlbnQoRXZlbnRUeXBlLkNMT1NFRCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBhZGQgbW9kdWxlICcrZXJyb3IpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfc3RhcnRBdWRpb1NvdXJjZVdvcmtsZXROb2RlKCl7XHJcbiAgICAgICAgICBpZih0aGlzLnNvdXJjZUF1ZGlvV29ya2xldE5vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VBdWRpb1dvcmtsZXROb2RlLm9ucHJvY2Vzc29yZXJyb3IgPSAoZXY6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IG1zZyA9ICdVbmtud29uIGVycm9yJztcclxuICAgICAgICAgICAgICBpZiAoZXYgaW5zdGFuY2VvZiBFcnJvckV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICBtc2cgPSBldi5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXVkaW8gc291cmNlIHdvcmtsZXQgZXJyb3I6IFwiICsgbXNnKTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ET1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5saXN0ZW5lci5lcnJvcihtc2cpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudCgpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUF1ZGlvV29ya2xldE5vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pOyAvLyB0aGlzIGFscmVhZHkgc3RhcnRzIHBsYXlpbmdcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VBdWRpb1dvcmtsZXROb2RlLm9uZW5kZWQgPSAoKSA9PiB0aGlzLm9uZW5kZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VBdWRpb1dvcmtsZXROb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlBsYXliYWNrIHN0YXJ0IGFjdGlvbiBlbmFibGVkLiAoIGJ5IFBsYXllcjo6X3N0YXJ0QXVkaW9Tb3VyY2VXb3JrbGV0Tm9kZSgpXCIpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgICAgICB0aGlzLl9zdG9wQWN0aW9uLmRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuYXVkaW9QbGF5ZXJVcGRhdGUobmV3IEF1ZGlvUGxheWVyRXZlbnQoRXZlbnRUeXBlLlNUQVJURUQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICB9XHJcblxyXG4gICAgICAgIHN0YXJ0KCkge1xyXG4gICAgICAgICAgICBpZighdGhpcy5fc3RhcnRBY3Rpb24uZGlzYWJsZWQgJiYgIXRoaXMucnVubmluZykge1xyXG4gICAgICAgICAgICAgIGlmKHRoaXMuY29udGV4dC5zdGF0ZSE9PSdydW5uaW5nJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3VtZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgcmVzdW1lIGF1ZGlvIGNvbnRleHQ6ICcgKyByZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB1cGRhdGVTdGFydEFjdGlvbnMoKXtcclxuXHJcbiAgICAgICAgICBpZih0aGlzLnJlYWR5KXtcclxuICAgICAgICAgICAgaWYodGhpcy5fYXVkaW9Tb3VyY2UgaW5zdGFuY2VvZiBBdWRpb0J1ZmZlclNvdXJjZSB8fCB0aGlzLl9hdWRpb1NvdXJjZSBpbnN0YW5jZW9mIEFycmF5QXVkaW9CdWZmZXIgfHwgdGhpcy5fYXVkaW9Tb3VyY2UgaW5zdGFuY2VvZiBJbmRleGVkRGJBdWRpb0J1ZmZlcil7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc3RhcnRBY3Rpb24uZGlzYWJsZWQ9ZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc3RhcnRTZWxlY3Rpb25BY3Rpb24uZGlzYWJsZWQ9dGhpcy5zdGFydFNlbGVjdGlvbkRpc2FibGVkKCk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGlmKHRoaXMuX2F1ZGlvU291cmNlIGluc3RhbmNlb2YgTmV0QXVkaW9CdWZmZXIpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYXVkaW9Tb3VyY2UuYWRkT25SZWFkeUxpc3RlbmVyKCgpPT57XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0QWN0aW9uLmRpc2FibGVkPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10aGlzLnN0YXJ0U2VsZWN0aW9uRGlzYWJsZWQoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0QWN0aW9uLmRpc2FibGVkPXRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkPXRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdGFydFNlbGVjdGlvbkRpc2FibGVkKCl7XHJcbiAgICAgICAgICByZXR1cm4gISh0aGlzLl9hdWRpb0NsaXAgJiYgdGhpcy5jb250ZXh0ICYmICF0aGlzLnN0YXJ0QWN0aW9uLmRpc2FibGVkICYmIHRoaXMuX2F1ZGlvQ2xpcC5zZWxlY3Rpb24gKVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHByaXZhdGUgX3N0YXJ0KHBsYXlTZWxlY3Rpb249ZmFsc2Upe1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvU291cmNlIGluc3RhbmNlb2YgQXVkaW9CdWZmZXJTb3VyY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXJOb2RlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlck5vZGUuYnVmZmVyID0gdGhpcy5fYXVkaW9Tb3VyY2UuYXVkaW9CdWZmZXI7XHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlQnVmZmVyTm9kZS5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlQnVmZmVyTm9kZS5vbmVuZGVkID0gKCkgPT4gdGhpcy5vbmVuZGVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMucGxheVN0YXJ0VGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZTtcclxuICAgICAgICAgICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gdW5mb3J0dW5hdGVseSBXZWIgQXVkaW8gQVBJIHVzZXMgdGltZSB2YWx1ZXMgbm90IGZyYW1lc1xyXG4gICAgICAgICAgICBjb25zdCBhYyA9IHRoaXMuX2F1ZGlvQ2xpcFxyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgaWYgKHBsYXlTZWxlY3Rpb24gJiYgYWMgJiYgYWMuc2VsZWN0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHMgPSBhYy5zZWxlY3Rpb247XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3IgPSBhYy5hdWRpb0RhdGFIb2xkZXIuc2FtcGxlUmF0ZTtcclxuICAgICAgICAgICAgICBvZmZzZXQgPSBzLmxlZnRGcmFtZSAvIHNyO1xyXG4gICAgICAgICAgICAgIGNvbnN0IHN0b3BQb3NJbnNlY3MgPSBzLnJpZ2h0RnJhbWUgLyBzcjtcclxuICAgICAgICAgICAgICBjb25zdCBkdXIgPSBzdG9wUG9zSW5zZWNzIC0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgIHRoaXMuc291cmNlQnVmZmVyTm9kZS5zdGFydCgwLCBvZmZzZXQsIGR1cilcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlck5vZGUuc3RhcnQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnBsYXlTdGFydFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSBvZmZzZXQ7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnRTZWxlY3Rpb25BY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgICAgIHRoaXMuX3N0b3BBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudChFdmVudFR5cGUuU1RBUlRFRCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2F1ZGlvU291cmNlIGluc3RhbmNlb2YgQXJyYXlBdWRpb0J1ZmZlciB8fCB0aGlzLl9hdWRpb1NvdXJjZSBpbnN0YW5jZW9mIEluZGV4ZWREYkF1ZGlvQnVmZmVyIHx8IHRoaXMuX2F1ZGlvU291cmNlIGluc3RhbmNlb2YgTmV0QXVkaW9CdWZmZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5wbGF5U3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvU291cmNlIGluc3RhbmNlb2YgQXJyYXlBdWRpb0J1ZmZlcikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGFhYnNuID0gbmV3IEFycmF5QXVkaW9CdWZmZXJTb3VyY2VOb2RlKHRoaXMuY29udGV4dCk7XHJcbiAgICAgICAgICAgICAgYWFic24uYXJyYXlBdWRpb0J1ZmZlciA9IHRoaXMuX2F1ZGlvU291cmNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZSA9IGFhYnNuO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2F1ZGlvU291cmNlIGluc3RhbmNlb2YgSW5kZXhlZERiQXVkaW9CdWZmZXIpIHtcclxuICAgICAgICAgICAgICBjb25zdCBpYXNuID0gbmV3IEluZGV4ZWREYkF1ZGlvQnVmZmVyU291cmNlTm9kZSh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgICAgICAgIGlhc24uaW5kZGJBdWRpb0J1ZmZlciA9IHRoaXMuX2F1ZGlvU291cmNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZSA9IGlhc247XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYXVkaW9Tb3VyY2UgaW5zdGFuY2VvZiBOZXRBdWRpb0J1ZmZlcikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG5hYnNuID0gbmV3IE5ldEF1ZGlvQnVmZmVyU291cmNlTm9kZSh0aGlzLmNvbnRleHQpO1xyXG4gICAgICAgICAgICAgIG5hYnNuLm5ldEF1ZGlvQnVmZmVyID0gdGhpcy5fYXVkaW9Tb3VyY2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5zb3VyY2VBdWRpb1dvcmtsZXROb2RlID0gbmFic247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZS5vbnByb2Nlc3NvcmVycm9yID0gKGV2OiBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9ICdVbmtud29uIGVycm9yJztcclxuICAgICAgICAgICAgICAgIGlmIChldiBpbnN0YW5jZW9mIEVycm9yRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgbXNnID0gZXYubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdWRpbyBzb3VyY2Ugd29ya2xldCBlcnJvcjogXCIgKyBtc2cpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudChFdmVudFR5cGUuRVJST1IpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnNvdXJjZUF1ZGlvV29ya2xldE5vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pOyAvLyB0aGlzIGFscmVhZHkgc3RhcnRzIHBsYXlpbmdcclxuICAgICAgICAgICAgICB0aGlzLnNvdXJjZUF1ZGlvV29ya2xldE5vZGUub25lbmRlZCA9ICgpID0+IHRoaXMub25lbmRlZCgpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBhYyA9IHRoaXMuX2F1ZGlvQ2xpcFxyXG4gICAgICAgICAgICAgIGxldCBvZmZzZXQgPSAwXHJcbiAgICAgICAgICAgICAgaWYgKHBsYXlTZWxlY3Rpb24gJiYgYWMgJiYgYWMuc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gYWMuc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3IgPSBhYy5hdWRpb0RhdGFIb2xkZXIuc2FtcGxlUmF0ZTtcclxuICAgICAgICAgICAgICAgIG9mZnNldCA9IHMubGVmdEZyYW1lIC8gc3I7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9wUG9zSW5zZWNzID0gcy5yaWdodEZyYW1lIC8gc3I7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkdXIgPSBzdG9wUG9zSW5zZWNzIC0gb2Zmc2V0XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUF1ZGlvV29ya2xldE5vZGUuc3RhcnQoMCwgb2Zmc2V0LCBkdXIpXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZS5zdGFydCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy90aGlzLnBsYXlTdGFydFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3N0YXJ0U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgICAgICAgIHRoaXMuX3N0b3BBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuYXVkaW9QbGF5ZXJVcGRhdGUobmV3IEF1ZGlvUGxheWVyRXZlbnQoRXZlbnRUeXBlLlNUQVJURUQpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICBzdGFydFNlbGVjdGVkKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLl9zdGFydEFjdGlvbi5kaXNhYmxlZCAmJiAhdGhpcy5ydW5uaW5nKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0YXRlICE9PSAncnVubmluZycpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3VtZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KHRydWUpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IHJlc3VtZSBhdWRpbyBjb250ZXh0OiAnICsgcmVhc29uKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLl9zdGFydCh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICAgc3RvcCgpe1xyXG4gICAgICAgICAgICBpZih0aGlzLnJ1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUJ1ZmZlck5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlck5vZGUuc3RvcCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zb3VyY2VBdWRpb1dvcmtsZXROb2RlKXtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VBdWRpb1dvcmtsZXROb2RlLnN0b3AoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGltZXJWYXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyVmFyKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmF1ZGlvUGxheWVyVXBkYXRlKG5ldyBBdWRpb1BsYXllckV2ZW50KEV2ZW50VHlwZS5TVE9QUEVEKSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9uZW5kZWQoKSB7XHJcbiAgICAgICAgICAgIGlmKHRoaXMudGltZXJWYXIhPW51bGwpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudGltZXJWYXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0QWN0aW9uLmRpc2FibGVkID0gIXRoaXMuX2F1ZGlvU291cmNlO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGFydFNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10aGlzLnN0YXJ0U2VsZWN0aW9uRGlzYWJsZWQoKVxyXG4gICAgICAgICAgICB0aGlzLl9zdG9wQWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5ydW5uaW5nPWZhbHNlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5hdWRpb1BsYXllclVwZGF0ZShuZXcgQXVkaW9QbGF5ZXJFdmVudChFdmVudFR5cGUuRU5ERUQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHBsYXlQb3NpdGlvblRpbWUoKTpudW1iZXJ8bnVsbCB7XHJcbiAgICAgICAgICAgIGxldCBwcHQ9bnVsbDtcclxuICAgICAgICAgICAgaWYodGhpcy5wbGF5U3RhcnRUaW1lIT09bnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcHB0PSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLnBsYXlTdGFydFRpbWU7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZSl7XHJcbiAgICAgICAgICAgICAgcHB0PXRoaXMuc291cmNlQXVkaW9Xb3JrbGV0Tm9kZS5wbGF5UG9zaXRpb25UaW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBwcHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgZ2V0IHBsYXlQb3NpdGlvbkZyYW1lcygpOm51bWJlcnxudWxsIHtcclxuICAgICAgICBsZXQgcHBGcnM6bnVtYmVyfG51bGw9bnVsbDtcclxuICAgICAgIGlmKHRoaXMuX2F1ZGlvU291cmNlKSB7XHJcbiAgICAgICAgIGxldCBzcj10aGlzLl9hdWRpb1NvdXJjZS5zYW1wbGVSYXRlO1xyXG4gICAgICAgICBpZiAoc3IpIHtcclxuICAgICAgICAgICBsZXQgcHBUaW1lID0gdGhpcy5wbGF5UG9zaXRpb25UaW1lO1xyXG4gICAgICAgICAgIGlmIChwcFRpbWUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgIHBwRnJzID0gc3IgKiBwcFRpbWU7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICB9XHJcbiAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBwRnJzO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuIl19