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
@@ -1,412 +0,0 @@
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
- this.dc.style.left = vbLeft + 'px';
237
- // top position
238
- const dTop = asH;
239
- const dTopStr = dTop + 'px';
240
- this.dc.style.top = dTopStr;
241
- // width
242
- this.dc.style.width = vbWidth + 'px';
243
- this.dc.width = vbWidth;
244
- // height
245
- this.dc.height = AudioClipUIContainer.DIVIDER_PIXEL_SIZE;
246
- this.dc.style.height = AudioClipUIContainer.DIVIDER_PIXEL_SIZE.toString() + 'px';
247
- this.drawDivider();
248
- // Virtual dimension, only width is used
249
- let virtualDim = new Dimension(ceBcrIntW, 0);
250
- // Visible bounds of container
251
- let br = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, ceBcrIntH));
252
- // Set container bounds
253
- this.layoutBounds(br, virtualDim, false);
254
- // Visible bounds of audiosignal
255
- let asR = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, asH));
256
- // Set audiosignal bounds
257
- this.as.layoutBounds(asR, virtualDim, redraw, clear);
258
- // Visible bounds of sonagram
259
- let soR = new Rectangle(new Position(vbLeft, soTop), new Dimension(vbWidth, soH));
260
- // Set sonagram bounds
261
- this.so.layoutBounds(soR, virtualDim, redraw, clear);
262
- }
263
- layoutScaled() {
264
- this._layout(false, false);
265
- }
266
- layout(clear = true) {
267
- if (this.ce && this.dc) {
268
- const clientW = this.ce.clientWidth;
269
- if (this._audioData) {
270
- if (this._fixFitToPanel) {
271
- // Set the virtual canvas width to the visible width
272
- this.ce.style.width = '100%';
273
- }
274
- else {
275
- if (this._xZoom) {
276
- // Set the virtual canvas width according to the value of the user selected xZoom value
277
- const newClW = Math.round(this._xZoom * this._audioData.duration);
278
- this.ce.style.width = newClW + 'px';
279
- }
280
- else {
281
- // Set the virtual canvas width to the visible width only
282
- this.ce.style.width = clientW + 'px';
283
- }
284
- }
285
- }
286
- this._layout(clear, true);
287
- }
288
- }
289
- set audioData(audioData) {
290
- this._audioClip = null;
291
- this._audioData = audioData;
292
- this.as.setData(audioData);
293
- this.so.setData(audioData);
294
- this.layout();
295
- }
296
- get audioData() {
297
- return this._audioData;
298
- }
299
- set audioClip(audioClip) {
300
- this._audioClip = audioClip;
301
- let audioData = null;
302
- let sel = null;
303
- if (audioClip) {
304
- audioData = audioClip.buffer;
305
- if (this._audioClip) {
306
- this._audioClip.addSelectionObserver((clip) => {
307
- this.selection = clip.selection;
308
- });
309
- }
310
- sel = audioClip.selection;
311
- }
312
- this._audioData = audioData;
313
- this.as.setData(this._audioData);
314
- this.so.setData(this._audioData);
315
- this.selecting = null;
316
- this.selection = sel;
317
- this.layout();
318
- }
319
- get playFramePosition() {
320
- return this._playFramePosition;
321
- }
322
- set playFramePosition(playFramePosition) {
323
- this._playFramePosition = playFramePosition;
324
- this.as.playFramePosition = playFramePosition;
325
- this.so.playFramePosition = playFramePosition;
326
- }
327
- }
328
- AudioClipUIContainer.DIVIDER_PIXEL_SIZE = 10;
329
- AudioClipUIContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: AudioClipUIContainer, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
330
- AudioClipUIContainer.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", 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: `
331
- <div #virtualCanvas>
332
- <canvas #divider (mousedown)="mousedown($event)" (mouseover)="mouseover($event)"
333
- (mouseleave)="mouseleave($event)" height="10"></canvas>
334
- <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
335
- <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
336
- </div>
337
- `, isInline: true, styles: ["div {\n\n margin: 0;\n padding: 0;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n position: relative; /* TODO container div position must not be 'static' (default) to act as reference for the canvases */\n box-sizing: border-box;\n transform: none;\n }", "canvas{\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n cursor: ns-resize;\n position: absolute;\n zIndex: 1;\n transform: none;\n }", "audio-signal {\n top: 0;\n left: 0;\n position: absolute;\n zIndex: 1;\n transform: none;\n }", "audio-sonagram {\n top: 0;\n left: 0;\n position: absolute;\n zIndex: 1;\n transform: none;\n }"], components: [{ type: i1.AudioSignal, selector: "audio-signal" }, { type: i2.Sonagram, selector: "audio-sonagram" }] });
338
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: AudioClipUIContainer, decorators: [{
339
- type: Component,
340
- args: [{
341
- selector: 'app-audio',
342
- template: `
343
- <div #virtualCanvas>
344
- <canvas #divider (mousedown)="mousedown($event)" (mouseover)="mouseover($event)"
345
- (mouseleave)="mouseleave($event)" height="10"></canvas>
346
- <audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
347
- <audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
348
- </div>
349
- `,
350
- styles: [`div {
351
-
352
- margin: 0;
353
- padding: 0;
354
- top: 0;
355
- left: 0;
356
- width: 100%;
357
- height: 100%;
358
- position: relative; /* TODO container div position must not be 'static' (default) to act as reference for the canvases */
359
- box-sizing: border-box;
360
- transform: none;
361
- }`, `canvas{
362
- top: 0;
363
- left: 0;
364
- width: 0;
365
- height: 0;
366
- cursor: ns-resize;
367
- position: absolute;
368
- zIndex: 1;
369
- transform: none;
370
- }`, `audio-signal {
371
- top: 0;
372
- left: 0;
373
- position: absolute;
374
- zIndex: 1;
375
- transform: none;
376
- }`, `audio-sonagram {
377
- top: 0;
378
- left: 0;
379
- position: absolute;
380
- zIndex: 1;
381
- transform: none;
382
- }`]
383
- }]
384
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { canvasRef: [{
385
- type: ViewChild,
386
- args: ['divider', { static: true }]
387
- }], ceRef: [{
388
- type: ViewChild,
389
- args: ['virtualCanvas', { static: true }]
390
- }], as: [{
391
- type: ViewChild,
392
- args: [AudioSignal, { static: true }]
393
- }], so: [{
394
- type: ViewChild,
395
- args: [Sonagram, { static: true }]
396
- }], selectionEventEmitter: [{
397
- type: Output
398
- }], onResize: [{
399
- type: HostListener,
400
- args: ['window:resize', ['$event']]
401
- }], onMouseup: [{
402
- type: HostListener,
403
- args: ['document:mouseup', ['$event']]
404
- }], onMousemove: [{
405
- type: HostListener,
406
- args: ['document:mousemove', ['$event']]
407
- }], audioData: [{
408
- type: Input
409
- }], audioClip: [{
410
- type: Input
411
- }] } });
412
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3VpL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ3NCLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFDN0UsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQ25DLE9BQU8sRUFBUyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFFdEMsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckUsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7Ozs7QUFjeEUsQ0FBQztBQWdCRCxDQUFDO0FBRUYsNEJBQTRCO0FBQzVCLGdDQUFnQztBQUNoQyxtREFBbUQ7QUFDbkQsdUVBQXVFO0FBQ3ZFLG1DQUFtQztBQUNuQywwQkFBMEI7QUFDMUIsSUFBSTtBQUVKOzs7Ozs7O0dBT0c7QUErQ0gsTUFBTSxPQUFPLG9CQUFxQixTQUFRLDhCQUE4QjtJQTBEdEUsWUFBb0IsR0FBZTtRQUNqQyxLQUFLLEVBQUUsQ0FBQTtRQURXLFFBQUcsR0FBSCxHQUFHLENBQVk7UUF6QzNCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ3pDLFlBQU8sR0FBYyxJQUFJLENBQUM7UUFDMUIsY0FBUyxHQUFpQixJQUFJLENBQUM7UUFDL0IsY0FBUyxHQUFpQixJQUFJLENBQUM7UUFDckIsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUN4RCx1QkFB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QVM7bUJBQUM7b0JBRVQsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFFBQVEsRUFBRTs7Ozs7OztHQU9UO29CQUNELE1BQU0sRUFBRSxDQUFDOzs7Ozs7Ozs7OztJQVdQLEVBQUU7Ozs7Ozs7OztJQVNGLEVBQUU7Ozs7OztJQU1GLEVBQUU7Ozs7OztJQU1GLENBQUM7aUJBRUo7aUdBUXlDLFNBQVM7c0JBQWhELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJUSxLQUFLO3NCQUFsRCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR0YsRUFBRTtzQkFBM0MsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNELEVBQUU7c0JBQXhDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFNM0IscUJBQXFCO3NCQUE5QixNQUFNO2dCQStFUCxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW9CekMsU0FBUztzQkFEUixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVk1QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMk0xQyxTQUFTO3NCQURaLEtBQUs7Z0JBY0YsU0FBUztzQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtBdWRpb1NpZ25hbH0gZnJvbSAnLi9hdWRpb3NpZ25hbCdcclxuaW1wb3J0IHtTb25hZ3JhbX0gZnJvbSAnLi9zb25hZ3JhbSdcclxuaW1wb3J0IHtNYXJrZXIsIFBvaW50fSBmcm9tICcuL2NvbW1vbidcclxuXHJcbmltcG9ydCB7Q29tcG9uZW50LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1Bvc2l0aW9uLERpbWVuc2lvbiwgUmVjdGFuZ2xlfSBmcm9tIFwiLi4vLi4vbWF0aC8yZC9nZW9tZXRyeVwiO1xyXG5pbXBvcnQge0F1ZGlvQ2xpcCxTZWxlY3Rpb259IGZyb20gXCIuLi9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtCYXNpY0F1ZGlvQ2FudmFzTGF5ZXJDb21wb25lbnR9IGZyb20gXCIuL2F1ZGlvX2NhbnZhc19sYXllcl9jb21wXCI7XHJcbmltcG9ydCB7RWxlbWVudH0gZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyXCI7XHJcblxyXG4vKlxyXG4gIFJlc2l6ZU9ic2VydmVyIG5vdCB5ZXQgYXZhaWxhYmxlIGluIG9mZmljaWFsIFR5cGVzY3JpcHQgZGVjbGFyYXRpb25cclxuICBDcnJlYXRlZCBkZWNsYXJhdGlvbiBmcm9tIElETCB1bnRpbCBpdHMgYXZhaWxhYmxlLlxyXG4gIFNlZSBzcGVjczpcclxuICBodHRwczovL3d3dy53My5vcmcvVFIvcmVzaXplLW9ic2VydmVyXHJcblxyXG4gKi9cclxuXHJcbmludGVyZmFjZSBSZXNpemVPYnNlcnZlclNpemUge1xyXG4gIHJlYWRvbmx5IGlubGluZVNpemU6bnVtYmVyO1xyXG4gIHJlYWRvbmx5IGJsb2NrU2l6ZTpudW1iZXI7XHJcbn07XHJcblxyXG5kZWNsYXJlIGludGVyZmFjZSBSZXNpemVPYnNlcnZlckVudHJ5e1xyXG4gIHJlYWRvbmx5IHRhcmdldDogRWxlbWVudDtcclxuICByZWFkb25seSBjb250ZW50UmVjdDogRE9NUmVjdFJlYWRPbmx5IDtcclxuICByZWFkb25seSBib3JkZXJCb3hTaXplOiBBcnJheTxSZXNpemVPYnNlcnZlclNpemU+IDtcclxuICByZWFkb25seSBjb250ZW50Qm94U2l6ZTogQXJyYXk8UmVzaXplT2JzZXJ2ZXJTaXplPiA7XHJcbiAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZTogQXJyYXk8UmVzaXplT2JzZXJ2ZXJTaXplPiA7XHJcbn1cclxuXHJcbmRlY2xhcmUgaW50ZXJmYWNlIFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2sge1xyXG4gIChlbnRyaWVzOiBBcnJheTxSZXNpemVPYnNlcnZlckVudHJ5Piwgb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyKTp2b2lkO1xyXG59XHJcblxyXG5kZWNsYXJlIGVudW0gUmVzaXplT2JzZXJ2ZXJCb3hPcHRpb25zIHtcclxuICBcImJvcmRlci1ib3hcIiwgXCJjb250ZW50LWJveFwiLCBcImRldmljZS1waXhlbC1jb250ZW50LWJveFwiXHJcbn07XHJcblxyXG4vLyAvLyBEZWNsYXJlIFJlc2l6ZW9ic2VydmVyXHJcbi8vIGRlY2xhcmUgY2xhc3MgUmVzaXplT2JzZXJ2ZXJ7XHJcbi8vICAgY29uc3RydWN0b3IoY2FsbGJhY2s6IFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2spO1xyXG4vLyAgIG9ic2VydmU6IChlbDpFbGVtZW50LG9wdHM6IFJlc2l6ZU9ic2VydmVyQm94T3B0aW9ucyB8IG51bGwpPT52b2lkO1xyXG4vLyAgIHVub2JzZXJ2ZTogKGVsOkVsZW1lbnQpPT52b2lkO1xyXG4vLyAgIGRpc2Nvbm5lY3Q6ICgpPT52b2lkO1xyXG4vLyB9XHJcblxyXG4vKlxyXG4gKiBDb250YWluZXIgY29tcG9uZW50IGZvciBhdWRpbyBkaXNwbGF5LlxyXG4gKiBUaGUgZGlzcGxheSBlbGVtZW50cyBhcmUgY2hpbGRyZW4gb2YgYSB2aXJ0dWFsIGNhbnZhcy4gVGhlIHZpcnR1YWwgY2FudmFzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGhhdmUgaGlnaCB6b29tIGZhY3RvcnMgd2l0aCB2ZXJ5IHdpZGUgdmlydHVhbCBhdWRpbyBkaXNwbGF5cy5cclxuICogT25seSB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSB2aXJ0dWFsIGNhbnZhcyBpcyBpbXBsZW1lbnRlZCBhcyBhIGJyb3dzZXIgY2FudmFzIGFuZCB0aGVyZWZvcmUgY29uc3VtaW5nIG1lbW9yeS5cclxuICogVGhlIHZpc2libGUgcGFydCBoYXMgdGhlIHNhbWUgd2lkdGggYXMgdGhlIHZpZXdwb3J0IG9mIHRoZSBzY3JvbGwgcGFuZSBwYXJlbnQuXHJcbiAqIFRoZSB2aXJ0dWFsIGNhbnZhcyBpdHNlbGYgaXMgaW1wbGVtZW50ZWQgYXMgYSBIVE1MIGRpdiBlbGVtZW50LlxyXG4gKiBUaGUgbGF5b3V0IG9mIHRoZSBjb21wb25lbnQgaXMgdXBkYXRlZCBvbiByZXNpemUgb2YgdGhlIHBhcmVudCBvciBjaGFuZ2VzIG9mIHRoZSB6b29tIGZhY3Rvci5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1hdWRpbycsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgI3ZpcnR1YWxDYW52YXM+XHJcbiAgICA8Y2FudmFzICNkaXZpZGVyIChtb3VzZWRvd24pPVwibW91c2Vkb3duKCRldmVudClcIiAobW91c2VvdmVyKT1cIm1vdXNlb3ZlcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwibW91c2VsZWF2ZSgkZXZlbnQpXCIgaGVpZ2h0PVwiMTBcIj48L2NhbnZhcz5cclxuICAgIDxhdWRpby1zaWduYWwgW3BvaW50ZXJQb3NpdGlvbl09XCJwb2ludGVyXCIgW3NlbGVjdGluZ109XCJzZWxlY3RpbmdcIiBbc2VsZWN0aW9uXT1cInNlbGVjdGlvblwiIChwb2ludGVyUG9zaXRpb25FdmVudEVtaXR0ZXIpPVwicG9pbnRlclBvc2l0aW9uQ2hhbmdlZCgkZXZlbnQpXCIgKHNlbGVjdGluZ0V2ZW50RW1pdHRlcik9XCJzZWxlY3RpbmdDaGFuZ2VkKCRldmVudClcIiAoc2VsZWN0ZWRFdmVudEVtaXR0ZXIpPVwic2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQpXCI+PC9hdWRpby1zaWduYWw+XHJcbiAgICA8YXVkaW8tc29uYWdyYW0gW3BvaW50ZXJQb3NpdGlvbl09XCJwb2ludGVyXCIgW3NlbGVjdGluZ109XCJzZWxlY3RpbmdcIiBbc2VsZWN0aW9uXT1cInNlbGVjdGlvblwiIChwb2ludGVyUG9zaXRpb25FdmVudEVtaXR0ZXIpPVwicG9pbnRlclBvc2l0aW9uQ2hhbmdlZCgkZXZlbnQpXCIgKHNlbGVjdGluZ0V2ZW50RW1pdHRlcik9XCJzZWxlY3RpbmdDaGFuZ2VkKCRldmVudClcIiAoc2VsZWN0ZWRFdmVudEVtaXR0ZXIpPVwic2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQpXCI+PC9hdWRpby1zb25hZ3JhbT5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYGRpdiB7XHJcblxyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogVE9ETyBjb250YWluZXIgZGl2IHBvc2l0aW9uIG11c3Qgbm90IGJlICdzdGF0aWMnIChkZWZhdWx0KSB0byBhY3QgYXMgcmVmZXJlbmNlIGZvciB0aGUgY2FudmFzZXMgKi9cclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICB0cmFuc2Zvcm06IG5vbmU7XHJcbiAgfWAsIGBjYW52YXN7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBoZWlnaHQ6IDA7XHJcbiAgICBjdXJzb3I6IG5zLXJlc2l6ZTtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHpJbmRleDogMTtcclxuICAgIHRyYW5zZm9ybTogbm9uZTtcclxuICB9YCwgYGF1ZGlvLXNpZ25hbCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgekluZGV4OiAxO1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gIH1gLCBgYXVkaW8tc29uYWdyYW0ge1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHpJbmRleDogMTtcclxuICAgIHRyYW5zZm9ybTogbm9uZTtcclxuICB9YF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NsaXBVSUNvbnRhaW5lciBleHRlbmRzIEJhc2ljQXVkaW9DYW52YXNMYXllckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCxBZnRlclZpZXdJbml0e1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBESVZJREVSX1BJWEVMX1NJWkUgPSAxMDtcclxuXHJcbiAgcGFyZW50RTogSFRNTEVsZW1lbnQ7XHJcblxyXG4gIC8vIERpdmlkZXIgY2FudmFzXHJcbiAgQFZpZXdDaGlsZCgnZGl2aWRlcicsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgZGMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgLy8gVmlydHVhbCBjb250YWluZXJcclxuICBAVmlld0NoaWxkKCd2aXJ0dWFsQ2FudmFzJywgeyBzdGF0aWM6IHRydWUgfSkgY2VSZWYhOiBFbGVtZW50UmVmO1xyXG4gIGNlITogSFRNTERpdkVsZW1lbnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoQXVkaW9TaWduYWwsIHsgc3RhdGljOiB0cnVlIH0pIGFzITogQXVkaW9TaWduYWw7XHJcbiAgQFZpZXdDaGlsZChTb25hZ3JhbSwgeyBzdGF0aWM6IHRydWUgfSkgc28hOiBTb25hZ3JhbTtcclxuXHJcbiAgcHJpdmF0ZSBfYXVkaW9DbGlwOkF1ZGlvQ2xpcCB8IG51bGw9bnVsbDtcclxuICBwb2ludGVyOiBNYXJrZXJ8bnVsbD1udWxsO1xyXG4gIHNlbGVjdGluZzogU2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICBzZWxlY3Rpb246IFNlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uPigpO1xyXG4gIHByaXZhdGUgX3BsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0TW91c2VZOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGRyYWdTdGFydFk6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZGl2aWRlclBvc2l0aW9uID0gMC41O1xyXG5cclxuICB1c2VyQWN0aW9uPWZhbHNlO1xyXG5cclxuICBwcml2YXRlIF94Wm9vbTogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIHBpeGVscyBwZXIgc2Vjb25kXHJcblxyXG4gIGdldCB4Wm9vbSgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl94Wm9vbTtcclxuICB9XHJcblxyXG4gIHNldCB4Wm9vbSh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xyXG4gICAgdGhpcy51c2VyQWN0aW9uPXRydWU7XHJcbiAgICB0aGlzLl94Wm9vbSA9IHZhbHVlO1xyXG4gICAgdGhpcy5sYXlvdXQoKVxyXG4gICAgdGhpcy51c2VyQWN0aW9uPWZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gaWYgdHJ1ZSB0aGUgY29tcGxldGUgYXVkaW8gZmlsZSBpcyBzaG93biwgdGhlIGRpc3BsYXkgZml0cyB0byB0aGUgdmlzaWJsZSBwYW5lbCwgdGhlIHgtem9vbSBmYWN0b3IgaXMgdmFyaWFibGUsIHRoaXMgaXMgdGhlIGRlZmF1bHRcclxuICBwcml2YXRlIF9maXhGaXRUb1BhbmVsID0gdHJ1ZTtcclxuXHJcbiAgc2V0IGZpeEZpdFRvUGFuZWwodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2ZpeEZpdFRvUGFuZWwgPSB2YWx1ZTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvLyB3ZSBkb24ndCBuZWVkICBjbGlwIGJvdW5kc1xyXG4gICAgICB0aGlzLmJvdW5kcz1udWxsO1xyXG4gICAgICB0aGlzLl94Wm9vbSA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBob2xkIGN1cnJlbnQgem9vbSB2YWx1ZVxyXG4gICAgICAvL3RoaXMuX3hab29tPXRoaXMuY2Uub2Zmc2V0V2lkdGgvdGhpcy5fYXVkaW9EYXRhLmR1cmF0aW9uO1xyXG4gICAgfVxyXG4gICAgdGhpcy5sYXlvdXQoKVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYpIHtcclxuICAgIHN1cGVyKClcclxuICAgIHRoaXMucGFyZW50RSA9IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY2UgPSB0aGlzLmNlUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB0aGlzLmRjID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgICBsZXQgaGVpZ2h0TGlzdGVuZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXJzOiBBcnJheTxNdXRhdGlvblJlY29yZD4sIG1vOiBNdXRhdGlvbk9ic2VydmVyKSA9PiB7XHJcblxyXG4gICAgICBsZXQgbGF5b3V0PWZhbHNlO1xyXG4gICAgICBtcnMuZm9yRWFjaCgobXI6IE11dGF0aW9uUmVjb3JkKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJBY3Rpb24gJiYgJ2F0dHJpYnV0ZXMnID09PSBtci50eXBlICYmICgnY2xhc3MnID09PSBtci5hdHRyaWJ1dGVOYW1lIHx8ICdzdHlsZScgPT09IG1yLmF0dHJpYnV0ZU5hbWUpKSB7XHJcbiAgICAgICAgICBsYXlvdXQ9dHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZihsYXlvdXQpe1xyXG4gICAgICAgIC8vIHJlLWxheW91dCByZXF1aXJlZFxyXG4gICAgICAgIHRoaXMubGF5b3V0KGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaGVpZ2h0TGlzdGVuZXIub2JzZXJ2ZSh0aGlzLmNlLCB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XHJcbiAgICBoZWlnaHRMaXN0ZW5lci5vYnNlcnZlKHRoaXMuZGMsIHthdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWV9KTtcclxuXHJcbiAgICBsZXQgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMsb2JzKSA9PiB7XHJcbiAgICAgIC8vY29uc29sZS5sb2coXCJSZXNpemUgb2JzZXJ2ZWQ6XCIpO1xyXG4gICAgICBlbnRyaWVzLmZvckVhY2goKGUpPT57XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhlLmNvbnRlbnRSZWN0LndpZHRoK1wieFwiK2UuY29udGVudFJlY3QuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNlKTtcclxuXHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBtb3VzZW92ZXIobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZGl2aWRlckN1cnNvclBvc2l0aW9uKG1lLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIG1vdXNlbGVhdmUobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZGl2aWRlckN1cnNvclBvc2l0aW9uKG1lLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBtb3VzZWRvd24obWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0TW91c2VZID0gbWUuY2xpZW50WTtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IHRoaXMuZGMub2Zmc2V0VG9wO1xyXG4gICAgdGhpcy5kcmFnU3RhcnRNb3VzZVkgPSBtZS5jbGllbnRZO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZXVwKG1lOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5kcmFnU3RhcnRZICE9IG51bGwpIHtcclxuICAgICAgdGhpcy51c2VyQWN0aW9uPXRydWU7XHJcbiAgICAgIHRoaXMuZGl2aWRlckRyYWcobWUpO1xyXG4gICAgICB0aGlzLmxheW91dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IG51bGw7XHJcbiAgICAgIHRoaXMudXNlckFjdGlvbj1mYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZW1vdmUobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRyYWdTdGFydFkgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnVzZXJBY3Rpb249dHJ1ZTtcclxuICAgICAgdGhpcy5kaXZpZGVyRHJhZyhtZSk7XHJcbiAgICAgIHRoaXMubGF5b3V0U2NhbGVkKCk7XHJcbiAgICAgIHRoaXMudXNlckFjdGlvbj10cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcG9pbnRlclBvc2l0aW9uQ2hhbmdlZChwcDpNYXJrZXIpe1xyXG4gICAgdGhpcy5wb2ludGVyPXBwXHJcbiAgfVxyXG5cclxuICBzZWxlY3RpbmdDaGFuZ2VkKHM6U2VsZWN0aW9ufCBudWxsKXtcclxuICAgIHRoaXMuc2VsZWN0aW5nPXNcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZWQoczpTZWxlY3Rpb24pe1xyXG4gICAgdGhpcy5zZWxlY3Rpb249c1xyXG4gICAgaWYodGhpcy5fYXVkaW9DbGlwKXtcclxuICAgICAgdGhpcy5fYXVkaW9DbGlwLnNlbGVjdGlvbj1zXHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGlvbkV2ZW50RW1pdHRlci5lbWl0KHRoaXMuc2VsZWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYW52YXNNb3VzZVBvcyhjOiBIVE1MQ2FudmFzRWxlbWVudCwgZTogTW91c2VFdmVudCk6IFBvaW50IHtcclxuICAgIGNvbnN0IGNyID0gYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHggPSBlLnggLSBjci5sZWZ0O1xyXG4gICAgY29uc3QgeSA9IGUueSAtIGNyLnRvcDtcclxuICAgIHJldHVybiBuZXcgUG9pbnQoeCx5KTtcclxuICB9XHJcblxyXG4gIGRpdmlkZXJDdXJzb3JQb3NpdGlvbihlOiBNb3VzZUV2ZW50LCBzaG93OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5kYykge1xyXG5cclxuICAgICAgY29uc3QgdyA9IHRoaXMuZGMud2lkdGg7XHJcbiAgICAgIGNvbnN0IGggPSB0aGlzLmRjLmhlaWdodDtcclxuICAgICAgY29uc3QgZyA9IHRoaXMuZGMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAgIGNvbnN0IHBwID0gdGhpcy5jYW52YXNNb3VzZVBvcyh0aGlzLmRjLCBlKTtcclxuICAgICAgY29uc3Qgb2ZmWCA9IGUub2Zmc2V0WCAtIHRoaXMuZGMub2Zmc2V0TGVmdDtcclxuICAgICAgY29uc3Qgb2ZmWSA9IGUub2Zmc2V0WSAtIHRoaXMuZGMub2Zmc2V0VG9wO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRpdmlkZXJEcmFnKGU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRjICYmIHRoaXMuZHJhZ1N0YXJ0TW91c2VZICYmIHRoaXMuZHJhZ1N0YXJ0WSkge1xyXG5cclxuICAgICAgY29uc3QgZHJhZ09mZnNldCA9IGUuY2xpZW50WSAtIHRoaXMuZHJhZ1N0YXJ0TW91c2VZO1xyXG4gICAgICBjb25zdCBjZUhlaWdodCA9IHRoaXMuY2Uub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgbGV0IG5ld1RvcCA9ICh0aGlzLmRyYWdTdGFydFkgKyBkcmFnT2Zmc2V0KTtcclxuICAgICAgaWYgKG5ld1RvcCA8IDApIHtcclxuICAgICAgICBuZXdUb3AgPSAwO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChuZXdUb3AgPiBjZUhlaWdodCAtIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSkge1xyXG4gICAgICAgIG5ld1RvcCA9IGNlSGVpZ2h0IC0gQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGMuc3R5bGUudG9wID0gbmV3VG9wLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgICB0aGlzLmRpdmlkZXJQb3NpdGlvbiA9ICh0aGlzLmRjLm9mZnNldFRvcCArIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSAvIDIpIC8gY2VIZWlnaHQ7XHJcbiAgICAgIGlmICh0aGlzLmRpdmlkZXJQb3NpdGlvbiA+IDEuMCkge1xyXG4gICAgICAgIHRoaXMuZGl2aWRlclBvc2l0aW9uID0gMS4wO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmRpdmlkZXJQb3NpdGlvbiA8IDAuMCkge1xyXG4gICAgICAgIHRoaXMuZGl2aWRlclBvc2l0aW9uID0gMC4wO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZHJhd0RpdmlkZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBkcmF3RGl2aWRlcigpIHtcclxuICAgIGNvbnN0IHcgPSB0aGlzLmRjLndpZHRoO1xyXG4gICAgY29uc3QgaCA9IHRoaXMuZGMuaGVpZ2h0O1xyXG4gICAgY29uc3QgZyA9IHRoaXMuZGMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIGlmIChnICYmIHc+MTAgJiYgaD49MSkge1xyXG4gICAgICBnLmZpbGxTdHlsZSA9ICd3aGl0ZSc7XHJcbiAgICAgIGcuZmlsbFJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgIGcuZmlsbFN0eWxlID0gJ2JsYWNrJztcclxuICAgICAgZy5maWxsUmVjdCg1LCA1LCB3IC0gMTAsIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xpcEJvdW5kcyhjbGlwQm91bmRzOiBSZWN0YW5nbGUpIHtcclxuICAgIHRoaXMuYm91bmRzID0gY2xpcEJvdW5kcztcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBjdXJyZW50WFpvb20oKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBsZXQgeHogPSB0aGlzLl94Wm9vbTtcclxuICAgIGlmICh4ej09bnVsbCAmJiB0aGlzLl9hdWRpb0RhdGEpIHtcclxuICAgICAgbGV0IG93ID0gdGhpcy5jZS5vZmZzZXRXaWR0aDtcclxuICAgICAgaWYgKG93IDwgMSkge1xyXG4gICAgICAgIC8vIGF0IGxlYXN0IG9uZSBwaXhlbCB3aWR0aCB0byBhdm9pZCB4LXpvb20gemVybyB2YWx1ZXNcclxuICAgICAgICBvdyA9IDE7XHJcbiAgICAgIH1cclxuICAgICAgeHogPSBvdyAvIHRoaXMuX2F1ZGlvRGF0YS5kdXJhdGlvbjtcclxuICAgIH1cclxuICAgIHJldHVybiB4ejtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xheW91dChjbGVhcjogYm9vbGVhbiwgcmVkcmF3OiBib29sZWFuKSB7XHJcbiAgICBsZXQgY2VCY3IgPSB0aGlzLmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIGNvbnN0IGNlQmNySW50VyA9IE1hdGguZmxvb3IoY2VCY3Iud2lkdGgpO1xyXG4gICAgY29uc3QgY2VCY3JJbnRIID0gTWF0aC5mbG9vcihjZUJjci5oZWlnaHQpO1xyXG5cclxuICAgIC8vIGhlaWdodCBhdmFpbGFibGUgZm9yIHBsdWdpbnMgKGF1ZGlvc2lnbmFsIGFuZCBzb25hZ3JhbSlcclxuICAgIGxldCBwc0ggPSBjZUJjckludEggLSBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkU7XHJcbiAgICBpZiAocHNIIDwgMCkge1xyXG4gICAgICBwc0ggPSAwO1xyXG4gICAgfVxyXG4gICAgLy8gYXVkaW8gc2lnbmFsIGhlaWdodFxyXG4gICAgY29uc3QgYXNIID0gTWF0aC5yb3VuZChwc0ggKiB0aGlzLmRpdmlkZXJQb3NpdGlvbik7XHJcblxyXG4gICAgLy8gc29uYWdyYW0gaGVpZ2h0IChyZXN0OiBhdmFpbGFibGUgaGVpZ2h0IG1pbnVzIGRpdmlkZXIgaGVpZ2h0IG1pbnVzIGF1ZGlvc2lnbmFsIGhlaWdodClcclxuICAgIGxldCBzb0ggPSBjZUJjckludEggLSBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkUgLSBhc0g7XHJcbiAgICBpZiAoc29IIDwgMCkge1xyXG4gICAgICBzb0ggPSAwO1xyXG4gICAgfVxyXG5cclxuICAvLyBzb25hZ3JhbSB0b3AgcG9zaXRpb25cclxuICAgIGNvbnN0IHNvVG9wID0gYXNIICsgQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFO1xyXG5cclxuICAgIC8vIFZpc2libGUgYm91bmRzXHJcbiAgICAvLyBsZWZ0IHBvc2l0aW9uXHJcbiAgICBsZXQgdmJMZWZ0ID0gMDtcclxuICAgIC8vIHdpZHRoXHJcbiAgICBsZXQgdmJXaWR0aCA9IGNlQmNySW50VztcclxuICAgIGlmICghdGhpcy5fZml4Rml0VG9QYW5lbCAmJiB0aGlzLmJvdW5kcykge1xyXG4gICAgICB2YkxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLmxlZnQpO1xyXG4gICAgICB2YldpZHRoID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERpdmlkZXJcclxuICAgIC8vIGxlZnQgcG9zaXRpb25cclxuICAgIHRoaXMuZGMuc3R5bGUubGVmdCA9IHZiTGVmdCArICdweCc7XHJcbiAgICAvLyB0b3AgcG9zaXRpb25cclxuICAgIGNvbnN0IGRUb3AgPSBhc0g7XHJcbiAgICBjb25zdCBkVG9wU3RyID0gZFRvcCArICdweCc7XHJcbiAgICB0aGlzLmRjLnN0eWxlLnRvcCA9IGRUb3BTdHI7XHJcbiAgICAvLyB3aWR0aFxyXG4gICAgdGhpcy5kYy5zdHlsZS53aWR0aCA9IHZiV2lkdGggKyAncHgnO1xyXG4gICAgdGhpcy5kYy53aWR0aCA9IHZiV2lkdGg7XHJcbiAgICAvLyBoZWlnaHRcclxuICAgIHRoaXMuZGMuaGVpZ2h0ID0gQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFO1xyXG4gICAgdGhpcy5kYy5zdHlsZS5oZWlnaHQgPSBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkUudG9TdHJpbmcoKSArICdweCc7XHJcblxyXG4gICAgdGhpcy5kcmF3RGl2aWRlcigpO1xyXG5cclxuXHJcbiAgICAvLyBWaXJ0dWFsIGRpbWVuc2lvbiwgb25seSB3aWR0aCBpcyB1c2VkXHJcbiAgICBsZXQgdmlydHVhbERpbSA9IG5ldyBEaW1lbnNpb24oY2VCY3JJbnRXLCAwKVxyXG5cclxuICAgIC8vIFZpc2libGUgYm91bmRzIG9mIGNvbnRhaW5lclxyXG4gICAgbGV0IGJyID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odmJMZWZ0LCAwKSwgbmV3IERpbWVuc2lvbih2YldpZHRoLCBjZUJjckludEgpKTtcclxuXHJcbiAgICAvLyBTZXQgY29udGFpbmVyIGJvdW5kc1xyXG4gICAgdGhpcy5sYXlvdXRCb3VuZHMoYnIsIHZpcnR1YWxEaW0sIGZhbHNlKTtcclxuXHJcbiAgICAvLyBWaXNpYmxlIGJvdW5kcyBvZiBhdWRpb3NpZ25hbFxyXG4gICAgbGV0IGFzUiA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHZiTGVmdCwgMCksIG5ldyBEaW1lbnNpb24odmJXaWR0aCwgYXNIKSk7XHJcblxyXG4gICAgLy8gU2V0IGF1ZGlvc2lnbmFsIGJvdW5kc1xyXG4gICAgdGhpcy5hcy5sYXlvdXRCb3VuZHMoYXNSLCB2aXJ0dWFsRGltLCByZWRyYXcsIGNsZWFyKTtcclxuXHJcbiAgICAvLyBWaXNpYmxlIGJvdW5kcyBvZiBzb25hZ3JhbVxyXG4gICAgbGV0IHNvUiA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHZiTGVmdCwgc29Ub3ApLCBuZXcgRGltZW5zaW9uKHZiV2lkdGgsIHNvSCkpO1xyXG5cclxuICAgIC8vIFNldCBzb25hZ3JhbSBib3VuZHNcclxuICAgIHRoaXMuc28ubGF5b3V0Qm91bmRzKHNvUiwgdmlydHVhbERpbSwgcmVkcmF3LCBjbGVhcik7XHJcbiAgfVxyXG5cclxuICBsYXlvdXRTY2FsZWQoKSB7XHJcbiAgICB0aGlzLl9sYXlvdXQoZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGxheW91dChjbGVhcj10cnVlKSB7XHJcblxyXG4gICAgaWYodGhpcy5jZSAmJiB0aGlzLmRjKSB7XHJcbiAgICAgIGNvbnN0IGNsaWVudFc9dGhpcy5jZS5jbGllbnRXaWR0aDtcclxuICAgICAgaWYodGhpcy5fYXVkaW9EYXRhKXtcclxuICAgICAgICBpZih0aGlzLl9maXhGaXRUb1BhbmVsKSB7XHJcbiAgICAgICAgICAvLyBTZXQgdGhlIHZpcnR1YWwgY2FudmFzIHdpZHRoIHRvIHRoZSB2aXNpYmxlIHdpZHRoXHJcbiAgICAgICAgICB0aGlzLmNlLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3hab29tKSB7XHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgdmlydHVhbCBjYW52YXMgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdXNlciBzZWxlY3RlZCB4Wm9vbSB2YWx1ZVxyXG4gICAgICAgICAgICBjb25zdCBuZXdDbFcgPSBNYXRoLnJvdW5kKCB0aGlzLl94Wm9vbSp0aGlzLl9hdWRpb0RhdGEuZHVyYXRpb24gKTtcclxuICAgICAgICAgICAgdGhpcy5jZS5zdHlsZS53aWR0aCA9IG5ld0NsVyArICdweCc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHZpcnR1YWwgY2FudmFzIHdpZHRoIHRvIHRoZSB2aXNpYmxlIHdpZHRoIG9ubHlcclxuICAgICAgICAgICAgdGhpcy5jZS5zdHlsZS53aWR0aCA9IGNsaWVudFcgKyAncHgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9sYXlvdXQoY2xlYXIsdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBhdWRpb0RhdGEoYXVkaW9EYXRhOiBBdWRpb0J1ZmZlciB8IG51bGwpIHtcclxuICAgIHRoaXMuX2F1ZGlvQ2xpcD1udWxsXHJcbiAgICB0aGlzLl9hdWRpb0RhdGE9YXVkaW9EYXRhO1xyXG4gICAgdGhpcy5hcy5zZXREYXRhKGF1ZGlvRGF0YSk7XHJcbiAgICB0aGlzLnNvLnNldERhdGEoYXVkaW9EYXRhKTtcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaW9EYXRhKCk6QXVkaW9CdWZmZXJ8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9hdWRpb0RhdGFcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGF1ZGlvQ2xpcChhdWRpb0NsaXA6IEF1ZGlvQ2xpcCB8IG51bGwpIHtcclxuICAgIHRoaXMuX2F1ZGlvQ2xpcD1hdWRpb0NsaXBcclxuICAgICAgbGV0IGF1ZGlvRGF0YTpBdWRpb0J1ZmZlcnxudWxsPW51bGw7XHJcbiAgICBsZXQgc2VsOlNlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgICAgIGlmKGF1ZGlvQ2xpcCkge1xyXG4gICAgICAgIGF1ZGlvRGF0YSA9IGF1ZGlvQ2xpcC5idWZmZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuX2F1ZGlvQ2xpcCkge1xyXG4gICAgICAgICAgdGhpcy5fYXVkaW9DbGlwLmFkZFNlbGVjdGlvbk9ic2VydmVyKChjbGlwKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gY2xpcC5zZWxlY3Rpb25cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWw9YXVkaW9DbGlwLnNlbGVjdGlvbjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9hdWRpb0RhdGEgPSBhdWRpb0RhdGE7XHJcbiAgICAgIHRoaXMuYXMuc2V0RGF0YSh0aGlzLl9hdWRpb0RhdGEpO1xyXG4gICAgICB0aGlzLnNvLnNldERhdGEodGhpcy5fYXVkaW9EYXRhKTtcclxuICAgICAgdGhpcy5zZWxlY3Rpbmc9bnVsbFxyXG4gICAgICB0aGlzLnNlbGVjdGlvbj1zZWxcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGxheUZyYW1lUG9zaXRpb24oKTogbnVtYmVyIHxudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9wbGF5RnJhbWVQb3NpdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBwbGF5RnJhbWVQb3NpdGlvbihwbGF5RnJhbWVQb3NpdGlvbjogbnVtYmVyfG51bGwpIHtcclxuICAgIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgICB0aGlzLmFzLnBsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgICB0aGlzLnNvLnBsYXlGcmFtZVBvc2l0aW9uID0gcGxheUZyYW1lUG9zaXRpb247XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=