ng-cw-v12
Version:
Angular UI Component Library
175 lines • 32.2 kB
JavaScript
import { Directive, Input } from '@angular/core';
import * as i0 from "@angular/core";
export class SpinDirective {
constructor(el, renderer) {
this.el = el;
this.renderer = renderer;
/** 是否加载中 */
this._loading = false;
/** 加载类型 */
this.ncType = 'dot';
/** 加载提示 */
this.ncTip = '';
/** 加载大小 */
this.ncSize = 'default';
/** 遮罩颜色 */
this.ncMaskColor = 'rgba(0, 0, 0, 0.1)';
/** 提示颜色 */
this.ncTipColor = '#1890ff';
/** 轨道颜色 */
this.ncTrackColor = '#f3f3f3';
/** 指示器颜色 */
this.ncIndicatorColor = '#1890ff';
// 为每个实例生成唯一的动画名称
this.animationName = `ncSpin_${Math.random().toString(36).substring(2, 11)}`;
}
set ncLoading(value) {
this._loading = value !== null && value !== undefined && value !== false && value !== 'false';
}
get ncLoading() {
return this._loading;
}
ngOnChanges(changes) {
if (changes['ncLoading']) {
changes['ncLoading'].currentValue ? this.createSpinContainer() : this.removeSpinContainer();
}
}
createSpinContainer() {
const elementPosition = getComputedStyle(this.el.nativeElement).position;
if (!elementPosition || elementPosition === 'static') {
this.renderer.setStyle(this.el.nativeElement, 'position', 'relative');
}
// 创建一个div,用于包裹加载指示器和文字
this.spinContainer = this.renderer.createElement('div');
this.renderer.addClass(this.spinContainer, 'spin-container');
this.renderer.setStyle(this.spinContainer, 'position', 'absolute');
this.renderer.setStyle(this.spinContainer, 'inset', '0');
this.renderer.setStyle(this.spinContainer, 'borderRadius', 'inherit');
this.renderer.setStyle(this.spinContainer, 'zIndex', '10001');
this.renderer.setStyle(this.spinContainer, 'background-color', this.ncMaskColor);
this.renderer.setStyle(this.spinContainer, 'display', 'flex');
this.renderer.setStyle(this.spinContainer, 'flex-direction', 'column');
this.renderer.setStyle(this.spinContainer, 'justify-content', 'center');
this.renderer.setStyle(this.spinContainer, 'align-items', 'center');
// 根据类型创建不同的加载指示器
if (this.ncType === 'circle') {
this.createCircleSpinner();
}
else if (this.ncType === 'dot') {
this.createDotSpinner();
}
// 创建一个div,用于显示文字
const loadingText = this.renderer.createElement('div');
this.renderer.addClass(loadingText, 'spin-text');
this.renderer.setStyle(loadingText, 'color', this.ncTipColor);
this.renderer.setStyle(loadingText, 'margin-top', `${this.ncSize === 'small' ? '5px' : this.ncSize === 'default' ? '10px' : '15px'}`);
this.renderer.setStyle(loadingText, 'font-size', `${this.ncSize === 'small' ? '12px' : this.ncSize === 'default' ? '16px' : '20px'}`);
this.renderer.setStyle(loadingText, 'letter-spacing', `${this.ncSize === 'small' ? '0.5px' : this.ncSize === 'default' ? '1px' : '2px'}`);
this.renderer.appendChild(loadingText, this.renderer.createText(this.ncTip));
// 如果存在文字,则添加到容器中
if (this.ncTip) {
this.renderer.appendChild(this.spinContainer, loadingText);
}
// 将容器添加到元素中
this.renderer.appendChild(this.el.nativeElement, this.spinContainer);
}
createCircleSpinner() {
const spinner = this.renderer.createElement('div');
this.renderer.addClass(spinner, 'spin-spinner');
this.renderer.setStyle(spinner, 'border', `${this.ncSize === 'small' ? '2px' : this.ncSize === 'default' ? '4px' : '6px'} solid ${this.ncTrackColor}`);
this.renderer.setStyle(spinner, 'border-top', `${this.ncSize === 'small' ? '2px' : this.ncSize === 'default' ? '4px' : '6px'} solid ${this.ncIndicatorColor}`);
this.renderer.setStyle(spinner, 'border-radius', '50%');
this.renderer.setStyle(spinner, 'width', `${this.ncSize === 'small' ? '20px' : this.ncSize === 'default' ? '40px' : '60px'}`);
this.renderer.setStyle(spinner, 'height', `${this.ncSize === 'small' ? '20px' : this.ncSize === 'default' ? '40px' : '60px'}`);
this.renderer.setStyle(spinner, 'animation', `${this.animationName} 1s linear infinite`);
const keyframes = `
${this.animationName} {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`;
this.keyframesStyle = this.renderer.createElement('style');
this.renderer.appendChild(this.keyframesStyle, this.renderer.createText(keyframes));
this.renderer.appendChild(this.el.nativeElement, this.keyframesStyle);
this.renderer.appendChild(this.spinContainer, spinner);
}
createDotSpinner() {
const dotSize = this.ncSize === 'small' ? 6 : this.ncSize === 'default' ? 10 : 14;
const containerSize = this.ncSize === 'small' ? 20 : this.ncSize === 'default' ? 40 : 60;
const dotContainer = this.renderer.createElement('div');
this.renderer.addClass(dotContainer, 'dot-spinner-container');
this.renderer.setStyle(dotContainer, 'position', 'relative');
this.renderer.setStyle(dotContainer, 'width', `${containerSize}px`);
this.renderer.setStyle(dotContainer, 'height', `${containerSize}px`);
this.renderer.setStyle(dotContainer, 'animation', `${this.animationName}_rotate 1.2s infinite linear`);
// 创建4个点
for (let i = 0; i < 4; i++) {
const dot = this.renderer.createElement('div');
this.renderer.addClass(dot, 'dot-spinner-item');
this.renderer.setStyle(dot, 'position', 'absolute');
this.renderer.setStyle(dot, 'width', `${dotSize}px`);
this.renderer.setStyle(dot, 'height', `${dotSize}px`);
this.renderer.setStyle(dot, 'background-color', this.ncIndicatorColor);
this.renderer.setStyle(dot, 'border-radius', '50%');
this.renderer.setStyle(dot, 'opacity', '0.3');
this.renderer.setStyle(dot, 'animation', `${this.animationName}_move 1s infinite linear alternate`);
this.renderer.setStyle(dot, 'animation-delay', `${i * 0.4}s`);
// 设置点的位置
const angle = i * 90; // 每个点相差90度
const radian = (angle * Math.PI) / 180;
const radius = containerSize / 2 - dotSize / 2;
const x = radius * Math.cos(radian);
const y = radius * Math.sin(radian);
this.renderer.setStyle(dot, 'top', `${containerSize / 2 - dotSize / 2 + y}px`);
this.renderer.setStyle(dot, 'left', `${containerSize / 2 - dotSize / 2 + x}px`);
this.renderer.appendChild(dotContainer, dot);
}
const keyframes = `
${this.animationName}_rotate {
to { transform: rotate(360deg); }
}
${this.animationName}_move {
to { opacity: 1; }
}
`;
this.keyframesStyle = this.renderer.createElement('style');
this.renderer.appendChild(this.keyframesStyle, this.renderer.createText(keyframes));
this.renderer.appendChild(this.el.nativeElement, this.keyframesStyle);
this.renderer.appendChild(this.spinContainer, dotContainer);
}
removeSpinContainer() {
if (this.spinContainer) {
this.renderer.removeChild(this.el.nativeElement, this.spinContainer);
this.spinContainer = null;
}
if (this.keyframesStyle) {
this.renderer.removeChild(this.el.nativeElement, this.keyframesStyle);
this.keyframesStyle = null;
}
}
}
SpinDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SpinDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
SpinDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: SpinDirective, selector: "[ncSpin]", inputs: { ncLoading: "ncLoading", ncType: "ncType", ncTip: "ncTip", ncSize: "ncSize", ncMaskColor: "ncMaskColor", ncTipColor: "ncTipColor", ncTrackColor: "ncTrackColor", ncIndicatorColor: "ncIndicatorColor" }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SpinDirective, decorators: [{
type: Directive,
args: [{
selector: '[ncSpin]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncLoading: [{
type: Input
}], ncType: [{
type: Input
}], ncTip: [{
type: Input
}], ncSize: [{
type: Input
}], ncMaskColor: [{
type: Input
}], ncTipColor: [{
type: Input
}], ncTrackColor: [{
type: Input
}], ncIndicatorColor: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NwaW4vc3Bpbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUE0QixNQUFNLGVBQWUsQ0FBQzs7QUFRbEcsTUFBTSxPQUFPLGFBQWE7SUEyQnpCLFlBQW9CLEVBQWMsRUFBVSxRQUFtQjtRQUEzQyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQTFCL0QsWUFBWTtRQUNKLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFPbEMsV0FBVztRQUNGLFdBQU0sR0FBZSxLQUFLLENBQUM7UUFDcEMsV0FBVztRQUNGLFVBQUssR0FBVyxFQUFFLENBQUM7UUFDNUIsV0FBVztRQUNGLFdBQU0sR0FBZSxTQUFTLENBQUM7UUFDeEMsV0FBVztRQUNGLGdCQUFXLEdBQVcsb0JBQW9CLENBQUM7UUFDcEQsV0FBVztRQUNGLGVBQVUsR0FBVyxTQUFTLENBQUM7UUFDeEMsV0FBVztRQUNGLGlCQUFZLEdBQVcsU0FBUyxDQUFDO1FBQzFDLFlBQVk7UUFDSCxxQkFBZ0IsR0FBVyxTQUFTLENBQUM7UUFNN0MsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5RSxDQUFDO0lBM0JELElBQWEsU0FBUyxDQUFDLEtBQXVCO1FBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxLQUFLLE9BQU8sQ0FBQztJQUMvRixDQUFDO0lBQ0QsSUFBSSxTQUFT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LGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFLLENBQUM7U0FDNUI7SUFDRixDQUFDOzswR0F2S1csYUFBYTs4RkFBYixhQUFhOzJGQUFiLGFBQWE7a0JBSHpCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLFVBQVU7aUJBQ3BCO3lIQUlhLFNBQVM7c0JBQXJCLEtBQUs7Z0JBT0csTUFBTTtzQkFBZCxLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIElucHV0LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCB0eXBlIE5jVHlwZVR5cGUgPSAnY2lyY2xlJyB8ICdkb3QnO1xyXG5leHBvcnQgdHlwZSBOY1NpemVUeXBlID0gJ3NtYWxsJyB8ICdkZWZhdWx0JyB8ICdsYXJnZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuXHRzZWxlY3RvcjogJ1tuY1NwaW5dJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU3BpbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcblx0LyoqIOaYr+WQpuWKoOi9veS4rSAqL1xyXG5cdHByaXZhdGUgX2xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRASW5wdXQoKSBzZXQgbmNMb2FkaW5nKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcblx0XHR0aGlzLl9sb2FkaW5nID0gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgdmFsdWUgIT09ICdmYWxzZSc7XHJcblx0fVxyXG5cdGdldCBuY0xvYWRpbmcoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5fbG9hZGluZztcclxuXHR9XHJcblx0LyoqIOWKoOi9veexu+WeiyAqL1xyXG5cdEBJbnB1dCgpIG5jVHlwZTogTmNUeXBlVHlwZSA9ICdkb3QnO1xyXG5cdC8qKiDliqDovb3mj5DnpLogKi9cclxuXHRASW5wdXQoKSBuY1RpcDogc3RyaW5nID0gJyc7XHJcblx0LyoqIOWKoOi9veWkp+WwjyAqL1xyXG5cdEBJbnB1dCgpIG5jU2l6ZTogTmNTaXplVHlwZSA9ICdkZWZhdWx0JztcclxuXHQvKiog6YGu572p6aKc6ImyICovXHJcblx0QElucHV0KCkgbmNNYXNrQ29sb3I6IHN0cmluZyA9ICdyZ2JhKDAsIDAsIDAsIDAuMSknO1xyXG5cdC8qKiDmj5DnpLrpopzoibIgKi9cclxuXHRASW5wdXQoKSBuY1RpcENvbG9yOiBzdHJpbmcgPSAnIzE4OTBmZic7XHJcblx0LyoqIOi9qOmBk+minOiJsiAqL1xyXG5cdEBJbnB1dCgpIG5jVHJhY2tDb2xvcjogc3RyaW5nID0gJyNmM2YzZjMnO1xyXG5cdC8qKiDmjIfnpLrlmajpopzoibIgKi9cclxuXHRASW5wdXQoKSBuY0luZGljYXRvckNvbG9yOiBzdHJpbmcgPSAnIzE4OTBmZic7XHJcblx0cHJpdmF0ZSBzcGluQ29udGFpbmVyITogSFRNTEVsZW1lbnQ7XHJcblx0cHJpdmF0ZSByZWFkb25seSBhbmltYXRpb25OYW1lOiBzdHJpbmc7XHJcblx0cHJpdmF0ZSBrZXlmcmFtZXNTdHlsZSE6IEhUTUxFbGVtZW50O1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmLCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuXHRcdC8vIOS4uuavj+S4quWunuS+i+eUn+aIkOWUr+S4gOeahOWKqOeUu+WQjeensFxyXG5cdFx0dGhpcy5hbmltYXRpb25OYW1lID0gYG5jU3Bpbl8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcclxuXHR9XHJcblxyXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHRcdGlmIChjaGFuZ2VzWyduY0xvYWRpbmcnXSkge1xyXG5cdFx0XHRjaGFuZ2VzWyduY0xvYWRpbmcnXS5jdXJyZW50VmFsdWUgPyB0aGlzLmNyZWF0ZVNwaW5Db250YWluZXIoKSA6IHRoaXMucmVtb3ZlU3BpbkNvbnRhaW5lcigpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjcmVhdGVTcGluQ29udGFpbmVyKCkge1xyXG5cdFx0Y29uc3QgZWxlbWVudFBvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnBvc2l0aW9uO1xyXG5cdFx0aWYgKCFlbGVtZW50UG9zaXRpb24gfHwgZWxlbWVudFBvc2l0aW9uID09PSAnc3RhdGljJykge1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8g5Yib5bu65LiA5LiqZGl277yM55So5LqO5YyF6KO55Yqg6L295oyH56S65Zmo5ZKM5paH5a2XXHJcblx0XHR0aGlzLnNwaW5Db250YWluZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnNwaW5Db250YWluZXIsICdzcGluLWNvbnRhaW5lcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNwaW5Db250YWluZXIsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNwaW5Db250YWluZXIsICdpbnNldCcsICcwJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc3BpbkNvbnRhaW5lciwgJ2JvcmRlclJhZGl1cycsICdpbmhlcml0Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc3BpbkNvbnRhaW5lciwgJ3pJbmRleCcsICcxMDAwMScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNwaW5Db250YWluZXIsICdiYWNrZ3JvdW5kLWNvbG9yJywgdGhpcy5uY01hc2tDb2xvcik7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc3BpbkNvbnRhaW5lciwgJ2Rpc3BsYXknLCAnZmxleCcpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNwaW5Db250YWluZXIsICdmbGV4LWRpcmVjdGlvbicsICdjb2x1bW4nKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zcGluQ29udGFpbmVyLCAnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNwaW5Db250YWluZXIsICdhbGlnbi1pdGVtcycsICdjZW50ZXInKTtcclxuXHJcblx0XHQvLyDmoLnmja7nsbvlnovliJvlu7rkuI3lkIznmoTliqDovb3mjIfnpLrlmahcclxuXHRcdGlmICh0aGlzLm5jVHlwZSA9PT0gJ2NpcmNsZScpIHtcclxuXHRcdFx0dGhpcy5jcmVhdGVDaXJjbGVTcGlubmVyKCk7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMubmNUeXBlID09PSAnZG90Jykge1xyXG5cdFx0XHR0aGlzLmNyZWF0ZURvdFNwaW5uZXIoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyDliJvlu7rkuIDkuKpkaXbvvIznlKjkuo7mmL7npLrmloflrZdcclxuXHRcdGNvbnN0IGxvYWRpbmdUZXh0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MobG9hZGluZ1RleHQsICdzcGluLXRleHQnKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobG9hZGluZ1RleHQsICdjb2xvcicsIHRoaXMubmNUaXBDb2xvcik7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGxvYWRpbmdUZXh0LCAnbWFyZ2luLXRvcCcsIGAke3RoaXMubmNTaXplID09PSAnc21hbGwnID8gJzVweCcgOiB0aGlzLm5jU2l6ZSA9PT0gJ2RlZmF1bHQnID8gJzEwcHgnIDogJzE1cHgnfWApO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShsb2FkaW5nVGV4dCwgJ2ZvbnQtc2l6ZScsIGAke3RoaXMubmNTaXplID09PSAnc21hbGwnID8gJzEycHgnIDogdGhpcy5uY1NpemUgPT09ICdkZWZhdWx0JyA/ICcxNnB4JyA6ICcyMHB4J31gKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobG9hZGluZ1RleHQsICdsZXR0ZXItc3BhY2luZycsIGAke3RoaXMubmNTaXplID09PSAnc21hbGwnID8gJzAuNXB4JyA6IHRoaXMubmNTaXplID09PSAnZGVmYXVsdCcgPyAnMXB4JyA6ICcycHgnfWApO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChsb2FkaW5nVGV4dCwgdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHRoaXMubmNUaXApKTtcclxuXHJcblx0XHQvLyDlpoLmnpzlrZjlnKjmloflrZfvvIzliJnmt7vliqDliLDlrrnlmajkuK1cclxuXHRcdGlmICh0aGlzLm5jVGlwKSB7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zcGluQ29udGFpbmVyLCBsb2FkaW5nVGV4dCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8g5bCG5a655Zmo5re75Yqg5Yiw5YWD57Sg5LitXHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5zcGluQ29udGFpbmVyKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY3JlYXRlQ2lyY2xlU3Bpbm5lcigpIHtcclxuXHRcdGNvbnN0IHNwaW5uZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5hZGRDbGFzcyhzcGlubmVyLCAnc3Bpbi1zcGlubmVyJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHNwaW5uZXIsICdib3JkZXInLCBgJHt0aGlzLm5jU2l6ZSA9PT0gJ3NtYWxsJyA/ICcycHgnIDogdGhpcy5uY1NpemUgPT09ICdkZWZhdWx0JyA/ICc0cHgnIDogJzZweCd9IHNvbGlkICR7dGhpcy5uY1RyYWNrQ29sb3J9YCk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHNwaW5uZXIsICdib3JkZXItdG9wJywgYCR7dGhpcy5uY1NpemUgPT09ICdzbWFsbCcgPyAnMnB4JyA6IHRoaXMubmNTaXplID09PSAnZGVmYXVsdCcgPyAnNHB4JyA6ICc2cHgnfSBzb2xpZCAke3RoaXMubmNJbmRpY2F0b3JDb2xvcn1gKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc3Bpbm5lciwgJ2JvcmRlci1yYWRpdXMnLCAnNTAlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHNwaW5uZXIsICd3aWR0aCcsIGAke3RoaXMubmNTaXplID09PSAnc21hbGwnID8gJzIwcHgnIDogdGhpcy5uY1NpemUgPT09ICdkZWZhdWx0JyA/ICc0MHB4JyA6ICc2MHB4J31gKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc3Bpbm5lciwgJ2hlaWdodCcsIGAke3RoaXMubmNTaXplID09PSAnc21hbGwnID8gJzIwcHgnIDogdGhpcy5uY1NpemUgPT09ICdkZWZhdWx0JyA/ICc0MHB4JyA6ICc2MHB4J31gKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoc3Bpbm5lciwgJ2FuaW1hdGlvbicsIGAke3RoaXMuYW5pbWF0aW9uTmFtZX0gMXMgbGluZWFyIGluZmluaXRlYCk7XHJcblxyXG5cdFx0Y29uc3Qga2V5ZnJhbWVzID0gYFxyXG4gICAgICAgICAgICBAa2V5ZnJhbWVzICR7dGhpcy5hbmltYXRpb25OYW1lfSB7XHJcbiAgICAgICAgICAgICAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XHJcbiAgICAgICAgICAgICAgICAxMDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgYDtcclxuXHRcdHRoaXMua2V5ZnJhbWVzU3R5bGUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMua2V5ZnJhbWVzU3R5bGUsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChrZXlmcmFtZXMpKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmtleWZyYW1lc1N0eWxlKTtcclxuXHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuc3BpbkNvbnRhaW5lciwgc3Bpbm5lcik7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNyZWF0ZURvdFNwaW5uZXIoKSB7XHJcblx0XHRjb25zdCBkb3RTaXplID0gdGhpcy5uY1NpemUgPT09ICdzbWFsbCcgPyA2IDogdGhpcy5uY1NpemUgPT09ICdkZWZhdWx0JyA/IDEwIDogMTQ7XHJcblx0XHRjb25zdCBjb250YWluZXJTaXplID0gdGhpcy5uY1NpemUgPT09ICdzbWFsbCcgPyAyMCA6IHRoaXMubmNTaXplID09PSAnZGVmYXVsdCcgPyA0MCA6IDYwO1xyXG5cclxuXHRcdGNvbnN0IGRvdENvbnRhaW5lciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvdENvbnRhaW5lciwgJ2RvdC1zcGlubmVyLWNvbnRhaW5lcicpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3RDb250YWluZXIsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3RDb250YWluZXIsICd3aWR0aCcsIGAke2NvbnRhaW5lclNpemV9cHhgKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90Q29udGFpbmVyLCAnaGVpZ2h0JywgYCR7Y29udGFpbmVyU2l6ZX1weGApO1xyXG5cdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3RDb250YWluZXIsICdhbmltYXRpb24nLCBgJHt0aGlzLmFuaW1hdGlvbk5hbWV9X3JvdGF0ZSAxLjJzIGluZmluaXRlIGxpbmVhcmApO1xyXG5cclxuXHRcdC8vIOWIm+W7ujTkuKrngrlcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XHJcblx0XHRcdGNvbnN0IGRvdCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoZG90LCAnZG90LXNwaW5uZXItaXRlbScpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAnd2lkdGgnLCBgJHtkb3RTaXplfXB4YCk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAnaGVpZ2h0JywgYCR7ZG90U2l6ZX1weGApO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ2JhY2tncm91bmQtY29sb3InLCB0aGlzLm5jSW5kaWNhdG9yQ29sb3IpO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ2JvcmRlci1yYWRpdXMnLCAnNTAlJyk7XHJcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG90LCAnb3BhY2l0eScsICcwLjMnKTtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICdhbmltYXRpb24nLCBgJHt0aGlzLmFuaW1hdGlvbk5hbWV9X21vdmUgMXMgaW5maW5pdGUgbGluZWFyIGFsdGVybmF0ZWApO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ2FuaW1hdGlvbi1kZWxheScsIGAke2kgKiAwLjR9c2ApO1xyXG5cclxuXHRcdFx0Ly8g6K6+572u54K555qE5L2N572uXHJcblx0XHRcdGNvbnN0IGFuZ2xlID0gaSAqIDkwOyAvLyDmr4/kuKrngrnnm7jlt645MOW6plxyXG5cdFx0XHRjb25zdCByYWRpYW4gPSAoYW5nbGUgKiBNYXRoLlBJKSAvIDE4MDtcclxuXHRcdFx0Y29uc3QgcmFkaXVzID0gY29udGFpbmVyU2l6ZSAvIDIgLSBkb3RTaXplIC8gMjtcclxuXHRcdFx0Y29uc3QgeCA9IHJhZGl1cyAqIE1hdGguY29zKHJhZGlhbik7XHJcblx0XHRcdGNvbnN0IHkgPSByYWRpdXMgKiBNYXRoLnNpbihyYWRpYW4pO1xyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb3QsICd0b3AnLCBgJHtjb250YWluZXJTaXplIC8gMiAtIGRvdFNpemUgLyAyICsgeX1weGApO1xyXG5cdFx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvdCwgJ2xlZnQnLCBgJHtjb250YWluZXJTaXplIC8gMiAtIGRvdFNpemUgLyAyICsgeH1weGApO1xyXG5cclxuXHRcdFx0dGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb3RDb250YWluZXIsIGRvdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3Qga2V5ZnJhbWVzID0gYFxyXG5cdFx0XHRAa2V5ZnJhbWVzICR7dGhpcy5hbmltYXRpb25OYW1lfV9yb3RhdGUge1xyXG5cdFx0XHRcdHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfVxyXG5cdFx0XHR9XHJcblx0XHRcdEBrZXlmcmFtZXMgJHt0aGlzLmFuaW1hdGlvbk5hbWV9X21vdmUge1xyXG5cdFx0XHRcdHRvIHsgb3BhY2l0eTogMTsgfVxyXG5cdFx0XHR9XHJcblx0XHRgO1xyXG5cclxuXHRcdHRoaXMua2V5ZnJhbWVzU3R5bGUgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMua2V5ZnJhbWVzU3R5bGUsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChrZXlmcmFtZXMpKTtcclxuXHRcdHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLmtleWZyYW1lc1N0eWxlKTtcclxuXHJcblx0XHR0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuc3BpbkNvbnRhaW5lciwgZG90Q29udGFpbmVyKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgcmVtb3ZlU3BpbkNvbnRhaW5lcigpIHtcclxuXHRcdGlmICh0aGlzLnNwaW5Db250YWluZXIpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuc3BpbkNvbnRhaW5lcik7XHJcblx0XHRcdHRoaXMuc3BpbkNvbnRhaW5lciA9IG51bGwhO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRoaXMua2V5ZnJhbWVzU3R5bGUpIHtcclxuXHRcdFx0dGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMua2V5ZnJhbWVzU3R5bGUpO1xyXG5cdFx0XHR0aGlzLmtleWZyYW1lc1N0eWxlID0gbnVsbCE7XHJcblx0XHR9XHJcblx0fVxyXG59Il19