speechrecorderng 2.21.4 → 2.22.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 (111) hide show
  1. package/{esm2015/lib/action/action.js → esm2020/lib/action/action.mjs} +0 -0
  2. package/{esm2015/lib/audio/audio_display.js → esm2020/lib/audio/audio_display.mjs} +5 -5
  3. package/esm2020/lib/audio/audio_player.mjs +276 -0
  4. package/esm2020/lib/audio/capture/capture.mjs +547 -0
  5. package/{esm2015/lib/audio/context.js → esm2020/lib/audio/context.mjs} +0 -0
  6. package/esm2020/lib/audio/dsp/level_measure.mjs +351 -0
  7. package/{esm2015/lib/audio/format.js → esm2020/lib/audio/format.mjs} +0 -0
  8. package/{esm2015/lib/audio/impl/wavformat.js → esm2020/lib/audio/impl/wavformat.mjs} +0 -0
  9. package/{esm2015/lib/audio/impl/wavwriter.js → esm2020/lib/audio/impl/wavwriter.mjs} +0 -0
  10. package/{esm2015/lib/audio/io/stream.js → esm2020/lib/audio/io/stream.mjs} +0 -0
  11. package/{esm2015/lib/audio/persistor.js → esm2020/lib/audio/persistor.mjs} +0 -0
  12. package/{esm2015/lib/audio/playback/player.js → esm2020/lib/audio/playback/player.mjs} +0 -0
  13. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +376 -0
  14. package/{esm2015/lib/audio/ui/audio_display_control.js → esm2020/lib/audio/ui/audio_display_control.mjs} +5 -5
  15. package/{esm2015/lib/audio/ui/audio_display_scroll_pane.js → esm2020/lib/audio/ui/audio_display_scroll_pane.mjs} +5 -5
  16. package/{esm2015/lib/audio/ui/audiosignal.js → esm2020/lib/audio/ui/audiosignal.mjs} +5 -5
  17. package/{esm2015/lib/audio/ui/common.js → esm2020/lib/audio/ui/common.mjs} +0 -0
  18. package/esm2020/lib/audio/ui/container.mjs +431 -0
  19. package/{esm2015/lib/audio/ui/livelevel.js → esm2020/lib/audio/ui/livelevel.mjs} +5 -5
  20. package/{esm2015/lib/audio/ui/scroll_pane_horizontal.js → esm2020/lib/audio/ui/scroll_pane_horizontal.mjs} +4 -4
  21. package/{esm2015/lib/audio/ui/sonagram.js → esm2020/lib/audio/ui/sonagram.mjs} +5 -5
  22. package/{esm2015/lib/dsp/utils.js → esm2020/lib/dsp/utils.mjs} +0 -0
  23. package/{esm2015/lib/io/BinaryWriter.js → esm2020/lib/io/BinaryWriter.mjs} +0 -0
  24. package/{esm2015/lib/io/stream.js → esm2020/lib/io/stream.mjs} +0 -0
  25. package/{esm2015/lib/math/2d/geometry.js → esm2020/lib/math/2d/geometry.mjs} +0 -0
  26. package/{esm2015/lib/math/complex.js → esm2020/lib/math/complex.mjs} +0 -0
  27. package/{esm2015/lib/math/dft.js → esm2020/lib/math/dft.mjs} +0 -0
  28. package/{esm2015/lib/math/utils.js → esm2020/lib/math/utils.mjs} +0 -0
  29. package/esm2020/lib/media/utils.mjs +14 -0
  30. package/esm2020/lib/net/uploader.mjs +246 -0
  31. package/{esm2015/lib/speechrecorder/project/project.js → esm2020/lib/speechrecorder/project/project.mjs} +0 -0
  32. package/{esm2015/lib/speechrecorder/project/project.service.js → esm2020/lib/speechrecorder/project/project.service.mjs} +4 -4
  33. package/esm2020/lib/speechrecorder/recording.mjs +54 -0
  34. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +246 -0
  35. package/{esm2015/lib/speechrecorder/script/script.js → esm2020/lib/speechrecorder/script/script.mjs} +2 -2
  36. package/{esm2015/lib/speechrecorder/script/script.service.js → esm2020/lib/speechrecorder/script/script.service.mjs} +4 -4
  37. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +1144 -0
  38. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +449 -0
  39. package/{esm2015/lib/speechrecorder/session/item.js → esm2020/lib/speechrecorder/session/item.mjs} +1 -1
  40. package/{esm2015/lib/speechrecorder/session/progress.js → esm2020/lib/speechrecorder/session/progress.mjs} +5 -5
  41. package/{esm2015/lib/speechrecorder/session/prompting.js → esm2020/lib/speechrecorder/session/prompting.mjs} +21 -21
  42. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +75 -0
  43. package/esm2020/lib/speechrecorder/session/recording_list.mjs +109 -0
  44. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +126 -0
  45. package/{esm2015/lib/speechrecorder/session/recordingfile/recording-file-navi.component.js → esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs} +5 -5
  46. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +168 -0
  47. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +415 -0
  48. package/{esm2015/lib/speechrecorder/session/recordingfile/recording-file.js → esm2020/lib/speechrecorder/session/recordingfile/recording-file.mjs} +1 -1
  49. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +251 -0
  50. package/{esm2015/lib/speechrecorder/session/session.js → esm2020/lib/speechrecorder/session/session.mjs} +0 -0
  51. package/{esm2015/lib/speechrecorder/session/session.service.js → esm2020/lib/speechrecorder/session/session.service.mjs} +4 -4
  52. package/{esm2015/lib/speechrecorder/session/session_finished_dialog.js → esm2020/lib/speechrecorder/session/session_finished_dialog.mjs} +4 -4
  53. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +1274 -0
  54. package/{esm2015/lib/speechrecorder/session/warning_bar.js → esm2020/lib/speechrecorder/session/warning_bar.mjs} +5 -5
  55. package/{esm2015/lib/speechrecorder/spruploader.js → esm2020/lib/speechrecorder/spruploader.mjs} +4 -4
  56. package/{esm2015/lib/speechrecorder/startstopsignal/startstopsignal.js → esm2020/lib/speechrecorder/startstopsignal/startstopsignal.mjs} +0 -0
  57. package/{esm2015/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.js → esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs} +5 -5
  58. package/esm2020/lib/speechrecorderng.component.mjs +427 -0
  59. package/{esm2015/lib/speechrecorderng.module.js → esm2020/lib/speechrecorderng.module.mjs} +12 -11
  60. package/{esm2015/lib/spr.config.js → esm2020/lib/spr.config.mjs} +4 -4
  61. package/{esm2015/lib/spr.module.version.js → esm2020/lib/spr.module.version.mjs} +2 -2
  62. package/{esm2015/lib/ui/canvas_layer_comp.js → esm2020/lib/ui/canvas_layer_comp.mjs} +4 -4
  63. package/{esm2015/lib/ui/message_dialog.js → esm2020/lib/ui/message_dialog.mjs} +4 -4
  64. package/{esm2015/lib/ui/recordingitem_display.js → esm2020/lib/ui/recordingitem_display.mjs} +9 -9
  65. package/{esm2015/lib/utils/css_utils.js → esm2020/lib/utils/css_utils.mjs} +0 -0
  66. package/{esm2015/lib/utils/scrollIntoViewToBottom.js → esm2020/lib/utils/scrollIntoViewToBottom.mjs} +4 -4
  67. package/{esm2015/lib/utils/ua-parser.js → esm2020/lib/utils/ua-parser.mjs} +0 -0
  68. package/{esm2015/lib/utils/utils.js → esm2020/lib/utils/utils.mjs} +0 -0
  69. package/esm2020/public-api.mjs +31 -0
  70. package/{esm2015/speechrecorderng.js → esm2020/speechrecorderng.mjs} +0 -0
  71. package/fesm2015/speechrecorderng.mjs +11991 -0
  72. package/fesm2015/speechrecorderng.mjs.map +1 -0
  73. package/{fesm2015/speechrecorderng.js → fesm2020/speechrecorderng.mjs} +1863 -285
  74. package/fesm2020/speechrecorderng.mjs.map +1 -0
  75. package/lib/media/utils.d.ts +3 -0
  76. package/lib/net/uploader.d.ts +4 -2
  77. package/lib/speechrecorder/recording.d.ts +14 -3
  78. package/lib/speechrecorder/recordings/recordings.service.d.ts +12 -5
  79. package/lib/speechrecorder/session/audiorecorder.d.ts +150 -0
  80. package/lib/speechrecorder/session/controlpanel.d.ts +2 -1
  81. package/lib/speechrecorder/session/item.d.ts +2 -2
  82. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +26 -0
  83. package/lib/speechrecorder/session/recording_list.d.ts +19 -0
  84. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +6 -2
  85. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +5 -4
  86. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +2 -2
  87. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +5 -3
  88. package/lib/speechrecorder/session/sessionmanager.d.ts +5 -5
  89. package/lib/speechrecorderng.module.d.ts +31 -28
  90. package/lib/spr.module.version.d.ts +1 -1
  91. package/package.json +33 -20
  92. package/public-api.d.ts +2 -1
  93. package/bundles/speechrecorderng.umd.js +0 -10146
  94. package/bundles/speechrecorderng.umd.js.map +0 -1
  95. package/esm2015/lib/audio/audio_player.js +0 -274
  96. package/esm2015/lib/audio/capture/capture.js +0 -544
  97. package/esm2015/lib/audio/dsp/level_measure.js +0 -356
  98. package/esm2015/lib/audio/ui/audio_canvas_layer_comp.js +0 -364
  99. package/esm2015/lib/audio/ui/container.js +0 -412
  100. package/esm2015/lib/net/uploader.js +0 -220
  101. package/esm2015/lib/speechrecorder/recording.js +0 -38
  102. package/esm2015/lib/speechrecorder/recordings/recordings.service.js +0 -173
  103. package/esm2015/lib/speechrecorder/session/controlpanel.js +0 -446
  104. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-meta.component.js +0 -83
  105. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.js +0 -163
  106. package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-view.component.js +0 -386
  107. package/esm2015/lib/speechrecorder/session/recordingfile/recordingfile-service.js +0 -191
  108. package/esm2015/lib/speechrecorder/session/sessionmanager.js +0 -1271
  109. package/esm2015/lib/speechrecorderng.component.js +0 -423
  110. package/esm2015/public-api.js +0 -30
  111. package/fesm2015/speechrecorderng.js.map +0 -1
@@ -0,0 +1,431 @@
1
+ import { HostListener, Input, Output, EventEmitter } from '@angular/core';
2
+ import { AudioSignal } from './audiosignal';
3
+ import { Sonagram } from './sonagram';
4
+ import { Point } from './common';
5
+ import { Component, ViewChild } from '@angular/core';
6
+ import { Position, Dimension, Rectangle } from "../../math/2d/geometry";
7
+ import { BasicAudioCanvasLayerComponent } from "./audio_canvas_layer_comp";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./audiosignal";
10
+ import * as i2 from "./sonagram";
11
+ ;
12
+ ;
13
+ // // Declare Resizeobserver
14
+ // declare class ResizeObserver{
15
+ // constructor(callback: ResizeObserverCallback);
16
+ // observe: (el:Element,opts: ResizeObserverBoxOptions | null)=>void;
17
+ // unobserve: (el:Element)=>void;
18
+ // disconnect: ()=>void;
19
+ // }
20
+ /*
21
+ * Container component for audio display.
22
+ * The display elements are children of a virtual canvas. The virtual canvas makes it possible to have high zoom factors with very wide virtual audio displays.
23
+ * Only the visible part of the virtual canvas is implemented as a browser canvas and therefore consuming memory.
24
+ * The visible part has the same width as the viewport of the scroll pane parent.
25
+ * The virtual canvas itself is implemented as a HTML div element.
26
+ * The layout of the component is updated on resize of the parent or changes of the zoom factor.
27
+ */
28
+ export class AudioClipUIContainer extends BasicAudioCanvasLayerComponent {
29
+ constructor(ref) {
30
+ super();
31
+ this.ref = ref;
32
+ this._audioClip = null;
33
+ this.pointer = null;
34
+ this.selecting = null;
35
+ this.selection = null;
36
+ this.selectionEventEmitter = new EventEmitter();
37
+ this._playFramePosition = null;
38
+ this.dragStartMouseY = null;
39
+ this.dragStartY = null;
40
+ this.dividerPosition = 0.5;
41
+ this.userAction = false;
42
+ this._xZoom = null; // pixels per second
43
+ // if true the complete audio file is shown, the display fits to the visible panel, the x-zoom factor is variable, this is the default
44
+ this._fixFitToPanel = true;
45
+ this.parentE = this.ref.nativeElement;
46
+ }
47
+ get xZoom() {
48
+ return this._xZoom;
49
+ }
50
+ set xZoom(value) {
51
+ this.userAction = true;
52
+ this._xZoom = value;
53
+ this.layout();
54
+ this.userAction = false;
55
+ }
56
+ set fixFitToPanel(value) {
57
+ this._fixFitToPanel = value;
58
+ if (value) {
59
+ // we don't need clip bounds
60
+ this.bounds = null;
61
+ this._xZoom = null;
62
+ }
63
+ else {
64
+ // hold current zoom value
65
+ //this._xZoom=this.ce.offsetWidth/this._audioData.duration;
66
+ }
67
+ this.layout();
68
+ }
69
+ ngOnInit() {
70
+ this.ce = this.ceRef.nativeElement;
71
+ this.dc = this.canvasRef.nativeElement;
72
+ }
73
+ ngAfterViewInit() {
74
+ this.layout();
75
+ let heightListener = new MutationObserver((mrs, mo) => {
76
+ let layout = false;
77
+ mrs.forEach((mr) => {
78
+ if (!this.userAction && 'attributes' === mr.type && ('class' === mr.attributeName || 'style' === mr.attributeName)) {
79
+ layout = true;
80
+ }
81
+ });
82
+ if (layout) {
83
+ // re-layout required
84
+ this.layout(false);
85
+ }
86
+ });
87
+ heightListener.observe(this.ce, { attributes: true, childList: true, characterData: true });
88
+ heightListener.observe(this.dc, { attributes: true, childList: true, characterData: true });
89
+ let resizeObserver = new ResizeObserver((entries, obs) => {
90
+ //console.log("Resize observed:");
91
+ entries.forEach((e) => {
92
+ //console.log(e.contentRect.width+"x"+e.contentRect.height);
93
+ this.layout();
94
+ });
95
+ });
96
+ resizeObserver.observe(this.ce);
97
+ }
98
+ onResize(event) {
99
+ this.layout();
100
+ }
101
+ mouseover(me) {
102
+ this.dividerCursorPosition(me, true);
103
+ }
104
+ mouseleave(me) {
105
+ this.dividerCursorPosition(me, false);
106
+ }
107
+ mousedown(me) {
108
+ this.dragStartMouseY = me.clientY;
109
+ this.dragStartY = this.dc.offsetTop;
110
+ this.dragStartMouseY = me.clientY;
111
+ }
112
+ onMouseup(me) {
113
+ if (this.dragStartY != null) {
114
+ this.userAction = true;
115
+ this.dividerDrag(me);
116
+ this.layout(false);
117
+ this.dragStartY = null;
118
+ this.userAction = false;
119
+ }
120
+ }
121
+ onMousemove(me) {
122
+ if (this.dragStartY != null) {
123
+ this.userAction = true;
124
+ this.dividerDrag(me);
125
+ this.layoutScaled();
126
+ this.userAction = true;
127
+ }
128
+ }
129
+ pointerPositionChanged(pp) {
130
+ this.pointer = pp;
131
+ }
132
+ selectingChanged(s) {
133
+ this.selecting = s;
134
+ }
135
+ selectionChanged(s) {
136
+ this.selection = s;
137
+ if (this._audioClip) {
138
+ this._audioClip.selection = s;
139
+ }
140
+ this.selectionEventEmitter.emit(this.selection);
141
+ }
142
+ canvasMousePos(c, e) {
143
+ const cr = c.getBoundingClientRect();
144
+ const x = e.x - cr.left;
145
+ const y = e.y - cr.top;
146
+ return new Point(x, y);
147
+ }
148
+ dividerCursorPosition(e, show) {
149
+ if (this.dc) {
150
+ const w = this.dc.width;
151
+ const h = this.dc.height;
152
+ const g = this.dc.getContext('2d');
153
+ const pp = this.canvasMousePos(this.dc, e);
154
+ const offX = e.offsetX - this.dc.offsetLeft;
155
+ const offY = e.offsetY - this.dc.offsetTop;
156
+ }
157
+ }
158
+ dividerDrag(e) {
159
+ if (this.dc && this.dragStartMouseY && this.dragStartY) {
160
+ const dragOffset = e.clientY - this.dragStartMouseY;
161
+ const ceHeight = this.ce.offsetHeight;
162
+ let newTop = (this.dragStartY + dragOffset);
163
+ if (newTop < 0) {
164
+ newTop = 0;
165
+ }
166
+ if (newTop > ceHeight - AudioClipUIContainer.DIVIDER_PIXEL_SIZE) {
167
+ newTop = ceHeight - AudioClipUIContainer.DIVIDER_PIXEL_SIZE;
168
+ }
169
+ this.dc.style.top = newTop.toString() + 'px';
170
+ this.dividerPosition = (this.dc.offsetTop + AudioClipUIContainer.DIVIDER_PIXEL_SIZE / 2) / ceHeight;
171
+ if (this.dividerPosition > 1.0) {
172
+ this.dividerPosition = 1.0;
173
+ }
174
+ if (this.dividerPosition < 0.0) {
175
+ this.dividerPosition = 0.0;
176
+ }
177
+ this.drawDivider();
178
+ }
179
+ }
180
+ drawDivider() {
181
+ const w = this.dc.width;
182
+ const h = this.dc.height;
183
+ const g = this.dc.getContext('2d');
184
+ if (g && w > 10 && h >= 1) {
185
+ g.fillStyle = 'white';
186
+ g.fillRect(0, 0, w, h);
187
+ g.fillStyle = 'black';
188
+ g.fillRect(5, 5, w - 10, 1);
189
+ }
190
+ }
191
+ clipBounds(clipBounds) {
192
+ this.bounds = clipBounds;
193
+ this.layout();
194
+ }
195
+ currentXZoom() {
196
+ let xz = this._xZoom;
197
+ if (xz == null && this._audioData) {
198
+ let ow = this.ce.offsetWidth;
199
+ if (ow < 1) {
200
+ // at least one pixel width to avoid x-zoom zero values
201
+ ow = 1;
202
+ }
203
+ xz = ow / this._audioData.duration;
204
+ }
205
+ return xz;
206
+ }
207
+ _layout(clear, redraw) {
208
+ let ceBcr = this.ce.getBoundingClientRect();
209
+ const ceBcrIntW = Math.floor(ceBcr.width);
210
+ const ceBcrIntH = Math.floor(ceBcr.height);
211
+ // height available for plugins (audiosignal and sonagram)
212
+ let psH = ceBcrIntH - AudioClipUIContainer.DIVIDER_PIXEL_SIZE;
213
+ if (psH < 0) {
214
+ psH = 0;
215
+ }
216
+ // audio signal height
217
+ const asH = Math.round(psH * this.dividerPosition);
218
+ // sonagram height (rest: available height minus divider height minus audiosignal height)
219
+ let soH = ceBcrIntH - AudioClipUIContainer.DIVIDER_PIXEL_SIZE - asH;
220
+ if (soH < 0) {
221
+ soH = 0;
222
+ }
223
+ // sonagram top position
224
+ const soTop = asH + AudioClipUIContainer.DIVIDER_PIXEL_SIZE;
225
+ // Visible bounds
226
+ // left position
227
+ let vbLeft = 0;
228
+ // width
229
+ let vbWidth = ceBcrIntW;
230
+ if (!this._fixFitToPanel && this.bounds) {
231
+ vbLeft = Math.round(this.bounds.position.left);
232
+ vbWidth = Math.round(this.bounds.dimension.width);
233
+ }
234
+ // Divider
235
+ // left position
236
+ let vbLeftStyl = vbLeft + 'px';
237
+ if (this.dc.style.left != vbLeftStyl) {
238
+ this.dc.style.left = vbLeftStyl;
239
+ }
240
+ // top position
241
+ const dTop = asH;
242
+ const dTopStr = dTop + 'px';
243
+ if (this.dc.style.top != dTopStr) {
244
+ this.dc.style.top = dTopStr;
245
+ }
246
+ // width
247
+ let vbWidthStyle = vbWidth + 'px';
248
+ if (this.dc.style.width != vbWidthStyle) {
249
+ this.dc.style.width = vbWidthStyle;
250
+ }
251
+ if (this.dc.width != vbWidth) {
252
+ this.dc.width = vbWidth;
253
+ }
254
+ // height
255
+ if (this.dc.height != AudioClipUIContainer.DIVIDER_PIXEL_SIZE) {
256
+ this.dc.height = AudioClipUIContainer.DIVIDER_PIXEL_SIZE;
257
+ }
258
+ let divPixelSizeStyle = AudioClipUIContainer.DIVIDER_PIXEL_SIZE.toString() + 'px';
259
+ if (this.dc.style.height != divPixelSizeStyle) {
260
+ this.dc.style.height = divPixelSizeStyle;
261
+ }
262
+ this.drawDivider();
263
+ // Virtual dimension, only width is used
264
+ let virtualDim = new Dimension(ceBcrIntW, 0);
265
+ // Visible bounds of container
266
+ let br = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, ceBcrIntH));
267
+ // Set container bounds
268
+ this.layoutBounds(br, virtualDim, false);
269
+ // Visible bounds of audiosignal
270
+ let asR = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, asH));
271
+ // Set audiosignal bounds
272
+ this.as.layoutBounds(asR, virtualDim, redraw, clear);
273
+ // Visible bounds of sonagram
274
+ let soR = new Rectangle(new Position(vbLeft, soTop), new Dimension(vbWidth, soH));
275
+ // Set sonagram bounds
276
+ this.so.layoutBounds(soR, virtualDim, redraw, clear);
277
+ }
278
+ layoutScaled() {
279
+ this._layout(false, false);
280
+ }
281
+ layout(clear = true) {
282
+ if (this.ce && this.dc) {
283
+ const clientW = this.ce.clientWidth;
284
+ if (this._audioData) {
285
+ if (this._fixFitToPanel) {
286
+ // Set the virtual canvas width to the visible width
287
+ if (this.ce.style.width != '100%') {
288
+ //console.log("set width to 100%");
289
+ this.ce.style.width = '100%';
290
+ }
291
+ }
292
+ else {
293
+ if (this._xZoom) {
294
+ // Set the virtual canvas width according to the value of the user selected xZoom value
295
+ const newClW = Math.round(this._xZoom * this._audioData.duration);
296
+ this.ce.style.width = newClW + 'px';
297
+ }
298
+ else {
299
+ // Set the virtual canvas width to the visible width only
300
+ this.ce.style.width = clientW + 'px';
301
+ }
302
+ }
303
+ }
304
+ this._layout(clear, true);
305
+ }
306
+ }
307
+ set audioData(audioData) {
308
+ this._audioClip = null;
309
+ this._audioData = audioData;
310
+ this.as.setData(audioData);
311
+ this.so.setData(audioData);
312
+ this.layout();
313
+ }
314
+ get audioData() {
315
+ return this._audioData;
316
+ }
317
+ set audioClip(audioClip) {
318
+ this._audioClip = audioClip;
319
+ let audioData = null;
320
+ let sel = null;
321
+ if (audioClip) {
322
+ audioData = audioClip.buffer;
323
+ if (this._audioClip) {
324
+ this._audioClip.addSelectionObserver((clip) => {
325
+ this.selection = clip.selection;
326
+ });
327
+ }
328
+ sel = audioClip.selection;
329
+ }
330
+ this._audioData = audioData;
331
+ this.as.setData(this._audioData);
332
+ this.so.setData(this._audioData);
333
+ this.selecting = null;
334
+ this.selection = sel;
335
+ this.layout();
336
+ }
337
+ get playFramePosition() {
338
+ return this._playFramePosition;
339
+ }
340
+ set playFramePosition(playFramePosition) {
341
+ this._playFramePosition = playFramePosition;
342
+ this.as.playFramePosition = playFramePosition;
343
+ this.so.playFramePosition = playFramePosition;
344
+ }
345
+ }
346
+ AudioClipUIContainer.DIVIDER_PIXEL_SIZE = 10;
347
+ AudioClipUIContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: AudioClipUIContainer, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
348
+ AudioClipUIContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: AudioClipUIContainer, selector: "app-audio", inputs: { audioData: "audioData", audioClip: "audioClip" }, outputs: { selectionEventEmitter: "selectionEventEmitter" }, host: { listeners: { "window:resize": "onResize($event)", "document:mouseup": "onMouseup($event)", "document:mousemove": "onMousemove($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["divider"], descendants: true, static: true }, { propertyName: "ceRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "as", first: true, predicate: AudioSignal, descendants: true, static: true }, { propertyName: "so", first: true, predicate: Sonagram, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
349
+ <div #virtualCanvas>
350
+ <canvas #divider (mousedown)="mousedown($event)" (mouseover)="mouseover($event)"
351
+ (mouseleave)="mouseleave($event)" height="10"></canvas>
352
+ <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
353
+ <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
354
+ </div>
355
+ `, isInline: true, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;zIndex:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;zIndex:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;zIndex:1;transform:none}\n"], components: [{ type: i1.AudioSignal, selector: "audio-signal" }, { type: i2.Sonagram, selector: "audio-sonagram" }] });
356
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: AudioClipUIContainer, decorators: [{
357
+ type: Component,
358
+ args: [{
359
+ selector: 'app-audio',
360
+ template: `
361
+ <div #virtualCanvas>
362
+ <canvas #divider (mousedown)="mousedown($event)" (mouseover)="mouseover($event)"
363
+ (mouseleave)="mouseleave($event)" height="10"></canvas>
364
+ <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
365
+ <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
366
+ </div>
367
+ `,
368
+ styles: [`div {
369
+
370
+ margin: 0;
371
+ padding: 0;
372
+ top: 0;
373
+ left: 0;
374
+ width: 100%;
375
+ height: 100%;
376
+ position: relative; /* TODO container div position must not be 'static' (default) to act as reference for the canvases */
377
+ box-sizing: border-box;
378
+ transform: none;
379
+ overflow: hidden;
380
+ }`, `canvas{
381
+ top: 0;
382
+ left: 0;
383
+ width: 0;
384
+ height: 0;
385
+ cursor: ns-resize;
386
+ position: absolute;
387
+ zIndex: 1;
388
+ transform: none;
389
+ }`, `audio-signal {
390
+ top: 0;
391
+ left: 0;
392
+ position: absolute;
393
+ zIndex: 1;
394
+ transform: none;
395
+ }`, `audio-sonagram {
396
+ top: 0;
397
+ left: 0;
398
+ position: absolute;
399
+ zIndex: 1;
400
+ transform: none;
401
+ }`]
402
+ }]
403
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { canvasRef: [{
404
+ type: ViewChild,
405
+ args: ['divider', { static: true }]
406
+ }], ceRef: [{
407
+ type: ViewChild,
408
+ args: ['virtualCanvas', { static: true }]
409
+ }], as: [{
410
+ type: ViewChild,
411
+ args: [AudioSignal, { static: true }]
412
+ }], so: [{
413
+ type: ViewChild,
414
+ args: [Sonagram, { static: true }]
415
+ }], selectionEventEmitter: [{
416
+ type: Output
417
+ }], onResize: [{
418
+ type: HostListener,
419
+ args: ['window:resize', ['$event']]
420
+ }], onMouseup: [{
421
+ type: HostListener,
422
+ args: ['document:mouseup', ['$event']]
423
+ }], onMousemove: [{
424
+ type: HostListener,
425
+ args: ['document:mousemove', ['$event']]
426
+ }], audioData: [{
427
+ type: Input
428
+ }], audioClip: [{
429
+ type: Input
430
+ }] } });
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3VpL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ3NCLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFDN0UsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQ25DLE9BQU8sRUFBUyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFFdEMsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckUsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7Ozs7QUFjeEUsQ0FBQztBQWdCRCxDQUFDO0FBRUYsNEJBQTRCO0FBQzVCLGdDQUFnQztBQUNoQyxtREFBbUQ7QUFDbkQsdUVBQXVFO0FBQ3ZFLG1DQUFtQztBQUNuQywwQkFBMEI7QUFDMUIsSUFBSTtBQUVKOzs7Ozs7O0dBT0c7QUFnREgsTUFBTSxPQUFPLG9CQUFxQixTQUFRLDhCQUE4QjtJQTBEdEUsWUFBb0IsR0FBZTtRQUNqQyxLQUFLLEVBQUUsQ0FBQTtRQURXLFFBQUcsR0FBSCxHQUFHLENBQVk7UUF6QzNCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ3pDLFlBQU8sR0FBYyxJQUFJLENBQUM7UUFDMUIsY0FBUyxHQUFpQixJQUFJLENBQUM7UUFDL0IsY0FBUyxHQUFpQixJQUFJLENBQUM7UUFDckIsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUN4RCx1QkFB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QU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0QsRUFBRTtzQkFBeEMsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU0zQixxQkFBcUI7c0JBQTlCLE1BQU07Z0JBK0VQLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBb0J6QyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBWTVDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkE4TjFDLFNBQVM7c0JBRFosS0FBSztnQkFjRixTQUFTO3NCQURaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQge0F1ZGlvU2lnbmFsfSBmcm9tICcuL2F1ZGlvc2lnbmFsJ1xyXG5pbXBvcnQge1NvbmFncmFtfSBmcm9tICcuL3NvbmFncmFtJ1xyXG5pbXBvcnQge01hcmtlciwgUG9pbnR9IGZyb20gJy4vY29tbW9uJ1xyXG5cclxuaW1wb3J0IHtDb21wb25lbnQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7UG9zaXRpb24sRGltZW5zaW9uLCBSZWN0YW5nbGV9IGZyb20gXCIuLi8uLi9tYXRoLzJkL2dlb21ldHJ5XCI7XHJcbmltcG9ydCB7QXVkaW9DbGlwLFNlbGVjdGlvbn0gZnJvbSBcIi4uL3BlcnNpc3RvclwiO1xyXG5pbXBvcnQge0Jhc2ljQXVkaW9DYW52YXNMYXllckNvbXBvbmVudH0gZnJvbSBcIi4vYXVkaW9fY2FudmFzX2xheWVyX2NvbXBcIjtcclxuaW1wb3J0IHtFbGVtZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tcGlsZXJcIjtcclxuXHJcbi8qXHJcbiAgUmVzaXplT2JzZXJ2ZXIgbm90IHlldCBhdmFpbGFibGUgaW4gb2ZmaWNpYWwgVHlwZXNjcmlwdCBkZWNsYXJhdGlvblxyXG4gIENycmVhdGVkIGRlY2xhcmF0aW9uIGZyb20gSURMIHVudGlsIGl0cyBhdmFpbGFibGUuXHJcbiAgU2VlIHNwZWNzOlxyXG4gIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9yZXNpemUtb2JzZXJ2ZXJcclxuXHJcbiAqL1xyXG5cclxuaW50ZXJmYWNlIFJlc2l6ZU9ic2VydmVyU2l6ZSB7XHJcbiAgcmVhZG9ubHkgaW5saW5lU2l6ZTpudW1iZXI7XHJcbiAgcmVhZG9ubHkgYmxvY2tTaXplOm51bWJlcjtcclxufTtcclxuXHJcbmRlY2xhcmUgaW50ZXJmYWNlIFJlc2l6ZU9ic2VydmVyRW50cnl7XHJcbiAgcmVhZG9ubHkgdGFyZ2V0OiBFbGVtZW50O1xyXG4gIHJlYWRvbmx5IGNvbnRlbnRSZWN0OiBET01SZWN0UmVhZE9ubHkgO1xyXG4gIHJlYWRvbmx5IGJvcmRlckJveFNpemU6IEFycmF5PFJlc2l6ZU9ic2VydmVyU2l6ZT4gO1xyXG4gIHJlYWRvbmx5IGNvbnRlbnRCb3hTaXplOiBBcnJheTxSZXNpemVPYnNlcnZlclNpemU+IDtcclxuICByZWFkb25seSBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplOiBBcnJheTxSZXNpemVPYnNlcnZlclNpemU+IDtcclxufVxyXG5cclxuZGVjbGFyZSBpbnRlcmZhY2UgUmVzaXplT2JzZXJ2ZXJDYWxsYmFjayB7XHJcbiAgKGVudHJpZXM6IEFycmF5PFJlc2l6ZU9ic2VydmVyRW50cnk+LCBvYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIpOnZvaWQ7XHJcbn1cclxuXHJcbmRlY2xhcmUgZW51bSBSZXNpemVPYnNlcnZlckJveE9wdGlvbnMge1xyXG4gIFwiYm9yZGVyLWJveFwiLCBcImNvbnRlbnQtYm94XCIsIFwiZGV2aWNlLXBpeGVsLWNvbnRlbnQtYm94XCJcclxufTtcclxuXHJcbi8vIC8vIERlY2xhcmUgUmVzaXplb2JzZXJ2ZXJcclxuLy8gZGVjbGFyZSBjbGFzcyBSZXNpemVPYnNlcnZlcntcclxuLy8gICBjb25zdHJ1Y3RvcihjYWxsYmFjazogUmVzaXplT2JzZXJ2ZXJDYWxsYmFjayk7XHJcbi8vICAgb2JzZXJ2ZTogKGVsOkVsZW1lbnQsb3B0czogUmVzaXplT2JzZXJ2ZXJCb3hPcHRpb25zIHwgbnVsbCk9PnZvaWQ7XHJcbi8vICAgdW5vYnNlcnZlOiAoZWw6RWxlbWVudCk9PnZvaWQ7XHJcbi8vICAgZGlzY29ubmVjdDogKCk9PnZvaWQ7XHJcbi8vIH1cclxuXHJcbi8qXHJcbiAqIENvbnRhaW5lciBjb21wb25lbnQgZm9yIGF1ZGlvIGRpc3BsYXkuXHJcbiAqIFRoZSBkaXNwbGF5IGVsZW1lbnRzIGFyZSBjaGlsZHJlbiBvZiBhIHZpcnR1YWwgY2FudmFzLiBUaGUgdmlydHVhbCBjYW52YXMgbWFrZXMgaXQgcG9zc2libGUgdG8gaGF2ZSBoaWdoIHpvb20gZmFjdG9ycyB3aXRoIHZlcnkgd2lkZSB2aXJ0dWFsIGF1ZGlvIGRpc3BsYXlzLlxyXG4gKiBPbmx5IHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlIHZpcnR1YWwgY2FudmFzIGlzIGltcGxlbWVudGVkIGFzIGEgYnJvd3NlciBjYW52YXMgYW5kIHRoZXJlZm9yZSBjb25zdW1pbmcgbWVtb3J5LlxyXG4gKiBUaGUgdmlzaWJsZSBwYXJ0IGhhcyB0aGUgc2FtZSB3aWR0aCBhcyB0aGUgdmlld3BvcnQgb2YgdGhlIHNjcm9sbCBwYW5lIHBhcmVudC5cclxuICogVGhlIHZpcnR1YWwgY2FudmFzIGl0c2VsZiBpcyBpbXBsZW1lbnRlZCBhcyBhIEhUTUwgZGl2IGVsZW1lbnQuXHJcbiAqIFRoZSBsYXlvdXQgb2YgdGhlIGNvbXBvbmVudCBpcyB1cGRhdGVkIG9uIHJlc2l6ZSBvZiB0aGUgcGFyZW50IG9yIGNoYW5nZXMgb2YgdGhlIHpvb20gZmFjdG9yLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiAjdmlydHVhbENhbnZhcz5cclxuICAgIDxjYW52YXMgI2RpdmlkZXIgKG1vdXNlZG93bik9XCJtb3VzZWRvd24oJGV2ZW50KVwiIChtb3VzZW92ZXIpPVwibW91c2VvdmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJtb3VzZWxlYXZlKCRldmVudClcIiBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgPGF1ZGlvLXNpZ25hbCBbcG9pbnRlclBvc2l0aW9uXT1cInBvaW50ZXJcIiBbc2VsZWN0aW5nXT1cInNlbGVjdGluZ1wiIFtzZWxlY3Rpb25dPVwic2VsZWN0aW9uXCIgKHBvaW50ZXJQb3NpdGlvbkV2ZW50RW1pdHRlcik9XCJwb2ludGVyUG9zaXRpb25DaGFuZ2VkKCRldmVudClcIiAoc2VsZWN0aW5nRXZlbnRFbWl0dGVyKT1cInNlbGVjdGluZ0NoYW5nZWQoJGV2ZW50KVwiIChzZWxlY3RlZEV2ZW50RW1pdHRlcik9XCJzZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIj48L2F1ZGlvLXNpZ25hbD5cclxuICAgIDxhdWRpby1zb25hZ3JhbSBbcG9pbnRlclBvc2l0aW9uXT1cInBvaW50ZXJcIiBbc2VsZWN0aW5nXT1cInNlbGVjdGluZ1wiIFtzZWxlY3Rpb25dPVwic2VsZWN0aW9uXCIgKHBvaW50ZXJQb3NpdGlvbkV2ZW50RW1pdHRlcik9XCJwb2ludGVyUG9zaXRpb25DaGFuZ2VkKCRldmVudClcIiAoc2VsZWN0aW5nRXZlbnRFbWl0dGVyKT1cInNlbGVjdGluZ0NoYW5nZWQoJGV2ZW50KVwiIChzZWxlY3RlZEV2ZW50RW1pdHRlcik9XCJzZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIj48L2F1ZGlvLXNvbmFncmFtPlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgZGl2IHtcclxuXHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBUT0RPIGNvbnRhaW5lciBkaXYgcG9zaXRpb24gbXVzdCBub3QgYmUgJ3N0YXRpYycgKGRlZmF1bHQpIHRvIGFjdCBhcyByZWZlcmVuY2UgZm9yIHRoZSBjYW52YXNlcyAqL1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIHRyYW5zZm9ybTogbm9uZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfWAsIGBjYW52YXN7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBoZWlnaHQ6IDA7XHJcbiAgICBjdXJzb3I6IG5zLXJlc2l6ZTtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHpJbmRleDogMTtcclxuICAgIHRyYW5zZm9ybTogbm9uZTtcclxuICB9YCwgYGF1ZGlvLXNpZ25hbCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgekluZGV4OiAxO1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gIH1gLCBgYXVkaW8tc29uYWdyYW0ge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHpJbmRleDogMTtcclxuICAgIHRyYW5zZm9ybTogbm9uZTtcclxuICB9YF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NsaXBVSUNvbnRhaW5lciBleHRlbmRzIEJhc2ljQXVkaW9DYW52YXNMYXllckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCxBZnRlclZpZXdJbml0e1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBESVZJREVSX1BJWEVMX1NJWkUgPSAxMDtcclxuXHJcbiAgcGFyZW50RTogSFRNTEVsZW1lbnQ7XHJcblxyXG4gIC8vIERpdmlkZXIgY2FudmFzXHJcbiAgQFZpZXdDaGlsZCgnZGl2aWRlcicsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgZGMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgLy8gVmlydHVhbCBjb250YWluZXJcclxuICBAVmlld0NoaWxkKCd2aXJ0dWFsQ2FudmFzJywgeyBzdGF0aWM6IHRydWUgfSkgY2VSZWYhOiBFbGVtZW50UmVmO1xyXG4gIGNlITogSFRNTERpdkVsZW1lbnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoQXVkaW9TaWduYWwsIHsgc3RhdGljOiB0cnVlIH0pIGFzITogQXVkaW9TaWduYWw7XHJcbiAgQFZpZXdDaGlsZChTb25hZ3JhbSwgeyBzdGF0aWM6IHRydWUgfSkgc28hOiBTb25hZ3JhbTtcclxuXHJcbiAgcHJpdmF0ZSBfYXVkaW9DbGlwOkF1ZGlvQ2xpcCB8IG51bGw9bnVsbDtcclxuICBwb2ludGVyOiBNYXJrZXJ8bnVsbD1udWxsO1xyXG4gIHNlbGVjdGluZzogU2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICBzZWxlY3Rpb246IFNlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uPigpO1xyXG4gIHByaXZhdGUgX3BsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0TW91c2VZOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGRyYWdTdGFydFk6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZGl2aWRlclBvc2l0aW9uID0gMC41O1xyXG5cclxuICB1c2VyQWN0aW9uPWZhbHNlO1xyXG5cclxuICBwcml2YXRlIF94Wm9vbTogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIHBpeGVscyBwZXIgc2Vjb25kXHJcblxyXG4gIGdldCB4Wm9vbSgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl94Wm9vbTtcclxuICB9XHJcblxyXG4gIHNldCB4Wm9vbSh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xyXG4gICAgdGhpcy51c2VyQWN0aW9uPXRydWU7XHJcbiAgICB0aGlzLl94Wm9vbSA9IHZhbHVlO1xyXG4gICAgdGhpcy5sYXlvdXQoKVxyXG4gICAgdGhpcy51c2VyQWN0aW9uPWZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gaWYgdHJ1ZSB0aGUgY29tcGxldGUgYXVkaW8gZmlsZSBpcyBzaG93biwgdGhlIGRpc3BsYXkgZml0cyB0byB0aGUgdmlzaWJsZSBwYW5lbCwgdGhlIHgtem9vbSBmYWN0b3IgaXMgdmFyaWFibGUsIHRoaXMgaXMgdGhlIGRlZmF1bHRcclxuICBwcml2YXRlIF9maXhGaXRUb1BhbmVsID0gdHJ1ZTtcclxuXHJcbiAgc2V0IGZpeEZpdFRvUGFuZWwodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2ZpeEZpdFRvUGFuZWwgPSB2YWx1ZTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvLyB3ZSBkb24ndCBuZWVkICBjbGlwIGJvdW5kc1xyXG4gICAgICB0aGlzLmJvdW5kcz1udWxsO1xyXG4gICAgICB0aGlzLl94Wm9vbSA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBob2xkIGN1cnJlbnQgem9vbSB2YWx1ZVxyXG4gICAgICAvL3RoaXMuX3hab29tPXRoaXMuY2Uub2Zmc2V0V2lkdGgvdGhpcy5fYXVkaW9EYXRhLmR1cmF0aW9uO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sYXlvdXQoKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgIHN1cGVyKClcclxuICAgIHRoaXMucGFyZW50RSA9IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY2UgPSB0aGlzLmNlUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmRjID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgICBsZXQgaGVpZ2h0TGlzdGVuZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXJzOiBBcnJheTxNdXRhdGlvblJlY29yZD4sIG1vOiBNdXRhdGlvbk9ic2VydmVyKSA9PiB7XHJcblxyXG4gICAgICBsZXQgbGF5b3V0PWZhbHNlO1xyXG4gICAgICBtcnMuZm9yRWFjaCgobXI6IE11dGF0aW9uUmVjb3JkKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJBY3Rpb24gJiYgJ2F0dHJpYnV0ZXMnID09PSBtci50eXBlICYmICgnY2xhc3MnID09PSBtci5hdHRyaWJ1dGVOYW1lIHx8ICdzdHlsZScgPT09IG1yLmF0dHJpYnV0ZU5hbWUpKSB7XHJcbiAgICAgICAgICBsYXlvdXQ9dHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZihsYXlvdXQpe1xyXG4gICAgICAgIC8vIHJlLWxheW91dCByZXF1aXJlZFxyXG4gICAgICAgIHRoaXMubGF5b3V0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaGVpZ2h0TGlzdGVuZXIub2JzZXJ2ZSh0aGlzLmNlLCB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XHJcbiAgICBoZWlnaHRMaXN0ZW5lci5vYnNlcnZlKHRoaXMuZGMsIHthdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWV9KTtcclxuXHJcbiAgICBsZXQgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMsb2JzKSA9PiB7XHJcbiAgICAgIC8vY29uc29sZS5sb2coXCJSZXNpemUgb2JzZXJ2ZWQ6XCIpO1xyXG4gICAgICBlbnRyaWVzLmZvckVhY2goKGUpPT57XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhlLmNvbnRlbnRSZWN0LndpZHRoK1wieFwiK2UuY29udGVudFJlY3QuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNlKTtcclxuXHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBtb3VzZW92ZXIobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZGl2aWRlckN1cnNvclBvc2l0aW9uKG1lLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIG1vdXNlbGVhdmUobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZGl2aWRlckN1cnNvclBvc2l0aW9uKG1lLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBtb3VzZWRvd24obWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0TW91c2VZID0gbWUuY2xpZW50WTtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IHRoaXMuZGMub2Zmc2V0VG9wO1xyXG4gICAgdGhpcy5kcmFnU3RhcnRNb3VzZVkgPSBtZS5jbGllbnRZO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZXVwKG1lOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5kcmFnU3RhcnRZICE9IG51bGwpIHtcclxuICAgICAgdGhpcy51c2VyQWN0aW9uPXRydWU7XHJcbiAgICAgIHRoaXMuZGl2aWRlckRyYWcobWUpO1xyXG4gICAgICB0aGlzLmxheW91dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IG51bGw7XHJcbiAgICAgIHRoaXMudXNlckFjdGlvbj1mYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZW1vdmUobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRyYWdTdGFydFkgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnVzZXJBY3Rpb249dHJ1ZTtcclxuICAgICAgdGhpcy5kaXZpZGVyRHJhZyhtZSk7XHJcbiAgICAgIHRoaXMubGF5b3V0U2NhbGVkKCk7XHJcbiAgICAgIHRoaXMudXNlckFjdGlvbj10cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcG9pbnRlclBvc2l0aW9uQ2hhbmdlZChwcDpNYXJrZXIpe1xyXG4gICAgdGhpcy5wb2ludGVyPXBwXHJcbiAgfVxyXG5cclxuICBzZWxlY3RpbmdDaGFuZ2VkKHM6U2VsZWN0aW9ufCBudWxsKXtcclxuICAgIHRoaXMuc2VsZWN0aW5nPXNcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZWQoczpTZWxlY3Rpb24pe1xyXG4gICAgdGhpcy5zZWxlY3Rpb249c1xyXG4gICAgaWYodGhpcy5fYXVkaW9DbGlwKXtcclxuICAgICAgdGhpcy5fYXVkaW9DbGlwLnNlbGVjdGlvbj1zXHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGlvbkV2ZW50RW1pdHRlci5lbWl0KHRoaXMuc2VsZWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYW52YXNNb3VzZVBvcyhjOiBIVE1MQ2FudmFzRWxlbWVudCwgZTogTW91c2VFdmVudCk6IFBvaW50IHtcclxuICAgIGNvbnN0IGNyID0gYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHggPSBlLnggLSBjci5sZWZ0O1xyXG4gICAgY29uc3QgeSA9IGUueSAtIGNyLnRvcDtcclxuICAgIHJldHVybiBuZXcgUG9pbnQoeCx5KTtcclxuICB9XHJcblxyXG4gIGRpdmlkZXJDdXJzb3JQb3NpdGlvbihlOiBNb3VzZUV2ZW50LCBzaG93OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5kYykge1xyXG5cclxuICAgICAgY29uc3QgdyA9IHRoaXMuZGMud2lkdGg7XHJcbiAgICAgIGNvbnN0IGggPSB0aGlzLmRjLmhlaWdodDtcclxuICAgICAgY29uc3QgZyA9IHRoaXMuZGMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAgIGNvbnN0IHBwID0gdGhpcy5jYW52YXNNb3VzZVBvcyh0aGlzLmRjLCBlKTtcclxuICAgICAgY29uc3Qgb2ZmWCA9IGUub2Zmc2V0WCAtIHRoaXMuZGMub2Zmc2V0TGVmdDtcclxuICAgICAgY29uc3Qgb2ZmWSA9IGUub2Zmc2V0WSAtIHRoaXMuZGMub2Zmc2V0VG9wO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRpdmlkZXJEcmFnKGU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRjICYmIHRoaXMuZHJhZ1N0YXJ0TW91c2VZICYmIHRoaXMuZHJhZ1N0YXJ0WSkge1xyXG5cclxuICAgICAgY29uc3QgZHJhZ09mZnNldCA9IGUuY2xpZW50WSAtIHRoaXMuZHJhZ1N0YXJ0TW91c2VZO1xyXG4gICAgICBjb25zdCBjZUhlaWdodCA9IHRoaXMuY2Uub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgbGV0IG5ld1RvcCA9ICh0aGlzLmRyYWdTdGFydFkgKyBkcmFnT2Zmc2V0KTtcclxuICAgICAgaWYgKG5ld1RvcCA8IDApIHtcclxuICAgICAgICBuZXdUb3AgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXdUb3AgPiBjZUhlaWdodCAtIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSkge1xyXG4gICAgICAgIG5ld1RvcCA9IGNlSGVpZ2h0IC0gQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGMuc3R5bGUudG9wID0gbmV3VG9wLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgICB0aGlzLmRpdmlkZXJQb3NpdGlvbiA9ICh0aGlzLmRjLm9mZnNldFRvcCArIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSAvIDIpIC8gY2VIZWlnaHQ7XHJcbiAgICAgIGlmICh0aGlzLmRpdmlkZXJQb3NpdGlvbiA+IDEuMCkge1xyXG4gICAgICAgIHRoaXMuZGl2aWRlclBvc2l0aW9uID0gMS4wO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmRpdmlkZXJQb3NpdGlvbiA8IDAuMCkge1xyXG4gICAgICAgIHRoaXMuZGl2aWRlclBvc2l0aW9uID0gMC4wO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZHJhd0RpdmlkZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBkcmF3RGl2aWRlcigpIHtcclxuICAgIGNvbnN0IHcgPSB0aGlzLmRjLndpZHRoO1xyXG4gICAgY29uc3QgaCA9IHRoaXMuZGMuaGVpZ2h0O1xyXG4gICAgY29uc3QgZyA9IHRoaXMuZGMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIGlmIChnICYmIHc+MTAgJiYgaD49MSkge1xyXG4gICAgICBnLmZpbGxTdHlsZSA9ICd3aGl0ZSc7XHJcbiAgICAgIGcuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgIGcuZmlsbFN0eWxlID0gJ2JsYWNrJztcclxuICAgICAgZy5maWxsUmVjdCg1LCA1LCB3IC0gMTAsIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xpcEJvdW5kcyhjbGlwQm91bmRzOiBSZWN0YW5nbGUpIHtcclxuICAgIHRoaXMuYm91bmRzID0gY2xpcEJvdW5kcztcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBjdXJyZW50WFpvb20oKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBsZXQgeHogPSB0aGlzLl94Wm9vbTtcclxuICAgIGlmICh4ej09bnVsbCAmJiB0aGlzLl9hdWRpb0RhdGEpIHtcclxuICAgICAgbGV0IG93ID0gdGhpcy5jZS5vZmZzZXRXaWR0aDtcclxuICAgICAgaWYgKG93IDwgMSkge1xyXG4gICAgICAgIC8vIGF0IGxlYXN0IG9uZSBwaXhlbCB3aWR0aCB0byBhdm9pZCB4LXpvb20gemVybyB2YWx1ZXNcclxuICAgICAgICBvdyA9IDE7XHJcbiAgICAgIH1cclxuICAgICAgeHogPSBvdyAvIHRoaXMuX2F1ZGlvRGF0YS5kdXJhdGlvbjtcclxuICAgIH1cclxuICAgIHJldHVybiB4ejtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xheW91dChjbGVhcjogYm9vbGVhbiwgcmVkcmF3OiBib29sZWFuKSB7XHJcbiAgICBsZXQgY2VCY3IgPSB0aGlzLmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIGNvbnN0IGNlQmNySW50VyA9IE1hdGguZmxvb3IoY2VCY3Iud2lkdGgpO1xyXG4gICAgY29uc3QgY2VCY3JJbnRIID0gTWF0aC5mbG9vcihjZUJjci5oZWlnaHQpO1xyXG5cclxuICAgIC8vIGhlaWdodCBhdmFpbGFibGUgZm9yIHBsdWdpbnMgKGF1ZGlvc2lnbmFsIGFuZCBzb25hZ3JhbSlcclxuICAgIGxldCBwc0ggPSBjZUJjckludEggLSBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkU7XHJcbiAgICBpZiAocHNIIDwgMCkge1xyXG4gICAgICBwc0ggPSAwO1xyXG4gICAgfVxyXG4gICAgLy8gYXVkaW8gc2lnbmFsIGhlaWdodFxyXG4gICAgY29uc3QgYXNIID0gTWF0aC5yb3VuZChwc0ggKiB0aGlzLmRpdmlkZXJQb3NpdGlvbik7XHJcblxyXG4gICAgLy8gc29uYWdyYW0gaGVpZ2h0IChyZXN0OiBhdmFpbGFibGUgaGVpZ2h0IG1pbnVzIGRpdmlkZXIgaGVpZ2h0IG1pbnVzIGF1ZGlvc2lnbmFsIGhlaWdodClcclxuICAgIGxldCBzb0ggPSBjZUJjckludEggLSBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkUgLSBhc0g7XHJcbiAgICBpZiAoc29IIDwgMCkge1xyXG4gICAgICBzb0ggPSAwO1xyXG4gICAgfVxyXG5cclxuICAvLyBzb25hZ3JhbSB0b3AgcG9zaXRpb25cclxuICAgIGNvbnN0IHNvVG9wID0gYXNIICsgQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFO1xyXG5cclxuICAgIC8vIFZpc2libGUgYm91bmRzXHJcbiAgICAvLyBsZWZ0IHBvc2l0aW9uXHJcbiAgICBsZXQgdmJMZWZ0ID0gMDtcclxuICAgIC8vIHdpZHRoXHJcbiAgICBsZXQgdmJXaWR0aCA9IGNlQmNySW50VztcclxuICAgIGlmICghdGhpcy5fZml4Rml0VG9QYW5lbCAmJiB0aGlzLmJvdW5kcykge1xyXG4gICAgICB2YkxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLmxlZnQpO1xyXG4gICAgICB2YldpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERpdmlkZXJcclxuICAgIC8vIGxlZnQgcG9zaXRpb25cclxuICAgIGxldCB2YkxlZnRTdHlsID0gdmJMZWZ0ICsgJ3B4JztcclxuICAgIGlmICh0aGlzLmRjLnN0eWxlLmxlZnQgIT0gdmJMZWZ0U3R5bCkge1xyXG4gICAgICB0aGlzLmRjLnN0eWxlLmxlZnQgPSB2YkxlZnRTdHlsO1xyXG4gICAgfVxyXG4gICAgLy8gdG9wIHBvc2l0aW9uXHJcbiAgICBjb25zdCBkVG9wID0gYXNIO1xyXG4gICAgY29uc3QgZFRvcFN0ciA9IGRUb3AgKyAncHgnO1xyXG4gICAgaWYgKHRoaXMuZGMuc3R5bGUudG9wICE9IGRUb3BTdHIpIHtcclxuICAgICAgdGhpcy5kYy5zdHlsZS50b3AgPSBkVG9wU3RyO1xyXG4gICAgfVxyXG4gICAgLy8gd2lkdGhcclxuICAgIGxldCB2YldpZHRoU3R5bGUgPSB2YldpZHRoICsgJ3B4JztcclxuICAgIGlmICh0aGlzLmRjLnN0eWxlLndpZHRoICE9IHZiV2lkdGhTdHlsZSkge1xyXG4gICAgICB0aGlzLmRjLnN0eWxlLndpZHRoID0gdmJXaWR0aFN0eWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGMud2lkdGggIT0gdmJXaWR0aCkge1xyXG4gICAgICB0aGlzLmRjLndpZHRoID0gdmJXaWR0aDtcclxuICAgIH1cclxuICAgIC8vIGhlaWdodFxyXG4gICAgaWYodGhpcy5kYy5oZWlnaHQhPUF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSkge1xyXG4gICAgICB0aGlzLmRjLmhlaWdodCA9IEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRTtcclxuXHJcbiAgICB9XHJcbiAgICBsZXQgZGl2UGl4ZWxTaXplU3R5bGU9QXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgaWYodGhpcy5kYy5zdHlsZS5oZWlnaHQhPWRpdlBpeGVsU2l6ZVN0eWxlKSB7XHJcbiAgICAgIHRoaXMuZGMuc3R5bGUuaGVpZ2h0ID0gZGl2UGl4ZWxTaXplU3R5bGU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kcmF3RGl2aWRlcigpO1xyXG5cclxuXHJcbiAgICAvLyBWaXJ0dWFsIGRpbWVuc2lvbiwgb25seSB3aWR0aCBpcyB1c2VkXHJcbiAgICBsZXQgdmlydHVhbERpbSA9IG5ldyBEaW1lbnNpb24oY2VCY3JJbnRXLCAwKVxyXG5cclxuICAgIC8vIFZpc2libGUgYm91bmRzIG9mIGNvbnRhaW5lclxyXG4gICAgbGV0IGJyID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odmJMZWZ0LCAwKSwgbmV3IERpbWVuc2lvbih2YldpZHRoLCBjZUJjckludEgpKTtcclxuXHJcbiAgICAvLyBTZXQgY29udGFpbmVyIGJvdW5kc1xyXG4gICAgdGhpcy5sYXlvdXRCb3VuZHMoYnIsIHZpcnR1YWxEaW0sIGZhbHNlKTtcclxuXHJcbiAgICAvLyBWaXNpYmxlIGJvdW5kcyBvZiBhdWRpb3NpZ25hbFxyXG4gICAgbGV0IGFzUiA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHZiTGVmdCwgMCksIG5ldyBEaW1lbnNpb24odmJXaWR0aCwgYXNIKSk7XHJcblxyXG4gICAgLy8gU2V0IGF1ZGlvc2lnbmFsIGJvdW5kc1xyXG4gICAgdGhpcy5hcy5sYXlvdXRCb3VuZHMoYXNSLCB2aXJ0dWFsRGltLCByZWRyYXcsIGNsZWFyKTtcclxuXHJcbiAgICAvLyBWaXNpYmxlIGJvdW5kcyBvZiBzb25hZ3JhbVxyXG4gICAgbGV0IHNvUiA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHZiTGVmdCwgc29Ub3ApLCBuZXcgRGltZW5zaW9uKHZiV2lkdGgsIHNvSCkpO1xyXG5cclxuICAgIC8vIFNldCBzb25hZ3JhbSBib3VuZHNcclxuICAgIHRoaXMuc28ubGF5b3V0Qm91bmRzKHNvUiwgdmlydHVhbERpbSwgcmVkcmF3LCBjbGVhcik7XHJcbiAgfVxyXG5cclxuICBsYXlvdXRTY2FsZWQoKSB7XHJcbiAgICB0aGlzLl9sYXlvdXQoZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGxheW91dChjbGVhcj10cnVlKSB7XHJcblxyXG4gICAgaWYodGhpcy5jZSAmJiB0aGlzLmRjKSB7XHJcbiAgICAgIGNvbnN0IGNsaWVudFc9dGhpcy5jZS5jbGllbnRXaWR0aDtcclxuICAgICAgaWYodGhpcy5fYXVkaW9EYXRhKXtcclxuICAgICAgICBpZih0aGlzLl9maXhGaXRUb1BhbmVsKSB7XHJcbiAgICAgICAgICAvLyBTZXQgdGhlIHZpcnR1YWwgY2FudmFzIHdpZHRoIHRvIHRoZSB2aXNpYmxlIHdpZHRoXHJcbiAgICAgICAgICBpZih0aGlzLmNlLnN0eWxlLndpZHRoIT0nMTAwJScpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInNldCB3aWR0aCB0byAxMDAlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNlLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3hab29tKSB7XHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgdmlydHVhbCBjYW52YXMgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdXNlciBzZWxlY3RlZCB4Wm9vbSB2YWx1ZVxyXG4gICAgICAgICAgICBjb25zdCBuZXdDbFcgPSBNYXRoLnJvdW5kKCB0aGlzLl94Wm9vbSp0aGlzLl9hdWRpb0RhdGEuZHVyYXRpb24gKTtcclxuICAgICAgICAgICAgdGhpcy5jZS5zdHlsZS53aWR0aCA9IG5ld0NsVyArICdweCc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHZpcnR1YWwgY2FudmFzIHdpZHRoIHRvIHRoZSB2aXNpYmxlIHdpZHRoIG9ubHlcclxuICAgICAgICAgICAgdGhpcy5jZS5zdHlsZS53aWR0aCA9IGNsaWVudFcgKyAncHgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9sYXlvdXQoY2xlYXIsdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBhdWRpb0RhdGEoYXVkaW9EYXRhOiBBdWRpb0J1ZmZlciB8IG51bGwpIHtcclxuICAgIHRoaXMuX2F1ZGlvQ2xpcD1udWxsXHJcbiAgICB0aGlzLl9hdWRpb0RhdGE9YXVkaW9EYXRhO1xyXG4gICAgdGhpcy5hcy5zZXREYXRhKGF1ZGlvRGF0YSk7XHJcbiAgICB0aGlzLnNvLnNldERhdGEoYXVkaW9EYXRhKTtcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaW9EYXRhKCk6QXVkaW9CdWZmZXJ8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9hdWRpb0RhdGFcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGF1ZGlvQ2xpcChhdWRpb0NsaXA6IEF1ZGlvQ2xpcCB8IG51bGwpIHtcclxuICAgIHRoaXMuX2F1ZGlvQ2xpcD1hdWRpb0NsaXBcclxuICAgICAgbGV0IGF1ZGlvRGF0YTpBdWRpb0J1ZmZlcnxudWxsPW51bGw7XHJcbiAgICBsZXQgc2VsOlNlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgICAgIGlmKGF1ZGlvQ2xpcCkge1xyXG4gICAgICAgIGF1ZGlvRGF0YSA9IGF1ZGlvQ2xpcC5idWZmZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuX2F1ZGlvQ2xpcCkge1xyXG4gICAgICAgICAgdGhpcy5fYXVkaW9DbGlwLmFkZFNlbGVjdGlvbk9ic2VydmVyKChjbGlwKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gY2xpcC5zZWxlY3Rpb25cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWw9YXVkaW9DbGlwLnNlbGVjdGlvbjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9hdWRpb0RhdGEgPSBhdWRpb0RhdGE7XHJcbiAgICAgIHRoaXMuYXMuc2V0RGF0YSh0aGlzLl9hdWRpb0RhdGEpO1xyXG4gICAgICB0aGlzLnNvLnNldERhdGEodGhpcy5fYXVkaW9EYXRhKTtcclxuICAgICAgdGhpcy5zZWxlY3Rpbmc9bnVsbFxyXG4gICAgICB0aGlzLnNlbGVjdGlvbj1zZWxcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGxheUZyYW1lUG9zaXRpb24oKTogbnVtYmVyIHxudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBwbGF5RnJhbWVQb3NpdGlvbihwbGF5RnJhbWVQb3NpdGlvbjogbnVtYmVyfG51bGwpIHtcclxuICAgIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgICB0aGlzLmFzLnBsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgICB0aGlzLnNvLnBsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=