ngx-dropdown-list 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +2 -2
  2. package/esm2020/ngx-dropdown-list.mjs +5 -0
  3. package/esm2020/public_api.mjs +2 -0
  4. package/esm2020/src/ngx-dropdown-list/anchor/anchor.component.mjs +149 -0
  5. package/esm2020/src/ngx-dropdown-list/dropdown/dropdown.component.mjs +252 -0
  6. package/esm2020/src/ngx-dropdown-list/dropdown-list.component.mjs +233 -0
  7. package/esm2020/src/ngx-dropdown-list/dropdown-list.module.mjs +38 -0
  8. package/esm2020/src/ngx-dropdown-list/filter/input-filter.component.mjs +44 -0
  9. package/esm2020/src/ngx-dropdown-list/group-item/group-item.component.mjs +25 -0
  10. package/esm2020/src/ngx-dropdown-list/index.mjs +3 -0
  11. package/esm2020/src/ngx-dropdown-list/item/item.component.mjs +77 -0
  12. package/esm2020/src/ngx-dropdown-list/types/index.mjs +3 -0
  13. package/esm2020/src/ngx-dropdown-list/types/selection-group-items.types.mjs +2 -0
  14. package/esm2020/src/ngx-dropdown-list/types/selection-item.types.mjs +2 -0
  15. package/esm2020/src/ngx-dropdown-list/utils/util.mjs +59 -0
  16. package/fesm2015/ngx-dropdown-list.mjs +854 -0
  17. package/fesm2015/ngx-dropdown-list.mjs.map +1 -0
  18. package/fesm2020/ngx-dropdown-list.mjs +854 -0
  19. package/fesm2020/ngx-dropdown-list.mjs.map +1 -0
  20. package/ngx-dropdown-list.d.ts +1 -5
  21. package/package.json +26 -48
  22. package/src/ngx-dropdown-list/anchor/anchor.component.d.ts +6 -3
  23. package/src/ngx-dropdown-list/dropdown/dropdown.component.d.ts +5 -2
  24. package/src/ngx-dropdown-list/dropdown-list.component.d.ts +7 -4
  25. package/src/ngx-dropdown-list/dropdown-list.module.d.ts +12 -0
  26. package/src/ngx-dropdown-list/filter/input-filter.component.d.ts +3 -0
  27. package/src/ngx-dropdown-list/group-item/group-item.component.d.ts +3 -0
  28. package/src/ngx-dropdown-list/item/item.component.d.ts +3 -0
  29. package/bundles/ngx-dropdown-list.umd.js +0 -1212
  30. package/bundles/ngx-dropdown-list.umd.js.map +0 -1
  31. package/bundles/ngx-dropdown-list.umd.min.js +0 -2
  32. package/bundles/ngx-dropdown-list.umd.min.js.map +0 -1
  33. package/esm2015/ngx-dropdown-list.js +0 -14
  34. package/esm2015/public_api.js +0 -6
  35. package/esm2015/src/ngx-dropdown-list/anchor/anchor.component.js +0 -226
  36. package/esm2015/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -351
  37. package/esm2015/src/ngx-dropdown-list/dropdown-list.component.js +0 -290
  38. package/esm2015/src/ngx-dropdown-list/dropdown-list.module.js +0 -32
  39. package/esm2015/src/ngx-dropdown-list/filter/input-filter.component.js +0 -64
  40. package/esm2015/src/ngx-dropdown-list/group-item/group-item.component.js +0 -37
  41. package/esm2015/src/ngx-dropdown-list/index.js +0 -7
  42. package/esm2015/src/ngx-dropdown-list/item/item.component.js +0 -104
  43. package/esm2015/src/ngx-dropdown-list/types/index.js +0 -7
  44. package/esm2015/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
  45. package/esm2015/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
  46. package/esm2015/src/ngx-dropdown-list/utils/util.js +0 -101
  47. package/esm5/ngx-dropdown-list.js +0 -14
  48. package/esm5/public_api.js +0 -6
  49. package/esm5/src/ngx-dropdown-list/anchor/anchor.component.js +0 -272
  50. package/esm5/src/ngx-dropdown-list/dropdown/dropdown.component.js +0 -420
  51. package/esm5/src/ngx-dropdown-list/dropdown-list.component.js +0 -361
  52. package/esm5/src/ngx-dropdown-list/dropdown-list.module.js +0 -36
  53. package/esm5/src/ngx-dropdown-list/filter/input-filter.component.js +0 -79
  54. package/esm5/src/ngx-dropdown-list/group-item/group-item.component.js +0 -47
  55. package/esm5/src/ngx-dropdown-list/index.js +0 -7
  56. package/esm5/src/ngx-dropdown-list/item/item.component.js +0 -120
  57. package/esm5/src/ngx-dropdown-list/types/index.js +0 -7
  58. package/esm5/src/ngx-dropdown-list/types/selection-group-items.types.js +0 -16
  59. package/esm5/src/ngx-dropdown-list/types/selection-item.types.js +0 -20
  60. package/esm5/src/ngx-dropdown-list/utils/util.js +0 -124
  61. package/fesm2015/ngx-dropdown-list.js +0 -930
  62. package/fesm2015/ngx-dropdown-list.js.map +0 -1
  63. package/fesm5/ngx-dropdown-list.js +0 -1177
  64. package/fesm5/ngx-dropdown-list.js.map +0 -1
  65. package/ngx-dropdown-list-1.1.2.tgz +0 -0
  66. package/ngx-dropdown-list.metadata.json +0 -1
@@ -1,420 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
6
- import { clearAllSelection, getFirstSelectedItem, hasGroup, stopPropagationAndDefault } from '../utils/util';
7
- var DropdownComponent = /** @class */ (function () {
8
- function DropdownComponent() {
9
- /**
10
- * bind to [checkbox], the flag for multi-select (checkbox) mode.
11
- */
12
- this.checkbox = false;
13
- /**
14
- * bind to [filterBox] for displaying the filter input text box
15
- */
16
- this.filterBox = false;
17
- /**
18
- * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
19
- */
20
- this.allowClear = true;
21
- /**
22
- * bind to [formatNumber] for show formatted number text
23
- */
24
- this.formatNumber = false;
25
- /**
26
- * for 2-way binding of [selectedValue]
27
- */
28
- this.selectedValueChange = new EventEmitter(true);
29
- /**
30
- * [selectionChange] event that will be triggered when changing of the selection
31
- */
32
- this.selectionChange = new EventEmitter(true);
33
- /**
34
- * [dropdownBlur] event that will be triggered with (blur) of dropdown
35
- */
36
- this.dropdownBlur = new EventEmitter();
37
- /**
38
- * [itemClick] event that will be triggered when clicking the option of dropdown
39
- */
40
- this.itemClick = new EventEmitter();
41
- /**
42
- * flag of clicking dropdown. It's to prevent (blur) of dropdown from happening in checkbox mode.
43
- */
44
- this._clickedItems = false;
45
- }
46
- /**
47
- * @param {?} changes
48
- * @return {?}
49
- */
50
- DropdownComponent.prototype.ngOnChanges = /**
51
- * @param {?} changes
52
- * @return {?}
53
- */
54
- function (changes) {
55
- if (changes.items) {
56
- this._checkSelectionChange(changes.items.previousValue, changes.items.currentValue);
57
- }
58
- };
59
- /**
60
- * triggered when clicking the dropdown
61
- */
62
- /**
63
- * triggered when clicking the dropdown
64
- * @param {?} event
65
- * @return {?}
66
- */
67
- DropdownComponent.prototype.onItemsClick = /**
68
- * triggered when clicking the dropdown
69
- * @param {?} event
70
- * @return {?}
71
- */
72
- function (event) {
73
- if (event.offsetX > (event.target.clientWidth + event.target.clientLeft)) {
74
- stopPropagationAndDefault(event);
75
- return;
76
- }
77
- // should ignore clicking on filter
78
- if (this.checkbox && event.target.type !== 'text') {
79
- this._clickedItems = true;
80
- }
81
- };
82
- /**
83
- * triggered when clicking the item
84
- */
85
- /**
86
- * triggered when clicking the item
87
- * @param {?} currentItem
88
- * @return {?}
89
- */
90
- DropdownComponent.prototype.onItemClick = /**
91
- * triggered when clicking the item
92
- * @param {?} currentItem
93
- * @return {?}
94
- */
95
- function (currentItem) {
96
- if (!this.checkbox) {
97
- this.selectedValue = this._getItemValue(currentItem); // currentItem.value != null ? currentItem.value : currentItem.text;
98
- clearAllSelection(this.items);
99
- // set the selection of current one
100
- currentItem.selected = true;
101
- this.itemClick.emit(currentItem);
102
- this._onSelectionChange(this.selectedValue);
103
- }
104
- };
105
- /**
106
- * triggers with (blur) event of filter input box
107
- */
108
- /**
109
- * triggers with (blur) event of filter input box
110
- * @param {?} event
111
- * @return {?}
112
- */
113
- DropdownComponent.prototype.onFilterTextBlur = /**
114
- * triggers with (blur) event of filter input box
115
- * @param {?} event
116
- * @return {?}
117
- */
118
- function (event) {
119
- this.dropdownBlur.emit(event);
120
- };
121
- /**
122
- * triggers with (blur) event of dropdown
123
- */
124
- /**
125
- * triggers with (blur) event of dropdown
126
- * @param {?} event
127
- * @return {?}
128
- */
129
- DropdownComponent.prototype.onItemsBlur = /**
130
- * triggers with (blur) event of dropdown
131
- * @param {?} event
132
- * @return {?}
133
- */
134
- function (event) {
135
- if (this.checkbox) {
136
- if (this._clickedItems) {
137
- // in checkbox mode, this blur event will be ignored when clicking the dropdown (check the checkbox)
138
- event.target.focus();
139
- this._clickedItems = false;
140
- return;
141
- }
142
- }
143
- this.dropdownBlur.emit(event);
144
- };
145
- /**
146
- * toggle the selection when checking status changed (in checkbox mode)
147
- */
148
- /**
149
- * toggle the selection when checking status changed (in checkbox mode)
150
- * @param {?} item
151
- * @return {?}
152
- */
153
- DropdownComponent.prototype.toggleSelection = /**
154
- * toggle the selection when checking status changed (in checkbox mode)
155
- * @param {?} item
156
- * @return {?}
157
- */
158
- function (item) {
159
- item.selected = !item.selected;
160
- this.selectionChange.emit(this._getItemValue(item)); // item.value != null ? item.value : item.text);
161
- };
162
- Object.defineProperty(DropdownComponent.prototype, "itemsValues", {
163
- /**
164
- * items values list after applying the filter
165
- */
166
- get: /**
167
- * items values list after applying the filter
168
- * @return {?}
169
- */
170
- function () {
171
- /** @type {?} */
172
- var filter;
173
- if (this.filterValue) {
174
- filter = this.filterValue.toUpperCase();
175
- }
176
- if (filter == null) {
177
- return this.items;
178
- }
179
- if (!this.items || this.items.length === 0) {
180
- return [];
181
- }
182
- if (hasGroup(this.items)) {
183
- /** @type {?} */
184
- var items_1 = [];
185
- this.items.forEach((/**
186
- * @param {?} groupItem
187
- * @return {?}
188
- */
189
- function (groupItem) {
190
- if (groupItem.group != null && groupItem.group.toString().toUpperCase().includes(filter)) {
191
- // if groupItem contains the filters, the groupItem needs to be displayed as well
192
- items_1.push(groupItem);
193
- }
194
- else {
195
- /** @type {?} */
196
- var filteredItems = groupItem.items.filter((/**
197
- * @param {?} item
198
- * @return {?}
199
- */
200
- function (item) { return item.text != null && item.text.toString().toUpperCase().includes(filter); }));
201
- if (filteredItems && filteredItems.length > 0) {
202
- items_1.push({ group: groupItem.group, items: filteredItems });
203
- }
204
- }
205
- }));
206
- return items_1;
207
- }
208
- else {
209
- return this.items.filter((/**
210
- * @param {?} item
211
- * @return {?}
212
- */
213
- function (item) { return (item.text != null && item.text.toString().toUpperCase().includes(filter)); }));
214
- }
215
- },
216
- enumerable: true,
217
- configurable: true
218
- });
219
- Object.defineProperty(DropdownComponent.prototype, "optionsClass", {
220
- /**
221
- * options CSS class
222
- */
223
- get: /**
224
- * options CSS class
225
- * @return {?}
226
- */
227
- function () {
228
- if (this.filterBox && !this.checkbox) {
229
- return 'options with-filter';
230
- }
231
- else {
232
- return 'options no-filter';
233
- }
234
- },
235
- enumerable: true,
236
- configurable: true
237
- });
238
- /**
239
- * get item value. Return text if value is not available
240
- */
241
- /**
242
- * get item value. Return text if value is not available
243
- * @private
244
- * @param {?} item
245
- * @return {?}
246
- */
247
- DropdownComponent.prototype._getItemValue = /**
248
- * get item value. Return text if value is not available
249
- * @private
250
- * @param {?} item
251
- * @return {?}
252
- */
253
- function (item) {
254
- return item ? item.value != null ? item.value : item.text : undefined;
255
- };
256
- /**
257
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
258
- */
259
- /**
260
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
261
- * @private
262
- * @param {?} value
263
- * @return {?}
264
- */
265
- DropdownComponent.prototype._onSelectionChange = /**
266
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
267
- * @private
268
- * @param {?} value
269
- * @return {?}
270
- */
271
- function (value) {
272
- this.selectedValueChange.emit(value);
273
- this.selectionChange.emit(value);
274
- };
275
- /**
276
- * check whether the selection is changed. Emits relative events when if changed.
277
- */
278
- /**
279
- * check whether the selection is changed. Emits relative events when if changed.
280
- * @private
281
- * @param {?} previousValue
282
- * @param {?} currentValue
283
- * @return {?}
284
- */
285
- DropdownComponent.prototype._checkSelectionChange = /**
286
- * check whether the selection is changed. Emits relative events when if changed.
287
- * @private
288
- * @param {?} previousValue
289
- * @param {?} currentValue
290
- * @return {?}
291
- */
292
- function (previousValue, currentValue) {
293
- /** @type {?} */
294
- var curSelectedItem = getFirstSelectedItem(currentValue);
295
- /** @type {?} */
296
- var lastSelectedItem = getFirstSelectedItem(previousValue);
297
- /** @type {?} */
298
- var curSelectedItemId = curSelectedItem ? curSelectedItem.id : undefined;
299
- /** @type {?} */
300
- var lastSelectedItemId = lastSelectedItem ? lastSelectedItem.id : undefined;
301
- if (curSelectedItemId !== lastSelectedItemId && !this.checkbox) {
302
- this._onSelectionChange(this._getItemValue(curSelectedItem));
303
- }
304
- };
305
- DropdownComponent.decorators = [
306
- { type: Component, args: [{
307
- selector: 'dropdown',
308
- template: "\n <span #dropdown class=\"dropdown\" tabindex=\"3\" (mousedown)=\"onItemsClick($event)\" (blur)=\"onItemsBlur($event)\" *ngIf=\"!disabled\" >\n <input-filter #filterInput tabindex=\"4\" *ngIf=\"filterBox && !checkbox\" [(filterValue)]=\"filterValue\" (inputFilterBlur)=\"onFilterTextBlur($event)\"></input-filter>\n <span #selectionOptions [ngClass]=\"optionsClass\">\n <ng-container *ngFor=\"let item of itemsValues\" >\n <ng-container *ngIf=\"item && item.group\">\n <group-item [item]=\"item\"></group-item>\n <item *ngFor=\"let subItem of item.items\" (itemClick)=\"onItemClick(subItem)\" (checkStatusChange)=\"toggleSelection(subItem)\"\n [item]=\"subItem\" [checkbox]=\"checkbox\" [formatNumber]=\"formatNumber\" [suffixText]=\"suffixText\">\n </item>\n </ng-container>\n <ng-container *ngIf=\"item && !item.group\">\n <item (itemClick)=\"onItemClick(item)\" (checkStatusChange)=\"toggleSelection(item)\"\n [item]=\"item\" [checkbox]=\"checkbox\" [formatNumber]=\"formatNumber\" [suffixText]=\"suffixText\">\n </item>\n </ng-container>\n </ng-container>\n </span>\n </span>\n ",
309
- styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.dropdown{width:100%;padding:0;display:none;margin:0;border:1px solid #66afe9;border-top:none;border-bottom:none;border-top-right-radius:0;border-top-left-radius:0;box-sizing:border-box;position:relative;z-index:999}.dropdown:focus{outline:0}.dropdown .options{width:calc(100% + 2px);left:0;box-sizing:border-box;background:#fff;position:absolute;max-height:228px;overflow-y:auto;overflow-x:hidden;border:1px solid #66afe9;border-top:none;border-bottom-right-radius:4px;border-bottom-left-radius:4px;margin-left:-1px;margin-right:-1px}.dropdown .with-filter{top:32px}.dropdown .no-filter{top:0}"]
310
- }] }
311
- ];
312
- DropdownComponent.propDecorators = {
313
- dropdownRef: [{ type: ViewChild, args: ['dropdown', { read: ElementRef },] }],
314
- filterInputRef: [{ type: ViewChild, args: ['filterInput', { read: ElementRef },] }],
315
- placeHolder: [{ type: Input }],
316
- items: [{ type: Input }],
317
- checkbox: [{ type: Input }],
318
- selectedValue: [{ type: Input }],
319
- filterBox: [{ type: Input }],
320
- suffixText: [{ type: Input }],
321
- disabled: [{ type: Input }],
322
- allowClear: [{ type: Input }],
323
- formatNumber: [{ type: Input }],
324
- selectedValueChange: [{ type: Output }],
325
- selectionChange: [{ type: Output }],
326
- dropdownBlur: [{ type: Output }],
327
- itemClick: [{ type: Output }]
328
- };
329
- return DropdownComponent;
330
- }());
331
- export { DropdownComponent };
332
- if (false) {
333
- /**
334
- * Child element reference of dropdown
335
- * @type {?}
336
- */
337
- DropdownComponent.prototype.dropdownRef;
338
- /**
339
- * Child element reference of filter input text
340
- * @type {?}
341
- */
342
- DropdownComponent.prototype.filterInputRef;
343
- /**
344
- * bind to [placeHolder] for displaying the place holder string of the anchor.
345
- * @type {?}
346
- */
347
- DropdownComponent.prototype.placeHolder;
348
- /**
349
- * bind to [items] for the options/groups in the dropdown
350
- * @type {?}
351
- */
352
- DropdownComponent.prototype.items;
353
- /**
354
- * bind to [checkbox], the flag for multi-select (checkbox) mode.
355
- * @type {?}
356
- */
357
- DropdownComponent.prototype.checkbox;
358
- /**
359
- * bind to [selectedValue] for the value of the selected option from dropdown
360
- * @type {?}
361
- */
362
- DropdownComponent.prototype.selectedValue;
363
- /**
364
- * bind to [filterBox] for displaying the filter input text box
365
- * @type {?}
366
- */
367
- DropdownComponent.prototype.filterBox;
368
- /**
369
- * bind to [suffixText] for displaying the suffix of the selected text of anchor
370
- * @type {?}
371
- */
372
- DropdownComponent.prototype.suffixText;
373
- /**
374
- * bind to [disabled] for disabling the dropdown
375
- * @type {?}
376
- */
377
- DropdownComponent.prototype.disabled;
378
- /**
379
- * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
380
- * @type {?}
381
- */
382
- DropdownComponent.prototype.allowClear;
383
- /**
384
- * bind to [formatNumber] for show formatted number text
385
- * @type {?}
386
- */
387
- DropdownComponent.prototype.formatNumber;
388
- /**
389
- * for 2-way binding of [selectedValue]
390
- * @type {?}
391
- */
392
- DropdownComponent.prototype.selectedValueChange;
393
- /**
394
- * [selectionChange] event that will be triggered when changing of the selection
395
- * @type {?}
396
- */
397
- DropdownComponent.prototype.selectionChange;
398
- /**
399
- * [dropdownBlur] event that will be triggered with (blur) of dropdown
400
- * @type {?}
401
- */
402
- DropdownComponent.prototype.dropdownBlur;
403
- /**
404
- * [itemClick] event that will be triggered when clicking the option of dropdown
405
- * @type {?}
406
- */
407
- DropdownComponent.prototype.itemClick;
408
- /**
409
- * filter value
410
- * @type {?}
411
- */
412
- DropdownComponent.prototype.filterValue;
413
- /**
414
- * flag of clicking dropdown. It's to prevent (blur) of dropdown from happening in checkbox mode.
415
- * @type {?}
416
- * @private
417
- */
418
- DropdownComponent.prototype._clickedItems;
419
- }
420
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWRyb3Bkb3duLWxpc3QvIiwic291cmNlcyI6WyJzcmMvbmd4LWRyb3Bkb3duLWxpc3QvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RILE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFM0c7SUFBQTs7OztRQTZDVyxhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBUWpCLGNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7UUFZbEIsZUFBVSxHQUFHLElBQUksQ0FBQzs7OztRQUlsQixpQkFBWSxHQUFHLEtBQUssQ0FBQzs7OztRQUlwQix3QkFBbUIsR0FBRyxJQUFJLFlBQVksQ0FBUyxJQUFJLENBQUMsQ0FBQzs7OztRQUlyRCxvQkFBZSxHQUFHLElBQUksWUFBWSxDQUFNLElBQUksQ0FBQyxDQUFDOzs7O1FBSTlDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7OztRQUl2QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7OztRQVF0QyxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQXlJaEMsQ0FBQzs7Ozs7SUF2SUMsdUNBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNqQixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRjtJQUNILENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0gsd0NBQVk7Ozs7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MUMsU0FBUyxTQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7OEJBSTdDLEtBQUs7d0JBSUwsS0FBSzsyQkFJTCxLQUFLO2dDQUlMLEtBQUs7NEJBSUwsS0FBSzs2QkFJTCxLQUFLOzJCQUlMLEtBQUs7NkJBSUwsS0FBSzsrQkFJTCxLQUFLO3NDQUlMLE1BQU07a0NBSU4sTUFBTTsrQkFJTixNQUFNOzRCQUlOLE1BQU07O0lBaUpULHdCQUFDO0NBQUEsQUF0T0QsSUFzT0M7U0E3TVksaUJBQWlCOzs7Ozs7SUFJNUIsd0NBQXFFOzs7OztJQUlyRSwyQ0FBMkU7Ozs7O0lBSTNFLHdDQUE2Qjs7Ozs7SUFJN0Isa0NBQXNCOzs7OztJQUl0QixxQ0FBMEI7Ozs7O0lBSTFCLDBDQUE0Qjs7Ozs7SUFJNUIsc0NBQTJCOzs7OztJQUkzQix1Q0FBNEI7Ozs7O0lBSTVCLHFDQUEyQjs7Ozs7SUFJM0IsdUNBQTJCOzs7OztJQUkzQix5Q0FBOEI7Ozs7O0lBSTlCLGdEQUErRDs7Ozs7SUFJL0QsNENBQXdEOzs7OztJQUl4RCx5Q0FBaUQ7Ozs7O0lBSWpELHNDQUE4Qzs7Ozs7SUFJOUMsd0NBQW9COzs7Ozs7SUFJcEIsMENBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge2NsZWFyQWxsU2VsZWN0aW9uLCBnZXRGaXJzdFNlbGVjdGVkSXRlbSwgaGFzR3JvdXAsIHN0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHR9IGZyb20gJy4uL3V0aWxzL3V0aWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkcm9wZG93bicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxzcGFuICNkcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCIgdGFiaW5kZXg9XCIzXCIgKG1vdXNlZG93bik9XCJvbkl0ZW1zQ2xpY2soJGV2ZW50KVwiIChibHVyKT1cIm9uSXRlbXNCbHVyKCRldmVudClcIiAqbmdJZj1cIiFkaXNhYmxlZFwiID5cclxuICAgICAgPGlucHV0LWZpbHRlciAjZmlsdGVySW5wdXQgdGFiaW5kZXg9XCI0XCIgKm5nSWY9XCJmaWx0ZXJCb3ggJiYgIWNoZWNrYm94XCIgWyhmaWx0ZXJWYWx1ZSldPVwiZmlsdGVyVmFsdWVcIiAoaW5wdXRGaWx0ZXJCbHVyKT1cIm9uRmlsdGVyVGV4dEJsdXIoJGV2ZW50KVwiPjwvaW5wdXQtZmlsdGVyPlxyXG4gICAgICA8c3BhbiAjc2VsZWN0aW9uT3B0aW9ucyBbbmdDbGFzc109XCJvcHRpb25zQ2xhc3NcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zVmFsdWVzXCIgPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0gJiYgaXRlbS5ncm91cFwiPlxyXG4gICAgICAgICAgICA8Z3JvdXAtaXRlbSBbaXRlbV09XCJpdGVtXCI+PC9ncm91cC1pdGVtPlxyXG4gICAgICAgICAgICA8aXRlbSAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLml0ZW1zXCIgKGl0ZW1DbGljayk9XCJvbkl0ZW1DbGljayhzdWJJdGVtKVwiIChjaGVja1N0YXR1c0NoYW5nZSk9XCJ0b2dnbGVTZWxlY3Rpb24oc3ViSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbaXRlbV09XCJzdWJJdGVtXCIgW2NoZWNrYm94XT1cImNoZWNrYm94XCIgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIiBbc3VmZml4VGV4dF09XCJzdWZmaXhUZXh0XCI+XHJcbiAgICAgICAgICAgIDwvaXRlbT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0gJiYgIWl0ZW0uZ3JvdXBcIj5cclxuICAgICAgICAgICAgPGl0ZW0gKGl0ZW1DbGljayk9XCJvbkl0ZW1DbGljayhpdGVtKVwiIChjaGVja1N0YXR1c0NoYW5nZSk9XCJ0b2dnbGVTZWxlY3Rpb24oaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCIgW2NoZWNrYm94XT1cImNoZWNrYm94XCIgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIiBbc3VmZml4VGV4dF09XCJzdWZmaXhUZXh0XCI+XHJcbiAgICAgICAgICAgIDwvaXRlbT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbiAgYCxcclxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIC8qKlxyXG4gICAqIENoaWxkIGVsZW1lbnQgcmVmZXJlbmNlIG9mIGRyb3Bkb3duXHJcbiAgICovXHJcbiAgQFZpZXdDaGlsZCgnZHJvcGRvd24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgZHJvcGRvd25SZWY6IEVsZW1lbnRSZWY7XHJcbiAgLyoqXHJcbiAgICogQ2hpbGQgZWxlbWVudCByZWZlcmVuY2Ugb2YgZmlsdGVyIGlucHV0IHRleHRcclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdmaWx0ZXJJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBmaWx0ZXJJbnB1dFJlZjogRWxlbWVudFJlZjtcclxuICAvKipcclxuICAgKiBiaW5kIHRvIFtwbGFjZUhvbGRlcl0gZm9yIGRpc3BsYXlpbmcgdGhlIHBsYWNlIGhvbGRlciBzdHJpbmcgb2YgdGhlIGFuY2hvci5cclxuICAgKi9cclxuICBASW5wdXQoKSBwbGFjZUhvbGRlcjogc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIGJpbmQgdG8gW2l0ZW1zXSBmb3IgdGhlIG9wdGlvbnMvZ3JvdXBzIGluIHRoZSBkcm9wZG93blxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGl0ZW1zOiBhbnlbXTtcclxuICAvKipcclxuICAgKiBiaW5kIHRvIFtjaGVja2JveF0sIHRoZSBmbGFnIGZvciBtdWx0aS1zZWxlY3QgKGNoZWNrYm94KSBtb2RlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNoZWNrYm94ID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogYmluZCB0byBbc2VsZWN0ZWRWYWx1ZV0gZm9yIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZyb20gZHJvcGRvd25cclxuICAgKi9cclxuICBASW5wdXQoKSBzZWxlY3RlZFZhbHVlOiBhbnk7XHJcbiAgLyoqXHJcbiAgICogYmluZCB0byBbZmlsdGVyQm94XSBmb3IgZGlzcGxheWluZyB0aGUgZmlsdGVyIGlucHV0IHRleHQgYm94XHJcbiAgICovXHJcbiAgQElucHV0KCkgZmlsdGVyQm94ID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogYmluZCB0byBbc3VmZml4VGV4dF0gZm9yIGRpc3BsYXlpbmcgdGhlIHN1ZmZpeCBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBvZiBhbmNob3JcclxuICAgKi9cclxuICBASW5wdXQoKSBzdWZmaXhUZXh0OiBzdHJpbmc7XHJcbiAgLyoqXHJcbiAgICogYmluZCB0byBbZGlzYWJsZWRdIGZvciBkaXNhYmxpbmcgdGhlIGRyb3Bkb3duXHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgLyoqXHJcbiAgICogYmluZCB0byBbYWxsb3dDbGVhcl0gZm9yIGVuYWJsaW5nIHRoZSBjbGVhcmFuY2UgKGNsZWFyYW5jZSBpcyBub3QgYXZhaWFibGUgd2hlbiBjaGVja2JveCBpcyBlbmFibGVkKVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGFsbG93Q2xlYXIgPSB0cnVlO1xyXG4gIC8qKlxyXG4gICAqIGJpbmQgdG8gW2Zvcm1hdE51bWJlcl0gZm9yIHNob3cgZm9ybWF0dGVkIG51bWJlciB0ZXh0XHJcbiAgICovXHJcbiAgQElucHV0KCkgZm9ybWF0TnVtYmVyID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogZm9yIDItd2F5IGJpbmRpbmcgb2YgW3NlbGVjdGVkVmFsdWVdXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4odHJ1ZSk7XHJcbiAgLyoqXHJcbiAgICogW3NlbGVjdGlvbkNoYW5nZV0gZXZlbnQgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNoYW5naW5nIG9mIHRoZSBzZWxlY3Rpb25cclxuICAgKi9cclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KHRydWUpO1xyXG4gIC8qKlxyXG4gICAqIFtkcm9wZG93bkJsdXJdIGV2ZW50IHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCAoYmx1cikgb2YgZHJvcGRvd25cclxuICAgKi9cclxuICBAT3V0cHV0KCkgZHJvcGRvd25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgLyoqXHJcbiAgICogW2l0ZW1DbGlja10gZXZlbnQgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNsaWNraW5nIHRoZSBvcHRpb24gb2YgZHJvcGRvd25cclxuICAgKi9cclxuICBAT3V0cHV0KCkgaXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgLyoqXHJcbiAgICogZmlsdGVyIHZhbHVlXHJcbiAgICovXHJcbiAgZmlsdGVyVmFsdWU6IHN0cmluZztcclxuICAvKipcclxuICAgKiBmbGFnIG9mIGNsaWNraW5nIGRyb3Bkb3duLiBJdCdzIHRvIHByZXZlbnQgKGJsdXIpIG9mIGRyb3Bkb3duIGZyb20gaGFwcGVuaW5nIGluIGNoZWNrYm94IG1vZGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfY2xpY2tlZEl0ZW1zID0gZmFsc2U7XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLml0ZW1zKSB7XHJcbiAgICAgIHRoaXMuX2NoZWNrU2VsZWN0aW9uQ2hhbmdlKGNoYW5nZXMuaXRlbXMucHJldmlvdXNWYWx1ZSwgY2hhbmdlcy5pdGVtcy5jdXJyZW50VmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGRyb3Bkb3duXHJcbiAgICovXHJcbiAgb25JdGVtc0NsaWNrKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5vZmZzZXRYID4gKGV2ZW50LnRhcmdldC5jbGllbnRXaWR0aCArIGV2ZW50LnRhcmdldC5jbGllbnRMZWZ0KSkge1xyXG4gICAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gc2hvdWxkIGlnbm9yZSBjbGlja2luZyBvbiBmaWx0ZXJcclxuICAgIGlmICh0aGlzLmNoZWNrYm94ICYmIGV2ZW50LnRhcmdldC50eXBlICE9PSAndGV4dCcpIHtcclxuICAgICAgdGhpcy5fY2xpY2tlZEl0ZW1zID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHRyaWdnZXJlZCB3aGVuIGNsaWNraW5nIHRoZSBpdGVtXHJcbiAgICovXHJcbiAgb25JdGVtQ2xpY2soY3VycmVudEl0ZW0pOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jaGVja2JveCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLl9nZXRJdGVtVmFsdWUoY3VycmVudEl0ZW0pOyAvLyBjdXJyZW50SXRlbS52YWx1ZSAhPSBudWxsID8gY3VycmVudEl0ZW0udmFsdWUgOiBjdXJyZW50SXRlbS50ZXh0O1xyXG4gICAgICBjbGVhckFsbFNlbGVjdGlvbih0aGlzLml0ZW1zKTtcclxuICAgICAgLy8gc2V0IHRoZSBzZWxlY3Rpb24gb2YgY3VycmVudCBvbmVcclxuICAgICAgY3VycmVudEl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLml0ZW1DbGljay5lbWl0KGN1cnJlbnRJdGVtKTtcclxuICAgICAgdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UodGhpcy5zZWxlY3RlZFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHRyaWdnZXJzIHdpdGggKGJsdXIpIGV2ZW50IG9mIGZpbHRlciBpbnB1dCBib3hcclxuICAgKi9cclxuICBvbkZpbHRlclRleHRCbHVyKGV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmRyb3Bkb3duQmx1ci5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHRyaWdnZXJzIHdpdGggKGJsdXIpIGV2ZW50IG9mIGRyb3Bkb3duXHJcbiAgICovXHJcbiAgb25JdGVtc0JsdXIoZXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNoZWNrYm94KSB7XHJcbiAgICAgIGlmICh0aGlzLl9jbGlja2VkSXRlbXMpIHtcclxuICAgICAgICAvLyBpbiBjaGVja2JveCBtb2RlLCB0aGlzIGJsdXIgZXZlbnQgd2lsbCBiZSBpZ25vcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGRyb3Bkb3duIChjaGVjayB0aGUgY2hlY2tib3gpXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LmZvY3VzKCk7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tlZEl0ZW1zID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmRyb3Bkb3duQmx1ci5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHRvZ2dsZSB0aGUgc2VsZWN0aW9uIHdoZW4gY2hlY2tpbmcgc3RhdHVzIGNoYW5nZWQgKGluIGNoZWNrYm94IG1vZGUpXHJcbiAgICovXHJcbiAgdG9nZ2xlU2VsZWN0aW9uKGl0ZW06IHtpZDogc3RyaW5nLCB2YWx1ZT86IGFueSwgdGV4dDogYW55LCBzZWxlY3RlZD86IGJvb2xlYW59KTogdm9pZCB7XHJcbiAgICBpdGVtLnNlbGVjdGVkID0gIWl0ZW0uc2VsZWN0ZWQ7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuX2dldEl0ZW1WYWx1ZShpdGVtKSk7IC8vIGl0ZW0udmFsdWUgIT0gbnVsbCA/IGl0ZW0udmFsdWUgOiBpdGVtLnRleHQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogaXRlbXMgdmFsdWVzIGxpc3QgYWZ0ZXIgYXBwbHlpbmcgdGhlIGZpbHRlclxyXG4gICAqL1xyXG4gIGdldCBpdGVtc1ZhbHVlcygpOiBhbnlbXSB7XHJcbiAgICBsZXQgZmlsdGVyO1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyVmFsdWUpIHtcclxuICAgICAgZmlsdGVyID0gdGhpcy5maWx0ZXJWYWx1ZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pdGVtcztcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5pdGVtcyB8fCB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICBpZiAoaGFzR3JvdXAodGhpcy5pdGVtcykpIHtcclxuICAgICAgY29uc3QgaXRlbXMgPSBbXTtcclxuICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGdyb3VwSXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKGdyb3VwSXRlbS5ncm91cCAhPSBudWxsICYmIGdyb3VwSXRlbS5ncm91cC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSkge1xyXG4gICAgICAgICAgLy8gaWYgZ3JvdXBJdGVtIGNvbnRhaW5zIHRoZSBmaWx0ZXJzLCB0aGUgZ3JvdXBJdGVtIG5lZWRzIHRvIGJlIGRpc3BsYXllZCBhcyB3ZWxsXHJcbiAgICAgICAgICBpdGVtcy5wdXNoKGdyb3VwSXRlbSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSBncm91cEl0ZW0uaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS50ZXh0ICE9IG51bGwgJiYgaXRlbS50ZXh0LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpKTtcclxuICAgICAgICAgIGlmIChmaWx0ZXJlZEl0ZW1zICYmIGZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtncm91cDogZ3JvdXBJdGVtLmdyb3VwLCBpdGVtczogZmlsdGVyZWRJdGVtc30pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IChpdGVtLnRleHQgIT0gbnVsbCAmJiBpdGVtLnRleHQudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlcikpKTtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogb3B0aW9ucyBDU1MgY2xhc3NcclxuICAgKi9cclxuICBnZXQgb3B0aW9uc0NsYXNzKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJCb3ggJiYgIXRoaXMuY2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuICdvcHRpb25zIHdpdGgtZmlsdGVyJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnb3B0aW9ucyBuby1maWx0ZXInO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IGl0ZW0gdmFsdWUuIFJldHVybiB0ZXh0IGlmIHZhbHVlIGlzIG5vdCBhdmFpbGFibGVcclxuICAgKi9cclxuICBwcml2YXRlIF9nZXRJdGVtVmFsdWUoaXRlbSk6IGFueSB7XHJcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0udmFsdWUgIT0gbnVsbCA/IGl0ZW0udmFsdWUgOiBpdGVtLnRleHQgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBzZWxlY3Rpb24gY2hhbmdlZCwgZW1pdHMgZXZlbnRzOiAoc2VsZWN0ZWRWYWx1ZUNoYW5nZSkgYW5kIChzZWxlY3Rpb25DaGFuZ2UpO1xyXG4gICAqL1xyXG4gIHByaXZhdGUgX29uU2VsZWN0aW9uQ2hhbmdlKHZhbHVlKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBjaGFuZ2VkLiBFbWl0cyByZWxhdGl2ZSBldmVudHMgd2hlbiBpZiBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NoZWNrU2VsZWN0aW9uQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkge1xyXG4gICAgY29uc3QgY3VyU2VsZWN0ZWRJdGVtID0gZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0oY3VycmVudFZhbHVlKTtcclxuICAgIGNvbnN0IGxhc3RTZWxlY3RlZEl0ZW0gPSBnZXRGaXJzdFNlbGVjdGVkSXRlbShwcmV2aW91c1ZhbHVlKTtcclxuICAgIGNvbnN0IGN1clNlbGVjdGVkSXRlbUlkID0gY3VyU2VsZWN0ZWRJdGVtID8gY3VyU2VsZWN0ZWRJdGVtLmlkIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgbGFzdFNlbGVjdGVkSXRlbUlkID0gbGFzdFNlbGVjdGVkSXRlbSA/IGxhc3RTZWxlY3RlZEl0ZW0uaWQgOiB1bmRlZmluZWQ7XHJcbiAgICBpZiAoY3VyU2VsZWN0ZWRJdGVtSWQgIT09IGxhc3RTZWxlY3RlZEl0ZW1JZCAmJiAhdGhpcy5jaGVja2JveCkge1xyXG4gICAgICB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZSh0aGlzLl9nZXRJdGVtVmFsdWUoY3VyU2VsZWN0ZWRJdGVtKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==