UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

109 lines 17.3 kB
import { Component, Input, Output, EventEmitter } from '@angular/core'; import { IconHandler } from 'ng-zorro-antd-mobile/core'; import { deleteKeyFrame, getTextWidth, getWidthHeight, insertKeyFrame } from './util'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd-mobile/core"; import * as i2 from "ng-zorro-antd-mobile/icon"; import * as i3 from "@angular/common"; export class NoticeBarComponent { get option() { return this._option; } set option(value) { Object.assign(this._option, value); this.dataProcess(); if (this._option.scrolling) { this.marqueeScroll = 'scrolling'; } else { this.marqueeScroll = 'scrolling-stop'; } } constructor(_iconHandler) { this._iconHandler = _iconHandler; this.visiable = false; this.marqueeScroll = 'scrolling'; this.style = {}; this._option = { mode: '', icon: '', action: '', content: '', fontSize: '14px', scrolling: true, marqueeProps: { loop: true, leading: 500, trailing: 8000, fps: 200, style: {} } }; this.onClick = new EventEmitter(); this._iconHandler.load(); } click() { this.onClick.emit(this._option.mode); if (this._option.mode === 'closable') { this.visiable = false; } } dataProcess() { this.visiable = true; this.style = { width: '200%' }; this._width = getTextWidth(this._option.content, this._option.fontSize); if (getWidthHeight().width < this._width) { const count = this._option.marqueeProps.loop ? 'infinite' : 1; let animationName = `noticebarmarquee_${this._width}`; this.style = { width: this._width * 2 + 'px', 'animation-name': animationName, 'animation-delay': `${this._option.marqueeProps.leading}ms`, 'animation-duration': `${(((1 / this._option.marqueeProps.fps) * this._width) / getWidthHeight().width) * 1000}s`, 'animation-iteration-count': `${count}` }; this.marqueeScroll = 'scrolling'; this.insetKeyframe(animationName); } else { this.marqueeScroll = 'scrolling-stop'; } } insetKeyframe(animationName) { insertKeyFrame(`@keyframes ${animationName} { 0% { left: 0px; } 100% { left: -${this._width}px } }`, 'notice_bar_animation_cls'); insertKeyFrame(`@-webkit-keyframes ${animationName} { 0% { left: 0px; } 100% { left: -${this._width}px } }`, 'notice_bar_animation_cls'); insertKeyFrame(`@-moz-keyframes ${animationName} { 0% { left: 0px; } 100% { left: -${this._width}px } }`, 'notice_bar_animation_cls'); insertKeyFrame(`@-o-keyframes ${animationName} { 0% { left: 0px; } 100% { left: -${this._width}px } }`, 'notice_bar_animation_cls'); } ngOnInit() { document.addEventListener('touchstart', () => { this.marqueeScroll = 'scrolling-stop'; }); document.addEventListener('touchend', () => { this.marqueeScroll = 'scrolling'; }); } ngOnDestroy() { deleteKeyFrame('notice_bar_animation_cls'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NoticeBarComponent, deps: [{ token: i1.IconHandler }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: NoticeBarComponent, selector: "NoticeBar, nzm-notice-bar", inputs: { option: "option" }, outputs: { onClick: "onClick" }, providers: [IconHandler], ngImport: i0, template: "<div role=\"alert\" *ngIf=\"visiable\" class=\"am-notice-bar\" (click)=\"click()\">\n <div *ngIf=\"option.icon !== null\" class=\"am-notice-bar-icon\">\n <ng-template [ngTemplateOutlet]=\"option.icon || voice\"></ng-template>\n </div>\n <div class=\"am-notice-bar-content\">\n <div class=\"marquee\">\n <div [ngClass]=\"marqueeScroll\" [ngStyle]=\"style\">\n <span>{{ option.content }}</span>\n <span>{{ option.content }}</span>\n </div>\n </div>\n </div>\n <div role=\"button\" *ngIf=\"option.mode && option.action !== null\" class=\"am-notice-bar-operation\">\n <ng-template *ngIf=\"option.mode === 'closable'\" [ngTemplateOutlet]=\"option.action || cross\"></ng-template>\n <ng-template *ngIf=\"option.mode === 'link'\" [ngTemplateOutlet]=\"option.action || right\"></ng-template>\n </div>\n</div>\n\n<ng-template #voice>\n <Icon [type]=\"'voice'\" [size]=\"'xxs'\"></Icon>\n</ng-template>\n<ng-template #cross>\n <Icon [type]=\"'cross'\" [size]=\"'md'\"></Icon>\n</ng-template>\n<ng-template #right>\n <Icon [type]=\"'right'\" [size]=\"'md'\"></Icon>\n</ng-template>\n", dependencies: [{ kind: "component", type: i2.IconComponent, selector: "Icon, nzm-icon", inputs: ["color", "type", "src", "size"] }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NoticeBarComponent, decorators: [{ type: Component, args: [{ selector: 'NoticeBar, nzm-notice-bar', providers: [IconHandler], template: "<div role=\"alert\" *ngIf=\"visiable\" class=\"am-notice-bar\" (click)=\"click()\">\n <div *ngIf=\"option.icon !== null\" class=\"am-notice-bar-icon\">\n <ng-template [ngTemplateOutlet]=\"option.icon || voice\"></ng-template>\n </div>\n <div class=\"am-notice-bar-content\">\n <div class=\"marquee\">\n <div [ngClass]=\"marqueeScroll\" [ngStyle]=\"style\">\n <span>{{ option.content }}</span>\n <span>{{ option.content }}</span>\n </div>\n </div>\n </div>\n <div role=\"button\" *ngIf=\"option.mode && option.action !== null\" class=\"am-notice-bar-operation\">\n <ng-template *ngIf=\"option.mode === 'closable'\" [ngTemplateOutlet]=\"option.action || cross\"></ng-template>\n <ng-template *ngIf=\"option.mode === 'link'\" [ngTemplateOutlet]=\"option.action || right\"></ng-template>\n </div>\n</div>\n\n<ng-template #voice>\n <Icon [type]=\"'voice'\" [size]=\"'xxs'\"></Icon>\n</ng-template>\n<ng-template #cross>\n <Icon [type]=\"'cross'\" [size]=\"'md'\"></Icon>\n</ng-template>\n<ng-template #right>\n <Icon [type]=\"'right'\" [size]=\"'md'\"></Icon>\n</ng-template>\n" }] }], ctorParameters: () => [{ type: i1.IconHandler }], propDecorators: { option: [{ type: Input }], onClick: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWNlLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL25vdGljZS1iYXIvbm90aWNlLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9jb21wb25lbnRzL25vdGljZS1iYXIvbm90aWNlLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sUUFBUSxDQUFDOzs7OztBQU90RixNQUFNLE9BQU8sa0JBQWtCO0lBYzdCLElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsS0FBSztRQUNkLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQztTQUNsQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztTQUN2QztJQUNILENBQUM7SUFJRCxZQUFvQixZQUF5QjtRQUF6QixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQTdCN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixrQkFBYSxHQUFHLFdBQVcsQ0FBQztRQUM1QixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRUgsWUFBTyxHQUFHO1lBQ2hCLElBQUksRUFBRSxFQUFFO1lB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QyxZQUFZLEVBQUUsR0FBRyxFQUFFO1lBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtZQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0MsQ0FBQzs4R0E1R1Usa0JBQWtCO2tHQUFsQixrQkFBa0IsbUhBRmxCLENBQUMsV0FBVyxDQUFDLDBCQ1AxQixrbUNBMkJBOzsyRkRsQmEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLDJCQUEyQixhQUUxQixDQUFDLFdBQVcsQ0FBQztnRkFpQnBCLE1BQU07c0JBRFQsS0FBSztnQkFjTixPQUFPO3NCQUROLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEljb25IYW5kbGVyIH0gZnJvbSAnbmctem9ycm8tYW50ZC1tb2JpbGUvY29yZSc7XG5pbXBvcnQgeyBkZWxldGVLZXlGcmFtZSwgZ2V0VGV4dFdpZHRoLCBnZXRXaWR0aEhlaWdodCwgaW5zZXJ0S2V5RnJhbWUgfSBmcm9tICcuL3V0aWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdOb3RpY2VCYXIsIG56bS1ub3RpY2UtYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vdGljZS1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtJY29uSGFuZGxlcl1cbn0pXG5leHBvcnQgY2xhc3MgTm90aWNlQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICB2aXNpYWJsZSA9IGZhbHNlO1xuICBtYXJxdWVlU2Nyb2xsID0gJ3Njcm9sbGluZyc7XG4gIHN0eWxlID0ge307XG4gIHByaXZhdGUgX3dpZHRoO1xuICBwcml2YXRlIF9vcHRpb24gPSB7XG4gICAgbW9kZTogJycsXG4gICAgaWNvbjogJycsXG4gICAgYWN0aW9uOiAnJyxcbiAgICBjb250ZW50OiAnJyxcbiAgICBmb250U2l6ZTogJzE0cHgnLFxuICAgIHNjcm9sbGluZzogdHJ1ZSxcbiAgICBtYXJxdWVlUHJvcHM6IHsgbG9vcDogdHJ1ZSwgbGVhZGluZzogNTAwLCB0cmFpbGluZzogODAwMCwgZnBzOiAyMDAsIHN0eWxlOiB7fSB9XG4gIH07XG4gIEBJbnB1dCgpXG4gIGdldCBvcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbjtcbiAgfVxuICBzZXQgb3B0aW9uKHZhbHVlKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9vcHRpb24sIHZhbHVlKTtcbiAgICB0aGlzLmRhdGFQcm9jZXNzKCk7XG4gICAgaWYgKHRoaXMuX29wdGlvbi5zY3JvbGxpbmcpIHtcbiAgICAgIHRoaXMubWFycXVlZVNjcm9sbCA9ICdzY3JvbGxpbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcnF1ZWVTY3JvbGwgPSAnc2Nyb2xsaW5nLXN0b3AnO1xuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25DbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfaWNvbkhhbmRsZXI6IEljb25IYW5kbGVyKSB7XG4gICAgdGhpcy5faWNvbkhhbmRsZXIubG9hZCgpO1xuICB9XG5cbiAgY2xpY2soKSB7XG4gICAgdGhpcy5vbkNsaWNrLmVtaXQodGhpcy5fb3B0aW9uLm1vZGUpO1xuICAgIGlmICh0aGlzLl9vcHRpb24ubW9kZSA9PT0gJ2Nsb3NhYmxlJykge1xuICAgICAgdGhpcy52aXNpYWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGRhdGFQcm9jZXNzKCkge1xuICAgIHRoaXMudmlzaWFibGUgPSB0cnVlO1xuICAgIHRoaXMuc3R5bGUgPSB7XG4gICAgICB3aWR0aDogJzIwMCUnXG4gICAgfTtcbiAgICB0aGlzLl93aWR0aCA9IGdldFRleHRXaWR0aCh0aGlzLl9vcHRpb24uY29udGVudCwgdGhpcy5fb3B0aW9uLmZvbnRTaXplKTtcbiAgICBpZiAoZ2V0V2lkdGhIZWlnaHQoKS53aWR0aCA8IHRoaXMuX3dpZHRoKSB7XG4gICAgICBjb25zdCBjb3VudCA9IHRoaXMuX29wdGlvbi5tYXJxdWVlUHJvcHMubG9vcCA/ICdpbmZpbml0ZScgOiAxO1xuICAgICAgbGV0IGFuaW1hdGlvbk5hbWUgPSBgbm90aWNlYmFybWFycXVlZV8ke3RoaXMuX3dpZHRofWA7XG4gICAgICB0aGlzLnN0eWxlID0ge1xuICAgICAgICB3aWR0aDogdGhpcy5fd2lkdGggKiAyICsgJ3B4JyxcbiAgICAgICAgJ2FuaW1hdGlvbi1uYW1lJzogYW5pbWF0aW9uTmFtZSxcbiAgICAgICAgJ2FuaW1hdGlvbi1kZWxheSc6IGAke3RoaXMuX29wdGlvbi5tYXJxdWVlUHJvcHMubGVhZGluZ31tc2AsXG4gICAgICAgICdhbmltYXRpb24tZHVyYXRpb24nOiBgJHsoKCgxIC8gdGhpcy5fb3B0aW9uLm1hcnF1ZWVQcm9wcy5mcHMpICogdGhpcy5fd2lkdGgpIC8gZ2V0V2lkdGhIZWlnaHQoKS53aWR0aCkgKlxuICAgICAgICAgIDEwMDB9c2AsXG4gICAgICAgICdhbmltYXRpb24taXRlcmF0aW9uLWNvdW50JzogYCR7Y291bnR9YFxuICAgICAgfTtcbiAgICAgIHRoaXMubWFycXVlZVNjcm9sbCA9ICdzY3JvbGxpbmcnO1xuICAgICAgdGhpcy5pbnNldEtleWZyYW1lKGFuaW1hdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcnF1ZWVTY3JvbGwgPSAnc2Nyb2xsaW5nLXN0b3AnO1xuICAgIH1cbiAgfVxuXG4gIGluc2V0S2V5ZnJhbWUoYW5pbWF0aW9uTmFtZSkge1xuICAgIGluc2VydEtleUZyYW1lKFxuICAgICAgYEBrZXlmcmFtZXMgJHthbmltYXRpb25OYW1lfSB7XG4gICAgICAwJSB7IGxlZnQ6IDBweDsgfVxuICAgICAgMTAwJSB7IGxlZnQ6IC0ke3RoaXMuX3dpZHRofXB4IH1cbiAgICB9YCxcbiAgICAgICdub3RpY2VfYmFyX2FuaW1hdGlvbl9jbHMnXG4gICAgKTtcbiAgICBpbnNlcnRLZXlGcmFtZShcbiAgICAgIGBALXdlYmtpdC1rZXlmcmFtZXMgJHthbmltYXRpb25OYW1lfSB7XG4gICAgICAwJSB7IGxlZnQ6IDBweDsgfVxuICAgICAgMTAwJSB7IGxlZnQ6IC0ke3RoaXMuX3dpZHRofXB4IH1cbiAgICB9YCxcbiAgICAgICdub3RpY2VfYmFyX2FuaW1hdGlvbl9jbHMnXG4gICAgKTtcbiAgICBpbnNlcnRLZXlGcmFtZShcbiAgICAgIGBALW1vei1rZXlmcmFtZXMgJHthbmltYXRpb25OYW1lfSB7XG4gICAgICAwJSB7IGxlZnQ6IDBweDsgfVxuICAgICAgMTAwJSB7IGxlZnQ6IC0ke3RoaXMuX3dpZHRofXB4IH1cbiAgICB9YCxcbiAgICAgICdub3RpY2VfYmFyX2FuaW1hdGlvbl9jbHMnXG4gICAgKTtcbiAgICBpbnNlcnRLZXlGcmFtZShcbiAgICAgIGBALW8ta2V5ZnJhbWVzICR7YW5pbWF0aW9uTmFtZX0ge1xuICAgICAgMCUgeyBsZWZ0OiAwcHg7IH1cbiAgICAgIDEwMCUgeyBsZWZ0OiAtJHt0aGlzLl93aWR0aH1weCB9XG4gICAgfWAsXG4gICAgICAnbm90aWNlX2Jhcl9hbmltYXRpb25fY2xzJ1xuICAgICk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgKCkgPT4ge1xuICAgICAgdGhpcy5tYXJxdWVlU2Nyb2xsID0gJ3Njcm9sbGluZy1zdG9wJztcbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgKCkgPT4ge1xuICAgICAgdGhpcy5tYXJxdWVlU2Nyb2xsID0gJ3Njcm9sbGluZyc7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBkZWxldGVLZXlGcmFtZSgnbm90aWNlX2Jhcl9hbmltYXRpb25fY2xzJyk7XG4gIH1cbn1cbiIsIjxkaXYgcm9sZT1cImFsZXJ0XCIgKm5nSWY9XCJ2aXNpYWJsZVwiIGNsYXNzPVwiYW0tbm90aWNlLWJhclwiIChjbGljayk9XCJjbGljaygpXCI+XG4gIDxkaXYgKm5nSWY9XCJvcHRpb24uaWNvbiAhPT0gbnVsbFwiIGNsYXNzPVwiYW0tbm90aWNlLWJhci1pY29uXCI+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbi5pY29uIHx8IHZvaWNlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJhbS1ub3RpY2UtYmFyLWNvbnRlbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWFycXVlZVwiPlxuICAgICAgPGRpdiBbbmdDbGFzc109XCJtYXJxdWVlU2Nyb2xsXCIgW25nU3R5bGVdPVwic3R5bGVcIj5cbiAgICAgICAgPHNwYW4+e3sgb3B0aW9uLmNvbnRlbnQgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuPnt7IG9wdGlvbi5jb250ZW50IH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IHJvbGU9XCJidXR0b25cIiAqbmdJZj1cIm9wdGlvbi5tb2RlICYmIG9wdGlvbi5hY3Rpb24gIT09IG51bGxcIiBjbGFzcz1cImFtLW5vdGljZS1iYXItb3BlcmF0aW9uXCI+XG4gICAgPG5nLXRlbXBsYXRlICpuZ0lmPVwib3B0aW9uLm1vZGUgPT09ICdjbG9zYWJsZSdcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb24uYWN0aW9uIHx8IGNyb3NzXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJvcHRpb24ubW9kZSA9PT0gJ2xpbmsnXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uLmFjdGlvbiB8fCByaWdodFwiPjwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdm9pY2U+XG4gIDxJY29uIFt0eXBlXT1cIid2b2ljZSdcIiBbc2l6ZV09XCIneHhzJ1wiPjwvSWNvbj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2Nyb3NzPlxuICA8SWNvbiBbdHlwZV09XCInY3Jvc3MnXCIgW3NpemVdPVwiJ21kJ1wiPjwvSWNvbj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3JpZ2h0PlxuICA8SWNvbiBbdHlwZV09XCIncmlnaHQnXCIgW3NpemVdPVwiJ21kJ1wiPjwvSWNvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=