@ls-stack/server-i18n 0.6.1 → 0.6.2
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.
- package/dist/main.d.mts.map +1 -1
- package/dist/main.mjs +8 -4
- package/dist/main.mjs.map +1 -1
- package/package.json +1 -1
package/dist/main.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.mts","names":[],"sources":["../../core/src/types.ts","../src/main.ts"],"mappings":";KAAY,iBAAA;EACV,SAAA;EACA,IAAA;EACA,GAAA;EACA,IAAA;EACA,IAAA;AAAA;AAAA,KAGU,gBAAA,mBAAmC,iBAAA;AAAA,KAEnC,MAAA,GAAS,MAAA,SAAe,gBAAA;AAAA,KAExB,YAAA,8BAA0C,MAAA,CAAO,CAAA,EAAG,MAAA;;;
|
|
1
|
+
{"version":3,"file":"main.d.mts","names":[],"sources":["../../core/src/types.ts","../src/main.ts"],"mappings":";KAAY,iBAAA;EACV,SAAA;EACA,IAAA;EACA,GAAA;EACA,IAAA;EACA,IAAA;AAAA;AAAA,KAGU,gBAAA,mBAAmC,iBAAA;AAAA,KAEnC,MAAA,GAAS,MAAA,SAAe,gBAAA;AAAA,KAExB,YAAA,8BAA0C,MAAA,CAAO,CAAA,EAAG,MAAA;;;KCJ3D,WAAA;EACH,OAAA,EAAS,MAAA,CAAO,CAAA,EAAG,MAAA;;;;;EAKnB,cAAA,GAAiB,OAAA,CAAQ,CAAA;AAAA;AAAA,iBAgBX,YAAA,kBAAA,CAA+B,OAAA,EAAS,WAAA,CAAY,CAAA;iBAgEjD,CAAA,GAAI,IAAA,EDzFjB;2DC6FuD,IAAA;+DAvBO,CAAA;AAAA;AAAA,cAgC9D,IAAA;EAAA,QACgB,QAAA;cAAA,QAAA;EAEpB,EAAA,GACE,OAAA,EAAS,oBAAA,KACN,KAAA;EAgCL,GAAA,GAAO,GAAA,cACG,OAAA,EAAS,oBAAA,KAAyB,KAAA;AAAA"}
|
package/dist/main.mjs
CHANGED
|
@@ -36,6 +36,10 @@ function selectPluralForm(num, pluralTranslation) {
|
|
|
36
36
|
if (pluralTranslation["+2"]) return pluralTranslation["+2"].replace("#", String(num));
|
|
37
37
|
return null;
|
|
38
38
|
}
|
|
39
|
+
/** Replaces the `#` count placeholder of a plural fallback string */
|
|
40
|
+
function replaceHashWithNum(fallback, num) {
|
|
41
|
+
return fallback.replace("#", String(num));
|
|
42
|
+
}
|
|
39
43
|
|
|
40
44
|
//#endregion
|
|
41
45
|
//#region src/main.ts
|
|
@@ -115,17 +119,17 @@ var I18n = class {
|
|
|
115
119
|
const activeLocale = config?.locales[this.localeId];
|
|
116
120
|
if (!activeLocale) throw new Error("No active locale");
|
|
117
121
|
const selectedTranslation = activeLocale[hash];
|
|
118
|
-
if (selectedTranslation === void 0) return fallbackTranslation;
|
|
122
|
+
if (selectedTranslation === void 0) return replaceHashWithNum(fallbackTranslation, num);
|
|
119
123
|
if (typeof selectedTranslation === "object" && selectedTranslation !== null) {
|
|
120
124
|
const translation = selectPluralForm(num, selectedTranslation);
|
|
121
125
|
if (translation === null) {
|
|
122
126
|
console.error(`No plural configured for hash: ${hash}`);
|
|
123
|
-
return fallbackTranslation;
|
|
127
|
+
return replaceHashWithNum(fallbackTranslation, num);
|
|
124
128
|
}
|
|
125
|
-
return interpolate(translation, exprs) || fallbackTranslation;
|
|
129
|
+
return interpolate(translation, exprs) || replaceHashWithNum(fallbackTranslation, num);
|
|
126
130
|
}
|
|
127
131
|
if (selectedTranslation) throw new Error("Invalid translation, this translation should use the `__` method");
|
|
128
|
-
return fallbackTranslation;
|
|
132
|
+
return replaceHashWithNum(fallbackTranslation, num);
|
|
129
133
|
};
|
|
130
134
|
};
|
|
131
135
|
};
|
package/dist/main.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.mjs","names":[],"sources":["../../core/src/hash.ts","../../core/src/interpolation.ts","../../core/src/pluralization.ts","../src/main.ts"],"sourcesContent":["export function createHashAndFallbackTranslation(\n strings: TemplateStringsArray,\n exprs: (string | number)[],\n): readonly [hash: string, fallbackTranslation: string] {\n let hash = '';\n let fallbackTranslation = '';\n\n for (let i = 0; i < strings.length; i++) {\n const string = strings[i] ?? '';\n const expr = exprs[i];\n\n hash += string + (i !== strings.length - 1 ? `{${i + 1}}` : '');\n fallbackTranslation += string + (expr ?? '');\n }\n\n if (fallbackTranslation.includes('~~')) {\n fallbackTranslation = fallbackTranslation.split('~~')[0] ?? fallbackTranslation;\n }\n\n return [hash, fallbackTranslation] as const;\n}\n","const TRANSLATION_SPLITTER = /{(\\d+)}/;\n\nexport function interpolate(\n translation: string,\n exprs: (string | number)[],\n): string {\n if (exprs.length === 0) {\n return translation;\n }\n\n let result = '';\n const translationParts = translation.split(TRANSLATION_SPLITTER);\n\n for (let i = 0; i < translationParts.length; i++) {\n const part = translationParts[i];\n\n if (i % 2 === 0) {\n result += part;\n } else {\n const interpolationPos = Number(part);\n result += exprs[interpolationPos - 1];\n }\n }\n\n return result;\n}\n","import type { PluralTranslation } from './types';\n\nexport function selectPluralForm(\n num: number,\n pluralTranslation: PluralTranslation,\n): string | null {\n if (num === 0 && pluralTranslation.zero) {\n return pluralTranslation.zero;\n }\n\n if (num === 1 && pluralTranslation.one) {\n return pluralTranslation.one;\n }\n\n if (\n pluralTranslation.manyLimit &&\n pluralTranslation.many &&\n num > pluralTranslation.manyLimit\n ) {\n return pluralTranslation.many;\n }\n\n if (pluralTranslation['+2']) {\n return pluralTranslation['+2'].replace('#', String(num));\n }\n\n return null;\n}\n","import {\n createHashAndFallbackTranslation,\n interpolate,\n type Locale,\n selectPluralForm,\n} from '@ls-stack/i18n-core';\n\ntype I18nOptions<T extends string> = {\n locales: Record<T, Locale>;\n /**\n * Locale used by `toAvailableLocale` and `withUnknownLocale` when no locale\n * matches. Defaults to the first locale in `locales`\n */\n fallbackLocale?: NoInfer<T>;\n};\n\nlet config: I18nOptions<string> | null = null;\n\nfunction normalizeLocaleTag(localeTag: string): string {\n return localeTag.trim().toLowerCase().replaceAll('_', '-');\n}\n\nfunction getBaseLanguage(normalizedTag: string): string {\n const separatorIndex = normalizedTag.indexOf('-');\n return separatorIndex === -1 ? normalizedTag : (\n normalizedTag.slice(0, separatorIndex)\n );\n}\n\nexport function i18nitialize<T extends string>(options: I18nOptions<T>) {\n config = options;\n\n function isLocaleId(id: string): id is T {\n return Object.hasOwn(options.locales, id);\n }\n\n const localeIds = Object.keys(options.locales).filter(isLocaleId);\n const fallbackLocale = options.fallbackLocale ?? localeIds[0];\n\n const localeByTag = new Map<string, T>();\n const localeByBaseLanguage = new Map<string, T>();\n\n for (const localeId of localeIds) {\n const normalizedId = normalizeLocaleTag(localeId);\n localeByTag.set(normalizedId, localeId);\n\n const baseLanguage = getBaseLanguage(normalizedId);\n // a locale without region (e.g. `pt`) wins over regional ones (e.g. `pt-PT`)\n if (\n normalizedId === baseLanguage ||\n !localeByBaseLanguage.has(baseLanguage)\n ) {\n localeByBaseLanguage.set(baseLanguage, localeId);\n }\n }\n\n const instances = new Map<T, I18n>();\n\n function getInstance(localeId: T): I18n {\n let instance = instances.get(localeId);\n\n if (!instance) {\n instance = new I18n(localeId);\n instances.set(localeId, instance);\n }\n\n return instance;\n }\n\n /**\n * Closest available locale of a language tag like `pt-BR` or `pt_br`,\n * matching the exact tag first, then its base language. Returns the\n * fallback locale if nothing matches\n */\n function toAvailableLocale(localeTag: string | null | undefined): T {\n if (localeTag) {\n const normalizedTag = normalizeLocaleTag(localeTag);\n\n const matchedLocale =\n localeByTag.get(normalizedTag) ??\n localeByBaseLanguage.get(getBaseLanguage(normalizedTag));\n\n if (matchedLocale !== undefined) return matchedLocale;\n }\n\n if (fallbackLocale === undefined) {\n throw new Error('No locales configured');\n }\n\n return fallbackLocale;\n }\n\n return {\n with(localeId: T): I18n {\n return getInstance(localeId);\n },\n /** `with` for an unvalidated language tag, see `toAvailableLocale` */\n withUnknownLocale(localeTag: string | null | undefined): I18n {\n return getInstance(toAvailableLocale(localeTag));\n },\n toAvailableLocale,\n };\n}\n\nexport type { I18n };\n\nclass I18n {\n constructor(private localeId: string) {}\n\n __ = (strings: TemplateStringsArray, ...exprs: (string | number)[]): string => {\n const [hash, fallbackTranslation] = createHashAndFallbackTranslation(\n strings,\n exprs,\n );\n\n const activeLocale = config?.locales[this.localeId];\n\n if (!activeLocale) {\n throw new Error('No active locale');\n }\n\n const selectedTranslation = activeLocale[hash];\n\n if (selectedTranslation === undefined) {\n return fallbackTranslation;\n }\n\n if (typeof selectedTranslation === 'string' && selectedTranslation) {\n return interpolate(selectedTranslation, exprs) || fallbackTranslation;\n }\n\n if (selectedTranslation) {\n throw new Error(\n 'Invalid translation, this translation should use the plural `__p` method',\n );\n }\n\n return fallbackTranslation;\n };\n\n __p = (num: number) => {\n return (strings: TemplateStringsArray, ...exprs: (string | number)[]) => {\n const [hash, fallbackTranslation] = createHashAndFallbackTranslation(\n strings,\n exprs,\n );\n\n const activeLocale = config?.locales[this.localeId];\n\n if (!activeLocale) {\n throw new Error('No active locale');\n }\n\n const selectedTranslation = activeLocale[hash];\n\n if (selectedTranslation === undefined) {\n return fallbackTranslation;\n }\n\n if (\n typeof selectedTranslation === 'object' &&\n selectedTranslation !== null\n ) {\n const translation = selectPluralForm(num, selectedTranslation);\n\n if (translation === null) {\n console.error(`No plural configured for hash: ${hash}`);\n return fallbackTranslation;\n }\n\n return interpolate(translation, exprs) || fallbackTranslation;\n }\n\n if (selectedTranslation) {\n throw new Error(\n 'Invalid translation, this translation should use the `__` method',\n );\n }\n\n return fallbackTranslation;\n };\n };\n}\n\nexport type { Locale, LocaleConfig, PluralTranslation, TranslationValue } from '@ls-stack/i18n-core';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.mjs","names":[],"sources":["../../core/src/hash.ts","../../core/src/interpolation.ts","../../core/src/pluralization.ts","../src/main.ts"],"sourcesContent":["export function createHashAndFallbackTranslation(\n strings: TemplateStringsArray,\n exprs: (string | number)[],\n): readonly [hash: string, fallbackTranslation: string] {\n let hash = '';\n let fallbackTranslation = '';\n\n for (let i = 0; i < strings.length; i++) {\n const string = strings[i] ?? '';\n const expr = exprs[i];\n\n hash += string + (i !== strings.length - 1 ? `{${i + 1}}` : '');\n fallbackTranslation += string + (expr ?? '');\n }\n\n if (fallbackTranslation.includes('~~')) {\n fallbackTranslation = fallbackTranslation.split('~~')[0] ?? fallbackTranslation;\n }\n\n return [hash, fallbackTranslation] as const;\n}\n","const TRANSLATION_SPLITTER = /{(\\d+)}/;\n\nexport function interpolate(\n translation: string,\n exprs: (string | number)[],\n): string {\n if (exprs.length === 0) {\n return translation;\n }\n\n let result = '';\n const translationParts = translation.split(TRANSLATION_SPLITTER);\n\n for (let i = 0; i < translationParts.length; i++) {\n const part = translationParts[i];\n\n if (i % 2 === 0) {\n result += part;\n } else {\n const interpolationPos = Number(part);\n result += exprs[interpolationPos - 1];\n }\n }\n\n return result;\n}\n","import type { PluralTranslation } from './types';\n\nexport function selectPluralForm(\n num: number,\n pluralTranslation: PluralTranslation,\n): string | null {\n if (num === 0 && pluralTranslation.zero) {\n return pluralTranslation.zero;\n }\n\n if (num === 1 && pluralTranslation.one) {\n return pluralTranslation.one;\n }\n\n if (\n pluralTranslation.manyLimit &&\n pluralTranslation.many &&\n num > pluralTranslation.manyLimit\n ) {\n return pluralTranslation.many;\n }\n\n if (pluralTranslation['+2']) {\n return pluralTranslation['+2'].replace('#', String(num));\n }\n\n return null;\n}\n\n/** Replaces the `#` count placeholder of a plural fallback string */\nexport function replaceHashWithNum(fallback: string, num: number): string {\n return fallback.replace('#', String(num));\n}\n","import {\n createHashAndFallbackTranslation,\n interpolate,\n type Locale,\n replaceHashWithNum,\n selectPluralForm,\n} from '@ls-stack/i18n-core';\n\ntype I18nOptions<T extends string> = {\n locales: Record<T, Locale>;\n /**\n * Locale used by `toAvailableLocale` and `withUnknownLocale` when no locale\n * matches. Defaults to the first locale in `locales`\n */\n fallbackLocale?: NoInfer<T>;\n};\n\nlet config: I18nOptions<string> | null = null;\n\nfunction normalizeLocaleTag(localeTag: string): string {\n return localeTag.trim().toLowerCase().replaceAll('_', '-');\n}\n\nfunction getBaseLanguage(normalizedTag: string): string {\n const separatorIndex = normalizedTag.indexOf('-');\n return separatorIndex === -1 ? normalizedTag : (\n normalizedTag.slice(0, separatorIndex)\n );\n}\n\nexport function i18nitialize<T extends string>(options: I18nOptions<T>) {\n config = options;\n\n function isLocaleId(id: string): id is T {\n return Object.hasOwn(options.locales, id);\n }\n\n const localeIds = Object.keys(options.locales).filter(isLocaleId);\n const fallbackLocale = options.fallbackLocale ?? localeIds[0];\n\n const localeByTag = new Map<string, T>();\n const localeByBaseLanguage = new Map<string, T>();\n\n for (const localeId of localeIds) {\n const normalizedId = normalizeLocaleTag(localeId);\n localeByTag.set(normalizedId, localeId);\n\n const baseLanguage = getBaseLanguage(normalizedId);\n // a locale without region (e.g. `pt`) wins over regional ones (e.g. `pt-PT`)\n if (\n normalizedId === baseLanguage ||\n !localeByBaseLanguage.has(baseLanguage)\n ) {\n localeByBaseLanguage.set(baseLanguage, localeId);\n }\n }\n\n const instances = new Map<T, I18n>();\n\n function getInstance(localeId: T): I18n {\n let instance = instances.get(localeId);\n\n if (!instance) {\n instance = new I18n(localeId);\n instances.set(localeId, instance);\n }\n\n return instance;\n }\n\n /**\n * Closest available locale of a language tag like `pt-BR` or `pt_br`,\n * matching the exact tag first, then its base language. Returns the\n * fallback locale if nothing matches\n */\n function toAvailableLocale(localeTag: string | null | undefined): T {\n if (localeTag) {\n const normalizedTag = normalizeLocaleTag(localeTag);\n\n const matchedLocale =\n localeByTag.get(normalizedTag) ??\n localeByBaseLanguage.get(getBaseLanguage(normalizedTag));\n\n if (matchedLocale !== undefined) return matchedLocale;\n }\n\n if (fallbackLocale === undefined) {\n throw new Error('No locales configured');\n }\n\n return fallbackLocale;\n }\n\n return {\n with(localeId: T): I18n {\n return getInstance(localeId);\n },\n /** `with` for an unvalidated language tag, see `toAvailableLocale` */\n withUnknownLocale(localeTag: string | null | undefined): I18n {\n return getInstance(toAvailableLocale(localeTag));\n },\n toAvailableLocale,\n };\n}\n\nexport type { I18n };\n\nclass I18n {\n constructor(private localeId: string) {}\n\n __ = (\n strings: TemplateStringsArray,\n ...exprs: (string | number)[]\n ): string => {\n const [hash, fallbackTranslation] = createHashAndFallbackTranslation(\n strings,\n exprs,\n );\n\n const activeLocale = config?.locales[this.localeId];\n\n if (!activeLocale) {\n throw new Error('No active locale');\n }\n\n const selectedTranslation = activeLocale[hash];\n\n if (selectedTranslation === undefined) {\n return fallbackTranslation;\n }\n\n if (typeof selectedTranslation === 'string' && selectedTranslation) {\n return interpolate(selectedTranslation, exprs) || fallbackTranslation;\n }\n\n if (selectedTranslation) {\n throw new Error(\n 'Invalid translation, this translation should use the plural `__p` method',\n );\n }\n\n return fallbackTranslation;\n };\n\n __p = (num: number) => {\n return (strings: TemplateStringsArray, ...exprs: (string | number)[]) => {\n const [hash, fallbackTranslation] = createHashAndFallbackTranslation(\n strings,\n exprs,\n );\n\n const activeLocale = config?.locales[this.localeId];\n\n if (!activeLocale) {\n throw new Error('No active locale');\n }\n\n const selectedTranslation = activeLocale[hash];\n\n if (selectedTranslation === undefined) {\n return replaceHashWithNum(fallbackTranslation, num);\n }\n\n if (\n typeof selectedTranslation === 'object' &&\n selectedTranslation !== null\n ) {\n const translation = selectPluralForm(num, selectedTranslation);\n\n if (translation === null) {\n console.error(`No plural configured for hash: ${hash}`);\n return replaceHashWithNum(fallbackTranslation, num);\n }\n\n return (\n interpolate(translation, exprs) ||\n replaceHashWithNum(fallbackTranslation, num)\n );\n }\n\n if (selectedTranslation) {\n throw new Error(\n 'Invalid translation, this translation should use the `__` method',\n );\n }\n\n return replaceHashWithNum(fallbackTranslation, num);\n };\n };\n}\n\nexport type {\n Locale,\n LocaleConfig,\n PluralTranslation,\n TranslationValue,\n} from '@ls-stack/i18n-core';\n"],"mappings":";AAAA,SAAgB,iCACd,SACA,OACsD;CACtD,IAAI,OAAO;CACX,IAAI,sBAAsB;AAE1B,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,SAAS,QAAQ,MAAM;EAC7B,MAAM,OAAO,MAAM;AAEnB,UAAQ,UAAU,MAAM,QAAQ,SAAS,IAAI,IAAI,IAAI,EAAE,KAAK;AAC5D,yBAAuB,UAAU,QAAQ;;AAG3C,KAAI,oBAAoB,SAAS,KAAK,CACpC,uBAAsB,oBAAoB,MAAM,KAAK,CAAC,MAAM;AAG9D,QAAO,CAAC,MAAM,oBAAoB;;;;;ACnBpC,MAAM,uBAAuB;AAE7B,SAAgB,YACd,aACA,OACQ;AACR,KAAI,MAAM,WAAW,EACnB,QAAO;CAGT,IAAI,SAAS;CACb,MAAM,mBAAmB,YAAY,MAAM,qBAAqB;AAEhE,MAAK,IAAI,IAAI,GAAG,IAAI,iBAAiB,QAAQ,KAAK;EAChD,MAAM,OAAO,iBAAiB;AAE9B,MAAI,IAAI,MAAM,EACZ,WAAU;MAGV,WAAU,MADe,OAAO,KAAK,GACF;;AAIvC,QAAO;;;;;ACtBT,SAAgB,iBACd,KACA,mBACe;AACf,KAAI,QAAQ,KAAK,kBAAkB,KACjC,QAAO,kBAAkB;AAG3B,KAAI,QAAQ,KAAK,kBAAkB,IACjC,QAAO,kBAAkB;AAG3B,KACE,kBAAkB,aAClB,kBAAkB,QAClB,MAAM,kBAAkB,UAExB,QAAO,kBAAkB;AAG3B,KAAI,kBAAkB,MACpB,QAAO,kBAAkB,MAAM,QAAQ,KAAK,OAAO,IAAI,CAAC;AAG1D,QAAO;;;AAIT,SAAgB,mBAAmB,UAAkB,KAAqB;AACxE,QAAO,SAAS,QAAQ,KAAK,OAAO,IAAI,CAAC;;;;;ACd3C,IAAI,SAAqC;AAEzC,SAAS,mBAAmB,WAA2B;AACrD,QAAO,UAAU,MAAM,CAAC,aAAa,CAAC,WAAW,KAAK,IAAI;;AAG5D,SAAS,gBAAgB,eAA+B;CACtD,MAAM,iBAAiB,cAAc,QAAQ,IAAI;AACjD,QAAO,mBAAmB,KAAK,gBAC3B,cAAc,MAAM,GAAG,eAAe;;AAI5C,SAAgB,aAA+B,SAAyB;AACtE,UAAS;CAET,SAAS,WAAW,IAAqB;AACvC,SAAO,OAAO,OAAO,QAAQ,SAAS,GAAG;;CAG3C,MAAM,YAAY,OAAO,KAAK,QAAQ,QAAQ,CAAC,OAAO,WAAW;CACjE,MAAM,iBAAiB,QAAQ,kBAAkB,UAAU;CAE3D,MAAM,8BAAc,IAAI,KAAgB;CACxC,MAAM,uCAAuB,IAAI,KAAgB;AAEjD,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,eAAe,mBAAmB,SAAS;AACjD,cAAY,IAAI,cAAc,SAAS;EAEvC,MAAM,eAAe,gBAAgB,aAAa;AAElD,MACE,iBAAiB,gBACjB,CAAC,qBAAqB,IAAI,aAAa,CAEvC,sBAAqB,IAAI,cAAc,SAAS;;CAIpD,MAAM,4BAAY,IAAI,KAAc;CAEpC,SAAS,YAAY,UAAmB;EACtC,IAAI,WAAW,UAAU,IAAI,SAAS;AAEtC,MAAI,CAAC,UAAU;AACb,cAAW,IAAI,KAAK,SAAS;AAC7B,aAAU,IAAI,UAAU,SAAS;;AAGnC,SAAO;;;;;;;CAQT,SAAS,kBAAkB,WAAyC;AAClE,MAAI,WAAW;GACb,MAAM,gBAAgB,mBAAmB,UAAU;GAEnD,MAAM,gBACJ,YAAY,IAAI,cAAc,IAC9B,qBAAqB,IAAI,gBAAgB,cAAc,CAAC;AAE1D,OAAI,kBAAkB,OAAW,QAAO;;AAG1C,MAAI,mBAAmB,OACrB,OAAM,IAAI,MAAM,wBAAwB;AAG1C,SAAO;;AAGT,QAAO;EACL,KAAK,UAAmB;AACtB,UAAO,YAAY,SAAS;;EAG9B,kBAAkB,WAA4C;AAC5D,UAAO,YAAY,kBAAkB,UAAU,CAAC;;EAElD;EACD;;AAKH,IAAM,OAAN,MAAW;CACT,YAAY,AAAQ,UAAkB;EAAlB;;CAEpB,MACE,SACA,GAAG,UACQ;EACX,MAAM,CAAC,MAAM,uBAAuB,iCAClC,SACA,MACD;EAED,MAAM,eAAe,QAAQ,QAAQ,KAAK;AAE1C,MAAI,CAAC,aACH,OAAM,IAAI,MAAM,mBAAmB;EAGrC,MAAM,sBAAsB,aAAa;AAEzC,MAAI,wBAAwB,OAC1B,QAAO;AAGT,MAAI,OAAO,wBAAwB,YAAY,oBAC7C,QAAO,YAAY,qBAAqB,MAAM,IAAI;AAGpD,MAAI,oBACF,OAAM,IAAI,MACR,2EACD;AAGH,SAAO;;CAGT,OAAO,QAAgB;AACrB,UAAQ,SAA+B,GAAG,UAA+B;GACvE,MAAM,CAAC,MAAM,uBAAuB,iCAClC,SACA,MACD;GAED,MAAM,eAAe,QAAQ,QAAQ,KAAK;AAE1C,OAAI,CAAC,aACH,OAAM,IAAI,MAAM,mBAAmB;GAGrC,MAAM,sBAAsB,aAAa;AAEzC,OAAI,wBAAwB,OAC1B,QAAO,mBAAmB,qBAAqB,IAAI;AAGrD,OACE,OAAO,wBAAwB,YAC/B,wBAAwB,MACxB;IACA,MAAM,cAAc,iBAAiB,KAAK,oBAAoB;AAE9D,QAAI,gBAAgB,MAAM;AACxB,aAAQ,MAAM,kCAAkC,OAAO;AACvD,YAAO,mBAAmB,qBAAqB,IAAI;;AAGrD,WACE,YAAY,aAAa,MAAM,IAC/B,mBAAmB,qBAAqB,IAAI;;AAIhD,OAAI,oBACF,OAAM,IAAI,MACR,mEACD;AAGH,UAAO,mBAAmB,qBAAqB,IAAI"}
|