You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
33 KiB
209 lines
33 KiB
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
// @ts-ignore
|
|
const package_json_1 = __importDefault(require("../../../../package.json"));
|
|
/** 性能曲线:采样 + Canvas 自绘(无第三方图表依赖)。 */
|
|
exports.default = {
|
|
stopPerfSampling() {
|
|
if (this.perfTimer) {
|
|
window.clearInterval(this.perfTimer);
|
|
this.perfTimer = 0;
|
|
}
|
|
},
|
|
async samplePerf() {
|
|
var _a, _b, _c, _d, _e, _f;
|
|
if (this.state.clients <= 0) {
|
|
return;
|
|
}
|
|
try {
|
|
const s = (await Editor.Message.request(package_json_1.default.name, 'query-command', { cmd: 'get-stats' }));
|
|
if (s && typeof s === 'object') {
|
|
this.stats = {
|
|
drawCall: (_a = s.drawCall) !== null && _a !== void 0 ? _a : 0,
|
|
triangles: (_c = (_b = s.triangles) !== null && _b !== void 0 ? _b : s.triangle) !== null && _c !== void 0 ? _c : 0,
|
|
fps: (_d = s.fps) !== null && _d !== void 0 ? _d : 0,
|
|
memUsed: (_e = s.memUsed) !== null && _e !== void 0 ? _e : 0,
|
|
memTotal: (_f = s.memTotal) !== null && _f !== void 0 ? _f : 0,
|
|
};
|
|
this.perf.push({ fps: this.stats.fps, dc: this.stats.drawCall });
|
|
// 滑动窗口:满 400 条后移除最旧一条,数组恒定 400,绘制持续进行
|
|
if (this.perf.length > 400) {
|
|
this.perf.shift();
|
|
}
|
|
this.drawPerf();
|
|
}
|
|
}
|
|
catch (_g) {
|
|
/* 忽略采样失败 */
|
|
}
|
|
},
|
|
drawPerf() {
|
|
const el = this.$refs.perfCanvas;
|
|
if (!el) {
|
|
return;
|
|
}
|
|
const dpr = window.devicePixelRatio || 1;
|
|
const cw = el.clientWidth;
|
|
const ch = el.clientHeight;
|
|
if (cw <= 0 || ch <= 0) {
|
|
return;
|
|
}
|
|
const W = Math.round(cw * dpr);
|
|
const H = Math.round(ch * dpr);
|
|
if (el.width !== W || el.height !== H) {
|
|
el.width = W;
|
|
el.height = H;
|
|
}
|
|
const ctx = el.getContext('2d');
|
|
if (!ctx) {
|
|
return;
|
|
}
|
|
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
ctx.clearRect(0, 0, cw, ch);
|
|
const pts = this.perf;
|
|
// 绘图区:左右留刻度空间,顶部留 4,底部留 16 放 x 轴时间标签
|
|
const plot = { l: 36, r: cw - 44, t: 6, b: ch - 16 };
|
|
const pw = Math.max(1, plot.r - plot.l);
|
|
const ph = Math.max(1, plot.b - plot.t);
|
|
const start = Math.max(0, pts.length - 90);
|
|
const n = pts.length - start;
|
|
const stepX = pw / 90;
|
|
const xAt = (idx) => plot.l + (idx - start) * stepX;
|
|
const maxFps = 60;
|
|
const maxDc = Math.max(20, ...pts.map((p) => p.dc)) * 1.1;
|
|
const dcMax = Math.max(20, Math.ceil(maxDc / 20) * 20);
|
|
const yAt = (v, max) => plot.b - (Math.min(max, v) / max) * ph;
|
|
// ---- 网格 + 帧率轴刻度(左,绿 0/20/40/60) ----
|
|
ctx.font = '10px sans-serif';
|
|
ctx.textBaseline = 'middle';
|
|
ctx.strokeStyle = 'rgba(128,128,128,0.18)';
|
|
ctx.lineWidth = 1;
|
|
for (const v of [0, 20, 40, 60]) {
|
|
const y = Math.round(yAt(v, maxFps)) + 0.5;
|
|
ctx.beginPath();
|
|
ctx.moveTo(plot.l, y);
|
|
ctx.lineTo(plot.r, y);
|
|
ctx.stroke();
|
|
ctx.fillStyle = '#4ade80';
|
|
ctx.textAlign = 'right';
|
|
ctx.fillText(String(v), plot.l - 4, y);
|
|
}
|
|
// ---- 绘制调用轴刻度(右,黄 0/mid/max) ----
|
|
for (const v of [0, Math.round(dcMax / 2), dcMax]) {
|
|
const y = Math.round(yAt(v, dcMax)) + 0.5;
|
|
ctx.beginPath();
|
|
ctx.moveTo(plot.l, y);
|
|
ctx.lineTo(plot.r, y);
|
|
ctx.stroke();
|
|
ctx.fillStyle = '#fbbf24';
|
|
ctx.textAlign = 'left';
|
|
ctx.fillText(String(v), plot.r + 4, y);
|
|
}
|
|
// ---- x 轴时间标签(底部) ----
|
|
ctx.fillStyle = '#888';
|
|
ctx.textAlign = 'center';
|
|
ctx.fillText('-80s', xAt(start), plot.b + 9);
|
|
ctx.fillText('-60s', xAt(start + 30), plot.b + 9);
|
|
ctx.fillText('-40s', xAt(start + 60), plot.b + 9);
|
|
ctx.fillText('-20s', xAt(start + 80), plot.b + 9);
|
|
ctx.fillText('0s', plot.r, plot.b + 9);
|
|
if (n < 2) {
|
|
return;
|
|
}
|
|
// ---- Catmull-Rom → 三次贝塞尔平滑曲线 ----
|
|
const drawSeries = (get, max, color) => {
|
|
ctx.strokeStyle = color;
|
|
ctx.lineWidth = 1.5;
|
|
ctx.lineJoin = 'round';
|
|
ctx.lineCap = 'round';
|
|
ctx.beginPath();
|
|
ctx.moveTo(xAt(start), yAt(get(pts[start]), max));
|
|
if (n === 2) {
|
|
ctx.lineTo(xAt(start + 1), yAt(get(pts[start + 1]), max));
|
|
}
|
|
else {
|
|
for (let i = start; i < pts.length - 1; i++) {
|
|
const p0i = Math.max(start, i - 1);
|
|
const p2i = i + 1;
|
|
const p3i = Math.min(pts.length - 1, i + 2);
|
|
const cp1x = xAt(i) + (xAt(p2i) - xAt(p0i)) / 6;
|
|
const cp1y = yAt(get(pts[i]), max) + (yAt(get(pts[p2i]), max) - yAt(get(pts[p0i]), max)) / 6;
|
|
const cp2x = xAt(p2i) - (xAt(p3i) - xAt(i)) / 6;
|
|
const cp2y = yAt(get(pts[p2i]), max) - (yAt(get(pts[p3i]), max) - yAt(get(pts[i]), max)) / 6;
|
|
ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, xAt(p2i), yAt(get(pts[p2i]), max));
|
|
}
|
|
}
|
|
ctx.stroke();
|
|
};
|
|
drawSeries((p) => p.fps, maxFps, '#4ade80');
|
|
drawSeries((p) => p.dc, dcMax, '#fbbf24');
|
|
// ---- 悬停/点击峰值:十字线 + 圆点 + 数值提示框 ----
|
|
if (this.hoverIdx >= 0 && this.hoverIdx >= start && this.hoverIdx < pts.length) {
|
|
const p = pts[this.hoverIdx];
|
|
const x = xAt(this.hoverIdx);
|
|
ctx.strokeStyle = 'rgba(255,255,255,0.35)';
|
|
ctx.beginPath();
|
|
ctx.moveTo(Math.round(x) + 0.5, plot.t);
|
|
ctx.lineTo(Math.round(x) + 0.5, plot.b);
|
|
ctx.stroke();
|
|
const hoverSeries = [
|
|
[(p) => p.fps, maxFps, '#4ade80'],
|
|
[(p) => p.dc, dcMax, '#fbbf24'],
|
|
];
|
|
for (const [get, max, color] of hoverSeries) {
|
|
ctx.fillStyle = color;
|
|
ctx.beginPath();
|
|
ctx.arc(x, yAt(get(p), max), 3, 0, Math.PI * 2);
|
|
ctx.fill();
|
|
}
|
|
const rel = this.hoverIdx - (pts.length - 1);
|
|
const lines = [`${rel}s`, `帧率 ${p.fps}`, `绘制调用 ${p.dc}`];
|
|
const lineH = 14;
|
|
const boxW = 118;
|
|
const boxH = lines.length * lineH + 8;
|
|
let bx = plot.l + 4;
|
|
const by = plot.t + 4;
|
|
if (x + 140 > cw) {
|
|
bx = x - boxW - 8;
|
|
}
|
|
ctx.fillStyle = 'rgba(25,25,25,0.92)';
|
|
ctx.strokeStyle = 'rgba(128,128,128,0.5)';
|
|
ctx.fillRect(bx, by, boxW, boxH);
|
|
ctx.strokeRect(bx, by, boxW, boxH);
|
|
ctx.textAlign = 'left';
|
|
lines.forEach((ln, i) => {
|
|
ctx.fillStyle = i === 0 ? '#aaa' : i === 1 ? '#4ade80' : '#fbbf24';
|
|
ctx.fillText(ln, bx + 6, by + 10 + i * lineH);
|
|
});
|
|
}
|
|
},
|
|
onPerfMove(e) {
|
|
const el = this.$refs.perfCanvas;
|
|
if (!el || !this.perf.length) {
|
|
return;
|
|
}
|
|
const rect = el.getBoundingClientRect();
|
|
const cw = el.clientWidth;
|
|
// 与 drawPerf 保持一致的绘图区换算
|
|
const plotL = 36;
|
|
const plotR = cw - 44;
|
|
const stepX = Math.max(1, plotR - plotL) / 90;
|
|
const start = Math.max(0, this.perf.length - 90);
|
|
const idx = start + Math.round((e.clientX - rect.left - plotL) / stepX);
|
|
const clamped = Math.max(start, Math.min(this.perf.length - 1, idx));
|
|
if (clamped !== this.hoverIdx) {
|
|
this.hoverIdx = clamped;
|
|
this.drawPerf();
|
|
}
|
|
},
|
|
onPerfLeave() {
|
|
if (this.hoverIdx !== -1) {
|
|
this.hoverIdx = -1;
|
|
this.drawPerf();
|
|
}
|
|
},
|
|
};
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NvdXJjZS9wYW5lbHMvZGVmYXVsdC9tZXRob2RzL3BlcmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxhQUFhO0FBQ2IsNEVBQW1EO0FBRW5ELHFDQUFxQztBQUNyQyxrQkFBZTtJQUNYLGdCQUFnQjtRQUNaLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBQ0QsS0FBSyxDQUFDLFVBQVU7O1FBQ1osSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMxQixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FDbkMsc0JBQVcsQ0FBQyxJQUFXLEVBQ3ZCLGVBQXNCLEVBQ3RCLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBUyxDQUM5QixDQUFRLENBQUM7WUFDVixJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRztvQkFDVCxRQUFRLEVBQUUsTUFBQSxDQUFDLENBQUMsUUFBUSxtQ0FBSSxDQUFDO29CQUN6QixTQUFTLEVBQUUsTUFBQSxNQUFBLENBQUMsQ0FBQyxTQUFTLG1DQUFJLENBQUMsQ0FBQyxRQUFRLG1DQUFJLENBQUM7b0JBQ3pDLEdBQUcsRUFBRSxNQUFBLENBQUMsQ0FBQyxHQUFHLG1DQUFJLENBQUM7b0JBQ2YsT0FBTyxFQUFFLE1BQUEsQ0FBQyxDQUFDLE9BQU8sbUNBQUksQ0FBQztvQkFDdkIsUUFBUSxFQUFFLE1BQUEsQ0FBQyxDQUFDLFFBQVEsbUNBQUksQ0FBQztpQkFDNUIsQ0FBQztnQkFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxzQ0FBc0M7Z0JBQ3RDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDTCxDQUFDO1FBQUMsV0FBTSxDQUFDO1lBQ0wsWUFBWTtRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUNELFFBQVE7UUFDSixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQTJDLENBQUM7UUFDbEUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ04sT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDMUIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQztRQUMzQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1AsT0FBTztRQUNYLENBQUM7UUFDRCxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RCLHFDQUFxQztRQUNyQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3JELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN0QixNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQThCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN2RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2RCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQVMsRUFBRSxHQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFL0UsdUNBQXVDO1FBQ3ZDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFDN0IsR0FBRyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDNUIsR0FBRyxDQUFDLFdBQVcsR0FBRyx3QkFBd0IsQ0FBQztRQUMzQyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDM0MsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2IsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDMUIsR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFDeEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELG1DQUFtQztRQUNuQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNoQixHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCx3QkFBd0I7UUFDeEIsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFDdkIsR0FBRyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDekIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0MsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRCxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1IsT0FBTztRQUNYLENBQUM7UUFDRCxvQ0FBb0M7UUFDcEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUErQyxFQUFFLEdBQVcsRUFBRSxLQUFhLEVBQUUsRUFBRTtZQUMvRixHQUFHLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN4QixHQUFHLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUNwQixHQUFHLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN2QixHQUFHLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN0QixHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDaEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNWLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlELENBQUM7aUJBQU0sQ0FBQztnQkFDSixLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNuQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDaEQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDN0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDaEQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDN0YsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDakYsQ0FBQztZQUNMLENBQUM7WUFDRCxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1QyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTFDLHFDQUFxQztRQUNyQyxJQUFJLElBQUks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LE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0wsQ0FBQztJQUNELFdBQVc7UUFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0wsQ0FBQztDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtaWdub3JlXG5pbXBvcnQgcGFja2FnZUpTT04gZnJvbSAnLi4vLi4vLi4vLi4vcGFja2FnZS5qc29uJztcblxuLyoqIOaAp+iDveabsue6v++8mumHh+agtyArIENhbnZhcyDoh6rnu5jvvIjml6DnrKzkuInmlrnlm77ooajkvp3otZbvvInjgIIgKi9cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBzdG9wUGVyZlNhbXBsaW5nKHRoaXM6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5wZXJmVGltZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMucGVyZlRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMucGVyZlRpbWVyID0gMDtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc2FtcGxlUGVyZih0aGlzOiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuY2xpZW50cyA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSAoYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdChcbiAgICAgICAgICAgICAgICBwYWNrYWdlSlNPTi5uYW1lIGFzIGFueSxcbiAgICAgICAgICAgICAgICAncXVlcnktY29tbWFuZCcgYXMgYW55LFxuICAgICAgICAgICAgICAgIHsgY21kOiAnZ2V0LXN0YXRzJyB9IGFzIGFueSxcbiAgICAgICAgICAgICkpIGFzIGFueTtcbiAgICAgICAgICAgIGlmIChzICYmIHR5cGVvZiBzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRyYXdDYWxsOiBzLmRyYXdDYWxsID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlczogcy50cmlhbmdsZXMgPz8gcy50cmlhbmdsZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBmcHM6IHMuZnBzID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIG1lbVVzZWQ6IHMubWVtVXNlZCA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBtZW1Ub3RhbDogcy5tZW1Ub3RhbCA/PyAwLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmLnB1c2goeyBmcHM6IHRoaXMuc3RhdHMuZnBzLCBkYzogdGhpcy5zdGF0cy5kcmF3Q2FsbCB9KTtcbiAgICAgICAgICAgICAgICAvLyDmu5Hliqjnqpflj6PvvJrmu6EgNDAwIOadoeWQjuenu+mZpOacgOaXp+S4gOadoe+8jOaVsOe7hOaBkuWumiA0MDDvvIznu5jliLbmjIHnu63ov5vooYxcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wZXJmLmxlbmd0aCA+IDQwMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcmYuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kcmF3UGVyZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIOW/veeVpemHh+agt+Wksei0pSAqL1xuICAgICAgICB9XG4gICAgfSxcbiAgICBkcmF3UGVyZih0aGlzOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLiRyZWZzLnBlcmZDYW52YXMgYXMgSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkcHIgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICAgICAgICBjb25zdCBjdyA9IGVsLmNsaWVudFdpZHRoO1xuICAgICAgICBjb25zdCBjaCA9IGVsLmNsaWVudEhlaWdodDtcbiAgICAgICAgaWYgKGN3IDw9IDAgfHwgY2ggPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFcgPSBNYXRoLnJvdW5kKGN3ICogZHByKTtcbiAgICAgICAgY29uc3QgSCA9IE1hdGgucm91bmQoY2ggKiBkcHIpO1xuICAgICAgICBpZiAoZWwud2lkdGggIT09IFcgfHwgZWwuaGVpZ2h0ICE9PSBIKSB7XG4gICAgICAgICAgICBlbC53aWR0aCA9IFc7XG4gICAgICAgICAgICBlbC5oZWlnaHQgPSBIO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN0eCA9IGVsLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGlmICghY3R4KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY3R4LnNldFRyYW5zZm9ybShkcHIsIDAsIDAsIGRwciwgMCwgMCk7XG4gICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY3csIGNoKTtcbiAgICAgICAgY29uc3QgcHRzID0gdGhpcy5wZXJmO1xuICAgICAgICAvLyDnu5jlm77ljLrvvJrlt6blj7PnlZnliLvluqbnqbrpl7TvvIzpobbpg6jnlZkgNO+8jOW6lemDqOeVmSAxNiDmlL4geCDovbTml7bpl7TmoIfnrb5cbiAgICAgICAgY29uc3QgcGxvdCA9IHsgbDogMzYsIHI6IGN3IC0gNDQsIHQ6IDYsIGI6IGNoIC0gMTYgfTtcbiAgICAgICAgY29uc3QgcHcgPSBNYXRoLm1heCgxLCBwbG90LnIgLSBwbG90LmwpO1xuICAgICAgICBjb25zdCBwaCA9IE1hdGgubWF4KDEsIHBsb3QuYiAtIHBsb3QudCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgcHRzLmxlbmd0aCAtIDkwKTtcbiAgICAgICAgY29uc3QgbiA9IHB0cy5sZW5ndGggLSBzdGFydDtcbiAgICAgICAgY29uc3Qgc3RlcFggPSBwdyAvIDkwO1xuICAgICAgICBjb25zdCB4QXQgPSAoaWR4OiBudW1iZXIpID0+IHBsb3QubCArIChpZHggLSBzdGFydCkgKiBzdGVwWDtcbiAgICAgICAgY29uc3QgbWF4RnBzID0gNjA7XG4gICAgICAgIGNvbnN0IG1heERjID0gTWF0aC5tYXgoMjAsIC4uLnB0cy5tYXAoKHA6IHsgZnBzOiBudW1iZXI7IGRjOiBudW1iZXIgfSkgPT4gcC5kYykpICogMS4xO1xuICAgICAgICBjb25zdCBkY01heCA9IE1hdGgubWF4KDIwLCBNYXRoLmNlaWwobWF4RGMgLyAyMCkgKiAyMCk7XG4gICAgICAgIGNvbnN0IHlBdCA9ICh2OiBudW1iZXIsIG1heDogbnVtYmVyKSA9PiBwbG90LmIgLSAoTWF0aC5taW4obWF4LCB2KSAvIG1heCkgKiBwaDtcblxuICAgICAgICAvLyAtLS0tIOe9keagvCArIOW4p+eOh+i9tOWIu+W6pu+8iOW3pu+8jOe7vyAwLzIwLzQwLzYw77yJIC0tLS1cbiAgICAgICAgY3R4LmZvbnQgPSAnMTBweCBzYW5zLXNlcmlmJztcbiAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAncmdiYSgxMjgsMTI4LDEyOCwwLjE4KSc7XG4gICAgICAgIGN0eC5saW5lV2lkdGggPSAxO1xuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgWzAsIDIwLCA0MCwgNjBdKSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gTWF0aC5yb3VuZCh5QXQodiwgbWF4RnBzKSkgKyAwLjU7XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICBjdHgubW92ZVRvKHBsb3QubCwgeSk7XG4gICAgICAgICAgICBjdHgubGluZVRvKHBsb3QuciwgeSk7XG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gJyM0YWRlODAnO1xuICAgICAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdyaWdodCc7XG4gICAgICAgICAgICBjdHguZmlsbFRleHQoU3RyaW5nKHYpLCBwbG90LmwgLSA0LCB5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyAtLS0tIOe7mOWItuiwg+eUqOi9tOWIu+W6pu+8iOWPs++8jOm7hCAwL21pZC9tYXjvvIkgLS0tLVxuICAgICAgICBmb3IgKGNvbnN0IHYgb2YgWzAsIE1hdGgucm91bmQoZGNNYXggLyAyKSwgZGNNYXhdKSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gTWF0aC5yb3VuZCh5QXQodiwgZGNNYXgpKSArIDAuNTtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGN0eC5tb3ZlVG8ocGxvdC5sLCB5KTtcbiAgICAgICAgICAgIGN0eC5saW5lVG8ocGxvdC5yLCB5KTtcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAnI2ZiYmYyNCc7XG4gICAgICAgICAgICBjdHgudGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICAgICAgY3R4LmZpbGxUZXh0KFN0cmluZyh2KSwgcGxvdC5yICsgNCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gLS0tLSB4IOi9tOaXtumXtOagh+etvu+8iOW6lemDqO+8iSAtLS0tXG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSAnIzg4OCc7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgICAgY3R4LmZpbGxUZXh0KCctODBzJywgeEF0KHN0YXJ0KSwgcGxvdC5iICsgOSk7XG4gICAgICAgIGN0eC5maWxsVGV4dCgnLTYwcycsIHhBdChzdGFydCArIDMwKSwgcGxvdC5iICsgOSk7XG4gICAgICAgIGN0eC5maWxsVGV4dCgnLTQwcycsIHhBdChzdGFydCArIDYwKSwgcGxvdC5iICsgOSk7XG4gICAgICAgIGN0eC5maWxsVGV4dCgnLTIwcycsIHhBdChzdGFydCArIDgwKSwgcGxvdC5iICsgOSk7XG4gICAgICAgIGN0eC5maWxsVGV4dCgnMHMnLCBwbG90LnIsIHBsb3QuYiArIDkpO1xuXG4gICAgICAgIGlmIChuIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIC0tLS0gQ2F0bXVsbC1Sb20g4oaSIOS4ieasoei0neWhnuWwlOW5s+a7keabsue6vyAtLS0tXG4gICAgICAgIGNvbnN0IGRyYXdTZXJpZXMgPSAoZ2V0OiAocDogeyBmcHM6IG51bWJlcjsgZGM6IG51bWJlciB9KSA9PiBudW1iZXIsIG1heDogbnVtYmVyLCBjb2xvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAxLjU7XG4gICAgICAgICAgICBjdHgubGluZUpvaW4gPSAncm91bmQnO1xuICAgICAgICAgICAgY3R4LmxpbmVDYXAgPSAncm91bmQnO1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyh4QXQoc3RhcnQpLCB5QXQoZ2V0KHB0c1tzdGFydF0pLCBtYXgpKTtcbiAgICAgICAgICAgIGlmIChuID09PSAyKSB7XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4QXQoc3RhcnQgKyAxKSwgeUF0KGdldChwdHNbc3RhcnQgKyAxXSksIG1heCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBwdHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAwaSA9IE1hdGgubWF4KHN0YXJ0LCBpIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAyaSA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwM2kgPSBNYXRoLm1pbihwdHMubGVuZ3RoIC0gMSwgaSArIDIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcDF4ID0geEF0KGkpICsgKHhBdChwMmkpIC0geEF0KHAwaSkpIC8gNjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3AxeSA9IHlBdChnZXQocHRzW2ldKSwgbWF4KSArICh5QXQoZ2V0KHB0c1twMmldKSwgbWF4KSAtIHlBdChnZXQocHRzW3AwaV0pLCBtYXgpKSAvIDY7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNwMnggPSB4QXQocDJpKSAtICh4QXQocDNpKSAtIHhBdChpKSkgLyA2O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcDJ5ID0geUF0KGdldChwdHNbcDJpXSksIG1heCkgLSAoeUF0KGdldChwdHNbcDNpXSksIG1heCkgLSB5QXQoZ2V0KHB0c1tpXSksIG1heCkpIC8gNjtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oY3AxeCwgY3AxeSwgY3AyeCwgY3AyeSwgeEF0KHAyaSksIHlBdChnZXQocHRzW3AyaV0pLCBtYXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGRyYXdTZXJpZXMoKHApID0+IHAuZnBzLCBtYXhGcHMsICcjNGFkZTgwJyk7XG4gICAgICAgIGRyYXdTZXJpZXMoKHApID0+IHAuZGMsIGRjTWF4LCAnI2ZiYmYyNCcpO1xuXG4gICAgICAgIC8vIC0tLS0g5oKs5YGcL+eCueWHu+WzsOWAvO+8muWNgeWtl+e6vyArIOWchueCuSArIOaVsOWAvOaPkOekuuahhiAtLS0tXG4gICAgICAgIGlmICh0aGlzLmhvdmVySWR4ID49IDAgJiYgdGhpcy5ob3ZlcklkeCA+PSBzdGFydCAmJiB0aGlzLmhvdmVySWR4IDwgcHRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcCA9IHB0c1t0aGlzLmhvdmVySWR4XTtcbiAgICAgICAgICAgIGNvbnN0IHggPSB4QXQodGhpcy5ob3ZlcklkeCk7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAncmdiYSgyNTUsMjU1LDI1NSwwLjM1KSc7XG4gICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICBjdHgubW92ZVRvKE1hdGgucm91bmQoeCkgKyAwLjUsIHBsb3QudCk7XG4gICAgICAgICAgICBjdHgubGluZVRvKE1hdGgucm91bmQoeCkgKyAwLjUsIHBsb3QuYik7XG4gICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICBjb25zdCBob3ZlclNlcmllczogWyhwOiB7IGZwczogbnVtYmVyOyBkYzogbnVtYmVyIH0pID0+IG51bWJlciwgbnVtYmVyLCBzdHJpbmddW10gPSBbXG4gICAgICAgICAgICAgICAgWyhwKSA9PiBwLmZwcywgbWF4RnBzLCAnIzRhZGU4MCddLFxuICAgICAgICAgICAgICAgIFsocCkgPT4gcC5kYywgZGNNYXgsICcjZmJiZjI0J10sXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZ2V0LCBtYXgsIGNvbG9yXSBvZiBob3ZlclNlcmllcykge1xuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgY3R4LmFyYyh4LCB5QXQoZ2V0KHApLCBtYXgpLCAzLCAwLCBNYXRoLlBJICogMik7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlbCA9IHRoaXMuaG92ZXJJZHggLSAocHRzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgY29uc3QgbGluZXMgPSBbYCR7cmVsfXNgLCBg5bin546HICR7cC5mcHN9YCwgYOe7mOWItuiwg+eUqCAke3AuZGN9YF07XG4gICAgICAgICAgICBjb25zdCBsaW5lSCA9IDE0O1xuICAgICAgICAgICAgY29uc3QgYm94VyA9IDExODtcbiAgICAgICAgICAgIGNvbnN0IGJveEggPSBsaW5lcy5sZW5ndGggKiBsaW5lSCArIDg7XG4gICAgICAgICAgICBsZXQgYnggPSBwbG90LmwgKyA0O1xuICAgICAgICAgICAgY29uc3QgYnkgPSBwbG90LnQgKyA0O1xuICAgICAgICAgICAgaWYgKHggKyAxNDAgPiBjdykge1xuICAgICAgICAgICAgICAgIGJ4ID0geCAtIGJveFcgLSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDI1LDI1LDI1LDAuOTIpJztcbiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdyZ2JhKDEyOCwxMjgsMTI4LDAuNSknO1xuICAgICAgICAgICAgY3R4LmZpbGxSZWN0KGJ4LCBieSwgYm94VywgYm94SCk7XG4gICAgICAgICAgICBjdHguc3Ryb2tlUmVjdChieCwgYnksIGJveFcsIGJveEgpO1xuICAgICAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgICAgIGxpbmVzLmZvckVhY2goKGxuLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGkgPT09IDAgPyAnI2FhYScgOiBpID09PSAxID8gJyM0YWRlODAnIDogJyNmYmJmMjQnO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsVGV4dChsbiwgYnggKyA2LCBieSArIDEwICsgaSAqIGxpbmVIKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBvblBlcmZNb3ZlKHRoaXM6IGFueSwgZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMuJHJlZnMucGVyZkNhbnZhcyBhcyBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFlbCB8fCAhdGhpcy5wZXJmLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgY3cgPSBlbC5jbGllbnRXaWR0aDtcbiAgICAgICAgLy8g5LiOIGRyYXdQZXJmIOS/neaMgeS4gOiHtOeahOe7mOWbvuWMuuaNoueul1xuICAgICAgICBjb25zdCBwbG90TCA9IDM2O1xuICAgICAgICBjb25zdCBwbG90UiA9IGN3IC0gNDQ7XG4gICAgICAgIGNvbnN0IHN0ZXBYID0gTWF0aC5tYXgoMSwgcGxvdFIgLSBwbG90TCkgLyA5MDtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCB0aGlzLnBlcmYubGVuZ3RoIC0gOTApO1xuICAgICAgICBjb25zdCBpZHggPSBzdGFydCArIE1hdGgucm91bmQoKGUuY2xpZW50WCAtIHJlY3QubGVmdCAtIHBsb3RMKSAvIHN0ZXBYKTtcbiAgICAgICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KHN0YXJ0LCBNYXRoLm1pbih0aGlzLnBlcmYubGVuZ3RoIC0gMSwgaWR4KSk7XG4gICAgICAgIGlmIChjbGFtcGVkICE9PSB0aGlzLmhvdmVySWR4KSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVySWR4ID0gY2xhbXBlZDtcbiAgICAgICAgICAgIHRoaXMuZHJhd1BlcmYoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgb25QZXJmTGVhdmUodGhpczogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmhvdmVySWR4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5ob3ZlcklkeCA9IC0xO1xuICAgICAgICAgICAgdGhpcy5kcmF3UGVyZigpO1xuICAgICAgICB9XG4gICAgfSxcbn07XG4iXX0=
|