UNPKG

sa-totop

Version:

A lightweight Angular standalone component for smooth scroll-to-top functionality.

187 lines 17.8 kB
import { CommonModule, isPlatformBrowser } from '@angular/common'; import { Component, EventEmitter, Inject, Input, Output, PLATFORM_ID, } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class TotopComponent { constructor(platformId) { this.platformId = platformId; this.width = 40; this.bottom = 20; this.end = 20; this.color = '#0891b2'; this.scrollBehavior = 'smooth'; this.background = 'transparent'; this.duration = 0.3; this.visibilityHeight = 450; this.alwaysVisible = false; this.customeBtn = false; this.scrollComplete = new EventEmitter(); this.toTopClicked = new EventEmitter(); this.documentHieght = 0; this.scrollHeight = 0; this.divisionConst = 0; this.dashOffset = 310; this.screenHieght = 0; } toTop() { if (isPlatformBrowser(this.platformId)) { this.toTopClicked.emit(); window.scroll({ top: 0, left: 0, behavior: this.scrollBehavior, }); } } ngOnInit() { if (isPlatformBrowser(this.platformId)) { this.screenHieght = window.innerHeight; window.onscroll = () => { this.documentHieght = document.documentElement.scrollHeight; this.divisionConst = this.documentHieght / 310; this.scrollHeight = document.documentElement.scrollTop; let position = this.documentHieght - this.screenHieght - this.scrollHeight; this.dashOffset = position / this.divisionConst; if (this.documentHieght - 1000 < this.scrollHeight) { this.scrollComplete.emit(); } }; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: TotopComponent, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.3", type: TotopComponent, isStandalone: true, selector: "sa-totop", inputs: { width: "width", bottom: "bottom", end: "end", color: "color", scrollBehavior: "scrollBehavior", background: "background", duration: "duration", visibilityHeight: "visibilityHeight", alwaysVisible: "alwaysVisible", customeBtn: "customeBtn" }, outputs: { scrollComplete: "scrollComplete", toTopClicked: "toTopClicked" }, ngImport: i0, template: ` <div (click)="toTop()" [style]=" '--width:' + width + 'px;' + '--animation-time:' + duration + 's;' + '--color:' + color + ';--background:' + background + ';--bottom:' + bottom + 'px' + ';--end:' + end + 'px' " [ngClass]="{ hide: scrollHeight < visibilityHeight && !alwaysVisible, active: documentHieght - 1000 < scrollHeight }" > <ng-container *ngIf="!customeBtn"> <button> <svg width="100%" height="100%" viewBox="-1 -1 102 102" [style]="'--progress:' + dashOffset" > <path d="M50,1 a49,49 0 0,1 0,98 a49,49 0 0,1 0,-98"></path> </svg> <svg id="arrow" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" > <path fill="currentColor" d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z" ></path> </svg> </button> <div></div> </ng-container> <ng-content></ng-content> </div> `, isInline: true, styles: [":host{position:relative}div{position:fixed;bottom:var(--bottom);inset-inline-end:var(--end);z-index:90;transition:.5s}div button{width:var(--width);height:var(--width);border-radius:100%;overflow:hidden;aspect-ratio:1/1;position:relative;display:flex;align-items:center;justify-content:center;color:var(--color);background-color:var(--background);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:var(--animation-time)}div button:after{content:\"\";position:absolute;top:50%;left:0;transform:translate(100%,-50%) rotate(-45deg);width:calc(var(--width) * 2.2);height:calc(var(--width) / 3);transition:var(--animation-time);background:linear-gradient(288deg,white,transparent)}div button svg{position:absolute;stroke:var(--color);z-index:10;fill:none;overflow:visible;transition:var(--animation-time);stroke-width:6px;stroke-dasharray:310;stroke-dashoffset:var(--progress);stroke-linecap:round}div button #arrow{width:16px}div>div{position:absolute;width:100%;height:100%;background-color:#a1a1aa;opacity:0;transition:var(--animation-time);bottom:-25px;transform:scaleY(.1);filter:blur(10px);inset-inline-end:0px}div:hover button,div.active button{transform:translateY(-4px);background-color:var(--color);color:#fff}div:hover button:after,div.active button:after{transform:translate(100%)}div:hover button svg,div.active button svg{stroke:#fff;transform:scale(.85)}div:hover div,div.active div{opacity:.5}div.hide{transform:translateY(4rem);opacity:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: TotopComponent, decorators: [{ type: Component, args: [{ selector: 'sa-totop', standalone: true, imports: [CommonModule], template: ` <div (click)="toTop()" [style]=" '--width:' + width + 'px;' + '--animation-time:' + duration + 's;' + '--color:' + color + ';--background:' + background + ';--bottom:' + bottom + 'px' + ';--end:' + end + 'px' " [ngClass]="{ hide: scrollHeight < visibilityHeight && !alwaysVisible, active: documentHieght - 1000 < scrollHeight }" > <ng-container *ngIf="!customeBtn"> <button> <svg width="100%" height="100%" viewBox="-1 -1 102 102" [style]="'--progress:' + dashOffset" > <path d="M50,1 a49,49 0 0,1 0,98 a49,49 0 0,1 0,-98"></path> </svg> <svg id="arrow" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" > <path fill="currentColor" d="M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z" ></path> </svg> </button> <div></div> </ng-container> <ng-content></ng-content> </div> `, styles: [":host{position:relative}div{position:fixed;bottom:var(--bottom);inset-inline-end:var(--end);z-index:90;transition:.5s}div button{width:var(--width);height:var(--width);border-radius:100%;overflow:hidden;aspect-ratio:1/1;position:relative;display:flex;align-items:center;justify-content:center;color:var(--color);background-color:var(--background);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:var(--animation-time)}div button:after{content:\"\";position:absolute;top:50%;left:0;transform:translate(100%,-50%) rotate(-45deg);width:calc(var(--width) * 2.2);height:calc(var(--width) / 3);transition:var(--animation-time);background:linear-gradient(288deg,white,transparent)}div button svg{position:absolute;stroke:var(--color);z-index:10;fill:none;overflow:visible;transition:var(--animation-time);stroke-width:6px;stroke-dasharray:310;stroke-dashoffset:var(--progress);stroke-linecap:round}div button #arrow{width:16px}div>div{position:absolute;width:100%;height:100%;background-color:#a1a1aa;opacity:0;transition:var(--animation-time);bottom:-25px;transform:scaleY(.1);filter:blur(10px);inset-inline-end:0px}div:hover button,div.active button{transform:translateY(-4px);background-color:var(--color);color:#fff}div:hover button:after,div.active button:after{transform:translate(100%)}div:hover button svg,div.active button svg{stroke:#fff;transform:scale(.85)}div:hover div,div.active div{opacity:.5}div.hide{transform:translateY(4rem);opacity:0}\n"] }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }], propDecorators: { width: [{ type: Input }], bottom: [{ type: Input }], end: [{ type: Input }], color: [{ type: Input }], scrollBehavior: [{ type: Input }], background: [{ type: Input }], duration: [{ type: Input }], visibilityHeight: [{ type: Input }], alwaysVisible: [{ type: Input }], customeBtn: [{ type: Input }], scrollComplete: [{ type: Output }], toTopClicked: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG90b3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG90b3Avc3JjL2xpYi90b3RvcC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQzs7O0FBNER2QixNQUFNLE9BQU8sY0FBYztJQUN6QixZQUF5QyxVQUFrQjtRQUFsQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBRWxELFVBQUssR0FBVyxFQUFFLENBQUM7UUFDbkIsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixRQUFHLEdBQVcsRUFBRSxDQUFDO1FBQ2pCLFVBQUssR0FBVyxTQUFTLENBQUM7UUFDMUIsbUJBQWMsR0FBbUIsUUFBUSxDQUFDO1FBQzFDLGVBQVUsR0FBVyxhQUFhLENBQUM7UUFDbkMsYUFBUSxHQUFXLEdBQUcsQ0FBQztRQUN2QixxQkFBZ0IsR0FBVyxHQUFHLENBQUM7UUFDL0Isa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUMzQixtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ2pELG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLGVBQVUsR0FBVyxHQUFHLENBQUM7UUFDekIsaUJBQVksR0FBVyxDQUFDLENBQUM7SUFsQnFDLENBQUM7SUFtQi9ELEtBQUs7UUFDSCxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDWixHQUFHLEVBQUUsQ0FBQztnQkFDTixJQUFJLEVBQUUsQ0FBQztnQkFDUCxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWM7YUFDOUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDRCxRQUFRO1FBQ04sSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDdkMsTUFBTSxDQUFDLFFBQVEsR0FBRyxHQUFHLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7Z0JBQzVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3ZELElBQUksUUFBUSxHQUNWLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUM5RCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUVoRCxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQztZQUNILENBQUMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOzhHQTlDVSxjQUFjLGtCQUNMLFdBQVc7a0dBRHBCLGNBQWMsNllBdERmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtRFQsMmdEQXBEUyxZQUFZOzsyRkF1RFgsY0FBYztrQkExRDFCLFNBQVM7K0JBQ0UsVUFBVSxjQUNSLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtRFQ7OzBCQUlZLE1BQU07MkJBQUMsV0FBVzt5Q0FFdEIsS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIFBMQVRGT1JNX0lELFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzYS10b3RvcCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdlxyXG4gICAgICAoY2xpY2spPVwidG9Ub3AoKVwiXHJcbiAgICAgIFtzdHlsZV09XCJcclxuICAgICAgICAnLS13aWR0aDonICtcclxuICAgICAgICB3aWR0aCArXHJcbiAgICAgICAgJ3B4OycgK1xyXG4gICAgICAgICctLWFuaW1hdGlvbi10aW1lOicgK1xyXG4gICAgICAgIGR1cmF0aW9uICtcclxuICAgICAgICAnczsnICtcclxuICAgICAgICAnLS1jb2xvcjonICtcclxuICAgICAgICBjb2xvciArXHJcbiAgICAgICAgJzstLWJhY2tncm91bmQ6JyArXHJcbiAgICAgICAgYmFja2dyb3VuZCArXHJcbiAgICAgICAgJzstLWJvdHRvbTonICtcclxuICAgICAgICBib3R0b20gK1xyXG4gICAgICAgICdweCcgK1xyXG4gICAgICAgICc7LS1lbmQ6JyArXHJcbiAgICAgICAgZW5kICtcclxuICAgICAgICAncHgnXHJcbiAgICAgIFwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICBoaWRlOiBzY3JvbGxIZWlnaHQgPCB2aXNpYmlsaXR5SGVpZ2h0ICYmICFhbHdheXNWaXNpYmxlLFxyXG4gICAgICAgIGFjdGl2ZTogZG9jdW1lbnRIaWVnaHQgLSAxMDAwIDwgc2Nyb2xsSGVpZ2h0XHJcbiAgICAgIH1cIlxyXG4gICAgPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1c3RvbWVCdG5cIj5cclxuICAgICAgICA8YnV0dG9uPlxyXG4gICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxyXG4gICAgICAgICAgICBoZWlnaHQ9XCIxMDAlXCJcclxuICAgICAgICAgICAgdmlld0JveD1cIi0xIC0xIDEwMiAxMDJcIlxyXG4gICAgICAgICAgICBbc3R5bGVdPVwiJy0tcHJvZ3Jlc3M6JyArIGRhc2hPZmZzZXRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTUwLDEgYTQ5LDQ5IDAgMCwxIDAsOTggYTQ5LDQ5IDAgMCwxIDAsLTk4XCI+PC9wYXRoPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgIGlkPVwiYXJyb3dcIlxyXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAzODQgNTEyXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICBkPVwiTTIxNC42IDQxLjRjLTEyLjUtMTIuNS0zMi44LTEyLjUtNDUuMyAwbC0xNjAgMTYwYy0xMi41IDEyLjUtMTIuNSAzMi44IDAgNDUuM3MzMi44IDEyLjUgNDUuMyAwTDE2MCAxNDEuMlY0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJzMzItMTQuMyAzMi0zMlYxNDEuMkwzMjkuNCAyNDYuNmMxMi41IDEyLjUgMzIuOCAxMi41IDQ1LjMgMHMxMi41LTMyLjggMC00NS4zbC0xNjAtMTYwelwiXHJcbiAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZVVybDogJy4vdG90b3AuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVG90b3BDb21wb25lbnQge1xyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogb2JqZWN0KSB7fVxyXG5cclxuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyID0gNDA7XHJcbiAgQElucHV0KCkgYm90dG9tOiBudW1iZXIgPSAyMDtcclxuICBASW5wdXQoKSBlbmQ6IG51bWJlciA9IDIwO1xyXG4gIEBJbnB1dCgpIGNvbG9yOiBzdHJpbmcgPSAnIzA4OTFiMic7XHJcbiAgQElucHV0KCkgc2Nyb2xsQmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yID0gJ3Ntb290aCc7XHJcbiAgQElucHV0KCkgYmFja2dyb3VuZDogc3RyaW5nID0gJ3RyYW5zcGFyZW50JztcclxuICBASW5wdXQoKSBkdXJhdGlvbjogbnVtYmVyID0gMC4zO1xyXG4gIEBJbnB1dCgpIHZpc2liaWxpdHlIZWlnaHQ6IG51bWJlciA9IDQ1MDtcclxuICBASW5wdXQoKSBhbHdheXNWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY3VzdG9tZUJ0bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSBzY3JvbGxDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSB0b1RvcENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBkb2N1bWVudEhpZWdodDogbnVtYmVyID0gMDtcclxuICBzY3JvbGxIZWlnaHQ6IG51bWJlciA9IDA7XHJcbiAgZGl2aXNpb25Db25zdDogbnVtYmVyID0gMDtcclxuICBkYXNoT2Zmc2V0OiBudW1iZXIgPSAzMTA7XHJcbiAgc2NyZWVuSGllZ2h0OiBudW1iZXIgPSAwO1xyXG4gIHRvVG9wKCkge1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgdGhpcy50b1RvcENsaWNrZWQuZW1pdCgpO1xyXG4gICAgICB3aW5kb3cuc2Nyb2xsKHtcclxuICAgICAgICB0b3A6IDAsXHJcbiAgICAgICAgbGVmdDogMCxcclxuICAgICAgICBiZWhhdmlvcjogdGhpcy5zY3JvbGxCZWhhdmlvcixcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcclxuICAgICAgdGhpcy5zY3JlZW5IaWVnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgICAgIHdpbmRvdy5vbnNjcm9sbCA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLmRvY3VtZW50SGllZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcclxuICAgICAgICB0aGlzLmRpdmlzaW9uQ29uc3QgPSB0aGlzLmRvY3VtZW50SGllZ2h0IC8gMzEwO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgICAgICBsZXQgcG9zaXRpb24gPVxyXG4gICAgICAgICAgdGhpcy5kb2N1bWVudEhpZWdodCAtIHRoaXMuc2NyZWVuSGllZ2h0IC0gdGhpcy5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5kYXNoT2Zmc2V0ID0gcG9zaXRpb24gLyB0aGlzLmRpdmlzaW9uQ29uc3Q7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50SGllZ2h0IC0gMTAwMCA8IHRoaXMuc2Nyb2xsSGVpZ2h0KSB7XHJcbiAgICAgICAgICB0aGlzLnNjcm9sbENvbXBsZXRlLmVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==