This commit is contained in:
Your Name committed 2026-06-28 05:52:46 -04:00
1 parent 5fac4524c8
commit e1d793ce37
69 files changed
+1892 -610

No files matched your search

+11 -1
View File
@@ -2,6 +2,16 @@ import { PrismaClient } from "@prisma/client";
import { PrismaPg } from "@prisma/adapter-pg";
declare const prisma: PrismaClient<{
adapter: PrismaPg;
}, never, import("@prisma/client/runtime/client").DefaultArgs>;
log: ({
emit: "stdout";
level: "query";
} | {
emit: "stdout";
level: "error";
} | {
emit: "stdout";
level: "warn";
})[];
}, "query" | "warn" | "error", import("@prisma/client/runtime/client").DefaultArgs>;
export default prisma;
//# sourceMappingURL=prisma.d.ts.map
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAW9C,QAAA,MAAM,MAAM;;8DAAgC,CAAC;AAE7C,eAAe,MAAM,CAAC"}
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAW9C,QAAA,MAAM,MAAM;;;;;;;;;;;;mFAOV,CAAC;AAEH,eAAe,MAAM,CAAC"}
+8 -1
View File
@@ -6,6 +6,13 @@ dotenv.config();
const connectionString = process.env.DATABASE_URL;
const pool = new Pool({ connectionString });
const adapter = new PrismaPg(pool);
const prisma = new PrismaClient({ adapter });
const prisma = new PrismaClient({
adapter,
log: [
{ emit: 'stdout', level: 'query' },
{ emit: 'stdout', level: 'error' },
{ emit: 'stdout', level: 'warn' },
],
});
export default prisma;
//# sourceMappingURL=prisma.js.map
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAa,CAAC;AAEnD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC5C,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEnC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAE7C,eAAe,MAAM,CAAC"}
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAa,CAAC;AAEnD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC5C,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEnC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;IAC9B,OAAO;IACP,GAAG,EAAE;QACH,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;QAClC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;QAClC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;KAClC;CACF,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
+20
View File
@@ -0,0 +1,20 @@
export declare const SUPPORTED_LANGS: readonly ["th", "en", "ja", "zh", "vi", "ko"];
export type AttributeType = 'TEXT' | 'NUMBER' | 'BOOLEAN' | 'SELECT' | 'JSON';
export declare function normalizeAttributeType(type: unknown): AttributeType;
export declare function resolveLocalizedText(baseValue: string | null | undefined, translations: Array<{
langCode: string;
valueText?: string | null;
}> | undefined, lang: string): string;
export declare function resolveDefinitionLocalizedField<T extends {
langCode: string;
label: string;
description?: string | null;
}>(baseValue: string | null | undefined, translations: T[] | undefined, lang: string, field: 'label' | 'description'): string | null;
export declare function getPrimaryOptionValue(value: any): string;
export declare function getLocalizedOptionLabel(value: any, lang: string): string;
export declare function getSelectOptionDisplay(options: any, storedValue: string, lang: string): string;
export declare function validateAttributeValue(type: AttributeType, payload: Record<string, any>): void;
export declare function validateSelectOption(options: any, storedValue: string): void;
export declare function localizeAttributeDefinition(definition: any, lang: string): any;
export declare function localizeProductAttribute(attribute: any, lang: string): any;
//# sourceMappingURL=productAttributes.d.ts.map
@@ -0,0 +1 @@
{"version":3,"file":"productAttributes.d.ts","sourceRoot":"","sources":["productAttributes.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,+CAAQ,CAAC;AAErC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAI9E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAMnE;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,YAAY,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG,SAAS,EAChF,IAAI,EAAE,MAAM,UAQb;AAED,wBAAgB,+BAA+B,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACxH,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,YAAY,EAAE,CAAC,EAAE,GAAG,SAAS,EAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GAAG,aAAa,iBAQ/B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAMxD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAS9F;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAmCvF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,QAQrE;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,OAqBxE;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,OA8BpE"}
+152
View File
@@ -0,0 +1,152 @@
const LANGS = ['th', 'en', 'ja', 'zh', 'vi', 'ko'];
export const SUPPORTED_LANGS = LANGS;
const ATTRIBUTE_TYPES = ['TEXT', 'NUMBER', 'BOOLEAN', 'SELECT', 'JSON'];
export function normalizeAttributeType(type) {
const normalized = String(type || '').toUpperCase();
if (!ATTRIBUTE_TYPES.includes(normalized)) {
throw new Error(`Unsupported attribute type '${type}'. Allowed types: ${ATTRIBUTE_TYPES.join(', ')}`);
}
return normalized;
}
export function resolveLocalizedText(baseValue, translations, lang) {
if (lang === 'all')
return baseValue ?? '';
const exact = translations?.find((item) => item.langCode === lang)?.valueText;
if (exact)
return exact;
const thai = translations?.find((item) => item.langCode === 'th')?.valueText;
if (thai)
return thai;
return baseValue ?? '';
}
export function resolveDefinitionLocalizedField(baseValue, translations, lang, field) {
if (lang === 'all')
return baseValue ?? null;
const exact = translations?.find((item) => item.langCode === lang)?.[field];
if (exact !== undefined && exact !== null && exact !== '')
return exact;
const thai = translations?.find((item) => item.langCode === 'th')?.[field];
if (thai !== undefined && thai !== null && thai !== '')
return thai;
return baseValue ?? null;
}
export function getPrimaryOptionValue(value) {
if (typeof value === 'string')
return value;
if (typeof value === 'object' && value !== null) {
return value.th || value.en || Object.values(value)[0] || '';
}
return String(value ?? '');
}
export function getLocalizedOptionLabel(value, lang) {
if (typeof value === 'string')
return value;
if (typeof value === 'object' && value !== null) {
return value[lang] || value[lang.slice(0, 2)] || value.th || value.en || Object.values(value)[0] || '';
}
return String(value ?? '');
}
export function getSelectOptionDisplay(options, storedValue, lang) {
if (!Array.isArray(options))
return storedValue;
for (const option of options) {
const primary = getPrimaryOptionValue(option);
if (primary === storedValue) {
return getLocalizedOptionLabel(option, lang);
}
}
return storedValue;
}
export function validateAttributeValue(type, payload) {
const populated = [
payload.valueText !== undefined && payload.valueText !== null && payload.valueText !== '',
payload.valueNumber !== undefined && payload.valueNumber !== null,
payload.valueBoolean !== undefined && payload.valueBoolean !== null,
payload.valueJson !== undefined && payload.valueJson !== null,
].filter(Boolean).length;
if (populated !== 1) {
throw new Error('Exactly one of valueText, valueNumber, valueBoolean, or valueJson must be provided.');
}
switch (type) {
case 'TEXT':
if (typeof payload.valueText !== 'string')
throw new Error('TEXT attributes require valueText as a string.');
return;
case 'NUMBER':
if (typeof payload.valueNumber !== 'number' || Number.isNaN(payload.valueNumber)) {
throw new Error('NUMBER attributes require valueNumber as a valid number.');
}
return;
case 'BOOLEAN':
if (typeof payload.valueBoolean !== 'boolean') {
throw new Error('BOOLEAN attributes require valueBoolean as a boolean.');
}
return;
case 'JSON':
if (payload.valueJson === undefined || payload.valueJson === null) {
throw new Error('JSON attributes require valueJson.');
}
return;
case 'SELECT':
if (typeof payload.valueText !== 'string')
throw new Error('SELECT attributes require valueText as the stored option key.');
return;
}
}
export function validateSelectOption(options, storedValue) {
if (!Array.isArray(options)) {
throw new Error('SELECT attribute definition must provide options.');
}
const allowed = options.map(getPrimaryOptionValue);
if (!allowed.includes(storedValue)) {
throw new Error(`Invalid SELECT value '${storedValue}'. Allowed values: [${allowed.join(', ')}]`);
}
}
export function localizeAttributeDefinition(definition, lang) {
if (lang === 'all') {
const label = {};
const description = {};
definition.translations?.forEach((translation) => {
label[translation.langCode] = translation.label;
if (translation.description)
description[translation.langCode] = translation.description;
});
return {
...definition,
label,
description,
};
}
return {
...definition,
label: resolveDefinitionLocalizedField(definition.label, definition.translations, lang, 'label') || definition.label,
description: resolveDefinitionLocalizedField(definition.description, definition.translations, lang, 'description'),
};
}
export function localizeProductAttribute(attribute, lang) {
const localizedDefinition = localizeAttributeDefinition(attribute.attributeDefinition, lang);
const type = normalizeAttributeType(attribute.attributeDefinition.type);
const value = type === 'TEXT'
? resolveLocalizedText(attribute.valueText, attribute.translations, lang)
: type === 'SELECT'
? getSelectOptionDisplay(attribute.attributeDefinition.options, attribute.valueText || '', lang)
: attribute.valueBoolean ?? attribute.valueNumber ?? attribute.valueJson ?? attribute.valueText ?? null;
if (lang === 'all') {
const valueTranslations = {};
attribute.translations?.forEach((translation) => {
valueTranslations[translation.langCode] = translation.valueText;
});
return {
...attribute,
attributeDefinition: localizedDefinition,
value,
valueTranslations,
};
}
return {
...attribute,
attributeDefinition: localizedDefinition,
value,
};
}
//# sourceMappingURL=productAttributes.js.map
@@ -0,0 +1 @@
{"version":3,"file":"productAttributes.js","sourceRoot":"","sources":["productAttributes.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAE5D,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;AAIrC,MAAM,eAAe,GAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAEzF,MAAM,UAAU,sBAAsB,CAAC,IAAa;IAClD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,UAA2B,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,UAA2B,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAoC,EACpC,YAAgF,EAChF,IAAY;IAEZ,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,SAAS,CAAC;IAC9E,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,SAAS,CAAC;IAC7E,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,SAAS,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,SAAoC,EACpC,YAA6B,EAC7B,IAAY,EACZ,KAA8B;IAE9B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,IAAI,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACxE,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3E,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,SAAS,IAAI,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAU;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAU,EAAE,IAAY;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzG,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAY,EAAE,WAAmB,EAAE,IAAY;IACpF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,WAAW,CAAC;IAChD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5B,OAAO,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAmB,EAAE,OAA4B;IACtF,MAAM,SAAS,GAAG;QAChB,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,SAAS,KAAK,EAAE;QACzF,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI;QACjE,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,OAAO,CAAC,YAAY,KAAK,IAAI;QACnE,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI;KAC9D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAEzB,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAC7G,OAAO;QACT,KAAK,QAAQ;YACX,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjF,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO;QACT,KAAK,SAAS;YACZ,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YACD,OAAO;QACT,KAAK,MAAM;YACT,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAClE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,CAAC;YACD,OAAO;QACT,KAAK,QAAQ;YACX,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YAC5H,OAAO;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAY,EAAE,WAAmB;IACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,WAAW,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAAe,EAAE,IAAY;IACvE,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,MAAM,WAAW,GAA2B,EAAE,CAAC;QAC/C,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,WAAgB,EAAE,EAAE;YACpD,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;YAChD,IAAI,WAAW,CAAC,WAAW;gBAAE,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,UAAU;YACb,KAAK;YACL,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,UAAU;QACb,KAAK,EAAE,+BAA+B,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,UAAU,CAAC,KAAK;QACpH,WAAW,EAAE,+BAA+B,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC;KACnH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,Line truncated