ng-cw-v12
Version:
Angular UI Component Library
252 lines (251 loc) • 36.5 kB
JavaScript
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class RibbonDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
/** 丝带内容 */
this.ncContent = '';
/** 内容颜色 */
this.ncContentColor = '#fff';
/** 大小,容器宽高较小值的百分比 */
this.ncSize = 0.3;
/** 丝带颜色,需传入十六进制颜色值 */
this.ncRibbonColor = '#ff6547';
/** 丝带位置 */
this.ncPosition = 'top-left';
// 生成唯一ID
this.uniqueId = `ribbon_${Math.random().toString(36).substring(2, 11)}`;
}
ngOnInit() {
this.createRibbonContainer();
}
createRibbonContainer() {
const elementPosition = getComputedStyle(this.el.nativeElement).position;
if (!elementPosition || elementPosition === 'static') {
this.renderer.setStyle(this.el.nativeElement, 'position', 'relative');
}
// 创建丝带容器
this.ribbonContainer = this.renderer.createElement('div');
this.renderer.addClass(this.ribbonContainer, this.uniqueId);
this.renderer.setStyle(this.ribbonContainer, 'position', 'absolute');
this.renderer.setStyle(this.ribbonContainer, 'overflow', 'hidden');
this.renderer.setStyle(this.ribbonContainer, 'display', 'flex');
this.renderer.setStyle(this.ribbonContainer, 'justify-content', 'center');
this.renderer.setStyle(this.ribbonContainer, 'align-items', 'center');
// 添加到DOM
this.renderer.appendChild(this.el.nativeElement, this.ribbonContainer);
// 初始渲染
this.updateRibbonSize();
// 使用MutationObserver监听父容器尺寸变化
this.observeParentSize();
}
updateRibbonSize() {
// 获取父容器的尺寸
const parentWidth = this.el.nativeElement.offsetWidth;
const parentHeight = this.el.nativeElement.offsetHeight;
// 如果父容器尺寸为0,延迟重试
if (parentWidth === 0 || parentHeight === 0) {
setTimeout(() => this.updateRibbonSize(), 100);
return;
}
this.ribbonSize = Math.min(parentWidth, parentHeight) * this.ncSize;
// 更新丝带容器尺寸
this.renderer.setStyle(this.ribbonContainer, 'width', `${this.ribbonSize}px`);
this.renderer.setStyle(this.ribbonContainer, 'height', `${this.ribbonSize}px`);
// 更新位置
const offset = -(this.ribbonSize * 0.06);
switch (this.ncPosition) {
case 'top-right':
this.renderer.setStyle(this.ribbonContainer, 'top', `${offset}px`);
this.renderer.setStyle(this.ribbonContainer, 'right', `${offset}px`);
break;
case 'bottom-left':
this.renderer.setStyle(this.ribbonContainer, 'bottom', `${offset}px`);
this.renderer.setStyle(this.ribbonContainer, 'left', `${offset}px`);
break;
case 'bottom-right':
this.renderer.setStyle(this.ribbonContainer, 'bottom', `${offset}px`);
this.renderer.setStyle(this.ribbonContainer, 'right', `${offset}px`);
break;
default: //top-left
this.renderer.setStyle(this.ribbonContainer, 'top', `${offset}px`);
this.renderer.setStyle(this.ribbonContainer, 'left', `${offset}px`);
break;
}
// 更新CSS样式
this.updateRibbonStyles();
}
updateRibbonStyles() {
// 根据输入的颜色计算渐变色
const mainColor = this.ncRibbonColor;
const lighterColor = this.adjustColor(this.ncRibbonColor, 45);
const darkerColor = this.adjustColor(this.ncRibbonColor, -10);
const cssText = `
.${this.uniqueId}::before {
content: '${this.ncContent}';
position: absolute;
width: 150%;
height: ${this.ribbonSize * 0.3}px;
background: linear-gradient(45deg, ${mainColor} 0%, ${lighterColor} 51%, ${darkerColor} 100%);
transform: rotate(${this.getRotationDegree()}) translateY(${-this.ribbonSize * 0.16}px) ${this.getTextRotation()};
display: flex;
align-items: center;
justify-content: center;
color: ${this.ncContentColor};
font-weight: 600;
font-size: ${Math.ceil(this.ribbonSize * 0.18)}px;
letter-spacing: 0.1em;
box-shadow: ${this.getRibbonShadow()};
}
.${this.uniqueId}::after {
content: '';
position: absolute;
width: ${this.ribbonSize * 0.1}px;
height: ${this.ribbonSize * 0.1}px;
z-index: -1;
${this.getShadowPosition()}
background: linear-gradient(45deg, ${mainColor} 0%, ${lighterColor} 51%, ${mainColor} 100%);
}
`;
// 移除旧样式(如果存在)
const oldStyle = document.querySelector(`style[data-ribbon-id="${this.uniqueId}"]`);
if (oldStyle) {
oldStyle.remove();
}
// 添加新样式
const styleElement = this.renderer.createElement('style');
this.renderer.setAttribute(styleElement, 'data-ribbon-id', this.uniqueId);
this.renderer.appendChild(styleElement, this.renderer.createText(cssText));
this.renderer.appendChild(document.head, styleElement);
}
// 添加颜色调整方法
adjustColor(color, percent) {
// 确保颜色值格式统一,移除可能存在的 # 号
const hex = color.replace(/^#/, '');
// 验证颜色值格式(6位或8位)
if (!/^[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$/.test(hex)) {
console.warn('Invalid color format. Using default color.');
return '#ff6547';
}
// 分离颜色值和透明度
const colorHex = hex.slice(0, 6);
const alpha = hex.length === 8 ? hex.slice(6, 8) : '';
const r = parseInt(colorHex.substring(0, 2), 16);
const g = parseInt(colorHex.substring(2, 4), 16);
const b = parseInt(colorHex.substring(4, 6), 16);
const adjustValue = (value) => {
const newValue = value + (value * percent / 100);
return Math.min(255, Math.max(0, Math.round(newValue)));
};
const nr = adjustValue(r);
const ng = adjustValue(g);
const nb = adjustValue(b);
// 如果原始颜色包含透明度,则在结果中也包含透明度
return `#${nr.toString(16).padStart(2, '0')}${ng.toString(16).padStart(2, '0')}${nb.toString(16).padStart(2, '0')}${alpha}`;
}
// 添加获取旋转角度的方法
getRotationDegree() {
switch (this.ncPosition) {
case 'top-right':
return '45deg';
case 'bottom-left':
return '-135deg';
case 'bottom-right':
return '135deg';
default: // top-left
return '-45deg';
}
}
// 添加获取文字旋转的方法
getTextRotation() {
switch (this.ncPosition) {
case 'bottom-left':
case 'bottom-right':
return 'rotate(180deg)';
default:
return '';
}
}
// 添加获取丝带阴影的方法
getRibbonShadow() {
switch (this.ncPosition) {
case 'bottom-left':
case 'bottom-right':
return `0 -${this.ribbonSize * 0.05}px ${this.ribbonSize * 0.1}px rgba(0, 0, 0, 0.23)`;
default:
return `0 ${this.ribbonSize * 0.05}px ${this.ribbonSize * 0.1}px rgba(0, 0, 0, 0.23)`;
}
}
// 添加获取阴影位置的方法
getShadowPosition() {
const shadowSize = this.ribbonSize * 0.9 + 'px';
const shadowColor = this.adjustColor(this.ncRibbonColor, -20);
switch (this.ncPosition) {
case 'top-right':
return `bottom: 0; right: 0; box-shadow: -${shadowSize} -${shadowSize} ${shadowColor};`;
case 'bottom-left':
return `top: 0; left: 0; box-shadow: ${shadowSize} ${shadowSize} ${shadowColor};`;
case 'bottom-right':
return `top: 0; right: 0; box-shadow: -${shadowSize} ${shadowSize} ${shadowColor};`;
default: // top-left
return `bottom: 0; left: 0; box-shadow: ${shadowSize} -${shadowSize} ${shadowColor};`;
}
}
// 监听父容器尺寸变化
observeParentSize() {
// 使用ResizeObserver监听尺寸变化(现代浏览器支持)
if (typeof ResizeObserver !== 'undefined') {
const resizeObserver = new ResizeObserver(() => {
this.updateRibbonSize();
});
resizeObserver.observe(this.el.nativeElement);
}
else {
// 降级方案:使用MutationObserver监听DOM变化
const observer = new MutationObserver(() => {
this.updateRibbonSize();
});
observer.observe(this.el.nativeElement, {
childList: true,
subtree: true,
attributes: true
});
// 额外的安全措施:定期检查尺寸变化
let lastWidth = this.el.nativeElement.offsetWidth;
let lastHeight = this.el.nativeElement.offsetHeight;
const checkSizeInterval = setInterval(() => {
const currentWidth = this.el.nativeElement.offsetWidth;
const currentHeight = this.el.nativeElement.offsetHeight;
if (currentWidth !== lastWidth || currentHeight !== lastHeight) {
lastWidth = currentWidth;
lastHeight = currentHeight;
this.updateRibbonSize();
}
}, 500);
// 组件销毁时清除定时器
this.el.nativeElement.addEventListener('DOMNodeRemoved', () => {
clearInterval(checkSizeInterval);
});
}
}
}
RibbonDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RibbonDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
RibbonDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: RibbonDirective, selector: "[ncRibbon]", inputs: { ncContent: "ncContent", ncContentColor: "ncContentColor", ncSize: "ncSize", ncRibbonColor: "ncRibbonColor", ncPosition: "ncPosition" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RibbonDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncRibbon]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncContent: [{
type: Input
}], ncContentColor: [{
type: Input
}], ncSize: [{
type: Input
}], ncRibbonColor: [{
type: Input
}], ncPosition: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmliYm9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvcmliYm9uL3JpYmJvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOztBQU9oRixNQUFNLE9BQU8sZUFBZTtJQWdCM0IsWUFBb0IsRUFBYyxFQUFVLFFBQW1CO1FBQTNDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBZi9ELFdBQVc7UUFDRixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBQ2hDLFdBQVc7UUFDRixtQkFBYyxHQUFXLE1BQU0sQ0FBQztRQUN6QyxxQkFBcUI7UUFDWixXQUFNLEdBQVcsR0FBRyxDQUFDO1FBQzlCLHNCQUFzQjtRQUNiLGtCQUFhLEdBQVcsU0FBUyxDQUFDO1FBQzNDLFdBQVc7UUFDRixlQUFVLEdBQW1CLFVBQVUsQ0FBQztRQU9oRCxTQUFTO1FBQ1QsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFFRCxRQUFRO1FBQ1AsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLHFCQUFxQjtRQUM1QixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN6RSxJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsS0FBSyxRQUFRLEVBQUU7WUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFF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QUFDO1NBQ0g7SUFDRixDQUFDOzs0R0F4UVcsZUFBZTtnR0FBZixlQUFlOzJGQUFmLGVBQWU7a0JBSDNCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFlBQVk7aUJBQ3RCO3lIQUdTLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCB0eXBlIE5jUG9zaXRpb25UeXBlID0gJ3RvcC1sZWZ0JyB8ICd0b3AtcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JyB8ICdib3R0b20tcmlnaHQnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcblx0c2VsZWN0b3I6ICdbbmNSaWJib25dJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUmliYm9uRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHQvKiog5Lid5bim5YaF5a65ICovXHJcblx0QElucHV0KCkgbmNDb250ZW50OiBzdHJpbmcgPSAnJztcclxuXHQvKiog5YaF5a656aKc6ImyICovXHJcblx0QElucHV0KCkgbmNDb250ZW50Q29sb3I6IHN0cmluZyA9ICcjZmZmJztcclxuXHQvKiog5aSn5bCP77yM5a655Zmo5a696auY6L6D5bCP5YC855qE55m+5YiG5q+UICovXHJcblx0QElucHV0KCkgbmNTaXplOiBudW1iZXIgPSAwLjM7XHJcblx0LyoqIOS4neW4puminOiJsu+8jOmcgOS8oOWFpeWNgeWFrei/m+WItuminOiJsuWAvCAqL1xyXG5cdEBJbnB1dCgpIG5jUmliYm9uQ29sb3I6IHN0cmluZyA9ICcjZmY2NTQ3JztcclxuXHQvKiog5Lid5bim5L2N572uICovXHJcblx0QElucHV0KCkgbmNQb3NpdGlvbjogTmNQb3NpdGlvblR5cGUgPSAndG9wLWxlZnQnO1xyXG5cclxuXHRwcml2YXRlIHJpYmJvbkNvbnRhaW5lciE6IEhUTUxFbGVtZW50O1xyXG5cdHByaXZhdGUgcmliYm9uU2l6ZSE6IG51bWJlcjtcclxuXHRwcml2YXRlIHVuaXF1ZUlkOiBzdHJpbmc7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xyXG5cdFx0Ly8g55Sf5oiQ5ZSv5LiASURcclxuXHRcdHRoaXMudW5pcXVlSWQgPSBgcmliYm9uXyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDExKX1gO1xyXG5cdH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLmNyZWF0ZVJpYmJvbkNvbnRhaW5lcigpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjcmVhdGVSaWJib25Db250YWluZXIoKSB7XHJcblx0XHRjb25zdCBlbGVtZW50UG9zaXRpb24gPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCkucG9zaXRpb247XHJcblx0XHRpZiAoIWVsZW1lbnRQb3NpdGlvbiB8fCBlbGVtZW50UG9zaXRpb24gPT09ICdzdGF0aWMnKSB7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDliJvlu7rkuJ3luKblrrnlmahcclxuXHRcdHRoaXMucmliYm9uQ29udGFpbmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5yaWJib25Db250YWluZXIsIHRoaXMudW5pcXVlSWQpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnZGlzcGxheScsICdmbGV4Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnJpYmJvbkNvbnRhaW5lciwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xyXG5cclxuXHRcdC8vIOa3u+WKoOWIsERPTVxyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMucmliYm9uQ29udGFpbmVyKTtcclxuXHJcblx0XHQvLyDliJ3lp4vmuLLmn5NcclxuXHRcdHRoaXMudXBkYXRlUmliYm9uU2l6ZSgpO1xyXG5cclxuXHRcdC8vIOS9v+eUqE11dGF0aW9uT2JzZXJ2ZXLnm5HlkKzniLblrrnlmajlsLrlr7jlj5jljJZcclxuXHRcdHRoaXMub2JzZXJ2ZVBhcmVudFNpemUoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdXBkYXRlUmliYm9uU2l6ZSgpIHtcclxuXHRcdC8vIOiOt+WPlueItuWuueWZqOeahOWwuuWvuFxyXG5cdFx0Y29uc3QgcGFyZW50V2lkdGggPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcblx0XHRjb25zdCBwYXJlbnRIZWlnaHQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG5cclxuXHRcdC8vIOWmguaenOeItuWuueWZqOWwuuWvuOS4ujDvvIzlu7bov5/ph43or5VcclxuXHRcdGlmIChwYXJlbnRXaWR0aCA9PT0gMCB8fCBwYXJlbnRIZWlnaHQgPT09IDApIHtcclxuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVJpYmJvblNpemUoKSwgMTAwKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucmliYm9uU2l6ZSA9IE1hdGgubWluKHBhcmVudFdpZHRoLCBwYXJlbnRIZWlnaHQpICogdGhpcy5uY1NpemU7XHJcblxyXG5cdFx0Ly8g5pu05paw5Lid5bim5a655Zmo5bC65a+4XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnd2lkdGgnLCBgJHt0aGlzLnJpYmJvblNpemV9cHhgKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdoZWlnaHQnLCBgJHt0aGlzLnJpYmJvblNpemV9cHhgKTtcclxuXHJcblx0XHQvLyDmm7TmlrDkvY3nva5cclxuXHRcdGNvbnN0IG9mZnNldCA9IC0odGhpcy5yaWJib25TaXplICogMC4wNik7XHJcblx0XHRzd2l0Y2ggKHRoaXMubmNQb3NpdGlvbikge1xyXG5cdFx0XHRjYXNlICd0b3AtcmlnaHQnOlxyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICd0b3AnLCBgJHtvZmZzZXR9cHhgKTtcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAncmlnaHQnLCBgJHtvZmZzZXR9cHhgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnYm90dG9tLWxlZnQnOlxyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdib3R0b20nLCBgJHtvZmZzZXR9cHhgKTtcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnbGVmdCcsIGAke29mZnNldH1weGApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdib3R0b20tcmlnaHQnOlxyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICdib3R0b20nLCBgJHtvZmZzZXR9cHhgKTtcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAncmlnaHQnLCBgJHtvZmZzZXR9cHhgKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDogLy90b3AtbGVmdFxyXG5cdFx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5yaWJib25Db250YWluZXIsICd0b3AnLCBgJHtvZmZzZXR9cHhgKTtcclxuXHRcdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucmliYm9uQ29udGFpbmVyLCAnbGVmdCcsIGAke29mZnNldH1weGApO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIOabtOaWsENTU+agt+W8j1xyXG5cdFx0dGhpcy51cGRhdGVSaWJib25TdHlsZXMoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdXBkYXRlUmliYm9uU3R5bGVzKCkge1xyXG5cdFx0Ly8g5qC55o2u6L6T5YWl55qE6aKc6Imy6K6h566X5riQ5Y+Y6ImyXHJcblx0XHRjb25zdCBtYWluQ29sb3IgPSB0aGlzLm5jUmliYm9uQ29sb3I7XHJcblx0XHRjb25zdCBsaWdodGVyQ29sb3IgPSB0aGlzLmFkanVzdENvbG9yKHRoaXMubmNSaWJib25Db2xvciwgNDUpO1xyXG5cdFx0Y29uc3QgZGFya2VyQ29sb3IgPSB0aGlzLmFkanVzdENvbG9yKHRoaXMubmNSaWJib25Db2xvciwgLTEwKTtcclxuXHJcblx0XHRjb25zdCBjc3NUZXh0ID0gYFxyXG5cdFx0XHQuJHt0aGlzLnVuaXF1ZUlkfTo6YmVmb3JlIHtcclxuXHRcdFx0XHRjb250ZW50OiAnJHt0aGlzLm5jQ29udGVudH0nO1xyXG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHRcdFx0XHR3aWR0aDogMTUwJTtcclxuXHRcdFx0XHRoZWlnaHQ6ICR7dGhpcy5yaWJib25TaXplICogMC4zfXB4O1xyXG5cdFx0XHRcdGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgJHttYWluQ29sb3J9IDAlLCAke2xpZ2h0ZXJDb2xvcn0gNTElLCAke2RhcmtlckNvbG9yfSAxMDAlKTtcclxuXHRcdFx0XHR0cmFuc2Zvcm06IHJvdGF0ZSgke3RoaXMuZ2V0Um90YXRpb25EZWdyZWUoKX0pIHRyYW5zbGF0ZVkoJHstdGhpcy5yaWJib25TaXplICogMC4xNn1weCkgJHt0aGlzLmdldFRleHRSb3RhdGlvbigpfTtcclxuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xyXG5cdFx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcblx0XHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcblx0XHRcdFx0Y29sb3I6ICR7dGhpcy5uY0NvbnRlbnRDb2xvcn07XHJcblx0XHRcdFx0Zm9udC13ZWlnaHQ6IDYwMDtcclxuXHRcdFx0XHRmb250LXNpemU6ICR7TWF0aC5jZWlsKHRoaXMucmliYm9uU2l6ZSAqIDAuMTgpfXB4O1xyXG5cdFx0XHRcdGxldHRlci1zcGFjaW5nOiAwLjFlbTtcclxuXHRcdFx0XHRib3gtc2hhZG93OiAke3RoaXMuZ2V0UmliYm9uU2hhZG93KCl9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQuJHt0aGlzLnVuaXF1ZUlkfTo6YWZ0ZXIge1xyXG5cdFx0XHRcdGNvbnRlbnQ6ICcnO1xyXG5cdFx0XHRcdHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuXHRcdFx0XHR3aWR0aDogJHt0aGlzLnJpYmJvblNpemUgKiAwLjF9cHg7XHJcblx0XHRcdFx0aGVpZ2h0OiAke3RoaXMucmliYm9uU2l6ZSAqIDAuMX1weDtcclxuXHRcdFx0XHR6LWluZGV4OiAtMTtcclxuXHRcdFx0XHQke3RoaXMuZ2V0U2hhZG93UG9zaXRpb24oKX1cclxuXHRcdFx0XHRiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsICR7bWFpbkNvbG9yfSAwJSwgJHtsaWdodGVyQ29sb3J9IDUxJSwgJHttYWluQ29sb3J9IDEwMCUpO1xyXG5cdFx0XHR9XHJcblx0XHRgO1xyXG5cclxuXHRcdC8vIOenu+mZpOaXp+agt+W8j++8iOWmguaenOWtmOWcqO+8iVxyXG5cdFx0Y29uc3Qgb2xkU3R5bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBzdHlsZVtkYXRhLXJpYmJvbi1pZD1cIiR7dGhpcy51bmlxdWVJZH1cIl1gKTtcclxuXHRcdGlmIChvbGRTdHlsZSkge1xyXG5cdFx0XHRvbGRTdHlsZS5yZW1vdmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDmt7vliqDmlrDmoLflvI9cclxuXHRcdGNvbnN0IHN0eWxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHN0eWxlRWxlbWVudCwgJ2RhdGEtcmliYm9uLWlkJywgdGhpcy51bmlxdWVJZCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCwgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KGNzc1RleHQpKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaGVhZCwgc3R5bGVFbGVtZW50KTtcclxuXHR9XHJcblxyXG5cdC8vIOa3u+WKoOminOiJsuiwg+aVtOaWueazlVxyXG5cdHByaXZhdGUgYWRqdXN0Q29sb3IoY29sb3I6IHN0cmluZywgcGVyY2VudDogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRcdC8vIOehruS/neminOiJsuWAvOagvOW8j+e7n+S4gO+8jOenu+mZpOWPr+iDveWtmOWcqOeahCAjIOWPt1xyXG5cdFx0Y29uc3QgaGV4ID0gY29sb3IucmVwbGFjZSgvXiMvLCAnJyk7XHJcblxyXG5cdFx0Ly8g6aqM6K+B6aKc6Imy5YC85qC85byP77yINuS9jeaIljjkvY3vvIlcclxuXHRcdGlmICghL15bMC05QS1GYS1mXXs2fShbMC05QS1GYS1mXXsyfSk/JC8udGVzdChoZXgpKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignSW52YWxpZCBjb2xvciBmb3JtYXQuIFVzaW5nIGRlZmF1bHQgY29sb3IuJyk7XHJcblx0XHRcdHJldHVybiAnI2ZmNjU0Nyc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8g5YiG56a76aKc6Imy5YC85ZKM6YCP5piO5bqmXHJcblx0XHRjb25zdCBjb2xvckhleCA9IGhleC5zbGljZSgwLCA2KTtcclxuXHRcdGNvbnN0IGFscGhhID0gaGV4Lmxlbmd0aCA9PT0gOCA/IGhleC5zbGljZSg2LCA4KSA6ICcnO1xyXG5cclxuXHRcdGNvbnN0IHIgPSBwYXJzZUludChjb2xvckhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuXHRcdGNvbnN0IGcgPSBwYXJzZUludChjb2xvckhleC5zdWJzdHJpbmcoMiwgNCksIDE2KTtcclxuXHRcdGNvbnN0IGIgPSBwYXJzZUludChjb2xvckhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcblx0XHRjb25zdCBhZGp1c3RWYWx1ZSA9ICh2YWx1ZTogbnVtYmVyKTogbnVtYmVyID0+IHtcclxuXHRcdFx0Y29uc3QgbmV3VmFsdWUgPSB2YWx1ZSArICh2YWx1ZSAqIHBlcmNlbnQgLyAxMDApO1xyXG5cdFx0XHRyZXR1cm4gTWF0aC5taW4oMjU1LCBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKG5ld1ZhbHVlKSkpO1xyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBuciA9IGFkanVzdFZhbHVlKHIpO1xyXG5cdFx0Y29uc3QgbmcgPSBhZGp1c3RWYWx1ZShnKTtcclxuXHRcdGNvbnN0IG5iID0gYWRqdXN0VmFsdWUoYik7XHJcblxyXG5cdFx0Ly8g5aaC5p6c5Y6f5aeL6aKc6Imy5YyF5ZCr6YCP5piO5bqm77yM5YiZ5Zyo57uT5p6c5Lit5Lmf5YyF5ZCr6YCP5piO5bqmXHJcblx0XHRyZXR1cm4gYCMke25yLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpfSR7bmcudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJyl9JHtuYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKX0ke2FscGhhfWA7XHJcblx0fVxyXG5cclxuXHQvLyDmt7vliqDojrflj5bml4vovazop5LluqbnmoTmlrnms5VcclxuXHRwcml2YXRlIGdldFJvdGF0aW9uRGVncmVlKCk6IHN0cmluZyB7XHJcblx0XHRzd2l0Y2ggKHRoaXMubmNQb3NpdGlvbikge1xyXG5cdFx0XHRjYXNlICd0b3AtcmlnaHQnOlxyXG5cdFx0XHRcdHJldHVybiAnNDVkZWcnO1xyXG5cdFx0XHRjYXNlICdib3R0b20tbGVmdCc6XHJcblx0XHRcdFx0cmV0dXJuICctMTM1ZGVnJztcclxuXHRcdFx0Y2FzZSAnYm90dG9tLXJpZ2h0JzpcclxuXHRcdFx0XHRyZXR1cm4gJzEzNWRlZyc7XHJcblx0XHRcdGRlZmF1bHQ6IC8vIHRvcC1sZWZ0XHJcblx0XHRcdFx0cmV0dXJuICctNDVkZWcnO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8g5re75Yqg6I635Y+W5paH5a2X5peL6L2s55qE5pa55rOVXHJcblx0cHJpdmF0ZSBnZXRUZXh0Um90YXRpb24oKTogc3RyaW5nIHtcclxuXHRcdHN3aXRjaCAodGhpcy5uY1Bvc2l0aW9uKSB7XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1sZWZ0JzpcclxuXHRcdFx0Y2FzZSAnYm90dG9tLXJpZ2h0JzpcclxuXHRcdFx0XHRyZXR1cm4gJ3JvdGF0ZSgxODBkZWcpJztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXR1cm4gJyc7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyDmt7vliqDojrflj5bkuJ3luKbpmLTlvbHnmoTmlrnms5VcclxuXHRwcml2YXRlIGdldFJpYmJvblNoYWRvdygpOiBzdHJpbmcge1xyXG5cdFx0c3dpdGNoICh0aGlzLm5jUG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAnYm90dG9tLWxlZnQnOlxyXG5cdFx0XHRjYXNlICdib3R0b20tcmlnaHQnOlxyXG5cdFx0XHRcdHJldHVybiBgMCAtJHt0aGlzLnJpYmJvblNpemUgKiAwLjA1fXB4ICR7dGhpcy5yaWJib25TaXplICogMC4xfXB4IHJnYmEoMCwgMCwgMCwgMC4yMylgO1xyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybiBgMCAke3RoaXMucmliYm9uU2l6ZSAqIDAuMDV9cHggJHt0aGlzLnJpYmJvblNpemUgKiAwLjF9cHggcmdiYSgwLCAwLCAwLCAwLjIzKWA7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyDmt7vliqDojrflj5bpmLTlvbHkvY3nva7nmoTmlrnms5VcclxuXHRwcml2YXRlIGdldFNoYWRvd1Bvc2l0aW9uKCk6IHN0cmluZyB7XHJcblx0XHRjb25zdCBzaGFkb3dTaXplID0gdGhpcy5yaWJib25TaXplICogMC45ICsgJ3B4JztcclxuXHRcdGNvbnN0IHNoYWRvd0NvbG9yID0gdGhpcy5hZGp1c3RDb2xvcih0aGlzLm5jUmliYm9uQ29sb3IsIC0yMCk7XHJcblxyXG5cdFx0c3dpdGNoICh0aGlzLm5jUG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAndG9wLXJpZ2h0JzpcclxuXHRcdFx0XHRyZXR1cm4gYGJvdHRvbTogMDsgcmlnaHQ6IDA7IGJveC1zaGFkb3c6IC0ke3NoYWRvd1NpemV9IC0ke3NoYWRvd1NpemV9ICR7c2hhZG93Q29sb3J9O2A7XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1sZWZ0JzpcclxuXHRcdFx0XHRyZXR1cm4gYHRvcDogMDsgbGVmdDogMDsgYm94LXNoYWRvdzogJHtzaGFkb3dTaXplfSAke3NoYWRvd1NpemV9ICR7c2hhZG93Q29sb3J9O2A7XHJcblx0XHRcdGNhc2UgJ2JvdHRvbS1yaWdodCc6XHJcblx0XHRcdFx0cmV0dXJuIGB0b3A6IDA7IHJpZ2h0OiAwOyBib3gtc2hhZG93OiAtJHtzaGFkb3dTaXplfSAke3NoYWRvd1NpemV9ICR7c2hhZG93Q29sb3J9O2A7XHJcblx0XHRcdGRlZmF1bHQ6IC8vIHRvcC1sZWZ0XHJcblx0XHRcdFx0cmV0dXJuIGBib3R0b206IDA7IGxlZnQ6IDA7IGJveC1zaGFkb3c6ICR7c2hhZG93U2l6ZX0gLSR7c2hhZG93U2l6ZX0gJHtzaGFkb3dDb2xvcn07YDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIOebkeWQrOeItuWuueWZqOWwuuWvuOWPmOWMllxyXG5cdHByaXZhdGUgb2JzZXJ2ZVBhcmVudFNpemUoKSB7XHJcblx0XHQvLyDkvb/nlKhSZXNpemVPYnNlcnZlcuebkeWQrOWwuuWvuOWPmOWMlu+8iOeOsOS7o+a1j+iniOWZqOaUr+aMge+8iVxyXG5cdFx0aWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdFx0Y29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMudXBkYXRlUmliYm9uU2l6ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0cmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8g6ZmN57qn5pa55qGI77ya5L2/55SoTXV0YXRpb25PYnNlcnZlcuebkeWQrERPTeWPmOWMllxyXG5cdFx0XHRjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcclxuXHRcdFx0XHR0aGlzLnVwZGF0ZVJpYmJvblNpemUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdG9ic2VydmVyLm9ic2VydmUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB7XHJcblx0XHRcdFx0Y2hpbGRMaXN0OiB0cnVlLFxyXG5cdFx0XHRcdHN1YnRyZWU6IHRydWUsXHJcblx0XHRcdFx0YXR0cmlidXRlczogdHJ1ZVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8vIOmineWklueahOWuieWFqOaOquaWve+8muWumuacn+ajgOafpeWwuuWvuOWPmOWMllxyXG5cdFx0XHRsZXQgbGFzdFdpZHRoID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG5cdFx0XHRsZXQgbGFzdEhlaWdodCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcblxyXG5cdFx0XHRjb25zdCBjaGVja1NpemVJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcclxuXHRcdFx0XHRjb25zdCBjdXJyZW50V2lkdGggPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcblx0XHRcdFx0Y29uc3QgY3VycmVudEhlaWdodCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcblxyXG5cdFx0XHRcdGlmIChjdXJyZW50V2lkdGggIT09IGxhc3RXaWR0aCB8fCBjdXJyZW50SGVpZ2h0ICE9PSBsYXN0SGVpZ2h0KSB7XHJcblx0XHRcdFx0XHRsYXN0V2lkdGggPSBjdXJyZW50V2lkdGg7XHJcblx0XHRcdFx0XHRsYXN0SGVpZ2h0ID0gY3VycmVudEhlaWdodDtcclxuXHRcdFx0XHRcdHRoaXMudXBkYXRlUmliYm9uU2l6ZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSwgNTAwKTtcclxuXHJcblx0XHRcdC8vIOe7hOS7tumUgOavgeaXtua4hemZpOWumuaXtuWZqFxyXG5cdFx0XHR0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCAoKSA9PiB7XHJcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbChjaGVja1NpemVJbnRlcnZhbCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxufSJdfQ==