@foblex/flow 17.9.0 → 17.9.2

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.
package/README.md CHANGED
@@ -16,7 +16,7 @@
16
16
  ## Welcome to Foblex Flow
17
17
 
18
18
  Foblex Flow is an [Angular](https://angular.dev/) library built to simplify the creation and management of dynamic, interactive flows.
19
- Whether you're developing complex systems or lightweight visualizations, Foblex Flow provides a robust set of tools to help automate node manipulation and inter-node connections with ease. It's fully compatible with Angular 12+, Server-Side Rendering (SSR), and the Composition API.
19
+ Whether you're developing complex systems or lightweight visualizations, Foblex Flow provides a robust set of tools to help automate node manipulation and inter-node connections with ease. It's fully compatible with Angular 15+, Server-Side Rendering (SSR), and the Composition API.
20
20
 
21
21
  ### Examples
22
22
 
@@ -1,4 +1,3 @@
1
- import { ICanRunOutsideAngular } from './i-can-run-outside-angular';
2
1
  import { IPointerEvent } from './pointer-events';
3
2
  export declare const MOUSE_EVENT_IGNORE_TIME = 800;
4
3
  /**
@@ -7,56 +6,54 @@ export declare const MOUSE_EVENT_IGNORE_TIME = 800;
7
6
  * and provides abstract methods for derived classes to implement specific behaviors.
8
7
  */
9
8
  export declare abstract class DragAndDropBase {
10
- protected ngZone: ICanRunOutsideAngular | undefined;
11
- abstract hostElement: HTMLElement;
12
- private document;
13
- private mouseListeners;
14
- private touchListeners;
15
- private startListeners;
16
- isSyntheticEvent(event: MouseEvent): boolean;
17
- private lastTouchEventTime;
9
+ private readonly _document;
10
+ private readonly _ngZone;
11
+ private _mouseListeners;
12
+ private _touchListeners;
13
+ private _startListeners;
14
+ isSyntheticEvent(_event: MouseEvent): boolean;
15
+ private _lastTouchEventTime;
18
16
  isDragStarted: boolean;
19
- private dragStartThreshold;
20
- private dragStartDelay;
21
- private dragStartTime;
22
- private dragStartPosition;
17
+ private _dragStartThreshold;
18
+ private _dragStartDelay;
19
+ private _dragStartTime;
20
+ private _dragStartPosition;
23
21
  abstract disabled: boolean;
24
- private moveHandler;
25
- private pointerDownElement;
26
- protected constructor(ngZone: ICanRunOutsideAngular | undefined);
22
+ private _moveHandler;
23
+ private _pointerDownElement;
27
24
  /**
28
25
  * Handles the mouse down event to initiate the drag sequence.
29
26
  * It checks if the event is synthetic or fake, and if the drag is already started.
30
27
  * If not, it sets up the drag start sequence by adding necessary event listeners.
31
28
  * @param event - The mouse event that triggered the drag.
32
29
  */
33
- private onMouseDown;
30
+ private _onMouseDown;
34
31
  /**
35
32
  * Handles the touch down event to initiate the drag sequence.
36
33
  * It checks if the event is synthetic or fake, and if the drag is already started.
37
34
  * If not, it sets up the drag start sequence by adding necessary event listeners.
38
35
  * @param event - The touch event that triggered the drag.
39
36
  */
40
- private onTouchDown;
37
+ private _onTouchDown;
41
38
  /**
42
39
  * Handles the select start event.
43
40
  * This method is called when the user starts selecting text or elements.
44
41
  * It prevents the default behavior and calls the onSelect method to handle the selection.
45
42
  * @param event - The event that triggered the select start.
46
43
  */
47
- private onSelectStart;
44
+ private _onSelectStart;
48
45
  /**
49
46
  * Handles the mouse move event during the drag sequence.
50
47
  * It checks if the drag sequence should start and calls the move handler accordingly.
51
48
  * @param event - The mouse event that triggered the move.
52
49
  */
53
- private onMouseMove;
50
+ private _onMouseMove;
54
51
  /**
55
52
  * Handles the touch move event during the drag sequence.
56
53
  * It checks if the drag sequence should start and calls the move handler accordingly.
57
54
  * @param event - The touch event that triggered the move.
58
55
  */
59
- private onTouchMove;
56
+ private _onTouchMove;
60
57
  /**
61
58
  * Checks if the drag sequence should start based on the pointer position.
62
59
  * It compares the current pointer position with the initial drag start position
@@ -65,7 +62,7 @@ export declare abstract class DragAndDropBase {
65
62
  * it prepares the drag sequence and sets the move handler to onPointerMove.
66
63
  * @param event - The pointer event that triggered the check.
67
64
  */
68
- private checkDragSequenceToStart;
65
+ private _checkDragSequenceToStart;
69
66
  /**
70
67
  * Prepares the drag sequence by setting up necessary event listeners
71
68
  * and initializing any required state for the drag operation.
@@ -80,20 +77,22 @@ export declare abstract class DragAndDropBase {
80
77
  * This method is called when the user releases the mouse button or lifts their finger from the touch screen.
81
78
  * @param event - The pointer event that triggered the up action.
82
79
  */
83
- private onPointerUpEvent;
80
+ private _onPointerUpEvent;
84
81
  /**
85
82
  * Ends the drag sequence by resetting the state and removing event listeners.
86
83
  * It sets the isDragStarted flag to false, clears the pointerDownElement,
87
84
  * and resets the moveHandler to checkDragSequenceToStart.
88
85
  * It also removes all mouse and touch event listeners that were added during the drag sequence.
89
86
  */
90
- private endDragSequence;
87
+ private _endDragSequence;
91
88
  protected abstract finalizeDragSequence(): void;
92
89
  protected abstract onSelect(event: Event): void;
93
- abstract onPointerDown(event: IPointerEvent): boolean;
94
- abstract onPointerMove(event: IPointerEvent): void;
95
- abstract onPointerUp(event: IPointerEvent): void;
96
- subscribe(fDocument: Document): void;
97
- unsubscribe(): void;
98
- private onContextMenuDuringDrag;
90
+ protected abstract onPointerDown(event: IPointerEvent): boolean;
91
+ protected abstract onPointerMove(event: IPointerEvent): void;
92
+ protected abstract onPointerUp(event: IPointerEvent): void;
93
+ protected subscribe(): void;
94
+ protected unsubscribe(): void;
95
+ private _listen;
96
+ private _unlisten;
97
+ private _preventDuringDrag;
99
98
  }
@@ -1,9 +1,9 @@
1
1
  export declare class EventExtensions {
2
- private static isSupported;
3
- private static isPassiveEventListenerSupported;
4
- private static passiveEventListener;
2
+ private static _isSupported;
3
+ private static _isPassiveEventListenerSupported;
4
+ private static _passiveEventListener;
5
5
  static activeListener(): boolean | AddEventListenerOptions;
6
6
  static passiveListener(): boolean | AddEventListenerOptions;
7
7
  static activeCaptureListener(): boolean | AddEventListenerOptions;
8
- static emptyListener(): Function;
8
+ static emptyListener(): () => void;
9
9
  }
@@ -1,4 +1,3 @@
1
1
  export * from './pointer-events';
2
2
  export * from './drag-and-drop-base';
3
3
  export * from './event.extensions';
4
- export * from './i-can-run-outside-angular';
@@ -1,5 +1,7 @@
1
1
  import { IMouseEvent, IPointerUpEvent, ITouchDownEvent, ITouchMoveEvent, } from './pointer-events';
2
2
  import { EventExtensions } from './event.extensions';
3
+ import { inject, NgZone } from '@angular/core';
4
+ import { DOCUMENT } from '@angular/common';
3
5
  export const MOUSE_EVENT_IGNORE_TIME = 800;
4
6
  /**
5
7
  * Base class for implementing drag and drop functionality.
@@ -7,57 +9,53 @@ export const MOUSE_EVENT_IGNORE_TIME = 800;
7
9
  * and provides abstract methods for derived classes to implement specific behaviors.
8
10
  */
9
11
  export class DragAndDropBase {
10
- ngZone;
11
- document;
12
- mouseListeners = EventExtensions.emptyListener();
13
- touchListeners = EventExtensions.emptyListener();
14
- startListeners = EventExtensions.emptyListener();
15
- isSyntheticEvent(event) {
16
- return !!this.lastTouchEventTime &&
17
- (this.lastTouchEventTime + MOUSE_EVENT_IGNORE_TIME > Date.now());
12
+ _document = inject(DOCUMENT);
13
+ _ngZone = inject(NgZone, { optional: true });
14
+ _mouseListeners = EventExtensions.emptyListener();
15
+ _touchListeners = EventExtensions.emptyListener();
16
+ _startListeners = EventExtensions.emptyListener();
17
+ isSyntheticEvent(_event) {
18
+ return (!!this._lastTouchEventTime && this._lastTouchEventTime + MOUSE_EVENT_IGNORE_TIME > Date.now());
18
19
  }
19
- lastTouchEventTime = 0;
20
+ _lastTouchEventTime = 0;
20
21
  isDragStarted = false;
21
- dragStartThreshold = 3;
22
- dragStartDelay = 0;
23
- dragStartTime = 0;
24
- dragStartPosition = { x: 0, y: 0 };
25
- moveHandler = this.checkDragSequenceToStart;
26
- pointerDownElement = null;
27
- constructor(ngZone) {
28
- this.ngZone = ngZone;
29
- }
22
+ _dragStartThreshold = 3;
23
+ _dragStartDelay = 0;
24
+ _dragStartTime = 0;
25
+ _dragStartPosition = { x: 0, y: 0 };
26
+ _moveHandler = this._checkDragSequenceToStart;
27
+ _pointerDownElement = null;
30
28
  /**
31
29
  * Handles the mouse down event to initiate the drag sequence.
32
30
  * It checks if the event is synthetic or fake, and if the drag is already started.
33
31
  * If not, it sets up the drag start sequence by adding necessary event listeners.
34
32
  * @param event - The mouse event that triggered the drag.
35
33
  */
36
- onMouseDown = (event) => {
34
+ _onMouseDown = (event) => {
37
35
  const isSyntheticEvent = this.isSyntheticEvent(event);
38
36
  const isFakeEvent = isFakeMousedownFromScreenReader(event);
39
37
  const mouseEvent = new IMouseEvent(event);
40
38
  if (isSyntheticEvent || isFakeEvent || this.disabled || this.isDragStarted) {
41
39
  return;
42
40
  }
43
- this.pointerDownElement = mouseEvent.targetElement;
41
+ this._pointerDownElement = mouseEvent.targetElement;
44
42
  const result = this.onPointerDown(mouseEvent);
45
43
  if (result) {
46
- this.dragStartTime = Date.now();
47
- this.dragStartPosition = mouseEvent.getPosition();
48
- this.ngZone?.runOutsideAngular(() => {
49
- this.document?.addEventListener('selectstart', this.onSelectStart, EventExtensions.activeListener());
50
- this.document?.addEventListener('mousemove', this.onMouseMove);
51
- this.document?.addEventListener('pointerup', this.onPointerUpEvent);
52
- this.document?.addEventListener('pointercancel', this.onPointerUpEvent, EventExtensions.activeCaptureListener());
53
- this.document?.addEventListener('contextmenu', this.onContextMenuDuringDrag, EventExtensions.activeCaptureListener());
44
+ this._dragStartTime = Date.now();
45
+ this._dragStartPosition = mouseEvent.getPosition();
46
+ this._ngZone?.runOutsideAngular(() => {
47
+ this._listen('selectstart', this._onSelectStart, EventExtensions.activeListener());
48
+ this._listen('mousemove', this._onMouseMove);
49
+ this._listen('pointerup', this._onPointerUpEvent);
50
+ this._listen('pointercancel', this._onPointerUpEvent, EventExtensions.activeCaptureListener());
51
+ this._listen('contextmenu', this._preventDuringDrag, EventExtensions.activeCaptureListener());
54
52
  });
55
- this.mouseListeners = () => {
56
- this.document?.removeEventListener('selectstart', this.onSelectStart, EventExtensions.activeListener());
57
- this.document?.removeEventListener('mousemove', this.onMouseMove);
58
- this.document?.removeEventListener('pointerup', this.onPointerUpEvent);
59
- this.document?.removeEventListener('pointercancel', this.onPointerUpEvent, EventExtensions.activeCaptureListener());
60
- this.document?.removeEventListener('contextmenu', this.onContextMenuDuringDrag, EventExtensions.activeCaptureListener());
53
+ this._mouseListeners = () => {
54
+ this._unlisten('selectstart', this._onSelectStart, EventExtensions.activeListener());
55
+ this._unlisten('mousemove', this._onMouseMove);
56
+ this._unlisten('pointerup', this._onPointerUpEvent);
57
+ this._unlisten('pointercancel', this._onPointerUpEvent, EventExtensions.activeCaptureListener());
58
+ this._unlisten('contextmenu', this._preventDuringDrag, EventExtensions.activeCaptureListener());
61
59
  };
62
60
  }
63
61
  };
@@ -67,30 +65,30 @@ export class DragAndDropBase {
67
65
  * If not, it sets up the drag start sequence by adding necessary event listeners.
68
66
  * @param event - The touch event that triggered the drag.
69
67
  */
70
- onTouchDown = (event) => {
68
+ _onTouchDown = (event) => {
71
69
  const isFakeEvent = isFakeTouchstartFromScreenReader(event);
72
70
  const touchEvent = new ITouchDownEvent(event);
73
71
  if (isFakeEvent || this.disabled || this.isDragStarted) {
74
72
  return;
75
73
  }
76
- this.pointerDownElement = touchEvent.targetElement;
74
+ this._pointerDownElement = touchEvent.targetElement;
77
75
  const result = this.onPointerDown(touchEvent);
78
76
  if (result) {
79
- this.dragStartTime = Date.now();
80
- this.dragStartPosition = touchEvent.getPosition();
81
- this.ngZone?.runOutsideAngular(() => {
82
- this.document?.addEventListener('selectstart', this.onSelectStart, EventExtensions.activeListener());
83
- this.document?.addEventListener('touchmove', this.onTouchMove);
84
- this.document?.addEventListener('pointerup', this.onPointerUpEvent);
85
- this.document?.addEventListener('pointercancel', this.onPointerUpEvent, EventExtensions.activeCaptureListener());
86
- this.document?.addEventListener('contextmenu', this.onContextMenuDuringDrag, EventExtensions.activeCaptureListener());
77
+ this._dragStartTime = Date.now();
78
+ this._dragStartPosition = touchEvent.getPosition();
79
+ this._ngZone?.runOutsideAngular(() => {
80
+ this._listen('selectstart', this._onSelectStart, EventExtensions.activeListener());
81
+ this._listen('touchmove', this._onTouchMove);
82
+ this._listen('pointerup', this._onPointerUpEvent);
83
+ this._listen('pointercancel', this._onPointerUpEvent, EventExtensions.activeCaptureListener());
84
+ this._listen('contextmenu', this._preventDuringDrag, EventExtensions.activeCaptureListener());
87
85
  });
88
- this.touchListeners = () => {
89
- this.document?.removeEventListener('selectstart', this.onSelectStart, EventExtensions.activeListener());
90
- this.document?.removeEventListener('touchmove', this.onTouchMove);
91
- this.document?.removeEventListener('pointerup', this.onPointerUpEvent);
92
- this.document?.removeEventListener('pointercancel', this.onPointerUpEvent, EventExtensions.activeCaptureListener());
93
- this.document?.removeEventListener('contextmenu', this.onContextMenuDuringDrag, EventExtensions.activeCaptureListener());
86
+ this._touchListeners = () => {
87
+ this._unlisten('selectstart', this._onSelectStart, EventExtensions.activeListener());
88
+ this._unlisten('touchmove', this._onTouchMove);
89
+ this._unlisten('pointerup', this._onPointerUpEvent);
90
+ this._unlisten('pointercancel', this._onPointerUpEvent, EventExtensions.activeCaptureListener());
91
+ this._unlisten('contextmenu', this._preventDuringDrag, EventExtensions.activeCaptureListener());
94
92
  };
95
93
  }
96
94
  };
@@ -100,7 +98,7 @@ export class DragAndDropBase {
100
98
  * It prevents the default behavior and calls the onSelect method to handle the selection.
101
99
  * @param event - The event that triggered the select start.
102
100
  */
103
- onSelectStart = (event) => {
101
+ _onSelectStart = (event) => {
104
102
  this.onSelect(event);
105
103
  };
106
104
  /**
@@ -108,16 +106,16 @@ export class DragAndDropBase {
108
106
  * It checks if the drag sequence should start and calls the move handler accordingly.
109
107
  * @param event - The mouse event that triggered the move.
110
108
  */
111
- onMouseMove = (event) => {
112
- this.moveHandler(new IMouseEvent(event));
109
+ _onMouseMove = (event) => {
110
+ this._moveHandler(new IMouseEvent(event));
113
111
  };
114
112
  /**
115
113
  * Handles the touch move event during the drag sequence.
116
114
  * It checks if the drag sequence should start and calls the move handler accordingly.
117
115
  * @param event - The touch event that triggered the move.
118
116
  */
119
- onTouchMove = (event) => {
120
- this.moveHandler(new ITouchMoveEvent(event));
117
+ _onTouchMove = (event) => {
118
+ this._moveHandler(new ITouchMoveEvent(event));
121
119
  };
122
120
  /**
123
121
  * Checks if the drag sequence should start based on the pointer position.
@@ -127,25 +125,25 @@ export class DragAndDropBase {
127
125
  * it prepares the drag sequence and sets the move handler to onPointerMove.
128
126
  * @param event - The pointer event that triggered the check.
129
127
  */
130
- checkDragSequenceToStart(event) {
128
+ _checkDragSequenceToStart(event) {
131
129
  const pointerPosition = event.getPosition();
132
- if (!this.isDragStarted && this.pointerDownElement) {
133
- event.setTarget(this.pointerDownElement);
134
- const distanceX = Math.abs(pointerPosition.x - this.dragStartPosition.x);
135
- const distanceY = Math.abs(pointerPosition.y - this.dragStartPosition.y);
136
- const isOverThreshold = distanceX + distanceY >= this.dragStartThreshold;
130
+ if (!this.isDragStarted && this._pointerDownElement) {
131
+ event.setTarget(this._pointerDownElement);
132
+ const distanceX = Math.abs(pointerPosition.x - this._dragStartPosition.x);
133
+ const distanceY = Math.abs(pointerPosition.y - this._dragStartPosition.y);
134
+ const isOverThreshold = distanceX + distanceY >= this._dragStartThreshold;
137
135
  if (isOverThreshold) {
138
- const isDelayElapsed = Date.now() >= this.dragStartTime + this.dragStartDelay;
136
+ const isDelayElapsed = Date.now() >= this._dragStartTime + this._dragStartDelay;
139
137
  if (!isDelayElapsed) {
140
- this.endDragSequence();
138
+ this._endDragSequence();
141
139
  return;
142
140
  }
143
141
  event.preventDefault();
144
142
  this.prepareDragSequence(event);
145
143
  this.isDragStarted = true;
146
- this.moveHandler = this.onPointerMove;
144
+ this._moveHandler = this.onPointerMove;
147
145
  if (isTouchEvent(event.originalEvent)) {
148
- this.lastTouchEventTime = Date.now();
146
+ this._lastTouchEventTime = Date.now();
149
147
  }
150
148
  }
151
149
  }
@@ -157,11 +155,11 @@ export class DragAndDropBase {
157
155
  * This method is called when the user releases the mouse button or lifts their finger from the touch screen.
158
156
  * @param event - The pointer event that triggered the up action.
159
157
  */
160
- onPointerUpEvent = (event) => {
158
+ _onPointerUpEvent = (event) => {
161
159
  if (this.isDragStarted) {
162
160
  this.onPointerUp(new IPointerUpEvent(event));
163
161
  }
164
- this.endDragSequence();
162
+ this._endDragSequence();
165
163
  };
166
164
  /**
167
165
  * Ends the drag sequence by resetting the state and removing event listeners.
@@ -169,39 +167,42 @@ export class DragAndDropBase {
169
167
  * and resets the moveHandler to checkDragSequenceToStart.
170
168
  * It also removes all mouse and touch event listeners that were added during the drag sequence.
171
169
  */
172
- endDragSequence() {
170
+ _endDragSequence() {
173
171
  this.isDragStarted = false;
174
- this.pointerDownElement = null;
175
- this.moveHandler = this.checkDragSequenceToStart;
176
- this.mouseListeners();
177
- this.mouseListeners = EventExtensions.emptyListener();
178
- this.touchListeners();
179
- this.touchListeners = EventExtensions.emptyListener();
172
+ this._pointerDownElement = null;
173
+ this._moveHandler = this._checkDragSequenceToStart;
174
+ this._mouseListeners();
175
+ this._mouseListeners = EventExtensions.emptyListener();
176
+ this._touchListeners();
177
+ this._touchListeners = EventExtensions.emptyListener();
180
178
  this.finalizeDragSequence();
181
179
  }
182
- subscribe(fDocument) {
183
- if (this.document) {
184
- this.unsubscribe();
185
- }
186
- this.document = fDocument;
187
- this.ngZone?.runOutsideAngular(() => {
188
- fDocument.addEventListener('mousedown', this.onMouseDown, EventExtensions.activeListener());
189
- fDocument.addEventListener('touchstart', this.onTouchDown, EventExtensions.passiveListener());
180
+ subscribe() {
181
+ this.unsubscribe();
182
+ this._ngZone?.runOutsideAngular(() => {
183
+ this._listen('mousedown', this._onMouseDown, EventExtensions.activeListener());
184
+ this._listen('touchstart', this._onTouchDown, EventExtensions.passiveListener());
190
185
  });
191
- this.startListeners = () => {
192
- fDocument.removeEventListener('mousedown', this.onMouseDown, EventExtensions.activeListener());
193
- fDocument.removeEventListener('touchstart', this.onTouchDown, EventExtensions.passiveListener());
186
+ this._startListeners = () => {
187
+ this._unlisten('mousedown', this._onMouseDown, EventExtensions.activeListener());
188
+ this._unlisten('touchstart', this._onTouchDown, EventExtensions.passiveListener());
194
189
  };
195
190
  }
196
191
  unsubscribe() {
197
- this.startListeners();
198
- this.startListeners = EventExtensions.emptyListener();
199
- this.touchListeners();
200
- this.touchListeners = EventExtensions.emptyListener();
201
- this.mouseListeners();
202
- this.mouseListeners = EventExtensions.emptyListener();
192
+ this._startListeners();
193
+ this._startListeners = EventExtensions.emptyListener();
194
+ this._touchListeners();
195
+ this._touchListeners = EventExtensions.emptyListener();
196
+ this._mouseListeners();
197
+ this._mouseListeners = EventExtensions.emptyListener();
198
+ }
199
+ _listen(type, listener, options) {
200
+ this._document.addEventListener(type, listener, options);
201
+ }
202
+ _unlisten(type, listener, options) {
203
+ this._document.removeEventListener(type, listener, options);
203
204
  }
204
- onContextMenuDuringDrag = (e) => {
205
+ _preventDuringDrag = (e) => {
205
206
  if (this.isDragStarted) {
206
207
  e.preventDefault();
207
208
  }
@@ -220,4 +221,4 @@ function isFakeTouchstartFromScreenReader(event) {
220
221
  (touch.radiusX == null || touch.radiusX === 1) &&
221
222
  (touch.radiusY == null || touch.radiusY === 1));
222
223
  }
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1hbmQtZHJvcC1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kcmFnLXRvb2xraXQvZHJhZy1hbmQtZHJvcC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxXQUFXLEVBRVgsZUFBZSxFQUNmLGVBQWUsRUFDZixlQUFlLEdBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFnQixlQUFlO0lBZ0N2QjtJQTVCSixRQUFRLENBQXVCO0lBRS9CLGNBQWMsR0FBYSxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDM0QsY0FBYyxHQUFhLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUUzRCxjQUFjLEdBQWEsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRTVELGdCQUFnQixDQUFDLEtBQWlCO1FBQ3ZDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0I7WUFDOUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVPLGtCQUFrQixHQUFXLENBQUMsQ0FBQztJQUVoQyxhQUFhLEdBQVksS0FBSyxDQUFDO0lBQzlCLGtCQUFrQixHQUFXLENBQUMsQ0FBQztJQUMvQixjQUFjLEdBQVcsQ0FBQyxDQUFDO0lBRTNCLGFBQWEsR0FBVyxDQUFDLENBQUM7SUFDMUIsaUJBQWlCLEdBQTZCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFJN0QsV0FBVyxHQUFhLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztJQUV0RCxr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SyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBQyxLQUFpQjtJQUN6RCxNQUFNLEtBQUssR0FDVCxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFM0YsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLO1FBQ1AsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQy9DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNhblJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi9pLWNhbi1ydW4tb3V0c2lkZS1hbmd1bGFyJztcbmltcG9ydCB7XG4gIElNb3VzZUV2ZW50LFxuICBJUG9pbnRlckV2ZW50LFxuICBJUG9pbnRlclVwRXZlbnQsXG4gIElUb3VjaERvd25FdmVudCxcbiAgSVRvdWNoTW92ZUV2ZW50LFxufSBmcm9tICcuL3BvaW50ZXItZXZlbnRzJztcbmltcG9ydCB7IEV2ZW50RXh0ZW5zaW9ucyB9IGZyb20gJy4vZXZlbnQuZXh0ZW5zaW9ucyc7XG5cbmV4cG9ydCBjb25zdCBNT1VTRV9FVkVOVF9JR05PUkVfVElNRSA9IDgwMDtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgZHJhZyBhbmQgZHJvcCBmdW5jdGlvbmFsaXR5LlxuICogSXQgaGFuZGxlcyBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzLCBtYW5hZ2VzIHRoZSBkcmFnIHN0YXJ0IHNlcXVlbmNlLFxuICogYW5kIHByb3ZpZGVzIGFic3RyYWN0IG1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBpbXBsZW1lbnQgc3BlY2lmaWMgYmVoYXZpb3JzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRHJhZ0FuZERyb3BCYXNlIHtcblxuICBwdWJsaWMgYWJzdHJhY3QgaG9zdEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgbW91c2VMaXN0ZW5lcnM6IEZ1bmN0aW9uID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgcHJpdmF0ZSB0b3VjaExpc3RlbmVyczogRnVuY3Rpb24gPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuXG4gIHByaXZhdGUgc3RhcnRMaXN0ZW5lcnM6IEZ1bmN0aW9uID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcblxuICBwdWJsaWMgaXNTeW50aGV0aWNFdmVudChldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMubGFzdFRvdWNoRXZlbnRUaW1lICYmXG4gICAgICAodGhpcy5sYXN0VG91Y2hFdmVudFRpbWUgKyBNT1VTRV9FVkVOVF9JR05PUkVfVElNRSA+IERhdGUubm93KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBsYXN0VG91Y2hFdmVudFRpbWU6IG51bWJlciA9IDA7XG5cbiAgcHVibGljIGlzRHJhZ1N0YXJ0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkcmFnU3RhcnRUaHJlc2hvbGQ6IG51bWJlciA9IDM7XG4gIHByaXZhdGUgZHJhZ1N0YXJ0RGVsYXk6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBkcmFnU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIGRyYWdTdGFydFBvc2l0aW9uOiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcblxuICBwdWJsaWMgYWJzdHJhY3QgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBtb3ZlSGFuZGxlcjogRnVuY3Rpb24gPSB0aGlzLmNoZWNrRHJhZ1NlcXVlbmNlVG9TdGFydDtcblxuICBwcml2YXRlIHBvaW50ZXJEb3duRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5nWm9uZTogSUNhblJ1bk91dHNpZGVBbmd1bGFyIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBtb3VzZSBkb3duIGV2ZW50IHRvIGluaXRpYXRlIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKiBJdCBjaGVja3MgaWYgdGhlIGV2ZW50IGlzIHN5bnRoZXRpYyBvciBmYWtlLCBhbmQgaWYgdGhlIGRyYWcgaXMgYWxyZWFkeSBzdGFydGVkLlxuICAgKiBJZiBub3QsIGl0IHNldHMgdXAgdGhlIGRyYWcgc3RhcnQgc2VxdWVuY2UgYnkgYWRkaW5nIG5lY2Vzc2FyeSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgZHJhZy5cbiAgICovXG4gIHByaXZhdGUgb25Nb3VzZURvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc1N5bnRoZXRpY0V2ZW50ID0gdGhpcy5pc1N5bnRoZXRpY0V2ZW50KGV2ZW50KTtcbiAgICBjb25zdCBpc0Zha2VFdmVudCA9IGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZlbnQpO1xuICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBuZXcgSU1vdXNlRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGlzU3ludGhldGljRXZlbnQgfHwgaXNGYWtlRXZlbnQgfHwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2ludGVyRG93bkVsZW1lbnQgPSBtb3VzZUV2ZW50LnRhcmdldEVsZW1lbnQ7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vblBvaW50ZXJEb3duKG1vdXNlRXZlbnQpO1xuICAgIGlmIChyZXN1bHQpIHtcblxuICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gPSBtb3VzZUV2ZW50LmdldFBvc2l0aW9uKCk7XG5cbiAgICAgIHRoaXMubmdab25lPy5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgdGhpcy5vblNlbGVjdFN0YXJ0LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwRXZlbnQpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5vblBvaW50ZXJVcEV2ZW50LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlQ2FwdHVyZUxpc3RlbmVyKCkpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMub25Db250ZXh0TWVudUR1cmluZ0RyYWcsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5tb3VzZUxpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCB0aGlzLm9uU2VsZWN0U3RhcnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXBFdmVudCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlclVwRXZlbnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5vbkNvbnRleHRNZW51RHVyaW5nRHJhZywgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNoIGRvd24gZXZlbnQgdG8gaW5pdGlhdGUgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZXZlbnQgaXMgc3ludGhldGljIG9yIGZha2UsIGFuZCBpZiB0aGUgZHJhZyBpcyBhbHJlYWR5IHN0YXJ0ZWQuXG4gICAqIElmIG5vdCwgaXQgc2V0cyB1cCB0aGUgZHJhZyBzdGFydCBzZXF1ZW5jZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHRvdWNoIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBkcmFnLlxuICAgKi9cbiAgcHJpdmF0ZSBvblRvdWNoRG93biA9IChldmVudDogVG91Y2hFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzRmFrZUV2ZW50ID0gaXNGYWtlVG91Y2hzdGFydEZyb21TY3JlZW5SZWFkZXIoZXZlbnQgYXMgVG91Y2hFdmVudClcbiAgICBjb25zdCB0b3VjaEV2ZW50ID0gbmV3IElUb3VjaERvd25FdmVudChldmVudCk7XG5cbiAgICBpZiAoaXNGYWtlRXZlbnQgfHwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2ludGVyRG93bkVsZW1lbnQgPSB0b3VjaEV2ZW50LnRhcmdldEVsZW1lbnQ7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vblBvaW50ZXJEb3duKHRvdWNoRXZlbnQpO1xuICAgIGlmIChyZXN1bHQpIHtcblxuICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gPSB0b3VjaEV2ZW50LmdldFBvc2l0aW9uKCk7XG5cbiAgICAgIHRoaXMubmdab25lPy5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgdGhpcy5vblNlbGVjdFN0YXJ0LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Ub3VjaE1vdmUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwRXZlbnQpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgdGhpcy5vblBvaW50ZXJVcEV2ZW50LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlQ2FwdHVyZUxpc3RlbmVyKCkpO1xuICAgICAgICB0aGlzLmRvY3VtZW50Py5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMub25Db250ZXh0TWVudUR1cmluZ0RyYWcsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy50b3VjaExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCB0aGlzLm9uU2VsZWN0U3RhcnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXBFdmVudCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlclVwRXZlbnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5vbkNvbnRleHRNZW51RHVyaW5nRHJhZywgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHNlbGVjdCBzdGFydCBldmVudC5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgc3RhcnRzIHNlbGVjdGluZyB0ZXh0IG9yIGVsZW1lbnRzLlxuICAgKiBJdCBwcmV2ZW50cyB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQgY2FsbHMgdGhlIG9uU2VsZWN0IG1ldGhvZCB0byBoYW5kbGUgdGhlIHNlbGVjdGlvbi5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBzZWxlY3Qgc3RhcnQuXG4gICAqL1xuICBwcml2YXRlIG9uU2VsZWN0U3RhcnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgdGhpcy5vblNlbGVjdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgbW91c2UgbW92ZSBldmVudCBkdXJpbmcgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZHJhZyBzZXF1ZW5jZSBzaG91bGQgc3RhcnQgYW5kIGNhbGxzIHRoZSBtb3ZlIGhhbmRsZXIgYWNjb3JkaW5nbHkuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgbW92ZS5cbiAgICovXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICB0aGlzLm1vdmVIYW5kbGVyKG5ldyBJTW91c2VFdmVudChldmVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNoIG1vdmUgZXZlbnQgZHVyaW5nIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKiBJdCBjaGVja3MgaWYgdGhlIGRyYWcgc2VxdWVuY2Ugc2hvdWxkIHN0YXJ0IGFuZCBjYWxscyB0aGUgbW92ZSBoYW5kbGVyIGFjY29yZGluZ2x5LlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgdG91Y2ggZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIG1vdmUuXG4gICAqL1xuICBwcml2YXRlIG9uVG91Y2hNb3ZlID0gKGV2ZW50OiBUb3VjaEV2ZW50KSA9PiB7XG4gICAgdGhpcy5tb3ZlSGFuZGxlcihuZXcgSVRvdWNoTW92ZUV2ZW50KGV2ZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBkcmFnIHNlcXVlbmNlIHNob3VsZCBzdGFydCBiYXNlZCBvbiB0aGUgcG9pbnRlciBwb3NpdGlvbi5cbiAgICogSXQgY29tcGFyZXMgdGhlIGN1cnJlbnQgcG9pbnRlciBwb3NpdGlvbiB3aXRoIHRoZSBpbml0aWFsIGRyYWcgc3RhcnQgcG9zaXRpb25cbiAgICogYW5kIGNoZWNrcyBpZiB0aGUgZGlzdGFuY2UgZXhjZWVkcyB0aGUgZHJhZyBzdGFydCB0aHJlc2hvbGQuXG4gICAqIElmIHRoZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQgYW5kIHRoZSBkZWxheSBoYXMgcGFzc2VkLFxuICAgKiBpdCBwcmVwYXJlcyB0aGUgZHJhZyBzZXF1ZW5jZSBhbmQgc2V0cyB0aGUgbW92ZSBoYW5kbGVyIHRvIG9uUG9pbnRlck1vdmUuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBwb2ludGVyIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tEcmFnU2VxdWVuY2VUb1N0YXJ0KGV2ZW50OiBJUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcG9pbnRlclBvc2l0aW9uID0gZXZlbnQuZ2V0UG9zaXRpb24oKTtcblxuICAgIGlmICghdGhpcy5pc0RyYWdTdGFydGVkICYmIHRoaXMucG9pbnRlckRvd25FbGVtZW50KSB7XG4gICAgICBldmVudC5zZXRUYXJnZXQodGhpcy5wb2ludGVyRG93bkVsZW1lbnQpO1xuICAgICAgY29uc3QgZGlzdGFuY2VYID0gTWF0aC5hYnMocG9pbnRlclBvc2l0aW9uLnggLSB0aGlzLmRyYWdTdGFydFBvc2l0aW9uLngpO1xuICAgICAgY29uc3QgZGlzdGFuY2VZID0gTWF0aC5hYnMocG9pbnRlclBvc2l0aW9uLnkgLSB0aGlzLmRyYWdTdGFydFBvc2l0aW9uLnkpO1xuICAgICAgY29uc3QgaXNPdmVyVGhyZXNob2xkID0gZGlzdGFuY2VYICsgZGlzdGFuY2VZID49IHRoaXMuZHJhZ1N0YXJ0VGhyZXNob2xkO1xuXG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkKSB7XG4gICAgICAgIGNvbnN0IGlzRGVsYXlFbGFwc2VkID0gRGF0ZS5ub3coKSA+PSB0aGlzLmRyYWdTdGFydFRpbWUgKyB0aGlzLmRyYWdTdGFydERlbGF5O1xuXG4gICAgICAgIGlmICghaXNEZWxheUVsYXBzZWQpIHtcbiAgICAgICAgICB0aGlzLmVuZERyYWdTZXF1ZW5jZSgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlRHJhZ1NlcXVlbmNlKGV2ZW50KTtcbiAgICAgICAgdGhpcy5pc0RyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tb3ZlSGFuZGxlciA9IHRoaXMub25Qb2ludGVyTW92ZTtcbiAgICAgICAgaWYgKGlzVG91Y2hFdmVudChldmVudC5vcmlnaW5hbEV2ZW50KSkge1xuICAgICAgICAgIHRoaXMubGFzdFRvdWNoRXZlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyB0aGUgZHJhZyBzZXF1ZW5jZSBieSBzZXR0aW5nIHVwIG5lY2Vzc2FyeSBldmVudCBsaXN0ZW5lcnNcbiAgICogYW5kIGluaXRpYWxpemluZyBhbnkgcmVxdWlyZWQgc3RhdGUgZm9yIHRoZSBkcmFnIG9wZXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGRlcml2ZWQgY2xhc3NlcyB0byBkZWZpbmUgc3BlY2lmaWMgZHJhZyBiZWhhdmlvci5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHBvaW50ZXIgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHByZXBhcmF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHByZXBhcmVEcmFnU2VxdWVuY2UoZXZlbnQ6IElQb2ludGVyRXZlbnQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBwb2ludGVyIHVwIGV2ZW50IGF0IHRoZSBlbmQgb2YgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZHJhZyBoYXMgc3RhcnRlZCBhbmQgY2FsbHMgdGhlIG9uUG9pbnRlclVwIG1ldGhvZC5cbiAgICogSXQgYWxzbyBlbmRzIHRoZSBkcmFnIHNlcXVlbmNlIGJ5IHJlc2V0dGluZyB0aGUgc3RhdGUgYW5kIHJlbW92aW5nIGV2ZW50IGxpc3RlbmVycy5cbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlIG1vdXNlIGJ1dHRvbiBvciBsaWZ0cyB0aGVpciBmaW5nZXIgZnJvbSB0aGUgdG91Y2ggc2NyZWVuLlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgcG9pbnRlciBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgdXAgYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBvblBvaW50ZXJVcEV2ZW50ID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5pc0RyYWdTdGFydGVkKSB7XG4gICAgICB0aGlzLm9uUG9pbnRlclVwKG5ldyBJUG9pbnRlclVwRXZlbnQoZXZlbnQpKTtcbiAgICB9XG4gICAgdGhpcy5lbmREcmFnU2VxdWVuY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmRzIHRoZSBkcmFnIHNlcXVlbmNlIGJ5IHJlc2V0dGluZyB0aGUgc3RhdGUgYW5kIHJlbW92aW5nIGV2ZW50IGxpc3RlbmVycy5cbiAgICogSXQgc2V0cyB0aGUgaXNEcmFnU3RhcnRlZCBmbGFnIHRvIGZhbHNlLCBjbGVhcnMgdGhlIHBvaW50ZXJEb3duRWxlbWVudCxcbiAgICogYW5kIHJlc2V0cyB0aGUgbW92ZUhhbmRsZXIgdG8gY2hlY2tEcmFnU2VxdWVuY2VUb1N0YXJ0LlxuICAgKiBJdCBhbHNvIHJlbW92ZXMgYWxsIG1vdXNlIGFuZCB0b3VjaCBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkIGR1cmluZyB0aGUgZHJhZyBzZXF1ZW5jZS5cbiAgICovXG4gIHByaXZhdGUgZW5kRHJhZ1NlcXVlbmNlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMucG9pbnRlckRvd25FbGVtZW50ID0gbnVsbDtcblxuICAgIHRoaXMubW92ZUhhbmRsZXIgPSB0aGlzLmNoZWNrRHJhZ1NlcXVlbmNlVG9TdGFydDtcbiAgICB0aGlzLm1vdXNlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5tb3VzZUxpc3RlbmVycyA9IEV2ZW50RXh0ZW5zaW9ucy5lbXB0eUxpc3RlbmVyKCk7XG4gICAgdGhpcy50b3VjaExpc3RlbmVycygpO1xuICAgIHRoaXMudG91Y2hMaXN0ZW5lcnMgPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuICAgIHRoaXMuZmluYWxpemVEcmFnU2VxdWVuY2UoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBmaW5hbGl6ZURyYWdTZXF1ZW5jZSgpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvblNlbGVjdChldmVudDogRXZlbnQpOiB2b2lkO1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBvblBvaW50ZXJEb3duKGV2ZW50OiBJUG9pbnRlckV2ZW50KTogYm9vbGVhbjtcblxuICBwdWJsaWMgYWJzdHJhY3Qgb25Qb2ludGVyTW92ZShldmVudDogSVBvaW50ZXJFdmVudCk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IG9uUG9pbnRlclVwKGV2ZW50OiBJUG9pbnRlckV2ZW50KTogdm9pZDtcblxuICBwdWJsaWMgc3Vic2NyaWJlKGZEb2N1bWVudDogRG9jdW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kb2N1bWVudCkge1xuICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmRvY3VtZW50ID0gZkRvY3VtZW50O1xuXG4gICAgdGhpcy5uZ1pvbmU/LnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duLCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICBmRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaERvd24sIEV2ZW50RXh0ZW5zaW9ucy5wYXNzaXZlTGlzdGVuZXIoKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXJ0TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgZkRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd24sIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgIGZEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblRvdWNoRG93biwgRXZlbnRFeHRlbnNpb25zLnBhc3NpdmVMaXN0ZW5lcigpKTtcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuXG4gICAgdGhpcy5zdGFydExpc3RlbmVycygpO1xuICAgIHRoaXMuc3RhcnRMaXN0ZW5lcnMgPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuICAgIHRoaXMudG91Y2hMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnRvdWNoTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLm1vdXNlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5tb3VzZUxpc3RlbmVycyA9IEV2ZW50RXh0ZW5zaW9ucy5lbXB0eUxpc3RlbmVyKCk7XG4gIH1cblxuICBwcml2YXRlIG9uQ29udGV4dE1lbnVEdXJpbmdEcmFnID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgaWYgKHRoaXMuaXNEcmFnU3RhcnRlZCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNUb3VjaEV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IGV2ZW50IGlzIFRvdWNoRXZlbnQge1xuICByZXR1cm4gZXZlbnQudHlwZVswXSA9PT0gJ3QnO1xufVxuXG5mdW5jdGlvbiBpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBldmVudC5idXR0b25zID09PSAwIHx8IChldmVudC5vZmZzZXRYID09PSAwICYmIGV2ZW50Lm9mZnNldFkgPT09IDApO1xufVxuXG5mdW5jdGlvbiBpc0Zha2VUb3VjaHN0YXJ0RnJvbVNjcmVlblJlYWRlcihldmVudDogVG91Y2hFdmVudCk6IGJvb2xlYW4ge1xuICBjb25zdCB0b3VjaDogVG91Y2ggfCB1bmRlZmluZWQgPVxuICAgIChldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXNbMF0pIHx8IChldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSk7XG5cbiAgcmV0dXJuIChcbiAgICAhIXRvdWNoICYmXG4gICAgdG91Y2guaWRlbnRpZmllciA9PT0gLTEgJiZcbiAgICAodG91Y2gucmFkaXVzWCA9PSBudWxsIHx8IHRvdWNoLnJhZGl1c1ggPT09IDEpICYmXG4gICAgKHRvdWNoLnJhZGl1c1kgPT0gbnVsbCB8fCB0b3VjaC5yYWRpdXNZID09PSAxKVxuICApO1xufVxuIl19
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1hbmQtZHJvcC1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9kcmFnLXRvb2xraXQvZHJhZy1hbmQtZHJvcC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxXQUFXLEVBRVgsZUFBZSxFQUNmLGVBQWUsRUFDZixlQUFlLEdBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sT0FBZ0IsZUFBZTtJQUNsQixTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFdEQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNsRCxlQUFlLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBRWxELGVBQWUsR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFFbkQsZ0JBQWdCLENBQUMsTUFBa0I7UUFDeEMsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixHQUFHLHVCQUF1QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDOUYsQ0FBQztJQUNKLENBQUM7SUFFTyxtQkFBbUIsR0FBVyxDQUFDLENBQUM7SUFFakMsYUFBYSxHQUFZLEtBQUssQ0FBQztJQUM5QixtQkFBbUIsR0FBVyxDQUFDLENBQUM7SUFDaEMsZUFBZSxHQUFXLENBQUMsQ0FBQztJQUU1QixjQUFjLEdBQVcsQ0FBQyxDQUFDO0lBQzNCLGtCQUFrQixHQUE2QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBSTlELFlBQVksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUM7SUFFOUMsbUJBQW1CLEdBQXVCLElBQUksQ0FBQztJQUV2RDs7Ozs7T0FLRztJQUNLLFlBQVksR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtRQUMzQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxNQUFNLFdBQVcsR0FBRywrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxQyxJQUFJLGdCQUFnQixJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzRSxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbkQsSUFBSSxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7Z0JBQ25GLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxPQUFPLENBQ1YsZUFBZSxFQUNmLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQ3hDLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FDVixhQUFhLEVBQ2IsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixlQUFlLENBQUMscUJBQXFCLEVBQUUsQ0FDeEMsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JGLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxTQUFTLENBQ1osZUFBZSxFQUNmLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQ3hDLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FDWixhQUFhLEVBQ2IsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixlQUFlLENBQUMscUJBQXFCLEVBQUUsQ0FDeEMsQ0FBQztZQUNKLENBQUMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRjs7Ozs7T0FLRztJQUNLLFlBQVksR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtRQUMzQyxNQUFNLFdBQVcsR0FBRyxnQ0FBZ0MsQ0FBQyxLQUFtQixDQUFDLENBQUM7UUFDMUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUMsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRW5ELElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxFQUFFO2dCQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsT0FBTyxDQUNWLGVBQWUsRUFDZixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxDQUN4QyxDQUFDO2dCQUNGLElBQUksQ0FBQyxPQUFPLENBQ1YsYUFBYSxFQUNiLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQ3hDLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUFFO2dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsU0FBUyxDQUNaLGVBQWUsRUFDZixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLGVBQWUsQ0FBQyxxQkFBcUIsRUFBRSxDQUN4QyxDQUFDO2dCQUNGLElBQUksQ0FBQyxTQUFTLENBQ1osYUFBYSxFQUNiLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsZUFBZSxDQUFDLHFCQUFxQixFQUFFLENBQ3hDLENBQUM7WUFDSixDQUFDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSyxjQUFjLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRTtRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSyxZQUFZLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSyxZQUFZLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7UUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQztJQUVGOzs7Ozs7O09BT0c7SUFDSyx5QkFBeUIsQ0FBQyxLQUFvQjtRQUNwRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDcEQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsTUFBTSxlQUFlLEdBQUcsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFFMUUsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFFaEYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFFeEIsT0FBTztnQkFDVCxDQUFDO2dCQUVELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUN2QyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDeEMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQVVEOzs7Ozs7T0FNRztJQUNLLGlCQUFpQixHQUFHLENBQUMsS0FBbUIsRUFBRSxFQUFFO1FBQ2xELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUVoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFZUyxTQUFTO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixJQUFJLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsRUFBRTtZQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDckYsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVTLFdBQVc7UUFDbkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekQsQ0FBQztJQUVPLE9BQU8sQ0FDYixJQUFPLEVBQ1AsUUFBOEQsRUFDOUQsT0FBMkM7UUFFM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTyxTQUFTLENBQ2YsSUFBTyxFQUNQLFFBQThELEVBQzlELE9BQTJDO1FBRTNDLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU8sa0JBQWtCLEdBQUcsQ0FBQyxDQUFRLEVBQUUsRUFBRTtRQUN4QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUMsQ0FBQztDQUNIO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBOEI7SUFDbEQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUywrQkFBK0IsQ0FBQyxLQUFpQjtJQUN4RCxPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FBQyxLQUFpQjtJQUN6RCxNQUFNLEtBQUssR0FDVCxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFM0YsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLO1FBQ1AsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQztRQUM5QyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQy9DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSU1vdXNlRXZlbnQsXG4gIElQb2ludGVyRXZlbnQsXG4gIElQb2ludGVyVXBFdmVudCxcbiAgSVRvdWNoRG93bkV2ZW50LFxuICBJVG91Y2hNb3ZlRXZlbnQsXG59IGZyb20gJy4vcG9pbnRlci1ldmVudHMnO1xuaW1wb3J0IHsgRXZlbnRFeHRlbnNpb25zIH0gZnJvbSAnLi9ldmVudC5leHRlbnNpb25zJztcbmltcG9ydCB7IGluamVjdCwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmV4cG9ydCBjb25zdCBNT1VTRV9FVkVOVF9JR05PUkVfVElNRSA9IDgwMDtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgZHJhZyBhbmQgZHJvcCBmdW5jdGlvbmFsaXR5LlxuICogSXQgaGFuZGxlcyBtb3VzZSBhbmQgdG91Y2ggZXZlbnRzLCBtYW5hZ2VzIHRoZSBkcmFnIHN0YXJ0IHNlcXVlbmNlLFxuICogYW5kIHByb3ZpZGVzIGFic3RyYWN0IG1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBpbXBsZW1lbnQgc3BlY2lmaWMgYmVoYXZpb3JzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRHJhZ0FuZERyb3BCYXNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uZ1pvbmUgPSBpbmplY3QoTmdab25lLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHByaXZhdGUgX21vdXNlTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgcHJpdmF0ZSBfdG91Y2hMaXN0ZW5lcnMgPSBFdmVudEV4dGVuc2lvbnMuZW1wdHlMaXN0ZW5lcigpO1xuXG4gIHByaXZhdGUgX3N0YXJ0TGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcblxuICBwdWJsaWMgaXNTeW50aGV0aWNFdmVudChfZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLl9sYXN0VG91Y2hFdmVudFRpbWUgJiYgdGhpcy5fbGFzdFRvdWNoRXZlbnRUaW1lICsgTU9VU0VfRVZFTlRfSUdOT1JFX1RJTUUgPiBEYXRlLm5vdygpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xhc3RUb3VjaEV2ZW50VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgaXNEcmFnU3RhcnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9kcmFnU3RhcnRUaHJlc2hvbGQ6IG51bWJlciA9IDM7XG4gIHByaXZhdGUgX2RyYWdTdGFydERlbGF5OiBudW1iZXIgPSAwO1xuXG4gIHByaXZhdGUgX2RyYWdTdGFydFRpbWU6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2RyYWdTdGFydFBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcblxuICBwdWJsaWMgYWJzdHJhY3QgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfbW92ZUhhbmRsZXIgPSB0aGlzLl9jaGVja0RyYWdTZXF1ZW5jZVRvU3RhcnQ7XG5cbiAgcHJpdmF0ZSBfcG9pbnRlckRvd25FbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBtb3VzZSBkb3duIGV2ZW50IHRvIGluaXRpYXRlIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKiBJdCBjaGVja3MgaWYgdGhlIGV2ZW50IGlzIHN5bnRoZXRpYyBvciBmYWtlLCBhbmQgaWYgdGhlIGRyYWcgaXMgYWxyZWFkeSBzdGFydGVkLlxuICAgKiBJZiBub3QsIGl0IHNldHMgdXAgdGhlIGRyYWcgc3RhcnQgc2VxdWVuY2UgYnkgYWRkaW5nIG5lY2Vzc2FyeSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgZHJhZy5cbiAgICovXG4gIHByaXZhdGUgX29uTW91c2VEb3duID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgaXNTeW50aGV0aWNFdmVudCA9IHRoaXMuaXNTeW50aGV0aWNFdmVudChldmVudCk7XG4gICAgY29uc3QgaXNGYWtlRXZlbnQgPSBpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyKGV2ZW50KTtcbiAgICBjb25zdCBtb3VzZUV2ZW50ID0gbmV3IElNb3VzZUV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChpc1N5bnRoZXRpY0V2ZW50IHx8IGlzRmFrZUV2ZW50IHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc0RyYWdTdGFydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3BvaW50ZXJEb3duRWxlbWVudCA9IG1vdXNlRXZlbnQudGFyZ2V0RWxlbWVudDtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLm9uUG9pbnRlckRvd24obW91c2VFdmVudCk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgdGhpcy5fZHJhZ1N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICB0aGlzLl9kcmFnU3RhcnRQb3NpdGlvbiA9IG1vdXNlRXZlbnQuZ2V0UG9zaXRpb24oKTtcblxuICAgICAgdGhpcy5fbmdab25lPy5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xpc3Rlbignc2VsZWN0c3RhcnQnLCB0aGlzLl9vblNlbGVjdFN0YXJ0LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuX2xpc3RlbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUpO1xuICAgICAgICB0aGlzLl9saXN0ZW4oJ3BvaW50ZXJ1cCcsIHRoaXMuX29uUG9pbnRlclVwRXZlbnQpO1xuICAgICAgICB0aGlzLl9saXN0ZW4oXG4gICAgICAgICAgJ3BvaW50ZXJjYW5jZWwnLFxuICAgICAgICAgIHRoaXMuX29uUG9pbnRlclVwRXZlbnQsXG4gICAgICAgICAgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9saXN0ZW4oXG4gICAgICAgICAgJ2NvbnRleHRtZW51JyxcbiAgICAgICAgICB0aGlzLl9wcmV2ZW50RHVyaW5nRHJhZyxcbiAgICAgICAgICBFdmVudEV4dGVuc2lvbnMuYWN0aXZlQ2FwdHVyZUxpc3RlbmVyKCksXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fbW91c2VMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuKCdzZWxlY3RzdGFydCcsIHRoaXMuX29uU2VsZWN0U3RhcnQsIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgICAgdGhpcy5fdW5saXN0ZW4oJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlKTtcbiAgICAgICAgdGhpcy5fdW5saXN0ZW4oJ3BvaW50ZXJ1cCcsIHRoaXMuX29uUG9pbnRlclVwRXZlbnQpO1xuICAgICAgICB0aGlzLl91bmxpc3RlbihcbiAgICAgICAgICAncG9pbnRlcmNhbmNlbCcsXG4gICAgICAgICAgdGhpcy5fb25Qb2ludGVyVXBFdmVudCxcbiAgICAgICAgICBFdmVudEV4dGVuc2lvbnMuYWN0aXZlQ2FwdHVyZUxpc3RlbmVyKCksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuKFxuICAgICAgICAgICdjb250ZXh0bWVudScsXG4gICAgICAgICAgdGhpcy5fcHJldmVudER1cmluZ0RyYWcsXG4gICAgICAgICAgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNoIGRvd24gZXZlbnQgdG8gaW5pdGlhdGUgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZXZlbnQgaXMgc3ludGhldGljIG9yIGZha2UsIGFuZCBpZiB0aGUgZHJhZyBpcyBhbHJlYWR5IHN0YXJ0ZWQuXG4gICAqIElmIG5vdCwgaXQgc2V0cyB1cCB0aGUgZHJhZyBzdGFydCBzZXF1ZW5jZSBieSBhZGRpbmcgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHRvdWNoIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBkcmFnLlxuICAgKi9cbiAgcHJpdmF0ZSBfb25Ub3VjaERvd24gPSAoZXZlbnQ6IFRvdWNoRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc0Zha2VFdmVudCA9IGlzRmFrZVRvdWNoc3RhcnRGcm9tU2NyZWVuUmVhZGVyKGV2ZW50IGFzIFRvdWNoRXZlbnQpO1xuICAgIGNvbnN0IHRvdWNoRXZlbnQgPSBuZXcgSVRvdWNoRG93bkV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChpc0Zha2VFdmVudCB8fCB0aGlzLmRpc2FibGVkIHx8IHRoaXMuaXNEcmFnU3RhcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9wb2ludGVyRG93bkVsZW1lbnQgPSB0b3VjaEV2ZW50LnRhcmdldEVsZW1lbnQ7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5vblBvaW50ZXJEb3duKHRvdWNoRXZlbnQpO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHRoaXMuX2RyYWdTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgdGhpcy5fZHJhZ1N0YXJ0UG9zaXRpb24gPSB0b3VjaEV2ZW50LmdldFBvc2l0aW9uKCk7XG5cbiAgICAgIHRoaXMuX25nWm9uZT8ucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLl9saXN0ZW4oJ3NlbGVjdHN0YXJ0JywgdGhpcy5fb25TZWxlY3RTdGFydCwgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUxpc3RlbmVyKCkpO1xuICAgICAgICB0aGlzLl9saXN0ZW4oJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuKCdwb2ludGVydXAnLCB0aGlzLl9vblBvaW50ZXJVcEV2ZW50KTtcbiAgICAgICAgdGhpcy5fbGlzdGVuKFxuICAgICAgICAgICdwb2ludGVyY2FuY2VsJyxcbiAgICAgICAgICB0aGlzLl9vblBvaW50ZXJVcEV2ZW50LFxuICAgICAgICAgIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fbGlzdGVuKFxuICAgICAgICAgICdjb250ZXh0bWVudScsXG4gICAgICAgICAgdGhpcy5fcHJldmVudER1cmluZ0RyYWcsXG4gICAgICAgICAgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3RvdWNoTGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgICB0aGlzLl91bmxpc3Rlbignc2VsZWN0c3RhcnQnLCB0aGlzLl9vblNlbGVjdFN0YXJ0LCBFdmVudEV4dGVuc2lvbnMuYWN0aXZlTGlzdGVuZXIoKSk7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuKCd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICAgIHRoaXMuX3VubGlzdGVuKCdwb2ludGVydXAnLCB0aGlzLl9vblBvaW50ZXJVcEV2ZW50KTtcbiAgICAgICAgdGhpcy5fdW5saXN0ZW4oXG4gICAgICAgICAgJ3BvaW50ZXJjYW5jZWwnLFxuICAgICAgICAgIHRoaXMuX29uUG9pbnRlclVwRXZlbnQsXG4gICAgICAgICAgRXZlbnRFeHRlbnNpb25zLmFjdGl2ZUNhcHR1cmVMaXN0ZW5lcigpLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl91bmxpc3RlbihcbiAgICAgICAgICAnY29udGV4dG1lbnUnLFxuICAgICAgICAgIHRoaXMuX3ByZXZlbnREdXJpbmdEcmFnLFxuICAgICAgICAgIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVDYXB0dXJlTGlzdGVuZXIoKSxcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBzZWxlY3Qgc3RhcnQgZXZlbnQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHN0YXJ0cyBzZWxlY3RpbmcgdGV4dCBvciBlbGVtZW50cy5cbiAgICogSXQgcHJldmVudHMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kIGNhbGxzIHRoZSBvblNlbGVjdCBtZXRob2QgdG8gaGFuZGxlIHRoZSBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgc2VsZWN0IHN0YXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSBfb25TZWxlY3RTdGFydCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICB0aGlzLm9uU2VsZWN0KGV2ZW50KTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgbW91c2UgbW92ZSBldmVudCBkdXJpbmcgdGhlIGRyYWcgc2VxdWVuY2UuXG4gICAqIEl0IGNoZWNrcyBpZiB0aGUgZHJhZyBzZXF1ZW5jZSBzaG91bGQgc3RhcnQgYW5kIGNhbGxzIHRoZSBtb3ZlIGhhbmRsZXIgYWNjb3JkaW5nbHkuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgbW92ZS5cbiAgICovXG4gIHByaXZhdGUgX29uTW91c2VNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgdGhpcy5fbW92ZUhhbmRsZXIobmV3IElNb3VzZUV2ZW50KGV2ZW50KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHRvdWNoIG1vdmUgZXZlbnQgZHVyaW5nIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKiBJdCBjaGVja3MgaWYgdGhlIGRyYWcgc2VxdWVuY2Ugc2hvdWxkIHN0YXJ0IGFuZCBjYWxscyB0aGUgbW92ZSBoYW5kbGVyIGFjY29yZGluZ2x5LlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgdG91Y2ggZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIG1vdmUuXG4gICAqL1xuICBwcml2YXRlIF9vblRvdWNoTW92ZSA9IChldmVudDogVG91Y2hFdmVudCkgPT4ge1xuICAgIHRoaXMuX21vdmVIYW5kbGVyKG5ldyBJVG91Y2hNb3ZlRXZlbnQoZXZlbnQpKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBkcmFnIHNlcXVlbmNlIHNob3VsZCBzdGFydCBiYXNlZCBvbiB0aGUgcG9pbnRlciBwb3NpdGlvbi5cbiAgICogSXQgY29tcGFyZXMgdGhlIGN1cnJlbnQgcG9pbnRlciBwb3NpdGlvbiB3aXRoIHRoZSBpbml0aWFsIGRyYWcgc3RhcnQgcG9zaXRpb25cbiAgICogYW5kIGNoZWNrcyBpZiB0aGUgZGlzdGFuY2UgZXhjZWVkcyB0aGUgZHJhZyBzdGFydCB0aHJlc2hvbGQuXG4gICAqIElmIHRoZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQgYW5kIHRoZSBkZWxheSBoYXMgcGFzc2VkLFxuICAgKiBpdCBwcmVwYXJlcyB0aGUgZHJhZyBzZXF1ZW5jZSBhbmQgc2V0cyB0aGUgbW92ZSBoYW5kbGVyIHRvIG9uUG9pbnRlck1vdmUuXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBwb2ludGVyIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgX2NoZWNrRHJhZ1NlcXVlbmNlVG9TdGFydChldmVudDogSVBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHBvaW50ZXJQb3NpdGlvbiA9IGV2ZW50LmdldFBvc2l0aW9uKCk7XG5cbiAgICBpZiAoIXRoaXMuaXNEcmFnU3RhcnRlZCAmJiB0aGlzLl9wb2ludGVyRG93bkVsZW1lbnQpIHtcbiAgICAgIGV2ZW50LnNldFRhcmdldCh0aGlzLl9wb2ludGVyRG93bkVsZW1lbnQpO1xuICAgICAgY29uc3QgZGlzdGFuY2VYID0gTWF0aC5hYnMocG9pbnRlclBvc2l0aW9uLnggLSB0aGlzLl9kcmFnU3RhcnRQb3NpdGlvbi54KTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlWSA9IE1hdGguYWJzKHBvaW50ZXJQb3NpdGlvbi55IC0gdGhpcy5fZHJhZ1N0YXJ0UG9zaXRpb24ueSk7XG4gICAgICBjb25zdCBpc092ZXJUaHJlc2hvbGQgPSBkaXN0YW5jZVggKyBkaXN0YW5jZVkgPj0gdGhpcy5fZHJhZ1N0YXJ0VGhyZXNob2xkO1xuXG4gICAgICBpZiAoaXNPdmVyVGhyZXNob2xkKSB7XG4gICAgICAgIGNvbnN0IGlzRGVsYXlFbGFwc2VkID0gRGF0ZS5ub3coKSA+PSB0aGlzLl9kcmFnU3RhcnRUaW1lICsgdGhpcy5fZHJhZ1N0YXJ0RGVsYXk7XG5cbiAgICAgICAgaWYgKCFpc0RlbGF5RWxhcHNlZCkge1xuICAgICAgICAgIHRoaXMuX2VuZERyYWdTZXF1ZW5jZSgpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlRHJhZ1NlcXVlbmNlKGV2ZW50KTtcbiAgICAgICAgdGhpcy5pc0RyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbW92ZUhhbmRsZXIgPSB0aGlzLm9uUG9pbnRlck1vdmU7XG4gICAgICAgIGlmIChpc1RvdWNoRXZlbnQoZXZlbnQub3JpZ2luYWxFdmVudCkpIHtcbiAgICAgICAgICB0aGlzLl9sYXN0VG91Y2hFdmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIHRoZSBkcmFnIHNlcXVlbmNlIGJ5IHNldHRpbmcgdXAgbmVjZXNzYXJ5IGV2ZW50IGxpc3RlbmVyc1xuICAgKiBhbmQgaW5pdGlhbGl6aW5nIGFueSByZXF1aXJlZCBzdGF0ZSBmb3IgdGhlIGRyYWcgb3BlcmF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzIHRvIGRlZmluZSBzcGVjaWZpYyBkcmFnIGJlaGF2aW9yLlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgcG9pbnRlciBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgcHJlcGFyYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcHJlcGFyZURyYWdTZXF1ZW5jZShldmVudDogSVBvaW50ZXJFdmVudCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIHBvaW50ZXIgdXAgZXZlbnQgYXQgdGhlIGVuZCBvZiB0aGUgZHJhZyBzZXF1ZW5jZS5cbiAgICogSXQgY2hlY2tzIGlmIHRoZSBkcmFnIGhhcyBzdGFydGVkIGFuZCBjYWxscyB0aGUgb25Qb2ludGVyVXAgbWV0aG9kLlxuICAgKiBJdCBhbHNvIGVuZHMgdGhlIGRyYWcgc2VxdWVuY2UgYnkgcmVzZXR0aW5nIHRoZSBzdGF0ZSBhbmQgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgbW91c2UgYnV0dG9uIG9yIGxpZnRzIHRoZWlyIGZpbmdlciBmcm9tIHRoZSB0b3VjaCBzY3JlZW4uXG4gICAqIEBwYXJhbSBldmVudCAtIFRoZSBwb2ludGVyIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSB1cCBhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIF9vblBvaW50ZXJVcEV2ZW50ID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5pc0RyYWdTdGFydGVkKSB7XG4gICAgICB0aGlzLm9uUG9pbnRlclVwKG5ldyBJUG9pbnRlclVwRXZlbnQoZXZlbnQpKTtcbiAgICB9XG4gICAgdGhpcy5fZW5kRHJhZ1NlcXVlbmNlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVuZHMgdGhlIGRyYWcgc2VxdWVuY2UgYnkgcmVzZXR0aW5nIHRoZSBzdGF0ZSBhbmQgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBJdCBzZXRzIHRoZSBpc0RyYWdTdGFydGVkIGZsYWcgdG8gZmFsc2UsIGNsZWFycyB0aGUgcG9pbnRlckRvd25FbGVtZW50LFxuICAgKiBhbmQgcmVzZXRzIHRoZSBtb3ZlSGFuZGxlciB0byBjaGVja0RyYWdTZXF1ZW5jZVRvU3RhcnQuXG4gICAqIEl0IGFsc28gcmVtb3ZlcyBhbGwgbW91c2UgYW5kIHRvdWNoIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQgZHVyaW5nIHRoZSBkcmFnIHNlcXVlbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBfZW5kRHJhZ1NlcXVlbmNlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3BvaW50ZXJEb3duRWxlbWVudCA9IG51bGw7XG5cbiAgICB0aGlzLl9tb3ZlSGFuZGxlciA9IHRoaXMuX2NoZWNrRHJhZ1NlcXVlbmNlVG9TdGFydDtcbiAgICB0aGlzLl9tb3VzZUxpc3RlbmVycygpO1xuICAgIHRoaXMuX21vdXNlTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLl90b3VjaExpc3RlbmVycygpO1xuICAgIHRoaXMuX3RvdWNoTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLmZpbmFsaXplRHJhZ1NlcXVlbmNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZmluYWxpemVEcmFnU2VxdWVuY2UoKTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25TZWxlY3QoZXZlbnQ6IEV2ZW50KTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25Qb2ludGVyRG93bihldmVudDogSVBvaW50ZXJFdmVudCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG9uUG9pbnRlck1vdmUoZXZlbnQ6IElQb2ludGVyRXZlbnQpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvblBvaW50ZXJVcChldmVudDogSVBvaW50ZXJFdmVudCk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIHN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLl9uZ1pvbmU/LnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuX2xpc3RlbignbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24sIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgIHRoaXMuX2xpc3RlbigndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hEb3duLCBFdmVudEV4dGVuc2lvbnMucGFzc2l2ZUxpc3RlbmVyKCkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc3RhcnRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgICB0aGlzLl91bmxpc3RlbignbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24sIEV2ZW50RXh0ZW5zaW9ucy5hY3RpdmVMaXN0ZW5lcigpKTtcbiAgICAgIHRoaXMuX3VubGlzdGVuKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25Ub3VjaERvd24sIEV2ZW50RXh0ZW5zaW9ucy5wYXNzaXZlTGlzdGVuZXIoKSk7XG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGFydExpc3RlbmVycygpO1xuICAgIHRoaXMuX3N0YXJ0TGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLl90b3VjaExpc3RlbmVycygpO1xuICAgIHRoaXMuX3RvdWNoTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgICB0aGlzLl9tb3VzZUxpc3RlbmVycygpO1xuICAgIHRoaXMuX21vdXNlTGlzdGVuZXJzID0gRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbjxLIGV4dGVuZHMga2V5b2YgRG9jdW1lbnRFdmVudE1hcD4oXG4gICAgdHlwZTogSyxcbiAgICBsaXN0ZW5lcjogKHRoaXM6IERvY3VtZW50LCBldjogRG9jdW1lbnRFdmVudE1hcFtLXSkgPT4gdW5rbm93bixcbiAgICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VubGlzdGVuPEsgZXh0ZW5kcyBrZXlvZiBEb2N1bWVudEV2ZW50TWFwPihcbiAgICB0eXBlOiBLLFxuICAgIGxpc3RlbmVyOiAodGhpczogRG9jdW1lbnQsIGV2OiBEb2N1bWVudEV2ZW50TWFwW0tdKSA9PiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJldmVudER1cmluZ0RyYWcgPSAoZTogRXZlbnQpID0+IHtcbiAgICBpZiAodGhpcy5pc0RyYWdTdGFydGVkKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1RvdWNoRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogZXZlbnQgaXMgVG91Y2hFdmVudCB7XG4gIHJldHVybiBldmVudC50eXBlWzBdID09PSAndCc7XG59XG5cbmZ1bmN0aW9uIGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV2ZW50LmJ1dHRvbnMgPT09IDAgfHwgKGV2ZW50Lm9mZnNldFggPT09IDAgJiYgZXZlbnQub2Zmc2V0WSA9PT0gMCk7XG59XG5cbmZ1bmN0aW9uIGlzRmFrZVRvdWNoc3RhcnRGcm9tU2NyZWVuUmVhZGVyKGV2ZW50OiBUb3VjaEV2ZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IHRvdWNoOiBUb3VjaCB8IHVuZGVmaW5lZCA9XG4gICAgKGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlc1swXSkgfHwgKGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKTtcblxuICByZXR1cm4gKFxuICAgICEhdG91Y2ggJiZcbiAgICB0b3VjaC5pZGVudGlmaWVyID09PSAtMSAmJlxuICAgICh0b3VjaC5yYWRpdXNYID09IG51bGwgfHwgdG91Y2gucmFkaXVzWCA9PT0gMSkgJiZcbiAgICAodG91Y2gucmFkaXVzWSA9PSBudWxsIHx8IHRvdWNoLnJhZGl1c1kgPT09IDEpXG4gICk7XG59XG4iXX0=
@@ -1,32 +1,31 @@
1
1
  export class EventExtensions {
2
- static isSupported;
3
- static isPassiveEventListenerSupported() {
4
- if (EventExtensions.isSupported == null && typeof window !== 'undefined') {
2
+ static _isSupported;
3
+ static _isPassiveEventListenerSupported() {
4
+ if (EventExtensions._isSupported == null && typeof window !== 'undefined') {
5
5
  try {
6
6
  window.addEventListener('test', EventExtensions.emptyListener, { passive: true });
7
- EventExtensions.isSupported = true;
7
+ EventExtensions._isSupported = true;
8
8
  }
9
9
  catch (e) {
10
- EventExtensions.isSupported = false;
10
+ EventExtensions._isSupported = false;
11
11
  }
12
12
  }
13
- return EventExtensions.isSupported;
13
+ return EventExtensions._isSupported;
14
14
  }
15
- static passiveEventListener(options) {
16
- return EventExtensions.isPassiveEventListenerSupported() ? options : !!options.capture;
15
+ static _passiveEventListener(options) {
16
+ return EventExtensions._isPassiveEventListenerSupported() ? options : !!options.capture;
17
17
  }
18
18
  static activeListener() {
19
- return EventExtensions.passiveEventListener({ passive: false });
19
+ return EventExtensions._passiveEventListener({ passive: false });
20
20
  }
21
21
  static passiveListener() {
22
- return EventExtensions.passiveEventListener({ passive: true });
22
+ return EventExtensions._passiveEventListener({ passive: true });
23
23
  }
24
24
  static activeCaptureListener() {
25
- return EventExtensions.passiveEventListener({ passive: false, capture: true });
25
+ return EventExtensions._passiveEventListener({ passive: false, capture: true });
26
26
  }
27
27
  static emptyListener() {
28
- return () => {
29
- };
28
+ return () => { };
30
29
  }
31
30
  }
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQuZXh0ZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZHJhZy10b29sa2l0L2V2ZW50LmV4dGVuc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGVBQWU7SUFFbEIsTUFBTSxDQUFDLFdBQVcsQ0FBVTtJQUU1QixNQUFNLENBQUMsK0JBQStCO1FBRTVDLElBQUksZUFBZSxDQUFDLFdBQVcsSUFBSSxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDekUsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixlQUFlLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUNyQyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxlQUFlLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sZUFBZSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxDQUFDO0lBRU8sTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQWdDO1FBQ2xFLE9BQU8sZUFBZSxDQUFDLCtCQUErQixFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDekYsQ0FBQztJQUVNLE1BQU0sQ0FBQyxjQUFjO1FBQzFCLE9BQU8sZUFBZSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLE1BQU0sQ0FBQyxlQUFlO1FBQzNCLE9BQU8sZUFBZSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLE1BQU0sQ0FBQyxxQkFBcUI7UUFDakMsT0FBTyxlQUFlLENBQUMsb0JBQW9CLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFTSxNQUFNLENBQUMsYUFBYTtRQUN6QixPQUFPLEdBQUcsRUFBRTtRQUNaLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBFdmVudEV4dGVuc2lvbnMge1xuXG4gIHByaXZhdGUgc3RhdGljIGlzU3VwcG9ydGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgc3RhdGljIGlzUGFzc2l2ZUV2ZW50TGlzdGVuZXJTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG5cbiAgICBpZiAoRXZlbnRFeHRlbnNpb25zLmlzU3VwcG9ydGVkID09IG51bGwgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgRXZlbnRFeHRlbnNpb25zLmVtcHR5TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgRXZlbnRFeHRlbnNpb25zLmlzU3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgRXZlbnRFeHRlbnNpb25zLmlzU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEV2ZW50RXh0ZW5zaW9ucy5pc1N1cHBvcnRlZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhc3NpdmVFdmVudExpc3RlbmVyKG9wdGlvbnM6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKTogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMgfCBib29sZWFuIHtcbiAgICByZXR1cm4gRXZlbnRFeHRlbnNpb25zLmlzUGFzc2l2ZUV2ZW50TGlzdGVuZXJTdXBwb3J0ZWQoKSA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWN0aXZlTGlzdGVuZXIoKTogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICByZXR1cm4gRXZlbnRFeHRlbnNpb25zLnBhc3NpdmVFdmVudExpc3RlbmVyKHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHBhc3NpdmVMaXN0ZW5lcigpOiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xuICAgIHJldHVybiBFdmVudEV4dGVuc2lvbnMucGFzc2l2ZUV2ZW50TGlzdGVuZXIoeyBwYXNzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhY3RpdmVDYXB0dXJlTGlzdGVuZXIoKTogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHtcbiAgICByZXR1cm4gRXZlbnRFeHRlbnNpb25zLnBhc3NpdmVFdmVudExpc3RlbmVyKHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGVtcHR5TGlzdGVuZXIoKTogRnVuY3Rpb24ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgfTtcbiAgfVxufVxuIl19
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQuZXh0ZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZHJhZy10b29sa2l0L2V2ZW50LmV4dGVuc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGVBQWU7SUFDbEIsTUFBTSxDQUFDLFlBQVksQ0FBVTtJQUU3QixNQUFNLENBQUMsZ0NBQWdDO1FBQzdDLElBQUksZUFBZSxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDMUUsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRixlQUFlLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN0QyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxlQUFlLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sZUFBZSxDQUFDLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUNsQyxPQUFnQztRQUVoQyxPQUFPLGVBQWUsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzFGLENBQUM7SUFFTSxNQUFNLENBQUMsY0FBYztRQUMxQixPQUFPLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTSxNQUFNLENBQUMsZUFBZTtRQUMzQixPQUFPLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxNQUFNLENBQUMscUJBQXFCO1FBQ2pDLE9BQU8sZUFBZSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU0sTUFBTSxDQUFDLGFBQWE7UUFDekIsT0FBTyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEV2ZW50RXh0ZW5zaW9ucyB7XG4gIHByaXZhdGUgc3RhdGljIF9pc1N1cHBvcnRlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIHN0YXRpYyBfaXNQYXNzaXZlRXZlbnRMaXN0ZW5lclN1cHBvcnRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoRXZlbnRFeHRlbnNpb25zLl9pc1N1cHBvcnRlZCA9PSBudWxsICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIEV2ZW50RXh0ZW5zaW9ucy5lbXB0eUxpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIEV2ZW50RXh0ZW5zaW9ucy5faXNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBFdmVudEV4dGVuc2lvbnMuX2lzU3VwcG9ydGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEV2ZW50RXh0ZW5zaW9ucy5faXNTdXBwb3J0ZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfcGFzc2l2ZUV2ZW50TGlzdGVuZXIoXG4gICAgb3B0aW9uczogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4gICk6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuIEV2ZW50RXh0ZW5zaW9ucy5faXNQYXNzaXZlRXZlbnRMaXN0ZW5lclN1cHBvcnRlZCgpID8gb3B0aW9ucyA6ICEhb3B0aW9ucy5jYXB0dXJlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhY3RpdmVMaXN0ZW5lcigpOiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xuICAgIHJldHVybiBFdmVudEV4dGVuc2lvbnMuX3Bhc3NpdmVFdmVudExpc3RlbmVyKHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHBhc3NpdmVMaXN0ZW5lcigpOiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xuICAgIHJldHVybiBFdmVudEV4dGVuc2lvbnMuX3Bhc3NpdmVFdmVudExpc3RlbmVyKHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWN0aXZlQ2FwdHVyZUxpc3RlbmVyKCk6IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gICAgcmV0dXJuIEV2ZW50RXh0ZW5zaW9ucy5fcGFzc2l2ZUV2ZW50TGlzdGVuZXIoeyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZW1wdHlMaXN0ZW5lcigpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gKCkgPT4ge307XG4gIH1cbn1cbiJdfQ==