@microsoft/windows-admin-center-sdk 2.507.0 → 2.510.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/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +1025 -514
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
- package/angular/esm2015/src/controls/common/decorators/deprecation.decorators.js +1 -1
- package/angular/esm2015/src/controls/header/header.component.js +79 -32
- package/angular/esm2015/src/controls/layout/index.js +2 -1
- package/angular/esm2015/src/controls/layout/layout-config.js +69 -0
- package/angular/esm2015/src/controls/layout/layout-item.component.js +12 -4
- package/angular/esm2015/src/controls/layout/layout-responsive-window-manager.js +22 -0
- package/angular/esm2015/src/controls/layout/layout.component.js +402 -69
- package/angular/esm2015/src/controls/property-grid/property-grid.component.js +8 -2
- package/angular/esm2015/src/controls/settings/settings.component.js +9 -3
- package/angular/esm2015/src/controls/split-view/split-view.component.js +1 -1
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +950 -475
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
- package/angular/src/controls/header/header.component.d.ts +17 -5
- package/angular/src/controls/layout/index.d.ts +1 -0
- package/angular/src/controls/layout/layout-config.d.ts +53 -0
- package/angular/src/controls/layout/layout-item.component.d.ts +5 -1
- package/angular/src/controls/layout/layout-responsive-window-manager.d.ts +5 -0
- package/angular/src/controls/layout/layout.component.d.ts +95 -3
- package/angular/src/controls/property-grid/property-grid.component.d.ts +5 -1
- package/angular/src/controls/settings/settings.component.d.ts +9 -0
- package/e2e/assets/strings/cs-CZ/strings.json +1 -1
- package/e2e/assets/strings/de-DE/strings.json +1 -1
- package/e2e/assets/strings/es-ES/strings.json +1 -1
- package/e2e/assets/strings/fr-FR/strings.json +1 -1
- package/e2e/assets/strings/hu-HU/strings.json +1 -1
- package/e2e/assets/strings/it-IT/strings.json +1 -1
- package/e2e/assets/strings/ja-JP/strings.json +1 -1
- package/e2e/assets/strings/ko-KR/strings.json +1 -1
- package/e2e/assets/strings/nl-NL/strings.json +1 -1
- package/e2e/assets/strings/pl-PL/strings.json +1 -1
- package/e2e/assets/strings/pt-BR/strings.json +1 -1
- package/e2e/assets/strings/pt-PT/strings.json +1 -1
- package/e2e/assets/strings/ru-RU/strings.json +1 -1
- package/e2e/assets/strings/strings.json +1 -1
- package/e2e/assets/strings/sv-SE/strings.json +1 -1
- package/e2e/assets/strings/tr-TR/strings.json +1 -1
- package/e2e/assets/strings/zh-CN/strings.json +1 -1
- package/e2e/assets/strings/zh-TW/strings.json +1 -1
- package/package.json +1 -1
- package/styles/css/main-v2.css +1 -1
|
@@ -1,8 +1,16 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
1
2
|
import { Component, ContentChildren, EventEmitter, Inject, Injector, Input, Output, QueryList } from '@angular/core';
|
|
3
|
+
import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators';
|
|
4
|
+
import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator';
|
|
5
|
+
import { LogLevel } from '@microsoft/windows-admin-center-sdk/core/diagnostics/log-level';
|
|
6
|
+
import { Logging } from '@microsoft/windows-admin-center-sdk/core/diagnostics/logging';
|
|
2
7
|
import { CoreBaseComponent } from '../common/base.component';
|
|
3
8
|
import { SME_LAYOUT_PROVIDER } from '../common/layout';
|
|
9
|
+
import { SmeResponsiveWindowBreakpoints } from '../common/sme-responsive-window-manager.component';
|
|
10
|
+
import { LayoutDrivenType, LayoutItemConfigMode, LayoutItemConfigPropertyWidthType } from './layout-config';
|
|
4
11
|
import { LayoutDefinitionComponent } from './layout-definition.component';
|
|
5
12
|
import { LayoutItemComponent } from './layout-item.component';
|
|
13
|
+
import { LayoutResponsiveWindowManager } from './layout-responsive-window-manager';
|
|
6
14
|
import * as i0 from "@angular/core";
|
|
7
15
|
const _c0 = [[["sme-layout-item"]]];
|
|
8
16
|
const _c1 = ["sme-layout-item"];
|
|
@@ -12,18 +20,64 @@ const _c1 = ["sme-layout-item"];
|
|
|
12
20
|
export class LayoutComponent extends CoreBaseComponent {
|
|
13
21
|
constructor(injector, layout) {
|
|
14
22
|
super(injector);
|
|
15
|
-
|
|
23
|
+
/**
|
|
24
|
+
* The default horizontal space in between layout items.
|
|
25
|
+
*/
|
|
16
26
|
this.itemHorizontalSpace = 32;
|
|
27
|
+
/**
|
|
28
|
+
* The default vertical space in between layout items.
|
|
29
|
+
*/
|
|
17
30
|
this.itemVerticalSpace = 32;
|
|
31
|
+
/**
|
|
32
|
+
* If true, will always try to fill the whole row for each layout item.
|
|
33
|
+
*/
|
|
18
34
|
this.tryToFillWholeRow = true;
|
|
35
|
+
/**
|
|
36
|
+
* The layout definition.
|
|
37
|
+
*/
|
|
19
38
|
this.definition = {};
|
|
39
|
+
/**
|
|
40
|
+
* If false, it will not assign extra paddings to the right for the last layout item.
|
|
41
|
+
*/
|
|
20
42
|
this.padLastItem = false;
|
|
43
|
+
/**
|
|
44
|
+
* If true, not extra right padding when there is only one item that uses the whole width of the row.
|
|
45
|
+
*/
|
|
21
46
|
this.noExtraRightPaddingOneItemPerRow = true;
|
|
47
|
+
/**
|
|
48
|
+
* It determines whether the layout is for settings where it contains a left and right layout item.
|
|
49
|
+
* If true, will apply special design for settings layout.
|
|
50
|
+
* On phone-up, the left side navigation layout item will be using a fixed width by default 300px,
|
|
51
|
+
* the right side layout item will be using the remaining width by default.
|
|
52
|
+
*
|
|
53
|
+
* On phone-down or 400% zoom, nothing is different from the regular settings page,
|
|
54
|
+
* the left right layout will be transformed to top bottom layout.
|
|
55
|
+
*/
|
|
56
|
+
this.layoutConfig = {
|
|
57
|
+
[SmeResponsiveWindowBreakpoints.PhoneUp]: { 'mode': LayoutItemConfigMode.Default },
|
|
58
|
+
[SmeResponsiveWindowBreakpoints.PhoneDown]: { 'mode': LayoutItemConfigMode.Default },
|
|
59
|
+
[SmeResponsiveWindowBreakpoints.Reflow]: { 'mode': LayoutItemConfigMode.Default }
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Implementation of the Layout interface
|
|
63
|
+
*/
|
|
22
64
|
this.layoutChanged = new EventEmitter();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Implementation of the Layout interface
|
|
67
|
+
*/
|
|
68
|
+
this.windowBreakpointChanged = new EventEmitter();
|
|
69
|
+
this.columnCount = 1;
|
|
70
|
+
this.columnSpanTotal = 0;
|
|
71
|
+
this.layoutDrivenType = LayoutDrivenType.Default;
|
|
72
|
+
this.stylePixel = 'px';
|
|
73
|
+
if (layout) {
|
|
74
|
+
this.layoutResponsiveWindowManager = new LayoutResponsiveWindowManager(layout);
|
|
75
|
+
// on parent layout changes, re-emit the layout change to our event
|
|
76
|
+
this.subscriptions.push(layout.layoutChanged.subscribe((() => this.onLayoutChanged())));
|
|
77
|
+
// on window break point changes, emit the event about critical classes and styling updates signal.
|
|
78
|
+
this.subscriptions.push(layout.windowBreakpointChanged.subscribe(() => this.onWindowBreakpointChanged()));
|
|
79
|
+
this.deferredOnLayoutChanged();
|
|
80
|
+
}
|
|
27
81
|
}
|
|
28
82
|
/**
|
|
29
83
|
* The source name to use for logging
|
|
@@ -34,15 +88,48 @@ export class LayoutComponent extends CoreBaseComponent {
|
|
|
34
88
|
get currentLayoutDefinitionName() {
|
|
35
89
|
return this.currentLayoutDefinition ? this.currentLayoutDefinition.name : '';
|
|
36
90
|
}
|
|
91
|
+
get currentLayoutDrivenType() {
|
|
92
|
+
return this.layoutDrivenType;
|
|
93
|
+
}
|
|
94
|
+
get currentWindowBreakpoint() {
|
|
95
|
+
var _a;
|
|
96
|
+
return (_a = this.layoutResponsiveWindowManager) === null || _a === void 0 ? void 0 : _a.prevSize.size;
|
|
97
|
+
}
|
|
98
|
+
get currentLayoutItems() {
|
|
99
|
+
return this.layoutItems;
|
|
100
|
+
}
|
|
37
101
|
ngAfterViewInit() {
|
|
38
102
|
this.subscriptions.push(this.layoutItems.changes.subscribe(() => this.onLayoutChanged()));
|
|
39
103
|
}
|
|
104
|
+
/**
|
|
105
|
+
* The open API for refreshing the control externally.
|
|
106
|
+
*/
|
|
107
|
+
refresh() {
|
|
108
|
+
this.resetFlex();
|
|
109
|
+
this.onLayoutChanged();
|
|
110
|
+
}
|
|
40
111
|
/**
|
|
41
112
|
* On layout changed event handler, occurs every time the layout has been changed.
|
|
42
113
|
*/
|
|
43
114
|
onLayoutChanged() {
|
|
44
115
|
this.updateLayout();
|
|
45
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* The deferred layout changed handler.
|
|
119
|
+
*/
|
|
120
|
+
deferredOnLayoutChanged() {
|
|
121
|
+
this.onLayoutChanged();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The on window breakpoint changed handler.
|
|
125
|
+
* Adding yield for component to get ElementRef after initialization.
|
|
126
|
+
*/
|
|
127
|
+
onWindowBreakpointChanged() {
|
|
128
|
+
if (!this.layoutItems || !this.layoutItems.toArray()) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.layoutResponsiveWindowManager.onWindowSizeChanged();
|
|
132
|
+
}
|
|
46
133
|
// Adds classes listed to the root component
|
|
47
134
|
// On phone down the flex start needs to be flex start to make sure no extra space being generated.
|
|
48
135
|
getInitialHostClasses() {
|
|
@@ -52,83 +139,307 @@ export class LayoutComponent extends CoreBaseComponent {
|
|
|
52
139
|
}
|
|
53
140
|
updateLayout() {
|
|
54
141
|
setTimeout(() => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
142
|
+
if (!this.layoutItems) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const layoutItems = this.layoutItems.toArray();
|
|
146
|
+
this.getTotalColumnSpan(layoutItems);
|
|
147
|
+
const currentWindowSize = this.layoutResponsiveWindowManager.prevSize.size;
|
|
148
|
+
this.updateLayoutConfig(currentWindowSize);
|
|
149
|
+
const layoutWidth = this.hostElement.nativeElement.clientWidth || Number.MAX_VALUE;
|
|
150
|
+
if (this.layoutDrivenType === LayoutDrivenType.Default) {
|
|
62
151
|
const definitions = this.definitions.toArray().sort((a, b) => a.until - b.until);
|
|
63
152
|
const previousLayoutDefinition = this.currentLayoutDefinition;
|
|
64
|
-
this.
|
|
65
|
-
for (let i = definitions.length - 1; i >= 0; i--) {
|
|
66
|
-
const definitionColumns = definitions[i].columns;
|
|
67
|
-
if (layoutWidth <= definitions[i].until || (this.tryToFillWholeRow && columnSpanTotal <= definitionColumns)) {
|
|
68
|
-
columnCount = definitionColumns;
|
|
69
|
-
this.currentLayoutDefinition = definitions[i];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
153
|
+
this.updateCurrentLayoutDefinition(definitions, layoutWidth);
|
|
72
154
|
const itemHorizontalSpacePercentage = Math.round(this.itemHorizontalSpace * 100 / layoutWidth);
|
|
73
155
|
const columnCountModifier = this.padLastItem ? 0 : 1;
|
|
74
|
-
const availableLayoutWidthPercentage = 100 - itemHorizontalSpacePercentage * (columnCount - columnCountModifier);
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
156
|
+
const availableLayoutWidthPercentage = 100 - itemHorizontalSpacePercentage * (this.columnCount - columnCountModifier);
|
|
157
|
+
this.layoutDefinitionWithColumnSpanCalculation(layoutItems, availableLayoutWidthPercentage, itemHorizontalSpacePercentage);
|
|
158
|
+
if (previousLayoutDefinition !== this.currentLayoutDefinition) {
|
|
159
|
+
setTimeout(() => {
|
|
160
|
+
this.layoutChanged.emit();
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (this.layoutDrivenType === LayoutDrivenType.ResponsiveWindowManager) {
|
|
165
|
+
let availableLayoutWidthInPixel = layoutWidth - this.itemHorizontalSpace;
|
|
166
|
+
availableLayoutWidthInPixel = availableLayoutWidthInPixel > 0 ? availableLayoutWidthInPixel : 0;
|
|
167
|
+
if (availableLayoutWidthInPixel <= 0) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
this.configDrivenCalculation(layoutItems, availableLayoutWidthInPixel);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
updateLayoutConfig(currentWindowSize) {
|
|
175
|
+
if (!currentWindowSize) {
|
|
176
|
+
this.layoutDrivenType = LayoutDrivenType.Default;
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const phoneUp = this.layoutConfig.PhoneUp;
|
|
180
|
+
const phoneDown = this.layoutConfig.PhoneDown;
|
|
181
|
+
const reflow = this.layoutConfig.Reflow;
|
|
182
|
+
if (!phoneUp || !phoneDown || !reflow) {
|
|
183
|
+
Logging.log({
|
|
184
|
+
level: LogLevel.Debug,
|
|
185
|
+
message: 'Invalid layout config has been passed in',
|
|
186
|
+
source: 'DataTableComponent.onContentTablePressed'
|
|
187
|
+
});
|
|
188
|
+
const defaultMode = { 'mode': LayoutItemConfigMode.Default };
|
|
189
|
+
if (!phoneUp) {
|
|
190
|
+
this.layoutConfig.PhoneUp = defaultMode;
|
|
191
|
+
}
|
|
192
|
+
if (!phoneDown) {
|
|
193
|
+
this.layoutConfig.PhoneDown = defaultMode;
|
|
194
|
+
}
|
|
195
|
+
if (!reflow) {
|
|
196
|
+
this.layoutConfig.Reflow = defaultMode;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
const currentConfig = this.layoutConfig[currentWindowSize];
|
|
200
|
+
if (currentConfig.mode === LayoutItemConfigMode.Default) {
|
|
201
|
+
this.setLayoutDrivenType(LayoutDrivenType.Default);
|
|
202
|
+
}
|
|
203
|
+
else if (currentConfig.mode === LayoutItemConfigMode.Custom && currentConfig.config && currentConfig.config.length) {
|
|
204
|
+
this.setLayoutDrivenType(LayoutDrivenType.ResponsiveWindowManager);
|
|
205
|
+
this.currentLayoutItemConfig = currentConfig.config;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
resetFlex() {
|
|
209
|
+
const layoutItems = this.layoutItems.toArray();
|
|
210
|
+
for (let i = 0; i < layoutItems.length; i++) {
|
|
211
|
+
const layoutItem = layoutItems[i];
|
|
212
|
+
if (layoutItem.flex) {
|
|
213
|
+
layoutItem.flex = undefined;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
setLayoutDrivenType(layoutDrivenType) {
|
|
218
|
+
if (this.layoutDrivenType === LayoutDrivenType.ResponsiveWindowManager && layoutDrivenType === LayoutDrivenType.Default) {
|
|
219
|
+
this.resetFlex();
|
|
220
|
+
}
|
|
221
|
+
this.layoutDrivenType = layoutDrivenType;
|
|
222
|
+
}
|
|
223
|
+
getTotalColumnSpan(layoutItems) {
|
|
224
|
+
this.columnSpanTotal = 0;
|
|
225
|
+
layoutItems.forEach(item => this.columnSpanTotal += item.columnSpan);
|
|
226
|
+
}
|
|
227
|
+
updateCurrentLayoutDefinition(definitions, layoutWidth) {
|
|
228
|
+
this.currentLayoutDefinition = undefined;
|
|
229
|
+
for (let i = definitions.length - 1; i >= 0; i--) {
|
|
230
|
+
const definitionColumns = definitions[i].columns;
|
|
231
|
+
if (layoutWidth <= definitions[i].until || (this.tryToFillWholeRow && this.columnSpanTotal <= definitionColumns)) {
|
|
232
|
+
this.columnCount = definitionColumns;
|
|
233
|
+
this.currentLayoutDefinition = definitions[i];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
layoutDefinitionWithColumnSpanCalculation(layoutItems, availableLayoutWidthPercentage, itemHorizontalSpacePercentage) {
|
|
238
|
+
var _a;
|
|
239
|
+
let percentageSoFar = 0;
|
|
240
|
+
let columnIndex = 0;
|
|
241
|
+
for (let i = 0; i < layoutItems.length; i++) {
|
|
242
|
+
let percentage = 0;
|
|
243
|
+
columnIndex += layoutItems[i].columnSpan;
|
|
244
|
+
if (columnIndex === this.columnCount) {
|
|
245
|
+
// If true, it means this layout item is the last one in the row.
|
|
246
|
+
// It ensures the last one in the row use rest of the percentage.
|
|
247
|
+
// Example: If it's a 3 column layout, the last one's percentage is 33.34%, not 33.33%
|
|
248
|
+
percentage = 100 - percentageSoFar;
|
|
249
|
+
percentageSoFar = 0;
|
|
250
|
+
// 1 column and 1 layout item.
|
|
251
|
+
if (columnIndex === 1 && this.columnCount === 1 && !this.noExtraRightPaddingOneItemPerRow) {
|
|
252
|
+
layoutItems[i].paddingRight = '0px';
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
layoutItems[i].paddingRight = this.padLastItem ? this.itemHorizontalSpace + this.stylePixel : '0' + this.stylePixel;
|
|
256
|
+
}
|
|
257
|
+
columnIndex = 0;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const columnPercentage = Math.round(availableLayoutWidthPercentage * 100 / this.columnCount) / 100;
|
|
261
|
+
percentage = layoutItems[i].columnSpan * (columnPercentage + itemHorizontalSpacePercentage);
|
|
262
|
+
percentageSoFar += percentage;
|
|
263
|
+
if (percentageSoFar > 100) {
|
|
264
|
+
// put item on next row if it is too big
|
|
265
|
+
if (percentage > 100) {
|
|
266
|
+
percentage = 100;
|
|
267
|
+
}
|
|
268
|
+
percentageSoFar = 0;
|
|
269
|
+
columnIndex = 0;
|
|
270
|
+
layoutItems[i].paddingRight = this.padLastItem ? this.itemHorizontalSpace + this.stylePixel : '0' + this.stylePixel;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
layoutItems[i].paddingRight = this.itemHorizontalSpace + this.stylePixel;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if ((_a = this === null || this === void 0 ? void 0 : this.currentLayoutDefinition) === null || _a === void 0 ? void 0 : _a.addBottomPadding) {
|
|
277
|
+
layoutItems[i].paddingBottom = this.itemVerticalSpace + this.stylePixel;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
// If bottom padding already exists and currentLayoutDefinition.addBottomPadding is False
|
|
281
|
+
// Remove the bottom padding.
|
|
282
|
+
if (layoutItems[i].paddingBottom === this.itemVerticalSpace + this.stylePixel) {
|
|
283
|
+
layoutItems[i].paddingBottom = '0' + this.stylePixel;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
layoutItems[i].width = percentage + '%';
|
|
287
|
+
layoutItems[i].ready();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
configDrivenCalculation(layoutItems, availableLayoutWidthInPixel) {
|
|
291
|
+
const isHybridMode = this.updateCustomConfig(layoutItems);
|
|
292
|
+
if (isHybridMode) {
|
|
293
|
+
this.configDrivenCalculationHybrid(layoutItems, availableLayoutWidthInPixel);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
this.configDrivenCalculationDefault(layoutItems, availableLayoutWidthInPixel);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* It deal with configurations that only has either percentage or number.
|
|
301
|
+
* Aiming at performance optimization.
|
|
302
|
+
*
|
|
303
|
+
* @param layoutItems The layout item object array
|
|
304
|
+
* @param availableLayoutWidthInPixel available width in pixel horizontally.
|
|
305
|
+
*/
|
|
306
|
+
configDrivenCalculationDefault(layoutItems, availableLayoutWidthInPixel) {
|
|
307
|
+
const defaultWidthForLayoutItemInPixel = 200;
|
|
308
|
+
let widthUsedInPixel = 0;
|
|
309
|
+
let percentageSoFar = 0;
|
|
310
|
+
for (let i = 0; i < layoutItems.length; i++) {
|
|
311
|
+
if (layoutItems[i].customConfig.width) {
|
|
312
|
+
const widthObject = layoutItems[i].customConfig.width;
|
|
313
|
+
const remainingWidthInPixel = availableLayoutWidthInPixel - widthUsedInPixel;
|
|
314
|
+
if (widthObject.type === LayoutItemConfigPropertyWidthType.Percentage) {
|
|
315
|
+
if (widthObject.value > 100 || widthObject.value < 0) {
|
|
316
|
+
widthObject.value = 100;
|
|
317
|
+
}
|
|
318
|
+
const percentage = widthObject.value;
|
|
319
|
+
percentageSoFar += percentage;
|
|
320
|
+
const paddingRight = this.itemHorizontalSpace;
|
|
321
|
+
layoutItems[i].paddingRight = paddingRight.toString().concat(this.stylePixel);
|
|
322
|
+
layoutItems[i].width = percentage + '%';
|
|
323
|
+
if (percentageSoFar > 100) {
|
|
85
324
|
percentageSoFar = 0;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else if (widthObject.type === LayoutItemConfigPropertyWidthType.Number) {
|
|
328
|
+
if (widthObject.value < 0) {
|
|
329
|
+
widthObject.value =
|
|
330
|
+
defaultWidthForLayoutItemInPixel <= remainingWidthInPixel ?
|
|
331
|
+
defaultWidthForLayoutItemInPixel : remainingWidthInPixel;
|
|
332
|
+
}
|
|
333
|
+
widthUsedInPixel += widthObject.value;
|
|
334
|
+
// how to determine if it is the last item in a row?
|
|
335
|
+
const paddingRight = this.itemHorizontalSpace;
|
|
336
|
+
widthUsedInPixel += paddingRight;
|
|
337
|
+
layoutItems[i].paddingRight = paddingRight.toString().concat(this.stylePixel);
|
|
338
|
+
layoutItems[i].width = widthObject.value + this.stylePixel;
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
Logging.log({
|
|
342
|
+
level: LogLevel.Debug,
|
|
343
|
+
message: 'Invalid width',
|
|
344
|
+
source: 'LayoutComponent.configDrivenCalculationDefault'
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
Logging.log({
|
|
350
|
+
level: LogLevel.Debug,
|
|
351
|
+
message: 'Invalid width',
|
|
352
|
+
source: 'LayoutComponent.configDrivenCalculationDefault'
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
layoutItems[i].ready();
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* It deal with configurations that only has both percentage and number.
|
|
360
|
+
* Aiming at performance optimization.
|
|
361
|
+
*
|
|
362
|
+
* @param layoutItems The layout item object array
|
|
363
|
+
* @param availableLayoutWidthInPixel available width in pixel horizontally.
|
|
364
|
+
*/
|
|
365
|
+
configDrivenCalculationHybrid(layoutItems, availableLayoutWidthInPixel) {
|
|
366
|
+
const defaultWidthForLayoutItemInPixel = 200;
|
|
367
|
+
let widthUsedInPixel = 0;
|
|
368
|
+
for (let i = 0; i < layoutItems.length; i++) {
|
|
369
|
+
if (layoutItems[i].customConfig.width) {
|
|
370
|
+
const widthObject = layoutItems[i].customConfig.width;
|
|
371
|
+
const remainingWidthInPixel = availableLayoutWidthInPixel - widthUsedInPixel;
|
|
372
|
+
if (widthObject.type === LayoutItemConfigPropertyWidthType.Percentage) {
|
|
373
|
+
if (widthObject.value > 100 || widthObject.value < 0) {
|
|
374
|
+
widthObject.value = 100;
|
|
375
|
+
}
|
|
376
|
+
// how to determine if it is the last item in a row?
|
|
377
|
+
const paddingRight = this.itemHorizontalSpace;
|
|
378
|
+
widthUsedInPixel += paddingRight;
|
|
379
|
+
layoutItems[i].paddingRight = paddingRight.toString().concat(this.stylePixel);
|
|
380
|
+
let potentialWidthInPixel = (widthObject.value / 100) * remainingWidthInPixel;
|
|
381
|
+
if (potentialWidthInPixel === 0) {
|
|
382
|
+
widthUsedInPixel = 0;
|
|
383
|
+
widthUsedInPixel += paddingRight;
|
|
384
|
+
potentialWidthInPixel = (widthObject.value / 100) * (availableLayoutWidthInPixel - widthUsedInPixel);
|
|
94
385
|
}
|
|
95
386
|
else {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
// put item on next row if it is too big
|
|
101
|
-
if (percentage > 100) {
|
|
102
|
-
percentage = 100;
|
|
103
|
-
}
|
|
104
|
-
percentageSoFar = 0;
|
|
105
|
-
columnIndex = 0;
|
|
106
|
-
layoutItems[i].paddingRight = this.padLastItem ? this.itemHorizontalSpace + 'px' : '0px';
|
|
387
|
+
if (potentialWidthInPixel >= remainingWidthInPixel) {
|
|
388
|
+
potentialWidthInPixel = remainingWidthInPixel;
|
|
389
|
+
// resets the used pixel for a new row.
|
|
390
|
+
widthUsedInPixel = 0;
|
|
107
391
|
}
|
|
108
392
|
else {
|
|
109
|
-
|
|
393
|
+
widthUsedInPixel += potentialWidthInPixel;
|
|
110
394
|
}
|
|
395
|
+
layoutItems[i].flex = '1 0 0';
|
|
396
|
+
layoutItems[i].minWidth = defaultWidthForLayoutItemInPixel.toString().concat(this.stylePixel);
|
|
111
397
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
layoutItems[i].paddingBottom = 0 + 'px';
|
|
120
|
-
}
|
|
398
|
+
layoutItems[i].width = potentialWidthInPixel + this.stylePixel;
|
|
399
|
+
}
|
|
400
|
+
else if (widthObject.type === LayoutItemConfigPropertyWidthType.Number) {
|
|
401
|
+
if (widthObject.value < 0) {
|
|
402
|
+
widthObject.value =
|
|
403
|
+
defaultWidthForLayoutItemInPixel <= remainingWidthInPixel ?
|
|
404
|
+
defaultWidthForLayoutItemInPixel : remainingWidthInPixel;
|
|
121
405
|
}
|
|
122
|
-
|
|
123
|
-
|
|
406
|
+
widthUsedInPixel += widthObject.value;
|
|
407
|
+
// how to determine if it is the last item in a row?
|
|
408
|
+
const paddingRight = this.itemHorizontalSpace;
|
|
409
|
+
widthUsedInPixel += paddingRight;
|
|
410
|
+
layoutItems[i].paddingRight = paddingRight.toString().concat(this.stylePixel);
|
|
411
|
+
layoutItems[i].width = widthObject.value + this.stylePixel;
|
|
124
412
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
413
|
+
else {
|
|
414
|
+
Logging.log({
|
|
415
|
+
level: LogLevel.Debug,
|
|
416
|
+
message: 'Invalid width',
|
|
417
|
+
source: 'LayoutComponent.configDrivenCalculationHybrid'
|
|
128
418
|
});
|
|
129
419
|
}
|
|
130
420
|
}
|
|
131
|
-
|
|
421
|
+
else {
|
|
422
|
+
Logging.log({
|
|
423
|
+
level: LogLevel.Debug,
|
|
424
|
+
message: 'Invalid width',
|
|
425
|
+
source: 'LayoutComponent.configDrivenCalculationHybrid'
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
layoutItems[i].ready();
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
updateCustomConfig(layoutItems) {
|
|
432
|
+
const widthType = [];
|
|
433
|
+
for (let i = 0; i < layoutItems.length; i++) {
|
|
434
|
+
layoutItems[i].customConfig = this.currentLayoutItemConfig[i];
|
|
435
|
+
if (!widthType.includes(layoutItems[i].customConfig.width.type)) {
|
|
436
|
+
widthType.push(layoutItems[i].customConfig.width.type);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
if (widthType.length <= 1) {
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
return true;
|
|
132
443
|
}
|
|
133
444
|
}
|
|
134
445
|
/** @nocollapse */ LayoutComponent.ɵfac = function LayoutComponent_Factory(t) { return new (t || LayoutComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(SME_LAYOUT_PROVIDER)); };
|
|
@@ -139,10 +450,28 @@ export class LayoutComponent extends CoreBaseComponent {
|
|
|
139
450
|
let _t;
|
|
140
451
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.layoutItems = _t);
|
|
141
452
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.definitions = _t);
|
|
142
|
-
} }, inputs: { itemHorizontalSpace: "itemHorizontalSpace", itemVerticalSpace: "itemVerticalSpace", tryToFillWholeRow: "tryToFillWholeRow", definition: "definition", padLastItem: "padLastItem", noExtraRightPaddingOneItemPerRow: "noExtraRightPaddingOneItemPerRow" }, outputs: { layoutChanged: "layoutChanged" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 1, vars: 0, template: function LayoutComponent_Template(rf, ctx) { if (rf & 1) {
|
|
453
|
+
} }, inputs: { itemHorizontalSpace: "itemHorizontalSpace", itemVerticalSpace: "itemVerticalSpace", tryToFillWholeRow: "tryToFillWholeRow", definition: "definition", padLastItem: "padLastItem", noExtraRightPaddingOneItemPerRow: "noExtraRightPaddingOneItemPerRow", layoutConfig: "layoutConfig" }, outputs: { layoutChanged: "layoutChanged", windowBreakpointChanged: "windowBreakpointChanged" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 1, vars: 0, template: function LayoutComponent_Template(rf, ctx) { if (rf & 1) {
|
|
143
454
|
i0.ɵɵprojectionDef(_c0);
|
|
144
455
|
i0.ɵɵprojection(0);
|
|
145
456
|
} }, encapsulation: 2 });
|
|
457
|
+
__decorate([
|
|
458
|
+
Debounce(),
|
|
459
|
+
__metadata("design:type", Function),
|
|
460
|
+
__metadata("design:paramtypes", []),
|
|
461
|
+
__metadata("design:returntype", void 0)
|
|
462
|
+
], LayoutComponent.prototype, "refresh", null);
|
|
463
|
+
__decorate([
|
|
464
|
+
Debounce(),
|
|
465
|
+
__metadata("design:type", Function),
|
|
466
|
+
__metadata("design:paramtypes", []),
|
|
467
|
+
__metadata("design:returntype", void 0)
|
|
468
|
+
], LayoutComponent.prototype, "deferredOnLayoutChanged", null);
|
|
469
|
+
__decorate([
|
|
470
|
+
Yield(),
|
|
471
|
+
__metadata("design:type", Function),
|
|
472
|
+
__metadata("design:paramtypes", []),
|
|
473
|
+
__metadata("design:returntype", void 0)
|
|
474
|
+
], LayoutComponent.prototype, "onWindowBreakpointChanged", null);
|
|
146
475
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LayoutComponent, [{
|
|
147
476
|
type: Component,
|
|
148
477
|
args: [{
|
|
@@ -170,7 +499,11 @@ export class LayoutComponent extends CoreBaseComponent {
|
|
|
170
499
|
type: Input
|
|
171
500
|
}], noExtraRightPaddingOneItemPerRow: [{
|
|
172
501
|
type: Input
|
|
502
|
+
}], layoutConfig: [{
|
|
503
|
+
type: Input
|
|
173
504
|
}], layoutChanged: [{
|
|
174
505
|
type: Output
|
|
175
|
-
}]
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2xheW91dC9sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvbGF5b3V0L2xheW91dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEksT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDMUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7QUFFOUQ7O0dBRUc7QUFLSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxpQkFBaUI7SUF5Q2xELFlBQVksUUFBa0IsRUFBdUMsTUFBYztRQUMvRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFEaUQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXhCNUUsd0JBQW1CLEdBQUcsRUFBRSxDQUFDO1FBR3pCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUd2QixzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFHekIsZUFBVSxHQUE0RSxFQUFFLENBQUM7UUFHekYsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFHcEIscUNBQWdDLEdBQUcsSUFBSSxDQUFDO1FBR3hDLGtCQUFhLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFRaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJ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LFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDMUI7Z0JBRUQsSUFBSSx3QkFBd0IsS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQzNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLENBQUM7aUJBQ047YUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7aUdBdkpRLGVBQWUsMERBeUNnQixtQkFBbUI7dUVBekNsRCxlQUFlO29DQVFQLG1CQUFtQjtvQ0FHbkIseUJBQXlCOzs7Ozs7O1FDeEI5QyxrQkFBa0Q7O3VGRGFyQyxlQUFlO2NBSjNCLFNBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsV0FBVyxFQUFFLHlCQUF5QjthQUN6Qzs7c0JBMENvQyxNQUFNO3VCQUFDLG1CQUFtQjt3QkFoQ25ELFdBQVc7a0JBRGxCLGVBQWU7bUJBQUMsbUJBQW1CO1lBSTVCLFdBQVc7a0JBRGxCLGVBQWU7bUJBQUMseUJBQXlCO1lBTW5DLG1CQUFtQjtrQkFEekIsS0FBSztZQUlDLGlCQUFpQjtrQkFEdkIsS0FBSztZQUlDLGlCQUFpQjtrQkFEdkIsS0FBSztZQUlDLFVBQVU7a0JBRGhCLEtBQUs7WUFJQyxXQUFXO2tCQURqQixLQUFLO1lBSUMsZ0NBQWdDO2tCQUR0QyxLQUFLO1lBSUMsYUFBYTtrQkFEbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPdXRwdXQsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dCwgU01FX0xBWU9VVF9QUk9WSURFUiB9IGZyb20gJy4uL2NvbW1vbi9sYXlvdXQnO1xyXG5pbXBvcnQgeyBMYXlvdXREZWZpbml0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtZGVmaW5pdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYXlvdXRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtaXRlbS5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIExheW91dCBjb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtbGF5b3V0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9sYXlvdXQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMYXlvdXRDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ0xheW91dENvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZHJlbihMYXlvdXRJdGVtQ29tcG9uZW50KVxyXG4gICAgcHJpdmF0ZSBsYXlvdXRJdGVtczogUXVlcnlMaXN0PExheW91dEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oTGF5b3V0RGVmaW5pdGlvbkNvbXBvbmVudClcclxuICAgIHByaXZhdGUgZGVmaW5pdGlvbnM6IFF1ZXJ5TGlzdDxMYXlvdXREZWZpbml0aW9uQ29tcG9uZW50PjtcclxuXHJcbiAgICBwdWJsaWMgY3VycmVudExheW91dERlZmluaXRpb246IExheW91dERlZmluaXRpb25Db21wb25lbnQ7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpdGVtSG9yaXpvbnRhbFNwYWNlID0gMzI7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpdGVtVmVydGljYWxTcGFjZSA9IDMyO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdHJ5VG9GaWxsV2hvbGVSb3cgPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmaW5pdGlvbjogeyBbY29sdW1uQ291bnQ6IG51bWJlcl06IHsgbG93ZXJXaWR0aD86IG51bWJlciwgdXBwZXJXaWR0aD86IG51bWJlciB9IH0gPSB7fTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHBhZExhc3RJdGVtID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBub0V4dHJhUmlnaHRQYWRkaW5nT25lSXRlbVBlclJvdyA9IHRydWU7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgbGF5b3V0Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgY3VycmVudExheW91dERlZmluaXRpb25OYW1lKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24gPyB0aGlzLmN1cnJlbnRMYXlvdXREZWZpbml0aW9uLm5hbWUgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsIEBJbmplY3QoU01FX0xBWU9VVF9QUk9WSURFUikgcHJpdmF0ZSBsYXlvdXQ6IExheW91dCkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dC5sYXlvdXRDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpKSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTGF5b3V0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmxheW91dEl0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMub25MYXlvdXRDaGFuZ2VkKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9uIGxheW91dCBjaGFuZ2VkIGV2ZW50IGhhbmRsZXIsIG9jY3VycyBldmVyeSB0aW1lIHRoZSBsYXlvdXQgaGFzIGJlZW4gY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTGF5b3V0Q2hhbmdlZCgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZHMgY2xhc3NlcyBsaXN0ZWQgdG8gdGhlIHJvb3QgY29tcG9uZW50XHJcbiAgICAvLyBPbiBwaG9uZSBkb3duIHRoZSBmbGV4IHN0YXJ0IG5lZWRzIHRvIGJlIGZsZXggc3RhcnQgdG8gbWFrZSBzdXJlIG5vIGV4dHJhIHNwYWNlIGJlaW5nIGdlbmVyYXRlZC5cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtYXJyYW5nZS13cmFwc3RhY2staCcsICdzbWUtbGF5b3V0LXBob25lLWRvd24nXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUxheW91dCgpOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0SXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dFdpZHRoID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIHx8IE51bWJlci5NQVhfVkFMVUU7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uQ291bnQgPSAxO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dEl0ZW1zID0gdGhpcy5sYXlvdXRJdGVtcy50b0FycmF5KCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29sdW1uU3BhblRvdGFsID0gMDtcclxuICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zLmZvckVhY2goaXRlbSA9PiBjb2x1bW5TcGFuVG90YWwgKz0gaXRlbS5jb2x1bW5TcGFuKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZpbml0aW9ucyA9IHRoaXMuZGVmaW5pdGlvbnMudG9BcnJheSgpLnNvcnQoKGEsIGIpID0+IGEudW50aWwgLSBiLnVudGlsKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0xheW91dERlZmluaXRpb24gPSB0aGlzLmN1cnJlbnRMYXlvdXREZWZpbml0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGF5b3V0RGVmaW5pdGlvbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBkZWZpbml0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmluaXRpb25Db2x1bW5zID0gZGVmaW5pdGlvbnNbaV0uY29sdW1ucztcclxuICAgICAgICAgICAgICAgICAgICBpZiAobGF5b3V0V2lkdGggPD0gZGVmaW5pdGlvbnNbaV0udW50aWwgfHwgKHRoaXMudHJ5VG9GaWxsV2hvbGVSb3cgJiYgY29sdW1uU3BhblRvdGFsIDw9IGRlZmluaXRpb25Db2x1bW5zKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db3VudCA9IGRlZmluaXRpb25Db2x1bW5zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYXlvdXREZWZpbml0aW9uID0gZGVmaW5pdGlvbnNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Ib3Jpem9udGFsU3BhY2VQZXJjZW50YWdlID0gTWF0aC5yb3VuZCh0aGlzLml0ZW1Ib3Jpem9udGFsU3BhY2UgKiAxMDAgLyBsYXlvdXRXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5Db3VudE1vZGlmaWVyID0gdGhpcy5wYWRMYXN0SXRlbSA/IDAgOiAxO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlTGF5b3V0V2lkdGhQZXJjZW50YWdlID0gMTAwIC0gaXRlbUhvcml6b250YWxTcGFjZVBlcmNlbnRhZ2UgKiAoY29sdW1uQ291bnQgLSBjb2x1bW5Db3VudE1vZGlmaWVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcGVyY2VudGFnZVNvRmFyID0gMDtcclxuICAgICAgICAgICAgICAgIGxldCBjb2x1bW5JbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ICs9IGxheW91dEl0ZW1zW2ldLmNvbHVtblNwYW47XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSBjb2x1bW5Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0cnVlLCBpdCBtZWFucyB0aGlzIGxheW91dCBpdGVtIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBlbnN1cmVzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcm93IHVzZSByZXN0IG9mIHRoZSBwZXJjZW50YWdlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGFtcGxlOiBJZiBpdCdzIGEgMyBjb2x1bW4gbGF5b3V0LCB0aGUgbGFzdCBvbmUncyBwZXJjZW50YWdlIGlzIDMzLjM0JSwgbm90IDMzLjMzJVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwIC0gcGVyY2VudGFnZVNvRmFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlU29GYXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAxIGNvbHVtbiBhbmQgMSBsYXlvdXQgaXRlbS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSAxICYmIGNvbHVtbkNvdW50ID09PSAxICYmICF0aGlzLm5vRXh0cmFSaWdodFBhZGRpbmdPbmVJdGVtUGVyUm93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nUmlnaHQgPSAnMHB4JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdSaWdodCA9IHRoaXMucGFkTGFzdEl0ZW0gPyB0aGlzLml0ZW1Ib3Jpem9udGFsU3BhY2UgKyAncHgnIDogJzBweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtblBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKGF2YWlsYWJsZUxheW91dFdpZHRoUGVyY2VudGFnZSAqIDEwMCAvIGNvbHVtbkNvdW50KSAvIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IGxheW91dEl0ZW1zW2ldLmNvbHVtblNwYW4gKiAoY29sdW1uUGVyY2VudGFnZSArIGl0ZW1Ib3Jpem9udGFsU3BhY2VQZXJjZW50YWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZVNvRmFyICs9IHBlcmNlbnRhZ2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVyY2VudGFnZVNvRmFyID4gMTAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXQgaXRlbSBvbiBuZXh0IHJvdyBpZiBpdCBpcyB0b28gYmlnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlU29GYXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gdGhpcy5wYWRMYXN0SXRlbSA/IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZSArICdweCcgOiAnMHB4JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdSaWdodCA9IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZSArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzPy5jdXJyZW50TGF5b3V0RGVmaW5pdGlvbj8uYWRkQm90dG9tUGFkZGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nQm90dG9tID0gdGhpcy5pdGVtVmVydGljYWxTcGFjZSArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYm90dG9tIHBhZGRpbmcgYWxyZWFkeSBleGlzdHMgYW5kIGN1cnJlbnRMYXlvdXREZWZpbml0aW9uLmFkZEJvdHRvbVBhZGRpbmcgaXMgRmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBib3R0b20gcGFkZGluZy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheW91dEl0ZW1zW2ldLnBhZGRpbmdCb3R0b20gPT09IHRoaXMuaXRlbVZlcnRpY2FsU3BhY2UgKyAncHgnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nQm90dG9tID0gMCArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gcGVyY2VudGFnZSArICclJztcclxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5yZWFkeSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0xheW91dERlZmluaXRpb24gIT09IHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIjxuZy1jb250ZW50IHNlbGVjdD1cInNtZS1sYXlvdXQtaXRlbVwiPjwvbmctY29udGVudD5cclxuIl19
|
|
506
|
+
}], windowBreakpointChanged: [{
|
|
507
|
+
type: Output
|
|
508
|
+
}], refresh: [], deferredOnLayoutChanged: [], onWindowBreakpointChanged: [] }); })();
|
|
509
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2xheW91dC9sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvbGF5b3V0L2xheW91dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BJLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDakcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN2RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQVUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRyxPQUFPLEVBQWtDLGdCQUFnQixFQUFvQixvQkFBb0IsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlKLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7O0FBRW5GOztHQUVHO0FBS0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsaUJBQWlCO0lBZ0hsRCxZQUFZLFFBQWtCLEVBQStCLE1BQWM7UUFDdkUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBeEZwQjs7V0FFRztRQUVJLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUVoQzs7V0FFRztRQUVJLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUU5Qjs7V0FFRztRQUVJLHNCQUFpQixHQUFHLElBQUksQ0FBQztRQUVoQzs7V0FFRztRQUVJLGVBQVUsR0FBNEUsRUFBRSxDQUFDO1FBRWhHOztXQUVHO1FBRUksZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFM0I7O1dBRUc7UUFFSSxxQ0FBZ0MsR0FBRyxJQUFJLENBQUM7UUFFL0M7Ozs7Ozs7O1dBUUc7UUFFSSxpQkFBWSxHQUFpQjtZQUNoQyxDQUFDLDhCQUE4QixDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE9BQU8sRUFBQztZQUNoRixDQUFDLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE9BQU8sRUFBQztZQUNsRixDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE9BQU8sRUFBQztTQUNsRixDQUFDO1FBRUY7O1dBRUc7UUFFSSxrQkFBYSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXBFOztXQUVHO1FBRUksNEJBQXVCLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFFdEUsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFFcEIscUJBQWdCLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1FBRW5DLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFxQi9CLElBQUksTUFBTSxFQUFFO1lBQ1IsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0UsbUVBQW1FO1lBQ25FLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLG1HQUFtRztZQUNuRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUxRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUNsQztJQUVMLENBQUM7SUE1SEQ7O09BRUc7SUFDSCxJQUFjLGFBQWE7UUFDdkIsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0lBMEZELElBQVcsMkJBQTJCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDakYsQ0FBQztJQUVELElBQVcsdUJBQXVCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLHVCQUF1Qjs7UUFDOUIsYUFBTyxJQUFJLENBQUMsNkJBQTZCLDBDQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDN0QsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBaUJNLGVBQWU7UUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVEOztPQUVHO0lBRUksT0FBTztRQUNWLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNsQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBRUssdUJBQXVCO1FBQzNCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBRUkseUJBQXlCO1FBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNsRCxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLG1HQUFtRztJQUN6RixxQkFBcUI7UUFDM0IsT0FBTyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDeEMseUJBQXlCLEVBQUUsdUJBQXVCO1NBQ3JELENBQUMsQ0FBQztJQUNQLENBQUM7SUFFUyxZQUFZO1FBQ2xCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDbkIsT0FBTzthQUNWO1lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFckMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUMzRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUUzQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUNuRixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3BELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pGLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO2dCQUM5RCxJQUFJLENBQUMsNkJBQTZCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUU3RCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQztnQkFDL0YsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckQsTUFBTSw4QkFBOEIsR0FBRyxHQUFHLEdBQUcsNkJBQTZCLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3RILElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxXQUFXLEVBQUUsOEJBQThCLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztnQkFFM0gsSUFBSSx3QkFBd0IsS0FBSyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7b0JBQzNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQ1osSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLENBQUM7aUJBQ047YUFDSjtpQkFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRTtnQkFDM0UsSUFBSSwyQkFBMkIsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO2dCQUN6RSwyQkFBMkIsR0FBRywyQkFBMkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWhHLElBQUksMkJBQTJCLElBQUksQ0FBQyxFQUFFO29CQUNsQyxPQUFPO2lCQUNWO2dCQUVELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsMkJBQTJCLENBQUMsQ0FBQzthQUMxRTtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGtCQUFrQixDQUFDLGlCQUFpRDtRQUN4RSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztZQUNqRCxPQUFPO1NBQ1Y7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUV4QyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ1IsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO2dCQUNyQixPQUFPLEVBQUUsMENBQTBDO2dCQUNuRCxNQUFNLEVBQUUsMENBQTBDO2FBQ3JELENBQUMsQ0FBQztZQUVILE1BQU0sV0FBVyxHQUFHLEVBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE9BQU8sRUFBQyxDQUFDO1lBRTNELElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDO2FBQzNDO1lBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDWixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7YUFDN0M7WUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNULElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQzthQUMxQztTQUNKO1FBRUQsTUFBTSxhQUFhLEdBQXFCLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU3RSxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQU0sb0JBQW9CLENBQUMsT0FBTyxFQUFFO1lBQ3RELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN0RDthQUFNLElBQUksYUFBYSxDQUFDLElBQUksS0FBTSxvQkFBb0IsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDLE1BQU0sSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNuSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNuRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFFTyxTQUFTO1FBQ2IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFO2dCQUNqQixVQUFVLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQzthQUMvQjtTQUNKO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQixDQUFDLGdCQUFrQztRQUMxRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxnQkFBZ0IsQ0FBQyx1QkFBdUIsSUFBSSxnQkFBZ0IsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7WUFDckgsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzdDLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxXQUFrQztRQUN6RCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztRQUN6QixXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVPLDZCQUE2QixDQUNqQyxXQUF3QyxFQUN4QyxXQUFtQjtRQUVuQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QyxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDakQsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLGlCQUFpQixDQUFDLEVBQUU7Z0JBQzlHLElBQUksQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakQ7U0FDSjtJQUNMLENBQUM7SUFFTyx5Q0FBeUMsQ0FDN0MsV0FBa0MsRUFDbEMsOEJBQXNDLEVBQ3RDLDZCQUFxQzs7UUFFckMsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDbkIsV0FBVyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDekMsSUFBSSxXQUFXLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDbEMsaUVBQWlFO2dCQUNqRSxpRUFBaUU7Z0JBQ2pFLHNGQUFzRjtnQkFDdEYsVUFBVSxHQUFHLEdBQUcsR0FBRyxlQUFlLENBQUM7Z0JBQ25DLGVBQWUsR0FBRyxDQUFDLENBQUM7Z0JBQ3BCLDhCQUE4QjtnQkFDOUIsSUFBSSxXQUFXLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFO29CQUN2RixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztpQkFDdkM7cUJBQU07b0JBQ0gsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQ3ZIO2dCQUNELFdBQVcsR0FBRyxDQUFDLENBQUM7YUFDbkI7aUJBQU07Z0JBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDhCQUE4QixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUNuRyxVQUFVLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLGdCQUFnQixHQUFHLDZCQUE2QixDQUFDLENBQUM7Z0JBQzVGLGVBQWUsSUFBSSxVQUFVLENBQUM7Z0JBRTlCLElBQUksZUFBZSxHQUFHLEdBQUcsRUFBRTtvQkFDdkIsd0NBQXdDO29CQUN4QyxJQUFJLFVBQVUsR0FBRyxHQUFHLEVBQUU7d0JBQ2xCLFVBQVUsR0FBRyxHQUFHLENBQUM7cUJBQ3BCO29CQUNELGVBQWUsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLFdBQVcsR0FBRyxDQUFDLENBQUM7b0JBQ2hCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUN2SDtxQkFBTTtvQkFDSCxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUM1RTthQUNKO1lBRUQsVUFBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsdUJBQXVCLDBDQUFFLGdCQUFnQixFQUFFO2dCQUNqRCxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2FBQzNFO2lCQUFNO2dCQUNILHlGQUF5RjtnQkFDekYsNkJBQTZCO2dCQUM3QixJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQzNFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQ3hEO2FBQ0o7WUFFRCxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDeEMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzFCO0lBQ0wsQ0FBQztJQUVPLHVCQUF1QixDQUMzQixXQUFrQyxFQUNsQywyQkFBbUM7UUFFbkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTFELElBQUksWUFBWSxFQUFFO1lBQ2QsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1NBQ2hGO2FBQU07WUFDSCxJQUFJLENBQUMsOEJBQThCLENBQUMsV0FBVyxFQUFFLDJCQUEyQixDQUFDLENBQUM7U0FDakY7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssOEJBQThCLENBQ2xDLFdBQWtDLEVBQ2xDLDJCQUFtQztRQUVuQyxNQUFNLGdDQUFnQyxHQUFHLEdBQUcsQ0FBQztRQUU3QyxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUN6QixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRTtnQkFDbkMsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7Z0JBQ3RELE1BQU0scUJBQXFCLEdBQUcsMkJBQTJCLEdBQUcsZ0JBQWdCLENBQUM7Z0JBRTdFLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxpQ0FBaUMsQ0FBQyxVQUFVLEVBQUU7b0JBQ25FLElBQUksV0FBVyxDQUFDLEtBQUssR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7d0JBQ2xELFdBQVcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO3FCQUMzQjtvQkFFRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO29CQUNyQyxlQUFlLElBQUksVUFBVSxDQUFDO29CQUU5QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7b0JBQzlDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzlFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLEdBQUcsQ0FBQztvQkFFeEMsSUFBSSxlQUFlLEdBQUcsR0FBRyxFQUFFO3dCQUN2QixlQUFlLEdBQUcsQ0FBQyxDQUFDO3FCQUN2QjtpQkFDSjtxQkFBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssaUNBQWlDLENBQUMsTUFBTSxFQUFFO29CQUN0RSxJQUFJLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO3dCQUN2QixXQUFXLENBQUMsS0FBSzs0QkFDYixnQ0FBZ0MsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDO2dDQUN2RCxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7cUJBQ3BFO29CQUVELGdCQUFnQixJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUM7b0JBRXRDLG9EQUFvRDtvQkFDcEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO29CQUM5QyxnQkFBZ0IsSUFBSSxZQUFZLENBQUM7b0JBRWpDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzlFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUM5RDtxQkFBTTtvQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDO3dCQUNSLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSzt3QkFDckIsT0FBTyxFQUFFLGVBQWU7d0JBQ3hCLE1BQU0sRUFBRSxnREFBZ0Q7cUJBQzNELENBQUMsQ0FBQztpQkFDTjthQUNKO2lCQUFNO2dCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUM7b0JBQ1IsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO29CQUNyQixPQUFPLEVBQUUsZUFBZTtvQkFDeEIsTUFBTSxFQUFFLGdEQUFnRDtpQkFDM0QsQ0FBQyxDQUFDO2FBQ047WUFFRCxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssNkJBQTZCLENBQ2pDLFdBQWtDLEVBQ2xDLDJCQUFtQztRQUVuQyxNQUFNLGdDQUFnQyxHQUFHLEdBQUcsQ0FBQztRQUU3QyxJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO2dCQUNuQyxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFDdEQsTUFBTSxxQkFBcUIsR0FBRywyQkFBMkIsR0FBRyxnQkFBZ0IsQ0FBQztnQkFFN0UsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLGlDQUFpQyxDQUFDLFVBQVUsRUFBRTtvQkFDbkUsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTt3QkFDbEQsV0FBVyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7cUJBQzNCO29CQUVELG9EQUFvRDtvQkFDcEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO29CQUM5QyxnQkFBZ0IsSUFBSSxZQUFZLENBQUM7b0JBQ2pDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBRTlFLElBQUkscUJBQXFCLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLHFCQUFxQixDQUFDO29CQUM5RSxJQUFJLHFCQUFxQixLQUFLLENBQUMsRUFBRTt3QkFDN0IsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO3dCQUNyQixnQkFBZ0IsSUFBSSxZQUFZLENBQUM7d0JBQ2pDLHFCQUFxQixHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLDJCQUEyQixHQUFHLGdCQUFnQixDQUFDLENBQUM7cUJBQ3hHO3lCQUFNO3dCQUNILElBQUkscUJBQXFCLElBQUkscUJBQXFCLEVBQUU7NEJBQ2hELHFCQUFxQixHQUFHLHFCQUFxQixDQUFDOzRCQUM5Qyx1Q0FBdUM7NEJBQ3ZDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzt5QkFDeEI7NkJBQU07NEJBQ0gsZ0JBQWdCLElBQUkscUJBQXFCLENBQUM7eUJBQzdDO3dCQUVELFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO3dCQUM5QixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLGdDQUFnQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ2pHO29CQUVELFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztpQkFDbEU7cUJBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLGlDQUFpQyxDQUFDLE1BQU0sRUFBRTtvQkFDdEUsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTt3QkFDdkIsV0FBVyxDQUFDLEtBQUs7NEJBQ2IsZ0NBQWdDLElBQUkscUJBQXFCLENBQUMsQ0FBQztnQ0FDdkQsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO3FCQUNwRTtvQkFFRCxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDO29CQUV0QyxvREFBb0Q7b0JBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztvQkFDOUMsZ0JBQWdCLElBQUksWUFBWSxDQUFDO29CQUVqQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUM5RSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztpQkFDOUQ7cUJBQU07b0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQzt3QkFDUixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7d0JBQ3JCLE9BQU8sRUFBRSxlQUFlO3dCQUN4QixNQUFNLEVBQUUsK0NBQStDO3FCQUMxRCxDQUFDLENBQUM7aUJBQ047YUFDSjtpQkFBTTtnQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDO29CQUNSLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztvQkFDckIsT0FBTyxFQUFFLGVBQWU7b0JBQ3hCLE1BQU0sRUFBRSwrQ0FBK0M7aUJBQzFELENBQUMsQ0FBQzthQUNOO1lBRUQsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQzFCO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFdBQWtDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDN0QsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxRDtTQUNKO1FBRUQsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUN2QixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7O2lHQWxoQlEsZUFBZSwwREFnSGdCLG1CQUFtQjt1RUFoSGxELGVBQWU7b0NBV1AsbUJBQW1CO29DQU1uQix5QkFBeUI7Ozs7Ozs7UUNyQzlDLGtCQUFrRDs7QUQySjlDO0lBREMsUUFBUSxFQUFFOzs7OzhDQUlWO0FBYUQ7SUFEQyxRQUFRLEVBQUU7Ozs7OERBR1Y7QUFPRDtJQURDLEtBQUssRUFBRTs7OztnRUFPUDt1RkF0S1EsZUFBZTtjQUozQixTQUFTO2VBQUM7Z0JBQ1AsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFdBQVcsRUFBRSx5QkFBeUI7YUFDekM7O3NCQWlIb0MsTUFBTTt1QkFBQyxtQkFBbUI7d0JBcEduRCxXQUFXO2tCQURsQixlQUFlO21CQUFDLG1CQUFtQjtZQU81QixXQUFXO2tCQURsQixlQUFlO21CQUFDLHlCQUF5QjtZQVluQyxtQkFBbUI7a0JBRHpCLEtBQUs7WUFPQyxpQkFBaUI7a0JBRHZCLEtBQUs7WUFPQyxpQkFBaUI7a0JBRHZCLEtBQUs7WUFPQyxVQUFVO2tCQURoQixLQUFLO1lBT0MsV0FBVztrQkFEakIsS0FBSztZQU9DLGdDQUFnQztrQkFEdEMsS0FBSztZQWFDLFlBQVk7a0JBRGxCLEtBQUs7WUFXQyxhQUFhO2tCQURuQixNQUFNO1lBT0EsdUJBQXVCO2tCQUQ3QixNQUFNO1lBaURBLE9BQU8sTUFnQk4sdUJBQXVCLE1BU3hCLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPdXRwdXQsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2ctbGV2ZWwnO1xyXG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy9sb2dnaW5nJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYXlvdXQsIFNNRV9MQVlPVVRfUFJPVklERVIgfSBmcm9tICcuLi9jb21tb24vbGF5b3V0JztcclxuaW1wb3J0IHsgU21lUmVzcG9uc2l2ZVdpbmRvd0JyZWFrcG9pbnRzIH0gZnJvbSAnLi4vY29tbW9uL3NtZS1yZXNwb25zaXZlLXdpbmRvdy1tYW5hZ2VyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dENvbmZpZywgTGF5b3V0Q29uZmlnSXRlbSwgTGF5b3V0RHJpdmVuVHlwZSwgTGF5b3V0SXRlbUNvbmZpZywgTGF5b3V0SXRlbUNvbmZpZ01vZGUsIExheW91dEl0ZW1Db25maWdQcm9wZXJ0eVdpZHRoVHlwZSB9IGZyb20gJy4vbGF5b3V0LWNvbmZpZyc7XHJcbmltcG9ydCB7IExheW91dERlZmluaXRpb25Db21wb25lbnQgfSBmcm9tICcuL2xheW91dC1kZWZpbml0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2xheW91dC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dFJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyIH0gZnJvbSAnLi9sYXlvdXQtcmVzcG9uc2l2ZS13aW5kb3ctbWFuYWdlcic7XHJcblxyXG4vKipcclxuICogTGF5b3V0IGNvbXBvbmVudFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1sYXlvdXQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xheW91dC5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIExheW91dENvbXBvbmVudCBleHRlbmRzIENvcmVCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnTGF5b3V0Q29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBsYXlvdXQgaXRlbXMgY29udGVudCBjaGlsZHJlbi5cclxuICAgICAqL1xyXG4gICAgQENvbnRlbnRDaGlsZHJlbihMYXlvdXRJdGVtQ29tcG9uZW50KVxyXG4gICAgcHJpdmF0ZSBsYXlvdXRJdGVtczogUXVlcnlMaXN0PExheW91dEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxheW91dCBkZWZpbml0aW9uIGNvbnRlbnQgY2hpbGRyZW4uXHJcbiAgICAgKi9cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oTGF5b3V0RGVmaW5pdGlvbkNvbXBvbmVudClcclxuICAgIHByaXZhdGUgZGVmaW5pdGlvbnM6IFF1ZXJ5TGlzdDxMYXlvdXREZWZpbml0aW9uQ29tcG9uZW50PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IGxheW91dCBkZWZpbml0aW9uIHZhbHVlIGJhc2VkIG9uIGN1c3RvbSBsYXlvdXQgZGVmaW5pdGlvbiBhbmQgdGhlIGJyb3dzZXIgd2luZG93IHNpemUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjdXJyZW50TGF5b3V0RGVmaW5pdGlvbjogTGF5b3V0RGVmaW5pdGlvbkNvbXBvbmVudDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBkZWZhdWx0IGhvcml6b250YWwgc3BhY2UgaW4gYmV0d2VlbiBsYXlvdXQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaXRlbUhvcml6b250YWxTcGFjZSA9IDMyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlZmF1bHQgdmVydGljYWwgc3BhY2UgaW4gYmV0d2VlbiBsYXlvdXQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaXRlbVZlcnRpY2FsU3BhY2UgPSAzMjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRydWUsIHdpbGwgYWx3YXlzIHRyeSB0byBmaWxsIHRoZSB3aG9sZSByb3cgZm9yIGVhY2ggbGF5b3V0IGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdHJ5VG9GaWxsV2hvbGVSb3cgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxheW91dCBkZWZpbml0aW9uLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRlZmluaXRpb246IHsgW2NvbHVtbkNvdW50OiBudW1iZXJdOiB7IGxvd2VyV2lkdGg/OiBudW1iZXIsIHVwcGVyV2lkdGg/OiBudW1iZXIgfSB9ID0ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiBmYWxzZSwgaXQgd2lsbCBub3QgYXNzaWduIGV4dHJhIHBhZGRpbmdzIHRvIHRoZSByaWdodCBmb3IgdGhlIGxhc3QgbGF5b3V0IGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcGFkTGFzdEl0ZW0gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRydWUsIG5vdCBleHRyYSByaWdodCBwYWRkaW5nIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgaXRlbSB0aGF0IHVzZXMgdGhlIHdob2xlIHdpZHRoIG9mIHRoZSByb3cuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbm9FeHRyYVJpZ2h0UGFkZGluZ09uZUl0ZW1QZXJSb3cgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBsYXlvdXQgaXMgZm9yIHNldHRpbmdzIHdoZXJlIGl0IGNvbnRhaW5zIGEgbGVmdCBhbmQgcmlnaHQgbGF5b3V0IGl0ZW0uXHJcbiAgICAgKiBJZiB0cnVlLCB3aWxsIGFwcGx5IHNwZWNpYWwgZGVzaWduIGZvciBzZXR0aW5ncyBsYXlvdXQuXHJcbiAgICAgKiBPbiBwaG9uZS11cCwgdGhlIGxlZnQgc2lkZSBuYXZpZ2F0aW9uIGxheW91dCBpdGVtIHdpbGwgYmUgdXNpbmcgYSBmaXhlZCB3aWR0aCBieSBkZWZhdWx0IDMwMHB4LFxyXG4gICAgICogdGhlIHJpZ2h0IHNpZGUgbGF5b3V0IGl0ZW0gd2lsbCBiZSB1c2luZyB0aGUgcmVtYWluaW5nIHdpZHRoIGJ5IGRlZmF1bHQuXHJcbiAgICAgKlxyXG4gICAgICogT24gcGhvbmUtZG93biBvciA0MDAlIHpvb20sIG5vdGhpbmcgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlZ3VsYXIgc2V0dGluZ3MgcGFnZSxcclxuICAgICAqIHRoZSBsZWZ0IHJpZ2h0IGxheW91dCB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvIHRvcCBib3R0b20gbGF5b3V0LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgIFtTbWVSZXNwb25zaXZlV2luZG93QnJlYWtwb2ludHMuUGhvbmVVcF06IHsnbW9kZSc6IExheW91dEl0ZW1Db25maWdNb2RlLkRlZmF1bHR9LFxyXG4gICAgICAgIFtTbWVSZXNwb25zaXZlV2luZG93QnJlYWtwb2ludHMuUGhvbmVEb3duXTogeydtb2RlJzogTGF5b3V0SXRlbUNvbmZpZ01vZGUuRGVmYXVsdH0sXHJcbiAgICAgICAgW1NtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cy5SZWZsb3ddOiB7J21vZGUnOiBMYXlvdXRJdGVtQ29uZmlnTW9kZS5EZWZhdWx0fVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBMYXlvdXQgaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGxheW91dENoYW5nZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBMYXlvdXQgaW50ZXJmYWNlXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHdpbmRvd0JyZWFrcG9pbnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBjb2x1bW5Db3VudCA9IDE7XHJcbiAgICBwcml2YXRlIGNvbHVtblNwYW5Ub3RhbCA9IDA7XHJcbiAgICBwcml2YXRlIGxheW91dFJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyOiBMYXlvdXRSZXNwb25zaXZlV2luZG93TWFuYWdlcjtcclxuICAgIHByaXZhdGUgbGF5b3V0RHJpdmVuVHlwZSA9IExheW91dERyaXZlblR5cGUuRGVmYXVsdDtcclxuICAgIHByaXZhdGUgY3VycmVudExheW91dEl0ZW1Db25maWc6IExheW91dEl0ZW1Db25maWdbXTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3R5bGVQaXhlbCA9ICdweCc7XHJcblxyXG4gICAgcHVibGljIGdldCBjdXJyZW50TGF5b3V0RGVmaW5pdGlvbk5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50TGF5b3V0RGVmaW5pdGlvbiA/IHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24ubmFtZSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgY3VycmVudExheW91dERyaXZlblR5cGUoKTogTGF5b3V0RHJpdmVuVHlwZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0RHJpdmVuVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRXaW5kb3dCcmVha3BvaW50KCk6IFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0UmVzcG9uc2l2ZVdpbmRvd01hbmFnZXI/LnByZXZTaXplLnNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBjdXJyZW50TGF5b3V0SXRlbXMoKTogUXVlcnlMaXN0PExheW91dEl0ZW1Db21wb25lbnQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsIEBJbmplY3QoU01FX0xBWU9VVF9QUk9WSURFUikgbGF5b3V0OiBMYXlvdXQpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcblxyXG4gICAgICAgIGlmIChsYXlvdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRSZXNwb25zaXZlV2luZG93TWFuYWdlciA9IG5ldyBMYXlvdXRSZXNwb25zaXZlV2luZG93TWFuYWdlcihsYXlvdXQpO1xyXG4gICAgICAgICAgICAvLyBvbiBwYXJlbnQgbGF5b3V0IGNoYW5nZXMsIHJlLWVtaXQgdGhlIGxheW91dCBjaGFuZ2UgdG8gb3VyIGV2ZW50XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGxheW91dC5sYXlvdXRDaGFuZ2VkLnN1YnNjcmliZSgoKCkgPT4gdGhpcy5vbkxheW91dENoYW5nZWQoKSkpKTtcclxuICAgICAgICAgICAgLy8gb24gd2luZG93IGJyZWFrIHBvaW50IGNoYW5nZXMsIGVtaXQgdGhlIGV2ZW50IGFib3V0IGNyaXRpY2FsIGNsYXNzZXMgYW5kIHN0eWxpbmcgdXBkYXRlcyBzaWduYWwuXHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGxheW91dC53aW5kb3dCcmVha3BvaW50Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbldpbmRvd0JyZWFrcG9pbnRDaGFuZ2VkKCkpKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGVmZXJyZWRPbkxheW91dENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXRJdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3BlbiBBUEkgZm9yIHJlZnJlc2hpbmcgdGhlIGNvbnRyb2wgZXh0ZXJuYWxseS5cclxuICAgICAqL1xyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVzZXRGbGV4KCk7XHJcbiAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9uIGxheW91dCBjaGFuZ2VkIGV2ZW50IGhhbmRsZXIsIG9jY3VycyBldmVyeSB0aW1lIHRoZSBsYXlvdXQgaGFzIGJlZW4gY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uTGF5b3V0Q2hhbmdlZCgpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxheW91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRlZmVycmVkIGxheW91dCBjaGFuZ2VkIGhhbmRsZXIuXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwcml2YXRlIGRlZmVycmVkT25MYXlvdXRDaGFuZ2VkKCkge1xyXG4gICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb24gd2luZG93IGJyZWFrcG9pbnQgY2hhbmdlZCBoYW5kbGVyLlxyXG4gICAgICogQWRkaW5nIHlpZWxkIGZvciBjb21wb25lbnQgdG8gZ2V0IEVsZW1lbnRSZWYgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uXHJcbiAgICAgKi9cclxuICAgIEBZaWVsZCgpXHJcbiAgICBwdWJsaWMgb25XaW5kb3dCcmVha3BvaW50Q2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMubGF5b3V0SXRlbXMgfHwgIXRoaXMubGF5b3V0SXRlbXMudG9BcnJheSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0UmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIub25XaW5kb3dTaXplQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZHMgY2xhc3NlcyBsaXN0ZWQgdG8gdGhlIHJvb3QgY29tcG9uZW50XHJcbiAgICAvLyBPbiBwaG9uZSBkb3duIHRoZSBmbGV4IHN0YXJ0IG5lZWRzIHRvIGJlIGZsZXggc3RhcnQgdG8gbWFrZSBzdXJlIG5vIGV4dHJhIHNwYWNlIGJlaW5nIGdlbmVyYXRlZC5cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtYXJyYW5nZS13cmFwc3RhY2staCcsICdzbWUtbGF5b3V0LXBob25lLWRvd24nXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUxheW91dCgpOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxheW91dEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGxheW91dEl0ZW1zID0gdGhpcy5sYXlvdXRJdGVtcy50b0FycmF5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VG90YWxDb2x1bW5TcGFuKGxheW91dEl0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRXaW5kb3dTaXplID0gdGhpcy5sYXlvdXRSZXNwb25zaXZlV2luZG93TWFuYWdlci5wcmV2U2l6ZS5zaXplO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxheW91dENvbmZpZyhjdXJyZW50V2luZG93U2l6ZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsYXlvdXRXaWR0aCA9IHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCB8fCBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXREcml2ZW5UeXBlID09PSBMYXlvdXREcml2ZW5UeXBlLkRlZmF1bHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmluaXRpb25zID0gdGhpcy5kZWZpbml0aW9ucy50b0FycmF5KCkuc29ydCgoYSwgYikgPT4gYS51bnRpbCAtIGIudW50aWwpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNMYXlvdXREZWZpbml0aW9uID0gdGhpcy5jdXJyZW50TGF5b3V0RGVmaW5pdGlvbjtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudExheW91dERlZmluaXRpb24oZGVmaW5pdGlvbnMsIGxheW91dFdpZHRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtSG9yaXpvbnRhbFNwYWNlUGVyY2VudGFnZSA9IE1hdGgucm91bmQodGhpcy5pdGVtSG9yaXpvbnRhbFNwYWNlICogMTAwIC8gbGF5b3V0V2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uQ291bnRNb2RpZmllciA9IHRoaXMucGFkTGFzdEl0ZW0gPyAwIDogMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUxheW91dFdpZHRoUGVyY2VudGFnZSA9IDEwMCAtIGl0ZW1Ib3Jpem9udGFsU3BhY2VQZXJjZW50YWdlICogKHRoaXMuY29sdW1uQ291bnQgLSBjb2x1bW5Db3VudE1vZGlmaWVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0RGVmaW5pdGlvbldpdGhDb2x1bW5TcGFuQ2FsY3VsYXRpb24obGF5b3V0SXRlbXMsIGF2YWlsYWJsZUxheW91dFdpZHRoUGVyY2VudGFnZSwgaXRlbUhvcml6b250YWxTcGFjZVBlcmNlbnRhZ2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0xheW91dERlZmluaXRpb24gIT09IHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDaGFuZ2VkLmVtaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxheW91dERyaXZlblR5cGUgPT09IExheW91dERyaXZlblR5cGUuUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWwgPSBsYXlvdXRXaWR0aCAtIHRoaXMuaXRlbUhvcml6b250YWxTcGFjZTtcclxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxheW91dFdpZHRoSW5QaXhlbCA9IGF2YWlsYWJsZUxheW91dFdpZHRoSW5QaXhlbCA+IDAgPyBhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWwgOiAwO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWwgPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ0RyaXZlbkNhbGN1bGF0aW9uKGxheW91dEl0ZW1zLCBhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVMYXlvdXRDb25maWcoY3VycmVudFdpbmRvd1NpemU6IFNtZVJlc3BvbnNpdmVXaW5kb3dCcmVha3BvaW50cyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghY3VycmVudFdpbmRvd1NpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXREcml2ZW5UeXBlID0gTGF5b3V0RHJpdmVuVHlwZS5EZWZhdWx0O1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwaG9uZVVwID0gdGhpcy5sYXlvdXRDb25maWcuUGhvbmVVcDtcclxuICAgICAgICBjb25zdCBwaG9uZURvd24gPSB0aGlzLmxheW91dENvbmZpZy5QaG9uZURvd247XHJcbiAgICAgICAgY29uc3QgcmVmbG93ID0gdGhpcy5sYXlvdXRDb25maWcuUmVmbG93O1xyXG5cclxuICAgICAgICBpZiAoIXBob25lVXAgfHwgIXBob25lRG93biB8fCAhcmVmbG93KSB7XHJcbiAgICAgICAgICAgIExvZ2dpbmcubG9nKHtcclxuICAgICAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbC5EZWJ1ZyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGxheW91dCBjb25maWcgaGFzIGJlZW4gcGFzc2VkIGluJyxcclxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ0RhdGFUYWJsZUNvbXBvbmVudC5vbkNvbnRlbnRUYWJsZVByZXNzZWQnXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdE1vZGUgPSB7J21vZGUnOiBMYXlvdXRJdGVtQ29uZmlnTW9kZS5EZWZhdWx0fTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcGhvbmVVcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcuUGhvbmVVcCA9IGRlZmF1bHRNb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXBob25lRG93bikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcuUGhvbmVEb3duID0gZGVmYXVsdE1vZGU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghcmVmbG93KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZy5SZWZsb3cgPSBkZWZhdWx0TW9kZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbmZpZzogTGF5b3V0Q29uZmlnSXRlbSA9IHRoaXMubGF5b3V0Q29uZmlnW2N1cnJlbnRXaW5kb3dTaXplXTtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRDb25maWcubW9kZSA9PT0gIExheW91dEl0ZW1Db25maWdNb2RlLkRlZmF1bHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXREcml2ZW5UeXBlKExheW91dERyaXZlblR5cGUuRGVmYXVsdCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnLm1vZGUgPT09ICBMYXlvdXRJdGVtQ29uZmlnTW9kZS5DdXN0b20gJiYgY3VycmVudENvbmZpZy5jb25maWcgJiYgY3VycmVudENvbmZpZy5jb25maWcubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0RHJpdmVuVHlwZShMYXlvdXREcml2ZW5UeXBlLlJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGF5b3V0SXRlbUNvbmZpZyA9IGN1cnJlbnRDb25maWcuY29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlc2V0RmxleCgpIHtcclxuICAgICAgICBjb25zdCBsYXlvdXRJdGVtcyA9IHRoaXMubGF5b3V0SXRlbXMudG9BcnJheSgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbGF5b3V0SXRlbSA9IGxheW91dEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBpZiAobGF5b3V0SXRlbS5mbGV4KSB7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXRJdGVtLmZsZXggPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRMYXlvdXREcml2ZW5UeXBlKGxheW91dERyaXZlblR5cGU6IExheW91dERyaXZlblR5cGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5sYXlvdXREcml2ZW5UeXBlID09PSBMYXlvdXREcml2ZW5UeXBlLlJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyICYmIGxheW91dERyaXZlblR5cGUgPT09IExheW91dERyaXZlblR5cGUuRGVmYXVsdCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0RmxleCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sYXlvdXREcml2ZW5UeXBlID0gbGF5b3V0RHJpdmVuVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRvdGFsQ29sdW1uU3BhbihsYXlvdXRJdGVtczogTGF5b3V0SXRlbUNvbXBvbmVudFtdKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5TcGFuVG90YWwgPSAwO1xyXG4gICAgICAgIGxheW91dEl0ZW1zLmZvckVhY2goaXRlbSA9PiB0aGlzLmNvbHVtblNwYW5Ub3RhbCArPSBpdGVtLmNvbHVtblNwYW4pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQ3VycmVudExheW91dERlZmluaXRpb24oXHJcbiAgICAgICAgZGVmaW5pdGlvbnM6IExheW91dERlZmluaXRpb25Db21wb25lbnRbXSxcclxuICAgICAgICBsYXlvdXRXaWR0aDogbnVtYmVyXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMYXlvdXREZWZpbml0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBkZWZpbml0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICBjb25zdCBkZWZpbml0aW9uQ29sdW1ucyA9IGRlZmluaXRpb25zW2ldLmNvbHVtbnM7XHJcbiAgICAgICAgICAgIGlmIChsYXlvdXRXaWR0aCA8PSBkZWZpbml0aW9uc1tpXS51bnRpbCB8fCAodGhpcy50cnlUb0ZpbGxXaG9sZVJvdyAmJiB0aGlzLmNvbHVtblNwYW5Ub3RhbCA8PSBkZWZpbml0aW9uQ29sdW1ucykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uQ291bnQgPSBkZWZpbml0aW9uQ29sdW1ucztcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExheW91dERlZmluaXRpb24gPSBkZWZpbml0aW9uc1tpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxheW91dERlZmluaXRpb25XaXRoQ29sdW1uU3BhbkNhbGN1bGF0aW9uKFxyXG4gICAgICAgIGxheW91dEl0ZW1zOiBMYXlvdXRJdGVtQ29tcG9uZW50W10sXHJcbiAgICAgICAgYXZhaWxhYmxlTGF5b3V0V2lkdGhQZXJjZW50YWdlOiBudW1iZXIsXHJcbiAgICAgICAgaXRlbUhvcml6b250YWxTcGFjZVBlcmNlbnRhZ2U6IG51bWJlclxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHBlcmNlbnRhZ2VTb0ZhciA9IDA7XHJcbiAgICAgICAgbGV0IGNvbHVtbkluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBwZXJjZW50YWdlID0gMDtcclxuICAgICAgICAgICAgY29sdW1uSW5kZXggKz0gbGF5b3V0SXRlbXNbaV0uY29sdW1uU3BhbjtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSB0aGlzLmNvbHVtbkNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0cnVlLCBpdCBtZWFucyB0aGlzIGxheW91dCBpdGVtIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcm93LlxyXG4gICAgICAgICAgICAgICAgLy8gSXQgZW5zdXJlcyB0aGUgbGFzdCBvbmUgaW4gdGhlIHJvdyB1c2UgcmVzdCBvZiB0aGUgcGVyY2VudGFnZS5cclxuICAgICAgICAgICAgICAgIC8vIEV4YW1wbGU6IElmIGl0J3MgYSAzIGNvbHVtbiBsYXlvdXQsIHRoZSBsYXN0IG9uZSdzIHBlcmNlbnRhZ2UgaXMgMzMuMzQlLCBub3QgMzMuMzMlXHJcbiAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwIC0gcGVyY2VudGFnZVNvRmFyO1xyXG4gICAgICAgICAgICAgICAgcGVyY2VudGFnZVNvRmFyID0gMDtcclxuICAgICAgICAgICAgICAgIC8vIDEgY29sdW1uIGFuZCAxIGxheW91dCBpdGVtLlxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09PSAxICYmIHRoaXMuY29sdW1uQ291bnQgPT09IDEgJiYgIXRoaXMubm9FeHRyYVJpZ2h0UGFkZGluZ09uZUl0ZW1QZXJSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nUmlnaHQgPSAnMHB4JztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gdGhpcy5wYWRMYXN0SXRlbSA/IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZSArIHRoaXMuc3R5bGVQaXhlbCA6ICcwJyArIHRoaXMuc3R5bGVQaXhlbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ID0gMDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtblBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKGF2YWlsYWJsZUxheW91dFdpZHRoUGVyY2VudGFnZSAqIDEwMCAvIHRoaXMuY29sdW1uQ291bnQpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IGxheW91dEl0ZW1zW2ldLmNvbHVtblNwYW4gKiAoY29sdW1uUGVyY2VudGFnZSArIGl0ZW1Ib3Jpem9udGFsU3BhY2VQZXJjZW50YWdlKTtcclxuICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2VTb0ZhciArPSBwZXJjZW50YWdlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwZXJjZW50YWdlU29GYXIgPiAxMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBwdXQgaXRlbSBvbiBuZXh0IHJvdyBpZiBpdCBpcyB0b28gYmlnXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZSA9IDEwMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZVNvRmFyID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gdGhpcy5wYWRMYXN0SXRlbSA/IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZSArIHRoaXMuc3R5bGVQaXhlbCA6ICcwJyArIHRoaXMuc3R5bGVQaXhlbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gdGhpcy5pdGVtSG9yaXpvbnRhbFNwYWNlICsgdGhpcy5zdHlsZVBpeGVsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcz8uY3VycmVudExheW91dERlZmluaXRpb24/LmFkZEJvdHRvbVBhZGRpbmcpIHtcclxuICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdCb3R0b20gPSB0aGlzLml0ZW1WZXJ0aWNhbFNwYWNlICsgdGhpcy5zdHlsZVBpeGVsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgYm90dG9tIHBhZGRpbmcgYWxyZWFkeSBleGlzdHMgYW5kIGN1cnJlbnRMYXlvdXREZWZpbml0aW9uLmFkZEJvdHRvbVBhZGRpbmcgaXMgRmFsc2VcclxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYm90dG9tIHBhZGRpbmcuXHJcbiAgICAgICAgICAgICAgICBpZiAobGF5b3V0SXRlbXNbaV0ucGFkZGluZ0JvdHRvbSA9PT0gdGhpcy5pdGVtVmVydGljYWxTcGFjZSArIHRoaXMuc3R5bGVQaXhlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdCb3R0b20gPSAnMCcgKyB0aGlzLnN0eWxlUGl4ZWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gcGVyY2VudGFnZSArICclJztcclxuICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucmVhZHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25maWdEcml2ZW5DYWxjdWxhdGlvbihcclxuICAgICAgICBsYXlvdXRJdGVtczogTGF5b3V0SXRlbUNvbXBvbmVudFtdLFxyXG4gICAgICAgIGF2YWlsYWJsZUxheW91dFdpZHRoSW5QaXhlbDogbnVtYmVyXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpc0h5YnJpZE1vZGUgPSB0aGlzLnVwZGF0ZUN1c3RvbUNvbmZpZyhsYXlvdXRJdGVtcyk7XHJcblxyXG4gICAgICAgIGlmIChpc0h5YnJpZE1vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jb25maWdEcml2ZW5DYWxjdWxhdGlvbkh5YnJpZChsYXlvdXRJdGVtcywgYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ0RyaXZlbkNhbGN1bGF0aW9uRGVmYXVsdChsYXlvdXRJdGVtcywgYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBkZWFsIHdpdGggY29uZmlndXJhdGlvbnMgdGhhdCBvbmx5IGhhcyBlaXRoZXIgcGVyY2VudGFnZSBvciBudW1iZXIuXHJcbiAgICAgKiBBaW1pbmcgYXQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsYXlvdXRJdGVtcyBUaGUgbGF5b3V0IGl0ZW0gb2JqZWN0IGFycmF5XHJcbiAgICAgKiBAcGFyYW0gYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsIGF2YWlsYWJsZSB3aWR0aCBpbiBwaXhlbCBob3Jpem9udGFsbHkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uZmlnRHJpdmVuQ2FsY3VsYXRpb25EZWZhdWx0KFxyXG4gICAgICAgIGxheW91dEl0ZW1zOiBMYXlvdXRJdGVtQ29tcG9uZW50W10sXHJcbiAgICAgICAgYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsOiBudW1iZXJcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aEZvckxheW91dEl0ZW1JblBpeGVsID0gMjAwO1xyXG5cclxuICAgICAgICBsZXQgd2lkdGhVc2VkSW5QaXhlbCA9IDA7XHJcbiAgICAgICAgbGV0IHBlcmNlbnRhZ2VTb0ZhciA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXlvdXRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAobGF5b3V0SXRlbXNbaV0uY3VzdG9tQ29uZmlnLndpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aE9iamVjdCA9IGxheW91dEl0ZW1zW2ldLmN1c3RvbUNvbmZpZy53aWR0aDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1dpZHRoSW5QaXhlbCA9IGF2YWlsYWJsZUxheW91dFdpZHRoSW5QaXhlbCAtIHdpZHRoVXNlZEluUGl4ZWw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoT2JqZWN0LnR5cGUgPT09IExheW91dEl0ZW1Db25maWdQcm9wZXJ0eVdpZHRoVHlwZS5QZXJjZW50YWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoT2JqZWN0LnZhbHVlID4gMTAwIHx8IHdpZHRoT2JqZWN0LnZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aE9iamVjdC52YWx1ZSA9IDEwMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB3aWR0aE9iamVjdC52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlU29GYXIgKz0gcGVyY2VudGFnZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZ1JpZ2h0ID0gdGhpcy5pdGVtSG9yaXpvbnRhbFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdSaWdodCA9IHBhZGRpbmdSaWdodC50b1N0cmluZygpLmNvbmNhdCh0aGlzLnN0eWxlUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gcGVyY2VudGFnZSArICclJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2VTb0ZhciA+IDEwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlU29GYXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGhPYmplY3QudHlwZSA9PT0gTGF5b3V0SXRlbUNvbmZpZ1Byb3BlcnR5V2lkdGhUeXBlLk51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aE9iamVjdC52YWx1ZSA8IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhPYmplY3QudmFsdWUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFdpZHRoRm9yTGF5b3V0SXRlbUluUGl4ZWwgPD0gcmVtYWluaW5nV2lkdGhJblBpeGVsID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0V2lkdGhGb3JMYXlvdXRJdGVtSW5QaXhlbCA6IHJlbWFpbmluZ1dpZHRoSW5QaXhlbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVXNlZEluUGl4ZWwgKz0gd2lkdGhPYmplY3QudmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvdyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgdGhlIGxhc3QgaXRlbSBpbiBhIHJvdz9cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nUmlnaHQgPSB0aGlzLml0ZW1Ib3Jpem9udGFsU3BhY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhVc2VkSW5QaXhlbCArPSBwYWRkaW5nUmlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnBhZGRpbmdSaWdodCA9IHBhZGRpbmdSaWdodC50b1N0cmluZygpLmNvbmNhdCh0aGlzLnN0eWxlUGl4ZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gd2lkdGhPYmplY3QudmFsdWUgKyB0aGlzLnN0eWxlUGl4ZWw7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dpbmcubG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IExvZ0xldmVsLkRlYnVnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB3aWR0aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ0xheW91dENvbXBvbmVudC5jb25maWdEcml2ZW5DYWxjdWxhdGlvbkRlZmF1bHQnXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBMb2dnaW5nLmxvZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IExvZ0xldmVsLkRlYnVnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHdpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdMYXlvdXRDb21wb25lbnQuY29uZmlnRHJpdmVuQ2FsY3VsYXRpb25EZWZhdWx0J1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnJlYWR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZGVhbCB3aXRoIGNvbmZpZ3VyYXRpb25zIHRoYXQgb25seSBoYXMgYm90aCBwZXJjZW50YWdlIGFuZCBudW1iZXIuXHJcbiAgICAgKiBBaW1pbmcgYXQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBsYXlvdXRJdGVtcyBUaGUgbGF5b3V0IGl0ZW0gb2JqZWN0IGFycmF5XHJcbiAgICAgKiBAcGFyYW0gYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsIGF2YWlsYWJsZSB3aWR0aCBpbiBwaXhlbCBob3Jpem9udGFsbHkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY29uZmlnRHJpdmVuQ2FsY3VsYXRpb25IeWJyaWQoXHJcbiAgICAgICAgbGF5b3V0SXRlbXM6IExheW91dEl0ZW1Db21wb25lbnRbXSxcclxuICAgICAgICBhdmFpbGFibGVMYXlvdXRXaWR0aEluUGl4ZWw6IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoRm9yTGF5b3V0SXRlbUluUGl4ZWwgPSAyMDA7XHJcblxyXG4gICAgICAgIGxldCB3aWR0aFVzZWRJblBpeGVsID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChsYXlvdXRJdGVtc1tpXS5jdXN0b21Db25maWcud2lkdGgpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoT2JqZWN0ID0gbGF5b3V0SXRlbXNbaV0uY3VzdG9tQ29uZmlnLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nV2lkdGhJblBpeGVsID0gYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsIC0gd2lkdGhVc2VkSW5QaXhlbDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAod2lkdGhPYmplY3QudHlwZSA9PT0gTGF5b3V0SXRlbUNvbmZpZ1Byb3BlcnR5V2lkdGhUeXBlLlBlcmNlbnRhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGhPYmplY3QudmFsdWUgPiAxMDAgfHwgd2lkdGhPYmplY3QudmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoT2JqZWN0LnZhbHVlID0gMTAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaG93IHRvIGRldGVybWluZSBpZiBpdCBpcyB0aGUgbGFzdCBpdGVtIGluIGEgcm93P1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZGRpbmdSaWdodCA9IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aFVzZWRJblBpeGVsICs9IHBhZGRpbmdSaWdodDtcclxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRJdGVtc1tpXS5wYWRkaW5nUmlnaHQgPSBwYWRkaW5nUmlnaHQudG9TdHJpbmcoKS5jb25jYXQodGhpcy5zdHlsZVBpeGVsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvdGVudGlhbFdpZHRoSW5QaXhlbCA9ICh3aWR0aE9iamVjdC52YWx1ZSAvIDEwMCkgKiByZW1haW5pbmdXaWR0aEluUGl4ZWw7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbFdpZHRoSW5QaXhlbCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aFVzZWRJblBpeGVsID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhVc2VkSW5QaXhlbCArPSBwYWRkaW5nUmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbFdpZHRoSW5QaXhlbCA9ICh3aWR0aE9iamVjdC52YWx1ZSAvIDEwMCkgKiAoYXZhaWxhYmxlTGF5b3V0V2lkdGhJblBpeGVsIC0gd2lkdGhVc2VkSW5QaXhlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbFdpZHRoSW5QaXhlbCA+PSByZW1haW5pbmdXaWR0aEluUGl4ZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbFdpZHRoSW5QaXhlbCA9IHJlbWFpbmluZ1dpZHRoSW5QaXhlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0cyB0aGUgdXNlZCBwaXhlbCBmb3IgYSBuZXcgcm93LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhVc2VkSW5QaXhlbCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aFVzZWRJblBpeGVsICs9IHBvdGVudGlhbFdpZHRoSW5QaXhlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0uZmxleCA9ICcxIDAgMCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLm1pbldpZHRoID0gZGVmYXVsdFdpZHRoRm9yTGF5b3V0SXRlbUluUGl4ZWwudG9TdHJpbmcoKS5jb25jYXQodGhpcy5zdHlsZVBpeGVsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLndpZHRoID0gcG90ZW50aWFsV2lkdGhJblBpeGVsICsgdGhpcy5zdHlsZVBpeGVsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aWR0aE9iamVjdC50eXBlID09PSBMYXlvdXRJdGVtQ29uZmlnUHJvcGVydHlXaWR0aFR5cGUuTnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpZHRoT2JqZWN0LnZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aE9iamVjdC52YWx1ZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0V2lkdGhGb3JMYXlvdXRJdGVtSW5QaXhlbCA8PSByZW1haW5pbmdXaWR0aEluUGl4ZWwgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRXaWR0aEZvckxheW91dEl0ZW1JblBpeGVsIDogcmVtYWluaW5nV2lkdGhJblBpeGVsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhVc2VkSW5QaXhlbCArPSB3aWR0aE9iamVjdC52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaG93IHRvIGRldGVybWluZSBpZiBpdCBpcyB0aGUgbGFzdCBpdGVtIGluIGEgcm93P1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZGRpbmdSaWdodCA9IHRoaXMuaXRlbUhvcml6b250YWxTcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aFVzZWRJblBpeGVsICs9IHBhZGRpbmdSaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ucGFkZGluZ1JpZ2h0ID0gcGFkZGluZ1JpZ2h0LnRvU3RyaW5nKCkuY29uY2F0KHRoaXMuc3R5bGVQaXhlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0SXRlbXNbaV0ud2lkdGggPSB3aWR0aE9iamVjdC52YWx1ZSArIHRoaXMuc3R5bGVQaXhlbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2luZy5sb2coe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogTG9nTGV2ZWwuRGVidWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHdpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnTGF5b3V0Q29tcG9uZW50LmNvbmZpZ0RyaXZlbkNhbGN1bGF0aW9uSHlicmlkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgTG9nZ2luZy5sb2coe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbC5EZWJ1ZyxcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB3aWR0aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnTGF5b3V0Q29tcG9uZW50LmNvbmZpZ0RyaXZlbkNhbGN1bGF0aW9uSHlicmlkJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLnJlYWR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQ3VzdG9tQ29uZmlnKGxheW91dEl0ZW1zOiBMYXlvdXRJdGVtQ29tcG9uZW50W10pOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCB3aWR0aFR5cGUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheW91dEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxheW91dEl0ZW1zW2ldLmN1c3RvbUNvbmZpZyA9IHRoaXMuY3VycmVudExheW91dEl0ZW1Db25maWdbaV07XHJcbiAgICAgICAgICAgIGlmICghd2lkdGhUeXBlLmluY2x1ZGVzKGxheW91dEl0ZW1zW2ldLmN1c3RvbUNvbmZpZy53aWR0aC50eXBlKSkge1xyXG4gICAgICAgICAgICAgICAgd2lkdGhUeXBlLnB1c2gobGF5b3V0SXRlbXNbaV0uY3VzdG9tQ29uZmlnLndpZHRoLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2lkdGhUeXBlLmxlbmd0aCA8PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG59XHJcbiIsIjxuZy1jb250ZW50IHNlbGVjdD1cInNtZS1sYXlvdXQtaXRlbVwiPjwvbmctY29udGVudD5cclxuIl19
|