@spartan-ng/brain 0.0.1-alpha.380 → 0.0.1-alpha.382
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/accordion/lib/brn-accordion-content.component.d.ts +1 -1
- package/accordion/lib/brn-accordion.directive.d.ts +2 -2
- package/core/README.md +3 -0
- package/core/helpers/create-injection-token.d.ts +20 -0
- package/core/helpers/custom-element-class-settable.d.ts +12 -0
- package/core/helpers/dev-mode.d.ts +5 -0
- package/core/helpers/exposes-side.d.ts +13 -0
- package/core/helpers/exposes-state.d.ts +13 -0
- package/core/helpers/hlm.d.ts +2 -0
- package/core/helpers/table-classes-settable.d.ts +16 -0
- package/core/helpers/zone-free.d.ts +10 -0
- package/core/index.d.ts +7 -0
- package/esm2022/accordion/lib/brn-accordion-content.component.mjs +1 -1
- package/esm2022/accordion/lib/brn-accordion.directive.mjs +8 -3
- package/esm2022/alert-dialog/lib/brn-alert-dialog-content.directive.mjs +2 -2
- package/esm2022/alert-dialog/lib/brn-alert-dialog-overlay.component.mjs +2 -2
- package/esm2022/core/helpers/create-injection-token.mjs +15 -0
- package/esm2022/core/helpers/custom-element-class-settable.mjs +3 -0
- package/esm2022/core/helpers/dev-mode.mjs +6 -0
- package/esm2022/core/helpers/exposes-side.mjs +3 -0
- package/esm2022/core/helpers/exposes-state.mjs +3 -0
- package/esm2022/core/helpers/hlm.mjs +6 -0
- package/esm2022/core/helpers/table-classes-settable.mjs +3 -0
- package/esm2022/core/helpers/zone-free.mjs +15 -0
- package/esm2022/core/index.mjs +8 -0
- package/esm2022/core/spartan-ng-brain-core.mjs +5 -0
- package/esm2022/dialog/lib/brn-dialog-content.directive.mjs +2 -2
- package/esm2022/dialog/lib/brn-dialog-overlay.component.mjs +2 -2
- package/esm2022/dialog/lib/brn-dialog-ref.mjs +3 -2
- package/esm2022/dialog/lib/brn-dialog.component.mjs +2 -2
- package/esm2022/dialog/lib/brn-dialog.service.mjs +3 -2
- package/esm2022/hover-card/lib/brn-hover-card-content.service.mjs +26 -36
- package/esm2022/hover-card/lib/brn-hover-card.component.mjs +8 -14
- package/esm2022/hover-card/lib/createHoverObservable.mjs +4 -3
- package/esm2022/menu/lib/brn-menu-trigger.directive.mjs +9 -3
- package/esm2022/popover/lib/brn-popover-content.directive.mjs +2 -2
- package/esm2022/radio-group/index.mjs +5 -5
- package/esm2022/radio-group/lib/{brn-radio-group.component.mjs → brn-radio-group.directive.mjs} +12 -12
- package/esm2022/radio-group/lib/brn-radio-group.token.mjs +3 -3
- package/esm2022/select/lib/brn-select-content.component.mjs +3 -2
- package/esm2022/select/lib/brn-select.component.mjs +4 -3
- package/esm2022/select/lib/brn-select.service.mjs +3 -2
- package/esm2022/sheet/lib/brn-sheet-content.directive.mjs +2 -2
- package/esm2022/sheet/lib/brn-sheet-overlay.component.mjs +2 -2
- package/esm2022/slider/lib/brn-slider-track.directive.mjs +3 -2
- package/esm2022/table/lib/brn-table.component.mjs +2 -2
- package/esm2022/tabs/lib/brn-tabs-list.directive.mjs +3 -2
- package/esm2022/toggle/lib/brn-toggle.directive.mjs +3 -3
- package/esm2022/tooltip/index.mjs +2 -1
- package/esm2022/tooltip/lib/brn-tooltip-content.component.mjs +8 -15
- package/esm2022/tooltip/lib/brn-tooltip-trigger.directive.mjs +136 -200
- package/esm2022/tooltip/lib/brn-tooltip.token.mjs +18 -0
- package/esm2022/tooltip/lib/computed-previous.mjs +46 -0
- package/fesm2022/spartan-ng-brain-accordion.mjs +7 -2
- package/fesm2022/spartan-ng-brain-accordion.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-alert-dialog.mjs +1 -1
- package/fesm2022/spartan-ng-brain-alert-dialog.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-core.mjs +57 -0
- package/fesm2022/spartan-ng-brain-core.mjs.map +1 -0
- package/fesm2022/spartan-ng-brain-dialog.mjs +3 -2
- package/fesm2022/spartan-ng-brain-dialog.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-hover-card.mjs +31 -40
- package/fesm2022/spartan-ng-brain-hover-card.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-menu.mjs +8 -2
- package/fesm2022/spartan-ng-brain-menu.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-popover.mjs +1 -1
- package/fesm2022/spartan-ng-brain-popover.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-radio-group.mjs +16 -16
- package/fesm2022/spartan-ng-brain-radio-group.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-select.mjs +3 -2
- package/fesm2022/spartan-ng-brain-select.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-sheet.mjs +1 -1
- package/fesm2022/spartan-ng-brain-sheet.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-slider.mjs +2 -1
- package/fesm2022/spartan-ng-brain-slider.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-table.mjs +1 -1
- package/fesm2022/spartan-ng-brain-table.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-tabs.mjs +2 -2
- package/fesm2022/spartan-ng-brain-tabs.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-toggle.mjs +2 -2
- package/fesm2022/spartan-ng-brain-toggle.mjs.map +1 -1
- package/fesm2022/spartan-ng-brain-tooltip.mjs +200 -211
- package/fesm2022/spartan-ng-brain-tooltip.mjs.map +1 -1
- package/hlm-tailwind-preset.js +73 -0
- package/hover-card/lib/brn-hover-card-content.service.d.ts +18 -11
- package/hover-card/lib/brn-hover-card.component.d.ts +2 -2
- package/hover-card/lib/createHoverObservable.d.ts +1 -1
- package/menu/lib/brn-menu-trigger.directive.d.ts +1 -1
- package/package.json +57 -46
- package/radio-group/index.d.ts +5 -5
- package/radio-group/lib/{brn-radio-group.component.d.ts → brn-radio-group.directive.d.ts} +3 -3
- package/radio-group/lib/brn-radio-group.token.d.ts +3 -3
- package/radio-group/lib/brn-radio.component.d.ts +1 -1
- package/select/lib/brn-select.component.d.ts +1 -1
- package/sheet/lib/brn-sheet-content.directive.d.ts +1 -1
- package/table/lib/brn-table.component.d.ts +1 -1
- package/tooltip/index.d.ts +1 -0
- package/tooltip/lib/brn-tooltip-content.component.d.ts +2 -2
- package/tooltip/lib/brn-tooltip-trigger.directive.d.ts +24 -64
- package/tooltip/lib/brn-tooltip.token.d.ts +28 -0
- package/tooltip/lib/computed-previous.d.ts +36 -0
|
@@ -14,15 +14,17 @@ import { AriaDescriber, FocusMonitor } from '@angular/cdk/a11y';
|
|
|
14
14
|
import { Directionality } from '@angular/cdk/bidi';
|
|
15
15
|
import { hasModifierKey } from '@angular/cdk/keycodes';
|
|
16
16
|
import { Overlay, ScrollDispatcher, } from '@angular/cdk/overlay';
|
|
17
|
-
import {
|
|
17
|
+
import { normalizePassiveListenerOptions, Platform } from '@angular/cdk/platform';
|
|
18
18
|
import { ComponentPortal } from '@angular/cdk/portal';
|
|
19
19
|
import { DOCUMENT } from '@angular/common';
|
|
20
|
-
import {
|
|
21
|
-
import { brnDevMode } from '@spartan-ng/
|
|
20
|
+
import { booleanAttribute, computed, Directive, effect, ElementRef, inject, InjectionToken, input, isDevMode, NgZone, numberAttribute, untracked, ViewContainerRef, } from '@angular/core';
|
|
21
|
+
import { brnDevMode } from '@spartan-ng/brain/core';
|
|
22
22
|
import { Subject } from 'rxjs';
|
|
23
23
|
import { take, takeUntil } from 'rxjs/operators';
|
|
24
24
|
import { BrnTooltipContentComponent } from './brn-tooltip-content.component';
|
|
25
25
|
import { BrnTooltipDirective } from './brn-tooltip.directive';
|
|
26
|
+
import { injectBrnTooltipDefaultOptions } from './brn-tooltip.token';
|
|
27
|
+
import { computedPrevious } from './computed-previous';
|
|
26
28
|
import * as i0 from "@angular/core";
|
|
27
29
|
/** Time in ms to throttle repositioning after scroll events. */
|
|
28
30
|
export const SCROLL_THROTTLE_MS = 20;
|
|
@@ -36,17 +38,6 @@ export const BRN_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {
|
|
|
36
38
|
deps: [Overlay],
|
|
37
39
|
useFactory: (overlay) => () => overlay.scrollStrategies.reposition({ scrollThrottle: SCROLL_THROTTLE_MS }),
|
|
38
40
|
};
|
|
39
|
-
export function BRN_TOOLTIP_DEFAULT_OPTIONS_FACTORY() {
|
|
40
|
-
return {
|
|
41
|
-
showDelay: 0,
|
|
42
|
-
hideDelay: 0,
|
|
43
|
-
touchendHideDelay: 1500,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
export const BRN_TOOLTIP_DEFAULT_OPTIONS = new InjectionToken('mat-tooltip-default-options', {
|
|
47
|
-
providedIn: 'root',
|
|
48
|
-
factory: BRN_TOOLTIP_DEFAULT_OPTIONS_FACTORY,
|
|
49
|
-
});
|
|
50
41
|
const PANEL_CLASS = 'tooltip-panel';
|
|
51
42
|
/** Options used to bind passive event listeners. */
|
|
52
43
|
const passiveListenerOptions = normalizePassiveListenerOptions({ passive: true });
|
|
@@ -64,7 +55,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
64
55
|
_cssClassPrefix = 'brn';
|
|
65
56
|
_destroyed = new Subject();
|
|
66
57
|
_passiveListeners = [];
|
|
67
|
-
_defaultOptions =
|
|
58
|
+
_defaultOptions = injectBrnTooltipDefaultOptions();
|
|
68
59
|
_overlay = inject(Overlay);
|
|
69
60
|
_elementRef = inject((ElementRef));
|
|
70
61
|
_scrollDispatcher = inject(ScrollDispatcher);
|
|
@@ -85,89 +76,26 @@ export class BrnTooltipTriggerDirective {
|
|
|
85
76
|
_overlayRef = null;
|
|
86
77
|
_tooltipInstance = null;
|
|
87
78
|
/** Allows the user to define the position of the tooltip relative to the parent element */
|
|
88
|
-
|
|
89
|
-
get position() {
|
|
90
|
-
return this._position();
|
|
91
|
-
}
|
|
92
|
-
set position(value) {
|
|
93
|
-
if (value !== this._position()) {
|
|
94
|
-
this._position.set(value);
|
|
95
|
-
if (this._overlayRef) {
|
|
96
|
-
this._updatePosition(this._overlayRef);
|
|
97
|
-
this._tooltipInstance?.show(0);
|
|
98
|
-
this._overlayRef.updatePosition();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
79
|
+
position = input(this._defaultOptions?.position ?? 'above');
|
|
102
80
|
/**
|
|
103
81
|
* Whether tooltip should be relative to the click or touch origin
|
|
104
82
|
* instead of outside the element bounding box.
|
|
105
83
|
*/
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
set positionAtOrigin(value) {
|
|
111
|
-
this._positionAtOrigin.set(value);
|
|
112
|
-
this._detach();
|
|
113
|
-
this._overlayRef = null;
|
|
114
|
-
}
|
|
84
|
+
positionAtOrigin = input(this._defaultOptions?.positionAtOrigin ?? false, {
|
|
85
|
+
transform: booleanAttribute,
|
|
86
|
+
});
|
|
115
87
|
/** Disables the display of the tooltip. */
|
|
116
|
-
|
|
117
|
-
get disabled() {
|
|
118
|
-
return this._disabled();
|
|
119
|
-
}
|
|
120
|
-
set disabled(value) {
|
|
121
|
-
this._disabled.set(value);
|
|
122
|
-
// If tooltip is disabled, hide immediately.
|
|
123
|
-
if (value) {
|
|
124
|
-
this.hide(0);
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
this._setupPointerEnterEventsIfNeeded();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
88
|
+
brnTooltipDisabled = input(false, { transform: booleanAttribute });
|
|
130
89
|
/** The default delay in ms before showing the tooltip after show is called */
|
|
131
|
-
|
|
132
|
-
get showDelay() {
|
|
133
|
-
return this._showDelay();
|
|
134
|
-
}
|
|
135
|
-
set showDelay(value) {
|
|
136
|
-
this._showDelay.set(value);
|
|
137
|
-
}
|
|
90
|
+
showDelay = input(this._defaultOptions?.showDelay ?? 0, { transform: numberAttribute });
|
|
138
91
|
/** The default delay in ms before hiding the tooltip after hide is called */
|
|
139
|
-
|
|
140
|
-
get hideDelay() {
|
|
141
|
-
return this._hideDelay();
|
|
142
|
-
}
|
|
143
|
-
set hideDelay(value) {
|
|
144
|
-
this._hideDelay.set(value);
|
|
145
|
-
if (this._tooltipInstance) {
|
|
146
|
-
this._tooltipInstance._mouseLeaveHideDelay = this._hideDelay();
|
|
147
|
-
}
|
|
148
|
-
}
|
|
92
|
+
hideDelay = input(this._defaultOptions?.hideDelay ?? 0, { transform: numberAttribute });
|
|
149
93
|
/** The default duration in ms that exit animation takes before hiding */
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
set exitAnimationDuration(value) {
|
|
155
|
-
this._exitAnimationDuration.set(value);
|
|
156
|
-
if (this._tooltipInstance) {
|
|
157
|
-
this._tooltipInstance._exitAnimationDuration = this._exitAnimationDuration();
|
|
158
|
-
}
|
|
159
|
-
}
|
|
94
|
+
exitAnimationDuration = input(this._defaultOptions?.exitAnimationDuration ?? 0, {
|
|
95
|
+
transform: numberAttribute,
|
|
96
|
+
});
|
|
160
97
|
/** The default delay in ms before hiding the tooltip after hide is called */
|
|
161
|
-
|
|
162
|
-
get tooltipContentClasses() {
|
|
163
|
-
return this._tooltipContentClasses();
|
|
164
|
-
}
|
|
165
|
-
set tooltipContentClasses(value) {
|
|
166
|
-
this._tooltipContentClasses.set(value ?? '');
|
|
167
|
-
if (this._tooltipInstance) {
|
|
168
|
-
this._tooltipInstance._tooltipClasses.set(value ?? '');
|
|
169
|
-
}
|
|
170
|
-
}
|
|
98
|
+
tooltipContentClasses = input(this._defaultOptions?.tooltipContentClasses ?? '');
|
|
171
99
|
/**
|
|
172
100
|
* How touch gestures should be handled by the tooltip. On touch devices the tooltip directive
|
|
173
101
|
* uses a long press gesture to show and hide, however it can conflict with the native browser
|
|
@@ -182,78 +110,110 @@ export class BrnTooltipTriggerDirective {
|
|
|
182
110
|
* - `off` - Disables touch gestures. Note that this will prevent the tooltip from
|
|
183
111
|
* showing on touch devices.
|
|
184
112
|
*/
|
|
185
|
-
|
|
186
|
-
set touchGestures(value) {
|
|
187
|
-
this._touchGestures.set(value);
|
|
188
|
-
}
|
|
189
|
-
get touchGestures() {
|
|
190
|
-
return this._touchGestures();
|
|
191
|
-
}
|
|
113
|
+
touchGestures = input(this._defaultOptions?.touchGestures ?? 'auto');
|
|
192
114
|
/** The message to be used to describe the aria in the tooltip */
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
return this._ariaDescribedBy;
|
|
196
|
-
}
|
|
197
|
-
set ariaDescribedBy(value) {
|
|
198
|
-
this._ariaDescriber.removeDescription(this._elementRef.nativeElement, this._ariaDescribedBy, 'tooltip');
|
|
199
|
-
// If the message is not a string (e.g. number), convert it to a string and trim it.
|
|
200
|
-
// Must convert with `String(value)`, not `${value}`, otherwise Closure Compiler optimises
|
|
201
|
-
// away the string-conversion: https://github.com/angular/components/issues/20684
|
|
202
|
-
this._ariaDescribedBy = value !== null ? String(value).trim() : '';
|
|
203
|
-
if (this._ariaDescribedBy && !this._isTooltipVisible()) {
|
|
204
|
-
this._ngZone.runOutsideAngular(() => {
|
|
205
|
-
// The `AriaDescriber` has some functionality that avoids adding a description if it's the
|
|
206
|
-
// same as the `aria-label` of an element, however we can't know whether the tooltip trigger
|
|
207
|
-
// has a data-bound `aria-label` or when it'll be set for the first time. We can avoid the
|
|
208
|
-
// issue by deferring the description by a tick so Angular has time to set the `aria-label`.
|
|
209
|
-
Promise.resolve().then(() => {
|
|
210
|
-
this._ariaDescriber.describe(this._elementRef.nativeElement, this._ariaDescribedBy, 'tooltip');
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
}
|
|
115
|
+
ariaDescribedBy = input('', { alias: 'aria-describedby' });
|
|
116
|
+
ariaDescribedByPrevious = computedPrevious(this.ariaDescribedBy);
|
|
215
117
|
/** The content to be displayed in the tooltip */
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
set content(value) {
|
|
221
|
-
this._content = value;
|
|
222
|
-
if (!this._content && this._isTooltipVisible()) {
|
|
223
|
-
this.hide(0);
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
this._setupPointerEnterEventsIfNeeded();
|
|
227
|
-
this._updateTooltipContent();
|
|
118
|
+
brnTooltipTrigger = input(null);
|
|
119
|
+
brnTooltipTriggerState = computed(() => {
|
|
120
|
+
if (this._tooltipDirective) {
|
|
121
|
+
return this._tooltipDirective.tooltipTemplate();
|
|
228
122
|
}
|
|
229
|
-
|
|
123
|
+
return this.brnTooltipTrigger();
|
|
124
|
+
});
|
|
230
125
|
constructor() {
|
|
231
|
-
if (this._defaultOptions) {
|
|
232
|
-
this._showDelay.set(this._defaultOptions.showDelay);
|
|
233
|
-
this._hideDelay.set(this._defaultOptions.hideDelay);
|
|
234
|
-
if (this._defaultOptions.position) {
|
|
235
|
-
this.position = this._defaultOptions.position;
|
|
236
|
-
}
|
|
237
|
-
if (this._defaultOptions.positionAtOrigin) {
|
|
238
|
-
this.positionAtOrigin = this._defaultOptions.positionAtOrigin;
|
|
239
|
-
}
|
|
240
|
-
if (this._defaultOptions.touchGestures) {
|
|
241
|
-
this.touchGestures = this._defaultOptions.touchGestures;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
126
|
this._dir.change.pipe(takeUntil(this._destroyed)).subscribe(() => {
|
|
245
127
|
if (this._overlayRef) {
|
|
246
128
|
this._updatePosition(this._overlayRef);
|
|
247
129
|
}
|
|
248
130
|
});
|
|
249
131
|
this._viewportMargin = MIN_VIEWPORT_TOOLTIP_THRESHOLD;
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
132
|
+
this._initBrnTooltipTriggerEffect();
|
|
133
|
+
this._initAriaDescribedByPreviousEffect();
|
|
134
|
+
this._initTooltipContentClassesEffect();
|
|
135
|
+
this._initPositionEffect();
|
|
136
|
+
this._initPositionAtOriginEffect();
|
|
137
|
+
this._initBrnTooltipDisabledEffect();
|
|
138
|
+
this._initExitAnimationDurationEffect();
|
|
139
|
+
this._initHideDelayEffect();
|
|
140
|
+
}
|
|
141
|
+
_initPositionEffect() {
|
|
142
|
+
effect(() => {
|
|
143
|
+
if (this._overlayRef) {
|
|
144
|
+
this._updatePosition(this._overlayRef);
|
|
145
|
+
this._tooltipInstance?.show(0);
|
|
146
|
+
this._overlayRef.updatePosition();
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
_initBrnTooltipDisabledEffect() {
|
|
151
|
+
effect(() => {
|
|
152
|
+
if (this.brnTooltipDisabled()) {
|
|
153
|
+
this.hide(0);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this._setupPointerEnterEventsIfNeeded();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
_initPositionAtOriginEffect() {
|
|
161
|
+
effect(() => {
|
|
162
|
+
// Needed that the effect got triggered
|
|
163
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
164
|
+
const _ = this.positionAtOrigin();
|
|
165
|
+
this._detach();
|
|
166
|
+
this._overlayRef = null;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
_initTooltipContentClassesEffect() {
|
|
170
|
+
effect(() => {
|
|
171
|
+
if (this._tooltipInstance) {
|
|
172
|
+
this._tooltipInstance._tooltipClasses.set(this.tooltipContentClasses() ?? '');
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
_initAriaDescribedByPreviousEffect() {
|
|
177
|
+
effect(() => {
|
|
178
|
+
const ariaDescribedBy = this.ariaDescribedBy();
|
|
179
|
+
this._ariaDescriber.removeDescription(this._elementRef.nativeElement, untracked(() => this.ariaDescribedByPrevious()), 'tooltip');
|
|
180
|
+
if (ariaDescribedBy && !this._isTooltipVisible()) {
|
|
181
|
+
this._ngZone.runOutsideAngular(() => {
|
|
182
|
+
// The `AriaDescriber` has some functionality that avoids adding a description if it's the
|
|
183
|
+
// same as the `aria-label` of an element, however we can't know whether the tooltip trigger
|
|
184
|
+
// has a data-bound `aria-label` or when it'll be set for the first time. We can avoid the
|
|
185
|
+
// issue by deferring the description by a tick so Angular has time to set the `aria-label`.
|
|
186
|
+
Promise.resolve().then(() => {
|
|
187
|
+
this._ariaDescriber.describe(this._elementRef.nativeElement, ariaDescribedBy, 'tooltip');
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
_initBrnTooltipTriggerEffect() {
|
|
194
|
+
effect(() => {
|
|
195
|
+
if (!this.brnTooltipTriggerState() && this._isTooltipVisible()) {
|
|
196
|
+
this.hide(0);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
this._setupPointerEnterEventsIfNeeded();
|
|
200
|
+
this._updateTooltipContent();
|
|
201
|
+
}
|
|
202
|
+
}, { allowSignalWrites: true });
|
|
203
|
+
}
|
|
204
|
+
_initExitAnimationDurationEffect() {
|
|
205
|
+
effect(() => {
|
|
206
|
+
if (this._tooltipInstance) {
|
|
207
|
+
this._tooltipInstance._exitAnimationDuration = this.exitAnimationDuration();
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
_initHideDelayEffect() {
|
|
212
|
+
effect(() => {
|
|
213
|
+
if (this._tooltipInstance) {
|
|
214
|
+
this._tooltipInstance._mouseLeaveHideDelay = this.hideDelay();
|
|
215
|
+
}
|
|
216
|
+
});
|
|
257
217
|
}
|
|
258
218
|
ngAfterViewInit() {
|
|
259
219
|
// This needs to happen after view init so the initial values for all inputs have been set.
|
|
@@ -271,7 +231,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
271
231
|
this._ngZone.run(() => this.show());
|
|
272
232
|
}
|
|
273
233
|
});
|
|
274
|
-
if (brnDevMode && !this.
|
|
234
|
+
if (brnDevMode && !this.ariaDescribedBy()) {
|
|
275
235
|
console.warn('BrnTooltip: "aria-describedby" attribute is required for accessibility');
|
|
276
236
|
}
|
|
277
237
|
}
|
|
@@ -290,12 +250,12 @@ export class BrnTooltipTriggerDirective {
|
|
|
290
250
|
this._passiveListeners.length = 0;
|
|
291
251
|
this._destroyed.next();
|
|
292
252
|
this._destroyed.complete();
|
|
293
|
-
this._ariaDescriber.removeDescription(nativeElement, this.
|
|
253
|
+
this._ariaDescriber.removeDescription(nativeElement, this.ariaDescribedBy(), 'tooltip');
|
|
294
254
|
this._focusMonitor.stopMonitoring(nativeElement);
|
|
295
255
|
}
|
|
296
256
|
/** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */
|
|
297
|
-
show(delay = this.showDelay, origin) {
|
|
298
|
-
if (this.
|
|
257
|
+
show(delay = this.showDelay(), origin) {
|
|
258
|
+
if (this.brnTooltipDisabled() || this._isTooltipVisible()) {
|
|
299
259
|
this._tooltipInstance?._cancelPendingAnimations();
|
|
300
260
|
return;
|
|
301
261
|
}
|
|
@@ -304,16 +264,16 @@ export class BrnTooltipTriggerDirective {
|
|
|
304
264
|
this._portal = this._portal || new ComponentPortal(this._tooltipComponent, this._viewContainerRef);
|
|
305
265
|
const instance = (this._tooltipInstance = overlayRef.attach(this._portal).instance);
|
|
306
266
|
instance._triggerElement = this._elementRef.nativeElement;
|
|
307
|
-
instance._mouseLeaveHideDelay = this.
|
|
308
|
-
instance._tooltipClasses.set(this.
|
|
309
|
-
instance._exitAnimationDuration = this.
|
|
267
|
+
instance._mouseLeaveHideDelay = this.hideDelay();
|
|
268
|
+
instance._tooltipClasses.set(this.tooltipContentClasses());
|
|
269
|
+
instance._exitAnimationDuration = this.exitAnimationDuration();
|
|
310
270
|
instance.side.set(this._currentPosition ?? 'above');
|
|
311
271
|
instance.afterHidden.pipe(takeUntil(this._destroyed)).subscribe(() => this._detach());
|
|
312
272
|
this._updateTooltipContent();
|
|
313
273
|
instance.show(delay);
|
|
314
274
|
}
|
|
315
275
|
/** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */
|
|
316
|
-
hide(delay = this.hideDelay, exitAnimationDuration = this.exitAnimationDuration) {
|
|
276
|
+
hide(delay = this.hideDelay(), exitAnimationDuration = this.exitAnimationDuration()) {
|
|
317
277
|
const instance = this._tooltipInstance;
|
|
318
278
|
if (instance) {
|
|
319
279
|
if (instance.isVisible()) {
|
|
@@ -334,7 +294,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
334
294
|
_createOverlay(origin) {
|
|
335
295
|
if (this._overlayRef) {
|
|
336
296
|
const existingStrategy = this._overlayRef.getConfig().positionStrategy;
|
|
337
|
-
if ((!this.positionAtOrigin || !origin) && existingStrategy._origin instanceof ElementRef) {
|
|
297
|
+
if ((!this.positionAtOrigin() || !origin) && existingStrategy._origin instanceof ElementRef) {
|
|
338
298
|
return this._overlayRef;
|
|
339
299
|
}
|
|
340
300
|
this._detach();
|
|
@@ -343,7 +303,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
343
303
|
// Create connected position strategy that listens for scroll events to reposition.
|
|
344
304
|
const strategy = this._overlay
|
|
345
305
|
.position()
|
|
346
|
-
.flexibleConnectedTo(this.positionAtOrigin ? origin || this._elementRef : this._elementRef)
|
|
306
|
+
.flexibleConnectedTo(this.positionAtOrigin() ? origin || this._elementRef : this._elementRef)
|
|
347
307
|
.withTransformOriginOn(`.${this._cssClassPrefix}-tooltip`)
|
|
348
308
|
.withFlexibleDimensions(false)
|
|
349
309
|
.withViewportMargin(this._viewportMargin)
|
|
@@ -427,7 +387,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
427
387
|
*/
|
|
428
388
|
_getOrigin() {
|
|
429
389
|
const isLtr = !this._dir || this._dir.value === 'ltr';
|
|
430
|
-
const position = this.position;
|
|
390
|
+
const position = this.position();
|
|
431
391
|
let originPosition;
|
|
432
392
|
if (position === 'above' || position === 'below') {
|
|
433
393
|
originPosition = { originX: 'center', originY: position === 'above' ? 'top' : 'bottom' };
|
|
@@ -450,7 +410,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
450
410
|
/** Returns the overlay position and a fallback position based on the user's preference */
|
|
451
411
|
_getOverlayPosition() {
|
|
452
412
|
const isLtr = !this._dir || this._dir.value === 'ltr';
|
|
453
|
-
const position = this.position;
|
|
413
|
+
const position = this.position();
|
|
454
414
|
let overlayPosition;
|
|
455
415
|
if (position === 'above') {
|
|
456
416
|
overlayPosition = { overlayX: 'center', overlayY: 'bottom' };
|
|
@@ -478,7 +438,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
478
438
|
// Must wait for the template to be painted to the tooltip so that the overlay can properly
|
|
479
439
|
// calculate the correct positioning based on the size of the tek-pate.
|
|
480
440
|
if (this._tooltipInstance) {
|
|
481
|
-
this._tooltipInstance.content = this.
|
|
441
|
+
this._tooltipInstance.content = this.brnTooltipTriggerState();
|
|
482
442
|
this._tooltipInstance._markForCheck();
|
|
483
443
|
this._ngZone.onMicrotaskEmpty.pipe(take(1), takeUntil(this._destroyed)).subscribe(() => {
|
|
484
444
|
if (this._tooltipInstance) {
|
|
@@ -489,7 +449,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
489
449
|
}
|
|
490
450
|
/** Inverts an overlay position. */
|
|
491
451
|
_invertPosition(x, y) {
|
|
492
|
-
if (this.position === 'above' || this.position === 'below') {
|
|
452
|
+
if (this.position() === 'above' || this.position() === 'below') {
|
|
493
453
|
if (y === 'top') {
|
|
494
454
|
y = 'bottom';
|
|
495
455
|
}
|
|
@@ -535,7 +495,10 @@ export class BrnTooltipTriggerDirective {
|
|
|
535
495
|
/** Binds the pointer events to the tooltip trigger. */
|
|
536
496
|
_setupPointerEnterEventsIfNeeded() {
|
|
537
497
|
// Optimization: Defer hooking up events if there's no content or the tooltip is disabled.
|
|
538
|
-
if (this.
|
|
498
|
+
if (this.brnTooltipDisabled() ||
|
|
499
|
+
!this.brnTooltipTriggerState() ||
|
|
500
|
+
!this._viewInitialized ||
|
|
501
|
+
this._passiveListeners.length) {
|
|
539
502
|
return;
|
|
540
503
|
}
|
|
541
504
|
// The mouse events shouldn't be bound on mobile devices, because they can prevent the
|
|
@@ -553,7 +516,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
553
516
|
},
|
|
554
517
|
]);
|
|
555
518
|
}
|
|
556
|
-
else if (this.touchGestures !== 'off') {
|
|
519
|
+
else if (this.touchGestures() !== 'off') {
|
|
557
520
|
this._disableNativeGesturesIfNecessary();
|
|
558
521
|
this._passiveListeners.push([
|
|
559
522
|
'touchstart',
|
|
@@ -587,7 +550,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
587
550
|
},
|
|
588
551
|
], ['wheel', (event) => this._wheelListener(event)]);
|
|
589
552
|
}
|
|
590
|
-
else if (this.touchGestures !== 'off') {
|
|
553
|
+
else if (this.touchGestures() !== 'off') {
|
|
591
554
|
this._disableNativeGesturesIfNecessary();
|
|
592
555
|
const touchendListener = () => {
|
|
593
556
|
clearTimeout(this._touchstartTimeout);
|
|
@@ -622,7 +585,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
622
585
|
}
|
|
623
586
|
/** Disables the native browser gestures, based on how the tooltip has been configured. */
|
|
624
587
|
_disableNativeGesturesIfNecessary() {
|
|
625
|
-
const gestures = this.touchGestures;
|
|
588
|
+
const gestures = this.touchGestures();
|
|
626
589
|
if (gestures !== 'off') {
|
|
627
590
|
const element = this._elementRef.nativeElement;
|
|
628
591
|
const style = element.style;
|
|
@@ -644,7 +607,7 @@ export class BrnTooltipTriggerDirective {
|
|
|
644
607
|
}
|
|
645
608
|
}
|
|
646
609
|
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: BrnTooltipTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
647
|
-
/** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
610
|
+
/** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.5", type: BrnTooltipTriggerDirective, isStandalone: true, selector: "[brnTooltipTrigger]", inputs: { position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, positionAtOrigin: { classPropertyName: "positionAtOrigin", publicName: "positionAtOrigin", isSignal: true, isRequired: false, transformFunction: null }, brnTooltipDisabled: { classPropertyName: "brnTooltipDisabled", publicName: "brnTooltipDisabled", isSignal: true, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "showDelay", isSignal: true, isRequired: false, transformFunction: null }, hideDelay: { classPropertyName: "hideDelay", publicName: "hideDelay", isSignal: true, isRequired: false, transformFunction: null }, exitAnimationDuration: { classPropertyName: "exitAnimationDuration", publicName: "exitAnimationDuration", isSignal: true, isRequired: false, transformFunction: null }, tooltipContentClasses: { classPropertyName: "tooltipContentClasses", publicName: "tooltipContentClasses", isSignal: true, isRequired: false, transformFunction: null }, touchGestures: { classPropertyName: "touchGestures", publicName: "touchGestures", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedBy: { classPropertyName: "ariaDescribedBy", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, brnTooltipTrigger: { classPropertyName: "brnTooltipTrigger", publicName: "brnTooltipTrigger", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.brn-tooltip-disabled": "brnTooltipDisabled()" }, classAttribute: "brn-tooltip-trigger" }, providers: [BRN_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER], exportAs: ["brnTooltipTrigger"], ngImport: i0 });
|
|
648
611
|
}
|
|
649
612
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: BrnTooltipTriggerDirective, decorators: [{
|
|
650
613
|
type: Directive,
|
|
@@ -655,35 +618,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
|
|
|
655
618
|
providers: [BRN_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER],
|
|
656
619
|
host: {
|
|
657
620
|
class: 'brn-tooltip-trigger',
|
|
658
|
-
'[class.brn-tooltip-disabled]': '
|
|
621
|
+
'[class.brn-tooltip-disabled]': 'brnTooltipDisabled()',
|
|
659
622
|
},
|
|
660
623
|
}]
|
|
661
|
-
}], ctorParameters: () => []
|
|
662
|
-
type: Input
|
|
663
|
-
}], positionAtOrigin: [{
|
|
664
|
-
type: Input,
|
|
665
|
-
args: [{ transform: booleanAttribute }]
|
|
666
|
-
}], disabled: [{
|
|
667
|
-
type: Input,
|
|
668
|
-
args: [{ transform: booleanAttribute, alias: 'brnTooltipDisabled' }]
|
|
669
|
-
}], showDelay: [{
|
|
670
|
-
type: Input,
|
|
671
|
-
args: [{ transform: numberAttribute }]
|
|
672
|
-
}], hideDelay: [{
|
|
673
|
-
type: Input,
|
|
674
|
-
args: [{ transform: numberAttribute }]
|
|
675
|
-
}], exitAnimationDuration: [{
|
|
676
|
-
type: Input,
|
|
677
|
-
args: [{ transform: numberAttribute }]
|
|
678
|
-
}], tooltipContentClasses: [{
|
|
679
|
-
type: Input
|
|
680
|
-
}], touchGestures: [{
|
|
681
|
-
type: Input
|
|
682
|
-
}], ariaDescribedBy: [{
|
|
683
|
-
type: Input,
|
|
684
|
-
args: ['aria-describedby']
|
|
685
|
-
}], content: [{
|
|
686
|
-
type: Input,
|
|
687
|
-
args: ['brnTooltipTrigger']
|
|
688
|
-
}] } });
|
|
689
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJuLXRvb2x0aXAtdHJpZ2dlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2JyYWluL3Rvb2x0aXAvc3JjL2xpYi9icm4tdG9vbHRpcC10cmlnZ2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUg7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFNTixPQUFPLEVBR1AsZ0JBQWdCLEdBR2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVOLFNBQVMsRUFDVCxVQUFVLEVBQ1YsY0FBYyxFQUNkLEtBQUssRUFDTCxNQUFNLEVBR04sZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxlQUFlLEVBQ2YsTUFBTSxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0UsT0FBTyxF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QixnQkFBZ0IsZ0RBYWhCLGdCQUFnQix5Q0FrQmhCLGVBQWUseUNBV2YsZUFBZSw2RUFlZixlQUFlLGdUQXBIeEIsQ0FBQyw0Q0FBNEMsQ0FBQzs7MkZBTTdDLDBCQUEwQjtrQkFWdEMsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUscUJBQXFCO29CQUMvQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsU0FBUyxFQUFFLENBQUMsNENBQTRDLENBQUM7b0JBQ3pELElBQUksRUFBRTt3QkFDTCxLQUFLLEVBQUUscUJBQXFCO3dCQUM1Qiw4QkFBOEIsRUFBRSxVQUFVO3FCQUMxQztpQkFDRDt3REFpQ1csUUFBUTtzQkFEbEIsS0FBSztnQkF1QkssZ0JBQWdCO3NCQUQxQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQWMzQixRQUFRO3NCQURsQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRTtnQkFtQnhELFNBQVM7c0JBRG5CLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQVkxQixTQUFTO3NCQURuQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFnQjFCLHFCQUFxQjtzQkFEL0IsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBZ0IxQixxQkFBcUI7c0JBRC9CLEtBQUs7Z0JBNkJLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBWUssZUFBZTtzQkFEekIsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBNkJkLE9BQU87c0JBRGpCLEtBQUs7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZSBhcmUgYnVpbGRpbmcgb24gc2hvdWxkZXJzIG9mIGdpYW50cyBoZXJlIGFuZCBhZGFwdCB0aGUgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIGluY3JlZGlibGUgQW5ndWxhclxuICogdGVhbTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21haW4vc3JjL21hdGVyaWFsL3Rvb2x0aXAvdG9vbHRpcC50c1xuICogQ2hlY2sgdGhlbSBvdXQhIEdpdmUgdGhlbSBhIHRyeSEgTGVhdmUgYSBzdGFyISBUaGVpciB3b3JrIGlzIGluY3JlZGlibGUhXG4gKi9cblxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQgeyBBcmlhRGVzY3JpYmVyLCBGb2N1c01vbml0b3IgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IGhhc01vZGlmaWVyS2V5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG5cdHR5cGUgQ29ubmVjdGVkUG9zaXRpb24sXG5cdHR5cGUgQ29ubmVjdGlvblBvc2l0aW9uUGFpcixcblx0dHlwZSBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXG5cdHR5cGUgSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3MsXG5cdHR5cGUgT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uLFxuXHRPdmVybGF5LFxuXHR0eXBlIE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb24sXG5cdHR5cGUgT3ZlcmxheVJlZixcblx0U2Nyb2xsRGlzcGF0Y2hlcixcblx0dHlwZSBTY3JvbGxTdHJhdGVneSxcblx0dHlwZSBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFBsYXRmb3JtLCBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcblx0dHlwZSBBZnRlclZpZXdJbml0LFxuXHREaXJlY3RpdmUsXG5cdEVsZW1lbnRSZWYsXG5cdEluamVjdGlvblRva2VuLFxuXHRJbnB1dCxcblx0Tmdab25lLFxuXHR0eXBlIE9uRGVzdHJveSxcblx0dHlwZSBUZW1wbGF0ZVJlZixcblx0Vmlld0NvbnRhaW5lclJlZixcblx0Ym9vbGVhbkF0dHJpYnV0ZSxcblx0ZWZmZWN0LFxuXHRpbmplY3QsXG5cdGlzRGV2TW9kZSxcblx0bnVtYmVyQXR0cmlidXRlLFxuXHRzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYnJuRGV2TW9kZSB9IGZyb20gJ0BzcGFydGFuLW5nL3VpLWNvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQnJuVG9vbHRpcENvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuL2Jybi10b29sdGlwLWNvbnRlbnQuY29tcG9uZW50JztcbmltcG9ydCB7IEJyblRvb2x0aXBEaXJlY3RpdmUgfSBmcm9tICcuL2Jybi10b29sdGlwLmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCB0eXBlIFRvb2x0aXBQb3NpdGlvbiA9ICdsZWZ0JyB8ICdyaWdodCcgfCAnYWJvdmUnIHwgJ2JlbG93JyB8ICdiZWZvcmUnIHwgJ2FmdGVyJztcbmV4cG9ydCB0eXBlIFRvb2x0aXBUb3VjaEdlc3R1cmVzID0gJ2F1dG8nIHwgJ29uJyB8ICdvZmYnO1xuXG4vKiogVGltZSBpbiBtcyB0byB0aHJvdHRsZSByZXBvc2l0aW9uaW5nIGFmdGVyIHNjcm9sbCBldmVudHMuICovXG5leHBvcnQgY29uc3QgU0NST0xMX1RIUk9UVExFX01TID0gMjA7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCcm5Ub29sdGlwSW52YWxpZFBvc2l0aW9uRXJyb3IocG9zaXRpb246IHN0cmluZykge1xuXHRyZXR1cm4gRXJyb3IoYFRvb2x0aXAgcG9zaXRpb24gXCIke3Bvc2l0aW9ufVwiIGlzIGludmFsaWQuYCk7XG59XG5cbi8qKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBkZXRlcm1pbmVzIHRoZSBzY3JvbGwgaGFuZGxpbmcgd2hpbGUgYSB0b29sdGlwIGlzIHZpc2libGUuICovXG5leHBvcnQgY29uc3QgQlJOX1RPT0xUSVBfU0NST0xMX1NUUkFURUdZID0gbmV3IEluamVjdGlvblRva2VuPCgpID0+IFNjcm9sbFN0cmF0ZWd5PignYnJuLXRvb2x0aXAtc2Nyb2xsLXN0cmF0ZWd5Jyk7XG5leHBvcnQgY29uc3QgQlJOX1RPT0xUSVBfU0NST0xMX1NUUkFURUdZX0ZBQ1RPUllfUFJPVklERVIgPSB7XG5cdHByb3ZpZGU6IEJSTl9UT09MVElQX1NDUk9MTF9TVFJBVEVHWSxcblx0ZGVwczogW092ZXJsYXldLFxuXHR1c2VGYWN0b3J5OlxuXHRcdChvdmVybGF5OiBPdmVybGF5KTogKCgpID0+IFNjcm9sbFN0cmF0ZWd5KSA9PlxuXHRcdCgpID0+XG5cdFx0XHRvdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbih7IHNjcm9sbFRocm90dGxlOiBTQ1JPTExfVEhST1RUTEVfTVMgfSksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gQlJOX1RPT0xUSVBfREVGQVVMVF9PUFRJT05TX0ZBQ1RPUlkoKTogQnJuVG9vbHRpcE9wdGlvbnMge1xuXHRyZXR1cm4ge1xuXHRcdHNob3dEZWxheTogMCxcblx0XHRoaWRlRGVsYXk6IDAsXG5cdFx0dG91Y2hlbmRIaWRlRGVsYXk6IDE1MDAsXG5cdH07XG59XG5cbmV4cG9ydCBjb25zdCBCUk5fVE9PTFRJUF9ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48QnJuVG9vbHRpcE9wdGlvbnM+KCdtYXQtdG9vbHRpcC1kZWZhdWx0LW9wdGlvbnMnLCB7XG5cdHByb3ZpZGVkSW46ICdyb290Jyxcblx0ZmFjdG9yeTogQlJOX1RPT0xUSVBfREVGQVVMVF9PUFRJT05TX0ZBQ1RPUlksXG59KTtcblxuZXhwb3J0IGludGVyZmFjZSBCcm5Ub29sdGlwT3B0aW9ucyB7XG5cdC8qKiBEZWZhdWx0IGRlbGF5IHdoZW4gdGhlIHRvb2x0aXAgaXMgc2hvd24uICovXG5cdHNob3dEZWxheTogbnVtYmVyO1xuXHQvKiogRGVmYXVsdCBkZWxheSB3aGVuIHRoZSB0b29sdGlwIGlzIGhpZGRlbi4gKi9cblx0aGlkZURlbGF5OiBudW1iZXI7XG5cdC8qKiBEZWZhdWx0IGRlbGF5IHdoZW4gaGlkaW5nIHRoZSB0b29sdGlwIG9uIGEgdG91Y2ggZGV2aWNlLiAqL1xuXHR0b3VjaGVuZEhpZGVEZWxheTogbnVtYmVyO1xuXHQvKiogRGVmYXVsdCB0b3VjaCBnZXN0dXJlIGhhbmRsaW5nIGZvciB0b29sdGlwcy4gKi9cblx0dG91Y2hHZXN0dXJlcz86IFRvb2x0aXBUb3VjaEdlc3R1cmVzO1xuXHQvKiogRGVmYXVsdCBwb3NpdGlvbiBmb3IgdG9vbHRpcHMuICovXG5cdHBvc2l0aW9uPzogVG9vbHRpcFBvc2l0aW9uO1xuXHQvKipcblx0ICogRGVmYXVsdCB2YWx1ZSBmb3Igd2hldGhlciB0b29sdGlwcyBzaG91bGQgYmUgcG9zaXRpb25lZCBuZWFyIHRoZSBjbGljayBvciB0b3VjaCBvcmlnaW5cblx0ICogaW5zdGVhZCBvZiBvdXRzaWRlIHRoZSBlbGVtZW50IGJvdW5kaW5nIGJveC5cblx0ICovXG5cdHBvc2l0aW9uQXRPcmlnaW4/OiBib29sZWFuO1xuXHQvKiogRGlzYWJsZXMgdGhlIGFiaWxpdHkgZm9yIHRoZSB1c2VyIHRvIGludGVyYWN0IHdpdGggdGhlIHRvb2x0aXAgZWxlbWVudC4gKi9cblx0ZGlzYWJsZVRvb2x0aXBJbnRlcmFjdGl2aXR5PzogYm9vbGVhbjtcbn1cblxuY29uc3QgUEFORUxfQ0xBU1MgPSAndG9vbHRpcC1wYW5lbCc7XG5cbi8qKiBPcHRpb25zIHVzZWQgdG8gYmluZCBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycy4gKi9cbmNvbnN0IHBhc3NpdmVMaXN0ZW5lck9wdGlvbnMgPSBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBUaW1lIGJldHdlZW4gdGhlIHVzZXIgcHV0dGluZyB0aGUgcG9pbnRlciBvbiBhIHRvb2x0aXBcbiAqIHRyaWdnZXIgYW5kIHRoZSBsb25nIHByZXNzIGV2ZW50IGJlaW5nIGZpcmVkLlxuICovXG5jb25zdCBMT05HUFJFU1NfREVMQVkgPSA1MDA7XG5cbi8vIFRoZXNlIGNvbnN0YW50cyB3ZXJlIHRha2VuIGZyb20gTURDJ3MgYG51bWJlcnNgIG9iamVjdC5cbmNvbnN0IE1JTl9WSUVXUE9SVF9UT09MVElQX1RIUkVTSE9MRCA9IDg7XG5jb25zdCBVTkJPVU5ERURfQU5DSE9SX0dBUCA9IDg7XG5cbkBEaXJlY3RpdmUoe1xuXHRzZWxlY3RvcjogJ1ticm5Ub29sdGlwVHJpZ2dlcl0nLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRleHBvcnRBczogJ2JyblRvb2x0aXBUcmlnZ2VyJyxcblx0cHJvdmlkZXJzOiBbQlJOX1RPT0xUSVBfU0NST0xMX1NUUkFURUdZX0ZBQ1RPUllfUFJPVklERVJdLFxuXHRob3N0OiB7XG5cdFx0Y2xhc3M6ICdicm4tdG9vbHRpcC10cmlnZ2VyJyxcblx0XHQnW2NsYXNzLmJybi10b29sdGlwLWRpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG5cdH0sXG59KVxuZXhwb3J0IGNsYXNzIEJyblRvb2x0aXBUcmlnZ2VyRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblx0cHJpdmF0ZSByZWFkb25seSBfdG9vbHRpcERpcmVjdGl2ZSA9IGluamVjdChCcm5Ub29sdGlwRGlyZWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXHRwcml2YXRlIHJlYWRvbmx5IF90b29sdGlwQ29tcG9uZW50ID0gQnJuVG9vbHRpcENvbnRlbnRDb21wb25lbnQ7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2Nzc0NsYXNzUHJlZml4OiBzdHJpbmcgPSAnYnJuJztcblx0cHJpdmF0ZSByZWFkb25seSBfZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblx0cHJpdmF0ZSByZWFkb25seSBfcGFzc2l2ZUxpc3RlbmVyczogKHJlYWRvbmx5IFtzdHJpbmcsIEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3RdKVtdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRPcHRpb25zID0gaW5qZWN0KEJSTl9UT09MVElQX0RFRkFVTFRfT1BUSU9OUywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblx0cHJpdmF0ZSByZWFkb25seSBfb3ZlcmxheSA9IGluamVjdChPdmVybGF5KTtcblx0cHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3Njcm9sbERpc3BhdGNoZXIgPSBpbmplY3QoU2Nyb2xsRGlzcGF0Y2hlcik7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cdHByaXZhdGUgcmVhZG9ubHkgX25nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9wbGF0Zm9ybSA9IGluamVjdChQbGF0Zm9ybSk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2FyaWFEZXNjcmliZXIgPSBpbmplY3QoQXJpYURlc2NyaWJlcik7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2ZvY3VzTW9uaXRvciA9IGluamVjdChGb2N1c01vbml0b3IpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9kaXIgPSBpbmplY3QoRGlyZWN0aW9uYWxpdHkpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zY3JvbGxTdHJhdGVneSA9IGluamVjdChCUk5fVE9PTFRJUF9TQ1JPTExfU1RSQVRFR1kpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG5cblx0cHJpdmF0ZSBfcG9ydGFsPzogQ29tcG9uZW50UG9ydGFsPEJyblRvb2x0aXBDb250ZW50Q29tcG9uZW50Pjtcblx0cHJpdmF0ZSBfdmlld0luaXRpYWxpemVkID0gZmFsc2U7XG5cdHByaXZhdGUgX3BvaW50ZXJFeGl0RXZlbnRzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWFkb25seSBfdmlld3BvcnRNYXJnaW4gPSA4O1xuXHRwcml2YXRlIF9jdXJyZW50UG9zaXRpb24/OiBUb29sdGlwUG9zaXRpb247XG5cdHByaXZhdGUgX3RvdWNoc3RhcnRUaW1lb3V0PzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG5cblx0cHJpdmF0ZSBfb3ZlcmxheVJlZjogT3ZlcmxheVJlZiB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIF90b29sdGlwSW5zdGFuY2U6IEJyblRvb2x0aXBDb250ZW50Q29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG5cblx0LyoqIEFsbG93cyB0aGUgdXNlciB0byBkZWZpbmUgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sdGlwIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgZWxlbWVudCAqL1xuXHRwcml2YXRlIHJlYWRvbmx5IF9wb3NpdGlvbiA9IHNpZ25hbDxUb29sdGlwUG9zaXRpb24+KCdhYm92ZScpO1xuXHRASW5wdXQoKVxuXHRwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IFRvb2x0aXBQb3NpdGlvbiB7XG5cdFx0cmV0dXJuIHRoaXMuX3Bvc2l0aW9uKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHBvc2l0aW9uKHZhbHVlOiBUb29sdGlwUG9zaXRpb24pIHtcblx0XHRpZiAodmFsdWUgIT09IHRoaXMuX3Bvc2l0aW9uKCkpIHtcblx0XHRcdHRoaXMuX3Bvc2l0aW9uLnNldCh2YWx1ZSk7XG5cblx0XHRcdGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVBvc2l0aW9uKHRoaXMuX292ZXJsYXlSZWYpO1xuXHRcdFx0XHR0aGlzLl90b29sdGlwSW5zdGFuY2U/LnNob3coMCk7XG5cdFx0XHRcdHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2hldGhlciB0b29sdGlwIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgY2xpY2sgb3IgdG91Y2ggb3JpZ2luXG5cdCAqIGluc3RlYWQgb2Ygb3V0c2lkZSB0aGUgZWxlbWVudCBib3VuZGluZyBib3guXG5cdCAqL1xuXHRwcml2YXRlIHJlYWRvbmx5IF9wb3NpdGlvbkF0T3JpZ2luID0gc2lnbmFsKGZhbHNlKTtcblx0QElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG5cdHB1YmxpYyBnZXQgcG9zaXRpb25BdE9yaWdpbigpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5fcG9zaXRpb25BdE9yaWdpbigpO1xuXHR9XG5cblx0cHVibGljIHNldCBwb3NpdGlvbkF0T3JpZ2luKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5fcG9zaXRpb25BdE9yaWdpbi5zZXQodmFsdWUpO1xuXHRcdHRoaXMuX2RldGFjaCgpO1xuXHRcdHRoaXMuX292ZXJsYXlSZWYgPSBudWxsO1xuXHR9XG5cblx0LyoqIERpc2FibGVzIHRoZSBkaXNwbGF5IG9mIHRoZSB0b29sdGlwLiAqL1xuXHRwcml2YXRlIHJlYWRvbmx5IF9kaXNhYmxlZCA9IHNpZ25hbChmYWxzZSk7XG5cdEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdicm5Ub29sdGlwRGlzYWJsZWQnIH0pXG5cdHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2Rpc2FibGVkKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5fZGlzYWJsZWQuc2V0KHZhbHVlKTtcblxuXHRcdC8vIElmIHRvb2x0aXAgaXMgZGlzYWJsZWQsIGhpZGUgaW1tZWRpYXRlbHkuXG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHR0aGlzLmhpZGUoMCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX3NldHVwUG9pbnRlckVudGVyRXZlbnRzSWZOZWVkZWQoKTtcblx0XHR9XG5cdH1cblxuXHQvKiogVGhlIGRlZmF1bHQgZGVsYXkgaW4gbXMgYmVmb3JlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWZ0ZXIgc2hvdyBpcyBjYWxsZWQgKi9cblx0cHJpdmF0ZSByZWFkb25seSBfc2hvd0RlbGF5ID0gc2lnbmFsKDApO1xuXHRASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuXHRwdWJsaWMgZ2V0IHNob3dEZWxheSgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLl9zaG93RGVsYXkoKTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2hvd0RlbGF5KHZhbHVlOiBudW1iZXIpIHtcblx0XHR0aGlzLl9zaG93RGVsYXkuc2V0KHZhbHVlKTtcblx0fVxuXG5cdC8qKiBUaGUgZGVmYXVsdCBkZWxheSBpbiBtcyBiZWZvcmUgaGlkaW5nIHRoZSB0b29sdGlwIGFmdGVyIGhpZGUgaXMgY2FsbGVkICovXG5cdHByaXZhdGUgcmVhZG9ubHkgX2hpZGVEZWxheSA9IHNpZ25hbCgwKTtcblx0QElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcblx0cHVibGljIGdldCBoaWRlRGVsYXkoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5faGlkZURlbGF5KCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGhpZGVEZWxheSh2YWx1ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5faGlkZURlbGF5LnNldCh2YWx1ZSk7XG5cblx0XHRpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7XG5cdFx0XHR0aGlzLl90b29sdGlwSW5zdGFuY2UuX21vdXNlTGVhdmVIaWRlRGVsYXkgPSB0aGlzLl9oaWRlRGVsYXkoKTtcblx0XHR9XG5cdH1cblxuXHQvKiogVGhlIGRlZmF1bHQgZHVyYXRpb24gaW4gbXMgdGhhdCBleGl0IGFuaW1hdGlvbiB0YWtlcyBiZWZvcmUgaGlkaW5nICovXG5cdHByaXZhdGUgcmVhZG9ubHkgX2V4aXRBbmltYXRpb25EdXJhdGlvbiA9IHNpZ25hbCgwKTtcblx0QElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcblx0cHVibGljIGdldCBleGl0QW5pbWF0aW9uRHVyYXRpb24oKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5fZXhpdEFuaW1hdGlvbkR1cmF0aW9uKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGV4aXRBbmltYXRpb25EdXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5fZXhpdEFuaW1hdGlvbkR1cmF0aW9uLnNldCh2YWx1ZSk7XG5cblx0XHRpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7XG5cdFx0XHR0aGlzLl90b29sdGlwSW5zdGFuY2UuX2V4aXRBbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuX2V4aXRBbmltYXRpb25EdXJhdGlvbigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBUaGUgZGVmYXVsdCBkZWxheSBpbiBtcyBiZWZvcmUgaGlkaW5nIHRoZSB0b29sdGlwIGFmdGVyIGhpZGUgaXMgY2FsbGVkICovXG5cdHByaXZhdGUgcmVhZG9ubHkgX3Rvb2x0aXBDb250ZW50Q2xhc3NlcyA9IHNpZ25hbCgnJyk7XG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBnZXQgdG9vbHRpcENvbnRlbnRDbGFzc2VzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuX3Rvb2x0aXBDb250ZW50Q2xhc3NlcygpO1xuXHR9XG5cblx0cHVibGljIHNldCB0b29sdGlwQ29udGVudENsYXNzZXModmFsdWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHR0aGlzLl90b29sdGlwQ29udGVudENsYXNzZXMuc2V0KHZhbHVlID8/ICcnKTtcblxuXHRcdGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHtcblx0XHRcdHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fdG9vbHRpcENsYXNzZXMuc2V0KHZhbHVlID8/ICcnKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSG93IHRvdWNoIGdlc3R1cmVzIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSB0b29sdGlwLiBPbiB0b3VjaCBkZXZpY2VzIHRoZSB0b29sdGlwIGRpcmVjdGl2ZVxuXHQgKiB1c2VzIGEgbG9uZyBwcmVzcyBnZXN0dXJlIHRvIHNob3cgYW5kIGhpZGUsIGhvd2V2ZXIgaXQgY2FuIGNvbmZsaWN0IHdpdGggdGhlIG5hdGl2ZSBicm93c2VyXG5cdCAqIGdlc3R1cmVzLiBUbyB3b3JrIGFyb3VuZCB0aGUgY29uZmxpY3QsIEFuZ3VsYXIgTWF0ZXJpYWwgZGlzYWJsZXMgbmF0aXZlIGdlc3R1cmVzIG9uIHRoZVxuXHQgKiB0cmlnZ2VyLCBidXQgdGhhdCBtaWdodCBub3QgYmUgZGVzaXJhYmxlIG9uIHBhcnRpY3VsYXIgZWxlbWVudHMgKGUuZy4gaW5wdXRzIGFuZCBkcmFnZ2FibGVcblx0ICogZWxlbWVudHMpLiBUaGUgZGlmZmVyZW50IHZhbHVlcyBmb3IgdGhpcyBvcHRpb24gY29uZmlndXJlIHRoZSB0b3VjaCBldmVudCBoYW5kbGluZyBhcyBmb2xsb3dzOlxuXHQgKiAtIGBhdXRvYCAtIEVuYWJsZXMgdG91Y2ggZ2VzdHVyZXMgZm9yIGFsbCBlbGVtZW50cywgYnV0IHRyaWVzIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG5hdGl2ZVxuXHQgKiAgIGJyb3dzZXIgZ2VzdHVyZXMgb24gcGFydGljdWxhciBlbGVtZW50cy4gSW4gcGFydGljdWxhciwgaXQgYWxsb3dzIHRleHQgc2VsZWN0aW9uIG9uIGlucHV0c1xuXHQgKiAgIGFuZCB0ZXh0YXJlYXMsIGFuZCBwcmVzZXJ2ZXMgdGhlIG5hdGl2ZSBicm93c2VyIGRyYWdnaW5nIG9uIGVsZW1lbnRzIG1hcmtlZCBhcyBgZHJhZ2dhYmxlYC5cblx0ICogLSBgb25gIC0gRW5hYmxlcyB0b3VjaCBnZXN0dXJlcyBmb3IgYWxsIGVsZW1lbnRzIGFuZCBkaXNhYmxlcyBuYXRpdmVcblx0ICogICBicm93c2VyIGdlc3R1cmVzIHdpdGggbm8gZXhjZXB0aW9ucy5cblx0ICogLSBgb2ZmYCAtIERpc2FibGVzIHRvdWNoIGdlc3R1cmVzLiBOb3RlIHRoYXQgdGhpcyB3aWxsIHByZXZlbnQgdGhlIHRvb2x0aXAgZnJvbVxuXHQgKiAgIHNob3dpbmcgb24gdG91Y2ggZGV2aWNlcy5cblx0ICovXG5cdHByaXZhdGUgcmVhZG9ubHkgX3RvdWNoR2VzdHVyZXMgPSBzaWduYWw8VG9vbHRpcFRvdWNoR2VzdHVyZXM+KCdhdXRvJyk7XG5cdEBJbnB1dCgpXG5cdHB1YmxpYyBzZXQgdG91Y2hHZXN0dXJlcyh2YWx1ZTogVG9vbHRpcFRvdWNoR2VzdHVyZXMpIHtcblx0XHR0aGlzLl90b3VjaEdlc3R1cmVzLnNldCh2YWx1ZSk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHRvdWNoR2VzdHVyZXMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3RvdWNoR2VzdHVyZXMoKTtcblx0fVxuXG5cdC8qKiBUaGUgbWVzc2FnZSB0byBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBhcmlhIGluIHRoZSB0b29sdGlwICovXG5cdHByaXZhdGUgX2FyaWFEZXNjcmliZWRCeSA9ICcnO1xuXHRASW5wdXQoJ2FyaWEtZGVzY3JpYmVkYnknKVxuXHRwdWJsaWMgZ2V0IGFyaWFEZXNjcmliZWRCeSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fYXJpYURlc2NyaWJlZEJ5O1xuXHR9XG5cblx0cHVibGljIHNldCBhcmlhRGVzY3JpYmVkQnkodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9hcmlhRGVzY3JpYmVkQnksICd0b29sdGlwJyk7XG5cblx0XHQvLyBJZiB0aGUgbWVzc2FnZSBpcyBub3QgYSBzdHJpbmcgKGUuZy4gbnVtYmVyKSwgY29udmVydCBpdCB0byBhIHN0cmluZyBhbmQgdHJpbSBpdC5cblx0XHQvLyBNdXN0IGNvbnZlcnQgd2l0aCBgU3RyaW5nKHZhbHVlKWAsIG5vdCBgJHt2YWx1ZX1gLCBvdGhlcndpc2UgQ2xvc3VyZSBDb21waWxlciBvcHRpbWlzZXNcblx0XHQvLyBhd2F5IHRoZSBzdHJpbmctY29udmVyc2lvbjogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMjA2ODRcblx0XHR0aGlzLl9hcmlhRGVzY3JpYmVkQnkgPSB2YWx1ZSAhPT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkudHJpbSgpIDogJyc7XG5cblx0XHRpZiAodGhpcy5fYXJpYURlc2NyaWJlZEJ5ICYmICF0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkpIHtcblx0XHRcdHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG5cdFx0XHRcdC8vIFRoZSBgQXJpYURlc2NyaWJlcmAgaGFzIHNvbWUgZnVuY3Rpb25hbGl0eSB0aGF0IGF2b2lkcyBhZGRpbmcgYSBkZXNjcmlwdGlvbiBpZiBpdCdzIHRoZVxuXHRcdFx0XHQvLyBzYW1lIGFzIHRoZSBgYXJpYS1sYWJlbGAgb2YgYW4gZWxlbWVudCwgaG93ZXZlciB3ZSBjYW4ndCBrbm93IHdoZXRoZXIgdGhlIHRvb2x0aXAgdHJpZ2dlclxuXHRcdFx0XHQvLyBoYXMgYSBkYXRhLWJvdW5kIGBhcmlhLWxhYmVsYCBvciB3aGVuIGl0J2xsIGJlIHNldCBmb3IgdGhlIGZpcnN0IHRpbWUuIFdlIGNhbiBhdm9pZCB0aGVcblx0XHRcdFx0Ly8gaXNzdWUgYnkgZGVmZXJyaW5nIHRoZSBkZXNjcmlwdGlvbiBieSBhIHRpY2sgc28gQW5ndWxhciBoYXMgdGltZSB0byBzZXQgdGhlIGBhcmlhLWxhYmVsYC5cblx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fYXJpYURlc2NyaWJlci5kZXNjcmliZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuX2FyaWFEZXNjcmliZWRCeSwgJ3Rvb2x0aXAnKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKiogVGhlIGNvbnRlbnQgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0b29sdGlwICovXG5cdHByaXZhdGUgX2NvbnRlbnQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG5cdEBJbnB1dCgnYnJuVG9vbHRpcFRyaWdnZXInKVxuXHRwdWJsaWMgZ2V0IGNvbnRlbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGNvbnRlbnQodmFsdWU6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbCkge1xuXHRcdHRoaXMuX2NvbnRlbnQgPSB2YWx1ZTtcblxuXHRcdGlmICghdGhpcy5fY29udGVudCAmJiB0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkpIHtcblx0XHRcdHRoaXMuaGlkZSgwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpO1xuXHRcdFx0dGhpcy5fdXBkYXRlVG9vbHRpcENvbnRlbnQoKTtcblx0XHR9XG5cdH1cblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRpZiAodGhpcy5fZGVmYXVsdE9wdGlvbnMpIHtcblx0XHRcdHRoaXMuX3Nob3dEZWxheS5zZXQodGhpcy5fZGVmYXVsdE9wdGlvbnMuc2hvd0RlbGF5KTtcblx0XHRcdHRoaXMuX2hpZGVEZWxheS5zZXQodGhpcy5fZGVmYXVsdE9wdGlvbnMuaGlkZURlbGF5KTtcblxuXHRcdFx0aWYgKHRoaXMuX2RlZmF1bHRPcHRpb25zLnBvc2l0aW9uKSB7XG5cdFx0XHRcdHRoaXMucG9zaXRpb24gPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy5wb3NpdGlvbjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2RlZmF1bHRPcHRpb25zLnBvc2l0aW9uQXRPcmlnaW4pIHtcblx0XHRcdFx0dGhpcy5wb3NpdGlvbkF0T3JpZ2luID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMucG9zaXRpb25BdE9yaWdpbjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2RlZmF1bHRPcHRpb25zLnRvdWNoR2VzdHVyZXMpIHtcblx0XHRcdFx0dGhpcy50b3VjaEdlc3R1cmVzID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMudG91Y2hHZXN0dXJlcztcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9kaXIuY2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fb3ZlcmxheVJlZikge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQb3NpdGlvbih0aGlzLl9vdmVybGF5UmVmKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuX3ZpZXdwb3J0TWFyZ2luID0gTUlOX1ZJRVdQT1JUX1RPT0xUSVBfVEhSRVNIT0xEO1xuXG5cdFx0aWYgKHRoaXMuX3Rvb2x0aXBEaXJlY3RpdmUpIHtcblx0XHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl90b29sdGlwRGlyZWN0aXZlKSB7XG5cdFx0XHRcdFx0dGhpcy5jb250ZW50ID0gdGhpcy5fdG9vbHRpcERpcmVjdGl2ZS50b29sdGlwVGVtcGxhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdC8vIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHZpZXcgaW5pdCBzbyB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIGFsbCBpbnB1dHMgaGF2ZSBiZWVuIHNldC5cblx0XHR0aGlzLl92aWV3SW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdHRoaXMuX3NldHVwUG9pbnRlckVudGVyRXZlbnRzSWZOZWVkZWQoKTtcblxuXHRcdHRoaXMuX2ZvY3VzTW9uaXRvclxuXHRcdFx0Lm1vbml0b3IodGhpcy5fZWxlbWVudFJlZilcblx0XHRcdC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxuXHRcdFx0LnN1YnNjcmliZSgob3JpZ2luKSA9PiB7XG5cdFx0XHRcdC8vIE5vdGUgdGhhdCB0aGUgZm9jdXMgbW9uaXRvciBydW5zIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZS5cblx0XHRcdFx0aWYgKCFvcmlnaW4pIHtcblx0XHRcdFx0XHR0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGlkZSgwKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob3JpZ2luID09PSAna2V5Ym9hcmQnKSB7XG5cdFx0XHRcdFx0dGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLnNob3coKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0aWYgKGJybkRldk1vZGUgJiYgIXRoaXMuX2FyaWFEZXNjcmliZWRCeSkge1xuXHRcdFx0Y29uc29sZS53YXJuKCdCcm5Ub29sdGlwOiBcImFyaWEtZGVzY3JpYmVkYnlcIiBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIGFjY2Vzc2liaWxpdHknKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzcG9zZSB0aGUgdG9vbHRpcCB3aGVuIGRlc3Ryb3llZC5cblx0ICovXG5cdG5nT25EZXN0cm95KCkge1xuXHRcdGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cblx0XHRjbGVhclRpbWVvdXQodGhpcy5fdG91Y2hzdGFydFRpbWVvdXQpO1xuXG5cdFx0aWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcblx0XHRcdHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpO1xuXHRcdFx0dGhpcy5fdG9vbHRpcEluc3RhbmNlID0gbnVsbDtcblx0XHR9XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgbGlzdGVuZXJzIHNldCBpbiB0aGUgY29uc3RydWN0b3Jcblx0XHR0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PlxuXHRcdFx0bmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgcGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyksXG5cdFx0KTtcblx0XHR0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLmxlbmd0aCA9IDA7XG5cblx0XHR0aGlzLl9kZXN0cm95ZWQubmV4dCgpO1xuXHRcdHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpO1xuXG5cdFx0dGhpcy5fYXJpYURlc2NyaWJlci5yZW1vdmVEZXNjcmlwdGlvbihuYXRpdmVFbGVtZW50LCB0aGlzLl9hcmlhRGVzY3JpYmVkQnksICd0b29sdGlwJyk7XG5cdFx0dGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKG5hdGl2ZUVsZW1lbnQpO1xuXHR9XG5cblx0LyoqIFNob3dzIHRoZSB0b29sdGlwIGFmdGVyIHRoZSBkZWxheSBpbiBtcywgZGVmYXVsdHMgdG8gdG9vbHRpcC1kZWxheS1zaG93IG9yIDBtcyBpZiBubyBpbnB1dCAqL1xuXHRzaG93KGRlbGF5OiBudW1iZXIgPSB0aGlzLnNob3dEZWxheSwgb3JpZ2luPzogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5faXNUb29sdGlwVmlzaWJsZSgpKSB7XG5cdFx0XHR0aGlzLl90b29sdGlwSW5zdGFuY2U/Ll9jYW5jZWxQZW5kaW5nQW5pbWF0aW9ucygpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9jcmVhdGVPdmVybGF5KG9yaWdpbik7XG5cdFx0dGhpcy5fZGV0YWNoKCk7XG5cdFx0dGhpcy5fcG9ydGFsID0gdGhpcy5fcG9ydGFsIHx8IG5ldyBDb21wb25lbnRQb3J0YWwodGhpcy5fdG9vbHRpcENvbXBvbmVudCwgdGhpcy5fdmlld0NvbnRhaW5lclJlZik7XG5cdFx0Y29uc3QgaW5zdGFuY2UgPSAodGhpcy5fdG9vbHRpcEluc3RhbmNlID0gb3ZlcmxheVJlZi5hdHRhY2godGhpcy5fcG9ydGFsKS5pbnN0YW5jZSk7XG5cdFx0aW5zdGFuY2UuX3RyaWdnZXJFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXHRcdGluc3RhbmNlLl9tb3VzZUxlYXZlSGlkZURlbGF5ID0gdGhpcy5faGlkZURlbGF5KCk7XG5cdFx0aW5zdGFuY2UuX3Rvb2x0aXBDbGFzc2VzLnNldCh0aGlzLl90b29sdGlwQ29udGVudENsYXNzZXMoKSk7XG5cdFx0aW5zdGFuY2UuX2V4aXRBbmltYXRpb25EdXJhdGlvbiA9IHRoaXMuX2V4aXRBbmltYXRpb25EdXJhdGlvbigpO1xuXHRcdGluc3RhbmNlLnNpZGUuc2V0KHRoaXMuX2N1cnJlbnRQb3NpdGlvbiA/PyAnYWJvdmUnKTtcblx0XHRpbnN0YW5jZS5hZnRlckhpZGRlbi5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fZGV0YWNoKCkpO1xuXHRcdHRoaXMuX3VwZGF0ZVRvb2x0aXBDb250ZW50KCk7XG5cdFx0aW5zdGFuY2Uuc2hvdyhkZWxheSk7XG5cdH1cblxuXHQvKiogSGlkZXMgdGhlIHRvb2x0aXAgYWZ0ZXIgdGhlIGRlbGF5IGluIG1zLCBkZWZhdWx0cyB0byB0b29sdGlwLWRlbGF5LWhpZGUgb3IgMG1zIGlmIG5vIGlucHV0ICovXG5cdGhpZGUoZGVsYXk6IG51bWJlciA9IHRoaXMuaGlkZURlbGF5LCBleGl0QW5pbWF0aW9uRHVyYXRpb246IG51bWJlciA9IHRoaXMuZXhpdEFuaW1hdGlvbkR1cmF0aW9uKTogdm9pZCB7XG5cdFx0Y29uc3QgaW5zdGFuY2UgPSB0aGlzLl90b29sdGlwSW5zdGFuY2U7XG5cdFx0aWYgKGluc3RhbmNlKSB7XG5cdFx0XHRpZiAoaW5zdGFuY2UuaXNWaXNpYmxlKCkpIHtcblx0XHRcdFx0aW5zdGFuY2UuaGlkZShkZWxheSwgZXhpdEFuaW1hdGlvbkR1cmF0aW9uKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGluc3RhbmNlLl9jYW5jZWxQZW5kaW5nQW5pbWF0aW9ucygpO1xuXHRcdFx0XHR0aGlzLl9kZXRhY2goKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHR0b2dnbGUob3JpZ2luPzogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogdm9pZCB7XG5cdFx0dGhpcy5faXNUb29sdGlwVmlzaWJsZSgpID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3codW5kZWZpbmVkLCBvcmlnaW4pO1xuXHR9XG5cblx0X2lzVG9vbHRpcFZpc2libGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5fdG9vbHRpcEluc3RhbmNlICYmIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5pc1Zpc2libGUoKTtcblx0fVxuXG5cdHByaXZhdGUgX2NyZWF0ZU92ZXJsYXkob3JpZ2luPzogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9KTogT3ZlcmxheVJlZiB7XG5cdFx0aWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcblx0XHRcdGNvbnN0IGV4aXN0aW5nU3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLnBvc2l0aW9uU3RyYXRlZ3kgYXMgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5O1xuXG5cdFx0XHRpZiAoKCF0aGlzLnBvc2l0aW9uQXRPcmlnaW4gfHwgIW9yaWdpbikgJiYgZXhpc3RpbmdTdHJhdGVneS5fb3JpZ2luIGluc3RhbmNlb2YgRWxlbWVudFJlZikge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fb3ZlcmxheVJlZjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fZGV0YWNoKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc2Nyb2xsYWJsZUFuY2VzdG9ycyA9IHRoaXMuX3Njcm9sbERpc3BhdGNoZXIuZ2V0QW5jZXN0b3JTY3JvbGxDb250YWluZXJzKHRoaXMuX2VsZW1lbnRSZWYpO1xuXG5cdFx0Ly8gQ3JlYXRlIGNvbm5lY3RlZCBwb3NpdGlvbiBzdHJhdGVneSB0aGF0IGxpc3RlbnMgZm9yIHNjcm9sbCBldmVudHMgdG8gcmVwb3NpdGlvbi5cblx0XHRjb25zdCBzdHJhdGVneSA9IHRoaXMuX292ZXJsYXlcblx0XHRcdC5wb3NpdGlvbigpXG5cdFx0XHQuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLnBvc2l0aW9uQXRPcmlnaW4gPyBvcmlnaW4gfHwgdGhpcy5fZWxlbWVudFJlZiA6IHRoaXMuX2VsZW1lbnRSZWYpXG5cdFx0XHQud2l0aFRyYW5zZm9ybU9yaWdpbk9uKGAuJHt0aGlzLl9jc3NDbGFzc1ByZWZpeH0tdG9vbHRpcGApXG5cdFx0XHQud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcblx0XHRcdC53aXRoVmlld3BvcnRNYXJnaW4odGhpcy5fdmlld3BvcnRNYXJnaW4pXG5cdFx0XHQud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHNjcm9sbGFibGVBbmNlc3RvcnMpO1xuXG5cdFx0c3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG5cdFx0XHR0aGlzLl91cGRhdGVDdXJyZW50UG9zaXRpb25DbGFzcyhjaGFuZ2UuY29ubmVjdGlvblBhaXIpO1xuXG5cdFx0XHRpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7XG5cdFx0XHRcdGlmIChjaGFuZ2Uuc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzLmlzT3ZlcmxheUNsaXBwZWQgJiYgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpKSB7XG5cdFx0XHRcdFx0Ly8gQWZ0ZXIgcG9zaXRpb24gY2hhbmdlcyBvY2N1ciBhbmQgdGhlIG92ZXJsYXkgaXMgY2xpcHBlZCBieVxuXHRcdFx0XHRcdC8vIGEgcGFyZW50IHNjcm9sbGFibGUgdGhlbiBjbG9zZSB0aGUgdG9vbHRpcC5cblx0XHRcdFx0XHR0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGlkZSgwKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuX292ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZSh7XG5cdFx0XHRkaXJlY3Rpb246IHRoaXMuX2Rpcixcblx0XHRcdHBvc2l0aW9uU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuXHRcdFx0cGFuZWxDbGFzczogYCR7dGhpcy5fY3NzQ2xhc3NQcmVmaXh9LSR7UEFORUxfQ0xBU1N9YCxcblx0XHRcdHNjcm9sbFN0cmF0ZWd5OiB0aGlzLl9zY3JvbGxTdHJhdGVneSgpLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fdXBkYXRlUG9zaXRpb24odGhpcy5fb3ZlcmxheVJlZik7XG5cblx0XHR0aGlzLl9vdmVybGF5UmVmXG5cdFx0XHQuZGV0YWNobWVudHMoKVxuXHRcdFx0LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXG5cdFx0XHQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2RldGFjaCgpKTtcblxuXHRcdHRoaXMuX292ZXJsYXlSZWZcblx0XHRcdC5vdXRzaWRlUG9pbnRlckV2ZW50cygpXG5cdFx0XHQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSlcblx0XHRcdC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fdG9vbHRpcEluc3RhbmNlPy5faGFuZGxlQm9keUludGVyYWN0aW9uKCkpO1xuXG5cdFx0dGhpcy5fb3ZlcmxheVJlZlxuXHRcdFx0LmtleWRvd25FdmVudHMoKVxuXHRcdFx0LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXG5cdFx0XHQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5faXNUb29sdGlwVmlzaWJsZSgpICYmIGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KSkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0dGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmhpZGUoMCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdGlmICh0aGlzLl9kZWZhdWx0T3B0aW9ucz8uZGlzYWJsZVRvb2x0aXBJbnRlcmFjdGl2aXR5KSB7XG5cdFx0XHR0aGlzLl9vdmVybGF5UmVmLmFkZFBhbmVsQ2xhc3MoYCR7dGhpcy5fY3NzQ2xhc3NQcmVmaXh9LXRvb2x0aXAtcGFuZWwtbm9uLWludGVyYWN0aXZlYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7XG5cdH1cblxuXHRwcml2YXRlIF9kZXRhY2goKSB7XG5cdFx0aWYgKHRoaXMuX292ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcblx0XHRcdHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fdG9vbHRpcEluc3RhbmNlID0gbnVsbDtcblx0fVxuXG5cdHByaXZhdGUgX3VwZGF0ZVBvc2l0aW9uKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYpIHtcblx0XHRjb25zdCBwb3NpdGlvbiA9IG92ZXJsYXlSZWYuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneSBhcyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XG5cdFx0Y29uc3Qgb3JpZ2luID0gdGhpcy5fZ2V0T3JpZ2luKCk7XG5cdFx0Y29uc3Qgb3ZlcmxheSA9IHRoaXMuX2dldE92ZXJsYXlQb3NpdGlvbigpO1xuXG5cdFx0cG9zaXRpb24ud2l0aFBvc2l0aW9ucyhbXG5cdFx0XHR0aGlzLl9hZGRPZmZzZXQoeyAuLi5vcmlnaW4ubWFpbiwgLi4ub3ZlcmxheS5tYWluIH0pLFxuXHRcdFx0dGhpcy5fYWRkT2Zmc2V0KHsgLi4ub3JpZ2luLmZhbGxiYWNrLCAuLi5vdmVybGF5LmZhbGxiYWNrIH0pLFxuXHRcdF0pO1xuXHR9XG5cblx0LyoqIEFkZHMgdGhlIGNvbmZpZ3VyZWQgb2Zmc2V0IHRvIGEgcG9zaXRpb24uIFVzZWQgYXMgYSBob29rIGZvciBjaGlsZCBjbGFzc2VzLiAqL1xuXHRwcm90ZWN0ZWQgX2FkZE9mZnNldChwb3NpdGlvbjogQ29ubmVjdGVkUG9zaXRpb24pOiBDb25uZWN0ZWRQb3NpdGlvbiB7XG5cdFx0Y29uc3Qgb2Zmc2V0ID0gVU5CT1VOREVEX0FOQ0hPUl9HQVA7XG5cdFx0Y29uc3QgaXNMdHIgPSAhdGhpcy5fZGlyIHx8IHRoaXMuX2Rpci52YWx1ZSA9PT0gJ2x0cic7XG5cblx0XHRpZiAocG9zaXRpb24ub3JpZ2luWSA9PT0gJ3RvcCcpIHtcblx0XHRcdHBvc2l0aW9uLm9mZnNldFkgPSAtb2Zmc2V0O1xuXHRcdH0gZWxzZSBpZiAocG9zaXRpb24ub3JpZ2luWSA9PT0gJ2JvdHRvbScpIHtcblx0XHRcdHBvc2l0aW9uLm9mZnNldFkgPSBvZmZzZXQ7XG5cdFx0fSBlbHNlIGlmIChwb3NpdGlvbi5vcmlnaW5YID09PSAnc3RhcnQnKSB7XG5cdFx0XHRwb3NpdGlvbi5vZmZzZXRYID0gaXNMdHIgPyAtb2Zmc2V0IDogb2Zmc2V0O1xuXHRcdH0gZWxzZSBpZiAocG9zaXRpb24ub3JpZ2luWCA9PT0gJ2VuZCcpIHtcblx0XHRcdHBvc2l0aW9uLm9mZnNldFggPSBpc0x0ciA/IG9mZnNldCA6IC1vZmZzZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvc2l0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG9yaWdpbiBwb3NpdGlvbiBhbmQgYSBmYWxsYmFjayBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHBvc2l0aW9uIHByZWZlcmVuY2UuXG5cdCAqIFRoZSBmYWxsYmFjayBwb3NpdGlvbiBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgb3JpZ2luIChlLmcuIGAnYmVsb3cnIC0+ICdhYm92ZSdgKS5cblx0ICovXG5cdF9nZXRPcmlnaW4oKTogeyBtYWluOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb247IGZhbGxiYWNrOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb24gfSB7XG5cdFx0Y29uc3QgaXNMdHIgPSAhdGhpcy5fZGlyIHx8IHRoaXMuX2Rpci52YWx1ZSA9PT0gJ2x0cic7XG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuXHRcdGxldCBvcmlnaW5Qb3NpdGlvbjogT3JpZ2luQ29ubmVjdGlvblBvc2l0aW9uO1xuXG5cdFx0aWYgKHBvc2l0aW9uID09PSAnYWJvdmUnIHx8IHBvc2l0aW9uID09PSAnYmVsb3cnKSB7XG5cdFx0XHRvcmlnaW5Qb3NpdGlvbiA9IHsgb3JpZ2luWDogJ2NlbnRlcicsIG9yaWdpblk6IHBvc2l0aW9uID09PSAnYWJvdmUnID8gJ3RvcCcgOiAnYm90dG9tJyB9O1xuXHRcdH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdiZWZvcmUnIHx8IChwb3NpdGlvbiA9PT0gJ2xlZnQnICYmIGlzTHRyKSB8fCAocG9zaXRpb24gPT09ICdyaWdodCcgJiYgIWlzTHRyKSkge1xuXHRcdFx0b3JpZ2luUG9zaXRpb24gPSB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdjZW50ZXInIH07XG5cdFx0fSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2FmdGVyJyB8fCAocG9zaXRpb24gPT09ICdyaWdodCcgJiYgaXNMdHIpIHx8IChwb3NpdGlvbiA9PT0gJ2xlZnQnICYmICFpc0x0cikpIHtcblx0XHRcdG9yaWdpblBvc2l0aW9uID0geyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2NlbnRlcicgfTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBpc0Rldk1vZGUoKSA9PT0gJ3VuZGVmaW5lZCcgfHwgaXNEZXZNb2RlKCkpIHtcblx0XHRcdHRocm93IGdldEJyblRvb2x0aXBJbnZhbGlkUG9zaXRpb25FcnJvcihwb3NpdGlvbik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgeyB4LCB5IH0gPSB0aGlzLl9pbnZlcnRQb3NpdGlvbihvcmlnaW5Qb3NpdGlvbiEub3JpZ2luWCwgb3JpZ2luUG9zaXRpb24hLm9yaWdpblkpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1haW46IG9yaWdpblBvc2l0aW9uISxcblx0XHRcdGZhbGxiYWNrOiB7IG9yaWdpblg6IHgsIG9yaWdpblk6IHkgfSxcblx0XHR9O1xuXHR9XG5cblx0LyoqIFJldHVybnMgdGhlIG92ZXJsYXkgcG9zaXRpb24gYW5kIGEgZmFsbGJhY2sgcG9zaXRpb24gYmFzZWQgb24gdGhlIHVzZXIncyBwcmVmZXJlbmNlICovXG5cdF9nZXRPdmVybGF5UG9zaXRpb24oKTogeyBtYWluOiBPdmVybGF5Q29ubmVjdGlvblBvc2l0aW9uOyBmYWxsYmFjazogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbiB9IHtcblx0XHRjb25zdCBpc0x0ciA9ICF0aGlzLl9kaXIgfHwgdGhpcy5fZGlyLnZhbHVlID09PSAnbHRyJztcblx0XHRjb25zdCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG5cdFx0bGV0IG92ZXJsYXlQb3NpdGlvbjogT3ZlcmxheUNvbm5lY3Rpb25Qb3NpdGlvbjtcblxuXHRcdGlmIChwb3NpdGlvbiA9PT0gJ2Fib3ZlJykge1xuXHRcdFx0b3ZlcmxheVBvc2l0aW9uID0geyBvdmVybGF5WDogJ2NlbnRlcicsIG92ZXJsYXlZOiAnYm90dG9tJyB9O1xuXHRcdH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdiZWxvdycpIHtcblx0XHRcdG92ZXJsYXlQb3NpdGlvbiA9IHsgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ3RvcCcgfTtcblx0XHR9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYmVmb3JlJyB8fCAocG9zaXRpb24gPT09ICdsZWZ0JyAmJiBpc0x0cikgfHwgKHBvc2l0aW9uID09PSAncmlnaHQnICYmICFpc0x0cikpIHtcblx0XHRcdG92ZXJsYXlQb3NpdGlvbiA9IHsgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2NlbnRlcicgfTtcblx0XHR9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYWZ0ZXInIHx8IChwb3NpdGlvbiA9PT0gJ3JpZ2h0JyAmJiBpc0x0cikgfHwgKHBvc2l0aW9uID09PSAnbGVmdCcgJiYgIWlzTHRyKSkge1xuXHRcdFx0b3ZlcmxheVBvc2l0aW9uID0geyBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdjZW50ZXInIH07XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgaXNEZXZNb2RlKCkgPT09ICd1bmRlZmluZWQnIHx8IGlzRGV2TW9kZSgpKSB7XG5cdFx0XHR0aHJvdyBnZXRCcm5Ub29sdGlwSW52YWxpZFBvc2l0aW9uRXJyb3IocG9zaXRpb24pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5faW52ZXJ0UG9zaXRpb24ob3ZlcmxheVBvc2l0aW9uIS5vdmVybGF5WCwgb3ZlcmxheVBvc2l0aW9uIS5vdmVybGF5WSk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWFpbjogb3ZlcmxheVBvc2l0aW9uISxcblx0XHRcdGZhbGxiYWNrOiB7IG92ZXJsYXlYOiB4LCBvdmVybGF5WTogeSB9LFxuXHRcdH07XG5cdH1cblxuXHQvKiogVXBkYXRlcyB0aGUgdG9vbHRpcCBtZXNzYWdlIGFuZCByZXBvc2l0aW9ucyB0aGUgb3ZlcmxheSBhY2NvcmRpbmcgdG8gdGhlIG5ldyBtZXNzYWdlIGxlbmd0aCAqL1xuXHRwcml2YXRlIF91cGRhdGVUb29sdGlwQ29udGVudCgpIHtcblx0XHQvLyBNdXN0IHdhaXQgZm9yIHRoZSB0ZW1wbGF0ZSB0byBiZSBwYWludGVkIHRvIHRoZSB0b29sdGlwIHNvIHRoYXQgdGhlIG92ZXJsYXkgY2FuIHByb3Blcmx5XG5cdFx0Ly8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHBvc2l0aW9uaW5nIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSB0ZWstcGF0ZS5cblx0XHRpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7XG5cdFx0XHR0aGlzLl90b29sdGlwSW5zdGFuY2UuY29udGVudCA9IHRoaXMuY29udGVudDtcblx0XHRcdHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCk7XG5cblx0XHRcdHRoaXMuX25nWm9uZS5vbk1pY3JvdGFza0VtcHR5LnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHtcblx0XHRcdFx0XHR0aGlzLl9vdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKiogSW52ZXJ0cyBhbiBvdmVybGF5IHBvc2l0aW9uLiAqL1xuXHRwcml2YXRlIF9pbnZlcnRQb3NpdGlvbih4OiBIb3Jpem9udGFsQ29ubmVjdGlvblBvcywgeTogVmVydGljYWxDb25uZWN0aW9uUG9zKSB7XG5cdFx0aWYgKHRoaXMucG9zaXRpb24gPT09ICdhYm92ZScgfHwgdGhpcy5wb3NpdGlvbiA9PT0gJ2JlbG93Jykge1xuXHRcdFx0aWYgKHkgPT09ICd0b3AnKSB7XG5cdFx0XHRcdHkgPSAnYm90dG9tJztcblx0XHRcdH0gZWxzZSBpZiAoeSA9PT0gJ2JvdHRvbScpIHtcblx0XHRcdFx0eSA9ICd0b3AnO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoeCA9PT0gJ2VuZCcpIHtcblx0XHRcdFx0eCA9ICdzdGFydCc7XG5cdFx0XHR9IGVsc2UgaWYgKHggPT09ICdzdGFydCcpIHtcblx0XHRcdFx0eCA9ICdlbmQnO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7IHgsIHkgfTtcblx0fVxuXG5cdC8qKiBVcGRhdGVzIHRoZSBjbGFzcyBvbiB0aGUgb3ZlcmxheSBwYW5lbCBiYXNlZCBvbiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgdG9vbHRpcC4gKi9cblx0cHJpdmF0ZSBfdXBkYXRlQ3VycmVudFBvc2l0aW9uQ2xhc3MoY29ubmVjdGlvblBhaXI6IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIpOiB2b2lkIHtcblx0XHRjb25zdCB7IG92ZXJsYXlZLCBvcmlnaW5YLCBvcmlnaW5ZIH0gPSBjb25uZWN0aW9uUGFpcjtcblx0XHRsZXQgbmV3UG9zaXRpb246IFRvb2x0aXBQb3NpdGlvbjtcblxuXHRcdC8vIElmIHRoZSBvdmVybGF5IGlzIGluIHRoZSBtaWRkbGUgYWxvbmcgdGhlIFkgYXhpcyxcblx0XHQvLyBpdCBtZWFucyB0aGF0IGl0J3MgZWl0aGVyIGJlZm9yZSBvciBhZnRlci5cblx0XHRpZiAob3ZlcmxheVkgPT09ICdjZW50ZXInKSB7XG5cdFx0XHQvLyBOb3RlIHRoYXQgc2luY2UgdGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGZvciBzdHlsaW5nLCB3ZSB3YW50IHRvXG5cdFx0XHQvLyByZXNvbHZlIGBzdGFydGAgYW5kIGBlbmRgIHRvIHRoZWlyIHJlYWwgdmFsdWVzLCBvdGhlcndpc2UgY29uc3VtZXJzXG5cdFx0XHQvLyB3b3VsZCBoYXZlIHRvIHJlbWVtYmVyIHRvIGRvIGl0IHRoZW1zZWx2ZXMgb24gZWFjaCBjb25zdW1wdGlvbi5cblx0XHRcdGlmICh0aGlzLl9kaXIgJiYgdGhpcy5fZGlyLnZhbHVlID09PSAncnRsJykge1xuXHRcdFx0XHRuZXdQb3NpdGlvbiA9IG9yaWdpblggPT09ICdlbmQnID8gJ2xlZnQnIDogJ3JpZ2h0Jztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5ld1Bvc2l0aW9uID0gb3JpZ2luWCA9PT0gJ3N0YXJ0JyA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5ld1Bvc2l0aW9uID0gb3ZlcmxheVkgPT09ICdib3R0b20nICYmIG9yaWdpblkgPT09ICd0b3AnID8gJ2Fib3ZlJyA6ICdiZWxvdyc7XG5cdFx0fVxuXG5cdFx0aWYgKG5ld1Bvc2l0aW9uICE9PSB0aGlzLl9jdXJyZW50UG9zaXRpb24pIHtcblx0XHRcdHRoaXMuX3Rvb2x0aXBJbnN0YW5jZT8uc2lkZS5zZXQobmV3UG9zaXRpb24pO1xuXHRcdFx0dGhpcy5fY3VycmVudFBvc2l0aW9uID0gbmV3UG9zaXRpb247XG5cdFx0fVxuXHR9XG5cblx0LyoqIEJpbmRzIHRoZSBwb2ludGVyIGV2ZW50cyB0byB0aGUgdG9vbHRpcCB0cmlnZ2VyLiAqL1xuXHRwcml2YXRlIF9zZXR1cFBvaW50ZXJFbnRlckV2ZW50c0lmTmVlZGVkKCkge1xuXHRcdC8vIE9wdGltaXphdGlvbjogRGVmZXIgaG9va2luZyB1cCBldmVudHMgaWYgdGhlcmUncyBubyBjb250ZW50IG9yIHRoZSB0b29sdGlwIGlzIGRpc2FibGVkLlxuXHRcdGlmICh0aGlzLl9kaXNhYmxlZCgpIHx8ICF0aGlzLmNvbnRlbnQgfHwgIXRoaXMuX3ZpZXdJbml0aWFsaXplZCB8fCB0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFRoZSBtb3VzZSBldmVudHMgc2hvdWxkbid0IGJlIGJvdW5kIG9uIG1vYmlsZSBkZXZpY2VzLCBiZWNhdXNlIHRoZXkgY2FuIHByZXZlbnQgdGhlXG5cdFx0Ly8gZmlyc3QgdGFwIGZyb20gZmlyaW5nIGl0cyBjbGljayBldmVudCBvciBjYW4gY2F1c2UgdGhlIHRvb2x0aXAgdG8gb3BlbiBmb3IgY2xpY2tzLlxuXHRcdGlmICh0aGlzLl9wbGF0Zm9ybVN1cHBvcnRzTW91c2VFdmVudHMoKSkge1xuXHRcdFx0dGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5wdXNoKFtcblx0XHRcdFx0J21vdXNlZW50ZXInLFxuXHRcdFx0XHQoZXZlbnQpID0+IHtcblx0XHRcdFx0XHR0aGlzLl9zZXR1cFBvaW50ZXJFeGl0RXZlbnRzSWZOZWVkZWQoKTtcblx0XHRcdFx0XHRsZXQgcG9pbnQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0aWYgKChldmVudCBhcyBNb3VzZUV2ZW50KS54ICE9PSB1bmRlZmluZWQgJiYgKGV2ZW50IGFzIE1vdXNlRXZlbnQpLnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cG9pbnQgPSBldmVudCBhcyBNb3VzZUV2ZW50O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLnNob3codW5kZWZpbmVkLCBwb2ludCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRdKTtcblx0XHR9IGVsc2UgaWYgKHRoaXMudG91Y2hHZXN0dXJlcyAhPT0gJ29mZicpIHtcblx0XHRcdHRoaXMuX2Rpc2FibGVOYXRpdmVHZXN0dXJlc0lmTmVjZXNzYXJ5KCk7XG5cblx0XHRcdHRoaXMuX3Bhc3NpdmVMaXN0ZW5lcnMucHVzaChbXG5cdFx0XHRcdCd0b3VjaHN0YXJ0Jyxcblx0XHRcdFx0KGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdG91Y2ggPSAoZXZlbnQgYXMgVG91Y2hFdmVudCkudGFyZ2V0VG91Y2hlcz8uWzBdO1xuXHRcdFx0XHRcdGNvbnN0IG9yaWdpbiA9IHRvdWNoID8geyB4OiB0b3VjaC5jbGllbnRYLCB5OiB0b3VjaC5jbGllbnRZIH0gOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0Ly8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgd2UgZG9uJ3QgYHByZXZlbnREZWZhdWx0YCBoZXJlLFxuXHRcdFx0XHRcdC8vIGJlY2F1c2UgaXQgY2FuIHByZXZlbnQgY2xpY2sgZXZlbnRzIGZyb20gZmlyaW5nIG9uIHRoZSBlbGVtZW50LlxuXHRcdFx0XHRcdHRoaXMuX3NldHVwUG9pbnRlckV4aXRFdmVudHNJZk5lZWRlZCgpO1xuXHRcdFx0XHRcdGNsZWFyVGltZW91dCh0aGlzLl90b3VjaHN0YXJ0VGltZW91dCk7XG5cdFx0XHRcdFx0dGhpcy5fdG91Y2hzdGFydFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2hvdyh1bmRlZmluZWQsIG9yaWdpbiksIExPTkdQUkVTU19ERUxBWSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRdKTtcblx0XHR9XG5cblx0XHR0aGlzLl9hZGRMaXN0ZW5lcnModGhpcy5fcGFzc2l2ZUxpc3RlbmVycyk7XG5cdH1cblxuXHRwcml2YXRlIF9zZXR1cFBvaW50ZXJFeGl0RXZlbnRzSWZOZWVkZWQoKSB7XG5cdFx0aWYgKHRoaXMuX3BvaW50ZXJFeGl0RXZlbnRzSW5pdGlhbGl6ZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5fcG9pbnRlckV4aXRFdmVudHNJbml0aWFsaXplZCA9IHRydWU7XG5cblx0XHRjb25zdCBleGl0TGlzdGVuZXJzOiAocmVhZG9ubHkgW3N0cmluZywgRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdF0pW10gPSBbXTtcblx0XHRpZiAodGhpcy5fcGxhdGZvcm1TdXBwb3J0c01vdXNlRXZlbnRzKCkpIHtcblx0XHRcdGV4aXRMaXN0ZW5lcnMucHVzaChcblx0XHRcdFx0W1xuXHRcdFx0XHRcdCdtb3VzZWxlYXZlJyxcblx0XHRcdFx0XHQoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IG5ld1RhcmdldCA9IChldmVudCBhcyBNb3VzZUV2ZW50KS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUgfCBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCFuZXdUYXJnZXQgfHwgIXRoaXMuX292ZXJsYXlSZWY/Lm92ZXJsYXlFbGVtZW50LmNvbnRhaW5zKG5ld1RhcmdldCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5oaWRlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XSxcblx0XHRcdFx0Wyd3aGVlbCcsIChldmVudCkgPT4gdGhpcy5fd2hlZWxMaXN0ZW5lcihldmVudCBhcyBXaGVlbEV2ZW50KV0sXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy50b3VjaEdlc3R1cmVzICE9PSAnb2ZmJykge1xuXHRcdFx0dGhpcy5fZGlzYWJsZU5hdGl2ZUdlc3R1cmVzSWZOZWNlc3NhcnkoKTtcblx0XHRcdGNvbnN0IHRvdWNoZW5kTGlzdGVuZXIgPSAoKSA9PiB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCh0aGlzLl90b3VjaHN0YXJ0VGltZW91dCk7XG5cdFx0XHRcdHRoaXMuaGlkZSh0aGlzLl9kZWZhdWx0T3B0aW9ucz8udG91Y2hlbmRIaWRlRGVsYXkpO1xuXHRcdFx0fTtcblxuXHRcdFx0ZXhpdExpc3RlbmVycy5wdXNoKFsndG91Y2hlbmQnLCB0b3VjaGVuZExpc3RlbmVyXSwgWyd0b3VjaGNhbmNlbCcsIHRvdWNoZW5kTGlzdGVuZXJdKTtcblx0XHR9XG5cblx0XHR0aGlzLl9hZGRMaXN0ZW5lcnMoZXhpdExpc3RlbmVycyk7XG5cdFx0dGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5wdXNoKC4uLmV4aXRMaXN0ZW5lcnMpO1xuXHR9XG5cblx0cHJpdmF0ZSBfYWRkTGlzdGVuZXJzKGxpc3RlbmVyczogKHJlYWRvbmx5IFtzdHJpbmcsIEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3RdKVtdKSB7XG5cdFx0bGlzdGVuZXJzLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG5cdFx0XHR0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHBhc3NpdmVMaXN0ZW5lck9wdGlvbnMpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfcGxhdGZvcm1TdXBwb3J0c01vdXNlRXZlbnRzKCkge1xuXHRcdHJldHVybiAhdGhpcy5fcGxhdGZvcm0uSU9TICYmICF0aGlzLl9wbGF0Zm9ybS5BTkRST0lEO1xuXHR9XG5cblx0LyoqIExpc3RlbmVyIGZvciB0aGUgYHdoZWVsYCBldmVudCBvbiB0aGUgZWxlbWVudC4gKi9cblx0cHJpdmF0ZSBfd2hlZWxMaXN0ZW5lcihldmVudDogV2hlZWxFdmVudCkge1xuXHRcdGlmICh0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkpIHtcblx0XHRcdGNvbnN0IGVsZW1lbnRVbmRlclBvaW50ZXIgPSB0aGlzLl9kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuXHRcdFx0Y29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuXHRcdFx0Ly8gT24gbm9uLXRvdWNoIGRldmljZXMgd2UgZGVwZW5kIG9uIHRoZSBgbW91c2VsZWF2ZWAgZXZlbnQgdG8gY2xvc2UgdGhlIHRvb2x0aXAsIGJ1dCBpdFxuXHRcdFx0Ly8gd29uJ3QgZmlyZSBpZiB0aGUgdXNlciBzY3JvbGxzIGF3YXkgdXNpbmcgdGhlIHdoZWVsIHdpdGhvdXQgbW92aW5nIHRoZWlyIGN1cnNvci4gV2Vcblx0XHRcdC8vIHdvcmsgYXJvdW5kIGl0IGJ5IGZpbmRpbmcgdGhlIGVsZW1lbnQgdW5kZXIgdGhlIHVzZXIncyBjdXJzb3IgYW5kIGNsb3NpbmcgdGhlIHRvb2x0aXBcblx0XHRcdC8vIGlmIGl0J3Mgbm90IHRoZSB0cmlnZ2VyLlxuXHRcdFx0aWYgKGVsZW1lbnRVbmRlclBvaW50ZXIgIT09IGVsZW1lbnQgJiYgIWVsZW1lbnQuY29udGFpbnMoZWxlbWVudFVuZGVyUG9pbnRlcikpIHtcblx0XHRcdFx0dGhpcy5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIERpc2FibGVzIHRoZSBuYXRpdmUgYnJvd3NlciBnZXN0dXJlcywgYmFzZWQgb24gaG93IHRoZSB0b29sdGlwIGhhcyBiZWVuIGNvbmZpZ3VyZWQuICovXG5cdHByaXZhdGUgX2Rpc2FibGVOYXRpdmVHZXN0dXJlc0lmTmVjZXNzYXJ5KCkge1xuXHRcdGNvbnN0IGdlc3R1cmVzID0gdGhpcy50b3VjaEdlc3R1cmVzO1xuXG5cdFx0aWYgKGdlc3R1cmVzICE9PSAnb2ZmJykge1xuXHRcdFx0Y29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblx0XHRcdGNvbnN0IHN0eWxlID0gZWxlbWVudC5zdHlsZTtcblxuXHRcdFx0Ly8gSWYgZ2VzdHVyZXMgYXJlIHNldCB0byBgYXV0b2AsIHdlIGRvbid0IGRpc2FibGUgdGV4dCBzZWxlY3Rpb24gb24gaW5wdXRzIGFuZFxuXHRcdFx0Ly8gdGV4dGFyZWFzLCBiZWNhdXNlIGl0IHByZXZlbnRzIHRoZSB1c2VyIGZyb20gdHlwaW5nIGludG8gdGhlbSBvbiBpT1MgU2FmYXJpLlxuXHRcdFx0aWYgKGdlc3R1cmVzID09PSAnb24nIHx8IChlbGVtZW50Lm5vZGVOYW1lICE9PSAnSU5QVVQnICYmIGVsZW1lbnQubm9kZU5hbWUgIT09ICdURVhUQVJFQScpKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdFx0XHRcdHN0eWxlLnVzZXJTZWxlY3QgPSAoc3R5bGUgYXMgYW55KS5tc1VzZXJTZWxlY3QgPSBzdHlsZS53ZWJraXRVc2VyU2VsZWN0ID0gKHN0eWxlIGFzIGFueSkuTW96VXNlclNlbGVjdCA9ICdub25lJztcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgd2UgaGF2ZSBgYXV0b2AgZ2VzdHVyZXMgYW5kIHRoZSBlbGVtZW50IHVzZXMgbmF0aXZlIEhUTUwgZHJhZ2dpbmcsXG5cdFx0XHQvLyB3ZSBkb24ndCBzZXQgYC13ZWJraXQtdXNlci1kcmFnYCBiZWNhdXNlIGl0IHByZXZlbnRzIHRoZSBuYXRpdmUgYmVoYXZpb3IuXG5cdFx0XHRpZiAoZ2VzdHVyZXMgPT09ICdvbicgfHwgIWVsZW1lbnQuZHJhZ2dhYmxlKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdFx0XHRcdChzdHlsZSBhcyBhbnkpLndlYmtpdFVzZXJEcmFnID0gJ25vbmUnO1xuXHRcdFx0fVxuXG5cdFx0XHRzdHlsZS50b3VjaEFjdGlvbiA9ICdub25lJztcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdFx0XHQoc3R5bGUgYXMgYW55KS53ZWJraXRUYXBIaWdobGlnaHRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG5cdFx0fVxuXHR9XG59XG4iXX0=
|
|
624
|
+
}], ctorParameters: () => [] });
|
|
625
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJuLXRvb2x0aXAtdHJpZ2dlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2JyYWluL3Rvb2x0aXAvc3JjL2xpYi9icm4tdG9vbHRpcC10cmlnZ2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUg7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFNTixPQUFPLEVBR1AsZ0JBQWdCLEdBR2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLCtCQUErQixFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVOLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixlQUFlLEVBSWYsU0FBUyxFQUNULGdCQUFnQixHQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FB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OERBQThEO1lBQzdELEtBQWEsQ0FBQyx1QkFBdUIsR0FBRyxhQUFhLENBQUM7UUFDeEQsQ0FBQztJQUNGLENBQUM7MEhBM29CVywwQkFBMEI7OEdBQTFCLDBCQUEwQix5cERBTjNCLENBQUMsNENBQTRDLENBQUM7OzJGQU03QywwQkFBMEI7a0JBVnRDLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFNBQVMsRUFBRSxDQUFDLDRDQUE0QyxDQUFDO29CQUN6RCxJQUFJLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLHFCQUFxQjt3QkFDNUIsOEJBQThCLEVBQUUsc0JBQXNCO3FCQUN0RDtpQkFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2UgYXJlIGJ1aWxkaW5nIG9uIHNob3VsZGVycyBvZiBnaWFudHMgaGVyZSBhbmQgYWRhcHQgdGhlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBpbmNyZWRpYmxlIEFuZ3VsYXJcbiAqIHRlYW06IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYWluL3NyYy9tYXRlcmlhbC90b29sdGlwL3Rvb2x0aXAudHNcbiAqIENoZWNrIHRoZW0gb3V0ISBHaXZlIHRoZW0gYSB0cnkhIExlYXZlIGEgc3RhciEgVGhlaXIgd29yayBpcyBpbmNyZWRpYmxlIVxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuaW1wb3J0IHsgQXJpYURlc2NyaWJlciwgRm9jdXNNb25pdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQgeyBoYXNNb2RpZmllcktleSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge1xuXHR0eXBlIENvbm5lY3RlZFBvc2l0aW9uLFxuXHR0eXBlIENvbm5lY3Rpb25Qb3NpdGlvblBhaXIsXG5cdHR5cGUgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxuXHR0eXBlIEhvcml6b250YWxDb25uZWN0aW9uUG9zLFxuXHR0eXBlIE9yaWdpbkNvbm5lY3Rpb25Qb3NpdGlvbixcblx0T3ZlcmxheSxcblx0dHlwZSBPdmVybGF5Q29ubmVjdGlvblBvc2l0aW9uLFxuXHR0eXBlIE92ZXJsYXlSZWYsXG5cdFNjcm9sbERpc3BhdGNoZXIsXG5cdHR5cGUgU2Nyb2xsU3RyYXRlZ3ksXG5cdHR5cGUgVmVydGljYWxDb25uZWN0aW9uUG9zLFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zLCBQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5pbXBvcnQgeyBDb21wb25lbnRQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdHR5cGUgQWZ0ZXJWaWV3SW5pdCxcblx0Ym9vbGVhbkF0dHJpYnV0ZSxcblx0Y29tcHV0ZWQsXG5cdERpcmVjdGl2ZSxcblx0ZWZmZWN0LFxuXHRFbGVtZW50UmVmLFxuXHRpbmplY3QsXG5cdEluamVjdGlvblRva2VuLFxuXHRpbnB1dCxcblx0aXNEZXZNb2RlLFxuXHROZ1pvbmUsXG5cdG51bWJlckF0dHJpYnV0ZSxcblx0dHlwZSBPbkRlc3Ryb3ksXG5cdHR5cGUgUHJvdmlkZXIsXG5cdHR5cGUgVGVtcGxhdGVSZWYsXG5cdHVudHJhY2tlZCxcblx0Vmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBicm5EZXZNb2RlIH0gZnJvbSAnQHNwYXJ0YW4tbmcvYnJhaW4vY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCcm5Ub29sdGlwQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4vYnJuLXRvb2x0aXAtY29udGVudC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnJuVG9vbHRpcERpcmVjdGl2ZSB9IGZyb20gJy4vYnJuLXRvb2x0aXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IGluamVjdEJyblRvb2x0aXBEZWZhdWx0T3B0aW9ucyB9IGZyb20gJy4vYnJuLXRvb2x0aXAudG9rZW4nO1xuaW1wb3J0IHsgY29tcHV0ZWRQcmV2aW91cyB9IGZyb20gJy4vY29tcHV0ZWQtcHJldmlvdXMnO1xuXG5leHBvcnQgdHlwZSBUb29sdGlwUG9zaXRpb24gPSAnbGVmdCcgfCAncmlnaHQnIHwgJ2Fib3ZlJyB8ICdiZWxvdycgfCAnYmVmb3JlJyB8ICdhZnRlcic7XG5leHBvcnQgdHlwZSBUb29sdGlwVG91Y2hHZXN0dXJlcyA9ICdhdXRvJyB8ICdvbicgfCAnb2ZmJztcblxuLyoqIFRpbWUgaW4gbXMgdG8gdGhyb3R0bGUgcmVwb3NpdGlvbmluZyBhZnRlciBzY3JvbGwgZXZlbnRzLiAqL1xuZXhwb3J0IGNvbnN0IFNDUk9MTF9USFJPVFRMRV9NUyA9IDIwO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJuVG9vbHRpcEludmFsaWRQb3NpdGlvbkVycm9yKHBvc2l0aW9uOiBzdHJpbmcpIHtcblx0cmV0dXJuIEVycm9yKGBUb29sdGlwIHBvc2l0aW9uIFwiJHtwb3NpdGlvbn1cIiBpcyBpbnZhbGlkLmApO1xufVxuXG4vKiogSW5qZWN0aW9uIHRva2VuIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc2Nyb2xsIGhhbmRsaW5nIHdoaWxlIGEgdG9vbHRpcCBpcyB2aXNpYmxlLiAqL1xuZXhwb3J0IGNvbnN0IEJSTl9UT09MVElQX1NDUk9MTF9TVFJBVEVHWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjwoKSA9PiBTY3JvbGxTdHJhdGVneT4oJ2Jybi10b29sdGlwLXNjcm9sbC1zdHJhdGVneScpO1xuZXhwb3J0IGNvbnN0IEJSTl9UT09MVElQX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZX1BST1ZJREVSOiBQcm92aWRlciA9IHtcblx0cHJvdmlkZTogQlJOX1RPT0xUSVBfU0NST0xMX1NUUkFURUdZLFxuXHRkZXBzOiBbT3ZlcmxheV0sXG5cdHVzZUZhY3Rvcnk6XG5cdFx0KG92ZXJsYXk6IE92ZXJsYXkpOiAoKCkgPT4gU2Nyb2xsU3RyYXRlZ3kpID0+XG5cdFx0KCkgPT5cblx0XHRcdG92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKHsgc2Nyb2xsVGhyb3R0bGU6IFNDUk9MTF9USFJPVFRMRV9NUyB9KSxcbn07XG5cbmNvbnN0IFBBTkVMX0NMQVNTID0gJ3Rvb2x0aXAtcGFuZWwnO1xuXG4vKiogT3B0aW9ucyB1c2VkIHRvIGJpbmQgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMuICovXG5jb25zdCBwYXNzaXZlTGlzdGVuZXJPcHRpb25zID0gbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSk7XG5cbi8qKlxuICogVGltZSBiZXR3ZWVuIHRoZSB1c2VyIHB1dHRpbmcgdGhlIHBvaW50ZXIgb24gYSB0b29sdGlwXG4gKiB0cmlnZ2VyIGFuZCB0aGUgbG9uZyBwcmVzcyBldmVudCBiZWluZyBmaXJlZC5cbiAqL1xuY29uc3QgTE9OR1BSRVNTX0RFTEFZID0gNTAwO1xuXG4vLyBUaGVzZSBjb25zdGFudHMgd2VyZSB0YWtlbiBmcm9tIE1EQydzIGBudW1iZXJzYCBvYmplY3QuXG5jb25zdCBNSU5fVklFV1BPUlRfVE9PTFRJUF9USFJFU0hPTEQgPSA4O1xuY29uc3QgVU5CT1VOREVEX0FOQ0hPUl9HQVAgPSA4O1xuXG5ARGlyZWN0aXZlKHtcblx0c2VsZWN0b3I6ICdbYnJuVG9vbHRpcFRyaWdnZXJdJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0ZXhwb3J0QXM6ICdicm5Ub29sdGlwVHJpZ2dlcicsXG5cdHByb3ZpZGVyczogW0JSTl9UT09MVElQX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZX1BST1ZJREVSXSxcblx0aG9zdDoge1xuXHRcdGNsYXNzOiAnYnJuLXRvb2x0aXAtdHJpZ2dlcicsXG5cdFx0J1tjbGFzcy5icm4tdG9vbHRpcC1kaXNhYmxlZF0nOiAnYnJuVG9vbHRpcERpc2FibGVkKCknLFxuXHR9LFxufSlcbmV4cG9ydCBjbGFzcyBCcm5Ub29sdGlwVHJpZ2dlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3Rvb2x0aXBEaXJlY3RpdmUgPSBpbmplY3QoQnJuVG9vbHRpcERpcmVjdGl2ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblx0cHJpdmF0ZSByZWFkb25seSBfdG9vbHRpcENvbXBvbmVudCA9IEJyblRvb2x0aXBDb250ZW50Q29tcG9uZW50O1xuXHRwcml2YXRlIHJlYWRvbmx5IF9jc3NDbGFzc1ByZWZpeDogc3RyaW5nID0gJ2Jybic7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3Bhc3NpdmVMaXN0ZW5lcnM6IChyZWFkb25seSBbc3RyaW5nLCBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0XSlbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0T3B0aW9ucyA9IGluamVjdEJyblRvb2x0aXBEZWZhdWx0T3B0aW9ucygpO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX292ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zY3JvbGxEaXNwYXRjaGVyID0gaW5qZWN0KFNjcm9sbERpc3BhdGNoZXIpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9uZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcblx0cHJpdmF0ZSByZWFkb25seSBfcGxhdGZvcm0gPSBpbmplY3QoUGxhdGZvcm0pO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9hcmlhRGVzY3JpYmVyID0gaW5qZWN0KEFyaWFEZXNjcmliZXIpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9mb2N1c01vbml0b3IgPSBpbmplY3QoRm9jdXNNb25pdG9yKTtcblx0cHJpdmF0ZSByZWFkb25seSBfZGlyID0gaW5qZWN0KERpcmVjdGlvbmFsaXR5KTtcblx0cHJpdmF0ZSByZWFkb25seSBfc2Nyb2xsU3RyYXRlZ3kgPSBpbmplY3QoQlJOX1RPT0xUSVBfU0NST0xMX1NUUkFURUdZKTtcblx0cHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG5cdHByaXZhdGUgX3BvcnRhbD86IENvbXBvbmVudFBvcnRhbDxCcm5Ub29sdGlwQ29udGVudENvbXBvbmVudD47XG5cdHByaXZhdGUgX3ZpZXdJbml0aWFsaXplZCA9IGZhbHNlO1xuXHRwcml2YXRlIF9wb2ludGVyRXhpdEV2ZW50c0luaXRpYWxpemVkID0gZmFsc2U7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdwb3J0TWFyZ2luID0gODtcblx0cHJpdmF0ZSBfY3VycmVudFBvc2l0aW9uPzogVG9vbHRpcFBvc2l0aW9uO1xuXHRwcml2YXRlIF90b3VjaHN0YXJ0VGltZW91dD86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuXG5cdHByaXZhdGUgX292ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBfdG9vbHRpcEluc3RhbmNlOiBCcm5Ub29sdGlwQ29udGVudENvbXBvbmVudCB8IG51bGwgPSBudWxsO1xuXG5cdC8qKiBBbGxvd3MgdGhlIHVzZXIgdG8gZGVmaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9vbHRpcCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGVsZW1lbnQgKi9cblxuXHRwdWJsaWMgcmVhZG9ubHkgcG9zaXRpb24gPSBpbnB1dDxUb29sdGlwUG9zaXRpb24+KHRoaXMuX2RlZmF1bHRPcHRpb25zPy5wb3NpdGlvbiA/PyAnYWJvdmUnKTtcblxuXHQvKipcblx0ICogV2hldGhlciB0b29sdGlwIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgY2xpY2sgb3IgdG91Y2ggb3JpZ2luXG5cdCAqIGluc3RlYWQgb2Ygb3V0c2lkZSB0aGUgZWxlbWVudCBib3VuZGluZyBib3guXG5cdCAqL1xuXG5cdHB1YmxpYyByZWFkb25seSBwb3NpdGlvbkF0T3JpZ2luID0gaW5wdXQodGhpcy5fZGVmYXVsdE9wdGlvbnM/LnBvc2l0aW9uQXRPcmlnaW4gPz8gZmFsc2UsIHtcblx0XHR0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXG5cdH0pO1xuXG5cdC8qKiBEaXNhYmxlcyB0aGUgZGlzcGxheSBvZiB0aGUgdG9vbHRpcC4gKi9cblxuXHRwdWJsaWMgcmVhZG9ubHkgYnJuVG9vbHRpcERpc2FibGVkID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG5cdC8qKiBUaGUgZGVmYXVsdCBkZWxheSBpbiBtcyBiZWZvcmUgc2hvd2luZyB0aGUgdG9vbHRpcCBhZnRlciBzaG93IGlzIGNhbGxlZCAqL1xuXG5cdHB1YmxpYyByZWFkb25seSBzaG93RGVsYXkgPSBpbnB1dCh0aGlzLl9kZWZhdWx0T3B0aW9ucz8uc2hvd0RlbGF5ID8/IDAsIHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSk7XG5cblx0LyoqIFRoZSBkZWZhdWx0IGRlbGF5IGluIG1zIGJlZm9yZSBoaWRpbmcgdGhlIHRvb2x0aXAgYWZ0ZXIgaGlkZSBpcyBjYWxsZWQgKi9cblxuXHRwdWJsaWMgcmVhZG9ubHkgaGlkZURlbGF5ID0gaW5wdXQodGhpcy5fZGVmYXVsdE9wdGlvbnM/LmhpZGVEZWxheSA/PyAwLCB7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pO1xuXG5cdC8qKiBUaGUgZGVmYXVsdCBkdXJhdGlvbiBpbiBtcyB0aGF0IGV4aXQgYW5pbWF0aW9uIHRha2VzIGJlZm9yZSBoaWRpbmcgKi9cblxuXHRwdWJsaWMgcmVhZG9ubHkgZXhpdEFuaW1hdGlvbkR1cmF0aW9uID0gaW5wdXQodGhpcy5fZGVmYXVsdE9wdGlvbnM/LmV4aXRBbmltYXRpb25EdXJhdGlvbiA/PyAwLCB7XG5cdFx0dHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUsXG5cdH0pO1xuXG5cdC8qKiBUaGUgZGVmYXVsdCBkZWxheSBpbiBtcyBiZWZvcmUgaGlkaW5nIHRoZSB0b29sdGlwIGFmdGVyIGhpZGUgaXMgY2FsbGVkICovXG5cblx0cHVibGljIHJlYWRvbmx5IHRvb2x0aXBDb250ZW50Q2xhc3NlcyA9IGlucHV0PHN0cmluZz4odGhpcy5fZGVmYXVsdE9wdGlvbnM/LnRvb2x0aXBDb250ZW50Q2xhc3NlcyA/PyAnJyk7XG5cblx0LyoqXG5cdCAqIEhvdyB0b3VjaCBnZXN0dXJlcyBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgdG9vbHRpcC4gT24gdG91Y2ggZGV2aWNlcyB0aGUgdG9vbHRpcCBkaXJlY3RpdmVcblx0ICogdXNlcyBhIGxvbmcgcHJlc3MgZ2VzdHVyZSB0byBzaG93IGFuZCBoaWRlLCBob3dldmVyIGl0IGNhbiBjb25mbGljdCB3aXRoIHRoZSBuYXRpdmUgYnJvd3NlclxuXHQgKiBnZXN0dXJlcy4gVG8gd29yayBhcm91bmQgdGhlIGNvbmZsaWN0LCBBbmd1bGFyIE1hdGVyaWFsIGRpc2FibGVzIG5hdGl2ZSBnZXN0dXJlcyBvbiB0aGVcblx0ICogdHJpZ2dlciwgYnV0IHRoYXQgbWlnaHQgbm90IGJlIGRlc2lyYWJsZSBvbiBwYXJ0aWN1bGFyIGVsZW1lbnRzIChlLmcuIGlucHV0cyBhbmQgZHJhZ2dhYmxlXG5cdCAqIGVsZW1lbnRzKS4gVGhlIGRpZmZlcmVudCB2YWx1ZXMgZm9yIHRoaXMgb3B0aW9uIGNvbmZpZ3VyZSB0aGUgdG91Y2ggZXZlbnQgaGFuZGxpbmcgYXMgZm9sbG93czpcblx0ICogLSBgYXV0b2AgLSBFbmFibGVzIHRvdWNoIGdlc3R1cmVzIGZvciBhbGwgZWxlbWVudHMsIGJ1dCB0cmllcyB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBuYXRpdmVcblx0ICogICBicm93c2VyIGdlc3R1cmVzIG9uIHBhcnRpY3VsYXIgZWxlbWVudHMuIEluIHBhcnRpY3VsYXIsIGl0IGFsbG93cyB0ZXh0IHNlbGVjdGlvbiBvbiBpbnB1dHNcblx0ICogICBhbmQgdGV4dGFyZWFzLCBhbmQgcHJlc2VydmVzIHRoZSBuYXRpdmUgYnJvd3NlciBkcmFnZ2luZyBvbiBlbGVtZW50cyBtYXJrZWQgYXMgYGRyYWdnYWJsZWAuXG5cdCAqIC0gYG9uYCAtIEVuYWJsZXMgdG91Y2ggZ2VzdHVyZXMgZm9yIGFsbCBlbGVtZW50cyBhbmQgZGlzYWJsZXMgbmF0aXZlXG5cdCAqICAgYnJvd3NlciBnZXN0dXJlcyB3aXRoIG5vIGV4Y2VwdGlvbnMuXG5cdCAqIC0gYG9mZmAgLSBEaXNhYmxlcyB0b3VjaCBnZXN0dXJlcy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0b29sdGlwIGZyb21cblx0ICogICBzaG93aW5nIG9uIHRvdWNoIGRldmljZXMuXG5cdCAqL1xuXG5cdHB1YmxpYyByZWFkb25seSB0b3VjaEdlc3R1cmVzID0gaW5wdXQ8VG9vbHRpcFRvdWNoR2VzdHVyZXM+KHRoaXMuX2RlZmF1bHRPcHRpb25zPy50b3VjaEdlc3R1cmVzID8/ICdhdXRvJyk7XG5cblx0LyoqIFRoZSBtZXNzYWdlIHRvIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGFyaWEgaW4gdGhlIHRvb2x0aXAgKi9cblxuXHRwdWJsaWMgcmVhZG9ubHkgYXJpYURlc2NyaWJlZEJ5ID0gaW5wdXQoJycsIHsgYWxpYXM6ICdhcmlhLWRlc2NyaWJlZGJ5JyB9KTtcblx0cHVibGljIHJlYWRvbmx5IGFyaWFEZXNjcmliZWRCeVByZXZpb3VzID0gY29tcHV0ZWRQcmV2aW91cyh0aGlzLmFyaWFEZXNjcmliZWRCeSk7XG5cblx0LyoqIFRoZSBjb250ZW50IHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdG9vbHRpcCAqL1xuXG5cdHB1YmxpYyByZWFkb25seSBicm5Ub29sdGlwVHJpZ2dlciA9IGlucHV0PHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+IHwgbnVsbD4obnVsbCk7XG5cdHB1YmxpYyByZWFkb25seSBicm5Ub29sdGlwVHJpZ2dlclN0YXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGlmICh0aGlzLl90b29sdGlwRGlyZWN0aXZlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fdG9vbHRpcERpcmVjdGl2ZS50b29sdGlwVGVtcGxhdGUoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuYnJuVG9vbHRpcFRyaWdnZXIoKTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5fZGlyLmNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuX292ZXJsYXlSZWYpIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUG9zaXRpb24odGhpcy5fb3ZlcmxheVJlZik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0aGlzLl92aWV3cG9ydE1hcmdpbiA9IE1JTl9WSUVXUE9SVF9UT09MVElQX1RIUkVTSE9MRDtcblxuXHRcdHRoaXMuX2luaXRCcm5Ub29sdGlwVHJpZ2dlckVmZmVjdCgpO1xuXHRcdHRoaXMuX2luaXRBcmlhRGVzY3JpYmVkQnlQcmV2aW91c0VmZmVjdCgpO1xuXHRcdHRoaXMuX2luaXRUb29sdGlwQ29udGVudENsYXNzZXNFZmZlY3QoKTtcblx0XHR0aGlzLl9pbml0UG9zaXRpb25FZmZlY3QoKTtcblx0XHR0aGlzLl9pbml0UG9zaXRpb25BdE9yaWdpbkVmZmVjdCgpO1xuXHRcdHRoaXMuX2luaXRCcm5Ub29sdGlwRGlzYWJsZWRFZmZlY3QoKTtcblx0XHR0aGlzLl9pbml0RXhpdEFuaW1hdGlvbkR1cmF0aW9uRWZmZWN0KCk7XG5cdFx0dGhpcy5faW5pdEhpZGVEZWxheUVmZmVjdCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBfaW5pdFBvc2l0aW9uRWZmZWN0KCk6IHZvaWQge1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fb3ZlcmxheVJlZikge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVQb3NpdGlvbih0aGlzLl9vdmVybGF5UmVmKTtcblx0XHRcdFx0dGhpcy5fdG9vbHRpcEluc3RhbmNlPy5zaG93KDApO1xuXHRcdFx0XHR0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9pbml0QnJuVG9vbHRpcERpc2FibGVkRWZmZWN0KCk6IHZvaWQge1xuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5icm5Ub29sdGlwRGlzYWJsZWQoKSkge1xuXHRcdFx0XHR0aGlzLmhpZGUoMCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9zZXR1cFBvaW50ZXJFbnRlckV2ZW50c0lmTmVlZGVkKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIF9pbml0UG9zaXRpb25BdE9yaWdpbkVmZmVjdCgpOiB2b2lkIHtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Ly8gTmVlZGVkIHRoYXQgdGhlIGVmZmVjdCBnb3QgdHJpZ2dlcmVkXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5cdFx0XHRjb25zdCBfID0gdGhpcy5wb3NpdGlvbkF0T3JpZ2luKCk7XG5cdFx0XHR0aGlzLl9kZXRhY2goKTtcblx0XHRcdHRoaXMuX292ZXJsYXlSZWYgPSBudWxsO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfaW5pdFRvb2x0aXBDb250ZW50Q2xhc3Nlc0VmZmVjdCgpOiB2b2lkIHtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSkge1xuXHRcdFx0XHR0aGlzLl90b29sdGlwSW5zdGFuY2UuX3Rvb2x0aXBDbGFzc2VzLnNldCh0aGlzLnRvb2x0aXBDb250ZW50Q2xhc3NlcygpID8/ICcnKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgX2luaXRBcmlhRGVzY3JpYmVkQnlQcmV2aW91c0VmZmVjdCgpOiB2b2lkIHtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgYXJpYURlc2NyaWJlZEJ5ID0gdGhpcy5hcmlhRGVzY3JpYmVkQnkoKTtcblx0XHRcdHRoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24oXG5cdFx0XHRcdHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dW50cmFja2VkKCgpID0+IHRoaXMuYXJpYURlc2NyaWJlZEJ5UHJldmlvdXMoKSksXG5cdFx0XHRcdCd0b29sdGlwJyxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChhcmlhRGVzY3JpYmVkQnkgJiYgIXRoaXMuX2lzVG9vbHRpcFZpc2libGUoKSkge1xuXHRcdFx0XHR0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuXHRcdFx0XHRcdC8vIFRoZSBgQXJpYURlc2NyaWJlcmAgaGFzIHNvbWUgZnVuY3Rpb25hbGl0eSB0aGF0IGF2b2lkcyBhZGRpbmcgYSBkZXNjcmlwdGlvbiBpZiBpdCdzIHRoZVxuXHRcdFx0XHRcdC8vIHNhbWUgYXMgdGhlIGBhcmlhLWxhYmVsYCBvZiBhbiBlbGVtZW50LCBob3dldmVyIHdlIGNhbid0IGtub3cgd2hldGhlciB0aGUgdG9vbHRpcCB0cmlnZ2VyXG5cdFx0XHRcdFx0Ly8gaGFzIGEgZGF0YS1ib3VuZCBgYXJpYS1sYWJlbGAgb3Igd2hlbiBpdCdsbCBiZSBzZXQgZm9yIHRoZSBmaXJzdCB0aW1lLiBXZSBjYW4gYXZvaWQgdGhlXG5cdFx0XHRcdFx0Ly8gaXNzdWUgYnkgZGVmZXJyaW5nIHRoZSBkZXNjcmlwdGlvbiBieSBhIHRpY2sgc28gQW5ndWxhciBoYXMgdGltZSB0byBzZXQgdGhlIGBhcmlhLWxhYmVsYC5cblx0XHRcdFx0XHRQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuX2FyaWFEZXNjcmliZXIuZGVzY3JpYmUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCBhcmlhRGVzY3JpYmVkQnksICd0b29sdGlwJyk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfaW5pdEJyblRvb2x0aXBUcmlnZ2VyRWZmZWN0KCk6IHZvaWQge1xuXHRcdGVmZmVjdChcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLmJyblRvb2x0aXBUcmlnZ2VyU3RhdGUoKSAmJiB0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkpIHtcblx0XHRcdFx0XHR0aGlzLmhpZGUoMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVRvb2x0aXBDb250ZW50KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgX2luaXRFeGl0QW5pbWF0aW9uRHVyYXRpb25FZmZlY3QoKTogdm9pZCB7XG5cdFx0ZWZmZWN0KCgpID0+IHtcblx0XHRcdGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHtcblx0XHRcdFx0dGhpcy5fdG9vbHRpcEluc3RhbmNlLl9leGl0QW5pbWF0aW9uRHVyYXRpb24gPSB0aGlzLmV4aXRBbmltYXRpb25EdXJhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfaW5pdEhpZGVEZWxheUVmZmVjdCgpOiB2b2lkIHtcblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSkge1xuXHRcdFx0XHR0aGlzLl90b29sdGlwSW5zdGFuY2UuX21vdXNlTGVhdmVIaWRlRGVsYXkgPSB0aGlzLmhpZGVEZWxheSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXHRcdC8vIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHZpZXcgaW5pdCBzbyB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIGFsbCBpbnB1dHMgaGF2ZSBiZWVuIHNldC5cblx0XHR0aGlzLl92aWV3SW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdHRoaXMuX3NldHVwUG9pbnRlckVudGVyRXZlbnRzSWZOZWVkZWQoKTtcblxuXHRcdHRoaXMuX2ZvY3VzTW9uaXRvclxuXHRcdFx0Lm1vbml0b3IodGhpcy5fZWxlbWVudFJlZilcblx0XHRcdC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKVxuXHRcdFx0LnN1YnNjcmliZSgob3JpZ2luKSA9PiB7XG5cdFx0XHRcdC8vIE5vdGUgdGhhdCB0aGUgZm9jdXMgbW9uaXRvciBydW5zIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZS5cblx0XHRcdFx0aWYgKCFvcmlnaW4pIHtcblx0XHRcdFx0XHR0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGlkZSgwKSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob3JpZ2luID09PSAna2V5Ym9hcmQnKSB7XG5cdFx0XHRcdFx0dGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLnNob3coKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0aWYgKGJybkRldk1vZGUgJiYgIXRoaXMuYXJpYURlc2NyaWJlZEJ5KCkpIHtcblx0XHRcdGNvbnNvbGUud2FybignQnJuVG9vbHRpcDogXCJhcmlhLWRlc2NyaWJlZGJ5XCIgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciBhY2Nlc3NpYmlsaXR5Jyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc3Bvc2UgdGhlIHRvb2x0aXAgd2hlbiBkZXN0cm95ZWQuXG5cdCAqL1xuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcblx0XHRjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMuX3RvdWNoc3RhcnRUaW1lb3V0KTtcblxuXHRcdGlmICh0aGlzLl9vdmVybGF5UmVmKSB7XG5cdFx0XHR0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKTtcblx0XHRcdHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSA9IG51bGw7XG5cdFx0fVxuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGxpc3RlbmVycyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yXG5cdFx0dGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT5cblx0XHRcdG5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHBhc3NpdmVMaXN0ZW5lck9wdGlvbnMpLFxuXHRcdCk7XG5cdFx0dGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5sZW5ndGggPSAwO1xuXG5cdFx0dGhpcy5fZGVzdHJveWVkLm5leHQoKTtcblx0XHR0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTtcblxuXHRcdHRoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24obmF0aXZlRWxlbWVudCwgdGhpcy5hcmlhRGVzY3JpYmVkQnkoKSwgJ3Rvb2x0aXAnKTtcblx0XHR0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcobmF0aXZlRWxlbWVudCk7XG5cdH1cblxuXHQvKiogU2hvd3MgdGhlIHRvb2x0aXAgYWZ0ZXIgdGhlIGRlbGF5IGluIG1zLCBkZWZhdWx0cyB0byB0b29sdGlwLWRlbGF5LXNob3cgb3IgMG1zIGlmIG5vIGlucHV0ICovXG5cdHNob3coZGVsYXk6IG51bWJlciA9IHRoaXMuc2hvd0RlbGF5KCksIG9yaWdpbj86IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmJyblRvb2x0aXBEaXNhYmxlZCgpIHx8IHRoaXMuX2lzVG9vbHRpcFZpc2libGUoKSkge1xuXHRcdFx0dGhpcy5fdG9vbHRpcEluc3RhbmNlPy5fY2FuY2VsUGVuZGluZ0FuaW1hdGlvbnMoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fY3JlYXRlT3ZlcmxheShvcmlnaW4pO1xuXHRcdHRoaXMuX2RldGFjaCgpO1xuXHRcdHRoaXMuX3BvcnRhbCA9IHRoaXMuX3BvcnRhbCB8fCBuZXcgQ29tcG9uZW50UG9ydGFsKHRoaXMuX3Rvb2x0aXBDb21wb25lbnQsIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpO1xuXHRcdGNvbnN0IGluc3RhbmNlID0gKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSA9IG92ZXJsYXlSZWYuYXR0YWNoKHRoaXMuX3BvcnRhbCkuaW5zdGFuY2UpO1xuXHRcdGluc3RhbmNlLl90cmlnZ2VyRWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblx0XHRpbnN0YW5jZS5fbW91c2VMZWF2ZUhpZGVEZWxheSA9IHRoaXMuaGlkZURlbGF5KCk7XG5cdFx0aW5zdGFuY2UuX3Rvb2x0aXBDbGFzc2VzLnNldCh0aGlzLnRvb2x0aXBDb250ZW50Q2xhc3NlcygpKTtcblx0XHRpbnN0YW5jZS5fZXhpdEFuaW1hdGlvbkR1cmF0aW9uID0gdGhpcy5leGl0QW5pbWF0aW9uRHVyYXRpb24oKTtcblx0XHRpbnN0YW5jZS5zaWRlLnNldCh0aGlzLl9jdXJyZW50UG9zaXRpb24gPz8gJ2Fib3ZlJyk7XG5cdFx0aW5zdGFuY2UuYWZ0ZXJIaWRkZW4ucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2RldGFjaCgpKTtcblx0XHR0aGlzLl91cGRhdGVUb29sdGlwQ29udGVudCgpO1xuXHRcdGluc3RhbmNlLnNob3coZGVsYXkpO1xuXHR9XG5cblx0LyoqIEhpZGVzIHRoZSB0b29sdGlwIGFmdGVyIHRoZSBkZWxheSBpbiBtcywgZGVmYXVsdHMgdG8gdG9vbHRpcC1kZWxheS1oaWRlIG9yIDBtcyBpZiBubyBpbnB1dCAqL1xuXHRoaWRlKGRlbGF5OiBudW1iZXIgPSB0aGlzLmhpZGVEZWxheSgpLCBleGl0QW5pbWF0aW9uRHVyYXRpb246IG51bWJlciA9IHRoaXMuZXhpdEFuaW1hdGlvbkR1cmF0aW9uKCkpOiB2b2lkIHtcblx0XHRjb25zdCBpbnN0YW5jZSA9IHRoaXMuX3Rvb2x0aXBJbnN0YW5jZTtcblx0XHRpZiAoaW5zdGFuY2UpIHtcblx0XHRcdGlmIChpbnN0YW5jZS5pc1Zpc2libGUoKSkge1xuXHRcdFx0XHRpbnN0YW5jZS5oaWRlKGRlbGF5LCBleGl0QW5pbWF0aW9uRHVyYXRpb24pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5zdGFuY2UuX2NhbmNlbFBlbmRpbmdBbmltYXRpb25zKCk7XG5cdFx0XHRcdHRoaXMuX2RldGFjaCgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRvZ2dsZShvcmlnaW4/OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiB2b2lkIHtcblx0XHR0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkgPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyh1bmRlZmluZWQsIG9yaWdpbik7XG5cdH1cblxuXHRfaXNUb29sdGlwVmlzaWJsZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLl90b29sdGlwSW5zdGFuY2UgJiYgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBfY3JlYXRlT3ZlcmxheShvcmlnaW4/OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pOiBPdmVybGF5UmVmIHtcblx0XHRpZiAodGhpcy5fb3ZlcmxheVJlZikge1xuXHRcdFx0Y29uc3QgZXhpc3RpbmdTdHJhdGVneSA9IHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneSBhcyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XG5cblx0XHRcdGlmICgoIXRoaXMucG9zaXRpb25BdE9yaWdpbigpIHx8ICFvcmlnaW4pICYmIGV4aXN0aW5nU3RyYXRlZ3kuX29yaWdpbiBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2RldGFjaCgpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNjcm9sbGFibGVBbmNlc3RvcnMgPSB0aGlzLl9zY3JvbGxEaXNwYXRjaGVyLmdldEFuY2VzdG9yU2Nyb2xsQ29udGFpbmVycyh0aGlzLl9lbGVtZW50UmVmKTtcblxuXHRcdC8vIENyZWF0ZSBjb25uZWN0ZWQgcG9zaXRpb24gc3RyYXRlZ3kgdGhhdCBsaXN0ZW5zIGZvciBzY3JvbGwgZXZlbnRzIHRvIHJlcG9zaXRpb24uXG5cdFx0Y29uc3Qgc3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5XG5cdFx0XHQucG9zaXRpb24oKVxuXHRcdFx0LmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5wb3NpdGlvbkF0T3JpZ2luKCkgPyBvcmlnaW4gfHwgdGhpcy5fZWxlbWVudFJlZiA6IHRoaXMuX2VsZW1lbnRSZWYpXG5cdFx0XHQud2l0aFRyYW5zZm9ybU9yaWdpbk9uKGAuJHt0aGlzLl9jc3NDbGFzc1ByZWZpeH0tdG9vbHRpcGApXG5cdFx0XHQud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcblx0XHRcdC53aXRoVmlld3BvcnRNYXJnaW4odGhpcy5fdmlld3BvcnRNYXJnaW4pXG5cdFx0XHQud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHNjcm9sbGFibGVBbmNlc3RvcnMpO1xuXG5cdFx0c3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG5cdFx0XHR0aGlzLl91cGRhdGVDdXJyZW50UG9zaXRpb25DbGFzcyhjaGFuZ2UuY29ubmVjdGlvblBhaXIpO1xuXG5cdFx0XHRpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7XG5cdFx0XHRcdGlmIChjaGFuZ2Uuc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzLmlzT3ZlcmxheUNsaXBwZWQgJiYgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpKSB7XG5cdFx0XHRcdFx0Ly8gQWZ0ZXIgcG9zaXRpb24gY2hhbmdlcyBvY2N1ciBhbmQgdGhlIG92ZXJsYXkgaXMgY2xpcHBlZCBieVxuXHRcdFx0XHRcdC8vIGEgcGFyZW50IHNjcm9sbGFibGUgdGhlbiBjbG9zZSB0aGUgdG9vbHRpcC5cblx0XHRcdFx0XHR0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGlkZSgwKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuX292ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZSh7XG5cdFx0XHRkaXJlY3Rpb246IHRoaXMuX2Rpcixcblx0XHRcdHBvc2l0aW9uU3RyYXRlZ3k6IHN0cmF0ZWd5LFxuXHRcdFx0cGFuZWxDbGFzczogYCR7dGhpcy5fY3NzQ2xhc3NQcmVmaXh9LSR7UEFORUxfQ0xBU1N9YCxcblx0XHRcdHNjcm9sbFN0cmF0ZWd5OiB0aGlzLl9zY3JvbGxTdHJhdGVneSgpLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fdXBkYXRlUG9zaXRpb24odGhpcy5fb3ZlcmxheVJlZik7XG5cblx0XHR0aGlzLl9vdmVybGF5UmVmXG5cdFx0XHQuZGV0YWNobWVudHMoKVxuXHRcdFx0LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXG5cdFx0XHQuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2RldGFjaCgpKTtcblxuXHRcdHRoaXMuX292ZXJsYXlSZWZcblx0XHRcdC5vdXRzaWRlUG9pbnRlckV2ZW50cygpXG5cdFx0XHQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSlcblx0XHRcdC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fdG9vbHRpcEluc3RhbmNlPy5faGFuZGxlQm9keUludGVyYWN0aW9uKCkpO1xuXG5cdFx0dGhpcy5fb3ZlcmxheVJlZlxuXHRcdFx0LmtleWRvd25FdmVudHMoKVxuXHRcdFx0LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpXG5cdFx0XHQuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5faXNUb29sdGlwVmlzaWJsZSgpICYmIGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KSkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0dGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmhpZGUoMCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdGlmICh0aGlzLl9kZWZhdWx0T3B0aW9ucz8uZGlzYWJsZVRvb2x0aXBJbnRlcmFjdGl2aXR5KSB7XG5cdFx0XHR0aGlzLl9vdmVybGF5UmVmLmFkZFBhbmVsQ2xhc3MoYCR7dGhpcy5fY3NzQ2xhc3NQcmVmaXh9LXRvb2x0aXAtcGFuZWwtbm9uLWludGVyYWN0aXZlYCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7XG5cdH1cblxuXHRwcml2YXRlIF9kZXRhY2goKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuX292ZXJsYXlSZWY/Lmhhc0F0dGFjaGVkKCkpIHtcblx0XHRcdHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fdG9vbHRpcEluc3RhbmNlID0gbnVsbDtcblx0fVxuXG5cdHByaXZhdGUgX3VwZGF0ZVBvc2l0aW9uKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYpIHtcblx0XHRjb25zdCBwb3NpdGlvbiA9IG92ZXJsYXlSZWYuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneSBhcyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XG5cdFx0Y29uc3Qgb3JpZ2luID0gdGhpcy5fZ2V0T3JpZ2luKCk7XG5cdFx0Y29uc3Qgb3ZlcmxheSA9IHRoaXMuX2dldE92ZXJsYXlQb3NpdGlvbigpO1xuXG5cdFx0cG9zaXRpb24ud2l0aFBvc2l0aW9ucyhbXG5cdFx0XHR0aGlzLl9hZGRPZmZzZXQoeyAuLi5vcmlnaW4ubWFpbiwgLi4ub3ZlcmxheS5tYWluIH0pLFxuXHRcdFx0dGhpcy5fYWRkT2Zmc2V0KHsgLi4ub3JpZ2luLmZhbGxiYWNrLCAuLi5vdmVybGF5LmZhbGxiYWNrIH0pLFxuXHRcdF0pO1xuXHR9XG5cblx0LyoqIEFkZHMgdGhlIGNvbmZpZ3VyZWQgb2Zmc2V0IHRvIGEgcG9zaXRpb24uIFVzZWQgYXMgYSBob29rIGZvciBjaGlsZCBjbGFzc2VzLiAqL1xuXHRwcm90ZWN0ZWQgX2FkZE9mZnNldChwb3NpdGlvbjogQ29ubmVjdGVkUG9zaXRpb24pOiBDb25uZWN0ZWRQb3NpdGlvbiB7XG5cdFx0Y29uc3Qgb2Zmc2V0ID0gVU5CT1VOREVEX0FOQ0hPUl9HQVA7XG5cdFx0Y29uc3QgaXNMdHIgPSAhdGhpcy5fZGlyIHx8IHRoaXMuX2Rpci52YWx1ZSA9PT0gJ2x0cic7XG5cblx0XHRpZiAocG9zaXRpb24ub3JpZ2luWSA9PT0gJ3RvcCcpIHtcblx0XHRcdHBvc2l0aW9uLm9mZnNldFkgPSAtb2Zmc2V0O1xuXHRcdH0gZWxzZSBpZiAocG9zaXRpb24ub3JpZ2luWSA9PT0gJ2JvdHRvbScpIHtcblx0XHRcdHBvc2l0aW9uLm9mZnNldFkgPSBvZmZzZXQ7XG5cdFx0fSBlbHNlIGlmIChwb3NpdGlvbi5vcmlnaW5YID09PSAnc3RhcnQnKSB7XG5cdFx0XHRwb3NpdGlvbi5vZmZzZXRYID0gaXNMdHIgPyAtb2Zmc2V0IDogb2Zmc2V0O1xuXHRcdH0gZWxzZSBpZiAocG9zaXRpb24ub3JpZ2luWCA9PT0gJ2VuZCcpIHtcblx0XHRcdHBvc2l0aW9uLm9mZnNldFggPSBpc0x0ciA/IG9mZnNldCA6IC1vZmZzZXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvc2l0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG9yaWdpbiBwb3NpdGlvbiBhbmQgYSBmYWxsYmFjayBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHBvc2l0aW9uIHByZWZlcmVuY2UuXG5cdCAqIFRoZSBmYWxsYmFjayBwb3NpdGlvbiBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgb3JpZ2luIChlLmcuIGAnYmVsb3cnIC0+ICdhYm92ZSdgKS5cblx0ICovXG5cdF9nZXRPcmlnaW4oKTogeyBtYWluOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb247IGZhbGxiYWNrOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb24gfSB7XG5cdFx0Y29uc3QgaXNMdHIgPSAhdGhpcy5fZGlyIHx8IHRoaXMuX2Rpci52YWx1ZSA9PT0gJ2x0cic7XG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uKCk7XG5cdFx0bGV0IG9yaWdpblBvc2l0aW9uOiBPcmlnaW5Db25uZWN0aW9uUG9zaXRpb247XG5cblx0XHRpZiAocG9zaXRpb24gPT09ICdhYm92ZScgfHwgcG9zaXRpb24gPT09ICdiZWxvdycpIHtcblx0XHRcdG9yaWdpblBvc2l0aW9uID0geyBvcmlnaW5YOiAnY2VudGVyJywgb3JpZ2luWTogcG9zaXRpb24gPT09ICdhYm92ZScgPyAndG9wJyA6ICdib3R0b20nIH07XG5cdFx0fSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2JlZm9yZScgfHwgKHBvc2l0aW9uID09PSAnbGVmdCcgJiYgaXNMdHIpIHx8IChwb3NpdGlvbiA9PT0gJ3JpZ2h0JyAmJiAhaXNMdHIpKSB7XG5cdFx0XHRvcmlnaW5Qb3NpdGlvbiA9IHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicgfTtcblx0XHR9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYWZ0ZXInIHx8IChwb3NpdGlvbiA9PT0gJ3JpZ2h0JyAmJiBpc0x0cikgfHwgKHBvc2l0aW9uID09PSAnbGVmdCcgJiYgIWlzTHRyKSkge1xuXHRcdFx0b3JpZ2luUG9zaXRpb24gPSB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiAnY2VudGVyJyB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGlzRGV2TW9kZSgpID09PSAndW5kZWZpbmVkJyB8fCBpc0Rldk1vZGUoKSkge1xuXHRcdFx0dGhyb3cgZ2V0QnJuVG9vbHRpcEludmFsaWRQb3NpdGlvbkVycm9yKHBvc2l0aW9uKTtcblx0XHR9XG5cblx0XHRjb25zdCB7IHgsIHkgfSA9IHRoaXMuX2ludmVydFBvc2l0aW9uKG9yaWdpblBvc2l0aW9uIS5vcmlnaW5YLCBvcmlnaW5Qb3NpdGlvbiEub3JpZ2luWSk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWFpbjogb3JpZ2luUG9zaXRpb24hLFxuXHRcdFx0ZmFsbGJhY2s6IHsgb3JpZ2luWDogeCwgb3JpZ2luWTogeSB9LFxuXHRcdH07XG5cdH1cblxuXHQvKiogUmV0dXJucyB0aGUgb3ZlcmxheSBwb3NpdGlvbiBhbmQgYSBmYWxsYmFjayBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHByZWZlcmVuY2UgKi9cblx0X2dldE92ZXJsYXlQb3NpdGlvbigpOiB7IG1haW46IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb247IGZhbGxiYWNrOiBPdmVybGF5Q29ubmVjdGlvblBvc2l0aW9uIH0ge1xuXHRcdGNvbnN0IGlzTHRyID0gIXRoaXMuX2RpciB8fCB0aGlzLl9kaXIudmFsdWUgPT09ICdsdHInO1xuXHRcdGNvbnN0IHBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbigpO1xuXHRcdGxldCBvdmVybGF5UG9zaXRpb246IE92ZXJsYXlDb25uZWN0aW9uUG9zaXRpb247XG5cblx0XHRpZiAocG9zaXRpb24gPT09ICdhYm92ZScpIHtcblx0XHRcdG92ZXJsYXlQb3NpdGlvbiA9IHsgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScgfTtcblx0XHR9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYmVsb3cnKSB7XG5cdFx0XHRvdmVybGF5UG9zaXRpb24gPSB7IG92ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICd0b3AnIH07XG5cdFx0fSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2JlZm9yZScgfHwgKHBvc2l0aW9uID09PSAnbGVmdCcgJiYgaXNMdHIpIHx8IChwb3NpdGlvbiA9PT0gJ3JpZ2h0JyAmJiAhaXNMdHIpKSB7XG5cdFx0XHRvdmVybGF5UG9zaXRpb24gPSB7IG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdjZW50ZXInIH07XG5cdFx0fSBlbHNlIGlmIChwb3NpdGlvbiA9PT0gJ2FmdGVyJyB8fCAocG9zaXRpb24gPT09ICdyaWdodCcgJiYgaXNMdHIpIHx8IChwb3NpdGlvbiA9PT0gJ2xlZnQnICYmICFpc0x0cikpIHtcblx0XHRcdG92ZXJsYXlQb3NpdGlvbiA9IHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9O1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGlzRGV2TW9kZSgpID09PSAndW5kZWZpbmVkJyB8fCBpc0Rldk1vZGUoKSkge1xuXHRcdFx0dGhyb3cgZ2V0QnJuVG9vbHRpcEludmFsaWRQb3NpdGlvbkVycm9yKHBvc2l0aW9uKTtcblx0XHR9XG5cblx0XHRjb25zdCB7IHgsIHkgfSA9IHRoaXMuX2ludmVydFBvc2l0aW9uKG92ZXJsYXlQb3NpdGlvbiEub3ZlcmxheVgsIG92ZXJsYXlQb3NpdGlvbiEub3ZlcmxheVkpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1haW46IG92ZXJsYXlQb3NpdGlvbiEsXG5cdFx0XHRmYWxsYmFjazogeyBvdmVybGF5WDogeCwgb3ZlcmxheVk6IHkgfSxcblx0XHR9O1xuXHR9XG5cblx0LyoqIFVwZGF0ZXMgdGhlIHRvb2x0aXAgbWVzc2FnZSBhbmQgcmVwb3NpdGlvbnMgdGhlIG92ZXJsYXkgYWNjb3JkaW5nIHRvIHRoZSBuZXcgbWVzc2FnZSBsZW5ndGggKi9cblx0cHJpdmF0ZSBfdXBkYXRlVG9vbHRpcENvbnRlbnQoKTogdm9pZCB7XG5cdFx0Ly8gTXVzdCB3YWl0IGZvciB0aGUgdGVtcGxhdGUgdG8gYmUgcGFpbnRlZCB0byB0aGUgdG9vbHRpcCBzbyB0aGF0IHRoZSBvdmVybGF5IGNhbiBwcm9wZXJseVxuXHRcdC8vIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCBwb3NpdGlvbmluZyBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgdGVrLXBhdGUuXG5cdFx0aWYgKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSkge1xuXHRcdFx0dGhpcy5fdG9vbHRpcEluc3RhbmNlLmNvbnRlbnQgPSB0aGlzLmJyblRvb2x0aXBUcmlnZ2VyU3RhdGUoKTtcblx0XHRcdHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCk7XG5cblx0XHRcdHRoaXMuX25nWm9uZS5vbk1pY3JvdGFza0VtcHR5LnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHtcblx0XHRcdFx0XHR0aGlzLl9vdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKiogSW52ZXJ0cyBhbiBvdmVybGF5IHBvc2l0aW9uLiAqL1xuXHRwcml2YXRlIF9pbnZlcnRQb3NpdGlvbih4OiBIb3Jpem9udGFsQ29ubmVjdGlvblBvcywgeTogVmVydGljYWxDb25uZWN0aW9uUG9zKSB7XG5cdFx0aWYgKHRoaXMucG9zaXRpb24oKSA9PT0gJ2Fib3ZlJyB8fCB0aGlzLnBvc2l0aW9uKCkgPT09ICdiZWxvdycpIHtcblx0XHRcdGlmICh5ID09PSAndG9wJykge1xuXHRcdFx0XHR5ID0gJ2JvdHRvbSc7XG5cdFx0XHR9IGVsc2UgaWYgKHkgPT09ICdib3R0b20nKSB7XG5cdFx0XHRcdHkgPSAndG9wJztcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHggPT09ICdlbmQnKSB7XG5cdFx0XHRcdHggPSAnc3RhcnQnO1xuXHRcdFx0fSBlbHNlIGlmICh4ID09PSAnc3RhcnQnKSB7XG5cdFx0XHRcdHggPSAnZW5kJztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4geyB4LCB5IH07XG5cdH1cblxuXHQvKiogVXBkYXRlcyB0aGUgY2xhc3Mgb24gdGhlIG92ZXJsYXkgcGFuZWwgYmFzZWQgb24gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHRvb2x0aXAuICovXG5cdHByaXZhdGUgX3VwZGF0ZUN1cnJlbnRQb3NpdGlvbkNsYXNzKGNvbm5lY3Rpb25QYWlyOiBDb25uZWN0aW9uUG9zaXRpb25QYWlyKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBvdmVybGF5WSwgb3JpZ2luWCwgb3JpZ2luWSB9ID0gY29ubmVjdGlvblBhaXI7XG5cdFx0bGV0IG5ld1Bvc2l0aW9uOiBUb29sdGlwUG9zaXRpb247XG5cblx0XHQvLyBJZiB0aGUgb3ZlcmxheSBpcyBpbiB0aGUgbWlkZGxlIGFsb25nIHRoZSBZIGF4aXMsXG5cdFx0Ly8gaXQgbWVhbnMgdGhhdCBpdCdzIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIuXG5cdFx0aWYgKG92ZXJsYXlZID09PSAnY2VudGVyJykge1xuXHRcdFx0Ly8gTm90ZSB0aGF0IHNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBmb3Igc3R5bGluZywgd2Ugd2FudCB0b1xuXHRcdFx0Ly8gcmVzb2x2ZSBgc3RhcnRgIGFuZCBgZW5kYCB0byB0aGVpciByZWFsIHZhbHVlcywgb3RoZXJ3aXNlIGNvbnN1bWVyc1xuXHRcdFx0Ly8gd291bGQgaGF2ZSB0byByZW1lbWJlciB0byBkbyBpdCB0aGVtc2VsdmVzIG9uIGVhY2ggY29uc3VtcHRpb24uXG5cdFx0XHRpZiAodGhpcy5fZGlyICYmIHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCcpIHtcblx0XHRcdFx0bmV3UG9zaXRpb24gPSBvcmlnaW5YID09PSAnZW5kJyA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdQb3NpdGlvbiA9IG9yaWdpblggPT09ICdzdGFydCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRuZXdQb3NpdGlvbiA9IG92ZXJsYXlZID09PSAnYm90dG9tJyAmJiBvcmlnaW5ZID09PSAndG9wJyA/ICdhYm92ZScgOiAnYmVsb3cnO1xuXHRcdH1cblxuXHRcdGlmIChuZXdQb3NpdGlvbiAhPT0gdGhpcy5fY3VycmVudFBvc2l0aW9uKSB7XG5cdFx0XHR0aGlzLl90b29sdGlwSW5zdGFuY2U/LnNpZGUuc2V0KG5ld1Bvc2l0aW9uKTtcblx0XHRcdHRoaXMuX2N1cnJlbnRQb3NpdGlvbiA9IG5ld1Bvc2l0aW9uO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBCaW5kcyB0aGUgcG9pbnRlciBldmVudHMgdG8gdGhlIHRvb2x0aXAgdHJpZ2dlci4gKi9cblx0cHJpdmF0ZSBfc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpOiB2b2lkIHtcblx0XHQvLyBPcHRpbWl6YXRpb246IERlZmVyIGhvb2tpbmcgdXAgZXZlbnRzIGlmIHRoZXJlJ3Mgbm8gY29udGVudCBvciB0aGUgdG9vbHRpcCBpcyBkaXNhYmxlZC5cblx0XHRpZiAoXG5cdFx0XHR0aGlzLmJyblRvb2x0aXBEaXNhYmxlZCgpIHx8XG5cdFx0XHQhdGhpcy5icm5Ub29sdGlwVHJpZ2dlclN0YXRlKCkgfHxcblx0XHRcdCF0aGlzLl92aWV3SW5pdGlhbGl6ZWQgfHxcblx0XHRcdHRoaXMuX3Bhc3NpdmVMaXN0ZW5lcnMubGVuZ3RoXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIG1vdXNlIGV2ZW50cyBzaG91bGRuJ3QgYmUgYm91bmQgb24gbW9iaWxlIGRldmljZXMsIGJlY2F1c2UgdGhleSBjYW4gcHJldmVudCB0aGVcblx0XHQvLyBmaXJzdCB0YXAgZnJvbSBmaXJpbmcgaXRzIGNsaWNrIGV2ZW50IG9yIGNhbiBjYXVzZSB0aGUgdG9vbHRpcCB0byBvcGVuIGZvciBjbGlja3MuXG5cdFx0aWYgKHRoaXMuX3BsYXRmb3JtU3VwcG9ydHNNb3VzZUV2ZW50cygpKSB7XG5cdFx0XHR0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLnB1c2goW1xuXHRcdFx0XHQnbW91c2VlbnRlcicsXG5cdFx0XHRcdChldmVudCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3NldHVwUG9pbnRlckV4aXRFdmVudHNJZk5lZWRlZCgpO1xuXHRcdFx0XHRcdGxldCBwb2ludCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRpZiAoKGV2ZW50IGFzIE1vdXNlRXZlbnQpLnggIT09IHVuZGVmaW5lZCAmJiAoZXZlbnQgYXMgTW91c2VFdmVudCkueSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRwb2ludCA9IGV2ZW50IGFzIE1vdXNlRXZlbnQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuc2hvdyh1bmRlZmluZWQsIHBvaW50KTtcblx0XHRcdFx0fSxcblx0XHRcdF0pO1xuXHRcdH0gZWxzZSBpZiAodGhpcy50b3VjaEdlc3R1cmVzKCkgIT09ICdvZmYnKSB7XG5cdFx0XHR0aGlzLl9kaXNhYmxlTmF0aXZlR2VzdHVyZXNJZk5lY2Vzc2FyeSgpO1xuXG5cdFx0XHR0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLnB1c2goW1xuXHRcdFx0XHQndG91Y2hzdGFydCcsXG5cdFx0XHRcdChldmVudCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHRvdWNoID0gKGV2ZW50IGFzIFRvdWNoRXZlbnQpLnRhcmdldFRvdWNoZXM/LlswXTtcblx0XHRcdFx0XHRjb25zdCBvcmlnaW4gPSB0b3VjaCA/IHsgeDogdG91Y2guY2xpZW50WCwgeTogdG91Y2guY2xpZW50WSB9IDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdC8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHdlIGRvbid0IGBwcmV2ZW50RGVmYXVsdGAgaGVyZSxcblx0XHRcdFx0XHQvLyBiZWNhdXNlIGl0IGNhbiBwcmV2ZW50IGNsaWNrIGV2ZW50cyBmcm9tIGZpcmluZyBvbiB0aGUgZWxlbWVudC5cblx0XHRcdFx0XHR0aGlzLl9zZXR1cFBvaW50ZXJFeGl0RXZlbnRzSWZOZWVkZWQoKTtcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy5fdG91Y2hzdGFydFRpbWVvdXQpO1xuXHRcdFx0XHRcdHRoaXMuX3RvdWNoc3RhcnRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNob3codW5kZWZpbmVkLCBvcmlnaW4pLCBMT05HUFJFU1NfREVMQVkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fYWRkTGlzdGVuZXJzKHRoaXMuX3Bhc3NpdmVMaXN0ZW5lcnMpO1xuXHR9XG5cblx0cHJpdmF0ZSBfc2V0dXBQb2ludGVyRXhpdEV2ZW50c0lmTmVlZGVkKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLl9wb2ludGVyRXhpdEV2ZW50c0luaXRpYWxpemVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuX3BvaW50ZXJFeGl0RXZlbnRzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG5cdFx0Y29uc3QgZXhpdExpc3RlbmVyczogKHJlYWRvbmx5IFtzdHJpbmcsIEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3RdKVtdID0gW107XG5cdFx0aWYgKHRoaXMuX3BsYXRmb3JtU3VwcG9ydHNNb3VzZUV2ZW50cygpKSB7XG5cdFx0XHRleGl0TGlzdGVuZXJzLnB1c2goXG5cdFx0XHRcdFtcblx0XHRcdFx0XHQnbW91c2VsZWF2ZScsXG5cdFx0XHRcdFx0KGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdUYXJnZXQgPSAoZXZlbnQgYXMgTW91c2VFdmVudCkucmVsYXRlZFRhcmdldCBhcyBOb2RlIHwgbnVsbDtcblx0XHRcdFx0XHRcdGlmICghbmV3VGFyZ2V0IHx8ICF0aGlzLl9vdmVybGF5UmVmPy5vdmVybGF5RWxlbWVudC5jb250YWlucyhuZXdUYXJnZXQpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaGlkZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHRcdFsnd2hlZWwnLCAoZXZlbnQpID0+IHRoaXMuX3doZWVsTGlzdGVuZXIoZXZlbnQgYXMgV2hlZWxFdmVudCldLFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKHRoaXMudG91Y2hHZXN0dXJlcygpICE9PSAnb2ZmJykge1xuXHRcdFx0dGhpcy5fZGlzYWJsZU5hdGl2ZUdlc3R1cmVzSWZOZWNlc3NhcnkoKTtcblx0XHRcdGNvbnN0IHRvdWNoZW5kTGlzdGVuZXIgPSAoKSA9PiB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCh0aGlzLl90b3VjaHN0YXJ0VGltZW91dCk7XG5cdFx0XHRcdHRoaXMuaGlkZSh0aGlzLl9kZWZhdWx0T3B0aW9ucz8udG91Y2hlbmRIaWRlRGVsYXkpO1xuXHRcdFx0fTtcblxuXHRcdFx0ZXhpdExpc3RlbmVycy5wdXNoKFsndG91Y2hlbmQnLCB0b3VjaGVuZExpc3RlbmVyXSwgWyd0b3VjaGNhbmNlbCcsIHRvdWNoZW5kTGlzdGVuZXJdKTtcblx0XHR9XG5cblx0XHR0aGlzLl9hZGRMaXN0ZW5lcnMoZXhpdExpc3RlbmVycyk7XG5cdFx0dGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5wdXNoKC4uLmV4aXRMaXN0ZW5lcnMpO1xuXHR9XG5cblx0cHJpdmF0ZSBfYWRkTGlzdGVuZXJzKGxpc3RlbmVyczogKHJlYWRvbmx5IFtzdHJpbmcsIEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3RdKVtdKSB7XG5cdFx0bGlzdGVuZXJzLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG5cdFx0XHR0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHBhc3NpdmVMaXN0ZW5lck9wdGlvbnMpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBfcGxhdGZvcm1TdXBwb3J0c01vdXNlRXZlbnRzKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhdGhpcy5fcGxhdGZvcm0uSU9TICYmICF0aGlzLl9wbGF0Zm9ybS5BTkRST0lEO1xuXHR9XG5cblx0LyoqIExpc3RlbmVyIGZvciB0aGUgYHdoZWVsYCBldmVudCBvbiB0aGUgZWxlbWVudC4gKi9cblx0cHJpdmF0ZSBfd2hlZWxMaXN0ZW5lcihldmVudDogV2hlZWxFdmVudCkge1xuXHRcdGlmICh0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkpIHtcblx0XHRcdGNvbnN0IGVsZW1lbnRVbmRlclBvaW50ZXIgPSB0aGlzLl9kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuXHRcdFx0Y29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuXHRcdFx0Ly8gT24gbm9uLXRvdWNoIGRldmljZXMgd2UgZGVwZW5kIG9uIHRoZSBgbW91c2VsZWF2ZWAgZXZlbnQgdG8gY2xvc2UgdGhlIHRvb2x0aXAsIGJ1dCBpdFxuXHRcdFx0Ly8gd29uJ3QgZmlyZSBpZiB0aGUgdXNlciBzY3JvbGxzIGF3YXkgdXNpbmcgdGhlIHdoZWVsIHdpdGhvdXQgbW92aW5nIHRoZWlyIGN1cnNvci4gV2Vcblx0XHRcdC8vIHdvcmsgYXJvdW5kIGl0IGJ5IGZpbmRpbmcgdGhlIGVsZW1lbnQgdW5kZXIgdGhlIHVzZXIncyBjdXJzb3IgYW5kIGNsb3NpbmcgdGhlIHRvb2x0aXBcblx0XHRcdC8vIGlmIGl0J3Mgbm90IHRoZSB0cmlnZ2VyLlxuXHRcdFx0aWYgKGVsZW1lbnRVbmRlclBvaW50ZXIgIT09IGVsZW1lbnQgJiYgIWVsZW1lbnQuY29udGFpbnMoZWxlbWVudFVuZGVyUG9pbnRlcikpIHtcblx0XHRcdFx0dGhpcy5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIERpc2FibGVzIHRoZSBuYXRpdmUgYnJvd3NlciBnZXN0dXJlcywgYmFzZWQgb24gaG93IHRoZSB0b29sdGlwIGhhcyBiZWVuIGNvbmZpZ3VyZWQuICovXG5cdHByaXZhdGUgX2Rpc2FibGVOYXRpdmVHZXN0dXJlc0lmTmVjZXNzYXJ5KCk6IHZvaWQge1xuXHRcdGNvbnN0IGdlc3R1cmVzID0gdGhpcy50b3VjaEdlc3R1cmVzKCk7XG5cblx0XHRpZiAoZ2VzdHVyZXMgIT09ICdvZmYnKSB7XG5cdFx0XHRjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXHRcdFx0Y29uc3Qgc3R5bGUgPSBlbGVtZW50LnN0eWxlO1xuXG5cdFx0XHQvLyBJZiBnZXN0dXJlcyBhcmUgc2V0IHRvIGBhdXRvYCwgd2UgZG9uJ3QgZGlzYWJsZSB0ZXh0IHNlbGVjdGlvbiBvbiBpbnB1dHMgYW5kXG5cdFx0XHQvLyB0ZXh0YXJlYXMsIGJlY2F1c2UgaXQgcHJldmVudHMgdGhlIHVzZXIgZnJvbSB0eXBpbmcgaW50byB0aGVtIG9uIGlPUyBTYWZhcmkuXG5cdFx0XHRpZiAoZ2VzdHVyZXMgPT09ICdvbicgfHwgKGVsZW1lbnQubm9kZU5hbWUgIT09ICdJTlBVVCcgJiYgZWxlbWVudC5ub2RlTmFtZSAhPT0gJ1RFWFRBUkVBJykpIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0XHRcdFx0c3R5bGUudXNlclNlbGVjdCA9IChzdHlsZSBhcyBhbnkpLm1zVXNlclNlbGVjdCA9IHN0eWxlLndlYmtpdFVzZXJTZWxlY3QgPSAoc3R5bGUgYXMgYW55KS5Nb3pVc2VyU2VsZWN0ID0gJ25vbmUnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB3ZSBoYXZlIGBhdXRvYCBnZXN0dXJlcyBhbmQgdGhlIGVsZW1lbnQgdXNlcyBuYXRpdmUgSFRNTCBkcmFnZ2luZyxcblx0XHRcdC8vIHdlIGRvbid0IHNldCBgLXdlYmtpdC11c2VyLWRyYWdgIGJlY2F1c2UgaXQgcHJldmVudHMgdGhlIG5hdGl2ZSBiZWhhdmlvci5cblx0XHRcdGlmIChnZXN0dXJlcyA9PT0gJ29uJyB8fCAhZWxlbWVudC5kcmFnZ2FibGUpIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0XHRcdFx0KHN0eWxlIGFzIGFueSkud2Via2l0VXNlckRyYWcgPSAnbm9uZSc7XG5cdFx0XHR9XG5cblx0XHRcdHN0eWxlLnRvdWNoQWN0aW9uID0gJ25vbmUnO1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0XHRcdChzdHlsZSBhcyBhbnkpLndlYmtpdFRhcEhpZ2hsaWdodENvbG9yID0gJ3RyYW5zcGFyZW50Jztcblx0XHR9XG5cdH1cbn1cbiJdfQ==
|