@skyux/lists 11.31.0 → 12.0.0-alpha.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 (62) hide show
  1. package/documentation.json +751 -742
  2. package/fesm2022/skyux-lists-testing.mjs +16 -16
  3. package/fesm2022/skyux-lists-testing.mjs.map +1 -1
  4. package/fesm2022/skyux-lists.mjs +102 -102
  5. package/fesm2022/skyux-lists.mjs.map +1 -1
  6. package/package.json +16 -20
  7. package/esm2022/index.mjs +0 -23
  8. package/esm2022/lib/modules/filter/filter-button.component.mjs +0 -79
  9. package/esm2022/lib/modules/filter/filter-inline-item.component.mjs +0 -14
  10. package/esm2022/lib/modules/filter/filter-inline.component.mjs +0 -14
  11. package/esm2022/lib/modules/filter/filter-summary-item.component.mjs +0 -52
  12. package/esm2022/lib/modules/filter/filter-summary.component.mjs +0 -15
  13. package/esm2022/lib/modules/filter/filter.module.mjs +0 -60
  14. package/esm2022/lib/modules/infinite-scroll/infinite-scroll-dom-adapter.service.mjs +0 -81
  15. package/esm2022/lib/modules/infinite-scroll/infinite-scroll.component.mjs +0 -115
  16. package/esm2022/lib/modules/infinite-scroll/infinite-scroll.module.mjs +0 -19
  17. package/esm2022/lib/modules/paging/paging-content.component.mjs +0 -15
  18. package/esm2022/lib/modules/paging/paging.component.mjs +0 -151
  19. package/esm2022/lib/modules/paging/paging.module.mjs +0 -39
  20. package/esm2022/lib/modules/paging/types/paging-content-change-args.mjs +0 -2
  21. package/esm2022/lib/modules/repeater/repeater-adapter.service.mjs +0 -75
  22. package/esm2022/lib/modules/repeater/repeater-auto-scroll-options.mjs +0 -2
  23. package/esm2022/lib/modules/repeater/repeater-auto-scroll.service.mjs +0 -17
  24. package/esm2022/lib/modules/repeater/repeater-auto-scroller.mjs +0 -2
  25. package/esm2022/lib/modules/repeater/repeater-expand-mode-type.mjs +0 -2
  26. package/esm2022/lib/modules/repeater/repeater-item-content.component.mjs +0 -14
  27. package/esm2022/lib/modules/repeater/repeater-item-context-menu.component.mjs +0 -17
  28. package/esm2022/lib/modules/repeater/repeater-item-roles.type.mjs +0 -2
  29. package/esm2022/lib/modules/repeater/repeater-item-title.component.mjs +0 -14
  30. package/esm2022/lib/modules/repeater/repeater-item.component.mjs +0 -558
  31. package/esm2022/lib/modules/repeater/repeater-role.type.mjs +0 -2
  32. package/esm2022/lib/modules/repeater/repeater.component.mjs +0 -371
  33. package/esm2022/lib/modules/repeater/repeater.module.mjs +0 -77
  34. package/esm2022/lib/modules/repeater/repeater.service.mjs +0 -86
  35. package/esm2022/lib/modules/shared/sky-lists-resources.module.mjs +0 -72
  36. package/esm2022/lib/modules/sort/sort-item.component.mjs +0 -69
  37. package/esm2022/lib/modules/sort/sort-menu-heading.component.mjs +0 -13
  38. package/esm2022/lib/modules/sort/sort.component.mjs +0 -45
  39. package/esm2022/lib/modules/sort/sort.module.mjs +0 -48
  40. package/esm2022/lib/modules/sort/sort.service.mjs +0 -20
  41. package/esm2022/skyux-lists.mjs +0 -5
  42. package/esm2022/testing/legacy/filter/filter-fixture-button.mjs +0 -53
  43. package/esm2022/testing/legacy/filter/filter-fixture-summary.mjs +0 -32
  44. package/esm2022/testing/legacy/filter/filter-testing.module.mjs +0 -18
  45. package/esm2022/testing/legacy/filter/lists-filter-fixture-button.mjs +0 -2
  46. package/esm2022/testing/legacy/infinite-scroll/infinite-scroll-fixture.mjs +0 -31
  47. package/esm2022/testing/legacy/infinite-scroll/infinite-scroll-testing.module.mjs +0 -18
  48. package/esm2022/testing/legacy/paging/paging-fixture-button.mjs +0 -2
  49. package/esm2022/testing/legacy/paging/paging-fixture.mjs +0 -95
  50. package/esm2022/testing/legacy/paging/paging-testing.module.mjs +0 -18
  51. package/esm2022/testing/legacy/sort/sort-fixture-menu-item.mjs +0 -2
  52. package/esm2022/testing/legacy/sort/sort-fixture-menu.mjs +0 -2
  53. package/esm2022/testing/legacy/sort/sort-fixture.mjs +0 -149
  54. package/esm2022/testing/legacy/sort/sort-testing.module.mjs +0 -20
  55. package/esm2022/testing/modules/infinite-scroll/infinite-scroll-harness-filters.mjs +0 -2
  56. package/esm2022/testing/modules/infinite-scroll/infinite-scroll-harness.mjs +0 -49
  57. package/esm2022/testing/modules/repeater/repeater-harness-filters.mjs +0 -2
  58. package/esm2022/testing/modules/repeater/repeater-harness.mjs +0 -25
  59. package/esm2022/testing/modules/repeater/repeater-item-harness-filters.mjs +0 -2
  60. package/esm2022/testing/modules/repeater/repeater-item-harness.mjs +0 -149
  61. package/esm2022/testing/public-api.mjs +0 -13
  62. package/esm2022/testing/skyux-lists-testing.mjs +0 -5
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXItcm9sZS50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xpc3RzL3NyYy9saWIvbW9kdWxlcy9yZXBlYXRlci9yZXBlYXRlci1yb2xlLnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFNreVJlcGVhdGVyUm9sZVR5cGUgPSAnbGlzdCcgfCAnbGlzdGJveCcgfCAnZ3JpZCc7XG4iXX0=
@@ -1,371 +0,0 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Input, Output, Renderer2, inject, } from '@angular/core';
2
- import { SkyLogService, SkyScrollableHostService } from '@skyux/core';
3
- import { DragulaService } from 'ng2-dragula';
4
- import { Subject } from 'rxjs';
5
- import { takeUntil } from 'rxjs/operators';
6
- import { SkyRepeaterAdapterService } from './repeater-adapter.service';
7
- import { SkyRepeaterAutoScrollService } from './repeater-auto-scroll.service';
8
- import { SkyRepeaterItemComponent } from './repeater-item.component';
9
- import { SkyRepeaterService } from './repeater.service';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "ng2-dragula";
12
- import * as i2 from "@angular/cdk/observers";
13
- import * as i3 from "@skyux/i18n";
14
- /**
15
- * Creates a container to display repeater items.
16
- */
17
- export class SkyRepeaterComponent {
18
- /**
19
- * The layout that determines which repeater items are expanded by default and whether
20
- * repeater items are expandable and collapsible. Collapsed items display titles only.
21
- * The valid options are `multiple`, `none`, and `single`.
22
- * - `multiple` loads repeater items in an expanded state unless `isExpanded` is set to
23
- * `false` for a repeater item. This layout allows users to expand and collapse
24
- * as many repeater items as necessary. It is best-suited to repeater items where body
25
- * content is important but users don't always need to see it.
26
- * - `none` loads all repeater items in an expanded state and does not allow users to
27
- * collapse them. This default layout provides the quickest access to the details in the
28
- * repeater items. It is best-suited to repeater items with concise content
29
- * that users need to view frequently.
30
- * - `single` loads one repeater item in an expanded state and collapses all others.
31
- * The expanded repeater item is the first one where `isExpanded` is set to `true`. This layout
32
- * allows users to expand one item at a time. It provides the most compact view and is
33
- * best-suited to repeater items where the most important information is in the titles
34
- * and users only occasionally need to view the body content.
35
- * @default "none"
36
- */
37
- set expandMode(value) {
38
- this.#repeaterService.expandMode = value;
39
- this.#updateForExpandMode();
40
- }
41
- get expandMode() {
42
- return this.#repeaterService.expandMode;
43
- }
44
- #autoScroller;
45
- #ngUnsubscribe;
46
- #itemNameWarned;
47
- #adapterService;
48
- #changeDetector;
49
- #dragulaService;
50
- #elementRef;
51
- #renderer;
52
- #repeaterService;
53
- #autoScrollSvc;
54
- #scrollableHostSvc;
55
- #logSvc;
56
- constructor() {
57
- /**
58
- * Whether users can change the order of items in the repeater list.
59
- * Each repeater item also has `reorderable` property to indicate whether
60
- * users can change its order.
61
- */
62
- this.reorderable = false;
63
- /**
64
- * Fires when the active repeater item changes.
65
- */
66
- this.activeIndexChange = new EventEmitter();
67
- /**
68
- * Fires when users change the order of repeater items.
69
- * This event emits an ordered array of the `tag` properties that the consumer provides for each repeater item.
70
- */
71
- this.orderChange = new EventEmitter();
72
- this.#ngUnsubscribe = new Subject();
73
- this.#itemNameWarned = false;
74
- this.#adapterService = inject(SkyRepeaterAdapterService);
75
- this.#changeDetector = inject(ChangeDetectorRef);
76
- this.#dragulaService = inject(DragulaService);
77
- this.#elementRef = inject(ElementRef);
78
- this.#renderer = inject(Renderer2);
79
- this.#repeaterService = inject(SkyRepeaterService);
80
- this.#autoScrollSvc = inject(SkyRepeaterAutoScrollService);
81
- this.#scrollableHostSvc = inject(SkyScrollableHostService);
82
- this.#logSvc = inject(SkyLogService);
83
- this.dragulaGroupName = `sky-repeater-dragula-${this.#repeaterService.repeaterGroupId}`;
84
- this.#repeaterService.itemCollapseStateChange
85
- .pipe(takeUntil(this.#ngUnsubscribe))
86
- .subscribe((item) => {
87
- if (this.expandMode === 'single' && item.isExpanded) {
88
- this.items?.forEach((otherItem) => {
89
- if (otherItem !== item &&
90
- otherItem.isExpanded &&
91
- otherItem.isCollapsible) {
92
- otherItem.isExpanded = false;
93
- }
94
- });
95
- }
96
- });
97
- this.#repeaterService.activeItemIndexChange
98
- .pipe(takeUntil(this.#ngUnsubscribe))
99
- .subscribe((index) => {
100
- if (index !== this.activeIndex) {
101
- this.activeIndex = index;
102
- this.activeIndexChange.emit(index);
103
- }
104
- });
105
- this.#repeaterService.orderChange
106
- .pipe(takeUntil(this.#ngUnsubscribe))
107
- .subscribe(() => {
108
- this.#emitTags();
109
- });
110
- this.#updateForExpandMode();
111
- this.#adapterService.setRepeaterHost(this.#elementRef);
112
- this.#initializeDragAndDrop();
113
- }
114
- ngAfterContentInit() {
115
- // If activeIndex has been set on init, call service to activate the appropriate item.
116
- setTimeout(() => {
117
- if (this.activeIndex || this.activeIndex === 0) {
118
- this.#repeaterService.activateItemByIndex(this.activeIndex);
119
- }
120
- this.#validateTags();
121
- });
122
- // HACK: Not updating for expand mode in a timeout causes an error.
123
- // https://github.com/angular/angular/issues/6005
124
- this.items?.changes.pipe(takeUntil(this.#ngUnsubscribe)).subscribe(() => {
125
- setTimeout(() => {
126
- if (this.items?.length) {
127
- this.#updateForExpandMode(this.items.last);
128
- this.#updateReorderability();
129
- this.#repeaterService.items = this.items.toArray();
130
- }
131
- if (this.activeIndex !== undefined) {
132
- this.#repeaterService.activateItemByIndex(this.activeIndex);
133
- }
134
- this.#updateRole();
135
- this.#validateTags();
136
- });
137
- });
138
- setTimeout(() => {
139
- this.#updateForExpandMode();
140
- this.items?.forEach((item) => {
141
- item.reorderable = this.reorderable;
142
- });
143
- this.#updateRole();
144
- }, 0);
145
- }
146
- ngAfterViewChecked() {
147
- if (!this.#itemNameWarned && this.items?.some((item) => !item.itemName)) {
148
- this.#logSvc?.deprecated('SkyRepeaterItemComponent without `itemName`', {
149
- deprecationMajorVersion: 8,
150
- replacementRecommendation: 'Always specify an `itemName` property.',
151
- });
152
- this.#itemNameWarned = true;
153
- }
154
- }
155
- ngOnChanges(changes) {
156
- if (changes['activeIndex']) {
157
- this.#repeaterService.enableActiveState = true;
158
- if (changes['activeIndex'].currentValue !==
159
- changes['activeIndex'].previousValue) {
160
- this.#repeaterService.activateItemByIndex(this.activeIndex);
161
- }
162
- }
163
- if (changes['reorderable']) {
164
- if (this.items) {
165
- this.#updateReorderability();
166
- }
167
- this.#updateRole();
168
- this.#changeDetector.markForCheck();
169
- }
170
- }
171
- ngOnDestroy() {
172
- this.#ngUnsubscribe.next();
173
- this.#ngUnsubscribe.complete();
174
- this.#destroyDragAndDrop();
175
- }
176
- ngOnInit() {
177
- this.#updateRole();
178
- }
179
- onCdkObserveContent() {
180
- this.#updateRole();
181
- }
182
- #updateForExpandMode(itemAdded) {
183
- if (this.items) {
184
- let foundExpanded = false;
185
- const isCollapsible = this.expandMode !== 'none';
186
- const isSingle = this.expandMode === 'single';
187
- // Keep any newly-added expanded item expanded and collapse the rest.
188
- if (itemAdded && itemAdded.isExpanded) {
189
- foundExpanded = true;
190
- }
191
- for (const item of this.items) {
192
- item.isCollapsible = isCollapsible && !!item.hasItemContent;
193
- // Collapse any items that aren't the item that was just added.
194
- if (item !== itemAdded && isSingle && item.isExpanded) {
195
- if (foundExpanded) {
196
- // If this item is being collapsed because a new item was
197
- // added, animate it.
198
- item.updateForExpanded(false, !!itemAdded);
199
- }
200
- foundExpanded = true;
201
- }
202
- }
203
- this.#updateRole();
204
- }
205
- }
206
- #initializeDragAndDrop() {
207
- /* Sanity check that we haven't already set up dragging abilities */
208
- /* istanbul ignore else */
209
- if (!this.#dragulaService.find(this.dragulaGroupName)) {
210
- this.#dragulaService.createGroup(this.dragulaGroupName, {
211
- moves: (el, _container, handle) => {
212
- const target = el?.querySelector('.sky-repeater-item-grab-handle');
213
- return !!(this.reorderable && target?.contains(handle));
214
- },
215
- });
216
- }
217
- let draggedItemIndex = -1;
218
- this.#dragulaService
219
- .drag(this.dragulaGroupName)
220
- .pipe(takeUntil(this.#ngUnsubscribe))
221
- .subscribe((args) => {
222
- /* istanbul ignore else */
223
- if (args.name === this.dragulaGroupName) {
224
- this.#destroyAutoScroll();
225
- this.#autoScroller = this.#autoScrollSvc.autoScroll([this.#scrollableHostSvc.getScrollableHost(this.#elementRef)], {
226
- margin: 20,
227
- maxSpeed: 10,
228
- scrollWhenOutside: true,
229
- autoScroll: () => true,
230
- });
231
- this.#renderer.addClass(args.el, 'sky-repeater-item-dragging');
232
- draggedItemIndex = this.#adapterService.getRepeaterItemIndex(args.el);
233
- }
234
- });
235
- this.#dragulaService
236
- .dragend(this.dragulaGroupName)
237
- .pipe(takeUntil(this.#ngUnsubscribe))
238
- .subscribe((args) => {
239
- /* istanbul ignore else */
240
- if (args.name === this.dragulaGroupName) {
241
- this.#destroyAutoScroll();
242
- this.#renderer.removeClass(args.el, 'sky-repeater-item-dragging');
243
- const newItemIndex = this.#adapterService.getRepeaterItemIndex(args.el);
244
- /* sanity check */
245
- /* istanbul ignore else */
246
- if (draggedItemIndex >= 0) {
247
- this.#repeaterService.reorderItem(draggedItemIndex, newItemIndex);
248
- draggedItemIndex = -1;
249
- }
250
- this.#emitTags();
251
- }
252
- });
253
- }
254
- #destroyDragAndDrop() {
255
- /* Sanity check that we have set up dragging abilities */
256
- /* istanbul ignore else */
257
- if (this.#dragulaService.find(this.dragulaGroupName)) {
258
- this.#dragulaService.destroy(this.dragulaGroupName);
259
- }
260
- this.#destroyAutoScroll();
261
- }
262
- #destroyAutoScroll() {
263
- if (this.#autoScroller) {
264
- this.#autoScroller.destroy();
265
- this.#autoScroller = undefined;
266
- }
267
- }
268
- #emitTags() {
269
- const tags = this.#repeaterService.items.map((item) => item.tag);
270
- this.orderChange.emit(tags);
271
- }
272
- #everyItemHasTag() {
273
- /* safety check */
274
- if (!this.items || this.items.length === 0) {
275
- return true;
276
- }
277
- return this.items.toArray().every((item) => {
278
- return item.tag !== undefined;
279
- });
280
- }
281
- #updateRole() {
282
- // Determine a role using a hierarchy based on https://www.w3.org/TR/wai-aria-practices-1.1/
283
- // 1. If there are one or more interactions in the repeater item projected content, use grid.
284
- // 2. If there are selectable repeater items and no other interactions, use listbox.
285
- // 3. If there are no interactions, use list.
286
- // Default to list role.
287
- let autoRole = 'list';
288
- const roleMap = {
289
- list: { item: 'listitem', title: undefined, content: undefined },
290
- listbox: { item: 'option', title: undefined, content: undefined },
291
- grid: { item: 'row', title: 'rowheader', content: 'gridcell' },
292
- };
293
- // Based on https://html.spec.whatwg.org/multipage/dom.html#interactive-content
294
- const interactionSelector = [
295
- 'a[href]',
296
- 'audio[controls]',
297
- 'button',
298
- 'details',
299
- 'embed',
300
- 'iframe',
301
- 'img[usemap]',
302
- 'input:not([type="hidden"])',
303
- 'label',
304
- 'select',
305
- 'textarea',
306
- 'video[controls]',
307
- '[contenteditable]',
308
- '.sky-repeater[role="grid"]',
309
- ]
310
- .map((selector) => `sky-repeater-item-title ${selector}:not([hidden]), sky-repeater-item-content ${selector}:not([hidden])`)
311
- .concat([`skyux-dropdown`])
312
- .join(', ');
313
- const hasInteraction = this.reorderable ||
314
- this.items?.some((item) => item.isCollapsible) ||
315
- this.items?.some((item) => !!item.selectable) ||
316
- !!this.#elementRef.nativeElement.querySelector(interactionSelector);
317
- if (hasInteraction) {
318
- // If the repeater matches interaction selector https://www.w3.org/TR/wai-aria-practices-1.1/#grid
319
- autoRole = 'grid';
320
- }
321
- if (this.role !== autoRole) {
322
- this.#repeaterService.itemRole.next({
323
- ...roleMap[autoRole],
324
- });
325
- this.role = `${autoRole}`;
326
- this.#changeDetector.markForCheck();
327
- }
328
- }
329
- #updateReorderability() {
330
- if (this.items) {
331
- for (const item of this.items) {
332
- item.reorderable = this.reorderable;
333
- }
334
- }
335
- }
336
- #validateTags() {
337
- if (this.reorderable && !this.#everyItemHasTag()) {
338
- this.#logSvc.warn('Please supply tag properties for each repeater item when reordering functionality is enabled.');
339
- }
340
- }
341
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyRepeaterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
342
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SkyRepeaterComponent, selector: "sky-repeater", inputs: { activeIndex: "activeIndex", ariaLabel: "ariaLabel", reorderable: "reorderable", expandMode: "expandMode" }, outputs: { activeIndexChange: "activeIndexChange", orderChange: "orderChange" }, providers: [
343
- SkyRepeaterService,
344
- SkyRepeaterAdapterService,
345
- SkyRepeaterAutoScrollService,
346
- ], queries: [{ propertyName: "items", predicate: SkyRepeaterItemComponent }], usesOnChanges: true, ngImport: i0, template: "<ng-container #repeaterHost>\n <div\n class=\"sky-repeater\"\n [attr.role]=\"role\"\n [attr.aria-label]=\"ariaLabel || ('skyux_repeater_label' | skyLibResources)\"\n [dragula]=\"dragulaGroupName\"\n (cdkObserveContent)=\"onCdkObserveContent()\"\n >\n <ng-content />\n </div>\n</ng-container>\n", styles: [".sky-repeater{padding:0}\n"], dependencies: [{ kind: "directive", type: i1.DragulaDirective, selector: "[dragula]", inputs: ["dragula", "dragulaModel"], outputs: ["dragulaModelChange"] }, { kind: "directive", type: i2.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }, { kind: "pipe", type: i3.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
347
- }
348
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyRepeaterComponent, decorators: [{
349
- type: Component,
350
- args: [{ selector: 'sky-repeater', providers: [
351
- SkyRepeaterService,
352
- SkyRepeaterAdapterService,
353
- SkyRepeaterAutoScrollService,
354
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container #repeaterHost>\n <div\n class=\"sky-repeater\"\n [attr.role]=\"role\"\n [attr.aria-label]=\"ariaLabel || ('skyux_repeater_label' | skyLibResources)\"\n [dragula]=\"dragulaGroupName\"\n (cdkObserveContent)=\"onCdkObserveContent()\"\n >\n <ng-content />\n </div>\n</ng-container>\n", styles: [".sky-repeater{padding:0}\n"] }]
355
- }], ctorParameters: () => [], propDecorators: { activeIndex: [{
356
- type: Input
357
- }], ariaLabel: [{
358
- type: Input
359
- }], reorderable: [{
360
- type: Input
361
- }], expandMode: [{
362
- type: Input
363
- }], activeIndexChange: [{
364
- type: Output
365
- }], orderChange: [{
366
- type: Output
367
- }], items: [{
368
- type: ContentChildren,
369
- args: [SkyRepeaterItemComponent]
370
- }] } });
371
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xpc3RzL3NyYy9saWIvbW9kdWxlcy9yZXBlYXRlci9yZXBlYXRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvbGlzdHMvc3JjL2xpYi9tb2R1bGVzL3JlcGVhdGVyL3JlcGVhdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUVOLFNBQVMsRUFFVCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBSTlFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7OztBQUV4RDs7R0FFRztBQVlILE1BQU0sT0FBTyxvQkFBb0I7SUE4Qi9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDSCxJQUNXLFVBQVUsQ0FBQyxLQUE0QztRQUNoRSxJQUFJLENBQUMsZ0JBQWdCLENB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Q0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZiwrRkFBK0YsQ0FDaEcsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOytHQTNhVSxvQkFBb0I7bUdBQXBCLG9CQUFvQiw4T0FQcEI7WUFDVCxrQkFBa0I7WUFDbEIseUJBQXlCO1lBQ3pCLDRCQUE0QjtTQUM3QixnREE0RWdCLHdCQUF3QixrREN6SDNDLDRUQVdBOzs0RkRxQ2Esb0JBQW9CO2tCQVhoQyxTQUFTOytCQUNFLGNBQWMsYUFHYjt3QkFDVCxrQkFBa0I7d0JBQ2xCLHlCQUF5Qjt3QkFDekIsNEJBQTRCO3FCQUM3QixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTt3REFZeEMsV0FBVztzQkFEakIsS0FBSztnQkFXQyxTQUFTO3NCQURmLEtBQUs7Z0JBU0MsV0FBVztzQkFEakIsS0FBSztnQkF1QkssVUFBVTtzQkFEcEIsS0FBSztnQkFjQyxpQkFBaUI7c0JBRHZCLE1BQU07Z0JBU0EsV0FBVztzQkFGakIsTUFBTTtnQkFLQSxLQUFLO3NCQURYLGVBQWU7dUJBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNreUxvZ1NlcnZpY2UsIFNreVNjcm9sbGFibGVIb3N0U2VydmljZSB9IGZyb20gJ0Bza3l1eC9jb3JlJztcblxuaW1wb3J0IHsgRHJhZ3VsYVNlcnZpY2UgfSBmcm9tICduZzItZHJhZ3VsYSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreVJlcGVhdGVyQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL3JlcGVhdGVyLWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTa3lSZXBlYXRlckF1dG9TY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi9yZXBlYXRlci1hdXRvLXNjcm9sbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNreVJlcGVhdGVyQXV0b1Njcm9sbGVyIH0gZnJvbSAnLi9yZXBlYXRlci1hdXRvLXNjcm9sbGVyJztcbmltcG9ydCB7IFNreVJlcGVhdGVyRXhwYW5kTW9kZVR5cGUgfSBmcm9tICcuL3JlcGVhdGVyLWV4cGFuZC1tb2RlLXR5cGUnO1xuaW1wb3J0IHsgU2t5UmVwZWF0ZXJJdGVtUm9sZXNUeXBlIH0gZnJvbSAnLi9yZXBlYXRlci1pdGVtLXJvbGVzLnR5cGUnO1xuaW1wb3J0IHsgU2t5UmVwZWF0ZXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9yZXBlYXRlci1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTa3lSZXBlYXRlclJvbGVUeXBlIH0gZnJvbSAnLi9yZXBlYXRlci1yb2xlLnR5cGUnO1xuaW1wb3J0IHsgU2t5UmVwZWF0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9yZXBlYXRlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29udGFpbmVyIHRvIGRpc3BsYXkgcmVwZWF0ZXIgaXRlbXMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1yZXBlYXRlcicsXG4gIHN0eWxlVXJsczogWycuL3JlcGVhdGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXBlYXRlci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIFNreVJlcGVhdGVyU2VydmljZSxcbiAgICBTa3lSZXBlYXRlckFkYXB0ZXJTZXJ2aWNlLFxuICAgIFNreVJlcGVhdGVyQXV0b1Njcm9sbFNlcnZpY2UsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTa3lSZXBlYXRlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0NoZWNrZWQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXRcbntcbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiB0aGUgcmVwZWF0ZXIgaXRlbSB0byB2aXN1YWxseSBoaWdobGlnaHQgYXMgYWN0aXZlLlxuICAgKiBGb3IgZXhhbXBsZSwgdXNlIHRoaXMgcHJvcGVydHkgaW4gY29uanVuY3Rpb24gd2l0aCB0aGVcbiAgICogW3NwbGl0IHZpZXcgY29tcG9uZW50XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvc3BsaXQtdmlldylcbiAgICogdG8gaGlnaGxpZ2h0IGEgcmVwZWF0ZXIgaXRlbSB3aGlsZSB1c2VycyBlZGl0IGl0LiBPbmx5IG9uZSBpdGVtIGNhbiBiZSBhY3RpdmUgYXQgYSB0aW1lLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFjdGl2ZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBBUklBIGxhYmVsIGZvciB0aGUgcmVwZWF0ZXIgbGlzdC5cbiAgICogVGhpcyBzZXRzIHRoZSByZXBlYXRlciBsaXN0J3MgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSB0byBwcm92aWRlIGEgdGV4dCBlcXVpdmFsZW50IGZvciBzY3JlZW4gcmVhZGVyc1xuICAgKiBbdG8gc3VwcG9ydCBhY2Nlc3NpYmlsaXR5XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2xlYXJuL2FjY2Vzc2liaWxpdHkpLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSwgc2VlIHRoZSBbV0FJLUFSSUEgZGVmaW5pdGlvbl0oaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLyNhcmlhLWxhYmVsKS5cbiAgICogQGRlZmF1bHQgXCJMaXN0IG9mIGl0ZW1zXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB1c2VycyBjYW4gY2hhbmdlIHRoZSBvcmRlciBvZiBpdGVtcyBpbiB0aGUgcmVwZWF0ZXIgbGlzdC5cbiAgICogRWFjaCByZXBlYXRlciBpdGVtIGFsc28gaGFzIGByZW9yZGVyYWJsZWAgcHJvcGVydHkgdG8gaW5kaWNhdGUgd2hldGhlclxuICAgKiB1c2VycyBjYW4gY2hhbmdlIGl0cyBvcmRlci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZW9yZGVyYWJsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgbGF5b3V0IHRoYXQgZGV0ZXJtaW5lcyB3aGljaCByZXBlYXRlciBpdGVtcyBhcmUgZXhwYW5kZWQgYnkgZGVmYXVsdCBhbmQgd2hldGhlclxuICAgKiByZXBlYXRlciBpdGVtcyBhcmUgZXhwYW5kYWJsZSBhbmQgY29sbGFwc2libGUuIENvbGxhcHNlZCBpdGVtcyBkaXNwbGF5IHRpdGxlcyBvbmx5LlxuICAgKiBUaGUgdmFsaWQgb3B0aW9ucyBhcmUgYG11bHRpcGxlYCwgYG5vbmVgLCBhbmQgYHNpbmdsZWAuXG4gICAqIC0gYG11bHRpcGxlYCBsb2FkcyByZXBlYXRlciBpdGVtcyBpbiBhbiBleHBhbmRlZCBzdGF0ZSB1bmxlc3MgYGlzRXhwYW5kZWRgIGlzIHNldCB0b1xuICAgKiBgZmFsc2VgIGZvciBhIHJlcGVhdGVyIGl0ZW0uIFRoaXMgbGF5b3V0IGFsbG93cyB1c2VycyB0byBleHBhbmQgYW5kIGNvbGxhcHNlXG4gICAqIGFzIG1hbnkgcmVwZWF0ZXIgaXRlbXMgYXMgbmVjZXNzYXJ5LiBJdCBpcyBiZXN0LXN1aXRlZCB0byByZXBlYXRlciBpdGVtcyB3aGVyZSBib2R5XG4gICAqIGNvbnRlbnQgaXMgaW1wb3J0YW50IGJ1dCB1c2VycyBkb24ndCBhbHdheXMgbmVlZCB0byBzZWUgaXQuXG4gICAqIC0gYG5vbmVgIGxvYWRzIGFsbCByZXBlYXRlciBpdGVtcyBpbiBhbiBleHBhbmRlZCBzdGF0ZSBhbmQgZG9lcyBub3QgYWxsb3cgdXNlcnMgdG9cbiAgICogY29sbGFwc2UgdGhlbS4gVGhpcyBkZWZhdWx0IGxheW91dCBwcm92aWRlcyB0aGUgcXVpY2tlc3QgYWNjZXNzIHRvIHRoZSBkZXRhaWxzIGluIHRoZVxuICAgKiByZXBlYXRlciBpdGVtcy4gSXQgaXMgYmVzdC1zdWl0ZWQgdG8gcmVwZWF0ZXIgaXRlbXMgd2l0aCBjb25jaXNlIGNvbnRlbnRcbiAgICogdGhhdCB1c2VycyBuZWVkIHRvIHZpZXcgZnJlcXVlbnRseS5cbiAgICogLSBgc2luZ2xlYCBsb2FkcyBvbmUgcmVwZWF0ZXIgaXRlbSBpbiBhbiBleHBhbmRlZCBzdGF0ZSBhbmQgY29sbGFwc2VzIGFsbCBvdGhlcnMuXG4gICAqIFRoZSBleHBhbmRlZCByZXBlYXRlciBpdGVtIGlzIHRoZSBmaXJzdCBvbmUgd2hlcmUgYGlzRXhwYW5kZWRgIGlzIHNldCB0byBgdHJ1ZWAuIFRoaXMgbGF5b3V0XG4gICAqIGFsbG93cyB1c2VycyB0byBleHBhbmQgb25lIGl0ZW0gYXQgYSB0aW1lLiBJdCBwcm92aWRlcyB0aGUgbW9zdCBjb21wYWN0IHZpZXcgYW5kIGlzXG4gICAqIGJlc3Qtc3VpdGVkIHRvIHJlcGVhdGVyIGl0ZW1zIHdoZXJlIHRoZSBtb3N0IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgdGl0bGVzXG4gICAqIGFuZCB1c2VycyBvbmx5IG9jY2FzaW9uYWxseSBuZWVkIHRvIHZpZXcgdGhlIGJvZHkgY29udGVudC5cbiAgICogQGRlZmF1bHQgXCJub25lXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZXhwYW5kTW9kZSh2YWx1ZTogU2t5UmVwZWF0ZXJFeHBhbmRNb2RlVHlwZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3JlcGVhdGVyU2VydmljZS5leHBhbmRNb2RlID0gdmFsdWU7XG4gICAgdGhpcy4jdXBkYXRlRm9yRXhwYW5kTW9kZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBleHBhbmRNb2RlKCk6IFNreVJlcGVhdGVyRXhwYW5kTW9kZVR5cGUge1xuICAgIHJldHVybiB0aGlzLiNyZXBlYXRlclNlcnZpY2UuZXhwYW5kTW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBhY3RpdmUgcmVwZWF0ZXIgaXRlbSBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBhY3RpdmVJbmRleENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGNoYW5nZSB0aGUgb3JkZXIgb2YgcmVwZWF0ZXIgaXRlbXMuXG4gICAqIFRoaXMgZXZlbnQgZW1pdHMgYW4gb3JkZXJlZCBhcnJheSBvZiB0aGUgYHRhZ2AgcHJvcGVydGllcyB0aGF0IHRoZSBjb25zdW1lciBwcm92aWRlcyBmb3IgZWFjaCByZXBlYXRlciBpdGVtLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyBvcmRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTa3lSZXBlYXRlckl0ZW1Db21wb25lbnQpXG4gIHB1YmxpYyBpdGVtczogUXVlcnlMaXN0PFNreVJlcGVhdGVySXRlbUNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGRyYWd1bGFHcm91cE5hbWU6IHN0cmluZztcblxuICBwdWJsaWMgcm9sZTogU2t5UmVwZWF0ZXJSb2xlVHlwZSB8IHVuZGVmaW5lZDtcblxuICAjYXV0b1Njcm9sbGVyOiBTa3lSZXBlYXRlckF1dG9TY3JvbGxlciB8IHVuZGVmaW5lZDtcbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAjaXRlbU5hbWVXYXJuZWQgPSBmYWxzZTtcblxuICAjYWRhcHRlclNlcnZpY2UgPSBpbmplY3QoU2t5UmVwZWF0ZXJBZGFwdGVyU2VydmljZSk7XG4gICNjaGFuZ2VEZXRlY3RvciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gICNkcmFndWxhU2VydmljZSA9IGluamVjdChEcmFndWxhU2VydmljZSk7XG4gICNlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAjcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgI3JlcGVhdGVyU2VydmljZSA9IGluamVjdChTa3lSZXBlYXRlclNlcnZpY2UpO1xuICAjYXV0b1Njcm9sbFN2YyA9IGluamVjdChTa3lSZXBlYXRlckF1dG9TY3JvbGxTZXJ2aWNlKTtcbiAgI3Njcm9sbGFibGVIb3N0U3ZjID0gaW5qZWN0KFNreVNjcm9sbGFibGVIb3N0U2VydmljZSk7XG4gICNsb2dTdmMgPSBpbmplY3QoU2t5TG9nU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5kcmFndWxhR3JvdXBOYW1lID0gYHNreS1yZXBlYXRlci1kcmFndWxhLSR7dGhpcy4jcmVwZWF0ZXJTZXJ2aWNlLnJlcGVhdGVyR3JvdXBJZH1gO1xuXG4gICAgdGhpcy4jcmVwZWF0ZXJTZXJ2aWNlLml0ZW1Db2xsYXBzZVN0YXRlQ2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKChpdGVtOiBTa3lSZXBlYXRlckl0ZW1Db21wb25lbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZXhwYW5kTW9kZSA9PT0gJ3NpbmdsZScgJiYgaXRlbS5pc0V4cGFuZGVkKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcz8uZm9yRWFjaCgob3RoZXJJdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG90aGVySXRlbSAhPT0gaXRlbSAmJlxuICAgICAgICAgICAgICBvdGhlckl0ZW0uaXNFeHBhbmRlZCAmJlxuICAgICAgICAgICAgICBvdGhlckl0ZW0uaXNDb2xsYXBzaWJsZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG90aGVySXRlbS5pc0V4cGFuZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy4jcmVwZWF0ZXJTZXJ2aWNlLmFjdGl2ZUl0ZW1JbmRleENoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLmFjdGl2ZUluZGV4KSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IGluZGV4O1xuICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXhDaGFuZ2UuZW1pdChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy4jcmVwZWF0ZXJTZXJ2aWNlLm9yZGVyQ2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jbmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy4jZW1pdFRhZ3MoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy4jdXBkYXRlRm9yRXhwYW5kTW9kZSgpO1xuXG4gICAgdGhpcy4jYWRhcHRlclNlcnZpY2Uuc2V0UmVwZWF0ZXJIb3N0KHRoaXMuI2VsZW1lbnRSZWYpO1xuXG4gICAgdGhpcy4jaW5pdGlhbGl6ZURyYWdBbmREcm9wKCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIC8vIElmIGFjdGl2ZUluZGV4IGhhcyBiZWVuIHNldCBvbiBpbml0LCBjYWxsIHNlcnZpY2UgdG8gYWN0aXZhdGUgdGhlIGFwcHJvcHJpYXRlIGl0ZW0uXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5hY3RpdmVJbmRleCB8fCB0aGlzLmFjdGl2ZUluZGV4ID09PSAwKSB7XG4gICAgICAgIHRoaXMuI3JlcGVhdGVyU2VydmljZS5hY3RpdmF0ZUl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlSW5kZXgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiN2YWxpZGF0ZVRhZ3MoKTtcbiAgICB9KTtcblxuICAgIC8vIEhBQ0s6IE5vdCB1cGRhdGluZyBmb3IgZXhwYW5kIG1vZGUgaW4gYSB0aW1lb3V0IGNhdXNlcyBhbiBlcnJvci5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy82MDA1XG4gICAgdGhpcy5pdGVtcz8uY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy4jdXBkYXRlRm9yRXhwYW5kTW9kZSh0aGlzLml0ZW1zLmxhc3QpO1xuXG4gICAgICAgICAgdGhpcy4jdXBkYXRlUmVvcmRlcmFiaWxpdHkoKTtcblxuICAgICAgICAgIHRoaXMuI3JlcGVhdGVyU2VydmljZS5pdGVtcyA9IHRoaXMuaXRlbXMudG9BcnJheSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuI3JlcGVhdGVyU2VydmljZS5hY3RpdmF0ZUl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4jdXBkYXRlUm9sZSgpO1xuXG4gICAgICAgIHRoaXMuI3ZhbGlkYXRlVGFncygpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuI3VwZGF0ZUZvckV4cGFuZE1vZGUoKTtcblxuICAgICAgdGhpcy5pdGVtcz8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpdGVtLnJlb3JkZXJhYmxlID0gdGhpcy5yZW9yZGVyYWJsZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLiN1cGRhdGVSb2xlKCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jaXRlbU5hbWVXYXJuZWQgJiYgdGhpcy5pdGVtcz8uc29tZSgoaXRlbSkgPT4gIWl0ZW0uaXRlbU5hbWUpKSB7XG4gICAgICB0aGlzLiNsb2dTdmM/LmRlcHJlY2F0ZWQoJ1NreVJlcGVhdGVySXRlbUNvbXBvbmVudCB3aXRob3V0IGBpdGVtTmFtZWAnLCB7XG4gICAgICAgIGRlcHJlY2F0aW9uTWFqb3JWZXJzaW9uOiA4LFxuICAgICAgICByZXBsYWNlbWVudFJlY29tbWVuZGF0aW9uOiAnQWx3YXlzIHNwZWNpZnkgYW4gYGl0ZW1OYW1lYCBwcm9wZXJ0eS4nLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuI2l0ZW1OYW1lV2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydhY3RpdmVJbmRleCddKSB7XG4gICAgICB0aGlzLiNyZXBlYXRlclNlcnZpY2UuZW5hYmxlQWN0aXZlU3RhdGUgPSB0cnVlO1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzWydhY3RpdmVJbmRleCddLmN1cnJlbnRWYWx1ZSAhPT1cbiAgICAgICAgY2hhbmdlc1snYWN0aXZlSW5kZXgnXS5wcmV2aW91c1ZhbHVlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy4jcmVwZWF0ZXJTZXJ2aWNlLmFjdGl2YXRlSXRlbUJ5SW5kZXgodGhpcy5hY3RpdmVJbmRleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXNbJ3Jlb3JkZXJhYmxlJ10pIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zKSB7XG4gICAgICAgIHRoaXMuI3VwZGF0ZVJlb3JkZXJhYmlsaXR5KCk7XG4gICAgICB9XG4gICAgICB0aGlzLiN1cGRhdGVSb2xlKCk7XG5cbiAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy4jZGVzdHJveURyYWdBbmREcm9wKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy4jdXBkYXRlUm9sZSgpO1xuICB9XG5cbiAgcHVibGljIG9uQ2RrT2JzZXJ2ZUNvbnRlbnQoKTogdm9pZCB7XG4gICAgdGhpcy4jdXBkYXRlUm9sZSgpO1xuICB9XG5cbiAgI3VwZGF0ZUZvckV4cGFuZE1vZGUoaXRlbUFkZGVkPzogU2t5UmVwZWF0ZXJJdGVtQ29tcG9uZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbXMpIHtcbiAgICAgIGxldCBmb3VuZEV4cGFuZGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBpc0NvbGxhcHNpYmxlID0gdGhpcy5leHBhbmRNb2RlICE9PSAnbm9uZSc7XG4gICAgICBjb25zdCBpc1NpbmdsZSA9IHRoaXMuZXhwYW5kTW9kZSA9PT0gJ3NpbmdsZSc7XG5cbiAgICAgIC8vIEtlZXAgYW55IG5ld2x5LWFkZGVkIGV4cGFuZGVkIGl0ZW0gZXhwYW5kZWQgYW5kIGNvbGxhcHNlIHRoZSByZXN0LlxuICAgICAgaWYgKGl0ZW1BZGRlZCAmJiBpdGVtQWRkZWQuaXNFeHBhbmRlZCkge1xuICAgICAgICBmb3VuZEV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgaXRlbS5pc0NvbGxhcHNpYmxlID0gaXNDb2xsYXBzaWJsZSAmJiAhIWl0ZW0uaGFzSXRlbUNvbnRlbnQ7XG5cbiAgICAgICAgLy8gQ29sbGFwc2UgYW55IGl0ZW1zIHRoYXQgYXJlbid0IHRoZSBpdGVtIHRoYXQgd2FzIGp1c3QgYWRkZWQuXG4gICAgICAgIGlmIChpdGVtICE9PSBpdGVtQWRkZWQgJiYgaXNTaW5nbGUgJiYgaXRlbS5pc0V4cGFuZGVkKSB7XG4gICAgICAgICAgaWYgKGZvdW5kRXhwYW5kZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXRlbSBpcyBiZWluZyBjb2xsYXBzZWQgYmVjYXVzZSBhIG5ldyBpdGVtIHdhc1xuICAgICAgICAgICAgLy8gYWRkZWQsIGFuaW1hdGUgaXQuXG4gICAgICAgICAgICBpdGVtLnVwZGF0ZUZvckV4cGFuZGVkKGZhbHNlLCAhIWl0ZW1BZGRlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm91bmRFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy4jdXBkYXRlUm9sZSgpO1xuICAgIH1cbiAgfVxuXG4gICNpbml0aWFsaXplRHJhZ0FuZERyb3AoKTogdm9pZCB7XG4gICAgLyogU2FuaXR5IGNoZWNrIHRoYXQgd2UgaGF2ZW4ndCBhbHJlYWR5IHNldCB1cCBkcmFnZ2luZyBhYmlsaXRpZXMgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghdGhpcy4jZHJhZ3VsYVNlcnZpY2UuZmluZCh0aGlzLmRyYWd1bGFHcm91cE5hbWUpKSB7XG4gICAgICB0aGlzLiNkcmFndWxhU2VydmljZS5jcmVhdGVHcm91cCh0aGlzLmRyYWd1bGFHcm91cE5hbWUsIHtcbiAgICAgICAgbW92ZXM6IChlbCwgX2NvbnRhaW5lciwgaGFuZGxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZWw/LnF1ZXJ5U2VsZWN0b3IoJy5za3ktcmVwZWF0ZXItaXRlbS1ncmFiLWhhbmRsZScpO1xuICAgICAgICAgIHJldHVybiAhIShcbiAgICAgICAgICAgIHRoaXMucmVvcmRlcmFibGUgJiYgdGFyZ2V0Py5jb250YWlucyhoYW5kbGUgYXMgRWxlbWVudCB8IG51bGwpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBkcmFnZ2VkSXRlbUluZGV4ID0gLTE7XG5cbiAgICB0aGlzLiNkcmFndWxhU2VydmljZVxuICAgICAgLmRyYWcodGhpcy5kcmFndWxhR3JvdXBOYW1lKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoYXJncy5uYW1lID09PSB0aGlzLmRyYWd1bGFHcm91cE5hbWUpIHtcbiAgICAgICAgICB0aGlzLiNkZXN0cm95QXV0b1Njcm9sbCgpO1xuXG4gICAgICAgICAgdGhpcy4jYXV0b1Njcm9sbGVyID0gdGhpcy4jYXV0b1Njcm9sbFN2Yy5hdXRvU2Nyb2xsKFxuICAgICAgICAgICAgW3RoaXMuI3Njcm9sbGFibGVIb3N0U3ZjLmdldFNjcm9sbGFibGVIb3N0KHRoaXMuI2VsZW1lbnRSZWYpXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbWFyZ2luOiAyMCxcbiAgICAgICAgICAgICAgbWF4U3BlZWQ6IDEwLFxuICAgICAgICAgICAgICBzY3JvbGxXaGVuT3V0c2lkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgYXV0b1Njcm9sbDogKCkgPT4gdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMuI3JlbmRlcmVyLmFkZENsYXNzKGFyZ3MuZWwsICdza3ktcmVwZWF0ZXItaXRlbS1kcmFnZ2luZycpO1xuICAgICAgICAgIGRyYWdnZWRJdGVtSW5kZXggPSB0aGlzLiNhZGFwdGVyU2VydmljZS5nZXRSZXBlYXRlckl0ZW1JbmRleChcbiAgICAgICAgICAgIGFyZ3MuZWwgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLiNkcmFndWxhU2VydmljZVxuICAgICAgLmRyYWdlbmQodGhpcy5kcmFndWxhR3JvdXBOYW1lKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoYXJncykgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoYXJncy5uYW1lID09PSB0aGlzLmRyYWd1bGFHcm91cE5hbWUpIHtcbiAgICAgICAgICB0aGlzLiNkZXN0cm95QXV0b1Njcm9sbCgpO1xuXG4gICAgICAgICAgdGhpcy4jcmVuZGVyZXIucmVtb3ZlQ2xhc3MoYXJncy5lbCwgJ3NreS1yZXBlYXRlci1pdGVtLWRyYWdnaW5nJyk7XG4gICAgICAgICAgY29uc3QgbmV3SXRlbUluZGV4ID0gdGhpcy4jYWRhcHRlclNlcnZpY2UuZ2V0UmVwZWF0ZXJJdGVtSW5kZXgoXG4gICAgICAgICAgICBhcmdzLmVsIGFzIEhUTUxFbGVtZW50LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmIChkcmFnZ2VkSXRlbUluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuI3JlcGVhdGVyU2VydmljZS5yZW9yZGVySXRlbShkcmFnZ2VkSXRlbUluZGV4LCBuZXdJdGVtSW5kZXgpO1xuICAgICAgICAgICAgZHJhZ2dlZEl0ZW1JbmRleCA9IC0xO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuI2VtaXRUYWdzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgI2Rlc3Ryb3lEcmFnQW5kRHJvcCgpOiB2b2lkIHtcbiAgICAvKiBTYW5pdHkgY2hlY2sgdGhhdCB3ZSBoYXZlIHNldCB1cCBkcmFnZ2luZyBhYmlsaXRpZXMgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLiNkcmFndWxhU2VydmljZS5maW5kKHRoaXMuZHJhZ3VsYUdyb3VwTmFtZSkpIHtcbiAgICAgIHRoaXMuI2RyYWd1bGFTZXJ2aWNlLmRlc3Ryb3kodGhpcy5kcmFndWxhR3JvdXBOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLiNkZXN0cm95QXV0b1Njcm9sbCgpO1xuICB9XG5cbiAgI2Rlc3Ryb3lBdXRvU2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNhdXRvU2Nyb2xsZXIpIHtcbiAgICAgIHRoaXMuI2F1dG9TY3JvbGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLiNhdXRvU2Nyb2xsZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgI2VtaXRUYWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhZ3MgPSB0aGlzLiNyZXBlYXRlclNlcnZpY2UuaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnRhZyk7XG4gICAgdGhpcy5vcmRlckNoYW5nZS5lbWl0KHRhZ3MpO1xuICB9XG5cbiAgI2V2ZXJ5SXRlbUhhc1RhZygpOiBib29sZWFuIHtcbiAgICAvKiBzYWZldHkgY2hlY2sgKi9cbiAgICBpZiAoIXRoaXMuaXRlbXMgfHwgdGhpcy5pdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pdGVtcy50b0FycmF5KCkuZXZlcnkoKGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiBpdGVtLnRhZyAhPT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgI3VwZGF0ZVJvbGUoKTogdm9pZCB7XG4gICAgLy8gRGV0ZXJtaW5lIGEgcm9sZSB1c2luZyBhIGhpZXJhcmNoeSBiYXNlZCBvbiBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS9cbiAgICAvLyAgIDEuIElmIHRoZXJlIGFyZSBvbmUgb3IgbW9yZSBpbnRlcmFjdGlvbnMgaW4gdGhlIHJlcGVhdGVyIGl0ZW0gcHJvamVjdGVkIGNvbnRlbnQsIHVzZSBncmlkLlxuICAgIC8vICAgMi4gSWYgdGhlcmUgYXJlIHNlbGVjdGFibGUgcmVwZWF0ZXIgaXRlbXMgYW5kIG5vIG90aGVyIGludGVyYWN0aW9ucywgdXNlIGxpc3Rib3guXG4gICAgLy8gICAzLiBJZiB0aGVyZSBhcmUgbm8gaW50ZXJhY3Rpb25zLCB1c2UgbGlzdC5cblxuICAgIC8vIERlZmF1bHQgdG8gbGlzdCByb2xlLlxuICAgIGxldCBhdXRvUm9sZTogU2t5UmVwZWF0ZXJSb2xlVHlwZSA9ICdsaXN0JztcblxuICAgIGNvbnN0IHJvbGVNYXA6IFJlY29yZDxTa3lSZXBlYXRlclJvbGVUeXBlLCBTa3lSZXBlYXRlckl0ZW1Sb2xlc1R5cGU+ID0ge1xuICAgICAgbGlzdDogeyBpdGVtOiAnbGlzdGl0ZW0nLCB0aXRsZTogdW5kZWZpbmVkLCBjb250ZW50OiB1bmRlZmluZWQgfSxcbiAgICAgIGxpc3Rib3g6IHsgaXRlbTogJ29wdGlvbicsIHRpdGxlOiB1bmRlZmluZWQsIGNvbnRlbnQ6IHVuZGVmaW5lZCB9LFxuICAgICAgZ3JpZDogeyBpdGVtOiAncm93JywgdGl0bGU6ICdyb3doZWFkZXInLCBjb250ZW50OiAnZ3JpZGNlbGwnIH0sXG4gICAgfTtcblxuICAgIC8vIEJhc2VkIG9uIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RvbS5odG1sI2ludGVyYWN0aXZlLWNvbnRlbnRcbiAgICBjb25zdCBpbnRlcmFjdGlvblNlbGVjdG9yID0gW1xuICAgICAgJ2FbaHJlZl0nLFxuICAgICAgJ2F1ZGlvW2NvbnRyb2xzXScsXG4gICAgICAnYnV0dG9uJyxcbiAgICAgICdkZXRhaWxzJyxcbiAgICAgICdlbWJlZCcsXG4gICAgICAnaWZyYW1lJyxcbiAgICAgICdpbWdbdXNlbWFwXScsXG4gICAgICAnaW5wdXQ6bm90KFt0eXBlPVwiaGlkZGVuXCJdKScsXG4gICAgICAnbGFiZWwnLFxuICAgICAgJ3NlbGVjdCcsXG4gICAgICAndGV4dGFyZWEnLFxuICAgICAgJ3ZpZGVvW2NvbnRyb2xzXScsXG4gICAgICAnW2NvbnRlbnRlZGl0YWJsZV0nLFxuICAgICAgJy5za3ktcmVwZWF0ZXJbcm9sZT1cImdyaWRcIl0nLFxuICAgIF1cbiAgICAgIC5tYXAoXG4gICAgICAgIChzZWxlY3RvcikgPT5cbiAgICAgICAgICBgc2t5LXJlcGVhdGVyLWl0ZW0tdGl0bGUgJHtzZWxlY3Rvcn06bm90KFtoaWRkZW5dKSwgc2t5LXJlcGVhdGVyLWl0ZW0tY29udGVudCAke3NlbGVjdG9yfTpub3QoW2hpZGRlbl0pYCxcbiAgICAgIClcbiAgICAgIC5jb25jYXQoW2Bza3l1eC1kcm9wZG93bmBdKVxuICAgICAgLmpvaW4oJywgJyk7XG5cbiAgICBjb25zdCBoYXNJbnRlcmFjdGlvbiA9XG4gICAgICB0aGlzLnJlb3JkZXJhYmxlIHx8XG4gICAgICB0aGlzLml0ZW1zPy5zb21lKChpdGVtKSA9PiBpdGVtLmlzQ29sbGFwc2libGUpIHx8XG4gICAgICB0aGlzLml0ZW1zPy5zb21lKChpdGVtKSA9PiAhIWl0ZW0uc2VsZWN0YWJsZSkgfHxcbiAgICAgICEhKHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgaW50ZXJhY3Rpb25TZWxlY3RvcixcbiAgICAgICk7XG5cbiAgICBpZiAoaGFzSW50ZXJhY3Rpb24pIHtcbiAgICAgIC8vIElmIHRoZSByZXBlYXRlciBtYXRjaGVzIGludGVyYWN0aW9uIHNlbGVjdG9yIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1wcmFjdGljZXMtMS4xLyNncmlkXG4gICAgICBhdXRvUm9sZSA9ICdncmlkJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb2xlICE9PSBhdXRvUm9sZSkge1xuICAgICAgdGhpcy4jcmVwZWF0ZXJTZXJ2aWNlLml0ZW1Sb2xlLm5leHQoe1xuICAgICAgICAuLi5yb2xlTWFwW2F1dG9Sb2xlXSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yb2xlID0gYCR7YXV0b1JvbGV9YDtcbiAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gICN1cGRhdGVSZW9yZGVyYWJpbGl0eSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVtcykge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgaXRlbS5yZW9yZGVyYWJsZSA9IHRoaXMucmVvcmRlcmFibGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3ZhbGlkYXRlVGFncygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZW9yZGVyYWJsZSAmJiAhdGhpcy4jZXZlcnlJdGVtSGFzVGFnKCkpIHtcbiAgICAgIHRoaXMuI2xvZ1N2Yy53YXJuKFxuICAgICAgICAnUGxlYXNlIHN1cHBseSB0YWcgcHJvcGVydGllcyBmb3IgZWFjaCByZXBlYXRlciBpdGVtIHdoZW4gcmVvcmRlcmluZyBmdW5jdGlvbmFsaXR5IGlzIGVuYWJsZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICNyZXBlYXRlckhvc3Q+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNreS1yZXBlYXRlclwiXG4gICAgW2F0dHIucm9sZV09XCJyb2xlXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCB8fCAoJ3NreXV4X3JlcGVhdGVyX2xhYmVsJyB8IHNreUxpYlJlc291cmNlcylcIlxuICAgIFtkcmFndWxhXT1cImRyYWd1bGFHcm91cE5hbWVcIlxuICAgIChjZGtPYnNlcnZlQ29udGVudCk9XCJvbkNka09ic2VydmVDb250ZW50KClcIlxuICA+XG4gICAgPG5nLWNvbnRlbnQgLz5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -1,77 +0,0 @@
1
- import { ObserversModule } from '@angular/cdk/observers';
2
- import { CommonModule } from '@angular/common';
3
- import { NgModule } from '@angular/core';
4
- import { SkyIdModule } from '@skyux/core';
5
- import { SkyCheckboxModule } from '@skyux/forms';
6
- import { SkyIconModule } from '@skyux/icon';
7
- import { SkyChevronModule } from '@skyux/indicators';
8
- import { SkyInlineFormModule } from '@skyux/inline-form';
9
- import { DragulaModule, DragulaService } from 'ng2-dragula';
10
- import { SkyListsResourcesModule } from '../shared/sky-lists-resources.module';
11
- import { SkyRepeaterItemContentComponent } from './repeater-item-content.component';
12
- import { SkyRepeaterItemContextMenuComponent } from './repeater-item-context-menu.component';
13
- import { SkyRepeaterItemTitleComponent } from './repeater-item-title.component';
14
- import { SkyRepeaterItemComponent } from './repeater-item.component';
15
- import { SkyRepeaterComponent } from './repeater.component';
16
- import * as i0 from "@angular/core";
17
- export class SkyRepeaterModule {
18
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyRepeaterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
19
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: SkyRepeaterModule, declarations: [SkyRepeaterComponent,
20
- SkyRepeaterItemComponent,
21
- SkyRepeaterItemContentComponent,
22
- SkyRepeaterItemContextMenuComponent,
23
- SkyRepeaterItemTitleComponent], imports: [CommonModule,
24
- DragulaModule,
25
- ObserversModule,
26
- SkyChevronModule,
27
- SkyCheckboxModule,
28
- SkyIconModule,
29
- SkyIdModule,
30
- SkyInlineFormModule,
31
- SkyListsResourcesModule], exports: [SkyRepeaterComponent,
32
- SkyRepeaterItemComponent,
33
- SkyRepeaterItemContentComponent,
34
- SkyRepeaterItemContextMenuComponent,
35
- SkyRepeaterItemTitleComponent] }); }
36
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyRepeaterModule, providers: [DragulaService], imports: [CommonModule,
37
- DragulaModule,
38
- ObserversModule,
39
- SkyChevronModule,
40
- SkyCheckboxModule,
41
- SkyIconModule,
42
- SkyIdModule,
43
- SkyInlineFormModule,
44
- SkyListsResourcesModule] }); }
45
- }
46
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyRepeaterModule, decorators: [{
47
- type: NgModule,
48
- args: [{
49
- declarations: [
50
- SkyRepeaterComponent,
51
- SkyRepeaterItemComponent,
52
- SkyRepeaterItemContentComponent,
53
- SkyRepeaterItemContextMenuComponent,
54
- SkyRepeaterItemTitleComponent,
55
- ],
56
- imports: [
57
- CommonModule,
58
- DragulaModule,
59
- ObserversModule,
60
- SkyChevronModule,
61
- SkyCheckboxModule,
62
- SkyIconModule,
63
- SkyIdModule,
64
- SkyInlineFormModule,
65
- SkyListsResourcesModule,
66
- ],
67
- exports: [
68
- SkyRepeaterComponent,
69
- SkyRepeaterItemComponent,
70
- SkyRepeaterItemContentComponent,
71
- SkyRepeaterItemContextMenuComponent,
72
- SkyRepeaterItemTitleComponent,
73
- ],
74
- providers: [DragulaService],
75
- }]
76
- }] });
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xpc3RzL3NyYy9saWIvbW9kdWxlcy9yZXBlYXRlci9yZXBlYXRlci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFL0UsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEYsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0YsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBOEI1RCxNQUFNLE9BQU8saUJBQWlCOytHQUFqQixpQkFBaUI7Z0hBQWpCLGlCQUFpQixpQkExQjFCLG9CQUFvQjtZQUNwQix3QkFBd0I7WUFDeEIsK0JBQStCO1lBQy9CLG1DQUFtQztZQUNuQyw2QkFBNkIsYUFHN0IsWUFBWTtZQUNaLGFBQWE7WUFDYixlQUFlO1lBQ2YsZ0JBQWdCO1lBQ2hCLGlCQUFpQjtZQUNqQixhQUFhO1lBQ2IsV0FBVztZQUNYLG1CQUFtQjtZQUNuQix1QkFBdUIsYUFHdkIsb0JBQW9CO1lBQ3BCLHdCQUF3QjtZQUN4QiwrQkFBK0I7WUFDL0IsbUNBQW1DO1lBQ25DLDZCQUE2QjtnSEFJcEIsaUJBQWlCLGFBRmpCLENBQUMsY0FBYyxDQUFDLFlBakJ6QixZQUFZO1lBQ1osYUFBYTtZQUNiLGVBQWU7WUFDZixnQkFBZ0I7WUFDaEIsaUJBQWlCO1lBQ2pCLGFBQWE7WUFDYixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLHVCQUF1Qjs7NEZBV2QsaUJBQWlCO2tCQTVCN0IsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osb0JBQW9CO3dCQUNwQix3QkFBd0I7d0JBQ3hCLCtCQUErQjt3QkFDL0IsbUNBQW1DO3dCQUNuQyw2QkFBNkI7cUJBQzlCO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsYUFBYTt3QkFDYixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsdUJBQXVCO3FCQUN4QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1Asb0JBQW9CO3dCQUNwQix3QkFBd0I7d0JBQ3hCLCtCQUErQjt3QkFDL0IsbUNBQW1DO3dCQUNuQyw2QkFBNkI7cUJBQzlCO29CQUNELFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztpQkFDNUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZlcnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb2JzZXJ2ZXJzJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2t5SWRNb2R1bGUgfSBmcm9tICdAc2t5dXgvY29yZSc7XG5pbXBvcnQgeyBTa3lDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bza3l1eC9mb3Jtcyc7XG5pbXBvcnQgeyBTa3lJY29uTW9kdWxlIH0gZnJvbSAnQHNreXV4L2ljb24nO1xuaW1wb3J0IHsgU2t5Q2hldnJvbk1vZHVsZSB9IGZyb20gJ0Bza3l1eC9pbmRpY2F0b3JzJztcbmltcG9ydCB7IFNreUlubGluZUZvcm1Nb2R1bGUgfSBmcm9tICdAc2t5dXgvaW5saW5lLWZvcm0nO1xuXG5pbXBvcnQgeyBEcmFndWxhTW9kdWxlLCBEcmFndWxhU2VydmljZSB9IGZyb20gJ25nMi1kcmFndWxhJztcblxuaW1wb3J0IHsgU2t5TGlzdHNSZXNvdXJjZXNNb2R1bGUgfSBmcm9tICcuLi9zaGFyZWQvc2t5LWxpc3RzLXJlc291cmNlcy5tb2R1bGUnO1xuXG5pbXBvcnQgeyBTa3lSZXBlYXRlckl0ZW1Db250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi9yZXBlYXRlci1pdGVtLWNvbnRlbnQuY29tcG9uZW50JztcbmltcG9ydCB7IFNreVJlcGVhdGVySXRlbUNvbnRleHRNZW51Q29tcG9uZW50IH0gZnJvbSAnLi9yZXBlYXRlci1pdGVtLWNvbnRleHQtbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5UmVwZWF0ZXJJdGVtVGl0bGVDb21wb25lbnQgfSBmcm9tICcuL3JlcGVhdGVyLWl0ZW0tdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IFNreVJlcGVhdGVySXRlbUNvbXBvbmVudCB9IGZyb20gJy4vcmVwZWF0ZXItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2t5UmVwZWF0ZXJDb21wb25lbnQgfSBmcm9tICcuL3JlcGVhdGVyLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFNreVJlcGVhdGVyQ29tcG9uZW50LFxuICAgIFNreVJlcGVhdGVySXRlbUNvbXBvbmVudCxcbiAgICBTa3lSZXBlYXRlckl0ZW1Db250ZW50Q29tcG9uZW50LFxuICAgIFNreVJlcGVhdGVySXRlbUNvbnRleHRNZW51Q29tcG9uZW50LFxuICAgIFNreVJlcGVhdGVySXRlbVRpdGxlQ29tcG9uZW50LFxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIERyYWd1bGFNb2R1bGUsXG4gICAgT2JzZXJ2ZXJzTW9kdWxlLFxuICAgIFNreUNoZXZyb25Nb2R1bGUsXG4gICAgU2t5Q2hlY2tib3hNb2R1bGUsXG4gICAgU2t5SWNvbk1vZHVsZSxcbiAgICBTa3lJZE1vZHVsZSxcbiAgICBTa3lJbmxpbmVGb3JtTW9kdWxlLFxuICAgIFNreUxpc3RzUmVzb3VyY2VzTW9kdWxlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgU2t5UmVwZWF0ZXJDb21wb25lbnQsXG4gICAgU2t5UmVwZWF0ZXJJdGVtQ29tcG9uZW50LFxuICAgIFNreVJlcGVhdGVySXRlbUNvbnRlbnRDb21wb25lbnQsXG4gICAgU2t5UmVwZWF0ZXJJdGVtQ29udGV4dE1lbnVDb21wb25lbnQsXG4gICAgU2t5UmVwZWF0ZXJJdGVtVGl0bGVDb21wb25lbnQsXG4gIF0sXG4gIHByb3ZpZGVyczogW0RyYWd1bGFTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgU2t5UmVwZWF0ZXJNb2R1bGUge31cbiJdfQ==
@@ -1,86 +0,0 @@
1
- import { EventEmitter, Injectable } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- let uniqueId = 0;
5
- const DEFAULT_EXPAND_MODE = 'none';
6
- /**
7
- * @internal
8
- */
9
- export class SkyRepeaterService {
10
- constructor() {
11
- this.activeItemChange = new BehaviorSubject(undefined);
12
- this.activeItemIndexChange = new BehaviorSubject(undefined);
13
- this.enableActiveState = false;
14
- this.itemCollapseStateChange = new EventEmitter();
15
- this.items = [];
16
- this.itemRole = new BehaviorSubject({
17
- content: undefined,
18
- item: undefined,
19
- title: undefined,
20
- });
21
- this.orderChange = new BehaviorSubject(undefined);
22
- this.repeaterGroupId = ++uniqueId;
23
- this.#_expandMode = DEFAULT_EXPAND_MODE;
24
- }
25
- // TODO: Remove 'string' as a valid type in a breaking change.
26
- get expandMode() {
27
- return this.#_expandMode;
28
- }
29
- set expandMode(value) {
30
- this.#_expandMode = value ?? DEFAULT_EXPAND_MODE;
31
- }
32
- #_expandMode;
33
- ngOnDestroy() {
34
- this.activeItemChange.complete();
35
- this.itemCollapseStateChange.complete();
36
- this.orderChange.complete();
37
- }
38
- activateItem(item) {
39
- if (this.enableActiveState) {
40
- /* istanbul ignore else */
41
- if (item && !item.disabled) {
42
- const index = this.items.findIndex((i) => i === item);
43
- this.activeItemIndexChange.next(index);
44
- this.activeItemChange.next(item);
45
- }
46
- }
47
- }
48
- activateItemByIndex(index) {
49
- /* istanbul ignore else */
50
- if (this.enableActiveState) {
51
- if (index === undefined) {
52
- this.activeItemChange.next(undefined);
53
- }
54
- else {
55
- const activeItem = this.items[index];
56
- if (activeItem && !activeItem.disabled) {
57
- this.activeItemChange.next(activeItem);
58
- }
59
- }
60
- }
61
- }
62
- registerItem(item) {
63
- this.items.push(item);
64
- }
65
- unregisterItem(item) {
66
- const indexOfDestroyedItem = this.items.indexOf(item);
67
- if (indexOfDestroyedItem > -1) {
68
- this.items.splice(indexOfDestroyedItem, 1);
69
- }
70
- }
71
- onItemCollapseStateChange(item) {
72
- this.itemCollapseStateChange.emit(item);
73
- }
74
- registerOrderChange() {
75
- this.orderChange.next();
76
- }
77
- reorderItem(oldIndex, newIndex) {
78
- this.items.splice(newIndex, 0, this.items.splice(oldIndex, 1)[0]);
79
- }
80
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyRepeaterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
81
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyRepeaterService }); }
82
- }
83
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SkyRepeaterService, decorators: [{
84
- type: Injectable
85
- }] });
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9saXN0cy9zcmMvbGliL21vZHVsZXMvcmVwZWF0ZXIvcmVwZWF0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQU12QyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDakIsTUFBTSxtQkFBbUIsR0FBOEIsTUFBTSxDQUFDO0FBRTlEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUQvQjtRQUVTLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUUzQyxTQUFTLENBQUMsQ0FBQztRQUVOLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUNoRCxTQUFTLENBQ1YsQ0FBQztRQUVLLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQVUxQiw0QkFBdUIsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUV2RSxVQUFLLEdBQStCLEVBQUUsQ0FBQztRQUU5QixhQUFRLEdBQUcsSUFBSSxlQUFlLENBQTJCO1lBQ3ZFLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLElBQUksRUFBRSxTQUFTO1lBQ2YsS0FBSyxFQUFFLFNBQVM7U0FDakIsQ0FBQyxDQUFDO1FBRUksZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBTyxTQUFTLENBQUMsQ0FBQztRQUVuRCxvQkFBZSxHQUFHLEVBQUUsUUFBUSxDQUFDO1FBRXBDLGlCQUFZLEdBQUcsbUJBQW1CLENBQUM7S0F1RHBDO0lBN0VDLDhEQUE4RDtJQUM5RCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFXLFVBQVUsQ0FBQyxLQUE0QztRQUNoRSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssSUFBSSxtQkFBbUIsQ0FBQztJQUNuRCxDQUFDO0lBZ0JELFlBQVksQ0FBdUI7SUFFNUIsV0FBVztRQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUE4QjtRQUNoRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNCLDBCQUEwQjtZQUMxQixJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxLQUF5QjtRQUNsRCwwQkFBMEI7UUFDMUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckMsSUFBSSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3pDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxZQUFZLENBQUMsSUFBOEI7UUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxJQUE4QjtRQUNsRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVNLHlCQUF5QixDQUFDLElBQThCO1FBQzdELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxXQUFXLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7K0dBdkZVLGtCQUFrQjttSEFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNreVJlcGVhdGVyRXhwYW5kTW9kZVR5cGUgfSBmcm9tICcuL3JlcGVhdGVyLWV4cGFuZC1tb2RlLXR5cGUnO1xuaW1wb3J0IHsgU2t5UmVwZWF0ZXJJdGVtUm9sZXNUeXBlIH0gZnJvbSAnLi9yZXBlYXRlci1pdGVtLXJvbGVzLnR5cGUnO1xuaW1wb3J0IHsgU2t5UmVwZWF0ZXJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9yZXBlYXRlci1pdGVtLmNvbXBvbmVudCc7XG5cbmxldCB1bmlxdWVJZCA9IDA7XG5jb25zdCBERUZBVUxUX0VYUEFORF9NT0RFOiBTa3lSZXBlYXRlckV4cGFuZE1vZGVUeXBlID0gJ25vbmUnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2t5UmVwZWF0ZXJTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHVibGljIGFjdGl2ZUl0ZW1DaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFNreVJlcGVhdGVySXRlbUNvbXBvbmVudCB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG5cbiAgcHVibGljIGFjdGl2ZUl0ZW1JbmRleENoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWQsXG4gICk7XG5cbiAgcHVibGljIGVuYWJsZUFjdGl2ZVN0YXRlID0gZmFsc2U7XG5cbiAgLy8gVE9ETzogUmVtb3ZlICdzdHJpbmcnIGFzIGEgdmFsaWQgdHlwZSBpbiBhIGJyZWFraW5nIGNoYW5nZS5cbiAgcHVibGljIGdldCBleHBhbmRNb2RlKCk6IFNreVJlcGVhdGVyRXhwYW5kTW9kZVR5cGUge1xuICAgIHJldHVybiB0aGlzLiNfZXhwYW5kTW9kZTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cGFuZE1vZGUodmFsdWU6IFNreVJlcGVhdGVyRXhwYW5kTW9kZVR5cGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZXhwYW5kTW9kZSA9IHZhbHVlID8/IERFRkFVTFRfRVhQQU5EX01PREU7XG4gIH1cblxuICBwdWJsaWMgaXRlbUNvbGxhcHNlU3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreVJlcGVhdGVySXRlbUNvbXBvbmVudD4oKTtcblxuICBwdWJsaWMgaXRlbXM6IFNreVJlcGVhdGVySXRlbUNvbXBvbmVudFtdID0gW107XG5cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1Sb2xlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTa3lSZXBlYXRlckl0ZW1Sb2xlc1R5cGU+KHtcbiAgICBjb250ZW50OiB1bmRlZmluZWQsXG4gICAgaXRlbTogdW5kZWZpbmVkLFxuICAgIHRpdGxlOiB1bmRlZmluZWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBvcmRlckNoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8dm9pZD4odW5kZWZpbmVkKTtcblxuICBwdWJsaWMgcmVwZWF0ZXJHcm91cElkID0gKyt1bmlxdWVJZDtcblxuICAjX2V4cGFuZE1vZGUgPSBERUZBVUxUX0VYUEFORF9NT0RFO1xuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZUl0ZW1DaGFuZ2UuY29tcGxldGUoKTtcbiAgICB0aGlzLml0ZW1Db2xsYXBzZVN0YXRlQ2hhbmdlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5vcmRlckNoYW5nZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlSXRlbShpdGVtOiBTa3lSZXBlYXRlckl0ZW1Db21wb25lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbmFibGVBY3RpdmVTdGF0ZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChpdGVtICYmICFpdGVtLmRpc2FibGVkKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoKGkpID0+IGkgPT09IGl0ZW0pO1xuICAgICAgICB0aGlzLmFjdGl2ZUl0ZW1JbmRleENoYW5nZS5uZXh0KGluZGV4KTtcbiAgICAgICAgdGhpcy5hY3RpdmVJdGVtQ2hhbmdlLm5leHQoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlSXRlbUJ5SW5kZXgoaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuZW5hYmxlQWN0aXZlU3RhdGUpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSXRlbUNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhY3RpdmVJdGVtID0gdGhpcy5pdGVtc1tpbmRleF07XG4gICAgICAgIGlmIChhY3RpdmVJdGVtICYmICFhY3RpdmVJdGVtLmRpc2FibGVkKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVJdGVtQ2hhbmdlLm5leHQoYWN0aXZlSXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJJdGVtKGl0ZW06IFNreVJlcGVhdGVySXRlbUNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyB1bnJlZ2lzdGVySXRlbShpdGVtOiBTa3lSZXBlYXRlckl0ZW1Db21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleE9mRGVzdHJveWVkSXRlbSA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXhPZkRlc3Ryb3llZEl0ZW0gPiAtMSkge1xuICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaW5kZXhPZkRlc3Ryb3llZEl0ZW0sIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkl0ZW1Db2xsYXBzZVN0YXRlQ2hhbmdlKGl0ZW06IFNreVJlcGVhdGVySXRlbUNvbXBvbmVudCk6IHZvaWQge1xuICAgIHRoaXMuaXRlbUNvbGxhcHNlU3RhdGVDaGFuZ2UuZW1pdChpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9yZGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMub3JkZXJDaGFuZ2UubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHJlb3JkZXJJdGVtKG9sZEluZGV4OiBudW1iZXIsIG5ld0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zLnNwbGljZShuZXdJbmRleCwgMCwgdGhpcy5pdGVtcy5zcGxpY2Uob2xkSW5kZXgsIDEpWzBdKTtcbiAgfVxufVxuIl19