@tixyel/streamelements 7.6.7 → 7.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","names":[],"sources":["../src/helper/classes/number.ts","../src/helper/classes/element.ts","../src/helper/classes/object.ts","../src/data/collection/avatars.ts","../src/data/collection/badges.ts","../src/data/collection/css.ts","../src/data/collection/emotes.ts","../src/data/collection/items.ts","../src/data/collection/messages.ts","../src/data/collection/names.ts","../src/data/collection/tiers.ts","../src/data/collection/tts.ts","../src/data/collection/youtube-emotes.ts","../src/data/index.ts","../src/helper/classes/random.ts","../src/helper/classes/message.ts","../src/helper/classes/event.ts","../src/utils/color.ts","../src/helper/classes/color.ts","../src/helper/classes/string.ts","../src/helper/classes/sound.ts","../src/helper/classes/function.ts","../src/internal.ts","../src/helper/classes/utils.ts","../src/helper/classes/animate.ts","../src/helper/index.ts","../src/actions/button.ts","../src/actions/command.ts","../src/client/listener.ts","../src/modules/EventProvider.ts","../src/modules/useQueue.ts","../src/local/generator.ts","../src/local/queue.ts","../src/streamelements/api.ts","../src/modules/SE_API.ts","../src/modules/useStorage.ts","../src/client/client.ts","../src/local/emulator.ts","../src/local/index.ts","../src/modules/fakeUser.ts","../src/modules/useComms.ts","../src/modules/useLogger.ts","../src/multistream/comfyJs.ts","../src/utils/alejo.ts","../src/main.ts","../src/index.ts"],"sourcesContent":["/**\n * NumberHelper class provides utility methods for working with numbers, including translation to words, balancing within a range, rounding, and generating random numbers.\n */\nexport class NumberHelper {\n /**\n * Translate number to words\n * @param num - Number to translate\n * @param type - Translation type\n * @returns - Number in words\n * @example\n * ```javascript\n * const cardinal = translate(42, 'cardinal');\n * console.log(cardinal); // \"forty-two\"\n * const ordinal = translate(42, 'ordinal');\n * console.log(ordinal); // \"forty-second\"\n * const suffix = translate(42, 'suffix');\n * console.log(suffix); // \"42nd\"\n * ```\n */\n translate(num: number, type: 'cardinal' | 'ordinal' | 'suffix' = 'cardinal'): string {\n const CARDINALS = {\n single: ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'],\n tens: [\n 'ten',\n 'eleven',\n 'twelve',\n 'thirteen',\n 'fourteen',\n 'fifteen',\n 'sixteen',\n 'seventeen',\n 'eighteen',\n 'nineteen',\n ],\n decades: ['twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'],\n };\n const ORDINALS = {\n single: [\n 'zeroth',\n 'first',\n 'second',\n 'third',\n 'fourth',\n 'fifth',\n 'sixth',\n 'seventh',\n 'eighth',\n 'ninth',\n ],\n tens: [\n 'tenth',\n 'eleventh',\n 'twelfth',\n 'thirteenth',\n 'fourteenth',\n 'fifteenth',\n 'sixteenth',\n 'seventeenth',\n 'eighteenth',\n 'nineteenth',\n ],\n decades: [\n 'twentieth',\n 'thirtieth',\n 'fortieth',\n 'fiftieth',\n 'sixtieth',\n 'seventieth',\n 'eightieth',\n 'ninetieth',\n ],\n };\n const SUFFIXES = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'];\n const SCALES = ['', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion'];\n const SCALES_ORD = SCALES.map((s) => (s ? `${s}th` : ''));\n\n num = Math.abs(Math.floor(num));\n\n if (type === 'suffix') {\n const rem100 = num % 100;\n if (rem100 >= 11 && rem100 <= 13) return `${num}th`;\n const rem10 = num % 10;\n return `${num}${SUFFIXES[rem10]}`;\n }\n\n function below100(n: number, kind: 'cardinal' | 'ordinal'): string {\n if (n < 10) return kind === 'ordinal' ? ORDINALS.single[n] : CARDINALS.single[n];\n if (n < 20) return kind === 'ordinal' ? ORDINALS.tens[n - 10] : CARDINALS.tens[n - 10];\n const decade = Math.floor(n / 10);\n const single = n % 10;\n if (single === 0)\n return kind === 'ordinal' ? ORDINALS.decades[decade - 2] : CARDINALS.decades[decade - 2];\n const tensPart = CARDINALS.decades[decade - 2];\n const unitPart = kind === 'ordinal' ? ORDINALS.single[single] : CARDINALS.single[single];\n return `${tensPart}-${unitPart}`;\n }\n\n function below1000(n: number, kind: 'cardinal' | 'ordinal'): string {\n if (n === 0) return kind === 'ordinal' ? ORDINALS.single[0] : CARDINALS.single[0];\n const hundreds = Math.floor(n / 100);\n const rest = n % 100;\n const parts: string[] = [];\n if (hundreds > 0) {\n if (kind === 'ordinal' && rest === 0) parts.push(`${CARDINALS.single[hundreds]} hundredth`);\n else parts.push(`${CARDINALS.single[hundreds]} hundred`);\n }\n if (rest > 0) parts.push(below100(rest, kind));\n return parts.join(' ');\n }\n\n if (num < 1000) return below1000(num, type);\n\n const groups: number[] = [];\n let n = num;\n while (n > 0) {\n groups.push(n % 1000);\n n = Math.floor(n / 1000);\n }\n\n let lastNonZeroIndex = -1;\n for (let i = 0; i < groups.length; i++) if (groups[i] !== 0) lastNonZeroIndex = i;\n\n const parts: string[] = [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const g = groups[i];\n if (g === 0) continue;\n const scale = SCALES[i];\n\n if (type === 'cardinal') {\n let segment = below1000(g, 'cardinal');\n if (scale) segment += ` ${scale}`;\n parts.push(segment);\n } else {\n const isLastNonZero = i === lastNonZeroIndex;\n if (isLastNonZero) {\n if (i > 0) {\n const segment = below1000(g, 'cardinal');\n const ordScale = SCALES_ORD[i];\n parts.push(segment ? `${segment} ${ordScale}` : ordScale);\n } else {\n const segment = below1000(g, 'ordinal');\n parts.push(segment);\n }\n } else {\n let segment = below1000(g, 'cardinal');\n if (scale) segment += ` ${scale}`;\n parts.push(segment);\n }\n }\n }\n\n return parts.join(', ');\n }\n\n /**\n * Balances a number within a specified range\n * @param amount - Number to balance\n * @param min - Minimum value\n * @param max - Maximum value\n * @param decimals - Number of decimal places to round to (default is 0)\n * @returns - Balanced number\n * @example\n * ```javascript\n * const balancedValue = balance(150, 0, 100);\n * console.log(balancedValue); // 100\n * ```\n */\n balance(amount: number, min: number = 0, max: number = 100, decimals: number = 0): number {\n const result = Math.min(Math.max(amount, min), max);\n\n return this.round(result, decimals);\n }\n\n /**\n * Rounds a number to a specified number of decimal places\n * @param value - Number to round\n * @param decimals - Number of decimal places (default is 2)\n * @returns Rounded number\n * @example\n * ```javascript\n * const roundedValue = round(3.14159, 3);\n * console.log(roundedValue); // 3.142\n * const roundedValueDefault = round(3.14159);\n * console.log(roundedValueDefault); // 3.14\n * const roundedValueZero = round(3.14159, 0);\n * console.log(roundedValueZero); // 3\n * ```\n */\n round(value: number, decimals: number = 2): number {\n const factor = Math.pow(10, decimals);\n\n return Math.round(value * factor) / factor;\n }\n\n /**\n * Generate random number\n * @param min - Minimum value\n * @param max - Maximum value\n * @param float - Number of decimal places (0 for integer)\n * @returns - Random number\n * @example\n * ```javascript\n * const intNumber = random(1, 10);\n * console.log(intNumber); // e.g. 7\n *\n * const floatNumber = random(1, 10, 2);\n * console.log(floatNumber); // e.g. 3.14\n * ```\n */\n random(min: number, max: number, float: number = 0): number {\n if (min > max) [min, max] = [max, min];\n\n const rand = Math.random() * (max - min) + min;\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\n }\n}\n","import { NumberHelper } from './number.js';\n\nexport interface ScaleOptions<T extends HTMLElement> {\n /**\n * The parent element to use for scaling calculations. If not provided, the element's parent will be used.\n */\n parent?: HTMLElement;\n /**\n * The preferred dimension to base the scaling on. Can be 'width', 'height', or 'auto' (default).\n */\n prefer?: 'width' | 'height' | 'auto';\n /**\n * The minimum percentage of the parent size to scale to. Default is 0.\n */\n min?: number;\n /**\n * The maximum percentage of the parent size to scale to. Default is 1 (100%).\n */\n max?: number;\n /**\n * A callback function that is called after scaling is applied.\n * @param this - The HTML element being scaled.\n * @param number - The scale factor applied to the element.\n * @param element - The HTML element being scaled.\n * @returns void\n */\n apply?: (this: T, number: number, element: T) => void;\n}\n\nexport type FitTextOptions = {\n minFontSize?: number;\n maxFontSize?: number;\n parent?: HTMLElement;\n};\n\nexport class ElementHelper {\n /**\n * Merges outer span styles with inner span styles in the provided HTML string.\n * @param outerStyle - The style string to be applied to the outer span.\n * @param innerHTML - The inner HTML string which may contain a span with its own styles.\n * @returns A new HTML string with merged styles applied to a single span.\n * @example\n * ```javascript\n * const result = mergeSpanStyles(\"color: red; font-weight: bold;\", '<span style=\"font-size: 14px;\">Hello World</span>');\n * console.log(result); // Output: '<span style=\"font-size: 14px; color: red; font-weight: bold;\">Hello World</span>'\n * ```\n */\n mergeSpanStyles(outerStyle: string, innerHTML: string, className?: string): string {\n const match = innerHTML.match(/^<span(?: class=\"[^\"]*\")? style=\"([^\"]*)\">(.*)<\\/span>$/s);\n\n if (match) {\n const innerStyle = match[1];\n const content = match[2];\n const innerClass = match[0].match(/class=\"([^\"]*)\"/)?.[1] || '';\n\n let mergedStyle = [innerStyle, outerStyle]\n .filter((a) => a.length)\n .map((s) => {\n if (s.endsWith(';')) return s.slice(0, -1);\n else return s;\n })\n .join('; ')\n .replace(/\\s*;\\s*/g, '; ')\n .trim();\n\n if (!mergedStyle.endsWith(';')) mergedStyle += ';';\n\n return `<span${innerClass ? ` class=\"${innerClass} ${className ?? ''}\"` : ''}${mergedStyle ? ` style=\"${mergedStyle}\"` : ''}>${content}</span>`;\n } else {\n if (outerStyle && outerStyle.length && !outerStyle.endsWith(';')) outerStyle += ';';\n\n return `<span${className ? ` class=\"${className}\"` : ''}${outerStyle ? ` style=\"${outerStyle}\"` : ''}>${innerHTML}</span>`;\n }\n }\n\n /**\n * Scales an HTML element to fit within its parent element based on specified minimum and maximum scale factors.\n * @param element - The HTML element to be scaled.\n * @param min - Minimum scale factor (default is 0).\n * @param max - Maximum scale factor (default is 1).\n * @param options - Optional settings for scaling.\n * @returns - An object containing the new width, height, and scale factor, or void if not applied.\n * @example\n * ```javascript\n * const element = document.getElementById('myElement');\n * scale(element, 0.5, 1, { return: false });\n * ```\n */\n scale(\n element: HTMLElement,\n min: number = 0,\n max: number = 1,\n options?: { return: boolean; parent: HTMLElement; base: 'width' | 'height' },\n ): { width: number; height: number; scale: number } | void {\n const { return: returnOnly = false, parent: customParent, base } = options || {};\n\n const parent = customParent || element.parentElement || document.body;\n\n if (!parent) {\n throw new Error('No parent element found for scaling');\n }\n\n const parentRect = parent.getBoundingClientRect();\n const elementWidth = element.offsetWidth;\n const elementHeight = element.offsetHeight;\n\n if (elementWidth === 0 || elementHeight === 0) {\n throw new Error('Element has zero width or height, cannot scale');\n }\n\n // Calculate scales for both dimensions\n const scaleX = (parentRect.width * max) / elementWidth;\n const scaleY = (parentRect.height * max) / elementHeight;\n\n // Determine final scale based on base option or use smaller scale\n let finalScale =\n base === 'width' ? scaleX : base === 'height' ? scaleY : Math.min(scaleX, scaleY);\n\n // Apply minimum constraint if needed\n if (min > 0) {\n const minScaleX = (parentRect.width * min) / elementWidth;\n const minScaleY = (parentRect.height * min) / elementHeight;\n const minScale = Math.max(minScaleX, minScaleY);\n\n finalScale = Math.max(minScale, finalScale);\n }\n\n const result = {\n width: elementWidth * finalScale,\n height: elementHeight * finalScale,\n scale: finalScale,\n };\n\n if (returnOnly) {\n return result;\n }\n\n element.style.transform = `scale(${finalScale})`;\n element.style.transformOrigin = 'center center';\n\n return result;\n }\n\n /**\n * Scales an HTML element to fit within its parent element based on specified options.\n * @param element - The HTML element to be scaled.\n * @param options - Optional settings for scaling.\n * @returns The scale factor applied to the element.\n * @example\n * ```javascript\n * const element = document.getElementById('myElement');\n * const scaleFactor scalev2(element, {\n * min: 0.5,\n * max: 1,\n * prefer: 'width',\n * apply: (scale, el) => el.style.transform = `scale(${scale})`\n * });\n * console.log(`Element scaled by a factor of ${scaleFactor}`);\n * ```\n */\n scalev2<T extends HTMLElement>(element: T, options: ScaleOptions<T> = {}): number {\n const {\n parent = element.parentElement,\n prefer = 'auto',\n min = 0,\n max = 1,\n apply = () => {},\n } = options;\n\n if (!parent) {\n throw new Error('No parent element found for scaling');\n }\n\n const parentClientRect = parent.getBoundingClientRect();\n const elementClientRect = element.getBoundingClientRect();\n\n const parentWidth = parentClientRect.width;\n const parentHeight = parentClientRect.height;\n\n const elementWidth = elementClientRect.width;\n const elementHeight = elementClientRect.height;\n\n let scaleXmin = (parentWidth * min) / elementWidth;\n let scaleYmin = (parentHeight * min) / elementHeight;\n\n let scaleXmax = (parentWidth * max) / elementWidth;\n let scaleYmax = (parentHeight * max) / elementHeight;\n\n let scaleValue = Math.min(scaleXmax, scaleYmax);\n\n const minScale = Math.max(scaleXmin, scaleYmin);\n scaleValue = Math.max(scaleValue, minScale);\n\n const finalScaleX = elementWidth * scaleValue;\n const finalScaleY = elementHeight * scaleValue;\n\n if (prefer === 'width') {\n scaleValue = Math.max(scaleXmin, Math.min(scaleXmax, parentWidth / elementWidth));\n } else if (prefer === 'height') {\n scaleValue = Math.max(scaleYmin, Math.min(scaleYmax, parentHeight / elementHeight));\n } else {\n if (finalScaleX > parentWidth) {\n scaleValue = Math.max(scaleXmin, Math.min(scaleXmax, parentWidth / elementWidth));\n } else if (finalScaleY > parentHeight) {\n scaleValue = Math.max(scaleYmin, Math.min(scaleYmax, parentHeight / elementHeight));\n }\n }\n\n apply.apply(element, [scaleValue, element]);\n\n return scaleValue;\n }\n\n /**\n * Fits the text within the parent element by adjusting the font size.\n * @param element - The HTML element containing the text to be fitted.\n * @param compressor - A multiplier to adjust the fitting sensitivity (default is 1).\n * @param options - Optional settings for fitting text.\n * @returns The HTML element with adjusted font size.\n * @example\n * ```javascript\n * const element = document.getElementById('myTextElement');\n * fitText(element, 1, { minFontSize: 12, maxFontSize: 36 });\n * console.log(`Adjusted font size: ${element.style.fontSize}`);\n * ```\n */\n fitText(element: HTMLElement, compressor: number = 1, options: FitTextOptions = {}) {\n const fontSize = parseFloat(getComputedStyle(element).getPropertyValue('font-size'));\n\n const settings = {\n minFontSize: options?.minFontSize ?? 0,\n maxFontSize: options?.maxFontSize ?? fontSize,\n };\n\n const parent = options?.parent || element.parentElement;\n\n if (!parent) {\n throw new Error('No parent element found for fitting text');\n }\n\n const parentWidth = parent.clientWidth * compressor;\n const elWidth = element.offsetWidth;\n\n const ratio = parentWidth / elWidth;\n const value = fontSize * ratio;\n\n const number = new NumberHelper();\n const result = number.balance(value, settings.minFontSize, settings.maxFontSize);\n\n element.style.fontSize = result + 'px';\n\n return element;\n }\n\n /**\n * Wraps formatted HTML text with containers and splits characters into indexed spans.\n * Adds 'container' class and data-index to all parent elements, and wraps each character in a span with class 'char' and data-index.\n * @param htmlString - The input HTML string containing formatted text elements (span, strong, em, etc).\n * @param startIndex - The starting index for the data-index attribute (default is 0).\n * @param preserveInterElementWhitespace - Whether to preserve whitespace between elements (default is false).\n * @param options - Optional settings for splitting text, including skipWhitespaceIndex to control index incrementing for whitespace characters.\n * @returns - A new HTML string with containers and character-level indexing.\n * @example\n * ```javascript\n * const result = splitTextToChars('<span>TesTe</span> <strong>bold</strong>', 0);\n * console.log(result);\n * // Output: '<span class=\"container\" data-index=\"0\"><span class=\"char\" data-index=\"0\">T</span><span class=\"char\" data-index=\"1\">e</span>...'\n *\n * // Example with skipWhitespaceIndex\n * const resultSkipWhitespace = splitTextToChars('<span>Hello World</span>', 0, false, { skipWhitespaceIndex: true });\n * // The space character will have data-index but won't increment index for subsequent characters\n * ```\n */\n splitTextToChars(\n htmlString: string,\n startIndex: number = 0,\n preserveInterElementWhitespace: boolean = false,\n options: {\n /**\n * If true, skips incrementing the index for whitespace characters (space, newline, tab).\n * These characters will still have a data-index, but it won't be incremented for subsequent characters.\n * Default is true.\n */\n skipWhitespaceIndex?: boolean;\n } = {},\n ): string {\n const { skipWhitespaceIndex = true } = options;\n const parser = new DOMParser();\n const processed = document.createElement('div');\n\n let charIndex = startIndex;\n\n function processNode(node: Node): Node | DocumentFragment {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n let exclusivityIndex = 0;\n\n const chars = text.split('').map((char) => {\n const span = document.createElement('span');\n\n span.classList.add('char');\n span.dataset.index = String(charIndex);\n span.dataset.exclusivityIndex = String(exclusivityIndex);\n span.dataset.type = 'char';\n span.style.setProperty('--char-index', String(charIndex));\n span.style.setProperty('--exclusivity-index', String(exclusivityIndex));\n\n const isWhitespace = char === ' ' || char === '\\n' || char === '\\t';\n\n if (isWhitespace) {\n span.style.whiteSpace = 'pre-wrap';\n\n span.classList.remove('char');\n span.classList.add('whitespace');\n\n span.dataset.type = 'whitespace';\n }\n\n if (!isWhitespace || !skipWhitespaceIndex) {\n charIndex++;\n exclusivityIndex++;\n }\n\n span.textContent = char;\n\n return span;\n });\n\n const fragment = document.createDocumentFragment();\n chars.forEach((char) => fragment.appendChild(char));\n\n return fragment;\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const clone = node.cloneNode(false) as HTMLElement;\n\n clone.classList.add('container');\n clone.dataset.index = String(charIndex);\n clone.dataset.type = 'container';\n clone.style.setProperty('--char-index', String(charIndex));\n clone.style.setProperty('--exclusivity-index', String(charIndex));\n\n charIndex++;\n\n node.childNodes.forEach((child) => {\n const processed = processNode(child);\n\n clone.appendChild(processed);\n });\n\n return clone;\n }\n\n return node.cloneNode(true);\n }\n\n parser.parseFromString(htmlString, 'text/html').body.childNodes.forEach((node) => {\n if (\n !preserveInterElementWhitespace &&\n node.nodeType === Node.TEXT_NODE &&\n !node.textContent?.trim()\n ) {\n return;\n }\n\n const result = processNode(node);\n\n processed.appendChild(result);\n });\n\n let html = '';\n\n Array.from(processed.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) html += node.textContent;\n else html += (node as HTMLElement).outerHTML;\n });\n\n return html;\n }\n}\n","import { PathValue } from '../../types.js';\n\nexport class ObjectHelper {\n /**\n * Flattens a nested object into a single-level object with dot-separated keys.\n * @param obj - The nested object to be flattened.\n * @param prefix - The prefix to be added to each key (used for recursion).\n * @returns A flattened object with dot-separated keys.\n * @example\n * ```javascript\n * const nestedObj = { a: { b: 1, c: { d: 2 } }, e: [3, 4] };\n * const flatObj = flatten(nestedObj);\n * console.log(flatObj);\n * // Output: { 'a.b': '1', 'a.c.d': '2', 'e:0': '3', 'e:1': '4' }\n * ```\n */\n flatten(\n obj: Record<string, any>,\n stringify: boolean = true,\n prefix: string = '',\n ): Record<string, typeof stringify extends true ? string : string | number | boolean> {\n const result = {} as Record<\n string,\n typeof stringify extends true ? string : string | number | boolean\n >;\n\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n const value = obj[key];\n const path = prefix ? `${prefix}.${key}` : key;\n\n // Handle null and undefined\n if (value === null || value === undefined) {\n result[path] = String(value);\n\n continue;\n }\n\n if (typeof value === 'number' && isNaN(value)) {\n result[path] = 'NaN';\n\n continue;\n }\n\n if (typeof value === 'number' && !isNaN(value)) {\n result[path] = stringify ? String(value) : value;\n\n continue;\n }\n\n // Handle Date objects\n if (value instanceof Date) {\n result[path] = value.toISOString();\n\n continue;\n }\n\n // Handle Map objects\n if (value instanceof Map) {\n value.forEach((v, k) => {\n result[`${path}.${k}`] = JSON.stringify(v);\n });\n\n continue;\n }\n\n // Handle Array objects\n if (Array.isArray(value)) {\n value.forEach((v, i) => {\n const itemPath = `${path}:${i}`;\n\n if (typeof v === 'object') {\n Object.assign(result, this.flatten(v, stringify, itemPath));\n } else {\n result[itemPath] = stringify ? String(v) : v;\n }\n });\n\n continue;\n }\n\n // Handle nested objects\n if (typeof value === 'object') {\n Object.assign(result, this.flatten(value, stringify, path));\n continue;\n }\n\n // Handle primitive values (string, number, boolean, etc.)\n result[path] = String(value);\n }\n\n return result;\n }\n\n /**\n * Returns the entries of an object as an array of key-value pairs, with proper typing.\n * @param obj - The object to retrieve entries from.\n * @returns An array of key-value pairs from the object, typed as an array of tuples with key and value types.\n */\n entries<K extends string, V>(obj: Record<K, V>): [K, V][] {\n return Object.entries(obj) as [K, V][];\n }\n\n /**\n * Returns the values of an object as an array, with proper typing.\n * @param obj - The object to retrieve values from.\n * @returns An array of values from the object, typed as an array of the value type.\n */\n values<K extends string, V>(obj: Record<K, V>): V[] {\n return Object.values(obj) as V[];\n }\n\n /**\n * Returns the keys of an object as an array of strings, with proper typing.\n * @param obj - The object to retrieve keys from.\n * @returns An array of keys from the object, typed as an array of strings.\n */\n keys<K extends string, V>(obj: Record<K, V>): K[] {\n return Object.keys(obj) as K[];\n }\n\n /**\n * Updates a value in a nested object at the specified path, with an option to create missing intermediate objects.\n * @param obj - The target object to update.\n * @param path - The path to the property being updated.\n * @param value - The value to set at the specified path.\n * @param createMissing - Whether to create missing intermediate objects along the path if they don't exist.\n * @returns The updated object with the new value set at the specified path.\n * @example\n * ```javascript\n * const obj1 = { a: { b: 1 }, c: 2 };\n * updateViaPath(obj1, 'a.d', 9999, false);\n * console.log(obj1);\n * // Output: { a: { b: 1, d: 9999 }, c: 2 }\n *\n * const obj2 = { a: { b: 1 }, c: 2 };\n * updateViaPath(obj2, 'a.e.f', 8888, true);\n * console.log(obj2);\n * // Output: { a: { b: 1, e: { f: 8888 } }, c: 2 }\n * ```\n * @returns The updated object with the new value set at the specified path.\n */\n updateViaPath<P extends string, T extends object>(\n obj: T,\n path: P,\n value: PathValue<T, P>,\n createMissing: boolean = false,\n ): T {\n const keys = path.split('.');\n let current: any = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n if (typeof current[keys[i]] !== 'object' || current[keys[i]] == null) {\n if (createMissing) {\n current[keys[i]] = {};\n } else {\n throw new Error(`Path ${keys.slice(0, i + 1).join('.')} does not exist in the object.`);\n }\n }\n\n current = current[keys[i]];\n }\n\n current[keys[keys.length - 1]] = value;\n\n return obj;\n }\n\n /**\n * Compares two values for differences, with an option to use JSON stringification for comparison.\n * @param a - The first value to compare.\n * @param b - The second value to compare.\n * @param method - The method to use for comparison, either 'json' for JSON stringification or 'default' for a recursive comparison.\n * @returns A boolean indicating whether the two values are different based on the specified comparison method.\n */\n isDiff(a: any, b: any, method: 'json' | 'default' = 'default'): boolean {\n if (method === 'json') {\n return JSON.stringify(a) !== JSON.stringify(b);\n }\n\n if (Object.is(a, b)) return false;\n\n if (typeof a !== typeof b) return true;\n\n if (a == null || b == null) return a !== b;\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() !== b.getTime();\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return true;\n\n for (let i = 0; i < a.length; i++) {\n if (this.isDiff(a[i], b[i], method)) {\n return true;\n }\n }\n\n return false;\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) return true;\n for (const key of aKeys) {\n if (!Object.prototype.hasOwnProperty.call(b, key) || this.isDiff(a[key], b[key], method)) {\n return true;\n }\n }\n return false;\n }\n\n return a !== b;\n }\n}\n","export const avatars = [\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/13e5fa74-defa-11e9-809c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/dbdc9198-def8-11e9-8681-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/998f01ae-def8-11e9-b95c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/de130ab0-def7-11e9-b668-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ebe4cd89-b4f4-4cd9-adac-2f30151b4209-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/215b7342-def9-11e9-9a66-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ead5c8b2-a4c9-4724-b1dd-9f00b46cbd3d-profile_image-300x300.png',\n];\n","import { Twitch } from '../../types/twitch.js';\n\nexport const globalBadges: Twitch.GlobalBadge[] = [\n {\n set_id: 'qsmp2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/3',\n title: 'QSMP2',\n description: 'This badge was earned for watching QSMP during the initial 2026 launch!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/quackity',\n },\n ],\n },\n {\n set_id: 'jasontheween-7-day-survival',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/3',\n title: 'JasonTheWeen 7 Day Survival',\n description:\n \"This badge was earned by watching 30 minutes of JasonTheWeen's 7 day survival stream!\",\n click_action: 'visit_url',\n click_url: 'https://twitch.tv/jasontheween',\n },\n ],\n },\n {\n set_id: 'support-a-streamer-ho26-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/3',\n title: \"Support a Streamer HO'26\",\n description:\n 'This badge was earned by subscribing or gifting a sub to any World of Tanks broadcast during the Holiday Ops 26 campaign period',\n click_action: 'visit_url',\n click_url: 'https://worldoftanks.eu/en/news/general-news/wot-monthly-december-2025/',\n },\n ],\n },\n {\n set_id: 'twitch-recap-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/3',\n title: 'Twitch Recap 2025',\n description: 'This exclusive badge was earned by the top 20% of Twitch users in 2025.',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/annual-recap',\n },\n ],\n },\n {\n set_id: 'ugly-sweater',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/3',\n title: 'Ugly Sweater',\n description: 'This badge was earned for sharing festive Clips during Holiday Hoopla 2025.',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/how-to-use-badges?language=en_US',\n },\n ],\n },\n {\n set_id: 'fright-fest-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/3',\n title: 'Fright Fest 2025',\n description: 'This badge was earned by users who shared the best 2025 Fright Fest clips.',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/en/2025/10/20/twitch-fright-fest-2025/',\n },\n ],\n },\n {\n set_id: 'gamerduo',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/3',\n title: 'GamerDuo',\n description: 'Subbed to a streamer and got 3 months of free Super Duolingo!',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/2025/10/02/sub-for-super-duolingo/',\n },\n ],\n },\n {\n set_id: 'video-games-day',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/3',\n title: 'Video Games Day',\n description:\n 'This badge was earned by users who downloaded and shared clips revolving around anything Video Games related in September 2025.',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/gaming',\n },\n ],\n },\n {\n set_id: 'twitch-intern-2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/3',\n title: 'Twitch Intern 2022',\n description: 'This user was an intern at Twitch for the summer of 2022',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n set_id: 'touch-grass',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/3',\n title: 'Touch Grass',\n description:\n 'This badge was earned by users who touched grass and shared their favorite IRL clips in August 2025.',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/twitch-chat-badges-guide',\n },\n ],\n },\n {\n set_id: 'twitchcon-referral-program-2025-chrome-star',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/3',\n title: 'TwitchCon Referral Program 2025 (Chrome Star)',\n description:\n 'This badge was earned by referring at least one friend who bought their TwitchCon 2025 ticket using your unique referral link.',\n click_action: 'visit_url',\n click_url: 'https://twitchcon.com/rotterdam-2025/referral-program/',\n },\n ],\n },\n {\n set_id: 'twitchcon-referral-program-2025-bleedpurple',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/3',\n title: 'TwitchCon Referral Program 2025 (bleedPurple)',\n description:\n 'This badge was earned by referring ten friends who bought their TwitchCon 2025 ticket using your unique referral link.',\n click_action: 'visit_url',\n click_url: 'https://twitchcon.com/rotterdam-2025/referral-program/',\n },\n ],\n },\n {\n set_id: 'share-the-love',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/3',\n title: 'Share the Love',\n description:\n 'This lovely badge was earned by users who shared their favorite Twitch clips in February 2025.',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/2025/02/14/share-the-love-this-valentine-s-day/',\n },\n ],\n },\n {\n set_id: 'gone-bananas',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/3',\n title: 'Gone Bananas Badge',\n description:\n 'This gilded banana badge was scored by sharing a lulz-worthy clip during April Fool’s week 2025.',\n click_action: 'visit_url',\n click_url: 'http://blog.twitch.tv/2025/04/01/april-fools-day/',\n },\n ],\n },\n {\n set_id: 'twitchcon-2025---rotterdam',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/3',\n title: 'TwitchCon 2025',\n description: 'Celebrated TwitchCon’s 10 year anniversary in 2025',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/rotterdam-2025/',\n },\n ],\n },\n {\n set_id: 'clip-the-halls',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/3',\n title: 'Clip the Halls',\n description:\n 'For spreading the holiday cheer by sharing a clip to TikTok or YouTube during Twitch Holiday Hoopla 2024.',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/en/2024/12/02/twitch-holiday-hoopla/',\n },\n ],\n },\n {\n set_id: 'twitch-recap-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/3',\n title: 'Twitch Recap 2024',\n description:\n 'The Official Chat Badge of the Year. It takes hard work and KomodoHype to receive it. You should be proud to tell everyone you know about this.',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/annual-recap',\n },\n ],\n },\n {\n set_id: 'subtember-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/3',\n title: 'SUBtember 2024',\n description: \"For being Subbie's friend and participating in SUBtember 2024!\",\n click_action: 'visit_url',\n click_url: 'https://link.twitch.tv/subtember2024',\n },\n ],\n },\n {\n set_id: 'twitch-intern-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/3',\n title: 'Twitch Intern 2024',\n description: 'This user was an intern at Twitch for the summer of 2024',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n set_id: 'twitch-dj',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/3',\n title: 'Twitch DJ',\n description: 'This user is a DJ in the Twitch DJ Program.',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/dj-program',\n },\n ],\n },\n {\n set_id: 'destiny-2-the-final-shape-streamer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/3',\n title: 'Destiny 2: The Final Shape Streamer',\n description:\n 'I earned this badge by taking part in the Destiny 2: The Final Shape Raid Race!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/category/destiny-2\\t',\n },\n ],\n },\n {\n set_id: 'destiny-2-final-shape-raid-race',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/3',\n title: 'Destiny 2: The Final Shape Raid Race',\n description:\n 'I earned this badge by watching Destiny 2: The Final Shape Raid Race on Twitch!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/category/destiny-2',\n },\n ],\n },\n {\n set_id: 'twitchcon-2024---san-diego',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/3',\n title: 'TwitchCon 2024 - San Diego',\n description: 'Attended TwitchCon San Diego 2024',\n click_action: 'visit_url',\n click_url:\n 'https://twitchcon.com/san-diego-2024/?utm_source=twitch&utm_medium=chat-badge&utm_campaign=tcsd24-chat-badge',\n },\n ],\n },\n {\n set_id: 'minecraft-15th-anniversary-celebration',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/3',\n title: 'Minecraft 15th Anniversary Celebration',\n description:\n \"This badge was earned for using a special emote as part of Minecraft's 15th Anniversary Celebration on Twitch!\",\n click_action: 'visit_url',\n click_url: 'https://twitch-web.app.link/e/vkOhfCa7nJb',\n },\n ],\n },\n {\n set_id: 'warcraft',\n versions: [\n {\n id: 'horde',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/3',\n title: 'Horde',\n description: 'For the Horde!',\n click_action: 'visit_url',\n click_url: 'http://warcraftontwitch.tv/',\n },\n {\n id: 'alliance',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/3',\n title: 'Alliance',\n description: 'For Lordaeron!',\n click_action: 'visit_url',\n click_url: 'http://warcraftontwitch.tv/',\n },\n ],\n },\n {\n set_id: 'vip',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/3',\n title: 'VIP',\n description: 'VIP',\n click_action: 'visit_url',\n click_url:\n 'https://help.twitch.tv/customer/en/portal/articles/659115-twitch-chat-badges-guide',\n },\n ],\n },\n {\n set_id: 'vga-champ-2017',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/3',\n title: '2017 VGA Champ',\n description: '2017 VGA Champ',\n click_action: 'visit_url',\n click_url:\n 'https://blog.twitch.tv/watch-and-co-stream-the-game-awards-this-thursday-on-twitch-3d8e34d2345d',\n },\n ],\n },\n {\n set_id: 'tyranny_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/3',\n title: 'Tyranny',\n description: 'Tyranny',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Tyranny/details',\n },\n ],\n },\n {\n set_id: 'twitchconNA2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/3',\n title: 'TwitchCon 2023 - Las Vegas',\n description: 'Attended TwitchCon Las Vegas 2023',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/en/las-vegas-2023/',\n },\n ],\n },\n {\n set_id: 'twitchconNA2020',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/3',\n title: 'TwitchCon 2020 - North America',\n description: 'Registered for TwitchCon North America 2020',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna20',\n },\n ],\n },\n {\n set_id: 'twitchconNA2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/3',\n title: 'TwitchCon 2022 - San Diego',\n description: 'Attended TwitchCon San Diego 2022',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/san-diego-2022/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna22',\n },\n ],\n },\n {\n set_id: 'twitchconNA2019',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/3',\n title: 'TwitchCon 2019 - San Diego',\n description: 'Attended TwitchCon San Diego 2019',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna19',\n },\n ],\n },\n {\n set_id: 'twitchconEU2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/3',\n title: 'TwitchCon 2023 - Paris',\n description: 'TwitchCon 2023 - Paris',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/paris-2023/?utm_source=chat_badge',\n },\n ],\n },\n {\n set_id: 'twitchconEU2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/3',\n title: 'TwitchCon 2022 - Amsterdam',\n description: 'Attended TwitchCon Amsterdam 2022',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/amsterdam-2022/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tceu22',\n },\n ],\n },\n {\n set_id: 'twitchcon2018',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/3',\n title: 'TwitchCon 2018 - San Jose',\n description: 'Attended TwitchCon San Jose 2018',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tc18',\n },\n ],\n },\n {\n set_id: 'twitchconAmsterdam2020',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/3',\n title: 'TwitchCon 2020 - Amsterdam',\n description: 'Registered for TwitchCon Amsterdam 2020',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/amsterdam/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcamsterdam20',\n },\n ],\n },\n {\n set_id: 'twitchconEU2019',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/3',\n title: 'TwitchCon 2019 - Berlin',\n description: 'Attended TwitchCon Berlin 2019',\n click_action: 'visit_url',\n click_url:\n 'https://europe.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tceu19',\n },\n ],\n },\n {\n set_id: 'twitchbot',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/3',\n title: 'AutoMod',\n description: 'AutoMod',\n click_action: 'visit_url',\n click_url: 'http://link.twitch.tv/automod_blog',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/3',\n title: 'AutoMod',\n description: 'Badge type for messages that come from the automated moderation system',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'twitchcon2017',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/3',\n title: 'TwitchCon 2017 - Long Beach',\n description: 'Attended TwitchCon Long Beach 2017',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/',\n },\n ],\n },\n {\n set_id: 'twitchcon-2024---rotterdam',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/3',\n title: 'TwitchCon 2024 - Rotterdam',\n description: 'Attended TwitchCon Rotterdam 2024',\n click_action: 'visit_url',\n click_url:\n 'https://twitchcon.com/rotterdam-2024/?utm_source=twitch&utm_medium=chat-badge&utm_campaign=tceu24-chat-badge',\n },\n ],\n },\n {\n set_id: 'twitch-recap-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/3',\n title: 'Twitch Recap 2023',\n description:\n 'This user bled purple like it was their job, and was one of the most engaged members of Twitch in 2023!',\n click_action: 'visit_url',\n click_url: 'https://twitch-web.app.link/e/twitch-recap',\n },\n ],\n },\n {\n set_id: 'twitch-intern-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/3',\n title: 'Twitch Intern 2023',\n description: 'This user was an intern at Twitch for the summer of 2023',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n set_id: 'treasure-adventure-world_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/3',\n title: 'Treasure Adventure World',\n description: 'Treasure Adventure World',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Treasure%20Adventure%20World/details',\n },\n ],\n },\n {\n set_id: 'titan-souls_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/3',\n title: 'Titan Souls',\n description: 'Titan Souls',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Titan%20Souls/details',\n },\n ],\n },\n {\n set_id: 'this-war-of-mine_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/3',\n title: 'This War of Mine',\n description: 'This War of Mine',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/This%20War%20of%20Mine/details',\n },\n ],\n },\n {\n set_id: 'the-surge_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/3',\n title: 'The Surge',\n description: 'The Surge',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n set_id: 'the-surge_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/3',\n title: 'The Surge',\n description: 'The Surge',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n set_id: 'the-surge_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/3',\n title: 'The Surge',\n description: 'The Surge',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n set_id: 'the-golden-predictor-of-the-game-awards-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/3',\n title: 'The Golden Predictor of the Game Awards 2023',\n description:\n \"You've predicted the entire 2023 Game Awards perfectly, here is a special gift for your work. Go ahead, show it off!\",\n click_action: 'visit_url',\n click_url:\n 'https://blog.twitch.tv/2023/11/30/the-2023-game-awards-is-live-on-twitch-december-7th/',\n },\n ],\n },\n {\n set_id: 'the-game-awards-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/3',\n title: 'The Game Awards 2023',\n description:\n 'You’ve completed all categories of the 2023 Twitch Predicts: The Game Awards extension!',\n click_action: 'visit_url',\n click_url:\n 'https://blog.twitch.tv/2023/11/30/the-2023-game-awards-is-live-on-twitch-december-7th/',\n },\n ],\n },\n {\n set_id: 'superhot_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/3',\n title: 'Superhot',\n description: 'Superhot',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/superhot/details',\n },\n ],\n },\n {\n set_id: 'strafe_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/3',\n title: 'Strafe',\n description: 'Strafe',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/strafe/details',\n },\n ],\n },\n {\n set_id: 'streamer-awards-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/3',\n title: 'Streamer Awards 2024',\n description:\n \"You've completed all categories of the 2024 Twitch Predicts: The Streamer Awards extension!\",\n click_action: 'visit_url',\n click_url: 'https://thestreamerawards.com/home',\n },\n ],\n },\n {\n set_id: 'starbound_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/3',\n title: 'Starbound',\n description: 'Starbound',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Starbound/details',\n },\n ],\n },\n {\n set_id: 'staff',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/3',\n title: 'Staff',\n description: 'Twitch Staff',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/jobs?ref=chat_badge',\n },\n ],\n },\n {\n set_id: 'samusoffer_beta',\n versions: [\n {\n id: '0',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/3',\n title: 'beta_title1',\n description: 'beta_title1',\n click_action: 'visit_url',\n click_url: 'https://twitch.amazon.com/prime',\n },\n ],\n },\n {\n set_id: 'rplace-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/3',\n title: 'r/place 2023 Cake',\n description:\n \"A very delicious badge earned by watching Reddit's r/place 2023 event on Twitch Rivals or other participating channels.\",\n click_action: 'visit_url',\n click_url: 'https://www.reddit.com/r/place/',\n },\n ],\n },\n {\n set_id: 'rift_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/3',\n title: 'RIFT',\n description: 'RIFT',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Rift/details',\n },\n ],\n },\n {\n set_id: 'raiden-v-directors-cut_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/3',\n title: 'Raiden V',\n description: 'Raiden V',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Raiden%20V/details',\n },\n ],\n },\n {\n set_id: 'psychonauts_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/3',\n title: 'Psychonauts',\n description: 'Psychonauts',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Psychonauts/details',\n },\n ],\n },\n {\n set_id: 'premium',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/3',\n title: 'Prime Gaming',\n description: 'Prime Gaming',\n click_action: 'visit_url',\n click_url: 'https://gaming.amazon.com',\n },\n ],\n },\n {\n set_id: 'overwatch-league-insider_2019B',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n set_id: 'partner',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/3',\n title: 'Verified',\n description: 'Verified',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/2017/04/24/the-verified-badge-is-here-13381bc05735',\n },\n ],\n },\n {\n set_id: 'overwatch-league-insider_2019A',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n set_id: 'okhlos_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/3',\n title: 'Okhlos',\n description: 'Okhlos',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Okhlos/details',\n },\n ],\n },\n {\n set_id: 'overwatch-league-insider_2018B',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/3',\n title: 'OWL All-Access Pass 2018',\n description: 'OWL All-Access Pass 2018',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n set_id: 'overwatch-league-insider_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/3',\n title: 'OWL All-Access Pass 2018',\n description: 'OWL All-Access Pass 2018',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n set_id: 'kingdom-new-lands_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/3',\n title: 'Kingdom: New Lands',\n description: 'Kingdom: New Lands',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Kingdom:%20New%20Lands/details',\n },\n ],\n },\n {\n set_id: 'jackbox-party-pack_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/3',\n title: 'Jackbox Party Pack',\n description: 'Jackbox Party Pack',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/The%20Jackbox%20Party%20Pack/details',\n },\n ],\n },\n {\n set_id: 'innerspace_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/3',\n title: 'Innerspace',\n description: 'Innerspace',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Innerspace/details',\n },\n ],\n },\n {\n set_id: 'innerspace_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/3',\n title: 'Innerspace',\n description: 'Innerspace',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Innerspace/details',\n },\n ],\n },\n {\n set_id: 'hype-train',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/3',\n title: 'Current Hype Train Conductor',\n description: 'Top supporter during the most recent hype train',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/hype-train-guide',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/3',\n title: 'Former Hype Train Conductor',\n description: 'Top supporter during prior hype trains',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/hype-train-guide',\n },\n ],\n },\n {\n set_id: 'hello_neighbor_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/3',\n title: 'Hello Neighbor',\n description: 'Hello Neighbor',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Hello%20Neighbor/details',\n },\n ],\n },\n {\n set_id: 'gold-pixel-heart',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/3',\n title: 'Gold Pixel Heart',\n description:\n 'Thank you for donating via the Twitch Charity tool during Twitch Together for Good 2023!',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/twitch-charity',\n },\n ],\n },\n {\n set_id: 'heavy-bullets_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/3',\n title: 'Heavy Bullets',\n description: 'Heavy Bullets',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Heavy%20Bullets/details',\n },\n ],\n },\n {\n set_id: 'glitchcon2020',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/3',\n title: 'GlitchCon 2020',\n description: 'Earned for Watching Glitchcon 2020',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/',\n },\n ],\n },\n {\n set_id: 'glhf-pledge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/3',\n title: 'GLHF Pledge',\n description: 'Signed the GLHF pledge in support for inclusive gaming communities',\n click_action: 'visit_url',\n click_url: 'https://www.anykey.org/pledge',\n },\n ],\n },\n {\n set_id: 'getting-over-it_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/3',\n title: 'Getting Over It',\n description: 'Getting Over It',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Getting%20Over%20It/details',\n },\n ],\n },\n {\n set_id: 'getting-over-it_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/3',\n title: 'Getting Over It',\n description: 'Getting Over It',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Getting%20Over%20It/details',\n },\n ],\n },\n {\n set_id: 'frozen-synapse_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/3',\n title: 'Frozen Synapse',\n description: 'Frozen Synapse',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Frozen%20Synapse/details',\n },\n ],\n },\n {\n set_id: 'founder',\n versions: [\n {\n id: '0',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/3',\n title: 'Founder',\n description: 'Founder',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/founders-badge',\n },\n ],\n },\n {\n set_id: 'frozen-cortext_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/3',\n title: 'Frozen Cortext',\n description: 'Frozen Cortext',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Frozen%20Cortex/details',\n },\n ],\n },\n {\n set_id: 'firewatch_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/3',\n title: 'Firewatch',\n description: 'Firewatch',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Firewatch/details',\n },\n ],\n },\n {\n set_id: 'enter-the-gungeon_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/3',\n title: 'Enter The Gungeon',\n description: 'Enter The Gungeon',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Enter%20the%20Gungeon/details',\n },\n ],\n },\n {\n set_id: 'duelyst_5',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_6',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_7',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_4',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'devilian_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/3',\n title: 'Devilian',\n description: 'Devilian',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Devilian/details',\n },\n ],\n },\n {\n set_id: 'devil-may-cry-hd_4',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/3',\n title: 'Devil May Cry HD Collection',\n description: 'Devil May Cry HD Collection',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n set_id: 'devil-may-cry-hd_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/3',\n title: 'Devil May Cry HD Collection',\n description: 'Devil May Cry HD Collection',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n set_id: 'devil-may-cry-hd_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/3',\n title: 'Devil May Cry HD Collection',\n description: 'Devil May Cry HD Collection',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n set_id: 'devil-may-cry-hd_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/3',\n title: 'Devil May Cry HD Collection',\n description: 'Devil May Cry HD Collection',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n set_id: 'deceit_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/3',\n title: 'Deceit',\n description: 'Deceit',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Deceit/details',\n },\n ],\n },\n {\n set_id: 'darkest-dungeon_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/3',\n title: 'Darkest Dungeon',\n description: 'Darkest Dungeon',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Darkest%20Dungeon/details',\n },\n ],\n },\n {\n set_id: 'cuphead_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/3',\n title: 'Cuphead',\n description: 'Cuphead',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Cuphead/details',\n },\n ],\n },\n {\n set_id: 'clip-champ',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/3',\n title: 'Power Clipper',\n description: 'Power Clipper',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/customer/portal/articles/2918323-clip-champs-guide',\n },\n ],\n },\n {\n set_id: 'broken-age_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/3',\n title: 'Broken Age',\n description: 'Broken Age',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Broken%20Age/details',\n },\n ],\n },\n {\n set_id: 'bubsy-the-woolies_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/3',\n title: 'Bubsy: The Woolies Strike Back',\n description: 'Bubsy: The Woolies Strike Back',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Bubsy:%20The%20Woolies%20Strike%20Back/details',\n },\n ],\n },\n {\n set_id: 'bits-leader',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/3',\n title: 'Bits Leader 1',\n description: 'Ranked as a top cheerer on this channel',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/3',\n title: 'Bits Leader 2',\n description: 'Ranked as a top cheerer on this channel',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/3',\n title: 'Bits Leader 3',\n description: 'Ranked as a top cheerer on this channel',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n ],\n },\n {\n set_id: 'brawlhalla_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/3',\n title: 'Brawlhalla',\n description: 'Brawlhalla',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Brawlhalla/details',\n },\n ],\n },\n {\n set_id: 'bits',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/3',\n title: 'cheer 1',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '100',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/3',\n title: 'cheer 100',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/3',\n title: 'cheer 1000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '5000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/3',\n title: 'cheer 5000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '10000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/3',\n title: 'cheer 10000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '25000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/3',\n title: 'cheer 25000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '50000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/3',\n title: 'cheer 50000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '75000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/3',\n title: 'cheer 75000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '100000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/3',\n title: 'cheer 100000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '200000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/3',\n title: 'cheer 200000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '300000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/3',\n title: 'cheer 300000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '400000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/3',\n title: 'cheer 400000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/3',\n title: 'cheer 500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '600000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/3',\n title: 'cheer 600000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '700000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/3',\n title: 'cheer 700000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '800000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/3',\n title: 'cheer 800000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '900000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/3',\n title: 'cheer 900000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/3',\n title: 'cheer 1000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1250000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/3',\n title: 'cheer 1250000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/3',\n title: 'cheer 1500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1750000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/3',\n title: 'cheer 1750000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '2000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/3',\n title: 'cheer 2000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '2500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/3',\n title: 'cheer 2500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '3000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/3',\n title: 'cheer 3000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '3500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/3',\n title: 'cheer 3500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '4000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/3',\n title: 'cheer 4000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '4500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/3',\n title: 'cheer 4500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '5000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/3',\n title: 'cheer 5000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n ],\n },\n {\n set_id: 'bits-charity',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/3',\n title: 'Direct Relief - Charity 2018',\n description: 'Supported their favorite streamer during the 2018 Blizzard of Bits',\n click_action: 'visit_url',\n click_url: 'https://link.twitch.tv/blizzardofbits',\n },\n ],\n },\n {\n set_id: 'battlechefbrigade_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/3',\n title: 'Battle Chef Brigade',\n description: 'Battle Chef Brigade',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n set_id: 'battlerite_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/3',\n title: 'Battlerite',\n description: 'Battlerite',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Battlerite/details',\n },\n ],\n },\n {\n set_id: 'battlechefbrigade_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/3',\n title: 'Battle Chef Brigade',\n description: 'Battle Chef Brigade',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n set_id: 'battlechefbrigade_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/3',\n title: 'Battle Chef Brigade',\n description: 'Battle Chef Brigade',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n set_id: 'axiom-verge_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/3',\n title: 'Axiom Verge',\n description: 'Axiom Verge',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Axiom%20Verge/details',\n },\n ],\n },\n {\n set_id: 'anomaly-2_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/3',\n title: 'Anomaly 2',\n description: 'Anomaly 2',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Anomaly%202/details',\n },\n ],\n },\n {\n set_id: 'anomaly-warzone-earth_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/3',\n title: 'Anomaly Warzone Earth',\n description: 'Anomaly Warzone Earth',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Anomaly:%20Warzone%20Earth/details',\n },\n ],\n },\n {\n set_id: 'ambassador',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/3',\n title: 'Twitch Ambassador',\n description: 'Twitch Ambassador',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/team/ambassadors',\n },\n ],\n },\n {\n set_id: 'H1Z1_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/3',\n title: 'H1Z1',\n description: 'H1Z1',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/H1Z1/details',\n },\n ],\n },\n {\n set_id: '60-seconds_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/3',\n title: '60 Seconds!',\n description: '60 Seconds!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n set_id: '60-seconds_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/3',\n title: '60 Seconds!',\n description: '60 Seconds!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n set_id: '60-seconds_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/3',\n title: '60 Seconds!',\n description: '60 Seconds!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n set_id: '1979-revolution_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/3',\n title: '1979 Revolution',\n description: '1979 Revolution',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/1979%20Revolution/details',\n },\n ],\n },\n {\n set_id: '10-years-as-twitch-staff',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/3',\n title: '10 years as Twitch Staff',\n description: 'Celebrating 10 years as Twitch Staff!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: '15-years-as-twitch-staff',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/3',\n title: '15 years as Twitch Staff',\n description: 'Celebrating 15 years as Twitch Staff!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: '5-years-as-twitch-staff',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/3',\n title: '5 years as Twitch Staff',\n description: 'Celebrating 5 years as Twitch Staff!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'aang',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/3',\n title: 'Aang',\n description:\n 'This badge was earned by subscribing or gifting a sub to an Avatar Legends: The Fighting Game streamer!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'admin',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/3',\n title: 'Admin',\n description: 'Twitch Admin',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'alone',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/3',\n title: 'Alone',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Little Nightmares III category during launch.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'anonymous-cheerer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/3',\n title: 'Anonymous Cheerer',\n description: 'Anonymous Cheerer',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'arc-raiders-launch-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/3',\n title: 'Arc Raiders Launch 2025',\n description:\n 'This badge was earned by subscribing or gifting a sub to an Arc Raiders streamer during launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'arcane-season-2-premiere',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/3',\n title: 'Arcane Season 2 Premiere',\n description: 'This badge was earned by watching the premiere of Arcane Season 2!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'artist-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/3',\n title: 'Artist',\n description: 'Artist on this Channel',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'battlefield-6',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/3',\n title: 'Battlefield 6',\n description: 'This badge was earned by subscribing to a streamer playing Battlefield 6.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'bingbonglove',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/3',\n title: 'BingBongLove',\n description:\n 'This badge was earned by tuning in to a PEAK stream for 15 minutes from February 13 - 28, 2026!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'black-ops-7-global-launch',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/3',\n title: 'Black Ops 7 Global Launch',\n description:\n 'This badge was earned by subscribing to a COD: Black Ops 7 streamer during launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'borderlands-4-badge---ripper',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/3',\n title: 'Borderlands 4 Badge - Ripper',\n description: 'This user joined the ranks of the Rippers in Borderlands 4.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'borderlands-4-badge---vault-symbol',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/3',\n title: 'Borderlands 4 Badge - Vault Symbol',\n description: 'This user is rocking the Vault Symbol from Borderlands 4.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'bot-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/3',\n title: 'Chat Bot',\n description: 'This Bot has been added to the channel by the broadcaster.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'broadcaster',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/3',\n title: 'Broadcaster',\n description: 'Broadcaster',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'bungie-foundation-ally',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/3',\n title: 'Bungie Foundation Ally',\n description: 'This badge is awarded for being an ally of the Bungie Foundation!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'bungie-foundation-supporter',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/3',\n title: 'Bungie Foundation Supporter',\n description: 'This badge is awarded for being a supporter of the Bungie Foundation!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'chatter-cs-go-2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/3',\n title: 'CS:GO Week Brazil 2022',\n description: 'Chatted during CS:GO Week Brazil 2022',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'clips-leader',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/3',\n title: 'Clips Leader 1',\n description: 'Ranked as a top clipper in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/3',\n title: 'Clips Leader 2',\n description: 'Ranked as a top clipper in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/3',\n title: 'Clips Leader 3',\n description: 'Ranked as a top clipper in this community',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'creator-cs-go-2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/3',\n title: 'CS:GO Week Brazil 2022',\n description: 'Streamed during CS:GO Week Brazil 2022',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'crimson-butterfly',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/3',\n title: 'Crimson Butterfly',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the FATAL FRAME II: Crimson Butterfly REMAKE category!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'diablo-30th-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/3',\n title: 'Diablo 30th Anniversary',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Diablo IV streamer during the Diablo 30th Anniversary!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'diana',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/3',\n title: 'Diana',\n description:\n 'This badge was earned by subscribing or gifting a sub for a streamer in the Pragmata category',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'ditto',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/3',\n title: 'Ditto',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Pokémon Pokopia streamer during launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'dragonscimmy',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/3',\n title: 'DragonScimmy',\n description:\n 'This badge was earned by subscribing or gifting a sub to any Old School RuneScape broadcast in 2025 during the launch of Sailing, OSRS’ first ever new skill!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'dreamcon-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/3',\n title: 'Dream Con 2024',\n description:\n 'This badge was earned by watching Dream Con 2024 or completing the post-event survey!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'elden-ring-recluse',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/3',\n title: 'Elden Ring SuperFan badge - Recluse',\n description:\n 'You used Stream Together or participated in a stream before or after Nightreign dropped. You’ve earned the Recluse badge.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'elden-ring-wylder',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/3',\n title: 'Elden Ring Nightreign Clip badge - Wylder',\n description: 'You captured a clippable Elden Ring moment. You’ve earned the Wylder badge.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'eso_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/3',\n title: 'Elder Scrolls Online',\n description: 'Elder Scrolls Online',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'evo-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/3',\n title: 'Evo 2025',\n description: 'You have earned the Evo 2025 Badge',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'extension',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/3',\n title: 'Extension',\n description: 'Extension',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'fallout-season-2-ghoul',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/3',\n title: 'Fallout Season 2 Ghoul',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Fallout 76 streamer during the launch of Burning Springs and Fallout Season 2!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'first-stand-2026-supporter',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/3',\n title: 'First Stand 2026 Supporter',\n description: 'This badge was rewarded to fans who supported First Stand 2026!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'first-stand-2026-viewer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/3',\n title: 'First Stand 2026 Viewer',\n description: 'This badge was rewarded to fans who watched First Stand 2026!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'fischer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/3',\n title: 'Fischer',\n description: 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'frog-lantern',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/3',\n title: 'Frog Lantern',\n description:\n 'This badge was earned by subscribing or gifting three times in the Sea of Thieves category!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'game-developer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/3',\n title: 'Game Developer',\n description: 'Game Developer for:',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'gears-of-war-superfan-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/3',\n title: 'Gears of War Superfan Badge',\n description: 'This user is a Gears of War: Reloaded Superfan.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'gingko-leaf',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/3',\n title: 'Gingko Leaf',\n description:\n \"This badge was earned by watching 30 minutes of a Ghost of Yotei stream during the game's launch!\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'global_mod',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/3',\n title: 'Global Moderator',\n description: 'Global Moderator',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'gold-pixel-heart---together-for-good-24',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/3',\n title: \"Gold Pixel Heart - Together For Good '24\",\n description:\n 'This badge was earned by donating $50 or more as part of Twitch Together for Good 2024!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'gp-explorer-3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/3',\n title: 'GP Explorer 3',\n description:\n 'This badge was earned by watching 15 minutes of GP Explorer 3 on any of the broadcasting channels.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'hornet',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/3',\n title: 'Hornet',\n description:\n 'This badge was earned by subscribing to a streamer in the Hollow Knight: Silksong category during game launch week.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'hunt-crosses',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/3',\n title: 'Hunt Crosses',\n description:\n 'This badge was earned by subscribing or gifting a sub in the Hunt: Showdown 1896 category from Dec. 12 - Dec. 24, 2025.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'hypershot-celestial',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/3',\n title: 'Hypershot Celestial',\n description: 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'jeff-the-land-shark',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/3',\n title: 'Jeff the Land Shark',\n description:\n \"This badge was earned by subscribing or gifting a sub in the Marvel Rivals category during Marvel Rivals' 1-year anniversary!\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'k4sen-con-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/3',\n title: 'The K4SEN Con 2025',\n description: 'This badge was earned by watching 30 minutes of K4SEN Con 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'kodama',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/3',\n title: 'Kodama',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Nioh 3 category',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'la-velada-iv',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/3',\n title: 'La Velada del Año IV',\n description: 'This badge was earned for watching La Velada del Año IV!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'la-velada-v-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/3',\n title: 'La Velada V Badge',\n description: 'This badge was earned by watching La Velada V!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'lamby',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/3',\n title: 'Lamby',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Cult of the Lamb streamer!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'lead_moderator',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/3',\n title: 'Lead Moderator',\n description: 'A badge for users who are a lead moderator in the channel',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'league-of-legends-mid-season-invitational-2025---grey',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/3',\n title: 'League of Legends Mid Season Invitational 2025 Support a Streamer',\n description:\n 'This badge was earned by gifting a subscription to a streamer in the League of Legends category during MSI 2025.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'league-of-legends-mid-season-invitational-2025---purple',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/3',\n title: 'League of Legends Mid Season Invitational 2025',\n description:\n 'This badge was earned by subscribing to a lolesports channel during MSI 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'legendus',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/3',\n title: 'LEGENDUS',\n description:\n 'This badge was granted to users who watched LEGENDUS ITADAKI, hosted by fps_shaka, on June 28-June 29, 2025.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'lol-worlds-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/3',\n title: 'LoL Worlds 2025',\n description:\n 'This badge was earned by subscribing to a participating LoL Esports broadcast or co-stream of the 2025 League of Legends World Championship!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'lost-ark-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/3',\n title: 'Lost Ark Anniversary',\n description:\n 'This badge was earned by watching your favorite Lost Ark streamer during the 4th Anniversary!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'low',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/3',\n title: 'Low',\n description:\n 'This badge was earned by watching 30 minutes in the Little Nightmares III category during launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'marathon-reveal-runner',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/3',\n title: 'Marathon Reveal Runner',\n description: 'This badge was earned by subscribing during the Marathon reveal stream!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'marathon-silkworm',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/3',\n title: 'Marathon Silkworm',\n description:\n 'This Chat Badge was unlocked by watching the Marathon Server Slam & Launch Week!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'marathon-sub-burger',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/3',\n title: 'Marathon Sub Burger',\n description: \"A tasty burger for you and a friend! Tastes like meat. Isn't\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'mel',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/3',\n title: 'Mel',\n description:\n 'This badge was earned by subscribing or gifting a sub for a streamer in the Hades II category.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'moderator',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/3',\n title: 'Moderator',\n description: 'Moderator',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'moments',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/3',\n title: 'Moments Badge - Tier 1',\n description: 'Earned for being a part of at least 1 moment on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/3',\n title: 'Moments Badge - Tier 2',\n description: 'Earned for being a part of at least 5 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/3',\n title: 'Moments Badge - Tier 3',\n description: 'Earned for being a part of at least 10 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/3',\n title: 'Moments Badge - Tier 4',\n description: 'Earned for being a part of at least 15 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/3',\n title: 'Moments Badge - Tier 5',\n description: 'Earned for being a part of at least 20 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '6',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/3',\n title: 'Moments Badge - Tier 6',\n description: 'Earned for being a part of at least 30 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '7',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/3',\n title: 'Moments Badge - Tier 7',\n description: 'Earned for being a part of at least 40 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '8',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/3',\n title: 'Moments Badge - Tier 8',\n description: 'Earned for being a part of at least 50 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '9',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/3',\n title: 'Moments Badge - Tier 9',\n description: 'Earned for being a part of at least 60 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '10',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/3',\n title: 'Moments Badge - Tier 10',\n description: 'Earned for being a part of at least 75 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '11',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/3',\n title: 'Moments Badge - Tier 11',\n description: 'Earned for being a part of at least 90 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '12',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/3',\n title: 'Moments Badge - Tier 12',\n description: 'Earned for being a part of at least 105 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '13',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/3',\n title: 'Moments Badge - Tier 13',\n description: 'Earned for being a part of at least 120 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '14',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/3',\n title: 'Moments Badge - Tier 14',\n description: 'Earned for being a part of at least 140 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '15',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/3',\n title: 'Moments Badge - Tier 15',\n description: 'Earned for being a part of at least 160 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '16',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/3',\n title: 'Moments Badge - Tier 16',\n description: 'Earned for being a part of at least 180 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '17',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/3',\n title: 'Moments Badge - Tier 17',\n description: 'Earned for being a part of at least 200 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '18',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/3',\n title: 'Moments Badge - Tier 18',\n description: 'Earned for being a part of at least 225 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '19',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/3',\n title: 'Moments Badge - Tier 19',\n description: 'Earned for being a part of at least 250 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '20',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/3',\n title: 'Moments Badge - Tier 20',\n description: 'Earned for being a part of at least 275 moments on a channel',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'mr-raccoon',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/3',\n title: 'Mr. Raccoon',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Resident Evil: Requiem streamer.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'never-grave---witch-hat',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/3',\n title: 'Never Grave - Witch Hat',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Never Grave category during the game launch',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'no_audio',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/3',\n title: 'Watching without audio',\n description: 'Individuals with unreliable or no sound can select this badge',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'no_video',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/3',\n title: 'Listening only',\n description: 'Individuals with unreliable or no video can select this badge',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'path-of-exile-2-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/3',\n title: 'Chaos Orb',\n description:\n \"This badge was earned by subscribing to a streamer during Path of Exile 2's launch!\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'pokemon-30th-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/3',\n title: 'Pokémon 30th',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in an eligible Pokémon category!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'pokemon-legends-z-a-chikorita',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/3',\n title: 'Pokémon Legends: Z-A Chikorita',\n description:\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends: Z-A for Chikorita.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'pokemon-legends-z-a-tepig',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/3',\n title: 'Pokémon Legends: Z-A Tepig',\n description:\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends Z-A for Tepig.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'pokemon-legends-z-a-totodile',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/3',\n title: 'Pokémon Legends: Z-A Totodile',\n description:\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends: Z-A for Totodile.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'power-rangers',\n versions: [\n {\n id: '0',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/3',\n title: 'Black Ranger',\n description: 'Black Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/3',\n title: 'Blue Ranger',\n description: 'Blue Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/3',\n title: 'Green Ranger',\n description: 'Green Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/3',\n title: 'Pink Ranger',\n description: 'Pink Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/3',\n title: 'Red Ranger',\n description: 'Red Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/3',\n title: 'White Ranger',\n description: 'White Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '6',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/3',\n title: 'Yellow Ranger',\n description: 'Yellow Ranger',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'predictions',\n versions: [\n {\n id: 'blue-1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/3',\n title: 'Predicted Blue (1)',\n description: 'Predicted Outcome One',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-10',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/3',\n title: 'Predicted Blue (10)',\n description: 'Predicted Outcome Ten',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/3',\n title: 'Predicted Blue (2)',\n description: 'Predicted Outcome Two',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/3',\n title: 'Predicted Blue (3)',\n description: 'Predicted Outcome Three',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/3',\n title: 'Predicted Blue (4)',\n description: 'Predicted Outcome Four',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/3',\n title: 'Predicted Blue (5)',\n description: 'Predicted Outcome Five',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-6',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/3',\n title: 'Predicted Blue (6)',\n description: 'Predicted Outcome Six',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-7',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/3',\n title: 'Predicted Blue (7)',\n description: 'Predicted Outcome Seven',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-8',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/3',\n title: 'Predicted Blue (8)',\n description: 'Predicted Outcome Eight',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-9',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/3',\n title: 'Predicted Blue (9)',\n description: 'Predicted Outcome Nine',\n click_action: null,\n click_url: null,\n },\n {\n id: 'gray-1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/3',\n title: 'Predicted Gray (1)',\n description: 'Predicted Gray (1)',\n click_action: null,\n click_url: null,\n },\n {\n id: 'gray-2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/3',\n title: 'Predicted Gray (2)',\n description: 'Predicted Gray (2)',\n click_action: null,\n click_url: null,\n },\n {\n id: 'pink-1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/3',\n title: 'Predicted Pink (1)',\n description: 'Predicted Outcome One',\n click_action: null,\n click_url: null,\n },\n {\n id: 'pink-2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/3',\n title: 'Predicted Pink (2)',\n description: 'Predicted Outcome Two',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'purple-noob',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/3',\n title: 'Purple Noob',\n description:\n 'Watch 1 hour of Roblox content on Twitch to earn this happy little badge. EZ W.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'purple-pixel-heart---together-for-good-24',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/3',\n title: \"Purple Pixel Heart - Together For Good '24\",\n description:\n 'This badge was earned by donating $5 or more as part of Twitch Together for Good 2024!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'raging-wolf-helm',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/3',\n title: 'Raging Wolf Helm',\n description:\n 'This badge was earned for watching Elden Ring during the initial Shadow of the Erdtree Expansion launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'raider-icon-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/3',\n title: 'Raider Icon',\n description:\n 'This badge was earned by subscribing or gifting a sub to any ARC Raiders broadcast during the campaign period',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'rainbow-six-siege-x-10th-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/3',\n title: 'Rainbow Six Siege X 10th Anniversary',\n description:\n 'This badge was earned by subscribing of gifting a sub to a Rainbow Six Siege X streamer during its 10th anniversary celebration!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'revedtv-stream-awards-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/3',\n title: 'RevedTV StreamAwards 2025',\n description: \"This badge was earned by watching RevedTV's StreamAwards 2025.\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'ruby-pixel-heart---together-for-good-24',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/3',\n title: \"Ruby Pixel Heart - Together For Good '24\",\n description:\n 'This badge was earned by donating $25 or more as part of Twitch Together for Good 2024!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'rudy',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/3',\n title: 'Rudy',\n description:\n 'This Rudy badge was earned by subscribing or gifting a sub to a Monster Hunter Stories 3: Twisted Reflection streamer during its launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'rustmas-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/3',\n title: 'Rustmas 2025',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Rust streamer during Rustmas 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'sajam-slam-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/3',\n title: 'Sajam Slam Badge',\n description:\n 'This badge was earned by subscribing in the Street Fighter 6 category during TwitchCon 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'scampuss',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/3',\n title: 'Scampuss',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Nioh 3 category during the game launch.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'seeks-eye',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/3',\n title: \"Seek's Eye\",\n description: 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'social-sharing',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/3',\n title: 'Social Media Badge',\n description: 'This user earned a Icon badge for reaching 100 views on their social posts.',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/3',\n title: 'Social Media Badge',\n description: 'This user earned a Pro badge for reaching 10000 views on their social posts.',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/3',\n title: 'Social Media Badge',\n description:\n 'This user earned a Legend badge for reaching 100000 views on their social posts.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'sonic-racing-crossworlds',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/3',\n title: 'Sonic Racing',\n description:\n 'This badge was earned by subscribing to a streamer in the Sonic Racing: Crossworlds category!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'speedons-5-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/3',\n title: 'Speedons 5 Badge',\n description: 'This badge was earned by watching Speedons 5!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'stream-for-humanity-2-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/3',\n title: 'Stream For Humanity 2',\n description: 'Earned by supporting the Stream For Humanity 2 charity marathon',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'streamer-awards-tux',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/3',\n title: 'Streamer Awards Tux',\n description: 'I earned this badge by watching the 2025 Streamer Awards!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'sub-gift-leader',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/3',\n title: 'Gifter Leader 1',\n description: 'Ranked as a top subscription gifter in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/3',\n title: 'Gifter Leader 2',\n description: 'Ranked as a top subscription gifter in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/3',\n title: 'Gifter Leader 3',\n description: 'Ranked as a top subscription gifter in this community',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'sub-gifter',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/3',\n title: 'Sub Gifter',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/3',\n title: '5 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '10',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/3',\n title: '10 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '25',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/3',\n title: '25 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '50',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/3',\n title: '50 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '100',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/3',\n title: '100 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '150',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/3',\n title: '150 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '200',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/3',\n title: '200 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '250',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/3',\n title: '250 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '300',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/3',\n title: '300 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '350',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/3',\n title: '350 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '400',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/3',\n title: '400 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '450',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/3',\n title: '450 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '500',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/3',\n title: '500 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '550',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/3',\n title: '550 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '600',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/3',\n title: '600 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '650',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/3',\n title: '650 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '700',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/3',\n title: '700 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '750',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/3',\n title: '750 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '800',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/3',\n title: '800 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '850',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/3',\n title: '850 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '900',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/3',\n title: '900 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '950',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/3',\n title: '950 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '1000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/3',\n title: '1000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '2000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/3',\n title: '2000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '3000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/3',\n title: '3000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '4000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/3',\n title: '4000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '5000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/3',\n title: '5000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'subscriber',\n versions: [\n {\n id: '0',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\n title: 'Subscriber',\n description: 'Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\n title: 'Subscriber',\n description: 'Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/3',\n title: '2-Month Subscriber',\n description: '2-Month Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/3',\n title: '3-Month Subscriber',\n description: '3-Month Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/3',\n title: '6-Month Subscriber',\n description: '6-Month Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/3',\n title: '9-Month Subscriber',\n description: '9-Month Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '6',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/3',\n title: '6-Month Subscriber',\n description: '1-Year Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n ],\n },\n {\n set_id: 'subtember-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/3',\n title: 'SUBtember 2025',\n description: 'Badge given to users who sub, gift, or use bits during SUBtember 2025.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'superultracombo-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/3',\n title: 'SuperUltraCombo 2023',\n description: \"This user joined Twitch's SuperUltraCombo 2023\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'survival-cup-4',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/3',\n title: 'Survival Cup 4',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer during Survival Cup 4!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'tft-paris-open',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/3',\n title: 'TFT Paris Open',\n description:\n 'This chat badge was awarded for gifting two subscriptions to a TFT streamer during the 2025 TFT Paris Open!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'the-deer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/3',\n title: 'The Deer',\n description: 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'the-first-descendant-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/3',\n title: 'The First Descendant Badge',\n description:\n 'This badge was earned by subscribing to a streamer playing The First Descendant during launch week!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'the-man-without-fear',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/3',\n title: 'The Man Without Fear',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Marvel Rivals category for the start of Season 4.5!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'the-onryos-mask',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/3',\n title: \"The Onryō's Mask\",\n description:\n \"This badge was earned by subscribing to a Ghost of Yotei streamer during the game's launch!\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'together-for-good-25---good-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/3',\n title: \"Together for Good '25 - Good Badge\",\n description:\n 'This badge was earned by donating $5 or more during Twitch Together for Good 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'together-for-good-25---gooder-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/3',\n title: \"Together for Good '25 - Gooder Badge\",\n description:\n 'This badge was earned by donating $50 or more during Twitch Together for Good 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'together-for-good-25---goodest-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/3',\n title: \"Together for Good '25 - Goodest Badge\",\n description:\n 'This badge was earned by donating $100 or more during Twitch Together for Good 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'together-for-good-25---wicked-dub-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/3',\n title: \"Together for Good '25 - Wicked Dub Badge\",\n description:\n 'This badge was earned by donating at least $5 to a charity stream using Stream Together during Together for Good 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'total-war-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/3',\n title: 'Total War Anniversary',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Total War: Warhammer III category during the Total War 25th Anniversary.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'toxic-zombie',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/3',\n title: 'Toxic Zombie',\n description:\n 'Purchase 1 new recurring or gift subscription during the Toxic Commando launch 2026 and claim the reward',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'turbo',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/3',\n title: 'Turbo',\n description: \"A subscriber of Twitch's monthly premium user service\",\n click_action: 'turbo',\n click_url: null,\n },\n ],\n },\n {\n set_id: 'twitchcon-2026-europe-row-houses',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/3',\n title: 'TwitchCon 2026 - Europe - Row Houses',\n description:\n 'This badge is given to anyone who purchased a 1-day ticket to TwitchCon Europe 2026.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'twitchcon-2026-europe-windmill',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/3',\n title: 'TwitchCon 2026 - Europe - Windmill',\n description:\n 'This badge is given to anyone who purchased a 2-day ticket to TwitchCon Europe 2026.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'umbrella-corporation',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/3',\n title: 'Umbrella Corporation',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Resident Evil: Requiem streamer.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'user-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/3',\n title: 'Twitchiversary Badge',\n description: 'Staff badge celebrating Twitch tenure',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'vct-paris-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/3',\n title: 'VCT Paris 2025',\n description:\n 'This badge was earned by subscribing to a VALORANT streamer while watching VALORANT Champions 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'yellow-noob',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/3',\n title: 'Yellow Noob',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Roblox category during Bloxfest.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'zevent-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/3',\n title: 'ZEVENT 2024',\n description: 'This badge was earned for watching ZEVENT 2024!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'zevent25',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/3',\n title: 'ZEVENT25',\n description: 'This badge was earned by watching a ZEvent25 stream.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n];\n","export const css_color_names = [\n 'aliceblue',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgreen',\n 'darkgrey',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'green',\n 'greenyellow',\n 'grey',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgreen',\n 'lightgrey',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'rebeccapurple',\n 'red',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen',\n 'transparent',\n];\n","import { BttvEmote, SeventvEmote, TwitchEmote } from '../../types/emote.js';\n\nconst SeventvEmotes = [\n {\n id: '01FCY771D800007PQ2DF3GDTN6',\n name: 'RainTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/4x.webp',\n },\n },\n {\n id: '01FE3XY508000AA32JP519W2EW',\n name: 'PETPET',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/4x.webp',\n },\n },\n {\n id: '01GGD5PJA8000FH13S498E9D8X',\n name: 'ppL',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/4x.webp',\n },\n },\n {\n id: '01GB2TN09G000AZXHZ8HNEZX6G',\n name: 'Clap2',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/4x.webp',\n },\n },\n {\n id: '01GAM8EFQ00004MXFXAJYKA859',\n name: 'Clap',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/4x.webp',\n },\n },\n {\n id: '01GAFTZ9K80003DHH026MC7JW0',\n name: 'PepePls',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/4x.webp',\n },\n },\n {\n id: '01GAZ199Z8000FEWHS6AT5QZV0',\n name: 'peepoHappy',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/4x.webp',\n },\n },\n {\n id: '01GAZ4SBX80007YCE2RXBT44B2',\n name: 'peepoSad',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/4x.webp',\n },\n },\n {\n id: '01GB9W8JN80004CKF2H1TWA99H',\n name: 'FeelsDankMan',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/4x.webp',\n },\n },\n {\n id: '01GB2S7H7000018VJGJ4A9BMFS',\n name: 'BillyApprove',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/4x.webp',\n },\n },\n {\n id: '01GB8EQNJ8000497KFBZWNSDFZ',\n name: 'forsenPls',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/4x.webp',\n },\n },\n {\n id: '01GB54CZTG0004ZBZEDT30HE2M',\n name: 'RoxyPotato',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/4x.webp',\n },\n },\n {\n id: '01GB4P2HX0000BJ5HR8F6XV9Q0',\n name: 'gachiBASS',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/4x.webp',\n },\n },\n {\n id: '01GKQXGX1R000216YB0K7GN92X',\n name: '(7TV)',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/4x.webp',\n },\n },\n {\n id: '01FKSDK14G0008TM5NY9QEG0QV',\n name: 'PartyParrot',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/4x.webp',\n },\n },\n {\n id: '01GB5VC57000003DZTMZQNY944',\n name: 'RebeccaBlack',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/4x.webp',\n },\n },\n {\n id: '01F014S6KG0007E4VV006YKSM3',\n name: 'reckH',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/4x.webp',\n },\n },\n {\n id: '01G98W833R0000BRQD106P0ZNT',\n name: 'WAYTOODANK',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/4x.webp',\n },\n },\n {\n id: '01GB2ZJFBG000DTBJYANG8XYFP',\n name: 'AlienDance',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/4x.webp',\n },\n },\n {\n id: '01G4GQC5H0000D3DGNAYJJP8EB',\n name: 'Gayge',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/4x.webp',\n },\n },\n {\n id: '01GGCQPCGR000C7MT8JZGP6E89',\n name: 'ApuApustaja',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/4x.webp',\n },\n },\n {\n id: '01GB9W2CDG000BFSD141G0MGSA',\n name: 'BasedGod',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/4x.webp',\n },\n },\n {\n id: '01G98V5RFG0001CD052SPS435F',\n name: 'GuitarTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/4x.webp',\n },\n },\n {\n id: '01HM524VE80004SKSHMCZWXH1T',\n name: 'peepoPls',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/4x.webp',\n },\n },\n {\n id: '01HM4P26CR000449DZBT4FVMA5',\n name: 'TeaTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/4x.webp',\n },\n },\n {\n id: '01HM4PGHC80007635TAZG67FT5',\n name: 'WineTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/4x.webp',\n },\n },\n {\n id: '01G98V81Q80000BRQD106P0ZEK',\n name: 'PianoTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/4x.webp',\n },\n },\n {\n id: '01G98TT6BR000A39K5ZSQFTPWR',\n name: 'CrayonTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/4x.webp',\n },\n },\n {\n id: '01HM6NJ2X000035ZKVAPWBNW26',\n name: 'nymnCorn',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/4x.webp',\n },\n },\n {\n id: '01HM2F7Q1R00022X3E2804NBNQ',\n name: 'SteerR',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/4x.webp',\n },\n },\n {\n id: '01J107C3E8000DX4MZBQSYGRXS',\n name: 'sevenTV',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/4x.webp',\n },\n },\n {\n id: '01FTEZEE900001E12995B12GR4',\n name: 'nanaAYAYA',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/4x.webp',\n },\n },\n {\n id: '01J8NMZ2HG0005G1FWF2H9Y615',\n name: 'BibleThump',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/4x.webp',\n },\n },\n {\n id: '01H16FA16G0005EZED5J0EY7KN',\n name: 'glorp',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/4x.webp',\n },\n },\n {\n id: '01GG3YGWK8000DWE419062SG28',\n name: 'Stare',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/4x.webp',\n },\n },\n {\n id: '01JY2MX5BE5BVWWFV153ANMMHZ',\n name: 'aceStare',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/4x.webp',\n },\n },\n {\n id: '01F9EM2ETG000E7SC8F953GXCX',\n name: 'gachiGASM',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/4x.webp',\n },\n },\n {\n id: '01GB32XE6R00018VJGJ4A9BNCV',\n name: 'AYAYA',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/4x.webp',\n },\n },\n {\n id: '01GB4XE3ZR000DKFRGM9Q1M7VS',\n name: 'RareParrot',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/4x.webp',\n },\n },\n {\n id: '01GB4FWTR8000DGEZ8VYY59RBN',\n name: 'FeelsWeirdMan',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/4x.webp',\n },\n },\n {\n id: '01GB4CK01800090V9B3D8CGEEX',\n name: 'EZ',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/4x.webp',\n },\n },\n {\n id: '01GB46137R000BJ5HR8F6XV8J1',\n name: 'FeelsOkayMan',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/4x.webp',\n },\n },\n {\n id: '01GB4EV0Q800090V9B3D8CGEHV',\n name: 'FeelsStrongMan',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/4x.webp',\n },\n },\n {\n id: '01GBFDVP18000CRDCG0DV7KEMY',\n name: '7Cinema',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/4x.webp',\n },\n },\n];\n\nconst BttvEmotes = [\n {\n id: '54fa8f1401e468494b85b537',\n name: ':tf:',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/3x',\n },\n },\n {\n id: '54fa8fce01e468494b85b53c',\n name: 'CiGrip',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/3x',\n },\n },\n {\n id: '54fa903b01e468494b85b53f',\n name: 'DatSauce',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/3x',\n },\n },\n {\n id: '54fa909b01e468494b85b542',\n name: 'ForeverAlone',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/3x',\n },\n },\n {\n id: '54fa90ba01e468494b85b543',\n name: 'GabeN',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/3x',\n },\n },\n {\n id: '54fa90f201e468494b85b545',\n name: 'HailHelix',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/3x',\n },\n },\n {\n id: '54fa932201e468494b85b555',\n name: 'ShoopDaWhoop',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/3x',\n },\n },\n {\n id: '54fab45f633595ca4c713abc',\n name: 'M&Mjc',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/1x',\n '2': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/2x',\n '4': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/3x',\n },\n },\n {\n id: '54fab7d2633595ca4c713abf',\n name: 'bttvNice',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/1x',\n '2': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/2x',\n '4': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/3x',\n },\n },\n {\n id: '54fa935601e468494b85b557',\n name: 'TwaT',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/3x',\n },\n },\n {\n id: '54fa99b601e468494b85b55d',\n name: 'WatChuSay',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/3x',\n },\n },\n {\n id: '566ca11a65dbbdab32ec0558',\n name: 'tehPoleCat',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/3x',\n },\n },\n {\n id: '566ca1a365dbbdab32ec055b',\n name: 'AngelThump',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/3x',\n },\n },\n {\n id: '54fbefeb01abde735115de5b',\n name: 'TaxiBro',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/3x',\n },\n },\n {\n id: '54fbf00a01abde735115de5c',\n name: 'BroBalt',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/3x',\n },\n },\n {\n id: '54fbf09c01abde735115de61',\n name: 'CandianRage',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/3x',\n },\n },\n {\n id: '55028cd2135896936880fdd7',\n name: 'D:',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/1x',\n '2': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/2x',\n '4': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/3x',\n },\n },\n {\n id: '550352766f86a5b26c281ba2',\n name: 'VisLaud',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/1x',\n '2': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/2x',\n '4': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/3x',\n },\n },\n {\n id: '550b344bff8ecee922d2a3c1',\n name: 'KaRappa',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/1x',\n '2': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/2x',\n '4': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/3x',\n },\n },\n {\n id: '566ca00f65dbbdab32ec0544',\n name: 'FishMoley',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/3x',\n },\n },\n {\n id: '566ca02865dbbdab32ec0547',\n name: 'Hhhehehe',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/3x',\n },\n },\n {\n id: '566ca04265dbbdab32ec054a',\n name: 'KKona',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/3x',\n },\n },\n {\n id: '566ca09365dbbdab32ec0555',\n name: 'PoleDoge',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/3x',\n },\n },\n {\n id: '553b48a21f145f087fc15ca6',\n name: 'sosGame',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/1x',\n '2': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/2x',\n '4': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/3x',\n },\n },\n {\n id: '55471c2789d53f2d12781713',\n name: 'CruW',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/1x',\n '2': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/2x',\n '4': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/3x',\n },\n },\n {\n id: '555015b77676617e17dd2e8e',\n name: 'RarePepe',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/1x',\n '2': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/2x',\n '4': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/3x',\n },\n },\n {\n id: '555981336ba1901877765555',\n name: 'haHAA',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/1x',\n '2': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/2x',\n '4': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/3x',\n },\n },\n {\n id: '55b6524154eefd53777b2580',\n name: 'FeelsBirthdayMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/1x',\n '2': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/2x',\n '4': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/3x',\n },\n },\n {\n id: '55f324c47f08be9f0a63cce0',\n name: 'RonSmug',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/1x',\n '2': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/2x',\n '4': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/3x',\n },\n },\n {\n id: '560577560874de34757d2dc0',\n name: 'KappaCool',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/1x',\n '2': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/2x',\n '4': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/3x',\n },\n },\n {\n id: '566c9fc265dbbdab32ec053b',\n name: 'FeelsBadMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/3x',\n },\n },\n {\n id: '566c9f3b65dbbdab32ec052e',\n name: 'bUrself',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/3x',\n },\n },\n {\n id: '566c9f6365dbbdab32ec0532',\n name: 'ConcernDoge',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/3x',\n },\n },\n {\n id: '566c9fde65dbbdab32ec053e',\n name: 'FeelsGoodMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/3x',\n },\n },\n {\n id: '566c9ff365dbbdab32ec0541',\n name: 'FireSpeed',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/3x',\n },\n },\n {\n id: '566ca06065dbbdab32ec054e',\n name: 'NaM',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/3x',\n },\n },\n {\n id: '566ca38765dbbdab32ec0560',\n name: 'SourPls',\n platform: 'bttv',\n animated: true,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/3x',\n },\n },\n {\n id: '566dde0e65dbbdab32ec068f',\n name: 'FeelsSnowMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/1x',\n '2': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/2x',\n '4': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/3x',\n },\n },\n {\n id: '566decae65dbbdab32ec0699',\n name: 'FeelsSnowyMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/1x',\n '2': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/2x',\n '4': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/3x',\n },\n },\n {\n id: '567b00c61ddbe1786688a633',\n name: 'LuL',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/1x',\n '2': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/2x',\n '4': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/3x',\n },\n },\n {\n id: '56901914991f200c34ffa656',\n name: 'SaltyCorn',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/1x',\n '2': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/2x',\n '4': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/3x',\n },\n },\n {\n id: '56e9f494fff3cc5c35e5287e',\n name: 'monkaS',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/1x',\n '2': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/2x',\n '4': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/3x',\n },\n },\n {\n id: '56f5be00d48006ba34f530a4',\n name: 'VapeNation',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/1x',\n '2': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/2x',\n '4': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/3x',\n },\n },\n {\n id: '56fa09f18eff3b595e93ac26',\n name: 'ariW',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/1x',\n '2': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/2x',\n '4': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/3x',\n },\n },\n {\n id: '5709ab688eff3b595e93c595',\n name: 'notsquishY',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/1x',\n '2': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/2x',\n '4': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/3x',\n },\n },\n {\n id: '5733ff12e72c3c0814233e20',\n name: 'FeelsAmazingMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/1x',\n '2': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/2x',\n '4': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/3x',\n },\n },\n {\n id: '573d38b50ffbf6cc5cc38dc9',\n name: 'DuckerZ',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/1x',\n '2': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/2x',\n '4': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/3x',\n },\n },\n {\n id: '580e438942170bfd57189866',\n name: 'FeelsPumpkinMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/1x',\n '2': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/2x',\n '4': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/3x',\n },\n },\n {\n id: '59cf182fcbe2693d59d7bf46',\n name: 'SqShy',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/1x',\n '2': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/2x',\n '4': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/3x',\n },\n },\n {\n id: '58d2e73058d8950a875ad027',\n name: 'Wowee',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/1x',\n '2': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/2x',\n '4': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/3x',\n },\n },\n {\n id: '5dc36a8db537d747e37ac187',\n name: 'WubTF',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/1x',\n '2': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/2x',\n '4': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/3x',\n },\n },\n {\n id: '5e76d2ab8c0f5c3723a9a87d',\n name: 'cvR',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/3x',\n },\n },\n {\n id: '5e76d2d2d112fc372574d222',\n name: 'cvL',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/3x',\n },\n },\n {\n id: '5e76d338d6581c3724c0f0b2',\n name: 'cvHazmat',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/3x',\n },\n },\n {\n id: '5e76d399d6581c3724c0f0b8',\n name: 'cvMask',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/3x',\n },\n },\n {\n id: '5ffdf28dc96152314ad63960',\n name: 'DogChamp',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/1x',\n '2': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/2x',\n '4': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/3x',\n },\n },\n {\n id: '6468f7acaee1f7f47567708e',\n name: 'c!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/3x',\n },\n },\n {\n id: '6468f845aee1f7f47567709b',\n name: 'h!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/3x',\n },\n },\n {\n id: '6468f869aee1f7f4756770a8',\n name: 'l!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/3x',\n },\n },\n {\n id: '6468f883aee1f7f4756770b5',\n name: 'r!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/3x',\n },\n },\n {\n id: '6468f89caee1f7f4756770c2',\n name: 'v!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/3x',\n },\n },\n {\n id: '6468f8d1aee1f7f4756770cf',\n name: 'z!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/3x',\n },\n },\n {\n id: '64e3b31920cb0d25d950a9f9',\n name: 'w!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/1x',\n '2': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/2x',\n '4': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/3x',\n },\n },\n {\n id: '65cbe7dbaed093b2eaf87c65',\n name: 'p!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/1x',\n '2': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/2x',\n '4': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/3x',\n },\n },\n {\n id: '662953eeea369c0ece39eb93',\n name: 's!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/1x',\n '2': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/2x',\n '4': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/3x',\n },\n },\n];\n\nconst FfzEmotes = [\n {\n id: '9',\n name: 'ZrehplaR',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/9/1',\n '2': 'https://cdn.frankerfacez.com/emote/9/2',\n '4': 'https://cdn.frankerfacez.com/emote/9/4',\n },\n },\n {\n id: '6',\n name: 'YooHoo',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/6/1',\n '2': 'https://cdn.frankerfacez.com/emote/6/2',\n '4': 'https://cdn.frankerfacez.com/emote/6/4',\n },\n },\n {\n id: '4',\n name: 'ManChicken',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/4/1',\n '2': 'https://cdn.frankerfacez.com/emote/4/2',\n '4': 'https://cdn.frankerfacez.com/emote/4/4',\n },\n },\n {\n id: '3',\n name: 'BeanieHipster',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/3/1',\n '2': 'https://cdn.frankerfacez.com/emote/3/2',\n '4': 'https://cdn.frankerfacez.com/emote/3/4',\n },\n },\n {\n id: '25927',\n name: 'CatBag',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/25927/1',\n '2': 'https://cdn.frankerfacez.com/emote/25927/2',\n '4': 'https://cdn.frankerfacez.com/emote/25927/4',\n },\n },\n {\n id: '27081',\n name: 'ZreknarF',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/27081/1',\n '2': 'https://cdn.frankerfacez.com/emote/27081/2',\n '4': 'https://cdn.frankerfacez.com/emote/27081/4',\n },\n },\n {\n id: '28136',\n name: 'LilZ',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/28136/1',\n '2': 'https://cdn.frankerfacez.com/emote/28136/2',\n '4': 'https://cdn.frankerfacez.com/emote/28136/4',\n },\n },\n {\n id: '28138',\n name: 'ZliL',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/28138/1',\n '2': 'https://cdn.frankerfacez.com/emote/28138/2',\n '4': 'https://cdn.frankerfacez.com/emote/28138/4',\n },\n },\n {\n id: '149346',\n name: 'LaterSooner',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/149346/1',\n '2': 'https://cdn.frankerfacez.com/emote/149346/2',\n '4': 'https://cdn.frankerfacez.com/emote/149346/4',\n },\n },\n {\n id: '142673',\n name: 'BORT',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/142673/1',\n '2': 'https://cdn.frankerfacez.com/emote/142673/2',\n '4': 'https://cdn.frankerfacez.com/emote/142673/4',\n },\n },\n {\n id: '757384',\n name: 'BibleThump',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/757384/1',\n '2': 'https://cdn.frankerfacez.com/emote/757384/2',\n '4': 'https://cdn.frankerfacez.com/emote/757384/4',\n },\n },\n {\n id: '723890',\n name: 'ffzW',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/723890/1',\n '2': 'https://cdn.frankerfacez.com/emote/723890/2',\n '4': 'https://cdn.frankerfacez.com/emote/723890/4',\n },\n },\n {\n id: '720508',\n name: 'ffzX',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/720508/1',\n '2': 'https://cdn.frankerfacez.com/emote/720508/2',\n '4': 'https://cdn.frankerfacez.com/emote/720508/4',\n },\n },\n {\n id: '720509',\n name: 'ffzY',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/720509/1',\n '2': 'https://cdn.frankerfacez.com/emote/720509/2',\n '4': 'https://cdn.frankerfacez.com/emote/720509/4',\n },\n },\n {\n id: '720729',\n name: 'ffzCursed',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/720729/1',\n '2': 'https://cdn.frankerfacez.com/emote/720729/2',\n '4': 'https://cdn.frankerfacez.com/emote/720729/4',\n },\n },\n];\n\nconst TwitchEmotes = [\n {\n type: 'twitch',\n name: 'AsexualPride',\n id: '307827267',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/3.0',\n },\n start: 0,\n end: 12,\n },\n {\n type: 'twitch',\n name: 'BisexualPride',\n id: '307827313',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/3.0',\n },\n start: 13,\n end: 26,\n },\n {\n type: 'twitch',\n name: 'GayPride',\n id: '307827321',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/3.0',\n },\n start: 27,\n end: 35,\n },\n {\n type: 'twitch',\n name: 'GenderFluidPride',\n id: '307827326',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/3.0',\n },\n start: 36,\n end: 52,\n },\n {\n type: 'twitch',\n name: 'IntersexPride',\n id: '307827332',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/3.0',\n },\n start: 53,\n end: 66,\n },\n {\n type: 'twitch',\n name: 'KappaPride',\n id: '55338',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/3.0',\n },\n start: 67,\n end: 77,\n },\n {\n type: 'twitch',\n name: 'PansexualPride',\n id: '307827370',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/3.0',\n },\n start: 78,\n end: 92,\n },\n {\n type: 'twitch',\n name: 'TransgenderPride',\n id: '307827377',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/3.0',\n },\n start: 93,\n end: 109,\n },\n {\n type: 'twitch',\n name: 'TheIlluminati',\n id: '145315',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/3.0',\n },\n start: 110,\n end: 123,\n },\n {\n type: 'twitch',\n name: 'BrainSlug',\n id: '115233',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/3.0',\n },\n start: 124,\n end: 133,\n },\n {\n type: 'twitch',\n name: 'imGlitch',\n id: '112290',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/3.0',\n },\n start: 134,\n end: 142,\n },\n {\n type: 'twitch',\n name: 'GlitchNRG',\n id: '304489309',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/3.0',\n },\n start: 143,\n end: 152,\n },\n {\n type: 'twitch',\n name: 'TakeNRG',\n id: '112292',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/3.0',\n },\n start: 153,\n end: 160,\n },\n {\n type: 'twitch',\n name: 'DxCat',\n id: '110734',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/3.0',\n },\n start: 161,\n end: 166,\n },\n {\n type: 'twitch',\n name: 'VoHiYo',\n id: '81274',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/3.0',\n },\n start: 167,\n end: 173,\n },\n {\n type: 'twitch',\n name: 'DoritosChip',\n id: '102242',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/3.0',\n },\n start: 174,\n end: 185,\n },\n {\n type: 'twitch',\n name: 'KomodoHype',\n id: '81273',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/3.0',\n },\n start: 186,\n end: 196,\n },\n {\n type: 'twitch',\n name: 'duDudu',\n id: '62834',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/3.0',\n },\n start: 197,\n end: 203,\n },\n {\n type: 'twitch',\n name: 'CoolCat',\n id: '58127',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/3.0',\n },\n start: 204,\n end: 211,\n },\n {\n type: 'twitch',\n name: 'BloodTrail',\n id: '69',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/3.0',\n },\n start: 212,\n end: 222,\n },\n {\n type: 'twitch',\n name: 'PunchTrees',\n id: '47',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/3.0',\n },\n start: 223,\n end: 233,\n },\n {\n type: 'twitch',\n name: 'SSSsss',\n id: '46',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/3.0',\n },\n start: 234,\n end: 240,\n },\n {\n type: 'twitch',\n name: 'SSSsssplode',\n id: 'emotesv2_df1b3a19d9fc4bff81429afdfb46fff0',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/3.0',\n },\n start: 241,\n end: 251,\n },\n {\n type: 'twitch',\n name: 'Kappa',\n id: '25',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/3.0',\n },\n start: 253,\n end: 258,\n },\n {\n type: 'twitch',\n name: 'KappaClaus',\n id: '74510',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/3.0',\n },\n start: 259,\n end: 269,\n },\n {\n type: 'twitch',\n name: 'MrDestructoid',\n id: '28',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/3.0',\n },\n start: 270,\n end: 283,\n },\n {\n type: 'twitch',\n name: 'HSWP',\n id: '446979',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/3.0',\n },\n start: 292,\n end: 296,\n },\n {\n type: 'twitch',\n name: 'Shush',\n id: 'emotesv2_819621bcb8f44566a1bd8ea63d06c58f',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/3.0',\n },\n start: 297,\n end: 302,\n },\n {\n type: 'twitch',\n name: 'KPOPTT',\n id: '304047269',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/3.0',\n },\n start: 303,\n end: 308,\n },\n {\n type: 'twitch',\n name: 'FrogPonder',\n id: 'emotesv2_a3cdcbfcae9b41bb8215b012362eea35',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/3.0',\n },\n start: 310,\n end: 319,\n },\n {\n type: 'twitch',\n name: 'HypeCheer',\n id: 'emotesv2_dd4f4f9cea1a4039ad3390e20900abe4',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/3.0',\n },\n start: 321,\n end: 329,\n },\n {\n type: 'twitch',\n name: 'HypeFail',\n id: 'emotesv2_0330a84e75ad48c1821c1d29a7dadd4d',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/3.0',\n },\n start: 0,\n end: 7,\n },\n {\n type: 'twitch',\n name: 'HypePopcorn',\n id: 'emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/3.0',\n },\n start: 9,\n end: 19,\n },\n {\n type: 'twitch',\n name: 'GlitchCat',\n id: '304486301',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/3.0',\n },\n start: 21,\n end: 30,\n },\n {\n type: 'twitch',\n name: 'SoonerLater',\n id: '2113050',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/3.0',\n },\n start: 31,\n end: 42,\n },\n {\n type: 'twitch',\n name: 'FBBlock',\n id: '1441276',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/3.0',\n },\n start: 43,\n end: 50,\n },\n {\n type: 'twitch',\n name: 'FBCatch',\n id: '1441281',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/3.0',\n },\n start: 51,\n end: 58,\n },\n {\n type: 'twitch',\n name: 'FBPass',\n id: '1441271',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/3.0',\n },\n start: 59,\n end: 65,\n },\n {\n type: 'twitch',\n name: 'FBRun',\n id: '1441261',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/3.0',\n },\n start: 66,\n end: 71,\n },\n {\n type: 'twitch',\n name: 'FBtouchdown',\n id: '626795',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/3.0',\n },\n start: 72,\n end: 83,\n },\n {\n type: 'twitch',\n name: 'FBSpiral',\n id: '1441273',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/3.0',\n },\n start: 84,\n end: 92,\n },\n {\n type: 'twitch',\n name: 'FBPenalty',\n id: '1441289',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/3.0',\n },\n start: 93,\n end: 102,\n },\n {\n type: 'twitch',\n name: 'FBChallenge',\n id: '1441285',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/3.0',\n },\n start: 103,\n end: 114,\n },\n {\n type: 'twitch',\n name: 'PixelBob',\n id: '1547903',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/3.0',\n },\n start: 115,\n end: 123,\n },\n {\n type: 'twitch',\n name: 'LUL',\n id: '425618',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/3.0',\n },\n start: 124,\n end: 127,\n },\n {\n type: 'twitch',\n name: 'DarkMode',\n id: '461298',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/3.0',\n },\n start: 128,\n end: 136,\n },\n {\n type: 'twitch',\n name: 'PopCorn',\n id: '724216',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/3.0',\n },\n start: 137,\n end: 144,\n },\n {\n type: 'twitch',\n name: 'EarthDay',\n id: '959018',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/3.0',\n },\n start: 145,\n end: 153,\n },\n {\n type: 'twitch',\n name: 'TwitchUnity',\n id: '196892',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/3.0',\n },\n start: 154,\n end: 165,\n },\n {\n type: 'twitch',\n name: 'Squid1',\n id: '191762',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/3.0',\n },\n start: 166,\n end: 172,\n },\n {\n type: 'twitch',\n name: 'Squid2',\n id: '191763',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/3.0',\n },\n start: 173,\n end: 179,\n },\n {\n type: 'twitch',\n name: 'Squid3',\n id: '191764',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/3.0',\n },\n start: 180,\n end: 186,\n },\n {\n type: 'twitch',\n name: 'Squid4',\n id: '191767',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/3.0',\n },\n start: 187,\n end: 193,\n },\n {\n type: 'twitch',\n name: 'DinoDance',\n id: 'emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7',\n gif: true,\n animated: true,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/3.0',\n },\n start: 194,\n end: 203,\n },\n {\n type: 'twitch',\n name: 'CrreamAwk',\n id: '191313',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/3.0',\n },\n start: 204,\n end: 213,\n },\n {\n type: 'twitch',\n name: 'PopNemo',\n id: 'emotesv2_5d523adb8bbb4786821cd7091e47da21',\n gif: true,\n animated: true,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/3.0',\n },\n start: 214,\n end: 221,\n },\n];\n\nconst emotes: Array<TwitchEmote | BttvEmote | SeventvEmote> = Object.values([\n ...TwitchEmotes,\n ...BttvEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n ...SeventvEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n ...FfzEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n]).reduce(\n (acc, emote) => {\n if ((emote as any)?.platform) {\n emote.type = (emote as any).platform;\n delete (emote as any).platform;\n }\n\n if (!acc.some((e) => e.name === emote.name)) {\n acc.push({\n ...emote,\n start: 0,\n end: 0,\n } as TwitchEmote | BttvEmote | SeventvEmote);\n }\n\n return acc;\n },\n [] as Array<TwitchEmote | BttvEmote | SeventvEmote>,\n);\n\nexport { TwitchEmotes, BttvEmotes, SeventvEmotes, FfzEmotes, emotes };\n","export const items: any[] = [];\n","export const twitch_messages = [\n 'haHAA',\n 'CiGrip',\n 'PopNemo',\n 'PogChamp',\n 'bttvNice',\n 'ariW wave',\n 'DinoDance',\n 'CruW salute',\n 'c! PogChamp',\n 'LUL LUL LUL',\n 'CandianRage',\n 'CatBag kitty!',\n '<3 good times',\n 'catJAM vibing',\n 'DuckerZ quack',\n ':tf: trollface',\n 'haHAA good one',\n \"HSWP let's go!\",\n 'DxCat claws out',\n 'ConcernDoge hmm',\n 'BroBalt nice one',\n 'VoHiYo everyone!',\n 'LuL that was funny',\n 'Kappa just kidding',\n 'FBCatch nice grab!',\n 'cvHazmat stay safe',\n 'CookieTime nom nom',\n 'LuL that was funny',\n 'CruW crew assembled',\n 'GlitchCat GlitchCat',\n 'CoolCat staying calm',\n 'bUrself be yourself!',\n 'catJAM catJAM catJAM',\n 'HSWP here we go again',\n 'Shush moment incoming',\n 'duDudu rhythm section',\n ':tf: face palm moment',\n 'duDudu rhythm section',\n 'HSWP here we go again',\n 'PunchTrees PunchTrees',\n 'SSSsss Minecraft time',\n 'KappaPride represent!',\n 'haHAA that joke though',\n 'DoritosChip snack time',\n 'DoritosChip snack time',\n 'asexualPride represent',\n 'duDudu dancing on beat',\n 'FBBlock defensive play!',\n 'ariW waving at everyone',\n 'PopNemo finding our way',\n 'ariW waving at everyone',\n 'TheIlluminati confirmed',\n 'SSSsss slithering vibes',\n 'GayPride celebrate love',\n 'BloodTrail hunting time',\n 'TheIlluminati confirmed',\n \"LUL can't stop laughing\",\n 'HypeCheer clap clap clap',\n 'DuckerZ quacking in chat',\n 'Wait for it... PogChamp!',\n 'HypeCheer clap clap clap',\n 'KPOPTT music to our ears',\n 'FrogPonder thinking frog',\n \"IntersexPride we're here\",\n 'KappaPride be proud Kappa',\n 'cvHazmat suit up for this',\n 'BrainSlug giving me ideas',\n 'KappaPride be proud Kappa',\n 'This music is fire catJAM',\n 'I just followed! PogChamp',\n 'MrDestructoid robot vibes',\n 'BroBalt brotherhood moment',\n 'VoHiYo greetings from chat',\n 'PogChamp PogChamp PogChamp',\n 'DxCat meow meow KomodoHype',\n 'Squid1 Squid2 Squid3 Squid4',\n 'KomodoHype the hype is real',\n 'DarkMode gang where you at?',\n 'Wait what just happened? D:',\n 'TakeNRG infinite energy NRG',\n 'CookieTime break time snack',\n 'The dedication is real here',\n 'PopCorn watching this unfold',\n 'CandianRage maple syrup fury',\n 'PopCorn watching this unfold',\n 'LesbianPride strong together',\n 'DinoDance DinoDance DinoDance',\n 'TakeNRG this energy is unreal',\n 'Everyone gets hype! HypeCheer',\n 'CiGrip strong grip on the game',\n 'CoolCat no stress allowed here',\n 'BisexualPride all love matters',\n 'GenderFluidPride freedom to be',\n 'DarkMode gang in here DarkMode',\n \"HypeFail oops that didn't work\",\n 'HypePopcorn this is the moment',\n 'ConcernDoge is everything okay?',\n 'BloodTrail following the leader',\n 'This is so wholesome AngelThump',\n 'ImGlitch technical difficulties',\n 'Anyone else eating? DoritosChip',\n 'PixelBob retro vibes with Kappa',\n 'SoonerLater catch you next time',\n 'imGlitch glitchy but we love it',\n 'KomodoHype the energy is crazy!',\n 'NonbinaryPride beyond the binary',\n 'PansexualPride love is universal',\n 'This community is the best Kappa',\n 'BrainSlug with the big brain play',\n 'TransgenderPride living authentic',\n 'AngelThump wholesomeness incoming',\n 'GlitchCat imGlitch what happened?',\n 'CrreamAwk that was awkward VoHiYo',\n 'IronmouseLuv appreciate the stream',\n 'PunchTrees minecraft mode activated',\n 'The skill on display here is unreal',\n 'LesbianPride GayPride BisexualPride',\n 'PogChamp PogChamp PogChamp PogChamp',\n \"TwitchUnity we're all here for this\",\n 'This is absolutely insane KomodoHype',\n 'Never seen anything like this before',\n 'Vibing with cat-shaped avatars catJAM',\n 'EarthDay appreciation for this stream',\n \"TheIlluminati knows something we don't\",\n \"Shush they're about to do something big\",\n 'Can we appreciate this moment? PogChamp',\n 'MrDestructoid destroying the competition',\n 'AsexualPride IntersexPride GenderFluidPride',\n 'TransgenderPride PansexualPride NonbinaryPride',\n];\n\nexport const youtube_messages = [\n ':ytg: Keep it up!',\n ':yt: YouTube hype!',\n ':gar: Amazing as always!',\n 'No words, just :awesome:',\n 'You got this! :yougotthis:',\n ':elbowbump: Great teamwork!',\n 'Love this energy! :goodvibes:',\n 'Just arrived! :hand-pink-waving:',\n 'Great gameplay! :hand-yellow-nails:',\n ':face-pink-tears: Tears of joy here',\n 'This stream is incredible :awesome:',\n 'Hydration break everyone! :hydrate:',\n ':text-green-game-over: You won this!',\n \":face-blue-star-eyes: You're a star!\",\n 'Virtual hug for everyone :virtualhug:',\n 'Happy to be here! :face-green-smiling:',\n 'Chilling with my dog :chillwdog: vibing',\n ':face-red-heart-shape: Love what you do',\n ':person-turqouise-waving: Hey everyone!',\n 'This community is the best! :goodvibes:',\n ':face-blue-smiling: Amazing vibes today',\n ':goodvibes: Only good vibes in this chat',\n ':body-blue-raised-arms: Victory is ours!',\n ':pride-flower-rainbow-heart: Love is love',\n ':octopus-red-waving: Waves from the chat!',\n ':thanksdoc: Thanks for the entertainment!',\n ':face-purple-crying: Why is this so good??',\n ':eyes-pink-heart-shape: Beautiful gameplay',\n ':fish-orange-wide-eyes: Eyes on the prize!',\n ':whistle-red-blow: That was a performance!',\n 'Respect the grind :hand-green-crystal-ball:',\n 'Learning so much from this stream :learning:',\n ':pride-people-embracing-two: Community love!',\n ':face-red-droopy-eyes: long day but worth it',\n 'Chilling with my cat :chillwcat: so peaceful',\n ':face-fuchsia-tongue-out: Having too much fun',\n ':person-purple-stage-event: This is showtime!',\n ':card-red-penalty: That was risky! Bold move!',\n ':face-purple-smiling-tears: This is too good!',\n ':face-orange-tv-shape: Broadcasting excellence',\n ':face-orange-tv-shape: Broadcasting excellence',\n ':face-blue-heart-eyes: This stream has my heart',\n ':person-turquoise-crowd-surf: Crowd going wild!',\n 'Best gaming session ever :trophy-yellow-smiling:',\n ':hand-purple-blue-peace: Peace out, great stream!',\n ':face-purple-sweating: Clutch moment! So intense!',\n \":hand-orange-covering-eyes: Can't believe my eyes!\",\n ':face-blue-question-mark: How do you even do that?',\n ':baseball-white-cap-out: Home run! Total knockout!',\n ':volcano-green-lava-orange: Things are getting HOT',\n ':face-purple-smiling-fangs: Evil laugh at that play',\n ':stopwatch-blue-hand-timer: Speedrunning like a pro',\n ':location-yellow-teal-bars: Streaming from the top!',\n \":face-purple-open-box: What's next? More surprises?\",\n ':person-turquoise-wizard-wand: Like magic out there!',\n ':face-blue-wide-eyes: Did that actually just happen?!',\n ':medal-yellow-first-red: Number one stream right here',\n ':face-turquoise-music-note: Vibing to this soundtrack',\n 'Can we just appreciate how awesome this is? :awesome:',\n ':popcorn-yellow-striped-smile: This is the main event!',\n ':face-orange-raised-eyebrow: Interesting strategy there',\n \":person-blue-speaking-microphone: Let's go! Hype it up!\",\n ':pride-megaphone-rainbow-handle: Amplifying good vibes!',\n \":rocket-red-countdown-liftoff: Let's go! Time to launch!\",\n ':person-blue-holding-pencil: Taking notes on these skills',\n ':face-fuchsia-poop-shape: That was a mess! But we survived',\n ':person-pink-swaying-hair: The style, the skill, everything!',\n ':body-turquoise-yoga-pose: So smooth and calm under pressure',\n ':penguin-blue-waving-tear: Goodbye for now, fantastic stream!',\n ':face-turquoise-covering-eyes: Wait what? How did you do that?',\n ':face-turquoise-covering-eyes: Wait what? How did you do that?',\n ':clock-turquoise-looking-up: What time is it? Time to watch you!',\n ':person-blue-eating-spaghetti: Fueling up after that performance',\n \":hourglass-purple-sand-orange: Time flies when you're having fun\",\n ':face-turquoise-drinking-coffee: Coffee and gaming, perfect combo',\n \":person-turquoise-writes-headphones: That's some creative strategy\",\n ':face-purple-rain-drops: Emotional over here :face-pink-drinking-tea:',\n ':pride-person-heart-lesbian: Proud and here :pride-flowers-turquoise-transgender:',\n];\n\nexport const normal_messages = [\n 'GG!',\n 'Wow just wow',\n 'Fire fire fire',\n 'Simply amazing',\n 'Never gets old',\n 'Veteran energy',\n 'That was insane',\n 'Hello everyone!',\n 'Best moment ever',\n 'Love seeing this',\n 'Walking the walk',\n 'Cannot look away',\n 'Love seeing this',\n 'Never disappoints',\n 'What a turnaround',\n 'Never counted out',\n 'Respect the grind',\n 'Never disappoints',\n 'Respect the grind',\n 'Hard work pays off',\n 'Consistency is key',\n 'Art form of gaming',\n 'Great gameplay btw',\n 'This is next level',\n 'Peak entertainment',\n 'This is why I watch',\n 'Real recognize real',\n 'Chat is going crazy',\n 'Motivation overload',\n 'When it matters most',\n 'Setting the bar high',\n 'Different vibe today',\n 'Flow state activated',\n 'Comeback king energy',\n 'Mind blown right now',\n 'Cannot stop watching',\n 'The dedication shows',\n 'Vibes are immaculate',\n 'Automatic excellence',\n 'Always coming through',\n 'Unmatched performance',\n 'Promises and delivers',\n 'Mental game is strong',\n 'Calculated every move',\n 'One step ahead always',\n 'Heart racing right now',\n 'On the edge of my seat',\n 'In the zone completely',\n 'Next level inspiration',\n 'From behind to victory',\n 'Confidence is key here',\n 'This is playoff energy',\n 'I love this community!',\n 'So satisfying to watch',\n 'Pure talent right here',\n 'Clutch moment incoming',\n 'This is peak streaming',\n 'Delivers under pressure',\n 'Ice in the veins moment',\n 'This stream is amazing!',\n 'So composed and focused',\n 'Muscle memory is insane',\n 'Gonna apply this myself',\n 'Backing it up every time',\n 'Every stream gets better',\n 'Good energy in this chat',\n 'Physical and mental peak',\n 'Tournament mode activated',\n 'Absolute unit of a player',\n 'Playing 4D chess out here',\n 'This is pure content gold',\n 'Always believes in the win',\n 'Champion mentality showing',\n 'Winners mindset on display',\n 'This deserves all the hype',\n 'Community makes it special',\n 'Red pilled and game pilled',\n 'Experience matters so much',\n 'Been perfecting this craft',\n 'Masterclass happening live',\n 'First time here, loving it!',\n 'Bringing the A game tonight',\n 'Nothing stops this momentum',\n 'Outsmarting the competition',\n 'This chat is moving so fast!',\n 'Incredible skills on display',\n 'Years of practice paying off',\n 'The way they handle pressure',\n 'Unstoppable force on display',\n 'Precision and power combined',\n 'Nothing can break this focus',\n 'This is beautiful to witness',\n 'Vision and execution perfect',\n 'Can we get some hype in chat?',\n 'Taking mental notes right now',\n 'Stealing all these strategies',\n 'Absolutely crushing it today!',\n 'POG! POG! POG! This is insane!',\n 'Just got here, what did I miss?',\n 'Showing everyone how it is done',\n 'Knowledge translation to action',\n 'Learning from the absolute best',\n 'Stream quality is insane today!',\n 'Not gonna lie, that was genius!',\n 'Gaming at its finest right here',\n 'Best stream on Twitch right now!',\n \"The strategy here is chef's kiss\",\n 'This is what greatness looks like',\n 'Going to bed, good night everyone!',\n 'Content like this is why I tune in',\n 'Clap clap clap! Amazing performance!',\n 'Absolutely phenomenal content today!',\n 'Respect to the dedication shown here',\n \"I'm taking notes for my own gameplay\",\n 'Legendary session right here, no cap',\n 'The mechanics on display here are unreal',\n 'This is what peak performance looks like',\n 'This is why I love this community so much',\n 'Setting records and breaking expectations',\n \"First time watching and I'm already hooked\",\n 'Every single play is calculated perfection',\n 'The game knowledge displayed here is insane',\n 'The fundamentals here are next level perfect',\n 'Watching someone who truly loves their craft',\n 'The way they handle adversity is so inspiring',\n 'Every single decision is calculated perfectly',\n 'The combination of speed and accuracy is wild',\n 'This is what happens when talent meets effort',\n 'The artistry in gameplay displayed right here',\n 'Stream just made my day a million times better',\n 'This level of consistency is absolutely insane',\n 'The decision making under pressure is flawless',\n 'The improvement from stream to stream is crazy',\n 'The mental fortitude required for this is huge',\n 'Reading opponents like they are so predictable',\n 'How many years did it take to reach this level?',\n 'This person has transcended normal skill levels',\n 'The ability to stay cool under extreme pressure',\n 'Been here since the beginning, never looked back',\n 'Never seen a player adapt so quickly to mistakes',\n 'This is exactly what peak performance looks like',\n 'Years of training visible in every single moment',\n 'Professional level execution on full display here',\n 'This is the standard that everyone should aspire to',\n 'Nothing phases this player when the stakes are high',\n 'This is entertainment at the absolute highest level',\n];\n\nexport const messages = [...twitch_messages, ...youtube_messages, ...normal_messages];\n","export const names = [\n 'Tixyel',\n 'awigui',\n 'kurao_w',\n 'Urie_s2',\n 'itzzcatt',\n 'BeniArts',\n 'mynnyori',\n 'DexPixel',\n 'Cupidiko',\n 'starkuss_',\n 'catsember',\n 'shy_madeit',\n 'SpookySony',\n 'nanagadesign',\n];\n","export const tiers = ['1000', '2000', '3000', 'prime'];\n","export const tts = [\n 'Filiz',\n 'Astrid',\n 'Tatyana',\n 'Maxim',\n 'Carmen',\n 'Ines',\n 'Cristiano',\n 'Vitoria',\n 'Ricardo',\n 'Maja',\n 'Jan',\n 'Jacek',\n 'Ewa',\n 'Ruben',\n 'Lotte',\n 'Liv',\n 'Seoyeon',\n 'Takumi',\n 'Mizuki',\n 'Giorgio',\n 'Carla',\n 'Bianca',\n 'Karl',\n 'Dora',\n 'Mathieu',\n 'Celine',\n 'Chantal',\n 'Penelope',\n 'Miguel',\n 'Mia',\n 'Enrique',\n 'Conchita',\n 'Geraint',\n 'Salli',\n 'Matthew',\n 'Kimberly',\n 'Kendra',\n 'Justin',\n 'Joey',\n 'Joanna',\n 'Ivy',\n 'Raveena',\n 'Aditi',\n 'Emma',\n 'Brian',\n 'Amy',\n 'Russell',\n 'Nicole',\n 'Vicki',\n 'Marlene',\n 'Hans',\n 'Naja',\n 'Mads',\n 'Gwyneth',\n 'Zhiyu',\n 'Tracy',\n 'Danny',\n 'Huihui',\n 'Yaoyao',\n 'Kangkang',\n 'HanHan',\n 'Zhiwei',\n 'Asaf',\n 'An',\n 'Stefanos',\n 'Filip',\n 'Ivan',\n 'Heidi',\n 'Herena',\n 'Kalpana',\n 'Hemant',\n 'Matej',\n 'Andika',\n 'Rizwan',\n 'Lado',\n 'Valluvar',\n 'Linda',\n 'Heather',\n 'Sean',\n 'Michael',\n 'Karsten',\n 'Guillaume',\n 'Pattara',\n 'Jakub',\n 'Szabolcs',\n 'Hoda',\n 'Naayf',\n];\n","export const YoutubeEmotes = [\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/flower-rainbow-heart-red',\n shortcuts: [':pride-flower-rainbow-heart:'],\n searchTerms: ['pride-flower-rainbow-heart'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/8cF4z9clPGshgty6vT3ImAtx_CUvz3TMY-SAu_UKw-x1Z9-2KzcK4OuyAIROrKhyvcabrw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/8cF4z9clPGshgty6vT3ImAtx_CUvz3TMY-SAu_UKw-x1Z9-2KzcK4OuyAIROrKhyvcabrw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flower-rainbow-heart',\n },\n },\n },\n isCustomEmoji: true,\n index: 0,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-green-earth-head',\n shortcuts: [':pride-person-earth-intersex:'],\n searchTerms: ['pride-person-earth-intersex'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Gr-3he7L8jjQFj7aI0kSY1eV4aIsy-vT7Hk5shdakigG9aAJO_uMBmV6haCtK1OHjTEjj1o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Gr-3he7L8jjQFj7aI0kSY1eV4aIsy-vT7Hk5shdakigG9aAJO_uMBmV6haCtK1OHjTEjj1o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-earth-intersex',\n },\n },\n },\n isCustomEmoji: true,\n index: 1,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-heart-lesbian',\n shortcuts: [':pride-person-heart-lesbian:'],\n searchTerms: ['pride-person-heart-lesbian'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tKVZ2TfK5tMLvF88cnz2YNVwuHNgr0eDR9Ef8J0OCkZEHXLFUtH3f6-xSHhqhwd2sL3Tu4I=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tKVZ2TfK5tMLvF88cnz2YNVwuHNgr0eDR9Ef8J0OCkZEHXLFUtH3f6-xSHhqhwd2sL3Tu4I=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-heart-lesbian',\n },\n },\n },\n isCustomEmoji: true,\n index: 2,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-flower-nonbinary',\n shortcuts: [':pride-person-flower-nonbinary:'],\n searchTerms: ['pride-person-flower-nonbinary'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/le1X4KHLOmK5K1s5xu-owmP_eZK4D0ExyjnMCS6UNqZa-Zh4uEzz3mZnU3jBlLfi14Zpngw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/le1X4KHLOmK5K1s5xu-owmP_eZK4D0ExyjnMCS6UNqZa-Zh4uEzz3mZnU3jBlLfi14Zpngw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-flower-nonbinary',\n },\n },\n },\n isCustomEmoji: true,\n index: 3,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/flower-rainbow-heart-pansexual',\n shortcuts: [':pride-flower-pansexual:'],\n searchTerms: ['pride-flower-pansexual'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/blSdVv_UpdTn8BIWU6u9oCWhdtpc0-a-3dJeaRX9As6ftLc0OGPJ1PveQEJbUEDzf6by2Xi9=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/blSdVv_UpdTn8BIWU6u9oCWhdtpc0-a-3dJeaRX9As6ftLc0OGPJ1PveQEJbUEDzf6by2Xi9=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flower-pansexual',\n },\n },\n },\n isCustomEmoji: true,\n index: 4,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/heart-stripes-pride-flag',\n shortcuts: [':pride-heart-rainbow-philly:'],\n searchTerms: ['pride-heart-rainbow-philly'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7iYeXsmU2YMcKsKalaKJhirWdDASATIpl_c7Ib7akaRhvz8GChI4xpM0d0dtASjmmWPbg1NG=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7iYeXsmU2YMcKsKalaKJhirWdDASATIpl_c7Ib7akaRhvz8GChI4xpM0d0dtASjmmWPbg1NG=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-heart-rainbow-philly',\n },\n },\n },\n isCustomEmoji: true,\n index: 5,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/symbol-turquoise-flowers-transgender',\n shortcuts: [':pride-flowers-turquoise-transgender:'],\n searchTerms: ['pride-flowers-turquoise-transgender'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ovz1T6ay1D1GNFXwwYibZeu_rV5_iSRXWSHR2thQDLLWejVQMqWPUhsUWrMMw1tlBwllYA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ovz1T6ay1D1GNFXwwYibZeu_rV5_iSRXWSHR2thQDLLWejVQMqWPUhsUWrMMw1tlBwllYA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flowers-turquoise-transgender',\n },\n },\n },\n isCustomEmoji: true,\n index: 6,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hand-rainbow-fan-open',\n shortcuts: [':pride-fan-rainbow-open:'],\n searchTerms: ['pride-fan-rainbow-open'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/lDH5aORWtlc42NxTwiP3aIUIjttLVvE4Q_xIJDuu55DKvYSLeDIysOEKtGuMmEtOLgvZ_zTX=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/lDH5aORWtlc42NxTwiP3aIUIjttLVvE4Q_xIJDuu55DKvYSLeDIysOEKtGuMmEtOLgvZ_zTX=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-fan-rainbow-open',\n },\n },\n },\n isCustomEmoji: true,\n index: 7,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-pink-hair-earrings',\n shortcuts: [':pride-face-pink-earrings:'],\n searchTerms: ['pride-face-pink-earrings'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/utFog-w4fqgJ05xfQFjSdy8jvRBtFCeuWRkLH3IaVJ4WCBrdjDbXzXOprJA_h6MPOuksv0c=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/utFog-w4fqgJ05xfQFjSdy8jvRBtFCeuWRkLH3IaVJ4WCBrdjDbXzXOprJA_h6MPOuksv0c=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-pink-earrings',\n },\n },\n },\n isCustomEmoji: true,\n index: 8,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/unicorn-white-rainbow-mane',\n shortcuts: [':pride-unicorn-rainbow-mane:'],\n searchTerms: ['pride-unicorn-rainbow-mane'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/fvdANfncTw5aDF8GBq20kHicN5rMVoCMTM3FY8MQbZH9sZXvHy5o48yvHZWN4No5rz8b7-0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/fvdANfncTw5aDF8GBq20kHicN5rMVoCMTM3FY8MQbZH9sZXvHy5o48yvHZWN4No5rz8b7-0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-unicorn-rainbow-mane',\n },\n },\n },\n isCustomEmoji: true,\n index: 9,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/people-embracing-two',\n shortcuts: [':pride-people-embracing-two:'],\n searchTerms: ['pride-people-embracing-two'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/h1zJqFv2R4LzS3ZUpVyHhprCHQTIhbSecqu2Lid23byl5hD5cJdnshluOCyRdldYkWCUNg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/h1zJqFv2R4LzS3ZUpVyHhprCHQTIhbSecqu2Lid23byl5hD5cJdnshluOCyRdldYkWCUNg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-people-embracing-two',\n },\n },\n },\n isCustomEmoji: true,\n index: 10,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-green-hair-tears',\n shortcuts: [':pride-face-green-tears:'],\n searchTerms: ['pride-face-green-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2BNf4_qBG7mqt1sN-JwThp1srHlDr03xoya9hpIvbgS65HwLaaDz46r3A6dy8JnO2GtLNag=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2BNf4_qBG7mqt1sN-JwThp1srHlDr03xoya9hpIvbgS65HwLaaDz46r3A6dy8JnO2GtLNag=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-green-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 11,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/megaphone-rainbow-handle',\n shortcuts: [':pride-megaphone-rainbow-handle:'],\n searchTerms: ['pride-megaphone-rainbow-handle'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cop1MU9YkEuUxbe8d1NhPl1S9uJ60YSVTMM1gelP7Cy0BICa6Ey_TpxEFFdYITtsUK1cSg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cop1MU9YkEuUxbe8d1NhPl1S9uJ60YSVTMM1gelP7Cy0BICa6Ey_TpxEFFdYITtsUK1cSg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-megaphone-rainbow-handle',\n },\n },\n },\n isCustomEmoji: true,\n index: 12,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hand-brown-yellow-nails',\n shortcuts: [':pride-hand-yellow-nails:'],\n searchTerms: ['pride-hand-yellow-nails'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/1dEPlxkQ1RdZkPo5CLgYvneMQ-BBo63b3nnASEAXoccnVktMjgviKqMj1pjPiK2zTPTc7g=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/1dEPlxkQ1RdZkPo5CLgYvneMQ-BBo63b3nnASEAXoccnVktMjgviKqMj1pjPiK2zTPTc7g=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-hand-yellow-nails',\n },\n },\n },\n isCustomEmoji: true,\n index: 13,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-orange-hair-flowing',\n shortcuts: [':pride-face-orange-flowing:'],\n searchTerms: ['pride-face-orange-flowing'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/RuhTeU8YiT0_NaOYjMmXv77eEw5eO5Bdzfr7ouS0u3ZAK2J4coKGe5g4fN8mJV85jC63hw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/RuhTeU8YiT0_NaOYjMmXv77eEw5eO5Bdzfr7ouS0u3ZAK2J4coKGe5g4fN8mJV85jC63hw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-orange-flowing',\n },\n },\n },\n isCustomEmoji: true,\n index: 14,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/CIW60IPp_dYCFcuqTgodEu4IlQ',\n shortcuts: [':yt:'],\n searchTerms: ['yt'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/IkpeJf1g9Lq0WNjvSa4XFq4LVNZ9IP5FKW8yywXb12djo1OGdJtziejNASITyq4L0itkMNw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/IkpeJf1g9Lq0WNjvSa4XFq4LVNZ9IP5FKW8yywXb12djo1OGdJtziejNASITyq4L0itkMNw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'yt',\n },\n },\n },\n isCustomEmoji: true,\n index: 15,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/CN2m5cKr49sCFYbFggodDFEKrg',\n shortcuts: [':oops:'],\n searchTerms: ['oops'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/PFoVIqIiFRS3aFf5-bt_tTC0WrDm_ylhF4BKKwgqAASNb7hVgx_adFP-XVhFiJLXdRK0EQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/PFoVIqIiFRS3aFf5-bt_tTC0WrDm_ylhF4BKKwgqAASNb7hVgx_adFP-XVhFiJLXdRK0EQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'oops',\n },\n },\n },\n isCustomEmoji: true,\n index: 16,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/X_zdXMHgJaPa8gTGt4f4Ag',\n shortcuts: [':buffering:'],\n searchTerms: ['buffering'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5gfMEfdqO9CiLwhN9Mq7VI6--T2QFp8AXNNy5Fo7btfY6fRKkThWq35SCZ6SPMVCjg-sUA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5gfMEfdqO9CiLwhN9Mq7VI6--T2QFp8AXNNy5Fo7btfY6fRKkThWq35SCZ6SPMVCjg-sUA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'buffering',\n },\n },\n },\n isCustomEmoji: true,\n index: 17,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/1v50XorRJ8GQ8gTz_prwAg',\n shortcuts: [':stayhome:'],\n searchTerms: ['stayhome'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_1FGHypiub51kuTiNBX1a0H3NyFih3TnHX7bHU06j_ajTzT0OQfMLl9RI1SiQoxtgA2Grg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_1FGHypiub51kuTiNBX1a0H3NyFih3TnHX7bHU06j_ajTzT0OQfMLl9RI1SiQoxtgA2Grg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'stayhome',\n },\n },\n },\n isCustomEmoji: true,\n index: 18,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/8P50XuS9Oo7h8wSqtIagBA',\n shortcuts: [':dothefive:'],\n searchTerms: ['dothefive'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-nM0DOd49969h3GNcl705Ti1fIf1ZG_E3JxcOUVV-qPfCW6jY8xZ98caNLHkVSGRTSEb7Y9y=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-nM0DOd49969h3GNcl705Ti1fIf1ZG_E3JxcOUVV-qPfCW6jY8xZ98caNLHkVSGRTSEb7Y9y=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'dothefive',\n },\n },\n },\n isCustomEmoji: true,\n index: 19,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Fv90Xq-vJcPq8gTqzreQAQ',\n shortcuts: [':elbowbump:'],\n searchTerms: ['elbowbump'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2ou58X5XuhTrxjtIM2wew1f-HKRhN_T5SILQgHE-WD9dySzzJdGwL4R1gpKiJXcbtq6sjQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2ou58X5XuhTrxjtIM2wew1f-HKRhN_T5SILQgHE-WD9dySzzJdGwL4R1gpKiJXcbtq6sjQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'elbowbump',\n },\n },\n },\n isCustomEmoji: true,\n index: 20,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Iv90XouTLuOR8gSxxrToBA',\n shortcuts: [':goodvibes:'],\n searchTerms: ['goodvibes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2CvFOwgKpL29mW_C51XvaWa7Eixtv-3tD1XvZa1_WemaDDL2AqevKbTZ1rdV0OWcnOZRag=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2CvFOwgKpL29mW_C51XvaWa7Eixtv-3tD1XvZa1_WemaDDL2AqevKbTZ1rdV0OWcnOZRag=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'goodvibes',\n },\n },\n },\n isCustomEmoji: true,\n index: 21,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Rf90XtDbG8GQ8gTz_prwAg',\n shortcuts: [':thanksdoc:'],\n searchTerms: ['thanksdoc'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/bUnO_VwXW2hDf-Da8D64KKv6nBJDYUBuo13RrOg141g2da8pi9-KClJYlUDuqIwyPBfvOO8=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/bUnO_VwXW2hDf-Da8D64KKv6nBJDYUBuo13RrOg141g2da8pi9-KClJYlUDuqIwyPBfvOO8=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'thanksdoc',\n },\n },\n },\n isCustomEmoji: true,\n index: 22,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/VP90Xv_wG82o8wTCi7CQAw',\n shortcuts: [':videocall:'],\n searchTerms: ['videocall'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/k5v_oxUzRWmTOXP0V6WJver6xdS1lyHMPcMTfxn23Md6rmixoR5RZUusFbZi1uZwjF__pv4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/k5v_oxUzRWmTOXP0V6WJver6xdS1lyHMPcMTfxn23Md6rmixoR5RZUusFbZi1uZwjF__pv4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'videocall',\n },\n },\n },\n isCustomEmoji: true,\n index: 23,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/dv90XtfhAurw8gTgzar4DA',\n shortcuts: [':virtualhug:'],\n searchTerms: ['virtualhug'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/U1TjOZlqtS58NGqQhE8VWDptPSrmJNkrbVRp_8jI4f84QqIGflq2Ibu7YmuOg5MmVYnpevc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/U1TjOZlqtS58NGqQhE8VWDptPSrmJNkrbVRp_8jI4f84QqIGflq2Ibu7YmuOg5MmVYnpevc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'virtualhug',\n },\n },\n },\n isCustomEmoji: true,\n index: 24,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hf90Xv-jHeOR8gSxxrToBA',\n shortcuts: [':yougotthis:'],\n searchTerms: ['yougotthis'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/s3uOe4lUx3iPIt1h901SlMp_sKCTp3oOVj1JV8izBw_vDVLxFqk5dq-3NX-nK_gnUwVEXld3=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/s3uOe4lUx3iPIt1h901SlMp_sKCTp3oOVj1JV8izBw_vDVLxFqk5dq-3NX-nK_gnUwVEXld3=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'yougotthis',\n },\n },\n },\n isCustomEmoji: true,\n index: 25,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/lP90XvOhCZGl8wSO1JmgAw',\n shortcuts: [':sanitizer:'],\n searchTerms: ['sanitizer'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EJ_8vc4Gl-WxCWBurHwwWROAHrPzxgePodoNfkRY1U_I8L1O2zlqf7-wfUtTeyzq2qHNnocZ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EJ_8vc4Gl-WxCWBurHwwWROAHrPzxgePodoNfkRY1U_I8L1O2zlqf7-wfUtTeyzq2qHNnocZ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'sanitizer',\n },\n },\n },\n isCustomEmoji: true,\n index: 26,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/uP90Xq6wNYrK8gTUoo3wAg',\n shortcuts: [':takeout:'],\n searchTerms: ['takeout'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FizHI5IYMoNql9XeP7TV3E0ffOaNKTUSXbjtJe90e1OUODJfZbWU37VqBbTh-vpyFHlFIS0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FizHI5IYMoNql9XeP7TV3E0ffOaNKTUSXbjtJe90e1OUODJfZbWU37VqBbTh-vpyFHlFIS0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'takeout',\n },\n },\n },\n isCustomEmoji: true,\n index: 27,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/fAF1XtDQMIrK8gTUoo3wAg',\n shortcuts: [':hydrate:'],\n searchTerms: ['hydrate'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tpgZgmhX8snKniye36mnrDVfTnlc44EK92EPeZ0m9M2EPizn1vKEGJzNYdp7KQy6iNZlYDc1=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tpgZgmhX8snKniye36mnrDVfTnlc44EK92EPeZ0m9M2EPizn1vKEGJzNYdp7KQy6iNZlYDc1=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hydrate',\n },\n },\n },\n isCustomEmoji: true,\n index: 28,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/vQF1XpyaG_XG8gTs77bACQ',\n shortcuts: [':chillwcat:'],\n searchTerms: ['chillwcat'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/y03dFcPc1B7CO20zgQYzhcRPka5Bhs6iSg57MaxJdhaLidFvvXBLf_i4_SHG7zJ_2VpBMNs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/y03dFcPc1B7CO20zgQYzhcRPka5Bhs6iSg57MaxJdhaLidFvvXBLf_i4_SHG7zJ_2VpBMNs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'chillwcat',\n },\n },\n },\n isCustomEmoji: true,\n index: 29,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ygF1XpGUMMjk8gSDrI2wCw',\n shortcuts: [':chillwdog:'],\n searchTerms: ['chillwdog'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Ir9mDxzUi0mbqyYdJ3N9Lq7bN5Xdt0Q7fEYFngN3GYAcJT_tccH1as1PKmInnpt2cbWOam4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Ir9mDxzUi0mbqyYdJ3N9Lq7bN5Xdt0Q7fEYFngN3GYAcJT_tccH1as1PKmInnpt2cbWOam4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'chillwdog',\n },\n },\n },\n isCustomEmoji: true,\n index: 30,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/8gF1Xp_zK8jk8gSDrI2wCw',\n shortcuts: [':elbowcough:'],\n searchTerms: ['elbowcough'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DTR9bZd1HOqpRJyz9TKiLb0cqe5Hb84Yi_79A6LWlN1tY-5kXqLDXRmtYVKE9rcqzEghmw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DTR9bZd1HOqpRJyz9TKiLb0cqe5Hb84Yi_79A6LWlN1tY-5kXqLDXRmtYVKE9rcqzEghmw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'elbowcough',\n },\n },\n },\n isCustomEmoji: true,\n index: 31,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/EAJ1XrS7PMGQ8gTz_prwAg',\n shortcuts: [':learning:'],\n searchTerms: ['learning'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ZuBuz8GAQ6IEcQc7CoJL8IEBTYbXEvzhBeqy1AiytmhuAT0VHjpXEjd-A5GfR4zDin1L53Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ZuBuz8GAQ6IEcQc7CoJL8IEBTYbXEvzhBeqy1AiytmhuAT0VHjpXEjd-A5GfR4zDin1L53Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'learning',\n },\n },\n },\n isCustomEmoji: true,\n index: 32,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/JAJ1XpGpJYnW8wTupZu4Cw',\n shortcuts: [':washhands:'],\n searchTerms: ['washhands'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qXUeUW0KpKBc9Z3AqUqr_0B7HbW1unAv4qmt7-LJGUK_gsFBIaHISWJNt4n3yvmAnQNZHE-u=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qXUeUW0KpKBc9Z3AqUqr_0B7HbW1unAv4qmt7-LJGUK_gsFBIaHISWJNt4n3yvmAnQNZHE-u=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'washhands',\n },\n },\n },\n isCustomEmoji: true,\n index: 33,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/PAJ1XsOOI4fegwOo57ewAg',\n shortcuts: [':socialdist:'],\n searchTerms: ['socialdist'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/igBNi55-TACUi1xQkqMAor-IEXmt8He56K7pDTG5XoTsbM-rVswNzUfC5iwnfrpunWihrg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/igBNi55-TACUi1xQkqMAor-IEXmt8He56K7pDTG5XoTsbM-rVswNzUfC5iwnfrpunWihrg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'socialdist',\n },\n },\n },\n isCustomEmoji: true,\n index: 34,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/egJ1XufTKYfegwOo57ewAg',\n shortcuts: [':shelterin:'],\n searchTerms: ['shelterin'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/gjC5x98J4BoVSEPfFJaoLtc4tSBGSEdIlfL2FV4iJG9uGNykDP9oJC_QxAuBTJy6dakPxVeC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/gjC5x98J4BoVSEPfFJaoLtc4tSBGSEdIlfL2FV4iJG9uGNykDP9oJC_QxAuBTJy6dakPxVeC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'shelterin',\n },\n },\n },\n isCustomEmoji: true,\n index: 35,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/G8AfY6yWGuKuhL0PlbiA2AE',\n shortcuts: [':hand-pink-waving:'],\n searchTerms: ['hand-pink-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/KOxdr_z3A5h1Gb7kqnxqOCnbZrBmxI2B_tRQ453BhTWUhYAlpg5ZP8IKEBkcvRoY8grY91Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/KOxdr_z3A5h1Gb7kqnxqOCnbZrBmxI2B_tRQ453BhTWUhYAlpg5ZP8IKEBkcvRoY8grY91Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-pink-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 36,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/KsIfY6LzFoLM6AKanYDQAg',\n shortcuts: [':face-blue-smiling:'],\n searchTerms: ['face-blue-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cktIaPxFwnrPwn-alHvnvedHLUJwbHi8HCK3AgbHpphrMAW99qw0bDfxuZagSY5ieE9BBrA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cktIaPxFwnrPwn-alHvnvedHLUJwbHi8HCK3AgbHpphrMAW99qw0bDfxuZagSY5ieE9BBrA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 37,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/W8IfY_bwAfiPq7IPvNCA2AU',\n shortcuts: [':face-red-droopy-eyes:'],\n searchTerms: ['face-red-droopy-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/oih9s26MOYPWC_uL6tgaeOlXSGBv8MMoDrWzBt-80nEiVSL9nClgnuzUAKqkU9_TWygF6CI=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/oih9s26MOYPWC_uL6tgaeOlXSGBv8MMoDrWzBt-80nEiVSL9nClgnuzUAKqkU9_TWygF6CI=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-droopy-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 38,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/b8IfY7zOK9iVkNAP_I2A-AY',\n shortcuts: [':face-purple-crying:'],\n searchTerms: ['face-purple-crying'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/g6_km98AfdHbN43gvEuNdZ2I07MmzVpArLwEvNBwwPqpZYzszqhRzU_DXALl11TchX5_xFE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/g6_km98AfdHbN43gvEuNdZ2I07MmzVpArLwEvNBwwPqpZYzszqhRzU_DXALl11TchX5_xFE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-crying',\n },\n },\n },\n isCustomEmoji: true,\n index: 39,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hcIfY57lBJXp6AKBx4CoCA',\n shortcuts: [':text-green-game-over:'],\n searchTerms: ['text-green-game-over'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cr36FHhSiMAJUSpO9XzjbOgxhtrdJNTVJUlMJeOOfLOFzKleAKT2SEkZwbqihBqfTXYCIg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cr36FHhSiMAJUSpO9XzjbOgxhtrdJNTVJUlMJeOOfLOFzKleAKT2SEkZwbqihBqfTXYCIg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'text-green-game-over',\n },\n },\n },\n isCustomEmoji: true,\n index: 40,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ssIfY7OFG5OykQOpn4CQCw',\n shortcuts: [':person-turqouise-waving:'],\n searchTerms: ['person-turqouise-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/uNSzQ2M106OC1L3VGzrOsGNjopboOv-m1bnZKFGuh0DxcceSpYHhYbuyggcgnYyaF3o-AQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/uNSzQ2M106OC1L3VGzrOsGNjopboOv-m1bnZKFGuh0DxcceSpYHhYbuyggcgnYyaF3o-AQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turqouise-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 41,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/xsIfY4OqCd2T29sP54iAsAw',\n shortcuts: [':face-green-smiling:'],\n searchTerms: ['face-green-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/G061SAfXg2bmG1ZXbJsJzQJpN8qEf_W3f5cb5nwzBYIV58IpPf6H90lElDl85iti3HgoL3o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/G061SAfXg2bmG1ZXbJsJzQJpN8qEf_W3f5cb5nwzBYIV58IpPf6H90lElDl85iti3HgoL3o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-green-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 42,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/2sIfY8vIG8z96ALulYDQDQ',\n shortcuts: [':face-orange-frowning:'],\n searchTerms: ['face-orange-frowning'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Ar8jaEIxzfiyYmB7ejDOHba2kUMdR37MHn_R39mtxqO5CD4aYGvjDFL22DW_Cka6LKzhGDk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Ar8jaEIxzfiyYmB7ejDOHba2kUMdR37MHn_R39mtxqO5CD4aYGvjDFL22DW_Cka6LKzhGDk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-frowning',\n },\n },\n },\n isCustomEmoji: true,\n index: 43,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/7cIfY5niDOmSkNAP08CA6A4',\n shortcuts: [':eyes-purple-crying:'],\n searchTerms: ['eyes-purple-crying'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FrYgdeZPpvXs-6Mp305ZiimWJ0wV5bcVZctaUy80mnIdwe-P8HRGYAm0OyBtVx8EB9_Dxkc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FrYgdeZPpvXs-6Mp305ZiimWJ0wV5bcVZctaUy80mnIdwe-P8HRGYAm0OyBtVx8EB9_Dxkc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'eyes-purple-crying',\n },\n },\n },\n isCustomEmoji: true,\n index: 44,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/A8MfY-_pEIKNr8oP78-AGA',\n shortcuts: [':face-fuchsia-wide-eyes:'],\n searchTerms: ['face-fuchsia-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/zdcOC1SMmyXJOAddl9DYeEFN9YYcn5mHemJCdRFQMtDuS0V-IyE-5YjNUL1tduX1zs17tQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/zdcOC1SMmyXJOAddl9DYeEFN9YYcn5mHemJCdRFQMtDuS0V-IyE-5YjNUL1tduX1zs17tQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 45,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/E8MfY5u7JPSXkNAP95GAmAE',\n shortcuts: [':cat-orange-whistling:'],\n searchTerms: ['cat-orange-whistling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/0ocqEmuhrKCK87_J21lBkvjW70wRGC32-Buwk6TP4352CgcNjL6ug8zcsel6JiPbE58xhq5g=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/0ocqEmuhrKCK87_J21lBkvjW70wRGC32-Buwk6TP4352CgcNjL6ug8zcsel6JiPbE58xhq5g=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'cat-orange-whistling',\n },\n },\n },\n isCustomEmoji: true,\n index: 46,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/LsMfY8P6G-yckNAPjoWA8AI',\n shortcuts: [':face-blue-wide-eyes:'],\n searchTerms: ['face-blue-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2Ht4KImoWDlCddiDQVuzSJwpEb59nZJ576ckfaMh57oqz2pUkkgVTXV8osqUOgFHZdUISJM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2Ht4KImoWDlCddiDQVuzSJwpEb59nZJ576ckfaMh57oqz2pUkkgVTXV8osqUOgFHZdUISJM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 47,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Z8MfY8mzLbnovwK5roC4Bg',\n shortcuts: [':face-orange-raised-eyebrow:'],\n searchTerms: ['face-orange-raised-eyebrow'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/JbCfmOgYI-mO17LPw8e_ycqbBGESL8AVP6i7ZsBOVLd3PEpgrfEuJ9rEGpP_unDcqgWSCg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/JbCfmOgYI-mO17LPw8e_ycqbBGESL8AVP6i7ZsBOVLd3PEpgrfEuJ9rEGpP_unDcqgWSCg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-raised-eyebrow',\n },\n },\n },\n isCustomEmoji: true,\n index: 48,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hcMfY5_zAbbxvwKLooCoCA',\n shortcuts: [':face-fuchsia-tongue-out:'],\n searchTerms: ['face-fuchsia-tongue-out'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EURfJZi_heNulV3mfHzXBk8PIs9XmZ9lOOYi5za6wFMCGrps4i2BJX9j-H2gK6LIhW6h7sY=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EURfJZi_heNulV3mfHzXBk8PIs9XmZ9lOOYi5za6wFMCGrps4i2BJX9j-H2gK6LIhW6h7sY=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-tongue-out',\n },\n },\n },\n isCustomEmoji: true,\n index: 49,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ygF1XpGUMMjk8gSDrI2wCx',\n shortcuts: [':face-orange-biting-nails:'],\n searchTerms: ['face-orange-biting-nails'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/HmsXEgqUogkQOnL5LP_FdPit9Z909RJxby-uYcPxBLNhaPyqPTcGwvGaGPk2hzB_cC0hs_pV=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/HmsXEgqUogkQOnL5LP_FdPit9Z909RJxby-uYcPxBLNhaPyqPTcGwvGaGPk2hzB_cC0hs_pV=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-biting-nails',\n },\n },\n },\n isCustomEmoji: true,\n index: 50,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/m8MfY4jbFsWJhL0PyouA2Ak',\n shortcuts: [':face-red-heart-shape:'],\n searchTerms: ['face-red-heart-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/I0Mem9dU_IZ4a9cQPzR0pUJ8bH-882Eg0sDQjBmPcHA6Oq0uXOZcsjPvPbtormx91Ha2eRA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/I0Mem9dU_IZ4a9cQPzR0pUJ8bH-882Eg0sDQjBmPcHA6Oq0uXOZcsjPvPbtormx91Ha2eRA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-heart-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 51,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/6_cfY8HJH8bV5QS5yYDYDg',\n shortcuts: [':face-fuchsia-poop-shape:'],\n searchTerms: ['face-fuchsia-poop-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_xlyzvSimqMzhdhODyqUBLXIGA6F_d5en2bq-AIfc6fc3M7tw2jucuXRIo5igcW3g9VVe3A=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_xlyzvSimqMzhdhODyqUBLXIGA6F_d5en2bq-AIfc6fc3M7tw2jucuXRIo5igcW3g9VVe3A=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-poop-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 52,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/DfgfY9LaNdmMq7IPuI2AaA',\n shortcuts: [':face-purple-wide-eyes:'],\n searchTerms: ['face-purple-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5RDrtjmzRQKuVYE_FKPUHiGh7TNtX5eSNe6XzcSytMsHirXYKunxpyAsVacTFMg0jmUGhQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5RDrtjmzRQKuVYE_FKPUHiGh7TNtX5eSNe6XzcSytMsHirXYKunxpyAsVacTFMg0jmUGhQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 53,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/HvgfY93GEYmqvwLUuYDwAQ',\n shortcuts: [':glasses-purple-yellow-diamond:'],\n searchTerms: ['glasses-purple-yellow-diamond'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EnDBiuksboKsLkxp_CqMWlTcZtlL77QBkbjz_rLedMSDzrHmy_6k44YWFy2rk4I0LG6K2KI=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EnDBiuksboKsLkxp_CqMWlTcZtlL77QBkbjz_rLedMSDzrHmy_6k44YWFy2rk4I0LG6K2KI=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'glasses-purple-yellow-diamond',\n },\n },\n },\n isCustomEmoji: true,\n index: 54,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/NvgfY9aeC_OFvOMPkrOAsAM',\n shortcuts: [':face-pink-tears:'],\n searchTerms: ['face-pink-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/RL5QHCNcO_Mc98SxFEblXZt9FNoh3bIgsjm0Kj8kmeQJWMeTu7JX_NpICJ6KKwKT0oVHhAA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/RL5QHCNcO_Mc98SxFEblXZt9FNoh3bIgsjm0Kj8kmeQJWMeTu7JX_NpICJ6KKwKT0oVHhAA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-pink-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 55,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/UvgfY_vqE92T29sPvqiAkAU',\n shortcuts: [':body-blue-raised-arms:'],\n searchTerms: ['body-blue-raised-arms'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2Jds3I9UKOfgjid97b_nlDU4X2t5MgjTof8yseCp7M-6ZhOhRkPGSPfYwmE9HjCibsfA1Uzo=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2Jds3I9UKOfgjid97b_nlDU4X2t5MgjTof8yseCp7M-6ZhOhRkPGSPfYwmE9HjCibsfA1Uzo=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-blue-raised-arms',\n },\n },\n },\n isCustomEmoji: true,\n index: 56,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/YvgfY-LIBpjChgHKyYCQBg',\n shortcuts: [':hand-orange-covering-eyes:'],\n searchTerms: ['hand-orange-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/y8ppa6GcJoRUdw7GwmjDmTAnSkeIkUptZMVQuFmFaTlF_CVIL7YP7hH7hd0TJbd8p9w67IM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/y8ppa6GcJoRUdw7GwmjDmTAnSkeIkUptZMVQuFmFaTlF_CVIL7YP7hH7hd0TJbd8p9w67IM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-orange-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 57,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ePgfY-K2Kp6Mr8oP1oqAwAc',\n shortcuts: [':trophy-yellow-smiling:'],\n searchTerms: ['trophy-yellow-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7tf3A_D48gBg9g2N0Rm6HWs2aqzshHU4CuVubTXVxh1BP7YDBRC6pLBoC-ibvr-zCl_Lgg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7tf3A_D48gBg9g2N0Rm6HWs2aqzshHU4CuVubTXVxh1BP7YDBRC6pLBoC-ibvr-zCl_Lgg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'trophy-yellow-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 58,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/jPgfY5j2IIud29sP3ZeA4Ag',\n shortcuts: [':eyes-pink-heart-shape:'],\n searchTerms: ['eyes-pink-heart-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5vzlCQfQQdzsG7nlQzD8eNjtyLlnATwFwGvrMpC8dgLcosNhWLXu8NN9qIS3HZjJYd872dM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5vzlCQfQQdzsG7nlQzD8eNjtyLlnATwFwGvrMpC8dgLcosNhWLXu8NN9qIS3HZjJYd872dM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'eyes-pink-heart-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 59,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/oPgfY_DoKfSXkNAPq8-AgAo',\n shortcuts: [':face-turquoise-covering-eyes:'],\n searchTerms: ['face-turquoise-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/H2HNPRO8f4SjMmPNh5fl10okSETW7dLTZtuE4jh9D6pSmaUiLfoZJ2oiY-qWU3Owfm1IsXg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/H2HNPRO8f4SjMmPNh5fl10okSETW7dLTZtuE4jh9D6pSmaUiLfoZJ2oiY-qWU3Owfm1IsXg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 60,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/tPgfY7mSO4XovQKzmYCgCw',\n shortcuts: [':hand-green-crystal-ball:'],\n searchTerms: ['hand-green-crystal-ball'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qZfJrWDEmR03FIak7PMNRNpMjNsCnOzD9PqK8mOpAp4Kacn_uXRNJNb99tE_1uyEbvgJReF2=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qZfJrWDEmR03FIak7PMNRNpMjNsCnOzD9PqK8mOpAp4Kacn_uXRNJNb99tE_1uyEbvgJReF2=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-green-crystal-ball',\n },\n },\n },\n isCustomEmoji: true,\n index: 61,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/zPgfY66lCJGRhL0Pz6iA4Aw',\n shortcuts: [':face-turquoise-drinking-coffee:'],\n searchTerms: ['face-turquoise-drinking-coffee'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/myqoI1MgFUXQr5fuWTC9mz0BCfgf3F8GSDp06o1G7w6pTz48lwARjdG8vj0vMxADvbwA1dA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/myqoI1MgFUXQr5fuWTC9mz0BCfgf3F8GSDp06o1G7w6pTz48lwARjdG8vj0vMxADvbwA1dA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-drinking-coffee',\n },\n },\n },\n isCustomEmoji: true,\n index: 62,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/4PgfY73cJprKCq-_gIAO',\n shortcuts: [':body-green-covering-eyes:'],\n searchTerms: ['body-green-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/UR8ydcU3gz360bzDsprB6d1klFSQyVzgn-Fkgu13dIKPj3iS8OtG1bhBUXPdj9pMwtM00ro=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/UR8ydcU3gz360bzDsprB6d1klFSQyVzgn-Fkgu13dIKPj3iS8OtG1bhBUXPdj9pMwtM00ro=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-green-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 63,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/-fgfY9DIGYjbhgHLzoDIDw',\n shortcuts: [':goat-turquoise-white-horns:'],\n searchTerms: ['goat-turquoise-white-horns'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/jMnX4lu5GnjBRgiPtX5FwFmEyKTlWFrr5voz-Auko35oP0t3-zhPxR3PQMYa-7KhDeDtrv4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/jMnX4lu5GnjBRgiPtX5FwFmEyKTlWFrr5voz-Auko35oP0t3-zhPxR3PQMYa-7KhDeDtrv4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'goat-turquoise-white-horns',\n },\n },\n },\n isCustomEmoji: true,\n index: 64,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/EvkfY6uNC5OykQOewoCQAQ',\n shortcuts: [':hand-purple-blue-peace:'],\n searchTerms: ['hand-purple-blue-peace'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-sC8wj6pThd7FNdslEoJlG4nB9SIbrJG3CRGh7-bNV0RVfcrJuwiWHoUZ6UmcVs7sQjxTg4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-sC8wj6pThd7FNdslEoJlG4nB9SIbrJG3CRGh7-bNV0RVfcrJuwiWHoUZ6UmcVs7sQjxTg4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-purple-blue-peace',\n },\n },\n },\n isCustomEmoji: true,\n index: 65,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/LfkfY_zhH4GFr8oP4aKA6AI',\n shortcuts: [':face-blue-question-mark:'],\n searchTerms: ['face-blue-question-mark'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Wx4PMqTwG3f4gtR7J9Go1s8uozzByGWLSXHzrh3166ixaYRinkH_F05lslfsRUsKRvHXrDk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Wx4PMqTwG3f4gtR7J9Go1s8uozzByGWLSXHzrh3166ixaYRinkH_F05lslfsRUsKRvHXrDk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-question-mark',\n },\n },\n },\n isCustomEmoji: true,\n index: 66,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/RPkfY8TPGsCakNAP-JWAoAQ',\n shortcuts: [':face-blue-covering-eyes:'],\n searchTerms: ['face-blue-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/kj3IgbbR6u-mifDkBNWVcdOXC-ut-tiFbDpBMGVeW79c2c54n5vI-HNYCOC6XZ9Bzgupc10=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/kj3IgbbR6u-mifDkBNWVcdOXC-ut-tiFbDpBMGVeW79c2c54n5vI-HNYCOC6XZ9Bzgupc10=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 67,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Mm5IY53bH7SEq7IP-MWAkAM',\n shortcuts: [':face-purple-smiling-fangs:'],\n searchTerms: ['face-purple-smiling-fangs'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/k1vqi6xoHakGUfa0XuZYWHOv035807ARP-ZLwFmA-_NxENJMxsisb-kUgkSr96fj5baBOZE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/k1vqi6xoHakGUfa0XuZYWHOv035807ARP-ZLwFmA-_NxENJMxsisb-kUgkSr96fj5baBOZE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-smiling-fangs',\n },\n },\n },\n isCustomEmoji: true,\n index: 68,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/UW5IY-ibBqa8jgTymoCIBQ',\n shortcuts: [':face-purple-sweating:'],\n searchTerms: ['face-purple-sweating'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tRnrCQtEKlTM9YLPo0vaxq9mDvlT0mhDld2KI7e_nDRbhta3ULKSoPVHZ1-bNlzQRANmH90=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tRnrCQtEKlTM9YLPo0vaxq9mDvlT0mhDld2KI7e_nDRbhta3ULKSoPVHZ1-bNlzQRANmH90=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-sweating',\n },\n },\n },\n isCustomEmoji: true,\n index: 69,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Ym5IY7-0LoqA29sPq9CAkAY',\n shortcuts: [':face-purple-smiling-tears:'],\n searchTerms: ['face-purple-smiling-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/MJV1k3J5s0hcUfuo78Y6MKi-apDY5NVDjO9Q7hL8fU4i0cIBgU-cU4rq4sHessJuvuGpDOjJ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/MJV1k3J5s0hcUfuo78Y6MKi-apDY5NVDjO9Q7hL8fU4i0cIBgU-cU4rq4sHessJuvuGpDOjJ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-smiling-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 70,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/dG5IY-mhEof9jgSykoCgBw',\n shortcuts: [':face-blue-star-eyes:'],\n searchTerms: ['face-blue-star-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/m_ANavMhp6cQ1HzX0HCTgp_er_yO2UA28JPbi-0HElQgnQ4_q5RUhgwueTpH-st8L3MyTA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/m_ANavMhp6cQ1HzX0HCTgp_er_yO2UA28JPbi-0HElQgnQ4_q5RUhgwueTpH-st8L3MyTA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-star-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 71,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hm5IY4W-H9SO5QS6n4CwCA',\n shortcuts: [':face-blue-heart-eyes:'],\n searchTerms: ['face-blue-heart-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/M9tzKd64_r3hvgpTSgca7K3eBlGuyiqdzzhYPp7ullFAHMgeFoNLA0uQ1dGxj3fXgfcHW4w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/M9tzKd64_r3hvgpTSgca7K3eBlGuyiqdzzhYPp7ullFAHMgeFoNLA0uQ1dGxj3fXgfcHW4w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-heart-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 72,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/mW5IY47PMcSnkMkPo6OAyAk',\n shortcuts: [':face-blue-three-eyes:'],\n searchTerms: ['face-blue-three-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/nSQHitVplLe5uZC404dyAwv1f58S3PN-U_799fvFzq-6b3bv-MwENO-Zs1qQI4oEXCbOJg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/nSQHitVplLe5uZC404dyAwv1f58S3PN-U_799fvFzq-6b3bv-MwENO-Zs1qQI4oEXCbOJg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-three-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 73,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/rW5IY_26FryOq7IPlL2A6Ao',\n shortcuts: [':face-blue-droopy-eyes:'],\n searchTerms: ['face-blue-droopy-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/hGPqMUCiXGt6zuX4dHy0HRZtQ-vZmOY8FM7NOHrJTta3UEJksBKjOcoE6ZUAW9sz7gIF_nk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/hGPqMUCiXGt6zuX4dHy0HRZtQ-vZmOY8FM7NOHrJTta3UEJksBKjOcoE6ZUAW9sz7gIF_nk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-droopy-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 74,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/v25IY7KcJIGOr8oPz4OA-As',\n shortcuts: [':planet-orange-purple-ring:'],\n searchTerms: ['planet-orange-purple-ring'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/xkaLigm3P4_1g4X1JOtkymcC7snuJu_C5YwIFAyQlAXK093X0IUjaSTinMTLKeRZ6280jXg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/xkaLigm3P4_1g4X1JOtkymcC7snuJu_C5YwIFAyQlAXK093X0IUjaSTinMTLKeRZ6280jXg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'planet-orange-purple-ring',\n },\n },\n },\n isCustomEmoji: true,\n index: 75,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-podium-blue',\n shortcuts: [':person-yellow-podium-blue:'],\n searchTerms: ['person-yellow-podium-blue'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/N28nFDm82F8kLPAa-jY_OySFsn3Ezs_2Bl5kdxC8Yxau5abkj_XZHYsS3uYKojs8qy8N-9w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/N28nFDm82F8kLPAa-jY_OySFsn3Ezs_2Bl5kdxC8Yxau5abkj_XZHYsS3uYKojs8qy8N-9w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-yellow-podium-blue',\n },\n },\n },\n isCustomEmoji: true,\n index: 76,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/baseball-white-cap-out',\n shortcuts: [':baseball-white-cap-out:'],\n searchTerms: ['baseball-white-cap-out'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/8DaGaXfaBN0c-ZsZ-1WqPJ6H9TsJOlUUQQEoXvmdROphZE9vdRtN0867Gb2YZcm2x38E9Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/8DaGaXfaBN0c-ZsZ-1WqPJ6H9TsJOlUUQQEoXvmdROphZE9vdRtN0867Gb2YZcm2x38E9Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'baseball-white-cap-out',\n },\n },\n },\n isCustomEmoji: true,\n index: 77,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/whistle-red-blow',\n shortcuts: [':whistle-red-blow:'],\n searchTerms: ['whistle-red-blow'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DBu1ZfPJTnX9S1RyKKdBY-X_CEmj7eF6Uzl71j5jVBz5y4k9JcKnoiFtImAbeu4u8M2X8tU=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DBu1ZfPJTnX9S1RyKKdBY-X_CEmj7eF6Uzl71j5jVBz5y4k9JcKnoiFtImAbeu4u8M2X8tU=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'whistle-red-blow',\n },\n },\n },\n isCustomEmoji: true,\n index: 78,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-crowd-surf',\n shortcuts: [':person-turquoise-crowd-surf:'],\n searchTerms: ['person-turquoise-crowd-surf'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Q0wFvHZ5h54xGSTo-JeGst6InRU3yR6NdBRoyowaqGY66LPzdcrV2t-wBN21kBIdb2TeNA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Q0wFvHZ5h54xGSTo-JeGst6InRU3yR6NdBRoyowaqGY66LPzdcrV2t-wBN21kBIdb2TeNA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-crowd-surf',\n },\n },\n },\n isCustomEmoji: true,\n index: 79,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/finger-red-number-one',\n shortcuts: [':finger-red-number-one:'],\n searchTerms: ['finger-red-number-one'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Hbk0wxBzPTBCDvD_y4qdcHL5_uu7SeOnaT2B7gl9GLB4u8Ecm9OaXCGSMMUBFeNGl5Q3fHJ2=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Hbk0wxBzPTBCDvD_y4qdcHL5_uu7SeOnaT2B7gl9GLB4u8Ecm9OaXCGSMMUBFeNGl5Q3fHJ2=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'finger-red-number-one',\n },\n },\n },\n isCustomEmoji: true,\n index: 80,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/text-yellow-goal',\n shortcuts: [':text-yellow-goal:'],\n searchTerms: ['text-yellow-goal'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tnHp8rHjXecGbGrWNcs7xss_aVReaYE6H-QWRCXYg_aaYszHXnbP_pVADnibUiimspLvgX0L=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tnHp8rHjXecGbGrWNcs7xss_aVReaYE6H-QWRCXYg_aaYszHXnbP_pVADnibUiimspLvgX0L=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'text-yellow-goal',\n },\n },\n },\n isCustomEmoji: true,\n index: 81,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/medal-yellow-first-red',\n shortcuts: [':medal-yellow-first-red:'],\n searchTerms: ['medal-yellow-first-red'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EEHiiIalCBKuWDPtNOjjvmEZ-KRkf5dlgmhe5rbLn8aZQl-pNz_paq5UjxNhCrI019TWOQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EEHiiIalCBKuWDPtNOjjvmEZ-KRkf5dlgmhe5rbLn8aZQl-pNz_paq5UjxNhCrI019TWOQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'medal-yellow-first-red',\n },\n },\n },\n isCustomEmoji: true,\n index: 82,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-wheelchair-race',\n shortcuts: [':person-blue-wheelchair-race:'],\n searchTerms: ['person-blue-wheelchair-race'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ZepxPGk5TwzrKAP9LUkzmKmEkbaF5OttNyybwok6mJENw3p0lxDXkD1X2_rAwGcUM0L-D04=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ZepxPGk5TwzrKAP9LUkzmKmEkbaF5OttNyybwok6mJENw3p0lxDXkD1X2_rAwGcUM0L-D04=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-wheelchair-race',\n },\n },\n },\n isCustomEmoji: true,\n index: 83,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/card-red-penalty',\n shortcuts: [':card-red-penalty:'],\n searchTerms: ['card-red-penalty'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/uRDUMIeAHnNsaIaShtRkQ6hO0vycbNH_BQT7i3PWetFJb09q88RTjxwzToBy9Cez20D7hA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/uRDUMIeAHnNsaIaShtRkQ6hO0vycbNH_BQT7i3PWetFJb09q88RTjxwzToBy9Cez20D7hA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'card-red-penalty',\n },\n },\n },\n isCustomEmoji: true,\n index: 84,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/stopwatch-blue-hand-timer',\n shortcuts: [':stopwatch-blue-hand-timer:'],\n searchTerms: ['stopwatch-blue-hand-timer'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DCvefDAiskRfACgolTlvV1kMfiZVcG50UrmpnRrg3k0udFWG2Uo9zFMaJrJMSJYwcx6fMgk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DCvefDAiskRfACgolTlvV1kMfiZVcG50UrmpnRrg3k0udFWG2Uo9zFMaJrJMSJYwcx6fMgk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'stopwatch-blue-hand-timer',\n },\n },\n },\n isCustomEmoji: true,\n index: 85,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-turquoise-speaker-shape',\n shortcuts: [':face-turquoise-speaker-shape:'],\n searchTerms: ['face-turquoise-speaker-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/WTFFqm70DuMxSC6ezQ5Zs45GaWD85Xwrd9Sullxt54vErPUKb_o0NJQ4kna5m7rvjbRMgr3A=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/WTFFqm70DuMxSC6ezQ5Zs45GaWD85Xwrd9Sullxt54vErPUKb_o0NJQ4kna5m7rvjbRMgr3A=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-speaker-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 86,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/octopus-red-waving',\n shortcuts: [':octopus-red-waving:'],\n searchTerms: ['octopus-red-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L9Wo5tLT_lRQX36iZO_fJqLJR4U74J77tJ6Dg-QmPmSC_zhVQ-NodMRc9T0ozwvRXRaT43o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L9Wo5tLT_lRQX36iZO_fJqLJR4U74J77tJ6Dg-QmPmSC_zhVQ-NodMRc9T0ozwvRXRaT43o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'octopus-red-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 87,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/pillow-turquoise-hot-chocolate',\n shortcuts: [':pillow-turquoise-hot-chocolate:'],\n searchTerms: ['pillow-turquoise-hot-chocolate'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cAR4cehRxbn6dPbxKIb-7ShDdWnMxbaBqy2CXzBW4aRL3IqXs3rxG0UdS7IU71OEU7LSd20q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cAR4cehRxbn6dPbxKIb-7ShDdWnMxbaBqy2CXzBW4aRL3IqXs3rxG0UdS7IU71OEU7LSd20q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pillow-turquoise-hot-chocolate',\n },\n },\n },\n isCustomEmoji: true,\n index: 88,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hourglass-purple-sand-orange',\n shortcuts: [':hourglass-purple-sand-orange:'],\n searchTerms: ['hourglass-purple-sand-orange'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/MFDLjasPt5cuSM_tK5Fnjaz_k08lKHdX_Mf7JkI6awaHriC3rGL7J_wHxyG6PPhJ8CJ6vsQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/MFDLjasPt5cuSM_tK5Fnjaz_k08lKHdX_Mf7JkI6awaHriC3rGL7J_wHxyG6PPhJ8CJ6vsQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hourglass-purple-sand-orange',\n },\n },\n },\n isCustomEmoji: true,\n index: 89,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/fish-orange-wide-eyes',\n shortcuts: [':fish-orange-wide-eyes:'],\n searchTerms: ['fish-orange-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/iQLKgKs7qL3091VHgVgpaezc62uPewy50G_DoI0dMtVGmQEX5pflZrUxWfYGmRfzfUOOgJs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/iQLKgKs7qL3091VHgVgpaezc62uPewy50G_DoI0dMtVGmQEX5pflZrUxWfYGmRfzfUOOgJs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'fish-orange-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 90,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/popcorn-yellow-striped-smile',\n shortcuts: [':popcorn-yellow-striped-smile:'],\n searchTerms: ['popcorn-yellow-striped-smile'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/TW_GktV5uVYviPDtkCRCKRDrGlUc3sJ5OHO81uqdMaaHrIQ5-sXXwJfDI3FKPyv4xtGpOlg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/TW_GktV5uVYviPDtkCRCKRDrGlUc3sJ5OHO81uqdMaaHrIQ5-sXXwJfDI3FKPyv4xtGpOlg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'popcorn-yellow-striped-smile',\n },\n },\n },\n isCustomEmoji: true,\n index: 91,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/penguin-blue-waving-tear',\n shortcuts: [':penguin-blue-waving-tear:'],\n searchTerms: ['penguin-blue-waving-tear'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/p2u7dcfZau4_bMOMtN7Ma8mjHX_43jOjDwITf4U9adT44I-y-PT7ddwPKkfbW6Wx02BTpNoC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/p2u7dcfZau4_bMOMtN7Ma8mjHX_43jOjDwITf4U9adT44I-y-PT7ddwPKkfbW6Wx02BTpNoC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'penguin-blue-waving-tear',\n },\n },\n },\n isCustomEmoji: true,\n index: 92,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/clock-turquoise-looking-up',\n shortcuts: [':clock-turquoise-looking-up:'],\n searchTerms: ['clock-turquoise-looking-up'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tDnDkDZykkJTrsWEJPlRF30rmbek2wcDcAIymruOvSLTsUFIZHoAiYTRe9OtO-80lDfFGvo=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tDnDkDZykkJTrsWEJPlRF30rmbek2wcDcAIymruOvSLTsUFIZHoAiYTRe9OtO-80lDfFGvo=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'clock-turquoise-looking-up',\n },\n },\n },\n isCustomEmoji: true,\n index: 93,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-red-smiling-live',\n shortcuts: [':face-red-smiling-live:'],\n searchTerms: ['face-red-smiling-live'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/14Pb--7rVcqnHvM7UlrYnV9Rm4J-uojX1B1kiXYvv1my-eyu77pIoPR5sH28-eNIFyLaQHs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/14Pb--7rVcqnHvM7UlrYnV9Rm4J-uojX1B1kiXYvv1my-eyu77pIoPR5sH28-eNIFyLaQHs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-smiling-live',\n },\n },\n },\n isCustomEmoji: true,\n index: 94,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hands-yellow-heart-red',\n shortcuts: [':hands-yellow-heart-red:'],\n searchTerms: ['hands-yellow-heart-red'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qWSu2zrgOKLKgt_E-XUP9e30aydT5aF3TnNjvfBL55cTu1clP8Eoh5exN3NDPEVPYmasmoA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qWSu2zrgOKLKgt_E-XUP9e30aydT5aF3TnNjvfBL55cTu1clP8Eoh5exN3NDPEVPYmasmoA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hands-yellow-heart-red',\n },\n },\n },\n isCustomEmoji: true,\n index: 95,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/volcano-green-lava-orange',\n shortcuts: [':volcano-green-lava-orange:'],\n searchTerms: ['volcano-green-lava-orange'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_IWOdMxapt6IBY5Cb6LFVkA3J77dGQ7P2fuvYYv1-ahigpVfBvkubOuGLSCyFJ7jvis-X8I=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_IWOdMxapt6IBY5Cb6LFVkA3J77dGQ7P2fuvYYv1-ahigpVfBvkubOuGLSCyFJ7jvis-X8I=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'volcano-green-lava-orange',\n },\n },\n },\n isCustomEmoji: true,\n index: 96,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-waving-speech',\n shortcuts: [':person-turquoise-waving-speech:'],\n searchTerms: ['person-turquoise-waving-speech'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/gafhCE49PH_9q-PuigZaDdU6zOKD6grfwEh1MM7fYVs7smAS_yhYCBipq8gEiW73E0apKTzi=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/gafhCE49PH_9q-PuigZaDdU6zOKD6grfwEh1MM7fYVs7smAS_yhYCBipq8gEiW73E0apKTzi=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-waving-speech',\n },\n },\n },\n isCustomEmoji: true,\n index: 97,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-orange-tv-shape',\n shortcuts: [':face-orange-tv-shape:'],\n searchTerms: ['face-orange-tv-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EVK0ik6dL5mngojX9I9Juw4iFh053emP0wcUjZH0whC_LabPq-DZxN4Jg-tpMcEVfJ0QpcJ4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EVK0ik6dL5mngojX9I9Juw4iFh053emP0wcUjZH0whC_LabPq-DZxN4Jg-tpMcEVfJ0QpcJ4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-tv-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 98,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-blue-spam-shape',\n shortcuts: [':face-blue-spam-shape:'],\n searchTerms: ['face-blue-spam-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/hpwvR5UgJtf0bGkUf8Rn-jTlD6DYZ8FPOFY7rhZZL-JHj_7OPDr7XUOesilRPxlf-aW42Zg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/hpwvR5UgJtf0bGkUf8Rn-jTlD6DYZ8FPOFY7rhZZL-JHj_7OPDr7XUOesilRPxlf-aW42Zg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-spam-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 99,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-fuchsia-flower-shape',\n shortcuts: [':face-fuchsia-flower-shape:'],\n searchTerms: ['face-fuchsia-flower-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/o9kq4LQ0fE_x8yxj29ZeLFZiUFpHpL_k2OivHbjZbttzgQytU49Y8-VRhkOP18jgH1dQNSVz=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/o9kq4LQ0fE_x8yxj29ZeLFZiUFpHpL_k2OivHbjZbttzgQytU49Y8-VRhkOP18jgH1dQNSVz=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-flower-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 100,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-holding-pencil',\n shortcuts: [':person-blue-holding-pencil:'],\n searchTerms: ['person-blue-holding-pencil'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/TKgph5IHIHL-A3fgkrGzmiNXzxJkibB4QWRcf_kcjIofhwcUK_pWGUFC4xPXoimmne3h8eQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/TKgph5IHIHL-A3fgkrGzmiNXzxJkibB4QWRcf_kcjIofhwcUK_pWGUFC4xPXoimmne3h8eQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-holding-pencil',\n },\n },\n },\n isCustomEmoji: true,\n index: 101,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/body-turquoise-yoga-pose',\n shortcuts: [':body-turquoise-yoga-pose:'],\n searchTerms: ['body-turquoise-yoga-pose'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/GW3otW7CmWpuayb7Ddo0ux5c-OvmPZ2K3vaytJi8bHFjcn-ulT8vcHMNcqVqMp1j2lit2Vw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/GW3otW7CmWpuayb7Ddo0ux5c-OvmPZ2K3vaytJi8bHFjcn-ulT8vcHMNcqVqMp1j2lit2Vw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-turquoise-yoga-pose',\n },\n },\n },\n isCustomEmoji: true,\n index: 102,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/location-yellow-teal-bars',\n shortcuts: [':location-yellow-teal-bars:'],\n searchTerms: ['location-yellow-teal-bars'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/YgeWJsRspSlAp3BIS5HMmwtpWtMi8DqLg9fH7DwUZaf5kG4yABfE1mObAvjCh0xKX_HoIR23=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/YgeWJsRspSlAp3BIS5HMmwtpWtMi8DqLg9fH7DwUZaf5kG4yABfE1mObAvjCh0xKX_HoIR23=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'location-yellow-teal-bars',\n },\n },\n },\n isCustomEmoji: true,\n index: 103,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-writing-headphones',\n shortcuts: [':person-turquoise-writing-headphones:'],\n searchTerms: ['person-turquoise-writing-headphones'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DC4KrwzNkVxLZa2_KbKyjZTUyB9oIvH5JuEWAshsMv9Ctz4lEUVK0yX5PaMsTK3gGS-r9w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DC4KrwzNkVxLZa2_KbKyjZTUyB9oIvH5JuEWAshsMv9Ctz4lEUVK0yX5PaMsTK3gGS-r9w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-writing-headphones',\n },\n },\n },\n isCustomEmoji: true,\n index: 104,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-wizard-wand',\n shortcuts: [':person-turquoise-wizard-wand:'],\n searchTerms: ['person-turquoise-wizard-wand'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/OiZeNvmELg2PQKbT5UCS0xbmsGbqRBSbaRVSsKnRS9gvJPw7AzPp-3ysVffHFbSMqlWKeQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/OiZeNvmELg2PQKbT5UCS0xbmsGbqRBSbaRVSsKnRS9gvJPw7AzPp-3ysVffHFbSMqlWKeQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-wizard-wand',\n },\n },\n },\n isCustomEmoji: true,\n index: 105,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-eating-spaghetti',\n shortcuts: [':person-blue-eating-spaghetti:'],\n searchTerms: ['person-blue-eating-spaghetti'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/AXZ8POmCHoxXuBaRxX6-xlT5M-nJZmO1AeUNo0t4o7xxT2Da2oGy347sHpMM8shtUs7Xxh0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/AXZ8POmCHoxXuBaRxX6-xlT5M-nJZmO1AeUNo0t4o7xxT2Da2oGy347sHpMM8shtUs7Xxh0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-eating-spaghetti',\n },\n },\n },\n isCustomEmoji: true,\n index: 106,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-turquoise-music-note',\n shortcuts: [':face-turquoise-music-note:'],\n searchTerms: ['face-turquoise-music-note'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-K6oRITFKVU8V4FedrqXGkV_vTqUufVCQpBpyLK6w3chF4AS1kzT0JVfJxhtlfIAw5jrNco=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-K6oRITFKVU8V4FedrqXGkV_vTqUufVCQpBpyLK6w3chF4AS1kzT0JVfJxhtlfIAw5jrNco=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-music-note',\n },\n },\n },\n isCustomEmoji: true,\n index: 107,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-pink-swaying-hair',\n shortcuts: [':person-pink-swaying-hair:'],\n searchTerms: ['person-pink-swaying-hair'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L8cwo8hEoVhB1k1TopQaeR7oPTn7Ypn5IOae5NACgQT0E9PNYkmuENzVqS7dk2bYRthNAkQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L8cwo8hEoVhB1k1TopQaeR7oPTn7Ypn5IOae5NACgQT0E9PNYkmuENzVqS7dk2bYRthNAkQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-pink-swaying-hair',\n },\n },\n },\n isCustomEmoji: true,\n index: 108,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-speaking-microphone',\n shortcuts: [':person-blue-speaking-microphone:'],\n searchTerms: ['person-blue-speaking-microphone'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FMaw3drKKGyc6dk3DvtHbkJ1Ki2uD0FLqSIiFDyuChc1lWcA9leahX3mCFMBIWviN2o8eyc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FMaw3drKKGyc6dk3DvtHbkJ1Ki2uD0FLqSIiFDyuChc1lWcA9leahX3mCFMBIWviN2o8eyc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-speaking-microphone',\n },\n },\n },\n isCustomEmoji: true,\n index: 109,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/rocket-red-countdown-liftoff',\n shortcuts: [':rocket-red-countdown-liftoff:'],\n searchTerms: ['rocket-red-countdown-liftoff'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/lQZFYAeWe5-SJ_fz6dCAFYz1MjBnEek8DvioGxhlj395UFTSSHqYAmfhJN2i0rz3fDD5DQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/lQZFYAeWe5-SJ_fz6dCAFYz1MjBnEek8DvioGxhlj395UFTSSHqYAmfhJN2i0rz3fDD5DQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'rocket-red-countdown-liftoff',\n },\n },\n },\n isCustomEmoji: true,\n index: 110,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-purple-rain-drops',\n shortcuts: [':face-purple-rain-drops:'],\n searchTerms: ['face-purple-rain-drops'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/woHW5Jl2RD0qxijnl_4vx4ZhP0Zp65D4Ve1DM_HrwJW-Kh6bQZoRjesGnEwjde8F4LynrQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/woHW5Jl2RD0qxijnl_4vx4ZhP0Zp65D4Ve1DM_HrwJW-Kh6bQZoRjesGnEwjde8F4LynrQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-rain-drops',\n },\n },\n },\n isCustomEmoji: true,\n index: 111,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-pink-drinking-tea',\n shortcuts: [':face-pink-drinking-tea:'],\n searchTerms: ['face-pink-drinking-tea'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/WRLIgKpnClgYOZyAwnqP-Edrdxu6_N19qa8gsB9P_6snZJYIMu5YBJX8dlM81YG6H307KA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/WRLIgKpnClgYOZyAwnqP-Edrdxu6_N19qa8gsB9P_6snZJYIMu5YBJX8dlM81YG6H307KA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-pink-drinking-tea',\n },\n },\n },\n isCustomEmoji: true,\n index: 112,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-purple-stage-event',\n shortcuts: [':person-purple-stage-event:'],\n searchTerms: ['person-purple-stage-event'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/YeVVscOyRcDJAhKo2bMwMz_B6127_7lojqafTZECTR9NSEunYO5zEi7R7RqxBD7LYLxfNnXe=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/YeVVscOyRcDJAhKo2bMwMz_B6127_7lojqafTZECTR9NSEunYO5zEi7R7RqxBD7LYLxfNnXe=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-purple-stage-event',\n },\n },\n },\n isCustomEmoji: true,\n index: 113,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-purple-open-box',\n shortcuts: [':face-purple-open-box:'],\n searchTerms: ['face-purple-open-box'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7lJM2sLrozPtNLagPTcN0xlcStWpAuZEmO2f4Ej5kYgSp3woGdq3tWFrTH30S3mD2PyjlQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7lJM2sLrozPtNLagPTcN0xlcStWpAuZEmO2f4Ej5kYgSp3woGdq3tWFrTH30S3mD2PyjlQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-open-box',\n },\n },\n },\n isCustomEmoji: true,\n index: 114,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/COLRg9qOwdQCFce-qgodrbsLaA',\n shortcuts: [':awesome:'],\n searchTerms: ['awesome'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/xqqFxk7nC5nYnjy0oiSPpeWX4yu4I-ysb3QJMOuVml8dHWz82FvF8bhGVjlosZRIG_XxHA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/xqqFxk7nC5nYnjy0oiSPpeWX4yu4I-ysb3QJMOuVml8dHWz82FvF8bhGVjlosZRIG_XxHA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'awesome',\n },\n },\n },\n isCustomEmoji: true,\n index: 115,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CMKC7uKOwdQCFce-qgodqbsLaA',\n shortcuts: [':gar:'],\n searchTerms: ['gar'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/pxQTF9D-uxlSIgoopRcS8zAZnBBEPp2R9bwo5qIc3kc7PF2k18so72-ohINWPa6OvWudEcsC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/pxQTF9D-uxlSIgoopRcS8zAZnBBEPp2R9bwo5qIc3kc7PF2k18so72-ohINWPa6OvWudEcsC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'gar',\n },\n },\n },\n isCustomEmoji: true,\n index: 116,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CJiQ8uiOwdQCFcx9qgodysAOHg',\n shortcuts: [':jakepeter:'],\n searchTerms: ['jakepeter'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/iq0g14tKRcLwmfdpHULRMeUGfpWUlUyJWr0adf1K1-dStgPOguOe8eo5bKrxmCqIOlu-J18=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/iq0g14tKRcLwmfdpHULRMeUGfpWUlUyJWr0adf1K1-dStgPOguOe8eo5bKrxmCqIOlu-J18=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'jakepeter',\n },\n },\n },\n isCustomEmoji: true,\n index: 117,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CI3h3uDJitgCFdARTgodejsFWg',\n shortcuts: [':wormRedBlue:'],\n searchTerms: ['wormRedBlue'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/QrjYSGexvrRfCVpWrgctyB3shVRAgKmXtctM1vUnA78taji1zYNWwrHs1GKBpdpG5A6yK_k=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/QrjYSGexvrRfCVpWrgctyB3shVRAgKmXtctM1vUnA78taji1zYNWwrHs1GKBpdpG5A6yK_k=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormRedBlue',\n },\n },\n },\n isCustomEmoji: true,\n index: 118,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CI69oYTKitgCFdaPTgodsHsP5g',\n shortcuts: [':wormOrangeGreen:'],\n searchTerms: ['wormOrangeGreen'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/S-L8lYTuP13Ds9TJZ2UlxdjDiwNRFPnj0o4x6DAecyJLXDdQ941upYRhxalbjzpJn5USU_k=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/S-L8lYTuP13Ds9TJZ2UlxdjDiwNRFPnj0o4x6DAecyJLXDdQ941upYRhxalbjzpJn5USU_k=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormOrangeGreen',\n },\n },\n },\n isCustomEmoji: true,\n index: 119,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CKzQr47KitgCFdCITgodq6EJZg',\n shortcuts: [':wormYellowRed:'],\n searchTerms: ['wormYellowRed'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L9TQqjca5x7TE8ZB-ifFyU51xWXArz47rJFU7Pg2KgWMut5th9qsU-pCu1zIF98szO5wNXE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L9TQqjca5x7TE8ZB-ifFyU51xWXArz47rJFU7Pg2KgWMut5th9qsU-pCu1zIF98szO5wNXE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormYellowRed',\n },\n },\n },\n isCustomEmoji: true,\n index: 120,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CPGD8Iu8kN4CFREChAod9OkLmg',\n shortcuts: [':ytg:'],\n searchTerms: ['ytg'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7PgbidnZLTC-38qeoqYensfXg7s7EC1Dudv9q9l8aIjqLgnfvpfhnEBH_7toCmVmqhIe4I45=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7PgbidnZLTC-38qeoqYensfXg7s7EC1Dudv9q9l8aIjqLgnfvpfhnEBH_7toCmVmqhIe4I45=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'ytg',\n },\n },\n },\n isCustomEmoji: true,\n index: 121,\n },\n];\n","import * as Collection from './collection/index.js';\n\nexport namespace Data {\n export const avatars = Collection.avatars;\n export const badges = Collection.globalBadges;\n\n export const css_color_names = Collection.css_color_names;\n export const items = Collection.items;\n export const names = Collection.names;\n export const tiers = Collection.tiers;\n export const tts = Collection.tts;\n\n export const messages = Collection.messages;\n export const normal_messages = Collection.normal_messages;\n export const twitch_messages = Collection.twitch_messages;\n export const youtube_messages = Collection.youtube_messages;\n\n export const emotes = Collection.emotes;\n export const ffz_emotes = Collection.FfzEmotes;\n export const bttv_emotes = Collection.BttvEmotes;\n export const seventv_emotes = Collection.SeventvEmotes;\n export const twitch_emotes = Collection.TwitchEmotes;\n export const youtube_emotes = Collection.YoutubeEmotes;\n}\n","import { Data } from '../../data/index.js';\n\nexport class RandomHelper {\n /**\n * Generate random color\n * @param type - Color format\n * @returns - Random color in specified format\n * @example\n * ```javascript\n * const hexColor = random.color('hex');\n * console.log(hexColor); // e.g. #3e92cc\n *\n * const rgbColor = random.color('rgb');\n * console.log(rgbColor); // e.g. rgb(62, 146, 204)\n * ```\n */\n color(type: 'hex' | 'hexa' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name' = 'hex') {\n switch (type) {\n default:\n case 'hex': {\n return `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n }\n case 'hexa': {\n const hex = `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n\n const alpha = Math.floor(Math.random() * 256)\n .toString(16)\n .padStart(2, '0');\n\n return hex + alpha;\n }\n case 'rgb': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n\n return `rgb(${r}, ${g}, ${b})`;\n }\n case 'rgba': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n const a = Math.random().toFixed(2);\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n case 'hsl': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n\n return `hsl(${h}, ${s}%, ${l}%)`;\n }\n case 'hsla': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n const a = Math.random().toFixed(2);\n\n return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n }\n case 'css-color-name': {\n var names = Data.css_color_names;\n\n return this.array(names)[0];\n }\n }\n }\n\n /**\n * Generate random number\n * @param min - Minimum value\n * @param max - Maximum value\n * @param float - Number of decimal places (0 for integer)\n * @returns - Random number\n * @example\n * ```javascript\n * const intNumber = random.number(1, 10);\n * console.log(intNumber); // e.g. 7\n *\n * const floatNumber = random.number(1, 10, 2);\n * console.log(floatNumber); // e.g. 3.14\n * ```\n */\n number(min: number, max: number, float: number = 0): number {\n if (min > max) [min, max] = [max, min];\n\n const rand = Math.random() * (max - min) + min;\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\n }\n\n /**\n * Generate random boolean\n * @param threshold - Threshold between 0 and 1\n * @returns - Random boolean\n * @example\n * ```javascript\n * const boolValue = random.boolean(0.7);\n * console.log(boolValue); // e.g. true (70% chance)\n * ```\n */\n boolean(threshold: number = 0.5): boolean {\n return Math.random() > threshold;\n }\n\n /**\n * Generate random string\n * @param length - Length of the string\n * @param chars - Characters to use\n * @returns - Random string\n * @example\n * ```javascript\n * const randString = random.string(10); // e.g. \"aZ3bT9qP1x\"\n * const randHex = random.string(8, 'hex'); // e.g. \"4f3c2a1b\"\n * const randNumStr = random.string(6, 'numbers'); // e.g. \"839201\"\n * const randLetterStr = random.string(6, 'letters'); // e.g. \"aZbTqP\"\n * const randHexUpper = random.string(6, 'hex-upper'); // e.g. \"4F3C2A1B\"\n * const randHexLower = random.string(6, 'hex-lower'); // e.g. \"4f3c2a1b\"\n * ```\n */\n string(\n length: number,\n chars:\n | 'numeric'\n | 'numbers'\n | 'letters'\n | 'hex'\n | 'hex-upper'\n | 'hex-lower'\n | string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',\n ): string {\n if (chars === 'numbers' || chars === 'numeric') chars = '0123456789';\n else if (chars === 'letters' || chars === 'letter')\n chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n else if (chars === 'hex' || chars === 'hexadecimal') chars = '0123456789abcdef';\n else if (chars === 'hex-upper' || chars === 'hexadecimal-upper') chars = '0123456789ABCDEF';\n else if (chars === 'hex-lower' || chars === 'hexadecimal-lower') chars = '0123456789abcdef';\n\n let result = '';\n\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n\n return result;\n }\n\n /**\n * Pick random element from array\n * @param arr - Array to pick from\n * @returns - Random element and its index\n * @example\n * ```javascript\n * const [element, index] = random.array(['apple', 'banana', 'cherry']);\n * console.log(element, index); // e.g. \"banana\", 1\n * ```\n */\n array<T>(arr: T[]): [value: T, index: number] {\n const index = this.number(0, arr.length - 1);\n\n return [arr[index], index];\n }\n\n /**\n * Generate random date\n * @param start - Start date\n * @param end - End date\n * @returns - Random date between start and end\n * @example\n * ```javascript\n * const randDate = random.date(new Date(2020, 0, 1), new Date());\n * console.log(randDate); // e.g. 2022-05-15T10:30:00.000Z\n * ```\n */\n date(start: Date = new Date(2000, 0, 1), end: Date = new Date()): Date {\n const date = new Date(this.number(start.getTime(), end.getTime()));\n\n return date;\n }\n\n /**\n * Generate ISO date string offset by days\n * @param daysAgo - Number of days to go back\n * @returns - ISO date string\n * @example\n * ```javascript\n * const isoDate = random.daysOffset(7);\n * console.log(isoDate); // e.g. \"2024-06-10T14:23:45.678Z\"\n *\n * const isoDate30 = random.daysOffset(30);\n * console.log(isoDate30); // e.g. \"2024-05-18T09:15:30.123Z\"\n * ```\n */\n daysOffset(daysAgo: number): string {\n const now = Date.now();\n const past = now - this.number(0, daysAgo * 24 * 60 * 60 * 1000);\n\n return new Date(past).toISOString();\n }\n\n /**\n * Generate UUID v4\n * @returns - UUID string\n * @example\n * ```javascript\n * const uuid = random.uuid();\n * console.log(uuid); // e.g. \"3b12f1df-5232-4e3a-9a0c-3f9f1b1b1b1b\"\n * ```\n */\n uuid(): string {\n return crypto.randomUUID();\n }\n}\n","import { Data } from '../../data/index.js';\nimport { Emote, Provider, Twitch } from '../../types.js';\nimport { NumberHelper } from './number.js';\nimport { RandomHelper } from './random.js';\n\nexport type BadgeOptions =\n | Twitch.tags[]\n | Twitch.tags\n | `${Twitch.tags}/${string}`\n | `${Twitch.tags}/${string}`[];\n\nexport type TwitchResult = {\n keys: Twitch.tags[];\n badges: Twitch.badge[];\n versions: { [K in Twitch.tags]?: string | number };\n amount: { [K in Twitch.tags]?: string | number };\n};\n\nexport type YouTubeResult = {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n};\n\nexport class MessageHelper {\n /**\n * Finds emotes in a given text.\n * @param text - The text to search for emotes.\n * @param emotes - An array of emotes to search for. Defaults to Local data emotes.\n * @returns An array of emotes found in the text with their positions.\n */\n findEmotesInText(text: string, emotes: Emote[] = Data.emotes): Emote[] {\n const result: Emote[] = [];\n\n emotes\n .filter((emote) => emote.type !== 'emoji')\n .forEach((emote) => {\n const name = emote.name;\n\n let searchIndex = 0;\n let start = 0;\n\n while (searchIndex < text.length) {\n const index = text.indexOf(name, start);\n\n if (index === -1) break;\n\n const before = index > 0 ? text[index - 1] : ' ';\n const after = index + name.length < text.length ? text[index + name.length] : ' ';\n\n if (/\\s/.test(before) && /\\s/.test(after)) {\n result.push({ ...emote, start: index, end: index + name.length });\n }\n\n start = index + 1;\n }\n });\n\n return result;\n }\n\n /**\n * Replaces emotes in the text with corresponding HTML image tags.\n * @param text - The text containing emotes.\n * @param emotes - An array of emotes with their positions in the text.\n * @returns The text with emotes replaced by HTML image tags.\n */\n replaceEmotesWithHTML(text: string, emotes: Emote[]): string {\n if (!emotes.length) return text;\n\n let result = '';\n let index = 0;\n\n emotes\n .filter((emote) => emote.type !== 'emoji')\n .sort((a, b) => a.start - b.start)\n .forEach((emote) => {\n if (emote.start < index) return;\n\n result += text.substring(index, emote.start);\n\n const emotesArray = Array.from({ ...emote.urls, length: 5 })\n .slice(1)\n .reverse()\n .filter(Boolean);\n\n const imgUrl = emotesArray[0] || emote.urls['1'];\n\n result += `<img src=\"${imgUrl}\" alt=\"${emote.name}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`;\n\n const expectedExclusiveEnd = emote.start + emote.name.length;\n const normalizedEnd = emote.end === expectedExclusiveEnd - 1 ? emote.end + 1 : emote.end;\n index = normalizedEnd;\n });\n\n result += text.substring(index);\n\n return result;\n }\n\n /**\n * Checks if the text contains only emotes and whitespace.\n * @param text - The text to check.\n * @param emotes - An array of emotes with their positions in the text.\n * @returns True if the text contains only emotes and whitespace, false otherwise.\n */\n hasOnlyEmotes(text: string, emotes: Emote[]): boolean {\n const textWithoutEmotes = emotes.reduce((acc, emote) => {\n return acc\n .replace(new RegExp(`\\\\b${emote.name}\\\\b`, 'g'), '')\n .replace(/<img[^>]*class=\"emote\"[^>]*>/gi, '');\n }, text);\n\n return textWithoutEmotes.trim().length === 0;\n }\n\n /**\n * Replaces YouTube emotes in the text with corresponding HTML image tags.\n * @param text - The text containing YouTube emotes.\n * @param emotes - An array of YouTube emotes. Defaults to Local data YouTube emotes.\n * @returns The text with YouTube emotes replaced by HTML image tags.\n */\n replaceYoutubeEmotesWithHTML(text: string, emotes = Data.youtube_emotes): string {\n const emoteCodesInside = Array.from(text.matchAll(/:(.*?):/gim), (x) => x[0]);\n\n emoteCodesInside.forEach((code) => {\n const emote = emotes.find(\n (e) => e.shortcuts.includes(code) || e.searchTerms.includes(code.slice(1, -1)),\n );\n\n if (emote) {\n const url = emote.image.thumbnails.at(-1)?.url;\n const alt = emote.image.accessibility.accessibilityData.label;\n\n if (url) {\n text = text.replace(\n code,\n `<img src=\"${url}\" alt=\"${alt}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`,\n );\n }\n }\n });\n\n return text;\n }\n\n /**\n * Maps global badge versions to a structured format.\n * @param globalBadges - An array of Twitch global badges. Defaults to Local data badges.\n * @returns An array of objects containing badge IDs and their corresponding versions.\n * @example\n * ```javascript\n * const badgeVersions = mapGlobalBadgeVersions();\n * console.log(badgeVersions);\n * // Output:\n * [\n * {\n * id: 'subscriber',\n * versions: [\n * { type: 'subscriber', version: '1', url: 'https://...', description: 'Subscriber' },\n * { type: 'subscriber', version: '2', url: 'https://...', description: '2-Month Subscriber' },\n * // ... more versions\n * ],\n * },\n * {\n * id: 'bits',\n * versions: [\n * { type: 'bits', version: '100', url: 'https://...', description: 'cheer 100' },\n * { type: 'bits', version: '1000', url: 'https://...', description: 'cheer 1000' },\n * // ... more versions\n * ],\n * },\n * // ... more badges\n * ]\n * ```\n */\n mapGlobalBadgeVersions(globalBadges: Twitch.GlobalBadge[] = Data.badges): Array<{\n id: Twitch.tags;\n versions: Twitch.badge[];\n }> {\n return globalBadges.map((badge) => ({\n id: badge.set_id,\n versions: badge.versions.map((version) => ({\n type: badge.set_id,\n version: version.id,\n url: version.image_url_4x,\n description: version.title,\n })),\n }));\n }\n\n /**\n * Maps a badge type and variation to the corresponding badge version amount.\n * @param type - The badge type (e.g., 'subscriber', 'bits', etc.).\n * @param variation - The badge variation, which can be a number or a string (e.g., 'horde', 'alliance', etc.).\n * @returns The badge version amount as a string. Returns '0' if no matching badge version is found.\n * @example\n * ```javascript\n * // For subscriber badge with 3 months\n * mapGlobalBadgeVersionAmount('subscriber', 3); // Returns '3'\n * // For bits badge with 5000 bits\n * mapGlobalBadgeVersionAmount('bits', 5000); // Returns the corresponding badge version based on the mapping\n * // For warcraft badge with 'horde' variation\n * mapGlobalBadgeVersionAmount('warcraft', 'horde'); // Returns 'horde'\n * ```\n */\n mapGlobalBadgeVersionAmount(type: Twitch.tags, variation: string | number): string {\n const IdToId = (key: Twitch.tags) =>\n Data.badges\n .find((b) => b.set_id === key)!\n .versions.map((v) => [v.id, parseInt(v.id)] as [string, number]);\n\n let result = '0';\n\n switch (type) {\n case 'subscriber': {\n if (isNaN(parseInt(variation as string))) return result;\n\n const map = Object.entries({\n '0': 0,\n '1': 1,\n '2': 2,\n '3': 3,\n '4': 6,\n '5': 9,\n '6': 12,\n });\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n\n break;\n }\n case 'bits':\n case 'sub-gifter':\n case 'bits-leader':\n case 'clips-leader':\n case 'sub-gift-leader': {\n if (isNaN(parseInt(variation as string))) return result;\n\n const map = IdToId(type);\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n\n break;\n }\n case 'warcraft': {\n const map = {\n horde: 'horde',\n alliance: 'alliance',\n };\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n\n break;\n }\n case 'twitchbot': {\n const map = {\n 1: 'auto mod',\n 2: 'automated moderation system',\n };\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n break;\n }\n case 'moments': {\n if (isNaN(parseInt(variation as string))) {\n const map = Object.fromEntries(\n Array.from({ length: 20 }, (_, i) => i + 1).map((num) => [num, `tier ${num}`]),\n );\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n } else {\n const map = IdToId('moments');\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n case 'power-rangers': {\n if (isNaN(parseInt(variation as string))) {\n const map = {\n 0: ['black ranger', 'black', 'blackranger'],\n 1: ['blue ranger', 'blue', 'blueranger'],\n 2: ['green ranger', 'green', 'greenranger'],\n 3: ['pink ranger', 'pink', 'pinkranger'],\n 4: ['red ranger', 'red', 'redranger'],\n 5: ['white ranger', 'white', 'whiteranger'],\n 6: ['yellow ranger', 'yellow', 'yellowranger'],\n };\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n } else {\n const map = IdToId('power-rangers');\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n case 'predictions': {\n const map = Object.fromEntries(\n IdToId('predictions').map(([key, _]) => [\n key,\n [key, key.replace('-', ' '), key.replace('-', '')],\n ]),\n );\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n\n break;\n }\n case 'social-sharing': {\n if (isNaN(parseInt(variation as string))) {\n const map = Object.fromEntries(\n IdToId('social-sharing').map(([key, _]) => [\n key,\n [key + ' views', key.replace('-', '') + ' views'],\n ]),\n );\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n } else {\n const map = {\n 1: 100,\n 2: 10000,\n 3: 100000,\n };\n\n for (const [key, minAmount] of Object.entries(map)) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n }\n\n return result;\n }\n\n badgePriority: Twitch.tags[] = [\n 'broadcaster',\n 'lead_moderator',\n 'moderator',\n 'vip',\n 'artist-badge',\n 'subscriber',\n 'sub-gift-leader',\n 'founder',\n 'sub-gifter',\n 'bits-leader',\n 'bits',\n 'admin',\n 'global_mod',\n 'staff',\n 'partner',\n 'ambassador',\n 'predictions',\n 'twitchbot',\n 'extension',\n 'game-developer',\n 'hype-train',\n 'bot-badge',\n 'turbo',\n 'premium',\n 'no_video',\n 'no_audio',\n ];\n\n /**\n * Generates badge data based on the provided badges and platform.\n * @param badges - The badges to generate. Can be an array or a comma-separated string.\n * @param provider - The platform provider ('twitch' or 'youtube'). Defaults to 'twitch'.\n * @returns A promise that resolves to the generated badge data.\n * @example\n * ```javascript\n * // Generate Twitch badges\n * const twitchBadges = await generateBadges(['broadcaster', 'moderator'], 'twitch');\n * // Generate YouTube badges\n * const youtubeBadges = await generateBadges('sponsor, moderator', 'youtube');\n * ```\n */\n async generateBadges<T extends Provider>(\n badges: BadgeOptions = [],\n provider: T,\n ): Promise<T extends 'twitch' ? TwitchResult : YouTubeResult> {\n const globalBadges = this.mapGlobalBadgeVersions();\n\n if (!Array.isArray(badges) && typeof badges === 'string') {\n badges = badges.split(',').map((e) => e.trim()) as Twitch.tags[];\n }\n\n var clearedBadges = badges.map((badge) => badge.split('/')[0] as Twitch.tags);\n\n if (!clearedBadges || !clearedBadges.length) {\n const number = new NumberHelper();\n const random = new RandomHelper();\n var max = number.random(1, 3);\n\n for await (const _ of Array.from({ length: max }, () => '')) {\n // var current = random.array(Object.keys(Data.badges))[0] as Twitch.roles;\n const item = random.array(globalBadges)[0];\n\n if (!clearedBadges.includes(item.id) && Array.isArray(clearedBadges)) {\n clearedBadges.push(item.id);\n } else {\n clearedBadges = [item.id];\n }\n }\n }\n\n clearedBadges = clearedBadges.sort((a, b) => {\n const aIndex = this.badgePriority.indexOf(a);\n const bIndex = this.badgePriority.indexOf(b);\n\n return (\n (aIndex === -1 ? Number.MAX_SAFE_INTEGER : aIndex) -\n (bIndex === -1 ? Number.MAX_SAFE_INTEGER : bIndex)\n );\n });\n\n var result;\n\n switch (provider) {\n case 'twitch': {\n const keys = Array.from(clearedBadges).filter((e) =>\n globalBadges.some((badge) => badge.id === e),\n ) as Twitch.tags[];\n\n const versions = badges.reduce(\n (acc, data) => {\n var [badge, variation = '1'] = data.split('/') as [Twitch.tags, string];\n\n let value: string | number = variation;\n\n if (!isNaN(parseInt(value))) value = parseInt(value);\n else if (!value) value = 0;\n\n acc[badge] = this.mapGlobalBadgeVersionAmount(badge, value);\n\n return acc;\n },\n {} as { [K in Twitch.tags]?: string | number },\n );\n\n result = {\n keys,\n versions,\n amount: badges.reduce(\n (acc, data) => {\n var [badge, variation = '1'] = data.split('/') as [Twitch.tags, string];\n\n let value: string | number = variation;\n\n if (!isNaN(parseInt(value))) value = parseInt(value);\n else if (!value) value = 0;\n\n acc[badge] = value;\n\n return acc;\n },\n {} as { [K in Twitch.tags]?: string | number },\n ),\n badges: Array.from(clearedBadges)\n .slice(0, 3)\n .map((badge) => {\n const data = globalBadges.find((b) => b.id === badge);\n\n if (data?.versions && data.versions.length) {\n const quantity = versions[badge];\n\n const version = data.versions.find((v) => v.version === String(quantity));\n\n if (version) return version;\n\n return data.versions[0];\n }\n\n return;\n })\n .filter(Boolean) as Twitch.badge[],\n };\n\n break;\n }\n\n case 'youtube': {\n var details = {\n verified: { isVerified: true },\n partner: { isVerified: true },\n broadcaster: { isChatOwner: true },\n host: { isChatOwner: true },\n sponsor: { isChatSponsor: true },\n subscriber: { isChatSponsor: true },\n moderator: { isChatModerator: true },\n };\n\n result = Object.values(clearedBadges).reduce(\n (acc, key) => {\n if (key in details) {\n Object.assign(acc, details[key as keyof typeof details]);\n }\n\n return acc;\n },\n {\n isVerified: false,\n isChatOwner: false,\n isChatSponsor: false,\n isChatModerator: false,\n } as {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n },\n );\n\n break;\n }\n }\n\n return result as T extends 'twitch' ? TwitchResult : YouTubeResult;\n }\n}\n","import { ClientEvents, Provider, StreamElements } from '../../types.js';\n\nexport class EventHelper {\n /**\n * Parses the provider information from the event detail object.\n * @param detail - The event detail object received from the StreamElements event.\n * @returns An object containing the provider and the original event data.\n */\n parseProvider(\n detail: StreamElements.Event.onEventReceived,\n overrideProvider?: Provider,\n ): ClientEvents {\n var provider: Provider =\n // @ts-ignore\n detail?.provider ||\n // @ts-ignore\n detail.event?.provider ||\n // @ts-ignore\n detail.event?.service ||\n // @ts-ignore\n detail.event?.data?.provider ||\n // @ts-ignore\n overrideProvider ||\n // @ts-ignore\n window?.client?.details?.provider ||\n 'twitch';\n\n const actAsStreamElements = [\n 'kvstore:update',\n 'bot:counter',\n 'alertService:toggleSound',\n 'tip-latest',\n 'event:test',\n 'event:skip',\n ] as StreamElements.Event.onEventReceived['listener'][];\n\n if (actAsStreamElements.some((l) => l === detail.listener)) provider = 'streamelements';\n\n const received = { provider: provider, data: detail } as ClientEvents;\n\n return received;\n }\n}\n","import { css_color_names } from '../data/collection/css.js';\n\n/**\n * Parse a color string to RGBA components\n * @param str - color string\n * @param format - format of the input color string\n * @returns - RGBA components or null if parsing fails\n */\nexport function parseToRGBA(\n str: string,\n format: string | false,\n): { r: number; g: number; b: number; a: number } | null {\n if (!format) return null;\n\n switch (format) {\n case 'hex': {\n const hex = str.replace('#', '');\n let r = 0,\n g = 0,\n b = 0,\n a = 1;\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n } else if (hex.length === 4) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n a = parseInt(hex[3] + hex[3], 16) / 255;\n } else if (hex.length === 8) {\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n a = parseInt(hex.slice(6, 8), 16) / 255;\n }\n\n return { r, g, b, a };\n }\n\n case 'rgb':\n case 'rgba': {\n const match = str.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)/);\n if (!match) return null;\n\n return {\n r: parseInt(match[1]),\n g: parseInt(match[2]),\n b: parseInt(match[3]),\n a: match[4] ? parseFloat(match[4]) : 1,\n };\n }\n\n case 'hsl':\n case 'hsla': {\n const match = str.match(/hsla?\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%(?:\\s*,\\s*([\\d.]+))?\\s*\\)/);\n if (!match) return null;\n\n const h = parseInt(match[1]);\n const s = parseInt(match[2]);\n const l = parseInt(match[3]);\n const a = match[4] ? parseFloat(match[4]) : 1;\n\n const rgb = hslToRgb(h, s, l);\n return { ...rgb, a };\n }\n\n case 'css-color-name': {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n ctx.fillStyle = str;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b] = ctx.getImageData(0, 0, 1, 1).data;\n\n return { r, g, b, a: 1 };\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Convert RGBA to Hex\n * @param rgba - RGBA components\n * @param includeAlpha - Whether to include alpha in the hex string\n * @returns Hex color string\n */\nexport function rgbaToHex(\n rgba: { r: number; g: number; b: number; a: number },\n includeAlpha: boolean = true,\n): string {\n const toHex = (n: number) => Math.round(n).toString(16).padStart(2, '0');\n\n let hex = `#${toHex(rgba.r)}${toHex(rgba.g)}${toHex(rgba.b)}`;\n\n if (includeAlpha && rgba.a < 1) {\n hex += toHex(rgba.a * 255);\n }\n\n return hex;\n}\n\n/**\n * Convert RGB to HSL\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns HSL components\n */\nexport function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (delta !== 0) {\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / delta + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / delta + 2) / 6;\n break;\n case b:\n h = ((r - g) / delta + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\n/**\n * Convert HSL to RGB\n * @param h - Hue (0-360)\n * @param s - Saturation (0-100)\n * @param l - Lightness (0-100)\n * @returns RGB components\n */\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n h /= 360;\n s /= 100;\n l /= 100;\n\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255),\n };\n}\n\n/**\n * Find the closest CSS color name to the given RGB values\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns Closest CSS color name\n */\nexport async function findClosestColorName(r: number, g: number, b: number): Promise<string> {\n const cssColors = css_color_names;\n\n let closestColor = cssColors[0];\n let minDistance = Infinity;\n\n for await (const colorName of cssColors) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n\n const ctx = canvas.getContext('2d');\n\n if (!ctx) continue;\n\n ctx.fillStyle = colorName;\n ctx.fillRect(0, 0, 1, 1);\n\n const [cr, cg, cb] = ctx.getImageData(0, 0, 1, 1).data;\n\n const distance = Math.sqrt(Math.pow(r - cr, 2) + Math.pow(g - cg, 2) + Math.pow(b - cb, 2));\n\n if (distance < minDistance) {\n minDistance = distance;\n closestColor = colorName;\n }\n\n if (distance === 0) break;\n }\n\n return closestColor;\n}\n","import { Data } from '../../data/index.js';\nimport { findClosestColorName, parseToRGBA, rgbaToHex, rgbToHsl } from '../../utils/color.js';\n\nexport class ColorHelper {\n /**\n * Generate opacity hex value\n * @param opacity - Opacity value from 0 to 100\n * @param color - Hex color code\n * @returns - Hex color code with opacity\n */\n opacity(opacity: number = 100, color: string = '') {\n color = color.length > 7 ? color?.substring(0, 6) : color;\n opacity = opacity > 1 ? opacity / 100 : opacity;\n\n let result = Math.round(Math.min(Math.max(opacity, 0), 1) * 255)\n .toString(16)\n .toLowerCase()\n .padStart(2, '0');\n\n return color + result;\n }\n\n /**\n * Extract color and opacity from hex code\n * @param hex - Hex color code\n * @returns - Object with color and opacity\n */\n extract(hex: string) {\n if (!hex.startsWith('#') || hex.length <= 7) {\n return {\n color: hex,\n opacity: 100,\n };\n }\n\n var color = hex.slice(-2);\n var decimal = parseInt(color, 16) / 255;\n var percentage = Math.round(decimal * 100);\n var color = hex.length > 7 ? hex.slice(0, 7) : hex;\n\n return {\n color: color,\n opacity: percentage,\n };\n }\n\n /**\n * Validate color string format\n * @param str - Color string to validate\n * @returns Detected color format or false if invalid\n * @example\n * ```javascript\n * const format1 = color.validate(\"#FF5733\"); // \"hex\"\n * const format2 = color.validate(\"rgb(255, 87, 51)\"); // \"rgb\"\n * const format3 = color.validate(\"hsl(14, 100%, 60%)\"); // \"hsl\"\n * const format4 = color.validate(\"orangered\"); // \"css-color-name\"\n * const format5 = color.validate(\"invalid-color\"); // false\n * ```\n */\n validate(str: string) {\n if (typeof str !== 'string' || !String(str).trim().length) return false;\n\n const s = str.trim();\n\n // HEX (#FFF, #FFFFFF, #FFFFFFFF)\n if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(s) || /^#([A-Fa-f0-9]{4}|[A-Fa-f0-9]{8})$/.test(s)) {\n return 'hex';\n }\n\n // rgb(255, 255, 255)\n if (/^rgb\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*\\)$/.test(s)) {\n return 'rgb';\n }\n\n // rgba(255, 255, 255, 0.5)\n if (/^rgba\\(\\s*(?:\\d{1,3}\\s*,\\s*){3}(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'rgba';\n }\n\n // hsl(360, 100%, 100%)\n if (/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/.test(s)) {\n return 'hsl';\n }\n\n // hsla(360, 100%, 100%, 0.5)\n if (/^hsla\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*,\\s*(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'hsla';\n }\n\n if (Data.css_color_names.includes(s.toLowerCase())) {\n return 'css-color-name';\n }\n\n return false;\n }\n\n /**\n * Convert color to different format\n * @param str - Color string to convert (e.g. \"#FF5733\", \"rgb(255, 87, 51)\")\n * @param format - Target format\n * @returns - Converted color string\n * @example\n * ```javascript\n * const hexColor = color.convert(\"rgb(255, 87, 51)\", \"hex\"); // \"#FF5733\"\n * const rgbColor = color.convert(\"#FF5733\", \"rgb\"); // \"rgb(255, 87, 51)\"\n * const hslColor = color.convert(\"#FF5733\", \"hsl\"); // \"hsl(14, 100%, 60%)\"\n * const colorName = color.convert(\"#FF5733\", \"css-color-name\"); // \"orangered\"\n * ```\n */\n async convert(\n str: string,\n format: 'hex' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name',\n ): Promise<string | null> {\n const valid = this.validate(str);\n\n if (!valid) throw new Error(`Invalid color format: ${str}`);\n\n if (valid === format) throw new Error(`Color is already in the desired format: ${format}`);\n\n const rgba = parseToRGBA(str.trim(), valid);\n\n if (!rgba) throw new Error(`Failed to parse color: ${str}`);\n\n switch (format) {\n case 'hex': {\n return rgbaToHex(rgba, false);\n }\n case 'rgb': {\n return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n }\n case 'rgba': {\n return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n }\n case 'hsl': {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n case 'hsla': {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${rgba.a})`;\n }\n case 'css-color-name': {\n return await findClosestColorName(rgba.r, rgba.g, rgba.b);\n }\n default: {\n return null;\n }\n }\n }\n}\n","import { ColorHelper } from './color.js';\nimport { ElementHelper } from './element.js';\nimport { ObjectHelper } from './object.js';\n\nexport type Modifier = (\n value: string,\n param: string | null | undefined,\n values: { amount?: number; count?: number },\n) => string;\n\nexport class StringHelper {\n /**\n * Replaces occurrences in a string based on a pattern with the result of an asynchronous callback function.\n * @param string - The input string to perform replacements on.\n * @param pattern - The pattern to match in the string (can be a string or a regular expression).\n * @param callback - An asynchronous callback function that takes the matched substring and any captured groups as arguments and returns the replacement string.\n * @returns A promise that resolves to the modified string with replacements applied.\n * @example\n * ```javascript\n * const result = await string.replace(\"Hello World\", /World/, async (match) => {\n * return await fetchSomeData(match); // Assume this function fetches data asynchronously\n * });\n * console.log(result); // Output will depend on the fetched data\n * ```\n */\n async replace(\n string: string,\n pattern: string,\n callback: (match: string, ...groups: string[]) => Promise<string> | string,\n ): Promise<string> {\n const promises: Array<Promise<string>> = [];\n\n string.replace(pattern, (match: string, ...groups: string[]) => {\n const promise = typeof callback === 'function' ? callback(match, ...groups) : match;\n\n promises.push(Promise.resolve(promise));\n\n return match;\n });\n\n const replacements = await Promise.all(promises);\n\n return string.replace(pattern, () => replacements.shift() ?? '');\n }\n\n /**\n * Capitalizes the first letter of a given string.\n * @param string - The input string to be capitalized.\n * @returns The capitalized string.\n * @example\n * ```javascript\n * const result = string.capitalize(\"hello world\");\n * console.log(result); // Output: \"Hello world\"\n * ```\n */\n capitalize(string: string): Capitalize<string> {\n return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize<string>;\n }\n\n PRESETS: Record<string, string> = {};\n\n /**\n * Composes a template string by replacing placeholders with corresponding values and applying optional modifiers.\n * @param template - The template string containing placeholders in the format {key} and optional modifiers in the format [MODIFIER:param=value].\n * @param values - An object containing key-value pairs to replace the placeholders in the template.\n * @param options - Optional settings for the composition process.\n * @returns The composed string with placeholders replaced and modifiers applied.\n * @example\n * ```javascript\n * const { string } = Tixyel.Helper;\n *\n * // Basic usage with placeholders and simple modifiers\n * const template1 = \"Hello, {username}! You have {amount} [UPC=messages] and your name is [CAP=name].\";\n * const values1 = { username: \"john_doe\", amount: 5, name: \"john\" };\n * const result1 = string.compose(template1, values1);\n * // \"Hello, john_doe! You have 5 MESSAGES and your name is John.\"\n *\n * // Multiple modifiers in a single block (HTML enabled)\n * const template2 = \"[COLOR:#ff0056,BOLD={username}]\";\n * const values2 = { username: \"john_doe\" };\n * const result2 = string.compose(template2, values2, { html: true });\n * // '<span class=\"color bold\" style=\"color: #ff0056; font-weight: bold;\">john_doe</span>'\n *\n * // Conditional rendering with IF (supports ===, >=, &&, ||, !, etc.)\n * const template3 = \"[IF=vip && status === 'live'?VIP Online|Offline]\";\n * const values3 = { status: 'live', vip: true };\n * const result3 = string.compose(template3, values3);\n * // \"VIP Online\"\n *\n * // Pluralization using amount / count or an explicit key\n * const template4 = \"You have {amount} [PLURAL=message|messages].\";\n * const values4 = { amount: 1 };\n * const values5 = { amount: 3 };\n * const result4a = string.compose(template4, values4); // \"You have 1 message.\"\n * const result4b = string.compose(template4, values5); // \"You have 3 messages.\"\n *\n * // Number formatting\n * const template5 = \"Total: [NUMBER:2=amount] {currency}\";\n * const values6 = { amount: 1234.5, currency: '$' };\n * const result5 = string.compose(template5, values6);\n * // e.g. \"Total: 1,234.50 $\" (locale dependent)\n *\n * // Date and time formatting\n * const template6 = \"Created at: [DATE:iso=createdAt] ([DATE:relative=createdAt])\";\n * const values7 = { createdAt: new Date('2020-01-02T03:04:05.000Z') };\n * const result6 = string.compose(template6, values7);\n * // e.g. \"Created at: 2020-01-02T03:04:05.000Z (Xs ago)\"\n *\n * // MAP / SWITCH style mapping\n * const template7 = \"Status: [MAP:status=live:Online|offline:Offline|default:Unknown]\";\n * const values8 = { status: 'offline' };\n * const result7 = string.compose(template7, values8);\n * // \"Status: Offline\"\n *\n * // Escaping HTML\n * const template8 = \"[ESCAPE={message}]\";\n * const values9 = { message: '<b>Danger & \"HTML\"</b>' };\n * const result8 = string.compose(template8, values9);\n * // \"&lt;b&gt;Danger &amp; &quot;HTML&quot;&lt;/b&gt;\"\n *\n * // Using global presets\n * Helper.string.PRESETS['alert'] = 'BOLD,COLOR:#ff0056';\n * const template10 = \"[PRESET:alert={username}]\";\n * const values11 = { username: 'john_doe' };\n * const result10 = string.compose(template10, values11, { html: true });\n * // '<span class=\"color bold\" style=\"color: #ff0056; font-weight: bold;\">john_doe</span>'\n * ```\n */\n compose(\n template: string,\n values: Record<string, any> = {},\n options: {\n method?: 'loop' | 'index';\n html?: boolean;\n debug?: boolean;\n modifiers?: Record<string, Modifier>;\n aliases?: Record<string, string[]>;\n } = {\n method: 'index',\n html: false,\n debug: false,\n modifiers: {},\n aliases: {},\n },\n ): string {\n const { mergeSpanStyles } = new ElementHelper();\n\n const span = (style: string, value: string, className?: string) => {\n if (options.html) {\n return mergeSpanStyles(style, value, className);\n } else {\n return value;\n }\n };\n\n const baseValues = {\n skip: '<br/>',\n newline: '<br/>',\n ...values,\n };\n\n let defaultCurrency = '$';\n let defaultCurrencyCode = 'USD';\n\n if (typeof window !== 'undefined') {\n try {\n const client: any = (window as any)?.client;\n const currency = client?.details?.currency;\n\n if (currency?.symbol) defaultCurrency = String(currency.symbol);\n if (currency?.code) defaultCurrencyCode = String(currency.code);\n } catch {\n // ignore – fall back to defaults\n }\n }\n\n const object = new ObjectHelper();\n\n const flatten: Record<string, string> = Object.entries(object.flatten(baseValues)).reduce(\n (acc, [k, v]) => {\n acc[k] = String(v);\n\n if (['username', 'name', 'nick', 'nickname', 'sender'].some((e) => k === e)) {\n const username = acc?.username || acc?.name || acc?.nick || acc?.nickname || acc?.sender;\n\n acc['username'] = acc.username || username;\n acc['usernameAt'] = `@${acc.username}`;\n acc['name'] = acc.name || username;\n acc['nick'] = acc.nick || username;\n acc['nickname'] = acc.nickname || username;\n acc['sender'] = acc.sender || username;\n acc['senderAt'] = `@${acc.sender}`;\n }\n\n if (['amount', 'count'].some((e) => k === e)) {\n acc['amount'] = String(acc?.amount || acc.count || v);\n acc['count'] = String(acc?.count || acc?.amount || v);\n }\n\n acc['currency'] = acc.currency || defaultCurrency;\n acc['currencyCode'] = acc.currencyCode || defaultCurrencyCode;\n\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const REGEX = {\n PLACEHOLDERS: /{([^}]+)}/g,\n MODIFIERS: /\\[([^\\]=]+)=([^\\]]+)\\]/g,\n };\n\n var amount = parseFloat(flatten?.amount ?? flatten?.count ?? 0);\n\n function getNumericFromKeyOrValue(\n keyOrValue: string,\n valuesMap: Record<string, string>,\n ): number | null {\n const trimmed = keyOrValue?.trim?.() ?? '';\n if (!trimmed.length) return null;\n\n const fromValues = (valuesMap as any)[trimmed];\n const candidate = fromValues !== undefined ? fromValues : trimmed;\n const num = parseFloat(String(candidate).replace(/\\s/g, ''));\n\n return isNaN(num) ? null : num;\n }\n\n function formatNumber(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const decimals = !isNaN(Number(param)) ? Math.max(0, parseInt(String(param))) : 0;\n\n const num = getNumericFromKeyOrValue(value, valuesMap);\n if (num === null) return value;\n\n try {\n return num.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n } catch {\n return num.toFixed(decimals);\n }\n }\n\n function formatRelativeTime(date: Date, now: Date = new Date()): string {\n const diffMs = now.getTime() - date.getTime();\n const past = diffMs >= 0;\n const abs = Math.abs(diffMs);\n\n const sec = Math.floor(abs / 1000);\n const min = Math.floor(sec / 60);\n const hour = Math.floor(min / 60);\n const day = Math.floor(hour / 24);\n const month = Math.floor(day / 30);\n const year = Math.floor(day / 365);\n\n const suffix = past ? 'ago' : 'from now';\n\n if (year > 0) return `${year}y ${suffix}`;\n if (month > 0) return `${month}mo ${suffix}`;\n if (day > 0) return `${day}d ${suffix}`;\n if (hour > 0) return `${hour}h ${suffix}`;\n if (min > 0) return `${min}m ${suffix}`;\n return `${Math.max(sec, 0)}s ${suffix}`;\n }\n\n function formatDateLike(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const keyOrLiteral = value?.trim?.() ?? '';\n if (!keyOrLiteral.length) return value;\n\n const raw = (valuesMap as any)[keyOrLiteral] ?? keyOrLiteral;\n const date = new Date(raw);\n\n if (isNaN(date.getTime())) return value;\n\n const mode = (param ?? 'date').toString().toLowerCase();\n\n try {\n switch (mode) {\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n case 'full':\n return date.toLocaleString();\n case 'relative':\n case 'ago':\n return formatRelativeTime(date);\n case 'iso':\n return date.toISOString();\n case 'date':\n default:\n return date.toLocaleDateString();\n }\n } catch {\n return value;\n }\n }\n\n function pluralize(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const text = value ?? '';\n const [singular, plural = singular] = text.split('|', 2);\n\n const key = param?.trim();\n let source: any = undefined;\n\n if (key && (valuesMap as any)[key] !== undefined) {\n source = (valuesMap as any)[key];\n } else {\n source = (valuesMap as any).amount ?? (valuesMap as any).count;\n }\n\n const num = parseFloat(String(source));\n if (isNaN(num)) return singular;\n\n const isPlural = Math.abs(num) !== 1;\n return isPlural ? plural : singular;\n }\n\n function mapSwitch(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const key = param?.trim() ?? '';\n const targetRaw = key && (valuesMap as any)[key] !== undefined ? (valuesMap as any)[key] : '';\n const target = String(targetRaw);\n\n const entries = (value ?? '')\n .split('|')\n .map((p) => p.trim())\n .filter((p) => p.length);\n let defaultResult: string | undefined;\n\n for (const entry of entries) {\n const idx = entry.indexOf(':');\n if (idx === -1) continue;\n\n const mapKey = entry.slice(0, idx).trim();\n const mapValue = entry.slice(idx + 1);\n\n if (!mapKey.length) continue;\n\n if (mapKey.toLowerCase() === 'default') {\n defaultResult = mapValue;\n continue;\n }\n\n if (target === mapKey) return mapValue;\n }\n\n return defaultResult ?? '';\n }\n\n function escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n }\n\n function parseLiteralOrValue(token: string, valuesMap: Record<string, string>): any {\n let trimmed = token.trim();\n\n if (!trimmed.length) return undefined;\n\n const firstChar = trimmed[0];\n const lastChar = trimmed[trimmed.length - 1];\n\n if ((firstChar === '\"' && lastChar === '\"') || (firstChar === \"'\" && lastChar === \"'\")) {\n return trimmed.slice(1, -1);\n }\n\n const lowered = trimmed.toLowerCase();\n if (lowered === 'true') return true;\n if (lowered === 'false') return false;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) return parseFloat(trimmed);\n\n const fromValues = valuesMap?.[trimmed];\n if (fromValues === undefined) return trimmed;\n\n const fromValuesStr = String(fromValues).trim();\n const fromValuesLower = fromValuesStr.toLowerCase();\n\n if (fromValuesLower === 'true') return true;\n if (fromValuesLower === 'false') return false;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(fromValuesStr)) return parseFloat(fromValuesStr);\n\n return fromValues;\n }\n\n function coerceToBoolean(value: any): boolean {\n if (typeof value === 'boolean') return value;\n if (value === null || value === undefined) return false;\n\n const str = String(value).trim().toLowerCase();\n if (!str.length) return false;\n\n if (['false', '0', 'no', 'off', 'null', 'undefined', 'nan'].includes(str)) return false;\n\n return true;\n }\n\n function evaluateAtomicCondition(\n expression: string,\n valuesMap: Record<string, string>,\n ): boolean {\n let expr = expression.trim();\n if (!expr.length) return false;\n\n let invert = false;\n while (expr.startsWith('!')) {\n invert = !invert;\n expr = expr.slice(1).trim();\n }\n\n const operators = ['===', '!==', '==', '!=', '>=', '<=', '>', '<'];\n let op: string | null = null;\n let left = expr;\n let right = '';\n\n for (const candidate of operators) {\n const idx = expr.indexOf(candidate);\n if (idx !== -1) {\n op = candidate;\n left = expr.slice(0, idx);\n right = expr.slice(idx + candidate.length);\n break;\n }\n }\n\n let result: boolean;\n\n if (!op) {\n const value = parseLiteralOrValue(left, valuesMap);\n result = coerceToBoolean(value);\n } else {\n const leftVal = parseLiteralOrValue(left, valuesMap);\n const rightVal = parseLiteralOrValue(right, valuesMap);\n\n switch (op) {\n case '===':\n result = leftVal === rightVal;\n break;\n case '!==':\n result = leftVal !== rightVal;\n break;\n case '==':\n // eslint-disable-next-line eqeqeq\n result = (leftVal as any) == (rightVal as any);\n break;\n case '!=':\n // eslint-disable-next-line eqeqeq\n result = (leftVal as any) != (rightVal as any);\n break;\n case '>=':\n result = (leftVal as any) >= (rightVal as any);\n break;\n case '<=':\n result = (leftVal as any) <= (rightVal as any);\n break;\n case '>':\n result = (leftVal as any) > (rightVal as any);\n break;\n case '<':\n result = (leftVal as any) < (rightVal as any);\n break;\n default:\n result = false;\n break;\n }\n }\n\n return invert ? !result : result;\n }\n\n function evaluateConditionExpression(\n expression: string,\n valuesMap: Record<string, string>,\n ): boolean {\n let expr = expression.trim();\n if (!expr.length) return false;\n\n let invert = false;\n while (expr.startsWith('!')) {\n invert = !invert;\n expr = expr.slice(1).trim();\n }\n\n const orParts = expr\n .split('||')\n .map((p) => p.trim())\n .filter((p) => p.length);\n if (!orParts.length) return invert ? true : false;\n\n let result = false;\n\n for (const orPart of orParts) {\n const andParts = orPart\n .split('&&')\n .map((p) => p.trim())\n .filter((p) => p.length);\n if (!andParts.length) continue;\n\n let andResult = true;\n for (const andPart of andParts) {\n const partResult = evaluateAtomicCondition(andPart, valuesMap);\n andResult = andResult && partResult;\n if (!andResult) break;\n }\n\n result = result || andResult;\n if (result) break;\n }\n\n return invert ? !result : result;\n }\n\n const color = new ColorHelper();\n\n const HTML_MODIFIERS: Record<string, Modifier> = {\n COLOR: (value, param) =>\n span(param && !!color.validate(param) ? `color: ${param}` : '', value, 'color'),\n WEIGHT: (value, param) =>\n span(param && !isNaN(parseInt(param)) ? `font-weight: ${param}` : '', value, 'weight'),\n SEMIBOLD: (value) => span('font-weight: 600', value, 'semibold'),\n BOLD: (value) => span('font-weight: bold', value, 'bold'),\n BLACK: (value) => span('font-weight: 900', value, 'black'),\n LIGHT: (value) => span('font-weight: lighter', value, 'light'),\n STRONG: (value) => span('font-weight: bolder', value, 'strong'),\n ITALIC: (value) => span('font-style: italic', value, 'italic'),\n UNDERLINE: (value) => span('text-decoration: underline', value, 'underline'),\n STRIKETHROUGH: (value) => span('text-decoration: line-through', value, 'strikethrough'),\n SUB: (value) => span('vertical-align: sub', value, 'sub'),\n SUP: (value) => span('vertical-align: super', value, 'sup'),\n LARGER: (value) => span('font-size: larger', value, 'larger'),\n SMALL: (value) => span('font-size: smaller', value, 'small'),\n SHADOW: (value, param) => span(`text-shadow: ${param}`, value, 'shadow'),\n SIZE: (value, param) => span(param ? `font-size: ${param}` : '', value, 'size'),\n };\n\n const STRING_MODIFIERS: Record<string, Modifier> = {\n BT1: (value) => (amount > 1 ? value : ''),\n BT0: (value) => (amount > 0 ? value : ''),\n ST1: (value) => (amount < 1 ? value : ''),\n ST0: (value) => (amount < 0 ? value : ''),\n UPC: (value) => value.toUpperCase(),\n LOW: (value) => value.toLowerCase(),\n REV: (value) => value.split('').reverse().join(''),\n CAP: (value) => value.charAt(0).toUpperCase() + value.slice(1).toLowerCase(),\n NUMBER: (value, param, valuesMap) =>\n formatNumber(value, param, valuesMap as Record<string, string>),\n PLURAL: (value, param, valuesMap) =>\n pluralize(value, param, valuesMap as Record<string, string>),\n DATE: (value, param, valuesMap) =>\n formatDateLike(value, param, valuesMap as Record<string, string>),\n MAP: (value, param, valuesMap) =>\n mapSwitch(value, param, valuesMap as Record<string, string>),\n ESCAPE: (value) => escapeHtml(value),\n IF: (value, _param, valuesMap) => {\n const text = value ?? '';\n\n const [rawCondition, rest] = text.split('?', 2);\n if (!rest) return text;\n\n const [whenTrue, whenFalse = ''] = rest.split('|', 2);\n\n const condition = evaluateConditionExpression(\n rawCondition,\n valuesMap as Record<string, string>,\n );\n\n return condition ? whenTrue : whenFalse;\n },\n PRESET: (value, param) => {\n const name = param?.trim() ?? '';\n if (!name.length) return value;\n\n const group = this.PRESETS[name];\n if (!group || !group.length) return value;\n\n const modifiers = group\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length)\n .map((part) => {\n const [mName, mParam] = part.split(':');\n return { name: mName.trim(), param: mParam?.trim() ?? null };\n });\n\n let result = value;\n for (const { name: mName, param: mParam } of modifiers) {\n result = applyModifier(result, mName, mParam);\n }\n\n return result;\n },\n FALLBACK: (value, param) => (value.length ? value : (param ?? value)),\n };\n\n const MODIFIERS: Record<string, Modifier> = {\n ...STRING_MODIFIERS,\n ...(options?.html ? HTML_MODIFIERS : {}),\n ...(options.modifiers ?? {}),\n };\n\n const ALIASES = {\n UPC: ['UPPERCASE', 'UPPER', 'UPP'],\n LOW: ['LOWERCASE', 'LOWER', 'LWC'],\n REV: ['REVERSE', 'RVS'],\n CAP: ['CAPITALIZE', 'CAPITAL'],\n NUMBER: ['NUMBER', 'NUM', 'FORMAT_NUMBER', 'FMT_NUM'],\n PLURAL: ['PLURAL', 'PL', 'PLR'],\n DATE: ['DATE', 'DATETIME', 'TIME', 'DT'],\n MAP: ['MAP', 'SWITCH'],\n ESCAPE: ['ESCAPE', 'ESC', 'ESC_HTML', 'ESCAPE_HTML'],\n PRESET: ['PRESET', 'STYLE', 'THEME'],\n BT1: ['BIGGER_THAN_1', 'GREATER_THAN_1', 'GT1'],\n BT0: ['BIGGER_THAN_0', 'GREATER_THAN_0', 'GT0'],\n ST1: ['SMALLER_THAN_1', 'LESS_THAN_1', 'LT1'],\n ST0: ['SMALLER_THAN_0', 'LESS_THAN_0', 'LT0'],\n COLOR: ['COLOUR', 'CLR', 'HIGHLIGHT'],\n BOLD: ['BOLDEN', 'B'],\n STRONG: ['STRONGEN', 'STRONG'],\n ITALIC: ['ITALICIZE', 'ITALIC', 'I'],\n UNDERLINE: ['U', 'INS', 'INSET', 'I'],\n STRIKETHROUGH: ['STRIKE', 'S', 'DELETE', 'D'],\n SUB: ['SUBSCRIPT', 'SUBS'],\n SUP: ['SUPERSCRIPT', 'SUPS'],\n LARGER: ['LARGER', 'LG'],\n SMALL: ['SMALLER', 'SM'],\n SHADOW: ['SHADOW', 'SHD'],\n FALLBACK: ['FALLBACK', 'FB'],\n IF: ['IF', 'COND', 'CONDITION'],\n ...(options.aliases ?? {}),\n };\n\n function applyModifier(value: string, name: string, param: string | null | undefined): string {\n const canonical = Object.entries(ALIASES).find(([key, aliases]) => {\n if (aliases.some((alias) => alias.toUpperCase() === name.toUpperCase())) return true;\n else if (key.toUpperCase() === name.toUpperCase()) return true;\n else return false;\n });\n const use = canonical ? canonical[0] : name.toUpperCase();\n\n try {\n if (MODIFIERS[use])\n return MODIFIERS[use](value, typeof param === 'string' ? param.trim() : null, flatten);\n else if (options?.html) return span('', value, use.toLowerCase());\n else return value;\n } catch (error) {\n if (\n options?.debug &&\n typeof console !== 'undefined' &&\n typeof console.error === 'function'\n ) {\n console.error('[Helper.string.compose] Modifier error', { name, param, error });\n }\n return value;\n }\n }\n\n function replaceAll(string: string): string {\n let str = string;\n let match;\n\n while ((match = REGEX.MODIFIERS.exec(str)) !== null) {\n const [fullMatch, modifierGroup, value] = match;\n\n const modifiers = modifierGroup\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length)\n .map((part) => {\n const [name, param] = part.split(':');\n return { name: name.trim(), param: param?.trim() ?? null };\n });\n\n let newValue = replaceAll(value);\n\n for (const { name, param } of modifiers) {\n newValue = applyModifier(newValue, name, param);\n }\n\n str = str.replace(fullMatch, newValue ?? '');\n\n REGEX.MODIFIERS.lastIndex = 0;\n }\n\n return str;\n }\n\n function parseModifiers(str: string): string {\n let i = 0;\n const len = str.length;\n\n function parseText(stopChar?: string): string {\n let out = '';\n while (i < len) {\n if (str[i] === '\\\\') {\n if (i + 1 < len) {\n out += str[i + 1];\n i += 2;\n } else {\n i++;\n }\n } else if (str[i] === '[' && (!stopChar || stopChar !== '[')) {\n out += parseModifier();\n } else if (stopChar && str[i] === stopChar) {\n i++;\n break;\n } else {\n out += str[i++];\n }\n }\n return out;\n }\n\n function parseModifier(): string {\n i++;\n const modifiers: { name: string; param: string | null }[] = [];\n\n while (i < len && str[i] !== '=') {\n if (str[i] === ',') {\n i++;\n continue;\n }\n\n let name = '';\n while (i < len && /[A-Za-z0-9]/.test(str[i])) name += str[i++];\n\n let param: string | null = null;\n if (str[i] === ':') {\n i++;\n const paramStart = i;\n while (i < len && str[i] !== ',' && str[i] !== '=') i++;\n param = str.slice(paramStart, i);\n }\n\n if (name.length) {\n modifiers.push({ name, param });\n }\n\n if (str[i] === ',') {\n i++;\n }\n }\n\n if (str[i] === '=') i++;\n\n const value = parseText(']');\n\n return modifiers.reduce((val, { name, param }) => applyModifier(val, name, param), value);\n }\n\n return parseText();\n }\n\n let result = template.replace(REGEX.PLACEHOLDERS, (_, key: string) =>\n typeof flatten[key] === 'string' || typeof flatten[key] === 'number'\n ? String(flatten[key])\n : (key ?? key),\n );\n\n result = options.method === 'loop' ? replaceAll(result) : parseModifiers(result);\n\n return result;\n }\n}\n","export class SoundHelper {\n playing: boolean = false;\n audio!: AudioContext;\n\n /**\n * Play sound from URL with optional volume and replace parameters\n * @param url - Sound URL to play\n * @param volume - Volume level from 0 to 100 (default: 100)\n * @param replace - If true, replaces currently playing sound (default: false)\n */\n play(url: string, volume: number = 100, replace = false) {\n if (!url || !url.length) {\n throw new Error('No sound URL provided');\n }\n\n try {\n if (replace && this.playing && this.audio && this.audio.state !== 'closed')\n this.audio.close();\n\n let ctx = new AudioContext();\n let gainNode = ctx.createGain();\n gainNode.connect(ctx.destination);\n\n if (replace) {\n this.audio = ctx;\n this.playing = true;\n }\n\n fetch(url)\n .then((data) => data.arrayBuffer())\n .then((arrayBuffer) => ctx.decodeAudioData(arrayBuffer))\n .then((decodedAudio) => {\n if (ctx.state !== 'closed') {\n const playSound = ctx.createBufferSource();\n playSound.buffer = decodedAudio;\n playSound.connect(gainNode);\n gainNode.gain.value = volume / 100;\n playSound.start(ctx.currentTime);\n }\n });\n } catch (error) {\n throw new Error(`Error playing sound: ${error}`);\n }\n }\n}\n","export class FunctionHelper {\n /**\n * Apply function with given thisArg and arguments\n * @param fn - Function to apply\n * @param thisArg - Value to use as this when calling fn\n * @param args - Arguments to pass to fn\n * @returns Result of calling fn with thisArg and args\n */\n apply<TThis, TArgs extends unknown[], TReturn>(\n fn: (this: TThis, ...args: TArgs) => TReturn,\n thisArg: TThis,\n args: TArgs,\n ): TReturn {\n return fn.apply(thisArg, args);\n }\n\n /**\n * Call function with given thisArg and arguments\n * @param fn - Function to call\n * @param thisArg - Value to use as this when calling fn\n * @param args - Arguments to pass to fn\n * @returns Result of calling fn with thisArg and args\n */\n call<TThis, TArgs extends unknown[], TReturn>(\n fn: (this: TThis, ...args: TArgs) => TReturn,\n thisArg: TThis,\n ...args: TArgs\n ): TReturn {\n return fn.call(thisArg, ...args);\n }\n}\n","import type { Client } from './client/client.js';\nimport type { FakeUserPool } from './modules/fakeUser.js';\nimport type { useComms } from './modules/useComms.js';\nimport type { Button, Command, useStorage } from './types.js';\n\nexport const usedClients: Client[] = [];\nexport const usedStorages: Array<useStorage<any>> = [];\nexport const usedComms: Array<useComms<any>> = [];\nexport const usedCommands: Command[] = [];\nexport const usedButtons: Button[] = [];\nexport const fakeUserPools: FakeUserPool[] = [];\n","import { fakeUserPools } from '../../internal.js';\nimport { Emote, RequireAtLeastOne, StreamElements, Twitch } from '../../types.js';\nimport { EventHelper } from './event.js';\nimport { MessageHelper } from './message.js';\n\nexport class UtilsHelper {\n /**\n * Delays execution for a specified number of milliseconds.\n * @param ms - The number of milliseconds to delay.\n * @returns A Promise that resolves after the specified delay.\n */\n delay<R extends any, M extends number>(ms: M, callback?: () => R): Promise<R | null> {\n return new Promise((resolve) =>\n setTimeout(() => {\n if (callback) {\n const result = callback();\n resolve(result ?? null);\n } else resolve(null);\n }, ms),\n );\n }\n\n /**\n * Returns typed entries of an object.\n * @param obj - The object to get entries from.\n * @returns An array of key-value pairs from the object.\n */\n typedEntries<K extends string, V>(obj: Record<K, V> | Array<V>): [K, V][] {\n return Object.entries(obj) as [K, V][];\n }\n\n /**\n * Returns typed values of an object.\n * @param obj - The object to get values from.\n * @returns An array of values from the object.\n */\n typedValues<K extends string, V>(obj: Record<K, V> | Array<V>): V[] {\n return Object.values(obj) as V[];\n }\n\n /**\n * Returns typed keys of an object.\n * @param obj - The object to get keys from.\n * @returns An array of keys from the object.\n */\n typedKeys<K extends string, V>(obj: Record<K, V> | Array<V>): K[] {\n return Object.keys(obj) as K[];\n }\n\n /**\n * Compares two dates and returns the difference in multiple time units.\n *\n * `total` values are based on raw milliseconds (can be decimal).\n * `calendar` values use calendar boundaries for full months/years.\n */\n compareDates(date1: Date | string, date2: Date | string) {\n const d1 = date1 instanceof Date ? new Date(date1.getTime()) : new Date(date1);\n const d2 = date2 instanceof Date ? new Date(date2.getTime()) : new Date(date2);\n\n if (Number.isNaN(d1.getTime()) || Number.isNaN(d2.getTime())) {\n throw new Error('Invalid date provided to compareDates');\n }\n\n const milliseconds = d2.getTime() - d1.getTime();\n const absMilliseconds = Math.abs(milliseconds);\n\n const totalSeconds = milliseconds / 1000;\n const totalMinutes = milliseconds / (1000 * 60);\n const totalHours = milliseconds / (1000 * 60 * 60);\n const totalDays = milliseconds / (1000 * 60 * 60 * 24);\n const totalMonths = totalDays / 30.436875;\n const totalYears = totalDays / 365.2425;\n\n const from = d1 <= d2 ? d1 : d2;\n const to = d1 <= d2 ? d2 : d1;\n let calendarMonths =\n (to.getFullYear() - from.getFullYear()) * 12 + (to.getMonth() - from.getMonth());\n\n const anchor = new Date(from);\n anchor.setMonth(anchor.getMonth() + calendarMonths);\n\n if (anchor > to) {\n calendarMonths -= 1;\n }\n\n const sign = milliseconds < 0 ? -1 : 1;\n const signedCalendarMonths = calendarMonths * sign;\n const signedCalendarYears = (calendarMonths / 12) * sign;\n\n return {\n milliseconds,\n seconds: totalSeconds,\n minutes: totalMinutes,\n hours: totalHours,\n days: totalDays,\n months: totalMonths,\n years: totalYears,\n absolute: {\n milliseconds: absMilliseconds,\n seconds: absMilliseconds / 1000,\n minutes: absMilliseconds / (1000 * 60),\n hours: absMilliseconds / (1000 * 60 * 60),\n days: absMilliseconds / (1000 * 60 * 60 * 24),\n months: absMilliseconds / (1000 * 60 * 60 * 24 * 30.436875),\n years: absMilliseconds / (1000 * 60 * 60 * 24 * 365.2425),\n },\n calendar: {\n months: signedCalendarMonths,\n years: signedCalendarYears,\n },\n isFuture: milliseconds > 0,\n isPast: milliseconds < 0,\n isSameMoment: milliseconds === 0,\n };\n }\n\n /**\n * Selects an item based on weighted probabilities.\n * @param items - An object where keys are items and values are their weights.\n * @returns A randomly selected item based on the given probabilities.\n * @example\n * ```ts\n * const utils = new UtilsHelper();\n * const result = utils.probability({\n * apple: 0.5,\n * banana: 0.3,\n * cherry: 0.2,\n * });\n * console.log(result); // 'apple', 'banana', or 'cherry' based on the defined probabilities\n * ```\n */\n probability<K extends string, V extends number>(items: Record<K, V>): K | undefined {\n const total = (Object.values(items) as number[]).reduce((acc, val) => acc + val, 0);\n const sorted = new UtilsHelper().typedEntries(items).sort((a, b) => b[1] - a[1]);\n const rand = Math.random() * total;\n\n let cumulative = 0;\n\n for (const [item, weight] of sorted) {\n cumulative += weight;\n\n if (rand < cumulative) {\n return item;\n }\n }\n\n return undefined;\n }\n\n /**\n * Finds the subscription tier of a user based on various sources of information.\n * @param data - An object containing userId, name, and broadcasterId to identify the user.\n * @param session - The current session data which may contain recent subscription information.\n * @param checkWithAPI - Whether to check the subscription tier with an external API as a last resort.\n * @returns A promise that resolves to the subscription tier of the user (1, 2, or 3).\n * @example\n * ```javascript\n * const utils = new UtilsHelper();\n * const tier = await utils.findSubscriptionTier(\n * { userId: '12345', name: 'exampleUser', broadcasterId: '67890' },\n * sessionData,\n * true\n * );\n * console.log(tier); // 1, 2, or 3 based on the user's subscription tier\n * ```\n */\n async findSubscriptionTier(\n {\n userId,\n name,\n broadcasterId,\n }: {\n userId: string;\n name: string;\n broadcasterId?: string;\n },\n session: StreamElements.Session.Data,\n checkWithAPI: boolean = false,\n ) {\n const convert = (tier?: string | number) => {\n if (tier === 'prime') return 1;\n else if (tier === '1000' || tier === 1000 || tier === 1 || tier === '1') return 1;\n else if (tier === '2000' || tier === 2000 || tier === 2 || tier === '2') return 2;\n else if (tier === '3000' || tier === 3000 || tier === 3 || tier === '3') return 3;\n else return 1;\n };\n\n // If it's a fake user, get the tier from the fake user pool\n if (userId?.includes('fake_user_')) {\n const pool = fakeUserPools.find((p) => userId.endsWith(`+${p.id}`));\n\n if (pool) {\n const user = pool.getById(userId);\n\n if (user) return convert(user.tier);\n }\n }\n\n // Check the recent subscriptions\n const recentSubscriptions = session['subscriber-recent'];\n\n if (recentSubscriptions) {\n const subscriber = recentSubscriptions.find((sub) => sub.name === name);\n\n if (subscriber) return convert(subscriber.tier);\n }\n\n // Check the latest subscriber\n\n const latestSubscriber = session['subscriber-latest'];\n\n if (latestSubscriber.name === name) {\n return convert(latestSubscriber.tier);\n }\n\n // Check gifts\n\n const latestGift = session['subscriber-gifted-latest'];\n\n if (latestGift.name === name) {\n return convert(latestGift.tier);\n }\n\n // Last try, check with my API\n if (checkWithAPI) {\n if (\n broadcasterId?.length &&\n userId?.length &&\n !broadcasterId.includes('fake_user_') &&\n !userId.includes('fake_user_')\n ) {\n const result = await fetch(\n `https://api.tixyel.com/v1/twitch/channel/subscriber/${broadcasterId}/${userId}`,\n )\n .then(async (res) =>\n res.status == 200\n ? res.json()\n : Promise.reject(\n new Error(\n `Failed to fetch subscription data: ${res.status} ${res.statusText} ${await res.text()}`,\n ),\n ),\n )\n .then(\n (data: {\n broadcaster: { id: string; name: string; displayName: string };\n isGift: boolean;\n tier: string;\n }) => {\n return data?.tier;\n },\n )\n .catch(() => 1);\n\n if (result) return convert(result);\n }\n }\n\n return 1;\n }\n\n /**\n * Identifies a user based on the received event and session data, returning their ID, name, role, badges, and top status.\n * @param receivedEvent - The event received from the provider (Twitch or YouTube) containing user information.\n * @param session - The current session data which may contain recent activity and top user information.\n * @returns A promise that resolves to an object containing the user's ID, name, role, badges, and top status, or undefined if the user cannot be identified.\n * @example\n * ```javascript\n * const utils = new UtilsHelper();\n * const userInfo = await utils.identifyUser(receivedEvent, sessionData);\n * console.log(userInfo);\n * // {\n * // id: '12345',\n * // name: 'exampleUser',\n * // role: 'moderator',\n * // badges: [{ type: 'moderator', version: '1', url: 'https:...', description: 'Moderator' }],\n * // top: {\n * // gifter: false,\n * // tip: {\n * // session: { donator: false, donation: false },\n * // weekly: { donator: false, donation: false },\n * // monthly: { donator: false, donation: false },\n * // alltime: { donator: false, donation: false },\n * // },\n * // ...\n * // }\n * // }\n * ```\n */\n async identifyUser(\n provider: 'twitch',\n receivedEvent: StreamElements.Event.Provider.Twitch.Message,\n session: StreamElements.Session.Data,\n ): Promise<IdentifyTwitchResult>;\n async identifyUser(\n provider: 'youtube',\n receivedEvent: StreamElements.Event.Provider.YouTube.Message,\n session: StreamElements.Session.Data,\n ): Promise<IdentifyYouTubeResult>;\n async identifyUser(\n provider: 'twitch' | 'youtube',\n receivedEvent:\n | StreamElements.Event.Provider.Twitch.Message\n | StreamElements.Event.Provider.YouTube.Message,\n session: StreamElements.Session.Data,\n ): Promise<IdentifyYouTubeResult | IdentifyTwitchResult> {\n const getTops = (name: string): TopType => ({\n gifter: session['subscriber-alltime-gifter'].name === name,\n tip: {\n session: {\n donator: session['tip-session-top-donator'].name === name,\n donation: session['tip-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['tip-weekly-top-donator'].name === name,\n donation: session['tip-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['tip-monthly-top-donator'].name === name,\n donation: session['tip-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['tip-alltime-top-donator'].name === name,\n donation: session['tip-alltime-top-donation'].name === name,\n },\n },\n cheer: {\n session: {\n donator: session['cheer-session-top-donator'].name === name,\n amount: session['cheer-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['cheer-weekly-top-donator'].name === name,\n amount: session['cheer-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['cheer-monthly-top-donator'].name === name,\n amount: session['cheer-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['cheer-alltime-top-donator'].name === name,\n amount: session['cheer-alltime-top-donation'].name === name,\n },\n },\n superchat: {\n session: {\n donator: session['superchat-session-top-donator'].name === name,\n amount: session['superchat-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['superchat-weekly-top-donator'].name === name,\n amount: session['superchat-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['superchat-monthly-top-donator'].name === name,\n amount: session['superchat-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['superchat-alltime-top-donator'].name === name,\n amount: session['superchat-alltime-top-donation'].name === name,\n },\n },\n });\n\n switch (provider) {\n case 'twitch': {\n const twitchEvent = receivedEvent as StreamElements.Event.Provider.Twitch.Message;\n const event = twitchEvent.event;\n const data = event.data;\n\n let tier: false | 1 | 2 | 3 = false;\n if (data.tags['badge-info']?.includes('subscriber')) {\n tier = await this.findSubscriptionTier(\n {\n userId: data.userId,\n name: data.displayName,\n broadcasterId: data.tags['room-id'],\n },\n session ?? ({} as StreamElements.Session.Data),\n false,\n );\n }\n\n return {\n id: data.userId,\n name: data.displayName,\n color: data.displayColor,\n role: data.tags.badges.split(',')[0].split('/')[0] as Twitch.tags,\n tags: data.tags.badges.split(',').map((b: string) => b.split('/')[0] as Twitch.tags),\n badges: data.badges,\n tier: !!tier ? tier : undefined,\n top: getTops(data.displayName),\n } satisfies IdentifyTwitchResult;\n\n break;\n }\n case 'youtube': {\n const youtubeEvent = receivedEvent as StreamElements.Event.Provider.YouTube.Message;\n const event = youtubeEvent.event;\n const data = event.data;\n\n const role = data.authorDetails.isChatOwner\n ? 'broadcaster'\n : data.authorDetails.isChatModerator\n ? 'moderator'\n : data.authorDetails.isChatSponsor\n ? 'sponsor'\n : data.authorDetails.isVerified\n ? 'verified'\n : 'viewer';\n\n return {\n id: data.userId,\n name: data.displayName,\n role: role,\n badges: data.badges,\n top: getTops(data.displayName),\n } satisfies IdentifyYouTubeResult;\n }\n }\n }\n\n identifyMessage(\n provider: 'twitch',\n receivedEvent: StreamElements.Event.Provider.Twitch.Message,\n options?: {\n mapEmote?: (emote: { src: string; alt: string }) => string;\n allowedRoles: RequireAtLeastOne<Twitch.tags>[];\n },\n ) {\n const emoteRegex = /<img[^>]*class=\"emote\"[^>]*>/gi;\n\n switch (provider) {\n case 'twitch': {\n const event = receivedEvent.event;\n\n let text = new MessageHelper().replaceEmotesWithHTML(\n receivedEvent.event.data.text,\n receivedEvent.event.data.emotes,\n );\n\n const onlyEmote = text.replaceAll(emoteRegex, '').trim() === '' ? true : false;\n const emoteLength = (text.match(emoteRegex) || []).length;\n\n text = text.replace(emoteRegex, (match) => {\n const srcMatch = match.match(/src=\"([^\"]*)\"/);\n const altMatch = match.match(/alt=\"([^\"]*)\"/);\n const src = srcMatch ? srcMatch[1] : '';\n const alt = altMatch ? altMatch[1] : '';\n\n if (options?.mapEmote) {\n return options.mapEmote({ src, alt });\n }\n\n return `<img src=\"${src}\" alt=\"${alt}\" class=\"emote\" style=\"display: inline-block; width: auto; height: 1em; vertical-align: middle;\">`;\n });\n\n let reply = receivedEvent.event.data.tags['reply-parent-msg-id']\n ? {\n login: receivedEvent.event.data.tags['reply-parent-user-login']!,\n name: receivedEvent.event.data.tags['reply-parent-display-name']!,\n userId: receivedEvent.event.data.tags['reply-parent-user-id']!,\n msgId: receivedEvent.event.data.tags['reply-parent-msg-id']!,\n text: receivedEvent.event.data.tags['reply-parent-msg-body']!,\n }\n : undefined;\n\n const data = {\n username: receivedEvent.event.data.displayName,\n text: text,\n reply: reply,\n msgId: event.data.msgId,\n userId: event.data.userId,\n emote: {\n only: onlyEmote,\n amount: emoteLength,\n },\n };\n\n return data;\n }\n // case 'youtube': {}\n }\n }\n}\n\ntype TopType = {\n gifter: boolean;\n tip: {\n session: { donator: boolean; donation: boolean };\n weekly: { donator: boolean; donation: boolean };\n monthly: { donator: boolean; donation: boolean };\n alltime: { donator: boolean; donation: boolean };\n };\n cheer: {\n session: { donator: boolean; amount: boolean };\n weekly: { donator: boolean; amount: boolean };\n monthly: { donator: boolean; amount: boolean };\n alltime: { donator: boolean; amount: boolean };\n };\n superchat: {\n session: { donator: boolean; amount: boolean };\n weekly: { donator: boolean; amount: boolean };\n monthly: { donator: boolean; amount: boolean };\n alltime: { donator: boolean; amount: boolean };\n };\n};\n\ntype IdentifyTwitchResult = {\n id: string;\n name: string;\n color: string;\n role: Twitch.tags;\n tags: Twitch.tags[];\n badges: Twitch.badge[];\n tier?: 1 | 2 | 3;\n top: TopType;\n};\n\ntype IdentifyYouTubeResult = {\n id: string;\n name: string;\n role: 'broadcaster' | 'moderator' | 'sponsor' | 'verified' | 'viewer';\n badges: unknown[];\n top: TopType;\n};\n","export type Point = {\n x: number;\n y: number;\n};\n\nexport type AnimOptions = {\n /** Duration in seconds. Default: `1` */\n duration?: number;\n fps?: number;\n easing?: (t: number) => number;\n};\n\nexport type AnimResult = {\n x: number[];\n y: number[];\n};\n\nexport type QuadraticParams = AnimOptions & {\n from: Point;\n to: Point;\n control: Point;\n};\n\nexport type CubicParams = AnimOptions & {\n from: Point & { control: Point };\n to: Point & { control: Point };\n};\n\nexport type ControlledPoint = Point & { control: Point };\n\nexport type MultiCubicPoint = Point & {\n control?: Point;\n controlIn?: Point;\n controlOut?: Point;\n};\n\nexport type MultiCubicParams = AnimOptions & {\n points: [MultiCubicPoint, MultiCubicPoint, MultiCubicPoint, ...MultiCubicPoint[]];\n};\n\nexport type CircleParams = AnimOptions & {\n center: Point;\n radius: number;\n from?: number;\n to?: number;\n};\n\nexport type SpiralParams = AnimOptions & {\n center: Point;\n radius: { from: number; to: number };\n turns?: number;\n};\n\nexport class AnimateHelper {\n /**\n * Interpolate a number from start to end\n * @example\n * ```ts\n * const value = animate.lerp(0, 100, 0.5);\n * console.log(value); // 50\n * // Clamped between 0 and 1\n * const clamped = animate.lerp(0, 100, 1.5);\n * console.log(clamped); // 100\n * const clamped2 = animate.lerp(0, 100, -0.5);\n * console.log(clamped2); // 0\n * const easeIn = animate.lerp(0, 100, (t) => t * t);\n * console.log(easeIn); // 25 at t=0.5\n * const linear = animate.lerp(0, 100, 0.5);\n * console.log(linear); // 50 at t=0.5\n * // Ease-in should be less than linear at t=0.5\n * console.log(easeIn < linear); // true\n * ```\n */\n lerp(start: number, end: number, t: number): number {\n const clamped = Math.max(0, Math.min(1, t));\n return start + (end - start) * clamped;\n }\n\n /**\n * Create a quadratic Bezier path between two positions using a control point.\n * Returns sampled x/y coordinates for the animation timeline.\n * @example\n * ```ts\n * const { x, y } = animate.quadratic({\n * from: { x: 0, y: 0 },\n * to: { x: 100, y: 0 },\n * control: { x: 50, y: 50 },\n * duration: 1,\n * fps: 60,\n * easing: Motion.easeInOut,\n * });\n *\n * // Use with Motion.animate\n * Motion.animate(element, { x, y }, { duration: 1 });\n * ```\n */\n quadratic({\n from,\n to,\n control,\n duration = 1,\n fps = 60,\n easing = (t) => t,\n }: QuadraticParams): AnimResult {\n const steps = Math.max(2, Math.round(duration * fps));\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = easing(i / steps);\n xPoints.push((1 - t) * (1 - t) * from.x + 2 * (1 - t) * t * control.x + t * t * to.x);\n yPoints.push((1 - t) * (1 - t) * from.y + 2 * (1 - t) * t * control.y + t * t * to.y);\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n /**\n * Create a cubic Bezier path between two positions using two control points.\n * Returns sampled x/y coordinates for the animation timeline.\n * @example\n * ```ts\n * const { x, y } = animate.cubic({\n * from: { x: 0, y: 0, control: { x: 50, y: 100 } },\n * to: { x: 200, y: 0, control: { x: 150, y: 100 } },\n * duration: 2,\n * fps: 60,\n * easing: Motion.easeInOut,\n * });\n * ```\n */\n cubic({ from, to, duration = 1, fps = 60, easing = (t) => t }: CubicParams): AnimResult {\n const steps = Math.max(2, Math.round(duration * fps));\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = easing(i / steps);\n const mt = 1 - t;\n // Cubic Bezier: P = (1-t)^3*P0 + 3*(1-t)^2*t*P1 + 3*(1-t)*t^2*P2 + t^3*P3\n xPoints.push(\n mt * mt * mt * from.x +\n 3 * mt * mt * t * from.control.x +\n 3 * mt * t * t * to.control.x +\n t * t * t * to.x,\n );\n yPoints.push(\n mt * mt * mt * from.y +\n 3 * mt * mt * t * from.control.y +\n 3 * mt * t * t * to.control.y +\n t * t * t * to.y,\n );\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n private getMultiCubicOutgoingControl(point: MultiCubicPoint, index: number): Point {\n const control = point.controlOut ?? point.control;\n if (control) {\n return control;\n }\n\n if (index === 0) {\n throw new Error('The first multiCubic point requires `control` or `controlOut`.');\n }\n\n throw new Error(\n `The multiCubic point at index ${index} requires \\`controlOut\\` or a shared \\`control\\`.`,\n );\n }\n\n private getMultiCubicIncomingControl(\n point: MultiCubicPoint,\n index: number,\n lastIndex: number,\n ): Point {\n const control = point.controlIn ?? point.control;\n if (control) {\n return control;\n }\n\n if (index === lastIndex) {\n throw new Error('The last multiCubic point requires `control` or `controlIn`.');\n }\n\n throw new Error(\n `The multiCubic point at index ${index} requires \\`controlIn\\` or a shared \\`control\\`.`,\n );\n }\n\n /**\n * Create a chained cubic Bezier path using 3 or more points.\n * First and last points use a single control handle.\n * Middle points can use separate incoming and outgoing handles.\n *\n * Every consecutive pair creates one cubic segment:\n * `P0 = points[i]`, `P1 = points[i].controlOut`, `P2 = points[i + 1].controlIn`, `P3 = points[i + 1]`.\n *\n * For compatibility, `control` is treated as a shared handle when `controlIn` or `controlOut`\n * are not provided.\n * @example\n * ```ts\n * const { x, y } = animate.multiCubic({\n * points: [\n * { x: 0, y: 0, control: { x: 20, y: 40 } },\n * {\n * x: 100,\n * y: 0,\n * controlIn: { x: 80, y: 60 },\n * controlOut: { x: 120, y: -20 },\n * },\n * { x: 200, y: 50, control: { x: 160, y: 120 } },\n * ],\n * duration: 2,\n * fps: 60,\n * easing: Motion.easeInOut,\n * });\n * ```\n */\n multiCubic({ points, duration = 1, fps = 60, easing = (t) => t }: MultiCubicParams): AnimResult {\n if (points.length < 3) {\n throw new Error('multiCubic requires at least 3 points.');\n }\n\n const segmentCount = points.length - 1;\n const lastIndex = points.length - 1;\n const totalSteps = Math.max(2, Math.round(duration * fps));\n const baseStepsPerSegment = Math.max(1, Math.floor(totalSteps / segmentCount));\n let remainingSteps = totalSteps % segmentCount;\n\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i < segmentCount; i++) {\n const from = points[i];\n const to = points[i + 1];\n const fromControl = this.getMultiCubicOutgoingControl(from, i);\n const toControl = this.getMultiCubicIncomingControl(to, i + 1, lastIndex);\n const stepsForSegment = baseStepsPerSegment + (remainingSteps > 0 ? 1 : 0);\n if (remainingSteps > 0) {\n remainingSteps--;\n }\n\n // Skip the first frame of following segments to avoid duplicate join points.\n const start = i === 0 ? 0 : 1;\n\n for (let s = start; s <= stepsForSegment; s++) {\n const t = easing(s / stepsForSegment);\n const mt = 1 - t;\n\n xPoints.push(\n mt * mt * mt * from.x +\n 3 * mt * mt * t * fromControl.x +\n 3 * mt * t * t * toControl.x +\n t * t * t * to.x,\n );\n\n yPoints.push(\n mt * mt * mt * from.y +\n 3 * mt * mt * t * fromControl.y +\n 3 * mt * t * t * toControl.y +\n t * t * t * to.y,\n );\n }\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n /**\n * Create a circular path around a center point.\n * Angles in degrees. Default: `from: 0`, `to: 360`.\n * @example\n * ```ts\n * const { x, y } = animate.circle({\n * center: { x: 100, y: 100 },\n * radius: 50,\n * from: 0,\n * to: 360,\n * duration: 3,\n * fps: 60,\n * });\n * ```\n */\n circle({\n center,\n radius,\n from = 0,\n to = 360,\n duration = 1,\n fps = 60,\n easing = (t) => t,\n }: CircleParams): AnimResult {\n const steps = Math.max(2, Math.round(duration * fps));\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = easing(i / steps);\n const angle = from + (to - from) * t;\n const rad = (angle * Math.PI) / 180;\n xPoints.push(center.x + radius * Math.cos(rad));\n yPoints.push(center.y + radius * Math.sin(rad));\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n /**\n * Create a spiral path around a center point.\n * @example\n * ```ts\n * const { x, y } = animate.spiral({\n * center: { x: 0, y: 0 },\n * radius: { from: 10, to: 100 },\n * turns: 3,\n * duration: 2,\n * fps: 60,\n * easing: (t) => 1 - (1 - t) * (1 - t),\n * });\n *\n * // This will create a spiral that starts at radius 10 and expands to radius 100 over 3 turns.\n * ```\n */\n spiral({\n center,\n radius,\n turns = 1,\n duration = 1,\n fps = 60,\n easing = (t) => t,\n }: SpiralParams): AnimResult {\n const steps = Math.max(2, Math.round(duration * fps));\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = easing(i / steps);\n const r = this.lerp(radius.from, radius.to, t);\n const angle = t * turns * 360;\n const rad = (angle * Math.PI) / 180;\n xPoints.push(center.x + r * Math.cos(rad));\n yPoints.push(center.y + r * Math.sin(rad));\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n /**\n * Chain multiple animation paths together sequentially.\n * @example\n * ```ts\n * const path1 = animate.quadratic({\n * from: { x: 0, y: 0 },\n * to: { x: 100, y: 0 },\n * control: { x: 50, y: 50 },\n * duration: 1,\n * fps: 60,\n * });\n *\n * const path2 = animate.circle({\n * center: { x: 100, y: 0 },\n * radius: 30,\n * from: 0,\n * to: 180,\n * duration: 1,\n * fps: 60,\n * });\n *\n * const combined = animate.chain(path1, path2);\n * ```\n */\n chain(...animations: AnimResult[]): AnimResult {\n const x: number[] = [];\n const y: number[] = [];\n\n for (const anim of animations) {\n x.push(...anim.x);\n y.push(...anim.y);\n }\n\n return { x, y };\n }\n\n /**\n * Execute multiple animations in sequence with optional delays between them.\n * Each animation will be sampled and delays will add repeating the last coordinate.\n * @example\n * ```ts\n * const path1 = animate.quadratic({ from: { x: 0, y: 0 }, to: { x: 50, y: 0 }, control: { x: 25, y: 25 }, duration: 0.5, fps: 30 });\n * const path2 = animate.quadratic({ from: { x: 50, y: 0 }, to: { x: 100, y: 0 }, control: { x: 75, y: 25 }, duration: 0.5, fps: 30 });\n *\n * // 30 frames delay between animations\n * const sequenced = animate.sequence([path1, path2], 30);\n * ```\n */\n sequence(animations: AnimResult[], delayFrames: number | number[] = 0): AnimResult {\n const x: number[] = [];\n const y: number[] = [];\n\n const delays = Array.isArray(delayFrames)\n ? delayFrames\n : animations.map(() => delayFrames as number);\n\n for (let i = 0; i < animations.length; i++) {\n const anim = animations[i];\n const delay = delays[i] ?? 0;\n\n // Add delay by repeating first frame\n for (let d = 0; d < delay; d++) {\n x.push(anim.x[0]);\n y.push(anim.y[0]);\n }\n\n // Add animation\n x.push(...anim.x);\n y.push(...anim.y);\n }\n\n return { x, y };\n }\n}\n","import {\n AnimateHelper,\n ColorHelper,\n ElementHelper,\n EventHelper,\n FunctionHelper,\n MessageHelper,\n NumberHelper,\n ObjectHelper,\n RandomHelper,\n SoundHelper,\n StringHelper,\n UtilsHelper,\n} from './classes/index.js';\n\nexport namespace Helper {\n export const animate = new AnimateHelper();\n\n export const number = new NumberHelper();\n\n export const element = new ElementHelper();\n\n export const object = new ObjectHelper();\n\n export const message = new MessageHelper();\n\n export const event = new EventHelper();\n\n export const string = new StringHelper();\n\n export const sound = new SoundHelper();\n\n export const color = new ColorHelper();\n\n export const random = new RandomHelper();\n\n export const fn = new FunctionHelper();\n\n export const utils = new UtilsHelper();\n}\n","import { Client } from '../client/client.js';\nimport { Helper } from '../helper/index.js';\nimport { usedButtons, usedClients } from '../internal.js';\nimport { logger } from '../main.js';\nimport { StreamElements } from '../types/index.js';\n\ninterface ButtonOptions {\n field: string | ((field: string, value: string | boolean | number) => boolean);\n template?: string;\n name?: string;\n value?: string;\n run: (this: Client | undefined, field: string, value: string | boolean | number) => void;\n}\n\n/**\n * Represents a button action that can be triggered by custom fields in StreamElements.\n * The button can be configured with a template and a name, and it will execute a specified function when triggered.\n * @example\n * ```javascript\n * const button = new Button({\n * field: (field, value) => field.startsWith('message-') && field.split('-')[1],\n * template: 'message-{role}',\n * // name: '[CAP={role}] role message',\n * name: 'Generate {role} message',\n * run(field, value) {\n * console.log(`Button ${field} was clicked with value: ${value}`);\n * }\n * })\n *\n * const field = button.generate([{ role: 'broadcaster' }, { role: 'moderator' }]);\n * // This will create buttons with fields \"message-broadcaster\" and \"message-moderator\" and names \"Generate broadcaster message\" and \"Generate moderator message\".\n * // field['message-broadcaster'] => { type: 'button', label: 'Generate broadcaster message' }\n * // field['message-moderator'] => { type: 'button', label: 'Generate moderator message' }\n *\n * // When a custom field with the name \"message-broadcaster\" or \"message-moderator\" is triggered, the run function will be called with the field and value.\n * ```\n */\nexport class Button {\n field: ButtonOptions['field'] = 'button';\n template: string = 'button';\n name: string = 'Button';\n value: string = '';\n\n run!: ButtonOptions['run'];\n\n constructor(options: ButtonOptions) {\n this.field = options.field ?? this.field;\n this.template =\n options.template ?? (typeof this.field === 'string' ? this.field : this.template);\n this.name = options.name ?? this.name;\n this.value = options.value ?? this.value;\n this.run = options.run;\n\n usedButtons.push(this);\n\n if (!usedClients.length) return;\n\n // Register the button in the client actions\n usedClients.forEach((client) => {\n client.actions.buttons.push(this);\n client.emit('action', this, 'created');\n });\n }\n\n generate(values: Array<Record<string, string | number>>) {\n const fields = Helper.utils.typedValues(values).reduce(\n (acc, values, index) => {\n const key = Helper.string.compose(this.template, { index, ...values }, { html: false });\n const name = Helper.string.compose(this.name, { index, ...values }, { html: false });\n\n acc[key] = {\n type: 'button',\n label: name,\n };\n\n let value: string | number | boolean = Helper.string.compose(\n String(this.value),\n { index, ...values },\n { html: false },\n );\n\n if (!isNaN(Number(value))) value = Number(value);\n else if (value.toLowerCase() === 'true') value = true;\n else if (value.toLowerCase() === 'false') value = false;\n\n if (\n typeof value !== 'undefined' &&\n !!value &&\n (typeof value === 'string' ? value.length : true)\n ) {\n acc[key].value = value;\n }\n\n return acc;\n },\n {} as Record<string, StreamElements.CustomField.Schema>,\n );\n\n // let result = Helper.string.compose(this.template, values, { html: false });\n\n return fields;\n }\n\n parse(field: string, value: string | boolean | number): Button {\n /**\n * Extract the actual field name by removing the template part from the provided field.\n * For example, if the template is \"button-{id}\" and the field is \"button-123\",\n * this will extract \"123\" as the actual field name.\n */\n var f = field\n .replace(\n typeof this.field === 'string'\n ? this.field\n : (this.template.replace(/\\{[^}]*\\}/g, '') ?? ''),\n '',\n )\n .trim();\n\n try {\n this.run.apply(usedClients[0] || undefined, [f.length ? f : (field ?? field), value]);\n } catch (error) {\n throw new Error(\n `Error running button \"${this.field}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n\n return this;\n }\n\n remove(): void {\n const _index = usedButtons.indexOf(this);\n\n if (_index > -1) {\n usedButtons.splice(_index, 1);\n }\n\n if (!usedClients.length) return;\n\n const index = usedClients[0]?.actions.buttons.indexOf(this);\n\n if (index > -1) {\n usedClients[0]?.actions.buttons.splice(index, 1);\n usedClients[0]?.emit('action', this, 'removed');\n }\n }\n\n static execute(field: string, value: string | boolean | number): boolean {\n try {\n if (usedButtons.length) {\n const found = usedButtons.filter((b) => {\n /**\n * Check if the button's field matches the provided field.\n */\n if (typeof b.field === 'string') return b.field === field;\n /**\n * If the button's field is a function, call it with the provided field and value to determine a match.\n */\n if (typeof b.field === 'function') return b.field(field, value);\n\n return false;\n });\n\n if (found.length && found.every((b) => b instanceof Button)) {\n found.forEach((button) => {\n try {\n button.parse(field, value);\n\n usedClients.forEach((client) => {\n client.emit('action', button, 'executed');\n });\n\n logger.received(`Button executed: ${field}${value ? ` with value: ${value}` : ''}`);\n } catch (error) {\n logger.error(\n `Error executing button \"${field}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n });\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n","import { Client } from '../client/client.js';\nimport { usedClients, usedCommands } from '../internal.js';\nimport { logger } from '../main.js';\nimport { StreamElements } from '../types/streamelements/main.js';\n\ninterface CommandOptions {\n prefix?: string;\n name: string;\n description?: string;\n arguments?: boolean;\n run: (this: Client, args: string[], event: CommandEvent) => void;\n test?: string;\n aliases?: string[];\n permissions?: string[] | boolean;\n admins?: string[];\n}\n\ntype CommandEvent =\n | { provider: 'twitch'; data: StreamElements.Event.Provider.Twitch.Message }\n | { provider: 'youtube'; data: StreamElements.Event.Provider.YouTube.Message }\n | { provider: 'kick'; data: any };\n\nexport class Command {\n prefix: string = '!';\n\n name!: string;\n description!: string;\n\n arguments: boolean = false;\n\n test: string | (() => string) = `${this.prefix}${this.name} arg1 arg2`;\n\n aliases: string[] = [];\n permissions?: string[] | boolean = undefined;\n admins: string[] = [];\n\n constructor(options: CommandOptions) {\n this.prefix = options.prefix ?? this.prefix;\n this.name = options.name;\n this.description = options.description ?? this.description;\n this.arguments = options.arguments ?? this.arguments;\n\n this.run = options.run;\n\n this.test = options.test ?? this.test;\n this.aliases = options.aliases ?? this.aliases;\n this.permissions = options.permissions ?? this.permissions;\n this.admins = options.admins ?? this.admins;\n\n usedCommands.push(this);\n\n if (!usedClients.length) return;\n\n // Register the command in the client actions\n usedClients.forEach((client) => {\n client.actions.commands.push(this);\n client.emit('action', this, 'created');\n });\n }\n\n run(this: Client | undefined, args: string[], event: CommandEvent): void {}\n\n verify(nickname: string, roles: string[], args: string[]): boolean {\n if (this.arguments === true && (!args || !args.length)) {\n return false;\n }\n\n if (this.admins.some((a) => nickname.toLocaleLowerCase() === a.toLocaleLowerCase())) {\n return true;\n }\n\n if (\n this.permissions === true ||\n typeof this.permissions === 'undefined' ||\n (Array.isArray(this.permissions) && !this.permissions.length)\n ) {\n return true;\n }\n\n if (\n Array.isArray(this.permissions) &&\n (this.permissions.some(\n (p) =>\n nickname.toLowerCase() === p.toLowerCase() ||\n roles.map((r) => r.toLowerCase()).includes(p.toLowerCase()),\n ) ||\n this.permissions.includes('*'))\n ) {\n return true;\n }\n\n return false;\n }\n\n parse(text: string, event: CommandEvent): boolean {\n const args = text\n .replace(this.prefix, '')\n .split(' ')\n .slice(1)\n .map((a) => a.trim());\n\n var nickname: string = '';\n var roles: string[] = [];\n\n const rAliases = { bits: 'cheer', premium: 'prime' };\n\n switch (event.provider) {\n case 'twitch': {\n const data = event.data;\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n if (data.event.data.tags?.badges) {\n const tags = data.event.data.tags.badges.toString().replace(/\\/\\d+/g, '').split(',');\n\n roles = tags.map((t) => (t in rAliases ? rAliases[t as keyof typeof rAliases] : t));\n }\n\n break;\n }\n case 'youtube': {\n const data = event.data;\n\n const rMap = {\n isVerified: 'verified',\n isChatOwner: 'owner',\n isChatSponsor: 'sponsor',\n isChatModerator: 'moderator',\n };\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n roles = Object.entries(data.event.data.authorDetails)\n .filter(([k, v]) => k.startsWith('is') && v)\n .map(([k]) => rMap[k as keyof typeof rMap])\n .filter(Boolean);\n\n if (roles.includes('sponsor')) {\n roles.push('premium');\n roles.push('prime');\n }\n if (roles.includes('owner')) {\n roles.push('moderator');\n roles.push('broadcaster');\n }\n\n break;\n }\n case 'kick': {\n return false;\n\n break;\n }\n }\n\n const verify = this.verify(nickname, roles, args);\n\n if (verify === true) {\n this.run.apply(usedClients[0] || undefined, [args, event]);\n }\n\n return verify;\n }\n\n remove(): void {\n const _index = usedCommands.indexOf(this);\n\n if (_index > -1) {\n usedCommands.splice(_index, 1);\n }\n\n if (!usedClients.length) return;\n\n const index = usedClients[0]?.actions.commands.indexOf(this);\n\n if (index > -1) {\n usedClients[0]?.actions.commands.splice(index, 1);\n usedClients[0]?.emit('action', this, 'removed');\n }\n }\n\n static execute(received: CommandEvent): boolean {\n const data = received.data;\n\n try {\n if (\n usedCommands.length &&\n usedCommands.some((c) => data.event.data.text.startsWith(c.prefix))\n ) {\n const found = usedCommands.filter((c) => {\n var nameAndAliases = [c.name, ...(c.aliases ?? [])];\n var commandMatch = data.event.data.text.replace(c.prefix, '').split(' ')[0];\n\n return nameAndAliases.includes(commandMatch);\n });\n\n if (found.length && found.every((command) => command instanceof Command)) {\n found.forEach((command) => {\n command.parse(data.event.data.text, received);\n\n usedClients.forEach((client) => {\n client.emit('action', command, 'executed');\n });\n\n logger.received(\n `Command executed: ${data.event.data.text} by ${data.event.data.nick || data.event.data.displayName}`,\n data,\n );\n });\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n","import { Button } from '../actions/button.js';\nimport { Command } from '../actions/command.js';\nimport { Helper } from '../helper/index.js';\nimport { usedClients, usedComms, usedStorages } from '../internal.js';\nimport { Local } from '../local/index.js';\nimport { logger } from '../main.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { Client, ClientStorageOptions } from './client.js';\n\nif (typeof window !== undefined) {\n window.addEventListener('onWidgetLoad', async (data) => {\n const { detail } = data;\n\n if (usedClients.length) {\n usedClients.forEach(async (client) => {\n client.fields = detail.fieldData;\n client.session = detail.session.data;\n\n client.details = {\n ...client.details,\n user: detail.channel,\n currency: detail.currency,\n overlay: detail.overlay,\n };\n\n if (detail.channel.id && !detail.emulated) {\n await fetch(`https://api.streamelements.com/kappa/v2/channels/${detail.channel.id}/`)\n .then((res) => res.json())\n .then((profile) => {\n if (profile.provider) {\n client.details.provider = profile.provider;\n\n return profile.provider;\n } else {\n client.details.provider = 'local';\n }\n })\n .catch(() => {\n client.details.provider = 'local';\n });\n } else {\n client.details.provider = 'local';\n }\n\n client.emit('load', detail);\n\n if (client.debug) {\n logger.received('Widget loaded!', data.detail);\n\n const fieldData = data.detail.fieldData;\n\n if (Object.keys(fieldData).length) logger.received('Field data:', fieldData);\n }\n\n client.loaded = true;\n\n client.storage.on('load', (data) => {\n if (client.debug && data) {\n logger.debug(\n '[Client]',\n 'Storage loaded for client',\n `\"${client.id}\";`,\n `Provider: \"${client.details.provider}\";`,\n data,\n );\n } else if (client.debug) {\n logger.debug(\n '[Client]',\n 'Storage loaded for client',\n `\"${client.id}\";`,\n `Provider: \"${client.details.provider}\";`,\n 'No data found.',\n );\n }\n\n if (data) {\n const clearExpired = <T extends Record<string, ClientStorageOptions<string>>>(\n data: T,\n ) => {\n const now = Date.now();\n const cleanedData: any = {};\n\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n const entry = data[key];\n\n if (entry.expire && entry.expire > now) {\n cleanedData[key] = entry;\n }\n }\n }\n\n return cleanedData as T;\n };\n\n const users = clearExpired(data['user'] || {});\n const avatars = clearExpired(data['avatar'] || {});\n const pronouns = clearExpired(data['pronoun'] || {});\n const emotes = clearExpired(data['emote'] || {});\n\n client.storage.update({\n user: users,\n avatar: avatars,\n pronoun: pronouns,\n emote: emotes,\n });\n }\n\n if (detail.channel.providerId.length) {\n client.storage.add(`avatar.${detail.channel.providerId.toLowerCase()}`, {\n value: detail.channel.avatar,\n timestamp: Date.now(),\n expire: Date.now() + client.cache.avatar * 60 * 1000,\n });\n }\n });\n });\n }\n });\n\n window.addEventListener('onSessionUpdate', (data) => {\n const { detail } = data;\n\n if (usedClients.length) {\n usedClients.forEach((client) => {\n client.session = detail.session;\n\n client.emit('session', detail.session);\n\n if (client.debug) {\n logger.debug('[Client]', 'Session updated', detail.session);\n }\n });\n }\n });\n\n window.addEventListener('onEventReceived', ({ detail }) => {\n if (usedClients.length) {\n usedClients.forEach((client) => {\n const received = Helper.event.parseProvider(detail);\n\n switch (received.provider) {\n case 'streamelements': {\n const data = received.data;\n\n switch (data.listener) {\n case 'tip-latest': {\n const event = data.event;\n\n break;\n }\n case 'event:skip': {\n const event = data.event;\n\n break;\n }\n case 'event:test': {\n switch (data.event.listener) {\n case 'widget-button': {\n const event = data.event;\n\n Button.execute(event.field, event.value);\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n break;\n }\n\n // ... alot more\n }\n\n break;\n }\n case 'kvstore:update': {\n const event = data.event;\n\n if (usedStorages.length) {\n var storage = usedStorages.find(\n (s) =>\n s.id === event.data.key.replace('customWidget.', '') ||\n s.id === event.data.key,\n );\n\n if (storage) {\n // @ts-ignore\n storage.update(event.data.value);\n }\n }\n\n if (usedComms.length) {\n const comm = usedComms.find(\n (c) =>\n c.id === event.data.key.replace('customWidget.', '') ||\n c.id === event.data.key,\n );\n\n if (comm) {\n // @ts-ignore\n comm.update(event.data.value);\n }\n }\n\n break;\n }\n case 'bot:counter': {\n const event = data.event;\n\n break;\n }\n case 'alertService:toggleSound': {\n const event = data.event;\n\n client.details.overlay.muted = Boolean(event.muted);\n\n break;\n }\n }\n\n client.emit('event', 'streamelements', received.data);\n\n break;\n }\n case 'twitch': {\n const data = received.data;\n\n switch (data.listener) {\n case 'delete-message': {\n const event = data.event;\n\n break;\n }\n case 'delete-messages': {\n const event = data.event;\n\n break;\n }\n case 'message': {\n const event = data.event;\n\n Command.execute({ provider: 'twitch', data: data });\n\n break;\n }\n case 'follower-latest': {\n const event = data.event;\n\n break;\n }\n case 'cheer-latest': {\n const event = data.event;\n\n break;\n }\n case 'subscriber-latest': {\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // gift\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n const event = data.event;\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'raid-latest': {\n const event = data.event;\n\n break;\n }\n }\n\n client.emit('event', 'twitch', received.data);\n\n break;\n }\n case 'youtube': {\n const data = received.data;\n\n switch (data.listener) {\n case 'message': {\n const event = data.event;\n\n Command.execute({ provider: 'youtube', data: data });\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n\n break;\n }\n case 'sponsor-latest': {\n const event = data.event;\n\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // gift\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n const event = data.event;\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'superchat-latest': {\n const event = data.event;\n\n break;\n }\n }\n\n client.emit('event', 'youtube', received.data);\n\n break;\n }\n default: {\n // @ts-ignore\n client.emit('event', received.provider, received.data);\n }\n }\n\n const excludeListeners: Array<(typeof received.data)['listener']> = [\n 'bot:counter',\n 'alertService:toggleSound',\n 'event',\n 'event:skip',\n 'event:test',\n 'kvstore:update',\n ];\n\n if (\n client.debug &&\n !excludeListeners.some((e) => e === received.data.listener) &&\n ['streamelements', 'twitch', 'youtube'].some((p) => p === received.provider)\n ) {\n logger.received(\n '[Client]',\n `Event ${received.data.listener} received from ${received.provider}`,\n received.data.event,\n );\n }\n });\n }\n });\n}\n","/**\n * EventProvider class for managing event listeners and emitters.\n * This class allows you to register event listeners, emit events, and manage event subscriptions.\n * @example\n * ```typescript\n * type TestEvents = {\n * load: [event: { type: 'load' }];\n * event: [event: { type: 'event' }];\n * };\n *\n * class Test extends EventProvider<TestEvents> {}\n *\n * const test = new Test();\n * test.once('load', (data) => {});\n * test.emit('load', { type: 'load' });\n *\n * test.on('event', (data) => {});\n * test.emit('event', { type: 'event' });\n * ```\n */\nexport class EventProvider<EventMap extends Record<string, any[]> = Record<string, any[]>> {\n /**\n * Stores registered event listeners.\n */\n private registeredEvents: {\n [K in keyof EventMap]?: Array<(this: this, ...args: EventMap[K]) => any>;\n } = {};\n\n /**\n * Emits an event to all registered listeners.\n * Returns an array of return values from the listeners.\n * @param eventName The name of the event.\n * @param args Arguments to pass to the listeners.\n */\n emit<K extends keyof EventMap>(eventName: K, ...args: EventMap[K]): any[] {\n const listeners = this.registeredEvents[eventName] || [];\n\n return listeners.map((listener) => listener.apply(this, args));\n }\n\n /**\n * Registers an event listener.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n on<K extends keyof EventMap>(\n eventName: K,\n callback: (this: this, ...args: EventMap[K]) => any,\n ): this {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n if (!this.registeredEvents[eventName]) {\n this.registeredEvents[eventName] = [];\n }\n\n this.registeredEvents[eventName]!.push(callback);\n\n return this;\n }\n\n /**\n * Removes a specific event listener.\n * @param eventName The name of the event.\n * @param callback The callback function to remove.\n */\n off<K extends keyof EventMap>(\n eventName: K,\n callback?: (this: this, ...args: EventMap[K]) => any,\n ): this {\n const listeners = this.registeredEvents[eventName] || [];\n\n if (!callback) {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n\n this.registeredEvents[eventName] = listeners.filter((fn) => fn !== callback);\n\n return this;\n }\n\n /**\n * Registers a listener that is executed only once.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n once<K extends keyof EventMap>(\n eventName: K,\n callback: (this: this, ...args: EventMap[K]) => any,\n ): this {\n const wrapper = (...args: EventMap[K]) => {\n this.off(eventName, wrapper);\n callback.apply(this, args);\n };\n\n this.on(eventName, wrapper);\n\n return this;\n }\n\n /**\n * Removes all listeners for a specific event.\n * @param eventName The name of the event.\n */\n removeAllListeners<K extends keyof EventMap>(eventName: K): this {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n}\n","import { Client } from '../client/client.js';\nimport { usedClients } from '../internal.js';\nimport { EventProvider } from './EventProvider.js';\n\nconst getUsedClients = (): Client[] => {\n try {\n return usedClients;\n } catch {\n return [];\n }\n};\n\ntype QueueEvents<T> = {\n load: [];\n cancel: [];\n update: [\n queue: QueueItem<T>[],\n priorityQueue: QueueItem<T>[],\n history: QueueItem<T>[],\n timeouts: Array<ReturnType<typeof setTimeout>>,\n ];\n process: [item: QueueItem<T>, queue: useQueue<T>];\n};\n\ntype QueueProps = {\n isoDate: string;\n isLoop: boolean;\n isPriority: boolean;\n isImmediate: boolean;\n};\n\ntype QueueItem<T> = { value: T } & QueueProps;\n\ntype QueueProcessor<T> = (this: useQueue<T>, item: T, queue: useQueue<T>) => Promise<any>;\n\ntype QueueDuration = number | boolean | undefined;\n\ninterface QueueOptions<T> {\n /**\n * Duration between processing each item in milliseconds. Set to `0` or `false` for immediate processing.\n */\n duration?: QueueDuration | 'client';\n /**\n * Function to process each item in the queue.\n */\n processor: QueueProcessor<T>;\n}\n\n/**\n * A utility class to manage a queue of items with support for priority, looping, and immediate processing.\n * @template T - The type of items in the queue.\n * @extends EventProvider<QueueEvents<T>>\n * @example\n * ```javascript\n * const myQueue = new useQueue({\n * duration: 1000,\n * processor: async function (item) {\n * console.log('Processing item:', item);\n * },\n * });\n *\n * myQueue.enqueue('Item 1');\n * myQueue.enqueue('Item 2', { isPriority: true });\n * ```\n */\nexport class useQueue<T> extends EventProvider<QueueEvents<T>> {\n queue: QueueItem<T>[] = [];\n priorityQueue: QueueItem<T>[] = [];\n history: QueueItem<T>[] = [];\n\n private timeouts: Array<ReturnType<typeof setTimeout>> = [];\n\n public running: boolean = false;\n\n public duration: QueueDuration = undefined;\n\n private loaded: boolean = false;\n\n public processor!: QueueProcessor<T>;\n\n private readonly clientWaitRetryDelay = 50;\n\n constructor(options: QueueOptions<T>) {\n super();\n\n if (!options.processor || typeof options.processor !== 'function') {\n throw new Error('A valid processor function must be provided to useQueue.');\n }\n\n this.processor = options.processor;\n\n if (options.duration !== 'client') this.duration = options.duration ?? 0;\n\n this.waitForClientAndBindLoad(options.duration);\n }\n\n private waitForClientAndBindLoad(\n duration: QueueDuration | 'client' = this.duration,\n callback?: () => void,\n ) {\n const clients = getUsedClients();\n\n if (!clients.length) {\n setTimeout(\n () => this.waitForClientAndBindLoad(duration, callback),\n this.clientWaitRetryDelay,\n );\n\n return;\n }\n\n const client = clients[0];\n\n client.on('load', () => {\n if (duration === 'client') this.duration = (client.fields?.widgetDuration ?? 0) as number;\n\n this.emit('load');\n\n this.loaded = true;\n if (callback) callback();\n });\n }\n\n /**\n * Enqueue an item or multiple items into the queue with optional processing options.\n * @param value - The item or items to be enqueued. Can be a single value of type T or an array of objects containing the value and options.\n * @param options - Optional processing options for the item(s) being enqueued. Ignored if an array of items is provided, as each item can have its own options.\n * @returns The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.enqueue('Single Item', { isPriority: true });\n * myQueue.enqueue([\n * { value: 'Item 1', options: { isPriority: true } },\n * { value: 'Item 2', options: { isLoop: true } }\n * ]);\n * ```\n */\n public enqueue(value: T, options?: Partial<QueueProps>): this;\n public enqueue(items: { value: T; options?: Partial<QueueProps> }[]): this;\n public enqueue(\n valueOrItems: T | { value: T; options?: Partial<QueueProps> }[],\n options: Partial<QueueProps> = {},\n ): this {\n const hadItems = this.hasItems();\n\n const entries: { value: T; options: Partial<QueueProps> }[] = Array.isArray(valueOrItems)\n ? valueOrItems.map((entry) => ({ value: entry.value, options: entry.options ?? {} }))\n : [{ value: valueOrItems as T, options }];\n\n for (const entry of entries) {\n const item: QueueItem<T> = {\n isoDate: new Date().toISOString(),\n isLoop: entry.options?.isLoop ?? false,\n isPriority: entry.options?.isPriority ?? false,\n isImmediate: entry.options?.isImmediate ?? false,\n value: entry.value,\n };\n\n if (item.isPriority && item.isImmediate) {\n this.cancel();\n this.priorityQueue.unshift(item);\n } else {\n const targetQueue = item.isPriority ? this.priorityQueue : this.queue;\n\n targetQueue.push(item);\n }\n }\n\n // Always process immediately if it's not running and the queue was empty before\n if (this.running === false && hadItems === false) {\n this.run();\n }\n\n this.emit('update', this.queue, this.priorityQueue, this.history, this.timeouts);\n\n return this;\n }\n\n private async run() {\n if (!this.hasItems()) {\n this.running = false;\n return;\n }\n\n this.running = true;\n\n await this.next();\n\n if (typeof this.duration === 'number' && this.duration > 0) {\n this.timeouts.push(setTimeout(() => this.run(), this.duration));\n } else if (this.duration === 0 || (this.duration !== -1 && this.duration !== false)) {\n this.run();\n }\n }\n\n private async next() {\n const nextItem =\n this.priorityQueue.length > 0 ? this.priorityQueue.shift() : this.queue.shift();\n\n if (!nextItem) {\n this.running = false;\n\n return;\n }\n\n try {\n await this.processor.apply(this, [nextItem.value, this]);\n\n this.emit('process', nextItem, this);\n } catch (error) {\n console.error(\n `Error during item processing: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n this.history.push(nextItem);\n\n const targetQueue = nextItem.isPriority ? this.priorityQueue : this.queue;\n\n if (nextItem.isLoop) targetQueue.push(nextItem);\n }\n\n /**\n * Resume processing the queue if it is paused. If the queue is already running, it will be restarted, which can be useful if new items have been added or if you want to reset the processing timer.\n * If the queue was empty before, it will start processing immediately.\n * @returns - The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.resume();\n * ```\n */\n public resume() {\n if (this.running) {\n this.cancel();\n }\n\n if (this.hasItems()) this.run();\n\n return this;\n }\n\n /**\n * Update the queue's state with new values. This can be used to replace the current queue, priority queue, history, or timeouts with new data. If the queue is not currently running and there are items in the queue after the update, it will start processing immediately.\n * @param save - An object containing the new state for the queue, priority queue, history, and timeouts. Each property is optional, and if not provided, the current state will be retained.\n * @returns - The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.update({\n * queue: newQueueItems,\n * priorityQueue: newPriorityItems,\n * history: newHistory,\n * });\n * ```\n */\n public update(save: Partial<useQueue<T>>): this {\n this.queue = save.queue ?? this.queue;\n this.priorityQueue = save.priorityQueue ?? this.priorityQueue;\n this.history = save.history ?? this.history;\n\n if (this.hasItems() && this.running === false) {\n const client = getUsedClients()[0];\n client?.on('load', () => this.run());\n }\n\n return this;\n }\n\n /**\n * Cancel all pending timeouts and stop the queue from processing further items. This will clear any scheduled processing and prevent any new items from being processed until `resume()` is called again. The current state of the queue, priority queue, and history will be retained, allowing you to resume processing later without losing any data.\n */\n public cancel() {\n if (this.running) {\n this.timeouts.forEach((timeout) => clearTimeout(timeout));\n this.timeouts = [];\n this.running = false;\n\n this.emit('cancel');\n }\n }\n\n /**\n * Check if there are any items in the queue or priority queue. This method returns `true` if there are items waiting to be processed in either the main queue or the priority queue, and `false` if both queues are empty.\n * @returns - A boolean indicating whether there are items in the queue or priority queue.\n */\n public hasItems(): boolean {\n return this.queue.length > 0 || this.priorityQueue.length > 0;\n }\n\n public override on<K extends keyof QueueEvents<T>>(\n eventName: K,\n callback: (this: useQueue<T>, ...args: QueueEvents<T>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Data } from '../data/index.js';\nimport { BadgeOptions, MessageHelper } from '../helper/classes/message.js';\nimport { RandomHelper } from '../helper/classes/random.js';\nimport { usedClients } from '../internal.js';\nimport { ClientEvents, Provider, StreamElements, Twitch } from '../types.js';\n\n/**\n * Simulates the onWidgetLoad event for a widget.\n * @param fields - The field values to be included in the event.\n * @param session - The session data to be included in the event.\n * @param currency - The currency to be used (default is 'USD').\n * @returns A Promise that resolves to the simulated onWidgetLoad event data.\n */\nasync function onWidgetLoad(\n fields: Record<string, StreamElements.CustomField.Value>,\n session: StreamElements.Session.Data,\n currency: 'BRL' | 'USD' | 'EUR' = 'USD',\n): Promise<StreamElements.Event.onWidgetLoad> {\n const currencies = {\n BRL: { code: 'BRL', name: 'Brazilian Real', symbol: 'R$' },\n USD: { code: 'USD', name: 'US Dollar', symbol: '$' },\n EUR: { code: 'EUR', name: 'Euro', symbol: '€' },\n };\n\n return {\n channel: {\n username: 'local',\n apiToken: '',\n id: '',\n providerId: '',\n avatar: '',\n },\n currency: currencies[currency] ?? currencies.USD,\n fieldData: fields,\n recents: [],\n session: {\n data: session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: {\n isEditorMode: true,\n muted: false,\n },\n emulated: true,\n };\n}\n\n/**\n * Simulates the onSessionUpdate event for a widget.\n * @param session - The session data to be included in the event.\n * @returns A Promise that resolves to the simulated onSessionUpdate event data.\n */\nasync function onSessionUpdate(\n session?: StreamElements.Session.Data,\n update?: ClientEvents,\n): Promise<StreamElements.Event.onSessionUpdate> {\n session ??= await generate.session.get();\n\n if (update) {\n const orderByDateDesc = (a: { createdAt: string }, b: { createdAt: string }) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n\n switch (update.provider) {\n case 'twitch': {\n const data = update.data;\n\n switch (data.listener) {\n case 'cheer-latest': {\n const amount = data.event.amount;\n const name = data.event.displayName ?? data.event.name;\n const message = data.event.message;\n\n session['cheer-latest'] = { name, amount, message };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`cheer-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`cheer-${type}-top-donator`];\n\n const donatorCurrent = session['cheer-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['cheer-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['cheer-session'].amount += amount;\n session['cheer-week'].amount += amount;\n session['cheer-month'].amount += amount;\n session['cheer-total'].amount += amount;\n session['cheer-count'].count += 1;\n session['cheer-goal'].amount += amount;\n session['cheer-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['cheer-recent'] = (session['cheer-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'follower-latest': {\n const name = data.event.displayName ?? data.event.name;\n\n session['follower-latest'].name = name;\n\n session['follower-session'].count += 1;\n session['follower-week'].count += 1;\n session['follower-month'].count += 1;\n session['follower-total'].count += 1;\n session['follower-goal'].amount += 1;\n session['follower-recent'].unshift({\n name: name,\n createdAt: new Date().toISOString(),\n });\n session['follower-recent'] = (session['follower-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'subscriber-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n const tier = data.event.tier;\n const message = data.event.message;\n\n session['subscriber-latest'] = { name, amount, tier, message: message ?? '' };\n\n if (\n !session['subscriber-recent'].find((e) => e.name.toLowerCase() === name.toLowerCase())\n ) {\n session['subscriber-new-latest'] = { name, amount, message: message ?? '' };\n session['subscriber-new-session'].count += 1;\n } else if (amount > 1) {\n session['subscriber-resub-latest'] = { name, amount, message: message ?? '' };\n session['subscriber-resub-session'].count += 1;\n }\n\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n } else if (data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n const sender = data.event.sender;\n // gift\n session['subscriber-gifted-latest'] = {\n name,\n amount,\n tier,\n message: message ?? '',\n sender,\n };\n session['subscriber-gifted-session'].count += 1;\n\n session['subscriber-alltime-gifter'] = { name: sender, amount };\n } else if (data.event.gifted && !data.event.bulkGifted && data.event.isCommunityGift) {\n // community gift spam\n } else if (!data.event.gifted && data.event.bulkGifted && !data.event.isCommunityGift) {\n // community gift\n }\n\n session['subscriber-session'].count += amount;\n session['subscriber-week'].count += amount;\n session['subscriber-month'].count += amount;\n session['subscriber-total'].count += amount;\n session['subscriber-goal'].amount += amount;\n session['subscriber-points'].amount += amount;\n\n session['subscriber-recent'].unshift({\n name: name,\n amount: amount,\n tier: tier,\n createdAt: new Date().toISOString(),\n });\n session['subscriber-recent'] = (session['subscriber-recent'] || []).sort(\n orderByDateDesc,\n );\n\n break;\n }\n case 'raid-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['raid-latest'] = { name, amount };\n\n session['raid-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['raid-recent'] = (session['raid-recent'] || []).sort(orderByDateDesc);\n break;\n }\n }\n\n break;\n }\n\n case 'youtube': {\n const data = update.data;\n\n switch (data.listener) {\n case 'superchat-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['superchat-latest'] = {\n name: name.toLowerCase(),\n displayName: name,\n amount,\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n providerId: '',\n avatar: '',\n };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`superchat-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`superchat-${type}-top-donator`];\n\n const donatorCurrent = session['superchat-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['superchat-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['superchat-session'].amount += amount;\n session['superchat-week'].amount += amount;\n session['superchat-month'].amount += amount;\n session['superchat-total'].amount += amount;\n session['superchat-count'].count += 1;\n session['superchat-goal'].amount += amount;\n session['superchat-recent'].unshift({\n name: name.toLowerCase(),\n displayName: name,\n amount: amount,\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n avatar: '',\n providerId: '',\n });\n // session['superchat-recent'] = (session['superchat-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n }\n\n break;\n }\n\n case 'streamelements': {\n const data = update.data;\n\n switch (data.listener) {\n case 'tip-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['tip-latest'] = { name, amount };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`tip-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`tip-${type}-top-donator`];\n\n const donatorCurrent = session['tip-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['tip-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['tip-session'].amount += amount;\n session['tip-week'].amount += amount;\n session['tip-month'].amount += amount;\n session['tip-total'].amount += amount;\n session['tip-count'].count += 1;\n session['tip-goal'].amount += amount;\n session['tip-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['tip-recent'] = (session['tip-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'event:test': {\n break;\n }\n }\n\n break;\n }\n }\n }\n\n return { session, emulated: true };\n}\n\n/**\n * Simulates the onEventReceived event for a widget.\n * @param provider - The provider of the event (default is 'random').\n * @param type - The type of event to simulate (default is 'random').\n * @param options - Additional options to customize the event data.\n * @returns A Promise that resolves to the simulated onEventReceived event data, or null if the event type is not supported.\n * @example\n * ```javascript\n * // Simulate a random event\n * const randomEvent = await onEventReceived();\n *\n * // Simulate a Twitch message event with custom options\n * const twitchMessageEvent = await onEventReceived('twitch', 'message', { name: 'Streamer', message: 'Hello World!' });\n * ```\n */\nasync function onEventReceived(\n provider: Provider | 'random' = 'random',\n type:\n | StreamElements.Event.onEventReceived['listener']\n | 'random'\n | 'tip'\n | 'cheer'\n | 'follower'\n | 'raid'\n | 'subscriber' = 'random',\n options: Record<string, string | number | boolean> = {},\n): Promise<StreamElements.Event.onEventReceived | null> {\n const available: Record<Provider, string[]> = {\n twitch: ['message', 'follower-latest', 'cheer-latest', 'raid-latest', 'subscriber-latest'],\n streamelements: ['tip-latest'],\n youtube: ['message', 'superchat-latest', 'subscriber-latest', 'sponsor-latest'],\n kick: [],\n facebook: [],\n };\n\n switch (provider) {\n default:\n case 'random': {\n var randomProvider = new RandomHelper().array(\n Object.keys(available).filter((e) => available[e as Provider].length),\n )[0] as Provider;\n var randomEvent = new RandomHelper().array(\n available[randomProvider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return onEventReceived(randomProvider, randomEvent);\n }\n\n case 'twitch': {\n switch (\n type as\n | StreamElements.Event.Provider.Twitch.Events['listener']\n | 'random'\n | 'cheer'\n | 'follower'\n | 'raid'\n | 'subscriber'\n ) {\n default:\n case 'random': {\n var randomEvent = new RandomHelper().array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return onEventReceived(provider, randomEvent);\n }\n case 'message': {\n const data = options as Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n firstMsg: boolean;\n returningChatter: boolean;\n reply: {\n msgId: string;\n userId: string;\n login: string;\n name: string;\n text: string;\n };\n thread: {\n msgId: string;\n name: string;\n };\n }>;\n\n var name = data?.name ?? new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var message =\n data?.message ??\n new RandomHelper().array(\n [...Data.twitch_messages, ...Data.normal_messages].filter((e) => e.length),\n )[0];\n\n var badges = await new MessageHelper().generateBadges(data?.badges ?? [], provider);\n\n var emotes = new MessageHelper().findEmotesInText(message);\n var renderedText = new MessageHelper().replaceEmotesWithHTML(message, emotes);\n\n var color = (data?.color as string) ?? new RandomHelper().color('hex');\n var userId = (data?.userId as string) ?? new RandomHelper().string(16);\n var msgId = (data?.msgId as string) ?? new RandomHelper().string(16);\n var time = (data?.time as number) ?? Date.now();\n\n var channel =\n (data?.channel as string) ?? usedClients?.[0]?.details?.user?.username ?? 'local';\n\n var reply = data?.reply\n ? ({\n 'reply-parent-display-name': data.reply.name,\n 'reply-parent-msg-body': data.reply.text,\n 'reply-parent-msg-id': data.reply.msgId,\n 'reply-parent-user-id': data.reply.userId,\n 'reply-parent-user-login': data.reply.name.toLowerCase(),\n } satisfies Partial<Twitch.IRC>)\n : {};\n\n var thread = data?.thread\n ? ({\n 'reply-thread-parent-msg-id': data.thread.msgId,\n 'reply-thread-parent-user-login': data.thread.name.toLowerCase(),\n } satisfies Partial<Twitch.IRC>)\n : {};\n\n var roles = {\n vip: badges.keys.includes('vip') ? '' : undefined,\n subscriber: badges.keys.includes('subscriber') ? '1' : '0',\n mod: badges.keys.includes('moderator') ? '1' : '0',\n turbo: badges.keys.includes('turbo') ? '1' : '0',\n } as const;\n\n const event: StreamElements.Event.Provider.Twitch.Message = {\n listener: 'message',\n event: {\n service: provider,\n data: {\n time: time,\n tags: {\n 'badge-info': `${badges.keys.map((key) => `${key}/${badges.amount[key] ?? new RandomHelper().number(1, 5)}`).join(',')}`,\n badges: badges.keys.map((key) => `${key}/1`).join(','),\n\n ...roles,\n\n 'tmi-sent-ts': time.toString(),\n 'room-id': new RandomHelper().string(9, 'numbers'),\n\n 'user-id': userId,\n 'user-type': '',\n\n color: color,\n 'display-name': name,\n emotes: '',\n\n 'client-nonce': new RandomHelper().string(16),\n flags: '',\n id: msgId,\n 'first-msg': data?.firstMsg ? '1' : '0',\n 'returning-chatter': data?.returningChatter ? '1' : '0',\n\n ...reply,\n ...thread,\n },\n nick: name.toLowerCase(),\n displayName: name,\n displayColor: color,\n channel: channel,\n text: message,\n isAction: false,\n userId: userId,\n msgId: msgId,\n badges: badges.badges,\n emotes: emotes,\n },\n renderedText: renderedText,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'cheer':\n case 'cheer-latest': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(100, 10000);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(Data.normal_messages.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Cheer & {\n event: { provider: Provider };\n } = {\n listener: 'cheer-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n message: message,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'cheer',\n originalEventName: 'cheer-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'follower':\n case 'follower-latest': {\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Follower & {\n event: { provider: Provider };\n } = {\n listener: 'follower-latest',\n event: {\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'follower',\n originalEventName: 'follower-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'raid':\n case 'raid-latest': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(1, 100);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Raid & {\n event: { provider: Provider };\n } = {\n listener: 'raid-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'raid',\n originalEventName: 'raid-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var tier =\n (options?.tier as string) ??\n new RandomHelper().array(['1000', '2000', '3000', 'prime'])[0];\n var amount = (options?.amount as number) ?? new RandomHelper().number(1, 24);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var sender =\n (options?.sender as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length && e !== name))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(Data.normal_messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as StreamElements.Event.Provider.Twitch.gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as StreamElements.Event.Provider.Twitch.community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as StreamElements.Event.Provider.Twitch.spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? new RandomHelper().array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: StreamElements.Event.Provider.Twitch.Subscriber & {\n event: { provider: Provider };\n } = {\n listener: 'subscriber-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n tier: tier as StreamElements.Event.Provider.Twitch.SubscriberTier,\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'delete-message': {\n const event: StreamElements.Event.Provider.Twitch.DeleteMessage & {\n event: { provider: Provider };\n } = {\n listener: 'delete-message',\n event: {\n msgId: (options?.id as string) ?? new RandomHelper().uuid(),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'delete-messages': {\n const event: StreamElements.Event.Provider.Twitch.DeleteMessages & {\n event: { provider: Provider };\n } = {\n listener: 'delete-messages',\n event: {\n userId:\n (options?.id as string) ?? new RandomHelper().number(10000000, 99999999).toString(),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'event': {\n const type = options?.type as StreamElements.Event.Provider.Twitch.Event['event']['type'];\n\n switch (type) {\n case 'channelPointsRedemption': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(1, 100);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(Data.normal_messages.filter((e) => e.length))[0];\n var redemption =\n (options?.redemption as string) ??\n new RandomHelper().array([\n 'Highlight Message',\n 'Send a Shoutout',\n 'Drink Water',\n ])[0];\n var quantity = (options?.quantity as number) ?? 1;\n var providerId = (options?.providerId as string) ?? new RandomHelper().uuid();\n var id = (options?.id as string) ?? new RandomHelper().uuid();\n var channel =\n (options?.channel as string) ??\n (options?.broadcaster as string) ??\n (options?.streamer as string) ??\n usedClients?.[0]?.details?.user?.username ??\n 'local';\n var activityId = (options?.activityId as string) ?? new RandomHelper().uuid();\n var time = (options?.time as number) ?? Date.now();\n\n const event: StreamElements.Event.Provider.Twitch.Event = {\n listener: 'event',\n event: {\n type: 'channelPointsRedemption',\n _id: id,\n provider: 'twitch',\n flagged: false,\n channel: channel,\n createdAt: new Date(time).toISOString(),\n expiresAt: new Date(time + 3600000).toISOString(),\n updatedAt: new Date(time).toISOString(),\n activityId: activityId,\n sessionEventsCount: 1,\n isMock: true,\n data: {\n amount: amount,\n username: name.toLowerCase(),\n displayName: name,\n providerId: providerId,\n avatar: avatar,\n message: message,\n quantity: quantity,\n redemption: redemption,\n },\n },\n };\n\n return event;\n\n break;\n }\n case 'cheer': {\n break;\n }\n case 'follower': {\n break;\n }\n case 'subscriber': {\n break;\n }\n }\n\n break;\n }\n }\n }\n\n case 'streamelements': {\n switch (\n type as\n | StreamElements.Event.Provider.StreamElements.Events['listener']\n | 'random'\n | 'tip'\n | 'mute'\n | 'unmute'\n | 'skip'\n ) {\n default:\n case 'random': {\n var randomEvent = new RandomHelper().array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return onEventReceived(provider, randomEvent);\n }\n case 'tip':\n case 'tip-latest': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(100, 4000);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.StreamElements.Tip & {\n event: { provider: Provider };\n } = {\n listener: 'tip-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'tip',\n originalEventName: 'tip-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'kvstore:update': {\n const event: StreamElements.Event.Provider.StreamElements.KVStore & {\n event: { provider: Provider };\n } = {\n listener: 'kvstore:update',\n event: {\n data: {\n key: `customWidget.${(options?.key as string) ?? 'sampleKey'}`,\n value: (options?.value as string) ?? 'sampleValue',\n },\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'bot:counter': {\n const event: StreamElements.Event.Provider.StreamElements.BotCounter & {\n event: { provider: Provider };\n } = {\n listener: 'bot:counter',\n event: {\n counter: (options?.counter as string) ?? 'sampleCounter',\n value: (options?.value as number) ?? new RandomHelper().number(0, 100),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'mute':\n case 'unmute':\n case 'alertService:toggleSound': {\n var muted =\n (options?.muted as boolean) ?? usedClients?.[0]?.details?.overlay?.muted ?? false;\n\n const event: StreamElements.Event.Provider.StreamElements.AlertService & {\n event: { provider: Provider };\n } = {\n listener: 'alertService:toggleSound',\n event: {\n muted,\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'skip':\n case 'event:skip': {\n const event: StreamElements.Event.Provider.StreamElements.EventSkip & {\n event: { provider: Provider };\n } = {\n listener: 'event:skip',\n event: {\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n\n case 'youtube': {\n switch (\n type as\n | StreamElements.Event.Provider.YouTube.Events['listener']\n | 'random'\n | 'message'\n | 'superchat'\n | 'subscriber'\n | 'sponsor'\n ) {\n default:\n case 'random': {\n var randomEvent = new RandomHelper().array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return onEventReceived(provider, randomEvent);\n }\n case 'message': {\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(\n [...Data.youtube_messages, ...Data.normal_messages].filter((e) => e.length),\n )[0];\n\n const badges = await new MessageHelper().generateBadges(\n (options?.badges as BadgeOptions) ?? [],\n provider,\n );\n\n var emotes = new MessageHelper().findEmotesInText(message);\n var renderedText = new MessageHelper().replaceEmotesWithHTML(message, emotes);\n\n var color = (options?.color as string) ?? new RandomHelper().color('hex');\n var userId =\n (options?.userId as string) ?? new RandomHelper().number(10000000, 99999999).toString();\n var msgId = (options?.msgId as string) ?? new RandomHelper().uuid();\n var time = (options?.time as number) ?? Date.now();\n\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n\n var channel =\n (options?.channel as string) ?? usedClients?.[0]?.details?.user?.username ?? 'local';\n\n const event: StreamElements.Event.Provider.YouTube.Message = {\n listener: 'message',\n event: {\n service: provider,\n data: {\n kind: '',\n etag: '',\n id: '',\n snippet: {\n type: '',\n liveChatId: '',\n authorChannelId: channel,\n publishedAt: new Date().toISOString(),\n hasDisplayContent: true,\n displayMessage: message,\n textMessageDetails: {\n messageText: message,\n },\n },\n authorDetails: {\n channelId: channel,\n channelUrl: '',\n displayName: name,\n profileImageUrl: avatar,\n ...badges,\n },\n msgId: msgId,\n userId: userId,\n nick: name.toLowerCase(),\n badges: [],\n displayName: name,\n isAction: false,\n time: time,\n tags: [],\n displayColor: color,\n channel: channel,\n text: message,\n avatar: avatar,\n emotes: [],\n },\n renderedText: message,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.YouTube.Subscriber & {\n event: { provider: Provider };\n } = {\n listener: 'subscriber-latest',\n event: {\n avatar,\n displayName: name,\n name: name.toLowerCase(),\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'superchat':\n case 'superchat-latest': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(100, 4000);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.YouTube.Superchat & {\n event: { provider: Provider };\n } = {\n listener: 'superchat-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'sponsor':\n case 'sponsor-latest': {\n var tier =\n (options?.tier as string) ?? new RandomHelper().array(['1000', '2000', '3000'])[0];\n var amount = (options?.amount as number) ?? new RandomHelper().number(1, 24);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var sender =\n (options?.sender as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length && e !== name))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(Data.normal_messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as StreamElements.Event.Provider.YouTube.gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as StreamElements.Event.Provider.YouTube.community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as StreamElements.Event.Provider.YouTube.spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? new RandomHelper().array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: StreamElements.Event.Provider.YouTube.Sponsor & {\n event: { provider: Provider };\n } = {\n listener: 'sponsor-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'sponsor',\n originalEventName: 'sponsor-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n }\n}\n\nexport class Generator {\n event = { onWidgetLoad, onSessionUpdate, onEventReceived };\n session = {\n types: {\n name: { type: 'string', options: Data.names.filter((e) => e.length) },\n tier: { type: 'string', options: Data.tiers.filter((e) => e.length) },\n message: { type: 'string', options: Data.normal_messages.filter((e) => e.length) },\n item: { type: 'array', options: Data.items },\n avatar: { type: 'string', options: Data.avatars.filter((e) => e.length) },\n } as Record<string, StreamElements.Session.Config.Any>,\n\n available(): StreamElements.Session.Config.Available.Data {\n const types = this.types;\n\n return {\n follower: {\n latest: { name: types.name },\n session: { count: { type: 'int', min: 50, max: 200 } },\n week: { count: { type: 'int', min: 200, max: 1000 } },\n month: { count: { type: 'int', min: 1000, max: 3000 } },\n goal: { amount: { type: 'int', min: 3000, max: 7000 } },\n total: { count: { type: 'int', min: 7000, max: 10000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: { name: types.name, createdAt: { type: 'date', range: 400 } },\n },\n },\n subscriber: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n message: types.message,\n },\n 'new-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'resub-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'gifted-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n tier: types.tier,\n sender: types.name,\n },\n session: { count: { type: 'int', min: 10, max: 40 } },\n 'new-session': { count: { type: 'int', min: 10, max: 40 } },\n 'resub-session': { count: { type: 'int', min: 10, max: 40 } },\n 'gifted-session': { count: { type: 'int', min: 10, max: 40 } },\n week: { count: { type: 'int', min: 40, max: 100 } },\n month: { count: { type: 'int', min: 100, max: 200 } },\n goal: { amount: { type: 'int', min: 200, max: 300 } },\n total: { count: { type: 'int', min: 300, max: 400 } },\n points: { amount: { type: 'int', min: 100, max: 400 } },\n 'alltime-gifter': { name: types.name, amount: { type: 'int', min: 300, max: 400 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n host: {\n latest: { name: types.name, amount: { type: 'int', min: 1, max: 10 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 1, max: 10 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n raid: {\n latest: { name: types.name, amount: { type: 'int', min: 0, max: 100 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n charityCampaignDonation: {\n latest: { name: types.name, amount: { type: 'int', min: 50, max: 150 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 50, max: 200 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 500 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 800 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1000 },\n },\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 50, max: 200 } },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 500 } },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 800 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1000 },\n },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 50, max: 150 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheer: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 800 },\n message: types.message,\n },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 1000 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 5000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 5000, max: 12000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 12000, max: 20000 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 1000 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 5000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 5000, max: 12000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 12000, max: 20000 },\n },\n session: { amount: { type: 'int', min: 200, max: 1000 } },\n week: { amount: { type: 'int', min: 1000, max: 5000 } },\n month: { amount: { type: 'int', min: 5000, max: 12000 } },\n goal: { amount: { type: 'int', min: 12000, max: 18000 } },\n total: { amount: { type: 'int', min: 18000, max: 20000 } },\n count: { count: { type: 'int', min: 200, max: 1000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 800 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheerPurchase: {\n latest: { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 400, max: 800 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1500 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1500, max: 2000 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 400, max: 800 } },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1500 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1500, max: 2000 },\n },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n superchat: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n hypetrain: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n active: { type: 'int', min: 0, max: 1 },\n level: { type: 'int', min: 5, max: 10 },\n levelChanged: { type: 'int', min: 0, max: 5 },\n _type: { type: 'array', options: ['follower', 'subscriber', 'cheer', 'donation'] },\n },\n 'level-goal': { amount: { type: 'int', min: 0, max: 100 } },\n 'level-progress': {\n amount: { type: 'int', min: 0, max: 100 },\n percent: { type: 'int', min: 0, max: 100 },\n },\n total: { amount: { type: 'int', min: 0, max: 100 } },\n 'latest-top-contributors': { type: 'recent', amount: 25, value: { name: types.name } },\n },\n 'channel-points': {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n message: types.message,\n redemption: { type: 'array', options: ['Reward 1', 'Reward 2', 'Reward 3'] },\n },\n },\n tip: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n merch: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n items: types.item,\n },\n 'goal-orders': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-items': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-total': { amount: { type: 'int', min: 0, max: 100 } },\n recent: { type: 'recent', amount: 25, value: { name: types.name } },\n },\n purchase: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n items: types.item,\n avatar: types.avatar,\n message: types.message,\n },\n },\n };\n },\n\n async get(startSession?: StreamElements.Session.Data): Promise<StreamElements.Session.Data> {\n const available = this.available();\n\n if (startSession) return startSession;\n\n const generate = (\n available:\n | StreamElements.Session.Config.Available.Data\n | StreamElements.Session.Config.Available.Category\n | StreamElements.Session.Config.Any,\n ): any => {\n const generateRecentData = (config: StreamElements.Session.Config.Any): Array<any> => {\n if (!config || !('amount' in config)) return [];\n\n const items: Array<{ createdAt: string }> = [];\n\n for (let i = 0; i < config.amount; i++) {\n items.push(generate(config.value));\n }\n\n return items.sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n };\n\n const generateObjectData = (config: Record<string, any>): Record<string, any> => {\n const result: Record<string, any> = {};\n\n for (const key in config) {\n const processedKey = key.replace('_type', 'type');\n\n result[processedKey] = generate(config[key]);\n }\n\n return result;\n };\n\n const processTypedConfig = (config: StreamElements.Session.Config.Any): any => {\n if (!config) return config;\n\n switch (config.type) {\n case 'int':\n return new RandomHelper().number(config.min, config.max);\n case 'string':\n return new RandomHelper().array(config.options)[0];\n case 'date':\n return new RandomHelper().daysOffset(config.range);\n case 'array':\n return new RandomHelper().array(config.options)[0];\n case 'recent':\n return generateRecentData(config);\n default:\n return config;\n }\n };\n\n // Main generation logic\n\n // Handle primitive values (non-objects)\n if (typeof available !== 'object' || available === null) {\n return available;\n }\n\n // Handle typed configurations (objects with a 'type' property)\n if ('type' in available && typeof available.type === 'string') {\n return processTypedConfig(available);\n }\n\n // Handle generic objects - recursively process each property\n return generateObjectData(available);\n };\n\n var session: StreamElements.Session.Data = Object.entries(generate(available)).reduce(\n (acc, [key, value]) => {\n Object.entries(value as any).forEach(\n ([subKey, subValue]) =>\n //\n (acc[`${key}-${subKey}`] = subValue),\n );\n\n return acc;\n },\n {} as Record<string, any>,\n ) as StreamElements.Session.Data;\n\n return session;\n },\n };\n}\n\nexport const generate = new Generator();\n","import { Helper } from '../helper/index.js';\nimport { usedClients } from '../internal.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { StreamElements } from '../types.js';\nimport { generate } from './generator.js';\n\nexport type localQueueItem =\n | { listener: 'onEventReceived'; data: StreamElements.Event.onEventReceived; session?: boolean }\n | { listener: 'onWidgetLoad'; data: StreamElements.Event.onWidgetLoad }\n | { listener: 'onSessionUpdate'; data: StreamElements.Event.onSessionUpdate };\n\n/**\n * Processes local emulator events one at a time.\n * Each event is dispatched on `window`, and session-aware\n * `onEventReceived` events also emit an `onSessionUpdate`.\n */\nexport const localQueue = new useQueue<localQueueItem>({\n duration: 'client',\n processor: async function processor(received) {\n window.dispatchEvent(new CustomEvent(received.listener, { detail: received.data }));\n\n if (received.listener === 'onEventReceived' && received.session) {\n const sessionEvent = await generate.event.onSessionUpdate(\n usedClients?.[0] ? usedClients[0].session : undefined,\n Helper.event.parseProvider(received.data),\n );\n\n window.dispatchEvent(new CustomEvent('onSessionUpdate', { detail: sessionEvent }));\n }\n },\n});\n","import { usedClients } from '../internal.js';\nimport { localQueue } from '../local/queue.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { StreamElements } from '../types/streamelements/main.js';\n\nexport const LOCAL_SE_API: StreamElements.SE_API & {\n store: { list: Record<string, any> };\n events: { history: Array<{ detail: any; timestamp: number; origin?: string }> };\n} = {\n responses: {} as Record<string, any>,\n\n sendMessage(message: string, data: Record<string, any> = {}) {\n return new Promise((resolve, reject) => {\n const response = 'resp_' + Math.random().toString(36).substring(2, 15);\n\n data.response = response;\n data.request = message;\n\n SE_API.responses[response] = { resolve, reject };\n\n parent?.postMessage(data, '*');\n });\n },\n\n counters: {\n get(key: string): number | null {\n return null;\n },\n },\n\n store: {\n set: function (name: string, obj: any) {\n this.list[name] = obj;\n\n localStorage.setItem('SE_API-STORE', JSON.stringify(LOCAL_SE_API.store.list));\n },\n get: async function (name: string) {\n if (this.list[name]) return this.list[name];\n else return null;\n },\n /** @private */\n list: {} as Record<string, any>,\n },\n\n resumeQueue: () => {\n try {\n if (localQueue instanceof useQueue) {\n localQueue?.resume();\n }\n } catch (error) {\n return { ok: false, error };\n }\n\n return { ok: true };\n },\n\n sanitize(message: string): string {\n return message;\n },\n\n cheerFilter(message: string): string {\n return message;\n },\n\n setField(key: string, value: string | number | boolean | undefined, reload: boolean) {},\n\n getOverlayStatus: () => {\n return {\n isEditorMode: false,\n muted: false,\n };\n },\n\n events: {\n /**\n * Emit a event for all widgets inside the same overlay. This is useful for communicating between widgets.\n * @param event - The name of the event to emit. This can be any string, but it's recommended to use a unique prefix to avoid conflicts with other widgets.\n * @param data - The data to send with the event. This can be any object.\n * @returns An object with an `ok` property indicating whether the event was emitted successfully.\n */\n emit<T extends Record<string, any>>(event: string, data: T) {\n const eventObj = {\n listener: event,\n event: data,\n result: undefined,\n };\n\n const customEvent = new CustomEvent('onEventReceived', { detail: eventObj });\n\n this.history.push({\n detail: eventObj,\n timestamp: customEvent.timeStamp,\n origin: usedClients?.[0]?.id,\n });\n\n localStorage.setItem('SE_API-EVENTS', JSON.stringify(this.history));\n\n return window.dispatchEvent(customEvent) ? { ok: true } : { ok: false };\n },\n /**\n * Broadcast a event to all widgets in all overlays. This is useful for communicating between different overlays.\n * @param event - The name of the event to broadcast. This can be any string, but it's recommended to use a unique prefix to avoid conflicts with other widgets.\n * @param data - The data to send with the event. This can be any object.\n * @returns An object with an `ok` property indicating whether the event was successfully broadcasted.\n */\n broadcast<T extends Record<string, any>>(event: string, data: T): { ok: boolean } {\n const eventObj = {\n listener: event,\n event: data,\n result: undefined,\n };\n\n const customEvent = new CustomEvent('onEventReceived', { detail: eventObj });\n\n this.history.push({\n detail: eventObj,\n timestamp: Date.now(),\n origin: usedClients?.[0]?.id,\n });\n\n localStorage.setItem('SE_API-EVENTS', JSON.stringify(this.history));\n\n return window.dispatchEvent(customEvent) ? { ok: true } : { ok: false };\n },\n\n history: [],\n },\n};\n","import type { StreamElements } from '../types.js';\n\nimport { LOCAL_SE_API } from '../streamelements/api.js';\n\nexport const USE_SE_API: Promise<StreamElements.SE_API> =\n typeof SE_API !== 'undefined' ? Promise.resolve(SE_API) : Promise.resolve(initializeLocalSEAPI());\n\nexport async function initializeLocalSEAPI() {\n let lastStore = localStorage.getItem('SE_API-STORE') ?? '{}';\n let result = lastStore ? JSON.parse(lastStore) : {};\n\n LOCAL_SE_API.store.list = result;\n\n let lastEvents = localStorage.getItem('SE_API-EVENTS') ?? '[]';\n let eventsResult = lastEvents ? JSON.parse(lastEvents) : [];\n\n LOCAL_SE_API.events.history = eventsResult;\n\n return LOCAL_SE_API;\n}\n","import type { JSONObject } from '../types/json.js';\nimport type { PathValue } from '../types/path.js';\nimport type { StreamElements } from '../types/streamelements/main.js';\n\nimport { ObjectHelper } from '../helper/classes/object.js';\nimport { usedStorages } from '../internal.js';\nimport { EventProvider } from './EventProvider.js';\nimport { USE_SE_API } from './SE_API.js';\n\ntype UseStorageEvents<T> = {\n load: [T];\n update: [T, from: string];\n save: [T];\n};\n\ntype UseStorageOptions<T> = {\n /** The unique identifier for the storage instance. */\n id?: string;\n data: T;\n};\n\nexport class useStorage<T extends JSONObject> extends EventProvider<UseStorageEvents<T>> {\n private SE_API: StreamElements.SE_API | null = null;\n\n /** The unique identifier for the storage instance. */\n public id: string = 'default';\n public loaded: boolean = false;\n\n private initial!: T;\n public data!: T;\n\n constructor(options: UseStorageOptions<T>) {\n super();\n\n this.id = options.id || this.id;\n this.data = options.data || ({} as T);\n this.initial = structuredClone(this.data);\n\n usedStorages.push(this);\n\n USE_SE_API?.then((se) => {\n this.SE_API = se;\n\n se!.store\n .get<T>(this.id)\n .then((save) => {\n this.data = save || this.data;\n\n this.loaded = true;\n\n this.emit('load', this.data);\n\n if (JSON.stringify(this.data) !== JSON.stringify(save)) {\n this.emit('update', this.data, 'internal');\n }\n })\n .catch(() => {\n this.loaded = true;\n\n this.emit('load', this.data);\n });\n });\n }\n\n /**\n * Saves the current data to storage.\n * @param data Data to save (defaults to current)\n */\n private save(data: T = this.data): void {\n if (this.loaded && this.SE_API) {\n if (new ObjectHelper().isDiff(this.data, data)) {\n this.data = data;\n\n this.SE_API.store.set<T>(this.id, this.data);\n\n this.emit('save', this.data);\n }\n } else {\n throw new Error('Storage not loaded yet');\n }\n }\n\n /**\n * Updates the storage data and emits an update event\n * @param data Data to update (defaults to current)\n */\n public update(data: Partial<T> = this.data): void {\n if (this.loaded && new ObjectHelper().isDiff(this.data, data)) {\n const newData = { ...this.data, ...data };\n\n this.save(newData);\n\n this.emit('update', newData, 'internal:update');\n } else {\n throw new Error('Storage not loaded yet or data is the same as current');\n }\n }\n\n /**\n * Adds a value to the storage at the specified path.\n * @param path Path to add the value to\n * @param value Value to add\n */\n public add<P extends string>(path: P, value: PathValue<T, P>): void {\n if (!this.loaded) {\n throw new Error('Storage not loaded yet');\n }\n\n let newData = structuredClone(this.data);\n\n newData = new ObjectHelper().updateViaPath(newData, path, value);\n\n this.save(newData);\n\n this.emit('update', newData, 'internal:add');\n }\n\n /**\n * Clears all data from the storage.\n */\n public clear(): void {\n if (this.loaded) {\n this.save(this.initial);\n\n this.emit('update', this.data, 'internal:clear');\n } else {\n throw new Error('Storage not loaded yet');\n }\n }\n\n public override on<K extends keyof UseStorageEvents<T>>(\n eventName: K,\n callback: (this: useStorage<T>, ...args: UseStorageEvents<T>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [this.data] as UseStorageEvents<T>[K]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Button } from '../actions/button.js';\nimport { Command } from '../actions/command.js';\nimport { usedClients } from '../internal.js';\nimport { EventProvider } from '../modules/EventProvider.js';\nimport { useStorage } from '../modules/useStorage.js';\nimport { ClientEventTuple, Provider } from '../types/client.js';\nimport { StreamElements } from '../types/streamelements/main.js';\nimport { Alejo } from '../utils/alejo.js';\n\ntype ClientMapEvents<CustomEvents = {}> = {\n load: [event: StreamElements.Event.onWidgetLoad];\n action: [action: Button | Command, type: 'created' | 'executed' | 'removed'];\n session: [session: StreamElements.Session.Data];\n event: ClientEventTuple<CustomEvents>;\n};\n\nexport type ClientStorageOptions<T> = {\n value: T;\n timestamp: number;\n expire: number;\n};\n\nexport type ClientStorage = {\n user: Record<string, ClientStorageOptions<string>>;\n avatar: Record<string, ClientStorageOptions<string>>;\n pronoun: Record<string, ClientStorageOptions<Alejo.Pronouns.name>>;\n emote: Record<string, ClientStorageOptions<string>>;\n};\n\nexport type ClientOptions = {\n id?: string;\n debug?: boolean | (() => boolean);\n};\n\nexport class Client<CustomEvents = {}> extends EventProvider<ClientMapEvents<CustomEvents>> {\n public id: string = 'default';\n public debug: boolean = false;\n\n public storage!: useStorage<ClientStorage>;\n\n public fields: StreamElements.Event.onWidgetLoad['fieldData'] = {};\n\n public session!: StreamElements.Session.Data;\n\n public loaded: boolean = false;\n\n constructor(options: ClientOptions) {\n super();\n\n this.id = options.id || this.id;\n\n this.storage = new useStorage<ClientStorage>({\n id: this.id,\n data: {\n user: {},\n avatar: {},\n pronoun: {},\n emote: {},\n },\n });\n\n this.on('load', () => {\n this.debug = Boolean(typeof options.debug === 'function' ? options.debug() : options.debug);\n });\n\n usedClients.push(this as Client);\n }\n\n public actions: {\n commands: Command[];\n buttons: Button[];\n } = {\n commands: [],\n buttons: [],\n };\n\n public details!: {\n provider: Provider | 'local';\n user: StreamElements.Event.onWidgetLoad['channel'];\n currency: StreamElements.Event.onWidgetLoad['currency'];\n overlay: StreamElements.Event.onWidgetLoad['overlay'];\n };\n\n public cache: {\n /**\n * Avatar cache duration in minutes.\n */\n avatar: number;\n /**\n * Pronoun cache duration in minutes.\n */\n pronoun: number;\n /**\n * Emote cache duration in minutes.\n */\n emote: number;\n } = {\n avatar: 30,\n pronoun: 60,\n emote: 120,\n };\n\n override on<K extends keyof ClientMapEvents<CustomEvents>>(\n eventName: K,\n callback: (this: Client<CustomEvents>, ...args: ClientMapEvents<CustomEvents>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [\n {\n channel: this.details.user,\n currency: this.details.currency,\n fieldData: this.fields,\n recents: [],\n session: {\n data: this.session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: this.details.overlay,\n emulated: false,\n } as StreamElements.Event.onWidgetLoad,\n ] as unknown as ClientMapEvents<CustomEvents>[K]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { BadgeOptions } from '../helper/classes/message.js';\nimport { StreamElements } from '../types.js';\nimport { generate } from './generator.js';\nimport { localQueue as queue } from './queue.js';\n\nexport class Emulator {\n twitch = {\n message(\n data: Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n firstMsg: boolean;\n returningChatter: boolean;\n reply: {\n msgId: string;\n userId: string;\n login: string;\n name: string;\n text: string;\n };\n thread: {\n msgId: string;\n name: string;\n };\n }> = {},\n ) {\n generate.event\n .onEventReceived('twitch', 'message', data as { [key: string]: any })\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n deleteMessage(msgId: string) {\n if (!msgId || typeof msgId !== 'string') return;\n\n const event: StreamElements.Event.Provider.Twitch.DeleteMessage = {\n listener: 'delete-message',\n event: {\n msgId: msgId,\n },\n };\n\n emulate.send('onEventReceived', event);\n },\n deleteMessages(userId: string) {\n if (!userId || typeof userId !== 'string') return;\n\n const event: StreamElements.Event.Provider.Twitch.DeleteMessages = {\n listener: 'delete-messages',\n event: {\n userId: userId,\n },\n };\n\n emulate.send('onEventReceived', event);\n },\n follower(\n data: Partial<{\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'twitch',\n 'follower-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n raid(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'twitch',\n 'raid-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n cheer(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n message: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'twitch',\n 'cheer-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n subscriber(\n data: Partial<{\n tier: '1000' | '2000' | '3000' | 'prime';\n amount: number;\n avatar: string;\n name: string;\n sender: string;\n message: string;\n subType: 'default' | 'gift' | 'community' | 'spam';\n }> & { subType?: 'default' | 'gift' | 'community' | 'spam' } = {},\n ) {\n generate.event\n .onEventReceived(\n 'twitch',\n 'subscriber-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n };\n streamelements = {\n tip(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'streamelements',\n 'tip-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n };\n youtube = {\n message(\n data: Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n avatar: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived('youtube', 'message', data as { [key: string]: string | number | boolean })\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n subscriber(\n data: Partial<{\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'youtube',\n 'subscriber-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n superchat(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'youtube',\n 'superchat-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n sponsor(\n data: Partial<{\n tier: '1000' | '2000' | '3000';\n amount: number;\n avatar: string;\n name: string;\n sender: string;\n message: string;\n subType: 'default' | 'gift' | 'community' | 'spam';\n }> & { subType?: 'default' | 'gift' | 'community' | 'spam' } = {},\n ) {\n generate.event\n .onEventReceived(\n 'youtube',\n 'sponsor-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n };\n\n kick = {};\n facebook = {};\n\n send<T extends 'onEventReceived' | 'onSessionUpdate' | 'onWidgetLoad'>(\n listener: T,\n event: T extends 'onEventReceived'\n ? StreamElements.Event.onEventReceived\n : T extends 'onSessionUpdate'\n ? StreamElements.Event.onSessionUpdate\n : StreamElements.Event.onWidgetLoad,\n ): void {\n if (!queue) {\n console.warn('Local queue is not initialized.');\n\n window.dispatchEvent(new CustomEvent(listener, { detail: event }));\n\n return;\n }\n\n switch (listener) {\n case 'onEventReceived': {\n queue.enqueue({\n listener,\n data: event as StreamElements.Event.onEventReceived,\n session: listener === 'onEventReceived' ? true : undefined,\n });\n\n break;\n }\n case 'onSessionUpdate': {\n queue.enqueue({\n listener,\n data: event as StreamElements.Event.onSessionUpdate,\n });\n\n break;\n }\n case 'onWidgetLoad': {\n queue.enqueue({\n listener,\n data: event as StreamElements.Event.onWidgetLoad,\n });\n\n break;\n }\n }\n }\n}\n\nexport const emulate = new Emulator();\n","import { StreamElements } from '../types/streamelements/main.js';\nimport { emulate as Emulator } from './emulator.js';\nimport { generate as Generator } from './generator.js';\nimport { localQueue, localQueueItem } from './queue.js';\n\nexport namespace Local {\n export type QueueItem = localQueueItem;\n\n export const queue = localQueue;\n export const generate = Generator;\n export const emulate = Emulator;\n\n export async function start(\n fieldsFile: string[] = ['fields.json', 'cf.json', 'field.json', 'customfields.json'],\n dataFiles: string[] = ['data.json', 'fielddata.json', 'fd.json', 'DATA.json'],\n session?: StreamElements.Session.Data,\n ) {\n const localFiles = {\n fields: fieldsFile.find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n data: dataFiles.find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n };\n\n const data: Record<string, string | number | boolean> = await fetch(\n './' + (localFiles.data ?? 'data.json'),\n {\n cache: 'no-store',\n },\n )\n .then((res) => res.json())\n .catch(() => ({}));\n\n await fetch('./' + (localFiles.fields ?? 'fields.json'), {\n cache: 'no-store',\n })\n .then((res) => res.json())\n .then(async (customfields: Record<string, StreamElements.CustomField.Schema>) => {\n const fields = Object.entries(customfields)\n .filter(([_, { value }]) => value != undefined)\n .reduce(\n (acc, [key, { value }]) => {\n if (data && data[key] !== undefined) value = data[key];\n\n acc[key] = value;\n\n return acc;\n },\n {\n ...data,\n } as Record<string, StreamElements.CustomField.Value>,\n );\n\n const load = await Local.generate.event.onWidgetLoad(\n fields,\n await Local.generate.session.get(session),\n );\n\n window.dispatchEvent(new CustomEvent('onWidgetLoad', { detail: load }));\n });\n }\n}\n","import { Data } from '../data/index.js';\nimport { RandomHelper } from '../helper/classes/random.js';\nimport { UtilsHelper } from '../helper/classes/utils.js';\nimport { fakeUserPools } from '../internal.js';\nimport { Local } from '../local/index.js';\nimport { StreamElements, Twitch } from '../types.js';\nimport { EventProvider } from './EventProvider.js';\n\nexport class FakeUser {\n public readonly id!: string;\n public readonly name!: string;\n public readonly login!: string;\n\n public badges: Twitch.tags[] = [];\n public isSubscriber: boolean = false;\n public tier?: StreamElements.Event.Provider.Twitch.SubscriberTier;\n\n constructor(\n id: string,\n name: string,\n badges: Twitch.tags[] = [],\n isSubscriber: boolean = false,\n tier?: StreamElements.Event.Provider.Twitch.SubscriberTier,\n ) {\n this.id = id;\n this.name = name;\n this.login = name.toLocaleLowerCase();\n this.badges = badges;\n this.isSubscriber = isSubscriber;\n this.tier = tier;\n }\n}\n\nexport interface FakeUserPoolOptions {\n id?: string;\n names?: string[];\n badges?: Twitch.tags[];\n minimumBadgesPerUser?: number;\n limits?: {\n [key in Twitch.tags]?: number;\n };\n fixed?: {\n [key in Twitch.tags]?: string | string[];\n };\n incompatible?: {\n [key in Twitch.tags]?: Twitch.tags | Twitch.tags[];\n };\n}\n\ntype FakeUserPoolEvents = {\n warn: [warning: Error];\n};\n\nexport const defaultIncompatibleBadges: FakeUserPoolOptions['incompatible'] = {\n broadcaster: ['moderator', 'vip', 'artist-badge'],\n moderator: ['lead_moderator'],\n no_video: ['no_audio'],\n '60-seconds_1': ['60-seconds_2', '60-seconds_3'],\n duelyst_1: ['duelyst_2', 'duelyst_3', 'duelyst_4', 'duelyst_5', 'duelyst_6', 'duelyst_7'],\n};\n\nexport const MAX_BADGES_PER_USER = 3;\n\nexport class FakeUserPool extends EventProvider<FakeUserPoolEvents> {\n public readonly users: FakeUser[] = [];\n public readonly id: string;\n\n private readonly byId: Map<string, FakeUser> = new Map();\n private readonly byName: Map<string, FakeUser> = new Map();\n private readonly byBadge: Map<Twitch.tags, FakeUser[]> = new Map();\n\n private static fixUser(user: string | FakeUser): string {\n if (typeof user === 'string') return user.trim().replace(/^@+/, '').toLocaleLowerCase();\n\n return FakeUserPool.fixUser(user.name);\n }\n\n private static getRandomSubTier(): StreamElements.Event.Provider.Twitch.SubscriberTier {\n const utils = new UtilsHelper();\n\n return (\n utils.probability({\n prime: 0.4,\n '1000': 0.3,\n '2000': 0.2,\n '3000': 0.1,\n } as {\n [key in StreamElements.Event.Provider.Twitch.SubscriberTier]: number;\n }) ?? 'prime'\n );\n }\n\n constructor(options?: FakeUserPoolOptions) {\n super();\n\n this.id = options?.id || `fake_user_pool_${Math.random().toString(36).slice(2, 10)}`;\n\n this.users = this.start(options?.names || Data.names, options?.badges, options);\n this.byId = new Map(this.users.map((user) => [user.id, user]));\n this.byName = new Map(this.users.map((user) => [user.login, user]));\n this.byBadge = new Map(\n this.users.reduce((acc, user) => {\n for (const badge of user.badges) {\n const existing = acc.get(badge) ?? [];\n acc.set(badge, [...existing, user]);\n }\n return acc;\n }, new Map<Twitch.tags, FakeUser[]>()),\n );\n\n fakeUserPools.push(this);\n }\n\n private start(\n names: string[],\n badges: Twitch.tags[] = Data.badges.map((e) => e.set_id) as Twitch.tags[],\n options?: Omit<FakeUserPoolOptions, 'badges'>,\n ): FakeUser[] {\n const normalizedNames = names\n .map((name) => name && FakeUserPool.fixUser(name))\n .filter((name) => name && name.length)\n // remove duplicates\n .filter((name, index, self) => self.indexOf(name) === index);\n\n const badgePool = badges.filter((badge, index, self) => self.indexOf(badge) === index);\n\n if (!badgePool.length || !normalizedNames.length) {\n return [];\n }\n\n const users: FakeUser[] = [];\n const minimumBadgesPerUser =\n typeof options?.minimumBadgesPerUser === 'number' && options.minimumBadgesPerUser >= 0\n ? Math.floor(options.minimumBadgesPerUser)\n : 1;\n const targetBadgesPerUser = Math.min(minimumBadgesPerUser, MAX_BADGES_PER_USER);\n const limits = options?.limits ?? {};\n const fixed = options?.fixed ?? {};\n const badgeSet = new Set(badgePool);\n const usage = new Map<Twitch.tags, number>();\n const fixedNameToBadges = new Map<string, Twitch.tags[]>();\n const remainingFixedDemand = new Map<Twitch.tags, number>();\n const incompatibleBadges = new Map<Twitch.tags, Set<Twitch.tags>>();\n let badgeCursor = 0;\n\n const getLimit = (badge: Twitch.tags): number => {\n const value = limits[badge];\n\n return typeof value === 'number' && value > 0 ? value : Number.POSITIVE_INFINITY;\n };\n\n const registerBadgeUsage = (badge: Twitch.tags): void => {\n const current = usage.get(badge) ?? 0;\n usage.set(badge, current + 1);\n };\n\n const decrementFixedDemand = (badge: Twitch.tags): void => {\n const current = remainingFixedDemand.get(badge) ?? 0;\n\n if (current <= 1) {\n remainingFixedDemand.delete(badge);\n return;\n }\n\n remainingFixedDemand.set(badge, current - 1);\n };\n\n const normalizeUserNames = (value: string | string[] | undefined): string[] => {\n if (!value) return [];\n\n if (typeof value === 'string') {\n return [FakeUserPool.fixUser(value)].filter((name): name is string => Boolean(name));\n }\n\n if (Array.isArray(value)) {\n return value.map(FakeUserPool.fixUser).filter((name): name is string => Boolean(name));\n }\n\n return [];\n };\n\n const normalizeBadges = (value: Twitch.tags | Twitch.tags[] | undefined): Twitch.tags[] => {\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n return [value];\n };\n\n const mergeIncompatibleBadges = (\n base: FakeUserPoolOptions['incompatible'],\n extra: FakeUserPoolOptions['incompatible'],\n ): Map<Twitch.tags, Twitch.tags[]> => {\n const merged = new Map<Twitch.tags, Twitch.tags[]>();\n\n for (const source of [base, extra]) {\n for (const [badge, value] of Object.entries(source ?? {}) as Array<\n [Twitch.tags, Twitch.tags | Twitch.tags[] | undefined]\n >) {\n const existing = merged.get(badge) ?? [];\n const nextValues = normalizeBadges(value);\n\n merged.set(badge, [...new Set([...existing, ...nextValues])]);\n }\n }\n\n return merged;\n };\n\n const registerIncompatiblePair = (left: Twitch.tags, right: Twitch.tags): void => {\n if (left === right) {\n return;\n }\n\n const leftSet = incompatibleBadges.get(left) ?? new Set<Twitch.tags>();\n leftSet.add(right);\n incompatibleBadges.set(left, leftSet);\n\n const rightSet = incompatibleBadges.get(right) ?? new Set<Twitch.tags>();\n rightSet.add(left);\n incompatibleBadges.set(right, rightSet);\n };\n\n const isCompatibleWithAssignedBadges = (\n badge: Twitch.tags,\n assignedBadges: Twitch.tags[],\n ): boolean => {\n if (assignedBadges.includes(badge)) {\n return false;\n }\n\n return assignedBadges.every((assignedBadge) => {\n const conflicts = incompatibleBadges.get(assignedBadge);\n\n return !conflicts?.has(badge);\n });\n };\n\n const canUseBadgeForExtras = (badge: Twitch.tags, assignedBadges: Twitch.tags[]): boolean => {\n if (!isCompatibleWithAssignedBadges(badge, assignedBadges)) {\n return false;\n }\n\n const max = getLimit(badge);\n const current = usage.get(badge) ?? 0;\n const reserved = remainingFixedDemand.get(badge) ?? 0;\n\n return current < max && current + reserved < max;\n };\n\n const canUseBadgeForFixed = (badge: Twitch.tags, assignedBadges: Twitch.tags[]): boolean => {\n if (!isCompatibleWithAssignedBadges(badge, assignedBadges)) {\n return false;\n }\n\n const max = getLimit(badge);\n const current = usage.get(badge) ?? 0;\n\n return current < max;\n };\n\n const nextAvailableBadge = (assignedBadges: Twitch.tags[]): Twitch.tags | null => {\n for (let step = 0; step < badgePool.length; step++) {\n const badge = badgePool[(badgeCursor + step) % badgePool.length];\n\n if (canUseBadgeForExtras(badge, assignedBadges)) {\n badgeCursor = (badgeCursor + step + 1) % badgePool.length;\n return badge;\n }\n }\n\n return null;\n };\n\n for (const [badge, value] of mergeIncompatibleBadges(\n defaultIncompatibleBadges,\n options?.incompatible,\n )) {\n if (!badgeSet.has(badge)) {\n continue;\n }\n\n for (const conflictingBadge of normalizeBadges(value)) {\n if (!badgeSet.has(conflictingBadge)) {\n continue;\n }\n\n registerIncompatiblePair(badge, conflictingBadge);\n }\n }\n\n for (const badge of badgePool) {\n const namesForBadge = normalizeUserNames(fixed[badge]);\n\n for (const fixedName of namesForBadge) {\n const existingBadges = fixedNameToBadges.get(fixedName) ?? [];\n\n if (!existingBadges.includes(badge)) {\n fixedNameToBadges.set(fixedName, [...existingBadges, badge]);\n }\n }\n }\n\n for (const [badge, value] of Object.entries(fixed) as Array<\n [Twitch.tags, string | string[] | undefined]\n >) {\n if (badgeSet.has(badge)) {\n continue;\n }\n\n const namesForBadge = normalizeUserNames(value);\n\n if (namesForBadge.length) {\n this.emit(\n 'warn',\n new Error(`Fixed badge \"${badge}\" is not available in the current badge pool`),\n );\n }\n }\n\n const resolvedFixedBadges = new Map<string, Twitch.tags[]>();\n\n if (minimumBadgesPerUser > MAX_BADGES_PER_USER) {\n this.emit(\n 'warn',\n new Error(\n `minimumBadgesPerUser exceeds the maximum of ${MAX_BADGES_PER_USER} and was clamped`,\n ),\n );\n }\n\n for (const name of normalizedNames) {\n const badgesForName = fixedNameToBadges.get(name) ?? [];\n const selectedFixedBadges: Twitch.tags[] = [];\n\n for (const badge of badgesForName) {\n if (selectedFixedBadges.length >= MAX_BADGES_PER_USER) {\n this.emit(\n 'warn',\n new Error(\n `User \"${name}\" has more than ${MAX_BADGES_PER_USER} fixed badges; extra badges were ignored`,\n ),\n );\n break;\n }\n\n if (!isCompatibleWithAssignedBadges(badge, selectedFixedBadges)) {\n this.emit(\n 'warn',\n new Error(\n `Fixed badge \"${badge}\" for user \"${name}\" conflicts with another fixed badge and was ignored`,\n ),\n );\n continue;\n }\n\n selectedFixedBadges.push(badge);\n }\n\n resolvedFixedBadges.set(name, selectedFixedBadges);\n\n for (const badge of selectedFixedBadges) {\n remainingFixedDemand.set(badge, (remainingFixedDemand.get(badge) ?? 0) + 1);\n }\n }\n\n for (const name of normalizedNames) {\n const selectedBadges: Twitch.tags[] = [];\n const fixedBadgesForUser = resolvedFixedBadges.get(name) ?? [];\n\n for (const fixedBadge of fixedBadgesForUser) {\n decrementFixedDemand(fixedBadge);\n\n if (!canUseBadgeForFixed(fixedBadge, selectedBadges)) {\n this.emit(\n 'warn',\n new Error(\n `Fixed badge \"${fixedBadge}\" for user \"${name}\" could not be assigned because its limit was reached`,\n ),\n );\n continue;\n }\n\n selectedBadges.push(fixedBadge);\n registerBadgeUsage(fixedBadge);\n }\n\n while (selectedBadges.length < targetBadgesPerUser) {\n const nextBadge = nextAvailableBadge(selectedBadges);\n\n if (!nextBadge) {\n break;\n }\n\n selectedBadges.push(nextBadge);\n registerBadgeUsage(nextBadge);\n }\n\n if (!selectedBadges.length) {\n this.emit('warn', new Error('Not enough badges to assign to users'));\n continue;\n }\n\n if (selectedBadges.length < targetBadgesPerUser) {\n this.emit(\n 'warn',\n new Error(\n `User \"${name}\" could only receive ${selectedBadges.length} badge(s), below the configured minimum of ${targetBadgesPerUser}`,\n ),\n );\n }\n\n const userIndex = users.length + 1;\n const isSubscriber = selectedBadges.some((badge) =>\n ['subscriber'].includes(String(badge).toLocaleLowerCase()),\n );\n\n const user = new FakeUser(\n `fake_user_${userIndex.toString().padStart(2, '0')}_${Math.random().toString(36).slice(2, 8)}+${this.id}`,\n name,\n selectedBadges,\n isSubscriber,\n isSubscriber ? FakeUserPool.getRandomSubTier() : undefined,\n );\n\n users.push(user);\n }\n\n if (users.length < normalizedNames.length) {\n this.emit(\n 'warn',\n new Error(\n 'Some users could not be assigned badges due to limits. Consider increasing limits or adding more badges.',\n ),\n );\n }\n\n return users;\n }\n\n public pick(): FakeUser | null {\n if (!this.users.length) {\n return null;\n }\n\n return new RandomHelper().array(this.users)[0];\n }\n\n public getByName(name: string): FakeUser | null {\n const key = FakeUserPool.fixUser(name);\n return this.byName.get(key) ?? null;\n }\n\n public getById(id: string): FakeUser | null {\n return this.byId.get(id) ?? null;\n }\n\n public getByBadge(badge: Twitch.tags): FakeUser[] {\n return this.byBadge.get(badge) ?? [];\n }\n\n public getToReply(\n target: { id?: string; name?: string },\n extend?: Partial<Twitch.Reply>,\n ): Twitch.Reply | null {\n let user: FakeUser | null = null;\n\n if (target?.id) {\n user = this.getById(target.id);\n }\n\n if (!user && target?.name) {\n user = this.getByName(target.name);\n }\n\n if (!user) {\n return null;\n }\n\n return {\n msgId: `fake_msg_${Math.random().toString(36).slice(2, 10)}`,\n userId: user.id,\n userLogin: user.login,\n displayName: user.name,\n msgBody: `This is a fake reply from ${user.name}`,\n ...extend,\n };\n }\n\n public buildTwitchMessage(\n messages: string[] = Data.twitch_messages,\n ): Parameters<(typeof Local)['emulate']['twitch']['message']>[0] {\n const user = this.pick();\n\n if (!user) {\n this.emit('warn', new Error('No users available to build a Twitch message'));\n return;\n }\n\n return {\n userId: user.id,\n name: user.name,\n badges: user.badges,\n message: new RandomHelper().array(messages)[0],\n };\n }\n\n public buildYouTubeMessage(\n messages: string[] = Data.youtube_messages,\n ): Parameters<(typeof Local)['emulate']['youtube']['message']>[0] {\n const user = this.pick();\n\n if (!user) {\n this.emit('warn', new Error('No users available to build a YouTube message'));\n return;\n }\n\n return {\n userId: user.id,\n name: user.name,\n badges: user.badges,\n message: new RandomHelper().array(messages)[0],\n };\n }\n}\n","import { usedComms } from '../internal.js';\nimport { StreamElements } from '../types/index.js';\nimport { EventProvider } from './EventProvider.js';\nimport { USE_SE_API } from './SE_API.js';\n\ntype MessageMap = Record<string, any>;\n\ntype MessageTuple<T extends MessageMap> = {\n [K in keyof T]: [key: K, data: T[K]];\n}[keyof T];\n\ntype BaseEvents<T extends MessageMap> = {\n load: [];\n message: MessageTuple<T>;\n};\n\ntype UseCommsOptions = {\n id?: string;\n};\n\ntype UseCommItem<T extends MessageMap> = {\n nonce: string;\n key: keyof T;\n value: T[keyof T];\n timestamp: string;\n};\n\n/**\n * A module for handling communications between different widgets inside streamelements.\n * @example\n * ```ts\n * type CommsMessages = {\n * hello: { loaded: boolean };\n * update: { value: number };\n * reload: {};\n * tags: string[];\n * }\n *\n * const comms = new useComms<CommsMessages>();\n *\n * comms.on('message', (message, data) => {\n * switch (message) {\n * case 'hello': {}\n * case 'update': {}\n * case 'reload': {}\n * case 'tags': {}\n * }\n * })\n * ```\n */\nexport class useComms<T extends MessageMap> extends EventProvider<BaseEvents<T>> {\n private SE_API: StreamElements.SE_API | null = null;\n\n public id: string = 'widget communications';\n public loaded: boolean = false;\n\n public history: Array<UseCommItem<T>> = [];\n public detected = new Set<string>();\n\n constructor(options: UseCommsOptions = {}) {\n super();\n\n this.id = options.id || this.id;\n\n usedComms.push(this);\n\n USE_SE_API?.then(async (se) => {\n this.loaded = true;\n this.SE_API = se;\n\n Promise.all([\n async () => {\n const history = await se.store.get<Array<UseCommItem<T>>>(this.id);\n\n if (history) {\n this.history = history.slice(-10);\n }\n },\n async () => {\n const detected = await se.store.get<string[]>(this.id + '_detected');\n\n if (detected) {\n this.detected = new Set(detected);\n }\n },\n ]);\n });\n }\n\n public async send<K extends keyof T>(key: K, data: T[K]) {\n if (this.SE_API) {\n // this.SE_API.store.set(this.id, { message: key, data });\n\n const message = {\n nonce: Math.random().toString(36).substring(2),\n key,\n value: data,\n timestamp: new Date().toISOString(),\n };\n\n this.history.push(message);\n\n this.SE_API.store.set(this.id, this.history);\n this.SE_API.store.set(this.id + '_detected', Array.from(this.detected));\n }\n }\n\n public update(history: Array<UseCommItem<T>>) {\n if (!history.length) {\n return;\n }\n\n this.history = history;\n\n const messages = history.filter((message) => !this.detected.has(message.nonce));\n\n messages.forEach((message) => {\n this.detected.add(message.nonce);\n\n this.emit('message', message.key, message.value);\n });\n }\n\n public override on<K extends keyof BaseEvents<T>>(\n eventName: K,\n callback: (this: useComms<T>, ...args: BaseEvents<T>[K]) => void,\n ) {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","interface Theme {\n color?: string;\n background?: string;\n bold?: boolean;\n italic?: boolean;\n fontSize?: number;\n icon?: string;\n}\n\ninterface Options {\n enabled?: boolean;\n prefix?: string | (() => string);\n}\n\ntype LogMethod = (...args: unknown[]) => void;\n\nexport class useLogger {\n public enabled: boolean;\n public prefix: string | (() => string);\n\n constructor(options: Options = {}) {\n this.enabled = options.enabled ?? true;\n this.prefix = options.prefix ?? '';\n }\n\n public apply(theme: Theme): LogMethod {\n const style = this.style(theme);\n const icon = theme.icon ? `${theme.icon} ` : '';\n\n return (...args: unknown[]): void => {\n if (!this.enabled || typeof console === 'undefined') return;\n\n let prefix: string = '';\n\n if (typeof this.prefix === 'function') prefix = this.prefix();\n else if (typeof this.prefix === 'string') prefix = this.prefix;\n\n const primitives: unknown[] = [];\n const objects: unknown[] = [];\n\n args.forEach((arg) => {\n if (typeof arg === 'string' || typeof arg === 'number' || typeof arg === 'boolean') {\n primitives.push(arg);\n } else {\n objects.push(arg);\n }\n });\n\n // Log with style\n\n if (primitives.length > 0) {\n const message = primitives.join(' ');\n console.log(\n `%c${prefix.endsWith(' ') ? prefix : prefix.trim() + ' '}${icon}${message}`,\n style,\n ...objects,\n );\n } else if (objects.length > 0) {\n console.log(\n `%c${prefix.endsWith(' ') ? prefix : prefix.trim() + ' '}${icon}`,\n style,\n ...objects,\n );\n }\n };\n }\n\n private style(theme: Theme): string {\n const styles: string[] = [];\n\n if (theme.background && theme.background !== 'transparent') {\n styles.push(`background: ${theme.background}`);\n styles.push('padding: 2px 6px');\n styles.push('border-radius: 3px');\n }\n if (theme.color) styles.push(`color: ${theme.color}`);\n if (theme.bold) styles.push('font-weight: bold');\n if (theme.italic) styles.push('font-style: italic');\n if (theme.fontSize) styles.push(`font-size: ${theme.fontSize}px`);\n\n return styles.join('; ');\n }\n\n public group(label: string): void {\n if (!this.enabled || !console.group) return;\n\n console.group(label);\n }\n\n public groupCollapsed(label: string): void {\n if (!this.enabled || !console.groupCollapsed) return;\n\n console.groupCollapsed(label);\n }\n\n public groupEnd(): void {\n if (!this.enabled || !console.groupEnd) return;\n\n console.groupEnd();\n }\n\n public table(data: unknown): void {\n if (!this.enabled || !console.table) return;\n\n console.table(data);\n }\n\n public time(label: string): void {\n if (!this.enabled || !console.time) return;\n\n console.time(label);\n }\n\n public timeEnd(label: string): void {\n if (!this.enabled || !console.timeEnd) return;\n\n console.timeEnd(label);\n }\n\n readonly error = this.apply({\n color: '#721c24',\n background: '#f8d7da',\n bold: true,\n italic: false,\n icon: '✖',\n });\n\n readonly warn = this.apply({\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n });\n\n readonly success = this.apply({\n color: '#155724',\n background: '#d4edda',\n bold: true,\n italic: false,\n fontSize: 18,\n icon: '✔',\n });\n\n readonly info = this.apply({\n color: '#0c5460',\n background: '#d1ecf1',\n fontSize: 12,\n icon: 'ℹ',\n });\n\n readonly debug = this.apply({\n color: '#8c9ba8',\n background: 'transparent',\n fontSize: 12,\n icon: '●',\n });\n\n readonly alert = this.apply({\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n icon: '⚠',\n });\n\n readonly status = this.apply({\n color: '#0c5460',\n background: '#d1ecf1',\n bold: true,\n italic: false,\n fontSize: 12,\n icon: '·',\n });\n\n readonly received = this.apply({\n color: '#E6BBFF',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n icon: '⬇',\n });\n\n readonly simple = this.apply({\n color: '#f6c6cb',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n icon: '☼',\n });\n}\n","import type {\n OnErrorHandler,\n OnCommandHandler,\n OnChatHandler,\n OnWhisperHandler,\n OnMessageDeletedHandler,\n OnJoinHandler,\n OnPartHandler,\n OnHostedHandler,\n OnRaidHandler,\n OnSubHandler,\n OnResubHandler,\n OnSubGiftHandler,\n OnSubMysteryGiftHandler,\n OnGiftSubContinueHandler,\n OnCheerHandler,\n OnRewardHandler,\n OnConnectedHandler,\n OnReconnectHandler,\n OnChatModeHandler,\n ComfyJSInstance,\n} from 'comfy.js';\n\nimport { BadgeOptions } from '../helper/classes/message.js';\nimport { usedClients } from '../internal.js';\nimport { Local } from '../local/index.js';\nimport { logger } from '../main.js';\nimport { EventProvider } from '../modules/EventProvider.js';\n\ntype ComfyEvents = {\n load: [instance: ComfyJSInstance];\n error: Parameters<OnErrorHandler>;\n command: Parameters<OnCommandHandler>;\n chat: Parameters<OnChatHandler>;\n whisper: Parameters<OnWhisperHandler>;\n messageDeleted: Parameters<OnMessageDeletedHandler>;\n join: Parameters<OnJoinHandler>;\n part: Parameters<OnPartHandler>;\n hosted: Parameters<OnHostedHandler>;\n raid: Parameters<OnRaidHandler>;\n sub: Parameters<OnSubHandler>;\n resub: Parameters<OnResubHandler>;\n subGift: Parameters<OnSubGiftHandler>;\n subMysteryGift: Parameters<OnSubMysteryGiftHandler>;\n giftSubContinue: Parameters<OnGiftSubContinueHandler>;\n cheer: Parameters<OnCheerHandler>;\n chatMode: Parameters<OnChatModeHandler>;\n reward: Parameters<OnRewardHandler>;\n connected: Parameters<OnConnectedHandler>;\n reconnect: Parameters<OnReconnectHandler>;\n};\n\n/**\n * Creates and manages a ComfyJS instance for Twitch chat interaction.\n */\nexport class useComfyJs extends EventProvider<ComfyEvents> {\n public instance!: ComfyJSInstance;\n\n public username!: string;\n public password?: string;\n public channels!: string[];\n\n public isDebug: boolean = false;\n private init: boolean = false;\n\n public emulate: boolean = false;\n\n /**\n * Initializes a new ComfyJS instance and connects to Twitch chat.\n * @param options - Configuration options for ComfyJS instance.\n * @param emulate - Whether to emulate chat messages in the Local module.\n */\n constructor(\n options: {\n username: string;\n password?: string;\n channels: string[];\n isDebug?: boolean;\n init?: boolean;\n },\n emulate: boolean,\n ) {\n super();\n\n this.username = options.username;\n this.password = options.password;\n this.channels = options.channels;\n this.isDebug = Boolean(options.isDebug);\n this.init = Boolean(options.init);\n this.emulate = emulate;\n\n this.load()\n .then((comfyJS) => {\n this.instance = comfyJS;\n\n this.emit('load', comfyJS);\n this.connect();\n })\n .catch((err) => {\n logger.error('useComfyJs: Failed to load ComfyJS', err);\n });\n }\n\n /**\n * Loads the ComfyJS script if not already loaded.\n * @returns A promise that resolves to the ComfyJS instance.\n */\n private load(): Promise<ComfyJSInstance> {\n if (typeof window.ComfyJS === 'undefined' || !window.ComfyJS) {\n return new Promise((resolve, reject) => {\n if (this.emulate && !usedClients.length) {\n return reject(\n new Error('useComfyJs: Cannot emulate chat messages without a Client instance.'),\n );\n }\n\n const script = document.createElement('script');\n\n script.src = 'https://cdn.jsdelivr.net/npm/comfy.js@1.1.29/dist/comfy.min.js';\n script.type = 'text/javascript';\n script.async = true;\n\n script.onload = () => resolve(window.ComfyJS as ComfyJSInstance);\n script.onerror = (err) => reject(err);\n\n document.head.appendChild(script);\n });\n } else return Promise.resolve(window.ComfyJS as ComfyJSInstance);\n }\n\n /**\n * Connects event handlers to the ComfyJS instance.\n */\n private connect() {\n this.instance.onError = (error) => {\n this.emit('error', error);\n\n if (usedClients.some((e) => e.debug)) logger.error('[Client]', 'ComfyJS Error:', error);\n };\n\n this.instance.onCommand = (user, command, message, flags, extra) => {\n this.emit('command', user, command, message, flags, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Command: !${command} ${message} (User: ${user})`);\n\n if (this.emulate) {\n const roles = {\n ...flags,\n broadcaster: flags.broadcaster,\n moderator: flags.mod,\n vip: flags.vip,\n subscriber: flags.subscriber,\n founder: flags.founder,\n };\n\n const data = {\n name: user,\n message: `!${command} ${message}`,\n badges: Object.entries(roles)\n .map(([role, hasRole]) => (hasRole ? role : null))\n .filter(Boolean) as BadgeOptions,\n color: extra.userColor,\n time: new Date(extra.timestamp).getTime(),\n userId: extra.userId,\n msgId: extra.id,\n channel: extra.channel,\n };\n\n Local.emulate.twitch.message(data);\n }\n };\n this.instance.onChat = (user, message, flags, self, extra) => {\n this.emit('chat', user, message, flags, self, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Chat: ${message} (User: ${user})`);\n\n if (this.emulate) {\n const roles = {\n ...flags,\n ...extra.userBadges,\n broadcaster: flags.broadcaster,\n moderator: flags.mod,\n vip: flags.vip,\n subscriber: flags.subscriber,\n founder: flags.founder,\n };\n\n Local.emulate.twitch.message({\n name: user,\n message: message,\n badges: Object.entries(roles)\n .map(([role, hasRole]) => (hasRole ? role : null))\n .filter(Boolean) as BadgeOptions,\n color: extra.userColor,\n time: new Date(extra.timestamp).getTime(),\n userId: extra.userId,\n msgId: extra.id,\n channel: extra.channel,\n });\n }\n };\n this.instance.onWhisper = (user, message, flags, self, extra) => {\n this.emit('whisper', user, message, flags, self, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Whisper: ${message} (User: ${user})`);\n };\n this.instance.onMessageDeleted = (id, extra) => {\n this.emit('messageDeleted', id, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Message Deleted: ${id}`);\n\n if (this.emulate) {\n Local.emulate.twitch.deleteMessage(id);\n }\n };\n this.instance.onJoin = (user, self, extra) => {\n this.emit('join', user, self, extra);\n\n if (usedClients.some((e) => e.debug)) logger.debug('[Client]', `ComfyJS Join: ${user}`);\n };\n this.instance.onPart = (user, self, extra) => {\n this.emit('part', user, self, extra);\n\n if (usedClients.some((e) => e.debug)) logger.debug('[Client]', `ComfyJS Part: ${user}`);\n };\n this.instance.onHosted = (user, viewers, autohost, extra) => {\n this.emit('hosted', user, viewers, autohost, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Hosted: ${user} (${viewers} viewers)`);\n };\n this.instance.onRaid = (user, viewers, extra) => {\n this.emit('raid', user, viewers, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Raid: ${user} (${viewers} viewers)`);\n\n if (this.emulate) {\n Local.emulate.twitch.raid({\n name: user,\n amount: viewers,\n });\n }\n };\n this.instance.onSub = (user, message, subTierInfo, extra) => {\n this.emit('sub', user, message, subTierInfo, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Sub: ${user} (${subTierInfo.plan})`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: user,\n message: message,\n tier: tier,\n subType: 'default',\n });\n }\n };\n this.instance.onResub = (user, message, streakMonths, cumulativeMonths, subTierInfo, extra) => {\n this.emit('resub', user, message, streakMonths, cumulativeMonths, subTierInfo, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Resub: ${user} (${cumulativeMonths} months)`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: user,\n message: message,\n tier: tier,\n amount: cumulativeMonths,\n subType: 'default',\n });\n }\n };\n this.instance.onSubGift = (\n gifterUser,\n streakMonths,\n recipientUser,\n senderCount,\n subTierInfo,\n extra,\n ) => {\n this.emit(\n 'subGift',\n gifterUser,\n streakMonths,\n recipientUser,\n senderCount,\n subTierInfo,\n extra,\n );\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Sub Gift: ${gifterUser} gifted ${senderCount} subs`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: recipientUser,\n message: '',\n sender: gifterUser,\n tier,\n amount: senderCount,\n subType: 'gift',\n });\n }\n };\n this.instance.onSubMysteryGift = (gifterUser, numbOfSubs, senderCount, subTierInfo, extra) => {\n this.emit('subMysteryGift', gifterUser, numbOfSubs, senderCount, subTierInfo, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug(\n '[Client]',\n `ComfyJS Sub Mystery Gift: ${gifterUser} gifted ${numbOfSubs} subs`,\n );\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: gifterUser,\n message: '',\n amount: numbOfSubs,\n tier: tier,\n subType: 'community',\n });\n }\n };\n this.instance.onGiftSubContinue = (user, sender, extra) => {\n this.emit('giftSubContinue', user, sender, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug(\n '[Client]',\n `ComfyJS Gift Sub Continue: ${user} continued their gifted sub from ${sender}`,\n );\n\n if (this.emulate) {\n Local.emulate.twitch.subscriber({\n name: user,\n message: '',\n sender: sender,\n tier: '1000',\n subType: 'gift',\n });\n }\n };\n this.instance.onCheer = (user, message, bits, flags, extra) => {\n this.emit('cheer', user, message, bits, flags, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Cheer: ${user} cheered ${bits} bits - ${message}`);\n\n if (this.emulate) {\n Local.emulate.twitch.cheer({\n name: user,\n message: message,\n amount: bits,\n });\n }\n };\n this.instance.onChatMode = (flags, channel) => {\n this.emit('chatMode', flags, channel);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Chat Mode Changed on ${channel}`);\n };\n this.instance.onReward = (user, reward, cost, message, extra) => {\n this.emit('reward', user, reward, cost, message, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug(\n '[Client]',\n `ComfyJS Reward: ${user} redeemed ${reward} for ${cost} - ${message}`,\n );\n };\n this.instance.onConnected = (address, port, isFirstConnect) => {\n this.emit('connected', address, port, isFirstConnect);\n\n if (usedClients.some((e) => e.debug))\n logger.debug(\n '[Client]',\n `ComfyJS Connected: ${address}:${port} (First Connect: ${isFirstConnect})`,\n );\n };\n this.instance.onReconnect = (reconnectCount) => {\n this.emit('reconnect', reconnectCount);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Reconnect: Attempt #${reconnectCount}`);\n };\n\n if (this.init) {\n this.instance.Init(this.username, this.password, this.channels, this.isDebug);\n }\n }\n}\n","import { usedClients } from '../internal.js';\n\nexport namespace Alejo {\n export namespace Pronouns {\n export type name =\n | 'hehim'\n | 'sheher'\n | 'theythem'\n | 'shethem'\n | 'hethem'\n | 'heshe'\n | 'xexem'\n | 'faefaer'\n | 'vever'\n | 'aeaer'\n | 'ziehir'\n | 'perper'\n | 'eem'\n | 'itits';\n\n export type display =\n | 'He/Him'\n | 'She/Her'\n | 'They/Them'\n | 'She/They'\n | 'He/They'\n | 'He/She'\n | 'Xe/Xem'\n | 'Fae/Faer'\n | 'Ve/Ver'\n | 'Ae/Aer'\n | 'Zie/Hir'\n | 'Per/Per'\n | 'E/Em'\n | 'It/Its';\n\n export enum map {\n hehim = 'He/Him',\n sheher = 'She/Her',\n theythem = 'They/Them',\n shethem = 'She/They',\n hethem = 'He/They',\n heshe = 'He/She',\n xexem = 'Xe/Xem',\n faefaer = 'Fae/Faer',\n vever = 'Ve/Ver',\n aeaer = 'Ae/Aer',\n ziehir = 'Zie/Hir',\n perper = 'Per/Per',\n eem = 'E/Em',\n itits = 'It/Its',\n }\n }\n\n export async function list(): Promise<typeof Pronouns.map> {\n try {\n const data = (await fetch('https://pronouns.alejo.io/api/pronouns').then((res) =>\n res.json(),\n )) as {\n display: Pronouns.display;\n name: Pronouns.name;\n }[];\n\n if (Array.isArray(data) && data.length) {\n const built = Object.fromEntries(\n data.map(({ name, display }) => [name, display] as const),\n ) as Record<Pronouns.name, Pronouns.display>;\n\n return { ...Pronouns.map, ...built } as typeof Pronouns.map;\n }\n } catch {}\n\n return { ...Pronouns.map } as typeof Pronouns.map;\n }\n\n export type user = {\n id: string;\n login: string;\n pronoun_id: Pronouns.name;\n };\n\n export async function get(username: string) {\n if (!username) throw new Error('Username is required to fetch Alejo data.');\n\n username = username.toLowerCase();\n\n if (!usedClients.length) {\n try {\n const data = await fetch(`https://pronouns.alejo.io/api/users/${username}`)\n .then((res) => res.json())\n .then(([data]) => data as Alejo.user | undefined);\n\n if (data) {\n return data.pronoun_id;\n }\n } catch (error) {\n throw new Error(\n `Failed to fetch pronoun data for user \"${username}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n\n return;\n }\n\n const client = usedClients?.[0];\n\n if (\n username in client.storage.data.pronoun &&\n client.storage.data.pronoun[username].expire > Date.now()\n ) {\n return client.storage.data.pronoun[username].value;\n } else {\n try {\n const data = await fetch(`https://pronouns.alejo.io/api/users/${username}`)\n .then((res) => res.json())\n .then(([data]) => data as Alejo.user | undefined);\n\n if (data) {\n client.storage.add(`pronoun.${username}`, {\n value: data.pronoun_id,\n timestamp: Date.now(),\n expire: Date.now() + client.cache.pronoun * 60 * 1000,\n });\n\n return client.storage.data.pronoun[username].value ?? data.pronoun_id;\n }\n } catch (error) {\n throw new Error(\n `Failed to fetch pronoun data for user \"${username}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n }\n}\n","import './client/listener.js';\nimport { Button } from './actions/button.js';\nimport { Command } from './actions/command.js';\nimport { Client } from './client/client.js';\nimport { Data } from './data/index.js';\nimport { Helper } from './helper/index.js';\nimport * as internals from './internal.js';\nimport { Local } from './local/index.js';\nimport { EventProvider } from './modules/EventProvider.js';\nimport { FakeUserPool } from './modules/fakeUser.js';\nimport { USE_SE_API } from './modules/SE_API.js';\nimport { useComms } from './modules/useComms.js';\nimport { useLogger } from './modules/useLogger.js';\nimport { useQueue } from './modules/useQueue.js';\nimport { useStorage } from './modules/useStorage.js';\nimport { useComfyJs } from './multistream/comfyJs.js';\nimport { Alejo } from './utils/alejo.js';\n\nexport const logger = new useLogger();\n\nexport const main = {\n SeAPI: USE_SE_API,\n\n Client: Client,\n Helper: Helper,\n Local: Local,\n Data: Data,\n logger: logger,\n\n modules: {\n EventProvider,\n useStorage,\n useQueue,\n useLogger,\n useComms,\n FakeUserPool,\n },\n actions: {\n Button,\n Command,\n },\n multistream: {\n useComfyJs,\n },\n internal: internals,\n pronouns: { Alejo },\n};\n\nif (typeof window !== 'undefined') {\n (window as any).Tixyel = main;\n} else {\n (globalThis as any).Tixyel = main;\n}\n","import { ComfyJSInstance } from 'comfy.js';\n\nimport { main } from './main.js';\nimport { StreamElements } from './types.js';\n\nexport type * from './types.ts';\n\ndeclare global {\n interface Window {\n Tixyel: typeof main;\n ComfyJS?: ComfyJSInstance;\n }\n\n interface WindowEventMap {\n onWidgetLoad: CustomEvent<StreamElements.Event.onWidgetLoad>;\n onSessionUpdate: CustomEvent<StreamElements.Event.onSessionUpdate>;\n onEventReceived: CustomEvent<StreamElements.Event.onEventReceived>;\n }\n\n const Tixyel: typeof main;\n const SE_API: StreamElements.SE_API;\n}\n\nexport default main;\n"],"mappings":"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OAAO,KAAM,UAAU;GAClD,IAAM,IAAQ,OAAO,KAAK,EAAE,EACtB,IAAQ,OAAO,KAAK,EAAE;AAE5B,OAAI,EAAM,WAAW,EAAM,OAAQ,QAAO;AAC1C,QAAK,IAAM,KAAO,EAChB,KAAI,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,EAAI,IAAI,KAAK,OAAO,EAAE,IAAM,EAAE,IAAM,EAAO,CACtF,QAAO;AAGX,UAAO;;AAGT,SAAO,MAAM;;GCxNJ,IAAU;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACD,ECNY,IAAqC;CAChD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,EACD;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,EACD;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,EACD;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,EACD;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aACE;IACF,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACF,ECjwLY,IAAkB,s+CAsJ9B,ECpJK,IAAgB;CACpB;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACF,EAEK,IAAa;CACjB;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACF,EAEK,IAAY;CAChB;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACF,EAEK,IAAe;CACnB;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;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AAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,kCAAkC;EAC9C,aAAa,CAAC,gCAAgC;EAC9C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,iCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wCAAwC;EACpD,aAAa,CAAC,sCAAsC;EACpD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,OAAO;EACnB,aAAa,CAAC,KAAK;EACnB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,MACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,SAAS;EACrB,aAAa,CAAC,OAAO;EACrB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,QACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,aAAa;EACzB,aAAa,CAAC,WAAW;EACzB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,YACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,aAAa;EACzB,aAAa,CAAC,WAAW;EACzB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,YACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,sBAAsB;EAClC,aAAa,CAAC,oBAAoB;EAClC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,qBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wBAAwB;EACpC,aAAa,CAAC,sBAAsB;EACpC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,kCAAkC;EAC9C,aAAa,CAAC,gCAAgC;EAC9C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,iCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,oBAAoB;EAChC,aAAa,CAAC,kBAAkB;EAChC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,mBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wBAAwB;EACpC,aAAa,CAAC,sBAAsB;EACpC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gCAAgC;EAC5C,aAAa,CAAC,8BAA8B;EAC5C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,+BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gCAAgC;EAC5C,aAAa,CAAC,8BAA8B;EAC5C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,+BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wCAAwC;EACpD,aAAa,CAAC,sCAAsC;EACpD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,oCAAoC;EAChD,aAAa,CAAC,kCAAkC;EAChD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,mCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,QAAQ;EACpB,aAAa,CAAC,MAAM;EACpB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,OACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SA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"}
1
+ {"version":3,"file":"index.es.js","names":[],"sources":["../src/helper/classes/number.ts","../src/helper/classes/element.ts","../src/helper/classes/object.ts","../src/data/collection/avatars.ts","../src/data/collection/badges.ts","../src/data/collection/css.ts","../src/data/collection/emotes.ts","../src/data/collection/items.ts","../src/data/collection/messages.ts","../src/data/collection/names.ts","../src/data/collection/tiers.ts","../src/data/collection/tts.ts","../src/data/collection/youtube-emotes.ts","../src/data/index.ts","../src/helper/classes/random.ts","../src/helper/classes/message.ts","../src/helper/classes/event.ts","../src/utils/color.ts","../src/helper/classes/color.ts","../src/helper/classes/string.ts","../src/helper/classes/sound.ts","../src/helper/classes/function.ts","../src/internal.ts","../src/helper/classes/utils.ts","../src/helper/classes/animate.ts","../src/helper/index.ts","../src/actions/button.ts","../src/actions/command.ts","../src/client/listener.ts","../src/modules/EventProvider.ts","../src/modules/useQueue.ts","../src/local/generator.ts","../src/local/queue.ts","../src/streamelements/api.ts","../src/modules/SE_API.ts","../src/modules/useStorage.ts","../src/client/client.ts","../src/local/emulator.ts","../src/local/index.ts","../src/modules/fakeUser.ts","../src/modules/useComms.ts","../src/modules/useLogger.ts","../src/multistream/comfyJs.ts","../src/utils/alejo.ts","../src/main.ts","../src/index.ts"],"sourcesContent":["/**\n * NumberHelper class provides utility methods for working with numbers, including translation to words, balancing within a range, rounding, and generating random numbers.\n */\nexport class NumberHelper {\n /**\n * Translate number to words\n * @param num - Number to translate\n * @param type - Translation type\n * @returns - Number in words\n * @example\n * ```javascript\n * const cardinal = translate(42, 'cardinal');\n * console.log(cardinal); // \"forty-two\"\n * const ordinal = translate(42, 'ordinal');\n * console.log(ordinal); // \"forty-second\"\n * const suffix = translate(42, 'suffix');\n * console.log(suffix); // \"42nd\"\n * ```\n */\n translate(num: number, type: 'cardinal' | 'ordinal' | 'suffix' = 'cardinal'): string {\n const CARDINALS = {\n single: ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'],\n tens: [\n 'ten',\n 'eleven',\n 'twelve',\n 'thirteen',\n 'fourteen',\n 'fifteen',\n 'sixteen',\n 'seventeen',\n 'eighteen',\n 'nineteen',\n ],\n decades: ['twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'],\n };\n const ORDINALS = {\n single: [\n 'zeroth',\n 'first',\n 'second',\n 'third',\n 'fourth',\n 'fifth',\n 'sixth',\n 'seventh',\n 'eighth',\n 'ninth',\n ],\n tens: [\n 'tenth',\n 'eleventh',\n 'twelfth',\n 'thirteenth',\n 'fourteenth',\n 'fifteenth',\n 'sixteenth',\n 'seventeenth',\n 'eighteenth',\n 'nineteenth',\n ],\n decades: [\n 'twentieth',\n 'thirtieth',\n 'fortieth',\n 'fiftieth',\n 'sixtieth',\n 'seventieth',\n 'eightieth',\n 'ninetieth',\n ],\n };\n const SUFFIXES = ['th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th'];\n const SCALES = ['', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion'];\n const SCALES_ORD = SCALES.map((s) => (s ? `${s}th` : ''));\n\n num = Math.abs(Math.floor(num));\n\n if (type === 'suffix') {\n const rem100 = num % 100;\n if (rem100 >= 11 && rem100 <= 13) return `${num}th`;\n const rem10 = num % 10;\n return `${num}${SUFFIXES[rem10]}`;\n }\n\n function below100(n: number, kind: 'cardinal' | 'ordinal'): string {\n if (n < 10) return kind === 'ordinal' ? ORDINALS.single[n] : CARDINALS.single[n];\n if (n < 20) return kind === 'ordinal' ? ORDINALS.tens[n - 10] : CARDINALS.tens[n - 10];\n const decade = Math.floor(n / 10);\n const single = n % 10;\n if (single === 0)\n return kind === 'ordinal' ? ORDINALS.decades[decade - 2] : CARDINALS.decades[decade - 2];\n const tensPart = CARDINALS.decades[decade - 2];\n const unitPart = kind === 'ordinal' ? ORDINALS.single[single] : CARDINALS.single[single];\n return `${tensPart}-${unitPart}`;\n }\n\n function below1000(n: number, kind: 'cardinal' | 'ordinal'): string {\n if (n === 0) return kind === 'ordinal' ? ORDINALS.single[0] : CARDINALS.single[0];\n const hundreds = Math.floor(n / 100);\n const rest = n % 100;\n const parts: string[] = [];\n if (hundreds > 0) {\n if (kind === 'ordinal' && rest === 0) parts.push(`${CARDINALS.single[hundreds]} hundredth`);\n else parts.push(`${CARDINALS.single[hundreds]} hundred`);\n }\n if (rest > 0) parts.push(below100(rest, kind));\n return parts.join(' ');\n }\n\n if (num < 1000) return below1000(num, type);\n\n const groups: number[] = [];\n let n = num;\n while (n > 0) {\n groups.push(n % 1000);\n n = Math.floor(n / 1000);\n }\n\n let lastNonZeroIndex = -1;\n for (let i = 0; i < groups.length; i++) if (groups[i] !== 0) lastNonZeroIndex = i;\n\n const parts: string[] = [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const g = groups[i];\n if (g === 0) continue;\n const scale = SCALES[i];\n\n if (type === 'cardinal') {\n let segment = below1000(g, 'cardinal');\n if (scale) segment += ` ${scale}`;\n parts.push(segment);\n } else {\n const isLastNonZero = i === lastNonZeroIndex;\n if (isLastNonZero) {\n if (i > 0) {\n const segment = below1000(g, 'cardinal');\n const ordScale = SCALES_ORD[i];\n parts.push(segment ? `${segment} ${ordScale}` : ordScale);\n } else {\n const segment = below1000(g, 'ordinal');\n parts.push(segment);\n }\n } else {\n let segment = below1000(g, 'cardinal');\n if (scale) segment += ` ${scale}`;\n parts.push(segment);\n }\n }\n }\n\n return parts.join(', ');\n }\n\n /**\n * Balances a number within a specified range\n * @param amount - Number to balance\n * @param min - Minimum value\n * @param max - Maximum value\n * @param decimals - Number of decimal places to round to (default is 0)\n * @returns - Balanced number\n * @example\n * ```javascript\n * const balancedValue = balance(150, 0, 100);\n * console.log(balancedValue); // 100\n * ```\n */\n balance(amount: number, min: number = 0, max: number = 100, decimals: number = 0): number {\n const result = Math.min(Math.max(amount, min), max);\n\n return this.round(result, decimals);\n }\n\n /**\n * Rounds a number to a specified number of decimal places\n * @param value - Number to round\n * @param decimals - Number of decimal places (default is 2)\n * @returns Rounded number\n * @example\n * ```javascript\n * const roundedValue = round(3.14159, 3);\n * console.log(roundedValue); // 3.142\n * const roundedValueDefault = round(3.14159);\n * console.log(roundedValueDefault); // 3.14\n * const roundedValueZero = round(3.14159, 0);\n * console.log(roundedValueZero); // 3\n * ```\n */\n round(value: number, decimals: number = 2): number {\n const factor = Math.pow(10, decimals);\n\n return Math.round(value * factor) / factor;\n }\n\n /**\n * Generate random number\n * @param min - Minimum value\n * @param max - Maximum value\n * @param float - Number of decimal places (0 for integer)\n * @returns - Random number\n * @example\n * ```javascript\n * const intNumber = random(1, 10);\n * console.log(intNumber); // e.g. 7\n *\n * const floatNumber = random(1, 10, 2);\n * console.log(floatNumber); // e.g. 3.14\n * ```\n */\n random(min: number, max: number, float: number = 0): number {\n if (min > max) [min, max] = [max, min];\n\n const rand = Math.random() * (max - min) + min;\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\n }\n}\n","import { NumberHelper } from './number.js';\n\nexport interface ScaleOptions<T extends HTMLElement> {\n /**\n * The parent element to use for scaling calculations. If not provided, the element's parent will be used.\n */\n parent?: HTMLElement;\n /**\n * The preferred dimension to base the scaling on. Can be 'width', 'height', or 'auto' (default).\n */\n prefer?: 'width' | 'height' | 'auto';\n /**\n * The minimum percentage of the parent size to scale to. Default is 0.\n */\n min?: number;\n /**\n * The maximum percentage of the parent size to scale to. Default is 1 (100%).\n */\n max?: number;\n /**\n * A callback function that is called after scaling is applied.\n * @param this - The HTML element being scaled.\n * @param number - The scale factor applied to the element.\n * @param element - The HTML element being scaled.\n * @returns void\n */\n apply?: (this: T, number: number, element: T) => void;\n}\n\nexport type FitTextOptions = {\n minFontSize?: number;\n maxFontSize?: number;\n parent?: HTMLElement;\n};\n\nexport class ElementHelper {\n /**\n * Merges outer span styles with inner span styles in the provided HTML string.\n * @param outerStyle - The style string to be applied to the outer span.\n * @param innerHTML - The inner HTML string which may contain a span with its own styles.\n * @returns A new HTML string with merged styles applied to a single span.\n * @example\n * ```javascript\n * const result = mergeSpanStyles(\"color: red; font-weight: bold;\", '<span style=\"font-size: 14px;\">Hello World</span>');\n * console.log(result); // Output: '<span style=\"font-size: 14px; color: red; font-weight: bold;\">Hello World</span>'\n * ```\n */\n mergeSpanStyles(outerStyle: string, innerHTML: string, className?: string): string {\n const match = innerHTML.match(/^<span(?: class=\"[^\"]*\")? style=\"([^\"]*)\">(.*)<\\/span>$/s);\n\n if (match) {\n const innerStyle = match[1];\n const content = match[2];\n const innerClass = match[0].match(/class=\"([^\"]*)\"/)?.[1] || '';\n\n let mergedStyle = [innerStyle, outerStyle]\n .filter((a) => a.length)\n .map((s) => {\n if (s.endsWith(';')) return s.slice(0, -1);\n else return s;\n })\n .join('; ')\n .replace(/\\s*;\\s*/g, '; ')\n .trim();\n\n if (!mergedStyle.endsWith(';')) mergedStyle += ';';\n\n return `<span${innerClass ? ` class=\"${innerClass} ${className ?? ''}\"` : ''}${mergedStyle ? ` style=\"${mergedStyle}\"` : ''}>${content}</span>`;\n } else {\n if (outerStyle && outerStyle.length && !outerStyle.endsWith(';')) outerStyle += ';';\n\n return `<span${className ? ` class=\"${className}\"` : ''}${outerStyle ? ` style=\"${outerStyle}\"` : ''}>${innerHTML}</span>`;\n }\n }\n\n /**\n * Scales an HTML element to fit within its parent element based on specified minimum and maximum scale factors.\n * @param element - The HTML element to be scaled.\n * @param min - Minimum scale factor (default is 0).\n * @param max - Maximum scale factor (default is 1).\n * @param options - Optional settings for scaling.\n * @returns - An object containing the new width, height, and scale factor, or void if not applied.\n * @example\n * ```javascript\n * const element = document.getElementById('myElement');\n * scale(element, 0.5, 1, { return: false });\n * ```\n */\n scale(\n element: HTMLElement,\n min: number = 0,\n max: number = 1,\n options?: { return: boolean; parent: HTMLElement; base: 'width' | 'height' },\n ): { width: number; height: number; scale: number } | void {\n const { return: returnOnly = false, parent: customParent, base } = options || {};\n\n const parent = customParent || element.parentElement || document.body;\n\n if (!parent) {\n throw new Error('No parent element found for scaling');\n }\n\n const parentRect = parent.getBoundingClientRect();\n const elementWidth = element.offsetWidth;\n const elementHeight = element.offsetHeight;\n\n if (elementWidth === 0 || elementHeight === 0) {\n throw new Error('Element has zero width or height, cannot scale');\n }\n\n // Calculate scales for both dimensions\n const scaleX = (parentRect.width * max) / elementWidth;\n const scaleY = (parentRect.height * max) / elementHeight;\n\n // Determine final scale based on base option or use smaller scale\n let finalScale =\n base === 'width' ? scaleX : base === 'height' ? scaleY : Math.min(scaleX, scaleY);\n\n // Apply minimum constraint if needed\n if (min > 0) {\n const minScaleX = (parentRect.width * min) / elementWidth;\n const minScaleY = (parentRect.height * min) / elementHeight;\n const minScale = Math.max(minScaleX, minScaleY);\n\n finalScale = Math.max(minScale, finalScale);\n }\n\n const result = {\n width: elementWidth * finalScale,\n height: elementHeight * finalScale,\n scale: finalScale,\n };\n\n if (returnOnly) {\n return result;\n }\n\n element.style.transform = `scale(${finalScale})`;\n element.style.transformOrigin = 'center center';\n\n return result;\n }\n\n /**\n * Scales an HTML element to fit within its parent element based on specified options.\n * @param element - The HTML element to be scaled.\n * @param options - Optional settings for scaling.\n * @returns The scale factor applied to the element.\n * @example\n * ```javascript\n * const element = document.getElementById('myElement');\n * const scaleFactor scalev2(element, {\n * min: 0.5,\n * max: 1,\n * prefer: 'width',\n * apply: (scale, el) => el.style.transform = `scale(${scale})`\n * });\n * console.log(`Element scaled by a factor of ${scaleFactor}`);\n * ```\n */\n scalev2<T extends HTMLElement>(element: T, options: ScaleOptions<T> = {}): number {\n const {\n parent = element.parentElement,\n prefer = 'auto',\n min = 0,\n max = 1,\n apply = () => {},\n } = options;\n\n if (!parent) {\n throw new Error('No parent element found for scaling');\n }\n\n const parentClientRect = parent.getBoundingClientRect();\n const elementClientRect = element.getBoundingClientRect();\n\n const parentWidth = parentClientRect.width;\n const parentHeight = parentClientRect.height;\n\n const elementWidth = elementClientRect.width;\n const elementHeight = elementClientRect.height;\n\n let scaleXmin = (parentWidth * min) / elementWidth;\n let scaleYmin = (parentHeight * min) / elementHeight;\n\n let scaleXmax = (parentWidth * max) / elementWidth;\n let scaleYmax = (parentHeight * max) / elementHeight;\n\n let scaleValue = Math.min(scaleXmax, scaleYmax);\n\n const minScale = Math.max(scaleXmin, scaleYmin);\n scaleValue = Math.max(scaleValue, minScale);\n\n const finalScaleX = elementWidth * scaleValue;\n const finalScaleY = elementHeight * scaleValue;\n\n if (prefer === 'width') {\n scaleValue = Math.max(scaleXmin, Math.min(scaleXmax, parentWidth / elementWidth));\n } else if (prefer === 'height') {\n scaleValue = Math.max(scaleYmin, Math.min(scaleYmax, parentHeight / elementHeight));\n } else {\n if (finalScaleX > parentWidth) {\n scaleValue = Math.max(scaleXmin, Math.min(scaleXmax, parentWidth / elementWidth));\n } else if (finalScaleY > parentHeight) {\n scaleValue = Math.max(scaleYmin, Math.min(scaleYmax, parentHeight / elementHeight));\n }\n }\n\n apply.apply(element, [scaleValue, element]);\n\n return scaleValue;\n }\n\n /**\n * Fits the text within the parent element by adjusting the font size.\n * @param element - The HTML element containing the text to be fitted.\n * @param compressor - A multiplier to adjust the fitting sensitivity (default is 1).\n * @param options - Optional settings for fitting text.\n * @returns The HTML element with adjusted font size.\n * @example\n * ```javascript\n * const element = document.getElementById('myTextElement');\n * fitText(element, 1, { minFontSize: 12, maxFontSize: 36 });\n * console.log(`Adjusted font size: ${element.style.fontSize}`);\n * ```\n */\n fitText(element: HTMLElement, compressor: number = 1, options: FitTextOptions = {}) {\n const fontSize = parseFloat(getComputedStyle(element).getPropertyValue('font-size'));\n\n const settings = {\n minFontSize: options?.minFontSize ?? 0,\n maxFontSize: options?.maxFontSize ?? fontSize,\n };\n\n const parent = options?.parent || element.parentElement;\n\n if (!parent) {\n throw new Error('No parent element found for fitting text');\n }\n\n const parentWidth = parent.clientWidth * compressor;\n const elWidth = element.offsetWidth;\n\n const ratio = parentWidth / elWidth;\n const value = fontSize * ratio;\n\n const number = new NumberHelper();\n const result = number.balance(value, settings.minFontSize, settings.maxFontSize);\n\n element.style.fontSize = result + 'px';\n\n return element;\n }\n\n /**\n * Wraps formatted HTML text with containers and splits characters into indexed spans.\n * Adds 'container' class and data-index to all parent elements, and wraps each character in a span with class 'char' and data-index.\n * @param htmlString - The input HTML string containing formatted text elements (span, strong, em, etc).\n * @param startIndex - The starting index for the data-index attribute (default is 0).\n * @param preserveInterElementWhitespace - Whether to preserve whitespace between elements (default is false).\n * @param options - Optional settings for splitting text, including skipWhitespaceIndex to control index incrementing for whitespace characters.\n * @returns - A new HTML string with containers and character-level indexing.\n * @example\n * ```javascript\n * const result = splitTextToChars('<span>TesTe</span> <strong>bold</strong>', 0);\n * console.log(result);\n * // Output: '<span class=\"container\" data-index=\"0\"><span class=\"char\" data-index=\"0\">T</span><span class=\"char\" data-index=\"1\">e</span>...'\n *\n * // Example with skipWhitespaceIndex\n * const resultSkipWhitespace = splitTextToChars('<span>Hello World</span>', 0, false, { skipWhitespaceIndex: true });\n * // The space character will have data-index but won't increment index for subsequent characters\n * ```\n */\n splitTextToChars(\n htmlString: string,\n startIndex: number = 0,\n preserveInterElementWhitespace: boolean = false,\n options: {\n /**\n * If true, skips incrementing the index for whitespace characters (space, newline, tab).\n * These characters will still have a data-index, but it won't be incremented for subsequent characters.\n * Default is true.\n */\n skipWhitespaceIndex?: boolean;\n } = {},\n ): string {\n const { skipWhitespaceIndex = true } = options;\n const parser = new DOMParser();\n const processed = document.createElement('div');\n\n let charIndex = startIndex;\n\n function processNode(node: Node): Node | DocumentFragment {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n let exclusivityIndex = 0;\n\n const chars = text.split('').map((char) => {\n const span = document.createElement('span');\n\n span.classList.add('char');\n span.dataset.index = String(charIndex);\n span.dataset.exclusivityIndex = String(exclusivityIndex);\n span.dataset.type = 'char';\n span.style.setProperty('--char-index', String(charIndex));\n span.style.setProperty('--exclusivity-index', String(exclusivityIndex));\n\n const isWhitespace = char === ' ' || char === '\\n' || char === '\\t';\n\n if (isWhitespace) {\n span.style.whiteSpace = 'pre-wrap';\n\n span.classList.remove('char');\n span.classList.add('whitespace');\n\n span.dataset.type = 'whitespace';\n }\n\n if (!isWhitespace || !skipWhitespaceIndex) {\n charIndex++;\n exclusivityIndex++;\n }\n\n span.textContent = char;\n\n return span;\n });\n\n const fragment = document.createDocumentFragment();\n chars.forEach((char) => fragment.appendChild(char));\n\n return fragment;\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const clone = node.cloneNode(false) as HTMLElement;\n\n clone.classList.add('container');\n clone.dataset.index = String(charIndex);\n clone.dataset.type = 'container';\n clone.style.setProperty('--char-index', String(charIndex));\n clone.style.setProperty('--exclusivity-index', String(charIndex));\n\n charIndex++;\n\n node.childNodes.forEach((child) => {\n const processed = processNode(child);\n\n clone.appendChild(processed);\n });\n\n return clone;\n }\n\n return node.cloneNode(true);\n }\n\n parser.parseFromString(htmlString, 'text/html').body.childNodes.forEach((node) => {\n if (\n !preserveInterElementWhitespace &&\n node.nodeType === Node.TEXT_NODE &&\n !node.textContent?.trim()\n ) {\n return;\n }\n\n const result = processNode(node);\n\n processed.appendChild(result);\n });\n\n let html = '';\n\n Array.from(processed.childNodes).forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) html += node.textContent;\n else html += (node as HTMLElement).outerHTML;\n });\n\n return html;\n }\n}\n","import { PathValue } from '../../types.js';\n\nexport class ObjectHelper {\n /**\n * Flattens a nested object into a single-level object with dot-separated keys.\n * @param obj - The nested object to be flattened.\n * @param prefix - The prefix to be added to each key (used for recursion).\n * @returns A flattened object with dot-separated keys.\n * @example\n * ```javascript\n * const nestedObj = { a: { b: 1, c: { d: 2 } }, e: [3, 4] };\n * const flatObj = flatten(nestedObj);\n * console.log(flatObj);\n * // Output: { 'a.b': '1', 'a.c.d': '2', 'e:0': '3', 'e:1': '4' }\n * ```\n */\n flatten(\n obj: Record<string, any>,\n stringify: boolean = true,\n prefix: string = '',\n ): Record<string, typeof stringify extends true ? string : string | number | boolean> {\n const result = {} as Record<\n string,\n typeof stringify extends true ? string : string | number | boolean\n >;\n\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n const value = obj[key];\n const path = prefix ? `${prefix}.${key}` : key;\n\n // Handle null and undefined\n if (value === null || value === undefined) {\n result[path] = String(value);\n\n continue;\n }\n\n if (typeof value === 'number' && isNaN(value)) {\n result[path] = 'NaN';\n\n continue;\n }\n\n if (typeof value === 'number' && !isNaN(value)) {\n result[path] = stringify ? String(value) : value;\n\n continue;\n }\n\n // Handle Date objects\n if (value instanceof Date) {\n result[path] = value.toISOString();\n\n continue;\n }\n\n // Handle Map objects\n if (value instanceof Map) {\n value.forEach((v, k) => {\n result[`${path}.${k}`] = JSON.stringify(v);\n });\n\n continue;\n }\n\n // Handle Array objects\n if (Array.isArray(value)) {\n value.forEach((v, i) => {\n const itemPath = `${path}:${i}`;\n\n if (typeof v === 'object') {\n Object.assign(result, this.flatten(v, stringify, itemPath));\n } else {\n result[itemPath] = stringify ? String(v) : v;\n }\n });\n\n continue;\n }\n\n // Handle nested objects\n if (typeof value === 'object') {\n Object.assign(result, this.flatten(value, stringify, path));\n continue;\n }\n\n // Handle primitive values (string, number, boolean, etc.)\n result[path] = String(value);\n }\n\n return result;\n }\n\n /**\n * Returns the entries of an object as an array of key-value pairs, with proper typing.\n * @param obj - The object to retrieve entries from.\n * @returns An array of key-value pairs from the object, typed as an array of tuples with key and value types.\n */\n entries<K extends string, V>(obj: Record<K, V>): [K, V][] {\n return Object.entries(obj) as [K, V][];\n }\n\n /**\n * Returns the values of an object as an array, with proper typing.\n * @param obj - The object to retrieve values from.\n * @returns An array of values from the object, typed as an array of the value type.\n */\n values<K extends string, V>(obj: Record<K, V>): V[] {\n return Object.values(obj) as V[];\n }\n\n /**\n * Returns the keys of an object as an array of strings, with proper typing.\n * @param obj - The object to retrieve keys from.\n * @returns An array of keys from the object, typed as an array of strings.\n */\n keys<K extends string, V>(obj: Record<K, V>): K[] {\n return Object.keys(obj) as K[];\n }\n\n /**\n * Updates a value in a nested object at the specified path, with an option to create missing intermediate objects.\n * @param obj - The target object to update.\n * @param path - The path to the property being updated.\n * @param value - The value to set at the specified path.\n * @param createMissing - Whether to create missing intermediate objects along the path if they don't exist.\n * @returns The updated object with the new value set at the specified path.\n * @example\n * ```javascript\n * const obj1 = { a: { b: 1 }, c: 2 };\n * updateViaPath(obj1, 'a.d', 9999, false);\n * console.log(obj1);\n * // Output: { a: { b: 1, d: 9999 }, c: 2 }\n *\n * const obj2 = { a: { b: 1 }, c: 2 };\n * updateViaPath(obj2, 'a.e.f', 8888, true);\n * console.log(obj2);\n * // Output: { a: { b: 1, e: { f: 8888 } }, c: 2 }\n * ```\n * @returns The updated object with the new value set at the specified path.\n */\n updateViaPath<P extends string, T extends object>(\n obj: T,\n path: P,\n value: PathValue<T, P>,\n createMissing: boolean = false,\n ): T {\n const keys = path.split('.');\n let current: any = obj;\n\n for (let i = 0; i < keys.length - 1; i++) {\n if (typeof current[keys[i]] !== 'object' || current[keys[i]] == null) {\n if (createMissing) {\n current[keys[i]] = {};\n } else {\n throw new Error(`Path ${keys.slice(0, i + 1).join('.')} does not exist in the object.`);\n }\n }\n\n current = current[keys[i]];\n }\n\n current[keys[keys.length - 1]] = value;\n\n return obj;\n }\n\n /**\n * Compares two values for differences, with an option to use JSON stringification for comparison.\n * @param a - The first value to compare.\n * @param b - The second value to compare.\n * @param method - The method to use for comparison, either 'json' for JSON stringification or 'default' for a recursive comparison.\n * @returns A boolean indicating whether the two values are different based on the specified comparison method.\n */\n isDiff(a: any, b: any, method: 'json' | 'default' = 'default'): boolean {\n if (method === 'json') {\n return JSON.stringify(a) !== JSON.stringify(b);\n }\n\n if (Object.is(a, b)) return false;\n\n if (typeof a !== typeof b) return true;\n\n if (a == null || b == null) return a !== b;\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() !== b.getTime();\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return true;\n\n for (let i = 0; i < a.length; i++) {\n if (this.isDiff(a[i], b[i], method)) {\n return true;\n }\n }\n\n return false;\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) return true;\n for (const key of aKeys) {\n if (!Object.prototype.hasOwnProperty.call(b, key) || this.isDiff(a[key], b[key], method)) {\n return true;\n }\n }\n return false;\n }\n\n return a !== b;\n }\n}\n","export const avatars = [\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/13e5fa74-defa-11e9-809c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/dbdc9198-def8-11e9-8681-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/998f01ae-def8-11e9-b95c-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/de130ab0-def7-11e9-b668-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ebe4cd89-b4f4-4cd9-adac-2f30151b4209-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/215b7342-def9-11e9-9a66-784f43822e80-profile_image-300x300.png',\n 'https://static-cdn.jtvnw.net/user-default-pictures-uv/ead5c8b2-a4c9-4724-b1dd-9f00b46cbd3d-profile_image-300x300.png',\n];\n","import { Twitch } from '../../types/twitch.js';\n\nexport const globalBadges: Twitch.GlobalBadge[] = [\n {\n set_id: 'qsmp2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/3',\n title: 'QSMP2',\n description: 'This badge was earned for watching QSMP during the initial 2026 launch!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/quackity',\n },\n ],\n },\n {\n set_id: 'jasontheween-7-day-survival',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f299577c-8b51-4cb1-ad7c-11faca0c32e9/3',\n title: 'JasonTheWeen 7 Day Survival',\n description:\n \"This badge was earned by watching 30 minutes of JasonTheWeen's 7 day survival stream!\",\n click_action: 'visit_url',\n click_url: 'https://twitch.tv/jasontheween',\n },\n ],\n },\n {\n set_id: 'support-a-streamer-ho26-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe0814c3-87f9-40cb-95b5-d1e7453f289d/3',\n title: \"Support a Streamer HO'26\",\n description:\n 'This badge was earned by subscribing or gifting a sub to any World of Tanks broadcast during the Holiday Ops 26 campaign period',\n click_action: 'visit_url',\n click_url: 'https://worldoftanks.eu/en/news/general-news/wot-monthly-december-2025/',\n },\n ],\n },\n {\n set_id: 'twitch-recap-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/48b26ab3-c9f1-4f16-b02d-fe877be389fd/3',\n title: 'Twitch Recap 2025',\n description: 'This exclusive badge was earned by the top 20% of Twitch users in 2025.',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/annual-recap',\n },\n ],\n },\n {\n set_id: 'ugly-sweater',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8eddf4ab-68f8-4ee8-a07d-9d7e8520463e/3',\n title: 'Ugly Sweater',\n description: 'This badge was earned for sharing festive Clips during Holiday Hoopla 2025.',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/how-to-use-badges?language=en_US',\n },\n ],\n },\n {\n set_id: 'fright-fest-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ef2cd27-2210-4640-bbf8-69b5c4d9e302/3',\n title: 'Fright Fest 2025',\n description: 'This badge was earned by users who shared the best 2025 Fright Fest clips.',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/en/2025/10/20/twitch-fright-fest-2025/',\n },\n ],\n },\n {\n set_id: 'gamerduo',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/be750d4d-a3b9-4116-ae75-6ee4f3294a19/3',\n title: 'GamerDuo',\n description: 'Subbed to a streamer and got 3 months of free Super Duolingo!',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/2025/10/02/sub-for-super-duolingo/',\n },\n ],\n },\n {\n set_id: 'video-games-day',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/34a57a67-b058-45a9-b088-da681aebc83e/3',\n title: 'Video Games Day',\n description:\n 'This badge was earned by users who downloaded and shared clips revolving around anything Video Games related in September 2025.',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/gaming',\n },\n ],\n },\n {\n set_id: 'twitch-intern-2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/91ed38ea-32fe-4f14-8db1-852537d19aa5/3',\n title: 'Twitch Intern 2022',\n description: 'This user was an intern at Twitch for the summer of 2022',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n set_id: 'touch-grass',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/51f536c1-96ca-495b-bc11-150c857a6d54/3',\n title: 'Touch Grass',\n description:\n 'This badge was earned by users who touched grass and shared their favorite IRL clips in August 2025.',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/twitch-chat-badges-guide',\n },\n ],\n },\n {\n set_id: 'twitchcon-referral-program-2025-chrome-star',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d139bccf-8184-4fec-a970-cd8d81a7f51a/3',\n title: 'TwitchCon Referral Program 2025 (Chrome Star)',\n description:\n 'This badge was earned by referring at least one friend who bought their TwitchCon 2025 ticket using your unique referral link.',\n click_action: 'visit_url',\n click_url: 'https://twitchcon.com/rotterdam-2025/referral-program/',\n },\n ],\n },\n {\n set_id: 'twitchcon-referral-program-2025-bleedpurple',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/81952c7b-cfec-479c-a8f6-2bccc296786c/3',\n title: 'TwitchCon Referral Program 2025 (bleedPurple)',\n description:\n 'This badge was earned by referring ten friends who bought their TwitchCon 2025 ticket using your unique referral link.',\n click_action: 'visit_url',\n click_url: 'https://twitchcon.com/rotterdam-2025/referral-program/',\n },\n ],\n },\n {\n set_id: 'share-the-love',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2de71f4f-b152-4308-a426-127a4cf8003a/3',\n title: 'Share the Love',\n description:\n 'This lovely badge was earned by users who shared their favorite Twitch clips in February 2025.',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/2025/02/14/share-the-love-this-valentine-s-day/',\n },\n ],\n },\n {\n set_id: 'gone-bananas',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e2ba99f4-6079-44d1-8c07-4ca6b58de61f/3',\n title: 'Gone Bananas Badge',\n description:\n 'This gilded banana badge was scored by sharing a lulz-worthy clip during April Fool’s week 2025.',\n click_action: 'visit_url',\n click_url: 'http://blog.twitch.tv/2025/04/01/april-fools-day/',\n },\n ],\n },\n {\n set_id: 'twitchcon-2025---rotterdam',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4d97fd0-437f-4d8d-b4d3-4b6d18e4705b/3',\n title: 'TwitchCon 2025',\n description: 'Celebrated TwitchCon’s 10 year anniversary in 2025',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/rotterdam-2025/',\n },\n ],\n },\n {\n set_id: 'clip-the-halls',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce9e266a-f490-4fb2-9989-aee20036bfa5/3',\n title: 'Clip the Halls',\n description:\n 'For spreading the holiday cheer by sharing a clip to TikTok or YouTube during Twitch Holiday Hoopla 2024.',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/en/2024/12/02/twitch-holiday-hoopla/',\n },\n ],\n },\n {\n set_id: 'twitch-recap-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/72f2a6ac-3d9b-4406-b9e9-998b27182f61/3',\n title: 'Twitch Recap 2024',\n description:\n 'The Official Chat Badge of the Year. It takes hard work and KomodoHype to receive it. You should be proud to tell everyone you know about this.',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/annual-recap',\n },\n ],\n },\n {\n set_id: 'subtember-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4149750c-9582-4515-9e22-da7d5437643b/3',\n title: 'SUBtember 2024',\n description: \"For being Subbie's friend and participating in SUBtember 2024!\",\n click_action: 'visit_url',\n click_url: 'https://link.twitch.tv/subtember2024',\n },\n ],\n },\n {\n set_id: 'twitch-intern-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae96ce48-e764-4232-aa48-d9abf9a5fdab/3',\n title: 'Twitch Intern 2024',\n description: 'This user was an intern at Twitch for the summer of 2024',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n set_id: 'twitch-dj',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf91bbc0-0332-413a-a7f3-e36bac08b624/3',\n title: 'Twitch DJ',\n description: 'This user is a DJ in the Twitch DJ Program.',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/dj-program',\n },\n ],\n },\n {\n set_id: 'destiny-2-the-final-shape-streamer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1bcaf3c-d7a2-442b-b407-03f2b8ff624d/3',\n title: 'Destiny 2: The Final Shape Streamer',\n description:\n 'I earned this badge by taking part in the Destiny 2: The Final Shape Raid Race!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/category/destiny-2\\t',\n },\n ],\n },\n {\n set_id: 'destiny-2-final-shape-raid-race',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e79ee64f-31f1-4485-9c81-b93957e69f8a/3',\n title: 'Destiny 2: The Final Shape Raid Race',\n description:\n 'I earned this badge by watching Destiny 2: The Final Shape Raid Race on Twitch!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/category/destiny-2',\n },\n ],\n },\n {\n set_id: 'twitchcon-2024---san-diego',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6575f0d1-2dc2-4f45-a13f-a1a969dcf8fa/3',\n title: 'TwitchCon 2024 - San Diego',\n description: 'Attended TwitchCon San Diego 2024',\n click_action: 'visit_url',\n click_url:\n 'https://twitchcon.com/san-diego-2024/?utm_source=twitch&utm_medium=chat-badge&utm_campaign=tcsd24-chat-badge',\n },\n ],\n },\n {\n set_id: 'minecraft-15th-anniversary-celebration',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/178077b2-8b86-4f8d-927c-66ed6c1b025f/3',\n title: 'Minecraft 15th Anniversary Celebration',\n description:\n \"This badge was earned for using a special emote as part of Minecraft's 15th Anniversary Celebration on Twitch!\",\n click_action: 'visit_url',\n click_url: 'https://twitch-web.app.link/e/vkOhfCa7nJb',\n },\n ],\n },\n {\n set_id: 'warcraft',\n versions: [\n {\n id: 'horde',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/de8b26b6-fd28-4e6c-bc89-3d597343800d/3',\n title: 'Horde',\n description: 'For the Horde!',\n click_action: 'visit_url',\n click_url: 'http://warcraftontwitch.tv/',\n },\n {\n id: 'alliance',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4816339-bad4-4645-ae69-d1ab2076a6b0/3',\n title: 'Alliance',\n description: 'For Lordaeron!',\n click_action: 'visit_url',\n click_url: 'http://warcraftontwitch.tv/',\n },\n ],\n },\n {\n set_id: 'vip',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/3',\n title: 'VIP',\n description: 'VIP',\n click_action: 'visit_url',\n click_url:\n 'https://help.twitch.tv/customer/en/portal/articles/659115-twitch-chat-badges-guide',\n },\n ],\n },\n {\n set_id: 'vga-champ-2017',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/03dca92e-dc69-11e7-ac5b-9f942d292dc7/3',\n title: '2017 VGA Champ',\n description: '2017 VGA Champ',\n click_action: 'visit_url',\n click_url:\n 'https://blog.twitch.tv/watch-and-co-stream-the-game-awards-this-thursday-on-twitch-3d8e34d2345d',\n },\n ],\n },\n {\n set_id: 'tyranny_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0c79afdf-28ce-4b0b-9e25-4f221c30bfde/3',\n title: 'Tyranny',\n description: 'Tyranny',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Tyranny/details',\n },\n ],\n },\n {\n set_id: 'twitchconNA2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c90a753f-ab20-41bc-9c42-ede062485d2c/3',\n title: 'TwitchCon 2023 - Las Vegas',\n description: 'Attended TwitchCon Las Vegas 2023',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/en/las-vegas-2023/',\n },\n ],\n },\n {\n set_id: 'twitchconNA2020',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/3',\n title: 'TwitchCon 2020 - North America',\n description: 'Registered for TwitchCon North America 2020',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna20',\n },\n ],\n },\n {\n set_id: 'twitchconNA2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/344d429a-0b34-48e5-a84c-14a1b5772a3a/3',\n title: 'TwitchCon 2022 - San Diego',\n description: 'Attended TwitchCon San Diego 2022',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/san-diego-2022/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna22',\n },\n ],\n },\n {\n set_id: 'twitchconNA2019',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/569c829d-c216-4f56-a191-3db257ed657c/3',\n title: 'TwitchCon 2019 - San Diego',\n description: 'Attended TwitchCon San Diego 2019',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcna19',\n },\n ],\n },\n {\n set_id: 'twitchconEU2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f2084e-46b9-4bb9-ae5e-00d594aafc64/3',\n title: 'TwitchCon 2023 - Paris',\n description: 'TwitchCon 2023 - Paris',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/paris-2023/?utm_source=chat_badge',\n },\n ],\n },\n {\n set_id: 'twitchconEU2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e4744003-50b7-4eb8-9b47-a7b1616a30c6/3',\n title: 'TwitchCon 2022 - Amsterdam',\n description: 'Attended TwitchCon Amsterdam 2022',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/amsterdam-2022/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tceu22',\n },\n ],\n },\n {\n set_id: 'twitchcon2018',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e68164e4-087d-4f62-81da-d3557efae3cb/3',\n title: 'TwitchCon 2018 - San Jose',\n description: 'Attended TwitchCon San Jose 2018',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tc18',\n },\n ],\n },\n {\n set_id: 'twitchconAmsterdam2020',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed917c9a-1a45-4340-9c64-ca8be4348c51/3',\n title: 'TwitchCon 2020 - Amsterdam',\n description: 'Registered for TwitchCon Amsterdam 2020',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitchcon.com/amsterdam/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tcamsterdam20',\n },\n ],\n },\n {\n set_id: 'twitchconEU2019',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/590eee9e-f04d-474c-90e7-b304d9e74b32/3',\n title: 'TwitchCon 2019 - Berlin',\n description: 'Attended TwitchCon Berlin 2019',\n click_action: 'visit_url',\n click_url:\n 'https://europe.twitchcon.com/?utm_source=twitch-chat&utm_medium=badge&utm_campaign=tceu19',\n },\n ],\n },\n {\n set_id: 'twitchbot',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/df9095f6-a8a0-4cc2-bb33-d908c0adffb8/3',\n title: 'AutoMod',\n description: 'AutoMod',\n click_action: 'visit_url',\n click_url: 'http://link.twitch.tv/automod_blog',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8dbdfef5-0901-457f-a644-afa77ba176e5/3',\n title: 'AutoMod',\n description: 'Badge type for messages that come from the automated moderation system',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'twitchcon2017',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0964bed0-5c31-11e7-a90b-0739918f1d9b/3',\n title: 'TwitchCon 2017 - Long Beach',\n description: 'Attended TwitchCon Long Beach 2017',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/',\n },\n ],\n },\n {\n set_id: 'twitchcon-2024---rotterdam',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/95b10c66-775c-4652-9b86-10bd3a709422/3',\n title: 'TwitchCon 2024 - Rotterdam',\n description: 'Attended TwitchCon Rotterdam 2024',\n click_action: 'visit_url',\n click_url:\n 'https://twitchcon.com/rotterdam-2024/?utm_source=twitch&utm_medium=chat-badge&utm_campaign=tceu24-chat-badge',\n },\n ],\n },\n {\n set_id: 'twitch-recap-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d9e9812-ba9b-48a6-8690-13f3f338ee65/3',\n title: 'Twitch Recap 2023',\n description:\n 'This user bled purple like it was their job, and was one of the most engaged members of Twitch in 2023!',\n click_action: 'visit_url',\n click_url: 'https://twitch-web.app.link/e/twitch-recap',\n },\n ],\n },\n {\n set_id: 'twitch-intern-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e239e7e0-e373-4fdf-b95e-3469aec28485/3',\n title: 'Twitch Intern 2023',\n description: 'This user was an intern at Twitch for the summer of 2023',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/jobs/early-career/',\n },\n ],\n },\n {\n set_id: 'treasure-adventure-world_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/59810027-2988-4b0d-b88d-fc414c751305/3',\n title: 'Treasure Adventure World',\n description: 'Treasure Adventure World',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Treasure%20Adventure%20World/details',\n },\n ],\n },\n {\n set_id: 'titan-souls_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/092a7ce2-709c-434f-8df4-a6b075ef867d/3',\n title: 'Titan Souls',\n description: 'Titan Souls',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Titan%20Souls/details',\n },\n ],\n },\n {\n set_id: 'this-war-of-mine_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6a20f814-cb2c-414e-89cc-f8dd483e1785/3',\n title: 'This War of Mine',\n description: 'This War of Mine',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/This%20War%20of%20Mine/details',\n },\n ],\n },\n {\n set_id: 'the-surge_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2c4d7e95-e138-4dde-a783-7956a8ecc408/3',\n title: 'The Surge',\n description: 'The Surge',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n set_id: 'the-surge_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c9f69d89-31c8-41aa-843b-fee956dfbe23/3',\n title: 'The Surge',\n description: 'The Surge',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n set_id: 'the-surge_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a8fc2d4-3125-4ccb-88db-e970dfbee189/3',\n title: 'The Surge',\n description: 'The Surge',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/The%20Surge/details',\n },\n ],\n },\n {\n set_id: 'the-golden-predictor-of-the-game-awards-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c84c4dd7-9318-4e8b-9f01-1612d3f83dae/3',\n title: 'The Golden Predictor of the Game Awards 2023',\n description:\n \"You've predicted the entire 2023 Game Awards perfectly, here is a special gift for your work. Go ahead, show it off!\",\n click_action: 'visit_url',\n click_url:\n 'https://blog.twitch.tv/2023/11/30/the-2023-game-awards-is-live-on-twitch-december-7th/',\n },\n ],\n },\n {\n set_id: 'the-game-awards-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/10cf46de-61e7-4a42-807a-7898408ce352/3',\n title: 'The Game Awards 2023',\n description:\n 'You’ve completed all categories of the 2023 Twitch Predicts: The Game Awards extension!',\n click_action: 'visit_url',\n click_url:\n 'https://blog.twitch.tv/2023/11/30/the-2023-game-awards-is-live-on-twitch-december-7th/',\n },\n ],\n },\n {\n set_id: 'superhot_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5a06922-83b5-40cb-885f-bcffd3cd6c68/3',\n title: 'Superhot',\n description: 'Superhot',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/superhot/details',\n },\n ],\n },\n {\n set_id: 'strafe_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0051508d-2d42-4e4b-a328-c86b04510ca4/3',\n title: 'Strafe',\n description: 'Strafe',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/strafe/details',\n },\n ],\n },\n {\n set_id: 'streamer-awards-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/efc07d3d-46e4-4738-827b-a5bf3508983a/3',\n title: 'Streamer Awards 2024',\n description:\n \"You've completed all categories of the 2024 Twitch Predicts: The Streamer Awards extension!\",\n click_action: 'visit_url',\n click_url: 'https://thestreamerawards.com/home',\n },\n ],\n },\n {\n set_id: 'starbound_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e838e742-0025-4646-9772-18a87ba99358/3',\n title: 'Starbound',\n description: 'Starbound',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Starbound/details',\n },\n ],\n },\n {\n set_id: 'staff',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d97c37bd-a6f5-4c38-8f57-4e4bef88af34/3',\n title: 'Staff',\n description: 'Twitch Staff',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/jobs?ref=chat_badge',\n },\n ],\n },\n {\n set_id: 'samusoffer_beta',\n versions: [\n {\n id: '0',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/aa960159-a7b8-417e-83c1-035e4bc2deb5/3',\n title: 'beta_title1',\n description: 'beta_title1',\n click_action: 'visit_url',\n click_url: 'https://twitch.amazon.com/prime',\n },\n ],\n },\n {\n set_id: 'rplace-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33e0c67-c380-4241-828a-099c46e51c66/3',\n title: 'r/place 2023 Cake',\n description:\n \"A very delicious badge earned by watching Reddit's r/place 2023 event on Twitch Rivals or other participating channels.\",\n click_action: 'visit_url',\n click_url: 'https://www.reddit.com/r/place/',\n },\n ],\n },\n {\n set_id: 'rift_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f939686b-2892-46a4-9f0d-5f582578173e/3',\n title: 'RIFT',\n description: 'RIFT',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Rift/details',\n },\n ],\n },\n {\n set_id: 'raiden-v-directors-cut_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/441b50ae-a2e3-11e7-8a3e-6bff0c840878/3',\n title: 'Raiden V',\n description: 'Raiden V',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Raiden%20V/details',\n },\n ],\n },\n {\n set_id: 'psychonauts_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9811799-dce3-475f-8feb-3745ad12b7ea/3',\n title: 'Psychonauts',\n description: 'Psychonauts',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Psychonauts/details',\n },\n ],\n },\n {\n set_id: 'premium',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bbbe0db0-a598-423e-86d0-f9fb98ca1933/3',\n title: 'Prime Gaming',\n description: 'Prime Gaming',\n click_action: 'visit_url',\n click_url: 'https://gaming.amazon.com',\n },\n ],\n },\n {\n set_id: 'overwatch-league-insider_2019B',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5860811-d714-4413-9433-d6b1c9fc803c/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/75f05d4b-3042-415c-8b0b-e87620a24daf/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/765a0dcf-2a94-43ff-9b9c-ef6c209b90cd/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8ae0ccd-783d-460d-93ee-57c485c558a6/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/be87fd6d-1560-4e33-9ba4-2401b58d901f/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n set_id: 'partner',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d12a2e27-16f6-41d0-ab77-b780518f00a3/3',\n title: 'Verified',\n description: 'Verified',\n click_action: 'visit_url',\n click_url: 'https://blog.twitch.tv/2017/04/24/the-verified-badge-is-here-13381bc05735',\n },\n ],\n },\n {\n set_id: 'overwatch-league-insider_2019A',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca980da1-3639-48a6-95a3-a03b002eb0e5/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ab7fa7a7-c2d9-403f-9f33-215b29b43ce4/3',\n title: 'OWL All-Access Pass 2019',\n description: 'OWL All-Access Pass 2019',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n set_id: 'okhlos_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/dc088bd6-8965-4907-a1a2-c0ba83874a7d/3',\n title: 'Okhlos',\n description: 'Okhlos',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Okhlos/details',\n },\n ],\n },\n {\n set_id: 'overwatch-league-insider_2018B',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/34ec1979-d9bb-4706-ad15-464de814a79d/3',\n title: 'OWL All-Access Pass 2018',\n description: 'OWL All-Access Pass 2018',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n set_id: 'overwatch-league-insider_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/51e9e0aa-12e3-48ce-b961-421af0787dad/3',\n title: 'OWL All-Access Pass 2018',\n description: 'OWL All-Access Pass 2018',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/overwatchleague',\n },\n ],\n },\n {\n set_id: 'kingdom-new-lands_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e3c2a67e-ef80-4fe3-ae41-b933cd11788a/3',\n title: 'Kingdom: New Lands',\n description: 'Kingdom: New Lands',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Kingdom:%20New%20Lands/details',\n },\n ],\n },\n {\n set_id: 'jackbox-party-pack_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0f964fc1-f439-485f-a3c0-905294ee70e8/3',\n title: 'Jackbox Party Pack',\n description: 'Jackbox Party Pack',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/The%20Jackbox%20Party%20Pack/details',\n },\n ],\n },\n {\n set_id: 'innerspace_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc7d6018-657a-40e4-9246-0acdc85886d1/3',\n title: 'Innerspace',\n description: 'Innerspace',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Innerspace/details',\n },\n ],\n },\n {\n set_id: 'innerspace_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/97532ccd-6a07-42b5-aecf-3458b6b3ebea/3',\n title: 'Innerspace',\n description: 'Innerspace',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Innerspace/details',\n },\n ],\n },\n {\n set_id: 'hype-train',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fae4086c-3190-44d4-83c8-8ef0cbe1a515/3',\n title: 'Current Hype Train Conductor',\n description: 'Top supporter during the most recent hype train',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/hype-train-guide',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c8d038a-3a29-45ea-96d4-5031fb1a7a81/3',\n title: 'Former Hype Train Conductor',\n description: 'Top supporter during prior hype trains',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/hype-train-guide',\n },\n ],\n },\n {\n set_id: 'hello_neighbor_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/030cab2c-5d14-11e7-8d91-43a5a4306286/3',\n title: 'Hello Neighbor',\n description: 'Hello Neighbor',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Hello%20Neighbor/details',\n },\n ],\n },\n {\n set_id: 'gold-pixel-heart',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1687873b-cf38-412c-aad3-f9a4ce17f8b6/3',\n title: 'Gold Pixel Heart',\n description:\n 'Thank you for donating via the Twitch Charity tool during Twitch Together for Good 2023!',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/twitch-charity',\n },\n ],\n },\n {\n set_id: 'heavy-bullets_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc83b76b-f8b2-4519-9f61-6faf84eef4cd/3',\n title: 'Heavy Bullets',\n description: 'Heavy Bullets',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Heavy%20Bullets/details',\n },\n ],\n },\n {\n set_id: 'glitchcon2020',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d4b03b9-51ea-42c9-8f29-698e3c85be3d/3',\n title: 'GlitchCon 2020',\n description: 'Earned for Watching Glitchcon 2020',\n click_action: 'visit_url',\n click_url: 'https://www.twitchcon.com/',\n },\n ],\n },\n {\n set_id: 'glhf-pledge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3158e758-3cb4-43c5-94b3-7639810451c5/3',\n title: 'GLHF Pledge',\n description: 'Signed the GLHF pledge in support for inclusive gaming communities',\n click_action: 'visit_url',\n click_url: 'https://www.anykey.org/pledge',\n },\n ],\n },\n {\n set_id: 'getting-over-it_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bb620b42-e0e1-4373-928e-d4a732f99ccb/3',\n title: 'Getting Over It',\n description: 'Getting Over It',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Getting%20Over%20It/details',\n },\n ],\n },\n {\n set_id: 'getting-over-it_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8d4e178c-81ec-4c71-af68-745b40733984/3',\n title: 'Getting Over It',\n description: 'Getting Over It',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Getting%20Over%20It/details',\n },\n ],\n },\n {\n set_id: 'frozen-synapse_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4bd464d-55ea-4238-a11d-744f034e2375/3',\n title: 'Frozen Synapse',\n description: 'Frozen Synapse',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Frozen%20Synapse/details',\n },\n ],\n },\n {\n set_id: 'founder',\n versions: [\n {\n id: '0',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/511b78a9-ab37-472f-9569-457753bbe7d3/3',\n title: 'Founder',\n description: 'Founder',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/s/article/founders-badge',\n },\n ],\n },\n {\n set_id: 'frozen-cortext_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2015f087-01b5-4a01-a2bb-ecb4d6be5240/3',\n title: 'Frozen Cortext',\n description: 'Frozen Cortext',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Frozen%20Cortex/details',\n },\n ],\n },\n {\n set_id: 'firewatch_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b6bf4889-4902-49e2-9658-c0132e71c9c4/3',\n title: 'Firewatch',\n description: 'Firewatch',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Firewatch/details',\n },\n ],\n },\n {\n set_id: 'enter-the-gungeon_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/53c9af0b-84f6-4f9d-8c80-4bc51321a37d/3',\n title: 'Enter The Gungeon',\n description: 'Enter The Gungeon',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Enter%20the%20Gungeon/details',\n },\n ],\n },\n {\n set_id: 'duelyst_5',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/290419b6-484a-47da-ad14-a99d6581f758/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_6',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5e54a4b-0bf1-463a-874a-38524579aed0/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_7',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf508179-3183-4987-97e0-56ca44babb9f/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1938acd3-2d18-471d-b1af-44f2047c033c/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_4',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/39e717a8-00bc-49cc-b6d4-3ea91ee1be25/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/344c07fc-1632-47c6-9785-e62562a6b760/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'duelyst_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7d9c12f4-a2ac-4e88-8026-d1a330468282/3',\n title: 'Duelyst',\n description: 'Duelyst',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Duelyst/details',\n },\n ],\n },\n {\n set_id: 'devilian_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3cb92b57-1eef-451c-ac23-4d748128b2c5/3',\n title: 'Devilian',\n description: 'Devilian',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Devilian/details',\n },\n ],\n },\n {\n set_id: 'devil-may-cry-hd_4',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/af836b94-8ffd-4c0a-b7d8-a92fad5e3015/3',\n title: 'Devil May Cry HD Collection',\n description: 'Devil May Cry HD Collection',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n set_id: 'devil-may-cry-hd_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/df84c5bf-8d66-48e2-b9fb-c014cc9b3945/3',\n title: 'Devil May Cry HD Collection',\n description: 'Devil May Cry HD Collection',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n set_id: 'devil-may-cry-hd_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/408548fe-aa74-4d53-b5e9-960103d9b865/3',\n title: 'Devil May Cry HD Collection',\n description: 'Devil May Cry HD Collection',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n set_id: 'devil-may-cry-hd_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/633877d4-a91c-4c36-b75b-803f82b1352f/3',\n title: 'Devil May Cry HD Collection',\n description: 'Devil May Cry HD Collection',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Devil%20May%20Cry%20HD%20Collection/details',\n },\n ],\n },\n {\n set_id: 'deceit_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b14fef48-4ff9-4063-abf6-579489234fe9/3',\n title: 'Deceit',\n description: 'Deceit',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Deceit/details',\n },\n ],\n },\n {\n set_id: 'darkest-dungeon_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/52a98ddd-cc79-46a8-9fe3-30f8c719bc2d/3',\n title: 'Darkest Dungeon',\n description: 'Darkest Dungeon',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Darkest%20Dungeon/details',\n },\n ],\n },\n {\n set_id: 'cuphead_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4384659a-a2e3-11e7-a564-87f6b1288bab/3',\n title: 'Cuphead',\n description: 'Cuphead',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Cuphead/details',\n },\n ],\n },\n {\n set_id: 'clip-champ',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f38976e0-ffc9-11e7-86d6-7f98b26a9d79/3',\n title: 'Power Clipper',\n description: 'Power Clipper',\n click_action: 'visit_url',\n click_url: 'https://help.twitch.tv/customer/portal/articles/2918323-clip-champs-guide',\n },\n ],\n },\n {\n set_id: 'broken-age_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/56885ed2-9a09-4c8e-8131-3eb9ec15af94/3',\n title: 'Broken Age',\n description: 'Broken Age',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Broken%20Age/details',\n },\n ],\n },\n {\n set_id: 'bubsy-the-woolies_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8129382-1f4e-4d15-a8d2-48bdddba9b81/3',\n title: 'Bubsy: The Woolies Strike Back',\n description: 'Bubsy: The Woolies Strike Back',\n click_action: 'visit_url',\n click_url:\n 'https://www.twitch.tv/directory/game/Bubsy:%20The%20Woolies%20Strike%20Back/details',\n },\n ],\n },\n {\n set_id: 'bits-leader',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bedf8c3-7a6d-4df2-b62f-791b96a5dd31/3',\n title: 'Bits Leader 1',\n description: 'Ranked as a top cheerer on this channel',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f04baac7-9141-4456-a0e7-6301bcc34138/3',\n title: 'Bits Leader 2',\n description: 'Ranked as a top cheerer on this channel',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f1d2aab6-b647-47af-965b-84909cf303aa/3',\n title: 'Bits Leader 3',\n description: 'Ranked as a top cheerer on this channel',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n ],\n },\n {\n set_id: 'brawlhalla_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf6d6579-ab02-4f0a-9f64-a51c37040858/3',\n title: 'Brawlhalla',\n description: 'Brawlhalla',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Brawlhalla/details',\n },\n ],\n },\n {\n set_id: 'bits',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/73b5c3fb-24f9-4a82-a852-2f475b59411c/3',\n title: 'cheer 1',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '100',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/09d93036-e7ce-431c-9a9e-7044297133f2/3',\n title: 'cheer 100',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d85a29e-79ad-4c63-a285-3acd2c66f2ba/3',\n title: 'cheer 1000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '5000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/57cd97fc-3e9e-4c6d-9d41-60147137234e/3',\n title: 'cheer 5000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '10000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/68af213b-a771-4124-b6e3-9bb6d98aa732/3',\n title: 'cheer 10000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '25000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/64ca5920-c663-4bd8-bfb1-751b4caea2dd/3',\n title: 'cheer 25000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '50000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/62310ba7-9916-4235-9eba-40110d67f85d/3',\n title: 'cheer 50000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '75000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce491fa4-b24f-4f3b-b6ff-44b080202792/3',\n title: 'cheer 75000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '100000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/96f0540f-aa63-49e1-a8b3-259ece3bd098/3',\n title: 'cheer 100000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '200000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a0b90c4-e4ef-407f-84fe-36b14aebdbb6/3',\n title: 'cheer 200000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '300000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ac13372d-2e94-41d1-ae11-ecd677f69bb6/3',\n title: 'cheer 300000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '400000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a8f393af-76e6-4aa2-9dd0-7dcc1c34f036/3',\n title: 'cheer 400000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f6932b57-6a6e-4062-a770-dfbd9f4302e5/3',\n title: 'cheer 500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '600000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4d908059-f91c-4aef-9acb-634434f4c32e/3',\n title: 'cheer 600000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '700000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1d2a824-f216-4b9f-9642-3de8ed370957/3',\n title: 'cheer 700000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '800000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec2ee3e-5633-4c2a-8e77-77473fe409e6/3',\n title: 'cheer 800000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '900000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/088c58c6-7c38-45ba-8f73-63ef24189b84/3',\n title: 'cheer 900000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/494d1c8e-c3b2-4d88-8528-baff57c9bd3f/3',\n title: 'cheer 1000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1250000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ce217209-4615-4bf8-81e3-57d06b8b9dc7/3',\n title: 'cheer 1250000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4eba5b4-17a7-40a1-a668-bc1972c1e24d/3',\n title: 'cheer 1500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '1750000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/183f1fd8-aaf4-450c-a413-e53f839f0f82/3',\n title: 'cheer 1750000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '2000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ea89c53-1a3b-45f9-9223-d97ae19089f2/3',\n title: 'cheer 2000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '2500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cf061daf-d571-4811-bcc2-c55c8792bc8f/3',\n title: 'cheer 2500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '3000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5671797f-5e9f-478c-a2b5-eb086c8928cf/3',\n title: 'cheer 3000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '3500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c3d218f5-1e45-419d-9c11-033a1ae54d3a/3',\n title: 'cheer 3500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '4000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/79fe642a-87f3-40b1-892e-a341747b6e08/3',\n title: 'cheer 4000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '4500000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/736d4156-ac67-4256-a224-3e6e915436db/3',\n title: 'cheer 4500000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n {\n id: '5000000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f085f85-8d15-4a03-a829-17fca7bf1bc2/3',\n title: 'cheer 5000000',\n description: ' ',\n click_action: 'visit_url',\n click_url: 'https://bits.twitch.tv',\n },\n ],\n },\n {\n set_id: 'bits-charity',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a539dc18-ae19-49b0-98c4-8391a594332b/3',\n title: 'Direct Relief - Charity 2018',\n description: 'Supported their favorite streamer during the 2018 Blizzard of Bits',\n click_action: 'visit_url',\n click_url: 'https://link.twitch.tv/blizzardofbits',\n },\n ],\n },\n {\n set_id: 'battlechefbrigade_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/107ebb20-4fcd-449a-9931-cd3f81b84c70/3',\n title: 'Battle Chef Brigade',\n description: 'Battle Chef Brigade',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n set_id: 'battlerite_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/484ebda9-f7fa-4c67-b12b-c80582f3cc61/3',\n title: 'Battlerite',\n description: 'Battlerite',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Battlerite/details',\n },\n ],\n },\n {\n set_id: 'battlechefbrigade_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ef1e96e8-a0f9-40b6-87af-2977d3c004bb/3',\n title: 'Battle Chef Brigade',\n description: 'Battle Chef Brigade',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n set_id: 'battlechefbrigade_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/24e32e67-33cd-4227-ad96-f0a7fc836107/3',\n title: 'Battle Chef Brigade',\n description: 'Battle Chef Brigade',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Battle%20Chef%20Brigade/details',\n },\n ],\n },\n {\n set_id: 'axiom-verge_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f209b747-45ee-42f6-8baf-ea7542633d10/3',\n title: 'Axiom Verge',\n description: 'Axiom Verge',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Axiom%20Verge/details',\n },\n ],\n },\n {\n set_id: 'anomaly-2_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d1d1ad54-40a6-492b-882e-dcbdce5fa81e/3',\n title: 'Anomaly 2',\n description: 'Anomaly 2',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Anomaly%202/details',\n },\n ],\n },\n {\n set_id: 'anomaly-warzone-earth_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/858be873-fb1f-47e5-ad34-657f40d3d156/3',\n title: 'Anomaly Warzone Earth',\n description: 'Anomaly Warzone Earth',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/Anomaly:%20Warzone%20Earth/details',\n },\n ],\n },\n {\n set_id: 'ambassador',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2cbc339f-34f4-488a-ae51-efdf74f4e323/3',\n title: 'Twitch Ambassador',\n description: 'Twitch Ambassador',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/team/ambassadors',\n },\n ],\n },\n {\n set_id: 'H1Z1_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc71386c-86cd-11e7-a55d-43f591dc0c71/3',\n title: 'H1Z1',\n description: 'H1Z1',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/H1Z1/details',\n },\n ],\n },\n {\n set_id: '60-seconds_3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f4306617-0f96-476f-994e-5304f81bcc6e/3',\n title: '60 Seconds!',\n description: '60 Seconds!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n set_id: '60-seconds_2',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/64513f7d-21dd-4a05-a699-d73761945cf9/3',\n title: '60 Seconds!',\n description: '60 Seconds!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n set_id: '60-seconds_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e7252f9-7e80-4d3d-ae42-319f030cca99/3',\n title: '60 Seconds!',\n description: '60 Seconds!',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/60%20Seconds!/details',\n },\n ],\n },\n {\n set_id: '1979-revolution_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7833bb6e-d20d-48ff-a58d-67fe827a4f84/3',\n title: '1979 Revolution',\n description: '1979 Revolution',\n click_action: 'visit_url',\n click_url: 'https://www.twitch.tv/directory/game/1979%20Revolution/details',\n },\n ],\n },\n {\n set_id: '10-years-as-twitch-staff',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e48bfab8-6697-4c5b-84df-e64fb0150701/3',\n title: '10 years as Twitch Staff',\n description: 'Celebrating 10 years as Twitch Staff!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: '15-years-as-twitch-staff',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/523802ec-086b-4dec-b441-90e28b0806d8/3',\n title: '15 years as Twitch Staff',\n description: 'Celebrating 15 years as Twitch Staff!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: '5-years-as-twitch-staff',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d53671d0-0ce0-4706-905f-7fe8b122a27a/3',\n title: '5 years as Twitch Staff',\n description: 'Celebrating 5 years as Twitch Staff!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'aang',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc8243b-037c-4e5e-a8f3-87ad1f01850d/3',\n title: 'Aang',\n description:\n 'This badge was earned by subscribing or gifting a sub to an Avatar Legends: The Fighting Game streamer!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'admin',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ef7e029-4cdf-4d4d-a0d5-e2b3fb2583fe/3',\n title: 'Admin',\n description: 'Twitch Admin',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'alone',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/10ba11a2-0171-42b6-9bba-8f2f14248172/3',\n title: 'Alone',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Little Nightmares III category during launch.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'anonymous-cheerer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca3db7f7-18f5-487e-a329-cd0b538ee979/3',\n title: 'Anonymous Cheerer',\n description: 'Anonymous Cheerer',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'arc-raiders-launch-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d4aa495f-a0e4-4ab4-b3eb-7c2ea573b03f/3',\n title: 'Arc Raiders Launch 2025',\n description:\n 'This badge was earned by subscribing or gifting a sub to an Arc Raiders streamer during launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'arcane-season-2-premiere',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1d833bde-edc7-4d23-b7b6-ad5a13296675/3',\n title: 'Arcane Season 2 Premiere',\n description: 'This badge was earned by watching the premiere of Arcane Season 2!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'artist-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4300a897-03dc-4e83-8c0e-c332fee7057f/3',\n title: 'Artist',\n description: 'Artist on this Channel',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'battlefield-6',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d7750af0-caca-47c5-b207-1af9be69ce1b/3',\n title: 'Battlefield 6',\n description: 'This badge was earned by subscribing to a streamer playing Battlefield 6.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'bingbonglove',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ffa02fc-ae89-4557-95ca-b9fc65909bd0/3',\n title: 'BingBongLove',\n description:\n 'This badge was earned by tuning in to a PEAK stream for 15 minutes from February 13 - 28, 2026!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'black-ops-7-global-launch',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e225aad6-3780-4bdc-ae38-48d3ab7dc36e/3',\n title: 'Black Ops 7 Global Launch',\n description:\n 'This badge was earned by subscribing to a COD: Black Ops 7 streamer during launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'borderlands-4-badge---ripper',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/098219cb-48d8-4945-96a6-80594c7a90dd/3',\n title: 'Borderlands 4 Badge - Ripper',\n description: 'This user joined the ranks of the Rippers in Borderlands 4.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'borderlands-4-badge---vault-symbol',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/97eee27d-c87f-4afb-a020-04a9d04456df/3',\n title: 'Borderlands 4 Badge - Vault Symbol',\n description: 'This user is rocking the Vault Symbol from Borderlands 4.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'bot-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ffa9565-c35b-4cad-800b-041e60659cf2/3',\n title: 'Chat Bot',\n description: 'This Bot has been added to the channel by the broadcaster.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'broadcaster',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5527c58c-fb7d-422d-b71b-f309dcb85cc1/3',\n title: 'Broadcaster',\n description: 'Broadcaster',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'bungie-foundation-ally',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f5f78a03-c73e-4ae4-86d3-a3bef7ceca6f/3',\n title: 'Bungie Foundation Ally',\n description: 'This badge is awarded for being an ally of the Bungie Foundation!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'bungie-foundation-supporter',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/85cb4623-0dd6-4f41-b86e-765bc8ac367d/3',\n title: 'Bungie Foundation Supporter',\n description: 'This badge is awarded for being a supporter of the Bungie Foundation!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'chatter-cs-go-2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/57b6bd6b-a1b5-4204-9e6c-eb8ed5831603/3',\n title: 'CS:GO Week Brazil 2022',\n description: 'Chatted during CS:GO Week Brazil 2022',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'clips-leader',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/12f70951-efea-48c2-b42b-d5e2ea0d71f7/3',\n title: 'Clips Leader 1',\n description: 'Ranked as a top clipper in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9eddf7ab-aa46-4798-abe2-710db1043254/3',\n title: 'Clips Leader 2',\n description: 'Ranked as a top clipper in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb838633-6ff6-46df-98b4-9e53fcff84f6/3',\n title: 'Clips Leader 3',\n description: 'Ranked as a top clipper in this community',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'creator-cs-go-2022',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a2ea6df9-ac0a-4956-bfe9-e931f50b94fa/3',\n title: 'CS:GO Week Brazil 2022',\n description: 'Streamed during CS:GO Week Brazil 2022',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'crimson-butterfly',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/63243824-6d43-45cf-8d21-fe0b06ab587f/3',\n title: 'Crimson Butterfly',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the FATAL FRAME II: Crimson Butterfly REMAKE category!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'diablo-30th-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2f98d79a-c78c-4c61-ac9e-7bc544d44619/3',\n title: 'Diablo 30th Anniversary',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Diablo IV streamer during the Diablo 30th Anniversary!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'diana',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/38801cc6-4d01-40f6-8949-6b9f9d5334b8/3',\n title: 'Diana',\n description:\n 'This badge was earned by subscribing or gifting a sub for a streamer in the Pragmata category',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'ditto',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b577304e-7dc9-49f2-bee1-68caf56a91e6/3',\n title: 'Ditto',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Pokémon Pokopia streamer during launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'dragonscimmy',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/da4c6554-4472-4949-b33b-e79164dbba0b/3',\n title: 'DragonScimmy',\n description:\n 'This badge was earned by subscribing or gifting a sub to any Old School RuneScape broadcast in 2025 during the launch of Sailing, OSRS’ first ever new skill!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'dreamcon-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5dfbd056-8ac1-407f-bdf3-f83183fa97ae/3',\n title: 'Dream Con 2024',\n description:\n 'This badge was earned by watching Dream Con 2024 or completing the post-event survey!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'elden-ring-recluse',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5afadc6c-933b-4ede-b318-3752bbf267a9/3',\n title: 'Elden Ring SuperFan badge - Recluse',\n description:\n 'You used Stream Together or participated in a stream before or after Nightreign dropped. You’ve earned the Recluse badge.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'elden-ring-wylder',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d5ab328-0916-4655-90b9-78b983ca4262/3',\n title: 'Elden Ring Nightreign Clip badge - Wylder',\n description: 'You captured a clippable Elden Ring moment. You’ve earned the Wylder badge.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'eso_1',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/18647a68-a35f-48d7-bf97-ae5deb6b277d/3',\n title: 'Elder Scrolls Online',\n description: 'Elder Scrolls Online',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'evo-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1469e9cf-14d9-4a48-a91c-81712d027439/3',\n title: 'Evo 2025',\n description: 'You have earned the Evo 2025 Badge',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'extension',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea8b0f8c-aa27-11e8-ba0c-1370ffff3854/3',\n title: 'Extension',\n description: 'Extension',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'fallout-season-2-ghoul',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/815334c4-3123-489b-8854-2af0f4027b00/3',\n title: 'Fallout Season 2 Ghoul',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Fallout 76 streamer during the launch of Burning Springs and Fallout Season 2!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'first-stand-2026-supporter',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ea899f87-f7f5-4d9d-9de9-173331341199/3',\n title: 'First Stand 2026 Supporter',\n description: 'This badge was rewarded to fans who supported First Stand 2026!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'first-stand-2026-viewer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ae99aac-ac5b-4d69-884b-3eb20621340d/3',\n title: 'First Stand 2026 Viewer',\n description: 'This badge was rewarded to fans who watched First Stand 2026!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'fischer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/50488ced-e1ee-4ea4-bb44-fb60d7d396c2/3',\n title: 'Fischer',\n description: 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'frog-lantern',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/dfc75f94-14f9-404b-b953-37eba481df37/3',\n title: 'Frog Lantern',\n description:\n 'This badge was earned by subscribing or gifting three times in the Sea of Thieves category!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'game-developer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/85856a4a-eb7d-4e26-a43e-d204a977ade4/3',\n title: 'Game Developer',\n description: 'Game Developer for:',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'gears-of-war-superfan-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/18b92728-aa7a-4e24-acb5-b14ea17c8b2b/3',\n title: 'Gears of War Superfan Badge',\n description: 'This user is a Gears of War: Reloaded Superfan.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'gingko-leaf',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/394abbbd-cc1d-427f-bc00-bce294353448/3',\n title: 'Gingko Leaf',\n description:\n \"This badge was earned by watching 30 minutes of a Ghost of Yotei stream during the game's launch!\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'global_mod',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9384c43e-4ce7-4e94-b2a1-b93656896eba/3',\n title: 'Global Moderator',\n description: 'Global Moderator',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'gold-pixel-heart---together-for-good-24',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/52c90eac-b7ec-4e24-b500-8fceecfe91e8/3',\n title: \"Gold Pixel Heart - Together For Good '24\",\n description:\n 'This badge was earned by donating $50 or more as part of Twitch Together for Good 2024!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'gp-explorer-3',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1e3b6965-2224-44d1-a67a-6d186c1fb17d/3',\n title: 'GP Explorer 3',\n description:\n 'This badge was earned by watching 15 minutes of GP Explorer 3 on any of the broadcasting channels.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'hornet',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4dc7b047-8c59-4522-97f2-24fb63147f56/3',\n title: 'Hornet',\n description:\n 'This badge was earned by subscribing to a streamer in the Hollow Knight: Silksong category during game launch week.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'hunt-crosses',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b1e77273-2fc0-4d36-873a-67a7c1647efe/3',\n title: 'Hunt Crosses',\n description:\n 'This badge was earned by subscribing or gifting a sub in the Hunt: Showdown 1896 category from Dec. 12 - Dec. 24, 2025.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'hypershot-celestial',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ee3441d-92d4-4f00-b8b4-64cb3d97e17e/3',\n title: 'Hypershot Celestial',\n description: 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'jeff-the-land-shark',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ad51bd4c-2621-4d7c-8580-89243002bc8b/3',\n title: 'Jeff the Land Shark',\n description:\n \"This badge was earned by subscribing or gifting a sub in the Marvel Rivals category during Marvel Rivals' 1-year anniversary!\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'k4sen-con-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6ea537aa-bb9a-4410-a330-5820b7dd8a24/3',\n title: 'The K4SEN Con 2025',\n description: 'This badge was earned by watching 30 minutes of K4SEN Con 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'kodama',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/374ef606-cf25-475e-994b-f7d36b8acd43/3',\n title: 'Kodama',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Nioh 3 category',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'la-velada-iv',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/655dac77-0b2f-4b62-8871-6ae21f82b34e/3',\n title: 'La Velada del Año IV',\n description: 'This badge was earned for watching La Velada del Año IV!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'la-velada-v-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3f728095-b84d-4e7e-9eee-541ea02ddea0/3',\n title: 'La Velada V Badge',\n description: 'This badge was earned by watching La Velada V!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'lamby',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c0801fe9-3d54-49d1-801c-3c1fadde09cd/3',\n title: 'Lamby',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Cult of the Lamb streamer!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'lead_moderator',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0822047b-65e0-46f2-94a9-d1091d685d33/3',\n title: 'Lead Moderator',\n description: 'A badge for users who are a lead moderator in the channel',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'league-of-legends-mid-season-invitational-2025---grey',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/18a0b4ba-5f62-4e94-b6f1-481731608602/3',\n title: 'League of Legends Mid Season Invitational 2025 Support a Streamer',\n description:\n 'This badge was earned by gifting a subscription to a streamer in the League of Legends category during MSI 2025.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'league-of-legends-mid-season-invitational-2025---purple',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0a99ba23-5e1a-46b7-8ff2-efbb9a6ea54c/3',\n title: 'League of Legends Mid Season Invitational 2025',\n description:\n 'This badge was earned by subscribing to a lolesports channel during MSI 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'legendus',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/55c355cf-ddbf-4f12-8369-6554a1f78b6f/3',\n title: 'LEGENDUS',\n description:\n 'This badge was granted to users who watched LEGENDUS ITADAKI, hosted by fps_shaka, on June 28-June 29, 2025.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'lol-worlds-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4545b0b5-c825-487e-8958-ce5512eb6f84/3',\n title: 'LoL Worlds 2025',\n description:\n 'This badge was earned by subscribing to a participating LoL Esports broadcast or co-stream of the 2025 League of Legends World Championship!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'lost-ark-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/77995962-b02e-48e3-92ab-b77a4b352fb3/3',\n title: 'Lost Ark Anniversary',\n description:\n 'This badge was earned by watching your favorite Lost Ark streamer during the 4th Anniversary!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'low',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/58d48669-bfee-46e7-a83c-b65a30783400/3',\n title: 'Low',\n description:\n 'This badge was earned by watching 30 minutes in the Little Nightmares III category during launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'marathon-reveal-runner',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ae1c6c62-c057-4fad-a1d4-663bf988701f/3',\n title: 'Marathon Reveal Runner',\n description: 'This badge was earned by subscribing during the Marathon reveal stream!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'marathon-silkworm',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/eabd1994-d054-4eb1-a740-7cce1ad4f0cb/3',\n title: 'Marathon Silkworm',\n description:\n 'This Chat Badge was unlocked by watching the Marathon Server Slam & Launch Week!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'marathon-sub-burger',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5bc8a500-12f5-42c4-86f7-a678d1f930a1/3',\n title: 'Marathon Sub Burger',\n description: \"A tasty burger for you and a friend! Tastes like meat. Isn't\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'mel',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8a7c1d1d-12bb-40d9-9be8-0a4fdf0d870c/3',\n title: 'Mel',\n description:\n 'This badge was earned by subscribing or gifting a sub for a streamer in the Hades II category.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'moderator',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3267646d-33f0-4b17-b3df-f923a41db1d0/3',\n title: 'Moderator',\n description: 'Moderator',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'moments',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bf370830-d79a-497b-81c6-a365b2b60dda/3',\n title: 'Moments Badge - Tier 1',\n description: 'Earned for being a part of at least 1 moment on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc46b10c-5b45-43fd-81ad-d5cb0de6d2f4/3',\n title: 'Moments Badge - Tier 2',\n description: 'Earned for being a part of at least 5 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d08658d7-205f-4f75-ad44-8c6e0acd8ef6/3',\n title: 'Moments Badge - Tier 3',\n description: 'Earned for being a part of at least 10 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fe5b5ddc-93e7-4aaf-9b3e-799cd41808b1/3',\n title: 'Moments Badge - Tier 4',\n description: 'Earned for being a part of at least 15 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c8a0d95a-856e-4097-9fc0-7765300a4f58/3',\n title: 'Moments Badge - Tier 5',\n description: 'Earned for being a part of at least 20 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '6',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f9e3b4e4-200e-4045-bd71-3a6b480c23ae/3',\n title: 'Moments Badge - Tier 6',\n description: 'Earned for being a part of at least 30 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '7',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a90a26a4-fdf7-4ac3-a782-76a413da16c1/3',\n title: 'Moments Badge - Tier 7',\n description: 'Earned for being a part of at least 40 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '8',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f22286cd-6aa3-42ce-b3fb-10f5d18c4aa0/3',\n title: 'Moments Badge - Tier 8',\n description: 'Earned for being a part of at least 50 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '9',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5cb2e584-1efd-469b-ab1d-4d1b59a944e7/3',\n title: 'Moments Badge - Tier 9',\n description: 'Earned for being a part of at least 60 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '10',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c13f2b6-69cd-4537-91b4-4a8bd8b6b1fd/3',\n title: 'Moments Badge - Tier 10',\n description: 'Earned for being a part of at least 75 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '11',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7573e7a2-0f1f-4508-b833-d822567a1e03/3',\n title: 'Moments Badge - Tier 11',\n description: 'Earned for being a part of at least 90 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '12',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2c91d14-85c8-434b-a6c0-6d7930091150/3',\n title: 'Moments Badge - Tier 12',\n description: 'Earned for being a part of at least 105 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '13',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/35eb3395-a1d3-4170-969a-86402ecfb11a/3',\n title: 'Moments Badge - Tier 13',\n description: 'Earned for being a part of at least 120 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '14',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cb40eb03-1015-45ba-8793-51c66a24a3d5/3',\n title: 'Moments Badge - Tier 14',\n description: 'Earned for being a part of at least 140 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '15',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b241d667-280b-4183-96ae-2d0053631186/3',\n title: 'Moments Badge - Tier 15',\n description: 'Earned for being a part of at least 160 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '16',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5684d1bc-8132-4a4f-850c-18d3c5bd04f3/3',\n title: 'Moments Badge - Tier 16',\n description: 'Earned for being a part of at least 180 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '17',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3b08c1ee-0f77-451b-9226-b5b22d7f023c/3',\n title: 'Moments Badge - Tier 17',\n description: 'Earned for being a part of at least 200 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '18',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/14057e75-080c-42da-a412-6232c6f33b68/3',\n title: 'Moments Badge - Tier 18',\n description: 'Earned for being a part of at least 225 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '19',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6100cc6f-6b4b-4a3d-a55b-a5b34edb5ea1/3',\n title: 'Moments Badge - Tier 19',\n description: 'Earned for being a part of at least 250 moments on a channel',\n click_action: null,\n click_url: null,\n },\n {\n id: '20',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/43399796-e74c-4741-a975-56202f0af30e/3',\n title: 'Moments Badge - Tier 20',\n description: 'Earned for being a part of at least 275 moments on a channel',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'mr-raccoon',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/057b7ef9-6b3d-4a9c-9f0c-ede0df1315db/3',\n title: 'Mr. Raccoon',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Resident Evil: Requiem streamer.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'never-grave---witch-hat',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fb752b70-4eb6-45dd-8ee1-1194c38d2ac3/3',\n title: 'Never Grave - Witch Hat',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Never Grave category during the game launch',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'no_audio',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/aef2cd08-f29b-45a1-8c12-d44d7fd5e6f0/3',\n title: 'Watching without audio',\n description: 'Individuals with unreliable or no sound can select this badge',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'no_video',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/199a0dba-58f3-494e-a7fc-1fa0a1001fb8/3',\n title: 'Listening only',\n description: 'Individuals with unreliable or no video can select this badge',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'path-of-exile-2-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8bebe4ce-6c15-4746-8c33-42312c250ceb/3',\n title: 'Chaos Orb',\n description:\n \"This badge was earned by subscribing to a streamer during Path of Exile 2's launch!\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'pokemon-30th-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4c10b31-ad76-4600-a3cc-48c875e1f7c0/3',\n title: 'Pokémon 30th',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in an eligible Pokémon category!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'pokemon-legends-z-a-chikorita',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f479e945-987b-423a-a901-7b1c3b3003fb/3',\n title: 'Pokémon Legends: Z-A Chikorita',\n description:\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends: Z-A for Chikorita.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'pokemon-legends-z-a-tepig',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/34799f2e-e165-42a4-ae79-1c9c06cf1d55/3',\n title: 'Pokémon Legends: Z-A Tepig',\n description:\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends Z-A for Tepig.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'pokemon-legends-z-a-totodile',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0bdb6906-ba8f-4fb6-bc9e-3aca04d3d501/3',\n title: 'Pokémon Legends: Z-A Totodile',\n description:\n 'This badge was earned by purchasing a subscription or gifting a subscription to a streamer playing Pokémon Legends: Z-A for Totodile.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'power-rangers',\n versions: [\n {\n id: '0',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9edf3e7f-62e4-40f5-86ab-7a646b10f1f0/3',\n title: 'Black Ranger',\n description: 'Black Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1eeae8fe-5bc6-44ed-9c88-fb84d5e0df52/3',\n title: 'Blue Ranger',\n description: 'Blue Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/21bbcd6d-1751-4d28-a0c3-0b72453dd823/3',\n title: 'Green Ranger',\n description: 'Green Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5c58cb40-9028-4d16-af67-5bc0c18b745e/3',\n title: 'Pink Ranger',\n description: 'Pink Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8843d2de-049f-47d5-9794-b6517903db61/3',\n title: 'Red Ranger',\n description: 'Red Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/06c85e34-477e-4939-9537-fd9978976042/3',\n title: 'White Ranger',\n description: 'White Ranger',\n click_action: null,\n click_url: null,\n },\n {\n id: '6',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d6dca630-1ca4-48de-94e7-55ed0a24d8d1/3',\n title: 'Yellow Ranger',\n description: 'Yellow Ranger',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'predictions',\n versions: [\n {\n id: 'blue-1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e33d8b46-f63b-4e67-996d-4a7dcec0ad33/3',\n title: 'Predicted Blue (1)',\n description: 'Predicted Outcome One',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-10',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/072ae906-ecf7-44f1-ac69-a5b2261d8892/3',\n title: 'Predicted Blue (10)',\n description: 'Predicted Outcome Ten',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ffdda3fe-8012-4db3-981e-7a131402b057/3',\n title: 'Predicted Blue (2)',\n description: 'Predicted Outcome Two',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/f2ab9a19-8ef7-4f9f-bd5d-9cf4e603f845/3',\n title: 'Predicted Blue (3)',\n description: 'Predicted Outcome Three',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/df95317d-9568-46de-a421-a8520edb9349/3',\n title: 'Predicted Blue (4)',\n description: 'Predicted Outcome Four',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/88758be8-de09-479b-9383-e3bb6d9e6f06/3',\n title: 'Predicted Blue (5)',\n description: 'Predicted Outcome Five',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-6',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/46b1537e-d8b0-4c0d-8fba-a652e57b9df0/3',\n title: 'Predicted Blue (6)',\n description: 'Predicted Outcome Six',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-7',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/07cd34b2-c6a1-45f5-8d8a-131e3c8b2279/3',\n title: 'Predicted Blue (7)',\n description: 'Predicted Outcome Seven',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-8',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4416dfd7-db97-44a0-98e7-40b4e250615e/3',\n title: 'Predicted Blue (8)',\n description: 'Predicted Outcome Eight',\n click_action: null,\n click_url: null,\n },\n {\n id: 'blue-9',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fc74bd90-2b74-4f56-8e42-04d405e10fae/3',\n title: 'Predicted Blue (9)',\n description: 'Predicted Outcome Nine',\n click_action: null,\n click_url: null,\n },\n {\n id: 'gray-1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/144f77a2-e324-4a6b-9c17-9304fa193a27/3',\n title: 'Predicted Gray (1)',\n description: 'Predicted Gray (1)',\n click_action: null,\n click_url: null,\n },\n {\n id: 'gray-2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/097a4b14-b458-47eb-91b6-fe74d3dbb3f5/3',\n title: 'Predicted Gray (2)',\n description: 'Predicted Gray (2)',\n click_action: null,\n click_url: null,\n },\n {\n id: 'pink-1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/75e27613-caf7-4585-98f1-cb7363a69a4a/3',\n title: 'Predicted Pink (1)',\n description: 'Predicted Outcome One',\n click_action: null,\n click_url: null,\n },\n {\n id: 'pink-2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4b76d5f2-91cc-4400-adf2-908a1e6cfd1e/3',\n title: 'Predicted Pink (2)',\n description: 'Predicted Outcome Two',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'purple-noob',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a1fb3f16-14e8-4e2b-84f8-55e2b86878c8/3',\n title: 'Purple Noob',\n description:\n 'Watch 1 hour of Roblox content on Twitch to earn this happy little badge. EZ W.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'purple-pixel-heart---together-for-good-24',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1afb4b76-8c34-4b7b-8beb-75f7e5d2a1ab/3',\n title: \"Purple Pixel Heart - Together For Good '24\",\n description:\n 'This badge was earned by donating $5 or more as part of Twitch Together for Good 2024!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'raging-wolf-helm',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ff668be-59a3-4e3e-96af-e6b2908b3171/3',\n title: 'Raging Wolf Helm',\n description:\n 'This badge was earned for watching Elden Ring during the initial Shadow of the Erdtree Expansion launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'raider-icon-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5007f3e0-41d4-4bda-a605-8f72cfe8c2d4/3',\n title: 'Raider Icon',\n description:\n 'This badge was earned by subscribing or gifting a sub to any ARC Raiders broadcast during the campaign period',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'rainbow-six-siege-x-10th-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/00fc50e1-dea9-47a4-9db5-ff087e91dd0d/3',\n title: 'Rainbow Six Siege X 10th Anniversary',\n description:\n 'This badge was earned by subscribing of gifting a sub to a Rainbow Six Siege X streamer during its 10th anniversary celebration!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'revedtv-stream-awards-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/03cb38fd-00cc-4ed8-8d24-ce53189ee1de/3',\n title: 'RevedTV StreamAwards 2025',\n description: \"This badge was earned by watching RevedTV's StreamAwards 2025.\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'ruby-pixel-heart---together-for-good-24',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca0aa8ce-b2a8-4582-a5de-4d5b6915dc47/3',\n title: \"Ruby Pixel Heart - Together For Good '24\",\n description:\n 'This badge was earned by donating $25 or more as part of Twitch Together for Good 2024!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'rudy',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/309c197a-69ed-4c15-8226-a0992f1f5b68/3',\n title: 'Rudy',\n description:\n 'This Rudy badge was earned by subscribing or gifting a sub to a Monster Hunter Stories 3: Twisted Reflection streamer during its launch!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'rustmas-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5ec1bcd1-82fa-4c42-abf1-be5b64cb63ed/3',\n title: 'Rustmas 2025',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Rust streamer during Rustmas 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'sajam-slam-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9fd798d6-3d67-4458-a916-9fd5d7286159/3',\n title: 'Sajam Slam Badge',\n description:\n 'This badge was earned by subscribing in the Street Fighter 6 category during TwitchCon 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'scampuss',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/1ae8da3f-04ba-4cf1-93e8-a1f90e09aa45/3',\n title: 'Scampuss',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Nioh 3 category during the game launch.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'seeks-eye',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2ff5095e-8b37-489c-9a53-336bf806dca2/3',\n title: \"Seek's Eye\",\n description: 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'social-sharing',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d2030c7e-c400-4605-a2cf-ce32bd06af8f/3',\n title: 'Social Media Badge',\n description: 'This user earned a Icon badge for reaching 100 views on their social posts.',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/fcca0804-1da5-4d00-ab06-7677676d4d8e/3',\n title: 'Social Media Badge',\n description: 'This user earned a Pro badge for reaching 10000 views on their social posts.',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/590698dd-2bc4-4401-817a-17c641f5e881/3',\n title: 'Social Media Badge',\n description:\n 'This user earned a Legend badge for reaching 100000 views on their social posts.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'sonic-racing-crossworlds',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3c5a5ea0-714f-46da-b764-5e7ceba59fca/3',\n title: 'Sonic Racing',\n description:\n 'This badge was earned by subscribing to a streamer in the Sonic Racing: Crossworlds category!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'speedons-5-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/81d89508-850c-45ae-b0e2-dbbe6e531b8d/3',\n title: 'Speedons 5 Badge',\n description: 'This badge was earned by watching Speedons 5!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'stream-for-humanity-2-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c02fbad3-aa4b-46d0-93a6-661719a19f1c/3',\n title: 'Stream For Humanity 2',\n description: 'Earned by supporting the Stream For Humanity 2 charity marathon',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'streamer-awards-tux',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d52bd174-3509-460b-80ac-4a8d5840194b/3',\n title: 'Streamer Awards Tux',\n description: 'I earned this badge by watching the 2025 Streamer Awards!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'sub-gift-leader',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/21656088-7da2-4467-acd2-55220e1f45ad/3',\n title: 'Gifter Leader 1',\n description: 'Ranked as a top subscription gifter in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/0d9fe96b-97b7-4215-b5f3-5328ebad271c/3',\n title: 'Gifter Leader 2',\n description: 'Ranked as a top subscription gifter in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4c6e4497-eed9-4dd3-ac64-e0599d0a63e5/3',\n title: 'Gifter Leader 3',\n description: 'Ranked as a top subscription gifter in this community',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'sub-gifter',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a5ef6c17-2e5b-4d8f-9b80-2779fd722414/3',\n title: 'Sub Gifter',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ee113e59-c839-4472-969a-1e16d20f3962/3',\n title: '5 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '10',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d333288c-65d7-4c7b-b691-cdd7b3484bf8/3',\n title: '10 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '25',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/052a5d41-f1cc-455c-bc7b-fe841ffaf17f/3',\n title: '25 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '50',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c4a29737-e8a5-4420-917a-314a447f083e/3',\n title: '50 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '100',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/8343ada7-3451-434e-91c4-e82bdcf54460/3',\n title: '100 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '150',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/514845ba-0fc3-4771-bce1-14d57e91e621/3',\n title: '150 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '200',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c6b1893e-8059-4024-b93c-39c84b601732/3',\n title: '200 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '250',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cd479dc0-4a15-407d-891f-9fd2740bddda/3',\n title: '250 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '300',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9e1bb24f-d238-4078-871a-ac401b76ecf2/3',\n title: '300 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '350',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6c4783cd-0aba-4e75-a7a4-f48a70b665b0/3',\n title: '350 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '400',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/6f4cab6b-def9-4d99-ad06-90b0013b28c8/3',\n title: '400 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '450',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b593d68a-f8fb-4516-a09a-18cce955402c/3',\n title: '450 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '500',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/60e9504c-8c3d-489f-8a74-314fb195ad8d/3',\n title: '500 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '550',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/024d2563-1794-43ed-b8dc-33df3efae900/3',\n title: '550 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '600',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/3ecc3aab-09bf-4823-905e-3a4647171fc1/3',\n title: '600 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '650',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/eeabf43c-8e4c-448d-9790-4c2172c57944/3',\n title: '650 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '700',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a9acdc7-30be-4dd1-9898-fc9e42b3d304/3',\n title: '700 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '750',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ca17277c-53e5-422b-8bb4-7c5dcdb0ac67/3',\n title: '750 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '800',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9c1fb96d-0579-43d7-ba94-94672eaef63a/3',\n title: '800 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '850',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/cc924aaf-dfd4-4f3f-822a-f5a87eb24069/3',\n title: '850 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '900',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/193d86f6-83e1-428c-9638-d6ca9e408166/3',\n title: '900 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '950',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7ce130bd-6f55-40cc-9231-e2a4cb712962/3',\n title: '950 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '1000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bfb7399a-c632-42f7-8d5f-154610dede81/3',\n title: '1000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '2000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4e8b3a32-1513-44ad-8a12-6c90232c77f9/3',\n title: '2000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '3000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b18852ba-65d2-4b84-97d2-aeb6c44a0956/3',\n title: '3000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '4000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/efbf3c93-ecfa-4b67-8d0a-1f732fb07397/3',\n title: '4000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n {\n id: '5000',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d775275d-fd19-4914-b63a-7928a22135c3/3',\n title: '5000 Gift Subs',\n description: 'Has gifted a subscription to another viewer in this community',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'subscriber',\n versions: [\n {\n id: '0',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\n title: 'Subscriber',\n description: 'Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5d9f2208-5dd8-11e7-8513-2ff4adfae661/3',\n title: 'Subscriber',\n description: 'Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '2',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/25a03e36-2bb2-4625-bd37-d6d9d406238d/3',\n title: '2-Month Subscriber',\n description: '2-Month Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '3',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e8984705-d091-4e54-8241-e53b30a84b0e/3',\n title: '3-Month Subscriber',\n description: '3-Month Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '4',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2d2485f6-d19b-4daa-8393-9493b019156b/3',\n title: '6-Month Subscriber',\n description: '6-Month Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '5',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/b4e6b13a-a76f-4c56-87e1-9375a7aaa610/3',\n title: '9-Month Subscriber',\n description: '9-Month Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n {\n id: '6',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed51a614-2c44-4a60-80b6-62908436b43a/3',\n title: '6-Month Subscriber',\n description: '1-Year Subscriber',\n click_action: 'subscribe_to_channel',\n click_url: null,\n },\n ],\n },\n {\n set_id: 'subtember-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a9c01f28-179e-486d-a4c7-2277e4f6adb4/3',\n title: 'SUBtember 2025',\n description: 'Badge given to users who sub, gift, or use bits during SUBtember 2025.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'superultracombo-2023',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5864739a-5e58-4623-9450-a2c0555ef90b/3',\n title: 'SuperUltraCombo 2023',\n description: \"This user joined Twitch's SuperUltraCombo 2023\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'survival-cup-4',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ff55f50-2c2a-40c2-9863-158d5ac2d5fd/3',\n title: 'Survival Cup 4',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer during Survival Cup 4!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'tft-paris-open',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/c5688799-c50c-4878-b451-de78f3ef6a56/3',\n title: 'TFT Paris Open',\n description:\n 'This chat badge was awarded for gifting two subscriptions to a TFT streamer during the 2025 TFT Paris Open!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'the-deer',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/5f026869-a186-4f98-bb11-3eb148633d85/3',\n title: 'The Deer',\n description: 'This badge was earned by watching Roblox during the Bloxfest Qualifiers.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'the-first-descendant-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/a56ef091-e8cd-49bd-9de9-7b342c9a7e7e/3',\n title: 'The First Descendant Badge',\n description:\n 'This badge was earned by subscribing to a streamer playing The First Descendant during launch week!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'the-man-without-fear',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4ca893e7-6ee3-4437-acdd-071340913d3c/3',\n title: 'The Man Without Fear',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Marvel Rivals category for the start of Season 4.5!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'the-onryos-mask',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/e0d21894-8d58-4266-9127-b1bd61177899/3',\n title: \"The Onryō's Mask\",\n description:\n \"This badge was earned by subscribing to a Ghost of Yotei streamer during the game's launch!\",\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'together-for-good-25---good-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/192fb627-82b3-46e8-95d3-ac9feba4b1bc/3',\n title: \"Together for Good '25 - Good Badge\",\n description:\n 'This badge was earned by donating $5 or more during Twitch Together for Good 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'together-for-good-25---gooder-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/84a37e81-9d61-4c29-970e-64a32ec040c7/3',\n title: \"Together for Good '25 - Gooder Badge\",\n description:\n 'This badge was earned by donating $50 or more during Twitch Together for Good 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'together-for-good-25---goodest-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/928b8033-3777-49cb-a056-230135a08a62/3',\n title: \"Together for Good '25 - Goodest Badge\",\n description:\n 'This badge was earned by donating $100 or more during Twitch Together for Good 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'together-for-good-25---wicked-dub-badge',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/9ddae219-6674-4fbc-add9-6e4e6572ea8e/3',\n title: \"Together for Good '25 - Wicked Dub Badge\",\n description:\n 'This badge was earned by donating at least $5 to a charity stream using Stream Together during Together for Good 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'total-war-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/17604bfd-aeb6-427d-bd0e-cae93bed6f36/3',\n title: 'Total War Anniversary',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Total War: Warhammer III category during the Total War 25th Anniversary.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'toxic-zombie',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccdf9673-a0b8-4bc1-a40f-105b8b951f98/3',\n title: 'Toxic Zombie',\n description:\n 'Purchase 1 new recurring or gift subscription during the Toxic Commando launch 2026 and claim the reward',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'turbo',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/bd444ec6-8f34-4bf9-91f4-af1e3428d80f/3',\n title: 'Turbo',\n description: \"A subscriber of Twitch's monthly premium user service\",\n click_action: 'turbo',\n click_url: null,\n },\n ],\n },\n {\n set_id: 'twitchcon-2026-europe-row-houses',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/4a354d32-ca7f-4d6f-815a-f80be9c7c088/3',\n title: 'TwitchCon 2026 - Europe - Row Houses',\n description:\n 'This badge is given to anyone who purchased a 1-day ticket to TwitchCon Europe 2026.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'twitchcon-2026-europe-windmill',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ed34b8e2-7c1c-4551-b4d7-63b44d61fb31/3',\n title: 'TwitchCon 2026 - Europe - Windmill',\n description:\n 'This badge is given to anyone who purchased a 2-day ticket to TwitchCon Europe 2026.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'umbrella-corporation',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/995ff00f-c16c-4782-86ba-f2d7668dc6a2/3',\n title: 'Umbrella Corporation',\n description:\n 'This badge was earned by subscribing or gifting a sub to a Resident Evil: Requiem streamer.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'user-anniversary',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/ccbbedaa-f4db-4d0b-9c2a-375de7ad947c/3',\n title: 'Twitchiversary Badge',\n description: 'Staff badge celebrating Twitch tenure',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'vct-paris-2025',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/63c91cf1-53d1-4ee9-821f-b4d6e4144e8e/3',\n title: 'VCT Paris 2025',\n description:\n 'This badge was earned by subscribing to a VALORANT streamer while watching VALORANT Champions 2025!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'yellow-noob',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/d87a78f5-76d9-451f-8f31-752a369e6045/3',\n title: 'Yellow Noob',\n description:\n 'This badge was earned by subscribing or gifting a sub to a streamer in the Roblox category during Bloxfest.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'zevent-2024',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/2040d479-b815-4617-8a55-9aed027e30d0/3',\n title: 'ZEVENT 2024',\n description: 'This badge was earned for watching ZEVENT 2024!',\n click_action: null,\n click_url: null,\n },\n ],\n },\n {\n set_id: 'zevent25',\n versions: [\n {\n id: '1',\n image_url_1x:\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/1',\n image_url_2x:\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/2',\n image_url_4x:\n 'https://static-cdn.jtvnw.net/badges/v1/7c39aa87-4659-4e8f-abaf-c29614cd8a29/3',\n title: 'ZEVENT25',\n description: 'This badge was earned by watching a ZEvent25 stream.',\n click_action: null,\n click_url: null,\n },\n ],\n },\n];\n","export const css_color_names = [\n 'aliceblue',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgreen',\n 'darkgrey',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'green',\n 'greenyellow',\n 'grey',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgreen',\n 'lightgrey',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'rebeccapurple',\n 'red',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen',\n 'transparent',\n];\n","import { BttvEmote, SeventvEmote, TwitchEmote } from '../../types/emote.js';\n\nconst SeventvEmotes = [\n {\n id: '01FCY771D800007PQ2DF3GDTN6',\n name: 'RainTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FCY771D800007PQ2DF3GDTN6/4x.webp',\n },\n },\n {\n id: '01FE3XY508000AA32JP519W2EW',\n name: 'PETPET',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FE3XY508000AA32JP519W2EW/4x.webp',\n },\n },\n {\n id: '01GGD5PJA8000FH13S498E9D8X',\n name: 'ppL',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GGD5PJA8000FH13S498E9D8X/4x.webp',\n },\n },\n {\n id: '01GB2TN09G000AZXHZ8HNEZX6G',\n name: 'Clap2',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2TN09G000AZXHZ8HNEZX6G/4x.webp',\n },\n },\n {\n id: '01GAM8EFQ00004MXFXAJYKA859',\n name: 'Clap',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAM8EFQ00004MXFXAJYKA859/4x.webp',\n },\n },\n {\n id: '01GAFTZ9K80003DHH026MC7JW0',\n name: 'PepePls',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAFTZ9K80003DHH026MC7JW0/4x.webp',\n },\n },\n {\n id: '01GAZ199Z8000FEWHS6AT5QZV0',\n name: 'peepoHappy',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAZ199Z8000FEWHS6AT5QZV0/4x.webp',\n },\n },\n {\n id: '01GAZ4SBX80007YCE2RXBT44B2',\n name: 'peepoSad',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GAZ4SBX80007YCE2RXBT44B2/4x.webp',\n },\n },\n {\n id: '01GB9W8JN80004CKF2H1TWA99H',\n name: 'FeelsDankMan',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB9W8JN80004CKF2H1TWA99H/4x.webp',\n },\n },\n {\n id: '01GB2S7H7000018VJGJ4A9BMFS',\n name: 'BillyApprove',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2S7H7000018VJGJ4A9BMFS/4x.webp',\n },\n },\n {\n id: '01GB8EQNJ8000497KFBZWNSDFZ',\n name: 'forsenPls',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB8EQNJ8000497KFBZWNSDFZ/4x.webp',\n },\n },\n {\n id: '01GB54CZTG0004ZBZEDT30HE2M',\n name: 'RoxyPotato',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB54CZTG0004ZBZEDT30HE2M/4x.webp',\n },\n },\n {\n id: '01GB4P2HX0000BJ5HR8F6XV9Q0',\n name: 'gachiBASS',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4P2HX0000BJ5HR8F6XV9Q0/4x.webp',\n },\n },\n {\n id: '01GKQXGX1R000216YB0K7GN92X',\n name: '(7TV)',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GKQXGX1R000216YB0K7GN92X/4x.webp',\n },\n },\n {\n id: '01FKSDK14G0008TM5NY9QEG0QV',\n name: 'PartyParrot',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FKSDK14G0008TM5NY9QEG0QV/4x.webp',\n },\n },\n {\n id: '01GB5VC57000003DZTMZQNY944',\n name: 'RebeccaBlack',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB5VC57000003DZTMZQNY944/4x.webp',\n },\n },\n {\n id: '01F014S6KG0007E4VV006YKSM3',\n name: 'reckH',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01F014S6KG0007E4VV006YKSM3/4x.webp',\n },\n },\n {\n id: '01G98W833R0000BRQD106P0ZNT',\n name: 'WAYTOODANK',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98W833R0000BRQD106P0ZNT/4x.webp',\n },\n },\n {\n id: '01GB2ZJFBG000DTBJYANG8XYFP',\n name: 'AlienDance',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB2ZJFBG000DTBJYANG8XYFP/4x.webp',\n },\n },\n {\n id: '01G4GQC5H0000D3DGNAYJJP8EB',\n name: 'Gayge',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G4GQC5H0000D3DGNAYJJP8EB/4x.webp',\n },\n },\n {\n id: '01GGCQPCGR000C7MT8JZGP6E89',\n name: 'ApuApustaja',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GGCQPCGR000C7MT8JZGP6E89/4x.webp',\n },\n },\n {\n id: '01GB9W2CDG000BFSD141G0MGSA',\n name: 'BasedGod',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB9W2CDG000BFSD141G0MGSA/4x.webp',\n },\n },\n {\n id: '01G98V5RFG0001CD052SPS435F',\n name: 'GuitarTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98V5RFG0001CD052SPS435F/4x.webp',\n },\n },\n {\n id: '01HM524VE80004SKSHMCZWXH1T',\n name: 'peepoPls',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM524VE80004SKSHMCZWXH1T/4x.webp',\n },\n },\n {\n id: '01HM4P26CR000449DZBT4FVMA5',\n name: 'TeaTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM4P26CR000449DZBT4FVMA5/4x.webp',\n },\n },\n {\n id: '01HM4PGHC80007635TAZG67FT5',\n name: 'WineTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM4PGHC80007635TAZG67FT5/4x.webp',\n },\n },\n {\n id: '01G98V81Q80000BRQD106P0ZEK',\n name: 'PianoTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98V81Q80000BRQD106P0ZEK/4x.webp',\n },\n },\n {\n id: '01G98TT6BR000A39K5ZSQFTPWR',\n name: 'CrayonTime',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01G98TT6BR000A39K5ZSQFTPWR/4x.webp',\n },\n },\n {\n id: '01HM6NJ2X000035ZKVAPWBNW26',\n name: 'nymnCorn',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM6NJ2X000035ZKVAPWBNW26/4x.webp',\n },\n },\n {\n id: '01HM2F7Q1R00022X3E2804NBNQ',\n name: 'SteerR',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01HM2F7Q1R00022X3E2804NBNQ/4x.webp',\n },\n },\n {\n id: '01J107C3E8000DX4MZBQSYGRXS',\n name: 'sevenTV',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01J107C3E8000DX4MZBQSYGRXS/4x.webp',\n },\n },\n {\n id: '01FTEZEE900001E12995B12GR4',\n name: 'nanaAYAYA',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01FTEZEE900001E12995B12GR4/4x.webp',\n },\n },\n {\n id: '01J8NMZ2HG0005G1FWF2H9Y615',\n name: 'BibleThump',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01J8NMZ2HG0005G1FWF2H9Y615/4x.webp',\n },\n },\n {\n id: '01H16FA16G0005EZED5J0EY7KN',\n name: 'glorp',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01H16FA16G0005EZED5J0EY7KN/4x.webp',\n },\n },\n {\n id: '01GG3YGWK8000DWE419062SG28',\n name: 'Stare',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GG3YGWK8000DWE419062SG28/4x.webp',\n },\n },\n {\n id: '01JY2MX5BE5BVWWFV153ANMMHZ',\n name: 'aceStare',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01JY2MX5BE5BVWWFV153ANMMHZ/4x.webp',\n },\n },\n {\n id: '01F9EM2ETG000E7SC8F953GXCX',\n name: 'gachiGASM',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01F9EM2ETG000E7SC8F953GXCX/4x.webp',\n },\n },\n {\n id: '01GB32XE6R00018VJGJ4A9BNCV',\n name: 'AYAYA',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB32XE6R00018VJGJ4A9BNCV/4x.webp',\n },\n },\n {\n id: '01GB4XE3ZR000DKFRGM9Q1M7VS',\n name: 'RareParrot',\n platform: '7tv',\n animated: true,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4XE3ZR000DKFRGM9Q1M7VS/4x.webp',\n },\n },\n {\n id: '01GB4FWTR8000DGEZ8VYY59RBN',\n name: 'FeelsWeirdMan',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4FWTR8000DGEZ8VYY59RBN/4x.webp',\n },\n },\n {\n id: '01GB4CK01800090V9B3D8CGEEX',\n name: 'EZ',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4CK01800090V9B3D8CGEEX/4x.webp',\n },\n },\n {\n id: '01GB46137R000BJ5HR8F6XV8J1',\n name: 'FeelsOkayMan',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB46137R000BJ5HR8F6XV8J1/4x.webp',\n },\n },\n {\n id: '01GB4EV0Q800090V9B3D8CGEHV',\n name: 'FeelsStrongMan',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GB4EV0Q800090V9B3D8CGEHV/4x.webp',\n },\n },\n {\n id: '01GBFDVP18000CRDCG0DV7KEMY',\n name: '7Cinema',\n platform: '7tv',\n animated: false,\n urls: {\n '1': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/1x.webp',\n '2': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/2x.webp',\n '3': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/3x.webp',\n '4': 'https://cdn.7tv.app/emote/01GBFDVP18000CRDCG0DV7KEMY/4x.webp',\n },\n },\n];\n\nconst BttvEmotes = [\n {\n id: '54fa8f1401e468494b85b537',\n name: ':tf:',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8f1401e468494b85b537/3x',\n },\n },\n {\n id: '54fa8fce01e468494b85b53c',\n name: 'CiGrip',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa8fce01e468494b85b53c/3x',\n },\n },\n {\n id: '54fa903b01e468494b85b53f',\n name: 'DatSauce',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa903b01e468494b85b53f/3x',\n },\n },\n {\n id: '54fa909b01e468494b85b542',\n name: 'ForeverAlone',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa909b01e468494b85b542/3x',\n },\n },\n {\n id: '54fa90ba01e468494b85b543',\n name: 'GabeN',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa90ba01e468494b85b543/3x',\n },\n },\n {\n id: '54fa90f201e468494b85b545',\n name: 'HailHelix',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa90f201e468494b85b545/3x',\n },\n },\n {\n id: '54fa932201e468494b85b555',\n name: 'ShoopDaWhoop',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa932201e468494b85b555/3x',\n },\n },\n {\n id: '54fab45f633595ca4c713abc',\n name: 'M&Mjc',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/1x',\n '2': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/2x',\n '4': 'https://cdn.betterttv.net/emote/54fab45f633595ca4c713abc/3x',\n },\n },\n {\n id: '54fab7d2633595ca4c713abf',\n name: 'bttvNice',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/1x',\n '2': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/2x',\n '4': 'https://cdn.betterttv.net/emote/54fab7d2633595ca4c713abf/3x',\n },\n },\n {\n id: '54fa935601e468494b85b557',\n name: 'TwaT',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa935601e468494b85b557/3x',\n },\n },\n {\n id: '54fa99b601e468494b85b55d',\n name: 'WatChuSay',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/1x',\n '2': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/2x',\n '4': 'https://cdn.betterttv.net/emote/54fa99b601e468494b85b55d/3x',\n },\n },\n {\n id: '566ca11a65dbbdab32ec0558',\n name: 'tehPoleCat',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca11a65dbbdab32ec0558/3x',\n },\n },\n {\n id: '566ca1a365dbbdab32ec055b',\n name: 'AngelThump',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca1a365dbbdab32ec055b/3x',\n },\n },\n {\n id: '54fbefeb01abde735115de5b',\n name: 'TaxiBro',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbefeb01abde735115de5b/3x',\n },\n },\n {\n id: '54fbf00a01abde735115de5c',\n name: 'BroBalt',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf00a01abde735115de5c/3x',\n },\n },\n {\n id: '54fbf09c01abde735115de61',\n name: 'CandianRage',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/1x',\n '2': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/2x',\n '4': 'https://cdn.betterttv.net/emote/54fbf09c01abde735115de61/3x',\n },\n },\n {\n id: '55028cd2135896936880fdd7',\n name: 'D:',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/1x',\n '2': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/2x',\n '4': 'https://cdn.betterttv.net/emote/55028cd2135896936880fdd7/3x',\n },\n },\n {\n id: '550352766f86a5b26c281ba2',\n name: 'VisLaud',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/1x',\n '2': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/2x',\n '4': 'https://cdn.betterttv.net/emote/550352766f86a5b26c281ba2/3x',\n },\n },\n {\n id: '550b344bff8ecee922d2a3c1',\n name: 'KaRappa',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/1x',\n '2': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/2x',\n '4': 'https://cdn.betterttv.net/emote/550b344bff8ecee922d2a3c1/3x',\n },\n },\n {\n id: '566ca00f65dbbdab32ec0544',\n name: 'FishMoley',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca00f65dbbdab32ec0544/3x',\n },\n },\n {\n id: '566ca02865dbbdab32ec0547',\n name: 'Hhhehehe',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca02865dbbdab32ec0547/3x',\n },\n },\n {\n id: '566ca04265dbbdab32ec054a',\n name: 'KKona',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca04265dbbdab32ec054a/3x',\n },\n },\n {\n id: '566ca09365dbbdab32ec0555',\n name: 'PoleDoge',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca09365dbbdab32ec0555/3x',\n },\n },\n {\n id: '553b48a21f145f087fc15ca6',\n name: 'sosGame',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/1x',\n '2': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/2x',\n '4': 'https://cdn.betterttv.net/emote/553b48a21f145f087fc15ca6/3x',\n },\n },\n {\n id: '55471c2789d53f2d12781713',\n name: 'CruW',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/1x',\n '2': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/2x',\n '4': 'https://cdn.betterttv.net/emote/55471c2789d53f2d12781713/3x',\n },\n },\n {\n id: '555015b77676617e17dd2e8e',\n name: 'RarePepe',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/1x',\n '2': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/2x',\n '4': 'https://cdn.betterttv.net/emote/555015b77676617e17dd2e8e/3x',\n },\n },\n {\n id: '555981336ba1901877765555',\n name: 'haHAA',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/1x',\n '2': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/2x',\n '4': 'https://cdn.betterttv.net/emote/555981336ba1901877765555/3x',\n },\n },\n {\n id: '55b6524154eefd53777b2580',\n name: 'FeelsBirthdayMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/1x',\n '2': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/2x',\n '4': 'https://cdn.betterttv.net/emote/55b6524154eefd53777b2580/3x',\n },\n },\n {\n id: '55f324c47f08be9f0a63cce0',\n name: 'RonSmug',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/1x',\n '2': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/2x',\n '4': 'https://cdn.betterttv.net/emote/55f324c47f08be9f0a63cce0/3x',\n },\n },\n {\n id: '560577560874de34757d2dc0',\n name: 'KappaCool',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/1x',\n '2': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/2x',\n '4': 'https://cdn.betterttv.net/emote/560577560874de34757d2dc0/3x',\n },\n },\n {\n id: '566c9fc265dbbdab32ec053b',\n name: 'FeelsBadMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9fc265dbbdab32ec053b/3x',\n },\n },\n {\n id: '566c9f3b65dbbdab32ec052e',\n name: 'bUrself',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f3b65dbbdab32ec052e/3x',\n },\n },\n {\n id: '566c9f6365dbbdab32ec0532',\n name: 'ConcernDoge',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9f6365dbbdab32ec0532/3x',\n },\n },\n {\n id: '566c9fde65dbbdab32ec053e',\n name: 'FeelsGoodMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9fde65dbbdab32ec053e/3x',\n },\n },\n {\n id: '566c9ff365dbbdab32ec0541',\n name: 'FireSpeed',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/1x',\n '2': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/2x',\n '4': 'https://cdn.betterttv.net/emote/566c9ff365dbbdab32ec0541/3x',\n },\n },\n {\n id: '566ca06065dbbdab32ec054e',\n name: 'NaM',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca06065dbbdab32ec054e/3x',\n },\n },\n {\n id: '566ca38765dbbdab32ec0560',\n name: 'SourPls',\n platform: 'bttv',\n animated: true,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/1x',\n '2': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/2x',\n '4': 'https://cdn.betterttv.net/emote/566ca38765dbbdab32ec0560/3x',\n },\n },\n {\n id: '566dde0e65dbbdab32ec068f',\n name: 'FeelsSnowMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/1x',\n '2': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/2x',\n '4': 'https://cdn.betterttv.net/emote/566dde0e65dbbdab32ec068f/3x',\n },\n },\n {\n id: '566decae65dbbdab32ec0699',\n name: 'FeelsSnowyMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/1x',\n '2': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/2x',\n '4': 'https://cdn.betterttv.net/emote/566decae65dbbdab32ec0699/3x',\n },\n },\n {\n id: '567b00c61ddbe1786688a633',\n name: 'LuL',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/1x',\n '2': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/2x',\n '4': 'https://cdn.betterttv.net/emote/567b00c61ddbe1786688a633/3x',\n },\n },\n {\n id: '56901914991f200c34ffa656',\n name: 'SaltyCorn',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/1x',\n '2': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/2x',\n '4': 'https://cdn.betterttv.net/emote/56901914991f200c34ffa656/3x',\n },\n },\n {\n id: '56e9f494fff3cc5c35e5287e',\n name: 'monkaS',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/1x',\n '2': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/2x',\n '4': 'https://cdn.betterttv.net/emote/56e9f494fff3cc5c35e5287e/3x',\n },\n },\n {\n id: '56f5be00d48006ba34f530a4',\n name: 'VapeNation',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/1x',\n '2': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/2x',\n '4': 'https://cdn.betterttv.net/emote/56f5be00d48006ba34f530a4/3x',\n },\n },\n {\n id: '56fa09f18eff3b595e93ac26',\n name: 'ariW',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/1x',\n '2': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/2x',\n '4': 'https://cdn.betterttv.net/emote/56fa09f18eff3b595e93ac26/3x',\n },\n },\n {\n id: '5709ab688eff3b595e93c595',\n name: 'notsquishY',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/1x',\n '2': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/2x',\n '4': 'https://cdn.betterttv.net/emote/5709ab688eff3b595e93c595/3x',\n },\n },\n {\n id: '5733ff12e72c3c0814233e20',\n name: 'FeelsAmazingMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/1x',\n '2': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/2x',\n '4': 'https://cdn.betterttv.net/emote/5733ff12e72c3c0814233e20/3x',\n },\n },\n {\n id: '573d38b50ffbf6cc5cc38dc9',\n name: 'DuckerZ',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/1x',\n '2': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/2x',\n '4': 'https://cdn.betterttv.net/emote/573d38b50ffbf6cc5cc38dc9/3x',\n },\n },\n {\n id: '580e438942170bfd57189866',\n name: 'FeelsPumpkinMan',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/1x',\n '2': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/2x',\n '4': 'https://cdn.betterttv.net/emote/580e438942170bfd57189866/3x',\n },\n },\n {\n id: '59cf182fcbe2693d59d7bf46',\n name: 'SqShy',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/1x',\n '2': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/2x',\n '4': 'https://cdn.betterttv.net/emote/59cf182fcbe2693d59d7bf46/3x',\n },\n },\n {\n id: '58d2e73058d8950a875ad027',\n name: 'Wowee',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/1x',\n '2': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/2x',\n '4': 'https://cdn.betterttv.net/emote/58d2e73058d8950a875ad027/3x',\n },\n },\n {\n id: '5dc36a8db537d747e37ac187',\n name: 'WubTF',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/1x',\n '2': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/2x',\n '4': 'https://cdn.betterttv.net/emote/5dc36a8db537d747e37ac187/3x',\n },\n },\n {\n id: '5e76d2ab8c0f5c3723a9a87d',\n name: 'cvR',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d2ab8c0f5c3723a9a87d/3x',\n },\n },\n {\n id: '5e76d2d2d112fc372574d222',\n name: 'cvL',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d2d2d112fc372574d222/3x',\n },\n },\n {\n id: '5e76d338d6581c3724c0f0b2',\n name: 'cvHazmat',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d338d6581c3724c0f0b2/3x',\n },\n },\n {\n id: '5e76d399d6581c3724c0f0b8',\n name: 'cvMask',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/1x',\n '2': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/2x',\n '4': 'https://cdn.betterttv.net/emote/5e76d399d6581c3724c0f0b8/3x',\n },\n },\n {\n id: '5ffdf28dc96152314ad63960',\n name: 'DogChamp',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/1x',\n '2': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/2x',\n '4': 'https://cdn.betterttv.net/emote/5ffdf28dc96152314ad63960/3x',\n },\n },\n {\n id: '6468f7acaee1f7f47567708e',\n name: 'c!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f7acaee1f7f47567708e/3x',\n },\n },\n {\n id: '6468f845aee1f7f47567709b',\n name: 'h!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f845aee1f7f47567709b/3x',\n },\n },\n {\n id: '6468f869aee1f7f4756770a8',\n name: 'l!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f869aee1f7f4756770a8/3x',\n },\n },\n {\n id: '6468f883aee1f7f4756770b5',\n name: 'r!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f883aee1f7f4756770b5/3x',\n },\n },\n {\n id: '6468f89caee1f7f4756770c2',\n name: 'v!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f89caee1f7f4756770c2/3x',\n },\n },\n {\n id: '6468f8d1aee1f7f4756770cf',\n name: 'z!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/1x',\n '2': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/2x',\n '4': 'https://cdn.betterttv.net/emote/6468f8d1aee1f7f4756770cf/3x',\n },\n },\n {\n id: '64e3b31920cb0d25d950a9f9',\n name: 'w!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/1x',\n '2': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/2x',\n '4': 'https://cdn.betterttv.net/emote/64e3b31920cb0d25d950a9f9/3x',\n },\n },\n {\n id: '65cbe7dbaed093b2eaf87c65',\n name: 'p!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/1x',\n '2': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/2x',\n '4': 'https://cdn.betterttv.net/emote/65cbe7dbaed093b2eaf87c65/3x',\n },\n },\n {\n id: '662953eeea369c0ece39eb93',\n name: 's!',\n platform: 'bttv',\n animated: false,\n urls: {\n '1': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/1x',\n '2': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/2x',\n '4': 'https://cdn.betterttv.net/emote/662953eeea369c0ece39eb93/3x',\n },\n },\n];\n\nconst FfzEmotes = [\n {\n id: '9',\n name: 'ZrehplaR',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/9/1',\n '2': 'https://cdn.frankerfacez.com/emote/9/2',\n '4': 'https://cdn.frankerfacez.com/emote/9/4',\n },\n },\n {\n id: '6',\n name: 'YooHoo',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/6/1',\n '2': 'https://cdn.frankerfacez.com/emote/6/2',\n '4': 'https://cdn.frankerfacez.com/emote/6/4',\n },\n },\n {\n id: '4',\n name: 'ManChicken',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/4/1',\n '2': 'https://cdn.frankerfacez.com/emote/4/2',\n '4': 'https://cdn.frankerfacez.com/emote/4/4',\n },\n },\n {\n id: '3',\n name: 'BeanieHipster',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/3/1',\n '2': 'https://cdn.frankerfacez.com/emote/3/2',\n '4': 'https://cdn.frankerfacez.com/emote/3/4',\n },\n },\n {\n id: '25927',\n name: 'CatBag',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/25927/1',\n '2': 'https://cdn.frankerfacez.com/emote/25927/2',\n '4': 'https://cdn.frankerfacez.com/emote/25927/4',\n },\n },\n {\n id: '27081',\n name: 'ZreknarF',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/27081/1',\n '2': 'https://cdn.frankerfacez.com/emote/27081/2',\n '4': 'https://cdn.frankerfacez.com/emote/27081/4',\n },\n },\n {\n id: '28136',\n name: 'LilZ',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/28136/1',\n '2': 'https://cdn.frankerfacez.com/emote/28136/2',\n '4': 'https://cdn.frankerfacez.com/emote/28136/4',\n },\n },\n {\n id: '28138',\n name: 'ZliL',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/28138/1',\n '2': 'https://cdn.frankerfacez.com/emote/28138/2',\n '4': 'https://cdn.frankerfacez.com/emote/28138/4',\n },\n },\n {\n id: '149346',\n name: 'LaterSooner',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/149346/1',\n '2': 'https://cdn.frankerfacez.com/emote/149346/2',\n '4': 'https://cdn.frankerfacez.com/emote/149346/4',\n },\n },\n {\n id: '142673',\n name: 'BORT',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/142673/1',\n '2': 'https://cdn.frankerfacez.com/emote/142673/2',\n '4': 'https://cdn.frankerfacez.com/emote/142673/4',\n },\n },\n {\n id: '757384',\n name: 'BibleThump',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/757384/1',\n '2': 'https://cdn.frankerfacez.com/emote/757384/2',\n '4': 'https://cdn.frankerfacez.com/emote/757384/4',\n },\n },\n {\n id: '723890',\n name: 'ffzW',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/723890/1',\n '2': 'https://cdn.frankerfacez.com/emote/723890/2',\n '4': 'https://cdn.frankerfacez.com/emote/723890/4',\n },\n },\n {\n id: '720508',\n name: 'ffzX',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/720508/1',\n '2': 'https://cdn.frankerfacez.com/emote/720508/2',\n '4': 'https://cdn.frankerfacez.com/emote/720508/4',\n },\n },\n {\n id: '720509',\n name: 'ffzY',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/720509/1',\n '2': 'https://cdn.frankerfacez.com/emote/720509/2',\n '4': 'https://cdn.frankerfacez.com/emote/720509/4',\n },\n },\n {\n id: '720729',\n name: 'ffzCursed',\n platform: 'ffz',\n animated: false,\n urls: {\n '1': 'https://cdn.frankerfacez.com/emote/720729/1',\n '2': 'https://cdn.frankerfacez.com/emote/720729/2',\n '4': 'https://cdn.frankerfacez.com/emote/720729/4',\n },\n },\n];\n\nconst TwitchEmotes = [\n {\n type: 'twitch',\n name: 'AsexualPride',\n id: '307827267',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827267/static/dark/3.0',\n },\n start: 0,\n end: 12,\n },\n {\n type: 'twitch',\n name: 'BisexualPride',\n id: '307827313',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827313/static/dark/3.0',\n },\n start: 13,\n end: 26,\n },\n {\n type: 'twitch',\n name: 'GayPride',\n id: '307827321',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827321/static/dark/3.0',\n },\n start: 27,\n end: 35,\n },\n {\n type: 'twitch',\n name: 'GenderFluidPride',\n id: '307827326',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827326/static/dark/3.0',\n },\n start: 36,\n end: 52,\n },\n {\n type: 'twitch',\n name: 'IntersexPride',\n id: '307827332',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827332/static/dark/3.0',\n },\n start: 53,\n end: 66,\n },\n {\n type: 'twitch',\n name: 'KappaPride',\n id: '55338',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/55338/static/dark/3.0',\n },\n start: 67,\n end: 77,\n },\n {\n type: 'twitch',\n name: 'PansexualPride',\n id: '307827370',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827370/static/dark/3.0',\n },\n start: 78,\n end: 92,\n },\n {\n type: 'twitch',\n name: 'TransgenderPride',\n id: '307827377',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/307827377/static/dark/3.0',\n },\n start: 93,\n end: 109,\n },\n {\n type: 'twitch',\n name: 'TheIlluminati',\n id: '145315',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/145315/static/dark/3.0',\n },\n start: 110,\n end: 123,\n },\n {\n type: 'twitch',\n name: 'BrainSlug',\n id: '115233',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/115233/static/dark/3.0',\n },\n start: 124,\n end: 133,\n },\n {\n type: 'twitch',\n name: 'imGlitch',\n id: '112290',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112290/static/dark/3.0',\n },\n start: 134,\n end: 142,\n },\n {\n type: 'twitch',\n name: 'GlitchNRG',\n id: '304489309',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304489309/static/dark/3.0',\n },\n start: 143,\n end: 152,\n },\n {\n type: 'twitch',\n name: 'TakeNRG',\n id: '112292',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/112292/static/dark/3.0',\n },\n start: 153,\n end: 160,\n },\n {\n type: 'twitch',\n name: 'DxCat',\n id: '110734',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/110734/static/dark/3.0',\n },\n start: 161,\n end: 166,\n },\n {\n type: 'twitch',\n name: 'VoHiYo',\n id: '81274',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/81274/static/dark/3.0',\n },\n start: 167,\n end: 173,\n },\n {\n type: 'twitch',\n name: 'DoritosChip',\n id: '102242',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/102242/static/dark/3.0',\n },\n start: 174,\n end: 185,\n },\n {\n type: 'twitch',\n name: 'KomodoHype',\n id: '81273',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/81273/static/dark/3.0',\n },\n start: 186,\n end: 196,\n },\n {\n type: 'twitch',\n name: 'duDudu',\n id: '62834',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/62834/static/dark/3.0',\n },\n start: 197,\n end: 203,\n },\n {\n type: 'twitch',\n name: 'CoolCat',\n id: '58127',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/58127/static/dark/3.0',\n },\n start: 204,\n end: 211,\n },\n {\n type: 'twitch',\n name: 'BloodTrail',\n id: '69',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/69/static/dark/3.0',\n },\n start: 212,\n end: 222,\n },\n {\n type: 'twitch',\n name: 'PunchTrees',\n id: '47',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/47/static/dark/3.0',\n },\n start: 223,\n end: 233,\n },\n {\n type: 'twitch',\n name: 'SSSsss',\n id: '46',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/46/static/dark/3.0',\n },\n start: 234,\n end: 240,\n },\n {\n type: 'twitch',\n name: 'SSSsssplode',\n id: 'emotesv2_df1b3a19d9fc4bff81429afdfb46fff0',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_df1b3a19d9fc4bff81429afdfb46fff0/default/dark/3.0',\n },\n start: 241,\n end: 251,\n },\n {\n type: 'twitch',\n name: 'Kappa',\n id: '25',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/25/static/dark/3.0',\n },\n start: 253,\n end: 258,\n },\n {\n type: 'twitch',\n name: 'KappaClaus',\n id: '74510',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/74510/static/dark/3.0',\n },\n start: 259,\n end: 269,\n },\n {\n type: 'twitch',\n name: 'MrDestructoid',\n id: '28',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/28/static/dark/3.0',\n },\n start: 270,\n end: 283,\n },\n {\n type: 'twitch',\n name: 'HSWP',\n id: '446979',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/446979/static/dark/3.0',\n },\n start: 292,\n end: 296,\n },\n {\n type: 'twitch',\n name: 'Shush',\n id: 'emotesv2_819621bcb8f44566a1bd8ea63d06c58f',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_819621bcb8f44566a1bd8ea63d06c58f/static/dark/3.0',\n },\n start: 297,\n end: 302,\n },\n {\n type: 'twitch',\n name: 'KPOPTT',\n id: '304047269',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304047269/default/dark/3.0',\n },\n start: 303,\n end: 308,\n },\n {\n type: 'twitch',\n name: 'FrogPonder',\n id: 'emotesv2_a3cdcbfcae9b41bb8215b012362eea35',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_a3cdcbfcae9b41bb8215b012362eea35/default/dark/3.0',\n },\n start: 310,\n end: 319,\n },\n {\n type: 'twitch',\n name: 'HypeCheer',\n id: 'emotesv2_dd4f4f9cea1a4039ad3390e20900abe4',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dd4f4f9cea1a4039ad3390e20900abe4/default/dark/3.0',\n },\n start: 321,\n end: 329,\n },\n {\n type: 'twitch',\n name: 'HypeFail',\n id: 'emotesv2_0330a84e75ad48c1821c1d29a7dadd4d',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_0330a84e75ad48c1821c1d29a7dadd4d/default/dark/3.0',\n },\n start: 0,\n end: 7,\n },\n {\n type: 'twitch',\n name: 'HypePopcorn',\n id: 'emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a',\n gif: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_7b8e74be7bd64601a2608c2ff5f6eb7a/default/dark/3.0',\n },\n start: 9,\n end: 19,\n },\n {\n type: 'twitch',\n name: 'GlitchCat',\n id: '304486301',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/304486301/static/dark/3.0',\n },\n start: 21,\n end: 30,\n },\n {\n type: 'twitch',\n name: 'SoonerLater',\n id: '2113050',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/2113050/static/dark/3.0',\n },\n start: 31,\n end: 42,\n },\n {\n type: 'twitch',\n name: 'FBBlock',\n id: '1441276',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441276/static/dark/3.0',\n },\n start: 43,\n end: 50,\n },\n {\n type: 'twitch',\n name: 'FBCatch',\n id: '1441281',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441281/static/dark/3.0',\n },\n start: 51,\n end: 58,\n },\n {\n type: 'twitch',\n name: 'FBPass',\n id: '1441271',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441271/static/dark/3.0',\n },\n start: 59,\n end: 65,\n },\n {\n type: 'twitch',\n name: 'FBRun',\n id: '1441261',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441261/static/dark/3.0',\n },\n start: 66,\n end: 71,\n },\n {\n type: 'twitch',\n name: 'FBtouchdown',\n id: '626795',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/626795/static/dark/3.0',\n },\n start: 72,\n end: 83,\n },\n {\n type: 'twitch',\n name: 'FBSpiral',\n id: '1441273',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441273/static/dark/3.0',\n },\n start: 84,\n end: 92,\n },\n {\n type: 'twitch',\n name: 'FBPenalty',\n id: '1441289',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441289/static/dark/3.0',\n },\n start: 93,\n end: 102,\n },\n {\n type: 'twitch',\n name: 'FBChallenge',\n id: '1441285',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1441285/static/dark/3.0',\n },\n start: 103,\n end: 114,\n },\n {\n type: 'twitch',\n name: 'PixelBob',\n id: '1547903',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/1547903/static/dark/3.0',\n },\n start: 115,\n end: 123,\n },\n {\n type: 'twitch',\n name: 'LUL',\n id: '425618',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/425618/static/dark/3.0',\n },\n start: 124,\n end: 127,\n },\n {\n type: 'twitch',\n name: 'DarkMode',\n id: '461298',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/461298/static/dark/3.0',\n },\n start: 128,\n end: 136,\n },\n {\n type: 'twitch',\n name: 'PopCorn',\n id: '724216',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/724216/static/dark/3.0',\n },\n start: 137,\n end: 144,\n },\n {\n type: 'twitch',\n name: 'EarthDay',\n id: '959018',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/959018/static/dark/3.0',\n },\n start: 145,\n end: 153,\n },\n {\n type: 'twitch',\n name: 'TwitchUnity',\n id: '196892',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/196892/static/dark/3.0',\n },\n start: 154,\n end: 165,\n },\n {\n type: 'twitch',\n name: 'Squid1',\n id: '191762',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191762/static/dark/3.0',\n },\n start: 166,\n end: 172,\n },\n {\n type: 'twitch',\n name: 'Squid2',\n id: '191763',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191763/static/dark/3.0',\n },\n start: 173,\n end: 179,\n },\n {\n type: 'twitch',\n name: 'Squid3',\n id: '191764',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191764/static/dark/3.0',\n },\n start: 180,\n end: 186,\n },\n {\n type: 'twitch',\n name: 'Squid4',\n id: '191767',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191767/static/dark/3.0',\n },\n start: 187,\n end: 193,\n },\n {\n type: 'twitch',\n name: 'DinoDance',\n id: 'emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7',\n gif: true,\n animated: true,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_dcd06b30a5c24f6eb871e8f5edbd44f7/animated/dark/3.0',\n },\n start: 194,\n end: 203,\n },\n {\n type: 'twitch',\n name: 'CrreamAwk',\n id: '191313',\n gif: false,\n animated: false,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/191313/static/dark/3.0',\n },\n start: 204,\n end: 213,\n },\n {\n type: 'twitch',\n name: 'PopNemo',\n id: 'emotesv2_5d523adb8bbb4786821cd7091e47da21',\n gif: true,\n animated: true,\n urls: {\n '1': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/1.0',\n '2': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/2.0',\n '4': 'https://static-cdn.jtvnw.net/emoticons/v2/emotesv2_5d523adb8bbb4786821cd7091e47da21/animated/dark/3.0',\n },\n start: 214,\n end: 221,\n },\n];\n\nconst emotes: Array<TwitchEmote | BttvEmote | SeventvEmote> = Object.values([\n ...TwitchEmotes,\n ...BttvEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n ...SeventvEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n ...FfzEmotes.map((e) => ({\n type: e.platform,\n name: e.name,\n id: e.id,\n gif: e.animated,\n animated: e.animated,\n urls: e.urls,\n })),\n]).reduce(\n (acc, emote) => {\n if ((emote as any)?.platform) {\n emote.type = (emote as any).platform;\n delete (emote as any).platform;\n }\n\n if (!acc.some((e) => e.name === emote.name)) {\n acc.push({\n ...emote,\n start: 0,\n end: 0,\n } as TwitchEmote | BttvEmote | SeventvEmote);\n }\n\n return acc;\n },\n [] as Array<TwitchEmote | BttvEmote | SeventvEmote>,\n);\n\nexport { TwitchEmotes, BttvEmotes, SeventvEmotes, FfzEmotes, emotes };\n","export const items: any[] = [];\n","export const twitch_messages = [\n 'haHAA',\n 'CiGrip',\n 'PopNemo',\n 'PogChamp',\n 'bttvNice',\n 'ariW wave',\n 'DinoDance',\n 'CruW salute',\n 'c! PogChamp',\n 'LUL LUL LUL',\n 'CandianRage',\n 'CatBag kitty!',\n '<3 good times',\n 'catJAM vibing',\n 'DuckerZ quack',\n ':tf: trollface',\n 'haHAA good one',\n \"HSWP let's go!\",\n 'DxCat claws out',\n 'ConcernDoge hmm',\n 'BroBalt nice one',\n 'VoHiYo everyone!',\n 'LuL that was funny',\n 'Kappa just kidding',\n 'FBCatch nice grab!',\n 'cvHazmat stay safe',\n 'CookieTime nom nom',\n 'LuL that was funny',\n 'CruW crew assembled',\n 'GlitchCat GlitchCat',\n 'CoolCat staying calm',\n 'bUrself be yourself!',\n 'catJAM catJAM catJAM',\n 'HSWP here we go again',\n 'Shush moment incoming',\n 'duDudu rhythm section',\n ':tf: face palm moment',\n 'duDudu rhythm section',\n 'HSWP here we go again',\n 'PunchTrees PunchTrees',\n 'SSSsss Minecraft time',\n 'KappaPride represent!',\n 'haHAA that joke though',\n 'DoritosChip snack time',\n 'DoritosChip snack time',\n 'asexualPride represent',\n 'duDudu dancing on beat',\n 'FBBlock defensive play!',\n 'ariW waving at everyone',\n 'PopNemo finding our way',\n 'ariW waving at everyone',\n 'TheIlluminati confirmed',\n 'SSSsss slithering vibes',\n 'GayPride celebrate love',\n 'BloodTrail hunting time',\n 'TheIlluminati confirmed',\n \"LUL can't stop laughing\",\n 'HypeCheer clap clap clap',\n 'DuckerZ quacking in chat',\n 'Wait for it... PogChamp!',\n 'HypeCheer clap clap clap',\n 'KPOPTT music to our ears',\n 'FrogPonder thinking frog',\n \"IntersexPride we're here\",\n 'KappaPride be proud Kappa',\n 'cvHazmat suit up for this',\n 'BrainSlug giving me ideas',\n 'KappaPride be proud Kappa',\n 'This music is fire catJAM',\n 'I just followed! PogChamp',\n 'MrDestructoid robot vibes',\n 'BroBalt brotherhood moment',\n 'VoHiYo greetings from chat',\n 'PogChamp PogChamp PogChamp',\n 'DxCat meow meow KomodoHype',\n 'Squid1 Squid2 Squid3 Squid4',\n 'KomodoHype the hype is real',\n 'DarkMode gang where you at?',\n 'Wait what just happened? D:',\n 'TakeNRG infinite energy NRG',\n 'CookieTime break time snack',\n 'The dedication is real here',\n 'PopCorn watching this unfold',\n 'CandianRage maple syrup fury',\n 'PopCorn watching this unfold',\n 'LesbianPride strong together',\n 'DinoDance DinoDance DinoDance',\n 'TakeNRG this energy is unreal',\n 'Everyone gets hype! HypeCheer',\n 'CiGrip strong grip on the game',\n 'CoolCat no stress allowed here',\n 'BisexualPride all love matters',\n 'GenderFluidPride freedom to be',\n 'DarkMode gang in here DarkMode',\n \"HypeFail oops that didn't work\",\n 'HypePopcorn this is the moment',\n 'ConcernDoge is everything okay?',\n 'BloodTrail following the leader',\n 'This is so wholesome AngelThump',\n 'ImGlitch technical difficulties',\n 'Anyone else eating? DoritosChip',\n 'PixelBob retro vibes with Kappa',\n 'SoonerLater catch you next time',\n 'imGlitch glitchy but we love it',\n 'KomodoHype the energy is crazy!',\n 'NonbinaryPride beyond the binary',\n 'PansexualPride love is universal',\n 'This community is the best Kappa',\n 'BrainSlug with the big brain play',\n 'TransgenderPride living authentic',\n 'AngelThump wholesomeness incoming',\n 'GlitchCat imGlitch what happened?',\n 'CrreamAwk that was awkward VoHiYo',\n 'IronmouseLuv appreciate the stream',\n 'PunchTrees minecraft mode activated',\n 'The skill on display here is unreal',\n 'LesbianPride GayPride BisexualPride',\n 'PogChamp PogChamp PogChamp PogChamp',\n \"TwitchUnity we're all here for this\",\n 'This is absolutely insane KomodoHype',\n 'Never seen anything like this before',\n 'Vibing with cat-shaped avatars catJAM',\n 'EarthDay appreciation for this stream',\n \"TheIlluminati knows something we don't\",\n \"Shush they're about to do something big\",\n 'Can we appreciate this moment? PogChamp',\n 'MrDestructoid destroying the competition',\n 'AsexualPride IntersexPride GenderFluidPride',\n 'TransgenderPride PansexualPride NonbinaryPride',\n];\n\nexport const youtube_messages = [\n ':ytg: Keep it up!',\n ':yt: YouTube hype!',\n ':gar: Amazing as always!',\n 'No words, just :awesome:',\n 'You got this! :yougotthis:',\n ':elbowbump: Great teamwork!',\n 'Love this energy! :goodvibes:',\n 'Just arrived! :hand-pink-waving:',\n 'Great gameplay! :hand-yellow-nails:',\n ':face-pink-tears: Tears of joy here',\n 'This stream is incredible :awesome:',\n 'Hydration break everyone! :hydrate:',\n ':text-green-game-over: You won this!',\n \":face-blue-star-eyes: You're a star!\",\n 'Virtual hug for everyone :virtualhug:',\n 'Happy to be here! :face-green-smiling:',\n 'Chilling with my dog :chillwdog: vibing',\n ':face-red-heart-shape: Love what you do',\n ':person-turqouise-waving: Hey everyone!',\n 'This community is the best! :goodvibes:',\n ':face-blue-smiling: Amazing vibes today',\n ':goodvibes: Only good vibes in this chat',\n ':body-blue-raised-arms: Victory is ours!',\n ':pride-flower-rainbow-heart: Love is love',\n ':octopus-red-waving: Waves from the chat!',\n ':thanksdoc: Thanks for the entertainment!',\n ':face-purple-crying: Why is this so good??',\n ':eyes-pink-heart-shape: Beautiful gameplay',\n ':fish-orange-wide-eyes: Eyes on the prize!',\n ':whistle-red-blow: That was a performance!',\n 'Respect the grind :hand-green-crystal-ball:',\n 'Learning so much from this stream :learning:',\n ':pride-people-embracing-two: Community love!',\n ':face-red-droopy-eyes: long day but worth it',\n 'Chilling with my cat :chillwcat: so peaceful',\n ':face-fuchsia-tongue-out: Having too much fun',\n ':person-purple-stage-event: This is showtime!',\n ':card-red-penalty: That was risky! Bold move!',\n ':face-purple-smiling-tears: This is too good!',\n ':face-orange-tv-shape: Broadcasting excellence',\n ':face-orange-tv-shape: Broadcasting excellence',\n ':face-blue-heart-eyes: This stream has my heart',\n ':person-turquoise-crowd-surf: Crowd going wild!',\n 'Best gaming session ever :trophy-yellow-smiling:',\n ':hand-purple-blue-peace: Peace out, great stream!',\n ':face-purple-sweating: Clutch moment! So intense!',\n \":hand-orange-covering-eyes: Can't believe my eyes!\",\n ':face-blue-question-mark: How do you even do that?',\n ':baseball-white-cap-out: Home run! Total knockout!',\n ':volcano-green-lava-orange: Things are getting HOT',\n ':face-purple-smiling-fangs: Evil laugh at that play',\n ':stopwatch-blue-hand-timer: Speedrunning like a pro',\n ':location-yellow-teal-bars: Streaming from the top!',\n \":face-purple-open-box: What's next? More surprises?\",\n ':person-turquoise-wizard-wand: Like magic out there!',\n ':face-blue-wide-eyes: Did that actually just happen?!',\n ':medal-yellow-first-red: Number one stream right here',\n ':face-turquoise-music-note: Vibing to this soundtrack',\n 'Can we just appreciate how awesome this is? :awesome:',\n ':popcorn-yellow-striped-smile: This is the main event!',\n ':face-orange-raised-eyebrow: Interesting strategy there',\n \":person-blue-speaking-microphone: Let's go! Hype it up!\",\n ':pride-megaphone-rainbow-handle: Amplifying good vibes!',\n \":rocket-red-countdown-liftoff: Let's go! Time to launch!\",\n ':person-blue-holding-pencil: Taking notes on these skills',\n ':face-fuchsia-poop-shape: That was a mess! But we survived',\n ':person-pink-swaying-hair: The style, the skill, everything!',\n ':body-turquoise-yoga-pose: So smooth and calm under pressure',\n ':penguin-blue-waving-tear: Goodbye for now, fantastic stream!',\n ':face-turquoise-covering-eyes: Wait what? How did you do that?',\n ':face-turquoise-covering-eyes: Wait what? How did you do that?',\n ':clock-turquoise-looking-up: What time is it? Time to watch you!',\n ':person-blue-eating-spaghetti: Fueling up after that performance',\n \":hourglass-purple-sand-orange: Time flies when you're having fun\",\n ':face-turquoise-drinking-coffee: Coffee and gaming, perfect combo',\n \":person-turquoise-writes-headphones: That's some creative strategy\",\n ':face-purple-rain-drops: Emotional over here :face-pink-drinking-tea:',\n ':pride-person-heart-lesbian: Proud and here :pride-flowers-turquoise-transgender:',\n];\n\nexport const normal_messages = [\n 'GG!',\n 'Wow just wow',\n 'Fire fire fire',\n 'Simply amazing',\n 'Never gets old',\n 'Veteran energy',\n 'That was insane',\n 'Hello everyone!',\n 'Best moment ever',\n 'Love seeing this',\n 'Walking the walk',\n 'Cannot look away',\n 'Love seeing this',\n 'Never disappoints',\n 'What a turnaround',\n 'Never counted out',\n 'Respect the grind',\n 'Never disappoints',\n 'Respect the grind',\n 'Hard work pays off',\n 'Consistency is key',\n 'Art form of gaming',\n 'Great gameplay btw',\n 'This is next level',\n 'Peak entertainment',\n 'This is why I watch',\n 'Real recognize real',\n 'Chat is going crazy',\n 'Motivation overload',\n 'When it matters most',\n 'Setting the bar high',\n 'Different vibe today',\n 'Flow state activated',\n 'Comeback king energy',\n 'Mind blown right now',\n 'Cannot stop watching',\n 'The dedication shows',\n 'Vibes are immaculate',\n 'Automatic excellence',\n 'Always coming through',\n 'Unmatched performance',\n 'Promises and delivers',\n 'Mental game is strong',\n 'Calculated every move',\n 'One step ahead always',\n 'Heart racing right now',\n 'On the edge of my seat',\n 'In the zone completely',\n 'Next level inspiration',\n 'From behind to victory',\n 'Confidence is key here',\n 'This is playoff energy',\n 'I love this community!',\n 'So satisfying to watch',\n 'Pure talent right here',\n 'Clutch moment incoming',\n 'This is peak streaming',\n 'Delivers under pressure',\n 'Ice in the veins moment',\n 'This stream is amazing!',\n 'So composed and focused',\n 'Muscle memory is insane',\n 'Gonna apply this myself',\n 'Backing it up every time',\n 'Every stream gets better',\n 'Good energy in this chat',\n 'Physical and mental peak',\n 'Tournament mode activated',\n 'Absolute unit of a player',\n 'Playing 4D chess out here',\n 'This is pure content gold',\n 'Always believes in the win',\n 'Champion mentality showing',\n 'Winners mindset on display',\n 'This deserves all the hype',\n 'Community makes it special',\n 'Red pilled and game pilled',\n 'Experience matters so much',\n 'Been perfecting this craft',\n 'Masterclass happening live',\n 'First time here, loving it!',\n 'Bringing the A game tonight',\n 'Nothing stops this momentum',\n 'Outsmarting the competition',\n 'This chat is moving so fast!',\n 'Incredible skills on display',\n 'Years of practice paying off',\n 'The way they handle pressure',\n 'Unstoppable force on display',\n 'Precision and power combined',\n 'Nothing can break this focus',\n 'This is beautiful to witness',\n 'Vision and execution perfect',\n 'Can we get some hype in chat?',\n 'Taking mental notes right now',\n 'Stealing all these strategies',\n 'Absolutely crushing it today!',\n 'POG! POG! POG! This is insane!',\n 'Just got here, what did I miss?',\n 'Showing everyone how it is done',\n 'Knowledge translation to action',\n 'Learning from the absolute best',\n 'Stream quality is insane today!',\n 'Not gonna lie, that was genius!',\n 'Gaming at its finest right here',\n 'Best stream on Twitch right now!',\n \"The strategy here is chef's kiss\",\n 'This is what greatness looks like',\n 'Going to bed, good night everyone!',\n 'Content like this is why I tune in',\n 'Clap clap clap! Amazing performance!',\n 'Absolutely phenomenal content today!',\n 'Respect to the dedication shown here',\n \"I'm taking notes for my own gameplay\",\n 'Legendary session right here, no cap',\n 'The mechanics on display here are unreal',\n 'This is what peak performance looks like',\n 'This is why I love this community so much',\n 'Setting records and breaking expectations',\n \"First time watching and I'm already hooked\",\n 'Every single play is calculated perfection',\n 'The game knowledge displayed here is insane',\n 'The fundamentals here are next level perfect',\n 'Watching someone who truly loves their craft',\n 'The way they handle adversity is so inspiring',\n 'Every single decision is calculated perfectly',\n 'The combination of speed and accuracy is wild',\n 'This is what happens when talent meets effort',\n 'The artistry in gameplay displayed right here',\n 'Stream just made my day a million times better',\n 'This level of consistency is absolutely insane',\n 'The decision making under pressure is flawless',\n 'The improvement from stream to stream is crazy',\n 'The mental fortitude required for this is huge',\n 'Reading opponents like they are so predictable',\n 'How many years did it take to reach this level?',\n 'This person has transcended normal skill levels',\n 'The ability to stay cool under extreme pressure',\n 'Been here since the beginning, never looked back',\n 'Never seen a player adapt so quickly to mistakes',\n 'This is exactly what peak performance looks like',\n 'Years of training visible in every single moment',\n 'Professional level execution on full display here',\n 'This is the standard that everyone should aspire to',\n 'Nothing phases this player when the stakes are high',\n 'This is entertainment at the absolute highest level',\n];\n\nexport const messages = [...twitch_messages, ...youtube_messages, ...normal_messages];\n","export const names = [\n 'Tixyel',\n 'awigui',\n 'kurao_w',\n 'Urie_s2',\n 'itzzcatt',\n 'BeniArts',\n 'mynnyori',\n 'DexPixel',\n 'Cupidiko',\n 'starkuss_',\n 'catsember',\n 'shy_madeit',\n 'SpookySony',\n 'nanagadesign',\n];\n","export const tiers = ['1000', '2000', '3000', 'prime'];\n","export const tts = [\n 'Filiz',\n 'Astrid',\n 'Tatyana',\n 'Maxim',\n 'Carmen',\n 'Ines',\n 'Cristiano',\n 'Vitoria',\n 'Ricardo',\n 'Maja',\n 'Jan',\n 'Jacek',\n 'Ewa',\n 'Ruben',\n 'Lotte',\n 'Liv',\n 'Seoyeon',\n 'Takumi',\n 'Mizuki',\n 'Giorgio',\n 'Carla',\n 'Bianca',\n 'Karl',\n 'Dora',\n 'Mathieu',\n 'Celine',\n 'Chantal',\n 'Penelope',\n 'Miguel',\n 'Mia',\n 'Enrique',\n 'Conchita',\n 'Geraint',\n 'Salli',\n 'Matthew',\n 'Kimberly',\n 'Kendra',\n 'Justin',\n 'Joey',\n 'Joanna',\n 'Ivy',\n 'Raveena',\n 'Aditi',\n 'Emma',\n 'Brian',\n 'Amy',\n 'Russell',\n 'Nicole',\n 'Vicki',\n 'Marlene',\n 'Hans',\n 'Naja',\n 'Mads',\n 'Gwyneth',\n 'Zhiyu',\n 'Tracy',\n 'Danny',\n 'Huihui',\n 'Yaoyao',\n 'Kangkang',\n 'HanHan',\n 'Zhiwei',\n 'Asaf',\n 'An',\n 'Stefanos',\n 'Filip',\n 'Ivan',\n 'Heidi',\n 'Herena',\n 'Kalpana',\n 'Hemant',\n 'Matej',\n 'Andika',\n 'Rizwan',\n 'Lado',\n 'Valluvar',\n 'Linda',\n 'Heather',\n 'Sean',\n 'Michael',\n 'Karsten',\n 'Guillaume',\n 'Pattara',\n 'Jakub',\n 'Szabolcs',\n 'Hoda',\n 'Naayf',\n];\n","export const YoutubeEmotes = [\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/flower-rainbow-heart-red',\n shortcuts: [':pride-flower-rainbow-heart:'],\n searchTerms: ['pride-flower-rainbow-heart'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/8cF4z9clPGshgty6vT3ImAtx_CUvz3TMY-SAu_UKw-x1Z9-2KzcK4OuyAIROrKhyvcabrw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/8cF4z9clPGshgty6vT3ImAtx_CUvz3TMY-SAu_UKw-x1Z9-2KzcK4OuyAIROrKhyvcabrw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flower-rainbow-heart',\n },\n },\n },\n isCustomEmoji: true,\n index: 0,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-green-earth-head',\n shortcuts: [':pride-person-earth-intersex:'],\n searchTerms: ['pride-person-earth-intersex'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Gr-3he7L8jjQFj7aI0kSY1eV4aIsy-vT7Hk5shdakigG9aAJO_uMBmV6haCtK1OHjTEjj1o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Gr-3he7L8jjQFj7aI0kSY1eV4aIsy-vT7Hk5shdakigG9aAJO_uMBmV6haCtK1OHjTEjj1o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-earth-intersex',\n },\n },\n },\n isCustomEmoji: true,\n index: 1,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-heart-lesbian',\n shortcuts: [':pride-person-heart-lesbian:'],\n searchTerms: ['pride-person-heart-lesbian'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tKVZ2TfK5tMLvF88cnz2YNVwuHNgr0eDR9Ef8J0OCkZEHXLFUtH3f6-xSHhqhwd2sL3Tu4I=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tKVZ2TfK5tMLvF88cnz2YNVwuHNgr0eDR9Ef8J0OCkZEHXLFUtH3f6-xSHhqhwd2sL3Tu4I=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-heart-lesbian',\n },\n },\n },\n isCustomEmoji: true,\n index: 2,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-flower-nonbinary',\n shortcuts: [':pride-person-flower-nonbinary:'],\n searchTerms: ['pride-person-flower-nonbinary'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/le1X4KHLOmK5K1s5xu-owmP_eZK4D0ExyjnMCS6UNqZa-Zh4uEzz3mZnU3jBlLfi14Zpngw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/le1X4KHLOmK5K1s5xu-owmP_eZK4D0ExyjnMCS6UNqZa-Zh4uEzz3mZnU3jBlLfi14Zpngw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-person-flower-nonbinary',\n },\n },\n },\n isCustomEmoji: true,\n index: 3,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/flower-rainbow-heart-pansexual',\n shortcuts: [':pride-flower-pansexual:'],\n searchTerms: ['pride-flower-pansexual'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/blSdVv_UpdTn8BIWU6u9oCWhdtpc0-a-3dJeaRX9As6ftLc0OGPJ1PveQEJbUEDzf6by2Xi9=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/blSdVv_UpdTn8BIWU6u9oCWhdtpc0-a-3dJeaRX9As6ftLc0OGPJ1PveQEJbUEDzf6by2Xi9=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flower-pansexual',\n },\n },\n },\n isCustomEmoji: true,\n index: 4,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/heart-stripes-pride-flag',\n shortcuts: [':pride-heart-rainbow-philly:'],\n searchTerms: ['pride-heart-rainbow-philly'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7iYeXsmU2YMcKsKalaKJhirWdDASATIpl_c7Ib7akaRhvz8GChI4xpM0d0dtASjmmWPbg1NG=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7iYeXsmU2YMcKsKalaKJhirWdDASATIpl_c7Ib7akaRhvz8GChI4xpM0d0dtASjmmWPbg1NG=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-heart-rainbow-philly',\n },\n },\n },\n isCustomEmoji: true,\n index: 5,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/symbol-turquoise-flowers-transgender',\n shortcuts: [':pride-flowers-turquoise-transgender:'],\n searchTerms: ['pride-flowers-turquoise-transgender'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ovz1T6ay1D1GNFXwwYibZeu_rV5_iSRXWSHR2thQDLLWejVQMqWPUhsUWrMMw1tlBwllYA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ovz1T6ay1D1GNFXwwYibZeu_rV5_iSRXWSHR2thQDLLWejVQMqWPUhsUWrMMw1tlBwllYA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-flowers-turquoise-transgender',\n },\n },\n },\n isCustomEmoji: true,\n index: 6,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hand-rainbow-fan-open',\n shortcuts: [':pride-fan-rainbow-open:'],\n searchTerms: ['pride-fan-rainbow-open'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/lDH5aORWtlc42NxTwiP3aIUIjttLVvE4Q_xIJDuu55DKvYSLeDIysOEKtGuMmEtOLgvZ_zTX=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/lDH5aORWtlc42NxTwiP3aIUIjttLVvE4Q_xIJDuu55DKvYSLeDIysOEKtGuMmEtOLgvZ_zTX=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-fan-rainbow-open',\n },\n },\n },\n isCustomEmoji: true,\n index: 7,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-pink-hair-earrings',\n shortcuts: [':pride-face-pink-earrings:'],\n searchTerms: ['pride-face-pink-earrings'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/utFog-w4fqgJ05xfQFjSdy8jvRBtFCeuWRkLH3IaVJ4WCBrdjDbXzXOprJA_h6MPOuksv0c=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/utFog-w4fqgJ05xfQFjSdy8jvRBtFCeuWRkLH3IaVJ4WCBrdjDbXzXOprJA_h6MPOuksv0c=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-pink-earrings',\n },\n },\n },\n isCustomEmoji: true,\n index: 8,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/unicorn-white-rainbow-mane',\n shortcuts: [':pride-unicorn-rainbow-mane:'],\n searchTerms: ['pride-unicorn-rainbow-mane'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/fvdANfncTw5aDF8GBq20kHicN5rMVoCMTM3FY8MQbZH9sZXvHy5o48yvHZWN4No5rz8b7-0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/fvdANfncTw5aDF8GBq20kHicN5rMVoCMTM3FY8MQbZH9sZXvHy5o48yvHZWN4No5rz8b7-0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-unicorn-rainbow-mane',\n },\n },\n },\n isCustomEmoji: true,\n index: 9,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/people-embracing-two',\n shortcuts: [':pride-people-embracing-two:'],\n searchTerms: ['pride-people-embracing-two'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/h1zJqFv2R4LzS3ZUpVyHhprCHQTIhbSecqu2Lid23byl5hD5cJdnshluOCyRdldYkWCUNg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/h1zJqFv2R4LzS3ZUpVyHhprCHQTIhbSecqu2Lid23byl5hD5cJdnshluOCyRdldYkWCUNg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-people-embracing-two',\n },\n },\n },\n isCustomEmoji: true,\n index: 10,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-green-hair-tears',\n shortcuts: [':pride-face-green-tears:'],\n searchTerms: ['pride-face-green-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2BNf4_qBG7mqt1sN-JwThp1srHlDr03xoya9hpIvbgS65HwLaaDz46r3A6dy8JnO2GtLNag=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2BNf4_qBG7mqt1sN-JwThp1srHlDr03xoya9hpIvbgS65HwLaaDz46r3A6dy8JnO2GtLNag=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-green-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 11,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/megaphone-rainbow-handle',\n shortcuts: [':pride-megaphone-rainbow-handle:'],\n searchTerms: ['pride-megaphone-rainbow-handle'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cop1MU9YkEuUxbe8d1NhPl1S9uJ60YSVTMM1gelP7Cy0BICa6Ey_TpxEFFdYITtsUK1cSg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cop1MU9YkEuUxbe8d1NhPl1S9uJ60YSVTMM1gelP7Cy0BICa6Ey_TpxEFFdYITtsUK1cSg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-megaphone-rainbow-handle',\n },\n },\n },\n isCustomEmoji: true,\n index: 12,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hand-brown-yellow-nails',\n shortcuts: [':pride-hand-yellow-nails:'],\n searchTerms: ['pride-hand-yellow-nails'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/1dEPlxkQ1RdZkPo5CLgYvneMQ-BBo63b3nnASEAXoccnVktMjgviKqMj1pjPiK2zTPTc7g=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/1dEPlxkQ1RdZkPo5CLgYvneMQ-BBo63b3nnASEAXoccnVktMjgviKqMj1pjPiK2zTPTc7g=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-hand-yellow-nails',\n },\n },\n },\n isCustomEmoji: true,\n index: 13,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-orange-hair-flowing',\n shortcuts: [':pride-face-orange-flowing:'],\n searchTerms: ['pride-face-orange-flowing'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/RuhTeU8YiT0_NaOYjMmXv77eEw5eO5Bdzfr7ouS0u3ZAK2J4coKGe5g4fN8mJV85jC63hw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/RuhTeU8YiT0_NaOYjMmXv77eEw5eO5Bdzfr7ouS0u3ZAK2J4coKGe5g4fN8mJV85jC63hw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pride-face-orange-flowing',\n },\n },\n },\n isCustomEmoji: true,\n index: 14,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/CIW60IPp_dYCFcuqTgodEu4IlQ',\n shortcuts: [':yt:'],\n searchTerms: ['yt'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/IkpeJf1g9Lq0WNjvSa4XFq4LVNZ9IP5FKW8yywXb12djo1OGdJtziejNASITyq4L0itkMNw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/IkpeJf1g9Lq0WNjvSa4XFq4LVNZ9IP5FKW8yywXb12djo1OGdJtziejNASITyq4L0itkMNw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'yt',\n },\n },\n },\n isCustomEmoji: true,\n index: 15,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/CN2m5cKr49sCFYbFggodDFEKrg',\n shortcuts: [':oops:'],\n searchTerms: ['oops'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/PFoVIqIiFRS3aFf5-bt_tTC0WrDm_ylhF4BKKwgqAASNb7hVgx_adFP-XVhFiJLXdRK0EQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/PFoVIqIiFRS3aFf5-bt_tTC0WrDm_ylhF4BKKwgqAASNb7hVgx_adFP-XVhFiJLXdRK0EQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'oops',\n },\n },\n },\n isCustomEmoji: true,\n index: 16,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/X_zdXMHgJaPa8gTGt4f4Ag',\n shortcuts: [':buffering:'],\n searchTerms: ['buffering'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5gfMEfdqO9CiLwhN9Mq7VI6--T2QFp8AXNNy5Fo7btfY6fRKkThWq35SCZ6SPMVCjg-sUA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5gfMEfdqO9CiLwhN9Mq7VI6--T2QFp8AXNNy5Fo7btfY6fRKkThWq35SCZ6SPMVCjg-sUA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'buffering',\n },\n },\n },\n isCustomEmoji: true,\n index: 17,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/1v50XorRJ8GQ8gTz_prwAg',\n shortcuts: [':stayhome:'],\n searchTerms: ['stayhome'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_1FGHypiub51kuTiNBX1a0H3NyFih3TnHX7bHU06j_ajTzT0OQfMLl9RI1SiQoxtgA2Grg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_1FGHypiub51kuTiNBX1a0H3NyFih3TnHX7bHU06j_ajTzT0OQfMLl9RI1SiQoxtgA2Grg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'stayhome',\n },\n },\n },\n isCustomEmoji: true,\n index: 18,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/8P50XuS9Oo7h8wSqtIagBA',\n shortcuts: [':dothefive:'],\n searchTerms: ['dothefive'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-nM0DOd49969h3GNcl705Ti1fIf1ZG_E3JxcOUVV-qPfCW6jY8xZ98caNLHkVSGRTSEb7Y9y=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-nM0DOd49969h3GNcl705Ti1fIf1ZG_E3JxcOUVV-qPfCW6jY8xZ98caNLHkVSGRTSEb7Y9y=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'dothefive',\n },\n },\n },\n isCustomEmoji: true,\n index: 19,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Fv90Xq-vJcPq8gTqzreQAQ',\n shortcuts: [':elbowbump:'],\n searchTerms: ['elbowbump'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2ou58X5XuhTrxjtIM2wew1f-HKRhN_T5SILQgHE-WD9dySzzJdGwL4R1gpKiJXcbtq6sjQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2ou58X5XuhTrxjtIM2wew1f-HKRhN_T5SILQgHE-WD9dySzzJdGwL4R1gpKiJXcbtq6sjQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'elbowbump',\n },\n },\n },\n isCustomEmoji: true,\n index: 20,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Iv90XouTLuOR8gSxxrToBA',\n shortcuts: [':goodvibes:'],\n searchTerms: ['goodvibes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2CvFOwgKpL29mW_C51XvaWa7Eixtv-3tD1XvZa1_WemaDDL2AqevKbTZ1rdV0OWcnOZRag=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2CvFOwgKpL29mW_C51XvaWa7Eixtv-3tD1XvZa1_WemaDDL2AqevKbTZ1rdV0OWcnOZRag=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'goodvibes',\n },\n },\n },\n isCustomEmoji: true,\n index: 21,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Rf90XtDbG8GQ8gTz_prwAg',\n shortcuts: [':thanksdoc:'],\n searchTerms: ['thanksdoc'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/bUnO_VwXW2hDf-Da8D64KKv6nBJDYUBuo13RrOg141g2da8pi9-KClJYlUDuqIwyPBfvOO8=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/bUnO_VwXW2hDf-Da8D64KKv6nBJDYUBuo13RrOg141g2da8pi9-KClJYlUDuqIwyPBfvOO8=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'thanksdoc',\n },\n },\n },\n isCustomEmoji: true,\n index: 22,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/VP90Xv_wG82o8wTCi7CQAw',\n shortcuts: [':videocall:'],\n searchTerms: ['videocall'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/k5v_oxUzRWmTOXP0V6WJver6xdS1lyHMPcMTfxn23Md6rmixoR5RZUusFbZi1uZwjF__pv4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/k5v_oxUzRWmTOXP0V6WJver6xdS1lyHMPcMTfxn23Md6rmixoR5RZUusFbZi1uZwjF__pv4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'videocall',\n },\n },\n },\n isCustomEmoji: true,\n index: 23,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/dv90XtfhAurw8gTgzar4DA',\n shortcuts: [':virtualhug:'],\n searchTerms: ['virtualhug'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/U1TjOZlqtS58NGqQhE8VWDptPSrmJNkrbVRp_8jI4f84QqIGflq2Ibu7YmuOg5MmVYnpevc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/U1TjOZlqtS58NGqQhE8VWDptPSrmJNkrbVRp_8jI4f84QqIGflq2Ibu7YmuOg5MmVYnpevc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'virtualhug',\n },\n },\n },\n isCustomEmoji: true,\n index: 24,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hf90Xv-jHeOR8gSxxrToBA',\n shortcuts: [':yougotthis:'],\n searchTerms: ['yougotthis'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/s3uOe4lUx3iPIt1h901SlMp_sKCTp3oOVj1JV8izBw_vDVLxFqk5dq-3NX-nK_gnUwVEXld3=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/s3uOe4lUx3iPIt1h901SlMp_sKCTp3oOVj1JV8izBw_vDVLxFqk5dq-3NX-nK_gnUwVEXld3=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'yougotthis',\n },\n },\n },\n isCustomEmoji: true,\n index: 25,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/lP90XvOhCZGl8wSO1JmgAw',\n shortcuts: [':sanitizer:'],\n searchTerms: ['sanitizer'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EJ_8vc4Gl-WxCWBurHwwWROAHrPzxgePodoNfkRY1U_I8L1O2zlqf7-wfUtTeyzq2qHNnocZ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EJ_8vc4Gl-WxCWBurHwwWROAHrPzxgePodoNfkRY1U_I8L1O2zlqf7-wfUtTeyzq2qHNnocZ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'sanitizer',\n },\n },\n },\n isCustomEmoji: true,\n index: 26,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/uP90Xq6wNYrK8gTUoo3wAg',\n shortcuts: [':takeout:'],\n searchTerms: ['takeout'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FizHI5IYMoNql9XeP7TV3E0ffOaNKTUSXbjtJe90e1OUODJfZbWU37VqBbTh-vpyFHlFIS0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FizHI5IYMoNql9XeP7TV3E0ffOaNKTUSXbjtJe90e1OUODJfZbWU37VqBbTh-vpyFHlFIS0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'takeout',\n },\n },\n },\n isCustomEmoji: true,\n index: 27,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/fAF1XtDQMIrK8gTUoo3wAg',\n shortcuts: [':hydrate:'],\n searchTerms: ['hydrate'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tpgZgmhX8snKniye36mnrDVfTnlc44EK92EPeZ0m9M2EPizn1vKEGJzNYdp7KQy6iNZlYDc1=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tpgZgmhX8snKniye36mnrDVfTnlc44EK92EPeZ0m9M2EPizn1vKEGJzNYdp7KQy6iNZlYDc1=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hydrate',\n },\n },\n },\n isCustomEmoji: true,\n index: 28,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/vQF1XpyaG_XG8gTs77bACQ',\n shortcuts: [':chillwcat:'],\n searchTerms: ['chillwcat'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/y03dFcPc1B7CO20zgQYzhcRPka5Bhs6iSg57MaxJdhaLidFvvXBLf_i4_SHG7zJ_2VpBMNs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/y03dFcPc1B7CO20zgQYzhcRPka5Bhs6iSg57MaxJdhaLidFvvXBLf_i4_SHG7zJ_2VpBMNs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'chillwcat',\n },\n },\n },\n isCustomEmoji: true,\n index: 29,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ygF1XpGUMMjk8gSDrI2wCw',\n shortcuts: [':chillwdog:'],\n searchTerms: ['chillwdog'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Ir9mDxzUi0mbqyYdJ3N9Lq7bN5Xdt0Q7fEYFngN3GYAcJT_tccH1as1PKmInnpt2cbWOam4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Ir9mDxzUi0mbqyYdJ3N9Lq7bN5Xdt0Q7fEYFngN3GYAcJT_tccH1as1PKmInnpt2cbWOam4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'chillwdog',\n },\n },\n },\n isCustomEmoji: true,\n index: 30,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/8gF1Xp_zK8jk8gSDrI2wCw',\n shortcuts: [':elbowcough:'],\n searchTerms: ['elbowcough'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DTR9bZd1HOqpRJyz9TKiLb0cqe5Hb84Yi_79A6LWlN1tY-5kXqLDXRmtYVKE9rcqzEghmw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DTR9bZd1HOqpRJyz9TKiLb0cqe5Hb84Yi_79A6LWlN1tY-5kXqLDXRmtYVKE9rcqzEghmw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'elbowcough',\n },\n },\n },\n isCustomEmoji: true,\n index: 31,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/EAJ1XrS7PMGQ8gTz_prwAg',\n shortcuts: [':learning:'],\n searchTerms: ['learning'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ZuBuz8GAQ6IEcQc7CoJL8IEBTYbXEvzhBeqy1AiytmhuAT0VHjpXEjd-A5GfR4zDin1L53Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ZuBuz8GAQ6IEcQc7CoJL8IEBTYbXEvzhBeqy1AiytmhuAT0VHjpXEjd-A5GfR4zDin1L53Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'learning',\n },\n },\n },\n isCustomEmoji: true,\n index: 32,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/JAJ1XpGpJYnW8wTupZu4Cw',\n shortcuts: [':washhands:'],\n searchTerms: ['washhands'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qXUeUW0KpKBc9Z3AqUqr_0B7HbW1unAv4qmt7-LJGUK_gsFBIaHISWJNt4n3yvmAnQNZHE-u=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qXUeUW0KpKBc9Z3AqUqr_0B7HbW1unAv4qmt7-LJGUK_gsFBIaHISWJNt4n3yvmAnQNZHE-u=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'washhands',\n },\n },\n },\n isCustomEmoji: true,\n index: 33,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/PAJ1XsOOI4fegwOo57ewAg',\n shortcuts: [':socialdist:'],\n searchTerms: ['socialdist'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/igBNi55-TACUi1xQkqMAor-IEXmt8He56K7pDTG5XoTsbM-rVswNzUfC5iwnfrpunWihrg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/igBNi55-TACUi1xQkqMAor-IEXmt8He56K7pDTG5XoTsbM-rVswNzUfC5iwnfrpunWihrg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'socialdist',\n },\n },\n },\n isCustomEmoji: true,\n index: 34,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/egJ1XufTKYfegwOo57ewAg',\n shortcuts: [':shelterin:'],\n searchTerms: ['shelterin'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/gjC5x98J4BoVSEPfFJaoLtc4tSBGSEdIlfL2FV4iJG9uGNykDP9oJC_QxAuBTJy6dakPxVeC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/gjC5x98J4BoVSEPfFJaoLtc4tSBGSEdIlfL2FV4iJG9uGNykDP9oJC_QxAuBTJy6dakPxVeC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'shelterin',\n },\n },\n },\n isCustomEmoji: true,\n index: 35,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/G8AfY6yWGuKuhL0PlbiA2AE',\n shortcuts: [':hand-pink-waving:'],\n searchTerms: ['hand-pink-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/KOxdr_z3A5h1Gb7kqnxqOCnbZrBmxI2B_tRQ453BhTWUhYAlpg5ZP8IKEBkcvRoY8grY91Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/KOxdr_z3A5h1Gb7kqnxqOCnbZrBmxI2B_tRQ453BhTWUhYAlpg5ZP8IKEBkcvRoY8grY91Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-pink-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 36,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/KsIfY6LzFoLM6AKanYDQAg',\n shortcuts: [':face-blue-smiling:'],\n searchTerms: ['face-blue-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cktIaPxFwnrPwn-alHvnvedHLUJwbHi8HCK3AgbHpphrMAW99qw0bDfxuZagSY5ieE9BBrA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cktIaPxFwnrPwn-alHvnvedHLUJwbHi8HCK3AgbHpphrMAW99qw0bDfxuZagSY5ieE9BBrA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 37,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/W8IfY_bwAfiPq7IPvNCA2AU',\n shortcuts: [':face-red-droopy-eyes:'],\n searchTerms: ['face-red-droopy-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/oih9s26MOYPWC_uL6tgaeOlXSGBv8MMoDrWzBt-80nEiVSL9nClgnuzUAKqkU9_TWygF6CI=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/oih9s26MOYPWC_uL6tgaeOlXSGBv8MMoDrWzBt-80nEiVSL9nClgnuzUAKqkU9_TWygF6CI=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-droopy-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 38,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/b8IfY7zOK9iVkNAP_I2A-AY',\n shortcuts: [':face-purple-crying:'],\n searchTerms: ['face-purple-crying'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/g6_km98AfdHbN43gvEuNdZ2I07MmzVpArLwEvNBwwPqpZYzszqhRzU_DXALl11TchX5_xFE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/g6_km98AfdHbN43gvEuNdZ2I07MmzVpArLwEvNBwwPqpZYzszqhRzU_DXALl11TchX5_xFE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-crying',\n },\n },\n },\n isCustomEmoji: true,\n index: 39,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hcIfY57lBJXp6AKBx4CoCA',\n shortcuts: [':text-green-game-over:'],\n searchTerms: ['text-green-game-over'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cr36FHhSiMAJUSpO9XzjbOgxhtrdJNTVJUlMJeOOfLOFzKleAKT2SEkZwbqihBqfTXYCIg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cr36FHhSiMAJUSpO9XzjbOgxhtrdJNTVJUlMJeOOfLOFzKleAKT2SEkZwbqihBqfTXYCIg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'text-green-game-over',\n },\n },\n },\n isCustomEmoji: true,\n index: 40,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ssIfY7OFG5OykQOpn4CQCw',\n shortcuts: [':person-turqouise-waving:'],\n searchTerms: ['person-turqouise-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/uNSzQ2M106OC1L3VGzrOsGNjopboOv-m1bnZKFGuh0DxcceSpYHhYbuyggcgnYyaF3o-AQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/uNSzQ2M106OC1L3VGzrOsGNjopboOv-m1bnZKFGuh0DxcceSpYHhYbuyggcgnYyaF3o-AQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turqouise-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 41,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/xsIfY4OqCd2T29sP54iAsAw',\n shortcuts: [':face-green-smiling:'],\n searchTerms: ['face-green-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/G061SAfXg2bmG1ZXbJsJzQJpN8qEf_W3f5cb5nwzBYIV58IpPf6H90lElDl85iti3HgoL3o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/G061SAfXg2bmG1ZXbJsJzQJpN8qEf_W3f5cb5nwzBYIV58IpPf6H90lElDl85iti3HgoL3o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-green-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 42,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/2sIfY8vIG8z96ALulYDQDQ',\n shortcuts: [':face-orange-frowning:'],\n searchTerms: ['face-orange-frowning'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Ar8jaEIxzfiyYmB7ejDOHba2kUMdR37MHn_R39mtxqO5CD4aYGvjDFL22DW_Cka6LKzhGDk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Ar8jaEIxzfiyYmB7ejDOHba2kUMdR37MHn_R39mtxqO5CD4aYGvjDFL22DW_Cka6LKzhGDk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-frowning',\n },\n },\n },\n isCustomEmoji: true,\n index: 43,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/7cIfY5niDOmSkNAP08CA6A4',\n shortcuts: [':eyes-purple-crying:'],\n searchTerms: ['eyes-purple-crying'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FrYgdeZPpvXs-6Mp305ZiimWJ0wV5bcVZctaUy80mnIdwe-P8HRGYAm0OyBtVx8EB9_Dxkc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FrYgdeZPpvXs-6Mp305ZiimWJ0wV5bcVZctaUy80mnIdwe-P8HRGYAm0OyBtVx8EB9_Dxkc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'eyes-purple-crying',\n },\n },\n },\n isCustomEmoji: true,\n index: 44,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/A8MfY-_pEIKNr8oP78-AGA',\n shortcuts: [':face-fuchsia-wide-eyes:'],\n searchTerms: ['face-fuchsia-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/zdcOC1SMmyXJOAddl9DYeEFN9YYcn5mHemJCdRFQMtDuS0V-IyE-5YjNUL1tduX1zs17tQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/zdcOC1SMmyXJOAddl9DYeEFN9YYcn5mHemJCdRFQMtDuS0V-IyE-5YjNUL1tduX1zs17tQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 45,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/E8MfY5u7JPSXkNAP95GAmAE',\n shortcuts: [':cat-orange-whistling:'],\n searchTerms: ['cat-orange-whistling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/0ocqEmuhrKCK87_J21lBkvjW70wRGC32-Buwk6TP4352CgcNjL6ug8zcsel6JiPbE58xhq5g=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/0ocqEmuhrKCK87_J21lBkvjW70wRGC32-Buwk6TP4352CgcNjL6ug8zcsel6JiPbE58xhq5g=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'cat-orange-whistling',\n },\n },\n },\n isCustomEmoji: true,\n index: 46,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/LsMfY8P6G-yckNAPjoWA8AI',\n shortcuts: [':face-blue-wide-eyes:'],\n searchTerms: ['face-blue-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2Ht4KImoWDlCddiDQVuzSJwpEb59nZJ576ckfaMh57oqz2pUkkgVTXV8osqUOgFHZdUISJM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2Ht4KImoWDlCddiDQVuzSJwpEb59nZJ576ckfaMh57oqz2pUkkgVTXV8osqUOgFHZdUISJM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 47,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Z8MfY8mzLbnovwK5roC4Bg',\n shortcuts: [':face-orange-raised-eyebrow:'],\n searchTerms: ['face-orange-raised-eyebrow'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/JbCfmOgYI-mO17LPw8e_ycqbBGESL8AVP6i7ZsBOVLd3PEpgrfEuJ9rEGpP_unDcqgWSCg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/JbCfmOgYI-mO17LPw8e_ycqbBGESL8AVP6i7ZsBOVLd3PEpgrfEuJ9rEGpP_unDcqgWSCg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-raised-eyebrow',\n },\n },\n },\n isCustomEmoji: true,\n index: 48,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hcMfY5_zAbbxvwKLooCoCA',\n shortcuts: [':face-fuchsia-tongue-out:'],\n searchTerms: ['face-fuchsia-tongue-out'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EURfJZi_heNulV3mfHzXBk8PIs9XmZ9lOOYi5za6wFMCGrps4i2BJX9j-H2gK6LIhW6h7sY=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EURfJZi_heNulV3mfHzXBk8PIs9XmZ9lOOYi5za6wFMCGrps4i2BJX9j-H2gK6LIhW6h7sY=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-tongue-out',\n },\n },\n },\n isCustomEmoji: true,\n index: 49,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ygF1XpGUMMjk8gSDrI2wCx',\n shortcuts: [':face-orange-biting-nails:'],\n searchTerms: ['face-orange-biting-nails'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/HmsXEgqUogkQOnL5LP_FdPit9Z909RJxby-uYcPxBLNhaPyqPTcGwvGaGPk2hzB_cC0hs_pV=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/HmsXEgqUogkQOnL5LP_FdPit9Z909RJxby-uYcPxBLNhaPyqPTcGwvGaGPk2hzB_cC0hs_pV=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-biting-nails',\n },\n },\n },\n isCustomEmoji: true,\n index: 50,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/m8MfY4jbFsWJhL0PyouA2Ak',\n shortcuts: [':face-red-heart-shape:'],\n searchTerms: ['face-red-heart-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/I0Mem9dU_IZ4a9cQPzR0pUJ8bH-882Eg0sDQjBmPcHA6Oq0uXOZcsjPvPbtormx91Ha2eRA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/I0Mem9dU_IZ4a9cQPzR0pUJ8bH-882Eg0sDQjBmPcHA6Oq0uXOZcsjPvPbtormx91Ha2eRA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-heart-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 51,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/6_cfY8HJH8bV5QS5yYDYDg',\n shortcuts: [':face-fuchsia-poop-shape:'],\n searchTerms: ['face-fuchsia-poop-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_xlyzvSimqMzhdhODyqUBLXIGA6F_d5en2bq-AIfc6fc3M7tw2jucuXRIo5igcW3g9VVe3A=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_xlyzvSimqMzhdhODyqUBLXIGA6F_d5en2bq-AIfc6fc3M7tw2jucuXRIo5igcW3g9VVe3A=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-poop-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 52,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/DfgfY9LaNdmMq7IPuI2AaA',\n shortcuts: [':face-purple-wide-eyes:'],\n searchTerms: ['face-purple-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5RDrtjmzRQKuVYE_FKPUHiGh7TNtX5eSNe6XzcSytMsHirXYKunxpyAsVacTFMg0jmUGhQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5RDrtjmzRQKuVYE_FKPUHiGh7TNtX5eSNe6XzcSytMsHirXYKunxpyAsVacTFMg0jmUGhQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 53,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/HvgfY93GEYmqvwLUuYDwAQ',\n shortcuts: [':glasses-purple-yellow-diamond:'],\n searchTerms: ['glasses-purple-yellow-diamond'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EnDBiuksboKsLkxp_CqMWlTcZtlL77QBkbjz_rLedMSDzrHmy_6k44YWFy2rk4I0LG6K2KI=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EnDBiuksboKsLkxp_CqMWlTcZtlL77QBkbjz_rLedMSDzrHmy_6k44YWFy2rk4I0LG6K2KI=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'glasses-purple-yellow-diamond',\n },\n },\n },\n isCustomEmoji: true,\n index: 54,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/NvgfY9aeC_OFvOMPkrOAsAM',\n shortcuts: [':face-pink-tears:'],\n searchTerms: ['face-pink-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/RL5QHCNcO_Mc98SxFEblXZt9FNoh3bIgsjm0Kj8kmeQJWMeTu7JX_NpICJ6KKwKT0oVHhAA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/RL5QHCNcO_Mc98SxFEblXZt9FNoh3bIgsjm0Kj8kmeQJWMeTu7JX_NpICJ6KKwKT0oVHhAA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-pink-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 55,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/UvgfY_vqE92T29sPvqiAkAU',\n shortcuts: [':body-blue-raised-arms:'],\n searchTerms: ['body-blue-raised-arms'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/2Jds3I9UKOfgjid97b_nlDU4X2t5MgjTof8yseCp7M-6ZhOhRkPGSPfYwmE9HjCibsfA1Uzo=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/2Jds3I9UKOfgjid97b_nlDU4X2t5MgjTof8yseCp7M-6ZhOhRkPGSPfYwmE9HjCibsfA1Uzo=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-blue-raised-arms',\n },\n },\n },\n isCustomEmoji: true,\n index: 56,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/YvgfY-LIBpjChgHKyYCQBg',\n shortcuts: [':hand-orange-covering-eyes:'],\n searchTerms: ['hand-orange-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/y8ppa6GcJoRUdw7GwmjDmTAnSkeIkUptZMVQuFmFaTlF_CVIL7YP7hH7hd0TJbd8p9w67IM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/y8ppa6GcJoRUdw7GwmjDmTAnSkeIkUptZMVQuFmFaTlF_CVIL7YP7hH7hd0TJbd8p9w67IM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-orange-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 57,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/ePgfY-K2Kp6Mr8oP1oqAwAc',\n shortcuts: [':trophy-yellow-smiling:'],\n searchTerms: ['trophy-yellow-smiling'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7tf3A_D48gBg9g2N0Rm6HWs2aqzshHU4CuVubTXVxh1BP7YDBRC6pLBoC-ibvr-zCl_Lgg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7tf3A_D48gBg9g2N0Rm6HWs2aqzshHU4CuVubTXVxh1BP7YDBRC6pLBoC-ibvr-zCl_Lgg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'trophy-yellow-smiling',\n },\n },\n },\n isCustomEmoji: true,\n index: 58,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/jPgfY5j2IIud29sP3ZeA4Ag',\n shortcuts: [':eyes-pink-heart-shape:'],\n searchTerms: ['eyes-pink-heart-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/5vzlCQfQQdzsG7nlQzD8eNjtyLlnATwFwGvrMpC8dgLcosNhWLXu8NN9qIS3HZjJYd872dM=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/5vzlCQfQQdzsG7nlQzD8eNjtyLlnATwFwGvrMpC8dgLcosNhWLXu8NN9qIS3HZjJYd872dM=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'eyes-pink-heart-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 59,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/oPgfY_DoKfSXkNAPq8-AgAo',\n shortcuts: [':face-turquoise-covering-eyes:'],\n searchTerms: ['face-turquoise-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/H2HNPRO8f4SjMmPNh5fl10okSETW7dLTZtuE4jh9D6pSmaUiLfoZJ2oiY-qWU3Owfm1IsXg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/H2HNPRO8f4SjMmPNh5fl10okSETW7dLTZtuE4jh9D6pSmaUiLfoZJ2oiY-qWU3Owfm1IsXg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 60,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/tPgfY7mSO4XovQKzmYCgCw',\n shortcuts: [':hand-green-crystal-ball:'],\n searchTerms: ['hand-green-crystal-ball'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qZfJrWDEmR03FIak7PMNRNpMjNsCnOzD9PqK8mOpAp4Kacn_uXRNJNb99tE_1uyEbvgJReF2=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qZfJrWDEmR03FIak7PMNRNpMjNsCnOzD9PqK8mOpAp4Kacn_uXRNJNb99tE_1uyEbvgJReF2=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-green-crystal-ball',\n },\n },\n },\n isCustomEmoji: true,\n index: 61,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/zPgfY66lCJGRhL0Pz6iA4Aw',\n shortcuts: [':face-turquoise-drinking-coffee:'],\n searchTerms: ['face-turquoise-drinking-coffee'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/myqoI1MgFUXQr5fuWTC9mz0BCfgf3F8GSDp06o1G7w6pTz48lwARjdG8vj0vMxADvbwA1dA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/myqoI1MgFUXQr5fuWTC9mz0BCfgf3F8GSDp06o1G7w6pTz48lwARjdG8vj0vMxADvbwA1dA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-drinking-coffee',\n },\n },\n },\n isCustomEmoji: true,\n index: 62,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/4PgfY73cJprKCq-_gIAO',\n shortcuts: [':body-green-covering-eyes:'],\n searchTerms: ['body-green-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/UR8ydcU3gz360bzDsprB6d1klFSQyVzgn-Fkgu13dIKPj3iS8OtG1bhBUXPdj9pMwtM00ro=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/UR8ydcU3gz360bzDsprB6d1klFSQyVzgn-Fkgu13dIKPj3iS8OtG1bhBUXPdj9pMwtM00ro=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-green-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 63,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/-fgfY9DIGYjbhgHLzoDIDw',\n shortcuts: [':goat-turquoise-white-horns:'],\n searchTerms: ['goat-turquoise-white-horns'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/jMnX4lu5GnjBRgiPtX5FwFmEyKTlWFrr5voz-Auko35oP0t3-zhPxR3PQMYa-7KhDeDtrv4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/jMnX4lu5GnjBRgiPtX5FwFmEyKTlWFrr5voz-Auko35oP0t3-zhPxR3PQMYa-7KhDeDtrv4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'goat-turquoise-white-horns',\n },\n },\n },\n isCustomEmoji: true,\n index: 64,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/EvkfY6uNC5OykQOewoCQAQ',\n shortcuts: [':hand-purple-blue-peace:'],\n searchTerms: ['hand-purple-blue-peace'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-sC8wj6pThd7FNdslEoJlG4nB9SIbrJG3CRGh7-bNV0RVfcrJuwiWHoUZ6UmcVs7sQjxTg4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-sC8wj6pThd7FNdslEoJlG4nB9SIbrJG3CRGh7-bNV0RVfcrJuwiWHoUZ6UmcVs7sQjxTg4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hand-purple-blue-peace',\n },\n },\n },\n isCustomEmoji: true,\n index: 65,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/LfkfY_zhH4GFr8oP4aKA6AI',\n shortcuts: [':face-blue-question-mark:'],\n searchTerms: ['face-blue-question-mark'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Wx4PMqTwG3f4gtR7J9Go1s8uozzByGWLSXHzrh3166ixaYRinkH_F05lslfsRUsKRvHXrDk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Wx4PMqTwG3f4gtR7J9Go1s8uozzByGWLSXHzrh3166ixaYRinkH_F05lslfsRUsKRvHXrDk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-question-mark',\n },\n },\n },\n isCustomEmoji: true,\n index: 66,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/RPkfY8TPGsCakNAP-JWAoAQ',\n shortcuts: [':face-blue-covering-eyes:'],\n searchTerms: ['face-blue-covering-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/kj3IgbbR6u-mifDkBNWVcdOXC-ut-tiFbDpBMGVeW79c2c54n5vI-HNYCOC6XZ9Bzgupc10=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/kj3IgbbR6u-mifDkBNWVcdOXC-ut-tiFbDpBMGVeW79c2c54n5vI-HNYCOC6XZ9Bzgupc10=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-covering-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 67,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Mm5IY53bH7SEq7IP-MWAkAM',\n shortcuts: [':face-purple-smiling-fangs:'],\n searchTerms: ['face-purple-smiling-fangs'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/k1vqi6xoHakGUfa0XuZYWHOv035807ARP-ZLwFmA-_NxENJMxsisb-kUgkSr96fj5baBOZE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/k1vqi6xoHakGUfa0XuZYWHOv035807ARP-ZLwFmA-_NxENJMxsisb-kUgkSr96fj5baBOZE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-smiling-fangs',\n },\n },\n },\n isCustomEmoji: true,\n index: 68,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/UW5IY-ibBqa8jgTymoCIBQ',\n shortcuts: [':face-purple-sweating:'],\n searchTerms: ['face-purple-sweating'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tRnrCQtEKlTM9YLPo0vaxq9mDvlT0mhDld2KI7e_nDRbhta3ULKSoPVHZ1-bNlzQRANmH90=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tRnrCQtEKlTM9YLPo0vaxq9mDvlT0mhDld2KI7e_nDRbhta3ULKSoPVHZ1-bNlzQRANmH90=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-sweating',\n },\n },\n },\n isCustomEmoji: true,\n index: 69,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/Ym5IY7-0LoqA29sPq9CAkAY',\n shortcuts: [':face-purple-smiling-tears:'],\n searchTerms: ['face-purple-smiling-tears'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/MJV1k3J5s0hcUfuo78Y6MKi-apDY5NVDjO9Q7hL8fU4i0cIBgU-cU4rq4sHessJuvuGpDOjJ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/MJV1k3J5s0hcUfuo78Y6MKi-apDY5NVDjO9Q7hL8fU4i0cIBgU-cU4rq4sHessJuvuGpDOjJ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-smiling-tears',\n },\n },\n },\n isCustomEmoji: true,\n index: 70,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/dG5IY-mhEof9jgSykoCgBw',\n shortcuts: [':face-blue-star-eyes:'],\n searchTerms: ['face-blue-star-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/m_ANavMhp6cQ1HzX0HCTgp_er_yO2UA28JPbi-0HElQgnQ4_q5RUhgwueTpH-st8L3MyTA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/m_ANavMhp6cQ1HzX0HCTgp_er_yO2UA28JPbi-0HElQgnQ4_q5RUhgwueTpH-st8L3MyTA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-star-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 71,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hm5IY4W-H9SO5QS6n4CwCA',\n shortcuts: [':face-blue-heart-eyes:'],\n searchTerms: ['face-blue-heart-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/M9tzKd64_r3hvgpTSgca7K3eBlGuyiqdzzhYPp7ullFAHMgeFoNLA0uQ1dGxj3fXgfcHW4w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/M9tzKd64_r3hvgpTSgca7K3eBlGuyiqdzzhYPp7ullFAHMgeFoNLA0uQ1dGxj3fXgfcHW4w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-heart-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 72,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/mW5IY47PMcSnkMkPo6OAyAk',\n shortcuts: [':face-blue-three-eyes:'],\n searchTerms: ['face-blue-three-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/nSQHitVplLe5uZC404dyAwv1f58S3PN-U_799fvFzq-6b3bv-MwENO-Zs1qQI4oEXCbOJg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/nSQHitVplLe5uZC404dyAwv1f58S3PN-U_799fvFzq-6b3bv-MwENO-Zs1qQI4oEXCbOJg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-three-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 73,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/rW5IY_26FryOq7IPlL2A6Ao',\n shortcuts: [':face-blue-droopy-eyes:'],\n searchTerms: ['face-blue-droopy-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/hGPqMUCiXGt6zuX4dHy0HRZtQ-vZmOY8FM7NOHrJTta3UEJksBKjOcoE6ZUAW9sz7gIF_nk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/hGPqMUCiXGt6zuX4dHy0HRZtQ-vZmOY8FM7NOHrJTta3UEJksBKjOcoE6ZUAW9sz7gIF_nk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-droopy-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 74,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/v25IY7KcJIGOr8oPz4OA-As',\n shortcuts: [':planet-orange-purple-ring:'],\n searchTerms: ['planet-orange-purple-ring'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/xkaLigm3P4_1g4X1JOtkymcC7snuJu_C5YwIFAyQlAXK093X0IUjaSTinMTLKeRZ6280jXg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/xkaLigm3P4_1g4X1JOtkymcC7snuJu_C5YwIFAyQlAXK093X0IUjaSTinMTLKeRZ6280jXg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'planet-orange-purple-ring',\n },\n },\n },\n isCustomEmoji: true,\n index: 75,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-yellow-podium-blue',\n shortcuts: [':person-yellow-podium-blue:'],\n searchTerms: ['person-yellow-podium-blue'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/N28nFDm82F8kLPAa-jY_OySFsn3Ezs_2Bl5kdxC8Yxau5abkj_XZHYsS3uYKojs8qy8N-9w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/N28nFDm82F8kLPAa-jY_OySFsn3Ezs_2Bl5kdxC8Yxau5abkj_XZHYsS3uYKojs8qy8N-9w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-yellow-podium-blue',\n },\n },\n },\n isCustomEmoji: true,\n index: 76,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/baseball-white-cap-out',\n shortcuts: [':baseball-white-cap-out:'],\n searchTerms: ['baseball-white-cap-out'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/8DaGaXfaBN0c-ZsZ-1WqPJ6H9TsJOlUUQQEoXvmdROphZE9vdRtN0867Gb2YZcm2x38E9Q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/8DaGaXfaBN0c-ZsZ-1WqPJ6H9TsJOlUUQQEoXvmdROphZE9vdRtN0867Gb2YZcm2x38E9Q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'baseball-white-cap-out',\n },\n },\n },\n isCustomEmoji: true,\n index: 77,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/whistle-red-blow',\n shortcuts: [':whistle-red-blow:'],\n searchTerms: ['whistle-red-blow'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DBu1ZfPJTnX9S1RyKKdBY-X_CEmj7eF6Uzl71j5jVBz5y4k9JcKnoiFtImAbeu4u8M2X8tU=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DBu1ZfPJTnX9S1RyKKdBY-X_CEmj7eF6Uzl71j5jVBz5y4k9JcKnoiFtImAbeu4u8M2X8tU=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'whistle-red-blow',\n },\n },\n },\n isCustomEmoji: true,\n index: 78,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-crowd-surf',\n shortcuts: [':person-turquoise-crowd-surf:'],\n searchTerms: ['person-turquoise-crowd-surf'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Q0wFvHZ5h54xGSTo-JeGst6InRU3yR6NdBRoyowaqGY66LPzdcrV2t-wBN21kBIdb2TeNA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Q0wFvHZ5h54xGSTo-JeGst6InRU3yR6NdBRoyowaqGY66LPzdcrV2t-wBN21kBIdb2TeNA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-crowd-surf',\n },\n },\n },\n isCustomEmoji: true,\n index: 79,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/finger-red-number-one',\n shortcuts: [':finger-red-number-one:'],\n searchTerms: ['finger-red-number-one'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/Hbk0wxBzPTBCDvD_y4qdcHL5_uu7SeOnaT2B7gl9GLB4u8Ecm9OaXCGSMMUBFeNGl5Q3fHJ2=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/Hbk0wxBzPTBCDvD_y4qdcHL5_uu7SeOnaT2B7gl9GLB4u8Ecm9OaXCGSMMUBFeNGl5Q3fHJ2=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'finger-red-number-one',\n },\n },\n },\n isCustomEmoji: true,\n index: 80,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/text-yellow-goal',\n shortcuts: [':text-yellow-goal:'],\n searchTerms: ['text-yellow-goal'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tnHp8rHjXecGbGrWNcs7xss_aVReaYE6H-QWRCXYg_aaYszHXnbP_pVADnibUiimspLvgX0L=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tnHp8rHjXecGbGrWNcs7xss_aVReaYE6H-QWRCXYg_aaYszHXnbP_pVADnibUiimspLvgX0L=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'text-yellow-goal',\n },\n },\n },\n isCustomEmoji: true,\n index: 81,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/medal-yellow-first-red',\n shortcuts: [':medal-yellow-first-red:'],\n searchTerms: ['medal-yellow-first-red'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EEHiiIalCBKuWDPtNOjjvmEZ-KRkf5dlgmhe5rbLn8aZQl-pNz_paq5UjxNhCrI019TWOQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EEHiiIalCBKuWDPtNOjjvmEZ-KRkf5dlgmhe5rbLn8aZQl-pNz_paq5UjxNhCrI019TWOQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'medal-yellow-first-red',\n },\n },\n },\n isCustomEmoji: true,\n index: 82,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-wheelchair-race',\n shortcuts: [':person-blue-wheelchair-race:'],\n searchTerms: ['person-blue-wheelchair-race'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/ZepxPGk5TwzrKAP9LUkzmKmEkbaF5OttNyybwok6mJENw3p0lxDXkD1X2_rAwGcUM0L-D04=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/ZepxPGk5TwzrKAP9LUkzmKmEkbaF5OttNyybwok6mJENw3p0lxDXkD1X2_rAwGcUM0L-D04=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-wheelchair-race',\n },\n },\n },\n isCustomEmoji: true,\n index: 83,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/card-red-penalty',\n shortcuts: [':card-red-penalty:'],\n searchTerms: ['card-red-penalty'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/uRDUMIeAHnNsaIaShtRkQ6hO0vycbNH_BQT7i3PWetFJb09q88RTjxwzToBy9Cez20D7hA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/uRDUMIeAHnNsaIaShtRkQ6hO0vycbNH_BQT7i3PWetFJb09q88RTjxwzToBy9Cez20D7hA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'card-red-penalty',\n },\n },\n },\n isCustomEmoji: true,\n index: 84,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/stopwatch-blue-hand-timer',\n shortcuts: [':stopwatch-blue-hand-timer:'],\n searchTerms: ['stopwatch-blue-hand-timer'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DCvefDAiskRfACgolTlvV1kMfiZVcG50UrmpnRrg3k0udFWG2Uo9zFMaJrJMSJYwcx6fMgk=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DCvefDAiskRfACgolTlvV1kMfiZVcG50UrmpnRrg3k0udFWG2Uo9zFMaJrJMSJYwcx6fMgk=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'stopwatch-blue-hand-timer',\n },\n },\n },\n isCustomEmoji: true,\n index: 85,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-turquoise-speaker-shape',\n shortcuts: [':face-turquoise-speaker-shape:'],\n searchTerms: ['face-turquoise-speaker-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/WTFFqm70DuMxSC6ezQ5Zs45GaWD85Xwrd9Sullxt54vErPUKb_o0NJQ4kna5m7rvjbRMgr3A=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/WTFFqm70DuMxSC6ezQ5Zs45GaWD85Xwrd9Sullxt54vErPUKb_o0NJQ4kna5m7rvjbRMgr3A=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-speaker-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 86,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/octopus-red-waving',\n shortcuts: [':octopus-red-waving:'],\n searchTerms: ['octopus-red-waving'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L9Wo5tLT_lRQX36iZO_fJqLJR4U74J77tJ6Dg-QmPmSC_zhVQ-NodMRc9T0ozwvRXRaT43o=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L9Wo5tLT_lRQX36iZO_fJqLJR4U74J77tJ6Dg-QmPmSC_zhVQ-NodMRc9T0ozwvRXRaT43o=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'octopus-red-waving',\n },\n },\n },\n isCustomEmoji: true,\n index: 87,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/pillow-turquoise-hot-chocolate',\n shortcuts: [':pillow-turquoise-hot-chocolate:'],\n searchTerms: ['pillow-turquoise-hot-chocolate'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/cAR4cehRxbn6dPbxKIb-7ShDdWnMxbaBqy2CXzBW4aRL3IqXs3rxG0UdS7IU71OEU7LSd20q=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/cAR4cehRxbn6dPbxKIb-7ShDdWnMxbaBqy2CXzBW4aRL3IqXs3rxG0UdS7IU71OEU7LSd20q=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'pillow-turquoise-hot-chocolate',\n },\n },\n },\n isCustomEmoji: true,\n index: 88,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hourglass-purple-sand-orange',\n shortcuts: [':hourglass-purple-sand-orange:'],\n searchTerms: ['hourglass-purple-sand-orange'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/MFDLjasPt5cuSM_tK5Fnjaz_k08lKHdX_Mf7JkI6awaHriC3rGL7J_wHxyG6PPhJ8CJ6vsQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/MFDLjasPt5cuSM_tK5Fnjaz_k08lKHdX_Mf7JkI6awaHriC3rGL7J_wHxyG6PPhJ8CJ6vsQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hourglass-purple-sand-orange',\n },\n },\n },\n isCustomEmoji: true,\n index: 89,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/fish-orange-wide-eyes',\n shortcuts: [':fish-orange-wide-eyes:'],\n searchTerms: ['fish-orange-wide-eyes'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/iQLKgKs7qL3091VHgVgpaezc62uPewy50G_DoI0dMtVGmQEX5pflZrUxWfYGmRfzfUOOgJs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/iQLKgKs7qL3091VHgVgpaezc62uPewy50G_DoI0dMtVGmQEX5pflZrUxWfYGmRfzfUOOgJs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'fish-orange-wide-eyes',\n },\n },\n },\n isCustomEmoji: true,\n index: 90,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/popcorn-yellow-striped-smile',\n shortcuts: [':popcorn-yellow-striped-smile:'],\n searchTerms: ['popcorn-yellow-striped-smile'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/TW_GktV5uVYviPDtkCRCKRDrGlUc3sJ5OHO81uqdMaaHrIQ5-sXXwJfDI3FKPyv4xtGpOlg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/TW_GktV5uVYviPDtkCRCKRDrGlUc3sJ5OHO81uqdMaaHrIQ5-sXXwJfDI3FKPyv4xtGpOlg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'popcorn-yellow-striped-smile',\n },\n },\n },\n isCustomEmoji: true,\n index: 91,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/penguin-blue-waving-tear',\n shortcuts: [':penguin-blue-waving-tear:'],\n searchTerms: ['penguin-blue-waving-tear'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/p2u7dcfZau4_bMOMtN7Ma8mjHX_43jOjDwITf4U9adT44I-y-PT7ddwPKkfbW6Wx02BTpNoC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/p2u7dcfZau4_bMOMtN7Ma8mjHX_43jOjDwITf4U9adT44I-y-PT7ddwPKkfbW6Wx02BTpNoC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'penguin-blue-waving-tear',\n },\n },\n },\n isCustomEmoji: true,\n index: 92,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/clock-turquoise-looking-up',\n shortcuts: [':clock-turquoise-looking-up:'],\n searchTerms: ['clock-turquoise-looking-up'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/tDnDkDZykkJTrsWEJPlRF30rmbek2wcDcAIymruOvSLTsUFIZHoAiYTRe9OtO-80lDfFGvo=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/tDnDkDZykkJTrsWEJPlRF30rmbek2wcDcAIymruOvSLTsUFIZHoAiYTRe9OtO-80lDfFGvo=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'clock-turquoise-looking-up',\n },\n },\n },\n isCustomEmoji: true,\n index: 93,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-red-smiling-live',\n shortcuts: [':face-red-smiling-live:'],\n searchTerms: ['face-red-smiling-live'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/14Pb--7rVcqnHvM7UlrYnV9Rm4J-uojX1B1kiXYvv1my-eyu77pIoPR5sH28-eNIFyLaQHs=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/14Pb--7rVcqnHvM7UlrYnV9Rm4J-uojX1B1kiXYvv1my-eyu77pIoPR5sH28-eNIFyLaQHs=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-red-smiling-live',\n },\n },\n },\n isCustomEmoji: true,\n index: 94,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/hands-yellow-heart-red',\n shortcuts: [':hands-yellow-heart-red:'],\n searchTerms: ['hands-yellow-heart-red'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/qWSu2zrgOKLKgt_E-XUP9e30aydT5aF3TnNjvfBL55cTu1clP8Eoh5exN3NDPEVPYmasmoA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/qWSu2zrgOKLKgt_E-XUP9e30aydT5aF3TnNjvfBL55cTu1clP8Eoh5exN3NDPEVPYmasmoA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'hands-yellow-heart-red',\n },\n },\n },\n isCustomEmoji: true,\n index: 95,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/volcano-green-lava-orange',\n shortcuts: [':volcano-green-lava-orange:'],\n searchTerms: ['volcano-green-lava-orange'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/_IWOdMxapt6IBY5Cb6LFVkA3J77dGQ7P2fuvYYv1-ahigpVfBvkubOuGLSCyFJ7jvis-X8I=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/_IWOdMxapt6IBY5Cb6LFVkA3J77dGQ7P2fuvYYv1-ahigpVfBvkubOuGLSCyFJ7jvis-X8I=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'volcano-green-lava-orange',\n },\n },\n },\n isCustomEmoji: true,\n index: 96,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-waving-speech',\n shortcuts: [':person-turquoise-waving-speech:'],\n searchTerms: ['person-turquoise-waving-speech'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/gafhCE49PH_9q-PuigZaDdU6zOKD6grfwEh1MM7fYVs7smAS_yhYCBipq8gEiW73E0apKTzi=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/gafhCE49PH_9q-PuigZaDdU6zOKD6grfwEh1MM7fYVs7smAS_yhYCBipq8gEiW73E0apKTzi=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-waving-speech',\n },\n },\n },\n isCustomEmoji: true,\n index: 97,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-orange-tv-shape',\n shortcuts: [':face-orange-tv-shape:'],\n searchTerms: ['face-orange-tv-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/EVK0ik6dL5mngojX9I9Juw4iFh053emP0wcUjZH0whC_LabPq-DZxN4Jg-tpMcEVfJ0QpcJ4=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/EVK0ik6dL5mngojX9I9Juw4iFh053emP0wcUjZH0whC_LabPq-DZxN4Jg-tpMcEVfJ0QpcJ4=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-orange-tv-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 98,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-blue-spam-shape',\n shortcuts: [':face-blue-spam-shape:'],\n searchTerms: ['face-blue-spam-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/hpwvR5UgJtf0bGkUf8Rn-jTlD6DYZ8FPOFY7rhZZL-JHj_7OPDr7XUOesilRPxlf-aW42Zg=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/hpwvR5UgJtf0bGkUf8Rn-jTlD6DYZ8FPOFY7rhZZL-JHj_7OPDr7XUOesilRPxlf-aW42Zg=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-blue-spam-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 99,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-fuchsia-flower-shape',\n shortcuts: [':face-fuchsia-flower-shape:'],\n searchTerms: ['face-fuchsia-flower-shape'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/o9kq4LQ0fE_x8yxj29ZeLFZiUFpHpL_k2OivHbjZbttzgQytU49Y8-VRhkOP18jgH1dQNSVz=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/o9kq4LQ0fE_x8yxj29ZeLFZiUFpHpL_k2OivHbjZbttzgQytU49Y8-VRhkOP18jgH1dQNSVz=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-fuchsia-flower-shape',\n },\n },\n },\n isCustomEmoji: true,\n index: 100,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-holding-pencil',\n shortcuts: [':person-blue-holding-pencil:'],\n searchTerms: ['person-blue-holding-pencil'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/TKgph5IHIHL-A3fgkrGzmiNXzxJkibB4QWRcf_kcjIofhwcUK_pWGUFC4xPXoimmne3h8eQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/TKgph5IHIHL-A3fgkrGzmiNXzxJkibB4QWRcf_kcjIofhwcUK_pWGUFC4xPXoimmne3h8eQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-holding-pencil',\n },\n },\n },\n isCustomEmoji: true,\n index: 101,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/body-turquoise-yoga-pose',\n shortcuts: [':body-turquoise-yoga-pose:'],\n searchTerms: ['body-turquoise-yoga-pose'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/GW3otW7CmWpuayb7Ddo0ux5c-OvmPZ2K3vaytJi8bHFjcn-ulT8vcHMNcqVqMp1j2lit2Vw=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/GW3otW7CmWpuayb7Ddo0ux5c-OvmPZ2K3vaytJi8bHFjcn-ulT8vcHMNcqVqMp1j2lit2Vw=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'body-turquoise-yoga-pose',\n },\n },\n },\n isCustomEmoji: true,\n index: 102,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/location-yellow-teal-bars',\n shortcuts: [':location-yellow-teal-bars:'],\n searchTerms: ['location-yellow-teal-bars'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/YgeWJsRspSlAp3BIS5HMmwtpWtMi8DqLg9fH7DwUZaf5kG4yABfE1mObAvjCh0xKX_HoIR23=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/YgeWJsRspSlAp3BIS5HMmwtpWtMi8DqLg9fH7DwUZaf5kG4yABfE1mObAvjCh0xKX_HoIR23=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'location-yellow-teal-bars',\n },\n },\n },\n isCustomEmoji: true,\n index: 103,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-writing-headphones',\n shortcuts: [':person-turquoise-writing-headphones:'],\n searchTerms: ['person-turquoise-writing-headphones'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/DC4KrwzNkVxLZa2_KbKyjZTUyB9oIvH5JuEWAshsMv9Ctz4lEUVK0yX5PaMsTK3gGS-r9w=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/DC4KrwzNkVxLZa2_KbKyjZTUyB9oIvH5JuEWAshsMv9Ctz4lEUVK0yX5PaMsTK3gGS-r9w=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-writing-headphones',\n },\n },\n },\n isCustomEmoji: true,\n index: 104,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-turquoise-wizard-wand',\n shortcuts: [':person-turquoise-wizard-wand:'],\n searchTerms: ['person-turquoise-wizard-wand'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/OiZeNvmELg2PQKbT5UCS0xbmsGbqRBSbaRVSsKnRS9gvJPw7AzPp-3ysVffHFbSMqlWKeQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/OiZeNvmELg2PQKbT5UCS0xbmsGbqRBSbaRVSsKnRS9gvJPw7AzPp-3ysVffHFbSMqlWKeQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-turquoise-wizard-wand',\n },\n },\n },\n isCustomEmoji: true,\n index: 105,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-eating-spaghetti',\n shortcuts: [':person-blue-eating-spaghetti:'],\n searchTerms: ['person-blue-eating-spaghetti'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/AXZ8POmCHoxXuBaRxX6-xlT5M-nJZmO1AeUNo0t4o7xxT2Da2oGy347sHpMM8shtUs7Xxh0=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/AXZ8POmCHoxXuBaRxX6-xlT5M-nJZmO1AeUNo0t4o7xxT2Da2oGy347sHpMM8shtUs7Xxh0=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-eating-spaghetti',\n },\n },\n },\n isCustomEmoji: true,\n index: 106,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-turquoise-music-note',\n shortcuts: [':face-turquoise-music-note:'],\n searchTerms: ['face-turquoise-music-note'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/-K6oRITFKVU8V4FedrqXGkV_vTqUufVCQpBpyLK6w3chF4AS1kzT0JVfJxhtlfIAw5jrNco=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/-K6oRITFKVU8V4FedrqXGkV_vTqUufVCQpBpyLK6w3chF4AS1kzT0JVfJxhtlfIAw5jrNco=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-turquoise-music-note',\n },\n },\n },\n isCustomEmoji: true,\n index: 107,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-pink-swaying-hair',\n shortcuts: [':person-pink-swaying-hair:'],\n searchTerms: ['person-pink-swaying-hair'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L8cwo8hEoVhB1k1TopQaeR7oPTn7Ypn5IOae5NACgQT0E9PNYkmuENzVqS7dk2bYRthNAkQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L8cwo8hEoVhB1k1TopQaeR7oPTn7Ypn5IOae5NACgQT0E9PNYkmuENzVqS7dk2bYRthNAkQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-pink-swaying-hair',\n },\n },\n },\n isCustomEmoji: true,\n index: 108,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-blue-speaking-microphone',\n shortcuts: [':person-blue-speaking-microphone:'],\n searchTerms: ['person-blue-speaking-microphone'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/FMaw3drKKGyc6dk3DvtHbkJ1Ki2uD0FLqSIiFDyuChc1lWcA9leahX3mCFMBIWviN2o8eyc=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/FMaw3drKKGyc6dk3DvtHbkJ1Ki2uD0FLqSIiFDyuChc1lWcA9leahX3mCFMBIWviN2o8eyc=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-blue-speaking-microphone',\n },\n },\n },\n isCustomEmoji: true,\n index: 109,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/rocket-red-countdown-liftoff',\n shortcuts: [':rocket-red-countdown-liftoff:'],\n searchTerms: ['rocket-red-countdown-liftoff'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/lQZFYAeWe5-SJ_fz6dCAFYz1MjBnEek8DvioGxhlj395UFTSSHqYAmfhJN2i0rz3fDD5DQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/lQZFYAeWe5-SJ_fz6dCAFYz1MjBnEek8DvioGxhlj395UFTSSHqYAmfhJN2i0rz3fDD5DQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'rocket-red-countdown-liftoff',\n },\n },\n },\n isCustomEmoji: true,\n index: 110,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-purple-rain-drops',\n shortcuts: [':face-purple-rain-drops:'],\n searchTerms: ['face-purple-rain-drops'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/woHW5Jl2RD0qxijnl_4vx4ZhP0Zp65D4Ve1DM_HrwJW-Kh6bQZoRjesGnEwjde8F4LynrQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/woHW5Jl2RD0qxijnl_4vx4ZhP0Zp65D4Ve1DM_HrwJW-Kh6bQZoRjesGnEwjde8F4LynrQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-rain-drops',\n },\n },\n },\n isCustomEmoji: true,\n index: 111,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-pink-drinking-tea',\n shortcuts: [':face-pink-drinking-tea:'],\n searchTerms: ['face-pink-drinking-tea'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/WRLIgKpnClgYOZyAwnqP-Edrdxu6_N19qa8gsB9P_6snZJYIMu5YBJX8dlM81YG6H307KA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/WRLIgKpnClgYOZyAwnqP-Edrdxu6_N19qa8gsB9P_6snZJYIMu5YBJX8dlM81YG6H307KA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-pink-drinking-tea',\n },\n },\n },\n isCustomEmoji: true,\n index: 112,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/person-purple-stage-event',\n shortcuts: [':person-purple-stage-event:'],\n searchTerms: ['person-purple-stage-event'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/YeVVscOyRcDJAhKo2bMwMz_B6127_7lojqafTZECTR9NSEunYO5zEi7R7RqxBD7LYLxfNnXe=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/YeVVscOyRcDJAhKo2bMwMz_B6127_7lojqafTZECTR9NSEunYO5zEi7R7RqxBD7LYLxfNnXe=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'person-purple-stage-event',\n },\n },\n },\n isCustomEmoji: true,\n index: 113,\n },\n {\n emojiId: 'UCkszU2WH9gy1mb0dV-11UJg/face-purple-open-box',\n shortcuts: [':face-purple-open-box:'],\n searchTerms: ['face-purple-open-box'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7lJM2sLrozPtNLagPTcN0xlcStWpAuZEmO2f4Ej5kYgSp3woGdq3tWFrTH30S3mD2PyjlQ=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7lJM2sLrozPtNLagPTcN0xlcStWpAuZEmO2f4Ej5kYgSp3woGdq3tWFrTH30S3mD2PyjlQ=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'face-purple-open-box',\n },\n },\n },\n isCustomEmoji: true,\n index: 114,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/COLRg9qOwdQCFce-qgodrbsLaA',\n shortcuts: [':awesome:'],\n searchTerms: ['awesome'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/xqqFxk7nC5nYnjy0oiSPpeWX4yu4I-ysb3QJMOuVml8dHWz82FvF8bhGVjlosZRIG_XxHA=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/xqqFxk7nC5nYnjy0oiSPpeWX4yu4I-ysb3QJMOuVml8dHWz82FvF8bhGVjlosZRIG_XxHA=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'awesome',\n },\n },\n },\n isCustomEmoji: true,\n index: 115,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CMKC7uKOwdQCFce-qgodqbsLaA',\n shortcuts: [':gar:'],\n searchTerms: ['gar'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/pxQTF9D-uxlSIgoopRcS8zAZnBBEPp2R9bwo5qIc3kc7PF2k18so72-ohINWPa6OvWudEcsC=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/pxQTF9D-uxlSIgoopRcS8zAZnBBEPp2R9bwo5qIc3kc7PF2k18so72-ohINWPa6OvWudEcsC=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'gar',\n },\n },\n },\n isCustomEmoji: true,\n index: 116,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CJiQ8uiOwdQCFcx9qgodysAOHg',\n shortcuts: [':jakepeter:'],\n searchTerms: ['jakepeter'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/iq0g14tKRcLwmfdpHULRMeUGfpWUlUyJWr0adf1K1-dStgPOguOe8eo5bKrxmCqIOlu-J18=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/iq0g14tKRcLwmfdpHULRMeUGfpWUlUyJWr0adf1K1-dStgPOguOe8eo5bKrxmCqIOlu-J18=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'jakepeter',\n },\n },\n },\n isCustomEmoji: true,\n index: 117,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CI3h3uDJitgCFdARTgodejsFWg',\n shortcuts: [':wormRedBlue:'],\n searchTerms: ['wormRedBlue'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/QrjYSGexvrRfCVpWrgctyB3shVRAgKmXtctM1vUnA78taji1zYNWwrHs1GKBpdpG5A6yK_k=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/QrjYSGexvrRfCVpWrgctyB3shVRAgKmXtctM1vUnA78taji1zYNWwrHs1GKBpdpG5A6yK_k=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormRedBlue',\n },\n },\n },\n isCustomEmoji: true,\n index: 118,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CI69oYTKitgCFdaPTgodsHsP5g',\n shortcuts: [':wormOrangeGreen:'],\n searchTerms: ['wormOrangeGreen'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/S-L8lYTuP13Ds9TJZ2UlxdjDiwNRFPnj0o4x6DAecyJLXDdQ941upYRhxalbjzpJn5USU_k=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/S-L8lYTuP13Ds9TJZ2UlxdjDiwNRFPnj0o4x6DAecyJLXDdQ941upYRhxalbjzpJn5USU_k=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormOrangeGreen',\n },\n },\n },\n isCustomEmoji: true,\n index: 119,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CKzQr47KitgCFdCITgodq6EJZg',\n shortcuts: [':wormYellowRed:'],\n searchTerms: ['wormYellowRed'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/L9TQqjca5x7TE8ZB-ifFyU51xWXArz47rJFU7Pg2KgWMut5th9qsU-pCu1zIF98szO5wNXE=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/L9TQqjca5x7TE8ZB-ifFyU51xWXArz47rJFU7Pg2KgWMut5th9qsU-pCu1zIF98szO5wNXE=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'wormYellowRed',\n },\n },\n },\n isCustomEmoji: true,\n index: 120,\n },\n {\n emojiId: 'UCzC5CNksIBaiT-NdMJjJNOQ/CPGD8Iu8kN4CFREChAod9OkLmg',\n shortcuts: [':ytg:'],\n searchTerms: ['ytg'],\n image: {\n thumbnails: [\n {\n url: 'https://yt3.ggpht.com/7PgbidnZLTC-38qeoqYensfXg7s7EC1Dudv9q9l8aIjqLgnfvpfhnEBH_7toCmVmqhIe4I45=w24-h24-c-k-nd',\n width: 24,\n height: 24,\n },\n {\n url: 'https://yt3.ggpht.com/7PgbidnZLTC-38qeoqYensfXg7s7EC1Dudv9q9l8aIjqLgnfvpfhnEBH_7toCmVmqhIe4I45=w48-h48-c-k-nd',\n width: 48,\n height: 48,\n },\n ],\n accessibility: {\n accessibilityData: {\n label: 'ytg',\n },\n },\n },\n isCustomEmoji: true,\n index: 121,\n },\n];\n","import * as Collection from './collection/index.js';\n\nexport namespace Data {\n export const avatars = Collection.avatars;\n export const badges = Collection.globalBadges;\n\n export const css_color_names = Collection.css_color_names;\n export const items = Collection.items;\n export const names = Collection.names;\n export const tiers = Collection.tiers;\n export const tts = Collection.tts;\n\n export const messages = Collection.messages;\n export const normal_messages = Collection.normal_messages;\n export const twitch_messages = Collection.twitch_messages;\n export const youtube_messages = Collection.youtube_messages;\n\n export const emotes = Collection.emotes;\n export const ffz_emotes = Collection.FfzEmotes;\n export const bttv_emotes = Collection.BttvEmotes;\n export const seventv_emotes = Collection.SeventvEmotes;\n export const twitch_emotes = Collection.TwitchEmotes;\n export const youtube_emotes = Collection.YoutubeEmotes;\n}\n","import { Data } from '../../data/index.js';\n\nexport class RandomHelper {\n /**\n * Generate random color\n * @param type - Color format\n * @returns - Random color in specified format\n * @example\n * ```javascript\n * const hexColor = random.color('hex');\n * console.log(hexColor); // e.g. #3e92cc\n *\n * const rgbColor = random.color('rgb');\n * console.log(rgbColor); // e.g. rgb(62, 146, 204)\n * ```\n */\n color(type: 'hex' | 'hexa' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name' = 'hex') {\n switch (type) {\n default:\n case 'hex': {\n return `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n }\n case 'hexa': {\n const hex = `#${Math.floor(Math.random() * 0xffffff)\n .toString(16)\n .padStart(6, '0')}`;\n\n const alpha = Math.floor(Math.random() * 256)\n .toString(16)\n .padStart(2, '0');\n\n return hex + alpha;\n }\n case 'rgb': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n\n return `rgb(${r}, ${g}, ${b})`;\n }\n case 'rgba': {\n const r = Math.floor(Math.random() * 256);\n const g = Math.floor(Math.random() * 256);\n const b = Math.floor(Math.random() * 256);\n const a = Math.random().toFixed(2);\n\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n case 'hsl': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n\n return `hsl(${h}, ${s}%, ${l}%)`;\n }\n case 'hsla': {\n const h = Math.floor(Math.random() * 361);\n const s = Math.floor(Math.random() * 101);\n const l = Math.floor(Math.random() * 101);\n const a = Math.random().toFixed(2);\n\n return `hsla(${h}, ${s}%, ${l}%, ${a})`;\n }\n case 'css-color-name': {\n var names = Data.css_color_names;\n\n return this.array(names)[0];\n }\n }\n }\n\n /**\n * Generate random number\n * @param min - Minimum value\n * @param max - Maximum value\n * @param float - Number of decimal places (0 for integer)\n * @returns - Random number\n * @example\n * ```javascript\n * const intNumber = random.number(1, 10);\n * console.log(intNumber); // e.g. 7\n *\n * const floatNumber = random.number(1, 10, 2);\n * console.log(floatNumber); // e.g. 3.14\n * ```\n */\n number(min: number, max: number, float: number = 0): number {\n if (min > max) [min, max] = [max, min];\n\n const rand = Math.random() * (max - min) + min;\n return float ? Number(rand.toFixed(float)) : Math.round(rand);\n }\n\n /**\n * Generate random boolean\n * @param threshold - Threshold between 0 and 1\n * @returns - Random boolean\n * @example\n * ```javascript\n * const boolValue = random.boolean(0.7);\n * console.log(boolValue); // e.g. true (70% chance)\n * ```\n */\n boolean(threshold: number = 0.5): boolean {\n return Math.random() > threshold;\n }\n\n /**\n * Generate random string\n * @param length - Length of the string\n * @param chars - Characters to use\n * @returns - Random string\n * @example\n * ```javascript\n * const randString = random.string(10); // e.g. \"aZ3bT9qP1x\"\n * const randHex = random.string(8, 'hex'); // e.g. \"4f3c2a1b\"\n * const randNumStr = random.string(6, 'numbers'); // e.g. \"839201\"\n * const randLetterStr = random.string(6, 'letters'); // e.g. \"aZbTqP\"\n * const randHexUpper = random.string(6, 'hex-upper'); // e.g. \"4F3C2A1B\"\n * const randHexLower = random.string(6, 'hex-lower'); // e.g. \"4f3c2a1b\"\n * ```\n */\n string(\n length: number,\n chars:\n | 'numeric'\n | 'numbers'\n | 'letters'\n | 'hex'\n | 'hex-upper'\n | 'hex-lower'\n | string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',\n ): string {\n if (chars === 'numbers' || chars === 'numeric') chars = '0123456789';\n else if (chars === 'letters' || chars === 'letter')\n chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n else if (chars === 'hex' || chars === 'hexadecimal') chars = '0123456789abcdef';\n else if (chars === 'hex-upper' || chars === 'hexadecimal-upper') chars = '0123456789ABCDEF';\n else if (chars === 'hex-lower' || chars === 'hexadecimal-lower') chars = '0123456789abcdef';\n\n let result = '';\n\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n\n return result;\n }\n\n /**\n * Pick random element from array\n * @param arr - Array to pick from\n * @returns - Random element and its index\n * @example\n * ```javascript\n * const [element, index] = random.array(['apple', 'banana', 'cherry']);\n * console.log(element, index); // e.g. \"banana\", 1\n * ```\n */\n array<T>(arr: T[]): [value: T, index: number] {\n const index = this.number(0, arr.length - 1);\n\n return [arr[index], index];\n }\n\n /**\n * Generate random date\n * @param start - Start date\n * @param end - End date\n * @returns - Random date between start and end\n * @example\n * ```javascript\n * const randDate = random.date(new Date(2020, 0, 1), new Date());\n * console.log(randDate); // e.g. 2022-05-15T10:30:00.000Z\n * ```\n */\n date(start: Date = new Date(2000, 0, 1), end: Date = new Date()): Date {\n const date = new Date(this.number(start.getTime(), end.getTime()));\n\n return date;\n }\n\n /**\n * Generate ISO date string offset by days\n * @param daysAgo - Number of days to go back\n * @returns - ISO date string\n * @example\n * ```javascript\n * const isoDate = random.daysOffset(7);\n * console.log(isoDate); // e.g. \"2024-06-10T14:23:45.678Z\"\n *\n * const isoDate30 = random.daysOffset(30);\n * console.log(isoDate30); // e.g. \"2024-05-18T09:15:30.123Z\"\n * ```\n */\n daysOffset(daysAgo: number): string {\n const now = Date.now();\n const past = now - this.number(0, daysAgo * 24 * 60 * 60 * 1000);\n\n return new Date(past).toISOString();\n }\n\n /**\n * Generate UUID v4\n * @returns - UUID string\n * @example\n * ```javascript\n * const uuid = random.uuid();\n * console.log(uuid); // e.g. \"3b12f1df-5232-4e3a-9a0c-3f9f1b1b1b1b\"\n * ```\n */\n uuid(): string {\n return crypto.randomUUID();\n }\n}\n","import { Data } from '../../data/index.js';\nimport { Emote, Provider, Twitch } from '../../types.js';\nimport { NumberHelper } from './number.js';\nimport { RandomHelper } from './random.js';\n\nexport type BadgeOptions =\n | Twitch.tags[]\n | Twitch.tags\n | `${Twitch.tags}/${string}`\n | `${Twitch.tags}/${string}`[];\n\nexport type TwitchResult = {\n keys: Twitch.tags[];\n badges: Twitch.badge[];\n versions: { [K in Twitch.tags]?: string | number };\n amount: { [K in Twitch.tags]?: string | number };\n};\n\nexport type YouTubeResult = {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n};\n\nexport class MessageHelper {\n /**\n * Finds emotes in a given text.\n * @param text - The text to search for emotes.\n * @param emotes - An array of emotes to search for. Defaults to Local data emotes.\n * @returns An array of emotes found in the text with their positions.\n */\n findEmotesInText(text: string, emotes: Emote[] = Data.emotes): Emote[] {\n const result: Emote[] = [];\n\n emotes\n .filter((emote) => emote.type !== 'emoji')\n .forEach((emote) => {\n const name = emote.name;\n\n let searchIndex = 0;\n let start = 0;\n\n while (searchIndex < text.length) {\n const index = text.indexOf(name, start);\n\n if (index === -1) break;\n\n const before = index > 0 ? text[index - 1] : ' ';\n const after = index + name.length < text.length ? text[index + name.length] : ' ';\n\n if (/\\s/.test(before) && /\\s/.test(after)) {\n result.push({ ...emote, start: index, end: index + name.length });\n }\n\n start = index + 1;\n }\n });\n\n return result;\n }\n\n /**\n * Replaces emotes in the text with corresponding HTML image tags.\n * @param text - The text containing emotes.\n * @param emotes - An array of emotes with their positions in the text.\n * @returns The text with emotes replaced by HTML image tags.\n */\n replaceEmotesWithHTML(text: string, emotes: Emote[]): string {\n if (!emotes.length) return text;\n\n let result = '';\n let index = 0;\n\n emotes\n .filter((emote) => emote.type !== 'emoji')\n .sort((a, b) => a.start - b.start)\n .forEach((emote) => {\n if (emote.start < index) return;\n\n result += text.substring(index, emote.start);\n\n const emotesArray = Array.from({ ...emote.urls, length: 5 })\n .slice(1)\n .reverse()\n .filter(Boolean);\n\n const imgUrl = emotesArray[0] || emote.urls['1'];\n\n result += `<img src=\"${imgUrl}\" alt=\"${emote.name}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`;\n\n const expectedExclusiveEnd = emote.start + emote.name.length;\n const normalizedEnd = emote.end === expectedExclusiveEnd - 1 ? emote.end + 1 : emote.end;\n index = normalizedEnd;\n });\n\n result += text.substring(index);\n\n return result;\n }\n\n /**\n * Checks if the text contains only emotes and whitespace.\n * @param text - The text to check.\n * @param emotes - An array of emotes with their positions in the text.\n * @returns True if the text contains only emotes and whitespace, false otherwise.\n */\n hasOnlyEmotes(text: string, emotes: Emote[]): boolean {\n const textWithoutEmotes = emotes.reduce((acc, emote) => {\n return acc\n .replace(new RegExp(`\\\\b${emote.name}\\\\b`, 'g'), '')\n .replace(/<img[^>]*class=\"emote\"[^>]*>/gi, '');\n }, text);\n\n return textWithoutEmotes.trim().length === 0;\n }\n\n /**\n * Replaces YouTube emotes in the text with corresponding HTML image tags.\n * @param text - The text containing YouTube emotes.\n * @param emotes - An array of YouTube emotes. Defaults to Local data YouTube emotes.\n * @returns The text with YouTube emotes replaced by HTML image tags.\n */\n replaceYoutubeEmotesWithHTML(text: string, emotes = Data.youtube_emotes): string {\n const emoteCodesInside = Array.from(text.matchAll(/:(.*?):/gim), (x) => x[0]);\n\n emoteCodesInside.forEach((code) => {\n const emote = emotes.find(\n (e) => e.shortcuts.includes(code) || e.searchTerms.includes(code.slice(1, -1)),\n );\n\n if (emote) {\n const url = emote.image.thumbnails.at(-1)?.url;\n const alt = emote.image.accessibility.accessibilityData.label;\n\n if (url) {\n text = text.replace(\n code,\n `<img src=\"${url}\" alt=\"${alt}\" class=\"emote\" style=\"width: auto; height: 1em; vertical-align: middle;\" />`,\n );\n }\n }\n });\n\n return text;\n }\n\n /**\n * Maps global badge versions to a structured format.\n * @param globalBadges - An array of Twitch global badges. Defaults to Local data badges.\n * @returns An array of objects containing badge IDs and their corresponding versions.\n * @example\n * ```javascript\n * const badgeVersions = mapGlobalBadgeVersions();\n * console.log(badgeVersions);\n * // Output:\n * [\n * {\n * id: 'subscriber',\n * versions: [\n * { type: 'subscriber', version: '1', url: 'https://...', description: 'Subscriber' },\n * { type: 'subscriber', version: '2', url: 'https://...', description: '2-Month Subscriber' },\n * // ... more versions\n * ],\n * },\n * {\n * id: 'bits',\n * versions: [\n * { type: 'bits', version: '100', url: 'https://...', description: 'cheer 100' },\n * { type: 'bits', version: '1000', url: 'https://...', description: 'cheer 1000' },\n * // ... more versions\n * ],\n * },\n * // ... more badges\n * ]\n * ```\n */\n mapGlobalBadgeVersions(globalBadges: Twitch.GlobalBadge[] = Data.badges): Array<{\n id: Twitch.tags;\n versions: Twitch.badge[];\n }> {\n return globalBadges.map((badge) => ({\n id: badge.set_id,\n versions: badge.versions.map((version) => ({\n type: badge.set_id,\n version: version.id,\n url: version.image_url_4x,\n description: version.title,\n })),\n }));\n }\n\n /**\n * Maps a badge type and variation to the corresponding badge version amount.\n * @param type - The badge type (e.g., 'subscriber', 'bits', etc.).\n * @param variation - The badge variation, which can be a number or a string (e.g., 'horde', 'alliance', etc.).\n * @returns The badge version amount as a string. Returns '0' if no matching badge version is found.\n * @example\n * ```javascript\n * // For subscriber badge with 3 months\n * mapGlobalBadgeVersionAmount('subscriber', 3); // Returns '3'\n * // For bits badge with 5000 bits\n * mapGlobalBadgeVersionAmount('bits', 5000); // Returns the corresponding badge version based on the mapping\n * // For warcraft badge with 'horde' variation\n * mapGlobalBadgeVersionAmount('warcraft', 'horde'); // Returns 'horde'\n * ```\n */\n mapGlobalBadgeVersionAmount(type: Twitch.tags, variation: string | number): string {\n const IdToId = (key: Twitch.tags) =>\n Data.badges\n .find((b) => b.set_id === key)!\n .versions.map((v) => [v.id, parseInt(v.id)] as [string, number]);\n\n let result = '0';\n\n switch (type) {\n case 'subscriber': {\n if (isNaN(parseInt(variation as string))) return result;\n\n const map = Object.entries({\n '0': 0,\n '1': 1,\n '2': 2,\n '3': 3,\n '4': 6,\n '5': 9,\n '6': 12,\n });\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n\n break;\n }\n case 'bits':\n case 'sub-gifter':\n case 'bits-leader':\n case 'clips-leader':\n case 'sub-gift-leader': {\n if (isNaN(parseInt(variation as string))) return result;\n\n const map = IdToId(type);\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n\n break;\n }\n case 'warcraft': {\n const map = {\n horde: 'horde',\n alliance: 'alliance',\n };\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n\n break;\n }\n case 'twitchbot': {\n const map = {\n 1: 'auto mod',\n 2: 'automated moderation system',\n };\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n break;\n }\n case 'moments': {\n if (isNaN(parseInt(variation as string))) {\n const map = Object.fromEntries(\n Array.from({ length: 20 }, (_, i) => i + 1).map((num) => [num, `tier ${num}`]),\n );\n\n result =\n Object.entries(map).find(\n ([_, label]) => label.toLowerCase() === String(variation).toLowerCase(),\n )?.[0] || '0';\n } else {\n const map = IdToId('moments');\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n case 'power-rangers': {\n if (isNaN(parseInt(variation as string))) {\n const map = {\n 0: ['black ranger', 'black', 'blackranger'],\n 1: ['blue ranger', 'blue', 'blueranger'],\n 2: ['green ranger', 'green', 'greenranger'],\n 3: ['pink ranger', 'pink', 'pinkranger'],\n 4: ['red ranger', 'red', 'redranger'],\n 5: ['white ranger', 'white', 'whiteranger'],\n 6: ['yellow ranger', 'yellow', 'yellowranger'],\n };\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n } else {\n const map = IdToId('power-rangers');\n\n for (const [key, minAmount] of map) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n case 'predictions': {\n const map = Object.fromEntries(\n IdToId('predictions').map(([key, _]) => [\n key,\n [key, key.replace('-', ' '), key.replace('-', '')],\n ]),\n );\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n\n break;\n }\n case 'social-sharing': {\n if (isNaN(parseInt(variation as string))) {\n const map = Object.fromEntries(\n IdToId('social-sharing').map(([key, _]) => [\n key,\n [key + ' views', key.replace('-', '') + ' views'],\n ]),\n );\n\n result =\n Object.entries(map).find(([_, labels]) =>\n labels.some((label) => label.toLowerCase() === String(variation).toLowerCase()),\n )?.[0] || '0';\n } else {\n const map = {\n 1: 100,\n 2: 10000,\n 3: 100000,\n };\n\n for (const [key, minAmount] of Object.entries(map)) {\n if (parseInt(variation as string) >= minAmount) result = key;\n }\n }\n\n break;\n }\n }\n\n return result;\n }\n\n badgePriority: Twitch.tags[] = [\n 'broadcaster',\n 'lead_moderator',\n 'moderator',\n 'vip',\n 'artist-badge',\n 'subscriber',\n 'sub-gift-leader',\n 'founder',\n 'sub-gifter',\n 'bits-leader',\n 'bits',\n 'admin',\n 'global_mod',\n 'staff',\n 'partner',\n 'ambassador',\n 'predictions',\n 'twitchbot',\n 'extension',\n 'game-developer',\n 'hype-train',\n 'bot-badge',\n 'turbo',\n 'premium',\n 'no_video',\n 'no_audio',\n ];\n\n /**\n * Generates badge data based on the provided badges and platform.\n * @param badges - The badges to generate. Can be an array or a comma-separated string.\n * @param provider - The platform provider ('twitch' or 'youtube'). Defaults to 'twitch'.\n * @returns A promise that resolves to the generated badge data.\n * @example\n * ```javascript\n * // Generate Twitch badges\n * const twitchBadges = await generateBadges(['broadcaster', 'moderator'], 'twitch');\n * // Generate YouTube badges\n * const youtubeBadges = await generateBadges('sponsor, moderator', 'youtube');\n * ```\n */\n async generateBadges<T extends Provider>(\n badges: BadgeOptions = [],\n provider: T,\n ): Promise<T extends 'twitch' ? TwitchResult : YouTubeResult> {\n const globalBadges = this.mapGlobalBadgeVersions();\n\n if (!Array.isArray(badges) && typeof badges === 'string') {\n badges = badges.split(',').map((e) => e.trim()) as Twitch.tags[];\n }\n\n var clearedBadges = badges.map((badge) => badge.split('/')[0] as Twitch.tags);\n\n if (!clearedBadges || !clearedBadges.length) {\n const number = new NumberHelper();\n const random = new RandomHelper();\n var max = number.random(1, 3);\n\n for await (const _ of Array.from({ length: max }, () => '')) {\n // var current = random.array(Object.keys(Data.badges))[0] as Twitch.roles;\n const item = random.array(globalBadges)[0];\n\n if (!clearedBadges.includes(item.id) && Array.isArray(clearedBadges)) {\n clearedBadges.push(item.id);\n } else {\n clearedBadges = [item.id];\n }\n }\n }\n\n clearedBadges = clearedBadges.sort((a, b) => {\n const aIndex = this.badgePriority.indexOf(a);\n const bIndex = this.badgePriority.indexOf(b);\n\n return (\n (aIndex === -1 ? Number.MAX_SAFE_INTEGER : aIndex) -\n (bIndex === -1 ? Number.MAX_SAFE_INTEGER : bIndex)\n );\n });\n\n var result;\n\n switch (provider) {\n case 'twitch': {\n const keys = Array.from(clearedBadges).filter((e) =>\n globalBadges.some((badge) => badge.id === e),\n ) as Twitch.tags[];\n\n const versions = badges.reduce(\n (acc, data) => {\n var [badge, variation = '1'] = data.split('/') as [Twitch.tags, string];\n\n let value: string | number = variation;\n\n if (!isNaN(parseInt(value))) value = parseInt(value);\n else if (!value) value = 0;\n\n acc[badge] = this.mapGlobalBadgeVersionAmount(badge, value);\n\n return acc;\n },\n {} as { [K in Twitch.tags]?: string | number },\n );\n\n result = {\n keys,\n versions,\n amount: badges.reduce(\n (acc, data) => {\n var [badge, variation = '1'] = data.split('/') as [Twitch.tags, string];\n\n let value: string | number = variation;\n\n if (!isNaN(parseInt(value))) value = parseInt(value);\n else if (!value) value = 0;\n\n acc[badge] = value;\n\n return acc;\n },\n {} as { [K in Twitch.tags]?: string | number },\n ),\n badges: Array.from(clearedBadges)\n .slice(0, 3)\n .map((badge) => {\n const data = globalBadges.find((b) => b.id === badge);\n\n if (data?.versions && data.versions.length) {\n const quantity = versions[badge];\n\n const version = data.versions.find((v) => v.version === String(quantity));\n\n if (version) return version;\n\n return data.versions[0];\n }\n\n return;\n })\n .filter(Boolean) as Twitch.badge[],\n };\n\n break;\n }\n\n case 'youtube': {\n var details = {\n verified: { isVerified: true },\n partner: { isVerified: true },\n broadcaster: { isChatOwner: true },\n host: { isChatOwner: true },\n sponsor: { isChatSponsor: true },\n subscriber: { isChatSponsor: true },\n moderator: { isChatModerator: true },\n };\n\n result = Object.values(clearedBadges).reduce(\n (acc, key) => {\n if (key in details) {\n Object.assign(acc, details[key as keyof typeof details]);\n }\n\n return acc;\n },\n {\n isVerified: false,\n isChatOwner: false,\n isChatSponsor: false,\n isChatModerator: false,\n } as {\n isVerified: boolean;\n isChatOwner: boolean;\n isChatSponsor: boolean;\n isChatModerator: boolean;\n },\n );\n\n break;\n }\n }\n\n return result as T extends 'twitch' ? TwitchResult : YouTubeResult;\n }\n}\n","import { ClientEvents, Provider, StreamElements } from '../../types.js';\n\nexport class EventHelper {\n /**\n * Parses the provider information from the event detail object.\n * @param detail - The event detail object received from the StreamElements event.\n * @returns An object containing the provider and the original event data.\n */\n parseProvider(\n detail: StreamElements.Event.onEventReceived,\n overrideProvider?: Provider,\n ): ClientEvents {\n var provider: Provider =\n // @ts-ignore\n detail?.provider ||\n // @ts-ignore\n detail.event?.provider ||\n // @ts-ignore\n detail.event?.service ||\n // @ts-ignore\n detail.event?.data?.provider ||\n // @ts-ignore\n overrideProvider ||\n // @ts-ignore\n window?.client?.details?.provider ||\n 'twitch';\n\n const actAsStreamElements = [\n 'kvstore:update',\n 'bot:counter',\n 'alertService:toggleSound',\n 'tip-latest',\n 'event:test',\n 'event:skip',\n ] as StreamElements.Event.onEventReceived['listener'][];\n\n if (actAsStreamElements.some((l) => l === detail.listener)) provider = 'streamelements';\n\n const received = { provider: provider, data: detail } as ClientEvents;\n\n return received;\n }\n}\n","import { css_color_names } from '../data/collection/css.js';\n\n/**\n * Parse a color string to RGBA components\n * @param str - color string\n * @param format - format of the input color string\n * @returns - RGBA components or null if parsing fails\n */\nexport function parseToRGBA(\n str: string,\n format: string | false,\n): { r: number; g: number; b: number; a: number } | null {\n if (!format) return null;\n\n switch (format) {\n case 'hex': {\n const hex = str.replace('#', '');\n let r = 0,\n g = 0,\n b = 0,\n a = 1;\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n } else if (hex.length === 4) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n a = parseInt(hex[3] + hex[3], 16) / 255;\n } else if (hex.length === 8) {\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n a = parseInt(hex.slice(6, 8), 16) / 255;\n }\n\n return { r, g, b, a };\n }\n\n case 'rgb':\n case 'rgba': {\n const match = str.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)/);\n if (!match) return null;\n\n return {\n r: parseInt(match[1]),\n g: parseInt(match[2]),\n b: parseInt(match[3]),\n a: match[4] ? parseFloat(match[4]) : 1,\n };\n }\n\n case 'hsl':\n case 'hsla': {\n const match = str.match(/hsla?\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%(?:\\s*,\\s*([\\d.]+))?\\s*\\)/);\n if (!match) return null;\n\n const h = parseInt(match[1]);\n const s = parseInt(match[2]);\n const l = parseInt(match[3]);\n const a = match[4] ? parseFloat(match[4]) : 1;\n\n const rgb = hslToRgb(h, s, l);\n return { ...rgb, a };\n }\n\n case 'css-color-name': {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n ctx.fillStyle = str;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b] = ctx.getImageData(0, 0, 1, 1).data;\n\n return { r, g, b, a: 1 };\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Convert RGBA to Hex\n * @param rgba - RGBA components\n * @param includeAlpha - Whether to include alpha in the hex string\n * @returns Hex color string\n */\nexport function rgbaToHex(\n rgba: { r: number; g: number; b: number; a: number },\n includeAlpha: boolean = true,\n): string {\n const toHex = (n: number) => Math.round(n).toString(16).padStart(2, '0');\n\n let hex = `#${toHex(rgba.r)}${toHex(rgba.g)}${toHex(rgba.b)}`;\n\n if (includeAlpha && rgba.a < 1) {\n hex += toHex(rgba.a * 255);\n }\n\n return hex;\n}\n\n/**\n * Convert RGB to HSL\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns HSL components\n */\nexport function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } {\n r /= 255;\n g /= 255;\n b /= 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (delta !== 0) {\n s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n\n switch (max) {\n case r:\n h = ((g - b) / delta + (g < b ? 6 : 0)) / 6;\n break;\n case g:\n h = ((b - r) / delta + 2) / 6;\n break;\n case b:\n h = ((r - g) / delta + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\n/**\n * Convert HSL to RGB\n * @param h - Hue (0-360)\n * @param s - Saturation (0-100)\n * @param l - Lightness (0-100)\n * @returns RGB components\n */\nexport function hslToRgb(h: number, s: number, l: number): { r: number; g: number; b: number } {\n h /= 360;\n s /= 100;\n l /= 100;\n\n let r: number, g: number, b: number;\n\n if (s === 0) {\n r = g = b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return {\n r: Math.round(r * 255),\n g: Math.round(g * 255),\n b: Math.round(b * 255),\n };\n}\n\n/**\n * Find the closest CSS color name to the given RGB values\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns Closest CSS color name\n */\nexport async function findClosestColorName(r: number, g: number, b: number): Promise<string> {\n const cssColors = css_color_names;\n\n let closestColor = cssColors[0];\n let minDistance = Infinity;\n\n for await (const colorName of cssColors) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n\n const ctx = canvas.getContext('2d');\n\n if (!ctx) continue;\n\n ctx.fillStyle = colorName;\n ctx.fillRect(0, 0, 1, 1);\n\n const [cr, cg, cb] = ctx.getImageData(0, 0, 1, 1).data;\n\n const distance = Math.sqrt(Math.pow(r - cr, 2) + Math.pow(g - cg, 2) + Math.pow(b - cb, 2));\n\n if (distance < minDistance) {\n minDistance = distance;\n closestColor = colorName;\n }\n\n if (distance === 0) break;\n }\n\n return closestColor;\n}\n","import { Data } from '../../data/index.js';\nimport { findClosestColorName, parseToRGBA, rgbaToHex, rgbToHsl } from '../../utils/color.js';\n\nexport class ColorHelper {\n /**\n * Generate opacity hex value\n * @param opacity - Opacity value from 0 to 100\n * @param color - Hex color code\n * @returns - Hex color code with opacity\n */\n opacity(opacity: number = 100, color: string = '') {\n color = color.length > 7 ? color?.substring(0, 6) : color;\n opacity = opacity > 1 ? opacity / 100 : opacity;\n\n let result = Math.round(Math.min(Math.max(opacity, 0), 1) * 255)\n .toString(16)\n .toLowerCase()\n .padStart(2, '0');\n\n return color + result;\n }\n\n /**\n * Extract color and opacity from hex code\n * @param hex - Hex color code\n * @returns - Object with color and opacity\n */\n extract(hex: string) {\n if (!hex.startsWith('#') || hex.length <= 7) {\n return {\n color: hex,\n opacity: 100,\n };\n }\n\n var color = hex.slice(-2);\n var decimal = parseInt(color, 16) / 255;\n var percentage = Math.round(decimal * 100);\n var color = hex.length > 7 ? hex.slice(0, 7) : hex;\n\n return {\n color: color,\n opacity: percentage,\n };\n }\n\n /**\n * Validate color string format\n * @param str - Color string to validate\n * @returns Detected color format or false if invalid\n * @example\n * ```javascript\n * const format1 = color.validate(\"#FF5733\"); // \"hex\"\n * const format2 = color.validate(\"rgb(255, 87, 51)\"); // \"rgb\"\n * const format3 = color.validate(\"hsl(14, 100%, 60%)\"); // \"hsl\"\n * const format4 = color.validate(\"orangered\"); // \"css-color-name\"\n * const format5 = color.validate(\"invalid-color\"); // false\n * ```\n */\n validate(str: string) {\n if (typeof str !== 'string' || !String(str).trim().length) return false;\n\n const s = str.trim();\n\n // HEX (#FFF, #FFFFFF, #FFFFFFFF)\n if (/^#([A-Fa-f0-9]{3}){1,2}$/.test(s) || /^#([A-Fa-f0-9]{4}|[A-Fa-f0-9]{8})$/.test(s)) {\n return 'hex';\n }\n\n // rgb(255, 255, 255)\n if (/^rgb\\(\\s*(?:\\d{1,3}\\s*,\\s*){2}\\d{1,3}\\s*\\)$/.test(s)) {\n return 'rgb';\n }\n\n // rgba(255, 255, 255, 0.5)\n if (/^rgba\\(\\s*(?:\\d{1,3}\\s*,\\s*){3}(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'rgba';\n }\n\n // hsl(360, 100%, 100%)\n if (/^hsl\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*\\)$/.test(s)) {\n return 'hsl';\n }\n\n // hsla(360, 100%, 100%, 0.5)\n if (/^hsla\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}%\\s*,\\s*\\d{1,3}%\\s*,\\s*(?:0|1|0?\\.\\d+)\\s*\\)$/.test(s)) {\n return 'hsla';\n }\n\n if (Data.css_color_names.includes(s.toLowerCase())) {\n return 'css-color-name';\n }\n\n return false;\n }\n\n /**\n * Convert color to different format\n * @param str - Color string to convert (e.g. \"#FF5733\", \"rgb(255, 87, 51)\")\n * @param format - Target format\n * @returns - Converted color string\n * @example\n * ```javascript\n * const hexColor = color.convert(\"rgb(255, 87, 51)\", \"hex\"); // \"#FF5733\"\n * const rgbColor = color.convert(\"#FF5733\", \"rgb\"); // \"rgb(255, 87, 51)\"\n * const hslColor = color.convert(\"#FF5733\", \"hsl\"); // \"hsl(14, 100%, 60%)\"\n * const colorName = color.convert(\"#FF5733\", \"css-color-name\"); // \"orangered\"\n * ```\n */\n async convert(\n str: string,\n format: 'hex' | 'rgb' | 'rgba' | 'hsl' | 'hsla' | 'css-color-name',\n ): Promise<string | null> {\n const valid = this.validate(str);\n\n if (!valid) throw new Error(`Invalid color format: ${str}`);\n\n if (valid === format) throw new Error(`Color is already in the desired format: ${format}`);\n\n const rgba = parseToRGBA(str.trim(), valid);\n\n if (!rgba) throw new Error(`Failed to parse color: ${str}`);\n\n switch (format) {\n case 'hex': {\n return rgbaToHex(rgba, false);\n }\n case 'rgb': {\n return `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`;\n }\n case 'rgba': {\n return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;\n }\n case 'hsl': {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n case 'hsla': {\n const hsl = rgbToHsl(rgba.r, rgba.g, rgba.b);\n return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${rgba.a})`;\n }\n case 'css-color-name': {\n return await findClosestColorName(rgba.r, rgba.g, rgba.b);\n }\n default: {\n return null;\n }\n }\n }\n}\n","import { ColorHelper } from './color.js';\nimport { ElementHelper } from './element.js';\nimport { ObjectHelper } from './object.js';\n\nexport type Modifier = (\n value: string,\n param: string | null | undefined,\n values: { amount?: number; count?: number },\n) => string;\n\nexport class StringHelper {\n /**\n * Replaces occurrences in a string based on a pattern with the result of an asynchronous callback function.\n * @param string - The input string to perform replacements on.\n * @param pattern - The pattern to match in the string (can be a string or a regular expression).\n * @param callback - An asynchronous callback function that takes the matched substring and any captured groups as arguments and returns the replacement string.\n * @returns A promise that resolves to the modified string with replacements applied.\n * @example\n * ```javascript\n * const result = await string.replace(\"Hello World\", /World/, async (match) => {\n * return await fetchSomeData(match); // Assume this function fetches data asynchronously\n * });\n * console.log(result); // Output will depend on the fetched data\n * ```\n */\n async replace(\n string: string,\n pattern: string,\n callback: (match: string, ...groups: string[]) => Promise<string> | string,\n ): Promise<string> {\n const promises: Array<Promise<string>> = [];\n\n string.replace(pattern, (match: string, ...groups: string[]) => {\n const promise = typeof callback === 'function' ? callback(match, ...groups) : match;\n\n promises.push(Promise.resolve(promise));\n\n return match;\n });\n\n const replacements = await Promise.all(promises);\n\n return string.replace(pattern, () => replacements.shift() ?? '');\n }\n\n /**\n * Capitalizes the first letter of a given string.\n * @param string - The input string to be capitalized.\n * @returns The capitalized string.\n * @example\n * ```javascript\n * const result = string.capitalize(\"hello world\");\n * console.log(result); // Output: \"Hello world\"\n * ```\n */\n capitalize(string: string): Capitalize<string> {\n return (string.charAt(0).toUpperCase() + string.slice(1)) as Capitalize<string>;\n }\n\n PRESETS: Record<string, string> = {};\n\n /**\n * Composes a template string by replacing placeholders with corresponding values and applying optional modifiers.\n * @param template - The template string containing placeholders in the format {key} and optional modifiers in the format [MODIFIER:param=value].\n * @param values - An object containing key-value pairs to replace the placeholders in the template.\n * @param options - Optional settings for the composition process.\n * @returns The composed string with placeholders replaced and modifiers applied.\n * @example\n * ```javascript\n * const { string } = Tixyel.Helper;\n *\n * // Basic usage with placeholders and simple modifiers\n * const template1 = \"Hello, {username}! You have {amount} [UPC=messages] and your name is [CAP=name].\";\n * const values1 = { username: \"john_doe\", amount: 5, name: \"john\" };\n * const result1 = string.compose(template1, values1);\n * // \"Hello, john_doe! You have 5 MESSAGES and your name is John.\"\n *\n * // Multiple modifiers in a single block (HTML enabled)\n * const template2 = \"[COLOR:#ff0056,BOLD={username}]\";\n * const values2 = { username: \"john_doe\" };\n * const result2 = string.compose(template2, values2, { html: true });\n * // '<span class=\"color bold\" style=\"color: #ff0056; font-weight: bold;\">john_doe</span>'\n *\n * // Conditional rendering with IF (supports ===, >=, &&, ||, !, etc.)\n * const template3 = \"[IF=vip && status === 'live'?VIP Online|Offline]\";\n * const values3 = { status: 'live', vip: true };\n * const result3 = string.compose(template3, values3);\n * // \"VIP Online\"\n *\n * // Pluralization using amount / count or an explicit key\n * const template4 = \"You have {amount} [PLURAL=message|messages].\";\n * const values4 = { amount: 1 };\n * const values5 = { amount: 3 };\n * const result4a = string.compose(template4, values4); // \"You have 1 message.\"\n * const result4b = string.compose(template4, values5); // \"You have 3 messages.\"\n *\n * // Number formatting\n * const template5 = \"Total: [NUMBER:2=amount] {currency}\";\n * const values6 = { amount: 1234.5, currency: '$' };\n * const result5 = string.compose(template5, values6);\n * // e.g. \"Total: 1,234.50 $\" (locale dependent)\n *\n * // Date and time formatting\n * const template6 = \"Created at: [DATE:iso=createdAt] ([DATE:relative=createdAt])\";\n * const values7 = { createdAt: new Date('2020-01-02T03:04:05.000Z') };\n * const result6 = string.compose(template6, values7);\n * // e.g. \"Created at: 2020-01-02T03:04:05.000Z (Xs ago)\"\n *\n * // MAP / SWITCH style mapping\n * const template7 = \"Status: [MAP:status=live:Online|offline:Offline|default:Unknown]\";\n * const values8 = { status: 'offline' };\n * const result7 = string.compose(template7, values8);\n * // \"Status: Offline\"\n *\n * // Escaping HTML\n * const template8 = \"[ESCAPE={message}]\";\n * const values9 = { message: '<b>Danger & \"HTML\"</b>' };\n * const result8 = string.compose(template8, values9);\n * // \"&lt;b&gt;Danger &amp; &quot;HTML&quot;&lt;/b&gt;\"\n *\n * // Using global presets\n * Helper.string.PRESETS['alert'] = 'BOLD,COLOR:#ff0056';\n * const template10 = \"[PRESET:alert={username}]\";\n * const values11 = { username: 'john_doe' };\n * const result10 = string.compose(template10, values11, { html: true });\n * // '<span class=\"color bold\" style=\"color: #ff0056; font-weight: bold;\">john_doe</span>'\n * ```\n */\n compose(\n template: string,\n values: Record<string, any> = {},\n options: {\n method?: 'loop' | 'index';\n html?: boolean;\n debug?: boolean;\n modifiers?: Record<string, Modifier>;\n aliases?: Record<string, string[]>;\n } = {\n method: 'index',\n html: false,\n debug: false,\n modifiers: {},\n aliases: {},\n },\n ): string {\n const { mergeSpanStyles } = new ElementHelper();\n\n const span = (style: string, value: string, className?: string) => {\n if (options.html) {\n return mergeSpanStyles(style, value, className);\n } else {\n return value;\n }\n };\n\n const baseValues = {\n skip: '<br/>',\n newline: '<br/>',\n ...values,\n };\n\n let defaultCurrency = '$';\n let defaultCurrencyCode = 'USD';\n\n if (typeof window !== 'undefined') {\n try {\n const client: any = (window as any)?.client;\n const currency = client?.details?.currency;\n\n if (currency?.symbol) defaultCurrency = String(currency.symbol);\n if (currency?.code) defaultCurrencyCode = String(currency.code);\n } catch {\n // ignore – fall back to defaults\n }\n }\n\n const object = new ObjectHelper();\n\n const flatten: Record<string, string> = Object.entries(object.flatten(baseValues)).reduce(\n (acc, [k, v]) => {\n acc[k] = String(v);\n\n if (['username', 'name', 'nick', 'nickname', 'sender'].some((e) => k === e)) {\n const username = acc?.username || acc?.name || acc?.nick || acc?.nickname || acc?.sender;\n\n acc['username'] = acc.username || username;\n acc['usernameAt'] = `@${acc.username}`;\n acc['name'] = acc.name || username;\n acc['nick'] = acc.nick || username;\n acc['nickname'] = acc.nickname || username;\n acc['sender'] = acc.sender || username;\n acc['senderAt'] = `@${acc.sender}`;\n }\n\n if (['amount', 'count'].some((e) => k === e)) {\n acc['amount'] = String(acc?.amount || acc.count || v);\n acc['count'] = String(acc?.count || acc?.amount || v);\n }\n\n acc['currency'] = acc.currency || defaultCurrency;\n acc['currencyCode'] = acc.currencyCode || defaultCurrencyCode;\n\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const REGEX = {\n PLACEHOLDERS: /{([^}]+)}/g,\n MODIFIERS: /\\[([^\\]=]+)=([^\\]]+)\\]/g,\n };\n\n var amount = parseFloat(flatten?.amount ?? flatten?.count ?? 0);\n\n function getNumericFromKeyOrValue(\n keyOrValue: string,\n valuesMap: Record<string, string>,\n ): number | null {\n const trimmed = keyOrValue?.trim?.() ?? '';\n if (!trimmed.length) return null;\n\n const fromValues = (valuesMap as any)[trimmed];\n const candidate = fromValues !== undefined ? fromValues : trimmed;\n const num = parseFloat(String(candidate).replace(/\\s/g, ''));\n\n return isNaN(num) ? null : num;\n }\n\n function formatNumber(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const decimals = !isNaN(Number(param)) ? Math.max(0, parseInt(String(param))) : 0;\n\n const num = getNumericFromKeyOrValue(value, valuesMap);\n if (num === null) return value;\n\n try {\n return num.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n } catch {\n return num.toFixed(decimals);\n }\n }\n\n function formatRelativeTime(date: Date, now: Date = new Date()): string {\n const diffMs = now.getTime() - date.getTime();\n const past = diffMs >= 0;\n const abs = Math.abs(diffMs);\n\n const sec = Math.floor(abs / 1000);\n const min = Math.floor(sec / 60);\n const hour = Math.floor(min / 60);\n const day = Math.floor(hour / 24);\n const month = Math.floor(day / 30);\n const year = Math.floor(day / 365);\n\n const suffix = past ? 'ago' : 'from now';\n\n if (year > 0) return `${year}y ${suffix}`;\n if (month > 0) return `${month}mo ${suffix}`;\n if (day > 0) return `${day}d ${suffix}`;\n if (hour > 0) return `${hour}h ${suffix}`;\n if (min > 0) return `${min}m ${suffix}`;\n return `${Math.max(sec, 0)}s ${suffix}`;\n }\n\n function formatDateLike(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const keyOrLiteral = value?.trim?.() ?? '';\n if (!keyOrLiteral.length) return value;\n\n const raw = (valuesMap as any)[keyOrLiteral] ?? keyOrLiteral;\n const date = new Date(raw);\n\n if (isNaN(date.getTime())) return value;\n\n const mode = (param ?? 'date').toString().toLowerCase();\n\n try {\n switch (mode) {\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n case 'full':\n return date.toLocaleString();\n case 'relative':\n case 'ago':\n return formatRelativeTime(date);\n case 'iso':\n return date.toISOString();\n case 'date':\n default:\n return date.toLocaleDateString();\n }\n } catch {\n return value;\n }\n }\n\n function pluralize(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const text = value ?? '';\n const [singular, plural = singular] = text.split('|', 2);\n\n const key = param?.trim();\n let source: any = undefined;\n\n if (key && (valuesMap as any)[key] !== undefined) {\n source = (valuesMap as any)[key];\n } else {\n source = (valuesMap as any).amount ?? (valuesMap as any).count;\n }\n\n const num = parseFloat(String(source));\n if (isNaN(num)) return singular;\n\n const isPlural = Math.abs(num) !== 1;\n return isPlural ? plural : singular;\n }\n\n function mapSwitch(\n value: string,\n param: string | null | undefined,\n valuesMap: Record<string, string>,\n ): string {\n const key = param?.trim() ?? '';\n const targetRaw = key && (valuesMap as any)[key] !== undefined ? (valuesMap as any)[key] : '';\n const target = String(targetRaw);\n\n const entries = (value ?? '')\n .split('|')\n .map((p) => p.trim())\n .filter((p) => p.length);\n let defaultResult: string | undefined;\n\n for (const entry of entries) {\n const idx = entry.indexOf(':');\n if (idx === -1) continue;\n\n const mapKey = entry.slice(0, idx).trim();\n const mapValue = entry.slice(idx + 1);\n\n if (!mapKey.length) continue;\n\n if (mapKey.toLowerCase() === 'default') {\n defaultResult = mapValue;\n continue;\n }\n\n if (target === mapKey) return mapValue;\n }\n\n return defaultResult ?? '';\n }\n\n function escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n }\n\n function parseLiteralOrValue(token: string, valuesMap: Record<string, string>): any {\n let trimmed = token.trim();\n\n if (!trimmed.length) return undefined;\n\n const firstChar = trimmed[0];\n const lastChar = trimmed[trimmed.length - 1];\n\n if ((firstChar === '\"' && lastChar === '\"') || (firstChar === \"'\" && lastChar === \"'\")) {\n return trimmed.slice(1, -1);\n }\n\n const lowered = trimmed.toLowerCase();\n if (lowered === 'true') return true;\n if (lowered === 'false') return false;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) return parseFloat(trimmed);\n\n const fromValues = valuesMap?.[trimmed];\n if (fromValues === undefined) return trimmed;\n\n const fromValuesStr = String(fromValues).trim();\n const fromValuesLower = fromValuesStr.toLowerCase();\n\n if (fromValuesLower === 'true') return true;\n if (fromValuesLower === 'false') return false;\n\n if (/^-?\\d+(\\.\\d+)?$/.test(fromValuesStr)) return parseFloat(fromValuesStr);\n\n return fromValues;\n }\n\n function coerceToBoolean(value: any): boolean {\n if (typeof value === 'boolean') return value;\n if (value === null || value === undefined) return false;\n\n const str = String(value).trim().toLowerCase();\n if (!str.length) return false;\n\n if (['false', '0', 'no', 'off', 'null', 'undefined', 'nan'].includes(str)) return false;\n\n return true;\n }\n\n function evaluateAtomicCondition(\n expression: string,\n valuesMap: Record<string, string>,\n ): boolean {\n let expr = expression.trim();\n if (!expr.length) return false;\n\n let invert = false;\n while (expr.startsWith('!')) {\n invert = !invert;\n expr = expr.slice(1).trim();\n }\n\n const operators = ['===', '!==', '==', '!=', '>=', '<=', '>', '<'];\n let op: string | null = null;\n let left = expr;\n let right = '';\n\n for (const candidate of operators) {\n const idx = expr.indexOf(candidate);\n if (idx !== -1) {\n op = candidate;\n left = expr.slice(0, idx);\n right = expr.slice(idx + candidate.length);\n break;\n }\n }\n\n let result: boolean;\n\n if (!op) {\n const value = parseLiteralOrValue(left, valuesMap);\n result = coerceToBoolean(value);\n } else {\n const leftVal = parseLiteralOrValue(left, valuesMap);\n const rightVal = parseLiteralOrValue(right, valuesMap);\n\n switch (op) {\n case '===':\n result = leftVal === rightVal;\n break;\n case '!==':\n result = leftVal !== rightVal;\n break;\n case '==':\n // eslint-disable-next-line eqeqeq\n result = (leftVal as any) == (rightVal as any);\n break;\n case '!=':\n // eslint-disable-next-line eqeqeq\n result = (leftVal as any) != (rightVal as any);\n break;\n case '>=':\n result = (leftVal as any) >= (rightVal as any);\n break;\n case '<=':\n result = (leftVal as any) <= (rightVal as any);\n break;\n case '>':\n result = (leftVal as any) > (rightVal as any);\n break;\n case '<':\n result = (leftVal as any) < (rightVal as any);\n break;\n default:\n result = false;\n break;\n }\n }\n\n return invert ? !result : result;\n }\n\n function evaluateConditionExpression(\n expression: string,\n valuesMap: Record<string, string>,\n ): boolean {\n let expr = expression.trim();\n if (!expr.length) return false;\n\n let invert = false;\n while (expr.startsWith('!')) {\n invert = !invert;\n expr = expr.slice(1).trim();\n }\n\n const orParts = expr\n .split('||')\n .map((p) => p.trim())\n .filter((p) => p.length);\n if (!orParts.length) return invert ? true : false;\n\n let result = false;\n\n for (const orPart of orParts) {\n const andParts = orPart\n .split('&&')\n .map((p) => p.trim())\n .filter((p) => p.length);\n if (!andParts.length) continue;\n\n let andResult = true;\n for (const andPart of andParts) {\n const partResult = evaluateAtomicCondition(andPart, valuesMap);\n andResult = andResult && partResult;\n if (!andResult) break;\n }\n\n result = result || andResult;\n if (result) break;\n }\n\n return invert ? !result : result;\n }\n\n const color = new ColorHelper();\n\n const HTML_MODIFIERS: Record<string, Modifier> = {\n COLOR: (value, param) =>\n span(param && !!color.validate(param) ? `color: ${param}` : '', value, 'color'),\n WEIGHT: (value, param) =>\n span(param && !isNaN(parseInt(param)) ? `font-weight: ${param}` : '', value, 'weight'),\n SEMIBOLD: (value) => span('font-weight: 600', value, 'semibold'),\n BOLD: (value) => span('font-weight: bold', value, 'bold'),\n BLACK: (value) => span('font-weight: 900', value, 'black'),\n LIGHT: (value) => span('font-weight: lighter', value, 'light'),\n STRONG: (value) => span('font-weight: bolder', value, 'strong'),\n ITALIC: (value) => span('font-style: italic', value, 'italic'),\n UNDERLINE: (value) => span('text-decoration: underline', value, 'underline'),\n STRIKETHROUGH: (value) => span('text-decoration: line-through', value, 'strikethrough'),\n SUB: (value) => span('vertical-align: sub', value, 'sub'),\n SUP: (value) => span('vertical-align: super', value, 'sup'),\n LARGER: (value) => span('font-size: larger', value, 'larger'),\n SMALL: (value) => span('font-size: smaller', value, 'small'),\n SHADOW: (value, param) => span(`text-shadow: ${param}`, value, 'shadow'),\n SIZE: (value, param) => span(param ? `font-size: ${param}` : '', value, 'size'),\n };\n\n const STRING_MODIFIERS: Record<string, Modifier> = {\n BT1: (value) => (amount > 1 ? value : ''),\n BT0: (value) => (amount > 0 ? value : ''),\n ST1: (value) => (amount < 1 ? value : ''),\n ST0: (value) => (amount < 0 ? value : ''),\n UPC: (value) => value.toUpperCase(),\n LOW: (value) => value.toLowerCase(),\n REV: (value) => value.split('').reverse().join(''),\n CAP: (value) => value.charAt(0).toUpperCase() + value.slice(1).toLowerCase(),\n NUMBER: (value, param, valuesMap) =>\n formatNumber(value, param, valuesMap as Record<string, string>),\n PLURAL: (value, param, valuesMap) =>\n pluralize(value, param, valuesMap as Record<string, string>),\n DATE: (value, param, valuesMap) =>\n formatDateLike(value, param, valuesMap as Record<string, string>),\n MAP: (value, param, valuesMap) =>\n mapSwitch(value, param, valuesMap as Record<string, string>),\n ESCAPE: (value) => escapeHtml(value),\n IF: (value, _param, valuesMap) => {\n const text = value ?? '';\n\n const [rawCondition, rest] = text.split('?', 2);\n if (!rest) return text;\n\n const [whenTrue, whenFalse = ''] = rest.split('|', 2);\n\n const condition = evaluateConditionExpression(\n rawCondition,\n valuesMap as Record<string, string>,\n );\n\n return condition ? whenTrue : whenFalse;\n },\n PRESET: (value, param) => {\n const name = param?.trim() ?? '';\n if (!name.length) return value;\n\n const group = this.PRESETS[name];\n if (!group || !group.length) return value;\n\n const modifiers = group\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length)\n .map((part) => {\n const [mName, mParam] = part.split(':');\n return { name: mName.trim(), param: mParam?.trim() ?? null };\n });\n\n let result = value;\n for (const { name: mName, param: mParam } of modifiers) {\n result = applyModifier(result, mName, mParam);\n }\n\n return result;\n },\n FALLBACK: (value, param) => (value.length ? value : (param ?? value)),\n };\n\n const MODIFIERS: Record<string, Modifier> = {\n ...STRING_MODIFIERS,\n ...(options?.html ? HTML_MODIFIERS : {}),\n ...(options.modifiers ?? {}),\n };\n\n const ALIASES = {\n UPC: ['UPPERCASE', 'UPPER', 'UPP'],\n LOW: ['LOWERCASE', 'LOWER', 'LWC'],\n REV: ['REVERSE', 'RVS'],\n CAP: ['CAPITALIZE', 'CAPITAL'],\n NUMBER: ['NUMBER', 'NUM', 'FORMAT_NUMBER', 'FMT_NUM'],\n PLURAL: ['PLURAL', 'PL', 'PLR'],\n DATE: ['DATE', 'DATETIME', 'TIME', 'DT'],\n MAP: ['MAP', 'SWITCH'],\n ESCAPE: ['ESCAPE', 'ESC', 'ESC_HTML', 'ESCAPE_HTML'],\n PRESET: ['PRESET', 'STYLE', 'THEME'],\n BT1: ['BIGGER_THAN_1', 'GREATER_THAN_1', 'GT1'],\n BT0: ['BIGGER_THAN_0', 'GREATER_THAN_0', 'GT0'],\n ST1: ['SMALLER_THAN_1', 'LESS_THAN_1', 'LT1'],\n ST0: ['SMALLER_THAN_0', 'LESS_THAN_0', 'LT0'],\n COLOR: ['COLOUR', 'CLR', 'HIGHLIGHT'],\n BOLD: ['BOLDEN', 'B'],\n STRONG: ['STRONGEN', 'STRONG'],\n ITALIC: ['ITALICIZE', 'ITALIC', 'I'],\n UNDERLINE: ['U', 'INS', 'INSET', 'I'],\n STRIKETHROUGH: ['STRIKE', 'S', 'DELETE', 'D'],\n SUB: ['SUBSCRIPT', 'SUBS'],\n SUP: ['SUPERSCRIPT', 'SUPS'],\n LARGER: ['LARGER', 'LG'],\n SMALL: ['SMALLER', 'SM'],\n SHADOW: ['SHADOW', 'SHD'],\n FALLBACK: ['FALLBACK', 'FB'],\n IF: ['IF', 'COND', 'CONDITION'],\n ...(options.aliases ?? {}),\n };\n\n function applyModifier(value: string, name: string, param: string | null | undefined): string {\n const canonical = Object.entries(ALIASES).find(([key, aliases]) => {\n if (aliases.some((alias) => alias.toUpperCase() === name.toUpperCase())) return true;\n else if (key.toUpperCase() === name.toUpperCase()) return true;\n else return false;\n });\n const use = canonical ? canonical[0] : name.toUpperCase();\n\n try {\n if (MODIFIERS[use])\n return MODIFIERS[use](value, typeof param === 'string' ? param.trim() : null, flatten);\n else if (options?.html) return span('', value, use.toLowerCase());\n else return value;\n } catch (error) {\n if (\n options?.debug &&\n typeof console !== 'undefined' &&\n typeof console.error === 'function'\n ) {\n console.error('[Helper.string.compose] Modifier error', { name, param, error });\n }\n return value;\n }\n }\n\n function replaceAll(string: string): string {\n let str = string;\n let match;\n\n while ((match = REGEX.MODIFIERS.exec(str)) !== null) {\n const [fullMatch, modifierGroup, value] = match;\n\n const modifiers = modifierGroup\n .split(',')\n .map((part) => part.trim())\n .filter((part) => part.length)\n .map((part) => {\n const [name, param] = part.split(':');\n return { name: name.trim(), param: param?.trim() ?? null };\n });\n\n let newValue = replaceAll(value);\n\n for (const { name, param } of modifiers) {\n newValue = applyModifier(newValue, name, param);\n }\n\n str = str.replace(fullMatch, newValue ?? '');\n\n REGEX.MODIFIERS.lastIndex = 0;\n }\n\n return str;\n }\n\n function parseModifiers(str: string): string {\n let i = 0;\n const len = str.length;\n\n function parseText(stopChar?: string): string {\n let out = '';\n while (i < len) {\n if (str[i] === '\\\\') {\n if (i + 1 < len) {\n out += str[i + 1];\n i += 2;\n } else {\n i++;\n }\n } else if (str[i] === '[' && (!stopChar || stopChar !== '[')) {\n out += parseModifier();\n } else if (stopChar && str[i] === stopChar) {\n i++;\n break;\n } else {\n out += str[i++];\n }\n }\n return out;\n }\n\n function parseModifier(): string {\n i++;\n const modifiers: { name: string; param: string | null }[] = [];\n\n while (i < len && str[i] !== '=') {\n if (str[i] === ',') {\n i++;\n continue;\n }\n\n let name = '';\n while (i < len && /[A-Za-z0-9]/.test(str[i])) name += str[i++];\n\n let param: string | null = null;\n if (str[i] === ':') {\n i++;\n const paramStart = i;\n while (i < len && str[i] !== ',' && str[i] !== '=') i++;\n param = str.slice(paramStart, i);\n }\n\n if (name.length) {\n modifiers.push({ name, param });\n }\n\n if (str[i] === ',') {\n i++;\n }\n }\n\n if (str[i] === '=') i++;\n\n const value = parseText(']');\n\n return modifiers.reduce((val, { name, param }) => applyModifier(val, name, param), value);\n }\n\n return parseText();\n }\n\n let result = template.replace(REGEX.PLACEHOLDERS, (_, key: string) =>\n typeof flatten[key] === 'string' || typeof flatten[key] === 'number'\n ? String(flatten[key])\n : (key ?? key),\n );\n\n result = options.method === 'loop' ? replaceAll(result) : parseModifiers(result);\n\n return result;\n }\n}\n","export class SoundHelper {\n playing: boolean = false;\n audio!: AudioContext;\n\n /**\n * Play sound from URL with optional volume and replace parameters\n * @param url - Sound URL to play\n * @param volume - Volume level from 0 to 100 (default: 100)\n * @param replace - If true, replaces currently playing sound (default: false)\n */\n play(url: string, volume: number = 100, replace = false) {\n if (!url || !url.length) {\n throw new Error('No sound URL provided');\n }\n\n try {\n if (replace && this.playing && this.audio && this.audio.state !== 'closed')\n this.audio.close();\n\n let ctx = new AudioContext();\n let gainNode = ctx.createGain();\n gainNode.connect(ctx.destination);\n\n if (replace) {\n this.audio = ctx;\n this.playing = true;\n }\n\n fetch(url)\n .then((data) => data.arrayBuffer())\n .then((arrayBuffer) => ctx.decodeAudioData(arrayBuffer))\n .then((decodedAudio) => {\n if (ctx.state !== 'closed') {\n const playSound = ctx.createBufferSource();\n playSound.buffer = decodedAudio;\n playSound.connect(gainNode);\n gainNode.gain.value = volume / 100;\n playSound.start(ctx.currentTime);\n }\n });\n } catch (error) {\n throw new Error(`Error playing sound: ${error}`);\n }\n }\n}\n","export class FunctionHelper {\n /**\n * Apply function with given thisArg and arguments\n * @param fn - Function to apply\n * @param thisArg - Value to use as this when calling fn\n * @param args - Arguments to pass to fn\n * @returns Result of calling fn with thisArg and args\n */\n apply<TThis, TArgs extends unknown[], TReturn>(\n fn: (this: TThis, ...args: TArgs) => TReturn,\n thisArg: TThis,\n args: TArgs,\n ): TReturn {\n return fn.apply(thisArg, args);\n }\n\n /**\n * Call function with given thisArg and arguments\n * @param fn - Function to call\n * @param thisArg - Value to use as this when calling fn\n * @param args - Arguments to pass to fn\n * @returns Result of calling fn with thisArg and args\n */\n call<TThis, TArgs extends unknown[], TReturn>(\n fn: (this: TThis, ...args: TArgs) => TReturn,\n thisArg: TThis,\n ...args: TArgs\n ): TReturn {\n return fn.call(thisArg, ...args);\n }\n}\n","import type { Client } from './client/client.js';\nimport type { FakeUserPool } from './modules/fakeUser.js';\nimport type { useComms } from './modules/useComms.js';\nimport type { Button, Command, useStorage } from './types.js';\n\nexport const usedClients: Client[] = [];\nexport const usedStorages: Array<useStorage<any>> = [];\nexport const usedComms: Array<useComms<any>> = [];\nexport const usedCommands: Command[] = [];\nexport const usedButtons: Button[] = [];\nexport const fakeUserPools: FakeUserPool[] = [];\n","import { fakeUserPools } from '../../internal.js';\nimport { Emote, RequireAtLeastOne, StreamElements, Twitch } from '../../types.js';\nimport { EventHelper } from './event.js';\nimport { MessageHelper } from './message.js';\n\nexport class UtilsHelper {\n /**\n * Delays execution for a specified number of milliseconds.\n * @param ms - The number of milliseconds to delay.\n * @returns A Promise that resolves after the specified delay.\n */\n delay<R extends any, M extends number>(ms: M, callback?: () => R): Promise<R | null> {\n return new Promise((resolve) =>\n setTimeout(() => {\n if (callback) {\n const result = callback();\n resolve(result ?? null);\n } else resolve(null);\n }, ms),\n );\n }\n\n /**\n * Returns typed entries of an object.\n * @param obj - The object to get entries from.\n * @returns An array of key-value pairs from the object.\n */\n typedEntries<K extends string, V>(obj: Record<K, V> | Array<V>): [K, V][] {\n return Object.entries(obj) as [K, V][];\n }\n\n /**\n * Returns typed values of an object.\n * @param obj - The object to get values from.\n * @returns An array of values from the object.\n */\n typedValues<K extends string, V>(obj: Record<K, V> | Array<V>): V[] {\n return Object.values(obj) as V[];\n }\n\n /**\n * Returns typed keys of an object.\n * @param obj - The object to get keys from.\n * @returns An array of keys from the object.\n */\n typedKeys<K extends string, V>(obj: Record<K, V> | Array<V>): K[] {\n return Object.keys(obj) as K[];\n }\n\n /**\n * Compares two dates and returns the difference in multiple time units.\n *\n * `total` values are based on raw milliseconds (can be decimal).\n * `calendar` values use calendar boundaries for full months/years.\n */\n compareDates(date1: Date | string, date2: Date | string) {\n const d1 = date1 instanceof Date ? new Date(date1.getTime()) : new Date(date1);\n const d2 = date2 instanceof Date ? new Date(date2.getTime()) : new Date(date2);\n\n if (Number.isNaN(d1.getTime()) || Number.isNaN(d2.getTime())) {\n throw new Error('Invalid date provided to compareDates');\n }\n\n const milliseconds = d2.getTime() - d1.getTime();\n const absMilliseconds = Math.abs(milliseconds);\n\n const totalSeconds = milliseconds / 1000;\n const totalMinutes = milliseconds / (1000 * 60);\n const totalHours = milliseconds / (1000 * 60 * 60);\n const totalDays = milliseconds / (1000 * 60 * 60 * 24);\n const totalMonths = totalDays / 30.436875;\n const totalYears = totalDays / 365.2425;\n\n const from = d1 <= d2 ? d1 : d2;\n const to = d1 <= d2 ? d2 : d1;\n let calendarMonths =\n (to.getFullYear() - from.getFullYear()) * 12 + (to.getMonth() - from.getMonth());\n\n const anchor = new Date(from);\n anchor.setMonth(anchor.getMonth() + calendarMonths);\n\n if (anchor > to) {\n calendarMonths -= 1;\n }\n\n const sign = milliseconds < 0 ? -1 : 1;\n const signedCalendarMonths = calendarMonths * sign;\n const signedCalendarYears = (calendarMonths / 12) * sign;\n\n return {\n milliseconds,\n seconds: totalSeconds,\n minutes: totalMinutes,\n hours: totalHours,\n days: totalDays,\n months: totalMonths,\n years: totalYears,\n absolute: {\n milliseconds: absMilliseconds,\n seconds: absMilliseconds / 1000,\n minutes: absMilliseconds / (1000 * 60),\n hours: absMilliseconds / (1000 * 60 * 60),\n days: absMilliseconds / (1000 * 60 * 60 * 24),\n months: absMilliseconds / (1000 * 60 * 60 * 24 * 30.436875),\n years: absMilliseconds / (1000 * 60 * 60 * 24 * 365.2425),\n },\n calendar: {\n months: signedCalendarMonths,\n years: signedCalendarYears,\n },\n isFuture: milliseconds > 0,\n isPast: milliseconds < 0,\n isSameMoment: milliseconds === 0,\n };\n }\n\n /**\n * Selects an item based on weighted probabilities.\n * @param items - An object where keys are items and values are their weights.\n * @returns A randomly selected item based on the given probabilities.\n * @example\n * ```ts\n * const utils = new UtilsHelper();\n * const result = utils.probability({\n * apple: 0.5,\n * banana: 0.3,\n * cherry: 0.2,\n * });\n * console.log(result); // 'apple', 'banana', or 'cherry' based on the defined probabilities\n * ```\n */\n probability<K extends string, V extends number>(items: Record<K, V>): K | undefined {\n const total = (Object.values(items) as number[]).reduce((acc, val) => acc + val, 0);\n const sorted = new UtilsHelper().typedEntries(items).sort((a, b) => b[1] - a[1]);\n const rand = Math.random() * total;\n\n let cumulative = 0;\n\n for (const [item, weight] of sorted) {\n cumulative += weight;\n\n if (rand < cumulative) {\n return item;\n }\n }\n\n return undefined;\n }\n\n /**\n * Finds the subscription tier of a user based on various sources of information.\n * @param data - An object containing userId, name, and broadcasterId to identify the user.\n * @param session - The current session data which may contain recent subscription information.\n * @param checkWithAPI - Whether to check the subscription tier with an external API as a last resort.\n * @returns A promise that resolves to the subscription tier of the user (1, 2, or 3).\n * @example\n * ```javascript\n * const utils = new UtilsHelper();\n * const tier = await utils.findSubscriptionTier(\n * { userId: '12345', name: 'exampleUser', broadcasterId: '67890' },\n * sessionData,\n * true\n * );\n * console.log(tier); // 1, 2, or 3 based on the user's subscription tier\n * ```\n */\n async findSubscriptionTier(\n {\n userId,\n name,\n broadcasterId,\n }: {\n userId: string;\n name: string;\n broadcasterId?: string;\n },\n session: StreamElements.Session.Data,\n checkWithAPI: boolean = false,\n ) {\n const convert = (tier?: string | number) => {\n if (tier === 'prime') return 1;\n else if (tier === '1000' || tier === 1000 || tier === 1 || tier === '1') return 1;\n else if (tier === '2000' || tier === 2000 || tier === 2 || tier === '2') return 2;\n else if (tier === '3000' || tier === 3000 || tier === 3 || tier === '3') return 3;\n else return 1;\n };\n\n // If it's a fake user, get the tier from the fake user pool\n if (userId?.includes('fake_user_')) {\n const pool = fakeUserPools.find((p) => userId.endsWith(`+${p.id}`));\n\n if (pool) {\n const user = pool.getById(userId);\n\n if (user) return convert(user.tier);\n }\n }\n\n // Check the recent subscriptions\n const recentSubscriptions = session['subscriber-recent'];\n\n if (recentSubscriptions) {\n const subscriber = recentSubscriptions.find((sub) => sub.name === name);\n\n if (subscriber) return convert(subscriber.tier);\n }\n\n // Check the latest subscriber\n\n const latestSubscriber = session['subscriber-latest'];\n\n if (latestSubscriber.name === name) {\n return convert(latestSubscriber.tier);\n }\n\n // Check gifts\n\n const latestGift = session['subscriber-gifted-latest'];\n\n if (latestGift.name === name) {\n return convert(latestGift.tier);\n }\n\n // Last try, check with my API\n if (checkWithAPI) {\n if (\n broadcasterId?.length &&\n userId?.length &&\n !broadcasterId.includes('fake_user_') &&\n !userId.includes('fake_user_')\n ) {\n const result = await fetch(\n `https://api.tixyel.com/v1/twitch/channel/subscriber/${broadcasterId}/${userId}`,\n )\n .then(async (res) =>\n res.status == 200\n ? res.json()\n : Promise.reject(\n new Error(\n `Failed to fetch subscription data: ${res.status} ${res.statusText} ${await res.text()}`,\n ),\n ),\n )\n .then(\n (data: {\n broadcaster: { id: string; name: string; displayName: string };\n isGift: boolean;\n tier: string;\n }) => {\n return data?.tier;\n },\n )\n .catch(() => 1);\n\n if (result) return convert(result);\n }\n }\n\n return 1;\n }\n\n /**\n * Identifies a user based on the received event and session data, returning their ID, name, role, badges, and top status.\n * @param receivedEvent - The event received from the provider (Twitch or YouTube) containing user information.\n * @param session - The current session data which may contain recent activity and top user information.\n * @returns A promise that resolves to an object containing the user's ID, name, role, badges, and top status, or undefined if the user cannot be identified.\n * @example\n * ```javascript\n * const utils = new UtilsHelper();\n * const userInfo = await utils.identifyUser(receivedEvent, sessionData);\n * console.log(userInfo);\n * // {\n * // id: '12345',\n * // name: 'exampleUser',\n * // role: 'moderator',\n * // badges: [{ type: 'moderator', version: '1', url: 'https:...', description: 'Moderator' }],\n * // top: {\n * // gifter: false,\n * // tip: {\n * // session: { donator: false, donation: false },\n * // weekly: { donator: false, donation: false },\n * // monthly: { donator: false, donation: false },\n * // alltime: { donator: false, donation: false },\n * // },\n * // ...\n * // }\n * // }\n * ```\n */\n async identifyUser(\n provider: 'twitch',\n receivedEvent: StreamElements.Event.Provider.Twitch.Message,\n session: StreamElements.Session.Data,\n ): Promise<IdentifyTwitchResult>;\n async identifyUser(\n provider: 'youtube',\n receivedEvent: StreamElements.Event.Provider.YouTube.Message,\n session: StreamElements.Session.Data,\n ): Promise<IdentifyYouTubeResult>;\n async identifyUser(\n provider: 'twitch' | 'youtube',\n receivedEvent:\n | StreamElements.Event.Provider.Twitch.Message\n | StreamElements.Event.Provider.YouTube.Message,\n session: StreamElements.Session.Data,\n ): Promise<IdentifyYouTubeResult | IdentifyTwitchResult> {\n const getTops = (name: string): TopType => ({\n gifter: session['subscriber-alltime-gifter'].name === name,\n tip: {\n session: {\n donator: session['tip-session-top-donator'].name === name,\n donation: session['tip-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['tip-weekly-top-donator'].name === name,\n donation: session['tip-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['tip-monthly-top-donator'].name === name,\n donation: session['tip-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['tip-alltime-top-donator'].name === name,\n donation: session['tip-alltime-top-donation'].name === name,\n },\n },\n cheer: {\n session: {\n donator: session['cheer-session-top-donator'].name === name,\n amount: session['cheer-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['cheer-weekly-top-donator'].name === name,\n amount: session['cheer-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['cheer-monthly-top-donator'].name === name,\n amount: session['cheer-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['cheer-alltime-top-donator'].name === name,\n amount: session['cheer-alltime-top-donation'].name === name,\n },\n },\n superchat: {\n session: {\n donator: session['superchat-session-top-donator'].name === name,\n amount: session['superchat-session-top-donation'].name === name,\n },\n weekly: {\n donator: session['superchat-weekly-top-donator'].name === name,\n amount: session['superchat-weekly-top-donation'].name === name,\n },\n monthly: {\n donator: session['superchat-monthly-top-donator'].name === name,\n amount: session['superchat-monthly-top-donation'].name === name,\n },\n alltime: {\n donator: session['superchat-alltime-top-donator'].name === name,\n amount: session['superchat-alltime-top-donation'].name === name,\n },\n },\n });\n\n switch (provider) {\n case 'twitch': {\n const twitchEvent = receivedEvent as StreamElements.Event.Provider.Twitch.Message;\n const event = twitchEvent.event;\n const data = event.data;\n\n let tier: false | 1 | 2 | 3 = false;\n if (data.tags['badge-info']?.includes('subscriber')) {\n tier = await this.findSubscriptionTier(\n {\n userId: data.userId,\n name: data.displayName,\n broadcasterId: data.tags['room-id'],\n },\n session ?? ({} as StreamElements.Session.Data),\n false,\n );\n }\n\n return {\n id: data.userId,\n name: data.displayName,\n color: data.displayColor,\n role: data.tags.badges.split(',')[0].split('/')[0] as Twitch.tags,\n tags: data.tags.badges.split(',').map((b: string) => b.split('/')[0] as Twitch.tags),\n badges: data.badges,\n tier: !!tier ? tier : undefined,\n top: getTops(data.displayName),\n } satisfies IdentifyTwitchResult;\n\n break;\n }\n case 'youtube': {\n const youtubeEvent = receivedEvent as StreamElements.Event.Provider.YouTube.Message;\n const event = youtubeEvent.event;\n const data = event.data;\n\n const role = data.authorDetails.isChatOwner\n ? 'broadcaster'\n : data.authorDetails.isChatModerator\n ? 'moderator'\n : data.authorDetails.isChatSponsor\n ? 'sponsor'\n : data.authorDetails.isVerified\n ? 'verified'\n : 'viewer';\n\n return {\n id: data.userId,\n name: data.displayName,\n role: role,\n badges: data.badges,\n top: getTops(data.displayName),\n } satisfies IdentifyYouTubeResult;\n }\n }\n }\n\n identifyMessage(\n provider: 'twitch',\n receivedEvent: StreamElements.Event.Provider.Twitch.Message,\n options?: {\n mapEmote?: (emote: { src: string; alt: string }) => string;\n allowedRoles: RequireAtLeastOne<Twitch.tags>[];\n },\n ) {\n const emoteRegex = /<img[^>]*class=\"emote\"[^>]*>/gi;\n\n switch (provider) {\n case 'twitch': {\n const event = receivedEvent.event;\n\n let text = new MessageHelper().replaceEmotesWithHTML(\n receivedEvent.event.data.text,\n receivedEvent.event.data.emotes,\n );\n\n const onlyEmote = text.replaceAll(emoteRegex, '').trim() === '' ? true : false;\n const emoteLength = (text.match(emoteRegex) || []).length;\n\n text = text.replace(emoteRegex, (match) => {\n const srcMatch = match.match(/src=\"([^\"]*)\"/);\n const altMatch = match.match(/alt=\"([^\"]*)\"/);\n const src = srcMatch ? srcMatch[1] : '';\n const alt = altMatch ? altMatch[1] : '';\n\n if (options?.mapEmote) {\n return options.mapEmote({ src, alt });\n }\n\n return `<img src=\"${src}\" alt=\"${alt}\" class=\"emote\" style=\"display: inline-block; width: auto; height: 1em; vertical-align: middle;\">`;\n });\n\n let reply = receivedEvent.event.data.tags['reply-parent-msg-id']\n ? {\n login: receivedEvent.event.data.tags['reply-parent-user-login']!,\n name: receivedEvent.event.data.tags['reply-parent-display-name']!,\n userId: receivedEvent.event.data.tags['reply-parent-user-id']!,\n msgId: receivedEvent.event.data.tags['reply-parent-msg-id']!,\n text: receivedEvent.event.data.tags['reply-parent-msg-body']!,\n }\n : undefined;\n\n const data = {\n username: receivedEvent.event.data.displayName,\n text: text,\n reply: reply,\n msgId: event.data.msgId,\n userId: event.data.userId,\n emote: {\n only: onlyEmote,\n amount: emoteLength,\n },\n };\n\n return data;\n }\n // case 'youtube': {}\n }\n }\n}\n\ntype TopType = {\n gifter: boolean;\n tip: {\n session: { donator: boolean; donation: boolean };\n weekly: { donator: boolean; donation: boolean };\n monthly: { donator: boolean; donation: boolean };\n alltime: { donator: boolean; donation: boolean };\n };\n cheer: {\n session: { donator: boolean; amount: boolean };\n weekly: { donator: boolean; amount: boolean };\n monthly: { donator: boolean; amount: boolean };\n alltime: { donator: boolean; amount: boolean };\n };\n superchat: {\n session: { donator: boolean; amount: boolean };\n weekly: { donator: boolean; amount: boolean };\n monthly: { donator: boolean; amount: boolean };\n alltime: { donator: boolean; amount: boolean };\n };\n};\n\ntype IdentifyTwitchResult = {\n id: string;\n name: string;\n color: string;\n role: Twitch.tags;\n tags: Twitch.tags[];\n badges: Twitch.badge[];\n tier?: 1 | 2 | 3;\n top: TopType;\n};\n\ntype IdentifyYouTubeResult = {\n id: string;\n name: string;\n role: 'broadcaster' | 'moderator' | 'sponsor' | 'verified' | 'viewer';\n badges: unknown[];\n top: TopType;\n};\n","export type Point = {\n x: number;\n y: number;\n};\n\nexport type AnimOptions = {\n /** Duration in seconds. Default: `1` */\n duration?: number;\n fps?: number;\n easing?: (t: number) => number;\n};\n\nexport type AnimResult = {\n x: number[];\n y: number[];\n};\n\nexport type QuadraticParams = AnimOptions & {\n from: Point;\n to: Point;\n control: Point;\n};\n\nexport type CubicParams = AnimOptions & {\n from: Point & { control: Point };\n to: Point & { control: Point };\n};\n\nexport type ControlledPoint = Point & { control: Point };\n\nexport type MultiCubicPoint = Point & {\n control?: Point;\n controlIn?: Point;\n controlOut?: Point;\n};\n\nexport type MultiCubicParams = AnimOptions & {\n points: [MultiCubicPoint, MultiCubicPoint, MultiCubicPoint, ...MultiCubicPoint[]];\n};\n\nexport type CircleParams = AnimOptions & {\n center: Point;\n radius: number;\n from?: number;\n to?: number;\n};\n\nexport type SpiralParams = AnimOptions & {\n center: Point;\n radius: { from: number; to: number };\n turns?: number;\n};\n\nexport class AnimateHelper {\n /**\n * Interpolate a number from start to end\n * @example\n * ```ts\n * const value = animate.lerp(0, 100, 0.5);\n * console.log(value); // 50\n * // Clamped between 0 and 1\n * const clamped = animate.lerp(0, 100, 1.5);\n * console.log(clamped); // 100\n * const clamped2 = animate.lerp(0, 100, -0.5);\n * console.log(clamped2); // 0\n * const easeIn = animate.lerp(0, 100, (t) => t * t);\n * console.log(easeIn); // 25 at t=0.5\n * const linear = animate.lerp(0, 100, 0.5);\n * console.log(linear); // 50 at t=0.5\n * // Ease-in should be less than linear at t=0.5\n * console.log(easeIn < linear); // true\n * ```\n */\n lerp(start: number, end: number, t: number): number {\n const clamped = Math.max(0, Math.min(1, t));\n return start + (end - start) * clamped;\n }\n\n /**\n * Create a quadratic Bezier path between two positions using a control point.\n * Returns sampled x/y coordinates for the animation timeline.\n * @example\n * ```ts\n * const { x, y } = animate.quadratic({\n * from: { x: 0, y: 0 },\n * to: { x: 100, y: 0 },\n * control: { x: 50, y: 50 },\n * duration: 1,\n * fps: 60,\n * easing: Motion.easeInOut,\n * });\n *\n * // Use with Motion.animate\n * Motion.animate(element, { x, y }, { duration: 1 });\n * ```\n */\n quadratic({\n from,\n to,\n control,\n duration = 1,\n fps = 60,\n easing = (t) => t,\n }: QuadraticParams): AnimResult {\n const steps = Math.max(2, Math.round(duration * fps));\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = easing(i / steps);\n xPoints.push((1 - t) * (1 - t) * from.x + 2 * (1 - t) * t * control.x + t * t * to.x);\n yPoints.push((1 - t) * (1 - t) * from.y + 2 * (1 - t) * t * control.y + t * t * to.y);\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n /**\n * Create a cubic Bezier path between two positions using two control points.\n * Returns sampled x/y coordinates for the animation timeline.\n * @example\n * ```ts\n * const { x, y } = animate.cubic({\n * from: { x: 0, y: 0, control: { x: 50, y: 100 } },\n * to: { x: 200, y: 0, control: { x: 150, y: 100 } },\n * duration: 2,\n * fps: 60,\n * easing: Motion.easeInOut,\n * });\n * ```\n */\n cubic({ from, to, duration = 1, fps = 60, easing = (t) => t }: CubicParams): AnimResult {\n const steps = Math.max(2, Math.round(duration * fps));\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = easing(i / steps);\n const mt = 1 - t;\n // Cubic Bezier: P = (1-t)^3*P0 + 3*(1-t)^2*t*P1 + 3*(1-t)*t^2*P2 + t^3*P3\n xPoints.push(\n mt * mt * mt * from.x +\n 3 * mt * mt * t * from.control.x +\n 3 * mt * t * t * to.control.x +\n t * t * t * to.x,\n );\n yPoints.push(\n mt * mt * mt * from.y +\n 3 * mt * mt * t * from.control.y +\n 3 * mt * t * t * to.control.y +\n t * t * t * to.y,\n );\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n private getMultiCubicOutgoingControl(point: MultiCubicPoint, index: number): Point {\n const control = point.controlOut ?? point.control;\n if (control) {\n return control;\n }\n\n if (index === 0) {\n throw new Error('The first multiCubic point requires `control` or `controlOut`.');\n }\n\n throw new Error(\n `The multiCubic point at index ${index} requires \\`controlOut\\` or a shared \\`control\\`.`,\n );\n }\n\n private getMultiCubicIncomingControl(\n point: MultiCubicPoint,\n index: number,\n lastIndex: number,\n ): Point {\n const control = point.controlIn ?? point.control;\n if (control) {\n return control;\n }\n\n if (index === lastIndex) {\n throw new Error('The last multiCubic point requires `control` or `controlIn`.');\n }\n\n throw new Error(\n `The multiCubic point at index ${index} requires \\`controlIn\\` or a shared \\`control\\`.`,\n );\n }\n\n /**\n * Create a chained cubic Bezier path using 3 or more points.\n * First and last points use a single control handle.\n * Middle points can use separate incoming and outgoing handles.\n *\n * Every consecutive pair creates one cubic segment:\n * `P0 = points[i]`, `P1 = points[i].controlOut`, `P2 = points[i + 1].controlIn`, `P3 = points[i + 1]`.\n *\n * For compatibility, `control` is treated as a shared handle when `controlIn` or `controlOut`\n * are not provided.\n * @example\n * ```ts\n * const { x, y } = animate.multiCubic({\n * points: [\n * { x: 0, y: 0, control: { x: 20, y: 40 } },\n * {\n * x: 100,\n * y: 0,\n * controlIn: { x: 80, y: 60 },\n * controlOut: { x: 120, y: -20 },\n * },\n * { x: 200, y: 50, control: { x: 160, y: 120 } },\n * ],\n * duration: 2,\n * fps: 60,\n * easing: Motion.easeInOut,\n * });\n * ```\n */\n multiCubic({ points, duration = 1, fps = 60, easing = (t) => t }: MultiCubicParams): AnimResult {\n if (points.length < 3) {\n throw new Error('multiCubic requires at least 3 points.');\n }\n\n const segmentCount = points.length - 1;\n const lastIndex = points.length - 1;\n const totalSteps = Math.max(2, Math.round(duration * fps));\n const baseStepsPerSegment = Math.max(1, Math.floor(totalSteps / segmentCount));\n let remainingSteps = totalSteps % segmentCount;\n\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i < segmentCount; i++) {\n const from = points[i];\n const to = points[i + 1];\n const fromControl = this.getMultiCubicOutgoingControl(from, i);\n const toControl = this.getMultiCubicIncomingControl(to, i + 1, lastIndex);\n const stepsForSegment = baseStepsPerSegment + (remainingSteps > 0 ? 1 : 0);\n if (remainingSteps > 0) {\n remainingSteps--;\n }\n\n // Skip the first frame of following segments to avoid duplicate join points.\n const start = i === 0 ? 0 : 1;\n\n for (let s = start; s <= stepsForSegment; s++) {\n const t = easing(s / stepsForSegment);\n const mt = 1 - t;\n\n xPoints.push(\n mt * mt * mt * from.x +\n 3 * mt * mt * t * fromControl.x +\n 3 * mt * t * t * toControl.x +\n t * t * t * to.x,\n );\n\n yPoints.push(\n mt * mt * mt * from.y +\n 3 * mt * mt * t * fromControl.y +\n 3 * mt * t * t * toControl.y +\n t * t * t * to.y,\n );\n }\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n /**\n * Create a circular path around a center point.\n * Angles in degrees. Default: `from: 0`, `to: 360`.\n * @example\n * ```ts\n * const { x, y } = animate.circle({\n * center: { x: 100, y: 100 },\n * radius: 50,\n * from: 0,\n * to: 360,\n * duration: 3,\n * fps: 60,\n * });\n * ```\n */\n circle({\n center,\n radius,\n from = 0,\n to = 360,\n duration = 1,\n fps = 60,\n easing = (t) => t,\n }: CircleParams): AnimResult {\n const steps = Math.max(2, Math.round(duration * fps));\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = easing(i / steps);\n const angle = from + (to - from) * t;\n const rad = (angle * Math.PI) / 180;\n xPoints.push(center.x + radius * Math.cos(rad));\n yPoints.push(center.y + radius * Math.sin(rad));\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n /**\n * Create a spiral path around a center point.\n * @example\n * ```ts\n * const { x, y } = animate.spiral({\n * center: { x: 0, y: 0 },\n * radius: { from: 10, to: 100 },\n * turns: 3,\n * duration: 2,\n * fps: 60,\n * easing: (t) => 1 - (1 - t) * (1 - t),\n * });\n *\n * // This will create a spiral that starts at radius 10 and expands to radius 100 over 3 turns.\n * ```\n */\n spiral({\n center,\n radius,\n turns = 1,\n duration = 1,\n fps = 60,\n easing = (t) => t,\n }: SpiralParams): AnimResult {\n const steps = Math.max(2, Math.round(duration * fps));\n const xPoints: number[] = [];\n const yPoints: number[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const t = easing(i / steps);\n const r = this.lerp(radius.from, radius.to, t);\n const angle = t * turns * 360;\n const rad = (angle * Math.PI) / 180;\n xPoints.push(center.x + r * Math.cos(rad));\n yPoints.push(center.y + r * Math.sin(rad));\n }\n\n return { x: xPoints, y: yPoints };\n }\n\n /**\n * Chain multiple animation paths together sequentially.\n * @example\n * ```ts\n * const path1 = animate.quadratic({\n * from: { x: 0, y: 0 },\n * to: { x: 100, y: 0 },\n * control: { x: 50, y: 50 },\n * duration: 1,\n * fps: 60,\n * });\n *\n * const path2 = animate.circle({\n * center: { x: 100, y: 0 },\n * radius: 30,\n * from: 0,\n * to: 180,\n * duration: 1,\n * fps: 60,\n * });\n *\n * const combined = animate.chain(path1, path2);\n * ```\n */\n chain(...animations: AnimResult[]): AnimResult {\n const x: number[] = [];\n const y: number[] = [];\n\n for (const anim of animations) {\n x.push(...anim.x);\n y.push(...anim.y);\n }\n\n return { x, y };\n }\n\n /**\n * Execute multiple animations in sequence with optional delays between them.\n * Each animation will be sampled and delays will add repeating the last coordinate.\n * @example\n * ```ts\n * const path1 = animate.quadratic({ from: { x: 0, y: 0 }, to: { x: 50, y: 0 }, control: { x: 25, y: 25 }, duration: 0.5, fps: 30 });\n * const path2 = animate.quadratic({ from: { x: 50, y: 0 }, to: { x: 100, y: 0 }, control: { x: 75, y: 25 }, duration: 0.5, fps: 30 });\n *\n * // 30 frames delay between animations\n * const sequenced = animate.sequence([path1, path2], 30);\n * ```\n */\n sequence(animations: AnimResult[], delayFrames: number | number[] = 0): AnimResult {\n const x: number[] = [];\n const y: number[] = [];\n\n const delays = Array.isArray(delayFrames)\n ? delayFrames\n : animations.map(() => delayFrames as number);\n\n for (let i = 0; i < animations.length; i++) {\n const anim = animations[i];\n const delay = delays[i] ?? 0;\n\n // Add delay by repeating first frame\n for (let d = 0; d < delay; d++) {\n x.push(anim.x[0]);\n y.push(anim.y[0]);\n }\n\n // Add animation\n x.push(...anim.x);\n y.push(...anim.y);\n }\n\n return { x, y };\n }\n}\n","import {\n AnimateHelper,\n ColorHelper,\n ElementHelper,\n EventHelper,\n FunctionHelper,\n MessageHelper,\n NumberHelper,\n ObjectHelper,\n RandomHelper,\n SoundHelper,\n StringHelper,\n UtilsHelper,\n} from './classes/index.js';\n\nexport namespace Helper {\n export const animate = new AnimateHelper();\n\n export const number = new NumberHelper();\n\n export const element = new ElementHelper();\n\n export const object = new ObjectHelper();\n\n export const message = new MessageHelper();\n\n export const event = new EventHelper();\n\n export const string = new StringHelper();\n\n export const sound = new SoundHelper();\n\n export const color = new ColorHelper();\n\n export const random = new RandomHelper();\n\n export const fn = new FunctionHelper();\n\n export const utils = new UtilsHelper();\n}\n","import { Client } from '../client/client.js';\nimport { Helper } from '../helper/index.js';\nimport { usedButtons, usedClients } from '../internal.js';\nimport { logger } from '../main.js';\nimport { StreamElements } from '../types/index.js';\n\ninterface ButtonOptions {\n field: string | ((field: string, value: string | boolean | number) => boolean);\n template?: string;\n name?: string;\n value?: string;\n run: (this: Client | undefined, field: string, value: string | boolean | number) => void;\n}\n\n/**\n * Represents a button action that can be triggered by custom fields in StreamElements.\n * The button can be configured with a template and a name, and it will execute a specified function when triggered.\n * @example\n * ```javascript\n * const button = new Button({\n * field: (field, value) => field.startsWith('message-') && field.split('-')[1],\n * template: 'message-{role}',\n * // name: '[CAP={role}] role message',\n * name: 'Generate {role} message',\n * run(field, value) {\n * console.log(`Button ${field} was clicked with value: ${value}`);\n * }\n * })\n *\n * const field = button.generate([{ role: 'broadcaster' }, { role: 'moderator' }]);\n * // This will create buttons with fields \"message-broadcaster\" and \"message-moderator\" and names \"Generate broadcaster message\" and \"Generate moderator message\".\n * // field['message-broadcaster'] => { type: 'button', label: 'Generate broadcaster message' }\n * // field['message-moderator'] => { type: 'button', label: 'Generate moderator message' }\n *\n * // When a custom field with the name \"message-broadcaster\" or \"message-moderator\" is triggered, the run function will be called with the field and value.\n * ```\n */\nexport class Button {\n field: ButtonOptions['field'] = 'button';\n template: string = 'button';\n name: string = 'Button';\n value: string = '';\n\n run!: ButtonOptions['run'];\n\n constructor(options: ButtonOptions) {\n this.field = options.field ?? this.field;\n this.template =\n options.template ?? (typeof this.field === 'string' ? this.field : this.template);\n this.name = options.name ?? this.name;\n this.value = options.value ?? this.value;\n this.run = options.run;\n\n usedButtons.push(this);\n\n if (!usedClients.length) return;\n\n // Register the button in the client actions\n usedClients.forEach((client) => {\n client.actions.buttons.push(this);\n client.emit('action', this, 'created');\n });\n }\n\n generate(values: Array<Record<string, string | number>>) {\n const fields = Helper.utils.typedValues(values).reduce(\n (acc, values, index) => {\n const key = Helper.string.compose(this.template, { index, ...values }, { html: false });\n const name = Helper.string.compose(this.name, { index, ...values }, { html: false });\n\n acc[key] = {\n type: 'button',\n label: name,\n };\n\n let value: string | number | boolean = Helper.string.compose(\n String(this.value),\n { index, ...values },\n { html: false },\n );\n\n if (!isNaN(Number(value))) value = Number(value);\n else if (value.toLowerCase() === 'true') value = true;\n else if (value.toLowerCase() === 'false') value = false;\n\n if (\n typeof value !== 'undefined' &&\n !!value &&\n (typeof value === 'string' ? value.length : true)\n ) {\n acc[key].value = value;\n }\n\n return acc;\n },\n {} as Record<string, StreamElements.CustomField.Schema>,\n );\n\n // let result = Helper.string.compose(this.template, values, { html: false });\n\n return fields;\n }\n\n parse(field: string, value: string | boolean | number): Button {\n /**\n * Extract the actual field name by removing the template part from the provided field.\n * For example, if the template is \"button-{id}\" and the field is \"button-123\",\n * this will extract \"123\" as the actual field name.\n */\n var f = field\n .replace(\n typeof this.field === 'string'\n ? this.field\n : (this.template.replace(/\\{[^}]*\\}/g, '') ?? ''),\n '',\n )\n .trim();\n\n try {\n this.run.apply(usedClients[0] || undefined, [f.length ? f : (field ?? field), value]);\n } catch (error) {\n throw new Error(\n `Error running button \"${this.field}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n\n return this;\n }\n\n remove(): void {\n const _index = usedButtons.indexOf(this);\n\n if (_index > -1) {\n usedButtons.splice(_index, 1);\n }\n\n if (!usedClients.length) return;\n\n const index = usedClients[0]?.actions.buttons.indexOf(this);\n\n if (index > -1) {\n usedClients[0]?.actions.buttons.splice(index, 1);\n usedClients[0]?.emit('action', this, 'removed');\n }\n }\n\n static execute(field: string, value: string | boolean | number): boolean {\n try {\n if (usedButtons.length) {\n const found = usedButtons.filter((b) => {\n /**\n * Check if the button's field matches the provided field.\n */\n if (typeof b.field === 'string') return b.field === field;\n /**\n * If the button's field is a function, call it with the provided field and value to determine a match.\n */\n if (typeof b.field === 'function') return b.field(field, value);\n\n return false;\n });\n\n if (found.length && found.every((b) => b instanceof Button)) {\n found.forEach((button) => {\n try {\n button.parse(field, value);\n\n usedClients.forEach((client) => {\n client.emit('action', button, 'executed');\n });\n\n logger.received(`Button executed: ${field}${value ? ` with value: ${value}` : ''}`);\n } catch (error) {\n logger.error(\n `Error executing button \"${field}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n });\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n","import { Client } from '../client/client.js';\nimport { usedClients, usedCommands } from '../internal.js';\nimport { logger } from '../main.js';\nimport { StreamElements } from '../types/streamelements/main.js';\n\ninterface CommandOptions {\n prefix?: string;\n name: string;\n description?: string;\n arguments?: boolean;\n run: (this: Client, args: string[], event: CommandEvent) => void;\n test?: string;\n aliases?: string[];\n permissions?: string[] | boolean;\n admins?: string[];\n}\n\ntype CommandEvent =\n | { provider: 'twitch'; data: StreamElements.Event.Provider.Twitch.Message }\n | { provider: 'youtube'; data: StreamElements.Event.Provider.YouTube.Message }\n | { provider: 'kick'; data: any };\n\nexport class Command {\n prefix: string = '!';\n\n name!: string;\n description!: string;\n\n arguments: boolean = false;\n\n test: string | (() => string) = `${this.prefix}${this.name} arg1 arg2`;\n\n aliases: string[] = [];\n permissions?: string[] | boolean = undefined;\n admins: string[] = [];\n\n constructor(options: CommandOptions) {\n this.prefix = options.prefix ?? this.prefix;\n this.name = options.name;\n this.description = options.description ?? this.description;\n this.arguments = options.arguments ?? this.arguments;\n\n this.run = options.run;\n\n this.test = options.test ?? this.test;\n this.aliases = options.aliases ?? this.aliases;\n this.permissions = options.permissions ?? this.permissions;\n this.admins = options.admins ?? this.admins;\n\n usedCommands.push(this);\n\n if (!usedClients.length) return;\n\n // Register the command in the client actions\n usedClients.forEach((client) => {\n client.actions.commands.push(this);\n client.emit('action', this, 'created');\n });\n }\n\n run(this: Client | undefined, args: string[], event: CommandEvent): void {}\n\n verify(nickname: string, roles: string[], args: string[]): boolean {\n if (this.arguments === true && (!args || !args.length)) {\n return false;\n }\n\n if (this.admins.some((a) => nickname.toLocaleLowerCase() === a.toLocaleLowerCase())) {\n return true;\n }\n\n if (\n this.permissions === true ||\n typeof this.permissions === 'undefined' ||\n (Array.isArray(this.permissions) && !this.permissions.length)\n ) {\n return true;\n }\n\n if (\n Array.isArray(this.permissions) &&\n (this.permissions.some(\n (p) =>\n nickname.toLowerCase() === p.toLowerCase() ||\n roles.map((r) => r.toLowerCase()).includes(p.toLowerCase()),\n ) ||\n this.permissions.includes('*'))\n ) {\n return true;\n }\n\n return false;\n }\n\n parse(text: string, event: CommandEvent): boolean {\n const args = text\n .replace(this.prefix, '')\n .split(' ')\n .slice(1)\n .map((a) => a.trim());\n\n var nickname: string = '';\n var roles: string[] = [];\n\n const rAliases = { bits: 'cheer', premium: 'prime' };\n\n switch (event.provider) {\n case 'twitch': {\n const data = event.data;\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n if (data.event.data.tags?.badges) {\n const tags = data.event.data.tags.badges.toString().replace(/\\/\\d+/g, '').split(',');\n\n roles = tags.map((t) => (t in rAliases ? rAliases[t as keyof typeof rAliases] : t));\n }\n\n break;\n }\n case 'youtube': {\n const data = event.data;\n\n const rMap = {\n isVerified: 'verified',\n isChatOwner: 'owner',\n isChatSponsor: 'sponsor',\n isChatModerator: 'moderator',\n };\n\n nickname = data.event.data.nick || data.event.data.displayName;\n\n roles = Object.entries(data.event.data.authorDetails)\n .filter(([k, v]) => k.startsWith('is') && v)\n .map(([k]) => rMap[k as keyof typeof rMap])\n .filter(Boolean);\n\n if (roles.includes('sponsor')) {\n roles.push('premium');\n roles.push('prime');\n }\n if (roles.includes('owner')) {\n roles.push('moderator');\n roles.push('broadcaster');\n }\n\n break;\n }\n case 'kick': {\n return false;\n\n break;\n }\n }\n\n const verify = this.verify(nickname, roles, args);\n\n if (verify === true) {\n this.run.apply(usedClients[0] || undefined, [args, event]);\n }\n\n return verify;\n }\n\n remove(): void {\n const _index = usedCommands.indexOf(this);\n\n if (_index > -1) {\n usedCommands.splice(_index, 1);\n }\n\n if (!usedClients.length) return;\n\n const index = usedClients[0]?.actions.commands.indexOf(this);\n\n if (index > -1) {\n usedClients[0]?.actions.commands.splice(index, 1);\n usedClients[0]?.emit('action', this, 'removed');\n }\n }\n\n static execute(received: CommandEvent): boolean {\n const data = received.data;\n\n try {\n if (\n usedCommands.length &&\n usedCommands.some((c) => data.event.data.text.startsWith(c.prefix))\n ) {\n const found = usedCommands.filter((c) => {\n var nameAndAliases = [c.name, ...(c.aliases ?? [])];\n var commandMatch = data.event.data.text.replace(c.prefix, '').split(' ')[0];\n\n return nameAndAliases.includes(commandMatch);\n });\n\n if (found.length && found.every((command) => command instanceof Command)) {\n found.forEach((command) => {\n command.parse(data.event.data.text, received);\n\n usedClients.forEach((client) => {\n client.emit('action', command, 'executed');\n });\n\n logger.received(\n `Command executed: ${data.event.data.text} by ${data.event.data.nick || data.event.data.displayName}`,\n data,\n );\n });\n\n return true;\n }\n }\n } catch (error) {\n return false;\n } finally {\n return false;\n }\n }\n}\n","import { Button } from '../actions/button.js';\nimport { Command } from '../actions/command.js';\nimport { Helper } from '../helper/index.js';\nimport { usedClients, usedComms, usedStorages } from '../internal.js';\nimport { Local } from '../local/index.js';\nimport { logger } from '../main.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { Client, ClientStorageOptions } from './client.js';\n\nif (typeof window !== undefined) {\n window.addEventListener('onWidgetLoad', async (data) => {\n const { detail } = data;\n\n if (usedClients.length) {\n usedClients.forEach(async (client) => {\n client.fields = detail.fieldData;\n client.session = detail.session.data;\n\n client.details = {\n ...client.details,\n user: detail.channel,\n currency: detail.currency,\n overlay: detail.overlay,\n };\n\n if (detail.channel.id && !detail.emulated) {\n await fetch(`https://api.streamelements.com/kappa/v2/channels/${detail.channel.id}/`)\n .then((res) => res.json())\n .then((profile) => {\n if (profile.provider) {\n client.details.provider = profile.provider;\n\n return profile.provider;\n } else {\n client.details.provider = 'local';\n }\n })\n .catch(() => {\n client.details.provider = 'local';\n });\n } else {\n client.details.provider = 'local';\n }\n\n client.emit('load', detail);\n\n if (client.debug) {\n logger.received('Widget loaded!', data.detail);\n\n const fieldData = data.detail.fieldData;\n\n if (Object.keys(fieldData).length) logger.received('Field data:', fieldData);\n }\n\n client.loaded = true;\n\n client.storage.on('load', (data) => {\n if (client.debug && data) {\n logger.debug(\n '[Client]',\n 'Storage loaded for client',\n `\"${client.id}\";`,\n `Provider: \"${client.details.provider}\";`,\n data,\n );\n } else if (client.debug) {\n logger.debug(\n '[Client]',\n 'Storage loaded for client',\n `\"${client.id}\";`,\n `Provider: \"${client.details.provider}\";`,\n 'No data found.',\n );\n }\n\n if (data) {\n const clearExpired = <T extends Record<string, ClientStorageOptions<string>>>(\n data: T,\n ) => {\n const now = Date.now();\n const cleanedData: any = {};\n\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n const entry = data[key];\n\n if (entry.expire && entry.expire > now) {\n cleanedData[key] = entry;\n }\n }\n }\n\n return cleanedData as T;\n };\n\n const users = clearExpired(data['user'] || {});\n const avatars = clearExpired(data['avatar'] || {});\n const pronouns = clearExpired(data['pronoun'] || {});\n const emotes = clearExpired(data['emote'] || {});\n\n client.storage.update({\n user: users,\n avatar: avatars,\n pronoun: pronouns,\n emote: emotes,\n });\n }\n\n if (detail.channel.providerId.length) {\n client.storage.add(`avatar.${detail.channel.providerId.toLowerCase()}`, {\n value: detail.channel.avatar,\n timestamp: Date.now(),\n expire: Date.now() + client.cache.avatar * 60 * 1000,\n });\n }\n });\n });\n }\n });\n\n window.addEventListener('onSessionUpdate', (data) => {\n const { detail } = data;\n\n if (usedClients.length) {\n usedClients.forEach((client) => {\n client.session = detail.session;\n\n client.emit('session', detail.session);\n\n if (client.debug) {\n logger.debug('[Client]', 'Session updated', detail.session);\n }\n });\n }\n });\n\n window.addEventListener('onEventReceived', ({ detail }) => {\n if (usedClients.length) {\n usedClients.forEach((client) => {\n const received = Helper.event.parseProvider(detail);\n\n switch (received.provider) {\n case 'streamelements': {\n const data = received.data;\n\n switch (data.listener) {\n case 'tip-latest': {\n const event = data.event;\n\n break;\n }\n case 'event:skip': {\n const event = data.event;\n\n break;\n }\n case 'event:test': {\n switch (data.event.listener) {\n case 'widget-button': {\n const event = data.event;\n\n Button.execute(event.field, event.value);\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n break;\n }\n\n // ... alot more\n }\n\n break;\n }\n case 'kvstore:update': {\n const event = data.event;\n\n if (usedStorages.length) {\n var storage = usedStorages.find(\n (s) =>\n s.id === event.data.key.replace('customWidget.', '') ||\n s.id === event.data.key,\n );\n\n if (storage) {\n // @ts-ignore\n storage.update(event.data.value);\n }\n }\n\n if (usedComms.length) {\n const comm = usedComms.find(\n (c) =>\n c.id === event.data.key.replace('customWidget.', '') ||\n c.id === event.data.key,\n );\n\n if (comm) {\n // @ts-ignore\n comm.update(event.data.value);\n }\n }\n\n break;\n }\n case 'bot:counter': {\n const event = data.event;\n\n break;\n }\n case 'alertService:toggleSound': {\n const event = data.event;\n\n client.details.overlay.muted = Boolean(event.muted);\n\n break;\n }\n }\n\n client.emit('event', 'streamelements', received.data);\n\n break;\n }\n case 'twitch': {\n const data = received.data;\n\n switch (data.listener) {\n case 'delete-message': {\n const event = data.event;\n\n break;\n }\n case 'delete-messages': {\n const event = data.event;\n\n break;\n }\n case 'message': {\n const event = data.event;\n\n Command.execute({ provider: 'twitch', data: data });\n\n break;\n }\n case 'follower-latest': {\n const event = data.event;\n\n break;\n }\n case 'cheer-latest': {\n const event = data.event;\n\n break;\n }\n case 'subscriber-latest': {\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // gift\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n const event = data.event;\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'raid-latest': {\n const event = data.event;\n\n break;\n }\n }\n\n client.emit('event', 'twitch', received.data);\n\n break;\n }\n case 'youtube': {\n const data = received.data;\n\n switch (data.listener) {\n case 'message': {\n const event = data.event;\n\n Command.execute({ provider: 'youtube', data: data });\n\n break;\n }\n case 'subscriber-latest': {\n const event = data.event;\n\n break;\n }\n case 'sponsor-latest': {\n const event = data.event;\n\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // gift\n const event = data.event;\n } else if (\n data.event.gifted &&\n !data.event.bulkGifted &&\n data.event.isCommunityGift\n ) {\n // community gift spam\n const event = data.event;\n } else if (\n !data.event.gifted &&\n data.event.bulkGifted &&\n !data.event.isCommunityGift\n ) {\n // community gift\n const event = data.event;\n }\n\n break;\n }\n case 'superchat-latest': {\n const event = data.event;\n\n break;\n }\n }\n\n client.emit('event', 'youtube', received.data);\n\n break;\n }\n default: {\n // @ts-ignore\n client.emit('event', received.provider, received.data);\n }\n }\n\n const excludeListeners: Array<(typeof received.data)['listener']> = [\n 'bot:counter',\n 'alertService:toggleSound',\n 'event',\n 'event:skip',\n 'event:test',\n 'kvstore:update',\n ];\n\n if (\n client.debug &&\n !excludeListeners.some((e) => e === received.data.listener) &&\n ['streamelements', 'twitch', 'youtube'].some((p) => p === received.provider)\n ) {\n logger.received(\n '[Client]',\n `Event ${received.data.listener} received from ${received.provider}`,\n received.data.event,\n );\n }\n });\n }\n });\n}\n","/**\n * EventProvider class for managing event listeners and emitters.\n * This class allows you to register event listeners, emit events, and manage event subscriptions.\n * @example\n * ```typescript\n * type TestEvents = {\n * load: [event: { type: 'load' }];\n * event: [event: { type: 'event' }];\n * };\n *\n * class Test extends EventProvider<TestEvents> {}\n *\n * const test = new Test();\n * test.once('load', (data) => {});\n * test.emit('load', { type: 'load' });\n *\n * test.on('event', (data) => {});\n * test.emit('event', { type: 'event' });\n * ```\n */\nexport class EventProvider<EventMap extends Record<string, any[]> = Record<string, any[]>> {\n /**\n * Stores registered event listeners.\n */\n private registeredEvents: {\n [K in keyof EventMap]?: Array<(this: this, ...args: EventMap[K]) => any>;\n } = {};\n\n /**\n * Emits an event to all registered listeners.\n * Returns an array of return values from the listeners.\n * @param eventName The name of the event.\n * @param args Arguments to pass to the listeners.\n */\n emit<K extends keyof EventMap>(eventName: K, ...args: EventMap[K]): any[] {\n const listeners = this.registeredEvents[eventName] || [];\n\n return listeners.map((listener) => listener.apply(this, args));\n }\n\n /**\n * Registers an event listener.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n on<K extends keyof EventMap>(\n eventName: K,\n callback: (this: this, ...args: EventMap[K]) => any,\n ): this {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n if (!this.registeredEvents[eventName]) {\n this.registeredEvents[eventName] = [];\n }\n\n this.registeredEvents[eventName]!.push(callback);\n\n return this;\n }\n\n /**\n * Removes a specific event listener.\n * @param eventName The name of the event.\n * @param callback The callback function to remove.\n */\n off<K extends keyof EventMap>(\n eventName: K,\n callback?: (this: this, ...args: EventMap[K]) => any,\n ): this {\n const listeners = this.registeredEvents[eventName] || [];\n\n if (!callback) {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n\n this.registeredEvents[eventName] = listeners.filter((fn) => fn !== callback);\n\n return this;\n }\n\n /**\n * Registers a listener that is executed only once.\n * @param eventName The name of the event.\n * @param callback The callback function.\n */\n once<K extends keyof EventMap>(\n eventName: K,\n callback: (this: this, ...args: EventMap[K]) => any,\n ): this {\n const wrapper = (...args: EventMap[K]) => {\n this.off(eventName, wrapper);\n callback.apply(this, args);\n };\n\n this.on(eventName, wrapper);\n\n return this;\n }\n\n /**\n * Removes all listeners for a specific event.\n * @param eventName The name of the event.\n */\n removeAllListeners<K extends keyof EventMap>(eventName: K): this {\n this.registeredEvents[eventName] = [];\n\n return this;\n }\n}\n","import { Client } from '../client/client.js';\nimport { usedClients } from '../internal.js';\nimport { EventProvider } from './EventProvider.js';\n\nconst getUsedClients = (): Client[] => {\n try {\n return usedClients;\n } catch {\n return [];\n }\n};\n\ntype QueueEvents<T> = {\n load: [];\n cancel: [];\n update: [\n queue: QueueItem<T>[],\n priorityQueue: QueueItem<T>[],\n history: QueueItem<T>[],\n timeouts: Array<ReturnType<typeof setTimeout>>,\n ];\n process: [item: QueueItem<T>, queue: useQueue<T>];\n};\n\ntype QueueProps = {\n isoDate: string;\n isLoop: boolean;\n isPriority: boolean;\n isImmediate: boolean;\n};\n\ntype QueueItem<T> = { value: T } & QueueProps;\n\ntype QueueProcessor<T> = (this: useQueue<T>, item: T, queue: useQueue<T>) => Promise<any>;\n\ntype QueueDuration = number | boolean | undefined;\n\ninterface QueueOptions<T> {\n /**\n * Duration between processing each item in milliseconds. Set to `0` or `false` for immediate processing.\n */\n duration?: QueueDuration | 'client';\n /**\n * Function to process each item in the queue.\n */\n processor: QueueProcessor<T>;\n}\n\n/**\n * A utility class to manage a queue of items with support for priority, looping, and immediate processing.\n * @template T - The type of items in the queue.\n * @extends EventProvider<QueueEvents<T>>\n * @example\n * ```javascript\n * const myQueue = new useQueue({\n * duration: 1000,\n * processor: async function (item) {\n * console.log('Processing item:', item);\n * },\n * });\n *\n * myQueue.enqueue('Item 1');\n * myQueue.enqueue('Item 2', { isPriority: true });\n * ```\n */\nexport class useQueue<T> extends EventProvider<QueueEvents<T>> {\n queue: QueueItem<T>[] = [];\n priorityQueue: QueueItem<T>[] = [];\n history: QueueItem<T>[] = [];\n\n private timeouts: Array<ReturnType<typeof setTimeout>> = [];\n\n public running: boolean = false;\n\n public duration: QueueDuration = undefined;\n\n private loaded: boolean = false;\n\n public processor!: QueueProcessor<T>;\n\n private readonly clientWaitRetryDelay = 50;\n\n constructor(options: QueueOptions<T>) {\n super();\n\n if (!options.processor || typeof options.processor !== 'function') {\n throw new Error('A valid processor function must be provided to useQueue.');\n }\n\n this.processor = options.processor;\n\n if (options.duration !== 'client') this.duration = options.duration ?? 0;\n\n this.waitForClientAndBindLoad(options.duration);\n }\n\n private waitForClientAndBindLoad(\n duration: QueueDuration | 'client' = this.duration,\n callback?: () => void,\n ) {\n const clients = getUsedClients();\n\n if (!clients.length) {\n setTimeout(\n () => this.waitForClientAndBindLoad(duration, callback),\n this.clientWaitRetryDelay,\n );\n\n return;\n }\n\n const client = clients[0];\n\n client.on('load', () => {\n if (duration === 'client') this.duration = (client.fields?.widgetDuration ?? 0) as number;\n\n this.emit('load');\n\n this.loaded = true;\n if (callback) callback();\n });\n }\n\n /**\n * Enqueue an item or multiple items into the queue with optional processing options.\n * @param value - The item or items to be enqueued. Can be a single value of type T or an array of objects containing the value and options.\n * @param options - Optional processing options for the item(s) being enqueued. Ignored if an array of items is provided, as each item can have its own options.\n * @returns The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.enqueue('Single Item', { isPriority: true });\n * myQueue.enqueue([\n * { value: 'Item 1', options: { isPriority: true } },\n * { value: 'Item 2', options: { isLoop: true } }\n * ]);\n * ```\n */\n public enqueue(value: T, options?: Partial<QueueProps>): this;\n public enqueue(items: { value: T; options?: Partial<QueueProps> }[]): this;\n public enqueue(\n valueOrItems: T | { value: T; options?: Partial<QueueProps> }[],\n options: Partial<QueueProps> = {},\n ): this {\n const hadItems = this.hasItems();\n\n const entries: { value: T; options: Partial<QueueProps> }[] = Array.isArray(valueOrItems)\n ? valueOrItems.map((entry) => ({ value: entry.value, options: entry.options ?? {} }))\n : [{ value: valueOrItems as T, options }];\n\n for (const entry of entries) {\n const item: QueueItem<T> = {\n isoDate: new Date().toISOString(),\n isLoop: entry.options?.isLoop ?? false,\n isPriority: entry.options?.isPriority ?? false,\n isImmediate: entry.options?.isImmediate ?? false,\n value: entry.value,\n };\n\n if (item.isPriority && item.isImmediate) {\n this.cancel();\n this.priorityQueue.unshift(item);\n } else {\n const targetQueue = item.isPriority ? this.priorityQueue : this.queue;\n\n targetQueue.push(item);\n }\n }\n\n // Always process immediately if it's not running and the queue was empty before\n if (this.running === false && hadItems === false) {\n this.run();\n }\n\n this.emit('update', this.queue, this.priorityQueue, this.history, this.timeouts);\n\n return this;\n }\n\n private async run() {\n if (!this.hasItems()) {\n this.running = false;\n return;\n }\n\n this.running = true;\n\n await this.next();\n\n if (typeof this.duration === 'number' && this.duration > 0) {\n this.timeouts.push(setTimeout(() => this.run(), this.duration));\n } else if (this.duration === 0 || (this.duration !== -1 && this.duration !== false)) {\n this.run();\n }\n }\n\n private async next() {\n const nextItem =\n this.priorityQueue.length > 0 ? this.priorityQueue.shift() : this.queue.shift();\n\n if (!nextItem) {\n this.running = false;\n\n return;\n }\n\n try {\n await this.processor.apply(this, [nextItem.value, this]);\n\n this.emit('process', nextItem, this);\n } catch (error) {\n console.error(\n `Error during item processing: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n this.history.push(nextItem);\n\n const targetQueue = nextItem.isPriority ? this.priorityQueue : this.queue;\n\n if (nextItem.isLoop) targetQueue.push(nextItem);\n }\n\n /**\n * Resume processing the queue if it is paused. If the queue is already running, it will be restarted, which can be useful if new items have been added or if you want to reset the processing timer.\n * If the queue was empty before, it will start processing immediately.\n * @returns - The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.resume();\n * ```\n */\n public resume() {\n if (this.running) {\n this.cancel();\n }\n\n if (this.hasItems()) this.run();\n\n return this;\n }\n\n /**\n * Update the queue's state with new values. This can be used to replace the current queue, priority queue, history, or timeouts with new data. If the queue is not currently running and there are items in the queue after the update, it will start processing immediately.\n * @param save - An object containing the new state for the queue, priority queue, history, and timeouts. Each property is optional, and if not provided, the current state will be retained.\n * @returns - The instance of the queue for chaining.\n * @example\n * ```javascript\n * myQueue.update({\n * queue: newQueueItems,\n * priorityQueue: newPriorityItems,\n * history: newHistory,\n * });\n * ```\n */\n public update(save: Partial<useQueue<T>>): this {\n this.queue = save.queue ?? this.queue;\n this.priorityQueue = save.priorityQueue ?? this.priorityQueue;\n this.history = save.history ?? this.history;\n\n if (this.hasItems() && this.running === false) {\n const client = getUsedClients()[0];\n client?.on('load', () => this.run());\n }\n\n return this;\n }\n\n /**\n * Cancel all pending timeouts and stop the queue from processing further items. This will clear any scheduled processing and prevent any new items from being processed until `resume()` is called again. The current state of the queue, priority queue, and history will be retained, allowing you to resume processing later without losing any data.\n */\n public cancel() {\n if (this.running) {\n this.timeouts.forEach((timeout) => clearTimeout(timeout));\n this.timeouts = [];\n this.running = false;\n\n this.emit('cancel');\n }\n }\n\n /**\n * Check if there are any items in the queue or priority queue. This method returns `true` if there are items waiting to be processed in either the main queue or the priority queue, and `false` if both queues are empty.\n * @returns - A boolean indicating whether there are items in the queue or priority queue.\n */\n public hasItems(): boolean {\n return this.queue.length > 0 || this.priorityQueue.length > 0;\n }\n\n public override on<K extends keyof QueueEvents<T>>(\n eventName: K,\n callback: (this: useQueue<T>, ...args: QueueEvents<T>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Data } from '../data/index.js';\nimport { BadgeOptions, MessageHelper } from '../helper/classes/message.js';\nimport { RandomHelper } from '../helper/classes/random.js';\nimport { usedClients } from '../internal.js';\nimport { ClientEvents, Provider, StreamElements, Twitch } from '../types.js';\n\n/**\n * Simulates the onWidgetLoad event for a widget.\n * @param fields - The field values to be included in the event.\n * @param session - The session data to be included in the event.\n * @param currency - The currency to be used (default is 'USD').\n * @returns A Promise that resolves to the simulated onWidgetLoad event data.\n */\nasync function onWidgetLoad(\n fields: Record<string, StreamElements.CustomField.Value>,\n session: StreamElements.Session.Data,\n currency: 'BRL' | 'USD' | 'EUR' = 'USD',\n): Promise<StreamElements.Event.onWidgetLoad> {\n const currencies = {\n BRL: { code: 'BRL', name: 'Brazilian Real', symbol: 'R$' },\n USD: { code: 'USD', name: 'US Dollar', symbol: '$' },\n EUR: { code: 'EUR', name: 'Euro', symbol: '€' },\n };\n\n return {\n channel: {\n username: 'local',\n apiToken: '',\n id: '',\n providerId: '',\n avatar: '',\n },\n currency: currencies[currency] ?? currencies.USD,\n fieldData: fields,\n recents: [],\n session: {\n data: session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: {\n isEditorMode: true,\n muted: false,\n },\n emulated: true,\n };\n}\n\n/**\n * Simulates the onSessionUpdate event for a widget.\n * @param session - The session data to be included in the event.\n * @returns A Promise that resolves to the simulated onSessionUpdate event data.\n */\nasync function onSessionUpdate(\n session?: StreamElements.Session.Data,\n update?: ClientEvents,\n): Promise<StreamElements.Event.onSessionUpdate> {\n session ??= await generate.session.get();\n\n if (update) {\n const orderByDateDesc = (a: { createdAt: string }, b: { createdAt: string }) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();\n\n switch (update.provider) {\n case 'twitch': {\n const data = update.data;\n\n switch (data.listener) {\n case 'cheer-latest': {\n const amount = data.event.amount;\n const name = data.event.displayName ?? data.event.name;\n const message = data.event.message;\n\n session['cheer-latest'] = { name, amount, message };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`cheer-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`cheer-${type}-top-donator`];\n\n const donatorCurrent = session['cheer-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['cheer-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['cheer-session'].amount += amount;\n session['cheer-week'].amount += amount;\n session['cheer-month'].amount += amount;\n session['cheer-total'].amount += amount;\n session['cheer-count'].count += 1;\n session['cheer-goal'].amount += amount;\n session['cheer-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['cheer-recent'] = (session['cheer-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'follower-latest': {\n const name = data.event.displayName ?? data.event.name;\n\n session['follower-latest'].name = name;\n\n session['follower-session'].count += 1;\n session['follower-week'].count += 1;\n session['follower-month'].count += 1;\n session['follower-total'].count += 1;\n session['follower-goal'].amount += 1;\n session['follower-recent'].unshift({\n name: name,\n createdAt: new Date().toISOString(),\n });\n session['follower-recent'] = (session['follower-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'subscriber-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n const tier = data.event.tier;\n const message = data.event.message;\n\n session['subscriber-latest'] = { name, amount, tier, message: message ?? '' };\n\n if (\n !session['subscriber-recent'].find((e) => e.name.toLowerCase() === name.toLowerCase())\n ) {\n session['subscriber-new-latest'] = { name, amount, message: message ?? '' };\n session['subscriber-new-session'].count += 1;\n } else if (amount > 1) {\n session['subscriber-resub-latest'] = { name, amount, message: message ?? '' };\n session['subscriber-resub-session'].count += 1;\n }\n\n if (!data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n // normal\n } else if (data.event.gifted && !data.event.bulkGifted && !data.event.isCommunityGift) {\n const sender = data.event.sender;\n // gift\n session['subscriber-gifted-latest'] = {\n name,\n amount,\n tier,\n message: message ?? '',\n sender,\n };\n session['subscriber-gifted-session'].count += 1;\n\n session['subscriber-alltime-gifter'] = { name: sender, amount };\n } else if (data.event.gifted && !data.event.bulkGifted && data.event.isCommunityGift) {\n // community gift spam\n } else if (!data.event.gifted && data.event.bulkGifted && !data.event.isCommunityGift) {\n // community gift\n }\n\n session['subscriber-session'].count += amount;\n session['subscriber-week'].count += amount;\n session['subscriber-month'].count += amount;\n session['subscriber-total'].count += amount;\n session['subscriber-goal'].amount += amount;\n session['subscriber-points'].amount += amount;\n\n session['subscriber-recent'].unshift({\n name: name,\n amount: amount,\n tier: tier,\n createdAt: new Date().toISOString(),\n });\n session['subscriber-recent'] = (session['subscriber-recent'] || []).sort(\n orderByDateDesc,\n );\n\n break;\n }\n case 'raid-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['raid-latest'] = { name, amount };\n\n session['raid-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['raid-recent'] = (session['raid-recent'] || []).sort(orderByDateDesc);\n break;\n }\n }\n\n break;\n }\n\n case 'youtube': {\n const data = update.data;\n\n switch (data.listener) {\n case 'superchat-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['superchat-latest'] = {\n name: name.toLowerCase(),\n displayName: name,\n amount,\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n providerId: '',\n avatar: '',\n };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`superchat-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`superchat-${type}-top-donator`];\n\n const donatorCurrent = session['superchat-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['superchat-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['superchat-session'].amount += amount;\n session['superchat-week'].amount += amount;\n session['superchat-month'].amount += amount;\n session['superchat-total'].amount += amount;\n session['superchat-count'].count += 1;\n session['superchat-goal'].amount += amount;\n session['superchat-recent'].unshift({\n name: name.toLowerCase(),\n displayName: name,\n amount: amount,\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n avatar: '',\n providerId: '',\n });\n // session['superchat-recent'] = (session['superchat-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n }\n\n break;\n }\n\n case 'streamelements': {\n const data = update.data;\n\n switch (data.listener) {\n case 'tip-latest': {\n const name = data.event.displayName ?? data.event.name;\n const amount = data.event.amount;\n\n session['tip-latest'] = { name, amount };\n\n const update = (type: 'session' | 'weekly' | 'monthly' | 'alltime' | 'all') => {\n if (type === 'all') {\n update('alltime');\n update('monthly');\n update('weekly');\n update('session');\n\n return;\n }\n\n const topDonation = session[`tip-${type}-top-donation`];\n\n if (topDonation && amount > topDonation.amount) {\n topDonation.amount = amount;\n topDonation.name = name;\n }\n\n const topDonator = session[`tip-${type}-top-donator`];\n\n const donatorCurrent = session['tip-recent']\n .filter((e) => e.name.toLowerCase() === topDonator.name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n const donatorNew = session['tip-recent']\n .filter((e) => e.name.toLowerCase() === name.toLowerCase())\n .reduce((acc, curr) => acc + curr.amount, 0);\n\n if (donatorNew > donatorCurrent) {\n topDonator.amount = donatorNew;\n topDonator.name = name;\n }\n };\n\n update('all');\n\n session['tip-session'].amount += amount;\n session['tip-week'].amount += amount;\n session['tip-month'].amount += amount;\n session['tip-total'].amount += amount;\n session['tip-count'].count += 1;\n session['tip-goal'].amount += amount;\n session['tip-recent'].unshift({\n name: name,\n amount: amount,\n createdAt: new Date().toISOString(),\n });\n session['tip-recent'] = (session['tip-recent'] || []).sort(orderByDateDesc);\n\n break;\n }\n case 'event:test': {\n break;\n }\n }\n\n break;\n }\n }\n }\n\n return { session, emulated: true };\n}\n\n/**\n * Simulates the onEventReceived event for a widget.\n * @param provider - The provider of the event (default is 'random').\n * @param type - The type of event to simulate (default is 'random').\n * @param options - Additional options to customize the event data.\n * @returns A Promise that resolves to the simulated onEventReceived event data, or null if the event type is not supported.\n * @example\n * ```javascript\n * // Simulate a random event\n * const randomEvent = await onEventReceived();\n *\n * // Simulate a Twitch message event with custom options\n * const twitchMessageEvent = await onEventReceived('twitch', 'message', { name: 'Streamer', message: 'Hello World!' });\n * ```\n */\nasync function onEventReceived(\n provider: Provider | 'random' = 'random',\n type:\n | StreamElements.Event.onEventReceived['listener']\n | 'random'\n | 'tip'\n | 'cheer'\n | 'follower'\n | 'raid'\n | 'subscriber' = 'random',\n options: Record<string, string | number | boolean> = {},\n): Promise<StreamElements.Event.onEventReceived | null> {\n const available: Record<Provider, string[]> = {\n twitch: ['message', 'follower-latest', 'cheer-latest', 'raid-latest', 'subscriber-latest'],\n streamelements: ['tip-latest'],\n youtube: ['message', 'superchat-latest', 'subscriber-latest', 'sponsor-latest'],\n kick: [],\n facebook: [],\n };\n\n switch (provider) {\n default:\n case 'random': {\n var randomProvider = new RandomHelper().array(\n Object.keys(available).filter((e) => available[e as Provider].length),\n )[0] as Provider;\n var randomEvent = new RandomHelper().array(\n available[randomProvider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return onEventReceived(randomProvider, randomEvent);\n }\n\n case 'twitch': {\n switch (\n type as\n | StreamElements.Event.Provider.Twitch.Events['listener']\n | 'random'\n | 'cheer'\n | 'follower'\n | 'raid'\n | 'subscriber'\n ) {\n default:\n case 'random': {\n var randomEvent = new RandomHelper().array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return onEventReceived(provider, randomEvent);\n }\n case 'message': {\n const data = options as Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n firstMsg: boolean;\n returningChatter: boolean;\n reply: {\n msgId: string;\n userId: string;\n login: string;\n name: string;\n text: string;\n };\n thread: {\n msgId: string;\n name: string;\n };\n }>;\n\n var name = data?.name ?? new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var message =\n data?.message ??\n new RandomHelper().array(\n [...Data.twitch_messages, ...Data.normal_messages].filter((e) => e.length),\n )[0];\n\n var badges = await new MessageHelper().generateBadges(data?.badges ?? [], provider);\n\n var emotes = new MessageHelper().findEmotesInText(message);\n var renderedText = new MessageHelper().replaceEmotesWithHTML(message, emotes);\n\n var color = (data?.color as string) ?? new RandomHelper().color('hex');\n var userId = (data?.userId as string) ?? new RandomHelper().string(16);\n var msgId = (data?.msgId as string) ?? new RandomHelper().string(16);\n var time = (data?.time as number) ?? Date.now();\n\n var channel =\n (data?.channel as string) ?? usedClients?.[0]?.details?.user?.username ?? 'local';\n\n var reply = data?.reply\n ? ({\n 'reply-parent-display-name': data.reply.name,\n 'reply-parent-msg-body': data.reply.text,\n 'reply-parent-msg-id': data.reply.msgId,\n 'reply-parent-user-id': data.reply.userId,\n 'reply-parent-user-login': data.reply.name.toLowerCase(),\n } satisfies Partial<Twitch.IRC>)\n : {};\n\n var thread = data?.thread\n ? ({\n 'reply-thread-parent-msg-id': data.thread.msgId,\n 'reply-thread-parent-user-login': data.thread.name.toLowerCase(),\n } satisfies Partial<Twitch.IRC>)\n : {};\n\n var roles = {\n vip: badges.keys.includes('vip') ? '' : undefined,\n subscriber: badges.keys.includes('subscriber') ? '1' : '0',\n mod: badges.keys.includes('moderator') ? '1' : '0',\n turbo: badges.keys.includes('turbo') ? '1' : '0',\n } as const;\n\n const event: StreamElements.Event.Provider.Twitch.Message = {\n listener: 'message',\n event: {\n service: provider,\n data: {\n time: time,\n tags: {\n 'badge-info': `${badges.keys.map((key) => `${key}/${badges.amount[key] ?? new RandomHelper().number(1, 5)}`).join(',')}`,\n badges: badges.keys.map((key) => `${key}/1`).join(','),\n\n ...roles,\n\n 'tmi-sent-ts': time.toString(),\n 'room-id': new RandomHelper().string(9, 'numbers'),\n\n 'user-id': userId,\n 'user-type': '',\n\n color: color,\n 'display-name': name,\n emotes: '',\n\n 'client-nonce': new RandomHelper().string(16),\n flags: '',\n id: msgId,\n 'first-msg': data?.firstMsg ? '1' : '0',\n 'returning-chatter': data?.returningChatter ? '1' : '0',\n\n ...reply,\n ...thread,\n },\n nick: name.toLowerCase(),\n displayName: name,\n displayColor: color,\n channel: channel,\n text: message,\n isAction: false,\n userId: userId,\n msgId: msgId,\n badges: badges.badges,\n emotes: emotes,\n },\n renderedText: renderedText,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'cheer':\n case 'cheer-latest': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(100, 10000);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(Data.normal_messages.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Cheer & {\n event: { provider: Provider };\n } = {\n listener: 'cheer-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n message: message,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'cheer',\n originalEventName: 'cheer-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'follower':\n case 'follower-latest': {\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Follower & {\n event: { provider: Provider };\n } = {\n listener: 'follower-latest',\n event: {\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'follower',\n originalEventName: 'follower-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'raid':\n case 'raid-latest': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(1, 100);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.Twitch.Raid & {\n event: { provider: Provider };\n } = {\n listener: 'raid-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'raid',\n originalEventName: 'raid-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var tier =\n (options?.tier as string) ??\n new RandomHelper().array(['1000', '2000', '3000', 'prime'])[0];\n var amount = (options?.amount as number) ?? new RandomHelper().number(1, 24);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var sender =\n (options?.sender as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length && e !== name))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(Data.normal_messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as StreamElements.Event.Provider.Twitch.gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as StreamElements.Event.Provider.Twitch.community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as StreamElements.Event.Provider.Twitch.spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? new RandomHelper().array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: StreamElements.Event.Provider.Twitch.Subscriber & {\n event: { provider: Provider };\n } = {\n listener: 'subscriber-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n tier: tier as StreamElements.Event.Provider.Twitch.SubscriberTier,\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'delete-message': {\n const event: StreamElements.Event.Provider.Twitch.DeleteMessage & {\n event: { provider: Provider };\n } = {\n listener: 'delete-message',\n event: {\n msgId: (options?.id as string) ?? new RandomHelper().uuid(),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'delete-messages': {\n const event: StreamElements.Event.Provider.Twitch.DeleteMessages & {\n event: { provider: Provider };\n } = {\n listener: 'delete-messages',\n event: {\n userId:\n (options?.id as string) ?? new RandomHelper().number(10000000, 99999999).toString(),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'event': {\n const type = options?.type as StreamElements.Event.Provider.Twitch.Event['event']['type'];\n\n switch (type) {\n case 'channelPointsRedemption': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(1, 100);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(Data.normal_messages.filter((e) => e.length))[0];\n var redemption =\n (options?.redemption as string) ??\n new RandomHelper().array([\n 'Highlight Message',\n 'Send a Shoutout',\n 'Drink Water',\n ])[0];\n var quantity = (options?.quantity as number) ?? 1;\n var providerId = (options?.providerId as string) ?? new RandomHelper().uuid();\n var id = (options?.id as string) ?? new RandomHelper().uuid();\n var channel =\n (options?.channel as string) ??\n (options?.broadcaster as string) ??\n (options?.streamer as string) ??\n usedClients?.[0]?.details?.user?.username ??\n 'local';\n var activityId = (options?.activityId as string) ?? new RandomHelper().uuid();\n var time = (options?.time as number) ?? Date.now();\n\n const event: StreamElements.Event.Provider.Twitch.Event = {\n listener: 'event',\n event: {\n type: 'channelPointsRedemption',\n _id: id,\n provider: 'twitch',\n flagged: false,\n channel: channel,\n createdAt: new Date(time).toISOString(),\n expiresAt: new Date(time + 3600000).toISOString(),\n updatedAt: new Date(time).toISOString(),\n activityId: activityId,\n sessionEventsCount: 1,\n isMock: true,\n data: {\n amount: amount,\n username: name.toLowerCase(),\n displayName: name,\n providerId: providerId,\n avatar: avatar,\n message: message,\n quantity: quantity,\n redemption: redemption,\n },\n },\n };\n\n return event;\n\n break;\n }\n case 'cheer': {\n break;\n }\n case 'follower': {\n break;\n }\n case 'subscriber': {\n break;\n }\n }\n\n break;\n }\n }\n }\n\n case 'streamelements': {\n switch (\n type as\n | StreamElements.Event.Provider.StreamElements.Events['listener']\n | 'random'\n | 'tip'\n | 'mute'\n | 'unmute'\n | 'skip'\n ) {\n default:\n case 'random': {\n var randomEvent = new RandomHelper().array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return onEventReceived(provider, randomEvent);\n }\n case 'tip':\n case 'tip-latest': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(100, 4000);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.StreamElements.Tip & {\n event: { provider: Provider };\n } = {\n listener: 'tip-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'tip',\n originalEventName: 'tip-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'kvstore:update': {\n const event: StreamElements.Event.Provider.StreamElements.KVStore & {\n event: { provider: Provider };\n } = {\n listener: 'kvstore:update',\n event: {\n data: {\n key: `customWidget.${(options?.key as string) ?? 'sampleKey'}`,\n value: (options?.value as string) ?? 'sampleValue',\n },\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'bot:counter': {\n const event: StreamElements.Event.Provider.StreamElements.BotCounter & {\n event: { provider: Provider };\n } = {\n listener: 'bot:counter',\n event: {\n counter: (options?.counter as string) ?? 'sampleCounter',\n value: (options?.value as number) ?? new RandomHelper().number(0, 100),\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'mute':\n case 'unmute':\n case 'alertService:toggleSound': {\n var muted =\n (options?.muted as boolean) ?? usedClients?.[0]?.details?.overlay?.muted ?? false;\n\n const event: StreamElements.Event.Provider.StreamElements.AlertService & {\n event: { provider: Provider };\n } = {\n listener: 'alertService:toggleSound',\n event: {\n muted,\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'skip':\n case 'event:skip': {\n const event: StreamElements.Event.Provider.StreamElements.EventSkip & {\n event: { provider: Provider };\n } = {\n listener: 'event:skip',\n event: {\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n\n case 'youtube': {\n switch (\n type as\n | StreamElements.Event.Provider.YouTube.Events['listener']\n | 'random'\n | 'message'\n | 'superchat'\n | 'subscriber'\n | 'sponsor'\n ) {\n default:\n case 'random': {\n var randomEvent = new RandomHelper().array(\n available[provider],\n )[0] as StreamElements.Event.onEventReceived['listener'];\n\n return onEventReceived(provider, randomEvent);\n }\n case 'message': {\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(\n [...Data.youtube_messages, ...Data.normal_messages].filter((e) => e.length),\n )[0];\n\n const badges = await new MessageHelper().generateBadges(\n (options?.badges as BadgeOptions) ?? [],\n provider,\n );\n\n var emotes = new MessageHelper().findEmotesInText(message);\n var renderedText = new MessageHelper().replaceEmotesWithHTML(message, emotes);\n\n var color = (options?.color as string) ?? new RandomHelper().color('hex');\n var userId =\n (options?.userId as string) ?? new RandomHelper().number(10000000, 99999999).toString();\n var msgId = (options?.msgId as string) ?? new RandomHelper().uuid();\n var time = (options?.time as number) ?? Date.now();\n\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n\n var channel =\n (options?.channel as string) ?? usedClients?.[0]?.details?.user?.username ?? 'local';\n\n const event: StreamElements.Event.Provider.YouTube.Message = {\n listener: 'message',\n event: {\n service: provider,\n data: {\n kind: '',\n etag: '',\n id: '',\n snippet: {\n type: '',\n liveChatId: '',\n authorChannelId: channel,\n publishedAt: new Date().toISOString(),\n hasDisplayContent: true,\n displayMessage: message,\n textMessageDetails: {\n messageText: message,\n },\n },\n authorDetails: {\n channelId: channel,\n channelUrl: '',\n displayName: name,\n profileImageUrl: avatar,\n ...badges,\n },\n msgId: msgId,\n userId: userId,\n nick: name.toLowerCase(),\n badges: [],\n displayName: name,\n isAction: false,\n time: time,\n tags: [],\n displayColor: color,\n channel: channel,\n text: message,\n avatar: avatar,\n emotes: [],\n },\n renderedText: message,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'subscriber':\n case 'subscriber-latest': {\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.YouTube.Subscriber & {\n event: { provider: Provider };\n } = {\n listener: 'subscriber-latest',\n event: {\n avatar,\n displayName: name,\n name: name.toLowerCase(),\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'subscriber',\n originalEventName: 'subscriber-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'superchat':\n case 'superchat-latest': {\n var amount = (options?.amount as number) ?? new RandomHelper().number(100, 4000);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n\n const event: StreamElements.Event.Provider.YouTube.Superchat & {\n event: { provider: Provider };\n } = {\n listener: 'superchat-latest',\n event: {\n amount,\n avatar,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'superchat',\n originalEventName: 'superchat-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n case 'sponsor':\n case 'sponsor-latest': {\n var tier =\n (options?.tier as string) ?? new RandomHelper().array(['1000', '2000', '3000'])[0];\n var amount = (options?.amount as number) ?? new RandomHelper().number(1, 24);\n var avatar = (options?.avatar as string) ?? new RandomHelper().array(Data.avatars)[0];\n var name =\n (options?.name as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length))[0];\n var sender =\n (options?.sender as string) ??\n new RandomHelper().array(Data.names.filter((e) => e.length && e !== name))[0];\n var message =\n (options?.message as string) ??\n new RandomHelper().array(Data.normal_messages.filter((e) => e.length))[0];\n\n var addons = {\n default: {\n avatar,\n playedAsCommunityGift: false,\n },\n gift: {\n sender,\n gifted: true,\n } as StreamElements.Event.Provider.YouTube.gift,\n community: {\n message,\n sender,\n bulkGifted: true,\n } as StreamElements.Event.Provider.YouTube.community,\n spam: {\n sender,\n gifted: true,\n isCommunityGift: true,\n } as StreamElements.Event.Provider.YouTube.spam,\n };\n\n var subTypes = ['default', 'gift', 'community', 'spam'];\n var subType = (options?.subType as string) ?? new RandomHelper().array(subTypes)[0];\n\n subType = subTypes.includes(subType) ? subType : 'default';\n\n const event: StreamElements.Event.Provider.YouTube.Sponsor & {\n event: { provider: Provider };\n } = {\n listener: 'sponsor-latest',\n event: {\n amount,\n name: name.toLowerCase(),\n displayName: name,\n providerId: '',\n\n ...addons.default,\n ...addons[subType as keyof typeof addons],\n\n _id: new RandomHelper().uuid(),\n sessionTop: false,\n type: 'sponsor',\n originalEventName: 'sponsor-latest',\n provider,\n },\n // @ts-ignore\n emulated: true,\n };\n\n return event;\n }\n }\n }\n }\n}\n\nexport class Generator {\n event = { onWidgetLoad, onSessionUpdate, onEventReceived };\n session = {\n types: {\n name: { type: 'string', options: Data.names.filter((e) => e.length) },\n tier: { type: 'string', options: Data.tiers.filter((e) => e.length) },\n message: { type: 'string', options: Data.normal_messages.filter((e) => e.length) },\n item: { type: 'array', options: Data.items },\n avatar: { type: 'string', options: Data.avatars.filter((e) => e.length) },\n } as Record<string, StreamElements.Session.Config.Any>,\n\n available(): StreamElements.Session.Config.Available.Data {\n const types = this.types;\n\n return {\n follower: {\n latest: { name: types.name },\n session: { count: { type: 'int', min: 50, max: 200 } },\n week: { count: { type: 'int', min: 200, max: 1000 } },\n month: { count: { type: 'int', min: 1000, max: 3000 } },\n goal: { amount: { type: 'int', min: 3000, max: 7000 } },\n total: { count: { type: 'int', min: 7000, max: 10000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: { name: types.name, createdAt: { type: 'date', range: 400 } },\n },\n },\n subscriber: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n message: types.message,\n },\n 'new-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'resub-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n },\n 'gifted-latest': {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n message: types.message,\n tier: types.tier,\n sender: types.name,\n },\n session: { count: { type: 'int', min: 10, max: 40 } },\n 'new-session': { count: { type: 'int', min: 10, max: 40 } },\n 'resub-session': { count: { type: 'int', min: 10, max: 40 } },\n 'gifted-session': { count: { type: 'int', min: 10, max: 40 } },\n week: { count: { type: 'int', min: 40, max: 100 } },\n month: { count: { type: 'int', min: 100, max: 200 } },\n goal: { amount: { type: 'int', min: 200, max: 300 } },\n total: { count: { type: 'int', min: 300, max: 400 } },\n points: { amount: { type: 'int', min: 100, max: 400 } },\n 'alltime-gifter': { name: types.name, amount: { type: 'int', min: 300, max: 400 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 10, max: 30 },\n tier: types.tier,\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n host: {\n latest: { name: types.name, amount: { type: 'int', min: 1, max: 10 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 1, max: 10 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n raid: {\n latest: { name: types.name, amount: { type: 'int', min: 0, max: 100 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n charityCampaignDonation: {\n latest: { name: types.name, amount: { type: 'int', min: 50, max: 150 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 50, max: 200 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 500 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 800 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1000 },\n },\n 'session-top-donator': { name: types.name, amount: { type: 'int', min: 50, max: 200 } },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 200, max: 500 } },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 800 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1000 },\n },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 50, max: 150 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheer: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 800 },\n message: types.message,\n },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 1000 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 5000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 5000, max: 12000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 12000, max: 20000 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 1000 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 5000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 5000, max: 12000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 12000, max: 20000 },\n },\n session: { amount: { type: 'int', min: 200, max: 1000 } },\n week: { amount: { type: 'int', min: 1000, max: 5000 } },\n month: { amount: { type: 'int', min: 5000, max: 12000 } },\n goal: { amount: { type: 'int', min: 12000, max: 18000 } },\n total: { amount: { type: 'int', min: 18000, max: 20000 } },\n count: { count: { type: 'int', min: 200, max: 1000 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 800 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n cheerPurchase: {\n latest: { name: types.name, amount: { type: 'int', min: 200, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 400, max: 800 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1500 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1500, max: 2000 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n },\n 'weekly-top-donator': { name: types.name, amount: { type: 'int', min: 400, max: 800 } },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 800, max: 1500 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1500, max: 2000 },\n },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 200, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n superchat: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n hypetrain: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n active: { type: 'int', min: 0, max: 1 },\n level: { type: 'int', min: 5, max: 10 },\n levelChanged: { type: 'int', min: 0, max: 5 },\n _type: { type: 'array', options: ['follower', 'subscriber', 'cheer', 'donation'] },\n },\n 'level-goal': { amount: { type: 'int', min: 0, max: 100 } },\n 'level-progress': {\n amount: { type: 'int', min: 0, max: 100 },\n percent: { type: 'int', min: 0, max: 100 },\n },\n total: { amount: { type: 'int', min: 0, max: 100 } },\n 'latest-top-contributors': { type: 'recent', amount: 25, value: { name: types.name } },\n },\n 'channel-points': {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n message: types.message,\n redemption: { type: 'array', options: ['Reward 1', 'Reward 2', 'Reward 3'] },\n },\n },\n tip: {\n latest: { name: types.name, amount: { type: 'int', min: 100, max: 400 } },\n 'session-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donation': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n 'session-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 100, max: 500 },\n },\n 'weekly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 500, max: 1000 },\n },\n 'monthly-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 1000, max: 2000 },\n },\n 'alltime-top-donator': {\n name: types.name,\n amount: { type: 'int', min: 2000, max: 2500 },\n },\n session: { amount: { type: 'int', min: 100, max: 500 } },\n week: { amount: { type: 'int', min: 500, max: 1000 } },\n month: { amount: { type: 'int', min: 1000, max: 2000 } },\n goal: { amount: { type: 'int', min: 2000, max: 2300 } },\n total: { amount: { type: 'int', min: 2300, max: 2500 } },\n count: { count: { type: 'int', min: 100, max: 500 } },\n recent: {\n type: 'recent',\n amount: 25,\n value: {\n name: types.name,\n amount: { type: 'int', min: 100, max: 400 },\n createdAt: { type: 'date', range: 400 },\n },\n },\n },\n merch: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n items: types.item,\n },\n 'goal-orders': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-items': { amount: { type: 'int', min: 0, max: 100 } },\n 'goal-total': { amount: { type: 'int', min: 0, max: 100 } },\n recent: { type: 'recent', amount: 25, value: { name: types.name } },\n },\n purchase: {\n latest: {\n name: types.name,\n amount: { type: 'int', min: 0, max: 100 },\n items: types.item,\n avatar: types.avatar,\n message: types.message,\n },\n },\n };\n },\n\n async get(startSession?: StreamElements.Session.Data): Promise<StreamElements.Session.Data> {\n const available = this.available();\n\n if (startSession) return startSession;\n\n const generate = (\n available:\n | StreamElements.Session.Config.Available.Data\n | StreamElements.Session.Config.Available.Category\n | StreamElements.Session.Config.Any,\n ): any => {\n const generateRecentData = (config: StreamElements.Session.Config.Any): Array<any> => {\n if (!config || !('amount' in config)) return [];\n\n const items: Array<{ createdAt: string }> = [];\n\n for (let i = 0; i < config.amount; i++) {\n items.push(generate(config.value));\n }\n\n return items.sort(\n (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n };\n\n const generateObjectData = (config: Record<string, any>): Record<string, any> => {\n const result: Record<string, any> = {};\n\n for (const key in config) {\n const processedKey = key.replace('_type', 'type');\n\n result[processedKey] = generate(config[key]);\n }\n\n return result;\n };\n\n const processTypedConfig = (config: StreamElements.Session.Config.Any): any => {\n if (!config) return config;\n\n switch (config.type) {\n case 'int':\n return new RandomHelper().number(config.min, config.max);\n case 'string':\n return new RandomHelper().array(config.options)[0];\n case 'date':\n return new RandomHelper().daysOffset(config.range);\n case 'array':\n return new RandomHelper().array(config.options)[0];\n case 'recent':\n return generateRecentData(config);\n default:\n return config;\n }\n };\n\n // Main generation logic\n\n // Handle primitive values (non-objects)\n if (typeof available !== 'object' || available === null) {\n return available;\n }\n\n // Handle typed configurations (objects with a 'type' property)\n if ('type' in available && typeof available.type === 'string') {\n return processTypedConfig(available);\n }\n\n // Handle generic objects - recursively process each property\n return generateObjectData(available);\n };\n\n var session: StreamElements.Session.Data = Object.entries(generate(available)).reduce(\n (acc, [key, value]) => {\n Object.entries(value as any).forEach(\n ([subKey, subValue]) =>\n //\n (acc[`${key}-${subKey}`] = subValue),\n );\n\n return acc;\n },\n {} as Record<string, any>,\n ) as StreamElements.Session.Data;\n\n return session;\n },\n };\n}\n\nexport const generate = new Generator();\n","import { Helper } from '../helper/index.js';\nimport { usedClients } from '../internal.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { StreamElements } from '../types.js';\nimport { generate } from './generator.js';\n\nexport type localQueueItem =\n | { listener: 'onEventReceived'; data: StreamElements.Event.onEventReceived; session?: boolean }\n | { listener: 'onWidgetLoad'; data: StreamElements.Event.onWidgetLoad }\n | { listener: 'onSessionUpdate'; data: StreamElements.Event.onSessionUpdate };\n\n/**\n * Processes local emulator events one at a time.\n * Each event is dispatched on `window`, and session-aware\n * `onEventReceived` events also emit an `onSessionUpdate`.\n */\nexport const localQueue = new useQueue<localQueueItem>({\n duration: 'client',\n processor: async function processor(received) {\n window.dispatchEvent(new CustomEvent(received.listener, { detail: received.data }));\n\n if (received.listener === 'onEventReceived' && received.session) {\n const sessionEvent = await generate.event.onSessionUpdate(\n usedClients?.[0] ? usedClients[0].session : undefined,\n Helper.event.parseProvider(received.data),\n );\n\n window.dispatchEvent(new CustomEvent('onSessionUpdate', { detail: sessionEvent }));\n }\n },\n});\n","import { usedClients } from '../internal.js';\nimport { localQueue } from '../local/queue.js';\nimport { useQueue } from '../modules/useQueue.js';\nimport { StreamElements } from '../types/streamelements/main.js';\n\nexport const LOCAL_SE_API: StreamElements.SE_API & {\n store: { list: Record<string, any> };\n events: { history: Array<{ detail: any; timestamp: number; origin?: string }> };\n} = {\n responses: {} as Record<string, any>,\n\n sendMessage(message: string, data: Record<string, any> = {}) {\n return new Promise((resolve, reject) => {\n const response = 'resp_' + Math.random().toString(36).substring(2, 15);\n\n data.response = response;\n data.request = message;\n\n SE_API.responses[response] = { resolve, reject };\n\n parent?.postMessage(data, '*');\n });\n },\n\n counters: {\n get(key: string): number | null {\n return null;\n },\n },\n\n store: {\n set: function (name: string, obj: any) {\n this.list[name] = obj;\n\n localStorage.setItem('SE_API-STORE', JSON.stringify(LOCAL_SE_API.store.list));\n },\n get: async function (name: string) {\n if (this.list[name]) return this.list[name];\n else return null;\n },\n /** @private */\n list: {} as Record<string, any>,\n },\n\n resumeQueue: () => {\n try {\n if (localQueue instanceof useQueue) {\n localQueue?.resume();\n }\n } catch (error) {\n return { ok: false, error };\n }\n\n return { ok: true };\n },\n\n sanitize(message: string): string {\n return message;\n },\n\n cheerFilter(message: string): string {\n return message;\n },\n\n setField(key: string, value: string | number | boolean | undefined, reload: boolean) {},\n\n getOverlayStatus: () => {\n return {\n isEditorMode: false,\n muted: false,\n };\n },\n\n events: {\n /**\n * Emit a event for all widgets inside the same overlay. This is useful for communicating between widgets.\n * @param event - The name of the event to emit. This can be any string, but it's recommended to use a unique prefix to avoid conflicts with other widgets.\n * @param data - The data to send with the event. This can be any object.\n * @returns An object with an `ok` property indicating whether the event was emitted successfully.\n */\n emit<T extends Record<string, any>>(event: string, data: T) {\n const eventObj = {\n listener: event,\n event: data,\n result: undefined,\n };\n\n const customEvent = new CustomEvent('onEventReceived', { detail: eventObj });\n\n this.history.push({\n detail: eventObj,\n timestamp: customEvent.timeStamp,\n origin: usedClients?.[0]?.id,\n });\n\n localStorage.setItem('SE_API-EVENTS', JSON.stringify(this.history));\n\n return window.dispatchEvent(customEvent) ? { ok: true } : { ok: false };\n },\n /**\n * Broadcast a event to all widgets in all overlays. This is useful for communicating between different overlays.\n * @param event - The name of the event to broadcast. This can be any string, but it's recommended to use a unique prefix to avoid conflicts with other widgets.\n * @param data - The data to send with the event. This can be any object.\n * @returns An object with an `ok` property indicating whether the event was successfully broadcasted.\n */\n broadcast<T extends Record<string, any>>(event: string, data: T): { ok: boolean } {\n const eventObj = {\n listener: event,\n event: data,\n result: undefined,\n };\n\n const customEvent = new CustomEvent('onEventReceived', { detail: eventObj });\n\n this.history.push({\n detail: eventObj,\n timestamp: Date.now(),\n origin: usedClients?.[0]?.id,\n });\n\n localStorage.setItem('SE_API-EVENTS', JSON.stringify(this.history));\n\n return window.dispatchEvent(customEvent) ? { ok: true } : { ok: false };\n },\n\n history: [],\n },\n};\n","import type { StreamElements } from '../types.js';\n\nimport { LOCAL_SE_API } from '../streamelements/api.js';\n\nexport const USE_SE_API: Promise<StreamElements.SE_API> =\n typeof SE_API !== 'undefined' ? Promise.resolve(SE_API) : Promise.resolve(initializeLocalSEAPI());\n\nexport async function initializeLocalSEAPI() {\n let lastStore = localStorage.getItem('SE_API-STORE') ?? '{}';\n let result = lastStore ? JSON.parse(lastStore) : {};\n\n LOCAL_SE_API.store.list = result;\n\n let lastEvents = localStorage.getItem('SE_API-EVENTS') ?? '[]';\n let eventsResult = lastEvents ? JSON.parse(lastEvents) : [];\n\n LOCAL_SE_API.events.history = eventsResult;\n\n return LOCAL_SE_API;\n}\n","import type { JSONObject } from '../types/json.js';\nimport type { PathValue } from '../types/path.js';\nimport type { StreamElements } from '../types/streamelements/main.js';\n\nimport { ObjectHelper } from '../helper/classes/object.js';\nimport { usedStorages } from '../internal.js';\nimport { EventProvider } from './EventProvider.js';\nimport { USE_SE_API } from './SE_API.js';\n\ntype UseStorageEvents<T> = {\n load: [T];\n update: [T, from: string];\n save: [T];\n};\n\ntype UseStorageOptions<T> = {\n /** The unique identifier for the storage instance. */\n id?: string;\n data: T;\n};\n\nexport class useStorage<T extends JSONObject> extends EventProvider<UseStorageEvents<T>> {\n private SE_API: StreamElements.SE_API | null = null;\n\n /** The unique identifier for the storage instance. */\n public id: string = 'default';\n public loaded: boolean = false;\n\n private initial!: T;\n public data!: T;\n\n constructor(options: UseStorageOptions<T>) {\n super();\n\n this.id = options.id || this.id;\n this.data = options.data || ({} as T);\n this.initial = structuredClone(this.data);\n\n usedStorages.push(this);\n\n USE_SE_API?.then((se) => {\n this.SE_API = se;\n\n se!.store\n .get<T>(this.id)\n .then((save) => {\n this.data = save || this.data;\n\n this.loaded = true;\n\n this.emit('load', this.data);\n\n if (JSON.stringify(this.data) !== JSON.stringify(save)) {\n this.emit('update', this.data, 'internal');\n }\n })\n .catch(() => {\n this.loaded = true;\n\n this.emit('load', this.data);\n });\n });\n }\n\n /**\n * Saves the current data to storage.\n * @param data Data to save (defaults to current)\n */\n private save(data: T = this.data): void {\n if (this.loaded && this.SE_API) {\n if (new ObjectHelper().isDiff(this.data, data)) {\n this.data = data;\n\n this.SE_API.store.set<T>(this.id, this.data);\n\n this.emit('save', this.data);\n }\n } else {\n throw new Error('Storage not loaded yet');\n }\n }\n\n /**\n * Updates the storage data and emits an update event\n * @param data Data to update (defaults to current)\n */\n public update(data: Partial<T> = this.data): void {\n if (this.loaded && new ObjectHelper().isDiff(this.data, data)) {\n const newData = { ...this.data, ...data };\n\n this.save(newData);\n\n this.emit('update', newData, 'internal:update');\n } else if (!this.loaded) {\n throw new Error('Storage not loaded yet');\n }\n }\n\n /**\n * Adds a value to the storage at the specified path.\n * @param path Path to add the value to\n * @param value Value to add\n */\n public add<P extends string>(path: P, value: PathValue<T, P>): void {\n if (!this.loaded) {\n throw new Error('Storage not loaded yet');\n }\n\n let newData = structuredClone(this.data);\n\n newData = new ObjectHelper().updateViaPath(newData, path, value);\n\n this.save(newData);\n\n this.emit('update', newData, 'internal:add');\n }\n\n /**\n * Clears all data from the storage.\n */\n public clear(): void {\n if (this.loaded) {\n this.save(this.initial);\n\n this.emit('update', this.data, 'internal:clear');\n } else {\n throw new Error('Storage not loaded yet');\n }\n }\n\n public override on<K extends keyof UseStorageEvents<T>>(\n eventName: K,\n callback: (this: useStorage<T>, ...args: UseStorageEvents<T>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [this.data] as UseStorageEvents<T>[K]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { Button } from '../actions/button.js';\nimport { Command } from '../actions/command.js';\nimport { usedClients } from '../internal.js';\nimport { EventProvider } from '../modules/EventProvider.js';\nimport { useStorage } from '../modules/useStorage.js';\nimport { ClientEventTuple, Provider } from '../types/client.js';\nimport { StreamElements } from '../types/streamelements/main.js';\nimport { Alejo } from '../utils/alejo.js';\n\ntype ClientMapEvents<CustomEvents = {}> = {\n load: [event: StreamElements.Event.onWidgetLoad];\n action: [action: Button | Command, type: 'created' | 'executed' | 'removed'];\n session: [session: StreamElements.Session.Data];\n event: ClientEventTuple<CustomEvents>;\n};\n\nexport type ClientStorageOptions<T> = {\n value: T;\n timestamp: number;\n expire: number;\n};\n\nexport type ClientStorage = {\n user: Record<string, ClientStorageOptions<string>>;\n avatar: Record<string, ClientStorageOptions<string>>;\n pronoun: Record<string, ClientStorageOptions<Alejo.Pronouns.name>>;\n emote: Record<string, ClientStorageOptions<string>>;\n};\n\nexport type ClientOptions = {\n id?: string;\n debug?: boolean | (() => boolean);\n};\n\nexport class Client<CustomEvents = {}> extends EventProvider<ClientMapEvents<CustomEvents>> {\n public id: string = 'default';\n public debug: boolean = false;\n\n public storage!: useStorage<ClientStorage>;\n\n public fields: StreamElements.Event.onWidgetLoad['fieldData'] = {};\n\n public session!: StreamElements.Session.Data;\n\n public loaded: boolean = false;\n\n constructor(options: ClientOptions) {\n super();\n\n this.id = options.id || this.id;\n\n this.storage = new useStorage<ClientStorage>({\n id: this.id,\n data: {\n user: {},\n avatar: {},\n pronoun: {},\n emote: {},\n },\n });\n\n this.on('load', () => {\n this.debug = Boolean(typeof options.debug === 'function' ? options.debug() : options.debug);\n });\n\n usedClients.push(this as Client);\n }\n\n public actions: {\n commands: Command[];\n buttons: Button[];\n } = {\n commands: [],\n buttons: [],\n };\n\n public details!: {\n provider: Provider | 'local';\n user: StreamElements.Event.onWidgetLoad['channel'];\n currency: StreamElements.Event.onWidgetLoad['currency'];\n overlay: StreamElements.Event.onWidgetLoad['overlay'];\n };\n\n public cache: {\n /**\n * Avatar cache duration in minutes.\n */\n avatar: number;\n /**\n * Pronoun cache duration in minutes.\n */\n pronoun: number;\n /**\n * Emote cache duration in minutes.\n */\n emote: number;\n } = {\n avatar: 30,\n pronoun: 60,\n emote: 120,\n };\n\n override on<K extends keyof ClientMapEvents<CustomEvents>>(\n eventName: K,\n callback: (this: Client<CustomEvents>, ...args: ClientMapEvents<CustomEvents>[K]) => void,\n ): this {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this, [\n {\n channel: this.details.user,\n currency: this.details.currency,\n fieldData: this.fields,\n recents: [],\n session: {\n data: this.session,\n settings: {\n autoReset: false,\n calendar: false,\n resetOnStart: false,\n },\n },\n overlay: this.details.overlay,\n emulated: false,\n } as StreamElements.Event.onWidgetLoad,\n ] as unknown as ClientMapEvents<CustomEvents>[K]);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","import { BadgeOptions } from '../helper/classes/message.js';\nimport { StreamElements } from '../types.js';\nimport { generate } from './generator.js';\nimport { localQueue as queue } from './queue.js';\n\nexport class Emulator {\n twitch = {\n message(\n data: Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n firstMsg: boolean;\n returningChatter: boolean;\n reply: {\n msgId: string;\n userId: string;\n login: string;\n name: string;\n text: string;\n };\n thread: {\n msgId: string;\n name: string;\n };\n }> = {},\n ) {\n generate.event\n .onEventReceived('twitch', 'message', data as { [key: string]: any })\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n deleteMessage(msgId: string) {\n if (!msgId || typeof msgId !== 'string') return;\n\n const event: StreamElements.Event.Provider.Twitch.DeleteMessage = {\n listener: 'delete-message',\n event: {\n msgId: msgId,\n },\n };\n\n emulate.send('onEventReceived', event);\n },\n deleteMessages(userId: string) {\n if (!userId || typeof userId !== 'string') return;\n\n const event: StreamElements.Event.Provider.Twitch.DeleteMessages = {\n listener: 'delete-messages',\n event: {\n userId: userId,\n },\n };\n\n emulate.send('onEventReceived', event);\n },\n follower(\n data: Partial<{\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'twitch',\n 'follower-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n raid(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'twitch',\n 'raid-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n cheer(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n message: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'twitch',\n 'cheer-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n subscriber(\n data: Partial<{\n tier: '1000' | '2000' | '3000' | 'prime';\n amount: number;\n avatar: string;\n name: string;\n sender: string;\n message: string;\n subType: 'default' | 'gift' | 'community' | 'spam';\n }> & { subType?: 'default' | 'gift' | 'community' | 'spam' } = {},\n ) {\n generate.event\n .onEventReceived(\n 'twitch',\n 'subscriber-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n };\n streamelements = {\n tip(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'streamelements',\n 'tip-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n };\n youtube = {\n message(\n data: Partial<{\n name: string;\n message: string;\n badges: BadgeOptions;\n color: string;\n userId: string;\n msgId: string;\n channel: string;\n time: number;\n avatar: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived('youtube', 'message', data as { [key: string]: string | number | boolean })\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n subscriber(\n data: Partial<{\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'youtube',\n 'subscriber-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n superchat(\n data: Partial<{\n amount: number;\n avatar: string;\n name: string;\n }> = {},\n ) {\n generate.event\n .onEventReceived(\n 'youtube',\n 'superchat-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n sponsor(\n data: Partial<{\n tier: '1000' | '2000' | '3000';\n amount: number;\n avatar: string;\n name: string;\n sender: string;\n message: string;\n subType: 'default' | 'gift' | 'community' | 'spam';\n }> & { subType?: 'default' | 'gift' | 'community' | 'spam' } = {},\n ) {\n generate.event\n .onEventReceived(\n 'youtube',\n 'sponsor-latest',\n data as { [key: string]: string | number | boolean },\n )\n .then((event) => {\n if (event) {\n emulate.send('onEventReceived', event);\n }\n });\n },\n };\n\n kick = {};\n facebook = {};\n\n send<T extends 'onEventReceived' | 'onSessionUpdate' | 'onWidgetLoad'>(\n listener: T,\n event: T extends 'onEventReceived'\n ? StreamElements.Event.onEventReceived\n : T extends 'onSessionUpdate'\n ? StreamElements.Event.onSessionUpdate\n : StreamElements.Event.onWidgetLoad,\n ): void {\n if (!queue) {\n console.warn('Local queue is not initialized.');\n\n window.dispatchEvent(new CustomEvent(listener, { detail: event }));\n\n return;\n }\n\n switch (listener) {\n case 'onEventReceived': {\n queue.enqueue({\n listener,\n data: event as StreamElements.Event.onEventReceived,\n session: listener === 'onEventReceived' ? true : undefined,\n });\n\n break;\n }\n case 'onSessionUpdate': {\n queue.enqueue({\n listener,\n data: event as StreamElements.Event.onSessionUpdate,\n });\n\n break;\n }\n case 'onWidgetLoad': {\n queue.enqueue({\n listener,\n data: event as StreamElements.Event.onWidgetLoad,\n });\n\n break;\n }\n }\n }\n}\n\nexport const emulate = new Emulator();\n","import { StreamElements } from '../types/streamelements/main.js';\nimport { emulate as Emulator } from './emulator.js';\nimport { generate as Generator } from './generator.js';\nimport { localQueue, localQueueItem } from './queue.js';\n\nexport namespace Local {\n export type QueueItem = localQueueItem;\n\n export const queue = localQueue;\n export const generate = Generator;\n export const emulate = Emulator;\n\n export async function start(\n fieldsFile: string[] = ['fields.json', 'cf.json', 'field.json', 'customfields.json'],\n dataFiles: string[] = ['data.json', 'fielddata.json', 'fd.json', 'DATA.json'],\n session?: StreamElements.Session.Data,\n ) {\n const localFiles = {\n fields: fieldsFile.find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n data: dataFiles.find((file) => {\n try {\n new URL('./' + file, window.location.href);\n return true;\n } catch (error) {\n return false;\n }\n }),\n };\n\n const data: Record<string, string | number | boolean> = await fetch(\n './' + (localFiles.data ?? 'data.json'),\n {\n cache: 'no-store',\n },\n )\n .then((res) => res.json())\n .catch(() => ({}));\n\n await fetch('./' + (localFiles.fields ?? 'fields.json'), {\n cache: 'no-store',\n })\n .then((res) => res.json())\n .then(async (customfields: Record<string, StreamElements.CustomField.Schema>) => {\n const fields = Object.entries(customfields)\n .filter(([_, { value }]) => value != undefined)\n .reduce(\n (acc, [key, { value }]) => {\n if (data && data[key] !== undefined) value = data[key];\n\n acc[key] = value;\n\n return acc;\n },\n {\n ...data,\n } as Record<string, StreamElements.CustomField.Value>,\n );\n\n const load = await Local.generate.event.onWidgetLoad(\n fields,\n await Local.generate.session.get(session),\n );\n\n window.dispatchEvent(new CustomEvent('onWidgetLoad', { detail: load }));\n });\n }\n}\n","import { Data } from '../data/index.js';\nimport { RandomHelper } from '../helper/classes/random.js';\nimport { UtilsHelper } from '../helper/classes/utils.js';\nimport { fakeUserPools } from '../internal.js';\nimport { Local } from '../local/index.js';\nimport { StreamElements, Twitch } from '../types.js';\nimport { EventProvider } from './EventProvider.js';\n\nexport class FakeUser {\n public readonly id!: string;\n public readonly name!: string;\n public readonly login!: string;\n\n public badges: Twitch.tags[] = [];\n public isSubscriber: boolean = false;\n public tier?: StreamElements.Event.Provider.Twitch.SubscriberTier;\n\n constructor(\n id: string,\n name: string,\n badges: Twitch.tags[] = [],\n isSubscriber: boolean = false,\n tier?: StreamElements.Event.Provider.Twitch.SubscriberTier,\n ) {\n this.id = id;\n this.name = name;\n this.login = name.toLocaleLowerCase();\n this.badges = badges;\n this.isSubscriber = isSubscriber;\n this.tier = tier;\n }\n}\n\nexport interface FakeUserPoolOptions {\n id?: string;\n names?: string[];\n badges?: Twitch.tags[];\n minimumBadgesPerUser?: number;\n limits?: {\n [key in Twitch.tags]?: number;\n };\n fixed?: {\n [key in Twitch.tags]?: string | string[];\n };\n incompatible?: {\n [key in Twitch.tags]?: Twitch.tags | Twitch.tags[];\n };\n}\n\ntype FakeUserPoolEvents = {\n warn: [warning: Error];\n};\n\nexport const defaultIncompatibleBadges: FakeUserPoolOptions['incompatible'] = {\n broadcaster: ['moderator', 'vip', 'artist-badge'],\n moderator: ['lead_moderator'],\n no_video: ['no_audio'],\n '60-seconds_1': ['60-seconds_2', '60-seconds_3'],\n duelyst_1: ['duelyst_2', 'duelyst_3', 'duelyst_4', 'duelyst_5', 'duelyst_6', 'duelyst_7'],\n};\n\nexport const MAX_BADGES_PER_USER = 3;\n\nexport class FakeUserPool extends EventProvider<FakeUserPoolEvents> {\n public readonly users: FakeUser[] = [];\n public readonly id: string;\n\n private readonly byId: Map<string, FakeUser> = new Map();\n private readonly byName: Map<string, FakeUser> = new Map();\n private readonly byBadge: Map<Twitch.tags, FakeUser[]> = new Map();\n\n private static fixUser(user: string | FakeUser): string {\n if (typeof user === 'string') return user.trim().replace(/^@+/, '').toLocaleLowerCase();\n\n return FakeUserPool.fixUser(user.name);\n }\n\n private static getRandomSubTier(): StreamElements.Event.Provider.Twitch.SubscriberTier {\n const utils = new UtilsHelper();\n\n return (\n utils.probability({\n prime: 0.4,\n '1000': 0.3,\n '2000': 0.2,\n '3000': 0.1,\n } as {\n [key in StreamElements.Event.Provider.Twitch.SubscriberTier]: number;\n }) ?? 'prime'\n );\n }\n\n constructor(options?: FakeUserPoolOptions) {\n super();\n\n this.id = options?.id || `fake_user_pool_${Math.random().toString(36).slice(2, 10)}`;\n\n this.users = this.start(options?.names || Data.names, options?.badges, options);\n this.byId = new Map(this.users.map((user) => [user.id, user]));\n this.byName = new Map(this.users.map((user) => [user.login, user]));\n this.byBadge = new Map(\n this.users.reduce((acc, user) => {\n for (const badge of user.badges) {\n const existing = acc.get(badge) ?? [];\n acc.set(badge, [...existing, user]);\n }\n return acc;\n }, new Map<Twitch.tags, FakeUser[]>()),\n );\n\n fakeUserPools.push(this);\n }\n\n private start(\n names: string[],\n badges: Twitch.tags[] = Data.badges.map((e) => e.set_id) as Twitch.tags[],\n options?: Omit<FakeUserPoolOptions, 'badges'>,\n ): FakeUser[] {\n const normalizedNames = names\n .map((name) => name && FakeUserPool.fixUser(name))\n .filter((name) => name && name.length)\n // remove duplicates\n .filter((name, index, self) => self.indexOf(name) === index);\n\n const badgePool = badges.filter((badge, index, self) => self.indexOf(badge) === index);\n\n if (!badgePool.length || !normalizedNames.length) {\n return [];\n }\n\n const users: FakeUser[] = [];\n const minimumBadgesPerUser =\n typeof options?.minimumBadgesPerUser === 'number' && options.minimumBadgesPerUser >= 0\n ? Math.floor(options.minimumBadgesPerUser)\n : 1;\n const targetBadgesPerUser = Math.min(minimumBadgesPerUser, MAX_BADGES_PER_USER);\n const limits = options?.limits ?? {};\n const fixed = options?.fixed ?? {};\n const badgeSet = new Set(badgePool);\n const usage = new Map<Twitch.tags, number>();\n const fixedNameToBadges = new Map<string, Twitch.tags[]>();\n const remainingFixedDemand = new Map<Twitch.tags, number>();\n const incompatibleBadges = new Map<Twitch.tags, Set<Twitch.tags>>();\n let badgeCursor = 0;\n\n const getLimit = (badge: Twitch.tags): number => {\n const value = limits[badge];\n\n return typeof value === 'number' && value > 0 ? value : Number.POSITIVE_INFINITY;\n };\n\n const registerBadgeUsage = (badge: Twitch.tags): void => {\n const current = usage.get(badge) ?? 0;\n usage.set(badge, current + 1);\n };\n\n const decrementFixedDemand = (badge: Twitch.tags): void => {\n const current = remainingFixedDemand.get(badge) ?? 0;\n\n if (current <= 1) {\n remainingFixedDemand.delete(badge);\n return;\n }\n\n remainingFixedDemand.set(badge, current - 1);\n };\n\n const normalizeUserNames = (value: string | string[] | undefined): string[] => {\n if (!value) return [];\n\n if (typeof value === 'string') {\n return [FakeUserPool.fixUser(value)].filter((name): name is string => Boolean(name));\n }\n\n if (Array.isArray(value)) {\n return value.map(FakeUserPool.fixUser).filter((name): name is string => Boolean(name));\n }\n\n return [];\n };\n\n const normalizeBadges = (value: Twitch.tags | Twitch.tags[] | undefined): Twitch.tags[] => {\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n return [value];\n };\n\n const mergeIncompatibleBadges = (\n base: FakeUserPoolOptions['incompatible'],\n extra: FakeUserPoolOptions['incompatible'],\n ): Map<Twitch.tags, Twitch.tags[]> => {\n const merged = new Map<Twitch.tags, Twitch.tags[]>();\n\n for (const source of [base, extra]) {\n for (const [badge, value] of Object.entries(source ?? {}) as Array<\n [Twitch.tags, Twitch.tags | Twitch.tags[] | undefined]\n >) {\n const existing = merged.get(badge) ?? [];\n const nextValues = normalizeBadges(value);\n\n merged.set(badge, [...new Set([...existing, ...nextValues])]);\n }\n }\n\n return merged;\n };\n\n const registerIncompatiblePair = (left: Twitch.tags, right: Twitch.tags): void => {\n if (left === right) {\n return;\n }\n\n const leftSet = incompatibleBadges.get(left) ?? new Set<Twitch.tags>();\n leftSet.add(right);\n incompatibleBadges.set(left, leftSet);\n\n const rightSet = incompatibleBadges.get(right) ?? new Set<Twitch.tags>();\n rightSet.add(left);\n incompatibleBadges.set(right, rightSet);\n };\n\n const isCompatibleWithAssignedBadges = (\n badge: Twitch.tags,\n assignedBadges: Twitch.tags[],\n ): boolean => {\n if (assignedBadges.includes(badge)) {\n return false;\n }\n\n return assignedBadges.every((assignedBadge) => {\n const conflicts = incompatibleBadges.get(assignedBadge);\n\n return !conflicts?.has(badge);\n });\n };\n\n const canUseBadgeForExtras = (badge: Twitch.tags, assignedBadges: Twitch.tags[]): boolean => {\n if (!isCompatibleWithAssignedBadges(badge, assignedBadges)) {\n return false;\n }\n\n const max = getLimit(badge);\n const current = usage.get(badge) ?? 0;\n const reserved = remainingFixedDemand.get(badge) ?? 0;\n\n return current < max && current + reserved < max;\n };\n\n const canUseBadgeForFixed = (badge: Twitch.tags, assignedBadges: Twitch.tags[]): boolean => {\n if (!isCompatibleWithAssignedBadges(badge, assignedBadges)) {\n return false;\n }\n\n const max = getLimit(badge);\n const current = usage.get(badge) ?? 0;\n\n return current < max;\n };\n\n const nextAvailableBadge = (assignedBadges: Twitch.tags[]): Twitch.tags | null => {\n for (let step = 0; step < badgePool.length; step++) {\n const badge = badgePool[(badgeCursor + step) % badgePool.length];\n\n if (canUseBadgeForExtras(badge, assignedBadges)) {\n badgeCursor = (badgeCursor + step + 1) % badgePool.length;\n return badge;\n }\n }\n\n return null;\n };\n\n for (const [badge, value] of mergeIncompatibleBadges(\n defaultIncompatibleBadges,\n options?.incompatible,\n )) {\n if (!badgeSet.has(badge)) {\n continue;\n }\n\n for (const conflictingBadge of normalizeBadges(value)) {\n if (!badgeSet.has(conflictingBadge)) {\n continue;\n }\n\n registerIncompatiblePair(badge, conflictingBadge);\n }\n }\n\n for (const badge of badgePool) {\n const namesForBadge = normalizeUserNames(fixed[badge]);\n\n for (const fixedName of namesForBadge) {\n const existingBadges = fixedNameToBadges.get(fixedName) ?? [];\n\n if (!existingBadges.includes(badge)) {\n fixedNameToBadges.set(fixedName, [...existingBadges, badge]);\n }\n }\n }\n\n for (const [badge, value] of Object.entries(fixed) as Array<\n [Twitch.tags, string | string[] | undefined]\n >) {\n if (badgeSet.has(badge)) {\n continue;\n }\n\n const namesForBadge = normalizeUserNames(value);\n\n if (namesForBadge.length) {\n this.emit(\n 'warn',\n new Error(`Fixed badge \"${badge}\" is not available in the current badge pool`),\n );\n }\n }\n\n const resolvedFixedBadges = new Map<string, Twitch.tags[]>();\n\n if (minimumBadgesPerUser > MAX_BADGES_PER_USER) {\n this.emit(\n 'warn',\n new Error(\n `minimumBadgesPerUser exceeds the maximum of ${MAX_BADGES_PER_USER} and was clamped`,\n ),\n );\n }\n\n for (const name of normalizedNames) {\n const badgesForName = fixedNameToBadges.get(name) ?? [];\n const selectedFixedBadges: Twitch.tags[] = [];\n\n for (const badge of badgesForName) {\n if (selectedFixedBadges.length >= MAX_BADGES_PER_USER) {\n this.emit(\n 'warn',\n new Error(\n `User \"${name}\" has more than ${MAX_BADGES_PER_USER} fixed badges; extra badges were ignored`,\n ),\n );\n break;\n }\n\n if (!isCompatibleWithAssignedBadges(badge, selectedFixedBadges)) {\n this.emit(\n 'warn',\n new Error(\n `Fixed badge \"${badge}\" for user \"${name}\" conflicts with another fixed badge and was ignored`,\n ),\n );\n continue;\n }\n\n selectedFixedBadges.push(badge);\n }\n\n resolvedFixedBadges.set(name, selectedFixedBadges);\n\n for (const badge of selectedFixedBadges) {\n remainingFixedDemand.set(badge, (remainingFixedDemand.get(badge) ?? 0) + 1);\n }\n }\n\n for (const name of normalizedNames) {\n const selectedBadges: Twitch.tags[] = [];\n const fixedBadgesForUser = resolvedFixedBadges.get(name) ?? [];\n\n for (const fixedBadge of fixedBadgesForUser) {\n decrementFixedDemand(fixedBadge);\n\n if (!canUseBadgeForFixed(fixedBadge, selectedBadges)) {\n this.emit(\n 'warn',\n new Error(\n `Fixed badge \"${fixedBadge}\" for user \"${name}\" could not be assigned because its limit was reached`,\n ),\n );\n continue;\n }\n\n selectedBadges.push(fixedBadge);\n registerBadgeUsage(fixedBadge);\n }\n\n while (selectedBadges.length < targetBadgesPerUser) {\n const nextBadge = nextAvailableBadge(selectedBadges);\n\n if (!nextBadge) {\n break;\n }\n\n selectedBadges.push(nextBadge);\n registerBadgeUsage(nextBadge);\n }\n\n if (!selectedBadges.length) {\n this.emit('warn', new Error('Not enough badges to assign to users'));\n continue;\n }\n\n if (selectedBadges.length < targetBadgesPerUser) {\n this.emit(\n 'warn',\n new Error(\n `User \"${name}\" could only receive ${selectedBadges.length} badge(s), below the configured minimum of ${targetBadgesPerUser}`,\n ),\n );\n }\n\n const userIndex = users.length + 1;\n const isSubscriber = selectedBadges.some((badge) =>\n ['subscriber'].includes(String(badge).toLocaleLowerCase()),\n );\n\n const user = new FakeUser(\n `fake_user_${userIndex.toString().padStart(2, '0')}_${Math.random().toString(36).slice(2, 8)}+${this.id}`,\n name,\n selectedBadges,\n isSubscriber,\n isSubscriber ? FakeUserPool.getRandomSubTier() : undefined,\n );\n\n users.push(user);\n }\n\n if (users.length < normalizedNames.length) {\n this.emit(\n 'warn',\n new Error(\n 'Some users could not be assigned badges due to limits. Consider increasing limits or adding more badges.',\n ),\n );\n }\n\n return users;\n }\n\n public pick(): FakeUser | null {\n if (!this.users.length) {\n return null;\n }\n\n return new RandomHelper().array(this.users)[0];\n }\n\n public getByName(name: string): FakeUser | null {\n const key = FakeUserPool.fixUser(name);\n return this.byName.get(key) ?? null;\n }\n\n public getById(id: string): FakeUser | null {\n return this.byId.get(id) ?? null;\n }\n\n public getByBadge(badge: Twitch.tags): FakeUser[] {\n return this.byBadge.get(badge) ?? [];\n }\n\n public getToReply(\n target: { id?: string; name?: string },\n extend?: Partial<Twitch.Reply>,\n ): Twitch.Reply | null {\n let user: FakeUser | null = null;\n\n if (target?.id) {\n user = this.getById(target.id);\n }\n\n if (!user && target?.name) {\n user = this.getByName(target.name);\n }\n\n if (!user) {\n return null;\n }\n\n return {\n msgId: `fake_msg_${Math.random().toString(36).slice(2, 10)}`,\n userId: user.id,\n userLogin: user.login,\n displayName: user.name,\n msgBody: `This is a fake reply from ${user.name}`,\n ...extend,\n };\n }\n\n public buildTwitchMessage(\n messages: string[] = Data.twitch_messages,\n ): Parameters<(typeof Local)['emulate']['twitch']['message']>[0] {\n const user = this.pick();\n\n if (!user) {\n this.emit('warn', new Error('No users available to build a Twitch message'));\n return;\n }\n\n return {\n userId: user.id,\n name: user.name,\n badges: user.badges,\n message: new RandomHelper().array(messages)[0],\n };\n }\n\n public buildYouTubeMessage(\n messages: string[] = Data.youtube_messages,\n ): Parameters<(typeof Local)['emulate']['youtube']['message']>[0] {\n const user = this.pick();\n\n if (!user) {\n this.emit('warn', new Error('No users available to build a YouTube message'));\n return;\n }\n\n return {\n userId: user.id,\n name: user.name,\n badges: user.badges,\n message: new RandomHelper().array(messages)[0],\n };\n }\n}\n","import { usedComms } from '../internal.js';\nimport { StreamElements } from '../types/index.js';\nimport { EventProvider } from './EventProvider.js';\nimport { USE_SE_API } from './SE_API.js';\n\ntype MessageMap = Record<string, any>;\n\ntype MessageTuple<T extends MessageMap> = {\n [K in keyof T]: [key: K, data: T[K]];\n}[keyof T];\n\ntype BaseEvents<T extends MessageMap> = {\n load: [];\n message: MessageTuple<T>;\n};\n\ntype UseCommsOptions = {\n id?: string;\n};\n\ntype UseCommItem<T extends MessageMap> = {\n nonce: string;\n key: keyof T;\n value: T[keyof T];\n timestamp: string;\n};\n\n/**\n * A module for handling communications between different widgets inside streamelements.\n * @example\n * ```ts\n * type CommsMessages = {\n * hello: { loaded: boolean };\n * update: { value: number };\n * reload: {};\n * tags: string[];\n * }\n *\n * const comms = new useComms<CommsMessages>();\n *\n * comms.on('message', (message, data) => {\n * switch (message) {\n * case 'hello': {}\n * case 'update': {}\n * case 'reload': {}\n * case 'tags': {}\n * }\n * })\n * ```\n */\nexport class useComms<T extends MessageMap> extends EventProvider<BaseEvents<T>> {\n private SE_API: StreamElements.SE_API | null = null;\n\n public id: string = 'widget communications';\n public loaded: boolean = false;\n\n public history: Array<UseCommItem<T>> = [];\n public detected = new Set<string>();\n\n constructor(options: UseCommsOptions = {}) {\n super();\n\n this.id = options.id || this.id;\n\n usedComms.push(this);\n\n USE_SE_API?.then(async (se) => {\n this.loaded = true;\n this.SE_API = se;\n\n Promise.all([\n async () => {\n const history = await se.store.get<Array<UseCommItem<T>>>(this.id);\n\n if (history) {\n this.history = history.slice(-10);\n }\n },\n async () => {\n const detected = await se.store.get<string[]>(this.id + '_detected');\n\n if (detected) {\n this.detected = new Set(detected);\n }\n },\n ]);\n });\n }\n\n public async send<K extends keyof T>(key: K, data: T[K]) {\n if (this.SE_API) {\n // this.SE_API.store.set(this.id, { message: key, data });\n\n const message = {\n nonce: Math.random().toString(36).substring(2),\n key,\n value: data,\n timestamp: new Date().toISOString(),\n };\n\n this.history.push(message);\n\n this.SE_API.store.set(this.id, this.history);\n this.SE_API.store.set(this.id + '_detected', Array.from(this.detected));\n }\n }\n\n public update(history: Array<UseCommItem<T>>) {\n if (!history.length) {\n return;\n }\n\n this.history = history;\n\n const messages = history.filter((message) => !this.detected.has(message.nonce));\n\n messages.forEach((message) => {\n this.detected.add(message.nonce);\n\n this.emit('message', message.key, message.value);\n });\n }\n\n public override on<K extends keyof BaseEvents<T>>(\n eventName: K,\n callback: (this: useComms<T>, ...args: BaseEvents<T>[K]) => void,\n ) {\n if (eventName === 'load' && this.loaded) {\n callback.apply(this);\n\n return this;\n }\n\n super.on(eventName, callback);\n\n return this;\n }\n}\n","interface Theme {\n color?: string;\n background?: string;\n bold?: boolean;\n italic?: boolean;\n fontSize?: number;\n icon?: string;\n}\n\ninterface Options {\n enabled?: boolean;\n prefix?: string | (() => string);\n}\n\ntype LogMethod = (...args: unknown[]) => void;\n\nexport class useLogger {\n public enabled: boolean;\n public prefix: string | (() => string);\n\n constructor(options: Options = {}) {\n this.enabled = options.enabled ?? true;\n this.prefix = options.prefix ?? '';\n }\n\n public apply(theme: Theme): LogMethod {\n const style = this.style(theme);\n const icon = theme.icon ? `${theme.icon} ` : '';\n\n return (...args: unknown[]): void => {\n if (!this.enabled || typeof console === 'undefined') return;\n\n let prefix: string = '';\n\n if (typeof this.prefix === 'function') prefix = this.prefix();\n else if (typeof this.prefix === 'string') prefix = this.prefix;\n\n const primitives: unknown[] = [];\n const objects: unknown[] = [];\n\n args.forEach((arg) => {\n if (typeof arg === 'string' || typeof arg === 'number' || typeof arg === 'boolean') {\n primitives.push(arg);\n } else {\n objects.push(arg);\n }\n });\n\n // Log with style\n\n if (primitives.length > 0) {\n const message = primitives.join(' ');\n console.log(\n `%c${prefix.endsWith(' ') ? prefix : prefix.trim() + ' '}${icon}${message}`,\n style,\n ...objects,\n );\n } else if (objects.length > 0) {\n console.log(\n `%c${prefix.endsWith(' ') ? prefix : prefix.trim() + ' '}${icon}`,\n style,\n ...objects,\n );\n }\n };\n }\n\n private style(theme: Theme): string {\n const styles: string[] = [];\n\n if (theme.background && theme.background !== 'transparent') {\n styles.push(`background: ${theme.background}`);\n styles.push('padding: 2px 6px');\n styles.push('border-radius: 3px');\n }\n if (theme.color) styles.push(`color: ${theme.color}`);\n if (theme.bold) styles.push('font-weight: bold');\n if (theme.italic) styles.push('font-style: italic');\n if (theme.fontSize) styles.push(`font-size: ${theme.fontSize}px`);\n\n return styles.join('; ');\n }\n\n public group(label: string): void {\n if (!this.enabled || !console.group) return;\n\n console.group(label);\n }\n\n public groupCollapsed(label: string): void {\n if (!this.enabled || !console.groupCollapsed) return;\n\n console.groupCollapsed(label);\n }\n\n public groupEnd(): void {\n if (!this.enabled || !console.groupEnd) return;\n\n console.groupEnd();\n }\n\n public table(data: unknown): void {\n if (!this.enabled || !console.table) return;\n\n console.table(data);\n }\n\n public time(label: string): void {\n if (!this.enabled || !console.time) return;\n\n console.time(label);\n }\n\n public timeEnd(label: string): void {\n if (!this.enabled || !console.timeEnd) return;\n\n console.timeEnd(label);\n }\n\n readonly error = this.apply({\n color: '#721c24',\n background: '#f8d7da',\n bold: true,\n italic: false,\n icon: '✖',\n });\n\n readonly warn = this.apply({\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n });\n\n readonly success = this.apply({\n color: '#155724',\n background: '#d4edda',\n bold: true,\n italic: false,\n fontSize: 18,\n icon: '✔',\n });\n\n readonly info = this.apply({\n color: '#0c5460',\n background: '#d1ecf1',\n fontSize: 12,\n icon: 'ℹ',\n });\n\n readonly debug = this.apply({\n color: '#8c9ba8',\n background: 'transparent',\n fontSize: 12,\n icon: '●',\n });\n\n readonly alert = this.apply({\n color: '#856404',\n background: '#fff3cd',\n bold: true,\n italic: false,\n fontSize: 20,\n icon: '⚠',\n });\n\n readonly status = this.apply({\n color: '#0c5460',\n background: '#d1ecf1',\n bold: true,\n italic: false,\n fontSize: 12,\n icon: '·',\n });\n\n readonly received = this.apply({\n color: '#E6BBFF',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n icon: '⬇',\n });\n\n readonly simple = this.apply({\n color: '#f6c6cb',\n background: 'transparent',\n bold: false,\n italic: false,\n fontSize: 14,\n icon: '☼',\n });\n}\n","import type {\n OnErrorHandler,\n OnCommandHandler,\n OnChatHandler,\n OnWhisperHandler,\n OnMessageDeletedHandler,\n OnJoinHandler,\n OnPartHandler,\n OnHostedHandler,\n OnRaidHandler,\n OnSubHandler,\n OnResubHandler,\n OnSubGiftHandler,\n OnSubMysteryGiftHandler,\n OnGiftSubContinueHandler,\n OnCheerHandler,\n OnRewardHandler,\n OnConnectedHandler,\n OnReconnectHandler,\n OnChatModeHandler,\n ComfyJSInstance,\n} from 'comfy.js';\n\nimport { BadgeOptions } from '../helper/classes/message.js';\nimport { usedClients } from '../internal.js';\nimport { Local } from '../local/index.js';\nimport { logger } from '../main.js';\nimport { EventProvider } from '../modules/EventProvider.js';\n\ntype ComfyEvents = {\n load: [instance: ComfyJSInstance];\n error: Parameters<OnErrorHandler>;\n command: Parameters<OnCommandHandler>;\n chat: Parameters<OnChatHandler>;\n whisper: Parameters<OnWhisperHandler>;\n messageDeleted: Parameters<OnMessageDeletedHandler>;\n join: Parameters<OnJoinHandler>;\n part: Parameters<OnPartHandler>;\n hosted: Parameters<OnHostedHandler>;\n raid: Parameters<OnRaidHandler>;\n sub: Parameters<OnSubHandler>;\n resub: Parameters<OnResubHandler>;\n subGift: Parameters<OnSubGiftHandler>;\n subMysteryGift: Parameters<OnSubMysteryGiftHandler>;\n giftSubContinue: Parameters<OnGiftSubContinueHandler>;\n cheer: Parameters<OnCheerHandler>;\n chatMode: Parameters<OnChatModeHandler>;\n reward: Parameters<OnRewardHandler>;\n connected: Parameters<OnConnectedHandler>;\n reconnect: Parameters<OnReconnectHandler>;\n};\n\n/**\n * Creates and manages a ComfyJS instance for Twitch chat interaction.\n */\nexport class useComfyJs extends EventProvider<ComfyEvents> {\n public instance!: ComfyJSInstance;\n\n public username!: string;\n public password?: string;\n public channels!: string[];\n\n public isDebug: boolean = false;\n private init: boolean = false;\n\n public emulate: boolean = false;\n\n /**\n * Initializes a new ComfyJS instance and connects to Twitch chat.\n * @param options - Configuration options for ComfyJS instance.\n * @param emulate - Whether to emulate chat messages in the Local module.\n */\n constructor(\n options: {\n username: string;\n password?: string;\n channels: string[];\n isDebug?: boolean;\n init?: boolean;\n },\n emulate: boolean,\n ) {\n super();\n\n this.username = options.username;\n this.password = options.password;\n this.channels = options.channels;\n this.isDebug = Boolean(options.isDebug);\n this.init = Boolean(options.init);\n this.emulate = emulate;\n\n this.load()\n .then((comfyJS) => {\n this.instance = comfyJS;\n\n this.emit('load', comfyJS);\n this.connect();\n })\n .catch((err) => {\n logger.error('useComfyJs: Failed to load ComfyJS', err);\n });\n }\n\n /**\n * Loads the ComfyJS script if not already loaded.\n * @returns A promise that resolves to the ComfyJS instance.\n */\n private load(): Promise<ComfyJSInstance> {\n if (typeof window.ComfyJS === 'undefined' || !window.ComfyJS) {\n return new Promise((resolve, reject) => {\n if (this.emulate && !usedClients.length) {\n return reject(\n new Error('useComfyJs: Cannot emulate chat messages without a Client instance.'),\n );\n }\n\n const script = document.createElement('script');\n\n script.src = 'https://cdn.jsdelivr.net/npm/comfy.js@1.1.29/dist/comfy.min.js';\n script.type = 'text/javascript';\n script.async = true;\n\n script.onload = () => resolve(window.ComfyJS as ComfyJSInstance);\n script.onerror = (err) => reject(err);\n\n document.head.appendChild(script);\n });\n } else return Promise.resolve(window.ComfyJS as ComfyJSInstance);\n }\n\n /**\n * Connects event handlers to the ComfyJS instance.\n */\n private connect() {\n this.instance.onError = (error) => {\n this.emit('error', error);\n\n if (usedClients.some((e) => e.debug)) logger.error('[Client]', 'ComfyJS Error:', error);\n };\n\n this.instance.onCommand = (user, command, message, flags, extra) => {\n this.emit('command', user, command, message, flags, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Command: !${command} ${message} (User: ${user})`);\n\n if (this.emulate) {\n const roles = {\n ...flags,\n broadcaster: flags.broadcaster,\n moderator: flags.mod,\n vip: flags.vip,\n subscriber: flags.subscriber,\n founder: flags.founder,\n };\n\n const data = {\n name: user,\n message: `!${command} ${message}`,\n badges: Object.entries(roles)\n .map(([role, hasRole]) => (hasRole ? role : null))\n .filter(Boolean) as BadgeOptions,\n color: extra.userColor,\n time: new Date(extra.timestamp).getTime(),\n userId: extra.userId,\n msgId: extra.id,\n channel: extra.channel,\n };\n\n Local.emulate.twitch.message(data);\n }\n };\n this.instance.onChat = (user, message, flags, self, extra) => {\n this.emit('chat', user, message, flags, self, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Chat: ${message} (User: ${user})`);\n\n if (this.emulate) {\n const roles = {\n ...flags,\n ...extra.userBadges,\n broadcaster: flags.broadcaster,\n moderator: flags.mod,\n vip: flags.vip,\n subscriber: flags.subscriber,\n founder: flags.founder,\n };\n\n Local.emulate.twitch.message({\n name: user,\n message: message,\n badges: Object.entries(roles)\n .map(([role, hasRole]) => (hasRole ? role : null))\n .filter(Boolean) as BadgeOptions,\n color: extra.userColor,\n time: new Date(extra.timestamp).getTime(),\n userId: extra.userId,\n msgId: extra.id,\n channel: extra.channel,\n });\n }\n };\n this.instance.onWhisper = (user, message, flags, self, extra) => {\n this.emit('whisper', user, message, flags, self, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Whisper: ${message} (User: ${user})`);\n };\n this.instance.onMessageDeleted = (id, extra) => {\n this.emit('messageDeleted', id, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Message Deleted: ${id}`);\n\n if (this.emulate) {\n Local.emulate.twitch.deleteMessage(id);\n }\n };\n this.instance.onJoin = (user, self, extra) => {\n this.emit('join', user, self, extra);\n\n if (usedClients.some((e) => e.debug)) logger.debug('[Client]', `ComfyJS Join: ${user}`);\n };\n this.instance.onPart = (user, self, extra) => {\n this.emit('part', user, self, extra);\n\n if (usedClients.some((e) => e.debug)) logger.debug('[Client]', `ComfyJS Part: ${user}`);\n };\n this.instance.onHosted = (user, viewers, autohost, extra) => {\n this.emit('hosted', user, viewers, autohost, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Hosted: ${user} (${viewers} viewers)`);\n };\n this.instance.onRaid = (user, viewers, extra) => {\n this.emit('raid', user, viewers, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Raid: ${user} (${viewers} viewers)`);\n\n if (this.emulate) {\n Local.emulate.twitch.raid({\n name: user,\n amount: viewers,\n });\n }\n };\n this.instance.onSub = (user, message, subTierInfo, extra) => {\n this.emit('sub', user, message, subTierInfo, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Sub: ${user} (${subTierInfo.plan})`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: user,\n message: message,\n tier: tier,\n subType: 'default',\n });\n }\n };\n this.instance.onResub = (user, message, streakMonths, cumulativeMonths, subTierInfo, extra) => {\n this.emit('resub', user, message, streakMonths, cumulativeMonths, subTierInfo, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Resub: ${user} (${cumulativeMonths} months)`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: user,\n message: message,\n tier: tier,\n amount: cumulativeMonths,\n subType: 'default',\n });\n }\n };\n this.instance.onSubGift = (\n gifterUser,\n streakMonths,\n recipientUser,\n senderCount,\n subTierInfo,\n extra,\n ) => {\n this.emit(\n 'subGift',\n gifterUser,\n streakMonths,\n recipientUser,\n senderCount,\n subTierInfo,\n extra,\n );\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Sub Gift: ${gifterUser} gifted ${senderCount} subs`);\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: recipientUser,\n message: '',\n sender: gifterUser,\n tier,\n amount: senderCount,\n subType: 'gift',\n });\n }\n };\n this.instance.onSubMysteryGift = (gifterUser, numbOfSubs, senderCount, subTierInfo, extra) => {\n this.emit('subMysteryGift', gifterUser, numbOfSubs, senderCount, subTierInfo, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug(\n '[Client]',\n `ComfyJS Sub Mystery Gift: ${gifterUser} gifted ${numbOfSubs} subs`,\n );\n\n if (this.emulate) {\n const tier = subTierInfo.plan === 'Prime' ? 'prime' : subTierInfo.plan;\n\n Local.emulate.twitch.subscriber({\n name: gifterUser,\n message: '',\n amount: numbOfSubs,\n tier: tier,\n subType: 'community',\n });\n }\n };\n this.instance.onGiftSubContinue = (user, sender, extra) => {\n this.emit('giftSubContinue', user, sender, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug(\n '[Client]',\n `ComfyJS Gift Sub Continue: ${user} continued their gifted sub from ${sender}`,\n );\n\n if (this.emulate) {\n Local.emulate.twitch.subscriber({\n name: user,\n message: '',\n sender: sender,\n tier: '1000',\n subType: 'gift',\n });\n }\n };\n this.instance.onCheer = (user, message, bits, flags, extra) => {\n this.emit('cheer', user, message, bits, flags, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Cheer: ${user} cheered ${bits} bits - ${message}`);\n\n if (this.emulate) {\n Local.emulate.twitch.cheer({\n name: user,\n message: message,\n amount: bits,\n });\n }\n };\n this.instance.onChatMode = (flags, channel) => {\n this.emit('chatMode', flags, channel);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Chat Mode Changed on ${channel}`);\n };\n this.instance.onReward = (user, reward, cost, message, extra) => {\n this.emit('reward', user, reward, cost, message, extra);\n\n if (usedClients.some((e) => e.debug))\n logger.debug(\n '[Client]',\n `ComfyJS Reward: ${user} redeemed ${reward} for ${cost} - ${message}`,\n );\n };\n this.instance.onConnected = (address, port, isFirstConnect) => {\n this.emit('connected', address, port, isFirstConnect);\n\n if (usedClients.some((e) => e.debug))\n logger.debug(\n '[Client]',\n `ComfyJS Connected: ${address}:${port} (First Connect: ${isFirstConnect})`,\n );\n };\n this.instance.onReconnect = (reconnectCount) => {\n this.emit('reconnect', reconnectCount);\n\n if (usedClients.some((e) => e.debug))\n logger.debug('[Client]', `ComfyJS Reconnect: Attempt #${reconnectCount}`);\n };\n\n if (this.init) {\n this.instance.Init(this.username, this.password, this.channels, this.isDebug);\n }\n }\n}\n","import { usedClients } from '../internal.js';\n\nexport namespace Alejo {\n export namespace Pronouns {\n export type name =\n | 'hehim'\n | 'sheher'\n | 'theythem'\n | 'shethem'\n | 'hethem'\n | 'heshe'\n | 'xexem'\n | 'faefaer'\n | 'vever'\n | 'aeaer'\n | 'ziehir'\n | 'perper'\n | 'eem'\n | 'itits';\n\n export type display =\n | 'He/Him'\n | 'She/Her'\n | 'They/Them'\n | 'She/They'\n | 'He/They'\n | 'He/She'\n | 'Xe/Xem'\n | 'Fae/Faer'\n | 'Ve/Ver'\n | 'Ae/Aer'\n | 'Zie/Hir'\n | 'Per/Per'\n | 'E/Em'\n | 'It/Its';\n\n export enum map {\n hehim = 'He/Him',\n sheher = 'She/Her',\n theythem = 'They/Them',\n shethem = 'She/They',\n hethem = 'He/They',\n heshe = 'He/She',\n xexem = 'Xe/Xem',\n faefaer = 'Fae/Faer',\n vever = 'Ve/Ver',\n aeaer = 'Ae/Aer',\n ziehir = 'Zie/Hir',\n perper = 'Per/Per',\n eem = 'E/Em',\n itits = 'It/Its',\n }\n }\n\n export async function list(): Promise<typeof Pronouns.map> {\n try {\n const data = (await fetch('https://pronouns.alejo.io/api/pronouns').then((res) =>\n res.json(),\n )) as {\n display: Pronouns.display;\n name: Pronouns.name;\n }[];\n\n if (Array.isArray(data) && data.length) {\n const built = Object.fromEntries(\n data.map(({ name, display }) => [name, display] as const),\n ) as Record<Pronouns.name, Pronouns.display>;\n\n return { ...Pronouns.map, ...built } as typeof Pronouns.map;\n }\n } catch {}\n\n return { ...Pronouns.map } as typeof Pronouns.map;\n }\n\n export type user = {\n id: string;\n login: string;\n pronoun_id: Pronouns.name;\n };\n\n export async function get(username: string) {\n if (!username) throw new Error('Username is required to fetch Alejo data.');\n\n username = username.toLowerCase();\n\n if (!usedClients.length) {\n try {\n const data = await fetch(`https://pronouns.alejo.io/api/users/${username}`)\n .then((res) => res.json())\n .then(([data]) => data as Alejo.user | undefined);\n\n if (data) {\n return data.pronoun_id;\n }\n } catch (error) {\n throw new Error(\n `Failed to fetch pronoun data for user \"${username}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n\n return;\n }\n\n const client = usedClients?.[0];\n\n if (\n username in client.storage.data.pronoun &&\n client.storage.data.pronoun[username].expire > Date.now()\n ) {\n return client.storage.data.pronoun[username].value;\n } else {\n try {\n const data = await fetch(`https://pronouns.alejo.io/api/users/${username}`)\n .then((res) => res.json())\n .then(([data]) => data as Alejo.user | undefined);\n\n if (data) {\n client.storage.add(`pronoun.${username}`, {\n value: data.pronoun_id,\n timestamp: Date.now(),\n expire: Date.now() + client.cache.pronoun * 60 * 1000,\n });\n\n return client.storage.data.pronoun[username].value ?? data.pronoun_id;\n }\n } catch (error) {\n throw new Error(\n `Failed to fetch pronoun data for user \"${username}\": ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n }\n}\n","import './client/listener.js';\nimport { Button } from './actions/button.js';\nimport { Command } from './actions/command.js';\nimport { Client } from './client/client.js';\nimport { Data } from './data/index.js';\nimport { Helper } from './helper/index.js';\nimport * as internals from './internal.js';\nimport { Local } from './local/index.js';\nimport { EventProvider } from './modules/EventProvider.js';\nimport { FakeUserPool } from './modules/fakeUser.js';\nimport { USE_SE_API } from './modules/SE_API.js';\nimport { useComms } from './modules/useComms.js';\nimport { useLogger } from './modules/useLogger.js';\nimport { useQueue } from './modules/useQueue.js';\nimport { useStorage } from './modules/useStorage.js';\nimport { useComfyJs } from './multistream/comfyJs.js';\nimport { Alejo } from './utils/alejo.js';\n\nexport const logger = new useLogger();\n\nexport const main = {\n SeAPI: USE_SE_API,\n\n Client: Client,\n Helper: Helper,\n Local: Local,\n Data: Data,\n logger: logger,\n\n modules: {\n EventProvider,\n useStorage,\n useQueue,\n useLogger,\n useComms,\n FakeUserPool,\n },\n actions: {\n Button,\n Command,\n },\n multistream: {\n useComfyJs,\n },\n internal: internals,\n pronouns: { Alejo },\n};\n\nif (typeof window !== 'undefined') {\n (window as any).Tixyel = main;\n} else {\n (globalThis as any).Tixyel = main;\n}\n","import { ComfyJSInstance } from 'comfy.js';\n\nimport { main } from './main.js';\nimport { StreamElements } from './types.js';\n\nexport type * from './types.ts';\n\ndeclare global {\n interface Window {\n Tixyel: typeof main;\n ComfyJS?: ComfyJSInstance;\n }\n\n interface WindowEventMap {\n onWidgetLoad: CustomEvent<StreamElements.Event.onWidgetLoad>;\n onSessionUpdate: CustomEvent<StreamElements.Event.onSessionUpdate>;\n onEventReceived: CustomEvent<StreamElements.Event.onEventReceived>;\n }\n\n const Tixyel: typeof main;\n const SE_API: StreamElements.SE_API;\n}\n\nexport default main;\n"],"mappings":"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OAAO,KAAM,UAAU;GAClD,IAAM,IAAQ,OAAO,KAAK,EAAE,EACtB,IAAQ,OAAO,KAAK,EAAE;AAE5B,OAAI,EAAM,WAAW,EAAM,OAAQ,QAAO;AAC1C,QAAK,IAAM,KAAO,EAChB,KAAI,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,EAAI,IAAI,KAAK,OAAO,EAAE,IAAM,EAAE,IAAM,EAAO,CACtF,QAAO;AAGX,UAAO;;AAGT,SAAO,MAAM;;GCxNJ,IAAU;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACD,ECNY,IAAqC;CAChD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,EACD;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,EACD;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,EACD;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,EACD;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WACE;GACH,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aACE;IACF,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU;GACR;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACD;IACE,IAAI;IACJ,cACE;IACF,cACE;IACF,cACE;IACF,OAAO;IACP,aAAa;IACb,cAAc;IACd,WAAW;IACZ;GACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aACE;GACF,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACD;EACE,QAAQ;EACR,UAAU,CACR;GACE,IAAI;GACJ,cACE;GACF,cACE;GACF,cACE;GACF,OAAO;GACP,aAAa;GACb,cAAc;GACd,WAAW;GACZ,CACF;EACF;CACF,ECjwLY,IAAkB,s+CAsJ9B,ECpJK,IAAgB;CACpB;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACF,EAEK,IAAa;CACjB;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACF,EAEK,IAAY;CAChB;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACD;EACE,IAAI;EACJ,MAAM;EACN,UAAU;EACV,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACF;CACF,EAEK,IAAe;CACnB;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;EACD,OAAO;EACP,KAAK;EACN;CACD;EACE,MAAM;EACN,MAAM;EACN,IAAI;EACJ,KAAK;EACL,UAAU;EACV,MAAM;GACJ,GAAK;GACL,GAAK;GACL,GAAK;GACN;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AAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,kCAAkC;EAC9C,aAAa,CAAC,gCAAgC;EAC9C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,iCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wCAAwC;EACpD,aAAa,CAAC,sCAAsC;EACpD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,OAAO;EACnB,aAAa,CAAC,KAAK;EACnB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,MACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,SAAS;EACrB,aAAa,CAAC,OAAO;EACrB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,QACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,aAAa;EACzB,aAAa,CAAC,WAAW;EACzB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,YACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,aAAa;EACzB,aAAa,CAAC,WAAW;EACzB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,YACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,eAAe;EAC3B,aAAa,CAAC,aAAa;EAC3B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,cACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,sBAAsB;EAClC,aAAa,CAAC,oBAAoB;EAClC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,qBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wBAAwB;EACpC,aAAa,CAAC,sBAAsB;EACpC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,kCAAkC;EAC9C,aAAa,CAAC,gCAAgC;EAC9C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,iCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,oBAAoB;EAChC,aAAa,CAAC,kBAAkB;EAChC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,mBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,4BAA4B;EACxC,aAAa,CAAC,0BAA0B;EACxC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,2BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wBAAwB;EACpC,aAAa,CAAC,sBAAsB;EACpC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gCAAgC;EAC5C,aAAa,CAAC,8BAA8B;EAC5C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,+BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,gCAAgC;EAC5C,aAAa,CAAC,8BAA8B;EAC5C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,+BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,qBAAqB;EACjC,aAAa,CAAC,mBAAmB;EACjC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,oBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,uBAAuB;EACnC,aAAa,CAAC,qBAAqB;EACnC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,sBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,0BAA0B;EACtC,aAAa,CAAC,wBAAwB;EACtC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,yBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,mCAAmC;EAC/C,aAAa,CAAC,iCAAiC;EAC/C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,kCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,+BAA+B;EAC3C,aAAa,CAAC,6BAA6B;EAC3C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,8BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,wCAAwC;EACpD,aAAa,CAAC,sCAAsC;EACpD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,uCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,6BAA6B;EACzC,aAAa,CAAC,2BAA2B;EACzC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,4BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,oCAAoC;EAChD,aAAa,CAAC,kCAAkC;EAChD,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,mCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,iCAAiC;EAC7C,aAAa,CAAC,+BAA+B;EAC7C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,gCACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,2BAA2B;EACvC,aAAa,CAAC,yBAAyB;EACvC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,0BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,8BAA8B;EAC1C,aAAa,CAAC,4BAA4B;EAC1C,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,6BACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,yBAAyB;EACrC,aAAa,CAAC,uBAAuB;EACrC,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,wBACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,YAAY;EACxB,aAAa,CAAC,UAAU;EACxB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,WACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,QAAQ;EACpB,aAAa,CAAC,MAAM;EACpB,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,OACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SAAS;EACT,WAAW,CAAC,cAAc;EAC1B,aAAa,CAAC,YAAY;EAC1B,OAAO;GACL,YAAY,CACV;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,EACD;IACE,KAAK;IACL,OAAO;IACP,QAAQ;IACT,CACF;GACD,eAAe,EACb,mBAAmB,EACjB,OAAO,aACR,EACF;GACF;EACD,eAAe;EACf,OAAO;EACR;CACD;EACE,SA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"}