UNPKG

gd-canvas

Version:

This set of libraries was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.0 and no dependencies accept gd-tree (it has jquery and jstree) and gd-graph (it has jquery and chart.js).

186 lines 30.7 kB
import { Point } from 'gd-common'; export class Tools { Rotate(point, center, angle) { const origin = new Point(point.x - center.x, point.y - center.y); if (angle === 0) { return origin; } const radians = angle * Math.PI / 180.0; const nx = origin.x * Math.cos(radians) - origin.y * Math.sin(radians); const ny = origin.x * Math.sin(radians) + origin.y * Math.cos(radians); return new Point(nx, ny); } Normal(point, start, end) { if (end.x === start.x) return new Point(start.x, point.y); if (end.y === start.y) return new Point(point.x, start.y); const k1 = (end.y - start.y) / (end.x - start.x); const k2 = (start.x - end.x) / (end.y - start.y); const b1 = start.y - k1 * start.x; const b2 = point.y - k2 * point.x; const x = (b2 - b1) / (k1 - k2); const y = k1 * x + b1; return new Point(x, y); } DistanceTo(point, start, end) { return Math.abs((end.y - start.y) * point.x - (end.x - start.x) * point.y + end.x * start.y - end.y * start.x) / Math.sqrt(Math.pow(end.y - start.y, 2) + Math.pow(end.x - start.x, 2)); } Intersect_OLD(a, b, c, d) { /* (Ay-Cy)(Dx-Cx)-(Ax-Cx)(Dy-Cy) r = ----------------------------- (eqn 1) (Bx-Ax)(Dy-Cy)-(By-Ay)(Dx-Cx) */ const p = this.Intersection(a, b, c, d); return (p.x !== 0 && p.y !== 0); } Intersect(a, b, c, d) { return this.doIntersect(a, b, c, d); } // Given three colinear points p, q, r, the function checks if // point q lies on line segment 'pr' onSegment(p, q, r) { if (q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y)) return true; return false; } // To find orientation of ordered triplet (p, q, r). // The function returns following values // 0 --> p, q and r are colinear // 1 --> Clockwise // 2 --> Counterclockwise orientation(p, q, r) { // See https://www.geeksforgeeks.org/orientation-3-ordered-points/ // for details of below formula. const val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); if (val === 0) return 0; // colinear return (val > 0 ? 1 : 2); // clock or counterclock wise } // The main function that returns true if line segment 'p1q1' // and 'p2q2' intersect. doIntersect(p1, q1, p2, q2) { // Find the four orientations needed for general and // special cases const o1 = this.orientation(p1, q1, p2); const o2 = this.orientation(p1, q1, q2); const o3 = this.orientation(p2, q2, p1); const o4 = this.orientation(p2, q2, q1); // General case if (o1 !== o2 && o3 !== o4) return true; // Special Cases // p1, q1 and p2 are colinear and p2 lies on segment p1q1 if (o1 === 0 && this.onSegment(p1, p2, q1)) return true; // p1, q1 and q2 are colinear and q2 lies on segment p1q1 if (o2 === 0 && this.onSegment(p1, q2, q1)) return true; // p2, q2 and p1 are colinear and p1 lies on segment p2q2 if (o3 === 0 && this.onSegment(p2, p1, q2)) return true; // p2, q2 and q1 are colinear and q1 lies on segment p2q2 if (o4 === 0 && this.onSegment(p2, q1, q2)) return true; return false; // Doesn't fall in any of the above cases } Intersection(p1, p2, p3, p4) { // calculate differences let xD1 = p2.x - p1.x; let yD1 = p2.y - p1.y; let xD2 = p4.x - p3.x; let yD2 = p4.y - p3.y; const xD3 = p1.x - p3.x; const yD3 = p1.y - p3.y; // calculate the lengths of the two lines const Len1 = Math.sqrt(xD1 * xD1 + yD1 * yD1); const Len2 = Math.sqrt(xD2 * xD2 + yD2 * yD2); // calculate angle between the two lines. const dot = (xD1 * xD2 + yD1 * yD2); // dot product const deg = dot / (Len1 * Len2); // if Math.Abs(angle)==1 then the lines are parallell, // so no intersection is possible if (Math.abs(deg) === 1) return new Point(0, 0); // find intersection Pt between two lines const pt = new Point(0, 0); const div = yD2 * xD1 - xD2 * yD1; const ua = (xD2 * yD3 - yD2 * xD3) / div; const ub = (xD1 * yD3 - yD1 * xD3) / div; pt.x = p1.x + ua * xD1; pt.y = p1.y + ua * yD1; // calculate the combined length of the two segments // between Pt-p1 and Pt-p2 xD1 = pt.x - p1.x; yD1 = pt.y - p1.y; xD2 = pt.x - p2.x; yD2 = pt.y - p2.y; const len1 = Math.sqrt(xD1 * xD1 + yD1 * yD1) + Math.sqrt(xD2 * xD2 + yD2 * yD2); // calculate the combined length of the two segments // between Pt-p3 and Pt-p4 xD1 = pt.x - p3.x; yD1 = pt.y - p3.y; xD2 = pt.x - p4.x; yD2 = pt.y - p4.y; const len2 = Math.sqrt(xD1 * xD1 + yD1 * yD1) + Math.sqrt(xD2 * xD2 + yD2 * yD2); const diff1 = Math.abs(Len1 - len1); const diff2 = Math.abs(Len2 - len2); if (diff1 > 0.01 || diff2 > 0.01) return new Point(0, 0); return pt; } PointSide(point, start, end) { const D = (point.x - start.x) * (end.y - start.y) - (point.y - start.y) * (end.x - start.x); const result = (D === 0 ? 'INSIDE' : (D > 0 ? 'RIGHT' : 'LEFT')); return result; } RoundRect(ctx, x, y, width, height, radius, fill, stroke) { if (typeof stroke === 'undefined') { stroke = true; } if (typeof radius === 'undefined') { radius = 5; } // --width; // --height; // x -= 0.5; // y -= 0.5; ctx.beginPath(); ctx.moveTo(x + radius, y); ctx.lineTo(x + width - radius, y); ctx.quadraticCurveTo(x + width, y, x + width, y + radius); ctx.lineTo(x + width, y + height - radius); ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); ctx.lineTo(x + radius, y + height); ctx.quadraticCurveTo(x, y + height, x, y + height - radius); ctx.lineTo(x, y + radius); ctx.quadraticCurveTo(x, y, x + radius, y); ctx.closePath(); if (fill) ctx.fill(); if (stroke) ctx.stroke(); } MeasureText(text, font, style) { let div = document.createElement('div'); document.body.appendChild(div); div.style.font = font; div.style.position = 'absolute'; div.style.left = '-1000'; div.style.top = '-1000'; div.style.fontStyle = style; div.innerHTML = text; const result = { width: div.clientWidth, height: div.clientHeight }; document.body.removeChild(div); div = null; return result; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2QtY2FudmFzLnRvb2xzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ2QtY2FudmFzLyIsInNvdXJjZXMiOlsibGliL2dkLWNhbnZhcy50b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sT0FBTyxLQUFLO0lBRVAsTUFBTSxDQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsS0FBYztRQUV4RCxNQUEyQixNQUFNLEdBQUksSUFBSSxLQUFLLENBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBRSxDQUFDO1FBQ3pGLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRztZQUFFLE9BQU8sTUFBTSxDQUFDO1NBQUU7UUFFcEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRXhDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2RSxPQUFPLElBQUksS0FBSyxDQUFFLEVBQUUsRUFBRSxFQUFFLENBQUUsQ0FBQztJQUMvQixDQUFDO0lBRU0sTUFBTSxDQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsR0FBVztRQUVwRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRyxPQUFPLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqRCxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFbEMsTUFBTSxDQUFDLEdBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFDLEdBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFdkIsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVNLFVBQVUsQ0FBRSxLQUFhLEVBQUUsS0FBYSxFQUFFLEdBQVc7UUFFeEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqRyxJQUFJLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFFLENBQUM7SUFDaEYsQ0FBQztJQUVNLGFBQWEsQ0FBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTO1FBRTVEOzs7O1VBSUU7UUFFSCxNQUFRLENBQUMsR0FBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBRSxDQUFDO0lBQ3BDLENBQUM7SUFDTSxTQUFTLENBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztRQUV4RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVELDhEQUE4RDtJQUM5RCxvQ0FBb0M7SUFDN0IsU0FBUyxDQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUztRQUU3QyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUcsT0FBTyxJQUFJLENBQUM7UUFFekUsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCx3Q0FBd0M7SUFDeEMsZ0NBQWdDO0lBQ2hDLGtCQUFrQjtJQUNsQix5QkFBeUI7SUFDbEIsV0FBVyxDQUFDLENBQVMsRUFBRSxDQUFRLEVBQUUsQ0FBUTtRQUU1QyxrRUFBa0U7UUFDbEUsZ0NBQWdDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRDLElBQUksR0FBRyxLQUFLLENBQUM7WUFBRyxPQUFPLENBQUMsQ0FBQyxDQUFFLFdBQVc7UUFFdEMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7SUFDMUQsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCx3QkFBd0I7SUFDakIsV0FBVyxDQUFFLEVBQVMsRUFBRSxFQUFTLEVBQUUsRUFBUyxFQUFFLEVBQVM7UUFFMUQsb0RBQW9EO1FBQ3BELGdCQUFnQjtRQUNoQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFFLENBQUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBRSxDQUFDO1FBQzFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUUsQ0FBQztRQUMxQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFFLENBQUM7UUFFMUMsZUFBZTtRQUNmLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUFHLE9BQU8sSUFBSSxDQUFDO1FBRXpDLGdCQUFnQjtRQUNoQix5REFBeUQ7UUFDekQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV4RCx5REFBeUQ7UUFDekQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV4RCx5REFBeUQ7UUFDekQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV4RCx5REFBeUQ7UUFDekQsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV4RCxPQUFPLEtBQUssQ0FBQyxDQUFDLHlDQUF5QztJQUMzRCxDQUFDO0lBRU0sWUFBWSxDQUFFLEVBQVUsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVU7UUFFL0Qsd0JBQXdCO1FBQ3hCLElBQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFeEIsSUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV4QixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXhCLHlDQUF5QztRQUN6QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBRSxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFFLENBQUM7UUFFaEQseUNBQXlDO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxjQUFjO1FBQ25ELE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztRQUVoQyxzREFBc0Q7UUFDdEQsaUNBQWlDO1FBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEQseUNBQXlDO1FBQ3pDLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDbEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFekMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDdkIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFFdkIsb0RBQW9EO1FBQ3BELDBCQUEwQjtRQUMxQixHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbEIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQixHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWxCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUVqRixvREFBb0Q7UUFDcEQsMEJBQTBCO1FBQzFCLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVsQixHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRWpGLE1BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE1BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBRXJDLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEdBQUcsSUFBSTtZQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVNLFNBQVMsQ0FBRSxLQUFhLEVBQUUsS0FBYSxFQUFFLEdBQVc7UUFFdkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1RixNQUFPLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVNLFNBQVMsQ0FBRSxHQUFTLEVBQUUsQ0FBTyxFQUFFLENBQU8sRUFBRSxLQUFXLEVBQUUsTUFBWSxFQUFFLE1BQVksRUFBRSxJQUFVLEVBQUUsTUFBWTtRQUU1RyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRztZQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FBRTtRQUN0RCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRztZQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FBSztRQUV0RCxXQUFXO1FBQ1gsWUFBWTtRQUVaLFlBQVk7UUFDWixZQUFZO1FBRVosR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUMxRCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztRQUMzQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUM1RSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztRQUM1RCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDMUIsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFaEIsSUFBSSxJQUFJO1lBQUssR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksTUFBTTtZQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU0sV0FBVyxDQUFFLElBQWEsRUFBRSxJQUFhLEVBQUUsS0FBYztRQUU1RCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRS9CLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFRLElBQUksQ0FBQztRQUMzQixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBSSxVQUFVLENBQUM7UUFDakMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQVEsT0FBTyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFTLE9BQU8sQ0FBQztRQUM5QixHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDNUIsR0FBRyxDQUFDLFNBQVMsR0FBUyxJQUFJLENBQUM7UUFFM0IsTUFBTSxNQUFNLEdBQ1o7WUFDSSxLQUFLLEVBQUcsR0FBRyxDQUFDLFdBQVc7WUFDdkIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxZQUFZO1NBQzNCLENBQUM7UUFFRixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixHQUFHLEdBQUcsSUFBSSxDQUFDO1FBRVgsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9pbnQgfSBmcm9tICdnZC1jb21tb24nO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRvb2xzXHJcbntcclxuICAgIHB1YmxpYyBSb3RhdGUoIHBvaW50IDogUG9pbnQsIGNlbnRlciA6IFBvaW50LCBhbmdsZSA6IG51bWJlciApIDogUG9pbnRcclxuICAgIHtcclxuICAgICAgICBjb25zdCAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4gID0gbmV3IFBvaW50KCBwb2ludC54IC0gY2VudGVyLngsIHBvaW50LnkgLSBjZW50ZXIueSApO1xyXG4gICAgICAgIGlmKCBhbmdsZSA9PT0gMCApIHsgcmV0dXJuIG9yaWdpbjsgfVxyXG5cclxuICAgICAgICBjb25zdCByYWRpYW5zID0gYW5nbGUgKiBNYXRoLlBJIC8gMTgwLjA7XHJcblxyXG4gICAgICAgIGNvbnN0IG54ID0gb3JpZ2luLnggKiBNYXRoLmNvcyhyYWRpYW5zKSAtIG9yaWdpbi55ICogTWF0aC5zaW4ocmFkaWFucyk7XHJcbiAgICAgICAgY29uc3QgbnkgPSBvcmlnaW4ueCAqIE1hdGguc2luKHJhZGlhbnMpICsgb3JpZ2luLnkgKiBNYXRoLmNvcyhyYWRpYW5zKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCggbngsIG55ICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIE5vcm1hbCggcG9pbnQgOiBQb2ludCwgc3RhcnQgOiBQb2ludCwgZW5kIDogUG9pbnQgKSA6IFBvaW50XHJcbiAgICB7XHJcbiAgICAgICAgaWYoIGVuZC54ID09PSBzdGFydC54ICkgcmV0dXJuIG5ldyBQb2ludChzdGFydC54LCBwb2ludC55KTtcclxuICAgICAgICBpZiggZW5kLnkgPT09IHN0YXJ0LnkgKSByZXR1cm4gbmV3IFBvaW50KHBvaW50LngsIHN0YXJ0LnkpO1xyXG5cclxuICAgICAgICBjb25zdCBrMSA9IChlbmQueSAtIHN0YXJ0LnkpIC8gKGVuZC54IC0gc3RhcnQueCk7XHJcbiAgICAgICAgY29uc3QgazIgPSAoc3RhcnQueCAtIGVuZC54KSAvIChlbmQueSAtIHN0YXJ0LnkpO1xyXG5cclxuICAgICAgICBjb25zdCBiMSA9IHN0YXJ0LnkgLSBrMSAqIHN0YXJ0Lng7XHJcbiAgICAgICAgY29uc3QgYjIgPSBwb2ludC55IC0gazIgKiBwb2ludC54O1xyXG5cclxuICAgICAgICBjb25zdCB4ICA9IChiMiAtIGIxKSAvIChrMSAtIGsyKTtcclxuICAgICAgICBjb25zdCB5ICA9IGsxICogeCArIGIxO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHgseSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIERpc3RhbmNlVG8oIHBvaW50IDogUG9pbnQsIHN0YXJ0IDogUG9pbnQsIGVuZCA6IFBvaW50IClcclxuICAgIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5hYnMgKCAoZW5kLnktc3RhcnQueSkqcG9pbnQueCAtIChlbmQueC1zdGFydC54KSpwb2ludC55ICsgZW5kLnggKiBzdGFydC55IC0gZW5kLnkgKiBzdGFydC54KSAvXHJcbiAgICAgICAgICAgICAgIE1hdGguc3FydCggTWF0aC5wb3coZW5kLnktc3RhcnQueSwgMikgKyBNYXRoLnBvdyhlbmQueC1zdGFydC54LCAyKSApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJbnRlcnNlY3RfT0xEKCBhIDogUG9pbnQsIGIgOiBQb2ludCwgYyA6IFBvaW50LCBkIDogUG9pbnQgKSA6IGJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAgICAgICAoQXktQ3kpKER4LUN4KS0oQXgtQ3gpKER5LUN5KVxyXG4gICAgICAgICAgIHIgPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgKGVxbiAxKVxyXG4gICAgICAgICAgICAgICAoQngtQXgpKER5LUN5KS0oQnktQXkpKER4LUN4KVxyXG4gICAgICAgICovXHJcblxyXG4gICAgICAgY29uc3QgICBwICA9IHRoaXMuSW50ZXJzZWN0aW9uKGEsIGIsIGMsIGQpO1xyXG4gICAgICAgcmV0dXJuIChwLnggIT09IDAgJiYgcC55ICE9PSAwICk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgSW50ZXJzZWN0KCBhIDogUG9pbnQsIGIgOiBQb2ludCwgYyA6IFBvaW50LCBkIDogUG9pbnQgKSA6IGJvb2xlYW5cclxuICAgIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kb0ludGVyc2VjdCggYSwgYiwgYywgZCApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdpdmVuIHRocmVlIGNvbGluZWFyIHBvaW50cyBwLCBxLCByLCB0aGUgZnVuY3Rpb24gY2hlY2tzIGlmXHJcbiAgICAvLyBwb2ludCBxIGxpZXMgb24gbGluZSBzZWdtZW50ICdwcidcclxuICAgIHB1YmxpYyBvblNlZ21lbnQoIHAgOiBQb2ludCwgcSA6IFBvaW50LCByIDogUG9pbnQpIDogYm9vbGVhblxyXG4gICAge1xyXG4gICAgICAgIGlmKCBxLnggPD0gTWF0aC5tYXgocC54LCByLngpICYmIHEueCA+PSBNYXRoLm1pbihwLngsIHIueCkgJiZcclxuICAgICAgICAgICAgcS55IDw9IE1hdGgubWF4KHAueSwgci55KSAmJiBxLnkgPj0gTWF0aC5taW4ocC55LCByLnkpICkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUbyBmaW5kIG9yaWVudGF0aW9uIG9mIG9yZGVyZWQgdHJpcGxldCAocCwgcSwgcikuXHJcbiAgICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyBmb2xsb3dpbmcgdmFsdWVzXHJcbiAgICAvLyAwIC0tPiBwLCBxIGFuZCByIGFyZSBjb2xpbmVhclxyXG4gICAgLy8gMSAtLT4gQ2xvY2t3aXNlXHJcbiAgICAvLyAyIC0tPiBDb3VudGVyY2xvY2t3aXNlXHJcbiAgICBwdWJsaWMgb3JpZW50YXRpb24ocCA6IFBvaW50LCBxOiBQb2ludCwgcjogUG9pbnQpIDogbnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LmdlZWtzZm9yZ2Vla3Mub3JnL29yaWVudGF0aW9uLTMtb3JkZXJlZC1wb2ludHMvXHJcbiAgICAgICAgLy8gZm9yIGRldGFpbHMgb2YgYmVsb3cgZm9ybXVsYS5cclxuICAgICAgICBjb25zdCB2YWwgPSAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC1cclxuICAgICAgICAgICAgICAgICAgICAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xyXG5cclxuICAgICAgICBpZiggdmFsID09PSAwICkgcmV0dXJuIDA7ICAvLyBjb2xpbmVhclxyXG5cclxuICAgICAgICByZXR1cm4gKHZhbCA+IDAgPyAxOiAyKTsgLy8gY2xvY2sgb3IgY291bnRlcmNsb2NrIHdpc2VcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgbWFpbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBsaW5lIHNlZ21lbnQgJ3AxcTEnXHJcbiAgICAvLyBhbmQgJ3AycTInIGludGVyc2VjdC5cclxuICAgIHB1YmxpYyBkb0ludGVyc2VjdCggcDE6IFBvaW50LCBxMTogUG9pbnQsIHAyOiBQb2ludCwgcTI6IFBvaW50IClcclxuICAgIHtcclxuICAgICAgICAvLyBGaW5kIHRoZSBmb3VyIG9yaWVudGF0aW9ucyBuZWVkZWQgZm9yIGdlbmVyYWwgYW5kXHJcbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlc1xyXG4gICAgICAgIGNvbnN0IG8xID0gdGhpcy5vcmllbnRhdGlvbiggcDEsIHExLCBwMiApO1xyXG4gICAgICAgIGNvbnN0IG8yID0gdGhpcy5vcmllbnRhdGlvbiggcDEsIHExLCBxMiApO1xyXG4gICAgICAgIGNvbnN0IG8zID0gdGhpcy5vcmllbnRhdGlvbiggcDIsIHEyLCBwMSApO1xyXG4gICAgICAgIGNvbnN0IG80ID0gdGhpcy5vcmllbnRhdGlvbiggcDIsIHEyLCBxMSApO1xyXG5cclxuICAgICAgICAvLyBHZW5lcmFsIGNhc2VcclxuICAgICAgICBpZiggbzEgIT09IG8yICYmIG8zICE9PSBvNCApIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAvLyBTcGVjaWFsIENhc2VzXHJcbiAgICAgICAgLy8gcDEsIHExIGFuZCBwMiBhcmUgY29saW5lYXIgYW5kIHAyIGxpZXMgb24gc2VnbWVudCBwMXExXHJcbiAgICAgICAgaWYoIG8xID09PSAwICYmIHRoaXMub25TZWdtZW50KHAxLCBwMiwgcTEpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gcDEsIHExIGFuZCBxMiBhcmUgY29saW5lYXIgYW5kIHEyIGxpZXMgb24gc2VnbWVudCBwMXExXHJcbiAgICAgICAgaWYgKG8yID09PSAwICYmIHRoaXMub25TZWdtZW50KHAxLCBxMiwgcTEpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gcDIsIHEyIGFuZCBwMSBhcmUgY29saW5lYXIgYW5kIHAxIGxpZXMgb24gc2VnbWVudCBwMnEyXHJcbiAgICAgICAgaWYgKG8zID09PSAwICYmIHRoaXMub25TZWdtZW50KHAyLCBwMSwgcTIpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gcDIsIHEyIGFuZCBxMSBhcmUgY29saW5lYXIgYW5kIHExIGxpZXMgb24gc2VnbWVudCBwMnEyXHJcbiAgICAgICAgaWYgKG80ID09PSAwICYmIHRoaXMub25TZWdtZW50KHAyLCBxMSwgcTIpKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBEb2Vzbid0IGZhbGwgaW4gYW55IG9mIHRoZSBhYm92ZSBjYXNlc1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJbnRlcnNlY3Rpb24oIHAxIDogUG9pbnQsIHAyIDogUG9pbnQsIHAzIDogUG9pbnQsIHA0IDogUG9pbnQgKSA6IFBvaW50XHJcbiAgICB7XHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIGRpZmZlcmVuY2VzXHJcbiAgICAgICAgbGV0ICAgeEQxID0gcDIueCAtIHAxLng7XHJcbiAgICAgICAgbGV0ICAgeUQxID0gcDIueSAtIHAxLnk7XHJcblxyXG4gICAgICAgIGxldCAgIHhEMiA9IHA0LnggLSBwMy54O1xyXG4gICAgICAgIGxldCAgIHlEMiA9IHA0LnkgLSBwMy55O1xyXG5cclxuICAgICAgICBjb25zdCB4RDMgPSBwMS54IC0gcDMueDtcclxuICAgICAgICBjb25zdCB5RDMgPSBwMS55IC0gcDMueTtcclxuXHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBsZW5ndGhzIG9mIHRoZSB0d28gbGluZXNcclxuICAgICAgICBjb25zdCBMZW4xID0gTWF0aC5zcXJ0KCB4RDEgKiB4RDEgKyB5RDEgKiB5RDEgKTtcclxuICAgICAgICBjb25zdCBMZW4yID0gTWF0aC5zcXJ0KCB4RDIgKiB4RDIgKyB5RDIgKiB5RDIgKTtcclxuXHJcbiAgICAgICAgLy8gY2FsY3VsYXRlIGFuZ2xlIGJldHdlZW4gdGhlIHR3byBsaW5lcy5cclxuICAgICAgICBjb25zdCBkb3QgPSAoeEQxICogeEQyICsgeUQxICogeUQyKTsgLy8gZG90IHByb2R1Y3RcclxuICAgICAgICBjb25zdCBkZWcgPSBkb3QgLyAoTGVuMSAqIExlbjIpO1xyXG5cclxuICAgICAgICAvLyBpZiBNYXRoLkFicyhhbmdsZSk9PTEgdGhlbiB0aGUgbGluZXMgYXJlIHBhcmFsbGVsbCxcclxuICAgICAgICAvLyBzbyBubyBpbnRlcnNlY3Rpb24gaXMgcG9zc2libGVcclxuICAgICAgICBpZiggTWF0aC5hYnMoZGVnKSA9PT0gMSApIHJldHVybiBuZXcgUG9pbnQoMCwwKTtcclxuXHJcbiAgICAgICAgLy8gZmluZCBpbnRlcnNlY3Rpb24gUHQgYmV0d2VlbiB0d28gbGluZXNcclxuICAgICAgICBjb25zdCBwdCA9IG5ldyBQb2ludCgwLCAwKTtcclxuICAgICAgICBjb25zdCBkaXYgPSB5RDIgKiB4RDEgLSB4RDIgKiB5RDE7XHJcbiAgICAgICAgY29uc3QgdWEgPSAoeEQyICogeUQzIC0geUQyICogeEQzKSAvIGRpdjtcclxuICAgICAgICBjb25zdCB1YiA9ICh4RDEgKiB5RDMgLSB5RDEgKiB4RDMpIC8gZGl2O1xyXG5cclxuICAgICAgICBwdC54ID0gcDEueCArIHVhICogeEQxO1xyXG4gICAgICAgIHB0LnkgPSBwMS55ICsgdWEgKiB5RDE7XHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgY29tYmluZWQgbGVuZ3RoIG9mIHRoZSB0d28gc2VnbWVudHNcclxuICAgICAgICAvLyBiZXR3ZWVuIFB0LXAxIGFuZCBQdC1wMlxyXG4gICAgICAgIHhEMSA9IHB0LnggLSBwMS54O1xyXG4gICAgICAgIHlEMSA9IHB0LnkgLSBwMS55O1xyXG5cclxuICAgICAgICB4RDIgPSBwdC54IC0gcDIueDtcclxuICAgICAgICB5RDIgPSBwdC55IC0gcDIueTtcclxuXHJcbiAgICAgICAgY29uc3QgbGVuMSA9IE1hdGguc3FydCh4RDEgKiB4RDEgKyB5RDEgKiB5RDEpICsgTWF0aC5zcXJ0KHhEMiAqIHhEMiArIHlEMiAqIHlEMik7XHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgY29tYmluZWQgbGVuZ3RoIG9mIHRoZSB0d28gc2VnbWVudHNcclxuICAgICAgICAvLyBiZXR3ZWVuIFB0LXAzIGFuZCBQdC1wNFxyXG4gICAgICAgIHhEMSA9IHB0LnggLSBwMy54O1xyXG4gICAgICAgIHlEMSA9IHB0LnkgLSBwMy55O1xyXG5cclxuICAgICAgICB4RDIgPSBwdC54IC0gcDQueDtcclxuICAgICAgICB5RDIgPSBwdC55IC0gcDQueTtcclxuXHJcbiAgICAgICAgY29uc3QgbGVuMiA9IE1hdGguc3FydCh4RDEgKiB4RDEgKyB5RDEgKiB5RDEpICsgTWF0aC5zcXJ0KHhEMiAqIHhEMiArIHlEMiAqIHlEMik7XHJcblxyXG4gICAgICAgIGNvbnN0ICBkaWZmMSA9IE1hdGguYWJzKExlbjEgLSBsZW4xKTtcclxuICAgICAgICBjb25zdCAgZGlmZjIgPSBNYXRoLmFicyhMZW4yIC0gbGVuMik7XHJcblxyXG4gICAgICAgIGlmKCBkaWZmMSA+IDAuMDEgfHwgZGlmZjIgPiAwLjAxICkgIHJldHVybiBuZXcgUG9pbnQoMCwwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHB0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBQb2ludFNpZGUoIHBvaW50IDogUG9pbnQsIHN0YXJ0IDogUG9pbnQsIGVuZCA6IFBvaW50ICkgOiBzdHJpbmdcclxuICAgIHtcclxuICAgICAgICBjb25zdCBEID0gKHBvaW50LnggLSBzdGFydC54KSAqIChlbmQueSAtIHN0YXJ0LnkpIC0gKHBvaW50LnkgLSBzdGFydC55KSAqIChlbmQueCAtIHN0YXJ0LngpO1xyXG5cclxuICAgICAgICBjb25zdCAgcmVzdWx0ID0gKEQgPT09IDAgPyAnSU5TSURFJyA6IChEID4gMCA/ICdSSUdIVCcgOiAnTEVGVCcpKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBSb3VuZFJlY3QoIGN0eCA6IGFueSwgeCA6IGFueSwgeSA6IGFueSwgd2lkdGggOiBhbnksIGhlaWdodCA6IGFueSwgcmFkaXVzIDogYW55LCBmaWxsIDogYW55LCBzdHJva2UgOiBhbnkgKVxyXG4gICAge1xyXG4gICAgICAgIGlmKCB0eXBlb2Ygc3Ryb2tlID09PSAndW5kZWZpbmVkJyApIHsgc3Ryb2tlID0gdHJ1ZTsgfVxyXG4gICAgICAgIGlmKCB0eXBlb2YgcmFkaXVzID09PSAndW5kZWZpbmVkJyApIHsgcmFkaXVzID0gNTsgICAgfVxyXG5cclxuICAgICAgICAvLyAtLXdpZHRoO1xyXG4gICAgICAgIC8vIC0taGVpZ2h0O1xyXG5cclxuICAgICAgICAvLyB4IC09IDAuNTtcclxuICAgICAgICAvLyB5IC09IDAuNTtcclxuXHJcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIGN0eC5tb3ZlVG8oeCArIHJhZGl1cywgeSk7XHJcbiAgICAgICAgY3R4LmxpbmVUbyh4ICsgd2lkdGggLSByYWRpdXMsIHkpO1xyXG4gICAgICAgIGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSwgeCArIHdpZHRoLCB5ICsgcmFkaXVzKTtcclxuICAgICAgICBjdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XHJcbiAgICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4ICsgd2lkdGggLSByYWRpdXMsIHkgKyBoZWlnaHQpO1xyXG4gICAgICAgIGN0eC5saW5lVG8oeCArIHJhZGl1cywgeSArIGhlaWdodCk7XHJcbiAgICAgICAgY3R4LnF1YWRyYXRpY0N1cnZlVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XHJcbiAgICAgICAgY3R4LmxpbmVUbyh4LCB5ICsgcmFkaXVzKTtcclxuICAgICAgICBjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5LCB4ICsgcmFkaXVzLCB5KTtcclxuICAgICAgICBjdHguY2xvc2VQYXRoKCk7XHJcblxyXG4gICAgICAgIGlmKCBmaWxsICAgKSBjdHguZmlsbCgpO1xyXG4gICAgICAgIGlmKCBzdHJva2UgKSBjdHguc3Ryb2tlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIE1lYXN1cmVUZXh0KCB0ZXh0IDogc3RyaW5nLCBmb250IDogc3RyaW5nLCBzdHlsZSA6IHN0cmluZyApXHJcbiAgICB7XHJcbiAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XHJcblxyXG4gICAgICAgIGRpdi5zdHlsZS5mb250ICAgICAgPSBmb250O1xyXG4gICAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiAgPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIGRpdi5zdHlsZS5sZWZ0ICAgICAgPSAnLTEwMDAnO1xyXG4gICAgICAgIGRpdi5zdHlsZS50b3AgICAgICAgPSAnLTEwMDAnO1xyXG4gICAgICAgIGRpdi5zdHlsZS5mb250U3R5bGUgPSBzdHlsZTtcclxuICAgICAgICBkaXYuaW5uZXJIVE1MICAgICAgID0gdGV4dDtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID1cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHdpZHRoIDogZGl2LmNsaWVudFdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IGRpdi5jbGllbnRIZWlnaHRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7XHJcbiAgICAgICAgZGl2ID0gbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG4iXX0=