@cloudcome/utils-core
Version:
cloudcome core utils
1 lines • 25.3 kB
Source Map (JSON)
{"version":3,"file":"color.cjs","sources":["../src/color/luminance.ts","../src/color/contrast.ts","../src/color/distance.ts","../src/color/hex-rgb.ts","../src/color/helpers.ts","../src/color/rgb-hsl.ts","../src/color/hex-hsl.ts","../src/color/rgb-hsv.ts","../src/color/hex-hsv.ts","../src/color/rgb-hwb.ts","../src/color/hex-hwb.ts","../src/color/hsl-lighten.ts","../src/color/hsv-brighten.ts","../src/color/mix.ts","../src/color/rgb-xyz.ts","../src/color/xyz-lab.ts","../src/color/rgb-lab.ts","../src/color/rgb-whiter.ts"],"sourcesContent":["import type { RGB } from './types';\n\n/**\n * 计算RGB颜色的相对亮度(符合WCAG 2.1标准)\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {number} 相对亮度值(0-1之间)\n * @see https://www.w3.org/TR/WCAG21/#dfn-relative-luminance\n * @example\n * luminance({r: 255, g: 255, b: 255}) // 返回1\n */\nexport function luminance({ r, g, b }: RGB) {\n const a = [r, g, b].map((v) => {\n const vFinal = v / 255;\n return vFinal <= 0.03928 ? vFinal / 12.92 : ((vFinal + 0.055) / 1.055) ** 2.4;\n });\n return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;\n}\n","import { luminance } from './luminance';\nimport type { RGB } from './types';\n\n/**\n * 计算两个颜色之间的对比度比率(符合WCAG 2.1标准)\n * @param rgb1 第一个RGB颜色对象(分量范围0-255)\n * @param rgb2 第二个RGB颜色对象(分量范围0-255)\n * @returns {number} 对比度比率,范围1-21(1:1 到 21:1)\n * @example\n * contrast({r: 0, g: 0, b: 0}, {r: 255, g: 255, b: 255}) // 返回21\n */\nexport function contrast(rgb1: RGB, rgb2: RGB) {\n const lum1 = luminance(rgb1);\n const lum2 = luminance(rgb2);\n\n const brightest = Math.max(lum1, lum2);\n const darkest = Math.min(lum1, lum2);\n\n return (brightest + 0.05) / (darkest + 0.05);\n}\n","import type { LAB } from './types';\n\n// calculate the perceptual distance between colors in CIELAB\n// https://github.com/THEjoezack/ColorMine/blob/master/ColorMine/ColorSpaces/Comparisons/Cie94Comparison.cs\n\n/**\n * 计算两个颜色之间的距离(距离越小相似度越高),值范围 [0, 1]\n * @param {LAB} labA\n * @param {LAB} labB\n * @returns {number}\n */\nexport function distance(labA: LAB, labB: LAB) {\n const deltaL = labA.l - labB.l;\n const deltaA = labA.a - labB.a;\n const deltaB = labA.b - labB.b;\n const c1 = Math.sqrt(labA.a * labA.a + labA.b * labA.b);\n const c2 = Math.sqrt(labB.a * labB.a + labB.b * labB.b);\n const deltaC = c1 - c2;\n let deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;\n deltaH = deltaH < 0 ? 0 : Math.sqrt(deltaH);\n const sc = 1.0 + 0.045 * c1;\n const sh = 1.0 + 0.015 * c1;\n const deltaLKlsl = deltaL / 1.0;\n const deltaCkcsc = deltaC / sc;\n const deltaHkhsh = deltaH / sh;\n const i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;\n return (i < 0 ? 0 : Math.sqrt(i)) / 100;\n}\n","import type { HEX, RGB } from './types';\n\n/**\n * 将HEX颜色字符串转换为RGB颜色对象\n * @param hex HEX颜色字符串,支持3位或6位格式(例如#f00或#ff0000)\n * @returns {RGB} 对应的RGB颜色对象\n * @throws {SyntaxError} 当颜色格式不符合规范时抛出\n * @example\n * hexToRgb('#f00') // returns {r: 255, g: 0, b: 0}\n */\nexport function hexToRgb(hex: HEX): RGB {\n const reg = hex.length === 4 ? /^#(.)(.)(.)$/ : /^#(.{2})(.{2})(.{2})$/;\n const result = reg.exec(hex);\n\n if (!result) throw new SyntaxError(`颜色(${hex})表达式有误`);\n\n const [_, r, g, b] = result;\n\n return {\n r: Number.parseInt(r.padEnd(2, r), 16),\n g: Number.parseInt(g.padEnd(2, g), 16),\n b: Number.parseInt(b.padEnd(2, b), 16),\n };\n}\n\nfunction to16(n: number) {\n return Math.round(n).toString(16).padStart(2, '0');\n}\n\n/**\n * 将RGB颜色对象转换为HEX颜色字符串\n * @param rgb RGB颜色对象\n * @returns {HEX} 6位HEX颜色字符串(带#前缀)\n * @example\n * rgbToHex({r: 255, g: 0, b: 0}) // returns '#ff0000'\n */\nexport function rgbToHex(rgb: RGB): HEX {\n return `#${to16(rgb.r)}${to16(rgb.g)}${to16(rgb.b)}`;\n}\n","import type { RGB } from './types';\n\nconst { abs, min, max, round } = Math;\n\nexport function rgbToHue({ r, g, b }: RGB): [number, number, number, number] {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const rgbMax = max(r, g, b);\n const rgbMin = min(r, g, b);\n const rgbDiff = rgbMax - rgbMin;\n const h =\n rgbDiff === 0\n ? 0\n : rgbDiff && rgbMax === r\n ? (g - b) / rgbDiff\n : rgbMax === g\n ? 2 + (b - r) / rgbDiff\n : 4 + (r - g) / rgbDiff;\n\n return [60 * (h < 0 ? h + 6 : h), rgbMax, rgbMin, rgbDiff];\n}\n","// @ref https://www.w3schools.com/lib/w3color.js\nimport { rgbToHue } from './helpers';\nimport type { HSL, RGB } from './types';\n\nconst { abs, min, max, round } = Math;\n\n/**\n * 将RGB颜色转换为HSL颜色空间\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {HSL} HSL颜色对象,其中:\n * h: 色相(0-360度)\n * s: 饱和度(0-100%)\n * l: 亮度(0-100%)\n * @example\n * rgbToHsl({r: 255, g: 0, b: 0}) // returns {h: 0, s: 100, l: 50}\n */\nexport function rgbToHsl(rgb: RGB): HSL {\n const [hue, max, min, diff] = rgbToHue(rgb);\n const l = (2 * max - diff) / 2;\n const s = min === max ? 0 : l < 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min);\n\n return {\n h: hue,\n s: s * 100,\n l: l * 100,\n };\n}\n\n// @ref https://www.30secondsofcode.org/js/s/hsl-to-rgb/\n/**\n * 将HSL颜色转换回RGB颜色空间\n * @param hsl HSL颜色对象\n * @param hsl.h 色相(0-360度)\n * @param hsl.s 饱和度(0-100%)\n * @param hsl.l 亮度(0-100%)\n * @returns {RGB} RGB颜色对象(分量范围0-255)\n * @example\n * hslToRgb({h: 0, s: 100, l: 50}) // returns {r: 255, g: 0, b: 0}\n */\nexport function hslToRgb({ h, s, l }: HSL): RGB {\n s /= 100;\n l /= 100;\n\n const a = s * min(l, 1 - l);\n const k = (n: number) => (n + h / 30) % 12;\n const f = (n: number) => l - a * max(-1, min(k(n) - 3, min(9 - k(n), 1)));\n\n return {\n r: 255 * f(0),\n g: 255 * f(8),\n b: 255 * f(4),\n };\n}\n","import { hexToRgb, rgbToHex } from './hex-rgb';\nimport { hslToRgb, rgbToHsl } from './rgb-hsl';\nimport type { HEX, HSL } from './types';\n\nexport function hslToHex(hsl: HSL): HEX {\n return rgbToHex(hslToRgb(hsl));\n}\n\nexport function hexToHsl(hex: HEX): HSL {\n return rgbToHsl(hexToRgb(hex));\n}\n","import { rgbToHue } from './helpers';\nimport type { HSV, RGB } from './types';\n\nconst { abs, min, max, round } = Math;\n\n// @ref https://www.30secondsofcode.org/js/s/rgb-to-hsb/\n/**\n * 将RGB颜色转换为HSV颜色空间\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {HSV} HSV颜色对象:\n * h: 色相(0-360度)\n * s: 饱和度(0-100%)\n * v: 明度(0-100%)\n * @see https://en.wikipedia.org/wiki/HSL_and_HSV\n * @example\n * rgbToHsv({r: 255, g: 0, b: 0}) // {h: 0, s: 100, v: 100}\n */\nexport function rgbToHsv(rgb: RGB): HSV {\n const [hue, max, min, diff] = rgbToHue(rgb);\n\n return {\n h: hue,\n s: max && (diff / max) * 100,\n v: max * 100,\n };\n}\n\n// @ref https://www.30secondsofcode.org/js/s/hsb-to-rgb/\n/**\n * 将HSV颜色转换回RGB颜色空间\n * @param hsv HSV颜色对象\n * @param hsv.h 色相(0-360度)\n * @param hsv.s 饱和度(0-100%)\n * @param hsv.v 明度(0-100%)\n * @returns {RGB} RGB颜色对象(分量范围0-255)\n * @see https://www.rapidtables.com/convert/color/hsv-to-rgb.html\n * @example\n * hsvToRgb({h: 0, s: 100, v: 100}) // {r: 255, g: 0, b: 0}\n */\nexport function hsvToRgb({ h, s, v }: HSV): RGB {\n s /= 100;\n v /= 100;\n\n const k = (n: number) => (n + h / 60) % 6;\n const f = (n: number) => v * (1 - s * max(0, min(k(n), 4 - k(n), 1)));\n\n return {\n r: 255 * f(5),\n g: 255 * f(3),\n b: 255 * f(1),\n };\n}\n","import { hexToRgb, rgbToHex } from './hex-rgb';\nimport { hsvToRgb, rgbToHsv } from './rgb-hsv';\nimport type { HEX, HSV } from './types';\n\n/**\n * 将HEX颜色转换为HSV颜色空间\n * @param hex HEX颜色字符串(支持3位或6位格式)\n * @returns {HSV} HSV颜色对象,包含:\n * h: 色相(0-360度)\n * s: 饱和度(0-100%)\n * v: 明度(0-100%)\n * @example\n * hexToHsv('#ff0000') // returns {h: 0, s: 100, v: 100}\n */\nexport function hexToHsv(hex: HEX): HSV {\n return rgbToHsv(hexToRgb(hex));\n}\n\n/**\n * 将HSV颜色转换回HEX字符串\n * @param hsv HSV颜色对象\n * @returns {HEX} 6位HEX颜色字符串(带#前缀)\n * @example\n * hsvToHex({h: 0, s: 100, v: 100}) // returns '#ff0000'\n */\nexport function hsvToHex(hsv: HSV): HEX {\n return rgbToHex(hsvToRgb(hsv));\n}\n","import { rgbToHue } from './helpers';\nimport { hslToRgb } from './rgb-hsl';\nimport type { HWB, RGB } from './types';\n\n/**\n * 将RGB颜色转换为HWB颜色空间\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {HWB} HWB颜色对象:\n * h: 色相(0-360度)\n * w: 白度(0-100%)\n * b: 黑度(0-100%)\n * @see https://www.w3.org/TR/css-color-4/#hwb-to-rgb\n * @example\n * rgbToHwb({r: 255, g: 0, b: 0}) // {h: 0, w: 0, b: 0}\n */\nexport function rgbToHwb(rgb: RGB): HWB {\n const [hue, max, min, diff] = rgbToHue(rgb);\n return {\n h: hue,\n w: min * 100,\n b: (1 - max) * 100,\n };\n}\n\n// @ref https://www.w3schools.com/lib/w3color.js\n/**\n * 将HWB颜色转换回RGB颜色空间\n * @param hwb HWB颜色对象\n * @param hwb.h 色相(0-360度)\n * @param hwb.w 白度(0-100%)\n * @param hwb.b 黑度(0-100%)\n * @returns {RGB} RGB颜色对象(分量范围0-255)\n * @see https://en.wikipedia.org/wiki/HWB_color_model\n * @example\n * hwbToRgb({h: 0, w: 0, b: 0}) // {r: 255, g: 0, b: 0}\n */\nexport function hwbToRgb({ h, w: white, b: black }: HWB) {\n white /= 100;\n black /= 100;\n\n const { r, g, b } = hslToRgb({ h, s: 100, l: 50 });\n const tot = white + black;\n\n if (tot > 1) {\n white = white / tot;\n black = black / tot;\n }\n\n const f = (n: number) => ((n / 255) * (1 - white - black) + white) * 255;\n\n return {\n r: f(r),\n g: f(g),\n b: f(b),\n };\n}\n","import { hexToRgb, rgbToHex } from './hex-rgb';\nimport { hwbToRgb, rgbToHwb } from './rgb-hwb';\nimport type { HEX, HWB } from './types';\n\n/**\n * 将HWB颜色转换为HEX字符串\n * @param hwb HWB颜色对象\n * @param hwb.h 色相(0-360度)\n * @param hwb.w 白度(0-100%)\n * @param hwb.b 黑度(0-100%)\n * @returns {HEX} 6位HEX颜色字符串(带#前缀)\n * @example\n * hwbToHex({h: 0, w: 0, b: 0}) // returns '#ff0000'\n */\nexport function hwbToHex(hwb: HWB): HEX {\n return rgbToHex(hwbToRgb(hwb));\n}\n\n/**\n * 将HEX颜色转换为HWB颜色空间\n * @param hex HEX颜色字符串(支持3位或6位格式)\n * @returns {HWB} HWB颜色对象,包含:\n * h: 色相(0-360度)\n * w: 白度(0-100%)\n * b: 黑度(0-100%)\n * @example\n * hexToHwb('#ff0000') // returns {h: 0, w: 0, b: 0}\n */\nexport function hexToHwb(hex: HEX): HWB {\n return rgbToHwb(hexToRgb(hex));\n}\n","import type { HSL } from './types';\n\n/**\n * 通过HSL颜色空间调整颜色亮度\n * @param hsl 原始 HSL 颜色\n * @param value 亮度调整系数(0-1之间,0.1表示增加10%亮度)\n * @returns {HSL} 调整后的 HSL 颜色\n * @example\n * hslLighten({h: 300, s: 33, l: 44}, 0.2) // 返回亮度增加20%后的颜色\n */\nexport function hslLighten(hsl: HSL, value: number): HSL {\n const hslFinal = { ...hsl };\n hslFinal.l = hslFinal.l * (1 + value);\n return hslFinal;\n}\n","import type { HSV } from './types';\n\n/**\n * 通过HSV颜色空间调整颜色明度\n * @param hsv 原始HSV颜色对象\n * @param value 明度调整系数(-1到1之间):\n * - 正值增加明度(如0.2表示+20%)\n * - 负值降低明度(如-0.1表示-10%)\n * @returns {HSV} 调整后的HSV颜色对象(v值范围0-100%)\n * @example\n * hsvBrighten({h: 0, s: 100, v: 50}, 0.3) // 返回{h: 0, s: 100, v: 65}\n */\nexport function hsvBrighten(hsv: HSV, value: number): HSV {\n const hsvFinal = { ...hsv };\n hsvFinal.v = hsvFinal.v * (1 + value);\n return hsvFinal;\n}\n","import type { HSL, HSV, RGB } from './types';\n\n/**\n * 颜色混合函数(支持RGB/HSL/HSV色彩模型)\n * @template T 颜色类型,支持RGB、HSL或HSV对象\n * @param {T} a 第一个颜色对象\n * @param {T} b 第二个颜色对象\n * @param {number} [weight=0.5] 混合权重(0-1之间):\n * - 0 表示完全使用第一个颜色\n * - 1 表示完全使用第二个颜色\n * @returns {T} 线性混合后的新颜色对象\n * @example\n * // RGB混合示例\n * mix({r: 255, g: 0, b: 0}, {r: 0, g: 0, b: 255}, 0.5) // 返回紫色\n *\n * // HSL混合示例\n * mix({h: 0, s: 100, l: 50}, {h: 120, s: 100, l: 50}, 0.3)\n */\nexport function mix<T extends RGB | HSV | HSL>(a: T, b: T, weight = 0.5): T {\n return Object.keys(a).reduce((acc, key) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n acc[key] = (b[key] - a[key]) * weight + a[key];\n return acc;\n }, {} as T);\n}\n","// https://stackoverflow.com/a/73998199\n\nimport type { RGB, XYZ } from './types';\n\n/**\n * 将RGB颜色转换为CIE 1931 XYZ颜色空间(D65白点,2°观察者)\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {XYZ} XYZ颜色对象:\n * x: 约0-95.047\n * y: 约0-100.0\n * z: 约0-108.883\n * @see https://en.wikipedia.org/wiki/CIE_1931_color_space\n * @example\n * rgbToXyz({r: 255, g: 255, b: 255}) // {x: 95.047, y: 100.0, z: 108.883}\n */\nexport function rgbToXyz(rgb: RGB): XYZ {\n const { r, g, b } = rgb;\n const [var_R, var_G, var_B] = [r, g, b]\n .map((x) => x / 255)\n .map((x) => (x > 0.04045 ? ((x + 0.055) / 1.055) ** 2.4 : x / 12.92))\n .map((x) => x * 100);\n\n return {\n // Observer. = 2°, Illuminant = D65\n x: var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805,\n y: var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722,\n z: var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505,\n };\n}\n\n/**\n * 将XYZ颜色转换回RGB颜色空间(可能超出常规范围)\n * @param xyz XYZ颜色对象\n * @returns {RGB} RGB颜色对象(分量可能超出0-255范围)\n * @see https://www.brucelindbloom.com/index.html?Eqn_XYZ_to_RGB.html\n * @example\n * xyzToRgb({x: 95.047, y: 100.0, z: 108.883}) // {r: 255, g: 255, b: 255}\n */\nexport function xyzToRgb(xyz: XYZ): RGB {\n const { x, y, z } = xyz;\n\n //X, Y and Z input refer to a D65/2° standard illuminant.\n //sR, sG and sB (standard RGB) output range = 0 ÷ 255\n\n const var_X = x / 100;\n const var_Y = y / 100;\n const var_Z = z / 100;\n\n const var_R = var_X * 3.2406 + var_Y * -1.5372 + var_Z * -0.4986;\n const var_G = var_X * -0.9689 + var_Y * 1.8758 + var_Z * 0.0415;\n const var_B = var_X * 0.0557 + var_Y * -0.204 + var_Z * 1.057;\n\n const [r, g, b] = [var_R, var_G, var_B]\n .map((n) => (n > 0.0031308 ? 1.055 * n ** (1 / 2.4) - 0.055 : 12.92 * n))\n .map((n) => n * 255);\n\n return {\n r,\n g,\n b,\n };\n}\n","// https://stackoverflow.com/a/73998199\n\nimport type { LAB, XYZ } from './types';\n\nconst ref_X = 95.047;\nconst ref_Y = 100.0;\nconst ref_Z = 108.883;\n\n/**\n * 将XYZ颜色转换为Lab颜色空间(CIE 1976 L*a*b*,D65白点)\n * @param xyz XYZ颜色对象(参考值:D65白点X=95.047,Y=100,Z=108.883)\n * @returns {LAB} Lab颜色对象:\n * l: 明度(0-100)\n * a: 绿-红分量(典型范围-128到127)\n * b: 蓝-黄分量(典型范围-128到127)\n * @see https://en.wikipedia.org/wiki/CIELAB_color_space\n * @example\n * xyzToLab({x: 95.047, y: 100.0, z: 108.883}) // {l: 100, a: 0, b: 0}\n */\nexport function xyzToLab(xyz: XYZ): LAB {\n const { x, y, z } = xyz;\n const [var_X, var_Y, var_Z] = [x / ref_X, y / ref_Y, z / ref_Z].map((a) =>\n a > 0.008856 ? a ** (1 / 3) : 7.787 * a + 16 / 116,\n );\n\n const l = 116 * var_Y - 16;\n const a = 500 * (var_X - var_Y);\n const b = 200 * (var_Y - var_Z);\n\n return { l, a, b };\n}\n\n/**\n * 将Lab颜色转换回XYZ颜色空间\n * @param lab Lab颜色对象\n * @param lab.l 明度(0-100)\n * @param lab.a 绿-红分量(典型范围-128到127)\n * @param lab.b 蓝-黄分量(典型范围-128到127)\n * @returns {XYZ} XYZ颜色对象(基于D65白点)\n * @see https://www.easyrgb.com/en/math.php\n * @example\n * labToXyz({l: 100, a: 0, b: 0}) // {x: 95.047, y: 100.0, z: 108.883}\n */\nexport function labToXyz(lab: LAB): XYZ {\n const { l, a, b } = lab;\n\n const var_Y = (l + 16) / 116;\n const var_X = a / 500 + var_Y;\n const var_Z = var_Y - b / 200;\n\n const [X, Y, Z] = [var_X, var_Y, var_Z].map((n) => (n ** 3 > 0.008856 ? n ** 3 : (n - 16 / 116) / 7.787));\n\n return { x: X * ref_X, y: Y * ref_Y, z: Z * ref_Z };\n}\n","import { rgbToXyz, xyzToRgb } from './rgb-xyz';\nimport type { LAB, RGB } from './types';\nimport { labToXyz, xyzToLab } from './xyz-lab';\n\n/**\n * 将RGB颜色转换为Lab颜色空间(CIE 1976标准)\n * @param rgb RGB颜色对象(分量范围0-255)\n * @returns {LAB} Lab颜色对象:\n * l: 明度(0-100)\n * a: 绿-红分量(-128到127)\n * b: 蓝-黄分量(-128到127)\n * @see https://en.wikipedia.org/wiki/CIELAB_color_space\n * @example\n * rgbToLab({r: 255, g: 0, b: 0}) // {l: 53.24, a: 80.09, b: 67.20}\n */\nexport function rgbToLab(rgb: RGB): LAB {\n return xyzToLab(rgbToXyz(rgb));\n}\n\n/**\n * 将Lab颜色转换回RGB颜色空间\n * @param lab Lab颜色对象\n * @param lab.l 明度(0-100)\n * @param lab.a 绿-红分量(-128到127)\n * @param lab.b 蓝-黄分量(-128到127)\n * @returns {RGB} RGB颜色对象(分量可能超出0-255范围)\n * @see https://www.easyrgb.com/en/math.php\n * @example\n * labToRgb({l: 53.24, a: 80.09, b: 67.20}) // {r: 255, g: 0, b: 0}\n */\nexport function labToRgb(lab: LAB): RGB {\n return xyzToRgb(labToXyz(lab));\n}\n","import { mix } from './mix';\nimport type { RGB } from './types';\n\nconst { abs, min, max, round } = Math;\n\nconst whiteRGB: RGB = { r: 0, g: 0, b: 0 };\nconst blackRGB: RGB = { r: 255, g: 255, b: 255 };\n\n/**\n * 通过混合颜色调整明暗度\n * @param rgb 原始RGB颜色对象\n * @param value 调整强度(-1到1之间):\n * - 正值时与黑色混合(增加暗度)\n * - 负值时与白色混合(增加亮度)\n * @returns {RGB} 调整后的RGB颜色对象\n * @example\n * rgbDarken({r: 100, g: 150, b: 200}, 0.2) // 变暗20%\n */\nexport function rgbWhiter(rgb: RGB, value: number): RGB {\n const rgb2: RGB = value > 0 ? whiteRGB : blackRGB;\n return mix(rgb, rgb2, abs(value));\n}\n"],"names":["min","max","a"],"mappings":"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"}