UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

326 lines (325 loc) 33.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var ColorUtils = /** @class */ (function () { function ColorUtils() { } /** * @param {?} value * @return {?} */ ColorUtils.isHexValue = /** * @param {?} value * @return {?} */ function (value) { var /** @type {?} */ isHexValue = /^#[0-9A-F]{6}$/i.test(value); return isHexValue; }; /** * @param {?} hex * @return {?} */ ColorUtils.hexToRGB = /** * @param {?} hex * @return {?} */ function (hex) { var /** @type {?} */ c = []; if (!hex.startsWith("#")) { c = ("#" + hex).substring(1).split(''); } else { c = hex.substring(1).split(''); } if (c.length == 3) { c = [c[0], c[0], c[1], c[1], c[2], c[2]]; } c = '0x' + c.join(''); return 'rgb(' + [(c >> 16) & 255, (c >> 8) & 255, c & 255].join(',') + ')'; }; /** * @param {?} value * @return {?} */ ColorUtils.componentToHex = /** * @param {?} value * @return {?} */ function (value) { var /** @type {?} */ hex = value.toString(16); return hex.length == 1 ? "0" + hex : hex; }; /** * @param {?} r * @param {?} g * @param {?} b * @return {?} */ ColorUtils.rgbToHex = /** * @param {?} r * @param {?} g * @param {?} b * @return {?} */ function (r, g, b) { return "#" + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b); }; /** * @param {?} hex * @param {?} percentage * @return {?} */ ColorUtils.shadeHexColor = /** * @param {?} hex * @param {?} percentage * @return {?} */ function (hex, percentage) { var /** @type {?} */ hexString = hex; if (hex.startsWith("#")) { hexString = hex.substr(1); } var /** @type {?} */ num = parseInt(hexString, 16); var /** @type {?} */ amt = Math.round(2.55 * percentage); var /** @type {?} */ R = (num >> 16) + amt; var /** @type {?} */ G = (num >> 8 & 0x00FF) + amt; var /** @type {?} */ B = (num & 0x0000FF) + amt; return '#' + (0x1000000 + (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 + (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 + (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1); }; /** * @param {?} r * @param {?} g * @param {?} b * @param {?} percentage * @return {?} */ ColorUtils.shadeRGBColor = /** * @param {?} r * @param {?} g * @param {?} b * @param {?} percentage * @return {?} */ function (r, g, b, percentage) { // let f = color.split(","); var /** @type {?} */ t = percentage < 0 ? 0 : 255; var /** @type {?} */ p = percentage < 0 ? percentage * -1 : percentage; var /** @type {?} */ R = (Math.round((t - r) * p) + r); var /** @type {?} */ RString = R + ""; if (RString.length > 3) { RString = RString.substr(0, 3); } var /** @type {?} */ G = (Math.round((t - g) * p) + g); var /** @type {?} */ GString = G + ""; if (GString.length > 3) { GString = GString.substr(0, 3); } var /** @type {?} */ B = (Math.round((t - b) * p) + b); var /** @type {?} */ BString = B + ""; if (BString.length > 3) { BString = BString.substr(0, 3); } return "rgb(" + RString + "," + GString + "," + BString + ")"; }; /** * @param {?} color1 * @param {?} color2 * @param {?} point * @return {?} */ ColorUtils.blendHexColors = /** * @param {?} color1 * @param {?} color2 * @param {?} point * @return {?} */ function (color1, color2, point) { if (color1.length == 4) { color1 = color1[1] + color1[1] + color1[2] + color1[2] + color1[3] + color1[3]; } else { color1 = color1.substring(1); } if (color2.length == 4) { color2 = color2[1] + color2[1] + color2[2] + color2[2] + color2[3] + color2[3]; } else { color2 = color2.substring(1); } // we have valid input, convert colors to rgb var /** @type {?} */ color1Array = [parseInt(color1[0] + color1[1], 16), parseInt(color1[2] + color1[3], 16), parseInt(color1[4] + color1[5], 16)]; var /** @type {?} */ color2Array = [parseInt(color2[0] + color2[1], 16), parseInt(color2[2] + color2[3], 16), parseInt(color2[4] + color2[5], 16)]; // blend var /** @type {?} */ color3 = [ (1 - point) * color1Array[0] + point * color2Array[0], (1 - point) * color1Array[1] + point * color2Array[1], (1 - point) * color1Array[2] + point * color2Array[2] ]; // convert to hex return '#' + this.componentToHex(Math.round(color3[0])) + this.componentToHex(Math.round(color3[1])) + this.componentToHex(Math.round(color3[2])); }; /** * @param {?} hueDegree * @param {?} saturation * @param {?} brightness * @return {?} */ ColorUtils.hsbToRGB = /** * @param {?} hueDegree * @param {?} saturation * @param {?} brightness * @return {?} */ function (hueDegree, saturation, brightness) { if (hueDegree < 0) { hueDegree = 0; } if (hueDegree >= 360) { hueDegree = 359; } if (saturation < 0) { saturation = 0; } if (saturation > 100) { saturation = 100; } if (brightness < 0) { brightness = 0; } if (brightness > 100) { brightness = 100; } hueDegree /= 360; saturation /= 100; brightness /= 100; var /** @type {?} */ r, /** @type {?} */ g, /** @type {?} */ b; if (saturation === 0) { r = g = b = brightness; // achromatic } else { var /** @type {?} */ hue2rgb = function (p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; }; var /** @type {?} */ q = brightness < 0.5 ? brightness * (1 + saturation) : brightness + saturation - brightness * saturation; var /** @type {?} */ p = 2 * brightness - q; r = hue2rgb(p, q, hueDegree + 1 / 3); g = hue2rgb(p, q, hueDegree); b = hue2rgb(p, q, hueDegree - 1 / 3); } var /** @type {?} */ rgbArray = [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; return "rgb(" + rgbArray[0] + "," + rgbArray[1] + "," + rgbArray[2] + ")"; }; /** * @param {?} hueDegree * @param {?} saturation * @param {?} brightness * @return {?} */ ColorUtils.hsbToHex = /** * @param {?} hueDegree * @param {?} saturation * @param {?} brightness * @return {?} */ function (hueDegree, saturation, brightness) { var /** @type {?} */ rgbString = this.hsbToRGB(hueDegree, saturation, brightness); var /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(','); return this.rgbToHex(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])); }; /** * @param {?} r * @param {?} g * @param {?} b * @return {?} */ ColorUtils.rgbToHsl = /** * @param {?} r * @param {?} g * @param {?} b * @return {?} */ function (r, g, b) { r /= 255; g /= 255; b /= 255; var /** @type {?} */ max = Math.max(r, g, b); var /** @type {?} */ min = Math.min(r, g, b); var /** @type {?} */ h, /** @type {?} */ s, /** @type {?} */ l = (max + min) / 2; if (max == min) { h = s = 0; // achromatic } else { var /** @type {?} */ d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return [h, s, l]; }; /** * @param {?} hex * @return {?} */ ColorUtils.hexToHsl = /** * @param {?} hex * @return {?} */ function (hex) { var /** @type {?} */ rgbString = this.hexToRGB(hex); var /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(','); return this.rgbToHsl(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])); }; /** * @param {?} r * @param {?} g * @param {?} b * @return {?} */ ColorUtils.rgbToHue = /** * @param {?} r * @param {?} g * @param {?} b * @return {?} */ function (r, g, b) { return Math.round(this.rgbToHsl(r, g, b)[0] * 360); }; /** * @param {?} hex * @return {?} */ ColorUtils.hexToHue = /** * @param {?} hex * @return {?} */ function (hex) { var /** @type {?} */ rgbString = this.hexToRGB(hex); var /** @type {?} */ rgb = rgbString.substring(4, rgbString.length - 1).replace(/ /g, '').split(','); return this.rgbToHue(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])); }; return ColorUtils; }()); export { ColorUtils }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sb3JVdGlscy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NoYXJlL3V0aWxzL0NvbG9yVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUE7Ozs7Ozs7SUFDa0IscUJBQVU7Ozs7Y0FBQyxLQUFhO1FBQ2xDLHFCQUFJLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7Ozs7O0lBR1IsbUJBQVE7Ozs7Y0FBQyxHQUFXO1FBQzlCLHFCQUFJLENBQUMsR0FBUSxFQUFFLENBQUM7UUFDaEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osQ0FBQyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Ozs7OztJQUdqRSx5QkFBYzs7OztjQUFDLEtBQVU7UUFDbkMscUJBQUksR0FBRyxHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7O0lBRy9CLG1CQUFROzs7Ozs7Y0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLENBQVM7UUFDbEQsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7OztJQUk1RSx3QkFBYTs7Ozs7Y0FBQyxHQUFXLEVBQUUsVUFBa0I7UUFDdkQscUJBQUksU0FBUyxHQUFXLEdBQUcsQ0FBQztRQUM1QixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QjtRQUVELHFCQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLHFCQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQztRQUN4QyxxQkFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQzFCLHFCQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLHFCQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7O0lBSTdKLHdCQUFhOzs7Ozs7O2NBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsVUFBa0I7O1FBRTNFLHFCQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqQyxxQkFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDdEQscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QscUJBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QyxxQkFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLE9BQU8sR0FBRyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQzs7Ozs7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QUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Ozs7OztJQUdQLG1CQUFROzs7O2NBQUMsR0FBVztRQUM5QixxQkFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxxQkFBSSxHQUFHLEdBQWEsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU5RixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7OztJQUdqRSxtQkFBUTs7Ozs7O2NBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTO1FBQ2xELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzs7Ozs7O0lBR3pDLG1CQUFROzs7O2NBQUMsR0FBVztRQUM5QixxQkFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxxQkFBSSxHQUFHLEdBQWEsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU5RixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztxQkF2TW5GO0lBeU1DLENBQUE7QUF6TUQsc0JBeU1DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIENvbG9yVXRpbHMge1xuICAgIHB1YmxpYyBzdGF0aWMgaXNIZXhWYWx1ZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc0hleFZhbHVlID0gL14jWzAtOUEtRl17Nn0kL2kudGVzdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGlzSGV4VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoZXhUb1JHQihoZXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBjOiBhbnkgPSBbXTtcbiAgICAgICAgaWYgKCFoZXguc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgICAgIGMgPSAoXCIjXCIgKyBoZXgpLnN1YnN0cmluZygxKS5zcGxpdCgnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjID0gaGV4LnN1YnN0cmluZygxKS5zcGxpdCgnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYy5sZW5ndGggPT0gMykge1xuICAgICAgICAgICAgYyA9IFtjWzBdLCBjWzBdLCBjWzFdLCBjWzFdLCBjWzJdLCBjWzJdXTtcbiAgICAgICAgfVxuICAgICAgICBjID0gJzB4JyArIGMuam9pbignJyk7XG5cbiAgICAgICAgcmV0dXJuICdyZ2IoJyArIFsoYyA+PiAxNikgJiAyNTUsIChjID4+IDgpICYgMjU1LCBjICYgMjU1XS5qb2luKCcsJykgKyAnKSc7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb21wb25lbnRUb0hleCh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhleDogc3RyaW5nID0gdmFsdWUudG9TdHJpbmcoMTYpO1xuXG4gICAgICAgIHJldHVybiBoZXgubGVuZ3RoID09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCIjXCIgKyB0aGlzLmNvbXBvbmVudFRvSGV4KHIpICsgdGhpcy5jb21wb25lbnRUb0hleChnKSArIHRoaXMuY29tcG9uZW50VG9IZXgoYik7XG4gICAgfVxuXG4gICAgLy8gcGVyY2VudGFnZSA9PiBhcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMFxuICAgIHB1YmxpYyBzdGF0aWMgc2hhZGVIZXhDb2xvcihoZXg6IHN0cmluZywgcGVyY2VudGFnZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhleFN0cmluZzogc3RyaW5nID0gaGV4O1xuICAgICAgICBpZiAoaGV4LnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICAgICAgICBoZXhTdHJpbmcgPSBoZXguc3Vic3RyKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG51bSA9IHBhcnNlSW50KGhleFN0cmluZywgMTYpO1xuICAgICAgICBsZXQgYW10ID0gTWF0aC5yb3VuZCgyLjU1ICogcGVyY2VudGFnZSk7XG4gICAgICAgIGxldCBSID0gKG51bSA+PiAxNikgKyBhbXQ7XG4gICAgICAgIGxldCBHID0gKG51bSA+PiA4ICYgMHgwMEZGKSArIGFtdDtcbiAgICAgICAgbGV0IEIgPSAobnVtICYgMHgwMDAwRkYpICsgYW10O1xuICAgICAgICByZXR1cm4gJyMnICsgKDB4MTAwMDAwMCArIChSIDwgMjU1ID8gUiA8IDEgPyAwIDogUiA6IDI1NSkgKiAweDEwMDAwICsgKEcgPCAyNTUgPyBHIDwgMSA/IDAgOiBHIDogMjU1KSAqIDB4MTAwICsgKEIgPCAyNTUgPyBCIDwgMSA/IDAgOiBCIDogMjU1KSkudG9TdHJpbmcoMTYpLnNsaWNlKDEpO1xuICAgIH1cblxuICAgIC8vIHBlcmNlbnRhZ2UgPT4gYXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDBcbiAgICBwdWJsaWMgc3RhdGljIHNoYWRlUkdCQ29sb3IocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgcGVyY2VudGFnZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgLy8gbGV0IGYgPSBjb2xvci5zcGxpdChcIixcIik7XG4gICAgICAgIGxldCB0ID0gcGVyY2VudGFnZSA8IDAgPyAwIDogMjU1O1xuICAgICAgICBsZXQgcCA9IHBlcmNlbnRhZ2UgPCAwID8gcGVyY2VudGFnZSAqIC0xIDogcGVyY2VudGFnZTtcbiAgICAgICAgbGV0IFIgPSAoTWF0aC5yb3VuZCgodCAtIHIpICogcCkgKyByKTtcbiAgICAgICAgbGV0IFJTdHJpbmcgPSBSICsgXCJcIjtcbiAgICAgICAgaWYgKFJTdHJpbmcubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgUlN0cmluZyA9IFJTdHJpbmcuc3Vic3RyKDAsIDMpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBHID0gKE1hdGgucm91bmQoKHQgLSBnKSAqIHApICsgZyk7XG4gICAgICAgIGxldCBHU3RyaW5nID0gRyArIFwiXCI7XG4gICAgICAgIGlmIChHU3RyaW5nLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIEdTdHJpbmcgPSBHU3RyaW5nLnN1YnN0cigwLCAzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgQiA9IChNYXRoLnJvdW5kKCh0IC0gYikgKiBwKSArIGIpO1xuICAgICAgICBsZXQgQlN0cmluZyA9IEIgKyBcIlwiO1xuICAgICAgICBpZiAoQlN0cmluZy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICBCU3RyaW5nID0gQlN0cmluZy5zdWJzdHIoMCwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJyZ2IoXCIgKyBSU3RyaW5nICsgXCIsXCIgKyBHU3RyaW5nICsgXCIsXCIgKyBCU3RyaW5nICsgXCIpXCI7XG4gICAgfVxuXG4gICAgLy8gcG9pbnQgPT4gdGhlIGRpc3RhbmNlIGZyb20gdGhlIGZpcnN0IGNvbG9yLCBhcyBhIGRlY2ltYWwgYmV0d2VlbiAwIGFuZCAxXG4gICAgcHVibGljIHN0YXRpYyBibGVuZEhleENvbG9ycyhjb2xvcjE6IHN0cmluZywgY29sb3IyOiBzdHJpbmcsIHBvaW50OiBudW1iZXIpOiBzdHJpbmcge1xuXG4gICAgICAgIGlmIChjb2xvcjEubGVuZ3RoID09IDQpIHtcbiAgICAgICAgICAgIGNvbG9yMSA9IGNvbG9yMVsxXSArIGNvbG9yMVsxXSArIGNvbG9yMVsyXSArIGNvbG9yMVsyXSArIGNvbG9yMVszXSArIGNvbG9yMVszXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbG9yMSA9IGNvbG9yMS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH0gaWYgKGNvbG9yMi5sZW5ndGggPT0gNCkge1xuICAgICAgICAgICAgY29sb3IyID0gY29sb3IyWzFdICsgY29sb3IyWzFdICsgY29sb3IyWzJdICsgY29sb3IyWzJdICsgY29sb3IyWzNdICsgY29sb3IyWzNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sb3IyID0gY29sb3IyLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlIGhhdmUgdmFsaWQgaW5wdXQsIGNvbnZlcnQgY29sb3JzIHRvIHJnYlxuICAgICAgICBsZXQgY29sb3IxQXJyYXkgPSBbcGFyc2VJbnQoY29sb3IxWzBdICsgY29sb3IxWzFdLCAxNiksIHBhcnNlSW50KGNvbG9yMVsyXSArIGNvbG9yMVszXSwgMTYpLCBwYXJzZUludChjb2xvcjFbNF0gKyBjb2xvcjFbNV0sIDE2KV07XG4gICAgICAgIGxldCBjb2xvcjJBcnJheSA9IFtwYXJzZUludChjb2xvcjJbMF0gKyBjb2xvcjJbMV0sIDE2KSwgcGFyc2VJbnQoY29sb3IyWzJdICsgY29sb3IyWzNdLCAxNiksIHBhcnNlSW50KGNvbG9yMls0XSArIGNvbG9yMls1XSwgMTYpXTtcblxuICAgICAgICAvLyBibGVuZFxuICAgICAgICBsZXQgY29sb3IzID0gW1xuICAgICAgICAgICAgKDEgLSBwb2ludCkgKiBjb2xvcjFBcnJheVswXSArIHBvaW50ICogY29sb3IyQXJyYXlbMF0sXG4gICAgICAgICAgICAoMSAtIHBvaW50KSAqIGNvbG9yMUFycmF5WzFdICsgcG9pbnQgKiBjb2xvcjJBcnJheVsxXSxcbiAgICAgICAgICAgICgxIC0gcG9pbnQpICogY29sb3IxQXJyYXlbMl0gKyBwb2ludCAqIGNvbG9yMkFycmF5WzJdXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gY29udmVydCB0byBoZXhcbiAgICAgICAgcmV0dXJuICcjJyArIHRoaXMuY29tcG9uZW50VG9IZXgoTWF0aC5yb3VuZChjb2xvcjNbMF0pKSArIHRoaXMuY29tcG9uZW50VG9IZXgoTWF0aC5yb3VuZChjb2xvcjNbMV0pKSArIHRoaXMuY29tcG9uZW50VG9IZXgoTWF0aC5yb3VuZChjb2xvcjNbMl0pKTtcbiAgICB9XG5cbiAgICAvLyBodWUgLT4gZGVncmVlIG51bWJlciBiZXR3ZWVuIDAgLSAzNTlcbiAgICAvLyBzYXR1cmF0aW9uIC0+IHBlcmNlbnRhZ2UgbnVtYmVyIGJldHdlZW4gMCAtIDEwMFxuICAgIC8vIGJyaWdodG5lc3MgLT4gcGVyY2VudGFnZSBudW1iZXIgYmV0d2VlbiAwIC0gMTAwXG4gICAgcHVibGljIHN0YXRpYyBoc2JUb1JHQihodWVEZWdyZWU6IG51bWJlciwgc2F0dXJhdGlvbjogbnVtYmVyLCBicmlnaHRuZXNzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAoaHVlRGVncmVlIDwgMCkge1xuICAgICAgICAgICAgaHVlRGVncmVlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaHVlRGVncmVlID49IDM2MCkge1xuICAgICAgICAgICAgaHVlRGVncmVlID0gMzU5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYXR1cmF0aW9uIDwgMCkge1xuICAgICAgICAgICAgc2F0dXJhdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhdHVyYXRpb24gPiAxMDApIHtcbiAgICAgICAgICAgIHNhdHVyYXRpb24gPSAxMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJyaWdodG5lc3MgPCAwKSB7XG4gICAgICAgICAgICBicmlnaHRuZXNzID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnJpZ2h0bmVzcyA+IDEwMCkge1xuICAgICAgICAgICAgYnJpZ2h0bmVzcyA9IDEwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGh1ZURlZ3JlZSAvPSAzNjA7XG4gICAgICAgIHNhdHVyYXRpb24gLz0gMTAwO1xuICAgICAgICBicmlnaHRuZXNzIC89IDEwMDtcblxuICAgICAgICBsZXQgciwgZywgYjtcbiAgICAgICAgaWYgKHNhdHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIHIgPSBnID0gYiA9IGJyaWdodG5lc3M7IC8vIGFjaHJvbWF0aWNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGh1ZTJyZ2IgPSAocDogYW55LCBxOiBhbnksIHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMCkgdCArPSAxO1xuICAgICAgICAgICAgICAgIGlmICh0ID4gMSkgdCAtPSAxO1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMSAvIDYpIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMSAvIDIpIHJldHVybiBxO1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMiAvIDMpIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcbiAgICAgICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHEgPSBicmlnaHRuZXNzIDwgMC41ID8gYnJpZ2h0bmVzcyAqICgxICsgc2F0dXJhdGlvbikgOiBicmlnaHRuZXNzICsgc2F0dXJhdGlvbiAtIGJyaWdodG5lc3MgKiBzYXR1cmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgcCA9IDIgKiBicmlnaHRuZXNzIC0gcTtcbiAgICAgICAgICAgIHIgPSBodWUycmdiKHAsIHEsIGh1ZURlZ3JlZSArIDEgLyAzKTtcbiAgICAgICAgICAgIGcgPSBodWUycmdiKHAsIHEsIGh1ZURlZ3JlZSk7XG4gICAgICAgICAgICBiID0gaHVlMnJnYihwLCBxLCBodWVEZWdyZWUgLSAxIC8gMyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmdiQXJyYXkgPSBbTWF0aC5yb3VuZChyICogMjU1KSwgTWF0aC5yb3VuZChnICogMjU1KSwgTWF0aC5yb3VuZChiICogMjU1KV07XG5cbiAgICAgICAgcmV0dXJuIFwicmdiKFwiICsgcmdiQXJyYXlbMF0gKyBcIixcIiArIHJnYkFycmF5WzFdICsgXCIsXCIgKyByZ2JBcnJheVsyXSArIFwiKVwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaHNiVG9IZXgoaHVlRGVncmVlOiBudW1iZXIsIHNhdHVyYXRpb246IG51bWJlciwgYnJpZ2h0bmVzczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJnYlN0cmluZyA9IHRoaXMuaHNiVG9SR0IoaHVlRGVncmVlLCBzYXR1cmF0aW9uLCBicmlnaHRuZXNzKTtcbiAgICAgICAgbGV0IHJnYjogc3RyaW5nW10gPSByZ2JTdHJpbmcuc3Vic3RyaW5nKDQsIHJnYlN0cmluZy5sZW5ndGggLSAxKS5yZXBsYWNlKC8gL2csICcnKS5zcGxpdCgnLCcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJnYlRvSGV4KHBhcnNlSW50KHJnYlswXSksIHBhcnNlSW50KHJnYlsxXSksIHBhcnNlSW50KHJnYlsyXSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmdiVG9Ic2wocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgciAvPSAyNTU7XG4gICAgICAgIGcgLz0gMjU1O1xuICAgICAgICBiIC89IDI1NTtcblxuICAgICAgICBsZXQgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG4gICAgICAgIGxldCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcbiAgICAgICAgbGV0IGgsIHMsIGwgPSAobWF4ICsgbWluKSAvIDI7XG5cbiAgICAgICAgaWYgKG1heCA9PSBtaW4pIHtcbiAgICAgICAgICAgIGggPSBzID0gMDsgLy8gYWNocm9tYXRpY1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGQgPSBtYXggLSBtaW47XG4gICAgICAgICAgICBzID0gbCA+IDAuNSA/IGQgLyAoMiAtIG1heCAtIG1pbikgOiBkIC8gKG1heCArIG1pbik7XG4gICAgICAgICAgICBzd2l0Y2ggKG1heCkge1xuICAgICAgICAgICAgICAgIGNhc2UgcjogaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIGc6IGggPSAoYiAtIHIpIC8gZCArIDI7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgYjogaCA9IChyIC0gZykgLyBkICsgNDsgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoIC89IDY7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2gsIHMsIGxdO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGV4VG9Ic2woaGV4OiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gICAgICAgIGxldCByZ2JTdHJpbmcgPSB0aGlzLmhleFRvUkdCKGhleCk7XG4gICAgICAgIGxldCByZ2I6IHN0cmluZ1tdID0gcmdiU3RyaW5nLnN1YnN0cmluZyg0LCByZ2JTdHJpbmcubGVuZ3RoIC0gMSkucmVwbGFjZSgvIC9nLCAnJykuc3BsaXQoJywnKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZ2JUb0hzbChwYXJzZUludChyZ2JbMF0pLCBwYXJzZUludChyZ2JbMV0pLCBwYXJzZUludChyZ2JbMl0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJnYlRvSHVlKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzLnJnYlRvSHNsKHIsIGcsIGIpWzBdICogMzYwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhleFRvSHVlKGhleDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHJnYlN0cmluZyA9IHRoaXMuaGV4VG9SR0IoaGV4KTtcbiAgICAgICAgbGV0IHJnYjogc3RyaW5nW10gPSByZ2JTdHJpbmcuc3Vic3RyaW5nKDQsIHJnYlN0cmluZy5sZW5ndGggLSAxKS5yZXBsYWNlKC8gL2csICcnKS5zcGxpdCgnLCcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJnYlRvSHVlKHBhcnNlSW50KHJnYlswXSksIHBhcnNlSW50KHJnYlsxXSksIHBhcnNlSW50KHJnYlsyXSkpO1xuICAgIH1cbn1cbiJdfQ==