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,1137 +0,0 @@
1
- import { __values } from 'tslib';
2
- import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, NgModule } from '@angular/core';
3
- import { DecimalPipe, CommonModule } from '@angular/common';
4
- import { FormsModule } from '@angular/forms';
5
-
6
- /**
7
- * @fileoverview added by tsickle
8
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
9
- */
10
- /**
11
- * check whether the provided items contains group
12
- * @param {?} items
13
- * @return {?}
14
- */
15
- function hasGroup(items) {
16
- return items ? (items.find(function (item) { return item.group; }) != null) : false;
17
- }
18
- /**
19
- * clear all selections from the provide items.
20
- * @param {?} items the dropdown items, can be group or item
21
- * @return {?}
22
- */
23
- function clearAllSelection(items) {
24
- var e_1, _a;
25
- if (hasGroup(items)) {
26
- try {
27
- for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
28
- var groupItem = items_1_1.value;
29
- if (groupItem.items) {
30
- groupItem.items.filter(function (item) { return item.selected; }).forEach(function (item) { return item.selected = false; });
31
- }
32
- }
33
- }
34
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
35
- finally {
36
- try {
37
- if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
38
- }
39
- finally { if (e_1) throw e_1.error; }
40
- }
41
- }
42
- else {
43
- // clear the selection of previous selected item
44
- items.filter(function (item) { return item.selected; }).forEach(function (item) { return item.selected = false; });
45
- }
46
- }
47
- /**
48
- * stop all propagation and default actions
49
- * @param {?} event
50
- * @return {?}
51
- */
52
- function stopPropagationAndDefault(event) {
53
- event.stopImmediatePropagation();
54
- event.stopPropagation();
55
- event.preventDefault();
56
- }
57
- /**
58
- * check whether the provided value is number of not
59
- * @param {?} value
60
- * @return {?}
61
- */
62
- function isNumber(value) {
63
- return !(value == null || isNaN(value) || value.length === 0);
64
- }
65
- /**
66
- * get the selected item from the items list (including item and group)
67
- * @param {?} items
68
- * @return {?}
69
- */
70
- function getFirstSelectedItem(items) {
71
- var e_2, _a;
72
- if (!items) {
73
- return undefined;
74
- }
75
- /** @type {?} */
76
- var selectedItem;
77
- if (hasGroup(items)) {
78
- try {
79
- for (var items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
80
- var item = items_2_1.value;
81
- selectedItem = item.items ? item.items.find(function (subItem) { return subItem.selected; }) : undefined;
82
- if (selectedItem) {
83
- break;
84
- }
85
- }
86
- }
87
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
88
- finally {
89
- try {
90
- if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
91
- }
92
- finally { if (e_2) throw e_2.error; }
93
- }
94
- }
95
- else {
96
- selectedItem = items ? items.find(function (item) { return item.selected; }) : undefined;
97
- }
98
- return selectedItem;
99
- }
100
-
101
- /**
102
- * @fileoverview added by tsickle
103
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
104
- */
105
- var DropdownListComponent = /** @class */ (function () {
106
- function DropdownListComponent() {
107
- /**
108
- * bind to [multiSelection], the flag for multi-select (checkbox) mode.
109
- */
110
- this.multiSelection = false;
111
- /**
112
- * bind to [filterBox] for displaying the filter input text box
113
- */
114
- this.filterBox = false;
115
- /**
116
- * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
117
- */
118
- this.allowClear = true;
119
- /**
120
- * bind to [formatNumber] for show formatted number text
121
- */
122
- this.formatNumber = false;
123
- /**
124
- * for 2-way binding of [selectedValue], using async event to
125
- * prevent "ExpressionChangedAfterItHasBeenCheckedError".
126
- */
127
- this.selectedValueChange = new EventEmitter(true);
128
- /**
129
- * [selectionChange] event that will be triggered when changing of the selection.
130
- * Using async event to prevent "ExpressionChangedAfterItHasBeenCheckedError".
131
- */
132
- this.selectionChange = new EventEmitter(true);
133
- /**
134
- * visibility flag of drop down
135
- */
136
- this.dropdownVisibility = false;
137
- }
138
- Object.defineProperty(DropdownListComponent.prototype, "selectedText", {
139
- /**
140
- * current selected text
141
- */
142
- get: /**
143
- * current selected text
144
- * @return {?}
145
- */
146
- function () {
147
- if (!this.multiSelection) {
148
- /** @type {?} */
149
- var selectedItem = getFirstSelectedItem(this.items);
150
- return selectedItem ? selectedItem.text : undefined;
151
- }
152
- },
153
- enumerable: true,
154
- configurable: true
155
- });
156
- /**
157
- * triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
158
- */
159
- /**
160
- * triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
161
- * @param {?} event
162
- * @return {?}
163
- */
164
- DropdownListComponent.prototype.onSelectionChange = /**
165
- * triggered with (selectionChange) event, emits (selectedValueChange) and (selectionChange)
166
- * @param {?} event
167
- * @return {?}
168
- */
169
- function (event) {
170
- this.selectedValueChange.emit(event);
171
- this.selectionChange.emit(event);
172
- };
173
- /**
174
- * triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
175
- */
176
- /**
177
- * triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
178
- * @param {?} event
179
- * @return {?}
180
- */
181
- DropdownListComponent.prototype.onAnchorClick = /**
182
- * triggered with (anchorClick) event, controlling the "open" and "close" of the dropdown
183
- * @param {?} event
184
- * @return {?}
185
- */
186
- function (event) {
187
- if (this.disabled) {
188
- stopPropagationAndDefault(event);
189
- return;
190
- }
191
- if (this._isSelectionOpen()) {
192
- this._hideItemList();
193
- }
194
- else {
195
- this._showItemsList();
196
- }
197
- stopPropagationAndDefault(event);
198
- };
199
- /**
200
- * triggered with (itemClick) event, closes the dropdown in non-checkbox mode
201
- */
202
- /**
203
- * triggered with (itemClick) event, closes the dropdown in non-checkbox mode
204
- * @return {?}
205
- */
206
- DropdownListComponent.prototype.onItemClick = /**
207
- * triggered with (itemClick) event, closes the dropdown in non-checkbox mode
208
- * @return {?}
209
- */
210
- function () {
211
- if (!this.multiSelection) {
212
- this._hideItemList();
213
- }
214
- };
215
- /**
216
- * triggered with (clearanceClick) event, clearing all selections
217
- * and emits (selectedValueChange) and (selectionChange) event for empty value
218
- */
219
- /**
220
- * triggered with (clearanceClick) event, clearing all selections
221
- * and emits (selectedValueChange) and (selectionChange) event for empty value
222
- * @param {?} event
223
- * @return {?}
224
- */
225
- DropdownListComponent.prototype.onClearanceClick = /**
226
- * triggered with (clearanceClick) event, clearing all selections
227
- * and emits (selectedValueChange) and (selectionChange) event for empty value
228
- * @param {?} event
229
- * @return {?}
230
- */
231
- function (event) {
232
- if (!this.multiSelection) {
233
- this.selectedValue = void 0;
234
- this.selectedValueChange.emit(undefined);
235
- this.selectionChange.emit(undefined);
236
- clearAllSelection(this.items);
237
- }
238
- stopPropagationAndDefault(event);
239
- };
240
- /**
241
- * triggered with (dropdownBlur) event, closes the dropdown
242
- */
243
- /**
244
- * triggered with (dropdownBlur) event, closes the dropdown
245
- * @return {?}
246
- */
247
- DropdownListComponent.prototype.onItemsBlur = /**
248
- * triggered with (dropdownBlur) event, closes the dropdown
249
- * @return {?}
250
- */
251
- function () {
252
- if (this._isSelectionOpen()) {
253
- this._hideItemList();
254
- }
255
- };
256
- /**
257
- * close the dropdown
258
- */
259
- /**
260
- * close the dropdown
261
- * @private
262
- * @return {?}
263
- */
264
- DropdownListComponent.prototype._hideItemList = /**
265
- * close the dropdown
266
- * @private
267
- * @return {?}
268
- */
269
- function () {
270
- // hide the dropdown element (has some problem for using CSS directly, using this as a workaround)
271
- this._dropdownElement.classList.remove('visible');
272
- this._dropdownElement.style.display = 'none';
273
- this.dropdownVisibility = false;
274
- };
275
- /**
276
- * open the dropdown
277
- */
278
- /**
279
- * open the dropdown
280
- * @private
281
- * @return {?}
282
- */
283
- DropdownListComponent.prototype._showItemsList = /**
284
- * open the dropdown
285
- * @private
286
- * @return {?}
287
- */
288
- function () {
289
- // display the dropdown element (has some problem for using CSS directly, using this as a workaround)
290
- this._dropdownElement.classList.add('visible');
291
- this._dropdownElement.style.display = 'block';
292
- this.dropdownVisibility = true;
293
- // scrolling to the selected item
294
- if (this._selectedElement) {
295
- this._selectedElement.scrollIntoView({ behavior: 'instant', block: 'center' });
296
- }
297
- // setting the focus
298
- if (this.filterBox && !this.multiSelection) {
299
- this._filterInputElement.focus();
300
- }
301
- else {
302
- this._dropdownElement.focus();
303
- }
304
- };
305
- /**
306
- * visibility status of dropdown
307
- */
308
- /**
309
- * visibility status of dropdown
310
- * @private
311
- * @return {?}
312
- */
313
- DropdownListComponent.prototype._isSelectionOpen = /**
314
- * visibility status of dropdown
315
- * @private
316
- * @return {?}
317
- */
318
- function () {
319
- return this.dropdownVisibility;
320
- };
321
- Object.defineProperty(DropdownListComponent.prototype, "_dropdownElement", {
322
- /**
323
- * get the real dropdown element (for focusing and visibility controlling), the <span> not the <dropdown>
324
- */
325
- get: /**
326
- * get the real dropdown element (for focusing and visibility controlling), the <span> not the <dropdown>
327
- * @private
328
- * @return {?}
329
- */
330
- function () {
331
- return this.dropdownRef ? this.dropdownRef.nativeElement ? this.dropdownRef.nativeElement.firstElementChild : null : null;
332
- },
333
- enumerable: true,
334
- configurable: true
335
- });
336
- Object.defineProperty(DropdownListComponent.prototype, "_filterInputElement", {
337
- /**
338
- * get the real filter element (for focusing), the <input> not the <input-filter>
339
- */
340
- get: /**
341
- * get the real filter element (for focusing), the <input> not the <input-filter>
342
- * @private
343
- * @return {?}
344
- */
345
- function () {
346
- return this._dropdownElement ?
347
- this._dropdownElement.firstElementChild ? this._dropdownElement.firstElementChild.firstElementChild : null : null;
348
- },
349
- enumerable: true,
350
- configurable: true
351
- });
352
- Object.defineProperty(DropdownListComponent.prototype, "_selectedElement", {
353
- /**
354
- * get the HTMLElement of selected item, for doing (scrollIntoView) scrolling to the selected item
355
- */
356
- get: /**
357
- * get the HTMLElement of selected item, for doing (scrollIntoView) scrolling to the selected item
358
- * @private
359
- * @return {?}
360
- */
361
- function () {
362
- /** @type {?} */
363
- var selectedItem = getFirstSelectedItem(this.items);
364
- return selectedItem ? (/** @type {?} */ (document.getElementById(selectedItem.id))) : undefined;
365
- },
366
- enumerable: true,
367
- configurable: true
368
- });
369
- DropdownListComponent.decorators = [
370
- { type: Component, args: [{
371
- selector: 'ngx-dropdown-list',
372
- template: "\n <span class=\"ngx-select\">\n <anchor (anchorClick)=\"onAnchorClick($event)\" (clearanceClick)=\"onClearanceClick($event)\"\n [checkbox]=\"multiSelection\"\n [formatNumber]=\"formatNumber\"\n [suffixText]=\"suffixText\"\n [placeHolder]=\"placeHolder\"\n [allowClear]=\"allowClear\"\n [openStatus]=\"dropdownVisibility\"\n [selectedText]=\"selectedText\"\n [disabled]=\"disabled\">\n </anchor>\n <dropdown #dropdown (dropdownBlur) = \"onItemsBlur()\" (selectionChange)=\"onSelectionChange($event)\"\n [items]=\"items\"\n [checkbox]=\"multiSelection\"\n [filterBox]=\"filterBox\"\n [formatNumber]=\"formatNumber\"\n [suffixText]=\"suffixText\"\n [(selectedValue)]=\"selectedValue\"\n (itemClick) = \"onItemClick()\"\n [disabled]=\"disabled\">\n </dropdown>\n </span>\n ",
373
- styles: [":host *,:host :after,:host :before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}:host .ngx-select{border-radius:4px;font-size:14px;position:relative;display:inline-block;width:100%;height:34px;background:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}"]
374
- }] }
375
- ];
376
- DropdownListComponent.propDecorators = {
377
- dropdownRef: [{ type: ViewChild, args: ['dropdown', { read: ElementRef },] }],
378
- placeHolder: [{ type: Input }],
379
- items: [{ type: Input }],
380
- multiSelection: [{ type: Input }],
381
- selectedValue: [{ type: Input }],
382
- filterBox: [{ type: Input }],
383
- suffixText: [{ type: Input }],
384
- disabled: [{ type: Input }],
385
- allowClear: [{ type: Input }],
386
- formatNumber: [{ type: Input }],
387
- selectedValueChange: [{ type: Output }],
388
- selectionChange: [{ type: Output }]
389
- };
390
- return DropdownListComponent;
391
- }());
392
-
393
- /**
394
- * @fileoverview added by tsickle
395
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
396
- */
397
- var ItemComponent = /** @class */ (function () {
398
- function ItemComponent() {
399
- /**
400
- * bind to [formatNumber], the flag for formatting the number
401
- */
402
- this.formatNumber = false;
403
- /**
404
- * bind to [itemClick] event, triggers when clicking the item of dropdown
405
- */
406
- this.itemClick = new EventEmitter();
407
- /**
408
- * bind to [checkStatusChange] event, triggers when check status is changed in checkbox mode.
409
- */
410
- this.checkStatusChange = new EventEmitter();
411
- }
412
- /**
413
- * check whether needs to format number for the provided text
414
- */
415
- /**
416
- * check whether needs to format number for the provided text
417
- * @param {?} value
418
- * @return {?}
419
- */
420
- ItemComponent.prototype.needFormatNumber = /**
421
- * check whether needs to format number for the provided text
422
- * @param {?} value
423
- * @return {?}
424
- */
425
- function (value) {
426
- return isNumber(value) && this.formatNumber;
427
- };
428
- /**
429
- * triggered when clicking the item, emits the [itemClick] event
430
- */
431
- /**
432
- * triggered when clicking the item, emits the [itemClick] event
433
- * @param {?} item
434
- * @return {?}
435
- */
436
- ItemComponent.prototype.onItemClick = /**
437
- * triggered when clicking the item, emits the [itemClick] event
438
- * @param {?} item
439
- * @return {?}
440
- */
441
- function (item) {
442
- this.itemClick.emit(item);
443
- };
444
- /**
445
- * triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
446
- */
447
- /**
448
- * triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
449
- * @param {?} item
450
- * @return {?}
451
- */
452
- ItemComponent.prototype.onCheckStatusChange = /**
453
- * triggered when checking status changed in checkbox mode, emits the [checkStatusChange] event
454
- * @param {?} item
455
- * @return {?}
456
- */
457
- function (item) {
458
- this.checkStatusChange.emit(item);
459
- };
460
- ItemComponent.decorators = [
461
- { type: Component, args: [{
462
- selector: 'item',
463
- template: "\n <label [class.container-checkbox]=\"checkbox\"\n [class.container-selection]=\"!checkbox && !item.selected\"\n [class.container-selection-selected]=\"!checkbox && item.selected\"\n [id]=\"item.id\" (mousedown)=\"onItemClick(item)\">\n {{needFormatNumber(item.text)? (item.text | number:'1.0-2') : item.text}}{{suffixText? suffixText : ''}}\n <ng-container *ngIf=\"checkbox\">\n <input type='checkbox' [id]=\"'checkbox-'+item.text\" (change)=\"onCheckStatusChange(item)\" [checked]=\"item.selected\">\n <span class=\"checkmark\" [id]=\"'checkmark-'+item.text\"></span>\n </ng-container>\n </label>",
464
- styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.container-checkbox,.container-selection,.container-selection-selected,.dropdown-item{background:0 0;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196f3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection-selected:hover,.container-selection:hover{color:#495057;background:#e0ffff}.container-selection-selected{color:#fff;background:#6495ed}"]
465
- }] }
466
- ];
467
- ItemComponent.propDecorators = {
468
- checkbox: [{ type: Input }],
469
- item: [{ type: Input }],
470
- formatNumber: [{ type: Input }],
471
- suffixText: [{ type: Input }],
472
- itemClick: [{ type: Output }],
473
- checkStatusChange: [{ type: Output }]
474
- };
475
- return ItemComponent;
476
- }());
477
-
478
- /**
479
- * @fileoverview added by tsickle
480
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
481
- */
482
- var GroupItemComponent = /** @class */ (function () {
483
- function GroupItemComponent() {
484
- }
485
- /**
486
- * prevent all clicking event from happening
487
- */
488
- /**
489
- * prevent all clicking event from happening
490
- * @param {?} event
491
- * @return {?}
492
- */
493
- GroupItemComponent.prototype.onItemGroupClick = /**
494
- * prevent all clicking event from happening
495
- * @param {?} event
496
- * @return {?}
497
- */
498
- function (event) {
499
- event.stopImmediatePropagation();
500
- event.stopPropagation();
501
- event.preventDefault();
502
- };
503
- GroupItemComponent.decorators = [
504
- { type: Component, args: [{
505
- selector: 'group-item',
506
- template: "\n <label class=\"dropdown-item dropdown-item-group\" (mousedown)=\"onItemGroupClick($event)\">{{item.group}}</label>\n ",
507
- styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.container-checkbox,.container-selection,.container-selection-selected,.dropdown-item{background:0 0;display:list-item;list-style:none;position:relative;width:100%;height:auto;cursor:pointer;color:#495057;padding-bottom:5px;padding-top:5px;padding-left:12px}.container-checkbox{padding-left:35px}.container-checkbox input{position:absolute;opacity:0;cursor:pointer}.container-checkbox .checkmark{position:absolute;top:5px;left:10px;height:15px;width:15px;border:1px solid rgba(0,0,0,.3);background-color:#fff;border-radius:4px}.container-checkbox .checkmark:after{content:\"\";position:absolute;display:none;left:5px;top:2px;width:4px;height:7px;border:solid #fff;border-width:0 2px 2px 0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.container-checkbox:hover input~.checkmark{background-color:#ccc}.container-checkbox input:checked~.checkmark{background-color:#2196f3;border:1px solid #2196f3}.container-checkbox input:checked~.checkmark:after{display:block}.container-checkbox:hover{color:#66afe9}.container-selection,.container-selection-selected{padding-left:12px}.container-selection-selected:hover,.container-selection:hover{color:#495057;background:#e0ffff}.container-selection-selected{color:#fff;background:#6495ed}.dropdown-item-group{font-weight:700}.dropdown-item-group:hover{cursor:default}"]
508
- }] }
509
- ];
510
- GroupItemComponent.propDecorators = {
511
- item: [{ type: Input }]
512
- };
513
- return GroupItemComponent;
514
- }());
515
-
516
- /**
517
- * @fileoverview added by tsickle
518
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
519
- */
520
- var InputFilterComponent = /** @class */ (function () {
521
- function InputFilterComponent() {
522
- /**
523
- * bind to [inputFilterBlur], emits with (blur) of filter input box
524
- */
525
- this.inputFilterBlur = new EventEmitter();
526
- /**
527
- * bind to [filterValueChange], for 2-way binding of filterValue
528
- */
529
- this.filterValueChange = new EventEmitter();
530
- }
531
- /**
532
- * triggers with (blur) event, emits the (inputFilterBlur) event
533
- */
534
- /**
535
- * triggers with (blur) event, emits the (inputFilterBlur) event
536
- * @param {?} event
537
- * @return {?}
538
- */
539
- InputFilterComponent.prototype.onFilterTextBlur = /**
540
- * triggers with (blur) event, emits the (inputFilterBlur) event
541
- * @param {?} event
542
- * @return {?}
543
- */
544
- function (event) {
545
- this.inputFilterBlur.emit(event);
546
- };
547
- /**
548
- * triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
549
- */
550
- /**
551
- * triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
552
- * @return {?}
553
- */
554
- InputFilterComponent.prototype.onChange = /**
555
- * triggers with (input) event, emits the (filterValueChange) event for 2-way binding of filterValue
556
- * @return {?}
557
- */
558
- function () {
559
- this.filterValueChange.emit(this.filterValue);
560
- };
561
- InputFilterComponent.decorators = [
562
- { type: Component, args: [{
563
- selector: 'input-filter',
564
- template: "\n <input type=\"text\" class=\"filter-box\" [(ngModel)]=\"filterValue\" (input)=\"onChange()\" (blur)=\"onFilterTextBlur($event)\">\n ",
565
- styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.filter-box{width:calc(100% - 10px);height:28px;border-radius:4px;border:1px solid #ccc;margin:1px 5px 5px;padding-left:5px;font-size:12px;box-sizing:border-box;color:#495057}.filter-box:focus{outline:0;border-color:#ccc}"]
566
- }] }
567
- ];
568
- InputFilterComponent.propDecorators = {
569
- filterValue: [{ type: Input }],
570
- inputFilterBlur: [{ type: Output }],
571
- filterValueChange: [{ type: Output }]
572
- };
573
- return InputFilterComponent;
574
- }());
575
-
576
- /**
577
- * @fileoverview added by tsickle
578
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
579
- */
580
- var AnchorComponent = /** @class */ (function () {
581
- function AnchorComponent(_decimalPipe) {
582
- this._decimalPipe = _decimalPipe;
583
- /**
584
- * bind to [checkbox] for checking whether the clearance flag should be shown or not.
585
- */
586
- this.checkbox = false;
587
- /**
588
- * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
589
- */
590
- this.allowClear = true;
591
- /**
592
- * bind to [openStatus], it's the visibility status of dropdown, for showing the arrow on anchor
593
- */
594
- this.openStatus = false;
595
- /**
596
- * bind to [disabled] for disabling the anchor
597
- */
598
- this.disabled = false;
599
- /**
600
- * will be triggered when clicking the anchor
601
- */
602
- this.anchorClick = new EventEmitter();
603
- /**
604
- * will be triggered when clicking the clearance
605
- */
606
- this.clearanceClick = new EventEmitter();
607
- }
608
- Object.defineProperty(AnchorComponent.prototype, "showClearanceFlag", {
609
- /**
610
- * flag for showing the clearance flag
611
- */
612
- get: /**
613
- * flag for showing the clearance flag
614
- * @return {?}
615
- */
616
- function () {
617
- return !this.checkbox && this.selectedText && this.allowClear;
618
- },
619
- enumerable: true,
620
- configurable: true
621
- });
622
- Object.defineProperty(AnchorComponent.prototype, "anchorDisplayText", {
623
- /**
624
- * the text displays on anchor
625
- */
626
- get: /**
627
- * the text displays on anchor
628
- * @return {?}
629
- */
630
- function () {
631
- /** @type {?} */
632
- var anchorDisplayText = this.selectedText ? (this.formatNumber ? (isNumber(this.selectedText) ?
633
- this._decimalPipe.transform(this.selectedText, '1.0-2') : this.selectedText) :
634
- this.selectedText) + (this.suffixText ? this.suffixText : '') : this.placeHolder;
635
- /** @type {?} */
636
- var charLength = 1;
637
- if (this.showClearanceFlag && this.anchorLength > 0) {
638
- charLength = Math.floor((this.anchorLength - 50) / 7);
639
- }
640
- else {
641
- charLength = Math.floor((this.anchorLength - 50) / 7);
642
- }
643
- if (anchorDisplayText.length > charLength) {
644
- anchorDisplayText = anchorDisplayText.slice(0, charLength - 2) + '...';
645
- }
646
- return anchorDisplayText;
647
- },
648
- enumerable: true,
649
- configurable: true
650
- });
651
- Object.defineProperty(AnchorComponent.prototype, "anchorClass", {
652
- /**
653
- * anchor CSS class
654
- */
655
- get: /**
656
- * anchor CSS class
657
- * @return {?}
658
- */
659
- function () {
660
- /** @type {?} */
661
- var anchorClassStatusPart;
662
- /** @type {?} */
663
- var anchorClassFontColor;
664
- if (this.disabled) {
665
- anchorClassStatusPart = 'selection-anchor-disabled';
666
- anchorClassFontColor = 'place-holder';
667
- }
668
- else {
669
- if (this.openStatus) {
670
- anchorClassStatusPart = 'selection-anchor-open';
671
- }
672
- else {
673
- anchorClassStatusPart = 'selection-anchor-close';
674
- }
675
- if (this.selectedText != null) {
676
- anchorClassFontColor = 'selected-item';
677
- }
678
- else {
679
- anchorClassFontColor = 'place-holder';
680
- }
681
- }
682
- return anchorClassStatusPart + " " + anchorClassFontColor;
683
- },
684
- enumerable: true,
685
- configurable: true
686
- });
687
- /**
688
- * triggered when clicking the anchor
689
- */
690
- /**
691
- * triggered when clicking the anchor
692
- * @param {?} event
693
- * @return {?}
694
- */
695
- AnchorComponent.prototype.onAnchorClick = /**
696
- * triggered when clicking the anchor
697
- * @param {?} event
698
- * @return {?}
699
- */
700
- function (event) {
701
- this.anchorClick.emit(event);
702
- };
703
- /**
704
- * triggered with (blur) of anchor
705
- */
706
- /**
707
- * triggered with (blur) of anchor
708
- * @param {?} event
709
- * @return {?}
710
- */
711
- AnchorComponent.prototype.onAnchorBlur = /**
712
- * triggered with (blur) of anchor
713
- * @param {?} event
714
- * @return {?}
715
- */
716
- function (event) {
717
- stopPropagationAndDefault(event);
718
- };
719
- /**
720
- * triggered when clicking the clearance
721
- */
722
- /**
723
- * triggered when clicking the clearance
724
- * @param {?} event
725
- * @return {?}
726
- */
727
- AnchorComponent.prototype.onClearanceClick = /**
728
- * triggered when clicking the clearance
729
- * @param {?} event
730
- * @return {?}
731
- */
732
- function (event) {
733
- this.clearanceClick.emit(event);
734
- };
735
- /**
736
- * triggered when resizing, get the clientWidth of anchor
737
- */
738
- /**
739
- * triggered when resizing, get the clientWidth of anchor
740
- * @return {?}
741
- */
742
- AnchorComponent.prototype.onResize = /**
743
- * triggered when resizing, get the clientWidth of anchor
744
- * @return {?}
745
- */
746
- function () {
747
- this.anchorLength = this.anchorRef ? this.anchorRef.nativeElement ? this.anchorRef.nativeElement.clientWidth : 0 : 0;
748
- };
749
- AnchorComponent.decorators = [
750
- { type: Component, args: [{
751
- selector: 'anchor',
752
- template: "\n <span #anchor tabindex=\"2\" [ngClass]=\"anchorClass\" (window:resize)=\"onResize()\"\n (mousedown)=\"onAnchorClick($event)\" (blur)=\"onAnchorBlur($event)\"> {{anchorDisplayText}}\n <span #selectionClearance class=\"selection-clearance\" (mousedown)=\"onClearanceClick($event)\" *ngIf=\"showClearanceFlag\">&times;</span>\n </span>\n ",
753
- providers: [DecimalPipe],
754
- styles: ["*,:after,:before{font-size:inherit;font-weight:inherit;font-family:inherit;box-sizing:inherit;background:inherit}.selection-anchor-close:after,.selection-anchor-disabled:after,.selection-anchor-open:after,.vertical-center{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.hover-box,.selection-anchor-close:hover{outline:0;box-shadow:0 0 6px #23adff;border-radius:4px}.anchor-box,.selection-anchor,.selection-anchor-close,.selection-anchor-disabled,.selection-anchor-open{height:100%;border-radius:4px;width:100%;position:relative;display:inline-block;padding:8px 12px 5px;border:1px solid;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-sizing:border-box;white-space:nowrap}.selection-anchor,.selection-anchor-close,.selection-anchor-open{cursor:pointer}.selection-anchor .selection-clearance,.selection-anchor-close .selection-clearance,.selection-anchor-open .selection-clearance{position:absolute;right:35px;font-weight:700}.selection-anchor .selection-clearance:hover,.selection-anchor-close .selection-clearance:hover,.selection-anchor-open .selection-clearance:hover{color:#000}.selection-anchor-close:focus,.selection-anchor-open:focus,.selection-anchor:focus{box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;border-color:#66afe9}.selection-anchor-disabled{border-color:#ccc;cursor:default;pointer-events:none;background:#f8f8f8;-webkit-filter:opacity(50%);filter:opacity(50%)}.selection-anchor-disabled:after{font-size:12px;content:'\\0023F7';right:10px;padding-bottom:3px}.selection-anchor-open{border-bottom:none;border-bottom-right-radius:0;border-bottom-left-radius:0;border-color:#66afe9}.selection-anchor-open:after{font-size:12px;content:\"\\0023F6\";right:10px;padding-bottom:3px}.selection-anchor-close{border-color:#ccc}.selection-anchor-close:after{font-size:12px;content:'\\0023F7';right:10px;padding-bottom:3px}.place-holder{color:#999}.selected-item{color:#495057}"]
755
- }] }
756
- ];
757
- /** @nocollapse */
758
- AnchorComponent.ctorParameters = function () { return [
759
- { type: DecimalPipe }
760
- ]; };
761
- AnchorComponent.propDecorators = {
762
- anchorRef: [{ type: ViewChild, args: ['anchor', { read: ElementRef },] }],
763
- placeHolder: [{ type: Input }],
764
- checkbox: [{ type: Input }],
765
- suffixText: [{ type: Input }],
766
- allowClear: [{ type: Input }],
767
- formatNumber: [{ type: Input }],
768
- selectedText: [{ type: Input }],
769
- openStatus: [{ type: Input }],
770
- disabled: [{ type: Input }],
771
- anchorClick: [{ type: Output }],
772
- clearanceClick: [{ type: Output }]
773
- };
774
- return AnchorComponent;
775
- }());
776
-
777
- /**
778
- * @fileoverview added by tsickle
779
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
780
- */
781
- var DropdownComponent = /** @class */ (function () {
782
- function DropdownComponent() {
783
- /**
784
- * bind to [checkbox], the flag for multi-select (checkbox) mode.
785
- */
786
- this.checkbox = false;
787
- /**
788
- * bind to [filterBox] for displaying the filter input text box
789
- */
790
- this.filterBox = false;
791
- /**
792
- * bind to [allowClear] for enabling the clearance (clearance is not avaiable when checkbox is enabled)
793
- */
794
- this.allowClear = true;
795
- /**
796
- * bind to [formatNumber] for show formatted number text
797
- */
798
- this.formatNumber = false;
799
- /**
800
- * for 2-way binding of [selectedValue]
801
- */
802
- this.selectedValueChange = new EventEmitter(true);
803
- /**
804
- * [selectionChange] event that will be triggered when changing of the selection
805
- */
806
- this.selectionChange = new EventEmitter(true);
807
- /**
808
- * [dropdownBlur] event that will be triggered with (blur) of dropdown
809
- */
810
- this.dropdownBlur = new EventEmitter();
811
- /**
812
- * [itemClick] event that will be triggered when clicking the option of dropdown
813
- */
814
- this.itemClick = new EventEmitter();
815
- /**
816
- * flag of clicking dropdown. It's to prevent (blur) of dropdown from happening in checkbox mode.
817
- */
818
- this._clickedItems = false;
819
- }
820
- /**
821
- * @param {?} changes
822
- * @return {?}
823
- */
824
- DropdownComponent.prototype.ngOnChanges = /**
825
- * @param {?} changes
826
- * @return {?}
827
- */
828
- function (changes) {
829
- if (changes.items) {
830
- this._checkSelectionChange(changes.items.previousValue, changes.items.currentValue);
831
- }
832
- };
833
- /**
834
- * triggered when clicking the dropdown
835
- */
836
- /**
837
- * triggered when clicking the dropdown
838
- * @param {?} event
839
- * @return {?}
840
- */
841
- DropdownComponent.prototype.onItemsClick = /**
842
- * triggered when clicking the dropdown
843
- * @param {?} event
844
- * @return {?}
845
- */
846
- function (event) {
847
- if (event.offsetX > (event.target.clientWidth + event.target.clientLeft)) {
848
- stopPropagationAndDefault(event);
849
- return;
850
- }
851
- // should ignore clicking on filter
852
- if (this.checkbox && event.target.type !== 'text') {
853
- this._clickedItems = true;
854
- }
855
- };
856
- /**
857
- * triggered when clicking the item
858
- */
859
- /**
860
- * triggered when clicking the item
861
- * @param {?} currentItem
862
- * @return {?}
863
- */
864
- DropdownComponent.prototype.onItemClick = /**
865
- * triggered when clicking the item
866
- * @param {?} currentItem
867
- * @return {?}
868
- */
869
- function (currentItem) {
870
- if (!this.checkbox) {
871
- this.selectedValue = this._getItemValue(currentItem); // currentItem.value != null ? currentItem.value : currentItem.text;
872
- clearAllSelection(this.items);
873
- // set the selection of current one
874
- currentItem.selected = true;
875
- this.itemClick.emit(currentItem);
876
- this._onSelectionChange(this.selectedValue);
877
- }
878
- };
879
- /**
880
- * triggers with (blur) event of filter input box
881
- */
882
- /**
883
- * triggers with (blur) event of filter input box
884
- * @param {?} event
885
- * @return {?}
886
- */
887
- DropdownComponent.prototype.onFilterTextBlur = /**
888
- * triggers with (blur) event of filter input box
889
- * @param {?} event
890
- * @return {?}
891
- */
892
- function (event) {
893
- this.dropdownBlur.emit(event);
894
- };
895
- /**
896
- * triggers with (blur) event of dropdown
897
- */
898
- /**
899
- * triggers with (blur) event of dropdown
900
- * @param {?} event
901
- * @return {?}
902
- */
903
- DropdownComponent.prototype.onItemsBlur = /**
904
- * triggers with (blur) event of dropdown
905
- * @param {?} event
906
- * @return {?}
907
- */
908
- function (event) {
909
- if (this.checkbox) {
910
- if (this._clickedItems) {
911
- // in checkbox mode, this blur event will be ignored when clicking the dropdown (check the checkbox)
912
- event.target.focus();
913
- this._clickedItems = false;
914
- return;
915
- }
916
- }
917
- this.dropdownBlur.emit(event);
918
- };
919
- /**
920
- * toggle the selection when checking status changed (in checkbox mode)
921
- */
922
- /**
923
- * toggle the selection when checking status changed (in checkbox mode)
924
- * @param {?} item
925
- * @return {?}
926
- */
927
- DropdownComponent.prototype.toggleSelection = /**
928
- * toggle the selection when checking status changed (in checkbox mode)
929
- * @param {?} item
930
- * @return {?}
931
- */
932
- function (item) {
933
- item.selected = !item.selected;
934
- this.selectionChange.emit(this._getItemValue(item)); // item.value != null ? item.value : item.text);
935
- };
936
- Object.defineProperty(DropdownComponent.prototype, "itemsValues", {
937
- /**
938
- * items values list after applying the filter
939
- */
940
- get: /**
941
- * items values list after applying the filter
942
- * @return {?}
943
- */
944
- function () {
945
- /** @type {?} */
946
- var filter;
947
- if (this.filterValue) {
948
- filter = this.filterValue.toUpperCase();
949
- }
950
- if (filter == null) {
951
- return this.items;
952
- }
953
- if (!this.items || this.items.length === 0) {
954
- return [];
955
- }
956
- if (hasGroup(this.items)) {
957
- /** @type {?} */
958
- var items_1 = [];
959
- this.items.forEach(function (groupItem) {
960
- if (groupItem.group != null && groupItem.group.toString().toUpperCase().includes(filter)) {
961
- // if groupItem contains the filters, the groupItem needs to be displayed as well
962
- items_1.push(groupItem);
963
- }
964
- else {
965
- /** @type {?} */
966
- var filteredItems = groupItem.items.filter(function (item) { return item.text != null && item.text.toString().toUpperCase().includes(filter); });
967
- if (filteredItems && filteredItems.length > 0) {
968
- items_1.push({ group: groupItem.group, items: filteredItems });
969
- }
970
- }
971
- });
972
- return items_1;
973
- }
974
- else {
975
- return this.items.filter(function (item) { return (item.text != null && item.text.toString().toUpperCase().includes(filter)); });
976
- }
977
- },
978
- enumerable: true,
979
- configurable: true
980
- });
981
- Object.defineProperty(DropdownComponent.prototype, "optionsClass", {
982
- /**
983
- * options CSS class
984
- */
985
- get: /**
986
- * options CSS class
987
- * @return {?}
988
- */
989
- function () {
990
- if (this.filterBox && !this.checkbox) {
991
- return 'options with-filter';
992
- }
993
- else {
994
- return 'options no-filter';
995
- }
996
- },
997
- enumerable: true,
998
- configurable: true
999
- });
1000
- /**
1001
- * get item value. Return text if value is not available
1002
- */
1003
- /**
1004
- * get item value. Return text if value is not available
1005
- * @private
1006
- * @param {?} item
1007
- * @return {?}
1008
- */
1009
- DropdownComponent.prototype._getItemValue = /**
1010
- * get item value. Return text if value is not available
1011
- * @private
1012
- * @param {?} item
1013
- * @return {?}
1014
- */
1015
- function (item) {
1016
- return item ? item.value != null ? item.value : item.text : undefined;
1017
- };
1018
- /**
1019
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
1020
- */
1021
- /**
1022
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
1023
- * @private
1024
- * @param {?} value
1025
- * @return {?}
1026
- */
1027
- DropdownComponent.prototype._onSelectionChange = /**
1028
- * selection changed, emits events: (selectedValueChange) and (selectionChange);
1029
- * @private
1030
- * @param {?} value
1031
- * @return {?}
1032
- */
1033
- function (value) {
1034
- this.selectedValueChange.emit(value);
1035
- this.selectionChange.emit(value);
1036
- };
1037
- /**
1038
- * check whether the selection is changed. Emits relative events when if changed.
1039
- */
1040
- /**
1041
- * check whether the selection is changed. Emits relative events when if changed.
1042
- * @private
1043
- * @param {?} previousValue
1044
- * @param {?} currentValue
1045
- * @return {?}
1046
- */
1047
- DropdownComponent.prototype._checkSelectionChange = /**
1048
- * check whether the selection is changed. Emits relative events when if changed.
1049
- * @private
1050
- * @param {?} previousValue
1051
- * @param {?} currentValue
1052
- * @return {?}
1053
- */
1054
- function (previousValue, currentValue) {
1055
- /** @type {?} */
1056
- var curSelectedItem = getFirstSelectedItem(currentValue);
1057
- /** @type {?} */
1058
- var lastSelectedItem = getFirstSelectedItem(previousValue);
1059
- /** @type {?} */
1060
- var curSelectedItemId = curSelectedItem ? curSelectedItem.id : undefined;
1061
- /** @type {?} */
1062
- var lastSelectedItemId = lastSelectedItem ? lastSelectedItem.id : undefined;
1063
- if (curSelectedItemId !== lastSelectedItemId && !this.checkbox) {
1064
- this._onSelectionChange(this._getItemValue(curSelectedItem));
1065
- }
1066
- };
1067
- DropdownComponent.decorators = [
1068
- { type: Component, args: [{
1069
- selector: 'dropdown',
1070
- 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 ",
1071
- 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}"]
1072
- }] }
1073
- ];
1074
- DropdownComponent.propDecorators = {
1075
- dropdownRef: [{ type: ViewChild, args: ['dropdown', { read: ElementRef },] }],
1076
- filterInputRef: [{ type: ViewChild, args: ['filterInput', { read: ElementRef },] }],
1077
- placeHolder: [{ type: Input }],
1078
- items: [{ type: Input }],
1079
- checkbox: [{ type: Input }],
1080
- selectedValue: [{ type: Input }],
1081
- filterBox: [{ type: Input }],
1082
- suffixText: [{ type: Input }],
1083
- disabled: [{ type: Input }],
1084
- allowClear: [{ type: Input }],
1085
- formatNumber: [{ type: Input }],
1086
- selectedValueChange: [{ type: Output }],
1087
- selectionChange: [{ type: Output }],
1088
- dropdownBlur: [{ type: Output }],
1089
- itemClick: [{ type: Output }]
1090
- };
1091
- return DropdownComponent;
1092
- }());
1093
-
1094
- /**
1095
- * @fileoverview added by tsickle
1096
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1097
- */
1098
- var DropdownListModule = /** @class */ (function () {
1099
- function DropdownListModule() {
1100
- }
1101
- DropdownListModule.decorators = [
1102
- { type: NgModule, args: [{
1103
- declarations: [
1104
- DropdownListComponent,
1105
- ItemComponent,
1106
- GroupItemComponent,
1107
- InputFilterComponent,
1108
- AnchorComponent,
1109
- DropdownComponent
1110
- ],
1111
- exports: [DropdownListComponent],
1112
- imports: [CommonModule, FormsModule],
1113
- providers: [],
1114
- bootstrap: [],
1115
- },] }
1116
- ];
1117
- return DropdownListModule;
1118
- }());
1119
-
1120
- /**
1121
- * @fileoverview added by tsickle
1122
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1123
- */
1124
-
1125
- /**
1126
- * @fileoverview added by tsickle
1127
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1128
- */
1129
-
1130
- /**
1131
- * @fileoverview added by tsickle
1132
- * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1133
- */
1134
-
1135
- export { DropdownListComponent, DropdownListModule, AnchorComponent as ɵd, DropdownComponent as ɵe, InputFilterComponent as ɵc, GroupItemComponent as ɵb, ItemComponent as ɵa };
1136
-
1137
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRyb3Bkb3duLWxpc3QuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC91dGlscy91dGlsLnRzIiwibmc6Ly9uZ3gtZHJvcGRvd24tbGlzdC9zcmMvbmd4LWRyb3Bkb3duLWxpc3QvZHJvcGRvd24tbGlzdC5jb21wb25lbnQudHMiLCJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC9pdGVtL2l0ZW0uY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZHJvcGRvd24tbGlzdC9zcmMvbmd4LWRyb3Bkb3duLWxpc3QvZ3JvdXAtaXRlbS9ncm91cC1pdGVtLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LWRyb3Bkb3duLWxpc3Qvc3JjL25neC1kcm9wZG93bi1saXN0L2ZpbHRlci9pbnB1dC1maWx0ZXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZHJvcGRvd24tbGlzdC9zcmMvbmd4LWRyb3Bkb3duLWxpc3QvYW5jaG9yL2FuY2hvci5jb21wb25lbnQudHMiLCJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQudHMiLCJuZzovL25neC1kcm9wZG93bi1saXN0L3NyYy9uZ3gtZHJvcGRvd24tbGlzdC9kcm9wZG93bi1saXN0Lm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogY2hlY2sgd2hldGhlciB0aGUgcHJvdmlkZWQgaXRlbXMgY29udGFpbnMgZ3JvdXBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBoYXNHcm91cChpdGVtcyk6IGJvb2xlYW4ge1xyXG4gIHJldHVybiBpdGVtcyA/IChpdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5ncm91cCkgIT0gbnVsbCkgOiBmYWxzZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIGNsZWFyIGFsbCBzZWxlY3Rpb25zIGZyb20gdGhlIHByb3ZpZGUgaXRlbXMuXHJcbiAqIEBwYXJhbSBpdGVtcyB0aGUgZHJvcGRvd24gaXRlbXMsIGNhbiBiZSBncm91cCBvciBpdGVtXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJBbGxTZWxlY3Rpb24oaXRlbXM6IGFueSk6IHZvaWQge1xyXG4gIGlmIChoYXNHcm91cChpdGVtcykpIHtcclxuICAgIGZvciAoY29uc3QgZ3JvdXBJdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgIGlmIChncm91cEl0ZW0uaXRlbXMpIHtcclxuICAgICAgICBncm91cEl0ZW0uaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCkuZm9yRWFjaChpdGVtID0+IGl0ZW0uc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgLy8gY2xlYXIgdGhlIHNlbGVjdGlvbiBvZiBwcmV2aW91cyBzZWxlY3RlZCBpdGVtXHJcbiAgICBpdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKS5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBzdG9wIGFsbCBwcm9wYWdhdGlvbiBhbmQgZGVmYXVsdCBhY3Rpb25zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uQW5kRGVmYXVsdChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG59XHJcblxyXG4vKipcclxuICogY2hlY2sgd2hldGhlciB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgbnVtYmVyIG9mIG5vdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICByZXR1cm4gISh2YWx1ZSA9PSBudWxsIHx8IGlzTmFOKHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApO1xyXG59XHJcblxyXG4vKipcclxuICogZ2V0IHRoZSBzZWxlY3RlZCBpdGVtIGZyb20gdGhlIGl0ZW1zIGxpc3QgKGluY2x1ZGluZyBpdGVtIGFuZCBncm91cClcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXJzdFNlbGVjdGVkSXRlbShpdGVtczogYW55KTogYW55IHtcclxuICBpZiAoIWl0ZW1zKSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBsZXQgc2VsZWN0ZWRJdGVtO1xyXG4gIGlmIChoYXNHcm91cChpdGVtcykpIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBzZWxlY3RlZEl0ZW0gPSBpdGVtLml0ZW1zID8gaXRlbS5pdGVtcy5maW5kKHN1Ykl0ZW0gPT4gc3ViSXRlbS5zZWxlY3RlZCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBzZWxlY3RlZEl0ZW0gPSBpdGVtcyA/IGl0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKSA6IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcmV0dXJuIHNlbGVjdGVkSXRlbTtcclxufVxyXG4iLCJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjbGVhckFsbFNlbGVjdGlvbiwgZ2V0Rmlyc3RTZWxlY3RlZEl0ZW0sIHN0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHR9IGZyb20gJy4vdXRpbHMvdXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1kcm9wZG93bi1saXN0JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3BhbiBjbGFzcz1cIm5neC1zZWxlY3RcIj5cbiAgICAgICAgPGFuY2hvciAoYW5jaG9yQ2xpY2spPVwib25BbmNob3JDbGljaygkZXZlbnQpXCIgKGNsZWFyYW5jZUNsaWNrKT1cIm9uQ2xlYXJhbmNlQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2NoZWNrYm94XT1cIm11bHRpU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICBbZm9ybWF0TnVtYmVyXT1cImZvcm1hdE51bWJlclwiXG4gICAgICAgICAgICAgICAgW3N1ZmZpeFRleHRdPVwic3VmZml4VGV4dFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cInBsYWNlSG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbYWxsb3dDbGVhcl09XCJhbGxvd0NsZWFyXCJcbiAgICAgICAgICAgICAgICBbb3BlblN0YXR1c109XCJkcm9wZG93blZpc2liaWxpdHlcIlxuICAgICAgICAgICAgICAgIFtzZWxlY3RlZFRleHRdPVwic2VsZWN0ZWRUZXh0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cbiAgICAgICAgPC9hbmNob3I+XG4gICAgICAgIDxkcm9wZG93biAjZHJvcGRvd24gKGRyb3Bkb3duQmx1cikgPSBcIm9uSXRlbXNCbHVyKClcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtpdGVtc109XCJpdGVtc1wiXG4gICAgICAgICAgICAgICAgW2NoZWNrYm94XT1cIm11bHRpU2VsZWN0aW9uXCJcbiAgICAgICAgICAgICAgICBbZmlsdGVyQm94XT1cImZpbHRlckJveFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIlxuICAgICAgICAgICAgICAgIFtzdWZmaXhUZXh0XT1cInN1ZmZpeFRleHRcIlxuICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWRWYWx1ZSldPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgKGl0ZW1DbGljaykgPSBcIm9uSXRlbUNsaWNrKClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxuICAgICAgICA8L2Ryb3Bkb3duPlxuICAgIDwvc3Bhbj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24tbGlzdC5jb21wb25lbnQuc2NzcyddLFxufSlcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duTGlzdENvbXBvbmVudCB7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3Bkb3duUmVmOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBiaW5kIHRvIFtwbGFjZUhvbGRlcl0gZm9yIGRpc3BsYXlpbmcgdGhlIHBsYWNlIGhvbGRlciBzdHJpbmcgb2YgdGhlIGFuY2hvci5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlSG9sZGVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtpdGVtc10gZm9yIHRoZSBvcHRpb25zL2dyb3VwcyBpbiB0aGUgZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIGl0ZW1zOiBhbnlbXTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW211bHRpU2VsZWN0aW9uXSwgdGhlIGZsYWcgZm9yIG11bHRpLXNlbGVjdCAoY2hlY2tib3gpIG1vZGUuXG4gICAqL1xuICBASW5wdXQoKSBtdWx0aVNlbGVjdGlvbiA9IGZhbHNlO1xuICAvKipcbiAgICogYmluZCB0byBbc2VsZWN0ZWRWYWx1ZV0gZm9yIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZyb20gZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkVmFsdWU6IGFueTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2ZpbHRlckJveF0gZm9yIGRpc3BsYXlpbmcgdGhlIGZpbHRlciBpbnB1dCB0ZXh0IGJveFxuICAgKi9cbiAgQElucHV0KCkgZmlsdGVyQm94ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzdWZmaXhUZXh0XSBmb3IgZGlzcGxheWluZyB0aGUgc3VmZml4IG9mIHRoZSBzZWxlY3RlZCB0ZXh0IG9mIGFuY2hvclxuICAgKi9cbiAgQElucHV0KCkgc3VmZml4VGV4dDogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbZGlzYWJsZWRdIGZvciBkaXNhYmxpbmcgdGhlIGRyb3Bkb3duXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2FsbG93Q2xlYXJdIGZvciBlbmFibGluZyB0aGUgY2xlYXJhbmNlIChjbGVhcmFuY2UgaXMgbm90IGF2YWlhYmxlIHdoZW4gY2hlY2tib3ggaXMgZW5hYmxlZClcbiAgICovXG4gIEBJbnB1dCgpIGFsbG93Q2xlYXIgPSB0cnVlO1xuICAvKipcbiAgICogYmluZCB0byBbZm9ybWF0TnVtYmVyXSBmb3Igc2hvdyBmb3JtYXR0ZWQgbnVtYmVyIHRleHRcbiAgICovXG4gIEBJbnB1dCgpIGZvcm1hdE51bWJlciA9IGZhbHNlO1xuICAvKipcbiAgICogZm9yIDItd2F5IGJpbmRpbmcgb2YgW3NlbGVjdGVkVmFsdWVdLCB1c2luZyBhc3luYyBldmVudCB0b1xuICAgKiBwcmV2ZW50IFwiRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvclwiLlxuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdGVkVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4odHJ1ZSk7XG4gIC8qKlxuICAgKiBbc2VsZWN0aW9uQ2hhbmdlXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gY2hhbmdpbmcgb2YgdGhlIHNlbGVjdGlvbi5cbiAgICogVXNpbmcgYXN5bmMgZXZlbnQgdG8gcHJldmVudCBcIkV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcIi5cbiAgICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4odHJ1ZSk7XG5cbiAgLyoqXG4gICAqIHZpc2liaWxpdHkgZmxhZyBvZiBkcm9wIGRvd25cbiAgICovXG4gIGRyb3Bkb3duVmlzaWJpbGl0eSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBjdXJyZW50IHNlbGVjdGVkIHRleHRcbiAgICovXG4gIGdldCBzZWxlY3RlZFRleHQoKTogYW55IHtcbiAgICBpZiAoIXRoaXMubXVsdGlTZWxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGdldEZpcnN0U2VsZWN0ZWRJdGVtKHRoaXMuaXRlbXMpO1xuICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA/IHNlbGVjdGVkSXRlbS50ZXh0IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2l0aCAoc2VsZWN0aW9uQ2hhbmdlKSBldmVudCwgZW1pdHMgKHNlbGVjdGVkVmFsdWVDaGFuZ2UpIGFuZCAoc2VsZWN0aW9uQ2hhbmdlKVxuICAgKi9cbiAgb25TZWxlY3Rpb25DaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVDaGFuZ2UuZW1pdChldmVudCk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdpdGggKGFuY2hvckNsaWNrKSBldmVudCwgY29udHJvbGxpbmcgdGhlIFwib3BlblwiIGFuZCBcImNsb3NlXCIgb2YgdGhlIGRyb3Bkb3duXG4gICAqL1xuICBvbkFuY2hvckNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzU2VsZWN0aW9uT3BlbigpKSB7XG4gICAgICB0aGlzLl9oaWRlSXRlbUxpc3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2hvd0l0ZW1zTGlzdCgpO1xuICAgIH1cbiAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2l0aCAoaXRlbUNsaWNrKSBldmVudCwgY2xvc2VzIHRoZSBkcm9wZG93biBpbiBub24tY2hlY2tib3ggbW9kZVxuICAgKi9cbiAgb25JdGVtQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpU2VsZWN0aW9uKSB7XG4gICAgICB0aGlzLl9oaWRlSXRlbUxpc3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdpdGggKGNsZWFyYW5jZUNsaWNrKSBldmVudCwgY2xlYXJpbmcgYWxsIHNlbGVjdGlvbnNcbiAgICogYW5kIGVtaXRzIChzZWxlY3RlZFZhbHVlQ2hhbmdlKSBhbmQgKHNlbGVjdGlvbkNoYW5nZSkgZXZlbnQgZm9yIGVtcHR5IHZhbHVlXG4gICAqL1xuICBvbkNsZWFyYW5jZUNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdm9pZCAwO1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlQ2hhbmdlLmVtaXQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodW5kZWZpbmVkKTtcbiAgICAgIGNsZWFyQWxsU2VsZWN0aW9uKHRoaXMuaXRlbXMpO1xuICAgIH1cbiAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2l0aCAoZHJvcGRvd25CbHVyKSBldmVudCwgY2xvc2VzIHRoZSBkcm9wZG93blxuICAgKi9cbiAgb25JdGVtc0JsdXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzU2VsZWN0aW9uT3BlbigpKSB7XG4gICAgICB0aGlzLl9oaWRlSXRlbUxpc3QoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2xvc2UgdGhlIGRyb3Bkb3duXG4gICAqL1xuICBwcml2YXRlIF9oaWRlSXRlbUxpc3QoKTogdm9pZCB7XG4gICAgLy8gaGlkZSB0aGUgZHJvcGRvd24gZWxlbWVudCAoaGFzIHNvbWUgcHJvYmxlbSBmb3IgdXNpbmcgQ1NTIGRpcmVjdGx5LCB1c2luZyB0aGlzIGFzIGEgd29ya2Fyb3VuZClcbiAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpO1xuICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuZHJvcGRvd25WaXNpYmlsaXR5ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogb3BlbiB0aGUgZHJvcGRvd25cbiAgICovXG4gIHByaXZhdGUgX3Nob3dJdGVtc0xpc3QoKTogdm9pZCB7XG4gICAgLy8gZGlzcGxheSB0aGUgZHJvcGRvd24gZWxlbWVudCAoaGFzIHNvbWUgcHJvYmxlbSBmb3IgdXNpbmcgQ1NTIGRpcmVjdGx5LCB1c2luZyB0aGlzIGFzIGEgd29ya2Fyb3VuZClcbiAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpO1xuICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIHRoaXMuZHJvcGRvd25WaXNpYmlsaXR5ID0gdHJ1ZTtcblxuICAgIC8vIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgaXRlbVxuICAgIGlmICh0aGlzLl9zZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnaW5zdGFudCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBmb2N1c1xuICAgIGlmICh0aGlzLmZpbHRlckJveCAmJiAhdGhpcy5tdWx0aVNlbGVjdGlvbikge1xuICAgICAgdGhpcy5fZmlsdGVySW5wdXRFbGVtZW50LmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB2aXNpYmlsaXR5IHN0YXR1cyBvZiBkcm9wZG93blxuICAgKi9cbiAgcHJpdmF0ZSBfaXNTZWxlY3Rpb25PcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duVmlzaWJpbGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIHJlYWwgZHJvcGRvd24gZWxlbWVudCAoZm9yIGZvY3VzaW5nIGFuZCB2aXNpYmlsaXR5IGNvbnRyb2xsaW5nKSwgdGhlIDxzcGFuPiBub3QgdGhlIDxkcm9wZG93bj5cbiAgICovXG4gIHByaXZhdGUgZ2V0IF9kcm9wZG93bkVsZW1lbnQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93blJlZiA/IHRoaXMuZHJvcGRvd25SZWYubmF0aXZlRWxlbWVudCA/IHRoaXMuZHJvcGRvd25SZWYubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCA6IG51bGwgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgcmVhbCBmaWx0ZXIgZWxlbWVudCAoZm9yIGZvY3VzaW5nKSwgdGhlIDxpbnB1dD4gbm90IHRoZSA8aW5wdXQtZmlsdGVyPlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgX2ZpbHRlcklucHV0RWxlbWVudCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9kcm9wZG93bkVsZW1lbnQgP1xuICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkID8gdGhpcy5fZHJvcGRvd25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkIDogbnVsbCA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBIVE1MRWxlbWVudCBvZiBzZWxlY3RlZCBpdGVtLCBmb3IgZG9pbmcgKHNjcm9sbEludG9WaWV3KSBzY3JvbGxpbmcgdG8gdGhlIHNlbGVjdGVkIGl0ZW1cbiAgICovXG4gIHByaXZhdGUgZ2V0IF9zZWxlY3RlZEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGdldEZpcnN0U2VsZWN0ZWRJdGVtKHRoaXMuaXRlbXMpO1xuICAgIHJldHVybiBzZWxlY3RlZEl0ZW0gPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWxlY3RlZEl0ZW0uaWQpIGFzIEhUTUxFbGVtZW50IDogdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2VsZWN0aW9uSXRlbX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtpc051bWJlcn0gZnJvbSAnLi4vdXRpbHMvdXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2l0ZW0nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxsYWJlbCBbY2xhc3MuY29udGFpbmVyLWNoZWNrYm94XT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgW2NsYXNzLmNvbnRhaW5lci1zZWxlY3Rpb25dPVwiIWNoZWNrYm94ICYmICFpdGVtLnNlbGVjdGVkXCJcbiAgICAgICAgICAgW2NsYXNzLmNvbnRhaW5lci1zZWxlY3Rpb24tc2VsZWN0ZWRdPVwiIWNoZWNrYm94ICYmIGl0ZW0uc2VsZWN0ZWRcIlxuICAgICAgICAgICBbaWRdPVwiaXRlbS5pZFwiIChtb3VzZWRvd24pPVwib25JdGVtQ2xpY2soaXRlbSlcIj5cbiAgICAgIHt7bmVlZEZvcm1hdE51bWJlcihpdGVtLnRleHQpPyAoaXRlbS50ZXh0IHwgbnVtYmVyOicxLjAtMicpIDogaXRlbS50ZXh0fX17e3N1ZmZpeFRleHQ/IHN1ZmZpeFRleHQgOiAnJ319XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hlY2tib3hcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9J2NoZWNrYm94JyBbaWRdPVwiJ2NoZWNrYm94LScraXRlbS50ZXh0XCIgKGNoYW5nZSk9XCJvbkNoZWNrU3RhdHVzQ2hhbmdlKGl0ZW0pXCIgW2NoZWNrZWRdPVwiaXRlbS5zZWxlY3RlZFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrbWFya1wiIFtpZF09XCInY2hlY2ttYXJrLScraXRlbS50ZXh0XCI+PC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9sYWJlbD5gLFxuICBzdHlsZVVybHM6IFsnLi9pdGVtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5cbmV4cG9ydCBjbGFzcyBJdGVtQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2NoZWNrYm94XSwgdGhlIGZsYWcgb2YgY2hlY2tib3ggbW9kZVxuICAgKi9cbiAgQElucHV0KCkgY2hlY2tib3g6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtpdGVtXSwgdGhlIGRyb3Bkb3duIG9wdGlvbiBpdGVtXG4gICAqL1xuICBASW5wdXQoKSBpdGVtOiBTZWxlY3Rpb25JdGVtO1xuICAvKipcbiAgICogYmluZCB0byBbZm9ybWF0TnVtYmVyXSwgdGhlIGZsYWcgZm9yIGZvcm1hdHRpbmcgdGhlIG51bWJlclxuICAgKi9cbiAgQElucHV0KCkgZm9ybWF0TnVtYmVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzdWZmaXhUZXh0XSwgdGhlIHN1ZmZpeFRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgZHJvcGRvd25cbiAgICovXG4gIEBJbnB1dCgpIHN1ZmZpeFRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2l0ZW1DbGlja10gZXZlbnQsIHRyaWdnZXJzIHdoZW4gY2xpY2tpbmcgdGhlIGl0ZW0gb2YgZHJvcGRvd25cbiAgICovXG4gIEBPdXRwdXQoKSBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2NoZWNrU3RhdHVzQ2hhbmdlXSBldmVudCwgdHJpZ2dlcnMgd2hlbiBjaGVjayBzdGF0dXMgaXMgY2hhbmdlZCBpbiBjaGVja2JveCBtb2RlLlxuICAgKi9cbiAgQE91dHB1dCgpIGNoZWNrU3RhdHVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIGNoZWNrIHdoZXRoZXIgbmVlZHMgdG8gZm9ybWF0IG51bWJlciBmb3IgdGhlIHByb3ZpZGVkIHRleHRcbiAgICovXG4gIG5lZWRGb3JtYXROdW1iZXIodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgJiYgdGhpcy5mb3JtYXROdW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGl0ZW0sIGVtaXRzIHRoZSBbaXRlbUNsaWNrXSBldmVudFxuICAgKi9cbiAgb25JdGVtQ2xpY2soaXRlbSkge1xuICAgIHRoaXMuaXRlbUNsaWNrLmVtaXQoaXRlbSk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdoZW4gY2hlY2tpbmcgc3RhdHVzIGNoYW5nZWQgaW4gY2hlY2tib3ggbW9kZSwgZW1pdHMgdGhlIFtjaGVja1N0YXR1c0NoYW5nZV0gZXZlbnRcbiAgICovXG4gIG9uQ2hlY2tTdGF0dXNDaGFuZ2UoaXRlbSkge1xuICAgIHRoaXMuY2hlY2tTdGF0dXNDaGFuZ2UuZW1pdChpdGVtKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtDb21wb25lbnQsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U2VsZWN0aW9uR3JvdXBJdGVtc30gZnJvbSAnLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdncm91cC1pdGVtJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bGFiZWwgY2xhc3M9XCJkcm9wZG93bi1pdGVtIGRyb3Bkb3duLWl0ZW0tZ3JvdXBcIiAobW91c2Vkb3duKT1cIm9uSXRlbUdyb3VwQ2xpY2soJGV2ZW50KVwiPnt7aXRlbS5ncm91cH19PC9sYWJlbD5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vZ3JvdXAtaXRlbS5jb21wb25lbnQuc2NzcyddXG59KVxuXG5leHBvcnQgY2xhc3MgR3JvdXBJdGVtQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2l0ZW1dLCB0aGUgZ3JvdXAgaXRlbSBvZiBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgaXRlbTogU2VsZWN0aW9uR3JvdXBJdGVtcztcblxuICAvKipcbiAgICogcHJldmVudCBhbGwgY2xpY2tpbmcgZXZlbnQgZnJvbSBoYXBwZW5pbmdcbiAgICovXG4gIG9uSXRlbUdyb3VwQ2xpY2soZXZlbnQpIHtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaW5wdXQtZmlsdGVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZpbHRlci1ib3hcIiBbKG5nTW9kZWwpXT1cImZpbHRlclZhbHVlXCIgKGlucHV0KT1cIm9uQ2hhbmdlKClcIiAoYmx1cik9XCJvbkZpbHRlclRleHRCbHVyKCRldmVudClcIj5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtZmlsdGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5cbmV4cG9ydCBjbGFzcyBJbnB1dEZpbHRlckNvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtmaWx0ZXJWYWx1ZV0sIHRoZSB2YWx1ZSBvZiB0aGUgZmlsdGVyXG4gICAqL1xuICBASW5wdXQoKSBmaWx0ZXJWYWx1ZTogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbaW5wdXRGaWx0ZXJCbHVyXSwgZW1pdHMgd2l0aCAoYmx1cikgb2YgZmlsdGVyIGlucHV0IGJveFxuICAgKi9cbiAgQE91dHB1dCgpIGlucHV0RmlsdGVyQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKipcbiAgICogYmluZCB0byBbZmlsdGVyVmFsdWVDaGFuZ2VdLCBmb3IgMi13YXkgYmluZGluZyBvZiBmaWx0ZXJWYWx1ZVxuICAgKi9cbiAgQE91dHB1dCgpIGZpbHRlclZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJzIHdpdGggKGJsdXIpIGV2ZW50LCBlbWl0cyB0aGUgKGlucHV0RmlsdGVyQmx1cikgZXZlbnRcbiAgICovXG4gIG9uRmlsdGVyVGV4dEJsdXIoZXZlbnQpIHtcbiAgICB0aGlzLmlucHV0RmlsdGVyQmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyB3aXRoIChpbnB1dCkgZXZlbnQsIGVtaXRzIHRoZSAoZmlsdGVyVmFsdWVDaGFuZ2UpIGV2ZW50IGZvciAyLXdheSBiaW5kaW5nIG9mIGZpbHRlclZhbHVlXG4gICAqL1xuICBvbkNoYW5nZSgpIHtcbiAgICB0aGlzLmZpbHRlclZhbHVlQ2hhbmdlLmVtaXQodGhpcy5maWx0ZXJWYWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3N0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHQsIGlzTnVtYmVyfSBmcm9tICcuLi91dGlscy91dGlsJztcbmltcG9ydCB7RGVjaW1hbFBpcGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FuY2hvcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNwYW4gI2FuY2hvciB0YWJpbmRleD1cIjJcIiBbbmdDbGFzc109XCJhbmNob3JDbGFzc1wiICh3aW5kb3c6cmVzaXplKT1cIm9uUmVzaXplKClcIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwib25BbmNob3JDbGljaygkZXZlbnQpXCIgKGJsdXIpPVwib25BbmNob3JCbHVyKCRldmVudClcIj4ge3thbmNob3JEaXNwbGF5VGV4dH19XG4gICAgICA8c3BhbiAjc2VsZWN0aW9uQ2xlYXJhbmNlIGNsYXNzPVwic2VsZWN0aW9uLWNsZWFyYW5jZVwiIChtb3VzZWRvd24pPVwib25DbGVhcmFuY2VDbGljaygkZXZlbnQpXCIgKm5nSWY9XCJzaG93Q2xlYXJhbmNlRmxhZ1wiPiZ0aW1lczs8L3NwYW4+XG4gICAgPC9zcGFuPlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9hbmNob3IuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbRGVjaW1hbFBpcGVdXG59KVxuXG5leHBvcnQgY2xhc3MgQW5jaG9yQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENoaWxkIGVsZW1lbnQgcmVmZXJlbmNlIG9mIGFuY2hvclxuICAgKi9cbiAgQFZpZXdDaGlsZCgnYW5jaG9yJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGFuY2hvclJlZjogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogYmluZCB0byBbcGxhY2VIb2xkZXJdIGZvciBkaXNwbGF5aW5nIHRoZSBwbGFjZSBob2xkZXIgc3RyaW5nIG9mIHRoZSBhbmNob3IuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZUhvbGRlcjogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbY2hlY2tib3hdIGZvciBjaGVja2luZyB3aGV0aGVyIHRoZSBjbGVhcmFuY2UgZmxhZyBzaG91bGQgYmUgc2hvd24gb3Igbm90LlxuICAgKi9cbiAgQElucHV0KCkgY2hlY2tib3ggPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3N1ZmZpeFRleHRdIGZvciBkaXNwbGF5aW5nIHRoZSBzdWZmaXggb2YgdGhlIHNlbGVjdGVkIHRleHQgb2YgYW5jaG9yXG4gICAqL1xuICBASW5wdXQoKSBzdWZmaXhUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFthbGxvd0NsZWFyXSBmb3IgZW5hYmxpbmcgdGhlIGNsZWFyYW5jZSAoY2xlYXJhbmNlIGlzIG5vdCBhdmFpYWJsZSB3aGVuIGNoZWNrYm94IGlzIGVuYWJsZWQpXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd0NsZWFyID0gdHJ1ZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Zvcm1hdE51bWJlcl0gZm9yIHNob3cgZm9ybWF0dGVkIG51bWJlciB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSBmb3JtYXROdW1iZXI6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtzZWxlY3RlZFRleHRdIGZvciBkaXNwbGF5aW5nIHRoZSBzZWxlY3RlZCB0ZXh0IG9uIGFuY2hvclxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRUZXh0OiBhbnk7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtvcGVuU3RhdHVzXSwgaXQncyB0aGUgdmlzaWJpbGl0eSBzdGF0dXMgb2YgZHJvcGRvd24sIGZvciBzaG93aW5nIHRoZSBhcnJvdyBvbiBhbmNob3JcbiAgICovXG4gIEBJbnB1dCgpIG9wZW5TdGF0dXMgPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Rpc2FibGVkXSBmb3IgZGlzYWJsaW5nIHRoZSBhbmNob3JcbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNsaWNraW5nIHRoZSBhbmNob3JcbiAgICovXG4gIEBPdXRwdXQoKSBhbmNob3JDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAvKipcbiAgICogd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgY2xlYXJhbmNlXG4gICAqL1xuICBAT3V0cHV0KCkgY2xlYXJhbmNlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogbGVuZ3RoIG9mIGFuY2hvciBlbGVtZW50LCB1c2VkIGZvciBjYWxjdWxhdGUgdGhlIHN0cmluZyBsZW5ndGggb2YgdGhlIGFuY2hvciBkaXNwbGF5ZWQgdGV4dC5cbiAgICovXG4gIGFuY2hvckxlbmd0aDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RlY2ltYWxQaXBlOiBEZWNpbWFsUGlwZSkge31cblxuICAvKipcbiAgICogZmxhZyBmb3Igc2hvd2luZyB0aGUgY2xlYXJhbmNlIGZsYWdcbiAgICovXG4gIGdldCBzaG93Q2xlYXJhbmNlRmxhZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuY2hlY2tib3ggJiYgdGhpcy5zZWxlY3RlZFRleHQgJiYgdGhpcy5hbGxvd0NsZWFyO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoZSB0ZXh0IGRpc3BsYXlzIG9uIGFuY2hvclxuICAgKi9cbiAgZ2V0IGFuY2hvckRpc3BsYXlUZXh0KCk6IHN0cmluZyB7XG4gICAgbGV0IGFuY2hvckRpc3BsYXlUZXh0ID0gIHRoaXMuc2VsZWN0ZWRUZXh0ID8gKHRoaXMuZm9ybWF0TnVtYmVyID8gKGlzTnVtYmVyKHRoaXMuc2VsZWN0ZWRUZXh0KSA/XG4gICAgICB0aGlzLl9kZWNpbWFsUGlwZS50cmFuc2Zvcm0odGhpcy5zZWxlY3RlZFRleHQsICcxLjAtMicpIDogdGhpcy5zZWxlY3RlZFRleHQpIDpcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZXh0KSArICh0aGlzLnN1ZmZpeFRleHQgPyB0aGlzLnN1ZmZpeFRleHQgOiAnJykgOiB0aGlzLnBsYWNlSG9sZGVyO1xuXG4gICAgbGV0IGNoYXJMZW5ndGggPSAxO1xuICAgIGlmICh0aGlzLnNob3dDbGVhcmFuY2VGbGFnICYmIHRoaXMuYW5jaG9yTGVuZ3RoID4gMCkge1xuICAgICAgY2hhckxlbmd0aCA9IE1hdGguZmxvb3IoKHRoaXMuYW5jaG9yTGVuZ3RoIC0gNTApIC8gNyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYXJMZW5ndGggPSBNYXRoLmZsb29yKCh0aGlzLmFuY2hvckxlbmd0aCAtIDUwKSAvIDcpO1xuICAgIH1cblxuICAgIGlmIChhbmNob3JEaXNwbGF5VGV4dC5sZW5ndGggPiBjaGFyTGVuZ3RoKSB7XG4gICAgICBhbmNob3JEaXNwbGF5VGV4dCA9IGFuY2hvckRpc3BsYXlUZXh0LnNsaWNlKDAsIGNoYXJMZW5ndGggLSAyKSArICcuLi4nO1xuICAgIH1cbiAgICByZXR1cm4gYW5jaG9yRGlzcGxheVRleHQ7XG4gIH1cblxuICAvKipcbiAgICogYW5jaG9yIENTUyBjbGFzc1xuICAgKi9cbiAgZ2V0IGFuY2hvckNsYXNzKCk6IHN0cmluZyB7XG4gICAgbGV0IGFuY2hvckNsYXNzU3RhdHVzUGFydDtcbiAgICBsZXQgYW5jaG9yQ2xhc3NGb250Q29sb3I7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGFuY2hvckNsYXNzU3RhdHVzUGFydCA9ICdzZWxlY3Rpb24tYW5jaG9yLWRpc2FibGVkJztcbiAgICAgIGFuY2hvckNsYXNzRm9udENvbG9yID0gJ3BsYWNlLWhvbGRlcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wZW5TdGF0dXMpIHtcbiAgICAgICAgYW5jaG9yQ2xhc3NTdGF0dXNQYXJ0ID0gJ3NlbGVjdGlvbi1hbmNob3Itb3Blbic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhbmNob3JDbGFzc1N0YXR1c1BhcnQgPSAnc2VsZWN0aW9uLWFuY2hvci1jbG9zZSc7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFRleHQgIT0gbnVsbCkge1xuICAgICAgICBhbmNob3JDbGFzc0ZvbnRDb2xvciA9ICdzZWxlY3RlZC1pdGVtJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFuY2hvckNsYXNzRm9udENvbG9yID0gJ3BsYWNlLWhvbGRlcic7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHthbmNob3JDbGFzc1N0YXR1c1BhcnR9ICR7YW5jaG9yQ2xhc3NGb250Q29sb3J9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgYW5jaG9yXG4gICAqL1xuICBvbkFuY2hvckNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYW5jaG9yQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogdHJpZ2dlcmVkIHdpdGggKGJsdXIpIG9mIGFuY2hvclxuICAgKi9cbiAgb25BbmNob3JCbHVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHN0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJlZCB3aGVuIGNsaWNraW5nIHRoZSBjbGVhcmFuY2VcbiAgICovXG4gIG9uQ2xlYXJhbmNlQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhcmFuY2VDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2hlbiByZXNpemluZywgZ2V0IHRoZSBjbGllbnRXaWR0aCBvZiBhbmNob3JcbiAgICovXG4gIG9uUmVzaXplKCkge1xuICAgIHRoaXMuYW5jaG9yTGVuZ3RoID0gdGhpcy5hbmNob3JSZWYgPyB0aGlzLmFuY2hvclJlZi5uYXRpdmVFbGVtZW50ID8gdGhpcy5hbmNob3JSZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCA6IDAgOiAwO1xuICB9XG59XG4iLCJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge2NsZWFyQWxsU2VsZWN0aW9uLCBnZXRGaXJzdFNlbGVjdGVkSXRlbSwgaGFzR3JvdXAsIHN0b3BQcm9wYWdhdGlvbkFuZERlZmF1bHR9IGZyb20gJy4uL3V0aWxzL3V0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkcm9wZG93bicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHNwYW4gI2Ryb3Bkb3duIGNsYXNzPVwiZHJvcGRvd25cIiB0YWJpbmRleD1cIjNcIiAobW91c2Vkb3duKT1cIm9uSXRlbXNDbGljaygkZXZlbnQpXCIgKGJsdXIpPVwib25JdGVtc0JsdXIoJGV2ZW50KVwiICpuZ0lmPVwiIWRpc2FibGVkXCIgPlxuICAgICAgPGlucHV0LWZpbHRlciAjZmlsdGVySW5wdXQgdGFiaW5kZXg9XCI0XCIgKm5nSWY9XCJmaWx0ZXJCb3ggJiYgIWNoZWNrYm94XCIgWyhmaWx0ZXJWYWx1ZSldPVwiZmlsdGVyVmFsdWVcIiAoaW5wdXRGaWx0ZXJCbHVyKT1cIm9uRmlsdGVyVGV4dEJsdXIoJGV2ZW50KVwiPjwvaW5wdXQtZmlsdGVyPlxuICAgICAgPHNwYW4gI3NlbGVjdGlvbk9wdGlvbnMgW25nQ2xhc3NdPVwib3B0aW9uc0NsYXNzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNWYWx1ZXNcIiA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0gJiYgaXRlbS5ncm91cFwiPlxuICAgICAgICAgICAgPGdyb3VwLWl0ZW0gW2l0ZW1dPVwiaXRlbVwiPjwvZ3JvdXAtaXRlbT5cbiAgICAgICAgICAgIDxpdGVtICpuZ0Zvcj1cImxldCBzdWJJdGVtIG9mIGl0ZW0uaXRlbXNcIiAoaXRlbUNsaWNrKT1cIm9uSXRlbUNsaWNrKHN1Ykl0ZW0pXCIgKGNoZWNrU3RhdHVzQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdGlvbihzdWJJdGVtKVwiXG4gICAgICAgICAgICAgICAgICBbaXRlbV09XCJzdWJJdGVtXCIgW2NoZWNrYm94XT1cImNoZWNrYm94XCIgW2Zvcm1hdE51bWJlcl09XCJmb3JtYXROdW1iZXJcIiBbc3VmZml4VGV4dF09XCJzdWZmaXhUZXh0XCI+XG4gICAgICAgICAgICA8L2l0ZW0+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0gJiYgIWl0ZW0uZ3JvdXBcIj5cbiAgICAgICAgICAgIDxpdGVtIChpdGVtQ2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIiAoY2hlY2tTdGF0dXNDaGFuZ2UpPVwidG9nZ2xlU2VsZWN0aW9uKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIiBbY2hlY2tib3hdPVwiY2hlY2tib3hcIiBbZm9ybWF0TnVtYmVyXT1cImZvcm1hdE51bWJlclwiIFtzdWZmaXhUZXh0XT1cInN1ZmZpeFRleHRcIj5cbiAgICAgICAgICAgIDwvaXRlbT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3NwYW4+XG4gICAgPC9zcGFuPlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9kcm9wZG93bi5jb21wb25lbnQuc2NzcyddXG59KVxuXG5leHBvcnQgY2xhc3MgRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogQ2hpbGQgZWxlbWVudCByZWZlcmVuY2Ugb2YgZHJvcGRvd25cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRyb3Bkb3duUmVmOiBFbGVtZW50UmVmO1xuICAvKipcbiAgICogQ2hpbGQgZWxlbWVudCByZWZlcmVuY2Ugb2YgZmlsdGVyIGlucHV0IHRleHRcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2ZpbHRlcklucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGZpbHRlcklucHV0UmVmOiBFbGVtZW50UmVmO1xuICAvKipcbiAgICogYmluZCB0byBbcGxhY2VIb2xkZXJdIGZvciBkaXNwbGF5aW5nIHRoZSBwbGFjZSBob2xkZXIgc3RyaW5nIG9mIHRoZSBhbmNob3IuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZUhvbGRlcjogc3RyaW5nO1xuICAvKipcbiAgICogYmluZCB0byBbaXRlbXNdIGZvciB0aGUgb3B0aW9ucy9ncm91cHMgaW4gdGhlIGRyb3Bkb3duXG4gICAqL1xuICBASW5wdXQoKSBpdGVtczogYW55W107XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtjaGVja2JveF0sIHRoZSBmbGFnIGZvciBtdWx0aS1zZWxlY3QgKGNoZWNrYm94KSBtb2RlLlxuICAgKi9cbiAgQElucHV0KCkgY2hlY2tib3ggPSBmYWxzZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW3NlbGVjdGVkVmFsdWVdIGZvciB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIG9wdGlvbiBmcm9tIGRyb3Bkb3duXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZFZhbHVlOiBhbnk7XG4gIC8qKlxuICAgKiBiaW5kIHRvIFtmaWx0ZXJCb3hdIGZvciBkaXNwbGF5aW5nIHRoZSBmaWx0ZXIgaW5wdXQgdGV4dCBib3hcbiAgICovXG4gIEBJbnB1dCgpIGZpbHRlckJveCA9IGZhbHNlO1xuICAvKipcbiAgICogYmluZCB0byBbc3VmZml4VGV4dF0gZm9yIGRpc3BsYXlpbmcgdGhlIHN1ZmZpeCBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBvZiBhbmNob3JcbiAgICovXG4gIEBJbnB1dCgpIHN1ZmZpeFRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Rpc2FibGVkXSBmb3IgZGlzYWJsaW5nIHRoZSBkcm9wZG93blxuICAgKi9cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBiaW5kIHRvIFthbGxvd0NsZWFyXSBmb3IgZW5hYmxpbmcgdGhlIGNsZWFyYW5jZSAoY2xlYXJhbmNlIGlzIG5vdCBhdmFpYWJsZSB3aGVuIGNoZWNrYm94IGlzIGVuYWJsZWQpXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd0NsZWFyID0gdHJ1ZTtcbiAgLyoqXG4gICAqIGJpbmQgdG8gW2Zvcm1hdE51bWJlcl0gZm9yIHNob3cgZm9ybWF0dGVkIG51bWJlciB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSBmb3JtYXROdW1iZXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIGZvciAyLXdheSBiaW5kaW5nIG9mIFtzZWxlY3RlZFZhbHVlXVxuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdGVkVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4odHJ1ZSk7XG4gIC8qKlxuICAgKiBbc2VsZWN0aW9uQ2hhbmdlXSBldmVudCB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gY2hhbmdpbmcgb2YgdGhlIHNlbGVjdGlvblxuICAgKi9cbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55Pih0cnVlKTtcbiAgLyoqXG4gICAqIFtkcm9wZG93bkJsdXJdIGV2ZW50IHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2l0aCAoYmx1cikgb2YgZHJvcGRvd25cbiAgICovXG4gIEBPdXRwdXQoKSBkcm9wZG93bkJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqXG4gICAqIFtpdGVtQ2xpY2tdIGV2ZW50IHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgb3B0aW9uIG9mIGRyb3Bkb3duXG4gICAqL1xuICBAT3V0cHV0KCkgaXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKlxuICAgKiBmaWx0ZXIgdmFsdWVcbiAgICovXG4gIGZpbHRlclZhbHVlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBmbGFnIG9mIGNsaWNraW5nIGRyb3Bkb3duLiBJdCdzIHRvIHByZXZlbnQgKGJsdXIpIG9mIGRyb3Bkb3duIGZyb20gaGFwcGVuaW5nIGluIGNoZWNrYm94IG1vZGUuXG4gICAqL1xuICBwcml2YXRlIF9jbGlja2VkSXRlbXMgPSBmYWxzZTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMuaXRlbXMpIHtcbiAgICAgIHRoaXMuX2NoZWNrU2VsZWN0aW9uQ2hhbmdlKGNoYW5nZXMuaXRlbXMucHJldmlvdXNWYWx1ZSwgY2hhbmdlcy5pdGVtcy5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgZHJvcGRvd25cbiAgICovXG4gIG9uSXRlbXNDbGljayhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Lm9mZnNldFggPiAoZXZlbnQudGFyZ2V0LmNsaWVudFdpZHRoICsgZXZlbnQudGFyZ2V0LmNsaWVudExlZnQpKSB7XG4gICAgICBzdG9wUHJvcGFnYXRpb25BbmREZWZhdWx0KGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gc2hvdWxkIGlnbm9yZSBjbGlja2luZyBvbiBmaWx0ZXJcbiAgICBpZiAodGhpcy5jaGVja2JveCAmJiBldmVudC50YXJnZXQudHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICB0aGlzLl9jbGlja2VkSXRlbXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyZWQgd2hlbiBjbGlja2luZyB0aGUgaXRlbVxuICAgKi9cbiAgb25JdGVtQ2xpY2soY3VycmVudEl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHRoaXMuX2dldEl0ZW1WYWx1ZShjdXJyZW50SXRlbSk7IC8vIGN1cnJlbnRJdGVtLnZhbHVlICE9IG51bGwgPyBjdXJyZW50SXRlbS52YWx1ZSA6IGN1cnJlbnRJdGVtLnRleHQ7XG4gICAgICBjbGVhckFsbFNlbGVjdGlvbih0aGlzLml0ZW1zKTtcbiAgICAgIC8vIHNldCB0aGUgc2VsZWN0aW9uIG9mIGN1cnJlbnQgb25lXG4gICAgICBjdXJyZW50SXRlbS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLml0ZW1DbGljay5lbWl0KGN1cnJlbnRJdGVtKTtcbiAgICAgIHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJzIHdpdGggKGJsdXIpIGV2ZW50IG9mIGZpbHRlciBpbnB1dCBib3hcbiAgICovXG4gIG9uRmlsdGVyVGV4dEJsdXIoZXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duQmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VycyB3aXRoIChibHVyKSBldmVudCBvZiBkcm9wZG93blxuICAgKi9cbiAgb25JdGVtc0JsdXIoZXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja2JveCkge1xuICAgICAgaWYgKHRoaXMuX2NsaWNrZWRJdGVtcykge1xuICAgICAgICAvLyBpbiBjaGVja2JveCBtb2RlLCB0aGlzIGJsdXIgZXZlbnQgd2lsbCBiZSBpZ25vcmVkIHdoZW4gY2xpY2tpbmcgdGhlIGRyb3Bkb3duIChjaGVjayB0aGUgY2hlY2tib3gpXG4gICAgICAgIGV2ZW50LnRhcmdldC5mb2N1cygpO1xuICAgICAgICB0aGlzLl9jbGlja2VkSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRyb3Bkb3duQmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b2dnbGUgdGhlIHNlbGVjdGlvbiB3aGVuIGNoZWNraW5nIHN0YXR1cyBjaGFuZ2VkIChpbiBjaGVja2JveCBtb2RlKVxuICAgKi9cbiAgdG9nZ2xlU2VsZWN0aW9uKGl0ZW06IHtpZDogc3RyaW5nLCB2YWx1ZT86IGFueSwgdGV4dDogYW55LCBzZWxlY3RlZD86IGJvb2xlYW59KTogdm9pZCB7XG4gICAgaXRlbS5zZWxlY3RlZCA9ICFpdGVtLnNlbGVjdGVkO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5fZ2V0SXRlbVZhbHVlKGl0ZW0pKTsgLy8gaXRlbS52YWx1ZSAhPSBudWxsID8gaXRlbS52YWx1ZSA6IGl0ZW0udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogaXRlbXMgdmFsdWVzIGxpc3QgYWZ0ZXIgYXBwbHlpbmcgdGhlIGZpbHRlclxuICAgKi9cbiAgZ2V0IGl0ZW1zVmFsdWVzKCk6IGFueVtdIHtcbiAgICBsZXQgZmlsdGVyO1xuICAgIGlmICh0aGlzLmZpbHRlclZhbHVlKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmZpbHRlclZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlciA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5pdGVtcztcbiAgICB9XG4gICAgaWYgKCF0aGlzLml0ZW1zIHx8IHRoaXMuaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChoYXNHcm91cCh0aGlzLml0ZW1zKSkge1xuICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChncm91cEl0ZW0gPT4ge1xuICAgICAgICBpZiAoZ3JvdXBJdGVtLmdyb3VwICE9IG51bGwgJiYgZ3JvdXBJdGVtLmdyb3VwLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpKSB7XG4gICAgICAgICAgLy8gaWYgZ3JvdXBJdGVtIGNvbnRhaW5zIHRoZSBmaWx0ZXJzLCB0aGUgZ3JvdXBJdGVtIG5lZWRzIHRvIGJlIGRpc3BsYXllZCBhcyB3ZWxsXG4gICAgICAgICAgaXRlbXMucHVzaChncm91cEl0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSBncm91cEl0ZW0uaXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS50ZXh0ICE9IG51bGwgJiYgaXRlbS50ZXh0LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXIpKTtcbiAgICAgICAgICBpZiAoZmlsdGVyZWRJdGVtcyAmJiBmaWx0ZXJlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goe2dyb3VwOiBncm91cEl0ZW0uZ3JvdXAsIGl0ZW1zOiBmaWx0ZXJlZEl0ZW1zfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmlsdGVyKGl0ZW0gPT4gKGl0ZW0udGV4dCAhPSBudWxsICYmIGl0ZW0udGV4dC50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyKSkpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogb3B0aW9ucyBDU1MgY2xhc3NcbiAgICovXG4gIGdldCBvcHRpb25zQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5maWx0ZXJCb3ggJiYgIXRoaXMuY2hlY2tib3gpIHtcbiAgICAgIHJldHVybiAnb3B0aW9ucyB3aXRoLWZpbHRlcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnb3B0aW9ucyBuby1maWx0ZXInO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgaXRlbSB2YWx1ZS4gUmV0dXJuIHRleHQgaWYgdmFsdWUgaXMgbm90IGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0SXRlbVZhbHVlKGl0ZW0pOiBhbnkge1xuICAgIHJldHVybiBpdGVtID8gaXRlbS52YWx1ZSAhPSBudWxsID8gaXRlbS52YWx1ZSA6IGl0ZW0udGV4dCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZWxlY3Rpb24gY2hhbmdlZCwgZW1pdHMgZXZlbnRzOiAoc2VsZWN0ZWRWYWx1ZUNoYW5nZSkgYW5kIChzZWxlY3Rpb25DaGFuZ2UpO1xuICAgKi9cbiAgcHJpdmF0ZSBfb25TZWxlY3Rpb25DaGFuZ2UodmFsdWUpIHtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogY2hlY2sgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIGNoYW5nZWQuIEVtaXRzIHJlbGF0aXZlIGV2ZW50cyB3aGVuIGlmIGNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIF9jaGVja1NlbGVjdGlvbkNoYW5nZShwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpIHtcbiAgICBjb25zdCBjdXJTZWxlY3RlZEl0ZW0gPSBnZXRGaXJzdFNlbGVjdGVkSXRlbShjdXJyZW50VmFsdWUpO1xuICAgIGNvbnN0IGxhc3RTZWxlY3RlZEl0ZW0gPSBnZXRGaXJzdFNlbGVjdGVkSXRlbShwcmV2aW91c1ZhbHVlKTtcbiAgICBjb25zdCBjdXJTZWxlY3RlZEl0ZW1JZCA9IGN1clNlbGVjdGVkSXRlbSA/IGN1clNlbGVjdGVkSXRlbS5pZCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsYXN0U2VsZWN0ZWRJdGVtSWQgPSBsYXN0U2VsZWN0ZWRJdGVtID8gbGFzdFNlbGVjdGVkSXRlbS5pZCA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY3VyU2VsZWN0ZWRJdGVtSWQgIT09IGxhc3RTZWxlY3RlZEl0ZW1JZCAmJiAhdGhpcy5jaGVja2JveCkge1xuICAgICAgdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UodGhpcy5fZ2V0SXRlbVZhbHVlKGN1clNlbGVjdGVkSXRlbSkpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2l0ZW0vaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcm91cEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2dyb3VwLWl0ZW0vZ3JvdXAtaXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJbnB1dEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyL2lucHV0LWZpbHRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBbmNob3JDb21wb25lbnQgfSBmcm9tICcuL2FuY2hvci9hbmNob3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3Bkb3duTGlzdENvbXBvbmVudCB9IGZyb20gJy4vZHJvcGRvd24tbGlzdC5jb21wb25lbnQnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIERyb3Bkb3duTGlzdENvbXBvbmVudCxcclxuICAgIEl0ZW1Db21wb25lbnQsXHJcbiAgICBHcm91cEl0ZW1Db21wb25lbnQsXHJcbiAgICBJbnB1dEZpbHRlckNvbXBvbmVudCxcclxuICAgIEFuY2hvckNvbXBvbmVudCxcclxuICAgIERyb3Bkb3duQ29tcG9uZW50XHJcbiAgXSxcclxuICBleHBvcnRzOiBbIERyb3Bkb3duTGlzdENvbXBvbmVudF0sXHJcbiAgaW1wb3J0czogWyBDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlIF0sXHJcbiAgcHJvdmlkZXJzOiBbXSxcclxuICBib290c3RyYXA6IFtdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJvcGRvd25MaXN0TW9kdWxlIHt9XHJcbiJdLCJuYW1lcyI6WyJ0c2xpYl8xLl9fdmFsdWVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLFNBQWdCLFFBQVEsQ0FBQyxLQUFLO0lBQzVCLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJ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