tango-app-ui-analyse-trax 4.0.21 → 4.0.22
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/esm2022/lib/components/checklist-configure/checklist-configure.component.mjs +31 -4
- package/esm2022/lib/components/flags-info/drag-scroll.directive.mjs +123 -0
- package/esm2022/lib/components/flags-info/flags-info.component.mjs +131 -18
- package/esm2022/lib/tango-analyse-trax.module.mjs +5 -2
- package/fesm2022/tango-app-ui-analyse-trax.mjs +282 -20
- package/fesm2022/tango-app-ui-analyse-trax.mjs.map +1 -1
- package/lib/components/add-checklist/add-checklist.component.d.ts +1 -1
- package/lib/components/checklist-configure/checklist-configure.component.d.ts +3 -0
- package/lib/components/flags-info/drag-scroll.directive.d.ts +25 -0
- package/lib/components/flags-info/flags-info.component.d.ts +22 -1
- package/lib/tango-analyse-trax.module.d.ts +2 -1
- package/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Directive, EventEmitter, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
// Sideways scrolling by mouse for a strip whose scrollbar is hidden: a plain wheel turn scrolls it
|
|
4
|
+
// sideways (trackpads already do), and it can be dragged with the left button. At either end the
|
|
5
|
+
// wheel is handed back to the page. Listeners run outside Angular, so scrolling doesn't run change
|
|
6
|
+
// detection per frame; scrollStart fires once per burst of scrolling, inside Angular.
|
|
7
|
+
export class DragScrollDirective {
|
|
8
|
+
host;
|
|
9
|
+
zone;
|
|
10
|
+
scrollStart = new EventEmitter();
|
|
11
|
+
dragStartX = 0;
|
|
12
|
+
dragStartLeft = 0;
|
|
13
|
+
dragging = false;
|
|
14
|
+
scrolling = false;
|
|
15
|
+
scrollIdle = null;
|
|
16
|
+
constructor(host, zone) {
|
|
17
|
+
this.host = host;
|
|
18
|
+
this.zone = zone;
|
|
19
|
+
}
|
|
20
|
+
ngOnInit() {
|
|
21
|
+
const el = this.host.nativeElement;
|
|
22
|
+
this.zone.runOutsideAngular(() => {
|
|
23
|
+
el.addEventListener('wheel', this.onWheel, { passive: false });
|
|
24
|
+
el.addEventListener('pointerdown', this.onPointerDown);
|
|
25
|
+
el.addEventListener('pointerenter', this.onPointerEnter);
|
|
26
|
+
el.addEventListener('scroll', this.onScroll, { passive: true });
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
ngOnDestroy() {
|
|
30
|
+
const el = this.host.nativeElement;
|
|
31
|
+
el.removeEventListener('wheel', this.onWheel);
|
|
32
|
+
el.removeEventListener('pointerdown', this.onPointerDown);
|
|
33
|
+
el.removeEventListener('pointerenter', this.onPointerEnter);
|
|
34
|
+
el.removeEventListener('scroll', this.onScroll);
|
|
35
|
+
this.endDrag();
|
|
36
|
+
clearTimeout(this.scrollIdle);
|
|
37
|
+
}
|
|
38
|
+
get maxScroll() {
|
|
39
|
+
const el = this.host.nativeElement;
|
|
40
|
+
return el.scrollWidth - el.clientWidth;
|
|
41
|
+
}
|
|
42
|
+
// Grab cursor only while there is something to scroll to.
|
|
43
|
+
onPointerEnter = () => {
|
|
44
|
+
this.host.nativeElement.classList.toggle('drag-scroll-ready', this.maxScroll > 0);
|
|
45
|
+
};
|
|
46
|
+
onWheel = (event) => {
|
|
47
|
+
const el = this.host.nativeElement;
|
|
48
|
+
const max = this.maxScroll;
|
|
49
|
+
if (max <= 0 || event.ctrlKey || Math.abs(event.deltaX) >= Math.abs(event.deltaY)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? el.clientWidth : 1;
|
|
53
|
+
const delta = event.deltaY * unit;
|
|
54
|
+
if ((delta < 0 && el.scrollLeft <= 0) || (delta > 0 && el.scrollLeft >= max - 1)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
event.preventDefault();
|
|
58
|
+
el.scrollLeft += delta;
|
|
59
|
+
};
|
|
60
|
+
onPointerDown = (event) => {
|
|
61
|
+
if (event.pointerType !== 'mouse' || event.button !== 0 || this.maxScroll <= 0) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const el = this.host.nativeElement;
|
|
65
|
+
this.dragStartX = event.clientX;
|
|
66
|
+
this.dragStartLeft = el.scrollLeft;
|
|
67
|
+
this.dragging = false;
|
|
68
|
+
el.addEventListener('pointermove', this.onPointerMove);
|
|
69
|
+
el.addEventListener('pointerup', this.onPointerUp);
|
|
70
|
+
el.addEventListener('pointercancel', this.onPointerUp);
|
|
71
|
+
};
|
|
72
|
+
// A few pixels of slack so a plain click never nudges the strip.
|
|
73
|
+
onPointerMove = (event) => {
|
|
74
|
+
const el = this.host.nativeElement;
|
|
75
|
+
const dx = event.clientX - this.dragStartX;
|
|
76
|
+
if (!this.dragging) {
|
|
77
|
+
if (Math.abs(dx) < 4) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.dragging = true;
|
|
81
|
+
el.setPointerCapture(event.pointerId);
|
|
82
|
+
el.classList.add('drag-scroll-active');
|
|
83
|
+
}
|
|
84
|
+
el.scrollLeft = this.dragStartLeft - dx;
|
|
85
|
+
};
|
|
86
|
+
onPointerUp = (event) => {
|
|
87
|
+
const el = this.host.nativeElement;
|
|
88
|
+
if (el.hasPointerCapture(event.pointerId)) {
|
|
89
|
+
el.releasePointerCapture(event.pointerId);
|
|
90
|
+
}
|
|
91
|
+
this.endDrag();
|
|
92
|
+
};
|
|
93
|
+
endDrag() {
|
|
94
|
+
const el = this.host.nativeElement;
|
|
95
|
+
el.removeEventListener('pointermove', this.onPointerMove);
|
|
96
|
+
el.removeEventListener('pointerup', this.onPointerUp);
|
|
97
|
+
el.removeEventListener('pointercancel', this.onPointerUp);
|
|
98
|
+
el.classList.remove('drag-scroll-active');
|
|
99
|
+
this.dragging = false;
|
|
100
|
+
}
|
|
101
|
+
onScroll = () => {
|
|
102
|
+
if (!this.scrolling) {
|
|
103
|
+
this.scrolling = true;
|
|
104
|
+
if (this.scrollStart.observed) {
|
|
105
|
+
this.zone.run(() => this.scrollStart.emit());
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
clearTimeout(this.scrollIdle);
|
|
109
|
+
this.scrollIdle = setTimeout(() => (this.scrolling = false), 150);
|
|
110
|
+
};
|
|
111
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DragScrollDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
|
|
112
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: DragScrollDirective, isStandalone: true, selector: "[libDragScroll]", outputs: { scrollStart: "scrollStart" }, ngImport: i0 });
|
|
113
|
+
}
|
|
114
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DragScrollDirective, decorators: [{
|
|
115
|
+
type: Directive,
|
|
116
|
+
args: [{
|
|
117
|
+
selector: '[libDragScroll]',
|
|
118
|
+
standalone: true,
|
|
119
|
+
}]
|
|
120
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { scrollStart: [{
|
|
121
|
+
type: Output
|
|
122
|
+
}] } });
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1zY3JvbGwuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYW5hbHlzZS10cmF4L3NyYy9saWIvY29tcG9uZW50cy9mbGFncy1pbmZvL2RyYWctc2Nyb2xsLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBNkIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUV2RyxtR0FBbUc7QUFDbkcsaUdBQWlHO0FBQ2pHLG1HQUFtRztBQUNuRyxzRkFBc0Y7QUFLdEYsTUFBTSxPQUFPLG1CQUFtQjtJQVNWO0lBQXVDO0lBUmpELFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFBO0lBRXhDLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFDZCxhQUFhLEdBQUcsQ0FBQyxDQUFBO0lBQ2pCLFFBQVEsR0FBRyxLQUFLLENBQUE7SUFDaEIsU0FBUyxHQUFHLEtBQUssQ0FBQTtJQUNqQixVQUFVLEdBQVEsSUFBSSxDQUFBO0lBRTlCLFlBQW9CLElBQTZCLEVBQVUsSUFBWTtRQUFuRCxTQUFJLEdBQUosSUFBSSxDQUF5QjtRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7SUFBRyxDQUFDO0lBRTNFLFFBQVE7UUFDTixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixFQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUM5RCxFQUFFLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUN0RCxFQUFFLENBQUMsZ0JBQWdCLENBQUMsY0FB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R1UsbUJBQW1COzRGQUFuQixtQkFBbUI7OzRGQUFuQixtQkFBbUI7a0JBSi9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO29HQUVXLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBTaWRld2F5cyBzY3JvbGxpbmcgYnkgbW91c2UgZm9yIGEgc3RyaXAgd2hvc2Ugc2Nyb2xsYmFyIGlzIGhpZGRlbjogYSBwbGFpbiB3aGVlbCB0dXJuIHNjcm9sbHMgaXRcclxuLy8gc2lkZXdheXMgKHRyYWNrcGFkcyBhbHJlYWR5IGRvKSwgYW5kIGl0IGNhbiBiZSBkcmFnZ2VkIHdpdGggdGhlIGxlZnQgYnV0dG9uLiBBdCBlaXRoZXIgZW5kIHRoZVxyXG4vLyB3aGVlbCBpcyBoYW5kZWQgYmFjayB0byB0aGUgcGFnZS4gTGlzdGVuZXJzIHJ1biBvdXRzaWRlIEFuZ3VsYXIsIHNvIHNjcm9sbGluZyBkb2Vzbid0IHJ1biBjaGFuZ2VcclxuLy8gZGV0ZWN0aW9uIHBlciBmcmFtZTsgc2Nyb2xsU3RhcnQgZmlyZXMgb25jZSBwZXIgYnVyc3Qgb2Ygc2Nyb2xsaW5nLCBpbnNpZGUgQW5ndWxhci5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbGliRHJhZ1Njcm9sbF0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcmFnU2Nyb2xsRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBPdXRwdXQoKSBzY3JvbGxTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKVxyXG5cclxuICBwcml2YXRlIGRyYWdTdGFydFggPSAwXHJcbiAgcHJpdmF0ZSBkcmFnU3RhcnRMZWZ0ID0gMFxyXG4gIHByaXZhdGUgZHJhZ2dpbmcgPSBmYWxzZVxyXG4gIHByaXZhdGUgc2Nyb2xsaW5nID0gZmFsc2VcclxuICBwcml2YXRlIHNjcm9sbElkbGU6IGFueSA9IG51bGxcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudFxyXG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uV2hlZWwsIHsgcGFzc2l2ZTogZmFsc2UgfSlcclxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uUG9pbnRlckRvd24pXHJcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJlbnRlcicsIHRoaXMub25Qb2ludGVyRW50ZXIpXHJcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25TY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudFxyXG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uV2hlZWwpXHJcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25Qb2ludGVyRG93bilcclxuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJlbnRlcicsIHRoaXMub25Qb2ludGVyRW50ZXIpXHJcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uU2Nyb2xsKVxyXG4gICAgdGhpcy5lbmREcmFnKClcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbElkbGUpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBtYXhTY3JvbGwoKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGVsID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnRcclxuICAgIHJldHVybiBlbC5zY3JvbGxXaWR0aCAtIGVsLmNsaWVudFdpZHRoXHJcbiAgfVxyXG5cclxuICAvLyBHcmFiIGN1cnNvciBvbmx5IHdoaWxlIHRoZXJlIGlzIHNvbWV0aGluZyB0byBzY3JvbGwgdG8uXHJcbiAgcHJpdmF0ZSBvblBvaW50ZXJFbnRlciA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2RyYWctc2Nyb2xsLXJlYWR5JywgdGhpcy5tYXhTY3JvbGwgPiAwKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbldoZWVsID0gKGV2ZW50OiBXaGVlbEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50XHJcbiAgICBjb25zdCBtYXggPSB0aGlzLm1heFNjcm9sbFxyXG4gICAgaWYgKG1heCA8PSAwIHx8IGV2ZW50LmN0cmxLZXkgfHwgTWF0aC5hYnMoZXZlbnQuZGVsdGFYKSA+PSBNYXRoLmFicyhldmVudC5kZWx0YVkpKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgY29uc3QgdW5pdCA9IGV2ZW50LmRlbHRhTW9kZSA9PT0gMSA/IDE2IDogZXZlbnQuZGVsdGFNb2RlID09PSAyID8gZWwuY2xpZW50V2lkdGggOiAxXHJcbiAgICBjb25zdCBkZWx0YSA9IGV2ZW50LmRlbHRhWSAqIHVuaXRcclxuICAgIGlmICgoZGVsdGEgPCAwICYmIGVsLnNjcm9sbExlZnQgPD0gMCkgfHwgKGRlbHRhID4gMCAmJiBlbC5zY3JvbGxMZWZ0ID49IG1heCAtIDEpKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgZWwuc2Nyb2xsTGVmdCArPSBkZWx0YVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblBvaW50ZXJEb3duID0gKGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcclxuICAgIGlmIChldmVudC5wb2ludGVyVHlwZSAhPT0gJ21vdXNlJyB8fCBldmVudC5idXR0b24gIT09IDAgfHwgdGhpcy5tYXhTY3JvbGwgPD0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGVsID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnRcclxuICAgIHRoaXMuZHJhZ1N0YXJ0WCA9IGV2ZW50LmNsaWVudFhcclxuICAgIHRoaXMuZHJhZ1N0YXJ0TGVmdCA9IGVsLnNjcm9sbExlZnRcclxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZVxyXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpXHJcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKVxyXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHRoaXMub25Qb2ludGVyVXApXHJcbiAgfVxyXG5cclxuICAvLyBBIGZldyBwaXhlbHMgb2Ygc2xhY2sgc28gYSBwbGFpbiBjbGljayBuZXZlciBudWRnZXMgdGhlIHN0cmlwLlxyXG4gIHByaXZhdGUgb25Qb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50XHJcbiAgICBjb25zdCBkeCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLmRyYWdTdGFydFhcclxuICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xyXG4gICAgICBpZiAoTWF0aC5hYnMoZHgpIDwgNCkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlXHJcbiAgICAgIGVsLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZClcclxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnZHJhZy1zY3JvbGwtYWN0aXZlJylcclxuICAgIH1cclxuICAgIGVsLnNjcm9sbExlZnQgPSB0aGlzLmRyYWdTdGFydExlZnQgLSBkeFxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblBvaW50ZXJVcCA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50XHJcbiAgICBpZiAoZWwuaGFzUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKSkge1xyXG4gICAgICBlbC5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKVxyXG4gICAgfVxyXG4gICAgdGhpcy5lbmREcmFnKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW5kRHJhZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVsID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnRcclxuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlKVxyXG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5vblBvaW50ZXJVcClcclxuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCB0aGlzLm9uUG9pbnRlclVwKVxyXG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1zY3JvbGwtYWN0aXZlJylcclxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblNjcm9sbCA9ICgpOiB2b2lkID0+IHtcclxuICAgIGlmICghdGhpcy5zY3JvbGxpbmcpIHtcclxuICAgICAgdGhpcy5zY3JvbGxpbmcgPSB0cnVlXHJcbiAgICAgIGlmICh0aGlzLnNjcm9sbFN0YXJ0Lm9ic2VydmVkKSB7XHJcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB0aGlzLnNjcm9sbFN0YXJ0LmVtaXQoKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsSWRsZSlcclxuICAgIHRoaXMuc2Nyb2xsSWRsZSA9IHNldFRpbWVvdXQoKCkgPT4gKHRoaXMuc2Nyb2xsaW5nID0gZmFsc2UpLCAxNTApXHJcbiAgfVxyXG59XHJcbiJdfQ==
|