UNPKG

ng-zorro-antd

Version:

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

189 lines 27 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { DOCUMENT, NgClass } from '@angular/common'; import { Component, EventEmitter, Input, Output, ViewChild, booleanAttribute, inject } from '@angular/core'; import { calculateColor, calculateOffset } from '../util/util'; import { GradientComponent } from './gradient.component'; import { HandlerComponent } from './handler.component'; import { PaletteComponent } from './palette.component'; import * as i0 from "@angular/core"; function getPosition(e) { const obj = 'touches' in e ? e.touches[0] : e; const scrollXOffset = document.documentElement.scrollLeft || document.body.scrollLeft || window.pageXOffset; const scrollYOffset = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset; return { pageX: obj.pageX - scrollXOffset, pageY: obj.pageY - scrollYOffset }; } export class SliderComponent { constructor(cdr) { this.cdr = cdr; this.gradientColors = []; this.direction = 'to right'; this.type = 'hue'; this.color = null; this.value = null; this.disabled = false; this.nzOnChange = new EventEmitter(); this.nzOnChangeComplete = new EventEmitter(); this.offsetValue = { x: 0, y: 0 }; this.dragRef = false; this.mouseMoveRef = () => null; this.mouseUpRef = () => null; this.document = inject(DOCUMENT); this.updateOffset = (e, direction = 'x') => { const { pageX, pageY } = getPosition(e); const { x: rectX, y: rectY, width, height } = this.containerRef?.nativeElement?.getBoundingClientRect() || { x: 0, y: 0, width: 0, height: 0 }; const { width: targetWidth, height: targetHeight } = this.transformRef?.nativeElement?.getBoundingClientRect() || { width: 0, height: 0 }; const centerOffsetX = targetWidth / 2; const centerOffsetY = targetHeight / 2; const offsetX = Math.max(0, Math.min(pageX - rectX, width)) - centerOffsetX; const offsetY = Math.max(0, Math.min(pageY - rectY, height)) - centerOffsetY; const calcOffset = { x: offsetX, y: direction === 'x' ? this.offsetValue.y : offsetY }; // Exclusion of boundary cases if ((targetWidth === 0 && targetHeight === 0) || targetWidth !== targetHeight) { return; } this.offsetValue = calcOffset; this.nzOnChange.emit(calculateColor(calcOffset, this.containerRef.nativeElement, this.transformRef.nativeElement, this.color, this.type)); this.cdr.detectChanges(); }; this.onDragMove = (e) => { e.preventDefault(); this.updateOffset(e); }; this.onDragStop = (e) => { e.preventDefault(); this.dragRef = false; this.document.removeEventListener('mousemove', this.onDragMove); this.document.removeEventListener('mouseup', this.mouseUpRef); this.document.removeEventListener('touchmove', this.mouseMoveRef); this.document.removeEventListener('touchend', this.mouseUpRef); this.mouseMoveRef = () => null; this.mouseUpRef = () => null; this.nzOnChangeComplete?.emit(this.type); }; this.onDragStart = (e) => { if (this.disabled) { return; } this.updateOffset(e); this.dragRef = true; this.document.addEventListener('mousemove', this.onDragMove); this.document.addEventListener('mouseup', this.onDragStop); this.document.addEventListener('touchmove', this.onDragMove); this.document.addEventListener('touchend', this.onDragStop); this.mouseMoveRef = this.onDragMove; this.mouseUpRef = this.onDragStop; this.cdr.markForCheck(); }; } ngOnInit() { this.document.removeEventListener('mousemove', this.mouseMoveRef); this.document.removeEventListener('mouseup', this.mouseUpRef); this.document.removeEventListener('touchmove', this.mouseMoveRef); this.document.removeEventListener('touchend', this.mouseUpRef); this.mouseMoveRef = () => null; this.mouseUpRef = () => null; } ngOnChanges(changes) { const { color } = changes; if (color) { if (!this.dragRef && this.containerRef && this.transformRef) { const calcOffset = calculateOffset(this.containerRef.nativeElement, this.transformRef.nativeElement, this.color, this.type); if (calcOffset) { this.offsetValue = calcOffset; this.cdr.detectChanges(); } } } } ngAfterViewInit() { if (!this.dragRef && this.containerRef && this.transformRef) { const calcOffset = calculateOffset(this.containerRef.nativeElement, this.transformRef.nativeElement, this.color, this.type); if (calcOffset) { this.offsetValue = calcOffset; this.cdr.detectChanges(); } } } dragStartHandle(e) { this.onDragStart(e); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: SliderComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.1", type: SliderComponent, isStandalone: true, selector: "color-slider", inputs: { gradientColors: "gradientColors", direction: "direction", type: "type", color: "color", value: "value", disabled: ["disabled", "disabled", booleanAttribute] }, outputs: { nzOnChange: "nzOnChange", nzOnChangeComplete: "nzOnChangeComplete" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["slider"], descendants: true }, { propertyName: "transformRef", first: true, predicate: ["transform"], descendants: true }], usesOnChanges: true, ngImport: i0, template: ` <div #slider (mousedown)="dragStartHandle($event)" (touchstart)="dragStartHandle($event)" class="ant-color-picker-slider" [ngClass]="'ant-color-picker-slider-' + type" > <color-palette> <div #transform class="ant-color-picker-transform" [style.left]="offsetValue.x + 'px'" [style.top]="offsetValue.y + 'px'" > <color-handler size="small" [color]="value"></color-handler> </div> <color-gradient [colors]="gradientColors" [direction]="direction" [type]="type"></color-gradient> </color-palette> </div> `, isInline: true, styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "component", type: PaletteComponent, selector: "color-palette" }, { kind: "component", type: GradientComponent, selector: "color-gradient", inputs: ["colors", "direction", "type"] }, { kind: "component", type: HandlerComponent, selector: "color-handler", inputs: ["color", "size"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: SliderComponent, decorators: [{ type: Component, args: [{ selector: 'color-slider', standalone: true, imports: [PaletteComponent, GradientComponent, HandlerComponent, NgClass], template: ` <div #slider (mousedown)="dragStartHandle($event)" (touchstart)="dragStartHandle($event)" class="ant-color-picker-slider" [ngClass]="'ant-color-picker-slider-' + type" > <color-palette> <div #transform class="ant-color-picker-transform" [style.left]="offsetValue.x + 'px'" [style.top]="offsetValue.y + 'px'" > <color-handler size="small" [color]="value"></color-handler> </div> <color-gradient [colors]="gradientColors" [direction]="direction" [type]="type"></color-gradient> </color-palette> </div> `, styles: [":host{display:block;width:100%}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { containerRef: [{ type: ViewChild, args: ['slider', { static: false }] }], transformRef: [{ type: ViewChild, args: ['transform', { static: false }] }], gradientColors: [{ type: Input }], direction: [{ type: Input }], type: [{ type: Input }], color: [{ type: Input }], value: [{ type: Input }], disabled: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzOnChange: [{ type: Output }], nzOnChangeComplete: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvY29sb3ItcGlja2VyL3NyYy9jb21wb25lbnRzL3NsaWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQU12RCxTQUFTLFdBQVcsQ0FBQyxDQUFZO0lBQy9CLE1BQU0sR0FBRyxHQUFHLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQzVHLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUM7SUFDMUcsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxH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ZUFBZSxDQUFDLENBQTBCO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQzs4R0FsRVUsZUFBZTtrR0FBZixlQUFlLHFNQVNOLGdCQUFnQix1VUF2QzFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CVCwyR0FyQlMsZ0JBQWdCLDBEQUFFLGlCQUFpQixvR0FBRSxnQkFBZ0IscUZBQUUsT0FBTzs7MkZBK0I3RCxlQUFlO2tCQW5DM0IsU0FBUzsrQkFFRSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLFlBQy9EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CVDtzRkFXdUMsWUFBWTtzQkFBbkQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNLLFlBQVk7c0JBQXRELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFaEMsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNrQyxRQUFRO3NCQUEvQyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNuQixVQUFVO3NCQUE1QixNQUFNO2dCQUNZLGtCQUFrQjtzQkFBcEMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IERPQ1VNRU5ULCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29sb3InO1xuaW1wb3J0IHsgSHNiYUNvbG9yVHlwZSwgVHJhbnNmb3JtT2Zmc2V0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90eXBlJztcbmltcG9ydCB7IGNhbGN1bGF0ZUNvbG9yLCBjYWxjdWxhdGVPZmZzZXQgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgR3JhZGllbnRDb21wb25lbnQgfSBmcm9tICcuL2dyYWRpZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBIYW5kbGVyQ29tcG9uZW50IH0gZnJvbSAnLi9oYW5kbGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYWxldHRlQ29tcG9uZW50IH0gZnJvbSAnLi9wYWxldHRlLmNvbXBvbmVudCc7XG5cbnR5cGUgRXZlbnRUeXBlID0gTW91c2VFdmVudCB8IFRvdWNoRXZlbnQ7XG5cbnR5cGUgRXZlbnRIYW5kbGUgPSAoZTogRXZlbnRUeXBlKSA9PiB2b2lkO1xuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbihlOiBFdmVudFR5cGUpOiB7IHBhZ2VYOiBudW1iZXI7IHBhZ2VZOiBudW1iZXIgfSB7XG4gIGNvbnN0IG9iaiA9ICd0b3VjaGVzJyBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcbiAgY29uc3Qgc2Nyb2xsWE9mZnNldCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCB8fCB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gIGNvbnN0IHNjcm9sbFlPZmZzZXQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgcmV0dXJuIHsgcGFnZVg6IG9iai5wYWdlWCAtIHNjcm9sbFhPZmZzZXQsIHBhZ2VZOiBvYmoucGFnZVkgLSBzY3JvbGxZT2Zmc2V0IH07XG59XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2NvbG9yLXNsaWRlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtQYWxldHRlQ29tcG9uZW50LCBHcmFkaWVudENvbXBvbmVudCwgSGFuZGxlckNvbXBvbmVudCwgTmdDbGFzc10sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI3NsaWRlclxuICAgICAgKG1vdXNlZG93bik9XCJkcmFnU3RhcnRIYW5kbGUoJGV2ZW50KVwiXG4gICAgICAodG91Y2hzdGFydCk9XCJkcmFnU3RhcnRIYW5kbGUoJGV2ZW50KVwiXG4gICAgICBjbGFzcz1cImFudC1jb2xvci1waWNrZXItc2xpZGVyXCJcbiAgICAgIFtuZ0NsYXNzXT1cIidhbnQtY29sb3ItcGlja2VyLXNsaWRlci0nICsgdHlwZVwiXG4gICAgPlxuICAgICAgPGNvbG9yLXBhbGV0dGU+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAjdHJhbnNmb3JtXG4gICAgICAgICAgY2xhc3M9XCJhbnQtY29sb3ItcGlja2VyLXRyYW5zZm9ybVwiXG4gICAgICAgICAgW3N0eWxlLmxlZnRdPVwib2Zmc2V0VmFsdWUueCArICdweCdcIlxuICAgICAgICAgIFtzdHlsZS50b3BdPVwib2Zmc2V0VmFsdWUueSArICdweCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGNvbG9yLWhhbmRsZXIgc2l6ZT1cInNtYWxsXCIgW2NvbG9yXT1cInZhbHVlXCI+PC9jb2xvci1oYW5kbGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGNvbG9yLWdyYWRpZW50IFtjb2xvcnNdPVwiZ3JhZGllbnRDb2xvcnNcIiBbZGlyZWN0aW9uXT1cImRpcmVjdGlvblwiIFt0eXBlXT1cInR5cGVcIj48L2NvbG9yLWdyYWRpZW50PlxuICAgICAgPC9jb2xvci1wYWxldHRlPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICBgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICBAVmlld0NoaWxkKCdzbGlkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgY29udGFpbmVyUmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3RyYW5zZm9ybScsIHsgc3RhdGljOiBmYWxzZSB9KSB0cmFuc2Zvcm1SZWYhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBASW5wdXQoKSBncmFkaWVudENvbG9yczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgZGlyZWN0aW9uOiBzdHJpbmcgPSAndG8gcmlnaHQnO1xuICBASW5wdXQoKSB0eXBlOiBIc2JhQ29sb3JUeXBlID0gJ2h1ZSc7XG4gIEBJbnB1dCgpIGNvbG9yOiBDb2xvciB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sb3I+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuek9uQ2hhbmdlQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPEhzYmFDb2xvclR5cGU+KCk7XG5cbiAgb2Zmc2V0VmFsdWU6IFRyYW5zZm9ybU9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICBkcmFnUmVmOiBib29sZWFuID0gZmFsc2U7XG4gIG1vdXNlTW92ZVJlZjogKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcbiAgbW91c2VVcFJlZjogKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcbiAgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW91c2VNb3ZlUmVmKTtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm1vdXNlVXBSZWYpO1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5tb3VzZU1vdmVSZWYpO1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLm1vdXNlVXBSZWYpO1xuICAgIHRoaXMubW91c2VNb3ZlUmVmID0gKCkgPT4gbnVsbDtcbiAgICB0aGlzLm1vdXNlVXBSZWYgPSAoKSA9PiBudWxsO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29sb3IgfSA9IGNoYW5nZXM7XG5cbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIGlmICghdGhpcy5kcmFnUmVmICYmIHRoaXMuY29udGFpbmVyUmVmICYmIHRoaXMudHJhbnNmb3JtUmVmKSB7XG4gICAgICAgIGNvbnN0IGNhbGNPZmZzZXQgPSBjYWxjdWxhdGVPZmZzZXQoXG4gICAgICAgICAgdGhpcy5jb250YWluZXJSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIHRoaXMuY29sb3IsXG4gICAgICAgICAgdGhpcy50eXBlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjYWxjT2Zmc2V0KSB7XG4gICAgICAgICAgdGhpcy5vZmZzZXRWYWx1ZSA9IGNhbGNPZmZzZXQ7XG4gICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcmFnUmVmICYmIHRoaXMuY29udGFpbmVyUmVmICYmIHRoaXMudHJhbnNmb3JtUmVmKSB7XG4gICAgICBjb25zdCBjYWxjT2Zmc2V0ID0gY2FsY3VsYXRlT2Zmc2V0KFxuICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLnRyYW5zZm9ybVJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmNvbG9yLFxuICAgICAgICB0aGlzLnR5cGVcbiAgICAgICk7XG4gICAgICBpZiAoY2FsY09mZnNldCkge1xuICAgICAgICB0aGlzLm9mZnNldFZhbHVlID0gY2FsY09mZnNldDtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRyYWdTdGFydEhhbmRsZShlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xuICAgIHRoaXMub25EcmFnU3RhcnQoZSk7XG4gIH1cblxuICB1cGRhdGVPZmZzZXQ6IEV2ZW50SGFuZGxlID0gKGU6IEV2ZW50VHlwZSwgZGlyZWN0aW9uOiAneCcgfCAneScgPSAneCcpID0+IHtcbiAgICBjb25zdCB7IHBhZ2VYLCBwYWdlWSB9ID0gZ2V0UG9zaXRpb24oZSk7XG4gICAgY29uc3Qge1xuICAgICAgeDogcmVjdFgsXG4gICAgICB5OiByZWN0WSxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0XG4gICAgfSA9IHRoaXMuY29udGFpbmVyUmVmPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB8fCB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICBjb25zdCB7IHdpZHRoOiB0YXJnZXRXaWR0aCwgaGVpZ2h0OiB0YXJnZXRIZWlnaHQgfSA9IHRoaXMudHJhbnNmb3JtUmVmPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB8fCB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG5cbiAgICBjb25zdCBjZW50ZXJPZmZzZXRYID0gdGFyZ2V0V2lkdGggLyAyO1xuICAgIGNvbnN0IGNlbnRlck9mZnNldFkgPSB0YXJnZXRIZWlnaHQgLyAyO1xuXG4gICAgY29uc3Qgb2Zmc2V0WCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHBhZ2VYIC0gcmVjdFgsIHdpZHRoKSkgLSBjZW50ZXJPZmZzZXRYO1xuICAgIGNvbnN0IG9mZnNldFkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihwYWdlWSAtIHJlY3RZLCBoZWlnaHQpKSAtIGNlbnRlck9mZnNldFk7XG5cbiAgICBjb25zdCBjYWxjT2Zmc2V0ID0ge1xuICAgICAgeDogb2Zmc2V0WCxcbiAgICAgIHk6IGRpcmVjdGlvbiA9PT0gJ3gnID8gdGhpcy5vZmZzZXRWYWx1ZS55IDogb2Zmc2V0WVxuICAgIH07XG5cbiAgICAvLyBFeGNsdXNpb24gb2YgYm91bmRhcnkgY2FzZXNcbiAgICBpZiAoKHRhcmdldFdpZHRoID09PSAwICYmIHRhcmdldEhlaWdodCA9PT0gMCkgfHwgdGFyZ2V0V2lkdGggIT09IHRhcmdldEhlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub2Zmc2V0VmFsdWUgPSBjYWxjT2Zmc2V0O1xuICAgIHRoaXMubnpPbkNoYW5nZS5lbWl0KFxuICAgICAgY2FsY3VsYXRlQ29sb3IoXG4gICAgICAgIGNhbGNPZmZzZXQsXG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMudHJhbnNmb3JtUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMuY29sb3IsXG4gICAgICAgIHRoaXMudHlwZVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9O1xuXG4gIG9uRHJhZ01vdmU6IEV2ZW50SGFuZGxlID0gKGU6IEV2ZW50VHlwZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnVwZGF0ZU9mZnNldChlKTtcbiAgfTtcblxuICBvbkRyYWdTdG9wOiBFdmVudEhhbmRsZSA9IChlOiBFdmVudFR5cGUpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnUmVmID0gZmFsc2U7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uRHJhZ01vdmUpO1xuICAgIHRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcFJlZik7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm1vdXNlTW92ZVJlZik7XG4gICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMubW91c2VVcFJlZik7XG4gICAgdGhpcy5tb3VzZU1vdmVSZWYgPSAoKSA9PiBudWxsO1xuICAgIHRoaXMubW91c2VVcFJlZiA9ICgpID0+IG51bGw7XG4gICAgdGhpcy5uek9uQ2hhbmdlQ29tcGxldGU/LmVtaXQodGhpcy50eXBlKTtcbiAgfTtcblxuICBvbkRyYWdTdGFydDogRXZlbnRIYW5kbGUgPSAoZTogRXZlbnRUeXBlKSA9PiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVPZmZzZXQoZSk7XG4gICAgdGhpcy5kcmFnUmVmID0gdHJ1ZTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25EcmFnTW92ZSk7XG4gICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbkRyYWdTdG9wKTtcbiAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25EcmFnTW92ZSk7XG4gICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25EcmFnU3RvcCk7XG4gICAgdGhpcy5tb3VzZU1vdmVSZWYgPSB0aGlzLm9uRHJhZ01vdmU7XG4gICAgdGhpcy5tb3VzZVVwUmVmID0gdGhpcy5vbkRyYWdTdG9wO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9O1xufVxuIl19