UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

220 lines 26 kB
import dayjs from 'dayjs'; import { FIELD_NOT_AVAILABLE_PLACEHOLDER } from '../core/public-api'; export const CHART_LIMIT_MAX_UNIT_VALUE = 800; export function dependOnIndicatorSeries(res, indicator) { return indicator?.reduce((acc, pre) => { const values = res?.find(item => item.id === pre.id)?.result[0]?.values || []; return [ ...acc, { name: pre.name || pre.id, color: pre.color, values: values.map(item => ({ x: item[0], y: +item[1], })), }, ]; }, []); } export function dependOnDataSeries(res, indicators) { const indicator = indicators[0]; return res?.reduce((acc, pre) => { if ([indicator.id, indicator.name].includes(pre.id)) { // eslint-disable-next-line unicorn/better-regex const keys = indicator?.legend?.match(/\{\{\.(.+?)\}\}/) || [ null, indicator?.legend, ]; return [ ...acc, ...pre.result.map(item => ({ name: getMetricName(keys?.[1] || indicator.metricSourceKey, item.metric), values: item.values.map(d => ({ x: d[0], y: +d[1], })), })), ]; } return acc; }, []); } export function getMetricName(metricKey, metric) { if (!metricKey && !Object.keys(metric || {})?.length) { return FIELD_NOT_AVAILABLE_PLACEHOLDER; } if (!metricKey && metric) { return JSON.stringify(metric); } const metricKeys = metricKey?.split(','); if (metricKeys?.length > 1) { const value = metric?.[metricKeys.find(item => metric[item])]; return value || metricKey; } return metric[metricKey || '__query_id__'] || metricKey; } // 填充空数据 // eslint-disable-next-line sonarjs/cognitive-complexity export function fillNullChartData({ start, end, step }, res = [], stepLine = false) { if (!+start || !+end) { return res; } const curStart = +start; const curEnd = start + (end - start); const preX = stepLine ? { preX: dayjs(curStart) .subtract((end - start) / 6, 's') .valueOf(), } : {}; const result = [ ...(curStart === res[0]?.x ? [] : [{ x: curStart, y: null, ...preX }]), ...res, ...(res.at(-1)?.x === curEnd ? [] : [{ x: curEnd, y: null }]), ]; // query 返回数据可能存在某个时间段无数据情况,会导致前端bug // 通过 step 计算出 总数据。 // 在出现一开始数据缺失情况,先给数据添加开始时间数据,和结束时间数据。 // 在进行遍历,判读当前数据和下一跳数据事件差 是否是这个 step, // 如果不是计算出两者相差 几条数据,然后进行填充 const data = result.reduce((acc, prev, index) => { const diff = result[index + 1] && result[index + 1].x * 1000 - prev.x * 1000; const stepM = step * 1000; // 后端可能出现 +Ifn 导致成 NaN,设置为 null const curValue = { ...prev, y: isNaN(prev.y) ? null : prev.y, }; if (diff && diff !== stepM) { const total = Math.ceil(diff / stepM - 1); const data = Array.from({ length: total || 0 }) .fill(0) .reduce((old, _curr, i) => { const x = i === 0 ? prev.x * 1000 + stepM : old[i - 1].x * 1000 + stepM; return [ ...old, { x: x / 1000, y: null, ...(stepLine ? { preX: i === 0 ? result[index].x : old[i - 1].x } : {}), }, ]; }, []); return [...acc, curValue, ...data]; } return [...acc, curValue]; }, []); return data.sort((a, b) => a.x - b.x); } export function unitDealWith(data) { return data.some(item => Math.max(...item.result.map(res => Math.max(...res.values.map(d => +d[1])))) >= CHART_LIMIT_MAX_UNIT_VALUE); } export function checkInterval(time, cacheTime) { if (!time) { return false; } const lastDiff = cacheTime.end - cacheTime.start; const currDiff = time.end - time.start; if (lastDiff === currDiff) { const diffS = currDiff / (currDiff / time.step); return time.end - cacheTime.end >= diffS; } return true; } export const ChartUnitType = { CPU: 'cpu', MEMORY: 'memory', TIME: 'time', MEASURE: 'measure', Rate: 'rate', }; export const CHART_UNIT_MAP = { [ChartUnitType.CPU]: { medium: { value: 0, unit: 'unit_m', }, big: { value: 1000, unit: 'unit_core', }, }, [ChartUnitType.MEMORY]: { medium: { value: 0, unit: 'unit_Mi', }, big: { value: 1024, unit: 'unit_Gi', }, }, [ChartUnitType.TIME]: { medium: { value: 0, unit: 'ms', }, big: { value: 1000, unit: 's', }, }, [ChartUnitType.MEASURE]: { medium: { value: 0, unit: 'unit_KB', }, big: { value: 1024, unit: 'unit_MB', }, }, [ChartUnitType.Rate]: { medium: { value: 0, unit: 'Bps', }, big: { value: 1000, unit: 'Kbps', }, }, }; export function generateMetricQueryParams({ id, value, }) { return { aggregator: '', id, labels: [ { name: '__name__', value: 'custom' }, { name: 'expr', value }, ], }; } export function generateMetricQuery(expression) { return expression.map(generateMetricQueryParams); } export function handleChartUnit(metrics, type) { const data = CHART_UNIT_MAP[type]; const dealWith = unitDealWith(metrics); if (dealWith) { return { unit: data.big.unit, handleCb: (value) => +(value / data.big.value || 0).toFixed(2), dealWith, }; } return { ...data.medium, dealWith, }; } export function hasNoData(res) { return (!res || res?.length === 0 || res?.every(item => !item?.values?.length || item.values.every(d => d.y === null))); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvbWV0cmljLWNoYXJ0L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUUsK0JBQStCLEVBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQVdoRixNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxHQUFHLENBQUM7QUFFOUMsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxHQUFtQixFQUNuQixTQUFzQjtJQUV0QixPQUFPLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDcEMsTUFBTSxNQUFNLEdBQ1YsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ2pFLE9BQU87WUFDTCxHQUFHLEdBQUc7WUFDTjtnQkFDRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtnQkFDeEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO2dCQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzFCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUNWLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ1osQ0FBQyxDQUFDO2FBQ0o7U0FDRixDQUFDO0lBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsR0FBbUIsRUFDbkIsVUFBdUI7SUFFdkIsTUFBTSxTQUFT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Q0FBQyxHQUFHO1FBQ0osR0FBRyxFQUFFLE1BQU0sS0FBSyxDQUFDO1FBQ2pCLEdBQUcsRUFBRSxLQUFLLENBQ1IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FDdEUsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5cbmltcG9ydCB7IEZJRUxEX05PVF9BVkFJTEFCTEVfUExBQ0VIT0xERVIsIFN0cmluZ01hcCB9IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBDaGFydERhdGEsIENoYXJ0RGF0YUl0ZW0gfSBmcm9tICcuLi92aWV3LWNoYXJ0L3B1YmxpYy1hcGknO1xuXG5pbXBvcnQge1xuICBFeHByZXNzaW9uSXRlbSxcbiAgSW5kaWNhdG9yLFxuICBNZXRyaWNBcGlQYXJhbXMsXG4gIE1ldHJpY1F1ZXJ5SXRlbSxcbiAgTWV0cmljUmVzdWx0LFxufSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IENIQVJUX0xJTUlUX01BWF9VTklUX1ZBTFVFID0gODAwO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwZW5kT25JbmRpY2F0b3JTZXJpZXMoXG4gIHJlczogTWV0cmljUmVzdWx0W10sXG4gIGluZGljYXRvcjogSW5kaWNhdG9yW10sXG4pOiBDaGFydERhdGFbXSB7XG4gIHJldHVybiBpbmRpY2F0b3I/LnJlZHVjZSgoYWNjLCBwcmUpID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgcmVzPy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gcHJlLmlkKT8ucmVzdWx0WzBdPy52YWx1ZXMgfHwgW107XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLmFjYyxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogcHJlLm5hbWUgfHwgcHJlLmlkLFxuICAgICAgICBjb2xvcjogcHJlLmNvbG9yLFxuICAgICAgICB2YWx1ZXM6IHZhbHVlcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgIHg6IGl0ZW1bMF0sXG4gICAgICAgICAgeTogK2l0ZW1bMV0sXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSwgW10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVwZW5kT25EYXRhU2VyaWVzKFxuICByZXM6IE1ldHJpY1Jlc3VsdFtdLFxuICBpbmRpY2F0b3JzOiBJbmRpY2F0b3JbXSxcbik6IENoYXJ0RGF0YVtdIHtcbiAgY29uc3QgaW5kaWNhdG9yID0gaW5kaWNhdG9yc1swXTtcbiAgcmV0dXJuIHJlcz8ucmVkdWNlKChhY2MsIHByZSkgPT4ge1xuICAgIGlmIChbaW5kaWNhdG9yLmlkLCBpbmRpY2F0b3IubmFtZV0uaW5jbHVkZXMocHJlLmlkKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG4gICAgICBjb25zdCBrZXlzID0gaW5kaWNhdG9yPy5sZWdlbmQ/Lm1hdGNoKC9cXHtcXHtcXC4oLis/KVxcfVxcfS8pIHx8IFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAgaW5kaWNhdG9yPy5sZWdlbmQsXG4gICAgICBdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICAuLi5wcmUucmVzdWx0Lm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgbmFtZTogZ2V0TWV0cmljTmFtZShcbiAgICAgICAgICAgIGtleXM/LlsxXSB8fCBpbmRpY2F0b3IubWV0cmljU291cmNlS2V5LFxuICAgICAgICAgICAgaXRlbS5tZXRyaWMsXG4gICAgICAgICAgKSxcbiAgICAgICAgICB2YWx1ZXM6IGl0ZW0udmFsdWVzLm1hcChkID0+ICh7XG4gICAgICAgICAgICB4OiBkWzBdLFxuICAgICAgICAgICAgeTogK2RbMV0sXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9KSksXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXRyaWNOYW1lKG1ldHJpY0tleTogc3RyaW5nLCBtZXRyaWM6IFN0cmluZ01hcCkge1xuICBpZiAoIW1ldHJpY0tleSAmJiAhT2JqZWN0LmtleXMobWV0cmljIHx8IHt9KT8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIEZJRUxEX05PVF9BVkFJTEFCTEVfUExBQ0VIT0xERVI7XG4gIH1cbiAgaWYgKCFtZXRyaWNLZXkgJiYgbWV0cmljKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG1ldHJpYyk7XG4gIH1cbiAgY29uc3QgbWV0cmljS2V5cyA9IG1ldHJpY0tleT8uc3BsaXQoJywnKTtcbiAgaWYgKG1ldHJpY0tleXM/Lmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldHJpYz8uW21ldHJpY0tleXMuZmluZChpdGVtID0+IG1ldHJpY1tpdGVtXSldO1xuICAgIHJldHVybiB2YWx1ZSB8fCBtZXRyaWNLZXk7XG4gIH1cbiAgcmV0dXJuIG1ldHJpY1ttZXRyaWNLZXkgfHwgJ19fcXVlcnlfaWRfXyddIHx8IG1ldHJpY0tleTtcbn1cblxuLy8g5aGr5YWF56m65pWw5o2uXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxOdWxsQ2hhcnREYXRhKFxuICB7IHN0YXJ0LCBlbmQsIHN0ZXAgfTogTWV0cmljQXBpUGFyYW1zLFxuICByZXM6IEFycmF5PENoYXJ0RGF0YUl0ZW08eyB4OiBudW1iZXI7IHk6IG51bWJlciB9Pj4gPSBbXSxcbiAgc3RlcExpbmUgPSBmYWxzZSxcbikge1xuICBpZiAoIStzdGFydCB8fCAhK2VuZCkge1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBjb25zdCBjdXJTdGFydCA9ICtzdGFydDtcbiAgY29uc3QgY3VyRW5kID0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpO1xuICBjb25zdCBwcmVYID0gc3RlcExpbmVcbiAgICA/IHtcbiAgICAgICAgcHJlWDogZGF5anMoY3VyU3RhcnQpXG4gICAgICAgICAgLnN1YnRyYWN0KChlbmQgLSBzdGFydCkgLyA2LCAncycpXG4gICAgICAgICAgLnZhbHVlT2YoKSxcbiAgICAgIH1cbiAgICA6IHt9O1xuICBjb25zdCByZXN1bHQgPSBbXG4gICAgLi4uKGN1clN0YXJ0ID09PSByZXNbMF0/LnggPyBbXSA6IFt7IHg6IGN1clN0YXJ0LCB5OiBudWxsLCAuLi5wcmVYIH1dKSxcbiAgICAuLi5yZXMsXG4gICAgLi4uKHJlcy5hdCgtMSk/LnggPT09IGN1ckVuZCA/IFtdIDogW3sgeDogY3VyRW5kLCB5OiBudWxsIH1dKSxcbiAgXTtcblxuICAvLyBxdWVyeSDov5Tlm57mlbDmja7lj6/og73lrZjlnKjmn5DkuKrml7bpl7TmrrXml6DmlbDmja7mg4XlhrXvvIzkvJrlr7zoh7TliY3nq69idWdcbiAgLy8g6YCa6L+HIHN0ZXAg6K6h566X5Ye6IOaAu+aVsOaNruOAglxuICAvLyDlnKjlh7rnjrDkuIDlvIDlp4vmlbDmja7nvLrlpLHmg4XlhrXvvIzlhYjnu5nmlbDmja7mt7vliqDlvIDlp4vml7bpl7TmlbDmja7vvIzlkoznu5PmnZ/ml7bpl7TmlbDmja7jgIJcbiAgLy8g5Zyo6L+b6KGM6YGN5Y6G77yM5Yik6K+75b2T5YmN5pWw5o2u5ZKM5LiL5LiA6Lez5pWw5o2u5LqL5Lu25beuIOaYr+WQpuaYr+i/meS4qiBzdGVwLFxuICAvLyDlpoLmnpzkuI3mmK/orqHnrpflh7rkuKTogIXnm7jlt64g5Yeg5p2h5pWw5o2u77yM54S25ZCO6L+b6KGM5aGr5YWFXG4gIGNvbnN0IGRhdGEgPSByZXN1bHQucmVkdWNlKChhY2MsIHByZXYsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZGlmZiA9XG4gICAgICByZXN1bHRbaW5kZXggKyAxXSAmJiByZXN1bHRbaW5kZXggKyAxXS54ICogMTAwMCAtIHByZXYueCAqIDEwMDA7XG4gICAgY29uc3Qgc3RlcE0gPSBzdGVwICogMTAwMDtcbiAgICAvLyDlkI7nq6/lj6/og73lh7rnjrAgK0lmbiDlr7zoh7TmiJAgTmFO77yM6K6+572u5Li6IG51bGxcbiAgICBjb25zdCBjdXJWYWx1ZSA9IHtcbiAgICAgIC4uLnByZXYsXG4gICAgICB5OiBpc05hTihwcmV2LnkpID8gbnVsbCA6IHByZXYueSxcbiAgICB9O1xuICAgIGlmIChkaWZmICYmIGRpZmYgIT09IHN0ZXBNKSB7XG4gICAgICBjb25zdCB0b3RhbCA9IE1hdGguY2VpbChkaWZmIC8gc3RlcE0gLSAxKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBBcnJheS5mcm9tPG51bWJlcj4oeyBsZW5ndGg6IHRvdGFsIHx8IDAgfSlcbiAgICAgICAgLmZpbGwoMClcbiAgICAgICAgLnJlZHVjZSgob2xkLCBfY3VyciwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHggPVxuICAgICAgICAgICAgaSA9PT0gMCA/IHByZXYueCAqIDEwMDAgKyBzdGVwTSA6IG9sZFtpIC0gMV0ueCAqIDEwMDAgKyBzdGVwTTtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4ub2xkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB4OiB4IC8gMTAwMCxcbiAgICAgICAgICAgICAgeTogbnVsbCxcbiAgICAgICAgICAgICAgLi4uKHN0ZXBMaW5lXG4gICAgICAgICAgICAgICAgPyB7IHByZVg6IGkgPT09IDAgPyByZXN1bHRbaW5kZXhdLnggOiBvbGRbaSAtIDFdLnggfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9LCBbXSk7XG4gICAgICByZXR1cm4gWy4uLmFjYywgY3VyVmFsdWUsIC4uLmRhdGFdO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmFjYywgY3VyVmFsdWVdO1xuICB9LCBbXSk7XG4gIHJldHVybiBkYXRhLnNvcnQoKGEsIGIpID0+IGEueCAtIGIueCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bml0RGVhbFdpdGgoZGF0YTogTWV0cmljUmVzdWx0W10pIHtcbiAgcmV0dXJuIGRhdGEuc29tZShcbiAgICBpdGVtID0+XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgLi4uaXRlbS5yZXN1bHQubWFwKHJlcyA9PiBNYXRoLm1heCguLi5yZXMudmFsdWVzLm1hcChkID0+ICtkWzFdKSkpLFxuICAgICAgKSA+PSBDSEFSVF9MSU1JVF9NQVhfVU5JVF9WQUxVRSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSW50ZXJ2YWwoXG4gIHRpbWU6IE1ldHJpY0FwaVBhcmFtcyxcbiAgY2FjaGVUaW1lOiBNZXRyaWNBcGlQYXJhbXMsXG4pIHtcbiAgaWYgKCF0aW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGxhc3REaWZmID0gY2FjaGVUaW1lLmVuZCAtIGNhY2hlVGltZS5zdGFydDtcbiAgY29uc3QgY3VyckRpZmYgPSB0aW1lLmVuZCAtIHRpbWUuc3RhcnQ7XG4gIGlmIChsYXN0RGlmZiA9PT0gY3VyckRpZmYpIHtcbiAgICBjb25zdCBkaWZmUyA9IGN1cnJEaWZmIC8gKGN1cnJEaWZmIC8gdGltZS5zdGVwKTtcbiAgICByZXR1cm4gdGltZS5lbmQgLSBjYWNoZVRpbWUuZW5kID49IGRpZmZTO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY29uc3QgQ2hhcnRVbml0VHlwZSA9IHtcbiAgQ1BVOiAnY3B1JyxcbiAgTUVNT1JZOiAnbWVtb3J5JyxcbiAgVElNRTogJ3RpbWUnLFxuICBNRUFTVVJFOiAnbWVhc3VyZScsXG4gIFJhdGU6ICdyYXRlJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDaGFydFVuaXRUeXBlID0gKHR5cGVvZiBDaGFydFVuaXRUeXBlKVtrZXlvZiB0eXBlb2YgQ2hhcnRVbml0VHlwZV07XG5leHBvcnQgY29uc3QgQ0hBUlRfVU5JVF9NQVAgPSB7XG4gIFtDaGFydFVuaXRUeXBlLkNQVV06IHtcbiAgICBtZWRpdW06IHtcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgdW5pdDogJ3VuaXRfbScsXG4gICAgfSxcbiAgICBiaWc6IHtcbiAgICAgIHZhbHVlOiAxMDAwLFxuICAgICAgdW5pdDogJ3VuaXRfY29yZScsXG4gICAgfSxcbiAgfSxcbiAgW0NoYXJ0VW5pdFR5cGUuTUVNT1JZXToge1xuICAgIG1lZGl1bToge1xuICAgICAgdmFsdWU6IDAsXG4gICAgICB1bml0OiAndW5pdF9NaScsXG4gICAgfSxcbiAgICBiaWc6IHtcbiAgICAgIHZhbHVlOiAxMDI0LFxuICAgICAgdW5pdDogJ3VuaXRfR2knLFxuICAgIH0sXG4gIH0sXG4gIFtDaGFydFVuaXRUeXBlLlRJTUVdOiB7XG4gICAgbWVkaXVtOiB7XG4gICAgICB2YWx1ZTogMCxcbiAgICAgIHVuaXQ6ICdtcycsXG4gICAgfSxcbiAgICBiaWc6IHtcbiAgICAgIHZhbHVlOiAxMDAwLFxuICAgICAgdW5pdDogJ3MnLFxuICAgIH0sXG4gIH0sXG4gIFtDaGFydFVuaXRUeXBlLk1FQVNVUkVdOiB7XG4gICAgbWVkaXVtOiB7XG4gICAgICB2YWx1ZTogMCxcbiAgICAgIHVuaXQ6ICd1bml0X0tCJyxcbiAgICB9LFxuICAgIGJpZzoge1xuICAgICAgdmFsdWU6IDEwMjQsXG4gICAgICB1bml0OiAndW5pdF9NQicsXG4gICAgfSxcbiAgfSxcbiAgW0NoYXJ0VW5pdFR5cGUuUmF0ZV06IHtcbiAgICBtZWRpdW06IHtcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgdW5pdDogJ0JwcycsXG4gICAgfSxcbiAgICBiaWc6IHtcbiAgICAgIHZhbHVlOiAxMDAwLFxuICAgICAgdW5pdDogJ0ticHMnLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNZXRyaWNRdWVyeVBhcmFtcyh7XG4gIGlkLFxuICB2YWx1ZSxcbn06IEV4cHJlc3Npb25JdGVtKTogTWV0cmljUXVlcnlJdGVtIHtcbiAgcmV0dXJuIHtcbiAgICBhZ2dyZWdhdG9yOiAnJyxcbiAgICBpZCxcbiAgICBsYWJlbHM6IFtcbiAgICAgIHsgbmFtZTogJ19fbmFtZV9fJywgdmFsdWU6ICdjdXN0b20nIH0sXG4gICAgICB7IG5hbWU6ICdleHByJywgdmFsdWUgfSxcbiAgICBdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNZXRyaWNRdWVyeShleHByZXNzaW9uOiBFeHByZXNzaW9uSXRlbVtdKSB7XG4gIHJldHVybiBleHByZXNzaW9uLm1hcChnZW5lcmF0ZU1ldHJpY1F1ZXJ5UGFyYW1zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUNoYXJ0VW5pdChtZXRyaWNzOiBNZXRyaWNSZXN1bHRbXSwgdHlwZTogQ2hhcnRVbml0VHlwZSkge1xuICBjb25zdCBkYXRhID0gQ0hBUlRfVU5JVF9NQVBbdHlwZV07XG4gIGNvbnN0IGRlYWxXaXRoID0gdW5pdERlYWxXaXRoKG1ldHJpY3MpO1xuICBpZiAoZGVhbFdpdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdW5pdDogZGF0YS5iaWcudW5pdCxcbiAgICAgIGhhbmRsZUNiOiAodmFsdWU6IG51bWJlcikgPT4gKyh2YWx1ZSAvIGRhdGEuYmlnLnZhbHVlIHx8IDApLnRvRml4ZWQoMiksXG4gICAgICBkZWFsV2l0aCxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uZGF0YS5tZWRpdW0sXG4gICAgZGVhbFdpdGgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNOb0RhdGEocmVzOiBDaGFydERhdGFbXSkge1xuICByZXR1cm4gKFxuICAgICFyZXMgfHxcbiAgICByZXM/Lmxlbmd0aCA9PT0gMCB8fFxuICAgIHJlcz8uZXZlcnkoXG4gICAgICBpdGVtID0+ICFpdGVtPy52YWx1ZXM/Lmxlbmd0aCB8fCBpdGVtLnZhbHVlcy5ldmVyeShkID0+IGQueSA9PT0gbnVsbCksXG4gICAgKVxuICApO1xufVxuIl19