ngx-dropdown-list 1.1.0 → 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 (65) 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 -1180
  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 -339
  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 -73
  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 -408
  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 -96
  61. package/fesm2015/ngx-dropdown-list.js +0 -890
  62. package/fesm2015/ngx-dropdown-list.js.map +0 -1
  63. package/fesm5/ngx-dropdown-list.js +0 -1137
  64. package/fesm5/ngx-dropdown-list.js.map +0 -1
  65. package/ngx-dropdown-list.metadata.json +0 -1
@@ -1,408 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,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(function (groupItem) {
186
- if (groupItem.group != null && groupItem.group.toString().toUpperCase().includes(filter)) {
187
- // if groupItem contains the filters, the groupItem needs to be displayed as well
188
- items_1.push(groupItem);
189
- }
190
- else {
191
- /** @type {?} */
192
- var filteredItems = groupItem.items.filter(function (item) { return item.text != null && item.text.toString().toUpperCase().includes(filter); });
193
- if (filteredItems && filteredItems.length > 0) {
194
- items_1.push({ group: groupItem.group, items: filteredItems });
195
- }
196
- }
197
- });
198
- return items_1;
199
- }
200
- else {
201
- return this.items.filter(function (item) { return (item.text != null && item.text.toString().toUpperCase().includes(filter)); });
202
- }
203
- },
204
- enumerable: true,
205
- configurable: true
206
- });
207
- Object.defineProperty(DropdownComponent.prototype, "optionsClass", {
208
- /**
209
- * options CSS class
210
- */
211
- get: /**
212
- * options CSS class
213
- * @return {?}
214
- */
215
- function () {
216
- if (this.filterBox && !this.checkbox) {
217
- return 'options with-filter';
218
- }
219
- else {
220
- return 'options no-filter';
221
- }
222
- },
223
- enumerable: true,
224
- configurable: true
225
- });
226
- /**
227
- * get item value. Return text if value is not available
228
- */
229
- /**
230
- * get item value. Return text if value is not available
231
- * @private
232
- * @param {?} item
233
- * @return {?}
234
- */
235
- DropdownComponent.prototype._getItemValue = /**
236
- * get item value. Return text if value is not available
237
- * @private
238
- * @param {?} item
239
- * @return {?}
240
- */
241
- function (item) {
242
- return item ? item.value != null ? item.value : item.text : undefined;
243
- };
244
- /**
245
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
246
- */
247
- /**
248
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
249
- * @private
250
- * @param {?} value
251
- * @return {?}
252
- */
253
- DropdownComponent.prototype._onSelectionChange = /**
254
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
255
- * @private
256
- * @param {?} value
257
- * @return {?}
258
- */
259
- function (value) {
260
- this.selectedValueChange.emit(value);
261
- this.selectionChange.emit(value);
262
- };
263
- /**
264
- * check whether the selection is changed. Emits relative events when if changed.
265
- */
266
- /**
267
- * check whether the selection is changed. Emits relative events when if changed.
268
- * @private
269
- * @param {?} previousValue
270
- * @param {?} currentValue
271
- * @return {?}
272
- */
273
- DropdownComponent.prototype._checkSelectionChange = /**
274
- * check whether the selection is changed. Emits relative events when if changed.
275
- * @private
276
- * @param {?} previousValue
277
- * @param {?} currentValue
278
- * @return {?}
279
- */
280
- function (previousValue, currentValue) {
281
- /** @type {?} */
282
- var curSelectedItem = getFirstSelectedItem(currentValue);
283
- /** @type {?} */
284
- var lastSelectedItem = getFirstSelectedItem(previousValue);
285
- /** @type {?} */
286
- var curSelectedItemId = curSelectedItem ? curSelectedItem.id : undefined;
287
- /** @type {?} */
288
- var lastSelectedItemId = lastSelectedItem ? lastSelectedItem.id : undefined;
289
- if (curSelectedItemId !== lastSelectedItemId && !this.checkbox) {
290
- this._onSelectionChange(this._getItemValue(curSelectedItem));
291
- }
292
- };
293
- DropdownComponent.decorators = [
294
- { type: Component, args: [{
295
- selector: 'dropdown',
296
- 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 ",
297
- 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}"]
298
- }] }
299
- ];
300
- DropdownComponent.propDecorators = {
301
- dropdownRef: [{ type: ViewChild, args: ['dropdown', { read: ElementRef },] }],
302
- filterInputRef: [{ type: ViewChild, args: ['filterInput', { read: ElementRef },] }],
303
- placeHolder: [{ type: Input }],
304
- items: [{ type: Input }],
305
- checkbox: [{ type: Input }],
306
- selectedValue: [{ type: Input }],
307
- filterBox: [{ type: Input }],
308
- suffixText: [{ type: Input }],
309
- disabled: [{ type: Input }],
310
- allowClear: [{ type: Input }],
311
- formatNumber: [{ type: Input }],
312
- selectedValueChange: [{ type: Output }],
313
- selectionChange: [{ type: Output }],
314
- dropdownBlur: [{ type: Output }],
315
- itemClick: [{ type: Output }]
316
- };
317
- return DropdownComponent;
318
- }());
319
- export { DropdownComponent };
320
- if (false) {
321
- /**
322
- * Child element reference of dropdown
323
- * @type {?}
324
- */
325
- DropdownComponent.prototype.dropdownRef;
326
- /**
327
- * Child element reference of filter input text
328
- * @type {?}
329
- */
330
- DropdownComponent.prototype.filterInputRef;
331
- /**
332
- * bind to [placeHolder] for displaying the place holder string of the anchor.
333
- * @type {?}
334
- */
335
- DropdownComponent.prototype.placeHolder;
336
- /**
337
- * bind to [items] for the options/groups in the dropdown
338
- * @type {?}
339
- */
340
- DropdownComponent.prototype.items;
341
- /**
342
- * bind to [checkbox], the flag for multi-select (checkbox) mode.
343
- * @type {?}
344
- */
345
- DropdownComponent.prototype.checkbox;
346
- /**
347
- * bind to [selectedValue] for the value of the selected option from dropdown
348
- * @type {?}
349
- */
350
- DropdownComponent.prototype.selectedValue;
351
- /**
352
- * bind to [filterBox] for displaying the filter input text box
353
- * @type {?}
354
- */
355
- DropdownComponent.prototype.filterBox;
356
- /**
357
- * bind to [suffixText] for displaying the suffix of the selected text of anchor
358
- * @type {?}
359
- */
360
- DropdownComponent.prototype.suffixText;
361
- /**
362
- * bind to [disabled] for disabling the dropdown
363
- * @type {?}
364
- */
365
- DropdownComponent.prototype.disabled;
366
- /**
367
- * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
368
- * @type {?}
369
- */
370
- DropdownComponent.prototype.allowClear;
371
- /**
372
- * bind to [formatNumber] for show formatted number text
373
- * @type {?}
374
- */
375
- DropdownComponent.prototype.formatNumber;
376
- /**
377
- * for 2-way binding of [selectedValue]
378
- * @type {?}
379
- */
380
- DropdownComponent.prototype.selectedValueChange;
381
- /**
382
- * [selectionChange] event that will be triggered when changing of the selection
383
- * @type {?}
384
- */
385
- DropdownComponent.prototype.selectionChange;
386
- /**
387
- * [dropdownBlur] event that will be triggered with (blur) of dropdown
388
- * @type {?}
389
- */
390
- DropdownComponent.prototype.dropdownBlur;
391
- /**
392
- * [itemClick] event that will be triggered when clicking the option of dropdown
393
- * @type {?}
394
- */
395
- DropdownComponent.prototype.itemClick;
396
- /**
397
- * filter value
398
- * @type {?}
399
- */
400
- DropdownComponent.prototype.filterValue;
401
- /**
402
- * flag of clicking dropdown. It's to prevent (blur) of dropdown from happening in checkbox mode.
403
- * @type {?}
404
- * @private
405
- */
406
- DropdownComponent.prototype._clickedItems;
407
- }
408
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWRyb3Bkb3duLWxpc3QvIiwic291cmNlcyI6WyJzcmMvbmd4LWRyb3Bkb3duLWxpc3QvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RILE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFM0c7SUFBQTs7OztRQTZDVyxhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBUWpCLGNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7UUFZbEIsZUFBVSxHQUFHLElBQUksQ0FBQzs7OztRQUlsQixpQkFBWSxHQUFHLEtBQUssQ0FBQzs7OztRQUlwQix3QkFBbUIsR0FBRyxJQUFJLFlBQVksQ0FBUyxJQUFJLENBQUMsQ0FBQzs7OztRQUlyRCxvQkFBZSxHQUFHLElBQUksWUFBWSxDQUFNLElBQUksQ0FBQyxDQUFDOzs7O1FBSTlDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7OztRQUl2QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQzs7OztRQVF0QyxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQXlJaEMsQ0FBQzs7Ozs7SUF2SUMsdUNBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNqQixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRjtJQUNILENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0gsd0NBQVk7Ozs7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LGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7OEJBSTdDLEtBQUs7d0JBSUwsS0FBSzsyQkFJTCxLQUFLO2dDQUlMLEtBQUs7NEJBSUwsS0FBSzs2QkFJTCxLQUFLOzJCQUlMLEtBQUs7NkJBSUwsS0FBSzsrQkFJTCxLQUFLO3NDQUlMLE1BQU07a0NBSU4sTUFBTTsrQkFJTixNQUFNOzRCQUlOLE1BQU07O0lBaUpULHdCQUFDO0NBQUEsQUF0T0QsSUFzT0M7U0E3TVksaUJBQWlCOzs7Ozs7SUFJNUIsd0NBQXFFOzs7OztJQUlyRSwyQ0FBMkU7Ozs7O0lBSTNFLHdDQUE2Qjs7Ozs7SUFJN0Isa0NBQXNCOzs7OztJQUl0QixxQ0FBMEI7Ozs7O0lBSTFCLDBDQUE0Qjs7Ozs7SUFJNUIsc0NBQTJCOzs7OztJQUkzQix1Q0FBNEI7Ozs7O0lBSTVCLHFDQUEyQjs7Ozs7SUFJM0IsdUNBQTJCOzs7OztJQUkzQix5Q0FBOEI7Ozs7O0lBSTlCLGdEQUErRDs7Ozs7SUFJL0QsNENBQXdEOzs7OztJQUl4RCx5Q0FBaUQ7Ozs7O0lBSWpELHNDQUE4Qzs7Ozs7SUFJOUMsd0NBQW9COzs7Ozs7SUFJcEIsMENBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjbGVhckFsbFNlbGVjdGlvbiwgZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0sIGhhc0dyb3VwLCBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0fSBmcm9tICcuLi91dGlscy91dGlsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZHJvcGRvd24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxzcGFuICNkcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCIgdGFiaW5kZXg9XCIzXCIgKG1vdXNlZG93bik9XCJvbkl0ZW1zQ2xpY2soJGV2ZW50KVwiIChibHVyKT1cIm9uSXRlbXNCbHVyKCRldmVudClcIiAqbmdJZj1cIiFkaXNhYmxlZFwiID5cbiAgICAgIDxpbnB1dC1maWx0ZXIgI2ZpbHRlcklucHV0IHRhYmluZGV4PVwiNFwiICpuZ0lmPVwiZmlsdGVyQm94ICYmICFjaGVja2JveFwiIFsoZmlsdGVyVmFsdWUpXT1cImZpbHRlclZhbHVlXCIgKGlucHV0RmlsdGVyQmx1cik9XCJvbkZpbHRlclRleHRCbHVyKCRldmVudClcIj48L2lucHV0LWZpbHRlcj5cbiAgICAgIDxzcGFuICNzZWxlY3Rpb25PcHRpb25zIFtuZ0NsYXNzXT1cIm9wdGlvbnNDbGFzc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zVmFsdWVzXCIgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtICYmIGl0ZW0uZ3JvdXBcIj5cbiAgICAgICAgICAgIDxncm91cC1pdGVtIFtpdGVtXT1cIml0ZW1cIj48L2dyb3VwLWl0ZW0+XG4gICAgICAgICAgICA8aXRlbSAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLml0ZW1zXCIgKGl0ZW1DbGljayk9XCJvbkl0ZW1DbGljayhzdWJJdGVtKVwiIChjaGVja1N0YXR1c0NoYW5nZSk9XCJ0b2dnbGVTZWxlY3Rpb24oc3ViSXRlbSlcIlxuICAgICAgICAgICAgICAgICAgW2l0ZW1dPVwic3ViSXRlbVwiIFtjaGVja2JveF09XCJjaGVja2JveFwiIFtmb3JtYXROdW1iZXJdPVwiZm9ybWF0TnVtYmVyXCIgW3N1ZmZpeFRleHRdPVwic3VmZml4VGV4dFwiPlxuICAgICAgICAgICAgPC9pdGVtPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtICYmICFpdGVtLmdyb3VwXCI+XG4gICAgICAgICAgICA8aXRlbSAoaXRlbUNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCIgKGNoZWNrU3RhdHVzQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdGlvbihpdGVtKVwiXG4gICAgICAgICAgICAgICAgICBbaXRlbV09XCJpdGVtXCIgW2NoZWNrYm94XT1cImNoZWNrYm94XCIgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIiBbc3VmZml4VGV4dF09XCJzdWZmaXhUZXh0XCI+XG4gICAgICAgICAgICA8L2l0ZW0+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIENoaWxkIGVsZW1lbnQgcmVmZXJlbmNlIG9mIGRyb3Bkb3duXG4gICAqL1xuICBAVmlld0NoaWxkKCdkcm9wZG93bicsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBkcm9wZG93blJlZjogRWxlbWVudFJlZjtcbiAgLyoqXG4gICAqIENoaWxkIGVsZW1lbnQgcmVmZXJlbmNlIG9mIGZpbHRlciBpbnB1dCB0ZXh0XG4gICAqL1xuICBAVmlld0NoaWxkKCdmaWx0ZXJJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBmaWx0ZXJJbnB1dFJlZjogRWxlbWVudFJlZjtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3BsYWNlSG9sZGVyXSBmb3IgZGlzcGxheWluZyB0aGUgcGxhY2UgaG9sZGVyIHN0cmluZyBvZiB0aGUgYW5jaG9yLlxuICAgKi9cbiAgQElucHV0KCkgcGxhY2VIb2xkZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2l0ZW1zXSBmb3IgdGhlIG9wdGlvbnMvZ3JvdXBzIGluIHRoZSBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgaXRlbXM6IGFueVtdO1xuICAvKipcbiAgICogYmluZCB0byBbY2hlY2tib3hdLCB0aGUgZmxhZyBmb3IgbXVsdGktc2VsZWN0IChjaGVja2JveCkgbW9kZS5cbiAgICovXG4gIEBJbnB1dCgpIGNoZWNrYm94ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzZWxlY3RlZFZhbHVlXSBmb3IgdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gZnJvbSBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRWYWx1ZTogYW55O1xuICAvKipcbiAgICogYmluZCB0byBbZmlsdGVyQm94XSBmb3IgZGlzcGxheWluZyB0aGUgZmlsdGVyIGlucHV0IHRleHQgYm94XG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJCb3ggPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3N1ZmZpeFRleHRdIGZvciBkaXNwbGF5aW5nIHRoZSBzdWZmaXggb2YgdGhlIHNlbGVjdGVkIHRleHQgb2YgYW5jaG9yXG4gICAqL1xuICBASW5wdXQoKSBzdWZmaXhUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtkaXNhYmxlZF0gZm9yIGRpc2FibGluZyB0aGUgZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xuICAvKipcbiAgICogYmluZCB0byBbYWxsb3dDbGVhcl0gZm9yIGVuYWJsaW5nIHRoZSBjbGVhcmFuY2UgKGNsZWFyYW5jZSBpcyBub3QgYXZhaWFibGUgd2hlbiBjaGVja2JveCBpcyBlbmFibGVkKVxuICAgKi9cbiAgQElucHV0KCkgYWxsb3dDbGVhciA9IHRydWU7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtmb3JtYXROdW1iZXJdIGZvciBzaG93IGZvcm1hdHRlZCBudW1iZXIgdGV4dFxuICAgKi9cbiAgQElucHV0KCkgZm9ybWF0TnVtYmVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiBmb3IgMi13YXkgYmluZGluZyBvZiBbc2VsZWN0ZWRWYWx1ZV1cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KHRydWUpO1xuICAvKipcbiAgICogW3NlbGVjdGlvbkNoYW5nZV0gZXZlbnQgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNoYW5naW5nIG9mIHRoZSBzZWxlY3Rpb25cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4odHJ1ZSk7XG4gIC8qKlxuICAgKiBbZHJvcGRvd25CbHVyXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdpdGggKGJsdXIpIG9mIGRyb3Bkb3duXG4gICAqL1xuICBAT3V0cHV0KCkgZHJvcGRvd25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKlxuICAgKiBbaXRlbUNsaWNrXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIG9wdGlvbiBvZiBkcm9wZG93blxuICAgKi9cbiAgQE91dHB1dCgpIGl0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvKipcbiAgICogZmlsdGVyIHZhbHVlXG4gICAqL1xuICBmaWx0ZXJWYWx1ZTogc3RyaW5nO1xuICAvKipcbiAgICogZmxhZyBvZiBjbGlja2luZyBkcm9wZG93bi4gSXQncyB0byBwcmV2ZW50IChibHVyKSBvZiBkcm9wZG93biBmcm9tIGhhcHBlbmluZyBpbiBjaGVja2JveCBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2xpY2tlZEl0ZW1zID0gZmFsc2U7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLml0ZW1zKSB7XG4gICAgICB0aGlzLl9jaGVja1NlbGVjdGlvbkNoYW5nZShjaGFuZ2VzLml0ZW1zLnByZXZpb3VzVmFsdWUsIGNoYW5nZXMuaXRlbXMuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGRyb3Bkb3duXG4gICAqL1xuICBvbkl0ZW1zQ2xpY2soZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmIChldmVudC5vZmZzZXRYID4gKGV2ZW50LnRhcmdldC5jbGllbnRXaWR0aCArIGV2ZW50LnRhcmdldC5jbGllbnRMZWZ0KSkge1xuICAgICAgc3RvcFByb3BhZ2F0aW9uQW5kRGVmYXVsdChldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHNob3VsZCBpZ25vcmUgY2xpY2tpbmcgb24gZmlsdGVyXG4gICAgaWYgKHRoaXMuY2hlY2tib3ggJiYgZXZlbnQudGFyZ2V0LnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgdGhpcy5fY2xpY2tlZEl0ZW1zID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGl0ZW1cbiAgICovXG4gIG9uSXRlbUNsaWNrKGN1cnJlbnRJdGVtKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoZWNrYm94KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLl9nZXRJdGVtVmFsdWUoY3VycmVudEl0ZW0pOyAvLyBjdXJyZW50SXRlbS52YWx1ZSAhPSBudWxsID8gY3VycmVudEl0ZW0udmFsdWUgOiBjdXJyZW50SXRlbS50ZXh0O1xuICAgICAgY2xlYXJBbGxTZWxlY3Rpb24odGhpcy5pdGVtcyk7XG4gICAgICAvLyBzZXQgdGhlIHNlbGVjdGlvbiBvZiBjdXJyZW50IG9uZVxuICAgICAgY3VycmVudEl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pdGVtQ2xpY2suZW1pdChjdXJyZW50SXRlbSk7XG4gICAgICB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZSh0aGlzLnNlbGVjdGVkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyB3aXRoIChibHVyKSBldmVudCBvZiBmaWx0ZXIgaW5wdXQgYm94XG4gICAqL1xuICBvbkZpbHRlclRleHRCbHVyKGV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kcm9wZG93bkJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcnMgd2l0aCAoYmx1cikgZXZlbnQgb2YgZHJvcGRvd25cbiAgICovXG4gIG9uSXRlbXNCbHVyKGV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tib3gpIHtcbiAgICAgIGlmICh0aGlzLl9jbGlja2VkSXRlbXMpIHtcbiAgICAgICAgLy8gaW4gY2hlY2tib3ggbW9kZSwgdGhpcyBibHVyIGV2ZW50IHdpbGwgYmUgaWdub3JlZCB3aGVuIGNsaWNraW5nIHRoZSBkcm9wZG93biAoY2hlY2sgdGhlIGNoZWNrYm94KVxuICAgICAgICBldmVudC50YXJnZXQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5fY2xpY2tlZEl0ZW1zID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcm9wZG93bkJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdG9nZ2xlIHRoZSBzZWxlY3Rpb24gd2hlbiBjaGVja2luZyBzdGF0dXMgY2hhbmdlZCAoaW4gY2hlY2tib3ggbW9kZSlcbiAgICovXG4gIHRvZ2dsZVNlbGVjdGlvbihpdGVtOiB7aWQ6IHN0cmluZywgdmFsdWU/OiBhbnksIHRleHQ6IGFueSwgc2VsZWN0ZWQ/OiBib29sZWFufSk6IHZvaWQge1xuICAgIGl0ZW0uc2VsZWN0ZWQgPSAhaXRlbS5zZWxlY3RlZDtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuX2dldEl0ZW1WYWx1ZShpdGVtKSk7IC8vIGl0ZW0udmFsdWUgIT0gbnVsbCA/IGl0ZW0udmFsdWUgOiBpdGVtLnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGl0ZW1zIHZhbHVlcyBsaXN0IGFmdGVyIGFwcGx5aW5nIHRoZSBmaWx0ZXJcbiAgICovXG4gIGdldCBpdGVtc1ZhbHVlcygpOiBhbnlbXSB7XG4gICAgbGV0IGZpbHRlcjtcbiAgICBpZiAodGhpcy5maWx0ZXJWYWx1ZSkge1xuICAgICAgZmlsdGVyID0gdGhpcy5maWx0ZXJWYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXM7XG4gICAgfVxuICAgIGlmICghdGhpcy5pdGVtcyB8fCB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoaGFzR3JvdXAodGhpcy5pdGVtcykpIHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgICB0aGlzLml0ZW1zLmZvckVhY2goZ3JvdXBJdGVtID0+IHtcbiAgICAgICAgaWYgKGdyb3VwSXRlbS5ncm91cCAhPSBudWxsICYmIGdyb3VwSXRlbS5ncm91cC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSkge1xuICAgICAgICAgIC8vIGlmIGdyb3VwSXRlbSBjb250YWlucyB0aGUgZmlsdGVycywgdGhlIGdyb3VwSXRlbSBuZWVkcyB0byBiZSBkaXNwbGF5ZWQgYXMgd2VsbFxuICAgICAgICAgIGl0ZW1zLnB1c2goZ3JvdXBJdGVtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zID0gZ3JvdXBJdGVtLml0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0udGV4dCAhPSBudWxsICYmIGl0ZW0udGV4dC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSk7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkSXRlbXMgJiYgZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKHtncm91cDogZ3JvdXBJdGVtLmdyb3VwLCBpdGVtczogZmlsdGVyZWRJdGVtc30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLml0ZW1zLmZpbHRlcihpdGVtID0+IChpdGVtLnRleHQgIT0gbnVsbCAmJiBpdGVtLnRleHQudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlcikpKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIG9wdGlvbnMgQ1NTIGNsYXNzXG4gICAqL1xuICBnZXQgb3B0aW9uc0NsYXNzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmlsdGVyQm94ICYmICF0aGlzLmNoZWNrYm94KSB7XG4gICAgICByZXR1cm4gJ29wdGlvbnMgd2l0aC1maWx0ZXInO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ29wdGlvbnMgbm8tZmlsdGVyJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IGl0ZW0gdmFsdWUuIFJldHVybiB0ZXh0IGlmIHZhbHVlIGlzIG5vdCBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgX2dldEl0ZW1WYWx1ZShpdGVtKTogYW55IHtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0udmFsdWUgIT0gbnVsbCA/IGl0ZW0udmFsdWUgOiBpdGVtLnRleHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogc2VsZWN0aW9uIGNoYW5nZWQsIGVtaXRzIGV2ZW50czogKHNlbGVjdGVkVmFsdWVDaGFuZ2UpIGFuZCAoc2VsZWN0aW9uQ2hhbmdlKTtcbiAgICovXG4gIHByaXZhdGUgX29uU2VsZWN0aW9uQ2hhbmdlKHZhbHVlKSB7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBjaGFuZ2VkLiBFbWl0cyByZWxhdGl2ZSBldmVudHMgd2hlbiBpZiBjaGFuZ2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2hlY2tTZWxlY3Rpb25DaGFuZ2UocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSB7XG4gICAgY29uc3QgY3VyU2VsZWN0ZWRJdGVtID0gZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0oY3VycmVudFZhbHVlKTtcbiAgICBjb25zdCBsYXN0U2VsZWN0ZWRJdGVtID0gZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0ocHJldmlvdXNWYWx1ZSk7XG4gICAgY29uc3QgY3VyU2VsZWN0ZWRJdGVtSWQgPSBjdXJTZWxlY3RlZEl0ZW0gPyBjdXJTZWxlY3RlZEl0ZW0uaWQgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFzdFNlbGVjdGVkSXRlbUlkID0gbGFzdFNlbGVjdGVkSXRlbSA/IGxhc3RTZWxlY3RlZEl0ZW0uaWQgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGN1clNlbGVjdGVkSXRlbUlkICE9PSBsYXN0U2VsZWN0ZWRJdGVtSWQgJiYgIXRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlKHRoaXMuX2dldEl0ZW1WYWx1ZShjdXJTZWxlY3RlZEl0ZW0pKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==