dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
303 lines • 29 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, HostBinding, HostListener, Output, ViewChild } from '@angular/core';
import { distance, getInsertPointBetweenCircleAndLine, pointInCicle } from './geometric';
/**
* @record
*/
export function MoveEvent() { }
if (false) {
/** @type {?} */
MoveEvent.prototype.startDragPoint;
}
export class PortraitMaskComponent {
/**
* @param {?} elRef
*/
constructor(elRef) {
this.elRef = elRef;
this.hostClass = true;
this.cx = 100;
this.cy = 100;
this.r = 50;
this.handleX = 150;
this.handleY = 100;
this.handleR = 6;
this.cursor = 'grab';
this.startDrag = new EventEmitter();
this.dragging = new EventEmitter();
this.maskChange = new EventEmitter();
this.mouseDown = this.mouseDown.bind(this);
this.mouseUp = this.mouseUp.bind(this);
this.move = this.move.bind(this);
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
toScreenPoint(x, y) {
/** @type {?} */
const pt = this.svg.nativeElement.createSVGPoint();
pt.x = x;
pt.y = y;
return pt.matrixTransform(this.svg.nativeElement.getScreenCTM());
}
// 将一个距离转换成屏幕尺寸
/**
* @param {?} val
* @return {?}
*/
toScreenDistance(val) {
/** @type {?} */
const p1 = this.toScreenPoint(0, 0);
/** @type {?} */
const p2 = this.toScreenPoint(val, 0);
return p2.x - p1.x;
}
/**
* @param {?} x
* @param {?} y
* @return {?}
*/
toSVGPoint(x, y) {
/** @type {?} */
const pt = this.svg.nativeElement.createSVGPoint();
pt.x = x;
pt.y = y;
return pt.matrixTransform(this.svg.nativeElement.getScreenCTM().inverse());
}
// 获取handle的受限的圆心坐标 svg
/**
* @param {?} mousePoint
* @return {?}
*/
getLimitHandleCenterPostion(mousePoint) {
// 根据mouse point拿到对应的圆心位置
/** @type {?} */
const point = { x: mousePoint.x - this.handleDistanceOffset.x, y: mousePoint.y - this.handleDistanceOffset.y };
// Create an SVGPoint for future math
/** @type {?} */
let r = distance(point.x, point.y, this.cx, this.cy);
if (r <= this.maxR) {
return point;
}
r = this.maxR;
/** @type {?} */
const arr = getInsertPointBetweenCircleAndLine(this.cx, this.cy, point.x, point.y, this.cx, this.cy, r);
/** @type {?} */
const d1 = distance(point.x, point.y, arr[0].x, arr[0].y);
/** @type {?} */
const d2 = distance(point.x, point.y, arr[1].x, arr[1].y);
if (d1 < d2) {
return arr[0];
}
else {
return arr[1];
}
}
// tslint:disable-next-line: quotemark
/**
* @param {?} event
* @return {?}
*/
mouseDown(event) {
if (event.button !== 0) {
return;
}
/** @type {?} */
const p = this.toSVGPoint(event.x, event.y);
this.handleDistanceOffset = { x: p.x - this.handleX, y: p.y - this.handleY };
this.maskDistanceOffset = { x: p.x - this.cx, y: p.y - this.cy };
this.startDragPoint = { x: event.x, y: event.y };
if (pointInCicle(p.x, p.y, this.handleX, this.handleY, this.handleR)) {
this.dragType = 'handle';
}
else if (pointInCicle(p.x, p.y, this.cx, this.cy, this.r)) {
this.dragType = 'mask';
}
else {
this.dragType = 'outside';
this.startDrag.emit(event);
}
window.addEventListener('mousemove', this.move, false);
window.addEventListener('mouseup', this.mouseUp, false);
event.stopPropagation();
}
/**
* @return {?}
*/
ngOnInit() {
this.calcSize();
}
/**
* @return {?}
*/
emitMaskRect() {
/** @type {?} */
const p1 = this.toScreenPoint(this.cx - this.r, this.cy - this.r);
/** @type {?} */
const p2 = this.toScreenPoint(this.cx + this.r, this.cy + this.r);
this.maskChange.emit({
left: p1.x,
top: p1.y,
right: p2.x,
bottom: p2.y,
width: p2.x - p1.x,
height: p2.y - p1.y
});
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.emitMaskRect();
}
/**
* @param {?} event
* @return {?}
*/
move(event) {
switch (this.dragType) {
case 'handle': {
/** @type {?} */
const p = this.getLimitHandleCenterPostion(this.toSVGPoint(event.x, event.y));
this.handleX = p.x;
this.handleY = p.y;
this.r = distance(this.handleX, this.handleY, this.cx, this.cy);
this.emitMaskRect();
break;
}
case 'mask':
{
/** @type {?} */
const p = this.toSVGPoint(event.x, event.y);
p.x = Math.max(0, Math.min(this.svgWidth, p.x));
p.y = Math.max(0, Math.min(this.svgHeight, p.y));
this.cx = p.x - this.maskDistanceOffset.x;
this.cy = p.y - this.maskDistanceOffset.y;
this.handleX = p.x - this.handleDistanceOffset.x;
this.handleY = p.y - this.handleDistanceOffset.y;
this.emitMaskRect();
}
break;
case 'outside':
this.dragging.emit({ x: event.x, y: event.y });
break;
default:
break;
}
event.stopPropagation();
event.preventDefault();
}
/**
* @param {?} event
* @return {?}
*/
mouseUp(event) {
window.removeEventListener('mousemove', this.move, false);
window.removeEventListener('mouseup', this.mouseUp, false);
}
// 重置到中心点,半径为最大
/**
* @return {?}
*/
reset() {
this.calcSize();
this.emitMaskRect();
}
/**
* @private
* @return {?}
*/
calcSize() {
/** @type {?} */
const rect = this.elRef.nativeElement.getBoundingClientRect();
/** @type {?} */
const p = this.toSVGPoint(rect.left + rect.width / 2, rect.top + rect.height / 2);
/** @type {?} */
const p1 = this.toSVGPoint(rect.left, rect.top);
/** @type {?} */
const p2 = this.toSVGPoint(rect.right, rect.bottom);
this.cx = p.x;
this.cy = p.y;
this.maxR = this.r = (p2.x - p1.x) / 2;
this.svgWidth = p2.x - p1.x;
this.svgHeight = p2.y - p1.y;
this.handleX = this.cx + this.r;
this.handleY = this.cy;
}
}
PortraitMaskComponent.decorators = [
{ type: Component, args: [{
selector: 'common-portrait-mask',
template: "<svg version=\"1.1\" width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\"\r\n\txmlns:xlink=\"http://www.w3.org/1999/xlink\" #svg>\r\n\t<style>\r\n\t\t.handle {\r\n\t\t\tcursor: grab;\r\n\t\t}\r\n\t</style>\r\n\t<defs>\r\n\t\t<mask id=\"Mask\">\r\n\t\t\t<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\r\n\t\t\t<circle [attr.cx]=\"cx\" [attr.cy]=\"cy\" [attr.r]=\"r\" />\r\n\t\t</mask>\r\n\t</defs>\r\n\r\n\t<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" opacity=\"0.4\"\r\n\t\tmask=\"url(#Mask)\" />\r\n\t<circle [attr.cx]=\"cx\" [attr.cy]=\"cy\" [attr.r]=\"r\" stroke-width=\"2\" #maskCicle\r\n\t\tclass=\"border-cicle\"/>\r\n\t<circle [attr.cx]=\"handleX\" [attr.cy]=\"handleY\" [attr.r]=\"handleR\" class=\"handle\"/>\r\n</svg>",
styles: [":host{width:100%;height:100%;display:block;position:relative}.handle{cursor:hand}"]
}] }
];
/** @nocollapse */
PortraitMaskComponent.ctorParameters = () => [
{ type: ElementRef }
];
PortraitMaskComponent.propDecorators = {
hostClass: [{ type: HostBinding, args: ['class.portrait-mask',] }],
startDrag: [{ type: Output }],
dragging: [{ type: Output }],
maskChange: [{ type: Output }],
svg: [{ type: ViewChild, args: ['svg', { static: true },] }],
handle: [{ type: ViewChild, args: ['handle', { static: true },] }],
maskCicle: [{ type: ViewChild, args: ['maskCicle', { static: true },] }],
mouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }]
};
if (false) {
/** @type {?} */
PortraitMaskComponent.prototype.hostClass;
/** @type {?} */
PortraitMaskComponent.prototype.cx;
/** @type {?} */
PortraitMaskComponent.prototype.cy;
/** @type {?} */
PortraitMaskComponent.prototype.r;
/** @type {?} */
PortraitMaskComponent.prototype.maxR;
/** @type {?} */
PortraitMaskComponent.prototype.svgWidth;
/** @type {?} */
PortraitMaskComponent.prototype.svgHeight;
/** @type {?} */
PortraitMaskComponent.prototype.handleX;
/** @type {?} */
PortraitMaskComponent.prototype.handleY;
/** @type {?} */
PortraitMaskComponent.prototype.handleR;
/** @type {?} */
PortraitMaskComponent.prototype.cursor;
/** @type {?} */
PortraitMaskComponent.prototype.maskDistanceOffset;
/** @type {?} */
PortraitMaskComponent.prototype.handleDistanceOffset;
/** @type {?} */
PortraitMaskComponent.prototype.startDragPoint;
/** @type {?} */
PortraitMaskComponent.prototype.dragType;
/** @type {?} */
PortraitMaskComponent.prototype.startDrag;
/** @type {?} */
PortraitMaskComponent.prototype.dragging;
/** @type {?} */
PortraitMaskComponent.prototype.maskChange;
/** @type {?} */
PortraitMaskComponent.prototype.svg;
/** @type {?} */
PortraitMaskComponent.prototype.handle;
/** @type {?} */
PortraitMaskComponent.prototype.maskCicle;
/**
* @type {?}
* @private
*/
PortraitMaskComponent.prototype.elRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydHJhaXQtbWFzay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvdXNlcmluZm8vcG9ydHJhaXQtZWRpdC9wb3J0cmFpdC1tYXNrL3BvcnRyYWl0LW1hc2suY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBRU4sU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFFWixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsa0NBQWtDLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7O0FBR3pGLCtCQUVDOzs7SUFEQSxtQ0FBc0I7O0FBT3ZCLE1BQU0sT0FBTyxxQkFBcUI7Ozs7SUFzQmpDLFlBQW9CLEtBQThCO1FBQTlCLFVBQUssR0FBTCxLQUFLLENBQXlCO1FBckJkLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDckQsT0FBRSxHQUFHLEdBQUcsQ0FBQztRQUNULE9BQUUsR0FBRyxHQUFHLENBQUM7UUFDVCxNQUFDLEdBQUcsRUFBRSxDQUFDO1FBSVAsWUFBTyxHQUFHLEdBQUcsQ0FBQztRQUNkLFlBQU8sR0FBRyxHQUFHLENBQUM7UUFDZCxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUtOLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBQ3JDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBS3JELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENB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QUFNLEVBQUUsSUFBSSxFQUFFO3dCQThDdkMsWUFBWSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7OztJQWxFckMsMENBQXFEOztJQUNyRCxtQ0FBUzs7SUFDVCxtQ0FBUzs7SUFDVCxrQ0FBTzs7SUFDUCxxQ0FBYTs7SUFDYix5Q0FBaUI7O0lBQ2pCLDBDQUFrQjs7SUFDbEIsd0NBQWM7O0lBQ2Qsd0NBQWM7O0lBQ2Qsd0NBQVk7O0lBQ1osdUNBQWdCOztJQUNoQixtREFBMEI7O0lBQzFCLHFEQUE0Qjs7SUFDNUIsK0NBQXNCOztJQUN0Qix5Q0FBbUI7O0lBQ25CLDBDQUFxRDs7SUFDckQseUNBQStDOztJQUMvQywyQ0FBc0Q7O0lBQ3RELG9DQUFvRDs7SUFDcEQsdUNBQTBEOztJQUMxRCwwQ0FBZ0U7Ozs7O0lBQ3BELHNDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvaW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcC90eXBpbmdzL2RyYWctcmVmJztcbmltcG9ydCB7XG5cdEFmdGVyVmlld0luaXQsXG5cdENvbXBvbmVudCxcblx0RWxlbWVudFJlZixcblx0RXZlbnRFbWl0dGVyLFxuXHRIb3N0QmluZGluZyxcblx0SG9zdExpc3RlbmVyLFxuXHRPbkluaXQsXG5cdE91dHB1dCxcblx0Vmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGlzdGFuY2UsIGdldEluc2VydFBvaW50QmV0d2VlbkNpcmNsZUFuZExpbmUsIHBvaW50SW5DaWNsZSB9IGZyb20gJy4vZ2VvbWV0cmljJztcblxudHlwZSBEYXJnVHlwZSA9ICdoYW5kbGUnIHwgJ21hc2snIHwgJ291dHNpZGUnO1xuZXhwb3J0IGludGVyZmFjZSBNb3ZlRXZlbnQge1xuXHRzdGFydERyYWdQb2ludDogUG9pbnQ7XG59XG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdjb21tb24tcG9ydHJhaXQtbWFzaycsXG5cdHRlbXBsYXRlVXJsOiAnLi9wb3J0cmFpdC1tYXNrLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmxzOiBbJy4vcG9ydHJhaXQtbWFzay5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBvcnRyYWl0TWFza0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cdEBIb3N0QmluZGluZygnY2xhc3MucG9ydHJhaXQtbWFzaycpIGhvc3RDbGFzcyA9IHRydWU7XG5cdGN4ID0gMTAwO1xuXHRjeSA9IDEwMDtcblx0ciA9IDUwO1xuXHRtYXhSOiBudW1iZXI7XG5cdHN2Z1dpZHRoOiBudW1iZXI7IC8vIHN2ZyDlnZDmoIfnmoTmgLvlrr3luqZcblx0c3ZnSGVpZ2h0OiBudW1iZXI7XG5cdGhhbmRsZVggPSAxNTA7XG5cdGhhbmRsZVkgPSAxMDA7XG5cdGhhbmRsZVIgPSA2O1xuXHRjdXJzb3IgPSAnZ3JhYic7XG5cdG1hc2tEaXN0YW5jZU9mZnNldDogUG9pbnQ7IC8vIOm8oOagh+eCueWHu+S9jee9ruS4juWchuW/g+eahOWBj+enu1xuXHRoYW5kbGVEaXN0YW5jZU9mZnNldDogUG9pbnQ7XG5cdHN0YXJ0RHJhZ1BvaW50OiBQb2ludDsgLy8g5byA5aeL5ouW5Yqo55qE54K577yM5bGP5bmV5Z2Q5qCHXG5cdGRyYWdUeXBlOiBEYXJnVHlwZTtcblx0QE91dHB1dCgpIHN0YXJ0RHJhZyA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcblx0QE91dHB1dCgpIGRyYWdnaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxQb2ludD4oKTtcblx0QE91dHB1dCgpIG1hc2tDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENsaWVudFJlY3Q+KCk7XG5cdEBWaWV3Q2hpbGQoJ3N2ZycsIHsgc3RhdGljOiB0cnVlIH0pIHN2ZzogRWxlbWVudFJlZjtcblx0QFZpZXdDaGlsZCgnaGFuZGxlJywgeyBzdGF0aWM6IHRydWUgfSkgaGFuZGxlOiBFbGVtZW50UmVmO1xuXHRAVmlld0NoaWxkKCdtYXNrQ2ljbGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBtYXNrQ2ljbGU6IEVsZW1lbnRSZWY7XG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG5cdFx0dGhpcy5tb3VzZURvd24gPSB0aGlzLm1vdXNlRG93bi5iaW5kKHRoaXMpO1xuXHRcdHRoaXMubW91c2VVcCA9IHRoaXMubW91c2VVcC5iaW5kKHRoaXMpO1xuXHRcdHRoaXMubW92ZSA9IHRoaXMubW92ZS5iaW5kKHRoaXMpO1xuXHR9XG5cdHRvU2NyZWVuUG9pbnQoeCwgeSk6IFBvaW50IHtcblx0XHRjb25zdCBwdCA9IHRoaXMuc3ZnLm5hdGl2ZUVsZW1lbnQuY3JlYXRlU1ZHUG9pbnQoKTtcblx0XHRwdC54ID0geDtcblx0XHRwdC55ID0geTtcblx0XHRyZXR1cm4gcHQubWF0cml4VHJhbnNmb3JtKHRoaXMuc3ZnLm5hdGl2ZUVsZW1lbnQuZ2V0U2NyZWVuQ1RNKCkpO1xuXHR9XG5cdC8vIOWwhuS4gOS4qui3neemu+i9rOaNouaIkOWxj+W5leWwuuWvuFxuXHR0b1NjcmVlbkRpc3RhbmNlKHZhbDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRjb25zdCBwMSA9IHRoaXMudG9TY3JlZW5Qb2ludCgwLCAwKTtcblx0XHRjb25zdCBwMiA9IHRoaXMudG9TY3JlZW5Qb2ludCh2YWwsIDApO1xuXHRcdHJldHVybiBwMi54IC0gcDEueDtcblx0fVxuXHR0b1NWR1BvaW50KHgsIHkpOiBQb2ludCB7XG5cdFx0Y29uc3QgcHQgPSB0aGlzLnN2Zy5uYXRpdmVFbGVtZW50LmNyZWF0ZVNWR1BvaW50KCk7XG5cdFx0cHQueCA9IHg7XG5cdFx0cHQueSA9IHk7XG5cdFx0cmV0dXJuIHB0Lm1hdHJpeFRyYW5zZm9ybSh0aGlzLnN2Zy5uYXRpdmVFbGVtZW50LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7XG5cdH1cblx0Ly8g6I635Y+WaGFuZGxl55qE5Y+X6ZmQ55qE5ZyG5b+D5Z2Q5qCHIHN2Z1xuXHRnZXRMaW1pdEhhbmRsZUNlbnRlclBvc3Rpb24obW91c2VQb2ludDogUG9pbnQpOiBQb2ludCB7XG5cdFx0Ly8g5qC55o2ubW91c2UgcG9pbnTmi7/liLDlr7nlupTnmoTlnIblv4PkvY3nva5cblx0XHRjb25zdCBwb2ludCA9IHsgeDogbW91c2VQb2ludC54IC0gdGhpcy5oYW5kbGVEaXN0YW5jZU9mZnNldC54LCB5OiBtb3VzZVBvaW50LnkgLSB0aGlzLmhhbmRsZURpc3RhbmNlT2Zmc2V0LnkgfTtcblx0XHQvLyBDcmVhdGUgYW4gU1ZHUG9pbnQgZm9yIGZ1dHVyZSBtYXRoXG5cdFx0bGV0IHIgPSBkaXN0YW5jZShwb2ludC54LCBwb2ludC55LCB0aGlzLmN4LCB0aGlzLmN5KTtcblx0XHRpZiAociA8PSB0aGlzLm1heFIpIHtcblx0XHRcdHJldHVybiBwb2ludDtcblx0XHR9XG5cdFx0ciA9IHRoaXMubWF4Ujtcblx0XHRjb25zdCBhcnIgPSBnZXRJbnNlcnRQb2ludEJldHdlZW5DaXJjbGVBbmRMaW5lKHRoaXMuY3gsIHRoaXMuY3ksIHBvaW50LngsIHBvaW50LnksIHRoaXMuY3gsIHRoaXMuY3ksIHIpO1xuXG5cdFx0Y29uc3QgZDEgPSBkaXN0YW5jZShwb2ludC54LCBwb2ludC55LCBhcnJbMF0ueCwgYXJyWzBdLnkpO1xuXHRcdGNvbnN0IGQyID0gZGlzdGFuY2UocG9pbnQueCwgcG9pbnQueSwgYXJyWzFdLngsIGFyclsxXS55KTtcblx0XHRpZiAoZDEgPCBkMikge1xuXHRcdFx0cmV0dXJuIGFyclswXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGFyclsxXTtcblx0XHR9XG5cdH1cblxuXHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHF1b3RlbWFya1xuXHRASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuXHRtb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcblx0XHRpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHAgPSB0aGlzLnRvU1ZHUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7XG5cdFx0dGhpcy5oYW5kbGVEaXN0YW5jZU9mZnNldCA9IHsgeDogcC54IC0gdGhpcy5oYW5kbGVYLCB5OiBwLnkgLSB0aGlzLmhhbmRsZVkgfTtcblx0XHR0aGlzLm1hc2tEaXN0YW5jZU9mZnNldCA9IHsgeDogcC54IC0gdGhpcy5jeCwgeTogcC55IC0gdGhpcy5jeSB9O1xuXHRcdHRoaXMuc3RhcnREcmFnUG9pbnQgPSB7IHg6IGV2ZW50LngsIHk6IGV2ZW50LnkgfTtcblxuXHRcdGlmIChwb2ludEluQ2ljbGUocC54LCBwLnksIHRoaXMuaGFuZGxlWCwgdGhpcy5oYW5kbGVZLCB0aGlzLmhhbmRsZVIpKSB7XG5cdFx0XHR0aGlzLmRyYWdUeXBlID0gJ2hhbmRsZSc7XG5cdFx0fSBlbHNlIGlmIChwb2ludEluQ2ljbGUocC54LCBwLnksIHRoaXMuY3gsIHRoaXMuY3ksIHRoaXMucikpIHtcblx0XHRcdHRoaXMuZHJhZ1R5cGUgPSAnbWFzayc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZHJhZ1R5cGUgPSAnb3V0c2lkZSc7XG5cdFx0XHR0aGlzLnN0YXJ0RHJhZy5lbWl0KGV2ZW50KTtcblx0XHR9XG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMubW92ZSwgZmFsc2UpO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZVVwLCBmYWxzZSk7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cblx0bmdPbkluaXQoKSB7XG5cdFx0dGhpcy5jYWxjU2l6ZSgpO1xuXHR9XG5cdGVtaXRNYXNrUmVjdCgpIHtcblx0XHRjb25zdCBwMSA9IHRoaXMudG9TY3JlZW5Qb2ludCh0aGlzLmN4IC0gdGhpcy5yLCB0aGlzLmN5IC0gdGhpcy5yKTtcblx0XHRjb25zdCBwMiA9IHRoaXMudG9TY3JlZW5Qb2ludCh0aGlzLmN4ICsgdGhpcy5yLCB0aGlzLmN5ICsgdGhpcy5yKTtcblx0XHR0aGlzLm1hc2tDaGFuZ2UuZW1pdCh7XG5cdFx0XHRsZWZ0OiBwMS54LFxuXHRcdFx0dG9wOiBwMS55LFxuXHRcdFx0cmlnaHQ6IHAyLngsXG5cdFx0XHRib3R0b206IHAyLnksXG5cdFx0XHR3aWR0aDogcDIueCAtIHAxLngsXG5cdFx0XHRoZWlnaHQ6IHAyLnkgLSBwMS55XG5cdFx0fSk7XG5cdH1cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdHRoaXMuZW1pdE1hc2tSZWN0KCk7XG5cdH1cblx0bW92ZShldmVudDogTW91c2VFdmVudCkge1xuXHRcdHN3aXRjaCAodGhpcy5kcmFnVHlwZSkge1xuXHRcdFx0Y2FzZSAnaGFuZGxlJzoge1xuXHRcdFx0XHRjb25zdCBwID0gdGhpcy5nZXRMaW1pdEhhbmRsZUNlbnRlclBvc3Rpb24odGhpcy50b1NWR1BvaW50KGV2ZW50LngsIGV2ZW50LnkpKTtcblx0XHRcdFx0dGhpcy5oYW5kbGVYID0gcC54O1xuXHRcdFx0XHR0aGlzLmhhbmRsZVkgPSBwLnk7XG5cdFx0XHRcdHRoaXMuciA9IGRpc3RhbmNlKHRoaXMuaGFuZGxlWCwgdGhpcy5oYW5kbGVZLCB0aGlzLmN4LCB0aGlzLmN5KTtcblx0XHRcdFx0dGhpcy5lbWl0TWFza1JlY3QoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjYXNlICdtYXNrJzpcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnN0IHAgPSB0aGlzLnRvU1ZHUG9pbnQoZXZlbnQueCwgZXZlbnQueSk7XG5cdFx0XHRcdFx0cC54ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5zdmdXaWR0aCwgcC54KSk7XG5cdFx0XHRcdFx0cC55ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5zdmdIZWlnaHQsIHAueSkpO1xuXHRcdFx0XHRcdHRoaXMuY3ggPSBwLnggLSB0aGlzLm1hc2tEaXN0YW5jZU9mZnNldC54O1xuXHRcdFx0XHRcdHRoaXMuY3kgPSBwLnkgLSB0aGlzLm1hc2tEaXN0YW5jZU9mZnNldC55O1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlWCA9IHAueCAtIHRoaXMuaGFuZGxlRGlzdGFuY2VPZmZzZXQueDtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZVkgPSBwLnkgLSB0aGlzLmhhbmRsZURpc3RhbmNlT2Zmc2V0Lnk7XG5cdFx0XHRcdFx0dGhpcy5lbWl0TWFza1JlY3QoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ291dHNpZGUnOlxuXHRcdFx0XHR0aGlzLmRyYWdnaW5nLmVtaXQoeyB4OiBldmVudC54LCB5OiBldmVudC55IH0pO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdH1cblx0bW91c2VVcChldmVudDogTW91c2VFdmVudCkge1xuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdmUsIGZhbHNlKTtcblx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcCwgZmFsc2UpO1xuXHR9XG5cdC8vIOmHjee9ruWIsOS4reW/g+eCue+8jOWNiuW+hOS4uuacgOWkp1xuXHRyZXNldCgpIHtcblx0XHR0aGlzLmNhbGNTaXplKCk7XG5cblx0XHR0aGlzLmVtaXRNYXNrUmVjdCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBjYWxjU2l6ZSgpIHtcblx0XHRjb25zdCByZWN0ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdGNvbnN0IHAgPSB0aGlzLnRvU1ZHUG9pbnQocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDIsIHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyKTtcblx0XHRjb25zdCBwMSA9IHRoaXMudG9TVkdQb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKTtcblx0XHRjb25zdCBwMiA9IHRoaXMudG9TVkdQb2ludChyZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7XG5cdFx0dGhpcy5jeCA9IHAueDtcblx0XHR0aGlzLmN5ID0gcC55O1xuXHRcdHRoaXMubWF4UiA9IHRoaXMuciA9IChwMi54IC0gcDEueCkgLyAyO1xuXHRcdHRoaXMuc3ZnV2lkdGggPSBwMi54IC0gcDEueDtcblx0XHR0aGlzLnN2Z0hlaWdodCA9IHAyLnkgLSBwMS55O1xuXHRcdHRoaXMuaGFuZGxlWCA9IHRoaXMuY3ggKyB0aGlzLnI7XG5cdFx0dGhpcy5oYW5kbGVZID0gdGhpcy5jeTtcblx0fVxufVxuIl19