@messaia/cdk 18.1.0-rc06 → 18.1.0-rc07
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/esm2022/lib/chips/components/chips.component.mjs +168 -126
- package/esm2022/lib/common/common.module.mjs +3 -1
- package/esm2022/lib/common/enums/filter-glue.mjs +16 -0
- package/esm2022/lib/common/enums/filter-operator.mjs +15 -0
- package/esm2022/lib/common/models/base-entity.mjs +2 -2
- package/esm2022/lib/common/models/displayname-number-projection.mjs +2 -2
- package/esm2022/lib/common/models/displayname-projection.mjs +2 -2
- package/esm2022/lib/common/models/filter-field.mjs +2 -0
- package/esm2022/lib/common/models/filter.mjs +2 -0
- package/esm2022/lib/common/models/name-number-projection.mjs +2 -2
- package/esm2022/lib/common/models/name-projection.mjs +2 -2
- package/esm2022/lib/common/models/title-projection.mjs +2 -2
- package/esm2022/lib/forms/components/generic-form/generic-form.component.mjs +3 -3
- package/esm2022/lib/forms/models/form-field-definition.mjs +10 -1
- package/esm2022/lib/table/functions/decorators.mjs +2 -2
- package/esm2022/lib/table/models/table-column.mjs +2 -2
- package/esm2022/lib/table/table.module.mjs +1 -2
- package/fesm2022/messaia-cdk.mjs +210 -143
- package/fesm2022/messaia-cdk.mjs.map +1 -1
- package/lib/chips/components/chips.component.d.ts +95 -83
- package/lib/common/common.module.d.ts +4 -0
- package/lib/common/enums/filter-glue.d.ts +14 -0
- package/lib/common/models/filter-field.d.ts +14 -0
- package/lib/common/models/filter.d.ts +15 -0
- package/lib/forms/models/form-field-definition.d.ts +10 -0
- package/lib/table/models/table-column.d.ts +1 -1
- package/lib/table/table.module.d.ts +0 -1
- package/package.json +1 -1
- package/esm2022/lib/table/enums/filter-operator.mjs +0 -15
- /package/lib/{table → common}/enums/filter-operator.d.ts +0 -0
|
@@ -34,11 +34,12 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
34
34
|
media;
|
|
35
35
|
changeDetectorRef;
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* Reference to the dynamic table component.
|
|
38
38
|
*/
|
|
39
39
|
_dynamicTable;
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
41
|
+
* Gets the dynamic table component reference.
|
|
42
|
+
* Sets the data source's sort when the dynamic table is defined.
|
|
42
43
|
*/
|
|
43
44
|
get dynamicTable() { return this._dynamicTable; }
|
|
44
45
|
set dynamicTable(dynamicTable) {
|
|
@@ -48,80 +49,80 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
51
|
/**
|
|
51
|
-
*
|
|
52
|
+
* Defines the class type for the dynamic table.
|
|
52
53
|
*/
|
|
53
54
|
classType;
|
|
54
55
|
/**
|
|
55
|
-
*
|
|
56
|
+
* Reference to the paginator component.
|
|
56
57
|
*/
|
|
57
58
|
_paginator;
|
|
58
59
|
/**
|
|
59
|
-
*
|
|
60
|
+
* Gets the paginator component reference.
|
|
60
61
|
*/
|
|
61
62
|
set paginator(paginator) { this._paginator = paginator; }
|
|
62
63
|
get paginator() { return this._paginator; }
|
|
63
64
|
/**
|
|
64
|
-
*
|
|
65
|
+
* Reference to the sorting directive for the table.
|
|
65
66
|
*/
|
|
66
67
|
sort;
|
|
67
68
|
/**
|
|
68
|
-
*
|
|
69
|
+
* Available page size options for pagination.
|
|
69
70
|
*/
|
|
70
71
|
pageSizeOptions = [5, 10, 15, 20, 30, 50, 100, 200];
|
|
71
72
|
/**
|
|
72
|
-
* Current sort column
|
|
73
|
+
* Current active sort column.
|
|
73
74
|
*/
|
|
74
75
|
sortActive;
|
|
75
76
|
/**
|
|
76
|
-
* Current
|
|
77
|
+
* Current direction of sorting.
|
|
77
78
|
*/
|
|
78
79
|
sortDirection = 'asc';
|
|
79
80
|
/**
|
|
80
|
-
* Data
|
|
81
|
+
* Data source for the data table.
|
|
81
82
|
*/
|
|
82
83
|
dataSource;
|
|
83
84
|
/**
|
|
84
|
-
*
|
|
85
|
+
* Subscription for the data source observable.
|
|
85
86
|
*/
|
|
86
87
|
dataSourceSubscription;
|
|
87
88
|
/**
|
|
88
|
-
*
|
|
89
|
+
* Form control for the autocomplete chip list.
|
|
89
90
|
*/
|
|
90
91
|
autoCompleteChipList = new FormControl();
|
|
91
92
|
/**
|
|
92
|
-
*
|
|
93
|
+
* Reference to the filter input element.
|
|
93
94
|
*/
|
|
94
95
|
filterInput;
|
|
95
96
|
/**
|
|
96
|
-
*
|
|
97
|
+
* List of search operators for filtering.
|
|
97
98
|
*/
|
|
98
99
|
searchOperators = ["!=", "!", "<>", ">=", ">", "<=", "<", "^", "$", "~"];
|
|
99
100
|
/**
|
|
100
|
-
*
|
|
101
|
+
* Array of chips currently being used.
|
|
101
102
|
*/
|
|
102
103
|
chips = [];
|
|
103
104
|
/**
|
|
104
|
-
*
|
|
105
|
+
* Template for rendering chips.
|
|
105
106
|
*/
|
|
106
107
|
chipTemplate;
|
|
107
108
|
/**
|
|
108
|
-
*
|
|
109
|
+
* Template for autocomplete options.
|
|
109
110
|
*/
|
|
110
111
|
autocompleteOptionTemplate;
|
|
111
112
|
/**
|
|
112
|
-
* autocomplete
|
|
113
|
+
* Reference to the autocomplete component.
|
|
113
114
|
*/
|
|
114
115
|
autocomplete;
|
|
115
116
|
/**
|
|
116
|
-
*
|
|
117
|
+
* Reference to the autocomplete trigger.
|
|
117
118
|
*/
|
|
118
119
|
autocompleteTrigger;
|
|
119
120
|
/**
|
|
120
|
-
*
|
|
121
|
+
* Endpoint for data retrieval.
|
|
121
122
|
*/
|
|
122
123
|
_endpoint;
|
|
123
124
|
/**
|
|
124
|
-
* Gets or sets endpoint
|
|
125
|
+
* Gets or sets the endpoint for the service.
|
|
125
126
|
*/
|
|
126
127
|
get endpoint() { return this._endpoint; }
|
|
127
128
|
set endpoint(endpoint) {
|
|
@@ -130,26 +131,26 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
130
131
|
this.clear();
|
|
131
132
|
}
|
|
132
133
|
/**
|
|
133
|
-
*
|
|
134
|
+
* Parameters used for data retrieval.
|
|
134
135
|
*/
|
|
135
136
|
_params;
|
|
136
137
|
/**
|
|
137
|
-
*
|
|
138
|
+
* Gets or sets the parameters for the service.
|
|
138
139
|
*/
|
|
139
140
|
get params() { return this._params; }
|
|
140
141
|
set params(params) {
|
|
141
|
-
/* Remove empty
|
|
142
|
+
/* Remove empty parameters */
|
|
142
143
|
Utils.cleanObject(params);
|
|
143
144
|
if (!Utils.equals(this._params, params)) {
|
|
144
145
|
this._params = params;
|
|
145
146
|
}
|
|
146
147
|
}
|
|
147
148
|
/**
|
|
148
|
-
*
|
|
149
|
+
* Projection fields for data retrieval.
|
|
149
150
|
*/
|
|
150
151
|
_projection;
|
|
151
152
|
/**
|
|
152
|
-
* projection
|
|
153
|
+
* Gets or sets the projection for the service.
|
|
153
154
|
*/
|
|
154
155
|
get projection() { return this._projection; }
|
|
155
156
|
set projection(projection) {
|
|
@@ -157,7 +158,7 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
157
158
|
this.clear();
|
|
158
159
|
}
|
|
159
160
|
/**
|
|
160
|
-
*
|
|
161
|
+
* Indicates whether the component is disabled.
|
|
161
162
|
*/
|
|
162
163
|
get disabled() {
|
|
163
164
|
if (this._readonly) {
|
|
@@ -166,11 +167,11 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
166
167
|
return super.disabled;
|
|
167
168
|
}
|
|
168
169
|
/**
|
|
169
|
-
*
|
|
170
|
+
* Indicates if pagination is enabled.
|
|
170
171
|
*/
|
|
171
172
|
_paginated = true;
|
|
172
173
|
/**
|
|
173
|
-
*
|
|
174
|
+
* Gets or sets the pagination option.
|
|
174
175
|
*/
|
|
175
176
|
get paginated() { return this._paginated; }
|
|
176
177
|
set paginated(paginated) {
|
|
@@ -178,11 +179,11 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
178
179
|
this.stateChanges.next();
|
|
179
180
|
}
|
|
180
181
|
/**
|
|
181
|
-
*
|
|
182
|
+
* Indicates whether custom values are allowed.
|
|
182
183
|
*/
|
|
183
184
|
_customValue = false;
|
|
184
185
|
/**
|
|
185
|
-
*
|
|
186
|
+
* Gets or sets the custom value option.
|
|
186
187
|
*/
|
|
187
188
|
get customValue() { return this._customValue; }
|
|
188
189
|
set customValue(customValue) {
|
|
@@ -191,92 +192,94 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
191
192
|
this.stateChanges.next();
|
|
192
193
|
}
|
|
193
194
|
/**
|
|
194
|
-
* context
|
|
195
|
-
* The current context
|
|
195
|
+
* Current context for the component.
|
|
196
196
|
*/
|
|
197
197
|
context;
|
|
198
198
|
/**
|
|
199
|
-
*
|
|
199
|
+
* Key used for identifying items.
|
|
200
200
|
*/
|
|
201
201
|
key = 'id';
|
|
202
202
|
/**
|
|
203
|
-
*
|
|
203
|
+
* Field used for search functionality.
|
|
204
204
|
*/
|
|
205
205
|
searchField = 'search';
|
|
206
206
|
/**
|
|
207
|
-
*
|
|
207
|
+
* List of fields used for search functionality.
|
|
208
208
|
*/
|
|
209
209
|
searchFields = [];
|
|
210
210
|
/**
|
|
211
|
-
*
|
|
211
|
+
* An array of filter objects, each defined by a glue operator and fields.
|
|
212
|
+
*/
|
|
213
|
+
filters;
|
|
214
|
+
/**
|
|
215
|
+
* Indicates whether chips can be removed.
|
|
212
216
|
*/
|
|
213
217
|
removable = true;
|
|
214
218
|
/**
|
|
215
|
-
*
|
|
216
|
-
*
|
|
219
|
+
* Timeout in milliseconds between key presses for debouncing.
|
|
220
|
+
* Defaults to 400.
|
|
217
221
|
*/
|
|
218
222
|
debounce = 400;
|
|
219
223
|
/**
|
|
220
|
-
*
|
|
224
|
+
* CSS class for the autocomplete component.
|
|
221
225
|
*/
|
|
222
226
|
autocompleteCssClass = '';
|
|
223
227
|
/**
|
|
224
|
-
* opened
|
|
228
|
+
* Indicates whether the component is currently opened.
|
|
225
229
|
*/
|
|
226
230
|
opened = false;
|
|
227
231
|
/**
|
|
228
|
-
*
|
|
232
|
+
* Event emitted when the select action is initialized.
|
|
229
233
|
*/
|
|
230
234
|
initSelect = new EventEmitter();
|
|
231
235
|
/**
|
|
232
|
-
* selected
|
|
236
|
+
* Event emitted when an item is selected.
|
|
233
237
|
*/
|
|
234
238
|
selected = new EventEmitter();
|
|
235
239
|
/**
|
|
236
|
-
* cleared
|
|
240
|
+
* Event emitted when the selection is cleared.
|
|
237
241
|
*/
|
|
238
242
|
cleared = new EventEmitter();
|
|
239
243
|
/**
|
|
240
|
-
* launch
|
|
244
|
+
* Event emitted on launch action.
|
|
241
245
|
*/
|
|
242
246
|
onLaunch = new EventEmitter();
|
|
243
247
|
/**
|
|
244
|
-
*
|
|
248
|
+
* Array of suffix buttons for additional actions.
|
|
245
249
|
*/
|
|
246
250
|
suffixButtons = [];
|
|
247
251
|
/**
|
|
248
|
-
*
|
|
249
|
-
*
|
|
250
|
-
* Sends chip value as event.
|
|
252
|
+
* Event emitted when a chip is focused.
|
|
253
|
+
* Sends the chip value as an event.
|
|
251
254
|
*/
|
|
252
255
|
chipFocus = new EventEmitter();
|
|
253
256
|
/**
|
|
254
|
-
*
|
|
257
|
+
* Determines if the label of the `MatFormField` should float.
|
|
255
258
|
*/
|
|
256
259
|
get shouldLabelFloat() { return super.shouldLabelFloat || this.autoCompleteChipList?.value; }
|
|
257
260
|
/**
|
|
258
|
-
* loading
|
|
261
|
+
* Indicates whether data is currently loading.
|
|
259
262
|
*/
|
|
260
263
|
loading = false;
|
|
261
264
|
/**
|
|
262
|
-
*
|
|
265
|
+
* Indicates whether the result set is empty.
|
|
263
266
|
*/
|
|
264
267
|
emptyResult = false;
|
|
265
268
|
/**
|
|
266
|
-
*
|
|
269
|
+
* Service used for data operations.
|
|
267
270
|
*/
|
|
268
271
|
service = new BaseService();
|
|
269
272
|
/**
|
|
270
|
-
* Constructor
|
|
271
|
-
* @param injector
|
|
272
|
-
* @param media
|
|
273
|
-
* @param changeDetectorRef
|
|
274
|
-
* @param ngControl
|
|
275
|
-
* @param parentForm
|
|
276
|
-
* @param parentFormGroup
|
|
277
|
-
* @param defaultErrorStateMatcher
|
|
278
|
-
* @param focusMonitor
|
|
279
|
-
* @param elementRef
|
|
273
|
+
* Constructor for initializing the component.
|
|
274
|
+
* @param injector - Injector for dependency injection.
|
|
275
|
+
* @param media - Media service for handling media queries.
|
|
276
|
+
* @param changeDetectorRef - Reference for change detection.
|
|
277
|
+
* @param ngControl - Control for reactive forms.
|
|
278
|
+
* @param parentForm - Parent form reference.
|
|
279
|
+
* @param parentFormGroup - Parent form group reference.
|
|
280
|
+
* @param defaultErrorStateMatcher - Matcher for error state.
|
|
281
|
+
* @param focusMonitor - Monitor for focus events.
|
|
282
|
+
* @param elementRef - Reference to the element.
|
|
280
283
|
*/
|
|
281
284
|
constructor(injector, media, changeDetectorRef, ngControl, parentForm, parentFormGroup, defaultErrorStateMatcher, focusMonitor, elementRef) {
|
|
282
285
|
super("app-vd-chips", ngControl, parentForm, parentFormGroup, defaultErrorStateMatcher, focusMonitor, elementRef, changeDetectorRef);
|
|
@@ -286,10 +289,11 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
286
289
|
}
|
|
287
290
|
/**
|
|
288
291
|
* Lifecycle hook that is called after data-bound properties of a
|
|
289
|
-
* directive are initialized.
|
|
292
|
+
* directive are initialized. It sets up subscriptions to the
|
|
293
|
+
* search input value changes and ngControl value changes.
|
|
290
294
|
*/
|
|
291
295
|
ngOnInit() {
|
|
292
|
-
/* Listen to value changes of the search input */
|
|
296
|
+
/* Listen to value changes of the search input and debounce the input */
|
|
293
297
|
this.autoCompleteChipList.valueChanges
|
|
294
298
|
.pipe(debounceTime(this.debounce))
|
|
295
299
|
.subscribe(v => {
|
|
@@ -297,6 +301,7 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
297
301
|
this.filterOptions(v);
|
|
298
302
|
}
|
|
299
303
|
});
|
|
304
|
+
/* Subscribe to ngControl value changes to manage chip list */
|
|
300
305
|
this.ngControl?.valueChanges?.pipe(skip(1)).subscribe((value) => {
|
|
301
306
|
if (!value) {
|
|
302
307
|
this.chips = [];
|
|
@@ -308,44 +313,47 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
308
313
|
}
|
|
309
314
|
/**
|
|
310
315
|
* Lifecycle hook that is called after a component's view has been fully initialized.
|
|
316
|
+
* It broadcasts media changes and initializes the data source with the current service,
|
|
317
|
+
* paginator, and sort options.
|
|
311
318
|
*/
|
|
312
319
|
ngAfterViewInit() {
|
|
313
320
|
this.media.broadcast();
|
|
314
|
-
/*
|
|
321
|
+
/* Initialize the data source with the current service, paginator, and sort */
|
|
315
322
|
this.dataSource ??= new TableDataSource(this.service, this.paginator, this.sort);
|
|
316
323
|
}
|
|
317
324
|
/**
|
|
318
|
-
* From ControlValueAccessor interface
|
|
319
|
-
*
|
|
325
|
+
* From the ControlValueAccessor interface. This method is called to write a new value
|
|
326
|
+
* to the element.
|
|
327
|
+
* @param value - The value to write.
|
|
320
328
|
*/
|
|
321
329
|
writeValue(value) {
|
|
322
|
-
/* Set the value */
|
|
330
|
+
/* Set the value to the internal state */
|
|
323
331
|
this._value = value;
|
|
324
|
-
/* Clear the chips list */
|
|
332
|
+
/* Clear the chips list for new input */
|
|
325
333
|
this.chips = [];
|
|
326
334
|
if (!this.customValue && value && this.chips?.length <= 0) {
|
|
327
335
|
this.loading = true;
|
|
328
336
|
let _params = {};
|
|
329
|
-
/*
|
|
337
|
+
/* Include parameters from _params if available */
|
|
330
338
|
if (this._params?.includes) {
|
|
331
339
|
_params.includes = this._params.includes;
|
|
332
340
|
}
|
|
333
|
-
/*
|
|
341
|
+
/* Include projection from _params if available */
|
|
334
342
|
if (this._params?.projection) {
|
|
335
343
|
_params.projection = this._params.projection;
|
|
336
344
|
}
|
|
337
|
-
/* Add projection
|
|
345
|
+
/* Add projection if specified */
|
|
338
346
|
if (this.projection) {
|
|
339
347
|
_params.projection = Array.isArray(this.projection) ? this.projection.join(',') : this.projection;
|
|
340
348
|
}
|
|
341
|
-
/*
|
|
349
|
+
/* Construct the request URL */
|
|
342
350
|
var urlParts = this.service?.endpoint?.split('?') ?? [];
|
|
343
351
|
this.service.http.get(`${urlParts[0]}/${value}${urlParts.length > 1 ? `?${urlParts[1]}` : ''}`, { params: Utils.cleanObject(_params) }).subscribe({
|
|
344
352
|
next: (x) => {
|
|
345
353
|
this.loading = false;
|
|
346
|
-
/* Add
|
|
354
|
+
/* Add the returned item as a chip */
|
|
347
355
|
this.chips.push(x);
|
|
348
|
-
/* Emit selected
|
|
356
|
+
/* Emit the selected item */
|
|
349
357
|
this.initSelect.emit(x);
|
|
350
358
|
this.focused = true;
|
|
351
359
|
this.changeDetectorRef.detectChanges();
|
|
@@ -354,37 +362,41 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
354
362
|
});
|
|
355
363
|
}
|
|
356
364
|
else if (this.customValue) {
|
|
365
|
+
/* Handle custom value input */
|
|
357
366
|
this.chips = value ? [{ [this.key]: value }] : [];
|
|
358
367
|
}
|
|
359
368
|
else {
|
|
369
|
+
/* Clear the input if no value is provided */
|
|
360
370
|
this.clear(false);
|
|
361
371
|
}
|
|
362
372
|
}
|
|
363
373
|
/**
|
|
364
|
-
* Connects the data source and
|
|
374
|
+
* Connects the data source and subscribes to data changes.
|
|
375
|
+
* It also sets up the necessary parameters for the data source.
|
|
365
376
|
*/
|
|
366
377
|
connect() {
|
|
367
|
-
/* Set
|
|
378
|
+
/* Set the dropdown to open */
|
|
368
379
|
this.opened = true;
|
|
369
|
-
/*
|
|
380
|
+
/* Configure field filters for the data source */
|
|
370
381
|
this.dataSource.fieldFilters = this.getQueryParams();
|
|
371
|
-
/*
|
|
382
|
+
/* Manually connect the data source for 'mat-option' triggers */
|
|
372
383
|
if (!this.classType && !this.dataSource?.isConnected) {
|
|
373
384
|
this.dataSourceSubscription?.unsubscribe();
|
|
374
385
|
this.dataSourceSubscription = this.dataSource?.connect().subscribe();
|
|
375
386
|
}
|
|
376
|
-
/*
|
|
387
|
+
/* Trigger change detection */
|
|
377
388
|
this.changeDetectorRef.detectChanges();
|
|
378
389
|
}
|
|
379
390
|
/**
|
|
380
|
-
* Sets
|
|
391
|
+
* Sets focus on the filter input element.
|
|
381
392
|
*/
|
|
382
393
|
focus() {
|
|
383
394
|
this.filterInput?.nativeElement?.focus();
|
|
384
395
|
}
|
|
385
396
|
/**
|
|
386
|
-
* Handles blur event of the input box
|
|
387
|
-
*
|
|
397
|
+
* Handles the blur event of the input box. If the focus moves away from a
|
|
398
|
+
* mat-option, it adds the current value as a chip.
|
|
399
|
+
* @param event - The focus event.
|
|
388
400
|
*/
|
|
389
401
|
addOnBlur(event) {
|
|
390
402
|
const target = event.relatedTarget;
|
|
@@ -396,84 +408,111 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
396
408
|
}
|
|
397
409
|
}
|
|
398
410
|
/**
|
|
399
|
-
* Adds a chip
|
|
400
|
-
* @param
|
|
401
|
-
* @param input
|
|
411
|
+
* Adds a chip with the specified value and clears the input.
|
|
412
|
+
* @param value - The value to add as a chip.
|
|
413
|
+
* @param input - The input element to reset.
|
|
402
414
|
*/
|
|
403
415
|
addChip(value, input) {
|
|
404
|
-
/* Add
|
|
416
|
+
/* Add the new chip */
|
|
405
417
|
this.chips = [value];
|
|
406
|
-
/* Emit selected
|
|
418
|
+
/* Emit the selected value */
|
|
407
419
|
this.selected.emit(value);
|
|
408
|
-
/*
|
|
420
|
+
/* Set the ngModel value */
|
|
409
421
|
this.value = value[this.key];
|
|
410
|
-
/*
|
|
422
|
+
/* Disable the input to allow only one chip */
|
|
411
423
|
this.autoCompleteChipList.disable({ emitEvent: false });
|
|
412
424
|
this.autoCompleteChipList.patchValue('', { emitEvent: false });
|
|
413
425
|
/* Reset the autocomplete input text value */
|
|
414
426
|
if (input) {
|
|
415
427
|
input.value = '';
|
|
416
428
|
}
|
|
417
|
-
/* Close the autocomplete panel
|
|
429
|
+
/* Close the autocomplete panel if it is open */
|
|
418
430
|
this.autocompleteTrigger?.closePanel();
|
|
419
431
|
}
|
|
420
432
|
/**
|
|
421
|
-
*
|
|
433
|
+
* Clears all chips and resets the control state.
|
|
434
|
+
* @param triggerStateChanges - Whether to trigger state changes.
|
|
422
435
|
*/
|
|
423
436
|
clear(triggerStateChanges = true) {
|
|
424
|
-
/*
|
|
437
|
+
/* Reset the value and chips */
|
|
425
438
|
this.value = null;
|
|
426
439
|
this.chips = [];
|
|
427
440
|
/* Mark the control as touched */
|
|
428
441
|
if (this.ngControl.control) {
|
|
429
442
|
this.ngControl.control.markAsTouched();
|
|
430
443
|
}
|
|
431
|
-
/* Reset the value
|
|
444
|
+
/* Reset the ngModel value */
|
|
432
445
|
this.autoCompleteChipList.patchValue('', { emitEvent: false });
|
|
433
446
|
if (triggerStateChanges) {
|
|
434
447
|
this.stateChanges.next();
|
|
435
448
|
}
|
|
436
|
-
/* Enable the input */
|
|
449
|
+
/* Enable the input for new entries */
|
|
437
450
|
this.autoCompleteChipList.enable({ emitEvent: false });
|
|
438
|
-
/*
|
|
451
|
+
/* Trigger change detection */
|
|
439
452
|
this.changeDetectorRef.detectChanges();
|
|
440
453
|
}
|
|
441
454
|
/**
|
|
442
|
-
* Filters options
|
|
443
|
-
* @param text
|
|
455
|
+
* Filters the options based on the provided text input.
|
|
456
|
+
* @param text - The text to filter options by.
|
|
444
457
|
*/
|
|
445
458
|
filterOptions(text) {
|
|
446
|
-
/*
|
|
459
|
+
/* Perform filtering based on the current text input */
|
|
447
460
|
if (this.dataSource) {
|
|
448
|
-
/*
|
|
461
|
+
/* Initialize parameters for filtering */
|
|
449
462
|
let _params = { ...this.getQueryParams() };
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
463
|
+
if (text) {
|
|
464
|
+
/* Add search term to parameters if a search field is specified */
|
|
465
|
+
if (this.searchField && (this.searchFields.length ?? 0) == 0 && (this.filters?.length ?? 0) == 0) {
|
|
466
|
+
var result = new RegExp(`(\\${this.searchOperators.join('|\\')})?(.*)`).exec(this.searchField);
|
|
467
|
+
if (result) {
|
|
468
|
+
_params[result[2]] = `${result[1] ? result[1] : ''}${text}`;
|
|
469
|
+
}
|
|
455
470
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
471
|
+
/* Add search terms for each specified search field */
|
|
472
|
+
if ((this.filters?.length ?? 0) == 0) {
|
|
473
|
+
this.searchFields?.map(x => x.trim())?.forEach(x => {
|
|
474
|
+
var result = new RegExp(`(\\${this.searchOperators.join('|\\')})?(.*)`).exec(x);
|
|
475
|
+
if (result) {
|
|
476
|
+
_params[result[2]] = `${result[1] ? result[1] : ''}${text}`;
|
|
477
|
+
}
|
|
478
|
+
});
|
|
462
479
|
}
|
|
463
|
-
|
|
464
|
-
|
|
480
|
+
if ((this.filters?.length ?? 0) > 0) {
|
|
481
|
+
/* Construct the URL for the filters */
|
|
482
|
+
let filterQuery = '';
|
|
483
|
+
/* Include additional filters if defined */
|
|
484
|
+
this.filters.forEach(filter => {
|
|
485
|
+
const { glue, fields } = filter;
|
|
486
|
+
fields.forEach((field, index) => {
|
|
487
|
+
const { name, operator } = field;
|
|
488
|
+
/* Construct the filter string */
|
|
489
|
+
filterQuery += `${name}:${operator}${text}`;
|
|
490
|
+
/* Add glue if it's not the last field */
|
|
491
|
+
if (index < fields.length - 1 || filter !== this.filters[this.filters.length - 1]) {
|
|
492
|
+
filterQuery += `${glue}`;
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
/* Update the URL parameters with the constructed filter query */
|
|
497
|
+
if (filterQuery) {
|
|
498
|
+
_params['filters'] = filterQuery;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
/* Check if there are no changes to the parameters */
|
|
465
503
|
if (Utils.equals(this._params, _params)) {
|
|
466
504
|
return;
|
|
467
505
|
}
|
|
468
|
-
/*
|
|
506
|
+
/* Update parameters for the data source */
|
|
469
507
|
this._params = _params;
|
|
470
|
-
/*
|
|
508
|
+
/* Request new results from the server */
|
|
471
509
|
this.loading = true;
|
|
472
510
|
this.dataSource.applyFilters(this._params);
|
|
473
511
|
}
|
|
474
512
|
}
|
|
475
513
|
/**
|
|
476
|
-
* Handles removed
|
|
514
|
+
* Handles the event when a chip is removed. It emits the cleared value
|
|
515
|
+
* and optionally clears the chips.
|
|
477
516
|
*/
|
|
478
517
|
handleRemovedEvent() {
|
|
479
518
|
this.cleared?.emit(this.value);
|
|
@@ -482,7 +521,8 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
482
521
|
}
|
|
483
522
|
}
|
|
484
523
|
/**
|
|
485
|
-
* Handles launch button
|
|
524
|
+
* Handles the click event on the launch button, emitting the
|
|
525
|
+
* selected chip if available.
|
|
486
526
|
*/
|
|
487
527
|
handleLaunchClicked() {
|
|
488
528
|
if (this.chips?.length > 0) {
|
|
@@ -490,27 +530,27 @@ export class VdChipsComponent extends AbstractMatFormField {
|
|
|
490
530
|
}
|
|
491
531
|
}
|
|
492
532
|
/**
|
|
493
|
-
*
|
|
494
|
-
* @returns
|
|
533
|
+
* Retrieves the current query parameters for the data source.
|
|
534
|
+
* @returns An object containing the query parameters.
|
|
495
535
|
*/
|
|
496
536
|
getQueryParams() {
|
|
497
|
-
/*
|
|
537
|
+
/* Initialize parameters if null */
|
|
498
538
|
var params = this._params || {};
|
|
499
|
-
/*
|
|
539
|
+
/* Include projection if specified */
|
|
500
540
|
if (this.projection) {
|
|
501
541
|
params.projection = this.projection;
|
|
502
542
|
}
|
|
503
543
|
return params;
|
|
504
544
|
}
|
|
505
545
|
/**
|
|
506
|
-
*
|
|
507
|
-
*
|
|
546
|
+
* Cleanup method that is invoked immediately before the instance
|
|
547
|
+
* is destroyed. It unsubscribes from the data source subscription.
|
|
508
548
|
*/
|
|
509
549
|
ngOnDestroy() {
|
|
510
550
|
this.dataSourceSubscription?.unsubscribe();
|
|
511
551
|
}
|
|
512
552
|
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: VdChipsComponent, deps: [{ token: i0.Injector }, { token: i1.VdMediaService }, { token: i0.ChangeDetectorRef }, { token: i2.NgControl, optional: true, self: true }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i3.ErrorStateMatcher }, { token: i4.FocusMonitor }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
513
|
-
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: VdChipsComponent, selector: "vd-chips", inputs: { classType: "classType", chips: "chips", endpoint: "endpoint", params: "params", projection: "projection", paginated: "paginated", customValue: "customValue", context: "context", key: "key", searchField: "searchField", searchFields: "searchFields", removable: "removable", debounce: "debounce", autocompleteCssClass: "autocompleteCssClass", suffixButtons: "suffixButtons" }, outputs: { initSelect: "initSelect", selected: "selected", cleared: "cleared", onLaunch: "launch", chipFocus: "chipFocus" }, providers: [
|
|
553
|
+
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: VdChipsComponent, selector: "vd-chips", inputs: { classType: "classType", chips: "chips", endpoint: "endpoint", params: "params", projection: "projection", paginated: "paginated", customValue: "customValue", context: "context", key: "key", searchField: "searchField", searchFields: "searchFields", filters: "filters", removable: "removable", debounce: "debounce", autocompleteCssClass: "autocompleteCssClass", suffixButtons: "suffixButtons" }, outputs: { initSelect: "initSelect", selected: "selected", cleared: "cleared", onLaunch: "launch", chipFocus: "chipFocus" }, providers: [
|
|
514
554
|
{ provide: MatFormFieldControl, useExisting: VdChipsComponent },
|
|
515
555
|
{
|
|
516
556
|
provide: MAT_AUTOCOMPLETE_DEFAULT_OPTIONS,
|
|
@@ -581,6 +621,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
581
621
|
type: Input
|
|
582
622
|
}], searchFields: [{
|
|
583
623
|
type: Input
|
|
624
|
+
}], filters: [{
|
|
625
|
+
type: Input
|
|
584
626
|
}], removable: [{
|
|
585
627
|
type: Input
|
|
586
628
|
}], debounce: [{
|
|
@@ -601,4 +643,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
601
643
|
}], chipFocus: [{
|
|
602
644
|
type: Output
|
|
603
645
|
}] } });
|
|
604
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvY2hpcHMvY29tcG9uZW50cy9jaGlwcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9jaGlwcy9jb21wb25lbnRzL2NoaXBzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pNLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBaUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQWdCLE1BQU0sNEJBQTRC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O3NCQURiLEtBQUs7Z0JBMkJGLFNBQVM7c0JBRFosS0FBSztnQkFnQkYsV0FBVztzQkFEZCxLQUFLO2dCQWFDLE9BQU87c0JBRGIsS0FBSztnQkFPQyxHQUFHO3NCQURULEtBQUs7Z0JBT0MsV0FBVztzQkFEakIsS0FBSztnQkFPQyxZQUFZO3NCQURsQixLQUFLO2dCQU9DLFNBQVM7c0JBRGYsS0FBSztnQkFRQyxRQUFRO3NCQURkLEtBQUs7Z0JBT0Msb0JBQW9CO3NCQUQxQixLQUFLO2dCQVlDLFVBQVU7c0JBRGhCLE1BQU07Z0JBT0EsUUFBUTtzQkFEZCxNQUFNO2dCQU9BLE9BQU87c0JBRGIsTUFBTTtnQkFPQSxRQUFRO3NCQURkLE1BQU07dUJBQUMsUUFBUTtnQkFPVCxhQUFhO3NCQURuQixLQUFLO2dCQVNDLFNBQVM7c0JBRGYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvY3VzTW9uaXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFNlbGYsIFR5cGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOZ0NvbnRyb2wsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTUFUX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlMsIE1hdEF1dG9jb21wbGV0ZSwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWF0U29ydCwgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBza2lwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCYXNlU2VydmljZSwgU3VmZml4QnV0dG9uIH0gZnJvbSAnLi4vLi4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xyXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL2NvbW1vbi9mdW5jdGlvbnMvdXRpbHMnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdE1hdEZvcm1GaWVsZCB9IGZyb20gJy4uLy4uL2Zvcm1zL2hlbHBlcnMvYWJzdHJhY3QtbWF0LWZvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBWZE1lZGlhU2VydmljZSB9IGZyb20gJy4uLy4uL21lZGlhL3NlcnZpY2VzL21lZGlhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWZER5bmFtaWNUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3RhYmxlL2NvbXBvbmVudHMvZHluYW1pYy10YWJsZS9keW5hbWljLXRhYmxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL3RhYmxlL3RhYmxlLmRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgVmRBdXRvY29tcGxldGVPcHRpb25EaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2F1dG9jb21wbGV0ZS1vcHRpb24uZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVmRDaGlwRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jaGlwLmRpcmVjdGl2ZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ3ZkLWNoaXBzJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vY2hpcHMuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2NoaXBzLmNvbXBvbmVudC5zY3NzJ10sXHJcblx0cHJvdmlkZXJzOiBbXHJcblx0XHR7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBWZENoaXBzQ29tcG9uZW50IH0sXHJcblx0XHR7XHJcblx0XHRcdHByb3ZpZGU6IE1BVF9BVVRPQ09NUExFVEVfREVGQVVMVF9PUFRJT05TLFxyXG5cdFx0XHR1c2VWYWx1ZTogeyBvdmVybGF5UGFuZWxDbGFzczogJ3ZkLWNoaXBzLWF1dG9jb21wbGV0ZScgfVxyXG5cdFx0fVxyXG5cdF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFZkQ2hpcHNDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdE1hdEZvcm1GaWVsZDxhbnk+IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuXHQvKipcclxuXHQgKiBfZHluYW1pY1RhYmxlOiBNYXRQYWdpbmF0b3JcclxuXHQgKi9cclxuXHRwcml2YXRlIF9keW5hbWljVGFibGU/OiBWZER5bmFtaWNUYWJsZUNvbXBvbmVudDtcclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gVmREeW5hbWljVGFibGVDb21wb25lbnQgZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoVmREeW5hbWljVGFibGVDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG5cdHB1YmxpYyBnZXQgZHluYW1pY1RhYmxlKCk6IFZkRHluYW1pY1RhYmxlQ29tcG9uZW50IHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2R5bmFtaWNUYWJsZTsgfVxyXG5cdHB1YmxpYyBzZXQgZHluYW1pY1RhYmxlKGR5bmFtaWNUYWJsZTogVmREeW5hbWljVGFibGVDb21wb25lbnQpIHtcclxuXHRcdHRoaXMuX2R5bmFtaWNUYWJsZSA9IGR5bmFtaWNUYWJsZTtcclxuXHRcdGlmICh0aGlzLl9keW5hbWljVGFibGUpIHtcclxuXHRcdFx0dGhpcy5kYXRhU291cmNlIS5zb3J0ID0gdGhpcy5fZHluYW1pY1RhYmxlLm1hdFNvcnQ7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgZm9yIHRoZSBkeXluYW1pYyB0YWJsZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNsYXNzVHlwZT86IFR5cGU8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogX3BhZ2luYXRvcjogTWF0UGFnaW5hdG9yXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfcGFnaW5hdG9yPzogTWF0UGFnaW5hdG9yO1xyXG5cclxuXHQvKipcclxuXHQgKiBBIHJlZmVyZW5jZSB0byBNZFBhZ2luYXRvciBlbGVtZW50XHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRQYWdpbmF0b3IsIHsgc3RhdGljOiB0cnVlIH0pXHJcblx0cHVibGljIHNldCBwYWdpbmF0b3IocGFnaW5hdG9yOiBNYXRQYWdpbmF0b3IpIHsgdGhpcy5fcGFnaW5hdG9yID0gcGFnaW5hdG9yOyB9XHJcblx0cHVibGljIGdldCBwYWdpbmF0b3IoKTogTWF0UGFnaW5hdG9yIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3BhZ2luYXRvcjsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBBIHJlZmVyZW5jZSB0byBNZFNvcnQgYXR0cmlidXRlXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRTb3J0LCB7IHN0YXRpYzogZmFsc2UgfSlcclxuXHRwdWJsaWMgc29ydD86IE1hdFNvcnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhZ2Ugc2l6ZSBvcHRpb25zXHJcblx0ICovXHJcblx0cHVibGljIHBhZ2VTaXplT3B0aW9uczogQXJyYXk8bnVtYmVyPiA9IFs1LCAxMCwgMTUsIDIwLCAzMCwgNTAsIDEwMCwgMjAwXTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBzb3J0IGNvbHVtblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzb3J0QWN0aXZlPzogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBDdXJyZW50IHNvcnQgZGlyZWN0aW9uXHJcblx0ICovXHJcblx0cHVibGljIHNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb24gPSAnYXNjJztcclxuXHJcblx0LyoqXHJcblx0ICogRGF0YS10YWJsZSBkYXRhc291cmNlXHJcblx0ICovXHJcblx0cHVibGljIGRhdGFTb3VyY2U/OiBUYWJsZURhdGFTb3VyY2U8YW55LCBhbnk+IHwgbnVsbDtcclxuXHJcblx0LyoqXHJcblx0ICogZGF0YVNvdXJjZU9ic2VydmFibGU6IFN1YnNjcmlwdGlvblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBkYXRhU291cmNlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgdXAgcmVhY3RpdmUgZm9ybWNvbnRyb2xcclxuXHQgKi9cclxuXHRwdWJsaWMgYXV0b0NvbXBsZXRlQ2hpcExpc3Q6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcblx0LyoqIFxyXG5cdCAqIFRoZSBzZWxlY3QgZWxlbWVudC5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKCdmaWx0ZXJJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG5cdHB1YmxpYyBmaWx0ZXJJbnB1dD86IEVsZW1lbnRSZWY7XHJcblx0LyoqXHJcblx0ICogc2VhcmNoT3BlcmF0b3JzOiBzdHJpbmdbXVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZWFyY2hPcGVyYXRvcnM6IHN0cmluZ1tdID0gW1wiIT1cIiwgXCIhXCIsIFwiPD5cIiwgXCI+PVwiLCBcIj5cIiwgXCI8PVwiLCBcIjxcIiwgXCJeXCIsIFwiJFwiLCBcIn5cIl07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBsaXN0IG9mIGNoaXBzXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgY2hpcHM6IGFueVtdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFZkQ2hpcCB0ZW1wbGF0ZVxyXG5cdCAqL1xyXG5cdEBDb250ZW50Q2hpbGQoVmRDaGlwRGlyZWN0aXZlKVxyXG5cdHB1YmxpYyBjaGlwVGVtcGxhdGU/OiBWZENoaXBEaXJlY3RpdmU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEF1dG9jb21wbGV0ZU9wdGlvbiB0ZW1wbGF0ZVxyXG5cdCAqL1xyXG5cdEBDb250ZW50Q2hpbGQoVmRBdXRvY29tcGxldGVPcHRpb25EaXJlY3RpdmUpXHJcblx0cHVibGljIGF1dG9jb21wbGV0ZU9wdGlvblRlbXBsYXRlPzogVmRBdXRvY29tcGxldGVPcHRpb25EaXJlY3RpdmU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGF1dG9jb21wbGV0ZTogTWF0QXV0b2NvbXBsZXRlXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRBdXRvY29tcGxldGUsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG5cdHB1YmxpYyBhdXRvY29tcGxldGU/OiBNYXRBdXRvY29tcGxldGU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGF1dG9jb21wbGV0ZVRyaWdnZXI6IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXJcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpXHJcblx0cHVibGljIGF1dG9jb21wbGV0ZVRyaWdnZXI/OiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xyXG5cclxuXHQvKipcclxuXHQgKiBfZW5kcG9pbnQ6IHN0cmluZ1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBfZW5kcG9pbnQ/OiBzdHJpbmcgfCBGdW5jdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBvciBzZXRzIGVuZHBvaW50XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgZW5kcG9pbnQoKTogc3RyaW5nIHwgRnVuY3Rpb24gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZW5kcG9pbnQ7IH1cclxuXHRzZXQgZW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyB8IEZ1bmN0aW9uKSB7XHJcblx0XHR0aGlzLl9lbmRwb2ludCA9IGVuZHBvaW50O1xyXG5cdFx0dGhpcy5zZXJ2aWNlLmVuZHBvaW50ID0gdHlwZW9mIGVuZHBvaW50ID09PSAnZnVuY3Rpb24nID8gZW5kcG9pbnQodGhpcykgOiAoPHN0cmluZz5lbmRwb2ludCk7XHJcblx0XHR0aGlzLmNsZWFyKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBfcGFyYW1zOiBhbnlcclxuXHQgKi9cclxuXHRwdWJsaWMgX3BhcmFtczogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBwYXJhbXM6IGFueVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHBhcmFtcygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtczsgfVxyXG5cdHNldCBwYXJhbXMocGFyYW1zOiBhbnkpIHtcclxuXHRcdC8qIFJlbW92ZSBlbXB0eSBwYXJhbXMgKi9cclxuXHRcdFV0aWxzLmNsZWFuT2JqZWN0KHBhcmFtcyk7XHJcblxyXG5cdFx0aWYgKCFVdGlscy5lcXVhbHModGhpcy5fcGFyYW1zLCBwYXJhbXMpKSB7XHJcblx0XHRcdHRoaXMuX3BhcmFtcyA9IHBhcmFtcztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIF9wcm9qZWN0aW9uOiBhbnlcclxuXHQgKi9cclxuXHRwdWJsaWMgX3Byb2plY3Rpb24/OiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuXHJcblx0LyoqXHJcblx0ICogcHJvamVjdGlvbjogYW55XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcHJvamVjdGlvbigpOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9wcm9qZWN0aW9uOyB9XHJcblx0c2V0IHByb2plY3Rpb24ocHJvamVjdGlvbjogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuXHRcdHRoaXMuX3Byb2plY3Rpb24gPSBwcm9qZWN0aW9uO1xyXG5cdFx0dGhpcy5jbGVhcigpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgZGlzYWJsZWQuXHJcblx0ICovXHJcblx0cHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuXHRcdGlmICh0aGlzLl9yZWFkb25seSkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZGlzYWJsZWQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFkb25seVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcGFnaW5hdGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogUGFnaW5hdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHBhZ2luYXRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3BhZ2luYXRlZDsgfVxyXG5cdHNldCBwYWdpbmF0ZWQocGFnaW5hdGVkOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLl9wYWdpbmF0ZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocGFnaW5hdGVkKTtcclxuXHRcdHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlYWRvbmx5XHJcblx0ICovXHJcblx0cHVibGljIF9jdXN0b21WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBDdXN0b20gdmFsdWVcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBjdXN0b21WYWx1ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2N1c3RvbVZhbHVlOyB9XHJcblx0c2V0IGN1c3RvbVZhbHVlKGN1c3RvbVZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLl9jdXN0b21WYWx1ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShjdXN0b21WYWx1ZSk7XHJcblx0XHR0aGlzLmtleSA9IGN1c3RvbVZhbHVlICYmIHRoaXMua2V5ID09ICdpZCcgPyAnbmFtZScgOiB0aGlzLmtleTtcclxuXHRcdHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNvbnRleHQ6IGFueVxyXG5cdCAqIFRoZSBjdXJyZW50IGNvbnRleHRcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBjb250ZXh0OiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGtleTogc3RyaW5nXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMga2V5OiBzdHJpbmcgPSAnaWQnO1xyXG5cclxuXHQvKipcclxuXHQgKiBzZWFyY2hGaWVsZDogc3RyaW5nXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VhcmNoRmllbGQ6IHN0cmluZyA9ICdzZWFyY2gnO1xyXG5cclxuXHQvKipcclxuXHQgKiBzZWFyY2hGaWVsZHM6IHN0cmluZ1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlYXJjaEZpZWxkczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogcmVtb3ZhYmxlOiBib29sZWFuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcmVtb3ZhYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogZGVib3VuY2U/OiBudW1iZXJcclxuXHQgKiBEZWJvdW5jZSB0aW1lb3V0IGJldHdlZW4ga2V5cHJlc3Nlcy4gRGVmYXVsdHMgdG8gNDAwLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGRlYm91bmNlOiBudW1iZXIgPSA0MDA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGF1dG9jb21wbGV0ZUNzc0NsYXNzOiBzdHJpbmdcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBhdXRvY29tcGxldGVDc3NDbGFzczogc3RyaW5nID0gJyc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIG9wZW5lZDogYm9vbGVhblxyXG5cdCAqL1xyXG5cdHB1YmxpYyBvcGVuZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogaW5pdFNlbGVjdD86IGZ1bmN0aW9uXHJcblx0ICovXHJcblx0QE91dHB1dCgpXHJcblx0cHVibGljIGluaXRTZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHNlbGVjdGVkPzogZnVuY3Rpb25cclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNsZWFyZWQ/OiBmdW5jdGlvblxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyBjbGVhcmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuXHQvKipcclxuXHQgKiBsYXVuY2g/OiBmdW5jdGlvblxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoJ2xhdW5jaCcpXHJcblx0cHVibGljIG9uTGF1bmNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuXHQvKipcclxuXHQgKiBzdWZmaXhCdXR0b25zOiBTdWZmaXhCdXR0b248YW55PltdXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3VmZml4QnV0dG9uczogU3VmZml4QnV0dG9uW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogY2hpcEZvY3VzPzogZnVuY3Rpb25cclxuXHQgKiBNZXRob2QgdG8gYmUgZXhlY3V0ZWQgd2hlbiBhIGNoaXAgaXMgZm9jdXNlZC5cclxuXHQgKiBTZW5kcyBjaGlwIHZhbHVlIGFzIGV2ZW50LlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyBjaGlwRm9jdXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZXRoZXIgdGhlIGBNYXRGb3JtRmllbGRgIGxhYmVsIHNob3VsZCB0cnkgdG8gZmxvYXQuXHJcblx0ICovXHJcblx0cHVibGljIGdldCBzaG91bGRMYWJlbEZsb2F0KCk6IGJvb2xlYW4geyByZXR1cm4gc3VwZXIuc2hvdWxkTGFiZWxGbG9hdCB8fCB0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0Py52YWx1ZTsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBsb2FkaW5nOiBib29sZWFuXHJcblx0ICovXHJcblx0cHVibGljIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogZW1wdHlSZXN1bHQ6IGJvb2xlYW5cclxuXHQgKi9cclxuXHRwdWJsaWMgZW1wdHlSZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogc2VydmljZTogQmFzZVNlcnZpY2VcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgc2VydmljZTogQmFzZVNlcnZpY2UgPSBuZXcgQmFzZVNlcnZpY2UoKTtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3JcclxuXHQgKiBAcGFyYW0gaW5qZWN0b3IgXHJcblx0ICogQHBhcmFtIG1lZGlhIFxyXG5cdCAqIEBwYXJhbSBjaGFuZ2VEZXRlY3RvclJlZiBcclxuXHQgKiBAcGFyYW0gbmdDb250cm9sIFxyXG5cdCAqIEBwYXJhbSBwYXJlbnRGb3JtIFxyXG5cdCAqIEBwYXJhbSBwYXJlbnRGb3JtR3JvdXAgXHJcblx0ICogQHBhcmFtIGRlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciBcclxuXHQgKiBAcGFyYW0gZm9jdXNNb25pdG9yIFxyXG5cdCAqIEBwYXJhbSBlbGVtZW50UmVmIFxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcclxuXHRcdHB1YmxpYyBtZWRpYTogVmRNZWRpYVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG5cdFx0QE9wdGlvbmFsKCkgQFNlbGYoKSBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcclxuXHRcdEBPcHRpb25hbCgpIHBhcmVudEZvcm06IE5nRm9ybSxcclxuXHRcdEBPcHRpb25hbCgpIHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG5cdFx0ZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcclxuXHRcdGZvY3VzTW9uaXRvcjogRm9jdXNNb25pdG9yLFxyXG5cdFx0ZWxlbWVudFJlZjogRWxlbWVudFJlZlxyXG5cdCkge1xyXG5cdFx0c3VwZXIoXCJhcHAtdmQtY2hpcHNcIiwgbmdDb250cm9sLCBwYXJlbnRGb3JtLCBwYXJlbnRGb3JtR3JvdXAsIGRlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgZm9jdXNNb25pdG9yLCBlbGVtZW50UmVmLCBjaGFuZ2VEZXRlY3RvclJlZik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBkYXRhLWJvdW5kIHByb3BlcnRpZXMgb2YgYSBcclxuXHQgKiBkaXJlY3RpdmUgYXJlIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuXHRcdC8qIExpc3RlbiB0byB2YWx1ZSBjaGFuZ2VzIG9mIHRoZSBzZWFyY2ggaW5wdXQgKi9cclxuXHRcdHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3QudmFsdWVDaGFuZ2VzXHJcblx0XHRcdC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlKSlcclxuXHRcdFx0LnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdFx0XHR0aGlzLmZpbHRlck9wdGlvbnModik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHR0aGlzLm5nQ29udHJvbD8udmFsdWVDaGFuZ2VzPy5waXBlKHNraXAoMSkpLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xyXG5cdFx0XHRpZiAoIXZhbHVlKSB7XHJcblx0XHRcdFx0dGhpcy5jaGlwcyA9IFtdO1xyXG5cdFx0XHRcdHRoaXMuX3ZhbHVlID0gXCJcIjtcclxuXHRcdFx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LnNldFZhbHVlKFwiXCIpO1xyXG5cdFx0XHRcdHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3QuZW5hYmxlKCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgYSBjb21wb25lbnQncyB2aWV3IGhhcyBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHR0aGlzLm1lZGlhLmJyb2FkY2FzdCgpO1xyXG5cclxuXHRcdC8qIEluaXRpbGlhbGl6ZSB0aGUgZGF0YSBzb3VyY2Ugd2l0aCB0aGUgY3VycmVudCBzZXJ2aWNlLCBwYWdpbmF0b3IgYW5kIHNvcnQgKi9cclxuXHRcdHRoaXMuZGF0YVNvdXJjZSA/Pz0gbmV3IFRhYmxlRGF0YVNvdXJjZTxhbnksIGFueT4odGhpcy5zZXJ2aWNlISwgdGhpcy5wYWdpbmF0b3IsIHRoaXMuc29ydCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxyXG5cdCAqIEBwYXJhbSB2YWx1ZSBcclxuXHQgKi9cclxuXHRwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XHJcblx0XHQvKiBTZXQgdGhlIHZhbHVlICovXHJcblx0XHR0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG5cclxuXHRcdC8qIENsZWFyIHRoZSBjaGlwcyBsaXN0ICovXHJcblx0XHR0aGlzLmNoaXBzID0gW107XHJcblxyXG5cdFx0aWYgKCF0aGlzLmN1c3RvbVZhbHVlICYmIHZhbHVlICYmIHRoaXMuY2hpcHM/Lmxlbmd0aCA8PSAwKSB7XHJcblx0XHRcdHRoaXMubG9hZGluZyA9IHRydWU7XHJcblx0XHRcdGxldCBfcGFyYW1zOiBhbnkgPSB7fTtcclxuXHJcblx0XHRcdC8qIEFkZCBpbmNsdWRlcyBmcm9tIHBhcmFtcywgaWYgYW55ICovXHJcblx0XHRcdGlmICh0aGlzLl9wYXJhbXM/LmluY2x1ZGVzKSB7XHJcblx0XHRcdFx0X3BhcmFtcy5pbmNsdWRlcyA9IHRoaXMuX3BhcmFtcy5pbmNsdWRlcztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogQWRkIHByb2plY3Rpb24gZnJvbSBwYXJhbXMsIGlmIGFueSAqL1xyXG5cdFx0XHRpZiAodGhpcy5fcGFyYW1zPy5wcm9qZWN0aW9uKSB7XHJcblx0XHRcdFx0X3BhcmFtcy5wcm9qZWN0aW9uID0gdGhpcy5fcGFyYW1zLnByb2plY3Rpb247XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIEFkZCBwcm9qZWN0aW9uLCBpZiBhbnkgKi9cclxuXHRcdFx0aWYgKHRoaXMucHJvamVjdGlvbikge1xyXG5cdFx0XHRcdF9wYXJhbXMucHJvamVjdGlvbiA9IEFycmF5LmlzQXJyYXkodGhpcy5wcm9qZWN0aW9uKSA/IHRoaXMucHJvamVjdGlvbi5qb2luKCcsJykgOiB0aGlzLnByb2plY3Rpb247XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIEdldCBiYXNlIHVybCAqL1xyXG5cdFx0XHR2YXIgdXJsUGFydHM6IHN0cmluZ1tdID0gdGhpcy5zZXJ2aWNlPy5lbmRwb2ludD8uc3BsaXQoJz8nKSA/PyBbXTtcclxuXHRcdFx0dGhpcy5zZXJ2aWNlLmh0dHAuZ2V0KGAke3VybFBhcnRzWzBdfS8ke3ZhbHVlfSR7dXJsUGFydHMubGVuZ3RoID4gMSA/IGA/JHt1cmxQYXJ0c1sxXX1gIDogJyd9YCwgeyBwYXJhbXM6IFV0aWxzLmNsZWFuT2JqZWN0KF9wYXJhbXMpIH0pLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogKHg6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0LyogQWRkIGNoaXAgZm9yIHNlbGVjdGVkIG9wdGlvbiAqL1xyXG5cdFx0XHRcdFx0dGhpcy5jaGlwcy5wdXNoKHgpO1xyXG5cclxuXHRcdFx0XHRcdC8qIEVtaXQgc2VsZWN0ZWQgZXZlbnQgKi9cclxuXHRcdFx0XHRcdHRoaXMuaW5pdFNlbGVjdC5lbWl0KHgpO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcblx0XHRcdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGVycm9yOiAoKSA9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZVxyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5jdXN0b21WYWx1ZSkge1xyXG5cdFx0XHR0aGlzLmNoaXBzID0gdmFsdWUgPyBbeyBbdGhpcy5rZXldOiB2YWx1ZSB9XSA6IFtdO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5jbGVhcihmYWxzZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25uZWN0cyB0aGUgZGF0YSBzb3VyY2UgYW5kIHN1YnNjcmliZSB0byB0aGUgZGF0YSBjaGFuZ2VzXHJcblx0ICovXHJcblx0cHVibGljIGNvbm5lY3QoKTogdm9pZCB7XHJcblx0XHQvKiBTZXQgZm9jdXMgKi9cclxuXHRcdHRoaXMub3BlbmVkID0gdHJ1ZTtcclxuXHJcblx0XHQvKiBTZXQgc29tZSBwYXJhbXMgKi9cclxuXHRcdHRoaXMuZGF0YVNvdXJjZSEuZmllbGRGaWx0ZXJzID0gdGhpcy5nZXRRdWVyeVBhcmFtcygpO1xyXG5cclxuXHRcdC8qIENvbm5lY3QgdGhlIGRhdGEgc291cmNlIG1hbnVhbGx5IGZvciAnbWF0LW9wdGlvbicgdHJpZ2dlcnMgKi9cclxuXHRcdGlmICghdGhpcy5jbGFzc1R5cGUgJiYgIXRoaXMuZGF0YVNvdXJjZT8uaXNDb25uZWN0ZWQpIHtcclxuXHRcdFx0dGhpcy5kYXRhU291cmNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2VTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFTb3VyY2U/LmNvbm5lY3QoKS5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBDaGVjayB0aGUgY2hhbmdlIGRldGVjdG9yIGFuZCBpdHMgY2hpbGRyZW4gKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBjb250cm9sIGZvY3VzXHJcblx0ICovXHJcblx0cHVibGljIGZvY3VzKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5maWx0ZXJJbnB1dD8ubmF0aXZlRWxlbWVudD8uZm9jdXMoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgYmx1ciBldmVudCBvZiB0aGUgaW5wdXQgYm94XHJcblx0ICogQHBhcmFtIGV2ZW50IFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhZGRPbkJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcclxuXHRcdGNvbnN0IHRhcmdldDogSFRNTEVsZW1lbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cdFx0aWYgKCF0YXJnZXQgfHwgdGFyZ2V0LnRhZ05hbWUgIT09ICdNQVQtT1BUSU9OJykge1xyXG5cdFx0XHRsZXQgdmFsdWU6IHN0cmluZyA9IHRoaXMuZmlsdGVySW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlO1xyXG5cdFx0XHRpZiAodmFsdWUpIHtcclxuXHRcdFx0XHR0aGlzLmFkZENoaXAoeyBbdGhpcy5rZXldOiB2YWx1ZSB9LCB0aGlzLmZpbHRlcklucHV0KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIGNoaXBcclxuXHQgKiBAcGFyYW0gZXZlbnQgXHJcblx0ICogQHBhcmFtIGlucHV0IFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhZGRDaGlwKHZhbHVlOiBhbnksIGlucHV0OiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIEFkZCBjaGlwIGZvciBzZWxlY3RlZCBvcHRpb24gKi9cclxuXHRcdHRoaXMuY2hpcHMgPSBbdmFsdWVdO1xyXG5cclxuXHRcdC8qIEVtaXQgc2VsZWN0ZWQgZXZlbnQgKi9cclxuXHRcdHRoaXMuc2VsZWN0ZWQuZW1pdCh2YWx1ZSk7XHJcblxyXG5cdFx0LyogXHRTZXQgdGhlIHZhbHVlIChuZ01vZGVsKSAqL1xyXG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlW3RoaXMua2V5XTtcclxuXHJcblx0XHQvKiBEaWFibGVkIHRoZSBpbnB1dCwgYWxsb3cgb25seSBvbmUgY2hpcCAqL1xyXG5cdFx0dGhpcy5hdXRvQ29tcGxldGVDaGlwTGlzdC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHRcdHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3QucGF0Y2hWYWx1ZSgnJywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuXHRcdC8qIFJlc2V0IHRoZSBhdXRvY29tcGxldGUgaW5wdXQgdGV4dCB2YWx1ZSAqL1xyXG5cdFx0aWYgKGlucHV0KSB7XHJcblx0XHRcdGlucHV0LnZhbHVlID0gJyc7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogQ2xvc2UgdGhlIGF1dG9jb21wbGV0ZSBwYW5lbCwgaWYgbm90IGFscmVhZHkgZG9uZSAoZm9yIHRhYmxlIHJvdyBjbGljaykgKi9cclxuXHRcdHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcj8uY2xvc2VQYW5lbCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhbGwgY2hpcHNcclxuXHQgKi9cclxuXHRwdWJsaWMgY2xlYXIodHJpZ2dlclN0YXRlQ2hhbmdlczogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuXHRcdC8qIFJlbW92ZSBrZXkgZnJvbSBjaGlwcyBhcnJheSAqL1xyXG5cdFx0dGhpcy52YWx1ZSA9IG51bGw7XHJcblx0XHR0aGlzLmNoaXBzID0gW107XHJcblxyXG5cdFx0LyogTWFyayB0aGUgY29udHJvbCBhcyB0b3VjaGVkICovXHJcblx0XHRpZiAodGhpcy5uZ0NvbnRyb2wuY29udHJvbCkge1xyXG5cdFx0XHR0aGlzLm5nQ29udHJvbC5jb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBSZXNldCB0aGUgdmFsdWUgKG5nTW9kZWwpICovXHJcblx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LnBhdGNoVmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcblx0XHRpZiAodHJpZ2dlclN0YXRlQ2hhbmdlcykge1xyXG5cdFx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogRW5hYmxlIHRoZSBpbnB1dCAqL1xyXG5cdFx0dGhpcy5hdXRvQ29tcGxldGVDaGlwTGlzdC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cclxuXHRcdC8qIENoZWNrIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgYW5kIGl0cyBjaGlsZHJlbiAqL1xyXG5cdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGaWx0ZXJzIG9wdGlvbnNcclxuXHQgKiBAcGFyYW0gdGV4dCBcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbHRlck9wdGlvbnModGV4dDogc3RyaW5nKSB7XHJcblx0XHQvKiBGaWx0ZXIgdGhlIHJlc3VsdHMgKi9cclxuXHRcdGlmICh0aGlzLmRhdGFTb3VyY2UpIHtcclxuXHRcdFx0LyogSW5pdCBwYXJhbXMgaWYgbnVsbCAqL1xyXG5cdFx0XHRsZXQgX3BhcmFtczogYW55W10gPSB7IC4uLnRoaXMuZ2V0UXVlcnlQYXJhbXMoKSB9O1xyXG5cclxuXHRcdFx0LyogQWRkIHNlYXJjaCB3b3JkIHRvIHRoZSBwYXJhbXMgKi9cclxuXHRcdFx0aWYgKHRoaXMuc2VhcmNoRmllbGQgJiYgdGhpcy5zZWFyY2hGaWVsZHMubGVuZ3RoIDw9IDApIHtcclxuXHRcdFx0XHR2YXIgcmVzdWx0ID0gbmV3IFJlZ0V4cChgKFxcXFwke3RoaXMuc2VhcmNoT3BlcmF0b3JzLmpvaW4oJ3xcXFxcJyl9KT8oLiopYCkuZXhlYyh0aGlzLnNlYXJjaEZpZWxkKTtcclxuXHRcdFx0XHRpZiAocmVzdWx0KSB7XHJcblx0XHRcdFx0XHRfcGFyYW1zWyhyZXN1bHQgYXMgYW55KVsyXV0gPSBgJHtyZXN1bHRbMV0gPyByZXN1bHRbMV0gOiAnJ30ke3RleHR9YDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIEFkZCBzZWFyY2ggd29yZCB0byB0aGUgcGFyYW1zICovXHJcblx0XHRcdHRoaXMuc2VhcmNoRmllbGRzPy5tYXAoeCA9PiB4LnRyaW0oKSk/LmZvckVhY2goeCA9PiB7XHJcblx0XHRcdFx0dmFyIHJlc3VsdCA9IG5ldyBSZWdFeHAoYChcXFxcJHt0aGlzLnNlYXJjaE9wZXJhdG9ycy5qb2luKCd8XFxcXCcpfSk/KC4qKWApLmV4ZWMoeCk7XHJcblx0XHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdFx0X3BhcmFtc1socmVzdWx0IGFzIGFueSlbMl1dID0gYCR7cmVzdWx0WzFdID8gcmVzdWx0WzFdIDogJyd9JHt0ZXh0fWA7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8qIE5vdGhpbmcgaGFzIGNoYW5nZWQ/ICovXHJcblx0XHRcdGlmIChVdGlscy5lcXVhbHModGhpcy5fcGFyYW1zLCBfcGFyYW1zKSkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogU2V0IHBhcmFtcyAqL1xyXG5cdFx0XHR0aGlzLl9wYXJhbXMgPSBfcGFyYW1zO1xyXG5cclxuXHRcdFx0LyogR2V0IHJlc3VsdHMgZnJvbSBzZXJ2ZXIgKi9cclxuXHRcdFx0dGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHRcdFx0dGhpcy5kYXRhU291cmNlLmFwcGx5RmlsdGVycyh0aGlzLl9wYXJhbXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyByZW1vdmVkIGV2ZW50XHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZVJlbW92ZWRFdmVudCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuY2xlYXJlZD8uZW1pdCh0aGlzLnZhbHVlKTtcclxuXHRcdGlmICh0aGlzLnJlbW92YWJsZSkge1xyXG5cdFx0XHR0aGlzLmNsZWFyKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIGxhdW5jaCBidXR0b24gY2xpY2tcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlTGF1bmNoQ2xpY2tlZCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmNoaXBzPy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHRoaXMub25MYXVuY2guZW1pdCh0aGlzLmNoaXBzWzBdKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgcXVlcnkgcGFyYW1zXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldFF1ZXJ5UGFyYW1zKCk6IGFueSB7XHJcblx0XHQvKiBJbml0IHBhcmFtcyBpZiBudWxsICovXHJcblx0XHR2YXIgcGFyYW1zID0gdGhpcy5fcGFyYW1zIHx8IHt9O1xyXG5cclxuXHRcdC8qIEFkZCBwcm9qZWN0aW9uLCBpZiBhbnkgKi9cclxuXHRcdGlmICh0aGlzLnByb2plY3Rpb24pIHtcclxuXHRcdFx0cGFyYW1zLnByb2plY3Rpb24gPSB0aGlzLnByb2plY3Rpb247XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHBhcmFtcztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgcGVyZm9ybXMgY3VzdG9tIGNsZWFuLXVwLCBpbnZva2VkIGltbWVkaWF0ZWx5XHJcblx0ICogYmVmb3JlIGEgZGlyZWN0aXZlLCBwaXBlLCBvciBzZXJ2aWNlIGluc3RhbmNlIGlzIGRlc3Ryb3llZC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcblx0fVxyXG59IiwiPG1hdC1jaGlwLWdyaWQgI2NoaXBMaXN0IFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiIFtkaXNhYmxlZF09XCJyZWFkb25seVwiPlxyXG5cdDwhLS0gI3JlZ2lvbiBDaGlwcyAtLT5cclxuXHQ8bWF0LWNoaXAtcm93ICpuZ0Zvcj1cImxldCBjaGlwIG9mIGNoaXBzOyBsZXQgZmlyc3QgPSBmaXJzdDsgbGV0IGluZGV4ID0gaW5kZXhcIiBbcmVtb3ZhYmxlXT1cIiFyZWFkb25seVwiIChyZW1vdmVkKT1cImhhbmRsZVJlbW92ZWRFdmVudCgpXCIgZGlzYWJsZVJpcHBsZT5cclxuXHRcdDxzcGFuIGNsYXNzPVwidmQtY2hpcC1jb250ZW50XCI+XHJcblx0XHRcdDxzcGFuICpuZ0lmPVwiIWNoaXBUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIj5cclxuXHRcdFx0XHQ8c3BhbiAqbmdJZj1cIiFhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIj57eyBjaGlwIH19PC9zcGFuPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImF1dG9jb21wbGV0ZU9wdGlvblRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImF1dG9jb21wbGV0ZU9wdGlvblRlbXBsYXRlPy50ZW1wbGF0ZVJlZiFcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBvcHRpb246IGNoaXAgfVwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiY2hpcFRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNoaXBUZW1wbGF0ZT8udGVtcGxhdGVSZWYhXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY2hpcDogY2hpcCB9XCI+PC9uZy10ZW1wbGF0ZT5cclxuXHRcdDwvc3Bhbj5cclxuXHRcdDxhIG1hdENoaXBUcmFpbGluZ0ljb24gKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBzdWZmaXhCdXR0b25zOyBsZXQgZmlyc3QgPSBmaXJzdFwiIFtoaWRkZW5dPVwiYnV0dG9uLmhpZGUgJiYgYnV0dG9uLmhpZGUoY2hpcHNbMF0sIGNvbnRleHQpXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgYnV0dG9uLmV2ZW50ICYmIGJ1dHRvbi5ldmVudChjaGlwc1swXSwgY29udGV4dClcIj5cclxuXHRcdFx0PG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+e3tidXR0b24uaWNvbn19PC9tYXQtaWNvbj5cclxuXHRcdDwvYT5cclxuXHRcdDxhIG1hdENoaXBUcmFpbGluZ0ljb24gKm5nSWY9XCIob25MYXVuY2g/Lm9ic2VydmVycz8ubGVuZ3RoPz8wKSA+IDBcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBoYW5kbGVMYXVuY2hDbGlja2VkKClcIj5cclxuXHRcdFx0PG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+bGF1bmNoPC9tYXQtaWNvbj5cclxuXHRcdDwvYT5cclxuXHRcdDxhIG1hdENoaXBUcmFpbGluZ0ljb24gKm5nSWY9XCIhcmVhZG9ubHlcIiAoY2xpY2spPVwiaGFuZGxlUmVtb3ZlZEV2ZW50KClcIj5cclxuXHRcdFx0PG1hdC1pY29uIGZvbnRTZXQ9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+Y2xvc2U8L21hdC1pY29uPlxyXG5cdFx0PC9hPlxyXG5cdDwvbWF0LWNoaXAtcm93PlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0PCEtLSAjcmVnaW9uIFNlYXJjaCBib3ggLS0+XHJcblx0PGlucHV0IG1hdElucHV0IFtoaWRkZW5dPVwidmFsdWUgJiYgIWVtcHR5XCIgcGxhY2Vob2xkZXI9XCJ7e3BsYWNlaG9sZGVyfX1cIiAoZm9jdXMpPVwiY29ubmVjdCgpXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiIFttYXRBdXRvY29tcGxldGVDb25uZWN0ZWRUb109XCJvcmlnaW5cIiBbZm9ybUNvbnRyb2xdPVwiYXV0b0NvbXBsZXRlQ2hpcExpc3RcIiAoYmx1cik9XCJjdXN0b21WYWx1ZSAmJiBhZGRPbkJsdXIoJGV2ZW50KVwiICNmaWx0ZXJJbnB1dCAvPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0PCEtLSAjcmVnaW9uIFJlc2V0IGJ1dHRvbiAtLT5cclxuXHQ8YSB0cmFpbGluZ0ljb24gKm5nSWY9XCIoIXZhbHVlIHx8IGVtcHR5KSAmJiAhcmVhZG9ubHkgJiYgIWRpc2FibGVkXCIgY2xhc3M9XCJtYXQtbWRjLXNlbGVjdC1hcnJvd1wiIChjbGljayk9XCJmaWx0ZXJJbnB1dC52YWx1ZSA9ICcnXCI+XHJcblx0XHQ8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0cHhcIiBoZWlnaHQ9XCIyNHB4XCIgZm9jdXNhYmxlPVwiZmFsc2VcIiBjbGFzcz1cIm5nLXRucy1jMTg0LTIxXCI+XHJcblx0XHRcdDxwYXRoIGQ9XCJNNyAxMGw1IDUgNS01elwiIGNsYXNzPVwibmctdG5zLWMxODQtMjFcIj48L3BhdGg+XHJcblx0XHQ8L3N2Zz5cclxuXHQ8L2E+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG48L21hdC1jaGlwLWdyaWQ+XHJcblxyXG48IS0tICNyZWdpb24gQXV0b2NvbXBsZXRlIC0tPlxyXG48bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJhZGRDaGlwKCRldmVudC5vcHRpb24udmFsdWUsIGZpbHRlcklucHV0KVwiIGNsYXNzPVwie3thdXRvY29tcGxldGVDc3NDbGFzc319e3tjbGFzc1R5cGU/JyB0YWJsZS1hdXRvY29tcGxldGUnOicnfX1cIj5cclxuXHQ8bmctdGVtcGxhdGUgKm5nSWY9XCIhY2xhc3NUeXBlICYmIG9wZW5lZFwiIGxldC1pdGVtIGxldC1maXJzdD1cImZpcnN0XCIgbmdGb3IgW25nRm9yT2ZdPVwiZGF0YVNvdXJjZT8uaXRlbXNcIj5cclxuXHRcdDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtXCI+XHJcblx0XHRcdDxzcGFuICpuZ0lmPVwiIWF1dG9jb21wbGV0ZU9wdGlvblRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiPnt7aXRlbX19PC9zcGFuPlxyXG5cdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWYhXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uOiBpdGVtIH1cIj48L25nLXRlbXBsYXRlPlxyXG5cdFx0PC9tYXQtb3B0aW9uPlxyXG5cdDwvbmctdGVtcGxhdGU+XHJcblx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImNsYXNzVHlwZSAmJiBvcGVuZWRcIj5cclxuXHRcdDxtYXQtb3B0aW9uIGhpZGU9XCJ0cnVlXCI+PC9tYXQtb3B0aW9uPlxyXG5cdFx0PHZkLWR5bmFtaWMtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIFtjbGFzc1R5cGVdPVwiY2xhc3NUeXBlXCIgW3N0aWNreUhlYWRlcl09XCJ0cnVlXCIgKHJvd0NsaWNrKT1cImFkZENoaXAoJGV2ZW50LCBmaWx0ZXJJbnB1dClcIiBtYXRTb3J0IFtzb3J0QWN0aXZlXT1cInNvcnRBY3RpdmV8fCdpZCdcIiBbc29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCI+PC92ZC1keW5hbWljLXRhYmxlPlxyXG5cdDwvbmctY29udGFpbmVyPlxyXG5cdDxkaXYgY2xhc3M9XCJ2ZC1jaGlwcy1wYWdpbmF0b3JcIj5cclxuXHRcdDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG5cdFx0PG1hdC1wYWdpbmF0b3IgW2xlbmd0aF09XCJkYXRhU291cmNlPy50b3RhbFwiIFtwYWdlSW5kZXhdPVwiZGF0YVNvdXJjZT8ucGFnZUluZGV4XCIgW3BhZ2VTaXplXT1cImRhdGFTb3VyY2U/LnBhZ2VTaXplXCIgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz1cInRydWVcIiBoaWRlUGFnZVNpemU9XCJ0cnVlXCI+PC9tYXQtcGFnaW5hdG9yPlxyXG5cdDwvZGl2PlxyXG48L21hdC1hdXRvY29tcGxldGU+XHJcbjwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbjxkaXYgbWF0QXV0b2NvbXBsZXRlT3JpZ2luICNvcmlnaW49XCJtYXRBdXRvY29tcGxldGVPcmlnaW5cIiBjbGFzcz1cImF1dG9jb21wbGV0ZS1vcmlnaW5cIj48L2Rpdj4iXX0=
|
|
646
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvY2hpcHMvY29tcG9uZW50cy9jaGlwcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9jaGlwcy9jb21wb25lbnRzL2NoaXBzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pNLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBaUIsTUFBTSx3QkFBd0IsQ0FBQztBQUVoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQXdCLE1BQU0sNEJBQTRC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c0JBRGxCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFPdEMsbUJBQW1CO3NCQUR6QixTQUFTO3VCQUFDLHNCQUFzQjtnQkFZN0IsUUFBUTtzQkFEWCxLQUFLO2dCQWlCRixNQUFNO3NCQURULEtBQUs7Z0JBb0JGLFVBQVU7c0JBRGIsS0FBSztnQkEyQkYsU0FBUztzQkFEWixLQUFLO2dCQWdCRixXQUFXO3NCQURkLEtBQUs7Z0JBWUMsT0FBTztzQkFEYixLQUFLO2dCQU9DLEdBQUc7c0JBRFQsS0FBSztnQkFPQyxXQUFXO3NCQURqQixLQUFLO2dCQU9DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBT0MsT0FBTztzQkFEYixLQUFLO2dCQU9DLFNBQVM7c0JBRGYsS0FBSztnQkFRQyxRQUFRO3NCQURkLEtBQUs7Z0JBT0Msb0JBQW9CO3NCQUQxQixLQUFLO2dCQVlDLFVBQVU7c0JBRGhCLE1BQU07Z0JBT0EsUUFBUTtzQkFEZCxNQUFNO2dCQU9BLE9BQU87c0JBRGIsTUFBTTtnQkFPQSxRQUFRO3NCQURkLE1BQU07dUJBQUMsUUFBUTtnQkFPVCxhQUFhO3NCQURuQixLQUFLO2dCQVFDLFNBQVM7c0JBRGYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvY3VzTW9uaXRvciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFNlbGYsIFR5cGUsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOZ0NvbnRyb2wsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTUFUX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlMsIE1hdEF1dG9jb21wbGV0ZSwgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2F1dG9jb21wbGV0ZSc7XHJcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWF0U29ydCwgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBza2lwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBCYXNlU2VydmljZSwgRmlsdGVyLCBTdWZmaXhCdXR0b24gfSBmcm9tICcuLi8uLi9jb21tb24vY29tbW9uLm1vZHVsZSc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Z1bmN0aW9ucy91dGlscyc7XHJcbmltcG9ydCB7IEFic3RyYWN0TWF0Rm9ybUZpZWxkIH0gZnJvbSAnLi4vLi4vZm9ybXMvaGVscGVycy9hYnN0cmFjdC1tYXQtZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IFZkTWVkaWFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbWVkaWEvc2VydmljZXMvbWVkaWEuc2VydmljZSc7XHJcbmltcG9ydCB7IFZkRHluYW1pY1RhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdGFibGUvY29tcG9uZW50cy9keW5hbWljLXRhYmxlL2R5bmFtaWMtdGFibGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUvdGFibGUuZGF0YS1zb3VyY2UnO1xyXG5pbXBvcnQgeyBWZEF1dG9jb21wbGV0ZU9wdGlvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvYXV0b2NvbXBsZXRlLW9wdGlvbi5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBWZENoaXBEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NoaXAuZGlyZWN0aXZlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAndmQtY2hpcHMnLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9jaGlwcy5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vY2hpcHMuY29tcG9uZW50LnNjc3MnXSxcclxuXHRwcm92aWRlcnM6IFtcclxuXHRcdHsgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IFZkQ2hpcHNDb21wb25lbnQgfSxcclxuXHRcdHtcclxuXHRcdFx0cHJvdmlkZTogTUFUX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlMsXHJcblx0XHRcdHVzZVZhbHVlOiB7IG92ZXJsYXlQYW5lbENsYXNzOiAndmQtY2hpcHMtYXV0b2NvbXBsZXRlJyB9XHJcblx0XHR9XHJcblx0XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmRDaGlwc0NvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0TWF0Rm9ybUZpZWxkPGFueT4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBkeW5hbWljIHRhYmxlIGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRwcml2YXRlIF9keW5hbWljVGFibGU/OiBWZER5bmFtaWNUYWJsZUNvbXBvbmVudDtcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgZHluYW1pYyB0YWJsZSBjb21wb25lbnQgcmVmZXJlbmNlLlxyXG5cdCAqIFNldHMgdGhlIGRhdGEgc291cmNlJ3Mgc29ydCB3aGVuIHRoZSBkeW5hbWljIHRhYmxlIGlzIGRlZmluZWQuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChWZER5bmFtaWNUYWJsZUNvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcblx0cHVibGljIGdldCBkeW5hbWljVGFibGUoKTogVmREeW5hbWljVGFibGVDb21wb25lbnQgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZHluYW1pY1RhYmxlOyB9XHJcblx0cHVibGljIHNldCBkeW5hbWljVGFibGUoZHluYW1pY1RhYmxlOiBWZER5bmFtaWNUYWJsZUNvbXBvbmVudCkge1xyXG5cdFx0dGhpcy5fZHluYW1pY1RhYmxlID0gZHluYW1pY1RhYmxlO1xyXG5cdFx0aWYgKHRoaXMuX2R5bmFtaWNUYWJsZSkge1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2UhLnNvcnQgPSB0aGlzLl9keW5hbWljVGFibGUubWF0U29ydDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIGNsYXNzIHR5cGUgZm9yIHRoZSBkeW5hbWljIHRhYmxlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNsYXNzVHlwZT86IFR5cGU8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwYWdpbmF0b3IgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX3BhZ2luYXRvcj86IE1hdFBhZ2luYXRvcjtcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgcGFnaW5hdG9yIGNvbXBvbmVudCByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRQYWdpbmF0b3IsIHsgc3RhdGljOiB0cnVlIH0pXHJcblx0cHVibGljIHNldCBwYWdpbmF0b3IocGFnaW5hdG9yOiBNYXRQYWdpbmF0b3IpIHsgdGhpcy5fcGFnaW5hdG9yID0gcGFnaW5hdG9yOyB9XHJcblx0cHVibGljIGdldCBwYWdpbmF0b3IoKTogTWF0UGFnaW5hdG9yIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX3BhZ2luYXRvcjsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHNvcnRpbmcgZGlyZWN0aXZlIGZvciB0aGUgdGFibGUuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRTb3J0LCB7IHN0YXRpYzogZmFsc2UgfSlcclxuXHRwdWJsaWMgc29ydD86IE1hdFNvcnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEF2YWlsYWJsZSBwYWdlIHNpemUgb3B0aW9ucyBmb3IgcGFnaW5hdGlvbi5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGFnZVNpemVPcHRpb25zOiBBcnJheTxudW1iZXI+ID0gWzUsIDEwLCAxNSwgMjAsIDMwLCA1MCwgMTAwLCAyMDBdO1xyXG5cclxuXHQvKipcclxuXHQgKiBDdXJyZW50IGFjdGl2ZSBzb3J0IGNvbHVtbi5cclxuXHQgKi9cclxuXHRwdWJsaWMgc29ydEFjdGl2ZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBkaXJlY3Rpb24gb2Ygc29ydGluZy5cclxuXHQgKi9cclxuXHRwdWJsaWMgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbiA9ICdhc2MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBEYXRhIHNvdXJjZSBmb3IgdGhlIGRhdGEgdGFibGUuXHJcblx0ICovXHJcblx0cHVibGljIGRhdGFTb3VyY2U/OiBUYWJsZURhdGFTb3VyY2U8YW55LCBhbnk+IHwgbnVsbDtcclxuXHJcblx0LyoqXHJcblx0ICogU3Vic2NyaXB0aW9uIGZvciB0aGUgZGF0YSBzb3VyY2Ugb2JzZXJ2YWJsZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGF0YVNvdXJjZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogRm9ybSBjb250cm9sIGZvciB0aGUgYXV0b2NvbXBsZXRlIGNoaXAgbGlzdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgYXV0b0NvbXBsZXRlQ2hpcExpc3Q6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XHJcblxyXG5cdC8qKiBcclxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIGZpbHRlciBpbnB1dCBlbGVtZW50LlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoJ2ZpbHRlcklucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcblx0cHVibGljIGZpbHRlcklucHV0PzogRWxlbWVudFJlZjtcclxuXHJcblx0LyoqXHJcblx0ICogTGlzdCBvZiBzZWFyY2ggb3BlcmF0b3JzIGZvciBmaWx0ZXJpbmcuXHJcblx0ICovXHJcblx0cHVibGljIHNlYXJjaE9wZXJhdG9yczogc3RyaW5nW10gPSBbXCIhPVwiLCBcIiFcIiwgXCI8PlwiLCBcIj49XCIsIFwiPlwiLCBcIjw9XCIsIFwiPFwiLCBcIl5cIiwgXCIkXCIsIFwiflwiXTtcclxuXHJcblx0LyoqXHJcblx0ICogQXJyYXkgb2YgY2hpcHMgY3VycmVudGx5IGJlaW5nIHVzZWQuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgY2hpcHM6IGFueVtdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRlbXBsYXRlIGZvciByZW5kZXJpbmcgY2hpcHMuXHJcblx0ICovXHJcblx0QENvbnRlbnRDaGlsZChWZENoaXBEaXJlY3RpdmUpXHJcblx0cHVibGljIGNoaXBUZW1wbGF0ZT86IFZkQ2hpcERpcmVjdGl2ZTtcclxuXHJcblx0LyoqXHJcblx0ICogVGVtcGxhdGUgZm9yIGF1dG9jb21wbGV0ZSBvcHRpb25zLlxyXG5cdCAqL1xyXG5cdEBDb250ZW50Q2hpbGQoVmRBdXRvY29tcGxldGVPcHRpb25EaXJlY3RpdmUpXHJcblx0cHVibGljIGF1dG9jb21wbGV0ZU9wdGlvblRlbXBsYXRlPzogVmRBdXRvY29tcGxldGVPcHRpb25EaXJlY3RpdmU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgYXV0b2NvbXBsZXRlIGNvbXBvbmVudC5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZSwgeyBzdGF0aWM6IGZhbHNlIH0pXHJcblx0cHVibGljIGF1dG9jb21wbGV0ZT86IE1hdEF1dG9jb21wbGV0ZTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBhdXRvY29tcGxldGUgdHJpZ2dlci5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpXHJcblx0cHVibGljIGF1dG9jb21wbGV0ZVRyaWdnZXI/OiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xyXG5cclxuXHQvKipcclxuXHQgKiBFbmRwb2ludCBmb3IgZGF0YSByZXRyaWV2YWwuXHJcblx0ICovXHJcblx0cHVibGljIF9lbmRwb2ludD86IHN0cmluZyB8IEZ1bmN0aW9uO1xyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIG9yIHNldHMgdGhlIGVuZHBvaW50IGZvciB0aGUgc2VydmljZS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBlbmRwb2ludCgpOiBzdHJpbmcgfCBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9lbmRwb2ludDsgfVxyXG5cdHNldCBlbmRwb2ludChlbmRwb2ludDogc3RyaW5nIHwgRnVuY3Rpb24pIHtcclxuXHRcdHRoaXMuX2VuZHBvaW50ID0gZW5kcG9pbnQ7XHJcblx0XHR0aGlzLnNlcnZpY2UuZW5kcG9pbnQgPSB0eXBlb2YgZW5kcG9pbnQgPT09ICdmdW5jdGlvbicgPyBlbmRwb2ludCh0aGlzKSA6ICg8c3RyaW5nPmVuZHBvaW50KTtcclxuXHRcdHRoaXMuY2xlYXIoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcmFtZXRlcnMgdXNlZCBmb3IgZGF0YSByZXRyaWV2YWwuXHJcblx0ICovXHJcblx0cHVibGljIF9wYXJhbXM6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBvciBzZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgc2VydmljZS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBwYXJhbXMoKSB7IHJldHVybiB0aGlzLl9wYXJhbXM7IH1cclxuXHRzZXQgcGFyYW1zKHBhcmFtczogYW55KSB7XHJcblx0XHQvKiBSZW1vdmUgZW1wdHkgcGFyYW1ldGVycyAqL1xyXG5cdFx0VXRpbHMuY2xlYW5PYmplY3QocGFyYW1zKTtcclxuXHJcblx0XHRpZiAoIVV0aWxzLmVxdWFscyh0aGlzLl9wYXJhbXMsIHBhcmFtcykpIHtcclxuXHRcdFx0dGhpcy5fcGFyYW1zID0gcGFyYW1zO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUHJvamVjdGlvbiBmaWVsZHMgZm9yIGRhdGEgcmV0cmlldmFsLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcHJvamVjdGlvbj86IHN0cmluZyB8IHN0cmluZ1tdO1xyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIG9yIHNldHMgdGhlIHByb2plY3Rpb24gZm9yIHRoZSBzZXJ2aWNlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHByb2plY3Rpb24oKTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fcHJvamVjdGlvbjsgfVxyXG5cdHNldCBwcm9qZWN0aW9uKHByb2plY3Rpb246IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcblx0XHR0aGlzLl9wcm9qZWN0aW9uID0gcHJvamVjdGlvbjtcclxuXHRcdHRoaXMuY2xlYXIoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQuXHJcblx0ICovXHJcblx0cHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuXHRcdGlmICh0aGlzLl9yZWFkb25seSkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc3VwZXIuZGlzYWJsZWQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgaWYgcGFnaW5hdGlvbiBpcyBlbmFibGVkLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcGFnaW5hdGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBvciBzZXRzIHRoZSBwYWdpbmF0aW9uIG9wdGlvbi5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBwYWdpbmF0ZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9wYWdpbmF0ZWQ7IH1cclxuXHRzZXQgcGFnaW5hdGVkKHBhZ2luYXRlZDogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5fcGFnaW5hdGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHBhZ2luYXRlZCk7XHJcblx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciBjdXN0b20gdmFsdWVzIGFyZSBhbGxvd2VkLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfY3VzdG9tVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBvciBzZXRzIHRoZSBjdXN0b20gdmFsdWUgb3B0aW9uLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGN1c3RvbVZhbHVlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fY3VzdG9tVmFsdWU7IH1cclxuXHRzZXQgY3VzdG9tVmFsdWUoY3VzdG9tVmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHRoaXMuX2N1c3RvbVZhbHVlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KGN1c3RvbVZhbHVlKTtcclxuXHRcdHRoaXMua2V5ID0gY3VzdG9tVmFsdWUgJiYgdGhpcy5rZXkgPT0gJ2lkJyA/ICduYW1lJyA6IHRoaXMua2V5O1xyXG5cdFx0dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBjb250ZXh0IGZvciB0aGUgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNvbnRleHQ6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogS2V5IHVzZWQgZm9yIGlkZW50aWZ5aW5nIGl0ZW1zLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGtleTogc3RyaW5nID0gJ2lkJztcclxuXHJcblx0LyoqXHJcblx0ICogRmllbGQgdXNlZCBmb3Igc2VhcmNoIGZ1bmN0aW9uYWxpdHkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VhcmNoRmllbGQ6IHN0cmluZyA9ICdzZWFyY2gnO1xyXG5cclxuXHQvKipcclxuXHQgKiBMaXN0IG9mIGZpZWxkcyB1c2VkIGZvciBzZWFyY2ggZnVuY3Rpb25hbGl0eS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzZWFyY2hGaWVsZHM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFuIGFycmF5IG9mIGZpbHRlciBvYmplY3RzLCBlYWNoIGRlZmluZWQgYnkgYSBnbHVlIG9wZXJhdG9yIGFuZCBmaWVsZHMuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZmlsdGVycz86IEZpbHRlcltdO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciBjaGlwcyBjYW4gYmUgcmVtb3ZlZC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyByZW1vdmFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGtleSBwcmVzc2VzIGZvciBkZWJvdW5jaW5nLlxyXG5cdCAqIERlZmF1bHRzIHRvIDQwMC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZWJvdW5jZTogbnVtYmVyID0gNDAwO1xyXG5cclxuXHQvKipcclxuXHQgKiBDU1MgY2xhc3MgZm9yIHRoZSBhdXRvY29tcGxldGUgY29tcG9uZW50LlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGF1dG9jb21wbGV0ZUNzc0NsYXNzOiBzdHJpbmcgPSAnJztcclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgb3BlbmVkLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBvcGVuZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3QgYWN0aW9uIGlzIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyBpbml0U2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuXHQvKipcclxuXHQgKiBFdmVudCBlbWl0dGVkIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZC5cclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0aW9uIGlzIGNsZWFyZWQuXHJcblx0ICovXHJcblx0QE91dHB1dCgpXHJcblx0cHVibGljIGNsZWFyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgb24gbGF1bmNoIGFjdGlvbi5cclxuXHQgKi9cclxuXHRAT3V0cHV0KCdsYXVuY2gnKVxyXG5cdHB1YmxpYyBvbkxhdW5jaDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblx0LyoqXHJcblx0ICogQXJyYXkgb2Ygc3VmZml4IGJ1dHRvbnMgZm9yIGFkZGl0aW9uYWwgYWN0aW9ucy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdWZmaXhCdXR0b25zOiBTdWZmaXhCdXR0b25bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBjaGlwIGlzIGZvY3VzZWQuXHJcblx0ICogU2VuZHMgdGhlIGNoaXAgdmFsdWUgYXMgYW4gZXZlbnQuXHJcblx0ICovXHJcblx0QE91dHB1dCgpXHJcblx0cHVibGljIGNoaXBGb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyBpZiB0aGUgbGFiZWwgb2YgdGhlIGBNYXRGb3JtRmllbGRgIHNob3VsZCBmbG9hdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0IHNob3VsZExhYmVsRmxvYXQoKTogYm9vbGVhbiB7IHJldHVybiBzdXBlci5zaG91bGRMYWJlbEZsb2F0IHx8IHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3Q/LnZhbHVlOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGRhdGEgaXMgY3VycmVudGx5IGxvYWRpbmcuXHJcblx0ICovXHJcblx0cHVibGljIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlc3VsdCBzZXQgaXMgZW1wdHkuXHJcblx0ICovXHJcblx0cHVibGljIGVtcHR5UmVzdWx0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcnZpY2UgdXNlZCBmb3IgZGF0YSBvcGVyYXRpb25zLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBzZXJ2aWNlOiBCYXNlU2VydmljZSA9IG5ldyBCYXNlU2VydmljZSgpO1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RvciBmb3IgaW5pdGlhbGl6aW5nIHRoZSBjb21wb25lbnQuXHJcblx0ICogQHBhcmFtIGluamVjdG9yIC0gSW5qZWN0b3IgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxyXG5cdCAqIEBwYXJhbSBtZWRpYSAtIE1lZGlhIHNlcnZpY2UgZm9yIGhhbmRsaW5nIG1lZGlhIHF1ZXJpZXMuXHJcblx0ICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIC0gUmVmZXJlbmNlIGZvciBjaGFuZ2UgZGV0ZWN0aW9uLlxyXG5cdCAqIEBwYXJhbSBuZ0NvbnRyb2wgLSBDb250cm9sIGZvciByZWFjdGl2ZSBmb3Jtcy5cclxuXHQgKiBAcGFyYW0gcGFyZW50Rm9ybSAtIFBhcmVudCBmb3JtIHJlZmVyZW5jZS5cclxuXHQgKiBAcGFyYW0gcGFyZW50Rm9ybUdyb3VwIC0gUGFyZW50IGZvcm0gZ3JvdXAgcmVmZXJlbmNlLlxyXG5cdCAqIEBwYXJhbSBkZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIgLSBNYXRjaGVyIGZvciBlcnJvciBzdGF0ZS5cclxuXHQgKiBAcGFyYW0gZm9jdXNNb25pdG9yIC0gTW9uaXRvciBmb3IgZm9jdXMgZXZlbnRzLlxyXG5cdCAqIEBwYXJhbSBlbGVtZW50UmVmIC0gUmVmZXJlbmNlIHRvIHRoZSBlbGVtZW50LlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcclxuXHRcdHB1YmxpYyBtZWRpYTogVmRNZWRpYVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG5cdFx0QE9wdGlvbmFsKCkgQFNlbGYoKSBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcclxuXHRcdEBPcHRpb25hbCgpIHBhcmVudEZvcm06IE5nRm9ybSxcclxuXHRcdEBPcHRpb25hbCgpIHBhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxyXG5cdFx0ZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcclxuXHRcdGZvY3VzTW9uaXRvcjogRm9jdXNNb25pdG9yLFxyXG5cdFx0ZWxlbWVudFJlZjogRWxlbWVudFJlZlxyXG5cdCkge1xyXG5cdFx0c3VwZXIoXCJhcHAtdmQtY2hpcHNcIiwgbmdDb250cm9sLCBwYXJlbnRGb3JtLCBwYXJlbnRGb3JtR3JvdXAsIGRlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgZm9jdXNNb25pdG9yLCBlbGVtZW50UmVmLCBjaGFuZ2VEZXRlY3RvclJlZik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBkYXRhLWJvdW5kIHByb3BlcnRpZXMgb2YgYSBcclxuXHQgKiBkaXJlY3RpdmUgYXJlIGluaXRpYWxpemVkLiBJdCBzZXRzIHVwIHN1YnNjcmlwdGlvbnMgdG8gdGhlIFxyXG5cdCAqIHNlYXJjaCBpbnB1dCB2YWx1ZSBjaGFuZ2VzIGFuZCBuZ0NvbnRyb2wgdmFsdWUgY2hhbmdlcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgbmdPbkluaXQoKSB7XHJcblx0XHQvKiBMaXN0ZW4gdG8gdmFsdWUgY2hhbmdlcyBvZiB0aGUgc2VhcmNoIGlucHV0IGFuZCBkZWJvdW5jZSB0aGUgaW5wdXQgKi9cclxuXHRcdHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3QudmFsdWVDaGFuZ2VzXHJcblx0XHRcdC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlKSlcclxuXHRcdFx0LnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdFx0XHR0aGlzLmZpbHRlck9wdGlvbnModik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHQvKiBTdWJzY3JpYmUgdG8gbmdDb250cm9sIHZhbHVlIGNoYW5nZXMgdG8gbWFuYWdlIGNoaXAgbGlzdCAqL1xyXG5cdFx0dGhpcy5uZ0NvbnRyb2w/LnZhbHVlQ2hhbmdlcz8ucGlwZShza2lwKDEpKS5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0aWYgKCF2YWx1ZSkge1xyXG5cdFx0XHRcdHRoaXMuY2hpcHMgPSBbXTtcclxuXHRcdFx0XHR0aGlzLl92YWx1ZSA9IFwiXCI7XHJcblx0XHRcdFx0dGhpcy5hdXRvQ29tcGxldGVDaGlwTGlzdC5zZXRWYWx1ZShcIlwiKTtcclxuXHRcdFx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LmVuYWJsZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIGFmdGVyIGEgY29tcG9uZW50J3MgdmlldyBoYXMgYmVlbiBmdWxseSBpbml0aWFsaXplZC5cclxuXHQgKiBJdCBicm9hZGNhc3RzIG1lZGlhIGNoYW5nZXMgYW5kIGluaXRpYWxpemVzIHRoZSBkYXRhIHNvdXJjZSB3aXRoIHRoZSBjdXJyZW50IHNlcnZpY2UsXHJcblx0ICogcGFnaW5hdG9yLCBhbmQgc29ydCBvcHRpb25zLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHR0aGlzLm1lZGlhLmJyb2FkY2FzdCgpO1xyXG5cclxuXHRcdC8qIEluaXRpYWxpemUgdGhlIGRhdGEgc291cmNlIHdpdGggdGhlIGN1cnJlbnQgc2VydmljZSwgcGFnaW5hdG9yLCBhbmQgc29ydCAqL1xyXG5cdFx0dGhpcy5kYXRhU291cmNlID8/PSBuZXcgVGFibGVEYXRhU291cmNlPGFueSwgYW55Pih0aGlzLnNlcnZpY2UhLCB0aGlzLnBhZ2luYXRvciwgdGhpcy5zb3J0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZyb20gdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHdyaXRlIGEgbmV3IHZhbHVlIFxyXG5cdCAqIHRvIHRoZSBlbGVtZW50LlxyXG5cdCAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB3cml0ZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XHJcblx0XHQvKiBTZXQgdGhlIHZhbHVlIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZSAqL1xyXG5cdFx0dGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuXHJcblx0XHQvKiBDbGVhciB0aGUgY2hpcHMgbGlzdCBmb3IgbmV3IGlucHV0ICovXHJcblx0XHR0aGlzLmNoaXBzID0gW107XHJcblxyXG5cdFx0aWYgKCF0aGlzLmN1c3RvbVZhbHVlICYmIHZhbHVlICYmIHRoaXMuY2hpcHM/Lmxlbmd0aCA8PSAwKSB7XHJcblx0XHRcdHRoaXMubG9hZGluZyA9IHRydWU7XHJcblx0XHRcdGxldCBfcGFyYW1zOiBhbnkgPSB7fTtcclxuXHJcblx0XHRcdC8qIEluY2x1ZGUgcGFyYW1ldGVycyBmcm9tIF9wYXJhbXMgaWYgYXZhaWxhYmxlICovXHJcblx0XHRcdGlmICh0aGlzLl9wYXJhbXM/LmluY2x1ZGVzKSB7XHJcblx0XHRcdFx0X3BhcmFtcy5pbmNsdWRlcyA9IHRoaXMuX3BhcmFtcy5pbmNsdWRlcztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogSW5jbHVkZSBwcm9qZWN0aW9uIGZyb20gX3BhcmFtcyBpZiBhdmFpbGFibGUgKi9cclxuXHRcdFx0aWYgKHRoaXMuX3BhcmFtcz8ucHJvamVjdGlvbikge1xyXG5cdFx0XHRcdF9wYXJhbXMucHJvamVjdGlvbiA9IHRoaXMuX3BhcmFtcy5wcm9qZWN0aW9uO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBBZGQgcHJvamVjdGlvbiBpZiBzcGVjaWZpZWQgKi9cclxuXHRcdFx0aWYgKHRoaXMucHJvamVjdGlvbikge1xyXG5cdFx0XHRcdF9wYXJhbXMucHJvamVjdGlvbiA9IEFycmF5LmlzQXJyYXkodGhpcy5wcm9qZWN0aW9uKSA/IHRoaXMucHJvamVjdGlvbi5qb2luKCcsJykgOiB0aGlzLnByb2plY3Rpb247XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIENvbnN0cnVjdCB0aGUgcmVxdWVzdCBVUkwgKi9cclxuXHRcdFx0dmFyIHVybFBhcnRzOiBzdHJpbmdbXSA9IHRoaXMuc2VydmljZT8uZW5kcG9pbnQ/LnNwbGl0KCc/JykgPz8gW107XHJcblx0XHRcdHRoaXMuc2VydmljZS5odHRwLmdldChgJHt1cmxQYXJ0c1swXX0vJHt2YWx1ZX0ke3VybFBhcnRzLmxlbmd0aCA+IDEgPyBgPyR7dXJsUGFydHNbMV19YCA6ICcnfWAsIHsgcGFyYW1zOiBVdGlscy5jbGVhbk9iamVjdChfcGFyYW1zKSB9KS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6ICh4OiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdC8qIEFkZCB0aGUgcmV0dXJuZWQgaXRlbSBhcyBhIGNoaXAgKi9cclxuXHRcdFx0XHRcdHRoaXMuY2hpcHMucHVzaCh4KTtcclxuXHJcblx0XHRcdFx0XHQvKiBFbWl0IHRoZSBzZWxlY3RlZCBpdGVtICovXHJcblx0XHRcdFx0XHR0aGlzLmluaXRTZWxlY3QuZW1pdCh4KTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLmZvY3VzZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRlcnJvcjogKCkgPT4gdGhpcy5sb2FkaW5nID0gZmFsc2VcclxuXHRcdFx0fSk7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMuY3VzdG9tVmFsdWUpIHtcclxuXHRcdFx0LyogSGFuZGxlIGN1c3RvbSB2YWx1ZSBpbnB1dCAqL1xyXG5cdFx0XHR0aGlzLmNoaXBzID0gdmFsdWUgPyBbeyBbdGhpcy5rZXldOiB2YWx1ZSB9XSA6IFtdO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0LyogQ2xlYXIgdGhlIGlucHV0IGlmIG5vIHZhbHVlIGlzIHByb3ZpZGVkICovXHJcblx0XHRcdHRoaXMuY2xlYXIoZmFsc2UpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29ubmVjdHMgdGhlIGRhdGEgc291cmNlIGFuZCBzdWJzY3JpYmVzIHRvIGRhdGEgY2hhbmdlcy4gXHJcblx0ICogSXQgYWxzbyBzZXRzIHVwIHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycyBmb3IgdGhlIGRhdGEgc291cmNlLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb25uZWN0KCk6IHZvaWQge1xyXG5cdFx0LyogU2V0IHRoZSBkcm9wZG93biB0byBvcGVuICovXHJcblx0XHR0aGlzLm9wZW5lZCA9IHRydWU7XHJcblxyXG5cdFx0LyogQ29uZmlndXJlIGZpZWxkIGZpbHRlcnMgZm9yIHRoZSBkYXRhIHNvdXJjZSAqL1xyXG5cdFx0dGhpcy5kYXRhU291cmNlIS5maWVsZEZpbHRlcnMgPSB0aGlzLmdldFF1ZXJ5UGFyYW1zKCk7XHJcblxyXG5cdFx0LyogTWFudWFsbHkgY29ubmVjdCB0aGUgZGF0YSBzb3VyY2UgZm9yICdtYXQtb3B0aW9uJyB0cmlnZ2VycyAqL1xyXG5cdFx0aWYgKCF0aGlzLmNsYXNzVHlwZSAmJiAhdGhpcy5kYXRhU291cmNlPy5pc0Nvbm5lY3RlZCkge1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZVN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVNvdXJjZT8uY29ubmVjdCgpLnN1YnNjcmliZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiAqL1xyXG5cdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIGZvY3VzIG9uIHRoZSBmaWx0ZXIgaW5wdXQgZWxlbWVudC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZm9jdXMoKTogdm9pZCB7XHJcblx0XHR0aGlzLmZpbHRlcklucHV0Py5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyB0aGUgYmx1ciBldmVudCBvZiB0aGUgaW5wdXQgYm94LiBJZiB0aGUgZm9jdXMgbW92ZXMgYXdheSBmcm9tIGEgXHJcblx0ICogbWF0LW9wdGlvbiwgaXQgYWRkcyB0aGUgY3VycmVudCB2YWx1ZSBhcyBhIGNoaXAuXHJcblx0ICogQHBhcmFtIGV2ZW50IC0gVGhlIGZvY3VzIGV2ZW50LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhZGRPbkJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcclxuXHRcdGNvbnN0IHRhcmdldDogSFRNTEVsZW1lbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cdFx0aWYgKCF0YXJnZXQgfHwgdGFyZ2V0LnRhZ05hbWUgIT09ICdNQVQtT1BUSU9OJykge1xyXG5cdFx0XHRsZXQgdmFsdWU6IHN0cmluZyA9IHRoaXMuZmlsdGVySW5wdXQ/Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlO1xyXG5cdFx0XHRpZiAodmFsdWUpIHtcclxuXHRcdFx0XHR0aGlzLmFkZENoaXAoeyBbdGhpcy5rZXldOiB2YWx1ZSB9LCB0aGlzLmZpbHRlcklucHV0KTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcyBhIGNoaXAgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjbGVhcnMgdGhlIGlucHV0LlxyXG5cdCAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhZGQgYXMgYSBjaGlwLlxyXG5cdCAqIEBwYXJhbSBpbnB1dCAtIFRoZSBpbnB1dCBlbGVtZW50IHRvIHJlc2V0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhZGRDaGlwKHZhbHVlOiBhbnksIGlucHV0OiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIEFkZCB0aGUgbmV3IGNoaXAgKi9cclxuXHRcdHRoaXMuY2hpcHMgPSBbdmFsdWVdO1xyXG5cclxuXHRcdC8qIEVtaXQgdGhlIHNlbGVjdGVkIHZhbHVlICovXHJcblx0XHR0aGlzLnNlbGVjdGVkLmVtaXQodmFsdWUpO1xyXG5cclxuXHRcdC8qIFNldCB0aGUgbmdNb2RlbCB2YWx1ZSAqL1xyXG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlW3RoaXMua2V5XTtcclxuXHJcblx0XHQvKiBEaXNhYmxlIHRoZSBpbnB1dCB0byBhbGxvdyBvbmx5IG9uZSBjaGlwICovXHJcblx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG5cdFx0dGhpcy5hdXRvQ29tcGxldGVDaGlwTGlzdC5wYXRjaFZhbHVlKCcnLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblxyXG5cdFx0LyogUmVzZXQgdGhlIGF1dG9jb21wbGV0ZSBpbnB1dCB0ZXh0IHZhbHVlICovXHJcblx0XHRpZiAoaW5wdXQpIHtcclxuXHRcdFx0aW5wdXQudmFsdWUgPSAnJztcclxuXHRcdH1cclxuXHJcblx0XHQvKiBDbG9zZSB0aGUgYXV0b2NvbXBsZXRlIHBhbmVsIGlmIGl0IGlzIG9wZW4gKi9cclxuXHRcdHRoaXMuYXV0b2NvbXBsZXRlVHJpZ2dlcj8uY2xvc2VQYW5lbCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2xlYXJzIGFsbCBjaGlwcyBhbmQgcmVzZXRzIHRoZSBjb250cm9sIHN0YXRlLlxyXG5cdCAqIEBwYXJhbSB0cmlnZ2VyU3RhdGVDaGFuZ2VzIC0gV2hldGhlciB0byB0cmlnZ2VyIHN0YXRlIGNoYW5nZXMuXHJcblx0ICovXHJcblx0cHVibGljIGNsZWFyKHRyaWdnZXJTdGF0ZUNoYW5nZXM6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcblx0XHQvKiBSZXNldCB0aGUgdmFsdWUgYW5kIGNoaXBzICovXHJcblx0XHR0aGlzLnZhbHVlID0gbnVsbDtcclxuXHRcdHRoaXMuY2hpcHMgPSBbXTtcclxuXHJcblx0XHQvKiBNYXJrIHRoZSBjb250cm9sIGFzIHRvdWNoZWQgKi9cclxuXHRcdGlmICh0aGlzLm5nQ29udHJvbC5jb250cm9sKSB7XHJcblx0XHRcdHRoaXMubmdDb250cm9sLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFJlc2V0IHRoZSBuZ01vZGVsIHZhbHVlICovXHJcblx0XHR0aGlzLmF1dG9Db21wbGV0ZUNoaXBMaXN0LnBhdGNoVmFsdWUoJycsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcblx0XHRpZiAodHJpZ2dlclN0YXRlQ2hhbmdlcykge1xyXG5cdFx0XHR0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogRW5hYmxlIHRoZSBpbnB1dCBmb3IgbmV3IGVudHJpZXMgKi9cclxuXHRcdHRoaXMuYXV0b0NvbXBsZXRlQ2hpcExpc3QuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuXHJcblx0XHQvKiBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRmlsdGVycyB0aGUgb3B0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdGV4dCBpbnB1dC5cclxuXHQgKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGZpbHRlciBvcHRpb25zIGJ5LlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZmlsdGVyT3B0aW9ucyh0ZXh0OiBzdHJpbmcpIHtcclxuXHRcdC8qIFBlcmZvcm0gZmlsdGVyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRleHQgaW5wdXQgKi9cclxuXHRcdGlmICh0aGlzLmRhdGFTb3VyY2UpIHtcclxuXHRcdFx0LyogSW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIGZvciBmaWx0ZXJpbmcgKi9cclxuXHRcdFx0bGV0IF9wYXJhbXM6IGFueVtdID0geyAuLi50aGlzLmdldFF1ZXJ5UGFyYW1zKCkgfTtcclxuXHJcblx0XHRcdGlmICh0ZXh0KSB7XHJcblx0XHRcdFx0LyogQWRkIHNlYXJjaCB0ZXJtIHRvIHBhcmFtZXRlcnMgaWYgYSBzZWFyY2ggZmllbGQgaXMgc3BlY2lmaWVkICovXHJcblx0XHRcdFx0aWYgKHRoaXMuc2VhcmNoRmllbGQgJiYgKHRoaXMuc2VhcmNoRmllbGRzLmxlbmd0aCA/PyAwKSA9PSAwICYmICh0aGlzLmZpbHRlcnM/Lmxlbmd0aCA/PyAwKSA9PSAwKSB7XHJcblx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gbmV3IFJlZ0V4cChgKFxcXFwke3RoaXMuc2VhcmNoT3BlcmF0b3JzLmpvaW4oJ3xcXFxcJyl9KT8oLiopYCkuZXhlYyh0aGlzLnNlYXJjaEZpZWxkKTtcclxuXHRcdFx0XHRcdGlmIChyZXN1bHQpIHtcclxuXHRcdFx0XHRcdFx0X3BhcmFtc1socmVzdWx0IGFzIGFueSlbMl1dID0gYCR7cmVzdWx0WzFdID8gcmVzdWx0WzFdIDogJyd9JHt0ZXh0fWA7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKiBBZGQgc2VhcmNoIHRlcm1zIGZvciBlYWNoIHNwZWNpZmllZCBzZWFyY2ggZmllbGQgKi9cclxuXHRcdFx0XHRpZiAoKHRoaXMuZmlsdGVycz8ubGVuZ3RoID8/IDApID09IDApIHtcclxuXHRcdFx0XHRcdHRoaXMuc2VhcmNoRmllbGRzPy5tYXAoeCA9PiB4LnRyaW0oKSk/LmZvckVhY2goeCA9PiB7XHJcblx0XHRcdFx0XHRcdHZhciByZXN1bHQgPSBuZXcgUmVnRXhwKGAoXFxcXCR7dGhpcy5zZWFyY2hPcGVyYXRvcnMuam9pbignfFxcXFwnKX0pPyguKilgKS5leGVjKHgpO1xyXG5cdFx0XHRcdFx0XHRpZiAocmVzdWx0KSB7XHJcblx0XHRcdFx0XHRcdFx0X3BhcmFtc1socmVzdWx0IGFzIGFueSlbMl1dID0gYCR7cmVzdWx0WzFdID8gcmVzdWx0WzFdIDogJyd9JHt0ZXh0fWA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKCh0aGlzLmZpbHRlcnM/Lmxlbmd0aCA/PyAwKSA+IDApIHtcclxuXHRcdFx0XHRcdC8qIENvbnN0cnVjdCB0aGUgVVJMIGZvciB0aGUgZmlsdGVycyAqL1xyXG5cdFx0XHRcdFx0bGV0IGZpbHRlclF1ZXJ5ID0gJyc7XHJcblxyXG5cdFx0XHRcdFx0LyogSW5jbHVkZSBhZGRpdGlvbmFsIGZpbHRlcnMgaWYgZGVmaW5lZCAqL1xyXG5cdFx0XHRcdFx0dGhpcy5maWx0ZXJzIS5mb3JFYWNoKGZpbHRlciA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHsgZ2x1ZSwgZmllbGRzIH0gPSBmaWx0ZXI7XHJcblx0XHRcdFx0XHRcdGZpZWxkcy5mb3JFYWNoKChmaWVsZCwgaW5kZXgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRjb25zdCB7IG5hbWUsIG9wZXJhdG9yIH0gPSBmaWVsZDtcclxuXHRcdFx0XHRcdFx0XHQvKiBDb25zdHJ1Y3QgdGhlIGZpbHRlciBzdHJpbmcgKi9cclxuXHRcdFx0XHRcdFx0XHRmaWx0ZXJRdWVyeSArPSBgJHtuYW1lfToke29wZXJhdG9yfSR7dGV4dH1gO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBBZGQgZ2x1ZSBpZiBpdCdzIG5vdCB0aGUgbGFzdCBmaWVsZCAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChpbmRleCA8IGZpZWxkcy5sZW5ndGggLSAxIHx8IGZpbHRlciAhPT0gdGhpcy5maWx0ZXJzIVt0aGlzLmZpbHRlcnMhLmxlbmd0aCAtIDFdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRmaWx0ZXJRdWVyeSArPSBgJHtnbHVlfWA7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdC8qIFVwZGF0ZSB0aGUgVVJMIHBhcmFtZXRlcnMgd2l0aCB0aGUgY29uc3RydWN0ZWQgZmlsdGVyIHF1ZXJ5ICovXHJcblx0XHRcdFx0XHRpZiAoZmlsdGVyUXVlcnkpIHtcclxuXHRcdFx0XHRcdFx0X3BhcmFtc1snZmlsdGVycycgYXMgYW55XSA9IGZpbHRlclF1ZXJ5O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogQ2hlY2sgaWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMgdG8gdGhlIHBhcmFtZXRlcnMgKi9cclxuXHRcdFx0aWYgKFV0aWxzLmVxdWFscyh0aGlzLl9wYXJhbXMsIF9wYXJhbXMpKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBVcGRhdGUgcGFyYW1ldGVycyBmb3IgdGhlIGRhdGEgc291cmNlICovXHJcblx0XHRcdHRoaXMuX3BhcmFtcyA9IF9wYXJhbXM7XHJcblxyXG5cdFx0XHQvKiBSZXF1ZXN0IG5ldyByZXN1bHRzIGZyb20gdGhlIHNlcnZlciAqL1xyXG5cdFx0XHR0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2UuYXBwbHlGaWx0ZXJzKHRoaXMuX3BhcmFtcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIHRoZSBldmVudCB3aGVuIGEgY2hpcCBpcyByZW1vdmVkLiBJdCBlbWl0cyB0aGUgY2xlYXJlZCB2YWx1ZSBcclxuXHQgKiBhbmQgb3B0aW9uYWxseSBjbGVhcnMgdGhlIGNoaXBzLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVSZW1vdmVkRXZlbnQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmNsZWFyZWQ/LmVtaXQodGhpcy52YWx1ZSk7XHJcblx0XHRpZiAodGhpcy5yZW1vdmFibGUpIHtcclxuXHRcdFx0dGhpcy5jbGVhcigpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyB0aGUgY2xpY2sgZXZlbnQgb24gdGhlIGxhdW5jaCBidXR0b24sIGVtaXR0aW5nIHRoZSBcclxuXHQgKiBzZWxlY3RlZCBjaGlwIGlmIGF2YWlsYWJsZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlTGF1bmNoQ2xpY2tlZCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmNoaXBzPy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdHRoaXMub25MYXVuY2guZW1pdCh0aGlzLmNoaXBzWzBdKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgZGF0YSBzb3VyY2UuXHJcblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldFF1ZXJ5UGFyYW1zKCk6IGFueSB7XHJcblx0XHQvKiBJbml0aWFsaXplIHBhcmFtZXRlcnMgaWYgbnVsbCAqL1xyXG5cdFx0dmFyIHBhcmFtcyA9IHRoaXMuX3BhcmFtcyB8fCB7fTtcclxuXHJcblx0XHQvKiBJbmNsdWRlIHByb2plY3Rpb24gaWYgc3BlY2lmaWVkICovXHJcblx0XHRpZiAodGhpcy5wcm9qZWN0aW9uKSB7XHJcblx0XHRcdHBhcmFtcy5wcm9qZWN0aW9uID0gdGhpcy5wcm9qZWN0aW9uO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBwYXJhbXM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGVhbnVwIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBpbnN0YW5jZSBcclxuXHQgKiBpcyBkZXN0cm95ZWQuIEl0IHVuc3Vic2NyaWJlcyBmcm9tIHRoZSBkYXRhIHNvdXJjZSBzdWJzY3JpcHRpb24uXHJcblx0ICovXHJcblx0cHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5kYXRhU291cmNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG5cdH1cclxufSIsIjxtYXQtY2hpcC1ncmlkICNjaGlwTGlzdCBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIiBbZGlzYWJsZWRdPVwicmVhZG9ubHlcIj5cclxuXHQ8IS0tICNyZWdpb24gQ2hpcHMgLS0+XHJcblx0PG1hdC1jaGlwLXJvdyAqbmdGb3I9XCJsZXQgY2hpcCBvZiBjaGlwczsgbGV0IGZpcnN0ID0gZmlyc3Q7IGxldCBpbmRleCA9IGluZGV4XCIgW3JlbW92YWJsZV09XCIhcmVhZG9ubHlcIiAocmVtb3ZlZCk9XCJoYW5kbGVSZW1vdmVkRXZlbnQoKVwiIGRpc2FibGVSaXBwbGU+XHJcblx0XHQ8c3BhbiBjbGFzcz1cInZkLWNoaXAtY29udGVudFwiPlxyXG5cdFx0XHQ8c3BhbiAqbmdJZj1cIiFjaGlwVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCI+XHJcblx0XHRcdFx0PHNwYW4gKm5nSWY9XCIhYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCI+e3sgY2hpcCB9fTwvc3Bhbj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWYhXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgb3B0aW9uOiBjaGlwIH1cIj48L25nLXRlbXBsYXRlPlxyXG5cdFx0XHQ8L3NwYW4+XHJcblx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImNoaXBUZW1wbGF0ZT8udGVtcGxhdGVSZWZcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGlwVGVtcGxhdGU/LnRlbXBsYXRlUmVmIVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNoaXA6IGNoaXAgfVwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHQ8L3NwYW4+XHJcblx0XHQ8YSBtYXRDaGlwVHJhaWxpbmdJY29uICpuZ0Zvcj1cImxldCBidXR0b24gb2Ygc3VmZml4QnV0dG9uczsgbGV0IGZpcnN0ID0gZmlyc3RcIiBbaGlkZGVuXT1cImJ1dHRvbi5oaWRlICYmIGJ1dHRvbi5oaWRlKGNoaXBzWzBdLCBjb250ZXh0KVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGJ1dHRvbi5ldmVudCAmJiBidXR0b24uZXZlbnQoY2hpcHNbMF0sIGNvbnRleHQpXCI+XHJcblx0XHRcdDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPnt7YnV0dG9uLmljb259fTwvbWF0LWljb24+XHJcblx0XHQ8L2E+XHJcblx0XHQ8YSBtYXRDaGlwVHJhaWxpbmdJY29uICpuZ0lmPVwiKG9uTGF1bmNoPy5vYnNlcnZlcnM/Lmxlbmd0aD8/MCkgPiAwXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgaGFuZGxlTGF1bmNoQ2xpY2tlZCgpXCI+XHJcblx0XHRcdDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmxhdW5jaDwvbWF0LWljb24+XHJcblx0XHQ8L2E+XHJcblx0XHQ8YSBtYXRDaGlwVHJhaWxpbmdJY29uICpuZ0lmPVwiIXJlYWRvbmx5XCIgKGNsaWNrKT1cImhhbmRsZVJlbW92ZWRFdmVudCgpXCI+XHJcblx0XHRcdDxtYXQtaWNvbiBmb250U2V0PVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmNsb3NlPC9tYXQtaWNvbj5cclxuXHRcdDwvYT5cclxuXHQ8L21hdC1jaGlwLXJvdz5cclxuXHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBTZWFyY2ggYm94IC0tPlxyXG5cdDxpbnB1dCBtYXRJbnB1dCBbaGlkZGVuXT1cInZhbHVlICYmICFlbXB0eVwiIHBsYWNlaG9sZGVyPVwie3twbGFjZWhvbGRlcn19XCIgKGZvY3VzKT1cImNvbm5lY3QoKVwiIFtyZWFkb25seV09XCJyZWFkb25seVwiIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIiBbbWF0QXV0b2NvbXBsZXRlQ29ubmVjdGVkVG9dPVwib3JpZ2luXCIgW2Zvcm1Db250cm9sXT1cImF1dG9Db21wbGV0ZUNoaXBMaXN0XCIgKGJsdXIpPVwiY3VzdG9tVmFsdWUgJiYgYWRkT25CbHVyKCRldmVudClcIiAjZmlsdGVySW5wdXQgLz5cclxuXHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBSZXNldCBidXR0b24gLS0+XHJcblx0PGEgdHJhaWxpbmdJY29uICpuZ0lmPVwiKCF2YWx1ZSB8fCBlbXB0eSkgJiYgIXJlYWRvbmx5ICYmICFkaXNhYmxlZFwiIGNsYXNzPVwibWF0LW1kYy1zZWxlY3QtYXJyb3dcIiAoY2xpY2spPVwiZmlsdGVySW5wdXQudmFsdWUgPSAnJ1wiPlxyXG5cdFx0PHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNHB4XCIgaGVpZ2h0PVwiMjRweFwiIGZvY3VzYWJsZT1cImZhbHNlXCIgY2xhc3M9XCJuZy10bnMtYzE4NC0yMVwiPlxyXG5cdFx0XHQ8cGF0aCBkPVwiTTcgMTBsNSA1IDUtNXpcIiBjbGFzcz1cIm5nLXRucy1jMTg0LTIxXCI+PC9wYXRoPlxyXG5cdFx0PC9zdmc+XHJcblx0PC9hPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuPC9tYXQtY2hpcC1ncmlkPlxyXG5cclxuPCEtLSAjcmVnaW9uIEF1dG9jb21wbGV0ZSAtLT5cclxuPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwiYWRkQ2hpcCgkZXZlbnQub3B0aW9uLnZhbHVlLCBmaWx0ZXJJbnB1dClcIiBjbGFzcz1cInt7YXV0b2NvbXBsZXRlQ3NzQ2xhc3N9fXt7Y2xhc3NUeXBlPycgdGFibGUtYXV0b2NvbXBsZXRlJzonJ319XCI+XHJcblx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiIWNsYXNzVHlwZSAmJiBvcGVuZWRcIiBsZXQtaXRlbSBsZXQtZmlyc3Q9XCJmaXJzdFwiIG5nRm9yIFtuZ0Zvck9mXT1cImRhdGFTb3VyY2U/Lml0ZW1zXCI+XHJcblx0XHQ8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbVwiPlxyXG5cdFx0XHQ8c3BhbiAqbmdJZj1cIiFhdXRvY29tcGxldGVPcHRpb25UZW1wbGF0ZT8udGVtcGxhdGVSZWZcIj57e2l0ZW19fTwvc3Bhbj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYXV0b2NvbXBsZXRlT3B0aW9uVGVtcGxhdGU/LnRlbXBsYXRlUmVmIVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG9wdGlvbjogaXRlbSB9XCI+PC9uZy10ZW1wbGF0ZT5cclxuXHRcdDwvbWF0LW9wdGlvbj5cclxuXHQ8L25nLXRlbXBsYXRlPlxyXG5cdDxuZy1jb250YWluZXIgKm5nSWY9XCJjbGFzc1R5cGUgJiYgb3BlbmVkXCI+XHJcblx0XHQ8bWF0LW9wdGlvbiBoaWRlPVwidHJ1ZVwiPjwvbWF0LW9wdGlvbj5cclxuXHRcdDx2ZC1keW5hbWljLXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBbY2xhc3NUeXBlXT1cImNsYXNzVHlwZVwiIFtzdGlja3lIZWFkZXJdPVwidHJ1ZVwiIChyb3dDbGljayk9XCJhZGRDaGlwKCRldmVudCwgZmlsdGVySW5wdXQpXCIgbWF0U29ydCBbc29ydEFjdGl2ZV09XCJzb3J0QWN0aXZlfHwnaWQnXCIgW3NvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiPjwvdmQtZHluYW1pYy10YWJsZT5cclxuXHQ8L25nLWNvbnRhaW5lcj5cclxuXHQ8ZGl2IGNsYXNzPVwidmQtY2hpcHMtcGFnaW5hdG9yXCI+XHJcblx0XHQ8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuXHRcdDxtYXQtcGFnaW5hdG9yIFtsZW5ndGhdPVwiZGF0YVNvdXJjZT8udG90YWxcIiBbcGFnZUluZGV4XT1cImRhdGFTb3VyY2U/LnBhZ2VJbmRleFwiIFtwYWdlU2l6ZV09XCJkYXRhU291cmNlPy5wYWdlU2l6ZVwiIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCIgc2hvd0ZpcnN0TGFzdEJ1dHRvbnM9XCJ0cnVlXCIgaGlkZVBhZ2VTaXplPVwidHJ1ZVwiPjwvbWF0LXBhZ2luYXRvcj5cclxuXHQ8L2Rpdj5cclxuPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG48IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG48ZGl2IG1hdEF1dG9jb21wbGV0ZU9yaWdpbiAjb3JpZ2luPVwibWF0QXV0b2NvbXBsZXRlT3JpZ2luXCIgY2xhc3M9XCJhdXRvY29tcGxldGUtb3JpZ2luXCI+PC9kaXY+Il19
|