UNPKG

ng-cw-v12

Version:

Angular UI component library

157 lines 23.7 kB
import { Component, Input, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; export class AuroraTextComponent { constructor() { /** 展示的文本内容 */ this._text = ''; /** 颜色 */ this.ncColors = ["#FF0080", "#7928CA", "#0070F3", "#38bdf8", "#a855f7", "#2dd4bf"]; /** 速度 */ this.ncSpeed = 1; this.dimensions = { width: 0, height: 0 }; this.isReady = false; this.textStyle = {}; this.maskId = `aurora-mask-${Math.random().toString(36).substring(2, 11)}`; } set ncText(value) { this._text = value; setTimeout(() => { this.start(); }); } get ncText() { return this._text; } ngOnInit() { } ngOnDestroy() { this.clear(); } start() { this.clear(); this.computeTextStyles(); this.updateDimensions(); this.startAnimation(); } clear() { if (this.animationFrameId) { cancelAnimationFrame(this.animationFrameId); } } computeTextStyles() { var _a; if ((_a = this.textContentRef) === null || _a === void 0 ? void 0 : _a.nativeElement) { const computedStyle = window.getComputedStyle(this.textContentRef.nativeElement); this.textStyle = this.extractTextStyles(computedStyle); } } updateDimensions() { var _a; if ((_a = this.svgTextRef) === null || _a === void 0 ? void 0 : _a.nativeElement) { try { const bbox = this.svgTextRef.nativeElement.getBBox(); this.dimensions = { width: Math.max(1, bbox.width), height: Math.max(1, bbox.height) }; this.isReady = true; } catch (e) { console.error('获取 SVG 元素尺寸时出错:', e); } } } startAnimation() { var _a; const canvas = (_a = this.canvasRef) === null || _a === void 0 ? void 0 : _a.nativeElement; if (!canvas) return; const ctx = canvas.getContext('2d'); if (!ctx) return; let time = 0; const baseSpeed = 0.008; const animate = () => { if (!ctx || !canvas) return; if (canvas.width !== this.dimensions.width || canvas.height !== this.dimensions.height) { canvas.width = this.dimensions.width; canvas.height = this.dimensions.height; } ctx.clearRect(0, 0, canvas.width, canvas.height); time += baseSpeed * this.ncSpeed; this.ncColors.forEach((color, i) => { const x = canvas.width * (0.5 + Math.cos(time * 0.8 + i * 1.3) * 0.4 + Math.sin(time * 0.5 + i * 0.7) * 0.2); const y = canvas.height * (0.5 + Math.sin(time * 0.7 + i * 1.5) * 0.4 + Math.cos(time * 0.6 + i * 0.8) * 0.2); const gradient = ctx.createRadialGradient(x, y, 0, x, y, canvas.width * 0.4); gradient.addColorStop(0, `${color}99`); gradient.addColorStop(0.5, `${color}33`); gradient.addColorStop(1, "#00000000"); ctx.fillStyle = gradient; ctx.fillRect(0, 0, canvas.width, canvas.height); }); this.animationFrameId = requestAnimationFrame(animate); }; animate(); } getStyleString() { let styleStr = ''; for (const [key, value] of Object.entries(this.textStyle)) { if (value) { // 将驼峰命名转换为连字符命名 const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase(); styleStr += `${cssKey}:${value};`; } } return styleStr; } // 提取文本相关样式的辅助方法 extractTextStyles(computedStyle) { return { fontSize: computedStyle.fontSize, fontFamily: computedStyle.fontFamily, fontWeight: computedStyle.fontWeight, fontStyle: computedStyle.fontStyle, letterSpacing: computedStyle.letterSpacing, lineHeight: computedStyle.lineHeight, textTransform: computedStyle.textTransform, fontVariant: computedStyle.fontVariant, fontStretch: computedStyle.fontStretch, fontFeatureSettings: computedStyle.fontFeatureSettings, textDecoration: computedStyle.textDecoration, textShadow: computedStyle.textShadow, }; } } AuroraTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AuroraTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); AuroraTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AuroraTextComponent, selector: "nc-aurora-text", inputs: { ncText: "ncText", ncColors: "ncColors", ncSpeed: "ncSpeed" }, viewQueries: [{ propertyName: "textContentRef", first: true, predicate: ["textContent"], descendants: true }, { propertyName: "svgTextRef", first: true, predicate: ["svgText"], descendants: true }, { propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], ngImport: i0, template: "<span class=\"aurora-text relative inline-block align-middle\" [style.width]=\"dimensions.width ? dimensions.width + 'px' : 'auto'\"\r\n [style.height]=\"dimensions.height ? dimensions.height + 'px' : 'auto'\">\r\n\r\n <!-- \u9690\u85CF\u7684\u6587\u672C\u7528\u4E8ESEO -->\r\n <span class=\"sr-only\">\r\n {{ncText}}\r\n </span>\r\n\r\n <!-- \u89C6\u89C9\u5360\u4F4D\u7B26 -->\r\n <span #textContent style=\"opacity: 0;display: inline-block; white-space: nowrap;\"\r\n [style.position]=\"isReady ? 'absolute' : 'relative'\" aria-hidden=\"true\">\r\n {{ncText}}\r\n </span>\r\n\r\n <div class=\"absolute inset-0\" [style.opacity]=\"isReady ? 1 : 0\" style=\"transition: opacity 0.2s ease-in;\"\r\n aria-hidden=\"true\">\r\n\r\n <svg [attr.width]=\"dimensions.width\" [attr.height]=\"dimensions.height\" class=\"absolute inset-0\">\r\n <defs>\r\n <clipPath [attr.id]=\"maskId\">\r\n <text #svgText x=\"50%\" y=\"50%\" dominant-baseline=\"middle\" text-anchor=\"middle\"\r\n [attr.style]=\"getStyleString()\">{{ncText}}</text>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <canvas #canvas [style.clip-path]=\"'url(#' + maskId + ')'\" [style.-webkit-clip-path]=\"'url(#' + maskId + ')'\"\r\n class=\"h-full w-full\">\r\n </canvas>\r\n </div>\r\n</span>", styles: [":host{display:inline-block}.relative{position:relative}.absolute{position:absolute}.inset-0{top:0;right:0;bottom:0;left:0}.inline-block{display:inline-block}.align-middle{vertical-align:middle}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.h-full{height:100%}.w-full{width:100%}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AuroraTextComponent, decorators: [{ type: Component, args: [{ selector: 'nc-aurora-text', templateUrl: './aurora-text.component.html', styleUrls: ['./aurora-text.component.less'] }] }], ctorParameters: function () { return []; }, propDecorators: { ncText: [{ type: Input }], ncColors: [{ type: Input }], ncSpeed: [{ type: Input }], textContentRef: [{ type: ViewChild, args: ['textContent'] }], svgTextRef: [{ type: ViewChild, args: ['svgText'] }], canvasRef: [{ type: ViewChild, args: ['canvas'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVyb3JhLXRleHQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9hdXJvcmEtdGV4dC9hdXJvcmEtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL2F1cm9yYS10ZXh0L2F1cm9yYS10ZXh0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFjLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQzs7QUFPM0YsTUFBTSxPQUFPLG1CQUFtQjtJQTZCOUI7UUE1QkEsY0FBYztRQUNOLFVBQUssR0FBVyxFQUFFLENBQUM7UUFXM0IsU0FBUztRQUNBLGFBQVEsR0FBYSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakcsU0FBUztRQUNBLFlBQU8sR0FBVyxDQUFDLENBQUM7UUFNN0IsZUFBVSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckMsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixjQUFTLEdBQWlDLEVBQUUsQ0FBQztRQUM3QyxXQUFNLEdBQVcsZUFBZSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUk5RCxDQUFDO0lBMUJqQixJQUNJLE1BQU0sQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJ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TzsyRkR2Qk0sbUJBQW1CO2tCQUwvQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFdBQVcsRUFBRSw4QkFBOEI7b0JBQzNDLFNBQVMsRUFBRSxDQUFDLDhCQUE4QixDQUFDO2lCQUM1QzswRUFLSyxNQUFNO3NCQURULEtBQUs7Z0JBV0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRW9CLGNBQWM7c0JBQXZDLFNBQVM7dUJBQUMsYUFBYTtnQkFDRixVQUFVO3NCQUEvQixTQUFTO3VCQUFDLFNBQVM7Z0JBQ0MsU0FBUztzQkFBN0IsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYy1hdXJvcmEtdGV4dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2F1cm9yYS10ZXh0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hdXJvcmEtdGV4dC5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXJvcmFUZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiDlsZXnpLrnmoTmlofmnKzlhoXlrrkgKi9cclxuICBwcml2YXRlIF90ZXh0OiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY1RleHQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fdGV4dCA9IHZhbHVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhcnQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXQgbmNUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGV4dDtcclxuICB9XHJcbiAgLyoqIOminOiJsiAqL1xyXG4gIEBJbnB1dCgpIG5jQ29sb3JzOiBzdHJpbmdbXSA9IFtcIiNGRjAwODBcIiwgXCIjNzkyOENBXCIsIFwiIzAwNzBGM1wiLCBcIiMzOGJkZjhcIiwgXCIjYTg1NWY3XCIsIFwiIzJkZDRiZlwiXTtcclxuICAvKiog6YCf5bqmICovXHJcbiAgQElucHV0KCkgbmNTcGVlZDogbnVtYmVyID0gMTtcclxuXHJcbiAgQFZpZXdDaGlsZCgndGV4dENvbnRlbnQnKSB0ZXh0Q29udGVudFJlZiE6IEVsZW1lbnRSZWY8SFRNTFNwYW5FbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdzdmdUZXh0Jykgc3ZnVGV4dFJlZiE6IEVsZW1lbnRSZWY8U1ZHVGV4dEVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycpIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xyXG5cclxuICBkaW1lbnNpb25zID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XHJcbiAgaXNSZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRleHRTdHlsZTogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPiA9IHt9O1xyXG4gIG1hc2tJZDogc3RyaW5nID0gYGF1cm9yYS1tYXNrLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDExKX1gO1xyXG5cclxuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lSWQ/OiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge31cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gICAgdGhpcy5jb21wdXRlVGV4dFN0eWxlcygpO1xyXG4gICAgdGhpcy51cGRhdGVEaW1lbnNpb25zKCk7XHJcbiAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCkge1xyXG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlVGV4dFN0eWxlcygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnRleHRDb250ZW50UmVmPy5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnRleHRDb250ZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICB0aGlzLnRleHRTdHlsZSA9IHRoaXMuZXh0cmFjdFRleHRTdHlsZXMoY29tcHV0ZWRTdHlsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZURpbWVuc2lvbnMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zdmdUZXh0UmVmPy5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgYmJveCA9IHRoaXMuc3ZnVGV4dFJlZi5uYXRpdmVFbGVtZW50LmdldEJCb3goKTtcclxuICAgICAgICB0aGlzLmRpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgICB3aWR0aDogTWF0aC5tYXgoMSwgYmJveC53aWR0aCksXHJcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KDEsIGJib3guaGVpZ2h0KVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ+iOt+WPliBTVkcg5YWD57Sg5bC65a+45pe25Ye66ZSZOicsIGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2FudmFzID0gdGhpcy5jYW52YXNSZWY/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWNhbnZhcykgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgaWYgKCFjdHgpIHJldHVybjtcclxuXHJcbiAgICBsZXQgdGltZSA9IDA7XHJcbiAgICBjb25zdCBiYXNlU3BlZWQgPSAwLjAwODtcclxuXHJcbiAgICBjb25zdCBhbmltYXRlID0gKCkgPT4ge1xyXG4gICAgICBpZiAoIWN0eCB8fCAhY2FudmFzKSByZXR1cm47XHJcblxyXG4gICAgICBpZiAoY2FudmFzLndpZHRoICE9PSB0aGlzLmRpbWVuc2lvbnMud2lkdGggfHxcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ICE9PSB0aGlzLmRpbWVuc2lvbnMuaGVpZ2h0KSB7XHJcbiAgICAgICAgY2FudmFzLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLndpZHRoO1xyXG4gICAgICAgIGNhbnZhcy5oZWlnaHQgPSB0aGlzLmRpbWVuc2lvbnMuaGVpZ2h0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XHJcblxyXG4gICAgICB0aW1lICs9IGJhc2VTcGVlZCAqIHRoaXMubmNTcGVlZDtcclxuXHJcbiAgICAgIHRoaXMubmNDb2xvcnMuZm9yRWFjaCgoY29sb3IsIGkpID0+IHtcclxuICAgICAgICBjb25zdCB4ID1cclxuICAgICAgICAgIGNhbnZhcy53aWR0aCAqXHJcbiAgICAgICAgICAoMC41ICtcclxuICAgICAgICAgICAgTWF0aC5jb3ModGltZSAqIDAuOCArIGkgKiAxLjMpICogMC40ICtcclxuICAgICAgICAgICAgTWF0aC5zaW4odGltZSAqIDAuNSArIGkgKiAwLjcpICogMC4yKTtcclxuICAgICAgICBjb25zdCB5ID1cclxuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgKlxyXG4gICAgICAgICAgKDAuNSArXHJcbiAgICAgICAgICAgIE1hdGguc2luKHRpbWUgKiAwLjcgKyBpICogMS41KSAqIDAuNCArXHJcbiAgICAgICAgICAgIE1hdGguY29zKHRpbWUgKiAwLjYgKyBpICogMC44KSAqIDAuMik7XHJcblxyXG4gICAgICAgIGNvbnN0IGdyYWRpZW50ID0gY3R4LmNyZWF0ZVJhZGlhbEdyYWRpZW50KFxyXG4gICAgICAgICAgeCxcclxuICAgICAgICAgIHksXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgeCxcclxuICAgICAgICAgIHksXHJcbiAgICAgICAgICBjYW52YXMud2lkdGggKiAwLjQsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDAsIGAke2NvbG9yfTk5YCk7XHJcbiAgICAgICAgZ3JhZGllbnQuYWRkQ29sb3JTdG9wKDAuNSwgYCR7Y29sb3J9MzNgKTtcclxuICAgICAgICBncmFkaWVudC5hZGRDb2xvclN0b3AoMSwgXCIjMDAwMDAwMDBcIik7XHJcblxyXG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBncmFkaWVudDtcclxuICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGFuaW1hdGUoKTtcclxuICB9XHJcblxyXG4gIGdldFN0eWxlU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgc3R5bGVTdHIgPSAnJztcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMudGV4dFN0eWxlKSkge1xyXG4gICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAvLyDlsIbpqbzls7Dlkb3lkI3ovazmjaLkuLrov57lrZfnrKblkb3lkI1cclxuICAgICAgICBjb25zdCBjc3NLZXkgPSBrZXkucmVwbGFjZSgvKFtBLVpdKS9nLCAnLSQxJykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBzdHlsZVN0ciArPSBgJHtjc3NLZXl9OiR7dmFsdWV9O2A7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdHlsZVN0cjtcclxuICB9XHJcblxyXG4gIC8vIOaPkOWPluaWh+acrOebuOWFs+agt+W8j+eahOi+heWKqeaWueazlVxyXG4gIHByaXZhdGUgZXh0cmFjdFRleHRTdHlsZXMoY29tcHV0ZWRTdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbik6IFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZm9udFNpemU6IGNvbXB1dGVkU3R5bGUuZm9udFNpemUsXHJcbiAgICAgIGZvbnRGYW1pbHk6IGNvbXB1dGVkU3R5bGUuZm9udEZhbWlseSxcclxuICAgICAgZm9udFdlaWdodDogY29tcHV0ZWRTdHlsZS5mb250V2VpZ2h0LFxyXG4gICAgICBmb250U3R5bGU6IGNvbXB1dGVkU3R5bGUuZm9udFN0eWxlLFxyXG4gICAgICBsZXR0ZXJTcGFjaW5nOiBjb21wdXRlZFN0eWxlLmxldHRlclNwYWNpbmcsXHJcbiAgICAgIGxpbmVIZWlnaHQ6IGNvbXB1dGVkU3R5bGUubGluZUhlaWdodCxcclxuICAgICAgdGV4dFRyYW5zZm9ybTogY29tcHV0ZWRTdHlsZS50ZXh0VHJhbnNmb3JtLFxyXG4gICAgICBmb250VmFyaWFudDogY29tcHV0ZWRTdHlsZS5mb250VmFyaWFudCxcclxuICAgICAgZm9udFN0cmV0Y2g6IGNvbXB1dGVkU3R5bGUuZm9udFN0cmV0Y2gsXHJcbiAgICAgIGZvbnRGZWF0dXJlU2V0dGluZ3M6IGNvbXB1dGVkU3R5bGUuZm9udEZlYXR1cmVTZXR0aW5ncyxcclxuICAgICAgdGV4dERlY29yYXRpb246IGNvbXB1dGVkU3R5bGUudGV4dERlY29yYXRpb24sXHJcbiAgICAgIHRleHRTaGFkb3c6IGNvbXB1dGVkU3R5bGUudGV4dFNoYWRvdyxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsIjxzcGFuIGNsYXNzPVwiYXVyb3JhLXRleHQgcmVsYXRpdmUgaW5saW5lLWJsb2NrIGFsaWduLW1pZGRsZVwiIFtzdHlsZS53aWR0aF09XCJkaW1lbnNpb25zLndpZHRoID8gZGltZW5zaW9ucy53aWR0aCArICdweCcgOiAnYXV0bydcIlxyXG4gICAgW3N0eWxlLmhlaWdodF09XCJkaW1lbnNpb25zLmhlaWdodCA/IGRpbWVuc2lvbnMuaGVpZ2h0ICsgJ3B4JyA6ICdhdXRvJ1wiPlxyXG5cclxuICAgIDwhLS0g6ZqQ6JeP55qE5paH5pys55So5LqOU0VPIC0tPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+XHJcbiAgICAgICAge3tuY1RleHR9fVxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDwhLS0g6KeG6KeJ5Y2g5L2N56ymIC0tPlxyXG4gICAgPHNwYW4gI3RleHRDb250ZW50IHN0eWxlPVwib3BhY2l0eTogMDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdoaXRlLXNwYWNlOiBub3dyYXA7XCJcclxuICAgICAgICBbc3R5bGUucG9zaXRpb25dPVwiaXNSZWFkeSA/ICdhYnNvbHV0ZScgOiAncmVsYXRpdmUnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAge3tuY1RleHR9fVxyXG4gICAgPC9zcGFuPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC0wXCIgW3N0eWxlLm9wYWNpdHldPVwiaXNSZWFkeSA/IDEgOiAwXCIgc3R5bGU9XCJ0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZS1pbjtcIlxyXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG5cclxuICAgICAgICA8c3ZnIFthdHRyLndpZHRoXT1cImRpbWVuc2lvbnMud2lkdGhcIiBbYXR0ci5oZWlnaHRdPVwiZGltZW5zaW9ucy5oZWlnaHRcIiBjbGFzcz1cImFic29sdXRlIGluc2V0LTBcIj5cclxuICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICA8Y2xpcFBhdGggW2F0dHIuaWRdPVwibWFza0lkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRleHQgI3N2Z1RleHQgeD1cIjUwJVwiIHk9XCI1MCVcIiBkb21pbmFudC1iYXNlbGluZT1cIm1pZGRsZVwiIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3R5bGVdPVwiZ2V0U3R5bGVTdHJpbmcoKVwiPnt7bmNUZXh0fX08L3RleHQ+XHJcbiAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxyXG4gICAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgIDxjYW52YXMgI2NhbnZhcyBbc3R5bGUuY2xpcC1wYXRoXT1cIid1cmwoIycgKyBtYXNrSWQgKyAnKSdcIiBbc3R5bGUuLXdlYmtpdC1jbGlwLXBhdGhdPVwiJ3VybCgjJyArIG1hc2tJZCArICcpJ1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaC1mdWxsIHctZnVsbFwiPlxyXG4gICAgICAgIDwvY2FudmFzPlxyXG4gICAgPC9kaXY+XHJcbjwvc3Bhbj4iXX0=