ng-virtual-list 14.0.12 → 14.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/esm2020/lib/ng-virtual-list.component.mjs +46 -34
- package/fesm2015/ng-virtual-list.mjs +45 -33
- package/fesm2015/ng-virtual-list.mjs.map +1 -1
- package/fesm2020/ng-virtual-list.mjs +45 -33
- package/fesm2020/ng-virtual-list.mjs.map +1 -1
- package/lib/ng-virtual-list.component.d.ts +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -412,7 +412,7 @@ Inputs
|
|
|
412
412
|
| Property | Type | Description |
|
|
413
413
|
|---|---|---|
|
|
414
414
|
| id | number | Readonly. Returns the unique identifier of the component. |
|
|
415
|
-
| items | [IVirtualListCollection](https://github.com/DjonnyX/ng-virtual-list/blob/14.x/projects/ng-virtual-list/src/lib/models/collection.model.ts) | Collection of list items. |
|
|
415
|
+
| items | [IVirtualListCollection](https://github.com/DjonnyX/ng-virtual-list/blob/14.x/projects/ng-virtual-list/src/lib/models/collection.model.ts) | Collection of list items. The collection of elements must be immutable. |
|
|
416
416
|
| itemSize | number? = 24 | If direction = 'vertical', then the height of a typical element. If direction = 'horizontal', then the width of a typical element. Ignored if the dynamicSize property is true. |
|
|
417
417
|
| itemsOffset | number? = 2 | Number of elements outside the scope of visibility. Default value is 2. |
|
|
418
418
|
| itemRenderer | TemplateRef | Rendering element template. |
|
|
@@ -422,6 +422,7 @@ Inputs
|
|
|
422
422
|
| direction | [Direction? = 'vertical'](https://github.com/DjonnyX/ng-virtual-list/blob/14.x/projects/ng-virtual-list/src/lib/enums/direction.ts) | Determines the direction in which elements are placed. Default value is "vertical". |
|
|
423
423
|
| dynamicSize | boolean? = false | If true then the items in the list can have different sizes and the itemSize property is ignored. If false then the items in the list have a fixed size specified by the itemSize property. The default value is false. |
|
|
424
424
|
| enabledBufferOptimization | boolean? = true | Enables buffer optimization. Can only be used if items in the collection are not added or updated. |
|
|
425
|
+
| trackBy | string? = 'id' | The name of the property by which tracking is performed. |
|
|
425
426
|
|
|
426
427
|
<br/>
|
|
427
428
|
|
|
@@ -74,13 +74,14 @@ export class NgVirtualListComponent extends DisposableComponent {
|
|
|
74
74
|
this._onResizeHandler = () => {
|
|
75
75
|
this._$bounds.next(this._container?.nativeElement?.getBoundingClientRect() ?? null);
|
|
76
76
|
};
|
|
77
|
+
this._scrolls = new Map();
|
|
77
78
|
this._onScrollHandler = (e) => {
|
|
78
79
|
this._isScrollingDebounces.dispose();
|
|
79
80
|
this.clearScrollToRepeatExecutionTimeout();
|
|
80
81
|
const container = this._container?.nativeElement;
|
|
81
82
|
if (container) {
|
|
82
83
|
const dynamicSize = this.dynamicSize, delta = this._trackBox.delta, scrollSize = (this._isVertical ? container.scrollTop : container.scrollLeft);
|
|
83
|
-
let actualScrollSize = scrollSize,
|
|
84
|
+
let actualScrollSize = scrollSize, isScrollIUmmediate = false;
|
|
84
85
|
if (dynamicSize && delta !== 0) {
|
|
85
86
|
actualScrollSize = scrollSize + delta;
|
|
86
87
|
const params = {
|
|
@@ -89,22 +90,21 @@ export class NgVirtualListComponent extends DisposableComponent {
|
|
|
89
90
|
};
|
|
90
91
|
const container = this._container;
|
|
91
92
|
if (container) {
|
|
92
|
-
|
|
93
|
+
isScrollIUmmediate = true;
|
|
93
94
|
this.scrollImmediately(container, params);
|
|
94
|
-
this._trackBox.clearDelta();
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
-
|
|
97
|
+
if (!isScrollIUmmediate) {
|
|
98
|
+
this._$scrollSize.next(actualScrollSize);
|
|
99
|
+
}
|
|
98
100
|
}
|
|
99
101
|
};
|
|
100
|
-
this._scrollImmediatelyHandler = undefined;
|
|
101
102
|
this._onScrollEndHandler = (e) => {
|
|
102
103
|
const container = this._container;
|
|
103
104
|
if (container) {
|
|
104
|
-
this._trackBox.clearDelta();
|
|
105
|
-
this._trackBox.clearDeltaDirection();
|
|
106
105
|
const itemSize = this.itemSize, snapToItem = this.snapToItem, dynamicSize = this.dynamicSize, delta = this._trackBox.delta, scrollSize = (this._isVertical ? container.nativeElement.scrollTop : container.nativeElement.scrollLeft);
|
|
107
106
|
let actualScrollSize = scrollSize;
|
|
107
|
+
this._trackBox.clearDeltaDirection();
|
|
108
108
|
if (dynamicSize) {
|
|
109
109
|
actualScrollSize = scrollSize + delta;
|
|
110
110
|
if (snapToItem) {
|
|
@@ -112,15 +112,17 @@ export class NgVirtualListComponent extends DisposableComponent {
|
|
|
112
112
|
if (targetItem) {
|
|
113
113
|
this.scrollTo(targetItem.id, BEHAVIOR_INSTANT);
|
|
114
114
|
}
|
|
115
|
+
this._trackBox.clearDelta();
|
|
115
116
|
}
|
|
116
117
|
else if (scrollSize !== actualScrollSize) {
|
|
117
118
|
const params = {
|
|
118
119
|
[this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualScrollSize,
|
|
119
120
|
behavior: BEHAVIOR_INSTANT
|
|
120
121
|
};
|
|
121
|
-
this.
|
|
122
|
-
container
|
|
123
|
-
|
|
122
|
+
const container = this._container;
|
|
123
|
+
if (container) {
|
|
124
|
+
this.scrollImmediately(container, params);
|
|
125
|
+
}
|
|
124
126
|
}
|
|
125
127
|
}
|
|
126
128
|
else {
|
|
@@ -131,10 +133,12 @@ export class NgVirtualListComponent extends DisposableComponent {
|
|
|
131
133
|
[this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualScrollSize,
|
|
132
134
|
behavior: BEHAVIOR_INSTANT
|
|
133
135
|
};
|
|
134
|
-
container.
|
|
136
|
+
const container = this._container;
|
|
137
|
+
if (container) {
|
|
138
|
+
this.scrollImmediately(container, params);
|
|
139
|
+
}
|
|
135
140
|
}
|
|
136
141
|
}
|
|
137
|
-
this._$scrollSize.next(actualScrollSize);
|
|
138
142
|
}
|
|
139
143
|
};
|
|
140
144
|
this._$initialized = new BehaviorSubject(false);
|
|
@@ -205,7 +209,7 @@ export class NgVirtualListComponent extends DisposableComponent {
|
|
|
205
209
|
bounds: { width, height }, collection: items, dynamicSize, isVertical, itemSize,
|
|
206
210
|
itemsOffset, scrollSize: scrollSize, snap, enabledBufferOptimization,
|
|
207
211
|
};
|
|
208
|
-
const { displayItems, totalSize
|
|
212
|
+
const { displayItems, totalSize } = this._trackBox.updateCollection(items, stickyMap, {
|
|
209
213
|
...opts, scrollSize: actualScrollSize,
|
|
210
214
|
});
|
|
211
215
|
this.resetBoundsSize(isVertical, totalSize);
|
|
@@ -213,20 +217,20 @@ export class NgVirtualListComponent extends DisposableComponent {
|
|
|
213
217
|
this.tracking();
|
|
214
218
|
const container = this._container;
|
|
215
219
|
if (!this.isScrolling && dynamicSize && container) {
|
|
216
|
-
actualScrollSize = scrollSize + delta;
|
|
220
|
+
actualScrollSize = scrollSize + this._trackBox.delta;
|
|
217
221
|
if (snapToItem) {
|
|
218
|
-
const targetItem = this._trackBox.getNearestItem(actualScrollSize, items, itemSize, isVertical);
|
|
222
|
+
const items = this.items, isVertical = this._isVertical, targetItem = this._trackBox.getNearestItem(actualScrollSize, items, itemSize, isVertical);
|
|
219
223
|
if (targetItem) {
|
|
220
224
|
this.scrollTo(targetItem.id, BEHAVIOR_INSTANT);
|
|
221
225
|
}
|
|
222
226
|
}
|
|
223
227
|
else if (scrollSize !== actualScrollSize) {
|
|
224
228
|
const params = {
|
|
225
|
-
[
|
|
229
|
+
[this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualScrollSize,
|
|
226
230
|
behavior: BEHAVIOR_INSTANT
|
|
227
231
|
};
|
|
228
|
-
this.scrollImmediately(container, params);
|
|
229
232
|
this._trackBox.clearDelta();
|
|
233
|
+
container.nativeElement.scrollTo(params);
|
|
230
234
|
}
|
|
231
235
|
}
|
|
232
236
|
return of(displayItems);
|
|
@@ -377,30 +381,28 @@ export class NgVirtualListComponent extends DisposableComponent {
|
|
|
377
381
|
get trackBy() { return this._$trackBy.getValue(); }
|
|
378
382
|
get isScrolling() { return this._isScrolling; }
|
|
379
383
|
scrollImmediately(container, params, cb) {
|
|
380
|
-
this.
|
|
384
|
+
if (this._scrolls.size > 0) {
|
|
385
|
+
container.nativeElement.scrollTo(params);
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
this._trackBox.clearDelta();
|
|
381
389
|
container.nativeElement.removeEventListener(SCROLL_END, this._onScrollEndHandler);
|
|
390
|
+
container.nativeElement.removeEventListener(SCROLL, this._onScrollHandler);
|
|
382
391
|
const handler = () => {
|
|
392
|
+
const container = this._container;
|
|
383
393
|
if (container) {
|
|
384
394
|
container.nativeElement.removeEventListener(SCROLL_END, handler);
|
|
385
|
-
|
|
395
|
+
this._scrolls.delete(handler);
|
|
396
|
+
container.nativeElement.addEventListener(SCROLL_END, this._onScrollEndHandler);
|
|
397
|
+
container.nativeElement.addEventListener(SCROLL, this._onScrollHandler);
|
|
386
398
|
if (cb !== undefined) {
|
|
387
399
|
cb();
|
|
388
400
|
}
|
|
389
|
-
container.nativeElement.addEventListener(SCROLL_END, this._onScrollEndHandler);
|
|
390
401
|
}
|
|
391
402
|
};
|
|
403
|
+
this._scrolls.set(handler, true);
|
|
392
404
|
container.nativeElement.addEventListener(SCROLL_END, handler);
|
|
393
|
-
container.nativeElement.
|
|
394
|
-
this._scrollImmediatelyHandler = handler;
|
|
395
|
-
}
|
|
396
|
-
clearScrollImmediately() {
|
|
397
|
-
if (this._scrollImmediatelyHandler === undefined) {
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
const container = this._container;
|
|
401
|
-
if (container) {
|
|
402
|
-
container.nativeElement.removeEventListener(SCROLL_END, this._scrollImmediatelyHandler);
|
|
403
|
-
}
|
|
405
|
+
container.nativeElement.scrollTo(params);
|
|
404
406
|
}
|
|
405
407
|
get $cacheVersion() { return this._$cacheVersion.asObservable(); }
|
|
406
408
|
ngOnInit() {
|
|
@@ -533,12 +535,12 @@ export class NgVirtualListComponent extends DisposableComponent {
|
|
|
533
535
|
};
|
|
534
536
|
container.nativeElement.addEventListener(SCROLL_END, handler);
|
|
535
537
|
}
|
|
536
|
-
container.nativeElement.
|
|
538
|
+
container.nativeElement.scrollTo(params);
|
|
537
539
|
}
|
|
538
540
|
else {
|
|
539
541
|
const index = items.findIndex(item => item.id === id), scrollSize = index * this.itemSize;
|
|
540
542
|
const params = { [this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, behavior };
|
|
541
|
-
container.nativeElement.
|
|
543
|
+
container.nativeElement.scrollTo(params);
|
|
542
544
|
}
|
|
543
545
|
}
|
|
544
546
|
}
|
|
@@ -559,9 +561,19 @@ export class NgVirtualListComponent extends DisposableComponent {
|
|
|
559
561
|
this._onResizeHandler();
|
|
560
562
|
}
|
|
561
563
|
}
|
|
564
|
+
clearScrollImmediately() {
|
|
565
|
+
const container = this._container;
|
|
566
|
+
if (container) {
|
|
567
|
+
this._scrolls.forEach((_, handler) => {
|
|
568
|
+
container.nativeElement.removeEventListener(SCROLL_END, handler);
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
this._scrolls.clear();
|
|
572
|
+
}
|
|
562
573
|
ngOnDestroy() {
|
|
563
574
|
super.ngOnDestroy();
|
|
564
575
|
this.clearScrollToRepeatExecutionTimeout();
|
|
576
|
+
this.clearScrollImmediately();
|
|
565
577
|
if (this._trackBox) {
|
|
566
578
|
this._trackBox.dispose();
|
|
567
579
|
}
|
|
@@ -631,4 +643,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
631
643
|
}], trackBy: [{
|
|
632
644
|
type: Input
|
|
633
645
|
}] } });
|
|
634
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlydHVhbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9uZy12aXJ0dWFsLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsVUFBVSxFQUFFLEtBQUssRUFDdkUsTUFBTSxFQUFFLFlBQVksRUFBZSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEdBRTdGLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsSixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQ0wsYUFBYSxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLG1DQUFtQyxFQUFFLGlCQUFpQixFQUM1SyxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFDM0osc0JBQXNCLEVBQUUsZUFBZSxHQUN4QyxNQUFNLFNBQVMsQ0FBQztBQUlqQixPQUFPLEVBQWEsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFB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ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBJbnB1dCxcclxuICBPbkRlc3Ryb3ksIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbmctdmlydHVhbC1saXN0LWl0ZW0uY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBCRUhBVklPUl9BVVRPLCBCRUhBVklPUl9JTlNUQU5ULCBDTEFTU19MSVNUX0hPUklaT05UQUwsIENMQVNTX0xJU1RfVkVSVElDQUwsIERFRkFVTFRfRElSRUNUSU9OLCBERUZBVUxUX0RZTkFNSUNfU0laRSwgREVGQVVMVF9FTkFCTEVEX0JVRkZFUl9PUFRJTUlaQVRJT04sIERFRkFVTFRfSVRFTV9TSVpFLFxyXG4gIERFRkFVTFRfSVRFTVNfT0ZGU0VULCBERUZBVUxUX1NOQVAsIERFRkFVTFRfU05BUF9UT19JVEVNLCBIRUlHSFRfUFJPUF9OQU1FLCBMRUZUX1BST1BfTkFNRSwgTUFYX1NDUk9MTF9UT19JVEVSQVRJT05TLCBQWCwgU0NST0xMLCBTQ1JPTExfRU5ELCBUT1BfUFJPUF9OQU1FLFxyXG4gIFRSQUNLX0JZX1BST1BFUlRZX05BTUUsIFdJRFRIX1BST1BfTkFNRSxcclxufSBmcm9tICcuL2NvbnN0JztcclxuaW1wb3J0IHsgSVNjcm9sbEV2ZW50LCBJVmlydHVhbExpc3RDb2xsZWN0aW9uLCBJVmlydHVhbExpc3RJdGVtLCBJVmlydHVhbExpc3RTdGlja3lNYXAgfSBmcm9tICcuL21vZGVscyc7XHJcbmltcG9ydCB7IElkLCBJUmVjdCB9IGZyb20gJy4vdHlwZXMnO1xyXG5pbXBvcnQgeyBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uIH0gZnJvbSAnLi9tb2RlbHMvcmVuZGVyLWNvbGxlY3Rpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBEaXJlY3Rpb24sIERpcmVjdGlvbnMgfSBmcm9tICcuL2VudW1zJztcclxuaW1wb3J0IHsgU2Nyb2xsRXZlbnQsIFRyYWNrQm94LCBkZWJvdW5jZSwgaXNEaXJlY3Rpb24sIHRvZ2dsZUNsYXNzTmFtZSB9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgeyBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9ucywgVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FIH0gZnJvbSAnLi91dGlscy90cmFja0JveCc7XHJcbmltcG9ydCB7IERpc3Bvc2FibGVDb21wb25lbnQgfSBmcm9tICcuL3V0aWxzL2Rpc3Bvc2FibGVDb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIFZpcnR1YWwgbGlzdCBjb21wb25lbnQuXHJcbiAqIE1heGltdW0gcGVyZm9ybWFuY2UgZm9yIGV4dHJlbWVseSBsYXJnZSBsaXN0cy5cclxuICogSXQgaXMgYmFzZWQgb24gYWxnb3JpdGhtcyBmb3IgdmlydHVhbGl6YXRpb24gb2Ygc2NyZWVuIG9iamVjdHMuXHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iLzE0LngvcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvbmctdmlydHVhbC1saXN0LmNvbXBvbmVudC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25nLXZpcnR1YWwtbGlzdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmctdmlydHVhbC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdWaXJ0dWFsTGlzdENvbXBvbmVudCBleHRlbmRzIERpc3Bvc2FibGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgc3RhdGljIF9fbmV4dElkOiBudW1iZXIgPSAwO1xyXG5cclxuICBwcml2YXRlIF9pZDogbnVtYmVyID0gTmdWaXJ0dWFsTGlzdENvbXBvbmVudC5fX25leHRJZDtcclxuICAvKipcclxuICAgKiBSZWFkb25seS4gUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbXBvbmVudC5cclxuICAgKi9cclxuICBnZXQgaWQoKSB7IHJldHVybiB0aGlzLl9pZDsgfVxyXG5cclxuICBAVmlld0NoaWxkKCdyZW5kZXJlcnNDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuICBwcm90ZWN0ZWQgX2xpc3RDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfSlcclxuICBwcm90ZWN0ZWQgX2NvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2xpc3QnLCB7IHJlYWQ6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IH0pXHJcbiAgcHJvdGVjdGVkIF9saXN0OiBFbGVtZW50UmVmPEhUTUxVTGlzdEVsZW1lbnQ+IHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBGaXJlcyB3aGVuIHRoZSBsaXN0IGhhcyBiZWVuIHNjcm9sbGVkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIG9uU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxJU2Nyb2xsRXZlbnQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpcmVzIHdoZW4gdGhlIGxpc3QgaGFzIGNvbXBsZXRlZCBzY3JvbGxpbmcuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgb25TY3JvbGxFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElTY3JvbGxFdmVudD4oKTtcclxuXHJcblxyXG4gIHByaXZhdGUgXyRpdGVtcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVZpcnR1YWxMaXN0Q29sbGVjdGlvbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuICByZWFkb25seSAkaXRlbXMgPSB0aGlzLl8kaXRlbXMuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2l0ZW1zVHJhbnNmb3JtID0gKHY6IElWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCB1bmRlZmluZWQpID0+IHtcclxuICAgIHRoaXMuX3RyYWNrQm94LnJlc2V0Q29sbGVjdGlvbih2LCB0aGlzLl8kaXRlbVNpemUuZ2V0VmFsdWUoKSk7XHJcbiAgICByZXR1cm4gdjtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBDb2xsZWN0aW9uIG9mIGxpc3QgaXRlbXMuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgaXRlbXModjogSVZpcnR1YWxMaXN0Q29sbGVjdGlvbikge1xyXG4gICAgaWYgKHRoaXMuXyRpdGVtcy5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5faXRlbXNUcmFuc2Zvcm0odik7XHJcblxyXG4gICAgdGhpcy5fJGl0ZW1zLm5leHQodHJhbnNmb3JtZWRWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH07XHJcbiAgZ2V0IGl0ZW1zKCkgeyByZXR1cm4gdGhpcy5fJGl0ZW1zLmdldFZhbHVlKCkgYXMgSVZpcnR1YWxMaXN0Q29sbGVjdGlvbjsgfVxyXG5cclxuICBwcml2YXRlIF8kc25hcCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9TTkFQKTtcclxuICByZWFkb25seSAkc25hcCA9IHRoaXMuXyRzbmFwLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgZWxlbWVudHMgd2lsbCBzbmFwLiBEZWZhdWx0IHZhbHVlIGlzIFwidHJ1ZVwiLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNuYXAodjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRzbmFwLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuXyRzbmFwLm5leHQodik7XHJcblxyXG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH07XHJcbiAgZ2V0IHNuYXAoKSB7IHJldHVybiB0aGlzLl8kc25hcC5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRzbmFwVG9JdGVtID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX1NOQVBfVE9fSVRFTSk7XHJcbiAgcmVhZG9ubHkgJHNuYXBUb0l0ZW0gPSB0aGlzLl8kc25hcFRvSXRlbS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHNjcm9sbCBwb3NpdGlvbnMgd2lsbCBiZSBzbmFwcGVkIHRvIHRoZSBlbGVtZW50LiBEZWZhdWx0IHZhbHVlIGlzIFwiZmFsc2VcIi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzbmFwVG9JdGVtKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kc25hcFRvSXRlbS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl8kc25hcFRvSXRlbS5uZXh0KHYpO1xyXG5cclxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9O1xyXG4gIGdldCBzbmFwVG9JdGVtKCkgeyByZXR1cm4gdGhpcy5fJHNuYXBUb0l0ZW0uZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9FTkFCTEVEX0JVRkZFUl9PUFRJTUlaQVRJT04pO1xyXG4gIHJlYWRvbmx5ICRlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uID0gdGhpcy5fJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24uYXNPYnNlcnZhYmxlKCk7XHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyBidWZmZXIgb3B0aW1pemF0aW9uLlxyXG4gICAqIENhbiBvbmx5IGJlIHVzZWQgaWYgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gYXJlIG5vdCBhZGRlZCBvciB1cGRhdGVkLiBPdGhlcndpc2UsIGFydGlmYWN0cyBpbiB0aGUgZm9ybSBvZiB0d2l0Y2hpbmcgb2YgdGhlIHNjcm9sbCBhcmVhIGFyZSBwb3NzaWJsZS5cclxuICAgKiBXb3JrcyBvbmx5IGlmIHRoZSBwcm9wZXJ0eSBkeW5hbWljID0gdHJ1ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24odjogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuXyRlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuXyRlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLm5leHQodik7XHJcblxyXG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH07XHJcbiAgZ2V0IGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24oKSB7IHJldHVybiB0aGlzLl8kZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbi5nZXRWYWx1ZSgpOyB9XHJcblxyXG5cclxuICBwcml2YXRlIF8kaXRlbVJlbmRlcmVyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xyXG4gIHJlYWRvbmx5ICRpdGVtUmVuZGVyZXIgPSB0aGlzLl8kaXRlbVJlbmRlcmVyLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIC8qKlxyXG4gICogUmVuZGVyaW5nIGVsZW1lbnQgdGVtcGxhdGUuXHJcbiAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBpdGVtUmVuZGVyZXIodjogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgaWYgKHRoaXMuXyRpdGVtUmVuZGVyZXIuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fJGl0ZW1SZW5kZXJlci5uZXh0KHYpO1xyXG5cclxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9O1xyXG4gIGdldCBpdGVtUmVuZGVyZXIoKSB7IHJldHVybiB0aGlzLl8kaXRlbVJlbmRlcmVyLmdldFZhbHVlKCkgYXMgVGVtcGxhdGVSZWY8YW55PjsgfVxyXG5cclxuICBwcml2YXRlIF8kc3RpY2t5TWFwID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJVmlydHVhbExpc3RTdGlja3lNYXA+KHt9KTtcclxuICByZWFkb25seSAkc3RpY2t5TWFwID0gdGhpcy5fJHN0aWNreU1hcC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGljdGlvbmFyeSB6SW5kZXggYnkgaWQgb2YgdGhlIGxpc3QgZWxlbWVudC4gSWYgdGhlIHZhbHVlIGlzIG5vdCBzZXQgb3IgZXF1YWwgdG8gMCxcclxuICAgKiB0aGVuIGEgc2ltcGxlIGVsZW1lbnQgaXMgZGlzcGxheWVkLCBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAsIHRoZW4gdGhlIHN0aWNreSBwb3NpdGlvbiBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoZSBlbGVtZW50LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHN0aWNreU1hcCh2OiBJVmlydHVhbExpc3RTdGlja3lNYXApIHtcclxuICAgIGlmICh0aGlzLl8kc3RpY2t5TWFwLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuXyRzdGlja3lNYXAubmV4dCh2KTtcclxuXHJcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfTtcclxuICBnZXQgc3RpY2t5TWFwKCkgeyByZXR1cm4gdGhpcy5fJHN0aWNreU1hcC5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgX2l0ZW1TaXplT3B0aW9ucyA9ICh2OiBudW1iZXIgfCB1bmRlZmluZWQpID0+IHtcclxuICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIERFRkFVTFRfSVRFTV9TSVpFO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdmFsID0gTnVtYmVyKHYpO1xyXG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWwpIHx8IHZhbCA8PSAwID8gREVGQVVMVF9JVEVNX1NJWkUgOiB2YWw7XHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfJGl0ZW1TaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KERFRkFVTFRfSVRFTV9TSVpFKTtcclxuICByZWFkb25seSAkaXRlbVNpemUgPSB0aGlzLl8kaXRlbVNpemUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGRpcmVjdGlvbiA9ICd2ZXJ0aWNhbCcsIHRoZW4gdGhlIGhlaWdodCBvZiBhIHR5cGljYWwgZWxlbWVudC4gSWYgZGlyZWN0aW9uID0gJ2hvcml6b250YWwnLCB0aGVuIHRoZSB3aWR0aCBvZiBhIHR5cGljYWwgZWxlbWVudC5cclxuICAgKiBJZ25vcmVkIGlmIHRoZSBkeW5hbWljU2l6ZSBwcm9wZXJ0eSBpcyB0cnVlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGl0ZW1TaXplKHY6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuXyRpdGVtU2l6ZS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl8kaXRlbVNpemUubmV4dCh0aGlzLl9pdGVtU2l6ZU9wdGlvbnModikpO1xyXG5cclxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9O1xyXG4gIGdldCBpdGVtU2l6ZSgpIHsgcmV0dXJuIHRoaXMuXyRpdGVtU2l6ZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRkeW5hbWljU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9EWU5BTUlDX1NJWkUpO1xyXG4gIHJlYWRvbmx5ICRkeW5hbWljU2l6ZSA9IHRoaXMuXyRkeW5hbWljU2l6ZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogSWYgdHJ1ZSB0aGVuIHRoZSBpdGVtcyBpbiB0aGUgbGlzdCBjYW4gaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIHRoZSBpdGVtU2l6ZSBwcm9wZXJ0eSBpcyBpZ25vcmVkLlxyXG4gICAqIElmIGZhbHNlIHRoZW4gdGhlIGl0ZW1zIGluIHRoZSBsaXN0IGhhdmUgYSBmaXhlZCBzaXplIHNwZWNpZmllZCBieSB0aGUgaXRlbVNpemUgcHJvcGVydHkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGR5bmFtaWNTaXplKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kZHluYW1pY1NpemUuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fJGR5bmFtaWNTaXplLm5leHQodik7XHJcblxyXG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH07XHJcbiAgZ2V0IGR5bmFtaWNTaXplKCkgeyByZXR1cm4gdGhpcy5fJGR5bmFtaWNTaXplLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGRpcmVjdGlvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGlyZWN0aW9uPihERUZBVUxUX0RJUkVDVElPTik7XHJcbiAgcmVhZG9ubHkgJGRpcmVjdGlvbiA9IHRoaXMuXyRkaXJlY3Rpb24uYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIGRpcmVjdGlvbiBpbiB3aGljaCBlbGVtZW50cyBhcmUgcGxhY2VkLiBEZWZhdWx0IHZhbHVlIGlzIFwidmVydGljYWxcIi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXJlY3Rpb24odjogRGlyZWN0aW9uKSB7XHJcbiAgICBpZiAodGhpcy5fJGRpcmVjdGlvbi5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl8kZGlyZWN0aW9uLm5leHQodik7XHJcblxyXG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH07XHJcbiAgZ2V0IGRpcmVjdGlvbigpIHsgcmV0dXJuIHRoaXMuXyRkaXJlY3Rpb24uZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kaXRlbXNPZmZzZXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oREVGQVVMVF9JVEVNU19PRkZTRVQpO1xyXG4gIHJlYWRvbmx5ICRpdGVtc09mZnNldCA9IHRoaXMuXyRpdGVtc09mZnNldC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTnVtYmVyIG9mIGVsZW1lbnRzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHZpc2liaWxpdHkuIERlZmF1bHQgdmFsdWUgaXMgMi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBpdGVtc09mZnNldCh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kaXRlbXNPZmZzZXQuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fJGl0ZW1zT2Zmc2V0Lm5leHQodik7XHJcbiAgfTtcclxuICBnZXQgaXRlbXNPZmZzZXQoKSB7IHJldHVybiB0aGlzLl8kaXRlbXNPZmZzZXQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kdHJhY2tCeSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihUUkFDS19CWV9QUk9QRVJUWV9OQU1FKTtcclxuICByZWFkb25seSAkdHJhY2tCeSA9IHRoaXMuXyR0cmFja0J5LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYnkgd2hpY2ggdHJhY2tpbmcgaXMgcGVyZm9ybWVkXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgdHJhY2tCeSh2OiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLl8kdHJhY2tCeS5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl8kdHJhY2tCeS5uZXh0KHYpO1xyXG4gIH07XHJcbiAgZ2V0IHRyYWNrQnkoKSB7IHJldHVybiB0aGlzLl8kdHJhY2tCeS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgX2lzVmVydGljYWwgPSB0aGlzLmdldElzVmVydGljYWwoKTtcclxuXHJcbiAgcHJvdGVjdGVkIF9kaXNwbGF5Q29tcG9uZW50czogQXJyYXk8Q29tcG9uZW50UmVmPE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50Pj4gPSBbXTtcclxuXHJcbiAgcHJvdGVjdGVkIF8kYm91bmRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxET01SZWN0IHwgbnVsbD4obnVsbCk7XHJcblxyXG4gIHByb3RlY3RlZCBfJHNjcm9sbFNpemUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcblxyXG4gIHByaXZhdGUgX2lzU2Nyb2xsaW5nRGVib3VuY2VzID0gZGVib3VuY2UoKHY6IGJvb2xlYW4pID0+IHtcclxuICAgIHRoaXMuX2lzU2Nyb2xsaW5nID0gdjtcclxuICB9LCAyNTApO1xyXG5cclxuICBwcml2YXRlIF9pc1Njcm9sbGluZyA9IGZhbHNlO1xyXG4gIGdldCBpc1Njcm9sbGluZygpIHsgcmV0dXJuIHRoaXMuX2lzU2Nyb2xsaW5nOyB9XHJcblxyXG4gIHByaXZhdGUgX3Jlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9vblJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICB0aGlzLl8kYm91bmRzLm5leHQodGhpcy5fY29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA/PyBudWxsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uU2Nyb2xsSGFuZGxlciA9IChlPzogRXZlbnQpID0+IHtcclxuICAgIHRoaXMuX2lzU2Nyb2xsaW5nRGVib3VuY2VzLmRpc3Bvc2UoKTtcclxuXHJcbiAgICB0aGlzLmNsZWFyU2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0KCk7XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICBjb25zdCBkeW5hbWljU2l6ZSA9IHRoaXMuZHluYW1pY1NpemUsIGRlbHRhID0gdGhpcy5fdHJhY2tCb3guZGVsdGEsIHNjcm9sbFNpemUgPSAodGhpcy5faXNWZXJ0aWNhbCA/IGNvbnRhaW5lci5zY3JvbGxUb3AgOiBjb250YWluZXIuc2Nyb2xsTGVmdCk7XHJcbiAgICAgIGxldCBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSwgaXNJbW1lZGlhdGVTY3JvbGwgPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChkeW5hbWljU2l6ZSAmJiBkZWx0YSAhPT0gMCkge1xyXG4gICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBzY3JvbGxTaXplICsgZGVsdGE7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICBbdGhpcy5faXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICBiZWhhdmlvcjogQkVIQVZJT1JfSU5TVEFOVCBhcyBTY3JvbGxCZWhhdmlvclxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcjtcclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICBpc0ltbWVkaWF0ZVNjcm9sbCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgdGhpcy5zY3JvbGxJbW1lZGlhdGVseShjb250YWluZXIsIHBhcmFtcyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5fdHJhY2tCb3guY2xlYXJEZWx0YSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fJHNjcm9sbFNpemUubmV4dChhY3R1YWxTY3JvbGxTaXplKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsSW1tZWRpYXRlbHkoY29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiwgcGFyYW1zOiBTY3JvbGxPcHRpb25zLCBjYj86ICgpID0+IHZvaWQpIHtcclxuICAgIHRoaXMuY2xlYXJTY3JvbGxJbW1lZGlhdGVseSgpO1xyXG5cclxuICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25TY3JvbGxFbmRIYW5kbGVyKTtcclxuICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIGhhbmRsZXIpO1xyXG5cclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGwocGFyYW1zKTtcclxuXHJcbiAgICAgICAgaWYgKGNiICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNiKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgaGFuZGxlcik7XHJcblxyXG4gICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHBhcmFtcyk7XHJcblxyXG4gICAgdGhpcy5fc2Nyb2xsSW1tZWRpYXRlbHlIYW5kbGVyID0gaGFuZGxlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbEltbWVkaWF0ZWx5SGFuZGxlcjogKCguLi5hcmdzOiBBcnJheTxhbnk+KSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBjbGVhclNjcm9sbEltbWVkaWF0ZWx5KCkge1xyXG4gICAgaWYgKHRoaXMuX3Njcm9sbEltbWVkaWF0ZWx5SGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XHJcbiAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fc2Nyb2xsSW1tZWRpYXRlbHlIYW5kbGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uU2Nyb2xsRW5kSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhKCk7XHJcbiAgICAgIHRoaXMuX3RyYWNrQm94LmNsZWFyRGVsdGFEaXJlY3Rpb24oKTtcclxuXHJcbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdGhpcy5pdGVtU2l6ZSwgc25hcFRvSXRlbSA9IHRoaXMuc25hcFRvSXRlbSwgZHluYW1pY1NpemUgPSB0aGlzLmR5bmFtaWNTaXplLCBkZWx0YSA9IHRoaXMuX3RyYWNrQm94LmRlbHRhLFxyXG4gICAgICAgIHNjcm9sbFNpemUgPSAodGhpcy5faXNWZXJ0aWNhbCA/IGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA6IGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQpO1xyXG4gICAgICBsZXQgYWN0dWFsU2Nyb2xsU2l6ZSA9IHNjcm9sbFNpemU7XHJcbiAgICAgIGlmIChkeW5hbWljU2l6ZSkge1xyXG4gICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBzY3JvbGxTaXplICsgZGVsdGE7XHJcbiAgICAgICAgaWYgKHNuYXBUb0l0ZW0pIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcyxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgICAgICAgIHRhcmdldEl0ZW0gPSB0aGlzLl90cmFja0JveC5nZXROZWFyZXN0SXRlbShhY3R1YWxTY3JvbGxTaXplLCBpdGVtcywgaXRlbVNpemUsIGlzVmVydGljYWwpO1xyXG4gICAgICAgICAgaWYgKHRhcmdldEl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyh0YXJnZXRJdGVtLmlkLCBCRUhBVklPUl9JTlNUQU5UIGFzIFNjcm9sbEJlaGF2aW9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFNpemUgIT09IGFjdHVhbFNjcm9sbFNpemUpIHtcclxuICAgICAgICAgIGNvbnN0IHBhcmFtczogU2Nyb2xsVG9PcHRpb25zID0ge1xyXG4gICAgICAgICAgICBbdGhpcy5faXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgIGJlaGF2aW9yOiBCRUhBVklPUl9JTlNUQU5UIGFzIFNjcm9sbEJlaGF2aW9yXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMuXyRzY3JvbGxTaXplLm5leHQoYWN0dWFsU2Nyb2xsU2l6ZSk7XHJcblxyXG4gICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHBhcmFtcyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbEl0ZW1zID0gTWF0aC5yb3VuZChzY3JvbGxTaXplIC8gaXRlbVNpemUpO1xyXG4gICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBzbmFwVG9JdGVtID8gc2Nyb2xsSXRlbXMgKiBpdGVtU2l6ZSA6IHNjcm9sbFNpemU7XHJcblxyXG4gICAgICAgIGlmIChzY3JvbGxTaXplICE9PSBhY3R1YWxTY3JvbGxTaXplKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJhbXM6IFNjcm9sbFRvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgW3RoaXMuX2lzVmVydGljYWwgPyBUT1BfUFJPUF9OQU1FIDogTEVGVF9QUk9QX05BTUVdOiBhY3R1YWxTY3JvbGxTaXplLFxyXG4gICAgICAgICAgICBiZWhhdmlvcjogQkVIQVZJT1JfSU5TVEFOVCBhcyBTY3JvbGxCZWhhdmlvclxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGwocGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuXyRzY3JvbGxTaXplLm5leHQoYWN0dWFsU2Nyb2xsU2l6ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF8kaW5pdGlhbGl6ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgcmVhZG9ubHkgJGluaXRpYWxpemVkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICAvKipcclxuICAgKiBEaWN0aW9uYXJ5IG9mIGVsZW1lbnQgc2l6ZXMgYnkgdGhlaXIgaWRcclxuICAgKi9cclxuICBwcml2YXRlIF90cmFja0JveCA9IG5ldyBUcmFja0JveCh0aGlzLnRyYWNrQnkpO1xyXG5cclxuICBwcml2YXRlIF9vblRyYWNrQm94Q2hhbmdlSGFuZGxlciA9ICh2OiBudW1iZXIpID0+IHtcclxuICAgIHRoaXMuXyRjYWNoZVZlcnNpb24ubmV4dCh2KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgXyRjYWNoZVZlcnNpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oLTEpO1xyXG4gIGdldCAkY2FjaGVWZXJzaW9uKCkgeyByZXR1cm4gdGhpcy5fJGNhY2hlVmVyc2lvbi5hc09ic2VydmFibGUoKTsgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PlxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIE5nVmlydHVhbExpc3RDb21wb25lbnQuX19uZXh0SWQgPSBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkICsgMSA9PT0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcclxuICAgICAgPyAwIDogTmdWaXJ0dWFsTGlzdENvbXBvbmVudC5fX25leHRJZCArIDE7XHJcbiAgICB0aGlzLl9pZCA9IE5nVmlydHVhbExpc3RDb21wb25lbnQuX19uZXh0SWQ7XHJcblxyXG4gICAgdGhpcy5fJGluaXRpYWxpemVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICB0aGlzLiRpbml0aWFsaXplZCA9IHRoaXMuXyRpbml0aWFsaXplZC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICB0aGlzLl90cmFja0JveC5kaXNwbGF5Q29tcG9uZW50cyA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzO1xyXG5cclxuICAgIGNvbnN0ICR0cmFja0J5ID0gdGhpcy4kdHJhY2tCeTtcclxuXHJcbiAgICAkdHJhY2tCeS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrQm94LnRyYWNraW5nUHJvcGVydHlOYW1lID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbnN0ICRib3VuZHMgPSB0aGlzLl8kYm91bmRzLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICAgIGZpbHRlcihiID0+ICEhYiksXHJcbiAgICApLCAkaXRlbXMgPSB0aGlzLiRpdGVtcy5waXBlKFxyXG4gICAgICBtYXAoaSA9PiAhaSA/IFtdIDogaSksXHJcbiAgICApLCAkc2Nyb2xsU2l6ZSA9IHRoaXMuXyRzY3JvbGxTaXplLmFzT2JzZXJ2YWJsZSgpLFxyXG4gICAgICAkaXRlbVNpemUgPSB0aGlzLiRpdGVtU2l6ZS5waXBlKFxyXG4gICAgICAgIG1hcCh2ID0+IHYgPD0gMCA/IERFRkFVTFRfSVRFTV9TSVpFIDogdiksXHJcbiAgICAgICksXHJcbiAgICAgICRpdGVtc09mZnNldCA9IHRoaXMuJGl0ZW1zT2Zmc2V0LnBpcGUoXHJcbiAgICAgICAgbWFwKHYgPT4gdiA8IDAgPyBERUZBVUxUX0lURU1TX09GRlNFVCA6IHYpLFxyXG4gICAgICApLFxyXG4gICAgICAkc3RpY2t5TWFwID0gdGhpcy4kc3RpY2t5TWFwLnBpcGUoXHJcbiAgICAgICAgbWFwKHYgPT4gIXYgPyB7fSA6IHYpLFxyXG4gICAgICApLFxyXG4gICAgICAkc25hcCA9IHRoaXMuJHNuYXAsXHJcbiAgICAgICRzbmFwVG9JdGVtID0gdGhpcy4kc25hcFRvSXRlbSxcclxuICAgICAgJGlzVmVydGljYWwgPSB0aGlzLiRkaXJlY3Rpb24ucGlwZShcclxuICAgICAgICBtYXAodiA9PiB0aGlzLmdldElzVmVydGljYWwodiB8fCBERUZBVUxUX0RJUkVDVElPTikpLFxyXG4gICAgICApLFxyXG4gICAgICAkZHluYW1pY1NpemUgPSB0aGlzLiRkeW5hbWljU2l6ZSxcclxuICAgICAgJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24gPSB0aGlzLiRlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLFxyXG4gICAgICAkY2FjaGVWZXJzaW9uID0gdGhpcy4kY2FjaGVWZXJzaW9uO1xyXG5cclxuICAgICRpc1ZlcnRpY2FsLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5faXNWZXJ0aWNhbCA9IHY7XHJcbiAgICAgICAgY29uc3QgZWw6IEhUTUxFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIHRvZ2dsZUNsYXNzTmFtZShlbCwgdiA/IENMQVNTX0xJU1RfVkVSVElDQUwgOiBDTEFTU19MSVNUX0hPUklaT05UQUwsIHRydWUpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgJGR5bmFtaWNTaXplLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAoZHluYW1pY1NpemUgPT4ge1xyXG4gICAgICAgIHRoaXMubGlzdGVuQ2FjaGVDaGFuZ2VzSWZOZWVkKGR5bmFtaWNTaXplKTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy4kaW5pdGlhbGl6ZWQsICRib3VuZHMsICRpdGVtcywgJHN0aWNreU1hcCwgJHNjcm9sbFNpemUsICRpdGVtU2l6ZSxcclxuICAgICAgJGl0ZW1zT2Zmc2V0LCAkc25hcCwgJHNuYXBUb0l0ZW0sICRpc1ZlcnRpY2FsLCAkZHluYW1pY1NpemUsICRlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLCAkY2FjaGVWZXJzaW9uLFxyXG4gICAgXSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIGRlYm91bmNlVGltZSgwKSxcclxuICAgICAgZmlsdGVyKChbaW5pdGlhbGl6ZWRdKSA9PiAhIWluaXRpYWxpemVkKSxcclxuICAgICAgc3dpdGNoTWFwKChbLFxyXG4gICAgICAgIGJvdW5kcywgaXRlbXMsIHN0aWNreU1hcCwgc2Nyb2xsU2l6ZSwgaXRlbVNpemUsXHJcbiAgICAgICAgaXRlbXNPZmZzZXQsIHNuYXAsIHNuYXBUb0l0ZW0sIGlzVmVydGljYWwsIGR5bmFtaWNTaXplLCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLCBjYWNoZVZlcnNpb24sXHJcbiAgICAgIF0pID0+IHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJvdW5kcyBhcyBET01SZWN0O1xyXG4gICAgICAgIGxldCBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICBjb25zdCBvcHRzOiBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJVmlydHVhbExpc3RJdGVtLCBJVmlydHVhbExpc3RDb2xsZWN0aW9uPiA9IHtcclxuICAgICAgICAgIGJvdW5kczogeyB3aWR0aCwgaGVpZ2h0IH0sIGNvbGxlY3Rpb246IGl0ZW1zLCBkeW5hbWljU2l6ZSwgaXNWZXJ0aWNhbCwgaXRlbVNpemUsXHJcbiAgICAgICAgICBpdGVtc09mZnNldCwgc2Nyb2xsU2l6ZTogc2Nyb2xsU2l6ZSwgc25hcCwgZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgZGlzcGxheUl0ZW1zLCB0b3RhbFNpemUsIGRlbHRhIH0gPSB0aGlzLl90cmFja0JveC51cGRhdGVDb2xsZWN0aW9uKGl0ZW1zLCBzdGlja3lNYXAsIHtcclxuICAgICAgICAgIC4uLm9wdHMsIHNjcm9sbFNpemU6IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRCb3VuZHNTaXplKGlzVmVydGljYWwsIHRvdGFsU2l6ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlRGlzcGxheUNvbXBvbmVudHNJZk5lZWQoZGlzcGxheUl0ZW1zKTtcclxuXHJcbiAgICAgICAgdGhpcy50cmFja2luZygpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc1Njcm9sbGluZyAmJiBkeW5hbWljU2l6ZSAmJiBjb250YWluZXIpIHtcclxuICAgICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBzY3JvbGxTaXplICsgZGVsdGE7XHJcbiAgICAgICAgICBpZiAoc25hcFRvSXRlbSkge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRJdGVtID0gdGhpcy5fdHJhY2tCb3guZ2V0TmVhcmVzdEl0ZW0oYWN0dWFsU2Nyb2xsU2l6ZSwgaXRlbXMsIGl0ZW1TaXplLCBpc1ZlcnRpY2FsKTtcclxuICAgICAgICAgICAgaWYgKHRhcmdldEl0ZW0pIHtcclxuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKHRhcmdldEl0ZW0uaWQsIEJFSEFWSU9SX0lOU1RBTlQgYXMgU2Nyb2xsQmVoYXZpb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgaWYgKHNjcm9sbFNpemUgIT09IGFjdHVhbFNjcm9sbFNpemUpIHtcclxuICAgICAgICAgICAgICBjb25zdCBwYXJhbXM6IFNjcm9sbFRvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIFtpc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogYWN0dWFsU2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiBCRUhBVklPUl9JTlNUQU5UIGFzIFNjcm9sbEJlaGF2aW9yXHJcbiAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxJbW1lZGlhdGVseShjb250YWluZXIsIHBhcmFtcyk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuX3RyYWNrQm94LmNsZWFyRGVsdGEoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9mKGRpc3BsYXlJdGVtcyk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLiRpbml0aWFsaXplZCwgdGhpcy4kaXRlbVJlbmRlcmVyXSkucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIGZpbHRlcigoW2luaXRpYWxpemVkXSkgPT4gISFpbml0aWFsaXplZCksXHJcbiAgICAgIHRhcCgoWywgaXRlbVJlbmRlcmVyXSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzZXRSZW5kZXJlcnMoaXRlbVJlbmRlcmVyKTtcclxuICAgICAgfSlcclxuICAgIClcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5fJGluaXRpYWxpemVkLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RlbkNhY2hlQ2hhbmdlc0lmTmVlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGlmICghdGhpcy5fdHJhY2tCb3guaGFzRXZlbnRMaXN0ZW5lcihUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUUsIHRoaXMuX29uVHJhY2tCb3hDaGFuZ2VIYW5kbGVyKSkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrQm94LmFkZEV2ZW50TGlzdGVuZXIoVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FLCB0aGlzLl9vblRyYWNrQm94Q2hhbmdlSGFuZGxlcik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl90cmFja0JveC5oYXNFdmVudExpc3RlbmVyKFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSwgdGhpcy5fb25UcmFja0JveENoYW5nZUhhbmRsZXIpKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3gucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUUsIHRoaXMuX29uVHJhY2tCb3hDaGFuZ2VIYW5kbGVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJc1ZlcnRpY2FsKGQ/OiBEaXJlY3Rpb24pIHtcclxuICAgIGNvbnN0IGRpciA9IGQgfHwgdGhpcy5kaXJlY3Rpb247XHJcbiAgICByZXR1cm4gaXNEaXJlY3Rpb24oZGlyLCBEaXJlY3Rpb25zLlZFUlRJQ0FMKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbXBvbmVudHNSZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XHJcbiAgICB0aGlzLl90cmFja0JveC5jaGFuZ2VzKCk7XHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRGlzcGxheUNvbXBvbmVudHNJZk5lZWQoZGlzcGxheUl0ZW1zOiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uIHwgbnVsbCkge1xyXG4gICAgaWYgKCFkaXNwbGF5SXRlbXMgfHwgIXRoaXMuX2xpc3RDb250YWluZXJSZWYpIHtcclxuICAgICAgdGhpcy5fdHJhY2tCb3guc2V0RGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCh7fSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl90cmFja0JveC5pdGVtcyA9IGRpc3BsYXlJdGVtcztcclxuXHJcbiAgICBjb25zdCBfbGlzdENvbnRhaW5lclJlZiA9IHRoaXMuX2xpc3RDb250YWluZXJSZWY7XHJcblxyXG4gICAgd2hpbGUgKHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLmxlbmd0aCA8IGRpc3BsYXlJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgaWYgKF9saXN0Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgICAgY29uc3QgY29tcCA9IF9saXN0Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChOZ1ZpcnR1YWxMaXN0SXRlbUNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5fZGlzcGxheUNvbXBvbmVudHMucHVzaChjb21wKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50c1Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29tcC5pbnN0YW5jZS5lbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1heExlbmd0aCA9IGRpc3BsYXlJdGVtcy5sZW5ndGg7XHJcbiAgICB3aGlsZSAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IGNvbXAgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5wb3AoKTtcclxuICAgICAgaWYgKGNvbXApIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRzUmVzaXplT2JzZXJ2ZXIudW5vYnNlcnZlKGNvbXAuaW5zdGFuY2UuZWxlbWVudCk7XHJcblxyXG4gICAgICAgIGNvbXAuZGVzdHJveSgpO1xyXG4gICAgICAgIGNvbnN0IGlkID0gY29tcD8uaW5zdGFuY2UuaXRlbT8uaWQ7XHJcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuX3RyYWNrQm94LnVudHJhY2tDb21wb25lbnRCeUlkUHJvcGVydHkoY29tcD8uaW5zdGFuY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzZXRSZW5kZXJlcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRSZW5kZXJlcnMoaXRlbVJlbmRlcmVyPzogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgY29uc3QgZG9NYXA6IHsgW2lkOiBudW1iZXJdOiBudW1iZXIgfSA9IHt9O1xyXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzW2ldO1xyXG4gICAgICBpdGVtLmluc3RhbmNlLnJlbmRlcmVyID0gaXRlbVJlbmRlcmVyIHx8IHRoaXMuaXRlbVJlbmRlcmVyO1xyXG4gICAgICBkb01hcFtpdGVtLmluc3RhbmNlLmlkXSA9IGk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fdHJhY2tCb3guc2V0RGlzcGxheU9iamVjdEluZGV4TWFwQnlJZChkb01hcCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFja2luZyBieSBpZFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCB0cmFja2luZygpIHtcclxuICAgIHRoaXMuX3RyYWNrQm94LnRyYWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Qm91bmRzU2l6ZShpc1ZlcnRpY2FsOiBib29sZWFuLCB0b3RhbFNpemU6IG51bWJlcikge1xyXG4gICAgY29uc3QgbCA9IHRoaXMuX2xpc3Q7XHJcbiAgICBpZiAobCkge1xyXG4gICAgICBsLm5hdGl2ZUVsZW1lbnQuc3R5bGVbaXNWZXJ0aWNhbCA/IEhFSUdIVF9QUk9QX05BTUUgOiBXSURUSF9QUk9QX05BTUVdID0gYCR7dG90YWxTaXplfSR7UFh9YDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGJvdW5kcyBvZiBhbiBlbGVtZW50IHdpdGggYSBnaXZlbiBpZFxyXG4gICAqL1xyXG4gIGdldEl0ZW1Cb3VuZHMoaWQ6IElkKTogSVJlY3QgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RyYWNrQm94LmdldEl0ZW1Cb3VuZHMoaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG1ldGhvZCBzY3JvbGxzIHRoZSBsaXN0IHRvIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIGlkIGFuZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc2Nyb2xsZWQgYXJlYS5cclxuICAgKiBCZWhhdmlvciBhY2NlcHRzIHRoZSB2YWx1ZXMg4oCL4oCLXCJhdXRvXCIsIFwiaW5zdGFudFwiIGFuZCBcInNtb290aFwiLlxyXG4gICAqL1xyXG4gIHNjcm9sbFRvKGlkOiBJZCwgYmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yID0gQkVIQVZJT1JfQVVUTykge1xyXG4gICAgdGhpcy5zY3JvbGxUb0V4ZWN1dG9yKGlkLCBiZWhhdmlvcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQ6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBjbGVhclNjcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dCgpIHtcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLl9zY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHNjcm9sbFRvRXhlY3V0b3IoaWQ6IElkLCBiZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IsIGl0ZXJhdGlvbjogbnVtYmVyID0gMCkge1xyXG4gICAgdGhpcy5faXNTY3JvbGxpbmcgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuY2xlYXJTY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQoKTtcclxuXHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXM7XHJcbiAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGR5bmFtaWNTaXplID0gdGhpcy5keW5hbWljU2l6ZSwgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyLCBpdGVtU2l6ZSA9IHRoaXMuaXRlbVNpemU7XHJcbiAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgIGlmIChkeW5hbWljU2l6ZSkge1xyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMLCB0aGlzLl9vblNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9vblNjcm9sbEVuZEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLl8kYm91bmRzLmdldFZhbHVlKCkgfHwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sXHJcbiAgICAgICAgICBzdGlja3lNYXAgPSB0aGlzLnN0aWNreU1hcCwgaXRlbXMgPSB0aGlzLml0ZW1zLCBpc1ZlcnRpY2FsID0gdGhpcy5faXNWZXJ0aWNhbCxcclxuICAgICAgICAgIG9wdHM6IElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPElWaXJ0dWFsTGlzdEl0ZW0sIElWaXJ0dWFsTGlzdENvbGxlY3Rpb24+ID0ge1xyXG4gICAgICAgICAgICBib3VuZHM6IHsgd2lkdGgsIGhlaWdodCB9LCBjb2xsZWN0aW9uOiBpdGVtcywgZHluYW1pY1NpemUsIGlzVmVydGljYWw6IHRoaXMuX2lzVmVydGljYWwsIGl0ZW1TaXplLFxyXG4gICAgICAgICAgICBpdGVtc09mZnNldDogdGhpcy5pdGVtc09mZnNldCwgc2Nyb2xsU2l6ZTogaXNWZXJ0aWNhbCA/IGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA6IGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQsXHJcbiAgICAgICAgICAgIHNuYXA6IHRoaXMuc25hcCwgZnJvbUl0ZW1JZDogaWQsIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb246IHRoaXMuZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbixcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzY3JvbGxTaXplID0gdGhpcy5fdHJhY2tCb3guZ2V0SXRlbVBvc2l0aW9uKGlkLCBzdGlja3lNYXAsIG9wdHMpLFxyXG4gICAgICAgICAgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7IFtpc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogc2Nyb2xsU2l6ZSwgYmVoYXZpb3IgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fJHNjcm9sbFNpemUubmV4dChzY3JvbGxTaXplKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgaGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IHsgZGlzcGxheUl0ZW1zLCB0b3RhbFNpemUgfSA9IHRoaXMuX3RyYWNrQm94LnVwZGF0ZUNvbGxlY3Rpb24oaXRlbXMsIHN0aWNreU1hcCwge1xyXG4gICAgICAgICAgICAgICAgLi4ub3B0cywgc2Nyb2xsU2l6ZSwgZnJvbUl0ZW1JZDogaWQsXHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMucmVzZXRCb3VuZHNTaXplKGlzVmVydGljYWwsIHRvdGFsU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRGlzcGxheUNvbXBvbmVudHNJZk5lZWQoZGlzcGxheUl0ZW1zKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy50cmFja2luZygpO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBfc2Nyb2xsU2l6ZSA9IHRoaXMuX3RyYWNrQm94LmdldEl0ZW1Qb3NpdGlvbihpZCwgc3RpY2t5TWFwLCB7IC4uLm9wdHMsIHNjcm9sbFNpemUsIGZyb21JdGVtSWQ6IGlkIH0pO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoc2Nyb2xsU2l6ZSA8IF9zY3JvbGxTaXplICYmIGl0ZXJhdGlvbiA8IE1BWF9TQ1JPTExfVE9fSVRFUkFUSU9OUykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclNjcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9FeGVjdXRvcihpZCwgQkVIQVZJT1JfSU5TVEFOVCBhcyBTY3JvbGxCZWhhdmlvciwgaXRlcmF0aW9uICsgMSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fJHNjcm9sbFNpemUubmV4dChzY3JvbGxTaXplKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTCwgdGhpcy5fb25TY3JvbGxIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25TY3JvbGxFbmRIYW5kbGVyKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgaGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGwocGFyYW1zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IGlkKSwgc2Nyb2xsU2l6ZSA9IGluZGV4ICogdGhpcy5pdGVtU2l6ZTtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IFNjcm9sbFRvT3B0aW9ucyA9IHsgW3RoaXMuX2lzVmVydGljYWwgPyBUT1BfUFJPUF9OQU1FIDogTEVGVF9QUk9QX05BTUVdOiBzY3JvbGxTaXplLCBiZWhhdmlvciB9O1xyXG4gICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbChwYXJhbXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzY3JvbGxUb0VuZChiZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSBCRUhBVklPUl9JTlNUQU5UIGFzIFNjcm9sbEJlaGF2aW9yKSB7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXMsIGxhdEl0ZW0gPSBpdGVtc1tpdGVtcy5sZW5ndGggPiAwID8gaXRlbXMubGVuZ3RoIC0gMSA6IDBdO1xyXG4gICAgdGhpcy5zY3JvbGxUbyhsYXRJdGVtLmlkLCBiZWhhdmlvcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkNvbnRhaW5lclNjcm9sbEhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcclxuICAgIHRoaXMuX2lzU2Nyb2xsaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuX2NvbnRhaW5lcjtcclxuICAgIGlmIChjb250YWluZXJFbCkge1xyXG4gICAgICBjb25zdCBzY3JvbGxTaXplID0gKHRoaXMuX2lzVmVydGljYWwgPyBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA6IGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCk7XHJcbiAgICAgIHRoaXMuX3RyYWNrQm94LmRlbHRhRGlyZWN0aW9uID0gdGhpcy5fJHNjcm9sbFNpemUuZ2V0VmFsdWUoKSA+IHNjcm9sbFNpemUgPyAtMSA6IHRoaXMuXyRzY3JvbGxTaXplLmdldFZhbHVlKCkgPCBzY3JvbGxTaXplID8gMSA6IDA7XHJcblxyXG4gICAgICBjb25zdCBldmVudCA9IG5ldyBTY3JvbGxFdmVudCh7XHJcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLl90cmFja0JveC5zY3JvbGxEaXJlY3Rpb24sIGNvbnRhaW5lcjogY29udGFpbmVyRWwubmF0aXZlRWxlbWVudCxcclxuICAgICAgICBsaXN0OiB0aGlzLl9saXN0IS5uYXRpdmVFbGVtZW50LCBkZWx0YTogdGhpcy5fdHJhY2tCb3guZGVsdGEsXHJcbiAgICAgICAgc2Nyb2xsRGVsdGE6IHRoaXMuX3RyYWNrQm94LnNjcm9sbERlbHRhLCBpc1ZlcnRpY2FsOiB0aGlzLl9pc1ZlcnRpY2FsLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMub25TY3JvbGwuZW1pdChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkNvbnRhaW5lclNjcm9sbEVuZEhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcclxuICAgIHRoaXMuX2lzU2Nyb2xsaW5nRGVib3VuY2VzLmV4ZWN1dGUoZmFsc2UpO1xyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgaWYgKGNvbnRhaW5lckVsKSB7XHJcbiAgICAgIGNvbnN0IHNjcm9sbFNpemUgPSAodGhpcy5faXNWZXJ0aWNhbCA/IGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIDogY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0KTtcclxuICAgICAgdGhpcy5fdHJhY2tCb3guZGVsdGFEaXJlY3Rpb24gPSB0aGlzLl8kc2Nyb2xsU2l6ZS5nZXRWYWx1ZSgpID4gc2Nyb2xsU2l6ZSA/IC0xIDogMDtcclxuXHJcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFNjcm9sbEV2ZW50KHtcclxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuX3RyYWNrQm94LnNjcm9sbERpcmVjdGlvbiwgY29udGFpbmVyOiBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgIGxpc3Q6IHRoaXMuX2xpc3QhLm5hdGl2ZUVsZW1lbnQsIGRlbHRhOiB0aGlzLl90cmFja0JveC5kZWx0YSxcclxuICAgICAgICBzY3JvbGxEZWx0YTogdGhpcy5fdHJhY2tCb3guc2Nyb2xsRGVsdGEsIGlzVmVydGljYWw6IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5vblNjcm9sbEVuZC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgaWYgKGNvbnRhaW5lckVsKSB7XHJcbiAgICAgIC8vIGZvciBkaXJlY3Rpb24gY2FsY3VsYXRpb25cclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTCwgdGhpcy5fb25Db250YWluZXJTY3JvbGxIYW5kbGVyKTtcclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uQ29udGFpbmVyU2Nyb2xsRW5kSGFuZGxlcik7XHJcblxyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMLCB0aGlzLl9vblNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25TY3JvbGxFbmRIYW5kbGVyKTtcclxuXHJcbiAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHRoaXMuX29uUmVzaXplSGFuZGxlcik7XHJcbiAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyRWwubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICB0aGlzLl9vblJlc2l6ZUhhbmRsZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuXHJcbiAgICB0aGlzLmNsZWFyU2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3RyYWNrQm94KSB7XHJcbiAgICAgIHRoaXMuX3RyYWNrQm94LmRpc3Bvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5faXNTY3JvbGxpbmdEZWJvdW5jZXMpIHtcclxuICAgICAgdGhpcy5faXNTY3JvbGxpbmdEZWJvdW5jZXMuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9jb21wb25lbnRzUmVzaXplT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5fY29tcG9uZW50c1Jlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fcmVzaXplT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgaWYgKGNvbnRhaW5lckVsKSB7XHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTEwsIHRoaXMuX29uU2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9vblNjcm9sbEVuZEhhbmRsZXIpO1xyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMLCB0aGlzLl9vbkNvbnRhaW5lclNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25Db250YWluZXJTY3JvbGxFbmRIYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMpIHtcclxuICAgICAgd2hpbGUgKHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMucG9wKCk7XHJcbiAgICAgICAgY29tcD8uZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgI2NvbnRhaW5lciBwYXJ0PVwic2Nyb2xsZXJcIiBjbGFzcz1cIm5ndmxfX2NvbnRhaW5lclwiPlxyXG4gIDx1bCAjbGlzdCBwYXJ0PVwibGlzdFwiIGNsYXNzPVwibmd2bF9fbGlzdFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAjcmVuZGVyZXJzQ29udGFpbmVyPjwvbmctY29udGFpbmVyPlxyXG4gIDwvdWw+XHJcbjwvZGl2PiJdfQ==
|
|
646
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlydHVhbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9uZy12aXJ0dWFsLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsVUFBVSxFQUFFLEtBQUssRUFDdkUsTUFBTSxFQUFFLFlBQVksRUFBZSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEdBRTdGLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsSixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUN6RixPQUFPLEVBQ0wsYUFBYSxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLG1DQUFtQyxFQUFFLGlCQUFpQixFQUM1SyxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFDM0osc0JBQXNCLEVBQUUsZUFBZSxHQUN4QyxNQUFNLFNBQVMsQ0FBQztBQUlqQixPQUFPLEVBQWEsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFB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O3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUlqRCxVQUFVO3NCQURuQixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFBLFVBQTBCLENBQUEsRUFBRTtnQkFJbEQsS0FBSztzQkFEZCxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFBLFVBQTBCLENBQUEsRUFBRTtnQkFPdkQsUUFBUTtzQkFEUCxNQUFNO2dCQU9QLFdBQVc7c0JBRFYsTUFBTTtnQkFnQkgsS0FBSztzQkFEUixLQUFLO2dCQXFCRixJQUFJO3NCQURQLEtBQUs7Z0JBbUJGLFVBQVU7c0JBRGIsS0FBSztnQkFvQkYseUJBQXlCO3NCQUQ1QixLQUFLO2dCQW1CRixZQUFZO3NCQURmLEtBQUs7Z0JBb0JGLFNBQVM7c0JBRFosS0FBSztnQkE0QkYsUUFBUTtzQkFEWCxLQUFLO2dCQW9CRixXQUFXO3NCQURkLEtBQUs7Z0JBbUJGLFNBQVM7c0JBRFosS0FBSztnQkFtQkYsV0FBVztzQkFEZCxLQUFLO2dCQWlCRixPQUFPO3NCQURWLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgRWxlbWVudFJlZiwgSW5wdXQsXHJcbiAgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL25nLXZpcnR1YWwtbGlzdC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQkVIQVZJT1JfQVVUTywgQkVIQVZJT1JfSU5TVEFOVCwgQ0xBU1NfTElTVF9IT1JJWk9OVEFMLCBDTEFTU19MSVNUX1ZFUlRJQ0FMLCBERUZBVUxUX0RJUkVDVElPTiwgREVGQVVMVF9EWU5BTUlDX1NJWkUsIERFRkFVTFRfRU5BQkxFRF9CVUZGRVJfT1BUSU1JWkFUSU9OLCBERUZBVUxUX0lURU1fU0laRSxcclxuICBERUZBVUxUX0lURU1TX09GRlNFVCwgREVGQVVMVF9TTkFQLCBERUZBVUxUX1NOQVBfVE9fSVRFTSwgSEVJR0hUX1BST1BfTkFNRSwgTEVGVF9QUk9QX05BTUUsIE1BWF9TQ1JPTExfVE9fSVRFUkFUSU9OUywgUFgsIFNDUk9MTCwgU0NST0xMX0VORCwgVE9QX1BST1BfTkFNRSxcclxuICBUUkFDS19CWV9QUk9QRVJUWV9OQU1FLCBXSURUSF9QUk9QX05BTUUsXHJcbn0gZnJvbSAnLi9jb25zdCc7XHJcbmltcG9ydCB7IElTY3JvbGxFdmVudCwgSVZpcnR1YWxMaXN0Q29sbGVjdGlvbiwgSVZpcnR1YWxMaXN0SXRlbSwgSVZpcnR1YWxMaXN0U3RpY2t5TWFwIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBJZCwgSVJlY3QgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB9IGZyb20gJy4vbW9kZWxzL3JlbmRlci1jb2xsZWN0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uLCBEaXJlY3Rpb25zIH0gZnJvbSAnLi9lbnVtcyc7XHJcbmltcG9ydCB7IFNjcm9sbEV2ZW50LCBUcmFja0JveCwgZGVib3VuY2UsIGlzRGlyZWN0aW9uLCB0b2dnbGVDbGFzc05hbWUgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgSVJlY2FsY3VsYXRlTWV0cmljc09wdGlvbnMsIFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSB9IGZyb20gJy4vdXRpbHMvdHJhY2tCb3gnO1xyXG5pbXBvcnQgeyBEaXNwb3NhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi91dGlscy9kaXNwb3NhYmxlQ29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBWaXJ0dWFsIGxpc3QgY29tcG9uZW50LlxyXG4gKiBNYXhpbXVtIHBlcmZvcm1hbmNlIGZvciBleHRyZW1lbHkgbGFyZ2UgbGlzdHMuXHJcbiAqIEl0IGlzIGJhc2VkIG9uIGFsZ29yaXRobXMgZm9yIHZpcnR1YWxpemF0aW9uIG9mIHNjcmVlbiBvYmplY3RzLlxyXG4gKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vRGpvbm55WC9uZy12aXJ0dWFsLWxpc3QvYmxvYi8xNC54L3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQudHNcclxuICogQGF1dGhvciBFdmdlbmlpIEdyZWJlbm5pa292XHJcbiAqIEBlbWFpbCBkam9ubnl4QGdtYWlsLmNvbVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZy12aXJ0dWFsLWxpc3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy12aXJ0dWFsLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLlNoYWRvd0RvbSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5nVmlydHVhbExpc3RDb21wb25lbnQgZXh0ZW5kcyBEaXNwb3NhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHN0YXRpYyBfX25leHRJZDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciA9IE5nVmlydHVhbExpc3RDb21wb25lbnQuX19uZXh0SWQ7XHJcbiAgLyoqXHJcbiAgICogUmVhZG9ubHkuIFJldHVybnMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb21wb25lbnQuXHJcbiAgICovXHJcbiAgZ2V0IGlkKCkgeyByZXR1cm4gdGhpcy5faWQ7IH1cclxuXHJcbiAgQFZpZXdDaGlsZCgncmVuZGVyZXJzQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgcHJvdGVjdGVkIF9saXN0Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkO1xyXG5cclxuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IH0pXHJcbiAgcHJvdGVjdGVkIF9jb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBAVmlld0NoaWxkKCdsaXN0JywgeyByZWFkOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiB9KVxyXG4gIHByb3RlY3RlZCBfbGlzdDogRWxlbWVudFJlZjxIVE1MVUxpc3RFbGVtZW50PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqXHJcbiAgICogRmlyZXMgd2hlbiB0aGUgbGlzdCBoYXMgYmVlbiBzY3JvbGxlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBvblNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8SVNjcm9sbEV2ZW50PigpO1xyXG5cclxuICAvKipcclxuICAgKiBGaXJlcyB3aGVuIHRoZSBsaXN0IGhhcyBjb21wbGV0ZWQgc2Nyb2xsaW5nLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIG9uU2Nyb2xsRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxJU2Nyb2xsRXZlbnQ+KCk7XHJcblxyXG5cclxuICBwcml2YXRlIF8kaXRlbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XHJcbiAgcmVhZG9ubHkgJGl0ZW1zID0gdGhpcy5fJGl0ZW1zLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9pdGVtc1RyYW5zZm9ybSA9ICh2OiBJVmlydHVhbExpc3RDb2xsZWN0aW9uIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICB0aGlzLl90cmFja0JveC5yZXNldENvbGxlY3Rpb24odiwgdGhpcy5fJGl0ZW1TaXplLmdldFZhbHVlKCkpO1xyXG4gICAgcmV0dXJuIHY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGVjdGlvbiBvZiBsaXN0IGl0ZW1zLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGl0ZW1zKHY6IElWaXJ0dWFsTGlzdENvbGxlY3Rpb24pIHtcclxuICAgIGlmICh0aGlzLl8kaXRlbXMuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHRoaXMuX2l0ZW1zVHJhbnNmb3JtKHYpO1xyXG5cclxuICAgIHRoaXMuXyRpdGVtcy5uZXh0KHRyYW5zZm9ybWVkVmFsdWUpO1xyXG5cclxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9O1xyXG4gIGdldCBpdGVtcygpIHsgcmV0dXJuIHRoaXMuXyRpdGVtcy5nZXRWYWx1ZSgpIGFzIElWaXJ0dWFsTGlzdENvbGxlY3Rpb247IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHNuYXAgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfU05BUCk7XHJcbiAgcmVhZG9ubHkgJHNuYXAgPSB0aGlzLl8kc25hcC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGVsZW1lbnRzIHdpbGwgc25hcC4gRGVmYXVsdCB2YWx1ZSBpcyBcInRydWVcIi5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzbmFwKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kc25hcC5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl8kc25hcC5uZXh0KHYpO1xyXG5cclxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9O1xyXG4gIGdldCBzbmFwKCkgeyByZXR1cm4gdGhpcy5fJHNuYXAuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kc25hcFRvSXRlbSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9TTkFQX1RPX0lURU0pO1xyXG4gIHJlYWRvbmx5ICRzbmFwVG9JdGVtID0gdGhpcy5fJHNuYXBUb0l0ZW0uYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBzY3JvbGwgcG9zaXRpb25zIHdpbGwgYmUgc25hcHBlZCB0byB0aGUgZWxlbWVudC4gRGVmYXVsdCB2YWx1ZSBpcyBcImZhbHNlXCIuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgc25hcFRvSXRlbSh2OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fJHNuYXBUb0l0ZW0uZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fJHNuYXBUb0l0ZW0ubmV4dCh2KTtcclxuXHJcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfTtcclxuICBnZXQgc25hcFRvSXRlbSgpIHsgcmV0dXJuIHRoaXMuXyRzbmFwVG9JdGVtLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfRU5BQkxFRF9CVUZGRVJfT1BUSU1JWkFUSU9OKTtcclxuICByZWFkb25seSAkZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbiA9IHRoaXMuXyRlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgYnVmZmVyIG9wdGltaXphdGlvbi5cclxuICAgKiBDYW4gb25seSBiZSB1c2VkIGlmIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uIGFyZSBub3QgYWRkZWQgb3IgdXBkYXRlZC4gT3RoZXJ3aXNlLCBhcnRpZmFjdHMgaW4gdGhlIGZvcm0gb2YgdHdpdGNoaW5nIG9mIHRoZSBzY3JvbGwgYXJlYSBhcmUgcG9zc2libGUuXHJcbiAgICogV29ya3Mgb25seSBpZiB0aGUgcHJvcGVydHkgZHluYW1pYyA9IHRydWVcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uKHY6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLl8kZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbi5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl8kZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbi5uZXh0KHYpO1xyXG5cclxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9O1xyXG4gIGdldCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uKCkgeyByZXR1cm4gdGhpcy5fJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24uZ2V0VmFsdWUoKTsgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBfJGl0ZW1SZW5kZXJlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcclxuICByZWFkb25seSAkaXRlbVJlbmRlcmVyID0gdGhpcy5fJGl0ZW1SZW5kZXJlci5hc09ic2VydmFibGUoKTtcclxuICAvKipcclxuICAqIFJlbmRlcmluZyBlbGVtZW50IHRlbXBsYXRlLlxyXG4gICovXHJcbiAgQElucHV0KClcclxuICBzZXQgaXRlbVJlbmRlcmVyKHY6IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgIGlmICh0aGlzLl8kaXRlbVJlbmRlcmVyLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuXyRpdGVtUmVuZGVyZXIubmV4dCh2KTtcclxuXHJcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfTtcclxuICBnZXQgaXRlbVJlbmRlcmVyKCkgeyByZXR1cm4gdGhpcy5fJGl0ZW1SZW5kZXJlci5nZXRWYWx1ZSgpIGFzIFRlbXBsYXRlUmVmPGFueT47IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHN0aWNreU1hcCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVZpcnR1YWxMaXN0U3RpY2t5TWFwPih7fSk7XHJcbiAgcmVhZG9ubHkgJHN0aWNreU1hcCA9IHRoaXMuXyRzdGlja3lNYXAuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERpY3Rpb25hcnkgekluZGV4IGJ5IGlkIG9mIHRoZSBsaXN0IGVsZW1lbnQuIElmIHRoZSB2YWx1ZSBpcyBub3Qgc2V0IG9yIGVxdWFsIHRvIDAsXHJcbiAgICogdGhlbiBhIHNpbXBsZSBlbGVtZW50IGlzIGRpc3BsYXllZCwgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHRoZSBzdGlja3kgcG9zaXRpb24gbW9kZSBpcyBlbmFibGVkIGZvciB0aGUgZWxlbWVudC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBzdGlja3lNYXAodjogSVZpcnR1YWxMaXN0U3RpY2t5TWFwKSB7XHJcbiAgICBpZiAodGhpcy5fJHN0aWNreU1hcC5nZXRWYWx1ZSgpID09PSB2KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl8kc3RpY2t5TWFwLm5leHQodik7XHJcblxyXG4gICAgdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH07XHJcbiAgZ2V0IHN0aWNreU1hcCgpIHsgcmV0dXJuIHRoaXMuXyRzdGlja3lNYXAuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF9pdGVtU2l6ZU9wdGlvbnMgPSAodjogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBERUZBVUxUX0lURU1fU0laRTtcclxuICAgIH1cclxuICAgIGNvbnN0IHZhbCA9IE51bWJlcih2KTtcclxuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsKSB8fCB2YWwgPD0gMCA/IERFRkFVTFRfSVRFTV9TSVpFIDogdmFsO1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgXyRpdGVtU2l6ZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihERUZBVUxUX0lURU1fU0laRSk7XHJcbiAgcmVhZG9ubHkgJGl0ZW1TaXplID0gdGhpcy5fJGl0ZW1TaXplLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAvKipcclxuICAgKiBJZiBkaXJlY3Rpb24gPSAndmVydGljYWwnLCB0aGVuIHRoZSBoZWlnaHQgb2YgYSB0eXBpY2FsIGVsZW1lbnQuIElmIGRpcmVjdGlvbiA9ICdob3Jpem9udGFsJywgdGhlbiB0aGUgd2lkdGggb2YgYSB0eXBpY2FsIGVsZW1lbnQuXHJcbiAgICogSWdub3JlZCBpZiB0aGUgZHluYW1pY1NpemUgcHJvcGVydHkgaXMgdHJ1ZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBpdGVtU2l6ZSh2OiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl8kaXRlbVNpemUuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fJGl0ZW1TaXplLm5leHQodGhpcy5faXRlbVNpemVPcHRpb25zKHYpKTtcclxuXHJcbiAgICB0aGlzLl9jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfTtcclxuICBnZXQgaXRlbVNpemUoKSB7IHJldHVybiB0aGlzLl8kaXRlbVNpemUuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF8kZHluYW1pY1NpemUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfRFlOQU1JQ19TSVpFKTtcclxuICByZWFkb25seSAkZHluYW1pY1NpemUgPSB0aGlzLl8kZHluYW1pY1NpemUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIHRydWUgdGhlbiB0aGUgaXRlbXMgaW4gdGhlIGxpc3QgY2FuIGhhdmUgZGlmZmVyZW50IHNpemVzIGFuZCB0aGUgaXRlbVNpemUgcHJvcGVydHkgaXMgaWdub3JlZC5cclxuICAgKiBJZiBmYWxzZSB0aGVuIHRoZSBpdGVtcyBpbiB0aGUgbGlzdCBoYXZlIGEgZml4ZWQgc2l6ZSBzcGVjaWZpZWQgYnkgdGhlIGl0ZW1TaXplIHByb3BlcnR5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkeW5hbWljU2l6ZSh2OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5fJGR5bmFtaWNTaXplLmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuXyRkeW5hbWljU2l6ZS5uZXh0KHYpO1xyXG5cclxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9O1xyXG4gIGdldCBkeW5hbWljU2l6ZSgpIHsgcmV0dXJuIHRoaXMuXyRkeW5hbWljU2l6ZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gIHByaXZhdGUgXyRkaXJlY3Rpb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERpcmVjdGlvbj4oREVGQVVMVF9ESVJFQ1RJT04pO1xyXG4gIHJlYWRvbmx5ICRkaXJlY3Rpb24gPSB0aGlzLl8kZGlyZWN0aW9uLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggZWxlbWVudHMgYXJlIHBsYWNlZC4gRGVmYXVsdCB2YWx1ZSBpcyBcInZlcnRpY2FsXCIuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgZGlyZWN0aW9uKHY6IERpcmVjdGlvbikge1xyXG4gICAgaWYgKHRoaXMuXyRkaXJlY3Rpb24uZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fJGRpcmVjdGlvbi5uZXh0KHYpO1xyXG5cclxuICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9O1xyXG4gIGdldCBkaXJlY3Rpb24oKSB7IHJldHVybiB0aGlzLl8kZGlyZWN0aW9uLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJGl0ZW1zT2Zmc2V0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KERFRkFVTFRfSVRFTVNfT0ZGU0VUKTtcclxuICByZWFkb25seSAkaXRlbXNPZmZzZXQgPSB0aGlzLl8kaXRlbXNPZmZzZXQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE51bWJlciBvZiBlbGVtZW50cyBvdXRzaWRlIHRoZSBzY29wZSBvZiB2aXNpYmlsaXR5LiBEZWZhdWx0IHZhbHVlIGlzIDIuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgaXRlbXNPZmZzZXQodjogbnVtYmVyKSB7XHJcbiAgICBpZiAodGhpcy5fJGl0ZW1zT2Zmc2V0LmdldFZhbHVlKCkgPT09IHYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuXyRpdGVtc09mZnNldC5uZXh0KHYpO1xyXG4gIH07XHJcbiAgZ2V0IGl0ZW1zT2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5fJGl0ZW1zT2Zmc2V0LmdldFZhbHVlKCk7IH1cclxuXHJcbiAgcHJpdmF0ZSBfJHRyYWNrQnkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oVFJBQ0tfQllfUFJPUEVSVFlfTkFNRSk7XHJcbiAgcmVhZG9ubHkgJHRyYWNrQnkgPSB0aGlzLl8kdHJhY2tCeS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJ5IHdoaWNoIHRyYWNraW5nIGlzIHBlcmZvcm1lZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHRyYWNrQnkodjogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5fJHRyYWNrQnkuZ2V0VmFsdWUoKSA9PT0gdikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fJHRyYWNrQnkubmV4dCh2KTtcclxuICB9O1xyXG4gIGdldCB0cmFja0J5KCkgeyByZXR1cm4gdGhpcy5fJHRyYWNrQnkuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZlcnRpY2FsID0gdGhpcy5nZXRJc1ZlcnRpY2FsKCk7XHJcblxyXG4gIHByb3RlY3RlZCBfZGlzcGxheUNvbXBvbmVudHM6IEFycmF5PENvbXBvbmVudFJlZjxOZ1ZpcnR1YWxMaXN0SXRlbUNvbXBvbmVudD4+ID0gW107XHJcblxyXG4gIHByb3RlY3RlZCBfJGJvdW5kcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RE9NUmVjdCB8IG51bGw+KG51bGwpO1xyXG5cclxuICBwcm90ZWN0ZWQgXyRzY3JvbGxTaXplID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xyXG5cclxuICBwcml2YXRlIF9pc1Njcm9sbGluZ0RlYm91bmNlcyA9IGRlYm91bmNlKCh2OiBib29sZWFuKSA9PiB7XHJcbiAgICB0aGlzLl9pc1Njcm9sbGluZyA9IHY7XHJcbiAgfSwgMjUwKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNTY3JvbGxpbmcgPSBmYWxzZTtcclxuICBnZXQgaXNTY3JvbGxpbmcoKSB7IHJldHVybiB0aGlzLl9pc1Njcm9sbGluZzsgfVxyXG5cclxuICBwcml2YXRlIF9yZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfb25SZXNpemVIYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgdGhpcy5fJGJvdW5kcy5uZXh0KHRoaXMuX2NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgPz8gbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zY3JvbGxzID0gbmV3IE1hcDwoKSA9PiB2b2lkLCBib29sZWFuPigpO1xyXG5cclxuICBwcml2YXRlIF9vblNjcm9sbEhhbmRsZXIgPSAoZT86IEV2ZW50KSA9PiB7XHJcbiAgICB0aGlzLl9pc1Njcm9sbGluZ0RlYm91bmNlcy5kaXNwb3NlKCk7XHJcblxyXG4gICAgdGhpcy5jbGVhclNjcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dCgpO1xyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgY29uc3QgZHluYW1pY1NpemUgPSB0aGlzLmR5bmFtaWNTaXplLCBkZWx0YSA9IHRoaXMuX3RyYWNrQm94LmRlbHRhLCBzY3JvbGxTaXplID0gKHRoaXMuX2lzVmVydGljYWwgPyBjb250YWluZXIuc2Nyb2xsVG9wIDogY29udGFpbmVyLnNjcm9sbExlZnQpO1xyXG4gICAgICBsZXQgYWN0dWFsU2Nyb2xsU2l6ZSA9IHNjcm9sbFNpemUsIGlzU2Nyb2xsSVVtbWVkaWF0ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKGR5bmFtaWNTaXplICYmIGRlbHRhICE9PSAwKSB7XHJcbiAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSA9IHNjcm9sbFNpemUgKyBkZWx0YTtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IFNjcm9sbFRvT3B0aW9ucyA9IHtcclxuICAgICAgICAgIFt0aGlzLl9pc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogYWN0dWFsU2Nyb2xsU2l6ZSxcclxuICAgICAgICAgIGJlaGF2aW9yOiBCRUhBVklPUl9JTlNUQU5UIGFzIFNjcm9sbEJlaGF2aW9yXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgIGlzU2Nyb2xsSVVtbWVkaWF0ZSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbEltbWVkaWF0ZWx5KGNvbnRhaW5lciwgcGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghaXNTY3JvbGxJVW1tZWRpYXRlKSB7XHJcbiAgICAgICAgdGhpcy5fJHNjcm9sbFNpemUubmV4dChhY3R1YWxTY3JvbGxTaXplKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY3JvbGxJbW1lZGlhdGVseShjb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+LCBwYXJhbXM6IFNjcm9sbE9wdGlvbnMsIGNiPzogKCkgPT4gdm9pZCkge1xyXG4gICAgaWYgKHRoaXMuX3Njcm9sbHMuc2l6ZSA+IDApIHtcclxuICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG8ocGFyYW1zKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3RyYWNrQm94LmNsZWFyRGVsdGEoKTtcclxuXHJcbiAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcbiAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTCwgdGhpcy5fb25TY3JvbGxIYW5kbGVyKTtcclxuXHJcbiAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XHJcbiAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIGhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuX3Njcm9sbHMuZGVsZXRlKGhhbmRsZXIpO1xyXG5cclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcbiAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTEwsIHRoaXMuX29uU2Nyb2xsSGFuZGxlcik7XHJcblxyXG4gICAgICAgIGlmIChjYiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjYigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fc2Nyb2xscy5zZXQoaGFuZGxlciwgdHJ1ZSk7XHJcbiAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIGhhbmRsZXIpO1xyXG5cclxuICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vblNjcm9sbEVuZEhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcjtcclxuICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgY29uc3QgaXRlbVNpemUgPSB0aGlzLml0ZW1TaXplLCBzbmFwVG9JdGVtID0gdGhpcy5zbmFwVG9JdGVtLCBkeW5hbWljU2l6ZSA9IHRoaXMuZHluYW1pY1NpemUsIGRlbHRhID0gdGhpcy5fdHJhY2tCb3guZGVsdGEsXHJcbiAgICAgICAgc2Nyb2xsU2l6ZSA9ICh0aGlzLl9pc1ZlcnRpY2FsID8gY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIDogY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCk7XHJcbiAgICAgIGxldCBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZTtcclxuXHJcbiAgICAgIHRoaXMuX3RyYWNrQm94LmNsZWFyRGVsdGFEaXJlY3Rpb24oKTtcclxuXHJcbiAgICAgIGlmIChkeW5hbWljU2l6ZSkge1xyXG4gICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBzY3JvbGxTaXplICsgZGVsdGE7XHJcbiAgICAgICAgaWYgKHNuYXBUb0l0ZW0pIHtcclxuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcyxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgICAgICAgIHRhcmdldEl0ZW0gPSB0aGlzLl90cmFja0JveC5nZXROZWFyZXN0SXRlbShhY3R1YWxTY3JvbGxTaXplLCBpdGVtcywgaXRlbVNpemUsIGlzVmVydGljYWwpO1xyXG4gICAgICAgICAgaWYgKHRhcmdldEl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyh0YXJnZXRJdGVtLmlkLCBCRUhBVklPUl9JTlNUQU5UIGFzIFNjcm9sbEJlaGF2aW9yKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzY3JvbGxTaXplICE9PSBhY3R1YWxTY3JvbGxTaXplKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJhbXM6IFNjcm9sbFRvT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgW3RoaXMuX2lzVmVydGljYWwgPyBUT1BfUFJPUF9OQU1FIDogTEVGVF9QUk9QX05BTUVdOiBhY3R1YWxTY3JvbGxTaXplLFxyXG4gICAgICAgICAgICBiZWhhdmlvcjogQkVIQVZJT1JfSU5TVEFOVCBhcyBTY3JvbGxCZWhhdmlvclxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XHJcbiAgICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsSW1tZWRpYXRlbHkoY29udGFpbmVyLCBwYXJhbXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzY3JvbGxJdGVtcyA9IE1hdGgucm91bmQoc2Nyb2xsU2l6ZSAvIGl0ZW1TaXplKTtcclxuICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gc25hcFRvSXRlbSA/IHNjcm9sbEl0ZW1zICogaXRlbVNpemUgOiBzY3JvbGxTaXplO1xyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsU2l6ZSAhPT0gYWN0dWFsU2Nyb2xsU2l6ZSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIFt0aGlzLl9pc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogYWN0dWFsU2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgYmVoYXZpb3I6IEJFSEFWSU9SX0lOU1RBTlQgYXMgU2Nyb2xsQmVoYXZpb3JcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEltbWVkaWF0ZWx5KGNvbnRhaW5lciwgcGFyYW1zKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgXyRpbml0aWFsaXplZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICByZWFkb25seSAkaW5pdGlhbGl6ZWQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblxyXG4gIC8qKlxyXG4gICAqIERpY3Rpb25hcnkgb2YgZWxlbWVudCBzaXplcyBieSB0aGVpciBpZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3RyYWNrQm94ID0gbmV3IFRyYWNrQm94KHRoaXMudHJhY2tCeSk7XHJcblxyXG4gIHByaXZhdGUgX29uVHJhY2tCb3hDaGFuZ2VIYW5kbGVyID0gKHY6IG51bWJlcikgPT4ge1xyXG4gICAgdGhpcy5fJGNhY2hlVmVyc2lvbi5uZXh0KHYpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfJGNhY2hlVmVyc2lvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigtMSk7XHJcbiAgZ2V0ICRjYWNoZVZlcnNpb24oKSB7IHJldHVybiB0aGlzLl8kY2FjaGVWZXJzaW9uLmFzT2JzZXJ2YWJsZSgpOyB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+XHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgTmdWaXJ0dWFsTGlzdENvbXBvbmVudC5fX25leHRJZCA9IE5nVmlydHVhbExpc3RDb21wb25lbnQuX19uZXh0SWQgKyAxID09PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxyXG4gICAgICA/IDAgOiBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkICsgMTtcclxuICAgIHRoaXMuX2lkID0gTmdWaXJ0dWFsTGlzdENvbXBvbmVudC5fX25leHRJZDtcclxuXHJcbiAgICB0aGlzLl8kaW5pdGlhbGl6ZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHRoaXMuJGluaXRpYWxpemVkID0gdGhpcy5fJGluaXRpYWxpemVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHRoaXMuX3RyYWNrQm94LmRpc3BsYXlDb21wb25lbnRzID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHM7XHJcblxyXG4gICAgY29uc3QgJHRyYWNrQnkgPSB0aGlzLiR0cmFja0J5O1xyXG5cclxuICAgICR0cmFja0J5LnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICB0YXAodiA9PiB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3gudHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJGJvdW5kcyA9IHRoaXMuXyRib3VuZHMuYXNPYnNlcnZhYmxlKCkucGlwZShcclxuICAgICAgZmlsdGVyKGIgPT4gISFiKSxcclxuICAgICksICRpdGVtcyA9IHRoaXMuJGl0ZW1zLnBpcGUoXHJcbiAgICAgIG1hcChpID0+ICFpID8gW10gOiBpKSxcclxuICAgICksICRzY3JvbGxTaXplID0gdGhpcy5fJHNjcm9sbFNpemUuYXNPYnNlcnZhYmxlKCksXHJcbiAgICAgICRpdGVtU2l6ZSA9IHRoaXMuJGl0ZW1TaXplLnBpcGUoXHJcbiAgICAgICAgbWFwKHYgPT4gdiA8PSAwID8gREVGQVVMVF9JVEVNX1NJWkUgOiB2KSxcclxuICAgICAgKSxcclxuICAgICAgJGl0ZW1zT2Zmc2V0ID0gdGhpcy4kaXRlbXNPZmZzZXQucGlwZShcclxuICAgICAgICBtYXAodiA9PiB2IDwgMCA/IERFRkFVTFRfSVRFTVNfT0ZGU0VUIDogdiksXHJcbiAgICAgICksXHJcbiAgICAgICRzdGlja3lNYXAgPSB0aGlzLiRzdGlja3lNYXAucGlwZShcclxuICAgICAgICBtYXAodiA9PiAhdiA/IHt9IDogdiksXHJcbiAgICAgICksXHJcbiAgICAgICRzbmFwID0gdGhpcy4kc25hcCxcclxuICAgICAgJHNuYXBUb0l0ZW0gPSB0aGlzLiRzbmFwVG9JdGVtLFxyXG4gICAgICAkaXNWZXJ0aWNhbCA9IHRoaXMuJGRpcmVjdGlvbi5waXBlKFxyXG4gICAgICAgIG1hcCh2ID0+IHRoaXMuZ2V0SXNWZXJ0aWNhbCh2IHx8IERFRkFVTFRfRElSRUNUSU9OKSksXHJcbiAgICAgICksXHJcbiAgICAgICRkeW5hbWljU2l6ZSA9IHRoaXMuJGR5bmFtaWNTaXplLFxyXG4gICAgICAkZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbiA9IHRoaXMuJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sXHJcbiAgICAgICRjYWNoZVZlcnNpb24gPSB0aGlzLiRjYWNoZVZlcnNpb247XHJcblxyXG4gICAgJGlzVmVydGljYWwucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl9pc1ZlcnRpY2FsID0gdjtcclxuICAgICAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgdG9nZ2xlQ2xhc3NOYW1lKGVsLCB2ID8gQ0xBU1NfTElTVF9WRVJUSUNBTCA6IENMQVNTX0xJU1RfSE9SSVpPTlRBTCwgdHJ1ZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkZHluYW1pY1NpemUucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgIHRhcChkeW5hbWljU2l6ZSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5DYWNoZUNoYW5nZXNJZk5lZWQoZHluYW1pY1NpemUpO1xyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLiRpbml0aWFsaXplZCwgJGJvdW5kcywgJGl0ZW1zLCAkc3RpY2t5TWFwLCAkc2Nyb2xsU2l6ZSwgJGl0ZW1TaXplLFxyXG4gICAgICAkaXRlbXNPZmZzZXQsICRzbmFwLCAkc25hcFRvSXRlbSwgJGlzVmVydGljYWwsICRkeW5hbWljU2l6ZSwgJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sICRjYWNoZVZlcnNpb24sXHJcbiAgICBdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDApLFxyXG4gICAgICBmaWx0ZXIoKFtpbml0aWFsaXplZF0pID0+ICEhaW5pdGlhbGl6ZWQpLFxyXG4gICAgICBzd2l0Y2hNYXAoKFssXHJcbiAgICAgICAgYm91bmRzLCBpdGVtcywgc3RpY2t5TWFwLCBzY3JvbGxTaXplLCBpdGVtU2l6ZSxcclxuICAgICAgICBpdGVtc09mZnNldCwgc25hcCwgc25hcFRvSXRlbSwgaXNWZXJ0aWNhbCwgZHluYW1pY1NpemUsIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sIGNhY2hlVmVyc2lvbixcclxuICAgICAgXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYm91bmRzIGFzIERPTVJlY3Q7XHJcbiAgICAgICAgbGV0IGFjdHVhbFNjcm9sbFNpemUgPSBzY3JvbGxTaXplO1xyXG4gICAgICAgIGNvbnN0IG9wdHM6IElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPElWaXJ0dWFsTGlzdEl0ZW0sIElWaXJ0dWFsTGlzdENvbGxlY3Rpb24+ID0ge1xyXG4gICAgICAgICAgYm91bmRzOiB7IHdpZHRoLCBoZWlnaHQgfSwgY29sbGVjdGlvbjogaXRlbXMsIGR5bmFtaWNTaXplLCBpc1ZlcnRpY2FsLCBpdGVtU2l6ZSxcclxuICAgICAgICAgIGl0ZW1zT2Zmc2V0LCBzY3JvbGxTaXplOiBzY3JvbGxTaXplLCBzbmFwLCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgeyBkaXNwbGF5SXRlbXMsIHRvdGFsU2l6ZSB9ID0gdGhpcy5fdHJhY2tCb3gudXBkYXRlQ29sbGVjdGlvbihpdGVtcywgc3RpY2t5TWFwLCB7XHJcbiAgICAgICAgICAuLi5vcHRzLCBzY3JvbGxTaXplOiBhY3R1YWxTY3JvbGxTaXplLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlc2V0Qm91bmRzU2l6ZShpc1ZlcnRpY2FsLCB0b3RhbFNpemUpO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZURpc3BsYXlDb21wb25lbnRzSWZOZWVkKGRpc3BsYXlJdGVtcyk7XHJcblxyXG4gICAgICAgIHRoaXMudHJhY2tpbmcoKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNTY3JvbGxpbmcgJiYgZHluYW1pY1NpemUgJiYgY29udGFpbmVyKSB7XHJcbiAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSArIHRoaXMuX3RyYWNrQm94LmRlbHRhO1xyXG4gICAgICAgICAgaWYgKHNuYXBUb0l0ZW0pIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zLFxyXG4gICAgICAgICAgICAgIGlzVmVydGljYWwgPSB0aGlzLl9pc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICAgIHRhcmdldEl0ZW0gPSB0aGlzLl90cmFja0JveC5nZXROZWFyZXN0SXRlbShhY3R1YWxTY3JvbGxTaXplLCBpdGVtcywgaXRlbVNpemUsIGlzVmVydGljYWwpO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0SXRlbSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8odGFyZ2V0SXRlbS5pZCwgQkVIQVZJT1JfSU5TVEFOVCBhcyBTY3JvbGxCZWhhdmlvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICBpZiAoc2Nyb2xsU2l6ZSAhPT0gYWN0dWFsU2Nyb2xsU2l6ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmFtczogU2Nyb2xsVG9PcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgW3RoaXMuX2lzVmVydGljYWwgPyBUT1BfUFJPUF9OQU1FIDogTEVGVF9QUk9QX05BTUVdOiBhY3R1YWxTY3JvbGxTaXplLFxyXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6IEJFSEFWSU9SX0lOU1RBTlQgYXMgU2Nyb2xsQmVoYXZpb3JcclxuICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhKCk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHBhcmFtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvZihkaXNwbGF5SXRlbXMpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy4kaW5pdGlhbGl6ZWQsIHRoaXMuJGl0ZW1SZW5kZXJlcl0pLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBmaWx0ZXIoKFtpbml0aWFsaXplZF0pID0+ICEhaW5pdGlhbGl6ZWQpLFxyXG4gICAgICB0YXAoKFssIGl0ZW1SZW5kZXJlcl0pID0+IHtcclxuICAgICAgICB0aGlzLnJlc2V0UmVuZGVyZXJzKGl0ZW1SZW5kZXJlcik7XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuXyRpbml0aWFsaXplZC5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsaXN0ZW5DYWNoZUNoYW5nZXNJZk5lZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBpZiAoIXRoaXMuX3RyYWNrQm94Lmhhc0V2ZW50TGlzdGVuZXIoVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FLCB0aGlzLl9vblRyYWNrQm94Q2hhbmdlSGFuZGxlcikpIHtcclxuICAgICAgICB0aGlzLl90cmFja0JveC5hZGRFdmVudExpc3RlbmVyKFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSwgdGhpcy5fb25UcmFja0JveENoYW5nZUhhbmRsZXIpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fdHJhY2tCb3guaGFzRXZlbnRMaXN0ZW5lcihUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUUsIHRoaXMuX29uVHJhY2tCb3hDaGFuZ2VIYW5kbGVyKSkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrQm94LnJlbW92ZUV2ZW50TGlzdGVuZXIoVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FLCB0aGlzLl9vblRyYWNrQm94Q2hhbmdlSGFuZGxlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SXNWZXJ0aWNhbChkPzogRGlyZWN0aW9uKSB7XHJcbiAgICBjb25zdCBkaXIgPSBkIHx8IHRoaXMuZGlyZWN0aW9uO1xyXG4gICAgcmV0dXJuIGlzRGlyZWN0aW9uKGRpciwgRGlyZWN0aW9ucy5WRVJUSUNBTCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jb21wb25lbnRzUmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgdGhpcy5fdHJhY2tCb3guY2hhbmdlcygpO1xyXG4gIH0pO1xyXG5cclxuICBwcml2YXRlIGNyZWF0ZURpc3BsYXlDb21wb25lbnRzSWZOZWVkKGRpc3BsYXlJdGVtczogSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB8IG51bGwpIHtcclxuICAgIGlmICghZGlzcGxheUl0ZW1zIHx8ICF0aGlzLl9saXN0Q29udGFpbmVyUmVmKSB7XHJcbiAgICAgIHRoaXMuX3RyYWNrQm94LnNldERpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQoe30pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fdHJhY2tCb3guaXRlbXMgPSBkaXNwbGF5SXRlbXM7XHJcblxyXG4gICAgY29uc3QgX2xpc3RDb250YWluZXJSZWYgPSB0aGlzLl9saXN0Q29udGFpbmVyUmVmO1xyXG5cclxuICAgIHdoaWxlICh0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5sZW5ndGggPCBkaXNwbGF5SXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIGlmIChfbGlzdENvbnRhaW5lclJlZikge1xyXG4gICAgICAgIGNvbnN0IGNvbXAgPSBfbGlzdENvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoTmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLnB1c2goY29tcCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudHNSZXNpemVPYnNlcnZlci5vYnNlcnZlKGNvbXAuaW5zdGFuY2UuZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBtYXhMZW5ndGggPSBkaXNwbGF5SXRlbXMubGVuZ3RoO1xyXG4gICAgd2hpbGUgKHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLmxlbmd0aCA+IG1heExlbmd0aCkge1xyXG4gICAgICBjb25zdCBjb21wID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMucG9wKCk7XHJcbiAgICAgIGlmIChjb21wKSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50c1Jlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShjb21wLmluc3RhbmNlLmVsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb21wLmRlc3Ryb3koKTtcclxuICAgICAgICBjb25zdCBpZCA9IGNvbXA/Lmluc3RhbmNlLml0ZW0/LmlkO1xyXG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLl90cmFja0JveC51bnRyYWNrQ29tcG9uZW50QnlJZFByb3BlcnR5KGNvbXA/Lmluc3RhbmNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc2V0UmVuZGVyZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0UmVuZGVyZXJzKGl0ZW1SZW5kZXJlcj86IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgIGNvbnN0IGRvTWFwOiB7IFtpZDogbnVtYmVyXTogbnVtYmVyIH0gPSB7fTtcclxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50c1tpXTtcclxuICAgICAgaXRlbS5pbnN0YW5jZS5yZW5kZXJlciA9IGl0ZW1SZW5kZXJlciB8fCB0aGlzLml0ZW1SZW5kZXJlcjtcclxuICAgICAgZG9NYXBbaXRlbS5pbnN0YW5jZS5pZF0gPSBpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3RyYWNrQm94LnNldERpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQoZG9NYXApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2tpbmcgYnkgaWRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgdHJhY2tpbmcoKSB7XHJcbiAgICB0aGlzLl90cmFja0JveC50cmFjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldEJvdW5kc1NpemUoaXNWZXJ0aWNhbDogYm9vbGVhbiwgdG90YWxTaXplOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGwgPSB0aGlzLl9saXN0O1xyXG4gICAgaWYgKGwpIHtcclxuICAgICAgbC5uYXRpdmVFbGVtZW50LnN0eWxlW2lzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FXSA9IGAke3RvdGFsU2l6ZX0ke1BYfWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgYW4gZWxlbWVudCB3aXRoIGEgZ2l2ZW4gaWRcclxuICAgKi9cclxuICBnZXRJdGVtQm91bmRzKGlkOiBJZCk6IElSZWN0IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl90cmFja0JveC5nZXRJdGVtQm91bmRzKGlkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtZXRob2Qgc2Nyb2xscyB0aGUgbGlzdCB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBpZCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNjcm9sbGVkIGFyZWEuXHJcbiAgICogQmVoYXZpb3IgYWNjZXB0cyB0aGUgdmFsdWVzIOKAi+KAi1wiYXV0b1wiLCBcImluc3RhbnRcIiBhbmQgXCJzbW9vdGhcIi5cclxuICAgKi9cclxuICBzY3JvbGxUbyhpZDogSWQsIGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9IEJFSEFWSU9SX0FVVE8pIHtcclxuICAgIHRoaXMuc2Nyb2xsVG9FeGVjdXRvcihpZCwgYmVoYXZpb3IpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0OiBhbnk7XHJcblxyXG4gIHByaXZhdGUgY2xlYXJTY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQoKSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzY3JvbGxUb0V4ZWN1dG9yKGlkOiBJZCwgYmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yLCBpdGVyYXRpb246IG51bWJlciA9IDApIHtcclxuICAgIHRoaXMuX2lzU2Nyb2xsaW5nID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmNsZWFyU2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0KCk7XHJcblxyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zO1xyXG4gICAgaWYgKCFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkeW5hbWljU2l6ZSA9IHRoaXMuZHluYW1pY1NpemUsIGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lciwgaXRlbVNpemUgPSB0aGlzLml0ZW1TaXplO1xyXG4gICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTCwgdGhpcy5fb25TY3JvbGxIYW5kbGVyKTtcclxuICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25TY3JvbGxFbmRIYW5kbGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5fJGJvdW5kcy5nZXRWYWx1ZSgpIHx8IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9LFxyXG4gICAgICAgICAgc3RpY2t5TWFwID0gdGhpcy5zdGlja3lNYXAsIGl0ZW1zID0gdGhpcy5pdGVtcywgaXNWZXJ0aWNhbCA9IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgICAgICBvcHRzOiBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJVmlydHVhbExpc3RJdGVtLCBJVmlydHVhbExpc3RDb2xsZWN0aW9uPiA9IHtcclxuICAgICAgICAgICAgYm91bmRzOiB7IHdpZHRoLCBoZWlnaHQgfSwgY29sbGVjdGlvbjogaXRlbXMsIGR5bmFtaWNTaXplLCBpc1ZlcnRpY2FsOiB0aGlzLl9pc1ZlcnRpY2FsLCBpdGVtU2l6ZSxcclxuICAgICAgICAgICAgaXRlbXNPZmZzZXQ6IHRoaXMuaXRlbXNPZmZzZXQsIHNjcm9sbFNpemU6IGlzVmVydGljYWwgPyBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgOiBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0LFxyXG4gICAgICAgICAgICBzbmFwOiB0aGlzLnNuYXAsIGZyb21JdGVtSWQ6IGlkLCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uOiB0aGlzLmVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2Nyb2xsU2l6ZSA9IHRoaXMuX3RyYWNrQm94LmdldEl0ZW1Qb3NpdGlvbihpZCwgc3RpY2t5TWFwLCBvcHRzKSxcclxuICAgICAgICAgIHBhcmFtczogU2Nyb2xsVG9PcHRpb25zID0geyBbaXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IHNjcm9sbFNpemUsIGJlaGF2aW9yIH07XHJcblxyXG4gICAgICAgIHRoaXMuXyRzY3JvbGxTaXplLm5leHQoc2Nyb2xsU2l6ZSk7XHJcblxyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIGhhbmRsZXIpO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCB7IGRpc3BsYXlJdGVtcywgdG90YWxTaXplIH0gPSB0aGlzLl90cmFja0JveC51cGRhdGVDb2xsZWN0aW9uKGl0ZW1zLCBzdGlja3lNYXAsIHtcclxuICAgICAgICAgICAgICAgIC4uLm9wdHMsIHNjcm9sbFNpemUsIGZyb21JdGVtSWQ6IGlkLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnJlc2V0Qm91bmRzU2l6ZShpc1ZlcnRpY2FsLCB0b3RhbFNpemUpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURpc3BsYXlDb21wb25lbnRzSWZOZWVkKGRpc3BsYXlJdGVtcyk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMudHJhY2tpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgX3Njcm9sbFNpemUgPSB0aGlzLl90cmFja0JveC5nZXRJdGVtUG9zaXRpb24oaWQsIHN0aWNreU1hcCwgeyAuLi5vcHRzLCBzY3JvbGxTaXplLCBmcm9tSXRlbUlkOiBpZCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHNjcm9sbFNpemUgPCBfc2Nyb2xsU2l6ZSAmJiBpdGVyYXRpb24gPCBNQVhfU0NST0xMX1RPX0lURVJBVElPTlMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvRXhlY3V0b3IoaWQsIEJFSEFWSU9SX0lOU1RBTlQgYXMgU2Nyb2xsQmVoYXZpb3IsIGl0ZXJhdGlvbiArIDEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxTaXplLm5leHQoc2Nyb2xsU2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTEwsIHRoaXMuX29uU2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIGhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG8ocGFyYW1zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IGlkKSwgc2Nyb2xsU2l6ZSA9IGluZGV4ICogdGhpcy5pdGVtU2l6ZTtcclxuICAgICAgICBjb25zdCBwYXJhbXM6IFNjcm9sbFRvT3B0aW9ucyA9IHsgW3RoaXMuX2lzVmVydGljYWwgPyBUT1BfUFJPUF9OQU1FIDogTEVGVF9QUk9QX05BTUVdOiBzY3JvbGxTaXplLCBiZWhhdmlvciB9O1xyXG4gICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvKHBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNjcm9sbFRvRW5kKGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9IEJFSEFWSU9SX0lOU1RBTlQgYXMgU2Nyb2xsQmVoYXZpb3IpIHtcclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcywgbGF0SXRlbSA9IGl0ZW1zW2l0ZW1zLmxlbmd0aCA+IDAgPyBpdGVtcy5sZW5ndGggLSAxIDogMF07XHJcbiAgICB0aGlzLnNjcm9sbFRvKGxhdEl0ZW0uaWQsIGJlaGF2aW9yKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uQ29udGFpbmVyU2Nyb2xsSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgdGhpcy5faXNTY3JvbGxpbmcgPSB0cnVlO1xyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5fY29udGFpbmVyO1xyXG4gICAgaWYgKGNvbnRhaW5lckVsKSB7XHJcbiAgICAgIGNvbnN0IHNjcm9sbFNpemUgPSAodGhpcy5faXNWZXJ0aWNhbCA/IGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIDogY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0KTtcclxuICAgICAgdGhpcy5fdHJhY2tCb3guZGVsdGFEaXJlY3Rpb24gPSB0aGlzLl8kc2Nyb2xsU2l6ZS5nZXRWYWx1ZSgpID4gc2Nyb2xsU2l6ZSA/IC0xIDogdGhpcy5fJHNjcm9sbFNpemUuZ2V0VmFsdWUoKSA8IHNjcm9sbFNpemUgPyAxIDogMDtcclxuXHJcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFNjcm9sbEV2ZW50KHtcclxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuX3RyYWNrQm94LnNjcm9sbERpcmVjdGlvbiwgY29udGFpbmVyOiBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgIGxpc3Q6IHRoaXMuX2xpc3QhLm5hdGl2ZUVsZW1lbnQsIGRlbHRhOiB0aGlzLl90cmFja0JveC5kZWx0YSxcclxuICAgICAgICBzY3JvbGxEZWx0YTogdGhpcy5fdHJhY2tCb3guc2Nyb2xsRGVsdGEsIGlzVmVydGljYWw6IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5vblNjcm9sbC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uQ29udGFpbmVyU2Nyb2xsRW5kSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgdGhpcy5faXNTY3JvbGxpbmdEZWJvdW5jZXMuZXhlY3V0ZShmYWxzZSk7XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLl9jb250YWluZXI7XHJcbiAgICBpZiAoY29udGFpbmVyRWwpIHtcclxuICAgICAgY29uc3Qgc2Nyb2xsU2l6ZSA9ICh0aGlzLl9pc1ZlcnRpY2FsID8gY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgOiBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQpO1xyXG4gICAgICB0aGlzLl90cmFja0JveC5kZWx0YURpcmVjdGlvbiA9IHRoaXMuXyRzY3JvbGxTaXplLmdldFZhbHVlKCkgPiBzY3JvbGxTaXplID8gLTEgOiAwO1xyXG5cclxuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgU2Nyb2xsRXZlbnQoe1xyXG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5fdHJhY2tCb3guc2Nyb2xsRGlyZWN0aW9uLCBjb250YWluZXI6IGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgbGlzdDogdGhpcy5fbGlzdCEubmF0aXZlRWxlbWVudCwgZGVsdGE6IHRoaXMuX3RyYWNrQm94LmRlbHRhLFxyXG4gICAgICAgIHNjcm9sbERlbHRhOiB0aGlzLl90cmFja0JveC5zY3JvbGxEZWx0YSwgaXNWZXJ0aWNhbDogdGhpcy5faXNWZXJ0aWNhbCxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLm9uU2Nyb2xsRW5kLmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLl9jb250YWluZXI7XHJcbiAgICBpZiAoY29udGFpbmVyRWwpIHtcclxuICAgICAgLy8gZm9yIGRpcmVjdGlvbiBjYWxjdWxhdGlvblxyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMLCB0aGlzLl9vbkNvbnRhaW5lclNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25Db250YWluZXJTY3JvbGxFbmRIYW5kbGVyKTtcclxuXHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTEwsIHRoaXMuX29uU2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9vblNjcm9sbEVuZEhhbmRsZXIpO1xyXG5cclxuICAgICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5fb25SZXNpemVIYW5kbGVyKTtcclxuICAgICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXJFbC5uYXRpdmVFbGVtZW50KTtcclxuXHJcbiAgICAgIHRoaXMuX29uUmVzaXplSGFuZGxlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGNsZWFyU2Nyb2xsSW1tZWRpYXRlbHkoKSB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XHJcbiAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgIHRoaXMuX3Njcm9sbHMuZm9yRWFjaCgoXywgaGFuZGxlcikgPT4ge1xyXG4gICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgaGFuZGxlcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2Nyb2xscy5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG5cclxuICAgIHRoaXMuY2xlYXJTY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQoKTtcclxuXHJcbiAgICB0aGlzLmNsZWFyU2Nyb2xsSW1tZWRpYXRlbHkoKTtcclxuXHJcbiAgICBpZiAodGhpcy5fdHJhY2tCb3gpIHtcclxuICAgICAgdGhpcy5fdHJhY2tCb3guZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pc1Njcm9sbGluZ0RlYm91bmNlcykge1xyXG4gICAgICB0aGlzLl9pc1Njcm9sbGluZ0RlYm91bmNlcy5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudHNSZXNpemVPYnNlcnZlcikge1xyXG4gICAgICB0aGlzLl9jb21wb25lbnRzUmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9yZXNpemVPYnNlcnZlcikge1xyXG4gICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLl9jb250YWluZXI7XHJcbiAgICBpZiAoY29udGFpbmVyRWwpIHtcclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTCwgdGhpcy5fb25TY3JvbGxIYW5kbGVyKTtcclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTEwsIHRoaXMuX29uQ29udGFpbmVyU2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9vbkNvbnRhaW5lclNjcm9sbEVuZEhhbmRsZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9kaXNwbGF5Q29tcG9uZW50cykge1xyXG4gICAgICB3aGlsZSAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGNvbXAgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5wb3AoKTtcclxuICAgICAgICBjb21wPy5kZXN0cm95KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiAjY29udGFpbmVyIHBhcnQ9XCJzY3JvbGxlclwiIGNsYXNzPVwibmd2bF9fY29udGFpbmVyXCI+XHJcbiAgPHVsICNsaXN0IHBhcnQ9XCJsaXN0XCIgY2xhc3M9XCJuZ3ZsX19saXN0XCI+XHJcbiAgICA8bmctY29udGFpbmVyICNyZW5kZXJlcnNDb250YWluZXI+PC9uZy1jb250YWluZXI+XHJcbiAgPC91bD5cclxuPC9kaXY+Il19
|