UNPKG

@pepperi/ngx-lib

Version:

Pepperi Angular Components and Services

318 lines 39.4 kB
const FLOAT_REGEX = /^\d+(\.\d+)?$/; const THREE_DIGIT_HEX_COLOR_REGEX = /^[0-9a-fA-F]{3}$/; const THREE_DIGIT_HEX_COLOR_WITH_HASH_REGEX = /^#[0-9a-fA-F]{3}$/; const SIX_DIGIT_HEX_COLOR_REGEX = /^[0-9a-fA-F]{6}$/; const SIX_DIGIT_HEX_COLOR_WITH_HASH_REGEX = /^#[0-9a-fA-F]{6}$/; /** * Convert hex string to 6 digits hex string. * @param str The string to convert. */ export function hex2sixDigitHex(str) { if (!str) { return null; } str = str.trim(); if (SIX_DIGIT_HEX_COLOR_WITH_HASH_REGEX.test(str)) { return str; } if (SIX_DIGIT_HEX_COLOR_REGEX.test(str)) { return '#' + str; } if (THREE_DIGIT_HEX_COLOR_WITH_HASH_REGEX.test(str)) { return '#' + str[1] + str[1] + str[2] + str[2] + str[3] + str[3]; } if (THREE_DIGIT_HEX_COLOR_REGEX.test(str)) { return '#' + str[0] + str[0] + str[1] + str[1] + str[2] + str[2]; } return null; } /** * Convert rgb color to 6 digits hex string. * @param color The rgb color to convert. */ export function rgb2sixDigitHex(color) { color.r = color.r.toString(16); color.g = color.g.toString(16); color.b = color.b.toString(16); if (color.r.length === 1) { color.r = '0' + color.r; } if (color.g.length === 1) { color.g = '0' + color.g; } if (color.b.length === 1) { color.b = '0' + color.b; } return '#' + color.r + color.g + color.b; } /** * Convert hex string to rgb color. * @param str The hex string to convert. */ export function hex2rgb(str) { const sixDigitHex = hex2sixDigitHex(str); if (sixDigitHex === null) { return null; } return { r: parseInt(sixDigitHex.slice(1, 3), 16), g: parseInt(sixDigitHex.slice(3, 5), 16), b: parseInt(sixDigitHex.slice(5, 7), 16) }; } export function rgbString2hsl(str) { const sep = str.indexOf(',') > -1 ? ',' : ' '; const rgbArr = str.substr(4).split(')')[0].split(sep); const r = rgbArr[0]; const g = rgbArr[1].substr(0, rgbArr[1].length).trim(); const b = rgbArr[2].substr(0, rgbArr[2].length).trim(); return rgb2hsl({ r, g, b }); } export function rgb2hsl({ r, g, b }) { r /= 255; g /= 255; b /= 255; // Find greatest and smallest channel values const cmin = Math.min(r, g, b); const cmax = Math.max(r, g, b); const delta = cmax - cmin; let h = 0; let s = 0; let l = 0; if (delta === 0) { h = 0; } else if (cmax === r) { h = ((g - b) / delta) % 6; } else if (cmax === g) { h = (b - r) / delta + 2; } else { h = (r - g) / delta + 4; } h = Math.round(h * 60); if (h < 0) { h += 360; } l = (cmax + cmin) / 2; s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1)); s = +(s * 100).toFixed(1); l = +(l * 100).toFixed(1); return { h, s, l }; } export function hslString2hsl(str) { const sep = str.indexOf(',') > -1 ? ',' : ' '; const hslArr = str.substr(4).split(')')[0].split(sep); let h = hslArr[0]; let s = hslArr[1].substr(0, hslArr[1].length).trim(); let l = hslArr[2].substr(0, hslArr[2].length).trim(); // Strip label and convert to degrees (if necessary) if (h.indexOf('deg') > -1) { h = h.substr(0, h.length - 3); } else if (h.indexOf('rad') > -1) { h = Math.round(h.substr(0, h.length - 3) * (180 / Math.PI)); } else if (h.indexOf('turn') > -1) { h = Math.round(h.substr(0, h.length - 4) * 360); } // Keep hue fraction of 360 if ending up over if (h >= 360) { h %= 360; } // Remove the % if (s.indexOf('%') > -1) { s = s.replace(/%/g, ''); } // Remove the % if (l.indexOf('%') > -1) { l = l.replace(/%/g, ''); } return { h, s, l }; } export function hsl2rgb({ h, s, l }) { let r; let g; let b; if (!isFinite(h)) { h = 0; } if (!isFinite(s)) { s = 0; } if (!isFinite(l)) { l = 0; } h /= 60; if (h < 0) { h = 6 - (-h % 6); } h %= 6; s = Math.max(0, Math.min(1, s / 100)); l = Math.max(0, Math.min(1, l / 100)); const c = (1 - Math.abs((2 * l) - 1)) * s; const x = c * (1 - Math.abs((h % 2) - 1)); if (h < 1) { r = c; g = x; b = 0; } else if (h < 2) { r = x; g = c; b = 0; } else if (h < 3) { r = 0; g = c; b = x; } else if (h < 4) { r = 0; g = x; b = c; } else if (h < 5) { r = x; g = 0; b = c; } else { r = c; g = 0; b = x; } const m = l - c / 2; r = Math.round((r + m) * 255); g = Math.round((g + m) * 255); b = Math.round((b + m) * 255); return { r, g, b }; } export function hex2hsl(str) { const sixDigitHex = hex2sixDigitHex(str); if (sixDigitHex === null) { return null; } const rgb = hex2rgb(sixDigitHex); if (rgb === null) { return null; } return rgb2hsl(rgb); } export function hsl2hex(hsl) { const rgb = hsl2rgb(hsl); return rgb2sixDigitHex(rgb); } export function relativeLuminance({ r, g, b }) { [r, g, b] = [r, g, b].map(c => { c = c / 255; if (c <= 0.03928) { return c / 12.92; } return Math.pow((c + 0.055) / 1.055, 2.4); }); return 0.2126 * r + 0.7152 * g + 0.0722 * b; } export function contrast(str1, str2) { const L1 = relativeLuminance(hex2rgb(str1)); const L2 = relativeLuminance(hex2rgb(str2)); if (L1 < L2) { return (L2 + 0.05) / (L1 + 0.05); } return (L1 + 0.05) / (L2 + 0.05); } export function findClosestAccessibleDarkerColor(adjustableColor, otherColor, contrastRatio) { let { h, s, l } = hex2hsl(adjustableColor); if (contrast(adjustableColor, otherColor) >= contrastRatio) { return { color: adjustableColor, lightness: l }; } let minColor = hsl2hex({ h, s, l: 0 }); if (contrast(minColor, otherColor) < contrastRatio) { return null; } let min = 0; let max = l; let maxColor = hsl2hex({ h, s, l }); let lastMinColor; let lastMaxColor; while (minColor !== lastMinColor || maxColor !== lastMaxColor) { lastMinColor = minColor; lastMaxColor = maxColor; l = (min + max) / 2; adjustableColor = hsl2hex({ h, s, l }); if (contrast(adjustableColor, otherColor) < contrastRatio) { max = l; maxColor = hsl2hex({ h, s, l }); } else { min = l; minColor = hsl2hex({ h, s, l }); } } return { color: minColor, lightness: min }; } export function findClosestAccessibleLighterColor(adjustableColor, otherColor, contrastRatio) { let { h, s, l } = hex2hsl(adjustableColor); if (contrast(adjustableColor, otherColor) >= contrastRatio) { return { color: adjustableColor, lightness: l }; } let maxColor = hsl2hex({ h, s, l: 100 }); if (contrast(maxColor, otherColor) < contrastRatio) { return null; } let min = l; let max = 100; let minColor = hsl2hex({ h, s, l }); let lastMinColor; let lastMaxColor; while (minColor !== lastMinColor || maxColor !== lastMaxColor) { lastMinColor = minColor; lastMaxColor = maxColor; l = (min + max) / 2; adjustableColor = hsl2hex({ h, s, l }); if (contrast(adjustableColor, otherColor) < contrastRatio) { min = l; minColor = hsl2hex({ h, s, l }); } else { max = l; maxColor = hsl2hex({ h, s, l }); } } return { color: maxColor, lightness: max }; } export function findClosestAccessibleColor(adjustableColor, otherColor, contrastRatio) { const closestDarkerColor = findClosestAccessibleDarkerColor(adjustableColor, otherColor, contrastRatio); const closestLighterColor = findClosestAccessibleLighterColor(adjustableColor, otherColor, contrastRatio); if (closestDarkerColor === null) { if (closestLighterColor === null) { return null; } return closestLighterColor.color; } if (closestLighterColor === null) { return closestDarkerColor.color; } const { l } = hex2hsl(adjustableColor); if (closestLighterColor.lightness - l < l - closestDarkerColor.lightness) { return closestLighterColor.color; } return closestDarkerColor.color; } export function convertHslToStringHsl(hsl) { return 'hsl(' + (hsl.h < 0 ? hsl.h + 360 : hsl.h) + ', ' + hsl.s + '%, ' + hsl.l + '%)'; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2NvbG9yL2NvbG9yLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQztBQUNwQyxNQUFNLDJCQUEyQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0scUNBQXFDLEdBQUcsbUJBQW1CLENBQUM7QUFDbEUsTUFBTSx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQztBQUNyRCxNQUFNLG1DQUFtQyxHQUFHLG1CQUFtQixDQUFDO0FBbUJoRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNOLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFRCxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRWpCLElBQUksbUNBQW1DLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQy9DLE9BQU8sR0FBRyxDQUFDO0tBQ2Q7SUFFRCxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNyQyxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUM7S0FDcEI7SUFFRCxJQUFJLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqRCxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwRTtJQUVELElBQUksMkJBQTJCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZDLE9BQU8sR0FBRyxHQUFHLEdBQUcs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QUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXRDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUxQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDUCxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDVDtTQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNkLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNUO1NBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2QsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ1Q7U0FBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDZCxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDVDtTQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNkLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNUO1NBQU07UUFDSCxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNOLENBQUMsR0FBRyxDQUFDLENBQUM7S0FD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QUFDLEtBQUssQ0FBQztBQUNwQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQWE7SUFDL0MsT0FBTyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDNUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEZMT0FUX1JFR0VYID0gL15cXGQrKFxcLlxcZCspPyQvO1xyXG5jb25zdCBUSFJFRV9ESUdJVF9IRVhfQ09MT1JfUkVHRVggPSAvXlswLTlhLWZBLUZdezN9JC87XHJcbmNvbnN0IFRIUkVFX0RJR0lUX0hFWF9DT0xPUl9XSVRIX0hBU0hfUkVHRVggPSAvXiNbMC05YS1mQS1GXXszfSQvO1xyXG5jb25zdCBTSVhfRElHSVRfSEVYX0NPTE9SX1JFR0VYID0gL15bMC05YS1mQS1GXXs2fSQvO1xyXG5jb25zdCBTSVhfRElHSVRfSEVYX0NPTE9SX1dJVEhfSEFTSF9SRUdFWCA9IC9eI1swLTlhLWZBLUZdezZ9JC87XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJnYkNvbG9yIHtcclxuICAgIHI/OiBhbnk7XHJcbiAgICBnPzogYW55O1xyXG4gICAgYj86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBIc2xDb2xvciB7XHJcbiAgICBoPzogYW55O1xyXG4gICAgcz86IGFueTtcclxuICAgIGw/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2xvc2VzdENvbG9yIHtcclxuICAgIGNvbG9yOiBzdHJpbmc7XHJcbiAgICBsaWdodG5lc3M6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnQgaGV4IHN0cmluZyB0byA2IGRpZ2l0cyBoZXggc3RyaW5nLlxyXG4gKiBAcGFyYW0gc3RyIFRoZSBzdHJpbmcgdG8gY29udmVydC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBoZXgyc2l4RGlnaXRIZXgoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFzdHIpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xyXG5cclxuICAgIGlmIChTSVhfRElHSVRfSEVYX0NPTE9SX1dJVEhfSEFTSF9SRUdFWC50ZXN0KHN0cikpIHtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChTSVhfRElHSVRfSEVYX0NPTE9SX1JFR0VYLnRlc3Qoc3RyKSkge1xyXG4gICAgICAgIHJldHVybiAnIycgKyBzdHI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFRIUkVFX0RJR0lUX0hFWF9DT0xPUl9XSVRIX0hBU0hfUkVHRVgudGVzdChzdHIpKSB7XHJcbiAgICAgICAgcmV0dXJuICcjJyArIHN0clsxXSArIHN0clsxXSArIHN0clsyXSArIHN0clsyXSArIHN0clszXSArIHN0clszXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoVEhSRUVfRElHSVRfSEVYX0NPTE9SX1JFR0VYLnRlc3Qoc3RyKSkge1xyXG4gICAgICAgIHJldHVybiAnIycgKyBzdHJbMF0gKyBzdHJbMF0gKyBzdHJbMV0gKyBzdHJbMV0gKyBzdHJbMl0gKyBzdHJbMl07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IHJnYiBjb2xvciB0byA2IGRpZ2l0cyBoZXggc3RyaW5nLlxyXG4gKiBAcGFyYW0gY29sb3IgVGhlIHJnYiBjb2xvciB0byBjb252ZXJ0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJnYjJzaXhEaWdpdEhleChjb2xvcjogUmdiQ29sb3IpOiBzdHJpbmcge1xyXG4gICAgY29sb3IuciA9IGNvbG9yLnIudG9TdHJpbmcoMTYpO1xyXG4gICAgY29sb3IuZyA9IGNvbG9yLmcudG9TdHJpbmcoMTYpO1xyXG4gICAgY29sb3IuYiA9IGNvbG9yLmIudG9TdHJpbmcoMTYpO1xyXG5cclxuICAgIGlmIChjb2xvci5yLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGNvbG9yLnIgPSAnMCcgKyBjb2xvci5yO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2xvci5nLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGNvbG9yLmcgPSAnMCcgKyBjb2xvci5nO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb2xvci5iLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgIGNvbG9yLmIgPSAnMCcgKyBjb2xvci5iO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAnIycgKyBjb2xvci5yICsgY29sb3IuZyArIGNvbG9yLmI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IGhleCBzdHJpbmcgdG8gcmdiIGNvbG9yLlxyXG4gKiBAcGFyYW0gc3RyIFRoZSBoZXggc3RyaW5nIHRvIGNvbnZlcnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaGV4MnJnYihzdHI6IHN0cmluZyk6IFJnYkNvbG9yIHtcclxuICAgIGNvbnN0IHNpeERpZ2l0SGV4ID0gaGV4MnNpeERpZ2l0SGV4KHN0cik7XHJcblxyXG4gICAgaWYgKHNpeERpZ2l0SGV4ID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByOiBwYXJzZUludChzaXhEaWdpdEhleC5zbGljZSgxLCAzKSwgMTYpLFxyXG4gICAgICAgIGc6IHBhcnNlSW50KHNpeERpZ2l0SGV4LnNsaWNlKDMsIDUpLCAxNiksXHJcbiAgICAgICAgYjogcGFyc2VJbnQoc2l4RGlnaXRIZXguc2xpY2UoNSwgNyksIDE2KVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJnYlN0cmluZzJoc2woc3RyOiBzdHJpbmcpOiBIc2xDb2xvciB7XHJcbiAgICBjb25zdCBzZXAgPSBzdHIuaW5kZXhPZignLCcpID4gLTEgPyAnLCcgOiAnICc7XHJcbiAgICBjb25zdCByZ2JBcnIgPSBzdHIuc3Vic3RyKDQpLnNwbGl0KCcpJylbMF0uc3BsaXQoc2VwKTtcclxuXHJcbiAgICBjb25zdCByID0gcmdiQXJyWzBdO1xyXG4gICAgY29uc3QgZyA9IHJnYkFyclsxXS5zdWJzdHIoMCwgcmdiQXJyWzFdLmxlbmd0aCkudHJpbSgpO1xyXG4gICAgY29uc3QgYiA9IHJnYkFyclsyXS5zdWJzdHIoMCwgcmdiQXJyWzJdLmxlbmd0aCkudHJpbSgpO1xyXG5cclxuICAgIHJldHVybiByZ2IyaHNsKHsgciwgZywgYiB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJnYjJoc2woeyByLCBnLCBiIH06IFJnYkNvbG9yKTogSHNsQ29sb3Ige1xyXG4gICAgciAvPSAyNTU7XHJcbiAgICBnIC89IDI1NTtcclxuICAgIGIgLz0gMjU1O1xyXG5cclxuICAgIC8vIEZpbmQgZ3JlYXRlc3QgYW5kIHNtYWxsZXN0IGNoYW5uZWwgdmFsdWVzXHJcbiAgICBjb25zdCBjbWluID0gTWF0aC5taW4ociwgZywgYik7XHJcbiAgICBjb25zdCBjbWF4ID0gTWF0aC5tYXgociwgZywgYik7XHJcbiAgICBjb25zdCBkZWx0YSA9IGNtYXggLSBjbWluO1xyXG5cclxuICAgIGxldCBoID0gMDtcclxuICAgIGxldCBzID0gMDtcclxuICAgIGxldCBsID0gMDtcclxuXHJcbiAgICBpZiAoZGVsdGEgPT09IDApIHtcclxuICAgICAgICBoID0gMDtcclxuICAgIH0gZWxzZSBpZiAoY21heCA9PT0gcikge1xyXG4gICAgICAgIGggPSAoKGcgLSBiKSAvIGRlbHRhKSAlIDY7XHJcbiAgICB9IGVsc2UgaWYgKGNtYXggPT09IGcpIHtcclxuICAgICAgICBoID0gKGIgLSByKSAvIGRlbHRhICsgMjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaCA9IChyIC0gZykgLyBkZWx0YSArIDQ7XHJcbiAgICB9XHJcblxyXG4gICAgaCA9IE1hdGgucm91bmQoaCAqIDYwKTtcclxuXHJcbiAgICBpZiAoaCA8IDApIHtcclxuICAgICAgICBoICs9IDM2MDtcclxuICAgIH1cclxuXHJcbiAgICBsID0gKGNtYXggKyBjbWluKSAvIDI7XHJcbiAgICBzID0gZGVsdGEgPT09IDAgPyAwIDogZGVsdGEgLyAoMSAtIE1hdGguYWJzKDIgKiBsIC0gMSkpO1xyXG4gICAgcyA9ICsocyAqIDEwMCkudG9GaXhlZCgxKTtcclxuICAgIGwgPSArKGwgKiAxMDApLnRvRml4ZWQoMSk7XHJcblxyXG4gICAgcmV0dXJuIHsgaCwgcywgbCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaHNsU3RyaW5nMmhzbChzdHI6IHN0cmluZyk6IEhzbENvbG9yIHtcclxuICAgIGNvbnN0IHNlcCA9IHN0ci5pbmRleE9mKCcsJykgPiAtMSA/ICcsJyA6ICcgJztcclxuICAgIGNvbnN0IGhzbEFyciA9IHN0ci5zdWJzdHIoNCkuc3BsaXQoJyknKVswXS5zcGxpdChzZXApO1xyXG5cclxuICAgIGxldCBoOiBhbnkgPSBoc2xBcnJbMF07XHJcbiAgICBsZXQgcyA9IGhzbEFyclsxXS5zdWJzdHIoMCwgaHNsQXJyWzFdLmxlbmd0aCkudHJpbSgpO1xyXG4gICAgbGV0IGwgPSBoc2xBcnJbMl0uc3Vic3RyKDAsIGhzbEFyclsyXS5sZW5ndGgpLnRyaW0oKTtcclxuXHJcbiAgICAvLyBTdHJpcCBsYWJlbCBhbmQgY29udmVydCB0byBkZWdyZWVzIChpZiBuZWNlc3NhcnkpXHJcbiAgICBpZiAoaC5pbmRleE9mKCdkZWcnKSA+IC0xKSB7XHJcbiAgICAgICAgaCA9IGguc3Vic3RyKDAsIGgubGVuZ3RoIC0gMyk7XHJcbiAgICB9IGVsc2UgaWYgKGguaW5kZXhPZigncmFkJykgPiAtMSkge1xyXG4gICAgICAgIGggPSBNYXRoLnJvdW5kKGguc3Vic3RyKDAsIGgubGVuZ3RoIC0gMykgKiAoMTgwIC8gTWF0aC5QSSkpO1xyXG4gICAgfSBlbHNlIGlmIChoLmluZGV4T2YoJ3R1cm4nKSA+IC0xKSB7XHJcbiAgICAgICAgaCA9IE1hdGgucm91bmQoaC5zdWJzdHIoMCwgaC5sZW5ndGggLSA0KSAqIDM2MCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gS2VlcCBodWUgZnJhY3Rpb24gb2YgMzYwIGlmIGVuZGluZyB1cCBvdmVyXHJcbiAgICBpZiAoaCA+PSAzNjApIHtcclxuICAgICAgICBoICU9IDM2MDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgdGhlICVcclxuICAgIGlmIChzLmluZGV4T2YoJyUnKSA+IC0xKSB7XHJcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvJS9nLCAnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVtb3ZlIHRoZSAlXHJcbiAgICBpZiAobC5pbmRleE9mKCclJykgPiAtMSkge1xyXG4gICAgICAgIGwgPSBsLnJlcGxhY2UoLyUvZywgJycpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IGgsIHMsIGwgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhzbDJyZ2IoeyBoLCBzLCBsIH06IEhzbENvbG9yKTogUmdiQ29sb3Ige1xyXG4gICAgbGV0IHI7XHJcbiAgICBsZXQgZztcclxuICAgIGxldCBiO1xyXG5cclxuICAgIGlmICghaXNGaW5pdGUoaCkpIHtcclxuICAgICAgICBoID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWlzRmluaXRlKHMpKSB7XHJcbiAgICAgICAgcyA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc0Zpbml0ZShsKSkge1xyXG4gICAgICAgIGwgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGggLz0gNjA7XHJcblxyXG4gICAgaWYgKGggPCAwKSB7XHJcbiAgICAgICAgaCA9IDYgLSAoLWggJSA2KTtcclxuICAgIH1cclxuXHJcbiAgICBoICU9IDY7XHJcblxyXG4gICAgcyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHMgLyAxMDApKTtcclxuICAgIGwgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBsIC8gMTAwKSk7XHJcblxyXG4gICAgY29uc3QgYyA9ICgxIC0gTWF0aC5hYnMoKDIgKiBsKSAtIDEpKSAqIHM7XHJcbiAgICBjb25zdCB4ID0gYyAqICgxIC0gTWF0aC5hYnMoKGggJSAyKSAtIDEpKTtcclxuXHJcbiAgICBpZiAoaCA8IDEpIHtcclxuICAgICAgICByID0gYztcclxuICAgICAgICBnID0geDtcclxuICAgICAgICBiID0gMDtcclxuICAgIH0gZWxzZSBpZiAoaCA8IDIpIHtcclxuICAgICAgICByID0geDtcclxuICAgICAgICBnID0gYztcclxuICAgICAgICBiID0gMDtcclxuICAgIH0gZWxzZSBpZiAoaCA8IDMpIHtcclxuICAgICAgICByID0gMDtcclxuICAgICAgICBnID0gYztcclxuICAgICAgICBiID0geDtcclxuICAgIH0gZWxzZSBpZiAoaCA8IDQpIHtcclxuICAgICAgICByID0gMDtcclxuICAgICAgICBnID0geDtcclxuICAgICAgICBiID0gYztcclxuICAgIH0gZWxzZSBpZiAoaCA8IDUpIHtcclxuICAgICAgICByID0geDtcclxuICAgICAgICBnID0gMDtcclxuICAgICAgICBiID0gYztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgciA9IGM7XHJcbiAgICAgICAgZyA9IDA7XHJcbiAgICAgICAgYiA9IHg7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbSA9IGwgLSBjIC8gMjtcclxuICAgIHIgPSBNYXRoLnJvdW5kKChyICsgbSkgKiAyNTUpO1xyXG4gICAgZyA9IE1hdGgucm91bmQoKGcgKyBtKSAqIDI1NSk7XHJcbiAgICBiID0gTWF0aC5yb3VuZCgoYiArIG0pICogMjU1KTtcclxuXHJcbiAgICByZXR1cm4geyByLCBnLCBiIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoZXgyaHNsKHN0cjogc3RyaW5nKTogSHNsQ29sb3Ige1xyXG4gICAgY29uc3Qgc2l4RGlnaXRIZXggPSBoZXgyc2l4RGlnaXRIZXgoc3RyKTtcclxuXHJcbiAgICBpZiAoc2l4RGlnaXRIZXggPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZ2IgPSBoZXgycmdiKHNpeERpZ2l0SGV4KTtcclxuXHJcbiAgICBpZiAocmdiID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJnYjJoc2wocmdiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhzbDJoZXgoaHNsOiBIc2xDb2xvcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCByZ2IgPSBoc2wycmdiKGhzbCk7XHJcblxyXG4gICAgcmV0dXJuIHJnYjJzaXhEaWdpdEhleChyZ2IpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UoeyByLCBnLCBiIH06IFJnYkNvbG9yKTogbnVtYmVyIHtcclxuICAgIFtyLCBnLCBiXSA9IFtyLCBnLCBiXS5tYXAoYyA9PiB7XHJcbiAgICAgICAgYyA9IGMgLyAyNTU7XHJcblxyXG4gICAgICAgIGlmIChjIDw9IDAuMDM5MjgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGMgLyAxMi45MjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBNYXRoLnBvdygoYyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIDAuMjEyNiAqIHIgKyAwLjcxNTIgKiBnICsgMC4wNzIyICogYjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyYXN0KHN0cjE6IHN0cmluZywgc3RyMjogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IEwxID0gcmVsYXRpdmVMdW1pbmFuY2UoaGV4MnJnYihzdHIxKSk7XHJcbiAgICBjb25zdCBMMiA9IHJlbGF0aXZlTHVtaW5hbmNlKGhleDJyZ2Ioc3RyMikpO1xyXG5cclxuICAgIGlmIChMMSA8IEwyKSB7XHJcbiAgICAgICAgcmV0dXJuIChMMiArIDAuMDUpIC8gKEwxICsgMC4wNSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChMMSArIDAuMDUpIC8gKEwyICsgMC4wNSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2xvc2VzdEFjY2Vzc2libGVEYXJrZXJDb2xvcihcclxuICAgIGFkanVzdGFibGVDb2xvcjogc3RyaW5nLCBvdGhlckNvbG9yOiBzdHJpbmcsIGNvbnRyYXN0UmF0aW86IG51bWJlcik6IENsb3Nlc3RDb2xvciB7XHJcbiAgICBsZXQgeyBoLCBzLCBsIH0gPSBoZXgyaHNsKGFkanVzdGFibGVDb2xvcik7XHJcblxyXG4gICAgaWYgKGNvbnRyYXN0KGFkanVzdGFibGVDb2xvciwgb3RoZXJDb2xvcikgPj0gY29udHJhc3RSYXRpbykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbG9yOiBhZGp1c3RhYmxlQ29sb3IsXHJcbiAgICAgICAgICAgIGxpZ2h0bmVzczogbFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1pbkNvbG9yID0gaHNsMmhleCh7IGgsIHMsIGw6IDAgfSk7XHJcblxyXG4gICAgaWYgKGNvbnRyYXN0KG1pbkNvbG9yLCBvdGhlckNvbG9yKSA8IGNvbnRyYXN0UmF0aW8pIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWluID0gMDtcclxuICAgIGxldCBtYXggPSBsO1xyXG4gICAgbGV0IG1heENvbG9yID0gaHNsMmhleCh7IGgsIHMsIGwgfSk7XHJcbiAgICBsZXQgbGFzdE1pbkNvbG9yO1xyXG4gICAgbGV0IGxhc3RNYXhDb2xvcjtcclxuXHJcbiAgICB3aGlsZSAobWluQ29sb3IgIT09IGxhc3RNaW5Db2xvciB8fCBtYXhDb2xvciAhPT0gbGFzdE1heENvbG9yKSB7XHJcbiAgICAgICAgbGFzdE1pbkNvbG9yID0gbWluQ29sb3I7XHJcbiAgICAgICAgbGFzdE1heENvbG9yID0gbWF4Q29sb3I7XHJcblxyXG4gICAgICAgIGwgPSAobWluICsgbWF4KSAvIDI7XHJcbiAgICAgICAgYWRqdXN0YWJsZUNvbG9yID0gaHNsMmhleCh7IGgsIHMsIGwgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250cmFzdChhZGp1c3RhYmxlQ29sb3IsIG90aGVyQ29sb3IpIDwgY29udHJhc3RSYXRpbykge1xyXG4gICAgICAgICAgICBtYXggPSBsO1xyXG4gICAgICAgICAgICBtYXhDb2xvciA9IGhzbDJoZXgoeyBoLCBzLCBsIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1pbiA9IGw7XHJcbiAgICAgICAgICAgIG1pbkNvbG9yID0gaHNsMmhleCh7IGgsIHMsIGwgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IG1pbkNvbG9yLFxyXG4gICAgICAgIGxpZ2h0bmVzczogbWluXHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZENsb3Nlc3RBY2Nlc3NpYmxlTGlnaHRlckNvbG9yKFxyXG4gICAgYWRqdXN0YWJsZUNvbG9yOiBzdHJpbmcsIG90aGVyQ29sb3I6IHN0cmluZywgY29udHJhc3RSYXRpbzogbnVtYmVyKTogQ2xvc2VzdENvbG9yIHtcclxuICAgIGxldCB7IGgsIHMsIGwgfSA9IGhleDJoc2woYWRqdXN0YWJsZUNvbG9yKTtcclxuXHJcbiAgICBpZiAoY29udHJhc3QoYWRqdXN0YWJsZUNvbG9yLCBvdGhlckNvbG9yKSA+PSBjb250cmFzdFJhdGlvKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY29sb3I6IGFkanVzdGFibGVDb2xvcixcclxuICAgICAgICAgICAgbGlnaHRuZXNzOiBsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbWF4Q29sb3IgPSBoc2wyaGV4KHsgaCwgcywgbDogMTAwIH0pO1xyXG5cclxuICAgIGlmIChjb250cmFzdChtYXhDb2xvciwgb3RoZXJDb2xvcikgPCBjb250cmFzdFJhdGlvKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG1pbiA9IGw7XHJcbiAgICBsZXQgbWF4ID0gMTAwO1xyXG4gICAgbGV0IG1pbkNvbG9yID0gaHNsMmhleCh7IGgsIHMsIGwgfSk7XHJcbiAgICBsZXQgbGFzdE1pbkNvbG9yO1xyXG4gICAgbGV0IGxhc3RNYXhDb2xvcjtcclxuXHJcbiAgICB3aGlsZSAobWluQ29sb3IgIT09IGxhc3RNaW5Db2xvciB8fCBtYXhDb2xvciAhPT0gbGFzdE1heENvbG9yKSB7XHJcbiAgICAgICAgbGFzdE1pbkNvbG9yID0gbWluQ29sb3I7XHJcbiAgICAgICAgbGFzdE1heENvbG9yID0gbWF4Q29sb3I7XHJcblxyXG4gICAgICAgIGwgPSAobWluICsgbWF4KSAvIDI7XHJcbiAgICAgICAgYWRqdXN0YWJsZUNvbG9yID0gaHNsMmhleCh7IGgsIHMsIGwgfSk7XHJcblxyXG4gICAgICAgIGlmIChjb250cmFzdChhZGp1c3RhYmxlQ29sb3IsIG90aGVyQ29sb3IpIDwgY29udHJhc3RSYXRpbykge1xyXG4gICAgICAgICAgICBtaW4gPSBsO1xyXG4gICAgICAgICAgICBtaW5Db2xvciA9IGhzbDJoZXgoeyBoLCBzLCBsIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1heCA9IGw7XHJcbiAgICAgICAgICAgIG1heENvbG9yID0gaHNsMmhleCh7IGgsIHMsIGwgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgY29sb3I6IG1heENvbG9yLFxyXG4gICAgICAgIGxpZ2h0bmVzczogbWF4XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZENsb3Nlc3RBY2Nlc3NpYmxlQ29sb3IoXHJcbiAgICBhZGp1c3RhYmxlQ29sb3I6IHN0cmluZywgb3RoZXJDb2xvcjogc3RyaW5nLCBjb250cmFzdFJhdGlvOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgY2xvc2VzdERhcmtlckNvbG9yOiBDbG9zZXN0Q29sb3IgPVxyXG4gICAgICAgIGZpbmRDbG9zZXN0QWNjZXNzaWJsZURhcmtlckNvbG9yKGFkanVzdGFibGVDb2xvciwgb3RoZXJDb2xvciwgY29udHJhc3RSYXRpbyk7XHJcbiAgICBjb25zdCBjbG9zZXN0TGlnaHRlckNvbG9yOiBDbG9zZXN0Q29sb3IgPVxyXG4gICAgICAgIGZpbmRDbG9zZXN0QWNjZXNzaWJsZUxpZ2h0ZXJDb2xvcihhZGp1c3RhYmxlQ29sb3IsIG90aGVyQ29sb3IsIGNvbnRyYXN0UmF0aW8pO1xyXG5cclxuICAgIGlmIChjbG9zZXN0RGFya2VyQ29sb3IgPT09IG51bGwpIHtcclxuICAgICAgICBpZiAoY2xvc2VzdExpZ2h0ZXJDb2xvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjbG9zZXN0TGlnaHRlckNvbG9yLmNvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjbG9zZXN0TGlnaHRlckNvbG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGNsb3Nlc3REYXJrZXJDb2xvci5jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB7IGwgfSA9IGhleDJoc2woYWRqdXN0YWJsZUNvbG9yKTtcclxuXHJcbiAgICBpZiAoY2xvc2VzdExpZ2h0ZXJDb2xvci5saWdodG5lc3MgLSBsIDwgbCAtIGNsb3Nlc3REYXJrZXJDb2xvci5saWdodG5lc3MpIHtcclxuICAgICAgICByZXR1cm4gY2xvc2VzdExpZ2h0ZXJDb2xvci5jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xvc2VzdERhcmtlckNvbG9yLmNvbG9yO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEhzbFRvU3RyaW5nSHNsKGhzbDogSHNsQ29sb3IpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICdoc2woJyArIChoc2wuaCA8IDAgPyBoc2wuaCArIDM2MCA6IGhzbC5oKSArICcsICcgKyBoc2wucyArICclLCAnICsgaHNsLmwgKyAnJSknO1xyXG59XHJcbiJdfQ==