@skyux/flyout 5.1.0 → 5.5.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/documentation.json +46 -11
- package/esm2015/index.js +14 -0
- package/esm2015/index.js.map +1 -0
- package/esm2015/lib/modules/flyout/flyout-adapter.service.js +64 -0
- package/esm2015/lib/modules/flyout/flyout-adapter.service.js.map +1 -0
- package/esm2015/lib/modules/flyout/flyout-instance.js +109 -0
- package/esm2015/lib/modules/flyout/flyout-instance.js.map +1 -0
- package/esm2015/lib/modules/flyout/flyout-iterator.component.js +59 -0
- package/esm2015/lib/modules/flyout/flyout-iterator.component.js.map +1 -0
- package/esm2015/lib/modules/flyout/flyout-media-query.service.js +72 -0
- package/esm2015/lib/modules/flyout/flyout-media-query.service.js.map +1 -0
- package/esm2015/lib/modules/flyout/flyout.component.js +505 -0
- package/esm2015/lib/modules/flyout/flyout.component.js.map +1 -0
- package/esm2015/lib/modules/flyout/flyout.module.js +56 -0
- package/esm2015/lib/modules/flyout/flyout.module.js.map +1 -0
- package/esm2015/lib/modules/flyout/flyout.service.js +167 -0
- package/esm2015/lib/modules/flyout/flyout.service.js.map +1 -0
- package/esm2015/lib/modules/flyout/types/flyout-action.js +2 -0
- package/esm2015/lib/modules/flyout/types/flyout-action.js.map +1 -0
- package/esm2015/lib/modules/flyout/types/flyout-before-close-handler.js +9 -0
- package/esm2015/lib/modules/flyout/types/flyout-before-close-handler.js.map +1 -0
- package/esm2015/lib/modules/flyout/types/flyout-close-args.js +2 -0
- package/esm2015/lib/modules/flyout/types/flyout-close-args.js.map +1 -0
- package/esm2015/lib/modules/flyout/types/flyout-config.js +2 -0
- package/esm2015/lib/modules/flyout/types/flyout-config.js.map +1 -0
- package/esm2015/lib/modules/flyout/types/flyout-message-type.js +13 -0
- package/esm2015/lib/modules/flyout/types/flyout-message-type.js.map +1 -0
- package/esm2015/lib/modules/flyout/types/flyout-message.js +2 -0
- package/esm2015/lib/modules/flyout/types/flyout-message.js.map +1 -0
- package/esm2015/lib/modules/flyout/types/flyout-permalink.js +2 -0
- package/esm2015/lib/modules/flyout/types/flyout-permalink.js.map +1 -0
- package/esm2015/lib/modules/shared/sky-flyout-resources.module.js +54 -0
- package/esm2015/lib/modules/shared/sky-flyout-resources.module.js.map +1 -0
- package/esm2015/skyux-flyout.js +2 -2
- package/esm2015/skyux-flyout.js.map +1 -0
- package/fesm2015/skyux-flyout.js.map +1 -1
- package/index.d.ts +11 -0
- package/{modules → lib/modules}/flyout/flyout-adapter.service.d.ts +0 -0
- package/{modules → lib/modules}/flyout/flyout-instance.d.ts +0 -0
- package/{modules → lib/modules}/flyout/flyout-iterator.component.d.ts +0 -0
- package/{modules → lib/modules}/flyout/flyout-media-query.service.d.ts +0 -0
- package/{modules → lib/modules}/flyout/flyout.component.d.ts +0 -0
- package/{modules → lib/modules}/flyout/flyout.module.d.ts +0 -0
- package/{modules → lib/modules}/flyout/flyout.service.d.ts +0 -0
- package/{modules → lib/modules}/flyout/types/flyout-action.d.ts +0 -0
- package/{modules → lib/modules}/flyout/types/flyout-before-close-handler.d.ts +0 -0
- package/{modules → lib/modules}/flyout/types/flyout-close-args.d.ts +0 -0
- package/{modules → lib/modules}/flyout/types/flyout-config.d.ts +0 -0
- package/{modules → lib/modules}/flyout/types/flyout-message-type.d.ts +0 -0
- package/{modules → lib/modules}/flyout/types/flyout-message.d.ts +0 -0
- package/{modules → lib/modules}/flyout/types/flyout-permalink.d.ts +0 -0
- package/{modules → lib/modules}/shared/sky-flyout-resources.module.d.ts +0 -0
- package/package.json +6 -6
- package/skyux-flyout.d.ts +1 -1
- package/LICENSE +0 -21
- package/esm2015/modules/flyout/flyout-adapter.service.js +0 -64
- package/esm2015/modules/flyout/flyout-instance.js +0 -109
- package/esm2015/modules/flyout/flyout-iterator.component.js +0 -59
- package/esm2015/modules/flyout/flyout-media-query.service.js +0 -72
- package/esm2015/modules/flyout/flyout.component.js +0 -504
- package/esm2015/modules/flyout/flyout.module.js +0 -56
- package/esm2015/modules/flyout/flyout.service.js +0 -166
- package/esm2015/modules/flyout/types/flyout-action.js +0 -2
- package/esm2015/modules/flyout/types/flyout-before-close-handler.js +0 -9
- package/esm2015/modules/flyout/types/flyout-close-args.js +0 -2
- package/esm2015/modules/flyout/types/flyout-config.js +0 -2
- package/esm2015/modules/flyout/types/flyout-message-type.js +0 -13
- package/esm2015/modules/flyout/types/flyout-message.js +0 -2
- package/esm2015/modules/flyout/types/flyout-permalink.js +0 -2
- package/esm2015/modules/shared/sky-flyout-resources.module.js +0 -54
- package/esm2015/public-api.js +0 -14
- package/public-api.d.ts +0 -11
|
@@ -1,504 +0,0 @@
|
|
|
1
|
-
import { Component, ChangeDetectionStrategy, ElementRef, HostListener, Injector, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
2
|
-
import { animate, state, style, transition, trigger, } from '@angular/animations';
|
|
3
|
-
import { fromEvent, Subject } from 'rxjs';
|
|
4
|
-
import { take, takeUntil, takeWhile } from 'rxjs/operators';
|
|
5
|
-
import { SkyMediaBreakpoints, SkyMediaQueryService, } from '@skyux/core';
|
|
6
|
-
import { SkyFlyoutAdapterService } from './flyout-adapter.service';
|
|
7
|
-
import { SkyFlyoutInstance } from './flyout-instance';
|
|
8
|
-
import { SkyFlyoutMediaQueryService } from './flyout-media-query.service';
|
|
9
|
-
import { SkyFlyoutMessageType } from './types/flyout-message-type';
|
|
10
|
-
import { SkyFlyoutBeforeCloseHandler } from './types/flyout-before-close-handler';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "./flyout-adapter.service";
|
|
13
|
-
import * as i2 from "@skyux/i18n";
|
|
14
|
-
import * as i3 from "./flyout-media-query.service";
|
|
15
|
-
import * as i4 from "@skyux/core";
|
|
16
|
-
import * as i5 from "@skyux/indicators";
|
|
17
|
-
import * as i6 from "./flyout-iterator.component";
|
|
18
|
-
import * as i7 from "@angular/common";
|
|
19
|
-
import * as i8 from "@skyux/theme";
|
|
20
|
-
import * as i9 from "@angular/cdk/a11y";
|
|
21
|
-
import * as i10 from "@skyux/router";
|
|
22
|
-
import * as i11 from "@angular/router";
|
|
23
|
-
const FLYOUT_OPEN_STATE = 'flyoutOpen';
|
|
24
|
-
const FLYOUT_CLOSED_STATE = 'flyoutClosed';
|
|
25
|
-
let nextId = 0;
|
|
26
|
-
/**
|
|
27
|
-
* @internal
|
|
28
|
-
*/
|
|
29
|
-
export class SkyFlyoutComponent {
|
|
30
|
-
constructor(adapter, changeDetector, injector, resolver, resourcesService, flyoutMediaQueryService, elementRef, uiConfigService, _ngZone) {
|
|
31
|
-
this.adapter = adapter;
|
|
32
|
-
this.changeDetector = changeDetector;
|
|
33
|
-
this.injector = injector;
|
|
34
|
-
this.resolver = resolver;
|
|
35
|
-
this.resourcesService = resourcesService;
|
|
36
|
-
this.flyoutMediaQueryService = flyoutMediaQueryService;
|
|
37
|
-
this.elementRef = elementRef;
|
|
38
|
-
this.uiConfigService = uiConfigService;
|
|
39
|
-
this._ngZone = _ngZone;
|
|
40
|
-
this.flyoutId = `sky-flyout-${++nextId}`;
|
|
41
|
-
this.flyoutState = FLYOUT_CLOSED_STATE;
|
|
42
|
-
this.isOpen = false;
|
|
43
|
-
this.isOpening = false;
|
|
44
|
-
this.flyoutWidth = 0;
|
|
45
|
-
this.instanceReady = false;
|
|
46
|
-
this.isDragging = false;
|
|
47
|
-
this.isFullscreen = false;
|
|
48
|
-
this.resizeKeyControlActive = false;
|
|
49
|
-
this.xCoord = 0;
|
|
50
|
-
this.windowBufferSize = 20;
|
|
51
|
-
/**
|
|
52
|
-
* @internal
|
|
53
|
-
*/
|
|
54
|
-
this.widthStep = 10;
|
|
55
|
-
this.ngUnsubscribe = new Subject();
|
|
56
|
-
this._messageStream = new Subject();
|
|
57
|
-
// All commands flow through the message stream.
|
|
58
|
-
this.messageStream
|
|
59
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
60
|
-
.subscribe((message) => {
|
|
61
|
-
this.handleIncomingMessages(message);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
get messageStream() {
|
|
65
|
-
return this._messageStream;
|
|
66
|
-
}
|
|
67
|
-
get permalink() {
|
|
68
|
-
const permalink = this.config.permalink;
|
|
69
|
-
if (permalink) {
|
|
70
|
-
return permalink;
|
|
71
|
-
}
|
|
72
|
-
return {};
|
|
73
|
-
}
|
|
74
|
-
get permalinkLabel() {
|
|
75
|
-
if (this.permalink.label) {
|
|
76
|
-
return this.permalink.label;
|
|
77
|
-
}
|
|
78
|
-
return this.getString('skyux_flyout_permalink_button');
|
|
79
|
-
}
|
|
80
|
-
get primaryAction() {
|
|
81
|
-
let primaryAction = this.config.primaryAction;
|
|
82
|
-
if (primaryAction) {
|
|
83
|
-
return primaryAction;
|
|
84
|
-
}
|
|
85
|
-
return {};
|
|
86
|
-
}
|
|
87
|
-
get primaryActionLabel() {
|
|
88
|
-
if (this.config.primaryAction && this.config.primaryAction.label) {
|
|
89
|
-
return this.config.primaryAction.label;
|
|
90
|
-
}
|
|
91
|
-
return this.getString('skyux_flyout_primary_action_button');
|
|
92
|
-
}
|
|
93
|
-
ngOnInit() {
|
|
94
|
-
this.adapter.adjustHeaderForHelp(this.flyoutHeader);
|
|
95
|
-
}
|
|
96
|
-
ngOnDestroy() {
|
|
97
|
-
this.ngUnsubscribe.next();
|
|
98
|
-
this.ngUnsubscribe.complete();
|
|
99
|
-
}
|
|
100
|
-
onWindowResize(event) {
|
|
101
|
-
if (this.flyoutMediaQueryService.isWidthWithinBreakpiont(event.target.innerWidth, SkyMediaBreakpoints.xs)) {
|
|
102
|
-
this.updateBreakpointAndResponsiveClass(event.target.innerWidth);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
this.updateBreakpointAndResponsiveClass(this.flyoutWidth);
|
|
106
|
-
}
|
|
107
|
-
this.setFullscreen();
|
|
108
|
-
if (event.target.innerWidth - this.flyoutWidth < this.windowBufferSize) {
|
|
109
|
-
this.flyoutWidth = event.target.innerWidth - this.windowBufferSize;
|
|
110
|
-
this.xCoord = this.windowBufferSize;
|
|
111
|
-
this.setUserData();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
attach(component, config) {
|
|
115
|
-
this.cleanTemplate();
|
|
116
|
-
// Emit the closed event on any previously opened flyout instance
|
|
117
|
-
if (this.flyoutInstance) {
|
|
118
|
-
this.notifyClosed();
|
|
119
|
-
}
|
|
120
|
-
this.config = Object.assign({ providers: [] }, config);
|
|
121
|
-
this.config.defaultWidth =
|
|
122
|
-
this.config.defaultWidth || window.innerWidth / 2;
|
|
123
|
-
this.config.minWidth = this.config.minWidth || 320;
|
|
124
|
-
this.config.maxWidth = this.config.maxWidth || this.config.defaultWidth;
|
|
125
|
-
this.config.showIterator = this.config.showIterator || false;
|
|
126
|
-
this.config.iteratorNextButtonDisabled =
|
|
127
|
-
this.config.iteratorNextButtonDisabled || false;
|
|
128
|
-
this.config.iteratorPreviousButtonDisabled =
|
|
129
|
-
this.config.iteratorPreviousButtonDisabled || false;
|
|
130
|
-
const factory = this.resolver.resolveComponentFactory(component);
|
|
131
|
-
const injector = Injector.create({
|
|
132
|
-
parent: this.injector,
|
|
133
|
-
providers: this.config.providers,
|
|
134
|
-
});
|
|
135
|
-
const componentRef = this.target.createComponent(factory, undefined, injector);
|
|
136
|
-
this.flyoutInstance = this.createFlyoutInstance(componentRef.instance);
|
|
137
|
-
// This is used to ensure we do not render the flyout until we have attached the component.
|
|
138
|
-
// This allows the aria-labelledby to function correctly.
|
|
139
|
-
this.instanceReady = true;
|
|
140
|
-
this.changeDetector.markForCheck();
|
|
141
|
-
// Open the flyout immediately.
|
|
142
|
-
this.messageStream.next({
|
|
143
|
-
type: SkyFlyoutMessageType.Open,
|
|
144
|
-
});
|
|
145
|
-
if (this.config.settingsKey) {
|
|
146
|
-
this.uiConfigService
|
|
147
|
-
.getConfig(this.config.settingsKey)
|
|
148
|
-
.pipe(take(1))
|
|
149
|
-
.subscribe((value) => {
|
|
150
|
-
if (value && value.flyoutWidth) {
|
|
151
|
-
this.flyoutWidth = value.flyoutWidth;
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
// Bad data, or config is the default config.
|
|
155
|
-
this.flyoutWidth = this.config.defaultWidth;
|
|
156
|
-
}
|
|
157
|
-
this.checkInitialSize();
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
this.flyoutWidth = this.config.defaultWidth;
|
|
162
|
-
this.checkInitialSize();
|
|
163
|
-
}
|
|
164
|
-
return this.flyoutInstance;
|
|
165
|
-
}
|
|
166
|
-
close() {
|
|
167
|
-
this.messageStream.next({
|
|
168
|
-
type: SkyFlyoutMessageType.Close,
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
invokePrimaryAction() {
|
|
172
|
-
this.primaryAction.callback();
|
|
173
|
-
if (this.primaryAction.closeAfterInvoking) {
|
|
174
|
-
this.close();
|
|
175
|
-
}
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
getAnimationState() {
|
|
179
|
-
return this.instanceReady && this.isOpening
|
|
180
|
-
? FLYOUT_OPEN_STATE
|
|
181
|
-
: FLYOUT_CLOSED_STATE;
|
|
182
|
-
}
|
|
183
|
-
animationDone(event) {
|
|
184
|
-
if (event.toState === FLYOUT_OPEN_STATE) {
|
|
185
|
-
this.isOpen = true;
|
|
186
|
-
}
|
|
187
|
-
if (event.toState === FLYOUT_CLOSED_STATE) {
|
|
188
|
-
this.isOpen = false;
|
|
189
|
-
this.notifyClosed();
|
|
190
|
-
this.cleanTemplate();
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
onHeaderGrabHandleMouseDown(event) {
|
|
194
|
-
this.onResizeHandleMouseDown(event);
|
|
195
|
-
}
|
|
196
|
-
onHeaderGrabHandleKeyDown(event) {
|
|
197
|
-
this.handleResizeKeyDown(event);
|
|
198
|
-
}
|
|
199
|
-
onResizeHandleKeyDown(event) {
|
|
200
|
-
this.handleResizeKeyDown(event);
|
|
201
|
-
}
|
|
202
|
-
onResizeHandleMouseDown(event) {
|
|
203
|
-
event.preventDefault();
|
|
204
|
-
event.stopPropagation();
|
|
205
|
-
if (this.isFullscreen) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
this.isDragging = true;
|
|
209
|
-
this.xCoord = event.clientX;
|
|
210
|
-
this.adapter.toggleIframePointerEvents(false);
|
|
211
|
-
fromEvent(document, 'mousemove')
|
|
212
|
-
.pipe(takeWhile(() => {
|
|
213
|
-
return this.isDragging;
|
|
214
|
-
}))
|
|
215
|
-
.subscribe((moveEvent) => {
|
|
216
|
-
this.onMouseMove(moveEvent);
|
|
217
|
-
});
|
|
218
|
-
fromEvent(document, 'mouseup')
|
|
219
|
-
.pipe(takeWhile(() => {
|
|
220
|
-
return this.isDragging;
|
|
221
|
-
}))
|
|
222
|
-
.subscribe((mouseUpEvent) => {
|
|
223
|
-
this.onHandleRelease(mouseUpEvent);
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
onMouseMove(event) {
|
|
227
|
-
/* Sanity check */
|
|
228
|
-
/* istanbul ignore if */
|
|
229
|
-
if (!this.isDragging) {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
const offsetX = event.clientX - this.xCoord;
|
|
233
|
-
let width = this.flyoutWidth;
|
|
234
|
-
width -= offsetX;
|
|
235
|
-
if (width < this.config.minWidth || width > this.config.maxWidth) {
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
if (window.innerWidth - width < this.windowBufferSize) {
|
|
239
|
-
width = window.innerWidth - this.windowBufferSize;
|
|
240
|
-
this.xCoord = this.windowBufferSize;
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
this.xCoord = event.clientX;
|
|
244
|
-
}
|
|
245
|
-
this.flyoutWidth = width;
|
|
246
|
-
this.updateBreakpointAndResponsiveClass(this.flyoutWidth);
|
|
247
|
-
this.changeDetector.markForCheck();
|
|
248
|
-
}
|
|
249
|
-
onHandleRelease(event) {
|
|
250
|
-
fromEvent(document, 'click')
|
|
251
|
-
.pipe(take(1))
|
|
252
|
-
.subscribe(() => {
|
|
253
|
-
this.isDragging = false;
|
|
254
|
-
this.adapter.toggleIframePointerEvents(true);
|
|
255
|
-
this.setUserData();
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
onIteratorPreviousButtonClick() {
|
|
259
|
-
this.flyoutInstance.iteratorPreviousButtonClick.emit();
|
|
260
|
-
}
|
|
261
|
-
onIteratorNextButtonClick() {
|
|
262
|
-
this.flyoutInstance.iteratorNextButtonClick.emit();
|
|
263
|
-
}
|
|
264
|
-
createFlyoutInstance(component) {
|
|
265
|
-
const instance = new SkyFlyoutInstance();
|
|
266
|
-
instance.componentInstance = component;
|
|
267
|
-
instance.hostController
|
|
268
|
-
.pipe(takeUntil(this.ngUnsubscribe))
|
|
269
|
-
.subscribe((message) => {
|
|
270
|
-
this.messageStream.next(message);
|
|
271
|
-
});
|
|
272
|
-
return instance;
|
|
273
|
-
}
|
|
274
|
-
handleIncomingMessages(message) {
|
|
275
|
-
var _a;
|
|
276
|
-
/* tslint:disable-next-line:switch-default */
|
|
277
|
-
switch (message.type) {
|
|
278
|
-
case SkyFlyoutMessageType.Open:
|
|
279
|
-
if (!this.isOpen) {
|
|
280
|
-
this.isOpen = false;
|
|
281
|
-
this.isOpening = true;
|
|
282
|
-
}
|
|
283
|
-
this.initFocusTrap();
|
|
284
|
-
break;
|
|
285
|
-
case SkyFlyoutMessageType.Close:
|
|
286
|
-
if (this.flyoutInstance.beforeClose.observers.length ===
|
|
287
|
-
0 ||
|
|
288
|
-
((_a = message.data) === null || _a === void 0 ? void 0 : _a.ignoreBeforeClose)) {
|
|
289
|
-
this.isOpen = true;
|
|
290
|
-
this.isOpening = false;
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
this.flyoutInstance.beforeClose.next(new SkyFlyoutBeforeCloseHandler(() => {
|
|
294
|
-
this.isOpen = true;
|
|
295
|
-
this.isOpening = false;
|
|
296
|
-
}));
|
|
297
|
-
}
|
|
298
|
-
break;
|
|
299
|
-
case SkyFlyoutMessageType.EnableIteratorNextButton:
|
|
300
|
-
this.config.iteratorNextButtonDisabled = false;
|
|
301
|
-
break;
|
|
302
|
-
case SkyFlyoutMessageType.EnableIteratorPreviousButton:
|
|
303
|
-
this.config.iteratorPreviousButtonDisabled = false;
|
|
304
|
-
break;
|
|
305
|
-
case SkyFlyoutMessageType.DisableIteratorNextButton:
|
|
306
|
-
this.config.iteratorNextButtonDisabled = true;
|
|
307
|
-
break;
|
|
308
|
-
case SkyFlyoutMessageType.DisableIteratorPreviousButton:
|
|
309
|
-
this.config.iteratorPreviousButtonDisabled = true;
|
|
310
|
-
break;
|
|
311
|
-
}
|
|
312
|
-
this.changeDetector.markForCheck();
|
|
313
|
-
}
|
|
314
|
-
notifyClosed() {
|
|
315
|
-
this.flyoutInstance.closed.emit();
|
|
316
|
-
this.flyoutInstance.closed.complete();
|
|
317
|
-
}
|
|
318
|
-
cleanTemplate() {
|
|
319
|
-
this.target.clear();
|
|
320
|
-
}
|
|
321
|
-
updateBreakpointAndResponsiveClass(width) {
|
|
322
|
-
this.flyoutMediaQueryService.setBreakpointForWidth(width);
|
|
323
|
-
const newBreakpiont = this.flyoutMediaQueryService.current;
|
|
324
|
-
this.adapter.setResponsiveClass(this.elementRef, newBreakpiont);
|
|
325
|
-
}
|
|
326
|
-
setFullscreen() {
|
|
327
|
-
if (window.innerWidth - this.windowBufferSize < this.config.minWidth) {
|
|
328
|
-
this.isFullscreen = true;
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
331
|
-
this.isFullscreen = false;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
setUserData() {
|
|
335
|
-
if (this.config.settingsKey) {
|
|
336
|
-
this.uiConfigService
|
|
337
|
-
.setConfig(this.config.settingsKey, {
|
|
338
|
-
flyoutWidth: this.flyoutWidth,
|
|
339
|
-
})
|
|
340
|
-
.pipe(take(1))
|
|
341
|
-
.subscribe(() => { }, (err) => {
|
|
342
|
-
console.warn('Could not save flyout data.');
|
|
343
|
-
console.warn(err);
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
checkInitialSize() {
|
|
348
|
-
if (this.flyoutWidth < this.config.minWidth) {
|
|
349
|
-
this.flyoutWidth = this.config.minWidth;
|
|
350
|
-
this.setUserData();
|
|
351
|
-
}
|
|
352
|
-
else if (this.flyoutWidth > this.config.maxWidth) {
|
|
353
|
-
this.flyoutWidth = this.config.maxWidth;
|
|
354
|
-
this.setUserData();
|
|
355
|
-
}
|
|
356
|
-
// Ensure flyout does not load larger than the window and its buffer
|
|
357
|
-
if (window.innerWidth - this.flyoutWidth < this.windowBufferSize) {
|
|
358
|
-
this.flyoutWidth = window.innerWidth - this.windowBufferSize;
|
|
359
|
-
this.xCoord = this.windowBufferSize;
|
|
360
|
-
this.setUserData();
|
|
361
|
-
}
|
|
362
|
-
if (this.flyoutMediaQueryService.isWidthWithinBreakpiont(window.innerWidth, SkyMediaBreakpoints.xs)) {
|
|
363
|
-
this.updateBreakpointAndResponsiveClass(window.innerWidth);
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
this.updateBreakpointAndResponsiveClass(this.flyoutWidth);
|
|
367
|
-
}
|
|
368
|
-
this.setFullscreen();
|
|
369
|
-
}
|
|
370
|
-
getString(key) {
|
|
371
|
-
// TODO: Need to implement the async `getString` method in a breaking change.
|
|
372
|
-
return this.resourcesService.getStringForLocale({ locale: 'en-US' }, key);
|
|
373
|
-
}
|
|
374
|
-
handleResizeKeyDown(event) {
|
|
375
|
-
/* istanbul ignore else */
|
|
376
|
-
if (event.key) {
|
|
377
|
-
const keyPressed = event.key.toLowerCase().replace('arrow', '');
|
|
378
|
-
switch (keyPressed) {
|
|
379
|
-
case 'enter':
|
|
380
|
-
case ' ':
|
|
381
|
-
this.resizeKeyControlActive = !this.resizeKeyControlActive;
|
|
382
|
-
break;
|
|
383
|
-
case 'tab':
|
|
384
|
-
/* istanbul ignore else */
|
|
385
|
-
if (this.resizeKeyControlActive) {
|
|
386
|
-
this.resizeKeyControlActive = false;
|
|
387
|
-
}
|
|
388
|
-
case 'left':
|
|
389
|
-
if (this.resizeKeyControlActive) {
|
|
390
|
-
/* istanbul ignore else */
|
|
391
|
-
if (this.flyoutWidth < this.config.maxWidth) {
|
|
392
|
-
this.flyoutWidth = Math.min(this.flyoutWidth + this.widthStep, this.config.maxWidth);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
break;
|
|
396
|
-
case 'right':
|
|
397
|
-
if (this.resizeKeyControlActive) {
|
|
398
|
-
/* istanbul ignore else */
|
|
399
|
-
if (this.flyoutWidth > this.config.minWidth) {
|
|
400
|
-
this.flyoutWidth = Math.max(this.flyoutWidth - this.widthStep, this.config.minWidth);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
break;
|
|
404
|
-
/* istanbul ignore next */
|
|
405
|
-
default:
|
|
406
|
-
break;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
/** Executes a function when the zone is stable. */
|
|
411
|
-
_executeOnStable(fn) {
|
|
412
|
-
if (this._ngZone.isStable) {
|
|
413
|
-
fn();
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
this._ngZone.onStable.pipe(take(1)).subscribe(fn);
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
initFocusTrap() {
|
|
420
|
-
this.enableTrapFocusAutoCapture = false;
|
|
421
|
-
this.enableTrapFocus = false;
|
|
422
|
-
// Waiting for zone to be stable will avoid ExpressionChangeAfterCheckedError.
|
|
423
|
-
this._executeOnStable(() => {
|
|
424
|
-
this.enableTrapFocusAutoCapture = true;
|
|
425
|
-
this.enableTrapFocus = true;
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
SkyFlyoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFlyoutComponent, deps: [{ token: i1.SkyFlyoutAdapterService }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i0.ComponentFactoryResolver }, { token: i2.SkyLibResourcesService }, { token: i3.SkyFlyoutMediaQueryService }, { token: i0.ElementRef }, { token: i4.SkyUIConfigService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
430
|
-
SkyFlyoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkyFlyoutComponent, selector: "sky-flyout", host: { listeners: { "window:resize": "onWindowResize($event)" } }, providers: [
|
|
431
|
-
SkyFlyoutAdapterService,
|
|
432
|
-
SkyFlyoutMediaQueryService,
|
|
433
|
-
{ provide: SkyMediaQueryService, useExisting: SkyFlyoutMediaQueryService },
|
|
434
|
-
], viewQueries: [{ propertyName: "flyoutRef", first: true, predicate: ["flyoutRef"], descendants: true, read: ElementRef, static: true }, { propertyName: "target", first: true, predicate: ["target"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "flyoutCloseButton", first: true, predicate: ["flyoutCloseButton"], descendants: true, read: ElementRef, static: true }, { propertyName: "flyoutContent", first: true, predicate: ["flyoutContent"], descendants: true, read: ElementRef, static: true }, { propertyName: "flyoutHeader", first: true, predicate: ["flyoutHeader"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<div\n class=\"sky-flyout\"\n tabindex=\"-1\"\n [attr.role]=\"config?.ariaRole ? config.ariaRole : 'dialog'\"\n [attr.aria-describedby]=\"config?.ariaDescribedBy\"\n [attr.aria-label]=\"config?.ariaLabel\"\n [attr.aria-labelledby]=\"config?.ariaLabelledBy\"\n [attr.aria-modal]=\"\n config?.ariaRole === 'dialog' || !config?.ariaRole ? true : false\n \"\n [attr.hidden]=\"!instanceReady ? true : undefined\"\n [id]=\"flyoutId\"\n [ngClass]=\"{\n 'sky-flyout-hidden': !isOpen && !isOpening,\n 'sky-flyout-fullscreen': isFullscreen\n }\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-8': 'modern'\n }\"\n (@flyoutState.done)=\"animationDone($event)\"\n [@flyoutState]=\"getAnimationState()\"\n [style.width.px]=\"flyoutWidth\"\n #flyoutRef\n [cdkTrapFocus]=\"enableTrapFocus\"\n [cdkTrapFocusAutoCapture]=\"enableTrapFocusAutoCapture\"\n>\n <div\n class=\"sky-flyout-header\"\n [skyThemeClass]=\"{\n 'sky-padding-squish-large': 'default'\n }\"\n #flyoutHeader\n >\n <div class=\"sky-flyout-header-content\">\n <button\n *skyThemeIf=\"'modern'\"\n class=\"\n sky-btn\n sky-btn-icon-borderless\n sky-margin-inline-sm\n sky-flyout-header-grab-handle\n \"\n [attr.aria-label]=\"'skyux_flyout_resize_handle' | skyLibResources\"\n (keydown)=\"onHeaderGrabHandleKeyDown($event)\"\n (mousedown)=\"onHeaderGrabHandleMouseDown($event)\"\n >\n <sky-icon icon=\"tile-drag\" iconType=\"skyux\" size=\"lg\"> </sky-icon>\n </button>\n\n <sky-flyout-iterator\n *ngIf=\"config.showIterator\"\n [nextButtonDisabled]=\"config.iteratorNextButtonDisabled\"\n [previousButtonDisabled]=\"config.iteratorPreviousButtonDisabled\"\n (nextButtonClick)=\"onIteratorNextButtonClick()\"\n (previousButtonClick)=\"onIteratorPreviousButtonClick()\"\n >\n </sky-flyout-iterator>\n </div>\n <div class=\"sky-flyout-header-buttons\">\n <ng-container *ngTemplateOutlet=\"permalinkTemplate\"> </ng-container>\n <ng-container *ngTemplateOutlet=\"primaryActionTemplate\"> </ng-container>\n <button\n class=\"sky-btn sky-flyout-btn-close sky-label-icon-theme-default\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_flyout_close' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-btn-default': 'default',\n 'sky-btn-icon-borderless': 'modern'\n }\"\n (click)=\"close()\"\n #flyoutCloseButton\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"close\"> </sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"close\"\n iconType=\"skyux\"\n size=\"lg\"\n >\n </sky-icon>\n </button>\n </div>\n </div>\n <div class=\"sky-flyout-content\" #flyoutContent>\n <div #target></div>\n </div>\n <div\n class=\"sky-flyout-resize-handle\"\n role=\"separator\"\n tabindex=\"0\"\n type=\"range\"\n [attr.aria-controls]=\"flyoutId\"\n [attr.aria-label]=\"'skyux_flyout_resize_handle' | skyLibResources\"\n [attr.aria-valuemax]=\"config.maxWidth\"\n [attr.aria-valuemin]=\"config.minWidth\"\n [attr.aria-valuenow]=\"flyoutWidth\"\n (keydown)=\"onResizeHandleKeyDown($event)\"\n (mousedown)=\"onResizeHandleMouseDown($event)\"\n ></div>\n</div>\n\n<ng-template #permalinkTemplate>\n <ng-template [ngIf]=\"permalink\">\n <ng-template [ngIf]=\"permalink.url\">\n <a\n class=\"sky-btn sky-flyout-btn-permalink sky-margin-inline-default\"\n [skyHref]=\"permalink.url\"\n [skyThemeClass]=\"{\n 'sky-btn-default': 'default',\n 'sky-btn-borderless': 'modern'\n }\"\n (click)=\"close()\"\n >\n {{ permalinkLabel }}\n </a>\n </ng-template>\n <ng-template [ngIf]=\"permalink.route\">\n <a\n class=\"sky-btn sky-flyout-btn-permalink sky-margin-inline-default\"\n [routerLink]=\"permalink.route.commands\"\n [fragment]=\"permalink.route.extras?.fragment\"\n [skyThemeClass]=\"{\n 'sky-btn-default': 'default',\n 'sky-btn-borderless': 'modern'\n }\"\n [queryParams]=\"permalink.route.extras?.queryParams\"\n [queryParamsHandling]=\"permalink.route.extras?.queryParamsHandling\"\n [state]=\"permalink.route.extras?.state\"\n (click)=\"close()\"\n >\n {{ permalinkLabel }}\n </a>\n </ng-template>\n </ng-template>\n</ng-template>\n\n<ng-template #primaryActionTemplate>\n <ng-template [ngIf]=\"primaryAction && primaryAction.callback\">\n <button\n type=\"button\"\n class=\"\n sky-btn\n sky-btn-default\n sky-flyout-btn-primary-action\n sky-margin-inline-default\n \"\n (click)=\"invokePrimaryAction()\"\n >\n {{ primaryActionLabel }}\n </button>\n </ng-template>\n</ng-template>\n", styles: [".sky-flyout{position:fixed;right:0;top:0;bottom:0;height:100%;background-color:#fff;border-left:6px solid #0974a1;z-index:1001}.sky-flyout:focus{outline:none}.sky-flyout.sky-flyout-fullscreen{min-width:100%;max-width:100%}.sky-flyout.sky-flyout-fullscreen .sky-flyout-resize-handle{cursor:initial}.sky-flyout.sky-flyout-hidden{visibility:hidden}.sky-flyout .sky-flyout-input-aria-only{width:0;height:0;padding:0;opacity:0;position:absolute;margin:-1px;border:0;overflow:hidden;clip:rect(0 0 0 0);outline:none}.sky-flyout-resize-handle{-webkit-appearance:none;-moz-appearance:none;height:100%;width:14px;position:absolute;left:-10px;cursor:ew-resize;padding:0;border:0;background:transparent;display:block;top:0;bottom:0;direction:rtl}.sky-flyout-resize-handle::-moz-range-thumb,.sky-flyout-resize-handle::-moz-range-track{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-flyout-resize-handle::-ms-thumb,.sky-flyout-resize-handle::-ms-track{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-flyout-resize-handle::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;width:0;height:0;border-radius:0;border:0 none;background:none;display:none}.sky-flyout-header{border-bottom:1px solid #cdcfd2;width:100%;background:#eeeeef;height:50px;display:flex;align-items:flex-start}.sky-flyout-header-content{flex-grow:1}.sky-flyout-btn-permalink:hover{text-decoration:none}.sky-flyout-help-shim{padding-right:8px}@media (min-width: 768px){.sky-flyout-help-shim{padding-right:50px}}.sky-flyout-content{overflow-y:auto;height:calc(100% - 50px)}:host-context(.sky-theme-modern) .sky-flyout{border-left:0}:host-context(.sky-theme-modern) .sky-flyout-header{border-bottom:none;background:#fff;padding:15px 10px}:host-context(.sky-theme-modern) .sky-flyout-header-grab-handle{cursor:move;cursor:-moz-grab}.sky-theme-modern .sky-flyout{border-left:0}.sky-theme-modern .sky-flyout-header{border-bottom:none;background:#fff;padding:15px 10px}.sky-theme-modern .sky-flyout-header-grab-handle{cursor:move;cursor:-moz-grab}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-flyout{background:#000}:host-context(.sky-theme-modern.sky-theme-mode-dark) .sky-flyout-header{background:#000}.sky-theme-modern.sky-theme-mode-dark .sky-flyout{background:#000}.sky-theme-modern.sky-theme-mode-dark .sky-flyout-header{background:#000}\n"], components: [{ type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { type: i6.SkyFlyoutIteratorComponent, selector: "sky-flyout-iterator", inputs: ["nextButtonDisabled", "previousButtonDisabled"], outputs: ["previousButtonClick", "nextButtonClick"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i8.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { type: i9.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { type: i8.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i10.λ1, selector: "[skyHref]", inputs: ["skyHref", "skyHrefElse"] }, { type: i11.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }], pipes: { "skyLibResources": i2.SkyLibResourcesPipe }, animations: [
|
|
435
|
-
trigger('flyoutState', [
|
|
436
|
-
state(FLYOUT_OPEN_STATE, style({ transform: 'initial' })),
|
|
437
|
-
state(FLYOUT_CLOSED_STATE, style({ transform: 'translateX(100%)' })),
|
|
438
|
-
transition('void => *', [
|
|
439
|
-
style({ transform: 'translateX(100%)' }),
|
|
440
|
-
animate(250),
|
|
441
|
-
]),
|
|
442
|
-
transition(`* <=> *`, animate('250ms ease-in')),
|
|
443
|
-
]),
|
|
444
|
-
], changeDetection: i0.ChangeDetectionStrategy.Default });
|
|
445
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFlyoutComponent, decorators: [{
|
|
446
|
-
type: Component,
|
|
447
|
-
args: [{
|
|
448
|
-
selector: 'sky-flyout',
|
|
449
|
-
templateUrl: './flyout.component.html',
|
|
450
|
-
styleUrls: ['./flyout.component.scss'],
|
|
451
|
-
providers: [
|
|
452
|
-
SkyFlyoutAdapterService,
|
|
453
|
-
SkyFlyoutMediaQueryService,
|
|
454
|
-
{ provide: SkyMediaQueryService, useExisting: SkyFlyoutMediaQueryService },
|
|
455
|
-
],
|
|
456
|
-
animations: [
|
|
457
|
-
trigger('flyoutState', [
|
|
458
|
-
state(FLYOUT_OPEN_STATE, style({ transform: 'initial' })),
|
|
459
|
-
state(FLYOUT_CLOSED_STATE, style({ transform: 'translateX(100%)' })),
|
|
460
|
-
transition('void => *', [
|
|
461
|
-
style({ transform: 'translateX(100%)' }),
|
|
462
|
-
animate(250),
|
|
463
|
-
]),
|
|
464
|
-
transition(`* <=> *`, animate('250ms ease-in')),
|
|
465
|
-
]),
|
|
466
|
-
],
|
|
467
|
-
// Allow automatic change detection for child components.
|
|
468
|
-
changeDetection: ChangeDetectionStrategy.Default,
|
|
469
|
-
}]
|
|
470
|
-
}], ctorParameters: function () { return [{ type: i1.SkyFlyoutAdapterService }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }, { type: i0.ComponentFactoryResolver }, { type: i2.SkyLibResourcesService }, { type: i3.SkyFlyoutMediaQueryService }, { type: i0.ElementRef }, { type: i4.SkyUIConfigService }, { type: i0.NgZone }]; }, propDecorators: { flyoutRef: [{
|
|
471
|
-
type: ViewChild,
|
|
472
|
-
args: ['flyoutRef', {
|
|
473
|
-
read: ElementRef,
|
|
474
|
-
static: true,
|
|
475
|
-
}]
|
|
476
|
-
}], target: [{
|
|
477
|
-
type: ViewChild,
|
|
478
|
-
args: ['target', {
|
|
479
|
-
read: ViewContainerRef,
|
|
480
|
-
static: true,
|
|
481
|
-
}]
|
|
482
|
-
}], flyoutCloseButton: [{
|
|
483
|
-
type: ViewChild,
|
|
484
|
-
args: ['flyoutCloseButton', {
|
|
485
|
-
read: ElementRef,
|
|
486
|
-
static: true,
|
|
487
|
-
}]
|
|
488
|
-
}], flyoutContent: [{
|
|
489
|
-
type: ViewChild,
|
|
490
|
-
args: ['flyoutContent', {
|
|
491
|
-
read: ElementRef,
|
|
492
|
-
static: true,
|
|
493
|
-
}]
|
|
494
|
-
}], flyoutHeader: [{
|
|
495
|
-
type: ViewChild,
|
|
496
|
-
args: ['flyoutHeader', {
|
|
497
|
-
read: ElementRef,
|
|
498
|
-
static: true,
|
|
499
|
-
}]
|
|
500
|
-
}], onWindowResize: [{
|
|
501
|
-
type: HostListener,
|
|
502
|
-
args: ['window:resize', ['$event']]
|
|
503
|
-
}] } });
|
|
504
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ZseW91dC9zcmMvbW9kdWxlcy9mbHlvdXQvZmx5b3V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ZseW91dC9zcmMvbW9kdWxlcy9mbHlvdXQvZmx5b3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEVBR3ZCLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUlSLFNBQVMsRUFDVCxnQkFBZ0IsR0FFakIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLE9BQU8sRUFFUCxLQUFLLEVBQ0wsS0FBSyxFQUNMLFVBQVUsRUFDVixPQUFPLEdBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RCxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG9CQUFvQixHQUVyQixNQUFNLGFBQWEsQ0FBQztBQUlyQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQVExRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUduRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7OztBQUVsRixNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQztBQUN2QyxNQUFNLG1CQUFtQixHQUFHLGNBQWMsQ0FB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d0JBQ2hCLE1BQU0sRUFBRSxJQUFJO3FCQUNiO2dCQXNDTSxjQUFjO3NCQURwQixZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0b3IsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIGFuaW1hdGUsXG4gIEFuaW1hdGlvbkV2ZW50LFxuICBzdGF0ZSxcbiAgc3R5bGUsXG4gIHRyYW5zaXRpb24sXG4gIHRyaWdnZXIsXG59IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgdGFrZSwgdGFrZVVudGlsLCB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIFNreU1lZGlhQnJlYWtwb2ludHMsXG4gIFNreU1lZGlhUXVlcnlTZXJ2aWNlLFxuICBTa3lVSUNvbmZpZ1NlcnZpY2UsXG59IGZyb20gJ0Bza3l1eC9jb3JlJztcblxuaW1wb3J0IHsgU2t5TGliUmVzb3VyY2VzU2VydmljZSB9IGZyb20gJ0Bza3l1eC9pMThuJztcblxuaW1wb3J0IHsgU2t5Rmx5b3V0QWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL2ZseW91dC1hZGFwdGVyLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBTa3lGbHlvdXRJbnN0YW5jZSB9IGZyb20gJy4vZmx5b3V0LWluc3RhbmNlJztcblxuaW1wb3J0IHsgU2t5Rmx5b3V0TWVkaWFRdWVyeVNlcnZpY2UgfSBmcm9tICcuL2ZseW91dC1tZWRpYS1xdWVyeS5zZXJ2aWNlJztcblxuaW1wb3J0IHsgU2t5Rmx5b3V0QWN0aW9uIH0gZnJvbSAnLi90eXBlcy9mbHlvdXQtYWN0aW9uJztcblxuaW1wb3J0IHsgU2t5Rmx5b3V0Q29uZmlnIH0gZnJvbSAnLi90eXBlcy9mbHlvdXQtY29uZmlnJztcblxuaW1wb3J0IHsgU2t5Rmx5b3V0TWVzc2FnZSB9IGZyb20gJy4vdHlwZXMvZmx5b3V0LW1lc3NhZ2UnO1xuXG5pbXBvcnQgeyBTa3lGbHlvdXRNZXNzYWdlVHlwZSB9IGZyb20gJy4vdHlwZXMvZmx5b3V0LW1lc3NhZ2UtdHlwZSc7XG5cbmltcG9ydCB7IFNreUZseW91dFBlcm1hbGluayB9IGZyb20gJy4vdHlwZXMvZmx5b3V0LXBlcm1hbGluayc7XG5pbXBvcnQgeyBTa3lGbHlvdXRCZWZvcmVDbG9zZUhhbmRsZXIgfSBmcm9tICcuL3R5cGVzL2ZseW91dC1iZWZvcmUtY2xvc2UtaGFuZGxlcic7XG5cbmNvbnN0IEZMWU9VVF9PUEVOX1NUQVRFID0gJ2ZseW91dE9wZW4nO1xuY29uc3QgRkxZT1VUX0NMT1NFRF9TVEFURSA9ICdmbHlvdXRDbG9zZWQnO1xuXG5sZXQgbmV4dElkID0gMDtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWZseW91dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mbHlvdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mbHlvdXQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgU2t5Rmx5b3V0QWRhcHRlclNlcnZpY2UsXG4gICAgU2t5Rmx5b3V0TWVkaWFRdWVyeVNlcnZpY2UsXG4gICAgeyBwcm92aWRlOiBTa3lNZWRpYVF1ZXJ5U2VydmljZSwgdXNlRXhpc3Rpbmc6IFNreUZseW91dE1lZGlhUXVlcnlTZXJ2aWNlIH0sXG4gIF0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdmbHlvdXRTdGF0ZScsIFtcbiAgICAgIHN0YXRlKEZMWU9VVF9PUEVOX1NUQVRFLCBzdHlsZSh7IHRyYW5zZm9ybTogJ2luaXRpYWwnIH0pKSxcbiAgICAgIHN0YXRlKEZMWU9VVF9DTE9TRURfU1RBVEUsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMDAlKScgfSkpLFxuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW1xuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknIH0pLFxuICAgICAgICBhbmltYXRlKDI1MCksXG4gICAgICBdKSxcbiAgICAgIHRyYW5zaXRpb24oYCogPD0+ICpgLCBhbmltYXRlKCcyNTBtcyBlYXNlLWluJykpLFxuICAgIF0pLFxuICBdLFxuICAvLyBBbGxvdyBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiBmb3IgY2hpbGQgY29tcG9uZW50cy5cbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxufSlcbmV4cG9ydCBjbGFzcyBTa3lGbHlvdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIHB1YmxpYyBjb25maWc6IFNreUZseW91dENvbmZpZztcbiAgcHVibGljIGVuYWJsZVRyYXBGb2N1czogYm9vbGVhbjtcbiAgcHVibGljIGVuYWJsZVRyYXBGb2N1c0F1dG9DYXB0dXJlOiBib29sZWFuO1xuICBwdWJsaWMgZmx5b3V0SWQ6IHN0cmluZyA9IGBza3ktZmx5b3V0LSR7KytuZXh0SWR9YDtcbiAgcHVibGljIGZseW91dFN0YXRlID0gRkxZT1VUX0NMT1NFRF9TVEFURTtcbiAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNPcGVuaW5nID0gZmFsc2U7XG5cbiAgcHVibGljIGZseW91dFdpZHRoID0gMDtcbiAgcHVibGljIGluc3RhbmNlUmVhZHkgPSBmYWxzZTtcbiAgcHVibGljIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHVibGljIGlzRnVsbHNjcmVlbiA9IGZhbHNlO1xuICBwdWJsaWMgcmVzaXplS2V5Q29udHJvbEFjdGl2ZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgeENvb3JkID0gMDtcbiAgcHJpdmF0ZSB3aW5kb3dCdWZmZXJTaXplID0gMjA7XG5cbiAgcHVibGljIGdldCBtZXNzYWdlU3RyZWFtKCk6IFN1YmplY3Q8U2t5Rmx5b3V0TWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU3RyZWFtO1xuICB9XG5cbiAgcHVibGljIGdldCBwZXJtYWxpbmsoKTogU2t5Rmx5b3V0UGVybWFsaW5rIHtcbiAgICBjb25zdCBwZXJtYWxpbmsgPSB0aGlzLmNvbmZpZy5wZXJtYWxpbms7XG4gICAgaWYgKHBlcm1hbGluaykge1xuICAgICAgcmV0dXJuIHBlcm1hbGluaztcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlcm1hbGlua0xhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMucGVybWFsaW5rLmxhYmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5wZXJtYWxpbmsubGFiZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCdza3l1eF9mbHlvdXRfcGVybWFsaW5rX2J1dHRvbicpO1xuICB9XG5cbiAgcHVibGljIGdldCBwcmltYXJ5QWN0aW9uKCk6IFNreUZseW91dEFjdGlvbiB7XG4gICAgbGV0IHByaW1hcnlBY3Rpb24gPSB0aGlzLmNvbmZpZy5wcmltYXJ5QWN0aW9uO1xuICAgIGlmIChwcmltYXJ5QWN0aW9uKSB7XG4gICAgICByZXR1cm4gcHJpbWFyeUFjdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwdWJsaWMgZ2V0IHByaW1hcnlBY3Rpb25MYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNvbmZpZy5wcmltYXJ5QWN0aW9uICYmIHRoaXMuY29uZmlnLnByaW1hcnlBY3Rpb24ubGFiZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcmltYXJ5QWN0aW9uLmxhYmVsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFN0cmluZygnc2t5dXhfZmx5b3V0X3ByaW1hcnlfYWN0aW9uX2J1dHRvbicpO1xuICB9XG5cbiAgcHVibGljIHRoZW1lTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyB3aWR0aFN0ZXA6IG51bWJlciA9IDEwO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2ZseW91dFJlZicsIHtcbiAgICByZWFkOiBFbGVtZW50UmVmLFxuICAgIHN0YXRpYzogdHJ1ZSxcbiAgfSlcbiAgcHVibGljIGZseW91dFJlZjogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCd0YXJnZXQnLCB7XG4gICAgcmVhZDogVmlld0NvbnRhaW5lclJlZixcbiAgICBzdGF0aWM6IHRydWUsXG4gIH0pXG4gIHByaXZhdGUgdGFyZ2V0OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZseW91dENsb3NlQnV0dG9uJywge1xuICAgIHJlYWQ6IEVsZW1lbnRSZWYsXG4gICAgc3RhdGljOiB0cnVlLFxuICB9KVxuICBwcml2YXRlIGZseW91dENsb3NlQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ2ZseW91dENvbnRlbnQnLCB7XG4gICAgcmVhZDogRWxlbWVudFJlZixcbiAgICBzdGF0aWM6IHRydWUsXG4gIH0pXG4gIHByaXZhdGUgZmx5b3V0Q29udGVudDogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdmbHlvdXRIZWFkZXInLCB7XG4gICAgcmVhZDogRWxlbWVudFJlZixcbiAgICBzdGF0aWM6IHRydWUsXG4gIH0pXG4gIHByaXZhdGUgZmx5b3V0SGVhZGVyOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgZmx5b3V0SW5zdGFuY2U6IFNreUZseW91dEluc3RhbmNlPGFueT47XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIF9tZXNzYWdlU3RyZWFtID0gbmV3IFN1YmplY3Q8U2t5Rmx5b3V0TWVzc2FnZT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFkYXB0ZXI6IFNreUZseW91dEFkYXB0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHJlc291cmNlc1NlcnZpY2U6IFNreUxpYlJlc291cmNlc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBmbHlvdXRNZWRpYVF1ZXJ5U2VydmljZTogU2t5Rmx5b3V0TWVkaWFRdWVyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgdWlDb25maWdTZXJ2aWNlOiBTa3lVSUNvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgLy8gQWxsIGNvbW1hbmRzIGZsb3cgdGhyb3VnaCB0aGUgbWVzc2FnZSBzdHJlYW0uXG4gICAgdGhpcy5tZXNzYWdlU3RyZWFtXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKG1lc3NhZ2U6IFNreUZseW91dE1lc3NhZ2UpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKG1lc3NhZ2UpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGFwdGVyLmFkanVzdEhlYWRlckZvckhlbHAodGhpcy5mbHlvdXRIZWFkZXIpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uV2luZG93UmVzaXplKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZseW91dE1lZGlhUXVlcnlTZXJ2aWNlLmlzV2lkdGhXaXRoaW5CcmVha3Bpb250KFxuICAgICAgICBldmVudC50YXJnZXQuaW5uZXJXaWR0aCxcbiAgICAgICAgU2t5TWVkaWFCcmVha3BvaW50cy54c1xuICAgICAgKVxuICAgICkge1xuICAgICAgdGhpcy51cGRhdGVCcmVha3BvaW50QW5kUmVzcG9uc2l2ZUNsYXNzKGV2ZW50LnRhcmdldC5pbm5lcldpZHRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVCcmVha3BvaW50QW5kUmVzcG9uc2l2ZUNsYXNzKHRoaXMuZmx5b3V0V2lkdGgpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0RnVsbHNjcmVlbigpO1xuXG4gICAgaWYgKGV2ZW50LnRhcmdldC5pbm5lcldpZHRoIC0gdGhpcy5mbHlvdXRXaWR0aCA8IHRoaXMud2luZG93QnVmZmVyU2l6ZSkge1xuICAgICAgdGhpcy5mbHlvdXRXaWR0aCA9IGV2ZW50LnRhcmdldC5pbm5lcldpZHRoIC0gdGhpcy53aW5kb3dCdWZmZXJTaXplO1xuICAgICAgdGhpcy54Q29vcmQgPSB0aGlzLndpbmRvd0J1ZmZlclNpemU7XG4gICAgICB0aGlzLnNldFVzZXJEYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGF0dGFjaDxUPihcbiAgICBjb21wb25lbnQ6IFR5cGU8VD4sXG4gICAgY29uZmlnOiBTa3lGbHlvdXRDb25maWdcbiAgKTogU2t5Rmx5b3V0SW5zdGFuY2U8VD4ge1xuICAgIHRoaXMuY2xlYW5UZW1wbGF0ZSgpO1xuXG4gICAgLy8gRW1pdCB0aGUgY2xvc2VkIGV2ZW50IG9uIGFueSBwcmV2aW91c2x5IG9wZW5lZCBmbHlvdXQgaW5zdGFuY2VcbiAgICBpZiAodGhpcy5mbHlvdXRJbnN0YW5jZSkge1xuICAgICAgdGhpcy5ub3RpZnlDbG9zZWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oeyBwcm92aWRlcnM6IFtdIH0sIGNvbmZpZyk7XG4gICAgdGhpcy5jb25maWcuZGVmYXVsdFdpZHRoID1cbiAgICAgIHRoaXMuY29uZmlnLmRlZmF1bHRXaWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aCAvIDI7XG4gICAgdGhpcy5jb25maWcubWluV2lkdGggPSB0aGlzLmNvbmZpZy5taW5XaWR0aCB8fCAzMjA7XG4gICAgdGhpcy5jb25maWcubWF4V2lkdGggPSB0aGlzLmNvbmZpZy5tYXhXaWR0aCB8fCB0aGlzLmNvbmZpZy5kZWZhdWx0V2lkdGg7XG5cbiAgICB0aGlzLmNvbmZpZy5zaG93SXRlcmF0b3IgPSB0aGlzLmNvbmZpZy5zaG93SXRlcmF0b3IgfHwgZmFsc2U7XG4gICAgdGhpcy5jb25maWcuaXRlcmF0b3JOZXh0QnV0dG9uRGlzYWJsZWQgPVxuICAgICAgdGhpcy5jb25maWcuaXRlcmF0b3JOZXh0QnV0dG9uRGlzYWJsZWQgfHwgZmFsc2U7XG4gICAgdGhpcy5jb25maWcuaXRlcmF0b3JQcmV2aW91c0J1dHRvbkRpc2FibGVkID1cbiAgICAgIHRoaXMuY29uZmlnLml0ZXJhdG9yUHJldmlvdXNCdXR0b25EaXNhYmxlZCB8fCBmYWxzZTtcblxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudCk7XG5cbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IHRoaXMuY29uZmlnLnByb3ZpZGVycyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMudGFyZ2V0LmNyZWF0ZUNvbXBvbmVudChcbiAgICAgIGZhY3RvcnksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBpbmplY3RvclxuICAgICk7XG5cbiAgICB0aGlzLmZseW91dEluc3RhbmNlID0gdGhpcy5jcmVhdGVGbHlvdXRJbnN0YW5jZTxUPihjb21wb25lbnRSZWYuaW5zdGFuY2UpO1xuXG4gICAgLy8gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkbyBub3QgcmVuZGVyIHRoZSBmbHlvdXQgdW50aWwgd2UgaGF2ZSBhdHRhY2hlZCB0aGUgY29tcG9uZW50LlxuICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBhcmlhLWxhYmVsbGVkYnkgdG8gZnVuY3Rpb24gY29ycmVjdGx5LlxuICAgIHRoaXMuaW5zdGFuY2VSZWFkeSA9IHRydWU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIC8vIE9wZW4gdGhlIGZseW91dCBpbW1lZGlhdGVseS5cbiAgICB0aGlzLm1lc3NhZ2VTdHJlYW0ubmV4dCh7XG4gICAgICB0eXBlOiBTa3lGbHlvdXRNZXNzYWdlVHlwZS5PcGVuLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnNldHRpbmdzS2V5KSB7XG4gICAgICB0aGlzLnVpQ29uZmlnU2VydmljZVxuICAgICAgICAuZ2V0Q29uZmlnKHRoaXMuY29uZmlnLnNldHRpbmdzS2V5KVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmZseW91dFdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLmZseW91dFdpZHRoID0gdmFsdWUuZmx5b3V0V2lkdGg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJhZCBkYXRhLCBvciBjb25maWcgaXMgdGhlIGRlZmF1bHQgY29uZmlnLlxuICAgICAgICAgICAgdGhpcy5mbHlvdXRXaWR0aCA9IHRoaXMuY29uZmlnLmRlZmF1bHRXaWR0aDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jaGVja0luaXRpYWxTaXplKCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZseW91dFdpZHRoID0gdGhpcy5jb25maWcuZGVmYXVsdFdpZHRoO1xuICAgICAgdGhpcy5jaGVja0luaXRpYWxTaXplKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmx5b3V0SW5zdGFuY2U7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlU3RyZWFtLm5leHQoe1xuICAgICAgdHlwZTogU2t5Rmx5b3V0TWVzc2FnZVR5cGUuQ2xvc2UsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW52b2tlUHJpbWFyeUFjdGlvbigpOiBib29sZWFuIHtcbiAgICB0aGlzLnByaW1hcnlBY3Rpb24uY2FsbGJhY2soKTtcblxuICAgIGlmICh0aGlzLnByaW1hcnlBY3Rpb24uY2xvc2VBZnRlckludm9raW5nKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldEFuaW1hdGlvblN0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VSZWFkeSAmJiB0aGlzLmlzT3BlbmluZ1xuICAgICAgPyBGTFlPVVRfT1BFTl9TVEFURVxuICAgICAgOiBGTFlPVVRfQ0xPU0VEX1NUQVRFO1xuICB9XG5cbiAgcHVibGljIGFuaW1hdGlvbkRvbmUoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09IEZMWU9VVF9PUEVOX1NUQVRFKSB7XG4gICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09IEZMWU9VVF9DTE9TRURfU1RBVEUpIHtcbiAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLm5vdGlmeUNsb3NlZCgpO1xuICAgICAgdGhpcy5jbGVhblRlbXBsYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uSGVhZGVyR3JhYkhhbmRsZU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMub25SZXNpemVIYW5kbGVNb3VzZURvd24oZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uSGVhZGVyR3JhYkhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZVJlc2l6ZUtleURvd24oZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzaXplSGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlUmVzaXplS2V5RG93bihldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXNpemVIYW5kbGVNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuaXNGdWxsc2NyZWVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnhDb29yZCA9IGV2ZW50LmNsaWVudFg7XG5cbiAgICB0aGlzLmFkYXB0ZXIudG9nZ2xlSWZyYW1lUG9pbnRlckV2ZW50cyhmYWxzZSk7XG5cbiAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdtb3VzZW1vdmUnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNEcmFnZ2luZztcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKG1vdmVFdmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMub25Nb3VzZU1vdmUobW92ZUV2ZW50KTtcbiAgICAgIH0pO1xuXG4gICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2V1cCcpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc0RyYWdnaW5nO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgobW91c2VVcEV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkhhbmRsZVJlbGVhc2UobW91c2VVcEV2ZW50KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMueENvb3JkO1xuICAgIGxldCB3aWR0aCA9IHRoaXMuZmx5b3V0V2lkdGg7XG5cbiAgICB3aWR0aCAtPSBvZmZzZXRYO1xuXG4gICAgaWYgKHdpZHRoIDwgdGhpcy5jb25maWcubWluV2lkdGggfHwgd2lkdGggPiB0aGlzLmNvbmZpZy5tYXhXaWR0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCAtIHdpZHRoIDwgdGhpcy53aW5kb3dCdWZmZXJTaXplKSB7XG4gICAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy53aW5kb3dCdWZmZXJTaXplO1xuICAgICAgdGhpcy54Q29vcmQgPSB0aGlzLndpbmRvd0J1ZmZlclNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMueENvb3JkID0gZXZlbnQuY2xpZW50WDtcbiAgICB9XG5cbiAgICB0aGlzLmZseW91dFdpZHRoID0gd2lkdGg7XG5cbiAgICB0aGlzLnVwZGF0ZUJyZWFrcG9pbnRBbmRSZXNwb25zaXZlQ2xhc3ModGhpcy5mbHlvdXRXaWR0aCk7XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG9uSGFuZGxlUmVsZWFzZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGZyb21FdmVudChkb2N1bWVudCwgJ2NsaWNrJylcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRhcHRlci50b2dnbGVJZnJhbWVQb2ludGVyRXZlbnRzKHRydWUpO1xuICAgICAgICB0aGlzLnNldFVzZXJEYXRhKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkl0ZXJhdG9yUHJldmlvdXNCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmZseW91dEluc3RhbmNlLml0ZXJhdG9yUHJldmlvdXNCdXR0b25DbGljay5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25JdGVyYXRvck5leHRCdXR0b25DbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmZseW91dEluc3RhbmNlLml0ZXJhdG9yTmV4dEJ1dHRvbkNsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmx5b3V0SW5zdGFuY2U8VD4oY29tcG9uZW50OiBUKTogU2t5Rmx5b3V0SW5zdGFuY2U8VD4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFNreUZseW91dEluc3RhbmNlPFQ+KCk7XG5cbiAgICBpbnN0YW5jZS5jb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudDtcbiAgICBpbnN0YW5jZS5ob3N0Q29udHJvbGxlclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChtZXNzYWdlOiBTa3lGbHlvdXRNZXNzYWdlKSA9PiB7XG4gICAgICAgIHRoaXMubWVzc2FnZVN0cmVhbS5uZXh0KG1lc3NhZ2UpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUluY29taW5nTWVzc2FnZXMobWVzc2FnZTogU2t5Rmx5b3V0TWVzc2FnZSk6IHZvaWQge1xuICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzd2l0Y2gtZGVmYXVsdCAqL1xuICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICBjYXNlIFNreUZseW91dE1lc3NhZ2VUeXBlLk9wZW46XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaXNPcGVuaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluaXRGb2N1c1RyYXAoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU2t5Rmx5b3V0TWVzc2FnZVR5cGUuQ2xvc2U6XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoPFN1YmplY3Q8YW55Pj50aGlzLmZseW91dEluc3RhbmNlLmJlZm9yZUNsb3NlKS5vYnNlcnZlcnMubGVuZ3RoID09PVxuICAgICAgICAgICAgMCB8fFxuICAgICAgICAgIG1lc3NhZ2UuZGF0YT8uaWdub3JlQmVmb3JlQ2xvc2VcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaXNPcGVuaW5nID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKDxTdWJqZWN0PGFueT4+dGhpcy5mbHlvdXRJbnN0YW5jZS5iZWZvcmVDbG9zZSkubmV4dChcbiAgICAgICAgICAgIG5ldyBTa3lGbHlvdXRCZWZvcmVDbG9zZUhhbmRsZXIoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuaXNPcGVuaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU2t5Rmx5b3V0TWVzc2FnZVR5cGUuRW5hYmxlSXRlcmF0b3JOZXh0QnV0dG9uOlxuICAgICAgICB0aGlzLmNvbmZpZy5pdGVyYXRvck5leHRCdXR0b25EaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lGbHlvdXRNZXNzYWdlVHlwZS5FbmFibGVJdGVyYXRvclByZXZpb3VzQnV0dG9uOlxuICAgICAgICB0aGlzLmNvbmZpZy5pdGVyYXRvclByZXZpb3VzQnV0dG9uRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU2t5Rmx5b3V0TWVzc2FnZVR5cGUuRGlzYWJsZUl0ZXJhdG9yTmV4dEJ1dHRvbjpcbiAgICAgICAgdGhpcy5jb25maWcuaXRlcmF0b3JOZXh0QnV0dG9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBTa3lGbHlvdXRNZXNzYWdlVHlwZS5EaXNhYmxlSXRlcmF0b3JQcmV2aW91c0J1dHRvbjpcbiAgICAgICAgdGhpcy5jb25maWcuaXRlcmF0b3JQcmV2aW91c0J1dHRvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q2xvc2VkKCk6IHZvaWQge1xuICAgIHRoaXMuZmx5b3V0SW5zdGFuY2UuY2xvc2VkLmVtaXQoKTtcbiAgICB0aGlzLmZseW91dEluc3RhbmNlLmNsb3NlZC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblRlbXBsYXRlKCk6IHZvaWQge1xuICAgIHRoaXMudGFyZ2V0LmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUJyZWFrcG9pbnRBbmRSZXNwb25zaXZlQ2xhc3Mod2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZmx5b3V0TWVkaWFRdWVyeVNlcnZpY2Uuc2V0QnJlYWtwb2ludEZvcldpZHRoKHdpZHRoKTtcblxuICAgIGNvbnN0IG5ld0JyZWFrcGlvbnQgPSB0aGlzLmZseW91dE1lZGlhUXVlcnlTZXJ2aWNlLmN1cnJlbnQ7XG5cbiAgICB0aGlzLmFkYXB0ZXIuc2V0UmVzcG9uc2l2ZUNsYXNzKHRoaXMuZWxlbWVudFJlZiwgbmV3QnJlYWtwaW9udCk7XG4gIH1cblxuICBwcml2YXRlIHNldEZ1bGxzY3JlZW4oKTogdm9pZCB7XG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy53aW5kb3dCdWZmZXJTaXplIDwgdGhpcy5jb25maWcubWluV2lkdGgpIHtcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFVzZXJEYXRhKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXR0aW5nc0tleSkge1xuICAgICAgdGhpcy51aUNvbmZpZ1NlcnZpY2VcbiAgICAgICAgLnNldENvbmZpZyh0aGlzLmNvbmZpZy5zZXR0aW5nc0tleSwge1xuICAgICAgICAgIGZseW91dFdpZHRoOiB0aGlzLmZseW91dFdpZHRoLFxuICAgICAgICB9KVxuICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICgpID0+IHt9LFxuICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHNhdmUgZmx5b3V0IGRhdGEuJyk7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0luaXRpYWxTaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZseW91dFdpZHRoIDwgdGhpcy5jb25maWcubWluV2lkdGgpIHtcbiAgICAgIHRoaXMuZmx5b3V0V2lkdGggPSB0aGlzLmNvbmZpZy5taW5XaWR0aDtcbiAgICAgIHRoaXMuc2V0VXNlckRhdGEoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZmx5b3V0V2lkdGggPiB0aGlzLmNvbmZpZy5tYXhXaWR0aCkge1xuICAgICAgdGhpcy5mbHlvdXRXaWR0aCA9IHRoaXMuY29uZmlnLm1heFdpZHRoO1xuICAgICAgdGhpcy5zZXRVc2VyRGF0YSgpO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSBmbHlvdXQgZG9lcyBub3QgbG9hZCBsYXJnZXIgdGhhbiB0aGUgd2luZG93IGFuZCBpdHMgYnVmZmVyXG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy5mbHlvdXRXaWR0aCA8IHRoaXMud2luZG93QnVmZmVyU2l6ZSkge1xuICAgICAgdGhpcy5mbHlvdXRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gdGhpcy53aW5kb3dCdWZmZXJTaXplO1xuICAgICAgdGhpcy54Q29vcmQgPSB0aGlzLndpbmRvd0J1ZmZlclNpemU7XG4gICAgICB0aGlzLnNldFVzZXJEYXRhKCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5mbHlvdXRNZWRpYVF1ZXJ5U2VydmljZS5pc1dpZHRoV2l0aGluQnJlYWtwaW9udChcbiAgICAgICAgd2luZG93LmlubmVyV2lkdGgsXG4gICAgICAgIFNreU1lZGlhQnJlYWtwb2ludHMueHNcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRoaXMudXBkYXRlQnJlYWtwb2ludEFuZFJlc3BvbnNpdmVDbGFzcyh3aW5kb3cuaW5uZXJXaWR0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlQnJlYWtwb2ludEFuZFJlc3BvbnNpdmVDbGFzcyh0aGlzLmZseW91dFdpZHRoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEZ1bGxzY3JlZW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RyaW5nKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBUT0RPOiBOZWVkIHRvIGltcGxlbWVudCB0aGUgYXN5bmMgYGdldFN0cmluZ2AgbWV0aG9kIGluIGEgYnJlYWtpbmcgY2hhbmdlLlxuICAgIHJldHVybiB0aGlzLnJlc291cmNlc1NlcnZpY2UuZ2V0U3RyaW5nRm9yTG9jYWxlKHsgbG9jYWxlOiAnZW4tVVMnIH0sIGtleSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlc2l6ZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChldmVudC5rZXkpIHtcbiAgICAgIGNvbnN0IGtleVByZXNzZWQgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdhcnJvdycsICcnKTtcbiAgICAgIHN3aXRjaCAoa2V5UHJlc3NlZCkge1xuICAgICAgICBjYXNlICdlbnRlcic6XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgIHRoaXMucmVzaXplS2V5Q29udHJvbEFjdGl2ZSA9ICF0aGlzLnJlc2l6ZUtleUNvbnRyb2xBY3RpdmU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RhYic6XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICBpZiAodGhpcy5yZXNpemVLZXlDb250cm9sQWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUtleUNvbnRyb2xBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGlmICh0aGlzLnJlc2l6ZUtleUNvbnRyb2xBY3RpdmUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAodGhpcy5mbHlvdXRXaWR0aCA8IHRoaXMuY29uZmlnLm1heFdpZHRoKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmx5b3V0V2lkdGggPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICB0aGlzLmZseW91dFdpZHRoICsgdGhpcy53aWR0aFN0ZXAsXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubWF4V2lkdGhcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGlmICh0aGlzLnJlc2l6ZUtleUNvbnRyb2xBY3RpdmUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAodGhpcy5mbHlvdXRXaWR0aCA+IHRoaXMuY29uZmlnLm1pbldpZHRoKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmx5b3V0V2lkdGggPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICB0aGlzLmZseW91dFdpZHRoIC0gdGhpcy53aWR0aFN0ZXAsXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcubWluV2lkdGhcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogRXhlY3V0ZXMgYSBmdW5jdGlvbiB3aGVuIHRoZSB6b25lIGlzIHN0YWJsZS4gKi9cbiAgcHJpdmF0ZSBfZXhlY3V0ZU9uU3RhYmxlKGZuOiAoKSA9PiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbmdab25lLmlzU3RhYmxlKSB7XG4gICAgICBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZm4pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZvY3VzVHJhcCgpOiB2b2lkIHtcbiAgICB0aGlzLmVuYWJsZVRyYXBGb2N1c0F1dG9DYXB0dXJlID0gZmFsc2U7XG4gICAgdGhpcy5lbmFibGVUcmFwRm9jdXMgPSBmYWxzZTtcbiAgICAvLyBXYWl0aW5nIGZvciB6b25lIHRvIGJlIHN0YWJsZSB3aWxsIGF2b2lkIEV4cHJlc3Npb25DaGFuZ2VBZnRlckNoZWNrZWRFcnJvci5cbiAgICB0aGlzLl9leGVjdXRlT25TdGFibGUoKCkgPT4ge1xuICAgICAgdGhpcy5lbmFibGVUcmFwRm9jdXNBdXRvQ2FwdHVyZSA9IHRydWU7XG4gICAgICB0aGlzLmVuYWJsZVRyYXBGb2N1cyA9IHRydWU7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJza3ktZmx5b3V0XCJcbiAgdGFiaW5kZXg9XCItMVwiXG4gIFthdHRyLnJvbGVdPVwiY29uZmlnPy5hcmlhUm9sZSA/IGNvbmZpZy5hcmlhUm9sZSA6ICdkaWFsb2cnXCJcbiAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJjb25maWc/LmFyaWFEZXNjcmliZWRCeVwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiY29uZmlnPy5hcmlhTGFiZWxcIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiY29uZmlnPy5hcmlhTGFiZWxsZWRCeVwiXG4gIFthdHRyLmFyaWEtbW9kYWxdPVwiXG4gICAgY29uZmlnPy5hcmlhUm9sZSA9PT0gJ2RpYWxvZycgfHwgIWNvbmZpZz8uYXJpYVJvbGUgPyB0cnVlIDogZmFsc2VcbiAgXCJcbiAgW2F0dHIuaGlkZGVuXT1cIiFpbnN0YW5jZVJlYWR5ID8gdHJ1ZSA6IHVuZGVmaW5lZFwiXG4gIFtpZF09XCJmbHlvdXRJZFwiXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAnc2t5LWZseW91dC1oaWRkZW4nOiAhaXNPcGVuICYmICFpc09wZW5pbmcsXG4gICAgJ3NreS1mbHlvdXQtZnVsbHNjcmVlbic6IGlzRnVsbHNjcmVlblxuICB9XCJcbiAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICdza3ktc2hhZG93JzogJ2RlZmF1bHQnLFxuICAgICdza3ktZWxldmF0aW9uLTgnOiAnbW9kZXJuJ1xuICB9XCJcbiAgKEBmbHlvdXRTdGF0ZS5kb25lKT1cImFuaW1hdGlvbkRvbmUoJGV2ZW50KVwiXG4gIFtAZmx5b3V0U3RhdGVdPVwiZ2V0QW5pbWF0aW9uU3RhdGUoKVwiXG4gIFtzdHlsZS53aWR0aC5weF09XCJmbHlvdXRXaWR0aFwiXG4gICNmbHlvdXRSZWZcbiAgW2Nka1RyYXBGb2N1c109XCJlbmFibGVUcmFwRm9jdXNcIlxuICBbY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmVdPVwiZW5hYmxlVHJhcEZvY3VzQXV0b0NhcHR1cmVcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktZmx5b3V0LWhlYWRlclwiXG4gICAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICAgJ3NreS1wYWRkaW5nLXNxdWlzaC1sYXJnZSc6ICdkZWZhdWx0J1xuICAgIH1cIlxuICAgICNmbHlvdXRIZWFkZXJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJza3ktZmx5b3V0LWhlYWRlci1jb250ZW50XCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpza3lUaGVtZUlmPVwiJ21vZGVybidcIlxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgIHNreS1idG5cbiAgICAgICAgICBza3ktYnRuLWljb24tYm9yZGVybGVzc1xuICAgICAgICAgIHNreS1tYXJnaW4taW5saW5lLXNtXG4gICAgICAgICAgc2t5LWZseW91dC1oZWFkZXItZ3JhYi1oYW5kbGVcbiAgICAgICAgXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInc2t5dXhfZmx5b3V0X3Jlc2l6ZV9oYW5kbGUnIHwgc2t5TGliUmVzb3VyY2VzXCJcbiAgICAgICAgKGtleWRvd24pPVwib25IZWFkZXJHcmFiSGFuZGxlS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvbkhlYWRlckdyYWJIYW5kbGVNb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxza3ktaWNvbiBpY29uPVwidGlsZS1kcmFnXCIgaWNvblR5cGU9XCJza3l1eFwiIHNpemU9XCJsZ1wiPiA8L3NreS1pY29uPlxuICAgICAgPC9idXR0b24+XG5cbiAgICAgIDxza3ktZmx5b3V0LWl0ZXJhdG9yXG4gICAgICAgICpuZ0lmPVwiY29uZmlnLnNob3dJdGVyYXRvclwiXG4gICAgICAgIFtuZXh0QnV0dG9uRGlzYWJsZWRdPVwiY29uZmlnLml0ZXJhdG9yTmV4dEJ1dHRvbkRpc2FibGVkXCJcbiAgICAgICAgW3ByZXZpb3VzQnV0dG9uRGlzYWJsZWRdPVwiY29uZmlnLml0ZXJhdG9yUHJldmlvdXNCdXR0b25EaXNhYmxlZFwiXG4gICAgICAgIChuZXh0QnV0dG9uQ2xpY2spPVwib25JdGVyYXRvck5leHRCdXR0b25DbGljaygpXCJcbiAgICAgICAgKHByZXZpb3VzQnV0dG9uQ2xpY2spPVwib25JdGVyYXRvclByZXZpb3VzQnV0dG9uQ2xpY2soKVwiXG4gICAgICA+XG4gICAgICA8L3NreS1mbHlvdXQtaXRlcmF0b3I+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNreS1mbHlvdXQtaGVhZGVyLWJ1dHRvbnNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwZXJtYWxpbmtUZW1wbGF0ZVwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcmltYXJ5QWN0aW9uVGVtcGxhdGVcIj4gPC9uZy1jb250YWluZXI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktZmx5b3V0LWJ0bi1jbG9zZSBza3ktbGFiZWwtaWNvbi10aGVtZS1kZWZhdWx0XCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NreXV4X2ZseW91dF9jbG9zZScgfCBza3lMaWJSZXNvdXJjZXNcIlxuICAgICAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAgICAgJ3NreS1idG4tZGVmYXVsdCc6ICdkZWZhdWx0JyxcbiAgICAgICAgICAnc2t5LWJ0bi1pY29uLWJvcmRlcmxlc3MnOiAnbW9kZXJuJ1xuICAgICAgICB9XCJcbiAgICAgICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgICAgICAjZmx5b3V0Q2xvc2VCdXR0b25cbiAgICAgID5cbiAgICAgICAgPHNreS1pY29uICpza3lUaGVtZUlmPVwiJ2RlZmF1bHQnXCIgaWNvbj1cImNsb3NlXCI+IDwvc2t5LWljb24+XG4gICAgICAgIDxza3ktaWNvblxuICAgICAgICAgICpza3lUaGVtZUlmPVwiJ21vZGVybidcIlxuICAgICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgICAgaWNvblR5cGU9XCJza3l1eFwiXG4gICAgICAgICAgc2l6ZT1cImxnXCJcbiAgICAgICAgPlxuICAgICAgICA8L3NreS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2t5LWZseW91dC1jb250ZW50XCIgI2ZseW91dENvbnRlbnQ+XG4gICAgPGRpdiAjdGFyZ2V0PjwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2t5LWZseW91dC1yZXNpemUtaGFuZGxlXCJcbiAgICByb2xlPVwic2VwYXJhdG9yXCJcbiAgICB0YWJpbmRleD1cIjBcIlxuICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJmbHlvdXRJZFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCInc2t5dXhfZmx5b3V0X3Jlc2l6ZV9oYW5kbGUnIHwgc2t5TGliUmVzb3VyY2VzXCJcbiAgICBbYXR0ci5hcmlhLXZhbHVlbWF4XT1cImNvbmZpZy5tYXhXaWR0aFwiXG4gICAgW2F0dHIuYXJpYS12YWx1ZW1pbl09XCJjb25maWcubWluV2lkdGhcIlxuICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwiZmx5b3V0V2lkdGhcIlxuICAgIChrZXlkb3duKT1cIm9uUmVzaXplSGFuZGxlS2V5RG93bigkZXZlbnQpXCJcbiAgICAobW91c2Vkb3duKT1cIm9uUmVzaXplSGFuZGxlTW91c2VEb3duKCRldmVudClcIlxuICA+PC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNwZXJtYWxpbmtUZW1wbGF0ZT5cbiAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInBlcm1hbGlua1wiPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJwZXJtYWxpbmsudXJsXCI+XG4gICAgICA8YVxuICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWZseW91dC1idG4tcGVybWFsaW5rIHNreS1tYXJnaW4taW5saW5lLWRlZmF1bHRcIlxuICAgICAgICBbc2t5SHJlZl09XCJwZXJtYWxpbmsudXJsXCJcbiAgICAgICAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICAgICAgICdza3ktYnRuLWRlZmF1bHQnOiAnZGVmYXVsdCcsXG4gICAgICAgICAgJ3NreS1idG4tYm9yZGVybGVzcyc6ICdtb2Rlcm4nXG4gICAgICAgIH1cIlxuICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHBlcm1hbGlua0xhYmVsIH19XG4gICAgICA8L2E+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwicGVybWFsaW5rLnJvdXRlXCI+XG4gICAgICA8YVxuICAgICAgICBjbGFzcz1cInNreS1idG4gc2t5LWZseW91dC1idG4tcGVybWFsaW5rIHNreS1tYXJnaW4taW5saW5lLWRlZmF1bHRcIlxuICAgICAgICBbcm91dGVyTGlua109XCJwZXJtYWxpbmsucm91dGUuY29tbWFuZHNcIlxuICAgICAgICBbZnJhZ21lbnRdPVwicGVybWFsaW5rLnJvdXRlLmV4dHJhcz8uZnJhZ21lbnRcIlxuICAgICAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAgICAgJ3NreS1idG4tZGVmYXVsdCc6ICdkZWZhdWx0JyxcbiAgICAgICAgICAnc2t5LWJ0bi1ib3JkZXJsZXNzJzogJ21vZGVybidcbiAgICAgICAgfVwiXG4gICAgICAgIFtxdWVyeVBhcmFtc109XCJwZXJtYWxpbmsucm91dGUuZXh0cmFzPy5xdWVyeVBhcmFtc1wiXG4gICAgICAgIFtxdWVyeVBhcmFtc0hhbmRsaW5nXT1cInBlcm1hbGluay5yb3V0ZS5leHRyYXM/LnF1ZXJ5UGFyYW1zSGFuZGxpbmdcIlxuICAgICAgICBbc3RhdGVdPVwicGVybWFsaW5rLnJvdXRlLmV4dHJhcz8uc3RhdGVcIlxuICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHBlcm1hbGlua0xhYmVsIH19XG4gICAgICA8L2E+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcHJpbWFyeUFjdGlvblRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgW25nSWZdPVwicHJpbWFyeUFjdGlvbiAmJiBwcmltYXJ5QWN0aW9uLmNhbGxiYWNrXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cIlxuICAgICAgICBza3ktYnRuXG4gICAgICAgIHNreS1idG4tZGVmYXVsdFxuICAgICAgICBza3ktZmx5b3V0LWJ0bi1wcmltYXJ5LWFjdGlvblxuICAgICAgICBza3ktbWFyZ2luLWlubGluZS1kZWZhdWx0XG4gICAgICBcIlxuICAgICAgKGNsaWNrKT1cImludm9rZVByaW1hcnlBY3Rpb24oKVwiXG4gICAgPlxuICAgICAge3sgcHJpbWFyeUFjdGlvbkxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuIl19
|